From 1b820de08a05070909a267e17f033fcf58ac8710 Mon Sep 17 00:00:00 2001 From: NotAPenguin Date: Mon, 2 Sep 2024 23:17:17 +0200 Subject: The Great Renaming (#3014) * move kekztech to a single root dir * move detrav to a single root dir * move gtnh-lanthanides to a single root dir * move tectech and delete some gross reflection in gt++ * remove more reflection inside gt5u * delete more reflection in gt++ * fix imports * move bartworks and bwcrossmod * fix proxies * move galactigreg and ggfab * move gtneioreplugin * try to fix gt++ bee loader * apply the rename rules to BW * apply rename rules to bwcrossmod * apply rename rules to detrav scanner mod * apply rename rules to galacticgreg * apply rename rules to ggfab * apply rename rules to goodgenerator * apply rename rules to gtnh-lanthanides * apply rename rules to gt++ * apply rename rules to kekztech * apply rename rules to kubatech * apply rename rules to tectech * apply rename rules to gt apply the rename rules to gt * fix tt import * fix mui hopefully * fix coremod except intergalactic * rename assline recipe class * fix a class name i stumbled on * rename StructureUtility to GTStructureUtility to prevent conflict with structurelib * temporary rename of GTTooltipDataCache to old name * fix gt client/server proxy names --- src/main/java/gregtech/GTMod.java | 886 ++ src/main/java/gregtech/GT_Mod.java | 886 -- src/main/java/gregtech/api/GregTechAPI.java | 982 ++ src/main/java/gregtech/api/GregTech_API.java | 999 -- .../api/damagesources/GTDamageSources.java | 119 + .../api/damagesources/GT_DamageSources.java | 119 - .../api/enchants/EnchantmentEnderDamage.java | 72 + .../gregtech/api/enchants/EnchantmentHazmat.java | 56 + .../api/enchants/EnchantmentRadioactivity.java | 68 + .../api/enchants/Enchantment_EnderDamage.java | 72 - .../gregtech/api/enchants/Enchantment_Hazmat.java | 56 - .../api/enchants/Enchantment_Radioactivity.java | 68 - src/main/java/gregtech/api/enums/Dyes.java | 8 +- .../gregtech/api/enums/GTNH_ExtraMaterials.java | 626 - src/main/java/gregtech/api/enums/GTStones.java | 88 +- src/main/java/gregtech/api/enums/GTValues.java | 721 + .../java/gregtech/api/enums/GTVoltageIndex.java | 22 - .../java/gregtech/api/enums/GT_HatchElement.java | 112 - src/main/java/gregtech/api/enums/GT_Values.java | 720 - src/main/java/gregtech/api/enums/HatchElement.java | 110 + .../java/gregtech/api/enums/HeatingCoilLevel.java | 4 +- src/main/java/gregtech/api/enums/ItemList.java | 72 +- .../java/gregtech/api/enums/MaterialBuilder.java | 4 +- src/main/java/gregtech/api/enums/Materials.java | 142 +- .../java/gregtech/api/enums/MaterialsBotania.java | 46 +- .../java/gregtech/api/enums/MaterialsGTNH.java | 626 + .../java/gregtech/api/enums/MaterialsKevlar.java | 64 +- .../java/gregtech/api/enums/MaterialsUEVplus.java | 20 +- .../java/gregtech/api/enums/MetaTileEntityIDs.java | 8 +- src/main/java/gregtech/api/enums/OreMixes.java | 16 +- src/main/java/gregtech/api/enums/OrePrefixes.java | 66 +- src/main/java/gregtech/api/enums/SmallOres.java | 72 +- .../java/gregtech/api/enums/SoundResource.java | 4 +- src/main/java/gregtech/api/enums/TAE.java | 30 +- src/main/java/gregtech/api/enums/TCAspects.java | 112 + src/main/java/gregtech/api/enums/TC_Aspects.java | 112 - src/main/java/gregtech/api/enums/Textures.java | 32 +- src/main/java/gregtech/api/enums/Tier.java | 2 +- src/main/java/gregtech/api/enums/TierEU.java | 62 +- src/main/java/gregtech/api/enums/VoidingMode.java | 11 +- src/main/java/gregtech/api/enums/VoltageIndex.java | 22 + src/main/java/gregtech/api/fluid/FluidTankGT.java | 485 - .../java/gregtech/api/fluid/GTFluidFactory.java | 90 + src/main/java/gregtech/api/fluid/GTFluidTank.java | 485 + .../java/gregtech/api/fluid/GT_FluidFactory.java | 90 - .../java/gregtech/api/graphs/GenerateNodeMap.java | 2 +- .../gregtech/api/graphs/GenerateNodeMapPower.java | 9 +- .../api/graphs/consumers/NodeEnergyReceiver.java | 24 +- .../gregtech/api/graphs/paths/PowerNodePath.java | 14 +- .../java/gregtech/api/gui/GT_GUIColorOverride.java | 93 - .../java/gregtech/api/gui/GUIColorOverride.java | 93 + .../api/gui/modularui/CoverUIBuildContext.java | 74 + .../java/gregtech/api/gui/modularui/GTUIInfos.java | 188 + .../gregtech/api/gui/modularui/GTUITextures.java | 542 + .../api/gui/modularui/GT_CoverUIBuildContext.java | 74 - .../gregtech/api/gui/modularui/GT_UIInfos.java | 189 - .../gregtech/api/gui/modularui/GT_UITextures.java | 542 - .../gregtech/api/gui/modularui/GUITextureSet.java | 31 +- .../api/gui/widgets/CoverTickRateButton.java | 82 + .../api/gui/widgets/GT_CoverTickRateButton.java | 82 - .../gui/widgets/GT_LockedWhileActiveButton.java | 90 - .../api/gui/widgets/GT_PhantomItemButton.java | 92 - .../api/gui/widgets/LockedWhileActiveButton.java | 90 + .../api/gui/widgets/PhantomItemButton.java | 92 + .../api/interfaces/ICleanroomReceiver.java | 4 +- .../interfaces/IConfigurationCircuitSupport.java | 4 +- .../java/gregtech/api/interfaces/IFoodStat.java | 14 +- .../interfaces/IGT_ItemWithMaterialRenderer.java | 10 +- .../gregtech/api/interfaces/IHatchElement.java | 29 +- .../gregtech/api/interfaces/IIconContainer.java | 2 +- .../gregtech/api/interfaces/IItemBehaviour.java | 4 +- .../api/interfaces/INetworkUpdatableItem.java | 4 +- .../java/gregtech/api/interfaces/IRecipeMap.java | 18 +- .../api/interfaces/IRedstoneCircuitBlock.java | 4 +- .../java/gregtech/api/interfaces/IToolStats.java | 4 +- .../gregtech/api/interfaces/fluid/IGTFluid.java | 14 + .../api/interfaces/fluid/IGTFluidBuilder.java | 96 + .../api/interfaces/fluid/IGTRegisteredFluid.java | 60 + .../gregtech/api/interfaces/fluid/IGT_Fluid.java | 14 - .../api/interfaces/fluid/IGT_FluidBuilder.java | 96 - .../api/interfaces/fluid/IGT_RegisteredFluid.java | 60 - .../api/interfaces/internal/IGTCraftingRecipe.java | 8 + .../gregtech/api/interfaces/internal/IGTMod.java | 50 + .../api/interfaces/internal/IGTRecipeAdder.java | 8 + .../interfaces/internal/IGT_CraftingRecipe.java | 8 - .../gregtech/api/interfaces/internal/IGT_Mod.java | 50 - .../api/interfaces/internal/IGT_RecipeAdder.java | 8 - .../api/interfaces/internal/IThaumcraftCompat.java | 8 +- .../interfaces/metatileentity/IMetaTileEntity.java | 8 +- .../modularui/ControllerWithOptionalFeatures.java | 393 - .../modularui/IControllerWithOptionalFeatures.java | 393 + .../api/interfaces/modularui/IGetTitleColor.java | 4 +- .../interfaces/tileentity/IColoredTileEntity.java | 5 +- .../api/interfaces/tileentity/ICoverable.java | 8 +- .../interfaces/tileentity/IEnergyConnected.java | 14 +- .../interfaces/tileentity/IGregTechTileEntity.java | 4 +- .../gregtech/api/items/BlockLongDistancePipe.java | 125 + .../java/gregtech/api/items/GTGenericBlock.java | 22 + .../java/gregtech/api/items/GTGenericItem.java | 162 + .../api/items/GT_Block_LongDistancePipe.java | 125 - .../gregtech/api/items/GT_BreederCell_Item.java | 153 - .../gregtech/api/items/GT_CoolantCellIC_Item.java | 67 - .../gregtech/api/items/GT_CoolantCell_Item.java | 82 - .../gregtech/api/items/GT_EnergyArmor_Item.java | 332 - .../java/gregtech/api/items/GT_Generic_Block.java | 22 - .../java/gregtech/api/items/GT_Generic_Item.java | 162 - .../java/gregtech/api/items/GT_MetaBase_Item.java | 622 - .../gregtech/api/items/GT_MetaGenerated_Item.java | 415 - .../api/items/GT_MetaGenerated_Item_X01.java | 213 - .../api/items/GT_MetaGenerated_Item_X32.java | 225 - .../gregtech/api/items/GT_MetaGenerated_Tool.java | 1013 -- .../api/items/GT_RadioactiveCellIC_Item.java | 219 - .../api/items/GT_RadioactiveCell_Item.java | 159 - src/main/java/gregtech/api/items/GT_Tool_Item.java | 41 - .../java/gregtech/api/items/ItemBreederCell.java | 153 + .../java/gregtech/api/items/ItemCoolantCell.java | 82 + .../java/gregtech/api/items/ItemCoolantCellIC.java | 67 + .../java/gregtech/api/items/ItemEnergyArmor.java | 331 + .../gregtech/api/items/ItemRadioactiveCell.java | 159 + .../gregtech/api/items/ItemRadioactiveCellIC.java | 219 + src/main/java/gregtech/api/items/ItemTool.java | 41 + src/main/java/gregtech/api/items/MetaBaseItem.java | 622 + .../java/gregtech/api/items/MetaGeneratedItem.java | 415 + .../gregtech/api/items/MetaGeneratedItemX01.java | 210 + .../gregtech/api/items/MetaGeneratedItemX32.java | 225 + .../java/gregtech/api/items/MetaGeneratedTool.java | 1013 ++ .../api/logic/AbstractProcessingLogic.java | 24 +- .../gregtech/api/logic/ItemInventoryLogic.java | 8 +- .../gregtech/api/logic/MuTEProcessingLogic.java | 24 +- src/main/java/gregtech/api/logic/PowerLogic.java | 10 +- .../java/gregtech/api/logic/ProcessingLogic.java | 24 +- .../api/metatileentity/BaseMetaPipeEntity.java | 130 +- .../api/metatileentity/BaseMetaTileEntity.java | 279 +- .../api/metatileentity/BaseTileEntity.java | 42 +- .../api/metatileentity/CommonMetaTileEntity.java | 30 +- .../api/metatileentity/CoverableTileEntity.java | 84 +- .../api/metatileentity/MetaPipeEntity.java | 62 +- .../api/metatileentity/MetaTileEntity.java | 83 +- .../api/metatileentity/TileIC2EnergySink.java | 10 +- .../implementations/GT_MetaPipeEntity_Cable.java | 649 - .../implementations/GT_MetaPipeEntity_Fluid.java | 979 -- .../implementations/GT_MetaPipeEntity_Frame.java | 119 - .../implementations/GT_MetaPipeEntity_Item.java | 530 - .../GT_MetaTileEntity_BasicBatteryBuffer.java | 436 - .../GT_MetaTileEntity_BasicGenerator.java | 339 - .../GT_MetaTileEntity_BasicHull.java | 175 - .../GT_MetaTileEntity_BasicHull_NonElectric.java | 78 - .../GT_MetaTileEntity_BasicMachine.java | 1563 --- .../GT_MetaTileEntity_BasicMachine_Bronze.java | 387 - .../GT_MetaTileEntity_BasicMachine_GT_Recipe.java | 818 -- .../GT_MetaTileEntity_BasicMachine_Steel.java | 150 - .../GT_MetaTileEntity_BasicTank.java | 331 - .../implementations/GT_MetaTileEntity_Buffer.java | 563 - .../GT_MetaTileEntity_CubicMultiBlockBase.java | 141 - .../GT_MetaTileEntity_EnhancedMultiBlockBase.java | 318 - ...MetaTileEntity_ExtendedPowerMultiBlockBase.java | 242 - .../GT_MetaTileEntity_FilterBase.java | 106 - .../implementations/GT_MetaTileEntity_Hatch.java | 252 - .../GT_MetaTileEntity_Hatch_DataAccess.java | 170 - .../GT_MetaTileEntity_Hatch_Dynamo.java | 110 - .../GT_MetaTileEntity_Hatch_Energy.java | 125 - .../GT_MetaTileEntity_Hatch_Input.java | 196 - .../GT_MetaTileEntity_Hatch_InputBus.java | 318 - .../GT_MetaTileEntity_Hatch_Maintenance.java | 459 - .../GT_MetaTileEntity_Hatch_Muffler.java | 208 - .../GT_MetaTileEntity_Hatch_MultiInput.java | 300 - .../GT_MetaTileEntity_Hatch_Output.java | 497 - .../GT_MetaTileEntity_Hatch_OutputBus.java | 323 - ...GT_MetaTileEntity_Hatch_QuadrupleHumongous.java | 27 - .../GT_MetaTileEntity_MagHatch.java | 103 - .../GT_MetaTileEntity_MultiBlockBase.java | 2754 ---- .../GT_MetaTileEntity_SpecialFilter.java | 134 - .../GT_MetaTileEntity_TieredMachineBlock.java | 119 - .../GT_MetaTileEntity_TooltipMultiBlockBase.java | 57 - .../GT_MetaTileEntity_Transformer.java | 326 - .../GT_MetaTileEntity_WetTransformer.java | 93 - .../GT_MetaTileEntity_Wireless_Dynamo.java | 146 - .../GT_MetaTileEntity_Wireless_Hatch.java | 168 - .../implementations/MTEBasicBatteryBuffer.java | 435 + .../implementations/MTEBasicGenerator.java | 338 + .../implementations/MTEBasicHull.java | 173 + .../implementations/MTEBasicHullNonElectric.java | 75 + .../implementations/MTEBasicMachine.java | 1563 +++ .../implementations/MTEBasicMachineBronze.java | 387 + .../implementations/MTEBasicMachineSteel.java | 149 + .../implementations/MTEBasicMachineWithRecipe.java | 817 ++ .../implementations/MTEBasicTank.java | 328 + .../metatileentity/implementations/MTEBuffer.java | 559 + .../metatileentity/implementations/MTECable.java | 649 + .../implementations/MTECubicMultiBlockBase.java | 141 + .../implementations/MTEEnhancedMultiBlockBase.java | 318 + .../MTEExtendedPowerMultiBlockBase.java | 242 + .../implementations/MTEFilterBase.java | 104 + .../metatileentity/implementations/MTEFluid.java | 971 ++ .../metatileentity/implementations/MTEFrame.java | 119 + .../metatileentity/implementations/MTEHatch.java | 250 + .../implementations/MTEHatchDataAccess.java | 169 + .../implementations/MTEHatchDynamo.java | 109 + .../implementations/MTEHatchEnergy.java | 123 + .../implementations/MTEHatchInput.java | 192 + .../implementations/MTEHatchInputBus.java | 315 + .../implementations/MTEHatchMagnet.java | 102 + .../implementations/MTEHatchMaintenance.java | 455 + .../implementations/MTEHatchMuffler.java | 208 + .../implementations/MTEHatchMultiInput.java | 299 + .../implementations/MTEHatchOutput.java | 493 + .../implementations/MTEHatchOutputBus.java | 320 + .../MTEHatchQuadrupleHumongous.java | 27 + .../metatileentity/implementations/MTEItem.java | 523 + .../implementations/MTEMultiBlockBase.java | 2742 ++++ .../implementations/MTESpecialFilter.java | 132 + .../implementations/MTETieredMachineBlock.java | 119 + .../implementations/MTETooltipMultiBlockBase.java | 56 + .../implementations/MTETransformer.java | 325 + .../implementations/MTEWetTransformer.java | 92 + .../implementations/MTEWirelessDynamo.java | 144 + .../implementations/MTEWirelessEnergy.java | 167 + .../api/multitileentity/MultiTileEntityBlock.java | 35 +- .../MultiTileEntityClassContainer.java | 12 +- .../api/multitileentity/MultiTileEntityItem.java | 6 +- .../multitileentity/MultiTileEntityRegistry.java | 27 +- .../api/multitileentity/base/MultiTileEntity.java | 126 +- .../base/NonTickableMultiTileEntity.java | 6 +- .../base/TickableMultiTileEntity.java | 18 +- .../multitileentity/enums/GT_MultiTileCasing.java | 4 +- .../enums/GT_MultiTileComponentCasing.java | 4 +- .../multitileentity/enums/GT_MultiTileMachine.java | 4 +- .../enums/GT_MultiTileUpgradeCasing.java | 4 +- .../interfaces/SyncedMultiTileEntity.java | 14 +- .../machine/MultiTileBasicMachine.java | 50 +- .../multiblock/base/ComplexParallelController.java | 10 +- .../multiblock/base/Controller.java | 44 +- .../multiblock/base/MultiBlockPart.java | 12 +- .../multiblock/casing/FunctionalCasing.java | 4 +- .../multiblock/casing/UpgradeCasing.java | 4 +- src/main/java/gregtech/api/net/GTPacket.java | 59 + .../java/gregtech/api/net/GTPacketBlockEvent.java | 63 + .../gregtech/api/net/GTPacketClientPreference.java | 58 + .../gregtech/api/net/GTPacketMultiTileEntity.java | 254 + .../gregtech/api/net/GTPacketMusicSystemData.java | 58 + src/main/java/gregtech/api/net/GTPacketNew.java | 30 + .../java/gregtech/api/net/GTPacketPollution.java | 47 + .../gregtech/api/net/GTPacketRequestCoverData.java | 113 + .../gregtech/api/net/GTPacketSendCoverData.java | 107 + .../api/net/GTPacketSendOregenPattern.java | 56 + .../api/net/GTPacketSetConfigurationCircuit.java | 110 + src/main/java/gregtech/api/net/GTPacketSound.java | 73 + .../java/gregtech/api/net/GTPacketTileEntity.java | 157 + .../gregtech/api/net/GTPacketToolSwitchMode.java | 52 + src/main/java/gregtech/api/net/GTPacketTypes.java | 64 + .../java/gregtech/api/net/GTPacketUpdateItem.java | 64 + src/main/java/gregtech/api/net/GT_Packet.java | 59 - src/main/java/gregtech/api/net/GT_PacketTypes.java | 64 - .../gregtech/api/net/GT_Packet_Block_Event.java | 63 - .../api/net/GT_Packet_ClientPreference.java | 62 - .../api/net/GT_Packet_MultiTileEntity.java | 254 - .../api/net/GT_Packet_MusicSystemData.java | 58 - src/main/java/gregtech/api/net/GT_Packet_New.java | 30 - .../java/gregtech/api/net/GT_Packet_Pollution.java | 47 - .../api/net/GT_Packet_RequestCoverData.java | 113 - .../gregtech/api/net/GT_Packet_SendCoverData.java | 107 - .../api/net/GT_Packet_SendOregenPattern.java | 56 - .../api/net/GT_Packet_SetConfigurationCircuit.java | 110 - .../java/gregtech/api/net/GT_Packet_Sound.java | 73 - .../gregtech/api/net/GT_Packet_TileEntity.java | 157 - .../gregtech/api/net/GT_Packet_ToolSwitchMode.java | 52 - .../gregtech/api/net/GT_Packet_UpdateItem.java | 64 - .../java/gregtech/api/net/IGT_NetworkHandler.java | 10 +- .../api/objects/AE2DigitalChestHandler.java | 6 +- .../java/gregtech/api/objects/GTArrayList.java | 73 + .../java/gregtech/api/objects/GTChunkManager.java | 204 + .../gregtech/api/objects/GTCopiedBlockTexture.java | 36 + .../java/gregtech/api/objects/GTCoverDefault.java | 81 + .../java/gregtech/api/objects/GTCoverNone.java | 237 + src/main/java/gregtech/api/objects/GTFluid.java | 36 + src/main/java/gregtech/api/objects/GTHashSet.java | 91 + .../java/gregtech/api/objects/GTItemStack.java | 107 + .../java/gregtech/api/objects/GTItemStack2.java | 41 + .../java/gregtech/api/objects/GTMultiTexture.java | 27 + .../gregtech/api/objects/GTRenderedTexture.java | 33 + .../java/gregtech/api/objects/GTSidedTexture.java | 48 + .../gregtech/api/objects/GTStdRenderedTexture.java | 46 + .../java/gregtech/api/objects/GTUODimension.java | 54 + .../gregtech/api/objects/GTUODimensionList.java | 648 + src/main/java/gregtech/api/objects/GTUOFluid.java | 69 + .../java/gregtech/api/objects/GT_ArrayList.java | 73 - .../java/gregtech/api/objects/GT_ChunkManager.java | 204 - .../api/objects/GT_CopiedBlockTexture.java | 35 - .../gregtech/api/objects/GT_Cover_Default.java | 81 - .../java/gregtech/api/objects/GT_Cover_None.java | 237 - src/main/java/gregtech/api/objects/GT_Fluid.java | 36 - src/main/java/gregtech/api/objects/GT_HashSet.java | 91 - .../java/gregtech/api/objects/GT_ItemStack.java | 107 - .../java/gregtech/api/objects/GT_ItemStack2.java | 41 - .../java/gregtech/api/objects/GT_MultiTexture.java | 26 - .../gregtech/api/objects/GT_RenderedTexture.java | 33 - .../java/gregtech/api/objects/GT_SidedTexture.java | 48 - .../api/objects/GT_StdRenderedTexture.java | 46 - .../java/gregtech/api/objects/GT_UO_Dimension.java | 54 - .../gregtech/api/objects/GT_UO_DimensionList.java | 648 - .../java/gregtech/api/objects/GT_UO_Fluid.java | 69 - src/main/java/gregtech/api/objects/ItemData.java | 2 +- .../java/gregtech/api/objects/MaterialStack.java | 4 +- .../overclockdescriber/EUNoOverclockDescriber.java | 38 +- .../overclockdescriber/EUOverclockDescriber.java | 34 +- .../FusionOverclockDescriber.java | 16 +- .../overclockdescriber/OverclockDescriber.java | 36 +- .../SteamOverclockDescriber.java | 20 +- .../api/recipe/BasicUIPropertiesBuilder.java | 4 +- .../java/gregtech/api/recipe/FindRecipeQuery.java | 18 +- .../gregtech/api/recipe/NEIRecipeProperties.java | 10 +- .../api/recipe/NEIRecipePropertiesBuilder.java | 6 +- src/main/java/gregtech/api/recipe/RecipeMap.java | 32 +- .../java/gregtech/api/recipe/RecipeMapBackend.java | 104 +- .../api/recipe/RecipeMapBackendProperties.java | 12 +- .../recipe/RecipeMapBackendPropertiesBuilder.java | 26 +- .../java/gregtech/api/recipe/RecipeMapBuilder.java | 30 +- .../gregtech/api/recipe/RecipeMapFrontend.java | 52 +- src/main/java/gregtech/api/recipe/RecipeMaps.java | 406 +- .../api/recipe/check/ResultInsufficientHeat.java | 4 +- .../check/ResultInsufficientMachineTier.java | 4 +- .../api/recipe/check/ResultInsufficientPower.java | 6 +- .../check/ResultInsufficientStartupPower.java | 4 +- .../ResultInsufficientStartupPowerBigInt.java | 2 +- .../api/recipe/check/SingleRecipeCheck.java | 59 +- .../gregtech/api/recipe/maps/AssemblerBackend.java | 4 +- .../api/recipe/maps/AssemblyLineFrontend.java | 8 +- .../api/recipe/maps/FluidCannerBackend.java | 24 +- .../api/recipe/maps/FormingPressBackend.java | 18 +- .../java/gregtech/api/recipe/maps/FuelBackend.java | 26 +- .../gregtech/api/recipe/maps/FurnaceBackend.java | 20 +- .../api/recipe/maps/LargeBoilerFuelBackend.java | 22 +- .../gregtech/api/recipe/maps/MicrowaveBackend.java | 83 +- .../gregtech/api/recipe/maps/NonGTBackend.java | 8 +- .../api/recipe/maps/OilCrackerBackend.java | 4 +- .../gregtech/api/recipe/maps/PrinterBackend.java | 32 +- .../maps/PurificationUnitClarifierFrontend.java | 12 +- .../maps/PurificationUnitFlocculatorFrontend.java | 27 +- .../recipe/maps/PurificationUnitLaserFrontend.java | 10 +- .../maps/PurificationUnitOzonationFrontend.java | 4 +- .../PurificationUnitParticleExtractorFrontend.java | 4 +- .../maps/PurificationUnitPhAdjustmentFrontend.java | 23 +- .../maps/PurificationUnitPlasmaHeaterFrontend.java | 14 +- .../gregtech/api/recipe/maps/RecyclerBackend.java | 22 +- .../api/recipe/maps/ReplicatorBackend.java | 36 +- .../api/recipe/maps/SpaceProjectFrontend.java | 18 +- .../maps/TranscendentPlasmaMixerFrontend.java | 8 +- .../api/recipe/maps/UnpackagerBackend.java | 12 +- .../api/recipe/metadata/CompressionTierKey.java | 2 +- .../api/recipe/metadata/PCBFactoryTierKey.java | 2 +- .../api/recipe/metadata/PCBFactoryUpgradeKey.java | 2 +- .../api/registries/LHECoolantRegistry.java | 8 +- .../java/gregtech/api/render/TextureFactory.java | 4 +- .../gregtech/api/task/tasks/PollutionTask.java | 4 +- .../api/threads/GT_Runnable_Cable_Update.java | 87 - .../threads/GT_Runnable_MachineBlockUpdate.java | 184 - .../gregtech/api/threads/GT_Runnable_Sound.java | 41 - .../gregtech/api/threads/RunnableCableUpdate.java | 87 + .../api/threads/RunnableMachineUpdate.java | 184 + .../java/gregtech/api/threads/RunnableSound.java | 41 + .../java/gregtech/api/util/AssemblyLineServer.java | 297 + .../java/gregtech/api/util/AssemblyLineUtils.java | 561 + .../gregtech/api/util/BlastFurnaceGasStat.java | 5 +- .../java/gregtech/api/util/CircuitryBehavior.java | 212 + .../gregtech/api/util/ColorsMetadataSection.java | 2 +- .../api/util/ColorsMetadataSectionSerializer.java | 12 +- src/main/java/gregtech/api/util/CoverBehavior.java | 402 + .../java/gregtech/api/util/CoverBehaviorBase.java | 839 ++ .../gregtech/api/util/ExoticEnergyInputHelper.java | 103 + .../java/gregtech/api/util/FishPondFakeRecipe.java | 8 +- .../java/gregtech/api/util/GTApiaryModifier.java | 24 + .../java/gregtech/api/util/GTApiaryUpgrade.java | 224 + src/main/java/gregtech/api/util/GTBaseCrop.java | 311 + src/main/java/gregtech/api/util/GTBlockMap.java | 134 + src/main/java/gregtech/api/util/GTBlockSet.java | 39 + src/main/java/gregtech/api/util/GTCLSCompat.java | 157 + .../gregtech/api/util/GTChunkAssociatedData.java | 494 + .../java/gregtech/api/util/GTClientPreference.java | 43 + src/main/java/gregtech/api/util/GTConfig.java | 162 + src/main/java/gregtech/api/util/GTCreativeTab.java | 26 + src/main/java/gregtech/api/util/GTFoodStat.java | 122 + .../java/gregtech/api/util/GTForestryCompat.java | 193 + src/main/java/gregtech/api/util/GTGCCompat.java | 52 + .../java/gregtech/api/util/GTIBoxableWrapper.java | 13 + .../api/util/GTItsNotMyFaultException.java | 18 + .../java/gregtech/api/util/GTLanguageManager.java | 603 + src/main/java/gregtech/api/util/GTLog.java | 45 + src/main/java/gregtech/api/util/GTModHandler.java | 2435 ++++ src/main/java/gregtech/api/util/GTMusicSystem.java | 667 + .../gregtech/api/util/GTOreDictUnificator.java | 578 + src/main/java/gregtech/api/util/GTPlayedSound.java | 31 + src/main/java/gregtech/api/util/GTRecipe.java | 1366 ++ .../java/gregtech/api/util/GTRecipeBuilder.java | 946 ++ .../java/gregtech/api/util/GTRecipeConstants.java | 691 + .../java/gregtech/api/util/GTRecipeMapUtil.java | 198 + .../gregtech/api/util/GTRecipeRegistrator.java | 872 ++ .../java/gregtech/api/util/GTRenderingWorld.java | 195 + .../java/gregtech/api/util/GTShapedRecipe.java | 100 + .../java/gregtech/api/util/GTShapelessRecipe.java | 100 + .../gregtech/api/util/GTSpawnEventHandler.java | 81 + src/main/java/gregtech/api/util/GTStreamUtil.java | 44 + .../java/gregtech/api/util/GTStructureUtility.java | 616 + .../gregtech/api/util/GTToolHarvestHelper.java | 71 + .../java/gregtech/api/util/GTTooltipDataCache.java | 104 + src/main/java/gregtech/api/util/GTUtil.java | 344 + src/main/java/gregtech/api/util/GTUtility.java | 4852 +++++++ .../java/gregtech/api/util/GTUtilityClient.java | 52 + src/main/java/gregtech/api/util/GTWaila.java | 23 + .../java/gregtech/api/util/GT_ApiaryModifier.java | 24 - .../java/gregtech/api/util/GT_ApiaryUpgrade.java | 225 - .../gregtech/api/util/GT_AssemblyLineUtils.java | 559 - .../gregtech/api/util/GT_Assemblyline_Server.java | 297 - src/main/java/gregtech/api/util/GT_BaseCrop.java | 311 - src/main/java/gregtech/api/util/GT_BlockMap.java | 134 - src/main/java/gregtech/api/util/GT_BlockSet.java | 39 - src/main/java/gregtech/api/util/GT_CLS_Compat.java | 157 - .../gregtech/api/util/GT_ChunkAssociatedData.java | 494 - .../gregtech/api/util/GT_CircuitryBehavior.java | 212 - .../gregtech/api/util/GT_ClientPreference.java | 43 - src/main/java/gregtech/api/util/GT_Config.java | 162 - .../java/gregtech/api/util/GT_CoverBehavior.java | 402 - .../gregtech/api/util/GT_CoverBehaviorBase.java | 839 -- .../java/gregtech/api/util/GT_CreativeTab.java | 26 - .../api/util/GT_ExoticEnergyInputHelper.java | 114 - src/main/java/gregtech/api/util/GT_FoodStat.java | 122 - .../java/gregtech/api/util/GT_Forestry_Compat.java | 193 - src/main/java/gregtech/api/util/GT_GC_Compat.java | 52 - .../gregtech/api/util/GT_HatchElementBuilder.java | 547 - .../java/gregtech/api/util/GT_IBoxableWrapper.java | 13 - .../api/util/GT_ItsNotMyFaultException.java | 18 - .../gregtech/api/util/GT_JubilanceMegaApiary.java | 23 - .../java/gregtech/api/util/GT_LanguageManager.java | 603 - src/main/java/gregtech/api/util/GT_Log.java | 45 - src/main/java/gregtech/api/util/GT_ModHandler.java | 2437 ---- .../api/util/GT_Multiblock_Tooltip_Builder.java | 735 - .../java/gregtech/api/util/GT_MusicSystem.java | 667 - .../gregtech/api/util/GT_OreDictUnificator.java | 578 - .../gregtech/api/util/GT_OverclockCalculator.java | 621 - .../gregtech/api/util/GT_PCBFactoryManager.java | 25 - .../java/gregtech/api/util/GT_ParallelHelper.java | 713 - .../java/gregtech/api/util/GT_PlayedSound.java | 31 - .../api/util/GT_ProcessingArray_Manager.java | 51 - src/main/java/gregtech/api/util/GT_Recipe.java | 1366 -- .../java/gregtech/api/util/GT_RecipeBuilder.java | 946 -- .../java/gregtech/api/util/GT_RecipeConstants.java | 692 - .../java/gregtech/api/util/GT_RecipeMapUtil.java | 198 - .../gregtech/api/util/GT_RecipeRegistrator.java | 872 -- .../java/gregtech/api/util/GT_RenderingWorld.java | 195 - .../java/gregtech/api/util/GT_Shaped_Recipe.java | 100 - .../gregtech/api/util/GT_Shapeless_Recipe.java | 100 - .../gregtech/api/util/GT_SpawnEventHandler.java | 81 - src/main/java/gregtech/api/util/GT_StreamUtil.java | 44 - .../gregtech/api/util/GT_StructureUtility.java | 618 - .../gregtech/api/util/GT_StructureUtilityMuTE.java | 8 +- .../gregtech/api/util/GT_ToolHarvestHelper.java | 71 - .../gregtech/api/util/GT_TooltipDataCache.java | 9 +- src/main/java/gregtech/api/util/GT_Util.java | 347 - src/main/java/gregtech/api/util/GT_Utility.java | 4859 ------- .../java/gregtech/api/util/GT_UtilityClient.java | 52 - src/main/java/gregtech/api/util/GT_Waila.java | 23 - .../gregtech/api/util/HatchElementBuilder.java | 546 + src/main/java/gregtech/api/util/IGTHatchAdder.java | 28 + .../java/gregtech/api/util/IGT_HatchAdder.java | 28 - .../gregtech/api/util/JubilanceMegaApiary.java | 23 + .../api/util/MultiblockTooltipBuilder.java | 735 + .../java/gregtech/api/util/OutputHatchWrapper.java | 6 +- .../gregtech/api/util/OverclockCalculator.java | 621 + .../java/gregtech/api/util/PCBFactoryManager.java | 25 + .../java/gregtech/api/util/ParallelHelper.java | 713 + .../gregtech/api/util/ProcessingArrayManager.java | 51 + .../gregtech/api/util/SemiFluidFuelHandler.java | 10 +- .../gregtech/api/util/VoidProtectionHelper.java | 2 +- .../java/gregtech/api/util/item/ItemHolder.java | 4 +- .../api/util/recipe/RecipeInputRequirements.java | 8 +- .../api/util/shutdown/ReasonOutOfFluid.java | 4 +- .../api/util/shutdown/ReasonOutOfItem.java | 2 +- .../api/util/shutdown/ReasonOutOfStuff.java | 2 +- .../api/util/shutdown/ShutDownReasonRegistry.java | 2 +- src/main/java/gregtech/api/world/GTWorldgen.java | 123 + src/main/java/gregtech/api/world/GT_Worldgen.java | 123 - src/main/java/gregtech/asm/GTCorePlugin.java | 17 +- .../java/gregtech/client/GTGUIClientConfig.java | 29 + src/main/java/gregtech/client/GTGuiFactory.java | 13 + src/main/java/gregtech/client/GTSoundLoop.java | 80 + .../java/gregtech/client/GTTooltipHandler.java | 195 + .../java/gregtech/client/GT_GUI_ClientConfig.java | 29 - src/main/java/gregtech/client/GT_GuiFactory.java | 13 - src/main/java/gregtech/client/GT_SoundLoop.java | 80 - .../java/gregtech/client/GT_TooltipHandler.java | 195 - src/main/java/gregtech/common/GTClient.java | 1073 ++ src/main/java/gregtech/common/GTDummyWorld.java | 138 + .../java/gregtech/common/GTIteratorRandom.java | 17 + src/main/java/gregtech/common/GTNetwork.java | 154 + .../gregtech/common/GTPlayerActivityLogger.java | 34 + src/main/java/gregtech/common/GTProxy.java | 2892 ++++ src/main/java/gregtech/common/GTServer.java | 36 + .../java/gregtech/common/GTThaumcraftCompat.java | 285 + .../java/gregtech/common/GTWorldgenerator.java | 686 + src/main/java/gregtech/common/GT_Client.java | 1073 -- src/main/java/gregtech/common/GT_DummyWorld.java | 138 - .../java/gregtech/common/GT_IteratorRandom.java | 17 - src/main/java/gregtech/common/GT_Network.java | 154 - .../gregtech/common/GT_PlayerActivityLogger.java | 34 - src/main/java/gregtech/common/GT_Pollution.java | 507 - src/main/java/gregtech/common/GT_Proxy.java | 2899 ---- src/main/java/gregtech/common/GT_RecipeAdder.java | 12 - src/main/java/gregtech/common/GT_Server.java | 36 - .../java/gregtech/common/GT_ThaumcraftCompat.java | 285 - .../java/gregtech/common/GT_UndergroundOil.java | 339 - .../gregtech/common/GT_Worldgen_GT_Ore_Layer.java | 442 - .../common/GT_Worldgen_GT_Ore_SmallPieces.java | 107 - .../java/gregtech/common/GT_Worldgen_Stone.java | 297 - .../java/gregtech/common/GT_Worldgenerator.java | 686 - src/main/java/gregtech/common/OreMixBuilder.java | 2 +- src/main/java/gregtech/common/Pollution.java | 507 + src/main/java/gregtech/common/RecipeAdder.java | 12 + src/main/java/gregtech/common/SmallOreBuilder.java | 2 +- src/main/java/gregtech/common/UndergroundOil.java | 339 + .../gregtech/common/WirelessComputationPacket.java | 2 +- .../java/gregtech/common/WorldgenGTOreLayer.java | 439 + .../gregtech/common/WorldgenGTOreSmallPieces.java | 107 + src/main/java/gregtech/common/WorldgenStone.java | 297 + .../gregtech/common/bees/GTAlleleBeeSpecies.java | 53 + .../java/gregtech/common/bees/GTAlleleHelper.java | 268 + .../java/gregtech/common/bees/GTBeeMutation.java | 85 + .../gregtech/common/bees/GT_AlleleBeeSpecies.java | 53 - .../java/gregtech/common/bees/GT_AlleleHelper.java | 268 - .../java/gregtech/common/bees/GT_Bee_Mutation.java | 85 - .../java/gregtech/common/blocks/BlockCasings1.java | 107 + .../gregtech/common/blocks/BlockCasings10.java | 76 + .../gregtech/common/blocks/BlockCasings11.java | 58 + .../java/gregtech/common/blocks/BlockCasings2.java | 102 + .../java/gregtech/common/blocks/BlockCasings3.java | 82 + .../java/gregtech/common/blocks/BlockCasings4.java | 239 + .../java/gregtech/common/blocks/BlockCasings5.java | 161 + .../java/gregtech/common/blocks/BlockCasings6.java | 94 + .../java/gregtech/common/blocks/BlockCasings8.java | 188 + .../java/gregtech/common/blocks/BlockCasings9.java | 96 + .../common/blocks/BlockCasingsAbstract.java | 143 + .../gregtech/common/blocks/BlockConcretes.java | 83 + .../common/blocks/BlockCyclotronCoils.java | 131 + .../java/gregtech/common/blocks/BlockDrone.java | 65 + .../java/gregtech/common/blocks/BlockFrameBox.java | 446 + .../java/gregtech/common/blocks/BlockGlass1.java | 107 + .../java/gregtech/common/blocks/BlockGranites.java | 77 + .../java/gregtech/common/blocks/BlockLaser.java | 104 + .../java/gregtech/common/blocks/BlockMachines.java | 703 + .../java/gregtech/common/blocks/BlockMetal.java | 68 + .../java/gregtech/common/blocks/BlockOres.java | 154 + .../gregtech/common/blocks/BlockOresAbstract.java | 324 + .../gregtech/common/blocks/BlockReinforced.java | 409 + .../java/gregtech/common/blocks/BlockStones.java | 62 + .../common/blocks/BlockStonesAbstract.java | 250 + .../java/gregtech/common/blocks/BlockStorage.java | 103 + .../common/blocks/BlockTintedIndustrialGlass.java | 98 + .../common/blocks/BlockWormholeRender.java | 75 + .../gregtech/common/blocks/GT_Block_Casings1.java | 108 - .../gregtech/common/blocks/GT_Block_Casings10.java | 76 - .../gregtech/common/blocks/GT_Block_Casings11.java | 58 - .../gregtech/common/blocks/GT_Block_Casings2.java | 102 - .../gregtech/common/blocks/GT_Block_Casings3.java | 82 - .../gregtech/common/blocks/GT_Block_Casings4.java | 239 - .../gregtech/common/blocks/GT_Block_Casings5.java | 161 - .../gregtech/common/blocks/GT_Block_Casings6.java | 94 - .../gregtech/common/blocks/GT_Block_Casings8.java | 188 - .../gregtech/common/blocks/GT_Block_Casings9.java | 96 - .../common/blocks/GT_Block_Casings_Abstract.java | 144 - .../gregtech/common/blocks/GT_Block_Concretes.java | 83 - .../gregtech/common/blocks/GT_Block_Drone.java | 65 - .../gregtech/common/blocks/GT_Block_FrameBox.java | 446 - .../gregtech/common/blocks/GT_Block_Glass1.java | 107 - .../gregtech/common/blocks/GT_Block_Granites.java | 77 - .../gregtech/common/blocks/GT_Block_Laser.java | 104 - .../gregtech/common/blocks/GT_Block_Machines.java | 703 - .../gregtech/common/blocks/GT_Block_Metal.java | 68 - .../java/gregtech/common/blocks/GT_Block_Ores.java | 154 - .../common/blocks/GT_Block_Ores_Abstract.java | 324 - .../common/blocks/GT_Block_Reinforced.java | 409 - .../gregtech/common/blocks/GT_Block_Stones.java | 62 - .../common/blocks/GT_Block_Stones_Abstract.java | 250 - .../gregtech/common/blocks/GT_Block_Storage.java | 103 - .../blocks/GT_Block_TintedIndustrialGlass.java | 98 - .../gregtech/common/blocks/GT_Cyclotron_Coils.java | 131 - .../common/blocks/GT_Cyclotron_Item_Casings.java | 10 - .../common/blocks/GT_Item_Block_Laser.java | 24 - .../gregtech/common/blocks/GT_Item_Casings1.java | 14 - .../gregtech/common/blocks/GT_Item_Casings10.java | 14 - .../gregtech/common/blocks/GT_Item_Casings11.java | 14 - .../gregtech/common/blocks/GT_Item_Casings2.java | 26 - .../gregtech/common/blocks/GT_Item_Casings3.java | 14 - .../gregtech/common/blocks/GT_Item_Casings4.java | 14 - .../gregtech/common/blocks/GT_Item_Casings5.java | 36 - .../gregtech/common/blocks/GT_Item_Casings6.java | 14 - .../gregtech/common/blocks/GT_Item_Casings8.java | 14 - .../gregtech/common/blocks/GT_Item_Casings9.java | 28 - .../common/blocks/GT_Item_Casings_Abstract.java | 63 - .../gregtech/common/blocks/GT_Item_Concretes.java | 25 - .../gregtech/common/blocks/GT_Item_Frames.java | 60 - .../gregtech/common/blocks/GT_Item_Glass1.java | 36 - .../gregtech/common/blocks/GT_Item_Granites.java | 10 - .../common/blocks/GT_Item_LongDistancePipe.java | 43 - .../gregtech/common/blocks/GT_Item_Machines.java | 430 - .../java/gregtech/common/blocks/GT_Item_Ores.java | 81 - .../common/blocks/GT_Item_Stones_Abstract.java | 42 - .../gregtech/common/blocks/GT_Item_Storage.java | 47 - .../blocks/GT_Item_TintedIndustrialGlass.java | 10 - .../common/blocks/GT_Material_Casings.java | 19 - .../common/blocks/GT_Material_Machines.java | 19 - .../common/blocks/GT_Material_Reinforced.java | 18 - .../gregtech/common/blocks/GT_Packet_Ores.java | 62 - .../gregtech/common/blocks/GT_TileEntity_Ores.java | 486 - .../common/blocks/GT_WormholeRenderBlock.java | 75 - .../gregtech/common/blocks/ItemBlockLaser.java | 24 + .../java/gregtech/common/blocks/ItemCasings1.java | 14 + .../java/gregtech/common/blocks/ItemCasings10.java | 14 + .../java/gregtech/common/blocks/ItemCasings11.java | 14 + .../java/gregtech/common/blocks/ItemCasings2.java | 26 + .../java/gregtech/common/blocks/ItemCasings3.java | 14 + .../java/gregtech/common/blocks/ItemCasings4.java | 14 + .../java/gregtech/common/blocks/ItemCasings5.java | 36 + .../java/gregtech/common/blocks/ItemCasings6.java | 14 + .../java/gregtech/common/blocks/ItemCasings8.java | 14 + .../java/gregtech/common/blocks/ItemCasings9.java | 28 + .../common/blocks/ItemCasingsAbstract.java | 63 + .../java/gregtech/common/blocks/ItemConcretes.java | 25 + .../common/blocks/ItemCyclotronCasings.java | 10 + .../java/gregtech/common/blocks/ItemFrames.java | 60 + .../java/gregtech/common/blocks/ItemGlass1.java | 36 + .../java/gregtech/common/blocks/ItemGranites.java | 10 + .../common/blocks/ItemLongDistancePipe.java | 43 + .../java/gregtech/common/blocks/ItemMachines.java | 430 + src/main/java/gregtech/common/blocks/ItemOres.java | 81 + .../gregtech/common/blocks/ItemStonesAbstract.java | 42 + .../java/gregtech/common/blocks/ItemStorage.java | 47 + .../common/blocks/ItemTintedIndustrialGlass.java | 10 + .../gregtech/common/blocks/MaterialCasings.java | 19 + .../gregtech/common/blocks/MaterialMachines.java | 19 + .../gregtech/common/blocks/MaterialReinforced.java | 18 + .../java/gregtech/common/blocks/PacketOres.java | 62 + .../gregtech/common/blocks/TileEntityOres.java | 482 + src/main/java/gregtech/common/covers/CoverArm.java | 431 + .../java/gregtech/common/covers/CoverChest.java | 274 + .../gregtech/common/covers/CoverControlsWork.java | 270 + .../java/gregtech/common/covers/CoverConveyor.java | 325 + .../java/gregtech/common/covers/CoverCrafting.java | 56 + .../java/gregtech/common/covers/CoverDoesWork.java | 252 + .../java/gregtech/common/covers/CoverDrain.java | 140 + .../java/gregtech/common/covers/CoverEUMeter.java | 408 + .../java/gregtech/common/covers/CoverFacadeAE.java | 31 + .../gregtech/common/covers/CoverFacadeBase.java | 396 + .../gregtech/common/covers/CoverFluidLimiter.java | 202 + .../common/covers/CoverFluidRegulator.java | 520 + .../common/covers/CoverFluidStorageMonitor.java | 507 + .../gregtech/common/covers/CoverFluidfilter.java | 414 + .../java/gregtech/common/covers/CoverInfo.java | 26 +- .../gregtech/common/covers/CoverItemFilter.java | 298 + .../gregtech/common/covers/CoverItemMeter.java | 384 + .../java/gregtech/common/covers/CoverLens.java | 28 + .../gregtech/common/covers/CoverLiquidMeter.java | 292 + .../common/covers/CoverMetricsTransmitter.java | 211 + .../common/covers/CoverNeedMaintainance.java | 297 + .../common/covers/CoverPlayerDetector.java | 202 + .../java/gregtech/common/covers/CoverPump.java | 331 + .../common/covers/CoverRedstoneConductor.java | 101 + .../covers/CoverRedstoneReceiverExternal.java | 41 + .../covers/CoverRedstoneReceiverInternal.java | 46 + .../common/covers/CoverRedstoneSignalizer.java | 98 + .../covers/CoverRedstoneTransmitterExternal.java | 53 + .../covers/CoverRedstoneTransmitterInternal.java | 43 + .../common/covers/CoverRedstoneWirelessBase.java | 222 + .../java/gregtech/common/covers/CoverScreen.java | 100 + .../java/gregtech/common/covers/CoverShutter.java | 195 + .../gregtech/common/covers/CoverSolarPanel.java | 139 + .../common/covers/CoverSteamRegulator.java | 18 + .../gregtech/common/covers/CoverSteamValve.java | 26 + .../java/gregtech/common/covers/CoverVent.java | 111 + .../java/gregtech/common/covers/GT_Cover_Arm.java | 431 - .../gregtech/common/covers/GT_Cover_Chest.java | 274 - .../common/covers/GT_Cover_ControlsWork.java | 270 - .../gregtech/common/covers/GT_Cover_Conveyor.java | 328 - .../gregtech/common/covers/GT_Cover_Crafting.java | 56 - .../gregtech/common/covers/GT_Cover_DoesWork.java | 252 - .../gregtech/common/covers/GT_Cover_Drain.java | 140 - .../gregtech/common/covers/GT_Cover_EUMeter.java | 410 - .../gregtech/common/covers/GT_Cover_FacadeAE.java | 31 - .../common/covers/GT_Cover_FacadeBase.java | 396 - .../common/covers/GT_Cover_FluidLimiter.java | 202 - .../common/covers/GT_Cover_FluidRegulator.java | 520 - .../covers/GT_Cover_FluidStorageMonitor.java | 507 - .../common/covers/GT_Cover_Fluidfilter.java | 417 - .../common/covers/GT_Cover_ItemFilter.java | 298 - .../gregtech/common/covers/GT_Cover_ItemMeter.java | 384 - .../java/gregtech/common/covers/GT_Cover_Lens.java | 28 - .../common/covers/GT_Cover_LiquidMeter.java | 292 - .../covers/GT_Cover_Metrics_Transmitter.java | 212 - .../common/covers/GT_Cover_NeedMaintainance.java | 298 - .../common/covers/GT_Cover_PlayerDetector.java | 202 - .../java/gregtech/common/covers/GT_Cover_Pump.java | 334 - .../common/covers/GT_Cover_RedstoneConductor.java | 101 - .../covers/GT_Cover_RedstoneReceiverExternal.java | 41 - .../covers/GT_Cover_RedstoneReceiverInternal.java | 46 - .../common/covers/GT_Cover_RedstoneSignalizer.java | 99 - .../GT_Cover_RedstoneTransmitterExternal.java | 53 - .../GT_Cover_RedstoneTransmitterInternal.java | 43 - .../covers/GT_Cover_RedstoneWirelessBase.java | 228 - .../gregtech/common/covers/GT_Cover_Screen.java | 100 - .../gregtech/common/covers/GT_Cover_Shutter.java | 196 - .../common/covers/GT_Cover_SolarPanel.java | 139 - .../common/covers/GT_Cover_SteamRegulator.java | 18 - .../common/covers/GT_Cover_SteamValve.java | 26 - .../java/gregtech/common/covers/GT_Cover_Vent.java | 111 - .../CoverAdvancedRedstoneReceiverBase.java | 202 + .../CoverAdvancedRedstoneReceiverExternal.java | 35 + .../CoverAdvancedRedstoneReceiverInternal.java | 42 + .../CoverAdvancedRedstoneTransmitterBase.java | 188 + .../CoverAdvancedRedstoneTransmitterExternal.java | 51 + .../CoverAdvancedRedstoneTransmitterInternal.java | 50 + .../CoverAdvancedWirelessRedstoneBase.java | 298 + .../redstone/CoverWirelessDoesWorkDetector.java | 244 + .../redstone/CoverWirelessFluidDetector.java | 186 + .../covers/redstone/CoverWirelessItemDetector.java | 262 + .../redstone/CoverWirelessMaintenanceDetector.java | 242 + .../GT_Cover_AdvancedRedstoneReceiverBase.java | 202 - .../GT_Cover_AdvancedRedstoneReceiverExternal.java | 35 - .../GT_Cover_AdvancedRedstoneReceiverInternal.java | 42 - .../GT_Cover_AdvancedRedstoneTransmitterBase.java | 188 - ..._Cover_AdvancedRedstoneTransmitterExternal.java | 51 - ..._Cover_AdvancedRedstoneTransmitterInternal.java | 50 - .../GT_Cover_AdvancedWirelessRedstoneBase.java | 298 - .../GT_Cover_WirelessDoesWorkDetector.java | 245 - .../redstone/GT_Cover_WirelessFluidDetector.java | 186 - .../redstone/GT_Cover_WirelessItemDetector.java | 262 - .../GT_Cover_WirelessMaintenanceDetector.java | 242 - .../common/entities/EntityFXPollution.java | 59 + .../common/entities/GT_EntityFXPollution.java | 59 - src/main/java/gregtech/common/fluid/GTFluid.java | 209 + .../java/gregtech/common/fluid/GTFluidBuilder.java | 146 + src/main/java/gregtech/common/fluid/GT_Fluid.java | 209 - .../gregtech/common/fluid/GT_FluidBuilder.java | 146 - .../gregtech/common/gui/MachineGUIProvider.java | 78 +- .../modularui/uifactory/SelectItemUIFactory.java | 20 +- .../modularui/widget/CoverCycleButtonWidget.java | 10 +- .../widget/CoverDataControllerWidget.java | 18 +- .../widget/CoverDataFollowerCycleButtonWidget.java | 39 + .../widget/CoverDataFollowerNumericWidget.java | 60 + .../widget/CoverDataFollowerSlotWidget.java | 101 + .../widget/CoverDataFollowerTextFieldWidget.java | 134 + .../CoverDataFollowerToggleButtonWidget.java | 86 + .../CoverDataFollower_CycleButtonWidget.java | 39 - .../widget/CoverDataFollower_NumericWidget.java | 60 - .../widget/CoverDataFollower_SlotWidget.java | 101 - .../widget/CoverDataFollower_TextFieldWidget.java | 134 - .../CoverDataFollower_ToggleButtonWidget.java | 86 - .../modularui/widget/ItemWatcherSlotWidget.java | 4 +- src/main/java/gregtech/common/items/CombType.java | 4 +- src/main/java/gregtech/common/items/DropType.java | 4 +- .../common/items/GT_AdvancedSensorCard_Item.java | 330 - .../common/items/GT_DepletetCell_Item.java | 49 - .../gregtech/common/items/GT_FluidDisplayItem.java | 181 - .../common/items/GT_IntegratedCircuit_Item.java | 328 - .../common/items/GT_MetaGenerated_Item_01.java | 4635 ------- .../common/items/GT_MetaGenerated_Item_02.java | 3115 ----- .../common/items/GT_MetaGenerated_Item_03.java | 1492 -- .../common/items/GT_MetaGenerated_Item_98.java | 352 - .../common/items/GT_MetaGenerated_Item_99.java | 214 - .../common/items/GT_MetaGenerated_Tool_01.java | 746 - .../common/items/GT_NeutronReflector_Item.java | 54 - .../gregtech/common/items/GT_SensorCard_Item.java | 111 - .../java/gregtech/common/items/GT_TierDrone.java | 18 - .../gregtech/common/items/GT_VolumetricFlask.java | 360 - .../common/items/GT_WirelessHeadphones.java | 118 - .../java/gregtech/common/items/IDMetaItem01.java | 433 + .../java/gregtech/common/items/IDMetaItem02.java | 208 + .../java/gregtech/common/items/IDMetaItem03.java | 242 + .../java/gregtech/common/items/IDMetaTool01.java | 73 + .../java/gregtech/common/items/ID_MetaItem_01.java | 433 - .../java/gregtech/common/items/ID_MetaItem_02.java | 208 - .../java/gregtech/common/items/ID_MetaItem_03.java | 242 - .../java/gregtech/common/items/ID_MetaTool_01.java | 73 - .../common/items/ItemAdvancedSensorCard.java | 330 + src/main/java/gregtech/common/items/ItemComb.java | 324 +- .../gregtech/common/items/ItemDepletedCell.java | 49 + src/main/java/gregtech/common/items/ItemDrop.java | 46 +- .../gregtech/common/items/ItemFluidDisplay.java | 181 + .../common/items/ItemIntegratedCircuit.java | 327 + .../common/items/ItemNeutronReflector.java | 54 + .../java/gregtech/common/items/ItemPropolis.java | 34 +- .../java/gregtech/common/items/ItemSensorCard.java | 111 + .../java/gregtech/common/items/ItemTierDrone.java | 18 + .../gregtech/common/items/ItemVolumetricFlask.java | 360 + .../common/items/ItemWirelessHeadphones.java | 118 + .../gregtech/common/items/MetaGeneratedItem01.java | 4624 +++++++ .../gregtech/common/items/MetaGeneratedItem02.java | 3107 +++++ .../gregtech/common/items/MetaGeneratedItem03.java | 1492 ++ .../gregtech/common/items/MetaGeneratedItem98.java | 352 + .../gregtech/common/items/MetaGeneratedItem99.java | 214 + .../gregtech/common/items/MetaGeneratedTool01.java | 738 + .../java/gregtech/common/items/PollenType.java | 4 +- .../java/gregtech/common/items/PropolisType.java | 4 +- .../common/items/behaviors/BehaviourCoverTool.java | 193 + .../common/items/behaviors/BehaviourCrowbar.java | 61 + .../common/items/behaviors/BehaviourDataOrb.java | 105 + .../common/items/behaviors/BehaviourDataStick.java | 52 + .../common/items/behaviors/BehaviourHoe.java | 72 + .../common/items/behaviors/BehaviourLighter.java | 139 + .../common/items/behaviors/BehaviourNone.java | 90 + .../items/behaviors/BehaviourPlungerEssentia.java | 54 + .../items/behaviors/BehaviourPlungerFluid.java | 75 + .../items/behaviors/BehaviourPlungerItem.java | 88 + .../items/behaviors/BehaviourPrintedPages.java | 39 + .../items/behaviors/BehaviourProspecting.java | 158 + .../common/items/behaviors/BehaviourScanner.java | 65 + .../common/items/behaviors/BehaviourScoop.java | 62 + .../items/behaviors/BehaviourScrewdriver.java | 52 + .../common/items/behaviors/BehaviourSense.java | 56 + .../common/items/behaviors/BehaviourSensorKit.java | 56 + .../items/behaviors/BehaviourSoftHammer.java | 123 + .../common/items/behaviors/BehaviourSonictron.java | 135 + .../items/behaviors/BehaviourSprayColor.java | 218 + .../behaviors/BehaviourSprayColorRemover.java | 48 + .../items/behaviors/BehaviourSwitchMetadata.java | 67 + .../items/behaviors/BehaviourSwitchMode.java | 53 + .../common/items/behaviors/BehaviourWrench.java | 278 + .../items/behaviors/BehaviourWrittenBook.java | 40 + .../items/behaviors/Behaviour_Cover_Tool.java | 193 - .../common/items/behaviors/Behaviour_Crowbar.java | 61 - .../common/items/behaviors/Behaviour_DataOrb.java | 105 - .../items/behaviors/Behaviour_DataStick.java | 52 - .../common/items/behaviors/Behaviour_Hoe.java | 72 - .../common/items/behaviors/Behaviour_Lighter.java | 140 - .../common/items/behaviors/Behaviour_None.java | 90 - .../behaviors/Behaviour_Plunger_Essentia.java | 54 - .../items/behaviors/Behaviour_Plunger_Fluid.java | 75 - .../items/behaviors/Behaviour_Plunger_Item.java | 88 - .../items/behaviors/Behaviour_PrintedPages.java | 39 - .../items/behaviors/Behaviour_Prospecting.java | 159 - .../common/items/behaviors/Behaviour_Scanner.java | 65 - .../common/items/behaviors/Behaviour_Scoop.java | 63 - .../items/behaviors/Behaviour_Screwdriver.java | 52 - .../common/items/behaviors/Behaviour_Sense.java | 56 - .../items/behaviors/Behaviour_SensorKit.java | 56 - .../items/behaviors/Behaviour_SoftHammer.java | 131 - .../items/behaviors/Behaviour_Sonictron.java | 135 - .../items/behaviors/Behaviour_Spray_Color.java | 218 - .../behaviors/Behaviour_Spray_Color_Remover.java | 48 - .../items/behaviors/Behaviour_Switch_Metadata.java | 67 - .../items/behaviors/Behaviour_Switch_Mode.java | 53 - .../common/items/behaviors/Behaviour_Wrench.java | 278 - .../items/behaviors/Behaviour_WrittenBook.java | 40 - .../common/misc/DrillingLogicDelegate.java | 266 + .../gregtech/common/misc/GTClientPollutionMap.java | 140 + src/main/java/gregtech/common/misc/GTCommand.java | 354 + .../common/misc/GT_ClientPollutionMap.java | 140 - src/main/java/gregtech/common/misc/GT_Command.java | 355 - .../common/misc/GT_DrillingLogicDelegate.java | 266 - .../misc/GT_IDrillingLogicDelegateOwner.java | 22 - .../common/misc/GlobalMetricsCoverDatabase.java | 20 +- .../common/misc/IDrillingLogicDelegateOwner.java | 22 + .../misc/spaceprojects/SpaceProjectManager.java | 4 +- .../misc/spaceprojects/base/SPRequirements.java | 74 + .../common/misc/spaceprojects/base/SPUpgrade.java | 362 + .../misc/spaceprojects/base/SP_Requirements.java | 74 - .../common/misc/spaceprojects/base/SP_Upgrade.java | 362 - .../misc/spaceprojects/base/SpaceProject.java | 2 +- .../misc/spaceprojects/commands/SPCommand.java | 166 + .../misc/spaceprojects/commands/SPMCommand.java | 288 + .../misc/spaceprojects/commands/SPM_Command.java | 288 - .../misc/spaceprojects/commands/SP_Command.java | 166 - .../commands/SpaceProjectCommand.java | 9 + .../commands/SpaceProject_Command.java | 9 - .../common/redstonecircuits/CircuitBasicLogic.java | 137 + .../common/redstonecircuits/CircuitBitAnd.java | 81 + .../redstonecircuits/CircuitCombinationLock.java | 109 + .../common/redstonecircuits/CircuitEquals.java | 73 + .../common/redstonecircuits/CircuitPulser.java | 92 + .../common/redstonecircuits/CircuitRandomizer.java | 86 + .../redstonecircuits/CircuitRedstoneMeter.java | 94 + .../common/redstonecircuits/CircuitRepeater.java | 86 + .../common/redstonecircuits/CircuitTimer.java | 108 + .../redstonecircuits/GT_Circuit_BasicLogic.java | 137 - .../common/redstonecircuits/GT_Circuit_BitAnd.java | 81 - .../GT_Circuit_CombinationLock.java | 109 - .../common/redstonecircuits/GT_Circuit_Equals.java | 73 - .../common/redstonecircuits/GT_Circuit_Pulser.java | 92 - .../redstonecircuits/GT_Circuit_Randomizer.java | 86 - .../redstonecircuits/GT_Circuit_RedstoneMeter.java | 94 - .../redstonecircuits/GT_Circuit_Repeater.java | 86 - .../common/redstonecircuits/GT_Circuit_Timer.java | 108 - .../java/gregtech/common/render/DroneRender.java | 93 + .../java/gregtech/common/render/FlaskRenderer.java | 71 + .../common/render/FluidDisplayStackRenderer.java | 98 + .../gregtech/common/render/GTCapeRenderer.java | 148 + .../common/render/GTCopiedBlockTextureRender.java | 112 + .../common/render/GTCopiedCTMBlockTexture.java | 118 + .../java/gregtech/common/render/GTIconFlipped.java | 91 + .../common/render/GTMultiTextureRender.java | 69 + .../java/gregtech/common/render/GTRenderUtil.java | 141 + .../gregtech/common/render/GTRenderedTexture.java | 395 + .../gregtech/common/render/GTRendererBlock.java | 779 ++ .../common/render/GTSidedTextureRender.java | 78 + .../java/gregtech/common/render/GTTextureBase.java | 31 + .../gregtech/common/render/GTTextureBuilder.java | 150 + .../gregtech/common/render/GT_CapeRenderer.java | 148 - .../common/render/GT_CopiedBlockTexture.java | 112 - .../common/render/GT_CopiedCTMBlockTexture.java | 118 - .../gregtech/common/render/GT_FlaskRenderer.java | 71 - .../render/GT_FluidDisplayStackRenderer.java | 98 - .../gregtech/common/render/GT_IconFlipped.java | 91 - .../gregtech/common/render/GT_LaserRenderer.java | 90 - .../render/GT_MetaGenerated_Tool_Renderer.java | 130 - .../gregtech/common/render/GT_MultiTexture.java | 69 - .../common/render/GT_MultiTile_Renderer.java | 179 - .../common/render/GT_PollutionRenderer.java | 251 - .../gregtech/common/render/GT_RenderDrone.java | 93 - .../java/gregtech/common/render/GT_RenderUtil.java | 141 - .../gregtech/common/render/GT_RenderedTexture.java | 395 - .../gregtech/common/render/GT_Renderer_Block.java | 779 -- .../gregtech/common/render/GT_SidedTexture.java | 78 - .../gregtech/common/render/GT_TextureBase.java | 31 - .../gregtech/common/render/GT_TextureBuilder.java | 151 - .../common/render/GT_WormholeRenderer.java | 79 - .../gregtech/common/render/IRenderedBlock.java | 12 +- .../java/gregtech/common/render/LaserRenderer.java | 91 + .../common/render/MetaGeneratedToolRenderer.java | 130 + .../gregtech/common/render/MultiTileRenderer.java | 179 + .../gregtech/common/render/PollutionRenderer.java | 251 + .../gregtech/common/render/WormholeRenderer.java | 79 + .../render/items/CosmicNeutroniumRenderer.java | 10 +- .../common/render/items/DataStickRenderer.java | 42 + .../common/render/items/GT_DataStick_Renderer.java | 42 - .../render/items/GT_GeneratedItem_Renderer.java | 166 - .../items/GT_GeneratedMaterial_Renderer.java | 130 - .../items/GT_MetaGenerated_Item_Renderer.java | 85 - .../common/render/items/GaiaSpiritRenderer.java | 12 +- .../common/render/items/GeneratedItemRenderer.java | 166 + .../render/items/GeneratedMaterialRenderer.java | 130 + .../common/render/items/GlitchEffectRenderer.java | 6 +- .../common/render/items/InfinityRenderer.java | 6 +- .../render/items/MetaGeneratedItemRenderer.java | 85 + .../render/items/TranscendentMetalRenderer.java | 10 +- .../common/render/items/UniversiumRenderer.java | 12 +- .../automation/GT_MetaTileEntity_ChestBuffer.java | 137 - .../automation/GT_MetaTileEntity_Filter.java | 144 - .../GT_MetaTileEntity_ItemDistributor.java | 204 - .../automation/GT_MetaTileEntity_RecipeFilter.java | 326 - .../automation/GT_MetaTileEntity_Regulator.java | 228 - .../automation/GT_MetaTileEntity_SuperBuffer.java | 105 - .../automation/GT_MetaTileEntity_TypeFilter.java | 213 - .../tileentities/automation/MTEChestBuffer.java | 135 + .../common/tileentities/automation/MTEFilter.java | 137 + .../automation/MTEItemDistributor.java | 204 + .../tileentities/automation/MTERecipeFilter.java | 325 + .../tileentities/automation/MTERegulator.java | 221 + .../tileentities/automation/MTESuperBuffer.java | 103 + .../tileentities/automation/MTETypeFilter.java | 211 + .../boilers/GT_MetaTileEntity_Boiler.java | 530 - .../boilers/GT_MetaTileEntity_Boiler_Bronze.java | 260 - .../boilers/GT_MetaTileEntity_Boiler_Lava.java | 474 - .../boilers/GT_MetaTileEntity_Boiler_Solar.java | 311 - .../GT_MetaTileEntity_Boiler_Solar_Steel.java | 71 - .../boilers/GT_MetaTileEntity_Boiler_Steel.java | 108 - .../common/tileentities/boilers/MTEBoiler.java | 527 + .../tileentities/boilers/MTEBoilerBronze.java | 259 + .../common/tileentities/boilers/MTEBoilerLava.java | 474 + .../tileentities/boilers/MTEBoilerSolar.java | 311 + .../tileentities/boilers/MTEBoilerSolarSteel.java | 69 + .../tileentities/boilers/MTEBoilerSteel.java | 108 + .../tileentities/casings/upgrade/Ampere.java | 8 +- .../tileentities/casings/upgrade/Inventory.java | 2 +- .../common/tileentities/casings/upgrade/Tank.java | 10 +- .../GT_MetaTileEntity_AdvDebugStructureWriter.java | 437 - .../debug/MTEAdvDebugStructureWriter.java | 434 + .../GT_MetaTileEntity_DieselGenerator.java | 278 - .../generators/GT_MetaTileEntity_GasTurbine.java | 207 - .../generators/GT_MetaTileEntity_LightningRod.java | 169 - .../GT_MetaTileEntity_MagicEnergyConverter.java | 173 - .../GT_MetaTileEntity_MagicalEnergyAbsorber.java | 805 -- .../GT_MetaTileEntity_NaquadahReactor.java | 201 - .../GT_MetaTileEntity_PlasmaGenerator.java | 142 - .../generators/GT_MetaTileEntity_SteamTurbine.java | 238 - .../generators/MTEDieselGenerator.java | 278 + .../tileentities/generators/MTEGasTurbine.java | 201 + .../tileentities/generators/MTELightningRod.java | 168 + .../generators/MTEMagicEnergyConverter.java | 167 + .../generators/MTEMagicalEnergyAbsorber.java | 803 ++ .../generators/MTENaquadahReactor.java | 200 + .../generators/MTEPlasmaGenerator.java | 142 + .../tileentities/generators/MTESteamTurbine.java | 238 + .../GT_MetaTileEntity_BasicHull_Bronze.java | 45 - .../GT_MetaTileEntity_BasicHull_BronzeBricks.java | 53 - .../GT_MetaTileEntity_BasicHull_Steel.java | 47 - .../GT_MetaTileEntity_BasicHull_SteelBricks.java | 53 - .../GT_MetaTileEntity_Hatch_CraftingInput_ME.java | 1040 -- ...T_MetaTileEntity_Hatch_CraftingInput_Slave.java | 262 - .../GT_MetaTileEntity_Hatch_InputBus_ME.java | 887 -- .../machines/GT_MetaTileEntity_Hatch_Input_ME.java | 949 -- .../GT_MetaTileEntity_Hatch_OutputBus_ME.java | 380 - .../GT_MetaTileEntity_Hatch_Output_ME.java | 443 - .../machines/IRecipeProcessingAwareHatch.java | 7 +- .../tileentities/machines/MTEBasicHullBronze.java | 43 + .../machines/MTEBasicHullBronzeBricks.java | 46 + .../tileentities/machines/MTEBasicHullSteel.java | 46 + .../machines/MTEBasicHullSteelBricks.java | 46 + .../machines/MTEHatchCraftingInputME.java | 1039 ++ .../machines/MTEHatchCraftingInputSlave.java | 260 + .../tileentities/machines/MTEHatchInputBusME.java | 886 ++ .../tileentities/machines/MTEHatchInputME.java | 949 ++ .../tileentities/machines/MTEHatchOutputBusME.java | 378 + .../tileentities/machines/MTEHatchOutputME.java | 443 + .../GT_MetaTileEntity_AdvSeismicProspector.java | 309 - .../basic/GT_MetaTileEntity_BetterJukebox.java | 702 - .../basic/GT_MetaTileEntity_Boxinator.java | 229 - .../machines/basic/GT_MetaTileEntity_Charger.java | 110 - .../basic/GT_MetaTileEntity_IndustrialApiary.java | 1555 --- .../basic/GT_MetaTileEntity_Massfabricator.java | 241 - ..._MetaTileEntity_MicrowaveEnergyTransmitter.java | 495 - .../machines/basic/GT_MetaTileEntity_Miner.java | 407 - .../basic/GT_MetaTileEntity_MonsterRepellent.java | 182 - .../basic/GT_MetaTileEntity_PotionBrewer.java | 225 - .../machines/basic/GT_MetaTileEntity_Pump.java | 846 -- .../basic/GT_MetaTileEntity_Replicator.java | 130 - .../basic/GT_MetaTileEntity_RockBreaker.java | 169 - .../machines/basic/GT_MetaTileEntity_Scanner.java | 425 - .../basic/GT_MetaTileEntity_Teleporter.java | 601 - .../basic/GT_MetaTileEntity_TurboCharger.java | 146 - .../basic/GT_MetaTileEntity_WorldAccelerator.java | 470 - .../machines/basic/MTEAdvSeismicProspector.java | 307 + .../machines/basic/MTEBetterJukebox.java | 701 + .../tileentities/machines/basic/MTEBoxinator.java | 231 + .../tileentities/machines/basic/MTECharger.java | 107 + .../machines/basic/MTEIndustrialApiary.java | 1554 +++ .../machines/basic/MTEMassfabricator.java | 241 + .../basic/MTEMicrowaveEnergyTransmitter.java | 474 + .../tileentities/machines/basic/MTEMiner.java | 406 + .../machines/basic/MTEMonsterRepellent.java | 182 + .../machines/basic/MTEPotionBrewer.java | 224 + .../tileentities/machines/basic/MTEPump.java | 846 ++ .../tileentities/machines/basic/MTEReplicator.java | 130 + .../machines/basic/MTERockBreaker.java | 169 + .../tileentities/machines/basic/MTEScanner.java | 425 + .../tileentities/machines/basic/MTETeleporter.java | 586 + .../machines/basic/MTETurboCharger.java | 145 + .../machines/basic/MTEWorldAccelerator.java | 470 + ...GT_MetaTileEntity_LongDistancePipelineBase.java | 415 - ...T_MetaTileEntity_LongDistancePipelineFluid.java | 125 - ...GT_MetaTileEntity_LongDistancePipelineItem.java | 214 - .../long_distance/MTELongDistancePipelineBase.java | 412 + .../MTELongDistancePipelineFluid.java | 124 + .../long_distance/MTELongDistancePipelineItem.java | 213 + .../GT_MetaTileEntity_AbstractMultiFurnace.java | 48 - .../multi/GT_MetaTileEntity_AssemblyLine.java | 495 - .../GT_MetaTileEntity_BrickedBlastFurnace.java | 155 - .../multi/GT_MetaTileEntity_Charcoal_Pit.java | 312 - .../multi/GT_MetaTileEntity_Cleanroom.java | 527 - .../GT_MetaTileEntity_ConcreteBackfiller1.java | 53 - .../GT_MetaTileEntity_ConcreteBackfiller2.java | 54 - .../GT_MetaTileEntity_ConcreteBackfillerBase.java | 265 - .../multi/GT_MetaTileEntity_DieselEngine.java | 416 - .../multi/GT_MetaTileEntity_DistillationTower.java | 369 - .../multi/GT_MetaTileEntity_DrillerBase.java | 952 -- .../GT_MetaTileEntity_ElectricBlastFurnace.java | 401 - .../GT_MetaTileEntity_ExtremeDieselEngine.java | 237 - .../multi/GT_MetaTileEntity_FusionComputer.java | 676 - .../multi/GT_MetaTileEntity_FusionComputer1.java | 103 - .../multi/GT_MetaTileEntity_FusionComputer2.java | 103 - .../multi/GT_MetaTileEntity_FusionComputer3.java | 103 - .../multi/GT_MetaTileEntity_HeatExchanger.java | 400 - .../GT_MetaTileEntity_ImplosionCompressor.java | 163 - ...eEntity_IndustrialElectromagneticSeparator.java | 467 - .../GT_MetaTileEntity_IndustrialExtractor.java | 293 - .../GT_MetaTileEntity_IndustrialLaserEngraver.java | 615 - .../GT_MetaTileEntity_IntegratedOreFactory.java | 829 -- .../multi/GT_MetaTileEntity_LargeBoiler.java | 504 - .../GT_MetaTileEntity_LargeBoiler_Bronze.java | 96 - .../multi/GT_MetaTileEntity_LargeBoiler_Steel.java | 96 - .../GT_MetaTileEntity_LargeBoiler_Titanium.java | 96 - ...T_MetaTileEntity_LargeBoiler_TungstenSteel.java | 96 - .../GT_MetaTileEntity_LargeChemicalReactor.java | 298 - .../GT_MetaTileEntity_LargeFluidExtractor.java | 419 - .../multi/GT_MetaTileEntity_LargeTurbine.java | 492 - .../multi/GT_MetaTileEntity_LargeTurbine_Gas.java | 220 - ...GT_MetaTileEntity_LargeTurbine_GasAdvanced.java | 219 - .../GT_MetaTileEntity_LargeTurbine_HPSteam.java | 232 - .../GT_MetaTileEntity_LargeTurbine_Plasma.java | 391 - .../GT_MetaTileEntity_LargeTurbine_Steam.java | 273 - .../multi/GT_MetaTileEntity_MultiAutoclave.java | 425 - .../multi/GT_MetaTileEntity_MultiCanner.java | 314 - .../multi/GT_MetaTileEntity_MultiFurnace.java | 377 - .../multi/GT_MetaTileEntity_MultiLathe.java | 377 - .../multi/GT_MetaTileEntity_NanoForge.java | 467 - .../multi/GT_MetaTileEntity_OilCracker.java | 423 - .../multi/GT_MetaTileEntity_OilDrill1.java | 53 - .../multi/GT_MetaTileEntity_OilDrill2.java | 55 - .../multi/GT_MetaTileEntity_OilDrill3.java | 55 - .../multi/GT_MetaTileEntity_OilDrill4.java | 55 - .../multi/GT_MetaTileEntity_OilDrillBase.java | 489 - .../multi/GT_MetaTileEntity_OilDrillInfinite.java | 87 - .../multi/GT_MetaTileEntity_OreDrillingPlant1.java | 60 - .../multi/GT_MetaTileEntity_OreDrillingPlant2.java | 60 - .../multi/GT_MetaTileEntity_OreDrillingPlant3.java | 60 - .../multi/GT_MetaTileEntity_OreDrillingPlant4.java | 60 - .../GT_MetaTileEntity_OreDrillingPlantBase.java | 794 -- .../multi/GT_MetaTileEntity_PCBFactory.java | 1290 -- .../multi/GT_MetaTileEntity_PlasmaForge.java | 1263 -- .../GT_MetaTileEntity_PrimitiveBlastFurnace.java | 521 - .../multi/GT_MetaTileEntity_ProcessingArray.java | 550 - .../multi/GT_MetaTileEntity_PyrolyseOven.java | 263 - .../GT_MetaTileEntity_TranscendentPlasmaMixer.java | 389 - .../multi/GT_MetaTileEntity_VacuumFreezer.java | 163 - .../multi/GT_MetaTileEntity_WormholeGenerator.java | 1119 -- .../machines/multi/MTEAbstractMultiFurnace.java | 48 + .../machines/multi/MTEAssemblyLine.java | 494 + .../machines/multi/MTEBrickedBlastFurnace.java | 154 + .../machines/multi/MTECharcoalPit.java | 311 + .../tileentities/machines/multi/MTECleanroom.java | 527 + .../machines/multi/MTEConcreteBackfiller1.java | 53 + .../machines/multi/MTEConcreteBackfiller2.java | 54 + .../machines/multi/MTEConcreteBackfillerBase.java | 264 + .../machines/multi/MTEDieselEngine.java | 415 + .../machines/multi/MTEDistillationTower.java | 360 + .../machines/multi/MTEDrillerBase.java | 951 ++ .../machines/multi/MTEElectricBlastFurnace.java | 397 + .../machines/multi/MTEExtremeDieselEngine.java | 237 + .../machines/multi/MTEFusionComputer.java | 673 + .../machines/multi/MTEFusionComputer1.java | 103 + .../machines/multi/MTEFusionComputer2.java | 103 + .../machines/multi/MTEFusionComputer3.java | 103 + .../machines/multi/MTEHeatExchanger.java | 396 + .../machines/multi/MTEImplosionCompressor.java | 162 + .../MTEIndustrialElectromagneticSeparator.java | 465 + .../machines/multi/MTEIndustrialExtractor.java | 289 + .../machines/multi/MTEIndustrialLaserEngraver.java | 605 + .../machines/multi/MTEIntegratedOreFactory.java | 827 ++ .../machines/multi/MTELargeBoiler.java | 503 + .../machines/multi/MTELargeBoilerBronze.java | 96 + .../machines/multi/MTELargeBoilerSteel.java | 96 + .../machines/multi/MTELargeBoilerTitanium.java | 96 + .../multi/MTELargeBoilerTungstenSteel.java | 96 + .../machines/multi/MTELargeChemicalReactor.java | 291 + .../machines/multi/MTELargeFluidExtractor.java | 418 + .../machines/multi/MTELargeTurbine.java | 490 + .../machines/multi/MTELargeTurbineGas.java | 220 + .../machines/multi/MTELargeTurbineGasAdvanced.java | 219 + .../machines/multi/MTELargeTurbineHPSteam.java | 232 + .../machines/multi/MTELargeTurbinePlasma.java | 389 + .../machines/multi/MTELargeTurbineSteam.java | 273 + .../machines/multi/MTEMultiAutoclave.java | 419 + .../machines/multi/MTEMultiCanner.java | 310 + .../machines/multi/MTEMultiFurnace.java | 373 + .../tileentities/machines/multi/MTEMultiLathe.java | 369 + .../tileentities/machines/multi/MTENanoForge.java | 466 + .../tileentities/machines/multi/MTEOilCracker.java | 413 + .../tileentities/machines/multi/MTEOilDrill1.java | 53 + .../tileentities/machines/multi/MTEOilDrill2.java | 55 + .../tileentities/machines/multi/MTEOilDrill3.java | 55 + .../tileentities/machines/multi/MTEOilDrill4.java | 55 + .../machines/multi/MTEOilDrillBase.java | 489 + .../machines/multi/MTEOilDrillInfinite.java | 87 + .../machines/multi/MTEOreDrillingPlant1.java | 60 + .../machines/multi/MTEOreDrillingPlant2.java | 60 + .../machines/multi/MTEOreDrillingPlant3.java | 60 + .../machines/multi/MTEOreDrillingPlant4.java | 60 + .../machines/multi/MTEOreDrillingPlantBase.java | 793 ++ .../tileentities/machines/multi/MTEPCBFactory.java | 1287 ++ .../machines/multi/MTEPlasmaForge.java | 1260 ++ .../machines/multi/MTEPrimitiveBlastFurnace.java | 521 + .../machines/multi/MTEProcessingArray.java | 549 + .../machines/multi/MTEPyrolyseOven.java | 259 + .../machines/multi/MTETranscendentPlasmaMixer.java | 387 + .../machines/multi/MTEVacuumFreezer.java | 162 + .../machines/multi/MTEWormholeGenerator.java | 1118 ++ .../GT_MetaTileEntity_BlackHoleCompressor.java | 539 - .../GT_MetaTileEntity_HIPCompressor.java | 525 - .../compressor/GT_MetaTileEntity_HeatSensor.java | 188 - .../GT_MetaTileEntity_IndustrialCompressor.java | 244 - .../GT_MetaTileEntity_NeutroniumCompressor.java | 261 - .../multi/compressor/MTEBlackHoleCompressor.java | 534 + .../multi/compressor/MTEHIPCompressor.java | 515 + .../machines/multi/compressor/MTEHeatSensor.java | 188 + .../multi/compressor/MTEIndustrialCompressor.java | 239 + .../multi/compressor/MTENeutroniumCompressor.java | 257 + .../machines/multi/drone/DroneConnection.java | 34 +- .../multi/drone/GT_MetaTileEntity_DroneCentre.java | 917 -- .../GT_MetaTileEntity_Hatch_DroneDownLink.java | 329 - .../machines/multi/drone/MTEDroneCentre.java | 913 ++ .../multi/drone/MTEHatchDroneDownLink.java | 324 + ...etaTileEntity_Hatch_DegasifierControlHatch.java | 122 - .../GT_MetaTileEntity_LensHousing.java | 52 - .../GT_MetaTileEntity_LensIndicator.java | 117 - .../GT_MetaTileEntity_PurificationPlant.java | 740 - .../GT_MetaTileEntity_PurificationUnitBase.java | 805 -- ...T_MetaTileEntity_PurificationUnitClarifier.java | 333 - ..._MetaTileEntity_PurificationUnitDegasifier.java | 832 -- ...etaTileEntity_PurificationUnitFlocculation.java | 489 - ...T_MetaTileEntity_PurificationUnitOzonation.java | 299 - ...leEntity_PurificationUnitParticleExtractor.java | 566 - ...etaTileEntity_PurificationUnitPhAdjustment.java | 611 - ...etaTileEntity_PurificationUnitPlasmaHeater.java | 566 - ...MetaTileEntity_PurificationUnitUVTreatment.java | 526 - .../purification/GT_MetaTileEntity_pHSensor.java | 192 - .../multi/purification/LinkedPurificationUnit.java | 15 +- .../purification/MTEHatchDegasifierControl.java | 121 + .../multi/purification/MTEHatchLensHousing.java | 52 + .../multi/purification/MTEHatchLensIndicator.java | 117 + .../multi/purification/MTEHatchPHSensor.java | 192 + .../multi/purification/MTEPurificationPlant.java | 739 + .../MTEPurificationUnitBaryonicPerfection.java | 565 + .../purification/MTEPurificationUnitBase.java | 805 ++ .../purification/MTEPurificationUnitClarifier.java | 332 + .../purification/MTEPurificationUnitDegasser.java | 830 ++ .../MTEPurificationUnitFlocculation.java | 488 + .../purification/MTEPurificationUnitOzonation.java | 298 + .../MTEPurificationUnitPhAdjustment.java | 608 + .../MTEPurificationUnitPlasmaHeater.java | 565 + .../MTEPurificationUnitUVTreatment.java | 521 + .../multi/purification/PurifiedWaterHelpers.java | 4 +- .../machines/multiblock/AdvChemicalProcessor.java | 38 +- .../tileentities/machines/multiblock/CokeOven.java | 14 +- .../machines/multiblock/DistillationTower.java | 22 +- .../machines/multiblock/LaserEngraver.java | 24 +- .../machines/multiblock/LayeredCokeBattery.java | 14 +- .../machines/multiblock/Macerator.java | 6 +- .../multiblock/logic/CokeOvenProcessingLogic.java | 16 +- .../GT_MetaTileEntity_AlloySmelter_Bronze.java | 139 - .../GT_MetaTileEntity_AlloySmelter_Steel.java | 139 - .../steam/GT_MetaTileEntity_Compressor_Bronze.java | 134 - .../steam/GT_MetaTileEntity_Compressor_Steel.java | 134 - .../steam/GT_MetaTileEntity_Extractor_Bronze.java | 134 - .../steam/GT_MetaTileEntity_Extractor_Steel.java | 134 - .../GT_MetaTileEntity_ForgeHammer_Bronze.java | 202 - .../steam/GT_MetaTileEntity_ForgeHammer_Steel.java | 202 - .../steam/GT_MetaTileEntity_Furnace_Bronze.java | 161 - .../steam/GT_MetaTileEntity_Furnace_Steel.java | 159 - .../steam/GT_MetaTileEntity_Macerator_Bronze.java | 189 - .../steam/GT_MetaTileEntity_Macerator_Steel.java | 188 - .../machines/steam/MTESteamAlloySmelterBronze.java | 139 + .../machines/steam/MTESteamAlloySmelterSteel.java | 139 + .../machines/steam/MTESteamCompressorBronze.java | 134 + .../machines/steam/MTESteamCompressorSteel.java | 134 + .../machines/steam/MTESteamExtractorBronze.java | 134 + .../machines/steam/MTESteamExtractorSteel.java | 134 + .../machines/steam/MTESteamForgeHammerBronze.java | 202 + .../machines/steam/MTESteamForgeHammerSteel.java | 202 + .../machines/steam/MTESteamFurnaceBronze.java | 161 + .../machines/steam/MTESteamFurnaceSteel.java | 159 + .../machines/steam/MTESteamMaceratorBronze.java | 189 + .../machines/steam/MTESteamMaceratorSteel.java | 188 + .../common/tileentities/render/TileDrone.java | 24 - .../tileentities/render/TileEntityDrone.java | 24 + .../tileentities/render/TileEntityLaser.java | 116 + .../tileentities/render/TileEntityWormhole.java | 87 + .../common/tileentities/render/TileLaser.java | 116 - .../common/tileentities/render/TileWormhole.java | 87 - .../GT_MetaTileEntity_DigitalChestBase.java | 559 - .../storage/GT_MetaTileEntity_DigitalTankBase.java | 694 - .../storage/GT_MetaTileEntity_Locker.java | 283 - .../storage/GT_MetaTileEntity_QuantumChest.java | 102 - .../storage/GT_MetaTileEntity_QuantumTank.java | 55 - .../storage/GT_MetaTileEntity_SuperChest.java | 30 - .../storage/GT_MetaTileEntity_SuperTank.java | 54 - .../tileentities/storage/MTEDigitalChestBase.java | 556 + .../tileentities/storage/MTEDigitalTankBase.java | 693 + .../common/tileentities/storage/MTELocker.java | 284 + .../tileentities/storage/MTEQuantumChest.java | 102 + .../tileentities/storage/MTEQuantumTank.java | 55 + .../common/tileentities/storage/MTESuperChest.java | 30 + .../common/tileentities/storage/MTESuperTank.java | 54 + src/main/java/gregtech/common/tools/GTTool.java | 196 + src/main/java/gregtech/common/tools/GT_Tool.java | 196 - .../java/gregtech/common/tools/GT_Tool_Axe.java | 175 - .../common/tools/GT_Tool_BranchCutter.java | 101 - .../common/tools/GT_Tool_ButcheryKnife.java | 104 - .../gregtech/common/tools/GT_Tool_BuzzSaw.java | 81 - .../gregtech/common/tools/GT_Tool_Chainsaw_HV.java | 57 - .../gregtech/common/tools/GT_Tool_Chainsaw_LV.java | 185 - .../gregtech/common/tools/GT_Tool_Chainsaw_MV.java | 57 - .../gregtech/common/tools/GT_Tool_Crowbar.java | 139 - .../gregtech/common/tools/GT_Tool_Drill_HV.java | 68 - .../gregtech/common/tools/GT_Tool_Drill_LV.java | 152 - .../gregtech/common/tools/GT_Tool_Drill_MV.java | 57 - .../java/gregtech/common/tools/GT_Tool_File.java | 124 - .../gregtech/common/tools/GT_Tool_HardHammer.java | 203 - .../java/gregtech/common/tools/GT_Tool_Hoe.java | 132 - .../gregtech/common/tools/GT_Tool_JackHammer.java | 128 - .../java/gregtech/common/tools/GT_Tool_Knife.java | 76 - .../java/gregtech/common/tools/GT_Tool_Mortar.java | 120 - .../gregtech/common/tools/GT_Tool_Pickaxe.java | 139 - .../java/gregtech/common/tools/GT_Tool_Plow.java | 110 - .../gregtech/common/tools/GT_Tool_Plunger.java | 92 - .../gregtech/common/tools/GT_Tool_RollingPin.java | 70 - .../java/gregtech/common/tools/GT_Tool_Saw.java | 149 - .../java/gregtech/common/tools/GT_Tool_Scoop.java | 130 - .../gregtech/common/tools/GT_Tool_Screwdriver.java | 160 - .../common/tools/GT_Tool_Screwdriver_LV.java | 34 - .../java/gregtech/common/tools/GT_Tool_Sense.java | 114 - .../java/gregtech/common/tools/GT_Tool_Shovel.java | 127 - .../gregtech/common/tools/GT_Tool_SoftHammer.java | 139 - .../common/tools/GT_Tool_Soldering_Iron.java | 153 - .../java/gregtech/common/tools/GT_Tool_Sword.java | 128 - .../gregtech/common/tools/GT_Tool_Turbine.java | 58 - .../common/tools/GT_Tool_Turbine_Huge.java | 27 - .../common/tools/GT_Tool_Turbine_Large.java | 27 - .../common/tools/GT_Tool_Turbine_Normal.java | 27 - .../common/tools/GT_Tool_Turbine_Small.java | 27 - .../common/tools/GT_Tool_UniversalSpade.java | 160 - .../gregtech/common/tools/GT_Tool_WireCutter.java | 117 - .../java/gregtech/common/tools/GT_Tool_Wrench.java | 279 - .../gregtech/common/tools/GT_Tool_Wrench_HV.java | 69 - .../gregtech/common/tools/GT_Tool_Wrench_LV.java | 77 - .../gregtech/common/tools/GT_Tool_Wrench_MV.java | 69 - src/main/java/gregtech/common/tools/ToolAxe.java | 175 + .../gregtech/common/tools/ToolBranchCutter.java | 101 + .../gregtech/common/tools/ToolButcheryKnife.java | 104 + .../java/gregtech/common/tools/ToolBuzzSaw.java | 81 + .../java/gregtech/common/tools/ToolChainsawHV.java | 58 + .../java/gregtech/common/tools/ToolChainsawLV.java | 185 + .../java/gregtech/common/tools/ToolChainsawMV.java | 58 + .../java/gregtech/common/tools/ToolCrowbar.java | 139 + .../java/gregtech/common/tools/ToolDrillHV.java | 69 + .../java/gregtech/common/tools/ToolDrillLV.java | 152 + .../java/gregtech/common/tools/ToolDrillMV.java | 58 + src/main/java/gregtech/common/tools/ToolFile.java | 124 + .../java/gregtech/common/tools/ToolHardHammer.java | 203 + src/main/java/gregtech/common/tools/ToolHoe.java | 132 + .../java/gregtech/common/tools/ToolJackHammer.java | 128 + src/main/java/gregtech/common/tools/ToolKnife.java | 76 + .../java/gregtech/common/tools/ToolMortar.java | 120 + .../java/gregtech/common/tools/ToolPickaxe.java | 139 + src/main/java/gregtech/common/tools/ToolPlow.java | 110 + .../java/gregtech/common/tools/ToolPlunger.java | 92 + .../java/gregtech/common/tools/ToolRollingPin.java | 70 + src/main/java/gregtech/common/tools/ToolSaw.java | 149 + src/main/java/gregtech/common/tools/ToolScoop.java | 130 + .../gregtech/common/tools/ToolScrewdriver.java | 160 + .../gregtech/common/tools/ToolScrewdriverLV.java | 34 + src/main/java/gregtech/common/tools/ToolSense.java | 114 + .../java/gregtech/common/tools/ToolShovel.java | 127 + .../java/gregtech/common/tools/ToolSoftHammer.java | 139 + .../gregtech/common/tools/ToolSolderingIron.java | 153 + src/main/java/gregtech/common/tools/ToolSword.java | 128 + .../java/gregtech/common/tools/ToolTurbine.java | 58 + .../gregtech/common/tools/ToolTurbineHuge.java | 27 + .../gregtech/common/tools/ToolTurbineLarge.java | 27 + .../gregtech/common/tools/ToolTurbineNormal.java | 27 + .../gregtech/common/tools/ToolTurbineSmall.java | 27 + .../gregtech/common/tools/ToolUniversalSpade.java | 160 + .../java/gregtech/common/tools/ToolWireCutter.java | 117 + .../java/gregtech/common/tools/ToolWrench.java | 279 + .../java/gregtech/common/tools/ToolWrenchHV.java | 69 + .../java/gregtech/common/tools/ToolWrenchLV.java | 77 + .../java/gregtech/common/tools/ToolWrenchMV.java | 69 + .../tools/pocket/GT_Tool_Pocket_BranchCutter.java | 39 - .../common/tools/pocket/GT_Tool_Pocket_File.java | 39 - .../common/tools/pocket/GT_Tool_Pocket_Knife.java | 39 - .../tools/pocket/GT_Tool_Pocket_Multitool.java | 50 - .../common/tools/pocket/GT_Tool_Pocket_Saw.java | 39 - .../tools/pocket/GT_Tool_Pocket_Screwdriver.java | 39 - .../tools/pocket/GT_Tool_Pocket_WireCutter.java | 39 - .../tools/pocket/ToolPocketBranchCutter.java | 39 + .../common/tools/pocket/ToolPocketFile.java | 39 + .../common/tools/pocket/ToolPocketKnife.java | 39 + .../common/tools/pocket/ToolPocketMultitool.java | 50 + .../common/tools/pocket/ToolPocketSaw.java | 39 + .../common/tools/pocket/ToolPocketScrewdriver.java | 39 + .../common/tools/pocket/ToolPocketWireCutter.java | 39 + .../crossmod/holoinventory/GTInventoryDecoder.java | 38 + .../holoinventory/GT_InventoryDecoder.java | 38 - .../crossmod/holoinventory/HoloInventory.java | 2 +- .../GT_VisualProspecting_Database.java | 25 - .../VisualProspectingDatabase.java | 25 + .../gregtech/loaders/load/CoverBehaviorLoader.java | 11 + .../java/gregtech/loaders/load/FuelLoader.java | 146 + .../java/gregtech/loaders/load/GTItemIterator.java | 306 + .../loaders/load/GT_CoverBehaviorLoader.java | 11 - .../java/gregtech/loaders/load/GT_FuelLoader.java | 146 - .../gregtech/loaders/load/GT_ItemIterator.java | 305 - .../load/GT_Loader_MetaTileEntities_Recipes.java | 4675 ------- .../gregtech/loaders/load/GT_SonictronLoader.java | 159 - .../gregtech/loaders/load/MTERecipeLoader.java | 4386 ++++++ .../gregtech/loaders/load/SonictronLoader.java | 159 + .../materialprocessing/ProcessingConfig.java | 6 +- .../gregtech/loaders/materials/MaterialsInit1.java | 536 +- .../java/gregtech/loaders/misc/CoverLoader.java | 42 + .../java/gregtech/loaders/misc/GTAchievements.java | 814 ++ .../gregtech/loaders/misc/GTBeeDefinition.java | 2818 ++++ src/main/java/gregtech/loaders/misc/GTBees.java | 231 + .../gregtech/loaders/misc/GTBranchDefinition.java | 207 + .../gregtech/loaders/misc/GT_Achievements.java | 822 -- .../gregtech/loaders/misc/GT_BeeDefinition.java | 2831 ---- src/main/java/gregtech/loaders/misc/GT_Bees.java | 231 - .../gregtech/loaders/misc/GT_BranchDefinition.java | 207 - .../java/gregtech/loaders/misc/GT_CoverLoader.java | 42 - .../gregtech/loaders/misc/bees/GTAlleleEffect.java | 57 + .../loaders/misc/bees/GTEffectMachineBoost.java | 61 + .../loaders/misc/bees/GTEffectTreeTwister.java | 87 + .../java/gregtech/loaders/misc/bees/GTFlowers.java | 135 + .../loaders/misc/bees/GT_AlleleEffect.java | 57 - .../loaders/misc/bees/GT_EffectMachineBoost.java | 61 - .../loaders/misc/bees/GT_EffectTreeTwister.java | 87 - .../gregtech/loaders/misc/bees/GT_Flowers.java | 135 - .../loaders/oreprocessing/ProcessingBeans.java | 14 +- .../loaders/oreprocessing/ProcessingBlock.java | 88 +- .../loaders/oreprocessing/ProcessingBolt.java | 12 +- .../loaders/oreprocessing/ProcessingCell.java | 244 +- .../loaders/oreprocessing/ProcessingCircuit.java | 12 +- .../oreprocessing/ProcessingCompressed.java | 8 +- .../loaders/oreprocessing/ProcessingCrafting.java | 264 +- .../loaders/oreprocessing/ProcessingCrop.java | 47 +- .../oreprocessing/ProcessingCrushedOre.java | 68 +- .../oreprocessing/ProcessingCrystallized.java | 24 +- .../loaders/oreprocessing/ProcessingDirty.java | 96 +- .../loaders/oreprocessing/ProcessingDust.java | 380 +- .../loaders/oreprocessing/ProcessingDye.java | 40 +- .../loaders/oreprocessing/ProcessingFineWire.java | 16 +- .../loaders/oreprocessing/ProcessingFoil.java | 20 +- .../loaders/oreprocessing/ProcessingFood.java | 46 +- .../loaders/oreprocessing/ProcessingGear.java | 62 +- .../loaders/oreprocessing/ProcessingGem.java | 428 +- .../loaders/oreprocessing/ProcessingIngot.java | 184 +- .../loaders/oreprocessing/ProcessingItem.java | 24 +- .../loaders/oreprocessing/ProcessingLens.java | 65 +- .../loaders/oreprocessing/ProcessingLog.java | 262 +- .../loaders/oreprocessing/ProcessingNugget.java | 54 +- .../loaders/oreprocessing/ProcessingOre.java | 130 +- .../loaders/oreprocessing/ProcessingOrePoor.java | 34 +- .../oreprocessing/ProcessingOreSmelting.java | 68 +- .../loaders/oreprocessing/ProcessingPipe.java | 84 +- .../loaders/oreprocessing/ProcessingPlank.java | 104 +- .../loaders/oreprocessing/ProcessingPlate.java | 324 +- .../loaders/oreprocessing/ProcessingPure.java | 26 +- .../loaders/oreprocessing/ProcessingRawOre.java | 126 +- .../loaders/oreprocessing/ProcessingRecycling.java | 24 +- .../loaders/oreprocessing/ProcessingRotor.java | 56 +- .../loaders/oreprocessing/ProcessingRound.java | 34 +- .../loaders/oreprocessing/ProcessingSand.java | 14 +- .../loaders/oreprocessing/ProcessingSaplings.java | 28 +- .../loaders/oreprocessing/ProcessingScrew.java | 28 +- .../loaders/oreprocessing/ProcessingShaping.java | 436 +- .../loaders/oreprocessing/ProcessingSlab.java | 10 +- .../loaders/oreprocessing/ProcessingStick.java | 88 +- .../loaders/oreprocessing/ProcessingStickLong.java | 70 +- .../loaders/oreprocessing/ProcessingStone.java | 240 +- .../oreprocessing/ProcessingStoneCobble.java | 10 +- .../loaders/oreprocessing/ProcessingToolHead.java | 962 +- .../loaders/oreprocessing/ProcessingToolOther.java | 108 +- .../oreprocessing/ProcessingTransforming.java | 116 +- .../loaders/oreprocessing/ProcessingWax.java | 16 +- .../loaders/oreprocessing/ProcessingWire.java | 282 +- .../loaders/postload/BlockResistanceLoader.java | 43 + .../loaders/postload/BookAndLootLoader.java | 337 + .../loaders/postload/CraftingRecipeLoader.java | 2011 +++ .../java/gregtech/loaders/postload/CropLoader.java | 1055 ++ .../loaders/postload/FakeRecipeLoader.java | 23 + .../java/gregtech/loaders/postload/GTPostLoad.java | 537 + .../loaders/postload/GTWorldgenloader.java | 33 + .../loaders/postload/GT_BlockResistanceLoader.java | 43 - .../loaders/postload/GT_BookAndLootLoader.java | 369 - .../loaders/postload/GT_CraftingRecipeLoader.java | 2013 --- .../gregtech/loaders/postload/GT_CropLoader.java | 1055 -- .../loaders/postload/GT_FakeRecipeLoader.java | 23 - .../postload/GT_ItemMaxStacksizeLoader.java | 138 - .../loaders/postload/GT_MachineRecipeLoader.java | 126 - .../loaders/postload/GT_MachineTooltipsLoader.java | 36 - .../loaders/postload/GT_MinableRegistrator.java | 16 - .../postload/GT_PCBFactoryMaterialLoader.java | 19 - .../gregtech/loaders/postload/GT_PostLoad.java | 542 - .../postload/GT_ProcessingArrayRecipeLoader.java | 168 - .../postload/GT_RecyclerBlacklistLoader.java | 107 - .../loaders/postload/GT_ScrapboxDropLoader.java | 100 - .../loaders/postload/GT_Worldgenloader.java | 33 - .../loaders/postload/ItemMaxStacksizeLoader.java | 138 + .../loaders/postload/MachineRecipeLoader.java | 126 + .../loaders/postload/MachineTooltipsLoader.java | 36 + .../loaders/postload/MinableRegistrator.java | 16 + .../loaders/postload/PCBFactoryMaterialLoader.java | 19 + .../gregtech/loaders/postload/PartP2PGTPower.java | 6 +- .../loaders/postload/PosteaTransformers.java | 16 +- .../postload/ProcessingArrayRecipeLoader.java | 156 + .../loaders/postload/RecyclerBlacklistLoader.java | 107 + .../loaders/postload/ScrapboxDropLoader.java | 100 + .../postload/chains/BauxiteRefineChain.java | 297 + .../postload/chains/GT_BauxiteRefineChain.java | 297 - .../loaders/postload/chains/GT_NaniteChain.java | 267 - .../postload/chains/GT_PCBFactoryRecipes.java | 694 - .../postload/chains/GT_PurifiedWaterRecipes.java | 324 - .../loaders/postload/chains/NaniteChain.java | 266 + .../loaders/postload/chains/PCBFactoryRecipes.java | 687 + .../postload/chains/PurifiedWaterRecipes.java | 320 + .../postload/recipes/AlloySmelterRecipes.java | 36 +- .../postload/recipes/ArcFurnaceRecipes.java | 292 +- .../loaders/postload/recipes/AssemblerRecipes.java | 4362 +++--- .../postload/recipes/AssemblyLineRecipes.java | 441 +- .../loaders/postload/recipes/AutoclaveRecipes.java | 118 +- .../loaders/postload/recipes/BenderRecipes.java | 228 +- .../postload/recipes/BlastFurnaceRecipes.java | 235 +- .../loaders/postload/recipes/BreweryRecipes.java | 208 +- .../loaders/postload/recipes/CannerRecipes.java | 118 +- .../postload/recipes/CentrifugeRecipes.java | 452 +- .../postload/recipes/ChemicalBathRecipes.java | 205 +- .../loaders/postload/recipes/ChemicalRecipes.java | 2659 ++-- .../postload/recipes/CircuitAssemblerRecipes.java | 198 +- .../postload/recipes/CompressorRecipes.java | 129 +- .../postload/recipes/CropProcessingRecipes.java | 28 +- .../loaders/postload/recipes/CuttingRecipes.java | 48 +- .../postload/recipes/DistilleryRecipes.java | 378 +- .../postload/recipes/ElectrolyzerRecipes.java | 194 +- .../recipes/ElectromagneticSeparatorRecipes.java | 8 +- .../loaders/postload/recipes/ExtractorRecipes.java | 72 +- .../loaders/postload/recipes/ExtruderRecipes.java | 10 +- .../loaders/postload/recipes/FermenterRecipes.java | 86 +- .../postload/recipes/FluidCannerRecipes.java | 22 +- .../postload/recipes/FluidExtractorRecipes.java | 188 +- .../postload/recipes/FluidHeaterRecipes.java | 46 +- .../postload/recipes/FluidSolidifierRecipes.java | 170 +- .../postload/recipes/ForgeHammerRecipes.java | 60 +- .../postload/recipes/FormingPressRecipes.java | 76 +- .../loaders/postload/recipes/FuelRecipes.java | 82 +- .../postload/recipes/FusionReactorRecipes.java | 82 +- .../recipes/ImplosionCompressorRecipes.java | 42 +- .../postload/recipes/LaserEngraverRecipes.java | 16 +- .../loaders/postload/recipes/LatheRecipes.java | 22 +- .../postload/recipes/MatterAmplifierRecipes.java | 8 +- .../loaders/postload/recipes/MixerRecipes.java | 1077 +- .../loaders/postload/recipes/NEIHiding.java | 4 +- .../postload/recipes/OreDictUnification.java | 6 +- .../loaders/postload/recipes/PackagerRecipes.java | 28 +- .../postload/recipes/PlasmaForgeRecipes.java | 26 +- .../loaders/postload/recipes/PrinterRecipes.java | 24 +- .../loaders/postload/recipes/Pulverizer.java | 340 +- .../loaders/postload/recipes/PyrolyseRecipes.java | 70 +- .../loaders/postload/recipes/RecipeRemover.java | 118 +- .../loaders/postload/recipes/SifterRecipes.java | 18 +- .../loaders/postload/recipes/SlicerRecipes.java | 14 +- .../loaders/postload/recipes/SmelterRecipes.java | 64 +- .../postload/recipes/ThaumcraftRecipes.java | 908 +- .../postload/recipes/ThermalCentrifugeRecipes.java | 58 +- .../recipes/TranscendentPlasmaMixerRecipes.java | 38 +- .../postload/recipes/VacuumFreezerRecipes.java | 250 +- .../loaders/postload/recipes/WiremillRecipes.java | 20 +- .../java/gregtech/loaders/preload/GTPreLoad.java | 654 + .../preload/GT_Loader_CircuitBehaviors.java | 31 - .../loaders/preload/GT_Loader_ItemData.java | 393 - .../preload/GT_Loader_Item_Block_And_Fluid.java | 2127 --- .../preload/GT_Loader_MetaTileEntities.java | 13703 ------------------- .../preload/GT_Loader_MultiTileEntities.java | 4 +- .../loaders/preload/GT_Loader_OreDictionary.java | 458 - .../loaders/preload/GT_Loader_OreProcessing.java | 111 - .../java/gregtech/loaders/preload/GT_PreLoad.java | 654 - .../loaders/preload/LoaderCircuitBehaviors.java | 31 + .../loaders/preload/LoaderGTBlockFluid.java | 2121 +++ .../gregtech/loaders/preload/LoaderGTItemData.java | 384 + .../loaders/preload/LoaderGTOreDictionary.java | 456 + .../loaders/preload/LoaderMetaTileEntities.java | 13128 ++++++++++++++++++ .../loaders/preload/LoaderOreProcessing.java | 111 + src/main/java/gregtech/mixin/Mixin.java | 3 +- src/main/java/gregtech/nei/GTNEIConfig.java | 183 + .../java/gregtech/nei/GTNEIDefaultHandler.java | 801 ++ .../java/gregtech/nei/GT_NEI_DefaultHandler.java | 801 -- src/main/java/gregtech/nei/NEI_GT_Config.java | 183 - src/main/java/gregtech/nei/RecipeDisplayInfo.java | 14 +- .../nei/dumper/BatchModeSupportDumper.java | 4 +- .../nei/dumper/InputSeparationSupportDumper.java | 4 +- .../java/gregtech/nei/dumper/MaterialDumper.java | 4 +- .../java/gregtech/nei/dumper/MetaItemDumper.java | 6 +- .../gregtech/nei/dumper/MetaTileEntityDumper.java | 6 +- .../nei/dumper/MultiBlockFeatureSupportDumper.java | 14 +- .../nei/dumper/RecipeLockingSupportDumper.java | 4 +- .../nei/dumper/VoidProtectionSupportDumper.java | 4 +- .../formatter/DefaultSpecialValueFormatter.java | 10 +- .../nei/formatter/FuelSpecialValueFormatter.java | 4 +- .../nei/formatter/FusionSpecialValueFormatter.java | 14 +- .../HeatingCoilSpecialValueFormatter.java | 4 +- .../nei/formatter/INEISpecialInfoFormatter.java | 3 +- .../nei/formatter/SimpleSpecialValueFormatter.java | 4 +- 1574 files changed, 199497 insertions(+), 200929 deletions(-) create mode 100644 src/main/java/gregtech/GTMod.java delete mode 100644 src/main/java/gregtech/GT_Mod.java create mode 100644 src/main/java/gregtech/api/GregTechAPI.java delete mode 100644 src/main/java/gregtech/api/GregTech_API.java create mode 100644 src/main/java/gregtech/api/damagesources/GTDamageSources.java delete mode 100644 src/main/java/gregtech/api/damagesources/GT_DamageSources.java create mode 100644 src/main/java/gregtech/api/enchants/EnchantmentEnderDamage.java create mode 100644 src/main/java/gregtech/api/enchants/EnchantmentHazmat.java create mode 100644 src/main/java/gregtech/api/enchants/EnchantmentRadioactivity.java delete mode 100644 src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java delete mode 100644 src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java delete mode 100644 src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java delete mode 100644 src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java create mode 100644 src/main/java/gregtech/api/enums/GTValues.java delete mode 100644 src/main/java/gregtech/api/enums/GTVoltageIndex.java delete mode 100644 src/main/java/gregtech/api/enums/GT_HatchElement.java delete mode 100644 src/main/java/gregtech/api/enums/GT_Values.java create mode 100644 src/main/java/gregtech/api/enums/HatchElement.java create mode 100644 src/main/java/gregtech/api/enums/MaterialsGTNH.java create mode 100644 src/main/java/gregtech/api/enums/TCAspects.java delete mode 100644 src/main/java/gregtech/api/enums/TC_Aspects.java create mode 100644 src/main/java/gregtech/api/enums/VoltageIndex.java delete mode 100644 src/main/java/gregtech/api/fluid/FluidTankGT.java create mode 100644 src/main/java/gregtech/api/fluid/GTFluidFactory.java create mode 100644 src/main/java/gregtech/api/fluid/GTFluidTank.java delete mode 100644 src/main/java/gregtech/api/fluid/GT_FluidFactory.java delete mode 100644 src/main/java/gregtech/api/gui/GT_GUIColorOverride.java create mode 100644 src/main/java/gregtech/api/gui/GUIColorOverride.java create mode 100644 src/main/java/gregtech/api/gui/modularui/CoverUIBuildContext.java create mode 100644 src/main/java/gregtech/api/gui/modularui/GTUIInfos.java create mode 100644 src/main/java/gregtech/api/gui/modularui/GTUITextures.java delete mode 100644 src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java delete mode 100644 src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java delete mode 100644 src/main/java/gregtech/api/gui/modularui/GT_UITextures.java create mode 100644 src/main/java/gregtech/api/gui/widgets/CoverTickRateButton.java delete mode 100644 src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java delete mode 100644 src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java delete mode 100644 src/main/java/gregtech/api/gui/widgets/GT_PhantomItemButton.java create mode 100644 src/main/java/gregtech/api/gui/widgets/LockedWhileActiveButton.java create mode 100644 src/main/java/gregtech/api/gui/widgets/PhantomItemButton.java create mode 100644 src/main/java/gregtech/api/interfaces/fluid/IGTFluid.java create mode 100644 src/main/java/gregtech/api/interfaces/fluid/IGTFluidBuilder.java create mode 100644 src/main/java/gregtech/api/interfaces/fluid/IGTRegisteredFluid.java delete mode 100644 src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java delete mode 100644 src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java delete mode 100644 src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java create mode 100644 src/main/java/gregtech/api/interfaces/internal/IGTCraftingRecipe.java create mode 100644 src/main/java/gregtech/api/interfaces/internal/IGTMod.java create mode 100644 src/main/java/gregtech/api/interfaces/internal/IGTRecipeAdder.java delete mode 100644 src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java delete mode 100644 src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java delete mode 100644 src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java delete mode 100644 src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java create mode 100644 src/main/java/gregtech/api/interfaces/modularui/IControllerWithOptionalFeatures.java create mode 100644 src/main/java/gregtech/api/items/BlockLongDistancePipe.java create mode 100644 src/main/java/gregtech/api/items/GTGenericBlock.java create mode 100644 src/main/java/gregtech/api/items/GTGenericItem.java delete mode 100644 src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java delete mode 100644 src/main/java/gregtech/api/items/GT_BreederCell_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_CoolantCell_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_Generic_Block.java delete mode 100644 src/main/java/gregtech/api/items/GT_Generic_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_MetaBase_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java delete mode 100644 src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java delete mode 100644 src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java delete mode 100644 src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java delete mode 100644 src/main/java/gregtech/api/items/GT_Tool_Item.java create mode 100644 src/main/java/gregtech/api/items/ItemBreederCell.java create mode 100644 src/main/java/gregtech/api/items/ItemCoolantCell.java create mode 100644 src/main/java/gregtech/api/items/ItemCoolantCellIC.java create mode 100644 src/main/java/gregtech/api/items/ItemEnergyArmor.java create mode 100644 src/main/java/gregtech/api/items/ItemRadioactiveCell.java create mode 100644 src/main/java/gregtech/api/items/ItemRadioactiveCellIC.java create mode 100644 src/main/java/gregtech/api/items/ItemTool.java create mode 100644 src/main/java/gregtech/api/items/MetaBaseItem.java create mode 100644 src/main/java/gregtech/api/items/MetaGeneratedItem.java create mode 100644 src/main/java/gregtech/api/items/MetaGeneratedItemX01.java create mode 100644 src/main/java/gregtech/api/items/MetaGeneratedItemX32.java create mode 100644 src/main/java/gregtech/api/items/MetaGeneratedTool.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MagHatch.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_WetTransformer.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java delete mode 100644 src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicBatteryBuffer.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicGenerator.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHull.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHullNonElectric.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineBronze.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineSteel.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineWithRecipe.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBasicTank.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEBuffer.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTECable.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTECubicMultiBlockBase.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEEnhancedMultiBlockBase.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEFilterBase.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEFrame.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatch.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDataAccess.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDynamo.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchEnergy.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInput.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInputBus.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMagnet.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMaintenance.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMultiInput.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutput.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutputBus.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEHatchQuadrupleHumongous.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEItem.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTESpecialFilter.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTETieredMachineBlock.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTETooltipMultiBlockBase.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTETransformer.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEWetTransformer.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEWirelessDynamo.java create mode 100644 src/main/java/gregtech/api/metatileentity/implementations/MTEWirelessEnergy.java create mode 100644 src/main/java/gregtech/api/net/GTPacket.java create mode 100644 src/main/java/gregtech/api/net/GTPacketBlockEvent.java create mode 100644 src/main/java/gregtech/api/net/GTPacketClientPreference.java create mode 100644 src/main/java/gregtech/api/net/GTPacketMultiTileEntity.java create mode 100644 src/main/java/gregtech/api/net/GTPacketMusicSystemData.java create mode 100644 src/main/java/gregtech/api/net/GTPacketNew.java create mode 100644 src/main/java/gregtech/api/net/GTPacketPollution.java create mode 100644 src/main/java/gregtech/api/net/GTPacketRequestCoverData.java create mode 100644 src/main/java/gregtech/api/net/GTPacketSendCoverData.java create mode 100644 src/main/java/gregtech/api/net/GTPacketSendOregenPattern.java create mode 100644 src/main/java/gregtech/api/net/GTPacketSetConfigurationCircuit.java create mode 100644 src/main/java/gregtech/api/net/GTPacketSound.java create mode 100644 src/main/java/gregtech/api/net/GTPacketTileEntity.java create mode 100644 src/main/java/gregtech/api/net/GTPacketToolSwitchMode.java create mode 100644 src/main/java/gregtech/api/net/GTPacketTypes.java create mode 100644 src/main/java/gregtech/api/net/GTPacketUpdateItem.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet.java delete mode 100644 src/main/java/gregtech/api/net/GT_PacketTypes.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_Block_Event.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_MusicSystemData.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_New.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_Pollution.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_Sound.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_TileEntity.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_ToolSwitchMode.java delete mode 100644 src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java create mode 100644 src/main/java/gregtech/api/objects/GTArrayList.java create mode 100644 src/main/java/gregtech/api/objects/GTChunkManager.java create mode 100644 src/main/java/gregtech/api/objects/GTCopiedBlockTexture.java create mode 100644 src/main/java/gregtech/api/objects/GTCoverDefault.java create mode 100644 src/main/java/gregtech/api/objects/GTCoverNone.java create mode 100644 src/main/java/gregtech/api/objects/GTFluid.java create mode 100644 src/main/java/gregtech/api/objects/GTHashSet.java create mode 100644 src/main/java/gregtech/api/objects/GTItemStack.java create mode 100644 src/main/java/gregtech/api/objects/GTItemStack2.java create mode 100644 src/main/java/gregtech/api/objects/GTMultiTexture.java create mode 100644 src/main/java/gregtech/api/objects/GTRenderedTexture.java create mode 100644 src/main/java/gregtech/api/objects/GTSidedTexture.java create mode 100644 src/main/java/gregtech/api/objects/GTStdRenderedTexture.java create mode 100644 src/main/java/gregtech/api/objects/GTUODimension.java create mode 100644 src/main/java/gregtech/api/objects/GTUODimensionList.java create mode 100644 src/main/java/gregtech/api/objects/GTUOFluid.java delete mode 100644 src/main/java/gregtech/api/objects/GT_ArrayList.java delete mode 100644 src/main/java/gregtech/api/objects/GT_ChunkManager.java delete mode 100644 src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java delete mode 100644 src/main/java/gregtech/api/objects/GT_Cover_Default.java delete mode 100644 src/main/java/gregtech/api/objects/GT_Cover_None.java delete mode 100644 src/main/java/gregtech/api/objects/GT_Fluid.java delete mode 100644 src/main/java/gregtech/api/objects/GT_HashSet.java delete mode 100644 src/main/java/gregtech/api/objects/GT_ItemStack.java delete mode 100644 src/main/java/gregtech/api/objects/GT_ItemStack2.java delete mode 100644 src/main/java/gregtech/api/objects/GT_MultiTexture.java delete mode 100644 src/main/java/gregtech/api/objects/GT_RenderedTexture.java delete mode 100644 src/main/java/gregtech/api/objects/GT_SidedTexture.java delete mode 100644 src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java delete mode 100644 src/main/java/gregtech/api/objects/GT_UO_Dimension.java delete mode 100644 src/main/java/gregtech/api/objects/GT_UO_DimensionList.java delete mode 100644 src/main/java/gregtech/api/objects/GT_UO_Fluid.java delete mode 100644 src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java delete mode 100644 src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java delete mode 100644 src/main/java/gregtech/api/threads/GT_Runnable_Sound.java create mode 100644 src/main/java/gregtech/api/threads/RunnableCableUpdate.java create mode 100644 src/main/java/gregtech/api/threads/RunnableMachineUpdate.java create mode 100644 src/main/java/gregtech/api/threads/RunnableSound.java create mode 100644 src/main/java/gregtech/api/util/AssemblyLineServer.java create mode 100644 src/main/java/gregtech/api/util/AssemblyLineUtils.java create mode 100644 src/main/java/gregtech/api/util/CircuitryBehavior.java create mode 100644 src/main/java/gregtech/api/util/CoverBehavior.java create mode 100644 src/main/java/gregtech/api/util/CoverBehaviorBase.java create mode 100644 src/main/java/gregtech/api/util/ExoticEnergyInputHelper.java create mode 100644 src/main/java/gregtech/api/util/GTApiaryModifier.java create mode 100644 src/main/java/gregtech/api/util/GTApiaryUpgrade.java create mode 100644 src/main/java/gregtech/api/util/GTBaseCrop.java create mode 100644 src/main/java/gregtech/api/util/GTBlockMap.java create mode 100644 src/main/java/gregtech/api/util/GTBlockSet.java create mode 100644 src/main/java/gregtech/api/util/GTCLSCompat.java create mode 100644 src/main/java/gregtech/api/util/GTChunkAssociatedData.java create mode 100644 src/main/java/gregtech/api/util/GTClientPreference.java create mode 100644 src/main/java/gregtech/api/util/GTConfig.java create mode 100644 src/main/java/gregtech/api/util/GTCreativeTab.java create mode 100644 src/main/java/gregtech/api/util/GTFoodStat.java create mode 100644 src/main/java/gregtech/api/util/GTForestryCompat.java create mode 100644 src/main/java/gregtech/api/util/GTGCCompat.java create mode 100644 src/main/java/gregtech/api/util/GTIBoxableWrapper.java create mode 100644 src/main/java/gregtech/api/util/GTItsNotMyFaultException.java create mode 100644 src/main/java/gregtech/api/util/GTLanguageManager.java create mode 100644 src/main/java/gregtech/api/util/GTLog.java create mode 100644 src/main/java/gregtech/api/util/GTModHandler.java create mode 100644 src/main/java/gregtech/api/util/GTMusicSystem.java create mode 100644 src/main/java/gregtech/api/util/GTOreDictUnificator.java create mode 100644 src/main/java/gregtech/api/util/GTPlayedSound.java create mode 100644 src/main/java/gregtech/api/util/GTRecipe.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeBuilder.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeConstants.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeMapUtil.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeRegistrator.java create mode 100644 src/main/java/gregtech/api/util/GTRenderingWorld.java create mode 100644 src/main/java/gregtech/api/util/GTShapedRecipe.java create mode 100644 src/main/java/gregtech/api/util/GTShapelessRecipe.java create mode 100644 src/main/java/gregtech/api/util/GTSpawnEventHandler.java create mode 100644 src/main/java/gregtech/api/util/GTStreamUtil.java create mode 100644 src/main/java/gregtech/api/util/GTStructureUtility.java create mode 100644 src/main/java/gregtech/api/util/GTToolHarvestHelper.java create mode 100644 src/main/java/gregtech/api/util/GTTooltipDataCache.java create mode 100644 src/main/java/gregtech/api/util/GTUtil.java create mode 100644 src/main/java/gregtech/api/util/GTUtility.java create mode 100644 src/main/java/gregtech/api/util/GTUtilityClient.java create mode 100644 src/main/java/gregtech/api/util/GTWaila.java delete mode 100644 src/main/java/gregtech/api/util/GT_ApiaryModifier.java delete mode 100644 src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java delete mode 100644 src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java delete mode 100644 src/main/java/gregtech/api/util/GT_Assemblyline_Server.java delete mode 100644 src/main/java/gregtech/api/util/GT_BaseCrop.java delete mode 100644 src/main/java/gregtech/api/util/GT_BlockMap.java delete mode 100644 src/main/java/gregtech/api/util/GT_BlockSet.java delete mode 100644 src/main/java/gregtech/api/util/GT_CLS_Compat.java delete mode 100644 src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java delete mode 100644 src/main/java/gregtech/api/util/GT_CircuitryBehavior.java delete mode 100644 src/main/java/gregtech/api/util/GT_ClientPreference.java delete mode 100644 src/main/java/gregtech/api/util/GT_Config.java delete mode 100644 src/main/java/gregtech/api/util/GT_CoverBehavior.java delete mode 100644 src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java delete mode 100644 src/main/java/gregtech/api/util/GT_CreativeTab.java delete mode 100644 src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java delete mode 100644 src/main/java/gregtech/api/util/GT_FoodStat.java delete mode 100644 src/main/java/gregtech/api/util/GT_Forestry_Compat.java delete mode 100644 src/main/java/gregtech/api/util/GT_GC_Compat.java delete mode 100644 src/main/java/gregtech/api/util/GT_HatchElementBuilder.java delete mode 100644 src/main/java/gregtech/api/util/GT_IBoxableWrapper.java delete mode 100644 src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java delete mode 100644 src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java delete mode 100644 src/main/java/gregtech/api/util/GT_LanguageManager.java delete mode 100644 src/main/java/gregtech/api/util/GT_Log.java delete mode 100644 src/main/java/gregtech/api/util/GT_ModHandler.java delete mode 100644 src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java delete mode 100644 src/main/java/gregtech/api/util/GT_MusicSystem.java delete mode 100644 src/main/java/gregtech/api/util/GT_OreDictUnificator.java delete mode 100644 src/main/java/gregtech/api/util/GT_OverclockCalculator.java delete mode 100644 src/main/java/gregtech/api/util/GT_PCBFactoryManager.java delete mode 100644 src/main/java/gregtech/api/util/GT_ParallelHelper.java delete mode 100644 src/main/java/gregtech/api/util/GT_PlayedSound.java delete mode 100644 src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java delete mode 100644 src/main/java/gregtech/api/util/GT_Recipe.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeBuilder.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeConstants.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeMapUtil.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeRegistrator.java delete mode 100644 src/main/java/gregtech/api/util/GT_RenderingWorld.java delete mode 100644 src/main/java/gregtech/api/util/GT_Shaped_Recipe.java delete mode 100644 src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java delete mode 100644 src/main/java/gregtech/api/util/GT_SpawnEventHandler.java delete mode 100644 src/main/java/gregtech/api/util/GT_StreamUtil.java delete mode 100644 src/main/java/gregtech/api/util/GT_StructureUtility.java delete mode 100644 src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java delete mode 100644 src/main/java/gregtech/api/util/GT_Util.java delete mode 100644 src/main/java/gregtech/api/util/GT_Utility.java delete mode 100644 src/main/java/gregtech/api/util/GT_UtilityClient.java delete mode 100644 src/main/java/gregtech/api/util/GT_Waila.java create mode 100644 src/main/java/gregtech/api/util/HatchElementBuilder.java create mode 100644 src/main/java/gregtech/api/util/IGTHatchAdder.java delete mode 100644 src/main/java/gregtech/api/util/IGT_HatchAdder.java create mode 100644 src/main/java/gregtech/api/util/JubilanceMegaApiary.java create mode 100644 src/main/java/gregtech/api/util/MultiblockTooltipBuilder.java create mode 100644 src/main/java/gregtech/api/util/OverclockCalculator.java create mode 100644 src/main/java/gregtech/api/util/PCBFactoryManager.java create mode 100644 src/main/java/gregtech/api/util/ParallelHelper.java create mode 100644 src/main/java/gregtech/api/util/ProcessingArrayManager.java create mode 100644 src/main/java/gregtech/api/world/GTWorldgen.java delete mode 100644 src/main/java/gregtech/api/world/GT_Worldgen.java create mode 100644 src/main/java/gregtech/client/GTGUIClientConfig.java create mode 100644 src/main/java/gregtech/client/GTGuiFactory.java create mode 100644 src/main/java/gregtech/client/GTSoundLoop.java create mode 100644 src/main/java/gregtech/client/GTTooltipHandler.java delete mode 100644 src/main/java/gregtech/client/GT_GUI_ClientConfig.java delete mode 100644 src/main/java/gregtech/client/GT_GuiFactory.java delete mode 100644 src/main/java/gregtech/client/GT_SoundLoop.java delete mode 100644 src/main/java/gregtech/client/GT_TooltipHandler.java create mode 100644 src/main/java/gregtech/common/GTClient.java create mode 100644 src/main/java/gregtech/common/GTDummyWorld.java create mode 100644 src/main/java/gregtech/common/GTIteratorRandom.java create mode 100644 src/main/java/gregtech/common/GTNetwork.java create mode 100644 src/main/java/gregtech/common/GTPlayerActivityLogger.java create mode 100644 src/main/java/gregtech/common/GTProxy.java create mode 100644 src/main/java/gregtech/common/GTServer.java create mode 100644 src/main/java/gregtech/common/GTThaumcraftCompat.java create mode 100644 src/main/java/gregtech/common/GTWorldgenerator.java delete mode 100644 src/main/java/gregtech/common/GT_Client.java delete mode 100644 src/main/java/gregtech/common/GT_DummyWorld.java delete mode 100644 src/main/java/gregtech/common/GT_IteratorRandom.java delete mode 100644 src/main/java/gregtech/common/GT_Network.java delete mode 100644 src/main/java/gregtech/common/GT_PlayerActivityLogger.java delete mode 100644 src/main/java/gregtech/common/GT_Pollution.java delete mode 100644 src/main/java/gregtech/common/GT_Proxy.java delete mode 100644 src/main/java/gregtech/common/GT_RecipeAdder.java delete mode 100644 src/main/java/gregtech/common/GT_Server.java delete mode 100644 src/main/java/gregtech/common/GT_ThaumcraftCompat.java delete mode 100644 src/main/java/gregtech/common/GT_UndergroundOil.java delete mode 100644 src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java delete mode 100644 src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java delete mode 100644 src/main/java/gregtech/common/GT_Worldgen_Stone.java delete mode 100644 src/main/java/gregtech/common/GT_Worldgenerator.java create mode 100644 src/main/java/gregtech/common/Pollution.java create mode 100644 src/main/java/gregtech/common/RecipeAdder.java create mode 100644 src/main/java/gregtech/common/UndergroundOil.java create mode 100644 src/main/java/gregtech/common/WorldgenGTOreLayer.java create mode 100644 src/main/java/gregtech/common/WorldgenGTOreSmallPieces.java create mode 100644 src/main/java/gregtech/common/WorldgenStone.java create mode 100644 src/main/java/gregtech/common/bees/GTAlleleBeeSpecies.java create mode 100644 src/main/java/gregtech/common/bees/GTAlleleHelper.java create mode 100644 src/main/java/gregtech/common/bees/GTBeeMutation.java delete mode 100644 src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java delete mode 100644 src/main/java/gregtech/common/bees/GT_AlleleHelper.java delete mode 100644 src/main/java/gregtech/common/bees/GT_Bee_Mutation.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings1.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings10.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings11.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings2.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings3.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings4.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings5.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings6.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings8.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasings9.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCasingsAbstract.java create mode 100644 src/main/java/gregtech/common/blocks/BlockConcretes.java create mode 100644 src/main/java/gregtech/common/blocks/BlockCyclotronCoils.java create mode 100644 src/main/java/gregtech/common/blocks/BlockDrone.java create mode 100644 src/main/java/gregtech/common/blocks/BlockFrameBox.java create mode 100644 src/main/java/gregtech/common/blocks/BlockGlass1.java create mode 100644 src/main/java/gregtech/common/blocks/BlockGranites.java create mode 100644 src/main/java/gregtech/common/blocks/BlockLaser.java create mode 100644 src/main/java/gregtech/common/blocks/BlockMachines.java create mode 100644 src/main/java/gregtech/common/blocks/BlockMetal.java create mode 100644 src/main/java/gregtech/common/blocks/BlockOres.java create mode 100644 src/main/java/gregtech/common/blocks/BlockOresAbstract.java create mode 100644 src/main/java/gregtech/common/blocks/BlockReinforced.java create mode 100644 src/main/java/gregtech/common/blocks/BlockStones.java create mode 100644 src/main/java/gregtech/common/blocks/BlockStonesAbstract.java create mode 100644 src/main/java/gregtech/common/blocks/BlockStorage.java create mode 100644 src/main/java/gregtech/common/blocks/BlockTintedIndustrialGlass.java create mode 100644 src/main/java/gregtech/common/blocks/BlockWormholeRender.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings1.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings10.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings11.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings2.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings3.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings4.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings5.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings6.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings8.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings9.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Concretes.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Drone.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_FrameBox.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Glass1.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Granites.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Laser.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Machines.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Metal.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Ores.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Stones.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_Storage.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Block_TintedIndustrialGlass.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Block_Laser.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings1.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings10.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings11.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings2.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings3.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings4.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings5.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings6.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings8.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings9.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Concretes.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Frames.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Glass1.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Granites.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Machines.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Ores.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_Storage.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Item_TintedIndustrialGlass.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Material_Casings.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Material_Machines.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_Packet_Ores.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java delete mode 100644 src/main/java/gregtech/common/blocks/GT_WormholeRenderBlock.java create mode 100644 src/main/java/gregtech/common/blocks/ItemBlockLaser.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings1.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings10.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings11.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings2.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings3.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings4.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings5.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings6.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings8.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasings9.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCasingsAbstract.java create mode 100644 src/main/java/gregtech/common/blocks/ItemConcretes.java create mode 100644 src/main/java/gregtech/common/blocks/ItemCyclotronCasings.java create mode 100644 src/main/java/gregtech/common/blocks/ItemFrames.java create mode 100644 src/main/java/gregtech/common/blocks/ItemGlass1.java create mode 100644 src/main/java/gregtech/common/blocks/ItemGranites.java create mode 100644 src/main/java/gregtech/common/blocks/ItemLongDistancePipe.java create mode 100644 src/main/java/gregtech/common/blocks/ItemMachines.java create mode 100644 src/main/java/gregtech/common/blocks/ItemOres.java create mode 100644 src/main/java/gregtech/common/blocks/ItemStonesAbstract.java create mode 100644 src/main/java/gregtech/common/blocks/ItemStorage.java create mode 100644 src/main/java/gregtech/common/blocks/ItemTintedIndustrialGlass.java create mode 100644 src/main/java/gregtech/common/blocks/MaterialCasings.java create mode 100644 src/main/java/gregtech/common/blocks/MaterialMachines.java create mode 100644 src/main/java/gregtech/common/blocks/MaterialReinforced.java create mode 100644 src/main/java/gregtech/common/blocks/PacketOres.java create mode 100644 src/main/java/gregtech/common/blocks/TileEntityOres.java create mode 100644 src/main/java/gregtech/common/covers/CoverArm.java create mode 100644 src/main/java/gregtech/common/covers/CoverChest.java create mode 100644 src/main/java/gregtech/common/covers/CoverControlsWork.java create mode 100644 src/main/java/gregtech/common/covers/CoverConveyor.java create mode 100644 src/main/java/gregtech/common/covers/CoverCrafting.java create mode 100644 src/main/java/gregtech/common/covers/CoverDoesWork.java create mode 100644 src/main/java/gregtech/common/covers/CoverDrain.java create mode 100644 src/main/java/gregtech/common/covers/CoverEUMeter.java create mode 100644 src/main/java/gregtech/common/covers/CoverFacadeAE.java create mode 100644 src/main/java/gregtech/common/covers/CoverFacadeBase.java create mode 100644 src/main/java/gregtech/common/covers/CoverFluidLimiter.java create mode 100644 src/main/java/gregtech/common/covers/CoverFluidRegulator.java create mode 100644 src/main/java/gregtech/common/covers/CoverFluidStorageMonitor.java create mode 100644 src/main/java/gregtech/common/covers/CoverFluidfilter.java create mode 100644 src/main/java/gregtech/common/covers/CoverItemFilter.java create mode 100644 src/main/java/gregtech/common/covers/CoverItemMeter.java create mode 100644 src/main/java/gregtech/common/covers/CoverLens.java create mode 100644 src/main/java/gregtech/common/covers/CoverLiquidMeter.java create mode 100644 src/main/java/gregtech/common/covers/CoverMetricsTransmitter.java create mode 100644 src/main/java/gregtech/common/covers/CoverNeedMaintainance.java create mode 100644 src/main/java/gregtech/common/covers/CoverPlayerDetector.java create mode 100644 src/main/java/gregtech/common/covers/CoverPump.java create mode 100644 src/main/java/gregtech/common/covers/CoverRedstoneConductor.java create mode 100644 src/main/java/gregtech/common/covers/CoverRedstoneReceiverExternal.java create mode 100644 src/main/java/gregtech/common/covers/CoverRedstoneReceiverInternal.java create mode 100644 src/main/java/gregtech/common/covers/CoverRedstoneSignalizer.java create mode 100644 src/main/java/gregtech/common/covers/CoverRedstoneTransmitterExternal.java create mode 100644 src/main/java/gregtech/common/covers/CoverRedstoneTransmitterInternal.java create mode 100644 src/main/java/gregtech/common/covers/CoverRedstoneWirelessBase.java create mode 100644 src/main/java/gregtech/common/covers/CoverScreen.java create mode 100644 src/main/java/gregtech/common/covers/CoverShutter.java create mode 100644 src/main/java/gregtech/common/covers/CoverSolarPanel.java create mode 100644 src/main/java/gregtech/common/covers/CoverSteamRegulator.java create mode 100644 src/main/java/gregtech/common/covers/CoverSteamValve.java create mode 100644 src/main/java/gregtech/common/covers/CoverVent.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Arm.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Chest.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Crafting.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Drain.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Lens.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Pump.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Screen.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Shutter.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java delete mode 100644 src/main/java/gregtech/common/covers/GT_Cover_Vent.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverBase.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverExternal.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverInternal.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterBase.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterExternal.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterInternal.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverAdvancedWirelessRedstoneBase.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverWirelessDoesWorkDetector.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverWirelessFluidDetector.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverWirelessItemDetector.java create mode 100644 src/main/java/gregtech/common/covers/redstone/CoverWirelessMaintenanceDetector.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java delete mode 100644 src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java create mode 100644 src/main/java/gregtech/common/entities/EntityFXPollution.java delete mode 100644 src/main/java/gregtech/common/entities/GT_EntityFXPollution.java create mode 100644 src/main/java/gregtech/common/fluid/GTFluid.java create mode 100644 src/main/java/gregtech/common/fluid/GTFluidBuilder.java delete mode 100644 src/main/java/gregtech/common/fluid/GT_Fluid.java delete mode 100644 src/main/java/gregtech/common/fluid/GT_FluidBuilder.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerCycleButtonWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerNumericWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerSlotWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerTextFieldWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerToggleButtonWidget.java delete mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java delete mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java delete mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java delete mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java delete mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java delete mode 100644 src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java delete mode 100644 src/main/java/gregtech/common/items/GT_DepletetCell_Item.java delete mode 100644 src/main/java/gregtech/common/items/GT_FluidDisplayItem.java delete mode 100644 src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java delete mode 100644 src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java delete mode 100644 src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java delete mode 100644 src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java delete mode 100644 src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java delete mode 100644 src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java delete mode 100644 src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java delete mode 100644 src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java delete mode 100644 src/main/java/gregtech/common/items/GT_SensorCard_Item.java delete mode 100644 src/main/java/gregtech/common/items/GT_TierDrone.java delete mode 100644 src/main/java/gregtech/common/items/GT_VolumetricFlask.java delete mode 100644 src/main/java/gregtech/common/items/GT_WirelessHeadphones.java create mode 100644 src/main/java/gregtech/common/items/IDMetaItem01.java create mode 100644 src/main/java/gregtech/common/items/IDMetaItem02.java create mode 100644 src/main/java/gregtech/common/items/IDMetaItem03.java create mode 100644 src/main/java/gregtech/common/items/IDMetaTool01.java delete mode 100644 src/main/java/gregtech/common/items/ID_MetaItem_01.java delete mode 100644 src/main/java/gregtech/common/items/ID_MetaItem_02.java delete mode 100644 src/main/java/gregtech/common/items/ID_MetaItem_03.java delete mode 100644 src/main/java/gregtech/common/items/ID_MetaTool_01.java create mode 100644 src/main/java/gregtech/common/items/ItemAdvancedSensorCard.java create mode 100644 src/main/java/gregtech/common/items/ItemDepletedCell.java create mode 100644 src/main/java/gregtech/common/items/ItemFluidDisplay.java create mode 100644 src/main/java/gregtech/common/items/ItemIntegratedCircuit.java create mode 100644 src/main/java/gregtech/common/items/ItemNeutronReflector.java create mode 100644 src/main/java/gregtech/common/items/ItemSensorCard.java create mode 100644 src/main/java/gregtech/common/items/ItemTierDrone.java create mode 100644 src/main/java/gregtech/common/items/ItemVolumetricFlask.java create mode 100644 src/main/java/gregtech/common/items/ItemWirelessHeadphones.java create mode 100644 src/main/java/gregtech/common/items/MetaGeneratedItem01.java create mode 100644 src/main/java/gregtech/common/items/MetaGeneratedItem02.java create mode 100644 src/main/java/gregtech/common/items/MetaGeneratedItem03.java create mode 100644 src/main/java/gregtech/common/items/MetaGeneratedItem98.java create mode 100644 src/main/java/gregtech/common/items/MetaGeneratedItem99.java create mode 100644 src/main/java/gregtech/common/items/MetaGeneratedTool01.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourNone.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourScrewdriver.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSense.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSensorKit.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSoftHammer.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSonictron.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMetadata.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMode.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourWrench.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourWrittenBook.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_None.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java create mode 100644 src/main/java/gregtech/common/misc/DrillingLogicDelegate.java create mode 100644 src/main/java/gregtech/common/misc/GTClientPollutionMap.java create mode 100644 src/main/java/gregtech/common/misc/GTCommand.java delete mode 100644 src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java delete mode 100644 src/main/java/gregtech/common/misc/GT_Command.java delete mode 100644 src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java delete mode 100644 src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java create mode 100644 src/main/java/gregtech/common/misc/IDrillingLogicDelegateOwner.java create mode 100644 src/main/java/gregtech/common/misc/spaceprojects/base/SPRequirements.java create mode 100644 src/main/java/gregtech/common/misc/spaceprojects/base/SPUpgrade.java delete mode 100644 src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java delete mode 100644 src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java create mode 100644 src/main/java/gregtech/common/misc/spaceprojects/commands/SPCommand.java create mode 100644 src/main/java/gregtech/common/misc/spaceprojects/commands/SPMCommand.java delete mode 100644 src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java delete mode 100644 src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java create mode 100644 src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProjectCommand.java delete mode 100644 src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProject_Command.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitBasicLogic.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitBitAnd.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitCombinationLock.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitEquals.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitPulser.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitRandomizer.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitRedstoneMeter.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitRepeater.java create mode 100644 src/main/java/gregtech/common/redstonecircuits/CircuitTimer.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java delete mode 100644 src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java create mode 100644 src/main/java/gregtech/common/render/DroneRender.java create mode 100644 src/main/java/gregtech/common/render/FlaskRenderer.java create mode 100644 src/main/java/gregtech/common/render/FluidDisplayStackRenderer.java create mode 100644 src/main/java/gregtech/common/render/GTCapeRenderer.java create mode 100644 src/main/java/gregtech/common/render/GTCopiedBlockTextureRender.java create mode 100644 src/main/java/gregtech/common/render/GTCopiedCTMBlockTexture.java create mode 100644 src/main/java/gregtech/common/render/GTIconFlipped.java create mode 100644 src/main/java/gregtech/common/render/GTMultiTextureRender.java create mode 100644 src/main/java/gregtech/common/render/GTRenderUtil.java create mode 100644 src/main/java/gregtech/common/render/GTRenderedTexture.java create mode 100644 src/main/java/gregtech/common/render/GTRendererBlock.java create mode 100644 src/main/java/gregtech/common/render/GTSidedTextureRender.java create mode 100644 src/main/java/gregtech/common/render/GTTextureBase.java create mode 100644 src/main/java/gregtech/common/render/GTTextureBuilder.java delete mode 100644 src/main/java/gregtech/common/render/GT_CapeRenderer.java delete mode 100644 src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java delete mode 100644 src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java delete mode 100644 src/main/java/gregtech/common/render/GT_FlaskRenderer.java delete mode 100644 src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java delete mode 100644 src/main/java/gregtech/common/render/GT_IconFlipped.java delete mode 100644 src/main/java/gregtech/common/render/GT_LaserRenderer.java delete mode 100644 src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java delete mode 100644 src/main/java/gregtech/common/render/GT_MultiTexture.java delete mode 100644 src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java delete mode 100644 src/main/java/gregtech/common/render/GT_PollutionRenderer.java delete mode 100644 src/main/java/gregtech/common/render/GT_RenderDrone.java delete mode 100644 src/main/java/gregtech/common/render/GT_RenderUtil.java delete mode 100644 src/main/java/gregtech/common/render/GT_RenderedTexture.java delete mode 100644 src/main/java/gregtech/common/render/GT_Renderer_Block.java delete mode 100644 src/main/java/gregtech/common/render/GT_SidedTexture.java delete mode 100644 src/main/java/gregtech/common/render/GT_TextureBase.java delete mode 100644 src/main/java/gregtech/common/render/GT_TextureBuilder.java delete mode 100644 src/main/java/gregtech/common/render/GT_WormholeRenderer.java create mode 100644 src/main/java/gregtech/common/render/LaserRenderer.java create mode 100644 src/main/java/gregtech/common/render/MetaGeneratedToolRenderer.java create mode 100644 src/main/java/gregtech/common/render/MultiTileRenderer.java create mode 100644 src/main/java/gregtech/common/render/PollutionRenderer.java create mode 100644 src/main/java/gregtech/common/render/WormholeRenderer.java create mode 100644 src/main/java/gregtech/common/render/items/DataStickRenderer.java delete mode 100644 src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java delete mode 100644 src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java delete mode 100644 src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java delete mode 100644 src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java create mode 100644 src/main/java/gregtech/common/render/items/GeneratedItemRenderer.java create mode 100644 src/main/java/gregtech/common/render/items/GeneratedMaterialRenderer.java create mode 100644 src/main/java/gregtech/common/render/items/MetaGeneratedItemRenderer.java delete mode 100644 src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java delete mode 100644 src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java delete mode 100644 src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java delete mode 100644 src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java delete mode 100644 src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java delete mode 100644 src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java delete mode 100644 src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java create mode 100644 src/main/java/gregtech/common/tileentities/automation/MTEChestBuffer.java create mode 100644 src/main/java/gregtech/common/tileentities/automation/MTEFilter.java create mode 100644 src/main/java/gregtech/common/tileentities/automation/MTEItemDistributor.java create mode 100644 src/main/java/gregtech/common/tileentities/automation/MTERecipeFilter.java create mode 100644 src/main/java/gregtech/common/tileentities/automation/MTERegulator.java create mode 100644 src/main/java/gregtech/common/tileentities/automation/MTESuperBuffer.java create mode 100644 src/main/java/gregtech/common/tileentities/automation/MTETypeFilter.java delete mode 100644 src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java delete mode 100644 src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java delete mode 100644 src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java delete mode 100644 src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java create mode 100644 src/main/java/gregtech/common/tileentities/boilers/MTEBoiler.java create mode 100644 src/main/java/gregtech/common/tileentities/boilers/MTEBoilerBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/boilers/MTEBoilerLava.java create mode 100644 src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolar.java create mode 100644 src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolarSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSteel.java delete mode 100644 src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java create mode 100644 src/main/java/gregtech/common/tileentities/debug/MTEAdvDebugStructureWriter.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java delete mode 100644 src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTEDieselGenerator.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTEGasTurbine.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTELightningRod.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTEMagicEnergyConverter.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTEMagicalEnergyAbsorber.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTENaquadahReactor.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTEPlasmaGenerator.java create mode 100644 src/main/java/gregtech/common/tileentities/generators/MTESteamTurbine.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronzeBricks.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteelBricks.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputME.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputSlave.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEHatchInputBusME.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEHatchInputME.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputBusME.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputME.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_BetterJukebox.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_TurboCharger.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_WorldAccelerator.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEAdvSeismicProspector.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEBetterJukebox.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEBoxinator.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTECharger.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEIndustrialApiary.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEMassfabricator.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEMicrowaveEnergyTransmitter.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEMiner.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEMonsterRepellent.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEPotionBrewer.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEPump.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEReplicator.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTERockBreaker.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEScanner.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTETeleporter.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTETurboCharger.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/basic/MTEWorldAccelerator.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineBase.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineFluid.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineItem.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialElectromagneticSeparator.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialExtractor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialLaserEngraver.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeFluidExtractor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiAutoclave.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiCanner.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiLathe.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_WormholeGenerator.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEAbstractMultiFurnace.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEAssemblyLine.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEBrickedBlastFurnace.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTECharcoalPit.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTECleanroom.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller1.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller2.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEDieselEngine.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEDistillationTower.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEElectricBlastFurnace.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEExtremeDieselEngine.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer1.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer2.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer3.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEHeatExchanger.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEImplosionCompressor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialElectromagneticSeparator.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialExtractor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialLaserEngraver.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEIntegratedOreFactory.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoiler.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTitanium.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTungstenSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeFluidExtractor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbine.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGas.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGasAdvanced.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineHPSteam.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbinePlasma.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineSteam.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiAutoclave.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiCanner.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiFurnace.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiLathe.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTENanoForge.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOilCracker.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill1.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill2.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill3.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill4.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillBase.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillInfinite.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant1.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant2.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant3.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant4.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlantBase.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEPCBFactory.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEPlasmaForge.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEPrimitiveBlastFurnace.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEProcessingArray.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEPyrolyseOven.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTETranscendentPlasmaMixer.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEVacuumFreezer.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/MTEWormholeGenerator.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_BlackHoleCompressor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HIPCompressor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HeatSensor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_IndustrialCompressor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_NeutroniumCompressor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEDroneCentre.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEHatchDroneDownLink.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_Hatch_DegasifierControlHatch.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensHousing.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensIndicator.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationPlant.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitClarifier.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitDegasifier.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitFlocculation.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitOzonation.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitParticleExtractor.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPhAdjustment.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPlasmaHeater.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitUVTreatment.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_pHSensor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchDegasifierControl.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensHousing.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensIndicator.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchPHSensor.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationPlant.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBaryonicPerfection.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBase.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitClarifier.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitDegasser.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitFlocculation.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitOzonation.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPhAdjustment.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPlasmaHeater.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitUVTreatment.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java delete mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceSteel.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorBronze.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorSteel.java delete mode 100644 src/main/java/gregtech/common/tileentities/render/TileDrone.java create mode 100644 src/main/java/gregtech/common/tileentities/render/TileEntityDrone.java create mode 100644 src/main/java/gregtech/common/tileentities/render/TileEntityLaser.java create mode 100644 src/main/java/gregtech/common/tileentities/render/TileEntityWormhole.java delete mode 100644 src/main/java/gregtech/common/tileentities/render/TileLaser.java delete mode 100644 src/main/java/gregtech/common/tileentities/render/TileWormhole.java delete mode 100644 src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java delete mode 100644 src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java delete mode 100644 src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java delete mode 100644 src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java delete mode 100644 src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java delete mode 100644 src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java create mode 100644 src/main/java/gregtech/common/tileentities/storage/MTEDigitalChestBase.java create mode 100644 src/main/java/gregtech/common/tileentities/storage/MTEDigitalTankBase.java create mode 100644 src/main/java/gregtech/common/tileentities/storage/MTELocker.java create mode 100644 src/main/java/gregtech/common/tileentities/storage/MTEQuantumChest.java create mode 100644 src/main/java/gregtech/common/tileentities/storage/MTEQuantumTank.java create mode 100644 src/main/java/gregtech/common/tileentities/storage/MTESuperChest.java create mode 100644 src/main/java/gregtech/common/tileentities/storage/MTESuperTank.java create mode 100644 src/main/java/gregtech/common/tools/GTTool.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Axe.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_File.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Hoe.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Knife.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Mortar.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Plow.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Plunger.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Saw.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Scoop.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Sense.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Shovel.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Sword.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Turbine.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Wrench.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java delete mode 100644 src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java create mode 100644 src/main/java/gregtech/common/tools/ToolAxe.java create mode 100644 src/main/java/gregtech/common/tools/ToolBranchCutter.java create mode 100644 src/main/java/gregtech/common/tools/ToolButcheryKnife.java create mode 100644 src/main/java/gregtech/common/tools/ToolBuzzSaw.java create mode 100644 src/main/java/gregtech/common/tools/ToolChainsawHV.java create mode 100644 src/main/java/gregtech/common/tools/ToolChainsawLV.java create mode 100644 src/main/java/gregtech/common/tools/ToolChainsawMV.java create mode 100644 src/main/java/gregtech/common/tools/ToolCrowbar.java create mode 100644 src/main/java/gregtech/common/tools/ToolDrillHV.java create mode 100644 src/main/java/gregtech/common/tools/ToolDrillLV.java create mode 100644 src/main/java/gregtech/common/tools/ToolDrillMV.java create mode 100644 src/main/java/gregtech/common/tools/ToolFile.java create mode 100644 src/main/java/gregtech/common/tools/ToolHardHammer.java create mode 100644 src/main/java/gregtech/common/tools/ToolHoe.java create mode 100644 src/main/java/gregtech/common/tools/ToolJackHammer.java create mode 100644 src/main/java/gregtech/common/tools/ToolKnife.java create mode 100644 src/main/java/gregtech/common/tools/ToolMortar.java create mode 100644 src/main/java/gregtech/common/tools/ToolPickaxe.java create mode 100644 src/main/java/gregtech/common/tools/ToolPlow.java create mode 100644 src/main/java/gregtech/common/tools/ToolPlunger.java create mode 100644 src/main/java/gregtech/common/tools/ToolRollingPin.java create mode 100644 src/main/java/gregtech/common/tools/ToolSaw.java create mode 100644 src/main/java/gregtech/common/tools/ToolScoop.java create mode 100644 src/main/java/gregtech/common/tools/ToolScrewdriver.java create mode 100644 src/main/java/gregtech/common/tools/ToolScrewdriverLV.java create mode 100644 src/main/java/gregtech/common/tools/ToolSense.java create mode 100644 src/main/java/gregtech/common/tools/ToolShovel.java create mode 100644 src/main/java/gregtech/common/tools/ToolSoftHammer.java create mode 100644 src/main/java/gregtech/common/tools/ToolSolderingIron.java create mode 100644 src/main/java/gregtech/common/tools/ToolSword.java create mode 100644 src/main/java/gregtech/common/tools/ToolTurbine.java create mode 100644 src/main/java/gregtech/common/tools/ToolTurbineHuge.java create mode 100644 src/main/java/gregtech/common/tools/ToolTurbineLarge.java create mode 100644 src/main/java/gregtech/common/tools/ToolTurbineNormal.java create mode 100644 src/main/java/gregtech/common/tools/ToolTurbineSmall.java create mode 100644 src/main/java/gregtech/common/tools/ToolUniversalSpade.java create mode 100644 src/main/java/gregtech/common/tools/ToolWireCutter.java create mode 100644 src/main/java/gregtech/common/tools/ToolWrench.java create mode 100644 src/main/java/gregtech/common/tools/ToolWrenchHV.java create mode 100644 src/main/java/gregtech/common/tools/ToolWrenchLV.java create mode 100644 src/main/java/gregtech/common/tools/ToolWrenchMV.java delete mode 100644 src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java delete mode 100644 src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java delete mode 100644 src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java delete mode 100644 src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java delete mode 100644 src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java delete mode 100644 src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java delete mode 100644 src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java create mode 100644 src/main/java/gregtech/common/tools/pocket/ToolPocketBranchCutter.java create mode 100644 src/main/java/gregtech/common/tools/pocket/ToolPocketFile.java create mode 100644 src/main/java/gregtech/common/tools/pocket/ToolPocketKnife.java create mode 100644 src/main/java/gregtech/common/tools/pocket/ToolPocketMultitool.java create mode 100644 src/main/java/gregtech/common/tools/pocket/ToolPocketSaw.java create mode 100644 src/main/java/gregtech/common/tools/pocket/ToolPocketScrewdriver.java create mode 100644 src/main/java/gregtech/common/tools/pocket/ToolPocketWireCutter.java create mode 100644 src/main/java/gregtech/crossmod/holoinventory/GTInventoryDecoder.java delete mode 100644 src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java delete mode 100644 src/main/java/gregtech/crossmod/visualprospecting/GT_VisualProspecting_Database.java create mode 100644 src/main/java/gregtech/crossmod/visualprospecting/VisualProspectingDatabase.java create mode 100644 src/main/java/gregtech/loaders/load/CoverBehaviorLoader.java create mode 100644 src/main/java/gregtech/loaders/load/FuelLoader.java create mode 100644 src/main/java/gregtech/loaders/load/GTItemIterator.java delete mode 100644 src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java delete mode 100644 src/main/java/gregtech/loaders/load/GT_FuelLoader.java delete mode 100644 src/main/java/gregtech/loaders/load/GT_ItemIterator.java delete mode 100644 src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java delete mode 100644 src/main/java/gregtech/loaders/load/GT_SonictronLoader.java create mode 100644 src/main/java/gregtech/loaders/load/MTERecipeLoader.java create mode 100644 src/main/java/gregtech/loaders/load/SonictronLoader.java create mode 100644 src/main/java/gregtech/loaders/misc/CoverLoader.java create mode 100644 src/main/java/gregtech/loaders/misc/GTAchievements.java create mode 100644 src/main/java/gregtech/loaders/misc/GTBeeDefinition.java create mode 100644 src/main/java/gregtech/loaders/misc/GTBees.java create mode 100644 src/main/java/gregtech/loaders/misc/GTBranchDefinition.java delete mode 100644 src/main/java/gregtech/loaders/misc/GT_Achievements.java delete mode 100644 src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java delete mode 100644 src/main/java/gregtech/loaders/misc/GT_Bees.java delete mode 100644 src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java delete mode 100644 src/main/java/gregtech/loaders/misc/GT_CoverLoader.java create mode 100644 src/main/java/gregtech/loaders/misc/bees/GTAlleleEffect.java create mode 100644 src/main/java/gregtech/loaders/misc/bees/GTEffectMachineBoost.java create mode 100644 src/main/java/gregtech/loaders/misc/bees/GTEffectTreeTwister.java create mode 100644 src/main/java/gregtech/loaders/misc/bees/GTFlowers.java delete mode 100644 src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java delete mode 100644 src/main/java/gregtech/loaders/misc/bees/GT_EffectMachineBoost.java delete mode 100644 src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java delete mode 100644 src/main/java/gregtech/loaders/misc/bees/GT_Flowers.java create mode 100644 src/main/java/gregtech/loaders/postload/BlockResistanceLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/BookAndLootLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/CraftingRecipeLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/CropLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/FakeRecipeLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/GTPostLoad.java create mode 100644 src/main/java/gregtech/loaders/postload/GTWorldgenloader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_CropLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_PostLoad.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java delete mode 100644 src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java create mode 100644 src/main/java/gregtech/loaders/postload/ItemMaxStacksizeLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/MachineRecipeLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/MachineTooltipsLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/MinableRegistrator.java create mode 100644 src/main/java/gregtech/loaders/postload/PCBFactoryMaterialLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/ProcessingArrayRecipeLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/RecyclerBlacklistLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/ScrapboxDropLoader.java create mode 100644 src/main/java/gregtech/loaders/postload/chains/BauxiteRefineChain.java delete mode 100644 src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java delete mode 100644 src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java delete mode 100644 src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java delete mode 100644 src/main/java/gregtech/loaders/postload/chains/GT_PurifiedWaterRecipes.java create mode 100644 src/main/java/gregtech/loaders/postload/chains/NaniteChain.java create mode 100644 src/main/java/gregtech/loaders/postload/chains/PCBFactoryRecipes.java create mode 100644 src/main/java/gregtech/loaders/postload/chains/PurifiedWaterRecipes.java create mode 100644 src/main/java/gregtech/loaders/preload/GTPreLoad.java delete mode 100644 src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java delete mode 100644 src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java delete mode 100644 src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java delete mode 100644 src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java delete mode 100644 src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java delete mode 100644 src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java delete mode 100644 src/main/java/gregtech/loaders/preload/GT_PreLoad.java create mode 100644 src/main/java/gregtech/loaders/preload/LoaderCircuitBehaviors.java create mode 100644 src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java create mode 100644 src/main/java/gregtech/loaders/preload/LoaderGTItemData.java create mode 100644 src/main/java/gregtech/loaders/preload/LoaderGTOreDictionary.java create mode 100644 src/main/java/gregtech/loaders/preload/LoaderMetaTileEntities.java create mode 100644 src/main/java/gregtech/loaders/preload/LoaderOreProcessing.java create mode 100644 src/main/java/gregtech/nei/GTNEIConfig.java create mode 100644 src/main/java/gregtech/nei/GTNEIDefaultHandler.java delete mode 100644 src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java delete mode 100644 src/main/java/gregtech/nei/NEI_GT_Config.java (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/GTMod.java b/src/main/java/gregtech/GTMod.java new file mode 100644 index 0000000000..ab377561af --- /dev/null +++ b/src/main/java/gregtech/GTMod.java @@ -0,0 +1,886 @@ +package gregtech; + +import static gregtech.GT_Version.VERSION_MAJOR; +import static gregtech.GT_Version.VERSION_MINOR; +import static gregtech.GT_Version.VERSION_PATCH; +import static gregtech.api.GregTechAPI.registerCircuitProgrammer; +import static gregtech.api.enums.Mods.Forestry; +import static gregtech.api.util.GTRecipe.setItemStacks; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Locale; +import java.util.Map; +import java.util.function.Predicate; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.World; +import net.minecraftforge.common.ChestGenHooks; +import net.minecraftforge.oredict.OreDictionary; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.google.common.base.Stopwatch; +import com.google.common.collect.SetMultimap; +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; + +import appeng.api.AEApi; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLLoadCompleteEvent; +import cpw.mods.fml.common.event.FMLModIdMappingEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; +import cpw.mods.fml.common.event.FMLServerStartedEvent; +import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.event.FMLServerStoppingEvent; +import galacticgreg.SpaceDimRegisterer; +import gregtech.api.GregTechAPI; +import gregtech.api.enchants.EnchantmentEnderDamage; +import gregtech.api.enchants.EnchantmentHazmat; +import gregtech.api.enchants.EnchantmentRadioactivity; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Mods; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.internal.IGTMod; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.XSTR; +import gregtech.api.registries.LHECoolantRegistry; +import gregtech.api.threads.RunnableMachineUpdate; +import gregtech.api.util.AssemblyLineServer; +import gregtech.api.util.GTForestryCompat; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeRegistrator; +import gregtech.api.util.GTSpawnEventHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.item.ItemHolder; +import gregtech.common.GTDummyWorld; +import gregtech.common.GTNetwork; +import gregtech.common.GTProxy; +import gregtech.common.RecipeAdder; +import gregtech.common.config.client.ConfigColorModulation; +import gregtech.common.config.client.ConfigInterface; +import gregtech.common.config.client.ConfigPreference; +import gregtech.common.config.client.ConfigRender; +import gregtech.common.config.client.ConfigWaila; +import gregtech.common.config.gregtech.ConfigDebug; +import gregtech.common.config.gregtech.ConfigFeatures; +import gregtech.common.config.gregtech.ConfigGeneral; +import gregtech.common.config.gregtech.ConfigHarvestLevel; +import gregtech.common.config.gregtech.ConfigMachines; +import gregtech.common.config.gregtech.ConfigOreDropBehavior; +import gregtech.common.config.gregtech.ConfigPollution; +import gregtech.common.config.machinestats.ConfigBronzeSolarBoiler; +import gregtech.common.config.machinestats.ConfigMassFabricator; +import gregtech.common.config.machinestats.ConfigMicrowaveEnergyTransmitter; +import gregtech.common.config.machinestats.ConfigSteelSolarBoiler; +import gregtech.common.config.machinestats.ConfigTeleporter; +import gregtech.common.config.worldgen.ConfigEndAsteroids; +import gregtech.common.covers.CoverFacadeAE; +import gregtech.common.misc.GTCommand; +import gregtech.common.misc.spaceprojects.commands.SPCommand; +import gregtech.common.misc.spaceprojects.commands.SPMCommand; +import gregtech.common.misc.spaceprojects.commands.SpaceProjectCommand; +import gregtech.common.tileentities.machines.MTEHatchCraftingInputME; +import gregtech.common.tileentities.storage.MTEDigitalChestBase; +import gregtech.crossmod.holoinventory.HoloInventory; +import gregtech.crossmod.waila.Waila; +import gregtech.loaders.load.CoverBehaviorLoader; +import gregtech.loaders.load.FuelLoader; +import gregtech.loaders.load.GTItemIterator; +import gregtech.loaders.load.MTERecipeLoader; +import gregtech.loaders.load.SonictronLoader; +import gregtech.loaders.misc.CoverLoader; +import gregtech.loaders.misc.GTAchievements; +import gregtech.loaders.misc.GTBees; +import gregtech.loaders.postload.BlockResistanceLoader; +import gregtech.loaders.postload.BookAndLootLoader; +import gregtech.loaders.postload.CraftingRecipeLoader; +import gregtech.loaders.postload.CropLoader; +import gregtech.loaders.postload.FakeRecipeLoader; +import gregtech.loaders.postload.GTPostLoad; +import gregtech.loaders.postload.GTWorldgenloader; +import gregtech.loaders.postload.ItemMaxStacksizeLoader; +import gregtech.loaders.postload.MachineRecipeLoader; +import gregtech.loaders.postload.MachineTooltipsLoader; +import gregtech.loaders.postload.MinableRegistrator; +import gregtech.loaders.postload.PosteaTransformers; +import gregtech.loaders.postload.RecyclerBlacklistLoader; +import gregtech.loaders.postload.ScrapboxDropLoader; +import gregtech.loaders.preload.GTPreLoad; +import gregtech.loaders.preload.GT_Loader_MultiTileEntities; +import gregtech.loaders.preload.LoaderCircuitBehaviors; +import gregtech.loaders.preload.LoaderGTBlockFluid; +import gregtech.loaders.preload.LoaderGTItemData; +import gregtech.loaders.preload.LoaderGTOreDictionary; +import gregtech.loaders.preload.LoaderMetaTileEntities; +import gregtech.loaders.preload.LoaderOreProcessing; +import ic2.api.recipe.IRecipeInput; +import ic2.api.recipe.RecipeOutput; + +@Mod( + modid = Mods.Names.GREG_TECH, + name = "GregTech", + version = "MC1710", + guiFactory = "gregtech.client.GT_GuiFactory", + dependencies = " required-after:IC2;" + " required-after:structurelib;" + + " required-after:gtnhlib@[0.2.1,);" + + " required-after:modularui@[1.1.12,);" + + " required-after:appliedenergistics2@[rv3-beta-258,);" + + " after:dreamcraft;" + + " after:Forestry;" + + " after:PFAAGeologica;" + + " after:Thaumcraft;" + + " after:Railcraft;" + + " after:ThermalExpansion;" + + " after:TwilightForest;" + + " after:harvestcraft;" + + " after:magicalcrops;" + + " after:Botania;" + + " after:BuildCraft|Transport;" + + " after:BuildCraft|Silicon;" + + " after:BuildCraft|Factory;" + + " after:BuildCraft|Energy;" + + " after:BuildCraft|Core;" + + " after:BuildCraft|Builders;" + + " after:GalacticraftCore;" + + " after:GalacticraftMars;" + + " after:GalacticraftPlanets;" + + " after:ThermalExpansion|Transport;" + + " after:ThermalExpansion|Energy;" + + " after:ThermalExpansion|Factory;" + + " after:RedPowerCore;" + + " after:RedPowerBase;" + + " after:RedPowerMachine;" + + " after:RedPowerCompat;" + + " after:RedPowerWiring;" + + " after:RedPowerLogic;" + + " after:RedPowerLighting;" + + " after:RedPowerWorld;" + + " after:RedPowerControl;" + + " after:UndergroundBiomes;" + + " after:TConstruct;" + + " after:Translocator;" + + " after:gendustry;") +public class GTMod implements IGTMod { + + static { + try { + // Client + ConfigurationManager.registerConfig(ConfigColorModulation.class); + ConfigurationManager.registerConfig(ConfigInterface.class); + ConfigurationManager.registerConfig(ConfigPreference.class); + ConfigurationManager.registerConfig(ConfigRender.class); + ConfigurationManager.registerConfig(ConfigWaila.class); + + // GregTech.cfg + ConfigurationManager.registerConfig(ConfigDebug.class); + ConfigurationManager.registerConfig(ConfigFeatures.class); + ConfigurationManager.registerConfig(ConfigGeneral.class); + ConfigurationManager.registerConfig(ConfigHarvestLevel.class); + ConfigurationManager.registerConfig(ConfigMachines.class); + ConfigurationManager.registerConfig(ConfigOreDropBehavior.class); + ConfigurationManager.registerConfig(ConfigPollution.class); + + // MachineStats.cfg + ConfigurationManager.registerConfig(ConfigBronzeSolarBoiler.class); + ConfigurationManager.registerConfig(gregtech.common.config.machinestats.ConfigMachines.class); + ConfigurationManager.registerConfig(ConfigMassFabricator.class); + ConfigurationManager.registerConfig(ConfigMicrowaveEnergyTransmitter.class); + ConfigurationManager.registerConfig(ConfigSteelSolarBoiler.class); + ConfigurationManager.registerConfig(ConfigTeleporter.class); + + // OverPoweredStuff + ConfigurationManager.registerConfig(gregtech.common.config.opstuff.ConfigGeneral.class); + + // Other + ConfigurationManager.registerConfig(gregtech.common.config.other.ConfigGeneral.class); + + // WorldGeneration + ConfigurationManager.registerConfig(ConfigEndAsteroids.class); + ConfigurationManager.registerConfig(gregtech.common.config.worldgen.ConfigGeneral.class); + + } catch (ConfigException e) { + throw new RuntimeException(e); + } + } + + public static final int NBT_VERSION = calculateTotalGTVersion(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); + + @Mod.Instance(Mods.Names.GREG_TECH) + public static GTMod instance; + + @SidedProxy( + modId = Mods.Names.GREG_TECH, + clientSide = "gregtech.common.GTClient", + serverSide = "gregtech.common.GTServer") + public static GTProxy gregtechproxy; + public static final boolean DEBUG = Boolean.getBoolean("gt.debug");; + + public static int MAX_IC2 = 2147483647; + public static GTAchievements achievements; + @Deprecated + public static final String aTextGeneral = "general"; + public static final String aTextIC2 = "ic2_"; + public static final Logger GT_FML_LOGGER = LogManager.getLogger("GregTech GTNH"); + + @SuppressWarnings("deprecation") + public GTMod() { + GTValues.GT = this; + GTValues.DW = new GTDummyWorld(); + GTValues.NW = new GTNetwork(); + GTValues.RA = new RecipeAdder(); + + for (int i = 0; i < 4; i++) { + GregTechAPI.registerTileEntityConstructor(i, i2 -> GregTechAPI.constructBaseMetaTileEntity()); + } + for (int i = 4; i < 12; i++) { + GregTechAPI.registerTileEntityConstructor(i, i2 -> new BaseMetaPipeEntity()); + } + + // noinspection deprecation// Need run-time initialization + GregTechAPI.sRecipeAdder = GTValues.RA; + + // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless + Textures.BlockIcons.VOID.name(); + // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless + Textures.ItemIcons.VOID.name(); + } + + public static int calculateTotalGTVersion(int majorVersion, int minorVersion) { + return calculateTotalGTVersion(majorVersion, minorVersion, 0); + } + + public static int calculateTotalGTVersion(int majorVersion, int minorVersion, int patchVersion) { + return majorVersion * 1000000 + minorVersion * 1000 + patchVersion; + } + + @Mod.EventHandler + public void onPreLoad(FMLPreInitializationEvent aEvent) { + Locale.setDefault(Locale.ENGLISH); + if (GregTechAPI.sPreloadStarted) { + return; + } + + for (Runnable tRunnable : GregTechAPI.sBeforeGTPreload) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + GTPreLoad.getConfiguration(aEvent.getModConfigurationDirectory()); + GTPreLoad.createLogFiles( + aEvent.getModConfigurationDirectory() + .getParentFile()); + + gregtechproxy.onPreLoad(); + + GTLog.out.println("GTMod: Setting Configs"); + + GTPreLoad.loadConfig(); + + new EnchantmentHazmat(); + new EnchantmentEnderDamage(); + new EnchantmentRadioactivity(); + + Materials.init(); + + GTPreLoad.initLocalization( + aEvent.getModConfigurationDirectory() + .getParentFile()); + GTPreLoad.adjustScrap(); + + AEApi.instance() + .registries() + .interfaceTerminal() + .register(MTEHatchCraftingInputME.class); + + GTPreLoad.runMineTweakerCompat(); + + new LoaderOreProcessing().run(); + new LoaderGTOreDictionary().run(); + new LoaderGTItemData().run(); + new LoaderGTBlockFluid().run(); + new LoaderMetaTileEntities().run(); + if (GTValues.enableMultiTileEntities) { + new GT_Loader_MultiTileEntities().run(); + } + + new LoaderCircuitBehaviors().run(); + new CoverBehaviorLoader().run(); + new SonictronLoader().run(); + new GTSpawnEventHandler(); + + // populate itemstack instance for NBT check in GTRecipe + setItemStacks(); + + GTPreLoad.sortToTheEnd(); + GregTechAPI.sPreloadFinished = true; + GTLog.out.println("GTMod: Preload-Phase finished!"); + GTLog.ore.println("GTMod: Preload-Phase finished!"); + + GTUIInfos.init(); + + for (Runnable tRunnable : GregTechAPI.sAfterGTPreload) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) AssemblyLineServer.fillMap(aEvent); + } + + @Mod.EventHandler + public void onLoad(FMLInitializationEvent aEvent) { + if (GregTechAPI.sLoadStarted) { + return; + } + + for (Runnable tRunnable : GregTechAPI.sBeforeGTLoad) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + if (Forestry.isModLoaded()) + // noinspection InstantiationOfUtilityClass//TODO: Refactor GTBees with proper state handling + new GTBees(); + + // Disable Low Grav regardless of config if Cleanroom is disabled. + if (!gregtechproxy.mEnableCleanroom) { + gregtechproxy.mLowGravProcessing = false; + } + + gregtechproxy.onLoad(); + + registerCircuitProgrammer(new Predicate<>() { + + private final int screwdriverOreId = OreDictionary.getOreID("craftingToolScrewdriver"); + + @Override + public boolean test(ItemStack stack) { + for (int i : OreDictionary.getOreIDs(stack)) if (i == screwdriverOreId) return true; + return false; + } + }, true); + + new MTERecipeLoader().run(); + + new GTItemIterator().run(); + gregtechproxy.registerUnificationEntries(); + new FuelLoader().run(); + + if (Mods.Waila.isModLoaded()) { + Waila.init(); + } + if (Mods.HoloInventory.isModLoaded()) { + HoloInventory.init(); + } + + LHECoolantRegistry.registerBaseCoolants(); + + GT_FML_LOGGER.debug("Registering SpaceDimensions"); + SpaceDimRegisterer.register(); + + GregTechAPI.sLoadFinished = true; + GTLog.out.println("GTMod: Load-Phase finished!"); + GTLog.ore.println("GTMod: Load-Phase finished!"); + + for (Runnable tRunnable : GregTechAPI.sAfterGTLoad) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + } + + @Mod.EventHandler + public void onPostLoad(FMLPostInitializationEvent aEvent) { + if (GregTechAPI.sPostloadStarted) { + return; + } + + // Seems only used by GGFab so far + for (Runnable tRunnable : GregTechAPI.sBeforeGTPostload) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + gregtechproxy.onPostLoad(); + + if (DEBUG) { + // Prints all the used MTE id and their associated TE name, turned on with -Dgt.debug=true in jvm args + final int bound = GregTechAPI.METATILEENTITIES.length; + for (int i1 = 1; i1 < bound; i1++) { + if (GregTechAPI.METATILEENTITIES[i1] != null) { + GTLog.out.printf("META %d %s\n", i1, GregTechAPI.METATILEENTITIES[i1].getMetaName()); + } + } + } + + gregtechproxy.registerUnificationEntries(); + + new BookAndLootLoader().run(); + new ItemMaxStacksizeLoader().run(); + new BlockResistanceLoader().run(); + new RecyclerBlacklistLoader().run(); + new MinableRegistrator().run(); + new FakeRecipeLoader().run(); + new MachineRecipeLoader().run(); + new ScrapboxDropLoader().run(); + new CropLoader().run(); + new GTWorldgenloader().run(); + new CoverLoader().run(); + + GTRecipeRegistrator.registerUsagesForMaterials( + null, + false, + new ItemStack(Blocks.planks, 1), + new ItemStack(Blocks.cobblestone, 1), + new ItemStack(Blocks.stone, 1), + new ItemStack(Items.leather, 1)); + + GTOreDictUnificator.addItemData( + GTModHandler.getRecipeOutput( + null, + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L), + null, + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L), + null, + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L), + null, + null, + null), + new ItemData(Materials.Tin, 10886400L)); + GTModHandler.removeRecipe( + new ItemStack(Items.glowstone_dust, 1), + new ItemStack(Items.glowstone_dust, 1), + null, + new ItemStack(Items.glowstone_dust, 1), + new ItemStack(Items.glowstone_dust, 1)); + GTModHandler.removeRecipeDelayed( + new ItemStack(Blocks.wooden_slab, 1, 0), + new ItemStack(Blocks.wooden_slab, 1, 1), + new ItemStack(Blocks.wooden_slab, 1, 2)); + GTModHandler.addCraftingRecipe( + new ItemStack(Blocks.wooden_slab, 6, 0), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "WWW", 'W', new ItemStack(Blocks.planks, 1, 0) }); + + // Save a copy of these list before activateOreDictHandler(), then loop over them. + Map aMaceratorRecipeList = GTModHandler.getMaceratorRecipeList(); + Map aCompressorRecipeList = GTModHandler.getCompressorRecipeList(); + Map aExtractorRecipeList = GTModHandler.getExtractorRecipeList(); + Map aOreWashingRecipeList = GTModHandler.getOreWashingRecipeList(); + Map aThermalCentrifugeRecipeList = GTModHandler.getThermalCentrifugeRecipeList(); + + GTLog.out.println( + "GTMod: Activating OreDictionary Handler, this can take some time, as it scans the whole OreDictionary"); + GT_FML_LOGGER.info( + "If your Log stops here, you were too impatient. Wait a bit more next time, before killing Minecraft with the Task Manager."); + + GTPostLoad.activateOreDictHandler(); + GTPostLoad.replaceVanillaMaterials(); + GTPostLoad.removeIc2Recipes( + aMaceratorRecipeList, + aCompressorRecipeList, + aExtractorRecipeList, + aOreWashingRecipeList, + aThermalCentrifugeRecipeList); + + if (GTValues.D1) { + GTModHandler.sSingleNonBlockDamagableRecipeList.forEach( + iRecipe -> GTLog.out.println( + "=> " + iRecipe.getRecipeOutput() + .getDisplayName())); + } + new CraftingRecipeLoader().run(); + GTModHandler.removeRecipeByOutput(ItemList.IC2_ForgeHammer.getWildcard(1L)); + GTModHandler.removeRecipeByOutput(GTModHandler.getIC2Item("machine", 1L)); + GTModHandler.addCraftingRecipe( + GTModHandler.getIC2Item("machine", 1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "RRR", "RwR", "RRR", 'R', OrePrefixes.plate.get(Materials.Iron) }); + + GTPostLoad.registerFluidCannerRecipes(); + + if (Forestry.isModLoaded()) { + GTForestryCompat.transferCentrifugeRecipes(); + GTForestryCompat.transferSqueezerRecipes(); + } + MTEDigitalChestBase.registerAEIntegration(); + ItemStack facade = AEApi.instance() + .definitions() + .items() + .facade() + .maybeItem() + .transform(i -> new ItemStack(i, 1, GTValues.W)) + .orNull(); + if (facade != null) { + GregTechAPI.registerCover(facade, null, new CoverFacadeAE()); + } + + Arrays + .stream( + new String[] { "blastfurnace", "blockcutter", "inductionFurnace", "generator", "windMill", "waterMill", + "solarPanel", "centrifuge", "electrolyzer", "compressor", "electroFurnace", "extractor", + "macerator", "recycler", "metalformer", "orewashingplant", "massFabricator", "replicator", }) + .map(tName -> GTModHandler.getIC2Item(tName, 1L)) + .forEach(GTModHandler::removeRecipeByOutputDelayed); + + GTPostLoad.nerfVanillaTools(); + + // Register postea transformers + new PosteaTransformers().run(); + + /* + * Until this point most crafting recipe additions, and removals, have been buffered. Go through, execute the + * removals in bulk, and then any deferred additions. The bulk removals in particular significantly speed up the + * recipe list modifications. + */ + + @SuppressWarnings("UnstableApiUsage") // Stable enough for this project + Stopwatch stopwatch = Stopwatch.createStarted(); + GTLog.out.println("GTMod: Adding buffered Recipes."); + GTModHandler.stopBufferingCraftingRecipes(); + // noinspection UnstableApiUsage// Stable enough for this project + GT_FML_LOGGER.info("Executed delayed Crafting Recipes (" + stopwatch.stop() + "). Have a Cake."); + + GTLog.out.println("GTMod: Saving Lang File."); + new MachineTooltipsLoader().run(); + GTLanguageManager.sEnglishFile.save(); + GregTechAPI.sPostloadFinished = true; + GTLog.out.println("GTMod: PostLoad-Phase finished!"); + GTLog.ore.println("GTMod: PostLoad-Phase finished!"); + for (Runnable tRunnable : GregTechAPI.sAfterGTPostload) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + GTPostLoad.addFakeRecipes(); + + if (GregTechAPI.mOutputRF || GregTechAPI.mInputRF) { + GTUtility.checkAvailabilities(); + if (!GTUtility.RF_CHECK) { + GregTechAPI.mOutputRF = false; + GregTechAPI.mInputRF = false; + } + } + + GTPostLoad.addSolidFakeLargeBoilerFuels(); + GTPostLoad.identifyAnySteam(); + + achievements = new GTAchievements(); + + GTRecipe.GTppRecipeHelper = true; + GTLog.out.println("GTMod: Loading finished, de-allocating temporary Init Variables."); + GregTechAPI.sBeforeGTPreload = null; + GregTechAPI.sAfterGTPreload = null; + GregTechAPI.sBeforeGTLoad = null; + GregTechAPI.sAfterGTLoad = null; + GregTechAPI.sBeforeGTPostload = null; + GregTechAPI.sAfterGTPostload = null; + + GTPostLoad.createGTtoolsCreativeTab(); + } + + @Mod.EventHandler + public void onLoadComplete(FMLLoadCompleteEvent aEvent) { + gregtechproxy.onLoadComplete(); + for (Runnable tRunnable : GregTechAPI.sGTCompleteLoad) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + GregTechAPI.sGTCompleteLoad = null; + GregTechAPI.sFullLoadFinished = true; + } + + @Mod.EventHandler + public void onServerStarted(FMLServerStartedEvent aEvent) { + gregtechproxy.onServerStarted(); + } + + @Mod.EventHandler + public void onServerAboutToStart(FMLServerAboutToStartEvent aEvent) { + gregtechproxy.onServerAboutToStart(); + } + + @Mod.EventHandler + public void onServerStarting(FMLServerStartingEvent aEvent) { + + for (Runnable tRunnable : GregTechAPI.sBeforeGTServerstart) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + gregtechproxy.onServerStarting(); + GTModHandler.removeAllIC2Recipes(); + GTLog.out.println("GTMod: Unificating outputs of all known Recipe Types."); + ArrayList tStacks = new ArrayList<>(10000); + GTLog.out.println("GTMod: IC2 Machines"); + + ic2.api.recipe.Recipes.cannerBottle.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.centrifuge.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.compressor.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.extractor.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.macerator.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.metalformerCutting.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.metalformerExtruding.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.metalformerRolling.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.matterAmplifier.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + ic2.api.recipe.Recipes.oreWashing.getRecipes() + .values() + .stream() + .map(t -> t.items) + .forEach(tStacks::addAll); + + GTLog.out.println("GTMod: Dungeon Loot"); + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("dungeonChest") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("bonusChest") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("villageBlacksmith") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCrossing") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdLibrary") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCorridor") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleDispenser") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleChest") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidDesertyChest") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("mineshaftCorridor") + .getItems(new XSTR())) { + tStacks.add(tContent.theItemId); + } + GTLog.out.println("GTMod: Smelting"); + + // Deal with legacy Minecraft raw types + tStacks.addAll( + FurnaceRecipes.smelting() + .getSmeltingList() + .values()); + + if (gregtechproxy.mCraftingUnification) { + GTLog.out.println("GTMod: Crafting Recipes"); + for (IRecipe tRecipe : CraftingManager.getInstance() + .getRecipeList()) { + if ((tRecipe instanceof IRecipe)) { + tStacks.add(tRecipe.getRecipeOutput()); + } + } + } + for (ItemStack tOutput : tStacks) { + if (!gregtechproxy.mRegisteredOres.contains(tOutput)) { + GTOreDictUnificator.setStack(tOutput); + } else { + logMultilineError(GT_FML_LOGGER, generateGTErr01Message(tOutput)); + tOutput.setStackDisplayName("ERROR! PLEASE CHECK YOUR LOG FOR 'GT-ERR-01'!"); + } + } + GregTechAPI.mServerStarted = true; + GTLog.out.println("GTMod: ServerStarting-Phase finished!"); + GTLog.ore.println("GTMod: ServerStarting-Phase finished!"); + + for (Runnable tRunnable : GregTechAPI.sAfterGTServerstart) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + aEvent.registerServerCommand(new GTCommand()); + aEvent.registerServerCommand(new SPCommand()); + aEvent.registerServerCommand(new SPMCommand()); + aEvent.registerServerCommand(new SpaceProjectCommand()); + // Sets a new Machine Block Update Thread everytime a world is loaded + RunnableMachineUpdate.initExecutorService(); + } + + public boolean isServerSide() { + return gregtechproxy.isServerSide(); + } + + public boolean isClientSide() { + return gregtechproxy.isClientSide(); + } + + public boolean isBukkitSide() { + return gregtechproxy.isBukkitSide(); + } + + public EntityPlayer getThePlayer() { + return gregtechproxy.getThePlayer(); + } + + public int addArmor(String aArmorPrefix) { + return gregtechproxy.addArmor(aArmorPrefix); + } + + public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) { + gregtechproxy.doSonictronSound(aStack, aWorld, aX, aY, aZ); + } + + @Mod.EventHandler + public void onIDChangingEvent(FMLModIdMappingEvent aEvent) { + GTUtility.reInit(); + GTRecipe.reInit(); + try { + for (Map gt_itemStackMap : GregTechAPI.sItemStackMappings) { + GTUtility.reMap(gt_itemStackMap); + } + for (SetMultimap gt_itemStackMap : GregTechAPI.itemStackMultiMaps) { + GTUtility.reMap(gt_itemStackMap); + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + @Mod.EventHandler + public void onServerStopping(FMLServerStoppingEvent aEvent) { + for (Runnable tRunnable : GregTechAPI.sBeforeGTServerstop) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + gregtechproxy.onServerStopping(); + + for (Runnable tRunnable : GregTechAPI.sAfterGTServerstop) { + try { + tRunnable.run(); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + // Interrupt IDLE Threads to close down cleanly + RunnableMachineUpdate.shutdownExecutorService(); + } + + public static void logStackTrace(Throwable t) { + final StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + GT_FML_LOGGER.error(sw); + } + + private static String[] generateGTErr01Message(ItemStack stack) { + // The message is presented on a per-line basis to make possible formatting in the future easier. + return new String[] { "GT-ERR-01 at " + stack.getUnlocalizedName() + " " + stack.getDisplayName(), + "A recipe used an OreDict item as output directly, without copying the item before that. This is a typical CallByReference/CallByValue error.", + "The said item will be renamed to make the invalid recipe visible.", + "Please check all recipes that output this item, and report them to the mod that introduced the recipes.", }; + } + + @SuppressWarnings("SameParameterValue") // The method is used with one logger, but that might change in the future. + private static void logMultilineError(Logger logger, String[] errorMessageLines) { + for (String errorMessage : errorMessageLines) { + logger.error(errorMessage); + } + } +} diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java deleted file mode 100644 index 1467000877..0000000000 --- a/src/main/java/gregtech/GT_Mod.java +++ /dev/null @@ -1,886 +0,0 @@ -package gregtech; - -import static gregtech.GT_Version.VERSION_MAJOR; -import static gregtech.GT_Version.VERSION_MINOR; -import static gregtech.GT_Version.VERSION_PATCH; -import static gregtech.api.GregTech_API.registerCircuitProgrammer; -import static gregtech.api.enums.Mods.Forestry; -import static gregtech.api.util.GT_Recipe.setItemStacks; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Locale; -import java.util.Map; -import java.util.function.Predicate; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; -import net.minecraftforge.common.ChestGenHooks; -import net.minecraftforge.oredict.OreDictionary; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import com.google.common.base.Stopwatch; -import com.google.common.collect.SetMultimap; -import com.gtnewhorizon.gtnhlib.config.ConfigException; -import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; - -import appeng.api.AEApi; -import bloodasp.galacticgreg.SpaceDimRegisterer; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLLoadCompleteEvent; -import cpw.mods.fml.common.event.FMLModIdMappingEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; -import cpw.mods.fml.common.event.FMLServerStartedEvent; -import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.event.FMLServerStoppingEvent; -import gregtech.api.GregTech_API; -import gregtech.api.enchants.Enchantment_EnderDamage; -import gregtech.api.enchants.Enchantment_Hazmat; -import gregtech.api.enchants.Enchantment_Radioactivity; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.Mods; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.internal.IGT_Mod; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.objects.ItemData; -import gregtech.api.objects.XSTR; -import gregtech.api.registries.LHECoolantRegistry; -import gregtech.api.threads.GT_Runnable_MachineBlockUpdate; -import gregtech.api.util.GT_Assemblyline_Server; -import gregtech.api.util.GT_Forestry_Compat; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeRegistrator; -import gregtech.api.util.GT_SpawnEventHandler; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.item.ItemHolder; -import gregtech.common.GT_DummyWorld; -import gregtech.common.GT_Network; -import gregtech.common.GT_Proxy; -import gregtech.common.GT_RecipeAdder; -import gregtech.common.config.client.ConfigColorModulation; -import gregtech.common.config.client.ConfigInterface; -import gregtech.common.config.client.ConfigPreference; -import gregtech.common.config.client.ConfigRender; -import gregtech.common.config.client.ConfigWaila; -import gregtech.common.config.gregtech.ConfigDebug; -import gregtech.common.config.gregtech.ConfigFeatures; -import gregtech.common.config.gregtech.ConfigGeneral; -import gregtech.common.config.gregtech.ConfigHarvestLevel; -import gregtech.common.config.gregtech.ConfigMachines; -import gregtech.common.config.gregtech.ConfigOreDropBehavior; -import gregtech.common.config.gregtech.ConfigPollution; -import gregtech.common.config.machinestats.ConfigBronzeSolarBoiler; -import gregtech.common.config.machinestats.ConfigMassFabricator; -import gregtech.common.config.machinestats.ConfigMicrowaveEnergyTransmitter; -import gregtech.common.config.machinestats.ConfigSteelSolarBoiler; -import gregtech.common.config.machinestats.ConfigTeleporter; -import gregtech.common.config.worldgen.ConfigEndAsteroids; -import gregtech.common.covers.GT_Cover_FacadeAE; -import gregtech.common.misc.GT_Command; -import gregtech.common.misc.spaceprojects.commands.SPM_Command; -import gregtech.common.misc.spaceprojects.commands.SP_Command; -import gregtech.common.misc.spaceprojects.commands.SpaceProject_Command; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase; -import gregtech.crossmod.holoinventory.HoloInventory; -import gregtech.crossmod.waila.Waila; -import gregtech.loaders.load.GT_CoverBehaviorLoader; -import gregtech.loaders.load.GT_FuelLoader; -import gregtech.loaders.load.GT_ItemIterator; -import gregtech.loaders.load.GT_Loader_MetaTileEntities_Recipes; -import gregtech.loaders.load.GT_SonictronLoader; -import gregtech.loaders.misc.GT_Achievements; -import gregtech.loaders.misc.GT_Bees; -import gregtech.loaders.misc.GT_CoverLoader; -import gregtech.loaders.postload.GT_BlockResistanceLoader; -import gregtech.loaders.postload.GT_BookAndLootLoader; -import gregtech.loaders.postload.GT_CraftingRecipeLoader; -import gregtech.loaders.postload.GT_CropLoader; -import gregtech.loaders.postload.GT_FakeRecipeLoader; -import gregtech.loaders.postload.GT_ItemMaxStacksizeLoader; -import gregtech.loaders.postload.GT_MachineRecipeLoader; -import gregtech.loaders.postload.GT_MachineTooltipsLoader; -import gregtech.loaders.postload.GT_MinableRegistrator; -import gregtech.loaders.postload.GT_PostLoad; -import gregtech.loaders.postload.GT_RecyclerBlacklistLoader; -import gregtech.loaders.postload.GT_ScrapboxDropLoader; -import gregtech.loaders.postload.GT_Worldgenloader; -import gregtech.loaders.postload.PosteaTransformers; -import gregtech.loaders.preload.GT_Loader_CircuitBehaviors; -import gregtech.loaders.preload.GT_Loader_ItemData; -import gregtech.loaders.preload.GT_Loader_Item_Block_And_Fluid; -import gregtech.loaders.preload.GT_Loader_MetaTileEntities; -import gregtech.loaders.preload.GT_Loader_MultiTileEntities; -import gregtech.loaders.preload.GT_Loader_OreDictionary; -import gregtech.loaders.preload.GT_Loader_OreProcessing; -import gregtech.loaders.preload.GT_PreLoad; -import ic2.api.recipe.IRecipeInput; -import ic2.api.recipe.RecipeOutput; - -@Mod( - modid = Mods.Names.GREG_TECH, - name = "GregTech", - version = "MC1710", - guiFactory = "gregtech.client.GT_GuiFactory", - dependencies = " required-after:IC2;" + " required-after:structurelib;" - + " required-after:gtnhlib@[0.2.1,);" - + " required-after:modularui@[1.1.12,);" - + " required-after:appliedenergistics2@[rv3-beta-258,);" - + " after:dreamcraft;" - + " after:Forestry;" - + " after:PFAAGeologica;" - + " after:Thaumcraft;" - + " after:Railcraft;" - + " after:ThermalExpansion;" - + " after:TwilightForest;" - + " after:harvestcraft;" - + " after:magicalcrops;" - + " after:Botania;" - + " after:BuildCraft|Transport;" - + " after:BuildCraft|Silicon;" - + " after:BuildCraft|Factory;" - + " after:BuildCraft|Energy;" - + " after:BuildCraft|Core;" - + " after:BuildCraft|Builders;" - + " after:GalacticraftCore;" - + " after:GalacticraftMars;" - + " after:GalacticraftPlanets;" - + " after:ThermalExpansion|Transport;" - + " after:ThermalExpansion|Energy;" - + " after:ThermalExpansion|Factory;" - + " after:RedPowerCore;" - + " after:RedPowerBase;" - + " after:RedPowerMachine;" - + " after:RedPowerCompat;" - + " after:RedPowerWiring;" - + " after:RedPowerLogic;" - + " after:RedPowerLighting;" - + " after:RedPowerWorld;" - + " after:RedPowerControl;" - + " after:UndergroundBiomes;" - + " after:TConstruct;" - + " after:Translocator;" - + " after:gendustry;") -public class GT_Mod implements IGT_Mod { - - static { - try { - // Client - ConfigurationManager.registerConfig(ConfigColorModulation.class); - ConfigurationManager.registerConfig(ConfigInterface.class); - ConfigurationManager.registerConfig(ConfigPreference.class); - ConfigurationManager.registerConfig(ConfigRender.class); - ConfigurationManager.registerConfig(ConfigWaila.class); - - // GregTech.cfg - ConfigurationManager.registerConfig(ConfigDebug.class); - ConfigurationManager.registerConfig(ConfigFeatures.class); - ConfigurationManager.registerConfig(ConfigGeneral.class); - ConfigurationManager.registerConfig(ConfigHarvestLevel.class); - ConfigurationManager.registerConfig(ConfigMachines.class); - ConfigurationManager.registerConfig(ConfigOreDropBehavior.class); - ConfigurationManager.registerConfig(ConfigPollution.class); - - // MachineStats.cfg - ConfigurationManager.registerConfig(ConfigBronzeSolarBoiler.class); - ConfigurationManager.registerConfig(gregtech.common.config.machinestats.ConfigMachines.class); - ConfigurationManager.registerConfig(ConfigMassFabricator.class); - ConfigurationManager.registerConfig(ConfigMicrowaveEnergyTransmitter.class); - ConfigurationManager.registerConfig(ConfigSteelSolarBoiler.class); - ConfigurationManager.registerConfig(ConfigTeleporter.class); - - // OverPoweredStuff - ConfigurationManager.registerConfig(gregtech.common.config.opstuff.ConfigGeneral.class); - - // Other - ConfigurationManager.registerConfig(gregtech.common.config.other.ConfigGeneral.class); - - // WorldGeneration - ConfigurationManager.registerConfig(ConfigEndAsteroids.class); - ConfigurationManager.registerConfig(gregtech.common.config.worldgen.ConfigGeneral.class); - - } catch (ConfigException e) { - throw new RuntimeException(e); - } - } - - public static final int NBT_VERSION = calculateTotalGTVersion(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); - - @Mod.Instance(Mods.Names.GREG_TECH) - public static GT_Mod instance; - - @SidedProxy( - modId = Mods.Names.GREG_TECH, - clientSide = "gregtech.common.GT_Client", - serverSide = "gregtech.common.GT_Server") - public static GT_Proxy gregtechproxy; - public static final boolean DEBUG = Boolean.getBoolean("gt.debug");; - - public static int MAX_IC2 = 2147483647; - public static GT_Achievements achievements; - @Deprecated - public static final String aTextGeneral = "general"; - public static final String aTextIC2 = "ic2_"; - public static final Logger GT_FML_LOGGER = LogManager.getLogger("GregTech GTNH"); - - @SuppressWarnings("deprecation") - public GT_Mod() { - GT_Values.GT = this; - GT_Values.DW = new GT_DummyWorld(); - GT_Values.NW = new GT_Network(); - GT_Values.RA = new GT_RecipeAdder(); - - for (int i = 0; i < 4; i++) { - GregTech_API.registerTileEntityConstructor(i, i2 -> GregTech_API.constructBaseMetaTileEntity()); - } - for (int i = 4; i < 12; i++) { - GregTech_API.registerTileEntityConstructor(i, i2 -> new BaseMetaPipeEntity()); - } - - // noinspection deprecation// Need run-time initialization - GregTech_API.sRecipeAdder = GT_Values.RA; - - // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless - Textures.BlockIcons.VOID.name(); - // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless - Textures.ItemIcons.VOID.name(); - } - - public static int calculateTotalGTVersion(int majorVersion, int minorVersion) { - return calculateTotalGTVersion(majorVersion, minorVersion, 0); - } - - public static int calculateTotalGTVersion(int majorVersion, int minorVersion, int patchVersion) { - return majorVersion * 1000000 + minorVersion * 1000 + patchVersion; - } - - @Mod.EventHandler - public void onPreLoad(FMLPreInitializationEvent aEvent) { - Locale.setDefault(Locale.ENGLISH); - if (GregTech_API.sPreloadStarted) { - return; - } - - for (Runnable tRunnable : GregTech_API.sBeforeGTPreload) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - GT_PreLoad.getConfiguration(aEvent.getModConfigurationDirectory()); - GT_PreLoad.createLogFiles( - aEvent.getModConfigurationDirectory() - .getParentFile()); - - gregtechproxy.onPreLoad(); - - GT_Log.out.println("GT_Mod: Setting Configs"); - - GT_PreLoad.loadConfig(); - - new Enchantment_Hazmat(); - new Enchantment_EnderDamage(); - new Enchantment_Radioactivity(); - - Materials.init(); - - GT_PreLoad.initLocalization( - aEvent.getModConfigurationDirectory() - .getParentFile()); - GT_PreLoad.adjustScrap(); - - AEApi.instance() - .registries() - .interfaceTerminal() - .register(GT_MetaTileEntity_Hatch_CraftingInput_ME.class); - - GT_PreLoad.runMineTweakerCompat(); - - new GT_Loader_OreProcessing().run(); - new GT_Loader_OreDictionary().run(); - new GT_Loader_ItemData().run(); - new GT_Loader_Item_Block_And_Fluid().run(); - new GT_Loader_MetaTileEntities().run(); - if (GT_Values.enableMultiTileEntities) { - new GT_Loader_MultiTileEntities().run(); - } - - new GT_Loader_CircuitBehaviors().run(); - new GT_CoverBehaviorLoader().run(); - new GT_SonictronLoader().run(); - new GT_SpawnEventHandler(); - - // populate itemstack instance for NBT check in GT_Recipe - setItemStacks(); - - GT_PreLoad.sortToTheEnd(); - GregTech_API.sPreloadFinished = true; - GT_Log.out.println("GT_Mod: Preload-Phase finished!"); - GT_Log.ore.println("GT_Mod: Preload-Phase finished!"); - - GT_UIInfos.init(); - - for (Runnable tRunnable : GregTech_API.sAfterGTPreload) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - if (FMLCommonHandler.instance() - .getEffectiveSide() - .isServer()) GT_Assemblyline_Server.fillMap(aEvent); - } - - @Mod.EventHandler - public void onLoad(FMLInitializationEvent aEvent) { - if (GregTech_API.sLoadStarted) { - return; - } - - for (Runnable tRunnable : GregTech_API.sBeforeGTLoad) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - if (Forestry.isModLoaded()) - // noinspection InstantiationOfUtilityClass//TODO: Refactor GT_Bees with proper state handling - new GT_Bees(); - - // Disable Low Grav regardless of config if Cleanroom is disabled. - if (!gregtechproxy.mEnableCleanroom) { - gregtechproxy.mLowGravProcessing = false; - } - - gregtechproxy.onLoad(); - - registerCircuitProgrammer(new Predicate<>() { - - private final int screwdriverOreId = OreDictionary.getOreID("craftingToolScrewdriver"); - - @Override - public boolean test(ItemStack stack) { - for (int i : OreDictionary.getOreIDs(stack)) if (i == screwdriverOreId) return true; - return false; - } - }, true); - - new GT_Loader_MetaTileEntities_Recipes().run(); - - new GT_ItemIterator().run(); - gregtechproxy.registerUnificationEntries(); - new GT_FuelLoader().run(); - - if (Mods.Waila.isModLoaded()) { - Waila.init(); - } - if (Mods.HoloInventory.isModLoaded()) { - HoloInventory.init(); - } - - LHECoolantRegistry.registerBaseCoolants(); - - GT_FML_LOGGER.debug("Registering SpaceDimensions"); - SpaceDimRegisterer.register(); - - GregTech_API.sLoadFinished = true; - GT_Log.out.println("GT_Mod: Load-Phase finished!"); - GT_Log.ore.println("GT_Mod: Load-Phase finished!"); - - for (Runnable tRunnable : GregTech_API.sAfterGTLoad) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - } - - @Mod.EventHandler - public void onPostLoad(FMLPostInitializationEvent aEvent) { - if (GregTech_API.sPostloadStarted) { - return; - } - - // Seems only used by GGFab so far - for (Runnable tRunnable : GregTech_API.sBeforeGTPostload) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - gregtechproxy.onPostLoad(); - - if (DEBUG) { - // Prints all the used MTE id and their associated TE name, turned on with -Dgt.debug=true in jvm args - final int bound = GregTech_API.METATILEENTITIES.length; - for (int i1 = 1; i1 < bound; i1++) { - if (GregTech_API.METATILEENTITIES[i1] != null) { - GT_Log.out.printf("META %d %s\n", i1, GregTech_API.METATILEENTITIES[i1].getMetaName()); - } - } - } - - gregtechproxy.registerUnificationEntries(); - - new GT_BookAndLootLoader().run(); - new GT_ItemMaxStacksizeLoader().run(); - new GT_BlockResistanceLoader().run(); - new GT_RecyclerBlacklistLoader().run(); - new GT_MinableRegistrator().run(); - new GT_FakeRecipeLoader().run(); - new GT_MachineRecipeLoader().run(); - new GT_ScrapboxDropLoader().run(); - new GT_CropLoader().run(); - new GT_Worldgenloader().run(); - new GT_CoverLoader().run(); - - GT_RecipeRegistrator.registerUsagesForMaterials( - null, - false, - new ItemStack(Blocks.planks, 1), - new ItemStack(Blocks.cobblestone, 1), - new ItemStack(Blocks.stone, 1), - new ItemStack(Items.leather, 1)); - - GT_OreDictUnificator.addItemData( - GT_ModHandler.getRecipeOutput( - null, - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L), - null, - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L), - null, - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L), - null, - null, - null), - new ItemData(Materials.Tin, 10886400L)); - GT_ModHandler.removeRecipe( - new ItemStack(Items.glowstone_dust, 1), - new ItemStack(Items.glowstone_dust, 1), - null, - new ItemStack(Items.glowstone_dust, 1), - new ItemStack(Items.glowstone_dust, 1)); - GT_ModHandler.removeRecipeDelayed( - new ItemStack(Blocks.wooden_slab, 1, 0), - new ItemStack(Blocks.wooden_slab, 1, 1), - new ItemStack(Blocks.wooden_slab, 1, 2)); - GT_ModHandler.addCraftingRecipe( - new ItemStack(Blocks.wooden_slab, 6, 0), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "WWW", 'W', new ItemStack(Blocks.planks, 1, 0) }); - - // Save a copy of these list before activateOreDictHandler(), then loop over them. - Map aMaceratorRecipeList = GT_ModHandler.getMaceratorRecipeList(); - Map aCompressorRecipeList = GT_ModHandler.getCompressorRecipeList(); - Map aExtractorRecipeList = GT_ModHandler.getExtractorRecipeList(); - Map aOreWashingRecipeList = GT_ModHandler.getOreWashingRecipeList(); - Map aThermalCentrifugeRecipeList = GT_ModHandler.getThermalCentrifugeRecipeList(); - - GT_Log.out.println( - "GT_Mod: Activating OreDictionary Handler, this can take some time, as it scans the whole OreDictionary"); - GT_FML_LOGGER.info( - "If your Log stops here, you were too impatient. Wait a bit more next time, before killing Minecraft with the Task Manager."); - - GT_PostLoad.activateOreDictHandler(); - GT_PostLoad.replaceVanillaMaterials(); - GT_PostLoad.removeIc2Recipes( - aMaceratorRecipeList, - aCompressorRecipeList, - aExtractorRecipeList, - aOreWashingRecipeList, - aThermalCentrifugeRecipeList); - - if (GT_Values.D1) { - GT_ModHandler.sSingleNonBlockDamagableRecipeList.forEach( - iRecipe -> GT_Log.out.println( - "=> " + iRecipe.getRecipeOutput() - .getDisplayName())); - } - new GT_CraftingRecipeLoader().run(); - GT_ModHandler.removeRecipeByOutput(ItemList.IC2_ForgeHammer.getWildcard(1L)); - GT_ModHandler.removeRecipeByOutput(GT_ModHandler.getIC2Item("machine", 1L)); - GT_ModHandler.addCraftingRecipe( - GT_ModHandler.getIC2Item("machine", 1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "RRR", "RwR", "RRR", 'R', OrePrefixes.plate.get(Materials.Iron) }); - - GT_PostLoad.registerFluidCannerRecipes(); - - if (Forestry.isModLoaded()) { - GT_Forestry_Compat.transferCentrifugeRecipes(); - GT_Forestry_Compat.transferSqueezerRecipes(); - } - GT_MetaTileEntity_DigitalChestBase.registerAEIntegration(); - ItemStack facade = AEApi.instance() - .definitions() - .items() - .facade() - .maybeItem() - .transform(i -> new ItemStack(i, 1, GT_Values.W)) - .orNull(); - if (facade != null) { - GregTech_API.registerCover(facade, null, new GT_Cover_FacadeAE()); - } - - Arrays - .stream( - new String[] { "blastfurnace", "blockcutter", "inductionFurnace", "generator", "windMill", "waterMill", - "solarPanel", "centrifuge", "electrolyzer", "compressor", "electroFurnace", "extractor", - "macerator", "recycler", "metalformer", "orewashingplant", "massFabricator", "replicator", }) - .map(tName -> GT_ModHandler.getIC2Item(tName, 1L)) - .forEach(GT_ModHandler::removeRecipeByOutputDelayed); - - GT_PostLoad.nerfVanillaTools(); - - // Register postea transformers - new PosteaTransformers().run(); - - /* - * Until this point most crafting recipe additions, and removals, have been buffered. Go through, execute the - * removals in bulk, and then any deferred additions. The bulk removals in particular significantly speed up the - * recipe list modifications. - */ - - @SuppressWarnings("UnstableApiUsage") // Stable enough for this project - Stopwatch stopwatch = Stopwatch.createStarted(); - GT_Log.out.println("GT_Mod: Adding buffered Recipes."); - GT_ModHandler.stopBufferingCraftingRecipes(); - // noinspection UnstableApiUsage// Stable enough for this project - GT_FML_LOGGER.info("Executed delayed Crafting Recipes (" + stopwatch.stop() + "). Have a Cake."); - - GT_Log.out.println("GT_Mod: Saving Lang File."); - new GT_MachineTooltipsLoader().run(); - GT_LanguageManager.sEnglishFile.save(); - GregTech_API.sPostloadFinished = true; - GT_Log.out.println("GT_Mod: PostLoad-Phase finished!"); - GT_Log.ore.println("GT_Mod: PostLoad-Phase finished!"); - for (Runnable tRunnable : GregTech_API.sAfterGTPostload) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - GT_PostLoad.addFakeRecipes(); - - if (GregTech_API.mOutputRF || GregTech_API.mInputRF) { - GT_Utility.checkAvailabilities(); - if (!GT_Utility.RF_CHECK) { - GregTech_API.mOutputRF = false; - GregTech_API.mInputRF = false; - } - } - - GT_PostLoad.addSolidFakeLargeBoilerFuels(); - GT_PostLoad.identifyAnySteam(); - - achievements = new GT_Achievements(); - - GT_Recipe.GTppRecipeHelper = true; - GT_Log.out.println("GT_Mod: Loading finished, de-allocating temporary Init Variables."); - GregTech_API.sBeforeGTPreload = null; - GregTech_API.sAfterGTPreload = null; - GregTech_API.sBeforeGTLoad = null; - GregTech_API.sAfterGTLoad = null; - GregTech_API.sBeforeGTPostload = null; - GregTech_API.sAfterGTPostload = null; - - GT_PostLoad.createGTtoolsCreativeTab(); - } - - @Mod.EventHandler - public void onLoadComplete(FMLLoadCompleteEvent aEvent) { - gregtechproxy.onLoadComplete(); - for (Runnable tRunnable : GregTech_API.sGTCompleteLoad) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - GregTech_API.sGTCompleteLoad = null; - GregTech_API.sFullLoadFinished = true; - } - - @Mod.EventHandler - public void onServerStarted(FMLServerStartedEvent aEvent) { - gregtechproxy.onServerStarted(); - } - - @Mod.EventHandler - public void onServerAboutToStart(FMLServerAboutToStartEvent aEvent) { - gregtechproxy.onServerAboutToStart(); - } - - @Mod.EventHandler - public void onServerStarting(FMLServerStartingEvent aEvent) { - - for (Runnable tRunnable : GregTech_API.sBeforeGTServerstart) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - gregtechproxy.onServerStarting(); - GT_ModHandler.removeAllIC2Recipes(); - GT_Log.out.println("GT_Mod: Unificating outputs of all known Recipe Types."); - ArrayList tStacks = new ArrayList<>(10000); - GT_Log.out.println("GT_Mod: IC2 Machines"); - - ic2.api.recipe.Recipes.cannerBottle.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.centrifuge.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.compressor.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.extractor.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.macerator.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.metalformerCutting.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.metalformerExtruding.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.metalformerRolling.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.matterAmplifier.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - ic2.api.recipe.Recipes.oreWashing.getRecipes() - .values() - .stream() - .map(t -> t.items) - .forEach(tStacks::addAll); - - GT_Log.out.println("GT_Mod: Dungeon Loot"); - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("dungeonChest") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("bonusChest") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("villageBlacksmith") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCrossing") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdLibrary") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCorridor") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleDispenser") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleChest") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidDesertyChest") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("mineshaftCorridor") - .getItems(new XSTR())) { - tStacks.add(tContent.theItemId); - } - GT_Log.out.println("GT_Mod: Smelting"); - - // Deal with legacy Minecraft raw types - tStacks.addAll( - FurnaceRecipes.smelting() - .getSmeltingList() - .values()); - - if (gregtechproxy.mCraftingUnification) { - GT_Log.out.println("GT_Mod: Crafting Recipes"); - for (IRecipe tRecipe : CraftingManager.getInstance() - .getRecipeList()) { - if ((tRecipe instanceof IRecipe)) { - tStacks.add(tRecipe.getRecipeOutput()); - } - } - } - for (ItemStack tOutput : tStacks) { - if (!gregtechproxy.mRegisteredOres.contains(tOutput)) { - GT_OreDictUnificator.setStack(tOutput); - } else { - logMultilineError(GT_FML_LOGGER, generateGTErr01Message(tOutput)); - tOutput.setStackDisplayName("ERROR! PLEASE CHECK YOUR LOG FOR 'GT-ERR-01'!"); - } - } - GregTech_API.mServerStarted = true; - GT_Log.out.println("GT_Mod: ServerStarting-Phase finished!"); - GT_Log.ore.println("GT_Mod: ServerStarting-Phase finished!"); - - for (Runnable tRunnable : GregTech_API.sAfterGTServerstart) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - aEvent.registerServerCommand(new GT_Command()); - aEvent.registerServerCommand(new SP_Command()); - aEvent.registerServerCommand(new SPM_Command()); - aEvent.registerServerCommand(new SpaceProject_Command()); - // Sets a new Machine Block Update Thread everytime a world is loaded - GT_Runnable_MachineBlockUpdate.initExecutorService(); - } - - public boolean isServerSide() { - return gregtechproxy.isServerSide(); - } - - public boolean isClientSide() { - return gregtechproxy.isClientSide(); - } - - public boolean isBukkitSide() { - return gregtechproxy.isBukkitSide(); - } - - public EntityPlayer getThePlayer() { - return gregtechproxy.getThePlayer(); - } - - public int addArmor(String aArmorPrefix) { - return gregtechproxy.addArmor(aArmorPrefix); - } - - public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) { - gregtechproxy.doSonictronSound(aStack, aWorld, aX, aY, aZ); - } - - @Mod.EventHandler - public void onIDChangingEvent(FMLModIdMappingEvent aEvent) { - GT_Utility.reInit(); - GT_Recipe.reInit(); - try { - for (Map gt_itemStackMap : GregTech_API.sItemStackMappings) { - GT_Utility.reMap(gt_itemStackMap); - } - for (SetMultimap gt_itemStackMap : GregTech_API.itemStackMultiMaps) { - GT_Utility.reMap(gt_itemStackMap); - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - @Mod.EventHandler - public void onServerStopping(FMLServerStoppingEvent aEvent) { - for (Runnable tRunnable : GregTech_API.sBeforeGTServerstop) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - gregtechproxy.onServerStopping(); - - for (Runnable tRunnable : GregTech_API.sAfterGTServerstop) { - try { - tRunnable.run(); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - // Interrupt IDLE Threads to close down cleanly - GT_Runnable_MachineBlockUpdate.shutdownExecutorService(); - } - - public static void logStackTrace(Throwable t) { - final StringWriter sw = new StringWriter(); - t.printStackTrace(new PrintWriter(sw)); - GT_FML_LOGGER.error(sw); - } - - private static String[] generateGTErr01Message(ItemStack stack) { - // The message is presented on a per-line basis to make possible formatting in the future easier. - return new String[] { "GT-ERR-01 at " + stack.getUnlocalizedName() + " " + stack.getDisplayName(), - "A recipe used an OreDict item as output directly, without copying the item before that. This is a typical CallByReference/CallByValue error.", - "The said item will be renamed to make the invalid recipe visible.", - "Please check all recipes that output this item, and report them to the mod that introduced the recipes.", }; - } - - @SuppressWarnings("SameParameterValue") // The method is used with one logger, but that might change in the future. - private static void logMultilineError(Logger logger, String[] errorMessageLines) { - for (String errorMessage : errorMessageLines) { - logger.error(errorMessage); - } - } -} diff --git a/src/main/java/gregtech/api/GregTechAPI.java b/src/main/java/gregtech/api/GregTechAPI.java new file mode 100644 index 0000000000..6cabb8e04c --- /dev/null +++ b/src/main/java/gregtech/api/GregTechAPI.java @@ -0,0 +1,982 @@ +package gregtech.api; + +import static gregtech.api.enums.GTValues.B; +import static gregtech.api.enums.Mods.IndustrialCraft2; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiFunction; +import java.util.function.IntFunction; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.SetMultimap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IDamagableItem; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.internal.IGTRecipeAdder; +import gregtech.api.interfaces.internal.IThaumcraftCompat; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; +import gregtech.api.items.GTGenericItem; +import gregtech.api.items.ItemCoolantCell; +import gregtech.api.items.ItemCoolantCellIC; +import gregtech.api.items.ItemTool; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.objects.GTCoverDefault; +import gregtech.api.objects.GTCoverNone; +import gregtech.api.objects.GTHashSet; +import gregtech.api.objects.GTItemStack; +import gregtech.api.threads.RunnableCableUpdate; +import gregtech.api.threads.RunnableMachineUpdate; +import gregtech.api.util.CircuitryBehavior; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTCreativeTab; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.api.util.item.ItemHolder; +import gregtech.api.world.GTWorldgen; +import gregtech.common.GTDummyWorld; +import gregtech.common.items.ItemIntegratedCircuit; + +/** + * Please do not include this File in your Mod-download as it ruins compatibility, like with the IC2-API You may just + * copy those Functions into your Code, or better call them via reflection. + *

+ * The whole API is the basic construct of my Mod. Everything is dependent on it. I change things quite often so please + * don't include any File inside your Mod, even if it is an Interface. Since some Authors were stupid enough to break + * this simple Rule, I added Version checks to enforce it. + *

+ * In these Folders are many useful Functions. You can use them via reflection if you want. I know not everything is + * compilable due to APIs of other Mods, but these are easy to fix in your Setup. + *

+ * You can use this to learn about Modding, but I would recommend simpler Mods. You may even copy-paste Code from these + * API-Files into your Mod, as I have nothing against that, but you should look exactly at what you are copying. + * + * @author Gregorius Techneticies + */ +@SuppressWarnings("unused") // API class has legitimately unused methods and members +public class GregTechAPI { + + /** + * Fixes the HashMap Mappings for ItemStacks once the Server started + *
+ *
+ * NOTE: We use wildcards generics for the key because it could be for example {@link ItemStack} or + * {@link GTItemStack} + */ + public static final Collection> sItemStackMappings = new ArrayList<>(); + public static final Collection> itemStackMultiMaps = new ArrayList<>(); + + /** + * The MetaTileEntity-ID-List-Length + */ + public static final short MAXIMUM_METATILE_IDS = Short.MAX_VALUE - 1; + /** + * My Creative Tab + */ + public static final CreativeTabs TAB_GREGTECH = new GTCreativeTab("Main", "Main"), + TAB_GREGTECH_MATERIALS = new GTCreativeTab("Materials", "Materials"), + TAB_GREGTECH_ORES = new GTCreativeTab("Ores", "Ores"); + + public static final IMetaTileEntity[] METATILEENTITIES = new IMetaTileEntity[MAXIMUM_METATILE_IDS]; + /** + * The Icon List for Covers + */ + public static final Map sCovers = new ConcurrentHashMap<>(); + /** + * The List of Cover Behaviors for the Covers + */ + public static final Map> sCoverBehaviors = new ConcurrentHashMap<>(); + /** + * The List of Circuit Behaviors for the Redstone Circuit Block + */ + public static final Map sCircuitryBehaviors = new ConcurrentHashMap<>(); + /** + * The List of Blocks, which can conduct Machine Block Updates + */ + public static final Map sMachineIDs = new ConcurrentHashMap<>(); + /** + * The Redstone Frequencies + */ + public static final Map sWirelessRedstone = new ConcurrentHashMap<>(); + /** + * The Advanced Redstone Frequencies + */ + public static final Map>> sAdvancedWirelessRedstone = new ConcurrentHashMap<>(); + + /** + * The IDSU Frequencies + */ + public static final Map sIDSUList = new ConcurrentHashMap<>(); + /** + * A List of all Books, which were created using @GT_Utility.getWrittenBook the original Title is the Key Value + */ + public static final Map sBookList = new ConcurrentHashMap<>(); + /** + * The List of all Sounds used in GT, indices are in the static Block at the bottom + * + * @deprecated Use {@link SoundResource} + */ + @Deprecated + public static final Map sSoundList = SoundResource.asSoundList(); + /** + * The List of Tools, which can be used. Accepts regular damageable Items and Electric Items + */ + public static final GTHashSet sToolList = new GTHashSet<>(), sCrowbarList = new GTHashSet<>(), + sScrewdriverList = new GTHashSet<>(), sWrenchList = new GTHashSet<>(), sSoftHammerList = new GTHashSet<>(), + sHardHammerList = new GTHashSet<>(), sWireCutterList = new GTHashSet<>(), + sSolderingToolList = new GTHashSet<>(), sSolderingMetalList = new GTHashSet<>(), + sJackhammerList = new GTHashSet<>(); + /** + * The List of Hazmat Armors + */ + public static final GTHashSet sGasHazmatList = new GTHashSet<>(), sBioHazmatList = new GTHashSet<>(), + sFrostHazmatList = new GTHashSet<>(), sHeatHazmatList = new GTHashSet<>(), sRadioHazmatList = new GTHashSet<>(), + sElectroHazmatList = new GTHashSet<>(); + + private static final Multimap sRealConfigurationList = Multimaps + .newListMultimap(new TreeMap<>(), ArrayList::new); + private static final Map> sConfigurationLists = new ConcurrentHashMap<>(); + private static final Map, BiFunction> sRealCircuitProgrammerList = new LinkedHashMap<>(); + public static final Map, BiFunction> sCircuitProgrammerList = Collections + .unmodifiableMap(sRealCircuitProgrammerList); + + /** + * The List of Dimensions, which are Whitelisted for the Teleporter. This list should not contain other Planets. + * Mystcraft Dimensions and other Dimensional Things should be allowed. Mystcraft and Twilight Forest are + * automatically considered a Dimension, without being in this List. + */ + public static final Collection sDimensionalList = new HashSet<>(); + /** + * Lists of all the active World generation Features, these are getting Initialized in Postload! + */ + public static final List sWorldgenList = new ArrayList<>(); + /** + * A List containing all the Materials, which are somehow in use by GT and therefor receive a specific Set of Items. + */ + public static final Materials[] sGeneratedMaterials = new Materials[1000]; + /** + * This is the generic Cover behavior. Used for the default Covers, which have no Behavior. + */ + public static final CoverBehavior sDefaultBehavior = new GTCoverDefault(), sNoBehavior = new GTCoverNone(); + /** + * For the API Version check + */ + public static volatile int VERSION = 509; + + /** + * @deprecated Use {@link GTValues#RA} + */ + @SuppressWarnings("DeprecatedIsStillUsed") // Still need be initialized for backward compat + @Deprecated + public static IGTRecipeAdder sRecipeAdder; + /** + * Registers Aspects to Thaumcraft. This Object might be {@code null} if Thaumcraft isn't installed. + */ + public static IThaumcraftCompat sThaumcraftCompat; + /** + * The Lists below are executed at their respective timings. Useful to do things at a particular moment in time. + * The Lists are not Threaded - a native Java interface is used for their execution. + * Add your "commands" in the constructor or in the static-code-block of your mod's Main class. + * Implement the method {@code run()}, and everything should work. + */ + public static List sBeforeGTPreload = new ArrayList<>(), sAfterGTPreload = new ArrayList<>(), + sBeforeGTLoad = new ArrayList<>(), sAfterGTLoad = new ArrayList<>(), sBeforeGTPostload = new ArrayList<>(), + sAfterGTPostload = new ArrayList<>(), sFirstWorldTick = new ArrayList<>(), + sBeforeGTServerstart = new ArrayList<>(), sAfterGTServerstart = new ArrayList<>(), + sBeforeGTServerstop = new ArrayList<>(), sAfterGTServerstop = new ArrayList<>(), + sGTBlockIconload = new ArrayList<>(), sGTItemIconload = new ArrayList<>(), sGTCompleteLoad = new ArrayList<>(); + /** + * The Icon Registers from Blocks and Items. They will get set right before the corresponding Icon Load Phase as + * executed in the Runnable List above. + */ + @SideOnly(Side.CLIENT) + public static IIconRegister sBlockIcons, sItemIcons; + /** + * The Configuration Objects + */ + public static GTConfig NEIClientFIle; + + public static int TICKS_FOR_LAG_AVERAGING = 25, MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING = 100; + /** + * Initialized by the Block creation. + */ + public static Block sBlockMachines; + + public static Block sBlockOres1, sBlockOresUb1, sBlockOresUb2, sBlockOresUb3, + /* sBlockGem, */ + sBlockMetal1, sBlockMetal2, sBlockMetal3, sBlockMetal4, sBlockMetal5, sBlockMetal6, sBlockMetal7, sBlockMetal8, + sBlockMetal9, sBlockGem1, sBlockGem2, sBlockGem3, sBlockReinforced; + public static Block sBlockGranites, sBlockConcretes, sBlockStones; + public static Block sBlockCasings1, sBlockCasings2, sBlockCasings3, sBlockCasings4, sBlockCasings5, sBlockCasings6, + sBlockCasings8, sBlockCasings9, sBlockCasings10, sBlockCasings11, sSolenoidCoilCasings; + public static Block sBlockLongDistancePipes; + public static Block sDroneRender; + public static Block sBlockFrames; + public static Block sBlockGlass1; + public static Block sBlockTintedGlass; + public static Block sLaserRender; + public static Block sWormholeRender; + /** + * Getting assigned by the Config + */ + public static boolean sTimber = true, sDrinksAlwaysDrinkable = false, sMultiThreadedSounds = false, + sDoShowAllItemsInCreative = false, sColoredGUI = true, sMachineMetalGUI = false, sMachineExplosions = true, + sMachineFlammable = true, sMachineNonWrenchExplosions = true, sMachineRainExplosions = true, + sMachineThunderExplosions = true, sMachineFireExplosions = true, sMachineWireFire = true, mOutputRF = false, + mInputRF = false, mRFExplosions = false, mServerStarted = false; + + public static int mEUtoRF = 360, mRFtoEU = 20; + + /** + * Option to not use MACHINE_METAL mixing into colors + */ + public static boolean sUseMachineMetal = false; + + public static boolean mUseOnlyGoodSolderingMaterials = false; + + private static final String aTextIC2Lower = IndustrialCraft2.ID.toLowerCase(Locale.ENGLISH); + /** + * Getting assigned by the Mod loading + */ + public static boolean sUnificationEntriesRegistered = false, sPreloadStarted = false, sPreloadFinished = false, + sLoadStarted = false, sLoadFinished = false, sPostloadStarted = false, sPostloadFinished = false, + sFullLoadFinished = false; + + private static Class sBaseMetaTileEntityClass = null; + + @SuppressWarnings("unchecked") + private static final IntFunction[] teCreators = new IntFunction[16]; + + private static final Set> dummyWorlds = new HashSet<>(); + + static { + sItemStackMappings.add(sCovers); + sItemStackMappings.add(sCoverBehaviors); + + dummyWorlds.add(GTDummyWorld.class); + tryAddDummyWorld("blockrenderer6343.client.world.DummyWorld"); + } + + private static void tryAddDummyWorld(String className) { + ClassLoader cl = GregTechAPI.class.getClassLoader(); + Class clazz; + try { + clazz = Class.forName(className, false, cl); + } catch (ReflectiveOperationException ex) { + return; + } + dummyWorlds.add(clazz); + } + + public static void addDummyWorld(Class clazz) { + dummyWorlds.add(clazz); + } + + public static boolean isDummyWorld(@Nonnull World w) { + return dummyWorlds.contains(w.getClass()); + } + + /** + * You want OreDict-Unification for YOUR Mod/Addon, when GregTech is installed? This Function is especially for YOU. + * Call this Function after the load-Phase, as I register the most of the Unification at that Phase (Redpowers + * Storageblocks are registered at postload). A recommended use of this Function is inside your Recipe-System itself + * (if you have one), as the unification then makes 100% sure, that every added non-unificated Output gets + * automatically unificated. + *

+ * I will personally make sure, that only common prefixes of Ores get registered at the Unificator, as of now there + * are: pulp, dust, dustSmall, ingot, nugget, gem, ore and block If another Mod-Author messes these up, then it's + * not my fault, and it's especially not your fault. As these are commonly used prefixes. + *

+ * This Unificator-API-Function uses the same Functions I use, for unificating Items. So if there is something + * messed up (very unlikely), then everything is messed up. + *

+ * You shouldn't use this to unificate the Inputs of your Recipes, this is only meant for the Outputs. + * + * @param aOreStack the Stack you want to get unificated. It is stackSize Sensitive. + * @return Either an unificated Stack or the stack you toss in, but it should never be null, unless you throw a + * Null-Pointer into it. + */ + public static ItemStack getUnificatedOreDictStack(ItemStack aOreStack) { + if (!GregTechAPI.sPreloadFinished) GTLog.err.println( + "GregTechAPI ERROR: " + aOreStack.getItem() + + "." + + aOreStack.getItemDamage() + + " - OreDict Unification Entries are not registered now, please call it in the postload phase."); + return GTOreDictUnificator.get(true, aOreStack); + } + + /** + * Causes a Machineblock Update This update will cause surrounding MultiBlock Machines to update their + * Configuration. You should call this Function in @Block.breakBlock and in @Block.onBlockAdded of your Machine. + * + * @param aWorld is being the World + * @param aX is the X-Coord of the update causing Block + * @param aY is the Y-Coord of the update causing Block + * @param aZ is the Z-Coord of the update causing Block + */ + public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) { + if (aWorld != null && !aWorld.isRemote && !isDummyWorld(aWorld)) { // World might be null during World-gen + RunnableMachineUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ); + return true; + } + return false; + } + + @SuppressWarnings("UnusedReturnValue") // Retains API method signature + public static boolean causeCableUpdate(World aWorld, int aX, int aY, int aZ) { + if (aWorld == null || aWorld.isRemote || isDummyWorld(aWorld)) { + return false; + } // World might be null during World-gen + RunnableCableUpdate.setCableUpdateValues(aWorld, aX, aY, aZ); + return true; + } + + /** + * Adds a Multi-Machine Block, like my Machine Casings for example. You should call @causeMachineUpdate + * in @Block.breakBlock and in {@link Block#onBlockAdded} of your registered Block. You don't need to register + * TileEntities which implement {@link IMachineBlockUpdateable} + * + * @param aBlock the Block + * @param aMeta the Metadata of the Blocks as Bitmask! -1 or ~0 for all Meta-values + */ + @SuppressWarnings("UnusedReturnValue") // Retains API method signature + public static boolean registerMachineBlock(Block aBlock, int aMeta) { + if (aBlock == null) return false; + if (GregTechAPI.sThaumcraftCompat != null) + GregTechAPI.sThaumcraftCompat.registerPortholeBlacklistedBlock(aBlock); + sMachineIDs.put(aBlock, aMeta); + return true; + } + + /** + * Like above but with boolean Parameters instead of a BitMask + */ + public static boolean registerMachineBlock(Block aBlock, boolean... aMeta) { + if (aBlock == null || aMeta == null || aMeta.length == 0) return false; + if (GregTechAPI.sThaumcraftCompat != null) + GregTechAPI.sThaumcraftCompat.registerPortholeBlacklistedBlock(aBlock); + int rMeta = 0; + for (byte i = 0; i < aMeta.length && i < 16; i++) if (aMeta[i]) rMeta |= B[i]; + sMachineIDs.put(aBlock, rMeta); + return true; + } + + /** + * if this Block is a Machine Update Conducting Block + */ + public static boolean isMachineBlock(Block aBlock, int aMeta) { + if (aBlock != null) { + Integer id = sMachineIDs.get(aBlock); + return id != null && (id & B[aMeta]) != 0; + } + return false; + } + + /** + * Creates a new Coolant Cell Item for your Nuclear Reactor + */ + public static Item constructCoolantCellItem(String aUnlocalized, String aEnglish, int aMaxStore) { + try { + return new ItemCoolantCellIC(aUnlocalized, aEnglish, aMaxStore); + } catch (Throwable e) { + /* Do nothing */ + } + try { + return new ItemCoolantCell(aUnlocalized, aEnglish, aMaxStore); + } catch (Throwable e) { + /* Do nothing */ + } + return new GTGenericItem(aUnlocalized, aEnglish, "Doesn't work as intended, this is a Bug"); + } + + /** + * Creates a new Energy Armor Item + */ + public static Item constructElectricArmorItem(String aUnlocalized, String aEnglish, int aCharge, int aTransfer, + int aTier, int aDamageEnergyCost, int aSpecials, double aArmorAbsorbtionPercentage, boolean aChargeProvider, + int aType, int aArmorIndex) { + try { + return (Item) Class.forName("gregtechmod.api.items.GT_EnergyArmorIC_Item") + .getConstructors()[0].newInstance( + aUnlocalized, + aEnglish, + aCharge, + aTransfer, + aTier, + aDamageEnergyCost, + aSpecials, + aArmorAbsorbtionPercentage, + aChargeProvider, + aType, + aArmorIndex); + } catch (Throwable e) { + /* Do nothing */ + } + try { + return (Item) Class.forName("gregtechmod.api.items.GT_EnergyArmor_Item") + .getConstructors()[0].newInstance( + aUnlocalized, + aEnglish, + aCharge, + aTransfer, + aTier, + aDamageEnergyCost, + aSpecials, + aArmorAbsorbtionPercentage, + aChargeProvider, + aType, + aArmorIndex); + } catch (Throwable e) { + /* Do nothing */ + } + return new GTGenericItem(aUnlocalized, aEnglish, "Doesn't work as intended, this is a Bug"); + } + + /** + * Creates a new Energy Battery Item + */ + public static Item constructElectricEnergyStorageItem(String aUnlocalized, String aEnglish, int aCharge, + int aTransfer, int aTier, int aEmptyID, int aFullID) { + try { + return (Item) Class.forName("gregtechmod.api.items.GT_EnergyStoreIC_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aCharge, aTransfer, aTier, aEmptyID, aFullID); + } catch (Throwable e) { + /* Do nothing */ + } + try { + return (Item) Class.forName("gregtechmod.api.items.GT_EnergyStore_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aCharge, aTransfer, aTier, aEmptyID, aFullID); + } catch (Throwable e) { + /* Do nothing */ + } + return new GTGenericItem(aUnlocalized, aEnglish, "Doesn't work as intended, this is a Bug"); + } + + /** + * Creates a new Hard Hammer Item + */ + public static ItemTool constructHardHammerItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aEntityDamage) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_HardHammer_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new Crowbar Item + */ + public static ItemTool constructCrowbarItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aEntityDamage) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_CrowbarRC_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage); + } catch (Throwable e) { + /* Do nothing */ + } + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_Crowbar_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new Wrench Item + */ + public static ItemTool constructWrenchItem(String aUnlocalized, String aEnglish, int aMaxDamage, int aEntityDamage, + int aDisChargedGTID) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_Wrench_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new electric Screwdriver Item + */ + public static ItemTool constructElectricScrewdriverItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aEntityDamage, int aDisChargedGTID) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_ScrewdriverIC_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new electric Wrench Item + */ + public static ItemTool constructElectricWrenchItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aEntityDamage, int aDisChargedGTID) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_WrenchIC_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new electric Saw Item + */ + public static ItemTool constructElectricSawItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aEntityDamage, int aToolQuality, float aToolStrength, int aEnergyConsumptionPerBlockBreak, + int aDisChargedGTID) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_SawIC_Item") + .getConstructors()[0].newInstance( + aUnlocalized, + aEnglish, + aMaxDamage, + aEntityDamage, + aToolQuality, + aToolStrength, + aEnergyConsumptionPerBlockBreak, + aDisChargedGTID); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new electric Drill Item + */ + public static ItemTool constructElectricDrillItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aEntityDamage, int aToolQuality, float aToolStrength, int aEnergyConsumptionPerBlockBreak, + int aDisChargedGTID) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_DrillIC_Item") + .getConstructors()[0].newInstance( + aUnlocalized, + aEnglish, + aMaxDamage, + aEntityDamage, + aToolQuality, + aToolStrength, + aEnergyConsumptionPerBlockBreak, + aDisChargedGTID); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new electric Soldering Tool + */ + public static ItemTool constructElectricSolderingToolItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aEntityDamage, int aDisChargedGTID) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_SolderingToolIC_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool( + aUnlocalized, + aEnglish, + "Doesn't work as intended, this is a Bug", + aMaxDamage, + aEntityDamage, + false); + } + + /** + * Creates a new empty electric Tool + */ + public static ItemTool constructEmptyElectricToolItem(String aUnlocalized, String aEnglish, int aMaxDamage, + int aChargedGTID) { + try { + return (ItemTool) Class.forName("gregtechmod.api.items.GT_EmptyToolIC_Item") + .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aChargedGTID); + } catch (Throwable e) { + /* Do nothing */ + } + return new ItemTool(aUnlocalized, aEnglish, "Doesn't work as intended, this is a Bug", aMaxDamage, 0, false); + } + + /** + * Provides a new BaseMetaTileEntity. Because some interfaces are not always loaded (Buildcraft, Universal + * Electricity) we have to use invocation at the constructor of the BaseMetaTileEntity. + */ + public static BaseMetaTileEntity constructBaseMetaTileEntity() { + if (sBaseMetaTileEntityClass == null) { + try { + return (sBaseMetaTileEntityClass = BaseMetaTileEntity.class).getDeclaredConstructor() + .newInstance(); + } catch (Throwable ignored) {} + } + + try { + return sBaseMetaTileEntityClass.getDeclaredConstructor() + .newInstance(); + } catch (Throwable e) { + GTLog.err.println("GTMod: Fatal Error occurred while initializing TileEntities, crashing Minecraft."); + e.printStackTrace(GTLog.err); + throw new RuntimeException(e); + } + } + + /** + * Register a new ItemStack as configuration circuits. Duplicates or invalid stacks will be silently ignored. + */ + public static void registerConfigurationCircuit(ItemStack aStack) { + registerConfigurationCircuit(aStack, 0); + } + + /** + * Register a new ItemStack as configuration circuits. Duplicates or invalid stacks will be silently ignored. + * + * @param minTier the minimal tier this circuit can be offered for free, e.g. normal configuration circuit is + * available in LV+ single blocks, GT++ breakthrough circuit is offered in HV+ single blocks + */ + public static void registerConfigurationCircuit(ItemStack aStack, int minTier) { + if (GTUtility.isStackInvalid(aStack)) return; + for (ItemStack tRegistered : sRealConfigurationList.values()) + if (GTUtility.areStacksEqual(tRegistered, aStack)) return; + ItemStack stack = GTUtility.copyAmount(0, aStack); + sRealConfigurationList.put(minTier, stack); + for (Map.Entry> e : sConfigurationLists.entrySet()) { + if (e.getKey() >= minTier) { + e.getValue() + .add(stack); + e.getValue() + .sort(getConfigurationCircuitsComparator()); + } + } + } + + /** + * Get a list of Configuration circuits. These stacks will have a stack size of 0. Use + * {@link #registerConfigurationCircuit(ItemStack, int)} or its overload to add to this list. + * + * @param machineTier The voltage tier where this list will be used. use Integer.MAX_VALUE to get all circuits + * @return An unmodifiable view of actual list. DO NOT MODIFY THE ItemStacks! + */ + public static List getConfigurationCircuitList(int machineTier) { + return Collections.unmodifiableList( + sConfigurationLists.computeIfAbsent( + machineTier, + (t) -> sRealConfigurationList.entries() + .stream() + .filter(e -> e.getKey() <= machineTier) + .map(Map.Entry::getValue) + .sorted(getConfigurationCircuitsComparator()) + .collect(Collectors.toList()))); + } + + public static Comparator getConfigurationCircuitsComparator() { + return Comparator.comparingInt((ItemStack is) -> is.getItem() instanceof ItemIntegratedCircuit ? 0 : 1) + .thenComparing(ItemStack::getUnlocalizedName) + .thenComparing(ItemStack::getItemDamage); + } + + public static void registerCircuitProgrammer(ItemStack stack, boolean ignoreNBT, boolean useContainer) { + registerCircuitProgrammer(rhs -> GTUtility.areStacksEqual(stack, rhs, ignoreNBT), useContainer); + } + + public static void registerCircuitProgrammer(Predicate predicate, boolean useContainer) { + sRealCircuitProgrammerList.put( + predicate, + useContainer ? (s, p) -> s.getItem() + .getContainerItem(s) : (s, p) -> s); + } + + public static void registerCircuitProgrammer(Predicate predicate, + BiFunction doDamage) { + sRealCircuitProgrammerList.put(predicate, doDamage); + } + + public static void registerCover(ItemStack aStack, ITexture aCover, CoverBehavior aBehavior) { + registerCover(aStack, aCover, (CoverBehaviorBase) aBehavior); + } + + public static void registerCover(ItemStack aStack, ITexture aCover, CoverBehaviorBase aBehavior) { + if (!sCovers.containsKey(new GTItemStack(aStack))) sCovers.put( + new GTItemStack(aStack), + aCover == null || !aCover.isValidTexture() ? Textures.BlockIcons.ERROR_RENDERING[0] : aCover); + if (aBehavior != null) sCoverBehaviors.put(new GTItemStack(aStack), aBehavior); + } + + public static void registerCoverBehavior(ItemStack aStack, CoverBehavior aBehavior) { + registerCoverBehavior(aStack, (CoverBehaviorBase) aBehavior); + } + + public static void registerCoverBehavior(ItemStack aStack, CoverBehaviorBase aBehavior) { + sCoverBehaviors.put(new GTItemStack(aStack), aBehavior == null ? sDefaultBehavior : aBehavior); + } + + /** + * Registers multiple Cover Items. I use that for the OreDict Functionality. + * + * @param aBehavior can be null + */ + public static void registerCover(Collection aStackList, ITexture aCover, CoverBehavior aBehavior) { + registerCover(aStackList, aCover, (CoverBehaviorBase) aBehavior); + } + + /** + * Registers multiple Cover Items. I use that for the OreDict Functionality. + * + * @param aBehavior can be null + */ + public static void registerCover(Collection aStackList, ITexture aCover, + CoverBehaviorBase aBehavior) { + if (aCover.isValidTexture()) aStackList.forEach(tStack -> GregTechAPI.registerCover(tStack, aCover, aBehavior)); + } + + /** + * returns a Cover behavior, guaranteed to not return null after preload + * + * @return The Cover behavior + */ + public static CoverBehaviorBase getCoverBehaviorNew(ItemStack aStack) { + if (aStack == null || aStack.getItem() == null) return sNoBehavior; + CoverBehaviorBase rCover = sCoverBehaviors.get(new GTItemStack(aStack)); + if (rCover != null) return rCover; + rCover = sCoverBehaviors.get(new GTItemStack(aStack, true)); + if (rCover != null) return rCover; + return sDefaultBehavior; + } + + /** + * returns a Cover behavior, guaranteed to not return null + */ + public static CoverBehaviorBase getCoverBehaviorNew(int aStack) { + if (aStack == 0) return sNoBehavior; + return getCoverBehaviorNew(GTUtility.intToStack(aStack)); + } + + /** + * Register a Wrench to be usable on GregTech Machines. The Wrench MUST have some kind of Durability unlike certain + * Buildcraft Wrenches. + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + *

+ * ----- + *

+ * Returning true at isDamageable was a great Idea, KingLemming. Well played. Since the OmniWrench is just a + * Single-Item-Mod, people can choose if they want your infinite durability or not. So that's not really a Problem. + * I even have a new Config to auto-disable most infinite BC Wrenches (but that one is turned off). + *

+ * One last Bug for you to fix: My Auto-registration detects Railcraft's Crowbars, Buildcraft's Wrenches and alike, + * due to their Interfaces. Guess what now became a Crowbar by accident. Try registering the Wrench at the load + * phase to prevent things like that from happening. Yes, I know that "You need to register Tools in the Load + * Phase"-Part wasn't there before this. Sorry about that. + */ + public static boolean registerWrench(ItemStack aTool) { + return registerTool(aTool, sWrenchList); + } + + /** + * Register a Crowbar to extract Covers from Machines Crowbars are NOT Wrenches btw. + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + */ + public static boolean registerCrowbar(ItemStack aTool) { + return registerTool(aTool, sCrowbarList); + } + + /** + * Register a Screwdriver to interact directly with Machines and Covers Did I mention, that it is intentionally not + * possible to make a Multi-tool, which doesn't switch ItemID (like a Mode) all the time? + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + */ + @SuppressWarnings("UnusedReturnValue") // Retains API method signature + public static boolean registerScrewdriver(ItemStack aTool) { + return registerTool(aTool, sScrewdriverList); + } + + /** + * Register a Soft Hammer to interact with Machines + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + */ + public static boolean registerSoftHammer(ItemStack aTool) { + return registerTool(aTool, sSoftHammerList); + } + + /** + * Register a Hard Hammer to interact with Machines + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + */ + public static boolean registerHardHammer(ItemStack aTool) { + return registerTool(aTool, sHardHammerList); + } + + /** + * Register a Wire Cutter to interact with Machines + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + */ + public static boolean registerWireCutter(ItemStack aTool) { + return registerTool(aTool, sWireCutterList); + } + + /** + * Register a Soldering Tool to interact with Machines + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + */ + @SuppressWarnings("UnusedReturnValue") // Retains API method signature + public static boolean registerSolderingTool(ItemStack aTool) { + return registerTool(aTool, sSolderingToolList); + } + + /** + * Register a Soldering Tin to interact with Soldering Tools + *

+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in + * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). + */ + @SuppressWarnings("UnusedReturnValue") // Retains API method signature + public static boolean registerSolderingMetal(ItemStack aTool) { + return registerTool(aTool, sSolderingMetalList); + } + + /** + * Generic Function to add Tools to the Lists. Contains all sanity Checks for Tools, like preventing one Tool from + * being registered for multiple purposes as controls would override each other. + */ + public static boolean registerTool(ItemStack aTool, Collection aToolList) { + if (aTool == null || GTUtility.isStackInList(aTool, sToolList) + || (!aTool.getItem() + .isDamageable() && !GTModHandler.isElectricItem(aTool) && !(aTool.getItem() instanceof IDamagableItem))) + return false; + aToolList.add(new GTItemStack(GTUtility.copyAmount(1, aTool))); + sToolList.add(new GTItemStack(GTUtility.copyAmount(1, aTool))); + return true; + } + + /** + * Sets the {@link IIconRegister} for Block Icons + * + * @param aIconRegister The {@link IIconRegister} Icon Register + */ + @SideOnly(Side.CLIENT) + public static void setBlockIconRegister(IIconRegister aIconRegister) { + sBlockIcons = aIconRegister; + } + + /** + * Sets the {@link IIconRegister} for Items Icons + * + * @param aIconRegister The {@link IIconRegister} Icon Register + */ + @SideOnly(Side.CLIENT) + public static void setItemIconRegister(IIconRegister aIconRegister) { + GregTechAPI.sItemIcons = aIconRegister; + } + + public static void registerTileEntityConstructor(int meta, IntFunction constructor) { + if (meta < 0 || meta > 15 || constructor == null) throw new IllegalArgumentException(); + if (teCreators[meta] != null) throw new IllegalStateException( + "previous constructor: " + teCreators[meta] + " new constructor: " + constructor + " meta:" + meta); + teCreators[meta] = constructor; + } + + public static TileEntity createTileEntity(int meta) { + meta = GTUtility.clamp(meta, 0, 15); + if (teCreators[meta] == null) return null; + return teCreators[meta].apply(meta); + } +} diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java deleted file mode 100644 index 51bf250659..0000000000 --- a/src/main/java/gregtech/api/GregTech_API.java +++ /dev/null @@ -1,999 +0,0 @@ -package gregtech.api; - -import static gregtech.api.enums.GT_Values.B; -import static gregtech.api.enums.Mods.IndustrialCraft2; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiFunction; -import java.util.function.IntFunction; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; -import com.google.common.collect.SetMultimap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IDamagableItem; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.internal.IGT_RecipeAdder; -import gregtech.api.interfaces.internal.IThaumcraftCompat; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.items.GT_CoolantCellIC_Item; -import gregtech.api.items.GT_CoolantCell_Item; -import gregtech.api.items.GT_Tool_Item; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.objects.GT_Cover_Default; -import gregtech.api.objects.GT_Cover_None; -import gregtech.api.objects.GT_HashSet; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.threads.GT_Runnable_Cable_Update; -import gregtech.api.threads.GT_Runnable_MachineBlockUpdate; -import gregtech.api.util.GT_CircuitryBehavior; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_CreativeTab; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.item.ItemHolder; -import gregtech.api.world.GT_Worldgen; -import gregtech.common.GT_DummyWorld; -import gregtech.common.items.GT_IntegratedCircuit_Item; - -/** - * Please do not include this File in your Mod-download as it ruins compatibility, like with the IC2-API You may just - * copy those Functions into your Code, or better call them via reflection. - *

- * The whole API is the basic construct of my Mod. Everything is dependent on it. I change things quite often so please - * don't include any File inside your Mod, even if it is an Interface. Since some Authors were stupid enough to break - * this simple Rule, I added Version checks to enforce it. - *

- * In these Folders are many useful Functions. You can use them via reflection if you want. I know not everything is - * compilable due to APIs of other Mods, but these are easy to fix in your Setup. - *

- * You can use this to learn about Modding, but I would recommend simpler Mods. You may even copy-paste Code from these - * API-Files into your Mod, as I have nothing against that, but you should look exactly at what you are copying. - * - * @author Gregorius Techneticies - */ -@SuppressWarnings("unused") // API class has legitimately unused methods and members -public class GregTech_API { - - /** - * Fixes the HashMap Mappings for ItemStacks once the Server started - *
- *
- * NOTE: We use wildcards generics for the key because it could be for example {@link ItemStack} or - * {@link GT_ItemStack} - */ - public static final Collection> sItemStackMappings = new ArrayList<>(); - public static final Collection> itemStackMultiMaps = new ArrayList<>(); - - /** - * The MetaTileEntity-ID-List-Length - */ - public static final short MAXIMUM_METATILE_IDS = Short.MAX_VALUE - 1; - /** - * My Creative Tab - */ - public static final CreativeTabs TAB_GREGTECH = new GT_CreativeTab("Main", "Main"), - TAB_GREGTECH_MATERIALS = new GT_CreativeTab("Materials", "Materials"), - TAB_GREGTECH_ORES = new GT_CreativeTab("Ores", "Ores"); - - public static final IMetaTileEntity[] METATILEENTITIES = new IMetaTileEntity[MAXIMUM_METATILE_IDS]; - /** - * The Icon List for Covers - */ - public static final Map sCovers = new ConcurrentHashMap<>(); - /** - * The List of Cover Behaviors for the Covers - */ - public static final Map> sCoverBehaviors = new ConcurrentHashMap<>(); - /** - * The List of Circuit Behaviors for the Redstone Circuit Block - */ - public static final Map sCircuitryBehaviors = new ConcurrentHashMap<>(); - /** - * The List of Blocks, which can conduct Machine Block Updates - */ - public static final Map sMachineIDs = new ConcurrentHashMap<>(); - /** - * The Redstone Frequencies - */ - public static final Map sWirelessRedstone = new ConcurrentHashMap<>(); - /** - * The Advanced Redstone Frequencies - */ - public static final Map>> sAdvancedWirelessRedstone = new ConcurrentHashMap<>(); - - /** - * The IDSU Frequencies - */ - public static final Map sIDSUList = new ConcurrentHashMap<>(); - /** - * A List of all Books, which were created using @GT_Utility.getWrittenBook the original Title is the Key Value - */ - public static final Map sBookList = new ConcurrentHashMap<>(); - /** - * The List of all Sounds used in GT, indices are in the static Block at the bottom - * - * @deprecated Use {@link SoundResource} - */ - @Deprecated - public static final Map sSoundList = SoundResource.asSoundList(); - /** - * The List of Tools, which can be used. Accepts regular damageable Items and Electric Items - */ - public static final GT_HashSet sToolList = new GT_HashSet<>(), sCrowbarList = new GT_HashSet<>(), - sScrewdriverList = new GT_HashSet<>(), sWrenchList = new GT_HashSet<>(), sSoftHammerList = new GT_HashSet<>(), - sHardHammerList = new GT_HashSet<>(), sWireCutterList = new GT_HashSet<>(), - sSolderingToolList = new GT_HashSet<>(), sSolderingMetalList = new GT_HashSet<>(), - sJackhammerList = new GT_HashSet<>(); - /** - * The List of Hazmat Armors - */ - public static final GT_HashSet sGasHazmatList = new GT_HashSet<>(), - sBioHazmatList = new GT_HashSet<>(), sFrostHazmatList = new GT_HashSet<>(), - sHeatHazmatList = new GT_HashSet<>(), sRadioHazmatList = new GT_HashSet<>(), - sElectroHazmatList = new GT_HashSet<>(); - - private static final Multimap sRealConfigurationList = Multimaps - .newListMultimap(new TreeMap<>(), ArrayList::new); - private static final Map> sConfigurationLists = new ConcurrentHashMap<>(); - private static final Map, BiFunction> sRealCircuitProgrammerList = new LinkedHashMap<>(); - public static final Map, BiFunction> sCircuitProgrammerList = Collections - .unmodifiableMap(sRealCircuitProgrammerList); - - /** - * The List of Dimensions, which are Whitelisted for the Teleporter. This list should not contain other Planets. - * Mystcraft Dimensions and other Dimensional Things should be allowed. Mystcraft and Twilight Forest are - * automatically considered a Dimension, without being in this List. - */ - public static final Collection sDimensionalList = new HashSet<>(); - /** - * Lists of all the active World generation Features, these are getting Initialized in Postload! - */ - public static final List sWorldgenList = new ArrayList<>(); - /** - * A List containing all the Materials, which are somehow in use by GT and therefor receive a specific Set of Items. - */ - public static final Materials[] sGeneratedMaterials = new Materials[1000]; - /** - * This is the generic Cover behavior. Used for the default Covers, which have no Behavior. - */ - public static final GT_CoverBehavior sDefaultBehavior = new GT_Cover_Default(), sNoBehavior = new GT_Cover_None(); - /** - * For the API Version check - */ - public static volatile int VERSION = 509; - - /** - * @deprecated Use {@link GT_Values#RA} - */ - @SuppressWarnings("DeprecatedIsStillUsed") // Still need be initialized for backward compat - @Deprecated - public static IGT_RecipeAdder sRecipeAdder; - /** - * Registers Aspects to Thaumcraft. This Object might be {@code null} if Thaumcraft isn't installed. - */ - public static IThaumcraftCompat sThaumcraftCompat; - /** - * The Lists below are executed at their respective timings. Useful to do things at a particular moment in time. - * The Lists are not Threaded - a native Java interface is used for their execution. - * Add your "commands" in the constructor or in the static-code-block of your mod's Main class. - * Implement the method {@code run()}, and everything should work. - */ - public static List sBeforeGTPreload = new ArrayList<>(), sAfterGTPreload = new ArrayList<>(), - sBeforeGTLoad = new ArrayList<>(), sAfterGTLoad = new ArrayList<>(), sBeforeGTPostload = new ArrayList<>(), - sAfterGTPostload = new ArrayList<>(), sFirstWorldTick = new ArrayList<>(), - sBeforeGTServerstart = new ArrayList<>(), sAfterGTServerstart = new ArrayList<>(), - sBeforeGTServerstop = new ArrayList<>(), sAfterGTServerstop = new ArrayList<>(), - sGTBlockIconload = new ArrayList<>(), sGTItemIconload = new ArrayList<>(), sGTCompleteLoad = new ArrayList<>(); - /** - * The Icon Registers from Blocks and Items. They will get set right before the corresponding Icon Load Phase as - * executed in the Runnable List above. - */ - @SideOnly(Side.CLIENT) - public static IIconRegister sBlockIcons, sItemIcons; - /** - * The Configuration Objects - */ - public static GT_Config NEIClientFIle; - - public static int TICKS_FOR_LAG_AVERAGING = 25, MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING = 100; - /** - * Initialized by the Block creation. - */ - public static Block sBlockMachines; - - public static Block sBlockOres1, sBlockOresUb1, sBlockOresUb2, sBlockOresUb3, - /* sBlockGem, */ - sBlockMetal1, sBlockMetal2, sBlockMetal3, sBlockMetal4, sBlockMetal5, sBlockMetal6, sBlockMetal7, sBlockMetal8, - sBlockMetal9, sBlockGem1, sBlockGem2, sBlockGem3, sBlockReinforced; - public static Block sBlockGranites, sBlockConcretes, sBlockStones; - public static Block sBlockCasings1, sBlockCasings2, sBlockCasings3, sBlockCasings4, sBlockCasings5, sBlockCasings6, - sBlockCasings8, sBlockCasings9, sBlockCasings10, sBlockCasings11, sSolenoidCoilCasings; - public static Block sBlockLongDistancePipes; - public static Block sDroneRender; - public static Block sBlockFrames; - public static Block sBlockGlass1; - public static Block sBlockTintedGlass; - public static Block sLaserRender; - public static Block sWormholeRender; - /** - * Getting assigned by the Config - */ - public static boolean sTimber = true, sDrinksAlwaysDrinkable = false, sMultiThreadedSounds = false, - sDoShowAllItemsInCreative = false, sColoredGUI = true, sMachineMetalGUI = false, sMachineExplosions = true, - sMachineFlammable = true, sMachineNonWrenchExplosions = true, sMachineRainExplosions = true, - sMachineThunderExplosions = true, sMachineFireExplosions = true, sMachineWireFire = true, mOutputRF = false, - mInputRF = false, mRFExplosions = false, mServerStarted = false; - - public static int mEUtoRF = 360, mRFtoEU = 20; - - /** - * Option to not use MACHINE_METAL mixing into colors - */ - public static boolean sUseMachineMetal = false; - - public static boolean mUseOnlyGoodSolderingMaterials = false; - - private static final String aTextIC2Lower = IndustrialCraft2.ID.toLowerCase(Locale.ENGLISH); - /** - * Getting assigned by the Mod loading - */ - public static boolean sUnificationEntriesRegistered = false, sPreloadStarted = false, sPreloadFinished = false, - sLoadStarted = false, sLoadFinished = false, sPostloadStarted = false, sPostloadFinished = false, - sFullLoadFinished = false; - - private static Class sBaseMetaTileEntityClass = null; - - @SuppressWarnings("unchecked") - private static final IntFunction[] teCreators = new IntFunction[16]; - - private static final Set> dummyWorlds = new HashSet<>(); - - static { - sItemStackMappings.add(sCovers); - sItemStackMappings.add(sCoverBehaviors); - - dummyWorlds.add(GT_DummyWorld.class); - tryAddDummyWorld("blockrenderer6343.client.world.DummyWorld"); - } - - private static void tryAddDummyWorld(String className) { - ClassLoader cl = GregTech_API.class.getClassLoader(); - Class clazz; - try { - clazz = Class.forName(className, false, cl); - } catch (ReflectiveOperationException ex) { - return; - } - dummyWorlds.add(clazz); - } - - public static void addDummyWorld(Class clazz) { - dummyWorlds.add(clazz); - } - - public static boolean isDummyWorld(@Nonnull World w) { - return dummyWorlds.contains(w.getClass()); - } - - /** - * You want OreDict-Unification for YOUR Mod/Addon, when GregTech is installed? This Function is especially for YOU. - * Call this Function after the load-Phase, as I register the most of the Unification at that Phase (Redpowers - * Storageblocks are registered at postload). A recommended use of this Function is inside your Recipe-System itself - * (if you have one), as the unification then makes 100% sure, that every added non-unificated Output gets - * automatically unificated. - *

- * I will personally make sure, that only common prefixes of Ores get registered at the Unificator, as of now there - * are: pulp, dust, dustSmall, ingot, nugget, gem, ore and block If another Mod-Author messes these up, then it's - * not my fault, and it's especially not your fault. As these are commonly used prefixes. - *

- * This Unificator-API-Function uses the same Functions I use, for unificating Items. So if there is something - * messed up (very unlikely), then everything is messed up. - *

- * You shouldn't use this to unificate the Inputs of your Recipes, this is only meant for the Outputs. - * - * @param aOreStack the Stack you want to get unificated. It is stackSize Sensitive. - * @return Either an unificated Stack or the stack you toss in, but it should never be null, unless you throw a - * Null-Pointer into it. - */ - public static ItemStack getUnificatedOreDictStack(ItemStack aOreStack) { - if (!GregTech_API.sPreloadFinished) GT_Log.err.println( - "GregTech_API ERROR: " + aOreStack.getItem() - + "." - + aOreStack.getItemDamage() - + " - OreDict Unification Entries are not registered now, please call it in the postload phase."); - return GT_OreDictUnificator.get(true, aOreStack); - } - - /** - * Causes a Machineblock Update This update will cause surrounding MultiBlock Machines to update their - * Configuration. You should call this Function in @Block.breakBlock and in @Block.onBlockAdded of your Machine. - * - * @param aWorld is being the World - * @param aX is the X-Coord of the update causing Block - * @param aY is the Y-Coord of the update causing Block - * @param aZ is the Z-Coord of the update causing Block - */ - public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) { - if (aWorld != null && !aWorld.isRemote && !isDummyWorld(aWorld)) { // World might be null during World-gen - GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ); - return true; - } - return false; - } - - @SuppressWarnings("UnusedReturnValue") // Retains API method signature - public static boolean causeCableUpdate(World aWorld, int aX, int aY, int aZ) { - if (aWorld == null || aWorld.isRemote || isDummyWorld(aWorld)) { - return false; - } // World might be null during World-gen - GT_Runnable_Cable_Update.setCableUpdateValues(aWorld, aX, aY, aZ); - return true; - } - - /** - * Adds a Multi-Machine Block, like my Machine Casings for example. You should call @causeMachineUpdate - * in @Block.breakBlock and in {@link Block#onBlockAdded} of your registered Block. You don't need to register - * TileEntities which implement {@link IMachineBlockUpdateable} - * - * @param aBlock the Block - * @param aMeta the Metadata of the Blocks as Bitmask! -1 or ~0 for all Meta-values - */ - @SuppressWarnings("UnusedReturnValue") // Retains API method signature - public static boolean registerMachineBlock(Block aBlock, int aMeta) { - if (aBlock == null) return false; - if (GregTech_API.sThaumcraftCompat != null) - GregTech_API.sThaumcraftCompat.registerPortholeBlacklistedBlock(aBlock); - sMachineIDs.put(aBlock, aMeta); - return true; - } - - /** - * Like above but with boolean Parameters instead of a BitMask - */ - public static boolean registerMachineBlock(Block aBlock, boolean... aMeta) { - if (aBlock == null || aMeta == null || aMeta.length == 0) return false; - if (GregTech_API.sThaumcraftCompat != null) - GregTech_API.sThaumcraftCompat.registerPortholeBlacklistedBlock(aBlock); - int rMeta = 0; - for (byte i = 0; i < aMeta.length && i < 16; i++) if (aMeta[i]) rMeta |= B[i]; - sMachineIDs.put(aBlock, rMeta); - return true; - } - - /** - * if this Block is a Machine Update Conducting Block - */ - public static boolean isMachineBlock(Block aBlock, int aMeta) { - if (aBlock != null) { - Integer id = sMachineIDs.get(aBlock); - return id != null && (id & B[aMeta]) != 0; - } - return false; - } - - /** - * Creates a new Coolant Cell Item for your Nuclear Reactor - */ - public static Item constructCoolantCellItem(String aUnlocalized, String aEnglish, int aMaxStore) { - try { - return new GT_CoolantCellIC_Item(aUnlocalized, aEnglish, aMaxStore); - } catch (Throwable e) { - /* Do nothing */ - } - try { - return new GT_CoolantCell_Item(aUnlocalized, aEnglish, aMaxStore); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Generic_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug"); - } - - /** - * Creates a new Energy Armor Item - */ - public static Item constructElectricArmorItem(String aUnlocalized, String aEnglish, int aCharge, int aTransfer, - int aTier, int aDamageEnergyCost, int aSpecials, double aArmorAbsorbtionPercentage, boolean aChargeProvider, - int aType, int aArmorIndex) { - try { - return (Item) Class.forName("gregtechmod.api.items.GT_EnergyArmorIC_Item") - .getConstructors()[0].newInstance( - aUnlocalized, - aEnglish, - aCharge, - aTransfer, - aTier, - aDamageEnergyCost, - aSpecials, - aArmorAbsorbtionPercentage, - aChargeProvider, - aType, - aArmorIndex); - } catch (Throwable e) { - /* Do nothing */ - } - try { - return (Item) Class.forName("gregtechmod.api.items.GT_EnergyArmor_Item") - .getConstructors()[0].newInstance( - aUnlocalized, - aEnglish, - aCharge, - aTransfer, - aTier, - aDamageEnergyCost, - aSpecials, - aArmorAbsorbtionPercentage, - aChargeProvider, - aType, - aArmorIndex); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Generic_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug"); - } - - /** - * Creates a new Energy Battery Item - */ - public static Item constructElectricEnergyStorageItem(String aUnlocalized, String aEnglish, int aCharge, - int aTransfer, int aTier, int aEmptyID, int aFullID) { - try { - return (Item) Class.forName("gregtechmod.api.items.GT_EnergyStoreIC_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aCharge, aTransfer, aTier, aEmptyID, aFullID); - } catch (Throwable e) { - /* Do nothing */ - } - try { - return (Item) Class.forName("gregtechmod.api.items.GT_EnergyStore_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aCharge, aTransfer, aTier, aEmptyID, aFullID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Generic_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug"); - } - - /** - * Creates a new Hard Hammer Item - */ - public static GT_Tool_Item constructHardHammerItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_HardHammer_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new Crowbar Item - */ - public static GT_Tool_Item constructCrowbarItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_CrowbarRC_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage); - } catch (Throwable e) { - /* Do nothing */ - } - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_Crowbar_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new Wrench Item - */ - public static GT_Tool_Item constructWrenchItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage, int aDisChargedGTID) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_Wrench_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new electric Screwdriver Item - */ - public static GT_Tool_Item constructElectricScrewdriverItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage, int aDisChargedGTID) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_ScrewdriverIC_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new electric Wrench Item - */ - public static GT_Tool_Item constructElectricWrenchItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage, int aDisChargedGTID) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_WrenchIC_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new electric Saw Item - */ - public static GT_Tool_Item constructElectricSawItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage, int aToolQuality, float aToolStrength, int aEnergyConsumptionPerBlockBreak, - int aDisChargedGTID) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_SawIC_Item") - .getConstructors()[0].newInstance( - aUnlocalized, - aEnglish, - aMaxDamage, - aEntityDamage, - aToolQuality, - aToolStrength, - aEnergyConsumptionPerBlockBreak, - aDisChargedGTID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new electric Drill Item - */ - public static GT_Tool_Item constructElectricDrillItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage, int aToolQuality, float aToolStrength, int aEnergyConsumptionPerBlockBreak, - int aDisChargedGTID) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_DrillIC_Item") - .getConstructors()[0].newInstance( - aUnlocalized, - aEnglish, - aMaxDamage, - aEntityDamage, - aToolQuality, - aToolStrength, - aEnergyConsumptionPerBlockBreak, - aDisChargedGTID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new electric Soldering Tool - */ - public static GT_Tool_Item constructElectricSolderingToolItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aEntityDamage, int aDisChargedGTID) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_SolderingToolIC_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - aEntityDamage, - false); - } - - /** - * Creates a new empty electric Tool - */ - public static GT_Tool_Item constructEmptyElectricToolItem(String aUnlocalized, String aEnglish, int aMaxDamage, - int aChargedGTID) { - try { - return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_EmptyToolIC_Item") - .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aChargedGTID); - } catch (Throwable e) { - /* Do nothing */ - } - return new gregtech.api.items.GT_Tool_Item( - aUnlocalized, - aEnglish, - "Doesn't work as intended, this is a Bug", - aMaxDamage, - 0, - false); - } - - /** - * Provides a new BaseMetaTileEntity. Because some interfaces are not always loaded (Buildcraft, Universal - * Electricity) we have to use invocation at the constructor of the BaseMetaTileEntity. - */ - public static BaseMetaTileEntity constructBaseMetaTileEntity() { - if (sBaseMetaTileEntityClass == null) { - try { - return (sBaseMetaTileEntityClass = BaseMetaTileEntity.class).getDeclaredConstructor() - .newInstance(); - } catch (Throwable ignored) {} - } - - try { - return sBaseMetaTileEntityClass.getDeclaredConstructor() - .newInstance(); - } catch (Throwable e) { - GT_Log.err.println("GT_Mod: Fatal Error occurred while initializing TileEntities, crashing Minecraft."); - e.printStackTrace(GT_Log.err); - throw new RuntimeException(e); - } - } - - /** - * Register a new ItemStack as configuration circuits. Duplicates or invalid stacks will be silently ignored. - */ - public static void registerConfigurationCircuit(ItemStack aStack) { - registerConfigurationCircuit(aStack, 0); - } - - /** - * Register a new ItemStack as configuration circuits. Duplicates or invalid stacks will be silently ignored. - * - * @param minTier the minimal tier this circuit can be offered for free, e.g. normal configuration circuit is - * available in LV+ single blocks, GT++ breakthrough circuit is offered in HV+ single blocks - */ - public static void registerConfigurationCircuit(ItemStack aStack, int minTier) { - if (GT_Utility.isStackInvalid(aStack)) return; - for (ItemStack tRegistered : sRealConfigurationList.values()) - if (GT_Utility.areStacksEqual(tRegistered, aStack)) return; - ItemStack stack = GT_Utility.copyAmount(0, aStack); - sRealConfigurationList.put(minTier, stack); - for (Map.Entry> e : sConfigurationLists.entrySet()) { - if (e.getKey() >= minTier) { - e.getValue() - .add(stack); - e.getValue() - .sort(getConfigurationCircuitsComparator()); - } - } - } - - /** - * Get a list of Configuration circuits. These stacks will have a stack size of 0. Use - * {@link #registerConfigurationCircuit(ItemStack, int)} or its overload to add to this list. - * - * @param machineTier The voltage tier where this list will be used. use Integer.MAX_VALUE to get all circuits - * @return An unmodifiable view of actual list. DO NOT MODIFY THE ItemStacks! - */ - public static List getConfigurationCircuitList(int machineTier) { - return Collections.unmodifiableList( - sConfigurationLists.computeIfAbsent( - machineTier, - (t) -> sRealConfigurationList.entries() - .stream() - .filter(e -> e.getKey() <= machineTier) - .map(Map.Entry::getValue) - .sorted(getConfigurationCircuitsComparator()) - .collect(Collectors.toList()))); - } - - public static Comparator getConfigurationCircuitsComparator() { - return Comparator.comparingInt((ItemStack is) -> is.getItem() instanceof GT_IntegratedCircuit_Item ? 0 : 1) - .thenComparing(ItemStack::getUnlocalizedName) - .thenComparing(ItemStack::getItemDamage); - } - - public static void registerCircuitProgrammer(ItemStack stack, boolean ignoreNBT, boolean useContainer) { - registerCircuitProgrammer(rhs -> GT_Utility.areStacksEqual(stack, rhs, ignoreNBT), useContainer); - } - - public static void registerCircuitProgrammer(Predicate predicate, boolean useContainer) { - sRealCircuitProgrammerList.put( - predicate, - useContainer ? (s, p) -> s.getItem() - .getContainerItem(s) : (s, p) -> s); - } - - public static void registerCircuitProgrammer(Predicate predicate, - BiFunction doDamage) { - sRealCircuitProgrammerList.put(predicate, doDamage); - } - - public static void registerCover(ItemStack aStack, ITexture aCover, GT_CoverBehavior aBehavior) { - registerCover(aStack, aCover, (GT_CoverBehaviorBase) aBehavior); - } - - public static void registerCover(ItemStack aStack, ITexture aCover, GT_CoverBehaviorBase aBehavior) { - if (!sCovers.containsKey(new GT_ItemStack(aStack))) sCovers.put( - new GT_ItemStack(aStack), - aCover == null || !aCover.isValidTexture() ? Textures.BlockIcons.ERROR_RENDERING[0] : aCover); - if (aBehavior != null) sCoverBehaviors.put(new GT_ItemStack(aStack), aBehavior); - } - - public static void registerCoverBehavior(ItemStack aStack, GT_CoverBehavior aBehavior) { - registerCoverBehavior(aStack, (GT_CoverBehaviorBase) aBehavior); - } - - public static void registerCoverBehavior(ItemStack aStack, GT_CoverBehaviorBase aBehavior) { - sCoverBehaviors.put(new GT_ItemStack(aStack), aBehavior == null ? sDefaultBehavior : aBehavior); - } - - /** - * Registers multiple Cover Items. I use that for the OreDict Functionality. - * - * @param aBehavior can be null - */ - public static void registerCover(Collection aStackList, ITexture aCover, GT_CoverBehavior aBehavior) { - registerCover(aStackList, aCover, (GT_CoverBehaviorBase) aBehavior); - } - - /** - * Registers multiple Cover Items. I use that for the OreDict Functionality. - * - * @param aBehavior can be null - */ - public static void registerCover(Collection aStackList, ITexture aCover, - GT_CoverBehaviorBase aBehavior) { - if (aCover.isValidTexture()) - aStackList.forEach(tStack -> GregTech_API.registerCover(tStack, aCover, aBehavior)); - } - - /** - * returns a Cover behavior, guaranteed to not return null after preload - * - * @return The Cover behavior - */ - public static GT_CoverBehaviorBase getCoverBehaviorNew(ItemStack aStack) { - if (aStack == null || aStack.getItem() == null) return sNoBehavior; - GT_CoverBehaviorBase rCover = sCoverBehaviors.get(new GT_ItemStack(aStack)); - if (rCover != null) return rCover; - rCover = sCoverBehaviors.get(new GT_ItemStack(aStack, true)); - if (rCover != null) return rCover; - return sDefaultBehavior; - } - - /** - * returns a Cover behavior, guaranteed to not return null - */ - public static GT_CoverBehaviorBase getCoverBehaviorNew(int aStack) { - if (aStack == 0) return sNoBehavior; - return getCoverBehaviorNew(GT_Utility.intToStack(aStack)); - } - - /** - * Register a Wrench to be usable on GregTech Machines. The Wrench MUST have some kind of Durability unlike certain - * Buildcraft Wrenches. - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - *

- * ----- - *

- * Returning true at isDamageable was a great Idea, KingLemming. Well played. Since the OmniWrench is just a - * Single-Item-Mod, people can choose if they want your infinite durability or not. So that's not really a Problem. - * I even have a new Config to auto-disable most infinite BC Wrenches (but that one is turned off). - *

- * One last Bug for you to fix: My Auto-registration detects Railcraft's Crowbars, Buildcraft's Wrenches and alike, - * due to their Interfaces. Guess what now became a Crowbar by accident. Try registering the Wrench at the load - * phase to prevent things like that from happening. Yes, I know that "You need to register Tools in the Load - * Phase"-Part wasn't there before this. Sorry about that. - */ - public static boolean registerWrench(ItemStack aTool) { - return registerTool(aTool, sWrenchList); - } - - /** - * Register a Crowbar to extract Covers from Machines Crowbars are NOT Wrenches btw. - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - */ - public static boolean registerCrowbar(ItemStack aTool) { - return registerTool(aTool, sCrowbarList); - } - - /** - * Register a Screwdriver to interact directly with Machines and Covers Did I mention, that it is intentionally not - * possible to make a Multi-tool, which doesn't switch ItemID (like a Mode) all the time? - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - */ - @SuppressWarnings("UnusedReturnValue") // Retains API method signature - public static boolean registerScrewdriver(ItemStack aTool) { - return registerTool(aTool, sScrewdriverList); - } - - /** - * Register a Soft Hammer to interact with Machines - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - */ - public static boolean registerSoftHammer(ItemStack aTool) { - return registerTool(aTool, sSoftHammerList); - } - - /** - * Register a Hard Hammer to interact with Machines - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - */ - public static boolean registerHardHammer(ItemStack aTool) { - return registerTool(aTool, sHardHammerList); - } - - /** - * Register a Wire Cutter to interact with Machines - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - */ - public static boolean registerWireCutter(ItemStack aTool) { - return registerTool(aTool, sWireCutterList); - } - - /** - * Register a Soldering Tool to interact with Machines - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - */ - @SuppressWarnings("UnusedReturnValue") // Retains API method signature - public static boolean registerSolderingTool(ItemStack aTool) { - return registerTool(aTool, sSolderingToolList); - } - - /** - * Register a Soldering Tin to interact with Soldering Tools - *

- * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in - * certain Cases during postload (When IToolWrench or similar Interfaces are implemented). - */ - @SuppressWarnings("UnusedReturnValue") // Retains API method signature - public static boolean registerSolderingMetal(ItemStack aTool) { - return registerTool(aTool, sSolderingMetalList); - } - - /** - * Generic Function to add Tools to the Lists. Contains all sanity Checks for Tools, like preventing one Tool from - * being registered for multiple purposes as controls would override each other. - */ - public static boolean registerTool(ItemStack aTool, Collection aToolList) { - if (aTool == null || GT_Utility.isStackInList(aTool, sToolList) - || (!aTool.getItem() - .isDamageable() && !GT_ModHandler.isElectricItem(aTool) - && !(aTool.getItem() instanceof IDamagableItem))) - return false; - aToolList.add(new GT_ItemStack(GT_Utility.copyAmount(1, aTool))); - sToolList.add(new GT_ItemStack(GT_Utility.copyAmount(1, aTool))); - return true; - } - - /** - * Sets the {@link IIconRegister} for Block Icons - * - * @param aIconRegister The {@link IIconRegister} Icon Register - */ - @SideOnly(Side.CLIENT) - public static void setBlockIconRegister(IIconRegister aIconRegister) { - sBlockIcons = aIconRegister; - } - - /** - * Sets the {@link IIconRegister} for Items Icons - * - * @param aIconRegister The {@link IIconRegister} Icon Register - */ - @SideOnly(Side.CLIENT) - public static void setItemIconRegister(IIconRegister aIconRegister) { - GregTech_API.sItemIcons = aIconRegister; - } - - public static void registerTileEntityConstructor(int meta, IntFunction constructor) { - if (meta < 0 || meta > 15 || constructor == null) throw new IllegalArgumentException(); - if (teCreators[meta] != null) throw new IllegalStateException( - "previous constructor: " + teCreators[meta] + " new constructor: " + constructor + " meta:" + meta); - teCreators[meta] = constructor; - } - - public static TileEntity createTileEntity(int meta) { - meta = GT_Utility.clamp(meta, 0, 15); - if (teCreators[meta] == null) return null; - return teCreators[meta].apply(meta); - } -} diff --git a/src/main/java/gregtech/api/damagesources/GTDamageSources.java b/src/main/java/gregtech/api/damagesources/GTDamageSources.java new file mode 100644 index 0000000000..44b80a57c9 --- /dev/null +++ b/src/main/java/gregtech/api/damagesources/GTDamageSources.java @@ -0,0 +1,119 @@ +package gregtech.api.damagesources; + +import javax.annotation.Nullable; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +public class GTDamageSources { + + public static DamageSource getElectricDamage() { + return ic2.api.info.Info.DMG_ELECTRIC; + } + + public static DamageSource getRadioactiveDamage() { + return ic2.api.info.Info.DMG_RADIATION; + } + + public static DamageSource getNukeExplosionDamage() { + return ic2.api.info.Info.DMG_NUKE_EXPLOSION; + } + + public static DamageSource getExplodingDamage() { + return new DamageSourceExploding(); + } + + public static DamageSource getCombatDamage(String aType, EntityLivingBase aPlayer, IChatComponent aDeathMessage) { + return new DamageSourceCombat(aType, aPlayer, aDeathMessage); + } + + public static DamageSource getHeatDamage() { + return new DamageSourceHeat(); + } + + public static DamageSource getFrostDamage() { + return new DamageSourceFrost(); + } + + private static class DamageSourceCombat extends EntityDamageSource { + + private final IChatComponent mDeathMessage; + + public DamageSourceCombat(String aType, EntityLivingBase aPlayer, IChatComponent aDeathMessage) { + super(aType, aPlayer); + mDeathMessage = aDeathMessage; + } + + @Override + public IChatComponent func_151519_b(EntityLivingBase aTarget) { + return mDeathMessage == null ? super.func_151519_b(aTarget) : mDeathMessage; + } + } + + private static class DamageSourceFrost extends DamageSource { + + public DamageSourceFrost() { + super("frost"); + setDifficultyScaled(); + } + + @Override + public IChatComponent func_151519_b(EntityLivingBase aTarget) { + return new ChatComponentText( + EnumChatFormatting.RED + aTarget.getCommandSenderName() + EnumChatFormatting.WHITE + " got frozen"); + } + } + + private static class DamageSourceHeat extends DamageSource { + + public DamageSourceHeat() { + super("steam"); + setFireDamage(); + setDifficultyScaled(); + } + + @Override + public IChatComponent func_151519_b(EntityLivingBase aTarget) { + return new ChatComponentText( + EnumChatFormatting.RED + aTarget.getCommandSenderName() + + EnumChatFormatting.WHITE + + " was boiled alive"); + } + } + + public static class DamageSourceHotItem extends DamageSourceHeat { + + @Nullable + private final ItemStack stack; + + public DamageSourceHotItem(@Nullable ItemStack cause) { + this.stack = cause; + } + + @Nullable + public ItemStack getDamagingStack() { + return stack; + } + } + + public static class DamageSourceExploding extends DamageSource { + + public DamageSourceExploding() { + super("exploded"); + setDamageAllowedInCreativeMode(); + setDamageBypassesArmor(); + setDamageIsAbsolute(); + } + + @Override + public IChatComponent func_151519_b(EntityLivingBase aTarget) { + return new ChatComponentText( + EnumChatFormatting.RED + aTarget.getCommandSenderName() + EnumChatFormatting.WHITE + " exploded"); + } + } +} diff --git a/src/main/java/gregtech/api/damagesources/GT_DamageSources.java b/src/main/java/gregtech/api/damagesources/GT_DamageSources.java deleted file mode 100644 index 65a2519001..0000000000 --- a/src/main/java/gregtech/api/damagesources/GT_DamageSources.java +++ /dev/null @@ -1,119 +0,0 @@ -package gregtech.api.damagesources; - -import javax.annotation.Nullable; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -public class GT_DamageSources { - - public static DamageSource getElectricDamage() { - return ic2.api.info.Info.DMG_ELECTRIC; - } - - public static DamageSource getRadioactiveDamage() { - return ic2.api.info.Info.DMG_RADIATION; - } - - public static DamageSource getNukeExplosionDamage() { - return ic2.api.info.Info.DMG_NUKE_EXPLOSION; - } - - public static DamageSource getExplodingDamage() { - return new DamageSourceExploding(); - } - - public static DamageSource getCombatDamage(String aType, EntityLivingBase aPlayer, IChatComponent aDeathMessage) { - return new DamageSourceCombat(aType, aPlayer, aDeathMessage); - } - - public static DamageSource getHeatDamage() { - return new DamageSourceHeat(); - } - - public static DamageSource getFrostDamage() { - return new DamageSourceFrost(); - } - - private static class DamageSourceCombat extends EntityDamageSource { - - private final IChatComponent mDeathMessage; - - public DamageSourceCombat(String aType, EntityLivingBase aPlayer, IChatComponent aDeathMessage) { - super(aType, aPlayer); - mDeathMessage = aDeathMessage; - } - - @Override - public IChatComponent func_151519_b(EntityLivingBase aTarget) { - return mDeathMessage == null ? super.func_151519_b(aTarget) : mDeathMessage; - } - } - - private static class DamageSourceFrost extends DamageSource { - - public DamageSourceFrost() { - super("frost"); - setDifficultyScaled(); - } - - @Override - public IChatComponent func_151519_b(EntityLivingBase aTarget) { - return new ChatComponentText( - EnumChatFormatting.RED + aTarget.getCommandSenderName() + EnumChatFormatting.WHITE + " got frozen"); - } - } - - private static class DamageSourceHeat extends DamageSource { - - public DamageSourceHeat() { - super("steam"); - setFireDamage(); - setDifficultyScaled(); - } - - @Override - public IChatComponent func_151519_b(EntityLivingBase aTarget) { - return new ChatComponentText( - EnumChatFormatting.RED + aTarget.getCommandSenderName() - + EnumChatFormatting.WHITE - + " was boiled alive"); - } - } - - public static class DamageSourceHotItem extends DamageSourceHeat { - - @Nullable - private final ItemStack stack; - - public DamageSourceHotItem(@Nullable ItemStack cause) { - this.stack = cause; - } - - @Nullable - public ItemStack getDamagingStack() { - return stack; - } - } - - public static class DamageSourceExploding extends DamageSource { - - public DamageSourceExploding() { - super("exploded"); - setDamageAllowedInCreativeMode(); - setDamageBypassesArmor(); - setDamageIsAbsolute(); - } - - @Override - public IChatComponent func_151519_b(EntityLivingBase aTarget) { - return new ChatComponentText( - EnumChatFormatting.RED + aTarget.getCommandSenderName() + EnumChatFormatting.WHITE + " exploded"); - } - } -} diff --git a/src/main/java/gregtech/api/enchants/EnchantmentEnderDamage.java b/src/main/java/gregtech/api/enchants/EnchantmentEnderDamage.java new file mode 100644 index 0000000000..6c26a54976 --- /dev/null +++ b/src/main/java/gregtech/api/enchants/EnchantmentEnderDamage.java @@ -0,0 +1,72 @@ +package gregtech.api.enchants; + +import net.minecraft.enchantment.EnchantmentDamage; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; + +import gregtech.api.enums.ConfigCategories; +import gregtech.api.enums.Materials; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTLanguageManager; + +public class EnchantmentEnderDamage extends EnchantmentDamage { + + public static EnchantmentEnderDamage INSTANCE; + + public EnchantmentEnderDamage() { + super(GTConfig.addIDConfig(ConfigCategories.IDs.enchantments, "Disjunction", 15), 2, -1); + GTLanguageManager.addStringLocalization(getName(), "Disjunction"); + Materials.Silver.setEnchantmentForTools(this, 2); + Materials.Mercury.setEnchantmentForTools(this, 3); + Materials.Electrum.setEnchantmentForTools(this, 3); + Materials.SterlingSilver.setEnchantmentForTools(this, 4); + Materials.AstralSilver.setEnchantmentForTools(this, 5); + INSTANCE = this; + } + + @Override + public int getMinEnchantability(int aLevel) { + return 5 + (aLevel - 1) * 8; + } + + @Override + public int getMaxEnchantability(int aLevel) { + return this.getMinEnchantability(aLevel) + 20; + } + + @Override + public int getMaxLevel() { + return 5; + } + + @Override + public void func_151367_b(EntityLivingBase aHurtEntity, Entity aDamagingEntity, int aLevel) { + if ((aHurtEntity instanceof EntityEnderman || aHurtEntity instanceof EntityDragon + || (aHurtEntity.getClass() + .getName() + .contains(".") + && aHurtEntity.getClass() + .getName() + .substring( + aHurtEntity.getClass() + .getName() + .lastIndexOf(".")) + .contains("Ender")))) { + // Weakness causes Endermen to not be able to teleport with GT being installed. + aHurtEntity + .addPotionEffect(new PotionEffect(Potion.weakness.id, aLevel * 200, Math.max(1, (5 * aLevel) / 7))); + // They also get Poisoned. If you have this Enchant on an Arrow, you can kill the Ender Dragon easier. + aHurtEntity + .addPotionEffect(new PotionEffect(Potion.poison.id, aLevel * 200, Math.max(1, (5 * aLevel) / 7))); + } + } + + @Override + public String getName() { + return "enchantment.damage.endermen"; + } +} diff --git a/src/main/java/gregtech/api/enchants/EnchantmentHazmat.java b/src/main/java/gregtech/api/enchants/EnchantmentHazmat.java new file mode 100644 index 0000000000..bbac780b71 --- /dev/null +++ b/src/main/java/gregtech/api/enchants/EnchantmentHazmat.java @@ -0,0 +1,56 @@ +package gregtech.api.enchants; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnumEnchantmentType; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.ConfigCategories; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTLanguageManager; + +public class EnchantmentHazmat extends Enchantment { + + public static EnchantmentHazmat INSTANCE; + + public EnchantmentHazmat() { + super(GTConfig.addIDConfig(ConfigCategories.IDs.enchantments, "Hazmat", 13), 0, EnumEnchantmentType.armor); + GTLanguageManager.addStringLocalization(getName(), "Hazmat"); + INSTANCE = this; + } + + @Override + public int getMinEnchantability(int aLevel) { + return 50; + } + + @Override + public int getMaxEnchantability(int aLevel) { + return 100; + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public boolean canApply(ItemStack aStack) { + return aStack != null && (aStack.getItem() instanceof ItemArmor); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack itemStack) { + return false; + } + + @Override + public boolean isAllowedOnBooks() { + return false; + } + + @Override + public String getName() { + return "enchantment.protection.hazmat"; + } +} diff --git a/src/main/java/gregtech/api/enchants/EnchantmentRadioactivity.java b/src/main/java/gregtech/api/enchants/EnchantmentRadioactivity.java new file mode 100644 index 0000000000..77e6f52702 --- /dev/null +++ b/src/main/java/gregtech/api/enchants/EnchantmentRadioactivity.java @@ -0,0 +1,68 @@ +package gregtech.api.enchants; + +import net.minecraft.enchantment.EnchantmentDamage; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.ConfigCategories; +import gregtech.api.enums.Materials; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class EnchantmentRadioactivity extends EnchantmentDamage { + + public static EnchantmentRadioactivity INSTANCE; + + public EnchantmentRadioactivity() { + super(GTConfig.addIDConfig(ConfigCategories.IDs.enchantments, "Radioactivity", 14), 0, -1); + GTLanguageManager.addStringLocalization(getName(), "Radioactivity"); + Materials.Plutonium.setEnchantmentForTools(this, 1) + .setEnchantmentForArmors(this, 1); + Materials.Uranium235.setEnchantmentForTools(this, 2) + .setEnchantmentForArmors(this, 2); + Materials.Plutonium241.setEnchantmentForTools(this, 3) + .setEnchantmentForArmors(this, 3); + Materials.NaquadahEnriched.setEnchantmentForTools(this, 4) + .setEnchantmentForArmors(this, 4); + Materials.Naquadria.setEnchantmentForTools(this, 5) + .setEnchantmentForArmors(this, 5); + INSTANCE = this; + } + + @Override + public int getMinEnchantability(int aLevel) { + return Integer.MAX_VALUE; + } + + @Override + public int getMaxEnchantability(int aLevel) { + return 0; + } + + @Override + public int getMaxLevel() { + return 5; + } + + @Override + public boolean canApply(ItemStack itemStack) { + return false; + } + + @Override + public boolean isAllowedOnBooks() { + return false; + } + + @Override + public void func_151367_b(EntityLivingBase aHurtEntity, Entity aDamagingEntity, int aLevel) { + GTUtility.applyRadioactivity(aHurtEntity, aLevel, 1); + } + + @Override + public String getName() { + return "enchantment.damage.radioactivity"; + } +} diff --git a/src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java b/src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java deleted file mode 100644 index 07c13b3509..0000000000 --- a/src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java +++ /dev/null @@ -1,72 +0,0 @@ -package gregtech.api.enchants; - -import net.minecraft.enchantment.EnchantmentDamage; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.boss.EntityDragon; -import net.minecraft.entity.monster.EntityEnderman; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; - -import gregtech.api.enums.ConfigCategories; -import gregtech.api.enums.Materials; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_LanguageManager; - -public class Enchantment_EnderDamage extends EnchantmentDamage { - - public static Enchantment_EnderDamage INSTANCE; - - public Enchantment_EnderDamage() { - super(GT_Config.addIDConfig(ConfigCategories.IDs.enchantments, "Disjunction", 15), 2, -1); - GT_LanguageManager.addStringLocalization(getName(), "Disjunction"); - Materials.Silver.setEnchantmentForTools(this, 2); - Materials.Mercury.setEnchantmentForTools(this, 3); - Materials.Electrum.setEnchantmentForTools(this, 3); - Materials.SterlingSilver.setEnchantmentForTools(this, 4); - Materials.AstralSilver.setEnchantmentForTools(this, 5); - INSTANCE = this; - } - - @Override - public int getMinEnchantability(int aLevel) { - return 5 + (aLevel - 1) * 8; - } - - @Override - public int getMaxEnchantability(int aLevel) { - return this.getMinEnchantability(aLevel) + 20; - } - - @Override - public int getMaxLevel() { - return 5; - } - - @Override - public void func_151367_b(EntityLivingBase aHurtEntity, Entity aDamagingEntity, int aLevel) { - if ((aHurtEntity instanceof EntityEnderman || aHurtEntity instanceof EntityDragon - || (aHurtEntity.getClass() - .getName() - .contains(".") - && aHurtEntity.getClass() - .getName() - .substring( - aHurtEntity.getClass() - .getName() - .lastIndexOf(".")) - .contains("Ender")))) { - // Weakness causes Endermen to not be able to teleport with GT being installed. - aHurtEntity - .addPotionEffect(new PotionEffect(Potion.weakness.id, aLevel * 200, Math.max(1, (5 * aLevel) / 7))); - // They also get Poisoned. If you have this Enchant on an Arrow, you can kill the Ender Dragon easier. - aHurtEntity - .addPotionEffect(new PotionEffect(Potion.poison.id, aLevel * 200, Math.max(1, (5 * aLevel) / 7))); - } - } - - @Override - public String getName() { - return "enchantment.damage.endermen"; - } -} diff --git a/src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java b/src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java deleted file mode 100644 index ecbe654698..0000000000 --- a/src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java +++ /dev/null @@ -1,56 +0,0 @@ -package gregtech.api.enchants; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnumEnchantmentType; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.ConfigCategories; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_LanguageManager; - -public class Enchantment_Hazmat extends Enchantment { - - public static Enchantment_Hazmat INSTANCE; - - public Enchantment_Hazmat() { - super(GT_Config.addIDConfig(ConfigCategories.IDs.enchantments, "Hazmat", 13), 0, EnumEnchantmentType.armor); - GT_LanguageManager.addStringLocalization(getName(), "Hazmat"); - INSTANCE = this; - } - - @Override - public int getMinEnchantability(int aLevel) { - return 50; - } - - @Override - public int getMaxEnchantability(int aLevel) { - return 100; - } - - @Override - public int getMaxLevel() { - return 1; - } - - @Override - public boolean canApply(ItemStack aStack) { - return aStack != null && (aStack.getItem() instanceof ItemArmor); - } - - @Override - public boolean canApplyAtEnchantingTable(ItemStack itemStack) { - return false; - } - - @Override - public boolean isAllowedOnBooks() { - return false; - } - - @Override - public String getName() { - return "enchantment.protection.hazmat"; - } -} diff --git a/src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java b/src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java deleted file mode 100644 index e68e55cd6a..0000000000 --- a/src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java +++ /dev/null @@ -1,68 +0,0 @@ -package gregtech.api.enchants; - -import net.minecraft.enchantment.EnchantmentDamage; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.ConfigCategories; -import gregtech.api.enums.Materials; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class Enchantment_Radioactivity extends EnchantmentDamage { - - public static Enchantment_Radioactivity INSTANCE; - - public Enchantment_Radioactivity() { - super(GT_Config.addIDConfig(ConfigCategories.IDs.enchantments, "Radioactivity", 14), 0, -1); - GT_LanguageManager.addStringLocalization(getName(), "Radioactivity"); - Materials.Plutonium.setEnchantmentForTools(this, 1) - .setEnchantmentForArmors(this, 1); - Materials.Uranium235.setEnchantmentForTools(this, 2) - .setEnchantmentForArmors(this, 2); - Materials.Plutonium241.setEnchantmentForTools(this, 3) - .setEnchantmentForArmors(this, 3); - Materials.NaquadahEnriched.setEnchantmentForTools(this, 4) - .setEnchantmentForArmors(this, 4); - Materials.Naquadria.setEnchantmentForTools(this, 5) - .setEnchantmentForArmors(this, 5); - INSTANCE = this; - } - - @Override - public int getMinEnchantability(int aLevel) { - return Integer.MAX_VALUE; - } - - @Override - public int getMaxEnchantability(int aLevel) { - return 0; - } - - @Override - public int getMaxLevel() { - return 5; - } - - @Override - public boolean canApply(ItemStack itemStack) { - return false; - } - - @Override - public boolean isAllowedOnBooks() { - return false; - } - - @Override - public void func_151367_b(EntityLivingBase aHurtEntity, Entity aDamagingEntity, int aLevel) { - GT_Utility.applyRadioactivity(aHurtEntity, aLevel, 1); - } - - @Override - public String getName() { - return "enchantment.damage.radioactivity"; - } -} diff --git a/src/main/java/gregtech/api/enums/Dyes.java b/src/main/java/gregtech/api/enums/Dyes.java index 3f1bc31c21..1dedcb6af0 100644 --- a/src/main/java/gregtech/api/enums/Dyes.java +++ b/src/main/java/gregtech/api/enums/Dyes.java @@ -7,8 +7,8 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import gregtech.api.interfaces.IColorModulationContainer; -import gregtech.api.objects.GT_ArrayList; -import gregtech.api.util.GT_Utility; +import gregtech.api.objects.GTArrayList; +import gregtech.api.util.GTUtility; public enum Dyes implements IColorModulationContainer { @@ -50,7 +50,7 @@ public enum Dyes implements IColorModulationContainer { public final short[] mRGBa; public final short[] mOriginalRGBa; public final EnumChatFormatting formatting; - private final ArrayList mFluidDyes = new GT_ArrayList<>(false, 1); + private final ArrayList mFluidDyes = new GTArrayList<>(false, 1); Dyes(int aIndex, int aR, int aG, int aB, String aName) { this(aIndex, aR, aG, aB, aName, EnumChatFormatting.GRAY); @@ -75,7 +75,7 @@ public enum Dyes implements IColorModulationContainer { } public static Dyes get(String aColor) { - Object tObject = GT_Utility.getFieldContent(Dyes.class, aColor, false, false); + Object tObject = GTUtility.getFieldContent(Dyes.class, aColor, false, false); if (tObject instanceof Dyes) return (Dyes) tObject; return _NULL; } diff --git a/src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java b/src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java deleted file mode 100644 index b65ac53499..0000000000 --- a/src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java +++ /dev/null @@ -1,626 +0,0 @@ -package gregtech.api.enums; - -import static gregtech.GT_Mod.GT_FML_LOGGER; - -import gregtech.api.interfaces.IMaterialHandler; - -public class GTNH_ExtraMaterials implements IMaterialHandler { - - public GTNH_ExtraMaterials() { - GT_FML_LOGGER.info("Registering GTNH-Materials (post Java 64kb limit)"); - Materials.add(this); - } - - /** - * This Class is for adding new Materials since Java has a Limiation of 64kb per Method / Class header - */ - public static Materials Signalum = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 2, - 255, - 255, - 255, - 0, - "Signalum", - "Signalum", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - - public static Materials Lumium = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 2, - 255, - 255, - 255, - 0, - "Lumium", - "Lumium", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials EnrichedCopper = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 2, - 255, - 255, - 255, - 0, - "EnrichedCopper", - "Enriched Copper", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials DiamondCopper = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 2, - 255, - 255, - 255, - 0, - "DiamondCopper", - "Diamond Copper", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials TarPitch = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 2, - 255, - 255, - 255, - 0, - "TarPitch", - "Tar Pitch", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials LimePure = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 0, - 0, - 255, - 255, - 255, - 0, - "LimePure", - "Pure Lime", - 0, - 0, - -1, - 0, - false, - false, - 1, - 1, - 1, - Dyes.dyeLime); - public static Materials Wimalite = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 8, - 255, - 255, - 255, - 0, - "Wimalite", - "Wimalite", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes.dyeYellow); - public static Materials Yellorite = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 8, - 255, - 255, - 255, - 0, - "Yellorite", - "Yellorite", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes.dyeYellow); - public static Materials Quantum = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 0, - 0, - 255, - 255, - 255, - 0, - "Quantum", - "Quantum", - 0, - 0, - -1, - 0, - false, - false, - 1, - 1, - 1, - Dyes.dyeWhite); - public static Materials Turquoise = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 1, - 255, - 255, - 255, - 0, - "Turquoise", - "Turquoise", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Tapazite = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 1, - 255, - 255, - 255, - 0, - "Tapazite", - "Tapazite", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes.dyeGreen); - public static Materials Thyrium = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 1 | 2 | 8, - 255, - 255, - 255, - 0, - "Thyrium", - "Thyrium", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Tourmaline = new Materials( - -1, - TextureSet.SET_RUBY, - 1.0F, - 0, - 1, - 1, - 255, - 255, - 255, - 0, - "Tourmaline", - "Tourmaline", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Spinel = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 0, - 255, - 255, - 255, - 0, - "Spinel", - "Spinel", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Starconium = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 1 | 2 | 8, - 255, - 255, - 255, - 0, - "Starconium", - "Starconium", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Sugilite = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 1, - 255, - 255, - 255, - 0, - "Sugilite", - "Sugilite", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Prismarine = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 4, - 255, - 255, - 255, - 0, - "Prismarine", - "Prismarine", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials GraveyardDirt = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1, - 255, - 255, - 255, - 0, - "GraveyardDirt", - "Graveyard Dirt", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Tennantite = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1, - 255, - 255, - 255, - 0, - "Tennantite", - "Tennantite", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Fairy = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 2, - 255, - 255, - 255, - 0, - "Fairy", - "Fairy", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Ludicrite = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 1 | 2, - 255, - 255, - 255, - 0, - "Ludicrite", - "Ludicrite", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials AquaRegia = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 0, - 255, - 255, - 255, - 0, - "AquaRegia", - "Aqua Regia", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials SolutionBlueVitriol = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 0, - 255, - 255, - 255, - 0, - "SolutionBlueVitriol", - "Blue Vitriol Solution", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials SolutionNickelSulfate = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 2, - 0, - 255, - 255, - 255, - 0, - "SolutionNickelSulfate", - "Nickel Sulfate Solution", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes._NULL); - public static Materials Lodestone = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 1 | 8, - 255, - 255, - 255, - 0, - "Lodestone", - "Lodestone", - 0, - 0, - -1, - 0, - false, - false, - 1, - 1, - 1, - Dyes._NULL); - public static Materials Luminite = new Materials( - -1, - TextureSet.SET_NONE, - 1.0F, - 0, - 1, - 1 | 8, - 250, - 250, - 250, - 0, - "Luminite", - "Luminite", - 0, - 0, - -1, - 0, - false, - false, - 3, - 1, - 1, - Dyes.dyeWhite); - - private static void initSubTags() { - SubTag.METAL.addTo(Signalum, Lumium, EnrichedCopper, DiamondCopper); - SubTag.NO_SMASHING.addTo(TarPitch); - } - - @Override - public void onMaterialsInit() { - initSubTags(); - } -} diff --git a/src/main/java/gregtech/api/enums/GTStones.java b/src/main/java/gregtech/api/enums/GTStones.java index 82d7cb90ce..af14301a5d 100644 --- a/src/main/java/gregtech/api/enums/GTStones.java +++ b/src/main/java/gregtech/api/enums/GTStones.java @@ -1,14 +1,14 @@ package gregtech.api.enums; -import gregtech.api.GregTech_API; -import gregtech.common.GT_Worldgen_Stone; +import gregtech.api.GregTechAPI; import gregtech.common.StoneBuilder; +import gregtech.common.WorldgenStone; public enum GTStones { NetherBlackgraniteTiny(new StoneBuilder().name("nether.stone.blackgranite.tiny") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(-1) .size(50) @@ -18,7 +18,7 @@ public enum GTStones { NetherBlackgraniteSmall(new StoneBuilder().name("nether.stone.blackgranite.small") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(-1) .size(100) @@ -28,7 +28,7 @@ public enum GTStones { NetherBlackgraniteMedium(new StoneBuilder().name("nether.stone.blackgranite.medium") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(-1) .size(200) @@ -38,7 +38,7 @@ public enum GTStones { NetherBlackgraniteLarge(new StoneBuilder().name("nether.stone.blackgranite.large") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(-1) .size(300) @@ -48,7 +48,7 @@ public enum GTStones { NetherBlackgraniteHuge(new StoneBuilder().name("nether.stone.blackgranite.huge") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(-1) .size(400) @@ -58,7 +58,7 @@ public enum GTStones { NetherRedgraniteTiny(new StoneBuilder().name("nether.stone.redgranite.tiny") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(-1) .size(50) @@ -68,7 +68,7 @@ public enum GTStones { NetherRedgraniteSmall(new StoneBuilder().name("nether.stone.redgranite.small") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(-1) .size(100) @@ -78,7 +78,7 @@ public enum GTStones { NetherRedgraniteMedium(new StoneBuilder().name("nether.stone.redgranite.medium") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(-1) .size(200) @@ -88,7 +88,7 @@ public enum GTStones { NetherRedgraniteLarge(new StoneBuilder().name("nether.stone.redgranite.large") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(-1) .size(300) @@ -98,7 +98,7 @@ public enum GTStones { NetherRedgraniteHuge(new StoneBuilder().name("nether.stone.redgranite.huge") .disabledByDefault() - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(-1) .size(400) @@ -108,7 +108,7 @@ public enum GTStones { NetherMarbleTiny(new StoneBuilder().name("nether.stone.marble.tiny") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(-1) .size(50) @@ -118,7 +118,7 @@ public enum GTStones { NetherMarbleSmall(new StoneBuilder().name("nether.stone.marble.small") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(-1) .size(100) @@ -128,7 +128,7 @@ public enum GTStones { NetherMarbleMedium(new StoneBuilder().name("nether.stone.marble.medium") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(-1) .size(200) @@ -138,7 +138,7 @@ public enum GTStones { NetherMarbleLarge(new StoneBuilder().name("nether.stone.marble.large") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(-1) .size(300) @@ -148,7 +148,7 @@ public enum GTStones { NetherMarbleHuge(new StoneBuilder().name("nether.stone.marble.huge") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(-1) .size(400) @@ -158,7 +158,7 @@ public enum GTStones { NetherBasaltTiny(new StoneBuilder().name("nether.stone.basalt.tiny") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(-1) .size(50) @@ -168,7 +168,7 @@ public enum GTStones { NetherBasaltSmall(new StoneBuilder().name("nether.stone.basalt.small") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(-1) .size(100) @@ -178,7 +178,7 @@ public enum GTStones { NetherBasaltMedium(new StoneBuilder().name("nether.stone.basalt.medium") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(-1) .size(200) @@ -188,7 +188,7 @@ public enum GTStones { NetherBasaltLarge(new StoneBuilder().name("nether.stone.basalt.large") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(-1) .size(300) @@ -198,7 +198,7 @@ public enum GTStones { NetherBasaltHuge(new StoneBuilder().name("nether.stone.basalt.huge") .disabledByDefault() - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(-1) .size(400) @@ -206,7 +206,7 @@ public enum GTStones { .heightRange(0, 120) .generationInVoidEnabled(false)), OverworldBlackgraniteTiny(new StoneBuilder().name("overworld.stone.blackgranite.tiny") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(0) .size(75) @@ -215,7 +215,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBlackgraniteSmall(new StoneBuilder().name("overworld.stone.blackgranite.small") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(0) .size(100) @@ -224,7 +224,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBlackgraniteMedium(new StoneBuilder().name("overworld.stone.blackgranite.medium") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(0) .size(200) @@ -233,7 +233,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBlackgraniteLarge(new StoneBuilder().name("overworld.stone.blackgranite.large") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(0) .size(300) @@ -242,7 +242,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBlackgraniteHuge(new StoneBuilder().name("overworld.stone.blackgranite.huge") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(0) .dimension(0) .size(400) @@ -251,7 +251,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldRedgraniteTiny(new StoneBuilder().name("overworld.stone.redgranite.tiny") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(0) .size(75) @@ -260,7 +260,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldRedgraniteSmall(new StoneBuilder().name("overworld.stone.redgranite.small") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(0) .size(100) @@ -269,7 +269,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldRedgraniteMedium(new StoneBuilder().name("overworld.stone.redgranite.medium") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(0) .size(200) @@ -278,7 +278,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldRedgraniteLarge(new StoneBuilder().name("overworld.stone.redgranite.large") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(0) .size(300) @@ -287,7 +287,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldRedgraniteHuge(new StoneBuilder().name("overworld.stone.redgranite.huge") - .block(GregTech_API.sBlockGranites) + .block(GregTechAPI.sBlockGranites) .blockMeta(8) .dimension(0) .size(400) @@ -296,7 +296,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldMarbleTiny(new StoneBuilder().name("overworld.stone.marble.tiny") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(0) .size(75) @@ -305,7 +305,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldMarbleSmall(new StoneBuilder().name("overworld.stone.marble.small") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(0) .size(100) @@ -314,7 +314,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldMarbleMedium(new StoneBuilder().name("overworld.stone.marble.medium") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(0) .size(200) @@ -323,7 +323,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldMarbleLarge(new StoneBuilder().name("overworld.stone.marble.large") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(0) .size(300) @@ -332,7 +332,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldMarbleHuge(new StoneBuilder().name("overworld.stone.marble.huge") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(0) .dimension(0) .size(400) @@ -341,7 +341,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBasaltTiny(new StoneBuilder().name("overworld.stone.basalt.tiny") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(0) .size(75) @@ -350,7 +350,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBasaltSmall(new StoneBuilder().name("overworld.stone.basalt.small") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(0) .size(100) @@ -359,7 +359,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBasaltMedium(new StoneBuilder().name("overworld.stone.basalt.medium") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(0) .size(200) @@ -368,7 +368,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBasaltLarge(new StoneBuilder().name("overworld.stone.basalt.large") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(0) .size(300) @@ -377,7 +377,7 @@ public enum GTStones { .generationInVoidEnabled(false)), OverworldBasaltHuge(new StoneBuilder().name("overworld.stone.basalt.huge") - .block(GregTech_API.sBlockStones) + .block(GregTechAPI.sBlockStones) .blockMeta(8) .dimension(0) .size(400) @@ -391,8 +391,8 @@ public enum GTStones { this.stone = stone; } - public GT_Worldgen_Stone addGTStone() { - return new GT_Worldgen_Stone(this.stone); + public WorldgenStone addGTStone() { + return new WorldgenStone(this.stone); } } diff --git a/src/main/java/gregtech/api/enums/GTValues.java b/src/main/java/gregtech/api/enums/GTValues.java new file mode 100644 index 0000000000..eaca14b3ee --- /dev/null +++ b/src/main/java/gregtech/api/enums/GTValues.java @@ -0,0 +1,721 @@ +package gregtech.api.enums; + +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.AQUA; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BOLD; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_AQUA; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.OBFUSCATED; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.RESET; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.animatedText; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.chain; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.text; +import static gregtech.api.enums.Mods.GregTech; +import static gregtech.api.enums.Mods.IndustrialCraft2; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Supplier; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.oredict.OreDictionary; + +import gregtech.api.fluid.GTFluidTank; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.internal.IGTMod; +import gregtech.api.interfaces.internal.IGTRecipeAdder; +import gregtech.api.net.IGT_NetworkHandler; +import gregtech.api.util.GTChunkAssociatedData; + +/** + * Made for static imports, this Class is just a Helper. + *

+ * I am doing this to have a better Table alike view on my Code, so I can change things faster using the Block Selection + * Mode of eclipse. + *

+ * Go to "Window > Preferences > Java > Editor > Content Assist > Favorites" to set static importable Constant Classes + * such as this one as AutoCompleteable. + */ +@SuppressWarnings("unused") // API Legitimately has unused fields and methods +public class GTValues { + // unused: A, C, D, G, H, I, J, K, N, O, Q, R, S, T + + // TODO: Rename Material Units to 'U' + // TODO: Rename OrePrefixes Class to 'P' + // TODO: Rename Materials Class to 'M' + + /** + * Empty String for an easier Call Hierarchy + */ + public static final String E = ""; + + /** + * The first 32 Bits + */ + @SuppressWarnings("PointlessBitwiseExpression") // Nicer source layout this way + public static final int[] B = new int[] { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8, + 1 << 9, 1 << 10, 1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, 1 << 17, 1 << 18, 1 << 19, 1 << 20, + 1 << 21, 1 << 22, 1 << 23, 1 << 24, 1 << 25, 1 << 26, 1 << 27, 1 << 28, 1 << 29, 1 << 30, 1 << 31 }; + + /** + * Renamed from "MATERIAL_UNIT" to just "M" + *

+ * This is worth exactly one normal Item. This Constant can be divided by many commonly used Numbers such as 1, 2, + * 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, ... 64 or 81 without losing precision and is for that + * reason used as Unit of Amount. But it is also small enough to be multiplied with larger Numbers. + *

+ * This is used to determine the amount of Material contained inside a prefixed Ore. For example Nugget = M / 9 as + * it contains out of 1/9 of an Ingot. + */ + public static final long M = 3628800; + + /** + * Renamed from "FLUID_MATERIAL_UNIT" to just "L" + *

+ * Fluid per Material Unit (Prime Factors: 3 * 3 * 2 * 2 * 2 * 2) + */ + public static final long L = 144; + + /** + * The Item WildCard Tag. Even shorter than the "-1" of the past + */ + public static final short W = OreDictionary.WILDCARD_VALUE; + + /** + * The Voltage Tiers. Use this Array instead of the old named Voltage Variables + */ + public static final long[] V = new long[] { 8L, 32L, 128L, 512L, 2048L, 8192L, 32_768L, 131_072L, 524_288L, + 2_097_152L, 8_388_608L, 33_554_432L, 134_217_728L, 536_870_912L, Integer.MAX_VALUE - 7, + // Error tier to prevent out of bounds errors. Not really a real tier (for now). + 8_589_934_592L }; + + /** + * The Voltage Practical. These are recipe voltage you should use if you expect the recipe to use a full amp of that + * tier. These leave a bit of headroom for cable and transformer losses, but not enough to make it a great gain. + */ + // this will correctly map ULV to 7. + public static final long[] VP = Arrays.stream(V) + .map( + i -> BigInteger.valueOf(i) + .multiply(BigInteger.valueOf(30)) + .divide(BigInteger.valueOf(32)) + .longValueExact()) + .toArray(); + // TODO:Adding that in coremod!!! + // TODO:tier 14,15 wires and transformers only (not even cables !!!) + // TODO:tier 12,13 the above + batteries, battery buffers, (maybe cables,12 also works for machines) + // TODO:tier 10,11 the above + chargers and other machines, (cables would be nice) + // TODO:tier 9 machines and batteries + + // TODO:AND ALL THE MATERIALS... for that + // TODO:LIST OF MACHINES WITH POINTLESS TIERS (unless you implement some other tiering mechanism like reducing eu + // cost if time=1tick) + // Macerator/Compressor/Furnace... and for cheap recipes any + + /** + * Array of Maximum Amperes at given Tier index + *

+ * keeping Voltage*Amps < Integer.MAX_VALUE-7 for machines (and tier logic 4x EUt 2/ time) + *

+ *

+ * AMV[4]= max amps at tier 4 + *

+ */ + public static final long[] AatV = new long[] { 268435455, 67108863, 16777215, 4194303, 1048575, 262143, 65535, + 16383, 4095, 1023, 255, 63, 15, 3, 1, 1 }; + /** + * The short Names for the Voltages + */ + public static final String[] VN = new String[] { "ULV", // 0 + "LV", // 1 + "MV", // 2 + "HV", // 3 + "EV", // 4 + "IV", // 5 + "LuV", // 6 + "ZPM", // 7 + "UV", // 8 + "UHV", // 9 + "UEV", // 10 + "UIV", // 11 + "UMV", // 12 + "UXV", // 13 + "MAX", // 14 + "MAX+" // 15 + }; + + /** + * The long Names for the Voltages + */ + public static final String[] VOLTAGE_NAMES = new String[] { "Ultra Low Voltage", // 0 + "Low Voltage", // 1 + "Medium Voltage", // 2 + "High Voltage", // 3 + "Extreme Voltage", // 4 + "Insane Voltage", // 5 + "Ludicrous Voltage", // 6 + "ZPM Voltage", // 7 + "Ultimate Voltage", // 8 + "Ultimate High Voltage", // 9 + "Ultimate Extreme Voltage", // 10 + "Ultimate Insane Voltage", // 11 + "Ultimate Mega Voltage", // 12 + "Ultimate Extended Mega Voltage", // 13 + "Maximum Voltage", // 14 + "Error Voltage, report this" // 15 + }; + + public static final String[] TIER_COLORS = new String[] { EnumChatFormatting.RED.toString(), // ULV, 0 + EnumChatFormatting.GRAY.toString(), // LV, 1 + EnumChatFormatting.GOLD.toString(), // MV, 2 + EnumChatFormatting.YELLOW.toString(), // HV, 3 + EnumChatFormatting.DARK_GRAY.toString(), // EV, 4 + EnumChatFormatting.GREEN.toString(), // IV, 5 + EnumChatFormatting.LIGHT_PURPLE.toString(), // LuV, 6 + EnumChatFormatting.AQUA.toString(), // ZPM, 7 + EnumChatFormatting.DARK_GREEN.toString(), // UV, 8 + EnumChatFormatting.DARK_RED.toString(), // UHV, 9 + EnumChatFormatting.DARK_PURPLE.toString(), // UEV, 10 + EnumChatFormatting.DARK_BLUE.toString() + EnumChatFormatting.BOLD, // UIV, 11 + EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // UMV, 12 + EnumChatFormatting.DARK_RED.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // UXV, 13 + EnumChatFormatting.WHITE.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // MAX, 14 + EnumChatFormatting.WHITE.toString() + EnumChatFormatting.BOLD + + EnumChatFormatting.UNDERLINE + + EnumChatFormatting.ITALIC, // MAX+, 15 + }; + + /** + * This way it is possible to have a Call Hierarchy of NullPointers in ItemStack based Functions, and also because + * most of the time I don't know what kind of Data Type the "null" stands for + */ + public static final ItemStack NI = null; + /** + * This way it is possible to have a Call Hierarchy of NullPointers in FluidStack based Functions, and also because + * most of the time I don't know what kind of Data Type the "null" stands for + */ + public static final FluidStack NF = null; + + /** + * File Paths and Resource Paths + */ + @Deprecated + public static final String TEX_DIR = "textures/"; + @Deprecated + public static final String RES_PATH = GregTech.getResourcePath(TEX_DIR); + @Deprecated + public static final String RES_PATH_GUI = GregTech.getResourcePath("textures", "gui/"); + @Deprecated + public static final String RES_PATH_ITEM = GregTech.getResourcePath(); + @Deprecated + public static final String RES_PATH_BLOCK = GregTech.getResourcePath(); + @Deprecated + public static final String RES_PATH_ENTITY = GregTech.getResourcePath("textures", "entity/"); + @Deprecated + public static final String RES_PATH_ASPECTS = GregTech.getResourcePath("textures", "aspects/"); + @Deprecated + public static final String RES_PATH_MODEL = GregTech.getResourcePath("textures", "models/"); + @Deprecated + public static final String RES_PATH_IC2 = IndustrialCraft2.getResourcePath(); + + /** + * NBT String Keys + */ + public static final class NBT { + + public static final String COLOR = "gt.color", // Integer + COVERS = "gt.covers", // String + CUSTOM_NAME = "name", // String + DISPLAY = "gt.display", // String + TIER = "gt.tier", // Number + FACING = "gt.facing", // Byte + LOCK_UPGRADE = "gt.locked", // Boolean + MATERIAL = "gt.material", // String containing the Material Name. + MODE = "gt.mode", // Number + ALLOWED_MODES = "gt.amode", // Number + MTE_ID = "gt.mte.id", // Containing the MTE ID + MTE_REG = "gt.mte.reg", // Containing the MTE Registry ID + OWNER = "gt.owner", // String + OWNER_UUID = "gt.ownerUuid", // UUID (String) + + // Machines + ACTIVE = "gt.active", // Boolean + FLUID_OUT = "gt.fluidout", // Output Fluid + ITEM_OUT = "gt.itemout", // Output Item + PARALLEL = "gt.parallel", // Number + TANK_CAPACITY = "gt.tankcap", // Number + TANK_IN = "gt.tank.in.", // FluidStack + TANK_OUT = "gt.tank.out.", // FluidStack + TEXTURE_FOLDER = "gt.texture.folder", // String + INV_INPUT_SIZE = "gt.invsize.in", // Number + INV_OUTPUT_SIZE = "gt.invsize.out", // Number + INV_INPUT_LIST = "gt.invlist.in", // NBT List + INV_OUTPUT_LIST = "gt.invlist.out", // NBT List + VOLTAGE = "gt.voltage", // Number + AMPERAGE = "gt.amperage", // Number + STORED_ENERGY = "gt.stored.energy", // Number + MAXIMUM_ENERGY = "gt.maximum.energy", // Number + EUT_CONSUMPTION = "gt.eut.consumption", // Number + BURN_TIME_LEFT = "gt.burn.time.left", // Number + TOTAL_BURN_TIME = "gt.total.burn.time", // Number + ALLOWED_WORK = "gt.allowed.work", // Boolean + TASKS = "gt.tasks", // Compound + + // MultiBlock + STRUCTURE_OK = "gt.structure.ok", ROTATION = "gt.eRotation", FLIP = "gt.eFlip", TARGET = "gt.target", // Boolean + TARGET_X = "gt.target.x", // Number + TARGET_Y = "gt.target.y", // Number + TARGET_Z = "gt.target.z", // Number + LOCKED_FLUID = "gt.locked.fluid", // String + LOCKED_INVENTORY = "gt.locked.inv", // String + LOCKED_INVENTORY_INDEX = "gt.locked.inv.index", // Number + UPGRADE_INVENTORY_SIZE = "gt.invsize.upg", // String + UPGRADE_INVENTORY_UUID = "gt.invuuid.upg", // String + UPGRADE_INVENTORY_NAME = "gt.invname.upg", // String + UPGRADE_INVENTORIES_INPUT = "gt.invlist.upg.in", // NBT List + UPGRADE_INVENTORIES_OUTPUT = "gt.invlist.upg.out", // NBT List + UPGRADE_TANK_CAPACITY = "gt.tank.cap.upg", // Long + UPGRADE_TANK_COUNT = "gt.tank.ct.upg", // Int + UPGRADE_TANK_CAPACITY_MULTIPLIER = "gt.tank.cap.mult.upg", // Long + UPGRADE_TANK_UUID = "gt.tankuuid.upg", // String + UPGRADE_TANK_NAME = "gt.tankname.upg", // String + UPGRADE_TANKS_INPUT = "gt.tanklist.upg.in", // NBT List + UPGRADE_TANKS_OUTPUT = "gt.tanklist.upg.out", // NBT List + UPGRADE_TANKS_PREFIX = "gt.tank.upg", // NBT Tag + UPGRADE_AMPERAGE = "gt.amp.upg", // Long + SEPARATE_INPUTS = "gt.separate.inputs", // Boolean + VOIDING_MODE = "gt.voiding.mode", // String + BATCH_MODE = "gt.batch.mode", // Boolean + RECIPE_LOCK = "gt.recipe.lock", // Boolean + + // Logic + POWER_LOGIC = "gt.pow.logic", // NBT Tag + POWER_LOGIC_STORED_ENERGY = "gt.pow.energy", // Number + POWER_LOGIC_ENERGY_CAPACITY = "gt.pow.energy.cap", // Number + POWER_LOGIC_VOLTAGE = "gt.pow.volt", // Number + POWER_LOGIC_AMPERAGE = "gt.pow.amp", // Number + POWER_LOGIC_TYPE = "gt.pow.type", // Number + empty_ = ""; + } + + /** The Color White as RGB Short Array. */ + public static final short[] UNCOLORED_RGBA = { 255, 255, 255, 255 }; + /** The Color White as simple Integer (0x00ffffff). */ + public static final int UNCOLORED = 0x00ffffff; + + /** + * Sides + */ + public static final byte SIDE_BOTTOM = 0, SIDE_DOWN = 0, SIDE_TOP = 1, SIDE_UP = 1, SIDE_NORTH = 2, // Also a Side + // with a + // stupidly + // mirrored + // Texture + SIDE_SOUTH = 3, SIDE_WEST = 4, SIDE_EAST = 5, // Also a Side with a stupidly mirrored Texture + SIDE_ANY = 6, SIDE_UNKNOWN = 6, SIDE_INVALID = 6, SIDE_INSIDE = 6, SIDE_UNDEFINED = 6; + + /** Compass alike Array for the proper ordering of North, East, South and West. */ + public static final byte[] COMPASS_DIRECTIONS = { SIDE_NORTH, SIDE_EAST, SIDE_SOUTH, SIDE_WEST }; + + /** + * An Array containing all Sides which follow the Condition, in order to iterate over them for example. + */ + public static final byte[] ALL_SIDES = { 0, 1, 2, 3, 4, 5, 6 }, ALL_VALID_SIDES = { 0, 1, 2, 3, 4, 5 }; + + /** + * For Facing Checks. + */ + public static final boolean[] INVALID_SIDES = { false, false, false, false, false, false, true }, + VALID_SIDES = { true, true, true, true, true, true, false }; + + /** + * Side->Offset Mappings. + */ + public static final byte[] OFFX = { 0, 0, 0, 0, -1, +1, 0 }, OFFY = { -1, +1, 0, 0, 0, 0, 0 }, + OFFZ = { 0, 0, -1, +1, 0, 0, 0 }; + + /** + * Side->Opposite Mappings. + **/ + public static final byte[] OPOS = { 1, 0, 3, 2, 5, 4, 6 }; + + /** + * [Facing,Side]->Side Mappings for Blocks, which don't face up- and downwards. 0 = bottom, 1 = top, 2 = left, 3 = + * front, 4 = right, 5 = back, 6 = undefined. + */ + public static final byte[][] FACING_ROTATIONS = { { 0, 1, 2, 3, 4, 5, 6 }, { 0, 1, 2, 3, 4, 5, 6 }, + { 0, 1, 3, 5, 4, 2, 6 }, { 0, 1, 5, 3, 2, 4, 6 }, { 0, 1, 2, 4, 3, 5, 6 }, { 0, 1, 4, 2, 5, 3, 6 }, + { 0, 1, 2, 3, 4, 5, 6 } }; + + /** + * The Mod Object itself. That is the GTMod-Object. It's needed to open GUI's and similar. + */ + public static IGTMod GT; + /** + * Use this Object to add Recipes. (Recipe Adder) + */ + public static IGTRecipeAdder RA; + /** + * For Internal Usage (Network) + */ + public static IGT_NetworkHandler NW; + /** + * Control percentage of filled 3x3 chunks. Lower number means less oreveins spawn + */ + public static int oreveinPercentage; + /** + * Control number of attempts to find a valid orevein. Generally this maximum limit isn't hit, selecting a vein is + * cheap + */ + public static int oreveinAttempts; + /** + * Control number of attempts to place a valid ore vein. + *

+ * If a vein wasn't placed due to height restrictions, completely in the water, etc, another attempt is tried. + *

+ */ + public static int oreveinMaxPlacementAttempts; + /** + * Whether to place small ores as placer ores for an orevein + */ + public static boolean oreveinPlacerOres; + /** + * Multiplier to control how many placer ores get generated. + */ + public static int oreveinPlacerOresMultiplier; + /** + * Not really Constants, but they set using the Config and therefore should be constant (those are for the Debug + * Mode) + */ + public static boolean D1 = false, D2 = false; + /** + * Debug parameter for cleanroom testing. + */ + public static boolean debugCleanroom = false; + /** + * Debug parameter for driller testing. + */ + public static boolean debugDriller = false; + /** + * Debug parameter for world generation. Tracks chunks added/removed from run queue. + */ + public static boolean debugWorldGen = false; + /** + * Debug parameter for orevein generation. + */ + public static boolean debugOrevein = false; + /** + * Debug parameter for small ore generation. + */ + public static boolean debugSmallOres = false; + /** + * Debug parameter for stones generation. + */ + public static boolean debugStones = false; + /** + * Debug parameter for single block pump + */ + public static boolean debugBlockPump = false; + /** + * Debug parameter for single block miner + */ + public static boolean debugBlockMiner = false; + /** + * Debug parameter for entity cramming reduction + */ + public static boolean debugEntityCramming = false; + /** + * Debug parameter for {@link GTChunkAssociatedData} + */ + public static boolean debugWorldData = false; + /** + * Parameter if multi tile entities (MuTEs) should be enabled in the pack. Turned off by default until + * implementation is done. + */ + public static boolean enableMultiTileEntities = false; + /** + * Number of ticks between sending sound packets to clients for electric machines. Default is 1.5 seconds. Trying to + * mitigate lag and FPS drops. + */ + public static int ticksBetweenSounds = 30; + /** + * If you have to give something a World Parameter but there is no World... (Dummy World) + */ + public static World DW; + + /** + * This will prevent NEI from crashing but spams the Log. + */ + public static boolean allow_broken_recipemap = false; + /** + * This will set the blacklist for the world accelerator in TE mode. + */ + public static String[] blacklistedTileEntiyClassNamesForWA = new String[] { + "com.rwtema.extrautils.tileentity.enderquarry.TileEntityEnderQuarry", + "advsolar.common.tiles.TileEntityUltimateSolarPanel", "advsolar.common.tiles.TileEntitySolarPanel", + "advsolar.common.tiles.TileEntityQuantumSolarPanel", "advsolar.common.tiles.TileEntityHybridSolarPanel", + "advsolar.common.tiles.TileEntityAdvancedSolarPanel", "com.supsolpans.tiles.TileAdminSolarPanel", + "com.supsolpans.tiles.TilePhotonicSolarPanel", "com.supsolpans.tiles.TileSingularSolarPanel", + "com.supsolpans.tiles.TileSpectralSolarPanel", "emt.tile.solar.air.TileEntityAirSolar", + "emt.tile.solar.air.TileEntityDoubleAirSolar", "emt.tile.solar.air.TileEntityTripleAirSolar", + "emt.tile.solar.air.TileEntityQuadrupleAirSolar", "emt.tile.solar.air.TileEntityQuintupleAirSolar", + "emt.tile.solar.air.TileEntitySextupleAirSolar", "emt.tile.solar.air.TileEntitySeptupleAirSolar", + "emt.tile.solar.air.TileEntityOctupleAirSolar", "emt.tile.solar.compressed.TileEntityCompressedSolar", + "emt.tile.solar.compressed.TileEntityDoubleCompressedSolar", + "emt.tile.solar.compressed.TileEntityTripleCompressedSolar", + "emt.tile.solar.compressed.TileEntityQuadrupleAirSolar", + "emt.tile.solar.compressed.TileEntityQuintupleAirSolar", "emt.tile.solar.compressed.TileEntitySextupleAirSolar", + "emt.tile.solar.compressed.TileEntitySeptupleAirSolar", "emt.tile.solar.compressed.TileEntityOctupleAirSolar", + "emt.tile.solar.dark.TileEntityDarkSolar", "emt.tile.solar.dark.TileEntityDoubleDarkSolar", + "emt.tile.solar.dark.TileEntityTripleDarkSolar", "emt.tile.solar.dark.TileEntityQuadrupleAirSolar", + "emt.tile.solar.dark.TileEntityQuintupleAirSolar", "emt.tile.solar.dark.TileEntitySextupleAirSolar", + "emt.tile.solar.dark.TileEntitySeptupleAirSolar", "emt.tile.solar.dark.TileEntityOctupleAirSolar", + "emt.tile.solar.earth.TileEntityDoubleEarthSolar", "emt.tile.solar.earth.TileEntityEarthSolar", + "emt.tile.solar.earth.TileEntityTripleEarthSolar", "emt.tile.solar.earth.TileEntityQuadrupleAirSolar", + "emt.tile.solar.earth.TileEntityQuintupleAirSolar", "emt.tile.solar.earth.TileEntitySextupleAirSolar", + "emt.tile.solar.earth.TileEntitySeptupleAirSolar", "emt.tile.solar.earth.TileEntityOctupleAirSolar", + "emt.tile.solar.fire.TileEntityDoubleFireSolar", "emt.tile.solar.fire.TileEntityFireSolar", + "emt.tile.solar.fire.TileEntityTripleFireSolar", "emt.tile.solar.fire.TileEntityQuadrupleAirSolar", + "emt.tile.solar.fire.TileEntityQuintupleAirSolar", "emt.tile.solar.fire.TileEntitySextupleAirSolar", + "emt.tile.solar.fire.TileEntitySeptupleAirSolar", "emt.tile.solar.fire.TileEntityOctupleAirSolar", + "emt.tile.solar.order.TileEntityDoubleOrderSolar", "emt.tile.solar.order.TileEntityOrderSolar", + "emt.tile.solar.order.TileEntityTripleOrderSolar", "emt.tile.solar.order.TileEntityQuadrupleAirSolar", + "emt.tile.solar.order.TileEntityQuintupleAirSolar", "emt.tile.solar.order.TileEntitySextupleAirSolar", + "emt.tile.solar.order.TileEntitySeptupleAirSolar", "emt.tile.solar.order.TileEntityOctupleAirSolar", + "emt.tile.solar.water.TileEntityDoubleWaterSolar", "emt.tile.solar.water.TileEntityTripleWaterSolar", + "emt.tile.solar.water.TileEntityWaterSolar", "emt.tile.solar.water.TileEntityQuadrupleAirSolar", + "emt.tile.solar.water.TileEntityQuintupleAirSolar", "emt.tile.solar.water.TileEntitySextupleAirSolar", + "emt.tile.solar.water.TileEntitySeptupleAirSolar", "emt.tile.solar.water.TileEntityOctupleAirSolar", + "com.lulan.compactkineticgenerators.tileentity.TileCkgE", + "com.lulan.compactkineticgenerators.tileentity.TileCkgH", + "com.lulan.compactkineticgenerators.tileentity.TileCkgL", + "com.lulan.compactkineticgenerators.tileentity.TileCkgM", + "com.lulan.compactkineticgenerators.tileentity.TileCkwaE", + "com.lulan.compactkineticgenerators.tileentity.TileCkwaH", + "com.lulan.compactkineticgenerators.tileentity.TileCkwaL", + "com.lulan.compactkineticgenerators.tileentity.TileCkwaM", + "com.lulan.compactkineticgenerators.tileentity.TileCkwmE", + "com.lulan.compactkineticgenerators.tileentity.TileCkwmH", + "com.lulan.compactkineticgenerators.tileentity.TileCkwmL", + "com.lulan.compactkineticgenerators.tileentity.TileCkwmM", "com.supsolpans.tiles.TileSpectralSolarPanel", + "com.supsolpans.tiles.TileSingularSolarPanel", "com.supsolpans.tiles.TileAdminSolarPanel", + "com.supsolpans.tiles.TilePhotonicSolarPanel", "gtPlusPlus.core.tileentities.general.TileEntityFishTrap", + "gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest", + "net.bdew.gendustry.machines.apiary.TileApiary", "goodgenerator.blocks.tileEntity.EssentiaHatch", + "magicbees.tileentity.TileEntityApimancersDrainerCommon", + "magicbees.tileentity.TileEntityApimancersDrainerGT" }; + /** + * This will set the percentage how much ReinforcedGlass is Allowed in Cleanroom Walls. + */ + public static float cleanroomGlass = 5.0f; + /** + * This will let machines such as drills and pumps chunkload their work area. + */ + public static boolean enableChunkloaders = true; + /** + * This will make all chunkloading machines act as World Anchors (true) or Passive Anchors (false) + */ + public static boolean alwaysReloadChunkloaders = false; + + public static boolean debugChunkloaders = false; + public static boolean cls_enabled; + public static final Set mCTMEnabledBlock = new HashSet<>(); + public static final Set mCTMDisabledBlock = new HashSet<>(); + + public static final int STEAM_PER_WATER = 160; + /** + * If true, then digital chest with AE2 storage bus will be accessible only through AE2 + */ + public static boolean disableDigitalChestsExternalAccess = false; + + public static boolean lateConfigSave = true; + public static boolean worldTickHappened = false; + + public static final int[] emptyIntArray = new int[0]; + + public static final IFluidTank[] emptyFluidTank = new IFluidTank[0]; + public static final GTFluidTank[] emptyFluidTankGT = new GTFluidTank[0]; + public static final FluidTankInfo[] emptyFluidTankInfo = new FluidTankInfo[0]; + public static final FluidStack[] emptyFluidStack = new FluidStack[0]; + public static final ItemStack[] emptyItemStackArray = new ItemStack[0]; + public static final IIconContainer[] emptyIconContainerArray = new IIconContainer[3]; + + /** + * Pretty formatting for author names. + */ + public static final String Colen = "" + EnumChatFormatting.DARK_RED + + EnumChatFormatting.BOLD + + EnumChatFormatting.ITALIC + + EnumChatFormatting.UNDERLINE + + "C" + + EnumChatFormatting.GOLD + + EnumChatFormatting.BOLD + + EnumChatFormatting.ITALIC + + EnumChatFormatting.UNDERLINE + + "o" + + EnumChatFormatting.GREEN + + EnumChatFormatting.BOLD + + EnumChatFormatting.ITALIC + + EnumChatFormatting.UNDERLINE + + "l" + + EnumChatFormatting.DARK_AQUA + + EnumChatFormatting.BOLD + + EnumChatFormatting.ITALIC + + EnumChatFormatting.UNDERLINE + + "e" + + EnumChatFormatting.DARK_PURPLE + + EnumChatFormatting.BOLD + + EnumChatFormatting.ITALIC + + EnumChatFormatting.UNDERLINE + + "n"; + + public static final String AuthorColen = "Author: " + Colen; + public static final String AuthorKuba = "Author: " + EnumChatFormatting.DARK_RED + + EnumChatFormatting.BOLD + + "k" + + EnumChatFormatting.RED + + EnumChatFormatting.BOLD + + "u" + + EnumChatFormatting.GOLD + + EnumChatFormatting.BOLD + + "b" + + EnumChatFormatting.YELLOW + + EnumChatFormatting.BOLD + + "a" + + EnumChatFormatting.DARK_GREEN + + EnumChatFormatting.BOLD + + "6" + + EnumChatFormatting.GREEN + + EnumChatFormatting.BOLD + + "0" + + EnumChatFormatting.AQUA + + EnumChatFormatting.BOLD + + "0" + + EnumChatFormatting.DARK_AQUA + + EnumChatFormatting.BOLD + + "0"; + + public static final String AuthorBlueWeabo = "Author: " + EnumChatFormatting.BLUE + + EnumChatFormatting.BOLD + + "Blue" + + EnumChatFormatting.AQUA + + EnumChatFormatting.BOLD + + "Weabo"; + + public static final String Authorminecraft7771 = "Author: " + EnumChatFormatting.BLUE + + EnumChatFormatting.LIGHT_PURPLE + + "minecraft7771"; + + public static final Supplier AuthorCloud = chain( + text("Author: " + EnumChatFormatting.AQUA + EnumChatFormatting.BOLD), + animatedText( + "C", + 1, + 500, + DARK_AQUA + OBFUSCATED + BOLD + "X" + RESET + AQUA + BOLD, + DARK_AQUA + "\u238B" + RESET + AQUA + BOLD, + DARK_AQUA + OBFUSCATED + BOLD + "X" + RESET + AQUA + BOLD, + DARK_AQUA + "\u0B83" + RESET + AQUA + BOLD, + DARK_AQUA + OBFUSCATED + BOLD + "X" + RESET + AQUA + BOLD, + DARK_AQUA + BOLD + "\u29BC" + RESET + AQUA + BOLD), + text(EnumChatFormatting.AQUA + EnumChatFormatting.BOLD.toString() + "loud" + EnumChatFormatting.RESET), + animatedText( + " ", + 1, + 500, + DARK_AQUA + OBFUSCATED + BOLD + "X", + DARK_AQUA + "\u238B", + DARK_AQUA + OBFUSCATED + BOLD + "X", + DARK_AQUA + "\u0B83", + DARK_AQUA + OBFUSCATED + BOLD + "X", + DARK_AQUA + BOLD + "\u29BC")); + + public static final String AuthorQuerns = "Author: " + EnumChatFormatting.RED + "Querns"; + public static final String AuthorSilverMoon = "Author: " + EnumChatFormatting.AQUA + "SilverMoon"; + public static final String AuthorTheEpicGamer274 = "Author: " + "TheEpicGamer274"; + public static final String AuthorFourIsTheNumber = "Author: " + EnumChatFormatting.LIGHT_PURPLE + + EnumChatFormatting.ITALIC + + "Four" + + EnumChatFormatting.WHITE + + EnumChatFormatting.ITALIC + + "Is" + + EnumChatFormatting.LIGHT_PURPLE + + EnumChatFormatting.ITALIC + + "The" + + EnumChatFormatting.WHITE + + EnumChatFormatting.ITALIC + + "Number"; + public static final String Ollie = "" + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + "Ollie"; + public static final String authorBaps = "Author: " + EnumChatFormatting.GOLD + + "Ba" + + EnumChatFormatting.LIGHT_PURPLE + + "ps"; + + public static final String AuthorEvgenWarGold = "" + EnumChatFormatting.RED + + EnumChatFormatting.BOLD + + "Evgen" + + EnumChatFormatting.BLUE + + EnumChatFormatting.BOLD + + "War" + + EnumChatFormatting.GOLD + + EnumChatFormatting.BOLD + + "Gold"; + public static final String AuthorVolence = "Author: " + EnumChatFormatting.AQUA + "Volence"; + + public static final String AuthorEigenRaven = "Author: " + EnumChatFormatting.DARK_PURPLE + + "Eigen" + + EnumChatFormatting.BOLD + + "Raven"; + + public static final String AuthorNotAPenguin = "Author: " + EnumChatFormatting.WHITE + + EnumChatFormatting.BOLD + + "Not" + + EnumChatFormatting.AQUA + + EnumChatFormatting.BOLD + + "APenguin"; + + // 7.5F comes from GT_Tool_Turbine_Large#getBaseDamage() given huge turbines are the most efficient now. + public static double getMaxPlasmaTurbineEfficiencyFromMaterial(Materials material) { + return (5F + (7.5F + material.mToolQuality)) / 10.0; + } + + // Called once in GT_Client on world load, has to be called late so that Materials is populated. + public static void calculateMaxPlasmaTurbineEfficiency() { + + ArrayList effArray = new ArrayList<>(); + + // Iteration seems to work but need to check turbine as all items appear null. + for (Materials material : Materials.values()) { + effArray.add(getMaxPlasmaTurbineEfficiencyFromMaterial(material)); + } + + maxPlasmaTurbineEfficiency = Collections.max(effArray); + } + + private static double maxPlasmaTurbineEfficiency; + + public static double getMaxPlasmaTurbineEfficiency() { + return maxPlasmaTurbineEfficiency; + } + + private static final long[] EXPLOSION_LOOKUP_V = new long[] { V[0], V[1], V[2], V[3], V[4], V[4] * 2, V[5], V[6], + V[7], V[8], V[8] * 2, V[9], V[10], V[11], V[12], V[12] * 2, V[13], V[14], V[15] }; + private static final float[] EXPLOSION_LOOKUP_POWER = new float[] { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F, 6.0F, 7.0F, 8.0F, + 9.0F, 10.0F, 11.0F, 12.0F, 13.0F, 14.0F, 15.0F, 16.0F, 17.0F, 18.0F, 19.0F, 20.0F }; + + public static float getExplosionPowerForVoltage(long voltage) { + for (int i = 0; i < EXPLOSION_LOOKUP_V.length; i++) { + if (voltage < EXPLOSION_LOOKUP_V[i]) { + return EXPLOSION_LOOKUP_POWER[i]; + } + } + return EXPLOSION_LOOKUP_POWER[EXPLOSION_LOOKUP_POWER.length - 1]; + } +} diff --git a/src/main/java/gregtech/api/enums/GTVoltageIndex.java b/src/main/java/gregtech/api/enums/GTVoltageIndex.java deleted file mode 100644 index c5c2c215b0..0000000000 --- a/src/main/java/gregtech/api/enums/GTVoltageIndex.java +++ /dev/null @@ -1,22 +0,0 @@ -package gregtech.api.enums; - -public class GTVoltageIndex { - - public final static int ULV = 0; - public final static int LV = 1; - public final static int MV = 2; - public final static int HV = 3; - public final static int EV = 4; - public final static int IV = 5; - public final static int LuV = 6; - public final static int ZPM = 7; - public final static int UV = 8; - public final static int UHV = 9; - public final static int UEV = 10; - public final static int UIV = 11; - public final static int UMV = 12; - public final static int UXV = 13; - public final static int MAX = 14; - - private GTVoltageIndex() {} -} diff --git a/src/main/java/gregtech/api/enums/GT_HatchElement.java b/src/main/java/gregtech/api/enums/GT_HatchElement.java deleted file mode 100644 index 3a21d5a2eb..0000000000 --- a/src/main/java/gregtech/api/enums/GT_HatchElement.java +++ /dev/null @@ -1,112 +0,0 @@ -package gregtech.api.enums; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.util.GT_ExoticEnergyInputHelper; -import gregtech.api.util.IGT_HatchAdder; - -public enum GT_HatchElement implements IHatchElement { - - Muffler(GT_MetaTileEntity_MultiBlockBase::addMufflerToMachineList, GT_MetaTileEntity_Hatch_Muffler.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mMufflerHatches.size(); - } - }, - Maintenance(GT_MetaTileEntity_MultiBlockBase::addMaintenanceToMachineList, - GT_MetaTileEntity_Hatch_Maintenance.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mMaintenanceHatches.size(); - } - }, - InputHatch(GT_MetaTileEntity_MultiBlockBase::addInputHatchToMachineList, GT_MetaTileEntity_Hatch_Input.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mInputHatches.size(); - } - }, - InputBus(GT_MetaTileEntity_MultiBlockBase::addInputBusToMachineList, GT_MetaTileEntity_Hatch_InputBus.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mInputBusses.size(); - } - }, - OutputHatch(GT_MetaTileEntity_MultiBlockBase::addOutputHatchToMachineList, GT_MetaTileEntity_Hatch_Output.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mOutputHatches.size(); - } - }, - OutputBus(GT_MetaTileEntity_MultiBlockBase::addOutputBusToMachineList, GT_MetaTileEntity_Hatch_OutputBus.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mOutputBusses.size(); - } - }, - Energy(GT_MetaTileEntity_MultiBlockBase::addEnergyInputToMachineList, GT_MetaTileEntity_Hatch_Energy.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mEnergyHatches.size(); - } - }, - Dynamo(GT_MetaTileEntity_MultiBlockBase::addDynamoToMachineList, GT_MetaTileEntity_Hatch_Dynamo.class) { - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.mDynamoHatches.size(); - } - }, - ExoticEnergy(GT_MetaTileEntity_MultiBlockBase::addExoticEnergyInputToMachineList) { - - @Override - public List> mteClasses() { - return GT_ExoticEnergyInputHelper.getAllClasses(); - } - - @Override - public long count(GT_MetaTileEntity_MultiBlockBase t) { - return t.getExoticEnergyHatches() - .size(); - } - },; - - private final List> mteClasses; - private final IGT_HatchAdder adder; - - @SafeVarargs - GT_HatchElement(IGT_HatchAdder adder, - Class... mteClasses) { - this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); - this.adder = adder; - } - - @Override - public List> mteClasses() { - return mteClasses; - } - - public IGT_HatchAdder adder() { - return adder; - } -} diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java deleted file mode 100644 index 88972e45fc..0000000000 --- a/src/main/java/gregtech/api/enums/GT_Values.java +++ /dev/null @@ -1,720 +0,0 @@ -package gregtech.api.enums; - -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.AQUA; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BOLD; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_AQUA; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.OBFUSCATED; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.RESET; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.animatedText; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.chain; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.text; -import static gregtech.api.enums.Mods.GregTech; -import static gregtech.api.enums.Mods.IndustrialCraft2; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Supplier; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidTank; -import net.minecraftforge.oredict.OreDictionary; - -import gregtech.api.fluid.FluidTankGT; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.internal.IGT_Mod; -import gregtech.api.interfaces.internal.IGT_RecipeAdder; -import gregtech.api.net.IGT_NetworkHandler; - -/** - * Made for static imports, this Class is just a Helper. - *

- * I am doing this to have a better Table alike view on my Code, so I can change things faster using the Block Selection - * Mode of eclipse. - *

- * Go to "Window > Preferences > Java > Editor > Content Assist > Favorites" to set static importable Constant Classes - * such as this one as AutoCompleteable. - */ -@SuppressWarnings("unused") // API Legitimately has unused fields and methods -public class GT_Values { - // unused: A, C, D, G, H, I, J, K, N, O, Q, R, S, T - - // TODO: Rename Material Units to 'U' - // TODO: Rename OrePrefixes Class to 'P' - // TODO: Rename Materials Class to 'M' - - /** - * Empty String for an easier Call Hierarchy - */ - public static final String E = ""; - - /** - * The first 32 Bits - */ - @SuppressWarnings("PointlessBitwiseExpression") // Nicer source layout this way - public static final int[] B = new int[] { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8, - 1 << 9, 1 << 10, 1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, 1 << 17, 1 << 18, 1 << 19, 1 << 20, - 1 << 21, 1 << 22, 1 << 23, 1 << 24, 1 << 25, 1 << 26, 1 << 27, 1 << 28, 1 << 29, 1 << 30, 1 << 31 }; - - /** - * Renamed from "MATERIAL_UNIT" to just "M" - *

- * This is worth exactly one normal Item. This Constant can be divided by many commonly used Numbers such as 1, 2, - * 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, ... 64 or 81 without losing precision and is for that - * reason used as Unit of Amount. But it is also small enough to be multiplied with larger Numbers. - *

- * This is used to determine the amount of Material contained inside a prefixed Ore. For example Nugget = M / 9 as - * it contains out of 1/9 of an Ingot. - */ - public static final long M = 3628800; - - /** - * Renamed from "FLUID_MATERIAL_UNIT" to just "L" - *

- * Fluid per Material Unit (Prime Factors: 3 * 3 * 2 * 2 * 2 * 2) - */ - public static final long L = 144; - - /** - * The Item WildCard Tag. Even shorter than the "-1" of the past - */ - public static final short W = OreDictionary.WILDCARD_VALUE; - - /** - * The Voltage Tiers. Use this Array instead of the old named Voltage Variables - */ - public static final long[] V = new long[] { 8L, 32L, 128L, 512L, 2048L, 8192L, 32_768L, 131_072L, 524_288L, - 2_097_152L, 8_388_608L, 33_554_432L, 134_217_728L, 536_870_912L, Integer.MAX_VALUE - 7, - // Error tier to prevent out of bounds errors. Not really a real tier (for now). - 8_589_934_592L }; - - /** - * The Voltage Practical. These are recipe voltage you should use if you expect the recipe to use a full amp of that - * tier. These leave a bit of headroom for cable and transformer losses, but not enough to make it a great gain. - */ - // this will correctly map ULV to 7. - public static final long[] VP = Arrays.stream(V) - .map( - i -> BigInteger.valueOf(i) - .multiply(BigInteger.valueOf(30)) - .divide(BigInteger.valueOf(32)) - .longValueExact()) - .toArray(); - // TODO:Adding that in coremod!!! - // TODO:tier 14,15 wires and transformers only (not even cables !!!) - // TODO:tier 12,13 the above + batteries, battery buffers, (maybe cables,12 also works for machines) - // TODO:tier 10,11 the above + chargers and other machines, (cables would be nice) - // TODO:tier 9 machines and batteries - - // TODO:AND ALL THE MATERIALS... for that - // TODO:LIST OF MACHINES WITH POINTLESS TIERS (unless you implement some other tiering mechanism like reducing eu - // cost if time=1tick) - // Macerator/Compressor/Furnace... and for cheap recipes any - - /** - * Array of Maximum Amperes at given Tier index - *

- * keeping Voltage*Amps < Integer.MAX_VALUE-7 for machines (and tier logic 4x EUt 2/ time) - *

- *

- * AMV[4]= max amps at tier 4 - *

- */ - public static final long[] AatV = new long[] { 268435455, 67108863, 16777215, 4194303, 1048575, 262143, 65535, - 16383, 4095, 1023, 255, 63, 15, 3, 1, 1 }; - /** - * The short Names for the Voltages - */ - public static final String[] VN = new String[] { "ULV", // 0 - "LV", // 1 - "MV", // 2 - "HV", // 3 - "EV", // 4 - "IV", // 5 - "LuV", // 6 - "ZPM", // 7 - "UV", // 8 - "UHV", // 9 - "UEV", // 10 - "UIV", // 11 - "UMV", // 12 - "UXV", // 13 - "MAX", // 14 - "MAX+" // 15 - }; - - /** - * The long Names for the Voltages - */ - public static final String[] VOLTAGE_NAMES = new String[] { "Ultra Low Voltage", // 0 - "Low Voltage", // 1 - "Medium Voltage", // 2 - "High Voltage", // 3 - "Extreme Voltage", // 4 - "Insane Voltage", // 5 - "Ludicrous Voltage", // 6 - "ZPM Voltage", // 7 - "Ultimate Voltage", // 8 - "Ultimate High Voltage", // 9 - "Ultimate Extreme Voltage", // 10 - "Ultimate Insane Voltage", // 11 - "Ultimate Mega Voltage", // 12 - "Ultimate Extended Mega Voltage", // 13 - "Maximum Voltage", // 14 - "Error Voltage, report this" // 15 - }; - - public static final String[] TIER_COLORS = new String[] { EnumChatFormatting.RED.toString(), // ULV, 0 - EnumChatFormatting.GRAY.toString(), // LV, 1 - EnumChatFormatting.GOLD.toString(), // MV, 2 - EnumChatFormatting.YELLOW.toString(), // HV, 3 - EnumChatFormatting.DARK_GRAY.toString(), // EV, 4 - EnumChatFormatting.GREEN.toString(), // IV, 5 - EnumChatFormatting.LIGHT_PURPLE.toString(), // LuV, 6 - EnumChatFormatting.AQUA.toString(), // ZPM, 7 - EnumChatFormatting.DARK_GREEN.toString(), // UV, 8 - EnumChatFormatting.DARK_RED.toString(), // UHV, 9 - EnumChatFormatting.DARK_PURPLE.toString(), // UEV, 10 - EnumChatFormatting.DARK_BLUE.toString() + EnumChatFormatting.BOLD, // UIV, 11 - EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // UMV, 12 - EnumChatFormatting.DARK_RED.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // UXV, 13 - EnumChatFormatting.WHITE.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // MAX, 14 - EnumChatFormatting.WHITE.toString() + EnumChatFormatting.BOLD - + EnumChatFormatting.UNDERLINE - + EnumChatFormatting.ITALIC, // MAX+, 15 - }; - - /** - * This way it is possible to have a Call Hierarchy of NullPointers in ItemStack based Functions, and also because - * most of the time I don't know what kind of Data Type the "null" stands for - */ - public static final ItemStack NI = null; - /** - * This way it is possible to have a Call Hierarchy of NullPointers in FluidStack based Functions, and also because - * most of the time I don't know what kind of Data Type the "null" stands for - */ - public static final FluidStack NF = null; - - /** - * File Paths and Resource Paths - */ - @Deprecated - public static final String TEX_DIR = "textures/"; - @Deprecated - public static final String RES_PATH = GregTech.getResourcePath(TEX_DIR); - @Deprecated - public static final String RES_PATH_GUI = GregTech.getResourcePath("textures", "gui/"); - @Deprecated - public static final String RES_PATH_ITEM = GregTech.getResourcePath(); - @Deprecated - public static final String RES_PATH_BLOCK = GregTech.getResourcePath(); - @Deprecated - public static final String RES_PATH_ENTITY = GregTech.getResourcePath("textures", "entity/"); - @Deprecated - public static final String RES_PATH_ASPECTS = GregTech.getResourcePath("textures", "aspects/"); - @Deprecated - public static final String RES_PATH_MODEL = GregTech.getResourcePath("textures", "models/"); - @Deprecated - public static final String RES_PATH_IC2 = IndustrialCraft2.getResourcePath(); - - /** - * NBT String Keys - */ - public static final class NBT { - - public static final String COLOR = "gt.color", // Integer - COVERS = "gt.covers", // String - CUSTOM_NAME = "name", // String - DISPLAY = "gt.display", // String - TIER = "gt.tier", // Number - FACING = "gt.facing", // Byte - LOCK_UPGRADE = "gt.locked", // Boolean - MATERIAL = "gt.material", // String containing the Material Name. - MODE = "gt.mode", // Number - ALLOWED_MODES = "gt.amode", // Number - MTE_ID = "gt.mte.id", // Containing the MTE ID - MTE_REG = "gt.mte.reg", // Containing the MTE Registry ID - OWNER = "gt.owner", // String - OWNER_UUID = "gt.ownerUuid", // UUID (String) - - // Machines - ACTIVE = "gt.active", // Boolean - FLUID_OUT = "gt.fluidout", // Output Fluid - ITEM_OUT = "gt.itemout", // Output Item - PARALLEL = "gt.parallel", // Number - TANK_CAPACITY = "gt.tankcap", // Number - TANK_IN = "gt.tank.in.", // FluidStack - TANK_OUT = "gt.tank.out.", // FluidStack - TEXTURE_FOLDER = "gt.texture.folder", // String - INV_INPUT_SIZE = "gt.invsize.in", // Number - INV_OUTPUT_SIZE = "gt.invsize.out", // Number - INV_INPUT_LIST = "gt.invlist.in", // NBT List - INV_OUTPUT_LIST = "gt.invlist.out", // NBT List - VOLTAGE = "gt.voltage", // Number - AMPERAGE = "gt.amperage", // Number - STORED_ENERGY = "gt.stored.energy", // Number - MAXIMUM_ENERGY = "gt.maximum.energy", // Number - EUT_CONSUMPTION = "gt.eut.consumption", // Number - BURN_TIME_LEFT = "gt.burn.time.left", // Number - TOTAL_BURN_TIME = "gt.total.burn.time", // Number - ALLOWED_WORK = "gt.allowed.work", // Boolean - TASKS = "gt.tasks", // Compound - - // MultiBlock - STRUCTURE_OK = "gt.structure.ok", ROTATION = "gt.eRotation", FLIP = "gt.eFlip", TARGET = "gt.target", // Boolean - TARGET_X = "gt.target.x", // Number - TARGET_Y = "gt.target.y", // Number - TARGET_Z = "gt.target.z", // Number - LOCKED_FLUID = "gt.locked.fluid", // String - LOCKED_INVENTORY = "gt.locked.inv", // String - LOCKED_INVENTORY_INDEX = "gt.locked.inv.index", // Number - UPGRADE_INVENTORY_SIZE = "gt.invsize.upg", // String - UPGRADE_INVENTORY_UUID = "gt.invuuid.upg", // String - UPGRADE_INVENTORY_NAME = "gt.invname.upg", // String - UPGRADE_INVENTORIES_INPUT = "gt.invlist.upg.in", // NBT List - UPGRADE_INVENTORIES_OUTPUT = "gt.invlist.upg.out", // NBT List - UPGRADE_TANK_CAPACITY = "gt.tank.cap.upg", // Long - UPGRADE_TANK_COUNT = "gt.tank.ct.upg", // Int - UPGRADE_TANK_CAPACITY_MULTIPLIER = "gt.tank.cap.mult.upg", // Long - UPGRADE_TANK_UUID = "gt.tankuuid.upg", // String - UPGRADE_TANK_NAME = "gt.tankname.upg", // String - UPGRADE_TANKS_INPUT = "gt.tanklist.upg.in", // NBT List - UPGRADE_TANKS_OUTPUT = "gt.tanklist.upg.out", // NBT List - UPGRADE_TANKS_PREFIX = "gt.tank.upg", // NBT Tag - UPGRADE_AMPERAGE = "gt.amp.upg", // Long - SEPARATE_INPUTS = "gt.separate.inputs", // Boolean - VOIDING_MODE = "gt.voiding.mode", // String - BATCH_MODE = "gt.batch.mode", // Boolean - RECIPE_LOCK = "gt.recipe.lock", // Boolean - - // Logic - POWER_LOGIC = "gt.pow.logic", // NBT Tag - POWER_LOGIC_STORED_ENERGY = "gt.pow.energy", // Number - POWER_LOGIC_ENERGY_CAPACITY = "gt.pow.energy.cap", // Number - POWER_LOGIC_VOLTAGE = "gt.pow.volt", // Number - POWER_LOGIC_AMPERAGE = "gt.pow.amp", // Number - POWER_LOGIC_TYPE = "gt.pow.type", // Number - empty_ = ""; - } - - /** The Color White as RGB Short Array. */ - public static final short[] UNCOLORED_RGBA = { 255, 255, 255, 255 }; - /** The Color White as simple Integer (0x00ffffff). */ - public static final int UNCOLORED = 0x00ffffff; - - /** - * Sides - */ - public static final byte SIDE_BOTTOM = 0, SIDE_DOWN = 0, SIDE_TOP = 1, SIDE_UP = 1, SIDE_NORTH = 2, // Also a Side - // with a - // stupidly - // mirrored - // Texture - SIDE_SOUTH = 3, SIDE_WEST = 4, SIDE_EAST = 5, // Also a Side with a stupidly mirrored Texture - SIDE_ANY = 6, SIDE_UNKNOWN = 6, SIDE_INVALID = 6, SIDE_INSIDE = 6, SIDE_UNDEFINED = 6; - - /** Compass alike Array for the proper ordering of North, East, South and West. */ - public static final byte[] COMPASS_DIRECTIONS = { SIDE_NORTH, SIDE_EAST, SIDE_SOUTH, SIDE_WEST }; - - /** - * An Array containing all Sides which follow the Condition, in order to iterate over them for example. - */ - public static final byte[] ALL_SIDES = { 0, 1, 2, 3, 4, 5, 6 }, ALL_VALID_SIDES = { 0, 1, 2, 3, 4, 5 }; - - /** - * For Facing Checks. - */ - public static final boolean[] INVALID_SIDES = { false, false, false, false, false, false, true }, - VALID_SIDES = { true, true, true, true, true, true, false }; - - /** - * Side->Offset Mappings. - */ - public static final byte[] OFFX = { 0, 0, 0, 0, -1, +1, 0 }, OFFY = { -1, +1, 0, 0, 0, 0, 0 }, - OFFZ = { 0, 0, -1, +1, 0, 0, 0 }; - - /** - * Side->Opposite Mappings. - **/ - public static final byte[] OPOS = { 1, 0, 3, 2, 5, 4, 6 }; - - /** - * [Facing,Side]->Side Mappings for Blocks, which don't face up- and downwards. 0 = bottom, 1 = top, 2 = left, 3 = - * front, 4 = right, 5 = back, 6 = undefined. - */ - public static final byte[][] FACING_ROTATIONS = { { 0, 1, 2, 3, 4, 5, 6 }, { 0, 1, 2, 3, 4, 5, 6 }, - { 0, 1, 3, 5, 4, 2, 6 }, { 0, 1, 5, 3, 2, 4, 6 }, { 0, 1, 2, 4, 3, 5, 6 }, { 0, 1, 4, 2, 5, 3, 6 }, - { 0, 1, 2, 3, 4, 5, 6 } }; - - /** - * The Mod Object itself. That is the GT_Mod-Object. It's needed to open GUI's and similar. - */ - public static IGT_Mod GT; - /** - * Use this Object to add Recipes. (Recipe Adder) - */ - public static IGT_RecipeAdder RA; - /** - * For Internal Usage (Network) - */ - public static IGT_NetworkHandler NW; - /** - * Control percentage of filled 3x3 chunks. Lower number means less oreveins spawn - */ - public static int oreveinPercentage; - /** - * Control number of attempts to find a valid orevein. Generally this maximum limit isn't hit, selecting a vein is - * cheap - */ - public static int oreveinAttempts; - /** - * Control number of attempts to place a valid ore vein. - *

- * If a vein wasn't placed due to height restrictions, completely in the water, etc, another attempt is tried. - *

- */ - public static int oreveinMaxPlacementAttempts; - /** - * Whether to place small ores as placer ores for an orevein - */ - public static boolean oreveinPlacerOres; - /** - * Multiplier to control how many placer ores get generated. - */ - public static int oreveinPlacerOresMultiplier; - /** - * Not really Constants, but they set using the Config and therefore should be constant (those are for the Debug - * Mode) - */ - public static boolean D1 = false, D2 = false; - /** - * Debug parameter for cleanroom testing. - */ - public static boolean debugCleanroom = false; - /** - * Debug parameter for driller testing. - */ - public static boolean debugDriller = false; - /** - * Debug parameter for world generation. Tracks chunks added/removed from run queue. - */ - public static boolean debugWorldGen = false; - /** - * Debug parameter for orevein generation. - */ - public static boolean debugOrevein = false; - /** - * Debug parameter for small ore generation. - */ - public static boolean debugSmallOres = false; - /** - * Debug parameter for stones generation. - */ - public static boolean debugStones = false; - /** - * Debug parameter for single block pump - */ - public static boolean debugBlockPump = false; - /** - * Debug parameter for single block miner - */ - public static boolean debugBlockMiner = false; - /** - * Debug parameter for entity cramming reduction - */ - public static boolean debugEntityCramming = false; - /** - * Debug parameter for {@link gregtech.api.util.GT_ChunkAssociatedData} - */ - public static boolean debugWorldData = false; - /** - * Parameter if multi tile entities (MuTEs) should be enabled in the pack. Turned off by default until - * implementation is done. - */ - public static boolean enableMultiTileEntities = false; - /** - * Number of ticks between sending sound packets to clients for electric machines. Default is 1.5 seconds. Trying to - * mitigate lag and FPS drops. - */ - public static int ticksBetweenSounds = 30; - /** - * If you have to give something a World Parameter but there is no World... (Dummy World) - */ - public static World DW; - - /** - * This will prevent NEI from crashing but spams the Log. - */ - public static boolean allow_broken_recipemap = false; - /** - * This will set the blacklist for the world accelerator in TE mode. - */ - public static String[] blacklistedTileEntiyClassNamesForWA = new String[] { - "com.rwtema.extrautils.tileentity.enderquarry.TileEntityEnderQuarry", - "advsolar.common.tiles.TileEntityUltimateSolarPanel", "advsolar.common.tiles.TileEntitySolarPanel", - "advsolar.common.tiles.TileEntityQuantumSolarPanel", "advsolar.common.tiles.TileEntityHybridSolarPanel", - "advsolar.common.tiles.TileEntityAdvancedSolarPanel", "com.supsolpans.tiles.TileAdminSolarPanel", - "com.supsolpans.tiles.TilePhotonicSolarPanel", "com.supsolpans.tiles.TileSingularSolarPanel", - "com.supsolpans.tiles.TileSpectralSolarPanel", "emt.tile.solar.air.TileEntityAirSolar", - "emt.tile.solar.air.TileEntityDoubleAirSolar", "emt.tile.solar.air.TileEntityTripleAirSolar", - "emt.tile.solar.air.TileEntityQuadrupleAirSolar", "emt.tile.solar.air.TileEntityQuintupleAirSolar", - "emt.tile.solar.air.TileEntitySextupleAirSolar", "emt.tile.solar.air.TileEntitySeptupleAirSolar", - "emt.tile.solar.air.TileEntityOctupleAirSolar", "emt.tile.solar.compressed.TileEntityCompressedSolar", - "emt.tile.solar.compressed.TileEntityDoubleCompressedSolar", - "emt.tile.solar.compressed.TileEntityTripleCompressedSolar", - "emt.tile.solar.compressed.TileEntityQuadrupleAirSolar", - "emt.tile.solar.compressed.TileEntityQuintupleAirSolar", "emt.tile.solar.compressed.TileEntitySextupleAirSolar", - "emt.tile.solar.compressed.TileEntitySeptupleAirSolar", "emt.tile.solar.compressed.TileEntityOctupleAirSolar", - "emt.tile.solar.dark.TileEntityDarkSolar", "emt.tile.solar.dark.TileEntityDoubleDarkSolar", - "emt.tile.solar.dark.TileEntityTripleDarkSolar", "emt.tile.solar.dark.TileEntityQuadrupleAirSolar", - "emt.tile.solar.dark.TileEntityQuintupleAirSolar", "emt.tile.solar.dark.TileEntitySextupleAirSolar", - "emt.tile.solar.dark.TileEntitySeptupleAirSolar", "emt.tile.solar.dark.TileEntityOctupleAirSolar", - "emt.tile.solar.earth.TileEntityDoubleEarthSolar", "emt.tile.solar.earth.TileEntityEarthSolar", - "emt.tile.solar.earth.TileEntityTripleEarthSolar", "emt.tile.solar.earth.TileEntityQuadrupleAirSolar", - "emt.tile.solar.earth.TileEntityQuintupleAirSolar", "emt.tile.solar.earth.TileEntitySextupleAirSolar", - "emt.tile.solar.earth.TileEntitySeptupleAirSolar", "emt.tile.solar.earth.TileEntityOctupleAirSolar", - "emt.tile.solar.fire.TileEntityDoubleFireSolar", "emt.tile.solar.fire.TileEntityFireSolar", - "emt.tile.solar.fire.TileEntityTripleFireSolar", "emt.tile.solar.fire.TileEntityQuadrupleAirSolar", - "emt.tile.solar.fire.TileEntityQuintupleAirSolar", "emt.tile.solar.fire.TileEntitySextupleAirSolar", - "emt.tile.solar.fire.TileEntitySeptupleAirSolar", "emt.tile.solar.fire.TileEntityOctupleAirSolar", - "emt.tile.solar.order.TileEntityDoubleOrderSolar", "emt.tile.solar.order.TileEntityOrderSolar", - "emt.tile.solar.order.TileEntityTripleOrderSolar", "emt.tile.solar.order.TileEntityQuadrupleAirSolar", - "emt.tile.solar.order.TileEntityQuintupleAirSolar", "emt.tile.solar.order.TileEntitySextupleAirSolar", - "emt.tile.solar.order.TileEntitySeptupleAirSolar", "emt.tile.solar.order.TileEntityOctupleAirSolar", - "emt.tile.solar.water.TileEntityDoubleWaterSolar", "emt.tile.solar.water.TileEntityTripleWaterSolar", - "emt.tile.solar.water.TileEntityWaterSolar", "emt.tile.solar.water.TileEntityQuadrupleAirSolar", - "emt.tile.solar.water.TileEntityQuintupleAirSolar", "emt.tile.solar.water.TileEntitySextupleAirSolar", - "emt.tile.solar.water.TileEntitySeptupleAirSolar", "emt.tile.solar.water.TileEntityOctupleAirSolar", - "com.lulan.compactkineticgenerators.tileentity.TileCkgE", - "com.lulan.compactkineticgenerators.tileentity.TileCkgH", - "com.lulan.compactkineticgenerators.tileentity.TileCkgL", - "com.lulan.compactkineticgenerators.tileentity.TileCkgM", - "com.lulan.compactkineticgenerators.tileentity.TileCkwaE", - "com.lulan.compactkineticgenerators.tileentity.TileCkwaH", - "com.lulan.compactkineticgenerators.tileentity.TileCkwaL", - "com.lulan.compactkineticgenerators.tileentity.TileCkwaM", - "com.lulan.compactkineticgenerators.tileentity.TileCkwmE", - "com.lulan.compactkineticgenerators.tileentity.TileCkwmH", - "com.lulan.compactkineticgenerators.tileentity.TileCkwmL", - "com.lulan.compactkineticgenerators.tileentity.TileCkwmM", "com.supsolpans.tiles.TileSpectralSolarPanel", - "com.supsolpans.tiles.TileSingularSolarPanel", "com.supsolpans.tiles.TileAdminSolarPanel", - "com.supsolpans.tiles.TilePhotonicSolarPanel", "gtPlusPlus.core.tileentities.general.TileEntityFishTrap", - "gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest", - "net.bdew.gendustry.machines.apiary.TileApiary", "goodgenerator.blocks.tileEntity.EssentiaHatch", - "magicbees.tileentity.TileEntityApimancersDrainerCommon", - "magicbees.tileentity.TileEntityApimancersDrainerGT" }; - /** - * This will set the percentage how much ReinforcedGlass is Allowed in Cleanroom Walls. - */ - public static float cleanroomGlass = 5.0f; - /** - * This will let machines such as drills and pumps chunkload their work area. - */ - public static boolean enableChunkloaders = true; - /** - * This will make all chunkloading machines act as World Anchors (true) or Passive Anchors (false) - */ - public static boolean alwaysReloadChunkloaders = false; - - public static boolean debugChunkloaders = false; - public static boolean cls_enabled; - public static final Set mCTMEnabledBlock = new HashSet<>(); - public static final Set mCTMDisabledBlock = new HashSet<>(); - - public static final int STEAM_PER_WATER = 160; - /** - * If true, then digital chest with AE2 storage bus will be accessible only through AE2 - */ - public static boolean disableDigitalChestsExternalAccess = false; - - public static boolean lateConfigSave = true; - public static boolean worldTickHappened = false; - - public static final int[] emptyIntArray = new int[0]; - - public static final IFluidTank[] emptyFluidTank = new IFluidTank[0]; - public static final FluidTankGT[] emptyFluidTankGT = new FluidTankGT[0]; - public static final FluidTankInfo[] emptyFluidTankInfo = new FluidTankInfo[0]; - public static final FluidStack[] emptyFluidStack = new FluidStack[0]; - public static final ItemStack[] emptyItemStackArray = new ItemStack[0]; - public static final IIconContainer[] emptyIconContainerArray = new IIconContainer[3]; - - /** - * Pretty formatting for author names. - */ - public static final String Colen = "" + EnumChatFormatting.DARK_RED - + EnumChatFormatting.BOLD - + EnumChatFormatting.ITALIC - + EnumChatFormatting.UNDERLINE - + "C" - + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD - + EnumChatFormatting.ITALIC - + EnumChatFormatting.UNDERLINE - + "o" - + EnumChatFormatting.GREEN - + EnumChatFormatting.BOLD - + EnumChatFormatting.ITALIC - + EnumChatFormatting.UNDERLINE - + "l" - + EnumChatFormatting.DARK_AQUA - + EnumChatFormatting.BOLD - + EnumChatFormatting.ITALIC - + EnumChatFormatting.UNDERLINE - + "e" - + EnumChatFormatting.DARK_PURPLE - + EnumChatFormatting.BOLD - + EnumChatFormatting.ITALIC - + EnumChatFormatting.UNDERLINE - + "n"; - - public static final String AuthorColen = "Author: " + Colen; - public static final String AuthorKuba = "Author: " + EnumChatFormatting.DARK_RED - + EnumChatFormatting.BOLD - + "k" - + EnumChatFormatting.RED - + EnumChatFormatting.BOLD - + "u" - + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD - + "b" - + EnumChatFormatting.YELLOW - + EnumChatFormatting.BOLD - + "a" - + EnumChatFormatting.DARK_GREEN - + EnumChatFormatting.BOLD - + "6" - + EnumChatFormatting.GREEN - + EnumChatFormatting.BOLD - + "0" - + EnumChatFormatting.AQUA - + EnumChatFormatting.BOLD - + "0" - + EnumChatFormatting.DARK_AQUA - + EnumChatFormatting.BOLD - + "0"; - - public static final String AuthorBlueWeabo = "Author: " + EnumChatFormatting.BLUE - + EnumChatFormatting.BOLD - + "Blue" - + EnumChatFormatting.AQUA - + EnumChatFormatting.BOLD - + "Weabo"; - - public static final String Authorminecraft7771 = "Author: " + EnumChatFormatting.BLUE - + EnumChatFormatting.LIGHT_PURPLE - + "minecraft7771"; - - public static final Supplier AuthorCloud = chain( - text("Author: " + EnumChatFormatting.AQUA + EnumChatFormatting.BOLD), - animatedText( - "C", - 1, - 500, - DARK_AQUA + OBFUSCATED + BOLD + "X" + RESET + AQUA + BOLD, - DARK_AQUA + "\u238B" + RESET + AQUA + BOLD, - DARK_AQUA + OBFUSCATED + BOLD + "X" + RESET + AQUA + BOLD, - DARK_AQUA + "\u0B83" + RESET + AQUA + BOLD, - DARK_AQUA + OBFUSCATED + BOLD + "X" + RESET + AQUA + BOLD, - DARK_AQUA + BOLD + "\u29BC" + RESET + AQUA + BOLD), - text(EnumChatFormatting.AQUA + EnumChatFormatting.BOLD.toString() + "loud" + EnumChatFormatting.RESET), - animatedText( - " ", - 1, - 500, - DARK_AQUA + OBFUSCATED + BOLD + "X", - DARK_AQUA + "\u238B", - DARK_AQUA + OBFUSCATED + BOLD + "X", - DARK_AQUA + "\u0B83", - DARK_AQUA + OBFUSCATED + BOLD + "X", - DARK_AQUA + BOLD + "\u29BC")); - - public static final String AuthorQuerns = "Author: " + EnumChatFormatting.RED + "Querns"; - public static final String AuthorSilverMoon = "Author: " + EnumChatFormatting.AQUA + "SilverMoon"; - public static final String AuthorTheEpicGamer274 = "Author: " + "TheEpicGamer274"; - public static final String AuthorFourIsTheNumber = "Author: " + EnumChatFormatting.LIGHT_PURPLE - + EnumChatFormatting.ITALIC - + "Four" - + EnumChatFormatting.WHITE - + EnumChatFormatting.ITALIC - + "Is" - + EnumChatFormatting.LIGHT_PURPLE - + EnumChatFormatting.ITALIC - + "The" - + EnumChatFormatting.WHITE - + EnumChatFormatting.ITALIC - + "Number"; - public static final String Ollie = "" + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + "Ollie"; - public static final String authorBaps = "Author: " + EnumChatFormatting.GOLD - + "Ba" - + EnumChatFormatting.LIGHT_PURPLE - + "ps"; - - public static final String AuthorEvgenWarGold = "" + EnumChatFormatting.RED - + EnumChatFormatting.BOLD - + "Evgen" - + EnumChatFormatting.BLUE - + EnumChatFormatting.BOLD - + "War" - + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD - + "Gold"; - public static final String AuthorVolence = "Author: " + EnumChatFormatting.AQUA + "Volence"; - - public static final String AuthorEigenRaven = "Author: " + EnumChatFormatting.DARK_PURPLE - + "Eigen" - + EnumChatFormatting.BOLD - + "Raven"; - - public static final String AuthorNotAPenguin = "Author: " + EnumChatFormatting.WHITE - + EnumChatFormatting.BOLD - + "Not" - + EnumChatFormatting.AQUA - + EnumChatFormatting.BOLD - + "APenguin"; - - // 7.5F comes from GT_Tool_Turbine_Large#getBaseDamage() given huge turbines are the most efficient now. - public static double getMaxPlasmaTurbineEfficiencyFromMaterial(Materials material) { - return (5F + (7.5F + material.mToolQuality)) / 10.0; - } - - // Called once in GT_Client on world load, has to be called late so that Materials is populated. - public static void calculateMaxPlasmaTurbineEfficiency() { - - ArrayList effArray = new ArrayList<>(); - - // Iteration seems to work but need to check turbine as all items appear null. - for (Materials material : Materials.values()) { - effArray.add(getMaxPlasmaTurbineEfficiencyFromMaterial(material)); - } - - maxPlasmaTurbineEfficiency = Collections.max(effArray); - } - - private static double maxPlasmaTurbineEfficiency; - - public static double getMaxPlasmaTurbineEfficiency() { - return maxPlasmaTurbineEfficiency; - } - - private static final long[] EXPLOSION_LOOKUP_V = new long[] { V[0], V[1], V[2], V[3], V[4], V[4] * 2, V[5], V[6], - V[7], V[8], V[8] * 2, V[9], V[10], V[11], V[12], V[12] * 2, V[13], V[14], V[15] }; - private static final float[] EXPLOSION_LOOKUP_POWER = new float[] { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F, 6.0F, 7.0F, 8.0F, - 9.0F, 10.0F, 11.0F, 12.0F, 13.0F, 14.0F, 15.0F, 16.0F, 17.0F, 18.0F, 19.0F, 20.0F }; - - public static float getExplosionPowerForVoltage(long voltage) { - for (int i = 0; i < EXPLOSION_LOOKUP_V.length; i++) { - if (voltage < EXPLOSION_LOOKUP_V[i]) { - return EXPLOSION_LOOKUP_POWER[i]; - } - } - return EXPLOSION_LOOKUP_POWER[EXPLOSION_LOOKUP_POWER.length - 1]; - } -} diff --git a/src/main/java/gregtech/api/enums/HatchElement.java b/src/main/java/gregtech/api/enums/HatchElement.java new file mode 100644 index 0000000000..ae38d2a2ff --- /dev/null +++ b/src/main/java/gregtech/api/enums/HatchElement.java @@ -0,0 +1,110 @@ +package gregtech.api.enums; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchDynamo; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.metatileentity.implementations.MTEHatchMaintenance; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +import gregtech.api.metatileentity.implementations.MTEHatchOutputBus; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +import gregtech.api.util.ExoticEnergyInputHelper; +import gregtech.api.util.IGTHatchAdder; + +public enum HatchElement implements IHatchElement { + + Muffler(MTEMultiBlockBase::addMufflerToMachineList, MTEHatchMuffler.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mMufflerHatches.size(); + } + }, + Maintenance(MTEMultiBlockBase::addMaintenanceToMachineList, MTEHatchMaintenance.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mMaintenanceHatches.size(); + } + }, + InputHatch(MTEMultiBlockBase::addInputHatchToMachineList, MTEHatchInput.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mInputHatches.size(); + } + }, + InputBus(MTEMultiBlockBase::addInputBusToMachineList, MTEHatchInputBus.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mInputBusses.size(); + } + }, + OutputHatch(MTEMultiBlockBase::addOutputHatchToMachineList, MTEHatchOutput.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mOutputHatches.size(); + } + }, + OutputBus(MTEMultiBlockBase::addOutputBusToMachineList, MTEHatchOutputBus.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mOutputBusses.size(); + } + }, + Energy(MTEMultiBlockBase::addEnergyInputToMachineList, MTEHatchEnergy.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mEnergyHatches.size(); + } + }, + Dynamo(MTEMultiBlockBase::addDynamoToMachineList, MTEHatchDynamo.class) { + + @Override + public long count(MTEMultiBlockBase t) { + return t.mDynamoHatches.size(); + } + }, + ExoticEnergy(MTEMultiBlockBase::addExoticEnergyInputToMachineList) { + + @Override + public List> mteClasses() { + return ExoticEnergyInputHelper.getAllClasses(); + } + + @Override + public long count(MTEMultiBlockBase t) { + return t.getExoticEnergyHatches() + .size(); + } + },; + + private final List> mteClasses; + private final IGTHatchAdder adder; + + @SafeVarargs + HatchElement(IGTHatchAdder adder, Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + public IGTHatchAdder adder() { + return adder; + } +} diff --git a/src/main/java/gregtech/api/enums/HeatingCoilLevel.java b/src/main/java/gregtech/api/enums/HeatingCoilLevel.java index f281695d5a..4d770710cc 100644 --- a/src/main/java/gregtech/api/enums/HeatingCoilLevel.java +++ b/src/main/java/gregtech/api/enums/HeatingCoilLevel.java @@ -79,14 +79,14 @@ public enum HeatingCoilLevel { if (heatLevel.getHeat() >= heat) { String name = heatLevel.getName(); if (applyColor) { - name = GT_Values.TIER_COLORS[heatLevel.getTier() + 1] + name; + name = GTValues.TIER_COLORS[heatLevel.getTier() + 1] + name; } return name; } } String name = HeatingCoilLevel.MAX.getName() + "+"; if (applyColor) { - name = GT_Values.TIER_COLORS[HeatingCoilLevel.MAX.getTier() + 1] + name; + name = GTValues.TIER_COLORS[HeatingCoilLevel.MAX.getTier() + 1] + name; } return name; } diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java index 74f169681c..dba8f510b9 100644 --- a/src/main/java/gregtech/api/enums/ItemList.java +++ b/src/main/java/gregtech/api/enums/ItemList.java @@ -1,7 +1,7 @@ package gregtech.api.enums; -import static gregtech.api.enums.GT_Values.NI; -import static gregtech.api.enums.GT_Values.W; +import static gregtech.api.enums.GTValues.NI; +import static gregtech.api.enums.GTValues.W; import java.util.Locale; @@ -11,11 +11,11 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; import gregtech.api.interfaces.IItemContainer; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; /** * Class containing all non-OreDict Items of GregTech. @@ -2615,14 +2615,14 @@ public enum ItemList implements IItemContainer { mHasNotBeenSet = false; if (aItem == null) return this; ItemStack aStack = new ItemStack(aItem, 1, 0); - mStack = GT_Utility.copyAmount(1, aStack); + mStack = GTUtility.copyAmount(1, aStack); return this; } @Override public IItemContainer set(ItemStack aStack) { mHasNotBeenSet = false; - mStack = GT_Utility.copyAmount(1, aStack); + mStack = GTUtility.copyAmount(1, aStack); return this; } @@ -2635,14 +2635,14 @@ public enum ItemList implements IItemContainer { @Override public Item getItem() { sanityCheck(); - if (GT_Utility.isStackInvalid(mStack)) return null; + if (GTUtility.isStackInvalid(mStack)) return null; return mStack.getItem(); } @Override public Block getBlock() { sanityCheck(); - return GT_Utility.getBlockFromItem(getItem()); + return GTUtility.getBlockFromItem(getItem()); } @Override @@ -2658,50 +2658,50 @@ public enum ItemList implements IItemContainer { @Override public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT) { if (mDeprecated && !mWarned) { - new Exception(this + " is now deprecated").printStackTrace(GT_Log.err); + new Exception(this + " is now deprecated").printStackTrace(GTLog.err); // warn only once mWarned = true; } - if (GT_Utility.isStackInvalid(aStack)) return false; - return GT_Utility.areUnificationsEqual((ItemStack) aStack, aWildcard ? getWildcard(1) : get(1), aIgnoreNBT); + if (GTUtility.isStackInvalid(aStack)) return false; + return GTUtility.areUnificationsEqual((ItemStack) aStack, aWildcard ? getWildcard(1) : get(1), aIgnoreNBT); } @Override public ItemStack get(long aAmount, Object... aReplacements) { sanityCheck(); - if (GT_Utility.isStackInvalid(mStack)) { - GT_Log.out.println("Object in the ItemList is null at:"); - new NullPointerException().printStackTrace(GT_Log.out); - return GT_Utility.copyAmount(aAmount, aReplacements); + if (GTUtility.isStackInvalid(mStack)) { + GTLog.out.println("Object in the ItemList is null at:"); + new NullPointerException().printStackTrace(GTLog.out); + return GTUtility.copyAmount(aAmount, aReplacements); } - return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(mStack)); + return GTUtility.copyAmount(aAmount, GTOreDictUnificator.get(mStack)); } @Override public ItemStack getWildcard(long aAmount, Object... aReplacements) { sanityCheck(); - if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements); - return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(mStack)); + if (GTUtility.isStackInvalid(mStack)) return GTUtility.copyAmount(aAmount, aReplacements); + return GTUtility.copyAmountAndMetaData(aAmount, W, GTOreDictUnificator.get(mStack)); } @Override public ItemStack getUndamaged(long aAmount, Object... aReplacements) { sanityCheck(); - if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements); - return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(mStack)); + if (GTUtility.isStackInvalid(mStack)) return GTUtility.copyAmount(aAmount, aReplacements); + return GTUtility.copyAmountAndMetaData(aAmount, 0, GTOreDictUnificator.get(mStack)); } @Override public ItemStack getAlmostBroken(long aAmount, Object... aReplacements) { sanityCheck(); - if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements); - return GT_Utility.copyAmountAndMetaData(aAmount, mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(mStack)); + if (GTUtility.isStackInvalid(mStack)) return GTUtility.copyAmount(aAmount, aReplacements); + return GTUtility.copyAmountAndMetaData(aAmount, mStack.getMaxDamage() - 1, GTOreDictUnificator.get(mStack)); } @Override public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements) { ItemStack rStack = get(1, aReplacements); - if (GT_Utility.isStackInvalid(rStack)) return NI; + if (GTUtility.isStackInvalid(rStack)) return NI; // CamelCase alphanumeric words from aDisplayName StringBuilder tCamelCasedDisplayNameBuilder = new StringBuilder(); @@ -2722,36 +2722,36 @@ public enum ItemList implements IItemContainer { // Construct a translation key from UnlocalizedName and CamelCased DisplayName final String tKey = rStack.getUnlocalizedName() + ".with." + tCamelCasedDisplayNameBuilder + ".name"; - rStack.setStackDisplayName(GT_LanguageManager.addStringLocalization(tKey, aDisplayName)); - return GT_Utility.copyAmount(aAmount, rStack); + rStack.setStackDisplayName(GTLanguageManager.addStringLocalization(tKey, aDisplayName)); + return GTUtility.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); + if (GTUtility.isStackInvalid(rStack)) return null; + GTModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false); + return GTUtility.copyAmount(aAmount, rStack); } @Override public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements) { sanityCheck(); - if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements); - return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(mStack)); + if (GTUtility.isStackInvalid(mStack)) return GTUtility.copyAmount(aAmount, aReplacements); + return GTUtility.copyAmountAndMetaData(aAmount, aMetaValue, GTOreDictUnificator.get(mStack)); } @Override public IItemContainer registerOre(Object... aOreNames) { sanityCheck(); - for (Object tOreName : aOreNames) GT_OreDictUnificator.registerOre(tOreName, get(1)); + for (Object tOreName : aOreNames) GTOreDictUnificator.registerOre(tOreName, get(1)); return this; } @Override public IItemContainer registerWildcardAsOre(Object... aOreNames) { sanityCheck(); - for (Object tOreName : aOreNames) GT_OreDictUnificator.registerOre(tOreName, getWildcard(1)); + for (Object tOreName : aOreNames) GTOreDictUnificator.registerOre(tOreName, getWildcard(1)); return this; } @@ -2767,7 +2767,7 @@ public enum ItemList implements IItemContainer { if (mHasNotBeenSet) throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); if (mDeprecated && !mWarned) { - new Exception(this + " is now deprecated").printStackTrace(GT_Log.err); + new Exception(this + " is now deprecated").printStackTrace(GTLog.err); // warn only once mWarned = true; } diff --git a/src/main/java/gregtech/api/enums/MaterialBuilder.java b/src/main/java/gregtech/api/enums/MaterialBuilder.java index 98ed5fa3f7..89104d6e96 100644 --- a/src/main/java/gregtech/api/enums/MaterialBuilder.java +++ b/src/main/java/gregtech/api/enums/MaterialBuilder.java @@ -31,7 +31,7 @@ public class MaterialBuilder { private Dyes color = Dyes._NULL; private int extraData = 0; private List materialList = new ArrayList<>(); - private List aspects = new ArrayList<>(); + private List aspects = new ArrayList<>(); private boolean hasCorrespondingFluid = false; private boolean hasCorrespondingGas = false; private boolean canBeCracked = false; @@ -242,7 +242,7 @@ public class MaterialBuilder { return this; } - public MaterialBuilder setAspects(List aspects) { + public MaterialBuilder setAspects(List aspects) { this.aspects = aspects; return this; } diff --git a/src/main/java/gregtech/api/enums/Materials.java b/src/main/java/gregtech/api/enums/Materials.java index 3d314c4742..3a963ca322 100644 --- a/src/main/java/gregtech/api/enums/Materials.java +++ b/src/main/java/gregtech/api/enums/Materials.java @@ -1,7 +1,7 @@ package gregtech.api.enums; import static gregtech.api.enums.FluidState.GAS; -import static gregtech.api.enums.GT_Values.M; +import static gregtech.api.enums.GTValues.M; import static gregtech.api.enums.Mods.Thaumcraft; import java.util.ArrayList; @@ -24,20 +24,20 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.TC_Aspects.TC_AspectStack; -import gregtech.api.fluid.GT_FluidFactory; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.TCAspects.TC_AspectStack; +import gregtech.api.fluid.GTFluidFactory; import gregtech.api.interfaces.IColorModulationContainer; import gregtech.api.interfaces.IMaterialHandler; import gregtech.api.interfaces.ISubTagContainer; import gregtech.api.objects.MaterialStack; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; import gregtech.common.config.gregtech.ConfigHarvestLevel; import gregtech.common.render.items.CosmicNeutroniumRenderer; -import gregtech.common.render.items.GT_GeneratedMaterial_Renderer; import gregtech.common.render.items.GaiaSpiritRenderer; +import gregtech.common.render.items.GeneratedMaterialRenderer; import gregtech.common.render.items.GlitchEffectRenderer; import gregtech.common.render.items.InfinityRenderer; import gregtech.common.render.items.TranscendentMetalRenderer; @@ -67,7 +67,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { // Spotless breaks the table below into many, many lines // spotless:off - public static Materials _NULL = new Materials(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "NULL", "NULL", 0, 0, 0, 0, false, false, 1, 1, 1, Dyes._NULL, Element._NULL, Collections.singletonList(new TC_AspectStack(TC_Aspects.VACUOS, 1))); + public static Materials _NULL = new Materials(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "NULL", "NULL", 0, 0, 0, 0, false, false, 1, 1, 1, Dyes._NULL, Element._NULL, Collections.singletonList(new TC_AspectStack(TCAspects.VACUOS, 1))); /** * Direct Elements */ @@ -352,37 +352,37 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { public static Materials Vyroxeres; public static Materials Yellorium; public static Materials Zectium; - public static Materials Ultimate = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Ultimate" , "Ultimate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 8))); - public static Materials Advanced = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Advanced" , "Advanced" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 4))); + public static Materials Ultimate = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Ultimate" , "Ultimate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 8))); + public static Materials Advanced = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Advanced" , "Advanced" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 4))); /** * Tiered materials, primarily Circuitry, Batteries and other Technical things */ - public static Materials ULV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Primitive" , "Primitive" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 1))); - public static Materials LV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Basic" , "Basic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 2))); - public static Materials MV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Good" , "Good" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 3))); - public static Materials HV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Advanced" , "Advanced" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 4))); - public static Materials EV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Data" , "Data" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 5))); - public static Materials IV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Elite" , "Elite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 6))); - public static Materials LuV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Master" , "Master" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 7))); - public static Materials ZPM = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Ultimate" , "Ultimate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 8))); - public static Materials UV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Superconductor" , "Superconductor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 9))); - public static Materials UHV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Infinite" , "Infinite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 10))); - public static Materials UEV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Bio" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 11))); - public static Materials UIV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Optical" , "Optical" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 12))); - public static Materials UMV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Exotic" , "Exotic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 13))); - public static Materials UXV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Cosmic" , "Cosmic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 14))); - public static Materials MAX = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Transcendent" , "Transcendent" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 15))); - - public static Materials Resistor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Resistor" , "Resistor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1))); - public static Materials Diode = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Diode" , "Diode" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1))); - public static Materials Transistor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Transistor" , "Transistor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1))); - public static Materials Capacitor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Capacitor" , "Capacitor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1))); - public static Materials Inductor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Inductor" , "Inductor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1))); - - public static Materials Nano = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Nano" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 11))); - public static Materials Piko = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Piko" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 12))); - public static Materials Quantum = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Quantum" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 13))); + public static Materials ULV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Primitive" , "Primitive" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 1))); + public static Materials LV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Basic" , "Basic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 2))); + public static Materials MV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Good" , "Good" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 3))); + public static Materials HV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Advanced" , "Advanced" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 4))); + public static Materials EV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Data" , "Data" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 5))); + public static Materials IV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Elite" , "Elite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 6))); + public static Materials LuV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Master" , "Master" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 7))); + public static Materials ZPM = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Ultimate" , "Ultimate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 8))); + public static Materials UV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Superconductor" , "Superconductor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.MACHINA, 9))); + public static Materials UHV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Infinite" , "Infinite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 10))); + public static Materials UEV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Bio" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 11))); + public static Materials UIV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Optical" , "Optical" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 12))); + public static Materials UMV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Exotic" , "Exotic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 13))); + public static Materials UXV = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Cosmic" , "Cosmic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 14))); + public static Materials MAX = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Transcendent" , "Transcendent" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 15))); + + public static Materials Resistor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Resistor" , "Resistor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 1))); + public static Materials Diode = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Diode" , "Diode" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 1))); + public static Materials Transistor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Transistor" , "Transistor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 1))); + public static Materials Capacitor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Capacitor" , "Capacitor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 1))); + public static Materials Inductor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Inductor" , "Inductor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 1))); + + public static Materials Nano = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Nano" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 11))); + public static Materials Piko = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Piko" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 12))); + public static Materials Quantum = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Quantum" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TCAspects.ELECTRUM, 13))); /** @@ -1029,10 +1029,10 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { public final short[] mRGBa = new short[] { 255, 255, 255, 0 }, mMoltenRGBa = new short[] { 255, 255, 255, 0 }; public TextureSet mIconSet; - public GT_GeneratedMaterial_Renderer renderer; + public GeneratedMaterialRenderer renderer; public List mMaterialList = new ArrayList<>(); public List mOreByProducts = new ArrayList<>(), mOreReRegistrations = new ArrayList<>(); - public List mAspects = new ArrayList<>(); + public List mAspects = new ArrayList<>(); public ArrayList mMaterialItems = new ArrayList<>(); public Collection mSubTags = new LinkedHashSet<>(); public Enchantment mEnchantmentTools = null, mEnchantmentArmors = null; @@ -1256,7 +1256,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType, int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent, int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, - List aAspects) { + List aAspects) { this( aMetaItemSubID, aIconSet, @@ -1287,7 +1287,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType, int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent, int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, Element aElement, - List aAspects) { + List aAspects) { this( aMetaItemSubID, aIconSet, @@ -1359,7 +1359,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType, int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent, int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, int aExtraData, - List aMaterialList, List aAspects) { + List aMaterialList, List aAspects) { this( aMetaItemSubID, aIconSet, @@ -1397,15 +1397,15 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { tAmountOfComponents += tMaterial.mAmount; if (tMaterial.mMaterial.mMeltingPoint > 0) tMeltingPoint += tMaterial.mMaterial.mMeltingPoint * tMaterial.mAmount; - if (aAspects == null) for (TC_Aspects.TC_AspectStack tAspect : tMaterial.mMaterial.mAspects) - tAspect.addToAspectList(mAspects); + if (aAspects == null) + for (TCAspects.TC_AspectStack tAspect : tMaterial.mMaterial.mAspects) tAspect.addToAspectList(mAspects); } if (mMeltingPoint < 0) mMeltingPoint = (short) (tMeltingPoint / tAmountOfComponents); tAmountOfComponents *= aDensityMultiplier; tAmountOfComponents /= aDensityDivider; - if (aAspects == null) for (TC_Aspects.TC_AspectStack tAspect : mAspects) + if (aAspects == null) for (TCAspects.TC_AspectStack tAspect : mAspects) tAspect.mAmount = Math.max(1, tAspect.mAmount / Math.max(1, tAmountOfComponents)); else mAspects.addAll(aAspects); } @@ -2478,7 +2478,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { public static void init() { new ProcessingConfig(); - if (!GT_Mod.gregtechproxy.mEnableAllMaterials) new ProcessingModSupport(); + if (!GTMod.gregtechproxy.mEnableAllMaterials) new ProcessingModSupport(); mMaterialHandlers.forEach(IMaterialHandler::onMaterialsInit); // This is where addon mods can add/manipulate // materials initMaterialProperties(); // No more material addition or manipulation should be done past this point! @@ -2538,8 +2538,8 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { if (aMaterial.mMetaItemSubID >= 0) { if (aMaterial.mMetaItemSubID < 1000) { if (aMaterial.mHasParentMod) { - if (GregTech_API.sGeneratedMaterials[aMaterial.mMetaItemSubID] == null) { - GregTech_API.sGeneratedMaterials[aMaterial.mMetaItemSubID] = aMaterial; + if (GregTechAPI.sGeneratedMaterials[aMaterial.mMetaItemSubID] == null) { + GregTechAPI.sGeneratedMaterials[aMaterial.mMetaItemSubID] = aMaterial; } else throw new IllegalArgumentException( "The Material Index " + aMaterial.mMetaItemSubID + " for " @@ -2556,7 +2556,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { } private static void addToolValues(Materials aMaterial) { - // Moved from GT_Proxy? (Not sure) + // Moved from GTProxy? (Not sure) aMaterial.mHandleMaterial = (aMaterial == Desh ? aMaterial.mHandleMaterial : aMaterial == Diamond || aMaterial == Thaumium ? Wood : aMaterial.contains(SubTag.BURNING) ? Blaze @@ -2596,10 +2596,10 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { } if (aMaterial.mHasPlasma) { - GT_Mod.gregtechproxy.addAutogeneratedPlasmaFluid(aMaterial); + GTMod.gregtechproxy.addAutogeneratedPlasmaFluid(aMaterial); } if (aMaterial.mHasGas) { - GT_FluidFactory + GTFluidFactory .of(aMaterial.mName.toLowerCase(), aMaterial.mDefaultLocalName, aMaterial, GAS, aMaterial.mGasTemp); } } @@ -2610,18 +2610,18 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { } private static void addHarvestLevelNerfs(Materials aMaterial) { - /* Moved the harvest level changes from GT_Mod to have fewer things iterating over MATERIALS_ARRAY */ - if (GT_Mod.gregtechproxy.mChangeHarvestLevels && aMaterial.mToolQuality > 0 - && aMaterial.mMetaItemSubID < GT_Mod.gregtechproxy.mHarvestLevel.length + /* Moved the harvest level changes from GTMod to have fewer things iterating over MATERIALS_ARRAY */ + if (GTMod.gregtechproxy.mChangeHarvestLevels && aMaterial.mToolQuality > 0 + && aMaterial.mMetaItemSubID < GTMod.gregtechproxy.mHarvestLevel.length && aMaterial.mMetaItemSubID >= 0) { - GT_Mod.gregtechproxy.mHarvestLevel[aMaterial.mMetaItemSubID] = aMaterial.mToolQuality; + GTMod.gregtechproxy.mHarvestLevel[aMaterial.mMetaItemSubID] = aMaterial.mToolQuality; } } private static void addHarvestLevels() { - GT_Mod.gregtechproxy.mChangeHarvestLevels = ConfigHarvestLevel.activateHarvestLevelChange; - GT_Mod.gregtechproxy.mMaxHarvestLevel = Math.min(15, ConfigHarvestLevel.maxHarvestLevel); - GT_Mod.gregtechproxy.mGraniteHavestLevel = ConfigHarvestLevel.graniteHarvestLevel; + GTMod.gregtechproxy.mChangeHarvestLevels = ConfigHarvestLevel.activateHarvestLevelChange; + GTMod.gregtechproxy.mMaxHarvestLevel = Math.min(15, ConfigHarvestLevel.maxHarvestLevel); + GTMod.gregtechproxy.mGraniteHavestLevel = ConfigHarvestLevel.graniteHarvestLevel; } public static void initMaterialProperties() { @@ -2690,7 +2690,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { public static String getLocalizedNameForItem(String aFormat, int aMaterialID) { if (aMaterialID >= 0 && aMaterialID < 1000) { - Materials aMaterial = GregTech_API.sGeneratedMaterials[aMaterialID]; + Materials aMaterial = GregTechAPI.sGeneratedMaterials[aMaterialID]; if (aMaterial != null) return aMaterial.getLocalizedNameForItem(aFormat); } return aFormat; @@ -2814,7 +2814,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { return mMaterialItems.stream() .anyMatch( tStack -> Arrays.stream(aStacks) - .anyMatch(aStack -> GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound()))); + .anyMatch(aStack -> GTUtility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound()))); } /** @@ -2824,7 +2824,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { if (aStack == null) return false; boolean temp = false; int mMaterialItems_sS = mMaterialItems.size(); - for (int i = 0; i < mMaterialItems_sS; i++) if (GT_Utility.areStacksEqual(aStack, mMaterialItems.get(i))) { + for (int i = 0; i < mMaterialItems_sS; i++) if (GTUtility.areStacksEqual(aStack, mMaterialItems.get(i))) { mMaterialItems.remove(i--); temp = true; } @@ -3136,43 +3136,43 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { */ public boolean isProperSolderingFluid() { return mStandardMoltenFluid != null && contains(SubTag.SOLDERING_MATERIAL) - && !(GregTech_API.mUseOnlyGoodSolderingMaterials && !contains(SubTag.SOLDERING_MATERIAL_GOOD)); + && !(GregTechAPI.mUseOnlyGoodSolderingMaterials && !contains(SubTag.SOLDERING_MATERIAL_GOOD)); } public ItemStack getCells(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.cell, this, amount); + return GTOreDictUnificator.get(OrePrefixes.cell, this, amount); } public ItemStack getDust(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.dust, this, amount); + return GTOreDictUnificator.get(OrePrefixes.dust, this, amount); } public ItemStack getDustSmall(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.dustSmall, this, amount); + return GTOreDictUnificator.get(OrePrefixes.dustSmall, this, amount); } public ItemStack getDustTiny(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.dustTiny, this, amount); + return GTOreDictUnificator.get(OrePrefixes.dustTiny, this, amount); } public ItemStack getGems(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.gem, this, amount); + return GTOreDictUnificator.get(OrePrefixes.gem, this, amount); } public ItemStack getIngots(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.ingot, this, amount); + return GTOreDictUnificator.get(OrePrefixes.ingot, this, amount); } public ItemStack getNuggets(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.nugget, this, amount); + return GTOreDictUnificator.get(OrePrefixes.nugget, this, amount); } public ItemStack getBlocks(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.block, this, amount); + return GTOreDictUnificator.get(OrePrefixes.block, this, amount); } public ItemStack getPlates(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.plate, this, amount); + return GTOreDictUnificator.get(OrePrefixes.plate, this, amount); } public static Materials getGtMaterialFromFluid(Fluid fluid) { @@ -3180,6 +3180,6 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { } public ItemStack getNanite(int amount) { - return GT_OreDictUnificator.get(OrePrefixes.nanite, this, amount); + return GTOreDictUnificator.get(OrePrefixes.nanite, this, amount); } } diff --git a/src/main/java/gregtech/api/enums/MaterialsBotania.java b/src/main/java/gregtech/api/enums/MaterialsBotania.java index 6fe538a0bc..6373595e91 100644 --- a/src/main/java/gregtech/api/enums/MaterialsBotania.java +++ b/src/main/java/gregtech/api/enums/MaterialsBotania.java @@ -9,7 +9,7 @@ import static gregtech.api.enums.OrePrefixes.rotor; import java.util.Arrays; -import gregtech.api.enums.TC_Aspects.TC_AspectStack; +import gregtech.api.enums.TCAspects.TC_AspectStack; public class MaterialsBotania { @@ -28,7 +28,7 @@ public class MaterialsBotania { .setBlastFurnaceTemp(1500) .setBlastFurnaceRequired(true) .setAspects( - Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1))) + Arrays.asList(new TC_AspectStack(TCAspects.METALLUM, 3), new TC_AspectStack(TCAspects.PRAECANTATIO, 1))) .constructMaterial(); public static Materials Terrasteel = new MaterialBuilder(202, TextureSet.SET_METALLIC, "Terrasteel") .setName("Terrasteel") @@ -45,9 +45,9 @@ public class MaterialsBotania { .setBlastFurnaceRequired(true) .setAspects( Arrays.asList( - new TC_AspectStack(TC_Aspects.METALLUM, 2), - new TC_AspectStack(TC_Aspects.TERRA, 1), - new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1))) + new TC_AspectStack(TCAspects.METALLUM, 2), + new TC_AspectStack(TCAspects.TERRA, 1), + new TC_AspectStack(TCAspects.PRAECANTATIO, 1))) .constructMaterial(); public static Materials ElvenElementium = new MaterialBuilder(203, TextureSet.SET_METALLIC, "Elven Elementium") .setName("ElvenElementium") @@ -64,9 +64,9 @@ public class MaterialsBotania { .setBlastFurnaceRequired(true) .setAspects( Arrays.asList( - new TC_AspectStack(TC_Aspects.METALLUM, 3), - new TC_AspectStack(TC_Aspects.PRAECANTATIO, 2), - new TC_AspectStack(TC_Aspects.AURAM, 1))) + new TC_AspectStack(TCAspects.METALLUM, 3), + new TC_AspectStack(TCAspects.PRAECANTATIO, 2), + new TC_AspectStack(TCAspects.AURAM, 1))) .constructMaterial(); public static Materials Livingrock = new MaterialBuilder(204, new TextureSet("Livingrock", true), "Livingrock") .setName("Livingrock") @@ -79,7 +79,7 @@ public class MaterialsBotania { .setOreValue(3) .setDensityMultiplier(1) .setDensityDivider(1) - .setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.TERRA, 2), new TC_AspectStack(TC_Aspects.VICTUS, 2))) + .setAspects(Arrays.asList(new TC_AspectStack(TCAspects.TERRA, 2), new TC_AspectStack(TCAspects.VICTUS, 2))) .constructMaterial(); public static Materials GaiaSpirit = new Materials( 205, @@ -105,10 +105,10 @@ public class MaterialsBotania { 1, Dyes._NULL, Arrays.asList( - new TC_AspectStack(TC_Aspects.PRAECANTATIO, 27), - new TC_AspectStack(TC_Aspects.AURAM, 24), - new TC_AspectStack(TC_Aspects.VICTUS, 24), - new TC_AspectStack(TC_Aspects.METALLUM, 1))); + new TC_AspectStack(TCAspects.PRAECANTATIO, 27), + new TC_AspectStack(TCAspects.AURAM, 24), + new TC_AspectStack(TCAspects.VICTUS, 24), + new TC_AspectStack(TCAspects.METALLUM, 1))); public static Materials Livingwood = new MaterialBuilder(206, new TextureSet("Livingwood", true), "Livingwood") .setName("Livingwood") .addDustItems() @@ -121,7 +121,7 @@ public class MaterialsBotania { .setOreValue(3) .setDensityMultiplier(1) .setDensityDivider(1) - .setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.ARBOR, 4), new TC_AspectStack(TC_Aspects.VICTUS, 2))) + .setAspects(Arrays.asList(new TC_AspectStack(TCAspects.ARBOR, 4), new TC_AspectStack(TCAspects.VICTUS, 2))) .constructMaterial(); public static Materials Dreamwood = new MaterialBuilder(207, new TextureSet("Dreamwood", true), "Dreamwood") .setName("Dreamwood") @@ -137,9 +137,9 @@ public class MaterialsBotania { .setDensityDivider(1) .setAspects( Arrays.asList( - new TC_AspectStack(TC_Aspects.ARBOR, 4), - new TC_AspectStack(TC_Aspects.AURAM, 2), - new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1))) + new TC_AspectStack(TCAspects.ARBOR, 4), + new TC_AspectStack(TCAspects.AURAM, 2), + new TC_AspectStack(TCAspects.PRAECANTATIO, 1))) .constructMaterial(); public static Materials ManaDiamond = new Materials( 208, @@ -165,9 +165,9 @@ public class MaterialsBotania { 1, Dyes._NULL, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 4), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 4))); + new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 4), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 4))); public static Materials BotaniaDragonstone = new Materials( 209, TextureSet.SET_DIAMOND, @@ -192,9 +192,9 @@ public class MaterialsBotania { 1, Dyes._NULL, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 4))); + new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 6), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 6), + new TCAspects.TC_AspectStack(TCAspects.AURAM, 4))); public static void init() { GaiaSpirit.mChemicalFormula = "Gs"; diff --git a/src/main/java/gregtech/api/enums/MaterialsGTNH.java b/src/main/java/gregtech/api/enums/MaterialsGTNH.java new file mode 100644 index 0000000000..12a53f6b86 --- /dev/null +++ b/src/main/java/gregtech/api/enums/MaterialsGTNH.java @@ -0,0 +1,626 @@ +package gregtech.api.enums; + +import static gregtech.GTMod.GT_FML_LOGGER; + +import gregtech.api.interfaces.IMaterialHandler; + +public class MaterialsGTNH implements IMaterialHandler { + + public MaterialsGTNH() { + GT_FML_LOGGER.info("Registering GTNH-Materials (post Java 64kb limit)"); + Materials.add(this); + } + + /** + * This Class is for adding new Materials since Java has a Limiation of 64kb per Method / Class header + */ + public static Materials Signalum = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 2, + 255, + 255, + 255, + 0, + "Signalum", + "Signalum", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + + public static Materials Lumium = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 2, + 255, + 255, + 255, + 0, + "Lumium", + "Lumium", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials EnrichedCopper = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 2, + 255, + 255, + 255, + 0, + "EnrichedCopper", + "Enriched Copper", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials DiamondCopper = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 2, + 255, + 255, + 255, + 0, + "DiamondCopper", + "Diamond Copper", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials TarPitch = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 2, + 255, + 255, + 255, + 0, + "TarPitch", + "Tar Pitch", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials LimePure = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 0, + 0, + 255, + 255, + 255, + 0, + "LimePure", + "Pure Lime", + 0, + 0, + -1, + 0, + false, + false, + 1, + 1, + 1, + Dyes.dyeLime); + public static Materials Wimalite = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 8, + 255, + 255, + 255, + 0, + "Wimalite", + "Wimalite", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes.dyeYellow); + public static Materials Yellorite = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 8, + 255, + 255, + 255, + 0, + "Yellorite", + "Yellorite", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes.dyeYellow); + public static Materials Quantum = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 0, + 0, + 255, + 255, + 255, + 0, + "Quantum", + "Quantum", + 0, + 0, + -1, + 0, + false, + false, + 1, + 1, + 1, + Dyes.dyeWhite); + public static Materials Turquoise = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 1, + 255, + 255, + 255, + 0, + "Turquoise", + "Turquoise", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Tapazite = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 1, + 255, + 255, + 255, + 0, + "Tapazite", + "Tapazite", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes.dyeGreen); + public static Materials Thyrium = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 1 | 2 | 8, + 255, + 255, + 255, + 0, + "Thyrium", + "Thyrium", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Tourmaline = new Materials( + -1, + TextureSet.SET_RUBY, + 1.0F, + 0, + 1, + 1, + 255, + 255, + 255, + 0, + "Tourmaline", + "Tourmaline", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Spinel = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 0, + 255, + 255, + 255, + 0, + "Spinel", + "Spinel", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Starconium = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 1 | 2 | 8, + 255, + 255, + 255, + 0, + "Starconium", + "Starconium", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Sugilite = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 1, + 255, + 255, + 255, + 0, + "Sugilite", + "Sugilite", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Prismarine = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 4, + 255, + 255, + 255, + 0, + "Prismarine", + "Prismarine", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials GraveyardDirt = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1, + 255, + 255, + 255, + 0, + "GraveyardDirt", + "Graveyard Dirt", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Tennantite = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1, + 255, + 255, + 255, + 0, + "Tennantite", + "Tennantite", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Fairy = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 2, + 255, + 255, + 255, + 0, + "Fairy", + "Fairy", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Ludicrite = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 1 | 2, + 255, + 255, + 255, + 0, + "Ludicrite", + "Ludicrite", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials AquaRegia = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 0, + 255, + 255, + 255, + 0, + "AquaRegia", + "Aqua Regia", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials SolutionBlueVitriol = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 0, + 255, + 255, + 255, + 0, + "SolutionBlueVitriol", + "Blue Vitriol Solution", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials SolutionNickelSulfate = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 2, + 0, + 255, + 255, + 255, + 0, + "SolutionNickelSulfate", + "Nickel Sulfate Solution", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes._NULL); + public static Materials Lodestone = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 1 | 8, + 255, + 255, + 255, + 0, + "Lodestone", + "Lodestone", + 0, + 0, + -1, + 0, + false, + false, + 1, + 1, + 1, + Dyes._NULL); + public static Materials Luminite = new Materials( + -1, + TextureSet.SET_NONE, + 1.0F, + 0, + 1, + 1 | 8, + 250, + 250, + 250, + 0, + "Luminite", + "Luminite", + 0, + 0, + -1, + 0, + false, + false, + 3, + 1, + 1, + Dyes.dyeWhite); + + private static void initSubTags() { + SubTag.METAL.addTo(Signalum, Lumium, EnrichedCopper, DiamondCopper); + SubTag.NO_SMASHING.addTo(TarPitch); + } + + @Override + public void onMaterialsInit() { + initSubTags(); + } +} diff --git a/src/main/java/gregtech/api/enums/MaterialsKevlar.java b/src/main/java/gregtech/api/enums/MaterialsKevlar.java index 6612bc8b65..bea0c0d244 100644 --- a/src/main/java/gregtech/api/enums/MaterialsKevlar.java +++ b/src/main/java/gregtech/api/enums/MaterialsKevlar.java @@ -21,8 +21,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 2)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))) + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))) .constructMaterial(); // C15H10N2O2 public static Materials DiaminodiphenylmethanMixture = new MaterialBuilder( 795, @@ -39,8 +39,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Nitrogen, 2)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))) .constructMaterial(); // C13H14N2 public static Materials DiphenylmethaneDiisocyanateMixture = new MaterialBuilder( 794, @@ -58,8 +58,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 2)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))) .constructMaterial(); // C15H10N2O2 public static Materials Butyraldehyde = new MaterialBuilder(793, TextureSet.SET_FLUID, "Butyraldehyde") .setName("Butyraldehyde") @@ -74,8 +74,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 1)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1))) .constructMaterial(); // C4H8O public static Materials Isobutyraldehyde = new MaterialBuilder(792, TextureSet.SET_FLUID, "Isobutyraldehyde") .setName("Isobutyraldehyde") @@ -91,8 +91,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 1)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1))) .constructMaterial(); // C4H8O public static Materials NickelTetracarbonyl = new MaterialBuilder(791, TextureSet.SET_FLUID, "Nickel Tetracarbonyl") .setName("NickelTetracarbonyl") @@ -107,8 +107,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 4)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1))) .constructMaterial(); // C4NiO4 public static Materials KevlarCatalyst = new MaterialBuilder(790, TextureSet.SET_DULL, "Polyurethane Catalyst A") .setName("PolyurethaneCatalystADust") @@ -118,8 +118,8 @@ public class MaterialsKevlar { .setMeltingPoint(300) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1))) .constructMaterial(); public static Materials EthyleneOxide = new MaterialBuilder(789, TextureSet.SET_FLUID, "Ethylene Oxide") .setName("EthyleneOxide") @@ -134,8 +134,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 1)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1))) .constructMaterial(); // C2H4O public static Materials SiliconOil = new MaterialBuilder(788, TextureSet.SET_FLUID, "Silicon Oil") .setName("SiliconOil") @@ -146,8 +146,8 @@ public class MaterialsKevlar { .setMeltingPoint(473) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1))) .constructMaterial(); public static Materials Ethyleneglycol = new MaterialBuilder(787, TextureSet.SET_FLUID, "Ethylene Glycol") .setName("EthyleneGlycol") @@ -162,8 +162,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 2)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1))) .constructMaterial(); // C2H6O2 public static Materials Acetaldehyde = new MaterialBuilder(786, TextureSet.SET_FLUID, "Acetaldehyde") .setName("Acetaldehyde") @@ -178,8 +178,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 1)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1))) + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1))) .constructMaterial(); // C2H4O public static Materials Pentaerythritol = new MaterialBuilder(785, TextureSet.SET_DULL, "Pentaerythritol") .setName("Pentaerythritol") @@ -193,8 +193,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 4)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1))) + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1))) .constructMaterial(); // C5H12O4 public static Materials PolyurethaneResin = new MaterialBuilder(784, TextureSet.SET_FLUID, "Polyurethane Resin") .setName("PolyurethaneResin") @@ -219,8 +219,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 1)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))) + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))) .constructMaterial(); // C5H9NO public static Materials TerephthaloylChloride = new MaterialBuilder( 782, @@ -237,8 +237,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 2)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1))) + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1))) .constructMaterial(); // C8H4Cl2O2 public static Materials Acetylene = new MaterialBuilder(781, TextureSet.SET_FLUID, "Acetylene").setName("Acetylene") .addCell() @@ -274,8 +274,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Oxygen, 2)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1))) + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1))) .constructMaterial(); // C6H6N2O2 public static Materials ParaPhenylenediamine = new MaterialBuilder( 779, @@ -291,8 +291,8 @@ public class MaterialsKevlar { new MaterialStack(Materials.Nitrogen, 2)) .setAspects( Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1))) + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1))) .constructMaterial(); // C6H6N2 public static Materials Methylamine = new MaterialBuilder(778, TextureSet.SET_FLUID, "Methylamine") .setName("Methylamine") diff --git a/src/main/java/gregtech/api/enums/MaterialsUEVplus.java b/src/main/java/gregtech/api/enums/MaterialsUEVplus.java index 7542e1f600..49ab432c5f 100644 --- a/src/main/java/gregtech/api/enums/MaterialsUEVplus.java +++ b/src/main/java/gregtech/api/enums/MaterialsUEVplus.java @@ -283,7 +283,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))) .setProcessingMaterialTierEU(TierEU.RECIPE_UEV) .disableAutoGeneratedBlastFurnaceRecipes() .disableAutoGeneratedVacuumFreezerRecipe(); @@ -310,7 +310,7 @@ public class MaterialsUEVplus { 1000, 1000, Dyes.dyeBlack, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))) .disableAutoGeneratedBlastFurnaceRecipes() .disableAutoGeneratedVacuumFreezerRecipe() .setProcessingMaterialTierEU(TierEU.RECIPE_UHV); @@ -337,7 +337,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))) .setProcessingMaterialTierEU(TierEU.RECIPE_UIV); public static Materials RawStarMatter = new Materials( 584, @@ -485,7 +485,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))) .setProcessingMaterialTierEU(TierEU.RECIPE_UMV); public static Materials Eternity = new Materials( @@ -511,7 +511,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))) .disableAutoGeneratedBlastFurnaceRecipes() .disableAutoGeneratedVacuumFreezerRecipe() .setProcessingMaterialTierEU(TierEU.RECIPE_UMV); @@ -563,7 +563,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))) .setProcessingMaterialTierEU(TierEU.RECIPE_UMV); public static Materials QuarkGluonPlasma = new Materials( @@ -661,7 +661,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ITER, 1))) .disableAutoGeneratedBlastFurnaceRecipes() .disableAutoGeneratedVacuumFreezerRecipe() .setProcessingMaterialTierEU(TierEU.RECIPE_UEV); @@ -689,7 +689,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1))) .disableAutoGeneratedBlastFurnaceRecipes() .disableAutoGeneratedVacuumFreezerRecipe() .setProcessingMaterialTierEU(TierEU.RECIPE_UEV); @@ -717,7 +717,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1))) .disableAutoGeneratedBlastFurnaceRecipes() .disableAutoGeneratedVacuumFreezerRecipe() .setProcessingMaterialTierEU(TierEU.RECIPE_UEV) @@ -746,7 +746,7 @@ public class MaterialsUEVplus { 1, 1, Dyes._NULL, - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 150))) + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VACUOS, 150))) .disableAutoGeneratedBlastFurnaceRecipes() .disableAutoGeneratedVacuumFreezerRecipe(); diff --git a/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java index 04a61c713e..4d11475ac4 100644 --- a/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java +++ b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java @@ -560,10 +560,10 @@ public enum MetaTileEntityIDs { GT_Dehydrator_IV(814), GT_Dehydrator_LuV(815), GT_Dehydrator_ZPM(816), - GT_FluidTank_ULV(817), - GT_FluidTank_LV(818), - GT_FluidTank_MV(819), - GT_FluidTank_HV(820), + GTFluidTank_ULV(817), + GTFluidTank_LV(818), + GTFluidTank_MV(819), + GTFluidTank_HV(820), COMET_Cyclotron(828), Industrial_FishingPond(829), Geothermal_Engine_EV(830), diff --git a/src/main/java/gregtech/api/enums/OreMixes.java b/src/main/java/gregtech/api/enums/OreMixes.java index c5c306baab..0a4b2fbc4e 100644 --- a/src/main/java/gregtech/api/enums/OreMixes.java +++ b/src/main/java/gregtech/api/enums/OreMixes.java @@ -1,15 +1,15 @@ package gregtech.api.enums; -import static bloodasp.galacticgreg.api.enums.DimensionDef.*; +import static galacticgreg.api.enums.DimensionDef.*; import static gregtech.common.OreMixBuilder.NETHER; import static gregtech.common.OreMixBuilder.OW; import static gregtech.common.OreMixBuilder.THE_END; import static gregtech.common.OreMixBuilder.TWILIGHT_FOREST; -import bloodasp.galacticgreg.GT_Worldgen_GT_Ore_Layer_Space; -import bloodasp.galacticgreg.api.enums.DimensionDef; -import gregtech.common.GT_Worldgen_GT_Ore_Layer; +import galacticgreg.WorldgenOreLayerSpace; +import galacticgreg.api.enums.DimensionDef; import gregtech.common.OreMixBuilder; +import gregtech.common.WorldgenGTOreLayer; public enum OreMixes { @@ -972,11 +972,11 @@ public enum OreMixes { this.oreMixBuilder = oreMixBuilder; } - public GT_Worldgen_GT_Ore_Layer addGTOreLayer() { - return new GT_Worldgen_GT_Ore_Layer(this.oreMixBuilder); + public WorldgenGTOreLayer addGTOreLayer() { + return new WorldgenGTOreLayer(this.oreMixBuilder); } - public GT_Worldgen_GT_Ore_Layer_Space addGaGregOreLayer() { - return new GT_Worldgen_GT_Ore_Layer_Space(this.oreMixBuilder); + public WorldgenOreLayerSpace addGaGregOreLayer() { + return new WorldgenOreLayerSpace(this.oreMixBuilder); } } diff --git a/src/main/java/gregtech/api/enums/OrePrefixes.java b/src/main/java/gregtech/api/enums/OrePrefixes.java index 7beaea9254..5f1ca97e83 100644 --- a/src/main/java/gregtech/api/enums/OrePrefixes.java +++ b/src/main/java/gregtech/api/enums/OrePrefixes.java @@ -1,8 +1,8 @@ package gregtech.api.enums; -import static gregtech.api.enums.GT_Values.B; -import static gregtech.api.enums.GT_Values.D2; -import static gregtech.api.enums.GT_Values.M; +import static gregtech.api.enums.GTValues.B; +import static gregtech.api.enums.GTValues.D2; +import static gregtech.api.enums.GTValues.M; import java.util.ArrayList; import java.util.Arrays; @@ -15,16 +15,16 @@ import net.minecraft.item.ItemStack; import com.google.common.collect.ImmutableList; -import gregtech.api.enums.TC_Aspects.TC_AspectStack; +import gregtech.api.enums.TCAspects.TC_AspectStack; import gregtech.api.interfaces.ICondition; import gregtech.api.interfaces.IOreRecipeRegistrator; import gregtech.api.interfaces.ISubTagContainer; -import gregtech.api.objects.GT_ArrayList; -import gregtech.api.objects.GT_ItemStack; +import gregtech.api.objects.GTArrayList; +import gregtech.api.objects.GTItemStack; import gregtech.api.objects.ItemData; import gregtech.api.objects.MaterialStack; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; import gregtech.loaders.materialprocessing.ProcessingModSupport; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import it.unimi.dsi.fastutil.objects.ObjectSet; @@ -932,7 +932,7 @@ public enum OrePrefixes { bulletGtLarge.mSecondaryMaterial = new MaterialStack(Materials.Brass, ingot.mMaterialAmount / 3); } - public final ArrayList mPrefixedItems = new GT_ArrayList<>(false, 16); + public final ArrayList mPrefixedItems = new GTArrayList<>(false, 16); public final short mTextureIndex; public final String mRegularLocalName, mLocalizedMaterialPre, mLocalizedMaterialPost; public final boolean mIsUsedForOreProcessing, mIsEnchantable, mIsUnificatable, mIsMaterialBased, mIsSelfReferencing, @@ -957,7 +957,7 @@ public enum OrePrefixes { private final ObjectSet mContainsTestCache = new ObjectOpenCustomHashSet<>( 512, 0.5f, - GT_ItemStack.ITEMSTACK_HASH_STRATEGY2); + GTItemStack.ITEMSTACK_HASH_STRATEGY2); public static final List mPreventableComponents = new LinkedList<>( Arrays.asList( OrePrefixes.gem, @@ -1037,36 +1037,36 @@ public enum OrePrefixes { mTextureIndex = (short) aTextureindex; if (name().startsWith("ore")) { - new TC_AspectStack(TC_Aspects.TERRA, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.TERRA, 1).addToAspectList(mAspects); } else if (name().startsWith("wire") || name().startsWith("cable")) { - new TC_AspectStack(TC_Aspects.ELECTRUM, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.ELECTRUM, 1).addToAspectList(mAspects); } else if (name().startsWith("dust")) { - new TC_AspectStack(TC_Aspects.PERDITIO, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.PERDITIO, 1).addToAspectList(mAspects); } else if (name().startsWith("crushed")) { - new TC_AspectStack(TC_Aspects.PERFODIO, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.PERFODIO, 1).addToAspectList(mAspects); } else if (name().startsWith("ingot") || name().startsWith("nugget")) { - new TC_AspectStack(TC_Aspects.METALLUM, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.METALLUM, 1).addToAspectList(mAspects); } else if (name().startsWith("armor")) { - new TC_AspectStack(TC_Aspects.TUTAMEN, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.TUTAMEN, 1).addToAspectList(mAspects); } else if (name().startsWith("stone")) { - new TC_AspectStack(TC_Aspects.TERRA, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.TERRA, 1).addToAspectList(mAspects); } else if (name().startsWith("pipe")) { - new TC_AspectStack(TC_Aspects.ITER, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.ITER, 1).addToAspectList(mAspects); } else if (name().startsWith("gear")) { - new TC_AspectStack(TC_Aspects.MOTUS, 1).addToAspectList(mAspects); - new TC_AspectStack(TC_Aspects.MACHINA, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.MOTUS, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.MACHINA, 1).addToAspectList(mAspects); } else if (name().startsWith("frame") || name().startsWith("plate")) { - new TC_AspectStack(TC_Aspects.FABRICO, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.FABRICO, 1).addToAspectList(mAspects); } else if (name().startsWith("tool")) { - new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.INSTRUMENTUM, 2).addToAspectList(mAspects); } else if (name().startsWith("gem") || name().startsWith("crystal") || name().startsWith("lens")) { - new TC_AspectStack(TC_Aspects.VITREUS, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.VITREUS, 1).addToAspectList(mAspects); } else if (name().startsWith("circuit")) { - new TC_AspectStack(TC_Aspects.COGNITIO, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.COGNITIO, 1).addToAspectList(mAspects); } else if (name().startsWith("computer")) { - new TC_AspectStack(TC_Aspects.COGNITIO, 4).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.COGNITIO, 4).addToAspectList(mAspects); } else if (name().startsWith("battery")) { - new TC_AspectStack(TC_Aspects.ELECTRUM, 1).addToAspectList(mAspects); + new TC_AspectStack(TCAspects.ELECTRUM, 1).addToAspectList(mAspects); } } @@ -1113,7 +1113,7 @@ public enum OrePrefixes { } public static OrePrefixes getPrefix(String aPrefixName, OrePrefixes aReplacement) { - Object tObject = GT_Utility.getFieldContent(OrePrefixes.class, aPrefixName, false, false); + Object tObject = GTUtility.getFieldContent(OrePrefixes.class, aPrefixName, false, false); if (tObject instanceof OrePrefixes) return (OrePrefixes) tObject; return aReplacement; } @@ -1145,13 +1145,13 @@ public enum OrePrefixes { } public boolean contains(ItemStack aStack) { - return !GT_Utility.isStackInvalid(aStack) && mContainsTestCache.contains(aStack); + return !GTUtility.isStackInvalid(aStack) && mContainsTestCache.contains(aStack); } public boolean containsUnCached(ItemStack aStack) { // In case someone needs this for (ItemStack tStack : mPrefixedItems) { - if (GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())) { + if (GTUtility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())) { return true; } } @@ -1197,20 +1197,20 @@ public enum OrePrefixes { } if (!((aMaterial != Materials._NULL || mIsSelfReferencing || !mIsMaterialBased) - && GT_Utility.isStackValid(aStack))) { + && GTUtility.isStackValid(aStack))) { return; } for (IOreRecipeRegistrator tRegistrator : mOreProcessing) { - if (D2) GT_Log.ore.println( + if (D2) GTLog.ore.println( "Processing '" + aOreDictName + "' with the Prefix '" + name() + "' and the Material '" + aMaterial.mName + "' at " - + GT_Utility.getClassName(tRegistrator)); - tRegistrator.registerOre(this, aMaterial, aOreDictName, aModName, GT_Utility.copyAmount(1, aStack)); + + GTUtility.getClassName(tRegistrator)); + tRegistrator.registerOre(this, aMaterial, aOreDictName, aModName, GTUtility.copyAmount(1, aStack)); } } diff --git a/src/main/java/gregtech/api/enums/SmallOres.java b/src/main/java/gregtech/api/enums/SmallOres.java index 6de67bc3b9..3cd15b5f86 100644 --- a/src/main/java/gregtech/api/enums/SmallOres.java +++ b/src/main/java/gregtech/api/enums/SmallOres.java @@ -1,43 +1,43 @@ package gregtech.api.enums; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Anubis; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Asteroids; -import static bloodasp.galacticgreg.api.enums.DimensionDef.BarnardE; -import static bloodasp.galacticgreg.api.enums.DimensionDef.BarnardF; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Callisto; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Ceres; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Deimos; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Enceladus; -import static bloodasp.galacticgreg.api.enums.DimensionDef.EndAsteroids; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Ganymede; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Haumea; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Horus; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Io; -import static bloodasp.galacticgreg.api.enums.DimensionDef.KuiperBelt; -import static bloodasp.galacticgreg.api.enums.DimensionDef.MakeMake; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Mars; -import static bloodasp.galacticgreg.api.enums.DimensionDef.MehenBelt; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Mercury; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Miranda; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Moon; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Oberon; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Phobos; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Pluto; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Proteus; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Seth; -import static bloodasp.galacticgreg.api.enums.DimensionDef.TcetiE; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Titan; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Triton; -import static bloodasp.galacticgreg.api.enums.DimensionDef.VegaB; -import static bloodasp.galacticgreg.api.enums.DimensionDef.Venus; +import static galacticgreg.api.enums.DimensionDef.Anubis; +import static galacticgreg.api.enums.DimensionDef.Asteroids; +import static galacticgreg.api.enums.DimensionDef.BarnardE; +import static galacticgreg.api.enums.DimensionDef.BarnardF; +import static galacticgreg.api.enums.DimensionDef.Callisto; +import static galacticgreg.api.enums.DimensionDef.Ceres; +import static galacticgreg.api.enums.DimensionDef.Deimos; +import static galacticgreg.api.enums.DimensionDef.Enceladus; +import static galacticgreg.api.enums.DimensionDef.EndAsteroids; +import static galacticgreg.api.enums.DimensionDef.Ganymede; +import static galacticgreg.api.enums.DimensionDef.Haumea; +import static galacticgreg.api.enums.DimensionDef.Horus; +import static galacticgreg.api.enums.DimensionDef.Io; +import static galacticgreg.api.enums.DimensionDef.KuiperBelt; +import static galacticgreg.api.enums.DimensionDef.MakeMake; +import static galacticgreg.api.enums.DimensionDef.Mars; +import static galacticgreg.api.enums.DimensionDef.MehenBelt; +import static galacticgreg.api.enums.DimensionDef.Mercury; +import static galacticgreg.api.enums.DimensionDef.Miranda; +import static galacticgreg.api.enums.DimensionDef.Moon; +import static galacticgreg.api.enums.DimensionDef.Oberon; +import static galacticgreg.api.enums.DimensionDef.Phobos; +import static galacticgreg.api.enums.DimensionDef.Pluto; +import static galacticgreg.api.enums.DimensionDef.Proteus; +import static galacticgreg.api.enums.DimensionDef.Seth; +import static galacticgreg.api.enums.DimensionDef.TcetiE; +import static galacticgreg.api.enums.DimensionDef.Titan; +import static galacticgreg.api.enums.DimensionDef.Triton; +import static galacticgreg.api.enums.DimensionDef.VegaB; +import static galacticgreg.api.enums.DimensionDef.Venus; import static gregtech.common.SmallOreBuilder.NETHER; import static gregtech.common.SmallOreBuilder.OW; import static gregtech.common.SmallOreBuilder.THE_END; import static gregtech.common.SmallOreBuilder.TWILIGHT_FOREST; -import bloodasp.galacticgreg.GT_Worldgen_GT_Ore_SmallPieces_Space; -import gregtech.common.GT_Worldgen_GT_Ore_SmallPieces; +import galacticgreg.WorldgenOreSmallSpace; import gregtech.common.SmallOreBuilder; +import gregtech.common.WorldgenGTOreSmallPieces; public enum SmallOres { @@ -545,11 +545,11 @@ public enum SmallOres { this.smallOreBuilder = smallOreBuilder; } - public GT_Worldgen_GT_Ore_SmallPieces addGTSmallOre() { - return new GT_Worldgen_GT_Ore_SmallPieces(this.smallOreBuilder); + public WorldgenGTOreSmallPieces addGTSmallOre() { + return new WorldgenGTOreSmallPieces(this.smallOreBuilder); } - public GT_Worldgen_GT_Ore_SmallPieces_Space addGaGregSmallOre() { - return new GT_Worldgen_GT_Ore_SmallPieces_Space(this.smallOreBuilder); + public WorldgenOreSmallSpace addGaGregSmallOre() { + return new WorldgenOreSmallSpace(this.smallOreBuilder); } } diff --git a/src/main/java/gregtech/api/enums/SoundResource.java b/src/main/java/gregtech/api/enums/SoundResource.java index 712c1b5016..e2a6b2630a 100644 --- a/src/main/java/gregtech/api/enums/SoundResource.java +++ b/src/main/java/gregtech/api/enums/SoundResource.java @@ -12,6 +12,8 @@ import net.minecraft.util.ResourceLocation; import com.google.common.collect.Maps; +import gregtech.api.GregTechAPI; + /** * Enumerates known sounds with id and resource-location * @@ -361,7 +363,7 @@ public enum SoundResource { /** * Provides a backward-compatible Sounds {@code Map} sound list * - * @return The map for the deprecated {@link gregtech.api.GregTech_API#sSoundList} + * @return The map for the deprecated {@link GregTechAPI#sSoundList} * @deprecated This method is planned for removal. *

* Use this {@link SoundResource} enum instead. diff --git a/src/main/java/gregtech/api/enums/TAE.java b/src/main/java/gregtech/api/enums/TAE.java index 246b2006ea..79d3037a5a 100644 --- a/src/main/java/gregtech/api/enums/TAE.java +++ b/src/main/java/gregtech/api/enums/TAE.java @@ -8,9 +8,9 @@ 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.lib.GTPPCore; import gtPlusPlus.core.util.reflect.ReflectionUtils; -import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture; +import gtPlusPlus.xmod.gregtech.api.objects.GTPPCopiedBlockTexture; public class TAE { @@ -19,7 +19,7 @@ public class TAE { public static int gtPPLastUsedIndex = 64; public static int secondaryIndex = 0; - public static HashMap mTAE = new HashMap<>(); + public static HashMap mTAE = new HashMap<>(); private static final HashSet mFreeSlots = new HashSet<>(64); static { @@ -31,23 +31,23 @@ public class 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 + * @param aPage - The Texture page (0-3) + * @param aID - The ID on the specified page (0-15) + * @param GTPPCopiedBlockTexture - The Texture to register * @return - Did it register correctly? */ - public static boolean registerTexture(int aPage, int aID, GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) { + public static boolean registerTexture(int aPage, int aID, GTPPCopiedBlockTexture GTPPCopiedBlockTexture) { int aRealID = aID + (aPage * 16); - return registerTexture(64 + aRealID, GTPP_CopiedBlockTexture); + return registerTexture(64 + aRealID, GTPPCopiedBlockTexture); } - public static boolean registerTexture(int aID, GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) { + public static boolean registerTexture(int aID, GTPPCopiedBlockTexture GTPPCopiedBlockTexture) { if (mFreeSlots.contains(aID)) { mFreeSlots.remove(aID); - mTAE.put(aID, GTPP_CopiedBlockTexture); + mTAE.put(aID, GTPPCopiedBlockTexture); return true; } else { - CORE.crash("Tried to register texture with ID " + aID + " to TAE, but it is already in use."); + GTPPCore.crash("Tried to register texture with ID " + aID + " to TAE, but it is already in use."); return false; // Dead Code } } @@ -69,7 +69,7 @@ public class TAE { 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)); + registerTexture(aFreeSlot, new GTPPCopiedBlockTexture(ModBlocks.blockCasingsTieredGTPP, 1, 15)); } Logger.INFO("Finalising TAE."); for (int aKeyTae : mTAE.keySet()) { @@ -78,7 +78,7 @@ public class TAE { Logger.INFO("Finalised TAE."); } - private static boolean registerTextures(GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) { + private static boolean registerTextures(GTPPCopiedBlockTexture GTPPCopiedBlockTexture) { try { // Handle page 2. Logger.INFO("[TAE} Registering Texture, Last used casing ID is " + gtPPLastUsedIndex + "."); @@ -87,7 +87,7 @@ public class TAE { if (x != null) { ITexture[][] h = (ITexture[][]) x.get(null); if (h != null) { - h[64][secondaryIndex++] = GTPP_CopiedBlockTexture; + h[64][secondaryIndex++] = GTPPCopiedBlockTexture; x.set(null, h); Logger .INFO("[TAE} Registered Texture with ID " + (secondaryIndex - 1) + " in secondary index."); @@ -98,7 +98,7 @@ public class TAE { // set to page 1. else { - Textures.BlockIcons.setCasingTextureForId(gtPPLastUsedIndex, GTPP_CopiedBlockTexture); + Textures.BlockIcons.setCasingTextureForId(gtPPLastUsedIndex, GTPPCopiedBlockTexture); Logger.INFO("[TAE} Registered Texture with ID " + (gtPPLastUsedIndex) + " in main index."); gtPPLastUsedIndex++; return true; diff --git a/src/main/java/gregtech/api/enums/TCAspects.java b/src/main/java/gregtech/api/enums/TCAspects.java new file mode 100644 index 0000000000..31ec9c0bc8 --- /dev/null +++ b/src/main/java/gregtech/api/enums/TCAspects.java @@ -0,0 +1,112 @@ +package gregtech.api.enums; + +import java.util.List; + +public enum TCAspects { + + AER(1), + ALIENIS(20), + AQUA(3), + ARBOR(1), + AURAM(16), + BESTIA(6), + COGNITIO(2), + CORPUS(2), + ELECTRUM(24), + EXANIMIS(32), + FABRICO(2), + FAMES(2), + GELUM(1), + GRANUM(4), + HERBA(2), + HUMANUS(8), + IGNIS(4), + INSTRUMENTUM(4), + ITER(6), + LIMUS(3), + LUCRUM(32), + LUX(4), + MACHINA(16), + MAGNETO(24), + MESSIS(3), + METALLUM(8), + METO(2), + MORTUUS(16), + MOTUS(4), + NEBRISUM(48), + ORDO(8), + PANNUS(6), + PERDITIO(2), + PERFODIO(4), + PERMUTATIO(12), + POTENTIA(16), + PRAECANTATIO(16), + RADIO(48), + SANO(24), + SENSUS(4), + SPIRITUS(24), + STRONTIO(64), + TELUM(6), + TERRA(1), + TEMPESTAS(64), + TENEBRAE(24), + TUTAMEN(12), + VACUOS(6), + VENENUM(16), + VICTUS(4), + VINCULUM(16), + VITIUM(48), + VITREUS(3), + VOLATUS(12); + + /** + * The Thaumcraft Aspect Object of the Mod itself. + */ + public Object mAspect; + + public final int mValue; + + TCAspects(int aValue) { + mValue = aValue; + } + + public static class TC_AspectStack { + + public TCAspects mAspect; + public long mAmount; + + public TC_AspectStack(TCAspects aAspect, long aAmount) { + mAspect = aAspect; + mAmount = aAmount; + } + + public TC_AspectStack copy() { + return new TC_AspectStack(mAspect, mAmount); + } + + public TC_AspectStack copy(long aAmount) { + return new TC_AspectStack(mAspect, aAmount); + } + + public List addToAspectList(List aList) { + if (mAmount == 0) return aList; + for (TC_AspectStack tAspect : aList) if (tAspect.mAspect == mAspect) { + tAspect.mAmount += mAmount; + return aList; + } + aList.add(copy()); + return aList; + } + + public boolean removeFromAspectList(List aList) { + for (TC_AspectStack tAspect : aList) if (tAspect.mAspect == mAspect) { + if (tAspect.mAmount >= mAmount) { + tAspect.mAmount -= mAmount; + if (tAspect.mAmount == 0) aList.remove(tAspect); + return true; + } + } + return false; + } + } +} diff --git a/src/main/java/gregtech/api/enums/TC_Aspects.java b/src/main/java/gregtech/api/enums/TC_Aspects.java deleted file mode 100644 index 24d19b0b73..0000000000 --- a/src/main/java/gregtech/api/enums/TC_Aspects.java +++ /dev/null @@ -1,112 +0,0 @@ -package gregtech.api.enums; - -import java.util.List; - -public enum TC_Aspects { - - AER(1), - ALIENIS(20), - AQUA(3), - ARBOR(1), - AURAM(16), - BESTIA(6), - COGNITIO(2), - CORPUS(2), - ELECTRUM(24), - EXANIMIS(32), - FABRICO(2), - FAMES(2), - GELUM(1), - GRANUM(4), - HERBA(2), - HUMANUS(8), - IGNIS(4), - INSTRUMENTUM(4), - ITER(6), - LIMUS(3), - LUCRUM(32), - LUX(4), - MACHINA(16), - MAGNETO(24), - MESSIS(3), - METALLUM(8), - METO(2), - MORTUUS(16), - MOTUS(4), - NEBRISUM(48), - ORDO(8), - PANNUS(6), - PERDITIO(2), - PERFODIO(4), - PERMUTATIO(12), - POTENTIA(16), - PRAECANTATIO(16), - RADIO(48), - SANO(24), - SENSUS(4), - SPIRITUS(24), - STRONTIO(64), - TELUM(6), - TERRA(1), - TEMPESTAS(64), - TENEBRAE(24), - TUTAMEN(12), - VACUOS(6), - VENENUM(16), - VICTUS(4), - VINCULUM(16), - VITIUM(48), - VITREUS(3), - VOLATUS(12); - - /** - * The Thaumcraft Aspect Object of the Mod itself. - */ - public Object mAspect; - - public final int mValue; - - TC_Aspects(int aValue) { - mValue = aValue; - } - - public static class TC_AspectStack { - - public TC_Aspects mAspect; - public long mAmount; - - public TC_AspectStack(TC_Aspects aAspect, long aAmount) { - mAspect = aAspect; - mAmount = aAmount; - } - - public TC_AspectStack copy() { - return new TC_AspectStack(mAspect, mAmount); - } - - public TC_AspectStack copy(long aAmount) { - return new TC_AspectStack(mAspect, aAmount); - } - - public List addToAspectList(List aList) { - if (mAmount == 0) return aList; - for (TC_AspectStack tAspect : aList) if (tAspect.mAspect == mAspect) { - tAspect.mAmount += mAmount; - return aList; - } - aList.add(copy()); - return aList; - } - - public boolean removeFromAspectList(List aList) { - for (TC_AspectStack tAspect : aList) if (tAspect.mAspect == mAspect) { - if (tAspect.mAmount >= mAmount) { - tAspect.mAmount -= mAmount; - if (tAspect.mAmount == 0) aList.remove(tAspect); - return true; - } - } - return false; - } - } -} diff --git a/src/main/java/gregtech/api/enums/Textures.java b/src/main/java/gregtech/api/enums/Textures.java index 7caa8f41e5..7e5aedbcea 100644 --- a/src/main/java/gregtech/api/enums/Textures.java +++ b/src/main/java/gregtech/api/enums/Textures.java @@ -9,11 +9,11 @@ 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.GregTechAPI; import gregtech.api.interfaces.IIconContainer; import gregtech.api.interfaces.ITexture; import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class Textures { @@ -1762,17 +1762,17 @@ public class Textures { Dyes.getModulation(j - 1, Dyes.MACHINE_METAL.mRGBa)); casingTexturePages[0] = new ITexture[128]; // adds some known pages, modders also can do it... - GT_Utility.addTexturePage((byte) 1); - GT_Utility.addTexturePage((byte) 2); - GT_Utility.addTexturePage((byte) 8); - GT_Utility.addTexturePage((byte) 16); + GTUtility.addTexturePage((byte) 1); + GTUtility.addTexturePage((byte) 2); + GTUtility.addTexturePage((byte) 8); + GTUtility.addTexturePage((byte) 16); setCasingTextureForId(ERROR_TEXTURE_INDEX, ERROR_RENDERING[0]); } IIcon mIcon; BlockIcons() { - GregTech_API.sGTBlockIconload.add(this); + GregTechAPI.sGTBlockIconload.add(this); } public static ITexture getCasingTextureForId(int id) { @@ -1813,7 +1813,7 @@ public class Textures { @Override public void run() { - mIcon = GregTech_API.sBlockIcons.registerIcon(GregTech.getResourcePath("iconsets", this.toString())); + mIcon = GregTechAPI.sBlockIcons.registerIcon(GregTech.getResourcePath("iconsets", this.toString())); } public static class CustomIcon implements IIconContainer, Runnable { @@ -1823,12 +1823,12 @@ public class Textures { public CustomIcon(String aIconName) { mIconName = !aIconName.contains(":") ? GregTech.getResourcePath(aIconName) : aIconName; - GregTech_API.sGTBlockIconload.add(this); + GregTechAPI.sGTBlockIconload.add(this); } @Override public void run() { - mIcon = GregTech_API.sBlockIcons.registerIcon(mIconName); + mIcon = GregTechAPI.sBlockIcons.registerIcon(mIconName); } @Override @@ -1918,7 +1918,7 @@ public class Textures { IIcon mIcon, mOverlay; ItemIcons() { - GregTech_API.sGTItemIconload.add(this); + GregTechAPI.sGTItemIconload.add(this); } @Override @@ -1938,8 +1938,8 @@ public class Textures { @Override public void run() { - mIcon = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath("iconsets", this.toString())); - mOverlay = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath("iconsets", this + "_OVERLAY")); + mIcon = GregTechAPI.sItemIcons.registerIcon(GregTech.getResourcePath("iconsets", this.toString())); + mOverlay = GregTechAPI.sItemIcons.registerIcon(GregTech.getResourcePath("iconsets", this + "_OVERLAY")); } public static class CustomIcon implements IIconContainer, Runnable { @@ -1949,7 +1949,7 @@ public class Textures { public CustomIcon(String aIconName) { mIconName = aIconName; - GregTech_API.sGTItemIconload.add(this); + GregTechAPI.sGTItemIconload.add(this); } @Override @@ -1969,8 +1969,8 @@ public class Textures { @Override public void run() { - mIcon = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath(mIconName)); - mOverlay = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath(mIconName + "_OVERLAY")); + mIcon = GregTechAPI.sItemIcons.registerIcon(GregTech.getResourcePath(mIconName)); + mOverlay = GregTechAPI.sItemIcons.registerIcon(GregTech.getResourcePath(mIconName + "_OVERLAY")); } } } diff --git a/src/main/java/gregtech/api/enums/Tier.java b/src/main/java/gregtech/api/enums/Tier.java index 2d64444283..572f2e8b2a 100644 --- a/src/main/java/gregtech/api/enums/Tier.java +++ b/src/main/java/gregtech/api/enums/Tier.java @@ -1,6 +1,6 @@ package gregtech.api.enums; -import static gregtech.api.enums.GT_Values.V; +import static gregtech.api.enums.GTValues.V; /** * Experimental Class for later diff --git a/src/main/java/gregtech/api/enums/TierEU.java b/src/main/java/gregtech/api/enums/TierEU.java index 26b6393115..713f48b3ff 100644 --- a/src/main/java/gregtech/api/enums/TierEU.java +++ b/src/main/java/gregtech/api/enums/TierEU.java @@ -1,40 +1,40 @@ package gregtech.api.enums; -import static gregtech.api.enums.GT_Values.V; +import static gregtech.api.enums.GTValues.V; public class TierEU { // Do NOT use these for crafting recipes as they are exactly 1A! Use RECIPE_ULV etc. - public static final long ULV = V[GTVoltageIndex.ULV]; - public static final long LV = V[GTVoltageIndex.LV]; - public static final long MV = V[GTVoltageIndex.MV]; - public static final long HV = V[GTVoltageIndex.HV]; - public static final long EV = V[GTVoltageIndex.EV]; - public static final long IV = V[GTVoltageIndex.IV]; - public static final long LuV = V[GTVoltageIndex.LuV]; - public static final long ZPM = V[GTVoltageIndex.ZPM]; - public static final long UV = V[GTVoltageIndex.UV]; - public static final long UHV = V[GTVoltageIndex.UHV]; - public static final long UEV = V[GTVoltageIndex.UEV]; - public static final long UIV = V[GTVoltageIndex.UIV]; - public static final long UMV = V[GTVoltageIndex.UMV]; - public static final long UXV = V[GTVoltageIndex.UXV]; - public static final long MAX = V[GTVoltageIndex.MAX]; + public static final long ULV = V[VoltageIndex.ULV]; + public static final long LV = V[VoltageIndex.LV]; + public static final long MV = V[VoltageIndex.MV]; + public static final long HV = V[VoltageIndex.HV]; + public static final long EV = V[VoltageIndex.EV]; + public static final long IV = V[VoltageIndex.IV]; + public static final long LuV = V[VoltageIndex.LuV]; + public static final long ZPM = V[VoltageIndex.ZPM]; + public static final long UV = V[VoltageIndex.UV]; + public static final long UHV = V[VoltageIndex.UHV]; + public static final long UEV = V[VoltageIndex.UEV]; + public static final long UIV = V[VoltageIndex.UIV]; + public static final long UMV = V[VoltageIndex.UMV]; + public static final long UXV = V[VoltageIndex.UXV]; + public static final long MAX = V[VoltageIndex.MAX]; // Use me for recipes. - public static final long RECIPE_ULV = GT_Values.VP[GTVoltageIndex.ULV]; - public static final long RECIPE_LV = GT_Values.VP[GTVoltageIndex.LV]; - public static final long RECIPE_MV = GT_Values.VP[GTVoltageIndex.MV]; - public static final long RECIPE_HV = GT_Values.VP[GTVoltageIndex.HV]; - public static final long RECIPE_EV = GT_Values.VP[GTVoltageIndex.EV]; - public static final long RECIPE_IV = GT_Values.VP[GTVoltageIndex.IV]; - public static final long RECIPE_LuV = GT_Values.VP[GTVoltageIndex.LuV]; - public static final long RECIPE_ZPM = GT_Values.VP[GTVoltageIndex.ZPM]; - public static final long RECIPE_UV = GT_Values.VP[GTVoltageIndex.UV]; - public static final long RECIPE_UHV = GT_Values.VP[GTVoltageIndex.UHV]; - public static final long RECIPE_UEV = GT_Values.VP[GTVoltageIndex.UEV]; - public static final long RECIPE_UIV = GT_Values.VP[GTVoltageIndex.UIV]; - public static final long RECIPE_UMV = GT_Values.VP[GTVoltageIndex.UMV]; - public static final long RECIPE_UXV = GT_Values.VP[GTVoltageIndex.UXV]; - public static final long RECIPE_MAX = GT_Values.VP[GTVoltageIndex.MAX]; + public static final long RECIPE_ULV = GTValues.VP[VoltageIndex.ULV]; + public static final long RECIPE_LV = GTValues.VP[VoltageIndex.LV]; + public static final long RECIPE_MV = GTValues.VP[VoltageIndex.MV]; + public static final long RECIPE_HV = GTValues.VP[VoltageIndex.HV]; + public static final long RECIPE_EV = GTValues.VP[VoltageIndex.EV]; + public static final long RECIPE_IV = GTValues.VP[VoltageIndex.IV]; + public static final long RECIPE_LuV = GTValues.VP[VoltageIndex.LuV]; + public static final long RECIPE_ZPM = GTValues.VP[VoltageIndex.ZPM]; + public static final long RECIPE_UV = GTValues.VP[VoltageIndex.UV]; + public static final long RECIPE_UHV = GTValues.VP[VoltageIndex.UHV]; + public static final long RECIPE_UEV = GTValues.VP[VoltageIndex.UEV]; + public static final long RECIPE_UIV = GTValues.VP[VoltageIndex.UIV]; + public static final long RECIPE_UMV = GTValues.VP[VoltageIndex.UMV]; + public static final long RECIPE_UXV = GTValues.VP[VoltageIndex.UXV]; + public static final long RECIPE_MAX = GTValues.VP[VoltageIndex.MAX]; } diff --git a/src/main/java/gregtech/api/enums/VoidingMode.java b/src/main/java/gregtech/api/enums/VoidingMode.java index 8ae9dda57d..c41236c8ab 100644 --- a/src/main/java/gregtech/api/enums/VoidingMode.java +++ b/src/main/java/gregtech/api/enums/VoidingMode.java @@ -8,28 +8,27 @@ import javax.annotation.Nonnull; import com.gtnewhorizons.modularui.api.drawable.UITexture; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; public enum VoidingMode { /** * Voids nothing, protects both item and fluid */ - VOID_NONE(true, true, GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_NONE, "none"), + VOID_NONE(true, true, GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_VOID_EXCESS_NONE, "none"), /** * Voids item, protects fluid */ - VOID_ITEM(false, true, GT_UITextures.BUTTON_STANDARD_PRESSED, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ITEM, - "item"), + VOID_ITEM(false, true, GTUITextures.BUTTON_STANDARD_PRESSED, GTUITextures.OVERLAY_BUTTON_VOID_EXCESS_ITEM, "item"), /** * Voids fluid, protects item */ - VOID_FLUID(true, false, GT_UITextures.BUTTON_STANDARD_PRESSED, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_FLUID, + VOID_FLUID(true, false, GTUITextures.BUTTON_STANDARD_PRESSED, GTUITextures.OVERLAY_BUTTON_VOID_EXCESS_FLUID, "fluid"), /** * Voids all, protects nothing */ - VOID_ALL(false, false, GT_UITextures.BUTTON_STANDARD_PRESSED, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ALL, "all"); + VOID_ALL(false, false, GTUITextures.BUTTON_STANDARD_PRESSED, GTUITextures.OVERLAY_BUTTON_VOID_EXCESS_ALL, "all"); /** * Default set of voiding mode you will probably support. diff --git a/src/main/java/gregtech/api/enums/VoltageIndex.java b/src/main/java/gregtech/api/enums/VoltageIndex.java new file mode 100644 index 0000000000..f0303b27b0 --- /dev/null +++ b/src/main/java/gregtech/api/enums/VoltageIndex.java @@ -0,0 +1,22 @@ +package gregtech.api.enums; + +public class VoltageIndex { + + public final static int ULV = 0; + public final static int LV = 1; + public final static int MV = 2; + public final static int HV = 3; + public final static int EV = 4; + public final static int IV = 5; + public final static int LuV = 6; + public final static int ZPM = 7; + public final static int UV = 8; + public final static int UHV = 9; + public final static int UEV = 10; + public final static int UIV = 11; + public final static int UMV = 12; + public final static int UXV = 13; + public final static int MAX = 14; + + private VoltageIndex() {} +} diff --git a/src/main/java/gregtech/api/fluid/FluidTankGT.java b/src/main/java/gregtech/api/fluid/FluidTankGT.java deleted file mode 100644 index 0c224985e6..0000000000 --- a/src/main/java/gregtech/api/fluid/FluidTankGT.java +++ /dev/null @@ -1,485 +0,0 @@ -package gregtech.api.fluid; - -import static com.google.common.primitives.Ints.saturatedCast; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidTank; - -import gregtech.api.interfaces.fluid.IFluidStore; -import gregtech.api.util.GT_Utility; - -public class FluidTankGT implements IFluidTank, IFluidStore { - - public final FluidTankGT[] AS_ARRAY = new FluidTankGT[] { this }; - private FluidStack mFluid; - private long mCapacity = 0, mAmount = 0; - private boolean mPreventDraining = false, mVoidExcess = false, mChangedFluids = false; - /** HashMap of adjustable Tank Sizes based on Fluids if needed. */ - private Map mAdjustableCapacity = null; - - private long mAdjustableMultiplier = 1; - /** Gives you a Tank Index in case there is multiple Tanks on a TileEntity that cares. */ - public int mIndex = 0; - - public FluidTankGT() { - mCapacity = Long.MAX_VALUE; - } - - public FluidTankGT(long aCapacity) { - mCapacity = aCapacity; - } - - public FluidTankGT(FluidStack aFluid) { - mFluid = aFluid; - if (aFluid != null) { - mCapacity = aFluid.amount; - mAmount = aFluid.amount; - } - } - - public FluidTankGT(FluidStack aFluid, long aCapacity) { - mFluid = aFluid; - mCapacity = aCapacity; - mAmount = (aFluid == null ? 0 : aFluid.amount); - } - - public FluidTankGT(FluidStack aFluid, long aAmount, long aCapacity) { - mFluid = aFluid; - mCapacity = aCapacity; - mAmount = (aFluid == null ? 0 : aAmount); - } - - public FluidTankGT(Fluid aFluid, long aAmount) { - this(new FluidStack(aFluid, saturatedCast(aAmount))); - mAmount = aAmount; - } - - public FluidTankGT(Fluid aFluid, long aAmount, long aCapacity) { - this(new FluidStack(aFluid, saturatedCast(aAmount)), aCapacity); - mAmount = aAmount; - } - - public FluidTankGT(NBTTagCompound aNBT, String aKey, long aCapacity) { - this(aNBT.hasKey(aKey) ? aNBT.getCompoundTag(aKey) : null, aCapacity); - } - - public FluidTankGT(NBTTagCompound aNBT, long aCapacity) { - mCapacity = aCapacity; - if (aNBT != null && !aNBT.hasNoTags()) { - mFluid = FluidStack.loadFluidStackFromNBT(aNBT); - mAmount = (isEmpty() ? 0 : aNBT.hasKey("LAmount") ? aNBT.getLong("LAmount") : mFluid.amount); - } - } - - public FluidTankGT readFromNBT(NBTTagCompound aNBT, String aKey) { - if (aNBT.hasKey(aKey)) { - aNBT = aNBT.getCompoundTag(aKey); - if (aNBT != null && !aNBT.hasNoTags()) { - mFluid = FluidStack.loadFluidStackFromNBT(aNBT); - mAmount = (isEmpty() ? 0 : aNBT.hasKey("LAmount") ? aNBT.getLong("LAmount") : mFluid.amount); - } - } - return this; - } - - public NBTTagCompound writeToNBT(NBTTagCompound aNBT, String aKey) { - if (mFluid != null && (mPreventDraining || mAmount > 0)) { - final NBTTagCompound tNBT = new NBTTagCompound(); - mFluid.amount = (int) mAmount; - aNBT.setTag(aKey, mFluid.writeToNBT(tNBT)); - if (mAmount > Integer.MAX_VALUE) tNBT.setLong("LAmount", mAmount); - } else { - aNBT.removeTag(aKey); - } - return aNBT; - } - - public FluidStack drain(int aDrained) { - return drain(aDrained, true); - } - - @Override - public FluidStack drain(int aDrained, boolean aDoDrain) { - if (isEmpty() || aDrained <= 0) return null; - if (mAmount < aDrained) aDrained = (int) mAmount; - final FluidStack rFluid = new FluidStack(mFluid, aDrained); - if (aDoDrain) { - mAmount -= aDrained; - if (mAmount <= 0) { - if (mPreventDraining) { - mAmount = 0; - } else { - setEmpty(); - } - } - } - return rFluid; - } - - public boolean drainAll(long aDrained) { - if (isEmpty() || mAmount < aDrained) return false; - mAmount -= aDrained; - if (mAmount <= 0) { - if (mPreventDraining) { - mAmount = 0; - } else { - setEmpty(); - } - } - return true; - } - - public long remove(long aDrained) { - if (isEmpty() || mAmount <= 0 || aDrained <= 0) return 0; - if (mAmount < aDrained) aDrained = mAmount; - mAmount -= aDrained; - if (mAmount <= 0) { - if (mPreventDraining) { - mAmount = 0; - } else { - setEmpty(); - } - } - return aDrained; - } - - public long add(long aFilled) { - if (isEmpty() || aFilled <= 0) return 0; - final long tCapacity = capacity(); - if (mAmount + aFilled > tCapacity) { - if (!mVoidExcess) aFilled = tCapacity - mAmount; - mAmount = tCapacity; - return aFilled; - } - mAmount += aFilled; - return aFilled; - } - - public long add(long aFilled, FluidStack aFluid) { - if (aFluid == null || aFilled <= 0) return 0; - if (isEmpty()) { - mFluid = aFluid.copy(); - mChangedFluids = true; - mAmount = Math.min(capacity(aFluid), aFilled); - return mVoidExcess ? aFilled : mAmount; - } - return contains(aFluid) ? add(aFilled) : 0; - } - - public int fill(FluidStack aFluid) { - return fill(aFluid, true); - } - - @Override - public int fill(FluidStack aFluid, boolean aDoFill) { - if (aFluid == null) return 0; - if (aDoFill) { - if (isEmpty()) { - mFluid = aFluid.copy(); - mChangedFluids = true; - mAmount = Math.min(capacity(aFluid), aFluid.amount); - return mVoidExcess ? aFluid.amount : (int) mAmount; - } - if (!contains(aFluid)) return 0; - final long tCapacity = capacity(aFluid); - long tFilled = tCapacity - mAmount; - if (aFluid.amount < tFilled) { - mAmount += aFluid.amount; - tFilled = aFluid.amount; - } else mAmount = tCapacity; - return mVoidExcess ? aFluid.amount : (int) tFilled; - } - return saturatedCast( - isEmpty() ? mVoidExcess ? aFluid.amount : Math.min(capacity(aFluid), aFluid.amount) - : contains(aFluid) ? mVoidExcess ? aFluid.amount : Math.min(capacity(aFluid) - mAmount, aFluid.amount) - : 0); - } - - public boolean canFillAll(FluidStack aFluid) { - return aFluid == null || aFluid.amount <= 0 - || (isEmpty() ? mVoidExcess || aFluid.amount <= capacity(aFluid) - : contains(aFluid) && (mVoidExcess || mAmount + aFluid.amount <= capacity(aFluid))); - } - - public boolean canFillAll(long aAmount) { - return aAmount <= 0 || mVoidExcess || mAmount + aAmount <= capacity(); - } - - public boolean fillAll(FluidStack aFluid) { - if (aFluid == null || aFluid.amount <= 0) return true; - if (isEmpty()) { - final long tCapacity = capacity(aFluid); - if (aFluid.amount <= tCapacity || mVoidExcess) { - mFluid = aFluid.copy(); - mChangedFluids = true; - mAmount = aFluid.amount; - if (mAmount > tCapacity) mAmount = tCapacity; - return true; - } - return false; - } - if (contains(aFluid)) { - if (mAmount + aFluid.amount <= capacity()) { - mAmount += aFluid.amount; - return true; - } - if (mVoidExcess) { - mAmount = capacity(); - return true; - } - } - return false; - } - - public boolean fillAll(FluidStack aFluid, long aMultiplier) { - if (aMultiplier <= 0) return true; - if (aMultiplier == 1) return fillAll(aFluid); - if (aFluid == null || aFluid.amount <= 0) return true; - if (isEmpty()) { - final long tCapacity = capacity(aFluid); - if (aFluid.amount * aMultiplier <= tCapacity || mVoidExcess) { - mFluid = aFluid.copy(); - mChangedFluids = true; - mAmount = aFluid.amount * aMultiplier; - if (mAmount > tCapacity) mAmount = tCapacity; - return true; - } - return false; - } - if (contains(aFluid)) { - if (mAmount + aFluid.amount * aMultiplier <= capacity()) { - mAmount += aFluid.amount * aMultiplier; - return true; - } - if (mVoidExcess) { - mAmount = capacity(); - return true; - } - } - return false; - } - - /** Resets Tank Contents entirely */ - public FluidTankGT setEmpty() { - mFluid = null; - mChangedFluids = true; - mAmount = 0; - return this; - } - - /** Sets Fluid Content, taking Amount from the Fluid Parameter */ - public FluidTankGT setFluid(FluidStack aFluid) { - mFluid = aFluid; - mChangedFluids = true; - mAmount = (aFluid == null ? 0 : aFluid.amount); - return this; - } - - /** Sets Fluid Content and Amount */ - public FluidTankGT setFluid(FluidStack aFluid, long aAmount) { - mFluid = aFluid; - mChangedFluids = true; - mAmount = (aFluid == null ? 0 : aAmount); - return this; - } - - /** Sets Fluid Content, taking Amount from the Tank Parameter */ - public FluidTankGT setFluid(FluidTankGT aTank) { - mFluid = new FluidStack(aTank.mFluid, saturatedCast(aTank.mAmount)); - mChangedFluids = true; - mAmount = aTank.mAmount; - return this; - } - - /** Sets the Tank Index for easier Reverse Mapping. */ - public FluidTankGT setIndex(int aIndex) { - mIndex = aIndex; - return this; - } - - /** Sets the Capacity */ - public FluidTankGT setCapacity(long aCapacity) { - if (aCapacity >= 0) mCapacity = aCapacity; - return this; - } - - /** Sets the Capacity Multiplier */ - public FluidTankGT setCapacityMultiplier(long aCapacityMultiplier) { - if (aCapacityMultiplier >= 0) mAdjustableMultiplier = aCapacityMultiplier; - return this; - } - - /** Sets Tank capacity Map, should it be needed. */ - public FluidTankGT setCapacity(Map aMap, long aCapacityMultiplier) { - mAdjustableCapacity = aMap; - mAdjustableMultiplier = aCapacityMultiplier; - return this; - } - - /** Always keeps at least 0 Liters of Fluid instead of setting it to null */ - public FluidTankGT setPreventDraining() { - return setPreventDraining(true); - } - - /** Always keeps at least 0 Liters of Fluid instead of setting it to null */ - public FluidTankGT setPreventDraining(boolean aPrevent) { - mPreventDraining = aPrevent; - return this; - } - - /** Voids any Overlow */ - public FluidTankGT setVoidExcess() { - return setVoidExcess(true); - } - - /** Voids any Overlow */ - public FluidTankGT setVoidExcess(boolean aVoidExcess) { - mVoidExcess = aVoidExcess; - return this; - } - - public boolean isFull() { - return mFluid != null && mAmount >= capacity(); - } - - public long capacity() { - return capacity(mFluid); - } - - public long capacity(FluidStack aFluid) { - if (mAdjustableCapacity == null || aFluid == null) return mCapacity; - return capacity(aFluid.getFluid()); - } - - public long capacity(Fluid aFluid) { - if (mAdjustableCapacity == null || aFluid == null) return mCapacity; - return capacity(aFluid.getName()); - } - - public long capacity(String aFluid) { - if (mAdjustableCapacity == null || aFluid == null) return mCapacity; - - final Long tSize = mAdjustableCapacity.get(aFluid); - return tSize == null ? Math.max(mAmount, mCapacity) - : Math.max(tSize * mAdjustableMultiplier, Math.max(mAmount, mCapacity)); - } - - public boolean isHalf() { - return mFluid != null && mAmount * 2 >= capacity(); - } - - public boolean contains(Fluid aFluid) { - return mFluid != null && mFluid.getFluid() == aFluid; - } - - public boolean contains(FluidStack aFluid) { - return GT_Utility.areFluidsEqual(mFluid, aFluid); - } - - public boolean has(long aAmount) { - return mAmount >= aAmount; - } - - public boolean has() { - return mAmount > 0; - } - - public boolean check() { - if (mChangedFluids) { - mChangedFluids = false; - return true; - } - return false; - } - - public boolean update() { - return mChangedFluids = true; - } - - public boolean changed() { - return mChangedFluids; - } - - public long amount() { - return isEmpty() ? 0 : mAmount; - } - - public boolean isEmpty() { - return mFluid == null; - } - - public long amount(long aMax) { - return isEmpty() || aMax <= 0 ? 0 : Math.min(mAmount, aMax); - } - - public String name() { - return mFluid == null ? null - : mFluid.getFluid() - .getName(); - } - - public FluidStack get() { - return mFluid; - } - - public FluidStack get(long aMax) { - return isEmpty() || aMax <= 0 ? null : new FluidStack(mFluid, saturatedCast(Math.min(mAmount, aMax))); - } - - @Override - public FluidStack getFluid() { - if (mFluid != null) mFluid.amount = saturatedCast(mAmount); - return mFluid; - } - - @Override - public int getFluidAmount() { - return saturatedCast(mAmount); - } - - @Override - public int getCapacity() { - return saturatedCast(capacity()); - } - - public long getCapacityMultiplier() { - return mAdjustableMultiplier; - } - - @Override - public FluidTankInfo getInfo() { - return new FluidTankInfo(isEmpty() ? null : mFluid.copy(), saturatedCast(capacity())); - } - - public static FluidStack[] getFluidsFromTanks(FluidTankGT[] tanks) { - if (tanks == null) { - return null; - } - List fluidStacks = new ArrayList<>(); - for (FluidTankGT tank : tanks) { - if (tank.getFluid() != null) { - fluidStacks.add(tank.getFluid()); - } - } - return fluidStacks.toArray(new FluidStack[0]); - } - - @Override - public boolean isEmptyAndAcceptsAnyFluid() { - return getFluidAmount() == 0; - } - - @Override - public boolean canStoreFluid(@Nonnull FluidStack fluidStack) { - return GT_Utility.areFluidsEqual(mFluid, fluidStack); - } -} diff --git a/src/main/java/gregtech/api/fluid/GTFluidFactory.java b/src/main/java/gregtech/api/fluid/GTFluidFactory.java new file mode 100644 index 0000000000..291cdf3384 --- /dev/null +++ b/src/main/java/gregtech/api/fluid/GTFluidFactory.java @@ -0,0 +1,90 @@ +package gregtech.api.fluid; + +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; + +import gregtech.api.enums.FluidState; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.fluid.IGTFluid; +import gregtech.api.interfaces.fluid.IGTFluidBuilder; +import gregtech.common.fluid.GTFluidBuilder; + +/** + *

+ * This class contains helpers factory methods to: + *

+ *
    + *
  1. + *

    + * Build {@link IGTFluid} instances. + *

    + *
  2. + *
  3. + *

    + * Register the corresponding {@link Fluid}, built from an {@link IGTFluid}, to the {@link FluidRegistry}: + *

    + *
      + *
    • + *

      + * Register the optionally associated containers to the {@link FluidContainerRegistry}. + *

      + *
    • + *
    • + *

      + * Add the needed Fluid Canner recipes. + *

      + *
    • + *
    + *
  4. + *
+ */ +@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope +public class GTFluidFactory { + + /** + * Helper for quick fluid creation and registration + * + * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry} + * @param localizedName The localized name of this {@link IGTFluid} + * @param material The {@link Materials} of this {@link IGTFluid} + * @param state The {@link FluidState} of this {@link IGTFluid} + * @param temperature The fluid temperature in Kelvin + * @return the registered {@link Fluid} + */ + public static Fluid of(final String fluidName, final String localizedName, final Materials material, + final FluidState state, final int temperature) { + return builder(fluidName).withLocalizedName(localizedName) + .withStateAndTemperature(state, temperature) + .buildAndRegister() + .configureMaterials(material) + .asFluid(); + } + + /** + * Helper for quick fluid creation and registration + * + * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry} + * @param localizedName The localized name of this {@link IGTFluid} + * @param state The {@link FluidState} of this {@link IGTFluid} + * @param temperature The fluid temperature in Kelvin + * @return the registered {@link Fluid} + */ + public static Fluid of(final String fluidName, final String localizedName, final FluidState state, + final int temperature) { + return builder(fluidName).withLocalizedName(localizedName) + .withStateAndTemperature(state, temperature) + .buildAndRegister() + .asFluid(); + } + + /** + * Gets an {@link IGTFluid} builder instance + * + * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry} + * @return the {@link IGTFluidBuilder} instance + */ + public static IGTFluidBuilder builder(final String fluidName) { + return new GTFluidBuilder(fluidName); + } +} diff --git a/src/main/java/gregtech/api/fluid/GTFluidTank.java b/src/main/java/gregtech/api/fluid/GTFluidTank.java new file mode 100644 index 0000000000..46fc098000 --- /dev/null +++ b/src/main/java/gregtech/api/fluid/GTFluidTank.java @@ -0,0 +1,485 @@ +package gregtech.api.fluid; + +import static com.google.common.primitives.Ints.saturatedCast; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidTank; + +import gregtech.api.interfaces.fluid.IFluidStore; +import gregtech.api.util.GTUtility; + +public class GTFluidTank implements IFluidTank, IFluidStore { + + public final GTFluidTank[] AS_ARRAY = new GTFluidTank[] { this }; + private FluidStack mFluid; + private long mCapacity = 0, mAmount = 0; + private boolean mPreventDraining = false, mVoidExcess = false, mChangedFluids = false; + /** HashMap of adjustable Tank Sizes based on Fluids if needed. */ + private Map mAdjustableCapacity = null; + + private long mAdjustableMultiplier = 1; + /** Gives you a Tank Index in case there is multiple Tanks on a TileEntity that cares. */ + public int mIndex = 0; + + public GTFluidTank() { + mCapacity = Long.MAX_VALUE; + } + + public GTFluidTank(long aCapacity) { + mCapacity = aCapacity; + } + + public GTFluidTank(FluidStack aFluid) { + mFluid = aFluid; + if (aFluid != null) { + mCapacity = aFluid.amount; + mAmount = aFluid.amount; + } + } + + public GTFluidTank(FluidStack aFluid, long aCapacity) { + mFluid = aFluid; + mCapacity = aCapacity; + mAmount = (aFluid == null ? 0 : aFluid.amount); + } + + public GTFluidTank(FluidStack aFluid, long aAmount, long aCapacity) { + mFluid = aFluid; + mCapacity = aCapacity; + mAmount = (aFluid == null ? 0 : aAmount); + } + + public GTFluidTank(Fluid aFluid, long aAmount) { + this(new FluidStack(aFluid, saturatedCast(aAmount))); + mAmount = aAmount; + } + + public GTFluidTank(Fluid aFluid, long aAmount, long aCapacity) { + this(new FluidStack(aFluid, saturatedCast(aAmount)), aCapacity); + mAmount = aAmount; + } + + public GTFluidTank(NBTTagCompound aNBT, String aKey, long aCapacity) { + this(aNBT.hasKey(aKey) ? aNBT.getCompoundTag(aKey) : null, aCapacity); + } + + public GTFluidTank(NBTTagCompound aNBT, long aCapacity) { + mCapacity = aCapacity; + if (aNBT != null && !aNBT.hasNoTags()) { + mFluid = FluidStack.loadFluidStackFromNBT(aNBT); + mAmount = (isEmpty() ? 0 : aNBT.hasKey("LAmount") ? aNBT.getLong("LAmount") : mFluid.amount); + } + } + + public GTFluidTank readFromNBT(NBTTagCompound aNBT, String aKey) { + if (aNBT.hasKey(aKey)) { + aNBT = aNBT.getCompoundTag(aKey); + if (aNBT != null && !aNBT.hasNoTags()) { + mFluid = FluidStack.loadFluidStackFromNBT(aNBT); + mAmount = (isEmpty() ? 0 : aNBT.hasKey("LAmount") ? aNBT.getLong("LAmount") : mFluid.amount); + } + } + return this; + } + + public NBTTagCompound writeToNBT(NBTTagCompound aNBT, String aKey) { + if (mFluid != null && (mPreventDraining || mAmount > 0)) { + final NBTTagCompound tNBT = new NBTTagCompound(); + mFluid.amount = (int) mAmount; + aNBT.setTag(aKey, mFluid.writeToNBT(tNBT)); + if (mAmount > Integer.MAX_VALUE) tNBT.setLong("LAmount", mAmount); + } else { + aNBT.removeTag(aKey); + } + return aNBT; + } + + public FluidStack drain(int aDrained) { + return drain(aDrained, true); + } + + @Override + public FluidStack drain(int aDrained, boolean aDoDrain) { + if (isEmpty() || aDrained <= 0) return null; + if (mAmount < aDrained) aDrained = (int) mAmount; + final FluidStack rFluid = new FluidStack(mFluid, aDrained); + if (aDoDrain) { + mAmount -= aDrained; + if (mAmount <= 0) { + if (mPreventDraining) { + mAmount = 0; + } else { + setEmpty(); + } + } + } + return rFluid; + } + + public boolean drainAll(long aDrained) { + if (isEmpty() || mAmount < aDrained) return false; + mAmount -= aDrained; + if (mAmount <= 0) { + if (mPreventDraining) { + mAmount = 0; + } else { + setEmpty(); + } + } + return true; + } + + public long remove(long aDrained) { + if (isEmpty() || mAmount <= 0 || aDrained <= 0) return 0; + if (mAmount < aDrained) aDrained = mAmount; + mAmount -= aDrained; + if (mAmount <= 0) { + if (mPreventDraining) { + mAmount = 0; + } else { + setEmpty(); + } + } + return aDrained; + } + + public long add(long aFilled) { + if (isEmpty() || aFilled <= 0) return 0; + final long tCapacity = capacity(); + if (mAmount + aFilled > tCapacity) { + if (!mVoidExcess) aFilled = tCapacity - mAmount; + mAmount = tCapacity; + return aFilled; + } + mAmount += aFilled; + return aFilled; + } + + public long add(long aFilled, FluidStack aFluid) { + if (aFluid == null || aFilled <= 0) return 0; + if (isEmpty()) { + mFluid = aFluid.copy(); + mChangedFluids = true; + mAmount = Math.min(capacity(aFluid), aFilled); + return mVoidExcess ? aFilled : mAmount; + } + return contains(aFluid) ? add(aFilled) : 0; + } + + public int fill(FluidStack aFluid) { + return fill(aFluid, true); + } + + @Override + public int fill(FluidStack aFluid, boolean aDoFill) { + if (aFluid == null) return 0; + if (aDoFill) { + if (isEmpty()) { + mFluid = aFluid.copy(); + mChangedFluids = true; + mAmount = Math.min(capacity(aFluid), aFluid.amount); + return mVoidExcess ? aFluid.amount : (int) mAmount; + } + if (!contains(aFluid)) return 0; + final long tCapacity = capacity(aFluid); + long tFilled = tCapacity - mAmount; + if (aFluid.amount < tFilled) { + mAmount += aFluid.amount; + tFilled = aFluid.amount; + } else mAmount = tCapacity; + return mVoidExcess ? aFluid.amount : (int) tFilled; + } + return saturatedCast( + isEmpty() ? mVoidExcess ? aFluid.amount : Math.min(capacity(aFluid), aFluid.amount) + : contains(aFluid) ? mVoidExcess ? aFluid.amount : Math.min(capacity(aFluid) - mAmount, aFluid.amount) + : 0); + } + + public boolean canFillAll(FluidStack aFluid) { + return aFluid == null || aFluid.amount <= 0 + || (isEmpty() ? mVoidExcess || aFluid.amount <= capacity(aFluid) + : contains(aFluid) && (mVoidExcess || mAmount + aFluid.amount <= capacity(aFluid))); + } + + public boolean canFillAll(long aAmount) { + return aAmount <= 0 || mVoidExcess || mAmount + aAmount <= capacity(); + } + + public boolean fillAll(FluidStack aFluid) { + if (aFluid == null || aFluid.amount <= 0) return true; + if (isEmpty()) { + final long tCapacity = capacity(aFluid); + if (aFluid.amount <= tCapacity || mVoidExcess) { + mFluid = aFluid.copy(); + mChangedFluids = true; + mAmount = aFluid.amount; + if (mAmount > tCapacity) mAmount = tCapacity; + return true; + } + return false; + } + if (contains(aFluid)) { + if (mAmount + aFluid.amount <= capacity()) { + mAmount += aFluid.amount; + return true; + } + if (mVoidExcess) { + mAmount = capacity(); + return true; + } + } + return false; + } + + public boolean fillAll(FluidStack aFluid, long aMultiplier) { + if (aMultiplier <= 0) return true; + if (aMultiplier == 1) return fillAll(aFluid); + if (aFluid == null || aFluid.amount <= 0) return true; + if (isEmpty()) { + final long tCapacity = capacity(aFluid); + if (aFluid.amount * aMultiplier <= tCapacity || mVoidExcess) { + mFluid = aFluid.copy(); + mChangedFluids = true; + mAmount = aFluid.amount * aMultiplier; + if (mAmount > tCapacity) mAmount = tCapacity; + return true; + } + return false; + } + if (contains(aFluid)) { + if (mAmount + aFluid.amount * aMultiplier <= capacity()) { + mAmount += aFluid.amount * aMultiplier; + return true; + } + if (mVoidExcess) { + mAmount = capacity(); + return true; + } + } + return false; + } + + /** Resets Tank Contents entirely */ + public GTFluidTank setEmpty() { + mFluid = null; + mChangedFluids = true; + mAmount = 0; + return this; + } + + /** Sets Fluid Content, taking Amount from the Fluid Parameter */ + public GTFluidTank setFluid(FluidStack aFluid) { + mFluid = aFluid; + mChangedFluids = true; + mAmount = (aFluid == null ? 0 : aFluid.amount); + return this; + } + + /** Sets Fluid Content and Amount */ + public GTFluidTank setFluid(FluidStack aFluid, long aAmount) { + mFluid = aFluid; + mChangedFluids = true; + mAmount = (aFluid == null ? 0 : aAmount); + return this; + } + + /** Sets Fluid Content, taking Amount from the Tank Parameter */ + public GTFluidTank setFluid(GTFluidTank aTank) { + mFluid = new FluidStack(aTank.mFluid, saturatedCast(aTank.mAmount)); + mChangedFluids = true; + mAmount = aTank.mAmount; + return this; + } + + /** Sets the Tank Index for easier Reverse Mapping. */ + public GTFluidTank setIndex(int aIndex) { + mIndex = aIndex; + return this; + } + + /** Sets the Capacity */ + public GTFluidTank setCapacity(long aCapacity) { + if (aCapacity >= 0) mCapacity = aCapacity; + return this; + } + + /** Sets the Capacity Multiplier */ + public GTFluidTank setCapacityMultiplier(long aCapacityMultiplier) { + if (aCapacityMultiplier >= 0) mAdjustableMultiplier = aCapacityMultiplier; + return this; + } + + /** Sets Tank capacity Map, should it be needed. */ + public GTFluidTank setCapacity(Map aMap, long aCapacityMultiplier) { + mAdjustableCapacity = aMap; + mAdjustableMultiplier = aCapacityMultiplier; + return this; + } + + /** Always keeps at least 0 Liters of Fluid instead of setting it to null */ + public GTFluidTank setPreventDraining() { + return setPreventDraining(true); + } + + /** Always keeps at least 0 Liters of Fluid instead of setting it to null */ + public GTFluidTank setPreventDraining(boolean aPrevent) { + mPreventDraining = aPrevent; + return this; + } + + /** Voids any Overlow */ + public GTFluidTank setVoidExcess() { + return setVoidExcess(true); + } + + /** Voids any Overlow */ + public GTFluidTank setVoidExcess(boolean aVoidExcess) { + mVoidExcess = aVoidExcess; + return this; + } + + public boolean isFull() { + return mFluid != null && mAmount >= capacity(); + } + + public long capacity() { + return capacity(mFluid); + } + + public long capacity(FluidStack aFluid) { + if (mAdjustableCapacity == null || aFluid == null) return mCapacity; + return capacity(aFluid.getFluid()); + } + + public long capacity(Fluid aFluid) { + if (mAdjustableCapacity == null || aFluid == null) return mCapacity; + return capacity(aFluid.getName()); + } + + public long capacity(String aFluid) { + if (mAdjustableCapacity == null || aFluid == null) return mCapacity; + + final Long tSize = mAdjustableCapacity.get(aFluid); + return tSize == null ? Math.max(mAmount, mCapacity) + : Math.max(tSize * mAdjustableMultiplier, Math.max(mAmount, mCapacity)); + } + + public boolean isHalf() { + return mFluid != null && mAmount * 2 >= capacity(); + } + + public boolean contains(Fluid aFluid) { + return mFluid != null && mFluid.getFluid() == aFluid; + } + + public boolean contains(FluidStack aFluid) { + return GTUtility.areFluidsEqual(mFluid, aFluid); + } + + public boolean has(long aAmount) { + return mAmount >= aAmount; + } + + public boolean has() { + return mAmount > 0; + } + + public boolean check() { + if (mChangedFluids) { + mChangedFluids = false; + return true; + } + return false; + } + + public boolean update() { + return mChangedFluids = true; + } + + public boolean changed() { + return mChangedFluids; + } + + public long amount() { + return isEmpty() ? 0 : mAmount; + } + + public boolean isEmpty() { + return mFluid == null; + } + + public long amount(long aMax) { + return isEmpty() || aMax <= 0 ? 0 : Math.min(mAmount, aMax); + } + + public String name() { + return mFluid == null ? null + : mFluid.getFluid() + .getName(); + } + + public FluidStack get() { + return mFluid; + } + + public FluidStack get(long aMax) { + return isEmpty() || aMax <= 0 ? null : new FluidStack(mFluid, saturatedCast(Math.min(mAmount, aMax))); + } + + @Override + public FluidStack getFluid() { + if (mFluid != null) mFluid.amount = saturatedCast(mAmount); + return mFluid; + } + + @Override + public int getFluidAmount() { + return saturatedCast(mAmount); + } + + @Override + public int getCapacity() { + return saturatedCast(capacity()); + } + + public long getCapacityMultiplier() { + return mAdjustableMultiplier; + } + + @Override + public FluidTankInfo getInfo() { + return new FluidTankInfo(isEmpty() ? null : mFluid.copy(), saturatedCast(capacity())); + } + + public static FluidStack[] getFluidsFromTanks(GTFluidTank[] tanks) { + if (tanks == null) { + return null; + } + List fluidStacks = new ArrayList<>(); + for (GTFluidTank tank : tanks) { + if (tank.getFluid() != null) { + fluidStacks.add(tank.getFluid()); + } + } + return fluidStacks.toArray(new FluidStack[0]); + } + + @Override + public boolean isEmptyAndAcceptsAnyFluid() { + return getFluidAmount() == 0; + } + + @Override + public boolean canStoreFluid(@Nonnull FluidStack fluidStack) { + return GTUtility.areFluidsEqual(mFluid, fluidStack); + } +} diff --git a/src/main/java/gregtech/api/fluid/GT_FluidFactory.java b/src/main/java/gregtech/api/fluid/GT_FluidFactory.java deleted file mode 100644 index 7c65956c69..0000000000 --- a/src/main/java/gregtech/api/fluid/GT_FluidFactory.java +++ /dev/null @@ -1,90 +0,0 @@ -package gregtech.api.fluid; - -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidContainerRegistry; -import net.minecraftforge.fluids.FluidRegistry; - -import gregtech.api.enums.FluidState; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.fluid.IGT_Fluid; -import gregtech.api.interfaces.fluid.IGT_FluidBuilder; -import gregtech.common.fluid.GT_FluidBuilder; - -/** - *

- * This class contains helpers factory methods to: - *

- *
    - *
  1. - *

    - * Build {@link IGT_Fluid} instances. - *

    - *
  2. - *
  3. - *

    - * Register the corresponding {@link Fluid}, built from an {@link IGT_Fluid}, to the {@link FluidRegistry}: - *

    - *
      - *
    • - *

      - * Register the optionally associated containers to the {@link FluidContainerRegistry}. - *

      - *
    • - *
    • - *

      - * Add the needed Fluid Canner recipes. - *

      - *
    • - *
    - *
  4. - *
- */ -@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope -public class GT_FluidFactory { - - /** - * Helper for quick fluid creation and registration - * - * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry} - * @param localizedName The localized name of this {@link IGT_Fluid} - * @param material The {@link Materials} of this {@link IGT_Fluid} - * @param state The {@link FluidState} of this {@link IGT_Fluid} - * @param temperature The fluid temperature in Kelvin - * @return the registered {@link Fluid} - */ - public static Fluid of(final String fluidName, final String localizedName, final Materials material, - final FluidState state, final int temperature) { - return builder(fluidName).withLocalizedName(localizedName) - .withStateAndTemperature(state, temperature) - .buildAndRegister() - .configureMaterials(material) - .asFluid(); - } - - /** - * Helper for quick fluid creation and registration - * - * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry} - * @param localizedName The localized name of this {@link IGT_Fluid} - * @param state The {@link FluidState} of this {@link IGT_Fluid} - * @param temperature The fluid temperature in Kelvin - * @return the registered {@link Fluid} - */ - public static Fluid of(final String fluidName, final String localizedName, final FluidState state, - final int temperature) { - return builder(fluidName).withLocalizedName(localizedName) - .withStateAndTemperature(state, temperature) - .buildAndRegister() - .asFluid(); - } - - /** - * Gets an {@link IGT_Fluid} builder instance - * - * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry} - * @return the {@link IGT_FluidBuilder} instance - */ - public static IGT_FluidBuilder builder(final String fluidName) { - return new GT_FluidBuilder(fluidName); - } -} diff --git a/src/main/java/gregtech/api/graphs/GenerateNodeMap.java b/src/main/java/gregtech/api/graphs/GenerateNodeMap.java index 7289f0faad..7eb8382e87 100644 --- a/src/main/java/gregtech/api/graphs/GenerateNodeMap.java +++ b/src/main/java/gregtech/api/graphs/GenerateNodeMap.java @@ -1,6 +1,6 @@ package gregtech.api.graphs; -import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; +import static gregtech.api.enums.GTValues.ALL_VALID_SIDES; import java.util.ArrayList; import java.util.HashSet; diff --git a/src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java b/src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java index 95f9aee32d..4203bbdc0a 100644 --- a/src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java +++ b/src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java @@ -7,7 +7,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyReceiver; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.graphs.consumers.ConsumerNode; import gregtech.api.graphs.consumers.EmptyPowerConsumer; import gregtech.api.graphs.consumers.NodeEnergyConnected; @@ -20,7 +20,7 @@ import gregtech.api.interfaces.tileentity.IEnergyConnected; import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.metatileentity.BaseMetaTileEntity; import gregtech.api.metatileentity.MetaPipeEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; +import gregtech.api.metatileentity.implementations.MTECable; import ic2.api.energy.tile.IEnergySink; // node map generator for power distribution @@ -32,8 +32,7 @@ public class GenerateNodeMapPower extends GenerateNodeMap { @Override protected boolean isPipe(TileEntity aTileEntity) { - return super.isPipe(aTileEntity) - && ((BaseMetaPipeEntity) aTileEntity).getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable; + return super.isPipe(aTileEntity) && ((BaseMetaPipeEntity) aTileEntity).getMetaTileEntity() instanceof MTECable; } @Override @@ -74,7 +73,7 @@ public class GenerateNodeMapPower extends GenerateNodeMap { aConsumers.add(tConsumerNode); return true; } - } else if (GregTech_API.mOutputRF && aTileEntity instanceof IEnergyReceiver receiver) { + } else if (GregTechAPI.mOutputRF && aTileEntity instanceof IEnergyReceiver receiver) { ConsumerNode tConsumerNode = new NodeEnergyReceiver(aNodeValue, receiver, side, aConsumers); aConsumers.add(tConsumerNode); return true; diff --git a/src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java b/src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java index 4f35922029..e9364f922b 100644 --- a/src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java +++ b/src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java @@ -8,13 +8,13 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyReceiver; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.SoundResource; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.WorldSpawnedEventBuilder; -import gregtech.common.GT_Pollution; +import gregtech.common.Pollution; // consumer for RF machines public class NodeEnergyReceiver extends ConsumerNode { @@ -29,7 +29,7 @@ public class NodeEnergyReceiver extends ConsumerNode { @Override public int injectEnergy(long aVoltage, long aMaxAmps) { ForgeDirection tDirection = mSide; - int rfOut = GT_Utility.safeInt(aVoltage * GregTech_API.mEUtoRF / 100); + int rfOut = GTUtility.safeInt(aVoltage * GregTechAPI.mEUtoRF / 100); int ampsUsed = 0; if (mRestRF < rfOut) { mRestRF += rfOut; @@ -40,7 +40,7 @@ public class NodeEnergyReceiver extends ConsumerNode { mRestRF -= consumed; return ampsUsed; } - if (GregTech_API.mRFExplosions && GregTech_API.sMachineExplosions + if (GregTechAPI.mRFExplosions && GregTechAPI.sMachineExplosions && ((IEnergyReceiver) mTileEntity).getMaxEnergyStored(tDirection) < rfOut * 600L) { explode(rfOut); } @@ -49,14 +49,14 @@ public class NodeEnergyReceiver extends ConsumerNode { // copied from IEnergyConnected private void explode(int aRfOut) { - if (aRfOut > 32L * GregTech_API.mEUtoRF / 100L) { - float tStrength = GT_Values.getExplosionPowerForVoltage(aRfOut); + if (aRfOut > 32L * GregTechAPI.mEUtoRF / 100L) { + float tStrength = GTValues.getExplosionPowerForVoltage(aRfOut); int tX = mTileEntity.xCoord, tY = mTileEntity.yCoord, tZ = mTileEntity.zCoord; World tWorld = mTileEntity.getWorldObj(); - GT_Utility.sendSoundToPlayers(tWorld, SoundResource.IC2_MACHINES_MACHINE_OVERLOAD, 1.0F, -1, tX, tY, tZ); + GTUtility.sendSoundToPlayers(tWorld, SoundResource.IC2_MACHINES_MACHINE_OVERLOAD, 1.0F, -1, tX, tY, tZ); tWorld.setBlock(tX, tY, tZ, Blocks.air); - if (GregTech_API.sMachineExplosions) if (GT_Mod.gregtechproxy.mPollution) GT_Pollution - .addPollution(tWorld.getChunkFromBlockCoords(tX, tZ), GT_Mod.gregtechproxy.mPollutionOnExplosion); + if (GregTechAPI.sMachineExplosions) if (GTMod.gregtechproxy.mPollution) Pollution + .addPollution(tWorld.getChunkFromBlockCoords(tX, tZ), GTMod.gregtechproxy.mPollutionOnExplosion); new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder().setStrength(tStrength) .setSmoking(true) diff --git a/src/main/java/gregtech/api/graphs/paths/PowerNodePath.java b/src/main/java/gregtech/api/graphs/paths/PowerNodePath.java index d09cf059e9..e9421056af 100644 --- a/src/main/java/gregtech/api/graphs/paths/PowerNodePath.java +++ b/src/main/java/gregtech/api/graphs/paths/PowerNodePath.java @@ -5,7 +5,7 @@ import net.minecraft.server.MinecraftServer; import gregtech.api.enums.TickTime; import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.metatileentity.MetaPipeEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; +import gregtech.api.metatileentity.implementations.MTECable; import gregtech.api.util.AveragePerTickCounter; // path for cables @@ -49,7 +49,7 @@ public class PowerNodePath extends NodePath { if (aVoltage > mMaxVoltage) { lock.addTileEntity(null); for (MetaPipeEntity tCable : mPipes) { - if (((GT_MetaPipeEntity_Cable) tCable).mVoltage < this.mVoltage) { + if (((MTECable) tCable).mVoltage < this.mVoltage) { BaseMetaPipeEntity tBaseCable = (BaseMetaPipeEntity) tCable.getBaseMetaTileEntity(); if (tBaseCable != null) { tBaseCable.setToFire(); @@ -75,7 +75,7 @@ public class PowerNodePath extends NodePath { if (this.mAmps > mMaxAmps * 40) { lock.addTileEntity(null); for (MetaPipeEntity tCable : mPipes) { - if (((GT_MetaPipeEntity_Cable) tCable).mAmperage * 40 < this.mAmps) { + if (((MTECable) tCable).mAmperage * 40 < this.mAmps) { BaseMetaPipeEntity tBaseCable = (BaseMetaPipeEntity) tCable.getBaseMetaTileEntity(); if (tBaseCable != null) { tBaseCable.setToFire(); @@ -107,10 +107,10 @@ public class PowerNodePath extends NodePath { mMaxAmps = Integer.MAX_VALUE; mMaxVoltage = Integer.MAX_VALUE; for (MetaPipeEntity tCable : mPipes) { - if (tCable instanceof GT_MetaPipeEntity_Cable) { - mMaxAmps = Math.min(((GT_MetaPipeEntity_Cable) tCable).mAmperage, mMaxAmps); - mLoss += ((GT_MetaPipeEntity_Cable) tCable).mCableLossPerMeter; - mMaxVoltage = Math.min(((GT_MetaPipeEntity_Cable) tCable).mVoltage, mMaxVoltage); + if (tCable instanceof MTECable) { + mMaxAmps = Math.min(((MTECable) tCable).mAmperage, mMaxAmps); + mLoss += ((MTECable) tCable).mCableLossPerMeter; + mMaxVoltage = Math.min(((MTECable) tCable).mVoltage, mMaxVoltage); } } } diff --git a/src/main/java/gregtech/api/gui/GT_GUIColorOverride.java b/src/main/java/gregtech/api/gui/GT_GUIColorOverride.java deleted file mode 100644 index 6ade7b030d..0000000000 --- a/src/main/java/gregtech/api/gui/GT_GUIColorOverride.java +++ /dev/null @@ -1,93 +0,0 @@ -package gregtech.api.gui; - -import java.util.concurrent.ExecutionException; - -import javax.annotation.Nonnull; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.IResource; -import net.minecraft.util.ResourceLocation; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.util.concurrent.UncheckedExecutionException; - -import cpw.mods.fml.relauncher.FMLLaunchHandler; -import cpw.mods.fml.relauncher.Side; -import gregtech.api.GregTech_API; -import gregtech.api.util.ColorsMetadataSection; - -@SuppressWarnings("UnstableApiUsage") -public class GT_GUIColorOverride { - - private static final Object NOT_FOUND = new Object(); - private static final LoadingCache cache = CacheBuilder.newBuilder() - .softValues() - .build(new CacheLoader<>() { - - @Override - public Object load(@Nonnull ResourceLocation key) throws Exception { - IResource ir = Minecraft.getMinecraft() - .getResourceManager() - .getResource(key); - if (ir.hasMetadata()) return ir.getMetadata("colors"); - // return a dummy - // object because - // LoadingCache - // doesn't like null - return NOT_FOUND; - } - }); - private static final GT_GUIColorOverride FALLBACK = new GT_GUIColorOverride(); - private ColorsMetadataSection cmSection; - - public static GT_GUIColorOverride get(String fullLocation) { - // see other get for more info - if (FMLLaunchHandler.side() != Side.CLIENT) return FALLBACK; - return new GT_GUIColorOverride(new ResourceLocation(fullLocation)); - } - - public static GT_GUIColorOverride get(ResourceLocation path) { - // use dummy fallback if there isn't such thing as a resource pack. - // #side() usually has two possible return value, but since this might be called by test code, it might - // also return null when in test env. Using #isClient will cause a NPE. A plain inequality test won't. - // FMLCommonHandler's #getSide() might trigger a NPE when in test env, so no. - if (FMLLaunchHandler.side() != Side.CLIENT) return FALLBACK; - return new GT_GUIColorOverride(path); - } - - private GT_GUIColorOverride() { - cmSection = null; - } - - private GT_GUIColorOverride(ResourceLocation resourceLocation) { - try { - Object metadata = cache.get(resourceLocation); - if (metadata != NOT_FOUND) cmSection = (ColorsMetadataSection) metadata; - } catch (ExecutionException | UncheckedExecutionException ignore) { - // make sure it doesn't cache a failing entry - cache.invalidate(resourceLocation); - } - } - - public int getTextColorOrDefault(String textType, int defaultColor) { - return sLoaded() ? cmSection.getTextColorOrDefault(textType, defaultColor) : defaultColor; - } - - public int getGuiTintOrDefault(String key, int defaultColor) { - return sLoaded() ? cmSection.getGuiTintOrDefault(key, defaultColor) : defaultColor; - } - - public boolean sGuiTintingEnabled() { - return sLoaded() ? cmSection.sGuiTintingEnabled() : GregTech_API.sColoredGUI; - } - - public boolean sLoaded() { - return cmSection != null; - } - - public static void onResourceManagerReload() { - cache.invalidateAll(); - } -} diff --git a/src/main/java/gregtech/api/gui/GUIColorOverride.java b/src/main/java/gregtech/api/gui/GUIColorOverride.java new file mode 100644 index 0000000000..aa796d2b63 --- /dev/null +++ b/src/main/java/gregtech/api/gui/GUIColorOverride.java @@ -0,0 +1,93 @@ +package gregtech.api.gui; + +import java.util.concurrent.ExecutionException; + +import javax.annotation.Nonnull; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.IResource; +import net.minecraft.util.ResourceLocation; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.util.concurrent.UncheckedExecutionException; + +import cpw.mods.fml.relauncher.FMLLaunchHandler; +import cpw.mods.fml.relauncher.Side; +import gregtech.api.GregTechAPI; +import gregtech.api.util.ColorsMetadataSection; + +@SuppressWarnings("UnstableApiUsage") +public class GUIColorOverride { + + private static final Object NOT_FOUND = new Object(); + private static final LoadingCache cache = CacheBuilder.newBuilder() + .softValues() + .build(new CacheLoader<>() { + + @Override + public Object load(@Nonnull ResourceLocation key) throws Exception { + IResource ir = Minecraft.getMinecraft() + .getResourceManager() + .getResource(key); + if (ir.hasMetadata()) return ir.getMetadata("colors"); + // return a dummy + // object because + // LoadingCache + // doesn't like null + return NOT_FOUND; + } + }); + private static final GUIColorOverride FALLBACK = new GUIColorOverride(); + private ColorsMetadataSection cmSection; + + public static GUIColorOverride get(String fullLocation) { + // see other get for more info + if (FMLLaunchHandler.side() != Side.CLIENT) return FALLBACK; + return new GUIColorOverride(new ResourceLocation(fullLocation)); + } + + public static GUIColorOverride get(ResourceLocation path) { + // use dummy fallback if there isn't such thing as a resource pack. + // #side() usually has two possible return value, but since this might be called by test code, it might + // also return null when in test env. Using #isClient will cause a NPE. A plain inequality test won't. + // FMLCommonHandler's #getSide() might trigger a NPE when in test env, so no. + if (FMLLaunchHandler.side() != Side.CLIENT) return FALLBACK; + return new GUIColorOverride(path); + } + + private GUIColorOverride() { + cmSection = null; + } + + private GUIColorOverride(ResourceLocation resourceLocation) { + try { + Object metadata = cache.get(resourceLocation); + if (metadata != NOT_FOUND) cmSection = (ColorsMetadataSection) metadata; + } catch (ExecutionException | UncheckedExecutionException ignore) { + // make sure it doesn't cache a failing entry + cache.invalidate(resourceLocation); + } + } + + public int getTextColorOrDefault(String textType, int defaultColor) { + return sLoaded() ? cmSection.getTextColorOrDefault(textType, defaultColor) : defaultColor; + } + + public int getGuiTintOrDefault(String key, int defaultColor) { + return sLoaded() ? cmSection.getGuiTintOrDefault(key, defaultColor) : defaultColor; + } + + public boolean sGuiTintingEnabled() { + return sLoaded() ? cmSection.sGuiTintingEnabled() : GregTechAPI.sColoredGUI; + } + + public boolean sLoaded() { + return cmSection != null; + } + + public static void onResourceManagerReload() { + cache.invalidateAll(); + } +} diff --git a/src/main/java/gregtech/api/gui/modularui/CoverUIBuildContext.java b/src/main/java/gregtech/api/gui/modularui/CoverUIBuildContext.java new file mode 100644 index 0000000000..2bf8795c5c --- /dev/null +++ b/src/main/java/gregtech/api/gui/modularui/CoverUIBuildContext.java @@ -0,0 +1,74 @@ +package gregtech.api.gui.modularui; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import gregtech.api.interfaces.tileentity.ICoverable; + +public class CoverUIBuildContext extends UIBuildContext { + + // cover data is not synced to client, while ID is + private final int coverID; + private final ForgeDirection side; + private final ICoverable tile; + private final boolean anotherWindow; + private final int guiColorization; + + /** + * @param player Player opened this UI + * @param coverID See {@link ICoverable#getCoverIDAtSide} + * @param side Side this cover is attached to + * @param tile Tile this cover is attached to + * @param anotherWindow If cover UI is shown on top of another window + * @param guiColorization The color used to render machine's GUI + */ + public CoverUIBuildContext(EntityPlayer player, int coverID, ForgeDirection side, ICoverable tile, + boolean anotherWindow, int guiColorization) { + super(player); + this.coverID = coverID; + this.side = side; + this.tile = tile; + this.anotherWindow = anotherWindow; + this.guiColorization = guiColorization; + } + + /** + * @param player Player opened this UI + * @param coverID See {@link ICoverable#getCoverIDAtSide} + * @param side Side this cover is attached to + * @param tile Tile this cover is attached to + * @param anotherWindow If cover GUI is shown in opened on top of another window + */ + public CoverUIBuildContext(EntityPlayer player, int coverID, ForgeDirection side, ICoverable tile, + boolean anotherWindow) { + this(player, coverID, side, tile, anotherWindow, tile.getGUIColorization()); + } + + public int getCoverID() { + return coverID; + } + + public ForgeDirection getCoverSide() { + return side; + } + + /** + * Note that this will return different object between client v.s. server side on SP. + */ + public ICoverable getTile() { + return tile; + } + + /** + * If cover GUI is shown in opened on top of another window. + */ + public boolean isAnotherWindow() { + return anotherWindow; + } + + public int getGuiColorization() { + return guiColorization; + } +} diff --git a/src/main/java/gregtech/api/gui/modularui/GTUIInfos.java b/src/main/java/gregtech/api/gui/modularui/GTUIInfos.java new file mode 100644 index 0000000000..ede4b54e08 --- /dev/null +++ b/src/main/java/gregtech/api/gui/modularui/GTUIInfos.java @@ -0,0 +1,188 @@ +package gregtech.api.gui.modularui; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.UIInfos; +import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI; +import com.gtnewhorizons.modularui.api.screen.ModularUIContext; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.builder.UIBuilder; +import com.gtnewhorizons.modularui.common.builder.UIInfo; +import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords; +import gregtech.api.net.GTPacketSendCoverData; +import gregtech.api.util.CoverBehaviorBase; + +public class GTUIInfos { + + public static void init() {} + + /** + * Generator for {@link UIInfo} which is responsible for registering and opening UIs. Unlike + * {@link com.gtnewhorizons.modularui.api.UIInfos#TILE_MODULAR_UI}, this accepts custom constructors for UI.
+ * Do NOT run {@link UIBuilder#build} on-the-fly, otherwise MP client won't register UIs. Instead, store to static + * field, just like {@link #GTTileEntityDefaultUI}. Such mistake can be easily overlooked by testing only SP. + */ + public static final Function> GTTileEntityUIFactory = containerConstructor -> UIBuilder + .of() + .container((player, world, x, y, z) -> { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof ITileWithModularUI mui) { + return createTileEntityContainer(player, mui::createWindow, te::markDirty, containerConstructor); + } + return null; + }) + .gui(((player, world, x, y, z) -> { + if (!world.isRemote) return null; + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof ITileWithModularUI mui) { + return createTileEntityGuiContainer(player, mui::createWindow, containerConstructor); + } + return null; + })) + .build(); + + private static final UIInfo GTTileEntityDefaultUI = GTTileEntityUIFactory.apply(ModularUIContainer::new); + + private static final Map> coverUI = new HashMap<>(); + + static { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + coverUI.put( + side, + UIBuilder.of() + .container((player, world, x, y, z) -> { + final TileEntity te = world.getTileEntity(x, y, z); + if (!(te instanceof ICoverable gtTileEntity)) return null; + final CoverBehaviorBase cover = gtTileEntity.getCoverBehaviorAtSideNew(side); + return createCoverContainer( + player, + cover::createWindow, + te::markDirty, + gtTileEntity.getCoverIDAtSide(side), + side, + gtTileEntity); + }) + .gui((player, world, x, y, z) -> { + if (!world.isRemote) return null; + final TileEntity te = world.getTileEntity(x, y, z); + if (!(te instanceof ICoverable gtTileEntity)) return null; + final CoverBehaviorBase cover = gtTileEntity.getCoverBehaviorAtSideNew(side); + return createCoverGuiContainer( + player, + cover::createWindow, + gtTileEntity.getCoverIDAtSide(side), + side, + gtTileEntity); + }) + .build()); + } + } + + /** + * Opens TileEntity UI, created by {@link ITileWithModularUI#createWindow}. + */ + public static void openGTTileEntityUI(IHasWorldObjectAndCoords aTileEntity, EntityPlayer aPlayer) { + if (aTileEntity.isClientSide() || aPlayer instanceof FakePlayer) return; + GTTileEntityDefaultUI.open( + aPlayer, + aTileEntity.getWorld(), + aTileEntity.getXCoord(), + aTileEntity.getYCoord(), + aTileEntity.getZCoord()); + } + + /** + * Opens cover UI, created by {@link CoverBehaviorBase#createWindow}. + */ + public static void openCoverUI(ICoverable tileEntity, EntityPlayer player, ForgeDirection side) { + if (tileEntity.isClientSide()) return; + + GTValues.NW.sendToPlayer( + new GTPacketSendCoverData( + side, + tileEntity.getCoverIDAtSide(side), + tileEntity.getComplexCoverDataAtSide(side), + tileEntity), + (EntityPlayerMP) player); + + coverUI.get(side) + .open( + player, + tileEntity.getWorld(), + tileEntity.getXCoord(), + tileEntity.getYCoord(), + tileEntity.getZCoord()); + } + + /** + * Opens UI for player's item, created by + * {@link com.gtnewhorizons.modularui.api.screen.IItemWithModularUI#createWindow}. + */ + public static void openPlayerHeldItemUI(EntityPlayer player) { + if (NetworkUtils.isClient()) return; + UIInfos.PLAYER_HELD_ITEM_UI.open(player); + } + + private static ModularUIContainer createTileEntityContainer(EntityPlayer player, + Function windowCreator, Runnable onWidgetUpdate, + ContainerConstructor containerCreator) { + final UIBuildContext buildContext = new UIBuildContext(player); + final ModularWindow window = windowCreator.apply(buildContext); + if (window == null) return null; + return containerCreator.of(new ModularUIContext(buildContext, onWidgetUpdate), window); + } + + @SideOnly(Side.CLIENT) + private static ModularGui createTileEntityGuiContainer(EntityPlayer player, + Function windowCreator, ContainerConstructor containerConstructor) { + final ModularUIContainer container = createTileEntityContainer( + player, + windowCreator, + null, + containerConstructor); + if (container == null) return null; + return new ModularGui(container); + } + + private static ModularUIContainer createCoverContainer(EntityPlayer player, + Function windowCreator, Runnable onWidgetUpdate, int coverID, + ForgeDirection side, ICoverable tile) { + final CoverUIBuildContext buildContext = new CoverUIBuildContext(player, coverID, side, tile, false); + final ModularWindow window = windowCreator.apply(buildContext); + if (window == null) return null; + return new ModularUIContainer(new ModularUIContext(buildContext, onWidgetUpdate), window); + } + + @SideOnly(Side.CLIENT) + private static ModularGui createCoverGuiContainer(EntityPlayer player, + Function windowCreator, int coverID, ForgeDirection side, ICoverable tile) { + final ModularUIContainer container = createCoverContainer(player, windowCreator, null, coverID, side, tile); + if (container == null) { + return null; + } + return new ModularGui(container); + } + + @FunctionalInterface + public interface ContainerConstructor { + + ModularUIContainer of(ModularUIContext context, ModularWindow mainWindow); + } +} diff --git a/src/main/java/gregtech/api/gui/modularui/GTUITextures.java b/src/main/java/gregtech/api/gui/modularui/GTUITextures.java new file mode 100644 index 0000000000..125e1640b0 --- /dev/null +++ b/src/main/java/gregtech/api/gui/modularui/GTUITextures.java @@ -0,0 +1,542 @@ +package gregtech.api.gui.modularui; + +import static gregtech.api.enums.Mods.GregTech; + +import java.util.function.BiFunction; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture; +import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; +import com.gtnewhorizons.modularui.api.drawable.UITexture; + +public class GTUITextures { + + public static final UITexture TRANSPARENT = UITexture.fullImage(GregTech.ID, "gui/picture/transparent"); + + public static final AdaptableUITexture BACKGROUND_SINGLEBLOCK_DEFAULT = AdaptableUITexture + .of(GregTech.ID, "gui/background/singleblock_default", 176, 166, 4); + public static final SteamTexture BACKGROUND_STEAM = SteamTexture + .adaptableTexture(GregTech.ID, "gui/background/%s", 176, 166, 4); + public static final UITexture BACKGROUND_FUSION_COMPUTER = UITexture + .fullImage(GregTech.ID, "gui/background/fusion_computer"); + public static final AdaptableUITexture BACKGROUND_TEXT_FIELD = AdaptableUITexture + .of(GregTech.ID, "gui/background/text_field", 142, 28, 1); + public static final AdaptableUITexture BACKGROUND_TEXT_FIELD_LIGHT_GRAY = AdaptableUITexture + .of(GregTech.ID, "gui/background/text_field_light_gray", 61, 12, 1); + public static final AdaptableUITexture BACKGROUND_NEI_SINGLE_RECIPE = AdaptableUITexture + .of(GregTech.ID, "gui/background/nei_single_recipe.png", 64, 64, 2); + public static final UITexture BACKGROUND_FLOCCULATION_RECIPE = UITexture + .fullImage(GregTech.ID, "gui/background/flocculation_recipe.png"); + public static final SteamTexture SLOT_ITEM_STEAM = SteamTexture.fullImage(GregTech.ID, "gui/slot/item_%s"); + public static final SteamTexture SLOT_FLUID_STEAM = SteamTexture.fullImage(GregTech.ID, "gui/slot/fluid_%s"); + public static final AdaptableUITexture SLOT_DARK_GRAY = AdaptableUITexture + .of(GregTech.ID, "gui/slot/dark_gray", 18, 18, 1); + public static final AdaptableUITexture SLOT_MAINTENANCE = AdaptableUITexture + .of(GregTech.ID, "gui/slot/maintenance", 20, 20, 1); + public static final AdaptableUITexture SLOT_UPLIFTED = AdaptableUITexture + .of(GregTech.ID, "gui/slot/uplifted", 18, 18, 1); + + public static final UITexture OVERLAY_SLOT_ARROW_ME = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/arrow_me"); + public static final UITexture OVERLAY_SLOT_PATTERN_ME = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/pattern_me"); + + public static final UITexture OVERLAY_SLOT_BEAKER_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/beaker_1"); + public static final UITexture OVERLAY_SLOT_BEAKER_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/beaker_2"); + public static final UITexture OVERLAY_SLOT_BEE_DRONE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/bee_drone"); + public static final UITexture OVERLAY_SLOT_BEE_QUEEN = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/bee_queen"); + public static final UITexture OVERLAY_SLOT_BENDER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/bender"); + public static final UITexture OVERLAY_SLOT_BOX = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/box"); + public static final UITexture OVERLAY_SLOT_BOXED = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/boxed"); + public static final UITexture OVERLAY_SLOT_CANISTER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/canister"); + public static final SteamTexture OVERLAY_SLOT_CANISTER_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/canister_%s"); + public static final UITexture OVERLAY_SLOT_CANNER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/canner"); + public static final UITexture OVERLAY_SLOT_CAULDRON = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/cauldron"); + public static final UITexture OVERLAY_SLOT_CENTRIFUGE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge"); + public static final UITexture OVERLAY_SLOT_CENTRIFUGE_FLUID = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge_fluid"); + public static final SteamTexture OVERLAY_SLOT_CENTRIFUGE_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge_%s"); + public static final UITexture OVERLAY_SLOT_CHARGER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/charger"); + public static final UITexture OVERLAY_SLOT_CHARGER_FLUID = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/charger_fluid"); + public static final UITexture OVERLAY_SLOT_CIRCUIT = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/circuit"); + public static final SteamTexture OVERLAY_SLOT_COAL_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/coal_%s"); + public static final UITexture OVERLAY_SLOT_COMPRESSOR = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/compressor"); + public static final SteamTexture OVERLAY_SLOT_COMPRESSOR_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/compressor_%s"); + public static final UITexture OVERLAY_SLOT_CRUSHED_ORE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/crushed_ore"); + public static final SteamTexture OVERLAY_SLOT_CRUSHED_ORE_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/crushed_ore_%s"); + public static final UITexture OVERLAY_SLOT_CUTTER_SLICED = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/cutter_sliced"); + public static final UITexture OVERLAY_SLOT_DATA_ORB = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/data_orb"); + public static final UITexture OVERLAY_SLOT_DATA_STICK = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/data_stick"); + public static final UITexture OVERLAY_SLOT_DUST = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/dust"); + public static final SteamTexture OVERLAY_SLOT_DUST_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/dust_%s"); + public static final SteamTexture OVERLAY_SLOT_BLOCK_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/block_%s"); + public static final UITexture OVERLAY_SLOT_EXPLOSIVE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/explosive"); + public static final UITexture OVERLAY_SLOT_EXTRUDER_SHAPE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/extruder_shape"); + public static final UITexture OVERLAY_SLOT_FILTER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/filter"); + public static final UITexture OVERLAY_SLOT_FURNACE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/furnace"); + public static final SteamTexture OVERLAY_SLOT_FURNACE_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/furnace_%s"); + public static final UITexture OVERLAY_SLOT_GEM = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/gem"); + public static final UITexture OVERLAY_SLOT_HAMMER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/hammer"); + public static final SteamTexture OVERLAY_SLOT_HAMMER_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/hammer_%s"); + public static final UITexture OVERLAY_SLOT_HEATER_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/heater_1"); + public static final UITexture OVERLAY_SLOT_HEATER_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/heater_2"); + public static final UITexture OVERLAY_SLOT_IMPLOSION = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/implosion"); + public static final UITexture OVERLAY_SLOT_IN = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/in"); + public static final SteamTexture OVERLAY_SLOT_IN_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/in_%s"); + public static final SteamTexture OVERLAY_SLOT_INGOT_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/ingot_%s"); + public static final UITexture OVERLAY_SLOT_INT_CIRCUIT = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/int_circuit"); + public static final UITexture OVERLAY_SLOT_LENS = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/lens"); + public static final UITexture OVERLAY_SLOT_MICROSCOPE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/microscope"); + public static final UITexture OVERLAY_SLOT_MINING_PIPE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/mining_pipe"); + public static final UITexture OVERLAY_SLOT_MOLD = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/mold"); + public static final UITexture OVERLAY_SLOT_MOLECULAR_1 = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/molecular_1"); + public static final UITexture OVERLAY_SLOT_MOLECULAR_2 = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/molecular_2"); + public static final UITexture OVERLAY_SLOT_MOLECULAR_3 = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/molecular_3"); + public static final UITexture OVERLAY_SLOT_OUT = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/out"); + public static final SteamTexture OVERLAY_SLOT_OUT_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/overlay_slot/out_%s"); + public static final UITexture OVERLAY_SLOT_PAGE_BLANK = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/page_blank"); + public static final UITexture OVERLAY_SLOT_PAGE_PRINTED = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/page_printed"); + public static final UITexture OVERLAY_SLOT_PRESS_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_1"); + public static final UITexture OVERLAY_SLOT_PRESS_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_2"); + public static final UITexture OVERLAY_SLOT_PRESS_3 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_3"); + public static final UITexture OVERLAY_SLOT_RECYCLE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/recycle"); + public static final UITexture OVERLAY_SLOT_ROD_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/rod_1"); + public static final UITexture OVERLAY_SLOT_ROD_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/rod_2"); + public static final UITexture OVERLAY_SLOT_SLICE_SHAPE = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/slice_shape"); + public static final UITexture OVERLAY_SLOT_SLICER_SLICED = UITexture + .fullImage(GregTech.ID, "gui/overlay_slot/slicer_sliced"); + public static final UITexture OVERLAY_SLOT_SQUARE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/square"); + public static final UITexture OVERLAY_SLOT_UUA = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/uua"); + public static final UITexture OVERLAY_SLOT_UUM = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/uum"); + public static final UITexture OVERLAY_SLOT_VIAL_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/vial_1"); + public static final UITexture OVERLAY_SLOT_VIAL_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/vial_2"); + public static final UITexture OVERLAY_SLOT_WIREMILL = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/wiremill"); + public static final UITexture OVERLAY_SLOT_WRENCH = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/wrench"); + public static final UITexture[] OVERLAY_SLOTS_NUMBER = IntStream.range(0, 12) + .mapToObj(i -> UITexture.fullImage(GregTech.ID, "gui/overlay_slot/number_" + i)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + + public static final UITexture PROGRESSBAR_ARROW = UITexture.fullImage(GregTech.ID, "gui/progressbar/arrow"); + public static final SteamTexture PROGRESSBAR_ARROW_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/arrow_%s"); + public static final SteamTexture PROGRESSBAR_ARROW_2_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/arrow_2_%s"); + public static final UITexture PROGRESSBAR_ARROW_MULTIPLE = UITexture + .fullImage(GregTech.ID, "gui/progressbar/arrow_multiple"); + public static final UITexture PROGRESSBAR_ASSEMBLE = UITexture.fullImage(GregTech.ID, "gui/progressbar/assemble"); + public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_1 = UITexture + .fullImage(GregTech.ID, "gui/progressbar/assemblyline_1"); + public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_2 = UITexture + .fullImage(GregTech.ID, "gui/progressbar/assemblyline_2"); + public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_3 = UITexture + .fullImage(GregTech.ID, "gui/progressbar/assemblyline_3"); + public static final UITexture PROGRESSBAR_BATH = UITexture.fullImage(GregTech.ID, "gui/progressbar/bath"); + public static final UITexture PROGRESSBAR_BENDING = UITexture.fullImage(GregTech.ID, "gui/progressbar/bending"); + public static final SteamTexture PROGRESSBAR_BOILER_EMPTY_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/boiler_empty_%s"); + public static final UITexture PROGRESSBAR_BOILER_HEAT = UITexture + .fullImage(GregTech.ID, "gui/progressbar/boiler_heat"); + public static final UITexture PROGRESSBAR_BOILER_STEAM = UITexture + .fullImage(GregTech.ID, "gui/progressbar/boiler_steam"); + public static final UITexture PROGRESSBAR_BOILER_WATER = UITexture + .fullImage(GregTech.ID, "gui/progressbar/boiler_water"); + public static final UITexture PROGRESSBAR_CANNER = UITexture.fullImage(GregTech.ID, "gui/progressbar/canner"); + public static final UITexture PROGRESSBAR_CIRCUIT_ASSEMBLER = UITexture + .fullImage(GregTech.ID, "gui/progressbar/circuit_assembler"); + public static final UITexture PROGRESSBAR_COMPRESS = UITexture.fullImage(GregTech.ID, "gui/progressbar/compress"); + public static final SteamTexture PROGRESSBAR_COMPRESS_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/compress_%s"); + public static final UITexture PROGRESSBAR_CUT = UITexture.fullImage(GregTech.ID, "gui/progressbar/cut"); + public static final UITexture PROGRESSBAR_EXTRACT = UITexture.fullImage(GregTech.ID, "gui/progressbar/extract"); + public static final SteamTexture PROGRESSBAR_EXTRACT_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/extract_%s"); + public static final UITexture PROGRESSBAR_EXTRUDE = UITexture.fullImage(GregTech.ID, "gui/progressbar/extrude"); + public static final SteamTexture PROGRESSBAR_FUEL_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/fuel_%s"); + public static final UITexture PROGRESSBAR_HAMMER = UITexture.fullImage(GregTech.ID, "gui/progressbar/hammer"); + public static final UITexture PROGRESSBAR_HAMMER_BASE = UITexture + .fullImage(GregTech.ID, "gui/progressbar/hammer_base"); + public static final SteamTexture PROGRESSBAR_HAMMER_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/hammer_%s"); + public static final SteamTexture PROGRESSBAR_HAMMER_BASE_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/hammer_base_%s"); + public static final UITexture PROGRESSBAR_LATHE = UITexture.fullImage(GregTech.ID, "gui/progressbar/lathe"); + public static final UITexture PROGRESSBAR_LATHE_BASE = UITexture + .fullImage(GregTech.ID, "gui/progressbar/lathe_base"); + public static final UITexture PROGRESSBAR_MACERATE = UITexture.fullImage(GregTech.ID, "gui/progressbar/macerate"); + public static final SteamTexture PROGRESSBAR_MACERATE_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/progressbar/macerate_%s"); + public static final UITexture PROGRESSBAR_MAGNET = UITexture.fullImage(GregTech.ID, "gui/progressbar/magnet"); + public static final UITexture PROGRESSBAR_MIXER = UITexture.fullImage(GregTech.ID, "gui/progressbar/mixer"); + public static final UITexture PROGRESSBAR_RECYCLE = UITexture.fullImage(GregTech.ID, "gui/progressbar/recycle"); + public static final UITexture PROGRESSBAR_SIFT = UITexture.fullImage(GregTech.ID, "gui/progressbar/sift"); + public static final UITexture PROGRESSBAR_SLICE = UITexture.fullImage(GregTech.ID, "gui/progressbar/slice"); + public static final UITexture PROGRESSBAR_STORED_EU = UITexture.fullImage(GregTech.ID, "gui/progressbar/stored_eu"); + public static final UITexture PROGRESSBAR_WIREMILL = UITexture.fullImage(GregTech.ID, "gui/progressbar/wiremill"); + public static final UITexture PROGRESSBAR_FLOCCULATION = UITexture + .fullImage(GregTech.ID, "gui/progressbar/flocculation"); + public static final UITexture PROGRESSBAR_CLARIFIER = UITexture.fullImage(GregTech.ID, "gui/progressbar/clarifier"); + public static final UITexture PROGRESSBAR_PH_NEUTRALIZATION = UITexture + .fullImage(GregTech.ID, "gui/progressbar/phneutralization"); + public static final UITexture PROGRESSBAR_OZONATION = UITexture.fullImage(GregTech.ID, "gui/progressbar/ozonation"); + public static final UITexture PROGRESSBAR_PLASMA_HEATER = UITexture + .fullImage(GregTech.ID, "gui/progressbar/water_plasma_heater"); + + public static FallbackableUITexture fallbackableProgressbar(String name, UITexture fallback) { + return new FallbackableUITexture(UITexture.fullImage(GregTech.ID, "gui/progressbar/" + name), fallback); + } + + public static final UITexture TAB_COVER_NORMAL = UITexture.fullImage(GregTech.ID, "gui/tab/cover_normal"); + public static final UITexture TAB_COVER_HIGHLIGHT = UITexture.fullImage(GregTech.ID, "gui/tab/cover_highlight"); + public static final UITexture TAB_COVER_DISABLED = UITexture.fullImage(GregTech.ID, "gui/tab/cover_disabled"); + public static final SteamTexture TAB_COVER_STEAM_NORMAL = SteamTexture + .fullImage(GregTech.ID, "gui/tab/cover_%s_normal"); + public static final SteamTexture TAB_COVER_STEAM_HIGHLIGHT = SteamTexture + .fullImage(GregTech.ID, "gui/tab/cover_%s_highlight"); + public static final SteamTexture TAB_COVER_STEAM_DISABLED = SteamTexture + .fullImage(GregTech.ID, "gui/tab/cover_%s_disabled"); + public static final AdaptableUITexture TAB_TITLE = AdaptableUITexture.of(GregTech.ID, "gui/tab/title", 28, 28, 4); + public static final AdaptableUITexture TAB_TITLE_DARK = AdaptableUITexture + .of(GregTech.ID, "gui/tab/title_dark", 28, 28, 4); + public static final SteamTexture TAB_TITLE_STEAM = SteamTexture + .adaptableTexture(GregTech.ID, "gui/tab/title_%s", 28, 28, 4); + public static final SteamTexture TAB_TITLE_DARK_STEAM = SteamTexture + .adaptableTexture(GregTech.ID, "gui/tab/title_dark_%s", 28, 28, 4); + public static final AdaptableUITexture TAB_TITLE_ANGULAR = AdaptableUITexture + .of(GregTech.ID, "gui/tab/title_angular", 28, 28, 4); + public static final SteamTexture TAB_TITLE_ANGULAR_STEAM = SteamTexture + .adaptableTexture(GregTech.ID, "gui/tab/title_angular_%s", 28, 28, 4); + + public static final UITexture BUTTON_STANDARD = AdaptableUITexture + .of(GregTech.ID, "gui/button/standard", 18, 18, 1); + public static final UITexture BUTTON_STANDARD_PRESSED = AdaptableUITexture + .of(GregTech.ID, "gui/button/standard_pressed", 18, 18, 1); + public static final UITexture BUTTON_STANDARD_DISABLED = AdaptableUITexture + .of(GregTech.ID, "gui/button/standard_disabled", 18, 18, 1); + public static final UITexture BUTTON_STANDARD_TOGGLE = AdaptableUITexture + .of(GregTech.ID, "gui/button/standard_toggle", 18, 18, 1); + public static final UITexture BUTTON_STANDARD_TOGGLE_DISABLED = AdaptableUITexture + .of(GregTech.ID, "gui/button/standard_toggle_disabled", 18, 18, 1); + public static final UITexture BUTTON_COVER_NORMAL = UITexture.fullImage(GregTech.ID, "gui/button/cover_normal"); + public static final UITexture BUTTON_COVER_NORMAL_HOVERED = UITexture + .fullImage(GregTech.ID, "gui/button/cover_normal_hovered"); + public static final UITexture BUTTON_COVER_NORMAL_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/button/cover_normal_disabled"); + + public static final UITexture OVERLAY_BUTTON_DISABLE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/disable"); + public static final UITexture OVERLAY_BUTTON_REDSTONE_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/redstone_off"); + public static final UITexture OVERLAY_BUTTON_REDSTONE_ON = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/redstone_on"); + public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_ON = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/power_switch_on"); + public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/power_switch_off"); + public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_NONE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/void_excess_none"); + public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_ITEM = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/void_excess_item"); + public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_FLUID = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/void_excess_fluid"); + public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_ALL = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/void_excess_all"); + public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_ON = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/input_separation_on"); + public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/input_separation_on_disabled"); + public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/input_separation_off"); + public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/input_separation_off_disabled"); + public static final UITexture OVERLAY_BUTTON_RECIPE_LOCKED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/recipe_locked"); + public static final UITexture OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/recipe_locked_disabled"); + public static final UITexture OVERLAY_BUTTON_RECIPE_UNLOCKED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/recipe_unlocked"); + public static final UITexture OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/recipe_unlocked_disabled"); + public static final UITexture OVERLAY_BUTTON_BATCH_MODE_ON = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_on"); + public static final UITexture OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_on_disabled"); + public static final UITexture OVERLAY_BUTTON_BATCH_MODE_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_off"); + public static final UITexture OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_off_disabled"); + public static final UITexture OVERLAY_BUTTON_STRUCTURE_UPDATE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/structure_update"); + public static final UITexture OVERLAY_BUTTON_FORBIDDEN = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/forbidden"); + public static final UITexture OVERLAY_BUTTON_LOCKED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/lock_small"); + public static final UITexture OVERLAY_BUTTON_DOWN_TIERING_ON = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/down_tiering_on"); + public static final UITexture OVERLAY_BUTTON_DOWN_TIERING_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/down_tiering_off"); + public static final UITexture OVERLAY_BUTTON_CHECKMARK = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/checkmark"); + public static final UITexture OVERLAY_BUTTON_CROSS = UITexture.fullImage(GregTech.ID, "gui/overlay_button/cross"); + public static final UITexture OVERLAY_BUTTON_WHITELIST = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/whitelist"); + public static final UITexture OVERLAY_BUTTON_BLACKLIST = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/blacklist"); + public static final UITexture OVERLAY_BUTTON_PROGRESS = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/progress"); + public static final UITexture OVERLAY_BUTTON_EXPORT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/export"); + public static final UITexture OVERLAY_BUTTON_IMPORT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/import"); + public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_ITEM = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/autooutput_item"); + public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_FLUID = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/autooutput_fluid"); + public static final UITexture OVERLAY_BUTTON_ALLOW_INPUT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/allow_input"); + public static final UITexture OVERLAY_BUTTON_ALLOW_OUTPUT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/allow_output"); + public static final UITexture OVERLAY_BUTTON_AUTOPULL_ME = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/auto_pull_me"); + public static final UITexture OVERLAY_BUTTON_AUTOPULL_ME_DISABLED = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/auto_pull_me_disabled"); + public static final UITexture OVERLAY_BUTTON_BLOCK_INPUT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/block_input"); + public static final UITexture OVERLAY_BUTTON_BLOCK_OUTPUT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/block_output"); + public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_UP = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/arrow_green_up"); + public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_DOWN = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/arrow_green_down"); + public static final UITexture OVERLAY_BUTTON_CYCLIC = UITexture.fullImage(GregTech.ID, "gui/overlay_button/cyclic"); + public static final UITexture OVERLAY_BUTTON_SHUFFLE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/shuffle"); + public static final UITexture OVERLAY_BUTTON_EMIT_ENERGY = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/emit_energy"); + public static final UITexture OVERLAY_BUTTON_EMIT_REDSTONE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/emit_redstone"); + public static final UITexture OVERLAY_BUTTON_INVERT_REDSTONE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/invert_redstone"); + public static final UITexture OVERLAY_BUTTON_STOCKING_MODE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/stocking_mode"); + public static final UITexture OVERLAY_BUTTON_INVERT_FILTER = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/invert_filter"); + public static final UITexture OVERLAY_BUTTON_NBT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/nbt"); + public static final UITexture OVERLAY_BUTTON_PRINT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/print"); + public static final UITexture OVERLAY_BUTTON_TRANSPOSE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/transpose"); + public static final UITexture OVERLAY_BUTTON_SORTING_MODE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/sorting_mode"); + public static final UITexture OVERLAY_BUTTON_ONE_STACK_LIMIT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/one_stack_limit"); + public static final UITexture OVERLAY_BUTTON_BOUNDING_BOX = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/bounding_box"); + public static final UITexture OVERLAY_BUTTON_MINUS_SMALL = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/minus_small"); + public static final UITexture OVERLAY_BUTTON_MINUS_LARGE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/minus_large"); + public static final UITexture OVERLAY_BUTTON_PLUS_SMALL = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/plus_small"); + public static final UITexture OVERLAY_BUTTON_PLUS_LARGE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/plus_large"); + public static final UITexture OVERLAY_BUTTON_GATE_AND = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/gate_and"); + public static final UITexture OVERLAY_BUTTON_GATE_NAND = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/gate_nand"); + public static final UITexture OVERLAY_BUTTON_GATE_OR = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/gate_or"); + public static final UITexture OVERLAY_BUTTON_GATE_NOR = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/gate_nor"); + public static final UITexture OVERLAY_BUTTON_ANALOG = UITexture.fullImage(GregTech.ID, "gui/overlay_button/analog"); + public static final UITexture OVERLAY_BUTTON_LOCK = UITexture.fullImage(GregTech.ID, "gui/overlay_button/lock"); + public static final UITexture OVERLAY_BUTTON_INPUT_FROM_OUTPUT_SIDE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/input_from_output_side"); + public static final UITexture OVERLAY_BUTTON_TANK_VOID_EXCESS = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/tank_void_excess"); + public static final UITexture OVERLAY_BUTTON_TANK_VOID_ALL = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/tank_void_all"); + public static final UITexture OVERLAY_BUTTON_NEI = UITexture.fullImage(GregTech.ID, "gui/overlay_button/nei"); + public static final UITexture OVERLAY_BUTTON_USE_PROCESSING_STATE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/use_processing_state.png"); + public static final UITexture OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/use_inverted_processing_state.png"); + public static final UITexture OVERLAY_BUTTON_CHUNK_LOADING = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/chunkloading"); + public static final UITexture OVERLAY_BUTTON_CHUNK_LOADING_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/chunkloading_off"); + public static final UITexture OVERLAY_BUTTON_WORK_AREA = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/work_area"); + public static final UITexture OVERLAY_BUTTON_REPLACE_COBBLE_ON = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/replace_cobble_on"); + public static final UITexture OVERLAY_BUTTON_REPLACE_COBBLE_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/replace_cobble_off"); + public static final UITexture OVERLAY_BUTTON_RETRACT_PIPE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/retract_pipes"); + public static final UITexture OVERLAY_BUTTON_HOURGLASS = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/hourglass"); + + public static final UITexture OVERLAY_BUTTON_LIQUIDMODE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/LiquidMode"); + + public static final UITexture OVERLAY_BUTTON_LIQUIDMODE_OFF = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/LiquidMode_off"); + + // These icons are for mode switching machine modes + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_DEFAULT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_default"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_CHEMBATH = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_chembath"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_WASHPLANT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_washplant"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SIMPLEWASHER = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_simplewasher"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_PACKAGER = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_packager"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_UNPACKAGER = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_unpackager"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SEPARATOR = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_separator"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_POLARIZER = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_polarizer"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_LPF_FLUID = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_lpf_fluid"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_LPF_METAL = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_lpf_metal"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_BENDING = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_bending"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_FORMING = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_forming"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SLICING = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_slicing"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_CUTTING = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_cutting"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_COMPRESSING = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_compressing"); + public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SINGULARITY = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_singularity"); + + /** + * Can adjust size as needed. + */ + public static final AdaptableUITexture PICTURE_SCREEN_BLACK = AdaptableUITexture + .of(GregTech.ID, "gui/picture/screen_black", 16, 16, 2); + + public static final UITexture PICTURE_RADIATION_WARNING = UITexture + .fullImage(GregTech.ID, "gui/picture/radiation_warning"); + public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT = UITexture + .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent"); + public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY = UITexture + .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent_gray"); + public static final SteamTexture PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM = SteamTexture + .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent_%s"); + public static final UITexture PICTURE_GT_LOGO_18x18 = UITexture.fullImage(GregTech.ID, "gui/picture/gt_logo_18x18"); + public static final UITexture PICTURE_GT_LOGO_19x19 = UITexture.fullImage(GregTech.ID, "gui/picture/gt_logo_19x19"); + public static final UITexture PICTURE_INFORMATION = UITexture.fullImage(GregTech.ID, "gui/picture/information"); + public static final UITexture PICTURE_STALLED_ELECTRICITY = UITexture + .fullImage(GregTech.ID, "gui/picture/stalled_electricity"); + public static final UITexture PICTURE_STALLED_STEAM = UITexture.fullImage(GregTech.ID, "gui/picture/stalled_steam"); + public static final BiFunction PICTURE_ARROW_22_RED = (width, fromRight) -> UITexture + .partly( + GregTech.ID, + "gui/picture/arrow_22_red", + 87, + 22, + fromRight ? 87 - width : 0, + 0, + fromRight ? 87 : width, + 22); + public static final BiFunction PICTURE_ARROW_22_BLUE = (width, fromRight) -> UITexture + .partly( + GregTech.ID, + "gui/picture/arrow_22_blue", + 87, + 22, + fromRight ? 87 - width : 0, + 0, + fromRight ? 87 : width, + 22); + public static final BiFunction PICTURE_ARROW_22_WHITE = (width, fromRight) -> UITexture + .partly( + GregTech.ID, + "gui/picture/arrow_22_white", + 87, + 22, + fromRight ? 87 - width : 0, + 0, + fromRight ? 87 : width, + 22); + public static final BiFunction PICTURE_ARROW_24_RED = (width, fromRight) -> UITexture + .partly( + GregTech.ID, + "gui/picture/arrow_24_red", + 69, + 24, + fromRight ? 69 - width : 0, + 0, + fromRight ? 69 : width, + 24); + public static final BiFunction PICTURE_ARROW_24_BLUE = (width, fromRight) -> UITexture + .partly( + GregTech.ID, + "gui/picture/arrow_24_blue", + 69, + 24, + fromRight ? 69 - width : 0, + 0, + fromRight ? 69 : width, + 24); + public static final BiFunction PICTURE_ARROW_24_WHITE = (width, fromRight) -> UITexture + .partly( + GregTech.ID, + "gui/picture/arrow_24_white", + 69, + 24, + fromRight ? 69 - width : 0, + 0, + fromRight ? 69 : width, + 24); + public static final UITexture PICTURE_FLUID_WINDOW = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_window"); + public static final UITexture PICTURE_FLUID_TANK = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_tank"); + public static final UITexture PICTURE_SLOTS_HOLO_3BY3 = UITexture + .fullImage(GregTech.ID, "gui/picture/slots_holo_3by3"); + public static final UITexture PICTURE_ARROW_DOUBLE = UITexture.fullImage(GregTech.ID, "gui/picture/arrow_double"); + public static final UITexture PICTURE_SUPER_BUFFER = UITexture.fullImage(GregTech.ID, "gui/picture/super_buffer"); + public static final UITexture PICTURE_SQUARE_LIGHT_GRAY = UITexture + .fullImage(GregTech.ID, "gui/picture/square_light_gray"); + public static final UITexture PICTURE_GAUGE = UITexture.fullImage(GregTech.ID, "gui/picture/gauge"); + public static final UITexture PICTURE_ITEM_IN = UITexture.fullImage(GregTech.ID, "gui/picture/item_in"); + public static final UITexture PICTURE_ITEM_OUT = UITexture.fullImage(GregTech.ID, "gui/picture/item_out"); + public static final UITexture PICTURE_FLUID_IN = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_in"); + public static final UITexture PICTURE_FLUID_OUT = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_out"); +} diff --git a/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java b/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java deleted file mode 100644 index f98d6099fc..0000000000 --- a/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java +++ /dev/null @@ -1,74 +0,0 @@ -package gregtech.api.gui.modularui; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; - -import gregtech.api.interfaces.tileentity.ICoverable; - -public class GT_CoverUIBuildContext extends UIBuildContext { - - // cover data is not synced to client, while ID is - private final int coverID; - private final ForgeDirection side; - private final ICoverable tile; - private final boolean anotherWindow; - private final int guiColorization; - - /** - * @param player Player opened this UI - * @param coverID See {@link ICoverable#getCoverIDAtSide} - * @param side Side this cover is attached to - * @param tile Tile this cover is attached to - * @param anotherWindow If cover UI is shown on top of another window - * @param guiColorization The color used to render machine's GUI - */ - public GT_CoverUIBuildContext(EntityPlayer player, int coverID, ForgeDirection side, ICoverable tile, - boolean anotherWindow, int guiColorization) { - super(player); - this.coverID = coverID; - this.side = side; - this.tile = tile; - this.anotherWindow = anotherWindow; - this.guiColorization = guiColorization; - } - - /** - * @param player Player opened this UI - * @param coverID See {@link ICoverable#getCoverIDAtSide} - * @param side Side this cover is attached to - * @param tile Tile this cover is attached to - * @param anotherWindow If cover GUI is shown in opened on top of another window - */ - public GT_CoverUIBuildContext(EntityPlayer player, int coverID, ForgeDirection side, ICoverable tile, - boolean anotherWindow) { - this(player, coverID, side, tile, anotherWindow, tile.getGUIColorization()); - } - - public int getCoverID() { - return coverID; - } - - public ForgeDirection getCoverSide() { - return side; - } - - /** - * Note that this will return different object between client v.s. server side on SP. - */ - public ICoverable getTile() { - return tile; - } - - /** - * If cover GUI is shown in opened on top of another window. - */ - public boolean isAnotherWindow() { - return anotherWindow; - } - - public int getGuiColorization() { - return guiColorization; - } -} diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java b/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java deleted file mode 100644 index ea9a39bdf8..0000000000 --- a/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java +++ /dev/null @@ -1,189 +0,0 @@ -package gregtech.api.gui.modularui; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.UIInfos; -import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI; -import com.gtnewhorizons.modularui.api.screen.ModularUIContext; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.builder.UIBuilder; -import com.gtnewhorizons.modularui.common.builder.UIInfo; -import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; -import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui; -import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords; -import gregtech.api.net.GT_Packet_SendCoverData; -import gregtech.api.util.GT_CoverBehaviorBase; - -public class GT_UIInfos { - - public static void init() {} - - /** - * Generator for {@link UIInfo} which is responsible for registering and opening UIs. Unlike - * {@link com.gtnewhorizons.modularui.api.UIInfos#TILE_MODULAR_UI}, this accepts custom constructors for UI.
- * Do NOT run {@link UIBuilder#build} on-the-fly, otherwise MP client won't register UIs. Instead, store to static - * field, just like {@link #GTTileEntityDefaultUI}. Such mistake can be easily overlooked by testing only SP. - */ - public static final Function> GTTileEntityUIFactory = containerConstructor -> UIBuilder - .of() - .container((player, world, x, y, z) -> { - TileEntity te = world.getTileEntity(x, y, z); - if (te instanceof ITileWithModularUI mui) { - return createTileEntityContainer(player, mui::createWindow, te::markDirty, containerConstructor); - } - return null; - }) - .gui(((player, world, x, y, z) -> { - if (!world.isRemote) return null; - TileEntity te = world.getTileEntity(x, y, z); - if (te instanceof ITileWithModularUI mui) { - return createTileEntityGuiContainer(player, mui::createWindow, containerConstructor); - } - return null; - })) - .build(); - - private static final UIInfo GTTileEntityDefaultUI = GTTileEntityUIFactory.apply(ModularUIContainer::new); - - private static final Map> coverUI = new HashMap<>(); - - static { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - coverUI.put( - side, - UIBuilder.of() - .container((player, world, x, y, z) -> { - final TileEntity te = world.getTileEntity(x, y, z); - if (!(te instanceof ICoverable gtTileEntity)) return null; - final GT_CoverBehaviorBase cover = gtTileEntity.getCoverBehaviorAtSideNew(side); - return createCoverContainer( - player, - cover::createWindow, - te::markDirty, - gtTileEntity.getCoverIDAtSide(side), - side, - gtTileEntity); - }) - .gui((player, world, x, y, z) -> { - if (!world.isRemote) return null; - final TileEntity te = world.getTileEntity(x, y, z); - if (!(te instanceof ICoverable gtTileEntity)) return null; - final GT_CoverBehaviorBase cover = gtTileEntity.getCoverBehaviorAtSideNew(side); - return createCoverGuiContainer( - player, - cover::createWindow, - gtTileEntity.getCoverIDAtSide(side), - side, - gtTileEntity); - }) - .build()); - } - } - - /** - * Opens TileEntity UI, created by {@link ITileWithModularUI#createWindow}. - */ - public static void openGTTileEntityUI(IHasWorldObjectAndCoords aTileEntity, EntityPlayer aPlayer) { - if (aTileEntity.isClientSide() || aPlayer instanceof FakePlayer) return; - GTTileEntityDefaultUI.open( - aPlayer, - aTileEntity.getWorld(), - aTileEntity.getXCoord(), - aTileEntity.getYCoord(), - aTileEntity.getZCoord()); - } - - /** - * Opens cover UI, created by {@link GT_CoverBehaviorBase#createWindow}. - */ - public static void openCoverUI(ICoverable tileEntity, EntityPlayer player, ForgeDirection side) { - if (tileEntity.isClientSide()) return; - - GT_Values.NW.sendToPlayer( - new GT_Packet_SendCoverData( - side, - tileEntity.getCoverIDAtSide(side), - tileEntity.getComplexCoverDataAtSide(side), - tileEntity), - (EntityPlayerMP) player); - - coverUI.get(side) - .open( - player, - tileEntity.getWorld(), - tileEntity.getXCoord(), - tileEntity.getYCoord(), - tileEntity.getZCoord()); - } - - /** - * Opens UI for player's item, created by - * {@link com.gtnewhorizons.modularui.api.screen.IItemWithModularUI#createWindow}. - */ - public static void openPlayerHeldItemUI(EntityPlayer player) { - if (NetworkUtils.isClient()) return; - UIInfos.PLAYER_HELD_ITEM_UI.open(player); - } - - private static ModularUIContainer createTileEntityContainer(EntityPlayer player, - Function windowCreator, Runnable onWidgetUpdate, - ContainerConstructor containerCreator) { - final UIBuildContext buildContext = new UIBuildContext(player); - final ModularWindow window = windowCreator.apply(buildContext); - if (window == null) return null; - return containerCreator.of(new ModularUIContext(buildContext, onWidgetUpdate), window); - } - - @SideOnly(Side.CLIENT) - private static ModularGui createTileEntityGuiContainer(EntityPlayer player, - Function windowCreator, ContainerConstructor containerConstructor) { - final ModularUIContainer container = createTileEntityContainer( - player, - windowCreator, - null, - containerConstructor); - if (container == null) return null; - return new ModularGui(container); - } - - private static ModularUIContainer createCoverContainer(EntityPlayer player, - Function windowCreator, Runnable onWidgetUpdate, int coverID, - ForgeDirection side, ICoverable tile) { - final GT_CoverUIBuildContext buildContext = new GT_CoverUIBuildContext(player, coverID, side, tile, false); - final ModularWindow window = windowCreator.apply(buildContext); - if (window == null) return null; - return new ModularUIContainer(new ModularUIContext(buildContext, onWidgetUpdate), window); - } - - @SideOnly(Side.CLIENT) - private static ModularGui createCoverGuiContainer(EntityPlayer player, - Function windowCreator, int coverID, ForgeDirection side, - ICoverable tile) { - final ModularUIContainer container = createCoverContainer(player, windowCreator, null, coverID, side, tile); - if (container == null) { - return null; - } - return new ModularGui(container); - } - - @FunctionalInterface - public interface ContainerConstructor { - - ModularUIContainer of(ModularUIContext context, ModularWindow mainWindow); - } -} diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java deleted file mode 100644 index 6031399c06..0000000000 --- a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java +++ /dev/null @@ -1,542 +0,0 @@ -package gregtech.api.gui.modularui; - -import static gregtech.api.enums.Mods.GregTech; - -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture; -import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; -import com.gtnewhorizons.modularui.api.drawable.UITexture; - -public class GT_UITextures { - - public static final UITexture TRANSPARENT = UITexture.fullImage(GregTech.ID, "gui/picture/transparent"); - - public static final AdaptableUITexture BACKGROUND_SINGLEBLOCK_DEFAULT = AdaptableUITexture - .of(GregTech.ID, "gui/background/singleblock_default", 176, 166, 4); - public static final SteamTexture BACKGROUND_STEAM = SteamTexture - .adaptableTexture(GregTech.ID, "gui/background/%s", 176, 166, 4); - public static final UITexture BACKGROUND_FUSION_COMPUTER = UITexture - .fullImage(GregTech.ID, "gui/background/fusion_computer"); - public static final AdaptableUITexture BACKGROUND_TEXT_FIELD = AdaptableUITexture - .of(GregTech.ID, "gui/background/text_field", 142, 28, 1); - public static final AdaptableUITexture BACKGROUND_TEXT_FIELD_LIGHT_GRAY = AdaptableUITexture - .of(GregTech.ID, "gui/background/text_field_light_gray", 61, 12, 1); - public static final AdaptableUITexture BACKGROUND_NEI_SINGLE_RECIPE = AdaptableUITexture - .of(GregTech.ID, "gui/background/nei_single_recipe.png", 64, 64, 2); - public static final UITexture BACKGROUND_FLOCCULATION_RECIPE = UITexture - .fullImage(GregTech.ID, "gui/background/flocculation_recipe.png"); - public static final SteamTexture SLOT_ITEM_STEAM = SteamTexture.fullImage(GregTech.ID, "gui/slot/item_%s"); - public static final SteamTexture SLOT_FLUID_STEAM = SteamTexture.fullImage(GregTech.ID, "gui/slot/fluid_%s"); - public static final AdaptableUITexture SLOT_DARK_GRAY = AdaptableUITexture - .of(GregTech.ID, "gui/slot/dark_gray", 18, 18, 1); - public static final AdaptableUITexture SLOT_MAINTENANCE = AdaptableUITexture - .of(GregTech.ID, "gui/slot/maintenance", 20, 20, 1); - public static final AdaptableUITexture SLOT_UPLIFTED = AdaptableUITexture - .of(GregTech.ID, "gui/slot/uplifted", 18, 18, 1); - - public static final UITexture OVERLAY_SLOT_ARROW_ME = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/arrow_me"); - public static final UITexture OVERLAY_SLOT_PATTERN_ME = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/pattern_me"); - - public static final UITexture OVERLAY_SLOT_BEAKER_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/beaker_1"); - public static final UITexture OVERLAY_SLOT_BEAKER_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/beaker_2"); - public static final UITexture OVERLAY_SLOT_BEE_DRONE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/bee_drone"); - public static final UITexture OVERLAY_SLOT_BEE_QUEEN = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/bee_queen"); - public static final UITexture OVERLAY_SLOT_BENDER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/bender"); - public static final UITexture OVERLAY_SLOT_BOX = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/box"); - public static final UITexture OVERLAY_SLOT_BOXED = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/boxed"); - public static final UITexture OVERLAY_SLOT_CANISTER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/canister"); - public static final SteamTexture OVERLAY_SLOT_CANISTER_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/canister_%s"); - public static final UITexture OVERLAY_SLOT_CANNER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/canner"); - public static final UITexture OVERLAY_SLOT_CAULDRON = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/cauldron"); - public static final UITexture OVERLAY_SLOT_CENTRIFUGE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge"); - public static final UITexture OVERLAY_SLOT_CENTRIFUGE_FLUID = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge_fluid"); - public static final SteamTexture OVERLAY_SLOT_CENTRIFUGE_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge_%s"); - public static final UITexture OVERLAY_SLOT_CHARGER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/charger"); - public static final UITexture OVERLAY_SLOT_CHARGER_FLUID = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/charger_fluid"); - public static final UITexture OVERLAY_SLOT_CIRCUIT = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/circuit"); - public static final SteamTexture OVERLAY_SLOT_COAL_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/coal_%s"); - public static final UITexture OVERLAY_SLOT_COMPRESSOR = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/compressor"); - public static final SteamTexture OVERLAY_SLOT_COMPRESSOR_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/compressor_%s"); - public static final UITexture OVERLAY_SLOT_CRUSHED_ORE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/crushed_ore"); - public static final SteamTexture OVERLAY_SLOT_CRUSHED_ORE_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/crushed_ore_%s"); - public static final UITexture OVERLAY_SLOT_CUTTER_SLICED = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/cutter_sliced"); - public static final UITexture OVERLAY_SLOT_DATA_ORB = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/data_orb"); - public static final UITexture OVERLAY_SLOT_DATA_STICK = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/data_stick"); - public static final UITexture OVERLAY_SLOT_DUST = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/dust"); - public static final SteamTexture OVERLAY_SLOT_DUST_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/dust_%s"); - public static final SteamTexture OVERLAY_SLOT_BLOCK_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/block_%s"); - public static final UITexture OVERLAY_SLOT_EXPLOSIVE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/explosive"); - public static final UITexture OVERLAY_SLOT_EXTRUDER_SHAPE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/extruder_shape"); - public static final UITexture OVERLAY_SLOT_FILTER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/filter"); - public static final UITexture OVERLAY_SLOT_FURNACE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/furnace"); - public static final SteamTexture OVERLAY_SLOT_FURNACE_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/furnace_%s"); - public static final UITexture OVERLAY_SLOT_GEM = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/gem"); - public static final UITexture OVERLAY_SLOT_HAMMER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/hammer"); - public static final SteamTexture OVERLAY_SLOT_HAMMER_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/hammer_%s"); - public static final UITexture OVERLAY_SLOT_HEATER_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/heater_1"); - public static final UITexture OVERLAY_SLOT_HEATER_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/heater_2"); - public static final UITexture OVERLAY_SLOT_IMPLOSION = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/implosion"); - public static final UITexture OVERLAY_SLOT_IN = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/in"); - public static final SteamTexture OVERLAY_SLOT_IN_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/in_%s"); - public static final SteamTexture OVERLAY_SLOT_INGOT_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/ingot_%s"); - public static final UITexture OVERLAY_SLOT_INT_CIRCUIT = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/int_circuit"); - public static final UITexture OVERLAY_SLOT_LENS = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/lens"); - public static final UITexture OVERLAY_SLOT_MICROSCOPE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/microscope"); - public static final UITexture OVERLAY_SLOT_MINING_PIPE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/mining_pipe"); - public static final UITexture OVERLAY_SLOT_MOLD = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/mold"); - public static final UITexture OVERLAY_SLOT_MOLECULAR_1 = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/molecular_1"); - public static final UITexture OVERLAY_SLOT_MOLECULAR_2 = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/molecular_2"); - public static final UITexture OVERLAY_SLOT_MOLECULAR_3 = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/molecular_3"); - public static final UITexture OVERLAY_SLOT_OUT = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/out"); - public static final SteamTexture OVERLAY_SLOT_OUT_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/overlay_slot/out_%s"); - public static final UITexture OVERLAY_SLOT_PAGE_BLANK = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/page_blank"); - public static final UITexture OVERLAY_SLOT_PAGE_PRINTED = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/page_printed"); - public static final UITexture OVERLAY_SLOT_PRESS_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_1"); - public static final UITexture OVERLAY_SLOT_PRESS_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_2"); - public static final UITexture OVERLAY_SLOT_PRESS_3 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_3"); - public static final UITexture OVERLAY_SLOT_RECYCLE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/recycle"); - public static final UITexture OVERLAY_SLOT_ROD_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/rod_1"); - public static final UITexture OVERLAY_SLOT_ROD_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/rod_2"); - public static final UITexture OVERLAY_SLOT_SLICE_SHAPE = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/slice_shape"); - public static final UITexture OVERLAY_SLOT_SLICER_SLICED = UITexture - .fullImage(GregTech.ID, "gui/overlay_slot/slicer_sliced"); - public static final UITexture OVERLAY_SLOT_SQUARE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/square"); - public static final UITexture OVERLAY_SLOT_UUA = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/uua"); - public static final UITexture OVERLAY_SLOT_UUM = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/uum"); - public static final UITexture OVERLAY_SLOT_VIAL_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/vial_1"); - public static final UITexture OVERLAY_SLOT_VIAL_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/vial_2"); - public static final UITexture OVERLAY_SLOT_WIREMILL = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/wiremill"); - public static final UITexture OVERLAY_SLOT_WRENCH = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/wrench"); - public static final UITexture[] OVERLAY_SLOTS_NUMBER = IntStream.range(0, 12) - .mapToObj(i -> UITexture.fullImage(GregTech.ID, "gui/overlay_slot/number_" + i)) - .collect(Collectors.toList()) - .toArray(new UITexture[0]); - - public static final UITexture PROGRESSBAR_ARROW = UITexture.fullImage(GregTech.ID, "gui/progressbar/arrow"); - public static final SteamTexture PROGRESSBAR_ARROW_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/arrow_%s"); - public static final SteamTexture PROGRESSBAR_ARROW_2_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/arrow_2_%s"); - public static final UITexture PROGRESSBAR_ARROW_MULTIPLE = UITexture - .fullImage(GregTech.ID, "gui/progressbar/arrow_multiple"); - public static final UITexture PROGRESSBAR_ASSEMBLE = UITexture.fullImage(GregTech.ID, "gui/progressbar/assemble"); - public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_1 = UITexture - .fullImage(GregTech.ID, "gui/progressbar/assemblyline_1"); - public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_2 = UITexture - .fullImage(GregTech.ID, "gui/progressbar/assemblyline_2"); - public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_3 = UITexture - .fullImage(GregTech.ID, "gui/progressbar/assemblyline_3"); - public static final UITexture PROGRESSBAR_BATH = UITexture.fullImage(GregTech.ID, "gui/progressbar/bath"); - public static final UITexture PROGRESSBAR_BENDING = UITexture.fullImage(GregTech.ID, "gui/progressbar/bending"); - public static final SteamTexture PROGRESSBAR_BOILER_EMPTY_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/boiler_empty_%s"); - public static final UITexture PROGRESSBAR_BOILER_HEAT = UITexture - .fullImage(GregTech.ID, "gui/progressbar/boiler_heat"); - public static final UITexture PROGRESSBAR_BOILER_STEAM = UITexture - .fullImage(GregTech.ID, "gui/progressbar/boiler_steam"); - public static final UITexture PROGRESSBAR_BOILER_WATER = UITexture - .fullImage(GregTech.ID, "gui/progressbar/boiler_water"); - public static final UITexture PROGRESSBAR_CANNER = UITexture.fullImage(GregTech.ID, "gui/progressbar/canner"); - public static final UITexture PROGRESSBAR_CIRCUIT_ASSEMBLER = UITexture - .fullImage(GregTech.ID, "gui/progressbar/circuit_assembler"); - public static final UITexture PROGRESSBAR_COMPRESS = UITexture.fullImage(GregTech.ID, "gui/progressbar/compress"); - public static final SteamTexture PROGRESSBAR_COMPRESS_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/compress_%s"); - public static final UITexture PROGRESSBAR_CUT = UITexture.fullImage(GregTech.ID, "gui/progressbar/cut"); - public static final UITexture PROGRESSBAR_EXTRACT = UITexture.fullImage(GregTech.ID, "gui/progressbar/extract"); - public static final SteamTexture PROGRESSBAR_EXTRACT_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/extract_%s"); - public static final UITexture PROGRESSBAR_EXTRUDE = UITexture.fullImage(GregTech.ID, "gui/progressbar/extrude"); - public static final SteamTexture PROGRESSBAR_FUEL_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/fuel_%s"); - public static final UITexture PROGRESSBAR_HAMMER = UITexture.fullImage(GregTech.ID, "gui/progressbar/hammer"); - public static final UITexture PROGRESSBAR_HAMMER_BASE = UITexture - .fullImage(GregTech.ID, "gui/progressbar/hammer_base"); - public static final SteamTexture PROGRESSBAR_HAMMER_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/hammer_%s"); - public static final SteamTexture PROGRESSBAR_HAMMER_BASE_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/hammer_base_%s"); - public static final UITexture PROGRESSBAR_LATHE = UITexture.fullImage(GregTech.ID, "gui/progressbar/lathe"); - public static final UITexture PROGRESSBAR_LATHE_BASE = UITexture - .fullImage(GregTech.ID, "gui/progressbar/lathe_base"); - public static final UITexture PROGRESSBAR_MACERATE = UITexture.fullImage(GregTech.ID, "gui/progressbar/macerate"); - public static final SteamTexture PROGRESSBAR_MACERATE_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/progressbar/macerate_%s"); - public static final UITexture PROGRESSBAR_MAGNET = UITexture.fullImage(GregTech.ID, "gui/progressbar/magnet"); - public static final UITexture PROGRESSBAR_MIXER = UITexture.fullImage(GregTech.ID, "gui/progressbar/mixer"); - public static final UITexture PROGRESSBAR_RECYCLE = UITexture.fullImage(GregTech.ID, "gui/progressbar/recycle"); - public static final UITexture PROGRESSBAR_SIFT = UITexture.fullImage(GregTech.ID, "gui/progressbar/sift"); - public static final UITexture PROGRESSBAR_SLICE = UITexture.fullImage(GregTech.ID, "gui/progressbar/slice"); - public static final UITexture PROGRESSBAR_STORED_EU = UITexture.fullImage(GregTech.ID, "gui/progressbar/stored_eu"); - public static final UITexture PROGRESSBAR_WIREMILL = UITexture.fullImage(GregTech.ID, "gui/progressbar/wiremill"); - public static final UITexture PROGRESSBAR_FLOCCULATION = UITexture - .fullImage(GregTech.ID, "gui/progressbar/flocculation"); - public static final UITexture PROGRESSBAR_CLARIFIER = UITexture.fullImage(GregTech.ID, "gui/progressbar/clarifier"); - public static final UITexture PROGRESSBAR_PH_NEUTRALIZATION = UITexture - .fullImage(GregTech.ID, "gui/progressbar/phneutralization"); - public static final UITexture PROGRESSBAR_OZONATION = UITexture.fullImage(GregTech.ID, "gui/progressbar/ozonation"); - public static final UITexture PROGRESSBAR_PLASMA_HEATER = UITexture - .fullImage(GregTech.ID, "gui/progressbar/water_plasma_heater"); - - public static FallbackableUITexture fallbackableProgressbar(String name, UITexture fallback) { - return new FallbackableUITexture(UITexture.fullImage(GregTech.ID, "gui/progressbar/" + name), fallback); - } - - public static final UITexture TAB_COVER_NORMAL = UITexture.fullImage(GregTech.ID, "gui/tab/cover_normal"); - public static final UITexture TAB_COVER_HIGHLIGHT = UITexture.fullImage(GregTech.ID, "gui/tab/cover_highlight"); - public static final UITexture TAB_COVER_DISABLED = UITexture.fullImage(GregTech.ID, "gui/tab/cover_disabled"); - public static final SteamTexture TAB_COVER_STEAM_NORMAL = SteamTexture - .fullImage(GregTech.ID, "gui/tab/cover_%s_normal"); - public static final SteamTexture TAB_COVER_STEAM_HIGHLIGHT = SteamTexture - .fullImage(GregTech.ID, "gui/tab/cover_%s_highlight"); - public static final SteamTexture TAB_COVER_STEAM_DISABLED = SteamTexture - .fullImage(GregTech.ID, "gui/tab/cover_%s_disabled"); - public static final AdaptableUITexture TAB_TITLE = AdaptableUITexture.of(GregTech.ID, "gui/tab/title", 28, 28, 4); - public static final AdaptableUITexture TAB_TITLE_DARK = AdaptableUITexture - .of(GregTech.ID, "gui/tab/title_dark", 28, 28, 4); - public static final SteamTexture TAB_TITLE_STEAM = SteamTexture - .adaptableTexture(GregTech.ID, "gui/tab/title_%s", 28, 28, 4); - public static final SteamTexture TAB_TITLE_DARK_STEAM = SteamTexture - .adaptableTexture(GregTech.ID, "gui/tab/title_dark_%s", 28, 28, 4); - public static final AdaptableUITexture TAB_TITLE_ANGULAR = AdaptableUITexture - .of(GregTech.ID, "gui/tab/title_angular", 28, 28, 4); - public static final SteamTexture TAB_TITLE_ANGULAR_STEAM = SteamTexture - .adaptableTexture(GregTech.ID, "gui/tab/title_angular_%s", 28, 28, 4); - - public static final UITexture BUTTON_STANDARD = AdaptableUITexture - .of(GregTech.ID, "gui/button/standard", 18, 18, 1); - public static final UITexture BUTTON_STANDARD_PRESSED = AdaptableUITexture - .of(GregTech.ID, "gui/button/standard_pressed", 18, 18, 1); - public static final UITexture BUTTON_STANDARD_DISABLED = AdaptableUITexture - .of(GregTech.ID, "gui/button/standard_disabled", 18, 18, 1); - public static final UITexture BUTTON_STANDARD_TOGGLE = AdaptableUITexture - .of(GregTech.ID, "gui/button/standard_toggle", 18, 18, 1); - public static final UITexture BUTTON_STANDARD_TOGGLE_DISABLED = AdaptableUITexture - .of(GregTech.ID, "gui/button/standard_toggle_disabled", 18, 18, 1); - public static final UITexture BUTTON_COVER_NORMAL = UITexture.fullImage(GregTech.ID, "gui/button/cover_normal"); - public static final UITexture BUTTON_COVER_NORMAL_HOVERED = UITexture - .fullImage(GregTech.ID, "gui/button/cover_normal_hovered"); - public static final UITexture BUTTON_COVER_NORMAL_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/button/cover_normal_disabled"); - - public static final UITexture OVERLAY_BUTTON_DISABLE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/disable"); - public static final UITexture OVERLAY_BUTTON_REDSTONE_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/redstone_off"); - public static final UITexture OVERLAY_BUTTON_REDSTONE_ON = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/redstone_on"); - public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_ON = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/power_switch_on"); - public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/power_switch_off"); - public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_NONE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/void_excess_none"); - public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_ITEM = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/void_excess_item"); - public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_FLUID = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/void_excess_fluid"); - public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_ALL = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/void_excess_all"); - public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_ON = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/input_separation_on"); - public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/input_separation_on_disabled"); - public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/input_separation_off"); - public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/input_separation_off_disabled"); - public static final UITexture OVERLAY_BUTTON_RECIPE_LOCKED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/recipe_locked"); - public static final UITexture OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/recipe_locked_disabled"); - public static final UITexture OVERLAY_BUTTON_RECIPE_UNLOCKED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/recipe_unlocked"); - public static final UITexture OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/recipe_unlocked_disabled"); - public static final UITexture OVERLAY_BUTTON_BATCH_MODE_ON = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_on"); - public static final UITexture OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_on_disabled"); - public static final UITexture OVERLAY_BUTTON_BATCH_MODE_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_off"); - public static final UITexture OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_off_disabled"); - public static final UITexture OVERLAY_BUTTON_STRUCTURE_UPDATE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/structure_update"); - public static final UITexture OVERLAY_BUTTON_FORBIDDEN = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/forbidden"); - public static final UITexture OVERLAY_BUTTON_LOCKED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/lock_small"); - public static final UITexture OVERLAY_BUTTON_DOWN_TIERING_ON = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/down_tiering_on"); - public static final UITexture OVERLAY_BUTTON_DOWN_TIERING_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/down_tiering_off"); - public static final UITexture OVERLAY_BUTTON_CHECKMARK = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/checkmark"); - public static final UITexture OVERLAY_BUTTON_CROSS = UITexture.fullImage(GregTech.ID, "gui/overlay_button/cross"); - public static final UITexture OVERLAY_BUTTON_WHITELIST = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/whitelist"); - public static final UITexture OVERLAY_BUTTON_BLACKLIST = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/blacklist"); - public static final UITexture OVERLAY_BUTTON_PROGRESS = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/progress"); - public static final UITexture OVERLAY_BUTTON_EXPORT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/export"); - public static final UITexture OVERLAY_BUTTON_IMPORT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/import"); - public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_ITEM = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/autooutput_item"); - public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_FLUID = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/autooutput_fluid"); - public static final UITexture OVERLAY_BUTTON_ALLOW_INPUT = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/allow_input"); - public static final UITexture OVERLAY_BUTTON_ALLOW_OUTPUT = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/allow_output"); - public static final UITexture OVERLAY_BUTTON_AUTOPULL_ME = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/auto_pull_me"); - public static final UITexture OVERLAY_BUTTON_AUTOPULL_ME_DISABLED = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/auto_pull_me_disabled"); - public static final UITexture OVERLAY_BUTTON_BLOCK_INPUT = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/block_input"); - public static final UITexture OVERLAY_BUTTON_BLOCK_OUTPUT = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/block_output"); - public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_UP = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/arrow_green_up"); - public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_DOWN = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/arrow_green_down"); - public static final UITexture OVERLAY_BUTTON_CYCLIC = UITexture.fullImage(GregTech.ID, "gui/overlay_button/cyclic"); - public static final UITexture OVERLAY_BUTTON_SHUFFLE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/shuffle"); - public static final UITexture OVERLAY_BUTTON_EMIT_ENERGY = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/emit_energy"); - public static final UITexture OVERLAY_BUTTON_EMIT_REDSTONE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/emit_redstone"); - public static final UITexture OVERLAY_BUTTON_INVERT_REDSTONE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/invert_redstone"); - public static final UITexture OVERLAY_BUTTON_STOCKING_MODE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/stocking_mode"); - public static final UITexture OVERLAY_BUTTON_INVERT_FILTER = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/invert_filter"); - public static final UITexture OVERLAY_BUTTON_NBT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/nbt"); - public static final UITexture OVERLAY_BUTTON_PRINT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/print"); - public static final UITexture OVERLAY_BUTTON_TRANSPOSE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/transpose"); - public static final UITexture OVERLAY_BUTTON_SORTING_MODE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/sorting_mode"); - public static final UITexture OVERLAY_BUTTON_ONE_STACK_LIMIT = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/one_stack_limit"); - public static final UITexture OVERLAY_BUTTON_BOUNDING_BOX = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/bounding_box"); - public static final UITexture OVERLAY_BUTTON_MINUS_SMALL = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/minus_small"); - public static final UITexture OVERLAY_BUTTON_MINUS_LARGE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/minus_large"); - public static final UITexture OVERLAY_BUTTON_PLUS_SMALL = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/plus_small"); - public static final UITexture OVERLAY_BUTTON_PLUS_LARGE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/plus_large"); - public static final UITexture OVERLAY_BUTTON_GATE_AND = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/gate_and"); - public static final UITexture OVERLAY_BUTTON_GATE_NAND = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/gate_nand"); - public static final UITexture OVERLAY_BUTTON_GATE_OR = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/gate_or"); - public static final UITexture OVERLAY_BUTTON_GATE_NOR = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/gate_nor"); - public static final UITexture OVERLAY_BUTTON_ANALOG = UITexture.fullImage(GregTech.ID, "gui/overlay_button/analog"); - public static final UITexture OVERLAY_BUTTON_LOCK = UITexture.fullImage(GregTech.ID, "gui/overlay_button/lock"); - public static final UITexture OVERLAY_BUTTON_INPUT_FROM_OUTPUT_SIDE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/input_from_output_side"); - public static final UITexture OVERLAY_BUTTON_TANK_VOID_EXCESS = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/tank_void_excess"); - public static final UITexture OVERLAY_BUTTON_TANK_VOID_ALL = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/tank_void_all"); - public static final UITexture OVERLAY_BUTTON_NEI = UITexture.fullImage(GregTech.ID, "gui/overlay_button/nei"); - public static final UITexture OVERLAY_BUTTON_USE_PROCESSING_STATE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/use_processing_state.png"); - public static final UITexture OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/use_inverted_processing_state.png"); - public static final UITexture OVERLAY_BUTTON_CHUNK_LOADING = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/chunkloading"); - public static final UITexture OVERLAY_BUTTON_CHUNK_LOADING_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/chunkloading_off"); - public static final UITexture OVERLAY_BUTTON_WORK_AREA = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/work_area"); - public static final UITexture OVERLAY_BUTTON_REPLACE_COBBLE_ON = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/replace_cobble_on"); - public static final UITexture OVERLAY_BUTTON_REPLACE_COBBLE_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/replace_cobble_off"); - public static final UITexture OVERLAY_BUTTON_RETRACT_PIPE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/retract_pipes"); - public static final UITexture OVERLAY_BUTTON_HOURGLASS = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/hourglass"); - - public static final UITexture OVERLAY_BUTTON_LIQUIDMODE = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/LiquidMode"); - - public static final UITexture OVERLAY_BUTTON_LIQUIDMODE_OFF = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/LiquidMode_off"); - - // These icons are for mode switching machine modes - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_DEFAULT = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_default"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_CHEMBATH = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_chembath"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_WASHPLANT = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_washplant"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SIMPLEWASHER = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_simplewasher"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_PACKAGER = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_packager"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_UNPACKAGER = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_unpackager"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SEPARATOR = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_separator"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_POLARIZER = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_polarizer"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_LPF_FLUID = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_lpf_fluid"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_LPF_METAL = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_lpf_metal"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_BENDING = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_bending"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_FORMING = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_forming"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SLICING = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_slicing"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_CUTTING = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_cutting"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_COMPRESSING = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_compressing"); - public static final UITexture OVERLAY_BUTTON_MACHINEMODE_SINGULARITY = UITexture - .fullImage(GregTech.ID, "gui/overlay_button/machine_mode_singularity"); - - /** - * Can adjust size as needed. - */ - public static final AdaptableUITexture PICTURE_SCREEN_BLACK = AdaptableUITexture - .of(GregTech.ID, "gui/picture/screen_black", 16, 16, 2); - - public static final UITexture PICTURE_RADIATION_WARNING = UITexture - .fullImage(GregTech.ID, "gui/picture/radiation_warning"); - public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT = UITexture - .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent"); - public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY = UITexture - .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent_gray"); - public static final SteamTexture PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM = SteamTexture - .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent_%s"); - public static final UITexture PICTURE_GT_LOGO_18x18 = UITexture.fullImage(GregTech.ID, "gui/picture/gt_logo_18x18"); - public static final UITexture PICTURE_GT_LOGO_19x19 = UITexture.fullImage(GregTech.ID, "gui/picture/gt_logo_19x19"); - public static final UITexture PICTURE_INFORMATION = UITexture.fullImage(GregTech.ID, "gui/picture/information"); - public static final UITexture PICTURE_STALLED_ELECTRICITY = UITexture - .fullImage(GregTech.ID, "gui/picture/stalled_electricity"); - public static final UITexture PICTURE_STALLED_STEAM = UITexture.fullImage(GregTech.ID, "gui/picture/stalled_steam"); - public static final BiFunction PICTURE_ARROW_22_RED = (width, fromRight) -> UITexture - .partly( - GregTech.ID, - "gui/picture/arrow_22_red", - 87, - 22, - fromRight ? 87 - width : 0, - 0, - fromRight ? 87 : width, - 22); - public static final BiFunction PICTURE_ARROW_22_BLUE = (width, fromRight) -> UITexture - .partly( - GregTech.ID, - "gui/picture/arrow_22_blue", - 87, - 22, - fromRight ? 87 - width : 0, - 0, - fromRight ? 87 : width, - 22); - public static final BiFunction PICTURE_ARROW_22_WHITE = (width, fromRight) -> UITexture - .partly( - GregTech.ID, - "gui/picture/arrow_22_white", - 87, - 22, - fromRight ? 87 - width : 0, - 0, - fromRight ? 87 : width, - 22); - public static final BiFunction PICTURE_ARROW_24_RED = (width, fromRight) -> UITexture - .partly( - GregTech.ID, - "gui/picture/arrow_24_red", - 69, - 24, - fromRight ? 69 - width : 0, - 0, - fromRight ? 69 : width, - 24); - public static final BiFunction PICTURE_ARROW_24_BLUE = (width, fromRight) -> UITexture - .partly( - GregTech.ID, - "gui/picture/arrow_24_blue", - 69, - 24, - fromRight ? 69 - width : 0, - 0, - fromRight ? 69 : width, - 24); - public static final BiFunction PICTURE_ARROW_24_WHITE = (width, fromRight) -> UITexture - .partly( - GregTech.ID, - "gui/picture/arrow_24_white", - 69, - 24, - fromRight ? 69 - width : 0, - 0, - fromRight ? 69 : width, - 24); - public static final UITexture PICTURE_FLUID_WINDOW = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_window"); - public static final UITexture PICTURE_FLUID_TANK = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_tank"); - public static final UITexture PICTURE_SLOTS_HOLO_3BY3 = UITexture - .fullImage(GregTech.ID, "gui/picture/slots_holo_3by3"); - public static final UITexture PICTURE_ARROW_DOUBLE = UITexture.fullImage(GregTech.ID, "gui/picture/arrow_double"); - public static final UITexture PICTURE_SUPER_BUFFER = UITexture.fullImage(GregTech.ID, "gui/picture/super_buffer"); - public static final UITexture PICTURE_SQUARE_LIGHT_GRAY = UITexture - .fullImage(GregTech.ID, "gui/picture/square_light_gray"); - public static final UITexture PICTURE_GAUGE = UITexture.fullImage(GregTech.ID, "gui/picture/gauge"); - public static final UITexture PICTURE_ITEM_IN = UITexture.fullImage(GregTech.ID, "gui/picture/item_in"); - public static final UITexture PICTURE_ITEM_OUT = UITexture.fullImage(GregTech.ID, "gui/picture/item_out"); - public static final UITexture PICTURE_FLUID_IN = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_in"); - public static final UITexture PICTURE_FLUID_OUT = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_out"); -} diff --git a/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java b/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java index 18d7741421..0063d59346 100644 --- a/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java +++ b/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java @@ -30,29 +30,26 @@ public class GUITextureSet { private UITexture gregtechLogo; public static final GUITextureSet DEFAULT = new GUITextureSet() - .setMainBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT) + .setMainBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT) .setItemSlot(ModularUITextures.ITEM_SLOT) .setFluidSlot(ModularUITextures.FLUID_SLOT) - .setCoverTab( - GT_UITextures.TAB_COVER_NORMAL, - GT_UITextures.TAB_COVER_HIGHLIGHT, - GT_UITextures.TAB_COVER_DISABLED) - .setTitleTab(GT_UITextures.TAB_TITLE, GT_UITextures.TAB_TITLE_DARK, GT_UITextures.TAB_TITLE_ANGULAR) - .setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT); + .setCoverTab(GTUITextures.TAB_COVER_NORMAL, GTUITextures.TAB_COVER_HIGHLIGHT, GTUITextures.TAB_COVER_DISABLED) + .setTitleTab(GTUITextures.TAB_TITLE, GTUITextures.TAB_TITLE_DARK, GTUITextures.TAB_TITLE_ANGULAR) + .setGregTechLogo(GTUITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT); public static final Function STEAM = steamVariant -> new GUITextureSet() - .setMainBackground(GT_UITextures.BACKGROUND_STEAM.get(steamVariant)) - .setItemSlot(GT_UITextures.SLOT_ITEM_STEAM.get(steamVariant)) - .setFluidSlot(GT_UITextures.SLOT_FLUID_STEAM.get(steamVariant)) + .setMainBackground(GTUITextures.BACKGROUND_STEAM.get(steamVariant)) + .setItemSlot(GTUITextures.SLOT_ITEM_STEAM.get(steamVariant)) + .setFluidSlot(GTUITextures.SLOT_FLUID_STEAM.get(steamVariant)) .setCoverTab( - GT_UITextures.TAB_COVER_STEAM_NORMAL.get(steamVariant), - GT_UITextures.TAB_COVER_STEAM_HIGHLIGHT.get(steamVariant), - GT_UITextures.TAB_COVER_STEAM_DISABLED.get(steamVariant)) + GTUITextures.TAB_COVER_STEAM_NORMAL.get(steamVariant), + GTUITextures.TAB_COVER_STEAM_HIGHLIGHT.get(steamVariant), + GTUITextures.TAB_COVER_STEAM_DISABLED.get(steamVariant)) .setTitleTab( - GT_UITextures.TAB_TITLE_STEAM.getAdaptable(steamVariant), - GT_UITextures.TAB_TITLE_DARK_STEAM.getAdaptable(steamVariant), - GT_UITextures.TAB_TITLE_ANGULAR_STEAM.getAdaptable(steamVariant)) - .setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM.get(steamVariant)); + GTUITextures.TAB_TITLE_STEAM.getAdaptable(steamVariant), + GTUITextures.TAB_TITLE_DARK_STEAM.getAdaptable(steamVariant), + GTUITextures.TAB_TITLE_ANGULAR_STEAM.getAdaptable(steamVariant)) + .setGregTechLogo(GTUITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM.get(steamVariant)); public GUITextureSet() {} diff --git a/src/main/java/gregtech/api/gui/widgets/CoverTickRateButton.java b/src/main/java/gregtech/api/gui/widgets/CoverTickRateButton.java new file mode 100644 index 0000000000..ab05a98925 --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/CoverTickRateButton.java @@ -0,0 +1,82 @@ +package gregtech.api.gui.widgets; + +import static gregtech.api.gui.modularui.GTUITextures.OVERLAY_BUTTON_HOURGLASS; +import static gregtech.common.covers.CoverInfo.MAX_TICK_RATE_ADDITION; + +import java.util.List; + +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.common.covers.CoverInfo; + +public class CoverTickRateButton extends ButtonWidget { + + private static final UITexture BACKGROUND = GTUITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0, 1, 0.5f); + + private final CoverInfo coverInfo; + private int clientTickRate; + private int tickRateAddition; + + public CoverTickRateButton(@NotNull CoverInfo coverInfo, @NotNull IWidgetBuilder builder) { + this.coverInfo = coverInfo; + this.clientTickRate = coverInfo.getTickRate(); + this.tickRateAddition = coverInfo.getTickRateAddition(); + + super.setBackground(BACKGROUND, OVERLAY_BUTTON_HOURGLASS); + super.setOnClick(this::onClick); + super.dynamicTooltip(this::dynamicTooltip); + super.attachSyncer( + new FakeSyncWidget.IntegerSyncer(this.coverInfo::getTickRate, integer -> clientTickRate = integer), + builder, + (widget, aInt) -> notifyTooltipChange()) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer( + this.coverInfo::getTickRateAddition, + integer -> tickRateAddition = integer), + builder); + + } + + private void onClick(@NotNull ClickData clickData, @NotNull Widget widget) { + final int iterations = clickData.ctrl ? 5 : 1; + final boolean isDecreasing = clickData.mouseButton == 1; + + // Do five operations at once if Ctrl is held down. Since the actual increase granted by each invocation can be + // different on each call, just call the method several times rather than trying to do a bunch of weird math. + for (int i = 0; i < iterations; i++) { + coverInfo.adjustTickRateMultiplier(isDecreasing); + } + } + + private List dynamicTooltip() { + final String boundsNotification; + + if (tickRateAddition == 0) { + boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.minimum"); + } else if (tickRateAddition >= MAX_TICK_RATE_ADDITION - 1) { + // Clamping can make tickRateAddition approach but never actually equal MAX_ADDITION, so we need this + // adjustment. + boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.maximum"); + } else { + boundsNotification = ""; + } + + return ImmutableList.of( + StatCollector.translateToLocalFormatted( + "gt.cover.info.button.tick_rate.1", + new CoverInfo.ClientTickRateFormatter(clientTickRate), + boundsNotification), + StatCollector.translateToLocal("gt.cover.info.button.tick_rate.2"), + StatCollector.translateToLocal("gt.cover.info.button.tick_rate.3")); + } +} diff --git a/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java b/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java deleted file mode 100644 index 883ffb4079..0000000000 --- a/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java +++ /dev/null @@ -1,82 +0,0 @@ -package gregtech.api.gui.widgets; - -import static gregtech.api.gui.modularui.GT_UITextures.OVERLAY_BUTTON_HOURGLASS; -import static gregtech.common.covers.CoverInfo.MAX_TICK_RATE_ADDITION; - -import java.util.List; - -import net.minecraft.util.StatCollector; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.common.covers.CoverInfo; - -public class GT_CoverTickRateButton extends ButtonWidget { - - private static final UITexture BACKGROUND = GT_UITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0, 1, 0.5f); - - private final CoverInfo coverInfo; - private int clientTickRate; - private int tickRateAddition; - - public GT_CoverTickRateButton(@NotNull CoverInfo coverInfo, @NotNull IWidgetBuilder builder) { - this.coverInfo = coverInfo; - this.clientTickRate = coverInfo.getTickRate(); - this.tickRateAddition = coverInfo.getTickRateAddition(); - - super.setBackground(BACKGROUND, OVERLAY_BUTTON_HOURGLASS); - super.setOnClick(this::onClick); - super.dynamicTooltip(this::dynamicTooltip); - super.attachSyncer( - new FakeSyncWidget.IntegerSyncer(this.coverInfo::getTickRate, integer -> clientTickRate = integer), - builder, - (widget, aInt) -> notifyTooltipChange()) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer( - this.coverInfo::getTickRateAddition, - integer -> tickRateAddition = integer), - builder); - - } - - private void onClick(@NotNull ClickData clickData, @NotNull Widget widget) { - final int iterations = clickData.ctrl ? 5 : 1; - final boolean isDecreasing = clickData.mouseButton == 1; - - // Do five operations at once if Ctrl is held down. Since the actual increase granted by each invocation can be - // different on each call, just call the method several times rather than trying to do a bunch of weird math. - for (int i = 0; i < iterations; i++) { - coverInfo.adjustTickRateMultiplier(isDecreasing); - } - } - - private List dynamicTooltip() { - final String boundsNotification; - - if (tickRateAddition == 0) { - boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.minimum"); - } else if (tickRateAddition >= MAX_TICK_RATE_ADDITION - 1) { - // Clamping can make tickRateAddition approach but never actually equal MAX_ADDITION, so we need this - // adjustment. - boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.maximum"); - } else { - boundsNotification = ""; - } - - return ImmutableList.of( - StatCollector.translateToLocalFormatted( - "gt.cover.info.button.tick_rate.1", - new CoverInfo.ClientTickRateFormatter(clientTickRate), - boundsNotification), - StatCollector.translateToLocal("gt.cover.info.button.tick_rate.2"), - StatCollector.translateToLocal("gt.cover.info.button.tick_rate.3")); - } -} diff --git a/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java b/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java deleted file mode 100644 index 9a93a8fadf..0000000000 --- a/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java +++ /dev/null @@ -1,90 +0,0 @@ -package gregtech.api.gui.widgets; - -import java.util.Arrays; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Supplier; - -import net.minecraft.util.StatCollector; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.tileentity.IMachineProgress; - -public class GT_LockedWhileActiveButton extends ButtonWidget { - - @NotNull - private final IMachineProgress machine; - - public GT_LockedWhileActiveButton(@NotNull IMachineProgress machine, @NotNull ModularWindow.Builder builder) { - super(); - this.machine = machine; - - super.attachSyncer( - new FakeSyncWidget.BooleanSyncer(machine::isActive, a -> {}), - builder, - (widget, aBoolean) -> widget.notifyTooltipChange()); - - super.dynamicTooltip(this::generateTooltip); - } - - @NotNull - @Override - public ButtonWidget setOnClick(@NotNull BiConsumer clickAction) { - return super.setOnClick((clickData, widget) -> { - if (!machine.isActive()) { - clickAction.accept(clickData, widget); - } - }); - } - - @NotNull - @Override - public Widget setBackground(@NotNull IDrawable... drawables) { - return super.setBackground(() -> appendLockedOverlay(drawables)); - } - - @NotNull - @Override - public Widget setBackground(@NotNull Supplier drawablesSupplier) { - return super.setBackground(() -> appendLockedOverlay(drawablesSupplier.get())); - } - - @NotNull - @Override - public Widget dynamicTooltip(@NotNull Supplier> dynamicTooltip) { - return super.dynamicTooltip(() -> { - ImmutableList.Builder tooltips = ImmutableList.builder() - .addAll(dynamicTooltip.get()); - tooltips.addAll(generateTooltip()); - - return tooltips.build(); - }); - } - - @NotNull - private IDrawable[] appendLockedOverlay(@NotNull IDrawable[] drawables) { - if (machine.isActive()) { - final IDrawable[] copy = Arrays.copyOf(drawables, drawables.length + 1); - copy[drawables.length] = GT_UITextures.OVERLAY_BUTTON_LOCKED; - return copy; - } - return drawables; - } - - @NotNull - private List generateTooltip() { - if (machine.isActive()) { - return ImmutableList.of(StatCollector.translateToLocal("GT5U.gui.button.forbidden_while_running")); - } - return ImmutableList.of(); - } -} diff --git a/src/main/java/gregtech/api/gui/widgets/GT_PhantomItemButton.java b/src/main/java/gregtech/api/gui/widgets/GT_PhantomItemButton.java deleted file mode 100644 index 4e2d144aa7..0000000000 --- a/src/main/java/gregtech/api/gui/widgets/GT_PhantomItemButton.java +++ /dev/null @@ -1,92 +0,0 @@ -package gregtech.api.gui.widgets; - -import java.util.List; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; - -import org.apache.commons.lang3.NotImplementedException; -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.drawable.Text; -import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.metatileentity.IItemLockable; - -/** - * Creates a phantom item in a GUI. Useful for filtering. - */ -public class GT_PhantomItemButton extends SlotWidget { - - public static final IDrawable[] FILTER_BACKGROUND = { ModularUITextures.ITEM_SLOT, - GT_UITextures.OVERLAY_SLOT_FILTER }; - - public GT_PhantomItemButton(final IItemLockable delegate) { - super(BaseSlot.phantom(new PhantomItemDelegate(delegate), 0)); - controlsAmount = false; - } - - @Override - public List getTooltip() { - return ImmutableList.of(new Text(StatCollector.translateToLocal("GT5U.bus.filterTooltip.empty"))); - } - - @Override - public List getExtraTooltip() { - return ImmutableList.of(StatCollector.translateToLocal("GT5U.bus.filterTooltip.full")); - } - - @Override - public boolean onMouseScroll(int direction) { - return false; - } - - @SuppressWarnings("ClassCanBeRecord") - private static class PhantomItemDelegate implements IItemHandlerModifiable { - - private final IItemLockable delegate; - - public PhantomItemDelegate(final IItemLockable delegate) { - this.delegate = delegate; - } - - @Override - public void setStackInSlot(int slot, ItemStack itemStack) { - delegate.setLockedItem(itemStack); - } - - @Override - public int getSlots() { - return 1; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return delegate.getLockedItem(); - } - - @Nullable - @Override - public ItemStack insertItem(int slot, ItemStack itemStack, boolean simulate) { - delegate.setLockedItem(itemStack); - return null; - } - - @Nullable - @Override - public ItemStack extractItem(int var1, int var2, boolean var3) { - throw new NotImplementedException("Extract item is disabled for GhostItemButtons."); - } - - @Override - public int getSlotLimit(int slot) { - return 1; - } - } -} diff --git a/src/main/java/gregtech/api/gui/widgets/LockedWhileActiveButton.java b/src/main/java/gregtech/api/gui/widgets/LockedWhileActiveButton.java new file mode 100644 index 0000000000..0e793372c5 --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/LockedWhileActiveButton.java @@ -0,0 +1,90 @@ +package gregtech.api.gui.widgets; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.tileentity.IMachineProgress; + +public class LockedWhileActiveButton extends ButtonWidget { + + @NotNull + private final IMachineProgress machine; + + public LockedWhileActiveButton(@NotNull IMachineProgress machine, @NotNull ModularWindow.Builder builder) { + super(); + this.machine = machine; + + super.attachSyncer( + new FakeSyncWidget.BooleanSyncer(machine::isActive, a -> {}), + builder, + (widget, aBoolean) -> widget.notifyTooltipChange()); + + super.dynamicTooltip(this::generateTooltip); + } + + @NotNull + @Override + public ButtonWidget setOnClick(@NotNull BiConsumer clickAction) { + return super.setOnClick((clickData, widget) -> { + if (!machine.isActive()) { + clickAction.accept(clickData, widget); + } + }); + } + + @NotNull + @Override + public Widget setBackground(@NotNull IDrawable... drawables) { + return super.setBackground(() -> appendLockedOverlay(drawables)); + } + + @NotNull + @Override + public Widget setBackground(@NotNull Supplier drawablesSupplier) { + return super.setBackground(() -> appendLockedOverlay(drawablesSupplier.get())); + } + + @NotNull + @Override + public Widget dynamicTooltip(@NotNull Supplier> dynamicTooltip) { + return super.dynamicTooltip(() -> { + ImmutableList.Builder tooltips = ImmutableList.builder() + .addAll(dynamicTooltip.get()); + tooltips.addAll(generateTooltip()); + + return tooltips.build(); + }); + } + + @NotNull + private IDrawable[] appendLockedOverlay(@NotNull IDrawable[] drawables) { + if (machine.isActive()) { + final IDrawable[] copy = Arrays.copyOf(drawables, drawables.length + 1); + copy[drawables.length] = GTUITextures.OVERLAY_BUTTON_LOCKED; + return copy; + } + return drawables; + } + + @NotNull + private List generateTooltip() { + if (machine.isActive()) { + return ImmutableList.of(StatCollector.translateToLocal("GT5U.gui.button.forbidden_while_running")); + } + return ImmutableList.of(); + } +} diff --git a/src/main/java/gregtech/api/gui/widgets/PhantomItemButton.java b/src/main/java/gregtech/api/gui/widgets/PhantomItemButton.java new file mode 100644 index 0000000000..e13266b33f --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/PhantomItemButton.java @@ -0,0 +1,92 @@ +package gregtech.api.gui.widgets; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +import org.apache.commons.lang3.NotImplementedException; +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.metatileentity.IItemLockable; + +/** + * Creates a phantom item in a GUI. Useful for filtering. + */ +public class PhantomItemButton extends SlotWidget { + + public static final IDrawable[] FILTER_BACKGROUND = { ModularUITextures.ITEM_SLOT, + GTUITextures.OVERLAY_SLOT_FILTER }; + + public PhantomItemButton(final IItemLockable delegate) { + super(BaseSlot.phantom(new PhantomItemDelegate(delegate), 0)); + controlsAmount = false; + } + + @Override + public List getTooltip() { + return ImmutableList.of(new Text(StatCollector.translateToLocal("GT5U.bus.filterTooltip.empty"))); + } + + @Override + public List getExtraTooltip() { + return ImmutableList.of(StatCollector.translateToLocal("GT5U.bus.filterTooltip.full")); + } + + @Override + public boolean onMouseScroll(int direction) { + return false; + } + + @SuppressWarnings("ClassCanBeRecord") + private static class PhantomItemDelegate implements IItemHandlerModifiable { + + private final IItemLockable delegate; + + public PhantomItemDelegate(final IItemLockable delegate) { + this.delegate = delegate; + } + + @Override + public void setStackInSlot(int slot, ItemStack itemStack) { + delegate.setLockedItem(itemStack); + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return delegate.getLockedItem(); + } + + @Nullable + @Override + public ItemStack insertItem(int slot, ItemStack itemStack, boolean simulate) { + delegate.setLockedItem(itemStack); + return null; + } + + @Nullable + @Override + public ItemStack extractItem(int var1, int var2, boolean var3) { + throw new NotImplementedException("Extract item is disabled for GhostItemButtons."); + } + + @Override + public int getSlotLimit(int slot) { + return 1; + } + } +} diff --git a/src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java b/src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java index b0d42f9aec..b26c7035c7 100644 --- a/src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java +++ b/src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java @@ -4,9 +4,11 @@ import javax.annotation.Nullable; import net.minecraft.tileentity.TileEntity; +import gregtech.common.Pollution; + /** * Implement this interface for TileEntities that can have association to cleanroom. - * Calling {@link gregtech.common.GT_Pollution#addPollution(TileEntity, int)} from this machine + * Calling {@link Pollution#addPollution(TileEntity, int)} from this machine * will pollute associated cleanroom. */ public interface ICleanroomReceiver { diff --git a/src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java b/src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java index 8dde8163c8..5f225b0b4f 100644 --- a/src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java +++ b/src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java @@ -4,7 +4,7 @@ import java.util.List; import net.minecraft.item.ItemStack; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; /** * Implement this interface if your tileentity (or metatileentity) supports configuration circuits to resolve recipe @@ -24,7 +24,7 @@ public interface IConfigurationCircuitSupport { * This list is unmodifiable. Its elements are not supposed to be modified in any way! */ default List getConfigurationCircuits() { - return GregTech_API.getConfigurationCircuitList(100); + return GregTechAPI.getConfigurationCircuitList(100); } /** diff --git a/src/main/java/gregtech/api/interfaces/IFoodStat.java b/src/main/java/gregtech/api/interfaces/IFoodStat.java index c768c5ca1c..4b1bd121e9 100644 --- a/src/main/java/gregtech/api/interfaces/IFoodStat.java +++ b/src/main/java/gregtech/api/interfaces/IFoodStat.java @@ -4,34 +4,34 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; -import gregtech.api.items.GT_MetaBase_Item; +import gregtech.api.items.MetaBaseItem; public interface IFoodStat { /** * Warning the "aPlayer" Parameter may be null! */ - int getFoodLevel(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer); + int getFoodLevel(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer); /** * Warning the "aPlayer" Parameter may be null! */ - float getSaturation(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer); + float getSaturation(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer); /** * Warning the "aPlayer" Parameter may be null! */ - boolean alwaysEdible(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer); + boolean alwaysEdible(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer); /** * Warning the "aPlayer" Parameter may be null! */ - boolean isRotten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer); + boolean isRotten(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer); /** * Warning the "aPlayer" Parameter may be null! */ - EnumAction getFoodAction(GT_MetaBase_Item aItem, ItemStack aStack); + EnumAction getFoodAction(MetaBaseItem aItem, ItemStack aStack); - void onEaten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer); + void onEaten(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer); } diff --git a/src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java b/src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java index 4bf0311544..1dc460f3de 100644 --- a/src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java +++ b/src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java @@ -6,22 +6,24 @@ import net.minecraft.util.IIcon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import gregtech.common.render.items.GT_GeneratedMaterial_Renderer; +import gregtech.common.render.items.GeneratedItemRenderer; +import gregtech.common.render.items.GeneratedMaterialRenderer; +import gregtech.common.render.items.MetaGeneratedItemRenderer; public interface IGT_ItemWithMaterialRenderer { /** - * @return If allow using {@link gregtech.common.render.items.GT_MetaGenerated_Item_Renderer} to render item + * @return If allow using {@link MetaGeneratedItemRenderer} to render item */ boolean shouldUseCustomRenderer(int aMetaData); /** * @return Custom renderer of the Material with offset < 32000 */ - GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData); + GeneratedMaterialRenderer getMaterialRenderer(int aMetaData); /** - * If this returns false, renderer falls back to {@link gregtech.common.render.items.GT_GeneratedItem_Renderer} + * If this returns false, renderer falls back to {@link GeneratedItemRenderer} */ boolean allowMaterialRenderer(int aMetaData); diff --git a/src/main/java/gregtech/api/interfaces/IHatchElement.java b/src/main/java/gregtech/api/interfaces/IHatchElement.java index 482b7899ab..9618c1ee1b 100644 --- a/src/main/java/gregtech/api/interfaces/IHatchElement.java +++ b/src/main/java/gregtech/api/interfaces/IHatchElement.java @@ -11,18 +11,17 @@ import net.minecraftforge.common.util.ForgeDirection; import com.google.common.collect.ImmutableList; import com.gtnewhorizon.structurelib.structure.IStructureElement; -import com.gtnewhorizon.structurelib.structure.StructureUtility; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.IGT_HatchAdder; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.IGTHatchAdder; public interface IHatchElement { List> mteClasses(); - IGT_HatchAdder adder(); + IGTHatchAdder adder(); String name(); @@ -44,7 +43,7 @@ public interface IHatchElement { return new HatchElement<>(aClasses, null, null, null, this); } - default IHatchElement withAdder(IGT_HatchAdder aAdder) { + default IHatchElement withAdder(IGTHatchAdder aAdder) { if (aAdder == null) throw new IllegalArgumentException(); return new HatchElement<>(null, aAdder, null, null, this); } @@ -61,7 +60,7 @@ public interface IHatchElement { default IStructureElement newAny(int aCasingIndex, int aDot) { if (aCasingIndex < 0 || aDot < 0) throw new IllegalArgumentException(); - return GT_StructureUtility.buildHatchAdder() + return GTStructureUtility.buildHatchAdder() .anyOf(this) .casingIndex(aCasingIndex) .dot(aDot) @@ -73,17 +72,17 @@ public interface IHatchElement { default IStructureElement newAnyOrCasing(int aCasingIndex, int aDot, Block casingBlock, int casingMeta) { if (aCasingIndex < 0 || aDot < 0) throw new IllegalArgumentException(); - return GT_StructureUtility.buildHatchAdder() + return GTStructureUtility.buildHatchAdder() .anyOf(this) .casingIndex(aCasingIndex) .dot(aDot) .continueIfSuccess() - .buildAndChain(StructureUtility.ofBlock(casingBlock, casingMeta)); + .buildAndChain(com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock(casingBlock, casingMeta)); } default IStructureElement newAny(int aCasingIndex, int aDot, ForgeDirection... allowedFacings) { if (aCasingIndex < 0 || aDot < 0) throw new IllegalArgumentException(); - return GT_StructureUtility.buildHatchAdder() + return GTStructureUtility.buildHatchAdder() .anyOf(this) .casingIndex(aCasingIndex) .dot(aDot) @@ -96,7 +95,7 @@ public interface IHatchElement { default IStructureElement newAny(int aCasingIndex, int aDot, BiPredicate aShouldSkip) { if (aCasingIndex < 0 || aDot < 0 || aShouldSkip == null) throw new IllegalArgumentException(); - return GT_StructureUtility.buildHatchAdder() + return GTStructureUtility.buildHatchAdder() .anyOf(this) .casingIndex(aCasingIndex) .dot(aDot) @@ -131,7 +130,7 @@ class HatchElementEither implements IHatchElement { } @Override - public IGT_HatchAdder adder() { + public IGTHatchAdder adder() { return ((t, te, i) -> first.adder() .apply(t, te, i) || second.adder() @@ -153,12 +152,12 @@ class HatchElementEither implements IHatchElement { class HatchElement implements IHatchElement { private final List> mClasses; - private final IGT_HatchAdder mAdder; + private final IGTHatchAdder mAdder; private final String mName; private final IHatchElement mBacking; private final ToLongFunction mCount; - public HatchElement(List> aMteClasses, IGT_HatchAdder aAdder, + public HatchElement(List> aMteClasses, IGTHatchAdder aAdder, String aName, ToLongFunction aCount, IHatchElement aBacking) { this.mClasses = aMteClasses; this.mAdder = aAdder; @@ -173,7 +172,7 @@ class HatchElement implements IHatchElement { } @Override - public IGT_HatchAdder adder() { + public IGTHatchAdder adder() { return mAdder == null ? mBacking.adder() : mAdder; } @@ -194,7 +193,7 @@ class HatchElement implements IHatchElement { } @Override - public IHatchElement withAdder(IGT_HatchAdder aAdder) { + public IHatchElement withAdder(IGTHatchAdder aAdder) { if (aAdder == null) throw new IllegalArgumentException(); return new HatchElement<>(mClasses, aAdder, mName, mCount, mBacking); } diff --git a/src/main/java/gregtech/api/interfaces/IIconContainer.java b/src/main/java/gregtech/api/interfaces/IIconContainer.java index 525721bb5c..319615b58d 100644 --- a/src/main/java/gregtech/api/interfaces/IIconContainer.java +++ b/src/main/java/gregtech/api/interfaces/IIconContainer.java @@ -1,6 +1,6 @@ package gregtech.api.interfaces; -import static gregtech.api.enums.GT_Values.UNCOLORED_RGBA; +import static gregtech.api.enums.GTValues.UNCOLORED_RGBA; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/gregtech/api/interfaces/IItemBehaviour.java b/src/main/java/gregtech/api/interfaces/IItemBehaviour.java index 67bb505c6b..d9f8706824 100644 --- a/src/main/java/gregtech/api/interfaces/IItemBehaviour.java +++ b/src/main/java/gregtech/api/interfaces/IItemBehaviour.java @@ -13,7 +13,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import gregtech.api.enums.SubTag; -import gregtech.api.items.GT_MetaBase_Item; +import gregtech.api.items.MetaBaseItem; public interface IItemBehaviour { @@ -37,7 +37,7 @@ public interface IItemBehaviour { ItemStack onDispense(E aItem, IBlockSource aSource, ItemStack aStack); - boolean hasProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack); + boolean hasProjectile(MetaBaseItem aItem, SubTag aProjectileType, ItemStack aStack); EntityArrow getProjectile(E aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, double aZ); diff --git a/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java b/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java index 1dd36d9998..4af8ec232c 100644 --- a/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java +++ b/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java @@ -4,8 +4,10 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import gregtech.api.net.GTPacketUpdateItem; + /** - * Together with {@link gregtech.api.net.GT_Packet_UpdateItem} you can request server side to update item in hand with a + * Together with {@link GTPacketUpdateItem} you can request server side to update item in hand with a * NBT tag. *

* Usual NBT tag size limit applies. diff --git a/src/main/java/gregtech/api/interfaces/IRecipeMap.java b/src/main/java/gregtech/api/interfaces/IRecipeMap.java index ce48b29927..c6184bee34 100644 --- a/src/main/java/gregtech/api/interfaces/IRecipeMap.java +++ b/src/main/java/gregtech/api/interfaces/IRecipeMap.java @@ -7,9 +7,9 @@ import java.util.function.Function; import javax.annotation.Nonnull; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTUtility; /** * Represents the target of a recipe adding action, usually, but not necessarily, is a recipe map itself. @@ -33,7 +33,7 @@ public interface IRecipeMap { * Actually add the recipe represented by the builder. CAN modify the builder's internal states!!! */ @Nonnull - Collection doAdd(GT_RecipeBuilder builder); + Collection doAdd(GTRecipeBuilder builder); /** * Return a variant of this recipe map that will perform a deep copy on input recipe builder before doing anything @@ -45,7 +45,7 @@ public interface IRecipeMap { return newRecipeMap(b -> doAdd(b.copy())); } - static IRecipeMap newRecipeMap(Function> func) { + static IRecipeMap newRecipeMap(Function> func) { return new IRecipeMap() { private final Collection downstreams = new ArrayList<>(); @@ -57,9 +57,9 @@ public interface IRecipeMap { @Nonnull @Override - public Collection doAdd(GT_RecipeBuilder builder) { - List> ret = new ArrayList<>(); - Collection out = func.apply(builder); + public Collection doAdd(GTRecipeBuilder builder) { + List> ret = new ArrayList<>(); + Collection out = func.apply(builder); ret.add(out); builder.clearInvalid(); if (!out.isEmpty()) { @@ -67,7 +67,7 @@ public interface IRecipeMap { ret.add(downstream.doAdd(builder)); } } - return GT_Utility.concat(ret); + return GTUtility.concat(ret); } }; } diff --git a/src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java b/src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java index 0eea6ca3a4..a0a362c4e5 100644 --- a/src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java +++ b/src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java @@ -5,7 +5,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; +import gregtech.api.util.CoverBehavior; /** * Implemented by the MetaTileEntity of the Redstone Circuit Block @@ -36,7 +36,7 @@ public interface IRedstoneCircuitBlock { /** * If this Side is Covered up and therefor not doing any Redstone */ - GT_CoverBehavior getCover(ForgeDirection side); + CoverBehavior getCover(ForgeDirection side); int getCoverID(ForgeDirection side); diff --git a/src/main/java/gregtech/api/interfaces/IToolStats.java b/src/main/java/gregtech/api/interfaces/IToolStats.java index 9d8da63b6c..6f506a6ee1 100644 --- a/src/main/java/gregtech/api/interfaces/IToolStats.java +++ b/src/main/java/gregtech/api/interfaces/IToolStats.java @@ -16,7 +16,7 @@ import net.minecraft.util.DamageSource; import net.minecraft.world.World; import net.minecraftforge.event.world.BlockEvent; -import gregtech.api.items.GT_MetaGenerated_Tool; +import gregtech.api.items.MetaGeneratedTool; /** * The Stats for GT Tools. Not including any Material Modifiers. @@ -33,7 +33,7 @@ public interface IToolStats { /** * Called when this gets added to a Tool Item */ - void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID); + void onStatsAddedToTool(MetaGeneratedTool aItem, int aID); /** * @implNote if you are only modifying drops, override diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGTFluid.java b/src/main/java/gregtech/api/interfaces/fluid/IGTFluid.java new file mode 100644 index 0000000000..b3765d37db --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/fluid/IGTFluid.java @@ -0,0 +1,14 @@ +package gregtech.api.interfaces.fluid; + +import net.minecraftforge.fluids.FluidRegistry; + +@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope +public interface IGTFluid { + + /** + * Adds this {@link IGTFluid} to the {@link FluidRegistry} and internally-implemented registrations + * + * @return {@link IGTRegisteredFluid} The GregTech registered fluid + */ + IGTRegisteredFluid addFluid(); +} diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGTFluidBuilder.java b/src/main/java/gregtech/api/interfaces/fluid/IGTFluidBuilder.java new file mode 100644 index 0000000000..2902824873 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/fluid/IGTFluidBuilder.java @@ -0,0 +1,96 @@ +package gregtech.api.interfaces.fluid; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; + +import gregtech.api.enums.FluidState; + +@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope +public interface IGTFluidBuilder { + + /** + * @param colorRGBA The {@code short[]} RGBA color of the {@link Fluid} or {@code null} for no defined RGBA color + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withColorRGBA(final short[] colorRGBA); + + /** + * @param localizedName The localized name of this {@link IGTFluidBuilder} + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withLocalizedName(final String localizedName); + + /** + * @param fluidState The {@link FluidState} of this {@link IGTFluidBuilder} + * @param temperature The Kelvin temperature of this {@link IGTFluidBuilder} + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withStateAndTemperature(final FluidState fluidState, final int temperature); + + /** + * @param stillIconResourceLocation the {@link ResourceLocation} of the still fluid icon + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withStillIconResourceLocation(final ResourceLocation stillIconResourceLocation); + + /** + * @param flowingIconResourceLocation the {@link ResourceLocation} of the flowing fluid icon + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withFlowingIconResourceLocation(final ResourceLocation flowingIconResourceLocation); + + /** + * @param textureName The name of the GregTech mod texture of this {@link IGTFluidBuilder} + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withTextureName(final String textureName); + + /** + * @param fluidBlock the {@link Block} implementation of the {@link IGTFluid} + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withFluidBlock(final Block fluidBlock); + + /** + * @param fromFluid the {@link Fluid} to copy the icons from + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withIconsFrom(@Nonnull final Fluid fromFluid); + + /** + * @param stillIconResourceLocation The {@link ResourceLocation} of the still fluid texture + * @param flowingIconResourceLocation The {@link ResourceLocation} of the flowing fluid texture + * @return {@link IGTFluidBuilder} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTFluidBuilder withTextures(final ResourceLocation stillIconResourceLocation, + final ResourceLocation flowingIconResourceLocation); + + /** + * Builds the {@link IGTFluid} + * + * @return the built {@link IGTFluid} + */ + IGTFluid build(); + + /** + * Builds, then adds the {@link IGTFluid} to the {@link FluidRegistry} + * + * @return the {@link IGTFluid} + * @see #build() + * @see IGTFluid#addFluid() + */ + IGTRegisteredFluid buildAndRegister(); +} diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGTRegisteredFluid.java b/src/main/java/gregtech/api/interfaces/fluid/IGTRegisteredFluid.java new file mode 100644 index 0000000000..b2796ed3f7 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/fluid/IGTRegisteredFluid.java @@ -0,0 +1,60 @@ +package gregtech.api.interfaces.fluid; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; + +import gregtech.api.enums.FluidState; +import gregtech.api.enums.Materials; + +public interface IGTRegisteredFluid { + + /** + * Registers the containers in the {@link FluidContainerRegistry} for this {@link IGTRegisteredFluid} + * + * @param fullContainer The full fluid container + * @param emptyContainer The empty fluid container + * @param containerSize The size of the container + * @return The {@link IGTRegisteredFluid} for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTRegisteredFluid registerContainers(final ItemStack fullContainer, final ItemStack emptyContainer, + final int containerSize); + + /** + * Registers the bucket-sized 1000L containers in the {@link FluidContainerRegistry} for this + * {@link IGTRegisteredFluid} + * + * @param fullContainer The full container to associate with this {@link IGTRegisteredFluid} + * @param emptyContainer The empty container associate with this {@link IGTRegisteredFluid} + * @return {@link IGTRegisteredFluid} for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTRegisteredFluid registerBContainers(final ItemStack fullContainer, final ItemStack emptyContainer); + + /** + * Registers the potion-sized 250L containers in the {@link FluidContainerRegistry} for this + * {@link IGTRegisteredFluid} + * + * @param fullContainer The full container to associate with this {@link IGTRegisteredFluid} + * @param emptyContainer The empty container associate with this {@link IGTRegisteredFluid} + * @return {@link IGTRegisteredFluid} self for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTRegisteredFluid registerPContainers(final ItemStack fullContainer, final ItemStack emptyContainer); + + /** + * Updates the {@link Materials}'s fluids from this {@link IGTRegisteredFluid}'s state + * + * @param material the {@link Materials} to configure based on this {@link IGTRegisteredFluid} and + * {@link FluidState} + * @return The {@link IGTRegisteredFluid} for call chaining + */ + @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value + IGTRegisteredFluid configureMaterials(final Materials material); + + /** + * @return this {@link IGTRegisteredFluid} cast to {@link Fluid} + */ + Fluid asFluid(); +} diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java b/src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java deleted file mode 100644 index 7c8b2b3f11..0000000000 --- a/src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.api.interfaces.fluid; - -import net.minecraftforge.fluids.FluidRegistry; - -@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope -public interface IGT_Fluid { - - /** - * Adds this {@link IGT_Fluid} to the {@link FluidRegistry} and internally-implemented registrations - * - * @return {@link IGT_RegisteredFluid} The GregTech registered fluid - */ - IGT_RegisteredFluid addFluid(); -} diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java b/src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java deleted file mode 100644 index f15b148fcb..0000000000 --- a/src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java +++ /dev/null @@ -1,96 +0,0 @@ -package gregtech.api.interfaces.fluid; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; - -import gregtech.api.enums.FluidState; - -@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope -public interface IGT_FluidBuilder { - - /** - * @param colorRGBA The {@code short[]} RGBA color of the {@link Fluid} or {@code null} for no defined RGBA color - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withColorRGBA(final short[] colorRGBA); - - /** - * @param localizedName The localized name of this {@link IGT_FluidBuilder} - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withLocalizedName(final String localizedName); - - /** - * @param fluidState The {@link FluidState} of this {@link IGT_FluidBuilder} - * @param temperature The Kelvin temperature of this {@link IGT_FluidBuilder} - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withStateAndTemperature(final FluidState fluidState, final int temperature); - - /** - * @param stillIconResourceLocation the {@link ResourceLocation} of the still fluid icon - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withStillIconResourceLocation(final ResourceLocation stillIconResourceLocation); - - /** - * @param flowingIconResourceLocation the {@link ResourceLocation} of the flowing fluid icon - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withFlowingIconResourceLocation(final ResourceLocation flowingIconResourceLocation); - - /** - * @param textureName The name of the GregTech mod texture of this {@link IGT_FluidBuilder} - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withTextureName(final String textureName); - - /** - * @param fluidBlock the {@link Block} implementation of the {@link IGT_Fluid} - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withFluidBlock(final Block fluidBlock); - - /** - * @param fromFluid the {@link Fluid} to copy the icons from - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withIconsFrom(@Nonnull final Fluid fromFluid); - - /** - * @param stillIconResourceLocation The {@link ResourceLocation} of the still fluid texture - * @param flowingIconResourceLocation The {@link ResourceLocation} of the flowing fluid texture - * @return {@link IGT_FluidBuilder} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_FluidBuilder withTextures(final ResourceLocation stillIconResourceLocation, - final ResourceLocation flowingIconResourceLocation); - - /** - * Builds the {@link IGT_Fluid} - * - * @return the built {@link IGT_Fluid} - */ - IGT_Fluid build(); - - /** - * Builds, then adds the {@link IGT_Fluid} to the {@link FluidRegistry} - * - * @return the {@link IGT_Fluid} - * @see #build() - * @see IGT_Fluid#addFluid() - */ - IGT_RegisteredFluid buildAndRegister(); -} diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java b/src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java deleted file mode 100644 index 181824874c..0000000000 --- a/src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.api.interfaces.fluid; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidContainerRegistry; - -import gregtech.api.enums.FluidState; -import gregtech.api.enums.Materials; - -public interface IGT_RegisteredFluid { - - /** - * Registers the containers in the {@link FluidContainerRegistry} for this {@link IGT_RegisteredFluid} - * - * @param fullContainer The full fluid container - * @param emptyContainer The empty fluid container - * @param containerSize The size of the container - * @return The {@link IGT_RegisteredFluid} for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_RegisteredFluid registerContainers(final ItemStack fullContainer, final ItemStack emptyContainer, - final int containerSize); - - /** - * Registers the bucket-sized 1000L containers in the {@link FluidContainerRegistry} for this - * {@link IGT_RegisteredFluid} - * - * @param fullContainer The full container to associate with this {@link IGT_RegisteredFluid} - * @param emptyContainer The empty container associate with this {@link IGT_RegisteredFluid} - * @return {@link IGT_RegisteredFluid} for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_RegisteredFluid registerBContainers(final ItemStack fullContainer, final ItemStack emptyContainer); - - /** - * Registers the potion-sized 250L containers in the {@link FluidContainerRegistry} for this - * {@link IGT_RegisteredFluid} - * - * @param fullContainer The full container to associate with this {@link IGT_RegisteredFluid} - * @param emptyContainer The empty container associate with this {@link IGT_RegisteredFluid} - * @return {@link IGT_RegisteredFluid} self for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_RegisteredFluid registerPContainers(final ItemStack fullContainer, final ItemStack emptyContainer); - - /** - * Updates the {@link Materials}'s fluids from this {@link IGT_RegisteredFluid}'s state - * - * @param material the {@link Materials} to configure based on this {@link IGT_RegisteredFluid} and - * {@link FluidState} - * @return The {@link IGT_RegisteredFluid} for call chaining - */ - @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value - IGT_RegisteredFluid configureMaterials(final Materials material); - - /** - * @return this {@link IGT_RegisteredFluid} cast to {@link Fluid} - */ - Fluid asFluid(); -} diff --git a/src/main/java/gregtech/api/interfaces/internal/IGTCraftingRecipe.java b/src/main/java/gregtech/api/interfaces/internal/IGTCraftingRecipe.java new file mode 100644 index 0000000000..beacd71f95 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/internal/IGTCraftingRecipe.java @@ -0,0 +1,8 @@ +package gregtech.api.interfaces.internal; + +import net.minecraft.item.crafting.IRecipe; + +public interface IGTCraftingRecipe extends IRecipe { + + boolean isRemovable(); +} diff --git a/src/main/java/gregtech/api/interfaces/internal/IGTMod.java b/src/main/java/gregtech/api/interfaces/internal/IGTMod.java new file mode 100644 index 0000000000..f47a7ef645 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/internal/IGTMod.java @@ -0,0 +1,50 @@ +package gregtech.api.interfaces.internal; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Interface used by the Mods Main Class to reference to internals. + *

+ * Don't even think about including this File in your Mod. + */ +public interface IGTMod { + + /** + * This means that Server specific Basefiles are definitely existing! Not if the World is actually server side or + * not! + */ + boolean isServerSide(); + + /** + * This means that Client specific Basefiles are definitely existing! Not if the World is actually client side or + * not! + */ + boolean isClientSide(); + + /** + * This means that Bukkit specific Basefiles are definitely existing! Not if the World is actually bukkit server or + * not! + */ + boolean isBukkitSide(); + + /** + * works only ClientSide otherwise returns null + */ + EntityPlayer getThePlayer(); + + // ---------- Internal Usage Only ---------- + + /** + * works only ClientSide otherwise returns 0 + * + * @return the Index of the added Armor + */ + int addArmor(String aArmorPrefix); + + /** + * Plays the Sonictron Sound for the ItemStack on the Client Side + */ + void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ); +} diff --git a/src/main/java/gregtech/api/interfaces/internal/IGTRecipeAdder.java b/src/main/java/gregtech/api/interfaces/internal/IGTRecipeAdder.java new file mode 100644 index 0000000000..a4d554428e --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/internal/IGTRecipeAdder.java @@ -0,0 +1,8 @@ +package gregtech.api.interfaces.internal; + +import gregtech.api.util.GTRecipeBuilder; + +public interface IGTRecipeAdder { + + GTRecipeBuilder stdBuilder(); +} diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java b/src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java deleted file mode 100644 index 3f29736470..0000000000 --- a/src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java +++ /dev/null @@ -1,8 +0,0 @@ -package gregtech.api.interfaces.internal; - -import net.minecraft.item.crafting.IRecipe; - -public interface IGT_CraftingRecipe extends IRecipe { - - boolean isRemovable(); -} diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java b/src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java deleted file mode 100644 index dbf888ef96..0000000000 --- a/src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java +++ /dev/null @@ -1,50 +0,0 @@ -package gregtech.api.interfaces.internal; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -/** - * Interface used by the Mods Main Class to reference to internals. - *

- * Don't even think about including this File in your Mod. - */ -public interface IGT_Mod { - - /** - * This means that Server specific Basefiles are definitely existing! Not if the World is actually server side or - * not! - */ - boolean isServerSide(); - - /** - * This means that Client specific Basefiles are definitely existing! Not if the World is actually client side or - * not! - */ - boolean isClientSide(); - - /** - * This means that Bukkit specific Basefiles are definitely existing! Not if the World is actually bukkit server or - * not! - */ - boolean isBukkitSide(); - - /** - * works only ClientSide otherwise returns null - */ - EntityPlayer getThePlayer(); - - // ---------- Internal Usage Only ---------- - - /** - * works only ClientSide otherwise returns 0 - * - * @return the Index of the added Armor - */ - int addArmor(String aArmorPrefix); - - /** - * Plays the Sonictron Sound for the ItemStack on the Client Side - */ - void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ); -} diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java b/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java deleted file mode 100644 index e3c3a8cbaa..0000000000 --- a/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java +++ /dev/null @@ -1,8 +0,0 @@ -package gregtech.api.interfaces.internal; - -import gregtech.api.util.GT_RecipeBuilder; - -public interface IGT_RecipeAdder { - - GT_RecipeBuilder stdBuilder(); -} diff --git a/src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java b/src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java index 5d99f83689..2cb2e6fd84 100644 --- a/src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java +++ b/src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java @@ -6,8 +6,8 @@ import net.minecraft.block.Block; import net.minecraft.enchantment.Enchantment; import net.minecraft.item.ItemStack; -import gregtech.api.enums.TC_Aspects; -import gregtech.api.enums.TC_Aspects.TC_AspectStack; +import gregtech.api.enums.TCAspects; +import gregtech.api.enums.TCAspects.TC_AspectStack; public interface IThaumcraftCompat { @@ -35,10 +35,10 @@ public interface IThaumcraftCompat { Object addCrucibleRecipe(String aResearch, Object aInput, ItemStack aOutput, List aAspects); Object addInfusionRecipe(String aResearch, ItemStack aMainInput, ItemStack[] aSideInputs, ItemStack aOutput, - int aInstability, List aAspects); + int aInstability, List aAspects); Object addInfusionEnchantmentRecipe(String aResearch, Enchantment aEnchantment, int aInstability, - List aAspects, ItemStack[] aSideInputs); + List aAspects, ItemStack[] aSideInputs); Object addResearch(String aResearch, String aName, String aText, String[] aParentResearches, String aCategory, ItemStack aIcon, int aComplexity, int aType, int aX, int aY, List aAspects, diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java index 4959f8b060..824925f928 100644 --- a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java +++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java @@ -34,8 +34,8 @@ import gregtech.api.interfaces.tileentity.IGearEnergyTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IGregtechWailaProvider; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_Util; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.GTUtil; /** * Warning, this Interface has just been made to be able to add multiple kinds of MetaTileEntities (Cables, Pipes, @@ -127,7 +127,7 @@ public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHand * If a Cover of that Type can be placed on this Side. Also Called when the Facing of the Block Changes and a Cover * is on said Side. */ - boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack); + boolean allowCoverOnSide(ForgeDirection side, GTItemStack aStack); /** * When a Player right-clicks the Facing with a Screwdriver. @@ -400,7 +400,7 @@ public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHand if (getBaseMetaTileEntity() != null) { return getBaseMetaTileEntity().getGUIColorization(); } else { - return GT_Util.getRGBInt(Dyes.MACHINE_METAL.getRGBA()); + return GTUtil.getRGBInt(Dyes.MACHINE_METAL.getRGBA()); } } diff --git a/src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java b/src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java deleted file mode 100644 index 8574de7007..0000000000 --- a/src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java +++ /dev/null @@ -1,393 +0,0 @@ -package gregtech.api.interfaces.modularui; - -import static gregtech.api.metatileentity.BaseTileEntity.BUTTON_FORBIDDEN_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -import net.minecraft.util.StatCollector; - -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; - -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.VoidingMode; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.tileentity.IRecipeLockable; -import gregtech.api.interfaces.tileentity.IVoidable; - -/** - * Machines implementing this interface can have logic and GUI buttons - * to configure various behaviors regarding multiblock. - *

    - *
  • Power switch
  • - *
  • Void protection
  • - *
  • Separated input buses
  • - *
  • Batch mode
  • - *
  • Recipe locking
  • - *
  • Multiple machine modes
  • - *
- */ -public interface ControllerWithOptionalFeatures extends IVoidable, IRecipeLockable { - - boolean isAllowedToWork(); - - void disableWorking(); - - void enableWorking(); - - Pos2d getPowerSwitchButtonPos(); - - default ButtonWidget createPowerSwitchButton(IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (isAllowedToWork()) { - disableWorking(); - } else { - enableWorking(); - } - }) - .setPlayClickSoundResource( - () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation - : SoundResource.GUI_BUTTON_DOWN.resourceLocation) - .setBackground(() -> { - if (isAllowedToWork()) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON }; - } else { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF }; - } - }) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, val -> { - if (val) enableWorking(); - else disableWorking(); - }), builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.power_switch")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(getPowerSwitchButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } - - Pos2d getVoidingModeButtonPos(); - - default ButtonWidget createVoidExcessButton(IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (supportsVoidProtection()) { - Set allowed = getAllowedVoidingModes(); - switch (clickData.mouseButton) { - case 0 -> setVoidingMode(getVoidingMode().nextInCollection(allowed)); - case 1 -> setVoidingMode(getVoidingMode().previousInCollection(allowed)); - } - widget.notifyTooltipChange(); - } - }) - .setPlayClickSound(supportsVoidProtection()) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(getVoidingMode().buttonTexture); - ret.add(getVoidingMode().buttonOverlay); - if (!supportsVoidProtection()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer( - () -> getVoidingMode().ordinal(), - val -> setVoidingMode(VoidingMode.fromOrdinal(val))), - builder) - .dynamicTooltip( - () -> Arrays.asList( - StatCollector.translateToLocal("GT5U.gui.button.voiding_mode"), - StatCollector.translateToLocal(getVoidingMode().getTransKey()))) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(getVoidingModeButtonPos()) - .setSize(16, 16); - if (!supportsVoidProtection()) { - button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); - } - return (ButtonWidget) button; - } - - /** - * @return if the multi has more than 1 mode - */ - default boolean supportsMachineModeSwitch() { - return false; - } - - /** - * @return the current mode number. This is a getter is used for displaying the icon in the GUI - */ - default int getMachineMode() { - return 0; - } - - /** - * @return name for the current machine mode on this machine. Defaults "Unknown Mode" - */ - default String getMachineModeName() { - return "Unknown Mode"; - } - - /** - * @param index Index of machineModeIcons to pull from - * @return UITexture associated with that machineMode - */ - default UITexture getMachineModeIcon(int index) { - return null; - } - - /** - * @param index Number to set machineMode to - */ - default void setMachineMode(int index) {} - - /** - * @return Returns the next machineMode number in the sequence - */ - default int nextMachineMode() { - return 0; - } - - /** - * @return Returns whether machine supports mode switch by default - */ - default boolean getDefaultModeSwitch() { - return supportsMachineModeSwitch(); - } - - Pos2d getMachineModeSwitchButtonPos(); - - /** - * Called when the mode switch button is clicked - */ - default void onMachineModeSwitchClick() {} - - default ButtonWidget createModeSwitchButton(IWidgetBuilder builder) { - if (!supportsMachineModeSwitch()) return null; - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (supportsMachineModeSwitch()) { - onMachineModeSwitchClick(); - setMachineMode(nextMachineMode()); - } - }) - .setPlayClickSound(supportsMachineModeSwitch()) - .setBackground(() -> { - List ret = new ArrayList<>(); - if (supportsMachineModeSwitch()) { - ret.add(GT_UITextures.BUTTON_STANDARD); - ret.add(getMachineModeIcon(getMachineMode())); - } else return null; - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getMachineMode, this::setMachineMode), builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.mode_switch")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(getMachineModeSwitchButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } - - /** - * @return if the multi supports input separation. - */ - boolean supportsInputSeparation(); - - /** - * @return true if input separation is enabled, else false. This is getter is used for displaying the icon in the - * GUI - */ - boolean isInputSeparationEnabled(); - - void setInputSeparation(boolean enabled); - - default boolean getDefaultInputSeparationMode() { - return supportsInputSeparation(); - } - - Pos2d getInputSeparationButtonPos(); - - default ButtonWidget createInputSeparationButton(IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (supportsInputSeparation()) { - setInputSeparation(!isInputSeparationEnabled()); - } - }) - .setPlayClickSound(supportsInputSeparation()) - .setBackground(() -> { - List ret = new ArrayList<>(); - if (isInputSeparationEnabled()) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); - if (supportsInputSeparation()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON); - } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED); - } - } else { - ret.add(GT_UITextures.BUTTON_STANDARD); - if (supportsInputSeparation()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF); - } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED); - } - } - if (!supportsInputSeparation()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer(this::isInputSeparationEnabled, this::setInputSeparation), - builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(getInputSeparationButtonPos()) - .setSize(16, 16); - if (!supportsInputSeparation()) { - button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); - } - return (ButtonWidget) button; - } - - /** - * @return if the multi supports batch mode. - */ - boolean supportsBatchMode(); - - /** - * @return true if batch mode is enabled, else false. This is getter is used for displaying the icon in the GUI - */ - boolean isBatchModeEnabled(); - - void setBatchMode(boolean enabled); - - default boolean getDefaultBatchMode() { - return false; - } - - Pos2d getBatchModeButtonPos(); - - default ButtonWidget createBatchModeButton(IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (supportsBatchMode()) { - setBatchMode(!isBatchModeEnabled()); - } - }) - .setPlayClickSound(supportsBatchMode()) - .setBackground(() -> { - List ret = new ArrayList<>(); - if (isBatchModeEnabled()) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); - if (supportsBatchMode()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON); - } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED); - } - } else { - ret.add(GT_UITextures.BUTTON_STANDARD); - if (supportsBatchMode()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF); - } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED); - } - } - if (!supportsBatchMode()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isBatchModeEnabled, this::setBatchMode), builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(getBatchModeButtonPos()) - .setSize(16, 16); - if (!supportsBatchMode()) { - button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); - } - return (ButtonWidget) button; - } - - Pos2d getRecipeLockingButtonPos(); - - default ButtonWidget createLockToSingleRecipeButton(IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (supportsSingleRecipeLocking()) { - setRecipeLocking(!isRecipeLockingEnabled()); - } - }) - .setPlayClickSound(supportsSingleRecipeLocking()) - .setBackground(() -> { - List ret = new ArrayList<>(); - if (isRecipeLockingEnabled()) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); - if (supportsSingleRecipeLocking()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED); - } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED); - } - } else { - ret.add(GT_UITextures.BUTTON_STANDARD); - if (supportsSingleRecipeLocking()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED); - } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED); - } - } - if (!supportsSingleRecipeLocking()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer(this::isRecipeLockingEnabled, this::setRecipeLocking), - builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(getRecipeLockingButtonPos()) - .setSize(16, 16); - if (!supportsSingleRecipeLocking()) { - button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); - } - return (ButtonWidget) button; - } - - Pos2d getStructureUpdateButtonPos(); - - int getStructureUpdateTime(); - - void setStructureUpdateTime(int time); - - default ButtonWidget createStructureUpdateButton(IWidgetBuilder builder) { - Widget button = new ButtonWidget() - .setOnClick((clickData, widget) -> { if (getStructureUpdateTime() <= -20) setStructureUpdateTime(1); }) - .setPlayClickSound(true) - .setBackground(() -> { - List ret = new ArrayList<>(); - if (getStructureUpdateTime() > -20) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); - } else { - ret.add(GT_UITextures.BUTTON_STANDARD); - } - ret.add(GT_UITextures.OVERLAY_BUTTON_STRUCTURE_UPDATE); - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer(this::getStructureUpdateTime, this::setStructureUpdateTime), - builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.structure_update")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(getStructureUpdateButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } -} diff --git a/src/main/java/gregtech/api/interfaces/modularui/IControllerWithOptionalFeatures.java b/src/main/java/gregtech/api/interfaces/modularui/IControllerWithOptionalFeatures.java new file mode 100644 index 0000000000..d203d9fc87 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/modularui/IControllerWithOptionalFeatures.java @@ -0,0 +1,393 @@ +package gregtech.api.interfaces.modularui; + +import static gregtech.api.metatileentity.BaseTileEntity.BUTTON_FORBIDDEN_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import net.minecraft.util.StatCollector; + +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.VoidingMode; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.tileentity.IRecipeLockable; +import gregtech.api.interfaces.tileentity.IVoidable; + +/** + * Machines implementing this interface can have logic and GUI buttons + * to configure various behaviors regarding multiblock. + *
    + *
  • Power switch
  • + *
  • Void protection
  • + *
  • Separated input buses
  • + *
  • Batch mode
  • + *
  • Recipe locking
  • + *
  • Multiple machine modes
  • + *
+ */ +public interface IControllerWithOptionalFeatures extends IVoidable, IRecipeLockable { + + boolean isAllowedToWork(); + + void disableWorking(); + + void enableWorking(); + + Pos2d getPowerSwitchButtonPos(); + + default ButtonWidget createPowerSwitchButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (isAllowedToWork()) { + disableWorking(); + } else { + enableWorking(); + } + }) + .setPlayClickSoundResource( + () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation + : SoundResource.GUI_BUTTON_DOWN.resourceLocation) + .setBackground(() -> { + if (isAllowedToWork()) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON }; + } else { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF }; + } + }) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, val -> { + if (val) enableWorking(); + else disableWorking(); + }), builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.power_switch")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(getPowerSwitchButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } + + Pos2d getVoidingModeButtonPos(); + + default ButtonWidget createVoidExcessButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (supportsVoidProtection()) { + Set allowed = getAllowedVoidingModes(); + switch (clickData.mouseButton) { + case 0 -> setVoidingMode(getVoidingMode().nextInCollection(allowed)); + case 1 -> setVoidingMode(getVoidingMode().previousInCollection(allowed)); + } + widget.notifyTooltipChange(); + } + }) + .setPlayClickSound(supportsVoidProtection()) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(getVoidingMode().buttonTexture); + ret.add(getVoidingMode().buttonOverlay); + if (!supportsVoidProtection()) { + ret.add(GTUITextures.OVERLAY_BUTTON_FORBIDDEN); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer( + () -> getVoidingMode().ordinal(), + val -> setVoidingMode(VoidingMode.fromOrdinal(val))), + builder) + .dynamicTooltip( + () -> Arrays.asList( + StatCollector.translateToLocal("GT5U.gui.button.voiding_mode"), + StatCollector.translateToLocal(getVoidingMode().getTransKey()))) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(getVoidingModeButtonPos()) + .setSize(16, 16); + if (!supportsVoidProtection()) { + button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); + } + return (ButtonWidget) button; + } + + /** + * @return if the multi has more than 1 mode + */ + default boolean supportsMachineModeSwitch() { + return false; + } + + /** + * @return the current mode number. This is a getter is used for displaying the icon in the GUI + */ + default int getMachineMode() { + return 0; + } + + /** + * @return name for the current machine mode on this machine. Defaults "Unknown Mode" + */ + default String getMachineModeName() { + return "Unknown Mode"; + } + + /** + * @param index Index of machineModeIcons to pull from + * @return UITexture associated with that machineMode + */ + default UITexture getMachineModeIcon(int index) { + return null; + } + + /** + * @param index Number to set machineMode to + */ + default void setMachineMode(int index) {} + + /** + * @return Returns the next machineMode number in the sequence + */ + default int nextMachineMode() { + return 0; + } + + /** + * @return Returns whether machine supports mode switch by default + */ + default boolean getDefaultModeSwitch() { + return supportsMachineModeSwitch(); + } + + Pos2d getMachineModeSwitchButtonPos(); + + /** + * Called when the mode switch button is clicked + */ + default void onMachineModeSwitchClick() {} + + default ButtonWidget createModeSwitchButton(IWidgetBuilder builder) { + if (!supportsMachineModeSwitch()) return null; + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (supportsMachineModeSwitch()) { + onMachineModeSwitchClick(); + setMachineMode(nextMachineMode()); + } + }) + .setPlayClickSound(supportsMachineModeSwitch()) + .setBackground(() -> { + List ret = new ArrayList<>(); + if (supportsMachineModeSwitch()) { + ret.add(GTUITextures.BUTTON_STANDARD); + ret.add(getMachineModeIcon(getMachineMode())); + } else return null; + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getMachineMode, this::setMachineMode), builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.mode_switch")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(getMachineModeSwitchButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } + + /** + * @return if the multi supports input separation. + */ + boolean supportsInputSeparation(); + + /** + * @return true if input separation is enabled, else false. This is getter is used for displaying the icon in the + * GUI + */ + boolean isInputSeparationEnabled(); + + void setInputSeparation(boolean enabled); + + default boolean getDefaultInputSeparationMode() { + return supportsInputSeparation(); + } + + Pos2d getInputSeparationButtonPos(); + + default ButtonWidget createInputSeparationButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (supportsInputSeparation()) { + setInputSeparation(!isInputSeparationEnabled()); + } + }) + .setPlayClickSound(supportsInputSeparation()) + .setBackground(() -> { + List ret = new ArrayList<>(); + if (isInputSeparationEnabled()) { + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); + if (supportsInputSeparation()) { + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON); + } else { + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED); + } + } else { + ret.add(GTUITextures.BUTTON_STANDARD); + if (supportsInputSeparation()) { + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF); + } else { + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED); + } + } + if (!supportsInputSeparation()) { + ret.add(GTUITextures.OVERLAY_BUTTON_FORBIDDEN); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(this::isInputSeparationEnabled, this::setInputSeparation), + builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(getInputSeparationButtonPos()) + .setSize(16, 16); + if (!supportsInputSeparation()) { + button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); + } + return (ButtonWidget) button; + } + + /** + * @return if the multi supports batch mode. + */ + boolean supportsBatchMode(); + + /** + * @return true if batch mode is enabled, else false. This is getter is used for displaying the icon in the GUI + */ + boolean isBatchModeEnabled(); + + void setBatchMode(boolean enabled); + + default boolean getDefaultBatchMode() { + return false; + } + + Pos2d getBatchModeButtonPos(); + + default ButtonWidget createBatchModeButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (supportsBatchMode()) { + setBatchMode(!isBatchModeEnabled()); + } + }) + .setPlayClickSound(supportsBatchMode()) + .setBackground(() -> { + List ret = new ArrayList<>(); + if (isBatchModeEnabled()) { + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); + if (supportsBatchMode()) { + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_ON); + } else { + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED); + } + } else { + ret.add(GTUITextures.BUTTON_STANDARD); + if (supportsBatchMode()) { + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_OFF); + } else { + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED); + } + } + if (!supportsBatchMode()) { + ret.add(GTUITextures.OVERLAY_BUTTON_FORBIDDEN); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isBatchModeEnabled, this::setBatchMode), builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(getBatchModeButtonPos()) + .setSize(16, 16); + if (!supportsBatchMode()) { + button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); + } + return (ButtonWidget) button; + } + + Pos2d getRecipeLockingButtonPos(); + + default ButtonWidget createLockToSingleRecipeButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (supportsSingleRecipeLocking()) { + setRecipeLocking(!isRecipeLockingEnabled()); + } + }) + .setPlayClickSound(supportsSingleRecipeLocking()) + .setBackground(() -> { + List ret = new ArrayList<>(); + if (isRecipeLockingEnabled()) { + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); + if (supportsSingleRecipeLocking()) { + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_LOCKED); + } else { + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED); + } + } else { + ret.add(GTUITextures.BUTTON_STANDARD); + if (supportsSingleRecipeLocking()) { + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED); + } else { + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED); + } + } + if (!supportsSingleRecipeLocking()) { + ret.add(GTUITextures.OVERLAY_BUTTON_FORBIDDEN); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(this::isRecipeLockingEnabled, this::setRecipeLocking), + builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(getRecipeLockingButtonPos()) + .setSize(16, 16); + if (!supportsSingleRecipeLocking()) { + button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP)); + } + return (ButtonWidget) button; + } + + Pos2d getStructureUpdateButtonPos(); + + int getStructureUpdateTime(); + + void setStructureUpdateTime(int time); + + default ButtonWidget createStructureUpdateButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget() + .setOnClick((clickData, widget) -> { if (getStructureUpdateTime() <= -20) setStructureUpdateTime(1); }) + .setPlayClickSound(true) + .setBackground(() -> { + List ret = new ArrayList<>(); + if (getStructureUpdateTime() > -20) { + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); + } else { + ret.add(GTUITextures.BUTTON_STANDARD); + } + ret.add(GTUITextures.OVERLAY_BUTTON_STRUCTURE_UPDATE); + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(this::getStructureUpdateTime, this::setStructureUpdateTime), + builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.structure_update")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(getStructureUpdateButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } +} diff --git a/src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java b/src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java index 76d94ee299..442ad05efd 100644 --- a/src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java +++ b/src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java @@ -1,11 +1,11 @@ package gregtech.api.interfaces.modularui; import gregtech.api.enums.Dyes; -import gregtech.api.util.GT_Util; +import gregtech.api.util.GTUtil; public interface IGetTitleColor { default int getTitleColor() { - return GT_Util.getRGBaInt(Dyes.dyeWhite.getRGBA()); + return GTUtil.getRGBaInt(Dyes.dyeWhite.getRGBA()); } } diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java index ec760dd346..852817add2 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java @@ -1,7 +1,7 @@ package gregtech.api.interfaces.tileentity; import gregtech.api.enums.Dyes; -import gregtech.api.util.GT_Util; +import gregtech.api.util.GTUtil; public interface IColoredTileEntity { @@ -21,7 +21,6 @@ public interface IColoredTileEntity { * @return Actual color shown on GUI */ default int getGUIColorization() { - return GT_Util - .getRGBInt((getColorization() != -1 ? Dyes.get(getColorization()) : Dyes.MACHINE_METAL).getRGBA()); + return GTUtil.getRGBInt((getColorization() != -1 ? Dyes.get(getColorization()) : Dyes.MACHINE_METAL).getRGBA()); } } diff --git a/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java b/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java index 8834678984..00ae2db9bd 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java @@ -4,8 +4,8 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_CoverBehaviorBase; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.CoverBehaviorBase; import gregtech.api.util.ISerializableObject; import gregtech.common.covers.CoverInfo; @@ -49,9 +49,9 @@ public interface ICoverable extends IRedstoneTileEntity, IHasInventory, IBasicEn ItemStack getCoverItemAtSide(ForgeDirection side); @Deprecated - GT_CoverBehavior getCoverBehaviorAtSide(ForgeDirection side); + CoverBehavior getCoverBehaviorAtSide(ForgeDirection side); - default GT_CoverBehaviorBase getCoverBehaviorAtSideNew(ForgeDirection side) { + default CoverBehaviorBase getCoverBehaviorAtSideNew(ForgeDirection side) { return getCoverBehaviorAtSide(side); } diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java index 91a9759e47..6dbc6bd5b8 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java @@ -8,10 +8,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyReceiver; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.logic.PowerLogic; import gregtech.api.logic.interfaces.PowerLogicHost; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import ic2.api.energy.tile.IEnergySink; /** @@ -97,8 +97,8 @@ public interface IEnergyConnected extends IColoredTileEntity { while (amperage > usedAmperes && sink.getDemandedEnergy() > 0 && sink.injectEnergy(oppositeSide, voltage, voltage) < voltage) usedAmperes++; } - } else if (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver receiver) { - final int rfOut = GT_Utility.safeInt(voltage * GregTech_API.mEUtoRF / 100); + } else if (GregTechAPI.mOutputRF && tTileEntity instanceof IEnergyReceiver receiver) { + final int rfOut = GTUtility.safeInt(voltage * GregTechAPI.mEUtoRF / 100); if (receiver.receiveEnergy(oppositeSide, rfOut, true) == rfOut) { receiver.receiveEnergy(oppositeSide, rfOut, false); usedAmperes++; @@ -152,7 +152,7 @@ public interface IEnergyConnected extends IColoredTileEntity { emitterLogic.removeEnergyUnsafe(usedAmperes * voltage); return; } - + if (tileEntity instanceof IEnergySink sink) { if (sink.acceptsEnergyFrom((TileEntity) emitter, oppositeSide)) { while (amperage > usedAmperes && sink.getDemandedEnergy() > 0 @@ -164,8 +164,8 @@ public interface IEnergyConnected extends IColoredTileEntity { } } - if (GregTech_API.mOutputRF && tileEntity instanceof IEnergyReceiver receiver) { - final int rfOut = GT_Utility.safeInt(voltage * GregTech_API.mEUtoRF / 100); + if (GregTechAPI.mOutputRF && tileEntity instanceof IEnergyReceiver receiver) { + final int rfOut = GTUtility.safeInt(voltage * GregTechAPI.mEUtoRF / 100); if (receiver.receiveEnergy(oppositeSide, rfOut, true) == rfOut) { receiver.receiveEnergy(oppositeSide, rfOut, false); usedAmperes++; diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java index d8231ee544..9e6b4c57c0 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java @@ -22,7 +22,7 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.modularui.IAddInventorySlots; import gregtech.api.interfaces.modularui.IGetGUITextureSet; import gregtech.api.util.shutdown.ShutDownReason; -import gregtech.common.blocks.GT_Block_Machines; +import gregtech.common.blocks.BlockMachines; /** * A simple compound Interface for all my TileEntities. @@ -186,7 +186,7 @@ public interface IGregTechTileEntity extends ITexturedTileEntity, IGearEnergyTil /** * A randomly called display update to be able to add particles or other items for display The event is proxied by - * the {@link GT_Block_Machines#randomDisplayTick} + * the {@link BlockMachines#randomDisplayTick} */ @SideOnly(Side.CLIENT) default void onRandomDisplayTick() { diff --git a/src/main/java/gregtech/api/items/BlockLongDistancePipe.java b/src/main/java/gregtech/api/items/BlockLongDistancePipe.java new file mode 100644 index 0000000000..3de95981f5 --- /dev/null +++ b/src/main/java/gregtech/api/items/BlockLongDistancePipe.java @@ -0,0 +1,125 @@ +package gregtech.api.items; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.util.GTLanguageManager; +import gregtech.common.blocks.ItemLongDistancePipe; +import gregtech.common.blocks.MaterialMachines; + +public class BlockLongDistancePipe extends GTGenericBlock { + + public IIconContainer[] mIcons; + + public BlockLongDistancePipe() { + super(ItemLongDistancePipe.class, "gt.block.longdistancepipe", new MaterialMachines()); + setStepSound(soundTypeMetal); + setCreativeTab(GregTechAPI.TAB_GREGTECH); + GregTechAPI.registerMachineBlock(this, -1); + + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Long Distance Fluid Pipeline Pipe"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Long Distance Item Pipeline Pipe"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this"); + + ItemList.Long_Distance_Pipeline_Fluid_Pipe.set(new ItemStack(this, 1, 0)); + ItemList.Long_Distance_Pipeline_Item_Pipe.set(new ItemStack(this, 1, 1)); + mIcons = new IIconContainer[] { Textures.BlockIcons.LONG_DISTANCE_PIPE_FLUID, + Textures.BlockIcons.LONG_DISTANCE_PIPE_ITEM }; + } + + @Override + public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { + super.onBlockAdded(aWorld, aX, aY, aZ); + if (GregTechAPI.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetaData); + } + + @Override + public String getHarvestTool(int aMeta) { + return "wrench"; + } + + @Override + public int getHarvestLevel(int aMeta) { + return 2; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ); + } + + @Override + public float getExplosionResistance(Entity aTNT) { + return Blocks.iron_block.getExplosionResistance(aTNT); + } + + @Override + public String getUnlocalizedName() { + return this.mUnlocalizedName; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + return mIcons[aMeta % mIcons.length].getIcon(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister aIconRegister) {} + + @Override + public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + public int damageDropped(int metadata) { + return metadata; + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < 3; i++) { + ItemStack aStack = new ItemStack(aItem, 1, i); + if (!aStack.getDisplayName() + .contains(".name")) aList.add(aStack); + } + } +} diff --git a/src/main/java/gregtech/api/items/GTGenericBlock.java b/src/main/java/gregtech/api/items/GTGenericBlock.java new file mode 100644 index 0000000000..314849e8cf --- /dev/null +++ b/src/main/java/gregtech/api/items/GTGenericBlock.java @@ -0,0 +1,22 @@ +package gregtech.api.items; + +import static gregtech.api.enums.GTValues.W; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemBlock; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.util.GTLanguageManager; + +public class GTGenericBlock extends Block { + + protected final String mUnlocalizedName; + + protected GTGenericBlock(Class aItemClass, String aName, Material aMaterial) { + super(aMaterial); + setBlockName(mUnlocalizedName = aName); + GameRegistry.registerBlock(this, aItemClass, getUnlocalizedName()); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + "." + W + ".name", "Any Sub Block of this one"); + } +} diff --git a/src/main/java/gregtech/api/items/GTGenericItem.java b/src/main/java/gregtech/api/items/GTGenericItem.java new file mode 100644 index 0000000000..4f0994bb12 --- /dev/null +++ b/src/main/java/gregtech/api/items/GTGenericItem.java @@ -0,0 +1,162 @@ +package gregtech.api.items; + +import static gregtech.api.enums.Mods.GregTech; + +import java.util.List; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.BehaviorProjectileDispense; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SubTag; +import gregtech.api.interfaces.IProjectileItem; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +/** + * Extended by most Items, also used as a fallback Item, to prevent the accidental deletion when Errors occur. + */ +public class GTGenericItem extends Item implements IProjectileItem { + + private final String mName, mTooltip; + protected IIcon mIcon; + + public GTGenericItem(String aUnlocalized, String aEnglish, String aEnglishTooltip) { + super(); + mName = "gt." + aUnlocalized; + GTLanguageManager.addStringLocalization(mName + ".name", aEnglish); + if (GTUtility.isStringValid(aEnglishTooltip)) + GTLanguageManager.addStringLocalization(mTooltip = mName + ".tooltip_main", aEnglishTooltip); + else mTooltip = null; + setCreativeTab(GregTechAPI.TAB_GREGTECH); + GameRegistry.registerItem(this, mName, GregTech.ID); + BlockDispenser.dispenseBehaviorRegistry.putObject(this, new GT_Item_Dispense()); + } + + @Override + public final Item setUnlocalizedName(String aName) { + return this; + } + + @Override + public final String getUnlocalizedName() { + return mName; + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return getHasSubtypes() ? mName + "." + getDamage(aStack) : mName; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aIconRegister) { + mIcon = aIconRegister.registerIcon(GregTech.getResourcePath(GTConfig.troll ? "troll" : mName)); + } + + @Override + public boolean doesSneakBypassUse(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) { + return true; + } + + @Override + public IIcon getIconFromDamage(int aMetaData) { + return mIcon; + } + + public int getTier(ItemStack aStack) { + return 0; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + if (getMaxDamage() > 0 && !getHasSubtypes()) + aList.add((aStack.getMaxDamage() - getDamage(aStack)) + " / " + aStack.getMaxDamage()); + if (mTooltip != null) aList.add(GTLanguageManager.getTranslation(mTooltip)); + if (GTModHandler.isElectricItem(aStack)) aList.add("Tier: " + getTier(aStack)); + addAdditionalToolTips(aList, aStack, aPlayer); + } + + protected void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + // + } + + @Override + public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + isItemStackUsable(aStack); + } + + public boolean isItemStackUsable(ItemStack aStack) { + return true; + } + + public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) { + EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata()); + IPosition iposition = BlockDispenser.func_149939_a(aSource); + ItemStack itemstack1 = aStack.splitStack(1); + BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition); + return aStack; + } + + @Override + public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, + double aZ) { + return null; + } + + @Override + public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity, + float aSpeed) { + return null; + } + + @Override + public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) { + return false; + } + + @Override + public ItemStack getContainerItem(ItemStack aStack) { + return null; + } + + @Override + public boolean hasContainerItem(ItemStack aStack) { + return getContainerItem(aStack) != null; + } + + public String transItem(String aKey, String aEnglish) { + return GTLanguageManager.addStringLocalization("Item_DESCRIPTION_Index_" + aKey, aEnglish); + } + + public static class GT_Item_Dispense extends BehaviorProjectileDispense { + + @Override + public ItemStack dispenseStack(IBlockSource aSource, ItemStack aStack) { + return ((GTGenericItem) aStack.getItem()).onDispense(aSource, aStack); + } + + @Override + protected IProjectile getProjectileEntity(World aWorld, IPosition aPosition) { + return null; + } + } +} diff --git a/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java b/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java deleted file mode 100644 index 31a44f3dbc..0000000000 --- a/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java +++ /dev/null @@ -1,125 +0,0 @@ -package gregtech.api.items; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.util.GT_LanguageManager; -import gregtech.common.blocks.GT_Item_LongDistancePipe; -import gregtech.common.blocks.GT_Material_Machines; - -public class GT_Block_LongDistancePipe extends GT_Generic_Block { - - public IIconContainer[] mIcons; - - public GT_Block_LongDistancePipe() { - super(GT_Item_LongDistancePipe.class, "gt.block.longdistancepipe", new GT_Material_Machines()); - setStepSound(soundTypeMetal); - setCreativeTab(GregTech_API.TAB_GREGTECH); - GregTech_API.registerMachineBlock(this, -1); - - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Long Distance Fluid Pipeline Pipe"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Long Distance Item Pipeline Pipe"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this"); - - ItemList.Long_Distance_Pipeline_Fluid_Pipe.set(new ItemStack(this, 1, 0)); - ItemList.Long_Distance_Pipeline_Item_Pipe.set(new ItemStack(this, 1, 1)); - mIcons = new IIconContainer[] { Textures.BlockIcons.LONG_DISTANCE_PIPE_FLUID, - Textures.BlockIcons.LONG_DISTANCE_PIPE_ITEM }; - } - - @Override - public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { - super.onBlockAdded(aWorld, aX, aY, aZ); - if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - } - } - - @Override - public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetaData); - } - - @Override - public String getHarvestTool(int aMeta) { - return "wrench"; - } - - @Override - public int getHarvestLevel(int aMeta) { - return 2; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ); - } - - @Override - public float getExplosionResistance(Entity aTNT) { - return Blocks.iron_block.getExplosionResistance(aTNT); - } - - @Override - public String getUnlocalizedName() { - return this.mUnlocalizedName; - } - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - return mIcons[aMeta % mIcons.length].getIcon(); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister aIconRegister) {} - - @Override - public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { - return false; - } - - @Override - public int damageDropped(int metadata) { - return metadata; - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < 3; i++) { - ItemStack aStack = new ItemStack(aItem, 1, i); - if (!aStack.getDisplayName() - .contains(".name")) aList.add(aStack); - } - } -} diff --git a/src/main/java/gregtech/api/items/GT_BreederCell_Item.java b/src/main/java/gregtech/api/items/GT_BreederCell_Item.java deleted file mode 100644 index 438b0f467e..0000000000 --- a/src/main/java/gregtech/api/items/GT_BreederCell_Item.java +++ /dev/null @@ -1,153 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.util.GT_Utility.formatNumbers; - -import java.util.List; -import java.util.function.Supplier; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_Utility; -import ic2.api.reactor.IReactor; -import ic2.api.reactor.IReactorComponent; -import ic2.core.IC2Potion; - -/** - * A {@link ic2.core.item.reactor.ItemReactorLithiumCell}, but can be used to produce anything! - * - * @author glee8e - */ -public class GT_BreederCell_Item extends GT_Generic_Item implements IReactorComponent { - - protected final int mHeatBonusStep; - protected final int mHeatBonusMultiplier; - protected ItemStack mProduct; - protected boolean deflector = false; - protected boolean hidden = false; - protected boolean neiAdded = false; - - public GT_BreederCell_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip, int aHeatBonusStep, - int aHeatBonusMultiplier, int aRequiredPulse, Supplier aProduct) { - super(aUnlocalized, aEnglish, aEnglishTooltip); - this.mHeatBonusStep = aHeatBonusStep; - this.mHeatBonusMultiplier = aHeatBonusMultiplier; - this.setMaxDamage(aRequiredPulse); - setNoRepair(); - GregTech_API.sAfterGTPostload.add(() -> { - mProduct = aProduct.get(); - if (!hidden && !neiAdded) { - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this)) - .itemOutputs(mProduct) - .setNEIDesc( - deflector ? "Neutron reflecting Breeder" : "Heat neutral Breeder", - String.format("Every %d reactor hull heat", mHeatBonusStep), - String.format("increase speed by %d00%%", mHeatBonusMultiplier), - String.format("Required pulses: %d", getMaxDamage())) - .duration(0) - .eut(0) - .addTo(RecipeMaps.ic2NuclearFakeRecipes); - - neiAdded = true; - } - }); - } - - public GT_BreederCell_Item setDeflector() { - deflector = true; - return this; - } - - public GT_BreederCell_Item setHidden() { - hidden = true; - return this; - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int slotIndex, boolean isCurrentItem) { - if ((entity instanceof EntityLivingBase entityLiving)) { - if (!GT_Utility.isWearingFullRadioHazmat(entityLiving)) { - IC2Potion.radiation.applyTo(entityLiving, 20, 1); - } - } - } - - @Override - public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - aList.add(transItem("019", "Bath with neutron in a hot reactor")); - int rDmg = aStack.getItemDamage() * 4 / getMaxDamage(); - EnumChatFormatting color2 = switch (rDmg) { - case 0 -> EnumChatFormatting.DARK_GRAY; - case 1, 2 -> EnumChatFormatting.GRAY; - default -> EnumChatFormatting.WHITE; - }; - aList.add( - String.format( - transItem("020", "Progress: %s/%s"), - "" + color2 + formatNumbers(aStack.getItemDamage()) + EnumChatFormatting.RESET, - "" + formatNumbers(getMaxDamage()))); - if (aStack.getItemDamage() > 0) aList.add(EnumChatFormatting.RED + transItem("021", "Radiation Hazard")); - } - - @Override - public int getItemStackLimit(ItemStack stack) { - return stack.getItemDamage() == 0 ? maxStackSize : 1; - } - - @Override - public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) {} - - @Override - public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, - int pulseX, int pulseY, boolean heatrun) { - if (heatrun) { - int myLevel = getNewDamage(reactor, yourStack); - if (myLevel >= getMaxDamage()) reactor.setItemAt(youX, youY, mProduct.copy()); - else yourStack.setItemDamage(myLevel); - } - - return deflector; - } - - protected int getNewDamage(IReactor reactor, ItemStack stack) { - return stack.getItemDamage() + 1 + reactor.getHeat() / mHeatBonusStep * mHeatBonusMultiplier; - } - - @Override - public boolean canStoreHeat(IReactor reactor, ItemStack yourStack, int x, int y) { - return false; - } - - @Override - public int getMaxHeat(IReactor reactor, ItemStack yourStack, int x, int y) { - return 0; - } - - @Override - public int getCurrentHeat(IReactor reactor, ItemStack yourStack, int x, int y) { - return 0; - } - - @Override - public int alterHeat(IReactor reactor, ItemStack yourStack, int x, int y, int heat) { - return heat; - } - - @Override - public float influenceExplosion(IReactor reactor, ItemStack yourStack) { - return 0.0F; - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - return 1.0D - (double) stack.getItemDamageForDisplay() / (double) stack.getMaxDamage(); - } -} diff --git a/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java b/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java deleted file mode 100644 index eb3c6276cf..0000000000 --- a/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java +++ /dev/null @@ -1,67 +0,0 @@ -package gregtech.api.items; - -import net.minecraft.item.ItemStack; - -import ic2.api.reactor.IReactor; -import ic2.api.reactor.IReactorComponent; - -public class GT_CoolantCellIC_Item extends GT_CoolantCell_Item implements IReactorComponent { - - public GT_CoolantCellIC_Item(String aUnlocalized, String aEnglish, int aMaxStore) { - super(aUnlocalized, aEnglish, aMaxStore); - } - - @Override - public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {} - - @Override - public boolean acceptUraniumPulse(IReactor aReactor, ItemStack aStack, ItemStack pulsingStack, int youX, int youY, - int pulseX, int pulseY, boolean aHeatRun) { - return false; - } - - @Override - public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) { - return !aReactor.isFluidCooled() || getControlTagOfStack(aStack) == 0; - } - - @Override - public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) { - return this.heatStorage; - } - - @Override - public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) { - return getHeatOfStack(aStack); - } - - @Override - public float influenceExplosion(IReactor aReactor, ItemStack aStack) { - return 1.0F + this.heatStorage / 30000.0F; - } - - @Override - public int alterHeat(IReactor aReactor, ItemStack aStack, int x, int y, int aHeat) { - int tHeat = getHeatOfStack(aStack); - if ((tHeat == 0) && (getControlTagOfStack(aStack) != 0)) { - setControlTagOfStack(aStack, 0); - } - tHeat += aHeat; - if (tHeat > this.heatStorage) { - aReactor.setItemAt(x, y, null); - aHeat = this.heatStorage - tHeat + 1; - } else { - if (tHeat < 0) { - aHeat = tHeat; - tHeat = 0; - } else { - aHeat = 0; - } - if ((tHeat > 0) && (getControlTagOfStack(aStack) == 0) && (!aReactor.isFluidCooled())) { - setControlTagOfStack(aStack, 1); - } - setHeatForStack(aStack, tHeat); - } - return aHeat; - } -} diff --git a/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java b/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java deleted file mode 100644 index 6ed7dae3b0..0000000000 --- a/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java +++ /dev/null @@ -1,82 +0,0 @@ -package gregtech.api.items; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; - -import gregtech.api.GregTech_API; -import ic2.core.util.StackUtil; - -public class GT_CoolantCell_Item extends GT_Generic_Item { - - protected final int heatStorage; - - public GT_CoolantCell_Item(String aUnlocalized, String aEnglish, int aMaxStore) { - super(aUnlocalized, aEnglish, null); - this.setMaxStackSize(1); - this.setMaxDamage(100); - setNoRepair(); - this.heatStorage = aMaxStore; - this.setCreativeTab(GregTech_API.TAB_GREGTECH); - } - - protected static int getHeatOfStack(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - aStack.setTagCompound(tNBT); - } - return tNBT.getInteger("heat"); - } - - protected void setHeatForStack(ItemStack aStack, int aHeat) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - aStack.setTagCompound(tNBT); - } - tNBT.setInteger("heat", aHeat); - if (this.heatStorage > 0) { - double heatRatio = (double) aHeat / (double) this.heatStorage; - int damage = (int) (aStack.getMaxDamage() * heatRatio); - if (damage >= aStack.getMaxDamage()) { - damage = aStack.getMaxDamage() - 1; - } - aStack.setItemDamage(damage); - } - } - - @Override - public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - super.addAdditionalToolTips(aList, aStack, aPlayer); - int rHeat = getHeatOfStack(aStack) * 10 / this.heatStorage; - EnumChatFormatting color = switch (rHeat) { - case 0 -> EnumChatFormatting.BLUE; - case 1, 2 -> EnumChatFormatting.GREEN; - case 3, 4, 5, 6 -> EnumChatFormatting.YELLOW; - case 7, 8 -> EnumChatFormatting.RED; - default -> EnumChatFormatting.DARK_RED; - }; - aList.add( - EnumChatFormatting.WHITE - + String.format(transItem("000", "Stored Heat: %s"), "" + color + getHeatOfStack(aStack))); - if (getControlTagOfStack(aStack) == 1) { - aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line1")); - aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line2")); - } - } - - public int getControlTagOfStack(ItemStack stack) { - NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); - return nbtData.getInteger("tag"); - } - - public void setControlTagOfStack(ItemStack stack, int tag) { - NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); - nbtData.setInteger("tag", tag); - } -} diff --git a/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java deleted file mode 100644 index df820f928a..0000000000 --- a/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java +++ /dev/null @@ -1,332 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.enums.Mods.GregTech; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.common.ISpecialArmor; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.living.LivingFallEvent; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class GT_EnergyArmor_Item extends ItemArmor implements ISpecialArmor { - - public static Map jumpChargeMap = new ConcurrentHashMap<>(); - public int mCharge, mTransfer, mTier, mDamageEnergyCost, mSpecials; - public boolean mChargeProvider; - public double mArmorAbsorbtionPercentage; - - public GT_EnergyArmor_Item(int aID, String aUnlocalized, String aEnglish, int aCharge, int aTransfer, int aTier, - int aDamageEnergyCost, int aSpecials, double aArmorAbsorbtionPercentage, boolean aChargeProvider, int aType, - int aArmorIndex) { - super(ArmorMaterial.DIAMOND, aArmorIndex, aType); - setMaxStackSize(1); - setMaxDamage(100); - setNoRepair(); - setUnlocalizedName(aUnlocalized); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".name", aEnglish); - mCharge = Math.max(1, aCharge); - mTransfer = Math.max(1, aTransfer); - mTier = Math.max(1, aTier); - mSpecials = aSpecials; - mChargeProvider = aChargeProvider; - mDamageEnergyCost = Math.max(0, aDamageEnergyCost); - mArmorAbsorbtionPercentage = aArmorAbsorbtionPercentage; - - setCreativeTab(GregTech_API.TAB_GREGTECH); - - MinecraftForge.EVENT_BUS.register(this); - } - - private static void setCharge(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) tNBT = new NBTTagCompound(); - tNBT.setInteger("charge", 1000000000); - aStack.setTagCompound(tNBT); - } - - @Override - public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - ItemStack tStack = aPlayer.inventory.armorInventory[3 - armorType]; - if (tStack != null) { - for (int i = 0; i < 9; i++) { - if (aPlayer.inventory.mainInventory[i] == aStack) { - aPlayer.inventory.armorInventory[3 - armorType] = aPlayer.inventory.mainInventory[i]; - aPlayer.inventory.mainInventory[i] = tStack; - return tStack; - } - } - } - return super.onItemRightClick(aStack, aWorld, aPlayer); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister aIconRegister) { - this.itemIcon = aIconRegister.registerIcon(GregTech.getResourcePath(getUnlocalizedName())); - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - aList.add("Tier: " + mTier); - if ((mSpecials & 1) != 0) aList.add("Rebreather"); - if ((mSpecials & 2) != 0) aList.add("Inertia Damper"); - if ((mSpecials & 4) != 0) aList.add("Food Replicator"); - if ((mSpecials & 8) != 0) aList.add("Medicine Module"); - if ((mSpecials & 16) != 0) aList.add("Lamp"); - if ((mSpecials & 32) != 0) aList.add("Solarpanel"); - if ((mSpecials & 64) != 0) aList.add("Extinguisher Module"); - if ((mSpecials & 128) != 0) aList.add("Jump Booster"); - if ((mSpecials & 256) != 0) aList.add("Speed Booster"); - if ((mSpecials & 512) != 0) aList.add("Invisibility Field"); - if ((mSpecials & 1024) != 0) aList.add("Infinite Charge"); - } - - @Override - public void onArmorTick(World aWorld, EntityPlayer aPlayer, ItemStack aStack) { - if (mSpecials == 0) return; - - if (!aPlayer.worldObj.isRemote && (mSpecials & 1) != 0) { - int airSupply = aPlayer.getAir(); - if (GT_ModHandler.canUseElectricItem(aStack, 1000) && airSupply < 50) { - aPlayer.setAir(airSupply + 250); - GT_ModHandler.useElectricItem(aStack, 1000, aPlayer); - } - } - - if (!aPlayer.worldObj.isRemote && (mSpecials & 4) != 0) { - if (GT_ModHandler.canUseElectricItem(aStack, 50000) && aPlayer.getFoodStats() - .needFood()) { - aPlayer.getFoodStats() - .addStats(1, 0.0F); - GT_ModHandler.useElectricItem(aStack, 50000, aPlayer); - } - } - - if ((mSpecials & 8) != 0) { - if (GT_ModHandler.canUseElectricItem(aStack, 10000) && aPlayer.isPotionActive(Potion.poison)) { - GT_Utility.removePotion(aPlayer, Potion.poison.id); - GT_ModHandler.useElectricItem(aStack, 10000, aPlayer); - } - if (GT_ModHandler.canUseElectricItem(aStack, 100000) && aPlayer.isPotionActive(Potion.wither)) { - GT_Utility.removePotion(aPlayer, Potion.wither.id); - GT_ModHandler.useElectricItem(aStack, 100000, aPlayer); - } - } - - if ((mSpecials & 64) != 0) { - aPlayer.setFire(0); - } - - if (!aPlayer.worldObj.isRemote && (mSpecials & 128) != 0) { - float jumpCharge = jumpChargeMap.getOrDefault(aPlayer, 1.0F); - - if (GT_ModHandler.canUseElectricItem(aStack, 1000) && aPlayer.onGround && jumpCharge < 1.0F) { - jumpCharge = 1.0F; - GT_ModHandler.useElectricItem(aStack, 1000, aPlayer); - } - - if (aPlayer.motionY >= 0.0D && jumpCharge > 0.0F && !aPlayer.isInWater()) { - if (jumpCharge < 1.0F) { - jumpCharge = 0.0F; - } - } - - jumpChargeMap.put(aPlayer, jumpCharge); - } - - if ((mSpecials & 256) != 0) { - if (GT_ModHandler.canUseElectricItem(aStack, 100) && aPlayer.isSprinting() - && (aPlayer.onGround && Math.abs(aPlayer.motionX) + Math.abs(aPlayer.motionZ) > 0.10000000149011612D - || aPlayer.isInWater())) { - GT_ModHandler.useElectricItem(aStack, 100, aPlayer); - float bonus = 0.22F; - - if (aPlayer.isInWater()) { - GT_ModHandler.useElectricItem(aStack, 100, aPlayer); - bonus = 0.1F; - - if (aPlayer.motionY > 0) { - aPlayer.motionY += 0.10000000149011612D; - } - } - - aPlayer.moveFlying(0.0F, 1.0F, bonus); - } - } - - if ((mSpecials & 512) != 0) { - if (GT_ModHandler.canUseElectricItem(aStack, 10000)) { - GT_ModHandler.useElectricItem(aStack, 10000, aPlayer); - aPlayer.addPotionEffect(new PotionEffect(Potion.invisibility.getId(), 25, 1, true)); - } - } - - if (!aPlayer.worldObj.isRemote && (mSpecials & (16 | 32)) != 0) { - // if (GregTech_API.sWorldTickCounter%20==0) { - ItemStack tTargetChargeItem = aStack, tTargetDechargeItem = aStack; - - if (GT_ModHandler.chargeElectricItem(tTargetChargeItem, 1, Integer.MAX_VALUE, true, true) < 1) { - tTargetChargeItem = aPlayer.inventory.armorInventory[2]; - } - if (GT_ModHandler.dischargeElectricItem(tTargetDechargeItem, 10, Integer.MAX_VALUE, true, true, true) - < 10) { - tTargetDechargeItem = aPlayer.inventory.armorInventory[2]; - } - - if (tTargetChargeItem == null || !GT_ModHandler.isElectricItem(tTargetChargeItem)) { - tTargetChargeItem = null; - } - - if (aPlayer.worldObj.isDaytime() && aPlayer.worldObj.canBlockSeeTheSky( - MathHelper.floor_double(aPlayer.posX), - MathHelper.floor_double(aPlayer.posY + 1), - MathHelper.floor_double(aPlayer.posZ))) { - if ((mSpecials & 32) != 0 && tTargetChargeItem != null) { - GT_ModHandler.chargeElectricItem(tTargetChargeItem, 20, Integer.MAX_VALUE, true, false); - } - } else { - /* - * TODO: if ((mSpecials & 16) != 0 && tTargetDechargeItem != null && - * GT_ModHandler.canUseElectricItem(tTargetDechargeItem, 10)) { if (aPlayer.worldObj.getBlock - * ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ) == Blocks.air) aPlayer.worldObj.setBlock - * ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ, GregTech_API.sBlockList[3]); - * GT_ModHandler.useElectricItem(tTargetDechargeItem, 10, aPlayer); } - */ - // } - } - } - } - - @Override - public boolean getShareTag() { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item aItem, CreativeTabs creativeTab, List outputSubItems) { - ItemStack tCharged = new ItemStack(this, 1), tUncharged = new ItemStack(this, 1, getMaxDamage()); - GT_ModHandler.chargeElectricItem(tCharged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false); - outputSubItems.add(tCharged); - outputSubItems.add(tUncharged); - } - - public boolean canProvideEnergy(ItemStack aStack) { - if ((mSpecials & 1024) != 0) setCharge(aStack); - return mChargeProvider; - } - - public Item getChargedItem(ItemStack aStack) { - if ((mSpecials & 1024) != 0) setCharge(aStack); - return this; - } - - public Item getEmptyItem(ItemStack aStack) { - if ((mSpecials & 1024) != 0) setCharge(aStack); - return this; - } - - public int getMaxCharge(ItemStack aStack) { - if ((mSpecials & 1024) != 0) setCharge(aStack); - return mCharge; - } - - public int getTier(ItemStack aStack) { - if ((mSpecials & 1024) != 0) setCharge(aStack); - return mTier; - } - - public int getTransferLimit(ItemStack aStack) { - if ((mSpecials & 1024) != 0) setCharge(aStack); - return mTransfer; - } - - @Override - public int getItemEnchantability() { - return 0; - } - - @Override - public boolean isBookEnchantable(ItemStack ingredient, ItemStack bookEnchant) { - return false; - } - - @Override - public boolean getIsRepairable(ItemStack toBeRepaired, ItemStack repairWith) { - return false; - } - - // TODO: @ForgeSubscribe - public void onEntityLivingFallEvent(LivingFallEvent event) { - if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer player) { - for (int i = 0; i < 4; i++) { - ItemStack armor = player.inventory.armorInventory[i]; - if (armor != null && armor.getItem() == this && (mSpecials & 2) != 0) { - int distanceFactor = (int) event.distance - 3; - int energyCost = (this.mDamageEnergyCost * distanceFactor) / 4; - if (energyCost <= GT_ModHandler - .dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true)) { - GT_ModHandler.dischargeElectricItem(armor, energyCost, Integer.MAX_VALUE, true, false, true); - event.setCanceled(true); - break; - } - } - } - } - } - - @Override - public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, - double damage, int slotIndex) { - return new ISpecialArmor.ArmorProperties( - (source == DamageSource.fall && (mSpecials & 2) != 0) ? 10 : 0, - getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage, - mDamageEnergyCost > 0 ? 25 - * GT_ModHandler.dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true) - / mDamageEnergyCost : 0); - } - - @Override - public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slotIndex) { - return (int) Math.round(20.0D * getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage); - } - - @Override - public void damageArmor(EntityLivingBase entity, ItemStack itemStack, DamageSource source, int damage, - int slotIndex) { - GT_ModHandler - .dischargeElectricItem(itemStack, damage * mDamageEnergyCost, Integer.MAX_VALUE, true, false, true); - } - - private double getBaseAbsorptionRatio() { - if (mArmorAbsorbtionPercentage <= 0) return 0.00; - return switch (this.armorType) { - case 0, 3 -> 0.15; - case 1 -> 0.40; - case 2 -> 0.30; - default -> 0.00; - }; - } -} diff --git a/src/main/java/gregtech/api/items/GT_Generic_Block.java b/src/main/java/gregtech/api/items/GT_Generic_Block.java deleted file mode 100644 index 7aaef6d5ca..0000000000 --- a/src/main/java/gregtech/api/items/GT_Generic_Block.java +++ /dev/null @@ -1,22 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.enums.GT_Values.W; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.item.ItemBlock; - -import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.api.util.GT_LanguageManager; - -public class GT_Generic_Block extends Block { - - protected final String mUnlocalizedName; - - protected GT_Generic_Block(Class aItemClass, String aName, Material aMaterial) { - super(aMaterial); - setBlockName(mUnlocalizedName = aName); - GameRegistry.registerBlock(this, aItemClass, getUnlocalizedName()); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + W + ".name", "Any Sub Block of this one"); - } -} diff --git a/src/main/java/gregtech/api/items/GT_Generic_Item.java b/src/main/java/gregtech/api/items/GT_Generic_Item.java deleted file mode 100644 index 3fe2083a96..0000000000 --- a/src/main/java/gregtech/api/items/GT_Generic_Item.java +++ /dev/null @@ -1,162 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.enums.Mods.GregTech; - -import java.util.List; - -import net.minecraft.block.BlockDispenser; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.dispenser.BehaviorDefaultDispenseItem; -import net.minecraft.dispenser.BehaviorProjectileDispense; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.dispenser.IPosition; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IProjectile; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.SubTag; -import gregtech.api.interfaces.IProjectileItem; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -/** - * Extended by most Items, also used as a fallback Item, to prevent the accidental deletion when Errors occur. - */ -public class GT_Generic_Item extends Item implements IProjectileItem { - - private final String mName, mTooltip; - protected IIcon mIcon; - - public GT_Generic_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip) { - super(); - mName = "gt." + aUnlocalized; - GT_LanguageManager.addStringLocalization(mName + ".name", aEnglish); - if (GT_Utility.isStringValid(aEnglishTooltip)) - GT_LanguageManager.addStringLocalization(mTooltip = mName + ".tooltip_main", aEnglishTooltip); - else mTooltip = null; - setCreativeTab(GregTech_API.TAB_GREGTECH); - GameRegistry.registerItem(this, mName, GregTech.ID); - BlockDispenser.dispenseBehaviorRegistry.putObject(this, new GT_Item_Dispense()); - } - - @Override - public final Item setUnlocalizedName(String aName) { - return this; - } - - @Override - public final String getUnlocalizedName() { - return mName; - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return getHasSubtypes() ? mName + "." + getDamage(aStack) : mName; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister aIconRegister) { - mIcon = aIconRegister.registerIcon(GregTech.getResourcePath(GT_Config.troll ? "troll" : mName)); - } - - @Override - public boolean doesSneakBypassUse(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) { - return true; - } - - @Override - public IIcon getIconFromDamage(int aMetaData) { - return mIcon; - } - - public int getTier(ItemStack aStack) { - return 0; - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - if (getMaxDamage() > 0 && !getHasSubtypes()) - aList.add((aStack.getMaxDamage() - getDamage(aStack)) + " / " + aStack.getMaxDamage()); - if (mTooltip != null) aList.add(GT_LanguageManager.getTranslation(mTooltip)); - if (GT_ModHandler.isElectricItem(aStack)) aList.add("Tier: " + getTier(aStack)); - addAdditionalToolTips(aList, aStack, aPlayer); - } - - protected void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - // - } - - @Override - public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - isItemStackUsable(aStack); - } - - public boolean isItemStackUsable(ItemStack aStack) { - return true; - } - - public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) { - EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata()); - IPosition iposition = BlockDispenser.func_149939_a(aSource); - ItemStack itemstack1 = aStack.splitStack(1); - BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition); - return aStack; - } - - @Override - public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, - double aZ) { - return null; - } - - @Override - public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity, - float aSpeed) { - return null; - } - - @Override - public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) { - return false; - } - - @Override - public ItemStack getContainerItem(ItemStack aStack) { - return null; - } - - @Override - public boolean hasContainerItem(ItemStack aStack) { - return getContainerItem(aStack) != null; - } - - public String transItem(String aKey, String aEnglish) { - return GT_LanguageManager.addStringLocalization("Item_DESCRIPTION_Index_" + aKey, aEnglish); - } - - public static class GT_Item_Dispense extends BehaviorProjectileDispense { - - @Override - public ItemStack dispenseStack(IBlockSource aSource, ItemStack aStack) { - return ((GT_Generic_Item) aStack.getItem()).onDispense(aSource, aStack); - } - - @Override - protected IProjectile getProjectileEntity(World aWorld, IPosition aPosition) { - return null; - } - } -} diff --git a/src/main/java/gregtech/api/items/GT_MetaBase_Item.java b/src/main/java/gregtech/api/items/GT_MetaBase_Item.java deleted file mode 100644 index 481c0b5a08..0000000000 --- a/src/main/java/gregtech/api/items/GT_MetaBase_Item.java +++ /dev/null @@ -1,622 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.enums.GT_Values.D1; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.util.GT_Utility.formatNumbers; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.inventory.Container; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidContainerItem; - -import gregtech.api.enums.SubTag; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import ic2.api.item.ElectricItem; -import ic2.api.item.IElectricItem; -import ic2.api.item.IElectricItemManager; -import ic2.api.item.ISpecialElectricItem; - -public abstract class GT_MetaBase_Item extends GT_Generic_Item - implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem { - - /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */ - private final ConcurrentHashMap>> mItemBehaviors = new ConcurrentHashMap<>(); - - /** - * Creates the Item using these Parameters. - * - * @param aUnlocalized The Unlocalized Name of this Item. - */ - public GT_MetaBase_Item(String aUnlocalized) { - super(aUnlocalized, "Generated Item", null); - setHasSubtypes(true); - setMaxDamage(0); - } - - /** - * Adds a special Item Behaviour to the Item. - *

- * Note: the boolean Behaviours sometimes won't be executed if another boolean Behaviour returned true before. - * - * @param aMetaValue the Meta Value of the Item you want to add it to. [0 - 32765] - * @param aBehavior the Click Behavior you want to add. - * @return the Item itself for convenience in constructing. - */ - public final GT_MetaBase_Item addItemBehavior(int aMetaValue, IItemBehaviour aBehavior) { - if (aMetaValue < 0 || aMetaValue >= 32766 || aBehavior == null) return this; - ArrayList> tList = mItemBehaviors - .computeIfAbsent((short) aMetaValue, k -> new ArrayList<>(1)); - tList.add(aBehavior); - return this; - } - - public abstract Long[] getElectricStats(ItemStack aStack); - - public abstract Long[] getFluidContainerStats(ItemStack aStack); - - @Override - public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) { - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - if (tList != null) for (IItemBehaviour tBehavior : tList) - if (tBehavior.hasProjectile(this, aProjectileType, aStack)) return true; - return super.hasProjectile(aProjectileType, aStack); - } - - @Override - public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, - double aZ) { - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - if (tList != null) for (IItemBehaviour tBehavior : tList) { - EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ); - if (rArrow != null) return rArrow; - } - return super.getProjectile(aProjectileType, aStack, aWorld, aX, aY, aZ); - } - - @Override - public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity, - float aSpeed) { - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - if (tList != null) for (IItemBehaviour tBehavior : tList) { - EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed); - if (rArrow != null) return rArrow; - } - return super.getProjectile(aProjectileType, aStack, aWorld, aEntity, aSpeed); - } - - @Override - public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) { - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - if (tList != null) for (IItemBehaviour tBehavior : tList) - if (tBehavior.canDispense(this, aSource, aStack)) return tBehavior.onDispense(this, aSource, aStack); - return super.onDispense(aSource, aStack); - } - - @Override - public boolean isItemStackUsable(ItemStack aStack) { - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - if (tList != null) for (IItemBehaviour tBehavior : tList) - if (!tBehavior.isItemStackUsable(this, aStack)) return false; - return super.isItemStackUsable(aStack); - } - - @Override - public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { - use(aStack, 0, aPlayer); - isItemStackUsable(aStack); - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - try { - if (tList != null) for (IItemBehaviour tBehavior : tList) - if (tBehavior.onLeftClickEntity(this, aStack, aPlayer, aEntity)) { - if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); - return true; - } - if (aStack.stackSize <= 0) { - aPlayer.destroyCurrentEquippedItem(); - return false; - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - return false; - } - - @Override - public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, - int ordinalSide, float hitX, float hitY, float hitZ) { - use(aStack, 0, aPlayer); - isItemStackUsable(aStack); - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - try { - if (tList != null) for (IItemBehaviour tBehavior : tList) - if (tBehavior.onItemUse(this, aStack, aPlayer, aWorld, aX, aY, aZ, ordinalSide, hitX, hitY, hitZ)) { - if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); - return true; - } - if (aStack.stackSize <= 0) { - aPlayer.destroyCurrentEquippedItem(); - return false; - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - return false; - } - - @Override - public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, - int ordinalSide, float hitX, float hitY, float hitZ) { - use(aStack, 0, aPlayer); - isItemStackUsable(aStack); - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - try { - if (tList != null) for (IItemBehaviour tBehavior : tList) if (tBehavior.onItemUseFirst( - this, - aStack, - aPlayer, - aWorld, - aX, - aY, - aZ, - ForgeDirection.getOrientation(ordinalSide), - hitX, - hitY, - hitZ)) { - if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); - return true; - } - if (aStack.stackSize <= 0) { - aPlayer.destroyCurrentEquippedItem(); - return false; - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - return false; - } - - @Override - public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - use(aStack, 0, aPlayer); - isItemStackUsable(aStack); - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - try { - if (tList != null) for (IItemBehaviour tBehavior : tList) - aStack = tBehavior.onItemRightClick(this, aStack, aWorld, aPlayer); - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - return aStack; - } - - @Override - public final void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - String tKey = getUnlocalizedName(aStack) + ".tooltip"; - String[] tStrings = GT_LanguageManager.getTranslation(tKey) - .split("/n "); - for (String tString : tStrings) - if (GT_Utility.isStringValid(tString) && !tKey.equals(tString)) aList.add(tString); - - Long[] tStats = getElectricStats(aStack); - if (tStats != null) { - if (tStats[3] > 0) { - aList.add( - EnumChatFormatting.AQUA + String.format( - transItem("009", "Contains %s EU Tier: %s"), - formatNumbers(tStats[3]), - "" + (tStats[2] >= 0 ? tStats[2] : 0)) + EnumChatFormatting.GRAY); - } else { - long tCharge = getRealCharge(aStack); - if (tStats[3] == -2 && tCharge <= 0) { - aList.add( - EnumChatFormatting.AQUA + transItem("010", "Empty. You should recycle it properly.") - + EnumChatFormatting.GRAY); - } else { - aList.add( - EnumChatFormatting.AQUA - + String.format( - transItem("011", "%s / %s EU - Voltage: %s"), - formatNumbers(tCharge), - formatNumbers(Math.abs(tStats[0])), - "" + V[(int) (tStats[2] >= 0 ? tStats[2] < V.length ? tStats[2] : V.length - 1 : 1)]) - + EnumChatFormatting.GRAY); - } - } - } - - tStats = getFluidContainerStats(aStack); - if (tStats != null && tStats[0] > 0) { - FluidStack tFluid = getFluidContent(aStack); - aList.add( - EnumChatFormatting.BLUE + ((tFluid == null ? transItem("012", "No Fluids Contained") - : GT_Utility.getFluidName(tFluid, true))) + EnumChatFormatting.GRAY); - aList.add( - EnumChatFormatting.BLUE + String.format( - transItem("013", "%sL / %sL"), - "" + (tFluid == null ? 0 : formatNumbers(tFluid.amount)), - "" + formatNumbers(tStats[0])) + EnumChatFormatting.GRAY); - } - - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - if (tList != null) for (IItemBehaviour tBehavior : tList) - aList = tBehavior.getAdditionalToolTips(this, aList, aStack); - - addAdditionalToolTips(aList, aStack, aPlayer); - } - - @Override - public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) { - ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); - if (tList != null) for (IItemBehaviour tBehavior : tList) - tBehavior.onUpdate(this, aStack, aWorld, aPlayer, aTimer, aIsInHand); - } - - @Override - public final boolean canProvideEnergy(ItemStack aStack) { - Long[] tStats = getElectricStats(aStack); - if (tStats == null) return false; - return tStats[3] > 0 || (aStack.stackSize == 1 && (tStats[3] == -2 || tStats[3] == -3)); - } - - @Override - public final double getMaxCharge(ItemStack aStack) { - Long[] tStats = getElectricStats(aStack); - if (tStats == null) return 0; - return Math.abs(tStats[0]); - } - - @Override - public final double getTransferLimit(ItemStack aStack) { - Long[] tStats = getElectricStats(aStack); - if (tStats == null) return 0; - return Math.max(tStats[1], tStats[3]); - } - - @Override - public final double charge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit, - boolean aSimulate) { - Long[] tStats = getElectricStats(aStack); - if (tStats == null || tStats[2] > aTier - || !(tStats[3] == -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE)) - || aStack.stackSize != 1) return 0; - long tTransfer = aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge); - long tChargeBefore = getRealCharge(aStack), tNewCharge = Math.min( - Math.abs(tStats[0]), - Long.MAX_VALUE - tTransfer >= tChargeBefore ? tChargeBefore + tTransfer : Long.MAX_VALUE); - if (!aSimulate) setCharge(aStack, tNewCharge); - return tNewCharge - tChargeBefore; - } - - @Override - public final double discharge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit, - boolean aBatteryAlike, boolean aSimulate) { - Long[] tStats = getElectricStats(aStack); - if (tStats == null || tStats[2] > aTier) return 0; - if (aBatteryAlike && !canProvideEnergy(aStack)) return 0; - if (tStats[3] > 0) { - if (aCharge < tStats[3] || aStack.stackSize < 1) return 0; - if (!aSimulate) aStack.stackSize--; - return tStats[3]; - } - long tChargeBefore = getRealCharge(aStack), tNewCharge = Math - .max(0, tChargeBefore - (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge))); - if (!aSimulate) setCharge(aStack, tNewCharge); - return tChargeBefore - tNewCharge; - } - - @Override - public final double getCharge(ItemStack aStack) { - return getRealCharge(aStack); - } - - @Override - public final boolean canUse(ItemStack aStack, double aAmount) { - return getRealCharge(aStack) >= aAmount; - } - - @Override - public final boolean use(ItemStack aStack, double aAmount, EntityLivingBase aPlayer) { - chargeFromArmor(aStack, aPlayer); - if (aPlayer instanceof EntityPlayer && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) return true; - double tTransfer = discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true); - if (Math.abs(tTransfer - aAmount) < .0000001) { - discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false); - chargeFromArmor(aStack, aPlayer); - return true; - } - discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false); - chargeFromArmor(aStack, aPlayer); - return false; - } - - @Override - public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) { - if (aPlayer == null || aPlayer.worldObj.isRemote) return; - for (int i = 1; i < 5; i++) { - ItemStack tArmor = aPlayer.getEquipmentInSlot(i); - if (GT_ModHandler.isElectricItem(tArmor)) { - IElectricItem tArmorItem = (IElectricItem) tArmor.getItem(); - if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >= getTier(aStack)) { - double tCharge = ElectricItem.manager.discharge( - tArmor, - charge(aStack, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, true, true), - Integer.MAX_VALUE, - true, - true, - false); - if (tCharge > 0) { - charge(aStack, tCharge, Integer.MAX_VALUE, true, false); - if (aPlayer instanceof EntityPlayer) { - Container tContainer = ((EntityPlayer) aPlayer).openContainer; - if (tContainer != null) tContainer.detectAndSendChanges(); - } - } - } - } - } - } - - /* - * @Override public final int getMaxCharge(ItemStack aStack) { Long[] tStats = getElectricStats(aStack); if (tStats - * == null) return 0; return (int)Math.abs(tStats[0]); } - * @Override public final int getTransferLimit(ItemStack aStack) { Long[] tStats = getElectricStats(aStack); if - * (tStats == null) return 0; return (int)Math.max(tStats[1], tStats[3]); } - * @Override public final int charge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit, boolean - * aSimulate) { Long[] tStats = getElectricStats(aStack); if (tStats == null || tStats[2] > aTier || !(tStats[3] == - * -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE)) || aStack.stackSize != 1) return 0; - * long tChargeBefore = getRealCharge(aStack), tNewCharge = - * aCharge==Integer.MAX_VALUE?Long.MAX_VALUE:Math.min(Math.abs(tStats[0]), tChargeBefore + - * (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge))); if (!aSimulate) setCharge(aStack, tNewCharge); - * return (int)(tNewCharge-tChargeBefore); } - * @Override public final int discharge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit, - * boolean aSimulate) { Long[] tStats = getElectricStats(aStack); if (tStats == null || tStats[2] > aTier) return 0; - * if (tStats[3] > 0) { if (aCharge < tStats[3] || aStack.stackSize < 1) return 0; if (!aSimulate) - * aStack.stackSize--; return (int)(long)tStats[3]; } long tChargeBefore = getRealCharge(aStack), tNewCharge = - * Math.max(0, tChargeBefore - (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge))); if (!aSimulate) - * setCharge(aStack, tNewCharge); return (int)(tChargeBefore-tNewCharge); } - * @Override public final int getCharge(ItemStack aStack) { return (int)Math.min(Integer.MAX_VALUE, - * getRealCharge(aStack)); } - * @Override public final boolean canUse(ItemStack aStack, int aAmount) { return getRealCharge(aStack) >= aAmount; } - * @Override public final boolean use(ItemStack aStack, int aAmount, EntityLivingBase aPlayer) { - * chargeFromArmor(aStack, aPlayer); if (aPlayer instanceof EntityPlayer && - * ((EntityPlayer)aPlayer).capabilities.isCreativeMode) return true; int tTransfer = discharge(aStack, aAmount, - * Integer.MAX_VALUE, true, true); if (tTransfer == aAmount) { discharge(aStack, aAmount, Integer.MAX_VALUE, true, - * false); chargeFromArmor(aStack, aPlayer); return true; } discharge(aStack, aAmount, Integer.MAX_VALUE, true, - * false); chargeFromArmor(aStack, aPlayer); return false; } - * @Override public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) { if (aPlayer == null || - * aPlayer.worldObj.isRemote) return; for (int i = 1; i < 5; i++) { ItemStack tArmor = - * aPlayer.getEquipmentInSlot(i); if (GT_ModHandler.isElectricItem(tArmor)) { IElectricItem tArmorItem = - * (IElectricItem)tArmor.getItem(); if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >= - * getTier(aStack)) { int tCharge = ElectricItem.manager.discharge(tArmor, charge(aStack, Integer.MAX_VALUE-1, - * Integer.MAX_VALUE, true, true), Integer.MAX_VALUE, true, false); if (tCharge > 0) { charge(aStack, tCharge, - * Integer.MAX_VALUE, true, false); if (aPlayer instanceof EntityPlayer) { Container tContainer = - * ((EntityPlayer)aPlayer).openContainer; if (tContainer != null) tContainer.detectAndSendChanges(); } } } } } } - */ - public final long getRealCharge(ItemStack aStack) { - Long[] tStats = getElectricStats(aStack); - if (tStats == null) return 0; - if (tStats[3] > 0) return (int) (long) tStats[3]; - NBTTagCompound tNBT = aStack.getTagCompound(); - return tNBT == null ? 0 : tNBT.getLong("GT.ItemCharge"); - } - - public final boolean setCharge(ItemStack aStack, long aCharge) { - Long[] tStats = getElectricStats(aStack); - if (tStats == null || tStats[3] > 0) return false; - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) tNBT = new NBTTagCompound(); - tNBT.removeTag("GT.ItemCharge"); - aCharge = Math.min(tStats[0] < 0 ? Math.abs(tStats[0] / 2) : aCharge, Math.abs(tStats[0])); - if (aCharge > 0) { - aStack.setItemDamage(getChargedMetaData(aStack)); - tNBT.setLong("GT.ItemCharge", aCharge); - } else { - aStack.setItemDamage(getEmptyMetaData(aStack)); - } - if (tNBT.hasNoTags()) aStack.setTagCompound(null); - else aStack.setTagCompound(tNBT); - isItemStackUsable(aStack); - return true; - } - - public short getChargedMetaData(ItemStack aStack) { - return (short) aStack.getItemDamage(); - } - - public short getEmptyMetaData(ItemStack aStack) { - return (short) aStack.getItemDamage(); - } - - @Override - public FluidStack getFluid(ItemStack aStack) { - return getFluidContent(aStack); - } - - @Override - public int getCapacity(ItemStack aStack) { - Long[] tStats = getFluidContainerStats(aStack); - return tStats == null ? 0 : (int) Math.max(0, tStats[0]); - } - - @Override - public int fill(ItemStack aStack, FluidStack aFluid, boolean doFill) { - if (aStack == null || aStack.stackSize != 1) return 0; - - ItemStack tStack = GT_Utility.fillFluidContainer(aFluid, aStack, false, false); - if (tStack != null) { - aStack.setItemDamage(tStack.getItemDamage()); - aStack.func_150996_a(tStack.getItem()); - return GT_Utility.getFluidForFilledItem(tStack, false).amount; - } - - Long[] tStats = getFluidContainerStats(aStack); - if (tStats == null || tStats[0] <= 0 - || aFluid == null - || aFluid.getFluid() - .getID() <= 0 - || aFluid.amount <= 0) return 0; - - FluidStack tFluid = getFluidContent(aStack); - - if (tFluid == null || tFluid.getFluid() - .getID() <= 0) { - if (aFluid.amount <= tStats[0]) { - if (doFill) { - setFluidContent(aStack, aFluid); - } - return aFluid.amount; - } - if (doFill) { - tFluid = aFluid.copy(); - tFluid.amount = (int) (long) tStats[0]; - setFluidContent(aStack, tFluid); - } - return (int) (long) tStats[0]; - } - - if (!tFluid.isFluidEqual(aFluid)) return 0; - - int space = (int) (long) tStats[0] - tFluid.amount; - if (aFluid.amount <= space) { - if (doFill) { - tFluid.amount += aFluid.amount; - setFluidContent(aStack, tFluid); - } - return aFluid.amount; - } - if (doFill) { - tFluid.amount = (int) (long) tStats[0]; - setFluidContent(aStack, tFluid); - } - return space; - } - - @Override - public FluidStack drain(ItemStack aStack, int maxDrain, boolean doDrain) { - if (aStack == null || aStack.stackSize != 1) return null; - - FluidStack tFluid = GT_Utility.getFluidForFilledItem(aStack, false); - if (tFluid != null && maxDrain >= tFluid.amount) { - ItemStack tStack = GT_Utility.getContainerItem(aStack, false); - if (tStack == null) { - if (doDrain) aStack.stackSize = 0; - return tFluid; - } - if (doDrain) { - aStack.setItemDamage(tStack.getItemDamage()); - aStack.func_150996_a(tStack.getItem()); - } - return tFluid; - } - - Long[] tStats = getFluidContainerStats(aStack); - if (tStats == null || tStats[0] <= 0) return null; - - tFluid = getFluidContent(aStack); - if (tFluid == null) return null; - - int used = maxDrain; - if (tFluid.amount < used) used = tFluid.amount; - if (doDrain) { - tFluid.amount -= used; - setFluidContent(aStack, tFluid); - } - - FluidStack drained = tFluid.copy(); - drained.amount = used; - return drained; - } - - public FluidStack getFluidContent(ItemStack aStack) { - Long[] tStats = getFluidContainerStats(aStack); - if (tStats == null || tStats[0] <= 0) return GT_Utility.getFluidForFilledItem(aStack, false); - NBTTagCompound tNBT = aStack.getTagCompound(); - return tNBT == null ? null : FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("GT.FluidContent")); - } - - public void setFluidContent(ItemStack aStack, FluidStack aFluid) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) tNBT = new NBTTagCompound(); - else tNBT.removeTag("GT.FluidContent"); - if (aFluid != null && aFluid.amount > 0) - tNBT.setTag("GT.FluidContent", aFluid.writeToNBT(new NBTTagCompound())); - if (tNBT.hasNoTags()) aStack.setTagCompound(null); - else aStack.setTagCompound(tNBT); - isItemStackUsable(aStack); - } - - @Override - public int getItemStackLimit(ItemStack aStack) { - Long[] tStats = getElectricStats(aStack); - if (tStats != null && (tStats[3] == -1 || tStats[3] == -2 || tStats[3] == -3) && getRealCharge(aStack) > 0) - return 1; - tStats = getFluidContainerStats(aStack); - if (tStats != null) return (int) (long) tStats[1]; - if (getDamage(aStack) == 32763) return 1; - return 64; - } - - @Override - public final Item getChargedItem(ItemStack itemStack) { - return this; - } - - @Override - public final Item getEmptyItem(ItemStack itemStack) { - return this; - } - - @Override - public final int getTier(ItemStack aStack) { - Long[] tStats = getElectricStats(aStack); - return (int) (tStats == null ? Integer.MAX_VALUE : tStats[2]); - } - - @Override - public final String getToolTip(ItemStack aStack) { - return null; - } // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up at this Point - - @Override - public final IElectricItemManager getManager(ItemStack aStack) { - return this; - } // We are our own Manager - - @Override - public final boolean getShareTag() { - return true; - } // just to be sure. - - @Override - public int getItemEnchantability() { - return 0; - } - - @Override - public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { - return false; - } - - @Override - public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { - return false; - } -} diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java deleted file mode 100644 index 465c4bc9d6..0000000000 --- a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java +++ /dev/null @@ -1,415 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.enums.GT_Values.D1; -import static gregtech.api.enums.Mods.AppleCore; -import static gregtech.api.enums.Mods.GregTech; -import static gregtech.api.recipe.RecipeMaps.cannerRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -import cpw.mods.fml.common.Optional; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.Mods; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TC_Aspects.TC_AspectStack; -import gregtech.api.interfaces.IFoodStat; -import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.interfaces.IItemContainer; -import gregtech.api.objects.ItemData; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.items.GT_GeneratedMaterial_Renderer; -import squeek.applecore.api.food.FoodValues; -import squeek.applecore.api.food.IEdible; -import squeek.applecore.api.food.ItemFoodProxy; - -/** - * @author Gregorius Techneticies - *

- * One Item for everything! - *

- * 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. - *

- * 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. - *

- * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike - * Item. - */ -@Optional.Interface(iface = "squeek.applecore.api.food.IEdible", modid = Mods.Names.APPLE_CORE) -public abstract class GT_MetaGenerated_Item extends GT_MetaBase_Item implements IGT_ItemWithMaterialRenderer, IEdible { - - /** - * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this - * Type, if useStandardMetaItemRenderer() returns true. - *

- * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item. - */ - public static final ConcurrentHashMap sInstances = new ConcurrentHashMap<>(); - - /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */ - - public final short mOffset, mItemAmount; - public final BitSet mEnabledItems; - public final BitSet mVisibleItems; - public final IIcon[][] mIconList; - - public final ConcurrentHashMap mFoodStats = new ConcurrentHashMap<>(); - public final ConcurrentHashMap mElectricStats = new ConcurrentHashMap<>(); - public final ConcurrentHashMap mFluidContainerStats = new ConcurrentHashMap<>(); - public final ConcurrentHashMap mBurnValues = new ConcurrentHashMap<>(); - - /** - * Creates the Item using these Parameters. - * - * @param aUnlocalized The Unlocalized Name of this Item. - */ - public GT_MetaGenerated_Item(String aUnlocalized, short aOffset, short aItemAmount) { - super(aUnlocalized); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - setHasSubtypes(true); - setMaxDamage(0); - mEnabledItems = new BitSet(aItemAmount); - mVisibleItems = new BitSet(aItemAmount); - - mOffset = (short) Math.min(32766, aOffset); - mItemAmount = (short) Math.min(aItemAmount, 32766 - mOffset); - mIconList = new IIcon[aItemAmount][1]; - - sInstances.put(getUnlocalizedName(), this); - } - - /** - * This adds a Custom Item to the ending Range. - * - * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset) - * @param aEnglish The Default Localized Name of the created Item - * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip - * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things. - * @return An ItemStack containing the newly created Item. - */ - public final ItemStack addItem(int aID, String aEnglish, String aToolTip, Object... aRandomData) { - if (aToolTip == null) aToolTip = ""; - if (aID >= 0 && aID < mItemAmount) { - ItemStack rStack = new ItemStack(this, 1, mOffset + aID); - if (mEnabledItems.get(aID)) { - throw new IllegalArgumentException( - String.format("ID %s is already reserved for %s!", aID, rStack.getDisplayName())); - } - mEnabledItems.set(aID); - mVisibleItems.set(aID); - GT_LanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".name", aEnglish); - GT_LanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".tooltip", aToolTip); - List tAspects = new ArrayList<>(); - // Important Stuff to do first - for (Object tRandomData : aRandomData) if (tRandomData instanceof SubTag) { - if (tRandomData == SubTag.INVISIBLE) { - mVisibleItems.set(aID, false); - continue; - } - if (tRandomData == SubTag.NO_UNIFICATION) { - GT_OreDictUnificator.addToBlacklist(rStack); - } - } - // now check for the rest - for (Object tRandomData : aRandomData) if (tRandomData != null) { - boolean tUseOreDict = true; - if (tRandomData instanceof IFoodStat) { - setFoodBehavior(mOffset + aID, (IFoodStat) tRandomData); - if (((IFoodStat) tRandomData).getFoodAction(this, rStack) == EnumAction.eat) { - int tFoodValue = ((IFoodStat) tRandomData).getFoodLevel(this, rStack, null); - if (tFoodValue > 0) { - GT_Values.RA.stdBuilder() - .itemInputs(rStack, ItemList.IC2_Food_Can_Empty.get(tFoodValue)) - .itemOutputs( - ((IFoodStat) tRandomData).isRotten(this, rStack, null) - ? ItemList.IC2_Food_Can_Spoiled.get(tFoodValue) - : ItemList.IC2_Food_Can_Filled.get(tFoodValue)) - .duration(tFoodValue * 5 * SECONDS) - .eut(1) - .addTo(cannerRecipes); - } - } - tUseOreDict = false; - } - if (tRandomData instanceof IItemBehaviour) { - // The cast below from is not safe. If you know how to make it safe, please do. - // noinspection unchecked - addItemBehavior(mOffset + aID, (IItemBehaviour) tRandomData); - tUseOreDict = false; - } - if (tRandomData instanceof IItemContainer) { - ((IItemContainer) tRandomData).set(rStack); - tUseOreDict = false; - } - if (tRandomData instanceof SubTag) { - continue; - } - if (tRandomData instanceof TC_AspectStack) { - ((TC_AspectStack) tRandomData).addToAspectList(tAspects); - continue; - } - if (tRandomData instanceof ItemData) { - if (GT_Utility.isStringValid(tRandomData)) GT_OreDictUnificator.registerOre(tRandomData, rStack); - else GT_OreDictUnificator.addItemData(rStack, (ItemData) tRandomData); - continue; - } - if (tUseOreDict) { - GT_OreDictUnificator.registerOre(tRandomData, rStack); - } - } - if (GregTech_API.sThaumcraftCompat != null) - GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false); - return rStack; - } - return null; - } - - /** - * Sets a Food Behavior for the Item. - * - * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] - * @param aFoodBehavior the Food Behavior you want to add. - * @return the Item itself for convenience in constructing. - */ - public final GT_MetaGenerated_Item setFoodBehavior(int aMetaValue, IFoodStat aFoodBehavior) { - if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this; - if (aFoodBehavior == null) mFoodStats.remove((short) aMetaValue); - else mFoodStats.put((short) aMetaValue, aFoodBehavior); - return this; - } - - /** - * Sets the Furnace Burn Value for the Item. - * - * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] - * @param aValue 200 = 1 Burn Process = 500 EU, max = 32767 (that is 81917.5 EU) - * @return the Item itself for convenience in constructing. - */ - public final GT_MetaGenerated_Item setBurnValue(int aMetaValue, int aValue) { - if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length() || aValue < 0) return this; - if (aValue == 0) mBurnValues.remove((short) aMetaValue); - else mBurnValues.put((short) aMetaValue, aValue > Short.MAX_VALUE ? Short.MAX_VALUE : (short) aValue); - return this; - } - - /** - * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] - * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior) - * @param aTransferLimit Transfer Limit. - * @param aTier The electric Tier. - * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to - * make this Battery chargeable (the use and canUse Functions will still discharge if you just - * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make - * this Battery charge/discharge-able. - * @return the Item itself for convenience in constructing. - */ - public final GT_MetaGenerated_Item setElectricStats(int aMetaValue, long aMaxCharge, long aTransferLimit, - long aTier, long aSpecialData, boolean aUseAnimations) { - if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this; - if (aMaxCharge == 0) mElectricStats.remove((short) aMetaValue); - else { - mElectricStats.put( - (short) aMetaValue, - new Long[] { aMaxCharge, Math.max(0, aTransferLimit), Math.max(-1, aTier), aSpecialData }); - if (aMetaValue >= mOffset && aUseAnimations) mIconList[aMetaValue - mOffset] = Arrays - .copyOf(mIconList[aMetaValue - mOffset], Math.max(9, mIconList[aMetaValue - mOffset].length)); - } - return this; - } - - /** - * - * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] - * @param aCapacity fluid capacity in L or mb - * @param aStacksize item stack size - * @return the Item itself for convenience in constructing. - */ - public final GT_MetaGenerated_Item setFluidContainerStats(int aMetaValue, long aCapacity, long aStacksize) { - if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this; - if (aCapacity < 0) mElectricStats.remove((short) aMetaValue); - else mFluidContainerStats.put((short) aMetaValue, new Long[] { aCapacity, Math.max(1, aStacksize) }); - return this; - } - - /** - * @return if this MetaGenerated Item should use my Default Renderer System. - */ - public boolean useStandardMetaItemRenderer() { - return true; - } - - @Override - public short[] getRGBa(ItemStack aStack) { - return Materials._NULL.getRGBA(); - } - - /** - * @return the Icon the Material is going to be rendered with. - */ - public IIconContainer getIconContainer(int aMetaData) { - return null; - } - - @Override - public IIcon getIcon(int aMetaData, int pass) { - IIconContainer iconContainer = getIconContainer(aMetaData); - return iconContainer != null ? iconContainer.getIcon() : null; - } - - @Override - public IIcon getOverlayIcon(int aMetaData, int pass) { - IIconContainer iconContainer = getIconContainer(aMetaData); - return iconContainer != null ? iconContainer.getOverlayIcon() : null; - } - - @Override - public boolean shouldUseCustomRenderer(int aMetaData) { - return true; - } - - @Override - public GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData) { - return null; - } - - @Override - public boolean allowMaterialRenderer(int aMetaData) { - return aMetaData < this.mOffset; - } - - /* ---------- INTERNAL OVERRIDES ---------- */ - - @Override - public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); - if (tStat != null && aPlayer.canEat(tStat.alwaysEdible(this, aStack, aPlayer))) - aPlayer.setItemInUse(aStack, 32); - return super.onItemRightClick(aStack, aWorld, aPlayer); - } - - @Override - public int getMaxItemUseDuration(ItemStack aStack) { - return mFoodStats.get((short) getDamage(aStack)) == null ? 0 : 32; - } - - @Override - public EnumAction getItemUseAction(ItemStack aStack) { - IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); - return tStat == null ? EnumAction.none : tStat.getFoodAction(this, aStack); - } - - @Override - public final ItemStack onEaten(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); - if (tStat != null) { - if (AppleCore.isModLoaded()) { - aPlayer.getFoodStats() - .func_151686_a(getFoodProxy(this), aStack); - } else { - aPlayer.getFoodStats() - .addStats(tStat.getFoodLevel(this, aStack, aPlayer), tStat.getSaturation(this, aStack, aPlayer)); - } - tStat.onEaten(this, aStack, aPlayer); - } - return aStack; - } - - @Optional.Method(modid = Mods.Names.APPLE_CORE) - private static ItemFood getFoodProxy(Object edible) { - return new ItemFoodProxy((IEdible) edible); - } - - @Override - @Optional.Method(modid = Mods.Names.APPLE_CORE) - public FoodValues getFoodValues(ItemStack aStack) { - IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); - return tStat == null ? null - : new FoodValues(tStat.getFoodLevel(this, aStack, null), tStat.getSaturation(this, aStack, null)); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { - int j = mEnabledItems.length(); - for (int i = 0; i < j; i++) if (mVisibleItems.get(i) || (D1 && mEnabledItems.get(i))) { - Long[] tStats = mElectricStats.get((short) (mOffset + i)); - if (tStats != null && tStats[3] < 0) { - ItemStack tStack = new ItemStack(this, 1, mOffset + i); - setCharge(tStack, Math.abs(tStats[0])); - isItemStackUsable(tStack); - aList.add(tStack); - } - if (tStats == null || tStats[3] != -2) { - ItemStack tStack = new ItemStack(this, 1, mOffset + i); - isItemStackUsable(tStack); - aList.add(tStack); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public final void registerIcons(IIconRegister aIconRegister) { - short j = (short) mEnabledItems.length(); - for (short i = 0; i < j; i++) if (mEnabledItems.get(i)) { - for (byte k = 1; k < mIconList[i].length; k++) { - mIconList[i][k] = aIconRegister.registerIcon( - GregTech.getResourcePath(GT_Config.troll ? "troll" : getUnlocalizedName() + "/" + i + "/" + k)); - } - mIconList[i][0] = aIconRegister - .registerIcon(GregTech.getResourcePath(GT_Config.troll ? "troll" : getUnlocalizedName() + "/" + i)); - } - } - - @Override - public final Long[] getElectricStats(ItemStack aStack) { - return mElectricStats.get((short) aStack.getItemDamage()); - } - - @Override - public final Long[] getFluidContainerStats(ItemStack aStack) { - return mFluidContainerStats.get((short) aStack.getItemDamage()); - } - - @Override - public int getItemEnchantability() { - return 0; - } - - @Override - public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { - return false; - } - - @Override - public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { - return false; - } -} diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java deleted file mode 100644 index db41a3c35b..0000000000 --- a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java +++ /dev/null @@ -1,213 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.enums.GT_Values.M; - -import java.util.List; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; - -/** - * @author Gregorius Techneticies - *

- * One Item for everything! - *

- * 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. - *

- * 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. - *

- * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike - * Item. - */ -public abstract class GT_MetaGenerated_Item_X01 extends GT_MetaGenerated_Item { - - protected final OrePrefixes mPrefix; - protected final int mIconSetIndex; - - /** - * Creates the Item using these Parameters. This is for the new 1 Item = 1 Prefix System. - * - * @param aUnlocalized The Unlocalized Name of this Item. - * @param aGeneratedPrefix The OreDict Prefix you want to have generated. - * @param aIconSetIndex The TextureSet Index to be used. -1 for Defaulting to the Data contained in the Prefix. - * (this is only to be used for selecting the Icon in getIconContainer, nothing else) - */ - public GT_MetaGenerated_Item_X01(String aUnlocalized, OrePrefixes aGeneratedPrefix, int aIconSetIndex) { - super(aUnlocalized, (short) 32000, (short) 766); - mPrefix = aGeneratedPrefix; - mIconSetIndex = aIconSetIndex >= 0 ? aIconSetIndex - : aGeneratedPrefix.mTextureIndex >= 0 ? aGeneratedPrefix.mTextureIndex : 0; - - for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++) { - OrePrefixes tPrefix = mPrefix; - if (tPrefix == null) continue; - Materials tMaterial = GregTech_API.sGeneratedMaterials[i]; - if (tMaterial == null) continue; - if (mPrefix.doGenerateItem(tMaterial)) { - ItemStack tStack = new ItemStack(this, 1, i); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".name", - GT_LanguageManager.i18nPlaceholder ? getDefaultLocalizationFormat(tPrefix, tMaterial, i) - : getDefaultLocalization(tPrefix, tMaterial, i)); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".tooltip", - tMaterial.getToolTip(tPrefix.mMaterialAmount / M)); - String tOreName = getOreDictString(tPrefix, tMaterial); - tPrefix = OrePrefixes.getOrePrefix(tOreName); - if (tPrefix != null && tPrefix.mIsUnificatable) { - GT_OreDictUnificator.set(tPrefix, OrePrefixes.getMaterial(tOreName, tPrefix), tStack); - } else { - GT_OreDictUnificator.registerOre(tOreName, tStack); - } - } - } - } - - /* ---------- OVERRIDEABLE FUNCTIONS ---------- */ - - /** - * @param aPrefix the OreDict Prefix - * @param aMaterial the Material - * @param aMetaData a Index from [0 - 31999] - * @return the Localized Name when default LangFiles are used. - */ - public String getDefaultLocalization(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { - return aPrefix.getDefaultLocalNameForItem(aMaterial); - } - - /** - * @param aPrefix the OreDict Prefix - * @param aMaterial the Material - * @param aMetaData a Index from [0 - 31999] - * @return the Localized Name Format when default LangFiles are used. - */ - public String getDefaultLocalizationFormat(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { - return aPrefix.getDefaultLocalNameFormatForItem(aMaterial); - } - - /** - * @param aPrefix always != null - * @param aMaterial always != null - * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny - * Dusts or Crushed Ores as well. - * @return if this Item should be visible in NEI or Creative - */ - public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { - return true; - } - - /** - * @return the name of the Item to be registered at the OreDict. - */ - public String getOreDictString(OrePrefixes aPrefix, Materials aMaterial) { - return aPrefix.get(aMaterial) - .toString(); - } - - public IIconContainer getIconContainer(int aMetaData, Materials aMaterial) { - return aMaterial.mIconSet.mTextures[mIconSetIndex]; - } - - /* ---------- INTERNAL OVERRIDES ---------- */ - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - String aName = super.getItemStackDisplayName(aStack); - int aDamage = aStack.getItemDamage(); - if (aDamage < 32000 && aDamage >= 0) return Materials.getLocalizedNameForItem(aName, aDamage % 1000); - return aName; - } - - @Override - public ItemStack getContainerItem(ItemStack aStack) { - int aMetaData = aStack.getItemDamage(); - if (aMetaData < GregTech_API.sGeneratedMaterials.length && aMetaData >= 0) { - Materials aMaterial = GregTech_API.sGeneratedMaterials[aMetaData]; - if (aMaterial != null && aMaterial != Materials.Empty && aMaterial != Materials._NULL) { - return GT_Utility.copyAmount(1, mPrefix.mContainerItem); - } - } - return null; - } - - @Override - public short[] getRGBa(ItemStack aStack) { - int aMetaData = getDamage(aStack); - return aMetaData < GregTech_API.sGeneratedMaterials.length - && GregTech_API.sGeneratedMaterials[aMetaData] != null ? GregTech_API.sGeneratedMaterials[aMetaData].mRGBa - : Materials._NULL.mRGBa; - } - - @Override - public final IIconContainer getIconContainer(int aMetaData) { - return aMetaData < GregTech_API.sGeneratedMaterials.length - && GregTech_API.sGeneratedMaterials[aMetaData] != null - ? getIconContainer(aMetaData, GregTech_API.sGeneratedMaterials[aMetaData]) - : null; - } - - @Override - @SideOnly(Side.CLIENT) - public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++) - if (mPrefix.doGenerateItem(GregTech_API.sGeneratedMaterials[i]) && doesShowInCreative( - mPrefix, - GregTech_API.sGeneratedMaterials[i], - GregTech_API.sDoShowAllItemsInCreative)) { - ItemStack tStack = new ItemStack(this, 1, i); - isItemStackUsable(tStack); - aList.add(tStack); - } - super.getSubItems(aItem, aCreativeTab, aList); - } - - @Override - public final IIcon getIconFromDamage(int aMetaData) { - if (aMetaData < 0) return null; - if (aMetaData < GregTech_API.sGeneratedMaterials.length) { - Materials tMaterial = GregTech_API.sGeneratedMaterials[aMetaData]; - if (tMaterial == null) return null; - IIconContainer tIcon = getIconContainer(aMetaData, tMaterial); - if (tIcon != null) return tIcon.getIcon(); - return null; - } - return aMetaData >= mOffset && aMetaData - mOffset < mIconList.length ? mIconList[aMetaData - mOffset][0] - : null; - } - - @Override - public int getItemStackLimit(ItemStack aStack) { - return getDamage(aStack) < mOffset ? Math.min(super.getItemStackLimit(aStack), mPrefix.mDefaultStackSize) - : super.getItemStackLimit(aStack); - } - - @Override - public int getItemEnchantability() { - return 0; - } - - @Override - public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { - return false; - } - - @Override - public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { - return false; - } -} diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java deleted file mode 100644 index c344397e4e..0000000000 --- a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java +++ /dev/null @@ -1,225 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.enums.GT_Values.M; - -import java.util.Arrays; -import java.util.List; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.items.GT_GeneratedMaterial_Renderer; - -/** - * @author Gregorius Techneticies - *

- * One Item for everything! - *

- * 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. - *

- * 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. - *

- * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike - * Item. - */ -public abstract class GT_MetaGenerated_Item_X32 extends GT_MetaGenerated_Item { - - protected final OrePrefixes[] mGeneratedPrefixList; - - /** - * Creates the Item using these Parameters. - * - * @param aUnlocalized The Unlocalized Name of this Item. - * @param aGeneratedPrefixList The OreDict Prefixes you want to have generated. - */ - public GT_MetaGenerated_Item_X32(String aUnlocalized, OrePrefixes... aGeneratedPrefixList) { - super(aUnlocalized, (short) 32000, (short) 766); - mGeneratedPrefixList = Arrays.copyOf(aGeneratedPrefixList, 32); - - for (int i = 0; i < 32000; i++) { - OrePrefixes tPrefix = mGeneratedPrefixList[i / 1000]; - if (tPrefix == null) continue; - if (tPrefix == OrePrefixes.___placeholder___) continue; - Materials tMaterial = GregTech_API.sGeneratedMaterials[i % 1000]; - if (tMaterial == null) continue; - if (doesMaterialAllowGeneration(tPrefix, tMaterial)) { - ItemStack tStack = new ItemStack(this, 1, i); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".name", - GT_LanguageManager.i18nPlaceholder ? getDefaultLocalizationFormat(tPrefix, tMaterial, i) - : getDefaultLocalization(tPrefix, tMaterial, i)); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".tooltip", - tMaterial.getToolTip(tPrefix.mMaterialAmount / M)); - if (tPrefix.mIsUnificatable) { - GT_OreDictUnificator.set(tPrefix, tMaterial, tStack); - } else { - GT_OreDictUnificator.registerOre(tPrefix.get(tMaterial), tStack); - } - if ((tPrefix == OrePrefixes.stick || tPrefix == OrePrefixes.wireFine || tPrefix == OrePrefixes.ingot) - && (tMaterial == Materials.Lead || tMaterial == Materials.Tin - || tMaterial == Materials.SolderingAlloy)) { - GregTech_API.sSolderingMetalList.add(tStack); - GT_ModHandler.registerBoxableItemToToolBox(tStack); - } - } - } - } - - /* ---------- OVERRIDEABLE FUNCTIONS ---------- */ - - /** - * @return the Color Modulation the Material is going to be rendered with. - */ - @Override - public short[] getRGBa(ItemStack aStack) { - Materials tMaterial = GregTech_API.sGeneratedMaterials[getDamage(aStack) % 1000]; - return tMaterial == null ? Materials._NULL.mRGBa : tMaterial.mRGBa; - } - - /** - * @param aPrefix this can be null, you have to return false in that case - * @param aMaterial this can be null, you have to return false in that case - * @return if this Item should be generated and visible. - */ - public boolean doesMaterialAllowGeneration(OrePrefixes aPrefix, Materials aMaterial) { - // You have to check for at least these Conditions in every Case! So add a super Call like the following for - // this before executing your Code: - // if (!super.doesMaterialAllowGeneration(aPrefix, aMaterial)) return false; - return aPrefix != null && aPrefix.doGenerateItem(aMaterial); - } - - /* ---------- OVERRIDEABLE FUNCTIONS ---------- */ - - /** - * @param aPrefix the OreDict Prefix - * @param aMaterial the Material - * @param aMetaData a Index from [0 - 31999] - * @return the Localized Name when default LangFiles are used. - */ - public String getDefaultLocalization(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { - return aPrefix.getDefaultLocalNameForItem(aMaterial); - } - - /** - * @param aPrefix the OreDict Prefix - * @param aMaterial the Material - * @param aMetaData a Index from [0 - 31999] - * @return the Localized Name Format when default LangFiles are used. - */ - public String getDefaultLocalizationFormat(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { - return aPrefix.getDefaultLocalNameFormatForItem(aMaterial); - } - - /** - * @param aMetaData a Index from [0 - 31999] - * @param aMaterial the Material - * @return an Icon Container for the Item Display. - */ - public final IIconContainer getIconContainer(int aMetaData, Materials aMaterial) { - return mGeneratedPrefixList[aMetaData / 1000] != null - && mGeneratedPrefixList[aMetaData / 1000].mTextureIndex >= 0 - ? aMaterial.mIconSet.mTextures[mGeneratedPrefixList[aMetaData / 1000].mTextureIndex] - : null; - } - - /** - * @param aPrefix always != null - * @param aMaterial always != null - * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny - * Dusts or Crushed Ores as well. - * @return if this Item should be visible in NEI or Creative - */ - public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { - return true; - } - - /* ---------- INTERNAL OVERRIDES ---------- */ - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - String aName = super.getItemStackDisplayName(aStack); - int aDamage = aStack.getItemDamage(); - if (aDamage < 32000 && aDamage >= 0) return Materials.getLocalizedNameForItem(aName, aDamage % 1000); - return aName; - } - - @Override - public ItemStack getContainerItem(ItemStack aStack) { - int aDamage = aStack.getItemDamage(); - if (aDamage < 32000 && aDamage >= 0) { - Materials aMaterial = GregTech_API.sGeneratedMaterials[aDamage % 1000]; - if (aMaterial != null && aMaterial != Materials.Empty && aMaterial != Materials._NULL) { - OrePrefixes aPrefix = mGeneratedPrefixList[aDamage / 1000]; - if (aPrefix != null) return GT_Utility.copyAmount(1, aPrefix.mContainerItem); - } - } - return null; - } - - @Override - public final IIconContainer getIconContainer(int aMetaData) { - return GregTech_API.sGeneratedMaterials[aMetaData % 1000] == null ? null - : getIconContainer(aMetaData, GregTech_API.sGeneratedMaterials[aMetaData % 1000]); - } - - @Override - public GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData) { - return GregTech_API.sGeneratedMaterials[aMetaData % 1000] == null ? null - : GregTech_API.sGeneratedMaterials[aMetaData % 1000].renderer; - } - - @Override - @SideOnly(Side.CLIENT) - public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < 32000; i++) { - OrePrefixes aPrefix = mGeneratedPrefixList[i / 1000]; - Materials aMaterial = GregTech_API.sGeneratedMaterials[i % 1000]; - if (aPrefix != null && aMaterial != null) { - if (doesMaterialAllowGeneration(aPrefix, aMaterial) - && doesShowInCreative(aPrefix, aMaterial, GregTech_API.sDoShowAllItemsInCreative)) { - ItemStack tStack = new ItemStack(this, 1, i); - isItemStackUsable(tStack); - aList.add(tStack); - } - } - } - super.getSubItems(aItem, aCreativeTab, aList); - } - - @Override - public final IIcon getIconFromDamage(int aMetaData) { - if (aMetaData < 0) return null; - if (aMetaData < 32000) { - Materials tMaterial = GregTech_API.sGeneratedMaterials[aMetaData % 1000]; - if (tMaterial == null) return null; - IIconContainer tIcon = getIconContainer(aMetaData, tMaterial); - if (tIcon != null) return tIcon.getIcon(); - return null; - } - return aMetaData - 32000 < mIconList.length ? mIconList[aMetaData - 32000][0] : null; - } - - @Override - public int getItemStackLimit(ItemStack aStack) { - int tDamage = getDamage(aStack); - if (tDamage < 32000 && mGeneratedPrefixList[tDamage / 1000] != null) - return Math.min(super.getItemStackLimit(aStack), mGeneratedPrefixList[tDamage / 1000].mDefaultStackSize); - return super.getItemStackLimit(aStack); - } -} diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java deleted file mode 100644 index cec93169ec..0000000000 --- a/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java +++ /dev/null @@ -1,1013 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.util.GT_Utility.formatNumbers; -import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Steam.calculateLooseFlow; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.item.EntityMinecart; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.stats.AchievementList; -import net.minecraft.stats.StatList; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.IShearable; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.world.BlockEvent; - -import appeng.api.implementations.items.IAEWrench; -import buildcraft.api.tools.IToolWrench; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.Optional; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import crazypants.enderio.api.tool.ITool; -import forestry.api.arboriculture.IToolGrafter; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enchants.Enchantment_Radioactivity; -import gregtech.api.enums.Materials; -import gregtech.api.enums.TC_Aspects.TC_AspectStack; -import gregtech.api.interfaces.IDamagableItem; -import gregtech.api.interfaces.IToolStats; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.tools.GT_Tool_Turbine; -import mods.railcraft.api.core.items.IToolCrowbar; -import mrtjp.projectred.api.IScrewdriver; - -/** - * This is an example on how you can create a Tool ItemStack, in this case a Bismuth Wrench: - * GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01").getToolWithStats(GT_MetaGenerated_Tool_01.WRENCH, 1, - * Materials.Bismuth, Materials.Bismuth, null); - */ -@Optional.InterfaceList( - value = { - @Optional.Interface(iface = "forestry.api.arboriculture.IToolGrafter", modid = "ForestryAPI|arboriculture"), - @Optional.Interface(iface = "mods.railcraft.api.core.items.IToolCrowbar", modid = "RailcraftAPI|items"), - @Optional.Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraftAPI|tools"), - @Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = "EnderIOAPI|Tools"), - @Optional.Interface(iface = "mrtjp.projectred.api.IScrewdriver", modid = "ProjRed|Core"), }) -public abstract class GT_MetaGenerated_Tool extends GT_MetaBase_Item - implements IDamagableItem, IToolGrafter, IToolCrowbar, IToolWrench, ITool, IScrewdriver, IAEWrench { - - /** - * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this - * Type, if useStandardMetaItemRenderer() returns true. - *

- * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item. - */ - public static final ConcurrentHashMap sInstances = new ConcurrentHashMap<>(); - - /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */ - - public final ConcurrentHashMap mToolStats = new ConcurrentHashMap<>(); - - /** - * Creates the Item using these Parameters. - * - * @param aUnlocalized The Unlocalized Name of this Item. - */ - public GT_MetaGenerated_Tool(String aUnlocalized) { - super(aUnlocalized); - setCreativeTab(GregTech_API.TAB_GREGTECH); - setMaxStackSize(1); - sInstances.put(getUnlocalizedName(), this); - } - - /* ---------- FOR ADDING CUSTOM ITEMS INTO THE REMAINING 766 RANGE ---------- */ - - public static final Materials getPrimaryMaterial(ItemStack aStack) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null) return Materials.getRealMaterial(aNBT.getString("PrimaryMaterial")); - } - return Materials._NULL; - } - - public static final Materials getSecondaryMaterial(ItemStack aStack) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null) return Materials.getRealMaterial(aNBT.getString("SecondaryMaterial")); - } - return Materials._NULL; - } - - /* ---------- INTERNAL OVERRIDES ---------- */ - - public static final long getToolMaxDamage(ItemStack aStack) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null) return aNBT.getLong("MaxDamage"); - } - return 0; - } - - public static final long getToolDamage(ItemStack aStack) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null) return aNBT.getLong("Damage"); - } - return 0; - } - - public static final boolean setToolDamage(ItemStack aStack, long aDamage) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null) { - aNBT.setLong("Damage", aDamage); - return true; - } - } - return false; - } - - public static final boolean setToolMode(ItemStack aStack, byte aMode) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null) { - aNBT.setByte("Mode", aMode); - return true; - } - } - return false; - } - - public static final byte getToolMode(ItemStack aStack) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null) return aNBT.getByte("Mode"); - } - return 0; - } - - /** - * This adds a Custom Item to the ending Range. - * - * @param aID The Id of the assigned Tool Class [0 - 32765] (only even Numbers allowed! Uneven - * ID's are empty electric Items) - * @param aEnglish The Default Localized Name of the created Item - * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no - * ToolTip - * @param aToolStats The Food Value of this Item. Can be null as well. - * @param aOreDictNamesAndAspects The OreDict Names you want to give the Item. Also used to assign Thaumcraft - * Aspects. - * @return An ItemStack containing the newly created Item, but without specific Stats. - */ - public final ItemStack addTool(int aID, String aEnglish, String aToolTip, IToolStats aToolStats, - Object... aOreDictNamesAndAspects) { - if (aToolTip == null) aToolTip = ""; - if (aID >= 0 && aID < 32766 && aID % 2 == 0) { - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + aID + ".name", aEnglish); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + aID + ".tooltip", aToolTip); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + "." + (aID + 1) + ".name", aEnglish + " (Empty)"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + "." + (aID + 1) + ".tooltip", "You need to recharge it"); - mToolStats.put((short) aID, aToolStats); - mToolStats.put((short) (aID + 1), aToolStats); - aToolStats.onStatsAddedToTool(this, aID); - ItemStack rStack = new ItemStack(this, 1, aID); - List tAspects = new ArrayList<>(); - for (Object tOreDictNameOrAspect : aOreDictNamesAndAspects) { - if (tOreDictNameOrAspect instanceof TC_AspectStack) - ((TC_AspectStack) tOreDictNameOrAspect).addToAspectList(tAspects); - else GT_OreDictUnificator.registerOre(tOreDictNameOrAspect, rStack); - } - if (GregTech_API.sThaumcraftCompat != null) - GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false); - GT_ModHandler.registerBoxableItemToToolBox(rStack); - return rStack; - } - return null; - } - - /** - * This Function gets an ItemStack Version of this Tool - * - * @param aToolID the ID of the Tool Class - * @param aAmount Amount of Items (well normally you only need 1) - * @param aPrimaryMaterial Primary Material of this Tool - * @param aSecondaryMaterial Secondary (Rod/Handle) Material of this Tool - * @param aElectricArray The Electric Stats of this Tool (or null if not electric) - */ - public final ItemStack getToolWithStats(int aToolID, int aAmount, Materials aPrimaryMaterial, - Materials aSecondaryMaterial, long[] aElectricArray) { - ItemStack rStack = new ItemStack(this, aAmount, aToolID); - IToolStats tToolStats = getToolStats(rStack); - if (tToolStats != null) { - NBTTagCompound tMainNBT = new NBTTagCompound(), tToolNBT = new NBTTagCompound(); - tToolNBT.setByte("Mode", (byte) 0); - if (aPrimaryMaterial != null) { - tToolNBT.setString("PrimaryMaterial", aPrimaryMaterial.mName); - tToolNBT.setLong( - "MaxDamage", - 100L * (long) (aPrimaryMaterial.mDurability * tToolStats.getMaxDurabilityMultiplier())); - } - if (aSecondaryMaterial != null) tToolNBT.setString("SecondaryMaterial", aSecondaryMaterial.mName); - - if (aElectricArray != null) { - tToolNBT.setBoolean("Electric", true); - tToolNBT.setLong("MaxCharge", aElectricArray[0]); - tToolNBT.setLong("Voltage", aElectricArray[1]); - tToolNBT.setLong("Tier", aElectricArray[2]); - tToolNBT.setLong("SpecialData", aElectricArray[3]); - } - - tMainNBT.setTag("GT.ToolStats", tToolNBT); - rStack.setTagCompound(tMainNBT); - } - isItemStackUsable(rStack); - return rStack; - } - - /** - * Called by the Block Harvesting Event within the GT_Proxy - */ - @Mod.EventHandler - public void onHarvestBlockEvent(ArrayList aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, - int aX, int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - IToolStats tStats = getToolStats(aStack); - if (isItemStackUsable(aStack) && getDigSpeed(aStack, aBlock, aMetaData) > 0.0F) doDamage( - aStack, - (long) tStats - .convertBlockDrops(aDrops, aStack, aPlayer, aBlock, aX, aY, aZ, aMetaData, aFortune, aSilkTouch, aEvent) - * tStats.getToolDamagePerDropConversion()); - } - - @Mod.EventHandler - public float onBlockBreakSpeedEvent(float aDefault, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, PlayerEvent.BreakSpeed aEvent) { - IToolStats tStats = getToolStats(aStack); - return tStats == null ? aDefault - : tStats.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, aPlayer.worldObj, aX, aY, aZ); - } - - @Override - public boolean onBlockStartBreak(ItemStack aStack, int aX, int aY, int aZ, EntityPlayer aPlayer) { - if (aPlayer.worldObj.isRemote) { - return false; - } - IToolStats tStats = getToolStats(aStack); - Block aBlock = aPlayer.worldObj.getBlock(aX, aY, aZ); - if (tStats.isChainsaw() && (aBlock instanceof IShearable target)) { - if ((target.isShearable(aStack, aPlayer.worldObj, aX, aY, aZ))) { - ArrayList drops = target.onSheared( - aStack, - aPlayer.worldObj, - aX, - aY, - aZ, - EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, aStack)); - for (ItemStack stack : drops) { - float f = 0.7F; - double d = itemRand.nextFloat() * f + (1.0F - f) * 0.5D; - double d1 = itemRand.nextFloat() * f + (1.0F - f) * 0.5D; - double d2 = itemRand.nextFloat() * f + (1.0F - f) * 0.5D; - EntityItem entityitem = new EntityItem(aPlayer.worldObj, aX + d, aY + d1, aZ + d2, stack); - entityitem.delayBeforeCanPickup = 10; - aPlayer.worldObj.spawnEntityInWorld(entityitem); - } - aPlayer.addStat(net.minecraft.stats.StatList.mineBlockStatArray[Block.getIdFromBlock(aBlock)], 1); - onBlockDestroyed(aStack, aPlayer.worldObj, aBlock, aX, aY, aZ, aPlayer); - } - return false; - } - return super.onBlockStartBreak(aStack, aX, aY, aZ, aPlayer); - } - - @Override - public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { - IToolStats tStats = getToolStats(aStack); - if (tStats == null || !isItemStackUsable(aStack)) return true; - GT_Utility.doSoundAtClient(tStats.getEntityHitSound(), 1, 1.0F); - if (super.onLeftClickEntity(aStack, aPlayer, aEntity)) return true; - if (aEntity.canAttackWithItem() && !aEntity.hitByEntity(aPlayer)) { - float tMagicDamage = tStats.getMagicDamageAgainstEntity( - aEntity instanceof EntityLivingBase - ? EnchantmentHelper.getEnchantmentModifierLiving(aPlayer, (EntityLivingBase) aEntity) - : 0.0F, - aEntity, - aStack, - aPlayer), - tDamage = tStats.getNormalDamageAgainstEntity( - (float) aPlayer.getEntityAttribute(SharedMonsterAttributes.attackDamage) - .getAttributeValue() + getToolCombatDamage(aStack), - aEntity, - aStack, - aPlayer); - if (tDamage + tMagicDamage > 0.0F) { - boolean tCriticalHit = aPlayer.fallDistance > 0.0F && !aPlayer.onGround - && !aPlayer.isOnLadder() - && !aPlayer.isInWater() - && !aPlayer.isPotionActive(Potion.blindness) - && aPlayer.ridingEntity == null - && aEntity instanceof EntityLivingBase; - if (tCriticalHit && tDamage > 0.0F) tDamage *= 1.5F; - tDamage += tMagicDamage; - if (aEntity.attackEntityFrom(tStats.getDamageSource(aPlayer, aEntity), tDamage)) { - if (aEntity instanceof EntityLivingBase) - aEntity.setFire(EnchantmentHelper.getFireAspectModifier(aPlayer) * 4); - int tKnockcack = (aPlayer.isSprinting() ? 1 : 0) + (aEntity instanceof EntityLivingBase - ? EnchantmentHelper.getKnockbackModifier(aPlayer, (EntityLivingBase) aEntity) - : 0); - if (tKnockcack > 0) { - aEntity.addVelocity( - -MathHelper.sin(aPlayer.rotationYaw * (float) Math.PI / 180.0F) * tKnockcack * 0.5F, - 0.1D, - MathHelper.cos(aPlayer.rotationYaw * (float) Math.PI / 180.0F) * tKnockcack * 0.5F); - aPlayer.motionX *= 0.6D; - aPlayer.motionZ *= 0.6D; - aPlayer.setSprinting(false); - } - if (tCriticalHit) aPlayer.onCriticalHit(aEntity); - if (tMagicDamage > 0.0F) aPlayer.onEnchantmentCritical(aEntity); - if (tDamage >= 18.0F) aPlayer.triggerAchievement(AchievementList.overkill); - aPlayer.setLastAttacker(aEntity); - if (aEntity instanceof EntityLivingBase) - EnchantmentHelper.func_151384_a((EntityLivingBase) aEntity, aPlayer); - EnchantmentHelper.func_151385_b(aPlayer, aEntity); - if (aEntity instanceof EntityLivingBase) - aPlayer.addStat(StatList.damageDealtStat, Math.round(tDamage * 10.0F)); - aEntity.hurtResistantTime = Math - .max(1, tStats.getHurtResistanceTime(aEntity.hurtResistantTime, aEntity)); - aPlayer.addExhaustion(0.3F); - doDamage(aStack, tStats.getToolDamagePerEntityAttack()); - } - } - } - if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); - return true; - } - - @Override - public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - IToolStats tStats = getToolStats(aStack); - if (tStats != null && tStats.canBlock()) aPlayer.setItemInUse(aStack, 72000); - return super.onItemRightClick(aStack, aWorld, aPlayer); - } - - @Override - public final int getMaxItemUseDuration(ItemStack aStack) { - return 72000; - } - - @Override - public final EnumAction getItemUseAction(ItemStack aStack) { - IToolStats tStats = getToolStats(aStack); - if (tStats != null && tStats.canBlock()) return EnumAction.block; - return EnumAction.none; - } - - @Override - @SideOnly(Side.CLIENT) - public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < 32766; i += 2) { - if (getToolStats(new ItemStack(this, 1, i)) != null) { - ItemStack tStack = new ItemStack(this, 1, i); - isItemStackUsable(tStack); - aList.add(tStack); - aList.add(getToolWithStats(i, 1, Materials.Neutronium, Materials.Neutronium, null)); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public final void registerIcons(IIconRegister aIconRegister) { - // - } - - @Override - public final IIcon getIconFromDamage(int aMetaData) { - return null; - } - - @Override - public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - long tMaxDamage = getToolMaxDamage(aStack); - Materials tMaterial = getPrimaryMaterial(aStack); - IToolStats tStats = getToolStats(aStack); - int tOffset = getElectricStats(aStack) != null ? 2 : 1; - if (tStats != null) { - if (tStats instanceof GT_Tool_Turbine) { - - // Durability -> toolMaxDamage - // % Efficiency -> toolCombatDamage -> toolQuality - // Optimal Flow -> toolSpeed - // EU/t -> toolCombatDamage, toolSpeed - // Overflow Tier -> toolQuality - float aBaseEff = (5f + getToolCombatDamage(aStack)) * 1000f; - - // It was noted by IntelliJ that replacing ((GT_MetaGenerated_Tool) aStack.getItem()) with - // GT_MetaGenerated_Tool can have side effects. This refactoring will need tests. - @SuppressWarnings("AccessStaticViaInstance") - float aOptFlow = (Math.max( - Float.MIN_NORMAL, - ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack) - .getSpeedMultiplier() - * ((GT_MetaGenerated_Tool) aStack.getItem()).getPrimaryMaterial(aStack).mToolSpeed - * 50F)); - aList.add( - tOffset + 0, - EnumChatFormatting.GRAY + String.format( - transItem("001", "Durability: %s/%s"), - "" + EnumChatFormatting.GREEN + formatNumbers(tMaxDamage - getToolDamage(aStack)) + " ", - " " + formatNumbers(tMaxDamage)) + EnumChatFormatting.GRAY); - aList.add( - tOffset + 1, - EnumChatFormatting.GRAY + String.format( - transItem("002", "%s lvl %s"), - tMaterial.mLocalizedName + EnumChatFormatting.YELLOW, - "" + getHarvestLevel(aStack, "")) + EnumChatFormatting.GRAY); - aList.add( - tOffset + 2, - EnumChatFormatting.WHITE - + String.format( - transItem("005", "Turbine Efficiency: %s"), - "" + EnumChatFormatting.BLUE + (50.0F + (10.0F * getToolCombatDamage(aStack)))) - + "%" - + EnumChatFormatting.GRAY); - aList.add( - tOffset + 3, - EnumChatFormatting.WHITE + String.format( - transItem("006", "Optimal Steam flow: %s L/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers( - GT_Utility.safeInt( - (long) (Math.max( - Float.MIN_NORMAL, - tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed - * (1000 * getPrimaryMaterial(aStack).mSteamMultiplier / 20))))) - + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 4, - EnumChatFormatting.WHITE + String.format( - transItem("900", "Energy from Optimal Steam Flow: %s EU/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers( - GT_Utility.safeInt( - (long) (Math.max( - Float.MIN_NORMAL, - tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed - * (1000 * getPrimaryMaterial(aStack).mSteamMultiplier / 20)) - * (50.0F + (10.0F * getToolCombatDamage(aStack))) - / 200))) - + EnumChatFormatting.GRAY)); - { - float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff); - float aOptFlowLoose = calculatedFlow[0]; - float aBaseEffLoose = calculatedFlow[1]; - - aList.add( - tOffset + 5, - EnumChatFormatting.AQUA + String.format( - transItem("500", "Turbine Efficiency (Loose): %s"), - "" + EnumChatFormatting.BLUE + (long) aBaseEffLoose / 100 + "%" + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 6, - EnumChatFormatting.AQUA + String.format( - transItem("501", "Optimal Steam flow (Loose): %s L/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers(((long) aOptFlowLoose * getPrimaryMaterial(aStack).mSteamMultiplier)) - + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 7, - EnumChatFormatting.AQUA + String.format( - transItem("901", "Energy from Optimal Steam Flow (Loose): %s EU/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers( - ((long) aOptFlowLoose * getPrimaryMaterial(aStack).mSteamMultiplier / 10000) - * ((long) aBaseEffLoose / 2)) - + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 8, - EnumChatFormatting.GRAY + "(Superheated Steam EU values are 2x those of Steam)"); - } - aList.add( - tOffset + 9, - EnumChatFormatting.WHITE + String.format( - transItem("902", "Optimal SC Steam flow: %s L/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers( - GT_Utility.safeInt( - (long) (Math.max( - Float.MIN_NORMAL, - tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed - * (1000f / 20f))))) - + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 10, - EnumChatFormatting.WHITE + String.format( - transItem("903", "Energy from Optimal SC Steam Flow: %s EU/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers( - GT_Utility.safeInt( - (long) (Math.max( - Float.MIN_NORMAL, - tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed - * (1000f / 20f)) - * (50.0F + (10.0F * getToolCombatDamage(aStack)))))) - + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 11, - EnumChatFormatting.LIGHT_PURPLE + String.format( - transItem("007", "Energy from Optimal Gas Flow: %s EU/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers( - GT_Utility.safeInt( - (long) (Math.max( - Float.MIN_NORMAL, - tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed - * 50 - * getPrimaryMaterial(aStack).mGasMultiplier) - * (50.0F + (10.0F * getToolCombatDamage(aStack))) - / 100))) - + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 12, - EnumChatFormatting.LIGHT_PURPLE + String.format( - transItem("008", "Energy from Optimal Plasma Flow: %s EU/t"), - "" + EnumChatFormatting.GOLD - + formatNumbers( - GT_Utility.safeInt( - (long) (Math.max( - Float.MIN_NORMAL, - tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed - * 2000 - * getPrimaryMaterial(aStack).mPlasmaMultiplier) - * (50.0F + (10.0F * getToolCombatDamage(aStack))) - * (1.05 / 100)))) - + EnumChatFormatting.GRAY)); - aList.add( - tOffset + 14, - EnumChatFormatting.GRAY + "(EU/t values include efficiency and are not 100% accurate)"); - int toolQualityLevel = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolQuality; - int overflowMultiplier = 0; - if (toolQualityLevel >= 6) { - overflowMultiplier = 3; - } else if (toolQualityLevel >= 3) { - overflowMultiplier = 2; - } else { - overflowMultiplier = 1; - } - aList.add( - tOffset + 13, - EnumChatFormatting.LIGHT_PURPLE + String.format( - transItem("502", "Overflow Efficiency Tier: %s"), - "" + EnumChatFormatting.GOLD + overflowMultiplier + EnumChatFormatting.GRAY)); - - } else { - aList.add( - tOffset, - EnumChatFormatting.WHITE + String.format( - transItem("001", "Durability: %s/%s"), - "" + EnumChatFormatting.GREEN + formatNumbers(tMaxDamage - getToolDamage(aStack)) + " ", - " " + formatNumbers(tMaxDamage)) + EnumChatFormatting.GRAY); - aList.add( - tOffset + 1, - EnumChatFormatting.WHITE + String.format( - transItem("002", "%s lvl %s"), - tMaterial.mLocalizedName + EnumChatFormatting.YELLOW, - "" + getHarvestLevel(aStack, "")) + EnumChatFormatting.GRAY); - aList.add( - tOffset + 2, - EnumChatFormatting.WHITE + String.format( - transItem("003", "Attack Damage: %s"), - "" + EnumChatFormatting.BLUE + getToolCombatDamage(aStack)) + EnumChatFormatting.GRAY); - aList.add( - tOffset + 3, - EnumChatFormatting.WHITE - + String.format( - transItem("004", "Mining Speed: %s"), - "" + EnumChatFormatting.GOLD - + Math.max( - Float.MIN_NORMAL, - tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)) - + EnumChatFormatting.GRAY); - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null && aNBT.hasKey("Heat")) { - int tHeat = aNBT.getInteger("Heat"); - long tWorldTime = aPlayer.getEntityWorld() - .getWorldTime(); - if (aNBT.hasKey("HeatTime")) { - long tHeatTime = aNBT.getLong("HeatTime"); - if (tWorldTime > (tHeatTime + 10)) { - tHeat = (int) (tHeat - ((tWorldTime - tHeatTime) / 10)); - if (tHeat < 300 && tHeat > -10000) tHeat = 300; - } - aNBT.setLong("HeatTime", tWorldTime); - if (tHeat > -10000) aNBT.setInteger("Heat", tHeat); - } - - aList.add( - tOffset + 3, - EnumChatFormatting.RED + "Heat: " - + aNBT.getInteger("Heat") - + " K" - + EnumChatFormatting.GRAY); - } - } - } - } - } - - @Override - public Long[] getFluidContainerStats(ItemStack aStack) { - return null; - } - - @Override - public Long[] getElectricStats(ItemStack aStack) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - aNBT = aNBT.getCompoundTag("GT.ToolStats"); - if (aNBT != null && aNBT.getBoolean("Electric")) return new Long[] { aNBT.getLong("MaxCharge"), - aNBT.getLong("Voltage"), aNBT.getLong("Tier"), aNBT.getLong("SpecialData") }; - } - return null; - } - - public float getToolCombatDamage(ItemStack aStack) { - IToolStats tStats = getToolStats(aStack); - if (tStats == null) return 0; - return tStats.getBaseDamage() + getPrimaryMaterial(aStack).mToolQuality; - } - - @Override - public final boolean doDamageToItem(ItemStack aStack, int aVanillaDamage) { - return doDamage(aStack, aVanillaDamage * 100L); - } - - public final boolean doDamage(ItemStack aStack, long aAmount) { - if (!isItemStackUsable(aStack)) return false; - Long[] tElectric = getElectricStats(aStack); - if (tElectric == null) { - long tNewDamage = getToolDamage(aStack) + aAmount; - setToolDamage(aStack, tNewDamage); - if (tNewDamage >= getToolMaxDamage(aStack)) { - IToolStats tStats = getToolStats(aStack); - if (tStats == null || GT_Utility.setStack(aStack, tStats.getBrokenItem(aStack)) == null) { - if (tStats != null) GT_Utility.doSoundAtClient(tStats.getBreakingSound(), 1, 1.0F); - if (aStack.stackSize > 0) aStack.stackSize--; - } - } - return true; - } - if (use(aStack, (int) aAmount, null)) { - if (java.util.concurrent.ThreadLocalRandom.current() - .nextInt(0, 25) == 0) { - long tNewDamage = getToolDamage(aStack) + aAmount; - setToolDamage(aStack, tNewDamage); - if (tNewDamage >= getToolMaxDamage(aStack)) { - IToolStats tStats = getToolStats(aStack); - if (tStats == null || GT_Utility.setStack(aStack, tStats.getBrokenItem(aStack)) == null) { - if (tStats != null) GT_Utility.doSoundAtClient(tStats.getBreakingSound(), 1, 1.0F); - if (aStack.stackSize > 0) aStack.stackSize--; - } - } - } - return true; - } - return false; - } - - @Override - public float getDigSpeed(ItemStack aStack, Block aBlock, int aMetaData) { - if (!isItemStackUsable(aStack)) return 0.0F; - IToolStats tStats = getToolStats(aStack); - if (tStats == null || Math.max(0, getHarvestLevel(aStack, "")) < aBlock.getHarvestLevel(aMetaData)) return 0.0F; - return tStats.isMinableBlock(aBlock, (byte) aMetaData) - ? Math.max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed) - : 0.0F; - } - - @Override - public final boolean canHarvestBlock(Block aBlock, ItemStack aStack) { - return getDigSpeed(aStack, aBlock, (byte) 0) > 0.0F; - } - - @Override - public final int getHarvestLevel(ItemStack aStack, String aToolClass) { - IToolStats tStats = getToolStats(aStack); - return tStats == null ? -1 : tStats.getBaseQuality() + getPrimaryMaterial(aStack).mToolQuality; - } - - @Override - public boolean onBlockDestroyed(ItemStack aStack, World aWorld, Block aBlock, int aX, int aY, int aZ, - EntityLivingBase aPlayer) { - if (!isItemStackUsable(aStack)) return false; - IToolStats tStats = getToolStats(aStack); - if (tStats == null) return false; - GT_Utility.doSoundAtClient(tStats.getMiningSound(), 1, 1.0F); - doDamage( - aStack, - (int) Math.max(1, aBlock.getBlockHardness(aWorld, aX, aY, aZ) * tStats.getToolDamagePerBlockBreak())); - return getDigSpeed(aStack, aBlock, aWorld.getBlockMetadata(aX, aY, aZ)) > 0.0F; - } - - @Override - public final ItemStack getContainerItem(ItemStack aStack) { - return getContainerItem(aStack, true); - } - - @Override - public final boolean hasContainerItem(ItemStack aStack) { - return getContainerItem(aStack, false) != null; - } - - private ItemStack getContainerItem(ItemStack aStack, boolean playSound) { - if (!isItemStackUsable(aStack)) return null; - aStack = GT_Utility.copyAmount(1, aStack); - IToolStats tStats = getToolStats(aStack); - if (tStats == null) return null; - doDamage(aStack, tStats.getToolDamagePerContainerCraft()); - aStack = aStack.stackSize > 0 ? aStack : null; - if (playSound && GT_Mod.gregtechproxy.mTicksUntilNextCraftSound <= 0) { - GT_Mod.gregtechproxy.mTicksUntilNextCraftSound = 10; - String sound = (aStack == null) ? tStats.getBreakingSound() : tStats.getCraftingSound(); - GT_Utility.doSoundAtClient(sound, 1, 1.0F); - } - return aStack; - } - - public IToolStats getToolStats(ItemStack aStack) { - isItemStackUsable(aStack); - return getToolStatsInternal(aStack); - } - - public byte getToolMaxMode(ItemStack aStack) { - IToolStats stats = getToolStats(aStack); - if (stats != null) { - return stats.getMaxMode(); - } - return 1; - } - - private IToolStats getToolStatsInternal(ItemStack aStack) { - return aStack == null ? null : mToolStats.get((short) aStack.getItemDamage()); - } - - @Override - public float getSaplingModifier(ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ) { - IToolStats tStats = getToolStats(aStack); - return tStats != null && tStats.isGrafter() ? Math.min(100.0F, (1 + getHarvestLevel(aStack, "")) * 20.0F) - : 0.0F; - } - - @Override - public boolean canWhack(EntityPlayer aPlayer, ItemStack aStack, int aX, int aY, int aZ) { - if (!isItemStackUsable(aStack)) return false; - IToolStats tStats = getToolStats(aStack); - return tStats != null && tStats.isCrowbar(); - } - - @Override - public void onWhack(EntityPlayer aPlayer, ItemStack aStack, int aX, int aY, int aZ) { - IToolStats tStats = getToolStats(aStack); - if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack()); - } - - @Override - public boolean canWrench(EntityPlayer player, int x, int y, int z) { - if (player == null) return false; - return canWrench(player.getHeldItem(), player, x, y, z); - } - - @Override - public boolean canWrench(ItemStack wrench, EntityPlayer player, int x, int y, int z) { - if (wrench == null) return false; - if (!isItemStackUsable(wrench)) return false; - IToolStats tStats = getToolStats(player.getCurrentEquippedItem()); - return tStats != null && tStats.isWrench(); - } - - @Override - public void wrenchUsed(EntityPlayer player, int x, int y, int z) { - if (player == null) return; - if (player.getCurrentEquippedItem() == null) return; - IToolStats tStats = getToolStats(player.getCurrentEquippedItem()); - if (tStats != null) doDamage(player.getCurrentEquippedItem(), tStats.getToolDamagePerEntityAttack()); - } - - @Override - public boolean canUse(ItemStack stack, EntityPlayer player, int x, int y, int z) { - return canWrench(player, x, y, z); - } - - // ProjectRed screwdriver - @Override - public boolean canUse(EntityPlayer player, ItemStack stack) { - if (player == null) return false; - if (GT_Utility.isStackInvalid(stack) || !isItemStackUsable(stack)) return false; - IToolStats tStats = getToolStats(stack); - return tStats != null && tStats.isScrewdriver(); - } - - @Override - public void damageScrewdriver(EntityPlayer player, ItemStack stack) { - if (player == null) return; - if (GT_Utility.isStackInvalid(stack) || !isItemStackUsable(stack)) return; - IToolStats tStats = getToolStats(stack); - if (tStats != null) doDamage(stack, tStats.getToolDamagePerEntityAttack()); - } - - @Override - public void used(ItemStack stack, EntityPlayer player, int x, int y, int z) { - wrenchUsed(player, x, y, z); - } - - @Override - public boolean shouldHideFacades(ItemStack stack, EntityPlayer player) { - if (player == null) return false; - if (player.getCurrentEquippedItem() == null) return false; - if (!isItemStackUsable(player.getCurrentEquippedItem())) return false; - IToolStats tStats = getToolStats(player.getCurrentEquippedItem()); - return tStats.isWrench(); - } - - @Override - public boolean canLink(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { - if (!isItemStackUsable(aStack)) return false; - IToolStats tStats = getToolStats(aStack); - return tStats != null && tStats.isCrowbar(); - } - - @Override - public void onLink(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { - IToolStats tStats = getToolStats(aStack); - if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack()); - } - - @Override - public boolean canBoost(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { - if (!isItemStackUsable(aStack)) return false; - IToolStats tStats = getToolStats(aStack); - return tStats != null && tStats.isCrowbar(); - } - - @Override - public void onBoost(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { - IToolStats tStats = getToolStats(aStack); - if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack()); - } - - @Override - public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - IToolStats tStats = getToolStats(aStack); - if (tStats != null && aPlayer != null) tStats.onToolCrafted(aStack, aPlayer); - super.onCreated(aStack, aWorld, aPlayer); - } - - @Override - public final boolean doesContainerItemLeaveCraftingGrid(ItemStack aStack) { - return false; - } - - @Override - public final int getItemStackLimit(ItemStack aStack) { - return 1; - } - - @Override - public boolean isFull3D() { - return true; - } - - @Override - public boolean isItemStackUsable(ItemStack aStack) { - IToolStats tStats = getToolStatsInternal(aStack); - if (aStack.getItemDamage() % 2 != 0 || tStats == null) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) aNBT.removeTag("ench"); - return false; - } - Materials aMaterial = getPrimaryMaterial(aStack); - HashMap tMap = new HashMap<>(), tResult = new HashMap<>(); - if (aMaterial.mEnchantmentTools != null) { - tMap.put(aMaterial.mEnchantmentTools.effectId, (int) aMaterial.mEnchantmentToolsLevel); - if (aMaterial.mEnchantmentTools == Enchantment.fortune) - tMap.put(Enchantment.looting.effectId, (int) aMaterial.mEnchantmentToolsLevel); - if (aMaterial.mEnchantmentTools == Enchantment.knockback) - tMap.put(Enchantment.power.effectId, (int) aMaterial.mEnchantmentToolsLevel); - if (aMaterial.mEnchantmentTools == Enchantment.fireAspect) - tMap.put(Enchantment.flame.effectId, (int) aMaterial.mEnchantmentToolsLevel); - } - Enchantment[] tEnchants = tStats.getEnchantments(aStack); - int[] tLevels = tStats.getEnchantmentLevels(aStack); - for (int i = 0; i < tEnchants.length; i++) if (tLevels[i] > 0) { - Integer tLevel = tMap.get(tEnchants[i].effectId); - tMap.put( - tEnchants[i].effectId, - tLevel == null ? tLevels[i] : tLevel == tLevels[i] ? tLevel + 1 : Math.max(tLevel, tLevels[i])); - } - for (Entry tEntry : tMap.entrySet()) { - if (tEntry.getKey() == 33 || (tEntry.getKey() == 20 && tEntry.getValue() > 2) - || tEntry.getKey() == Enchantment_Radioactivity.INSTANCE.effectId) - tResult.put(tEntry.getKey(), tEntry.getValue()); - else switch (Enchantment.enchantmentsList[tEntry.getKey()].type) { - case weapon: - if (tStats.isWeapon()) tResult.put(tEntry.getKey(), tEntry.getValue()); - break; - case all: - tResult.put(tEntry.getKey(), tEntry.getValue()); - break; - case armor: - case armor_feet: - case armor_head: - case armor_legs: - case armor_torso: - break; - case bow: - if (tStats.isRangedWeapon()) tResult.put(tEntry.getKey(), tEntry.getValue()); - break; - case breakable: - break; - case fishing_rod: - break; - case digger: - if (tStats.isMiningTool()) tResult.put(tEntry.getKey(), tEntry.getValue()); - break; - } - } - EnchantmentHelper.setEnchantments(tResult, aStack); - return true; - } - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - - String result = super.getItemStackDisplayName(aStack); - IToolStats toolStats = getToolStats(aStack); - if (toolStats != null) { - String toolName = toolStats.getToolTypeName(); - if (toolName == null) return result; - - String key = "gt." + toolName + ".mode." + getToolMode(aStack); - if (StatCollector.canTranslate(key)) { - result += " (" + StatCollector.translateToLocal(key) + ")"; - } - } - return result; - - } - - @Override - public short getChargedMetaData(ItemStack aStack) { - return (short) (aStack.getItemDamage() - (aStack.getItemDamage() % 2)); - } - - @Override - public short getEmptyMetaData(ItemStack aStack) { - NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) aNBT.removeTag("ench"); - return (short) (aStack.getItemDamage() + 1 - (aStack.getItemDamage() % 2)); - } - - @Override - public int getItemEnchantability() { - return 0; - } - - @Override - public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { - return false; - } - - @Override - public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { - return false; - } -} diff --git a/src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java b/src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java deleted file mode 100644 index 2509cf6261..0000000000 --- a/src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java +++ /dev/null @@ -1,219 +0,0 @@ -package gregtech.api.items; - -import java.util.ArrayList; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -import gregtech.api.enums.GT_Values; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_Utility; -import ic2.api.reactor.IReactor; -import ic2.api.reactor.IReactorComponent; -import ic2.core.IC2Potion; -import ic2.core.init.MainConfig; -import ic2.core.util.ConfigUtil; - -public class GT_RadioactiveCellIC_Item extends GT_RadioactiveCell_Item implements IReactorComponent { - - private static final int MYSTERIOUS_MULTIPLIER_HEAT = 4; - public final int numberOfCells; - public final float sEnergy; - public final int sRadiation; - public final float sHeat; - public final ItemStack sDepleted; - public final boolean sMox; - - public GT_RadioactiveCellIC_Item(String aUnlocalized, String aEnglish, int aCellcount, int maxDamage, float aEnergy, - int aRadiation, float aHeat, ItemStack aDepleted, boolean aMox) { - super(aUnlocalized, aEnglish, aCellcount); - setMaxStackSize(64); - this.maxDmg = maxDamage; - this.numberOfCells = aCellcount; - this.sEnergy = aEnergy; - this.sRadiation = aRadiation; - this.sHeat = aHeat; - this.sDepleted = aDepleted; - this.sMox = aMox; - if (aDepleted != null && aEnergy > 0 && aHeat > 0) { - // avoid adding depleted cells to recipe map - - int pulses = aCellcount / 2 + 1; - - // for the mysterious constant 5.0f, - // see ic2.core.block.reactor.tileentity.TileEntityNuclearReactorElectric.getOfferedEnergy - // don't ask, just accept - float nukePowerMult = 5.0f * ConfigUtil.getFloat(MainConfig.get(), "balance/energy/generator/nuclear"); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this)) - .itemOutputs(aDepleted) - .setNEIDesc( - aMox ? "MOX Model" : "Uranium Model", - "Neutron Pulse: " + aCellcount, - aCellcount == 1 - ? String.format("Heat: %.1f * n1 * (n1 + 1)", (aHeat * MYSTERIOUS_MULTIPLIER_HEAT) / 2f) - : String.format( - "Heat: %.1f * (%d + n1) * (%d + n1)", - (aHeat * MYSTERIOUS_MULTIPLIER_HEAT) * aCellcount / 2f, - aCellcount, - aCellcount + 1), - String.format( - "Energy: %.1f + n2 * %.1f EU/t", - aEnergy * aCellcount * pulses * nukePowerMult, - aEnergy * nukePowerMult)) - .duration(0) - .eut(0) - .addTo(RecipeMaps.ic2NuclearFakeRecipes); - } - } - - private static int checkPulseable(IReactor reactor, int x, int y, ItemStack me, int mex, int mey, boolean heatrun) { - ItemStack other = reactor.getItemAt(x, y); - if ((other != null) && ((other.getItem() instanceof IReactorComponent)) - && (((IReactorComponent) other.getItem()) - .acceptUraniumPulse(reactor, other, me, x, y, mex, mey, heatrun))) { - return 1; - } - return 0; - } - - @Override - public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) { - if (!reactor.produceEnergy()) { - return; - } - for (int iteration = 0; iteration < this.numberOfCells; iteration++) { - int pulses = 1 + this.numberOfCells / 2; - if (!heatrun) { - for (int i = 0; i < pulses; i++) { - acceptUraniumPulse(reactor, yourStack, yourStack, x, y, x, y, heatrun); - } - checkPulseable(reactor, x - 1, y, yourStack, x, y, heatrun); - checkPulseable(reactor, x + 1, y, yourStack, x, y, heatrun); - checkPulseable(reactor, x, y - 1, yourStack, x, y, heatrun); - checkPulseable(reactor, x, y + 1, yourStack, x, y, heatrun); - } else { - pulses += checkPulseable(reactor, x - 1, y, yourStack, x, y, heatrun) - + checkPulseable(reactor, x + 1, y, yourStack, x, y, heatrun) - + checkPulseable(reactor, x, y - 1, yourStack, x, y, heatrun) - + checkPulseable(reactor, x, y + 1, yourStack, x, y, heatrun); - - // int heat = sumUp(pulses) * 4; - - int heat = triangularNumber(pulses) * MYSTERIOUS_MULTIPLIER_HEAT; - - heat = getFinalHeat(reactor, yourStack, x, y, heat); - - ArrayList heatAcceptors = new ArrayList<>(); - checkHeatAcceptor(reactor, x - 1, y, heatAcceptors); - checkHeatAcceptor(reactor, x + 1, y, heatAcceptors); - checkHeatAcceptor(reactor, x, y - 1, heatAcceptors); - checkHeatAcceptor(reactor, x, y + 1, heatAcceptors); - heat = Math.round(heat * sHeat); - while ((heatAcceptors.size() > 0) && (heat > 0)) { - - int dheat = heat / heatAcceptors.size(); - heat -= dheat; - dheat = ((IReactorComponent) heatAcceptors.get(0).stack.getItem()).alterHeat( - reactor, - heatAcceptors.get(0).stack, - heatAcceptors.get(0).x, - heatAcceptors.get(0).y, - dheat); - heat += dheat; - heatAcceptors.remove(0); - } - if (heat > 0) { - reactor.addHeat(heat); - } - } - } - if (getDamageOfStack(yourStack) >= getMaxDamageEx() - 1) { - reactor.setItemAt(x, y, sDepleted.copy()); - } else if (heatrun) { - damageItemStack(yourStack, 1); - } - } - - protected int getFinalHeat(IReactor reactor, ItemStack stack, int x, int y, int heat) { - if (sMox && reactor.isFluidCooled()) { - float breedereffectiveness = (float) reactor.getHeat() / (float) reactor.getMaxHeat(); - if (breedereffectiveness > 0.5D) { - heat *= 2; - } - } - return heat; - } - - private void checkHeatAcceptor(IReactor reactor, int x, int y, ArrayList heatAcceptors) { - ItemStack thing = reactor.getItemAt(x, y); - if ((thing != null) && ((thing.getItem() instanceof IReactorComponent)) - && (((IReactorComponent) thing.getItem()).canStoreHeat(reactor, thing, x, y))) { - heatAcceptors.add(new ItemStackCoord(thing, x, y)); - } - } - - @Override - public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, - int pulseX, int pulseY, boolean heatrun) { - if (!heatrun) { - if (sMox) { - float breedereffectiveness = (float) reactor.getHeat() / (float) reactor.getMaxHeat(); - float ReaktorOutput = 1.5F * breedereffectiveness + 1.0F; - reactor.addOutput(ReaktorOutput * this.sEnergy); - } else { - reactor.addOutput(1.0F * this.sEnergy); - } - } - return true; - } - - @Override - public boolean canStoreHeat(IReactor reactor, ItemStack yourStack, int x, int y) { - return false; - } - - @Override - public int getMaxHeat(IReactor reactor, ItemStack yourStack, int x, int y) { - return 0; - } - - @Override - public int getCurrentHeat(IReactor reactor, ItemStack yourStack, int x, int y) { - return 0; - } - - @Override - public int alterHeat(IReactor reactor, ItemStack yourStack, int x, int y, int heat) { - return heat; - } - - @Override - public float influenceExplosion(IReactor reactor, ItemStack yourStack) { - return 2 * this.numberOfCells; - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int slotIndex, boolean isCurrentItem) { - if (this.sRadiation > 0 && (entity instanceof EntityLivingBase entityLiving)) { - if (!GT_Utility.isWearingFullRadioHazmat(entityLiving)) { - IC2Potion.radiation.applyTo(entityLiving, sRadiation * 20, sRadiation * 10); - } - } - } - - private static class ItemStackCoord { - - public ItemStack stack; - public int x; - public int y; - - public ItemStackCoord(ItemStack stack1, int x1, int y1) { - this.stack = stack1; - this.x = x1; - this.y = y1; - } - } -} diff --git a/src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java b/src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java deleted file mode 100644 index c927737889..0000000000 --- a/src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java +++ /dev/null @@ -1,159 +0,0 @@ -package gregtech.api.items; - -import static gregtech.api.util.GT_Utility.formatNumbers; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; - -import gregtech.common.items.GT_DepletetCell_Item; -import ic2.api.item.IBoxable; -import ic2.core.util.StackUtil; - -public class GT_RadioactiveCell_Item extends GT_Generic_Item implements IBoxable { - - protected int cellCount; - protected int maxDmg; - protected int dura; - - public GT_RadioactiveCell_Item(String aUnlocalized, String aEnglish, int aCellcount) { - super(aUnlocalized, aEnglish, null); - this.setMaxStackSize(64); - this.setMaxDamage(100); - setNoRepair(); - this.cellCount = Math.max(1, aCellcount); - } - - public static int getDurabilityOfStack(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - aStack.setTagCompound(tNBT); - } - return tNBT.getInteger("advDmg"); - } - - protected static int sumUp(int a) { - int b = 0; - for (int c = 1; c <= a; c++) { - b += c; - } - return b; - } - - protected static int triangularNumber(int x) { - return (x * x + x) / 2; - } - - protected boolean outputPulseForStack(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - aStack.setTagCompound(tNBT); - } - tNBT.setInteger("output", tNBT.getInteger("output") + 1); - return false; // (this.pulserate > 0) || (tNBT.getInteger("output") % -this.pulserate == 0); - } - - protected boolean incrementPulseForStack(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - aStack.setTagCompound(tNBT); - } - tNBT.setInteger("pulse", tNBT.getInteger("pulse") + 1); - return false; // (this.pulserate > 0) || (tNBT.getInteger("pulse") % -this.pulserate == 0); - } - - protected void setDurabilityForStack(ItemStack aStack, int aDurability) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - aStack.setTagCompound(tNBT); - } - tNBT.setInteger("durability", aDurability); - } - - public int getMaxNuclearDurability() { - return 0; // return this.maxDelay; - } - - public int func_77619_b() { - return 0; - } - - @Override - public boolean isBookEnchantable(ItemStack ingredient, ItemStack bookEnchant) { - return false; - } - - // getIsRepairable - public boolean func_82789_a(ItemStack toBeRepaired, ItemStack repairWith) { - return false; - } - - public void setDamageForStack(ItemStack stack, int advDmg) { - NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); - nbtData.setInteger("advDmg", advDmg); - if (this.maxDmg > 0) { - double p = (double) advDmg / (double) this.maxDmg; - int newDmg = (int) (stack.getMaxDamage() * p); - if (newDmg >= stack.getMaxDamage()) { - newDmg = stack.getMaxDamage() - 1; - } - stack.setItemDamage(newDmg); - this.dura = newDmg; - } - } - - public int getDamageOfStack(ItemStack stack) { - NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); - this.dura = nbtData.getInteger("advDmg"); - return this.dura; - } - - public int getControlTagOfStack(ItemStack stack) { - NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); - return nbtData.getInteger("tag"); - } - - public void setControlTagOfStack(ItemStack stack, int tag) { - NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); - nbtData.setInteger("tag", tag); - } - - public int getMaxDamageEx() { - return this.maxDmg; - } - - public void damageItemStack(ItemStack stack, int Dmg) { - setDamageForStack(stack, getDamageOfStack(stack) + Dmg); - } - - @Override - public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - super.addAdditionalToolTips(aList, aStack, aPlayer); - // aList.add("Time left: " + (this.maxDelay - getDurabilityOfStack(aStack)) + " secs"); - int rDmg = getDurabilityOfStack(aStack) * 6 / this.maxDmg; - EnumChatFormatting color2 = switch (rDmg) { - case 0, 1 -> EnumChatFormatting.WHITE; - case 2, 3, 4 -> EnumChatFormatting.GRAY; - default -> EnumChatFormatting.DARK_GRAY; - }; - EnumChatFormatting color1 = this instanceof GT_DepletetCell_Item ? color2 = EnumChatFormatting.DARK_GRAY - : EnumChatFormatting.WHITE; - aList.add( - color1 + String.format( - transItem("001", "Durability: %s/%s"), - "" + color2 + formatNumbers(this.maxDmg - getDurabilityOfStack(aStack)) + color1, - "" + formatNumbers(this.maxDmg))); - } - - @Override - public boolean canBeStoredInToolbox(ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/gregtech/api/items/GT_Tool_Item.java b/src/main/java/gregtech/api/items/GT_Tool_Item.java deleted file mode 100644 index 9f78bdc3fc..0000000000 --- a/src/main/java/gregtech/api/items/GT_Tool_Item.java +++ /dev/null @@ -1,41 +0,0 @@ -package gregtech.api.items; - -import net.minecraft.item.ItemStack; - -import gregtech.api.util.GT_ModHandler; - -/** - * This is just a basic Tool, which has normal durability and could break Blocks. - */ -public class GT_Tool_Item extends GT_Generic_Item { - - public GT_Tool_Item(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage, - boolean aSwingIfUsed) { - this(aUnlocalized, aEnglish, aTooltip, aMaxDamage, aEntityDamage, aSwingIfUsed, -1, -1); - } - - public GT_Tool_Item(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage, - boolean aSwingIfUsed, int aChargedGTID, int aDisChargedGTID) { - this( - aUnlocalized, - aEnglish, - aTooltip, - aMaxDamage, - aEntityDamage, - aSwingIfUsed, - aChargedGTID, - aDisChargedGTID, - 0, - 0.0F); - } - - public GT_Tool_Item(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage, - boolean aSwingIfUsed, int aChargedGTID, int aDisChargedGTID, int aToolQuality, float aToolStrength) { - super(aUnlocalized, aEnglish, aTooltip); - setMaxDamage(aMaxDamage); - setMaxStackSize(1); - setNoRepair(); - setFull3D(); - GT_ModHandler.registerBoxableItemToToolBox(new ItemStack(this)); - } -} diff --git a/src/main/java/gregtech/api/items/ItemBreederCell.java b/src/main/java/gregtech/api/items/ItemBreederCell.java new file mode 100644 index 0000000000..33a4ce3253 --- /dev/null +++ b/src/main/java/gregtech/api/items/ItemBreederCell.java @@ -0,0 +1,153 @@ +package gregtech.api.items; + +import static gregtech.api.util.GTUtility.formatNumbers; + +import java.util.List; +import java.util.function.Supplier; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTUtility; +import ic2.api.reactor.IReactor; +import ic2.api.reactor.IReactorComponent; +import ic2.core.IC2Potion; + +/** + * A {@link ic2.core.item.reactor.ItemReactorLithiumCell}, but can be used to produce anything! + * + * @author glee8e + */ +public class ItemBreederCell extends GTGenericItem implements IReactorComponent { + + protected final int mHeatBonusStep; + protected final int mHeatBonusMultiplier; + protected ItemStack mProduct; + protected boolean deflector = false; + protected boolean hidden = false; + protected boolean neiAdded = false; + + public ItemBreederCell(String aUnlocalized, String aEnglish, String aEnglishTooltip, int aHeatBonusStep, + int aHeatBonusMultiplier, int aRequiredPulse, Supplier aProduct) { + super(aUnlocalized, aEnglish, aEnglishTooltip); + this.mHeatBonusStep = aHeatBonusStep; + this.mHeatBonusMultiplier = aHeatBonusMultiplier; + this.setMaxDamage(aRequiredPulse); + setNoRepair(); + GregTechAPI.sAfterGTPostload.add(() -> { + mProduct = aProduct.get(); + if (!hidden && !neiAdded) { + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this)) + .itemOutputs(mProduct) + .setNEIDesc( + deflector ? "Neutron reflecting Breeder" : "Heat neutral Breeder", + String.format("Every %d reactor hull heat", mHeatBonusStep), + String.format("increase speed by %d00%%", mHeatBonusMultiplier), + String.format("Required pulses: %d", getMaxDamage())) + .duration(0) + .eut(0) + .addTo(RecipeMaps.ic2NuclearFakeRecipes); + + neiAdded = true; + } + }); + } + + public ItemBreederCell setDeflector() { + deflector = true; + return this; + } + + public ItemBreederCell setHidden() { + hidden = true; + return this; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slotIndex, boolean isCurrentItem) { + if ((entity instanceof EntityLivingBase entityLiving)) { + if (!GTUtility.isWearingFullRadioHazmat(entityLiving)) { + IC2Potion.radiation.applyTo(entityLiving, 20, 1); + } + } + } + + @Override + public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + aList.add(transItem("019", "Bath with neutron in a hot reactor")); + int rDmg = aStack.getItemDamage() * 4 / getMaxDamage(); + EnumChatFormatting color2 = switch (rDmg) { + case 0 -> EnumChatFormatting.DARK_GRAY; + case 1, 2 -> EnumChatFormatting.GRAY; + default -> EnumChatFormatting.WHITE; + }; + aList.add( + String.format( + transItem("020", "Progress: %s/%s"), + "" + color2 + formatNumbers(aStack.getItemDamage()) + EnumChatFormatting.RESET, + "" + formatNumbers(getMaxDamage()))); + if (aStack.getItemDamage() > 0) aList.add(EnumChatFormatting.RED + transItem("021", "Radiation Hazard")); + } + + @Override + public int getItemStackLimit(ItemStack stack) { + return stack.getItemDamage() == 0 ? maxStackSize : 1; + } + + @Override + public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) {} + + @Override + public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, + int pulseX, int pulseY, boolean heatrun) { + if (heatrun) { + int myLevel = getNewDamage(reactor, yourStack); + if (myLevel >= getMaxDamage()) reactor.setItemAt(youX, youY, mProduct.copy()); + else yourStack.setItemDamage(myLevel); + } + + return deflector; + } + + protected int getNewDamage(IReactor reactor, ItemStack stack) { + return stack.getItemDamage() + 1 + reactor.getHeat() / mHeatBonusStep * mHeatBonusMultiplier; + } + + @Override + public boolean canStoreHeat(IReactor reactor, ItemStack yourStack, int x, int y) { + return false; + } + + @Override + public int getMaxHeat(IReactor reactor, ItemStack yourStack, int x, int y) { + return 0; + } + + @Override + public int getCurrentHeat(IReactor reactor, ItemStack yourStack, int x, int y) { + return 0; + } + + @Override + public int alterHeat(IReactor reactor, ItemStack yourStack, int x, int y, int heat) { + return heat; + } + + @Override + public float influenceExplosion(IReactor reactor, ItemStack yourStack) { + return 0.0F; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return 1.0D - (double) stack.getItemDamageForDisplay() / (double) stack.getMaxDamage(); + } +} diff --git a/src/main/java/gregtech/api/items/ItemCoolantCell.java b/src/main/java/gregtech/api/items/ItemCoolantCell.java new file mode 100644 index 0000000000..31eb6bc599 --- /dev/null +++ b/src/main/java/gregtech/api/items/ItemCoolantCell.java @@ -0,0 +1,82 @@ +package gregtech.api.items; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; + +import gregtech.api.GregTechAPI; +import ic2.core.util.StackUtil; + +public class ItemCoolantCell extends GTGenericItem { + + protected final int heatStorage; + + public ItemCoolantCell(String aUnlocalized, String aEnglish, int aMaxStore) { + super(aUnlocalized, aEnglish, null); + this.setMaxStackSize(1); + this.setMaxDamage(100); + setNoRepair(); + this.heatStorage = aMaxStore; + this.setCreativeTab(GregTechAPI.TAB_GREGTECH); + } + + protected static int getHeatOfStack(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + return tNBT.getInteger("heat"); + } + + protected void setHeatForStack(ItemStack aStack, int aHeat) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + tNBT.setInteger("heat", aHeat); + if (this.heatStorage > 0) { + double heatRatio = (double) aHeat / (double) this.heatStorage; + int damage = (int) (aStack.getMaxDamage() * heatRatio); + if (damage >= aStack.getMaxDamage()) { + damage = aStack.getMaxDamage() - 1; + } + aStack.setItemDamage(damage); + } + } + + @Override + public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + super.addAdditionalToolTips(aList, aStack, aPlayer); + int rHeat = getHeatOfStack(aStack) * 10 / this.heatStorage; + EnumChatFormatting color = switch (rHeat) { + case 0 -> EnumChatFormatting.BLUE; + case 1, 2 -> EnumChatFormatting.GREEN; + case 3, 4, 5, 6 -> EnumChatFormatting.YELLOW; + case 7, 8 -> EnumChatFormatting.RED; + default -> EnumChatFormatting.DARK_RED; + }; + aList.add( + EnumChatFormatting.WHITE + + String.format(transItem("000", "Stored Heat: %s"), "" + color + getHeatOfStack(aStack))); + if (getControlTagOfStack(aStack) == 1) { + aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line1")); + aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line2")); + } + } + + public int getControlTagOfStack(ItemStack stack) { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + return nbtData.getInteger("tag"); + } + + public void setControlTagOfStack(ItemStack stack, int tag) { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + nbtData.setInteger("tag", tag); + } +} diff --git a/src/main/java/gregtech/api/items/ItemCoolantCellIC.java b/src/main/java/gregtech/api/items/ItemCoolantCellIC.java new file mode 100644 index 0000000000..00643996d3 --- /dev/null +++ b/src/main/java/gregtech/api/items/ItemCoolantCellIC.java @@ -0,0 +1,67 @@ +package gregtech.api.items; + +import net.minecraft.item.ItemStack; + +import ic2.api.reactor.IReactor; +import ic2.api.reactor.IReactorComponent; + +public class ItemCoolantCellIC extends ItemCoolantCell implements IReactorComponent { + + public ItemCoolantCellIC(String aUnlocalized, String aEnglish, int aMaxStore) { + super(aUnlocalized, aEnglish, aMaxStore); + } + + @Override + public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {} + + @Override + public boolean acceptUraniumPulse(IReactor aReactor, ItemStack aStack, ItemStack pulsingStack, int youX, int youY, + int pulseX, int pulseY, boolean aHeatRun) { + return false; + } + + @Override + public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) { + return !aReactor.isFluidCooled() || getControlTagOfStack(aStack) == 0; + } + + @Override + public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) { + return this.heatStorage; + } + + @Override + public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) { + return getHeatOfStack(aStack); + } + + @Override + public float influenceExplosion(IReactor aReactor, ItemStack aStack) { + return 1.0F + this.heatStorage / 30000.0F; + } + + @Override + public int alterHeat(IReactor aReactor, ItemStack aStack, int x, int y, int aHeat) { + int tHeat = getHeatOfStack(aStack); + if ((tHeat == 0) && (getControlTagOfStack(aStack) != 0)) { + setControlTagOfStack(aStack, 0); + } + tHeat += aHeat; + if (tHeat > this.heatStorage) { + aReactor.setItemAt(x, y, null); + aHeat = this.heatStorage - tHeat + 1; + } else { + if (tHeat < 0) { + aHeat = tHeat; + tHeat = 0; + } else { + aHeat = 0; + } + if ((tHeat > 0) && (getControlTagOfStack(aStack) == 0) && (!aReactor.isFluidCooled())) { + setControlTagOfStack(aStack, 1); + } + setHeatForStack(aStack, tHeat); + } + return aHeat; + } +} diff --git a/src/main/java/gregtech/api/items/ItemEnergyArmor.java b/src/main/java/gregtech/api/items/ItemEnergyArmor.java new file mode 100644 index 0000000000..77c8d0991a --- /dev/null +++ b/src/main/java/gregtech/api/items/ItemEnergyArmor.java @@ -0,0 +1,331 @@ +package gregtech.api.items; + +import static gregtech.api.enums.Mods.GregTech; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.ISpecialArmor; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.LivingFallEvent; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class ItemEnergyArmor extends ItemArmor implements ISpecialArmor { + + public static Map jumpChargeMap = new ConcurrentHashMap<>(); + public int mCharge, mTransfer, mTier, mDamageEnergyCost, mSpecials; + public boolean mChargeProvider; + public double mArmorAbsorbtionPercentage; + + public ItemEnergyArmor(int aID, String aUnlocalized, String aEnglish, int aCharge, int aTransfer, int aTier, + int aDamageEnergyCost, int aSpecials, double aArmorAbsorbtionPercentage, boolean aChargeProvider, int aType, + int aArmorIndex) { + super(ArmorMaterial.DIAMOND, aArmorIndex, aType); + setMaxStackSize(1); + setMaxDamage(100); + setNoRepair(); + setUnlocalizedName(aUnlocalized); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".name", aEnglish); + mCharge = Math.max(1, aCharge); + mTransfer = Math.max(1, aTransfer); + mTier = Math.max(1, aTier); + mSpecials = aSpecials; + mChargeProvider = aChargeProvider; + mDamageEnergyCost = Math.max(0, aDamageEnergyCost); + mArmorAbsorbtionPercentage = aArmorAbsorbtionPercentage; + + setCreativeTab(GregTechAPI.TAB_GREGTECH); + + MinecraftForge.EVENT_BUS.register(this); + } + + private static void setCharge(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) tNBT = new NBTTagCompound(); + tNBT.setInteger("charge", 1000000000); + aStack.setTagCompound(tNBT); + } + + @Override + public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + ItemStack tStack = aPlayer.inventory.armorInventory[3 - armorType]; + if (tStack != null) { + for (int i = 0; i < 9; i++) { + if (aPlayer.inventory.mainInventory[i] == aStack) { + aPlayer.inventory.armorInventory[3 - armorType] = aPlayer.inventory.mainInventory[i]; + aPlayer.inventory.mainInventory[i] = tStack; + return tStack; + } + } + } + return super.onItemRightClick(aStack, aWorld, aPlayer); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aIconRegister) { + this.itemIcon = aIconRegister.registerIcon(GregTech.getResourcePath(getUnlocalizedName())); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + aList.add("Tier: " + mTier); + if ((mSpecials & 1) != 0) aList.add("Rebreather"); + if ((mSpecials & 2) != 0) aList.add("Inertia Damper"); + if ((mSpecials & 4) != 0) aList.add("Food Replicator"); + if ((mSpecials & 8) != 0) aList.add("Medicine Module"); + if ((mSpecials & 16) != 0) aList.add("Lamp"); + if ((mSpecials & 32) != 0) aList.add("Solarpanel"); + if ((mSpecials & 64) != 0) aList.add("Extinguisher Module"); + if ((mSpecials & 128) != 0) aList.add("Jump Booster"); + if ((mSpecials & 256) != 0) aList.add("Speed Booster"); + if ((mSpecials & 512) != 0) aList.add("Invisibility Field"); + if ((mSpecials & 1024) != 0) aList.add("Infinite Charge"); + } + + @Override + public void onArmorTick(World aWorld, EntityPlayer aPlayer, ItemStack aStack) { + if (mSpecials == 0) return; + + if (!aPlayer.worldObj.isRemote && (mSpecials & 1) != 0) { + int airSupply = aPlayer.getAir(); + if (GTModHandler.canUseElectricItem(aStack, 1000) && airSupply < 50) { + aPlayer.setAir(airSupply + 250); + GTModHandler.useElectricItem(aStack, 1000, aPlayer); + } + } + + if (!aPlayer.worldObj.isRemote && (mSpecials & 4) != 0) { + if (GTModHandler.canUseElectricItem(aStack, 50000) && aPlayer.getFoodStats() + .needFood()) { + aPlayer.getFoodStats() + .addStats(1, 0.0F); + GTModHandler.useElectricItem(aStack, 50000, aPlayer); + } + } + + if ((mSpecials & 8) != 0) { + if (GTModHandler.canUseElectricItem(aStack, 10000) && aPlayer.isPotionActive(Potion.poison)) { + GTUtility.removePotion(aPlayer, Potion.poison.id); + GTModHandler.useElectricItem(aStack, 10000, aPlayer); + } + if (GTModHandler.canUseElectricItem(aStack, 100000) && aPlayer.isPotionActive(Potion.wither)) { + GTUtility.removePotion(aPlayer, Potion.wither.id); + GTModHandler.useElectricItem(aStack, 100000, aPlayer); + } + } + + if ((mSpecials & 64) != 0) { + aPlayer.setFire(0); + } + + if (!aPlayer.worldObj.isRemote && (mSpecials & 128) != 0) { + float jumpCharge = jumpChargeMap.getOrDefault(aPlayer, 1.0F); + + if (GTModHandler.canUseElectricItem(aStack, 1000) && aPlayer.onGround && jumpCharge < 1.0F) { + jumpCharge = 1.0F; + GTModHandler.useElectricItem(aStack, 1000, aPlayer); + } + + if (aPlayer.motionY >= 0.0D && jumpCharge > 0.0F && !aPlayer.isInWater()) { + if (jumpCharge < 1.0F) { + jumpCharge = 0.0F; + } + } + + jumpChargeMap.put(aPlayer, jumpCharge); + } + + if ((mSpecials & 256) != 0) { + if (GTModHandler.canUseElectricItem(aStack, 100) && aPlayer.isSprinting() + && (aPlayer.onGround && Math.abs(aPlayer.motionX) + Math.abs(aPlayer.motionZ) > 0.10000000149011612D + || aPlayer.isInWater())) { + GTModHandler.useElectricItem(aStack, 100, aPlayer); + float bonus = 0.22F; + + if (aPlayer.isInWater()) { + GTModHandler.useElectricItem(aStack, 100, aPlayer); + bonus = 0.1F; + + if (aPlayer.motionY > 0) { + aPlayer.motionY += 0.10000000149011612D; + } + } + + aPlayer.moveFlying(0.0F, 1.0F, bonus); + } + } + + if ((mSpecials & 512) != 0) { + if (GTModHandler.canUseElectricItem(aStack, 10000)) { + GTModHandler.useElectricItem(aStack, 10000, aPlayer); + aPlayer.addPotionEffect(new PotionEffect(Potion.invisibility.getId(), 25, 1, true)); + } + } + + if (!aPlayer.worldObj.isRemote && (mSpecials & (16 | 32)) != 0) { + // if (GregTechAPI.sWorldTickCounter%20==0) { + ItemStack tTargetChargeItem = aStack, tTargetDechargeItem = aStack; + + if (GTModHandler.chargeElectricItem(tTargetChargeItem, 1, Integer.MAX_VALUE, true, true) < 1) { + tTargetChargeItem = aPlayer.inventory.armorInventory[2]; + } + if (GTModHandler.dischargeElectricItem(tTargetDechargeItem, 10, Integer.MAX_VALUE, true, true, true) < 10) { + tTargetDechargeItem = aPlayer.inventory.armorInventory[2]; + } + + if (tTargetChargeItem == null || !GTModHandler.isElectricItem(tTargetChargeItem)) { + tTargetChargeItem = null; + } + + if (aPlayer.worldObj.isDaytime() && aPlayer.worldObj.canBlockSeeTheSky( + MathHelper.floor_double(aPlayer.posX), + MathHelper.floor_double(aPlayer.posY + 1), + MathHelper.floor_double(aPlayer.posZ))) { + if ((mSpecials & 32) != 0 && tTargetChargeItem != null) { + GTModHandler.chargeElectricItem(tTargetChargeItem, 20, Integer.MAX_VALUE, true, false); + } + } else { + /* + * TODO: if ((mSpecials & 16) != 0 && tTargetDechargeItem != null && + * GTModHandler.canUseElectricItem(tTargetDechargeItem, 10)) { if (aPlayer.worldObj.getBlock + * ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ) == Blocks.air) aPlayer.worldObj.setBlock + * ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ, GregTechAPI.sBlockList[3]); + * GTModHandler.useElectricItem(tTargetDechargeItem, 10, aPlayer); } + */ + // } + } + } + } + + @Override + public boolean getShareTag() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item aItem, CreativeTabs creativeTab, List outputSubItems) { + ItemStack tCharged = new ItemStack(this, 1), tUncharged = new ItemStack(this, 1, getMaxDamage()); + GTModHandler.chargeElectricItem(tCharged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false); + outputSubItems.add(tCharged); + outputSubItems.add(tUncharged); + } + + public boolean canProvideEnergy(ItemStack aStack) { + if ((mSpecials & 1024) != 0) setCharge(aStack); + return mChargeProvider; + } + + public Item getChargedItem(ItemStack aStack) { + if ((mSpecials & 1024) != 0) setCharge(aStack); + return this; + } + + public Item getEmptyItem(ItemStack aStack) { + if ((mSpecials & 1024) != 0) setCharge(aStack); + return this; + } + + public int getMaxCharge(ItemStack aStack) { + if ((mSpecials & 1024) != 0) setCharge(aStack); + return mCharge; + } + + public int getTier(ItemStack aStack) { + if ((mSpecials & 1024) != 0) setCharge(aStack); + return mTier; + } + + public int getTransferLimit(ItemStack aStack) { + if ((mSpecials & 1024) != 0) setCharge(aStack); + return mTransfer; + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public boolean isBookEnchantable(ItemStack ingredient, ItemStack bookEnchant) { + return false; + } + + @Override + public boolean getIsRepairable(ItemStack toBeRepaired, ItemStack repairWith) { + return false; + } + + // TODO: @ForgeSubscribe + public void onEntityLivingFallEvent(LivingFallEvent event) { + if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer player) { + for (int i = 0; i < 4; i++) { + ItemStack armor = player.inventory.armorInventory[i]; + if (armor != null && armor.getItem() == this && (mSpecials & 2) != 0) { + int distanceFactor = (int) event.distance - 3; + int energyCost = (this.mDamageEnergyCost * distanceFactor) / 4; + if (energyCost <= GTModHandler + .dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true)) { + GTModHandler.dischargeElectricItem(armor, energyCost, Integer.MAX_VALUE, true, false, true); + event.setCanceled(true); + break; + } + } + } + } + } + + @Override + public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, + double damage, int slotIndex) { + return new ISpecialArmor.ArmorProperties( + (source == DamageSource.fall && (mSpecials & 2) != 0) ? 10 : 0, + getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage, + mDamageEnergyCost > 0 + ? 25 * GTModHandler.dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true) + / mDamageEnergyCost + : 0); + } + + @Override + public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slotIndex) { + return (int) Math.round(20.0D * getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage); + } + + @Override + public void damageArmor(EntityLivingBase entity, ItemStack itemStack, DamageSource source, int damage, + int slotIndex) { + GTModHandler.dischargeElectricItem(itemStack, damage * mDamageEnergyCost, Integer.MAX_VALUE, true, false, true); + } + + private double getBaseAbsorptionRatio() { + if (mArmorAbsorbtionPercentage <= 0) return 0.00; + return switch (this.armorType) { + case 0, 3 -> 0.15; + case 1 -> 0.40; + case 2 -> 0.30; + default -> 0.00; + }; + } +} diff --git a/src/main/java/gregtech/api/items/ItemRadioactiveCell.java b/src/main/java/gregtech/api/items/ItemRadioactiveCell.java new file mode 100644 index 0000000000..6efc652ef9 --- /dev/null +++ b/src/main/java/gregtech/api/items/ItemRadioactiveCell.java @@ -0,0 +1,159 @@ +package gregtech.api.items; + +import static gregtech.api.util.GTUtility.formatNumbers; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; + +import gregtech.common.items.ItemDepletedCell; +import ic2.api.item.IBoxable; +import ic2.core.util.StackUtil; + +public class ItemRadioactiveCell extends GTGenericItem implements IBoxable { + + protected int cellCount; + protected int maxDmg; + protected int dura; + + public ItemRadioactiveCell(String aUnlocalized, String aEnglish, int aCellcount) { + super(aUnlocalized, aEnglish, null); + this.setMaxStackSize(64); + this.setMaxDamage(100); + setNoRepair(); + this.cellCount = Math.max(1, aCellcount); + } + + public static int getDurabilityOfStack(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + return tNBT.getInteger("advDmg"); + } + + protected static int sumUp(int a) { + int b = 0; + for (int c = 1; c <= a; c++) { + b += c; + } + return b; + } + + protected static int triangularNumber(int x) { + return (x * x + x) / 2; + } + + protected boolean outputPulseForStack(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + tNBT.setInteger("output", tNBT.getInteger("output") + 1); + return false; // (this.pulserate > 0) || (tNBT.getInteger("output") % -this.pulserate == 0); + } + + protected boolean incrementPulseForStack(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + tNBT.setInteger("pulse", tNBT.getInteger("pulse") + 1); + return false; // (this.pulserate > 0) || (tNBT.getInteger("pulse") % -this.pulserate == 0); + } + + protected void setDurabilityForStack(ItemStack aStack, int aDurability) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + tNBT.setInteger("durability", aDurability); + } + + public int getMaxNuclearDurability() { + return 0; // return this.maxDelay; + } + + public int func_77619_b() { + return 0; + } + + @Override + public boolean isBookEnchantable(ItemStack ingredient, ItemStack bookEnchant) { + return false; + } + + // getIsRepairable + public boolean func_82789_a(ItemStack toBeRepaired, ItemStack repairWith) { + return false; + } + + public void setDamageForStack(ItemStack stack, int advDmg) { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + nbtData.setInteger("advDmg", advDmg); + if (this.maxDmg > 0) { + double p = (double) advDmg / (double) this.maxDmg; + int newDmg = (int) (stack.getMaxDamage() * p); + if (newDmg >= stack.getMaxDamage()) { + newDmg = stack.getMaxDamage() - 1; + } + stack.setItemDamage(newDmg); + this.dura = newDmg; + } + } + + public int getDamageOfStack(ItemStack stack) { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + this.dura = nbtData.getInteger("advDmg"); + return this.dura; + } + + public int getControlTagOfStack(ItemStack stack) { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + return nbtData.getInteger("tag"); + } + + public void setControlTagOfStack(ItemStack stack, int tag) { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + nbtData.setInteger("tag", tag); + } + + public int getMaxDamageEx() { + return this.maxDmg; + } + + public void damageItemStack(ItemStack stack, int Dmg) { + setDamageForStack(stack, getDamageOfStack(stack) + Dmg); + } + + @Override + public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + super.addAdditionalToolTips(aList, aStack, aPlayer); + // aList.add("Time left: " + (this.maxDelay - getDurabilityOfStack(aStack)) + " secs"); + int rDmg = getDurabilityOfStack(aStack) * 6 / this.maxDmg; + EnumChatFormatting color2 = switch (rDmg) { + case 0, 1 -> EnumChatFormatting.WHITE; + case 2, 3, 4 -> EnumChatFormatting.GRAY; + default -> EnumChatFormatting.DARK_GRAY; + }; + EnumChatFormatting color1 = this instanceof ItemDepletedCell ? color2 = EnumChatFormatting.DARK_GRAY + : EnumChatFormatting.WHITE; + aList.add( + color1 + String.format( + transItem("001", "Durability: %s/%s"), + "" + color2 + formatNumbers(this.maxDmg - getDurabilityOfStack(aStack)) + color1, + "" + formatNumbers(this.maxDmg))); + } + + @Override + public boolean canBeStoredInToolbox(ItemStack itemstack) { + return true; + } +} diff --git a/src/main/java/gregtech/api/items/ItemRadioactiveCellIC.java b/src/main/java/gregtech/api/items/ItemRadioactiveCellIC.java new file mode 100644 index 0000000000..de60fe9c33 --- /dev/null +++ b/src/main/java/gregtech/api/items/ItemRadioactiveCellIC.java @@ -0,0 +1,219 @@ +package gregtech.api.items; + +import java.util.ArrayList; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import gregtech.api.enums.GTValues; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTUtility; +import ic2.api.reactor.IReactor; +import ic2.api.reactor.IReactorComponent; +import ic2.core.IC2Potion; +import ic2.core.init.MainConfig; +import ic2.core.util.ConfigUtil; + +public class ItemRadioactiveCellIC extends ItemRadioactiveCell implements IReactorComponent { + + private static final int MYSTERIOUS_MULTIPLIER_HEAT = 4; + public final int numberOfCells; + public final float sEnergy; + public final int sRadiation; + public final float sHeat; + public final ItemStack sDepleted; + public final boolean sMox; + + public ItemRadioactiveCellIC(String aUnlocalized, String aEnglish, int aCellcount, int maxDamage, float aEnergy, + int aRadiation, float aHeat, ItemStack aDepleted, boolean aMox) { + super(aUnlocalized, aEnglish, aCellcount); + setMaxStackSize(64); + this.maxDmg = maxDamage; + this.numberOfCells = aCellcount; + this.sEnergy = aEnergy; + this.sRadiation = aRadiation; + this.sHeat = aHeat; + this.sDepleted = aDepleted; + this.sMox = aMox; + if (aDepleted != null && aEnergy > 0 && aHeat > 0) { + // avoid adding depleted cells to recipe map + + int pulses = aCellcount / 2 + 1; + + // for the mysterious constant 5.0f, + // see ic2.core.block.reactor.tileentity.TileEntityNuclearReactorElectric.getOfferedEnergy + // don't ask, just accept + float nukePowerMult = 5.0f * ConfigUtil.getFloat(MainConfig.get(), "balance/energy/generator/nuclear"); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this)) + .itemOutputs(aDepleted) + .setNEIDesc( + aMox ? "MOX Model" : "Uranium Model", + "Neutron Pulse: " + aCellcount, + aCellcount == 1 + ? String.format("Heat: %.1f * n1 * (n1 + 1)", (aHeat * MYSTERIOUS_MULTIPLIER_HEAT) / 2f) + : String.format( + "Heat: %.1f * (%d + n1) * (%d + n1)", + (aHeat * MYSTERIOUS_MULTIPLIER_HEAT) * aCellcount / 2f, + aCellcount, + aCellcount + 1), + String.format( + "Energy: %.1f + n2 * %.1f EU/t", + aEnergy * aCellcount * pulses * nukePowerMult, + aEnergy * nukePowerMult)) + .duration(0) + .eut(0) + .addTo(RecipeMaps.ic2NuclearFakeRecipes); + } + } + + private static int checkPulseable(IReactor reactor, int x, int y, ItemStack me, int mex, int mey, boolean heatrun) { + ItemStack other = reactor.getItemAt(x, y); + if ((other != null) && ((other.getItem() instanceof IReactorComponent)) + && (((IReactorComponent) other.getItem()) + .acceptUraniumPulse(reactor, other, me, x, y, mex, mey, heatrun))) { + return 1; + } + return 0; + } + + @Override + public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) { + if (!reactor.produceEnergy()) { + return; + } + for (int iteration = 0; iteration < this.numberOfCells; iteration++) { + int pulses = 1 + this.numberOfCells / 2; + if (!heatrun) { + for (int i = 0; i < pulses; i++) { + acceptUraniumPulse(reactor, yourStack, yourStack, x, y, x, y, heatrun); + } + checkPulseable(reactor, x - 1, y, yourStack, x, y, heatrun); + checkPulseable(reactor, x + 1, y, yourStack, x, y, heatrun); + checkPulseable(reactor, x, y - 1, yourStack, x, y, heatrun); + checkPulseable(reactor, x, y + 1, yourStack, x, y, heatrun); + } else { + pulses += checkPulseable(reactor, x - 1, y, yourStack, x, y, heatrun) + + checkPulseable(reactor, x + 1, y, yourStack, x, y, heatrun) + + checkPulseable(reactor, x, y - 1, yourStack, x, y, heatrun) + + checkPulseable(reactor, x, y + 1, yourStack, x, y, heatrun); + + // int heat = sumUp(pulses) * 4; + + int heat = triangularNumber(pulses) * MYSTERIOUS_MULTIPLIER_HEAT; + + heat = getFinalHeat(reactor, yourStack, x, y, heat); + + ArrayList heatAcceptors = new ArrayList<>(); + checkHeatAcceptor(reactor, x - 1, y, heatAcceptors); + checkHeatAcceptor(reactor, x + 1, y, heatAcceptors); + checkHeatAcceptor(reactor, x, y - 1, heatAcceptors); + checkHeatAcceptor(reactor, x, y + 1, heatAcceptors); + heat = Math.round(heat * sHeat); + while ((heatAcceptors.size() > 0) && (heat > 0)) { + + int dheat = heat / heatAcceptors.size(); + heat -= dheat; + dheat = ((IReactorComponent) heatAcceptors.get(0).stack.getItem()).alterHeat( + reactor, + heatAcceptors.get(0).stack, + heatAcceptors.get(0).x, + heatAcceptors.get(0).y, + dheat); + heat += dheat; + heatAcceptors.remove(0); + } + if (heat > 0) { + reactor.addHeat(heat); + } + } + } + if (getDamageOfStack(yourStack) >= getMaxDamageEx() - 1) { + reactor.setItemAt(x, y, sDepleted.copy()); + } else if (heatrun) { + damageItemStack(yourStack, 1); + } + } + + protected int getFinalHeat(IReactor reactor, ItemStack stack, int x, int y, int heat) { + if (sMox && reactor.isFluidCooled()) { + float breedereffectiveness = (float) reactor.getHeat() / (float) reactor.getMaxHeat(); + if (breedereffectiveness > 0.5D) { + heat *= 2; + } + } + return heat; + } + + private void checkHeatAcceptor(IReactor reactor, int x, int y, ArrayList heatAcceptors) { + ItemStack thing = reactor.getItemAt(x, y); + if ((thing != null) && ((thing.getItem() instanceof IReactorComponent)) + && (((IReactorComponent) thing.getItem()).canStoreHeat(reactor, thing, x, y))) { + heatAcceptors.add(new ItemStackCoord(thing, x, y)); + } + } + + @Override + public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, + int pulseX, int pulseY, boolean heatrun) { + if (!heatrun) { + if (sMox) { + float breedereffectiveness = (float) reactor.getHeat() / (float) reactor.getMaxHeat(); + float ReaktorOutput = 1.5F * breedereffectiveness + 1.0F; + reactor.addOutput(ReaktorOutput * this.sEnergy); + } else { + reactor.addOutput(1.0F * this.sEnergy); + } + } + return true; + } + + @Override + public boolean canStoreHeat(IReactor reactor, ItemStack yourStack, int x, int y) { + return false; + } + + @Override + public int getMaxHeat(IReactor reactor, ItemStack yourStack, int x, int y) { + return 0; + } + + @Override + public int getCurrentHeat(IReactor reactor, ItemStack yourStack, int x, int y) { + return 0; + } + + @Override + public int alterHeat(IReactor reactor, ItemStack yourStack, int x, int y, int heat) { + return heat; + } + + @Override + public float influenceExplosion(IReactor reactor, ItemStack yourStack) { + return 2 * this.numberOfCells; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slotIndex, boolean isCurrentItem) { + if (this.sRadiation > 0 && (entity instanceof EntityLivingBase entityLiving)) { + if (!GTUtility.isWearingFullRadioHazmat(entityLiving)) { + IC2Potion.radiation.applyTo(entityLiving, sRadiation * 20, sRadiation * 10); + } + } + } + + private static class ItemStackCoord { + + public ItemStack stack; + public int x; + public int y; + + public ItemStackCoord(ItemStack stack1, int x1, int y1) { + this.stack = stack1; + this.x = x1; + this.y = y1; + } + } +} diff --git a/src/main/java/gregtech/api/items/ItemTool.java b/src/main/java/gregtech/api/items/ItemTool.java new file mode 100644 index 0000000000..0de68fc90e --- /dev/null +++ b/src/main/java/gregtech/api/items/ItemTool.java @@ -0,0 +1,41 @@ +package gregtech.api.items; + +import net.minecraft.item.ItemStack; + +import gregtech.api.util.GTModHandler; + +/** + * This is just a basic Tool, which has normal durability and could break Blocks. + */ +public class ItemTool extends GTGenericItem { + + public ItemTool(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage, + boolean aSwingIfUsed) { + this(aUnlocalized, aEnglish, aTooltip, aMaxDamage, aEntityDamage, aSwingIfUsed, -1, -1); + } + + public ItemTool(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage, + boolean aSwingIfUsed, int aChargedGTID, int aDisChargedGTID) { + this( + aUnlocalized, + aEnglish, + aTooltip, + aMaxDamage, + aEntityDamage, + aSwingIfUsed, + aChargedGTID, + aDisChargedGTID, + 0, + 0.0F); + } + + public ItemTool(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage, + boolean aSwingIfUsed, int aChargedGTID, int aDisChargedGTID, int aToolQuality, float aToolStrength) { + super(aUnlocalized, aEnglish, aTooltip); + setMaxDamage(aMaxDamage); + setMaxStackSize(1); + setNoRepair(); + setFull3D(); + GTModHandler.registerBoxableItemToToolBox(new ItemStack(this)); + } +} diff --git a/src/main/java/gregtech/api/items/MetaBaseItem.java b/src/main/java/gregtech/api/items/MetaBaseItem.java new file mode 100644 index 0000000000..23726c96e9 --- /dev/null +++ b/src/main/java/gregtech/api/items/MetaBaseItem.java @@ -0,0 +1,622 @@ +package gregtech.api.items; + +import static gregtech.api.enums.GTValues.D1; +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.util.GTUtility.formatNumbers; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.inventory.Container; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; + +import gregtech.api.enums.SubTag; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import ic2.api.item.ElectricItem; +import ic2.api.item.IElectricItem; +import ic2.api.item.IElectricItemManager; +import ic2.api.item.ISpecialElectricItem; + +public abstract class MetaBaseItem extends GTGenericItem + implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem { + + /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */ + private final ConcurrentHashMap>> mItemBehaviors = new ConcurrentHashMap<>(); + + /** + * Creates the Item using these Parameters. + * + * @param aUnlocalized The Unlocalized Name of this Item. + */ + public MetaBaseItem(String aUnlocalized) { + super(aUnlocalized, "Generated Item", null); + setHasSubtypes(true); + setMaxDamage(0); + } + + /** + * Adds a special Item Behaviour to the Item. + *

+ * 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 MetaBaseItem addItemBehavior(int aMetaValue, IItemBehaviour aBehavior) { + if (aMetaValue < 0 || aMetaValue >= 32766 || aBehavior == null) return this; + ArrayList> tList = mItemBehaviors + .computeIfAbsent((short) aMetaValue, k -> new ArrayList<>(1)); + tList.add(aBehavior); + return this; + } + + public abstract Long[] getElectricStats(ItemStack aStack); + + public abstract Long[] getFluidContainerStats(ItemStack aStack); + + @Override + public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) { + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + if (tList != null) for (IItemBehaviour tBehavior : tList) + if (tBehavior.hasProjectile(this, aProjectileType, aStack)) return true; + return super.hasProjectile(aProjectileType, aStack); + } + + @Override + public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, + double aZ) { + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + if (tList != null) for (IItemBehaviour tBehavior : tList) { + EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ); + if (rArrow != null) return rArrow; + } + return super.getProjectile(aProjectileType, aStack, aWorld, aX, aY, aZ); + } + + @Override + public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity, + float aSpeed) { + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + if (tList != null) for (IItemBehaviour tBehavior : tList) { + EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed); + if (rArrow != null) return rArrow; + } + return super.getProjectile(aProjectileType, aStack, aWorld, aEntity, aSpeed); + } + + @Override + public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) { + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + if (tList != null) for (IItemBehaviour tBehavior : tList) + if (tBehavior.canDispense(this, aSource, aStack)) return tBehavior.onDispense(this, aSource, aStack); + return super.onDispense(aSource, aStack); + } + + @Override + public boolean isItemStackUsable(ItemStack aStack) { + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + if (tList != null) for (IItemBehaviour tBehavior : tList) + if (!tBehavior.isItemStackUsable(this, aStack)) return false; + return super.isItemStackUsable(aStack); + } + + @Override + public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + use(aStack, 0, aPlayer); + isItemStackUsable(aStack); + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + try { + if (tList != null) for (IItemBehaviour tBehavior : tList) + if (tBehavior.onLeftClickEntity(this, aStack, aPlayer, aEntity)) { + if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); + return true; + } + if (aStack.stackSize <= 0) { + aPlayer.destroyCurrentEquippedItem(); + return false; + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + return false; + } + + @Override + public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, + int ordinalSide, float hitX, float hitY, float hitZ) { + use(aStack, 0, aPlayer); + isItemStackUsable(aStack); + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + try { + if (tList != null) for (IItemBehaviour tBehavior : tList) + if (tBehavior.onItemUse(this, aStack, aPlayer, aWorld, aX, aY, aZ, ordinalSide, hitX, hitY, hitZ)) { + if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); + return true; + } + if (aStack.stackSize <= 0) { + aPlayer.destroyCurrentEquippedItem(); + return false; + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + return false; + } + + @Override + public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, + int ordinalSide, float hitX, float hitY, float hitZ) { + use(aStack, 0, aPlayer); + isItemStackUsable(aStack); + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + try { + if (tList != null) for (IItemBehaviour tBehavior : tList) if (tBehavior.onItemUseFirst( + this, + aStack, + aPlayer, + aWorld, + aX, + aY, + aZ, + ForgeDirection.getOrientation(ordinalSide), + hitX, + hitY, + hitZ)) { + if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); + return true; + } + if (aStack.stackSize <= 0) { + aPlayer.destroyCurrentEquippedItem(); + return false; + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + use(aStack, 0, aPlayer); + isItemStackUsable(aStack); + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + try { + if (tList != null) for (IItemBehaviour tBehavior : tList) + aStack = tBehavior.onItemRightClick(this, aStack, aWorld, aPlayer); + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + return aStack; + } + + @Override + public final void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + String tKey = getUnlocalizedName(aStack) + ".tooltip"; + String[] tStrings = GTLanguageManager.getTranslation(tKey) + .split("/n "); + for (String tString : tStrings) + if (GTUtility.isStringValid(tString) && !tKey.equals(tString)) aList.add(tString); + + Long[] tStats = getElectricStats(aStack); + if (tStats != null) { + if (tStats[3] > 0) { + aList.add( + EnumChatFormatting.AQUA + String.format( + transItem("009", "Contains %s EU Tier: %s"), + formatNumbers(tStats[3]), + "" + (tStats[2] >= 0 ? tStats[2] : 0)) + EnumChatFormatting.GRAY); + } else { + long tCharge = getRealCharge(aStack); + if (tStats[3] == -2 && tCharge <= 0) { + aList.add( + EnumChatFormatting.AQUA + transItem("010", "Empty. You should recycle it properly.") + + EnumChatFormatting.GRAY); + } else { + aList.add( + EnumChatFormatting.AQUA + + String.format( + transItem("011", "%s / %s EU - Voltage: %s"), + formatNumbers(tCharge), + formatNumbers(Math.abs(tStats[0])), + "" + V[(int) (tStats[2] >= 0 ? tStats[2] < V.length ? tStats[2] : V.length - 1 : 1)]) + + EnumChatFormatting.GRAY); + } + } + } + + tStats = getFluidContainerStats(aStack); + if (tStats != null && tStats[0] > 0) { + FluidStack tFluid = getFluidContent(aStack); + aList.add( + EnumChatFormatting.BLUE + ((tFluid == null ? transItem("012", "No Fluids Contained") + : GTUtility.getFluidName(tFluid, true))) + EnumChatFormatting.GRAY); + aList.add( + EnumChatFormatting.BLUE + String.format( + transItem("013", "%sL / %sL"), + "" + (tFluid == null ? 0 : formatNumbers(tFluid.amount)), + "" + formatNumbers(tStats[0])) + EnumChatFormatting.GRAY); + } + + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + if (tList != null) for (IItemBehaviour tBehavior : tList) + aList = tBehavior.getAdditionalToolTips(this, aList, aStack); + + addAdditionalToolTips(aList, aStack, aPlayer); + } + + @Override + public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) { + ArrayList> tList = mItemBehaviors.get((short) getDamage(aStack)); + if (tList != null) for (IItemBehaviour tBehavior : tList) + tBehavior.onUpdate(this, aStack, aWorld, aPlayer, aTimer, aIsInHand); + } + + @Override + public final boolean canProvideEnergy(ItemStack aStack) { + Long[] tStats = getElectricStats(aStack); + if (tStats == null) return false; + return tStats[3] > 0 || (aStack.stackSize == 1 && (tStats[3] == -2 || tStats[3] == -3)); + } + + @Override + public final double getMaxCharge(ItemStack aStack) { + Long[] tStats = getElectricStats(aStack); + if (tStats == null) return 0; + return Math.abs(tStats[0]); + } + + @Override + public final double getTransferLimit(ItemStack aStack) { + Long[] tStats = getElectricStats(aStack); + if (tStats == null) return 0; + return Math.max(tStats[1], tStats[3]); + } + + @Override + public final double charge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit, + boolean aSimulate) { + Long[] tStats = getElectricStats(aStack); + if (tStats == null || tStats[2] > aTier + || !(tStats[3] == -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE)) + || aStack.stackSize != 1) return 0; + long tTransfer = aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge); + long tChargeBefore = getRealCharge(aStack), tNewCharge = Math.min( + Math.abs(tStats[0]), + Long.MAX_VALUE - tTransfer >= tChargeBefore ? tChargeBefore + tTransfer : Long.MAX_VALUE); + if (!aSimulate) setCharge(aStack, tNewCharge); + return tNewCharge - tChargeBefore; + } + + @Override + public final double discharge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit, + boolean aBatteryAlike, boolean aSimulate) { + Long[] tStats = getElectricStats(aStack); + if (tStats == null || tStats[2] > aTier) return 0; + if (aBatteryAlike && !canProvideEnergy(aStack)) return 0; + if (tStats[3] > 0) { + if (aCharge < tStats[3] || aStack.stackSize < 1) return 0; + if (!aSimulate) aStack.stackSize--; + return tStats[3]; + } + long tChargeBefore = getRealCharge(aStack), tNewCharge = Math + .max(0, tChargeBefore - (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge))); + if (!aSimulate) setCharge(aStack, tNewCharge); + return tChargeBefore - tNewCharge; + } + + @Override + public final double getCharge(ItemStack aStack) { + return getRealCharge(aStack); + } + + @Override + public final boolean canUse(ItemStack aStack, double aAmount) { + return getRealCharge(aStack) >= aAmount; + } + + @Override + public final boolean use(ItemStack aStack, double aAmount, EntityLivingBase aPlayer) { + chargeFromArmor(aStack, aPlayer); + if (aPlayer instanceof EntityPlayer && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) return true; + double tTransfer = discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true); + if (Math.abs(tTransfer - aAmount) < .0000001) { + discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false); + chargeFromArmor(aStack, aPlayer); + return true; + } + discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false); + chargeFromArmor(aStack, aPlayer); + return false; + } + + @Override + public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) { + if (aPlayer == null || aPlayer.worldObj.isRemote) return; + for (int i = 1; i < 5; i++) { + ItemStack tArmor = aPlayer.getEquipmentInSlot(i); + if (GTModHandler.isElectricItem(tArmor)) { + IElectricItem tArmorItem = (IElectricItem) tArmor.getItem(); + if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >= getTier(aStack)) { + double tCharge = ElectricItem.manager.discharge( + tArmor, + charge(aStack, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, true, true), + Integer.MAX_VALUE, + true, + true, + false); + if (tCharge > 0) { + charge(aStack, tCharge, Integer.MAX_VALUE, true, false); + if (aPlayer instanceof EntityPlayer) { + Container tContainer = ((EntityPlayer) aPlayer).openContainer; + if (tContainer != null) tContainer.detectAndSendChanges(); + } + } + } + } + } + } + + /* + * @Override public final int getMaxCharge(ItemStack aStack) { Long[] tStats = getElectricStats(aStack); if (tStats + * == null) return 0; return (int)Math.abs(tStats[0]); } + * @Override public final int getTransferLimit(ItemStack aStack) { Long[] tStats = getElectricStats(aStack); if + * (tStats == null) return 0; return (int)Math.max(tStats[1], tStats[3]); } + * @Override public final int charge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit, boolean + * aSimulate) { Long[] tStats = getElectricStats(aStack); if (tStats == null || tStats[2] > aTier || !(tStats[3] == + * -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE)) || aStack.stackSize != 1) return 0; + * long tChargeBefore = getRealCharge(aStack), tNewCharge = + * aCharge==Integer.MAX_VALUE?Long.MAX_VALUE:Math.min(Math.abs(tStats[0]), tChargeBefore + + * (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge))); if (!aSimulate) setCharge(aStack, tNewCharge); + * return (int)(tNewCharge-tChargeBefore); } + * @Override public final int discharge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit, + * boolean aSimulate) { Long[] tStats = getElectricStats(aStack); if (tStats == null || tStats[2] > aTier) return 0; + * if (tStats[3] > 0) { if (aCharge < tStats[3] || aStack.stackSize < 1) return 0; if (!aSimulate) + * aStack.stackSize--; return (int)(long)tStats[3]; } long tChargeBefore = getRealCharge(aStack), tNewCharge = + * Math.max(0, tChargeBefore - (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge))); if (!aSimulate) + * setCharge(aStack, tNewCharge); return (int)(tChargeBefore-tNewCharge); } + * @Override public final int getCharge(ItemStack aStack) { return (int)Math.min(Integer.MAX_VALUE, + * getRealCharge(aStack)); } + * @Override public final boolean canUse(ItemStack aStack, int aAmount) { return getRealCharge(aStack) >= aAmount; } + * @Override public final boolean use(ItemStack aStack, int aAmount, EntityLivingBase aPlayer) { + * chargeFromArmor(aStack, aPlayer); if (aPlayer instanceof EntityPlayer && + * ((EntityPlayer)aPlayer).capabilities.isCreativeMode) return true; int tTransfer = discharge(aStack, aAmount, + * Integer.MAX_VALUE, true, true); if (tTransfer == aAmount) { discharge(aStack, aAmount, Integer.MAX_VALUE, true, + * false); chargeFromArmor(aStack, aPlayer); return true; } discharge(aStack, aAmount, Integer.MAX_VALUE, true, + * false); chargeFromArmor(aStack, aPlayer); return false; } + * @Override public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) { if (aPlayer == null || + * aPlayer.worldObj.isRemote) return; for (int i = 1; i < 5; i++) { ItemStack tArmor = + * aPlayer.getEquipmentInSlot(i); if (GTModHandler.isElectricItem(tArmor)) { IElectricItem tArmorItem = + * (IElectricItem)tArmor.getItem(); if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >= + * getTier(aStack)) { int tCharge = ElectricItem.manager.discharge(tArmor, charge(aStack, Integer.MAX_VALUE-1, + * Integer.MAX_VALUE, true, true), Integer.MAX_VALUE, true, false); if (tCharge > 0) { charge(aStack, tCharge, + * Integer.MAX_VALUE, true, false); if (aPlayer instanceof EntityPlayer) { Container tContainer = + * ((EntityPlayer)aPlayer).openContainer; if (tContainer != null) tContainer.detectAndSendChanges(); } } } } } } + */ + public final long getRealCharge(ItemStack aStack) { + Long[] tStats = getElectricStats(aStack); + if (tStats == null) return 0; + if (tStats[3] > 0) return (int) (long) tStats[3]; + NBTTagCompound tNBT = aStack.getTagCompound(); + return tNBT == null ? 0 : tNBT.getLong("GT.ItemCharge"); + } + + public final boolean setCharge(ItemStack aStack, long aCharge) { + Long[] tStats = getElectricStats(aStack); + if (tStats == null || tStats[3] > 0) return false; + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) tNBT = new NBTTagCompound(); + tNBT.removeTag("GT.ItemCharge"); + aCharge = Math.min(tStats[0] < 0 ? Math.abs(tStats[0] / 2) : aCharge, Math.abs(tStats[0])); + if (aCharge > 0) { + aStack.setItemDamage(getChargedMetaData(aStack)); + tNBT.setLong("GT.ItemCharge", aCharge); + } else { + aStack.setItemDamage(getEmptyMetaData(aStack)); + } + if (tNBT.hasNoTags()) aStack.setTagCompound(null); + else aStack.setTagCompound(tNBT); + isItemStackUsable(aStack); + return true; + } + + public short getChargedMetaData(ItemStack aStack) { + return (short) aStack.getItemDamage(); + } + + public short getEmptyMetaData(ItemStack aStack) { + return (short) aStack.getItemDamage(); + } + + @Override + public FluidStack getFluid(ItemStack aStack) { + return getFluidContent(aStack); + } + + @Override + public int getCapacity(ItemStack aStack) { + Long[] tStats = getFluidContainerStats(aStack); + return tStats == null ? 0 : (int) Math.max(0, tStats[0]); + } + + @Override + public int fill(ItemStack aStack, FluidStack aFluid, boolean doFill) { + if (aStack == null || aStack.stackSize != 1) return 0; + + ItemStack tStack = GTUtility.fillFluidContainer(aFluid, aStack, false, false); + if (tStack != null) { + aStack.setItemDamage(tStack.getItemDamage()); + aStack.func_150996_a(tStack.getItem()); + return GTUtility.getFluidForFilledItem(tStack, false).amount; + } + + Long[] tStats = getFluidContainerStats(aStack); + if (tStats == null || tStats[0] <= 0 + || aFluid == null + || aFluid.getFluid() + .getID() <= 0 + || aFluid.amount <= 0) return 0; + + FluidStack tFluid = getFluidContent(aStack); + + if (tFluid == null || tFluid.getFluid() + .getID() <= 0) { + if (aFluid.amount <= tStats[0]) { + if (doFill) { + setFluidContent(aStack, aFluid); + } + return aFluid.amount; + } + if (doFill) { + tFluid = aFluid.copy(); + tFluid.amount = (int) (long) tStats[0]; + setFluidContent(aStack, tFluid); + } + return (int) (long) tStats[0]; + } + + if (!tFluid.isFluidEqual(aFluid)) return 0; + + int space = (int) (long) tStats[0] - tFluid.amount; + if (aFluid.amount <= space) { + if (doFill) { + tFluid.amount += aFluid.amount; + setFluidContent(aStack, tFluid); + } + return aFluid.amount; + } + if (doFill) { + tFluid.amount = (int) (long) tStats[0]; + setFluidContent(aStack, tFluid); + } + return space; + } + + @Override + public FluidStack drain(ItemStack aStack, int maxDrain, boolean doDrain) { + if (aStack == null || aStack.stackSize != 1) return null; + + FluidStack tFluid = GTUtility.getFluidForFilledItem(aStack, false); + if (tFluid != null && maxDrain >= tFluid.amount) { + ItemStack tStack = GTUtility.getContainerItem(aStack, false); + if (tStack == null) { + if (doDrain) aStack.stackSize = 0; + return tFluid; + } + if (doDrain) { + aStack.setItemDamage(tStack.getItemDamage()); + aStack.func_150996_a(tStack.getItem()); + } + return tFluid; + } + + Long[] tStats = getFluidContainerStats(aStack); + if (tStats == null || tStats[0] <= 0) return null; + + tFluid = getFluidContent(aStack); + if (tFluid == null) return null; + + int used = maxDrain; + if (tFluid.amount < used) used = tFluid.amount; + if (doDrain) { + tFluid.amount -= used; + setFluidContent(aStack, tFluid); + } + + FluidStack drained = tFluid.copy(); + drained.amount = used; + return drained; + } + + public FluidStack getFluidContent(ItemStack aStack) { + Long[] tStats = getFluidContainerStats(aStack); + if (tStats == null || tStats[0] <= 0) return GTUtility.getFluidForFilledItem(aStack, false); + NBTTagCompound tNBT = aStack.getTagCompound(); + return tNBT == null ? null : FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("GT.FluidContent")); + } + + public void setFluidContent(ItemStack aStack, FluidStack aFluid) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) tNBT = new NBTTagCompound(); + else tNBT.removeTag("GT.FluidContent"); + if (aFluid != null && aFluid.amount > 0) + tNBT.setTag("GT.FluidContent", aFluid.writeToNBT(new NBTTagCompound())); + if (tNBT.hasNoTags()) aStack.setTagCompound(null); + else aStack.setTagCompound(tNBT); + isItemStackUsable(aStack); + } + + @Override + public int getItemStackLimit(ItemStack aStack) { + Long[] tStats = getElectricStats(aStack); + if (tStats != null && (tStats[3] == -1 || tStats[3] == -2 || tStats[3] == -3) && getRealCharge(aStack) > 0) + return 1; + tStats = getFluidContainerStats(aStack); + if (tStats != null) return (int) (long) tStats[1]; + if (getDamage(aStack) == 32763) return 1; + return 64; + } + + @Override + public final Item getChargedItem(ItemStack itemStack) { + return this; + } + + @Override + public final Item getEmptyItem(ItemStack itemStack) { + return this; + } + + @Override + public final int getTier(ItemStack aStack) { + Long[] tStats = getElectricStats(aStack); + return (int) (tStats == null ? Integer.MAX_VALUE : tStats[2]); + } + + @Override + public final String getToolTip(ItemStack aStack) { + return null; + } // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up at this Point + + @Override + public final IElectricItemManager getManager(ItemStack aStack) { + return this; + } // We are our own Manager + + @Override + public final boolean getShareTag() { + return true; + } // just to be sure. + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { + return false; + } + + @Override + public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { + return false; + } +} diff --git a/src/main/java/gregtech/api/items/MetaGeneratedItem.java b/src/main/java/gregtech/api/items/MetaGeneratedItem.java new file mode 100644 index 0000000000..449b1ced24 --- /dev/null +++ b/src/main/java/gregtech/api/items/MetaGeneratedItem.java @@ -0,0 +1,415 @@ +package gregtech.api.items; + +import static gregtech.api.enums.GTValues.D1; +import static gregtech.api.enums.Mods.AppleCore; +import static gregtech.api.enums.Mods.GregTech; +import static gregtech.api.recipe.RecipeMaps.cannerRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Mods; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TCAspects.TC_AspectStack; +import gregtech.api.interfaces.IFoodStat; +import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.interfaces.IItemContainer; +import gregtech.api.objects.ItemData; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.render.items.GeneratedMaterialRenderer; +import squeek.applecore.api.food.FoodValues; +import squeek.applecore.api.food.IEdible; +import squeek.applecore.api.food.ItemFoodProxy; + +/** + * @author Gregorius Techneticies + *

+ * One Item for everything! + *

+ * 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. + *

+ * 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. + *

+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike + * Item. + */ +@Optional.Interface(iface = "squeek.applecore.api.food.IEdible", modid = Mods.Names.APPLE_CORE) +public abstract class MetaGeneratedItem extends MetaBaseItem implements IGT_ItemWithMaterialRenderer, IEdible { + + /** + * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this + * Type, if useStandardMetaItemRenderer() returns true. + *

+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item. + */ + public static final ConcurrentHashMap sInstances = new ConcurrentHashMap<>(); + + /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */ + + public final short mOffset, mItemAmount; + public final BitSet mEnabledItems; + public final BitSet mVisibleItems; + public final IIcon[][] mIconList; + + public final ConcurrentHashMap mFoodStats = new ConcurrentHashMap<>(); + public final ConcurrentHashMap mElectricStats = new ConcurrentHashMap<>(); + public final ConcurrentHashMap mFluidContainerStats = new ConcurrentHashMap<>(); + public final ConcurrentHashMap mBurnValues = new ConcurrentHashMap<>(); + + /** + * Creates the Item using these Parameters. + * + * @param aUnlocalized The Unlocalized Name of this Item. + */ + public MetaGeneratedItem(String aUnlocalized, short aOffset, short aItemAmount) { + super(aUnlocalized); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + setHasSubtypes(true); + setMaxDamage(0); + mEnabledItems = new BitSet(aItemAmount); + mVisibleItems = new BitSet(aItemAmount); + + mOffset = (short) Math.min(32766, aOffset); + mItemAmount = (short) Math.min(aItemAmount, 32766 - mOffset); + mIconList = new IIcon[aItemAmount][1]; + + sInstances.put(getUnlocalizedName(), this); + } + + /** + * This adds a Custom Item to the ending Range. + * + * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset) + * @param aEnglish The Default Localized Name of the created Item + * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip + * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things. + * @return An ItemStack containing the newly created Item. + */ + public final ItemStack addItem(int aID, String aEnglish, String aToolTip, Object... aRandomData) { + if (aToolTip == null) aToolTip = ""; + if (aID >= 0 && aID < mItemAmount) { + ItemStack rStack = new ItemStack(this, 1, mOffset + aID); + if (mEnabledItems.get(aID)) { + throw new IllegalArgumentException( + String.format("ID %s is already reserved for %s!", aID, rStack.getDisplayName())); + } + mEnabledItems.set(aID); + mVisibleItems.set(aID); + GTLanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".name", aEnglish); + GTLanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".tooltip", aToolTip); + List tAspects = new ArrayList<>(); + // Important Stuff to do first + for (Object tRandomData : aRandomData) if (tRandomData instanceof SubTag) { + if (tRandomData == SubTag.INVISIBLE) { + mVisibleItems.set(aID, false); + continue; + } + if (tRandomData == SubTag.NO_UNIFICATION) { + GTOreDictUnificator.addToBlacklist(rStack); + } + } + // now check for the rest + for (Object tRandomData : aRandomData) if (tRandomData != null) { + boolean tUseOreDict = true; + if (tRandomData instanceof IFoodStat) { + setFoodBehavior(mOffset + aID, (IFoodStat) tRandomData); + if (((IFoodStat) tRandomData).getFoodAction(this, rStack) == EnumAction.eat) { + int tFoodValue = ((IFoodStat) tRandomData).getFoodLevel(this, rStack, null); + if (tFoodValue > 0) { + GTValues.RA.stdBuilder() + .itemInputs(rStack, ItemList.IC2_Food_Can_Empty.get(tFoodValue)) + .itemOutputs( + ((IFoodStat) tRandomData).isRotten(this, rStack, null) + ? ItemList.IC2_Food_Can_Spoiled.get(tFoodValue) + : ItemList.IC2_Food_Can_Filled.get(tFoodValue)) + .duration(tFoodValue * 5 * SECONDS) + .eut(1) + .addTo(cannerRecipes); + } + } + tUseOreDict = false; + } + if (tRandomData instanceof IItemBehaviour) { + // The cast below from is not safe. If you know how to make it safe, please do. + // noinspection unchecked + addItemBehavior(mOffset + aID, (IItemBehaviour) 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 (GTUtility.isStringValid(tRandomData)) GTOreDictUnificator.registerOre(tRandomData, rStack); + else GTOreDictUnificator.addItemData(rStack, (ItemData) tRandomData); + continue; + } + if (tUseOreDict) { + GTOreDictUnificator.registerOre(tRandomData, rStack); + } + } + if (GregTechAPI.sThaumcraftCompat != null) + GregTechAPI.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false); + return rStack; + } + return null; + } + + /** + * Sets a Food Behavior for the Item. + * + * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] + * @param aFoodBehavior the Food Behavior you want to add. + * @return the Item itself for convenience in constructing. + */ + public final MetaGeneratedItem setFoodBehavior(int aMetaValue, IFoodStat aFoodBehavior) { + if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this; + if (aFoodBehavior == null) mFoodStats.remove((short) aMetaValue); + else mFoodStats.put((short) aMetaValue, aFoodBehavior); + return this; + } + + /** + * Sets the Furnace Burn Value for the Item. + * + * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] + * @param aValue 200 = 1 Burn Process = 500 EU, max = 32767 (that is 81917.5 EU) + * @return the Item itself for convenience in constructing. + */ + public final MetaGeneratedItem setBurnValue(int aMetaValue, int aValue) { + if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length() || aValue < 0) return this; + if (aValue == 0) mBurnValues.remove((short) aMetaValue); + else mBurnValues.put((short) aMetaValue, aValue > Short.MAX_VALUE ? Short.MAX_VALUE : (short) aValue); + return this; + } + + /** + * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] + * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior) + * @param aTransferLimit Transfer Limit. + * @param aTier The electric Tier. + * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to + * make this Battery chargeable (the use and canUse Functions will still discharge if you just + * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make + * this Battery charge/discharge-able. + * @return the Item itself for convenience in constructing. + */ + public final MetaGeneratedItem setElectricStats(int aMetaValue, long aMaxCharge, long aTransferLimit, long aTier, + long aSpecialData, boolean aUseAnimations) { + if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this; + if (aMaxCharge == 0) mElectricStats.remove((short) aMetaValue); + else { + mElectricStats.put( + (short) aMetaValue, + new Long[] { aMaxCharge, Math.max(0, aTransferLimit), Math.max(-1, aTier), aSpecialData }); + if (aMetaValue >= mOffset && aUseAnimations) mIconList[aMetaValue - mOffset] = Arrays + .copyOf(mIconList[aMetaValue - mOffset], Math.max(9, mIconList[aMetaValue - mOffset].length)); + } + return this; + } + + /** + * + * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765] + * @param aCapacity fluid capacity in L or mb + * @param aStacksize item stack size + * @return the Item itself for convenience in constructing. + */ + public final MetaGeneratedItem setFluidContainerStats(int aMetaValue, long aCapacity, long aStacksize) { + if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this; + if (aCapacity < 0) mElectricStats.remove((short) aMetaValue); + else mFluidContainerStats.put((short) aMetaValue, new Long[] { aCapacity, Math.max(1, aStacksize) }); + return this; + } + + /** + * @return if this MetaGenerated Item should use my Default Renderer System. + */ + public boolean useStandardMetaItemRenderer() { + return true; + } + + @Override + public short[] getRGBa(ItemStack aStack) { + return Materials._NULL.getRGBA(); + } + + /** + * @return the Icon the Material is going to be rendered with. + */ + public IIconContainer getIconContainer(int aMetaData) { + return null; + } + + @Override + public IIcon getIcon(int aMetaData, int pass) { + IIconContainer iconContainer = getIconContainer(aMetaData); + return iconContainer != null ? iconContainer.getIcon() : null; + } + + @Override + public IIcon getOverlayIcon(int aMetaData, int pass) { + IIconContainer iconContainer = getIconContainer(aMetaData); + return iconContainer != null ? iconContainer.getOverlayIcon() : null; + } + + @Override + public boolean shouldUseCustomRenderer(int aMetaData) { + return true; + } + + @Override + public GeneratedMaterialRenderer getMaterialRenderer(int aMetaData) { + return null; + } + + @Override + public boolean allowMaterialRenderer(int aMetaData) { + return aMetaData < this.mOffset; + } + + /* ---------- INTERNAL OVERRIDES ---------- */ + + @Override + public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); + if (tStat != null && aPlayer.canEat(tStat.alwaysEdible(this, aStack, aPlayer))) + aPlayer.setItemInUse(aStack, 32); + return super.onItemRightClick(aStack, aWorld, aPlayer); + } + + @Override + public int getMaxItemUseDuration(ItemStack aStack) { + return mFoodStats.get((short) getDamage(aStack)) == null ? 0 : 32; + } + + @Override + public EnumAction getItemUseAction(ItemStack aStack) { + IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); + return tStat == null ? EnumAction.none : tStat.getFoodAction(this, aStack); + } + + @Override + public final ItemStack onEaten(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); + if (tStat != null) { + if (AppleCore.isModLoaded()) { + aPlayer.getFoodStats() + .func_151686_a(getFoodProxy(this), aStack); + } else { + aPlayer.getFoodStats() + .addStats(tStat.getFoodLevel(this, aStack, aPlayer), tStat.getSaturation(this, aStack, aPlayer)); + } + tStat.onEaten(this, aStack, aPlayer); + } + return aStack; + } + + @Optional.Method(modid = Mods.Names.APPLE_CORE) + private static ItemFood getFoodProxy(Object edible) { + return new ItemFoodProxy((IEdible) edible); + } + + @Override + @Optional.Method(modid = Mods.Names.APPLE_CORE) + public FoodValues getFoodValues(ItemStack aStack) { + IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); + return tStat == null ? null + : new FoodValues(tStat.getFoodLevel(this, aStack, null), tStat.getSaturation(this, aStack, null)); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { + int j = mEnabledItems.length(); + for (int i = 0; i < j; i++) if (mVisibleItems.get(i) || (D1 && mEnabledItems.get(i))) { + Long[] tStats = mElectricStats.get((short) (mOffset + i)); + if (tStats != null && tStats[3] < 0) { + ItemStack tStack = new ItemStack(this, 1, mOffset + i); + setCharge(tStack, Math.abs(tStats[0])); + isItemStackUsable(tStack); + aList.add(tStack); + } + if (tStats == null || tStats[3] != -2) { + ItemStack tStack = new ItemStack(this, 1, mOffset + i); + isItemStackUsable(tStack); + aList.add(tStack); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public final void registerIcons(IIconRegister aIconRegister) { + short j = (short) mEnabledItems.length(); + for (short i = 0; i < j; i++) if (mEnabledItems.get(i)) { + for (byte k = 1; k < mIconList[i].length; k++) { + mIconList[i][k] = aIconRegister.registerIcon( + GregTech.getResourcePath(GTConfig.troll ? "troll" : getUnlocalizedName() + "/" + i + "/" + k)); + } + mIconList[i][0] = aIconRegister + .registerIcon(GregTech.getResourcePath(GTConfig.troll ? "troll" : getUnlocalizedName() + "/" + i)); + } + } + + @Override + public final Long[] getElectricStats(ItemStack aStack) { + return mElectricStats.get((short) aStack.getItemDamage()); + } + + @Override + public final Long[] getFluidContainerStats(ItemStack aStack) { + return mFluidContainerStats.get((short) aStack.getItemDamage()); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { + return false; + } + + @Override + public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { + return false; + } +} diff --git a/src/main/java/gregtech/api/items/MetaGeneratedItemX01.java b/src/main/java/gregtech/api/items/MetaGeneratedItemX01.java new file mode 100644 index 0000000000..29fc849a6f --- /dev/null +++ b/src/main/java/gregtech/api/items/MetaGeneratedItemX01.java @@ -0,0 +1,210 @@ +package gregtech.api.items; + +import static gregtech.api.enums.GTValues.M; + +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; + +/** + * @author Gregorius Techneticies + *

+ * One Item for everything! + *

+ * 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. + *

+ * 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. + *

+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike + * Item. + */ +public abstract class MetaGeneratedItemX01 extends MetaGeneratedItem { + + protected final OrePrefixes mPrefix; + protected final int mIconSetIndex; + + /** + * Creates the Item using these Parameters. This is for the new 1 Item = 1 Prefix System. + * + * @param aUnlocalized The Unlocalized Name of this Item. + * @param aGeneratedPrefix The OreDict Prefix you want to have generated. + * @param aIconSetIndex The TextureSet Index to be used. -1 for Defaulting to the Data contained in the Prefix. + * (this is only to be used for selecting the Icon in getIconContainer, nothing else) + */ + public MetaGeneratedItemX01(String aUnlocalized, OrePrefixes aGeneratedPrefix, int aIconSetIndex) { + super(aUnlocalized, (short) 32000, (short) 766); + mPrefix = aGeneratedPrefix; + mIconSetIndex = aIconSetIndex >= 0 ? aIconSetIndex + : aGeneratedPrefix.mTextureIndex >= 0 ? aGeneratedPrefix.mTextureIndex : 0; + + for (int i = 0; i < GregTechAPI.sGeneratedMaterials.length; i++) { + OrePrefixes tPrefix = mPrefix; + if (tPrefix == null) continue; + Materials tMaterial = GregTechAPI.sGeneratedMaterials[i]; + if (tMaterial == null) continue; + if (mPrefix.doGenerateItem(tMaterial)) { + ItemStack tStack = new ItemStack(this, 1, i); + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".name", + GTLanguageManager.i18nPlaceholder ? getDefaultLocalizationFormat(tPrefix, tMaterial, i) + : getDefaultLocalization(tPrefix, tMaterial, i)); + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".tooltip", + tMaterial.getToolTip(tPrefix.mMaterialAmount / M)); + String tOreName = getOreDictString(tPrefix, tMaterial); + tPrefix = OrePrefixes.getOrePrefix(tOreName); + if (tPrefix != null && tPrefix.mIsUnificatable) { + GTOreDictUnificator.set(tPrefix, OrePrefixes.getMaterial(tOreName, tPrefix), tStack); + } else { + GTOreDictUnificator.registerOre(tOreName, tStack); + } + } + } + } + + /* ---------- OVERRIDEABLE FUNCTIONS ---------- */ + + /** + * @param aPrefix the OreDict Prefix + * @param aMaterial the Material + * @param aMetaData a Index from [0 - 31999] + * @return the Localized Name when default LangFiles are used. + */ + public String getDefaultLocalization(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { + return aPrefix.getDefaultLocalNameForItem(aMaterial); + } + + /** + * @param aPrefix the OreDict Prefix + * @param aMaterial the Material + * @param aMetaData a Index from [0 - 31999] + * @return the Localized Name Format when default LangFiles are used. + */ + public String getDefaultLocalizationFormat(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { + return aPrefix.getDefaultLocalNameFormatForItem(aMaterial); + } + + /** + * @param aPrefix always != null + * @param aMaterial always != null + * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny + * Dusts or Crushed Ores as well. + * @return if this Item should be visible in NEI or Creative + */ + public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { + return true; + } + + /** + * @return the name of the Item to be registered at the OreDict. + */ + public String getOreDictString(OrePrefixes aPrefix, Materials aMaterial) { + return aPrefix.get(aMaterial) + .toString(); + } + + public IIconContainer getIconContainer(int aMetaData, Materials aMaterial) { + return aMaterial.mIconSet.mTextures[mIconSetIndex]; + } + + /* ---------- INTERNAL OVERRIDES ---------- */ + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + String aName = super.getItemStackDisplayName(aStack); + int aDamage = aStack.getItemDamage(); + if (aDamage < 32000 && aDamage >= 0) return Materials.getLocalizedNameForItem(aName, aDamage % 1000); + return aName; + } + + @Override + public ItemStack getContainerItem(ItemStack aStack) { + int aMetaData = aStack.getItemDamage(); + if (aMetaData < GregTechAPI.sGeneratedMaterials.length && aMetaData >= 0) { + Materials aMaterial = GregTechAPI.sGeneratedMaterials[aMetaData]; + if (aMaterial != null && aMaterial != Materials.Empty && aMaterial != Materials._NULL) { + return GTUtility.copyAmount(1, mPrefix.mContainerItem); + } + } + return null; + } + + @Override + public short[] getRGBa(ItemStack aStack) { + int aMetaData = getDamage(aStack); + return aMetaData < GregTechAPI.sGeneratedMaterials.length && GregTechAPI.sGeneratedMaterials[aMetaData] != null + ? GregTechAPI.sGeneratedMaterials[aMetaData].mRGBa + : Materials._NULL.mRGBa; + } + + @Override + public final IIconContainer getIconContainer(int aMetaData) { + return aMetaData < GregTechAPI.sGeneratedMaterials.length && GregTechAPI.sGeneratedMaterials[aMetaData] != null + ? getIconContainer(aMetaData, GregTechAPI.sGeneratedMaterials[aMetaData]) + : null; + } + + @Override + @SideOnly(Side.CLIENT) + public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < GregTechAPI.sGeneratedMaterials.length; i++) if (mPrefix + .doGenerateItem(GregTechAPI.sGeneratedMaterials[i]) + && doesShowInCreative(mPrefix, GregTechAPI.sGeneratedMaterials[i], GregTechAPI.sDoShowAllItemsInCreative)) { + ItemStack tStack = new ItemStack(this, 1, i); + isItemStackUsable(tStack); + aList.add(tStack); + } + super.getSubItems(aItem, aCreativeTab, aList); + } + + @Override + public final IIcon getIconFromDamage(int aMetaData) { + if (aMetaData < 0) return null; + if (aMetaData < GregTechAPI.sGeneratedMaterials.length) { + Materials tMaterial = GregTechAPI.sGeneratedMaterials[aMetaData]; + if (tMaterial == null) return null; + IIconContainer tIcon = getIconContainer(aMetaData, tMaterial); + if (tIcon != null) return tIcon.getIcon(); + return null; + } + return aMetaData >= mOffset && aMetaData - mOffset < mIconList.length ? mIconList[aMetaData - mOffset][0] + : null; + } + + @Override + public int getItemStackLimit(ItemStack aStack) { + return getDamage(aStack) < mOffset ? Math.min(super.getItemStackLimit(aStack), mPrefix.mDefaultStackSize) + : super.getItemStackLimit(aStack); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { + return false; + } + + @Override + public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { + return false; + } +} diff --git a/src/main/java/gregtech/api/items/MetaGeneratedItemX32.java b/src/main/java/gregtech/api/items/MetaGeneratedItemX32.java new file mode 100644 index 0000000000..cb83804ae1 --- /dev/null +++ b/src/main/java/gregtech/api/items/MetaGeneratedItemX32.java @@ -0,0 +1,225 @@ +package gregtech.api.items; + +import static gregtech.api.enums.GTValues.M; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.render.items.GeneratedMaterialRenderer; + +/** + * @author Gregorius Techneticies + *

+ * One Item for everything! + *

+ * 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. + *

+ * 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. + *

+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike + * Item. + */ +public abstract class MetaGeneratedItemX32 extends MetaGeneratedItem { + + 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 MetaGeneratedItemX32(String aUnlocalized, OrePrefixes... aGeneratedPrefixList) { + super(aUnlocalized, (short) 32000, (short) 766); + mGeneratedPrefixList = Arrays.copyOf(aGeneratedPrefixList, 32); + + for (int i = 0; i < 32000; i++) { + OrePrefixes tPrefix = mGeneratedPrefixList[i / 1000]; + if (tPrefix == null) continue; + if (tPrefix == OrePrefixes.___placeholder___) continue; + Materials tMaterial = GregTechAPI.sGeneratedMaterials[i % 1000]; + if (tMaterial == null) continue; + if (doesMaterialAllowGeneration(tPrefix, tMaterial)) { + ItemStack tStack = new ItemStack(this, 1, i); + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".name", + GTLanguageManager.i18nPlaceholder ? getDefaultLocalizationFormat(tPrefix, tMaterial, i) + : getDefaultLocalization(tPrefix, tMaterial, i)); + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".tooltip", + tMaterial.getToolTip(tPrefix.mMaterialAmount / M)); + if (tPrefix.mIsUnificatable) { + GTOreDictUnificator.set(tPrefix, tMaterial, tStack); + } else { + GTOreDictUnificator.registerOre(tPrefix.get(tMaterial), tStack); + } + if ((tPrefix == OrePrefixes.stick || tPrefix == OrePrefixes.wireFine || tPrefix == OrePrefixes.ingot) + && (tMaterial == Materials.Lead || tMaterial == Materials.Tin + || tMaterial == Materials.SolderingAlloy)) { + GregTechAPI.sSolderingMetalList.add(tStack); + GTModHandler.registerBoxableItemToToolBox(tStack); + } + } + } + } + + /* ---------- OVERRIDEABLE FUNCTIONS ---------- */ + + /** + * @return the Color Modulation the Material is going to be rendered with. + */ + @Override + public short[] getRGBa(ItemStack aStack) { + Materials tMaterial = GregTechAPI.sGeneratedMaterials[getDamage(aStack) % 1000]; + return tMaterial == null ? Materials._NULL.mRGBa : tMaterial.mRGBa; + } + + /** + * @param aPrefix this can be null, you have to return false in that case + * @param aMaterial this can be null, you have to return false in that case + * @return if this Item should be generated and visible. + */ + public boolean doesMaterialAllowGeneration(OrePrefixes aPrefix, Materials aMaterial) { + // You have to check for at least these Conditions in every Case! So add a super Call like the following for + // this before executing your Code: + // if (!super.doesMaterialAllowGeneration(aPrefix, aMaterial)) return false; + return aPrefix != null && aPrefix.doGenerateItem(aMaterial); + } + + /* ---------- OVERRIDEABLE FUNCTIONS ---------- */ + + /** + * @param aPrefix the OreDict Prefix + * @param aMaterial the Material + * @param aMetaData a Index from [0 - 31999] + * @return the Localized Name when default LangFiles are used. + */ + public String getDefaultLocalization(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { + return aPrefix.getDefaultLocalNameForItem(aMaterial); + } + + /** + * @param aPrefix the OreDict Prefix + * @param aMaterial the Material + * @param aMetaData a Index from [0 - 31999] + * @return the Localized Name Format when default LangFiles are used. + */ + public String getDefaultLocalizationFormat(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) { + return aPrefix.getDefaultLocalNameFormatForItem(aMaterial); + } + + /** + * @param aMetaData a Index from [0 - 31999] + * @param aMaterial the Material + * @return an Icon Container for the Item Display. + */ + public final IIconContainer getIconContainer(int aMetaData, Materials aMaterial) { + return mGeneratedPrefixList[aMetaData / 1000] != null + && mGeneratedPrefixList[aMetaData / 1000].mTextureIndex >= 0 + ? aMaterial.mIconSet.mTextures[mGeneratedPrefixList[aMetaData / 1000].mTextureIndex] + : null; + } + + /** + * @param aPrefix always != null + * @param aMaterial always != null + * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny + * Dusts or Crushed Ores as well. + * @return if this Item should be visible in NEI or Creative + */ + public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { + return true; + } + + /* ---------- INTERNAL OVERRIDES ---------- */ + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + String aName = super.getItemStackDisplayName(aStack); + int aDamage = aStack.getItemDamage(); + if (aDamage < 32000 && aDamage >= 0) return Materials.getLocalizedNameForItem(aName, aDamage % 1000); + return aName; + } + + @Override + public ItemStack getContainerItem(ItemStack aStack) { + int aDamage = aStack.getItemDamage(); + if (aDamage < 32000 && aDamage >= 0) { + Materials aMaterial = GregTechAPI.sGeneratedMaterials[aDamage % 1000]; + if (aMaterial != null && aMaterial != Materials.Empty && aMaterial != Materials._NULL) { + OrePrefixes aPrefix = mGeneratedPrefixList[aDamage / 1000]; + if (aPrefix != null) return GTUtility.copyAmount(1, aPrefix.mContainerItem); + } + } + return null; + } + + @Override + public final IIconContainer getIconContainer(int aMetaData) { + return GregTechAPI.sGeneratedMaterials[aMetaData % 1000] == null ? null + : getIconContainer(aMetaData, GregTechAPI.sGeneratedMaterials[aMetaData % 1000]); + } + + @Override + public GeneratedMaterialRenderer getMaterialRenderer(int aMetaData) { + return GregTechAPI.sGeneratedMaterials[aMetaData % 1000] == null ? null + : GregTechAPI.sGeneratedMaterials[aMetaData % 1000].renderer; + } + + @Override + @SideOnly(Side.CLIENT) + public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < 32000; i++) { + OrePrefixes aPrefix = mGeneratedPrefixList[i / 1000]; + Materials aMaterial = GregTechAPI.sGeneratedMaterials[i % 1000]; + if (aPrefix != null && aMaterial != null) { + if (doesMaterialAllowGeneration(aPrefix, aMaterial) + && doesShowInCreative(aPrefix, aMaterial, GregTechAPI.sDoShowAllItemsInCreative)) { + ItemStack tStack = new ItemStack(this, 1, i); + isItemStackUsable(tStack); + aList.add(tStack); + } + } + } + super.getSubItems(aItem, aCreativeTab, aList); + } + + @Override + public final IIcon getIconFromDamage(int aMetaData) { + if (aMetaData < 0) return null; + if (aMetaData < 32000) { + Materials tMaterial = GregTechAPI.sGeneratedMaterials[aMetaData % 1000]; + if (tMaterial == null) return null; + IIconContainer tIcon = getIconContainer(aMetaData, tMaterial); + if (tIcon != null) return tIcon.getIcon(); + return null; + } + return aMetaData - 32000 < mIconList.length ? mIconList[aMetaData - 32000][0] : null; + } + + @Override + public int getItemStackLimit(ItemStack aStack) { + int tDamage = getDamage(aStack); + if (tDamage < 32000 && mGeneratedPrefixList[tDamage / 1000] != null) + return Math.min(super.getItemStackLimit(aStack), mGeneratedPrefixList[tDamage / 1000].mDefaultStackSize); + return super.getItemStackLimit(aStack); + } +} diff --git a/src/main/java/gregtech/api/items/MetaGeneratedTool.java b/src/main/java/gregtech/api/items/MetaGeneratedTool.java new file mode 100644 index 0000000000..6487a67a6b --- /dev/null +++ b/src/main/java/gregtech/api/items/MetaGeneratedTool.java @@ -0,0 +1,1013 @@ +package gregtech.api.items; + +import static gregtech.api.util.GTUtility.formatNumbers; +import static gregtech.common.tileentities.machines.multi.MTELargeTurbineSteam.calculateLooseFlow; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityMinecart; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.stats.AchievementList; +import net.minecraft.stats.StatList; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.IShearable; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.world.BlockEvent; + +import appeng.api.implementations.items.IAEWrench; +import buildcraft.api.tools.IToolWrench; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import crazypants.enderio.api.tool.ITool; +import forestry.api.arboriculture.IToolGrafter; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enchants.EnchantmentRadioactivity; +import gregtech.api.enums.Materials; +import gregtech.api.enums.TCAspects.TC_AspectStack; +import gregtech.api.interfaces.IDamagableItem; +import gregtech.api.interfaces.IToolStats; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.tools.ToolTurbine; +import mods.railcraft.api.core.items.IToolCrowbar; +import mrtjp.projectred.api.IScrewdriver; + +/** + * This is an example on how you can create a Tool ItemStack, in this case a Bismuth Wrench: + * GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01").getToolWithStats(MetaGeneratedTool01.WRENCH, 1, + * Materials.Bismuth, Materials.Bismuth, null); + */ +@Optional.InterfaceList( + value = { + @Optional.Interface(iface = "forestry.api.arboriculture.IToolGrafter", modid = "ForestryAPI|arboriculture"), + @Optional.Interface(iface = "mods.railcraft.api.core.items.IToolCrowbar", modid = "RailcraftAPI|items"), + @Optional.Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraftAPI|tools"), + @Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = "EnderIOAPI|Tools"), + @Optional.Interface(iface = "mrtjp.projectred.api.IScrewdriver", modid = "ProjRed|Core"), }) +public abstract class MetaGeneratedTool extends MetaBaseItem + implements IDamagableItem, IToolGrafter, IToolCrowbar, IToolWrench, ITool, IScrewdriver, IAEWrench { + + /** + * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this + * Type, if useStandardMetaItemRenderer() returns true. + *

+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item. + */ + public static final ConcurrentHashMap sInstances = new ConcurrentHashMap<>(); + + /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */ + + public final ConcurrentHashMap mToolStats = new ConcurrentHashMap<>(); + + /** + * Creates the Item using these Parameters. + * + * @param aUnlocalized The Unlocalized Name of this Item. + */ + public MetaGeneratedTool(String aUnlocalized) { + super(aUnlocalized); + setCreativeTab(GregTechAPI.TAB_GREGTECH); + setMaxStackSize(1); + sInstances.put(getUnlocalizedName(), this); + } + + /* ---------- FOR ADDING CUSTOM ITEMS INTO THE REMAINING 766 RANGE ---------- */ + + public static final Materials getPrimaryMaterial(ItemStack aStack) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null) return Materials.getRealMaterial(aNBT.getString("PrimaryMaterial")); + } + return Materials._NULL; + } + + public static final Materials getSecondaryMaterial(ItemStack aStack) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null) return Materials.getRealMaterial(aNBT.getString("SecondaryMaterial")); + } + return Materials._NULL; + } + + /* ---------- INTERNAL OVERRIDES ---------- */ + + public static final long getToolMaxDamage(ItemStack aStack) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null) return aNBT.getLong("MaxDamage"); + } + return 0; + } + + public static final long getToolDamage(ItemStack aStack) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null) return aNBT.getLong("Damage"); + } + return 0; + } + + public static final boolean setToolDamage(ItemStack aStack, long aDamage) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null) { + aNBT.setLong("Damage", aDamage); + return true; + } + } + return false; + } + + public static final boolean setToolMode(ItemStack aStack, byte aMode) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null) { + aNBT.setByte("Mode", aMode); + return true; + } + } + return false; + } + + public static final byte getToolMode(ItemStack aStack) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null) return aNBT.getByte("Mode"); + } + return 0; + } + + /** + * This adds a Custom Item to the ending Range. + * + * @param aID The Id of the assigned Tool Class [0 - 32765] (only even Numbers allowed! Uneven + * ID's are empty electric Items) + * @param aEnglish The Default Localized Name of the created Item + * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no + * ToolTip + * @param aToolStats The Food Value of this Item. Can be null as well. + * @param aOreDictNamesAndAspects The OreDict Names you want to give the Item. Also used to assign Thaumcraft + * Aspects. + * @return An ItemStack containing the newly created Item, but without specific Stats. + */ + public final ItemStack addTool(int aID, String aEnglish, String aToolTip, IToolStats aToolStats, + Object... aOreDictNamesAndAspects) { + if (aToolTip == null) aToolTip = ""; + if (aID >= 0 && aID < 32766 && aID % 2 == 0) { + GTLanguageManager.addStringLocalization(getUnlocalizedName() + "." + aID + ".name", aEnglish); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + "." + aID + ".tooltip", aToolTip); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + "." + (aID + 1) + ".name", aEnglish + " (Empty)"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + "." + (aID + 1) + ".tooltip", "You need to recharge it"); + mToolStats.put((short) aID, aToolStats); + mToolStats.put((short) (aID + 1), aToolStats); + aToolStats.onStatsAddedToTool(this, aID); + ItemStack rStack = new ItemStack(this, 1, aID); + List tAspects = new ArrayList<>(); + for (Object tOreDictNameOrAspect : aOreDictNamesAndAspects) { + if (tOreDictNameOrAspect instanceof TC_AspectStack) + ((TC_AspectStack) tOreDictNameOrAspect).addToAspectList(tAspects); + else GTOreDictUnificator.registerOre(tOreDictNameOrAspect, rStack); + } + if (GregTechAPI.sThaumcraftCompat != null) + GregTechAPI.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false); + GTModHandler.registerBoxableItemToToolBox(rStack); + return rStack; + } + return null; + } + + /** + * This Function gets an ItemStack Version of this Tool + * + * @param aToolID the ID of the Tool Class + * @param aAmount Amount of Items (well normally you only need 1) + * @param aPrimaryMaterial Primary Material of this Tool + * @param aSecondaryMaterial Secondary (Rod/Handle) Material of this Tool + * @param aElectricArray The Electric Stats of this Tool (or null if not electric) + */ + public final ItemStack getToolWithStats(int aToolID, int aAmount, Materials aPrimaryMaterial, + Materials aSecondaryMaterial, long[] aElectricArray) { + ItemStack rStack = new ItemStack(this, aAmount, aToolID); + IToolStats tToolStats = getToolStats(rStack); + if (tToolStats != null) { + NBTTagCompound tMainNBT = new NBTTagCompound(), tToolNBT = new NBTTagCompound(); + tToolNBT.setByte("Mode", (byte) 0); + if (aPrimaryMaterial != null) { + tToolNBT.setString("PrimaryMaterial", aPrimaryMaterial.mName); + tToolNBT.setLong( + "MaxDamage", + 100L * (long) (aPrimaryMaterial.mDurability * tToolStats.getMaxDurabilityMultiplier())); + } + if (aSecondaryMaterial != null) tToolNBT.setString("SecondaryMaterial", aSecondaryMaterial.mName); + + if (aElectricArray != null) { + tToolNBT.setBoolean("Electric", true); + tToolNBT.setLong("MaxCharge", aElectricArray[0]); + tToolNBT.setLong("Voltage", aElectricArray[1]); + tToolNBT.setLong("Tier", aElectricArray[2]); + tToolNBT.setLong("SpecialData", aElectricArray[3]); + } + + tMainNBT.setTag("GT.ToolStats", tToolNBT); + rStack.setTagCompound(tMainNBT); + } + isItemStackUsable(rStack); + return rStack; + } + + /** + * Called by the Block Harvesting Event within the GTProxy + */ + @Mod.EventHandler + public void onHarvestBlockEvent(ArrayList aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, + int aX, int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + IToolStats tStats = getToolStats(aStack); + if (isItemStackUsable(aStack) && getDigSpeed(aStack, aBlock, aMetaData) > 0.0F) doDamage( + aStack, + (long) tStats + .convertBlockDrops(aDrops, aStack, aPlayer, aBlock, aX, aY, aZ, aMetaData, aFortune, aSilkTouch, aEvent) + * tStats.getToolDamagePerDropConversion()); + } + + @Mod.EventHandler + public float onBlockBreakSpeedEvent(float aDefault, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, PlayerEvent.BreakSpeed aEvent) { + IToolStats tStats = getToolStats(aStack); + return tStats == null ? aDefault + : tStats.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, aPlayer.worldObj, aX, aY, aZ); + } + + @Override + public boolean onBlockStartBreak(ItemStack aStack, int aX, int aY, int aZ, EntityPlayer aPlayer) { + if (aPlayer.worldObj.isRemote) { + return false; + } + IToolStats tStats = getToolStats(aStack); + Block aBlock = aPlayer.worldObj.getBlock(aX, aY, aZ); + if (tStats.isChainsaw() && (aBlock instanceof IShearable target)) { + if ((target.isShearable(aStack, aPlayer.worldObj, aX, aY, aZ))) { + ArrayList drops = target.onSheared( + aStack, + aPlayer.worldObj, + aX, + aY, + aZ, + EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, aStack)); + for (ItemStack stack : drops) { + float f = 0.7F; + double d = itemRand.nextFloat() * f + (1.0F - f) * 0.5D; + double d1 = itemRand.nextFloat() * f + (1.0F - f) * 0.5D; + double d2 = itemRand.nextFloat() * f + (1.0F - f) * 0.5D; + EntityItem entityitem = new EntityItem(aPlayer.worldObj, aX + d, aY + d1, aZ + d2, stack); + entityitem.delayBeforeCanPickup = 10; + aPlayer.worldObj.spawnEntityInWorld(entityitem); + } + aPlayer.addStat(net.minecraft.stats.StatList.mineBlockStatArray[Block.getIdFromBlock(aBlock)], 1); + onBlockDestroyed(aStack, aPlayer.worldObj, aBlock, aX, aY, aZ, aPlayer); + } + return false; + } + return super.onBlockStartBreak(aStack, aX, aY, aZ, aPlayer); + } + + @Override + public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + IToolStats tStats = getToolStats(aStack); + if (tStats == null || !isItemStackUsable(aStack)) return true; + GTUtility.doSoundAtClient(tStats.getEntityHitSound(), 1, 1.0F); + if (super.onLeftClickEntity(aStack, aPlayer, aEntity)) return true; + if (aEntity.canAttackWithItem() && !aEntity.hitByEntity(aPlayer)) { + float tMagicDamage = tStats.getMagicDamageAgainstEntity( + aEntity instanceof EntityLivingBase + ? EnchantmentHelper.getEnchantmentModifierLiving(aPlayer, (EntityLivingBase) aEntity) + : 0.0F, + aEntity, + aStack, + aPlayer), + tDamage = tStats.getNormalDamageAgainstEntity( + (float) aPlayer.getEntityAttribute(SharedMonsterAttributes.attackDamage) + .getAttributeValue() + getToolCombatDamage(aStack), + aEntity, + aStack, + aPlayer); + if (tDamage + tMagicDamage > 0.0F) { + boolean tCriticalHit = aPlayer.fallDistance > 0.0F && !aPlayer.onGround + && !aPlayer.isOnLadder() + && !aPlayer.isInWater() + && !aPlayer.isPotionActive(Potion.blindness) + && aPlayer.ridingEntity == null + && aEntity instanceof EntityLivingBase; + if (tCriticalHit && tDamage > 0.0F) tDamage *= 1.5F; + tDamage += tMagicDamage; + if (aEntity.attackEntityFrom(tStats.getDamageSource(aPlayer, aEntity), tDamage)) { + if (aEntity instanceof EntityLivingBase) + aEntity.setFire(EnchantmentHelper.getFireAspectModifier(aPlayer) * 4); + int tKnockcack = (aPlayer.isSprinting() ? 1 : 0) + (aEntity instanceof EntityLivingBase + ? EnchantmentHelper.getKnockbackModifier(aPlayer, (EntityLivingBase) aEntity) + : 0); + if (tKnockcack > 0) { + aEntity.addVelocity( + -MathHelper.sin(aPlayer.rotationYaw * (float) Math.PI / 180.0F) * tKnockcack * 0.5F, + 0.1D, + MathHelper.cos(aPlayer.rotationYaw * (float) Math.PI / 180.0F) * tKnockcack * 0.5F); + aPlayer.motionX *= 0.6D; + aPlayer.motionZ *= 0.6D; + aPlayer.setSprinting(false); + } + if (tCriticalHit) aPlayer.onCriticalHit(aEntity); + if (tMagicDamage > 0.0F) aPlayer.onEnchantmentCritical(aEntity); + if (tDamage >= 18.0F) aPlayer.triggerAchievement(AchievementList.overkill); + aPlayer.setLastAttacker(aEntity); + if (aEntity instanceof EntityLivingBase) + EnchantmentHelper.func_151384_a((EntityLivingBase) aEntity, aPlayer); + EnchantmentHelper.func_151385_b(aPlayer, aEntity); + if (aEntity instanceof EntityLivingBase) + aPlayer.addStat(StatList.damageDealtStat, Math.round(tDamage * 10.0F)); + aEntity.hurtResistantTime = Math + .max(1, tStats.getHurtResistanceTime(aEntity.hurtResistantTime, aEntity)); + aPlayer.addExhaustion(0.3F); + doDamage(aStack, tStats.getToolDamagePerEntityAttack()); + } + } + } + if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem(); + return true; + } + + @Override + public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + IToolStats tStats = getToolStats(aStack); + if (tStats != null && tStats.canBlock()) aPlayer.setItemInUse(aStack, 72000); + return super.onItemRightClick(aStack, aWorld, aPlayer); + } + + @Override + public final int getMaxItemUseDuration(ItemStack aStack) { + return 72000; + } + + @Override + public final EnumAction getItemUseAction(ItemStack aStack) { + IToolStats tStats = getToolStats(aStack); + if (tStats != null && tStats.canBlock()) return EnumAction.block; + return EnumAction.none; + } + + @Override + @SideOnly(Side.CLIENT) + public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < 32766; i += 2) { + if (getToolStats(new ItemStack(this, 1, i)) != null) { + ItemStack tStack = new ItemStack(this, 1, i); + isItemStackUsable(tStack); + aList.add(tStack); + aList.add(getToolWithStats(i, 1, Materials.Neutronium, Materials.Neutronium, null)); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public final void registerIcons(IIconRegister aIconRegister) { + // + } + + @Override + public final IIcon getIconFromDamage(int aMetaData) { + return null; + } + + @Override + public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + long tMaxDamage = getToolMaxDamage(aStack); + Materials tMaterial = getPrimaryMaterial(aStack); + IToolStats tStats = getToolStats(aStack); + int tOffset = getElectricStats(aStack) != null ? 2 : 1; + if (tStats != null) { + if (tStats instanceof ToolTurbine) { + + // Durability -> toolMaxDamage + // % Efficiency -> toolCombatDamage -> toolQuality + // Optimal Flow -> toolSpeed + // EU/t -> toolCombatDamage, toolSpeed + // Overflow Tier -> toolQuality + float aBaseEff = (5f + getToolCombatDamage(aStack)) * 1000f; + + // It was noted by IntelliJ that replacing ((GT_MetaGenerated_Tool) aStack.getItem()) with + // GT_MetaGenerated_Tool can have side effects. This refactoring will need tests. + @SuppressWarnings("AccessStaticViaInstance") + float aOptFlow = (Math.max( + Float.MIN_NORMAL, + ((MetaGeneratedTool) aStack.getItem()).getToolStats(aStack) + .getSpeedMultiplier() + * ((MetaGeneratedTool) aStack.getItem()).getPrimaryMaterial(aStack).mToolSpeed + * 50F)); + aList.add( + tOffset + 0, + EnumChatFormatting.GRAY + String.format( + transItem("001", "Durability: %s/%s"), + "" + EnumChatFormatting.GREEN + formatNumbers(tMaxDamage - getToolDamage(aStack)) + " ", + " " + formatNumbers(tMaxDamage)) + EnumChatFormatting.GRAY); + aList.add( + tOffset + 1, + EnumChatFormatting.GRAY + String.format( + transItem("002", "%s lvl %s"), + tMaterial.mLocalizedName + EnumChatFormatting.YELLOW, + "" + getHarvestLevel(aStack, "")) + EnumChatFormatting.GRAY); + aList.add( + tOffset + 2, + EnumChatFormatting.WHITE + + String.format( + transItem("005", "Turbine Efficiency: %s"), + "" + EnumChatFormatting.BLUE + (50.0F + (10.0F * getToolCombatDamage(aStack)))) + + "%" + + EnumChatFormatting.GRAY); + aList.add( + tOffset + 3, + EnumChatFormatting.WHITE + String.format( + transItem("006", "Optimal Steam flow: %s L/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers( + GTUtility.safeInt( + (long) (Math.max( + Float.MIN_NORMAL, + tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed + * (1000 * getPrimaryMaterial(aStack).mSteamMultiplier / 20))))) + + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 4, + EnumChatFormatting.WHITE + String.format( + transItem("900", "Energy from Optimal Steam Flow: %s EU/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers( + GTUtility.safeInt( + (long) (Math.max( + Float.MIN_NORMAL, + tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed + * (1000 * getPrimaryMaterial(aStack).mSteamMultiplier / 20)) + * (50.0F + (10.0F * getToolCombatDamage(aStack))) + / 200))) + + EnumChatFormatting.GRAY)); + { + float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff); + float aOptFlowLoose = calculatedFlow[0]; + float aBaseEffLoose = calculatedFlow[1]; + + aList.add( + tOffset + 5, + EnumChatFormatting.AQUA + String.format( + transItem("500", "Turbine Efficiency (Loose): %s"), + "" + EnumChatFormatting.BLUE + (long) aBaseEffLoose / 100 + "%" + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 6, + EnumChatFormatting.AQUA + String.format( + transItem("501", "Optimal Steam flow (Loose): %s L/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers(((long) aOptFlowLoose * getPrimaryMaterial(aStack).mSteamMultiplier)) + + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 7, + EnumChatFormatting.AQUA + String.format( + transItem("901", "Energy from Optimal Steam Flow (Loose): %s EU/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers( + ((long) aOptFlowLoose * getPrimaryMaterial(aStack).mSteamMultiplier / 10000) + * ((long) aBaseEffLoose / 2)) + + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 8, + EnumChatFormatting.GRAY + "(Superheated Steam EU values are 2x those of Steam)"); + } + aList.add( + tOffset + 9, + EnumChatFormatting.WHITE + String.format( + transItem("902", "Optimal SC Steam flow: %s L/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers( + GTUtility.safeInt( + (long) (Math.max( + Float.MIN_NORMAL, + tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed + * (1000f / 20f))))) + + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 10, + EnumChatFormatting.WHITE + String.format( + transItem("903", "Energy from Optimal SC Steam Flow: %s EU/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers( + GTUtility.safeInt( + (long) (Math.max( + Float.MIN_NORMAL, + tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed + * (1000f / 20f)) + * (50.0F + (10.0F * getToolCombatDamage(aStack)))))) + + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 11, + EnumChatFormatting.LIGHT_PURPLE + String.format( + transItem("007", "Energy from Optimal Gas Flow: %s EU/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers( + GTUtility.safeInt( + (long) (Math.max( + Float.MIN_NORMAL, + tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed + * 50 + * getPrimaryMaterial(aStack).mGasMultiplier) + * (50.0F + (10.0F * getToolCombatDamage(aStack))) + / 100))) + + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 12, + EnumChatFormatting.LIGHT_PURPLE + String.format( + transItem("008", "Energy from Optimal Plasma Flow: %s EU/t"), + "" + EnumChatFormatting.GOLD + + formatNumbers( + GTUtility.safeInt( + (long) (Math.max( + Float.MIN_NORMAL, + tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed + * 2000 + * getPrimaryMaterial(aStack).mPlasmaMultiplier) + * (50.0F + (10.0F * getToolCombatDamage(aStack))) + * (1.05 / 100)))) + + EnumChatFormatting.GRAY)); + aList.add( + tOffset + 14, + EnumChatFormatting.GRAY + "(EU/t values include efficiency and are not 100% accurate)"); + int toolQualityLevel = MetaGeneratedTool.getPrimaryMaterial(aStack).mToolQuality; + int overflowMultiplier = 0; + if (toolQualityLevel >= 6) { + overflowMultiplier = 3; + } else if (toolQualityLevel >= 3) { + overflowMultiplier = 2; + } else { + overflowMultiplier = 1; + } + aList.add( + tOffset + 13, + EnumChatFormatting.LIGHT_PURPLE + String.format( + transItem("502", "Overflow Efficiency Tier: %s"), + "" + EnumChatFormatting.GOLD + overflowMultiplier + EnumChatFormatting.GRAY)); + + } else { + aList.add( + tOffset, + EnumChatFormatting.WHITE + String.format( + transItem("001", "Durability: %s/%s"), + "" + EnumChatFormatting.GREEN + formatNumbers(tMaxDamage - getToolDamage(aStack)) + " ", + " " + formatNumbers(tMaxDamage)) + EnumChatFormatting.GRAY); + aList.add( + tOffset + 1, + EnumChatFormatting.WHITE + String.format( + transItem("002", "%s lvl %s"), + tMaterial.mLocalizedName + EnumChatFormatting.YELLOW, + "" + getHarvestLevel(aStack, "")) + EnumChatFormatting.GRAY); + aList.add( + tOffset + 2, + EnumChatFormatting.WHITE + String.format( + transItem("003", "Attack Damage: %s"), + "" + EnumChatFormatting.BLUE + getToolCombatDamage(aStack)) + EnumChatFormatting.GRAY); + aList.add( + tOffset + 3, + EnumChatFormatting.WHITE + + String.format( + transItem("004", "Mining Speed: %s"), + "" + EnumChatFormatting.GOLD + + Math.max( + Float.MIN_NORMAL, + tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)) + + EnumChatFormatting.GRAY); + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null && aNBT.hasKey("Heat")) { + int tHeat = aNBT.getInteger("Heat"); + long tWorldTime = aPlayer.getEntityWorld() + .getWorldTime(); + if (aNBT.hasKey("HeatTime")) { + long tHeatTime = aNBT.getLong("HeatTime"); + if (tWorldTime > (tHeatTime + 10)) { + tHeat = (int) (tHeat - ((tWorldTime - tHeatTime) / 10)); + if (tHeat < 300 && tHeat > -10000) tHeat = 300; + } + aNBT.setLong("HeatTime", tWorldTime); + if (tHeat > -10000) aNBT.setInteger("Heat", tHeat); + } + + aList.add( + tOffset + 3, + EnumChatFormatting.RED + "Heat: " + + aNBT.getInteger("Heat") + + " K" + + EnumChatFormatting.GRAY); + } + } + } + } + } + + @Override + public Long[] getFluidContainerStats(ItemStack aStack) { + return null; + } + + @Override + public Long[] getElectricStats(ItemStack aStack) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + aNBT = aNBT.getCompoundTag("GT.ToolStats"); + if (aNBT != null && aNBT.getBoolean("Electric")) return new Long[] { aNBT.getLong("MaxCharge"), + aNBT.getLong("Voltage"), aNBT.getLong("Tier"), aNBT.getLong("SpecialData") }; + } + return null; + } + + public float getToolCombatDamage(ItemStack aStack) { + IToolStats tStats = getToolStats(aStack); + if (tStats == null) return 0; + return tStats.getBaseDamage() + getPrimaryMaterial(aStack).mToolQuality; + } + + @Override + public final boolean doDamageToItem(ItemStack aStack, int aVanillaDamage) { + return doDamage(aStack, aVanillaDamage * 100L); + } + + public final boolean doDamage(ItemStack aStack, long aAmount) { + if (!isItemStackUsable(aStack)) return false; + Long[] tElectric = getElectricStats(aStack); + if (tElectric == null) { + long tNewDamage = getToolDamage(aStack) + aAmount; + setToolDamage(aStack, tNewDamage); + if (tNewDamage >= getToolMaxDamage(aStack)) { + IToolStats tStats = getToolStats(aStack); + if (tStats == null || GTUtility.setStack(aStack, tStats.getBrokenItem(aStack)) == null) { + if (tStats != null) GTUtility.doSoundAtClient(tStats.getBreakingSound(), 1, 1.0F); + if (aStack.stackSize > 0) aStack.stackSize--; + } + } + return true; + } + if (use(aStack, (int) aAmount, null)) { + if (java.util.concurrent.ThreadLocalRandom.current() + .nextInt(0, 25) == 0) { + long tNewDamage = getToolDamage(aStack) + aAmount; + setToolDamage(aStack, tNewDamage); + if (tNewDamage >= getToolMaxDamage(aStack)) { + IToolStats tStats = getToolStats(aStack); + if (tStats == null || GTUtility.setStack(aStack, tStats.getBrokenItem(aStack)) == null) { + if (tStats != null) GTUtility.doSoundAtClient(tStats.getBreakingSound(), 1, 1.0F); + if (aStack.stackSize > 0) aStack.stackSize--; + } + } + } + return true; + } + return false; + } + + @Override + public float getDigSpeed(ItemStack aStack, Block aBlock, int aMetaData) { + if (!isItemStackUsable(aStack)) return 0.0F; + IToolStats tStats = getToolStats(aStack); + if (tStats == null || Math.max(0, getHarvestLevel(aStack, "")) < aBlock.getHarvestLevel(aMetaData)) return 0.0F; + return tStats.isMinableBlock(aBlock, (byte) aMetaData) + ? Math.max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed) + : 0.0F; + } + + @Override + public final boolean canHarvestBlock(Block aBlock, ItemStack aStack) { + return getDigSpeed(aStack, aBlock, (byte) 0) > 0.0F; + } + + @Override + public final int getHarvestLevel(ItemStack aStack, String aToolClass) { + IToolStats tStats = getToolStats(aStack); + return tStats == null ? -1 : tStats.getBaseQuality() + getPrimaryMaterial(aStack).mToolQuality; + } + + @Override + public boolean onBlockDestroyed(ItemStack aStack, World aWorld, Block aBlock, int aX, int aY, int aZ, + EntityLivingBase aPlayer) { + if (!isItemStackUsable(aStack)) return false; + IToolStats tStats = getToolStats(aStack); + if (tStats == null) return false; + GTUtility.doSoundAtClient(tStats.getMiningSound(), 1, 1.0F); + doDamage( + aStack, + (int) Math.max(1, aBlock.getBlockHardness(aWorld, aX, aY, aZ) * tStats.getToolDamagePerBlockBreak())); + return getDigSpeed(aStack, aBlock, aWorld.getBlockMetadata(aX, aY, aZ)) > 0.0F; + } + + @Override + public final ItemStack getContainerItem(ItemStack aStack) { + return getContainerItem(aStack, true); + } + + @Override + public final boolean hasContainerItem(ItemStack aStack) { + return getContainerItem(aStack, false) != null; + } + + private ItemStack getContainerItem(ItemStack aStack, boolean playSound) { + if (!isItemStackUsable(aStack)) return null; + aStack = GTUtility.copyAmount(1, aStack); + IToolStats tStats = getToolStats(aStack); + if (tStats == null) return null; + doDamage(aStack, tStats.getToolDamagePerContainerCraft()); + aStack = aStack.stackSize > 0 ? aStack : null; + if (playSound && GTMod.gregtechproxy.mTicksUntilNextCraftSound <= 0) { + GTMod.gregtechproxy.mTicksUntilNextCraftSound = 10; + String sound = (aStack == null) ? tStats.getBreakingSound() : tStats.getCraftingSound(); + GTUtility.doSoundAtClient(sound, 1, 1.0F); + } + return aStack; + } + + public IToolStats getToolStats(ItemStack aStack) { + isItemStackUsable(aStack); + return getToolStatsInternal(aStack); + } + + public byte getToolMaxMode(ItemStack aStack) { + IToolStats stats = getToolStats(aStack); + if (stats != null) { + return stats.getMaxMode(); + } + return 1; + } + + private IToolStats getToolStatsInternal(ItemStack aStack) { + return aStack == null ? null : mToolStats.get((short) aStack.getItemDamage()); + } + + @Override + public float getSaplingModifier(ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ) { + IToolStats tStats = getToolStats(aStack); + return tStats != null && tStats.isGrafter() ? Math.min(100.0F, (1 + getHarvestLevel(aStack, "")) * 20.0F) + : 0.0F; + } + + @Override + public boolean canWhack(EntityPlayer aPlayer, ItemStack aStack, int aX, int aY, int aZ) { + if (!isItemStackUsable(aStack)) return false; + IToolStats tStats = getToolStats(aStack); + return tStats != null && tStats.isCrowbar(); + } + + @Override + public void onWhack(EntityPlayer aPlayer, ItemStack aStack, int aX, int aY, int aZ) { + IToolStats tStats = getToolStats(aStack); + if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack()); + } + + @Override + public boolean canWrench(EntityPlayer player, int x, int y, int z) { + if (player == null) return false; + return canWrench(player.getHeldItem(), player, x, y, z); + } + + @Override + public boolean canWrench(ItemStack wrench, EntityPlayer player, int x, int y, int z) { + if (wrench == null) return false; + if (!isItemStackUsable(wrench)) return false; + IToolStats tStats = getToolStats(player.getCurrentEquippedItem()); + return tStats != null && tStats.isWrench(); + } + + @Override + public void wrenchUsed(EntityPlayer player, int x, int y, int z) { + if (player == null) return; + if (player.getCurrentEquippedItem() == null) return; + IToolStats tStats = getToolStats(player.getCurrentEquippedItem()); + if (tStats != null) doDamage(player.getCurrentEquippedItem(), tStats.getToolDamagePerEntityAttack()); + } + + @Override + public boolean canUse(ItemStack stack, EntityPlayer player, int x, int y, int z) { + return canWrench(player, x, y, z); + } + + // ProjectRed screwdriver + @Override + public boolean canUse(EntityPlayer player, ItemStack stack) { + if (player == null) return false; + if (GTUtility.isStackInvalid(stack) || !isItemStackUsable(stack)) return false; + IToolStats tStats = getToolStats(stack); + return tStats != null && tStats.isScrewdriver(); + } + + @Override + public void damageScrewdriver(EntityPlayer player, ItemStack stack) { + if (player == null) return; + if (GTUtility.isStackInvalid(stack) || !isItemStackUsable(stack)) return; + IToolStats tStats = getToolStats(stack); + if (tStats != null) doDamage(stack, tStats.getToolDamagePerEntityAttack()); + } + + @Override + public void used(ItemStack stack, EntityPlayer player, int x, int y, int z) { + wrenchUsed(player, x, y, z); + } + + @Override + public boolean shouldHideFacades(ItemStack stack, EntityPlayer player) { + if (player == null) return false; + if (player.getCurrentEquippedItem() == null) return false; + if (!isItemStackUsable(player.getCurrentEquippedItem())) return false; + IToolStats tStats = getToolStats(player.getCurrentEquippedItem()); + return tStats.isWrench(); + } + + @Override + public boolean canLink(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { + if (!isItemStackUsable(aStack)) return false; + IToolStats tStats = getToolStats(aStack); + return tStats != null && tStats.isCrowbar(); + } + + @Override + public void onLink(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { + IToolStats tStats = getToolStats(aStack); + if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack()); + } + + @Override + public boolean canBoost(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { + if (!isItemStackUsable(aStack)) return false; + IToolStats tStats = getToolStats(aStack); + return tStats != null && tStats.isCrowbar(); + } + + @Override + public void onBoost(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) { + IToolStats tStats = getToolStats(aStack); + if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack()); + } + + @Override + public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + IToolStats tStats = getToolStats(aStack); + if (tStats != null && aPlayer != null) tStats.onToolCrafted(aStack, aPlayer); + super.onCreated(aStack, aWorld, aPlayer); + } + + @Override + public final boolean doesContainerItemLeaveCraftingGrid(ItemStack aStack) { + return false; + } + + @Override + public final int getItemStackLimit(ItemStack aStack) { + return 1; + } + + @Override + public boolean isFull3D() { + return true; + } + + @Override + public boolean isItemStackUsable(ItemStack aStack) { + IToolStats tStats = getToolStatsInternal(aStack); + if (aStack.getItemDamage() % 2 != 0 || tStats == null) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) aNBT.removeTag("ench"); + return false; + } + Materials aMaterial = getPrimaryMaterial(aStack); + HashMap tMap = new HashMap<>(), tResult = new HashMap<>(); + if (aMaterial.mEnchantmentTools != null) { + tMap.put(aMaterial.mEnchantmentTools.effectId, (int) aMaterial.mEnchantmentToolsLevel); + if (aMaterial.mEnchantmentTools == Enchantment.fortune) + tMap.put(Enchantment.looting.effectId, (int) aMaterial.mEnchantmentToolsLevel); + if (aMaterial.mEnchantmentTools == Enchantment.knockback) + tMap.put(Enchantment.power.effectId, (int) aMaterial.mEnchantmentToolsLevel); + if (aMaterial.mEnchantmentTools == Enchantment.fireAspect) + tMap.put(Enchantment.flame.effectId, (int) aMaterial.mEnchantmentToolsLevel); + } + Enchantment[] tEnchants = tStats.getEnchantments(aStack); + int[] tLevels = tStats.getEnchantmentLevels(aStack); + for (int i = 0; i < tEnchants.length; i++) if (tLevels[i] > 0) { + Integer tLevel = tMap.get(tEnchants[i].effectId); + tMap.put( + tEnchants[i].effectId, + tLevel == null ? tLevels[i] : tLevel == tLevels[i] ? tLevel + 1 : Math.max(tLevel, tLevels[i])); + } + for (Entry tEntry : tMap.entrySet()) { + if (tEntry.getKey() == 33 || (tEntry.getKey() == 20 && tEntry.getValue() > 2) + || tEntry.getKey() == EnchantmentRadioactivity.INSTANCE.effectId) + tResult.put(tEntry.getKey(), tEntry.getValue()); + else switch (Enchantment.enchantmentsList[tEntry.getKey()].type) { + case weapon: + if (tStats.isWeapon()) tResult.put(tEntry.getKey(), tEntry.getValue()); + break; + case all: + tResult.put(tEntry.getKey(), tEntry.getValue()); + break; + case armor: + case armor_feet: + case armor_head: + case armor_legs: + case armor_torso: + break; + case bow: + if (tStats.isRangedWeapon()) tResult.put(tEntry.getKey(), tEntry.getValue()); + break; + case breakable: + break; + case fishing_rod: + break; + case digger: + if (tStats.isMiningTool()) tResult.put(tEntry.getKey(), tEntry.getValue()); + break; + } + } + EnchantmentHelper.setEnchantments(tResult, aStack); + return true; + } + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + + String result = super.getItemStackDisplayName(aStack); + IToolStats toolStats = getToolStats(aStack); + if (toolStats != null) { + String toolName = toolStats.getToolTypeName(); + if (toolName == null) return result; + + String key = "gt." + toolName + ".mode." + getToolMode(aStack); + if (StatCollector.canTranslate(key)) { + result += " (" + StatCollector.translateToLocal(key) + ")"; + } + } + return result; + + } + + @Override + public short getChargedMetaData(ItemStack aStack) { + return (short) (aStack.getItemDamage() - (aStack.getItemDamage() % 2)); + } + + @Override + public short getEmptyMetaData(ItemStack aStack) { + NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) aNBT.removeTag("ench"); + return (short) (aStack.getItemDamage() + 1 - (aStack.getItemDamage() % 2)); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) { + return false; + } + + @Override + public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { + return false; + } +} diff --git a/src/main/java/gregtech/api/logic/AbstractProcessingLogic.java b/src/main/java/gregtech/api/logic/AbstractProcessingLogic.java index 3c05d8bed0..ed953d9477 100644 --- a/src/main/java/gregtech/api/logic/AbstractProcessingLogic.java +++ b/src/main/java/gregtech/api/logic/AbstractProcessingLogic.java @@ -11,9 +11,9 @@ import gregtech.api.interfaces.tileentity.IVoidable; import gregtech.api.recipe.RecipeMap; import gregtech.api.recipe.check.CheckRecipeResult; import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_ParallelHelper; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.ParallelHelper; /** * Logic class to calculate result of recipe check from inputs. @@ -23,7 +23,7 @@ public abstract class AbstractProcessingLogic

> recipeMapSupplier; - protected GT_Recipe lastRecipe; + protected GTRecipe lastRecipe; protected RecipeMap lastRecipeMap; protected ItemStack[] outputItems; protected FluidStack[] outputFluids; @@ -229,8 +229,8 @@ public abstract class AbstractProcessingLogic

= 0 && tSlot < inventory.getSlots()) { - inventory.setStackInSlot(tSlot, GT_Utility.loadItem(tNBT)); + inventory.setStackInSlot(tSlot, GTUtility.loadItem(tNBT)); } } } diff --git a/src/main/java/gregtech/api/logic/MuTEProcessingLogic.java b/src/main/java/gregtech/api/logic/MuTEProcessingLogic.java index da53c8875d..0d6bf4cac9 100644 --- a/src/main/java/gregtech/api/logic/MuTEProcessingLogic.java +++ b/src/main/java/gregtech/api/logic/MuTEProcessingLogic.java @@ -24,10 +24,10 @@ import gregtech.api.logic.interfaces.ProcessingLogicHost; import gregtech.api.recipe.RecipeMap; import gregtech.api.recipe.check.CheckRecipeResult; import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_ParallelHelper; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.ParallelHelper; /** * Processing logic class, dedicated for MultiTileEntities. @@ -81,13 +81,13 @@ public class MuTEProcessingLogic

> extends Abstr } @Nonnull - protected CheckRecipeResult processRecipe(@Nonnull List recipes, @Nonnull ItemInventoryLogic itemInput, + protected CheckRecipeResult processRecipe(@Nonnull List recipes, @Nonnull ItemInventoryLogic itemInput, @Nonnull FluidInventoryLogic fluidInput) { CheckRecipeResult result = CheckRecipeResultRegistry.INTERNAL_ERROR; - for (GT_Recipe recipe : recipes) { + for (GTRecipe recipe : recipes) { Objects.requireNonNull(recipe); - GT_ParallelHelper helper = createParallelHelper(recipe, itemInput, fluidInput); - GT_OverclockCalculator calculator = createOverclockCalculator(recipe); + ParallelHelper helper = createParallelHelper(recipe, itemInput, fluidInput); + OverclockCalculator calculator = createOverclockCalculator(recipe); helper.setCalculator(calculator); helper.build(); result = helper.getResult(); @@ -112,9 +112,9 @@ public class MuTEProcessingLogic

> extends Abstr } @Nonnull - protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe, @Nonnull ItemInventoryLogic itemInput, + protected ParallelHelper createParallelHelper(@Nonnull GTRecipe recipe, @Nonnull ItemInventoryLogic itemInput, @Nonnull FluidInventoryLogic fluidInput) { - return new GT_ParallelHelper().setRecipe(recipe) + return new ParallelHelper().setRecipe(recipe) .setItemInputInventory(itemInput) .setFluidInputInventory(fluidInput) .setAvailableEUt(availableVoltage * availableAmperage) @@ -197,7 +197,7 @@ public class MuTEProcessingLogic

> extends Abstr if (outputItems != null) { NBTTagList itemOutputsNBT = new NBTTagList(); for (ItemStack item : outputItems) { - itemOutputsNBT.appendTag(GT_Utility.saveItem(item)); + itemOutputsNBT.appendTag(GTUtility.saveItem(item)); } logicNBT.setTag("itemOutputs", itemOutputsNBT); } @@ -226,7 +226,7 @@ public class MuTEProcessingLogic

> extends Abstr NBTTagList itemOutputsNBT = logicNBT.getTagList("itemOutputs", TAG_COMPOUND); outputItems = new ItemStack[itemOutputsNBT.tagCount()]; for (int i = 0; i < itemOutputsNBT.tagCount(); i++) { - outputItems[i] = GT_Utility.loadItem(itemOutputsNBT.getCompoundTagAt(i)); + outputItems[i] = GTUtility.loadItem(itemOutputsNBT.getCompoundTagAt(i)); } } if (logicNBT.hasKey("fluidOutputs")) { diff --git a/src/main/java/gregtech/api/logic/PowerLogic.java b/src/main/java/gregtech/api/logic/PowerLogic.java index ad19987a76..afc1877deb 100644 --- a/src/main/java/gregtech/api/logic/PowerLogic.java +++ b/src/main/java/gregtech/api/logic/PowerLogic.java @@ -8,12 +8,12 @@ import javax.annotation.Nonnull; import net.minecraft.nbt.NBTTagCompound; -import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.enums.GTValues.NBT; /** * Power logic for machines. This is used to store all the important variables for a machine to have energy and use it * in any way. - * + * * @author BlueWeabo, Maxim */ public class PowerLogic { @@ -122,7 +122,7 @@ public class PowerLogic { /** * Injecting energy in the multiblock ampere per ampere until full or until we have added the maximum possible * amperes for this tick - * + * * @param voltage At what voltage are the amps? * @param availableAmperage How much amperage do we have available * @return Amount of amperes used @@ -218,7 +218,7 @@ public class PowerLogic { /** * Saves the power logic to its own nbt tag before saving it to the given one. - * + * * @param nbt Tag where you want to save the power logic tag to. */ public void saveToNBT(NBTTagCompound nbt) { @@ -233,7 +233,7 @@ public class PowerLogic { /** * Loads the power logic from its own nbt after getting it from the given one - * + * * @param nbt Tag where the power logic tag was saved to */ public void loadFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/gregtech/api/logic/ProcessingLogic.java b/src/main/java/gregtech/api/logic/ProcessingLogic.java index 4d203ed80f..63c8f6494e 100644 --- a/src/main/java/gregtech/api/logic/ProcessingLogic.java +++ b/src/main/java/gregtech/api/logic/ProcessingLogic.java @@ -14,9 +14,9 @@ import gregtech.api.recipe.RecipeMap; import gregtech.api.recipe.check.CheckRecipeResult; import gregtech.api.recipe.check.CheckRecipeResultRegistry; import gregtech.api.recipe.check.SingleRecipeCheck; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_ParallelHelper; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.ParallelHelper; /** * Logic class to calculate result of recipe check from inputs, based on recipemap. @@ -119,10 +119,10 @@ public class ProcessingLogic extends AbstractProcessingLogic { recipeLockableMachine.getSingleRecipeCheck() .getRecipe()).checkRecipeResult; } - Stream matchedRecipes = findRecipeMatches(recipeMap); - Iterable recipeIterable = matchedRecipes::iterator; + Stream matchedRecipes = findRecipeMatches(recipeMap); + Iterable recipeIterable = matchedRecipes::iterator; CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.NO_RECIPE; - for (GT_Recipe matchedRecipe : recipeIterable) { + for (GTRecipe matchedRecipe : recipeIterable) { CalculationResult foundResult = validateAndCalculateRecipe(matchedRecipe); if (foundResult.successfullyConsumedInputs) { // Successfully found and set recipe, so return it @@ -143,14 +143,14 @@ public class ProcessingLogic extends AbstractProcessingLogic { * @param recipe The recipe which will be checked and processed */ @Nonnull - private CalculationResult validateAndCalculateRecipe(@Nonnull GT_Recipe recipe) { + private CalculationResult validateAndCalculateRecipe(@Nonnull GTRecipe recipe) { CheckRecipeResult result = validateRecipe(recipe); if (!result.wasSuccessful()) { return CalculationResult.ofFailure(result); } - GT_ParallelHelper helper = createParallelHelper(recipe); - GT_OverclockCalculator calculator = createOverclockCalculator(recipe); + ParallelHelper helper = createParallelHelper(recipe); + OverclockCalculator calculator = createOverclockCalculator(recipe); helper.setCalculator(calculator); helper.build(); @@ -170,7 +170,7 @@ public class ProcessingLogic extends AbstractProcessingLogic { * Override this method if it doesn't work with normal recipemaps. */ @Nonnull - protected Stream findRecipeMatches(@Nullable RecipeMap map) { + protected Stream findRecipeMatches(@Nullable RecipeMap map) { if (map == null) { return Stream.empty(); } @@ -186,8 +186,8 @@ public class ProcessingLogic extends AbstractProcessingLogic { * Override to tweak parallel logic if needed. */ @Nonnull - protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) { - return new GT_ParallelHelper().setRecipe(recipe) + protected ParallelHelper createParallelHelper(@Nonnull GTRecipe recipe) { + return new ParallelHelper().setRecipe(recipe) .setItemInputs(inputItems) .setFluidInputs(inputFluids) .setAvailableEUt(availableVoltage * availableAmperage) diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index 2bc560f8e7..aae3ddcebb 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -1,7 +1,7 @@ package gregtech.api.metatileentity; -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_Values.NW; +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.GTValues.NW; import java.util.ArrayList; import java.util.Arrays; @@ -25,8 +25,8 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.SoundResource; import gregtech.api.enums.Textures; import gregtech.api.graphs.Lock; @@ -38,13 +38,13 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IDebugableTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity; -import gregtech.api.net.GT_Packet_TileEntity; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; +import gregtech.api.net.GTPacketTileEntity; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; import gregtech.common.covers.CoverInfo; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -59,7 +59,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity public byte mConnections = IConnectable.NO_CONNECTION; protected MetaPipeEntity mMetaTileEntity; - private final int[] mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING]; + private final int[] mTimeStatistics = new int[GregTechAPI.TICKS_FOR_LAG_AVERAGING]; private boolean hasTimeStatisticsStarted; private boolean mWorkUpdate = false, mWorks = true; private byte mColor = 0, oColor = 0, oStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0, @@ -214,7 +214,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity | IConnectable.HAS_HARDENEDFOAM); } if (mTickTimer > 12 && oldConnections != mConnections) - GregTech_API.causeCableUpdate(worldObj, xCoord, yCoord, zCoord); + GregTechAPI.causeCableUpdate(worldObj, xCoord, yCoord, zCoord); } mMetaTileEntity.onPreTick(this, mTickTimer); if (!hasValidMetaTileEntity()) return; @@ -264,14 +264,14 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } } catch (Throwable e) { e.printStackTrace(); - e.printStackTrace(GT_Log.err); + e.printStackTrace(GTLog.err); } if (isServerSide() && hasTimeStatisticsStarted && hasValidMetaTileEntity()) { tTime = System.nanoTime() - tTime; mTimeStatisticsIndex = (mTimeStatisticsIndex + 1) % mTimeStatistics.length; mTimeStatistics[mTimeStatisticsIndex] = (int) tTime; - if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING * 1000000L) + if (tTime > 0 && tTime > (GregTechAPI.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING * 1000000L) && mTickTimer > 1000 && getMetaTileEntity().doTickProfilingMessageDuringThisTick() && mLagWarningCount++ < 10) @@ -296,7 +296,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity if (mSendClientData) { NW.sendPacketToAllPlayersInRange( worldObj, - new GT_Packet_TileEntity( + new GTPacketTileEntity( xCoord, (short) yCoord, zCoord, @@ -438,7 +438,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity tList.add( "Caused " + (mLagWarningCount >= 10 ? "more than 10" : mLagWarningCount) + " Lag Spike Warnings (anything taking longer than " - + GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING + + GregTechAPI.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING + "ms) on the Server."); } if (mMetaTileEntity != null) { @@ -491,13 +491,13 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity markDirty(); mInventoryChanged = true; if (canAccessData()) mMetaTileEntity - .setInventorySlotContents(aIndex, worldObj.isRemote ? aStack : GT_OreDictUnificator.setStack(true, aStack)); + .setInventorySlotContents(aIndex, worldObj.isRemote ? aStack : GTOreDictUnificator.setStack(true, aStack)); } @Override public String getInventoryName() { if (canAccessData()) return mMetaTileEntity.getInventoryName(); - if (GregTech_API.METATILEENTITIES[mID] != null) return GregTech_API.METATILEENTITIES[mID].getInventoryName(); + if (GregTechAPI.METATILEENTITIES[mID] != null) return GregTechAPI.METATILEENTITIES[mID].getInventoryName(); return ""; } @@ -776,7 +776,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public ArrayList getDrops() { - final ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); + final ItemStack rStack = new ItemStack(GregTechAPI.sBlockMachines, 1, mID); final NBTTagCompound tNBT = new NBTTagCompound(); writeCoverNBT(tNBT, true); @@ -799,7 +799,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron if (aPlayer.isSneaking()) { final ForgeDirection tSide = (getCoverIDAtSide(side) == 0) - ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) + ? GTUtility.determineWrenchingSide(side, aX, aY, aZ) : side; return (getCoverInfoAtSide(tSide).hasCoverGUI()); } else if (getCoverBehaviorAtSideNew(side).onCoverRightclickClient(side, this, aPlayer, aX, aY, aZ)) { @@ -810,19 +810,19 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); if (tCurrentItem != null) { if (getColorization() >= 0 - && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { + && GTUtility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { mMetaTileEntity.markDirty(); tCurrentItem.func_150996_a(Items.bucket); setColorization((byte) -1); return true; } - final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) { + final ForgeDirection tSide = GTUtility.determineWrenchingSide(side, aX, aY, aZ); + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWrenchList)) { if (mMetaTileEntity.onWrenchRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) { mMetaTileEntity.markDirty(); - GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); - GT_Utility.sendSoundToPlayers( + GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -833,15 +833,15 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sScrewdriverList)) { if (getCoverIDAtSide(side) == 0 && getCoverIDAtSide(tSide) != 0) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { setCoverDataAtSide( tSide, getCoverInfoAtSide(tSide).onCoverScrewdriverClick(aPlayer, 0.5F, 0.5F, 0.5F)); mMetaTileEntity.onScrewdriverRightClick(tSide, aPlayer, aX, aY, aZ, tCurrentItem); mMetaTileEntity.markDirty(); - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -851,13 +851,13 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity zCoord); } } else { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { setCoverDataAtSide( side, getCoverInfoAtSide(side).onCoverScrewdriverClick(aPlayer, aX, aY, aZ)); mMetaTileEntity.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ, tCurrentItem); mMetaTileEntity.markDirty(); - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -870,21 +870,21 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sHardHammerList)) { return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSoftHammerList)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { if (mWorks) disableWorking(); else enableWorking(); mMetaTileEntity.markDirty(); - GT_Utility.sendChatToPlayer( + GTUtility.sendChatToPlayer( aPlayer, - GT_Utility.trans("090", "Machine Processing: ") - + (isAllowedToWork() ? GT_Utility.trans("088", "Enabled") - : GT_Utility.trans("087", "Disabled"))); - GT_Utility.sendSoundToPlayers( + GTUtility.trans("090", "Machine Processing: ") + + (isAllowedToWork() ? GTUtility.trans("088", "Enabled") + : GTUtility.trans("087", "Disabled"))); + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, @@ -896,11 +896,11 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWireCutterList)) { if (mMetaTileEntity.onWireCutterRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) { mMetaTileEntity.markDirty(); // logic handled internally - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -913,11 +913,11 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSolderingToolList)) { if (mMetaTileEntity.onSolderingToolRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) { mMetaTileEntity.markDirty(); // logic handled internally - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_BATTERY_USE, 1.0F, @@ -925,16 +925,16 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity xCoord, yCoord, zCoord); - } else if (GT_ModHandler.useSolderingIron(tCurrentItem, aPlayer)) { + } else if (GTModHandler.useSolderingIron(tCurrentItem, aPlayer)) { mMetaTileEntity.markDirty(); mStrongRedstone ^= tSide.flag; - GT_Utility.sendChatToPlayer( + GTUtility.sendChatToPlayer( aPlayer, - GT_Utility.trans("091", "Redstone Output at Side ") + tSide - + GT_Utility.trans("092", " set to: ") - + ((mStrongRedstone & tSide.flag) != 0 ? GT_Utility.trans("093", "Strong") - : GT_Utility.trans("094", "Weak"))); - GT_Utility.sendSoundToPlayers( + GTUtility.trans("091", "Redstone Output at Side ") + tSide + + GTUtility.trans("092", " set to: ") + + ((mStrongRedstone & tSide.flag) != 0 ? GTUtility.trans("093", "Strong") + : GTUtility.trans("094", "Weak"))); + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_BATTERY_USE, 3.0F, @@ -954,17 +954,17 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity final CoverInfo coverInfo = getCoverInfoAtSide(coverSide); if (coverInfo.getCoverID() == 0) { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { - final GT_CoverBehaviorBase coverBehavior = GregTech_API.getCoverBehaviorNew(tCurrentItem); + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sCovers.keySet())) { + final CoverBehaviorBase coverBehavior = GregTechAPI.getCoverBehaviorNew(tCurrentItem); if (coverBehavior.isCoverPlaceable(coverSide, tCurrentItem, this) - && mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) { + && mMetaTileEntity.allowCoverOnSide(coverSide, new GTItemStack(tCurrentItem))) { setCoverItemAtSide(coverSide, tCurrentItem); coverBehavior.onPlayerAttach(aPlayer, tCurrentItem, this, side); mMetaTileEntity.markDirty(); if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--; - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -976,9 +976,9 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity return true; } } else { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { - GT_Utility.sendSoundToPlayers( + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sCrowbarList)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + GTUtility.sendSoundToPlayers( worldObj, SoundResource.RANDOM_BREAK, 1.0F, @@ -993,7 +993,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } } } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config or turn back. - side = (getCoverIDAtSide(side) == 0) ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) : side; + side = (getCoverIDAtSide(side) == 0) ? GTUtility.determineWrenchingSide(side, aX, aY, aZ) : side; final CoverInfo coverInfo = getCoverInfoAtSide(side); return coverInfo.isValid() && coverInfo.onCoverShiftRightClick(aPlayer); } @@ -1064,7 +1064,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity final CoverInfo coverInfo = getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide)); if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1))) return mMetaTileEntity.getAccessibleSlotsFromSide(ordinalSide); - return GT_Values.emptyIntArray; + return GTValues.emptyIntArray; } /** @@ -1164,7 +1164,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public UUID getOwnerUuid() { - return GT_Utility.defaultUuid; + return GTUtility.defaultUuid; } @Override @@ -1276,15 +1276,15 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public boolean addStackToSlot(int aIndex, ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return true; + if (GTUtility.isStackInvalid(aStack)) return true; if (aIndex < 0 || aIndex >= getSizeInventory()) return false; final ItemStack tStack = getStackInSlot(aIndex); - if (GT_Utility.isStackInvalid(tStack)) { + if (GTUtility.isStackInvalid(tStack)) { setInventorySlotContents(aIndex, aStack); return true; } - aStack = GT_OreDictUnificator.get(aStack); - if (GT_Utility.areStacksEqual(tStack, aStack) + aStack = GTOreDictUnificator.get(aStack); + if (GTUtility.areStacksEqual(tStack, aStack) && tStack.stackSize + aStack.stackSize <= Math.min(aStack.getMaxStackSize(), getInventoryStackLimit())) { markDirty(); tStack.stackSize += aStack.stackSize; @@ -1295,7 +1295,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) { - return addStackToSlot(aIndex, GT_Utility.copyAmount(aAmount, aStack)); + return addStackToSlot(aIndex, GTUtility.copyAmount(aAmount, aStack)); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 27a6216cff..1229dfcc5b 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -1,8 +1,8 @@ package gregtech.api.metatileentity; -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_Values.NW; -import static gregtech.api.enums.GT_Values.V; +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.GTValues.NW; +import static gregtech.api.enums.GTValues.V; import static gregtech.api.objects.XSTR.XSTR_INSTANCE; import java.lang.reflect.Field; @@ -54,9 +54,9 @@ import appeng.me.helpers.IGridProxyable; import appeng.tile.TileEvent; import appeng.tile.events.TileEventType; import cpw.mods.fml.relauncher.ReflectionHelper; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.ItemList; import gregtech.api.enums.SoundResource; import gregtech.api.enums.Textures; @@ -71,19 +71,19 @@ import gregtech.api.interfaces.tileentity.IDebugableTileEntity; import gregtech.api.interfaces.tileentity.IEnergyConnected; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IGregtechWailaProvider; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.net.GT_Packet_TileEntity; -import gregtech.api.objects.GT_ItemStack; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.net.GTPacketTileEntity; +import gregtech.api.objects.GTItemStack; import gregtech.api.objects.blockupdate.BlockUpdateHandler; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; import gregtech.api.util.shutdown.ShutDownReason; import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.GT_Pollution; +import gregtech.common.Pollution; import gregtech.common.covers.CoverInfo; import ic2.api.Direction; import mcp.mobius.waila.api.IWailaConfigHandler; @@ -102,7 +102,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity .findField(EntityItem.class, "health", "field_70291_e"); private final boolean[] mActiveEUInputs = new boolean[] { false, false, false, false, false, false }; private final boolean[] mActiveEUOutputs = new boolean[] { false, false, false, false, false, false }; - private final int[] mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING]; + private final int[] mTimeStatistics = new int[GregTechAPI.TICKS_FOR_LAG_AVERAGING]; private boolean hasTimeStatisticsStarted; public long mLastSoundTick = 0; public boolean mWasShutdown = false; @@ -125,7 +125,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity private long oOutput = 0, mAcceptedAmperes = Long.MAX_VALUE; private long mLastCheckTick = 0; private String mOwnerName = ""; - private UUID mOwnerUuid = GT_Utility.defaultUuid; + private UUID mOwnerUuid = GTUtility.defaultUuid; private NBTTagCompound mRecipeStuff = new NBTTagCompound(); private int cableUpdateDelay = 30; @@ -242,7 +242,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity */ public void chargeItem(ItemStack aStack) { decreaseStoredEU( - GT_ModHandler.chargeElectricItem( + GTModHandler.chargeElectricItem( aStack, (int) Math.min(Integer.MAX_VALUE, getStoredEU()), (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getOutputTier()), @@ -256,7 +256,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity */ public void dischargeItem(ItemStack aStack) { increaseStoredEnergyUnits( - GT_ModHandler.dischargeElectricItem( + GTModHandler.dischargeElectricItem( aStack, (int) Math.min(Integer.MAX_VALUE, getEUCapacity() - getStoredEU()), (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()), @@ -351,7 +351,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } if (mNeedsUpdate) { - if (GT_Mod.gregtechproxy.mUseBlockUpdateHandler) { + if (GTMod.gregtechproxy.mUseBlockUpdateHandler) { BlockUpdateHandler.Instance.enqueueBlockUpdate(worldObj, getLocation()); } else { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); @@ -424,7 +424,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (mMetaTileEntity.isEnetOutput() && oOutput > 0) { final long tOutputVoltage = Math - .max(oOutput, oOutput + (1L << Math.max(0, GT_Utility.getTier(oOutput) - 1))); + .max(oOutput, oOutput + (1L << Math.max(0, GTUtility.getTier(oOutput) - 1))); final long tUsableAmperage = Math.min( getOutputAmperage(), (getStoredEU() - mMetaTileEntity.getMinimumStoredEU()) / tOutputVoltage); @@ -436,7 +436,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } } if (getEUCapacity() > 0) { - if (GregTech_API.sMachineFireExplosions && getRandomNumber(1000) == 0) { + if (GregTechAPI.sMachineFireExplosions && getRandomNumber(1000) == 0) { final Block tBlock = getBlockAtSide(ForgeDirection.getOrientation(getRandomNumber(6))); if (tBlock instanceof BlockFire) doEnergyExplosion(); } @@ -446,7 +446,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return; } - if (GregTech_API.sMachineRainExplosions) { + if (GregTechAPI.sMachineRainExplosions) { if (mMetaTileEntity.willExplodeInRain()) { if (getRandomNumber(1000) == 0 && isRainPossible()) { // Short-circuit so raincheck happens before isRainExposed, @@ -457,12 +457,12 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (worldObj.isRaining() && isRainExposed()) { if (getRandomNumber(10) == 0) { try { - GT_Mod.achievements.issueAchievement( + GTMod.achievements.issueAchievement( this.getWorldObj() .getPlayerEntityByName(mOwnerName), "badweather"); } catch (Exception ignored) {} - GT_Log.exp.println( + GTLog.exp.println( "Machine at: " + this.getXCoord() + " | " + this.getYCoord() @@ -473,7 +473,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity + " explosion due to rain!"); doEnergyExplosion(); } else { - GT_Log.exp.println( + GTLog.exp.println( "Machine at: " + this.getXCoord() + " | " + this.getYCoord() @@ -489,16 +489,16 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity mRunningThroughTick = false; return; } - if (GregTech_API.sMachineThunderExplosions && worldObj.isThundering() + if (GregTechAPI.sMachineThunderExplosions && worldObj.isThundering() && getRandomNumber(3) == 0 && isRainExposed()) { try { - GT_Mod.achievements.issueAchievement( + GTMod.achievements.issueAchievement( this.getWorldObj() .getPlayerEntityByName(mOwnerName), "badweather"); } catch (Exception ignored) {} - GT_Log.exp.println( + GTLog.exp.println( "Machine at: " + this.getXCoord() + " | " + this.getYCoord() @@ -591,8 +591,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity tData = mMetaTileEntity.getUpdateData(); if (tData != oUpdateData) sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, oUpdateData = tData); - if (mMetaTileEntity instanceof GT_MetaTileEntity_Hatch) { - tData = ((GT_MetaTileEntity_Hatch) mMetaTileEntity).getTexturePage(); + if (mMetaTileEntity instanceof MTEHatch) { + tData = ((MTEHatch) mMetaTileEntity).getTexturePage(); if (tData != oTexturePage) sendBlockEvent( GregTechTileClientEvents.CHANGE_CUSTOM_DATA, (byte) ((oTexturePage = tData) | 0x80)); // set last bit as a flag for page @@ -628,12 +628,12 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } } catch (Throwable e) { e.printStackTrace(); - e.printStackTrace(GT_Log.err); + e.printStackTrace(GTLog.err); try { mMetaTileEntity.onTickFail(this, mTickTimer); } catch (Throwable ex) { ex.printStackTrace(); - ex.printStackTrace(GT_Log.err); + ex.printStackTrace(GTLog.err); } } @@ -641,7 +641,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity tTime = System.nanoTime() - tTime; mTimeStatisticsIndex = (mTimeStatisticsIndex + 1) % mTimeStatistics.length; mTimeStatistics[mTimeStatisticsIndex] = (int) tTime; - if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING * 1_000_000L) + if (tTime > 0 && tTime > (GregTechAPI.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING * 1_000_000L) && mTickTimer > 1000 && getMetaTileEntity().doTickProfilingMessageDuringThisTick() && mLagWarningCount++ < 10) @@ -684,7 +684,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (mSendClientData) { NW.sendPacketToAllPlayersInRange( worldObj, - new GT_Packet_TileEntity( + new GTPacketTileEntity( xCoord, (short) yCoord, zCoord, @@ -699,8 +699,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity | (mRedstone ? 16 : 0) | (mLockUpgrade ? 32 : 0) | (mWorks ? 64 : 0)), - oTexturePage = (hasValidMetaTileEntity() && mMetaTileEntity instanceof GT_MetaTileEntity_Hatch) - ? ((GT_MetaTileEntity_Hatch) mMetaTileEntity).getTexturePage() + oTexturePage = (hasValidMetaTileEntity() && mMetaTileEntity instanceof MTEHatch) + ? ((MTEHatch) mMetaTileEntity).getTexturePage() : 0, oUpdateData = hasValidMetaTileEntity() ? mMetaTileEntity.getUpdateData() : 0, oRedstoneData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0) @@ -747,9 +747,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity try { mMetaTileEntity.receiveClientEvent((byte) aEventID, (byte) aValue); } catch (Throwable e) { - GT_Log.err.println( + GTLog.err.println( "Encountered Exception while receiving Data from the Server, the Client should've been crashed by now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + e.printStackTrace(GTLog.err); } } @@ -768,8 +768,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (hasValidMetaTileEntity()) { if ((aValue & 0x80) == 0) // Is texture index mMetaTileEntity.onValueUpdate((byte) (aValue & 0x7F)); - else if (mMetaTileEntity instanceof GT_MetaTileEntity_Hatch) // is texture page and hatch - ((GT_MetaTileEntity_Hatch) mMetaTileEntity).onTexturePageUpdate((byte) (aValue & 0x7F)); + else if (mMetaTileEntity instanceof MTEHatch) // is texture page and hatch + ((MTEHatch) mMetaTileEntity).onTexturePageUpdate((byte) (aValue & 0x7F)); } } case GregTechTileClientEvents.CHANGE_COLOR -> { @@ -836,11 +836,11 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity int samples = mTimeStatistics.length - amountOfZero; if (samples > 0) { tList.add( - "Average CPU load of ~" + GT_Utility.formatNumbers(tAverageTime / samples) + "Average CPU load of ~" + GTUtility.formatNumbers(tAverageTime / samples) + "ns over " - + GT_Utility.formatNumbers(samples) + + GTUtility.formatNumbers(samples) + " ticks with worst time of " - + GT_Utility.formatNumbers(tWorstTime) + + GTUtility.formatNumbers(tWorstTime) + "ns."); } } else { @@ -848,9 +848,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity tList.add("Just started tick time statistics."); } tList.add( - "Recorded " + GT_Utility.formatNumbers(mMetaTileEntity.mSoundRequests) + "Recorded " + GTUtility.formatNumbers(mMetaTileEntity.mSoundRequests) + " sound requests in " - + GT_Utility.formatNumbers(mTickTimer - mLastCheckTick) + + GTUtility.formatNumbers(mTickTimer - mLastCheckTick) + " ticks."); mLastCheckTick = mTickTimer; mMetaTileEntity.mSoundRequests = 0; @@ -858,7 +858,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity tList.add( "Caused " + (mLagWarningCount >= 10 ? "more than 10" : mLagWarningCount) + " Lag Spike Warnings (anything taking longer than " - + GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING + + GregTechAPI.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING + "ms) on the Server."); } tList.add( @@ -867,8 +867,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } if (aLogLevel > 0) { if (getSteamCapacity() > 0 && hasSteamEngineUpgrade()) tList.add( - GT_Utility.formatNumbers(getStoredSteam()) + " of " - + GT_Utility.formatNumbers(getSteamCapacity()) + GTUtility.formatNumbers(getStoredSteam()) + " of " + + GTUtility.formatNumbers(getSteamCapacity()) + " Steam"); tList.add( "Machine is " + (mActive ? EnumChatFormatting.GREEN + "active" + EnumChatFormatting.RESET @@ -907,7 +907,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (mMetaTileEntity.shouldTriggerBlockUpdate()) { // If we're triggering a block update this will call onMachineBlockUpdate() - GregTech_API.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord); + GregTechAPI.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord); } else { // If we're not trigger a cascading one, call the update here. onMachineBlockUpdate(); @@ -934,14 +934,14 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity markDirty(); mMetaTileEntity.setInventorySlotContents( aIndex, - worldObj.isRemote ? aStack : GT_OreDictUnificator.setStack(true, aStack)); + worldObj.isRemote ? aStack : GTOreDictUnificator.setStack(true, aStack)); } } @Override public String getInventoryName() { if (canAccessData()) return mMetaTileEntity.getInventoryName(); - if (GregTech_API.METATILEENTITIES[mID] != null) return GregTech_API.METATILEENTITIES[mID].getInventoryName(); + if (GregTechAPI.METATILEENTITIES[mID] != null) return GregTechAPI.METATILEENTITIES[mID].getInventoryName(); return ""; } @@ -1374,7 +1374,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity public void doEnergyExplosion() { if (getUniversalEnergyCapacity() > 0 && getUniversalEnergyStored() >= getUniversalEnergyCapacity() / 5) { - GT_Log.exp.println( + GTLog.exp.println( "Energy Explosion, injected " + getUniversalEnergyStored() + "EU >= " + getUniversalEnergyCapacity() / 5D @@ -1383,7 +1383,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity doExplosion( oOutput * (getUniversalEnergyStored() >= getUniversalEnergyCapacity() ? 4 : getUniversalEnergyStored() >= getUniversalEnergyCapacity() / 2 ? 2 : 1)); - GT_Mod.achievements.issueAchievement( + GTMod.achievements.issueAchievement( this.getWorldObj() .getPlayerEntityByName(mOwnerName), "electricproblems"); @@ -1394,7 +1394,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity public void doExplosion(long aAmount) { if (canAccessData()) { // This is only for Electric Machines - if (GregTech_API.sMachineWireFire && mMetaTileEntity.isElectric()) { + if (GregTechAPI.sMachineWireFire && mMetaTileEntity.isElectric()) { try { mReleaseEnergy = true; IEnergyConnected.Util.emitEnergyToNetwork(V[5], Math.max(1, getStoredEU() / V[5]), this); @@ -1403,7 +1403,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity mReleaseEnergy = false; // Normal Explosion Code mMetaTileEntity.onExplosion(); - if (GT_Mod.gregtechproxy.mExplosionItemDrop) { + if (GTMod.gregtechproxy.mExplosionItemDrop) { for (int i = 0; i < this.getSizeInventory(); i++) { final ItemStack tItem = this.getStackInSlot(i); if ((tItem != null) && (tItem.stackSize > 0) && (this.isValidSlot(i))) { @@ -1415,12 +1415,12 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (mRecipeStuff != null) { for (int i = 0; i < 9; i++) { if (this.getRandomNumber(100) < 50) { - dropItems(GT_Utility.loadItem(mRecipeStuff, "Ingredient." + i)); + dropItems(GTUtility.loadItem(mRecipeStuff, "Ingredient." + i)); } } } - GT_Pollution.addPollution((TileEntity) this, GT_Mod.gregtechproxy.mPollutionOnExplosion); + Pollution.addPollution((TileEntity) this, GTMod.gregtechproxy.mPollutionOnExplosion); mMetaTileEntity.doExplosion(aAmount); } } @@ -1453,7 +1453,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity @Override public ArrayList getDrops() { - final ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); + final ItemStack rStack = new ItemStack(GregTechAPI.sBlockMachines, 1, mID); final NBTTagCompound tNBT = new NBTTagCompound(); if (mRecipeStuff != null && !mRecipeStuff.hasNoTags()) tNBT.setTag("GT.CraftingComponents", mRecipeStuff); if (mMuffler) tNBT.setBoolean("mMuffler", mMuffler); @@ -1486,7 +1486,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron if (aPlayer.isSneaking()) { final ForgeDirection tSide = (getCoverIDAtSide(side) == 0) - ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) + ? GTUtility.determineWrenchingSide(side, aX, aY, aZ) : side; return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI()); } else if (getCoverBehaviorAtSideNew(side).onCoverRightclickClient(side, this, aPlayer, aX, aY, aZ)) { @@ -1502,17 +1502,17 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); if (tCurrentItem != null) { if (getColorization() >= 0 - && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { + && GTUtility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { tCurrentItem.func_150996_a(Items.bucket); setColorization((byte) (getColorization() >= 16 ? -2 : -1)); return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) { - if (aPlayer.isSneaking() && mMetaTileEntity instanceof GT_MetaTileEntity_BasicMachine - && ((GT_MetaTileEntity_BasicMachine) mMetaTileEntity) - .setMainFacing(GT_Utility.determineWrenchingSide(side, aX, aY, aZ))) { - GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); - GT_Utility.sendSoundToPlayers( + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWrenchList)) { + if (aPlayer.isSneaking() && mMetaTileEntity instanceof MTEBasicMachine + && ((MTEBasicMachine) mMetaTileEntity) + .setMainFacing(GTUtility.determineWrenchingSide(side, aX, aY, aZ))) { + GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -1523,14 +1523,14 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity cableUpdateDelay = 10; } else if (mMetaTileEntity.onWrenchRightClick( side, - GT_Utility.determineWrenchingSide(side, aX, aY, aZ), + GTUtility.determineWrenchingSide(side, aX, aY, aZ), aPlayer, aX, aY, aZ, tCurrentItem)) { - GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); - GT_Utility.sendSoundToPlayers( + GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -1543,8 +1543,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sScrewdriverList)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { setCoverDataAtSide( side, getCoverBehaviorAtSideNew(side).onCoverScrewdriverClick( @@ -1557,7 +1557,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity aY, aZ)); mMetaTileEntity.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ, tCurrentItem); - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -1569,18 +1569,18 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sHardHammerList)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { mInputDisabled = !mInputDisabled; if (mInputDisabled) mOutputDisabled = !mOutputDisabled; - GT_Utility.sendChatToPlayer( + GTUtility.sendChatToPlayer( aPlayer, - GT_Utility.trans("086", "Auto-Input: ") + (mInputDisabled - ? GT_Utility.trans("087", "Disabled") - : GT_Utility.trans("088", "Enabled") + GT_Utility.trans("089", " Auto-Output: ") - + (mOutputDisabled ? GT_Utility.trans("087", "Disabled") - : GT_Utility.trans("088", "Enabled")))); - GT_Utility.sendSoundToPlayers( + GTUtility.trans("086", "Auto-Input: ") + + (mInputDisabled ? GTUtility.trans("087", "Disabled") + : GTUtility.trans("088", "Enabled") + GTUtility.trans("089", " Auto-Output: ") + + (mOutputDisabled ? GTUtility.trans("087", "Disabled") + : GTUtility.trans("088", "Enabled")))); + GTUtility.sendSoundToPlayers( worldObj, SoundResource.RANDOM_ANVIL_USE, 1.0F, @@ -1592,19 +1592,19 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSoftHammerList)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { if (mWorks) disableWorking(); else enableWorking(); { - String tChat = GT_Utility.trans("090", "Machine Processing: ") - + (isAllowedToWork() ? GT_Utility.trans("088", "Enabled") - : GT_Utility.trans("087", "Disabled")); + String tChat = GTUtility.trans("090", "Machine Processing: ") + + (isAllowedToWork() ? GTUtility.trans("088", "Enabled") + : GTUtility.trans("087", "Disabled")); if (getMetaTileEntity() != null && getMetaTileEntity().hasAlternativeModeText()) tChat = getMetaTileEntity().getAlternativeModeText(); - GT_Utility.sendChatToPlayer(aPlayer, tChat); + GTUtility.sendChatToPlayer(aPlayer, tChat); } - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, @@ -1616,11 +1616,11 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) { - final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ); + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSolderingToolList)) { + final ForgeDirection tSide = GTUtility.determineWrenchingSide(side, aX, aY, aZ); if (mMetaTileEntity.onSolderingToolRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) { // logic handled internally - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_BATTERY_USE, 1.0F, @@ -1628,15 +1628,15 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity xCoord, yCoord, zCoord); - } else if (GT_ModHandler.useSolderingIron(tCurrentItem, aPlayer)) { + } else if (GTModHandler.useSolderingIron(tCurrentItem, aPlayer)) { mStrongRedstone ^= tSide.flag; - GT_Utility.sendChatToPlayer( + GTUtility.sendChatToPlayer( aPlayer, - GT_Utility.trans("091", "Redstone Output at Side ") + tSide - + GT_Utility.trans("092", " set to: ") - + ((mStrongRedstone & tSide.flag) != 0 ? GT_Utility.trans("093", "Strong") - : GT_Utility.trans("094", "Weak"))); - GT_Utility.sendSoundToPlayers( + GTUtility.trans("091", "Redstone Output at Side ") + tSide + + GTUtility.trans("092", " set to: ") + + ((mStrongRedstone & tSide.flag) != 0 ? GTUtility.trans("093", "Strong") + : GTUtility.trans("094", "Weak"))); + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_BATTERY_USE, 3.0F, @@ -1651,11 +1651,11 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) { - final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ); + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWireCutterList)) { + final ForgeDirection tSide = GTUtility.determineWrenchingSide(side, aX, aY, aZ); if (mMetaTileEntity.onWireCutterRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) { // logic handled internally - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -1670,20 +1670,19 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } ForgeDirection coverSide = side; - if (getCoverIDAtSide(side) == 0) coverSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ); + if (getCoverIDAtSide(side) == 0) coverSide = GTUtility.determineWrenchingSide(side, aX, aY, aZ); if (getCoverIDAtSide(coverSide) == 0) { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { - final GT_CoverBehaviorBase coverBehavior = GregTech_API - .getCoverBehaviorNew(tCurrentItem); + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sCovers.keySet())) { + final CoverBehaviorBase coverBehavior = GregTechAPI.getCoverBehaviorNew(tCurrentItem); if (coverBehavior.isCoverPlaceable(coverSide, tCurrentItem, this) - && mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) { + && mMetaTileEntity.allowCoverOnSide(coverSide, new GTItemStack(tCurrentItem))) { setCoverItemAtSide(coverSide, tCurrentItem); coverBehavior.onPlayerAttach(aPlayer, tCurrentItem, this, coverSide); if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--; - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -1696,9 +1695,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } } else { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { - GT_Utility.sendSoundToPlayers( + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sCrowbarList)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + GTUtility.sendSoundToPlayers( worldObj, SoundResource.RANDOM_BREAK, 1.0F, @@ -1709,15 +1708,15 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity dropCover(coverSide, side, false); } return true; - } else if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sJackhammerList)) { + } else if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sJackhammerList)) { // Configuration of delicate electronics calls for a tool with precision and subtlety. - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { final CoverInfo info = getCoverInfoAtSide(coverSide); if (info != CoverInfo.EMPTY_INFO) { - final GT_CoverBehaviorBase behavior = info.getCoverBehavior(); + final CoverBehaviorBase behavior = info.getCoverBehavior(); if (behavior.allowsTickRateAddition()) { info.onCoverJackhammer(aPlayer); - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT, 1.0F, @@ -1727,7 +1726,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity zCoord); } else { - GT_Utility.sendChatToPlayer( + GTUtility.sendChatToPlayer( aPlayer, StatCollector.translateToLocal("gt.cover.info.chat.tick_rate_not_allowed")); } @@ -1738,7 +1737,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } // End item != null } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config if possible. - side = (getCoverIDAtSide(side) == 0) ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) : side; + side = (getCoverIDAtSide(side) == 0) ? GTUtility.determineWrenchingSide(side, aX, aY, aZ) : side; return getCoverIDAtSide(side) > 0 && getCoverBehaviorAtSideNew(side).onCoverShiftRightClick( side, getCoverIDAtSide(side), @@ -1762,7 +1761,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (isUpgradable() && tCurrentItem != null) { if (ItemList.Upgrade_Muffler.isStackEqual(aPlayer.inventory.getCurrentItem())) { if (addMufflerUpgrade()) { - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.RANDOM_CLICK, 1.0F, @@ -1779,7 +1778,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity mLockUpgrade = true; setOwnerName(aPlayer.getDisplayName()); setOwnerUuid(aPlayer.getUniqueID()); - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.RANDOM_CLICK, 1.0F, @@ -1799,9 +1798,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (!aPlayer.isSneaking() && hasValidMetaTileEntity()) return mMetaTileEntity.onRightclick(this, aPlayer, side, aX, aY, aZ); } catch (Throwable e) { - GT_Log.err.println( + GTLog.err.println( "Encountered Exception while rightclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + e.printStackTrace(GTLog.err); e.printStackTrace(); } @@ -1813,9 +1812,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity try { if (aPlayer != null && hasValidMetaTileEntity()) mMetaTileEntity.onLeftclick(this, aPlayer); } catch (Throwable e) { - GT_Log.err.println( + GTLog.err.println( "Encountered Exception while leftclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + e.printStackTrace(GTLog.err); } } @@ -1859,7 +1858,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity final CoverInfo coverInfo = getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide)); if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1))) return mMetaTileEntity.getAccessibleSlotsFromSide(ordinalSide); - return GT_Values.emptyIntArray; + return GTValues.emptyIntArray; } /** @@ -1998,13 +1997,13 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity @Override public String getOwnerName() { - if (GT_Utility.isStringInvalid(mOwnerName)) return "Player"; + if (GTUtility.isStringInvalid(mOwnerName)) return "Player"; return mOwnerName; } @Override public String setOwnerName(String aName) { - if (GT_Utility.isStringInvalid(aName)) return mOwnerName = "Player"; + if (GTUtility.isStringInvalid(aName)) return mOwnerName = "Player"; return mOwnerName = aName; } @@ -2041,7 +2040,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity || getStoredEU() >= getEUCapacity() || mMetaTileEntity.maxAmperesIn() <= mAcceptedAmperes) return 0; if (aVoltage > getInputVoltage()) { - GT_Log.exp + GTLog.exp .println("Energy Explosion, injected " + aVoltage + "EU/t in a " + getInputVoltage() + "EU/t Machine!"); doExplosion(aVoltage); return 0; @@ -2245,15 +2244,15 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity @Override public boolean addStackToSlot(int slotIndex, ItemStack stack) { - if (GT_Utility.isStackInvalid(stack)) return true; + if (GTUtility.isStackInvalid(stack)) return true; if (slotIndex < 0 || slotIndex >= getSizeInventory()) return false; final ItemStack toStack = getStackInSlot(slotIndex); - if (GT_Utility.isStackInvalid(toStack)) { + if (GTUtility.isStackInvalid(toStack)) { setInventorySlotContents(slotIndex, stack); return true; } - final ItemStack fromStack = GT_OreDictUnificator.get(stack); - if (GT_Utility.areStacksEqual(toStack, fromStack) && toStack.stackSize + fromStack.stackSize + final ItemStack fromStack = GTOreDictUnificator.get(stack); + if (GTUtility.areStacksEqual(toStack, fromStack) && toStack.stackSize + fromStack.stackSize <= Math.min(fromStack.getMaxStackSize(), getInventoryStackLimit())) { toStack.stackSize += fromStack.stackSize; markDirty(); @@ -2264,7 +2263,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity @Override public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) { - return addStackToSlot(aIndex, GT_Utility.copyAmount(aAmount, aStack)); + return addStackToSlot(aIndex, GTUtility.copyAmount(aAmount, aStack)); } @Override @@ -2343,13 +2342,13 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity final int newInputSize; final int oldOutputSize; final int newOutputSize; - final int chemistryUpdateVersion = GT_Mod.calculateTotalGTVersion(509, 31); - final int configCircuitAdditionVersion = GT_Mod.calculateTotalGTVersion(509, 40); - final int wireAdditionVersion = GT_Mod.calculateTotalGTVersion(509, 41); - final int disassemblerRemoveVersion = GT_Mod.calculateTotalGTVersion(509, 42, 44); + final int chemistryUpdateVersion = GTMod.calculateTotalGTVersion(509, 31); + final int configCircuitAdditionVersion = GTMod.calculateTotalGTVersion(509, 40); + final int wireAdditionVersion = GTMod.calculateTotalGTVersion(509, 41); + final int disassemblerRemoveVersion = GTMod.calculateTotalGTVersion(509, 42, 44); if (nbtVersion < 1000000) nbtVersion *= 1000; // 4 is old GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT - if (nbtVersion < configCircuitAdditionVersion && getMetaTileEntity() instanceof GT_MetaTileEntity_BasicMachine + if (nbtVersion < configCircuitAdditionVersion && getMetaTileEntity() instanceof MTEBasicMachine && slotIndex >= 4) slotIndex += 1; if (mID >= 211 && mID <= 218) { // Assembler if (nbtVersion < chemistryUpdateVersion) { @@ -2415,10 +2414,10 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } int indexShift = 0; - if (slotIndex >= GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT + oldInputSize) { + if (slotIndex >= MTEBasicMachine.OTHER_SLOT_COUNT + oldInputSize) { indexShift += newInputSize - oldInputSize; } - if (slotIndex >= GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT + oldInputSize + oldOutputSize) { + if (slotIndex >= MTEBasicMachine.OTHER_SLOT_COUNT + oldInputSize + oldOutputSize) { indexShift += newOutputSize - oldOutputSize; } return slotIndex + indexShift; diff --git a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java index c2cef8628d..7b18565165 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java @@ -1,6 +1,6 @@ package gregtech.api.metatileentity; -import static gregtech.api.enums.GT_Values.NW; +import static gregtech.api.enums.GTValues.NW; import java.util.Arrays; import java.util.List; @@ -47,10 +47,10 @@ import com.gtnewhorizons.modularui.common.widget.TextWidget; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; -import gregtech.GT_Mod; +import gregtech.GTMod; import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.enums.GTValues; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.gui.modularui.GUITextureSet; import gregtech.api.interfaces.IConfigurationCircuitSupport; import gregtech.api.interfaces.modularui.IAddGregtechLogo; @@ -60,11 +60,11 @@ import gregtech.api.interfaces.tileentity.IGTEnet; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords; import gregtech.api.interfaces.tileentity.IIC2Enet; -import gregtech.api.net.GT_Packet_Block_Event; -import gregtech.api.net.GT_Packet_SetConfigurationCircuit; +import gregtech.api.net.GTPacketBlockEvent; +import gregtech.api.net.GTPacketSetConfigurationCircuit; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; import gregtech.api.util.GT_TooltipDataCache; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory; import ic2.api.energy.event.EnergyTileLoadEvent; import ic2.api.energy.event.EnergyTileUnloadEvent; @@ -103,7 +103,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje public static ForgeDirection getSideForPlayerPlacing(Entity player, ForgeDirection defaultFacing, boolean[] aAllowedFacings) { - final ForgeDirection facingFromPlayer = GT_Utility.getSideFromPlayerFacing(player); + final ForgeDirection facingFromPlayer = GTUtility.getSideFromPlayerFacing(player); if (facingFromPlayer != ForgeDirection.UNKNOWN && aAllowedFacings[facingFromPlayer.ordinal()]) return facingFromPlayer; @@ -424,13 +424,13 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje @Override public final boolean getOpacity(int x, int y, int z) { if (ignoreUnloadedChunks && crossedChunkBorder(x, z) && !worldObj.blockExists(x, y, z)) return false; - return GT_Utility.isOpaqueBlock(worldObj, x, y, z); + return GTUtility.isOpaqueBlock(worldObj, x, y, z); } @Override public final boolean getAir(int x, int y, int z) { if (ignoreUnloadedChunks && crossedChunkBorder(x, z) && !worldObj.blockExists(x, y, z)) return true; - return GT_Utility.isBlockAir(worldObj, x, y, z); + return GTUtility.isBlockAir(worldObj, x, y, z); } @Override @@ -540,7 +540,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje public final void sendBlockEvent(byte aID, byte aValue) { NW.sendPacketToAllPlayersInRange( worldObj, - new GT_Packet_Block_Event(xCoord, (short) yCoord, zCoord, aID, aValue), + new GTPacketBlockEvent(xCoord, (short) yCoord, zCoord, aID, aValue), xCoord, zCoord); } @@ -554,7 +554,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } public final void setOnFire() { - GT_Utility.setCoordsOnFire(worldObj, xCoord, yCoord, zCoord, false); + GTUtility.setCoordsOnFire(worldObj, xCoord, yCoord, zCoord, false); } public final void setToFire() { @@ -666,7 +666,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } protected void addTitleToUI(ModularWindow.Builder builder, String title) { - if (GT_Mod.gregtechproxy.mTitleTabStyle == 2) { + if (GTMod.gregtechproxy.mTitleTabStyle == 2) { addTitleItemIconStyle(builder, title); } else { addTitleTextStyle(builder, title); @@ -691,7 +691,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje final TextWidget text = new TextWidget(title).setDefaultColor(getTitleColor()) .setTextAlignment(Alignment.CenterLeft) .setMaxWidth(titleWidth); - if (GT_Mod.gregtechproxy.mTitleTabStyle == 1) { + if (GTMod.gregtechproxy.mTitleTabStyle == 1) { tab.setDrawable(getGUITextureSet().getTitleTabAngular()) .setPos(0, -(titleHeight + TAB_PADDING) + 1) .setSize(getGUIWidth(), titleHeight + TAB_PADDING * 2); @@ -852,9 +852,9 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } } else { final List tCircuits = ccs.getConfigurationCircuits(); - final int index = GT_Utility.findMatchingStackInList(tCircuits, cursorStack); + final int index = GTUtility.findMatchingStackInList(tCircuits, cursorStack); if (index < 0) { - int curIndex = GT_Utility + int curIndex = GTUtility .findMatchingStackInList(tCircuits, inv.getStackInSlot(ccs.getCircuitSlot())) + 1; if (clickData.mouseButton == 0) { curIndex += 1; @@ -894,7 +894,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje }) .disableShiftInsert() .setHandlePhantomActionClient(true) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_INT_CIRCUIT) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_INT_CIRCUIT) .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.select_circuit.tooltip")) .setTooltipShowUpDelay(TOOLTIP_DELAY) .setPos(ccs.getCircuitSlotX() - 1, ccs.getCircuitSlotY() - 1)); @@ -913,7 +913,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje getStackForm(0), this::onCircuitSelected, circuits, - GT_Utility.findMatchingStackInList(circuits, inv.getStackInSlot(ccs.getCircuitSlot()))) + GTUtility.findMatchingStackInList(circuits, inv.getStackInSlot(ccs.getCircuitSlot()))) .setAnotherWindow(true, dialogOpened) .setGuiTint(getGUIColorization()) .setCurrentGetter(() -> inv.getStackInSlot(ccs.getCircuitSlot())) @@ -926,7 +926,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje if (!(this instanceof IInventory inv)) return; - GT_Values.NW.sendToServer(new GT_Packet_SetConfigurationCircuit(this, selected)); + GTValues.NW.sendToServer(new GTPacketSetConfigurationCircuit(this, selected)); // we will not do any validation on client side // it doesn't get to actually decide what inventory contains anyway inv.setInventorySlotContents(ccs.getCircuitSlot(), selected); @@ -943,7 +943,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje protected Supplier COLOR_TEXT_RED = () -> getTextColorOrDefault("text_red", 0xff0000); public int getGUIColorization() { - return GT_Util.getRGBaInt(Dyes.dyeWhite.getRGBA()); + return GTUtil.getRGBaInt(Dyes.dyeWhite.getRGBA()); } public ItemStack getStackForm(long aAmount) { diff --git a/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java index c3528d44d7..3b0c9cc89f 100644 --- a/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java @@ -1,6 +1,6 @@ package gregtech.api.metatileentity; -import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.GTMod.GT_FML_LOGGER; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -16,8 +16,8 @@ import appeng.api.crafting.ICraftingIconProvider; import appeng.api.implementations.tiles.ISoundP2PHandler; import appeng.me.cache.helpers.TunnelCollection; import appeng.parts.p2p.PartP2PSound; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; import gregtech.api.enums.ItemList; import gregtech.api.gui.modularui.GUITextureSet; import gregtech.api.interfaces.IConfigurationCircuitSupport; @@ -27,9 +27,9 @@ import gregtech.api.interfaces.modularui.IAddUIWidgets; import gregtech.api.interfaces.modularui.IBindPlayerInventoryUI; import gregtech.api.interfaces.modularui.IGetTitleColor; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; public abstract class CommonMetaTileEntity extends CoverableTileEntity implements IGregTechTileEntity, ICraftingIconProvider, ISoundP2PHandler { @@ -37,11 +37,11 @@ public abstract class CommonMetaTileEntity extends CoverableTileEntity protected boolean mNeedsBlockUpdate = true, mNeedsUpdate = true, mSendClientData = false, mInventoryChanged = false; protected boolean createNewMetatileEntity(short aID) { - if (aID <= 0 || aID >= GregTech_API.METATILEENTITIES.length || GregTech_API.METATILEENTITIES[aID] == null) { - GT_Log.err.println("MetaID " + aID + " not loadable => locking TileEntity!"); + if (aID <= 0 || aID >= GregTechAPI.METATILEENTITIES.length || GregTechAPI.METATILEENTITIES[aID] == null) { + GTLog.err.println("MetaID " + aID + " not loadable => locking TileEntity!"); } else { if (hasValidMetaTileEntity()) getMetaTileEntity().setBaseMetaTileEntity(null); - GregTech_API.METATILEENTITIES[aID].newMetaEntity(this) + GregTechAPI.METATILEENTITIES[aID].newMetaEntity(this) .setBaseMetaTileEntity(this); mTickTimer = 0; mID = aID; @@ -53,7 +53,7 @@ public abstract class CommonMetaTileEntity extends CoverableTileEntity protected void saveMetaTileNBT(NBTTagCompound aNBT) { try { if (hasValidMetaTileEntity()) { - aNBT.setInteger("nbtVersion", GT_Mod.NBT_VERSION); + aNBT.setInteger("nbtVersion", GTMod.NBT_VERSION); final NBTTagList tItemList = new NBTTagList(); for (int i = 0; i < getMetaTileEntity().getRealInventory().length; i++) { final ItemStack tStack = getMetaTileEntity().getRealInventory()[i]; @@ -70,12 +70,12 @@ public abstract class CommonMetaTileEntity extends CoverableTileEntity getMetaTileEntity().saveNBTData(aNBT); } catch (Throwable e) { GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity."); - GT_Mod.logStackTrace(e); + GTMod.logStackTrace(e); } } } catch (Throwable e) { GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity."); - GT_Mod.logStackTrace(e); + GTMod.logStackTrace(e); } } @@ -87,7 +87,7 @@ public abstract class CommonMetaTileEntity extends CoverableTileEntity final NBTTagCompound tTag = tItemList.getCompoundTagAt(i); final int tSlot = migrateInventoryIndex(tTag.getInteger("IntSlot"), nbtVersion); if (tSlot >= 0 && tSlot < getMetaTileEntity().getRealInventory().length) { - ItemStack loadedStack = GT_Utility.loadItem(tTag); + ItemStack loadedStack = GTUtility.loadItem(tTag); // We move away from fluid display item in TEs if (loadedStack != null && loadedStack.getItem() == ItemList.Display_Fluid.getItem()) { loadedStack = null; @@ -100,7 +100,7 @@ public abstract class CommonMetaTileEntity extends CoverableTileEntity getMetaTileEntity().loadNBTData(aNBT); } catch (Throwable e) { GT_FML_LOGGER.error("Encountered Exception while loading MetaTileEntity."); - GT_Mod.logStackTrace(e); + GTMod.logStackTrace(e); } } } @@ -175,7 +175,7 @@ public abstract class CommonMetaTileEntity extends CoverableTileEntity } @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { return hasValidMetaTileEntity() && getMetaTileEntity().allowCoverOnSide(side, aCoverID); } diff --git a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java index 429e0fc04c..bf62a1ce74 100644 --- a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java @@ -1,9 +1,9 @@ package gregtech.api.metatileentity; -import static gregtech.api.enums.GT_Values.E; -import static gregtech.api.enums.GT_Values.NW; -import static gregtech.api.util.GT_LanguageManager.FACES; -import static gregtech.api.util.GT_LanguageManager.getTranslation; +import static gregtech.api.enums.GTValues.E; +import static gregtech.api.enums.GTValues.NW; +import static gregtech.api.util.GTLanguageManager.FACES; +import static gregtech.api.util.GTLanguageManager.getTranslation; import java.util.ArrayList; import java.util.Arrays; @@ -48,23 +48,23 @@ import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.Textures; import gregtech.api.gui.modularui.GUITextureSet; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IGregtechWailaProvider; -import gregtech.api.net.GT_Packet_RequestCoverData; -import gregtech.api.net.GT_Packet_SendCoverData; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_CoverBehaviorBase; +import gregtech.api.net.GTPacketRequestCoverData; +import gregtech.api.net.GTPacketSendCoverData; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.CoverBehaviorBase; import gregtech.api.util.ISerializableObject; -import gregtech.common.GT_Client; +import gregtech.common.GTClient; +import gregtech.common.covers.CoverFluidfilter; import gregtech.common.covers.CoverInfo; -import gregtech.common.covers.GT_Cover_Fluidfilter; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import mcp.mobius.waila.api.IWailaConfigHandler; @@ -105,7 +105,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov .saveDataToNBT()); } if (tList.tagCount() > 0) { - aNBT.setTag(GT_Values.NBT.COVERS, tList); + aNBT.setTag(GTValues.NBT.COVERS, tList); // Backwards compat, in case of a revert... for now aNBT.setIntArray("mCoverSides", coverSides); } @@ -124,7 +124,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov : new byte[] { 15, 15, 15, 15, 15, 15 }; mStrongRedstone = aNBT.getByte("mStrongRedstone"); - if (aNBT.hasKey(GT_Values.NBT.COVERS)) { + if (aNBT.hasKey(GTValues.NBT.COVERS)) { readCoverInfoNBT(aNBT); } else if (aNBT.hasKey("mCoverSides")) { readLegacyCoverInfoNBT(aNBT); @@ -132,7 +132,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov } public void readCoverInfoNBT(NBTTagCompound aNBT) { - final NBTTagList tList = aNBT.getTagList(GT_Values.NBT.COVERS, 10); + final NBTTagList tList = aNBT.getTagList(GTValues.NBT.COVERS, 10); for (byte i = 0; i < tList.tagCount(); i++) { final NBTTagCompound tNBT = tList.getCompoundTagAt(i); final CoverInfo coverInfo = new CoverInfo(this, tNBT); @@ -152,12 +152,12 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov if (coverIDs[ordinalSide] == 0) continue; final CoverInfo coverInfo = new CoverInfo(side, coverIDs[ordinalSide], this, null); - final GT_CoverBehaviorBase coverBehavior = coverInfo.getCoverBehavior(); - if (coverBehavior == GregTech_API.sNoBehavior) continue; + final CoverBehaviorBase coverBehavior = coverInfo.getCoverBehavior(); + if (coverBehavior == GregTechAPI.sNoBehavior) continue; ISerializableObject coverData = null; if (hasOldCoverData) { - if (coverBehavior instanceof GT_Cover_Fluidfilter) { + if (coverBehavior instanceof CoverFluidfilter) { final String filterKey = String.format("fluidFilter%d", ordinalSide); if (aNBT.hasKey(filterKey)) { coverData = coverInfo.getCoverBehavior() @@ -229,12 +229,12 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov return true; } - public abstract boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID); + public abstract boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID); protected void checkDropCover() { for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { final int coverId = getCoverIDAtSide(side); - if (coverId != 0 && !allowCoverOnSide(side, new GT_ItemStack(coverId))) dropCover(side, side, true); + if (coverId != 0 && !allowCoverOnSide(side, new GTItemStack(coverId))) dropCover(side, side, true); } } @@ -256,20 +256,20 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov public final ITexture getCoverTexture(ForgeDirection side) { final CoverInfo coverInfo = getCoverInfoAtSide(side); if (!coverInfo.isValid()) return null; - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) { + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x1) != 0) { return Textures.BlockIcons.HIDDEN_TEXTURE[0]; // See through } final ITexture coverTexture = (!(this instanceof BaseMetaPipeEntity)) ? coverInfo.getSpecialCoverFGTexture() : coverInfo.getSpecialCoverTexture(); - return coverTexture != null ? coverTexture : GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(side))); + return coverTexture != null ? coverTexture : GregTechAPI.sCovers.get(new GTItemStack(getCoverIDAtSide(side))); } protected void requestCoverDataIfNeeded() { if (worldObj == null || !worldObj.isRemote) return; for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { final CoverInfo coverInfo = getCoverInfoAtSide(side); - if (coverInfo.isDataNeededOnClient()) NW.sendToServer(new GT_Packet_RequestCoverData(coverInfo, this)); + if (coverInfo.isDataNeededOnClient()) NW.sendToServer(new GTPacketRequestCoverData(coverInfo, this)); } } @@ -318,15 +318,15 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override @Deprecated - public GT_CoverBehavior getCoverBehaviorAtSide(ForgeDirection side) { - final GT_CoverBehaviorBase behavior = getCoverInfoAtSide(side).getCoverBehavior(); - if (behavior instanceof GT_CoverBehavior) return (GT_CoverBehavior) behavior; - return GregTech_API.sNoBehavior; + public CoverBehavior getCoverBehaviorAtSide(ForgeDirection side) { + final CoverBehaviorBase behavior = getCoverInfoAtSide(side).getCoverBehavior(); + if (behavior instanceof CoverBehavior) return (CoverBehavior) behavior; + return GregTechAPI.sNoBehavior; } @Override public void setCoverItemAtSide(ForgeDirection side, ItemStack aCover) { - GregTech_API.getCoverBehaviorNew(aCover) + GregTechAPI.getCoverBehaviorNew(aCover) .placeCover(side, aCover, this); } @@ -366,7 +366,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov } @Override - public GT_CoverBehaviorBase getCoverBehaviorAtSideNew(ForgeDirection side) { + public CoverBehaviorBase getCoverBehaviorAtSideNew(ForgeDirection side) { return getCoverInfoAtSide(side).getCoverBehavior(); } @@ -546,11 +546,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { final CoverInfo coverInfo = getCoverInfoAtSide(side); if (coverInfo.needsUpdate()) { - NW.sendPacketToAllPlayersInRange( - worldObj, - new GT_Packet_SendCoverData(coverInfo, this), - xCoord, - zCoord); + NW.sendPacketToAllPlayersInRange(worldObj, new GTPacketSendCoverData(coverInfo, this), xCoord, zCoord); coverInfo.setNeedsUpdate(false); } } @@ -562,11 +558,11 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov final NBTTagCompound tag = accessor.getNBTData(); final ForgeDirection currentFacing = accessor.getSide(); - final NBTTagList tList = tag.getTagList(GT_Values.NBT.COVERS, 10); + final NBTTagList tList = tag.getTagList(GTValues.NBT.COVERS, 10); for (byte i = 0; i < tList.tagCount(); i++) { final NBTTagCompound tNBT = tList.getCompoundTagAt(i); final CoverInfo coverInfo = new CoverInfo(this, tNBT); - if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTech_API.sNoBehavior) continue; + if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTechAPI.sNoBehavior) continue; final ItemStack coverStack = coverInfo.getDisplayStack(); if (coverStack != null) { @@ -608,12 +604,12 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov */ public static void addInstalledCoversInformation(NBTTagCompound aNBT, List aList) { if (aNBT == null || aList == null) return; - final NBTTagList tList = aNBT.getTagList(GT_Values.NBT.COVERS, 10); + final NBTTagList tList = aNBT.getTagList(GTValues.NBT.COVERS, 10); for (byte i = 0; i < tList.tagCount(); i++) { final NBTTagCompound tNBT = tList.getCompoundTagAt(i); final CoverInfo coverInfo = new CoverInfo(null, tNBT); - if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTech_API.sNoBehavior) continue; + if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTechAPI.sNoBehavior) continue; final ItemStack coverStack = coverInfo.getDisplayStack(); if (coverStack != null) { @@ -634,8 +630,8 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov final int i = tSide.ordinal(); final int coverId = mCoverSides[i]; if (coverId == 0) continue; - final GT_CoverBehaviorBase behavior = GregTech_API.getCoverBehaviorNew(coverId); - if (behavior == null || behavior == GregTech_API.sNoBehavior) continue; + final CoverBehaviorBase behavior = GregTechAPI.getCoverBehaviorNew(coverId); + if (behavior == null || behavior == GregTechAPI.sNoBehavior) continue; if (!aNBT.hasKey(CoverableTileEntity.COVER_DATA_NBT_KEYS[i])) continue; final ISerializableObject dataObject = behavior .createDataObject(aNBT.getTag(CoverableTileEntity.COVER_DATA_NBT_KEYS[i])); @@ -676,12 +672,12 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov public void addCoverTabs(ModularWindow.Builder builder, UIBuildContext buildContext) { final int COVER_TAB_LEFT = -16, COVER_TAB_TOP = 1, COVER_TAB_HEIGHT = 20, COVER_TAB_WIDTH = 18, COVER_TAB_SPACING = 2, ICON_SIZE = 16; - final boolean flipHorizontally = GT_Mod.gregtechproxy.mCoverTabsFlipped; + final boolean flipHorizontally = GTMod.gregtechproxy.mCoverTabsFlipped; final Column columnWidget = new Column(); builder.widget(columnWidget); final int xPos = flipHorizontally ? (getGUIWidth() - COVER_TAB_LEFT - COVER_TAB_WIDTH) : COVER_TAB_LEFT; - if (GT_Mod.gregtechproxy.mCoverTabsVisible) { + if (GTMod.gregtechproxy.mCoverTabsVisible) { columnWidget.setPos(xPos, COVER_TAB_TOP) .setEnabled( widget -> ((Column) widget).getChildren() diff --git a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java index 8971db2d92..194aef8547 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java @@ -1,6 +1,6 @@ package gregtech.api.metatileentity; -import static gregtech.api.enums.GT_Values.GT; +import static gregtech.api.enums.GTValues.GT; import java.io.File; import java.util.ArrayList; @@ -30,9 +30,9 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gnu.trove.list.TIntList; import gnu.trove.list.array.TIntArrayList; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IConnectable; @@ -40,15 +40,15 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IColoredTileEntity; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; import gregtech.api.util.ISerializableObject; import gregtech.api.util.WorldSpawnedEventBuilder; -import gregtech.common.GT_Client; +import gregtech.common.GTClient; import gregtech.common.covers.CoverInfo; /** @@ -107,10 +107,10 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { } public MetaPipeEntity(int aID, String aBasicName, String aRegionalName, int aInvSlotCount, boolean aAddInfo) { - if (GregTech_API.sPostloadStarted || !GregTech_API.sPreloadStarted) + if (GregTechAPI.sPostloadStarted || !GregTechAPI.sPreloadStarted) throw new IllegalAccessError("This Constructor has to be called in the load Phase"); - if (GregTech_API.METATILEENTITIES[aID] == null) { - GregTech_API.METATILEENTITIES[aID] = this; + if (GregTechAPI.METATILEENTITIES[aID] == null) { + GregTechAPI.METATILEENTITIES[aID] = this; } else { throw new IllegalArgumentException("MetaMachine-Slot Nr. " + aID + " is already occupied!"); } @@ -118,7 +118,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { .toLowerCase(Locale.ENGLISH); setBaseMetaTileEntity(new BaseMetaPipeEntity()); getBaseMetaTileEntity().setMetaTileID((short) aID); - GT_LanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName); + GTLanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName); mInventory = new ItemStack[aInvSlotCount]; if (aAddInfo && GT.isClientSide()) { @@ -129,7 +129,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { protected final void addInfo(int aID) { if (!GT.isClientSide()) return; - ItemStack tStack = new ItemStack(GregTech_API.sBlockMachines, 1, aID); + ItemStack tStack = new ItemStack(GregTechAPI.sBlockMachines, 1, aID); Objects.requireNonNull(tStack.getItem()) .addInformation(tStack, null, new ArrayList<>(), true); } @@ -187,7 +187,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public ItemStack getStackForm(long aAmount) { - return new ItemStack(GregTech_API.sBlockMachines, (int) aAmount, getBaseMetaTileEntity().getMetaTileID()); + return new ItemStack(GregTechAPI.sBlockMachines, (int) aAmount, getBaseMetaTileEntity().getMetaTileID()); } public boolean isCoverOnSide(BaseMetaPipeEntity aPipe, EntityLivingBase aEntity) { @@ -254,7 +254,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { } @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { return true; } @@ -322,7 +322,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) { + if (aBaseMetaTileEntity.isClientSide() && GTClient.changeDetected == 4) { /* * Client tick counter that is set to 5 on hiding pipes and covers. It triggers a texture update next client * tick when reaching 4, with provision for 3 more update tasks, spreading client change detection related @@ -598,8 +598,8 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public String getInventoryName() { - if (GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()] != null) - return GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()].getMetaName(); + if (GregTechAPI.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()] != null) + return GregTechAPI.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()].getMetaName(); return ""; } @@ -615,7 +615,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public ItemStack decrStackSize(int aIndex, int aAmount) { - ItemStack tStack = getStackInSlot(aIndex), rStack = GT_Utility.copyOrNull(tStack); + ItemStack tStack = getStackInSlot(aIndex), rStack = GTUtility.copyOrNull(tStack); if (tStack != null) { if (tStack.stackSize <= aAmount) { if (setStackToZeroInsteadOfNull(aIndex)) tStack.stackSize = 0; @@ -647,7 +647,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { public boolean canInsertItem(int slotIndex, ItemStack itemStack, int ordinalSide) { return isValidSlot(slotIndex) && itemStack != null && slotIndex < mInventory.length - && (mInventory[slotIndex] == null || GT_Utility.areStacksEqual(itemStack, mInventory[slotIndex])) + && (mInventory[slotIndex] == null || GTUtility.areStacksEqual(itemStack, mInventory[slotIndex])) && allowPutStack(getBaseMetaTileEntity(), slotIndex, ForgeDirection.getOrientation(ordinalSide), itemStack); } @@ -796,12 +796,12 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public void doExplosion(long aExplosionPower) { - float tStrength = GT_Values.getExplosionPowerForVoltage(aExplosionPower); + float tStrength = GTValues.getExplosionPowerForVoltage(aExplosionPower); int tX = getBaseMetaTileEntity().getXCoord(), tY = getBaseMetaTileEntity().getYCoord(), tZ = getBaseMetaTileEntity().getZCoord(); World tWorld = getBaseMetaTileEntity().getWorld(); tWorld.setBlock(tX, tY, tZ, Blocks.air); - if (GregTech_API.sMachineExplosions) { + if (GregTechAPI.sMachineExplosions) { new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder().setStrength(tStrength) .setSmoking(true) .setPosition(tX + 0.5, tY + 0.5, tZ + 0.5) @@ -949,7 +949,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { return (mConnections & sideDirection.flag) != 0; } - public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + public boolean letsIn(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { return false; } @@ -958,7 +958,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { return false; } - public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + public boolean letsOut(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { return false; } @@ -967,12 +967,12 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { return false; } - public boolean letsIn(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + public boolean letsIn(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, ICoverable aTileEntity) { return false; } - public boolean letsOut(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + public boolean letsOut(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, ICoverable aTileEntity) { return false; } @@ -1000,13 +1000,13 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public int getGUIColorization() { Dyes dye = Dyes.dyeWhite; - if (GregTech_API.sColoredGUI) { - if (GregTech_API.sMachineMetalGUI) { + if (GregTechAPI.sColoredGUI) { + if (GregTechAPI.sMachineMetalGUI) { dye = Dyes.MACHINE_METAL; } else if (getBaseMetaTileEntity() != null) { dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization()); } } - return GT_Util.getRGBInt(dye.getRGBA()); + return GTUtil.getRGBInt(dye.getRGBA()); } } diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index d4f8aa6ba4..1008a64507 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -38,27 +38,27 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gnu.trove.list.TIntList; import gnu.trove.list.array.TIntArrayList; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.SoundResource; import gregtech.api.enums.SteamVariant; -import gregtech.api.gui.GT_GUIColorOverride; +import gregtech.api.gui.GUIColorOverride; import gregtech.api.gui.modularui.GUITextureSet; import gregtech.api.interfaces.ICleanroom; import gregtech.api.interfaces.ICleanroomReceiver; import gregtech.api.interfaces.IConfigurationCircuitSupport; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; +import gregtech.api.metatileentity.implementations.MTECable; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; import gregtech.api.util.GT_TooltipDataCache; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; -import gregtech.common.GT_Client; +import gregtech.common.GTClient; import gregtech.common.covers.CoverInfo; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -90,7 +90,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei */ public final ItemStackHandler inventoryHandler; - protected GT_GUIColorOverride colorOverride; + protected GUIColorOverride colorOverride; protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache(); @Override @@ -128,18 +128,18 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei * @param aID the machine ID */ public MetaTileEntity(int aID, String aBasicName, String aRegionalName, int aInvSlotCount) { - if (GregTech_API.sPostloadStarted || !GregTech_API.sPreloadStarted) + if (GregTechAPI.sPostloadStarted || !GregTechAPI.sPreloadStarted) throw new IllegalAccessError("This Constructor has to be called in the load Phase"); - if (GregTech_API.METATILEENTITIES[aID] == null) { - GregTech_API.METATILEENTITIES[aID] = this; + if (GregTechAPI.METATILEENTITIES[aID] == null) { + GregTechAPI.METATILEENTITIES[aID] = this; } else { throw new IllegalArgumentException("MetaMachine-Slot Nr. " + aID + " is already occupied!"); } mName = aBasicName.replace(" ", "_") .toLowerCase(Locale.ENGLISH); - setBaseMetaTileEntity(GregTech_API.constructBaseMetaTileEntity()); + setBaseMetaTileEntity(GregTechAPI.constructBaseMetaTileEntity()); getBaseMetaTileEntity().setMetaTileID((short) aID); - GT_LanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName); + GTLanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName); mInventory = new ItemStack[aInvSlotCount]; inventoryHandler = new ItemStackHandler(mInventory); } @@ -151,7 +151,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei mInventory = new ItemStack[aInvSlotCount]; mName = aName; inventoryHandler = new ItemStackHandler(mInventory); - colorOverride = GT_GUIColorOverride.get(getGUITextureSet().getMainBackground().location); + colorOverride = GUIColorOverride.get(getGUITextureSet().getMainBackground().location); } @Override @@ -179,12 +179,12 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei @Override public ItemStack getStackForm(long aAmount) { - return new ItemStack(GregTech_API.sBlockMachines, (int) aAmount, getBaseMetaTileEntity().getMetaTileID()); + return new ItemStack(GregTechAPI.sBlockMachines, (int) aAmount, getBaseMetaTileEntity().getMetaTileID()); } @Override public String getLocalName() { - return GT_LanguageManager.getTranslation("gt.blockmachines." + mName + ".name"); + return GTLanguageManager.getTranslation("gt.blockmachines." + mName + ".name"); } @Override @@ -219,7 +219,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei } @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) { + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aStack) { return true; } @@ -254,8 +254,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei if (!aPlayer.isSneaking()) return false; final ForgeDirection oppositeSide = wrenchingSide.getOpposite(); final TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityAtSide(wrenchingSide); - if ((tTileEntity instanceof IGregTechTileEntity gtTE) - && (gtTE.getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable)) { + if ((tTileEntity instanceof IGregTechTileEntity gtTE) && (gtTE.getMetaTileEntity() instanceof MTECable)) { // The tile entity we're facing is a cable, let's try to connect to it return gtTE.getMetaTileEntity() @@ -276,8 +275,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei if (!aPlayer.isSneaking()) return false; final ForgeDirection oppositeSide = wrenchingSide.getOpposite(); TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityAtSide(wrenchingSide); - if ((tTileEntity instanceof IGregTechTileEntity gtTE) - && (gtTE.getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable)) { + if ((tTileEntity instanceof IGregTechTileEntity gtTE) && (gtTE.getMetaTileEntity() instanceof MTECable)) { // The tile entity we're facing is a cable, let's try to connect to it return gtTE.getMetaTileEntity() @@ -311,7 +309,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei @Override public void onExplosion() { - GT_Log.exp.println( + GTLog.exp.println( "Machine at " + this.getBaseMetaTileEntity() .getXCoord() + " | " @@ -338,7 +336,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei @Override public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) { + if (aBaseMetaTileEntity.isClientSide() && GTClient.changeDetected == 4) { /* * Client tick counter that is set to 5 on hiding pipes and covers. It triggers a texture update next client * tick when reaching 4, with provision for 3 more update tasks, spreading client change detection related @@ -633,14 +631,14 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei * Determines the Tier of the Machine, used for de-charging Tools. */ public long getInputTier() { - return GT_Utility.getTier(getBaseMetaTileEntity().getInputVoltage()); + return GTUtility.getTier(getBaseMetaTileEntity().getInputVoltage()); } /** * Determines the Tier of the Machine, used for charging Tools. */ public long getOutputTier() { - return GT_Utility.getTier(getBaseMetaTileEntity().getOutputVoltage()); + return GTUtility.getTier(getBaseMetaTileEntity().getOutputVoltage()); } /** @@ -888,7 +886,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei markDirty(); if (this instanceof IConfigurationCircuitSupport ccs) { if (ccs.allowSelectCircuit() && aIndex == ccs.getCircuitSlot() && aStack != null) { - mInventory[aIndex] = GT_Utility.copyAmount(0, aStack); + mInventory[aIndex] = GTUtility.copyAmount(0, aStack); return; } } @@ -897,8 +895,8 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei @Override public String getInventoryName() { - if (GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()] != null) - return GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()].getMetaName(); + if (GregTechAPI.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()] != null) + return GregTechAPI.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()].getMetaName(); return ""; } @@ -914,7 +912,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei @Override public ItemStack decrStackSize(int aIndex, int aAmount) { - ItemStack tStack = getStackInSlot(aIndex), rStack = GT_Utility.copyOrNull(tStack); + ItemStack tStack = getStackInSlot(aIndex), rStack = GTUtility.copyOrNull(tStack); if (tStack != null) { if (tStack.stackSize <= aAmount) { if (setStackToZeroInsteadOfNull(aIndex)) { @@ -949,7 +947,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) { return isValidSlot(aIndex) && aStack != null && aIndex < mInventory.length - && (mInventory[aIndex] == null || GT_Utility.areStacksEqual(aStack, mInventory[aIndex])) + && (mInventory[aIndex] == null || GTUtility.areStacksEqual(aStack, mInventory[aIndex])) && allowPutStack(getBaseMetaTileEntity(), aIndex, ForgeDirection.getOrientation(ordinalSide), aStack); } @@ -986,7 +984,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei @Override public int fill(ForgeDirection side, FluidStack aFluid, boolean doFill) { - if (getBaseMetaTileEntity().hasSteamEngineUpgrade() && GT_ModHandler.isSteam(aFluid) && aFluid.amount > 1) { + if (getBaseMetaTileEntity().hasSteamEngineUpgrade() && GTModHandler.isSteam(aFluid) && aFluid.amount > 1) { int tSteam = (int) Math.min( Integer.MAX_VALUE, Math.min( @@ -1114,15 +1112,14 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei @Override public void doExplosion(long aExplosionPower) { - float tStrength = GT_Values.getExplosionPowerForVoltage(aExplosionPower); + float tStrength = GTValues.getExplosionPowerForVoltage(aExplosionPower); final int tX = getBaseMetaTileEntity().getXCoord(); final int tY = getBaseMetaTileEntity().getYCoord(); final int tZ = getBaseMetaTileEntity().getZCoord(); final World tWorld = getBaseMetaTileEntity().getWorld(); - GT_Utility.sendSoundToPlayers(tWorld, SoundResource.IC2_MACHINES_MACHINE_OVERLOAD, 1.0F, -1, tX, tY, tZ); + GTUtility.sendSoundToPlayers(tWorld, SoundResource.IC2_MACHINES_MACHINE_OVERLOAD, 1.0F, -1, tX, tY, tZ); tWorld.setBlock(tX, tY, tZ, Blocks.air); - if (GregTech_API.sMachineExplosions) - tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true); + if (GregTechAPI.sMachineExplosions) tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true); } @Override @@ -1266,16 +1263,16 @@ public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomRecei if (this.colorOverride.sLoaded()) { if (this.colorOverride.sGuiTintingEnabled() && getBaseMetaTileEntity() != null) { dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization()); - return this.colorOverride.getGuiTintOrDefault(dye.mName, GT_Util.getRGBInt(dye.getRGBA())); + return this.colorOverride.getGuiTintOrDefault(dye.mName, GTUtil.getRGBInt(dye.getRGBA())); } - } else if (GregTech_API.sColoredGUI) { - if (GregTech_API.sMachineMetalGUI) { + } else if (GregTechAPI.sColoredGUI) { + if (GregTechAPI.sMachineMetalGUI) { dye = Dyes.MACHINE_METAL; } else if (getBaseMetaTileEntity() != null) { dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization()); } } - return GT_Util.getRGBInt(dye.getRGBA()); + return GTUtil.getRGBInt(dye.getRGBA()); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java b/src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java index 6fecb840b4..a793dbbe34 100644 --- a/src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java +++ b/src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java @@ -9,21 +9,21 @@ import gregtech.api.interfaces.metatileentity.IConnectable; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.metatileentity.IMetaTileEntityCable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.api.util.GT_Utility; +import gregtech.api.metatileentity.implementations.MTECable; +import gregtech.api.util.GTUtility; import ic2.api.energy.tile.IEnergySink; public class TileIC2EnergySink extends TileEntity implements IEnergySink { private final IGregTechTileEntity myMeta; - private GT_MetaPipeEntity_Cable cableMeta = null; + private MTECable cableMeta = null; public TileIC2EnergySink(IGregTechTileEntity meta) { if (meta == null) throw new NullPointerException("no null metas"); myMeta = meta; final IMetaTileEntity metaTile = myMeta.getMetaTileEntity(); if (metaTile instanceof IMetaTileEntityCable) { - cableMeta = (GT_MetaPipeEntity_Cable) metaTile; + cableMeta = (MTECable) metaTile; } setWorldObj(meta.getWorld()); xCoord = meta.getXCoord(); @@ -62,7 +62,7 @@ public class TileIC2EnergySink extends TileEntity implements IEnergySink { */ @Override public int getSinkTier() { - return GT_Utility.getTier(cableMeta != null ? cableMeta.mVoltage : myMeta.getInputVoltage()); + return GTUtility.getTier(cableMeta != null ? cableMeta.mVoltage : myMeta.getInputVoltage()); } /** diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java deleted file mode 100644 index e44860963f..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java +++ /dev/null @@ -1,649 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Mods.GalacticraftCore; -import static net.minecraftforge.common.util.ForgeDirection.DOWN; -import static net.minecraftforge.common.util.ForgeDirection.EAST; -import static net.minecraftforge.common.util.ForgeDirection.NORTH; -import static net.minecraftforge.common.util.ForgeDirection.SOUTH; -import static net.minecraftforge.common.util.ForgeDirection.UP; -import static net.minecraftforge.common.util.ForgeDirection.WEST; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import cofh.api.energy.IEnergyReceiver; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Materials; -import gregtech.api.enums.TextureSet; -import gregtech.api.enums.Textures; -import gregtech.api.graphs.Node; -import gregtech.api.graphs.NodeList; -import gregtech.api.graphs.PowerNode; -import gregtech.api.graphs.PowerNodes; -import gregtech.api.graphs.consumers.ConsumerNode; -import gregtech.api.graphs.paths.PowerNodePath; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IConnectable; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.metatileentity.IMetaTileEntityCable; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IEnergyConnected; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.interfaces.PowerLogicHost; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.MetaPipeEntity; -import gregtech.api.objects.GT_Cover_None; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_GC_Compat; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.GT_Client; -import gregtech.common.covers.CoverInfo; -import gregtech.common.covers.GT_Cover_SolarPanel; -import ic2.api.energy.EnergyNet; -import ic2.api.energy.tile.IEnergyEmitter; -import ic2.api.energy.tile.IEnergySink; -import ic2.api.energy.tile.IEnergySource; -import ic2.api.energy.tile.IEnergyTile; -import ic2.api.reactor.IReactorChamber; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTileEntityCable { - - public final float mThickNess; - public final Materials mMaterial; - public final long mCableLossPerMeter, mAmperage, mVoltage; - public final boolean mInsulated, mCanShock; - - public int mTransferredAmperage = 0; - - public GT_MetaPipeEntity_Cable(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, - long aCableLossPerMeter, long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) { - super(aID, aName, aNameRegional, 0); - mThickNess = aThickNess; - mMaterial = aMaterial; - mAmperage = aAmperage; - mVoltage = aVoltage; - mInsulated = aInsulated; - mCanShock = aCanShock; - mCableLossPerMeter = aCableLossPerMeter; - } - - public GT_MetaPipeEntity_Cable(String aName, float aThickNess, Materials aMaterial, long aCableLossPerMeter, - long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) { - super(aName, 0); - mThickNess = aThickNess; - mMaterial = aMaterial; - mAmperage = aAmperage; - mVoltage = aVoltage; - mInsulated = aInsulated; - mCanShock = aCanShock; - mCableLossPerMeter = aCableLossPerMeter; - } - - @Override - public byte getTileEntityBaseType() { - return (byte) (mInsulated ? 9 : 8); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaPipeEntity_Cable( - mName, - mThickNess, - mMaterial, - mCableLossPerMeter, - mAmperage, - mVoltage, - mInsulated, - mCanShock); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - int facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (!mInsulated) return new ITexture[] { TextureFactory - .of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], Dyes.getModulation(colorIndex, mMaterial.mRGBa)) }; - if (active) { - float tThickNess = getThickNess(); - if (tThickNess < 0.124F) return new ITexture[] { TextureFactory - .of(Textures.BlockIcons.INSULATION_FULL, Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - if (tThickNess < 0.374F) // 0.375 x1 - return new ITexture[] { - TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), - TextureFactory.of( - Textures.BlockIcons.INSULATION_TINY, - Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - if (tThickNess < 0.499F) // 0.500 x2 - return new ITexture[] { - TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), - TextureFactory.of( - Textures.BlockIcons.INSULATION_SMALL, - Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - if (tThickNess < 0.624F) // 0.625 x4 - return new ITexture[] { - TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), - TextureFactory.of( - Textures.BlockIcons.INSULATION_MEDIUM, - Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - if (tThickNess < 0.749F) // 0.750 x8 - return new ITexture[] { - TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), - TextureFactory.of( - Textures.BlockIcons.INSULATION_MEDIUM_PLUS, - Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - if (tThickNess < 0.874F) // 0.825 x12 - return new ITexture[] { - TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), - TextureFactory.of( - Textures.BlockIcons.INSULATION_LARGE, - Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - return new ITexture[] { - TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), - TextureFactory.of( - Textures.BlockIcons.INSULATION_HUGE, - Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - } - return new ITexture[] { TextureFactory - .of(Textures.BlockIcons.INSULATION_FULL, Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; - } - - @Override - public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity aEntity) { - - if (!mCanShock) return; - - final BaseMetaPipeEntity baseEntity = (BaseMetaPipeEntity) getBaseMetaTileEntity(); - - if (!(aEntity instanceof EntityLivingBase livingEntity)) return; - if (!(baseEntity.getNodePath() instanceof PowerNodePath powerPath)) return; - - if (isCoverOnSide(baseEntity, livingEntity)) return; - if ((baseEntity.mConnections & IConnectable.HAS_HARDENEDFOAM) == 1) return; - - final long amperage = powerPath.getAmperage(); - final long voltage = powerPath.getVoltage(); - - if (amperage == 0L) return; - - GT_Utility.applyElectricityDamage(livingEntity, voltage, amperage); - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return false; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public final boolean renderInside(ForgeDirection side) { - return false; - } - - @Override - public int getProgresstime() { - return (int) mTransferredAmperage * 64; - } - - @Override - public int maxProgresstime() { - return (int) mAmperage * 64; - } - - @Override - public long injectEnergyUnits(ForgeDirection side, long voltage, long amperage) { - if (!isConnectedAtSide(side) && side != ForgeDirection.UNKNOWN) return 0; - if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) - .letsEnergyIn()) return 0; - return transferElectricity(side, voltage, amperage, (HashSet) null); - } - - @Override - @Deprecated - public long transferElectricity(ForgeDirection side, long aVoltage, long aAmperage, - ArrayList aAlreadyPassedTileEntityList) { - return transferElectricity(side, aVoltage, aAmperage, new HashSet<>(aAlreadyPassedTileEntityList)); - } - - @Override - public long transferElectricity(ForgeDirection side, long voltage, long amperage, - HashSet alreadyPassedSet) { - if (!getBaseMetaTileEntity().isServerSide() || !isConnectedAtSide(side) && side != ForgeDirection.UNKNOWN) - return 0; - final BaseMetaPipeEntity tBase = (BaseMetaPipeEntity) getBaseMetaTileEntity(); - if (!(tBase.getNode() instanceof PowerNode tNode)) return 0; - int tPlace = 0; - final Node[] tToPower = new Node[tNode.mConsumers.size()]; - if (tNode.mHadVoltage) { - for (ConsumerNode consumer : tNode.mConsumers) { - if (consumer.needsEnergy()) tToPower[tPlace++] = consumer; - } - } else { - tNode.mHadVoltage = true; - for (ConsumerNode consumer : tNode.mConsumers) { - tToPower[tPlace++] = consumer; - } - } - return PowerNodes.powerNode(tNode, null, new NodeList(tToPower), (int) voltage, (int) amperage); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aTick % 20 == 0 && aBaseMetaTileEntity.isServerSide() - && (!GT_Mod.gregtechproxy.gt6Cable || mCheckConnections)) { - checkConnections(); - } - } - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - if (GT_Mod.gregtechproxy.gt6Cable - && GT_ModHandler.damageOrDechargeItem(aPlayer.inventory.getCurrentItem(), 1, 500, aPlayer)) { - if (isConnectedAtSide(wrenchingSide)) { - disconnect(wrenchingSide); - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("215", "Disconnected")); - } else if (!GT_Mod.gregtechproxy.costlyCableConnection) { - if (connect(wrenchingSide) > 0) - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("214", "Connected")); - } - return true; - } - return false; - } - - @Override - public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - if (GT_Mod.gregtechproxy.gt6Cable - && GT_ModHandler.damageOrDechargeItem(aPlayer.inventory.getCurrentItem(), 1, 500, aPlayer)) { - if (isConnectedAtSide(wrenchingSide)) { - disconnect(wrenchingSide); - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("215", "Disconnected")); - } else if (!GT_Mod.gregtechproxy.costlyCableConnection || GT_ModHandler.consumeSolderingMaterial(aPlayer)) { - if (connect(wrenchingSide) > 0) - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("214", "Connected")); - } - return true; - } - return false; - } - - @Override - public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return coverBehavior.letsEnergyIn(side, aCoverID, aCoverVariable, aTileEntity); - } - - @Override - public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return coverBehavior.letsEnergyOut(side, aCoverID, aCoverVariable, aTileEntity); - } - - @Override - public boolean letsIn(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return coverBehavior.letsEnergyIn(side, aCoverID, aCoverVariable, aTileEntity); - } - - @Override - public boolean letsOut(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return coverBehavior.letsEnergyOut(side, aCoverID, aCoverVariable, aTileEntity); - } - - @Override - public boolean letsIn(CoverInfo coverInfo) { - return coverInfo.letsEnergyIn(); - } - - @Override - public boolean letsOut(CoverInfo coverInfo) { - return coverInfo.letsEnergyOut(); - } - - @Override - public boolean canConnect(ForgeDirection side, TileEntity tileEntity) { - final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity(); - final GT_CoverBehaviorBase coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(side); - final ForgeDirection oppositeSide = side.getOpposite(); - - // GT Machine handling - if ((tileEntity instanceof PowerLogicHost powerLogic && powerLogic.getPowerLogic(oppositeSide) != null) - || ((tileEntity instanceof IEnergyConnected energyConnected) - && (energyConnected.inputEnergyFrom(oppositeSide, false) - || energyConnected.outputsEnergyTo(oppositeSide, false)))) - return true; - - // Solar Panel Compat - if (coverBehavior instanceof GT_Cover_SolarPanel) return true; - - // ((tIsGregTechTileEntity && tIsTileEntityCable) && (tAlwaysLookConnected || tLetEnergyIn || tLetEnergyOut) ) - // --> Not needed - if (GalacticraftCore.isModLoaded() && GT_GC_Compat.canConnect(tileEntity, oppositeSide)) return true; - - // AE2-p2p Compat - if (tileEntity instanceof appeng.tile.powersink.IC2 ic2sink - && ic2sink.acceptsEnergyFrom((TileEntity) baseMetaTile, oppositeSide)) return true; - - // IC2 Compat - { - final TileEntity ic2Energy; - - if (tileEntity instanceof IReactorChamber) - ic2Energy = (TileEntity) ((IReactorChamber) tileEntity).getReactor(); - else ic2Energy = (tileEntity == null || tileEntity instanceof IEnergyTile || EnergyNet.instance == null) - ? tileEntity - : EnergyNet.instance - .getTileEntity(tileEntity.getWorldObj(), tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); - - // IC2 Sink Compat - if ((ic2Energy instanceof IEnergySink) - && ((IEnergySink) ic2Energy).acceptsEnergyFrom((TileEntity) baseMetaTile, oppositeSide)) return true; - - // IC2 Source Compat - if (GT_Mod.gregtechproxy.ic2EnergySourceCompat && (ic2Energy instanceof IEnergySource)) { - if (((IEnergySource) ic2Energy).emitsEnergyTo((TileEntity) baseMetaTile, oppositeSide)) { - return true; - } - } - } - // RF Output Compat - if (GregTech_API.mOutputRF && tileEntity instanceof IEnergyReceiver - && ((IEnergyReceiver) tileEntity).canConnectEnergy(oppositeSide)) return true; - - // RF Input Compat - return GregTech_API.mInputRF && (tileEntity instanceof IEnergyEmitter - && ((IEnergyEmitter) tileEntity).emitsEnergyTo((TileEntity) baseMetaTile, oppositeSide)); - } - - @Override - public boolean getGT6StyleConnection() { - // Yes if GT6 Cables are enabled - return GT_Mod.gregtechproxy.gt6Cable; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public String[] getDescription() { - return new String[] { - StatCollector.translateToLocal("GT5U.item.cable.max_voltage") + ": %%%" - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mVoltage) - + " (" - + GT_Utility.getColoredTierNameFromVoltage(mVoltage) - + EnumChatFormatting.GREEN - + ")" - + EnumChatFormatting.GRAY, - StatCollector.translateToLocal("GT5U.item.cable.max_amperage") + ": %%%" - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mAmperage) - + EnumChatFormatting.GRAY, - StatCollector.translateToLocal("GT5U.item.cable.loss") + ": %%%" - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(mCableLossPerMeter) - + EnumChatFormatting.GRAY - + "%%% " - + StatCollector.translateToLocal("GT5U.item.cable.eu_volt") }; - } - - @Override - public float getThickNess() { - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) return 0.0625F; - return mThickNess; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - if (GT_Mod.gregtechproxy.gt6Cable) aNBT.setByte("mConnections", mConnections); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - if (GT_Mod.gregtechproxy.gt6Cable) { - mConnections = aNBT.getByte("mConnections"); - } - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - final BaseMetaPipeEntity base = (BaseMetaPipeEntity) getBaseMetaTileEntity(); - final PowerNodePath path = (PowerNodePath) base.getNodePath(); - - if (path == null) - return new String[] { EnumChatFormatting.RED + "Failed to get Power Node info" + EnumChatFormatting.RESET }; - - final long currAmp = path.getAmperage(); - final long currVoltage = path.getVoltage(); - - final double avgAmp = path.getAvgAmperage(); - final double avgVoltage = path.getAvgVoltage(); - - final long maxVoltageOut = (mVoltage - mCableLossPerMeter) * mAmperage; - - return new String[] { - "Amperage: " + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(currAmp) - + EnumChatFormatting.RESET - + " / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mAmperage) - + EnumChatFormatting.RESET - + " A", - "Voltage Out: " + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(currVoltage) - + EnumChatFormatting.RESET - + " / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxVoltageOut) - + EnumChatFormatting.RESET - + " EU/t", - "Avg Amperage (20t): " + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(avgAmp) - + EnumChatFormatting.RESET - + " A", - "Avg Output (20t): " + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(avgVoltage) - + EnumChatFormatting.RESET - + " EU/t" }; - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) - return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); - else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - - private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - float tSpace = (1f - mThickNess) / 2; - float spaceDown = tSpace; - float spaceUp = 1f - tSpace; - float spaceNorth = tSpace; - float spaceSouth = 1f - tSpace; - float spaceWest = tSpace; - float spaceEast = 1f - tSpace; - - if (getBaseMetaTileEntity().getCoverIDAtSide(DOWN) != 0) { - spaceDown = spaceNorth = spaceWest = 0; - spaceSouth = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(UP) != 0) { - spaceNorth = spaceWest = 0; - spaceUp = spaceSouth = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(NORTH) != 0) { - spaceDown = spaceNorth = spaceWest = 0; - spaceUp = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(SOUTH) != 0) { - spaceDown = spaceWest = 0; - spaceUp = spaceSouth = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(WEST) != 0) { - spaceDown = spaceNorth = spaceWest = 0; - spaceUp = spaceSouth = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(EAST) != 0) { - spaceDown = spaceNorth = 0; - spaceUp = spaceSouth = spaceEast = 1; - } - - byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; - if ((tConn & DOWN.flag) != 0) spaceDown = 0f; - if ((tConn & UP.flag) != 0) spaceUp = 1f; - if ((tConn & NORTH.flag) != 0) spaceNorth = 0f; - if ((tConn & SOUTH.flag) != 0) spaceSouth = 1f; - if ((tConn & WEST.flag) != 0) spaceWest = 0f; - if ((tConn & EAST.flag) != 0) spaceEast = 1f; - - return AxisAlignedBB.getBoundingBox( - aX + spaceWest, - aY + spaceDown, - aZ + spaceNorth, - aX + spaceEast, - aY + spaceUp, - aZ + spaceSouth); - } - - @Override - public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, - List outputAABB, Entity collider) { - super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) { - final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); - } - } - - @Override - public boolean shouldJoinIc2Enet() { - if (!GT_Mod.gregtechproxy.ic2EnergySourceCompat) return false; - - if (mConnections != 0) { - final IGregTechTileEntity baseMeta = getBaseMetaTileEntity(); - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (isConnectedAtSide(side)) { - final TileEntity tTileEntity = baseMeta.getTileEntityAtSide(side); - final TileEntity tEmitter = (tTileEntity == null || tTileEntity instanceof IEnergyTile - || EnergyNet.instance == null) - ? tTileEntity - : EnergyNet.instance.getTileEntity( - tTileEntity.getWorldObj(), - tTileEntity.xCoord, - tTileEntity.yCoord, - tTileEntity.zCoord); - - if (tEmitter instanceof IEnergyEmitter) return true; - } - } - } - return false; - } - - @Override - public void reloadLocks() { - final BaseMetaPipeEntity pipe = (BaseMetaPipeEntity) getBaseMetaTileEntity(); - if (pipe.getNode() != null) { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (isConnectedAtSide(side)) { - final CoverInfo coverInfo = pipe.getCoverInfoAtSide(side); - if (coverInfo.getCoverBehavior() instanceof GT_Cover_None) continue; - if (!letsIn(coverInfo) || !letsOut(coverInfo)) { - pipe.addToLock(pipe, side); - } else { - pipe.removeFromLock(pipe, side); - } - } - } - } else { - boolean dontAllow = false; - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (isConnectedAtSide(side)) { - final CoverInfo coverInfo = pipe.getCoverInfoAtSide(side); - if (coverInfo.getCoverBehavior() instanceof GT_Cover_None) continue; - - if (!letsIn(coverInfo) || !letsOut(coverInfo)) { - dontAllow = true; - } - } - } - if (dontAllow) { - pipe.addToLock(pipe, DOWN); - } else { - pipe.removeFromLock(pipe, DOWN); - } - } - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - - currenttip.add( - StatCollector.translateToLocal("GT5U.item.cable.max_voltage") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mVoltage) - + " (" - + GT_Utility.getColoredTierNameFromVoltage(mVoltage) - + EnumChatFormatting.GREEN - + ")"); - currenttip.add( - StatCollector.translateToLocal("GT5U.item.cable.max_amperage") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mAmperage)); - currenttip.add( - StatCollector.translateToLocal("GT5U.item.cable.loss") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(mCableLossPerMeter) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.item.cable.eu_volt")); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java deleted file mode 100644 index cafd1c9cb7..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java +++ /dev/null @@ -1,979 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; -import static gregtech.api.enums.GT_Values.D1; -import static gregtech.api.enums.Mods.TinkerConstruct; -import static gregtech.api.enums.Mods.Translocator; -import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.BOTTOM; -import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.LEFT; -import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.RIGHT; -import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.TOP; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; -import static net.minecraftforge.common.util.ForgeDirection.DOWN; -import static net.minecraftforge.common.util.ForgeDirection.EAST; -import static net.minecraftforge.common.util.ForgeDirection.NORTH; -import static net.minecraftforge.common.util.ForgeDirection.SOUTH; -import static net.minecraftforge.common.util.ForgeDirection.UP; -import static net.minecraftforge.common.util.ForgeDirection.WEST; - -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidHandler; - -import org.apache.commons.lang3.tuple.MutableTriple; - -import cpw.mods.fml.common.Optional; -import gregtech.GT_Mod; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Materials; -import gregtech.api.enums.Mods; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.ToolModes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.MetaPipeEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; -import gregtech.common.GT_Client; -import gregtech.common.config.other.ConfigGeneral; -import gregtech.common.covers.CoverInfo; -import gregtech.common.covers.GT_Cover_Drain; -import gregtech.common.covers.GT_Cover_FluidRegulator; - -public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { - - protected static final EnumMap> FACE_BORDER_MAP = new EnumMap<>( - ForgeDirection.class); - - static { - FACE_BORDER_MAP.put(DOWN, borderMap(NORTH, SOUTH, EAST, WEST)); - FACE_BORDER_MAP.put(UP, borderMap(NORTH, SOUTH, WEST, EAST)); - FACE_BORDER_MAP.put(NORTH, borderMap(UP, DOWN, EAST, WEST)); - FACE_BORDER_MAP.put(SOUTH, borderMap(UP, DOWN, WEST, EAST)); - FACE_BORDER_MAP.put(WEST, borderMap(UP, DOWN, NORTH, SOUTH)); - FACE_BORDER_MAP.put(EAST, borderMap(UP, DOWN, SOUTH, NORTH)); - } - - protected static final Map RESTR_TEXTURE_MAP = new HashMap<>(); - - static { - RESTR_TEXTURE_MAP.put(TOP.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UP); - RESTR_TEXTURE_MAP.put(BOTTOM.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DOWN); - RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UD); - RESTR_TEXTURE_MAP.put(LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_LEFT); - RESTR_TEXTURE_MAP.put(TOP.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UL); - RESTR_TEXTURE_MAP.put(BOTTOM.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DL); - RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NR); - RESTR_TEXTURE_MAP.put(RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_RIGHT); - RESTR_TEXTURE_MAP.put(TOP.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UR); - RESTR_TEXTURE_MAP.put(BOTTOM.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DR); - RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NL); - RESTR_TEXTURE_MAP.put(LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_LR); - RESTR_TEXTURE_MAP.put(TOP.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_ND); - RESTR_TEXTURE_MAP.put(BOTTOM.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NU); - RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR); - } - - public final float mThickNess; - public final Materials mMaterial; - public final int mCapacity, mHeatResistance, mPipeAmount; - public final boolean mGasProof; - public final FluidStack[] mFluids; - public byte mLastReceivedFrom = 0, oLastReceivedFrom = 0; - /** - * Bitmask for whether disable fluid input form each side. - */ - public byte mDisableInput = 0; - - public GT_MetaPipeEntity_Fluid(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, - int aCapacity, int aHeatResistance, boolean aGasProof) { - this(aID, aName, aNameRegional, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1); - } - - public GT_MetaPipeEntity_Fluid(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, - int aCapacity, int aHeatResistance, boolean aGasProof, int aFluidTypes) { - super(aID, aName, aNameRegional, 0, false); - mThickNess = aThickNess; - mMaterial = aMaterial; - mCapacity = aCapacity; - mGasProof = aGasProof; - mHeatResistance = aHeatResistance; - mPipeAmount = aFluidTypes; - mFluids = new FluidStack[mPipeAmount]; - addInfo(aID); - } - - public GT_MetaPipeEntity_Fluid(String aName, float aThickNess, Materials aMaterial, int aCapacity, - int aHeatResistance, boolean aGasProof, int aFluidTypes) { - super(aName, 0); - mThickNess = aThickNess; - mMaterial = aMaterial; - mCapacity = aCapacity; - mGasProof = aGasProof; - mHeatResistance = aHeatResistance; - mPipeAmount = aFluidTypes; - mFluids = new FluidStack[mPipeAmount]; - } - - @Override - public byte getTileEntityBaseType() { - return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality))); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaPipeEntity_Fluid( - mName, - mThickNess, - mMaterial, - mCapacity, - mHeatResistance, - mGasProof, - mPipeAmount); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections, - int colorIndex, boolean aConnected, boolean redstoneLevel) { - if (side == ForgeDirection.UNKNOWN) return Textures.BlockIcons.ERROR_RENDERING; - final float tThickNess = getThickNess(); - if (mDisableInput == 0) - return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, colorIndex) - : TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], - Dyes.getModulation(colorIndex, mMaterial.mRGBa)) }; - int borderMask = 0; - for (Border border : Border.values()) { - if (isInputDisabledAtSide(getSideAtBorder(side, border))) borderMask |= border.mask; - } - - return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, colorIndex) - : TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], - Dyes.getModulation(colorIndex, mMaterial.mRGBa)), - getRestrictorTexture(borderMask) }; - } - - protected static ITexture getBaseTexture(float aThickNess, int aPipeAmount, Materials aMaterial, int colorIndex) { - if (aPipeAmount >= 9) return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipeNonuple.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - if (aPipeAmount >= 4) return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipeQuadruple.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - if (aThickNess < 0.124F) return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - if (aThickNess < 0.374F) return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - if (aThickNess < 0.499F) return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - if (aThickNess < 0.749F) return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - if (aThickNess < 0.874F) return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - return TextureFactory.of( - aMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex], - Dyes.getModulation(colorIndex, aMaterial.mRGBa)); - } - - protected static ITexture getRestrictorTexture(int borderMask) { - final IIconContainer restrictorIcon = RESTR_TEXTURE_MAP.get(borderMask); - return restrictorIcon != null ? TextureFactory.of(restrictorIcon) : null; - } - - @Override - public void onValueUpdate(byte aValue) { - mDisableInput = aValue; - } - - @Override - public byte getUpdateData() { - return mDisableInput; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return false; - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public final boolean renderInside(ForgeDirection side) { - return false; - } - - @Override - public int getProgresstime() { - return getFluidAmount(); - } - - @Override - public int maxProgresstime() { - return getCapacity(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - for (int i = 0; i < mPipeAmount; i++) if (mFluids[i] != null) - aNBT.setTag("mFluid" + (i == 0 ? "" : i), mFluids[i].writeToNBT(new NBTTagCompound())); - aNBT.setByte("mLastReceivedFrom", mLastReceivedFrom); - if (GT_Mod.gregtechproxy.gt6Pipe) { - aNBT.setByte("mConnections", mConnections); - aNBT.setByte("mDisableInput", mDisableInput); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - for (int i = 0; i < mPipeAmount; i++) - mFluids[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid" + (i == 0 ? "" : i))); - mLastReceivedFrom = aNBT.getByte("mLastReceivedFrom"); - if (GT_Mod.gregtechproxy.gt6Pipe) { - mConnections = aNBT.getByte("mConnections"); - mDisableInput = aNBT.getByte("mDisableInput"); - } - } - - @Override - public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity aEntity) { - if ((((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections & -128) == 0 - && aEntity instanceof EntityLivingBase) { - for (FluidStack tFluid : mFluids) { - if (tFluid != null) { - final int tTemperature = tFluid.getFluid() - .getTemperature(tFluid); - if (tTemperature > 320 - && !isCoverOnSide((BaseMetaPipeEntity) getBaseMetaTileEntity(), (EntityLivingBase) aEntity)) { - GT_Utility.applyHeatDamage((EntityLivingBase) aEntity, (tTemperature - 300) / 50.0F); - break; - } else if (tTemperature < 260 - && !isCoverOnSide((BaseMetaPipeEntity) getBaseMetaTileEntity(), (EntityLivingBase) aEntity)) { - GT_Utility.applyFrostDamage((EntityLivingBase) aEntity, (270 - tTemperature) / 25.0F); - break; - } - } - } - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide() && aTick % 5 == 0) { - mLastReceivedFrom &= 63; - if (mLastReceivedFrom == 63) { - mLastReceivedFrom = 0; - } - - if (!GT_Mod.gregtechproxy.gt6Pipe || mCheckConnections) checkConnections(); - - final boolean shouldDistribute = (oLastReceivedFrom == mLastReceivedFrom); - for (int i = 0, j = aBaseMetaTileEntity.getRandomNumber(mPipeAmount); i < mPipeAmount; i++) { - final int index = (i + j) % mPipeAmount; - if (mFluids[index] != null && mFluids[index].amount <= 0) mFluids[index] = null; - if (mFluids[index] == null) continue; - - if (checkEnvironment(index, aBaseMetaTileEntity)) return; - - if (shouldDistribute) { - distributeFluid(index, aBaseMetaTileEntity); - mLastReceivedFrom = 0; - } - } - - oLastReceivedFrom = mLastReceivedFrom; - } - } - - private boolean checkEnvironment(int index, IGregTechTileEntity aBaseMetaTileEntity) { - // Check for hot liquids that melt the pipe or gasses that escape and burn/freeze people - final FluidStack tFluid = mFluids[index]; - - if (tFluid != null && tFluid.amount > 0) { - final int tTemperature = tFluid.getFluid() - .getTemperature(tFluid); - if (tTemperature > mHeatResistance) { - if (aBaseMetaTileEntity.getRandomNumber(100) == 0) { - // Poof - GT_Log.exp.println( - "Set Pipe to Fire due to to low heat resistance at " + aBaseMetaTileEntity.getXCoord() - + " | " - + aBaseMetaTileEntity.getYCoord() - + " | " - + aBaseMetaTileEntity.getZCoord() - + " DIMID: " - + aBaseMetaTileEntity.getWorld().provider.dimensionId); - aBaseMetaTileEntity.setToFire(); - return true; - } - // Mmhmm, Fire - aBaseMetaTileEntity.setOnFire(); - GT_Log.exp.println( - "Set Blocks around Pipe to Fire due to to low heat resistance at " + aBaseMetaTileEntity.getXCoord() - + " | " - + aBaseMetaTileEntity.getYCoord() - + " | " - + aBaseMetaTileEntity.getZCoord() - + " DIMID: " - + aBaseMetaTileEntity.getWorld().provider.dimensionId); - } - if (!mGasProof && tFluid.getFluid() - .isGaseous(tFluid)) { - tFluid.amount -= 5; - sendSound((byte) 9); - if (tTemperature > 320) { - try { - for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld() - .getEntitiesWithinAABB( - EntityLivingBase.class, - AxisAlignedBB.getBoundingBox( - getBaseMetaTileEntity().getXCoord() - 2, - getBaseMetaTileEntity().getYCoord() - 2, - getBaseMetaTileEntity().getZCoord() - 2, - getBaseMetaTileEntity().getXCoord() + 3, - getBaseMetaTileEntity().getYCoord() + 3, - getBaseMetaTileEntity().getZCoord() + 3))) { - GT_Utility.applyHeatDamage(tLiving, (tTemperature - 300) / 25.0F); - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - } else if (tTemperature < 260) { - try { - for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld() - .getEntitiesWithinAABB( - EntityLivingBase.class, - AxisAlignedBB.getBoundingBox( - getBaseMetaTileEntity().getXCoord() - 2, - getBaseMetaTileEntity().getYCoord() - 2, - getBaseMetaTileEntity().getZCoord() - 2, - getBaseMetaTileEntity().getXCoord() + 3, - getBaseMetaTileEntity().getYCoord() + 3, - getBaseMetaTileEntity().getZCoord() + 3))) { - GT_Utility.applyFrostDamage(tLiving, (270 - tTemperature) / 12.5F); - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - } - } - if (tFluid.amount <= 0) mFluids[index] = null; - } - return false; - } - - private void distributeFluid(int index, IGregTechTileEntity aBaseMetaTileEntity) { - final FluidStack tFluid = mFluids[index]; - if (tFluid == null) return; - - // Tank, From, Amount to receive - final List> tTanks = new ArrayList<>(); - final int amount = tFluid.amount; - final byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6); - for (final byte i : ALL_VALID_SIDES) { - // Get a list of tanks accepting fluids, and what side they're on - final ForgeDirection side = ForgeDirection.getOrientation((i + tOffset) % 6); - final ForgeDirection oppositeSide = side.getOpposite(); - final IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(side); - final IGregTechTileEntity gTank = tTank instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTank : null; - - if (isConnectedAtSide(side) && tTank != null - && (mLastReceivedFrom & side.flag) == 0 - && getBaseMetaTileEntity().getCoverInfoAtSide(side) - .letsFluidOut(tFluid.getFluid()) - && (gTank == null || gTank.getCoverInfoAtSide(oppositeSide) - .letsFluidIn(tFluid.getFluid()))) { - if (tTank.fill(oppositeSide, tFluid, false) > 0) { - tTanks.add(new MutableTriple<>(tTank, oppositeSide, 0)); - } - tFluid.amount = amount; // Because some mods do actually modify input fluid stack - } - } - - // How much of this fluid is available for distribution? - final double tAmount = Math.max(1, Math.min(mCapacity * 10, tFluid.amount)); - - final FluidStack maxFluid = tFluid.copy(); - maxFluid.amount = Integer.MAX_VALUE; - - double availableCapacity = 0; - // Calculate available capacity for distribution from all tanks - for (final MutableTriple tEntry : tTanks) { - tEntry.right = tEntry.left.fill(tEntry.middle, maxFluid, false); - availableCapacity += tEntry.right; - } - - // Now distribute - for (final MutableTriple tEntry : tTanks) { - // Distribue fluids based on percentage available space at destination - if (availableCapacity > tAmount) - tEntry.right = (int) Math.floor(tEntry.right * tAmount / availableCapacity); - - // If the percent is not enough to give at least 1L, try to give 1L - if (tEntry.right == 0) tEntry.right = (int) Math.min(1, tAmount); - - if (tEntry.right <= 0) continue; - - final int tFilledAmount = tEntry.left - .fill(tEntry.middle, drainFromIndex(tEntry.right, false, index), false); - - if (tFilledAmount > 0) tEntry.left.fill(tEntry.middle, drainFromIndex(tFilledAmount, true, index), true); - - if (mFluids[index] == null || mFluids[index].amount <= 0) return; - } - } - - public void connectPipeOnSide(ForgeDirection side, EntityPlayer entityPlayer) { - if (!isConnectedAtSide(side)) { - if (connect(side) > 0) GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("214", "Connected")); - } else { - disconnect(side); - GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("215", "Disconnected")); - } - } - - public void blockPipeOnSide(ForgeDirection side, EntityPlayer entityPlayer, byte mask) { - if (isInputDisabledAtSide(side)) { - mDisableInput &= ~mask; - GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("212", "Input enabled")); - if (!isConnectedAtSide(side)) connect(side); - } else { - mDisableInput |= mask; - GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("213", "Input disabled")); - } - } - - @Override - public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, - float aX, float aY, float aZ, ItemStack aTool) { - - if (GT_Mod.gregtechproxy.gt6Pipe) { - final int mode = GT_MetaGenerated_Tool.getToolMode(aTool); - IGregTechTileEntity currentPipeBase = getBaseMetaTileEntity(); - GT_MetaPipeEntity_Fluid currentPipe = (GT_MetaPipeEntity_Fluid) currentPipeBase.getMetaTileEntity(); - final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ); - final byte tMask = (byte) (tSide.flag); - - if (mode == ToolModes.REGULAR.get()) { - if (entityPlayer.isSneaking()) { - currentPipe.blockPipeOnSide(tSide, entityPlayer, tMask); - } else currentPipe.connectPipeOnSide(tSide, entityPlayer); - return true; - } - - if (mode == ToolModes.WRENCH_LINE.get()) { - - boolean initialState = entityPlayer.isSneaking() ? currentPipe.isInputDisabledAtSide(tSide) - : currentPipe.isConnectedAtSide(tSide); - - boolean wasActionPerformed = false; - - int limit = ConfigGeneral.pipeWrenchingChainRange; - for (int connected = 0; connected < limit; connected++) { - - TileEntity nextPipeBaseTile = currentPipeBase.getTileEntityAtSide(tSide); - - // if next tile doesn't exist or if next tile is not GT tile - if (!(nextPipeBaseTile instanceof IGregTechTileEntity nextPipeBase)) { - return wasActionPerformed; - } - - // if next tile is wrong color - if (!currentPipe.connectableColor(nextPipeBaseTile)) { - return wasActionPerformed; - } - - GT_MetaPipeEntity_Fluid nextPipe = nextPipeBase - .getMetaTileEntity() instanceof GT_MetaPipeEntity_Fluid - ? (GT_MetaPipeEntity_Fluid) nextPipeBase.getMetaTileEntity() - : null; - - // if next tile entity is not a pipe - if (nextPipe == null) { - return wasActionPerformed; - } - - // if pipes are same size - if (mPipeAmount != nextPipe.mPipeAmount) { - return wasActionPerformed; - } - - // making sure next pipe has same fluid - for (int i = 0; i < mPipeAmount; i++) { - if (mFluids[i] != null && nextPipe.mFluids[i] != null) { - if (!mFluids[i].isFluidEqual(nextPipe.mFluids[i])) { - return wasActionPerformed; - } - } else if (mFluids[i] != nextPipe.mFluids[i]) { - return wasActionPerformed; - } - } - - boolean currentState = entityPlayer.isSneaking() ? currentPipe.isInputDisabledAtSide(tSide) - : currentPipe.isConnectedAtSide(tSide); - - /* - * Making sure next pipe will have same action applied to it - * e.g. Connecting pipe won`t trigger disconnect if next pipe is already connected - */ - if (currentState != initialState) { - return wasActionPerformed; - } - - if (entityPlayer.isSneaking()) { - currentPipe.blockPipeOnSide(tSide, entityPlayer, tMask); - } else currentPipe.connectPipeOnSide(tSide, entityPlayer); - - wasActionPerformed = true; - - currentPipeBase = (IGregTechTileEntity) nextPipeBase; - currentPipe = nextPipe; - - } - return wasActionPerformed; - } - } - return false; - } - - @Override - public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return coverBehavior.letsFluidIn(side, aCoverID, aCoverVariable, null, aTileEntity); - } - - @Override - public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return coverBehavior.letsFluidOut(side, aCoverID, aCoverVariable, null, aTileEntity); - } - - @Override - public boolean letsIn(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return coverBehavior.letsFluidIn(side, aCoverID, aCoverVariable, null, aTileEntity); - } - - @Override - public boolean letsOut(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return coverBehavior.letsFluidOut(side, aCoverID, aCoverVariable, null, aTileEntity); - } - - @Override - public boolean letsIn(CoverInfo coverInfo) { - return coverInfo.letsFluidIn(null); - } - - @Override - public boolean letsOut(CoverInfo coverInfo) { - return coverInfo.letsFluidOut(null); - } - - @Override - public boolean canConnect(ForgeDirection side, TileEntity tileEntity) { - if (tileEntity == null) return false; - - final ForgeDirection tSide = side.getOpposite(); - final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity(); - if (baseMetaTile == null) return false; - - final GT_CoverBehaviorBase coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(side); - final IGregTechTileEntity gTileEntity = (tileEntity instanceof IGregTechTileEntity) - ? (IGregTechTileEntity) tileEntity - : null; - - if (coverBehavior instanceof GT_Cover_Drain - || (TinkerConstruct.isModLoaded() && isTConstructFaucet(tileEntity))) return true; - - final IFluidHandler fTileEntity = (tileEntity instanceof IFluidHandler) ? (IFluidHandler) tileEntity : null; - - if (fTileEntity != null) { - final FluidTankInfo[] tInfo = fTileEntity.getTankInfo(tSide); - if (tInfo != null) { - return tInfo.length > 0 || (Translocator.isModLoaded() && isTranslocator(tileEntity)) - || gTileEntity != null - && gTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof GT_Cover_FluidRegulator; - } - } - return false; - } - - @Optional.Method(modid = Mods.Names.TINKER_CONSTRUCT) - private boolean isTConstructFaucet(TileEntity tTileEntity) { - // Tinker Construct Faucets return a null tank info, so check the class - return tTileEntity instanceof tconstruct.smeltery.logic.FaucetLogic; - } - - @Optional.Method(modid = Mods.Names.TRANSLOCATOR) - private boolean isTranslocator(TileEntity tTileEntity) { - // Translocators return a TankInfo, but it's of 0 length - so check the class if we see this pattern - return tTileEntity instanceof codechicken.translocator.TileLiquidTranslocator; - } - - @Override - public boolean getGT6StyleConnection() { - // Yes if GT6 pipes are enabled - return GT_Mod.gregtechproxy.gt6Pipe; - } - - @Override - public void doSound(byte aIndex, double aX, double aY, double aZ) { - super.doSound(aIndex, aX, aY, aZ); - if (aIndex == 9) { - GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 5, 1.0F, aX, aY, aZ); - - new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) - .setWorld(getBaseMetaTileEntity().getWorld()) - .times( - 6, - (x, i) -> x - .setMotion( - ForgeDirection.getOrientation(i).offsetX / 5.0, - ForgeDirection.getOrientation(i).offsetY / 5.0, - ForgeDirection.getOrientation(i).offsetZ / 5.0) - .setPosition( - aX - 0.5 + XSTR_INSTANCE.nextFloat(), - aY - 0.5 + XSTR_INSTANCE.nextFloat(), - aZ - 0.5 + XSTR_INSTANCE.nextFloat()) - .run()); - } - } - - @Override - public final int getCapacity() { - return mCapacity * 20 * mPipeAmount; - } - - @Override - public FluidTankInfo getInfo() { - for (FluidStack tFluid : mFluids) { - if (tFluid != null) return new FluidTankInfo(tFluid, mCapacity * 20); - } - return new FluidTankInfo(null, mCapacity * 20); - } - - @Override - public FluidTankInfo[] getTankInfo(ForgeDirection side) { - if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {}; - ArrayList tList = new ArrayList<>(); - for (FluidStack tFluid : mFluids) tList.add(new FluidTankInfo(tFluid, mCapacity * 20)); - return tList.toArray(new FluidTankInfo[mPipeAmount]); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public final FluidStack getFluid() { - for (FluidStack tFluid : mFluids) { - if (tFluid != null) return tFluid; - } - return null; - } - - @Override - public final int getFluidAmount() { - int rAmount = 0; - for (FluidStack tFluid : mFluids) { - if (tFluid != null) rAmount += tFluid.amount; - } - return rAmount; - } - - @Override - public final int fill_default(ForgeDirection side, FluidStack aFluid, boolean doFill) { - if (aFluid == null || aFluid.getFluid() - .getID() <= 0) return 0; - - int index = -1; - for (int i = 0; i < mPipeAmount; i++) { - if (mFluids[i] != null && mFluids[i].isFluidEqual(aFluid)) { - index = i; - break; - } else if ((mFluids[i] == null || mFluids[i].getFluid() - .getID() <= 0) && index < 0) { - index = i; - } - } - - return fill_default_intoIndex(side, aFluid, doFill, index); - } - - private int fill_default_intoIndex(ForgeDirection side, FluidStack aFluid, boolean doFill, int index) { - if (index < 0 || index >= mPipeAmount) return 0; - if (aFluid == null || aFluid.getFluid() - .getID() <= 0) return 0; - - final int ordinalSide = side.ordinal(); - - if (mFluids[index] == null || mFluids[index].getFluid() - .getID() <= 0) { - if (aFluid.amount * mPipeAmount <= getCapacity()) { - if (doFill) { - mFluids[index] = aFluid.copy(); - mLastReceivedFrom |= (1 << ordinalSide); - } - return aFluid.amount; - } - if (doFill) { - mFluids[index] = aFluid.copy(); - mLastReceivedFrom |= (1 << ordinalSide); - mFluids[index].amount = getCapacity() / mPipeAmount; - } - return getCapacity() / mPipeAmount; - } - - if (!mFluids[index].isFluidEqual(aFluid)) return 0; - - final int space = getCapacity() / mPipeAmount - mFluids[index].amount; - if (aFluid.amount <= space) { - if (doFill) { - mFluids[index].amount += aFluid.amount; - mLastReceivedFrom |= (1 << ordinalSide); - } - return aFluid.amount; - } - if (doFill) { - mFluids[index].amount = getCapacity() / mPipeAmount; - mLastReceivedFrom |= (1 << ordinalSide); - } - return space; - } - - @Override - public final FluidStack drain(int maxDrain, boolean doDrain) { - FluidStack drained; - for (int i = 0; i < mPipeAmount; i++) { - if ((drained = drainFromIndex(maxDrain, doDrain, i)) != null) return drained; - } - return null; - } - - private FluidStack drainFromIndex(int maxDrain, boolean doDrain, int index) { - if (index < 0 || index >= mPipeAmount) return null; - if (mFluids[index] == null) return null; - if (mFluids[index].amount <= 0) { - mFluids[index] = null; - return null; - } - - int used = maxDrain; - if (mFluids[index].amount < used) used = mFluids[index].amount; - - if (doDrain) { - mFluids[index].amount -= used; - } - - final FluidStack drained = mFluids[index].copy(); - drained.amount = used; - - if (mFluids[index].amount <= 0) { - mFluids[index] = null; - } - - return drained; - } - - @Override - public int getTankPressure() { - return getFluidAmount() - (getCapacity() / 2); - } - - @Override - public String[] getDescription() { - List descriptions = new ArrayList<>(); - descriptions.add( - EnumChatFormatting.BLUE + "Fluid Capacity: %%%" - + GT_Utility.formatNumbers(mCapacity * 20L) - + "%%% L/sec" - + EnumChatFormatting.GRAY); - descriptions.add( - EnumChatFormatting.RED + "Heat Limit: %%%" - + GT_Utility.formatNumbers(mHeatResistance) - + "%%% K" - + EnumChatFormatting.GRAY); - if (!mGasProof) { - descriptions.add(EnumChatFormatting.DARK_GREEN + "Cannot handle gas" + EnumChatFormatting.GRAY); - } - if (mPipeAmount != 1) { - descriptions.add(EnumChatFormatting.AQUA + "Pipe Amount: %%%" + mPipeAmount + EnumChatFormatting.GRAY); - } - return descriptions.toArray(new String[0]); - } - - @Override - public float getThickNess() { - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) return 0.0625F; - return mThickNess; - } - - @Override - public boolean isLiquidInput(ForgeDirection side) { - return !isInputDisabledAtSide(side); - } - - @Override - public boolean isLiquidOutput(ForgeDirection side) { - return true; - } - - public boolean isInputDisabledAtSide(ForgeDirection side) { - return (mDisableInput & side.flag) != 0; - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) - return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); - else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - - private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - final float tSpace = (1f - mThickNess) / 2; - float tSide0 = tSpace; - float tSide1 = 1f - tSpace; - float tSide2 = tSpace; - float tSide3 = 1f - tSpace; - float tSide4 = tSpace; - float tSide5 = 1f - tSpace; - - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) { - tSide0 = tSide2 = tSide4 = 0; - tSide3 = tSide5 = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) { - tSide2 = tSide4 = 0; - tSide1 = tSide3 = tSide5 = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) { - tSide0 = tSide2 = tSide4 = 0; - tSide1 = tSide5 = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) { - tSide0 = tSide4 = 0; - tSide1 = tSide3 = tSide5 = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) { - tSide0 = tSide2 = tSide4 = 0; - tSide1 = tSide3 = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) { - tSide0 = tSide2 = 0; - tSide1 = tSide3 = tSide5 = 1; - } - - final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; - if ((tConn & ForgeDirection.DOWN.flag) != 0) tSide0 = 0f; - if ((tConn & ForgeDirection.UP.flag) != 0) tSide1 = 1f; - if ((tConn & ForgeDirection.NORTH.flag) != 0) tSide2 = 0f; - if ((tConn & ForgeDirection.SOUTH.flag) != 0) tSide3 = 1f; - if ((tConn & ForgeDirection.WEST.flag) != 0) tSide4 = 0f; - if ((tConn & ForgeDirection.EAST.flag) != 0) tSide5 = 1f; - - return AxisAlignedBB - .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3); - } - - @Override - public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, - List outputAABB, Entity collider) { - super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) { - final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); - } - } - - @Override - public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) { - if (aFluid == null) return null; - for (int i = 0; i < mFluids.length; ++i) { - final FluidStack f = mFluids[i]; - if (f == null || !f.isFluidEqual(aFluid)) continue; - return drainFromIndex(aFluid.amount, doDrain, i); - } - return null; - } - - private static EnumMap borderMap(ForgeDirection topSide, ForgeDirection bottomSide, - ForgeDirection leftSide, ForgeDirection rightSide) { - final EnumMap sideMap = new EnumMap<>(Border.class); - sideMap.put(TOP, topSide); - sideMap.put(BOTTOM, bottomSide); - sideMap.put(LEFT, leftSide); - sideMap.put(RIGHT, rightSide); - return sideMap; - } - - protected static ForgeDirection getSideAtBorder(ForgeDirection side, Border border) { - return FACE_BORDER_MAP.get(side) - .get(border); - } - - protected enum Border { - - TOP(), - BOTTOM(), - LEFT(), - RIGHT(); - - public final int mask; - - Border() { - mask = 1 << this.ordinal(); - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java deleted file mode 100644 index 7cb2b3a9bd..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java +++ /dev/null @@ -1,119 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -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.Materials; -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_LanguageManager; - -public class GT_MetaPipeEntity_Frame extends MetaPipeEntity { - - private static final String localizedDescFormat = GT_LanguageManager - .addStringLocalization("gt.blockmachines.gt_frame.desc.format", "Just something you can put covers on."); - public final Materials mMaterial; - - public GT_MetaPipeEntity_Frame(int aID, String aName, String aNameRegional, Materials aMaterial) { - super(aID, aName, aNameRegional, 0); - mMaterial = aMaterial; - // Hide TileEntity frame in NEI, since we have the block version now that should always be used - codechicken.nei.api.API.hideItem(this.getStackForm(1)); - } - - public GT_MetaPipeEntity_Frame(String aName, Materials aMaterial) { - super(aName, 0); - mMaterial = aMaterial; - } - - @Override - public byte getTileEntityBaseType() { - return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality))); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaPipeEntity_Frame(mName, mMaterial); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, int connections, - int colorIndex, boolean active, boolean redstoneLevel) { - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex], - Dyes.getModulation(colorIndex, mMaterial.mRGBa)) }; - } - - @Override - public String[] getDescription() { - return localizedDescFormat.split("\\R"); - } - - @Override - public final boolean isSimpleMachine() { - return true; - } - - @Override - public final boolean isFacingValid(ForgeDirection facing) { - return false; - } - - @Override - public final boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public final boolean renderInside(ForgeDirection side) { - return true; - } - - @Override - public final float getThickNess() { - return 1.0F; - } - - @Override - public final void saveNBTData(NBTTagCompound aNBT) { - /* Do nothing */ - } - - @Override - public final void loadNBTData(NBTTagCompound aNBT) { - /* Do nothing */ - } - - @Override - public final boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public final boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public int connect(ForgeDirection side) { - return 0; - } - - @Override - public void disconnect(ForgeDirection side) { - /* Do nothing */ - } - - @Override - public boolean isMachineBlockUpdateRecursive() { - return true; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java deleted file mode 100644 index 660230660e..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java +++ /dev/null @@ -1,530 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; -import static gregtech.api.enums.Textures.BlockIcons.PIPE_RESTRICTOR; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityDispenser; -import net.minecraft.tileentity.TileEntityHopper; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.GT_Mod; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.metatileentity.IMetaTileEntityItemPipe; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.MetaPipeEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.GT_Client; -import gregtech.common.covers.CoverInfo; - -public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileEntityItemPipe { - - public final float mThickNess; - public final Materials mMaterial; - public final int mStepSize; - public final int mTickTime; - public int mTransferredItems = 0; - public long mCurrentTransferStartTick = 0; - public ForgeDirection mLastReceivedFrom = ForgeDirection.UNKNOWN, oLastReceivedFrom = ForgeDirection.UNKNOWN; - public boolean mIsRestrictive = false; - private int[] cacheSides; - - public GT_MetaPipeEntity_Item(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, - int aInvSlotCount, int aStepSize, boolean aIsRestrictive, int aTickTime) { - super(aID, aName, aNameRegional, aInvSlotCount, false); - mIsRestrictive = aIsRestrictive; - mThickNess = aThickNess; - mMaterial = aMaterial; - mStepSize = aStepSize; - mTickTime = aTickTime; - addInfo(aID); - } - - public GT_MetaPipeEntity_Item(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, - int aInvSlotCount, int aStepSize, boolean aIsRestrictive) { - this(aID, aName, aNameRegional, aThickNess, aMaterial, aInvSlotCount, aStepSize, aIsRestrictive, 20); - } - - public GT_MetaPipeEntity_Item(String aName, float aThickNess, Materials aMaterial, int aInvSlotCount, int aStepSize, - boolean aIsRestrictive, int aTickTime) { - super(aName, aInvSlotCount); - mIsRestrictive = aIsRestrictive; - mThickNess = aThickNess; - mMaterial = aMaterial; - mStepSize = aStepSize; - mTickTime = aTickTime; - } - - @Override - public byte getTileEntityBaseType() { - return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality))); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaPipeEntity_Item( - mName, - mThickNess, - mMaterial, - mInventory.length, - mStepSize, - mIsRestrictive, - mTickTime); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections, - int aColorIndex, boolean aConnected, boolean redstoneLevel) { - if (mIsRestrictive) { - if (aConnected) { - float tThickNess = getThickNess(); - if (tThickNess < 0.124F) return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; - if (tThickNess < 0.374F) // 0.375 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; - if (tThickNess < 0.499F) // 0.500 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; - if (tThickNess < 0.749F) // 0.750 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; - if (tThickNess < 0.874F) // 0.825 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; - } - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; - } - if (aConnected) { - float tThickNess = getThickNess(); - if (tThickNess < 0.124F) return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; - if (tThickNess < 0.374F) // 0.375 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; - if (tThickNess < 0.499F) // 0.500 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; - if (tThickNess < 0.749F) // 0.750 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; - if (tThickNess < 0.874F) // 0.825 - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; - } - return new ITexture[] { TextureFactory.of( - mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], - Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return false; - } - - @Override - public boolean isValidSlot(int ignoredSlotIndex) { - return true; - } - - @Override - public final boolean renderInside(ForgeDirection side) { - return false; - } - - @Override - public int getProgresstime() { - return getPipeContent() * 64; - } - - @Override - public int maxProgresstime() { - return getMaxPipeCapacity() * 64; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setByte("mLastReceivedFrom", (byte) mLastReceivedFrom.ordinal()); - if (GT_Mod.gregtechproxy.gt6Pipe) aNBT.setByte("mConnections", mConnections); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - mLastReceivedFrom = ForgeDirection.getOrientation(aNBT.getByte("mLastReceivedFrom")); - if (GT_Mod.gregtechproxy.gt6Pipe) { - mConnections = aNBT.getByte("mConnections"); - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide() && (aTick - mCurrentTransferStartTick) % 10 == 0) { - if ((aTick - mCurrentTransferStartTick) % mTickTime == 0) { - mTransferredItems = 0; - mCurrentTransferStartTick = 0; - } - - if (!GT_Mod.gregtechproxy.gt6Pipe || mCheckConnections) checkConnections(); - - if (oLastReceivedFrom == mLastReceivedFrom) { - doTickProfilingInThisTick = false; - - final ArrayList tPipeList = new ArrayList<>(); - - for (boolean temp = true; temp && !isInventoryEmpty() && pipeCapacityCheck();) { - temp = false; - tPipeList.clear(); - for (IMetaTileEntityItemPipe tTileEntity : GT_Utility - .sortMapByValuesAcending( - IMetaTileEntityItemPipe.Util.scanPipes(this, new HashMap<>(), 0, false, false)) - .keySet()) { - if (temp) break; - tPipeList.add(tTileEntity); - while (!temp && !isInventoryEmpty() && tTileEntity.sendItemStack(aBaseMetaTileEntity)) - for (IMetaTileEntityItemPipe tPipe : tPipeList) - if (!tPipe.incrementTransferCounter(1)) temp = true; - } - } - } - - if (isInventoryEmpty()) mLastReceivedFrom = ForgeDirection.UNKNOWN; - oLastReceivedFrom = mLastReceivedFrom; - } - } - - @Override - public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, - float aX, float aY, float aZ) { - if (GT_Mod.gregtechproxy.gt6Pipe) { - final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ); - if (isConnectedAtSide(tSide)) { - disconnect(tSide); - GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("215", "Disconnected")); - } else { - if (connect(tSide) > 0) GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("214", "Connected")); - } - return true; - } - return false; - } - - @Override - public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return coverBehavior.letsItemsIn(side, aCoverID, aCoverVariable, -1, aTileEntity); - } - - @Override - public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return coverBehavior.letsItemsOut(side, aCoverID, aCoverVariable, -1, aTileEntity); - } - - @Override - public boolean letsIn(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return coverBehavior.letsItemsIn(side, aCoverID, aCoverVariable, -1, aTileEntity); - } - - @Override - public boolean letsOut(GT_CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return coverBehavior.letsItemsOut(side, aCoverID, aCoverVariable, -1, aTileEntity); - } - - @Override - public boolean letsIn(CoverInfo coverInfo) { - return coverInfo.letsItemsOut(-1); - } - - @Override - public boolean letsOut(CoverInfo coverInfo) { - return coverInfo.letsItemsOut(-1); - } - - @Override - public boolean canConnect(ForgeDirection side, TileEntity tileEntity) { - if (tileEntity == null) return false; - - final ForgeDirection oppositeSide = side.getOpposite(); - boolean connectable = GT_Utility.isConnectableNonInventoryPipe(tileEntity, oppositeSide); - - final IGregTechTileEntity gTileEntity = (tileEntity instanceof IGregTechTileEntity) - ? (IGregTechTileEntity) tileEntity - : null; - if (gTileEntity != null) { - if (gTileEntity.getMetaTileEntity() == null) return false; - if (gTileEntity.getMetaTileEntity() - .connectsToItemPipe(oppositeSide)) return true; - connectable = true; - } - - if (tileEntity instanceof IInventory) { - if (((IInventory) tileEntity).getSizeInventory() <= 0) return false; - connectable = true; - } - if (tileEntity instanceof ISidedInventory) { - final int[] tSlots = ((ISidedInventory) tileEntity).getAccessibleSlotsFromSide(oppositeSide.ordinal()); - if (tSlots == null || tSlots.length == 0) return false; - connectable = true; - } - - return connectable; - } - - @Override - public boolean getGT6StyleConnection() { - // Yes if GT6 pipes are enabled - return GT_Mod.gregtechproxy.gt6Pipe; - } - - @Override - public boolean incrementTransferCounter(int aIncrement) { - if (mTransferredItems == 0) mCurrentTransferStartTick = getBaseMetaTileEntity().getTimer(); - mTransferredItems += aIncrement; - return pipeCapacityCheck(); - } - - @Override - public boolean sendItemStack(Object aSender) { - if (pipeCapacityCheck()) { - final byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6); - for (final byte i : ALL_VALID_SIDES) { - final ForgeDirection tSide = ForgeDirection.getOrientation((i + tOffset) % 6); - if (isConnectedAtSide(tSide) - && (isInventoryEmpty() || (tSide != mLastReceivedFrom || aSender != getBaseMetaTileEntity()))) { - if (insertItemStackIntoTileEntity(aSender, tSide)) return true; - } - } - } - return false; - } - - @Override - public boolean insertItemStackIntoTileEntity(Object aSender, ForgeDirection side) { - if (getBaseMetaTileEntity().getCoverInfoAtSide(side) - .letsItemsOut(-1)) { - final TileEntity tInventory = getBaseMetaTileEntity().getTileEntityAtSide(side); - if (tInventory != null && !(tInventory instanceof BaseMetaPipeEntity)) { - if ((!(tInventory instanceof TileEntityHopper) && !(tInventory instanceof TileEntityDispenser)) - || getBaseMetaTileEntity().getMetaIDAtSide(side) != side.getOpposite() - .ordinal()) { - return GT_Utility.moveMultipleItemStacks( - aSender, - tInventory, - ForgeDirection.UNKNOWN, - side.getOpposite(), - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1, - 1) > 0; - } - } - } - return false; - } - - @Override - public boolean pipeCapacityCheck() { - return mTransferredItems <= 0 || getPipeContent() < getMaxPipeCapacity(); - } - - private int getPipeContent() { - return mTransferredItems; - } - - private int getMaxPipeCapacity() { - return Math.max(1, getPipeCapacity()); - } - - /** - * Amount of ItemStacks this Pipe can conduct per Second. - */ - public int getPipeCapacity() { - return mInventory.length; - } - - @Override - public int getStepSize() { - return mStepSize; - } - - @Override - public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) { - return isConnectedAtSide(ForgeDirection.getOrientation(ordinalSide)) - && super.canInsertItem(aIndex, aStack, ordinalSide); - } - - @Override - public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) { - return isConnectedAtSide(ForgeDirection.getOrientation(ordinalSide)); - } - - @Override - public int[] getAccessibleSlotsFromSide(int ordinalSide) { - final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); - final CoverInfo coverInfo = tTileEntity.getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide)); - final boolean tAllow = coverInfo.letsItemsIn(-2) || coverInfo.letsItemsOut(-2); - if (tAllow) { - if (cacheSides == null) cacheSides = super.getAccessibleSlotsFromSide(ordinalSide); - return cacheSides; - } else { - return GT_Values.emptyIntArray; - } - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return isConnectedAtSide(side); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (!isConnectedAtSide(side)) return false; - if (isInventoryEmpty()) mLastReceivedFrom = side; - return mLastReceivedFrom == side && mInventory[aIndex] == null; - } - - @Override - public String[] getDescription() { - if (mTickTime == 20) return new String[] { "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/sec", - "Routing Value: %%%" + GT_Utility.formatNumbers(mStepSize) }; - else if (mTickTime % 20 == 0) return new String[] { - "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/%%%" + (mTickTime / 20) + "%%% sec", - "Routing Value: %%%" + GT_Utility.formatNumbers(mStepSize) }; - else return new String[] { - "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/%%%" + mTickTime + "%%% ticks", - "Routing Value: %%%" + GT_Utility.formatNumbers(mStepSize) }; - } - - private boolean isInventoryEmpty() { - for (ItemStack tStack : mInventory) if (tStack != null) return false; - return true; - } - - @Override - public float getThickNess() { - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) return 0.0625F; - return mThickNess; - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) - return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); - else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - - private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World ignoredAWorld, int aX, int aY, int aZ) { - final float tSpace = (1f - mThickNess) / 2; - float spaceDown = tSpace; - float spaceUp = 1f - tSpace; - float spaceNorth = tSpace; - float spaceSouth = 1f - tSpace; - float spaceWest = tSpace; - float spaceEast = 1f - tSpace; - - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) { - spaceDown = spaceNorth = spaceWest = 0; - spaceSouth = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) { - spaceNorth = spaceWest = 0; - spaceUp = spaceSouth = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) { - spaceDown = spaceNorth = spaceWest = 0; - spaceUp = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) { - spaceDown = spaceWest = 0; - spaceUp = spaceSouth = spaceEast = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) { - spaceDown = spaceNorth = spaceWest = 0; - spaceUp = spaceSouth = 1; - } - if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) { - spaceDown = spaceNorth = 0; - spaceUp = spaceSouth = spaceEast = 1; - } - - final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; - if ((tConn & ForgeDirection.DOWN.flag) != 0) spaceDown = 0f; - if ((tConn & ForgeDirection.UP.flag) != 0) spaceUp = 1f; - if ((tConn & ForgeDirection.NORTH.flag) != 0) spaceNorth = 0f; - if ((tConn & ForgeDirection.SOUTH.flag) != 0) spaceSouth = 1f; - if ((tConn & ForgeDirection.WEST.flag) != 0) spaceWest = 0f; - if ((tConn & ForgeDirection.EAST.flag) != 0) spaceEast = 1f; - - return AxisAlignedBB.getBoundingBox( - aX + spaceWest, - aY + spaceDown, - aZ + spaceNorth, - aX + spaceEast, - aY + spaceUp, - aZ + spaceSouth); - } - - @Override - public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, - List outputAABB, Entity collider) { - super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) { - final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java deleted file mode 100644 index cff63caeb5..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java +++ /dev/null @@ -1,436 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; - -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import ic2.api.item.IElectricItem; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple - * Machine - */ -public class GT_MetaTileEntity_BasicBatteryBuffer extends GT_MetaTileEntity_TieredMachineBlock - implements IAddUIWidgets { - - public boolean mCharge = false, mDecharge = false; - public int mBatteryCount = 0, mChargeableCount = 0; - private long count = 0; - private long mStored = 0; - private long mMax = 0; - - public GT_MetaTileEntity_BasicBatteryBuffer(int aID, String aName, String aNameRegional, int aTier, - String aDescription, int aSlotCount) { - super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription); - } - - public GT_MetaTileEntity_BasicBatteryBuffer(String aName, int aTier, String aDescription, ITexture[][][] aTextures, - int aSlotCount) { - super(aName, aTier, aSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicBatteryBuffer(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures, int aSlotCount) { - super(aName, aTier, aSlotCount, aDescription, aTextures); - } - - @Override - public String[] getDescription() { - String[] desc = new String[mDescriptionArray.length + 1]; - System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); - desc[mDescriptionArray.length] = mInventory.length + " Slots"; - return desc; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[2][17][]; - for (byte i = -1; i < 16; i++) { - rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; - rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - mInventory.length == 16 ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier] - : mInventory.length > 4 ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] - : Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - return mTextures[side == aFacing ? 1 : 0][colorIndex + 1]; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BasicBatteryBuffer(mName, mTier, mDescriptionArray, mTextures, mInventory.length); - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isElectric() { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isEnetOutput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return side != getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long getMinimumStoredEU() { - return V[mTier] * 16L * mInventory.length; - } - - @Override - public long maxEUStore() { - return V[mTier] * 64L * mInventory.length; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxEUOutput() { - return V[mTier]; - } - - @Override - public long maxAmperesIn() { - return mChargeableCount * 2L; - } - - @Override - public long maxAmperesOut() { - return mBatteryCount; - } - - @Override - public int rechargerSlotStartIndex() { - return 0; - } - - @Override - public int dechargerSlotStartIndex() { - return 0; - } - - @Override - public int rechargerSlotCount() { - return mCharge ? mInventory.length : 0; - } - - @Override - public int dechargerSlotCount() { - return mDecharge ? mInventory.length : 0; - } - - @Override - public int getProgresstime() { - return (int) getBaseMetaTileEntity().getUniversalEnergyStored(); - } - - @Override - public int maxProgresstime() { - return (int) getBaseMetaTileEntity().getUniversalEnergyCapacity(); - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - // - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - // - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; - mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; - mBatteryCount = 0; - mChargeableCount = 0; - for (ItemStack tStack : mInventory) if (GT_ModHandler.isElectricItem(tStack, mTier)) { - if (GT_ModHandler.isChargerItem(tStack)) mBatteryCount++; - mChargeableCount++; - } - } - count++; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (GT_ModHandler.isElectricItem(aStack) && aStack.getUnlocalizedName() - .startsWith("gt.metaitem.01.")) { - String name = aStack.getUnlocalizedName(); - if (name.equals("gt.metaitem.01.32510") || name.equals("gt.metaitem.01.32511") - || name.equals("gt.metaitem.01.32520") - || name.equals("gt.metaitem.01.32521") - || name.equals("gt.metaitem.01.32530") - || name.equals("gt.metaitem.01.32531")) { - return ic2.api.item.ElectricItem.manager.getCharge(aStack) == 0; - } - } - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (!GT_Utility.isStackValid(aStack)) { - return false; - } - return mInventory[aIndex] == null && GT_ModHandler.isElectricItem(aStack, this.mTier); - } - - @Override - public int getInventoryStackLimit() { - return 1; - } - - public long[] getStoredEnergy() { - boolean scaleOverflow = false; - boolean storedOverflow = false; - long tScale = getBaseMetaTileEntity().getEUCapacity(); - long tStored = getBaseMetaTileEntity().getStoredEU(); - long tStep = 0; - if (mInventory != null) { - for (ItemStack aStack : mInventory) { - if (GT_ModHandler.isElectricItem(aStack)) { - - if (aStack.getItem() instanceof GT_MetaBase_Item) { - Long[] stats = ((GT_MetaBase_Item) aStack.getItem()).getElectricStats(aStack); - if (stats != null) { - if (stats[0] > Long.MAX_VALUE / 2) { - scaleOverflow = true; - } - tScale = tScale + stats[0]; - tStep = ((GT_MetaBase_Item) aStack.getItem()).getRealCharge(aStack); - if (tStep > Long.MAX_VALUE / 2) { - storedOverflow = true; - } - tStored = tStored + tStep; - } - } else if (aStack.getItem() instanceof IElectricItem) { - tStored = tStored + (long) ic2.api.item.ElectricItem.manager.getCharge(aStack); - tScale = tScale + (long) ((IElectricItem) aStack.getItem()).getMaxCharge(aStack); - } - } - } - } - if (scaleOverflow) { - tScale = Long.MAX_VALUE; - } - if (storedOverflow) { - tStored = Long.MAX_VALUE; - } - return new long[] { tStored, tScale }; - } - - @Override - public String[] getInfoData() { - updateStorageInfo(); - - return new String[] { EnumChatFormatting.BLUE + getLocalName() + EnumChatFormatting.RESET, "Stored Items:", - EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mStored) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMax) - + EnumChatFormatting.RESET - + " EU", - "Average input:", GT_Utility.formatNumbers(getBaseMetaTileEntity().getAverageElectricInput()) + " EU/t", - "Average output:", GT_Utility.formatNumbers(getBaseMetaTileEntity().getAverageElectricOutput()) + " EU/t" }; - } - - private void updateStorageInfo() { - if (mMax == 0 || (count > 20)) { - long[] tmp = getStoredEnergy(); - mStored = tmp[0]; - mMax = tmp[1]; - count = 0; - } - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - NBTTagCompound tag = accessor.getNBTData(); - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.stored", - GT_Utility.formatNumbers(tag.getLong("mStored")), - GT_Utility.formatNumbers(tag.getLong("mMax")))); - long avgIn = tag.getLong("AvgIn"); - long avgOut = tag.getLong("AvgOut"); - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.avg_in_with_amperage", - GT_Utility.formatNumbers(avgIn), - GT_Utility.getAmperageForTier(avgIn, (byte) getInputTier()), - GT_Utility.getColoredTierNameFromTier((byte) getInputTier()))); - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.avg_out_with_amperage", - GT_Utility.formatNumbers(avgOut), - GT_Utility.getAmperageForTier(avgOut, (byte) getOutputTier()), - GT_Utility.getColoredTierNameFromTier((byte) getOutputTier()))); - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - updateStorageInfo(); - super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setLong("mStored", mStored); - tag.setLong("mMax", mMax); - tag.setLong("AvgIn", getBaseMetaTileEntity().getAverageElectricInput()); - tag.setLong("AvgOut", getBaseMetaTileEntity().getAverageElectricOutput()); - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - switch (mInventory.length) { - case 4 -> builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 2) - .startFromSlot(0) - .endAtSlot(3) - .slotCreator(index -> new BaseSlot(inventoryHandler, index) { - - @Override - public int getSlotStackLimit() { - return 1; - } - }) - .background(getGUITextureSet().getItemSlot()) - .build() - .setPos(70, 25)); - case 9 -> builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 3) - .startFromSlot(0) - .endAtSlot(8) - .slotCreator(index -> new BaseSlot(inventoryHandler, index) { - - @Override - public int getSlotStackLimit() { - return 1; - } - }) - .background(getGUITextureSet().getItemSlot()) - .build() - .setPos(61, 16)); - case 16 -> builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 4) - .startFromSlot(0) - .endAtSlot(15) - .slotCreator(index -> new BaseSlot(inventoryHandler, index) { - - @Override - public int getSlotStackLimit() { - return 1; - } - }) - .background(getGUITextureSet().getItemSlot()) - .build() - .setPos(52, 7)); - default -> builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 1) - .startFromSlot(0) - .endAtSlot(0) - .slotCreator(index -> new BaseSlot(inventoryHandler, index) { - - @Override - public int getSlotStackLimit() { - return 1; - } - }) - .background(getGUITextureSet().getItemSlot()) - .build() - .setPos(79, 34)); - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java deleted file mode 100644 index 7a968afc4b..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java +++ /dev/null @@ -1,339 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidContainerItem; -import net.minecraftforge.fluids.IFluidHandler; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.RecipeMapWorkable; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.maps.FuelBackend; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.GT_Pollution; - -public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity_BasicTank - implements RecipeMapWorkable { - - public GT_MetaTileEntity_BasicGenerator(int aID, String aName, String aNameRegional, int aTier, String aDescription, - ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicGenerator(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[10][17][]; - for (byte i = -1; i < 16; i++) { - rTextures[0][i + 1] = getFront(i); - rTextures[1][i + 1] = getBack(i); - rTextures[2][i + 1] = getBottom(i); - rTextures[3][i + 1] = getTop(i); - rTextures[4][i + 1] = getSides(i); - rTextures[5][i + 1] = getFrontActive(i); - rTextures[6][i + 1] = getBackActive(i); - rTextures[7][i + 1] = getBottomActive(i); - rTextures[8][i + 1] = getTopActive(i); - rTextures[9][i + 1] = getSidesActive(i); - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - return mTextures[(active ? 5 : 0) + (side == facingDirection ? 0 - : side == facingDirection.getOpposite() ? 1 - : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][colorIndex + 1]; - } - - @Override - public String[] getDescription() { - String[] desc = new String[mDescriptionArray.length + 1]; - System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); - desc[mDescriptionArray.length] = "Fuel Efficiency: " + getEfficiency() + "%"; - return desc; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - public ITexture[] getFront(byte aColor) { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getBack(byte aColor) { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getTop(byte aColor) { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getSides(byte aColor) { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getFrontActive(byte aColor) { - return getFront(aColor); - } - - public ITexture[] getBackActive(byte aColor) { - return getBack(aColor); - } - - public ITexture[] getBottomActive(byte aColor) { - return getBottom(aColor); - } - - public ITexture[] getTopActive(byte aColor) { - return getTop(aColor); - } - - public ITexture[] getSidesActive(byte aColor) { - return getSides(aColor); - } - - @Override - public boolean isFacingValid(ForgeDirection side) { - return true; - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex < 2; - } - - @Override - public boolean isEnetOutput() { - return true; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public long maxEUOutput() { - return getBaseMetaTileEntity().isAllowedToWork() ? V[mTier] : 0L; - } - - @Override - public long maxEUStore() { - return Math.max(getEUVar(), V[mTier] * 80L + getMinimumStoredEU()); - } - - @Override - public boolean doesFillContainers() { - return getBaseMetaTileEntity().isAllowedToWork(); - // return false; - } - - @Override - public boolean doesEmptyContainers() { - return getBaseMetaTileEntity().isAllowedToWork(); - } - - @Override - public boolean canTankBeFilled() { - return getBaseMetaTileEntity().isAllowedToWork(); - } - - @Override - public boolean canTankBeEmptied() { - return getBaseMetaTileEntity().isAllowedToWork(); - } - - @Override - public boolean displaysItemStack() { - return true; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return getFuelValue(aFluid) > 0; - } - - @Override - public boolean isLiquidOutput(ForgeDirection side) { - // return super.isLiquidOutput(aSide); - return false; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && aTick % 10 == 0) { - if (mFluid != null) { - long tFuelValue = getFuelValue(mFluid), tConsumed = consumedFluidPerOperation(mFluid); - if (tFuelValue > 0 && tConsumed > 0 && mFluid.amount >= tConsumed) { - long tFluidAmountToUse = Math.min( - mFluid.amount / tConsumed, - (maxEUStore() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue); - if (tFluidAmountToUse > 0 - && aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true)) { - // divided by two because this is called every 10 ticks, not 20 - GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution() / 2); - mFluid.amount -= tFluidAmountToUse * tConsumed; - } - } - } - - if (mInventory[getInputSlot()] != null - && aBaseMetaTileEntity.getUniversalEnergyStored() < (maxEUOutput() * 20 + getMinimumStoredEU()) - && ((GT_Utility.getFluidForFilledItem(mInventory[getInputSlot()], true) != null) - || solidFuelOverride(mInventory[getInputSlot()]))) { - long tFuelValue = getFuelValue(mInventory[getInputSlot()]); - if (tFuelValue <= 0) tFuelValue = getFuelValue(mInventory[getInputSlot()], true); - // System.out.println(" tFuelValue : " + tFuelValue ); - if (tFuelValue > 0) { - ItemStack tEmptyContainer = getEmptyContainer(mInventory[getInputSlot()]); - if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tEmptyContainer)) { - aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true); - aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); - // divided by two because this is called every 10 ticks, not 20 - GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution() / 2); - } - } - } - } - - if (aBaseMetaTileEntity.isServerSide()) aBaseMetaTileEntity.setActive( - aBaseMetaTileEntity.isAllowedToWork() - && aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU()); - } - - /** - * @param stack the fuel stack - * @return if the stack is a solid fuel - */ - public boolean solidFuelOverride(ItemStack stack) { - // this could be used for a coal generator for example aswell... - ItemData association = GT_OreDictUnificator.getAssociation(stack); - // if it is a gregtech Item, make sure its not a VOLUMETRIC_FLASK or any type of cell, else do vanilla checks - if (association != null) { - return !OrePrefixes.CELL_TYPES.contains(association.mPrefix) - && !GT_Utility.areStacksEqual(ItemList.VOLUMETRIC_FLASK.get(1L), stack, true); - } else { - return stack != null && // when the stack is null its not a solid - stack.getItem() != null && // when the item in the stack is null its not a solid - !(stack.getItem() instanceof IFluidContainerItem) && // when the item is a fluid container its not a - // solid... - !(stack.getItem() instanceof IFluidHandler) && // when the item is a fluid handler its not a - // solid... - !stack.getItem() - .getUnlocalizedName() - .contains("bucket"); // since we cant really check for - // buckets... - } - } - - public abstract int getPollution(); - - @Override - public abstract RecipeMap getRecipeMap(); - - public abstract int getEfficiency(); - - public int consumedFluidPerOperation(FluidStack aLiquid) { - return 1; - } - - public int getFuelValue(FluidStack aLiquid) { - long value = getFuelValue(aLiquid, true); - return (value > Integer.MAX_VALUE) ? 0 : (int) value; - } - - public long getFuelValue(FluidStack aLiquid, boolean aLong) { - RecipeMap tRecipes = getRecipeMap(); - if (aLiquid == null || !(tRecipes.getBackend() instanceof FuelBackend tFuels)) return 0; - GT_Recipe tFuel = tFuels.findFuel(aLiquid); - if (tFuel == null) return 0; - - return (long) tFuel.mSpecialValue * getEfficiency() * consumedFluidPerOperation(aLiquid) / 100; - } - - public int getFuelValue(ItemStack aStack) { - long value = getFuelValue(aStack, true); - return (value > Integer.MAX_VALUE) ? 0 : (int) value; - } - - public long getFuelValue(ItemStack aStack, boolean aLong) { - if (GT_Utility.isStackInvalid(aStack) || getRecipeMap() == null) return 0; - GT_Recipe tFuel = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack); - if (tFuel == null) return 0; - - long liters = 10L; // 1000mb/100 - return (long) tFuel.mSpecialValue * liters * getEfficiency(); - } - - public ItemStack getEmptyContainer(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack) || getRecipeMap() == null) return null; - GT_Recipe tFuel = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack); - if (tFuel != null) return GT_Utility.copyOrNull(tFuel.getOutput(0)); - return GT_Utility.getContainerItem(aStack, true); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && (getFuelValue(aStack, true) > 0 - || getFuelValue(GT_Utility.getFluidForFilledItem(aStack, true), true) > 0); - } - - @Override - public int getCapacity() { - return 16000; - } - - @Override - public int getTankPressure() { - return -100; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java deleted file mode 100644 index e5766eee39..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java +++ /dev/null @@ -1,175 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public class GT_MetaTileEntity_BasicHull extends GT_MetaTileEntity_BasicTank { - - public GT_MetaTileEntity_BasicHull(int aID, String aName, String aNameRegional, int aTier, String aDescription, - ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, 1, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BasicHull(mName, mTier, mInventory.length, mDescriptionArray, mTextures); - } - - @Override - public boolean isElectric() { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isEnetOutput() { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return !isOutputFacing(side); - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public long getMinimumStoredEU() { - return 512; - } - - @Override - public long maxEUStore() { - return 512 + V[mTier] * 50; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxEUOutput() { - return V[mTier]; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return true; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return true; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aConnected, boolean redstoneLevel) { - return mTextures[Math.min(2, side.ordinal()) + (side == aFacing ? 3 : 0)][colorIndex + 1]; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[6][17][]; - for (byte i = -1; i < 16; i++) { - rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; - rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; - rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; - rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; - rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; - rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; - } - return rTextures; - } - - @Override - public boolean doesFillContainers() { - return false; - } - - @Override - public boolean doesEmptyContainers() { - return false; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return false; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - @Override - public int getCapacity() { - return (mTier + 1) * 1000; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java deleted file mode 100644 index b6584b50ab..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java +++ /dev/null @@ -1,78 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public abstract class GT_MetaTileEntity_BasicHull_NonElectric extends GT_MetaTileEntity_BasicHull { - - public GT_MetaTileEntity_BasicHull_NonElectric(int aID, String aName, String aNameRegional, int aTier, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aDescription); - } - - public GT_MetaTileEntity_BasicHull_NonElectric(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull_NonElectric(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - return mTextures[Math.min(2, sideDirection.ordinal())][colorIndex + 1]; - } - - @Override - public boolean isElectric() { - return false; - } - - @Override - public boolean isEnetInput() { - return false; - } - - @Override - public boolean isEnetOutput() { - return false; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return false; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 0; - } - - @Override - public long maxEUStore() { - return 0; - } - - @Override - public long maxEUInput() { - return 0; - } - - @Override - public long maxEUOutput() { - return 0; - } - - @Override - public abstract ITexture[][][] getTextureSet(ITexture[] aTextures); -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java deleted file mode 100644 index 377646f85a..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java +++ /dev/null @@ -1,1563 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.GT_Values.debugCleanroom; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; -import static gregtech.api.metatileentity.BaseTileEntity.FLUID_TRANSFER_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.ITEM_TRANSFER_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_STEAM_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_VOLTAGE_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.POWER_SOURCE_KEY; -import static gregtech.api.metatileentity.BaseTileEntity.SPECIAL_SLOT_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.STALLED_STUTTERING_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.STALLED_VENT_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static gregtech.api.metatileentity.BaseTileEntity.UNUSED_SLOT_TOOLTIP; -import static gregtech.api.util.GT_RecipeConstants.EXPLODE; -import static gregtech.api.util.GT_RecipeConstants.ON_FIRE; -import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; -import static net.minecraftforge.common.util.ForgeDirection.DOWN; -import static net.minecraftforge.common.util.ForgeDirection.UNKNOWN; -import static net.minecraftforge.common.util.ForgeDirection.UP; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; - -import org.apache.commons.lang3.tuple.Pair; - -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.math.Size; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; -import com.gtnewhorizons.modularui.common.widget.ProgressBar; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.SoundResource; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.SteamTexture; -import gregtech.api.interfaces.ICleanroom; -import gregtech.api.interfaces.IConfigurationCircuitSupport; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider; -import gregtech.api.interfaces.tileentity.RecipeMapWorkable; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.overclockdescriber.EUOverclockDescriber; -import gregtech.api.objects.overclockdescriber.OverclockDescriber; -import gregtech.api.recipe.BasicUIProperties; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ClientPreference; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_TooltipDataCache; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.GT_Waila; -import gregtech.common.gui.modularui.UIHelper; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple - * Machine - */ -public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_BasicTank implements RecipeMapWorkable, - IConfigurationCircuitSupport, IOverclockDescriptionProvider, IAddGregtechLogo, IAddUIWidgets { - - /** - * return values for checkRecipe() - */ - protected static final int DID_NOT_FIND_RECIPE = 0, FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS = 1, - FOUND_AND_SUCCESSFULLY_USED_RECIPE = 2; - - public static final int OTHER_SLOT_COUNT = 5; - public final ItemStack[] mOutputItems; - public final int mInputSlotCount, mAmperage; - public boolean mAllowInputFromOutputSide = false, mFluidTransfer = false, mItemTransfer = false, - mHasBeenUpdated = false, mStuttering = false, mCharge = false, mDecharge = false; - public boolean mDisableFilter = true; - public boolean mDisableMultiStack = true; - public int mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mOutputBlocked = 0; - public ForgeDirection mMainFacing = ForgeDirection.WEST; - public FluidStack mOutputFluid; - protected final OverclockDescriber overclockDescriber; - - /** - * Contains the Recipe which has been previously used, or null if there was no previous Recipe, which could have - * been buffered - */ - protected GT_Recipe mLastRecipe = null; - - private FluidStack mFluidOut; - protected final FluidStackTank fluidOutputTank = new FluidStackTank( - () -> mFluidOut, - fluidStack -> mFluidOut = fluidStack, - this::getCapacity); - - /** - * Registers machine with single-line description. - * - * @param aOverlays 0 = SideFacingActive 1 = SideFacingInactive 2 = FrontFacingActive 3 = FrontFacingInactive 4 = - * TopFacingActive 5 = TopFacingInactive 6 = BottomFacingActive 7 = BottomFacingInactive ----- Not - * all Array Elements have to be initialised, you can also just use 8 Parameters for the Default - * Pipe Texture Overlays ----- 8 = BottomFacingPipeActive 9 = BottomFacingPipeInactive 10 = - * TopFacingPipeActive 11 = TopFacingPipeInactive 12 = SideFacingPipeActive 13 = - * SideFacingPipeInactive - */ - public GT_MetaTileEntity_BasicMachine(int aID, String aName, String aNameRegional, int aTier, int aAmperage, - String aDescription, int aInputSlotCount, int aOutputSlotCount, ITexture... aOverlays) { - super( - aID, - aName, - aNameRegional, - aTier, - OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1, - aDescription, - aOverlays); - mInputSlotCount = Math.max(0, aInputSlotCount); - mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)]; - mAmperage = aAmperage; - overclockDescriber = createOverclockDescriber(); - } - - /** - * Registers machine with multi-line descriptions. - */ - public GT_MetaTileEntity_BasicMachine(int aID, String aName, String aNameRegional, int aTier, int aAmperage, - String[] aDescription, int aInputSlotCount, int aOutputSlotCount, ITexture... aOverlays) { - super( - aID, - aName, - aNameRegional, - aTier, - OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1, - aDescription, - aOverlays); - mInputSlotCount = Math.max(0, aInputSlotCount); - mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)]; - mAmperage = aAmperage; - overclockDescriber = createOverclockDescriber(); - } - - /** - * For {@link #newMetaEntity}. - */ - public GT_MetaTileEntity_BasicMachine(String aName, int aTier, int aAmperage, String[] aDescription, - ITexture[][][] aTextures, int aInputSlotCount, int aOutputSlotCount) { - super(aName, aTier, OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1, aDescription, aTextures); - mInputSlotCount = Math.max(0, aInputSlotCount); - mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)]; - mAmperage = aAmperage; - overclockDescriber = createOverclockDescriber(); - } - - /** - * To be called by the constructor to initialize this instance's overclock behavior - */ - protected OverclockDescriber createOverclockDescriber() { - return new EUOverclockDescriber(mTier, mAmperage); - } - - protected boolean isValidMainFacing(ForgeDirection side) { - return (side.flag & (UP.flag | DOWN.flag | UNKNOWN.flag)) == 0; // Horizontal - } - - public boolean setMainFacing(ForgeDirection side) { - if (!isValidMainFacing(side)) return false; - mMainFacing = side; - if (getBaseMetaTileEntity().getFrontFacing() == mMainFacing) { - getBaseMetaTileEntity().setFrontFacing(side.getOpposite()); - } - onFacingChange(); - onMachineBlockUpdate(); - return true; - } - - @Override - public void onFacingChange() { - super.onFacingChange(); - // Set up the correct facing (front towards player, output opposite) client-side before the server packet - // arrives - if (mMainFacing == UNKNOWN) { - IGregTechTileEntity te = getBaseMetaTileEntity(); - if (te != null && te.getWorld().isRemote) { - mMainFacing = te.getFrontFacing(); - te.setFrontFacing(te.getBackFacing()); - } - } - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[14][17][]; - aTextures = Arrays.copyOf(aTextures, 14); - - for (int i = 0; i < aTextures.length; i++) if (aTextures[i] != null) for (byte c = -1; c < 16; c++) { - if (rTextures[i][c + 1] == null) - rTextures[i][c + 1] = new ITexture[] { MACHINE_CASINGS[mTier][c + 1], aTextures[i] }; - } - - for (byte c = -1; c < 16; c++) { - if (rTextures[0][c + 1] == null) rTextures[0][c + 1] = getSideFacingActive(c); - if (rTextures[1][c + 1] == null) rTextures[1][c + 1] = getSideFacingInactive(c); - if (rTextures[2][c + 1] == null) rTextures[2][c + 1] = getFrontFacingActive(c); - if (rTextures[3][c + 1] == null) rTextures[3][c + 1] = getFrontFacingInactive(c); - if (rTextures[4][c + 1] == null) rTextures[4][c + 1] = getTopFacingActive(c); - if (rTextures[5][c + 1] == null) rTextures[5][c + 1] = getTopFacingInactive(c); - if (rTextures[6][c + 1] == null) rTextures[6][c + 1] = getBottomFacingActive(c); - if (rTextures[7][c + 1] == null) rTextures[7][c + 1] = getBottomFacingInactive(c); - if (rTextures[8][c + 1] == null) rTextures[8][c + 1] = getBottomFacingPipeActive(c); - if (rTextures[9][c + 1] == null) rTextures[9][c + 1] = getBottomFacingPipeInactive(c); - if (rTextures[10][c + 1] == null) rTextures[10][c + 1] = getTopFacingPipeActive(c); - if (rTextures[11][c + 1] == null) rTextures[11][c + 1] = getTopFacingPipeInactive(c); - if (rTextures[12][c + 1] == null) rTextures[12][c + 1] = getSideFacingPipeActive(c); - if (rTextures[13][c + 1] == null) rTextures[13][c + 1] = getSideFacingPipeInactive(c); - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - final int textureIndex; - if ((mMainFacing.flag & (UP.flag | DOWN.flag)) != 0) { // UP or DOWN - if (sideDirection == facingDirection) { - textureIndex = active ? 2 : 3; - } else { - textureIndex = switch (sideDirection) { - case DOWN -> active ? 6 : 7; - case UP -> active ? 4 : 5; - default -> active ? 0 : 1; - }; - } - } else { - if (sideDirection == mMainFacing) { - textureIndex = active ? 2 : 3; - } else { - if (showPipeFacing() && sideDirection == facingDirection) { - textureIndex = switch (sideDirection) { - case DOWN -> active ? 8 : 9; - case UP -> active ? 10 : 11; - default -> active ? 12 : 13; - }; - } else { - textureIndex = switch (sideDirection) { - case DOWN -> active ? 6 : 7; - case UP -> active ? 4 : 5; - default -> active ? 0 : 1; - }; - } - } - } - return mTextures[textureIndex][colorIndex + 1]; - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isOverclockerUpgradable() { - return false; - } - - @Override - public boolean isTransformerUpgradable() { - return false; - } - - @Override - public boolean isElectric() { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex > 0 && super.isValidSlot(aIndex) - && aIndex != getCircuitSlot() - && aIndex != OTHER_SLOT_COUNT + mInputSlotCount + mOutputItems.length; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - // Either mMainFacing or mMainFacing is horizontal - return ((facing.flag | mMainFacing.flag) & ~(UP.flag | DOWN.flag | UNKNOWN.flag)) != 0; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return side != mMainFacing; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return false; - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public boolean isLiquidInput(ForgeDirection side) { - return side != mMainFacing && (mAllowInputFromOutputSide || side != getBaseMetaTileEntity().getFrontFacing()); - } - - @Override - public boolean isLiquidOutput(ForgeDirection side) { - return side != mMainFacing; - } - - @Override - public long getMinimumStoredEU() { - return V[mTier] * 16L; - } - - @Override - public long maxEUStore() { - return V[mTier] * 64L; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxSteamStore() { - return maxEUStore(); - } - - @Override - public long maxAmperesIn() { - return ((long) mEUt * 2L) / V[mTier] + 1L; - } - - @Override - public int getInputSlot() { - return OTHER_SLOT_COUNT; - } - - @Override - public int getOutputSlot() { - return OTHER_SLOT_COUNT + mInputSlotCount; - } - - public int getSpecialSlotIndex() { - return 3; - } - - @Override - public int getStackDisplaySlot() { - return 2; - } - - @Override - public int rechargerSlotStartIndex() { - return 1; - } - - @Override - public int dechargerSlotStartIndex() { - return 1; - } - - @Override - public int rechargerSlotCount() { - return mCharge ? 1 : 0; - } - - @Override - public int dechargerSlotCount() { - return mDecharge ? 1 : 0; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public int getProgresstime() { - return mProgresstime; - } - - @Override - public int maxProgresstime() { - return mMaxProgresstime; - } - - @Override - public int increaseProgress(int aProgress) { - mProgresstime += aProgress; - return mMaxProgresstime - mProgresstime; - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return getFillableStack() != null || (getRecipeMap() != null && getRecipeMap().containsInput(aFluid)); - } - - @Override - public boolean isFluidChangingAllowed() { - return true; - } - - @Override - public boolean doesFillContainers() { - return false; - } - - @Override - public boolean doesEmptyContainers() { - return false; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return true; - } - - @Override - public boolean displaysStackSize() { - return true; - } - - @Override - public FluidStack getDrainableStack() { - return mFluidOut; - } - - @Override - public FluidStack setDrainableStack(FluidStack aFluid) { - markDirty(); - mFluidOut = aFluid; - return mFluidOut; - } - - @Override - public boolean isDrainableStackSeparate() { - return true; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isClientSide()) return true; - if (!GT_Mod.gregtechproxy.mForceFreeFace) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (aBaseMetaTileEntity.getAirAtSide(side)) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - } - GT_Utility.sendChatToPlayer(aPlayer, "No free Side!"); - return true; - } - - @Override - public void initDefaultModes(NBTTagCompound aNBT) { - mMainFacing = ForgeDirection.UNKNOWN; - if (!getBaseMetaTileEntity().getWorld().isRemote) { - final GT_ClientPreference tPreference = GT_Mod.gregtechproxy - .getClientPreference(getBaseMetaTileEntity().getOwnerUuid()); - if (tPreference != null) { - mDisableFilter = !tPreference.isSingleBlockInitialFilterEnabled(); - mDisableMultiStack = !tPreference.isSingleBlockInitialMultiStackEnabled(); - } - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("mFluidTransfer", mFluidTransfer); - aNBT.setBoolean("mItemTransfer", mItemTransfer); - aNBT.setBoolean("mHasBeenUpdated", mHasBeenUpdated); - aNBT.setBoolean("mAllowInputFromOutputSide", mAllowInputFromOutputSide); - aNBT.setBoolean("mDisableFilter", mDisableFilter); - aNBT.setBoolean("mDisableMultiStack", mDisableMultiStack); - aNBT.setInteger("mEUt", mEUt); - aNBT.setInteger("mMainFacing", mMainFacing.ordinal()); - aNBT.setInteger("mProgresstime", mProgresstime); - aNBT.setInteger("mMaxProgresstime", mMaxProgresstime); - if (mOutputFluid != null) aNBT.setTag("mOutputFluid", mOutputFluid.writeToNBT(new NBTTagCompound())); - if (mFluidOut != null) aNBT.setTag("mFluidOut", mFluidOut.writeToNBT(new NBTTagCompound())); - - for (int i = 0; i < mOutputItems.length; i++) - if (mOutputItems[i] != null) GT_Utility.saveItem(aNBT, "mOutputItem" + i, mOutputItems[i]); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mFluidTransfer = aNBT.getBoolean("mFluidTransfer"); - mItemTransfer = aNBT.getBoolean("mItemTransfer"); - mHasBeenUpdated = aNBT.getBoolean("mHasBeenUpdated"); - mAllowInputFromOutputSide = aNBT.getBoolean("mAllowInputFromOutputSide"); - mDisableFilter = aNBT.getBoolean("mDisableFilter"); - mDisableMultiStack = aNBT.getBoolean("mDisableMultiStack"); - mEUt = aNBT.getInteger("mEUt"); - mMainFacing = ForgeDirection.getOrientation(aNBT.getInteger("mMainFacing")); - mProgresstime = aNBT.getInteger("mProgresstime"); - mMaxProgresstime = aNBT.getInteger("mMaxProgresstime"); - mOutputFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mOutputFluid")); - mFluidOut = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluidOut")); - - for (int i = 0; i < mOutputItems.length; i++) mOutputItems[i] = GT_Utility.loadItem(aNBT, "mOutputItem" + i); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - - if (aBaseMetaTileEntity.isServerSide()) { - mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; - mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; - - doDisplayThings(); - - boolean tSucceeded = false; - - if (mMaxProgresstime > 0 && (mProgresstime >= 0 || aBaseMetaTileEntity.isAllowedToWork())) { - markDirty(); - aBaseMetaTileEntity.setActive(true); - if (mProgresstime < 0 || drainEnergyForProcess(mEUt)) { - if (++mProgresstime >= mMaxProgresstime) { - for (int i = 0; i < mOutputItems.length; i++) - for (int j = 0; j < mOutputItems.length; j++) if (aBaseMetaTileEntity - .addStackToSlot(getOutputSlot() + ((j + i) % mOutputItems.length), mOutputItems[i])) - break; - if (mOutputFluid != null) - if (getDrainableStack() == null) setDrainableStack(mOutputFluid.copy()); - else if (mOutputFluid.isFluidEqual(getDrainableStack())) - getDrainableStack().amount += mOutputFluid.amount; - Arrays.fill(mOutputItems, null); - mOutputFluid = null; - mEUt = 0; - mProgresstime = 0; - mMaxProgresstime = 0; - mStuttering = false; - tSucceeded = true; - endProcess(); - } - if (mProgresstime > 5) mStuttering = false; - } else { - if (!mStuttering) { - stutterProcess(); - if (canHaveInsufficientEnergy()) mProgresstime = -100; - mStuttering = true; - } - } - } else { - aBaseMetaTileEntity.setActive(false); - } - - boolean tRemovedOutputFluid = false; - - if (doesAutoOutputFluids() && getDrainableStack() != null - && aBaseMetaTileEntity.getFrontFacing() != mMainFacing - && (tSucceeded || aTick % 20 == 0)) { - IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing()); - if (tTank != null) { - FluidStack tDrained = drain(1000, false); - if (tDrained != null) { - final int tFilledAmount = tTank.fill(aBaseMetaTileEntity.getBackFacing(), tDrained, false); - if (tFilledAmount > 0) - tTank.fill(aBaseMetaTileEntity.getBackFacing(), drain(tFilledAmount, true), true); - } - } - if (getDrainableStack() == null) tRemovedOutputFluid = true; - } - - if (doesAutoOutput() && !isOutputEmpty() - && aBaseMetaTileEntity.getFrontFacing() != mMainFacing - && (tSucceeded || mOutputBlocked % 300 == 1 - || aBaseMetaTileEntity.hasInventoryBeenModified() - || aTick % 600 == 0)) { - TileEntity tTileEntity2 = aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getFrontFacing()); - long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored(); - int tMaxStacks = (int) (tStoredEnergy / 64L); - if (tMaxStacks > mOutputItems.length) tMaxStacks = mOutputItems.length; - - moveMultipleItemStacks( - aBaseMetaTileEntity, - tTileEntity2, - aBaseMetaTileEntity.getFrontFacing(), - aBaseMetaTileEntity.getBackFacing(), - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1, - tMaxStacks); - } - - if (mOutputBlocked != 0) if (isOutputEmpty()) mOutputBlocked = 0; - else mOutputBlocked++; - - if (allowToCheckRecipe()) { - if (mMaxProgresstime <= 0 && aBaseMetaTileEntity.isAllowedToWork() - && (tRemovedOutputFluid || tSucceeded - || aBaseMetaTileEntity.hasInventoryBeenModified() - || aTick % 600 == 0 - || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) - && hasEnoughEnergyToCheckRecipe()) { - if (checkRecipe() == FOUND_AND_SUCCESSFULLY_USED_RECIPE) { - if (getSpecialSlot() != null && getSpecialSlot().stackSize <= 0) - mInventory[getSpecialSlotIndex()] = null; - for (int i = getInputSlot(), j = i + mInputSlotCount; i < j; i++) - if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; - for (int i = 0; i < mOutputItems.length; i++) { - mOutputItems[i] = GT_Utility.copyOrNull(mOutputItems[i]); - if (mOutputItems[i] != null && mOutputItems[i].stackSize > 64) - mOutputItems[i].stackSize = 64; - mOutputItems[i] = GT_OreDictUnificator.get(true, mOutputItems[i]); - } - if (mFluid != null && mFluid.amount <= 0) mFluid = null; - mMaxProgresstime = Math.max(1, mMaxProgresstime); - if (GT_Utility.isDebugItem(mInventory[dechargerSlotStartIndex()])) { - mEUt = mMaxProgresstime = 1; - } - startProcess(); - } else { - mMaxProgresstime = 0; - Arrays.fill(mOutputItems, null); - mOutputFluid = null; - } - } - } else { - if (!mStuttering) { - stutterProcess(); - mStuttering = true; - } - } - } - // Only using mNeedsSteamVenting right now and assigning it to 64 to space in the range for more single block - // machine problems. - // Value | Class | Field - // 1 | GT_MetaTileEntity_BasicMachine | mStuttering - // 64 | GT_MetaTileEntity_BasicMachine_Bronze | mNeedsSteamVenting - aBaseMetaTileEntity.setErrorDisplayID((aBaseMetaTileEntity.getErrorDisplayID() & ~127)); // | (mStuttering ? 1 : - // 0)); - } - - protected void doDisplayThings() { - if (!isValidMainFacing(mMainFacing) && isValidMainFacing(getBaseMetaTileEntity().getFrontFacing())) { - mMainFacing = getBaseMetaTileEntity().getFrontFacing(); - } - if (isValidMainFacing(mMainFacing) && !mHasBeenUpdated) { - mHasBeenUpdated = true; - getBaseMetaTileEntity().setFrontFacing(getBaseMetaTileEntity().getBackFacing()); - } - } - - protected boolean hasEnoughEnergyToCheckRecipe() { - return getBaseMetaTileEntity().isUniversalEnergyStored(getMinimumStoredEU() / 2); - } - - protected boolean drainEnergyForProcess(long aEUt) { - return getBaseMetaTileEntity().decreaseStoredEnergyUnits(aEUt, false); - } - - /** - * Calculates overclock based on {@link #overclockDescriber}. - */ - protected void calculateCustomOverclock(GT_Recipe recipe) { - GT_OverclockCalculator calculator = overclockDescriber.createCalculator( - new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt) - .setDuration(recipe.mDuration) - .setOneTickDiscount(true), - recipe); - calculator.calculate(); - mEUt = (int) calculator.getConsumption(); - mMaxProgresstime = calculator.getDuration(); - } - - /** - * Helper method for calculating simple overclock. - */ - protected void calculateOverclockedNess(int eut, int duration) { - GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(eut) - .setEUt(V[mTier] * mAmperage) - .setDuration(duration) - .setOneTickDiscount(true) - .calculate(); - mEUt = (int) calculator.getConsumption(); - mMaxProgresstime = calculator.getDuration(); - } - - protected ItemStack getSpecialSlot() { - return mInventory[getSpecialSlotIndex()]; - } - - protected ItemStack getOutputAt(int aIndex) { - return mInventory[getOutputSlot() + aIndex]; - } - - protected ItemStack[] getAllOutputs() { - ItemStack[] rOutputs = new ItemStack[mOutputItems.length]; - for (int i = 0; i < mOutputItems.length; i++) rOutputs[i] = getOutputAt(i); - return rOutputs; - } - - protected boolean canOutput(GT_Recipe aRecipe) { - return aRecipe != null && (aRecipe.mNeedsEmptyOutput ? isOutputEmpty() && getDrainableStack() == null - : canOutput(aRecipe.getFluidOutput(0)) && canOutput(aRecipe.mOutputs)); - } - - protected boolean canOutput(ItemStack... aOutputs) { - if (aOutputs == null) return true; - ItemStack[] tOutputSlots = getAllOutputs(); - for (int i = 0; i < tOutputSlots.length && i < aOutputs.length; i++) - if (tOutputSlots[i] != null && aOutputs[i] != null - && (!GT_Utility.areStacksEqual(tOutputSlots[i], aOutputs[i], false) - || tOutputSlots[i].stackSize + aOutputs[i].stackSize > tOutputSlots[i].getMaxStackSize())) { - mOutputBlocked++; - return false; - } - return true; - } - - protected boolean canOutput(FluidStack aOutput) { - if (aOutput == null) return true; - FluidStack drainableStack = getDrainableStack(); - if (drainableStack != null && !drainableStack.isFluidEqual(aOutput)) return false; - return (drainableStack != null ? drainableStack.amount : 0) + aOutput.amount <= getCapacity(); - } - - protected ItemStack getInputAt(int aIndex) { - return mInventory[getInputSlot() + aIndex]; - } - - protected ItemStack[] getAllInputs() { - int tRealInputSlotCount = this.mInputSlotCount + (allowSelectCircuit() ? 1 : 0); - ItemStack[] rInputs = new ItemStack[tRealInputSlotCount]; - for (int i = 0; i < mInputSlotCount; i++) rInputs[i] = getInputAt(i); - if (allowSelectCircuit()) rInputs[mInputSlotCount] = getStackInSlot(getCircuitSlot()); - return rInputs; - } - - protected boolean isOutputEmpty() { - boolean rIsEmpty = true; - for (ItemStack tOutputSlotContent : getAllOutputs()) if (tOutputSlotContent != null) { - rIsEmpty = false; - break; - } - return rIsEmpty; - } - - @Override - public void onValueUpdate(byte aValue) { - mMainFacing = ForgeDirection.getOrientation(aValue); - } - - @Override - public byte getUpdateData() { - return (byte) mMainFacing.ordinal(); - } - - @Override - public void doSound(byte aIndex, double aX, double aY, double aZ) { - super.doSound(aIndex, aX, aY, aZ); - if (aIndex == 8) GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ); - } - - public boolean doesAutoOutput() { - return mItemTransfer; - } - - public boolean doesAutoOutputFluids() { - return mFluidTransfer; - } - - public boolean allowToCheckRecipe() { - return true; - } - - public boolean showPipeFacing() { - return true; - } - - /** - * Called whenever the Machine successfully started a Process, useful for Sound Effects - */ - public void startProcess() { - // - } - - /** - * Called whenever the Machine successfully finished a Process, useful for Sound Effects - */ - public void endProcess() { - // - } - - /** - * Called whenever the Machine aborted a Process, useful for Sound Effects - */ - public void abortProcess() { - // - } - - /** - * Called whenever the Machine aborted a Process but still works on it, useful for Sound Effects - */ - public void stutterProcess() { - if (useStandardStutterSound()) sendSound((byte) 8); - } - - /** - * If this Machine can have the Insufficient Energy Line Problem - */ - public boolean canHaveInsufficientEnergy() { - return true; - } - - public boolean useStandardStutterSound() { - return true; - } - - @Override - public String[] getInfoData() { - return new String[] { "Progress:", - EnumChatFormatting.GREEN + GT_Utility.formatNumbers((mProgresstime / 20)) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - "Stored Energy:", - EnumChatFormatting.GREEN + GT_Utility.formatNumbers(getBaseMetaTileEntity().getStoredEU()) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getBaseMetaTileEntity().getEUCapacity()) - + EnumChatFormatting.RESET - + " EU", - "Probably uses: " + EnumChatFormatting.RED - + GT_Utility.formatNumbers(mEUt) - + EnumChatFormatting.RESET - + " EU/t at " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(mEUt == 0 ? 0 : mAmperage) - + EnumChatFormatting.RESET - + " A" }; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (side == getBaseMetaTileEntity().getFrontFacing() || side == mMainFacing) { - if (aPlayer.isSneaking()) { - mDisableFilter = !mDisableFilter; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.hatch.disableFilter." + mDisableFilter)); - } else { - mAllowInputFromOutputSide = !mAllowInputFromOutputSide; - GT_Utility.sendChatToPlayer( - aPlayer, - mAllowInputFromOutputSide ? GT_Utility.trans("095", "Input from Output Side allowed") - : GT_Utility.trans("096", "Input from Output Side forbidden")); - } - } - } - - @Override - public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, - EntityPlayer entityPlayer, float aX, float aY, float aZ) { - if (!entityPlayer.isSneaking()) return false; - final boolean click = super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); - if (click) return true; - if (wrenchingSide != mMainFacing) return false; - mDisableMultiStack = !mDisableMultiStack; - GT_Utility.sendChatToPlayer( - entityPlayer, - StatCollector.translateToLocal("GT5U.hatch.disableMultiStack." + mDisableMultiStack)); - return true; - } - - @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { - if (side != mMainFacing) return true; - GT_CoverBehaviorBase tBehavior = GregTech_API.getCoverBehaviorNew(aCoverID.toStack()); - return tBehavior.isGUIClickable( - side, - GT_Utility.stackToInt(aCoverID.toStack()), - tBehavior.createDataObject(), - getBaseMetaTileEntity()); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side != mMainFacing && aIndex >= getOutputSlot() && aIndex < getOutputSlot() + mOutputItems.length; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (side == mMainFacing || aIndex < getInputSlot() - || aIndex >= getInputSlot() + mInputSlotCount - || (!mAllowInputFromOutputSide && side == aBaseMetaTileEntity.getFrontFacing())) return false; - for (int i = getInputSlot(), j = i + mInputSlotCount; i < j; i++) - if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get(aStack), mInventory[i]) && mDisableMultiStack) - return i == aIndex; - return mDisableFilter || allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack); - } - - /** - * Test if given stack can be inserted into specified slot. If mDisableMultiStack is false, before execution of this - * method it is ensured there is no such kind of item inside any input slots already. Otherwise, you don't need to - * check for it anyway. - */ - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return !mDisableMultiStack || mInventory[aIndex] == null; - } - - @Override - public boolean allowSelectCircuit() { - return false; - } - - protected final ItemStack[] appendSelectedCircuit(ItemStack... inputs) { - if (allowSelectCircuit()) { - ItemStack circuit = getStackInSlot(getCircuitSlot()); - if (circuit != null) { - ItemStack[] result = Arrays.copyOf(inputs, inputs.length + 1); - result[inputs.length] = circuit; - return result; - } - } - return inputs; - } - - @Override - public int getCircuitSlot() { - return 4; - } - - @Override - public int getCircuitGUISlot() { - return 3; - } - - @Override - public List getConfigurationCircuits() { - return GregTech_API.getConfigurationCircuitList(mTier); - } - - @Override - public RecipeMap getRecipeMap() { - return null; - } - - /** - * Override this to check the Recipes yourself, super calls to this could be useful if you just want to add a - * special case - *

- * I thought about Enum too, but Enum doesn't add support for people adding other return Systems. - *

- * Funny how Eclipse marks the word Enum as not correctly spelled. - * - * @return see constants above - */ - public int checkRecipe() { - return checkRecipe(false); - } - - public static boolean isValidForLowGravity(GT_Recipe tRecipe, int dimId) { - return // TODO check or get a better solution - DimensionManager.getProvider(dimId) - .getClass() - .getName() - .contains("Orbit") - || DimensionManager.getProvider(dimId) - .getClass() - .getName() - .endsWith("Space") - || DimensionManager.getProvider(dimId) - .getClass() - .getName() - .endsWith("Asteroids") - || DimensionManager.getProvider(dimId) - .getClass() - .getName() - .endsWith("SS") - || DimensionManager.getProvider(dimId) - .getClass() - .getName() - .contains("SpaceStation"); - } - - /** - * - * @param skipOC disables OverclockedNess calculation and check - if you do you must implement your own method... - * @return DID_NOT_FIND_RECIPE = 0, FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS = 1, - * FOUND_AND_SUCCESSFULLY_USED_RECIPE = 2; - */ - public int checkRecipe(boolean skipOC) { - RecipeMap tMap = getRecipeMap(); - if (tMap == null) return DID_NOT_FIND_RECIPE; - GT_Recipe tRecipe = tMap.findRecipeQuery() - .items(getAllInputs()) - .fluids(getFillableStack()) - .specialSlot(getSpecialSlot()) - .voltage(V[mTier]) - .cachedRecipe(mLastRecipe) - .find(); - if (tRecipe == null) { - return DID_NOT_FIND_RECIPE; - } - if (tRecipe.getMetadataOrDefault(EXPLODE, false) && getBaseMetaTileEntity() != null) { - getBaseMetaTileEntity().doExplosion(V[mTier] * 4); - return DID_NOT_FIND_RECIPE; - } - if (tRecipe.getMetadataOrDefault(ON_FIRE, false) && getBaseMetaTileEntity() != null) { - getBaseMetaTileEntity().setOnFire(); - return DID_NOT_FIND_RECIPE; - } - - if (GT_Mod.gregtechproxy.mLowGravProcessing && (tRecipe.mSpecialValue == -100 || tRecipe.mSpecialValue == -300) - && !isValidForLowGravity(tRecipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe; - if (!canOutput(tRecipe)) { - mOutputBlocked++; - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - } - ICleanroom cleanroom = getCleanroom(); - if (tRecipe.mSpecialValue == -200 || tRecipe.mSpecialValue == -300) { - if (cleanroom == null || !cleanroom.isValidCleanroom() || cleanroom.getCleanness() == 0) { - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - } - } - if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs())) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - for (int i = 0; i < mOutputItems.length; i++) - if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i)) - mOutputItems[i] = tRecipe.getOutput(i); - if (tRecipe.mSpecialValue == -200 || tRecipe.mSpecialValue == -300) { - assert cleanroom != null; - for (int i = 0; i < mOutputItems.length; i++) if (mOutputItems[i] != null - && getBaseMetaTileEntity().getRandomNumber(10000) > cleanroom.getCleanness()) { - if (debugCleanroom) { - GT_Log.out.println( - "BasicMachine: Voiding output due to cleanness failure. Cleanness = " - + cleanroom.getCleanness()); - } - mOutputItems[i] = null; - } - } - mOutputFluid = tRecipe.getFluidOutput(0); - if (!skipOC) { - calculateCustomOverclock(tRecipe); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - } - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; - } - - public ITexture[] getBottomFacingPipeActive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - public ITexture[] getBottomFacingPipeInactive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - public ITexture[] getTopFacingPipeActive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - public ITexture[] getTopFacingPipeInactive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - public ITexture[] getSideFacingPipeActive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - public ITexture[] getSideFacingPipeInactive(byte aColor) { - return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - final NBTTagCompound tag = accessor.getNBTData(); - - if (tag.getBoolean("stutteringSingleBlock")) { - currenttip.add("Status: insufficient energy"); - } else { - boolean isActive = tag.getBoolean("isActiveSingleBlock"); - if (isActive) { - int mEUt = tag.getInteger("eut"); - if (!isSteampowered()) { - if (mEUt > 0) { - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.use_with_amperage", - GT_Utility.formatNumbers(mEUt), - GT_Utility.getAmperageForTier(mEUt, (byte) getInputTier()), - GT_Utility.getColoredTierNameFromTier((byte) getInputTier()))); - } else if (mEUt < 0) { - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.produce_with_amperage", - GT_Utility.formatNumbers(-mEUt), - GT_Utility.getAmperageForTier(-mEUt, (byte) getOutputTier()), - GT_Utility.getColoredTierNameFromTier((byte) getOutputTier()))); - } - } else { - if (mEUt > 0) { - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.use", - GT_Utility.formatNumbers(mEUt), - GT_Utility.getColoredTierNameFromVoltage(mEUt))); - } else if (mEUt < 0) { - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.produce", - GT_Utility.formatNumbers(-mEUt), - GT_Utility.getColoredTierNameFromVoltage(-mEUt))); - } - } - } - currenttip.add( - GT_Waila.getMachineProgressString( - isActive, - tag.getInteger("maxProgressSingleBlock"), - tag.getInteger("progressSingleBlock"))); - } - - currenttip.add( - String.format( - "Machine Facing: %s", - ForgeDirection.getOrientation(tag.getInteger("mainFacingSingleBlock")) - .name())); - - currenttip.add( - String.format( - "Output Facing: %s", - ForgeDirection.getOrientation(tag.getInteger("outputFacingSingleBlock")) - .name())); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - - tag.setInteger("progressSingleBlock", mProgresstime); - tag.setInteger("maxProgressSingleBlock", mMaxProgresstime); - tag.setInteger("mainFacingSingleBlock", mMainFacing.ordinal()); - tag.setBoolean("stutteringSingleBlock", mStuttering); - - final IGregTechTileEntity tileEntity = getBaseMetaTileEntity(); - if (tileEntity != null) { - tag.setBoolean("isActiveSingleBlock", tileEntity.isActive()); - tag.setInteger( - "outputFacingSingleBlock", - tileEntity.getFrontFacing() - .ordinal()); - if (tileEntity.isActive()) tag.setInteger("eut", mEUt); - } - } - - @Nonnull - @Override - public OverclockDescriber getOverclockDescriber() { - return overclockDescriber; - } - - // GUI stuff - - @Override - public int getCircuitSlotX() { - return 153; - } - - @Override - public int getCircuitSlotY() { - return 63; - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - if (getRecipeMap() != null) { - getRecipeMap().getFrontend() - .addGregTechLogo(builder, new Pos2d(0, 0)); - } else { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(152, 63)); - } - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - if (!isSteampowered()) { - builder.widget(createFluidAutoOutputButton()); - builder.widget(createItemAutoOutputButton()); - } - - BasicUIProperties uiProperties = getUIProperties(); - addIOSlots(builder, uiProperties); - - builder.widget(createChargerSlot(79, 62)); - - addProgressBar(builder, uiProperties); - - builder.widget( - createErrorStatusArea( - builder, - isSteampowered() ? GT_UITextures.PICTURE_STALLED_STEAM : GT_UITextures.PICTURE_STALLED_ELECTRICITY)); - } - - /** - * Override to specify UI properties if this machine doesn't work with recipemap. - */ - protected BasicUIProperties getUIProperties() { - if (getRecipeMap() != null) { - BasicUIProperties originalProperties = getRecipeMap().getFrontend() - .getUIProperties(); - return originalProperties.toBuilder() - .maxItemInputs(mInputSlotCount) - .maxItemOutputs(mOutputItems.length) - .maxFluidInputs(Math.min(originalProperties.maxFluidInputs, 1)) - .maxFluidOutputs(Math.min(originalProperties.maxFluidOutputs, 1)) - .build(); - } - return BasicUIProperties.builder() - .maxItemInputs(mInputSlotCount) - .maxItemOutputs(mOutputItems.length) - .maxFluidInputs(getCapacity() != 0 ? 1 : 0) - .maxFluidOutputs(0) - .build(); - } - - /** - * Adds item I/O, special item, and fluid I/O slots. - */ - protected void addIOSlots(ModularWindow.Builder builder, BasicUIProperties uiProperties) { - UIHelper.forEachSlots( - (i, backgrounds, pos) -> builder.widget(createItemInputSlot(i, backgrounds, pos)), - (i, backgrounds, pos) -> builder.widget(createItemOutputSlot(i, backgrounds, pos)), - (i, backgrounds, pos) -> builder.widget(createSpecialSlot(backgrounds, pos, uiProperties)), - (i, backgrounds, pos) -> builder.widget(createFluidInputSlot(backgrounds, pos)), - (i, backgrounds, pos) -> builder.widget(createFluidOutputSlot(backgrounds, pos)), - getGUITextureSet().getItemSlot(), - getGUITextureSet().getFluidSlot(), - uiProperties, - uiProperties.maxItemInputs, - uiProperties.maxItemOutputs, - uiProperties.maxFluidInputs, - uiProperties.maxFluidOutputs, - getSteamVariant(), - Pos2d.ZERO); - } - - protected void addProgressBar(ModularWindow.Builder builder, BasicUIProperties uiProperties) { - boolean isSteamPowered = isSteampowered(); - RecipeMap recipeMap = getRecipeMap(); - if (!isSteamPowered && uiProperties.progressBarTexture == null) { - if (recipeMap != null) { - // Require progress bar texture for machines working with recipemap, otherwise permit - throw new RuntimeException("Missing progressbar texture for " + recipeMap.unlocalizedName); - } else { - return; - } - } - if (isSteamPowered && uiProperties.progressBarTextureSteam == null) { - if (recipeMap != null) { - throw new RuntimeException("Missing steam progressbar texture for " + recipeMap.unlocalizedName); - } else { - return; - } - } - - builder.widget( - setNEITransferRect( - new ProgressBar() - .setProgress(() -> maxProgresstime() != 0 ? (float) getProgresstime() / maxProgresstime() : 0) - .setTexture( - isSteamPowered ? uiProperties.progressBarTextureSteam.get(getSteamVariant()) - : uiProperties.progressBarTexture.get(), - uiProperties.progressBarImageSize) - .setDirection(uiProperties.progressBarDirection) - .setPos(uiProperties.progressBarPos) - .setSize(uiProperties.progressBarSize), - uiProperties.neiTransferRectId)); - addProgressBarSpecialTextures(builder, uiProperties); - } - - /** - * Override this as needed instead of calling. - */ - protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) { - return (SlotWidget) new SlotWidget(inventoryHandler, getInputSlot() + index).setAccess(true, true) - .setBackground(backgrounds) - .setPos(pos); - } - - /** - * Override this as needed instead of calling. - */ - protected SlotWidget createItemOutputSlot(int index, IDrawable[] backgrounds, Pos2d pos) { - return (SlotWidget) new SlotWidget(inventoryHandler, getOutputSlot() + index).setAccess(true, false) - .setBackground(backgrounds) - .setPos(pos); - } - - /** - * Override this as needed instead of calling. - */ - protected SlotWidget createSpecialSlot(IDrawable[] backgrounds, Pos2d pos, BasicUIProperties uiProperties) { - return (SlotWidget) new SlotWidget(inventoryHandler, getSpecialSlotIndex()).setAccess(true, true) - .disableShiftInsert() - .setGTTooltip( - () -> mTooltipCache.getData(uiProperties.useSpecialSlot ? SPECIAL_SLOT_TOOLTIP : UNUSED_SLOT_TOOLTIP)) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setBackground(backgrounds) - .setPos(pos); - } - - protected FluidSlotWidget createFluidInputSlot(IDrawable[] backgrounds, Pos2d pos) { - return (FluidSlotWidget) new FluidSlotWidget(fluidTank).setBackground(backgrounds) - .setPos(pos); - } - - protected FluidSlotWidget createFluidOutputSlot(IDrawable[] backgrounds, Pos2d pos) { - return (FluidSlotWidget) new FluidSlotWidget(fluidOutputTank).setInteraction(true, false) - .setBackground(backgrounds) - .setPos(pos); - } - - @Override - protected SlotWidget createChargerSlot(int x, int y) { - if (isSteampowered()) { - return (SlotWidget) createChargerSlot(x, y, UNUSED_SLOT_TOOLTIP, new String[0]) - .setBackground(getGUITextureSet().getItemSlot()); - } else { - return super.createChargerSlot(x, y); - } - } - - protected CycleButtonWidget createItemAutoOutputButton() { - return (CycleButtonWidget) new CycleButtonWidget().setToggle(() -> mItemTransfer, val -> mItemTransfer = val) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_ITEM) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setGTTooltip(() -> mTooltipCache.getData(ITEM_TRANSFER_TOOLTIP)) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(25, 62) - .setSize(18, 18); - } - - protected CycleButtonWidget createFluidAutoOutputButton() { - return (CycleButtonWidget) new CycleButtonWidget().setToggle(() -> mFluidTransfer, val -> mFluidTransfer = val) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_FLUID) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setGTTooltip(() -> mTooltipCache.getData(FLUID_TRANSFER_TOOLTIP)) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(7, 62) - .setSize(18, 18); - } - - protected Widget setNEITransferRect(Widget widget, String transferRectID) { - if (GT_Utility.isStringInvalid(transferRectID)) { - return widget; - } - final String transferRectTooltip; - if (isSteampowered()) { - transferRectTooltip = StatCollector - .translateToLocalFormatted(NEI_TRANSFER_STEAM_TOOLTIP, overclockDescriber.getTierString()); - } else { - transferRectTooltip = StatCollector - .translateToLocalFormatted(NEI_TRANSFER_VOLTAGE_TOOLTIP, overclockDescriber.getTierString()); - } - widget.setNEITransferRect(transferRectID, new Object[] { overclockDescriber }, transferRectTooltip); - return widget; - } - - protected void addProgressBarSpecialTextures(ModularWindow.Builder builder, BasicUIProperties uiProperties) { - if (isSteampowered()) { - for (Pair> specialTexture : uiProperties.specialTexturesSteam) { - builder.widget( - new DrawableWidget().setDrawable( - specialTexture.getLeft() - .get(getSteamVariant())) - .setSize( - specialTexture.getRight() - .getLeft()) - .setPos( - specialTexture.getRight() - .getRight())); - } - } else { - for (Pair> specialTexture : uiProperties.specialTextures) { - builder.widget( - new DrawableWidget().setDrawable(specialTexture.getLeft()) - .setSize( - specialTexture.getRight() - .getLeft()) - .setPos( - specialTexture.getRight() - .getRight())); - } - } - } - - protected DrawableWidget createErrorStatusArea(ModularWindow.Builder builder, IDrawable picture) { - return (DrawableWidget) new DrawableWidget().setDrawable(picture) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setEnabled( - widget -> !widget.getTooltip() - .isEmpty()) - .dynamicTooltip(this::getErrorDescriptions) - .dynamicTooltipShift(this::getErrorDescriptionsShift) - .setPos(79, 44) - .setSize(18, 18) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer(() -> mStuttering, val -> mStuttering = val), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer( - () -> getBaseMetaTileEntity().getErrorDisplayID(), - val -> getBaseMetaTileEntity().setErrorDisplayID(val)), - builder, - (widget, val) -> widget.notifyTooltipChange()); - } - - protected List getErrorDescriptions() { - final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip(); - return tooltip != null ? tooltip.text : Collections.emptyList(); - } - - protected List getErrorDescriptionsShift() { - final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip(); - return tooltip != null ? tooltip.shiftText : Collections.emptyList(); - } - - protected GT_TooltipDataCache.TooltipData getErrorTooltip() { - if (isSteampowered()) { - if ((getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0) { - return mTooltipCache.getData(STALLED_VENT_TOOLTIP); - } - } - if (mStuttering) { - return mTooltipCache.getData( - STALLED_STUTTERING_TOOLTIP, - StatCollector.translateToLocal(POWER_SOURCE_KEY + (isSteampowered() ? "steam" : "power"))); - } - return null; - } - - protected static int getCapacityForTier(int tier) { - return switch (tier) { - case 0 -> 8000; - case 1 -> 16000; - case 2 -> 32000; - case 3 -> 64000; - case 4 -> 128000; - default -> 256000; - }; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java deleted file mode 100644 index 5eb648d560..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java +++ /dev/null @@ -1,387 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.D1; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_TOP; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import java.util.Arrays; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.SteamVariant; -import gregtech.api.enums.TierEU; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.overclockdescriber.OverclockDescriber; -import gregtech.api.objects.overclockdescriber.SteamOverclockDescriber; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple - * Machine - */ -public abstract class GT_MetaTileEntity_BasicMachine_Bronze extends GT_MetaTileEntity_BasicMachine { - - private static final String TT_machineType = "GT5U.MBTT.MachineType"; - private static final int NEEDS_STEAM_VENTING = 64; - public boolean mNeedsSteamVenting = false; - - public GT_MetaTileEntity_BasicMachine_Bronze(int aID, String aName, String aNameRegional, String aDescription, - int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) { - super(aID, aName, aNameRegional, aHighPressure ? 2 : 1, 0, aDescription, aInputSlotCount, aOutputSlotCount); - } - - public GT_MetaTileEntity_BasicMachine_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures, - int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) { - super(aName, aHighPressure ? 2 : 1, 0, aDescription, aTextures, aInputSlotCount, aOutputSlotCount); - } - - protected boolean isBricked() { - return false; - } - - @Override - public OverclockDescriber createOverclockDescriber() { - return new SteamOverclockDescriber(SteamVariant.BRONZE, 1, 2); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("mNeedsSteamVenting", mNeedsSteamVenting); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mNeedsSteamVenting = aNBT.getBoolean("mNeedsSteamVenting"); - } - - @Override - public boolean isElectric() { - return false; - } - - @Override - public boolean isEnetInput() { - return false; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return false; - } - - @Override - public long maxEUStore() { - return 0; - } - - @Override - public long maxEUInput() { - return 0; - } - - @Override - public int rechargerSlotCount() { - return 0; - } - - @Override - public int dechargerSlotCount() { - return 0; - } - - @Override - public boolean isSteampowered() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return super.isFacingValid(facing) && facing != mMainFacing; - } - - @Override - public long getMinimumStoredEU() { - return 1000; - } - - @Override - public long maxSteamStore() { - return 16000; - } - - @Override - public boolean isLiquidInput(ForgeDirection side) { - return side != mMainFacing; - } - - @Override - public boolean isLiquidOutput(ForgeDirection side) { - return side != mMainFacing; - } - - @Override - public boolean doesAutoOutput() { - return false; - } - - @Override - public boolean allowToCheckRecipe() { - if (mNeedsSteamVenting - && getBaseMetaTileEntity().getCoverIDAtSide(getBaseMetaTileEntity().getFrontFacing()) == 0 - && !GT_Utility.hasBlockHitBox( - getBaseMetaTileEntity().getWorld(), - getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1), - getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1), - getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1))) { - sendSound((byte) 9); - mNeedsSteamVenting = false; - try { - for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld() - .getEntitiesWithinAABB( - EntityLivingBase.class, - AxisAlignedBB.getBoundingBox( - getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1), - getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1), - getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1), - getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1) + 1, - getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1) + 1, - getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1) + 1))) { - GT_Utility.applyHeatDamage(tLiving, getSteamDamage()); - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - } - return !mNeedsSteamVenting; - } - - @Override - public int checkRecipe() { - GT_Recipe tRecipe = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, TierEU.LV, null, getAllInputs()); - if ((tRecipe != null) && (canOutput(tRecipe.mOutputs)) - && (tRecipe.isRecipeInputEqual(true, null, getAllInputs()))) { - this.mOutputItems[0] = tRecipe.getOutput(0); - calculateCustomOverclock(tRecipe); - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - return DID_NOT_FIND_RECIPE; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - // Super already zeroed out setErrorDisplayID, add additional error codes here. - aBaseMetaTileEntity.setErrorDisplayID(aBaseMetaTileEntity.getErrorDisplayID() | (mNeedsSteamVenting ? 64 : 0)); - } - - @Override - public void endProcess() { - if (isSteampowered()) mNeedsSteamVenting = true; - } - - @Override - public void doSound(byte aIndex, double aX, double aY, double aZ) { - super.doSound(aIndex, aX, aY, aZ); - if (aIndex == 9) { - GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 5, 1.0F, aX, aY, aZ); - - new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) - .setWorld(getBaseMetaTileEntity().getWorld()) - .setMotion( - getBaseMetaTileEntity().getFrontFacing().offsetX / 5.0, - getBaseMetaTileEntity().getFrontFacing().offsetY / 5.0, - getBaseMetaTileEntity().getFrontFacing().offsetZ / 5.0) - .times( - 8, - x -> x - .setPosition( - aX - 0.5 + XSTR_INSTANCE.nextFloat(), - aY - 0.5 + XSTR_INSTANCE.nextFloat(), - aZ - 0.5 + XSTR_INSTANCE.nextFloat()) - .run()); - } - } - - @Override - public boolean isGivingInformation() { - return false; - } - - @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { - return GregTech_API.getCoverBehaviorNew(aCoverID.toStack()) - .isSimpleCover() && super.allowCoverOnSide(side, aCoverID); - } - - public float getSteamDamage() { - return 6.0F * mTier; - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getBottomFacingPipeActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getBottomFacingPipeInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getTopFacingPipeActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getTopFacingPipeInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getSideFacingPipeActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getSideFacingPipeInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.BRONZE; - } - - @Override - public GUITextureSet getGUITextureSet() { - return GUITextureSet.STEAM.apply(getSteamVariant()); - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(152, 63)); - } - - @Override - protected FluidSlotWidget createFluidInputSlot(IDrawable[] backgrounds, Pos2d pos) { - return null; - } - - @Override - protected FluidSlotWidget createFluidOutputSlot(IDrawable[] backgrounds, Pos2d pos) { - return null; - } - - @Override - public String[] getDescription() { - String[] description = Arrays.copyOf(mDescriptionArray, mDescriptionArray.length + 1); - description[mDescriptionArray.length] = StatCollector.translateToLocal(TT_machineType) + ": " - + EnumChatFormatting.YELLOW - + StatCollector.translateToLocal(this.getRecipeMap().unlocalizedName) - + EnumChatFormatting.RESET; - return description; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java deleted file mode 100644 index a10e735843..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java +++ /dev/null @@ -1,818 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.GT_Values.W; -import static gregtech.api.enums.GT_Values.ticksBetweenSounds; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; -import static net.minecraftforge.common.util.ForgeDirection.UP; - -import java.util.Locale; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.oredict.OreDictionary; - -import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; -import com.gtnewhorizons.modularui.api.drawable.UITexture; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures.BlockIcons.CustomIcon; -import gregtech.api.enums.Tier; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.recipe.BasicUIProperties; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.ExternalMaterials; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple - * Machine - */ -public class GT_MetaTileEntity_BasicMachine_GT_Recipe extends GT_MetaTileEntity_BasicMachine { - - private final RecipeMap mRecipes; - private final int mTankCapacity; - private final SpecialEffects mSpecialEffect; - private final ResourceLocation mSoundResourceLocation; - private FallbackableUITexture progressBarTexture; - private int recipeCatalystPriority; - - /** - * Registers machine with single-line description, specific tank capacity, and sound specified by ResourceLocation. - */ - public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier, - String aDescription, RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, - ResourceLocation aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { - this( - aID, - aName, - aNameRegional, - aTier, - new String[] { aDescription }, - aRecipes, - aInputSlots, - aOutputSlots, - aTankCapacity, - aSound, - aSpecialEffect, - aOverlays, - aRecipe); - } - - /** - * Registers machine with multi-line descriptions, specific tank capacity, and sound specified by ResourceLocation. - */ - public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription, RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, - ResourceLocation aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { - super( - aID, - aName, - aNameRegional, - aTier, - aRecipes.getAmperage(), - aDescription, - aInputSlots, - aOutputSlots, - TextureFactory.of( - TextureFactory.of( - new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_ACTIVE")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_ACTIVE_GLOW"))) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_GLOW"))) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of( - new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_ACTIVE")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_ACTIVE_GLOW"))) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_GLOW"))) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of( - new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_ACTIVE")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_ACTIVE_GLOW"))) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_GLOW"))) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of( - new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_ACTIVE")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_ACTIVE_GLOW"))) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM")), - TextureFactory.builder() - .addIcon( - (new CustomIcon( - "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_GLOW"))) - .glow() - .build())); - this.mTankCapacity = aTankCapacity; - this.mSpecialEffect = aSpecialEffect; - this.mRecipes = aRecipes; - this.mSoundResourceLocation = aSound; - this.progressBarTexture = mRecipes.getFrontend() - .getUIProperties().progressBarTexture; - - // TODO: CHECK - if (aRecipe != null) { - for (int i = 3; i < aRecipe.length; i++) { - if (!(aRecipe[i] instanceof X)) continue; - - // spotless:off - aRecipe[i] = switch ((X) aRecipe[i]) { - case CIRCUIT -> Tier.ELECTRIC[this.mTier].mManagingObject; - case BETTER_CIRCUIT -> Tier.ELECTRIC[this.mTier].mBetterManagingObject; - case HULL -> Tier.ELECTRIC[this.mTier].mHullObject; - case WIRE -> Tier.ELECTRIC[this.mTier].mConductingObject; - case WIRE4 -> Tier.ELECTRIC[this.mTier].mLargerConductingObject; - case STICK_DISTILLATION -> OrePrefixes.stick.get(Materials.Blaze); - - case GLASS -> switch (this.mTier) { - case 0, 1, 2, 3 -> new ItemStack(Blocks.glass, 1, W); - case 4, 5, 6, 7, 8 -> "blockGlass" + VN[aTier]; - default -> "blockGlass" + VN[8]; - }; - - case PLATE -> switch (this.mTier) { - case 0, 1 -> OrePrefixes.plate.get(Materials.Steel); - case 2 -> OrePrefixes.plate.get(Materials.Aluminium); - case 3 -> OrePrefixes.plate.get(Materials.StainlessSteel); - case 4 -> OrePrefixes.plate.get(Materials.Titanium); - case 5 -> OrePrefixes.plate.get(Materials.TungstenSteel); - case 6 -> OrePrefixes.plate.get(Materials.HSSG); - case 7 -> OrePrefixes.plate.get(Materials.HSSE); - default -> OrePrefixes.plate.get(Materials.Neutronium); - }; - - case PIPE -> switch (this.mTier) { - case 0, 1 -> OrePrefixes.pipeMedium.get(Materials.Bronze); - case 2 -> OrePrefixes.pipeMedium.get(Materials.Steel); - case 3 -> OrePrefixes.pipeMedium.get(Materials.StainlessSteel); - case 4 -> OrePrefixes.pipeMedium.get(Materials.Titanium); - case 5 -> OrePrefixes.pipeMedium.get(Materials.TungstenSteel); - case 6 -> OrePrefixes.pipeSmall.get(Materials.Ultimate); - case 7 -> OrePrefixes.pipeMedium.get(Materials.Ultimate); - case 8 -> OrePrefixes.pipeLarge.get(Materials.Ultimate); - default -> OrePrefixes.pipeHuge.get(Materials.Ultimate); - }; - - case COIL_HEATING -> switch (this.mTier) { - case 0, 1 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); - case 2 -> OrePrefixes.wireGt02.get(Materials.Cupronickel); - case 3 -> OrePrefixes.wireGt02.get(Materials.Kanthal); - case 4 -> OrePrefixes.wireGt02.get(Materials.Nichrome); - case 5 -> OrePrefixes.wireGt02.get(Materials.TPV); - case 6 -> OrePrefixes.wireGt02.get(Materials.HSSG); - case 7 -> OrePrefixes.wireGt02.get(Materials.Naquadah); - case 8 -> OrePrefixes.wireGt02.get(Materials.NaquadahAlloy); - case 9 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); - default -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); - }; - - case COIL_HEATING_DOUBLE -> switch (this.mTier) { - case 0, 1 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); - case 2 -> OrePrefixes.wireGt04.get(Materials.Cupronickel); - case 3 -> OrePrefixes.wireGt04.get(Materials.Kanthal); - case 4 -> OrePrefixes.wireGt04.get(Materials.Nichrome); - case 5 -> OrePrefixes.wireGt04.get(Materials.TPV); - case 6 -> OrePrefixes.wireGt04.get(Materials.HSSG); - case 7 -> OrePrefixes.wireGt04.get(Materials.Naquadah); - case 8 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); - case 9 -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); - default -> OrePrefixes.wireGt16.get(Materials.NaquadahAlloy); - }; - - case STICK_MAGNETIC -> switch (this.mTier) { - case 0, 1 -> OrePrefixes.stick.get(Materials.IronMagnetic); - case 2, 3 -> OrePrefixes.stick.get(Materials.SteelMagnetic); - case 4, 5 -> OrePrefixes.stick.get(Materials.NeodymiumMagnetic); - case 6, 7, 8, 9 -> OrePrefixes.stick.get(Materials.SamariumMagnetic); - default -> OrePrefixes.stick.get(Materials.TengamAttuned); - }; - - case STICK_ELECTROMAGNETIC -> switch (this.mTier) { - case 0, 1 -> OrePrefixes.stick.get(Materials.AnyIron); - case 2, 3 -> OrePrefixes.stick.get(Materials.Steel); - case 4 -> OrePrefixes.stick.get(Materials.Neodymium); - default -> OrePrefixes.stick.get(Materials.VanadiumGallium); - }; - - case COIL_ELECTRIC -> switch (this.mTier) { - case 0 -> OrePrefixes.wireGt01.get(Materials.Lead); - case 1 -> OrePrefixes.wireGt02.get(Materials.Tin); - case 2 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); - case 3 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); - case 4 -> OrePrefixes.wireGt08.get(Materials.AnnealedCopper); - case 5 -> OrePrefixes.wireGt16.get(Materials.AnnealedCopper); - case 6 -> OrePrefixes.wireGt04.get(Materials.YttriumBariumCuprate); - case 7 -> OrePrefixes.wireGt08.get(Materials.Iridium); - default -> OrePrefixes.wireGt16.get(Materials.Osmium); - }; - - case ROBOT_ARM -> switch (this.mTier) { - case 0, 1 -> ItemList.Robot_Arm_LV; - case 2 -> ItemList.Robot_Arm_MV; - case 3 -> ItemList.Robot_Arm_HV; - case 4 -> ItemList.Robot_Arm_EV; - case 5 -> ItemList.Robot_Arm_IV; - case 6 -> ItemList.Robot_Arm_LuV; - case 7 -> ItemList.Robot_Arm_ZPM; - case 8 -> ItemList.Robot_Arm_UV; - case 9 -> ItemList.Robot_Arm_UHV; - case 10 -> ItemList.Robot_Arm_UEV; - case 11 -> ItemList.Robot_Arm_UIV; - case 12 -> ItemList.Robot_Arm_UMV; - case 13 -> ItemList.Robot_Arm_UXV; - default -> ItemList.Robot_Arm_MAX; - }; - - case PUMP -> switch (this.mTier) { - case 0, 1 -> ItemList.Electric_Pump_LV; - case 2 -> ItemList.Electric_Pump_MV; - case 3 -> ItemList.Electric_Pump_HV; - case 4 -> ItemList.Electric_Pump_EV; - case 5 -> ItemList.Electric_Pump_IV; - case 6 -> ItemList.Electric_Pump_LuV; - case 7 -> ItemList.Electric_Pump_ZPM; - case 8 -> ItemList.Electric_Pump_UV; - case 9 -> ItemList.Electric_Pump_UHV; - case 10 -> ItemList.Electric_Pump_UEV; - case 11 -> ItemList.Electric_Pump_UIV; - case 12 -> ItemList.Electric_Pump_UMV; - case 13 -> ItemList.Electric_Pump_UXV; - default -> ItemList.Electric_Pump_MAX; - }; - - case MOTOR -> switch (this.mTier) { - case 0, 1 -> ItemList.Electric_Motor_LV; - case 2 -> ItemList.Electric_Motor_MV; - case 3 -> ItemList.Electric_Motor_HV; - case 4 -> ItemList.Electric_Motor_EV; - case 5 -> ItemList.Electric_Motor_IV; - case 6 -> ItemList.Electric_Motor_LuV; - case 7 -> ItemList.Electric_Motor_ZPM; - case 8 -> ItemList.Electric_Motor_UV; - case 9 -> ItemList.Electric_Motor_UHV; - case 10 -> ItemList.Electric_Motor_UEV; - case 11 -> ItemList.Electric_Motor_UIV; - case 12 -> ItemList.Electric_Motor_UMV; - case 13 -> ItemList.Electric_Motor_UXV; - default -> ItemList.Electric_Motor_MAX; - }; - - case PISTON -> switch (this.mTier) { - case 0, 1 -> ItemList.Electric_Piston_LV; - case 2 -> ItemList.Electric_Piston_MV; - case 3 -> ItemList.Electric_Piston_HV; - case 4 -> ItemList.Electric_Piston_EV; - case 5 -> ItemList.Electric_Piston_IV; - case 6 -> ItemList.Electric_Piston_LuV; - case 7 -> ItemList.Electric_Piston_ZPM; - case 8 -> ItemList.Electric_Piston_UV; - case 9 -> ItemList.Electric_Piston_UHV; - case 10 -> ItemList.Electric_Piston_UEV; - case 11 -> ItemList.Electric_Piston_UIV; - case 12 -> ItemList.Electric_Piston_UMV; - case 13 -> ItemList.Electric_Piston_UXV; - default -> ItemList.Electric_Piston_MAX; - }; - - case CONVEYOR -> switch (this.mTier) { - case 0, 1 -> ItemList.Conveyor_Module_LV; - case 2 -> ItemList.Conveyor_Module_MV; - case 3 -> ItemList.Conveyor_Module_HV; - case 4 -> ItemList.Conveyor_Module_EV; - case 5 -> ItemList.Conveyor_Module_IV; - case 6 -> ItemList.Conveyor_Module_LuV; - case 7 -> ItemList.Conveyor_Module_ZPM; - case 8 -> ItemList.Conveyor_Module_UV; - case 9 -> ItemList.Conveyor_Module_UHV; - case 10 -> ItemList.Conveyor_Module_UEV; - case 11 -> ItemList.Conveyor_Module_UIV; - case 12 -> ItemList.Conveyor_Module_UMV; - case 13 -> ItemList.Conveyor_Module_UXV; - default -> ItemList.Conveyor_Module_MAX; - }; - - case EMITTER -> switch (this.mTier) { - case 0, 1 -> ItemList.Emitter_LV; - case 2 -> ItemList.Emitter_MV; - case 3 -> ItemList.Emitter_HV; - case 4 -> ItemList.Emitter_EV; - case 5 -> ItemList.Emitter_IV; - case 6 -> ItemList.Emitter_LuV; - case 7 -> ItemList.Emitter_ZPM; - case 8 -> ItemList.Emitter_UV; - case 9 -> ItemList.Emitter_UHV; - case 10 -> ItemList.Emitter_UEV; - case 11 -> ItemList.Emitter_UIV; - case 12 -> ItemList.Emitter_UMV; - case 13 -> ItemList.Emitter_UXV; - default -> ItemList.Emitter_MAX; - }; - - case SENSOR -> switch (this.mTier) { - case 0, 1 -> ItemList.Sensor_LV; - case 2 -> ItemList.Sensor_MV; - case 3 -> ItemList.Sensor_HV; - case 4 -> ItemList.Sensor_EV; - case 5 -> ItemList.Sensor_IV; - case 6 -> ItemList.Sensor_LuV; - case 7 -> ItemList.Sensor_ZPM; - case 8 -> ItemList.Sensor_UV; - case 9 -> ItemList.Sensor_UHV; - case 10 -> ItemList.Sensor_UEV; - case 11 -> ItemList.Sensor_UIV; - case 12 -> ItemList.Sensor_UMV; - case 13 -> ItemList.Sensor_UXV; - default -> ItemList.Sensor_MAX; - }; - - case FIELD_GENERATOR -> switch (this.mTier) { - case 0, 1 -> ItemList.Field_Generator_LV; - case 2 -> ItemList.Field_Generator_MV; - case 3 -> ItemList.Field_Generator_HV; - case 4 -> ItemList.Field_Generator_EV; - case 5 -> ItemList.Field_Generator_IV; - case 6 -> ItemList.Field_Generator_LuV; - case 7 -> ItemList.Field_Generator_ZPM; - case 8 -> ItemList.Field_Generator_UV; - case 9 -> ItemList.Field_Generator_UHV; - case 10 -> ItemList.Field_Generator_UEV; - case 11 -> ItemList.Field_Generator_UIV; - case 12 -> ItemList.Field_Generator_UMV; - case 13 -> ItemList.Field_Generator_UXV; - default -> ItemList.Field_Generator_MAX; - }; - - case ROTOR -> switch (this.mTier) { - case 0, 1 -> OrePrefixes.rotor.get(Materials.Tin); - case 2 -> OrePrefixes.rotor.get(Materials.Bronze); - case 3 -> OrePrefixes.rotor.get(Materials.Steel); - case 4 -> OrePrefixes.rotor.get(Materials.StainlessSteel); - case 5 -> OrePrefixes.rotor.get(Materials.TungstenSteel); - case 6 -> OrePrefixes.rotor.get(ExternalMaterials.getRhodiumPlatedPalladium()); - case 7 -> OrePrefixes.rotor.get(Materials.Iridium); - default -> OrePrefixes.rotor.get(Materials.Osmium); - }; - - default -> throw new IllegalArgumentException("MISSING TIER MAPPING FOR: " + aRecipe[i] + " AT TIER " + this.mTier); - }; - // spotless:on - } - - if (!GT_ModHandler.addCraftingRecipe( - getStackForm(1), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.BUFFERED - | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - aRecipe)) { - throw new IllegalArgumentException("INVALID CRAFTING RECIPE FOR: " + getStackForm(1).getDisplayName()); - } - } - } - - /** - * Registers machine with single-line description, auto-scaled fluid tank, and sound specified by SoundResource. - */ - public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier, - String aDescription, RecipeMap aRecipes, int aInputSlots, int aOutputSlots, boolean usesFluids, - SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { - this( - aID, - aName, - aNameRegional, - aTier, - aDescription, - aRecipes, - aInputSlots, - aOutputSlots, - usesFluids ? getCapacityForTier(aTier) : 0, - aSound.resourceLocation, - aSpecialEffect, - aOverlays, - aRecipe); - } - - /** - * Registers machine with multi-line descriptions, auto-scaled fluid tank, and sound specified by SoundResource. - */ - public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription, RecipeMap aRecipes, int aInputSlots, int aOutputSlots, boolean usesFluids, - SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { - this( - aID, - aName, - aNameRegional, - aTier, - aDescription, - aRecipes, - aInputSlots, - aOutputSlots, - usesFluids ? getCapacityForTier(aTier) : 0, - aSound.resourceLocation, - aSpecialEffect, - aOverlays, - aRecipe); - } - - /** - * Registers machine with single-line description, specific tank capacity, and sound specified by SoundResource. - */ - public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier, - String aDescription, RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, - SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { - this( - aID, - aName, - aNameRegional, - aTier, - aDescription, - aRecipes, - aInputSlots, - aOutputSlots, - aTankCapacity, - aSound.resourceLocation, - aSpecialEffect, - aOverlays, - aRecipe); - } - - /** - * Registers machine with multi-line descriptions, specific tank capacity, and sound specified by SoundResource. - */ - public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription, RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, - SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { - this( - aID, - aName, - aNameRegional, - aTier, - aDescription, - aRecipes, - aInputSlots, - aOutputSlots, - aTankCapacity, - aSound.resourceLocation, - aSpecialEffect, - aOverlays, - aRecipe); - } - - /** - * For {@link #newMetaEntity}. - */ - public GT_MetaTileEntity_BasicMachine_GT_Recipe(String aName, int aTier, String[] aDescription, - RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, int aAmperage, - ITexture[][][] aTextures, ResourceLocation aSound, SpecialEffects aSpecialEffect) { - super(aName, aTier, aAmperage, aDescription, aTextures, aInputSlots, aOutputSlots); - this.mTankCapacity = aTankCapacity; - this.mSpecialEffect = aSpecialEffect; - this.mRecipes = aRecipes; - this.mSoundResourceLocation = aSound; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BasicMachine_GT_Recipe( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mRecipes, - this.mInputSlotCount, - this.mOutputItems == null ? 0 : this.mOutputItems.length, - this.mTankCapacity, - this.mAmperage, - this.mTextures, - this.mSoundResourceLocation, - this.mSpecialEffect).setProgressBarTexture(this.progressBarTexture) - .setRecipeCatalystPriority(this.recipeCatalystPriority); - } - - public GT_MetaTileEntity_BasicMachine_GT_Recipe setProgressBarTexture(FallbackableUITexture progressBarTexture) { - this.progressBarTexture = progressBarTexture; - return this; - } - - public GT_MetaTileEntity_BasicMachine_GT_Recipe setProgressBarTextureName(String name, UITexture fallback) { - return setProgressBarTexture(GT_UITextures.fallbackableProgressbar(name, fallback)); - } - - public GT_MetaTileEntity_BasicMachine_GT_Recipe setProgressBarTextureName(String name) { - return setProgressBarTextureName(name, GT_UITextures.PROGRESSBAR_ARROW); - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (!super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)) return false; - switch (this.mInputSlotCount) { - case 0 -> { - return false; - } - case 1 -> { - if (this.getFillableStack() == null) return this.getRecipeMap() - .containsInput(aStack); - else return this.getRecipeMap() - .findRecipe( - this.getBaseMetaTileEntity(), - this.mLastRecipe, - true, - true, - V[this.mTier], - new FluidStack[] { this.getFillableStack() }, - this.getSpecialSlot(), - appendSelectedCircuit(aStack)) - != null; - } - case 2 -> { - return ((this.getInputAt(0) != null && this.getInputAt(1) != null) - || (this.getInputAt(0) == null && this.getInputAt(1) == null ? this.getRecipeMap() - .containsInput(aStack) - : (this.getRecipeMap() - .containsInput(aStack) - && this.getRecipeMap() - .findRecipe( - this.getBaseMetaTileEntity(), - this.mLastRecipe, - true, - true, - V[this.mTier], - new FluidStack[] { this.getFillableStack() }, - this.getSpecialSlot(), - aIndex == this.getInputSlot() ? appendSelectedCircuit(aStack, this.getInputAt(1)) - : appendSelectedCircuit(this.getInputAt(0), aStack)) - != null))); - } - default -> { - int tID = this.getBaseMetaTileEntity() - .getMetaTileID(); - if (tID >= 211 && tID <= 218 || tID >= 1180 && tID <= 1187 || tID >= 10780 && tID <= 10786) { // assembler - // lv-iv; - // circuit - // asseblers - // lv - - // uv; - // assemblers - // luv-uev - if (GT_Utility.isStackValid(aStack)) for (int oreID : OreDictionary.getOreIDs(aStack)) { - if (OreDictionary.getOreName(oreID) - .startsWith("circuit")) return true; - } - } - return this.getRecipeMap() - .containsInput(aStack); - } - } - } - - @Override - public boolean allowSelectCircuit() { - return true; - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPreTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) { - // noinspection SwitchStatementWithTooFewBranches - switch (this.mSpecialEffect) { - case TOP_SMOKE -> { - if (aBaseMetaTileEntity.getFrontFacing() != UP && aBaseMetaTileEntity.getCoverIDAtSide(UP) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(UP)) { - - new ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D) - .setIdentifier(ParticleFX.SMOKE) - .setPosition( - aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F, - aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F, - aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F) - .setWorld(aBaseMetaTileEntity.getWorld()) - .run(); - } - } - default -> {} - } - } - } - - /** - * Handles {@link Block#randomDisplayTick} driven Special Effects - * - * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - - // noinspection SwitchStatementWithTooFewBranches - switch (this.mSpecialEffect) { - case MAIN_RANDOM_SPARKS -> { - // Random Sparkles at main face - if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) { - - final ForgeDirection mainFacing = this.mMainFacing; - - if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 - && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) { - - final double oX = aBaseMetaTileEntity.getXCoord(); - final double oY = aBaseMetaTileEntity.getYCoord(); - final double oZ = aBaseMetaTileEntity.getZCoord(); - final double offset = 0.02D; - final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; - - final double x, y, z, mX, mZ; - - y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; - - if (mainFacing == ForgeDirection.WEST) { - x = oX - offset; - mX = -.05D; - z = oZ + horizontal; - mZ = 0D; - } else if (mainFacing == ForgeDirection.EAST) { - x = oX + offset; - mX = .05D; - z = oZ + horizontal; - mZ = 0D; - } else if (mainFacing == ForgeDirection.NORTH) { - x = oX + horizontal; - mX = 0D; - z = oZ - offset; - mZ = -.05D; - } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) - { - x = oX + horizontal; - mX = 0D; - z = oZ + offset; - mZ = .05D; - } - - ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ) - .setPosition(x, y, z) - .setWorld(getBaseMetaTileEntity().getWorld()); - particleEventBuilder.setIdentifier(ParticleFX.LAVA) - .run(); - } - } - } - default -> {} - } - } - - @Override - public RecipeMap getRecipeMap() { - return this.mRecipes; - } - - @Override - public int getRecipeCatalystPriority() { - return recipeCatalystPriority; - } - - public GT_MetaTileEntity_BasicMachine_GT_Recipe setRecipeCatalystPriority(int recipeCatalystPriority) { - this.recipeCatalystPriority = recipeCatalystPriority; - return this; - } - - @Override - public int getCapacity() { - return this.mTankCapacity; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1 && this.mSoundResourceLocation != null - && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourceDomain()) - && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourcePath())) - GT_Utility.doSoundAtClient(this.mSoundResourceLocation, 100, 1.0F, aX, aY, aZ); - } - - @Override - public void startProcess() { - BaseMetaTileEntity myMetaTileEntity = ((BaseMetaTileEntity) this.getBaseMetaTileEntity()); - // Added to throttle sounds. To reduce lag, this is on the server side so BlockUpdate packets aren't sent. - if (myMetaTileEntity.mTickTimer > (myMetaTileEntity.mLastSoundTick + ticksBetweenSounds)) { - if (this.mSoundResourceLocation != null - && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourceDomain()) - && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourcePath())) - this.sendLoopStart((byte) 1); - // Does not have overflow protection, but they are longs. - myMetaTileEntity.mLastSoundTick = myMetaTileEntity.mTickTimer; - } - } - - @Override - protected BasicUIProperties getUIProperties() { - return super.getUIProperties().toBuilder() - .progressBarTexture(progressBarTexture) - .build(); - } - - public enum X { - PUMP, - WIRE, - WIRE4, - HULL, - PIPE, - GLASS, - PLATE, - MOTOR, - ROTOR, - SENSOR, - PISTON, - CIRCUIT, - EMITTER, - CONVEYOR, - ROBOT_ARM, - COIL_HEATING, - COIL_ELECTRIC, - STICK_MAGNETIC, - STICK_DISTILLATION, - BETTER_CIRCUIT, - FIELD_GENERATOR, - COIL_HEATING_DOUBLE, - STICK_ELECTROMAGNETIC - } - - /** - * Special Effects - */ - public enum SpecialEffects { - - NONE, - TOP_SMOKE, - MAIN_RANDOM_SPARKS; - - static final SpecialEffects[] VALID_SPECIAL_EFFECTS = { NONE, TOP_SMOKE, MAIN_RANDOM_SPARKS }; - - static SpecialEffects fromId(int id) { - return id >= 0 && id < VALID_SPECIAL_EFFECTS.length ? VALID_SPECIAL_EFFECTS[id] : NONE; - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java deleted file mode 100644 index d6ae385430..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java +++ /dev/null @@ -1,150 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_TOP; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.SteamVariant; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IGetTitleColor; -import gregtech.api.objects.overclockdescriber.OverclockDescriber; -import gregtech.api.objects.overclockdescriber.SteamOverclockDescriber; -import gregtech.api.render.TextureFactory; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple - * Machine - */ -public abstract class GT_MetaTileEntity_BasicMachine_Steel extends GT_MetaTileEntity_BasicMachine_Bronze - implements IGetTitleColor { - - public GT_MetaTileEntity_BasicMachine_Steel(int aID, String aName, String aNameRegional, String aDescription, - int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) { - super(aID, aName, aNameRegional, aDescription, aInputSlotCount, aOutputSlotCount, aHighPressure); - } - - public GT_MetaTileEntity_BasicMachine_Steel(String aName, String[] aDescription, ITexture[][][] aTextures, - int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) { - super(aName, aDescription, aTextures, aInputSlotCount, aOutputSlotCount, aHighPressure); - } - - @Override - public OverclockDescriber createOverclockDescriber() { - return new SteamOverclockDescriber(SteamVariant.STEEL, 2, 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; - } - - @Override - public ITexture[] getBottomFacingPipeActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getBottomFacingPipeInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getTopFacingPipeActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getTopFacingPipeInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getSideFacingPipeActive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getSideFacingPipeInactive(byte aColor) { - return new ITexture[] { TextureFactory.of( - isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, - Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.STEEL; - } - - @Override - public int getTitleColor() { - return COLOR_TITLE_WHITE.get(); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java deleted file mode 100644 index 25fc7e7855..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java +++ /dev/null @@ -1,331 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; - -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Utility; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the main construct for my generic Tanks. Filling and emptying behavior have to be implemented manually - */ -public abstract class GT_MetaTileEntity_BasicTank extends GT_MetaTileEntity_TieredMachineBlock - implements IAddUIWidgets { - - public FluidStack mFluid; - // Due to class initializing order, getCapacity might not work properly at this time. - // So we pass supplier instead of current value here. - protected final FluidStackTank fluidTank = new FluidStackTank( - () -> mFluid, - fluidStack -> mFluid = fluidStack, - this::getRealCapacity); - - /** - * @param aInvSlotCount should be 3 - */ - public GT_MetaTileEntity_BasicTank(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicTank(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String[] aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicTank(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicTank(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex != getStackDisplaySlot(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid")); - } - - public abstract boolean doesFillContainers(); - - public abstract boolean doesEmptyContainers(); - - public abstract boolean canTankBeFilled(); - - public abstract boolean canTankBeEmptied(); - - public abstract boolean displaysItemStack(); - - /** - * @return If fluid amount is shown on FluidDisplayItem - */ - public abstract boolean displaysStackSize(); - - public int getInputSlot() { - return 0; - } - - public int getOutputSlot() { - return 1; - } - - public int getStackDisplaySlot() { - return 2; - } - - public boolean isFluidInputAllowed(FluidStack aFluid) { - return true; - } - - public boolean isFluidChangingAllowed() { - return true; - } - - public FluidStack getFillableStack() { - return mFluid; - } - - public FluidStack setFillableStack(FluidStack aFluid) { - mFluid = aFluid; - return mFluid; - } - - /** - * If you override this and change the field returned, be sure to override {@link #isDrainableStackSeparate()} as - * well! - */ - public FluidStack getDrainableStack() { - return mFluid; - } - - public FluidStack setDrainableStack(FluidStack aFluid) { - mFluid = aFluid; - return mFluid; - } - - public boolean isDrainableStackSeparate() { - return false; - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - if (isFluidChangingAllowed() && getFillableStack() != null && getFillableStack().amount <= 0) { - setFillableStack(null); - } - - final int inputSlot = getInputSlot(); - - if (doesEmptyContainers()) { - FluidStack tFluid = GT_Utility.getFluidForFilledItem(mInventory[inputSlot], true); - if (tFluid != null && isFluidInputAllowed(tFluid)) { - if (getFillableStack() == null) { - if (isFluidInputAllowed(tFluid) && tFluid.amount <= getCapacity()) { - if (aBaseMetaTileEntity.addStackToSlot( - getOutputSlot(), - GT_Utility.getContainerForFilledItem(mInventory[inputSlot], true), - 1)) { - setFillableStack(tFluid.copy()); - this.onEmptyingContainerWhenEmpty(); - aBaseMetaTileEntity.decrStackSize(inputSlot, 1); - } - } - } else { - if (tFluid.isFluidEqual(getFillableStack()) - && ((long) tFluid.amount + getFillableStack().amount) <= (long) getCapacity()) { - if (aBaseMetaTileEntity.addStackToSlot( - getOutputSlot(), - GT_Utility.getContainerForFilledItem(mInventory[inputSlot], true), - 1)) { - getFillableStack().amount += tFluid.amount; - aBaseMetaTileEntity.decrStackSize(inputSlot, 1); - } - } - } - } - } - - if (doesFillContainers()) { - ItemStack tOutput = GT_Utility - .fillFluidContainer(getDrainableStack(), mInventory[inputSlot], false, true); - if (tOutput != null && aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tOutput, 1)) { - FluidStack tFluid = GT_Utility.getFluidForFilledItem(tOutput, true); - aBaseMetaTileEntity.decrStackSize(inputSlot, 1); - if (tFluid != null) getDrainableStack().amount -= tFluid.amount; - if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) setDrainableStack(null); - } - } - } - } - - @Override - public FluidStack getFluid() { - return getDrainableStack(); - } - - @Override - public int getFluidAmount() { - return getDrainableStack() != null ? getDrainableStack().amount : 0; - } - - @Override - public int fill(FluidStack aFluid, boolean doFill) { - if (aFluid == null || aFluid.getFluid() - .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0; - - if (getFillableStack() == null || getFillableStack().getFluid() - .getID() <= 0) { - if (aFluid.amount <= getCapacity()) { - if (doFill) { - setFillableStack(aFluid.copy()); - getBaseMetaTileEntity().markDirty(); - } - return aFluid.amount; - } - if (doFill) { - setFillableStack(aFluid.copy()); - getFillableStack().amount = getCapacity(); - getBaseMetaTileEntity().markDirty(); - } - return getCapacity(); - } - - if (!getFillableStack().isFluidEqual(aFluid)) return 0; - - int space = getCapacity() - getFillableStack().amount; - if (aFluid.amount <= space) { - if (doFill) { - getFillableStack().amount += aFluid.amount; - getBaseMetaTileEntity().markDirty(); - } - return aFluid.amount; - } - if (doFill) getFillableStack().amount = getCapacity(); - return space; - } - - @Override - public FluidStack drain(int maxDrain, boolean doDrain) { - if (getDrainableStack() == null || !canTankBeEmptied()) return null; - if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) { - setDrainableStack(null); - getBaseMetaTileEntity().markDirty(); - return null; - } - - int used = maxDrain; - if (getDrainableStack().amount < used) used = getDrainableStack().amount; - - if (doDrain) { - getDrainableStack().amount -= used; - getBaseMetaTileEntity().markDirty(); - } - - FluidStack drained = getDrainableStack().copy(); - drained.amount = used; - - if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) { - setDrainableStack(null); - getBaseMetaTileEntity().markDirty(); - } - - return drained; - } - - @Override - public FluidTankInfo[] getTankInfo(ForgeDirection side) { - if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {}; - if (isDrainableStackSeparate()) { - return new FluidTankInfo[] { new FluidTankInfo(getFillableStack(), getCapacity()), - new FluidTankInfo(getDrainableStack(), getCapacity()) }; - } else { - return new FluidTankInfo[] { new FluidTankInfo(this) }; - } - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return aIndex == getOutputSlot(); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return aIndex == getInputSlot(); - } - - protected void onEmptyingContainerWhenEmpty() { - // Do nothing - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setPos(7, 16) - .setSize(71, 45)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GAUGE) - .setPos(79, 34) - .setSize(18, 18)) - .widget( - new SlotWidget(inventoryHandler, getInputSlot()) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN) - .setPos(79, 16)) - .widget( - new SlotWidget(inventoryHandler, getOutputSlot()).setAccess(true, false) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT) - .setPos(79, 52)) - .widget( - createFluidSlot().setBackground(GT_UITextures.TRANSPARENT) - .setPos(58, 41)) - .widget( - new TextWidget("Liquid Amount").setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(10, 20)) - .widget( - new TextWidget().setStringSupplier(() -> numberFormat.format(mFluid != null ? mFluid.amount : 0)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(10, 30)); - } - - protected FluidSlotWidget createFluidSlot() { - return new FluidSlotWidget(fluidTank); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java deleted file mode 100644 index ef64d99db8..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java +++ /dev/null @@ -1,563 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_DOWN; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_DOWN_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_LEFT; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_LEFT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_RIGHT; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_RIGHT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP; -import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; -import java.util.stream.IntStream; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; - -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_TooltipDataCache; -import gregtech.api.util.GT_Utility; - -public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredMachineBlock implements IAddUIWidgets { - - private static final int OUTPUT_INDEX = 0; - private static final int ARROW_RIGHT_INDEX = 1; - private static final int ARROW_DOWN_INDEX = 2; - private static final int ARROW_LEFT_INDEX = 3; - private static final int ARROW_UP_INDEX = 4; - private static final int FRONT_INDEX = 5; - - private static final String EMIT_ENERGY_TOOLTIP = "GT5U.machines.emit_energy.tooltip"; - private static final String EMIT_REDSTONE_IF_FULL_TOOLTIP = "GT5U.machines.emit_redstone_if_full.tooltip"; - private static final String INVERT_REDSTONE_TOOLTIP = "GT5U.machines.invert_redstone.tooltip"; - private static final String STOCKING_MODE_TOOLTIP = "GT5U.machines.buffer_stocking_mode.tooltip"; - private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip"; - private static final int BUTTON_SIZE = 18; - - public int mMaxStackSize = 64; - public static int MAX = 8; - public boolean bOutput = false, bRedstoneIfFull = false, bInvert = false, bStockingMode = false, - bSortStacks = false; - public int mSuccess = 0, mTargetStackSize = 0; - private int uiButtonCount = 0; - - public GT_MetaTileEntity_Buffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); - } - - public GT_MetaTileEntity_Buffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String[] aDescription) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); - } - - public GT_MetaTileEntity_Buffer(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Buffer(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[ForgeDirection.VALID_DIRECTIONS.length][17][]; - ITexture tIcon = getOverlayIcon(); - ITexture tOut = TextureFactory.of(OVERLAY_PIPE_OUT); - ITexture tUp = TextureFactory.of( - TextureFactory.of(ARROW_UP), - TextureFactory.builder() - .addIcon(ARROW_UP_GLOW) - .glow() - .build()); - ITexture tDown = TextureFactory.of( - TextureFactory.of(ARROW_DOWN), - TextureFactory.builder() - .addIcon(ARROW_DOWN_GLOW) - .glow() - .build()); - ITexture tLeft = TextureFactory.of( - TextureFactory.of(ARROW_LEFT), - TextureFactory.builder() - .addIcon(ARROW_LEFT_GLOW) - .glow() - .build()); - ITexture tRight = TextureFactory.of( - TextureFactory.of(ARROW_RIGHT), - TextureFactory.builder() - .addIcon(ARROW_RIGHT_GLOW) - .glow() - .build()); - for (int i = 0; i < rTextures[0].length; i++) { - rTextures[OUTPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tOut }; - rTextures[ARROW_RIGHT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tRight, tIcon }; - rTextures[ARROW_DOWN_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tDown, tIcon }; - rTextures[ARROW_LEFT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tLeft, tIcon }; - rTextures[ARROW_UP_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tUp, tIcon }; - rTextures[FRONT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tIcon }; - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - colorIndex = colorIndex + 1; - if (sideDirection == facingDirection) return mTextures[FRONT_INDEX][colorIndex]; - if (sideDirection.getOpposite() == facingDirection) return mTextures[OUTPUT_INDEX][colorIndex]; - switch (facingDirection) { - case DOWN -> { - return mTextures[ARROW_UP_INDEX][colorIndex]; // ARROW_UP - } - case UP -> { - return mTextures[ARROW_DOWN_INDEX][colorIndex]; // ARROW_DOWN - } - case NORTH -> { - switch (sideDirection) { - case DOWN, UP -> { - return mTextures[ARROW_DOWN_INDEX][colorIndex]; // ARROW_DOWN - } - case WEST -> { - return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT - } - case EAST -> { - return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT - } - default -> {} - } - } - case SOUTH -> { - switch (sideDirection) { - case DOWN, UP -> { - return mTextures[ARROW_UP_INDEX][colorIndex]; // ARROW_UP - } - case WEST -> { - return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT - } - case EAST -> { - return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT - } - default -> {} - } - } - case WEST -> { - switch (sideDirection) { - case UP, SOUTH -> { - return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT - } - case DOWN, NORTH -> { - return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT - } - default -> {} - } - } - case EAST -> { - switch (sideDirection) { - case UP, SOUTH -> { - return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT - } - case DOWN, NORTH -> { - return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT - } - default -> {} - } - } - default -> {} - } - return mTextures[FRONT_INDEX][colorIndex]; - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex < mInventory.length - 1; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isEnetOutput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return !isOutputFacing(side); - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return getBaseMetaTileEntity().getBackFacing() == side; - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 512L; - } - - @Override - public long maxEUStore() { - return 512L + V[mTier] * 50L; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxEUOutput() { - // Return full value if we're an item and don't exist in the world for tooltip purposes - return getBaseMetaTileEntity().getWorld() == null || bOutput ? V[mTier] : 0L; - } - - @Override - public long maxAmperesIn() { - return 2; - } - - @Override - public long maxAmperesOut() { - return 2; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - public abstract ITexture getOverlayIcon(); - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setBoolean("bInvert", bInvert); - aNBT.setBoolean("bOutput", bOutput); - aNBT.setBoolean("bRedstoneIfFull", bRedstoneIfFull); - aNBT.setBoolean("bStockingMode", bStockingMode); - aNBT.setInteger("mTargetStackSize", mTargetStackSize); - aNBT.setBoolean("bSortStacks", bSortStacks); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - bInvert = aNBT.getBoolean("bInvert"); - bOutput = aNBT.getBoolean("bOutput"); - bRedstoneIfFull = aNBT.getBoolean("bRedstoneIfFull"); - bSortStacks = aNBT.getBoolean("bSortStacks"); - bStockingMode = aNBT.getBoolean("bStockingMode"); - mTargetStackSize = aNBT.getInteger("mTargetStackSize"); - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - super.setItemNBT(aNBT); - if (mTargetStackSize > 0) aNBT.setInteger("mTargetStackSize", mTargetStackSize); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (side == getBaseMetaTileEntity().getBackFacing()) { - - mTargetStackSize = (byte) ((mTargetStackSize + (aPlayer.isSneaking() ? -1 : 1)) % 65); - if (mTargetStackSize < 0) { - mTargetStackSize = mMaxStackSize; - } - if (mTargetStackSize == 0) { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("098", "Do not regulate Item Stack Size")); - } else { - GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("099", "Regulate Item Stack Size to: ") + mTargetStackSize); - } - } - } - - @Override - public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, - float aX, float aY, float aZ) { - wrenchingSide = wrenchingSide.getOpposite(); - if (getBaseMetaTileEntity().isValidFacing(wrenchingSide)) { - getBaseMetaTileEntity().setFrontFacing(wrenchingSide); - return true; - } - return false; - } - - protected void handleRedstoneOutput(IGregTechTileEntity aBaseMetaTileEntity) { - int redstoneOutput = getRedstoneOutput(); - Arrays.stream(ForgeDirection.VALID_DIRECTIONS) - .forEach(side -> aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) redstoneOutput)); - } - - protected int getRedstoneOutput() { - return (!bRedstoneIfFull || (bInvert ^ hasEmptySlots())) ? 0 : 15; - } - - private boolean hasEmptySlots() { - return IntStream.range(0, mInventory.length) - .anyMatch(i -> isValidSlot(i) && mInventory[i] == null); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - if (aBaseMetaTileEntity.isAllowedToWork() && aBaseMetaTileEntity.isServerSide() - && (aBaseMetaTileEntity.hasWorkJustBeenEnabled() || aBaseMetaTileEntity.hasInventoryBeenModified() - || aTimer % 200 == 0 - || mSuccess > 0)) { - mSuccess--; - updateSlots(); - moveItems(aBaseMetaTileEntity, aTimer); - handleRedstoneOutput(aBaseMetaTileEntity); - } - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 0); - } - - protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - moveItems(aBaseMetaTileEntity, aTimer, 1); - } - - protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long ignoredTimer, int stacks) { - int tCost; - if (bStockingMode) tCost = GT_Utility.moveMultipleItemStacks( - aBaseMetaTileEntity, - aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getBackFacing()), - aBaseMetaTileEntity.getBackFacing(), - aBaseMetaTileEntity.getFrontFacing(), - null, - false, - mTargetStackSize == 0 ? 64 : (byte) mTargetStackSize, - mTargetStackSize == 0 ? 1 : (byte) mTargetStackSize, - (byte) 64, - (byte) 1, - stacks); - else tCost = GT_Utility.moveMultipleItemStacks( - aBaseMetaTileEntity, - aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getBackFacing()), - aBaseMetaTileEntity.getBackFacing(), - aBaseMetaTileEntity.getFrontFacing(), - null, - false, - (byte) 64, - (byte) 1, - mTargetStackSize == 0 ? 64 : (byte) mTargetStackSize, - mTargetStackSize == 0 ? 1 : (byte) mTargetStackSize, - stacks); - - if (tCost > 0 || aBaseMetaTileEntity.hasInventoryBeenModified()) { - mSuccess = 50; - } - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return true; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side != aBaseMetaTileEntity.getBackFacing(); - } - - @Override - public boolean allowGeneralRedstoneOutput() { - return true; - } - - public void updateSlots() { - for (int i = 0; i < mInventory.length; i++) - if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; - if (bSortStacks) fillStacksIntoFirstSlots(); - } - - protected void fillStacksIntoFirstSlots() { - HashMap slots = new HashMap<>(mInventory.length); - HashMap stacks = new HashMap<>(mInventory.length); - List order = new ArrayList<>(mInventory.length); - List validSlots = new ArrayList<>(mInventory.length); - for (int i = 0; i < mInventory.length - 1; i++) { - if (!isValidSlot(i)) continue; - validSlots.add(i); - ItemStack s = mInventory[i]; - if (s == null) continue; - GT_Utility.ItemId sID = GT_Utility.ItemId.createNoCopy(s); - slots.merge(sID, s.stackSize, Integer::sum); - if (!stacks.containsKey(sID)) stacks.put(sID, s); - order.add(sID); - mInventory[i] = null; - } - int slotindex = 0; - for (GT_Utility.ItemId sID : order) { - int toSet = slots.get(sID); - if (toSet == 0) continue; - int slot = validSlots.get(slotindex); - slotindex++; - mInventory[slot] = stacks.get(sID) - .copy(); - toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); - mInventory[slot].stackSize = toSet; - slots.merge(sID, toSet, (a, b) -> a - b); - } - } - - @Override - public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, - EntityPlayer entityPlayer, float aX, float aY, float aZ) { - if (entityPlayer.isSneaking()) { - // I was so proud of all this but I literally just copied code from OutputBus - bSortStacks = !bSortStacks; - GT_Utility.sendChatToPlayer( - entityPlayer, - GT_Utility.trans("200", "Sort mode: ") - + (bSortStacks ? GT_Utility.trans("088", "Enabled") : GT_Utility.trans("087", "Disabled"))); - return true; - } - return super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); - } - - protected void addEmitEnergyButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> bOutput, - val -> bOutput = val, - GT_UITextures.OVERLAY_BUTTON_EMIT_ENERGY, - this::getEmitEnergyButtonTooltip)); - } - - private GT_TooltipDataCache.TooltipData getEmitEnergyButtonTooltip() { - return mTooltipCache.getData( - EMIT_ENERGY_TOOLTIP, - EnumChatFormatting.GREEN + GT_Utility.formatNumbers(V[mTier]) - + " (" - + GT_Utility.getColoredTierNameFromTier(mTier) - + EnumChatFormatting.GREEN - + ")" - + EnumChatFormatting.GRAY, - maxAmperesOut()); - } - - protected void addEmitRedstoneIfFullButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> bRedstoneIfFull, - val -> bRedstoneIfFull = val, - GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE, - this::getEmitRedstoneIfFullButtonTooltip).setUpdateTooltipEveryTick(true)); - } - - private GT_TooltipDataCache.TooltipData getEmitRedstoneIfFullButtonTooltip() { - return mTooltipCache.getUncachedTooltipData( - EMIT_REDSTONE_IF_FULL_TOOLTIP, - StatCollector.translateToLocal(hasEmptySlots() ? "gui.yes" : "gui.no"), - getRedstoneOutput()); - } - - protected void addInvertRedstoneButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> bInvert, - val -> bInvert = val, - GT_UITextures.OVERLAY_BUTTON_INVERT_REDSTONE, - () -> mTooltipCache.getData(INVERT_REDSTONE_TOOLTIP))); - } - - protected void addStockingModeButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> bStockingMode, - val -> bStockingMode = val, - GT_UITextures.OVERLAY_BUTTON_STOCKING_MODE, - () -> mTooltipCache.getData(STOCKING_MODE_TOOLTIP))); - } - - protected void addSortStacksButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> bSortStacks, - val -> bSortStacks = val, - GT_UITextures.OVERLAY_BUTTON_SORTING_MODE, - () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP))); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - buildContext.addCloseListener(() -> uiButtonCount = 0); - addEmitEnergyButton(builder); - } - - protected Widget createToggleButton(Supplier getter, Consumer setter, UITexture picture, - Supplier tooltipDataSupplier) { - return new CycleButtonWidget().setToggle(getter, setter) - .setStaticTexture(picture) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62) - .setSize(BUTTON_SIZE, BUTTON_SIZE) - .setGTTooltip(tooltipDataSupplier); - } - - protected void addInventorySlots(ModularWindow.Builder builder) { - builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 9) - .endAtSlot(26) - .build() - .setPos(7, 4)); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java deleted file mode 100644 index efb91e3a26..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java +++ /dev/null @@ -1,141 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; - -import java.util.List; - -import net.minecraft.item.ItemStack; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.IStructureElement; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_StructureUtility; - -/** - * A simple 3x3x3 hollow cubic multiblock, that can be arbitrarily rotated, made of a single type of machine casing and - * accepts hatches everywhere. Controller will be placed in front center of the structure. - *

- * Note: You cannot use different casing for the same Class. Make a new subclass for it. You also should not change the - * casing dynamically, i.e. it should be a dumb method returning some sort of constant. - *

- * Implementation tips: 1. To restrict hatches, override {@link #addDynamoToMachineList(IGregTechTileEntity, int)} and - * its cousins instead of overriding the whole {@link #getStructureDefinition()} or change - * {@link #checkHatches(IGregTechTileEntity, ItemStack)}. The former is a total overkill, while the later cannot stop - * the structure check early. 2. To limit rotation, override {@link #getInitialAlignmentLimits()} - * - * @param - */ -public abstract class GT_MetaTileEntity_CubicMultiBlockBase> - extends GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - protected static final String STRUCTURE_PIECE_MAIN = "main"; - protected static final ClassValue>> STRUCTURE_DEFINITION = new ClassValue<>() { - - @Override - protected IStructureDefinition> computeValue(Class type) { - return StructureDefinition.>builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { "hhh", "hhh", "hhh" }, { "h~h", "h-h", "hhh" }, { "hhh", "hhh", "hhh" }, })) - .addElement( - 'h', - ofChain( - lazy( - t -> GT_StructureUtility.>buildHatchAdder() - .atLeastList(t.getAllowedHatches()) - .casingIndex(t.getHatchTextureIndex()) - .dot(1) - .build()), - onElementPass( - GT_MetaTileEntity_CubicMultiBlockBase::onCorrectCasingAdded, - lazy(GT_MetaTileEntity_CubicMultiBlockBase::getCasingElement)))) - .build(); - } - }; - private int mCasingAmount = 0; - - protected GT_MetaTileEntity_CubicMultiBlockBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - protected GT_MetaTileEntity_CubicMultiBlockBase(String aName) { - super(aName); - } - - /** - * Create a simple 3x3x3 hollow cubic structure made of a single type of machine casing and accepts hatches - * everywhere. - *

- * The created definition contains a single piece named {@link #STRUCTURE_PIECE_MAIN}. - */ - @Override - @SuppressWarnings("unchecked") - public IStructureDefinition getStructureDefinition() { - return (IStructureDefinition) STRUCTURE_DEFINITION.get(getClass()); - } - - @Override - public void construct(ItemStack aStack, boolean aHintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 1, 1, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true); - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= getRequiredCasingCount() - && checkHatches(aBaseMetaTileEntity, aStack); - } - - /** - * Called by {@link #checkMachine(IGregTechTileEntity, ItemStack)} to check if all required hatches are present. - *

- * Default implementation requires EXACTLY ONE maintenance hatch to be present, and ignore all other conditions. - * - * @param aBaseMetaTileEntity the tile entity of self - * @param aStack The item stack inside the controller - * @return true if the test passes, false otherwise - */ - protected boolean checkHatches(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - return mMaintenanceHatches.size() == 1; - } - - protected abstract IStructureElement> getCasingElement(); - - protected List>> getAllowedHatches() { - return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Muffler, Maintenance, Energy); - } - - /** - * The hatch's texture index. - */ - protected abstract int getHatchTextureIndex(); - - protected abstract int getRequiredCasingCount(); - - protected void onCorrectCasingAdded() { - mCasingAmount++; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java deleted file mode 100644 index 15ce78fae3..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java +++ /dev/null @@ -1,318 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.alignment.IAlignment; -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; -import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; -import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; -import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; -import com.gtnewhorizon.structurelib.structure.IItemSource; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; - -import cpw.mods.fml.common.network.NetworkRegistry; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; - -/** - * Enhanced multiblock base class, featuring following improvement over {@link GT_MetaTileEntity_MultiBlockBase} - *

- * 1. TecTech style declarative structure check utilizing StructureLib. 2. Arbitrarily rotating the whole structure, if - * allowed to. - * - * @param type of this - */ -public abstract class GT_MetaTileEntity_EnhancedMultiBlockBase> - extends GT_MetaTileEntity_TooltipMultiBlockBase implements IAlignment, IConstructable { - - private ExtendedFacing mExtendedFacing = ExtendedFacing.DEFAULT; - private IAlignmentLimits mLimits = getInitialAlignmentLimits(); - - protected GT_MetaTileEntity_EnhancedMultiBlockBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - protected GT_MetaTileEntity_EnhancedMultiBlockBase(String aName) { - super(aName); - } - - @Override - public ExtendedFacing getExtendedFacing() { - return mExtendedFacing; - } - - @Override - public void setExtendedFacing(ExtendedFacing newExtendedFacing) { - if (mExtendedFacing != newExtendedFacing) { - if (mMachine) stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE); - mExtendedFacing = newExtendedFacing; - final IGregTechTileEntity base = getBaseMetaTileEntity(); - mMachine = false; - mUpdated = false; - mUpdate = 50; - if (getBaseMetaTileEntity().isServerSide() - && !GregTech_API.isDummyWorld(getBaseMetaTileEntity().getWorld())) { - StructureLibAPI.sendAlignment( - (IAlignmentProvider) base, - new NetworkRegistry.TargetPoint( - base.getWorld().provider.dimensionId, - base.getXCoord(), - base.getYCoord(), - base.getZCoord(), - 512)); - } else { - base.issueTextureUpdate(); - } - } - } - - @Override - public final boolean isFacingValid(ForgeDirection facing) { - return canSetToDirectionAny(facing); - } - - @Override - public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, - float aX, float aY, float aZ) { - if (wrenchingSide != getBaseMetaTileEntity().getFrontFacing()) - return super.onWrenchRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); - if (entityPlayer.isSneaking()) { - if (isFlipChangeAllowed()) { - toolSetFlip(getFlip().isHorizontallyFlipped() ? Flip.NONE : Flip.HORIZONTAL); - } else { - return false; - } - } else { - if (isRotationChangeAllowed()) { - toolSetRotation(null); - } else { - return false; - } - } - return true; - } - - @Override - public void onFacingChange() { - toolSetDirection(getBaseMetaTileEntity().getFrontFacing()); - } - - @Override - public IAlignmentLimits getAlignmentLimits() { - return mLimits; - } - - protected void setAlignmentLimits(IAlignmentLimits mLimits) { - this.mLimits = mLimits; - } - - /** - * Due to limitation of Java type system, you might need to do an unchecked cast. HOWEVER, the returned - * IStructureDefinition is expected to be evaluated against current instance only, and should not be used against - * other instances, even for those of the same class. - */ - public abstract IStructureDefinition getStructureDefinition(); - - protected abstract GT_Multiblock_Tooltip_Builder createTooltip(); - - @Override - public String[] getStructureDescription(ItemStack stackSize) { - return getTooltip().getStructureHint(); - } - - protected IAlignmentLimits getInitialAlignmentLimits() { - return (d, r, f) -> !f.isVerticallyFliped(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setByte( - "eRotation", - (byte) mExtendedFacing.getRotation() - .getIndex()); - aNBT.setByte( - "eFlip", - (byte) mExtendedFacing.getFlip() - .getIndex()); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mExtendedFacing = ExtendedFacing.of( - getBaseMetaTileEntity().getFrontFacing(), - Rotation.byIndex(aNBT.getByte("eRotation")), - Flip.byIndex(aNBT.getByte("eFlip"))); - if (!getAlignmentLimits().isNewExtendedFacingValid(mExtendedFacing)) { - mExtendedFacing = getCorrectedAlignment(mExtendedFacing); - } - } - - /** - * When an old {@link ExtendedFacing} is loaded upon MTE deserialization, and the loaded facing cannot pass test of - * current {@link #getAlignmentLimits()}, this method will be called to retrieve a corrected version. This method - * is currently only intended to be used as a mean to migrate alignment limits, so if you never change the alignment - * limit then you can probably just use the default implementation. - * - * The returned new facing must be able to pass the test of {@link #isNewExtendedFacingValid(ExtendedFacing)} - */ - protected ExtendedFacing getCorrectedAlignment(ExtendedFacing aOldFacing) { - if (isNewExtendedFacingValid(ExtendedFacing.DEFAULT)) { - return ExtendedFacing.DEFAULT; - } - for (ExtendedFacing facing : ExtendedFacing.VALUES) { - if (facing.getFlip() - .isVerticallyFliped()) { - continue; - } - if (isNewExtendedFacingValid(facing)) { - return facing; - } - } - throw new AssertionError("No ExtendedFacing can pass the test of isNewExtendedFacingValid"); - } - - @SuppressWarnings("unchecked") - private IStructureDefinition> getCastedStructureDefinition() { - return (IStructureDefinition>) getStructureDefinition(); - } - - /** - * Explanation of the world coordinate these offset means: - *

- * Imagine you stand in front of the controller, with controller facing towards you not rotated or flipped. - *

- * The horizontalOffset would be the number of blocks on the left side of the controller, not counting controller - * itself. The verticalOffset would be the number of blocks on the top side of the controller, not counting - * controller itself. The depthOffset would be the number of blocks between you and controller, not counting - * controller itself. - *

- * All these offsets can be negative. - */ - protected final boolean checkPiece(String piece, int horizontalOffset, int verticalOffset, int depthOffset) { - final IGregTechTileEntity tTile = getBaseMetaTileEntity(); - return getCastedStructureDefinition().check( - this, - piece, - tTile.getWorld(), - getExtendedFacing(), - tTile.getXCoord(), - tTile.getYCoord(), - tTile.getZCoord(), - horizontalOffset, - verticalOffset, - depthOffset, - !mMachine); - } - - protected final boolean buildPiece(String piece, ItemStack trigger, boolean hintOnly, int horizontalOffset, - int verticalOffset, int depthOffset) { - final IGregTechTileEntity tTile = getBaseMetaTileEntity(); - return getCastedStructureDefinition().buildOrHints( - this, - trigger, - piece, - tTile.getWorld(), - getExtendedFacing(), - tTile.getXCoord(), - tTile.getYCoord(), - tTile.getZCoord(), - horizontalOffset, - verticalOffset, - depthOffset, - hintOnly); - } - - @Deprecated - protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, - int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check) { - final IGregTechTileEntity tTile = getBaseMetaTileEntity(); - return getCastedStructureDefinition().survivalBuild( - this, - trigger, - piece, - tTile.getWorld(), - getExtendedFacing(), - tTile.getXCoord(), - tTile.getYCoord(), - tTile.getZCoord(), - horizontalOffset, - verticalOffset, - depthOffset, - elementsBudget, - source, - actor, - check); - } - - protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, - int depthOffset, int elementsBudget, ISurvivalBuildEnvironment env, boolean check) { - final IGregTechTileEntity tTile = getBaseMetaTileEntity(); - return getCastedStructureDefinition().survivalBuild( - this, - trigger, - piece, - tTile.getWorld(), - getExtendedFacing(), - tTile.getXCoord(), - tTile.getYCoord(), - tTile.getZCoord(), - horizontalOffset, - verticalOffset, - depthOffset, - elementsBudget, - env, - check); - } - - @Deprecated - protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, - int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check, - boolean checkIfPlaced) { - int built = survivialBuildPiece( - piece, - trigger, - horizontalOffset, - verticalOffset, - depthOffset, - elementsBudget, - source, - actor, - check); - if (checkIfPlaced && built > 0) checkStructure(true, getBaseMetaTileEntity()); - return built; - } - - protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, - int depthOffset, int elementsBudget, ISurvivalBuildEnvironment env, boolean check, boolean checkIfPlaced) { - int built = survivialBuildPiece( - piece, - trigger, - horizontalOffset, - verticalOffset, - depthOffset, - elementsBudget, - env, - check); - if (checkIfPlaced && built > 0) checkStructure(true, getBaseMetaTileEntity()); - return built; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - if (aBaseMetaTileEntity.isClientSide()) - StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java deleted file mode 100644 index f430114319..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java +++ /dev/null @@ -1,242 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; - -import org.jetbrains.annotations.NotNull; - -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.util.GT_ExoticEnergyInputHelper; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReason; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; - -/** - * Multiblock base class that allows machine to use power over int. - */ -public abstract class GT_MetaTileEntity_ExtendedPowerMultiBlockBase> - extends GT_MetaTileEntity_EnhancedMultiBlockBase { - - public long lEUt; - - protected GT_MetaTileEntity_ExtendedPowerMultiBlockBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - protected GT_MetaTileEntity_ExtendedPowerMultiBlockBase(String aName) { - super(aName); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - // NBT can be loaded as any primitive type, so we can load it as long. - this.lEUt = aNBT.getLong("mEUt"); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setLong("mEUt", this.lEUt); - } - - @Override - protected void calculateOverclockedNessMultiInternal(long aEUt, int aDuration, int mAmperage, long maxInputVoltage, - boolean perfectOC) { - GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(aEUt) - .setEUt(maxInputVoltage * mAmperage) - .setDuration(aDuration) - .setDurationDecreasePerOC(perfectOC ? 4.0 : 2.0) - .calculate(); - lEUt = calculator.getConsumption(); - mMaxProgresstime = calculator.getDuration(); - } - - @Override - public boolean onRunningTick(ItemStack aStack) { - if (this.lEUt > 0) { - addEnergyOutput((this.lEUt * mEfficiency) / 10000); - return true; - } - if (this.lEUt < 0) { - if (!drainEnergyInput(getActualEnergyUsage())) { - stopMachine(ShutDownReasonRegistry.POWER_LOSS); - return false; - } - } - return true; - } - - @Override - public void stopMachine(@NotNull ShutDownReason reason) { - this.lEUt = 0; - super.stopMachine(reason); - } - - @Override - protected long getActualEnergyUsage() { - return (-this.lEUt * 10000) / Math.max(1000, mEfficiency); - } - - public List getExoticAndNormalEnergyHatchList() { - List tHatches = new ArrayList<>(); - tHatches.addAll(filterValidMTEs(mExoticEnergyHatches)); - tHatches.addAll(filterValidMTEs(mEnergyHatches)); - return tHatches; - } - - @Override - public boolean drainEnergyInput(long aEU) { - return GT_ExoticEnergyInputHelper.drainEnergy(aEU, getExoticAndNormalEnergyHatchList()); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - - final IGregTechTileEntity tileEntity = getBaseMetaTileEntity(); - if (tileEntity != null) { - if (tileEntity.isActive()) { - if (lEUt < 0) tag.setLong("energyUsage", getActualEnergyUsage()); - else tag.setLong("energyUsage", -lEUt * mEfficiency / 10000); - } - } - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(getAverageInputVoltage()); - logic.setAvailableAmperage(getMaxInputAmps()); - logic.setAmperageOC(true); - } - - @Nonnull - @Override - protected CheckRecipeResult postCheckRecipe(@Nonnull CheckRecipeResult result, - @Nonnull ProcessingLogic processingLogic) { - return result; - } - - @Override - protected void setEnergyUsage(ProcessingLogic processingLogic) { - lEUt = processingLogic.getCalculatedEut(); - if (lEUt > 0) { - lEUt = (-lEUt); - } - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch tHatch : getExoticAndNormalEnergyHatchList()) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - long voltage = getAverageInputVoltage(); - long amps = getMaxInputAmps(); - - return new String[] { - /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(getActualEnergyUsage()) - + EnumChatFormatting.RESET - + " EU/t", - /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(voltage) - + EnumChatFormatting.RESET - + " EU/t(*" - + amps - + " A)" - + StatCollector.translateToLocal("GT5U.machines.tier") - + ": " - + EnumChatFormatting.YELLOW - + VN[GT_Utility.getTier(voltage)] - + EnumChatFormatting.RESET, - /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " - + EnumChatFormatting.RED - + (getIdealStatus() - getRepairStatus()) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.multiblock.efficiency") - + ": " - + EnumChatFormatting.YELLOW - + mEfficiency / 100.0F - + EnumChatFormatting.RESET - + " %", - /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" }; - } - - @Override - public long getMaxInputVoltage() { - return GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList()); - } - - @Override - public long getAverageInputVoltage() { - return GT_ExoticEnergyInputHelper.getAverageInputVoltageMulti(getExoticAndNormalEnergyHatchList()); - } - - @Override - public long getMaxInputAmps() { - return GT_ExoticEnergyInputHelper.getMaxWorkingInputAmpsMulti(getExoticAndNormalEnergyHatchList()); - } - - @Override - public long getMaxInputEu() { - return GT_ExoticEnergyInputHelper.getTotalEuMulti(getExoticAndNormalEnergyHatchList()); - } - - @Override - public void clearHatches() { - super.clearHatches(); - mExoticEnergyHatches.clear(); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java deleted file mode 100644 index 896cb223f3..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java +++ /dev/null @@ -1,106 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import net.minecraft.nbt.NBTTagCompound; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.util.GT_TooltipDataCache; - -public abstract class GT_MetaTileEntity_FilterBase extends GT_MetaTileEntity_Buffer { - - private static final String INVERT_FILTER_TOOLTIP = "GT5U.machines.invert_filter.tooltip"; - protected static final int FILTER_SLOT_INDEX = 9; - protected static final int NUM_INVENTORY_SLOTS = 9; - private static final String EMIT_REDSTONE_GRADUALLY_TOOLTIP = "GT5U" + ".machines.emit_redstone_gradually.tooltip"; - protected boolean invertFilter = false; - - public GT_MetaTileEntity_FilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); - } - - public GT_MetaTileEntity_FilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String[] aDescription) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); - } - - public GT_MetaTileEntity_FilterBase(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_FilterBase(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex < NUM_INVENTORY_SLOTS; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("bInvertFilter", this.invertFilter); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.invertFilter = aNBT.getBoolean("bInvertFilter"); - } - - @Override - protected int getRedstoneOutput() { - if (!bRedstoneIfFull) { - return 0; - } - int redstoneOutput = getEmptySlots(); - if (!bInvert) redstoneOutput = NUM_INVENTORY_SLOTS - redstoneOutput; - return redstoneOutput; - } - - private int getEmptySlots() { - int emptySlots = 0; - for (int i = 0; i < NUM_INVENTORY_SLOTS; i++) { - if (mInventory[i] == null) ++emptySlots; - } - return emptySlots; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - addSortStacksButton(builder); - addEmitRedstoneGraduallyButton(builder); - addInvertRedstoneButton(builder); - addInvertFilterButton(builder); - } - - private void addEmitRedstoneGraduallyButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> bRedstoneIfFull, - val -> bRedstoneIfFull = val, - GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE, - this::getEmitRedstoneGraduallyButtonTooltip).setUpdateTooltipEveryTick(true)); - } - - private GT_TooltipDataCache.TooltipData getEmitRedstoneGraduallyButtonTooltip() { - return mTooltipCache - .getUncachedTooltipData(EMIT_REDSTONE_GRADUALLY_TOOLTIP, getEmptySlots(), getRedstoneOutput()); - } - - private void addInvertFilterButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> invertFilter, - val -> invertFilter = val, - GT_UITextures.OVERLAY_BUTTON_INVERT_FILTER, - () -> mTooltipCache.getData(INVERT_FILTER_TOOLTIP))); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java deleted file mode 100644 index 1e974f5e9d..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java +++ /dev/null @@ -1,252 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import appeng.api.crafting.ICraftingIconProvider; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -/** - * Handles texture changes internally. No special calls are necessary other than updateTexture in add***ToMachineList. - */ -public abstract class GT_MetaTileEntity_Hatch extends GT_MetaTileEntity_BasicTank implements ICraftingIconProvider { - - public enum ConnectionType { - CABLE, - WIRELESS, - LASER - } - - /** - * Uses new texture changing methods to avoid limitations of byte as texture index... - */ - @Deprecated - public byte mMachineBlock = 0; - - private byte mTexturePage = 0; - private byte actualTexture = 0; - - private ItemStack ae2CraftingIcon; - - public GT_MetaTileEntity_Hatch(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String[] aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public static int getSlots(int aTier) { - return aTier < 1 ? 1 : aTier == 1 ? 4 : aTier == 2 ? 9 : 16; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return new ITexture[0][0][0]; - } - - public abstract ITexture[] getTexturesActive(ITexture aBaseTexture); - - public abstract ITexture[] getTexturesInactive(ITexture aBaseTexture); - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - int texturePointer = (byte) (actualTexture & 0x7F); // just to be sure, from my testing the 8th bit cannot be - // set clientside - int textureIndex = texturePointer | (mTexturePage << 7); // Shift seven since one page is 128 textures! - try { - if (side != aFacing) { - if (textureIndex > 0) - return new ITexture[] { Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer] }; - else return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1] }; - } else { - if (textureIndex > 0) { - if (aActive) - return getTexturesActive(Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer]); - else return getTexturesInactive( - Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer]); - } else { - if (aActive) return getTexturesActive(Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1]); - else return getTexturesInactive(Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1]); - } - } - } catch (NullPointerException npe) { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[0][0] }; - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setByte("mMachineBlock", actualTexture); - aNBT.setByte("mTexturePage", mTexturePage); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - actualTexture = aNBT.getByte("mMachineBlock"); - mTexturePage = aNBT.getByte("mTexturePage"); - - if (mTexturePage != 0 && GT_Values.GT.isServerSide()) actualTexture |= 0x80; // <- lets just hope no one needs - // the correct value for that on - // server - mMachineBlock = actualTexture; - } - - /** - * Sets texture with page and index, called on add to machine list - * - * @param id (page<<7)+index of the texture - */ - public final void updateTexture(int id) { - onValueUpdate((byte) id); - onTexturePageUpdate((byte) (id >> 7)); - } - - /** - * Sets the icon for the owning multiblock used for AE2 crafting display of attached interfaces, called on add to - * machine list - */ - public final void updateCraftingIcon(ItemStack icon) { - this.ae2CraftingIcon = icon; - } - - @Override - public ItemStack getMachineCraftingIcon() { - return this.ae2CraftingIcon; - } - - /** - * Some multiblocks restrict hatches by tier. This method allows hatches to specify custom tier used for - * structure check, while keeping {@link #mTier} for other uses. - * - * @return Tier used for multiblock structure - */ - public byte getTierForStructure() { - return mTier; - } - - /** - * Sets texture with page and index, rather unusable, but kept FFS - * - * @param page page of texure - * @param index index of texure - */ - @Deprecated - public final void updateTexture(byte page, byte index) { - onValueUpdate(index); - onTexturePageUpdate(page); - } - - @Override - public final void onValueUpdate(byte aValue) { - actualTexture = (byte) (aValue & 0x7F); - mMachineBlock = actualTexture; - mTexturePage = 0; - } - - /** - * Get the maximum amount of amperes to work with, which excludes the additional amps in for loss - * - * @return Working amps - */ - public long maxWorkingAmperesIn() { - return maxAmperesIn(); - } - - /** - * Get the type of connection this hatch allows - * - * @return Connection type - */ - public ConnectionType getConnectionType() { - return ConnectionType.CABLE; - } - - @Override - public final byte getUpdateData() { - return (byte) (actualTexture & 0x7F); - } - - public final void onTexturePageUpdate(byte aValue) { - mTexturePage = (byte) (aValue & 0x7F); - if (mTexturePage != 0 && getBaseMetaTileEntity().isServerSide()) { // just to be sure - mMachineBlock |= 0x80; // <- lets just hope no one needs the correct value for that on server - actualTexture = mMachineBlock; - } - // set last bit to allow working of the page reset-er to 0 in rare case when texture id is the same but page - // changes to 0 - } - - public final byte getTexturePage() { - return (byte) (mTexturePage & 0x7F); - } - - @Override - public boolean doesFillContainers() { - return false; - } - - @Override - public boolean doesEmptyContainers() { - return false; - } - - @Override - public boolean canTankBeFilled() { - return false; - } - - @Override - public boolean canTankBeEmptied() { - return false; - } - - @Override - public boolean displaysItemStack() { - return false; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { // in that method since it is usually - // not overriden, especially for - // hatches. - if (actualTexture != mMachineBlock) { // revert to page 0 on edition of the field - old code way - actualTexture = (byte) (mMachineBlock & 0x7F); - mMachineBlock = actualTexture; // clear last bit in mMachineBlock since now we are at page 0 after the - // direct field - // change - mTexturePage = 0; // assuming old code only supports page 0 - } - super.onPreTick(aBaseMetaTileEntity, aTick); - } - - // To change to other page -> use the setter method -> updateTexture - - public int getCircuitSlot() { - return -1; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java deleted file mode 100644 index 18344082ea..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java +++ /dev/null @@ -1,170 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DATA_ACCESS; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Predicate; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; - -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_AssemblyLineUtils; - -public class GT_MetaTileEntity_Hatch_DataAccess extends GT_MetaTileEntity_Hatch implements IAddUIWidgets { - - private int timeout = 4; - - public GT_MetaTileEntity_Hatch_DataAccess(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 16, - new String[] { "Data Access for Multiblocks", - "Adds " + (aTier == 4 ? 4 : 16) + " extra slots for Data Sticks" }); - } - - public GT_MetaTileEntity_Hatch_DataAccess(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aTier == 4 ? 4 : 16, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_DataAccess(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aTier == 4 ? 4 : 16, aDescription, aTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_DATA_ACCESS) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_DATA_ACCESS) }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_DataAccess(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return mTier >= 8 && !aBaseMetaTileEntity.isActive(); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return mTier >= 8 && !aBaseMetaTileEntity.isActive(); - } - - @Override - public int getInventoryStackLimit() { - return 1; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isActive()) { - timeout--; - if (timeout <= 0) { - aBaseMetaTileEntity.setActive(false); - } - } - } - - public void setActive(boolean mActive) { - getBaseMetaTileEntity().setActive(mActive); - timeout = mActive ? 4 : 0; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.getByte("mSticksUpdated") != 1) { - for (int i = 0; i < getSizeInventory(); i++) { - GT_AssemblyLineUtils.processDataStick(getStackInSlot(i)); - } - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - // reminder: remove this marker after many years - aNBT.setByte("mSticksUpdated", (byte) 1); - } - - @Override - public void setInventorySlotContents(int aIndex, ItemStack aStack) { - super.setInventorySlotContents(aIndex, aStack); - GT_AssemblyLineUtils.processDataStick(aStack); - } - - public List getInventoryItems(Predicate filter) { - ArrayList items = new ArrayList<>(); - IGregTechTileEntity te = getBaseMetaTileEntity(); - for (int i = 0; i < te.getSizeInventory(); ++i) { - ItemStack slot = te.getStackInSlot(i); - if (slot != null) { - if (filter != null && filter.test(slot)) { - items.add(slot); - } - } - } - return items; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - if (mTier == 4) { - getBaseMetaTileEntity() - .add2by2Slots(builder, getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CIRCUIT); - } else { - getBaseMetaTileEntity() - .add4by4Slots(builder, getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CIRCUIT); - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java deleted file mode 100644 index 8e621434db..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java +++ /dev/null @@ -1,110 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; - -public class GT_MetaTileEntity_Hatch_Dynamo extends GT_MetaTileEntity_Hatch { - - public GT_MetaTileEntity_Hatch_Dynamo(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 0, - new String[] { "Generating electric Energy from Multiblocks", "Puts out up to 1 Amp" }); - } - - public GT_MetaTileEntity_Hatch_Dynamo(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription) { - super(aID, aName, aNameRegional, aTier, 0, aDescription); - } - - public GT_MetaTileEntity_Hatch_Dynamo(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Dynamo(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isEnetOutput() { - return true; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 512; - } - - @Override - public long maxEUOutput() { - return V[mTier]; - } - - @Override - public long maxEUStore() { - return 512L + V[mTier + 1] * 2L; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_Dynamo(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java deleted file mode 100644 index d9be12671d..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java +++ /dev/null @@ -1,125 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; - -public class GT_MetaTileEntity_Hatch_Energy extends GT_MetaTileEntity_Hatch { - - public GT_MetaTileEntity_Hatch_Energy(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription) { - super(aID, aName, aNameRegional, aTier, 0, aDescription); - } - - public GT_MetaTileEntity_Hatch_Energy(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 0, - new String[] { "Energy Injector for Multiblocks", "Accepts up to 2 Amps" }); - } - - public GT_MetaTileEntity_Hatch_Energy(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String[] aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Energy(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Energy(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Energy(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 512; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxEUStore() { - return 512L + V[mTier] * 8L; - } - - @Override - public long maxAmperesIn() { - return 2; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_Energy(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java deleted file mode 100644 index 705a3e6248..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java +++ /dev/null @@ -1,196 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.GT_Mod; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Hatch_Input extends GT_MetaTileEntity_Hatch { - - public RecipeMap mRecipeMap = null; - - public GT_MetaTileEntity_Hatch_Input(int aID, String aName, String aNameRegional, int aTier) { - this( - aID, - aName, - aNameRegional, - aTier, - new String[] { "Fluid Input for Multiblocks", - "Capacity: " + GT_Utility.formatNumbers(8000L * (1L << aTier)) + "L" }); - } - - public GT_MetaTileEntity_Hatch_Input(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription) { - this(aID, 3, aName, aNameRegional, aTier, aDescription); - } - - public GT_MetaTileEntity_Hatch_Input(int aID, int aSlot, String aName, String aNameRegional, int aTier) { - this( - aID, - aSlot, - aName, - aNameRegional, - aTier, - new String[] { "Fluid Input for Multiblocks", "", "Can hold " + aSlot + " types of fluid." }); - mDescriptionArray[1] = "Capacity: " + GT_Utility.formatNumbers(getCapacityPerTank(aTier, aSlot)) + "L"; - } - - public GT_MetaTileEntity_Hatch_Input(int aID, int aSlot, String aName, String aNameRegional, int aTier, - String[] aDescription) { - super(aID, aName, aNameRegional, aTier, aSlot, aDescription); - } - - public GT_MetaTileEntity_Hatch_Input(int aID, String aName, String aNameRegional, int aTier, int allSlotCount, - String[] strings) { - super(aID, aName, aNameRegional, aTier, allSlotCount, strings); - } - - public int getCapacityPerTank(int aTier, int aSlot) { - return (int) (8000L * (1L << aTier) / aSlot); - } - - public GT_MetaTileEntity_Hatch_Input(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Input(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Input(String aName, int aSlots, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aSlots, aDescription, aTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_Input(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (mRecipeMap != null) { - aNBT.setString("recipeMap", mRecipeMap.unlocalizedName); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("recipeMap")); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public boolean doesFillContainers() { - // return true; - return false; - } - - @Override - public boolean doesEmptyContainers() { - return true; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return true; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - public void updateSlots() { - if (mInventory[getInputSlot()] != null && mInventory[getInputSlot()].stackSize <= 0) - mInventory[getInputSlot()] = null; - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return mRecipeMap == null || mRecipeMap.containsInput(aFluid); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0 - && (mRecipeMap == null || mRecipeMap.containsInput(aStack) - || mRecipeMap.containsInput(GT_Utility.getFluidForFilledItem(aStack, true))); - } - - @Override - public int getCapacity() { - return 8000 * (1 << mTier); - } - - @Override - public int getTankPressure() { - return -100; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java deleted file mode 100644 index 8c99e813e2..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java +++ /dev/null @@ -1,318 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; - -import gregtech.GT_Mod; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IConfigurationCircuitSupport; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ClientPreference; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_TooltipDataCache; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.extensions.ArrayExt; - -public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch - implements IConfigurationCircuitSupport, IAddUIWidgets { - - private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip"; - private static final String ONE_STACK_LIMIT_TOOLTIP = "GT5U.machines.one_stack_limit.tooltip"; - private static final int BUTTON_SIZE = 18; - - public RecipeMap mRecipeMap = null; - public boolean disableSort; - public boolean disableFilter = true; - public boolean disableLimited = true; - private int uiButtonCount = 0; - - public GT_MetaTileEntity_Hatch_InputBus(int id, String name, String nameRegional, int tier) { - this(id, name, nameRegional, tier, getSlots(tier) + 1); - } - - protected GT_MetaTileEntity_Hatch_InputBus(int id, String name, String nameRegional, int tier, int slots, - String[] description) { - super(id, name, nameRegional, tier, slots, description); - } - - public GT_MetaTileEntity_Hatch_InputBus(int id, String name, String nameRegional, int tier, int slots) { - super( - id, - name, - nameRegional, - tier, - slots, - ArrayExt.of( - "Item Input for Multiblocks", - "Shift + right click with screwdriver to turn Sort mode on/off", - "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : ""))); - } - - public GT_MetaTileEntity_Hatch_InputBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - this(aName, aTier, getSlots(aTier) + 1, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_InputBus(String aName, int aTier, int aSlots, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aSlots, aDescription, aTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex != getCircuitSlot(); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_InputBus(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public int getCircuitSlotX() { - return 153; - } - - @Override - public int getCircuitSlotY() { - return 63; - } - - @Override - public void initDefaultModes(NBTTagCompound aNBT) { - if (!getBaseMetaTileEntity().getWorld().isRemote) { - GT_ClientPreference tPreference = GT_Mod.gregtechproxy - .getClientPreference(getBaseMetaTileEntity().getOwnerUuid()); - if (tPreference != null) disableFilter = !tPreference.isInputBusInitialFilterEnabled(); - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) { - updateSlots(); - } - } - - public void updateSlots() { - for (int i = 0; i < mInventory.length - 1; i++) - if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; - if (!disableSort) fillStacksIntoFirstSlots(); - } - - protected void fillStacksIntoFirstSlots() { - final int L = mInventory.length - 1; - HashMap slots = new HashMap<>(L); - HashMap stacks = new HashMap<>(L); - List order = new ArrayList<>(L); - List validSlots = new ArrayList<>(L); - for (int i = 0; i < L; i++) { - if (!isValidSlot(i)) continue; - validSlots.add(i); - ItemStack s = mInventory[i]; - if (s == null) continue; - GT_Utility.ItemId sID = GT_Utility.ItemId.createNoCopy(s); - slots.merge(sID, s.stackSize, Integer::sum); - if (!stacks.containsKey(sID)) stacks.put(sID, s); - order.add(sID); - mInventory[i] = null; - } - int slotindex = 0; - for (GT_Utility.ItemId sID : order) { - int toSet = slots.get(sID); - if (toSet == 0) continue; - int slot = validSlots.get(slotindex); - slotindex++; - mInventory[slot] = stacks.get(sID) - .copy(); - toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); - mInventory[slot].stackSize = toSet; - slots.merge(sID, toSet, (a, b) -> a - b); - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("disableSort", disableSort); - aNBT.setBoolean("disableFilter", disableFilter); - aNBT.setBoolean("disableLimited", disableLimited); - if (mRecipeMap != null) { - aNBT.setString("recipeMap", mRecipeMap.unlocalizedName); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - disableSort = aNBT.getBoolean("disableSort"); - disableFilter = aNBT.getBoolean("disableFilter"); - if (aNBT.hasKey("disableLimited")) { - disableLimited = aNBT.getBoolean("disableLimited"); - } - mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("recipeMap")); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) - .isGUIClickable()) return; - if (aPlayer.isSneaking()) { - if (disableSort) { - disableSort = false; - } else { - if (disableLimited) { - disableLimited = false; - } else { - disableSort = true; - disableLimited = true; - } - } - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.hatch.disableSort." + disableSort) + " " - + StatCollector.translateToLocal("GT5U.hatch.disableLimited." + disableLimited)); - } else { - disableFilter = !disableFilter; - GT_Utility - .sendChatToPlayer(aPlayer, StatCollector.translateToLocal("GT5U.hatch.disableFilter." + disableFilter)); - } - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (aIndex == getCircuitSlot()) return false; - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side == getBaseMetaTileEntity().getFrontFacing() && aIndex != getCircuitSlot() - && (mRecipeMap == null || disableFilter || mRecipeMap.containsInput(aStack)) - && (disableLimited || limitedAllowPutStack(aIndex, aStack)); - } - - protected boolean limitedAllowPutStack(int aIndex, ItemStack aStack) { - for (int i = 0; i < getSizeInventory(); i++) - if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get_nocopy(aStack), mInventory[i])) return i == aIndex; - return mInventory[aIndex] == null; - } - - @Override - public boolean allowSelectCircuit() { - return true; - } - - @Override - public int getCircuitSlot() { - return getSlots(mTier); - } - - private void addSortStacksButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> !disableSort, - val -> disableSort = !val, - GT_UITextures.OVERLAY_BUTTON_SORTING_MODE, - () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP))); - } - - private void addOneStackLimitButton(ModularWindow.Builder builder) { - builder.widget(createToggleButton(() -> !disableLimited, val -> { - disableLimited = !val; - updateSlots(); - }, GT_UITextures.OVERLAY_BUTTON_ONE_STACK_LIMIT, () -> mTooltipCache.getData(ONE_STACK_LIMIT_TOOLTIP))); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - buildContext.addCloseListener(() -> uiButtonCount = 0); - addSortStacksButton(builder); - addOneStackLimitButton(builder); - // Remove one for ghost circuit slot - int slotCount = getSizeInventory(); - if (allowSelectCircuit()) { - slotCount = slotCount - 1; - } - // We do this to decouple slot count from tier in here, since there is no reason to do so. - switch (slotCount) { - case 1 -> getBaseMetaTileEntity().add1by1Slot(builder); - case 4 -> getBaseMetaTileEntity().add2by2Slots(builder); - case 9 -> getBaseMetaTileEntity().add3by3Slots(builder); - case 16 -> getBaseMetaTileEntity().add4by4Slots(builder); - default -> {} - } - } - - private Widget createToggleButton(Supplier getter, Consumer setter, UITexture picture, - Supplier tooltipDataSupplier) { - return new CycleButtonWidget().setToggle(getter, setter) - .setStaticTexture(picture) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62) - .setSize(BUTTON_SIZE, BUTTON_SIZE) - .setGTTooltip(tooltipDataSupplier); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java deleted file mode 100644 index 8a4d718244..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java +++ /dev/null @@ -1,459 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_IDLE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_IDLE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DUCTTAPE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MAINTENANCE; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.alignment.IAlignment; -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; -import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; -import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import cpw.mods.fml.common.network.NetworkRegistry; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import ic2.core.IHasGui; -import ic2.core.item.ItemToolbox; - -public class GT_MetaTileEntity_Hatch_Maintenance extends GT_MetaTileEntity_Hatch implements IAddUIWidgets, IAlignment { - - private Rotation rotation = Rotation.NORMAL; - - private static ItemStack[] sAutoMaintenanceInputs; - public boolean mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false, - mSolderingTool = false, mCrowbar = false, mAuto; - - public GT_MetaTileEntity_Hatch_Maintenance(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 1, "For maintaining Multiblocks"); - mAuto = false; - } - - public GT_MetaTileEntity_Hatch_Maintenance(int aID, String aName, String aNameRegional, int aTier, boolean aAuto) { - super(aID, aName, aNameRegional, aTier, 4, "For automatically maintaining Multiblocks"); - mAuto = aAuto; - } - - public GT_MetaTileEntity_Hatch_Maintenance(String aName, int aTier, String aDescription, ITexture[][][] aTextures, - boolean aAuto) { - super(aName, aTier, aAuto ? 4 : 1, aDescription, aTextures); - mAuto = aAuto; - } - - public GT_MetaTileEntity_Hatch_Maintenance(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, - boolean aAuto) { - super(aName, aTier, aAuto ? 4 : 1, aDescription, aTextures); - mAuto = aAuto; - } - - private static ItemStack[] getAutoMaintenanceInputs() { - if (sAutoMaintenanceInputs == null) sAutoMaintenanceInputs = new ItemStack[] { ItemList.Duct_Tape.get(4), - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Lubricant, 2), - GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 2) }; - return sAutoMaintenanceInputs; - } - - @Override - public String[] getDescription() { - String[] desc; - if (mAuto) { - desc = new String[mDescriptionArray.length + 3]; - System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); - desc[mDescriptionArray.length] = "4 Ducttape, 2 Lubricant Cells"; - desc[mDescriptionArray.length + 1] = "4 Steel Screws, 2 HV Circuits"; - desc[mDescriptionArray.length + 2] = "For each autorepair"; - } else { - desc = new String[mDescriptionArray.length + 1]; - System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); - desc[mDescriptionArray.length] = "Cannot be shared between Multiblocks!"; - } - return desc; - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - if (mAuto) return new ITexture[] { aBaseTexture, TextureFactory.builder() - .addIcon(OVERLAY_AUTOMAINTENANCE_IDLE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_AUTOMAINTENANCE_IDLE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { aBaseTexture, TextureFactory.builder() - .addIcon(OVERLAY_MAINTENANCE) - .extFacing() - .build() }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - if (mAuto) return new ITexture[] { aBaseTexture, TextureFactory.builder() - .addIcon(OVERLAY_AUTOMAINTENANCE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_AUTOMAINTENANCE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { aBaseTexture, TextureFactory.builder() - .addIcon(OVERLAY_MAINTENANCE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_DUCTTAPE) - .extFacing() - .build() }; - } - - @Override - public void initDefaultModes(NBTTagCompound aNBT) { - getBaseMetaTileEntity().setActive(true); - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return mAuto && GT_Mod.gregtechproxy.mAMHInteraction; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - if (aTileEntity.getMetaTileID() == 111) - return new GT_MetaTileEntity_Hatch_Maintenance(mName, mTier, mDescriptionArray, mTextures, true); - return new GT_MetaTileEntity_Hatch_Maintenance(mName, mTier, mDescriptionArray, mTextures, false); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - if (aBaseMetaTileEntity.isClientSide()) return true; - if (side == aBaseMetaTileEntity.getFrontFacing()) { - // only allow OC robot fake player - if (aPlayer instanceof FakePlayer && !aPlayer.getGameProfile() - .getName() - .endsWith(".robot")) return false; - ItemStack tStack = aPlayer.getCurrentEquippedItem(); - if (tStack != null) { - if (tStack.getItem() instanceof ItemToolbox) { - applyToolbox(tStack, aPlayer); - } else if (ItemList.Duct_Tape.isStackEqual(tStack)) { - mWrench = mScrewdriver = mSoftHammer = mHardHammer = mCrowbar = mSolderingTool = true; - getBaseMetaTileEntity().setActive(false); - if (--tStack.stackSize == 0) { - aPlayer.inventory.mainInventory[aPlayer.inventory.currentItem] = null; - } - } else GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - } else { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - } - return true; - } - return false; - } - - public void updateSlots() { - for (int i = 0; i < mInventory.length; i++) - if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - if (aBaseMetaTileEntity.isClientSide()) - StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide() && mAuto && aTick % 100L == 0L) { - aBaseMetaTileEntity.setActive(!isRecipeInputEqual(false)); - } - } - - @Override - public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, - float aX, float aY, float aZ) { - if (wrenchingSide != getBaseMetaTileEntity().getFrontFacing()) - return super.onWrenchRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); - if (!entityPlayer.isSneaking() && isRotationChangeAllowed()) { - toolSetRotation(null); - return true; - } - return false; - } - - public boolean autoMaintainance() { - return isRecipeInputEqual(true); - } - - public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess) { - ItemStack[] mInputs = getAutoMaintenanceInputs(); - - int amt; - - for (ItemStack tStack : mInputs) { - if (tStack != null) { - amt = tStack.stackSize; - boolean temp = true; - for (ItemStack aStack : mInventory) { - if ((GT_Utility.areUnificationsEqual(aStack, tStack, true) - || GT_Utility.areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tStack, true))) { - amt -= aStack.stackSize; - if (amt < 1) { - temp = false; - break; - } - } - } - if (temp) return false; - } - } - - if (aDecreaseStacksizeBySuccess) { - for (ItemStack tStack : mInputs) { - if (tStack != null) { - amt = tStack.stackSize; - for (ItemStack aStack : mInventory) { - if ((GT_Utility.areUnificationsEqual(aStack, tStack, true) || GT_Utility - .areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tStack, true))) { - if (aStack.stackSize < amt) { - amt -= aStack.stackSize; - aStack.stackSize = 0; - } else { - aStack.stackSize -= amt; - amt = 0; - break; - } - } - } - } - } - mCrowbar = true; - mHardHammer = true; - mScrewdriver = true; - mSoftHammer = true; - mSolderingTool = true; - mWrench = true; - updateSlots(); - } - return true; - } - - public void onToolClick(ItemStack aStack, EntityLivingBase aPlayer, IInventory aToolboxInventory) { - if (aStack == null || aPlayer == null) return; - - // Allow IC2 Toolbox with tools to function for maint issues. - if (aStack.getItem() instanceof ItemToolbox && aPlayer instanceof EntityPlayer) { - applyToolbox(aStack, (EntityPlayer) aPlayer); - return; - } - - if (GT_Utility.isStackInList(aStack, GregTech_API.sWrenchList) && !mWrench - && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mWrench = true; - if (GT_Utility.isStackInList(aStack, GregTech_API.sScrewdriverList) && !mScrewdriver - && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mScrewdriver = true; - if (GT_Utility.isStackInList(aStack, GregTech_API.sSoftHammerList) && !mSoftHammer - && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mSoftHammer = true; - if (GT_Utility.isStackInList(aStack, GregTech_API.sHardHammerList) && !mHardHammer - && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mHardHammer = true; - if (GT_Utility.isStackInList(aStack, GregTech_API.sCrowbarList) && !mCrowbar - && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mCrowbar = true; - if (!mSolderingTool && GT_ModHandler.useSolderingIron(aStack, aPlayer, aToolboxInventory)) - mSolderingTool = true; - if (GT_OreDictUnificator.isItemStackInstanceOf(aStack, "craftingDuctTape")) { - mWrench = mScrewdriver = mSoftHammer = mHardHammer = mCrowbar = mSolderingTool = true; - getBaseMetaTileEntity().setActive(false); - aStack.stackSize--; - } - if (mSolderingTool && aPlayer instanceof EntityPlayerMP tPlayer) { - try { - GT_Mod.achievements.issueAchievement(tPlayer, "maintainance"); - } catch (Exception ignored) {} - } - } - - public void onToolClick(ItemStack aStack, EntityLivingBase aPlayer) { - onToolClick(aStack, aPlayer, null); - } - - private void applyToolbox(ItemStack aStack, EntityPlayer aPlayer) { - final ItemToolbox aToolbox = (ItemToolbox) aStack.getItem(); - final IHasGui aToolboxGUI = aToolbox.getInventory(aPlayer, aStack); - for (int i = 0; i < aToolboxGUI.getSizeInventory(); i++) { - if (aToolboxGUI.getStackInSlot(i) != null) { - onToolClick(aToolboxGUI.getStackInSlot(i), aPlayer, aToolboxGUI); - if (aToolboxGUI.getStackInSlot(i) != null && aToolboxGUI.getStackInSlot(i).stackSize <= 0) - aToolboxGUI.setInventorySlotContents(i, null); - } - } - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return mAuto && GT_Mod.gregtechproxy.mAMHInteraction; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (mAuto && GT_Mod.gregtechproxy.mAMHInteraction) { - for (int i = 0; i < getSizeInventory(); i++) if (GT_Utility.areStacksEqual( - GT_OreDictUnificator.get(false, aStack), - GT_OreDictUnificator.get(false, getStackInSlot(i)))) return i == aIndex; - for (ItemStack tInput : getAutoMaintenanceInputs()) - if (GT_Utility.areUnificationsEqual(tInput, aStack, true) - || GT_Utility.areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tInput, true)) - return true; - } - return false; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - if (mAuto) { - getBaseMetaTileEntity().add2by2Slots(builder); - } else { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.SLOT_MAINTENANCE) - .setPos(78, 33) - .setSize(20, 20)) - .widget(new SlotWidget(BaseSlot.empty()) { - - @Override - public boolean handleDragAndDrop(ItemStack draggedStack, int button) { - return false; - } - - @Override - protected void phantomClick(ClickData clickData, ItemStack cursorStack) { - if (cursorStack == null) return; - onToolClick(cursorStack, getContext().getPlayer()); - if (cursorStack.stackSize < 1) { - getContext().getPlayer().inventory.setItemStack(null); - } - if (getContext().getPlayer() instanceof EntityPlayerMP) { - ((EntityPlayerMP) getContext().getPlayer()).updateHeldItem(); - } - } - }.disableShiftInsert() - .setBackground(GT_UITextures.TRANSPARENT) - .setPos(79, 34)) - .widget( - new TextWidget("Click with Tool to repair.").setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(8, 12)); - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setByte("mRotation", (byte) rotation.getIndex()); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - rotation = Rotation.byIndex(aNBT.getByte("mRotation")); - super.loadNBTData(aNBT); - } - - @Override - public ExtendedFacing getExtendedFacing() { - return ExtendedFacing.of(getBaseMetaTileEntity().getFrontFacing(), rotation, Flip.NONE); - } - - @Override - public void setExtendedFacing(ExtendedFacing alignment) { - boolean changed = false; - final IGregTechTileEntity base = getBaseMetaTileEntity(); - if (base.getFrontFacing() != alignment.getDirection()) { - base.setFrontFacing(alignment.getDirection()); - changed = true; - } - if (rotation != alignment.getRotation()) { - rotation = alignment.getRotation(); - changed = true; - } - if (changed) { - if (base.isServerSide() && !GregTech_API.isDummyWorld(base.getWorld())) { - StructureLibAPI.sendAlignment( - (IAlignmentProvider) base, - new NetworkRegistry.TargetPoint( - base.getWorld().provider.dimensionId, - base.getXCoord(), - base.getYCoord(), - base.getZCoord(), - 512)); - } else { - base.issueTextureUpdate(); - } - } - } - - @Override - public IAlignmentLimits getAlignmentLimits() { - return (d, r, f) -> f.isNotFlipped(); - } - - @Override - public boolean isFlipChangeAllowed() { - return false; - } - - @Override - public boolean isRotationChangeAllowed() { - return true; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java deleted file mode 100644 index 8707d0f804..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java +++ /dev/null @@ -1,208 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MUFFLER; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.enums.ParticleFX; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.WorldSpawnedEventBuilder; -import gregtech.common.GT_Pollution; - -@SuppressWarnings("unused") // Unused API is expected within scope -public class GT_MetaTileEntity_Hatch_Muffler extends GT_MetaTileEntity_Hatch { - - private static final String localizedDescFormat = GT_LanguageManager.addStringLocalization( - "gt.blockmachines.hatch.muffler.desc.format", - "Outputs the Pollution (Might cause ... things)%n" + "DO NOT OBSTRUCT THE OUTPUT!%n" - + "Reduces Pollution to %d%%%n" - + "Recovers %d%% of CO2/CO/SO2"); - private final int pollutionReduction = calculatePollutionReduction(100); - private final int pollutionRecover = 100 - pollutionReduction; - private final String[] description = String.format(localizedDescFormat, pollutionReduction, pollutionRecover) - .split("\\R"); - - public GT_MetaTileEntity_Hatch_Muffler(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 0, ""); - } - - public GT_MetaTileEntity_Hatch_Muffler(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String[] aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - this(aName, aTier, new String[] { aDescription }, aTextures); - } - - public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - this(aName, aTier, 0, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public String[] getDescription() { - return description; - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_MUFFLER) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_MUFFLER) }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_Muffler(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isClientSide() && this.getBaseMetaTileEntity() - .isActive()) { - pollutionParticles( - this.getBaseMetaTileEntity() - .getWorld(), - ParticleFX.LARGE_SMOKE.toString()); - } - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @SideOnly(Side.CLIENT) - public void pollutionParticles(World aWorld, String name) { - boolean chk1, chk2, chk3; - float ran1 = XSTR_INSTANCE.nextFloat(), ran2, ran3; - chk1 = ran1 * 100 < calculatePollutionReduction(100); - if (GT_Pollution.getPollution(getBaseMetaTileEntity()) >= GT_Mod.gregtechproxy.mPollutionSmogLimit) { - ran2 = XSTR_INSTANCE.nextFloat(); - ran3 = XSTR_INSTANCE.nextFloat(); - chk2 = ran2 * 100 < calculatePollutionReduction(100); - chk3 = ran3 * 100 < calculatePollutionReduction(100); - if (!(chk1 || chk2 || chk3)) return; - } else { - if (!chk1) return; - ran2 = ran3 = 0.0F; - chk2 = chk3 = false; - } - - final IGregTechTileEntity aMuffler = this.getBaseMetaTileEntity(); - final ForgeDirection aDir = aMuffler.getFrontFacing(); - final float xPos = aDir.offsetX * 0.76F + aMuffler.getXCoord() + 0.25F; - final float yPos = aDir.offsetY * 0.76F + aMuffler.getYCoord() + 0.25F; - final float zPos = aDir.offsetZ * 0.76F + aMuffler.getZCoord() + 0.25F; - - final float ySpd = aDir.offsetY * 0.1F + 0.2F + 0.1F * XSTR_INSTANCE.nextFloat(); - final float xSpd; - final float zSpd; - - if (aDir.offsetY == -1) { - final float temp = XSTR_INSTANCE.nextFloat() * 2 * (float) Math.PI; - xSpd = (float) Math.sin(temp) * 0.1F; - zSpd = (float) Math.cos(temp) * 0.1F; - } else { - xSpd = aDir.offsetX * (0.1F + 0.2F * XSTR_INSTANCE.nextFloat()); - zSpd = aDir.offsetZ * (0.1F + 0.2F * XSTR_INSTANCE.nextFloat()); - } - - final WorldSpawnedEventBuilder.ParticleEventBuilder events = new WorldSpawnedEventBuilder.ParticleEventBuilder() - .setIdentifier(name) - .setWorld(aWorld) - .setMotion(xSpd, ySpd, zSpd); - - if (chk1) { - events - .setPosition( - xPos + ran1 * 0.5F, - yPos + XSTR_INSTANCE.nextFloat() * 0.5F, - zPos + XSTR_INSTANCE.nextFloat() * 0.5F) - .run(); - } - if (chk2) { - events - .setPosition( - xPos + ran2 * 0.5F, - yPos + XSTR_INSTANCE.nextFloat() * 0.5F, - zPos + XSTR_INSTANCE.nextFloat() * 0.5F) - .run(); - } - if (chk3) { - events - .setPosition( - xPos + ran3 * 0.5F, - yPos + XSTR_INSTANCE.nextFloat() * 0.5F, - zPos + XSTR_INSTANCE.nextFloat() * 0.5F) - .run(); - } - } - - public int calculatePollutionReduction(int aPollution) { - if (mTier < 2) { - return aPollution; - } - return (int) ((float) aPollution * ((100F - 12.5F * ((float) mTier - 1F)) / 100F)); - } - - /** - * @param mte The multi-block controller's {@link MetaTileEntity} MetaTileEntity is passed so newer muffler hatches - * can do wacky things with the multis - * @return pollution success - */ - public boolean polluteEnvironment(MetaTileEntity mte) { - if (getBaseMetaTileEntity().getAirAtSide(getBaseMetaTileEntity().getFrontFacing())) { - GT_Pollution.addPollution(getBaseMetaTileEntity(), calculatePollutionReduction(10000)); - return true; - } - return false; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java deleted file mode 100644 index 267c2d0f1c..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java +++ /dev/null @@ -1,300 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_INPUT_HATCH_2x2; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; - -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; -import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_Hatch_MultiInput extends GT_MetaTileEntity_Hatch_Input implements IAddUIWidgets { - - private final FluidStack[] mStoredFluid; - private final FluidStackTank[] fluidTanks; - public final int mCapacityPer; - - public GT_MetaTileEntity_Hatch_MultiInput(int aID, int aSlot, String aName, String aNameRegional, int aTier) { - super(aID, aSlot, aName, aNameRegional, aTier); - this.mStoredFluid = new FluidStack[aSlot]; - fluidTanks = new FluidStackTank[aSlot]; - mCapacityPer = getCapacityPerTank(aTier, aSlot); - } - - public GT_MetaTileEntity_Hatch_MultiInput(int aID, int aSlot, String aName, String aNameRegional, int aTier, - String[] aDescription) { - super(aID, aSlot, aName, aNameRegional, aTier, aDescription); - this.mStoredFluid = new FluidStack[aSlot]; - fluidTanks = new FluidStackTank[aSlot]; - mCapacityPer = getCapacityPerTank(aTier, aSlot); - } - - public GT_MetaTileEntity_Hatch_MultiInput(String aName, int aSlot, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aSlot, aTier, aDescription, aTextures); - this.mStoredFluid = new FluidStack[aSlot]; - fluidTanks = new FluidStackTank[aSlot]; - mCapacityPer = getCapacityPerTank(aTier, aSlot); - for (int i = 0; i < aSlot; i++) { - final int index = i; - fluidTanks[i] = new FluidStackTank( - () -> mStoredFluid[index], - fluid -> mStoredFluid[index] = fluid, - mCapacityPer); - } - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_MultiInput(mName, getMaxType(), mTier, mDescriptionArray, mTextures); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (mStoredFluid != null) { - for (int i = 0; i < mStoredFluid.length; i++) { - if (mStoredFluid[i] != null) - aNBT.setTag("mFluid" + i, mStoredFluid[i].writeToNBT(new NBTTagCompound())); - } - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (mStoredFluid != null) { - for (int i = 0; i < mStoredFluid.length; i++) { - if (aNBT.hasKey("mFluid" + i)) { - mStoredFluid[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid" + i)); - } - } - } - } - - @Override - public boolean displaysStackSize() { - return true; - } - - public FluidStack[] getStoredFluid() { - return mStoredFluid; - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_INPUT_HATCH_2x2) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_INPUT_HATCH_2x2) }; - } - - public int getMaxType() { - return mStoredFluid.length; - } - - @Override - public FluidStack getFluid() { - for (FluidStack tFluid : mStoredFluid) { - if (tFluid != null && tFluid.amount > 0) return tFluid; - } - return null; - } - - public FluidStack getFluid(int aSlot) { - if (mStoredFluid == null || aSlot < 0 || aSlot >= getMaxType()) return null; - return mStoredFluid[aSlot]; - } - - @Override - public int getFluidAmount() { - if (getFluid() != null) { - return getFluid().amount; - } - return 0; - } - - @Override - public int getCapacity() { - return mCapacityPer; - } - - public int getFirstEmptySlot() { - for (int i = 0; i < mStoredFluid.length; i++) { - if (mStoredFluid[i] == null) return i; - } - return -1; - } - - public boolean hasFluid(FluidStack aFluid) { - if (aFluid == null) return false; - for (FluidStack tFluid : mStoredFluid) { - if (aFluid.isFluidEqual(tFluid)) return true; - } - return false; - } - - public int getFluidSlot(FluidStack tFluid) { - if (tFluid == null) return -1; - for (int i = 0; i < mStoredFluid.length; i++) { - if (tFluid.equals(mStoredFluid[i])) return i; - } - return -1; - } - - public int getFluidAmount(FluidStack tFluid) { - int tSlot = getFluidSlot(tFluid); - if (tSlot != -1) { - return mStoredFluid[tSlot].amount; - } - return 0; - } - - public void setFluid(FluidStack aFluid, int aSlot) { - if (aSlot < 0 || aSlot >= getMaxType()) return; - mStoredFluid[aSlot] = aFluid; - } - - public void addFluid(FluidStack aFluid, int aSlot) { - if (aSlot < 0 || aSlot >= getMaxType()) return; - if (aFluid.equals(mStoredFluid[aSlot])) mStoredFluid[aSlot].amount += aFluid.amount; - if (mStoredFluid[aSlot] == null) mStoredFluid[aSlot] = aFluid.copy(); - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - mFluid = getFluid(); - } - super.onPreTick(aBaseMetaTileEntity, aTick); - } - - @Override - public int fill(FluidStack aFluid, boolean doFill) { - if (aFluid == null || aFluid.getFluid() - .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0; - if (!hasFluid(aFluid) && getFirstEmptySlot() != -1) { - int tFilled = Math.min(aFluid.amount, mCapacityPer); - if (doFill) { - FluidStack tFluid = aFluid.copy(); - tFluid.amount = tFilled; - addFluid(tFluid, getFirstEmptySlot()); - getBaseMetaTileEntity().markDirty(); - } - return tFilled; - } - if (hasFluid(aFluid)) { - int tLeft = mCapacityPer - getFluidAmount(aFluid); - int tFilled = Math.min(tLeft, aFluid.amount); - if (doFill) { - FluidStack tFluid = aFluid.copy(); - tFluid.amount = tFilled; - addFluid(tFluid, getFluidSlot(tFluid)); - getBaseMetaTileEntity().markDirty(); - } - return tFilled; - } - return 0; - } - - @Override - public FluidStack drain(int maxDrain, boolean doDrain) { - if (getFluid() == null || !canTankBeEmptied()) return null; - if (getFluid().amount <= 0 && isFluidChangingAllowed()) { - setFluid(null, getFluidSlot(getFluid())); - getBaseMetaTileEntity().markDirty(); - return null; - } - FluidStack tRemove = getFluid().copy(); - tRemove.amount = Math.min(maxDrain, tRemove.amount); - if (doDrain) { - getFluid().amount -= tRemove.amount; - getBaseMetaTileEntity().markDirty(); - } - if (getFluid() == null || getFluid().amount <= 0 && isFluidChangingAllowed()) { - setFluid(null, getFluidSlot(getFluid())); - getBaseMetaTileEntity().markDirty(); - } - return tRemove; - } - - @Override - public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { - return fill(resource, doFill); - } - - @Override - public FluidStack drain(ForgeDirection from, FluidStack aFluid, boolean doDrain) { - if (aFluid == null || !hasFluid(aFluid)) return null; - FluidStack tStored = mStoredFluid[getFluidSlot(aFluid)]; - if (tStored.amount <= 0 && isFluidChangingAllowed()) { - setFluid(null, getFluidSlot(tStored)); - getBaseMetaTileEntity().markDirty(); - return null; - } - FluidStack tRemove = tStored.copy(); - tRemove.amount = Math.min(aFluid.amount, tRemove.amount); - if (doDrain) { - tStored.amount -= tRemove.amount; - getBaseMetaTileEntity().markDirty(); - } - if (tStored.amount <= 0 && isFluidChangingAllowed()) { - setFluid(null, getFluidSlot(tStored)); - getBaseMetaTileEntity().markDirty(); - } - return tRemove; - } - - @Override - public FluidTankInfo[] getTankInfo(ForgeDirection from) { - FluidTankInfo[] FTI = new FluidTankInfo[getMaxType()]; - for (int i = 0; i < getMaxType(); i++) { - FTI[i] = new FluidTankInfo(mStoredFluid[i], mCapacityPer); - } - return FTI; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide() && mStoredFluid != null) { - for (int i = 0; i < getMaxType(); i++) { - if (mStoredFluid[i] != null && mStoredFluid[i].amount <= 0) { - mStoredFluid[i] = null; - } - } - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex >= 4; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - final int SLOT_NUMBER = 4; - final Pos2d[] positions = new Pos2d[] { new Pos2d(70, 25), new Pos2d(88, 25), new Pos2d(70, 43), - new Pos2d(88, 43), }; - - for (int i = 0; i < SLOT_NUMBER; i++) { - builder.widget( - new FluidSlotWidget(fluidTanks[i]).setBackground(ModularUITextures.FLUID_SLOT) - .setPos(positions[i])); - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java deleted file mode 100644 index 2aa2410bd1..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java +++ /dev/null @@ -1,497 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; - -import java.lang.ref.WeakReference; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidContainerRegistry; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidContainerItem; -import net.minecraftforge.fluids.IFluidHandler; - -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.GT_Mod; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.fluid.IFluidStore; -import gregtech.api.interfaces.metatileentity.IFluidLockable; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.common.gui.modularui.widget.FluidLockWidget; - -public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch - implements IFluidStore, IFluidLockable, IAddUIWidgets { - - private String lockedFluidName = null; - private WeakReference playerThatLockedfluid = null; - public byte mMode = 0; - - public GT_MetaTileEntity_Hatch_Output(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 4, - new String[] { "Fluid Output for Multiblocks", - "Capacity: " + GT_Utility.formatNumbers(8000L * (1L << aTier)) + "L", - "Right click with screwdriver to restrict output", - "Can be restricted to put out Items and/or Steam/No Steam/1 specific Fluid", - "Restricted Output Hatches are given priority for Multiblock Fluid output" }); - } - - public GT_MetaTileEntity_Hatch_Output(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 4, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Output(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 4, aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_Output(int aID, String aName, String aNameRegional, int aTier, String[] aDescription, - int inventorySize) { - super(aID, aName, aNameRegional, aTier, inventorySize, aDescription); - } - - public GT_MetaTileEntity_Hatch_Output(String name, int tier, int slots, String[] description, - ITexture[][][] textures) { - super(name, tier, slots, description, textures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isLiquidInput(ForgeDirection side) { - return false; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_Output(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && mFluid != null) { - IFluidHandler tTileEntity = aBaseMetaTileEntity - .getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing()); - if (tTileEntity != null) { - GT_Utility.moveFluid( - aBaseMetaTileEntity, - tTileEntity, - aBaseMetaTileEntity.getFrontFacing(), - Math.max(1, mFluid.amount), - null); - } - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setByte("mMode", mMode); - if (isFluidLocked() && lockedFluidName != null && lockedFluidName.length() != 0) - aNBT.setString("lockedFluidName", lockedFluidName); - else aNBT.removeTag("lockedFluidName"); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mMode = aNBT.getByte("mMode"); - if (isFluidLocked()) { - lockedFluidName = aNBT.getString("lockedFluidName"); - } - lockedFluidName = GT_Utility.isStringInvalid(lockedFluidName) ? null : lockedFluidName; - } - - @Override - public boolean doesFillContainers() { - return true; - } - - @Override - public boolean doesEmptyContainers() { - return false; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return true; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - public int getLockedDisplaySlot() { - return 3; - } - - @Override - public boolean isValidSlot(int aIndex) { - // Because getStackDisplaySlot() only allow return one int, this place I only can manually set. - return aIndex != getStackDisplaySlot() && aIndex != getLockedDisplaySlot(); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0; - } - - @Override - public int getCapacity() { - return 8000 * (1 << mTier); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) - .isGUIClickable()) return; - if (aPlayer.isSneaking()) { - mMode = (byte) ((mMode + 9) % 10); - } else { - mMode = (byte) ((mMode + 1) % 10); - } - final String inBrackets; - switch (mMode) { - case 0 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("108", "Outputs misc. Fluids, Steam and Items")); - this.setLockedFluidName(null); - } - case 1 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("109", "Outputs Steam and Items")); - this.setLockedFluidName(null); - } - case 2 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("110", "Outputs Steam and misc. Fluids")); - this.setLockedFluidName(null); - } - case 3 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("111", "Outputs Steam")); - this.setLockedFluidName(null); - } - case 4 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("112", "Outputs misc. Fluids and Items")); - this.setLockedFluidName(null); - } - case 5 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("113", "Outputs only Items")); - this.setLockedFluidName(null); - } - case 6 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("114", "Outputs only misc. Fluids")); - this.setLockedFluidName(null); - } - case 7 -> { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("115", "Outputs nothing")); - this.setLockedFluidName(null); - } - case 8 -> { - playerThatLockedfluid = new WeakReference<>(aPlayer); - if (mFluid == null) { - this.setLockedFluidName(null); - inBrackets = GT_Utility.trans( - "115.3", - "currently none, will be locked to the next that is put in (or use fluid cell to lock)"); - } else { - this.setLockedFluidName( - this.getDrainableStack() - .getFluid() - .getName()); - inBrackets = this.getDrainableStack() - .getLocalizedName(); - } - GT_Utility.sendChatToPlayer( - aPlayer, - String.format( - "%s (%s)", - GT_Utility.trans("151.1", "Outputs items and 1 specific Fluid"), - inBrackets)); - } - case 9 -> { - playerThatLockedfluid = new WeakReference<>(aPlayer); - if (mFluid == null) { - this.setLockedFluidName(null); - inBrackets = GT_Utility.trans( - "115.3", - "currently none, will be locked to the next that is put in (or use fluid cell to lock)"); - } else { - this.setLockedFluidName( - this.getDrainableStack() - .getFluid() - .getName()); - inBrackets = this.getDrainableStack() - .getLocalizedName(); - } - GT_Utility.sendChatToPlayer( - aPlayer, - String.format("%s (%s)", GT_Utility.trans("151.2", "Outputs 1 specific Fluid"), inBrackets)); - } - } - } - - private boolean tryToLockHatch(EntityPlayer aPlayer, ForgeDirection side) { - if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) - .isGUIClickable()) return false; - if (!isFluidLocked()) return false; - final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); - if (tCurrentItem == null) return false; - FluidStack tFluid = FluidContainerRegistry.getFluidForFilledItem(tCurrentItem); - if (tFluid == null && tCurrentItem.getItem() instanceof IFluidContainerItem) - tFluid = ((IFluidContainerItem) tCurrentItem.getItem()).getFluid(tCurrentItem); - if (tFluid != null) { - if (getLockedFluidName() != null && !getLockedFluidName().equals( - tFluid.getFluid() - .getName())) { - GT_Utility.sendChatToPlayer( - aPlayer, - String.format( - "%s %s", - GT_Utility.trans( - "151.3", - "Hatch is locked to a different fluid. To change the locking, empty it and made it locked to the next fluid with a screwdriver. Currently locked to"), - StatCollector.translateToLocal(getLockedFluidName()))); - } else { - setLockedFluidName( - tFluid.getFluid() - .getName()); - if (mMode == 8) GT_Utility.sendChatToPlayer( - aPlayer, - String.format( - "%s (%s)", - GT_Utility.trans("151.1", "Outputs items and 1 specific Fluid"), - tFluid.getLocalizedName())); - else GT_Utility.sendChatToPlayer( - aPlayer, - String.format( - "%s (%s)", - GT_Utility.trans("151.2", "Outputs 1 specific Fluid"), - tFluid.getLocalizedName())); - } - return true; - } - return false; - } - - public byte getMode() { - return mMode; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - if (tryToLockHatch(aPlayer, side)) return true; - return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); - } - - public boolean outputsSteam() { - return mMode < 4; - } - - public boolean outputsLiquids() { - return mMode % 2 == 0 || mMode == 9; - } - - public boolean outputsItems() { - return mMode % 4 < 2 && mMode != 9; - } - - @Override - public String getLockedFluidName() { - return lockedFluidName; - } - - @Override - public void setLockedFluidName(String lockedFluidName) { - this.lockedFluidName = lockedFluidName; - markDirty(); - } - - @Override - public void lockFluid(boolean lock) { - if (lock) { - if (!isFluidLocked()) { - this.mMode = 9; - markDirty(); - } - } else { - this.mMode = 0; - setLockedFluidName(null); - markDirty(); - } - } - - @Override - public boolean isFluidLocked() { - return mMode == 8 || mMode == 9; - } - - @Override - public boolean acceptsFluidLock(String name) { - return true; - } - - @Override - public boolean isEmptyAndAcceptsAnyFluid() { - return mMode == 0 && getFluidAmount() == 0; - } - - @Override - public boolean canStoreFluid(@Nonnull FluidStack fluidStack) { - if (mFluid != null && !GT_Utility.areFluidsEqual(mFluid, fluidStack)) { - return false; - } - if (isFluidLocked()) { - if (lockedFluidName == null) { - return true; - } - return lockedFluidName.equals( - fluidStack.getFluid() - .getName()); - } - if (GT_ModHandler.isSteam(fluidStack)) { - return outputsSteam(); - } - return outputsLiquids(); - } - - @Override - public int getTankPressure() { - return +100; - } - - @Override - protected void onEmptyingContainerWhenEmpty() { - if (this.lockedFluidName == null && this.mFluid != null && isFluidLocked()) { - this.setLockedFluidName( - this.mFluid.getFluid() - .getName()); - final EntityPlayer player; - if (playerThatLockedfluid == null || (player = playerThatLockedfluid.get()) == null) return; - GT_Utility.sendChatToPlayer( - player, - String.format(GT_Utility.trans("151.4", "Successfully locked Fluid to %s"), mFluid.getLocalizedName())); - playerThatLockedfluid = null; - } - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - return new String[] { EnumChatFormatting.BLUE + "Output Hatch" + EnumChatFormatting.RESET, "Stored Fluid:", - EnumChatFormatting.GOLD + (mFluid == null ? "No Fluid" : mFluid.getLocalizedName()) - + EnumChatFormatting.RESET, - EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mFluid == null ? 0 : mFluid.amount) - + " L" - + EnumChatFormatting.RESET - + " " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getCapacity()) - + " L" - + EnumChatFormatting.RESET, - (!isFluidLocked() || lockedFluidName == null) ? "Not Locked" - : ("Locked to " + StatCollector.translateToLocal( - FluidRegistry.getFluidStack(lockedFluidName, 1) - .getUnlocalizedName())) }; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setPos(98, 16) - .setSize(71, 45)) - .widget(new FluidLockWidget(this).setPos(149, 41)) - .widget( - new TextWidget("Locked Fluid").setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(101, 20)) - .widget(TextWidget.dynamicString(() -> { - FluidStack fluidStack = FluidRegistry.getFluidStack(lockedFluidName, 1); - return fluidStack != null ? fluidStack.getLocalizedName() : "None"; - }) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setTextAlignment(Alignment.CenterLeft) - .setMaxWidth(65) - .setPos(101, 30)) - .widget(new FakeSyncWidget.ByteSyncer(() -> mMode, val -> mMode = val)); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java deleted file mode 100644 index 0bfe55cac1..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java +++ /dev/null @@ -1,323 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.Textures.BlockIcons.ITEM_OUT_SIGN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; -import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.Nullable; - -import com.gtnewhorizons.modularui.api.forge.ItemHandlerHelper; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; - -import gregtech.GT_Mod; -import gregtech.api.enums.ItemList; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.widgets.GT_PhantomItemButton; -import gregtech.api.interfaces.IDataCopyable; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IItemLockable; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.extensions.ArrayExt; - -public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch - implements IAddUIWidgets, IItemLockable, IDataCopyable { - - private static final String DATA_STICK_DATA_TYPE = "outputBusFilter"; - private static final String LOCKED_ITEM_NBT_KEY = "lockedItem"; - - protected ItemStack lockedItem = null; - - public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier) { - this(aID, aName, aNameRegional, aTier, getSlots(aTier)); - } - - public GT_MetaTileEntity_Hatch_OutputBus(int id, String name, String nameRegional, int tier, int slots) { - super( - id, - name, - nameRegional, - tier, - slots, - ArrayExt.of( - "Item Output for Multiblocks", - "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : ""), - "Left click with data stick to save filter config", - "Right click with data stick to load filter config")); - } - - public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription) { - super(aID, aName, aNameRegional, aTier, getSlots(aTier), aDescription); - } - - public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription, int inventorySize) { - super(aID, aName, aNameRegional, aTier, inventorySize, aDescription); - } - - public GT_MetaTileEntity_Hatch_OutputBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, getSlots(aTier), aDescription, aTextures); - } - - public GT_MetaTileEntity_Hatch_OutputBus(String name, int tier, int slots, String[] description, - ITexture[][][] textures) { - super(name, tier, slots, description, textures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch - ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) } - : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_OutputBus(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!acceptsItemLock() || !(aPlayer instanceof EntityPlayerMP)) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return super.onRightclick(aBaseMetaTileEntity, aPlayer); - } - - final ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return super.onRightclick(aBaseMetaTileEntity, aPlayer); - } - - if (!pasteCopiedData(aPlayer, dataStick.stackTagCompound)) { - aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.invalid")); - return false; - } - - aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.loaded")); - return true; - - } - - @Override - public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!acceptsItemLock() || !(aPlayer instanceof EntityPlayerMP)) { - return; - } - final ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { - return; - } - - dataStick.stackTagCompound = getCopiedData(aPlayer); - dataStick.setStackDisplayName("Output Bus Configuration"); - aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.saved")); - } - - @Override - public NBTTagCompound getCopiedData(EntityPlayer player) { - final NBTTagCompound nbt = new NBTTagCompound(); - nbt.setString("type", DATA_STICK_DATA_TYPE); - if (lockedItem != null) { - nbt.setTag(LOCKED_ITEM_NBT_KEY, lockedItem.writeToNBT(new NBTTagCompound())); - } - return nbt; - } - - @Override - public boolean pasteCopiedData(EntityPlayer player, NBTTagCompound nbt) { - if (nbt == null || !DATA_STICK_DATA_TYPE.equals(nbt.getString("type"))) return false; - if (nbt.hasKey(LOCKED_ITEM_NBT_KEY)) { - lockedItem = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(LOCKED_ITEM_NBT_KEY)); - } else { - lockedItem = null; - } - return true; - } - - @Override - public String getCopiedDataIdentifier(EntityPlayer player) { - return DATA_STICK_DATA_TYPE; - } - - /** - * Attempt to store as many items as possible into the internal inventory of this output bus. If you need atomicity - * you should use {@link gregtech.api.interfaces.tileentity.IHasInventory#addStackToSlot(int, ItemStack)} - * - * @param aStack Assume valid. Will be mutated. Take over the ownership. Caller should not retain a reference to - * this stack if the call returns true. - * @return true if stack is fully accepted. false is stack is partially accepted or nothing is accepted - */ - public boolean storeAll(ItemStack aStack) { - markDirty(); - - if (lockedItem != null && !lockedItem.isItemEqual(aStack)) { - return false; - } - - for (int i = 0, mInventoryLength = mInventory.length; i < mInventoryLength && aStack.stackSize > 0; i++) { - ItemStack tSlot = mInventory[i]; - if (GT_Utility.isStackInvalid(tSlot)) { - int tRealStackLimit = Math.min(getInventoryStackLimit(), aStack.getMaxStackSize()); - if (aStack.stackSize <= tRealStackLimit) { - mInventory[i] = aStack; - return true; - } - mInventory[i] = aStack.splitStack(tRealStackLimit); - } else { - int tRealStackLimit = Math.min(getInventoryStackLimit(), tSlot.getMaxStackSize()); - if (tSlot.stackSize < tRealStackLimit && tSlot.isItemEqual(aStack) - && ItemStack.areItemStackTagsEqual(tSlot, aStack)) { - if (aStack.stackSize + tSlot.stackSize <= tRealStackLimit) { - mInventory[i].stackSize += aStack.stackSize; - return true; - } else { - // more to serve - aStack.stackSize -= tRealStackLimit - tSlot.stackSize; - mInventory[i].stackSize = tRealStackLimit; - } - } - } - } - return false; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side == aBaseMetaTileEntity.getFrontFacing(); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && (aTick & 0x7) == 0) { - final IInventory tTileEntity = aBaseMetaTileEntity - .getIInventoryAtSide(aBaseMetaTileEntity.getFrontFacing()); - if (tTileEntity != null) { - moveMultipleItemStacks( - aBaseMetaTileEntity, - tTileEntity, - aBaseMetaTileEntity.getFrontFacing(), - aBaseMetaTileEntity.getBackFacing(), - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1, - mInventory.length); - for (int i = 0; i < mInventory.length; i++) - if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; - } - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (lockedItem != null) { - aNBT.setTag(LOCKED_ITEM_NBT_KEY, lockedItem.writeToNBT(new NBTTagCompound())); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey(LOCKED_ITEM_NBT_KEY)) { - lockedItem = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(LOCKED_ITEM_NBT_KEY)); - } - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - switch (mTier) { - case 0 -> getBaseMetaTileEntity().add1by1Slot(builder); - case 1 -> getBaseMetaTileEntity().add2by2Slots(builder); - case 2 -> getBaseMetaTileEntity().add3by3Slots(builder); - default -> getBaseMetaTileEntity().add4by4Slots(builder); - } - - if (acceptsItemLock()) { - builder.widget( - new GT_PhantomItemButton(this).setPos(getGUIWidth() - 25, 40) - .setBackground(GT_PhantomItemButton.FILTER_BACKGROUND)); - } - } - - @Override - public void setLockedItem(@Nullable ItemStack itemStack) { - if (itemStack == null) { - clearLock(); - } else { - lockedItem = ItemHandlerHelper.copyStackWithSize(itemStack, 1); - } - } - - @Nullable - @Override - public ItemStack getLockedItem() { - return lockedItem; - } - - @Override - public void clearLock() { - lockedItem = null; - } - - @Override - public boolean isLocked() { - return lockedItem != null; - } - - @Override - public boolean acceptsItemLock() { - return true; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java deleted file mode 100644 index e0ab7acf95..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java +++ /dev/null @@ -1,27 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; - -public class GT_MetaTileEntity_Hatch_QuadrupleHumongous extends GT_MetaTileEntity_Hatch_MultiInput { - - public GT_MetaTileEntity_Hatch_QuadrupleHumongous(int aID, int aSlot, String aName, String aNameRegional) { - super(aID, aSlot, aName, aNameRegional, 13); - } - - public GT_MetaTileEntity_Hatch_QuadrupleHumongous(String aName, int aSlot, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aSlot, aTier, aDescription, aTextures); - } - - @Override - public int getCapacityPerTank(int aTier, int aSlot) { - return 500_000_000; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_QuadrupleHumongous(mName, getMaxType(), mTier, mDescriptionArray, mTextures); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MagHatch.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MagHatch.java deleted file mode 100644 index 8a462d12c6..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MagHatch.java +++ /dev/null @@ -1,103 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_EMS_HOUSING; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_EMS_HOUSING_GLOW; - -import net.minecraft.entity.player.EntityPlayer; -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.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_IndustrialElectromagneticSeparator; - -public class GT_MetaTileEntity_MagHatch extends GT_MetaTileEntity_Hatch { - - public GT_MetaTileEntity_MagHatch(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, 5, 1, "Holds electromagnet for the Magnetic Flux Exhibitor"); - } - - public GT_MetaTileEntity_MagHatch(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription[0], aTextures); - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public String[] getDescription() { - return ArrayUtils.addAll(this.mDescriptionArray, AuthorFourIsTheNumber); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new SlotWidget(inventoryHandler, 0) - .setFilter(GT_MetaTileEntity_IndustrialElectromagneticSeparator::isValidElectromagnet) - .setAccess(true, true) - .setPos(79, 34)); - } - - @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 ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.builder() - .addIcon(OVERLAY_EMS_HOUSING) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_EMS_HOUSING_GLOW) - .extFacing() - .glow() - .build() }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.builder() - .addIcon(OVERLAY_EMS_HOUSING) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_EMS_HOUSING_GLOW) - .extFacing() - .glow() - .build() }; - } - - @Override - public int getInventoryStackLimit() { - return 1; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MagHatch(mName, mTier, mDescriptionArray, mTextures); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java deleted file mode 100644 index 6c2df9b082..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java +++ /dev/null @@ -1,2754 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.util.GT_Utility.filterValidMTEs; -import static gregtech.api.util.GT_Utility.formatNumbers; -import static mcp.mobius.waila.api.SpecialChars.GREEN; -import static mcp.mobius.waila.api.SpecialChars.RED; -import static mcp.mobius.waila.api.SpecialChars.RESET; - -import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.IntConsumer; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.TestOnly; - -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.VoidingMode; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.fluid.IFluidStore; -import gregtech.api.interfaces.metatileentity.IItemLockable; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.modularui.IBindPlayerInventoryUI; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SingleRecipeCheck; -import gregtech.api.util.GT_ClientPreference; -import gregtech.api.util.GT_ExoticEnergyInputHelper; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_ParallelHelper; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.GT_Waila; -import gregtech.api.util.OutputHatchWrapper; -import gregtech.api.util.VoidProtectionHelper; -import gregtech.api.util.shutdown.ShutDownReason; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.client.GT_SoundLoop; -import gregtech.common.GT_Pollution; -import gregtech.common.config.machinestats.ConfigMachines; -import gregtech.common.gui.modularui.widget.CheckRecipeResultSyncer; -import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer; -import gregtech.common.items.GT_MetaGenerated_Tool_01; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME; -import gregtech.common.tileentities.machines.IDualInputHatch; -import gregtech.common.tileentities.machines.IDualInputInventory; -import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch; -import gregtech.common.tileentities.machines.ISmartInputHatch; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine; -import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; -import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity - implements ControllerWithOptionalFeatures, IAddGregtechLogo, IAddUIWidgets, IBindPlayerInventoryUI { - - public static boolean disableMaintenance; - public boolean hasMaintenanceChecks = getDefaultHasMaintenanceChecks(); - public boolean mMachine = false, mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false, - mSolderingTool = false, mCrowbar = false, mRunningOnLoad = false; - public boolean mStructureChanged = false; - public int mPollution = 0, mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mEfficiencyIncrease = 0, - mStartUpCheck = 100, mRuntime = 0, mEfficiency = 0; - public volatile boolean mUpdated = false; - public int mUpdate = 0; - public ItemStack[] mOutputItems = null; - public FluidStack[] mOutputFluids = null; - public String mNEI; - public int damageFactorLow = 5; - public float damageFactorHigh = 0.6f; - public int machineMode = 0; - public List machineModeIcons = new ArrayList(); - - public boolean mLockedToSingleRecipe = getDefaultRecipeLockingMode(); - protected boolean inputSeparation = getDefaultInputSeparationMode(); - protected VoidingMode voidingMode = getDefaultVoidingMode(); - protected boolean batchMode = getDefaultBatchMode(); - protected @Nonnull CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.NONE; - - protected static final String INPUT_SEPARATION_NBT_KEY = "inputSeparation"; - protected static final String VOID_EXCESS_NBT_KEY = "voidExcess"; - protected static final String VOIDING_MODE_NBT_KEY = "voidingMode"; - protected static final String BATCH_MODE_NBT_KEY = "batchMode"; - protected SingleRecipeCheck mSingleRecipeCheck = null; - - public ArrayList mInputHatches = new ArrayList<>(); - public ArrayList mOutputHatches = new ArrayList<>(); - public ArrayList mInputBusses = new ArrayList<>(); - public ArrayList mOutputBusses = new ArrayList<>(); - public ArrayList mDualInputHatches = new ArrayList<>(); - public ArrayList mSmartInputHatches = new ArrayList<>(); - public ArrayList mDynamoHatches = new ArrayList<>(); - public ArrayList mMufflerHatches = new ArrayList<>(); - public ArrayList mEnergyHatches = new ArrayList<>(); - public ArrayList mMaintenanceHatches = new ArrayList<>(); - protected List mExoticEnergyHatches = new ArrayList<>(); - protected final ProcessingLogic processingLogic; - @SideOnly(Side.CLIENT) - protected GT_SoundLoop activitySoundLoop; - - protected long mLastWorkingTick = 0, mTotalRunTime = 0; - private static final int CHECK_INTERVAL = 100; // How often should we check for a new recipe on an idle machine? - private final int randomTickOffset = (int) (Math.random() * CHECK_INTERVAL + 1); - - protected static final byte INTERRUPT_SOUND_INDEX = 8; - protected static final byte PROCESS_START_SOUND_INDEX = 1; - - public GT_MetaTileEntity_MultiBlockBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, 2); - this.processingLogic = null; - GT_MetaTileEntity_MultiBlockBase.disableMaintenance = ConfigMachines.disableMaintenanceChecks; - this.damageFactorLow = ConfigMachines.damageFactorLow; - this.damageFactorHigh = ConfigMachines.damageFactorHigh; - this.mNEI = ""; - if (!shouldCheckMaintenance()) fixAllIssues(); - } - - public GT_MetaTileEntity_MultiBlockBase(String aName) { - super(aName, 2); - this.processingLogic = createProcessingLogic(); - GT_MetaTileEntity_MultiBlockBase.disableMaintenance = ConfigMachines.disableMaintenanceChecks; - this.damageFactorLow = ConfigMachines.damageFactorLow; - this.damageFactorHigh = ConfigMachines.damageFactorHigh; - if (!shouldCheckMaintenance()) fixAllIssues(); - } - - @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { - return side != getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (supportsSingleRecipeLocking()) { - mLockedToSingleRecipe = !mLockedToSingleRecipe; - if (mLockedToSingleRecipe) { - GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("223", "Single recipe locking enabled. Will lock to next recipe.")); - } else { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("220", "Single recipe locking disabled.")); - mSingleRecipeCheck = null; - } - } - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex > 0; - } - - @Override - public int getProgresstime() { - return mProgresstime; - } - - @Override - public int maxProgresstime() { - return mMaxProgresstime; - } - - public long getTotalRuntimeInTicks() { - return mTotalRunTime; - } - - @Override - public int increaseProgress(int aProgress) { - return aProgress; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setInteger("mEUt", mEUt); - aNBT.setInteger("mProgresstime", mProgresstime); - aNBT.setInteger("mMaxProgresstime", mMaxProgresstime); - aNBT.setInteger("mEfficiencyIncrease", mEfficiencyIncrease); - aNBT.setInteger("mEfficiency", mEfficiency); - aNBT.setInteger("mPollution", mPollution); - aNBT.setInteger("mRuntime", mRuntime); - aNBT.setLong("mTotalRunTime", mTotalRunTime); - aNBT.setLong("mLastWorkingTick", mLastWorkingTick); - aNBT.setString("checkRecipeResultID", checkRecipeResult.getID()); - aNBT.setTag("checkRecipeResult", checkRecipeResult.writeToNBT(new NBTTagCompound())); - - if (supportsMachineModeSwitch()) { - aNBT.setInteger("machineMode", machineMode); - } - - if (supportsSingleRecipeLocking()) { - aNBT.setBoolean("mLockedToSingleRecipe", mLockedToSingleRecipe); - if (mLockedToSingleRecipe && mSingleRecipeCheck != null) - aNBT.setTag("mSingleRecipeCheck", mSingleRecipeCheck.writeToNBT()); - } - - if (mOutputItems != null) { - aNBT.setInteger("mOutputItemsLength", mOutputItems.length); - for (int i = 0; i < mOutputItems.length; i++) if (mOutputItems[i] != null) { - GT_Utility.saveItem(aNBT, "mOutputItem" + i, mOutputItems[i]); - } - } - if (mOutputFluids != null) { - aNBT.setInteger("mOutputFluidsLength", mOutputFluids.length); - for (int i = 0; i < mOutputFluids.length; i++) if (mOutputFluids[i] != null) { - NBTTagCompound tNBT = new NBTTagCompound(); - mOutputFluids[i].writeToNBT(tNBT); - aNBT.setTag("mOutputFluids" + i, tNBT); - } - } - aNBT.setBoolean("mWrench", mWrench); - aNBT.setBoolean("mScrewdriver", mScrewdriver); - aNBT.setBoolean("mSoftHammer", mSoftHammer); - aNBT.setBoolean("mHardHammer", mHardHammer); - aNBT.setBoolean("mSolderingTool", mSolderingTool); - aNBT.setBoolean("mCrowbar", mCrowbar); - aNBT.setBoolean(BATCH_MODE_NBT_KEY, batchMode); - aNBT.setBoolean(INPUT_SEPARATION_NBT_KEY, inputSeparation); - aNBT.setString(VOIDING_MODE_NBT_KEY, voidingMode.name); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - mEUt = aNBT.getInteger("mEUt"); - mProgresstime = aNBT.getInteger("mProgresstime"); - mMaxProgresstime = aNBT.getInteger("mMaxProgresstime"); - if (mMaxProgresstime > 0) mRunningOnLoad = true; - mEfficiencyIncrease = aNBT.getInteger("mEfficiencyIncrease"); - mEfficiency = aNBT.getInteger("mEfficiency"); - mPollution = aNBT.getInteger("mPollution"); - mRuntime = aNBT.getInteger("mRuntime"); - mTotalRunTime = aNBT.getLong("mTotalRunTime"); - mLastWorkingTick = aNBT.getLong("mLastWorkingTick"); - - String checkRecipeResultID = aNBT.getString("checkRecipeResultID"); - if (CheckRecipeResultRegistry.isRegistered(checkRecipeResultID)) { - CheckRecipeResult result = CheckRecipeResultRegistry.getSampleFromRegistry(checkRecipeResultID) - .newInstance(); - result.readFromNBT(aNBT.getCompoundTag("checkRecipeResult")); - checkRecipeResult = result; - } - - if (aNBT.hasKey("machineMode")) { - machineMode = aNBT.getInteger("machineMode"); - } - if (supportsSingleRecipeLocking()) { - mLockedToSingleRecipe = aNBT.getBoolean("mLockedToSingleRecipe"); - if (mLockedToSingleRecipe && aNBT.hasKey("mSingleRecipeCheck", Constants.NBT.TAG_COMPOUND)) { - SingleRecipeCheck c = loadSingleRecipeChecker(aNBT.getCompoundTag("mSingleRecipeCheck")); - if (c != null) mSingleRecipeCheck = c; - // the old recipe is gone. we disable the machine to prevent making garbage in case of shared inputs - // maybe use a better way to inform player in the future. - else getBaseMetaTileEntity().disableWorking(); - } - } - batchMode = aNBT.getBoolean(BATCH_MODE_NBT_KEY); - inputSeparation = aNBT.getBoolean(INPUT_SEPARATION_NBT_KEY); - if (aNBT.hasKey(VOIDING_MODE_NBT_KEY, Constants.NBT.TAG_STRING)) { - voidingMode = VoidingMode.fromName(aNBT.getString(VOIDING_MODE_NBT_KEY)); - } else if (aNBT.hasKey(VOID_EXCESS_NBT_KEY)) { - // backward compatibility - voidingMode = aNBT.getBoolean(VOID_EXCESS_NBT_KEY) ? VoidingMode.VOID_ALL : VoidingMode.VOID_NONE; - } - if (!getAllowedVoidingModes().contains(voidingMode)) voidingMode = getDefaultVoidingMode(); - - int aOutputItemsLength = aNBT.getInteger("mOutputItemsLength"); - if (aOutputItemsLength > 0) { - mOutputItems = new ItemStack[aOutputItemsLength]; - for (int i = 0; i < mOutputItems.length; i++) - mOutputItems[i] = GT_Utility.loadItem(aNBT, "mOutputItem" + i); - } - - int aOutputFluidsLength = aNBT.getInteger("mOutputFluidsLength"); - if (aOutputFluidsLength > 0) { - mOutputFluids = new FluidStack[aOutputFluidsLength]; - for (int i = 0; i < mOutputFluids.length; i++) - mOutputFluids[i] = GT_Utility.loadFluid(aNBT, "mOutputFluids" + i); - } - if (shouldCheckMaintenance()) { - mWrench = aNBT.getBoolean("mWrench"); - mScrewdriver = aNBT.getBoolean("mScrewdriver"); - mSoftHammer = aNBT.getBoolean("mSoftHammer"); - mHardHammer = aNBT.getBoolean("mHardHammer"); - mSolderingTool = aNBT.getBoolean("mSolderingTool"); - mCrowbar = aNBT.getBoolean("mCrowbar"); - } else fixAllIssues(); - } - - protected SingleRecipeCheck loadSingleRecipeChecker(NBTTagCompound aNBT) { - return SingleRecipeCheck.tryLoad(getRecipeMap(), aNBT); - } - - public boolean saveOtherHatchConfiguration(EntityPlayer player) { - return true; - } - - public boolean loadOtherHatchConfiguration(EntityPlayer player) { - return true; - } - - @Override - public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isServerSide() && GT_Util.saveMultiblockInputConfiguration(this, aPlayer)) { - aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.MULTI_MACHINE_CONFIG.SAVE")); - return; - } - super.onLeftclick(aBaseMetaTileEntity, aPlayer); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (GT_Util.hasMultiblockInputConfiguration(aPlayer.getHeldItem())) { - if (aBaseMetaTileEntity.isServerSide()) { - if (GT_Util.loadMultiblockInputConfiguration(this, aPlayer)) { - aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.MULTI_MACHINE_CONFIG.LOAD")); - } else { - aPlayer - .addChatComponentMessage(new ChatComponentTranslation("GT5U.MULTI_MACHINE_CONFIG.LOAD.FAIL")); - } - } - return true; - } - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public byte getTileEntityBaseType() { - return 2; - } - - /** - * Set the structure as having changed, and trigger an update. - */ - public void onStructureChange() { - mStructureChanged = true; - } - - @Override - public void onMachineBlockUpdate() { - mUpdated = true; - } - - /** - * ClearHatches as a part of structure check. If your multiblock has any hatches that need clearing override this - * method, call super, and clear your own hatches - */ - public void clearHatches() { - mInputHatches.clear(); - mInputBusses.clear(); - mOutputHatches.clear(); - mOutputBusses.clear(); - mDynamoHatches.clear(); - mEnergyHatches.clear(); - setMufflers(false); - mMufflerHatches.clear(); - mMaintenanceHatches.clear(); - mDualInputHatches.clear(); - mSmartInputHatches.clear(); - } - - public boolean checkStructure(boolean aForceReset) { - return checkStructure(aForceReset, getBaseMetaTileEntity()); - } - - public boolean checkStructure(boolean aForceReset, IGregTechTileEntity aBaseMetaTileEntity) { - if (!aBaseMetaTileEntity.isServerSide()) return mMachine; - // Only trigger an update if forced (from onPostTick, generally), or if the structure has changed - if ((mStructureChanged || aForceReset)) { - clearHatches(); - mMachine = checkMachine(aBaseMetaTileEntity, mInventory[1]); - } - mStructureChanged = false; - return mMachine; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - // Time Counter - mTotalRunTime++; - if (mEfficiency < 0) mEfficiency = 0; - if (mUpdated) { - // duct tape fix for too many updates on an overloaded server, causing the structure check to not run - if (mUpdate <= 0) mUpdate = 50; - mUpdated = false; - } - if (--mUpdate == 0 || --mStartUpCheck == 0) { - checkStructure(true, aBaseMetaTileEntity); - } - - if (mStartUpCheck < 0) { - if (mMachine) { - checkMaintenance(); - if (getRepairStatus() > 0) { - runMachine(aBaseMetaTileEntity, aTick); - } else if (aBaseMetaTileEntity.isAllowedToWork()) { - stopMachine(ShutDownReasonRegistry.NO_REPAIR); - } - } else if (aBaseMetaTileEntity.isAllowedToWork()) { - stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE); - } - } - aBaseMetaTileEntity.setErrorDisplayID( - (aBaseMetaTileEntity.getErrorDisplayID() & ~127) | (mWrench ? 0 : 1) - | (mScrewdriver ? 0 : 2) - | (mSoftHammer ? 0 : 4) - | (mHardHammer ? 0 : 8) - | (mSolderingTool ? 0 : 16) - | (mCrowbar ? 0 : 32) - | (mMachine ? 0 : 64)); - aBaseMetaTileEntity.setActive(mMaxProgresstime > 0); - boolean active = aBaseMetaTileEntity.isActive() && mPollution > 0; - setMufflers(active); - } else { - if (!aBaseMetaTileEntity.hasMufflerUpgrade()) { - doActivitySound(getActivitySoundLoop()); - } - } - } - - @Override - public void onTickFail(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onTickFail(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide()) { - aBaseMetaTileEntity.disableWorking(); - checkRecipeResult = CheckRecipeResultRegistry.CRASH; - } - } - - public void checkMaintenance() { - if (!shouldCheckMaintenance()) return; - - if (getRepairStatus() != getIdealStatus()) { - for (GT_MetaTileEntity_Hatch_Maintenance tHatch : filterValidMTEs(mMaintenanceHatches)) { - if (tHatch.mAuto) tHatch.autoMaintainance(); - if (tHatch.mWrench) mWrench = true; - if (tHatch.mScrewdriver) mScrewdriver = true; - if (tHatch.mSoftHammer) mSoftHammer = true; - if (tHatch.mHardHammer) mHardHammer = true; - if (tHatch.mSolderingTool) mSolderingTool = true; - if (tHatch.mCrowbar) mCrowbar = true; - - tHatch.mWrench = false; - tHatch.mScrewdriver = false; - tHatch.mSoftHammer = false; - tHatch.mHardHammer = false; - tHatch.mSolderingTool = false; - tHatch.mCrowbar = false; - } - } - } - - /** - * Starts checking recipe with some operations needed to actually run the check. Overriding this without due care - * may result in dupe of items, hence it's marked as final. - *

- * See {@link #createProcessingLogic()} or {@link #checkProcessing()} for what you want to override. - * - * @return If successfully found recipe and/or started processing - */ - protected final boolean checkRecipe() { - startRecipeProcessing(); - CheckRecipeResult result = checkProcessing(); - if (!CheckRecipeResultRegistry.isRegistered(result.getID())) { - throw new RuntimeException(String.format("Result %s is not registered for registry", result.getID())); - } - if (result.wasSuccessful()) { - sendStartMultiBlockSoundLoop(); - } - this.checkRecipeResult = result; - endRecipeProcessing(); - // Don't use `result` here because `endRecipeProcessing()` might mutate `this.checkRecipeResult` - return this.checkRecipeResult.wasSuccessful(); - } - - private boolean shouldCheckRecipeThisTick(long aTick) { - // do a recipe check if any crafting input hatch just got pushed in items - boolean shouldCheck = false; - // check all of them (i.e. do not return early) to reset the state of all of them. - for (IDualInputHatch craftingInputMe : mDualInputHatches) { - shouldCheck |= craftingInputMe.justUpdated(); - } - if (shouldCheck) return true; - // Do the same for Smart Input Hatches - for (ISmartInputHatch smartInputHatch : mSmartInputHatches) { - shouldCheck |= smartInputHatch.justUpdated(); - } - if (shouldCheck) return true; - - // Perform more frequent recipe change after the machine just shuts down. - long timeElapsed = mTotalRunTime - mLastWorkingTick; - - if (timeElapsed >= CHECK_INTERVAL) return (mTotalRunTime + randomTickOffset) % CHECK_INTERVAL == 0; - // Batch mode should be a lot less aggressive at recipe checking - if (!isBatchModeEnabled()) { - return timeElapsed == 5 || timeElapsed == 12 - || timeElapsed == 20 - || timeElapsed == 30 - || timeElapsed == 40 - || timeElapsed == 55 - || timeElapsed == 70 - || timeElapsed == 85; - } - return false; - } - - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (mMaxProgresstime > 0 && doRandomMaintenanceDamage()) { - if (onRunningTick(mInventory[1])) { - markDirty(); - if (!polluteEnvironment(getPollutionPerTick(mInventory[1]))) { - stopMachine(ShutDownReasonRegistry.POLLUTION_FAIL); - } - if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) { - if (mOutputItems != null) { - for (ItemStack tStack : mOutputItems) { - if (tStack != null) { - try { - GT_Mod.achievements.issueAchivementHatch( - aBaseMetaTileEntity.getWorld() - .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), - tStack); - } catch (Exception ignored) {} - addOutput(tStack); - } - } - mOutputItems = null; - } - if (mOutputFluids != null) { - addFluidOutputs(mOutputFluids); - if (mOutputFluids.length > 1) { - try { - GT_Mod.achievements.issueAchievement( - aBaseMetaTileEntity.getWorld() - .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), - "oilplant"); - } catch (Exception ignored) {} - } - mOutputFluids = null; - } - mEfficiency = Math.max( - 0, - Math.min( - mEfficiency + mEfficiencyIncrease, - getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000))); - mOutputItems = null; - mProgresstime = 0; - mMaxProgresstime = 0; - mEfficiencyIncrease = 0; - mLastWorkingTick = mTotalRunTime; - if (aBaseMetaTileEntity.isAllowedToWork()) { - checkRecipe(); - } - } - } - } else { - // Check if the machine is enabled in the first place! - if (aBaseMetaTileEntity.isAllowedToWork()) { - - if (shouldCheckRecipeThisTick(aTick) || aBaseMetaTileEntity.hasWorkJustBeenEnabled() - || aBaseMetaTileEntity.hasInventoryBeenModified()) { - if (checkRecipe()) { - markDirty(); - } - } - if (mMaxProgresstime <= 0) mEfficiency = Math.max(0, mEfficiency - 1000); - } - } - } - - public boolean polluteEnvironment(int aPollutionLevel) { - mPollution += aPollutionLevel; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - if (mPollution >= 10000) { - if (tHatch.polluteEnvironment(this)) { - mPollution -= 10000; - } - } else { - break; - } - } - return mPollution < 10000; - } - - protected void sendStartMultiBlockSoundLoop() { - if (getProcessStartSound() != null) { - sendLoopStart(PROCESS_START_SOUND_INDEX); - } - } - - @Override - public void doSound(byte aIndex, double aX, double aY, double aZ) { - super.doSound(aIndex, aX, aY, aZ); - switch (aIndex) { - case PROCESS_START_SOUND_INDEX -> { - if (getProcessStartSound() != null) - GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); - } - case INTERRUPT_SOUND_INDEX -> GT_Utility - .doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == PROCESS_START_SOUND_INDEX) { - if (getProcessStartSound() != null) - GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); - } - } - - @SideOnly(Side.CLIENT) - protected void doActivitySound(ResourceLocation activitySound) { - if (getBaseMetaTileEntity().isActive() && activitySound != null) { - if (activitySoundLoop == null) { - activitySoundLoop = new GT_SoundLoop(activitySound, getBaseMetaTileEntity(), false, true); - Minecraft.getMinecraft() - .getSoundHandler() - .playSound(activitySoundLoop); - } - } else { - if (activitySoundLoop != null) { - activitySoundLoop = null; - } - } - } - - /** - * @return Time before the start process sound is played again - */ - protected int getTimeBetweenProcessSounds() { - return 100; - } - - /** - * @return Sound that will be played once, when the recipe check was valid - */ - protected SoundResource getProcessStartSound() { - return null; - } - - /** - * @return Sound that will be looped for as long as the machine is doing a recipe - */ - @SideOnly(Side.CLIENT) - protected ResourceLocation getActivitySoundLoop() { - return null; - } - - /** - * Called every tick the Machine runs - */ - public boolean onRunningTick(ItemStack aStack) { - if (mEUt > 0) { - addEnergyOutput(((long) mEUt * mEfficiency) / 10000); - return true; - } - if (mEUt < 0) { - if (!drainEnergyInput(getActualEnergyUsage())) { - stopMachine(ShutDownReasonRegistry.POWER_LOSS); - return false; - } - } - return true; - } - - protected long getActualEnergyUsage() { - return ((long) -mEUt * 10_000) / Math.max(1000, mEfficiency); - } - - /** - * Checks if this is a Correct Machine Part for this kind of Machine (Turbine Rotor for example) - */ - public abstract boolean isCorrectMachinePart(ItemStack aStack); - - /** - * @deprecated Use {@link #createProcessingLogic()} or {@link #checkProcessing()} - */ - @Deprecated - public boolean checkRecipe(ItemStack aStack) { - return false; - } - - /** - * Checks recipe and setup machine if it's successful. - *

- * For generic machine working with recipemap, use {@link #createProcessingLogic()} to make use of shared codebase. - */ - @Nonnull - public CheckRecipeResult checkProcessing() { - // If no logic is found, try legacy checkRecipe - if (processingLogic == null) { - return checkRecipe(mInventory[1]) ? CheckRecipeResultRegistry.SUCCESSFUL - : CheckRecipeResultRegistry.NO_RECIPE; - } - - setupProcessingLogic(processingLogic); - - CheckRecipeResult result = doCheckRecipe(); - result = postCheckRecipe(result, processingLogic); - // inputs are consumed at this point - updateSlots(); - if (!result.wasSuccessful()) return result; - - mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); - mEfficiencyIncrease = 10000; - mMaxProgresstime = processingLogic.getDuration(); - setEnergyUsage(processingLogic); - - mOutputItems = processingLogic.getOutputItems(); - mOutputFluids = processingLogic.getOutputFluids(); - - return result; - } - - /** - * @return If controller slot should be considered as inputs for {@link #doCheckRecipe} - */ - protected boolean canUseControllerSlotForRecipe() { - return true; - } - - /** - * Initializes processing logic for use. Unlike {@link #createProcessingLogic}, this method is called - * every time checking for recipes. - */ - protected void setupProcessingLogic(ProcessingLogic logic) { - logic.clear(); - logic.setMachine(this); - logic.setRecipeMapSupplier(this::getRecipeMap); - logic.setVoidProtection(protectsExcessItem(), protectsExcessFluid()); - logic.setBatchSize(isBatchModeEnabled() ? getMaxBatchSize() : 1); - logic.setRecipeLocking(this, isRecipeLockingEnabled()); - setProcessingLogicPower(logic); - } - - /** - * Initializes processing logic for use, specifically for power-related parameters. - * Unlike {@link #createProcessingLogic}, this method is called every time checking for recipes. - */ - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(getAverageInputVoltage()); - logic.setAvailableAmperage(getMaxInputAmps()); - logic.setAmperageOC(mEnergyHatches.size() != 1); - } - - protected boolean supportsCraftingMEBuffer() { - return true; - } - - /** - * Iterates over hatches and tries to find recipe. Assume {@link #processingLogic} is already set up for use. - * If return value is successful, inputs are consumed. - */ - @Nonnull - protected CheckRecipeResult doCheckRecipe() { - CheckRecipeResult result = CheckRecipeResultRegistry.NO_RECIPE; - // check crafting input hatches first - if (supportsCraftingMEBuffer()) { - for (IDualInputHatch dualInputHatch : mDualInputHatches) { - for (var it = dualInputHatch.inventories(); it.hasNext();) { - IDualInputInventory slot = it.next(); - processingLogic.setInputItems(slot.getItemInputs()); - processingLogic.setInputFluids(slot.getFluidInputs()); - CheckRecipeResult foundResult = processingLogic.process(); - if (foundResult.wasSuccessful()) { - return foundResult; - } - if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { - // Recipe failed in interesting way, so remember that and continue searching - result = foundResult; - } - } - } - } - - processingLogic.setInputFluids(getStoredFluids()); - - if (isInputSeparationEnabled()) { - if (mInputBusses.isEmpty()) { - CheckRecipeResult foundResult = processingLogic.process(); - if (foundResult.wasSuccessful()) { - return foundResult; - } - if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { - // Recipe failed in interesting way, so remember that and continue searching - result = foundResult; - } - } else { - for (GT_MetaTileEntity_Hatch_InputBus bus : mInputBusses) { - if (bus instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) { - continue; - } - List inputItems = new ArrayList<>(); - for (int i = bus.getSizeInventory() - 1; i >= 0; i--) { - ItemStack stored = bus.getStackInSlot(i); - if (stored != null) { - inputItems.add(stored); - } - } - if (canUseControllerSlotForRecipe() && getControllerSlot() != null) { - inputItems.add(getControllerSlot()); - } - processingLogic.setInputItems(inputItems.toArray(new ItemStack[0])); - CheckRecipeResult foundResult = processingLogic.process(); - if (foundResult.wasSuccessful()) { - return foundResult; - } - if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { - // Recipe failed in interesting way, so remember that and continue searching - result = foundResult; - } - } - } - } else { - List inputItems = getStoredInputs(); - if (canUseControllerSlotForRecipe() && getControllerSlot() != null) { - inputItems.add(getControllerSlot()); - } - processingLogic.setInputItems(inputItems); - CheckRecipeResult foundResult = processingLogic.process(); - if (foundResult.wasSuccessful()) { - return foundResult; - } - if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { - // Recipe failed in interesting way, so remember that - result = foundResult; - } - } - return result; - } - - /** - * Performs additional check for {@link #processingLogic} after all the calculations are done. - * As many as checks should be done inside of custom {@link ProcessingLogic}, which you can specify with - * {@link #createProcessingLogic()}, because when this method is called, inputs might have been already consumed. - * However, certain checks cannot be done like that; Checking energy overflow should be suppressed for - * long-power machines for example. - * - * @return Modified (or not modified) result - */ - @Nonnull - protected CheckRecipeResult postCheckRecipe(@Nonnull CheckRecipeResult result, - @Nonnull ProcessingLogic processingLogic) { - if (result.wasSuccessful() && processingLogic.getCalculatedEut() > Integer.MAX_VALUE) { - return CheckRecipeResultRegistry.POWER_OVERFLOW; - } - return result; - } - - /** - * Called after {@link #doCheckRecipe} and {@link #postCheckRecipe} being successful. - * Override to set energy usage for this machine. - */ - protected void setEnergyUsage(ProcessingLogic processingLogic) { - // getCalculatedEut() is guaranteed to not exceed int by postCheckRecipe() - mEUt = (int) processingLogic.getCalculatedEut(); - if (mEUt > 0) { - mEUt = (-mEUt); - } - } - - protected int getMaxBatchSize() { - return 128; - } - - /** - * Checks the Machine. You have to assign the MetaTileEntities for the Hatches here. - */ - public abstract boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack); - - /** - * Gets the maximum Efficiency that spare Part can get (0 - 10000) - */ - public abstract int getMaxEfficiency(ItemStack aStack); - - /** - * Gets the pollution this Device outputs to a Muffler per tick (10000 = one Pullution Block) - */ - public int getPollutionPerTick(ItemStack aStack) { - return getPollutionPerSecond(aStack) / 20; - } - - /** - * Gets the pollution produced per second by this multiblock, default to 0. Override this with its actual value in - * the code of the multiblock. - */ - public int getPollutionPerSecond(ItemStack aStack) { - return 0; - } - - /** - * Gets the damage to the ItemStack, usually 0 or 1. - */ - public abstract int getDamageToComponent(ItemStack aStack); - - /** - * If it explodes when the Component has to be replaced. - */ - public abstract boolean explodesOnComponentBreak(ItemStack aStack); - - /** - * @deprecated Use {@link #stopMachine(ShutDownReason)} - */ - @Deprecated - public void stopMachine() { - stopMachine(ShutDownReasonRegistry.NONE); - } - - /** - * @deprecated Use {@link #stopMachine(ShutDownReason)} - */ - @Deprecated - public void criticalStopMachine() { - stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); - } - - public void stopMachine(@Nonnull ShutDownReason reason) { - if (!ShutDownReasonRegistry.isRegistered(reason.getID())) { - throw new RuntimeException(String.format("Reason %s is not registered for registry", reason.getID())); - } - mLastWorkingTick = mTotalRunTime; - mOutputItems = null; - mOutputFluids = null; - mEUt = 0; - mEfficiency = 0; - mProgresstime = 0; - mMaxProgresstime = 0; - mEfficiencyIncrease = 0; - getBaseMetaTileEntity().disableWorking(); - getBaseMetaTileEntity().setShutDownReason(reason); - getBaseMetaTileEntity().setShutdownStatus(true); - if (reason.wasCritical()) { - sendSound(INTERRUPT_SOUND_INDEX); - } - } - - public int getRepairStatus() { - return (mWrench ? 1 : 0) + (mScrewdriver ? 1 : 0) - + (mSoftHammer ? 1 : 0) - + (mHardHammer ? 1 : 0) - + (mSolderingTool ? 1 : 0) - + (mCrowbar ? 1 : 0); - } - - public int getIdealStatus() { - return 6; - } - - public int getCurrentEfficiency(ItemStack itemStack) { - int maxEff = getMaxEfficiency(itemStack); - return maxEff - (getIdealStatus() - getRepairStatus()) * maxEff / 10; - } - - public boolean doRandomMaintenanceDamage() { - if (!isCorrectMachinePart(mInventory[1])) { - stopMachine(ShutDownReasonRegistry.NO_MACHINE_PART); - return false; - } - if (shouldCheckMaintenance() && getRepairStatus() == 0) { - stopMachine(ShutDownReasonRegistry.NO_REPAIR); - return false; - } - if (mRuntime++ > 1000) { - mRuntime = 0; - if (shouldCheckMaintenance() && getBaseMetaTileEntity().getRandomNumber(6000) == 0) { - causeMaintenanceIssue(); - } - if (mInventory[1] != null && getBaseMetaTileEntity().getRandomNumber(2) == 0 - && !mInventory[1].getUnlocalizedName() - .startsWith("gt.blockmachines.basicmachine.")) { - if (mInventory[1].getItem() instanceof GT_MetaGenerated_Tool_01) { - NBTTagCompound tNBT = mInventory[1].getTagCompound(); - ((GT_MetaGenerated_Tool) mInventory[1].getItem()).doDamage( - mInventory[1], - (long) getDamageToComponent(mInventory[1]) - * (long) Math.min(mEUt / this.damageFactorLow, Math.pow(mEUt, this.damageFactorHigh))); - if (mInventory[1].stackSize == 0) mInventory[1] = null; - } - } - } - return true; - } - - public void causeMaintenanceIssue() { - 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; - } - } - - public void explodeMultiblock() { - - GT_Log.exp.println( - "MultiBlockExplosion at: " + this.getBaseMetaTileEntity() - .getXCoord() - + " | " - + this.getBaseMetaTileEntity() - .getYCoord() - + " | " - + this.getBaseMetaTileEntity() - .getZCoord() - + " DIMID: " - + this.getBaseMetaTileEntity() - .getWorld().provider.dimensionId - + "."); - - GT_Pollution.addPollution(getBaseMetaTileEntity(), GT_Mod.gregtechproxy.mPollutionOnExplosion); - mInventory[1] = null; - // noinspection unchecked // In this case, the inspection only indicates that the array can be abused in runtime - Iterable allHatches = Iterables.concat( - mInputBusses, - mOutputBusses, - mInputHatches, - mOutputHatches, - mDynamoHatches, - mMufflerHatches, - mEnergyHatches, - mMaintenanceHatches); - for (MetaTileEntity tTileEntity : allHatches) { - if (tTileEntity != null && tTileEntity.getBaseMetaTileEntity() != null) { - tTileEntity.getBaseMetaTileEntity() - .doExplosion(V[8]); - } - } - getBaseMetaTileEntity().doExplosion(V[8]); - } - - public boolean addEnergyOutput(long aEU) { - if (aEU <= 0) { - return true; - } - if (mDynamoHatches.size() > 0) { - return addEnergyOutputMultipleDynamos(aEU, true); - } - return false; - } - - public boolean addEnergyOutputMultipleDynamos(long aEU, boolean aAllowMixedVoltageDynamos) { - int injected = 0; - long totalOutput = 0; - long aFirstVoltageFound = -1; - boolean aFoundMixedDynamos = false; - for (GT_MetaTileEntity_Hatch_Dynamo aDynamo : filterValidMTEs(mDynamoHatches)) { - long aVoltage = aDynamo.maxEUOutput(); - long aTotal = aDynamo.maxAmperesOut() * aVoltage; - // Check against voltage to check when hatch mixing - if (aFirstVoltageFound == -1) { - aFirstVoltageFound = aVoltage; - } else { - if (aFirstVoltageFound != aVoltage) { - aFoundMixedDynamos = true; - } - } - totalOutput += aTotal; - } - - if (totalOutput < aEU || (aFoundMixedDynamos && !aAllowMixedVoltageDynamos)) { - explodeMultiblock(); - return false; - } - - long leftToInject; - long aVoltage; - int aAmpsToInject; - int aRemainder; - int ampsOnCurrentHatch; - for (GT_MetaTileEntity_Hatch_Dynamo aDynamo : filterValidMTEs(mDynamoHatches)) { - leftToInject = aEU - injected; - aVoltage = aDynamo.maxEUOutput(); - aAmpsToInject = (int) (leftToInject / aVoltage); - aRemainder = (int) (leftToInject - (aAmpsToInject * aVoltage)); - ampsOnCurrentHatch = (int) Math.min(aDynamo.maxAmperesOut(), aAmpsToInject); - for (int i = 0; i < ampsOnCurrentHatch; i++) { - aDynamo.getBaseMetaTileEntity() - .increaseStoredEnergyUnits(aVoltage, false); - } - injected += aVoltage * ampsOnCurrentHatch; - if (aRemainder > 0 && ampsOnCurrentHatch < aDynamo.maxAmperesOut()) { - aDynamo.getBaseMetaTileEntity() - .increaseStoredEnergyUnits(aRemainder, false); - injected += aRemainder; - } - } - return injected > 0; - } - - /** - * Sums up voltage of energy hatches. Amperage does not matter. - */ - public long getMaxInputVoltage() { - long rVoltage = 0; - for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) - rVoltage += tHatch.getBaseMetaTileEntity() - .getInputVoltage(); - return rVoltage; - } - - public long getAverageInputVoltage() { - return GT_ExoticEnergyInputHelper.getAverageInputVoltageMulti(mEnergyHatches); - } - - public long getMaxInputAmps() { - return GT_ExoticEnergyInputHelper.getMaxWorkingInputAmpsMulti(mEnergyHatches); - } - - public long getMaxInputEu() { - return GT_ExoticEnergyInputHelper.getTotalEuMulti(mEnergyHatches); - } - - /** - * Sums up max input EU/t of energy hatches, amperage included. - */ - public long getMaxInputPower() { - long eut = 0; - for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { - IGregTechTileEntity baseTile = tHatch.getBaseMetaTileEntity(); - eut += baseTile.getInputVoltage() * baseTile.getInputAmperage(); - } - return eut; - } - - /** - * Returns voltage tier of energy hatches. If multiple tiers are found, returns 0. - */ - public long getInputVoltageTier() { - long rTier = 0; - if (mEnergyHatches.size() > 0) { - rTier = mEnergyHatches.get(0) - .getInputTier(); - for (int i = 1; i < mEnergyHatches.size(); i++) { - if (mEnergyHatches.get(i) - .getInputTier() != rTier) return 0; - } - } - - return rTier; - } - - /** - * Calcualtes the overclockedness using long integers - * - * @param aEUt - recipe EUt - * @param aDuration - recipe Duration - * @param mAmperage - should be 1 ? - * @param maxInputVoltage - Multiblock Max input voltage. Voltage is rounded up to higher tier voltage. - * @param perfectOC - If the Multiblock OCs perfectly, i.e. the large Chemical Reactor - */ - protected void calculateOverclockedNessMultiInternal(long aEUt, int aDuration, int mAmperage, long maxInputVoltage, - boolean perfectOC) { - byte tier = (byte) Math.max(0, GT_Utility.getTier(maxInputVoltage)); - GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(aEUt) - .setEUt(V[tier] * mAmperage) - .setDuration(aDuration) - .setDurationDecreasePerOC(perfectOC ? 4.0 : 2.0) - .calculate(); - mEUt = (int) calculator.getConsumption(); - mMaxProgresstime = calculator.getDuration(); - } - - @Deprecated - protected void calculateOverclockedNessMulti(int aEUt, int aDuration, int mAmperage, long maxInputVoltage) { - calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, false); - } - - protected void calculateOverclockedNessMulti(long aEUt, int aDuration, int mAmperage, long maxInputVoltage) { - calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, false); - } - - @Deprecated - protected void calculatePerfectOverclockedNessMulti(int aEUt, int aDuration, int mAmperage, long maxInputVoltage) { - calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, true); - } - - protected void calculatePerfectOverclockedNessMulti(long aEUt, int aDuration, int mAmperage, long maxInputVoltage) { - calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, true); - } - - public boolean drainEnergyInput(long aEU) { - if (aEU <= 0) return true; - for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { - if (tHatch.getBaseMetaTileEntity() - .decreaseStoredEnergyUnits(aEU, false)) return true; - } - return false; - } - - protected static boolean dumpFluid(List aOutputHatches, FluidStack copiedFluidStack, - boolean restrictiveHatchesOnly) { - for (GT_MetaTileEntity_Hatch_Output tHatch : filterValidMTEs(aOutputHatches)) { - if (restrictiveHatchesOnly && tHatch.mMode == 0) { - continue; - } - if (!tHatch.canStoreFluid(copiedFluidStack)) continue; - int tAmount = tHatch.fill(copiedFluidStack, false); - if (tAmount >= copiedFluidStack.amount) { - boolean filled = tHatch.fill(copiedFluidStack, true) >= copiedFluidStack.amount; - tHatch.onEmptyingContainerWhenEmpty(); - return filled; - } else if (tAmount > 0) { - copiedFluidStack.amount = copiedFluidStack.amount - tHatch.fill(copiedFluidStack, true); - tHatch.onEmptyingContainerWhenEmpty(); - } - } - return false; - } - - public boolean addOutput(FluidStack aLiquid) { - if (aLiquid == null) return false; - FluidStack copiedFluidStack = aLiquid.copy(); - if (!dumpFluid(mOutputHatches, copiedFluidStack, true)) { - dumpFluid(mOutputHatches, copiedFluidStack, false); - } - return false; - } - - protected void addFluidOutputs(FluidStack[] mOutputFluids2) { - for (FluidStack outputFluidStack : mOutputFluids2) { - addOutput(outputFluidStack); - } - } - - public boolean depleteInput(FluidStack aLiquid) { - return depleteInput(aLiquid, false); - } - - public boolean depleteInput(FluidStack aLiquid, boolean simulate) { - if (aLiquid == null) return false; - for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) { - setHatchRecipeMap(tHatch); - FluidStack tLiquid = tHatch.drain(ForgeDirection.UNKNOWN, aLiquid, false); - if (tLiquid != null && tLiquid.amount >= aLiquid.amount) { - if (simulate) { - return true; - } - tLiquid = tHatch.drain(ForgeDirection.UNKNOWN, aLiquid, true); - return tLiquid != null && tLiquid.amount >= aLiquid.amount; - } - } - return false; - } - - public boolean addOutput(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return false; - aStack = GT_Utility.copyOrNull(aStack); - - final List filteredBuses = filterValidMTEs(mOutputBusses); - if (dumpItem(filteredBuses, aStack, true) || dumpItem(filteredBuses, aStack, false)) { - return true; - } - - boolean outputSuccess = true; - // noinspection DataFlowIssue - while (outputSuccess && aStack.stackSize > 0) { - outputSuccess = false; - ItemStack single = aStack.splitStack(1); - for (GT_MetaTileEntity_Hatch_Output tHatch : filterValidMTEs(mOutputHatches)) { - if (!outputSuccess && tHatch.outputsItems()) { - if (tHatch.getBaseMetaTileEntity() - .addStackToSlot(1, single)) outputSuccess = true; - } - } - } - return outputSuccess; - } - - private boolean dumpItem(List outputBuses, ItemStack itemStack, - boolean restrictiveBusesOnly) { - for (GT_MetaTileEntity_Hatch_OutputBus outputBus : outputBuses) { - if (restrictiveBusesOnly && !outputBus.isLocked()) { - continue; - } - - if (outputBus.storeAll(itemStack)) { - return true; - } - } - - return false; - } - - public boolean depleteInput(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return false; - FluidStack aLiquid = GT_Utility.getFluidForFilledItem(aStack, true); - if (aLiquid != null) return depleteInput(aLiquid); - for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) { - setHatchRecipeMap(tHatch); - if (GT_Utility.areStacksEqual( - aStack, - tHatch.getBaseMetaTileEntity() - .getStackInSlot(0))) { - if (tHatch.getBaseMetaTileEntity() - .getStackInSlot(0).stackSize >= aStack.stackSize) { - tHatch.getBaseMetaTileEntity() - .decrStackSize(0, aStack.stackSize); - return true; - } - } - } - for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) { - tHatch.mRecipeMap = getRecipeMap(); - for (int i = tHatch.getBaseMetaTileEntity() - .getSizeInventory() - 1; i >= 0; i--) { - if (GT_Utility.areStacksEqual( - aStack, - tHatch.getBaseMetaTileEntity() - .getStackInSlot(i))) { - if (tHatch.getBaseMetaTileEntity() - .getStackInSlot(i).stackSize >= aStack.stackSize) { - tHatch.getBaseMetaTileEntity() - .decrStackSize(i, aStack.stackSize); - return true; - } - } - } - } - return false; - } - - public ArrayList getStoredOutputs() { - ArrayList rList = new ArrayList<>(); - for (GT_MetaTileEntity_Hatch_OutputBus tHatch : filterValidMTEs(mOutputBusses)) { - for (int i = tHatch.getBaseMetaTileEntity() - .getSizeInventory() - 1; i >= 0; i--) { - rList.add( - tHatch.getBaseMetaTileEntity() - .getStackInSlot(i)); - } - } - return rList; - } - - public ArrayList getStoredFluids() { - ArrayList rList = new ArrayList<>(); - Map inputsFromME = new HashMap<>(); - for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) { - setHatchRecipeMap(tHatch); - if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput multiInputHatch) { - for (FluidStack tFluid : multiInputHatch.getStoredFluid()) { - if (tFluid != null) { - rList.add(tFluid); - } - } - } else if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) { - for (FluidStack fluidStack : meHatch.getStoredFluids()) { - if (fluidStack != null) { - // Prevent the same fluid from different ME hatches from being recognized - inputsFromME.put(fluidStack.getFluid(), fluidStack); - } - } - } else { - if (tHatch.getFillableStack() != null) { - rList.add(tHatch.getFillableStack()); - } - } - } - - if (!inputsFromME.isEmpty()) { - rList.addAll(inputsFromME.values()); - } - return rList; - } - - /** - * Drains fluid from the given hatch, including {@link IDualInputHatch}. Should never be used during recipe check! - * - * @param doDrain If false, fluid will not actually be consumed - * @return Whether the hatch contains enough fluid to drain - */ - public boolean drain(GT_MetaTileEntity_Hatch hatch, FluidStack fluid, boolean doDrain) { - if (fluid == null || hatch == null) return false; - if (supportsCraftingMEBuffer() && hatch instanceof IDualInputHatch tHatch && tHatch.supportsFluids()) { - Optional inventory = tHatch.getFirstNonEmptyInventory(); - if (inventory.isPresent()) { - for (FluidStack storedFluid : Lists.newArrayList( - inventory.get() - .getFluidInputs())) { - if (fluid.isFluidEqual(storedFluid)) { - if (doDrain) storedFluid.amount = Math.max(storedFluid.amount - fluid.amount, 0); - return storedFluid.amount >= fluid.amount; - } - } - } - } - - if (hatch instanceof GT_MetaTileEntity_Hatch_Input tHatch && tHatch.isValid()) { - if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) { - meHatch.startRecipeProcessing(); - FluidStack tFluid = meHatch.drain(ForgeDirection.UNKNOWN, fluid, doDrain); - meHatch.endRecipeProcessing(this); - return tFluid != null && tFluid.amount >= fluid.amount; - } else { - FluidStack tFluid = tHatch.drain(ForgeDirection.UNKNOWN, fluid, doDrain); - return tFluid != null && tFluid.amount >= fluid.amount; - } - } - - return false; - } - - public ArrayList getStoredInputs() { - ArrayList rList = new ArrayList<>(); - Map inputsFromME = new HashMap<>(); - for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) { - if (tHatch instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) { - continue; - } - tHatch.mRecipeMap = getRecipeMap(); - IGregTechTileEntity tileEntity = tHatch.getBaseMetaTileEntity(); - boolean isMEBus = tHatch instanceof GT_MetaTileEntity_Hatch_InputBus_ME; - for (int i = tileEntity.getSizeInventory() - 1; i >= 0; i--) { - ItemStack itemStack = tileEntity.getStackInSlot(i); - if (itemStack != null) { - if (isMEBus) { - // Prevent the same item from different ME buses from being recognized - inputsFromME.put(GT_Utility.ItemId.createNoCopy(itemStack), itemStack); - } else { - rList.add(itemStack); - } - } - } - } - - if (getStackInSlot(1) != null && getStackInSlot(1).getUnlocalizedName() - .startsWith("gt.integrated_circuit")) rList.add(getStackInSlot(1)); - if (!inputsFromME.isEmpty()) { - rList.addAll(inputsFromME.values()); - } - return rList; - } - - /** - * Anything that is usually separated off in {@link #getStoredInputs()} (like crafting input bus/buffer) is also - * included here. - */ - public ArrayList getAllStoredInputs() { - ArrayList rList = new ArrayList<>(); - - if (supportsCraftingMEBuffer()) { - for (IDualInputHatch dualInputHatch : mDualInputHatches) { - Iterator inventoryIterator = dualInputHatch.inventories(); - while (inventoryIterator.hasNext()) { - ItemStack[] items = inventoryIterator.next() - .getItemInputs(); - if (items == null) { - continue; - } - for (int i = 0; i < items.length; i++) { - ItemStack item = items[i]; - if (item != null) { - rList.add(item); - } - } - } - } - } - - Map inputsFromME = new HashMap<>(); - for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) { - if (tHatch instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) { - continue; - } - tHatch.mRecipeMap = getRecipeMap(); - IGregTechTileEntity tileEntity = tHatch.getBaseMetaTileEntity(); - boolean isMEBus = tHatch instanceof GT_MetaTileEntity_Hatch_InputBus_ME; - for (int i = tileEntity.getSizeInventory() - 1; i >= 0; i--) { - ItemStack itemStack = tileEntity.getStackInSlot(i); - if (itemStack != null) { - if (isMEBus) { - // Prevent the same item from different ME buses from being recognized - inputsFromME.put(GT_Utility.ItemId.createNoCopy(itemStack), itemStack); - } else { - rList.add(itemStack); - } - } - } - } - - if (getStackInSlot(1) != null && getStackInSlot(1).getUnlocalizedName() - .startsWith("gt.integrated_circuit")) rList.add(getStackInSlot(1)); - if (!inputsFromME.isEmpty()) { - rList.addAll(inputsFromME.values()); - } - return rList; - } - - public Map getStoredInputsFromME() { - Map inputsFromME = new Object2ReferenceOpenHashMap<>(); - for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) { - if (tHatch instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) { - for (int i = meBus.getSizeInventory() - 1; i >= 0; i--) { - ItemStack itemStack = meBus.getStackInSlot(i); - if (itemStack != null) { - // Prevent the same item from different ME buses from being recognized - inputsFromME.put(GT_Utility.ItemId.createNoCopy(itemStack), itemStack); - } - } - } - } - return inputsFromME; - } - - public Map getStoredFluidsFromME() { - Map fluidsFromME = new Reference2ReferenceOpenHashMap<>(); - for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) { - if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) { - for (FluidStack fluid : meHatch.getStoredFluids()) { - if (fluid != null) { - // Prevent the same fluid from different ME hatches from being recognized - fluidsFromME.put(fluid.getFluid(), fluid); - } - } - } - } - return fluidsFromME; - } - - @Override - public RecipeMap getRecipeMap() { - return null; - } - - /** - * Creates logic to run recipe check based on recipemap. This runs only once, on class instantiation. - *

- * If this machine doesn't use recipemap or does some complex things, override {@link #checkProcessing()}. - */ - @ApiStatus.OverrideOnly - protected ProcessingLogic createProcessingLogic() { - return null; - } - - public void updateSlots() { - for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) tHatch.updateSlots(); - for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) tHatch.updateSlots(); - } - - protected void startRecipeProcessing() { - for (GT_MetaTileEntity_Hatch_InputBus hatch : filterValidMTEs(mInputBusses)) { - if (hatch instanceof IRecipeProcessingAwareHatch aware) { - aware.startRecipeProcessing(); - } - } - for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mInputHatches)) { - if (hatch instanceof IRecipeProcessingAwareHatch aware) { - aware.startRecipeProcessing(); - } - } - } - - public void setResultIfFailure(CheckRecipeResult result) { - if (!result.wasSuccessful()) { - this.checkRecipeResult = result; - } - } - - protected void endRecipeProcessing() { - for (GT_MetaTileEntity_Hatch_InputBus hatch : filterValidMTEs(mInputBusses)) { - if (hatch instanceof IRecipeProcessingAwareHatch aware) { - setResultIfFailure(aware.endRecipeProcessing(this)); - } - } - for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mInputHatches)) { - if (hatch instanceof IRecipeProcessingAwareHatch aware) { - setResultIfFailure(aware.endRecipeProcessing(this)); - } - } - } - - public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - } - if (aMetaTileEntity instanceof IDualInputHatch hatch) { - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mDualInputHatches.add(hatch); - } - if (aMetaTileEntity instanceof ISmartInputHatch hatch) { - // Only add them to be iterated if enabled for performance reasons - if (hatch.doFastRecipeCheck()) { - mSmartInputHatches.add(hatch); - } - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { - setHatchRecipeMap((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity); - return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity); - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) { - ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = getRecipeMap(); - return mInputBusses.add((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity); - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) - return mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity); - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) - return mOutputBusses.add((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity); - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) - return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity); - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) - return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity); - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) - return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity); - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) - return mMufflerHatches.add((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity); - return false; - } - - public boolean addMaintenanceToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mMaintenanceHatches.add(hatch); - } - return false; - } - - public boolean addEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) { - return false; - } - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mEnergyHatches.add(hatch); - } - return false; - } - - public boolean addExoticEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch hatch - && GT_ExoticEnergyInputHelper.isExoticEnergyInput(aMetaTileEntity)) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mExoticEnergyHatches.add(hatch); - } - return false; - } - - public boolean addDynamoToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mDynamoHatches.add(hatch); - } - return false; - } - - public boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mMufflerHatches.add(hatch); - } - return false; - } - - public boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - return addInputBusToMachineList(aTileEntity, aBaseCasingIndex) - || addInputHatchToMachineList(aTileEntity, aBaseCasingIndex); - } - - public boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - return addOutputBusToMachineList(aTileEntity, aBaseCasingIndex) - || addOutputHatchToMachineList(aTileEntity, aBaseCasingIndex); - } - - public boolean addInputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof IDualInputHatch hatch) { - if (!supportsCraftingMEBuffer()) return false; - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mDualInputHatches.add(hatch); - } - if (aMetaTileEntity instanceof ISmartInputHatch hatch) { - mSmartInputHatches.add(hatch); - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - hatch.mRecipeMap = getRecipeMap(); - return mInputBusses.add(hatch); - } - return false; - } - - public boolean addOutputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mOutputBusses.add(hatch); - } - return false; - } - - public boolean addInputHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof ISmartInputHatch hatch) { - mSmartInputHatches.add(hatch); - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - setHatchRecipeMap(hatch); - return mInputHatches.add(hatch); - } - return false; - } - - public boolean addOutputHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output hatch) { - hatch.updateTexture(aBaseCasingIndex); - hatch.updateCraftingIcon(this.getMachineCraftingIcon()); - return mOutputHatches.add(hatch); - } - return false; - } - - protected void setHatchRecipeMap(GT_MetaTileEntity_Hatch_Input hatch) { - if (filtersFluid()) { - hatch.mRecipeMap = getRecipeMap(); - } - } - - /** - * @return If this multi filters fluid input for hatches based on recipemap. - */ - protected boolean filtersFluid() { - return true; - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - - return new String[] { - /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + formatNumbers(getActualEnergyUsage()) - + EnumChatFormatting.RESET - + " EU/t", - /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " - + EnumChatFormatting.YELLOW - + formatNumbers(getMaxInputVoltage()) - + EnumChatFormatting.RESET - + " EU/t(*2A) " - + StatCollector.translateToLocal("GT5U.machines.tier") - + ": " - + EnumChatFormatting.YELLOW - + VN[GT_Utility.getTier(getMaxInputVoltage())] - + EnumChatFormatting.RESET, - /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " - + EnumChatFormatting.RED - + (getIdealStatus() - getRepairStatus()) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.multiblock.efficiency") - + ": " - + EnumChatFormatting.YELLOW - + mEfficiency / 100.0F - + EnumChatFormatting.RESET - + " %", - /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" }; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return supportsSlotAutomation(aIndex); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return supportsSlotAutomation(aIndex); - } - - protected ItemStack[] getCompactedInputs() { - // TODO: repalce method with a cleaner one - ArrayList tInputList = getStoredInputs(); - int tInputList_sS = tInputList.size(); - for (int i = 0; i < tInputList_sS - 1; i++) { - for (int j = i + 1; j < tInputList_sS; j++) { - if (!GT_Utility.areStacksEqual(tInputList.get(i), tInputList.get(j))) continue; - if (tInputList.get(i).stackSize >= tInputList.get(j).stackSize) { - tInputList.remove(j--); - tInputList_sS = tInputList.size(); - } else { - tInputList.remove(i--); - tInputList_sS = tInputList.size(); - break; - } - } - } - return tInputList.toArray(new ItemStack[0]); - } - - protected FluidStack[] getCompactedFluids() { - // TODO: repalce method with a cleaner one - ArrayList tFluidList = getStoredFluids(); - int tFluidList_sS = tFluidList.size(); - for (int i = 0; i < tFluidList_sS - 1; i++) { - for (int j = i + 1; j < tFluidList_sS; j++) { - if (!GT_Utility.areFluidsEqual(tFluidList.get(i), tFluidList.get(j))) continue; - - if (tFluidList.get(i).amount >= tFluidList.get(j).amount) { - tFluidList.remove(j--); - tFluidList_sS = tFluidList.size(); - } else { - tFluidList.remove(i--); - tFluidList_sS = tFluidList.size(); - break; - } - } - } - return tFluidList.toArray(new FluidStack[0]); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - final NBTTagCompound tag = accessor.getNBTData(); - - if (tag.getBoolean("incompleteStructure")) { - currentTip.add(RED + "** INCOMPLETE STRUCTURE **" + RESET); - } - String efficiency = RESET + " Efficiency: " + tag.getFloat("efficiency") + "%"; - if (tag.getBoolean("hasProblems")) { - currentTip.add(RED + "** HAS PROBLEMS **" + efficiency); - } else if (!tag.getBoolean("incompleteStructure")) { - currentTip.add(GREEN + "Running Fine" + efficiency); - } - - boolean isActive = tag.getBoolean("isActive"); - if (isActive) { - long energyTier = tag.getLong("energyTier"); - long actualEnergyUsage = tag.getLong("energyUsage"); - if (energyTier > 0) { - if (actualEnergyUsage > 0) { - currentTip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.use_with_amperage", - formatNumbers(actualEnergyUsage), - GT_Utility.getAmperageForTier(actualEnergyUsage, (byte) energyTier), - GT_Utility.getColoredTierNameFromTier((byte) energyTier))); - } else if (actualEnergyUsage < 0) { - currentTip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.produce_with_amperage", - formatNumbers(-actualEnergyUsage), - GT_Utility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier), - GT_Utility.getColoredTierNameFromTier((byte) energyTier))); - } - } else { - if (actualEnergyUsage > 0) { - currentTip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.use", - formatNumbers(actualEnergyUsage), - GT_Utility.getColoredTierNameFromVoltage(actualEnergyUsage))); - } else if (actualEnergyUsage < 0) { - currentTip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.energy.produce", - formatNumbers(-actualEnergyUsage), - GT_Utility.getColoredTierNameFromVoltage(-actualEnergyUsage))); - } - } - } - currentTip.add( - GT_Waila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress"))); - // Show ns on the tooltip - if (GT_Mod.gregtechproxy.wailaAverageNS && tag.hasKey("averageNS")) { - int tAverageTime = tag.getInteger("averageNS"); - currentTip.add("Average CPU load of ~" + formatNumbers(tAverageTime) + " ns"); - } - super.getWailaBody(itemStack, currentTip, accessor, config); - } - - public final void getMTEWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - - tag.setBoolean("hasProblems", (getIdealStatus() - getRepairStatus()) > 0); - tag.setFloat("efficiency", mEfficiency / 100.0F); - tag.setInteger("progress", mProgresstime); - tag.setInteger("maxProgress", mMaxProgresstime); - tag.setBoolean("incompleteStructure", (getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0); - - final IGregTechTileEntity tileEntity = getBaseMetaTileEntity(); - if (tileEntity != null) { - tag.setBoolean("isActive", tileEntity.isActive()); - if (tileEntity.isActive()) { - if (mEUt < 0) tag.setLong("energyUsage", getActualEnergyUsage()); - else tag.setLong("energyUsage", (long) -mEUt * mEfficiency / 10000); - tag.setLong("energyTier", getInputVoltageTier()); - } - } - - final GT_ClientPreference preference = GT_Mod.gregtechproxy.getClientPreference(player.getUniqueID()); - if (preference != null && preference.isWailaAverageNSEnabled()) { - getBaseMetaTileEntity().startTimeStatistics(); - int tAverageTime = 0; - int amountOfZero = 0; - for (int tTime : this.getBaseMetaTileEntity() - .getTimeStatistics()) { - tAverageTime += tTime; - if (tTime == 0) { - amountOfZero += 1; - } - } - - // tick time zero means it has not been updated yet - int samples = getBaseMetaTileEntity().getTimeStatistics().length - amountOfZero; - if (samples > 0) { - tag.setInteger("averageNS", tAverageTime / samples); - } - } - } - - protected void setMufflers(boolean state) { - for (GT_MetaTileEntity_Hatch_Muffler aMuffler : mMufflerHatches) { - final IGregTechTileEntity iGTTileEntity = aMuffler.getBaseMetaTileEntity(); - if (iGTTileEntity != null && !iGTTileEntity.isDead()) { - iGTTileEntity.setActive(state); - } - } - } - - @Override - public void onRemoval() { - super.onRemoval(); - // Deactivate mufflers - setMufflers(false); - } - - public List getExoticEnergyHatches() { - return mExoticEnergyHatches; - } - - /** - * @return Returns true if there is 1 TT Energy Hatch OR up to 2 Energy Hatches - */ - public boolean checkExoticAndNormalEnergyHatches() { - if (mExoticEnergyHatches.isEmpty() && mEnergyHatches.isEmpty()) { - return false; - } - - if (!mExoticEnergyHatches.isEmpty()) { - if (!mEnergyHatches.isEmpty()) { - return false; - } - - if (mExoticEnergyHatches.size() != 1) { - return false; - } - } - - return mEnergyHatches.size() <= 2; - } - - /** - * Checks if all the item / fluid outputs of the recipe can be outputted to the buses / hatches. - * If void protection is enabled, it also checks for {@link #protectsExcessItem()} and - * {@link #protectsExcessFluid()}, so you don't need to call them along with this method. - *

- * If you're using {@link GT_ParallelHelper}, it will handle void protection and return 0 parallel - * if all the output cannot be dumped into buses / hatches. In that case you won't use this method. - */ - protected boolean canOutputAll(@Nonnull GT_Recipe recipe) { - return canOutputAll(recipe.mOutputs, recipe.mFluidOutputs); - } - - /** - * Checks if all the items can be outputted to the output buses. - * If void protection is enabled, it also checks for {@link #protectsExcessItem()}, - * so you don't need to call it along with this method. - */ - @SuppressWarnings("BooleanMethodIsAlwaysInverted") - protected boolean canOutputAll(ItemStack[] items) { - return canOutputAll(items, null); - } - - /** - * Checks if all the fluids can be outputted to the output hatches. - * If void protection is enabled, it also checks for {@link #protectsExcessFluid()}, - * so you don't need to call it along with this method. - */ - protected boolean canOutputAll(FluidStack[] fluids) { - return canOutputAll(null, fluids); - } - - /** - * Checks if all the items / fluids can be outputted to output buses / hatches. - * If void protection is enabled, it also checks for {@link #protectsExcessItem()} and - * {@link #protectsExcessFluid()}, so you don't need to call them along with this method. - */ - protected boolean canOutputAll(@Nullable ItemStack[] items, @Nullable FluidStack[] fluids) { - if (!protectsExcessItem() && !protectsExcessFluid()) { - return true; - } - - VoidProtectionHelper voidProtectionHelper = new VoidProtectionHelper().setMachine(this) - .setItemOutputs(items) - .setFluidOutputs(fluids) - .build(); - return voidProtectionHelper.getMaxParallel() > 0; - } - - @Override - public boolean isAllowedToWork() { - return getBaseMetaTileEntity() != null && getBaseMetaTileEntity().isAllowedToWork(); - } - - @Override - public void disableWorking() { - if (getBaseMetaTileEntity() != null) { - getBaseMetaTileEntity().disableWorking(); - } - } - - @Override - public void enableWorking() { - if (getBaseMetaTileEntity() != null) { - getBaseMetaTileEntity().enableWorking(); - } - } - - public ItemStack getControllerSlot() { - return mInventory[getControllerSlotIndex()]; - } - - public final int getControllerSlotIndex() { - return 1; - } - - // True if the slot with index aSlot may be interacted with through automation - protected boolean supportsSlotAutomation(int aSlot) { - return false; - } - - @Override - public Pos2d getPowerSwitchButtonPos() { - return new Pos2d(174, 148); - } - - @Override - public Pos2d getStructureUpdateButtonPos() { - return new Pos2d(174, 130); - } - - @Override - public int getStructureUpdateTime() { - return mUpdate; - } - - @Override - public void setStructureUpdateTime(int time) { - mUpdate = time; - } - - @Override - public boolean supportsVoidProtection() { - return false; - } - - @Override - public VoidingMode getVoidingMode() { - return voidingMode; - } - - @Override - public void setVoidingMode(VoidingMode mode) { - this.voidingMode = mode; - } - - @Override - public List getItemOutputSlots(ItemStack[] toOutput) { - List ret = new ArrayList<>(); - for (final GT_MetaTileEntity_Hatch tBus : filterValidMTEs(mOutputBusses)) { - if (!(tBus instanceof GT_MetaTileEntity_Hatch_OutputBus_ME)) { - final IInventory tBusInv = tBus.getBaseMetaTileEntity(); - for (int i = 0; i < tBusInv.getSizeInventory(); i++) { - final ItemStack stackInSlot = tBus.getStackInSlot(i); - - if (stackInSlot == null && tBus instanceof IItemLockable lockable && lockable.isLocked()) { - // getItemOutputSlots is only used to calculate free room for the purposes of parallels and - // void protection. We can use a fake item stack here without creating weirdness in the output - // bus' actual inventory. - assert lockable.getLockedItem() != null; - ItemStack fakeItemStack = lockable.getLockedItem() - .copy(); - fakeItemStack.stackSize = 0; - ret.add(fakeItemStack); - } else { - ret.add(stackInSlot); - } - } - } - } - return ret; - } - - @Override - public List getFluidOutputSlots(FluidStack[] toOutput) { - return filterValidMTEs(mOutputHatches); - } - - /** - * Util method for DT-like structure to collect list of output hatches. - */ - protected List getFluidOutputSlotsByLayer( - FluidStack[] toOutput, List> hatchesByLayer) { - List ret = new ArrayList<>(); - for (int i = 0; i < toOutput.length; i++) { - if (i >= hatchesByLayer.size()) { - break; - } - FluidStack fluidOutputForLayer = toOutput[i]; - for (GT_MetaTileEntity_Hatch_Output hatch : hatchesByLayer.get(i)) { - if (!hatch.isValid()) continue; - if (fluidOutputForLayer != null) { - ret.add(new OutputHatchWrapper(hatch, f -> GT_Utility.areFluidsEqual(f, fluidOutputForLayer))); - } else { - ret.add(hatch); - } - } - } - return ret; - } - - @Override - public boolean canDumpItemToME() { - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mOutputBusses)) { - if (tHatch instanceof GT_MetaTileEntity_Hatch_OutputBus_ME) { - if ((((GT_MetaTileEntity_Hatch_OutputBus_ME) tHatch).canAcceptItem())) { - return true; - } - } - } - return false; - } - - @Override - public boolean canDumpFluidToME() { - for (IFluidStore tHatch : getFluidOutputSlots(new FluidStack[0])) { - if (tHatch instanceof GT_MetaTileEntity_Hatch_Output_ME) { - if ((((GT_MetaTileEntity_Hatch_Output_ME) tHatch).canAcceptFluid())) { - return true; - } - } - } - return false; - } - - @Override - public Pos2d getVoidingModeButtonPos() { - return new Pos2d(8, 91); - } - - @Override - public boolean supportsInputSeparation() { - return false; - } - - @Override - public boolean isInputSeparationEnabled() { - return inputSeparation; - } - - @Override - public void setInputSeparation(boolean enabled) { - this.inputSeparation = enabled; - } - - @Override - public Pos2d getInputSeparationButtonPos() { - return new Pos2d(26, 91); - } - - /** - * Creates the icon list for this machine. Override this and add the overlays to machineModeIcons in order. - */ - public void setMachineModeIcons() { - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_DEFAULT); - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_DEFAULT); - } - - /** - * Override this if you are a multi-machine and want a GUI button. You will also want to override - * setMachineModeIcons(). - * Override nextMachineMode() if you have more than 2 modes. - */ - @Override - public boolean supportsMachineModeSwitch() { - return false; - } - - @Override - public int getMachineMode() { - return machineMode; - } - - @Override - public UITexture getMachineModeIcon(int index) { - return machineModeIcons.get(index); - } - - @Override - public void setMachineMode(int index) { - machineMode = index; - } - - @Override - public int nextMachineMode() { - if (machineMode == 0) return 1; - else return 0; - } - - @Override - public Pos2d getMachineModeSwitchButtonPos() { - return new Pos2d(80, 91); - } - - @Override - public boolean supportsBatchMode() { - return false; - } - - @Override - public boolean isBatchModeEnabled() { - return batchMode; - } - - @Override - public void setBatchMode(boolean enabled) { - this.batchMode = enabled; - } - - @Override - public Pos2d getBatchModeButtonPos() { - return new Pos2d(44, 91); - } - - @Override - public boolean supportsSingleRecipeLocking() { - return false; - } - - @Override - public boolean isRecipeLockingEnabled() { - return mLockedToSingleRecipe; - } - - @Override - public void setRecipeLocking(boolean enabled) { - mLockedToSingleRecipe = enabled; - if (!enabled) { - setSingleRecipeCheck(null); - } - } - - @Override - public void setSingleRecipeCheck(SingleRecipeCheck recipeCheck) { - mSingleRecipeCheck = recipeCheck; - } - - @Override - public SingleRecipeCheck getSingleRecipeCheck() { - return mSingleRecipeCheck; - } - - @Override - public Pos2d getRecipeLockingButtonPos() { - return new Pos2d(62, 91); - } - - @Override - public int getGUIWidth() { - return 198; - } - - @Override - public int getGUIHeight() { - return 192; - } - - @Override - public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.bindPlayerInventory(buildContext.getPlayer(), new Pos2d(7, 109), getGUITextureSet().getItemSlot()); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setPos(4, 4) - .setSize(190, 85)); - final SlotWidget inventorySlot = new SlotWidget(inventoryHandler, 1); - builder.widget( - inventorySlot.setPos(173, 167) - .setBackground(GT_UITextures.SLOT_DARK_GRAY)); - - final DynamicPositionedColumn screenElements = new DynamicPositionedColumn(); - drawTexts(screenElements, inventorySlot); - builder.widget(screenElements); - - setMachineModeIcons(); - builder.widget(createPowerSwitchButton(builder)) - .widget(createVoidExcessButton(builder)) - .widget(createInputSeparationButton(builder)) - .widget(createModeSwitchButton(builder)) - .widget(createBatchModeButton(builder)) - .widget(createLockToSingleRecipeButton(builder)) - .widget(createStructureUpdateButton(builder)); - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) {} - - protected boolean shouldDisplayCheckRecipeResult() { - return true; - } - - public boolean shouldDisplayShutDownReason() { - return true; - } - - protected final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - protected String generateCurrentRecipeInfoString() { - StringBuffer ret = new StringBuffer(EnumChatFormatting.WHITE + "Progress: "); - - numberFormat.setMinimumFractionDigits(2); - numberFormat.setMaximumFractionDigits(2); - numberFormat.format((double) mProgresstime / 20, ret); - ret.append("s / "); - numberFormat.format((double) mMaxProgresstime / 20, ret); - ret.append("s ("); - numberFormat.setMinimumFractionDigits(1); - numberFormat.setMaximumFractionDigits(1); - numberFormat.format((double) mProgresstime / mMaxProgresstime * 100, ret); - ret.append("%)\n"); - numberFormat.setMinimumFractionDigits(0); - numberFormat.setMaximumFractionDigits(2); - - IntConsumer appendRate = (amount) -> { - double processPerTick = (double) amount / mMaxProgresstime * 20; - if (processPerTick > 1) { - ret.append(" ("); - numberFormat.format(Math.round(processPerTick * 10) / 10.0, ret); - ret.append("/s)"); - } else { - ret.append(" ("); - numberFormat.format(Math.round(1 / processPerTick * 10) / 10.0, ret); - ret.append("s/ea)"); - } - }; - - int lines = 0; - int MAX_LINES = 5; - - if (mOutputItems != null) { - for (var item : mOutputItems) { - if (item == null) continue; - if (lines >= MAX_LINES) { - ret.append("..."); - return ret.toString(); - } - lines++; - ret.append(EnumChatFormatting.AQUA) - .append(item.getDisplayName()) - .append(EnumChatFormatting.WHITE) - .append(" x ") - .append(EnumChatFormatting.GOLD); - numberFormat.format(item.stackSize, ret); - ret.append(EnumChatFormatting.WHITE); - appendRate.accept(item.stackSize); - ret.append('\n'); - } - } - if (mOutputFluids != null) { - for (var fluid : mOutputFluids) { - if (fluid == null) continue; - if (lines >= MAX_LINES) { - ret.append("..."); - return ret.toString(); - } - lines++; - ret.append(EnumChatFormatting.AQUA) - .append(fluid.getLocalizedName()) - .append(EnumChatFormatting.WHITE) - .append(" x ") - .append(EnumChatFormatting.GOLD); - numberFormat.format(fluid.amount, ret); - ret.append("L") - .append(EnumChatFormatting.WHITE); - appendRate.accept(fluid.amount); - ret.append('\n'); - } - } - return ret.toString(); - } - - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - screenElements.setSynced(false) - .setSpace(0) - .setPos(10, 7); - if (supportsMachineModeSwitch()) { - screenElements.widget( - TextWidget.dynamicString( - () -> EnumChatFormatting.WHITE + GT_Utility.trans("400", "Running mode: ") - + EnumChatFormatting.GOLD - + getMachineModeName())); - } - screenElements - .widget( - new TextWidget(GT_Utility.trans("132", "Pipe is loose.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mWrench)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val)); - screenElements - .widget( - new TextWidget(GT_Utility.trans("133", "Screws are loose.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mScrewdriver)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val)); - screenElements - .widget( - new TextWidget(GT_Utility.trans("134", "Something is stuck.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mSoftHammer)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val)); - screenElements - .widget( - new TextWidget(GT_Utility.trans("135", "Platings are dented.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mHardHammer)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val)); - screenElements - .widget( - new TextWidget(GT_Utility.trans("136", "Circuitry burned out.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mSolderingTool)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val)); - screenElements - .widget( - new TextWidget(GT_Utility.trans("137", "That doesn't belong there.")) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mCrowbar)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val)); - screenElements - .widget( - new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mMachine)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)); - screenElements.widget( - new TextWidget("Too Uncertain.").setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 128) != 0)); - screenElements.widget( - new TextWidget("Invalid Parameters.").setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 256) != 0)); - - screenElements.widget( - new TextWidget(GT_Utility.trans("139", "Hit with Soft Mallet")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())) - .widget( - new FakeSyncWidget.IntegerSyncer( - () -> getBaseMetaTileEntity().getErrorDisplayID(), - val -> getBaseMetaTileEntity().setErrorDisplayID(val))) - .widget( - new FakeSyncWidget.BooleanSyncer( - () -> getBaseMetaTileEntity().isActive(), - val -> getBaseMetaTileEntity().setActive(val))); - screenElements.widget( - new TextWidget(GT_Utility.trans("140", "to (re-)start the Machine")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())); - screenElements.widget( - new TextWidget(GT_Utility.trans("141", "if it doesn't start.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())); - screenElements.widget( - new TextWidget(GT_Utility.trans("142", "Running perfectly.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && getBaseMetaTileEntity().isActive())); - - screenElements.widget(TextWidget.dynamicString(() -> { - Duration time = Duration.ofSeconds((mTotalRunTime - mLastWorkingTick) / 20); - return StatCollector.translateToLocalFormatted( - "GT5U.gui.text.shutdown_duration", - time.toHours(), - time.toMinutes() % 60, - time.getSeconds() % 60); - }) - .setEnabled( - widget -> shouldDisplayShutDownReason() && !getBaseMetaTileEntity().isActive() - && getBaseMetaTileEntity().wasShutdown())) - .widget(new FakeSyncWidget.LongSyncer(() -> mTotalRunTime, time -> mTotalRunTime = time)) - .widget(new FakeSyncWidget.LongSyncer(() -> mLastWorkingTick, time -> mLastWorkingTick = time)); - screenElements.widget( - TextWidget.dynamicString( - () -> getBaseMetaTileEntity().getLastShutDownReason() - .getDisplayString()) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> shouldDisplayShutDownReason() && !getBaseMetaTileEntity().isActive() - && GT_Utility.isStringValid( - getBaseMetaTileEntity().getLastShutDownReason() - .getDisplayString()) - && getBaseMetaTileEntity().wasShutdown())) - .widget( - new ShutDownReasonSyncer( - () -> getBaseMetaTileEntity().getLastShutDownReason(), - reason -> getBaseMetaTileEntity().setShutDownReason(reason))) - .widget( - new FakeSyncWidget.BooleanSyncer( - () -> getBaseMetaTileEntity().wasShutdown(), - wasShutDown -> getBaseMetaTileEntity().setShutdownStatus(wasShutDown))); - - screenElements.widget( - TextWidget.dynamicString(() -> checkRecipeResult.getDisplayString()) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> shouldDisplayCheckRecipeResult() - && GT_Utility.isStringValid(checkRecipeResult.getDisplayString()) - && (isAllowedToWork() || getBaseMetaTileEntity().isActive() - || checkRecipeResult.persistsOnShutdown()))) - .widget(new CheckRecipeResultSyncer(() -> checkRecipeResult, (result) -> checkRecipeResult = result)); - - if (showRecipeTextInGUI()) { - // Display current recipe - screenElements.widget( - TextWidget.dynamicString(this::generateCurrentRecipeInfoString) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> (mOutputFluids != null && mOutputFluids.length > 0) - || (mOutputItems != null && mOutputItems.length > 0))) - .widget( - new FakeSyncWidget.ListSyncer<>( - () -> mOutputFluids != null ? Arrays.asList(mOutputFluids) : Collections.emptyList(), - val -> mOutputFluids = val.toArray(new FluidStack[0]), - NetworkUtils::writeFluidStack, - NetworkUtils::readFluidStack)) - .widget( - new FakeSyncWidget.ListSyncer<>( - () -> mOutputItems != null ? Arrays.asList(mOutputItems) : Collections.emptyList(), - val -> mOutputItems = val.toArray(new ItemStack[0]), - NetworkUtils::writeItemStack, - NetworkUtils::readItemStack)) - .widget(new FakeSyncWidget.IntegerSyncer(() -> mProgresstime, val -> mProgresstime = val)) - .widget(new FakeSyncWidget.IntegerSyncer(() -> mMaxProgresstime, val -> mMaxProgresstime = val)); - } - - screenElements.widget( - new TextWidget(GT_Utility.trans("144", "Missing Turbine Rotor")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> { - if (getBaseMetaTileEntity().isAllowedToWork()) return false; - if (getBaseMetaTileEntity().getErrorDisplayID() == 0 - && this instanceof GT_MetaTileEntity_LargeTurbine) { - final ItemStack tItem = inventorySlot.getMcSlot() - .getStack(); - return tItem == null - || !(tItem.getItem() == GT_MetaGenerated_Tool_01.INSTANCE && tItem.getItemDamage() >= 170 - && tItem.getItemDamage() <= 177); - } - return false; - })); - } - - protected boolean showRecipeTextInGUI() { - return true; - } - - @TestOnly - protected void setEnergyHatches(ArrayList EnergyHatches) { - this.mEnergyHatches = EnergyHatches; - } - - @TestOnly - protected void setExoticEnergyHatches(List ExoticEnergyHatches) { - this.mExoticEnergyHatches = ExoticEnergyHatches; - } - - public void fixAllIssues() { - mWrench = true; - mScrewdriver = true; - mSoftHammer = true; - mHardHammer = true; - mSolderingTool = true; - mCrowbar = true; - } - - public boolean getDefaultHasMaintenanceChecks() { - return true; - } - - public boolean shouldCheckMaintenance() { - return !disableMaintenance && hasMaintenanceChecks; - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java deleted file mode 100644 index 1a71f17ec8..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java +++ /dev/null @@ -1,134 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import java.util.List; -import java.util.function.Function; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.drawable.Text; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_FilterBase { - - private static final String ALLOW_NBT_TOOLTIP = "GT5U.machines.allow_nbt.tooltip"; - private boolean allowNbt = false; - - public GT_MetaTileEntity_SpecialFilter(int aID, String aName, String aNameRegional, int aTier, - String[] aDescription) { - // 9 buffer slot, 1 representation slot, 1 holo slot. last seems not needed... - super(aID, aName, aNameRegional, aTier, 11, aDescription); - } - - public GT_MetaTileEntity_SpecialFilter(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_SpecialFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("bNBTAllowed", this.allowNbt); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.allowNbt = aNBT.getBoolean("bNBTAllowed"); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return (super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) - && ((this.allowNbt) || (!aStack.hasTagCompound())) - && (this.isStackAllowed(aStack) != this.invertFilter); - } - - protected abstract boolean isStackAllowed(ItemStack aStack); - - protected List getEmptySlotTooltip() { - return null; - } - - protected Function, List> getItemStackReplacementTooltip() { - return list -> list; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - addAllowNbtButton(builder); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_WHITE.apply(27, false)) - .setPos(6, 19) - .setSize(27, 24)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_BLUE.apply(42, true)) - .setPos(53, 19) - .setSize(42, 24)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_RED.apply(19, true)) - .setPos(152, 19) - .setSize(19, 24)) - .widget( - createFilterIconSlot(BaseSlot.phantom(inventoryHandler, 9)).disableShiftInsert() - .setPos(34, 22) - .setBackground(GT_UITextures.BUTTON_STANDARD)) - .widget( - SlotGroup.ofItemHandler(inventoryHandler, 3) - .endAtSlot(8) - .build() - .setPos(97, 4)); - } - - private void addAllowNbtButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> allowNbt, - val -> allowNbt = val, - GT_UITextures.OVERLAY_BUTTON_NBT, - () -> mTooltipCache.getData(ALLOW_NBT_TOOLTIP))); - } - - protected abstract SlotWidget createFilterIconSlot(BaseSlot slot); - - protected abstract class FilterIconSlotWidget extends SlotWidget { - - public FilterIconSlotWidget(BaseSlot slot) { - super(slot); - } - - @Override - protected abstract void phantomClick(ClickData clickData, ItemStack cursorStack); - - @Override - public void buildTooltip(List tooltip) { - super.buildTooltip(tooltip); - List emptySlotTooltip = getEmptySlotTooltip(); - if (emptySlotTooltip != null) { - tooltip.addAll(emptySlotTooltip); - } - } - - @Override - public Function, List> getOverwriteItemStackTooltip() { - return getItemStackReplacementTooltip(); - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java deleted file mode 100644 index a08e49fd6c..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java +++ /dev/null @@ -1,119 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.GT; -import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP_ALT; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; - -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.util.GT_Utility; - -public abstract class GT_MetaTileEntity_TieredMachineBlock extends MetaTileEntity { - - /** - * Value between [0 - 9] to describe the Tier of this Machine. PLZ [0-15] works - READ! GT_Values class. - */ - public final byte mTier; - - /** - * A simple Description. - */ - public final String[] mDescriptionArray; - - /** - * Contains all Textures used by this Block. - */ - public final ITexture[][][] mTextures; - - public GT_MetaTileEntity_TieredMachineBlock(int aID, String aName, String aNameRegional, int aTier, - int aInvSlotCount, String aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aInvSlotCount); - mTier = (byte) Math.max(0, Math.min(aTier, 14)); - mDescriptionArray = aDescription == null ? new String[0] : new String[] { aDescription }; - // must always be the last call! - if (GT.isClientSide()) mTextures = getTextureSet(aTextures); - else mTextures = null; - } - - public GT_MetaTileEntity_TieredMachineBlock(int aID, String aName, String aNameRegional, int aTier, - int aInvSlotCount, String[] aDescription, ITexture... aTextures) { - super(aID, aName, aNameRegional, aInvSlotCount); - mTier = (byte) Math.max(0, Math.min(aTier, 15)); - mDescriptionArray = aDescription == null ? new String[0] : aDescription; - - // must always be the last call! - if (GT.isClientSide()) mTextures = getTextureSet(aTextures); - else mTextures = null; - } - - public GT_MetaTileEntity_TieredMachineBlock(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aInvSlotCount); - mTier = (byte) aTier; - mDescriptionArray = aDescription == null ? new String[0] : new String[] { aDescription }; - mTextures = aTextures; - } - - public GT_MetaTileEntity_TieredMachineBlock(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aInvSlotCount); - mTier = (byte) aTier; - mDescriptionArray = aDescription == null ? new String[0] : aDescription; - mTextures = aTextures; - } - - @Override - public byte getTileEntityBaseType() { - return (byte) (Math.min(3, mTier <= 0 ? 0 : 1 + ((mTier - 1) / 4))); - } - - @Override - public long getInputTier() { - return mTier; - } - - @Override - public long getOutputTier() { - return mTier; - } - - @Override - public String[] getDescription() { - return mDescriptionArray; - } - - /** - * Used Client Side to get a Texture Set for this Block. Called after setting the Tier and the Description so that - * those two are accessible. - * - * @param aTextures is the optional Array you can give to the Constructor. - */ - public abstract ITexture[][][] getTextureSet(ITexture[] aTextures); - - protected SlotWidget createChargerSlot(int x, int y) { - final String batterySlotTooltipKey; - final Object[] batterySlotTooltipArgs; - final String pTier1 = GT_Utility.getColoredTierNameFromTier(mTier); - if (mTier == GT_Values.VN.length - 1) { - batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP_ALT; - batterySlotTooltipArgs = new String[] { pTier1 }; - } else { - batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP; - batterySlotTooltipArgs = new String[] { pTier1, GT_Utility.getColoredTierNameFromTier((byte) (mTier + 1)) }; - } - return createChargerSlot(x, y, batterySlotTooltipKey, batterySlotTooltipArgs); - } - - protected SlotWidget createChargerSlot(int x, int y, String tooltipKey, Object[] tooltipArgs) { - return (SlotWidget) new SlotWidget(inventoryHandler, rechargerSlotStartIndex()).disableShiftInsert() - .setGTTooltip(() -> mTooltipCache.getData(tooltipKey, tooltipArgs)) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CHARGER) - .setPos(x, y); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java deleted file mode 100644 index c12c7c1442..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import java.util.concurrent.atomic.AtomicReferenceArray; - -import org.lwjgl.input.Keyboard; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ISecondaryDescribable; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -/** - * A multiblock with tooltip {@link GT_Multiblock_Tooltip_Builder} - */ -public abstract class GT_MetaTileEntity_TooltipMultiBlockBase extends GT_MetaTileEntity_MultiBlockBase - implements ISecondaryDescribable { - - private static final AtomicReferenceArray tooltips = new AtomicReferenceArray<>( - GregTech_API.METATILEENTITIES.length); - - public GT_MetaTileEntity_TooltipMultiBlockBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_TooltipMultiBlockBase(String aName) { - super(aName); - } - - protected GT_Multiblock_Tooltip_Builder getTooltip() { - int tId = getBaseMetaTileEntity().getMetaTileID(); - GT_Multiblock_Tooltip_Builder tooltip = tooltips.get(tId); - if (tooltip == null) { - tooltip = createTooltip(); - tooltips.set(tId, tooltip); - } - return tooltip; - } - - protected abstract GT_Multiblock_Tooltip_Builder createTooltip(); - - @Override - public String[] getDescription() { - return getCurrentDescription(); - } - - @Override - public boolean isDisplaySecondaryDescription() { - return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); - } - - public String[] getPrimaryDescription() { - return getTooltip().getInformation(); - } - - public String[] getSecondaryDescription() { - return getTooltip().getStructureInformation(); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java deleted file mode 100644 index de7019b292..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java +++ /dev/null @@ -1,326 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Mods.EnderIO; -import static mcp.mobius.waila.api.SpecialChars.BLUE; -import static mcp.mobius.waila.api.SpecialChars.GOLD; -import static mcp.mobius.waila.api.SpecialChars.GREEN; -import static mcp.mobius.waila.api.SpecialChars.RED; -import static mcp.mobius.waila.api.SpecialChars.RESET; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import cofh.api.energy.IEnergyProvider; -import cofh.api.energy.IEnergyStorage; -import crazypants.enderio.machine.capbank.TileCapBank; -import crazypants.enderio.machine.capbank.network.ICapBankNetwork; -import crazypants.enderio.power.IPowerContainer; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Utility; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple - * Machine - */ -public class GT_MetaTileEntity_Transformer extends GT_MetaTileEntity_TieredMachineBlock { - - public GT_MetaTileEntity_Transformer(int aID, String aName, String aNameRegional, int aTier, String aDescription) { - super(aID, aName, aNameRegional, aTier, 0, aDescription); - } - - public GT_MetaTileEntity_Transformer(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - public GT_MetaTileEntity_Transformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[12][17][]; - for (byte i = -1; i < 16; i++) { - rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; - rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; - rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; - rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - rTextures[6][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] }; - rTextures[7][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] }; - rTextures[8][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] }; - rTextures[9][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - rTextures[10][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - rTextures[11][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - return mTextures[Math.min(2, side.ordinal()) + (side == facingDirection ? 3 : 0) - + (baseMetaTileEntity.isAllowedToWork() ? 0 : 6)][colorIndex + 1]; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Transformer(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isEnetOutput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - ForgeDirection blockFrontFacing = getBaseMetaTileEntity().getFrontFacing(); - - if (getBaseMetaTileEntity().isAllowedToWork()) { - return side == blockFrontFacing; - } else { - return side != blockFrontFacing; - } - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return !isInputFacing(side); - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long getMinimumStoredEU() { - return V[mTier + 1]; - } - - @Override - public long maxEUStore() { - return Math.max(512L, 1L << (mTier + 2)) + V[mTier + 1] * 4L; - } - - @Override - public long maxEUInput() { - return V[getBaseMetaTileEntity().isAllowedToWork() ? mTier + 1 : mTier]; - } - - @Override - public long maxEUOutput() { - return V[getBaseMetaTileEntity().isAllowedToWork() ? mTier : mTier + 1]; - } - - @Override - public long maxAmperesOut() { - return getBaseMetaTileEntity().isAllowedToWork() ? 4 : 1; - } - - @Override - public long maxAmperesIn() { - return getBaseMetaTileEntity().isAllowedToWork() ? 1 : 4; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide() && GregTech_API.mInputRF) { - aBaseMetaTileEntity.setActive(aBaseMetaTileEntity.isAllowedToWork()); - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (aBaseMetaTileEntity.getStoredEU() >= aBaseMetaTileEntity.getEUCapacity()) break; - if (!aBaseMetaTileEntity.inputEnergyFrom(side)) continue; - final TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side); - if (tTileEntity instanceof IEnergyProvider energyProvider - && energyProvider.extractEnergy(side.getOpposite(), 1, true) == 1) { - long tEU = ((IEnergyProvider) tTileEntity).extractEnergy( - side.getOpposite(), - GT_Utility.safeInt(maxEUInput() * 100L / GregTech_API.mRFtoEU), - false); - tEU = tEU * GregTech_API.mRFtoEU / 100; - aBaseMetaTileEntity.injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1); - } else if (tTileEntity instanceof IEnergyStorage energyStorage - && energyStorage.extractEnergy(1, true) == 1) { - long tEU = ((IEnergyStorage) tTileEntity) - .extractEnergy(GT_Utility.safeInt(maxEUInput() * 100L / GregTech_API.mRFtoEU), false); - tEU = tEU * GregTech_API.mRFtoEU / 100; - aBaseMetaTileEntity.injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1); - } else if (EnderIO.isModLoaded() && tTileEntity instanceof IPowerContainer powerContainer - && powerContainer.getEnergyStored() > 0) { - final int storedRF = powerContainer.getEnergyStored(); - final int extractRF = GT_Utility.safeInt(maxEUInput() * 100L / GregTech_API.mRFtoEU); - long tEU = 0; - if (tTileEntity instanceof TileCapBank capBank) { - ICapBankNetwork network = capBank.getNetwork(); - if (network != null && network.getEnergyStoredL() > 0) { - tEU = Math.min( - (Math.min( - Math.min(network.getEnergyStoredL(), storedRF - extractRF), - network.getMaxOutput())) * (long) GregTech_API.mRFtoEU / 100L, - maxEUInput()); - network.addEnergy(GT_Utility.safeInt(-(tEU * 100 / GregTech_API.mRFtoEU))); - } - } else { - if (storedRF > extractRF) { - powerContainer.setEnergyStored(storedRF - extractRF); - tEU = maxEUInput(); - } else { - powerContainer.setEnergyStored(0); - tEU = storedRF * (long) GregTech_API.mRFtoEU / 100L; - } - } - aBaseMetaTileEntity - .injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1); - } - } - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - // - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - // - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean hasAlternativeModeText() { - return true; - } - - @Override - public String getAlternativeModeText() { - return (getBaseMetaTileEntity().isAllowedToWork() ? GT_Utility.trans("145", "Step Down, In: ") - : GT_Utility.trans("146", "Step Up, In: ")) + maxEUInput() - + GT_Utility.trans("148", "V ") - + maxAmperesIn() - + GT_Utility.trans("147", "A, Out: ") - + maxEUOutput() - + GT_Utility.trans("148", "V ") - + maxAmperesOut() - + GT_Utility.trans("149", "A"); - } - - @Override - public boolean shouldJoinIc2Enet() { - return true; - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - final ForgeDirection facing = getBaseMetaTileEntity().getFrontFacing(); - final NBTTagCompound tag = accessor.getNBTData(); - final ForgeDirection side = accessor.getSide(); - final boolean allowedToWork = tag.getBoolean("isAllowedToWork"); - - final byte inputTier = GT_Utility.getTier(tag.getLong("maxEUInput")); - final byte outputTier = GT_Utility.getTier(tag.getLong("maxEUOutput")); - - currenttip.add( - String.format( - "%s %s(%dA) -> %s(%dA)", - (allowedToWork ? (GREEN + "Step Down") : (RED + "Step Up")) + RESET, - GT_Mod.gregtechproxy.mWailaTransformerVoltageTier ? GT_Utility.getColoredTierNameFromTier(inputTier) - : tag.getLong("maxEUInput"), - tag.getLong("maxAmperesIn"), - GT_Mod.gregtechproxy.mWailaTransformerVoltageTier ? GT_Utility.getColoredTierNameFromTier(outputTier) - : tag.getLong("maxEUOutput"), - tag.getLong("maxAmperesOut"))); - - if ((side == facing && allowedToWork) || (side != facing && !allowedToWork)) { - currenttip.add( - String.format( - GOLD + "Input:" + RESET + " %s(%dA)", - GT_Mod.gregtechproxy.mWailaTransformerVoltageTier ? GT_Utility.getColoredTierNameFromTier(inputTier) - : tag.getLong("maxEUInput"), - tag.getLong("maxAmperesIn"))); - } else { - currenttip.add( - String.format( - BLUE + "Output:" + RESET + " %s(%dA)", - GT_Mod.gregtechproxy.mWailaTransformerVoltageTier - ? GT_Utility.getColoredTierNameFromTier(outputTier) - : tag.getLong("maxEUOutput"), - tag.getLong("maxAmperesOut"))); - } - - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setBoolean("isAllowedToWork", getBaseMetaTileEntity().isAllowedToWork()); - tag.setLong("maxEUInput", maxEUInput()); - tag.setLong("maxAmperesIn", maxAmperesIn()); - tag.setLong("maxEUOutput", maxEUOutput()); - tag.setLong("maxAmperesOut", maxAmperesOut()); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_WetTransformer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_WetTransformer.java deleted file mode 100644 index f865a5ea8a..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_WetTransformer.java +++ /dev/null @@ -1,93 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.V; - -import net.minecraft.util.EnumChatFormatting; - -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; - -public class GT_MetaTileEntity_WetTransformer extends GT_MetaTileEntity_Transformer { - - public GT_MetaTileEntity_WetTransformer(int aID, String aName, String aNameRegional, int aTier, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aDescription); - } - - 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 ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[12][17][]; - for (byte b = -1; b < 16; b++) { - rTextures[0][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - rTextures[1][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - rTextures[2][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; - rTextures[3][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_POWER[mTier + 1] }; - rTextures[4][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_POWER[mTier + 1] }; - rTextures[5][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_POWER[mTier + 1] }; - rTextures[6][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - rTextures[7][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - rTextures[8][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; - rTextures[9][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier + 1] }; - rTextures[10][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier + 1] }; - rTextures[11][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier + 1] }; - } - return rTextures; - } - - @Override - public String[] getDescription() { - return ArrayUtils.addAll( - mDescriptionArray, - "Accepts 16A and outputs 64A", - EnumChatFormatting.BLUE + "Tec" - + EnumChatFormatting.DARK_BLUE - + "Tech" - + EnumChatFormatting.BLUE - + ": Interdimensional"); - } - - @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/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java deleted file mode 100644 index a04f5cd986..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java +++ /dev/null @@ -1,146 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.AuthorColen; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; -import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser; - -import java.util.UUID; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IWirelessEnergyHatchInformation; -import gregtech.api.metatileentity.MetaTileEntity; - -public class GT_MetaTileEntity_Wireless_Dynamo extends GT_MetaTileEntity_Hatch_Dynamo - implements IWirelessEnergyHatchInformation { - - private UUID owner_uuid; - - public GT_MetaTileEntity_Wireless_Dynamo(String aName, byte aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_Wireless_Dynamo(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, new String[] { "" }); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isEnetOutput() { - return false; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 2 * V[mTier]; - } - - @Override - public long maxEUOutput() { - return V[mTier]; - } - - @Override - public long maxEUStore() { - return totalStorage(V[mTier]); - } - - @Override - public String[] getDescription() { - return new String[] { EnumChatFormatting.GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.", - EnumChatFormatting.GRAY + "Does not connect to wires. This block accepts EU into the network.", - AuthorColen }; - } - - @Override - public long maxAmperesOut() { - return 2; - } - - @Override - public ConnectionType getConnectionType() { - return ConnectionType.WIRELESS; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Wireless_Dynamo(mName, mTier, new String[] { "" }, mTextures); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPreTick(aBaseMetaTileEntity, aTick); - - if (aBaseMetaTileEntity.isServerSide()) { - - // On first tick find the player name and attempt to add them to the map. - if (aTick == 1) { - - // UUID and username of the owner. - owner_uuid = aBaseMetaTileEntity.getOwnerUuid(); - - strongCheckOrAddUser(owner_uuid); - } - - // Every ticks_between_energy_addition ticks change the energy content of the machine. - if (aTick % ticks_between_energy_addition == 0L) { - addEUToGlobalEnergyMap(owner_uuid, getEUVar()); - setEUVar(0L); - } - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java deleted file mode 100644 index bf624eadd7..0000000000 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java +++ /dev/null @@ -1,168 +0,0 @@ -package gregtech.api.metatileentity.implementations; - -import static gregtech.api.enums.GT_Values.AuthorColen; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; -import static java.lang.Long.min; - -import java.math.BigInteger; -import java.util.UUID; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IWirelessEnergyHatchInformation; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.common.misc.spaceprojects.SpaceProjectManager; - -public class GT_MetaTileEntity_Wireless_Hatch extends GT_MetaTileEntity_Hatch_Energy - implements IWirelessEnergyHatchInformation { - - private final BigInteger eu_transferred_per_operation = BigInteger - .valueOf(2 * V[mTier] * ticks_between_energy_addition); - private final long eu_transferred_per_operation_long = eu_transferred_per_operation.longValue(); - - private UUID owner_uuid; - - public GT_MetaTileEntity_Wireless_Hatch(String aName, byte aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - public GT_MetaTileEntity_Wireless_Hatch(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, new String[] { "" }); - } - - @Override - public String[] getDescription() { - return new String[] { EnumChatFormatting.GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.", - EnumChatFormatting.GRAY + "Does not connect to wires. This block withdraws EU from the network.", - AuthorColen }; - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isEnetInput() { - return false; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 2 * V[mTier]; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxEUStore() { - return totalStorage(V[mTier]); - } - - @Override - public long maxAmperesIn() { - return 2; - } - - @Override - public ConnectionType getConnectionType() { - return ConnectionType.WIRELESS; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Wireless_Hatch(mName, mTier, new String[] { "" }, mTextures); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - - if (!aBaseMetaTileEntity.isServerSide()) return; - - // UUID of the owner. - owner_uuid = aBaseMetaTileEntity.getOwnerUuid(); - - SpaceProjectManager.checkOrCreateTeam(owner_uuid);; - - tryFetchingEnergy(); - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - - super.onPreTick(aBaseMetaTileEntity, aTick); - - if (aBaseMetaTileEntity.isServerSide()) { - // This is set up in a way to be as optimised as possible. If a user has a relatively plentiful energy - // network - // it should make no difference to them. Minimising the number of operations on BigInteger is essential. - - // Every ticks_between_energy_addition add eu_transferred_per_operation to internal EU storage from network. - if (aTick % ticks_between_energy_addition == 0L) { - tryFetchingEnergy(); - } - } - } - - private void tryFetchingEnergy() { - long currentEU = getBaseMetaTileEntity().getStoredEU(); - long maxEU = maxEUStore(); - long euToTransfer = min(maxEU - currentEU, eu_transferred_per_operation_long); - if (euToTransfer <= 0) return; // nothing to transfer - if (!addEUToGlobalEnergyMap(owner_uuid, -euToTransfer)) return; - setEUVar(currentEU + euToTransfer); - } -} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicBatteryBuffer.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicBatteryBuffer.java new file mode 100644 index 0000000000..7ca8cce273 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicBatteryBuffer.java @@ -0,0 +1,435 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; + +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import ic2.api.item.IElectricItem; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple + * Machine + */ +public class MTEBasicBatteryBuffer extends MTETieredMachineBlock implements IAddUIWidgets { + + public boolean mCharge = false, mDecharge = false; + public int mBatteryCount = 0, mChargeableCount = 0; + private long count = 0; + private long mStored = 0; + private long mMax = 0; + + public MTEBasicBatteryBuffer(int aID, String aName, String aNameRegional, int aTier, String aDescription, + int aSlotCount) { + super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription); + } + + public MTEBasicBatteryBuffer(String aName, int aTier, String aDescription, ITexture[][][] aTextures, + int aSlotCount) { + super(aName, aTier, aSlotCount, aDescription, aTextures); + } + + public MTEBasicBatteryBuffer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, + int aSlotCount) { + super(aName, aTier, aSlotCount, aDescription, aTextures); + } + + @Override + public String[] getDescription() { + String[] desc = new String[mDescriptionArray.length + 1]; + System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); + desc[mDescriptionArray.length] = mInventory.length + " Slots"; + return desc; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[2][17][]; + for (byte i = -1; i < 16; i++) { + rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; + rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + mInventory.length == 16 ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier] + : mInventory.length > 4 ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] + : Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + return mTextures[side == aFacing ? 1 : 0][colorIndex + 1]; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBasicBatteryBuffer(mName, mTier, mDescriptionArray, mTextures, mInventory.length); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side != getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier] * 16L * mInventory.length; + } + + @Override + public long maxEUStore() { + return V[mTier] * 64L * mInventory.length; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUOutput() { + return V[mTier]; + } + + @Override + public long maxAmperesIn() { + return mChargeableCount * 2L; + } + + @Override + public long maxAmperesOut() { + return mBatteryCount; + } + + @Override + public int rechargerSlotStartIndex() { + return 0; + } + + @Override + public int dechargerSlotStartIndex() { + return 0; + } + + @Override + public int rechargerSlotCount() { + return mCharge ? mInventory.length : 0; + } + + @Override + public int dechargerSlotCount() { + return mDecharge ? mInventory.length : 0; + } + + @Override + public int getProgresstime() { + return (int) getBaseMetaTileEntity().getUniversalEnergyStored(); + } + + @Override + public int maxProgresstime() { + return (int) getBaseMetaTileEntity().getUniversalEnergyCapacity(); + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + // + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + // + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; + mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; + mBatteryCount = 0; + mChargeableCount = 0; + for (ItemStack tStack : mInventory) if (GTModHandler.isElectricItem(tStack, mTier)) { + if (GTModHandler.isChargerItem(tStack)) mBatteryCount++; + mChargeableCount++; + } + } + count++; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (GTModHandler.isElectricItem(aStack) && aStack.getUnlocalizedName() + .startsWith("gt.metaitem.01.")) { + String name = aStack.getUnlocalizedName(); + if (name.equals("gt.metaitem.01.32510") || name.equals("gt.metaitem.01.32511") + || name.equals("gt.metaitem.01.32520") + || name.equals("gt.metaitem.01.32521") + || name.equals("gt.metaitem.01.32530") + || name.equals("gt.metaitem.01.32531")) { + return ic2.api.item.ElectricItem.manager.getCharge(aStack) == 0; + } + } + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (!GTUtility.isStackValid(aStack)) { + return false; + } + return mInventory[aIndex] == null && GTModHandler.isElectricItem(aStack, this.mTier); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + public long[] getStoredEnergy() { + boolean scaleOverflow = false; + boolean storedOverflow = false; + long tScale = getBaseMetaTileEntity().getEUCapacity(); + long tStored = getBaseMetaTileEntity().getStoredEU(); + long tStep = 0; + if (mInventory != null) { + for (ItemStack aStack : mInventory) { + if (GTModHandler.isElectricItem(aStack)) { + + if (aStack.getItem() instanceof MetaBaseItem) { + Long[] stats = ((MetaBaseItem) aStack.getItem()).getElectricStats(aStack); + if (stats != null) { + if (stats[0] > Long.MAX_VALUE / 2) { + scaleOverflow = true; + } + tScale = tScale + stats[0]; + tStep = ((MetaBaseItem) aStack.getItem()).getRealCharge(aStack); + if (tStep > Long.MAX_VALUE / 2) { + storedOverflow = true; + } + tStored = tStored + tStep; + } + } else if (aStack.getItem() instanceof IElectricItem) { + tStored = tStored + (long) ic2.api.item.ElectricItem.manager.getCharge(aStack); + tScale = tScale + (long) ((IElectricItem) aStack.getItem()).getMaxCharge(aStack); + } + } + } + } + if (scaleOverflow) { + tScale = Long.MAX_VALUE; + } + if (storedOverflow) { + tStored = Long.MAX_VALUE; + } + return new long[] { tStored, tScale }; + } + + @Override + public String[] getInfoData() { + updateStorageInfo(); + + return new String[] { EnumChatFormatting.BLUE + getLocalName() + EnumChatFormatting.RESET, "Stored Items:", + EnumChatFormatting.GREEN + GTUtility.formatNumbers(mStored) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMax) + + EnumChatFormatting.RESET + + " EU", + "Average input:", GTUtility.formatNumbers(getBaseMetaTileEntity().getAverageElectricInput()) + " EU/t", + "Average output:", GTUtility.formatNumbers(getBaseMetaTileEntity().getAverageElectricOutput()) + " EU/t" }; + } + + private void updateStorageInfo() { + if (mMax == 0 || (count > 20)) { + long[] tmp = getStoredEnergy(); + mStored = tmp[0]; + mMax = tmp[1]; + count = 0; + } + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + NBTTagCompound tag = accessor.getNBTData(); + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.stored", + GTUtility.formatNumbers(tag.getLong("mStored")), + GTUtility.formatNumbers(tag.getLong("mMax")))); + long avgIn = tag.getLong("AvgIn"); + long avgOut = tag.getLong("AvgOut"); + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.avg_in_with_amperage", + GTUtility.formatNumbers(avgIn), + GTUtility.getAmperageForTier(avgIn, (byte) getInputTier()), + GTUtility.getColoredTierNameFromTier((byte) getInputTier()))); + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.avg_out_with_amperage", + GTUtility.formatNumbers(avgOut), + GTUtility.getAmperageForTier(avgOut, (byte) getOutputTier()), + GTUtility.getColoredTierNameFromTier((byte) getOutputTier()))); + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + updateStorageInfo(); + super.getWailaNBTData(player, tile, tag, world, x, y, z); + tag.setLong("mStored", mStored); + tag.setLong("mMax", mMax); + tag.setLong("AvgIn", getBaseMetaTileEntity().getAverageElectricInput()); + tag.setLong("AvgOut", getBaseMetaTileEntity().getAverageElectricOutput()); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + switch (mInventory.length) { + case 4 -> builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 2) + .startFromSlot(0) + .endAtSlot(3) + .slotCreator(index -> new BaseSlot(inventoryHandler, index) { + + @Override + public int getSlotStackLimit() { + return 1; + } + }) + .background(getGUITextureSet().getItemSlot()) + .build() + .setPos(70, 25)); + case 9 -> builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 3) + .startFromSlot(0) + .endAtSlot(8) + .slotCreator(index -> new BaseSlot(inventoryHandler, index) { + + @Override + public int getSlotStackLimit() { + return 1; + } + }) + .background(getGUITextureSet().getItemSlot()) + .build() + .setPos(61, 16)); + case 16 -> builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 4) + .startFromSlot(0) + .endAtSlot(15) + .slotCreator(index -> new BaseSlot(inventoryHandler, index) { + + @Override + public int getSlotStackLimit() { + return 1; + } + }) + .background(getGUITextureSet().getItemSlot()) + .build() + .setPos(52, 7)); + default -> builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 1) + .startFromSlot(0) + .endAtSlot(0) + .slotCreator(index -> new BaseSlot(inventoryHandler, index) { + + @Override + public int getSlotStackLimit() { + return 1; + } + }) + .background(getGUITextureSet().getItemSlot()) + .build() + .setPos(79, 34)); + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicGenerator.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicGenerator.java new file mode 100644 index 0000000000..ac923bc699 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicGenerator.java @@ -0,0 +1,338 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.RecipeMapWorkable; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.maps.FuelBackend; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.common.Pollution; + +public abstract class MTEBasicGenerator extends MTEBasicTank implements RecipeMapWorkable { + + public MTEBasicGenerator(int aID, String aName, String aNameRegional, int aTier, String aDescription, + ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures); + } + + public MTEBasicGenerator(int aID, String aName, String aNameRegional, int aTier, String[] aDescription, + ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures); + } + + public MTEBasicGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + public MTEBasicGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[10][17][]; + for (byte i = -1; i < 16; i++) { + rTextures[0][i + 1] = getFront(i); + rTextures[1][i + 1] = getBack(i); + rTextures[2][i + 1] = getBottom(i); + rTextures[3][i + 1] = getTop(i); + rTextures[4][i + 1] = getSides(i); + rTextures[5][i + 1] = getFrontActive(i); + rTextures[6][i + 1] = getBackActive(i); + rTextures[7][i + 1] = getBottomActive(i); + rTextures[8][i + 1] = getTopActive(i); + rTextures[9][i + 1] = getSidesActive(i); + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + return mTextures[(active ? 5 : 0) + (side == facingDirection ? 0 + : side == facingDirection.getOpposite() ? 1 + : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][colorIndex + 1]; + } + + @Override + public String[] getDescription() { + String[] desc = new String[mDescriptionArray.length + 1]; + System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); + desc[mDescriptionArray.length] = "Fuel Efficiency: " + getEfficiency() + "%"; + return desc; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + public ITexture[] getFront(byte aColor) { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getBack(byte aColor) { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getTop(byte aColor) { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getSides(byte aColor) { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getFrontActive(byte aColor) { + return getFront(aColor); + } + + public ITexture[] getBackActive(byte aColor) { + return getBack(aColor); + } + + public ITexture[] getBottomActive(byte aColor) { + return getBottom(aColor); + } + + public ITexture[] getTopActive(byte aColor) { + return getTop(aColor); + } + + public ITexture[] getSidesActive(byte aColor) { + return getSides(aColor); + } + + @Override + public boolean isFacingValid(ForgeDirection side) { + return true; + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex < 2; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public long maxEUOutput() { + return getBaseMetaTileEntity().isAllowedToWork() ? V[mTier] : 0L; + } + + @Override + public long maxEUStore() { + return Math.max(getEUVar(), V[mTier] * 80L + getMinimumStoredEU()); + } + + @Override + public boolean doesFillContainers() { + return getBaseMetaTileEntity().isAllowedToWork(); + // return false; + } + + @Override + public boolean doesEmptyContainers() { + return getBaseMetaTileEntity().isAllowedToWork(); + } + + @Override + public boolean canTankBeFilled() { + return getBaseMetaTileEntity().isAllowedToWork(); + } + + @Override + public boolean canTankBeEmptied() { + return getBaseMetaTileEntity().isAllowedToWork(); + } + + @Override + public boolean displaysItemStack() { + return true; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return getFuelValue(aFluid) > 0; + } + + @Override + public boolean isLiquidOutput(ForgeDirection side) { + // return super.isLiquidOutput(aSide); + return false; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && aTick % 10 == 0) { + if (mFluid != null) { + long tFuelValue = getFuelValue(mFluid), tConsumed = consumedFluidPerOperation(mFluid); + if (tFuelValue > 0 && tConsumed > 0 && mFluid.amount >= tConsumed) { + long tFluidAmountToUse = Math.min( + mFluid.amount / tConsumed, + (maxEUStore() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue); + if (tFluidAmountToUse > 0 + && aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true)) { + // divided by two because this is called every 10 ticks, not 20 + Pollution.addPollution(getBaseMetaTileEntity(), getPollution() / 2); + mFluid.amount -= tFluidAmountToUse * tConsumed; + } + } + } + + if (mInventory[getInputSlot()] != null + && aBaseMetaTileEntity.getUniversalEnergyStored() < (maxEUOutput() * 20 + getMinimumStoredEU()) + && ((GTUtility.getFluidForFilledItem(mInventory[getInputSlot()], true) != null) + || solidFuelOverride(mInventory[getInputSlot()]))) { + long tFuelValue = getFuelValue(mInventory[getInputSlot()]); + if (tFuelValue <= 0) tFuelValue = getFuelValue(mInventory[getInputSlot()], true); + // System.out.println(" tFuelValue : " + tFuelValue ); + if (tFuelValue > 0) { + ItemStack tEmptyContainer = getEmptyContainer(mInventory[getInputSlot()]); + if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tEmptyContainer)) { + aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true); + aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); + // divided by two because this is called every 10 ticks, not 20 + Pollution.addPollution(getBaseMetaTileEntity(), getPollution() / 2); + } + } + } + } + + if (aBaseMetaTileEntity.isServerSide()) aBaseMetaTileEntity.setActive( + aBaseMetaTileEntity.isAllowedToWork() + && aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU()); + } + + /** + * @param stack the fuel stack + * @return if the stack is a solid fuel + */ + public boolean solidFuelOverride(ItemStack stack) { + // this could be used for a coal generator for example aswell... + ItemData association = GTOreDictUnificator.getAssociation(stack); + // if it is a gregtech Item, make sure its not a VOLUMETRIC_FLASK or any type of cell, else do vanilla checks + if (association != null) { + return !OrePrefixes.CELL_TYPES.contains(association.mPrefix) + && !GTUtility.areStacksEqual(ItemList.VOLUMETRIC_FLASK.get(1L), stack, true); + } else { + return stack != null && // when the stack is null its not a solid + stack.getItem() != null && // when the item in the stack is null its not a solid + !(stack.getItem() instanceof IFluidContainerItem) && // when the item is a fluid container its not a + // solid... + !(stack.getItem() instanceof IFluidHandler) && // when the item is a fluid handler its not a + // solid... + !stack.getItem() + .getUnlocalizedName() + .contains("bucket"); // since we cant really check for + // buckets... + } + } + + public abstract int getPollution(); + + @Override + public abstract RecipeMap getRecipeMap(); + + public abstract int getEfficiency(); + + public int consumedFluidPerOperation(FluidStack aLiquid) { + return 1; + } + + public int getFuelValue(FluidStack aLiquid) { + long value = getFuelValue(aLiquid, true); + return (value > Integer.MAX_VALUE) ? 0 : (int) value; + } + + public long getFuelValue(FluidStack aLiquid, boolean aLong) { + RecipeMap tRecipes = getRecipeMap(); + if (aLiquid == null || !(tRecipes.getBackend() instanceof FuelBackend tFuels)) return 0; + GTRecipe tFuel = tFuels.findFuel(aLiquid); + if (tFuel == null) return 0; + + return (long) tFuel.mSpecialValue * getEfficiency() * consumedFluidPerOperation(aLiquid) / 100; + } + + public int getFuelValue(ItemStack aStack) { + long value = getFuelValue(aStack, true); + return (value > Integer.MAX_VALUE) ? 0 : (int) value; + } + + public long getFuelValue(ItemStack aStack, boolean aLong) { + if (GTUtility.isStackInvalid(aStack) || getRecipeMap() == null) return 0; + GTRecipe tFuel = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack); + if (tFuel == null) return 0; + + long liters = 10L; // 1000mb/100 + return (long) tFuel.mSpecialValue * liters * getEfficiency(); + } + + public ItemStack getEmptyContainer(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack) || getRecipeMap() == null) return null; + GTRecipe tFuel = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack); + if (tFuel != null) return GTUtility.copyOrNull(tFuel.getOutput(0)); + return GTUtility.getContainerItem(aStack, true); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && (getFuelValue(aStack, true) > 0 + || getFuelValue(GTUtility.getFluidForFilledItem(aStack, true), true) > 0); + } + + @Override + public int getCapacity() { + return 16000; + } + + @Override + public int getTankPressure() { + return -100; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHull.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHull.java new file mode 100644 index 0000000000..35b6003c24 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHull.java @@ -0,0 +1,173 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class MTEBasicHull extends MTEBasicTank { + + public MTEBasicHull(int aID, String aName, String aNameRegional, int aTier, String aDescription, + ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, 1, aDescription, aTextures); + } + + public MTEBasicHull(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, String aDescription, + ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEBasicHull(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEBasicHull(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBasicHull(mName, mTier, mInventory.length, mDescriptionArray, mTextures); + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return !isOutputFacing(side); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public long getMinimumStoredEU() { + return 512; + } + + @Override + public long maxEUStore() { + return 512 + V[mTier] * 50; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUOutput() { + return V[mTier]; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return true; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aConnected, boolean redstoneLevel) { + return mTextures[Math.min(2, side.ordinal()) + (side == aFacing ? 3 : 0)][colorIndex + 1]; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[6][17][]; + for (byte i = -1; i < 16; i++) { + rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; + rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; + rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] }; + rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; + rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; + rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; + } + return rTextures; + } + + @Override + public boolean doesFillContainers() { + return false; + } + + @Override + public boolean doesEmptyContainers() { + return false; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return false; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + @Override + public int getCapacity() { + return (mTier + 1) * 1000; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHullNonElectric.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHullNonElectric.java new file mode 100644 index 0000000000..ec01af0408 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicHullNonElectric.java @@ -0,0 +1,75 @@ +package gregtech.api.metatileentity.implementations; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public abstract class MTEBasicHullNonElectric extends MTEBasicHull { + + public MTEBasicHullNonElectric(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, aDescription); + } + + public MTEBasicHullNonElectric(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures); + } + + public MTEBasicHullNonElectric(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + return mTextures[Math.min(2, sideDirection.ordinal())][colorIndex + 1]; + } + + @Override + public boolean isElectric() { + return false; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public boolean isEnetOutput() { + return false; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 0; + } + + @Override + public long maxEUStore() { + return 0; + } + + @Override + public long maxEUInput() { + return 0; + } + + @Override + public long maxEUOutput() { + return 0; + } + + @Override + public abstract ITexture[][][] getTextureSet(ITexture[] aTextures); +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java new file mode 100644 index 0000000000..25dfb9b58b --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java @@ -0,0 +1,1563 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.GTValues.debugCleanroom; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; +import static gregtech.api.metatileentity.BaseTileEntity.FLUID_TRANSFER_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.ITEM_TRANSFER_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_STEAM_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_VOLTAGE_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.POWER_SOURCE_KEY; +import static gregtech.api.metatileentity.BaseTileEntity.SPECIAL_SLOT_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.STALLED_STUTTERING_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.STALLED_VENT_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.metatileentity.BaseTileEntity.UNUSED_SLOT_TOOLTIP; +import static gregtech.api.util.GTRecipeConstants.EXPLODE; +import static gregtech.api.util.GTRecipeConstants.ON_FIRE; +import static gregtech.api.util.GTUtility.moveMultipleItemStacks; +import static net.minecraftforge.common.util.ForgeDirection.DOWN; +import static net.minecraftforge.common.util.ForgeDirection.UNKNOWN; +import static net.minecraftforge.common.util.ForgeDirection.UP; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import org.apache.commons.lang3.tuple.Pair; + +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SoundResource; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.SteamTexture; +import gregtech.api.interfaces.ICleanroom; +import gregtech.api.interfaces.IConfigurationCircuitSupport; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider; +import gregtech.api.interfaces.tileentity.RecipeMapWorkable; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.overclockdescriber.EUOverclockDescriber; +import gregtech.api.objects.overclockdescriber.OverclockDescriber; +import gregtech.api.recipe.BasicUIProperties; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTClientPreference; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GTWaila; +import gregtech.api.util.GT_TooltipDataCache; +import gregtech.api.util.OverclockCalculator; +import gregtech.common.gui.modularui.UIHelper; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple + * Machine + */ +public abstract class MTEBasicMachine extends MTEBasicTank implements RecipeMapWorkable, IConfigurationCircuitSupport, + IOverclockDescriptionProvider, IAddGregtechLogo, IAddUIWidgets { + + /** + * return values for checkRecipe() + */ + protected static final int DID_NOT_FIND_RECIPE = 0, FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS = 1, + FOUND_AND_SUCCESSFULLY_USED_RECIPE = 2; + + public static final int OTHER_SLOT_COUNT = 5; + public final ItemStack[] mOutputItems; + public final int mInputSlotCount, mAmperage; + public boolean mAllowInputFromOutputSide = false, mFluidTransfer = false, mItemTransfer = false, + mHasBeenUpdated = false, mStuttering = false, mCharge = false, mDecharge = false; + public boolean mDisableFilter = true; + public boolean mDisableMultiStack = true; + public int mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mOutputBlocked = 0; + public ForgeDirection mMainFacing = ForgeDirection.WEST; + public FluidStack mOutputFluid; + protected final OverclockDescriber overclockDescriber; + + /** + * Contains the Recipe which has been previously used, or null if there was no previous Recipe, which could have + * been buffered + */ + protected GTRecipe mLastRecipe = null; + + private FluidStack mFluidOut; + protected final FluidStackTank fluidOutputTank = new FluidStackTank( + () -> mFluidOut, + fluidStack -> mFluidOut = fluidStack, + this::getCapacity); + + /** + * Registers machine with single-line description. + * + * @param aOverlays 0 = SideFacingActive 1 = SideFacingInactive 2 = FrontFacingActive 3 = FrontFacingInactive 4 = + * TopFacingActive 5 = TopFacingInactive 6 = BottomFacingActive 7 = BottomFacingInactive ----- Not + * all Array Elements have to be initialised, you can also just use 8 Parameters for the Default + * Pipe Texture Overlays ----- 8 = BottomFacingPipeActive 9 = BottomFacingPipeInactive 10 = + * TopFacingPipeActive 11 = TopFacingPipeInactive 12 = SideFacingPipeActive 13 = + * SideFacingPipeInactive + */ + public MTEBasicMachine(int aID, String aName, String aNameRegional, int aTier, int aAmperage, String aDescription, + int aInputSlotCount, int aOutputSlotCount, ITexture... aOverlays) { + super( + aID, + aName, + aNameRegional, + aTier, + OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1, + aDescription, + aOverlays); + mInputSlotCount = Math.max(0, aInputSlotCount); + mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)]; + mAmperage = aAmperage; + overclockDescriber = createOverclockDescriber(); + } + + /** + * Registers machine with multi-line descriptions. + */ + public MTEBasicMachine(int aID, String aName, String aNameRegional, int aTier, int aAmperage, String[] aDescription, + int aInputSlotCount, int aOutputSlotCount, ITexture... aOverlays) { + super( + aID, + aName, + aNameRegional, + aTier, + OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1, + aDescription, + aOverlays); + mInputSlotCount = Math.max(0, aInputSlotCount); + mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)]; + mAmperage = aAmperage; + overclockDescriber = createOverclockDescriber(); + } + + /** + * For {@link #newMetaEntity}. + */ + public MTEBasicMachine(String aName, int aTier, int aAmperage, String[] aDescription, ITexture[][][] aTextures, + int aInputSlotCount, int aOutputSlotCount) { + super(aName, aTier, OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1, aDescription, aTextures); + mInputSlotCount = Math.max(0, aInputSlotCount); + mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)]; + mAmperage = aAmperage; + overclockDescriber = createOverclockDescriber(); + } + + /** + * To be called by the constructor to initialize this instance's overclock behavior + */ + protected OverclockDescriber createOverclockDescriber() { + return new EUOverclockDescriber(mTier, mAmperage); + } + + protected boolean isValidMainFacing(ForgeDirection side) { + return (side.flag & (UP.flag | DOWN.flag | UNKNOWN.flag)) == 0; // Horizontal + } + + public boolean setMainFacing(ForgeDirection side) { + if (!isValidMainFacing(side)) return false; + mMainFacing = side; + if (getBaseMetaTileEntity().getFrontFacing() == mMainFacing) { + getBaseMetaTileEntity().setFrontFacing(side.getOpposite()); + } + onFacingChange(); + onMachineBlockUpdate(); + return true; + } + + @Override + public void onFacingChange() { + super.onFacingChange(); + // Set up the correct facing (front towards player, output opposite) client-side before the server packet + // arrives + if (mMainFacing == UNKNOWN) { + IGregTechTileEntity te = getBaseMetaTileEntity(); + if (te != null && te.getWorld().isRemote) { + mMainFacing = te.getFrontFacing(); + te.setFrontFacing(te.getBackFacing()); + } + } + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[14][17][]; + aTextures = Arrays.copyOf(aTextures, 14); + + for (int i = 0; i < aTextures.length; i++) if (aTextures[i] != null) for (byte c = -1; c < 16; c++) { + if (rTextures[i][c + 1] == null) + rTextures[i][c + 1] = new ITexture[] { MACHINE_CASINGS[mTier][c + 1], aTextures[i] }; + } + + for (byte c = -1; c < 16; c++) { + if (rTextures[0][c + 1] == null) rTextures[0][c + 1] = getSideFacingActive(c); + if (rTextures[1][c + 1] == null) rTextures[1][c + 1] = getSideFacingInactive(c); + if (rTextures[2][c + 1] == null) rTextures[2][c + 1] = getFrontFacingActive(c); + if (rTextures[3][c + 1] == null) rTextures[3][c + 1] = getFrontFacingInactive(c); + if (rTextures[4][c + 1] == null) rTextures[4][c + 1] = getTopFacingActive(c); + if (rTextures[5][c + 1] == null) rTextures[5][c + 1] = getTopFacingInactive(c); + if (rTextures[6][c + 1] == null) rTextures[6][c + 1] = getBottomFacingActive(c); + if (rTextures[7][c + 1] == null) rTextures[7][c + 1] = getBottomFacingInactive(c); + if (rTextures[8][c + 1] == null) rTextures[8][c + 1] = getBottomFacingPipeActive(c); + if (rTextures[9][c + 1] == null) rTextures[9][c + 1] = getBottomFacingPipeInactive(c); + if (rTextures[10][c + 1] == null) rTextures[10][c + 1] = getTopFacingPipeActive(c); + if (rTextures[11][c + 1] == null) rTextures[11][c + 1] = getTopFacingPipeInactive(c); + if (rTextures[12][c + 1] == null) rTextures[12][c + 1] = getSideFacingPipeActive(c); + if (rTextures[13][c + 1] == null) rTextures[13][c + 1] = getSideFacingPipeInactive(c); + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + final int textureIndex; + if ((mMainFacing.flag & (UP.flag | DOWN.flag)) != 0) { // UP or DOWN + if (sideDirection == facingDirection) { + textureIndex = active ? 2 : 3; + } else { + textureIndex = switch (sideDirection) { + case DOWN -> active ? 6 : 7; + case UP -> active ? 4 : 5; + default -> active ? 0 : 1; + }; + } + } else { + if (sideDirection == mMainFacing) { + textureIndex = active ? 2 : 3; + } else { + if (showPipeFacing() && sideDirection == facingDirection) { + textureIndex = switch (sideDirection) { + case DOWN -> active ? 8 : 9; + case UP -> active ? 10 : 11; + default -> active ? 12 : 13; + }; + } else { + textureIndex = switch (sideDirection) { + case DOWN -> active ? 6 : 7; + case UP -> active ? 4 : 5; + default -> active ? 0 : 1; + }; + } + } + } + return mTextures[textureIndex][colorIndex + 1]; + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isOverclockerUpgradable() { + return false; + } + + @Override + public boolean isTransformerUpgradable() { + return false; + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex > 0 && super.isValidSlot(aIndex) + && aIndex != getCircuitSlot() + && aIndex != OTHER_SLOT_COUNT + mInputSlotCount + mOutputItems.length; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + // Either mMainFacing or mMainFacing is horizontal + return ((facing.flag | mMainFacing.flag) & ~(UP.flag | DOWN.flag | UNKNOWN.flag)) != 0; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side != mMainFacing; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return side != mMainFacing && (mAllowInputFromOutputSide || side != getBaseMetaTileEntity().getFrontFacing()); + } + + @Override + public boolean isLiquidOutput(ForgeDirection side) { + return side != mMainFacing; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier] * 16L; + } + + @Override + public long maxEUStore() { + return V[mTier] * 64L; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxSteamStore() { + return maxEUStore(); + } + + @Override + public long maxAmperesIn() { + return ((long) mEUt * 2L) / V[mTier] + 1L; + } + + @Override + public int getInputSlot() { + return OTHER_SLOT_COUNT; + } + + @Override + public int getOutputSlot() { + return OTHER_SLOT_COUNT + mInputSlotCount; + } + + public int getSpecialSlotIndex() { + return 3; + } + + @Override + public int getStackDisplaySlot() { + return 2; + } + + @Override + public int rechargerSlotStartIndex() { + return 1; + } + + @Override + public int dechargerSlotStartIndex() { + return 1; + } + + @Override + public int rechargerSlotCount() { + return mCharge ? 1 : 0; + } + + @Override + public int dechargerSlotCount() { + return mDecharge ? 1 : 0; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public int getProgresstime() { + return mProgresstime; + } + + @Override + public int maxProgresstime() { + return mMaxProgresstime; + } + + @Override + public int increaseProgress(int aProgress) { + mProgresstime += aProgress; + return mMaxProgresstime - mProgresstime; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return getFillableStack() != null || (getRecipeMap() != null && getRecipeMap().containsInput(aFluid)); + } + + @Override + public boolean isFluidChangingAllowed() { + return true; + } + + @Override + public boolean doesFillContainers() { + return false; + } + + @Override + public boolean doesEmptyContainers() { + return false; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return true; + } + + @Override + public boolean displaysStackSize() { + return true; + } + + @Override + public FluidStack getDrainableStack() { + return mFluidOut; + } + + @Override + public FluidStack setDrainableStack(FluidStack aFluid) { + markDirty(); + mFluidOut = aFluid; + return mFluidOut; + } + + @Override + public boolean isDrainableStackSeparate() { + return true; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) return true; + if (!GTMod.gregtechproxy.mForceFreeFace) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (aBaseMetaTileEntity.getAirAtSide(side)) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + } + GTUtility.sendChatToPlayer(aPlayer, "No free Side!"); + return true; + } + + @Override + public void initDefaultModes(NBTTagCompound aNBT) { + mMainFacing = ForgeDirection.UNKNOWN; + if (!getBaseMetaTileEntity().getWorld().isRemote) { + final GTClientPreference tPreference = GTMod.gregtechproxy + .getClientPreference(getBaseMetaTileEntity().getOwnerUuid()); + if (tPreference != null) { + mDisableFilter = !tPreference.isSingleBlockInitialFilterEnabled(); + mDisableMultiStack = !tPreference.isSingleBlockInitialMultiStackEnabled(); + } + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("mFluidTransfer", mFluidTransfer); + aNBT.setBoolean("mItemTransfer", mItemTransfer); + aNBT.setBoolean("mHasBeenUpdated", mHasBeenUpdated); + aNBT.setBoolean("mAllowInputFromOutputSide", mAllowInputFromOutputSide); + aNBT.setBoolean("mDisableFilter", mDisableFilter); + aNBT.setBoolean("mDisableMultiStack", mDisableMultiStack); + aNBT.setInteger("mEUt", mEUt); + aNBT.setInteger("mMainFacing", mMainFacing.ordinal()); + aNBT.setInteger("mProgresstime", mProgresstime); + aNBT.setInteger("mMaxProgresstime", mMaxProgresstime); + if (mOutputFluid != null) aNBT.setTag("mOutputFluid", mOutputFluid.writeToNBT(new NBTTagCompound())); + if (mFluidOut != null) aNBT.setTag("mFluidOut", mFluidOut.writeToNBT(new NBTTagCompound())); + + for (int i = 0; i < mOutputItems.length; i++) + if (mOutputItems[i] != null) GTUtility.saveItem(aNBT, "mOutputItem" + i, mOutputItems[i]); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mFluidTransfer = aNBT.getBoolean("mFluidTransfer"); + mItemTransfer = aNBT.getBoolean("mItemTransfer"); + mHasBeenUpdated = aNBT.getBoolean("mHasBeenUpdated"); + mAllowInputFromOutputSide = aNBT.getBoolean("mAllowInputFromOutputSide"); + mDisableFilter = aNBT.getBoolean("mDisableFilter"); + mDisableMultiStack = aNBT.getBoolean("mDisableMultiStack"); + mEUt = aNBT.getInteger("mEUt"); + mMainFacing = ForgeDirection.getOrientation(aNBT.getInteger("mMainFacing")); + mProgresstime = aNBT.getInteger("mProgresstime"); + mMaxProgresstime = aNBT.getInteger("mMaxProgresstime"); + mOutputFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mOutputFluid")); + mFluidOut = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluidOut")); + + for (int i = 0; i < mOutputItems.length; i++) mOutputItems[i] = GTUtility.loadItem(aNBT, "mOutputItem" + i); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide()) { + mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; + mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; + + doDisplayThings(); + + boolean tSucceeded = false; + + if (mMaxProgresstime > 0 && (mProgresstime >= 0 || aBaseMetaTileEntity.isAllowedToWork())) { + markDirty(); + aBaseMetaTileEntity.setActive(true); + if (mProgresstime < 0 || drainEnergyForProcess(mEUt)) { + if (++mProgresstime >= mMaxProgresstime) { + for (int i = 0; i < mOutputItems.length; i++) + for (int j = 0; j < mOutputItems.length; j++) if (aBaseMetaTileEntity + .addStackToSlot(getOutputSlot() + ((j + i) % mOutputItems.length), mOutputItems[i])) + break; + if (mOutputFluid != null) + if (getDrainableStack() == null) setDrainableStack(mOutputFluid.copy()); + else if (mOutputFluid.isFluidEqual(getDrainableStack())) + getDrainableStack().amount += mOutputFluid.amount; + Arrays.fill(mOutputItems, null); + mOutputFluid = null; + mEUt = 0; + mProgresstime = 0; + mMaxProgresstime = 0; + mStuttering = false; + tSucceeded = true; + endProcess(); + } + if (mProgresstime > 5) mStuttering = false; + } else { + if (!mStuttering) { + stutterProcess(); + if (canHaveInsufficientEnergy()) mProgresstime = -100; + mStuttering = true; + } + } + } else { + aBaseMetaTileEntity.setActive(false); + } + + boolean tRemovedOutputFluid = false; + + if (doesAutoOutputFluids() && getDrainableStack() != null + && aBaseMetaTileEntity.getFrontFacing() != mMainFacing + && (tSucceeded || aTick % 20 == 0)) { + IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing()); + if (tTank != null) { + FluidStack tDrained = drain(1000, false); + if (tDrained != null) { + final int tFilledAmount = tTank.fill(aBaseMetaTileEntity.getBackFacing(), tDrained, false); + if (tFilledAmount > 0) + tTank.fill(aBaseMetaTileEntity.getBackFacing(), drain(tFilledAmount, true), true); + } + } + if (getDrainableStack() == null) tRemovedOutputFluid = true; + } + + if (doesAutoOutput() && !isOutputEmpty() + && aBaseMetaTileEntity.getFrontFacing() != mMainFacing + && (tSucceeded || mOutputBlocked % 300 == 1 + || aBaseMetaTileEntity.hasInventoryBeenModified() + || aTick % 600 == 0)) { + TileEntity tTileEntity2 = aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getFrontFacing()); + long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored(); + int tMaxStacks = (int) (tStoredEnergy / 64L); + if (tMaxStacks > mOutputItems.length) tMaxStacks = mOutputItems.length; + + moveMultipleItemStacks( + aBaseMetaTileEntity, + tTileEntity2, + aBaseMetaTileEntity.getFrontFacing(), + aBaseMetaTileEntity.getBackFacing(), + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1, + tMaxStacks); + } + + if (mOutputBlocked != 0) if (isOutputEmpty()) mOutputBlocked = 0; + else mOutputBlocked++; + + if (allowToCheckRecipe()) { + if (mMaxProgresstime <= 0 && aBaseMetaTileEntity.isAllowedToWork() + && (tRemovedOutputFluid || tSucceeded + || aBaseMetaTileEntity.hasInventoryBeenModified() + || aTick % 600 == 0 + || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) + && hasEnoughEnergyToCheckRecipe()) { + if (checkRecipe() == FOUND_AND_SUCCESSFULLY_USED_RECIPE) { + if (getSpecialSlot() != null && getSpecialSlot().stackSize <= 0) + mInventory[getSpecialSlotIndex()] = null; + for (int i = getInputSlot(), j = i + mInputSlotCount; i < j; i++) + if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; + for (int i = 0; i < mOutputItems.length; i++) { + mOutputItems[i] = GTUtility.copyOrNull(mOutputItems[i]); + if (mOutputItems[i] != null && mOutputItems[i].stackSize > 64) + mOutputItems[i].stackSize = 64; + mOutputItems[i] = GTOreDictUnificator.get(true, mOutputItems[i]); + } + if (mFluid != null && mFluid.amount <= 0) mFluid = null; + mMaxProgresstime = Math.max(1, mMaxProgresstime); + if (GTUtility.isDebugItem(mInventory[dechargerSlotStartIndex()])) { + mEUt = mMaxProgresstime = 1; + } + startProcess(); + } else { + mMaxProgresstime = 0; + Arrays.fill(mOutputItems, null); + mOutputFluid = null; + } + } + } else { + if (!mStuttering) { + stutterProcess(); + mStuttering = true; + } + } + } + // Only using mNeedsSteamVenting right now and assigning it to 64 to space in the range for more single block + // machine problems. + // Value | Class | Field + // 1 | GT_MetaTileEntity_BasicMachine | mStuttering + // 64 | GT_MetaTileEntity_BasicMachine_Bronze | mNeedsSteamVenting + aBaseMetaTileEntity.setErrorDisplayID((aBaseMetaTileEntity.getErrorDisplayID() & ~127)); // | (mStuttering ? 1 : + // 0)); + } + + protected void doDisplayThings() { + if (!isValidMainFacing(mMainFacing) && isValidMainFacing(getBaseMetaTileEntity().getFrontFacing())) { + mMainFacing = getBaseMetaTileEntity().getFrontFacing(); + } + if (isValidMainFacing(mMainFacing) && !mHasBeenUpdated) { + mHasBeenUpdated = true; + getBaseMetaTileEntity().setFrontFacing(getBaseMetaTileEntity().getBackFacing()); + } + } + + protected boolean hasEnoughEnergyToCheckRecipe() { + return getBaseMetaTileEntity().isUniversalEnergyStored(getMinimumStoredEU() / 2); + } + + protected boolean drainEnergyForProcess(long aEUt) { + return getBaseMetaTileEntity().decreaseStoredEnergyUnits(aEUt, false); + } + + /** + * Calculates overclock based on {@link #overclockDescriber}. + */ + protected void calculateCustomOverclock(GTRecipe recipe) { + OverclockCalculator calculator = overclockDescriber.createCalculator( + new OverclockCalculator().setRecipeEUt(recipe.mEUt) + .setDuration(recipe.mDuration) + .setOneTickDiscount(true), + recipe); + calculator.calculate(); + mEUt = (int) calculator.getConsumption(); + mMaxProgresstime = calculator.getDuration(); + } + + /** + * Helper method for calculating simple overclock. + */ + protected void calculateOverclockedNess(int eut, int duration) { + OverclockCalculator calculator = new OverclockCalculator().setRecipeEUt(eut) + .setEUt(V[mTier] * mAmperage) + .setDuration(duration) + .setOneTickDiscount(true) + .calculate(); + mEUt = (int) calculator.getConsumption(); + mMaxProgresstime = calculator.getDuration(); + } + + protected ItemStack getSpecialSlot() { + return mInventory[getSpecialSlotIndex()]; + } + + protected ItemStack getOutputAt(int aIndex) { + return mInventory[getOutputSlot() + aIndex]; + } + + protected ItemStack[] getAllOutputs() { + ItemStack[] rOutputs = new ItemStack[mOutputItems.length]; + for (int i = 0; i < mOutputItems.length; i++) rOutputs[i] = getOutputAt(i); + return rOutputs; + } + + protected boolean canOutput(GTRecipe aRecipe) { + return aRecipe != null && (aRecipe.mNeedsEmptyOutput ? isOutputEmpty() && getDrainableStack() == null + : canOutput(aRecipe.getFluidOutput(0)) && canOutput(aRecipe.mOutputs)); + } + + protected boolean canOutput(ItemStack... aOutputs) { + if (aOutputs == null) return true; + ItemStack[] tOutputSlots = getAllOutputs(); + for (int i = 0; i < tOutputSlots.length && i < aOutputs.length; i++) + if (tOutputSlots[i] != null && aOutputs[i] != null + && (!GTUtility.areStacksEqual(tOutputSlots[i], aOutputs[i], false) + || tOutputSlots[i].stackSize + aOutputs[i].stackSize > tOutputSlots[i].getMaxStackSize())) { + mOutputBlocked++; + return false; + } + return true; + } + + protected boolean canOutput(FluidStack aOutput) { + if (aOutput == null) return true; + FluidStack drainableStack = getDrainableStack(); + if (drainableStack != null && !drainableStack.isFluidEqual(aOutput)) return false; + return (drainableStack != null ? drainableStack.amount : 0) + aOutput.amount <= getCapacity(); + } + + protected ItemStack getInputAt(int aIndex) { + return mInventory[getInputSlot() + aIndex]; + } + + protected ItemStack[] getAllInputs() { + int tRealInputSlotCount = this.mInputSlotCount + (allowSelectCircuit() ? 1 : 0); + ItemStack[] rInputs = new ItemStack[tRealInputSlotCount]; + for (int i = 0; i < mInputSlotCount; i++) rInputs[i] = getInputAt(i); + if (allowSelectCircuit()) rInputs[mInputSlotCount] = getStackInSlot(getCircuitSlot()); + return rInputs; + } + + protected boolean isOutputEmpty() { + boolean rIsEmpty = true; + for (ItemStack tOutputSlotContent : getAllOutputs()) if (tOutputSlotContent != null) { + rIsEmpty = false; + break; + } + return rIsEmpty; + } + + @Override + public void onValueUpdate(byte aValue) { + mMainFacing = ForgeDirection.getOrientation(aValue); + } + + @Override + public byte getUpdateData() { + return (byte) mMainFacing.ordinal(); + } + + @Override + public void doSound(byte aIndex, double aX, double aY, double aZ) { + super.doSound(aIndex, aX, aY, aZ); + if (aIndex == 8) GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ); + } + + public boolean doesAutoOutput() { + return mItemTransfer; + } + + public boolean doesAutoOutputFluids() { + return mFluidTransfer; + } + + public boolean allowToCheckRecipe() { + return true; + } + + public boolean showPipeFacing() { + return true; + } + + /** + * Called whenever the Machine successfully started a Process, useful for Sound Effects + */ + public void startProcess() { + // + } + + /** + * Called whenever the Machine successfully finished a Process, useful for Sound Effects + */ + public void endProcess() { + // + } + + /** + * Called whenever the Machine aborted a Process, useful for Sound Effects + */ + public void abortProcess() { + // + } + + /** + * Called whenever the Machine aborted a Process but still works on it, useful for Sound Effects + */ + public void stutterProcess() { + if (useStandardStutterSound()) sendSound((byte) 8); + } + + /** + * If this Machine can have the Insufficient Energy Line Problem + */ + public boolean canHaveInsufficientEnergy() { + return true; + } + + public boolean useStandardStutterSound() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { "Progress:", + EnumChatFormatting.GREEN + GTUtility.formatNumbers((mProgresstime / 20)) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + "Stored Energy:", + EnumChatFormatting.GREEN + GTUtility.formatNumbers(getBaseMetaTileEntity().getStoredEU()) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getBaseMetaTileEntity().getEUCapacity()) + + EnumChatFormatting.RESET + + " EU", + "Probably uses: " + EnumChatFormatting.RED + + GTUtility.formatNumbers(mEUt) + + EnumChatFormatting.RESET + + " EU/t at " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(mEUt == 0 ? 0 : mAmperage) + + EnumChatFormatting.RESET + + " A" }; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (side == getBaseMetaTileEntity().getFrontFacing() || side == mMainFacing) { + if (aPlayer.isSneaking()) { + mDisableFilter = !mDisableFilter; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.hatch.disableFilter." + mDisableFilter)); + } else { + mAllowInputFromOutputSide = !mAllowInputFromOutputSide; + GTUtility.sendChatToPlayer( + aPlayer, + mAllowInputFromOutputSide ? GTUtility.trans("095", "Input from Output Side allowed") + : GTUtility.trans("096", "Input from Output Side forbidden")); + } + } + } + + @Override + public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, + EntityPlayer entityPlayer, float aX, float aY, float aZ) { + if (!entityPlayer.isSneaking()) return false; + final boolean click = super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); + if (click) return true; + if (wrenchingSide != mMainFacing) return false; + mDisableMultiStack = !mDisableMultiStack; + GTUtility.sendChatToPlayer( + entityPlayer, + StatCollector.translateToLocal("GT5U.hatch.disableMultiStack." + mDisableMultiStack)); + return true; + } + + @Override + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { + if (side != mMainFacing) return true; + CoverBehaviorBase tBehavior = GregTechAPI.getCoverBehaviorNew(aCoverID.toStack()); + return tBehavior.isGUIClickable( + side, + GTUtility.stackToInt(aCoverID.toStack()), + tBehavior.createDataObject(), + getBaseMetaTileEntity()); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side != mMainFacing && aIndex >= getOutputSlot() && aIndex < getOutputSlot() + mOutputItems.length; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (side == mMainFacing || aIndex < getInputSlot() + || aIndex >= getInputSlot() + mInputSlotCount + || (!mAllowInputFromOutputSide && side == aBaseMetaTileEntity.getFrontFacing())) return false; + for (int i = getInputSlot(), j = i + mInputSlotCount; i < j; i++) + if (GTUtility.areStacksEqual(GTOreDictUnificator.get(aStack), mInventory[i]) && mDisableMultiStack) + return i == aIndex; + return mDisableFilter || allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack); + } + + /** + * Test if given stack can be inserted into specified slot. If mDisableMultiStack is false, before execution of this + * method it is ensured there is no such kind of item inside any input slots already. Otherwise, you don't need to + * check for it anyway. + */ + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return !mDisableMultiStack || mInventory[aIndex] == null; + } + + @Override + public boolean allowSelectCircuit() { + return false; + } + + protected final ItemStack[] appendSelectedCircuit(ItemStack... inputs) { + if (allowSelectCircuit()) { + ItemStack circuit = getStackInSlot(getCircuitSlot()); + if (circuit != null) { + ItemStack[] result = Arrays.copyOf(inputs, inputs.length + 1); + result[inputs.length] = circuit; + return result; + } + } + return inputs; + } + + @Override + public int getCircuitSlot() { + return 4; + } + + @Override + public int getCircuitGUISlot() { + return 3; + } + + @Override + public List getConfigurationCircuits() { + return GregTechAPI.getConfigurationCircuitList(mTier); + } + + @Override + public RecipeMap getRecipeMap() { + return null; + } + + /** + * Override this to check the Recipes yourself, super calls to this could be useful if you just want to add a + * special case + *

+ * I thought about Enum too, but Enum doesn't add support for people adding other return Systems. + *

+ * Funny how Eclipse marks the word Enum as not correctly spelled. + * + * @return see constants above + */ + public int checkRecipe() { + return checkRecipe(false); + } + + public static boolean isValidForLowGravity(GTRecipe tRecipe, int dimId) { + return // TODO check or get a better solution + DimensionManager.getProvider(dimId) + .getClass() + .getName() + .contains("Orbit") + || DimensionManager.getProvider(dimId) + .getClass() + .getName() + .endsWith("Space") + || DimensionManager.getProvider(dimId) + .getClass() + .getName() + .endsWith("Asteroids") + || DimensionManager.getProvider(dimId) + .getClass() + .getName() + .endsWith("SS") + || DimensionManager.getProvider(dimId) + .getClass() + .getName() + .contains("SpaceStation"); + } + + /** + * + * @param skipOC disables OverclockedNess calculation and check - if you do you must implement your own method... + * @return DID_NOT_FIND_RECIPE = 0, FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS = 1, + * FOUND_AND_SUCCESSFULLY_USED_RECIPE = 2; + */ + public int checkRecipe(boolean skipOC) { + RecipeMap tMap = getRecipeMap(); + if (tMap == null) return DID_NOT_FIND_RECIPE; + GTRecipe tRecipe = tMap.findRecipeQuery() + .items(getAllInputs()) + .fluids(getFillableStack()) + .specialSlot(getSpecialSlot()) + .voltage(V[mTier]) + .cachedRecipe(mLastRecipe) + .find(); + if (tRecipe == null) { + return DID_NOT_FIND_RECIPE; + } + if (tRecipe.getMetadataOrDefault(EXPLODE, false) && getBaseMetaTileEntity() != null) { + getBaseMetaTileEntity().doExplosion(V[mTier] * 4); + return DID_NOT_FIND_RECIPE; + } + if (tRecipe.getMetadataOrDefault(ON_FIRE, false) && getBaseMetaTileEntity() != null) { + getBaseMetaTileEntity().setOnFire(); + return DID_NOT_FIND_RECIPE; + } + + if (GTMod.gregtechproxy.mLowGravProcessing && (tRecipe.mSpecialValue == -100 || tRecipe.mSpecialValue == -300) + && !isValidForLowGravity(tRecipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe; + if (!canOutput(tRecipe)) { + mOutputBlocked++; + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + } + ICleanroom cleanroom = getCleanroom(); + if (tRecipe.mSpecialValue == -200 || tRecipe.mSpecialValue == -300) { + if (cleanroom == null || !cleanroom.isValidCleanroom() || cleanroom.getCleanness() == 0) { + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + } + } + if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs())) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + for (int i = 0; i < mOutputItems.length; i++) + if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i)) + mOutputItems[i] = tRecipe.getOutput(i); + if (tRecipe.mSpecialValue == -200 || tRecipe.mSpecialValue == -300) { + assert cleanroom != null; + for (int i = 0; i < mOutputItems.length; i++) if (mOutputItems[i] != null + && getBaseMetaTileEntity().getRandomNumber(10000) > cleanroom.getCleanness()) { + if (debugCleanroom) { + GTLog.out.println( + "BasicMachine: Voiding output due to cleanness failure. Cleanness = " + + cleanroom.getCleanness()); + } + mOutputItems[i] = null; + } + } + mOutputFluid = tRecipe.getFluidOutput(0); + if (!skipOC) { + calculateCustomOverclock(tRecipe); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + } + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] }; + } + + public ITexture[] getBottomFacingPipeActive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + public ITexture[] getBottomFacingPipeInactive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + public ITexture[] getTopFacingPipeActive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + public ITexture[] getTopFacingPipeInactive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + public ITexture[] getSideFacingPipeActive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + public ITexture[] getSideFacingPipeInactive(byte aColor) { + return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + final NBTTagCompound tag = accessor.getNBTData(); + + if (tag.getBoolean("stutteringSingleBlock")) { + currenttip.add("Status: insufficient energy"); + } else { + boolean isActive = tag.getBoolean("isActiveSingleBlock"); + if (isActive) { + int mEUt = tag.getInteger("eut"); + if (!isSteampowered()) { + if (mEUt > 0) { + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.use_with_amperage", + GTUtility.formatNumbers(mEUt), + GTUtility.getAmperageForTier(mEUt, (byte) getInputTier()), + GTUtility.getColoredTierNameFromTier((byte) getInputTier()))); + } else if (mEUt < 0) { + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.produce_with_amperage", + GTUtility.formatNumbers(-mEUt), + GTUtility.getAmperageForTier(-mEUt, (byte) getOutputTier()), + GTUtility.getColoredTierNameFromTier((byte) getOutputTier()))); + } + } else { + if (mEUt > 0) { + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.use", + GTUtility.formatNumbers(mEUt), + GTUtility.getColoredTierNameFromVoltage(mEUt))); + } else if (mEUt < 0) { + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.produce", + GTUtility.formatNumbers(-mEUt), + GTUtility.getColoredTierNameFromVoltage(-mEUt))); + } + } + } + currenttip.add( + GTWaila.getMachineProgressString( + isActive, + tag.getInteger("maxProgressSingleBlock"), + tag.getInteger("progressSingleBlock"))); + } + + currenttip.add( + String.format( + "Machine Facing: %s", + ForgeDirection.getOrientation(tag.getInteger("mainFacingSingleBlock")) + .name())); + + currenttip.add( + String.format( + "Output Facing: %s", + ForgeDirection.getOrientation(tag.getInteger("outputFacingSingleBlock")) + .name())); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + + tag.setInteger("progressSingleBlock", mProgresstime); + tag.setInteger("maxProgressSingleBlock", mMaxProgresstime); + tag.setInteger("mainFacingSingleBlock", mMainFacing.ordinal()); + tag.setBoolean("stutteringSingleBlock", mStuttering); + + final IGregTechTileEntity tileEntity = getBaseMetaTileEntity(); + if (tileEntity != null) { + tag.setBoolean("isActiveSingleBlock", tileEntity.isActive()); + tag.setInteger( + "outputFacingSingleBlock", + tileEntity.getFrontFacing() + .ordinal()); + if (tileEntity.isActive()) tag.setInteger("eut", mEUt); + } + } + + @Nonnull + @Override + public OverclockDescriber getOverclockDescriber() { + return overclockDescriber; + } + + // GUI stuff + + @Override + public int getCircuitSlotX() { + return 153; + } + + @Override + public int getCircuitSlotY() { + return 63; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + if (getRecipeMap() != null) { + getRecipeMap().getFrontend() + .addGregTechLogo(builder, new Pos2d(0, 0)); + } else { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(152, 63)); + } + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + if (!isSteampowered()) { + builder.widget(createFluidAutoOutputButton()); + builder.widget(createItemAutoOutputButton()); + } + + BasicUIProperties uiProperties = getUIProperties(); + addIOSlots(builder, uiProperties); + + builder.widget(createChargerSlot(79, 62)); + + addProgressBar(builder, uiProperties); + + builder.widget( + createErrorStatusArea( + builder, + isSteampowered() ? GTUITextures.PICTURE_STALLED_STEAM : GTUITextures.PICTURE_STALLED_ELECTRICITY)); + } + + /** + * Override to specify UI properties if this machine doesn't work with recipemap. + */ + protected BasicUIProperties getUIProperties() { + if (getRecipeMap() != null) { + BasicUIProperties originalProperties = getRecipeMap().getFrontend() + .getUIProperties(); + return originalProperties.toBuilder() + .maxItemInputs(mInputSlotCount) + .maxItemOutputs(mOutputItems.length) + .maxFluidInputs(Math.min(originalProperties.maxFluidInputs, 1)) + .maxFluidOutputs(Math.min(originalProperties.maxFluidOutputs, 1)) + .build(); + } + return BasicUIProperties.builder() + .maxItemInputs(mInputSlotCount) + .maxItemOutputs(mOutputItems.length) + .maxFluidInputs(getCapacity() != 0 ? 1 : 0) + .maxFluidOutputs(0) + .build(); + } + + /** + * Adds item I/O, special item, and fluid I/O slots. + */ + protected void addIOSlots(ModularWindow.Builder builder, BasicUIProperties uiProperties) { + UIHelper.forEachSlots( + (i, backgrounds, pos) -> builder.widget(createItemInputSlot(i, backgrounds, pos)), + (i, backgrounds, pos) -> builder.widget(createItemOutputSlot(i, backgrounds, pos)), + (i, backgrounds, pos) -> builder.widget(createSpecialSlot(backgrounds, pos, uiProperties)), + (i, backgrounds, pos) -> builder.widget(createFluidInputSlot(backgrounds, pos)), + (i, backgrounds, pos) -> builder.widget(createFluidOutputSlot(backgrounds, pos)), + getGUITextureSet().getItemSlot(), + getGUITextureSet().getFluidSlot(), + uiProperties, + uiProperties.maxItemInputs, + uiProperties.maxItemOutputs, + uiProperties.maxFluidInputs, + uiProperties.maxFluidOutputs, + getSteamVariant(), + Pos2d.ZERO); + } + + protected void addProgressBar(ModularWindow.Builder builder, BasicUIProperties uiProperties) { + boolean isSteamPowered = isSteampowered(); + RecipeMap recipeMap = getRecipeMap(); + if (!isSteamPowered && uiProperties.progressBarTexture == null) { + if (recipeMap != null) { + // Require progress bar texture for machines working with recipemap, otherwise permit + throw new RuntimeException("Missing progressbar texture for " + recipeMap.unlocalizedName); + } else { + return; + } + } + if (isSteamPowered && uiProperties.progressBarTextureSteam == null) { + if (recipeMap != null) { + throw new RuntimeException("Missing steam progressbar texture for " + recipeMap.unlocalizedName); + } else { + return; + } + } + + builder.widget( + setNEITransferRect( + new ProgressBar() + .setProgress(() -> maxProgresstime() != 0 ? (float) getProgresstime() / maxProgresstime() : 0) + .setTexture( + isSteamPowered ? uiProperties.progressBarTextureSteam.get(getSteamVariant()) + : uiProperties.progressBarTexture.get(), + uiProperties.progressBarImageSize) + .setDirection(uiProperties.progressBarDirection) + .setPos(uiProperties.progressBarPos) + .setSize(uiProperties.progressBarSize), + uiProperties.neiTransferRectId)); + addProgressBarSpecialTextures(builder, uiProperties); + } + + /** + * Override this as needed instead of calling. + */ + protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) { + return (SlotWidget) new SlotWidget(inventoryHandler, getInputSlot() + index).setAccess(true, true) + .setBackground(backgrounds) + .setPos(pos); + } + + /** + * Override this as needed instead of calling. + */ + protected SlotWidget createItemOutputSlot(int index, IDrawable[] backgrounds, Pos2d pos) { + return (SlotWidget) new SlotWidget(inventoryHandler, getOutputSlot() + index).setAccess(true, false) + .setBackground(backgrounds) + .setPos(pos); + } + + /** + * Override this as needed instead of calling. + */ + protected SlotWidget createSpecialSlot(IDrawable[] backgrounds, Pos2d pos, BasicUIProperties uiProperties) { + return (SlotWidget) new SlotWidget(inventoryHandler, getSpecialSlotIndex()).setAccess(true, true) + .disableShiftInsert() + .setGTTooltip( + () -> mTooltipCache.getData(uiProperties.useSpecialSlot ? SPECIAL_SLOT_TOOLTIP : UNUSED_SLOT_TOOLTIP)) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(backgrounds) + .setPos(pos); + } + + protected FluidSlotWidget createFluidInputSlot(IDrawable[] backgrounds, Pos2d pos) { + return (FluidSlotWidget) new FluidSlotWidget(fluidTank).setBackground(backgrounds) + .setPos(pos); + } + + protected FluidSlotWidget createFluidOutputSlot(IDrawable[] backgrounds, Pos2d pos) { + return (FluidSlotWidget) new FluidSlotWidget(fluidOutputTank).setInteraction(true, false) + .setBackground(backgrounds) + .setPos(pos); + } + + @Override + protected SlotWidget createChargerSlot(int x, int y) { + if (isSteampowered()) { + return (SlotWidget) createChargerSlot(x, y, UNUSED_SLOT_TOOLTIP, new String[0]) + .setBackground(getGUITextureSet().getItemSlot()); + } else { + return super.createChargerSlot(x, y); + } + } + + protected CycleButtonWidget createItemAutoOutputButton() { + return (CycleButtonWidget) new CycleButtonWidget().setToggle(() -> mItemTransfer, val -> mItemTransfer = val) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_AUTOOUTPUT_ITEM) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setGTTooltip(() -> mTooltipCache.getData(ITEM_TRANSFER_TOOLTIP)) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(25, 62) + .setSize(18, 18); + } + + protected CycleButtonWidget createFluidAutoOutputButton() { + return (CycleButtonWidget) new CycleButtonWidget().setToggle(() -> mFluidTransfer, val -> mFluidTransfer = val) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_AUTOOUTPUT_FLUID) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setGTTooltip(() -> mTooltipCache.getData(FLUID_TRANSFER_TOOLTIP)) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7, 62) + .setSize(18, 18); + } + + protected Widget setNEITransferRect(Widget widget, String transferRectID) { + if (GTUtility.isStringInvalid(transferRectID)) { + return widget; + } + final String transferRectTooltip; + if (isSteampowered()) { + transferRectTooltip = StatCollector + .translateToLocalFormatted(NEI_TRANSFER_STEAM_TOOLTIP, overclockDescriber.getTierString()); + } else { + transferRectTooltip = StatCollector + .translateToLocalFormatted(NEI_TRANSFER_VOLTAGE_TOOLTIP, overclockDescriber.getTierString()); + } + widget.setNEITransferRect(transferRectID, new Object[] { overclockDescriber }, transferRectTooltip); + return widget; + } + + protected void addProgressBarSpecialTextures(ModularWindow.Builder builder, BasicUIProperties uiProperties) { + if (isSteampowered()) { + for (Pair> specialTexture : uiProperties.specialTexturesSteam) { + builder.widget( + new DrawableWidget().setDrawable( + specialTexture.getLeft() + .get(getSteamVariant())) + .setSize( + specialTexture.getRight() + .getLeft()) + .setPos( + specialTexture.getRight() + .getRight())); + } + } else { + for (Pair> specialTexture : uiProperties.specialTextures) { + builder.widget( + new DrawableWidget().setDrawable(specialTexture.getLeft()) + .setSize( + specialTexture.getRight() + .getLeft()) + .setPos( + specialTexture.getRight() + .getRight())); + } + } + } + + protected DrawableWidget createErrorStatusArea(ModularWindow.Builder builder, IDrawable picture) { + return (DrawableWidget) new DrawableWidget().setDrawable(picture) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setEnabled( + widget -> !widget.getTooltip() + .isEmpty()) + .dynamicTooltip(this::getErrorDescriptions) + .dynamicTooltipShift(this::getErrorDescriptionsShift) + .setPos(79, 44) + .setSize(18, 18) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> mStuttering, val -> mStuttering = val), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer( + () -> getBaseMetaTileEntity().getErrorDisplayID(), + val -> getBaseMetaTileEntity().setErrorDisplayID(val)), + builder, + (widget, val) -> widget.notifyTooltipChange()); + } + + protected List getErrorDescriptions() { + final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip(); + return tooltip != null ? tooltip.text : Collections.emptyList(); + } + + protected List getErrorDescriptionsShift() { + final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip(); + return tooltip != null ? tooltip.shiftText : Collections.emptyList(); + } + + protected GT_TooltipDataCache.TooltipData getErrorTooltip() { + if (isSteampowered()) { + if ((getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0) { + return mTooltipCache.getData(STALLED_VENT_TOOLTIP); + } + } + if (mStuttering) { + return mTooltipCache.getData( + STALLED_STUTTERING_TOOLTIP, + StatCollector.translateToLocal(POWER_SOURCE_KEY + (isSteampowered() ? "steam" : "power"))); + } + return null; + } + + protected static int getCapacityForTier(int tier) { + return switch (tier) { + case 0 -> 8000; + case 1 -> 16000; + case 2 -> 32000; + case 3 -> 64000; + case 4 -> 128000; + default -> 256000; + }; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineBronze.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineBronze.java new file mode 100644 index 0000000000..507a807a76 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineBronze.java @@ -0,0 +1,387 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.D1; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_TOP; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import java.util.Arrays; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.SteamVariant; +import gregtech.api.enums.TierEU; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.overclockdescriber.OverclockDescriber; +import gregtech.api.objects.overclockdescriber.SteamOverclockDescriber; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple + * Machine + */ +public abstract class MTEBasicMachineBronze extends MTEBasicMachine { + + private static final String TT_machineType = "GT5U.MBTT.MachineType"; + private static final int NEEDS_STEAM_VENTING = 64; + public boolean mNeedsSteamVenting = false; + + public MTEBasicMachineBronze(int aID, String aName, String aNameRegional, String aDescription, int aInputSlotCount, + int aOutputSlotCount, boolean aHighPressure) { + super(aID, aName, aNameRegional, aHighPressure ? 2 : 1, 0, aDescription, aInputSlotCount, aOutputSlotCount); + } + + public MTEBasicMachineBronze(String aName, String[] aDescription, ITexture[][][] aTextures, int aInputSlotCount, + int aOutputSlotCount, boolean aHighPressure) { + super(aName, aHighPressure ? 2 : 1, 0, aDescription, aTextures, aInputSlotCount, aOutputSlotCount); + } + + protected boolean isBricked() { + return false; + } + + @Override + public OverclockDescriber createOverclockDescriber() { + return new SteamOverclockDescriber(SteamVariant.BRONZE, 1, 2); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("mNeedsSteamVenting", mNeedsSteamVenting); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mNeedsSteamVenting = aNBT.getBoolean("mNeedsSteamVenting"); + } + + @Override + public boolean isElectric() { + return false; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return false; + } + + @Override + public long maxEUStore() { + return 0; + } + + @Override + public long maxEUInput() { + return 0; + } + + @Override + public int rechargerSlotCount() { + return 0; + } + + @Override + public int dechargerSlotCount() { + return 0; + } + + @Override + public boolean isSteampowered() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return super.isFacingValid(facing) && facing != mMainFacing; + } + + @Override + public long getMinimumStoredEU() { + return 1000; + } + + @Override + public long maxSteamStore() { + return 16000; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return side != mMainFacing; + } + + @Override + public boolean isLiquidOutput(ForgeDirection side) { + return side != mMainFacing; + } + + @Override + public boolean doesAutoOutput() { + return false; + } + + @Override + public boolean allowToCheckRecipe() { + if (mNeedsSteamVenting + && getBaseMetaTileEntity().getCoverIDAtSide(getBaseMetaTileEntity().getFrontFacing()) == 0 + && !GTUtility.hasBlockHitBox( + getBaseMetaTileEntity().getWorld(), + getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1), + getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1), + getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1))) { + sendSound((byte) 9); + mNeedsSteamVenting = false; + try { + for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld() + .getEntitiesWithinAABB( + EntityLivingBase.class, + AxisAlignedBB.getBoundingBox( + getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1), + getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1), + getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1), + getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1) + 1, + getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1) + 1, + getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1) + 1))) { + GTUtility.applyHeatDamage(tLiving, getSteamDamage()); + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + } + return !mNeedsSteamVenting; + } + + @Override + public int checkRecipe() { + GTRecipe tRecipe = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, TierEU.LV, null, getAllInputs()); + if ((tRecipe != null) && (canOutput(tRecipe.mOutputs)) + && (tRecipe.isRecipeInputEqual(true, null, getAllInputs()))) { + this.mOutputItems[0] = tRecipe.getOutput(0); + calculateCustomOverclock(tRecipe); + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + return DID_NOT_FIND_RECIPE; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + // Super already zeroed out setErrorDisplayID, add additional error codes here. + aBaseMetaTileEntity.setErrorDisplayID(aBaseMetaTileEntity.getErrorDisplayID() | (mNeedsSteamVenting ? 64 : 0)); + } + + @Override + public void endProcess() { + if (isSteampowered()) mNeedsSteamVenting = true; + } + + @Override + public void doSound(byte aIndex, double aX, double aY, double aZ) { + super.doSound(aIndex, aX, aY, aZ); + if (aIndex == 9) { + GTUtility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 5, 1.0F, aX, aY, aZ); + + new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) + .setWorld(getBaseMetaTileEntity().getWorld()) + .setMotion( + getBaseMetaTileEntity().getFrontFacing().offsetX / 5.0, + getBaseMetaTileEntity().getFrontFacing().offsetY / 5.0, + getBaseMetaTileEntity().getFrontFacing().offsetZ / 5.0) + .times( + 8, + x -> x + .setPosition( + aX - 0.5 + XSTR_INSTANCE.nextFloat(), + aY - 0.5 + XSTR_INSTANCE.nextFloat(), + aZ - 0.5 + XSTR_INSTANCE.nextFloat()) + .run()); + } + } + + @Override + public boolean isGivingInformation() { + return false; + } + + @Override + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { + return GregTechAPI.getCoverBehaviorNew(aCoverID.toStack()) + .isSimpleCover() && super.allowCoverOnSide(side, aCoverID); + } + + public float getSteamDamage() { + return 6.0F * mTier; + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getBottomFacingPipeActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getBottomFacingPipeInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getTopFacingPipeActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getTopFacingPipeInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getSideFacingPipeActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getSideFacingPipeInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.BRONZE; + } + + @Override + public GUITextureSet getGUITextureSet() { + return GUITextureSet.STEAM.apply(getSteamVariant()); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(152, 63)); + } + + @Override + protected FluidSlotWidget createFluidInputSlot(IDrawable[] backgrounds, Pos2d pos) { + return null; + } + + @Override + protected FluidSlotWidget createFluidOutputSlot(IDrawable[] backgrounds, Pos2d pos) { + return null; + } + + @Override + public String[] getDescription() { + String[] description = Arrays.copyOf(mDescriptionArray, mDescriptionArray.length + 1); + description[mDescriptionArray.length] = StatCollector.translateToLocal(TT_machineType) + ": " + + EnumChatFormatting.YELLOW + + StatCollector.translateToLocal(this.getRecipeMap().unlocalizedName) + + EnumChatFormatting.RESET; + return description; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineSteel.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineSteel.java new file mode 100644 index 0000000000..8d6f5568d5 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineSteel.java @@ -0,0 +1,149 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_TOP; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.SteamVariant; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IGetTitleColor; +import gregtech.api.objects.overclockdescriber.OverclockDescriber; +import gregtech.api.objects.overclockdescriber.SteamOverclockDescriber; +import gregtech.api.render.TextureFactory; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple + * Machine + */ +public abstract class MTEBasicMachineSteel extends MTEBasicMachineBronze implements IGetTitleColor { + + public MTEBasicMachineSteel(int aID, String aName, String aNameRegional, String aDescription, int aInputSlotCount, + int aOutputSlotCount, boolean aHighPressure) { + super(aID, aName, aNameRegional, aDescription, aInputSlotCount, aOutputSlotCount, aHighPressure); + } + + public MTEBasicMachineSteel(String aName, String[] aDescription, ITexture[][][] aTextures, int aInputSlotCount, + int aOutputSlotCount, boolean aHighPressure) { + super(aName, aDescription, aTextures, aInputSlotCount, aOutputSlotCount, aHighPressure); + } + + @Override + public OverclockDescriber createOverclockDescriber() { + return new SteamOverclockDescriber(SteamVariant.STEEL, 2, 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) }; + } + + @Override + public ITexture[] getBottomFacingPipeActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getBottomFacingPipeInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getTopFacingPipeActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getTopFacingPipeInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getSideFacingPipeActive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getSideFacingPipeInactive(byte aColor) { + return new ITexture[] { TextureFactory.of( + isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE, + Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.STEEL; + } + + @Override + public int getTitleColor() { + return COLOR_TITLE_WHITE.get(); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineWithRecipe.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineWithRecipe.java new file mode 100644 index 0000000000..b5bd3d77e1 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachineWithRecipe.java @@ -0,0 +1,817 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.GTValues.W; +import static gregtech.api.enums.GTValues.ticksBetweenSounds; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; +import static net.minecraftforge.common.util.ForgeDirection.UP; + +import java.util.Locale; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; +import com.gtnewhorizons.modularui.api.drawable.UITexture; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures.BlockIcons.CustomIcon; +import gregtech.api.enums.Tier; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.recipe.BasicUIProperties; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.ExternalMaterials; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple + * Machine + */ +public class MTEBasicMachineWithRecipe extends MTEBasicMachine { + + private final RecipeMap mRecipes; + private final int mTankCapacity; + private final SpecialEffects mSpecialEffect; + private final ResourceLocation mSoundResourceLocation; + private FallbackableUITexture progressBarTexture; + private int recipeCatalystPriority; + + /** + * Registers machine with single-line description, specific tank capacity, and sound specified by ResourceLocation. + */ + public MTEBasicMachineWithRecipe(int aID, String aName, String aNameRegional, int aTier, String aDescription, + RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, ResourceLocation aSound, + SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { + this( + aID, + aName, + aNameRegional, + aTier, + new String[] { aDescription }, + aRecipes, + aInputSlots, + aOutputSlots, + aTankCapacity, + aSound, + aSpecialEffect, + aOverlays, + aRecipe); + } + + /** + * Registers machine with multi-line descriptions, specific tank capacity, and sound specified by ResourceLocation. + */ + public MTEBasicMachineWithRecipe(int aID, String aName, String aNameRegional, int aTier, String[] aDescription, + RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, ResourceLocation aSound, + SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { + super( + aID, + aName, + aNameRegional, + aTier, + aRecipes.getAmperage(), + aDescription, + aInputSlots, + aOutputSlots, + TextureFactory.of( + TextureFactory.of( + new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_ACTIVE")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_ACTIVE_GLOW"))) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_GLOW"))) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of( + new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_ACTIVE")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_ACTIVE_GLOW"))) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_GLOW"))) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of( + new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_ACTIVE")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_ACTIVE_GLOW"))) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_GLOW"))) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of( + new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_ACTIVE")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_ACTIVE_GLOW"))) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM")), + TextureFactory.builder() + .addIcon( + (new CustomIcon( + "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_GLOW"))) + .glow() + .build())); + this.mTankCapacity = aTankCapacity; + this.mSpecialEffect = aSpecialEffect; + this.mRecipes = aRecipes; + this.mSoundResourceLocation = aSound; + this.progressBarTexture = mRecipes.getFrontend() + .getUIProperties().progressBarTexture; + + // TODO: CHECK + if (aRecipe != null) { + for (int i = 3; i < aRecipe.length; i++) { + if (!(aRecipe[i] instanceof X)) continue; + + // spotless:off + aRecipe[i] = switch ((X) aRecipe[i]) { + case CIRCUIT -> Tier.ELECTRIC[this.mTier].mManagingObject; + case BETTER_CIRCUIT -> Tier.ELECTRIC[this.mTier].mBetterManagingObject; + case HULL -> Tier.ELECTRIC[this.mTier].mHullObject; + case WIRE -> Tier.ELECTRIC[this.mTier].mConductingObject; + case WIRE4 -> Tier.ELECTRIC[this.mTier].mLargerConductingObject; + case STICK_DISTILLATION -> OrePrefixes.stick.get(Materials.Blaze); + + case GLASS -> switch (this.mTier) { + case 0, 1, 2, 3 -> new ItemStack(Blocks.glass, 1, W); + case 4, 5, 6, 7, 8 -> "blockGlass" + VN[aTier]; + default -> "blockGlass" + VN[8]; + }; + + case PLATE -> switch (this.mTier) { + case 0, 1 -> OrePrefixes.plate.get(Materials.Steel); + case 2 -> OrePrefixes.plate.get(Materials.Aluminium); + case 3 -> OrePrefixes.plate.get(Materials.StainlessSteel); + case 4 -> OrePrefixes.plate.get(Materials.Titanium); + case 5 -> OrePrefixes.plate.get(Materials.TungstenSteel); + case 6 -> OrePrefixes.plate.get(Materials.HSSG); + case 7 -> OrePrefixes.plate.get(Materials.HSSE); + default -> OrePrefixes.plate.get(Materials.Neutronium); + }; + + case PIPE -> switch (this.mTier) { + case 0, 1 -> OrePrefixes.pipeMedium.get(Materials.Bronze); + case 2 -> OrePrefixes.pipeMedium.get(Materials.Steel); + case 3 -> OrePrefixes.pipeMedium.get(Materials.StainlessSteel); + case 4 -> OrePrefixes.pipeMedium.get(Materials.Titanium); + case 5 -> OrePrefixes.pipeMedium.get(Materials.TungstenSteel); + case 6 -> OrePrefixes.pipeSmall.get(Materials.Ultimate); + case 7 -> OrePrefixes.pipeMedium.get(Materials.Ultimate); + case 8 -> OrePrefixes.pipeLarge.get(Materials.Ultimate); + default -> OrePrefixes.pipeHuge.get(Materials.Ultimate); + }; + + case COIL_HEATING -> switch (this.mTier) { + case 0, 1 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); + case 2 -> OrePrefixes.wireGt02.get(Materials.Cupronickel); + case 3 -> OrePrefixes.wireGt02.get(Materials.Kanthal); + case 4 -> OrePrefixes.wireGt02.get(Materials.Nichrome); + case 5 -> OrePrefixes.wireGt02.get(Materials.TPV); + case 6 -> OrePrefixes.wireGt02.get(Materials.HSSG); + case 7 -> OrePrefixes.wireGt02.get(Materials.Naquadah); + case 8 -> OrePrefixes.wireGt02.get(Materials.NaquadahAlloy); + case 9 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); + default -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); + }; + + case COIL_HEATING_DOUBLE -> switch (this.mTier) { + case 0, 1 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); + case 2 -> OrePrefixes.wireGt04.get(Materials.Cupronickel); + case 3 -> OrePrefixes.wireGt04.get(Materials.Kanthal); + case 4 -> OrePrefixes.wireGt04.get(Materials.Nichrome); + case 5 -> OrePrefixes.wireGt04.get(Materials.TPV); + case 6 -> OrePrefixes.wireGt04.get(Materials.HSSG); + case 7 -> OrePrefixes.wireGt04.get(Materials.Naquadah); + case 8 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); + case 9 -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); + default -> OrePrefixes.wireGt16.get(Materials.NaquadahAlloy); + }; + + case STICK_MAGNETIC -> switch (this.mTier) { + case 0, 1 -> OrePrefixes.stick.get(Materials.IronMagnetic); + case 2, 3 -> OrePrefixes.stick.get(Materials.SteelMagnetic); + case 4, 5 -> OrePrefixes.stick.get(Materials.NeodymiumMagnetic); + case 6, 7, 8, 9 -> OrePrefixes.stick.get(Materials.SamariumMagnetic); + default -> OrePrefixes.stick.get(Materials.TengamAttuned); + }; + + case STICK_ELECTROMAGNETIC -> switch (this.mTier) { + case 0, 1 -> OrePrefixes.stick.get(Materials.AnyIron); + case 2, 3 -> OrePrefixes.stick.get(Materials.Steel); + case 4 -> OrePrefixes.stick.get(Materials.Neodymium); + default -> OrePrefixes.stick.get(Materials.VanadiumGallium); + }; + + case COIL_ELECTRIC -> switch (this.mTier) { + case 0 -> OrePrefixes.wireGt01.get(Materials.Lead); + case 1 -> OrePrefixes.wireGt02.get(Materials.Tin); + case 2 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); + case 3 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); + case 4 -> OrePrefixes.wireGt08.get(Materials.AnnealedCopper); + case 5 -> OrePrefixes.wireGt16.get(Materials.AnnealedCopper); + case 6 -> OrePrefixes.wireGt04.get(Materials.YttriumBariumCuprate); + case 7 -> OrePrefixes.wireGt08.get(Materials.Iridium); + default -> OrePrefixes.wireGt16.get(Materials.Osmium); + }; + + case ROBOT_ARM -> switch (this.mTier) { + case 0, 1 -> ItemList.Robot_Arm_LV; + case 2 -> ItemList.Robot_Arm_MV; + case 3 -> ItemList.Robot_Arm_HV; + case 4 -> ItemList.Robot_Arm_EV; + case 5 -> ItemList.Robot_Arm_IV; + case 6 -> ItemList.Robot_Arm_LuV; + case 7 -> ItemList.Robot_Arm_ZPM; + case 8 -> ItemList.Robot_Arm_UV; + case 9 -> ItemList.Robot_Arm_UHV; + case 10 -> ItemList.Robot_Arm_UEV; + case 11 -> ItemList.Robot_Arm_UIV; + case 12 -> ItemList.Robot_Arm_UMV; + case 13 -> ItemList.Robot_Arm_UXV; + default -> ItemList.Robot_Arm_MAX; + }; + + case PUMP -> switch (this.mTier) { + case 0, 1 -> ItemList.Electric_Pump_LV; + case 2 -> ItemList.Electric_Pump_MV; + case 3 -> ItemList.Electric_Pump_HV; + case 4 -> ItemList.Electric_Pump_EV; + case 5 -> ItemList.Electric_Pump_IV; + case 6 -> ItemList.Electric_Pump_LuV; + case 7 -> ItemList.Electric_Pump_ZPM; + case 8 -> ItemList.Electric_Pump_UV; + case 9 -> ItemList.Electric_Pump_UHV; + case 10 -> ItemList.Electric_Pump_UEV; + case 11 -> ItemList.Electric_Pump_UIV; + case 12 -> ItemList.Electric_Pump_UMV; + case 13 -> ItemList.Electric_Pump_UXV; + default -> ItemList.Electric_Pump_MAX; + }; + + case MOTOR -> switch (this.mTier) { + case 0, 1 -> ItemList.Electric_Motor_LV; + case 2 -> ItemList.Electric_Motor_MV; + case 3 -> ItemList.Electric_Motor_HV; + case 4 -> ItemList.Electric_Motor_EV; + case 5 -> ItemList.Electric_Motor_IV; + case 6 -> ItemList.Electric_Motor_LuV; + case 7 -> ItemList.Electric_Motor_ZPM; + case 8 -> ItemList.Electric_Motor_UV; + case 9 -> ItemList.Electric_Motor_UHV; + case 10 -> ItemList.Electric_Motor_UEV; + case 11 -> ItemList.Electric_Motor_UIV; + case 12 -> ItemList.Electric_Motor_UMV; + case 13 -> ItemList.Electric_Motor_UXV; + default -> ItemList.Electric_Motor_MAX; + }; + + case PISTON -> switch (this.mTier) { + case 0, 1 -> ItemList.Electric_Piston_LV; + case 2 -> ItemList.Electric_Piston_MV; + case 3 -> ItemList.Electric_Piston_HV; + case 4 -> ItemList.Electric_Piston_EV; + case 5 -> ItemList.Electric_Piston_IV; + case 6 -> ItemList.Electric_Piston_LuV; + case 7 -> ItemList.Electric_Piston_ZPM; + case 8 -> ItemList.Electric_Piston_UV; + case 9 -> ItemList.Electric_Piston_UHV; + case 10 -> ItemList.Electric_Piston_UEV; + case 11 -> ItemList.Electric_Piston_UIV; + case 12 -> ItemList.Electric_Piston_UMV; + case 13 -> ItemList.Electric_Piston_UXV; + default -> ItemList.Electric_Piston_MAX; + }; + + case CONVEYOR -> switch (this.mTier) { + case 0, 1 -> ItemList.Conveyor_Module_LV; + case 2 -> ItemList.Conveyor_Module_MV; + case 3 -> ItemList.Conveyor_Module_HV; + case 4 -> ItemList.Conveyor_Module_EV; + case 5 -> ItemList.Conveyor_Module_IV; + case 6 -> ItemList.Conveyor_Module_LuV; + case 7 -> ItemList.Conveyor_Module_ZPM; + case 8 -> ItemList.Conveyor_Module_UV; + case 9 -> ItemList.Conveyor_Module_UHV; + case 10 -> ItemList.Conveyor_Module_UEV; + case 11 -> ItemList.Conveyor_Module_UIV; + case 12 -> ItemList.Conveyor_Module_UMV; + case 13 -> ItemList.Conveyor_Module_UXV; + default -> ItemList.Conveyor_Module_MAX; + }; + + case EMITTER -> switch (this.mTier) { + case 0, 1 -> ItemList.Emitter_LV; + case 2 -> ItemList.Emitter_MV; + case 3 -> ItemList.Emitter_HV; + case 4 -> ItemList.Emitter_EV; + case 5 -> ItemList.Emitter_IV; + case 6 -> ItemList.Emitter_LuV; + case 7 -> ItemList.Emitter_ZPM; + case 8 -> ItemList.Emitter_UV; + case 9 -> ItemList.Emitter_UHV; + case 10 -> ItemList.Emitter_UEV; + case 11 -> ItemList.Emitter_UIV; + case 12 -> ItemList.Emitter_UMV; + case 13 -> ItemList.Emitter_UXV; + default -> ItemList.Emitter_MAX; + }; + + case SENSOR -> switch (this.mTier) { + case 0, 1 -> ItemList.Sensor_LV; + case 2 -> ItemList.Sensor_MV; + case 3 -> ItemList.Sensor_HV; + case 4 -> ItemList.Sensor_EV; + case 5 -> ItemList.Sensor_IV; + case 6 -> ItemList.Sensor_LuV; + case 7 -> ItemList.Sensor_ZPM; + case 8 -> ItemList.Sensor_UV; + case 9 -> ItemList.Sensor_UHV; + case 10 -> ItemList.Sensor_UEV; + case 11 -> ItemList.Sensor_UIV; + case 12 -> ItemList.Sensor_UMV; + case 13 -> ItemList.Sensor_UXV; + default -> ItemList.Sensor_MAX; + }; + + case FIELD_GENERATOR -> switch (this.mTier) { + case 0, 1 -> ItemList.Field_Generator_LV; + case 2 -> ItemList.Field_Generator_MV; + case 3 -> ItemList.Field_Generator_HV; + case 4 -> ItemList.Field_Generator_EV; + case 5 -> ItemList.Field_Generator_IV; + case 6 -> ItemList.Field_Generator_LuV; + case 7 -> ItemList.Field_Generator_ZPM; + case 8 -> ItemList.Field_Generator_UV; + case 9 -> ItemList.Field_Generator_UHV; + case 10 -> ItemList.Field_Generator_UEV; + case 11 -> ItemList.Field_Generator_UIV; + case 12 -> ItemList.Field_Generator_UMV; + case 13 -> ItemList.Field_Generator_UXV; + default -> ItemList.Field_Generator_MAX; + }; + + case ROTOR -> switch (this.mTier) { + case 0, 1 -> OrePrefixes.rotor.get(Materials.Tin); + case 2 -> OrePrefixes.rotor.get(Materials.Bronze); + case 3 -> OrePrefixes.rotor.get(Materials.Steel); + case 4 -> OrePrefixes.rotor.get(Materials.StainlessSteel); + case 5 -> OrePrefixes.rotor.get(Materials.TungstenSteel); + case 6 -> OrePrefixes.rotor.get(ExternalMaterials.getRhodiumPlatedPalladium()); + case 7 -> OrePrefixes.rotor.get(Materials.Iridium); + default -> OrePrefixes.rotor.get(Materials.Osmium); + }; + + default -> throw new IllegalArgumentException("MISSING TIER MAPPING FOR: " + aRecipe[i] + " AT TIER " + this.mTier); + }; + // spotless:on + } + + if (!GTModHandler.addCraftingRecipe( + getStackForm(1), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.BUFFERED + | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + aRecipe)) { + throw new IllegalArgumentException("INVALID CRAFTING RECIPE FOR: " + getStackForm(1).getDisplayName()); + } + } + } + + /** + * Registers machine with single-line description, auto-scaled fluid tank, and sound specified by SoundResource. + */ + public MTEBasicMachineWithRecipe(int aID, String aName, String aNameRegional, int aTier, String aDescription, + RecipeMap aRecipes, int aInputSlots, int aOutputSlots, boolean usesFluids, SoundResource aSound, + SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { + this( + aID, + aName, + aNameRegional, + aTier, + aDescription, + aRecipes, + aInputSlots, + aOutputSlots, + usesFluids ? getCapacityForTier(aTier) : 0, + aSound.resourceLocation, + aSpecialEffect, + aOverlays, + aRecipe); + } + + /** + * Registers machine with multi-line descriptions, auto-scaled fluid tank, and sound specified by SoundResource. + */ + public MTEBasicMachineWithRecipe(int aID, String aName, String aNameRegional, int aTier, String[] aDescription, + RecipeMap aRecipes, int aInputSlots, int aOutputSlots, boolean usesFluids, SoundResource aSound, + SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { + this( + aID, + aName, + aNameRegional, + aTier, + aDescription, + aRecipes, + aInputSlots, + aOutputSlots, + usesFluids ? getCapacityForTier(aTier) : 0, + aSound.resourceLocation, + aSpecialEffect, + aOverlays, + aRecipe); + } + + /** + * Registers machine with single-line description, specific tank capacity, and sound specified by SoundResource. + */ + public MTEBasicMachineWithRecipe(int aID, String aName, String aNameRegional, int aTier, String aDescription, + RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, SoundResource aSound, + SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { + this( + aID, + aName, + aNameRegional, + aTier, + aDescription, + aRecipes, + aInputSlots, + aOutputSlots, + aTankCapacity, + aSound.resourceLocation, + aSpecialEffect, + aOverlays, + aRecipe); + } + + /** + * Registers machine with multi-line descriptions, specific tank capacity, and sound specified by SoundResource. + */ + public MTEBasicMachineWithRecipe(int aID, String aName, String aNameRegional, int aTier, String[] aDescription, + RecipeMap aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, SoundResource aSound, + SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) { + this( + aID, + aName, + aNameRegional, + aTier, + aDescription, + aRecipes, + aInputSlots, + aOutputSlots, + aTankCapacity, + aSound.resourceLocation, + aSpecialEffect, + aOverlays, + aRecipe); + } + + /** + * For {@link #newMetaEntity}. + */ + public MTEBasicMachineWithRecipe(String aName, int aTier, String[] aDescription, RecipeMap aRecipes, + int aInputSlots, int aOutputSlots, int aTankCapacity, int aAmperage, ITexture[][][] aTextures, + ResourceLocation aSound, SpecialEffects aSpecialEffect) { + super(aName, aTier, aAmperage, aDescription, aTextures, aInputSlots, aOutputSlots); + this.mTankCapacity = aTankCapacity; + this.mSpecialEffect = aSpecialEffect; + this.mRecipes = aRecipes; + this.mSoundResourceLocation = aSound; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBasicMachineWithRecipe( + this.mName, + this.mTier, + this.mDescriptionArray, + this.mRecipes, + this.mInputSlotCount, + this.mOutputItems == null ? 0 : this.mOutputItems.length, + this.mTankCapacity, + this.mAmperage, + this.mTextures, + this.mSoundResourceLocation, + this.mSpecialEffect).setProgressBarTexture(this.progressBarTexture) + .setRecipeCatalystPriority(this.recipeCatalystPriority); + } + + public MTEBasicMachineWithRecipe setProgressBarTexture(FallbackableUITexture progressBarTexture) { + this.progressBarTexture = progressBarTexture; + return this; + } + + public MTEBasicMachineWithRecipe setProgressBarTextureName(String name, UITexture fallback) { + return setProgressBarTexture(GTUITextures.fallbackableProgressbar(name, fallback)); + } + + public MTEBasicMachineWithRecipe setProgressBarTextureName(String name) { + return setProgressBarTextureName(name, GTUITextures.PROGRESSBAR_ARROW); + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (!super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)) return false; + switch (this.mInputSlotCount) { + case 0 -> { + return false; + } + case 1 -> { + if (this.getFillableStack() == null) return this.getRecipeMap() + .containsInput(aStack); + else return this.getRecipeMap() + .findRecipe( + this.getBaseMetaTileEntity(), + this.mLastRecipe, + true, + true, + V[this.mTier], + new FluidStack[] { this.getFillableStack() }, + this.getSpecialSlot(), + appendSelectedCircuit(aStack)) + != null; + } + case 2 -> { + return ((this.getInputAt(0) != null && this.getInputAt(1) != null) + || (this.getInputAt(0) == null && this.getInputAt(1) == null ? this.getRecipeMap() + .containsInput(aStack) + : (this.getRecipeMap() + .containsInput(aStack) + && this.getRecipeMap() + .findRecipe( + this.getBaseMetaTileEntity(), + this.mLastRecipe, + true, + true, + V[this.mTier], + new FluidStack[] { this.getFillableStack() }, + this.getSpecialSlot(), + aIndex == this.getInputSlot() ? appendSelectedCircuit(aStack, this.getInputAt(1)) + : appendSelectedCircuit(this.getInputAt(0), aStack)) + != null))); + } + default -> { + int tID = this.getBaseMetaTileEntity() + .getMetaTileID(); + if (tID >= 211 && tID <= 218 || tID >= 1180 && tID <= 1187 || tID >= 10780 && tID <= 10786) { // assembler + // lv-iv; + // circuit + // asseblers + // lv - + // uv; + // assemblers + // luv-uev + if (GTUtility.isStackValid(aStack)) for (int oreID : OreDictionary.getOreIDs(aStack)) { + if (OreDictionary.getOreName(oreID) + .startsWith("circuit")) return true; + } + } + return this.getRecipeMap() + .containsInput(aStack); + } + } + } + + @Override + public boolean allowSelectCircuit() { + return true; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) { + // noinspection SwitchStatementWithTooFewBranches + switch (this.mSpecialEffect) { + case TOP_SMOKE -> { + if (aBaseMetaTileEntity.getFrontFacing() != UP && aBaseMetaTileEntity.getCoverIDAtSide(UP) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(UP)) { + + new ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D) + .setIdentifier(ParticleFX.SMOKE) + .setPosition( + aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F, + aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F, + aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F) + .setWorld(aBaseMetaTileEntity.getWorld()) + .run(); + } + } + default -> {} + } + } + } + + /** + * Handles {@link Block#randomDisplayTick} driven Special Effects + * + * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + + // noinspection SwitchStatementWithTooFewBranches + switch (this.mSpecialEffect) { + case MAIN_RANDOM_SPARKS -> { + // Random Sparkles at main face + if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) { + + final ForgeDirection mainFacing = this.mMainFacing; + + if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 + && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) { + + final double oX = aBaseMetaTileEntity.getXCoord(); + final double oY = aBaseMetaTileEntity.getYCoord(); + final double oZ = aBaseMetaTileEntity.getZCoord(); + final double offset = 0.02D; + final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; + + final double x, y, z, mX, mZ; + + y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; + + if (mainFacing == ForgeDirection.WEST) { + x = oX - offset; + mX = -.05D; + z = oZ + horizontal; + mZ = 0D; + } else if (mainFacing == ForgeDirection.EAST) { + x = oX + offset; + mX = .05D; + z = oZ + horizontal; + mZ = 0D; + } else if (mainFacing == ForgeDirection.NORTH) { + x = oX + horizontal; + mX = 0D; + z = oZ - offset; + mZ = -.05D; + } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) + { + x = oX + horizontal; + mX = 0D; + z = oZ + offset; + mZ = .05D; + } + + ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ) + .setPosition(x, y, z) + .setWorld(getBaseMetaTileEntity().getWorld()); + particleEventBuilder.setIdentifier(ParticleFX.LAVA) + .run(); + } + } + } + default -> {} + } + } + + @Override + public RecipeMap getRecipeMap() { + return this.mRecipes; + } + + @Override + public int getRecipeCatalystPriority() { + return recipeCatalystPriority; + } + + public MTEBasicMachineWithRecipe setRecipeCatalystPriority(int recipeCatalystPriority) { + this.recipeCatalystPriority = recipeCatalystPriority; + return this; + } + + @Override + public int getCapacity() { + return this.mTankCapacity; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1 && this.mSoundResourceLocation != null + && GTUtility.isStringValid(this.mSoundResourceLocation.getResourceDomain()) + && GTUtility.isStringValid(this.mSoundResourceLocation.getResourcePath())) + GTUtility.doSoundAtClient(this.mSoundResourceLocation, 100, 1.0F, aX, aY, aZ); + } + + @Override + public void startProcess() { + BaseMetaTileEntity myMetaTileEntity = ((BaseMetaTileEntity) this.getBaseMetaTileEntity()); + // Added to throttle sounds. To reduce lag, this is on the server side so BlockUpdate packets aren't sent. + if (myMetaTileEntity.mTickTimer > (myMetaTileEntity.mLastSoundTick + ticksBetweenSounds)) { + if (this.mSoundResourceLocation != null + && GTUtility.isStringValid(this.mSoundResourceLocation.getResourceDomain()) + && GTUtility.isStringValid(this.mSoundResourceLocation.getResourcePath())) this.sendLoopStart((byte) 1); + // Does not have overflow protection, but they are longs. + myMetaTileEntity.mLastSoundTick = myMetaTileEntity.mTickTimer; + } + } + + @Override + protected BasicUIProperties getUIProperties() { + return super.getUIProperties().toBuilder() + .progressBarTexture(progressBarTexture) + .build(); + } + + public enum X { + PUMP, + WIRE, + WIRE4, + HULL, + PIPE, + GLASS, + PLATE, + MOTOR, + ROTOR, + SENSOR, + PISTON, + CIRCUIT, + EMITTER, + CONVEYOR, + ROBOT_ARM, + COIL_HEATING, + COIL_ELECTRIC, + STICK_MAGNETIC, + STICK_DISTILLATION, + BETTER_CIRCUIT, + FIELD_GENERATOR, + COIL_HEATING_DOUBLE, + STICK_ELECTROMAGNETIC + } + + /** + * Special Effects + */ + public enum SpecialEffects { + + NONE, + TOP_SMOKE, + MAIN_RANDOM_SPARKS; + + static final SpecialEffects[] VALID_SPECIAL_EFFECTS = { NONE, TOP_SMOKE, MAIN_RANDOM_SPARKS }; + + static SpecialEffects fromId(int id) { + return id >= 0 && id < VALID_SPECIAL_EFFECTS.length ? VALID_SPECIAL_EFFECTS[id] : NONE; + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicTank.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicTank.java new file mode 100644 index 0000000000..003b8c893e --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicTank.java @@ -0,0 +1,328 @@ +package gregtech.api.metatileentity.implementations; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; + +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTUtility; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the main construct for my generic Tanks. Filling and emptying behavior have to be implemented manually + */ +public abstract class MTEBasicTank extends MTETieredMachineBlock implements IAddUIWidgets { + + public FluidStack mFluid; + // Due to class initializing order, getCapacity might not work properly at this time. + // So we pass supplier instead of current value here. + protected final FluidStackTank fluidTank = new FluidStackTank( + () -> mFluid, + fluidStack -> mFluid = fluidStack, + this::getRealCapacity); + + /** + * @param aInvSlotCount should be 3 + */ + public MTEBasicTank(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, String aDescription, + ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEBasicTank(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String[] aDescription, ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEBasicTank(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEBasicTank(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex != getStackDisplaySlot(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid")); + } + + public abstract boolean doesFillContainers(); + + public abstract boolean doesEmptyContainers(); + + public abstract boolean canTankBeFilled(); + + public abstract boolean canTankBeEmptied(); + + public abstract boolean displaysItemStack(); + + /** + * @return If fluid amount is shown on FluidDisplayItem + */ + public abstract boolean displaysStackSize(); + + public int getInputSlot() { + return 0; + } + + public int getOutputSlot() { + return 1; + } + + public int getStackDisplaySlot() { + return 2; + } + + public boolean isFluidInputAllowed(FluidStack aFluid) { + return true; + } + + public boolean isFluidChangingAllowed() { + return true; + } + + public FluidStack getFillableStack() { + return mFluid; + } + + public FluidStack setFillableStack(FluidStack aFluid) { + mFluid = aFluid; + return mFluid; + } + + /** + * If you override this and change the field returned, be sure to override {@link #isDrainableStackSeparate()} as + * well! + */ + public FluidStack getDrainableStack() { + return mFluid; + } + + public FluidStack setDrainableStack(FluidStack aFluid) { + mFluid = aFluid; + return mFluid; + } + + public boolean isDrainableStackSeparate() { + return false; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (isFluidChangingAllowed() && getFillableStack() != null && getFillableStack().amount <= 0) { + setFillableStack(null); + } + + final int inputSlot = getInputSlot(); + + if (doesEmptyContainers()) { + FluidStack tFluid = GTUtility.getFluidForFilledItem(mInventory[inputSlot], true); + if (tFluid != null && isFluidInputAllowed(tFluid)) { + if (getFillableStack() == null) { + if (isFluidInputAllowed(tFluid) && tFluid.amount <= getCapacity()) { + if (aBaseMetaTileEntity.addStackToSlot( + getOutputSlot(), + GTUtility.getContainerForFilledItem(mInventory[inputSlot], true), + 1)) { + setFillableStack(tFluid.copy()); + this.onEmptyingContainerWhenEmpty(); + aBaseMetaTileEntity.decrStackSize(inputSlot, 1); + } + } + } else { + if (tFluid.isFluidEqual(getFillableStack()) + && ((long) tFluid.amount + getFillableStack().amount) <= (long) getCapacity()) { + if (aBaseMetaTileEntity.addStackToSlot( + getOutputSlot(), + GTUtility.getContainerForFilledItem(mInventory[inputSlot], true), + 1)) { + getFillableStack().amount += tFluid.amount; + aBaseMetaTileEntity.decrStackSize(inputSlot, 1); + } + } + } + } + } + + if (doesFillContainers()) { + ItemStack tOutput = GTUtility + .fillFluidContainer(getDrainableStack(), mInventory[inputSlot], false, true); + if (tOutput != null && aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tOutput, 1)) { + FluidStack tFluid = GTUtility.getFluidForFilledItem(tOutput, true); + aBaseMetaTileEntity.decrStackSize(inputSlot, 1); + if (tFluid != null) getDrainableStack().amount -= tFluid.amount; + if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) setDrainableStack(null); + } + } + } + } + + @Override + public FluidStack getFluid() { + return getDrainableStack(); + } + + @Override + public int getFluidAmount() { + return getDrainableStack() != null ? getDrainableStack().amount : 0; + } + + @Override + public int fill(FluidStack aFluid, boolean doFill) { + if (aFluid == null || aFluid.getFluid() + .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0; + + if (getFillableStack() == null || getFillableStack().getFluid() + .getID() <= 0) { + if (aFluid.amount <= getCapacity()) { + if (doFill) { + setFillableStack(aFluid.copy()); + getBaseMetaTileEntity().markDirty(); + } + return aFluid.amount; + } + if (doFill) { + setFillableStack(aFluid.copy()); + getFillableStack().amount = getCapacity(); + getBaseMetaTileEntity().markDirty(); + } + return getCapacity(); + } + + if (!getFillableStack().isFluidEqual(aFluid)) return 0; + + int space = getCapacity() - getFillableStack().amount; + if (aFluid.amount <= space) { + if (doFill) { + getFillableStack().amount += aFluid.amount; + getBaseMetaTileEntity().markDirty(); + } + return aFluid.amount; + } + if (doFill) getFillableStack().amount = getCapacity(); + return space; + } + + @Override + public FluidStack drain(int maxDrain, boolean doDrain) { + if (getDrainableStack() == null || !canTankBeEmptied()) return null; + if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) { + setDrainableStack(null); + getBaseMetaTileEntity().markDirty(); + return null; + } + + int used = maxDrain; + if (getDrainableStack().amount < used) used = getDrainableStack().amount; + + if (doDrain) { + getDrainableStack().amount -= used; + getBaseMetaTileEntity().markDirty(); + } + + FluidStack drained = getDrainableStack().copy(); + drained.amount = used; + + if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) { + setDrainableStack(null); + getBaseMetaTileEntity().markDirty(); + } + + return drained; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection side) { + if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {}; + if (isDrainableStackSeparate()) { + return new FluidTankInfo[] { new FluidTankInfo(getFillableStack(), getCapacity()), + new FluidTankInfo(getDrainableStack(), getCapacity()) }; + } else { + return new FluidTankInfo[] { new FluidTankInfo(this) }; + } + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return aIndex == getOutputSlot(); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return aIndex == getInputSlot(); + } + + protected void onEmptyingContainerWhenEmpty() { + // Do nothing + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setPos(7, 16) + .setSize(71, 45)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_GAUGE) + .setPos(79, 34) + .setSize(18, 18)) + .widget( + new SlotWidget(inventoryHandler, getInputSlot()) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_IN) + .setPos(79, 16)) + .widget( + new SlotWidget(inventoryHandler, getOutputSlot()).setAccess(true, false) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_OUT) + .setPos(79, 52)) + .widget( + createFluidSlot().setBackground(GTUITextures.TRANSPARENT) + .setPos(58, 41)) + .widget( + new TextWidget("Liquid Amount").setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(10, 20)) + .widget( + new TextWidget().setStringSupplier(() -> numberFormat.format(mFluid != null ? mFluid.amount : 0)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(10, 30)); + } + + protected FluidSlotWidget createFluidSlot() { + return new FluidSlotWidget(fluidTank); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBuffer.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBuffer.java new file mode 100644 index 0000000000..c8b4e6bfca --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBuffer.java @@ -0,0 +1,559 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_DOWN; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_DOWN_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_LEFT; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_LEFT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_RIGHT; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_RIGHT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP; +import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.IntStream; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; + +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GT_TooltipDataCache; + +public abstract class MTEBuffer extends MTETieredMachineBlock implements IAddUIWidgets { + + private static final int OUTPUT_INDEX = 0; + private static final int ARROW_RIGHT_INDEX = 1; + private static final int ARROW_DOWN_INDEX = 2; + private static final int ARROW_LEFT_INDEX = 3; + private static final int ARROW_UP_INDEX = 4; + private static final int FRONT_INDEX = 5; + + private static final String EMIT_ENERGY_TOOLTIP = "GT5U.machines.emit_energy.tooltip"; + private static final String EMIT_REDSTONE_IF_FULL_TOOLTIP = "GT5U.machines.emit_redstone_if_full.tooltip"; + private static final String INVERT_REDSTONE_TOOLTIP = "GT5U.machines.invert_redstone.tooltip"; + private static final String STOCKING_MODE_TOOLTIP = "GT5U.machines.buffer_stocking_mode.tooltip"; + private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip"; + private static final int BUTTON_SIZE = 18; + + public int mMaxStackSize = 64; + public static int MAX = 8; + public boolean bOutput = false, bRedstoneIfFull = false, bInvert = false, bStockingMode = false, + bSortStacks = false; + public int mSuccess = 0, mTargetStackSize = 0; + private int uiButtonCount = 0; + + public MTEBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, String aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public MTEBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, String[] aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public MTEBuffer(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEBuffer(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[ForgeDirection.VALID_DIRECTIONS.length][17][]; + ITexture tIcon = getOverlayIcon(); + ITexture tOut = TextureFactory.of(OVERLAY_PIPE_OUT); + ITexture tUp = TextureFactory.of( + TextureFactory.of(ARROW_UP), + TextureFactory.builder() + .addIcon(ARROW_UP_GLOW) + .glow() + .build()); + ITexture tDown = TextureFactory.of( + TextureFactory.of(ARROW_DOWN), + TextureFactory.builder() + .addIcon(ARROW_DOWN_GLOW) + .glow() + .build()); + ITexture tLeft = TextureFactory.of( + TextureFactory.of(ARROW_LEFT), + TextureFactory.builder() + .addIcon(ARROW_LEFT_GLOW) + .glow() + .build()); + ITexture tRight = TextureFactory.of( + TextureFactory.of(ARROW_RIGHT), + TextureFactory.builder() + .addIcon(ARROW_RIGHT_GLOW) + .glow() + .build()); + for (int i = 0; i < rTextures[0].length; i++) { + rTextures[OUTPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tOut }; + rTextures[ARROW_RIGHT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tRight, tIcon }; + rTextures[ARROW_DOWN_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tDown, tIcon }; + rTextures[ARROW_LEFT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tLeft, tIcon }; + rTextures[ARROW_UP_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tUp, tIcon }; + rTextures[FRONT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tIcon }; + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + colorIndex = colorIndex + 1; + if (sideDirection == facingDirection) return mTextures[FRONT_INDEX][colorIndex]; + if (sideDirection.getOpposite() == facingDirection) return mTextures[OUTPUT_INDEX][colorIndex]; + switch (facingDirection) { + case DOWN -> { + return mTextures[ARROW_UP_INDEX][colorIndex]; // ARROW_UP + } + case UP -> { + return mTextures[ARROW_DOWN_INDEX][colorIndex]; // ARROW_DOWN + } + case NORTH -> { + switch (sideDirection) { + case DOWN, UP -> { + return mTextures[ARROW_DOWN_INDEX][colorIndex]; // ARROW_DOWN + } + case WEST -> { + return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT + } + case EAST -> { + return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT + } + default -> {} + } + } + case SOUTH -> { + switch (sideDirection) { + case DOWN, UP -> { + return mTextures[ARROW_UP_INDEX][colorIndex]; // ARROW_UP + } + case WEST -> { + return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT + } + case EAST -> { + return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT + } + default -> {} + } + } + case WEST -> { + switch (sideDirection) { + case UP, SOUTH -> { + return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT + } + case DOWN, NORTH -> { + return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT + } + default -> {} + } + } + case EAST -> { + switch (sideDirection) { + case UP, SOUTH -> { + return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT + } + case DOWN, NORTH -> { + return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT + } + default -> {} + } + } + default -> {} + } + return mTextures[FRONT_INDEX][colorIndex]; + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex < mInventory.length - 1; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return !isOutputFacing(side); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return getBaseMetaTileEntity().getBackFacing() == side; + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 512L; + } + + @Override + public long maxEUStore() { + return 512L + V[mTier] * 50L; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUOutput() { + // Return full value if we're an item and don't exist in the world for tooltip purposes + return getBaseMetaTileEntity().getWorld() == null || bOutput ? V[mTier] : 0L; + } + + @Override + public long maxAmperesIn() { + return 2; + } + + @Override + public long maxAmperesOut() { + return 2; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + public abstract ITexture getOverlayIcon(); + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setBoolean("bInvert", bInvert); + aNBT.setBoolean("bOutput", bOutput); + aNBT.setBoolean("bRedstoneIfFull", bRedstoneIfFull); + aNBT.setBoolean("bStockingMode", bStockingMode); + aNBT.setInteger("mTargetStackSize", mTargetStackSize); + aNBT.setBoolean("bSortStacks", bSortStacks); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + bInvert = aNBT.getBoolean("bInvert"); + bOutput = aNBT.getBoolean("bOutput"); + bRedstoneIfFull = aNBT.getBoolean("bRedstoneIfFull"); + bSortStacks = aNBT.getBoolean("bSortStacks"); + bStockingMode = aNBT.getBoolean("bStockingMode"); + mTargetStackSize = aNBT.getInteger("mTargetStackSize"); + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + super.setItemNBT(aNBT); + if (mTargetStackSize > 0) aNBT.setInteger("mTargetStackSize", mTargetStackSize); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (side == getBaseMetaTileEntity().getBackFacing()) { + + mTargetStackSize = (byte) ((mTargetStackSize + (aPlayer.isSneaking() ? -1 : 1)) % 65); + if (mTargetStackSize < 0) { + mTargetStackSize = mMaxStackSize; + } + if (mTargetStackSize == 0) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("098", "Do not regulate Item Stack Size")); + } else { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("099", "Regulate Item Stack Size to: ") + mTargetStackSize); + } + } + } + + @Override + public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, + float aX, float aY, float aZ) { + wrenchingSide = wrenchingSide.getOpposite(); + if (getBaseMetaTileEntity().isValidFacing(wrenchingSide)) { + getBaseMetaTileEntity().setFrontFacing(wrenchingSide); + return true; + } + return false; + } + + protected void handleRedstoneOutput(IGregTechTileEntity aBaseMetaTileEntity) { + int redstoneOutput = getRedstoneOutput(); + Arrays.stream(ForgeDirection.VALID_DIRECTIONS) + .forEach(side -> aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) redstoneOutput)); + } + + protected int getRedstoneOutput() { + return (!bRedstoneIfFull || (bInvert ^ hasEmptySlots())) ? 0 : 15; + } + + private boolean hasEmptySlots() { + return IntStream.range(0, mInventory.length) + .anyMatch(i -> isValidSlot(i) && mInventory[i] == null); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + if (aBaseMetaTileEntity.isAllowedToWork() && aBaseMetaTileEntity.isServerSide() + && (aBaseMetaTileEntity.hasWorkJustBeenEnabled() || aBaseMetaTileEntity.hasInventoryBeenModified() + || aTimer % 200 == 0 + || mSuccess > 0)) { + mSuccess--; + updateSlots(); + moveItems(aBaseMetaTileEntity, aTimer); + handleRedstoneOutput(aBaseMetaTileEntity); + } + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) + aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 0); + } + + protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + moveItems(aBaseMetaTileEntity, aTimer, 1); + } + + protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long ignoredTimer, int stacks) { + int tCost; + if (bStockingMode) tCost = GTUtility.moveMultipleItemStacks( + aBaseMetaTileEntity, + aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getBackFacing()), + aBaseMetaTileEntity.getBackFacing(), + aBaseMetaTileEntity.getFrontFacing(), + null, + false, + mTargetStackSize == 0 ? 64 : (byte) mTargetStackSize, + mTargetStackSize == 0 ? 1 : (byte) mTargetStackSize, + (byte) 64, + (byte) 1, + stacks); + else tCost = GTUtility.moveMultipleItemStacks( + aBaseMetaTileEntity, + aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getBackFacing()), + aBaseMetaTileEntity.getBackFacing(), + aBaseMetaTileEntity.getFrontFacing(), + null, + false, + (byte) 64, + (byte) 1, + mTargetStackSize == 0 ? 64 : (byte) mTargetStackSize, + mTargetStackSize == 0 ? 1 : (byte) mTargetStackSize, + stacks); + + if (tCost > 0 || aBaseMetaTileEntity.hasInventoryBeenModified()) { + mSuccess = 50; + } + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return true; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side != aBaseMetaTileEntity.getBackFacing(); + } + + @Override + public boolean allowGeneralRedstoneOutput() { + return true; + } + + public void updateSlots() { + for (int i = 0; i < mInventory.length; i++) + if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; + if (bSortStacks) fillStacksIntoFirstSlots(); + } + + protected void fillStacksIntoFirstSlots() { + HashMap slots = new HashMap<>(mInventory.length); + HashMap stacks = new HashMap<>(mInventory.length); + List order = new ArrayList<>(mInventory.length); + List validSlots = new ArrayList<>(mInventory.length); + for (int i = 0; i < mInventory.length - 1; i++) { + if (!isValidSlot(i)) continue; + validSlots.add(i); + ItemStack s = mInventory[i]; + if (s == null) continue; + GTUtility.ItemId sID = GTUtility.ItemId.createNoCopy(s); + slots.merge(sID, s.stackSize, Integer::sum); + if (!stacks.containsKey(sID)) stacks.put(sID, s); + order.add(sID); + mInventory[i] = null; + } + int slotindex = 0; + for (GTUtility.ItemId sID : order) { + int toSet = slots.get(sID); + if (toSet == 0) continue; + int slot = validSlots.get(slotindex); + slotindex++; + mInventory[slot] = stacks.get(sID) + .copy(); + toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); + mInventory[slot].stackSize = toSet; + slots.merge(sID, toSet, (a, b) -> a - b); + } + } + + @Override + public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, + EntityPlayer entityPlayer, float aX, float aY, float aZ) { + if (entityPlayer.isSneaking()) { + // I was so proud of all this but I literally just copied code from OutputBus + bSortStacks = !bSortStacks; + GTUtility.sendChatToPlayer( + entityPlayer, + GTUtility.trans("200", "Sort mode: ") + + (bSortStacks ? GTUtility.trans("088", "Enabled") : GTUtility.trans("087", "Disabled"))); + return true; + } + return super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); + } + + protected void addEmitEnergyButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bOutput, + val -> bOutput = val, + GTUITextures.OVERLAY_BUTTON_EMIT_ENERGY, + this::getEmitEnergyButtonTooltip)); + } + + private GT_TooltipDataCache.TooltipData getEmitEnergyButtonTooltip() { + return mTooltipCache.getData( + EMIT_ENERGY_TOOLTIP, + EnumChatFormatting.GREEN + GTUtility.formatNumbers(V[mTier]) + + " (" + + GTUtility.getColoredTierNameFromTier(mTier) + + EnumChatFormatting.GREEN + + ")" + + EnumChatFormatting.GRAY, + maxAmperesOut()); + } + + protected void addEmitRedstoneIfFullButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bRedstoneIfFull, + val -> bRedstoneIfFull = val, + GTUITextures.OVERLAY_BUTTON_EMIT_REDSTONE, + this::getEmitRedstoneIfFullButtonTooltip).setUpdateTooltipEveryTick(true)); + } + + private GT_TooltipDataCache.TooltipData getEmitRedstoneIfFullButtonTooltip() { + return mTooltipCache.getUncachedTooltipData( + EMIT_REDSTONE_IF_FULL_TOOLTIP, + StatCollector.translateToLocal(hasEmptySlots() ? "gui.yes" : "gui.no"), + getRedstoneOutput()); + } + + protected void addInvertRedstoneButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bInvert, + val -> bInvert = val, + GTUITextures.OVERLAY_BUTTON_INVERT_REDSTONE, + () -> mTooltipCache.getData(INVERT_REDSTONE_TOOLTIP))); + } + + protected void addStockingModeButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bStockingMode, + val -> bStockingMode = val, + GTUITextures.OVERLAY_BUTTON_STOCKING_MODE, + () -> mTooltipCache.getData(STOCKING_MODE_TOOLTIP))); + } + + protected void addSortStacksButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bSortStacks, + val -> bSortStacks = val, + GTUITextures.OVERLAY_BUTTON_SORTING_MODE, + () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP))); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + buildContext.addCloseListener(() -> uiButtonCount = 0); + addEmitEnergyButton(builder); + } + + protected Widget createToggleButton(Supplier getter, Consumer setter, UITexture picture, + Supplier tooltipDataSupplier) { + return new CycleButtonWidget().setToggle(getter, setter) + .setStaticTexture(picture) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62) + .setSize(BUTTON_SIZE, BUTTON_SIZE) + .setGTTooltip(tooltipDataSupplier); + } + + protected void addInventorySlots(ModularWindow.Builder builder) { + builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 9) + .endAtSlot(26) + .build() + .setPos(7, 4)); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTECable.java b/src/main/java/gregtech/api/metatileentity/implementations/MTECable.java new file mode 100644 index 0000000000..b56769c59b --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTECable.java @@ -0,0 +1,649 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Mods.GalacticraftCore; +import static net.minecraftforge.common.util.ForgeDirection.DOWN; +import static net.minecraftforge.common.util.ForgeDirection.EAST; +import static net.minecraftforge.common.util.ForgeDirection.NORTH; +import static net.minecraftforge.common.util.ForgeDirection.SOUTH; +import static net.minecraftforge.common.util.ForgeDirection.UP; +import static net.minecraftforge.common.util.ForgeDirection.WEST; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import cofh.api.energy.IEnergyReceiver; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Materials; +import gregtech.api.enums.TextureSet; +import gregtech.api.enums.Textures; +import gregtech.api.graphs.Node; +import gregtech.api.graphs.NodeList; +import gregtech.api.graphs.PowerNode; +import gregtech.api.graphs.PowerNodes; +import gregtech.api.graphs.consumers.ConsumerNode; +import gregtech.api.graphs.paths.PowerNodePath; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IConnectable; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.metatileentity.IMetaTileEntityCable; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IEnergyConnected; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.interfaces.PowerLogicHost; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.MetaPipeEntity; +import gregtech.api.objects.GTCoverNone; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTGCCompat; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.GTClient; +import gregtech.common.covers.CoverInfo; +import gregtech.common.covers.CoverSolarPanel; +import ic2.api.energy.EnergyNet; +import ic2.api.energy.tile.IEnergyEmitter; +import ic2.api.energy.tile.IEnergySink; +import ic2.api.energy.tile.IEnergySource; +import ic2.api.energy.tile.IEnergyTile; +import ic2.api.reactor.IReactorChamber; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTECable extends MetaPipeEntity implements IMetaTileEntityCable { + + public final float mThickNess; + public final Materials mMaterial; + public final long mCableLossPerMeter, mAmperage, mVoltage; + public final boolean mInsulated, mCanShock; + + public int mTransferredAmperage = 0; + + public MTECable(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, + long aCableLossPerMeter, long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) { + super(aID, aName, aNameRegional, 0); + mThickNess = aThickNess; + mMaterial = aMaterial; + mAmperage = aAmperage; + mVoltage = aVoltage; + mInsulated = aInsulated; + mCanShock = aCanShock; + mCableLossPerMeter = aCableLossPerMeter; + } + + public MTECable(String aName, float aThickNess, Materials aMaterial, long aCableLossPerMeter, long aAmperage, + long aVoltage, boolean aInsulated, boolean aCanShock) { + super(aName, 0); + mThickNess = aThickNess; + mMaterial = aMaterial; + mAmperage = aAmperage; + mVoltage = aVoltage; + mInsulated = aInsulated; + mCanShock = aCanShock; + mCableLossPerMeter = aCableLossPerMeter; + } + + @Override + public byte getTileEntityBaseType() { + return (byte) (mInsulated ? 9 : 8); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTECable( + mName, + mThickNess, + mMaterial, + mCableLossPerMeter, + mAmperage, + mVoltage, + mInsulated, + mCanShock); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + int facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (!mInsulated) return new ITexture[] { TextureFactory + .of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], Dyes.getModulation(colorIndex, mMaterial.mRGBa)) }; + if (active) { + float tThickNess = getThickNess(); + if (tThickNess < 0.124F) return new ITexture[] { TextureFactory + .of(Textures.BlockIcons.INSULATION_FULL, Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + if (tThickNess < 0.374F) // 0.375 x1 + return new ITexture[] { + TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), + TextureFactory.of( + Textures.BlockIcons.INSULATION_TINY, + Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + if (tThickNess < 0.499F) // 0.500 x2 + return new ITexture[] { + TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), + TextureFactory.of( + Textures.BlockIcons.INSULATION_SMALL, + Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + if (tThickNess < 0.624F) // 0.625 x4 + return new ITexture[] { + TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), + TextureFactory.of( + Textures.BlockIcons.INSULATION_MEDIUM, + Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + if (tThickNess < 0.749F) // 0.750 x8 + return new ITexture[] { + TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), + TextureFactory.of( + Textures.BlockIcons.INSULATION_MEDIUM_PLUS, + Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + if (tThickNess < 0.874F) // 0.825 x12 + return new ITexture[] { + TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), + TextureFactory.of( + Textures.BlockIcons.INSULATION_LARGE, + Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + return new ITexture[] { + TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa), + TextureFactory.of( + Textures.BlockIcons.INSULATION_HUGE, + Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + } + return new ITexture[] { TextureFactory + .of(Textures.BlockIcons.INSULATION_FULL, Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) }; + } + + @Override + public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity aEntity) { + + if (!mCanShock) return; + + final BaseMetaPipeEntity baseEntity = (BaseMetaPipeEntity) getBaseMetaTileEntity(); + + if (!(aEntity instanceof EntityLivingBase livingEntity)) return; + if (!(baseEntity.getNodePath() instanceof PowerNodePath powerPath)) return; + + if (isCoverOnSide(baseEntity, livingEntity)) return; + if ((baseEntity.mConnections & IConnectable.HAS_HARDENEDFOAM) == 1) return; + + final long amperage = powerPath.getAmperage(); + final long voltage = powerPath.getVoltage(); + + if (amperage == 0L) return; + + GTUtility.applyElectricityDamage(livingEntity, voltage, amperage); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return false; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public final boolean renderInside(ForgeDirection side) { + return false; + } + + @Override + public int getProgresstime() { + return (int) mTransferredAmperage * 64; + } + + @Override + public int maxProgresstime() { + return (int) mAmperage * 64; + } + + @Override + public long injectEnergyUnits(ForgeDirection side, long voltage, long amperage) { + if (!isConnectedAtSide(side) && side != ForgeDirection.UNKNOWN) return 0; + if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) + .letsEnergyIn()) return 0; + return transferElectricity(side, voltage, amperage, (HashSet) null); + } + + @Override + @Deprecated + public long transferElectricity(ForgeDirection side, long aVoltage, long aAmperage, + ArrayList aAlreadyPassedTileEntityList) { + return transferElectricity(side, aVoltage, aAmperage, new HashSet<>(aAlreadyPassedTileEntityList)); + } + + @Override + public long transferElectricity(ForgeDirection side, long voltage, long amperage, + HashSet alreadyPassedSet) { + if (!getBaseMetaTileEntity().isServerSide() || !isConnectedAtSide(side) && side != ForgeDirection.UNKNOWN) + return 0; + final BaseMetaPipeEntity tBase = (BaseMetaPipeEntity) getBaseMetaTileEntity(); + if (!(tBase.getNode() instanceof PowerNode tNode)) return 0; + int tPlace = 0; + final Node[] tToPower = new Node[tNode.mConsumers.size()]; + if (tNode.mHadVoltage) { + for (ConsumerNode consumer : tNode.mConsumers) { + if (consumer.needsEnergy()) tToPower[tPlace++] = consumer; + } + } else { + tNode.mHadVoltage = true; + for (ConsumerNode consumer : tNode.mConsumers) { + tToPower[tPlace++] = consumer; + } + } + return PowerNodes.powerNode(tNode, null, new NodeList(tToPower), (int) voltage, (int) amperage); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aTick % 20 == 0 && aBaseMetaTileEntity.isServerSide() + && (!GTMod.gregtechproxy.gt6Cable || mCheckConnections)) { + checkConnections(); + } + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + if (GTMod.gregtechproxy.gt6Cable + && GTModHandler.damageOrDechargeItem(aPlayer.inventory.getCurrentItem(), 1, 500, aPlayer)) { + if (isConnectedAtSide(wrenchingSide)) { + disconnect(wrenchingSide); + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("215", "Disconnected")); + } else if (!GTMod.gregtechproxy.costlyCableConnection) { + if (connect(wrenchingSide) > 0) + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("214", "Connected")); + } + return true; + } + return false; + } + + @Override + public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + if (GTMod.gregtechproxy.gt6Cable + && GTModHandler.damageOrDechargeItem(aPlayer.inventory.getCurrentItem(), 1, 500, aPlayer)) { + if (isConnectedAtSide(wrenchingSide)) { + disconnect(wrenchingSide); + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("215", "Disconnected")); + } else if (!GTMod.gregtechproxy.costlyCableConnection || GTModHandler.consumeSolderingMaterial(aPlayer)) { + if (connect(wrenchingSide) > 0) + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("214", "Connected")); + } + return true; + } + return false; + } + + @Override + public boolean letsIn(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return coverBehavior.letsEnergyIn(side, aCoverID, aCoverVariable, aTileEntity); + } + + @Override + public boolean letsOut(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return coverBehavior.letsEnergyOut(side, aCoverID, aCoverVariable, aTileEntity); + } + + @Override + public boolean letsIn(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return coverBehavior.letsEnergyIn(side, aCoverID, aCoverVariable, aTileEntity); + } + + @Override + public boolean letsOut(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return coverBehavior.letsEnergyOut(side, aCoverID, aCoverVariable, aTileEntity); + } + + @Override + public boolean letsIn(CoverInfo coverInfo) { + return coverInfo.letsEnergyIn(); + } + + @Override + public boolean letsOut(CoverInfo coverInfo) { + return coverInfo.letsEnergyOut(); + } + + @Override + public boolean canConnect(ForgeDirection side, TileEntity tileEntity) { + final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity(); + final CoverBehaviorBase coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(side); + final ForgeDirection oppositeSide = side.getOpposite(); + + // GT Machine handling + if ((tileEntity instanceof PowerLogicHost powerLogic && powerLogic.getPowerLogic(oppositeSide) != null) + || ((tileEntity instanceof IEnergyConnected energyConnected) + && (energyConnected.inputEnergyFrom(oppositeSide, false) + || energyConnected.outputsEnergyTo(oppositeSide, false)))) + return true; + + // Solar Panel Compat + if (coverBehavior instanceof CoverSolarPanel) return true; + + // ((tIsGregTechTileEntity && tIsTileEntityCable) && (tAlwaysLookConnected || tLetEnergyIn || tLetEnergyOut) ) + // --> Not needed + if (GalacticraftCore.isModLoaded() && GTGCCompat.canConnect(tileEntity, oppositeSide)) return true; + + // AE2-p2p Compat + if (tileEntity instanceof appeng.tile.powersink.IC2 ic2sink + && ic2sink.acceptsEnergyFrom((TileEntity) baseMetaTile, oppositeSide)) return true; + + // IC2 Compat + { + final TileEntity ic2Energy; + + if (tileEntity instanceof IReactorChamber) + ic2Energy = (TileEntity) ((IReactorChamber) tileEntity).getReactor(); + else ic2Energy = (tileEntity == null || tileEntity instanceof IEnergyTile || EnergyNet.instance == null) + ? tileEntity + : EnergyNet.instance + .getTileEntity(tileEntity.getWorldObj(), tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + + // IC2 Sink Compat + if ((ic2Energy instanceof IEnergySink) + && ((IEnergySink) ic2Energy).acceptsEnergyFrom((TileEntity) baseMetaTile, oppositeSide)) return true; + + // IC2 Source Compat + if (GTMod.gregtechproxy.ic2EnergySourceCompat && (ic2Energy instanceof IEnergySource)) { + if (((IEnergySource) ic2Energy).emitsEnergyTo((TileEntity) baseMetaTile, oppositeSide)) { + return true; + } + } + } + // RF Output Compat + if (GregTechAPI.mOutputRF && tileEntity instanceof IEnergyReceiver + && ((IEnergyReceiver) tileEntity).canConnectEnergy(oppositeSide)) return true; + + // RF Input Compat + return GregTechAPI.mInputRF && (tileEntity instanceof IEnergyEmitter + && ((IEnergyEmitter) tileEntity).emitsEnergyTo((TileEntity) baseMetaTile, oppositeSide)); + } + + @Override + public boolean getGT6StyleConnection() { + // Yes if GT6 Cables are enabled + return GTMod.gregtechproxy.gt6Cable; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public String[] getDescription() { + return new String[] { + StatCollector.translateToLocal("GT5U.item.cable.max_voltage") + ": %%%" + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mVoltage) + + " (" + + GTUtility.getColoredTierNameFromVoltage(mVoltage) + + EnumChatFormatting.GREEN + + ")" + + EnumChatFormatting.GRAY, + StatCollector.translateToLocal("GT5U.item.cable.max_amperage") + ": %%%" + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mAmperage) + + EnumChatFormatting.GRAY, + StatCollector.translateToLocal("GT5U.item.cable.loss") + ": %%%" + + EnumChatFormatting.RED + + GTUtility.formatNumbers(mCableLossPerMeter) + + EnumChatFormatting.GRAY + + "%%% " + + StatCollector.translateToLocal("GT5U.item.cable.eu_volt") }; + } + + @Override + public float getThickNess() { + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x1) != 0) return 0.0625F; + return mThickNess; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + if (GTMod.gregtechproxy.gt6Cable) aNBT.setByte("mConnections", mConnections); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + if (GTMod.gregtechproxy.gt6Cable) { + mConnections = aNBT.getByte("mConnections"); + } + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + final BaseMetaPipeEntity base = (BaseMetaPipeEntity) getBaseMetaTileEntity(); + final PowerNodePath path = (PowerNodePath) base.getNodePath(); + + if (path == null) + return new String[] { EnumChatFormatting.RED + "Failed to get Power Node info" + EnumChatFormatting.RESET }; + + final long currAmp = path.getAmperage(); + final long currVoltage = path.getVoltage(); + + final double avgAmp = path.getAvgAmperage(); + final double avgVoltage = path.getAvgVoltage(); + + final long maxVoltageOut = (mVoltage - mCableLossPerMeter) * mAmperage; + + return new String[] { + "Amperage: " + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(currAmp) + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mAmperage) + + EnumChatFormatting.RESET + + " A", + "Voltage Out: " + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(currVoltage) + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxVoltageOut) + + EnumChatFormatting.RESET + + " EU/t", + "Avg Amperage (20t): " + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(avgAmp) + + EnumChatFormatting.RESET + + " A", + "Avg Output (20t): " + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(avgVoltage) + + EnumChatFormatting.RESET + + " EU/t" }; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x2) != 0) + return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); + else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + + private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + float tSpace = (1f - mThickNess) / 2; + float spaceDown = tSpace; + float spaceUp = 1f - tSpace; + float spaceNorth = tSpace; + float spaceSouth = 1f - tSpace; + float spaceWest = tSpace; + float spaceEast = 1f - tSpace; + + if (getBaseMetaTileEntity().getCoverIDAtSide(DOWN) != 0) { + spaceDown = spaceNorth = spaceWest = 0; + spaceSouth = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(UP) != 0) { + spaceNorth = spaceWest = 0; + spaceUp = spaceSouth = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(NORTH) != 0) { + spaceDown = spaceNorth = spaceWest = 0; + spaceUp = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(SOUTH) != 0) { + spaceDown = spaceWest = 0; + spaceUp = spaceSouth = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(WEST) != 0) { + spaceDown = spaceNorth = spaceWest = 0; + spaceUp = spaceSouth = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(EAST) != 0) { + spaceDown = spaceNorth = 0; + spaceUp = spaceSouth = spaceEast = 1; + } + + byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; + if ((tConn & DOWN.flag) != 0) spaceDown = 0f; + if ((tConn & UP.flag) != 0) spaceUp = 1f; + if ((tConn & NORTH.flag) != 0) spaceNorth = 0f; + if ((tConn & SOUTH.flag) != 0) spaceSouth = 1f; + if ((tConn & WEST.flag) != 0) spaceWest = 0f; + if ((tConn & EAST.flag) != 0) spaceEast = 1f; + + return AxisAlignedBB.getBoundingBox( + aX + spaceWest, + aY + spaceDown, + aZ + spaceNorth, + aX + spaceEast, + aY + spaceUp, + aZ + spaceSouth); + } + + @Override + public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, + List outputAABB, Entity collider) { + super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x2) != 0) { + final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); + } + } + + @Override + public boolean shouldJoinIc2Enet() { + if (!GTMod.gregtechproxy.ic2EnergySourceCompat) return false; + + if (mConnections != 0) { + final IGregTechTileEntity baseMeta = getBaseMetaTileEntity(); + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (isConnectedAtSide(side)) { + final TileEntity tTileEntity = baseMeta.getTileEntityAtSide(side); + final TileEntity tEmitter = (tTileEntity == null || tTileEntity instanceof IEnergyTile + || EnergyNet.instance == null) + ? tTileEntity + : EnergyNet.instance.getTileEntity( + tTileEntity.getWorldObj(), + tTileEntity.xCoord, + tTileEntity.yCoord, + tTileEntity.zCoord); + + if (tEmitter instanceof IEnergyEmitter) return true; + } + } + } + return false; + } + + @Override + public void reloadLocks() { + final BaseMetaPipeEntity pipe = (BaseMetaPipeEntity) getBaseMetaTileEntity(); + if (pipe.getNode() != null) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (isConnectedAtSide(side)) { + final CoverInfo coverInfo = pipe.getCoverInfoAtSide(side); + if (coverInfo.getCoverBehavior() instanceof GTCoverNone) continue; + if (!letsIn(coverInfo) || !letsOut(coverInfo)) { + pipe.addToLock(pipe, side); + } else { + pipe.removeFromLock(pipe, side); + } + } + } + } else { + boolean dontAllow = false; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (isConnectedAtSide(side)) { + final CoverInfo coverInfo = pipe.getCoverInfoAtSide(side); + if (coverInfo.getCoverBehavior() instanceof GTCoverNone) continue; + + if (!letsIn(coverInfo) || !letsOut(coverInfo)) { + dontAllow = true; + } + } + } + if (dontAllow) { + pipe.addToLock(pipe, DOWN); + } else { + pipe.removeFromLock(pipe, DOWN); + } + } + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + + currenttip.add( + StatCollector.translateToLocal("GT5U.item.cable.max_voltage") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mVoltage) + + " (" + + GTUtility.getColoredTierNameFromVoltage(mVoltage) + + EnumChatFormatting.GREEN + + ")"); + currenttip.add( + StatCollector.translateToLocal("GT5U.item.cable.max_amperage") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mAmperage)); + currenttip.add( + StatCollector.translateToLocal("GT5U.item.cable.loss") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(mCableLossPerMeter) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.item.cable.eu_volt")); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTECubicMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTECubicMultiBlockBase.java new file mode 100644 index 0000000000..c8b0c8ce3f --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTECubicMultiBlockBase.java @@ -0,0 +1,141 @@ +package gregtech.api.metatileentity.implementations; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTStructureUtility; + +/** + * A simple 3x3x3 hollow cubic multiblock, that can be arbitrarily rotated, made of a single type of machine casing and + * accepts hatches everywhere. Controller will be placed in front center of the structure. + *

+ * Note: You cannot use different casing for the same Class. Make a new subclass for it. You also should not change the + * casing dynamically, i.e. it should be a dumb method returning some sort of constant. + *

+ * Implementation tips: 1. To restrict hatches, override {@link #addDynamoToMachineList(IGregTechTileEntity, int)} and + * its cousins instead of overriding the whole {@link #getStructureDefinition()} or change + * {@link #checkHatches(IGregTechTileEntity, ItemStack)}. The former is a total overkill, while the later cannot stop + * the structure check early. 2. To limit rotation, override {@link #getInitialAlignmentLimits()} + * + * @param + */ +public abstract class MTECubicMultiBlockBase> extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable { + + protected static final String STRUCTURE_PIECE_MAIN = "main"; + protected static final ClassValue>> STRUCTURE_DEFINITION = new ClassValue<>() { + + @Override + protected IStructureDefinition> computeValue(Class type) { + return StructureDefinition.>builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { "hhh", "hhh", "hhh" }, { "h~h", "h-h", "hhh" }, { "hhh", "hhh", "hhh" }, })) + .addElement( + 'h', + ofChain( + lazy( + t -> GTStructureUtility.>buildHatchAdder() + .atLeastList(t.getAllowedHatches()) + .casingIndex(t.getHatchTextureIndex()) + .dot(1) + .build()), + onElementPass( + MTECubicMultiBlockBase::onCorrectCasingAdded, + lazy(MTECubicMultiBlockBase::getCasingElement)))) + .build(); + } + }; + private int mCasingAmount = 0; + + protected MTECubicMultiBlockBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + protected MTECubicMultiBlockBase(String aName) { + super(aName); + } + + /** + * Create a simple 3x3x3 hollow cubic structure made of a single type of machine casing and accepts hatches + * everywhere. + *

+ * The created definition contains a single piece named {@link #STRUCTURE_PIECE_MAIN}. + */ + @Override + @SuppressWarnings("unchecked") + public IStructureDefinition getStructureDefinition() { + return (IStructureDefinition) STRUCTURE_DEFINITION.get(getClass()); + } + + @Override + public void construct(ItemStack aStack, boolean aHintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 1, 1, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true); + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= getRequiredCasingCount() + && checkHatches(aBaseMetaTileEntity, aStack); + } + + /** + * Called by {@link #checkMachine(IGregTechTileEntity, ItemStack)} to check if all required hatches are present. + *

+ * Default implementation requires EXACTLY ONE maintenance hatch to be present, and ignore all other conditions. + * + * @param aBaseMetaTileEntity the tile entity of self + * @param aStack The item stack inside the controller + * @return true if the test passes, false otherwise + */ + protected boolean checkHatches(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + return mMaintenanceHatches.size() == 1; + } + + protected abstract IStructureElement> getCasingElement(); + + protected List>> getAllowedHatches() { + return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Muffler, Maintenance, Energy); + } + + /** + * The hatch's texture index. + */ + protected abstract int getHatchTextureIndex(); + + protected abstract int getRequiredCasingCount(); + + protected void onCorrectCasingAdded() { + mCasingAmount++; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEEnhancedMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEEnhancedMultiBlockBase.java new file mode 100644 index 0000000000..2cf4398e87 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEEnhancedMultiBlockBase.java @@ -0,0 +1,318 @@ +package gregtech.api.metatileentity.implementations; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.IAlignment; +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; +import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; + +import cpw.mods.fml.common.network.NetworkRegistry; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; + +/** + * Enhanced multiblock base class, featuring following improvement over {@link MTEMultiBlockBase} + *

+ * 1. TecTech style declarative structure check utilizing StructureLib. 2. Arbitrarily rotating the whole structure, if + * allowed to. + * + * @param type of this + */ +public abstract class MTEEnhancedMultiBlockBase> extends MTETooltipMultiBlockBase + implements IAlignment, IConstructable { + + private ExtendedFacing mExtendedFacing = ExtendedFacing.DEFAULT; + private IAlignmentLimits mLimits = getInitialAlignmentLimits(); + + protected MTEEnhancedMultiBlockBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + protected MTEEnhancedMultiBlockBase(String aName) { + super(aName); + } + + @Override + public ExtendedFacing getExtendedFacing() { + return mExtendedFacing; + } + + @Override + public void setExtendedFacing(ExtendedFacing newExtendedFacing) { + if (mExtendedFacing != newExtendedFacing) { + if (mMachine) stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE); + mExtendedFacing = newExtendedFacing; + final IGregTechTileEntity base = getBaseMetaTileEntity(); + mMachine = false; + mUpdated = false; + mUpdate = 50; + if (getBaseMetaTileEntity().isServerSide() + && !GregTechAPI.isDummyWorld(getBaseMetaTileEntity().getWorld())) { + StructureLibAPI.sendAlignment( + (IAlignmentProvider) base, + new NetworkRegistry.TargetPoint( + base.getWorld().provider.dimensionId, + base.getXCoord(), + base.getYCoord(), + base.getZCoord(), + 512)); + } else { + base.issueTextureUpdate(); + } + } + } + + @Override + public final boolean isFacingValid(ForgeDirection facing) { + return canSetToDirectionAny(facing); + } + + @Override + public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, + float aX, float aY, float aZ) { + if (wrenchingSide != getBaseMetaTileEntity().getFrontFacing()) + return super.onWrenchRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); + if (entityPlayer.isSneaking()) { + if (isFlipChangeAllowed()) { + toolSetFlip(getFlip().isHorizontallyFlipped() ? Flip.NONE : Flip.HORIZONTAL); + } else { + return false; + } + } else { + if (isRotationChangeAllowed()) { + toolSetRotation(null); + } else { + return false; + } + } + return true; + } + + @Override + public void onFacingChange() { + toolSetDirection(getBaseMetaTileEntity().getFrontFacing()); + } + + @Override + public IAlignmentLimits getAlignmentLimits() { + return mLimits; + } + + protected void setAlignmentLimits(IAlignmentLimits mLimits) { + this.mLimits = mLimits; + } + + /** + * Due to limitation of Java type system, you might need to do an unchecked cast. HOWEVER, the returned + * IStructureDefinition is expected to be evaluated against current instance only, and should not be used against + * other instances, even for those of the same class. + */ + public abstract IStructureDefinition getStructureDefinition(); + + protected abstract MultiblockTooltipBuilder createTooltip(); + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return getTooltip().getStructureHint(); + } + + protected IAlignmentLimits getInitialAlignmentLimits() { + return (d, r, f) -> !f.isVerticallyFliped(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByte( + "eRotation", + (byte) mExtendedFacing.getRotation() + .getIndex()); + aNBT.setByte( + "eFlip", + (byte) mExtendedFacing.getFlip() + .getIndex()); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mExtendedFacing = ExtendedFacing.of( + getBaseMetaTileEntity().getFrontFacing(), + Rotation.byIndex(aNBT.getByte("eRotation")), + Flip.byIndex(aNBT.getByte("eFlip"))); + if (!getAlignmentLimits().isNewExtendedFacingValid(mExtendedFacing)) { + mExtendedFacing = getCorrectedAlignment(mExtendedFacing); + } + } + + /** + * When an old {@link ExtendedFacing} is loaded upon MTE deserialization, and the loaded facing cannot pass test of + * current {@link #getAlignmentLimits()}, this method will be called to retrieve a corrected version. This method + * is currently only intended to be used as a mean to migrate alignment limits, so if you never change the alignment + * limit then you can probably just use the default implementation. + * + * The returned new facing must be able to pass the test of {@link #isNewExtendedFacingValid(ExtendedFacing)} + */ + protected ExtendedFacing getCorrectedAlignment(ExtendedFacing aOldFacing) { + if (isNewExtendedFacingValid(ExtendedFacing.DEFAULT)) { + return ExtendedFacing.DEFAULT; + } + for (ExtendedFacing facing : ExtendedFacing.VALUES) { + if (facing.getFlip() + .isVerticallyFliped()) { + continue; + } + if (isNewExtendedFacingValid(facing)) { + return facing; + } + } + throw new AssertionError("No ExtendedFacing can pass the test of isNewExtendedFacingValid"); + } + + @SuppressWarnings("unchecked") + private IStructureDefinition> getCastedStructureDefinition() { + return (IStructureDefinition>) getStructureDefinition(); + } + + /** + * Explanation of the world coordinate these offset means: + *

+ * Imagine you stand in front of the controller, with controller facing towards you not rotated or flipped. + *

+ * The horizontalOffset would be the number of blocks on the left side of the controller, not counting controller + * itself. The verticalOffset would be the number of blocks on the top side of the controller, not counting + * controller itself. The depthOffset would be the number of blocks between you and controller, not counting + * controller itself. + *

+ * All these offsets can be negative. + */ + protected final boolean checkPiece(String piece, int horizontalOffset, int verticalOffset, int depthOffset) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + return getCastedStructureDefinition().check( + this, + piece, + tTile.getWorld(), + getExtendedFacing(), + tTile.getXCoord(), + tTile.getYCoord(), + tTile.getZCoord(), + horizontalOffset, + verticalOffset, + depthOffset, + !mMachine); + } + + protected final boolean buildPiece(String piece, ItemStack trigger, boolean hintOnly, int horizontalOffset, + int verticalOffset, int depthOffset) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + return getCastedStructureDefinition().buildOrHints( + this, + trigger, + piece, + tTile.getWorld(), + getExtendedFacing(), + tTile.getXCoord(), + tTile.getYCoord(), + tTile.getZCoord(), + horizontalOffset, + verticalOffset, + depthOffset, + hintOnly); + } + + @Deprecated + protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, + int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + return getCastedStructureDefinition().survivalBuild( + this, + trigger, + piece, + tTile.getWorld(), + getExtendedFacing(), + tTile.getXCoord(), + tTile.getYCoord(), + tTile.getZCoord(), + horizontalOffset, + verticalOffset, + depthOffset, + elementsBudget, + source, + actor, + check); + } + + protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, + int depthOffset, int elementsBudget, ISurvivalBuildEnvironment env, boolean check) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + return getCastedStructureDefinition().survivalBuild( + this, + trigger, + piece, + tTile.getWorld(), + getExtendedFacing(), + tTile.getXCoord(), + tTile.getYCoord(), + tTile.getZCoord(), + horizontalOffset, + verticalOffset, + depthOffset, + elementsBudget, + env, + check); + } + + @Deprecated + protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, + int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check, + boolean checkIfPlaced) { + int built = survivialBuildPiece( + piece, + trigger, + horizontalOffset, + verticalOffset, + depthOffset, + elementsBudget, + source, + actor, + check); + if (checkIfPlaced && built > 0) checkStructure(true, getBaseMetaTileEntity()); + return built; + } + + protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, + int depthOffset, int elementsBudget, ISurvivalBuildEnvironment env, boolean check, boolean checkIfPlaced) { + int built = survivialBuildPiece( + piece, + trigger, + horizontalOffset, + verticalOffset, + depthOffset, + elementsBudget, + env, + check); + if (checkIfPlaced && built > 0) checkStructure(true, getBaseMetaTileEntity()); + return built; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + if (aBaseMetaTileEntity.isClientSide()) + StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java new file mode 100644 index 0000000000..64bade97e8 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java @@ -0,0 +1,242 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; + +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.util.ExoticEnergyInputHelper; +import gregtech.api.util.GTUtility; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.shutdown.ShutDownReason; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; + +/** + * Multiblock base class that allows machine to use power over int. + */ +public abstract class MTEExtendedPowerMultiBlockBase> + extends MTEEnhancedMultiBlockBase { + + public long lEUt; + + protected MTEExtendedPowerMultiBlockBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + protected MTEExtendedPowerMultiBlockBase(String aName) { + super(aName); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + // NBT can be loaded as any primitive type, so we can load it as long. + this.lEUt = aNBT.getLong("mEUt"); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setLong("mEUt", this.lEUt); + } + + @Override + protected void calculateOverclockedNessMultiInternal(long aEUt, int aDuration, int mAmperage, long maxInputVoltage, + boolean perfectOC) { + OverclockCalculator calculator = new OverclockCalculator().setRecipeEUt(aEUt) + .setEUt(maxInputVoltage * mAmperage) + .setDuration(aDuration) + .setDurationDecreasePerOC(perfectOC ? 4.0 : 2.0) + .calculate(); + lEUt = calculator.getConsumption(); + mMaxProgresstime = calculator.getDuration(); + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + if (this.lEUt > 0) { + addEnergyOutput((this.lEUt * mEfficiency) / 10000); + return true; + } + if (this.lEUt < 0) { + if (!drainEnergyInput(getActualEnergyUsage())) { + stopMachine(ShutDownReasonRegistry.POWER_LOSS); + return false; + } + } + return true; + } + + @Override + public void stopMachine(@NotNull ShutDownReason reason) { + this.lEUt = 0; + super.stopMachine(reason); + } + + @Override + protected long getActualEnergyUsage() { + return (-this.lEUt * 10000) / Math.max(1000, mEfficiency); + } + + public List getExoticAndNormalEnergyHatchList() { + List tHatches = new ArrayList<>(); + tHatches.addAll(filterValidMTEs(mExoticEnergyHatches)); + tHatches.addAll(filterValidMTEs(mEnergyHatches)); + return tHatches; + } + + @Override + public boolean drainEnergyInput(long aEU) { + return ExoticEnergyInputHelper.drainEnergy(aEU, getExoticAndNormalEnergyHatchList()); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + + final IGregTechTileEntity tileEntity = getBaseMetaTileEntity(); + if (tileEntity != null) { + if (tileEntity.isActive()) { + if (lEUt < 0) tag.setLong("energyUsage", getActualEnergyUsage()); + else tag.setLong("energyUsage", -lEUt * mEfficiency / 10000); + } + } + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(getAverageInputVoltage()); + logic.setAvailableAmperage(getMaxInputAmps()); + logic.setAmperageOC(true); + } + + @Nonnull + @Override + protected CheckRecipeResult postCheckRecipe(@Nonnull CheckRecipeResult result, + @Nonnull ProcessingLogic processingLogic) { + return result; + } + + @Override + protected void setEnergyUsage(ProcessingLogic processingLogic) { + lEUt = processingLogic.getCalculatedEut(); + if (lEUt > 0) { + lEUt = (-lEUt); + } + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + } + + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatch tHatch : getExoticAndNormalEnergyHatchList()) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + long voltage = getAverageInputVoltage(); + long amps = getMaxInputAmps(); + + return new String[] { + /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(getActualEnergyUsage()) + + EnumChatFormatting.RESET + + " EU/t", + /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(voltage) + + EnumChatFormatting.RESET + + " EU/t(*" + + amps + + " A)" + + StatCollector.translateToLocal("GT5U.machines.tier") + + ": " + + EnumChatFormatting.YELLOW + + VN[GTUtility.getTier(voltage)] + + EnumChatFormatting.RESET, + /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.multiblock.efficiency") + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" }; + } + + @Override + public long getMaxInputVoltage() { + return ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList()); + } + + @Override + public long getAverageInputVoltage() { + return ExoticEnergyInputHelper.getAverageInputVoltageMulti(getExoticAndNormalEnergyHatchList()); + } + + @Override + public long getMaxInputAmps() { + return ExoticEnergyInputHelper.getMaxWorkingInputAmpsMulti(getExoticAndNormalEnergyHatchList()); + } + + @Override + public long getMaxInputEu() { + return ExoticEnergyInputHelper.getTotalEuMulti(getExoticAndNormalEnergyHatchList()); + } + + @Override + public void clearHatches() { + super.clearHatches(); + mExoticEnergyHatches.clear(); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEFilterBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEFilterBase.java new file mode 100644 index 0000000000..32e224e50f --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEFilterBase.java @@ -0,0 +1,104 @@ +package gregtech.api.metatileentity.implementations; + +import net.minecraft.nbt.NBTTagCompound; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.util.GT_TooltipDataCache; + +public abstract class MTEFilterBase extends MTEBuffer { + + private static final String INVERT_FILTER_TOOLTIP = "GT5U.machines.invert_filter.tooltip"; + protected static final int FILTER_SLOT_INDEX = 9; + protected static final int NUM_INVENTORY_SLOTS = 9; + private static final String EMIT_REDSTONE_GRADUALLY_TOOLTIP = "GT5U" + ".machines.emit_redstone_gradually.tooltip"; + protected boolean invertFilter = false; + + public MTEFilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public MTEFilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String[] aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public MTEFilterBase(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEFilterBase(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex < NUM_INVENTORY_SLOTS; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("bInvertFilter", this.invertFilter); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.invertFilter = aNBT.getBoolean("bInvertFilter"); + } + + @Override + protected int getRedstoneOutput() { + if (!bRedstoneIfFull) { + return 0; + } + int redstoneOutput = getEmptySlots(); + if (!bInvert) redstoneOutput = NUM_INVENTORY_SLOTS - redstoneOutput; + return redstoneOutput; + } + + private int getEmptySlots() { + int emptySlots = 0; + for (int i = 0; i < NUM_INVENTORY_SLOTS; i++) { + if (mInventory[i] == null) ++emptySlots; + } + return emptySlots; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + addSortStacksButton(builder); + addEmitRedstoneGraduallyButton(builder); + addInvertRedstoneButton(builder); + addInvertFilterButton(builder); + } + + private void addEmitRedstoneGraduallyButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bRedstoneIfFull, + val -> bRedstoneIfFull = val, + GTUITextures.OVERLAY_BUTTON_EMIT_REDSTONE, + this::getEmitRedstoneGraduallyButtonTooltip).setUpdateTooltipEveryTick(true)); + } + + private GT_TooltipDataCache.TooltipData getEmitRedstoneGraduallyButtonTooltip() { + return mTooltipCache + .getUncachedTooltipData(EMIT_REDSTONE_GRADUALLY_TOOLTIP, getEmptySlots(), getRedstoneOutput()); + } + + private void addInvertFilterButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> invertFilter, + val -> invertFilter = val, + GTUITextures.OVERLAY_BUTTON_INVERT_FILTER, + () -> mTooltipCache.getData(INVERT_FILTER_TOOLTIP))); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java new file mode 100644 index 0000000000..ddc0e28723 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java @@ -0,0 +1,971 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.ALL_VALID_SIDES; +import static gregtech.api.enums.GTValues.D1; +import static gregtech.api.enums.Mods.TinkerConstruct; +import static gregtech.api.enums.Mods.Translocator; +import static gregtech.api.metatileentity.implementations.MTEFluid.Border.BOTTOM; +import static gregtech.api.metatileentity.implementations.MTEFluid.Border.LEFT; +import static gregtech.api.metatileentity.implementations.MTEFluid.Border.RIGHT; +import static gregtech.api.metatileentity.implementations.MTEFluid.Border.TOP; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; +import static net.minecraftforge.common.util.ForgeDirection.DOWN; +import static net.minecraftforge.common.util.ForgeDirection.EAST; +import static net.minecraftforge.common.util.ForgeDirection.NORTH; +import static net.minecraftforge.common.util.ForgeDirection.SOUTH; +import static net.minecraftforge.common.util.ForgeDirection.UP; +import static net.minecraftforge.common.util.ForgeDirection.WEST; + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import org.apache.commons.lang3.tuple.MutableTriple; + +import cpw.mods.fml.common.Optional; +import gregtech.GTMod; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Mods; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.ToolModes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.MetaPipeEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; +import gregtech.common.GTClient; +import gregtech.common.config.other.ConfigGeneral; +import gregtech.common.covers.CoverDrain; +import gregtech.common.covers.CoverFluidRegulator; +import gregtech.common.covers.CoverInfo; + +public class MTEFluid extends MetaPipeEntity { + + protected static final EnumMap> FACE_BORDER_MAP = new EnumMap<>( + ForgeDirection.class); + + static { + FACE_BORDER_MAP.put(DOWN, borderMap(NORTH, SOUTH, EAST, WEST)); + FACE_BORDER_MAP.put(UP, borderMap(NORTH, SOUTH, WEST, EAST)); + FACE_BORDER_MAP.put(NORTH, borderMap(UP, DOWN, EAST, WEST)); + FACE_BORDER_MAP.put(SOUTH, borderMap(UP, DOWN, WEST, EAST)); + FACE_BORDER_MAP.put(WEST, borderMap(UP, DOWN, NORTH, SOUTH)); + FACE_BORDER_MAP.put(EAST, borderMap(UP, DOWN, SOUTH, NORTH)); + } + + protected static final Map RESTR_TEXTURE_MAP = new HashMap<>(); + + static { + RESTR_TEXTURE_MAP.put(TOP.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UP); + RESTR_TEXTURE_MAP.put(BOTTOM.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DOWN); + RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UD); + RESTR_TEXTURE_MAP.put(LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_LEFT); + RESTR_TEXTURE_MAP.put(TOP.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UL); + RESTR_TEXTURE_MAP.put(BOTTOM.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DL); + RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NR); + RESTR_TEXTURE_MAP.put(RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_RIGHT); + RESTR_TEXTURE_MAP.put(TOP.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UR); + RESTR_TEXTURE_MAP.put(BOTTOM.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DR); + RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NL); + RESTR_TEXTURE_MAP.put(LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_LR); + RESTR_TEXTURE_MAP.put(TOP.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_ND); + RESTR_TEXTURE_MAP.put(BOTTOM.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NU); + RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR); + } + + public final float mThickNess; + public final Materials mMaterial; + public final int mCapacity, mHeatResistance, mPipeAmount; + public final boolean mGasProof; + public final FluidStack[] mFluids; + public byte mLastReceivedFrom = 0, oLastReceivedFrom = 0; + /** + * Bitmask for whether disable fluid input form each side. + */ + public byte mDisableInput = 0; + + public MTEFluid(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, int aCapacity, + int aHeatResistance, boolean aGasProof) { + this(aID, aName, aNameRegional, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1); + } + + public MTEFluid(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, int aCapacity, + int aHeatResistance, boolean aGasProof, int aFluidTypes) { + super(aID, aName, aNameRegional, 0, false); + mThickNess = aThickNess; + mMaterial = aMaterial; + mCapacity = aCapacity; + mGasProof = aGasProof; + mHeatResistance = aHeatResistance; + mPipeAmount = aFluidTypes; + mFluids = new FluidStack[mPipeAmount]; + addInfo(aID); + } + + public MTEFluid(String aName, float aThickNess, Materials aMaterial, int aCapacity, int aHeatResistance, + boolean aGasProof, int aFluidTypes) { + super(aName, 0); + mThickNess = aThickNess; + mMaterial = aMaterial; + mCapacity = aCapacity; + mGasProof = aGasProof; + mHeatResistance = aHeatResistance; + mPipeAmount = aFluidTypes; + mFluids = new FluidStack[mPipeAmount]; + } + + @Override + public byte getTileEntityBaseType() { + return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality))); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEFluid(mName, mThickNess, mMaterial, mCapacity, mHeatResistance, mGasProof, mPipeAmount); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections, + int colorIndex, boolean aConnected, boolean redstoneLevel) { + if (side == ForgeDirection.UNKNOWN) return Textures.BlockIcons.ERROR_RENDERING; + final float tThickNess = getThickNess(); + if (mDisableInput == 0) + return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, colorIndex) + : TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], + Dyes.getModulation(colorIndex, mMaterial.mRGBa)) }; + int borderMask = 0; + for (Border border : Border.values()) { + if (isInputDisabledAtSide(getSideAtBorder(side, border))) borderMask |= border.mask; + } + + return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, colorIndex) + : TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], + Dyes.getModulation(colorIndex, mMaterial.mRGBa)), + getRestrictorTexture(borderMask) }; + } + + protected static ITexture getBaseTexture(float aThickNess, int aPipeAmount, Materials aMaterial, int colorIndex) { + if (aPipeAmount >= 9) return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipeNonuple.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + if (aPipeAmount >= 4) return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipeQuadruple.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + if (aThickNess < 0.124F) return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + if (aThickNess < 0.374F) return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + if (aThickNess < 0.499F) return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + if (aThickNess < 0.749F) return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + if (aThickNess < 0.874F) return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + return TextureFactory.of( + aMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex], + Dyes.getModulation(colorIndex, aMaterial.mRGBa)); + } + + protected static ITexture getRestrictorTexture(int borderMask) { + final IIconContainer restrictorIcon = RESTR_TEXTURE_MAP.get(borderMask); + return restrictorIcon != null ? TextureFactory.of(restrictorIcon) : null; + } + + @Override + public void onValueUpdate(byte aValue) { + mDisableInput = aValue; + } + + @Override + public byte getUpdateData() { + return mDisableInput; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return false; + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public final boolean renderInside(ForgeDirection side) { + return false; + } + + @Override + public int getProgresstime() { + return getFluidAmount(); + } + + @Override + public int maxProgresstime() { + return getCapacity(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + for (int i = 0; i < mPipeAmount; i++) if (mFluids[i] != null) + aNBT.setTag("mFluid" + (i == 0 ? "" : i), mFluids[i].writeToNBT(new NBTTagCompound())); + aNBT.setByte("mLastReceivedFrom", mLastReceivedFrom); + if (GTMod.gregtechproxy.gt6Pipe) { + aNBT.setByte("mConnections", mConnections); + aNBT.setByte("mDisableInput", mDisableInput); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + for (int i = 0; i < mPipeAmount; i++) + mFluids[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid" + (i == 0 ? "" : i))); + mLastReceivedFrom = aNBT.getByte("mLastReceivedFrom"); + if (GTMod.gregtechproxy.gt6Pipe) { + mConnections = aNBT.getByte("mConnections"); + mDisableInput = aNBT.getByte("mDisableInput"); + } + } + + @Override + public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity aEntity) { + if ((((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections & -128) == 0 + && aEntity instanceof EntityLivingBase) { + for (FluidStack tFluid : mFluids) { + if (tFluid != null) { + final int tTemperature = tFluid.getFluid() + .getTemperature(tFluid); + if (tTemperature > 320 + && !isCoverOnSide((BaseMetaPipeEntity) getBaseMetaTileEntity(), (EntityLivingBase) aEntity)) { + GTUtility.applyHeatDamage((EntityLivingBase) aEntity, (tTemperature - 300) / 50.0F); + break; + } else if (tTemperature < 260 + && !isCoverOnSide((BaseMetaPipeEntity) getBaseMetaTileEntity(), (EntityLivingBase) aEntity)) { + GTUtility.applyFrostDamage((EntityLivingBase) aEntity, (270 - tTemperature) / 25.0F); + break; + } + } + } + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide() && aTick % 5 == 0) { + mLastReceivedFrom &= 63; + if (mLastReceivedFrom == 63) { + mLastReceivedFrom = 0; + } + + if (!GTMod.gregtechproxy.gt6Pipe || mCheckConnections) checkConnections(); + + final boolean shouldDistribute = (oLastReceivedFrom == mLastReceivedFrom); + for (int i = 0, j = aBaseMetaTileEntity.getRandomNumber(mPipeAmount); i < mPipeAmount; i++) { + final int index = (i + j) % mPipeAmount; + if (mFluids[index] != null && mFluids[index].amount <= 0) mFluids[index] = null; + if (mFluids[index] == null) continue; + + if (checkEnvironment(index, aBaseMetaTileEntity)) return; + + if (shouldDistribute) { + distributeFluid(index, aBaseMetaTileEntity); + mLastReceivedFrom = 0; + } + } + + oLastReceivedFrom = mLastReceivedFrom; + } + } + + private boolean checkEnvironment(int index, IGregTechTileEntity aBaseMetaTileEntity) { + // Check for hot liquids that melt the pipe or gasses that escape and burn/freeze people + final FluidStack tFluid = mFluids[index]; + + if (tFluid != null && tFluid.amount > 0) { + final int tTemperature = tFluid.getFluid() + .getTemperature(tFluid); + if (tTemperature > mHeatResistance) { + if (aBaseMetaTileEntity.getRandomNumber(100) == 0) { + // Poof + GTLog.exp.println( + "Set Pipe to Fire due to to low heat resistance at " + aBaseMetaTileEntity.getXCoord() + + " | " + + aBaseMetaTileEntity.getYCoord() + + " | " + + aBaseMetaTileEntity.getZCoord() + + " DIMID: " + + aBaseMetaTileEntity.getWorld().provider.dimensionId); + aBaseMetaTileEntity.setToFire(); + return true; + } + // Mmhmm, Fire + aBaseMetaTileEntity.setOnFire(); + GTLog.exp.println( + "Set Blocks around Pipe to Fire due to to low heat resistance at " + aBaseMetaTileEntity.getXCoord() + + " | " + + aBaseMetaTileEntity.getYCoord() + + " | " + + aBaseMetaTileEntity.getZCoord() + + " DIMID: " + + aBaseMetaTileEntity.getWorld().provider.dimensionId); + } + if (!mGasProof && tFluid.getFluid() + .isGaseous(tFluid)) { + tFluid.amount -= 5; + sendSound((byte) 9); + if (tTemperature > 320) { + try { + for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld() + .getEntitiesWithinAABB( + EntityLivingBase.class, + AxisAlignedBB.getBoundingBox( + getBaseMetaTileEntity().getXCoord() - 2, + getBaseMetaTileEntity().getYCoord() - 2, + getBaseMetaTileEntity().getZCoord() - 2, + getBaseMetaTileEntity().getXCoord() + 3, + getBaseMetaTileEntity().getYCoord() + 3, + getBaseMetaTileEntity().getZCoord() + 3))) { + GTUtility.applyHeatDamage(tLiving, (tTemperature - 300) / 25.0F); + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + } else if (tTemperature < 260) { + try { + for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld() + .getEntitiesWithinAABB( + EntityLivingBase.class, + AxisAlignedBB.getBoundingBox( + getBaseMetaTileEntity().getXCoord() - 2, + getBaseMetaTileEntity().getYCoord() - 2, + getBaseMetaTileEntity().getZCoord() - 2, + getBaseMetaTileEntity().getXCoord() + 3, + getBaseMetaTileEntity().getYCoord() + 3, + getBaseMetaTileEntity().getZCoord() + 3))) { + GTUtility.applyFrostDamage(tLiving, (270 - tTemperature) / 12.5F); + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + } + } + if (tFluid.amount <= 0) mFluids[index] = null; + } + return false; + } + + private void distributeFluid(int index, IGregTechTileEntity aBaseMetaTileEntity) { + final FluidStack tFluid = mFluids[index]; + if (tFluid == null) return; + + // Tank, From, Amount to receive + final List> tTanks = new ArrayList<>(); + final int amount = tFluid.amount; + final byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6); + for (final byte i : ALL_VALID_SIDES) { + // Get a list of tanks accepting fluids, and what side they're on + final ForgeDirection side = ForgeDirection.getOrientation((i + tOffset) % 6); + final ForgeDirection oppositeSide = side.getOpposite(); + final IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(side); + final IGregTechTileEntity gTank = tTank instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTank : null; + + if (isConnectedAtSide(side) && tTank != null + && (mLastReceivedFrom & side.flag) == 0 + && getBaseMetaTileEntity().getCoverInfoAtSide(side) + .letsFluidOut(tFluid.getFluid()) + && (gTank == null || gTank.getCoverInfoAtSide(oppositeSide) + .letsFluidIn(tFluid.getFluid()))) { + if (tTank.fill(oppositeSide, tFluid, false) > 0) { + tTanks.add(new MutableTriple<>(tTank, oppositeSide, 0)); + } + tFluid.amount = amount; // Because some mods do actually modify input fluid stack + } + } + + // How much of this fluid is available for distribution? + final double tAmount = Math.max(1, Math.min(mCapacity * 10, tFluid.amount)); + + final FluidStack maxFluid = tFluid.copy(); + maxFluid.amount = Integer.MAX_VALUE; + + double availableCapacity = 0; + // Calculate available capacity for distribution from all tanks + for (final MutableTriple tEntry : tTanks) { + tEntry.right = tEntry.left.fill(tEntry.middle, maxFluid, false); + availableCapacity += tEntry.right; + } + + // Now distribute + for (final MutableTriple tEntry : tTanks) { + // Distribue fluids based on percentage available space at destination + if (availableCapacity > tAmount) + tEntry.right = (int) Math.floor(tEntry.right * tAmount / availableCapacity); + + // If the percent is not enough to give at least 1L, try to give 1L + if (tEntry.right == 0) tEntry.right = (int) Math.min(1, tAmount); + + if (tEntry.right <= 0) continue; + + final int tFilledAmount = tEntry.left + .fill(tEntry.middle, drainFromIndex(tEntry.right, false, index), false); + + if (tFilledAmount > 0) tEntry.left.fill(tEntry.middle, drainFromIndex(tFilledAmount, true, index), true); + + if (mFluids[index] == null || mFluids[index].amount <= 0) return; + } + } + + public void connectPipeOnSide(ForgeDirection side, EntityPlayer entityPlayer) { + if (!isConnectedAtSide(side)) { + if (connect(side) > 0) GTUtility.sendChatToPlayer(entityPlayer, GTUtility.trans("214", "Connected")); + } else { + disconnect(side); + GTUtility.sendChatToPlayer(entityPlayer, GTUtility.trans("215", "Disconnected")); + } + } + + public void blockPipeOnSide(ForgeDirection side, EntityPlayer entityPlayer, byte mask) { + if (isInputDisabledAtSide(side)) { + mDisableInput &= ~mask; + GTUtility.sendChatToPlayer(entityPlayer, GTUtility.trans("212", "Input enabled")); + if (!isConnectedAtSide(side)) connect(side); + } else { + mDisableInput |= mask; + GTUtility.sendChatToPlayer(entityPlayer, GTUtility.trans("213", "Input disabled")); + } + } + + @Override + public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, + float aX, float aY, float aZ, ItemStack aTool) { + + if (GTMod.gregtechproxy.gt6Pipe) { + final int mode = MetaGeneratedTool.getToolMode(aTool); + IGregTechTileEntity currentPipeBase = getBaseMetaTileEntity(); + MTEFluid currentPipe = (MTEFluid) currentPipeBase.getMetaTileEntity(); + final ForgeDirection tSide = GTUtility.determineWrenchingSide(side, aX, aY, aZ); + final byte tMask = (byte) (tSide.flag); + + if (mode == ToolModes.REGULAR.get()) { + if (entityPlayer.isSneaking()) { + currentPipe.blockPipeOnSide(tSide, entityPlayer, tMask); + } else currentPipe.connectPipeOnSide(tSide, entityPlayer); + return true; + } + + if (mode == ToolModes.WRENCH_LINE.get()) { + + boolean initialState = entityPlayer.isSneaking() ? currentPipe.isInputDisabledAtSide(tSide) + : currentPipe.isConnectedAtSide(tSide); + + boolean wasActionPerformed = false; + + int limit = ConfigGeneral.pipeWrenchingChainRange; + for (int connected = 0; connected < limit; connected++) { + + TileEntity nextPipeBaseTile = currentPipeBase.getTileEntityAtSide(tSide); + + // if next tile doesn't exist or if next tile is not GT tile + if (!(nextPipeBaseTile instanceof IGregTechTileEntity nextPipeBase)) { + return wasActionPerformed; + } + + // if next tile is wrong color + if (!currentPipe.connectableColor(nextPipeBaseTile)) { + return wasActionPerformed; + } + + MTEFluid nextPipe = nextPipeBase.getMetaTileEntity() instanceof MTEFluid + ? (MTEFluid) nextPipeBase.getMetaTileEntity() + : null; + + // if next tile entity is not a pipe + if (nextPipe == null) { + return wasActionPerformed; + } + + // if pipes are same size + if (mPipeAmount != nextPipe.mPipeAmount) { + return wasActionPerformed; + } + + // making sure next pipe has same fluid + for (int i = 0; i < mPipeAmount; i++) { + if (mFluids[i] != null && nextPipe.mFluids[i] != null) { + if (!mFluids[i].isFluidEqual(nextPipe.mFluids[i])) { + return wasActionPerformed; + } + } else if (mFluids[i] != nextPipe.mFluids[i]) { + return wasActionPerformed; + } + } + + boolean currentState = entityPlayer.isSneaking() ? currentPipe.isInputDisabledAtSide(tSide) + : currentPipe.isConnectedAtSide(tSide); + + /* + * Making sure next pipe will have same action applied to it + * e.g. Connecting pipe won`t trigger disconnect if next pipe is already connected + */ + if (currentState != initialState) { + return wasActionPerformed; + } + + if (entityPlayer.isSneaking()) { + currentPipe.blockPipeOnSide(tSide, entityPlayer, tMask); + } else currentPipe.connectPipeOnSide(tSide, entityPlayer); + + wasActionPerformed = true; + + currentPipeBase = (IGregTechTileEntity) nextPipeBase; + currentPipe = nextPipe; + + } + return wasActionPerformed; + } + } + return false; + } + + @Override + public boolean letsIn(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return coverBehavior.letsFluidIn(side, aCoverID, aCoverVariable, null, aTileEntity); + } + + @Override + public boolean letsOut(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return coverBehavior.letsFluidOut(side, aCoverID, aCoverVariable, null, aTileEntity); + } + + @Override + public boolean letsIn(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return coverBehavior.letsFluidIn(side, aCoverID, aCoverVariable, null, aTileEntity); + } + + @Override + public boolean letsOut(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return coverBehavior.letsFluidOut(side, aCoverID, aCoverVariable, null, aTileEntity); + } + + @Override + public boolean letsIn(CoverInfo coverInfo) { + return coverInfo.letsFluidIn(null); + } + + @Override + public boolean letsOut(CoverInfo coverInfo) { + return coverInfo.letsFluidOut(null); + } + + @Override + public boolean canConnect(ForgeDirection side, TileEntity tileEntity) { + if (tileEntity == null) return false; + + final ForgeDirection tSide = side.getOpposite(); + final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity(); + if (baseMetaTile == null) return false; + + final CoverBehaviorBase coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(side); + final IGregTechTileEntity gTileEntity = (tileEntity instanceof IGregTechTileEntity) + ? (IGregTechTileEntity) tileEntity + : null; + + if (coverBehavior instanceof CoverDrain || (TinkerConstruct.isModLoaded() && isTConstructFaucet(tileEntity))) + return true; + + final IFluidHandler fTileEntity = (tileEntity instanceof IFluidHandler) ? (IFluidHandler) tileEntity : null; + + if (fTileEntity != null) { + final FluidTankInfo[] tInfo = fTileEntity.getTankInfo(tSide); + if (tInfo != null) { + return tInfo.length > 0 || (Translocator.isModLoaded() && isTranslocator(tileEntity)) + || gTileEntity != null + && gTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof CoverFluidRegulator; + } + } + return false; + } + + @Optional.Method(modid = Mods.Names.TINKER_CONSTRUCT) + private boolean isTConstructFaucet(TileEntity tTileEntity) { + // Tinker Construct Faucets return a null tank info, so check the class + return tTileEntity instanceof tconstruct.smeltery.logic.FaucetLogic; + } + + @Optional.Method(modid = Mods.Names.TRANSLOCATOR) + private boolean isTranslocator(TileEntity tTileEntity) { + // Translocators return a TankInfo, but it's of 0 length - so check the class if we see this pattern + return tTileEntity instanceof codechicken.translocator.TileLiquidTranslocator; + } + + @Override + public boolean getGT6StyleConnection() { + // Yes if GT6 pipes are enabled + return GTMod.gregtechproxy.gt6Pipe; + } + + @Override + public void doSound(byte aIndex, double aX, double aY, double aZ) { + super.doSound(aIndex, aX, aY, aZ); + if (aIndex == 9) { + GTUtility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 5, 1.0F, aX, aY, aZ); + + new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) + .setWorld(getBaseMetaTileEntity().getWorld()) + .times( + 6, + (x, i) -> x + .setMotion( + ForgeDirection.getOrientation(i).offsetX / 5.0, + ForgeDirection.getOrientation(i).offsetY / 5.0, + ForgeDirection.getOrientation(i).offsetZ / 5.0) + .setPosition( + aX - 0.5 + XSTR_INSTANCE.nextFloat(), + aY - 0.5 + XSTR_INSTANCE.nextFloat(), + aZ - 0.5 + XSTR_INSTANCE.nextFloat()) + .run()); + } + } + + @Override + public final int getCapacity() { + return mCapacity * 20 * mPipeAmount; + } + + @Override + public FluidTankInfo getInfo() { + for (FluidStack tFluid : mFluids) { + if (tFluid != null) return new FluidTankInfo(tFluid, mCapacity * 20); + } + return new FluidTankInfo(null, mCapacity * 20); + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection side) { + if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {}; + ArrayList tList = new ArrayList<>(); + for (FluidStack tFluid : mFluids) tList.add(new FluidTankInfo(tFluid, mCapacity * 20)); + return tList.toArray(new FluidTankInfo[mPipeAmount]); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public final FluidStack getFluid() { + for (FluidStack tFluid : mFluids) { + if (tFluid != null) return tFluid; + } + return null; + } + + @Override + public final int getFluidAmount() { + int rAmount = 0; + for (FluidStack tFluid : mFluids) { + if (tFluid != null) rAmount += tFluid.amount; + } + return rAmount; + } + + @Override + public final int fill_default(ForgeDirection side, FluidStack aFluid, boolean doFill) { + if (aFluid == null || aFluid.getFluid() + .getID() <= 0) return 0; + + int index = -1; + for (int i = 0; i < mPipeAmount; i++) { + if (mFluids[i] != null && mFluids[i].isFluidEqual(aFluid)) { + index = i; + break; + } else if ((mFluids[i] == null || mFluids[i].getFluid() + .getID() <= 0) && index < 0) { + index = i; + } + } + + return fill_default_intoIndex(side, aFluid, doFill, index); + } + + private int fill_default_intoIndex(ForgeDirection side, FluidStack aFluid, boolean doFill, int index) { + if (index < 0 || index >= mPipeAmount) return 0; + if (aFluid == null || aFluid.getFluid() + .getID() <= 0) return 0; + + final int ordinalSide = side.ordinal(); + + if (mFluids[index] == null || mFluids[index].getFluid() + .getID() <= 0) { + if (aFluid.amount * mPipeAmount <= getCapacity()) { + if (doFill) { + mFluids[index] = aFluid.copy(); + mLastReceivedFrom |= (1 << ordinalSide); + } + return aFluid.amount; + } + if (doFill) { + mFluids[index] = aFluid.copy(); + mLastReceivedFrom |= (1 << ordinalSide); + mFluids[index].amount = getCapacity() / mPipeAmount; + } + return getCapacity() / mPipeAmount; + } + + if (!mFluids[index].isFluidEqual(aFluid)) return 0; + + final int space = getCapacity() / mPipeAmount - mFluids[index].amount; + if (aFluid.amount <= space) { + if (doFill) { + mFluids[index].amount += aFluid.amount; + mLastReceivedFrom |= (1 << ordinalSide); + } + return aFluid.amount; + } + if (doFill) { + mFluids[index].amount = getCapacity() / mPipeAmount; + mLastReceivedFrom |= (1 << ordinalSide); + } + return space; + } + + @Override + public final FluidStack drain(int maxDrain, boolean doDrain) { + FluidStack drained; + for (int i = 0; i < mPipeAmount; i++) { + if ((drained = drainFromIndex(maxDrain, doDrain, i)) != null) return drained; + } + return null; + } + + private FluidStack drainFromIndex(int maxDrain, boolean doDrain, int index) { + if (index < 0 || index >= mPipeAmount) return null; + if (mFluids[index] == null) return null; + if (mFluids[index].amount <= 0) { + mFluids[index] = null; + return null; + } + + int used = maxDrain; + if (mFluids[index].amount < used) used = mFluids[index].amount; + + if (doDrain) { + mFluids[index].amount -= used; + } + + final FluidStack drained = mFluids[index].copy(); + drained.amount = used; + + if (mFluids[index].amount <= 0) { + mFluids[index] = null; + } + + return drained; + } + + @Override + public int getTankPressure() { + return getFluidAmount() - (getCapacity() / 2); + } + + @Override + public String[] getDescription() { + List descriptions = new ArrayList<>(); + descriptions.add( + EnumChatFormatting.BLUE + "Fluid Capacity: %%%" + + GTUtility.formatNumbers(mCapacity * 20L) + + "%%% L/sec" + + EnumChatFormatting.GRAY); + descriptions.add( + EnumChatFormatting.RED + "Heat Limit: %%%" + + GTUtility.formatNumbers(mHeatResistance) + + "%%% K" + + EnumChatFormatting.GRAY); + if (!mGasProof) { + descriptions.add(EnumChatFormatting.DARK_GREEN + "Cannot handle gas" + EnumChatFormatting.GRAY); + } + if (mPipeAmount != 1) { + descriptions.add(EnumChatFormatting.AQUA + "Pipe Amount: %%%" + mPipeAmount + EnumChatFormatting.GRAY); + } + return descriptions.toArray(new String[0]); + } + + @Override + public float getThickNess() { + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x1) != 0) return 0.0625F; + return mThickNess; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return !isInputDisabledAtSide(side); + } + + @Override + public boolean isLiquidOutput(ForgeDirection side) { + return true; + } + + public boolean isInputDisabledAtSide(ForgeDirection side) { + return (mDisableInput & side.flag) != 0; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x2) != 0) + return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); + else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + + private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + final float tSpace = (1f - mThickNess) / 2; + float tSide0 = tSpace; + float tSide1 = 1f - tSpace; + float tSide2 = tSpace; + float tSide3 = 1f - tSpace; + float tSide4 = tSpace; + float tSide5 = 1f - tSpace; + + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) { + tSide2 = tSide4 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide1 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) { + tSide0 = tSide4 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide1 = tSide3 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) { + tSide0 = tSide2 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + + final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; + if ((tConn & ForgeDirection.DOWN.flag) != 0) tSide0 = 0f; + if ((tConn & ForgeDirection.UP.flag) != 0) tSide1 = 1f; + if ((tConn & ForgeDirection.NORTH.flag) != 0) tSide2 = 0f; + if ((tConn & ForgeDirection.SOUTH.flag) != 0) tSide3 = 1f; + if ((tConn & ForgeDirection.WEST.flag) != 0) tSide4 = 0f; + if ((tConn & ForgeDirection.EAST.flag) != 0) tSide5 = 1f; + + return AxisAlignedBB + .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3); + } + + @Override + public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, + List outputAABB, Entity collider) { + super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x2) != 0) { + final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); + } + } + + @Override + public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) { + if (aFluid == null) return null; + for (int i = 0; i < mFluids.length; ++i) { + final FluidStack f = mFluids[i]; + if (f == null || !f.isFluidEqual(aFluid)) continue; + return drainFromIndex(aFluid.amount, doDrain, i); + } + return null; + } + + private static EnumMap borderMap(ForgeDirection topSide, ForgeDirection bottomSide, + ForgeDirection leftSide, ForgeDirection rightSide) { + final EnumMap sideMap = new EnumMap<>(Border.class); + sideMap.put(TOP, topSide); + sideMap.put(BOTTOM, bottomSide); + sideMap.put(LEFT, leftSide); + sideMap.put(RIGHT, rightSide); + return sideMap; + } + + protected static ForgeDirection getSideAtBorder(ForgeDirection side, Border border) { + return FACE_BORDER_MAP.get(side) + .get(border); + } + + protected enum Border { + + TOP(), + BOTTOM(), + LEFT(), + RIGHT(); + + public final int mask; + + Border() { + mask = 1 << this.ordinal(); + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEFrame.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEFrame.java new file mode 100644 index 0000000000..ec000b6e9c --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEFrame.java @@ -0,0 +1,119 @@ +package gregtech.api.metatileentity.implementations; + +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.Materials; +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.GTLanguageManager; + +public class MTEFrame extends MetaPipeEntity { + + private static final String localizedDescFormat = GTLanguageManager + .addStringLocalization("gt.blockmachines.gt_frame.desc.format", "Just something you can put covers on."); + public final Materials mMaterial; + + public MTEFrame(int aID, String aName, String aNameRegional, Materials aMaterial) { + super(aID, aName, aNameRegional, 0); + mMaterial = aMaterial; + // Hide TileEntity frame in NEI, since we have the block version now that should always be used + codechicken.nei.api.API.hideItem(this.getStackForm(1)); + } + + public MTEFrame(String aName, Materials aMaterial) { + super(aName, 0); + mMaterial = aMaterial; + } + + @Override + public byte getTileEntityBaseType() { + return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality))); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEFrame(mName, mMaterial); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, int connections, + int colorIndex, boolean active, boolean redstoneLevel) { + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex], + Dyes.getModulation(colorIndex, mMaterial.mRGBa)) }; + } + + @Override + public String[] getDescription() { + return localizedDescFormat.split("\\R"); + } + + @Override + public final boolean isSimpleMachine() { + return true; + } + + @Override + public final boolean isFacingValid(ForgeDirection facing) { + return false; + } + + @Override + public final boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public final boolean renderInside(ForgeDirection side) { + return true; + } + + @Override + public final float getThickNess() { + return 1.0F; + } + + @Override + public final void saveNBTData(NBTTagCompound aNBT) { + /* Do nothing */ + } + + @Override + public final void loadNBTData(NBTTagCompound aNBT) { + /* Do nothing */ + } + + @Override + public final boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public final boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public int connect(ForgeDirection side) { + return 0; + } + + @Override + public void disconnect(ForgeDirection side) { + /* Do nothing */ + } + + @Override + public boolean isMachineBlockUpdateRecursive() { + return true; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatch.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatch.java new file mode 100644 index 0000000000..bd0b3b6f61 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatch.java @@ -0,0 +1,250 @@ +package gregtech.api.metatileentity.implementations; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.crafting.ICraftingIconProvider; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +/** + * Handles texture changes internally. No special calls are necessary other than updateTexture in add***ToMachineList. + */ +public abstract class MTEHatch extends MTEBasicTank implements ICraftingIconProvider { + + public enum ConnectionType { + CABLE, + WIRELESS, + LASER + } + + /** + * Uses new texture changing methods to avoid limitations of byte as texture index... + */ + @Deprecated + public byte mMachineBlock = 0; + + private byte mTexturePage = 0; + private byte actualTexture = 0; + + private ItemStack ae2CraftingIcon; + + public MTEHatch(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, String aDescription, + ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEHatch(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, String[] aDescription, + ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEHatch(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEHatch(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public static int getSlots(int aTier) { + return aTier < 1 ? 1 : aTier == 1 ? 4 : aTier == 2 ? 9 : 16; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return new ITexture[0][0][0]; + } + + public abstract ITexture[] getTexturesActive(ITexture aBaseTexture); + + public abstract ITexture[] getTexturesInactive(ITexture aBaseTexture); + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + int texturePointer = (byte) (actualTexture & 0x7F); // just to be sure, from my testing the 8th bit cannot be + // set clientside + int textureIndex = texturePointer | (mTexturePage << 7); // Shift seven since one page is 128 textures! + try { + if (side != aFacing) { + if (textureIndex > 0) + return new ITexture[] { Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer] }; + else return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1] }; + } else { + if (textureIndex > 0) { + if (aActive) + return getTexturesActive(Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer]); + else return getTexturesInactive( + Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer]); + } else { + if (aActive) return getTexturesActive(Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1]); + else return getTexturesInactive(Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1]); + } + } + } catch (NullPointerException npe) { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[0][0] }; + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByte("mMachineBlock", actualTexture); + aNBT.setByte("mTexturePage", mTexturePage); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + actualTexture = aNBT.getByte("mMachineBlock"); + mTexturePage = aNBT.getByte("mTexturePage"); + + if (mTexturePage != 0 && GTValues.GT.isServerSide()) actualTexture |= 0x80; // <- lets just hope no one needs + // the correct value for that on + // server + mMachineBlock = actualTexture; + } + + /** + * Sets texture with page and index, called on add to machine list + * + * @param id (page<<7)+index of the texture + */ + public final void updateTexture(int id) { + onValueUpdate((byte) id); + onTexturePageUpdate((byte) (id >> 7)); + } + + /** + * Sets the icon for the owning multiblock used for AE2 crafting display of attached interfaces, called on add to + * machine list + */ + public final void updateCraftingIcon(ItemStack icon) { + this.ae2CraftingIcon = icon; + } + + @Override + public ItemStack getMachineCraftingIcon() { + return this.ae2CraftingIcon; + } + + /** + * Some multiblocks restrict hatches by tier. This method allows hatches to specify custom tier used for + * structure check, while keeping {@link #mTier} for other uses. + * + * @return Tier used for multiblock structure + */ + public byte getTierForStructure() { + return mTier; + } + + /** + * Sets texture with page and index, rather unusable, but kept FFS + * + * @param page page of texure + * @param index index of texure + */ + @Deprecated + public final void updateTexture(byte page, byte index) { + onValueUpdate(index); + onTexturePageUpdate(page); + } + + @Override + public final void onValueUpdate(byte aValue) { + actualTexture = (byte) (aValue & 0x7F); + mMachineBlock = actualTexture; + mTexturePage = 0; + } + + /** + * Get the maximum amount of amperes to work with, which excludes the additional amps in for loss + * + * @return Working amps + */ + public long maxWorkingAmperesIn() { + return maxAmperesIn(); + } + + /** + * Get the type of connection this hatch allows + * + * @return Connection type + */ + public ConnectionType getConnectionType() { + return ConnectionType.CABLE; + } + + @Override + public final byte getUpdateData() { + return (byte) (actualTexture & 0x7F); + } + + public final void onTexturePageUpdate(byte aValue) { + mTexturePage = (byte) (aValue & 0x7F); + if (mTexturePage != 0 && getBaseMetaTileEntity().isServerSide()) { // just to be sure + mMachineBlock |= 0x80; // <- lets just hope no one needs the correct value for that on server + actualTexture = mMachineBlock; + } + // set last bit to allow working of the page reset-er to 0 in rare case when texture id is the same but page + // changes to 0 + } + + public final byte getTexturePage() { + return (byte) (mTexturePage & 0x7F); + } + + @Override + public boolean doesFillContainers() { + return false; + } + + @Override + public boolean doesEmptyContainers() { + return false; + } + + @Override + public boolean canTankBeFilled() { + return false; + } + + @Override + public boolean canTankBeEmptied() { + return false; + } + + @Override + public boolean displaysItemStack() { + return false; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { // in that method since it is usually + // not overriden, especially for + // hatches. + if (actualTexture != mMachineBlock) { // revert to page 0 on edition of the field - old code way + actualTexture = (byte) (mMachineBlock & 0x7F); + mMachineBlock = actualTexture; // clear last bit in mMachineBlock since now we are at page 0 after the + // direct field + // change + mTexturePage = 0; // assuming old code only supports page 0 + } + super.onPreTick(aBaseMetaTileEntity, aTick); + } + + // To change to other page -> use the setter method -> updateTexture + + public int getCircuitSlot() { + return -1; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDataAccess.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDataAccess.java new file mode 100644 index 0000000000..38c3102ff2 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDataAccess.java @@ -0,0 +1,169 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DATA_ACCESS; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.AssemblyLineUtils; + +public class MTEHatchDataAccess extends MTEHatch implements IAddUIWidgets { + + private int timeout = 4; + + public MTEHatchDataAccess(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 16, + new String[] { "Data Access for Multiblocks", + "Adds " + (aTier == 4 ? 4 : 16) + " extra slots for Data Sticks" }); + } + + public MTEHatchDataAccess(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aTier == 4 ? 4 : 16, aDescription, aTextures); + } + + public MTEHatchDataAccess(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aTier == 4 ? 4 : 16, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_DATA_ACCESS) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_DATA_ACCESS) }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchDataAccess(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return mTier >= 8 && !aBaseMetaTileEntity.isActive(); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return mTier >= 8 && !aBaseMetaTileEntity.isActive(); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isActive()) { + timeout--; + if (timeout <= 0) { + aBaseMetaTileEntity.setActive(false); + } + } + } + + public void setActive(boolean mActive) { + getBaseMetaTileEntity().setActive(mActive); + timeout = mActive ? 4 : 0; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.getByte("mSticksUpdated") != 1) { + for (int i = 0; i < getSizeInventory(); i++) { + AssemblyLineUtils.processDataStick(getStackInSlot(i)); + } + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + // reminder: remove this marker after many years + aNBT.setByte("mSticksUpdated", (byte) 1); + } + + @Override + public void setInventorySlotContents(int aIndex, ItemStack aStack) { + super.setInventorySlotContents(aIndex, aStack); + AssemblyLineUtils.processDataStick(aStack); + } + + public List getInventoryItems(Predicate filter) { + ArrayList items = new ArrayList<>(); + IGregTechTileEntity te = getBaseMetaTileEntity(); + for (int i = 0; i < te.getSizeInventory(); ++i) { + ItemStack slot = te.getStackInSlot(i); + if (slot != null) { + if (filter != null && filter.test(slot)) { + items.add(slot); + } + } + } + return items; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + if (mTier == 4) { + getBaseMetaTileEntity() + .add2by2Slots(builder, getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_CIRCUIT); + } else { + getBaseMetaTileEntity() + .add4by4Slots(builder, getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_CIRCUIT); + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDynamo.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDynamo.java new file mode 100644 index 0000000000..00f46fe9eb --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchDynamo.java @@ -0,0 +1,109 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +public class MTEHatchDynamo extends MTEHatch { + + public MTEHatchDynamo(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { "Generating electric Energy from Multiblocks", "Puts out up to 1 Amp" }); + } + + public MTEHatchDynamo(int aID, String aName, String aNameRegional, int aTier, String[] aDescription) { + super(aID, aName, aNameRegional, aTier, 0, aDescription); + } + + public MTEHatchDynamo(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + public MTEHatchDynamo(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 512; + } + + @Override + public long maxEUOutput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return 512L + V[mTier + 1] * 2L; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchDynamo(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchEnergy.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchEnergy.java new file mode 100644 index 0000000000..12d22d3bc7 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchEnergy.java @@ -0,0 +1,123 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +public class MTEHatchEnergy extends MTEHatch { + + public MTEHatchEnergy(int aID, String aName, String aNameRegional, int aTier, String[] aDescription) { + super(aID, aName, aNameRegional, aTier, 0, aDescription); + } + + public MTEHatchEnergy(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { "Energy Injector for Multiblocks", "Accepts up to 2 Amps" }); + } + + public MTEHatchEnergy(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String[] aDescription, ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEHatchEnergy(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + public MTEHatchEnergy(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + public MTEHatchEnergy(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 512; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return 512L + V[mTier] * 8L; + } + + @Override + public long maxAmperesIn() { + return 2; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchEnergy(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInput.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInput.java new file mode 100644 index 0000000000..c660bcc8f8 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInput.java @@ -0,0 +1,192 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.GTMod; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTEHatchInput extends MTEHatch { + + public RecipeMap mRecipeMap = null; + + public MTEHatchInput(int aID, String aName, String aNameRegional, int aTier) { + this( + aID, + aName, + aNameRegional, + aTier, + new String[] { "Fluid Input for Multiblocks", + "Capacity: " + GTUtility.formatNumbers(8000L * (1L << aTier)) + "L" }); + } + + public MTEHatchInput(int aID, String aName, String aNameRegional, int aTier, String[] aDescription) { + this(aID, 3, aName, aNameRegional, aTier, aDescription); + } + + public MTEHatchInput(int aID, int aSlot, String aName, String aNameRegional, int aTier) { + this( + aID, + aSlot, + aName, + aNameRegional, + aTier, + new String[] { "Fluid Input for Multiblocks", "", "Can hold " + aSlot + " types of fluid." }); + mDescriptionArray[1] = "Capacity: " + GTUtility.formatNumbers(getCapacityPerTank(aTier, aSlot)) + "L"; + } + + public MTEHatchInput(int aID, int aSlot, String aName, String aNameRegional, int aTier, String[] aDescription) { + super(aID, aName, aNameRegional, aTier, aSlot, aDescription); + } + + public MTEHatchInput(int aID, String aName, String aNameRegional, int aTier, int allSlotCount, String[] strings) { + super(aID, aName, aNameRegional, aTier, allSlotCount, strings); + } + + public int getCapacityPerTank(int aTier, int aSlot) { + return (int) (8000L * (1L << aTier) / aSlot); + } + + public MTEHatchInput(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + public MTEHatchInput(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + public MTEHatchInput(String aName, int aSlots, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aSlots, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return GTMod.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 GTMod.gregtechproxy.mRenderIndicatorsOnHatch + ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) } + : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchInput(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (mRecipeMap != null) { + aNBT.setString("recipeMap", mRecipeMap.unlocalizedName); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("recipeMap")); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean doesFillContainers() { + // return true; + return false; + } + + @Override + public boolean doesEmptyContainers() { + return true; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return true; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + public void updateSlots() { + if (mInventory[getInputSlot()] != null && mInventory[getInputSlot()].stackSize <= 0) + mInventory[getInputSlot()] = null; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return mRecipeMap == null || mRecipeMap.containsInput(aFluid); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0 + && (mRecipeMap == null || mRecipeMap.containsInput(aStack) + || mRecipeMap.containsInput(GTUtility.getFluidForFilledItem(aStack, true))); + } + + @Override + public int getCapacity() { + return 8000 * (1 << mTier); + } + + @Override + public int getTankPressure() { + return -100; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInputBus.java new file mode 100644 index 0000000000..f4f04c38a3 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchInputBus.java @@ -0,0 +1,315 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; + +import gregtech.GTMod; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.IConfigurationCircuitSupport; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTClientPreference; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GT_TooltipDataCache; +import gregtech.api.util.extensions.ArrayExt; + +public class MTEHatchInputBus extends MTEHatch implements IConfigurationCircuitSupport, IAddUIWidgets { + + private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip"; + private static final String ONE_STACK_LIMIT_TOOLTIP = "GT5U.machines.one_stack_limit.tooltip"; + private static final int BUTTON_SIZE = 18; + + public RecipeMap mRecipeMap = null; + public boolean disableSort; + public boolean disableFilter = true; + public boolean disableLimited = true; + private int uiButtonCount = 0; + + public MTEHatchInputBus(int id, String name, String nameRegional, int tier) { + this(id, name, nameRegional, tier, getSlots(tier) + 1); + } + + protected MTEHatchInputBus(int id, String name, String nameRegional, int tier, int slots, String[] description) { + super(id, name, nameRegional, tier, slots, description); + } + + public MTEHatchInputBus(int id, String name, String nameRegional, int tier, int slots) { + super( + id, + name, + nameRegional, + tier, + slots, + ArrayExt.of( + "Item Input for Multiblocks", + "Shift + right click with screwdriver to turn Sort mode on/off", + "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : ""))); + } + + public MTEHatchInputBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + this(aName, aTier, getSlots(aTier) + 1, aDescription, aTextures); + } + + public MTEHatchInputBus(String aName, int aTier, int aSlots, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aSlots, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return GTMod.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 GTMod.gregtechproxy.mRenderIndicatorsOnHatch + ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) } + : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex != getCircuitSlot(); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchInputBus(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public int getCircuitSlotX() { + return 153; + } + + @Override + public int getCircuitSlotY() { + return 63; + } + + @Override + public void initDefaultModes(NBTTagCompound aNBT) { + if (!getBaseMetaTileEntity().getWorld().isRemote) { + GTClientPreference tPreference = GTMod.gregtechproxy + .getClientPreference(getBaseMetaTileEntity().getOwnerUuid()); + if (tPreference != null) disableFilter = !tPreference.isInputBusInitialFilterEnabled(); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) { + updateSlots(); + } + } + + public void updateSlots() { + for (int i = 0; i < mInventory.length - 1; i++) + if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; + if (!disableSort) fillStacksIntoFirstSlots(); + } + + protected void fillStacksIntoFirstSlots() { + final int L = mInventory.length - 1; + HashMap slots = new HashMap<>(L); + HashMap stacks = new HashMap<>(L); + List order = new ArrayList<>(L); + List validSlots = new ArrayList<>(L); + for (int i = 0; i < L; i++) { + if (!isValidSlot(i)) continue; + validSlots.add(i); + ItemStack s = mInventory[i]; + if (s == null) continue; + GTUtility.ItemId sID = GTUtility.ItemId.createNoCopy(s); + slots.merge(sID, s.stackSize, Integer::sum); + if (!stacks.containsKey(sID)) stacks.put(sID, s); + order.add(sID); + mInventory[i] = null; + } + int slotindex = 0; + for (GTUtility.ItemId sID : order) { + int toSet = slots.get(sID); + if (toSet == 0) continue; + int slot = validSlots.get(slotindex); + slotindex++; + mInventory[slot] = stacks.get(sID) + .copy(); + toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); + mInventory[slot].stackSize = toSet; + slots.merge(sID, toSet, (a, b) -> a - b); + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("disableSort", disableSort); + aNBT.setBoolean("disableFilter", disableFilter); + aNBT.setBoolean("disableLimited", disableLimited); + if (mRecipeMap != null) { + aNBT.setString("recipeMap", mRecipeMap.unlocalizedName); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + disableSort = aNBT.getBoolean("disableSort"); + disableFilter = aNBT.getBoolean("disableFilter"); + if (aNBT.hasKey("disableLimited")) { + disableLimited = aNBT.getBoolean("disableLimited"); + } + mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("recipeMap")); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) + .isGUIClickable()) return; + if (aPlayer.isSneaking()) { + if (disableSort) { + disableSort = false; + } else { + if (disableLimited) { + disableLimited = false; + } else { + disableSort = true; + disableLimited = true; + } + } + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.hatch.disableSort." + disableSort) + " " + + StatCollector.translateToLocal("GT5U.hatch.disableLimited." + disableLimited)); + } else { + disableFilter = !disableFilter; + GTUtility + .sendChatToPlayer(aPlayer, StatCollector.translateToLocal("GT5U.hatch.disableFilter." + disableFilter)); + } + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (aIndex == getCircuitSlot()) return false; + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == getBaseMetaTileEntity().getFrontFacing() && aIndex != getCircuitSlot() + && (mRecipeMap == null || disableFilter || mRecipeMap.containsInput(aStack)) + && (disableLimited || limitedAllowPutStack(aIndex, aStack)); + } + + protected boolean limitedAllowPutStack(int aIndex, ItemStack aStack) { + for (int i = 0; i < getSizeInventory(); i++) + if (GTUtility.areStacksEqual(GTOreDictUnificator.get_nocopy(aStack), mInventory[i])) return i == aIndex; + return mInventory[aIndex] == null; + } + + @Override + public boolean allowSelectCircuit() { + return true; + } + + @Override + public int getCircuitSlot() { + return getSlots(mTier); + } + + private void addSortStacksButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> !disableSort, + val -> disableSort = !val, + GTUITextures.OVERLAY_BUTTON_SORTING_MODE, + () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP))); + } + + private void addOneStackLimitButton(ModularWindow.Builder builder) { + builder.widget(createToggleButton(() -> !disableLimited, val -> { + disableLimited = !val; + updateSlots(); + }, GTUITextures.OVERLAY_BUTTON_ONE_STACK_LIMIT, () -> mTooltipCache.getData(ONE_STACK_LIMIT_TOOLTIP))); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + buildContext.addCloseListener(() -> uiButtonCount = 0); + addSortStacksButton(builder); + addOneStackLimitButton(builder); + // Remove one for ghost circuit slot + int slotCount = getSizeInventory(); + if (allowSelectCircuit()) { + slotCount = slotCount - 1; + } + // We do this to decouple slot count from tier in here, since there is no reason to do so. + switch (slotCount) { + case 1 -> getBaseMetaTileEntity().add1by1Slot(builder); + case 4 -> getBaseMetaTileEntity().add2by2Slots(builder); + case 9 -> getBaseMetaTileEntity().add3by3Slots(builder); + case 16 -> getBaseMetaTileEntity().add4by4Slots(builder); + default -> {} + } + } + + private Widget createToggleButton(Supplier getter, Consumer setter, UITexture picture, + Supplier tooltipDataSupplier) { + return new CycleButtonWidget().setToggle(getter, setter) + .setStaticTexture(picture) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62) + .setSize(BUTTON_SIZE, BUTTON_SIZE) + .setGTTooltip(tooltipDataSupplier); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMagnet.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMagnet.java new file mode 100644 index 0000000000..660894d0df --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMagnet.java @@ -0,0 +1,102 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_EMS_HOUSING; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_EMS_HOUSING_GLOW; + +import net.minecraft.entity.player.EntityPlayer; +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.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.common.tileentities.machines.multi.MTEIndustrialElectromagneticSeparator; + +public class MTEHatchMagnet extends MTEHatch { + + public MTEHatchMagnet(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, 5, 1, "Holds electromagnet for the Magnetic Flux Exhibitor"); + } + + public MTEHatchMagnet(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription[0], aTextures); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public String[] getDescription() { + return ArrayUtils.addAll(this.mDescriptionArray, AuthorFourIsTheNumber); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new SlotWidget(inventoryHandler, 0).setFilter(MTEIndustrialElectromagneticSeparator::isValidElectromagnet) + .setAccess(true, true) + .setPos(79, 34)); + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.builder() + .addIcon(OVERLAY_EMS_HOUSING) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_EMS_HOUSING_GLOW) + .extFacing() + .glow() + .build() }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.builder() + .addIcon(OVERLAY_EMS_HOUSING) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_EMS_HOUSING_GLOW) + .extFacing() + .glow() + .build() }; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchMagnet(mName, mTier, mDescriptionArray, mTextures); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMaintenance.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMaintenance.java new file mode 100644 index 0000000000..3a715a541a --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMaintenance.java @@ -0,0 +1,455 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_IDLE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_IDLE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DUCTTAPE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MAINTENANCE; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.IAlignment; +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; +import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.common.network.NetworkRegistry; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import ic2.core.IHasGui; +import ic2.core.item.ItemToolbox; + +public class MTEHatchMaintenance extends MTEHatch implements IAddUIWidgets, IAlignment { + + private Rotation rotation = Rotation.NORMAL; + + private static ItemStack[] sAutoMaintenanceInputs; + public boolean mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false, + mSolderingTool = false, mCrowbar = false, mAuto; + + public MTEHatchMaintenance(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 1, "For maintaining Multiblocks"); + mAuto = false; + } + + public MTEHatchMaintenance(int aID, String aName, String aNameRegional, int aTier, boolean aAuto) { + super(aID, aName, aNameRegional, aTier, 4, "For automatically maintaining Multiblocks"); + mAuto = aAuto; + } + + public MTEHatchMaintenance(String aName, int aTier, String aDescription, ITexture[][][] aTextures, boolean aAuto) { + super(aName, aTier, aAuto ? 4 : 1, aDescription, aTextures); + mAuto = aAuto; + } + + public MTEHatchMaintenance(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, + boolean aAuto) { + super(aName, aTier, aAuto ? 4 : 1, aDescription, aTextures); + mAuto = aAuto; + } + + private static ItemStack[] getAutoMaintenanceInputs() { + if (sAutoMaintenanceInputs == null) sAutoMaintenanceInputs = new ItemStack[] { ItemList.Duct_Tape.get(4), + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Lubricant, 2), + GTOreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 2) }; + return sAutoMaintenanceInputs; + } + + @Override + public String[] getDescription() { + String[] desc; + if (mAuto) { + desc = new String[mDescriptionArray.length + 3]; + System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); + desc[mDescriptionArray.length] = "4 Ducttape, 2 Lubricant Cells"; + desc[mDescriptionArray.length + 1] = "4 Steel Screws, 2 HV Circuits"; + desc[mDescriptionArray.length + 2] = "For each autorepair"; + } else { + desc = new String[mDescriptionArray.length + 1]; + System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); + desc[mDescriptionArray.length] = "Cannot be shared between Multiblocks!"; + } + return desc; + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + if (mAuto) return new ITexture[] { aBaseTexture, TextureFactory.builder() + .addIcon(OVERLAY_AUTOMAINTENANCE_IDLE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_AUTOMAINTENANCE_IDLE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { aBaseTexture, TextureFactory.builder() + .addIcon(OVERLAY_MAINTENANCE) + .extFacing() + .build() }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + if (mAuto) return new ITexture[] { aBaseTexture, TextureFactory.builder() + .addIcon(OVERLAY_AUTOMAINTENANCE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_AUTOMAINTENANCE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { aBaseTexture, TextureFactory.builder() + .addIcon(OVERLAY_MAINTENANCE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_DUCTTAPE) + .extFacing() + .build() }; + } + + @Override + public void initDefaultModes(NBTTagCompound aNBT) { + getBaseMetaTileEntity().setActive(true); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return mAuto && GTMod.gregtechproxy.mAMHInteraction; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + if (aTileEntity.getMetaTileID() == 111) + return new MTEHatchMaintenance(mName, mTier, mDescriptionArray, mTextures, true); + return new MTEHatchMaintenance(mName, mTier, mDescriptionArray, mTextures, false); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + if (aBaseMetaTileEntity.isClientSide()) return true; + if (side == aBaseMetaTileEntity.getFrontFacing()) { + // only allow OC robot fake player + if (aPlayer instanceof FakePlayer && !aPlayer.getGameProfile() + .getName() + .endsWith(".robot")) return false; + ItemStack tStack = aPlayer.getCurrentEquippedItem(); + if (tStack != null) { + if (tStack.getItem() instanceof ItemToolbox) { + applyToolbox(tStack, aPlayer); + } else if (ItemList.Duct_Tape.isStackEqual(tStack)) { + mWrench = mScrewdriver = mSoftHammer = mHardHammer = mCrowbar = mSolderingTool = true; + getBaseMetaTileEntity().setActive(false); + if (--tStack.stackSize == 0) { + aPlayer.inventory.mainInventory[aPlayer.inventory.currentItem] = null; + } + } else GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + } else { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + } + return true; + } + return false; + } + + public void updateSlots() { + for (int i = 0; i < mInventory.length; i++) + if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + if (aBaseMetaTileEntity.isClientSide()) + StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide() && mAuto && aTick % 100L == 0L) { + aBaseMetaTileEntity.setActive(!isRecipeInputEqual(false)); + } + } + + @Override + public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, + float aX, float aY, float aZ) { + if (wrenchingSide != getBaseMetaTileEntity().getFrontFacing()) + return super.onWrenchRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); + if (!entityPlayer.isSneaking() && isRotationChangeAllowed()) { + toolSetRotation(null); + return true; + } + return false; + } + + public boolean autoMaintainance() { + return isRecipeInputEqual(true); + } + + public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess) { + ItemStack[] mInputs = getAutoMaintenanceInputs(); + + int amt; + + for (ItemStack tStack : mInputs) { + if (tStack != null) { + amt = tStack.stackSize; + boolean temp = true; + for (ItemStack aStack : mInventory) { + if ((GTUtility.areUnificationsEqual(aStack, tStack, true) + || GTUtility.areUnificationsEqual(GTOreDictUnificator.get(false, aStack), tStack, true))) { + amt -= aStack.stackSize; + if (amt < 1) { + temp = false; + break; + } + } + } + if (temp) return false; + } + } + + if (aDecreaseStacksizeBySuccess) { + for (ItemStack tStack : mInputs) { + if (tStack != null) { + amt = tStack.stackSize; + for (ItemStack aStack : mInventory) { + if ((GTUtility.areUnificationsEqual(aStack, tStack, true) + || GTUtility.areUnificationsEqual(GTOreDictUnificator.get(false, aStack), tStack, true))) { + if (aStack.stackSize < amt) { + amt -= aStack.stackSize; + aStack.stackSize = 0; + } else { + aStack.stackSize -= amt; + amt = 0; + break; + } + } + } + } + } + mCrowbar = true; + mHardHammer = true; + mScrewdriver = true; + mSoftHammer = true; + mSolderingTool = true; + mWrench = true; + updateSlots(); + } + return true; + } + + public void onToolClick(ItemStack aStack, EntityLivingBase aPlayer, IInventory aToolboxInventory) { + if (aStack == null || aPlayer == null) return; + + // Allow IC2 Toolbox with tools to function for maint issues. + if (aStack.getItem() instanceof ItemToolbox && aPlayer instanceof EntityPlayer) { + applyToolbox(aStack, (EntityPlayer) aPlayer); + return; + } + + if (GTUtility.isStackInList(aStack, GregTechAPI.sWrenchList) && !mWrench + && GTModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mWrench = true; + if (GTUtility.isStackInList(aStack, GregTechAPI.sScrewdriverList) && !mScrewdriver + && GTModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mScrewdriver = true; + if (GTUtility.isStackInList(aStack, GregTechAPI.sSoftHammerList) && !mSoftHammer + && GTModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mSoftHammer = true; + if (GTUtility.isStackInList(aStack, GregTechAPI.sHardHammerList) && !mHardHammer + && GTModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mHardHammer = true; + if (GTUtility.isStackInList(aStack, GregTechAPI.sCrowbarList) && !mCrowbar + && GTModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mCrowbar = true; + if (!mSolderingTool && GTModHandler.useSolderingIron(aStack, aPlayer, aToolboxInventory)) mSolderingTool = true; + if (GTOreDictUnificator.isItemStackInstanceOf(aStack, "craftingDuctTape")) { + mWrench = mScrewdriver = mSoftHammer = mHardHammer = mCrowbar = mSolderingTool = true; + getBaseMetaTileEntity().setActive(false); + aStack.stackSize--; + } + if (mSolderingTool && aPlayer instanceof EntityPlayerMP tPlayer) { + try { + GTMod.achievements.issueAchievement(tPlayer, "maintainance"); + } catch (Exception ignored) {} + } + } + + public void onToolClick(ItemStack aStack, EntityLivingBase aPlayer) { + onToolClick(aStack, aPlayer, null); + } + + private void applyToolbox(ItemStack aStack, EntityPlayer aPlayer) { + final ItemToolbox aToolbox = (ItemToolbox) aStack.getItem(); + final IHasGui aToolboxGUI = aToolbox.getInventory(aPlayer, aStack); + for (int i = 0; i < aToolboxGUI.getSizeInventory(); i++) { + if (aToolboxGUI.getStackInSlot(i) != null) { + onToolClick(aToolboxGUI.getStackInSlot(i), aPlayer, aToolboxGUI); + if (aToolboxGUI.getStackInSlot(i) != null && aToolboxGUI.getStackInSlot(i).stackSize <= 0) + aToolboxGUI.setInventorySlotContents(i, null); + } + } + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return mAuto && GTMod.gregtechproxy.mAMHInteraction; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (mAuto && GTMod.gregtechproxy.mAMHInteraction) { + for (int i = 0; i < getSizeInventory(); i++) if (GTUtility.areStacksEqual( + GTOreDictUnificator.get(false, aStack), + GTOreDictUnificator.get(false, getStackInSlot(i)))) return i == aIndex; + for (ItemStack tInput : getAutoMaintenanceInputs()) if (GTUtility.areUnificationsEqual(tInput, aStack, true) + || GTUtility.areUnificationsEqual(GTOreDictUnificator.get(false, aStack), tInput, true)) return true; + } + return false; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + if (mAuto) { + getBaseMetaTileEntity().add2by2Slots(builder); + } else { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.SLOT_MAINTENANCE) + .setPos(78, 33) + .setSize(20, 20)) + .widget(new SlotWidget(BaseSlot.empty()) { + + @Override + public boolean handleDragAndDrop(ItemStack draggedStack, int button) { + return false; + } + + @Override + protected void phantomClick(ClickData clickData, ItemStack cursorStack) { + if (cursorStack == null) return; + onToolClick(cursorStack, getContext().getPlayer()); + if (cursorStack.stackSize < 1) { + getContext().getPlayer().inventory.setItemStack(null); + } + if (getContext().getPlayer() instanceof EntityPlayerMP) { + ((EntityPlayerMP) getContext().getPlayer()).updateHeldItem(); + } + } + }.disableShiftInsert() + .setBackground(GTUITextures.TRANSPARENT) + .setPos(79, 34)) + .widget( + new TextWidget("Click with Tool to repair.").setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(8, 12)); + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByte("mRotation", (byte) rotation.getIndex()); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + rotation = Rotation.byIndex(aNBT.getByte("mRotation")); + super.loadNBTData(aNBT); + } + + @Override + public ExtendedFacing getExtendedFacing() { + return ExtendedFacing.of(getBaseMetaTileEntity().getFrontFacing(), rotation, Flip.NONE); + } + + @Override + public void setExtendedFacing(ExtendedFacing alignment) { + boolean changed = false; + final IGregTechTileEntity base = getBaseMetaTileEntity(); + if (base.getFrontFacing() != alignment.getDirection()) { + base.setFrontFacing(alignment.getDirection()); + changed = true; + } + if (rotation != alignment.getRotation()) { + rotation = alignment.getRotation(); + changed = true; + } + if (changed) { + if (base.isServerSide() && !GregTechAPI.isDummyWorld(base.getWorld())) { + StructureLibAPI.sendAlignment( + (IAlignmentProvider) base, + new NetworkRegistry.TargetPoint( + base.getWorld().provider.dimensionId, + base.getXCoord(), + base.getYCoord(), + base.getZCoord(), + 512)); + } else { + base.issueTextureUpdate(); + } + } + } + + @Override + public IAlignmentLimits getAlignmentLimits() { + return (d, r, f) -> f.isNotFlipped(); + } + + @Override + public boolean isFlipChangeAllowed() { + return false; + } + + @Override + public boolean isRotationChangeAllowed() { + return true; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java new file mode 100644 index 0000000000..179ba56254 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java @@ -0,0 +1,208 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MUFFLER; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.enums.ParticleFX; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.WorldSpawnedEventBuilder; +import gregtech.common.Pollution; + +@SuppressWarnings("unused") // Unused API is expected within scope +public class MTEHatchMuffler extends MTEHatch { + + private static final String localizedDescFormat = GTLanguageManager.addStringLocalization( + "gt.blockmachines.hatch.muffler.desc.format", + "Outputs the Pollution (Might cause ... things)%n" + "DO NOT OBSTRUCT THE OUTPUT!%n" + + "Reduces Pollution to %d%%%n" + + "Recovers %d%% of CO2/CO/SO2"); + private final int pollutionReduction = calculatePollutionReduction(100); + private final int pollutionRecover = 100 - pollutionReduction; + private final String[] description = String.format(localizedDescFormat, pollutionReduction, pollutionRecover) + .split("\\R"); + + public MTEHatchMuffler(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, ""); + } + + public MTEHatchMuffler(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String[] aDescription, ITexture... aTextures) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEHatchMuffler(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + this(aName, aTier, new String[] { aDescription }, aTextures); + } + + public MTEHatchMuffler(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + this(aName, aTier, 0, aDescription, aTextures); + } + + public MTEHatchMuffler(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public String[] getDescription() { + return description; + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_MUFFLER) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_MUFFLER) }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchMuffler(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isClientSide() && this.getBaseMetaTileEntity() + .isActive()) { + pollutionParticles( + this.getBaseMetaTileEntity() + .getWorld(), + ParticleFX.LARGE_SMOKE.toString()); + } + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @SideOnly(Side.CLIENT) + public void pollutionParticles(World aWorld, String name) { + boolean chk1, chk2, chk3; + float ran1 = XSTR_INSTANCE.nextFloat(), ran2, ran3; + chk1 = ran1 * 100 < calculatePollutionReduction(100); + if (Pollution.getPollution(getBaseMetaTileEntity()) >= GTMod.gregtechproxy.mPollutionSmogLimit) { + ran2 = XSTR_INSTANCE.nextFloat(); + ran3 = XSTR_INSTANCE.nextFloat(); + chk2 = ran2 * 100 < calculatePollutionReduction(100); + chk3 = ran3 * 100 < calculatePollutionReduction(100); + if (!(chk1 || chk2 || chk3)) return; + } else { + if (!chk1) return; + ran2 = ran3 = 0.0F; + chk2 = chk3 = false; + } + + final IGregTechTileEntity aMuffler = this.getBaseMetaTileEntity(); + final ForgeDirection aDir = aMuffler.getFrontFacing(); + final float xPos = aDir.offsetX * 0.76F + aMuffler.getXCoord() + 0.25F; + final float yPos = aDir.offsetY * 0.76F + aMuffler.getYCoord() + 0.25F; + final float zPos = aDir.offsetZ * 0.76F + aMuffler.getZCoord() + 0.25F; + + final float ySpd = aDir.offsetY * 0.1F + 0.2F + 0.1F * XSTR_INSTANCE.nextFloat(); + final float xSpd; + final float zSpd; + + if (aDir.offsetY == -1) { + final float temp = XSTR_INSTANCE.nextFloat() * 2 * (float) Math.PI; + xSpd = (float) Math.sin(temp) * 0.1F; + zSpd = (float) Math.cos(temp) * 0.1F; + } else { + xSpd = aDir.offsetX * (0.1F + 0.2F * XSTR_INSTANCE.nextFloat()); + zSpd = aDir.offsetZ * (0.1F + 0.2F * XSTR_INSTANCE.nextFloat()); + } + + final WorldSpawnedEventBuilder.ParticleEventBuilder events = new WorldSpawnedEventBuilder.ParticleEventBuilder() + .setIdentifier(name) + .setWorld(aWorld) + .setMotion(xSpd, ySpd, zSpd); + + if (chk1) { + events + .setPosition( + xPos + ran1 * 0.5F, + yPos + XSTR_INSTANCE.nextFloat() * 0.5F, + zPos + XSTR_INSTANCE.nextFloat() * 0.5F) + .run(); + } + if (chk2) { + events + .setPosition( + xPos + ran2 * 0.5F, + yPos + XSTR_INSTANCE.nextFloat() * 0.5F, + zPos + XSTR_INSTANCE.nextFloat() * 0.5F) + .run(); + } + if (chk3) { + events + .setPosition( + xPos + ran3 * 0.5F, + yPos + XSTR_INSTANCE.nextFloat() * 0.5F, + zPos + XSTR_INSTANCE.nextFloat() * 0.5F) + .run(); + } + } + + public int calculatePollutionReduction(int aPollution) { + if (mTier < 2) { + return aPollution; + } + return (int) ((float) aPollution * ((100F - 12.5F * ((float) mTier - 1F)) / 100F)); + } + + /** + * @param mte The multi-block controller's {@link MetaTileEntity} MetaTileEntity is passed so newer muffler hatches + * can do wacky things with the multis + * @return pollution success + */ + public boolean polluteEnvironment(MetaTileEntity mte) { + if (getBaseMetaTileEntity().getAirAtSide(getBaseMetaTileEntity().getFrontFacing())) { + Pollution.addPollution(getBaseMetaTileEntity(), calculatePollutionReduction(10000)); + return true; + } + return false; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMultiInput.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMultiInput.java new file mode 100644 index 0000000000..9bf061573b --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMultiInput.java @@ -0,0 +1,299 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_INPUT_HATCH_2x2; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; + +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; + +public class MTEHatchMultiInput extends MTEHatchInput implements IAddUIWidgets { + + private final FluidStack[] mStoredFluid; + private final FluidStackTank[] fluidTanks; + public final int mCapacityPer; + + public MTEHatchMultiInput(int aID, int aSlot, String aName, String aNameRegional, int aTier) { + super(aID, aSlot, aName, aNameRegional, aTier); + this.mStoredFluid = new FluidStack[aSlot]; + fluidTanks = new FluidStackTank[aSlot]; + mCapacityPer = getCapacityPerTank(aTier, aSlot); + } + + public MTEHatchMultiInput(int aID, int aSlot, String aName, String aNameRegional, int aTier, + String[] aDescription) { + super(aID, aSlot, aName, aNameRegional, aTier, aDescription); + this.mStoredFluid = new FluidStack[aSlot]; + fluidTanks = new FluidStackTank[aSlot]; + mCapacityPer = getCapacityPerTank(aTier, aSlot); + } + + public MTEHatchMultiInput(String aName, int aSlot, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aSlot, aTier, aDescription, aTextures); + this.mStoredFluid = new FluidStack[aSlot]; + fluidTanks = new FluidStackTank[aSlot]; + mCapacityPer = getCapacityPerTank(aTier, aSlot); + for (int i = 0; i < aSlot; i++) { + final int index = i; + fluidTanks[i] = new FluidStackTank( + () -> mStoredFluid[index], + fluid -> mStoredFluid[index] = fluid, + mCapacityPer); + } + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchMultiInput(mName, getMaxType(), mTier, mDescriptionArray, mTextures); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (mStoredFluid != null) { + for (int i = 0; i < mStoredFluid.length; i++) { + if (mStoredFluid[i] != null) + aNBT.setTag("mFluid" + i, mStoredFluid[i].writeToNBT(new NBTTagCompound())); + } + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (mStoredFluid != null) { + for (int i = 0; i < mStoredFluid.length; i++) { + if (aNBT.hasKey("mFluid" + i)) { + mStoredFluid[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid" + i)); + } + } + } + } + + @Override + public boolean displaysStackSize() { + return true; + } + + public FluidStack[] getStoredFluid() { + return mStoredFluid; + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_INPUT_HATCH_2x2) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_INPUT_HATCH_2x2) }; + } + + public int getMaxType() { + return mStoredFluid.length; + } + + @Override + public FluidStack getFluid() { + for (FluidStack tFluid : mStoredFluid) { + if (tFluid != null && tFluid.amount > 0) return tFluid; + } + return null; + } + + public FluidStack getFluid(int aSlot) { + if (mStoredFluid == null || aSlot < 0 || aSlot >= getMaxType()) return null; + return mStoredFluid[aSlot]; + } + + @Override + public int getFluidAmount() { + if (getFluid() != null) { + return getFluid().amount; + } + return 0; + } + + @Override + public int getCapacity() { + return mCapacityPer; + } + + public int getFirstEmptySlot() { + for (int i = 0; i < mStoredFluid.length; i++) { + if (mStoredFluid[i] == null) return i; + } + return -1; + } + + public boolean hasFluid(FluidStack aFluid) { + if (aFluid == null) return false; + for (FluidStack tFluid : mStoredFluid) { + if (aFluid.isFluidEqual(tFluid)) return true; + } + return false; + } + + public int getFluidSlot(FluidStack tFluid) { + if (tFluid == null) return -1; + for (int i = 0; i < mStoredFluid.length; i++) { + if (tFluid.equals(mStoredFluid[i])) return i; + } + return -1; + } + + public int getFluidAmount(FluidStack tFluid) { + int tSlot = getFluidSlot(tFluid); + if (tSlot != -1) { + return mStoredFluid[tSlot].amount; + } + return 0; + } + + public void setFluid(FluidStack aFluid, int aSlot) { + if (aSlot < 0 || aSlot >= getMaxType()) return; + mStoredFluid[aSlot] = aFluid; + } + + public void addFluid(FluidStack aFluid, int aSlot) { + if (aSlot < 0 || aSlot >= getMaxType()) return; + if (aFluid.equals(mStoredFluid[aSlot])) mStoredFluid[aSlot].amount += aFluid.amount; + if (mStoredFluid[aSlot] == null) mStoredFluid[aSlot] = aFluid.copy(); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + mFluid = getFluid(); + } + super.onPreTick(aBaseMetaTileEntity, aTick); + } + + @Override + public int fill(FluidStack aFluid, boolean doFill) { + if (aFluid == null || aFluid.getFluid() + .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0; + if (!hasFluid(aFluid) && getFirstEmptySlot() != -1) { + int tFilled = Math.min(aFluid.amount, mCapacityPer); + if (doFill) { + FluidStack tFluid = aFluid.copy(); + tFluid.amount = tFilled; + addFluid(tFluid, getFirstEmptySlot()); + getBaseMetaTileEntity().markDirty(); + } + return tFilled; + } + if (hasFluid(aFluid)) { + int tLeft = mCapacityPer - getFluidAmount(aFluid); + int tFilled = Math.min(tLeft, aFluid.amount); + if (doFill) { + FluidStack tFluid = aFluid.copy(); + tFluid.amount = tFilled; + addFluid(tFluid, getFluidSlot(tFluid)); + getBaseMetaTileEntity().markDirty(); + } + return tFilled; + } + return 0; + } + + @Override + public FluidStack drain(int maxDrain, boolean doDrain) { + if (getFluid() == null || !canTankBeEmptied()) return null; + if (getFluid().amount <= 0 && isFluidChangingAllowed()) { + setFluid(null, getFluidSlot(getFluid())); + getBaseMetaTileEntity().markDirty(); + return null; + } + FluidStack tRemove = getFluid().copy(); + tRemove.amount = Math.min(maxDrain, tRemove.amount); + if (doDrain) { + getFluid().amount -= tRemove.amount; + getBaseMetaTileEntity().markDirty(); + } + if (getFluid() == null || getFluid().amount <= 0 && isFluidChangingAllowed()) { + setFluid(null, getFluidSlot(getFluid())); + getBaseMetaTileEntity().markDirty(); + } + return tRemove; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + return fill(resource, doFill); + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack aFluid, boolean doDrain) { + if (aFluid == null || !hasFluid(aFluid)) return null; + FluidStack tStored = mStoredFluid[getFluidSlot(aFluid)]; + if (tStored.amount <= 0 && isFluidChangingAllowed()) { + setFluid(null, getFluidSlot(tStored)); + getBaseMetaTileEntity().markDirty(); + return null; + } + FluidStack tRemove = tStored.copy(); + tRemove.amount = Math.min(aFluid.amount, tRemove.amount); + if (doDrain) { + tStored.amount -= tRemove.amount; + getBaseMetaTileEntity().markDirty(); + } + if (tStored.amount <= 0 && isFluidChangingAllowed()) { + setFluid(null, getFluidSlot(tStored)); + getBaseMetaTileEntity().markDirty(); + } + return tRemove; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + FluidTankInfo[] FTI = new FluidTankInfo[getMaxType()]; + for (int i = 0; i < getMaxType(); i++) { + FTI[i] = new FluidTankInfo(mStoredFluid[i], mCapacityPer); + } + return FTI; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && mStoredFluid != null) { + for (int i = 0; i < getMaxType(); i++) { + if (mStoredFluid[i] != null && mStoredFluid[i].amount <= 0) { + mStoredFluid[i] = null; + } + } + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex >= 4; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + final int SLOT_NUMBER = 4; + final Pos2d[] positions = new Pos2d[] { new Pos2d(70, 25), new Pos2d(88, 25), new Pos2d(70, 43), + new Pos2d(88, 43), }; + + for (int i = 0; i < SLOT_NUMBER; i++) { + builder.widget( + new FluidSlotWidget(fluidTanks[i]).setBackground(ModularUITextures.FLUID_SLOT) + .setPos(positions[i])); + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutput.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutput.java new file mode 100644 index 0000000000..3a9dd0dc96 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutput.java @@ -0,0 +1,493 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; + +import java.lang.ref.WeakReference; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; + +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.GTMod; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.fluid.IFluidStore; +import gregtech.api.interfaces.metatileentity.IFluidLockable; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.common.gui.modularui.widget.FluidLockWidget; + +public class MTEHatchOutput extends MTEHatch implements IFluidStore, IFluidLockable, IAddUIWidgets { + + private String lockedFluidName = null; + private WeakReference playerThatLockedfluid = null; + public byte mMode = 0; + + public MTEHatchOutput(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 4, + new String[] { "Fluid Output for Multiblocks", + "Capacity: " + GTUtility.formatNumbers(8000L * (1L << aTier)) + "L", + "Right click with screwdriver to restrict output", + "Can be restricted to put out Items and/or Steam/No Steam/1 specific Fluid", + "Restricted Output Hatches are given priority for Multiblock Fluid output" }); + } + + public MTEHatchOutput(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures); + } + + public MTEHatchOutput(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures); + } + + public MTEHatchOutput(int aID, String aName, String aNameRegional, int aTier, String[] aDescription, + int inventorySize) { + super(aID, aName, aNameRegional, aTier, inventorySize, aDescription); + } + + public MTEHatchOutput(String name, int tier, int slots, String[] description, ITexture[][][] textures) { + super(name, tier, slots, description, textures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return GTMod.gregtechproxy.mRenderIndicatorsOnHatch + ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) } + : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return GTMod.gregtechproxy.mRenderIndicatorsOnHatch + ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) } + : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return false; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchOutput(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && mFluid != null) { + IFluidHandler tTileEntity = aBaseMetaTileEntity + .getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing()); + if (tTileEntity != null) { + GTUtility.moveFluid( + aBaseMetaTileEntity, + tTileEntity, + aBaseMetaTileEntity.getFrontFacing(), + Math.max(1, mFluid.amount), + null); + } + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByte("mMode", mMode); + if (isFluidLocked() && lockedFluidName != null && lockedFluidName.length() != 0) + aNBT.setString("lockedFluidName", lockedFluidName); + else aNBT.removeTag("lockedFluidName"); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mMode = aNBT.getByte("mMode"); + if (isFluidLocked()) { + lockedFluidName = aNBT.getString("lockedFluidName"); + } + lockedFluidName = GTUtility.isStringInvalid(lockedFluidName) ? null : lockedFluidName; + } + + @Override + public boolean doesFillContainers() { + return true; + } + + @Override + public boolean doesEmptyContainers() { + return false; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return true; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + public int getLockedDisplaySlot() { + return 3; + } + + @Override + public boolean isValidSlot(int aIndex) { + // Because getStackDisplaySlot() only allow return one int, this place I only can manually set. + return aIndex != getStackDisplaySlot() && aIndex != getLockedDisplaySlot(); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0; + } + + @Override + public int getCapacity() { + return 8000 * (1 << mTier); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) + .isGUIClickable()) return; + if (aPlayer.isSneaking()) { + mMode = (byte) ((mMode + 9) % 10); + } else { + mMode = (byte) ((mMode + 1) % 10); + } + final String inBrackets; + switch (mMode) { + case 0 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("108", "Outputs misc. Fluids, Steam and Items")); + this.setLockedFluidName(null); + } + case 1 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("109", "Outputs Steam and Items")); + this.setLockedFluidName(null); + } + case 2 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("110", "Outputs Steam and misc. Fluids")); + this.setLockedFluidName(null); + } + case 3 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("111", "Outputs Steam")); + this.setLockedFluidName(null); + } + case 4 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("112", "Outputs misc. Fluids and Items")); + this.setLockedFluidName(null); + } + case 5 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("113", "Outputs only Items")); + this.setLockedFluidName(null); + } + case 6 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("114", "Outputs only misc. Fluids")); + this.setLockedFluidName(null); + } + case 7 -> { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("115", "Outputs nothing")); + this.setLockedFluidName(null); + } + case 8 -> { + playerThatLockedfluid = new WeakReference<>(aPlayer); + if (mFluid == null) { + this.setLockedFluidName(null); + inBrackets = GTUtility.trans( + "115.3", + "currently none, will be locked to the next that is put in (or use fluid cell to lock)"); + } else { + this.setLockedFluidName( + this.getDrainableStack() + .getFluid() + .getName()); + inBrackets = this.getDrainableStack() + .getLocalizedName(); + } + GTUtility.sendChatToPlayer( + aPlayer, + String + .format("%s (%s)", GTUtility.trans("151.1", "Outputs items and 1 specific Fluid"), inBrackets)); + } + case 9 -> { + playerThatLockedfluid = new WeakReference<>(aPlayer); + if (mFluid == null) { + this.setLockedFluidName(null); + inBrackets = GTUtility.trans( + "115.3", + "currently none, will be locked to the next that is put in (or use fluid cell to lock)"); + } else { + this.setLockedFluidName( + this.getDrainableStack() + .getFluid() + .getName()); + inBrackets = this.getDrainableStack() + .getLocalizedName(); + } + GTUtility.sendChatToPlayer( + aPlayer, + String.format("%s (%s)", GTUtility.trans("151.2", "Outputs 1 specific Fluid"), inBrackets)); + } + } + } + + private boolean tryToLockHatch(EntityPlayer aPlayer, ForgeDirection side) { + if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) + .isGUIClickable()) return false; + if (!isFluidLocked()) return false; + final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); + if (tCurrentItem == null) return false; + FluidStack tFluid = FluidContainerRegistry.getFluidForFilledItem(tCurrentItem); + if (tFluid == null && tCurrentItem.getItem() instanceof IFluidContainerItem) + tFluid = ((IFluidContainerItem) tCurrentItem.getItem()).getFluid(tCurrentItem); + if (tFluid != null) { + if (getLockedFluidName() != null && !getLockedFluidName().equals( + tFluid.getFluid() + .getName())) { + GTUtility.sendChatToPlayer( + aPlayer, + String.format( + "%s %s", + GTUtility.trans( + "151.3", + "Hatch is locked to a different fluid. To change the locking, empty it and made it locked to the next fluid with a screwdriver. Currently locked to"), + StatCollector.translateToLocal(getLockedFluidName()))); + } else { + setLockedFluidName( + tFluid.getFluid() + .getName()); + if (mMode == 8) GTUtility.sendChatToPlayer( + aPlayer, + String.format( + "%s (%s)", + GTUtility.trans("151.1", "Outputs items and 1 specific Fluid"), + tFluid.getLocalizedName())); + else GTUtility.sendChatToPlayer( + aPlayer, + String.format( + "%s (%s)", + GTUtility.trans("151.2", "Outputs 1 specific Fluid"), + tFluid.getLocalizedName())); + } + return true; + } + return false; + } + + public byte getMode() { + return mMode; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + if (tryToLockHatch(aPlayer, side)) return true; + return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); + } + + public boolean outputsSteam() { + return mMode < 4; + } + + public boolean outputsLiquids() { + return mMode % 2 == 0 || mMode == 9; + } + + public boolean outputsItems() { + return mMode % 4 < 2 && mMode != 9; + } + + @Override + public String getLockedFluidName() { + return lockedFluidName; + } + + @Override + public void setLockedFluidName(String lockedFluidName) { + this.lockedFluidName = lockedFluidName; + markDirty(); + } + + @Override + public void lockFluid(boolean lock) { + if (lock) { + if (!isFluidLocked()) { + this.mMode = 9; + markDirty(); + } + } else { + this.mMode = 0; + setLockedFluidName(null); + markDirty(); + } + } + + @Override + public boolean isFluidLocked() { + return mMode == 8 || mMode == 9; + } + + @Override + public boolean acceptsFluidLock(String name) { + return true; + } + + @Override + public boolean isEmptyAndAcceptsAnyFluid() { + return mMode == 0 && getFluidAmount() == 0; + } + + @Override + public boolean canStoreFluid(@Nonnull FluidStack fluidStack) { + if (mFluid != null && !GTUtility.areFluidsEqual(mFluid, fluidStack)) { + return false; + } + if (isFluidLocked()) { + if (lockedFluidName == null) { + return true; + } + return lockedFluidName.equals( + fluidStack.getFluid() + .getName()); + } + if (GTModHandler.isSteam(fluidStack)) { + return outputsSteam(); + } + return outputsLiquids(); + } + + @Override + public int getTankPressure() { + return +100; + } + + @Override + protected void onEmptyingContainerWhenEmpty() { + if (this.lockedFluidName == null && this.mFluid != null && isFluidLocked()) { + this.setLockedFluidName( + this.mFluid.getFluid() + .getName()); + final EntityPlayer player; + if (playerThatLockedfluid == null || (player = playerThatLockedfluid.get()) == null) return; + GTUtility.sendChatToPlayer( + player, + String.format(GTUtility.trans("151.4", "Successfully locked Fluid to %s"), mFluid.getLocalizedName())); + playerThatLockedfluid = null; + } + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { EnumChatFormatting.BLUE + "Output Hatch" + EnumChatFormatting.RESET, "Stored Fluid:", + EnumChatFormatting.GOLD + (mFluid == null ? "No Fluid" : mFluid.getLocalizedName()) + + EnumChatFormatting.RESET, + EnumChatFormatting.GREEN + GTUtility.formatNumbers(mFluid == null ? 0 : mFluid.amount) + + " L" + + EnumChatFormatting.RESET + + " " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getCapacity()) + + " L" + + EnumChatFormatting.RESET, + (!isFluidLocked() || lockedFluidName == null) ? "Not Locked" + : ("Locked to " + StatCollector.translateToLocal( + FluidRegistry.getFluidStack(lockedFluidName, 1) + .getUnlocalizedName())) }; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setPos(98, 16) + .setSize(71, 45)) + .widget(new FluidLockWidget(this).setPos(149, 41)) + .widget( + new TextWidget("Locked Fluid").setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(101, 20)) + .widget(TextWidget.dynamicString(() -> { + FluidStack fluidStack = FluidRegistry.getFluidStack(lockedFluidName, 1); + return fluidStack != null ? fluidStack.getLocalizedName() : "None"; + }) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setTextAlignment(Alignment.CenterLeft) + .setMaxWidth(65) + .setPos(101, 30)) + .widget(new FakeSyncWidget.ByteSyncer(() -> mMode, val -> mMode = val)); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutputBus.java new file mode 100644 index 0000000000..31973f935b --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchOutputBus.java @@ -0,0 +1,320 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.Textures.BlockIcons.ITEM_OUT_SIGN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; +import static gregtech.api.util.GTUtility.moveMultipleItemStacks; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.Nullable; + +import com.gtnewhorizons.modularui.api.forge.ItemHandlerHelper; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import gregtech.GTMod; +import gregtech.api.enums.ItemList; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.widgets.PhantomItemButton; +import gregtech.api.interfaces.IDataCopyable; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IItemLockable; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.extensions.ArrayExt; + +public class MTEHatchOutputBus extends MTEHatch implements IAddUIWidgets, IItemLockable, IDataCopyable { + + private static final String DATA_STICK_DATA_TYPE = "outputBusFilter"; + private static final String LOCKED_ITEM_NBT_KEY = "lockedItem"; + + protected ItemStack lockedItem = null; + + public MTEHatchOutputBus(int aID, String aName, String aNameRegional, int aTier) { + this(aID, aName, aNameRegional, aTier, getSlots(aTier)); + } + + public MTEHatchOutputBus(int id, String name, String nameRegional, int tier, int slots) { + super( + id, + name, + nameRegional, + tier, + slots, + ArrayExt.of( + "Item Output for Multiblocks", + "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : ""), + "Left click with data stick to save filter config", + "Right click with data stick to load filter config")); + } + + public MTEHatchOutputBus(int aID, String aName, String aNameRegional, int aTier, String[] aDescription) { + super(aID, aName, aNameRegional, aTier, getSlots(aTier), aDescription); + } + + public MTEHatchOutputBus(int aID, String aName, String aNameRegional, int aTier, String[] aDescription, + int inventorySize) { + super(aID, aName, aNameRegional, aTier, inventorySize, aDescription); + } + + public MTEHatchOutputBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, getSlots(aTier), aDescription, aTextures); + } + + public MTEHatchOutputBus(String name, int tier, int slots, String[] description, ITexture[][][] textures) { + super(name, tier, slots, description, textures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return GTMod.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 GTMod.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 MTEHatchOutputBus(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!acceptsItemLock() || !(aPlayer instanceof EntityPlayerMP)) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return super.onRightclick(aBaseMetaTileEntity, aPlayer); + } + + final ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return super.onRightclick(aBaseMetaTileEntity, aPlayer); + } + + if (!pasteCopiedData(aPlayer, dataStick.stackTagCompound)) { + aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.invalid")); + return false; + } + + aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.loaded")); + return true; + + } + + @Override + public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!acceptsItemLock() || !(aPlayer instanceof EntityPlayerMP)) { + return; + } + final ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { + return; + } + + dataStick.stackTagCompound = getCopiedData(aPlayer); + dataStick.setStackDisplayName("Output Bus Configuration"); + aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.saved")); + } + + @Override + public NBTTagCompound getCopiedData(EntityPlayer player) { + final NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", DATA_STICK_DATA_TYPE); + if (lockedItem != null) { + nbt.setTag(LOCKED_ITEM_NBT_KEY, lockedItem.writeToNBT(new NBTTagCompound())); + } + return nbt; + } + + @Override + public boolean pasteCopiedData(EntityPlayer player, NBTTagCompound nbt) { + if (nbt == null || !DATA_STICK_DATA_TYPE.equals(nbt.getString("type"))) return false; + if (nbt.hasKey(LOCKED_ITEM_NBT_KEY)) { + lockedItem = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(LOCKED_ITEM_NBT_KEY)); + } else { + lockedItem = null; + } + return true; + } + + @Override + public String getCopiedDataIdentifier(EntityPlayer player) { + return DATA_STICK_DATA_TYPE; + } + + /** + * Attempt to store as many items as possible into the internal inventory of this output bus. If you need atomicity + * you should use {@link gregtech.api.interfaces.tileentity.IHasInventory#addStackToSlot(int, ItemStack)} + * + * @param aStack Assume valid. Will be mutated. Take over the ownership. Caller should not retain a reference to + * this stack if the call returns true. + * @return true if stack is fully accepted. false is stack is partially accepted or nothing is accepted + */ + public boolean storeAll(ItemStack aStack) { + markDirty(); + + if (lockedItem != null && !lockedItem.isItemEqual(aStack)) { + return false; + } + + for (int i = 0, mInventoryLength = mInventory.length; i < mInventoryLength && aStack.stackSize > 0; i++) { + ItemStack tSlot = mInventory[i]; + if (GTUtility.isStackInvalid(tSlot)) { + int tRealStackLimit = Math.min(getInventoryStackLimit(), aStack.getMaxStackSize()); + if (aStack.stackSize <= tRealStackLimit) { + mInventory[i] = aStack; + return true; + } + mInventory[i] = aStack.splitStack(tRealStackLimit); + } else { + int tRealStackLimit = Math.min(getInventoryStackLimit(), tSlot.getMaxStackSize()); + if (tSlot.stackSize < tRealStackLimit && tSlot.isItemEqual(aStack) + && ItemStack.areItemStackTagsEqual(tSlot, aStack)) { + if (aStack.stackSize + tSlot.stackSize <= tRealStackLimit) { + mInventory[i].stackSize += aStack.stackSize; + return true; + } else { + // more to serve + aStack.stackSize -= tRealStackLimit - tSlot.stackSize; + mInventory[i].stackSize = tRealStackLimit; + } + } + } + } + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && (aTick & 0x7) == 0) { + final IInventory tTileEntity = aBaseMetaTileEntity + .getIInventoryAtSide(aBaseMetaTileEntity.getFrontFacing()); + if (tTileEntity != null) { + moveMultipleItemStacks( + aBaseMetaTileEntity, + tTileEntity, + aBaseMetaTileEntity.getFrontFacing(), + aBaseMetaTileEntity.getBackFacing(), + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1, + mInventory.length); + for (int i = 0; i < mInventory.length; i++) + if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null; + } + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (lockedItem != null) { + aNBT.setTag(LOCKED_ITEM_NBT_KEY, lockedItem.writeToNBT(new NBTTagCompound())); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey(LOCKED_ITEM_NBT_KEY)) { + lockedItem = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(LOCKED_ITEM_NBT_KEY)); + } + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + switch (mTier) { + case 0 -> getBaseMetaTileEntity().add1by1Slot(builder); + case 1 -> getBaseMetaTileEntity().add2by2Slots(builder); + case 2 -> getBaseMetaTileEntity().add3by3Slots(builder); + default -> getBaseMetaTileEntity().add4by4Slots(builder); + } + + if (acceptsItemLock()) { + builder.widget( + new PhantomItemButton(this).setPos(getGUIWidth() - 25, 40) + .setBackground(PhantomItemButton.FILTER_BACKGROUND)); + } + } + + @Override + public void setLockedItem(@Nullable ItemStack itemStack) { + if (itemStack == null) { + clearLock(); + } else { + lockedItem = ItemHandlerHelper.copyStackWithSize(itemStack, 1); + } + } + + @Nullable + @Override + public ItemStack getLockedItem() { + return lockedItem; + } + + @Override + public void clearLock() { + lockedItem = null; + } + + @Override + public boolean isLocked() { + return lockedItem != null; + } + + @Override + public boolean acceptsItemLock() { + return true; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchQuadrupleHumongous.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchQuadrupleHumongous.java new file mode 100644 index 0000000000..b0040d0c6a --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchQuadrupleHumongous.java @@ -0,0 +1,27 @@ +package gregtech.api.metatileentity.implementations; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +public class MTEHatchQuadrupleHumongous extends MTEHatchMultiInput { + + public MTEHatchQuadrupleHumongous(int aID, int aSlot, String aName, String aNameRegional) { + super(aID, aSlot, aName, aNameRegional, 13); + } + + public MTEHatchQuadrupleHumongous(String aName, int aSlot, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aSlot, aTier, aDescription, aTextures); + } + + @Override + public int getCapacityPerTank(int aTier, int aSlot) { + return 500_000_000; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchQuadrupleHumongous(mName, getMaxType(), mTier, mDescriptionArray, mTextures); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEItem.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEItem.java new file mode 100644 index 0000000000..ba804e834e --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEItem.java @@ -0,0 +1,523 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.ALL_VALID_SIDES; +import static gregtech.api.enums.Textures.BlockIcons.PIPE_RESTRICTOR; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityDispenser; +import net.minecraft.tileentity.TileEntityHopper; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.GTMod; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.metatileentity.IMetaTileEntityItemPipe; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.MetaPipeEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.GTClient; +import gregtech.common.covers.CoverInfo; + +public class MTEItem extends MetaPipeEntity implements IMetaTileEntityItemPipe { + + public final float mThickNess; + public final Materials mMaterial; + public final int mStepSize; + public final int mTickTime; + public int mTransferredItems = 0; + public long mCurrentTransferStartTick = 0; + public ForgeDirection mLastReceivedFrom = ForgeDirection.UNKNOWN, oLastReceivedFrom = ForgeDirection.UNKNOWN; + public boolean mIsRestrictive = false; + private int[] cacheSides; + + public MTEItem(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, + int aInvSlotCount, int aStepSize, boolean aIsRestrictive, int aTickTime) { + super(aID, aName, aNameRegional, aInvSlotCount, false); + mIsRestrictive = aIsRestrictive; + mThickNess = aThickNess; + mMaterial = aMaterial; + mStepSize = aStepSize; + mTickTime = aTickTime; + addInfo(aID); + } + + public MTEItem(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, + int aInvSlotCount, int aStepSize, boolean aIsRestrictive) { + this(aID, aName, aNameRegional, aThickNess, aMaterial, aInvSlotCount, aStepSize, aIsRestrictive, 20); + } + + public MTEItem(String aName, float aThickNess, Materials aMaterial, int aInvSlotCount, int aStepSize, + boolean aIsRestrictive, int aTickTime) { + super(aName, aInvSlotCount); + mIsRestrictive = aIsRestrictive; + mThickNess = aThickNess; + mMaterial = aMaterial; + mStepSize = aStepSize; + mTickTime = aTickTime; + } + + @Override + public byte getTileEntityBaseType() { + return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality))); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEItem(mName, mThickNess, mMaterial, mInventory.length, mStepSize, mIsRestrictive, mTickTime); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections, + int aColorIndex, boolean aConnected, boolean redstoneLevel) { + if (mIsRestrictive) { + if (aConnected) { + float tThickNess = getThickNess(); + if (tThickNess < 0.124F) return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; + if (tThickNess < 0.374F) // 0.375 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; + if (tThickNess < 0.499F) // 0.500 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; + if (tThickNess < 0.749F) // 0.750 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; + if (tThickNess < 0.874F) // 0.825 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; + } + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) }; + } + if (aConnected) { + float tThickNess = getThickNess(); + if (tThickNess < 0.124F) return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; + if (tThickNess < 0.374F) // 0.375 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; + if (tThickNess < 0.499F) // 0.500 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; + if (tThickNess < 0.749F) // 0.750 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; + if (tThickNess < 0.874F) // 0.825 + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; + } + return new ITexture[] { TextureFactory.of( + mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex], + Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return false; + } + + @Override + public boolean isValidSlot(int ignoredSlotIndex) { + return true; + } + + @Override + public final boolean renderInside(ForgeDirection side) { + return false; + } + + @Override + public int getProgresstime() { + return getPipeContent() * 64; + } + + @Override + public int maxProgresstime() { + return getMaxPipeCapacity() * 64; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setByte("mLastReceivedFrom", (byte) mLastReceivedFrom.ordinal()); + if (GTMod.gregtechproxy.gt6Pipe) aNBT.setByte("mConnections", mConnections); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + mLastReceivedFrom = ForgeDirection.getOrientation(aNBT.getByte("mLastReceivedFrom")); + if (GTMod.gregtechproxy.gt6Pipe) { + mConnections = aNBT.getByte("mConnections"); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide() && (aTick - mCurrentTransferStartTick) % 10 == 0) { + if ((aTick - mCurrentTransferStartTick) % mTickTime == 0) { + mTransferredItems = 0; + mCurrentTransferStartTick = 0; + } + + if (!GTMod.gregtechproxy.gt6Pipe || mCheckConnections) checkConnections(); + + if (oLastReceivedFrom == mLastReceivedFrom) { + doTickProfilingInThisTick = false; + + final ArrayList tPipeList = new ArrayList<>(); + + for (boolean temp = true; temp && !isInventoryEmpty() && pipeCapacityCheck();) { + temp = false; + tPipeList.clear(); + for (IMetaTileEntityItemPipe tTileEntity : GTUtility + .sortMapByValuesAcending( + IMetaTileEntityItemPipe.Util.scanPipes(this, new HashMap<>(), 0, false, false)) + .keySet()) { + if (temp) break; + tPipeList.add(tTileEntity); + while (!temp && !isInventoryEmpty() && tTileEntity.sendItemStack(aBaseMetaTileEntity)) + for (IMetaTileEntityItemPipe tPipe : tPipeList) + if (!tPipe.incrementTransferCounter(1)) temp = true; + } + } + } + + if (isInventoryEmpty()) mLastReceivedFrom = ForgeDirection.UNKNOWN; + oLastReceivedFrom = mLastReceivedFrom; + } + } + + @Override + public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, + float aX, float aY, float aZ) { + if (GTMod.gregtechproxy.gt6Pipe) { + final ForgeDirection tSide = GTUtility.determineWrenchingSide(side, aX, aY, aZ); + if (isConnectedAtSide(tSide)) { + disconnect(tSide); + GTUtility.sendChatToPlayer(entityPlayer, GTUtility.trans("215", "Disconnected")); + } else { + if (connect(tSide) > 0) GTUtility.sendChatToPlayer(entityPlayer, GTUtility.trans("214", "Connected")); + } + return true; + } + return false; + } + + @Override + public boolean letsIn(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return coverBehavior.letsItemsIn(side, aCoverID, aCoverVariable, -1, aTileEntity); + } + + @Override + public boolean letsOut(CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return coverBehavior.letsItemsOut(side, aCoverID, aCoverVariable, -1, aTileEntity); + } + + @Override + public boolean letsIn(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return coverBehavior.letsItemsIn(side, aCoverID, aCoverVariable, -1, aTileEntity); + } + + @Override + public boolean letsOut(CoverBehaviorBase coverBehavior, ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return coverBehavior.letsItemsOut(side, aCoverID, aCoverVariable, -1, aTileEntity); + } + + @Override + public boolean letsIn(CoverInfo coverInfo) { + return coverInfo.letsItemsOut(-1); + } + + @Override + public boolean letsOut(CoverInfo coverInfo) { + return coverInfo.letsItemsOut(-1); + } + + @Override + public boolean canConnect(ForgeDirection side, TileEntity tileEntity) { + if (tileEntity == null) return false; + + final ForgeDirection oppositeSide = side.getOpposite(); + boolean connectable = GTUtility.isConnectableNonInventoryPipe(tileEntity, oppositeSide); + + final IGregTechTileEntity gTileEntity = (tileEntity instanceof IGregTechTileEntity) + ? (IGregTechTileEntity) tileEntity + : null; + if (gTileEntity != null) { + if (gTileEntity.getMetaTileEntity() == null) return false; + if (gTileEntity.getMetaTileEntity() + .connectsToItemPipe(oppositeSide)) return true; + connectable = true; + } + + if (tileEntity instanceof IInventory) { + if (((IInventory) tileEntity).getSizeInventory() <= 0) return false; + connectable = true; + } + if (tileEntity instanceof ISidedInventory) { + final int[] tSlots = ((ISidedInventory) tileEntity).getAccessibleSlotsFromSide(oppositeSide.ordinal()); + if (tSlots == null || tSlots.length == 0) return false; + connectable = true; + } + + return connectable; + } + + @Override + public boolean getGT6StyleConnection() { + // Yes if GT6 pipes are enabled + return GTMod.gregtechproxy.gt6Pipe; + } + + @Override + public boolean incrementTransferCounter(int aIncrement) { + if (mTransferredItems == 0) mCurrentTransferStartTick = getBaseMetaTileEntity().getTimer(); + mTransferredItems += aIncrement; + return pipeCapacityCheck(); + } + + @Override + public boolean sendItemStack(Object aSender) { + if (pipeCapacityCheck()) { + final byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6); + for (final byte i : ALL_VALID_SIDES) { + final ForgeDirection tSide = ForgeDirection.getOrientation((i + tOffset) % 6); + if (isConnectedAtSide(tSide) + && (isInventoryEmpty() || (tSide != mLastReceivedFrom || aSender != getBaseMetaTileEntity()))) { + if (insertItemStackIntoTileEntity(aSender, tSide)) return true; + } + } + } + return false; + } + + @Override + public boolean insertItemStackIntoTileEntity(Object aSender, ForgeDirection side) { + if (getBaseMetaTileEntity().getCoverInfoAtSide(side) + .letsItemsOut(-1)) { + final TileEntity tInventory = getBaseMetaTileEntity().getTileEntityAtSide(side); + if (tInventory != null && !(tInventory instanceof BaseMetaPipeEntity)) { + if ((!(tInventory instanceof TileEntityHopper) && !(tInventory instanceof TileEntityDispenser)) + || getBaseMetaTileEntity().getMetaIDAtSide(side) != side.getOpposite() + .ordinal()) { + return GTUtility.moveMultipleItemStacks( + aSender, + tInventory, + ForgeDirection.UNKNOWN, + side.getOpposite(), + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1, + 1) > 0; + } + } + } + return false; + } + + @Override + public boolean pipeCapacityCheck() { + return mTransferredItems <= 0 || getPipeContent() < getMaxPipeCapacity(); + } + + private int getPipeContent() { + return mTransferredItems; + } + + private int getMaxPipeCapacity() { + return Math.max(1, getPipeCapacity()); + } + + /** + * Amount of ItemStacks this Pipe can conduct per Second. + */ + public int getPipeCapacity() { + return mInventory.length; + } + + @Override + public int getStepSize() { + return mStepSize; + } + + @Override + public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) { + return isConnectedAtSide(ForgeDirection.getOrientation(ordinalSide)) + && super.canInsertItem(aIndex, aStack, ordinalSide); + } + + @Override + public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) { + return isConnectedAtSide(ForgeDirection.getOrientation(ordinalSide)); + } + + @Override + public int[] getAccessibleSlotsFromSide(int ordinalSide) { + final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); + final CoverInfo coverInfo = tTileEntity.getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide)); + final boolean tAllow = coverInfo.letsItemsIn(-2) || coverInfo.letsItemsOut(-2); + if (tAllow) { + if (cacheSides == null) cacheSides = super.getAccessibleSlotsFromSide(ordinalSide); + return cacheSides; + } else { + return GTValues.emptyIntArray; + } + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return isConnectedAtSide(side); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (!isConnectedAtSide(side)) return false; + if (isInventoryEmpty()) mLastReceivedFrom = side; + return mLastReceivedFrom == side && mInventory[aIndex] == null; + } + + @Override + public String[] getDescription() { + if (mTickTime == 20) return new String[] { "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/sec", + "Routing Value: %%%" + GTUtility.formatNumbers(mStepSize) }; + else if (mTickTime % 20 == 0) return new String[] { + "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/%%%" + (mTickTime / 20) + "%%% sec", + "Routing Value: %%%" + GTUtility.formatNumbers(mStepSize) }; + else return new String[] { + "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/%%%" + mTickTime + "%%% ticks", + "Routing Value: %%%" + GTUtility.formatNumbers(mStepSize) }; + } + + private boolean isInventoryEmpty() { + for (ItemStack tStack : mInventory) if (tStack != null) return false; + return true; + } + + @Override + public float getThickNess() { + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x1) != 0) return 0.0625F; + return mThickNess; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x2) != 0) + return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); + else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + + private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World ignoredAWorld, int aX, int aY, int aZ) { + final float tSpace = (1f - mThickNess) / 2; + float spaceDown = tSpace; + float spaceUp = 1f - tSpace; + float spaceNorth = tSpace; + float spaceSouth = 1f - tSpace; + float spaceWest = tSpace; + float spaceEast = 1f - tSpace; + + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) { + spaceDown = spaceNorth = spaceWest = 0; + spaceSouth = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) { + spaceNorth = spaceWest = 0; + spaceUp = spaceSouth = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) { + spaceDown = spaceNorth = spaceWest = 0; + spaceUp = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) { + spaceDown = spaceWest = 0; + spaceUp = spaceSouth = spaceEast = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) { + spaceDown = spaceNorth = spaceWest = 0; + spaceUp = spaceSouth = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) { + spaceDown = spaceNorth = 0; + spaceUp = spaceSouth = spaceEast = 1; + } + + final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; + if ((tConn & ForgeDirection.DOWN.flag) != 0) spaceDown = 0f; + if ((tConn & ForgeDirection.UP.flag) != 0) spaceUp = 1f; + if ((tConn & ForgeDirection.NORTH.flag) != 0) spaceNorth = 0f; + if ((tConn & ForgeDirection.SOUTH.flag) != 0) spaceSouth = 1f; + if ((tConn & ForgeDirection.WEST.flag) != 0) spaceWest = 0f; + if ((tConn & ForgeDirection.EAST.flag) != 0) spaceEast = 1f; + + return AxisAlignedBB.getBoundingBox( + aX + spaceWest, + aY + spaceDown, + aZ + spaceNorth, + aX + spaceEast, + aY + spaceUp, + aZ + spaceSouth); + } + + @Override + public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, + List outputAABB, Entity collider) { + super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); + if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x2) != 0) { + final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java new file mode 100644 index 0000000000..ab70cf25ae --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java @@ -0,0 +1,2742 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.util.GTUtility.filterValidMTEs; +import static gregtech.api.util.GTUtility.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.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.IntConsumer; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.TestOnly; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.VoidingMode; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.fluid.IFluidStore; +import gregtech.api.interfaces.metatileentity.IItemLockable; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.modularui.IBindPlayerInventoryUI; +import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.objects.GTItemStack; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SingleRecipeCheck; +import gregtech.api.util.ExoticEnergyInputHelper; +import gregtech.api.util.GTClientPreference; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GTWaila; +import gregtech.api.util.OutputHatchWrapper; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.ParallelHelper; +import gregtech.api.util.VoidProtectionHelper; +import gregtech.api.util.shutdown.ShutDownReason; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.client.GTSoundLoop; +import gregtech.common.Pollution; +import gregtech.common.config.machinestats.ConfigMachines; +import gregtech.common.gui.modularui.widget.CheckRecipeResultSyncer; +import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer; +import gregtech.common.items.MetaGeneratedTool01; +import gregtech.common.tileentities.machines.IDualInputHatch; +import gregtech.common.tileentities.machines.IDualInputInventory; +import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch; +import gregtech.common.tileentities.machines.ISmartInputHatch; +import gregtech.common.tileentities.machines.MTEHatchCraftingInputME; +import gregtech.common.tileentities.machines.MTEHatchInputBusME; +import gregtech.common.tileentities.machines.MTEHatchInputME; +import gregtech.common.tileentities.machines.MTEHatchOutputBusME; +import gregtech.common.tileentities.machines.MTEHatchOutputME; +import gregtech.common.tileentities.machines.multi.MTELargeTurbine; +import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public abstract class MTEMultiBlockBase extends MetaTileEntity + implements IControllerWithOptionalFeatures, IAddGregtechLogo, IAddUIWidgets, IBindPlayerInventoryUI { + + public static boolean disableMaintenance; + public boolean hasMaintenanceChecks = getDefaultHasMaintenanceChecks(); + public boolean mMachine = false, mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false, + mSolderingTool = false, mCrowbar = false, mRunningOnLoad = false; + public boolean mStructureChanged = false; + public int mPollution = 0, mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mEfficiencyIncrease = 0, + mStartUpCheck = 100, mRuntime = 0, mEfficiency = 0; + public volatile boolean mUpdated = false; + public int mUpdate = 0; + public ItemStack[] mOutputItems = null; + public FluidStack[] mOutputFluids = null; + public String mNEI; + public int damageFactorLow = 5; + public float damageFactorHigh = 0.6f; + public int machineMode = 0; + public List machineModeIcons = new ArrayList(); + + public boolean mLockedToSingleRecipe = getDefaultRecipeLockingMode(); + protected boolean inputSeparation = getDefaultInputSeparationMode(); + protected VoidingMode voidingMode = getDefaultVoidingMode(); + protected boolean batchMode = getDefaultBatchMode(); + protected @Nonnull CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.NONE; + + protected static final String INPUT_SEPARATION_NBT_KEY = "inputSeparation"; + protected static final String VOID_EXCESS_NBT_KEY = "voidExcess"; + protected static final String VOIDING_MODE_NBT_KEY = "voidingMode"; + protected static final String BATCH_MODE_NBT_KEY = "batchMode"; + protected SingleRecipeCheck mSingleRecipeCheck = null; + + public ArrayList mInputHatches = new ArrayList<>(); + public ArrayList mOutputHatches = new ArrayList<>(); + public ArrayList mInputBusses = new ArrayList<>(); + public ArrayList mOutputBusses = new ArrayList<>(); + public ArrayList mDualInputHatches = new ArrayList<>(); + public ArrayList mSmartInputHatches = new ArrayList<>(); + public ArrayList mDynamoHatches = new ArrayList<>(); + public ArrayList mMufflerHatches = new ArrayList<>(); + public ArrayList mEnergyHatches = new ArrayList<>(); + public ArrayList mMaintenanceHatches = new ArrayList<>(); + protected List mExoticEnergyHatches = new ArrayList<>(); + protected final ProcessingLogic processingLogic; + @SideOnly(Side.CLIENT) + protected GTSoundLoop activitySoundLoop; + + protected long mLastWorkingTick = 0, mTotalRunTime = 0; + private static final int CHECK_INTERVAL = 100; // How often should we check for a new recipe on an idle machine? + private final int randomTickOffset = (int) (Math.random() * CHECK_INTERVAL + 1); + + protected static final byte INTERRUPT_SOUND_INDEX = 8; + protected static final byte PROCESS_START_SOUND_INDEX = 1; + + public MTEMultiBlockBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, 2); + this.processingLogic = null; + MTEMultiBlockBase.disableMaintenance = ConfigMachines.disableMaintenanceChecks; + this.damageFactorLow = ConfigMachines.damageFactorLow; + this.damageFactorHigh = ConfigMachines.damageFactorHigh; + this.mNEI = ""; + if (!shouldCheckMaintenance()) fixAllIssues(); + } + + public MTEMultiBlockBase(String aName) { + super(aName, 2); + this.processingLogic = createProcessingLogic(); + MTEMultiBlockBase.disableMaintenance = ConfigMachines.disableMaintenanceChecks; + this.damageFactorLow = ConfigMachines.damageFactorLow; + this.damageFactorHigh = ConfigMachines.damageFactorHigh; + if (!shouldCheckMaintenance()) fixAllIssues(); + } + + @Override + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { + return side != getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (supportsSingleRecipeLocking()) { + mLockedToSingleRecipe = !mLockedToSingleRecipe; + if (mLockedToSingleRecipe) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("223", "Single recipe locking enabled. Will lock to next recipe.")); + } else { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("220", "Single recipe locking disabled.")); + mSingleRecipeCheck = null; + } + } + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex > 0; + } + + @Override + public int getProgresstime() { + return mProgresstime; + } + + @Override + public int maxProgresstime() { + return mMaxProgresstime; + } + + public long getTotalRuntimeInTicks() { + return mTotalRunTime; + } + + @Override + public int increaseProgress(int aProgress) { + return aProgress; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("mEUt", mEUt); + aNBT.setInteger("mProgresstime", mProgresstime); + aNBT.setInteger("mMaxProgresstime", mMaxProgresstime); + aNBT.setInteger("mEfficiencyIncrease", mEfficiencyIncrease); + aNBT.setInteger("mEfficiency", mEfficiency); + aNBT.setInteger("mPollution", mPollution); + aNBT.setInteger("mRuntime", mRuntime); + aNBT.setLong("mTotalRunTime", mTotalRunTime); + aNBT.setLong("mLastWorkingTick", mLastWorkingTick); + aNBT.setString("checkRecipeResultID", checkRecipeResult.getID()); + aNBT.setTag("checkRecipeResult", checkRecipeResult.writeToNBT(new NBTTagCompound())); + + if (supportsMachineModeSwitch()) { + aNBT.setInteger("machineMode", machineMode); + } + + if (supportsSingleRecipeLocking()) { + aNBT.setBoolean("mLockedToSingleRecipe", mLockedToSingleRecipe); + if (mLockedToSingleRecipe && mSingleRecipeCheck != null) + aNBT.setTag("mSingleRecipeCheck", mSingleRecipeCheck.writeToNBT()); + } + + if (mOutputItems != null) { + aNBT.setInteger("mOutputItemsLength", mOutputItems.length); + for (int i = 0; i < mOutputItems.length; i++) if (mOutputItems[i] != null) { + GTUtility.saveItem(aNBT, "mOutputItem" + i, mOutputItems[i]); + } + } + if (mOutputFluids != null) { + aNBT.setInteger("mOutputFluidsLength", mOutputFluids.length); + for (int i = 0; i < mOutputFluids.length; i++) if (mOutputFluids[i] != null) { + NBTTagCompound tNBT = new NBTTagCompound(); + mOutputFluids[i].writeToNBT(tNBT); + aNBT.setTag("mOutputFluids" + i, tNBT); + } + } + aNBT.setBoolean("mWrench", mWrench); + aNBT.setBoolean("mScrewdriver", mScrewdriver); + aNBT.setBoolean("mSoftHammer", mSoftHammer); + aNBT.setBoolean("mHardHammer", mHardHammer); + aNBT.setBoolean("mSolderingTool", mSolderingTool); + aNBT.setBoolean("mCrowbar", mCrowbar); + aNBT.setBoolean(BATCH_MODE_NBT_KEY, batchMode); + aNBT.setBoolean(INPUT_SEPARATION_NBT_KEY, inputSeparation); + aNBT.setString(VOIDING_MODE_NBT_KEY, voidingMode.name); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + mEUt = aNBT.getInteger("mEUt"); + mProgresstime = aNBT.getInteger("mProgresstime"); + mMaxProgresstime = aNBT.getInteger("mMaxProgresstime"); + if (mMaxProgresstime > 0) mRunningOnLoad = true; + mEfficiencyIncrease = aNBT.getInteger("mEfficiencyIncrease"); + mEfficiency = aNBT.getInteger("mEfficiency"); + mPollution = aNBT.getInteger("mPollution"); + mRuntime = aNBT.getInteger("mRuntime"); + mTotalRunTime = aNBT.getLong("mTotalRunTime"); + mLastWorkingTick = aNBT.getLong("mLastWorkingTick"); + + String checkRecipeResultID = aNBT.getString("checkRecipeResultID"); + if (CheckRecipeResultRegistry.isRegistered(checkRecipeResultID)) { + CheckRecipeResult result = CheckRecipeResultRegistry.getSampleFromRegistry(checkRecipeResultID) + .newInstance(); + result.readFromNBT(aNBT.getCompoundTag("checkRecipeResult")); + checkRecipeResult = result; + } + + if (aNBT.hasKey("machineMode")) { + machineMode = aNBT.getInteger("machineMode"); + } + if (supportsSingleRecipeLocking()) { + mLockedToSingleRecipe = aNBT.getBoolean("mLockedToSingleRecipe"); + if (mLockedToSingleRecipe && aNBT.hasKey("mSingleRecipeCheck", Constants.NBT.TAG_COMPOUND)) { + SingleRecipeCheck c = loadSingleRecipeChecker(aNBT.getCompoundTag("mSingleRecipeCheck")); + if (c != null) mSingleRecipeCheck = c; + // the old recipe is gone. we disable the machine to prevent making garbage in case of shared inputs + // maybe use a better way to inform player in the future. + else getBaseMetaTileEntity().disableWorking(); + } + } + batchMode = aNBT.getBoolean(BATCH_MODE_NBT_KEY); + inputSeparation = aNBT.getBoolean(INPUT_SEPARATION_NBT_KEY); + if (aNBT.hasKey(VOIDING_MODE_NBT_KEY, Constants.NBT.TAG_STRING)) { + voidingMode = VoidingMode.fromName(aNBT.getString(VOIDING_MODE_NBT_KEY)); + } else if (aNBT.hasKey(VOID_EXCESS_NBT_KEY)) { + // backward compatibility + voidingMode = aNBT.getBoolean(VOID_EXCESS_NBT_KEY) ? VoidingMode.VOID_ALL : VoidingMode.VOID_NONE; + } + if (!getAllowedVoidingModes().contains(voidingMode)) voidingMode = getDefaultVoidingMode(); + + int aOutputItemsLength = aNBT.getInteger("mOutputItemsLength"); + if (aOutputItemsLength > 0) { + mOutputItems = new ItemStack[aOutputItemsLength]; + for (int i = 0; i < mOutputItems.length; i++) mOutputItems[i] = GTUtility.loadItem(aNBT, "mOutputItem" + i); + } + + int aOutputFluidsLength = aNBT.getInteger("mOutputFluidsLength"); + if (aOutputFluidsLength > 0) { + mOutputFluids = new FluidStack[aOutputFluidsLength]; + for (int i = 0; i < mOutputFluids.length; i++) + mOutputFluids[i] = GTUtility.loadFluid(aNBT, "mOutputFluids" + i); + } + if (shouldCheckMaintenance()) { + mWrench = aNBT.getBoolean("mWrench"); + mScrewdriver = aNBT.getBoolean("mScrewdriver"); + mSoftHammer = aNBT.getBoolean("mSoftHammer"); + mHardHammer = aNBT.getBoolean("mHardHammer"); + mSolderingTool = aNBT.getBoolean("mSolderingTool"); + mCrowbar = aNBT.getBoolean("mCrowbar"); + } else fixAllIssues(); + } + + protected SingleRecipeCheck loadSingleRecipeChecker(NBTTagCompound aNBT) { + return SingleRecipeCheck.tryLoad(getRecipeMap(), aNBT); + } + + public boolean saveOtherHatchConfiguration(EntityPlayer player) { + return true; + } + + public boolean loadOtherHatchConfiguration(EntityPlayer player) { + return true; + } + + @Override + public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isServerSide() && GTUtil.saveMultiblockInputConfiguration(this, aPlayer)) { + aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.MULTI_MACHINE_CONFIG.SAVE")); + return; + } + super.onLeftclick(aBaseMetaTileEntity, aPlayer); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (GTUtil.hasMultiblockInputConfiguration(aPlayer.getHeldItem())) { + if (aBaseMetaTileEntity.isServerSide()) { + if (GTUtil.loadMultiblockInputConfiguration(this, aPlayer)) { + aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.MULTI_MACHINE_CONFIG.LOAD")); + } else { + aPlayer + .addChatComponentMessage(new ChatComponentTranslation("GT5U.MULTI_MACHINE_CONFIG.LOAD.FAIL")); + } + } + return true; + } + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public byte getTileEntityBaseType() { + return 2; + } + + /** + * Set the structure as having changed, and trigger an update. + */ + public void onStructureChange() { + mStructureChanged = true; + } + + @Override + public void onMachineBlockUpdate() { + mUpdated = true; + } + + /** + * ClearHatches as a part of structure check. If your multiblock has any hatches that need clearing override this + * method, call super, and clear your own hatches + */ + public void clearHatches() { + mInputHatches.clear(); + mInputBusses.clear(); + mOutputHatches.clear(); + mOutputBusses.clear(); + mDynamoHatches.clear(); + mEnergyHatches.clear(); + setMufflers(false); + mMufflerHatches.clear(); + mMaintenanceHatches.clear(); + mDualInputHatches.clear(); + mSmartInputHatches.clear(); + } + + public boolean checkStructure(boolean aForceReset) { + return checkStructure(aForceReset, getBaseMetaTileEntity()); + } + + public boolean checkStructure(boolean aForceReset, IGregTechTileEntity aBaseMetaTileEntity) { + if (!aBaseMetaTileEntity.isServerSide()) return mMachine; + // Only trigger an update if forced (from onPostTick, generally), or if the structure has changed + if ((mStructureChanged || aForceReset)) { + clearHatches(); + mMachine = checkMachine(aBaseMetaTileEntity, mInventory[1]); + } + mStructureChanged = false; + return mMachine; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + // Time Counter + mTotalRunTime++; + if (mEfficiency < 0) mEfficiency = 0; + if (mUpdated) { + // duct tape fix for too many updates on an overloaded server, causing the structure check to not run + if (mUpdate <= 0) mUpdate = 50; + mUpdated = false; + } + if (--mUpdate == 0 || --mStartUpCheck == 0) { + checkStructure(true, aBaseMetaTileEntity); + } + + if (mStartUpCheck < 0) { + if (mMachine) { + checkMaintenance(); + if (getRepairStatus() > 0) { + runMachine(aBaseMetaTileEntity, aTick); + } else if (aBaseMetaTileEntity.isAllowedToWork()) { + stopMachine(ShutDownReasonRegistry.NO_REPAIR); + } + } else if (aBaseMetaTileEntity.isAllowedToWork()) { + stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE); + } + } + aBaseMetaTileEntity.setErrorDisplayID( + (aBaseMetaTileEntity.getErrorDisplayID() & ~127) | (mWrench ? 0 : 1) + | (mScrewdriver ? 0 : 2) + | (mSoftHammer ? 0 : 4) + | (mHardHammer ? 0 : 8) + | (mSolderingTool ? 0 : 16) + | (mCrowbar ? 0 : 32) + | (mMachine ? 0 : 64)); + aBaseMetaTileEntity.setActive(mMaxProgresstime > 0); + boolean active = aBaseMetaTileEntity.isActive() && mPollution > 0; + setMufflers(active); + } else { + if (!aBaseMetaTileEntity.hasMufflerUpgrade()) { + doActivitySound(getActivitySoundLoop()); + } + } + } + + @Override + public void onTickFail(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onTickFail(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide()) { + aBaseMetaTileEntity.disableWorking(); + checkRecipeResult = CheckRecipeResultRegistry.CRASH; + } + } + + public void checkMaintenance() { + if (!shouldCheckMaintenance()) return; + + if (getRepairStatus() != getIdealStatus()) { + for (MTEHatchMaintenance tHatch : filterValidMTEs(mMaintenanceHatches)) { + if (tHatch.mAuto) tHatch.autoMaintainance(); + if (tHatch.mWrench) mWrench = true; + if (tHatch.mScrewdriver) mScrewdriver = true; + if (tHatch.mSoftHammer) mSoftHammer = true; + if (tHatch.mHardHammer) mHardHammer = true; + if (tHatch.mSolderingTool) mSolderingTool = true; + if (tHatch.mCrowbar) mCrowbar = true; + + tHatch.mWrench = false; + tHatch.mScrewdriver = false; + tHatch.mSoftHammer = false; + tHatch.mHardHammer = false; + tHatch.mSolderingTool = false; + tHatch.mCrowbar = false; + } + } + } + + /** + * Starts checking recipe with some operations needed to actually run the check. Overriding this without due care + * may result in dupe of items, hence it's marked as final. + *

+ * See {@link #createProcessingLogic()} or {@link #checkProcessing()} for what you want to override. + * + * @return If successfully found recipe and/or started processing + */ + protected final boolean checkRecipe() { + startRecipeProcessing(); + CheckRecipeResult result = checkProcessing(); + if (!CheckRecipeResultRegistry.isRegistered(result.getID())) { + throw new RuntimeException(String.format("Result %s is not registered for registry", result.getID())); + } + if (result.wasSuccessful()) { + sendStartMultiBlockSoundLoop(); + } + this.checkRecipeResult = result; + endRecipeProcessing(); + // Don't use `result` here because `endRecipeProcessing()` might mutate `this.checkRecipeResult` + return this.checkRecipeResult.wasSuccessful(); + } + + private boolean shouldCheckRecipeThisTick(long aTick) { + // do a recipe check if any crafting input hatch just got pushed in items + boolean shouldCheck = false; + // check all of them (i.e. do not return early) to reset the state of all of them. + for (IDualInputHatch craftingInputMe : mDualInputHatches) { + shouldCheck |= craftingInputMe.justUpdated(); + } + if (shouldCheck) return true; + // Do the same for Smart Input Hatches + for (ISmartInputHatch smartInputHatch : mSmartInputHatches) { + shouldCheck |= smartInputHatch.justUpdated(); + } + if (shouldCheck) return true; + + // Perform more frequent recipe change after the machine just shuts down. + long timeElapsed = mTotalRunTime - mLastWorkingTick; + + if (timeElapsed >= CHECK_INTERVAL) return (mTotalRunTime + randomTickOffset) % CHECK_INTERVAL == 0; + // Batch mode should be a lot less aggressive at recipe checking + if (!isBatchModeEnabled()) { + return timeElapsed == 5 || timeElapsed == 12 + || timeElapsed == 20 + || timeElapsed == 30 + || timeElapsed == 40 + || timeElapsed == 55 + || timeElapsed == 70 + || timeElapsed == 85; + } + return false; + } + + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (mMaxProgresstime > 0 && doRandomMaintenanceDamage()) { + if (onRunningTick(mInventory[1])) { + markDirty(); + if (!polluteEnvironment(getPollutionPerTick(mInventory[1]))) { + stopMachine(ShutDownReasonRegistry.POLLUTION_FAIL); + } + if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) { + if (mOutputItems != null) { + for (ItemStack tStack : mOutputItems) { + if (tStack != null) { + try { + GTMod.achievements.issueAchivementHatch( + aBaseMetaTileEntity.getWorld() + .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), + tStack); + } catch (Exception ignored) {} + addOutput(tStack); + } + } + mOutputItems = null; + } + if (mOutputFluids != null) { + addFluidOutputs(mOutputFluids); + if (mOutputFluids.length > 1) { + try { + GTMod.achievements.issueAchievement( + aBaseMetaTileEntity.getWorld() + .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), + "oilplant"); + } catch (Exception ignored) {} + } + mOutputFluids = null; + } + mEfficiency = Math.max( + 0, + Math.min( + mEfficiency + mEfficiencyIncrease, + getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000))); + mOutputItems = null; + mProgresstime = 0; + mMaxProgresstime = 0; + mEfficiencyIncrease = 0; + mLastWorkingTick = mTotalRunTime; + if (aBaseMetaTileEntity.isAllowedToWork()) { + checkRecipe(); + } + } + } + } else { + // Check if the machine is enabled in the first place! + if (aBaseMetaTileEntity.isAllowedToWork()) { + + if (shouldCheckRecipeThisTick(aTick) || aBaseMetaTileEntity.hasWorkJustBeenEnabled() + || aBaseMetaTileEntity.hasInventoryBeenModified()) { + if (checkRecipe()) { + markDirty(); + } + } + if (mMaxProgresstime <= 0) mEfficiency = Math.max(0, mEfficiency - 1000); + } + } + } + + public boolean polluteEnvironment(int aPollutionLevel) { + mPollution += aPollutionLevel; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + if (mPollution >= 10000) { + if (tHatch.polluteEnvironment(this)) { + mPollution -= 10000; + } + } else { + break; + } + } + return mPollution < 10000; + } + + protected void sendStartMultiBlockSoundLoop() { + if (getProcessStartSound() != null) { + sendLoopStart(PROCESS_START_SOUND_INDEX); + } + } + + @Override + public void doSound(byte aIndex, double aX, double aY, double aZ) { + super.doSound(aIndex, aX, aY, aZ); + switch (aIndex) { + case PROCESS_START_SOUND_INDEX -> { + if (getProcessStartSound() != null) + GTUtility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); + } + case INTERRUPT_SOUND_INDEX -> GTUtility + .doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == PROCESS_START_SOUND_INDEX) { + if (getProcessStartSound() != null) + GTUtility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); + } + } + + @SideOnly(Side.CLIENT) + protected void doActivitySound(ResourceLocation activitySound) { + if (getBaseMetaTileEntity().isActive() && activitySound != null) { + if (activitySoundLoop == null) { + activitySoundLoop = new GTSoundLoop(activitySound, getBaseMetaTileEntity(), false, true); + Minecraft.getMinecraft() + .getSoundHandler() + .playSound(activitySoundLoop); + } + } else { + if (activitySoundLoop != null) { + activitySoundLoop = null; + } + } + } + + /** + * @return Time before the start process sound is played again + */ + protected int getTimeBetweenProcessSounds() { + return 100; + } + + /** + * @return Sound that will be played once, when the recipe check was valid + */ + protected SoundResource getProcessStartSound() { + return null; + } + + /** + * @return Sound that will be looped for as long as the machine is doing a recipe + */ + @SideOnly(Side.CLIENT) + protected ResourceLocation getActivitySoundLoop() { + return null; + } + + /** + * Called every tick the Machine runs + */ + public boolean onRunningTick(ItemStack aStack) { + if (mEUt > 0) { + addEnergyOutput(((long) mEUt * mEfficiency) / 10000); + return true; + } + if (mEUt < 0) { + if (!drainEnergyInput(getActualEnergyUsage())) { + stopMachine(ShutDownReasonRegistry.POWER_LOSS); + return false; + } + } + return true; + } + + protected long getActualEnergyUsage() { + return ((long) -mEUt * 10_000) / Math.max(1000, mEfficiency); + } + + /** + * Checks if this is a Correct Machine Part for this kind of Machine (Turbine Rotor for example) + */ + public abstract boolean isCorrectMachinePart(ItemStack aStack); + + /** + * @deprecated Use {@link #createProcessingLogic()} or {@link #checkProcessing()} + */ + @Deprecated + public boolean checkRecipe(ItemStack aStack) { + return false; + } + + /** + * Checks recipe and setup machine if it's successful. + *

+ * For generic machine working with recipemap, use {@link #createProcessingLogic()} to make use of shared codebase. + */ + @Nonnull + public CheckRecipeResult checkProcessing() { + // If no logic is found, try legacy checkRecipe + if (processingLogic == null) { + return checkRecipe(mInventory[1]) ? CheckRecipeResultRegistry.SUCCESSFUL + : CheckRecipeResultRegistry.NO_RECIPE; + } + + setupProcessingLogic(processingLogic); + + CheckRecipeResult result = doCheckRecipe(); + result = postCheckRecipe(result, processingLogic); + // inputs are consumed at this point + updateSlots(); + if (!result.wasSuccessful()) return result; + + mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); + mEfficiencyIncrease = 10000; + mMaxProgresstime = processingLogic.getDuration(); + setEnergyUsage(processingLogic); + + mOutputItems = processingLogic.getOutputItems(); + mOutputFluids = processingLogic.getOutputFluids(); + + return result; + } + + /** + * @return If controller slot should be considered as inputs for {@link #doCheckRecipe} + */ + protected boolean canUseControllerSlotForRecipe() { + return true; + } + + /** + * Initializes processing logic for use. Unlike {@link #createProcessingLogic}, this method is called + * every time checking for recipes. + */ + protected void setupProcessingLogic(ProcessingLogic logic) { + logic.clear(); + logic.setMachine(this); + logic.setRecipeMapSupplier(this::getRecipeMap); + logic.setVoidProtection(protectsExcessItem(), protectsExcessFluid()); + logic.setBatchSize(isBatchModeEnabled() ? getMaxBatchSize() : 1); + logic.setRecipeLocking(this, isRecipeLockingEnabled()); + setProcessingLogicPower(logic); + } + + /** + * Initializes processing logic for use, specifically for power-related parameters. + * Unlike {@link #createProcessingLogic}, this method is called every time checking for recipes. + */ + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(getAverageInputVoltage()); + logic.setAvailableAmperage(getMaxInputAmps()); + logic.setAmperageOC(mEnergyHatches.size() != 1); + } + + protected boolean supportsCraftingMEBuffer() { + return true; + } + + /** + * Iterates over hatches and tries to find recipe. Assume {@link #processingLogic} is already set up for use. + * If return value is successful, inputs are consumed. + */ + @Nonnull + protected CheckRecipeResult doCheckRecipe() { + CheckRecipeResult result = CheckRecipeResultRegistry.NO_RECIPE; + // check crafting input hatches first + if (supportsCraftingMEBuffer()) { + for (IDualInputHatch dualInputHatch : mDualInputHatches) { + for (var it = dualInputHatch.inventories(); it.hasNext();) { + IDualInputInventory slot = it.next(); + processingLogic.setInputItems(slot.getItemInputs()); + processingLogic.setInputFluids(slot.getFluidInputs()); + CheckRecipeResult foundResult = processingLogic.process(); + if (foundResult.wasSuccessful()) { + return foundResult; + } + if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { + // Recipe failed in interesting way, so remember that and continue searching + result = foundResult; + } + } + } + } + + processingLogic.setInputFluids(getStoredFluids()); + + if (isInputSeparationEnabled()) { + if (mInputBusses.isEmpty()) { + CheckRecipeResult foundResult = processingLogic.process(); + if (foundResult.wasSuccessful()) { + return foundResult; + } + if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { + // Recipe failed in interesting way, so remember that and continue searching + result = foundResult; + } + } else { + for (MTEHatchInputBus bus : mInputBusses) { + if (bus instanceof MTEHatchCraftingInputME) { + continue; + } + List inputItems = new ArrayList<>(); + for (int i = bus.getSizeInventory() - 1; i >= 0; i--) { + ItemStack stored = bus.getStackInSlot(i); + if (stored != null) { + inputItems.add(stored); + } + } + if (canUseControllerSlotForRecipe() && getControllerSlot() != null) { + inputItems.add(getControllerSlot()); + } + processingLogic.setInputItems(inputItems.toArray(new ItemStack[0])); + CheckRecipeResult foundResult = processingLogic.process(); + if (foundResult.wasSuccessful()) { + return foundResult; + } + if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { + // Recipe failed in interesting way, so remember that and continue searching + result = foundResult; + } + } + } + } else { + List inputItems = getStoredInputs(); + if (canUseControllerSlotForRecipe() && getControllerSlot() != null) { + inputItems.add(getControllerSlot()); + } + processingLogic.setInputItems(inputItems); + CheckRecipeResult foundResult = processingLogic.process(); + if (foundResult.wasSuccessful()) { + return foundResult; + } + if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) { + // Recipe failed in interesting way, so remember that + result = foundResult; + } + } + return result; + } + + /** + * Performs additional check for {@link #processingLogic} after all the calculations are done. + * As many as checks should be done inside of custom {@link ProcessingLogic}, which you can specify with + * {@link #createProcessingLogic()}, because when this method is called, inputs might have been already consumed. + * However, certain checks cannot be done like that; Checking energy overflow should be suppressed for + * long-power machines for example. + * + * @return Modified (or not modified) result + */ + @Nonnull + protected CheckRecipeResult postCheckRecipe(@Nonnull CheckRecipeResult result, + @Nonnull ProcessingLogic processingLogic) { + if (result.wasSuccessful() && processingLogic.getCalculatedEut() > Integer.MAX_VALUE) { + return CheckRecipeResultRegistry.POWER_OVERFLOW; + } + return result; + } + + /** + * Called after {@link #doCheckRecipe} and {@link #postCheckRecipe} being successful. + * Override to set energy usage for this machine. + */ + protected void setEnergyUsage(ProcessingLogic processingLogic) { + // getCalculatedEut() is guaranteed to not exceed int by postCheckRecipe() + mEUt = (int) processingLogic.getCalculatedEut(); + if (mEUt > 0) { + mEUt = (-mEUt); + } + } + + protected int getMaxBatchSize() { + return 128; + } + + /** + * Checks the Machine. You have to assign the MetaTileEntities for the Hatches here. + */ + public abstract boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack); + + /** + * Gets the maximum Efficiency that spare Part can get (0 - 10000) + */ + public abstract int getMaxEfficiency(ItemStack aStack); + + /** + * Gets the pollution this Device outputs to a Muffler per tick (10000 = one Pullution Block) + */ + public int getPollutionPerTick(ItemStack aStack) { + return getPollutionPerSecond(aStack) / 20; + } + + /** + * Gets the pollution produced per second by this multiblock, default to 0. Override this with its actual value in + * the code of the multiblock. + */ + public int getPollutionPerSecond(ItemStack aStack) { + return 0; + } + + /** + * Gets the damage to the ItemStack, usually 0 or 1. + */ + public abstract int getDamageToComponent(ItemStack aStack); + + /** + * If it explodes when the Component has to be replaced. + */ + public abstract boolean explodesOnComponentBreak(ItemStack aStack); + + /** + * @deprecated Use {@link #stopMachine(ShutDownReason)} + */ + @Deprecated + public void stopMachine() { + stopMachine(ShutDownReasonRegistry.NONE); + } + + /** + * @deprecated Use {@link #stopMachine(ShutDownReason)} + */ + @Deprecated + public void criticalStopMachine() { + stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); + } + + public void stopMachine(@Nonnull ShutDownReason reason) { + if (!ShutDownReasonRegistry.isRegistered(reason.getID())) { + throw new RuntimeException(String.format("Reason %s is not registered for registry", reason.getID())); + } + mLastWorkingTick = mTotalRunTime; + mOutputItems = null; + mOutputFluids = null; + mEUt = 0; + mEfficiency = 0; + mProgresstime = 0; + mMaxProgresstime = 0; + mEfficiencyIncrease = 0; + getBaseMetaTileEntity().disableWorking(); + getBaseMetaTileEntity().setShutDownReason(reason); + getBaseMetaTileEntity().setShutdownStatus(true); + if (reason.wasCritical()) { + sendSound(INTERRUPT_SOUND_INDEX); + } + } + + public int getRepairStatus() { + return (mWrench ? 1 : 0) + (mScrewdriver ? 1 : 0) + + (mSoftHammer ? 1 : 0) + + (mHardHammer ? 1 : 0) + + (mSolderingTool ? 1 : 0) + + (mCrowbar ? 1 : 0); + } + + public int getIdealStatus() { + return 6; + } + + public int getCurrentEfficiency(ItemStack itemStack) { + int maxEff = getMaxEfficiency(itemStack); + return maxEff - (getIdealStatus() - getRepairStatus()) * maxEff / 10; + } + + public boolean doRandomMaintenanceDamage() { + if (!isCorrectMachinePart(mInventory[1])) { + stopMachine(ShutDownReasonRegistry.NO_MACHINE_PART); + return false; + } + if (shouldCheckMaintenance() && getRepairStatus() == 0) { + stopMachine(ShutDownReasonRegistry.NO_REPAIR); + return false; + } + if (mRuntime++ > 1000) { + mRuntime = 0; + if (shouldCheckMaintenance() && getBaseMetaTileEntity().getRandomNumber(6000) == 0) { + causeMaintenanceIssue(); + } + if (mInventory[1] != null && getBaseMetaTileEntity().getRandomNumber(2) == 0 + && !mInventory[1].getUnlocalizedName() + .startsWith("gt.blockmachines.basicmachine.")) { + if (mInventory[1].getItem() instanceof MetaGeneratedTool01) { + NBTTagCompound tNBT = mInventory[1].getTagCompound(); + ((MetaGeneratedTool) mInventory[1].getItem()).doDamage( + mInventory[1], + (long) getDamageToComponent(mInventory[1]) + * (long) Math.min(mEUt / this.damageFactorLow, Math.pow(mEUt, this.damageFactorHigh))); + if (mInventory[1].stackSize == 0) mInventory[1] = null; + } + } + } + return true; + } + + public void causeMaintenanceIssue() { + 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; + } + } + + public void explodeMultiblock() { + + GTLog.exp.println( + "MultiBlockExplosion at: " + this.getBaseMetaTileEntity() + .getXCoord() + + " | " + + this.getBaseMetaTileEntity() + .getYCoord() + + " | " + + this.getBaseMetaTileEntity() + .getZCoord() + + " DIMID: " + + this.getBaseMetaTileEntity() + .getWorld().provider.dimensionId + + "."); + + Pollution.addPollution(getBaseMetaTileEntity(), GTMod.gregtechproxy.mPollutionOnExplosion); + mInventory[1] = null; + // noinspection unchecked // In this case, the inspection only indicates that the array can be abused in runtime + Iterable allHatches = Iterables.concat( + mInputBusses, + mOutputBusses, + mInputHatches, + mOutputHatches, + mDynamoHatches, + mMufflerHatches, + mEnergyHatches, + mMaintenanceHatches); + for (MetaTileEntity tTileEntity : allHatches) { + if (tTileEntity != null && tTileEntity.getBaseMetaTileEntity() != null) { + tTileEntity.getBaseMetaTileEntity() + .doExplosion(V[8]); + } + } + getBaseMetaTileEntity().doExplosion(V[8]); + } + + public boolean addEnergyOutput(long aEU) { + if (aEU <= 0) { + return true; + } + if (mDynamoHatches.size() > 0) { + return addEnergyOutputMultipleDynamos(aEU, true); + } + return false; + } + + public boolean addEnergyOutputMultipleDynamos(long aEU, boolean aAllowMixedVoltageDynamos) { + int injected = 0; + long totalOutput = 0; + long aFirstVoltageFound = -1; + boolean aFoundMixedDynamos = false; + for (MTEHatchDynamo aDynamo : filterValidMTEs(mDynamoHatches)) { + long aVoltage = aDynamo.maxEUOutput(); + long aTotal = aDynamo.maxAmperesOut() * aVoltage; + // Check against voltage to check when hatch mixing + if (aFirstVoltageFound == -1) { + aFirstVoltageFound = aVoltage; + } else { + if (aFirstVoltageFound != aVoltage) { + aFoundMixedDynamos = true; + } + } + totalOutput += aTotal; + } + + if (totalOutput < aEU || (aFoundMixedDynamos && !aAllowMixedVoltageDynamos)) { + explodeMultiblock(); + return false; + } + + long leftToInject; + long aVoltage; + int aAmpsToInject; + int aRemainder; + int ampsOnCurrentHatch; + for (MTEHatchDynamo aDynamo : filterValidMTEs(mDynamoHatches)) { + leftToInject = aEU - injected; + aVoltage = aDynamo.maxEUOutput(); + aAmpsToInject = (int) (leftToInject / aVoltage); + aRemainder = (int) (leftToInject - (aAmpsToInject * aVoltage)); + ampsOnCurrentHatch = (int) Math.min(aDynamo.maxAmperesOut(), aAmpsToInject); + for (int i = 0; i < ampsOnCurrentHatch; i++) { + aDynamo.getBaseMetaTileEntity() + .increaseStoredEnergyUnits(aVoltage, false); + } + injected += aVoltage * ampsOnCurrentHatch; + if (aRemainder > 0 && ampsOnCurrentHatch < aDynamo.maxAmperesOut()) { + aDynamo.getBaseMetaTileEntity() + .increaseStoredEnergyUnits(aRemainder, false); + injected += aRemainder; + } + } + return injected > 0; + } + + /** + * Sums up voltage of energy hatches. Amperage does not matter. + */ + public long getMaxInputVoltage() { + long rVoltage = 0; + for (MTEHatchEnergy tHatch : filterValidMTEs(mEnergyHatches)) rVoltage += tHatch.getBaseMetaTileEntity() + .getInputVoltage(); + return rVoltage; + } + + public long getAverageInputVoltage() { + return ExoticEnergyInputHelper.getAverageInputVoltageMulti(mEnergyHatches); + } + + public long getMaxInputAmps() { + return ExoticEnergyInputHelper.getMaxWorkingInputAmpsMulti(mEnergyHatches); + } + + public long getMaxInputEu() { + return ExoticEnergyInputHelper.getTotalEuMulti(mEnergyHatches); + } + + /** + * Sums up max input EU/t of energy hatches, amperage included. + */ + public long getMaxInputPower() { + long eut = 0; + for (MTEHatchEnergy tHatch : filterValidMTEs(mEnergyHatches)) { + IGregTechTileEntity baseTile = tHatch.getBaseMetaTileEntity(); + eut += baseTile.getInputVoltage() * baseTile.getInputAmperage(); + } + return eut; + } + + /** + * Returns voltage tier of energy hatches. If multiple tiers are found, returns 0. + */ + public long getInputVoltageTier() { + long rTier = 0; + if (mEnergyHatches.size() > 0) { + rTier = mEnergyHatches.get(0) + .getInputTier(); + for (int i = 1; i < mEnergyHatches.size(); i++) { + if (mEnergyHatches.get(i) + .getInputTier() != rTier) return 0; + } + } + + return rTier; + } + + /** + * Calcualtes the overclockedness using long integers + * + * @param aEUt - recipe EUt + * @param aDuration - recipe Duration + * @param mAmperage - should be 1 ? + * @param maxInputVoltage - Multiblock Max input voltage. Voltage is rounded up to higher tier voltage. + * @param perfectOC - If the Multiblock OCs perfectly, i.e. the large Chemical Reactor + */ + protected void calculateOverclockedNessMultiInternal(long aEUt, int aDuration, int mAmperage, long maxInputVoltage, + boolean perfectOC) { + byte tier = (byte) Math.max(0, GTUtility.getTier(maxInputVoltage)); + OverclockCalculator calculator = new OverclockCalculator().setRecipeEUt(aEUt) + .setEUt(V[tier] * mAmperage) + .setDuration(aDuration) + .setDurationDecreasePerOC(perfectOC ? 4.0 : 2.0) + .calculate(); + mEUt = (int) calculator.getConsumption(); + mMaxProgresstime = calculator.getDuration(); + } + + @Deprecated + protected void calculateOverclockedNessMulti(int aEUt, int aDuration, int mAmperage, long maxInputVoltage) { + calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, false); + } + + protected void calculateOverclockedNessMulti(long aEUt, int aDuration, int mAmperage, long maxInputVoltage) { + calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, false); + } + + @Deprecated + protected void calculatePerfectOverclockedNessMulti(int aEUt, int aDuration, int mAmperage, long maxInputVoltage) { + calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, true); + } + + protected void calculatePerfectOverclockedNessMulti(long aEUt, int aDuration, int mAmperage, long maxInputVoltage) { + calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, true); + } + + public boolean drainEnergyInput(long aEU) { + if (aEU <= 0) return true; + for (MTEHatchEnergy tHatch : filterValidMTEs(mEnergyHatches)) { + if (tHatch.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(aEU, false)) return true; + } + return false; + } + + protected static boolean dumpFluid(List aOutputHatches, FluidStack copiedFluidStack, + boolean restrictiveHatchesOnly) { + for (MTEHatchOutput tHatch : filterValidMTEs(aOutputHatches)) { + if (restrictiveHatchesOnly && tHatch.mMode == 0) { + continue; + } + if (!tHatch.canStoreFluid(copiedFluidStack)) continue; + int tAmount = tHatch.fill(copiedFluidStack, false); + if (tAmount >= copiedFluidStack.amount) { + boolean filled = tHatch.fill(copiedFluidStack, true) >= copiedFluidStack.amount; + tHatch.onEmptyingContainerWhenEmpty(); + return filled; + } else if (tAmount > 0) { + copiedFluidStack.amount = copiedFluidStack.amount - tHatch.fill(copiedFluidStack, true); + tHatch.onEmptyingContainerWhenEmpty(); + } + } + return false; + } + + public boolean addOutput(FluidStack aLiquid) { + if (aLiquid == null) return false; + FluidStack copiedFluidStack = aLiquid.copy(); + if (!dumpFluid(mOutputHatches, copiedFluidStack, true)) { + dumpFluid(mOutputHatches, copiedFluidStack, false); + } + return false; + } + + protected void addFluidOutputs(FluidStack[] mOutputFluids2) { + for (FluidStack outputFluidStack : mOutputFluids2) { + addOutput(outputFluidStack); + } + } + + public boolean depleteInput(FluidStack aLiquid) { + return depleteInput(aLiquid, false); + } + + public boolean depleteInput(FluidStack aLiquid, boolean simulate) { + if (aLiquid == null) return false; + for (MTEHatchInput tHatch : filterValidMTEs(mInputHatches)) { + setHatchRecipeMap(tHatch); + FluidStack tLiquid = tHatch.drain(ForgeDirection.UNKNOWN, aLiquid, false); + if (tLiquid != null && tLiquid.amount >= aLiquid.amount) { + if (simulate) { + return true; + } + tLiquid = tHatch.drain(ForgeDirection.UNKNOWN, aLiquid, true); + return tLiquid != null && tLiquid.amount >= aLiquid.amount; + } + } + return false; + } + + public boolean addOutput(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return false; + aStack = GTUtility.copyOrNull(aStack); + + final List filteredBuses = filterValidMTEs(mOutputBusses); + if (dumpItem(filteredBuses, aStack, true) || dumpItem(filteredBuses, aStack, false)) { + return true; + } + + boolean outputSuccess = true; + // noinspection DataFlowIssue + while (outputSuccess && aStack.stackSize > 0) { + outputSuccess = false; + ItemStack single = aStack.splitStack(1); + for (MTEHatchOutput tHatch : filterValidMTEs(mOutputHatches)) { + if (!outputSuccess && tHatch.outputsItems()) { + if (tHatch.getBaseMetaTileEntity() + .addStackToSlot(1, single)) outputSuccess = true; + } + } + } + return outputSuccess; + } + + private boolean dumpItem(List outputBuses, ItemStack itemStack, boolean restrictiveBusesOnly) { + for (MTEHatchOutputBus outputBus : outputBuses) { + if (restrictiveBusesOnly && !outputBus.isLocked()) { + continue; + } + + if (outputBus.storeAll(itemStack)) { + return true; + } + } + + return false; + } + + public boolean depleteInput(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return false; + FluidStack aLiquid = GTUtility.getFluidForFilledItem(aStack, true); + if (aLiquid != null) return depleteInput(aLiquid); + for (MTEHatchInput tHatch : filterValidMTEs(mInputHatches)) { + setHatchRecipeMap(tHatch); + if (GTUtility.areStacksEqual( + aStack, + tHatch.getBaseMetaTileEntity() + .getStackInSlot(0))) { + if (tHatch.getBaseMetaTileEntity() + .getStackInSlot(0).stackSize >= aStack.stackSize) { + tHatch.getBaseMetaTileEntity() + .decrStackSize(0, aStack.stackSize); + return true; + } + } + } + for (MTEHatchInputBus tHatch : filterValidMTEs(mInputBusses)) { + tHatch.mRecipeMap = getRecipeMap(); + for (int i = tHatch.getBaseMetaTileEntity() + .getSizeInventory() - 1; i >= 0; i--) { + if (GTUtility.areStacksEqual( + aStack, + tHatch.getBaseMetaTileEntity() + .getStackInSlot(i))) { + if (tHatch.getBaseMetaTileEntity() + .getStackInSlot(i).stackSize >= aStack.stackSize) { + tHatch.getBaseMetaTileEntity() + .decrStackSize(i, aStack.stackSize); + return true; + } + } + } + } + return false; + } + + public ArrayList getStoredOutputs() { + ArrayList rList = new ArrayList<>(); + for (MTEHatchOutputBus tHatch : filterValidMTEs(mOutputBusses)) { + for (int i = tHatch.getBaseMetaTileEntity() + .getSizeInventory() - 1; i >= 0; i--) { + rList.add( + tHatch.getBaseMetaTileEntity() + .getStackInSlot(i)); + } + } + return rList; + } + + public ArrayList getStoredFluids() { + ArrayList rList = new ArrayList<>(); + Map inputsFromME = new HashMap<>(); + for (MTEHatchInput tHatch : filterValidMTEs(mInputHatches)) { + setHatchRecipeMap(tHatch); + if (tHatch instanceof MTEHatchMultiInput multiInputHatch) { + for (FluidStack tFluid : multiInputHatch.getStoredFluid()) { + if (tFluid != null) { + rList.add(tFluid); + } + } + } else if (tHatch instanceof MTEHatchInputME meHatch) { + for (FluidStack fluidStack : meHatch.getStoredFluids()) { + if (fluidStack != null) { + // Prevent the same fluid from different ME hatches from being recognized + inputsFromME.put(fluidStack.getFluid(), fluidStack); + } + } + } else { + if (tHatch.getFillableStack() != null) { + rList.add(tHatch.getFillableStack()); + } + } + } + + if (!inputsFromME.isEmpty()) { + rList.addAll(inputsFromME.values()); + } + return rList; + } + + /** + * Drains fluid from the given hatch, including {@link IDualInputHatch}. Should never be used during recipe check! + * + * @param doDrain If false, fluid will not actually be consumed + * @return Whether the hatch contains enough fluid to drain + */ + public boolean drain(MTEHatch hatch, FluidStack fluid, boolean doDrain) { + if (fluid == null || hatch == null) return false; + if (supportsCraftingMEBuffer() && hatch instanceof IDualInputHatch tHatch && tHatch.supportsFluids()) { + Optional inventory = tHatch.getFirstNonEmptyInventory(); + if (inventory.isPresent()) { + for (FluidStack storedFluid : Lists.newArrayList( + inventory.get() + .getFluidInputs())) { + if (fluid.isFluidEqual(storedFluid)) { + if (doDrain) storedFluid.amount = Math.max(storedFluid.amount - fluid.amount, 0); + return storedFluid.amount >= fluid.amount; + } + } + } + } + + if (hatch instanceof MTEHatchInput tHatch && tHatch.isValid()) { + if (tHatch instanceof MTEHatchInputME meHatch) { + meHatch.startRecipeProcessing(); + FluidStack tFluid = meHatch.drain(ForgeDirection.UNKNOWN, fluid, doDrain); + meHatch.endRecipeProcessing(this); + return tFluid != null && tFluid.amount >= fluid.amount; + } else { + FluidStack tFluid = tHatch.drain(ForgeDirection.UNKNOWN, fluid, doDrain); + return tFluid != null && tFluid.amount >= fluid.amount; + } + } + + return false; + } + + public ArrayList getStoredInputs() { + ArrayList rList = new ArrayList<>(); + Map inputsFromME = new HashMap<>(); + for (MTEHatchInputBus tHatch : filterValidMTEs(mInputBusses)) { + if (tHatch instanceof MTEHatchCraftingInputME) { + continue; + } + tHatch.mRecipeMap = getRecipeMap(); + IGregTechTileEntity tileEntity = tHatch.getBaseMetaTileEntity(); + boolean isMEBus = tHatch instanceof MTEHatchInputBusME; + for (int i = tileEntity.getSizeInventory() - 1; i >= 0; i--) { + ItemStack itemStack = tileEntity.getStackInSlot(i); + if (itemStack != null) { + if (isMEBus) { + // Prevent the same item from different ME buses from being recognized + inputsFromME.put(GTUtility.ItemId.createNoCopy(itemStack), itemStack); + } else { + rList.add(itemStack); + } + } + } + } + + if (getStackInSlot(1) != null && getStackInSlot(1).getUnlocalizedName() + .startsWith("gt.integrated_circuit")) rList.add(getStackInSlot(1)); + if (!inputsFromME.isEmpty()) { + rList.addAll(inputsFromME.values()); + } + return rList; + } + + /** + * Anything that is usually separated off in {@link #getStoredInputs()} (like crafting input bus/buffer) is also + * included here. + */ + public ArrayList getAllStoredInputs() { + ArrayList rList = new ArrayList<>(); + + if (supportsCraftingMEBuffer()) { + for (IDualInputHatch dualInputHatch : mDualInputHatches) { + Iterator inventoryIterator = dualInputHatch.inventories(); + while (inventoryIterator.hasNext()) { + ItemStack[] items = inventoryIterator.next() + .getItemInputs(); + if (items == null) { + continue; + } + for (int i = 0; i < items.length; i++) { + ItemStack item = items[i]; + if (item != null) { + rList.add(item); + } + } + } + } + } + + Map inputsFromME = new HashMap<>(); + for (MTEHatchInputBus tHatch : filterValidMTEs(mInputBusses)) { + if (tHatch instanceof MTEHatchCraftingInputME) { + continue; + } + tHatch.mRecipeMap = getRecipeMap(); + IGregTechTileEntity tileEntity = tHatch.getBaseMetaTileEntity(); + boolean isMEBus = tHatch instanceof MTEHatchInputBusME; + for (int i = tileEntity.getSizeInventory() - 1; i >= 0; i--) { + ItemStack itemStack = tileEntity.getStackInSlot(i); + if (itemStack != null) { + if (isMEBus) { + // Prevent the same item from different ME buses from being recognized + inputsFromME.put(GTUtility.ItemId.createNoCopy(itemStack), itemStack); + } else { + rList.add(itemStack); + } + } + } + } + + if (getStackInSlot(1) != null && getStackInSlot(1).getUnlocalizedName() + .startsWith("gt.integrated_circuit")) rList.add(getStackInSlot(1)); + if (!inputsFromME.isEmpty()) { + rList.addAll(inputsFromME.values()); + } + return rList; + } + + public Map getStoredInputsFromME() { + Map inputsFromME = new Object2ReferenceOpenHashMap<>(); + for (MTEHatchInputBus tHatch : filterValidMTEs(mInputBusses)) { + if (tHatch instanceof MTEHatchInputBusME meBus) { + for (int i = meBus.getSizeInventory() - 1; i >= 0; i--) { + ItemStack itemStack = meBus.getStackInSlot(i); + if (itemStack != null) { + // Prevent the same item from different ME buses from being recognized + inputsFromME.put(GTUtility.ItemId.createNoCopy(itemStack), itemStack); + } + } + } + } + return inputsFromME; + } + + public Map getStoredFluidsFromME() { + Map fluidsFromME = new Reference2ReferenceOpenHashMap<>(); + for (MTEHatchInput tHatch : filterValidMTEs(mInputHatches)) { + if (tHatch instanceof MTEHatchInputME meHatch) { + for (FluidStack fluid : meHatch.getStoredFluids()) { + if (fluid != null) { + // Prevent the same fluid from different ME hatches from being recognized + fluidsFromME.put(fluid.getFluid(), fluid); + } + } + } + } + return fluidsFromME; + } + + @Override + public RecipeMap getRecipeMap() { + return null; + } + + /** + * Creates logic to run recipe check based on recipemap. This runs only once, on class instantiation. + *

+ * If this machine doesn't use recipemap or does some complex things, override {@link #checkProcessing()}. + */ + @ApiStatus.OverrideOnly + protected ProcessingLogic createProcessingLogic() { + return null; + } + + public void updateSlots() { + for (MTEHatchInput tHatch : filterValidMTEs(mInputHatches)) tHatch.updateSlots(); + for (MTEHatchInputBus tHatch : filterValidMTEs(mInputBusses)) tHatch.updateSlots(); + } + + protected void startRecipeProcessing() { + for (MTEHatchInputBus hatch : filterValidMTEs(mInputBusses)) { + if (hatch instanceof IRecipeProcessingAwareHatch aware) { + aware.startRecipeProcessing(); + } + } + for (MTEHatchInput hatch : filterValidMTEs(mInputHatches)) { + if (hatch instanceof IRecipeProcessingAwareHatch aware) { + aware.startRecipeProcessing(); + } + } + } + + public void setResultIfFailure(CheckRecipeResult result) { + if (!result.wasSuccessful()) { + this.checkRecipeResult = result; + } + } + + protected void endRecipeProcessing() { + for (MTEHatchInputBus hatch : filterValidMTEs(mInputBusses)) { + if (hatch instanceof IRecipeProcessingAwareHatch aware) { + setResultIfFailure(aware.endRecipeProcessing(this)); + } + } + for (MTEHatchInput hatch : filterValidMTEs(mInputHatches)) { + if (hatch instanceof IRecipeProcessingAwareHatch aware) { + setResultIfFailure(aware.endRecipeProcessing(this)); + } + } + } + + public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatch hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + } + if (aMetaTileEntity instanceof IDualInputHatch hatch) { + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mDualInputHatches.add(hatch); + } + if (aMetaTileEntity instanceof ISmartInputHatch hatch) { + // Only add them to be iterated if enabled for performance reasons + if (hatch.doFastRecipeCheck()) { + mSmartInputHatches.add(hatch); + } + } + if (aMetaTileEntity instanceof MTEHatchInput) { + setHatchRecipeMap((MTEHatchInput) aMetaTileEntity); + return mInputHatches.add((MTEHatchInput) aMetaTileEntity); + } + if (aMetaTileEntity instanceof MTEHatchInputBus) { + ((MTEHatchInputBus) aMetaTileEntity).mRecipeMap = getRecipeMap(); + return mInputBusses.add((MTEHatchInputBus) aMetaTileEntity); + } + if (aMetaTileEntity instanceof MTEHatchOutput) return mOutputHatches.add((MTEHatchOutput) aMetaTileEntity); + if (aMetaTileEntity instanceof MTEHatchOutputBus) return mOutputBusses.add((MTEHatchOutputBus) aMetaTileEntity); + if (aMetaTileEntity instanceof MTEHatchEnergy) return mEnergyHatches.add((MTEHatchEnergy) aMetaTileEntity); + if (aMetaTileEntity instanceof MTEHatchDynamo) return mDynamoHatches.add((MTEHatchDynamo) aMetaTileEntity); + if (aMetaTileEntity instanceof MTEHatchMaintenance) + return mMaintenanceHatches.add((MTEHatchMaintenance) aMetaTileEntity); + if (aMetaTileEntity instanceof MTEHatchMuffler) return mMufflerHatches.add((MTEHatchMuffler) aMetaTileEntity); + return false; + } + + public boolean addMaintenanceToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchMaintenance hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mMaintenanceHatches.add(hatch); + } + return false; + } + + public boolean addEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchEnergy hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mEnergyHatches.add(hatch); + } + return false; + } + + public boolean addExoticEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatch hatch && ExoticEnergyInputHelper.isExoticEnergyInput(aMetaTileEntity)) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mExoticEnergyHatches.add(hatch); + } + return false; + } + + public boolean addDynamoToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchDynamo hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mDynamoHatches.add(hatch); + } + return false; + } + + public boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchMuffler hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mMufflerHatches.add(hatch); + } + return false; + } + + public boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + return addInputBusToMachineList(aTileEntity, aBaseCasingIndex) + || addInputHatchToMachineList(aTileEntity, aBaseCasingIndex); + } + + public boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + return addOutputBusToMachineList(aTileEntity, aBaseCasingIndex) + || addOutputHatchToMachineList(aTileEntity, aBaseCasingIndex); + } + + public boolean addInputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof IDualInputHatch hatch) { + if (!supportsCraftingMEBuffer()) return false; + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mDualInputHatches.add(hatch); + } + if (aMetaTileEntity instanceof ISmartInputHatch hatch) { + mSmartInputHatches.add(hatch); + } + if (aMetaTileEntity instanceof MTEHatchInputBus hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + hatch.mRecipeMap = getRecipeMap(); + return mInputBusses.add(hatch); + } + return false; + } + + public boolean addOutputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchOutputBus hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mOutputBusses.add(hatch); + } + return false; + } + + public boolean addInputHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof ISmartInputHatch hatch) { + mSmartInputHatches.add(hatch); + } + if (aMetaTileEntity instanceof MTEHatchInput hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + setHatchRecipeMap(hatch); + return mInputHatches.add(hatch); + } + return false; + } + + public boolean addOutputHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchOutput hatch) { + hatch.updateTexture(aBaseCasingIndex); + hatch.updateCraftingIcon(this.getMachineCraftingIcon()); + return mOutputHatches.add(hatch); + } + return false; + } + + protected void setHatchRecipeMap(MTEHatchInput hatch) { + if (filtersFluid()) { + hatch.mRecipeMap = getRecipeMap(); + } + } + + /** + * @return If this multi filters fluid input for hatches based on recipemap. + */ + protected boolean filtersFluid() { + return true; + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + } + + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatchEnergy tHatch : filterValidMTEs(mEnergyHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { + /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + formatNumbers(getActualEnergyUsage()) + + EnumChatFormatting.RESET + + " EU/t", + /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + + EnumChatFormatting.YELLOW + + formatNumbers(getMaxInputVoltage()) + + EnumChatFormatting.RESET + + " EU/t(*2A) " + + StatCollector.translateToLocal("GT5U.machines.tier") + + ": " + + EnumChatFormatting.YELLOW + + VN[GTUtility.getTier(getMaxInputVoltage())] + + EnumChatFormatting.RESET, + /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.multiblock.efficiency") + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" }; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return supportsSlotAutomation(aIndex); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return supportsSlotAutomation(aIndex); + } + + protected ItemStack[] getCompactedInputs() { + // TODO: repalce method with a cleaner one + ArrayList tInputList = getStoredInputs(); + int tInputList_sS = tInputList.size(); + for (int i = 0; i < tInputList_sS - 1; i++) { + for (int j = i + 1; j < tInputList_sS; j++) { + if (!GTUtility.areStacksEqual(tInputList.get(i), tInputList.get(j))) continue; + if (tInputList.get(i).stackSize >= tInputList.get(j).stackSize) { + tInputList.remove(j--); + tInputList_sS = tInputList.size(); + } else { + tInputList.remove(i--); + tInputList_sS = tInputList.size(); + break; + } + } + } + return tInputList.toArray(new ItemStack[0]); + } + + protected FluidStack[] getCompactedFluids() { + // TODO: repalce method with a cleaner one + ArrayList tFluidList = getStoredFluids(); + int tFluidList_sS = tFluidList.size(); + for (int i = 0; i < tFluidList_sS - 1; i++) { + for (int j = i + 1; j < tFluidList_sS; j++) { + if (!GTUtility.areFluidsEqual(tFluidList.get(i), tFluidList.get(j))) continue; + + if (tFluidList.get(i).amount >= tFluidList.get(j).amount) { + tFluidList.remove(j--); + tFluidList_sS = tFluidList.size(); + } else { + tFluidList.remove(i--); + tFluidList_sS = tFluidList.size(); + break; + } + } + } + return tFluidList.toArray(new FluidStack[0]); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + final NBTTagCompound tag = accessor.getNBTData(); + + if (tag.getBoolean("incompleteStructure")) { + currentTip.add(RED + "** INCOMPLETE STRUCTURE **" + RESET); + } + String efficiency = RESET + " Efficiency: " + tag.getFloat("efficiency") + "%"; + if (tag.getBoolean("hasProblems")) { + currentTip.add(RED + "** HAS PROBLEMS **" + efficiency); + } else if (!tag.getBoolean("incompleteStructure")) { + currentTip.add(GREEN + "Running Fine" + efficiency); + } + + boolean isActive = tag.getBoolean("isActive"); + if (isActive) { + long energyTier = tag.getLong("energyTier"); + long actualEnergyUsage = tag.getLong("energyUsage"); + if (energyTier > 0) { + if (actualEnergyUsage > 0) { + currentTip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.use_with_amperage", + formatNumbers(actualEnergyUsage), + GTUtility.getAmperageForTier(actualEnergyUsage, (byte) energyTier), + GTUtility.getColoredTierNameFromTier((byte) energyTier))); + } else if (actualEnergyUsage < 0) { + currentTip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.produce_with_amperage", + formatNumbers(-actualEnergyUsage), + GTUtility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier), + GTUtility.getColoredTierNameFromTier((byte) energyTier))); + } + } else { + if (actualEnergyUsage > 0) { + currentTip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.use", + formatNumbers(actualEnergyUsage), + GTUtility.getColoredTierNameFromVoltage(actualEnergyUsage))); + } else if (actualEnergyUsage < 0) { + currentTip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.energy.produce", + formatNumbers(-actualEnergyUsage), + GTUtility.getColoredTierNameFromVoltage(-actualEnergyUsage))); + } + } + } + currentTip + .add(GTWaila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress"))); + // Show ns on the tooltip + if (GTMod.gregtechproxy.wailaAverageNS && tag.hasKey("averageNS")) { + int tAverageTime = tag.getInteger("averageNS"); + currentTip.add("Average CPU load of ~" + formatNumbers(tAverageTime) + " ns"); + } + super.getWailaBody(itemStack, currentTip, accessor, config); + } + + public final void getMTEWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + + tag.setBoolean("hasProblems", (getIdealStatus() - getRepairStatus()) > 0); + tag.setFloat("efficiency", mEfficiency / 100.0F); + tag.setInteger("progress", mProgresstime); + tag.setInteger("maxProgress", mMaxProgresstime); + tag.setBoolean("incompleteStructure", (getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0); + + final IGregTechTileEntity tileEntity = getBaseMetaTileEntity(); + if (tileEntity != null) { + tag.setBoolean("isActive", tileEntity.isActive()); + if (tileEntity.isActive()) { + if (mEUt < 0) tag.setLong("energyUsage", getActualEnergyUsage()); + else tag.setLong("energyUsage", (long) -mEUt * mEfficiency / 10000); + tag.setLong("energyTier", getInputVoltageTier()); + } + } + + final GTClientPreference preference = GTMod.gregtechproxy.getClientPreference(player.getUniqueID()); + if (preference != null && preference.isWailaAverageNSEnabled()) { + getBaseMetaTileEntity().startTimeStatistics(); + int tAverageTime = 0; + int amountOfZero = 0; + for (int tTime : this.getBaseMetaTileEntity() + .getTimeStatistics()) { + tAverageTime += tTime; + if (tTime == 0) { + amountOfZero += 1; + } + } + + // tick time zero means it has not been updated yet + int samples = getBaseMetaTileEntity().getTimeStatistics().length - amountOfZero; + if (samples > 0) { + tag.setInteger("averageNS", tAverageTime / samples); + } + } + } + + protected void setMufflers(boolean state) { + for (MTEHatchMuffler aMuffler : mMufflerHatches) { + final IGregTechTileEntity iGTTileEntity = aMuffler.getBaseMetaTileEntity(); + if (iGTTileEntity != null && !iGTTileEntity.isDead()) { + iGTTileEntity.setActive(state); + } + } + } + + @Override + public void onRemoval() { + super.onRemoval(); + // Deactivate mufflers + setMufflers(false); + } + + public List getExoticEnergyHatches() { + return mExoticEnergyHatches; + } + + /** + * @return Returns true if there is 1 TT Energy Hatch OR up to 2 Energy Hatches + */ + public boolean checkExoticAndNormalEnergyHatches() { + if (mExoticEnergyHatches.isEmpty() && mEnergyHatches.isEmpty()) { + return false; + } + + if (!mExoticEnergyHatches.isEmpty()) { + if (!mEnergyHatches.isEmpty()) { + return false; + } + + if (mExoticEnergyHatches.size() != 1) { + return false; + } + } + + return mEnergyHatches.size() <= 2; + } + + /** + * Checks if all the item / fluid outputs of the recipe can be outputted to the buses / hatches. + * If void protection is enabled, it also checks for {@link #protectsExcessItem()} and + * {@link #protectsExcessFluid()}, so you don't need to call them along with this method. + *

+ * If you're using {@link ParallelHelper}, it will handle void protection and return 0 parallel + * if all the output cannot be dumped into buses / hatches. In that case you won't use this method. + */ + protected boolean canOutputAll(@Nonnull GTRecipe recipe) { + return canOutputAll(recipe.mOutputs, recipe.mFluidOutputs); + } + + /** + * Checks if all the items can be outputted to the output buses. + * If void protection is enabled, it also checks for {@link #protectsExcessItem()}, + * so you don't need to call it along with this method. + */ + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + protected boolean canOutputAll(ItemStack[] items) { + return canOutputAll(items, null); + } + + /** + * Checks if all the fluids can be outputted to the output hatches. + * If void protection is enabled, it also checks for {@link #protectsExcessFluid()}, + * so you don't need to call it along with this method. + */ + protected boolean canOutputAll(FluidStack[] fluids) { + return canOutputAll(null, fluids); + } + + /** + * Checks if all the items / fluids can be outputted to output buses / hatches. + * If void protection is enabled, it also checks for {@link #protectsExcessItem()} and + * {@link #protectsExcessFluid()}, so you don't need to call them along with this method. + */ + protected boolean canOutputAll(@Nullable ItemStack[] items, @Nullable FluidStack[] fluids) { + if (!protectsExcessItem() && !protectsExcessFluid()) { + return true; + } + + VoidProtectionHelper voidProtectionHelper = new VoidProtectionHelper().setMachine(this) + .setItemOutputs(items) + .setFluidOutputs(fluids) + .build(); + return voidProtectionHelper.getMaxParallel() > 0; + } + + @Override + public boolean isAllowedToWork() { + return getBaseMetaTileEntity() != null && getBaseMetaTileEntity().isAllowedToWork(); + } + + @Override + public void disableWorking() { + if (getBaseMetaTileEntity() != null) { + getBaseMetaTileEntity().disableWorking(); + } + } + + @Override + public void enableWorking() { + if (getBaseMetaTileEntity() != null) { + getBaseMetaTileEntity().enableWorking(); + } + } + + public ItemStack getControllerSlot() { + return mInventory[getControllerSlotIndex()]; + } + + public final int getControllerSlotIndex() { + return 1; + } + + // True if the slot with index aSlot may be interacted with through automation + protected boolean supportsSlotAutomation(int aSlot) { + return false; + } + + @Override + public Pos2d getPowerSwitchButtonPos() { + return new Pos2d(174, 148); + } + + @Override + public Pos2d getStructureUpdateButtonPos() { + return new Pos2d(174, 130); + } + + @Override + public int getStructureUpdateTime() { + return mUpdate; + } + + @Override + public void setStructureUpdateTime(int time) { + mUpdate = time; + } + + @Override + public boolean supportsVoidProtection() { + return false; + } + + @Override + public VoidingMode getVoidingMode() { + return voidingMode; + } + + @Override + public void setVoidingMode(VoidingMode mode) { + this.voidingMode = mode; + } + + @Override + public List getItemOutputSlots(ItemStack[] toOutput) { + List ret = new ArrayList<>(); + for (final MTEHatch tBus : filterValidMTEs(mOutputBusses)) { + if (!(tBus instanceof MTEHatchOutputBusME)) { + final IInventory tBusInv = tBus.getBaseMetaTileEntity(); + for (int i = 0; i < tBusInv.getSizeInventory(); i++) { + final ItemStack stackInSlot = tBus.getStackInSlot(i); + + if (stackInSlot == null && tBus instanceof IItemLockable lockable && lockable.isLocked()) { + // getItemOutputSlots is only used to calculate free room for the purposes of parallels and + // void protection. We can use a fake item stack here without creating weirdness in the output + // bus' actual inventory. + assert lockable.getLockedItem() != null; + ItemStack fakeItemStack = lockable.getLockedItem() + .copy(); + fakeItemStack.stackSize = 0; + ret.add(fakeItemStack); + } else { + ret.add(stackInSlot); + } + } + } + } + return ret; + } + + @Override + public List getFluidOutputSlots(FluidStack[] toOutput) { + return filterValidMTEs(mOutputHatches); + } + + /** + * Util method for DT-like structure to collect list of output hatches. + */ + protected List getFluidOutputSlotsByLayer(FluidStack[] toOutput, + List> hatchesByLayer) { + List ret = new ArrayList<>(); + for (int i = 0; i < toOutput.length; i++) { + if (i >= hatchesByLayer.size()) { + break; + } + FluidStack fluidOutputForLayer = toOutput[i]; + for (MTEHatchOutput hatch : hatchesByLayer.get(i)) { + if (!hatch.isValid()) continue; + if (fluidOutputForLayer != null) { + ret.add(new OutputHatchWrapper(hatch, f -> GTUtility.areFluidsEqual(f, fluidOutputForLayer))); + } else { + ret.add(hatch); + } + } + } + return ret; + } + + @Override + public boolean canDumpItemToME() { + for (MTEHatch tHatch : filterValidMTEs(mOutputBusses)) { + if (tHatch instanceof MTEHatchOutputBusME) { + if ((((MTEHatchOutputBusME) tHatch).canAcceptItem())) { + return true; + } + } + } + return false; + } + + @Override + public boolean canDumpFluidToME() { + for (IFluidStore tHatch : getFluidOutputSlots(new FluidStack[0])) { + if (tHatch instanceof MTEHatchOutputME) { + if ((((MTEHatchOutputME) tHatch).canAcceptFluid())) { + return true; + } + } + } + return false; + } + + @Override + public Pos2d getVoidingModeButtonPos() { + return new Pos2d(8, 91); + } + + @Override + public boolean supportsInputSeparation() { + return false; + } + + @Override + public boolean isInputSeparationEnabled() { + return inputSeparation; + } + + @Override + public void setInputSeparation(boolean enabled) { + this.inputSeparation = enabled; + } + + @Override + public Pos2d getInputSeparationButtonPos() { + return new Pos2d(26, 91); + } + + /** + * Creates the icon list for this machine. Override this and add the overlays to machineModeIcons in order. + */ + public void setMachineModeIcons() { + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_DEFAULT); + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_DEFAULT); + } + + /** + * Override this if you are a multi-machine and want a GUI button. You will also want to override + * setMachineModeIcons(). + * Override nextMachineMode() if you have more than 2 modes. + */ + @Override + public boolean supportsMachineModeSwitch() { + return false; + } + + @Override + public int getMachineMode() { + return machineMode; + } + + @Override + public UITexture getMachineModeIcon(int index) { + return machineModeIcons.get(index); + } + + @Override + public void setMachineMode(int index) { + machineMode = index; + } + + @Override + public int nextMachineMode() { + if (machineMode == 0) return 1; + else return 0; + } + + @Override + public Pos2d getMachineModeSwitchButtonPos() { + return new Pos2d(80, 91); + } + + @Override + public boolean supportsBatchMode() { + return false; + } + + @Override + public boolean isBatchModeEnabled() { + return batchMode; + } + + @Override + public void setBatchMode(boolean enabled) { + this.batchMode = enabled; + } + + @Override + public Pos2d getBatchModeButtonPos() { + return new Pos2d(44, 91); + } + + @Override + public boolean supportsSingleRecipeLocking() { + return false; + } + + @Override + public boolean isRecipeLockingEnabled() { + return mLockedToSingleRecipe; + } + + @Override + public void setRecipeLocking(boolean enabled) { + mLockedToSingleRecipe = enabled; + if (!enabled) { + setSingleRecipeCheck(null); + } + } + + @Override + public void setSingleRecipeCheck(SingleRecipeCheck recipeCheck) { + mSingleRecipeCheck = recipeCheck; + } + + @Override + public SingleRecipeCheck getSingleRecipeCheck() { + return mSingleRecipeCheck; + } + + @Override + public Pos2d getRecipeLockingButtonPos() { + return new Pos2d(62, 91); + } + + @Override + public int getGUIWidth() { + return 198; + } + + @Override + public int getGUIHeight() { + return 192; + } + + @Override + public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.bindPlayerInventory(buildContext.getPlayer(), new Pos2d(7, 109), getGUITextureSet().getItemSlot()); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setPos(4, 4) + .setSize(190, 85)); + final SlotWidget inventorySlot = new SlotWidget(inventoryHandler, 1); + builder.widget( + inventorySlot.setPos(173, 167) + .setBackground(GTUITextures.SLOT_DARK_GRAY)); + + final DynamicPositionedColumn screenElements = new DynamicPositionedColumn(); + drawTexts(screenElements, inventorySlot); + builder.widget(screenElements); + + setMachineModeIcons(); + builder.widget(createPowerSwitchButton(builder)) + .widget(createVoidExcessButton(builder)) + .widget(createInputSeparationButton(builder)) + .widget(createModeSwitchButton(builder)) + .widget(createBatchModeButton(builder)) + .widget(createLockToSingleRecipeButton(builder)) + .widget(createStructureUpdateButton(builder)); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) {} + + protected boolean shouldDisplayCheckRecipeResult() { + return true; + } + + public boolean shouldDisplayShutDownReason() { + return true; + } + + protected final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + protected String generateCurrentRecipeInfoString() { + StringBuffer ret = new StringBuffer(EnumChatFormatting.WHITE + "Progress: "); + + numberFormat.setMinimumFractionDigits(2); + numberFormat.setMaximumFractionDigits(2); + numberFormat.format((double) mProgresstime / 20, ret); + ret.append("s / "); + numberFormat.format((double) mMaxProgresstime / 20, ret); + ret.append("s ("); + numberFormat.setMinimumFractionDigits(1); + numberFormat.setMaximumFractionDigits(1); + numberFormat.format((double) mProgresstime / mMaxProgresstime * 100, ret); + ret.append("%)\n"); + numberFormat.setMinimumFractionDigits(0); + numberFormat.setMaximumFractionDigits(2); + + IntConsumer appendRate = (amount) -> { + double processPerTick = (double) amount / mMaxProgresstime * 20; + if (processPerTick > 1) { + ret.append(" ("); + numberFormat.format(Math.round(processPerTick * 10) / 10.0, ret); + ret.append("/s)"); + } else { + ret.append(" ("); + numberFormat.format(Math.round(1 / processPerTick * 10) / 10.0, ret); + ret.append("s/ea)"); + } + }; + + int lines = 0; + int MAX_LINES = 5; + + if (mOutputItems != null) { + for (var item : mOutputItems) { + if (item == null) continue; + if (lines >= MAX_LINES) { + ret.append("..."); + return ret.toString(); + } + lines++; + ret.append(EnumChatFormatting.AQUA) + .append(item.getDisplayName()) + .append(EnumChatFormatting.WHITE) + .append(" x ") + .append(EnumChatFormatting.GOLD); + numberFormat.format(item.stackSize, ret); + ret.append(EnumChatFormatting.WHITE); + appendRate.accept(item.stackSize); + ret.append('\n'); + } + } + if (mOutputFluids != null) { + for (var fluid : mOutputFluids) { + if (fluid == null) continue; + if (lines >= MAX_LINES) { + ret.append("..."); + return ret.toString(); + } + lines++; + ret.append(EnumChatFormatting.AQUA) + .append(fluid.getLocalizedName()) + .append(EnumChatFormatting.WHITE) + .append(" x ") + .append(EnumChatFormatting.GOLD); + numberFormat.format(fluid.amount, ret); + ret.append("L") + .append(EnumChatFormatting.WHITE); + appendRate.accept(fluid.amount); + ret.append('\n'); + } + } + return ret.toString(); + } + + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + screenElements.setSynced(false) + .setSpace(0) + .setPos(10, 7); + if (supportsMachineModeSwitch()) { + screenElements.widget( + TextWidget.dynamicString( + () -> EnumChatFormatting.WHITE + GTUtility.trans("400", "Running mode: ") + + EnumChatFormatting.GOLD + + getMachineModeName())); + } + screenElements + .widget( + new TextWidget(GTUtility.trans("132", "Pipe is loose.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mWrench)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val)); + screenElements + .widget( + new TextWidget(GTUtility.trans("133", "Screws are loose.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mScrewdriver)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val)); + screenElements + .widget( + new TextWidget(GTUtility.trans("134", "Something is stuck.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mSoftHammer)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val)); + screenElements + .widget( + new TextWidget(GTUtility.trans("135", "Platings are dented.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mHardHammer)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val)); + screenElements + .widget( + new TextWidget(GTUtility.trans("136", "Circuitry burned out.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mSolderingTool)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val)); + screenElements.widget( + new TextWidget(GTUtility.trans("137", "That doesn't belong there.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mCrowbar)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val)); + screenElements + .widget( + new TextWidget(GTUtility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mMachine)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)); + screenElements.widget( + new TextWidget("Too Uncertain.").setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 128) != 0)); + screenElements.widget( + new TextWidget("Invalid Parameters.").setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 256) != 0)); + + screenElements.widget( + new TextWidget(GTUtility.trans("139", "Hit with Soft Mallet")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())) + .widget( + new FakeSyncWidget.IntegerSyncer( + () -> getBaseMetaTileEntity().getErrorDisplayID(), + val -> getBaseMetaTileEntity().setErrorDisplayID(val))) + .widget( + new FakeSyncWidget.BooleanSyncer( + () -> getBaseMetaTileEntity().isActive(), + val -> getBaseMetaTileEntity().setActive(val))); + screenElements.widget( + new TextWidget(GTUtility.trans("140", "to (re-)start the Machine")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())); + screenElements.widget( + new TextWidget(GTUtility.trans("141", "if it doesn't start.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())); + screenElements.widget( + new TextWidget(GTUtility.trans("142", "Running perfectly.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && getBaseMetaTileEntity().isActive())); + + screenElements.widget(TextWidget.dynamicString(() -> { + Duration time = Duration.ofSeconds((mTotalRunTime - mLastWorkingTick) / 20); + return StatCollector.translateToLocalFormatted( + "GT5U.gui.text.shutdown_duration", + time.toHours(), + time.toMinutes() % 60, + time.getSeconds() % 60); + }) + .setEnabled( + widget -> shouldDisplayShutDownReason() && !getBaseMetaTileEntity().isActive() + && getBaseMetaTileEntity().wasShutdown())) + .widget(new FakeSyncWidget.LongSyncer(() -> mTotalRunTime, time -> mTotalRunTime = time)) + .widget(new FakeSyncWidget.LongSyncer(() -> mLastWorkingTick, time -> mLastWorkingTick = time)); + screenElements.widget( + TextWidget.dynamicString( + () -> getBaseMetaTileEntity().getLastShutDownReason() + .getDisplayString()) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> shouldDisplayShutDownReason() && !getBaseMetaTileEntity().isActive() + && GTUtility.isStringValid( + getBaseMetaTileEntity().getLastShutDownReason() + .getDisplayString()) + && getBaseMetaTileEntity().wasShutdown())) + .widget( + new ShutDownReasonSyncer( + () -> getBaseMetaTileEntity().getLastShutDownReason(), + reason -> getBaseMetaTileEntity().setShutDownReason(reason))) + .widget( + new FakeSyncWidget.BooleanSyncer( + () -> getBaseMetaTileEntity().wasShutdown(), + wasShutDown -> getBaseMetaTileEntity().setShutdownStatus(wasShutDown))); + + screenElements.widget( + TextWidget.dynamicString(() -> checkRecipeResult.getDisplayString()) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> shouldDisplayCheckRecipeResult() + && GTUtility.isStringValid(checkRecipeResult.getDisplayString()) + && (isAllowedToWork() || getBaseMetaTileEntity().isActive() + || checkRecipeResult.persistsOnShutdown()))) + .widget(new CheckRecipeResultSyncer(() -> checkRecipeResult, (result) -> checkRecipeResult = result)); + + if (showRecipeTextInGUI()) { + // Display current recipe + screenElements.widget( + TextWidget.dynamicString(this::generateCurrentRecipeInfoString) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> (mOutputFluids != null && mOutputFluids.length > 0) + || (mOutputItems != null && mOutputItems.length > 0))) + .widget( + new FakeSyncWidget.ListSyncer<>( + () -> mOutputFluids != null ? Arrays.asList(mOutputFluids) : Collections.emptyList(), + val -> mOutputFluids = val.toArray(new FluidStack[0]), + NetworkUtils::writeFluidStack, + NetworkUtils::readFluidStack)) + .widget( + new FakeSyncWidget.ListSyncer<>( + () -> mOutputItems != null ? Arrays.asList(mOutputItems) : Collections.emptyList(), + val -> mOutputItems = val.toArray(new ItemStack[0]), + NetworkUtils::writeItemStack, + NetworkUtils::readItemStack)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> mProgresstime, val -> mProgresstime = val)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> mMaxProgresstime, val -> mMaxProgresstime = val)); + } + + screenElements.widget( + new TextWidget(GTUtility.trans("144", "Missing Turbine Rotor")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> { + if (getBaseMetaTileEntity().isAllowedToWork()) return false; + if (getBaseMetaTileEntity().getErrorDisplayID() == 0 && this instanceof MTELargeTurbine) { + final ItemStack tItem = inventorySlot.getMcSlot() + .getStack(); + return tItem == null + || !(tItem.getItem() == MetaGeneratedTool01.INSTANCE && tItem.getItemDamage() >= 170 + && tItem.getItemDamage() <= 177); + } + return false; + })); + } + + protected boolean showRecipeTextInGUI() { + return true; + } + + @TestOnly + protected void setEnergyHatches(ArrayList EnergyHatches) { + this.mEnergyHatches = EnergyHatches; + } + + @TestOnly + protected void setExoticEnergyHatches(List ExoticEnergyHatches) { + this.mExoticEnergyHatches = ExoticEnergyHatches; + } + + public void fixAllIssues() { + mWrench = true; + mScrewdriver = true; + mSoftHammer = true; + mHardHammer = true; + mSolderingTool = true; + mCrowbar = true; + } + + public boolean getDefaultHasMaintenanceChecks() { + return true; + } + + public boolean shouldCheckMaintenance() { + return !disableMaintenance && hasMaintenanceChecks; + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTESpecialFilter.java b/src/main/java/gregtech/api/metatileentity/implementations/MTESpecialFilter.java new file mode 100644 index 0000000000..c93b542805 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTESpecialFilter.java @@ -0,0 +1,132 @@ +package gregtech.api.metatileentity.implementations; + +import java.util.List; +import java.util.function.Function; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public abstract class MTESpecialFilter extends MTEFilterBase { + + private static final String ALLOW_NBT_TOOLTIP = "GT5U.machines.allow_nbt.tooltip"; + private boolean allowNbt = false; + + public MTESpecialFilter(int aID, String aName, String aNameRegional, int aTier, String[] aDescription) { + // 9 buffer slot, 1 representation slot, 1 holo slot. last seems not needed... + super(aID, aName, aNameRegional, aTier, 11, aDescription); + } + + public MTESpecialFilter(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTESpecialFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("bNBTAllowed", this.allowNbt); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.allowNbt = aNBT.getBoolean("bNBTAllowed"); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return (super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) + && ((this.allowNbt) || (!aStack.hasTagCompound())) + && (this.isStackAllowed(aStack) != this.invertFilter); + } + + protected abstract boolean isStackAllowed(ItemStack aStack); + + protected List getEmptySlotTooltip() { + return null; + } + + protected Function, List> getItemStackReplacementTooltip() { + return list -> list; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + addAllowNbtButton(builder); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_24_WHITE.apply(27, false)) + .setPos(6, 19) + .setSize(27, 24)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_24_BLUE.apply(42, true)) + .setPos(53, 19) + .setSize(42, 24)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_24_RED.apply(19, true)) + .setPos(152, 19) + .setSize(19, 24)) + .widget( + createFilterIconSlot(BaseSlot.phantom(inventoryHandler, 9)).disableShiftInsert() + .setPos(34, 22) + .setBackground(GTUITextures.BUTTON_STANDARD)) + .widget( + SlotGroup.ofItemHandler(inventoryHandler, 3) + .endAtSlot(8) + .build() + .setPos(97, 4)); + } + + private void addAllowNbtButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> allowNbt, + val -> allowNbt = val, + GTUITextures.OVERLAY_BUTTON_NBT, + () -> mTooltipCache.getData(ALLOW_NBT_TOOLTIP))); + } + + protected abstract SlotWidget createFilterIconSlot(BaseSlot slot); + + protected abstract class FilterIconSlotWidget extends SlotWidget { + + public FilterIconSlotWidget(BaseSlot slot) { + super(slot); + } + + @Override + protected abstract void phantomClick(ClickData clickData, ItemStack cursorStack); + + @Override + public void buildTooltip(List tooltip) { + super.buildTooltip(tooltip); + List emptySlotTooltip = getEmptySlotTooltip(); + if (emptySlotTooltip != null) { + tooltip.addAll(emptySlotTooltip); + } + } + + @Override + public Function, List> getOverwriteItemStackTooltip() { + return getItemStackReplacementTooltip(); + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTETieredMachineBlock.java b/src/main/java/gregtech/api/metatileentity/implementations/MTETieredMachineBlock.java new file mode 100644 index 0000000000..8bffeaf17e --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTETieredMachineBlock.java @@ -0,0 +1,119 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.GT; +import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP_ALT; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; + +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.api.enums.GTValues; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.util.GTUtility; + +public abstract class MTETieredMachineBlock extends MetaTileEntity { + + /** + * Value between [0 - 9] to describe the Tier of this Machine. PLZ [0-15] works - READ! GT_Values class. + */ + public final byte mTier; + + /** + * A simple Description. + */ + public final String[] mDescriptionArray; + + /** + * Contains all Textures used by this Block. + */ + public final ITexture[][][] mTextures; + + public MTETieredMachineBlock(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String aDescription, ITexture... aTextures) { + super(aID, aName, aNameRegional, aInvSlotCount); + mTier = (byte) Math.max(0, Math.min(aTier, 14)); + mDescriptionArray = aDescription == null ? new String[0] : new String[] { aDescription }; + // must always be the last call! + if (GT.isClientSide()) mTextures = getTextureSet(aTextures); + else mTextures = null; + } + + public MTETieredMachineBlock(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String[] aDescription, ITexture... aTextures) { + super(aID, aName, aNameRegional, aInvSlotCount); + mTier = (byte) Math.max(0, Math.min(aTier, 15)); + mDescriptionArray = aDescription == null ? new String[0] : aDescription; + + // must always be the last call! + if (GT.isClientSide()) mTextures = getTextureSet(aTextures); + else mTextures = null; + } + + public MTETieredMachineBlock(String aName, int aTier, int aInvSlotCount, String aDescription, + ITexture[][][] aTextures) { + super(aName, aInvSlotCount); + mTier = (byte) aTier; + mDescriptionArray = aDescription == null ? new String[0] : new String[] { aDescription }; + mTextures = aTextures; + } + + public MTETieredMachineBlock(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aInvSlotCount); + mTier = (byte) aTier; + mDescriptionArray = aDescription == null ? new String[0] : aDescription; + mTextures = aTextures; + } + + @Override + public byte getTileEntityBaseType() { + return (byte) (Math.min(3, mTier <= 0 ? 0 : 1 + ((mTier - 1) / 4))); + } + + @Override + public long getInputTier() { + return mTier; + } + + @Override + public long getOutputTier() { + return mTier; + } + + @Override + public String[] getDescription() { + return mDescriptionArray; + } + + /** + * Used Client Side to get a Texture Set for this Block. Called after setting the Tier and the Description so that + * those two are accessible. + * + * @param aTextures is the optional Array you can give to the Constructor. + */ + public abstract ITexture[][][] getTextureSet(ITexture[] aTextures); + + protected SlotWidget createChargerSlot(int x, int y) { + final String batterySlotTooltipKey; + final Object[] batterySlotTooltipArgs; + final String pTier1 = GTUtility.getColoredTierNameFromTier(mTier); + if (mTier == GTValues.VN.length - 1) { + batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP_ALT; + batterySlotTooltipArgs = new String[] { pTier1 }; + } else { + batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP; + batterySlotTooltipArgs = new String[] { pTier1, GTUtility.getColoredTierNameFromTier((byte) (mTier + 1)) }; + } + return createChargerSlot(x, y, batterySlotTooltipKey, batterySlotTooltipArgs); + } + + protected SlotWidget createChargerSlot(int x, int y, String tooltipKey, Object[] tooltipArgs) { + return (SlotWidget) new SlotWidget(inventoryHandler, rechargerSlotStartIndex()).disableShiftInsert() + .setGTTooltip(() -> mTooltipCache.getData(tooltipKey, tooltipArgs)) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_CHARGER) + .setPos(x, y); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTETooltipMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTETooltipMultiBlockBase.java new file mode 100644 index 0000000000..71fce08c7e --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTETooltipMultiBlockBase.java @@ -0,0 +1,56 @@ +package gregtech.api.metatileentity.implementations; + +import java.util.concurrent.atomic.AtomicReferenceArray; + +import org.lwjgl.input.Keyboard; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ISecondaryDescribable; +import gregtech.api.util.MultiblockTooltipBuilder; + +/** + * A multiblock with tooltip {@link MultiblockTooltipBuilder} + */ +public abstract class MTETooltipMultiBlockBase extends MTEMultiBlockBase implements ISecondaryDescribable { + + private static final AtomicReferenceArray tooltips = new AtomicReferenceArray<>( + GregTechAPI.METATILEENTITIES.length); + + public MTETooltipMultiBlockBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTETooltipMultiBlockBase(String aName) { + super(aName); + } + + protected MultiblockTooltipBuilder getTooltip() { + int tId = getBaseMetaTileEntity().getMetaTileID(); + MultiblockTooltipBuilder tooltip = tooltips.get(tId); + if (tooltip == null) { + tooltip = createTooltip(); + tooltips.set(tId, tooltip); + } + return tooltip; + } + + protected abstract MultiblockTooltipBuilder createTooltip(); + + @Override + public String[] getDescription() { + return getCurrentDescription(); + } + + @Override + public boolean isDisplaySecondaryDescription() { + return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); + } + + public String[] getPrimaryDescription() { + return getTooltip().getInformation(); + } + + public String[] getSecondaryDescription() { + return getTooltip().getStructureInformation(); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTETransformer.java b/src/main/java/gregtech/api/metatileentity/implementations/MTETransformer.java new file mode 100644 index 0000000000..d2b88d26bc --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTETransformer.java @@ -0,0 +1,325 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Mods.EnderIO; +import static mcp.mobius.waila.api.SpecialChars.BLUE; +import static mcp.mobius.waila.api.SpecialChars.GOLD; +import static mcp.mobius.waila.api.SpecialChars.GREEN; +import static mcp.mobius.waila.api.SpecialChars.RED; +import static mcp.mobius.waila.api.SpecialChars.RESET; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import cofh.api.energy.IEnergyProvider; +import cofh.api.energy.IEnergyStorage; +import crazypants.enderio.machine.capbank.TileCapBank; +import crazypants.enderio.machine.capbank.network.ICapBankNetwork; +import crazypants.enderio.power.IPowerContainer; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +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.GTUtility; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple + * Machine + */ +public class MTETransformer extends MTETieredMachineBlock { + + public MTETransformer(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, 0, aDescription); + } + + public MTETransformer(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + public MTETransformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[12][17][]; + for (byte i = -1; i < 16; i++) { + rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; + rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; + rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] }; + rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + rTextures[6][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] }; + rTextures[7][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] }; + rTextures[8][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] }; + rTextures[9][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + rTextures[10][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + rTextures[11][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + return mTextures[Math.min(2, side.ordinal()) + (side == facingDirection ? 3 : 0) + + (baseMetaTileEntity.isAllowedToWork() ? 0 : 6)][colorIndex + 1]; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTETransformer(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + ForgeDirection blockFrontFacing = getBaseMetaTileEntity().getFrontFacing(); + + if (getBaseMetaTileEntity().isAllowedToWork()) { + return side == blockFrontFacing; + } else { + return side != blockFrontFacing; + } + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return !isInputFacing(side); + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier + 1]; + } + + @Override + public long maxEUStore() { + return Math.max(512L, 1L << (mTier + 2)) + V[mTier + 1] * 4L; + } + + @Override + public long maxEUInput() { + return V[getBaseMetaTileEntity().isAllowedToWork() ? mTier + 1 : mTier]; + } + + @Override + public long maxEUOutput() { + return V[getBaseMetaTileEntity().isAllowedToWork() ? mTier : mTier + 1]; + } + + @Override + public long maxAmperesOut() { + return getBaseMetaTileEntity().isAllowedToWork() ? 4 : 1; + } + + @Override + public long maxAmperesIn() { + return getBaseMetaTileEntity().isAllowedToWork() ? 1 : 4; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && GregTechAPI.mInputRF) { + aBaseMetaTileEntity.setActive(aBaseMetaTileEntity.isAllowedToWork()); + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (aBaseMetaTileEntity.getStoredEU() >= aBaseMetaTileEntity.getEUCapacity()) break; + if (!aBaseMetaTileEntity.inputEnergyFrom(side)) continue; + final TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side); + if (tTileEntity instanceof IEnergyProvider energyProvider + && energyProvider.extractEnergy(side.getOpposite(), 1, true) == 1) { + long tEU = ((IEnergyProvider) tTileEntity).extractEnergy( + side.getOpposite(), + GTUtility.safeInt(maxEUInput() * 100L / GregTechAPI.mRFtoEU), + false); + tEU = tEU * GregTechAPI.mRFtoEU / 100; + aBaseMetaTileEntity.injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1); + } else if (tTileEntity instanceof IEnergyStorage energyStorage + && energyStorage.extractEnergy(1, true) == 1) { + long tEU = ((IEnergyStorage) tTileEntity) + .extractEnergy(GTUtility.safeInt(maxEUInput() * 100L / GregTechAPI.mRFtoEU), false); + tEU = tEU * GregTechAPI.mRFtoEU / 100; + aBaseMetaTileEntity.injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1); + } else if (EnderIO.isModLoaded() && tTileEntity instanceof IPowerContainer powerContainer + && powerContainer.getEnergyStored() > 0) { + final int storedRF = powerContainer.getEnergyStored(); + final int extractRF = GTUtility.safeInt(maxEUInput() * 100L / GregTechAPI.mRFtoEU); + long tEU = 0; + if (tTileEntity instanceof TileCapBank capBank) { + ICapBankNetwork network = capBank.getNetwork(); + if (network != null && network.getEnergyStoredL() > 0) { + tEU = Math.min( + (Math.min( + Math.min(network.getEnergyStoredL(), storedRF - extractRF), + network.getMaxOutput())) * (long) GregTechAPI.mRFtoEU / 100L, + maxEUInput()); + network.addEnergy(GTUtility.safeInt(-(tEU * 100 / GregTechAPI.mRFtoEU))); + } + } else { + if (storedRF > extractRF) { + powerContainer.setEnergyStored(storedRF - extractRF); + tEU = maxEUInput(); + } else { + powerContainer.setEnergyStored(0); + tEU = storedRF * (long) GregTechAPI.mRFtoEU / 100L; + } + } + aBaseMetaTileEntity + .injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1); + } + } + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + // + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + // + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean hasAlternativeModeText() { + return true; + } + + @Override + public String getAlternativeModeText() { + return (getBaseMetaTileEntity().isAllowedToWork() ? GTUtility.trans("145", "Step Down, In: ") + : GTUtility.trans("146", "Step Up, In: ")) + maxEUInput() + + GTUtility.trans("148", "V ") + + maxAmperesIn() + + GTUtility.trans("147", "A, Out: ") + + maxEUOutput() + + GTUtility.trans("148", "V ") + + maxAmperesOut() + + GTUtility.trans("149", "A"); + } + + @Override + public boolean shouldJoinIc2Enet() { + return true; + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + final ForgeDirection facing = getBaseMetaTileEntity().getFrontFacing(); + final NBTTagCompound tag = accessor.getNBTData(); + final ForgeDirection side = accessor.getSide(); + final boolean allowedToWork = tag.getBoolean("isAllowedToWork"); + + final byte inputTier = GTUtility.getTier(tag.getLong("maxEUInput")); + final byte outputTier = GTUtility.getTier(tag.getLong("maxEUOutput")); + + currenttip.add( + String.format( + "%s %s(%dA) -> %s(%dA)", + (allowedToWork ? (GREEN + "Step Down") : (RED + "Step Up")) + RESET, + GTMod.gregtechproxy.mWailaTransformerVoltageTier ? GTUtility.getColoredTierNameFromTier(inputTier) + : tag.getLong("maxEUInput"), + tag.getLong("maxAmperesIn"), + GTMod.gregtechproxy.mWailaTransformerVoltageTier ? GTUtility.getColoredTierNameFromTier(outputTier) + : tag.getLong("maxEUOutput"), + tag.getLong("maxAmperesOut"))); + + if ((side == facing && allowedToWork) || (side != facing && !allowedToWork)) { + currenttip.add( + String.format( + GOLD + "Input:" + RESET + " %s(%dA)", + GTMod.gregtechproxy.mWailaTransformerVoltageTier ? GTUtility.getColoredTierNameFromTier(inputTier) + : tag.getLong("maxEUInput"), + tag.getLong("maxAmperesIn"))); + } else { + currenttip.add( + String.format( + BLUE + "Output:" + RESET + " %s(%dA)", + GTMod.gregtechproxy.mWailaTransformerVoltageTier ? GTUtility.getColoredTierNameFromTier(outputTier) + : tag.getLong("maxEUOutput"), + tag.getLong("maxAmperesOut"))); + } + + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + tag.setBoolean("isAllowedToWork", getBaseMetaTileEntity().isAllowedToWork()); + tag.setLong("maxEUInput", maxEUInput()); + tag.setLong("maxAmperesIn", maxAmperesIn()); + tag.setLong("maxEUOutput", maxEUOutput()); + tag.setLong("maxAmperesOut", maxAmperesOut()); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEWetTransformer.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEWetTransformer.java new file mode 100644 index 0000000000..e2c2437311 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEWetTransformer.java @@ -0,0 +1,92 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.V; + +import net.minecraft.util.EnumChatFormatting; + +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; + +public class MTEWetTransformer extends MTETransformer { + + public MTEWetTransformer(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, aDescription); + } + + public MTEWetTransformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEWetTransformer(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[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + rTextures[1][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + rTextures[2][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] }; + rTextures[3][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_POWER[mTier + 1] }; + rTextures[4][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_POWER[mTier + 1] }; + rTextures[5][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_POWER[mTier + 1] }; + rTextures[6][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + rTextures[7][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + rTextures[8][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] }; + rTextures[9][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier + 1] }; + rTextures[10][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier + 1] }; + rTextures[11][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier + 1] }; + } + return rTextures; + } + + @Override + public String[] getDescription() { + return ArrayUtils.addAll( + mDescriptionArray, + "Accepts 16A and outputs 64A", + EnumChatFormatting.BLUE + "Tec" + + EnumChatFormatting.DARK_BLUE + + "Tech" + + EnumChatFormatting.BLUE + + ": Interdimensional"); + } + + @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/gregtech/api/metatileentity/implementations/MTEWirelessDynamo.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEWirelessDynamo.java new file mode 100644 index 0000000000..fc7bc3fae2 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEWirelessDynamo.java @@ -0,0 +1,144 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.AuthorColen; +import static gregtech.api.enums.GTValues.V; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser; + +import java.util.UUID; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IWirelessEnergyHatchInformation; +import gregtech.api.metatileentity.MetaTileEntity; + +public class MTEWirelessDynamo extends MTEHatchDynamo implements IWirelessEnergyHatchInformation { + + private UUID owner_uuid; + + public MTEWirelessDynamo(String aName, byte aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEWirelessDynamo(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, new String[] { "" }); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isEnetOutput() { + return false; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 2 * V[mTier]; + } + + @Override + public long maxEUOutput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return totalStorage(V[mTier]); + } + + @Override + public String[] getDescription() { + return new String[] { EnumChatFormatting.GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.", + EnumChatFormatting.GRAY + "Does not connect to wires. This block accepts EU into the network.", + AuthorColen }; + } + + @Override + public long maxAmperesOut() { + return 2; + } + + @Override + public ConnectionType getConnectionType() { + return ConnectionType.WIRELESS; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEWirelessDynamo(mName, mTier, new String[] { "" }, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide()) { + + // On first tick find the player name and attempt to add them to the map. + if (aTick == 1) { + + // UUID and username of the owner. + owner_uuid = aBaseMetaTileEntity.getOwnerUuid(); + + strongCheckOrAddUser(owner_uuid); + } + + // Every ticks_between_energy_addition ticks change the energy content of the machine. + if (aTick % ticks_between_energy_addition == 0L) { + addEUToGlobalEnergyMap(owner_uuid, getEUVar()); + setEUVar(0L); + } + } + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEWirelessEnergy.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEWirelessEnergy.java new file mode 100644 index 0000000000..e195b4ab08 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEWirelessEnergy.java @@ -0,0 +1,167 @@ +package gregtech.api.metatileentity.implementations; + +import static gregtech.api.enums.GTValues.AuthorColen; +import static gregtech.api.enums.GTValues.V; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static java.lang.Long.min; + +import java.math.BigInteger; +import java.util.UUID; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IWirelessEnergyHatchInformation; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.common.misc.spaceprojects.SpaceProjectManager; + +public class MTEWirelessEnergy extends MTEHatchEnergy implements IWirelessEnergyHatchInformation { + + private final BigInteger eu_transferred_per_operation = BigInteger + .valueOf(2 * V[mTier] * ticks_between_energy_addition); + private final long eu_transferred_per_operation_long = eu_transferred_per_operation.longValue(); + + private UUID owner_uuid; + + public MTEWirelessEnergy(String aName, byte aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + public MTEWirelessEnergy(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, new String[] { "" }); + } + + @Override + public String[] getDescription() { + return new String[] { EnumChatFormatting.GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.", + EnumChatFormatting.GRAY + "Does not connect to wires. This block withdraws EU from the network.", + AuthorColen }; + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 2 * V[mTier]; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return totalStorage(V[mTier]); + } + + @Override + public long maxAmperesIn() { + return 2; + } + + @Override + public ConnectionType getConnectionType() { + return ConnectionType.WIRELESS; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEWirelessEnergy(mName, mTier, new String[] { "" }, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + + if (!aBaseMetaTileEntity.isServerSide()) return; + + // UUID of the owner. + owner_uuid = aBaseMetaTileEntity.getOwnerUuid(); + + SpaceProjectManager.checkOrCreateTeam(owner_uuid);; + + tryFetchingEnergy(); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + + super.onPreTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide()) { + // This is set up in a way to be as optimised as possible. If a user has a relatively plentiful energy + // network + // it should make no difference to them. Minimising the number of operations on BigInteger is essential. + + // Every ticks_between_energy_addition add eu_transferred_per_operation to internal EU storage from network. + if (aTick % ticks_between_energy_addition == 0L) { + tryFetchingEnergy(); + } + } + } + + private void tryFetchingEnergy() { + long currentEU = getBaseMetaTileEntity().getStoredEU(); + long maxEU = maxEUStore(); + long euToTransfer = min(maxEU - currentEU, eu_transferred_per_operation_long); + if (euToTransfer <= 0) return; // nothing to transfer + if (!addEUToGlobalEnergyMap(owner_uuid, -euToTransfer)) return; + setEUVar(currentEU + euToTransfer); + } +} diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java index f5cf261be1..f1f4b8591a 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java @@ -1,11 +1,11 @@ package gregtech.api.multitileentity; -import static gregtech.api.enums.GT_Values.OFFX; -import static gregtech.api.enums.GT_Values.OFFY; -import static gregtech.api.enums.GT_Values.OFFZ; -import static gregtech.api.util.GT_Util.LAST_BROKEN_TILEENTITY; -import static gregtech.api.util.GT_Util.getTileEntity; -import static gregtech.api.util.GT_Util.setTileEntity; +import static gregtech.api.enums.GTValues.OFFX; +import static gregtech.api.enums.GTValues.OFFY; +import static gregtech.api.enums.GTValues.OFFZ; +import static gregtech.api.util.GTUtil.LAST_BROKEN_TILEENTITY; +import static gregtech.api.util.GTUtil.getTileEntity; +import static gregtech.api.util.GTUtil.setTileEntity; import java.util.ArrayList; import java.util.List; @@ -44,7 +44,7 @@ import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.enums.ItemList; import gregtech.api.enums.Textures; import gregtech.api.interfaces.IDebugableBlock; @@ -53,10 +53,10 @@ import gregtech.api.metatileentity.BaseTileEntity; import gregtech.api.metatileentity.CoverableTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; import gregtech.api.objects.XSTR; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Util; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtil; import gregtech.common.covers.CoverInfo; -import gregtech.common.render.GT_MultiTile_Renderer; +import gregtech.common.render.MultiTileRenderer; /* * MultiTileEntityBlock ported from GT6 @@ -85,7 +85,7 @@ public class MultiTileEntityBlock extends BlockContainer implements IDebugableBl public MultiTileEntityBlock(Material material) { super(material); - if (GregTech_API.sPreloadFinished) + if (GregTechAPI.sPreloadFinished) throw new IllegalStateException("Blocks can only be initialized within preInit!"); } @@ -121,7 +121,7 @@ public class MultiTileEntityBlock extends BlockContainer implements IDebugableBl public MultiTileEntityBlock register() { if (registered) throw new IllegalStateException("Block already registered " + internalName); - if (GregTech_API.sPreloadFinished) + if (GregTechAPI.sPreloadFinished) throw new IllegalStateException("Blocks can only be initialized within preInit!"); registered = true; @@ -141,7 +141,7 @@ public class MultiTileEntityBlock extends BlockContainer implements IDebugableBl // spotless:off // if (aTileEntity instanceof IMTE_HasMultiBlockMachineRelevantData // && ((IMTE_HasMultiBlockMachineRelevantData) aTileEntity).hasMultiBlockMachineRelevantData()) - // GregTech_API.causeMachineUpdate(world, x, y, z); + // GregTechAPI.causeMachineUpdate(world, x, y, z); // spotless:on world.removeTileEntity(x, y, z); @@ -160,8 +160,7 @@ public class MultiTileEntityBlock extends BlockContainer implements IDebugableBl @Override public int getRenderType() { - return GT_MultiTile_Renderer.INSTANCE == null ? super.getRenderType() - : GT_MultiTile_Renderer.INSTANCE.getRenderId(); + return MultiTileRenderer.INSTANCE == null ? super.getRenderType() : MultiTileRenderer.INSTANCE.getRenderId(); } @Override @@ -455,7 +454,7 @@ public class MultiTileEntityBlock extends BlockContainer implements IDebugableBl @Override public boolean removedByPlayer(World world, EntityPlayer aPlayer, int x, int y, int z, boolean aWillHarvest) { - final TileEntity tileEntity = GT_Util.getTileEntity(world, x, y, z, true); + final TileEntity tileEntity = GTUtil.getTileEntity(world, x, y, z, true); if (tileEntity != null) LAST_BROKEN_TILEENTITY.set(tileEntity); return super.removedByPlayer(world, aPlayer, x, y, z, aWillHarvest); } @@ -467,7 +466,7 @@ public class MultiTileEntityBlock extends BlockContainer implements IDebugableBl @Override public int getFireSpreadSpeed(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return GregTech_API.sMachineFlammable && (world.getBlockMetadata(x, y, z) == 0) ? 100 : 0; + return GregTechAPI.sMachineFlammable && (world.getBlockMetadata(x, y, z) == 0) ? 100 : 0; } @Override @@ -502,7 +501,7 @@ public class MultiTileEntityBlock extends BlockContainer implements IDebugableBl final TileEntity tileEntity = getTileEntity(world, x, y, z, true); if (tileEntity != null) LAST_BROKEN_TILEENTITY.set(tileEntity); if (tileEntity instanceof IMultiTileEntity mute) { - GT_Log.exp.printf( + GTLog.exp.printf( "Explosion at : %d | %d | %d DIMID: %s due to near explosion!%n", x, y, diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java index 325f583149..ca265e529e 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java @@ -1,6 +1,6 @@ package gregtech.api.multitileentity; -import static gregtech.api.enums.GT_Values.NBT; +import static gregtech.api.enums.GTValues.NBT; import java.lang.ref.WeakReference; @@ -11,7 +11,7 @@ import gregtech.api.enums.Materials; import gregtech.api.multitileentity.base.MultiTileEntity; import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing; import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; -import gregtech.api.util.GT_Util; +import gregtech.api.util.GTUtil; import gregtech.common.tileentities.casings.upgrade.Inventory; import gregtech.common.tileentities.casings.upgrade.Tank; @@ -43,7 +43,7 @@ public class MultiTileEntityClassContainer { if (parameters.hasKey(NBT.MATERIAL) && !parameters.hasKey(NBT.COLOR)) parameters.setInteger( NBT.COLOR, - GT_Util.getRGBInt( + GTUtil.getRGBInt( Materials.get(parameters.getString(NBT.MATERIAL)) .getRGBA())); @@ -80,7 +80,7 @@ public class MultiTileEntityClassContainer { public MultiTileEntityClassContainer material(Materials material) { // Sets the material, and the color from the material, if not already set parameters.setString(NBT.MATERIAL, material.toString()); - if (!parameters.hasKey(NBT.COLOR)) parameters.setInteger(NBT.COLOR, GT_Util.getRGBInt(material.getRGBA())); + if (!parameters.hasKey(NBT.COLOR)) parameters.setInteger(NBT.COLOR, GTUtil.getRGBInt(material.getRGBA())); return this; } @@ -90,7 +90,7 @@ public class MultiTileEntityClassContainer { } public MultiTileEntityClassContainer color(short[] rgba) { - parameters.setInteger(NBT.COLOR, GT_Util.getRGBInt(rgba)); + parameters.setInteger(NBT.COLOR, GTUtil.getRGBInt(rgba)); return this; } @@ -154,7 +154,7 @@ public class MultiTileEntityClassContainer { * Merge in arbitrary NBT tuples of (key, value). Useful for anything for which a custom method has not yet been * exposed */ - parameters = GT_Util.fuseNBT(parameters, GT_Util.makeNBT(aTags)); + parameters = GTUtil.fuseNBT(parameters, GTUtil.makeNBT(aTags)); return this; } diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java index e67ab61e96..bf7259626f 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java @@ -1,7 +1,7 @@ package gregtech.api.multitileentity; -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_Values.SIDE_TOP; +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.GTValues.SIDE_TOP; import java.util.List; @@ -132,7 +132,7 @@ public class MultiTileEntityItem extends ItemBlock { * Add back if needed */ // try { - // GregTech_API.causeMachineUpdate(world, x, y, z); + // GregTechAPI.causeMachineUpdate(world, x, y, z); // } catch (Throwable e) { // GT_FML_LOGGER.error("causeMachineUpdate", e); // } diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java index 0b5afbb043..186110abb7 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java @@ -1,6 +1,6 @@ package gregtech.api.multitileentity; -import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.GTMod.GT_FML_LOGGER; import java.util.ArrayList; import java.util.HashMap; @@ -21,12 +21,12 @@ import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap; import appeng.core.CreativeTab; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.LoaderState; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.multitileentity.base.MultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; import it.unimi.dsi.fastutil.shorts.Short2ObjectMap; import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; @@ -61,7 +61,7 @@ public class MultiTileEntityRegistry { this.block = block; GT_FML_LOGGER.info(internalName + " " + Block.getIdFromBlock(block) + " This is the answer"); this.block.setRegistry(this); - REGISTRIES.put(new ItemStack(Item.getItemById(Block.getIdFromBlock(block)), 1, GT_Values.W), this); + REGISTRIES.put(new ItemStack(Item.getItemById(Block.getIdFromBlock(block)), 1, GTValues.W), this); NAMED_REGISTRIES.put(internalName, this); } @@ -84,7 +84,7 @@ public class MultiTileEntityRegistry { } public static MultiTileEntityRegistry getRegistry(int aRegistryID) { - return REGISTRIES.get(new ItemStack(Item.getItemById(aRegistryID), 1, GT_Values.W)); + return REGISTRIES.get(new ItemStack(Item.getItemById(aRegistryID), 1, GTValues.W)); } public static MultiTileEntityRegistry getRegistry(String aRegistryName) { @@ -101,7 +101,7 @@ public class MultiTileEntityRegistry { */ public ItemStack add(String aLocalised, MultiTileEntityClassContainer aClassContainer) { boolean tFailed = false; - if (GT_Utility.isStringInvalid(aLocalised)) { + if (GTUtility.isStringInvalid(aLocalised)) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Localisation Missing!"); tFailed = true; } @@ -113,7 +113,7 @@ public class MultiTileEntityRegistry { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class inside Class Container is null!"); tFailed = true; } - if (aClassContainer.getMuteID() == GT_Values.W) { + if (aClassContainer.getMuteID() == GTValues.W) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses Wildcard MetaData!"); tFailed = true; } @@ -138,8 +138,7 @@ public class MultiTileEntityRegistry { return null; } - GT_LanguageManager - .addStringLocalization(internalName + "." + aClassContainer.getMuteID() + ".name", aLocalised); + GTLanguageManager.addStringLocalization(internalName + "." + aClassContainer.getMuteID() + ".name", aLocalised); registry.put(aClassContainer.getMuteID(), aClassContainer); mLastRegisteredID = aClassContainer.getMuteID(); registrations.add(aClassContainer); @@ -154,7 +153,7 @@ public class MultiTileEntityRegistry { return getItem(aClassContainer.getMuteID()); } - public short mLastRegisteredID = GT_Values.W; + public short mLastRegisteredID = GTValues.W; public ItemStack getItem() { return getItem(mLastRegisteredID, 1, null); @@ -206,14 +205,14 @@ public class MultiTileEntityRegistry { public TileEntity getNewTileEntity(World aWorld, int x, int y, int z, int metaID, NBTTagCompound nbt) { final MultiTileEntityClassContainer container = registry.get((short) metaID); if (container == null) return null; - final MultiTileEntity te = (MultiTileEntity) GT_Utility + final MultiTileEntity te = (MultiTileEntity) GTUtility .callConstructor(container.getMuteClass(), -1, null, true); te.setWorldObj(aWorld); te.xCoord = x; te.yCoord = y; te.zCoord = z; nbt = (nbt == null || nbt.hasNoTags()) ? container.getParameters() - : GT_Util.fuseNBT(nbt, container.getParameters()); + : GTUtil.fuseNBT(nbt, container.getParameters()); te.initFromNBT(nbt, (short) metaID, (short) Block.getIdFromBlock(block)); return te; } diff --git a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java index eeadfe7602..24163f9c20 100644 --- a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java +++ b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java @@ -1,7 +1,7 @@ package gregtech.api.multitileentity.base; -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_Values.VALID_SIDES; +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.GTValues.VALID_SIDES; import java.io.IOException; import java.util.ArrayList; @@ -35,15 +35,15 @@ import net.minecraftforge.fluids.Fluid; import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.GTValues.NBT; import gregtech.api.enums.Materials; import gregtech.api.enums.Mods; import gregtech.api.enums.SoundResource; import gregtech.api.enums.Textures; import gregtech.api.enums.Textures.BlockIcons.CustomIcon; -import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GTUIInfos; import gregtech.api.interfaces.ITexture; import gregtech.api.metatileentity.CoverableTileEntity; import gregtech.api.metatileentity.GregTechTileClientEvents; @@ -52,18 +52,18 @@ import gregtech.api.multitileentity.MultiTileEntityClassContainer; import gregtech.api.multitileentity.MultiTileEntityRegistry; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; import gregtech.api.multitileentity.interfaces.SyncedMultiTileEntity; -import gregtech.api.net.GT_Packet_MultiTileEntity; -import gregtech.api.net.GT_Packet_New; +import gregtech.api.net.GTPacketMultiTileEntity; +import gregtech.api.net.GTPacketNew; import gregtech.api.net.data.CommonData; import gregtech.api.net.data.CoordinateData; import gregtech.api.net.data.MultiTileEntityData; -import gregtech.api.objects.GT_ItemStack; +import gregtech.api.objects.GTItemStack; import gregtech.api.objects.XSTR; import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; import gregtech.common.render.MultiTileBasicRender; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -98,16 +98,16 @@ public abstract class MultiTileEntity extends CoverableTileEntity protected ForgeDirection facing = ForgeDirection.WEST; // Default to WEST, so it renders facing Left in the // inventory protected byte color; - protected int rgba = GT_Values.UNCOLORED; - private short mteID = GT_Values.W, mteRegistry = GT_Values.W; + protected int rgba = GTValues.UNCOLORED; + private short mteID = GTValues.W, mteRegistry = GTValues.W; private String customName = null; private String ownerName = ""; - private UUID ownerUUID = GT_Utility.defaultUuid; + private UUID ownerUUID = GTUtility.defaultUuid; private boolean lockUpgrade = false; - private final GT_Packet_MultiTileEntity fullPacket = new GT_Packet_MultiTileEntity(false); - private final GT_Packet_MultiTileEntity timedPacket = new GT_Packet_MultiTileEntity(false); - private final GT_Packet_MultiTileEntity graphicPacket = new GT_Packet_MultiTileEntity(false); + private final GTPacketMultiTileEntity fullPacket = new GTPacketMultiTileEntity(false); + private final GTPacketMultiTileEntity timedPacket = new GTPacketMultiTileEntity(false); + private final GTPacketMultiTileEntity graphicPacket = new GTPacketMultiTileEntity(false); public MultiTileEntity(boolean isTicking) { this.isTicking = isTicking; @@ -213,7 +213,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity @Override public void readFromNBT(NBTTagCompound nbt) { // Check if it is a World/Chunk-Loading Process calling readFromNBT - if (mteID == GT_Values.W || mteRegistry == GT_Values.W) { + if (mteID == GTValues.W || mteRegistry == GTValues.W) { // Read the ID Tags first mteID = nbt.getShort(NBT.MTE_ID); mteRegistry = nbt.getShort(NBT.MTE_REG); @@ -224,7 +224,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity if (tClass != null) { // Add the Default Parameters. Useful for things that differ between different tiers/types of the // same machine - nbt = GT_Util.fuseNBT(nbt, tClass.getParameters()); + nbt = GTUtil.fuseNBT(nbt, tClass.getParameters()); } } } @@ -255,7 +255,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity readMultiTileNBT(nbt); if (NetworkUtils.isDedicatedClient()) { - if (GregTech_API.sBlockIcons == null && nbt.hasKey(NBT.TEXTURE_FOLDER)) { + if (GregTechAPI.sBlockIcons == null && nbt.hasKey(NBT.TEXTURE_FOLDER)) { loadTextures(nbt.getString(NBT.TEXTURE_FOLDER)); } else { copyTextures(); @@ -284,7 +284,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity nbt.setShort(NBT.MTE_ID, mteID); nbt.setShort(NBT.MTE_REG, mteRegistry); // write the Custom Name - if (GT_Utility.isStringValid(customName)) { + if (GTUtility.isStringValid(customName)) { final NBTTagCompound displayNBT; if (nbt.hasKey(NBT.DISPLAY)) { displayNBT = nbt.getCompoundTag(NBT.DISPLAY); @@ -349,7 +349,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity public TileEntity getTileEntity(int aX, int aY, int aZ) { if (worldObj == null || (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ))) return null; - return GT_Util.getTileEntity(worldObj, aX, aY, aZ, true); + return GTUtil.getTileEntity(worldObj, aX, aY, aZ, true); } @Override @@ -410,7 +410,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity @Override public String getCustomName() { - return GT_Utility.isStringValid(customName) ? customName : null; + return GTUtility.isStringValid(customName) ? customName : null; } @Override @@ -468,7 +468,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity if (shouldTriggerBlockUpdate()) { // If we're triggering a block update this will call onMachineBlockUpdate() - GregTech_API.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord); + GregTechAPI.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord); } else { // If we're not trigger a cascading one, call the update here. onMachineBlockUpdate(); @@ -653,7 +653,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity } @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { return true; } @@ -696,13 +696,13 @@ public abstract class MultiTileEntity extends CoverableTileEntity @Override public String getOwnerName() { - if (GT_Utility.isStringInvalid(ownerName)) return "Player"; + if (GTUtility.isStringInvalid(ownerName)) return "Player"; return ownerName; } @Override public String setOwnerName(String aName) { - if (GT_Utility.isStringInvalid(aName)) return ownerName = "Player"; + if (GTUtility.isStringInvalid(aName)) return ownerName = "Player"; return ownerName = aName; } @@ -741,7 +741,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity return allowRightclick(aPlayer) && onRightClick(aPlayer, side, aX, aY, aZ); } catch (Throwable e) { GT_FML_LOGGER.error("onBlockActivated Failed", e); - e.printStackTrace(GT_Log.err); + e.printStackTrace(GTLog.err); return true; } } @@ -752,7 +752,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron if (aPlayer.isSneaking()) { final ForgeDirection tSide = (getCoverIDAtSide(side) == 0) - ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) + ? GTUtility.determineWrenchingSide(side, aX, aY, aZ) : side; return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI()); } else if (getCoverBehaviorAtSideNew(side).onCoverRightclickClient(side, this, aPlayer, aX, aY, aZ)) { @@ -764,37 +764,37 @@ public abstract class MultiTileEntity extends CoverableTileEntity if (!privateAccess() || aPlayer.getDisplayName() .equalsIgnoreCase(getOwnerName())) { final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); - final ForgeDirection wrenchSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ); + final ForgeDirection wrenchSide = GTUtility.determineWrenchingSide(side, aX, aY, aZ); if (tCurrentItem != null) { if (getColorization() >= 0 - && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { + && GTUtility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { // TODO (Colorization) } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWrenchList)) return onWrenchRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)) + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sScrewdriverList)) return onScrewdriverRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList)) + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sHardHammerList)) return onHammerRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSoftHammerList)) return onMalletRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSolderingToolList)) return onSolderingRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWireCutterList)) return onWireCutterRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem); final ForgeDirection coverSide = getCoverIDAtSide(side) == 0 ? wrenchSide : side; if (getCoverIDAtSide(coverSide) == 0) { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { - if (GregTech_API.getCoverBehaviorNew(tCurrentItem) + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sCovers.keySet())) { + if (GregTechAPI.getCoverBehaviorNew(tCurrentItem) .isCoverPlaceable(coverSide, tCurrentItem, this) - && allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) { + && allowCoverOnSide(coverSide, new GTItemStack(tCurrentItem))) { setCoverItemAtSide(coverSide, tCurrentItem); if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--; - GT_Utility.sendSoundToPlayers( + GTUtility.sendSoundToPlayers( worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, @@ -808,9 +808,9 @@ public abstract class MultiTileEntity extends CoverableTileEntity return true; } } else { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { - GT_Utility.sendSoundToPlayers( + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sCrowbarList)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + GTUtility.sendSoundToPlayers( worldObj, SoundResource.RANDOM_BREAK, 1.0F, @@ -825,7 +825,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity } } } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config if possible. - side = (getCoverIDAtSide(side) == 0) ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) : side; + side = (getCoverIDAtSide(side) == 0) ? GTUtility.determineWrenchingSide(side, aX, aY, aZ) : side; return getCoverIDAtSide(side) > 0 && getCoverBehaviorAtSideNew(side).onCoverShiftRightClick( side, getCoverIDAtSide(side), @@ -867,7 +867,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity return false; } - GT_UIInfos.openGTTileEntityUI(this, aPlayer); + GTUIInfos.openGTTileEntityUI(this, aPlayer); System.out.println("Trying to open a UI"); return true; } @@ -875,15 +875,15 @@ public abstract class MultiTileEntity extends CoverableTileEntity public boolean onWrenchRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX, float aY, float aZ, ItemStack aTool) { if (setMainFacing(wrenchSide)) { - GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); - GT_Utility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord); + GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); + GTUtility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord); } return onWrenchRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); } public boolean onScrewdriverRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX, float aY, float aZ, ItemStack aTool) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { + if (GTModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { setCoverDataAtSide( wrenchSide, getCoverBehaviorAtSideNew(wrenchSide).onCoverScrewdriverClick( @@ -896,7 +896,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity aY, aZ)); // TODO: Update connections! - GT_Utility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord); + GTUtility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord); } return onScrewdriverRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); } @@ -1033,20 +1033,20 @@ public abstract class MultiTileEntity extends CoverableTileEntity /** * @return a Packet containing all Data which has to be synchronised to the Client - Override as needed */ - public GT_Packet_MultiTileEntity getClientDataPacket() { + public GTPacketMultiTileEntity getClientDataPacket() { - final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(false); + final GTPacketMultiTileEntity packet = new GTPacketMultiTileEntity(false); return packet; } @Override public void sendClientData(EntityPlayerMP aPlayer) { if (worldObj == null || worldObj.isRemote) return; - final GT_Packet_New tPacket = getClientDataPacket(); + final GTPacketNew tPacket = getClientDataPacket(); if (aPlayer == null) { - GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, tPacket, getXCoord(), getZCoord()); + GTValues.NW.sendPacketToAllPlayersInRange(worldObj, tPacket, getXCoord(), getZCoord()); } else { - GT_Values.NW.sendToPlayer(tPacket, aPlayer); + GTValues.NW.sendToPlayer(tPacket, aPlayer); } sendCoverDataIfNeeded(); } @@ -1339,20 +1339,20 @@ public abstract class MultiTileEntity extends CoverableTileEntity } @Override - public void getFullPacketData(GT_Packet_MultiTileEntity packet) { + public void getFullPacketData(GTPacketMultiTileEntity packet) { packet.addData(new CoordinateData(getCoords())); packet.addData(new CommonData(mStrongRedstone, color, (byte) 0)); packet.addData(new MultiTileEntityData(mteRegistry, mteID)); } @Override - public void getGraphicPacketData(GT_Packet_MultiTileEntity packet) { + public void getGraphicPacketData(GTPacketMultiTileEntity packet) { packet.addData(new CoordinateData(getCoords())); packet.addData(new MultiTileEntityData(mteRegistry, mteID)); } @Override - public void getTimedPacketData(GT_Packet_MultiTileEntity packet) { + public void getTimedPacketData(GTPacketMultiTileEntity packet) { packet.addData(new CoordinateData(getCoords())); packet.addData(new MultiTileEntityData(mteRegistry, mteID)); } @@ -1361,21 +1361,21 @@ public abstract class MultiTileEntity extends CoverableTileEntity public void sendFullPacket(@Nonnull EntityPlayerMP player) { fullPacket.clearData(); getFullPacketData(fullPacket); - GT_Values.NW.sendToPlayer(fullPacket, player); + GTValues.NW.sendToPlayer(fullPacket, player); } @Override public void sendGraphicPacket() { graphicPacket.clearData(); getGraphicPacketData(graphicPacket); - GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, graphicPacket, getXCoord(), getZCoord()); + GTValues.NW.sendPacketToAllPlayersInRange(worldObj, graphicPacket, getXCoord(), getZCoord()); } @Override public void sendTimedPacket() { timedPacket.clearData(); getTimedPacketData(timedPacket); - GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, timedPacket, getXCoord(), getZCoord()); + GTValues.NW.sendPacketToAllPlayersInRange(worldObj, timedPacket, getXCoord(), getZCoord()); } @Override diff --git a/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java index 2837a88180..7866ad69dc 100644 --- a/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java +++ b/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java @@ -1,12 +1,12 @@ package gregtech.api.multitileentity.base; -import static gregtech.api.enums.GT_Values.NW; +import static gregtech.api.enums.GTValues.NW; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.Packet; import net.minecraftforge.common.util.ForgeDirection; -import gregtech.api.net.GT_Packet_SendCoverData; +import gregtech.api.net.GTPacketSendCoverData; import gregtech.api.util.ISerializableObject; import gregtech.common.covers.CoverInfo; @@ -45,7 +45,7 @@ public abstract class NonTickableMultiTileEntity extends MultiTileEntity { } else { // Otherwise, send the data right away final CoverInfo coverInfo = getCoverInfoAtSide(side); - NW.sendPacketToAllPlayersInRange(worldObj, new GT_Packet_SendCoverData(coverInfo, this), xCoord, zCoord); + NW.sendPacketToAllPlayersInRange(worldObj, new GTPacketSendCoverData(coverInfo, this), xCoord, zCoord); // Just in case coverInfo.setNeedsUpdate(false); diff --git a/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java index 987a4c18b3..dfc600483b 100644 --- a/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java +++ b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java @@ -1,6 +1,6 @@ package gregtech.api.multitileentity.base; -import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.GTMod.GT_FML_LOGGER; import java.util.HashMap; import java.util.Map; @@ -14,11 +14,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.task.TaskHost; import gregtech.api.task.TickableTask; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Util; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtil; public abstract class TickableMultiTileEntity extends MultiTileEntity implements TaskHost { @@ -57,7 +57,7 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements try { if (timer++ == 0) { markDirty(); - GT_Util.markChunkDirty(this); + GTUtil.markChunkDirty(this); onFirstTick(isServerSide); } if (isDead()) { @@ -80,7 +80,7 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements } catch (Throwable e) { GT_FML_LOGGER.error("UpdateEntity Failed", e); - e.printStackTrace(GT_Log.err); + e.printStackTrace(GTLog.err); try { onTickFailed(timer, isServerSide); } catch (Throwable e2) { @@ -133,8 +133,8 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements @Override protected final void readTasksNBT(NBTTagCompound nbt) { - if (nbt.hasKey(GT_Values.NBT.TASKS)) { - NBTTagCompound tasksTag = nbt.getCompoundTag(GT_Values.NBT.TASKS); + if (nbt.hasKey(GTValues.NBT.TASKS)) { + NBTTagCompound tasksTag = nbt.getCompoundTag(GTValues.NBT.TASKS); for (TickableTask task : tasks.values()) { if (tasksTag.hasKey(task.getName())) { task.readFromNBT(tasksTag.getCompoundTag(task.getName())); @@ -151,7 +151,7 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements task.writeToNBT(tag); tasksTag.setTag(task.getName(), tag); } - aNBT.setTag(GT_Values.NBT.TASKS, tasksTag); + aNBT.setTag(GTValues.NBT.TASKS, tasksTag); } @Override diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java index 73bd55738a..4efaff34d7 100644 --- a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java +++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java @@ -3,7 +3,7 @@ package gregtech.api.multitileentity.enums; import static gregtech.api.util.GT_StructureUtilityMuTE.createMuTEStructureCasing; import static gregtech.loaders.preload.GT_Loader_MultiTileEntities.CASING_REGISTRY_NAME; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.util.GT_StructureUtilityMuTE; public enum GT_MultiTileCasing { @@ -19,7 +19,7 @@ public enum GT_MultiTileCasing { LaserEngraverUpgrade2(8), LaserEngraverUpgrade3(9), LaserEngraverUpgrade4(10), - NONE(GT_Values.W); + NONE(GTValues.W); private final int meta; private final GT_StructureUtilityMuTE.MuTEStructureCasing casing; diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java index e062ecc705..431da32353 100644 --- a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java +++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java @@ -1,6 +1,6 @@ package gregtech.api.multitileentity.enums; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; public enum GT_MultiTileComponentCasing { @@ -116,7 +116,7 @@ public enum GT_MultiTileComponentCasing { UMV_FieldGenerator(109), UXV_FieldGenerator(110), MAX_FieldGenerator(111), - NONE(GT_Values.W); + NONE(GTValues.W); private final int meta; diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java index 7cdde78986..6787ab00d7 100644 --- a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java +++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java @@ -1,11 +1,11 @@ package gregtech.api.multitileentity.enums; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; public enum GT_MultiTileMachine { CokeOven(0), - NONE(GT_Values.W); + NONE(GTValues.W); private final int meta; diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java index 296bae546d..5acdd5aeef 100644 --- a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java +++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java @@ -1,6 +1,6 @@ package gregtech.api.multitileentity.enums; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; public enum GT_MultiTileUpgradeCasing { @@ -57,7 +57,7 @@ public enum GT_MultiTileUpgradeCasing { Insulator_NextGen(107), Insulator_Omnipotent(108), Insulator_OmegaType(109), - NONE(GT_Values.W); + NONE(GTValues.W); private final int meta; diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java index 2045f28d67..0f959c6bce 100644 --- a/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java +++ b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java @@ -4,7 +4,7 @@ import javax.annotation.Nonnull; import net.minecraft.entity.player.EntityPlayerMP; -import gregtech.api.net.GT_Packet_MultiTileEntity; +import gregtech.api.net.GTPacketMultiTileEntity; public interface SyncedMultiTileEntity { @@ -19,10 +19,10 @@ public interface SyncedMultiTileEntity { /** * Should always collect all the data that the controller or casing has and should send * Called by {@link #sendFullPacket()} - * + * * @param packet The packet which will be sent */ - void getFullPacketData(GT_Packet_MultiTileEntity packet); + void getFullPacketData(GTPacketMultiTileEntity packet); /** * Will send a packet at a certain period of time, defined by {@link #getTimedPacketPeriod()}, to all players around @@ -35,10 +35,10 @@ public interface SyncedMultiTileEntity { * Collects all the data that should be sent out at a certain period of time defined by * {@link #getTimedPacketPeriod()} * Called by {@link #sendTimedPacket()} - * + * * @param packet The packet which will be sent */ - void getTimedPacketData(GT_Packet_MultiTileEntity packet); + void getTimedPacketData(GTPacketMultiTileEntity packet); /** * Defines the period of time at which a timed packet should be sent out. Default 20 ticks @@ -56,8 +56,8 @@ public interface SyncedMultiTileEntity { /** * Collects all the data that is needed to be send every single tick * Called by {@link #sendGraphicPacket()} - * + * * @param packet The packet which will be sent */ - void getGraphicPacketData(GT_Packet_MultiTileEntity packet); + void getGraphicPacketData(GTPacketMultiTileEntity packet); } diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java index 0953b4905c..32b87126ca 100644 --- a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java +++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java @@ -1,6 +1,6 @@ package gregtech.api.multitileentity.machine; -import static gregtech.api.enums.GT_Values.*; +import static gregtech.api.enums.GTValues.*; import static gregtech.api.enums.TickTime.MINUTE; import java.io.IOException; @@ -30,8 +30,8 @@ import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.GTValues.NBT; import gregtech.api.enums.InventoryType; import gregtech.api.enums.Mods; import gregtech.api.enums.SoundResource; @@ -55,8 +55,8 @@ import gregtech.api.multitileentity.base.TickableMultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileMachine; import gregtech.api.render.TextureFactory; import gregtech.api.task.tasks.ProcessingTask; -import gregtech.api.util.GT_Utility; -import gregtech.client.GT_SoundLoop; +import gregtech.api.util.GTUtility; +import gregtech.client.GTSoundLoop; import gregtech.common.gui.MachineGUIProvider; public abstract class MultiTileBasicMachine

> extends TickableMultiTileEntity @@ -106,7 +106,7 @@ public abstract class MultiTileBasicMachine

> ex protected GUIProvider guiProvider = createGUIProvider(); @SideOnly(Side.CLIENT) - protected GT_SoundLoop activitySoundLoop; + protected GTSoundLoop activitySoundLoop; public MultiTileBasicMachine() { new ProcessingTask<>(this); @@ -388,16 +388,16 @@ public abstract class MultiTileBasicMachine

> ex switch (aIndex) { case PROCESS_START_SOUND_INDEX -> { if (getProcessStartSound() != null) - GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); + GTUtility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); } - case INTERRUPT_SOUND_INDEX -> GT_Utility + case INTERRUPT_SOUND_INDEX -> GTUtility .doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ); } } public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { if (aIndex == PROCESS_START_SOUND_INDEX && getProcessStartSound() != null) { - GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); + GTUtility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); } } @@ -412,7 +412,7 @@ public abstract class MultiTileBasicMachine

> ex @SideOnly(Side.CLIENT) protected void doActivitySound(ResourceLocation activitySound) { if (isActive() && activitySound != null && activitySoundLoop == null) { - activitySoundLoop = new GT_SoundLoop(activitySound, this, false, true); + activitySoundLoop = new GTSoundLoop(activitySound, this, false, true); Minecraft.getMinecraft() .getSoundHandler() .playSound(activitySoundLoop); @@ -549,7 +549,7 @@ public abstract class MultiTileBasicMachine

> ex @Override protected void addDebugInfo(EntityPlayer player, int logLevel, ArrayList list) { list.add( - GT_Utility.trans("186", "Owned by: ") + EnumChatFormatting.BLUE + GTUtility.trans("186", "Owned by: ") + EnumChatFormatting.BLUE + getOwnerName() + EnumChatFormatting.RESET + " (" @@ -567,30 +567,30 @@ public abstract class MultiTileBasicMachine

> ex list.add( StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(logic.getStoredEnergy()) + + GTUtility.formatNumbers(logic.getStoredEnergy()) + EnumChatFormatting.RESET + " EU / " + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(logic.getCapacity()) + + GTUtility.formatNumbers(logic.getCapacity()) + EnumChatFormatting.RESET + " EU"); list.add( StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + EnumChatFormatting.RED - + GT_Utility.formatNumbers(getProcessingLogic().getCalculatedEut()) + + GTUtility.formatNumbers(getProcessingLogic().getCalculatedEut()) + EnumChatFormatting.RESET + " EU/t"); list.add( StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(logic.getVoltage()) + + GTUtility.formatNumbers(logic.getVoltage()) + EnumChatFormatting.RESET // TODO: Put ampere getter here, once that's variable + " EU/t(*2A) " + StatCollector.translateToLocal("GT5U.machines.tier") + ": " + EnumChatFormatting.YELLOW - + VN[GT_Utility.getTier(logic.getVoltage())] + + VN[GTUtility.getTier(logic.getVoltage())] + EnumChatFormatting.RESET); } @@ -598,11 +598,11 @@ public abstract class MultiTileBasicMachine

> ex // TODO: Add CPU load calculator list.add( - "Average CPU load of ~" + GT_Utility.formatNumbers(0) + "Average CPU load of ~" + GTUtility.formatNumbers(0) + "ns over " - + GT_Utility.formatNumbers(0) + + GTUtility.formatNumbers(0) + " ticks with worst time of " - + GT_Utility.formatNumbers(0) + + GTUtility.formatNumbers(0) + "ns."); } @@ -613,11 +613,11 @@ public abstract class MultiTileBasicMachine

> ex list.add( StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(progressTime > 20 ? progressTime / 20 : progressTime) + + GTUtility.formatNumbers(progressTime > 20 ? progressTime / 20 : progressTime) + EnumChatFormatting.RESET + (progressTime > 20 ? " s / " : " ticks / ") + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxProgressTime > 20 ? maxProgressTime / 20 : maxProgressTime) + + GTUtility.formatNumbers(maxProgressTime > 20 ? maxProgressTime / 20 : maxProgressTime) + EnumChatFormatting.RESET + (maxProgressTime > 20 ? " s" : " ticks")); } @@ -678,7 +678,7 @@ public abstract class MultiTileBasicMachine

> ex switch (soundEventValue) { case PROCESS_START_SOUND_INDEX -> { - if (getProcessStartSound() != null) GT_Utility.doSoundAtClient( + if (getProcessStartSound() != null) GTUtility.doSoundAtClient( getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, @@ -686,7 +686,7 @@ public abstract class MultiTileBasicMachine

> ex getYCoord(), getZCoord()); } - case INTERRUPT_SOUND_INDEX -> GT_Utility.doSoundAtClient( + case INTERRUPT_SOUND_INDEX -> GTUtility.doSoundAtClient( SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, @@ -765,8 +765,8 @@ public abstract class MultiTileBasicMachine

> ex } protected void updatePowerLogic() { - power.setEnergyCapacity(GT_Values.V[tier] * power.getMaxAmperage() * 2 * MINUTE); - power.setMaxVoltage(GT_Values.V[tier]); + power.setEnergyCapacity(GTValues.V[tier] * power.getMaxAmperage() * 2 * MINUTE); + power.setMaxVoltage(GTValues.V[tier]); power.setMaxAmperage(1); } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java index cdcb77d6e5..3abb69dd51 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java @@ -15,8 +15,8 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import gregtech.api.logic.ComplexParallelProcessingLogic; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.GT_Waila; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GTWaila; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -56,12 +56,12 @@ public abstract class ComplexParallelController 20 ? processing.getProgress(i) / 20 : processing.getProgress(i)) + EnumChatFormatting.RESET + (processing.getProgress(i) > 20 ? " s / " : " ticks / ") + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers( + + GTUtility.formatNumbers( processing.getDuration(i) > 20 ? processing.getDuration(i) / 20 : processing.getDuration(i)) + EnumChatFormatting.RESET + (processing.getDuration(i) > 20 ? " s" : " ticks")); @@ -92,7 +92,7 @@ public abstract class ComplexParallelController 0 && maxProgress >= progress, maxProgress, progress)); } } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java index 552cf6d94e..1eaae5997d 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java @@ -1,6 +1,6 @@ package gregtech.api.multitileentity.multiblock.base; -import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; +import static gregtech.api.util.GTUtility.moveMultipleItemStacks; import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser; import static mcp.mobius.waila.api.SpecialChars.*; @@ -46,7 +46,7 @@ import com.gtnewhorizon.structurelib.util.Vec3Impl; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import cpw.mods.fml.common.network.NetworkRegistry; -import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.enums.GTValues.NBT; import gregtech.api.enums.InventoryType; import gregtech.api.enums.VoidingMode; import gregtech.api.interfaces.IDescribable; @@ -64,11 +64,11 @@ import gregtech.api.multitileentity.interfaces.IMultiBlockPart; import gregtech.api.multitileentity.machine.MultiTileBasicMachine; import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing; import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; -import gregtech.api.net.GT_Packet_MultiTileEntity; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.GT_Waila; +import gregtech.api.net.GTPacketMultiTileEntity; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GTWaila; +import gregtech.api.util.MultiblockTooltipBuilder; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -81,7 +81,7 @@ public abstract class Controller, P extends MuTEProce public static final String ALL_INVENTORIES_NAME = "all"; protected static final int AUTO_OUTPUT_FREQUENCY_TICK = 20; - private static final Map tooltip = new ConcurrentHashMap<>(); + private static final Map tooltip = new ConcurrentHashMap<>(); private final List> upgradeCasings = new ArrayList<>(); private final List> functionalCasings = new ArrayList<>(); protected BuildState buildState = new BuildState(); @@ -131,7 +131,7 @@ public abstract class Controller, P extends MuTEProce /** * Create the tooltip for this multi block controller. */ - protected abstract GT_Multiblock_Tooltip_Builder createTooltip(); + protected abstract MultiblockTooltipBuilder createTooltip(); /** * @return The starting offset for the structure builder @@ -269,8 +269,8 @@ public abstract class Controller, P extends MuTEProce return getMultiTileEntityRegistryID() << 16 + getMultiTileEntityID(); } - protected GT_Multiblock_Tooltip_Builder getTooltip() { - GT_Multiblock_Tooltip_Builder builder = tooltip.get(getToolTipID()); + protected MultiblockTooltipBuilder getTooltip() { + MultiblockTooltipBuilder builder = tooltip.get(getToolTipID()); if (builder == null) { builder = createTooltip(); tooltip.put(getToolTipID(), builder); @@ -423,7 +423,7 @@ public abstract class Controller, P extends MuTEProce if (aPlayer.isSneaking()) { // we won't be allowing horizontal flips, as it can be perfectly emulated by rotating twice and flipping // horizontally allowing an extra round of flip make it hard to draw meaningful flip markers in - // GT_Proxy#drawGrid + // GTProxy#drawGrid toolSetFlip(getFlip().isHorizontallyFlipped() ? Flip.NONE : Flip.HORIZONTAL); } else { toolSetRotation(null); @@ -615,7 +615,7 @@ public abstract class Controller, P extends MuTEProce } @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { return side != facing; } @@ -992,7 +992,7 @@ public abstract class Controller, P extends MuTEProce if (isSimpleMachine) { boolean isActive = tag.getBoolean("isActive"); currentTip.add( - GT_Waila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress"))); + GTWaila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress"))); } boolean isActive = tag.getBoolean("isActive"); if (isActive) { @@ -1002,23 +1002,23 @@ public abstract class Controller, P extends MuTEProce currentTip.add( StatCollector.translateToLocalFormatted( "GT5U.waila.energy.use_with_amperage", - GT_Utility.formatNumbers(actualEnergyUsage), - GT_Utility.getAmperageForTier(actualEnergyUsage, (byte) energyTier), - GT_Utility.getColoredTierNameFromTier((byte) energyTier))); + GTUtility.formatNumbers(actualEnergyUsage), + GTUtility.getAmperageForTier(actualEnergyUsage, (byte) energyTier), + GTUtility.getColoredTierNameFromTier((byte) energyTier))); } else if (actualEnergyUsage < 0) { currentTip.add( StatCollector.translateToLocalFormatted( "GT5U.waila.energy.produce_with_amperage", - GT_Utility.formatNumbers(-actualEnergyUsage), - GT_Utility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier), - GT_Utility.getColoredTierNameFromTier((byte) energyTier))); + GTUtility.formatNumbers(-actualEnergyUsage), + GTUtility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier), + GTUtility.getColoredTierNameFromTier((byte) energyTier))); } } } @Override - public GT_Packet_MultiTileEntity getClientDataPacket() { - final GT_Packet_MultiTileEntity packet = super.getClientDataPacket(); + public GTPacketMultiTileEntity getClientDataPacket() { + final GTPacketMultiTileEntity packet = super.getClientDataPacket(); return packet; diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java index 5a16ed4b38..2c3cafc67d 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java @@ -1,7 +1,7 @@ package gregtech.api.multitileentity.multiblock.base; import static com.google.common.math.LongMath.log2; -import static gregtech.api.enums.GT_Values.B; +import static gregtech.api.enums.GTValues.B; import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN; import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN; import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN; @@ -36,9 +36,9 @@ import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.enums.GTValues.NBT; import gregtech.api.enums.InventoryType; -import gregtech.api.fluid.FluidTankGT; +import gregtech.api.fluid.GTFluidTank; import gregtech.api.gui.GUIHost; import gregtech.api.gui.GUIProvider; import gregtech.api.interfaces.ITexture; @@ -54,7 +54,7 @@ import gregtech.api.multitileentity.enums.MultiTileCasingPurpose; import gregtech.api.multitileentity.interfaces.IMultiBlockController; import gregtech.api.multitileentity.interfaces.IMultiBlockPart; import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.common.covers.CoverInfo; import gregtech.common.gui.PartGUIProvider; import mcp.mobius.waila.api.IWailaConfigHandler; @@ -80,7 +80,7 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity protected UUID lockedInventory; protected int mLockedInventoryIndex = 0; - protected FluidTankGT configurationTank = new FluidTankGT(); + protected GTFluidTank configurationTank = new GTFluidTank(); @Nonnull protected final GUIProvider guiProvider = createGUIProvider(); @@ -436,7 +436,7 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity if (aPlayer.isSneaking()) { facing = wrenchSide; } - GT_Utility.sendChatToPlayer(aPlayer, "Mode set to `" + getModeName(mode) + "' (" + mode + ")"); + GTUtility.sendChatToPlayer(aPlayer, "Mode set to `" + getModeName(mode) + "' (" + mode + ")"); sendClientData((EntityPlayerMP) aPlayer); return true; } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java index bc3c857fd6..d48bbd03fd 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java @@ -2,7 +2,7 @@ package gregtech.api.multitileentity.multiblock.casing; import net.minecraft.nbt.NBTTagCompound; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; public abstract class FunctionalCasing extends MultiBlockPart { @@ -19,7 +19,7 @@ public abstract class FunctionalCasing extends MultiBlockPart { @Override public void readMultiTileNBT(NBTTagCompound nbt) { super.readMultiTileNBT(nbt); - tier = nbt.getInteger(GT_Values.NBT.TIER); + tier = nbt.getInteger(GTValues.NBT.TIER); } @Override diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java index 566afcd770..ae5b36c1e0 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java @@ -2,7 +2,7 @@ package gregtech.api.multitileentity.multiblock.casing; import net.minecraft.nbt.NBTTagCompound; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.multitileentity.interfaces.IMultiBlockController; import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; @@ -27,7 +27,7 @@ public abstract class UpgradeCasing extends MultiBlockPart { @Override public void readMultiTileNBT(NBTTagCompound aNBT) { super.readMultiTileNBT(aNBT); - tier = aNBT.getInteger(GT_Values.NBT.TIER); + tier = aNBT.getInteger(GTValues.NBT.TIER); } protected abstract void customWork(IMultiBlockController aTarget); diff --git a/src/main/java/gregtech/api/net/GTPacket.java b/src/main/java/gregtech/api/net/GTPacket.java new file mode 100644 index 0000000000..1d2de3303b --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacket.java @@ -0,0 +1,59 @@ +package gregtech.api.net; + +import net.minecraft.network.INetHandler; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import io.netty.buffer.ByteBuf; + +/** + * @deprecated Use {@link GTPacketNew} instead + */ +@Deprecated +public abstract class GTPacket { + + public GTPacket(boolean aIsReference) { + // + } + + /** + * I use constant IDs instead of Dynamic ones, since that is much more fail safe + * + * @return a Packet ID for this Class + */ + public abstract byte getPacketID(); + + /** + * @return encoded byte Stream + * @deprecated Use {@link #encode(ByteBuf)} instead + */ + @Deprecated + public abstract byte[] encode(); + + /** + * Encode the data into given byte buffer without creating an intermediate byte array. Default implementation just + * throw {@link UnsupportedOperationException}. + */ + public void encode(ByteBuf aOut) { + throw new UnsupportedOperationException(); + } + + /** + * @return encoded byte Stream + */ + public abstract GTPacket decode(ByteArrayDataInput aData); + + /** + * Process the packet + * + * @param aWorld null if message is received on server side, the client world if message is received on client side + */ + public abstract void process(IBlockAccess aWorld); + + /** + * This will be called just before {@link #process(IBlockAccess)} to inform the handler about the source and type of + * connection + */ + public void setINetHandler(INetHandler aHandler) {} +} diff --git a/src/main/java/gregtech/api/net/GTPacketBlockEvent.java b/src/main/java/gregtech/api/net/GTPacketBlockEvent.java new file mode 100644 index 0000000000..a2164f4f07 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketBlockEvent.java @@ -0,0 +1,63 @@ +package gregtech.api.net; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import io.netty.buffer.ByteBuf; + +/** + * Used to transfer Block Events in a much better fashion + */ +public class GTPacketBlockEvent extends GTPacketNew { + + private int mX, mZ; + private short mY; + private byte mID, mValue; + + public GTPacketBlockEvent() { + super(true); + } + + public GTPacketBlockEvent(int aX, short aY, int aZ, byte aID, byte aValue) { + super(false); + mX = aX; + mY = aY; + mZ = aZ; + mID = aID; + mValue = aValue; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + aOut.writeByte(mID); + aOut.writeByte(mValue); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketBlockEvent( + aData.readInt(), + aData.readShort(), + aData.readInt(), + aData.readByte(), + aData.readByte()); + } + + @Override + public void process(IBlockAccess aWorld) { + if (aWorld != null) { + final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); + if (tTileEntity != null) tTileEntity.receiveClientEvent(mID, mValue); + } + } + + @Override + public byte getPacketID() { + return GTPacketTypes.BLOCK_EVENT.id; + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketClientPreference.java b/src/main/java/gregtech/api/net/GTPacketClientPreference.java new file mode 100644 index 0000000000..ea5d9ec476 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketClientPreference.java @@ -0,0 +1,58 @@ +package gregtech.api.net; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.GTMod; +import gregtech.api.util.GTClientPreference; +import io.netty.buffer.ByteBuf; + +public class GTPacketClientPreference extends GTPacketNew { + + private GTClientPreference mPreference; + private EntityPlayerMP mPlayer; + + public GTPacketClientPreference() { + super(true); + } + + public GTPacketClientPreference(GTClientPreference mPreference) { + super(false); + this.mPreference = mPreference; + } + + @Override + public byte getPacketID() { + return GTPacketTypes.CLIENT_PREFERENCE.id; + } + + @Override + public void setINetHandler(INetHandler aHandler) { + if (aHandler instanceof NetHandlerPlayServer) { + mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity; + } + } + + @Override + public void process(IBlockAccess aWorld) { + if (mPlayer != null) GTMod.gregtechproxy.setClientPreference(mPlayer.getUniqueID(), mPreference); + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeBoolean(mPreference.isSingleBlockInitialFilterEnabled()); + aOut.writeBoolean(mPreference.isSingleBlockInitialMultiStackEnabled()); + aOut.writeBoolean(mPreference.isInputBusInitialFilterEnabled()); + aOut.writeBoolean(mPreference.isWailaAverageNSEnabled()); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketClientPreference( + new GTClientPreference(aData.readBoolean(), aData.readBoolean(), aData.readBoolean(), aData.readBoolean())); + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketMultiTileEntity.java b/src/main/java/gregtech/api/net/GTPacketMultiTileEntity.java new file mode 100644 index 0000000000..b151f8eb5f --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketMultiTileEntity.java @@ -0,0 +1,254 @@ +package gregtech.api.net; + +import static gregtech.api.enums.GTValues.B; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.net.data.CasingData; +import gregtech.api.net.data.CommonData; +import gregtech.api.net.data.CoordinateData; +import gregtech.api.net.data.MultiTileEntityData; +import gregtech.api.net.data.MultiTileEntityProcess; +import gregtech.api.net.data.PacketData; +import io.netty.buffer.ByteBuf; + +public class GTPacketMultiTileEntity extends GTPacketNew { + + private final Set> data = new HashSet<>(); + public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3], INVENTORY_INDEX = B[4], + INVENTORY_NAME_ID = B[5], BOOLEANS = B[6], SOUND = B[7]; + + public GTPacketMultiTileEntity(boolean reference) { + super(reference); + } + + @Override + public void encode(ByteBuf aOut) { + Set> set = data.stream() + .sorted() + .collect( + HashSet>::new, + HashSet>::add, + HashSet>::addAll); + clearData(); + data.addAll(set); + int features = 0; + for (PacketData data : data) { + features |= 1 << data.getId(); + } + + aOut.writeInt(features); + + for (PacketData data : data) { + data.encode(aOut); + } + /* + * TODO Move to new system + * if ((features & COVERS) == COVERS) { + * aOut.writeInt(mC0); + * aOut.writeInt(mC1); + * aOut.writeInt(mC2); + * aOut.writeInt(mC3); + * aOut.writeInt(mC4); + * aOut.writeInt(mC5); + * } + * if ((features & MODES) == MODES) { + * aOut.writeInt(mode); + * aOut.writeInt(allowedModes); + * } + * if ((features & CONTROLLER) == CONTROLLER) { + * aOut.writeInt(mTargetPos.posX); + * aOut.writeShort(mTargetPos.posY); + * aOut.writeInt(mTargetPos.posZ); + * } + * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX) { + * aOut.writeInt(mLockedInventoryIndex); + * } + * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) { + * if (mInventoryName != null && mInventoryName.length() > 0) { + * byte[] bytes = mInventoryName.getBytes(); + * aOut.writeInt(bytes.length); + * aOut.writeBytes(bytes); + * } else { + * aOut.writeInt(0); + * } + * if (inventoryID != null && inventoryID.length() > 0) { + * byte[] bytes = inventoryID.getBytes(); + * aOut.writeInt(bytes.length); + * aOut.writeBytes(bytes); + * } else { + * aOut.writeInt(0); + * } + * } + * if ((features & BOOLEANS) == BOOLEANS) { + * aOut.writeInt(booleans); + * } + * if ((features & SOUND) == SOUND) { + * aOut.writeByte(soundEvent); + * aOut.writeInt(soundEventValue); + * } + */ + } + + @Override + public GTPacketNew decode(ByteArrayDataInput in) { + Objects.requireNonNull(in); + final int packetFeatures = in.readInt(); + + final GTPacketMultiTileEntity packet = new GTPacketMultiTileEntity(false); + + if (containsBit(packetFeatures, CoordinateData.COORDINATE_DATA_ID)) { + packet.addData(new CoordinateData()); + } + if (containsBit(packetFeatures, MultiTileEntityData.MULTI_TILE_ENTITY_DATA_ID)) { + packet.addData(new MultiTileEntityData()); + } + if (containsBit(packetFeatures, CommonData.COMMON_DATA_ID)) { + packet.addData(new CommonData()); + } + if (containsBit(packetFeatures, CasingData.CASING_DATA_ID)) { + packet.addData(new CasingData()); + } + + Set> set = packet.data.stream() + .sorted() + .collect( + HashSet>::new, + HashSet>::add, + HashSet>::addAll); + packet.clearData(); + packet.data.addAll(set); + for (PacketData data : packet.data) { + data.decode(in); + } + /* + * if ((packetFeatures & COVERS) == COVERS) { + * packet.setCoverData( + * in.readInt(), + * in.readInt(), + * in.readInt(), + * in.readInt(), + * in.readInt(), + * in.readInt()); + * } + * if ((packetFeatures & INVENTORY_INDEX) == INVENTORY_INDEX) { + * packet.setInventoryIndex(aData.readInt()); + * } + * if ((packetFeatures & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) { + * int nameLength = aData.readInt(); + * String inventoryName; + * if (nameLength > 0) { + * byte[] bytes = new byte[nameLength]; + * for (int i = 0; i < nameLength; i++) { + * bytes[i] = aData.readByte(); + * } + * inventoryName = new String(bytes); + * } else { + * inventoryName = null; + * } + * int idLength = aData.readInt(); + * String inventoryID; + * if (idLength > 0) { + * byte[] bytes = new byte[idLength]; + * for (int i = 0; i < idLength; i++) { + * bytes[i] = aData.readByte(); + * } + * inventoryID = new String(bytes); + * } else { + * inventoryID = null; + * } + * packet.setInventoryName(inventoryName, inventoryID); + * } + * if ((packetFeatures & BOOLEANS) == BOOLEANS) { + * packet.setBooleans(aData.readInt()); + * } + * if ((packetFeatures & SOUND) == SOUND) { + * packet.setSoundEvent(aData.readByte(), aData.readInt()); + * } + */ + return packet; + } + + @Override + public void process(IBlockAccess aWorld) { + if (aWorld == null) return; + MultiTileEntityProcess process = new MultiTileEntityProcess(aWorld); + for (PacketData data : data) { + data.process(process); + } + process.process(); + /* + * final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); + * try { + * final Block tBlock = aWorld.getBlock(mX, mY, mZ); + * if (tBlock instanceof MultiTileEntityBlock mteBlock) { + * final IMultiTileEntity mte = mteBlock.receiveMultiTileEntityData(aWorld, mX, mY, mZ, mRID, mID); + * if (mte == null) return; + * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COMMON_DATA, mCommonData); + * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COLOR, mColor); + * if ((features & COVERS) == COVERS) { + * mteBlock.receiveCoverData(mte, mC0, mC1, mC2, mC3, mC4, mC5); + * } + * if ((features & REDSTONE) == REDSTONE) { + * mte.receiveClientData(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, mRedstone); + * } + * if ((features & MODES) == MODES && mte instanceof IMultiTileEntity.IMTE_HasModes mteModes) { + * mteModes.setMode(mode); + * mteModes.setAllowedModes(allowedModes); + * } + * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID && mte instanceof Inventory invUpg) { + * invUpg.setInventoryName(mInventoryName); + * invUpg.setInventoryId(inventoryID); + * } + * if ((features & CONTROLLER) == CONTROLLER && mte instanceof IMultiBlockPart) { + * final IMultiBlockPart mtePart = (IMultiBlockPart) mte; + * mtePart.setTargetPos(mTargetPos); + * } + * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX && mte instanceof IMultiBlockPart) { + * final IMultiBlockPart mtePart = (IMultiBlockPart) mte; + * mtePart.setLockedInventoryIndex(mLockedInventoryIndex); + * } + * if ((features & BOOLEANS) == BOOLEANS && mte instanceof IMultiTileMachine) { + * final IMultiTileMachine machine = (IMultiTileMachine) mte; + * machine.setBooleans(booleans); + * } + * if ((features & SOUND) == SOUND && mte instanceof IMultiTileMachine) { + * final IMultiTileMachine machine = (IMultiTileMachine) mte; + * machine.setSound(soundEvent, soundEventValue); + * } + * } + * } catch (Exception e) { + * e.printStackTrace(); + * GTMod.GT_FML_LOGGER.error( + * "Exception setting tile entity data for tile entity {} at ({}, {}, {})", + * tTileEntity, + * mX, + * mY, + * mZ); + * } + */ + } + + @Override + public byte getPacketID() { + return GTPacketTypes.MULTI_TILE_ENTITY.id; + } + + public void clearData() { + data.clear(); + } + + public void addData(PacketData data) { + this.data.add(data); + } + + private static boolean containsBit(int toCheck, int bit) { + return (toCheck & (1 << bit)) > 0; + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketMusicSystemData.java b/src/main/java/gregtech/api/net/GTPacketMusicSystemData.java new file mode 100644 index 0000000000..c650188594 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketMusicSystemData.java @@ -0,0 +1,58 @@ +package gregtech.api.net; + +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.util.GTMusicSystem; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +public class GTPacketMusicSystemData extends GTPacketNew { + + ByteBuf storedData; + + public GTPacketMusicSystemData() { + super(true); + } + + public GTPacketMusicSystemData(ByteBuf data) { + super(false); + this.storedData = data; + } + + @Override + public byte getPacketID() { + return GTPacketTypes.MUSIC_SYSTEM_DATA.id; + } + + @Override + public void encode(ByteBuf aOut) { + if (storedData == null) { + return; + } + storedData.markReaderIndex(); + final int len = storedData.readableBytes(); + aOut.writeInt(len); + aOut.writeBytes(storedData); + storedData.resetReaderIndex(); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + final int len = aData.readInt(); + final byte[] fullData = new byte[len]; + aData.readFully(fullData); + return new GTPacketMusicSystemData(Unpooled.wrappedBuffer(fullData)); + } + + @Override + public void process(IBlockAccess aWorld) { + if (aWorld == null || storedData == null) { + return; + } + storedData.markReaderIndex(); + GTMusicSystem.ClientSystem.loadUpdatedSources(storedData); + storedData.resetReaderIndex(); + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketNew.java b/src/main/java/gregtech/api/net/GTPacketNew.java new file mode 100644 index 0000000000..d3fee800c6 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketNew.java @@ -0,0 +1,30 @@ +package gregtech.api.net; + +import com.google.common.io.ByteArrayDataInput; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +@SuppressWarnings("deprecation") +public abstract class GTPacketNew extends GTPacket { + + public GTPacketNew(boolean aIsReference) { + super(aIsReference); + } + + @Override + @Deprecated + public final byte[] encode() { + final ByteBuf tOut = Unpooled.buffer(); + encode(tOut); + final byte[] bytes = new byte[tOut.readableBytes()]; + tOut.readBytes(bytes); + return bytes; + } + + @Override + public abstract void encode(ByteBuf aOut); + + @Override + public abstract GTPacketNew decode(ByteArrayDataInput aData); +} diff --git a/src/main/java/gregtech/api/net/GTPacketPollution.java b/src/main/java/gregtech/api/net/GTPacketPollution.java new file mode 100644 index 0000000000..2f4805aad8 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketPollution.java @@ -0,0 +1,47 @@ +package gregtech.api.net; + +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.common.GTClient; +import io.netty.buffer.ByteBuf; + +public class GTPacketPollution extends GTPacketNew { + + private ChunkCoordIntPair chunk; + private int pollution; + + public GTPacketPollution() { + super(true); + } + + public GTPacketPollution(ChunkCoordIntPair chunk, int pollution) { + super(false); + this.chunk = chunk; + this.pollution = pollution; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(chunk.chunkXPos) + .writeInt(chunk.chunkZPos) + .writeInt(pollution); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketPollution(new ChunkCoordIntPair(aData.readInt(), aData.readInt()), aData.readInt()); + } + + @Override + public void process(IBlockAccess aWorld) { + GTClient.recieveChunkPollutionPacket(chunk, pollution); + } + + @Override + public byte getPacketID() { + return GTPacketTypes.POLLUTION.id; + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketRequestCoverData.java b/src/main/java/gregtech/api/net/GTPacketRequestCoverData.java new file mode 100644 index 0000000000..4679643624 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketRequestCoverData.java @@ -0,0 +1,113 @@ +package gregtech.api.net; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.metatileentity.CoverableTileEntity; +import gregtech.common.covers.CoverInfo; +import io.netty.buffer.ByteBuf; + +/** + * Client -> Server : ask for cover data + */ +public class GTPacketRequestCoverData extends GTPacketNew { + + protected int mX; + protected short mY; + protected int mZ; + + protected ForgeDirection side; + protected int coverID; + + protected EntityPlayerMP mPlayer; + + public GTPacketRequestCoverData() { + super(true); + } + + public GTPacketRequestCoverData(CoverInfo info, ICoverable tile) { + super(false); + this.mX = tile.getXCoord(); + this.mY = tile.getYCoord(); + this.mZ = tile.getZCoord(); + + this.side = info.getSide(); + this.coverID = info.getCoverID(); + } + + public GTPacketRequestCoverData(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID) { + super(false); + this.mX = mX; + this.mY = mY; + this.mZ = mZ; + + this.side = coverSide; + this.coverID = coverID; + } + + public GTPacketRequestCoverData(ForgeDirection coverSide, int coverID, ICoverable tile) { + super(false); + this.mX = tile.getXCoord(); + this.mY = tile.getYCoord(); + this.mZ = tile.getZCoord(); + + this.side = coverSide; + this.coverID = coverID; + } + + @Override + public byte getPacketID() { + return GTPacketTypes.REQUEST_COVER_DATA.id; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + + aOut.writeByte(side.ordinal()); + aOut.writeInt(coverID); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketRequestCoverData( + aData.readInt(), + aData.readShort(), + aData.readInt(), + ForgeDirection.getOrientation(aData.readByte()), + aData.readInt()); + } + + @Override + public void setINetHandler(INetHandler aHandler) { + if (aHandler instanceof NetHandlerPlayServer) { + mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity; + } + } + + @Override + public void process(IBlockAccess aWorld) { + // impossible, but who knows + if (mPlayer == null) return; + final World world = DimensionManager.getWorld(mPlayer.dimension); + if (world != null) { + final TileEntity tile = world.getTileEntity(mX, mY, mZ); + if (tile instanceof CoverableTileEntity te) { + if (!te.isDead() && te.getCoverIDAtSide(side) == coverID) { + te.issueCoverUpdate(side); + } + } + } + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketSendCoverData.java b/src/main/java/gregtech/api/net/GTPacketSendCoverData.java new file mode 100644 index 0000000000..76adb75d31 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketSendCoverData.java @@ -0,0 +1,107 @@ +package gregtech.api.net; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.metatileentity.CoverableTileEntity; +import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverInfo; +import io.netty.buffer.ByteBuf; + +/** + * Server -> Client : Update cover data + */ +public class GTPacketSendCoverData extends GTPacketNew { + + protected int mX; + protected short mY; + protected int mZ; + + protected ForgeDirection side; + protected int coverID; + protected ISerializableObject coverData; + + public GTPacketSendCoverData() { + super(true); + } + + public GTPacketSendCoverData(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID, + ISerializableObject coverData) { + super(false); + this.mX = mX; + this.mY = mY; + this.mZ = mZ; + + this.side = coverSide; + this.coverID = coverID; + this.coverData = coverData; + } + + public GTPacketSendCoverData(CoverInfo info, ICoverable tile) { + super(false); + this.mX = tile.getXCoord(); + this.mY = tile.getYCoord(); + this.mZ = tile.getZCoord(); + + this.side = info.getSide(); + this.coverID = info.getCoverID(); + this.coverData = info.getCoverData(); + } + + public GTPacketSendCoverData(ForgeDirection coverSide, int coverID, ISerializableObject coverData, + ICoverable tile) { + super(false); + this.mX = tile.getXCoord(); + this.mY = tile.getYCoord(); + this.mZ = tile.getZCoord(); + + this.side = coverSide; + this.coverID = coverID; + this.coverData = coverData; + } + + @Override + public byte getPacketID() { + return GTPacketTypes.SEND_COVER_DATA.id; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + + aOut.writeByte(side.ordinal()); + aOut.writeInt(coverID); + coverData.writeToByteBuf(aOut); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + final int coverId; + return new GTPacketSendCoverData( + aData.readInt(), + aData.readShort(), + aData.readInt(), + ForgeDirection.getOrientation(aData.readByte()), + coverId = aData.readInt(), + GregTechAPI.getCoverBehaviorNew(coverId) + .createDataObject() + .readFromPacket(aData, null)); + } + + @Override + public void process(IBlockAccess aWorld) { + if (aWorld != null) { + final TileEntity tile = aWorld.getTileEntity(mX, mY, mZ); + if (tile instanceof CoverableTileEntity coverable && !coverable.isDead()) { + coverable.receiveCoverData(side, coverID, coverData, null); + } + } + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketSendOregenPattern.java b/src/main/java/gregtech/api/net/GTPacketSendOregenPattern.java new file mode 100644 index 0000000000..9db0e9a471 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketSendOregenPattern.java @@ -0,0 +1,56 @@ +package gregtech.api.net; + +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.util.GTLog; +import gregtech.common.GTWorldgenerator; +import gregtech.common.GTWorldgenerator.OregenPattern; +import io.netty.buffer.ByteBuf; + +public class GTPacketSendOregenPattern extends GTPacketNew { + + protected OregenPattern pattern = OregenPattern.AXISSYMMETRICAL; + + public GTPacketSendOregenPattern() { + super(true); + } + + public GTPacketSendOregenPattern(OregenPattern pattern) { + super(false); + this.pattern = pattern; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(this.pattern.ordinal()); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + int ordinal = aData.readInt(); + // make sure we get valid data: + if (ordinal >= 0 && ordinal < OregenPattern.values().length) { + return new GTPacketSendOregenPattern(OregenPattern.values()[ordinal]); + } + // invalid data, default to AXISSYMMETRICAL: + GTLog.err.println( + String.format( + "Received invalid data! Received %d but value must be between 0 and %d! Default (0) will be used.", + ordinal, + OregenPattern.values().length - 1)); + return new GTPacketSendOregenPattern(); + } + + @Override + public byte getPacketID() { + return GTPacketTypes.SEND_OREGEN_PATTERN.id; + } + + @Override + public void process(IBlockAccess aWorld) { + GTWorldgenerator.oregenPattern = this.pattern; + } + +} diff --git a/src/main/java/gregtech/api/net/GTPacketSetConfigurationCircuit.java b/src/main/java/gregtech/api/net/GTPacketSetConfigurationCircuit.java new file mode 100644 index 0000000000..8984cea509 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketSetConfigurationCircuit.java @@ -0,0 +1,110 @@ +package gregtech.api.net; + +import net.minecraft.item.ItemStack; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; + +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.common.network.ByteBufUtils; +import gregtech.api.interfaces.IConfigurationCircuitSupport; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IHasInventory; +import gregtech.api.metatileentity.BaseTileEntity; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import io.netty.buffer.ByteBuf; + +/** + * Client -> Server: Update machine configuration data + */ +public class GTPacketSetConfigurationCircuit extends GTPacketNew { + + protected int mX; + protected short mY; + protected int mZ; + protected int dimId; + + protected ItemStack circuit; + + public GTPacketSetConfigurationCircuit() { + super(true); + } + + public GTPacketSetConfigurationCircuit(IGregTechTileEntity tile, ItemStack circuit) { + this(tile.getXCoord(), tile.getYCoord(), tile.getZCoord(), circuit); + } + + public GTPacketSetConfigurationCircuit(BaseTileEntity tile, ItemStack circuit) { + this(tile.getXCoord(), tile.getYCoord(), tile.getZCoord(), circuit); + } + + public GTPacketSetConfigurationCircuit(int x, short y, int z, ItemStack circuit) { + super(false); + + this.mX = x; + this.mY = y; + this.mZ = z; + + this.circuit = circuit; + } + + @Override + public byte getPacketID() { + return GTPacketTypes.SET_CONFIGURATION_CIRCUIT.id; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + + // no null check needed. ByteBufUtils will handle it + ByteBufUtils.writeItemStack(aOut, this.circuit); + } + + @Override + public void setINetHandler(INetHandler aHandler) { + if (aHandler instanceof NetHandlerPlayServer) { + dimId = ((NetHandlerPlayServer) aHandler).playerEntity.dimension; + } else { + // packet sent to wrong side, so we need to ignore this one + // but there is no way to disrupt packet pipeline + // so we will instead go find world -2, which (hopefully) doesn't exist + // then we will fail silently in process() + dimId = -2; + } + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketSetConfigurationCircuit( + aData.readInt(), + aData.readShort(), + aData.readInt(), + ISerializableObject.readItemStackFromGreggyByteBuf(aData)); + } + + @Override + public void process(IBlockAccess aWorld) { + final World world = DimensionManager.getWorld(dimId); + if (world == null) return; + + final TileEntity tile = world.getTileEntity(mX, mY, mZ); + if (!(tile instanceof BaseTileEntity) || ((BaseTileEntity) tile).isDead()) return; + + final IConfigurationCircuitSupport machine = ((BaseTileEntity) tile).getConfigurationCircuitSupport(); + if (machine == null) return; + if (!machine.allowSelectCircuit()) return; + machine.getConfigurationCircuits() + .stream() + .filter(stack -> GTUtility.areStacksEqual(stack, circuit)) + .findFirst() + .ifPresent(stack -> ((IHasInventory) tile).setInventorySlotContents(machine.getCircuitSlot(), stack)); + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketSound.java b/src/main/java/gregtech/api/net/GTPacketSound.java new file mode 100644 index 0000000000..95f95e641d --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketSound.java @@ -0,0 +1,73 @@ +package gregtech.api.net; + +import java.io.IOException; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufOutputStream; + +public class GTPacketSound extends GTPacketNew { + + private int mX, mZ; + private short mY; + private String mSoundName; + private float mSoundStrength, mSoundPitch; + + public GTPacketSound() { + super(true); + } + + public GTPacketSound(String aSoundName, float aSoundStrength, float aSoundPitch, int aX, short aY, int aZ) { + super(false); + mX = aX; + mY = aY; + mZ = aZ; + mSoundName = aSoundName; + mSoundStrength = aSoundStrength; + mSoundPitch = aSoundPitch; + } + + @Override + public void encode(ByteBuf aOut) { + try (ByteBufOutputStream byteOutputStream = new ByteBufOutputStream(aOut)) { + byteOutputStream.writeUTF(mSoundName); + byteOutputStream.writeFloat(mSoundStrength); + byteOutputStream.writeFloat(mSoundPitch); + byteOutputStream.writeInt(mX); + byteOutputStream.writeShort(mY); + byteOutputStream.writeInt(mZ); + } catch (IOException e) { + // this really shouldn't happen, but whatever + e.printStackTrace(GTLog.err); + } + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketSound( + aData.readUTF(), + aData.readFloat(), + aData.readFloat(), + aData.readInt(), + aData.readShort(), + aData.readInt()); + } + + @Override + public void process(IBlockAccess aWorld) { + if (mSoundName != null) { + GTUtility.doSoundAtClient(new ResourceLocation(mSoundName), 1, mSoundStrength, mSoundPitch, mX, mY, mZ); + } + } + + @Override + public byte getPacketID() { + return GTPacketTypes.SOUND.id; + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketTileEntity.java b/src/main/java/gregtech/api/net/GTPacketTileEntity.java new file mode 100644 index 0000000000..eecb16d6da --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketTileEntity.java @@ -0,0 +1,157 @@ +package gregtech.api.net; + +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.GTMod; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import io.netty.buffer.ByteBuf; + +public class GTPacketTileEntity extends GTPacketNew { + + private int mX, mZ, mC0, mC1, mC2, mC3, mC4, mC5; + private short mY, mID, mRID; + private byte mTexture, mTexturePage, mUpdate, mRedstone, mColor; + + public GTPacketTileEntity() { + super(true); + } + + // For multi tiles + public GTPacketTileEntity(int aX, short aY, int aZ, short aRID, short aID, int aC0, int aC1, int aC2, int aC3, + int aC4, int aC5, byte aTexture, byte aTexturePage, byte aUpdate, byte aRedstone, byte aColor) { + super(false); + mX = aX; + mY = aY; + mZ = aZ; + mC0 = aC0; + mC1 = aC1; + mC2 = aC2; + mC3 = aC3; + mC4 = aC4; + mC5 = aC5; + mRID = aRID; + mID = aID; + mTexture = aTexture; + mTexturePage = aTexturePage; + mUpdate = aUpdate; + mRedstone = aRedstone; + mColor = aColor; + } + + // For meta tiles + public GTPacketTileEntity(int aX, short aY, int aZ, short aID, int aC0, int aC1, int aC2, int aC3, int aC4, int aC5, + byte aTexture, byte aTexturePage, byte aUpdate, byte aRedstone, byte aColor) { + this( + aX, + aY, + aZ, + (short) 0, + aID, + aC0, + aC1, + aC2, + aC3, + aC4, + aC5, + aTexture, + aTexturePage, + aUpdate, + aRedstone, + aColor); + } + + // For pipes + public GTPacketTileEntity(int aX, short aY, int aZ, short aID, int aC0, int aC1, int aC2, int aC3, int aC4, int aC5, + byte aTexture, byte aUpdate, byte aRedstone, byte aColor) { + this(aX, aY, aZ, (short) 0, aID, aC0, aC1, aC2, aC3, aC4, aC5, aTexture, (byte) 0, aUpdate, aRedstone, aColor); + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + + aOut.writeShort(mRID); + aOut.writeShort(mID); + + aOut.writeInt(mC0); + aOut.writeInt(mC1); + aOut.writeInt(mC2); + aOut.writeInt(mC3); + aOut.writeInt(mC4); + aOut.writeInt(mC5); + + aOut.writeByte(mTexture); + aOut.writeByte(mTexturePage); + aOut.writeByte(mUpdate); + aOut.writeByte(mRedstone); + aOut.writeByte(mColor); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketTileEntity( + // Coords + aData.readInt(), + aData.readShort(), + aData.readInt(), + // Registry & ID + aData.readShort(), + aData.readShort(), + // Covers + aData.readInt(), + aData.readInt(), + aData.readInt(), + aData.readInt(), + aData.readInt(), + aData.readInt(), + // Everything else + aData.readByte(), + aData.readByte(), + aData.readByte(), + aData.readByte(), + aData.readByte()); + } + + @Override + public void process(IBlockAccess aWorld) { + if (aWorld == null) return; + final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); + try { + final Block tBlock; + if (tTileEntity instanceof BaseMetaTileEntity) ((BaseMetaTileEntity) tTileEntity).receiveMetaTileEntityData( + mID, + mC0, + mC1, + mC2, + mC3, + mC4, + mC5, + mTexture, + mTexturePage, + mUpdate, + mRedstone, + mColor); + else if (tTileEntity instanceof BaseMetaPipeEntity) ((BaseMetaPipeEntity) tTileEntity) + .receiveMetaTileEntityData(mID, mC0, mC1, mC2, mC3, mC4, mC5, mTexture, mUpdate, mRedstone, mColor); + } catch (Exception e) { + GTMod.GT_FML_LOGGER.error( + "Exception setting tile entity data for tile entity {} at ({}, {}, {})", + tTileEntity, + mX, + mY, + mZ); + } + } + + @Override + public byte getPacketID() { + return GTPacketTypes.TILE_ENTITY.id; + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketToolSwitchMode.java b/src/main/java/gregtech/api/net/GTPacketToolSwitchMode.java new file mode 100644 index 0000000000..57cabcf2bf --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketToolSwitchMode.java @@ -0,0 +1,52 @@ +package gregtech.api.net; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.items.MetaGeneratedTool; +import io.netty.buffer.ByteBuf; + +public class GTPacketToolSwitchMode extends GTPacketNew { + + private EntityPlayerMP player; + + public GTPacketToolSwitchMode() { + super(true); + } + + @Override + public byte getPacketID() { + return GTPacketTypes.TOOL_SWITCH_MODE.id; + } + + @Override + public void encode(ByteBuf aOut) { + + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketToolSwitchMode(); + } + + @Override + public void setINetHandler(INetHandler aHandler) { + player = ((NetHandlerPlayServer) aHandler).playerEntity; + } + + @Override + public void process(IBlockAccess aWorld) { + ItemStack currentItem = player.inventory.getCurrentItem(); + if (currentItem == null || (!(currentItem.getItem() instanceof MetaGeneratedTool item))) return; + byte maxMode = item.getToolMaxMode(currentItem); + if (maxMode <= 1) return; + byte newMode = (byte) ((MetaGeneratedTool.getToolMode(currentItem) + 1) % maxMode); + MetaGeneratedTool.setToolMode(currentItem, newMode); + player.sendSlotContents(player.inventoryContainer, player.inventory.currentItem, currentItem); + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketTypes.java b/src/main/java/gregtech/api/net/GTPacketTypes.java new file mode 100644 index 0000000000..d635706e68 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketTypes.java @@ -0,0 +1,64 @@ +package gregtech.api.net; + +import java.util.Arrays; + +import gregtech.common.blocks.PacketOres; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +/** + * Centralized place to keep all the GT packet ID constants + */ +public enum GTPacketTypes { + + TILE_ENTITY(0, new GTPacketTileEntity()), + SOUND(1, new GTPacketSound()), + BLOCK_EVENT(2, new GTPacketBlockEvent()), + ORES(3, new PacketOres()), + POLLUTION(4, new GTPacketPollution()), + CLIENT_PREFERENCE(9, new GTPacketClientPreference()), + SET_CONFIGURATION_CIRCUIT(12, new GTPacketSetConfigurationCircuit()), + UPDATE_ITEM(13, new GTPacketUpdateItem()), + SEND_COVER_DATA(16, new GTPacketSendCoverData()), + REQUEST_COVER_DATA(17, new GTPacketRequestCoverData()), + MULTI_TILE_ENTITY(18, new GTPacketMultiTileEntity(true)), + SEND_OREGEN_PATTERN(19, new GTPacketSendOregenPattern()), + TOOL_SWITCH_MODE(20, new GTPacketToolSwitchMode()), + MUSIC_SYSTEM_DATA(21, new GTPacketMusicSystemData()), + // merge conflict prevention comment, keep a trailing comma above + ; + + static { + // Validate no duplicate IDs + final GTPacketTypes[] types = values(); + final Int2ObjectOpenHashMap foundIds = new Int2ObjectOpenHashMap<>(types.length); + for (GTPacketTypes type : types) { + final GTPacketNew previous = foundIds.get(type.id); + if (previous != null) { + throw new IllegalStateException( + "Duplicate packet IDs defined: " + type.id + + " for " + + type.getClass() + + " and " + + previous.getClass()); + } + foundIds.put(type.id, type.referencePacket); + } + } + + public final byte id; + public final GTPacketNew referencePacket; + + GTPacketTypes(int id, GTPacketNew referencePacket) { + if (((int) (byte) id) != id) { + throw new IllegalArgumentException("Value outside of byte normal range: " + id); + } + this.id = (byte) id; + this.referencePacket = referencePacket; + } + + public static GTPacketNew[] referencePackets() { + return Arrays.stream(values()) + .map(p -> p.referencePacket) + .toArray(GTPacketNew[]::new); + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketUpdateItem.java b/src/main/java/gregtech/api/net/GTPacketUpdateItem.java new file mode 100644 index 0000000000..54846cdcc9 --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketUpdateItem.java @@ -0,0 +1,64 @@ +package gregtech.api.net; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.common.network.ByteBufUtils; +import gregtech.api.interfaces.INetworkUpdatableItem; +import gregtech.api.util.ISerializableObject; +import io.netty.buffer.ByteBuf; + +/** + * Client -> Server: send arbitrary data to server and update the currently held item. + */ +public class GTPacketUpdateItem extends GTPacketNew { + + private NBTTagCompound tag; + private EntityPlayerMP mPlayer; + + public GTPacketUpdateItem() { + super(true); + } + + public GTPacketUpdateItem(NBTTagCompound tag) { + super(false); + this.tag = tag; + } + + @Override + public byte getPacketID() { + return GTPacketTypes.UPDATE_ITEM.id; + } + + @Override + public void setINetHandler(INetHandler aHandler) { + if (aHandler instanceof NetHandlerPlayServer) { + mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity; + } + } + + @Override + public void encode(ByteBuf aOut) { + ByteBufUtils.writeTag(aOut, tag); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new GTPacketUpdateItem(ISerializableObject.readCompoundTagFromGreggyByteBuf(aData)); + } + + @Override + public void process(IBlockAccess aWorld) { + if (mPlayer == null) return; + ItemStack stack = mPlayer.inventory.getCurrentItem(); + if (stack != null && stack.getItem() instanceof INetworkUpdatableItem) { + ((INetworkUpdatableItem) stack.getItem()).receive(stack, mPlayer, tag); + } + } +} diff --git a/src/main/java/gregtech/api/net/GT_Packet.java b/src/main/java/gregtech/api/net/GT_Packet.java deleted file mode 100644 index d06ea7d0d3..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet.java +++ /dev/null @@ -1,59 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.network.INetHandler; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import io.netty.buffer.ByteBuf; - -/** - * @deprecated Use {@link GT_Packet_New} instead - */ -@Deprecated -public abstract class GT_Packet { - - public GT_Packet(boolean aIsReference) { - // - } - - /** - * I use constant IDs instead of Dynamic ones, since that is much more fail safe - * - * @return a Packet ID for this Class - */ - public abstract byte getPacketID(); - - /** - * @return encoded byte Stream - * @deprecated Use {@link #encode(ByteBuf)} instead - */ - @Deprecated - public abstract byte[] encode(); - - /** - * Encode the data into given byte buffer without creating an intermediate byte array. Default implementation just - * throw {@link UnsupportedOperationException}. - */ - public void encode(ByteBuf aOut) { - throw new UnsupportedOperationException(); - } - - /** - * @return encoded byte Stream - */ - public abstract GT_Packet decode(ByteArrayDataInput aData); - - /** - * Process the packet - * - * @param aWorld null if message is received on server side, the client world if message is received on client side - */ - public abstract void process(IBlockAccess aWorld); - - /** - * This will be called just before {@link #process(IBlockAccess)} to inform the handler about the source and type of - * connection - */ - public void setINetHandler(INetHandler aHandler) {} -} diff --git a/src/main/java/gregtech/api/net/GT_PacketTypes.java b/src/main/java/gregtech/api/net/GT_PacketTypes.java deleted file mode 100644 index 5907b2176b..0000000000 --- a/src/main/java/gregtech/api/net/GT_PacketTypes.java +++ /dev/null @@ -1,64 +0,0 @@ -package gregtech.api.net; - -import java.util.Arrays; - -import gregtech.common.blocks.GT_Packet_Ores; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; - -/** - * Centralized place to keep all the GT packet ID constants - */ -public enum GT_PacketTypes { - - TILE_ENTITY(0, new GT_Packet_TileEntity()), - SOUND(1, new GT_Packet_Sound()), - BLOCK_EVENT(2, new GT_Packet_Block_Event()), - ORES(3, new GT_Packet_Ores()), - POLLUTION(4, new GT_Packet_Pollution()), - CLIENT_PREFERENCE(9, new GT_Packet_ClientPreference()), - SET_CONFIGURATION_CIRCUIT(12, new GT_Packet_SetConfigurationCircuit()), - UPDATE_ITEM(13, new GT_Packet_UpdateItem()), - SEND_COVER_DATA(16, new GT_Packet_SendCoverData()), - REQUEST_COVER_DATA(17, new GT_Packet_RequestCoverData()), - MULTI_TILE_ENTITY(18, new GT_Packet_MultiTileEntity(true)), - SEND_OREGEN_PATTERN(19, new GT_Packet_SendOregenPattern()), - TOOL_SWITCH_MODE(20, new GT_Packet_ToolSwitchMode()), - MUSIC_SYSTEM_DATA(21, new GT_Packet_MusicSystemData()), - // merge conflict prevention comment, keep a trailing comma above - ; - - static { - // Validate no duplicate IDs - final GT_PacketTypes[] types = values(); - final Int2ObjectOpenHashMap foundIds = new Int2ObjectOpenHashMap<>(types.length); - for (GT_PacketTypes type : types) { - final GT_Packet_New previous = foundIds.get(type.id); - if (previous != null) { - throw new IllegalStateException( - "Duplicate packet IDs defined: " + type.id - + " for " - + type.getClass() - + " and " - + previous.getClass()); - } - foundIds.put(type.id, type.referencePacket); - } - } - - public final byte id; - public final GT_Packet_New referencePacket; - - GT_PacketTypes(int id, GT_Packet_New referencePacket) { - if (((int) (byte) id) != id) { - throw new IllegalArgumentException("Value outside of byte normal range: " + id); - } - this.id = (byte) id; - this.referencePacket = referencePacket; - } - - public static GT_Packet_New[] referencePackets() { - return Arrays.stream(values()) - .map(p -> p.referencePacket) - .toArray(GT_Packet_New[]::new); - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java b/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java deleted file mode 100644 index 9adf583698..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java +++ /dev/null @@ -1,63 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import io.netty.buffer.ByteBuf; - -/** - * Used to transfer Block Events in a much better fashion - */ -public class GT_Packet_Block_Event extends GT_Packet_New { - - private int mX, mZ; - private short mY; - private byte mID, mValue; - - public GT_Packet_Block_Event() { - super(true); - } - - public GT_Packet_Block_Event(int aX, short aY, int aZ, byte aID, byte aValue) { - super(false); - mX = aX; - mY = aY; - mZ = aZ; - mID = aID; - mValue = aValue; - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(mX); - aOut.writeShort(mY); - aOut.writeInt(mZ); - aOut.writeByte(mID); - aOut.writeByte(mValue); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_Block_Event( - aData.readInt(), - aData.readShort(), - aData.readInt(), - aData.readByte(), - aData.readByte()); - } - - @Override - public void process(IBlockAccess aWorld) { - if (aWorld != null) { - final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); - if (tTileEntity != null) tTileEntity.receiveClientEvent(mID, mValue); - } - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.BLOCK_EVENT.id; - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java b/src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java deleted file mode 100644 index a5fd8a2e08..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java +++ /dev/null @@ -1,62 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.network.INetHandler; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.GT_Mod; -import gregtech.api.util.GT_ClientPreference; -import io.netty.buffer.ByteBuf; - -public class GT_Packet_ClientPreference extends GT_Packet_New { - - private GT_ClientPreference mPreference; - private EntityPlayerMP mPlayer; - - public GT_Packet_ClientPreference() { - super(true); - } - - public GT_Packet_ClientPreference(GT_ClientPreference mPreference) { - super(false); - this.mPreference = mPreference; - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.CLIENT_PREFERENCE.id; - } - - @Override - public void setINetHandler(INetHandler aHandler) { - if (aHandler instanceof NetHandlerPlayServer) { - mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity; - } - } - - @Override - public void process(IBlockAccess aWorld) { - if (mPlayer != null) GT_Mod.gregtechproxy.setClientPreference(mPlayer.getUniqueID(), mPreference); - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeBoolean(mPreference.isSingleBlockInitialFilterEnabled()); - aOut.writeBoolean(mPreference.isSingleBlockInitialMultiStackEnabled()); - aOut.writeBoolean(mPreference.isInputBusInitialFilterEnabled()); - aOut.writeBoolean(mPreference.isWailaAverageNSEnabled()); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_ClientPreference( - new GT_ClientPreference( - aData.readBoolean(), - aData.readBoolean(), - aData.readBoolean(), - aData.readBoolean())); - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java deleted file mode 100644 index 33cb4f2dcf..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java +++ /dev/null @@ -1,254 +0,0 @@ -package gregtech.api.net; - -import static gregtech.api.enums.GT_Values.B; - -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.net.data.CasingData; -import gregtech.api.net.data.CommonData; -import gregtech.api.net.data.CoordinateData; -import gregtech.api.net.data.MultiTileEntityData; -import gregtech.api.net.data.MultiTileEntityProcess; -import gregtech.api.net.data.PacketData; -import io.netty.buffer.ByteBuf; - -public class GT_Packet_MultiTileEntity extends GT_Packet_New { - - private final Set> data = new HashSet<>(); - public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3], INVENTORY_INDEX = B[4], - INVENTORY_NAME_ID = B[5], BOOLEANS = B[6], SOUND = B[7]; - - public GT_Packet_MultiTileEntity(boolean reference) { - super(reference); - } - - @Override - public void encode(ByteBuf aOut) { - Set> set = data.stream() - .sorted() - .collect( - HashSet>::new, - HashSet>::add, - HashSet>::addAll); - clearData(); - data.addAll(set); - int features = 0; - for (PacketData data : data) { - features |= 1 << data.getId(); - } - - aOut.writeInt(features); - - for (PacketData data : data) { - data.encode(aOut); - } - /* - * TODO Move to new system - * if ((features & COVERS) == COVERS) { - * aOut.writeInt(mC0); - * aOut.writeInt(mC1); - * aOut.writeInt(mC2); - * aOut.writeInt(mC3); - * aOut.writeInt(mC4); - * aOut.writeInt(mC5); - * } - * if ((features & MODES) == MODES) { - * aOut.writeInt(mode); - * aOut.writeInt(allowedModes); - * } - * if ((features & CONTROLLER) == CONTROLLER) { - * aOut.writeInt(mTargetPos.posX); - * aOut.writeShort(mTargetPos.posY); - * aOut.writeInt(mTargetPos.posZ); - * } - * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX) { - * aOut.writeInt(mLockedInventoryIndex); - * } - * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) { - * if (mInventoryName != null && mInventoryName.length() > 0) { - * byte[] bytes = mInventoryName.getBytes(); - * aOut.writeInt(bytes.length); - * aOut.writeBytes(bytes); - * } else { - * aOut.writeInt(0); - * } - * if (inventoryID != null && inventoryID.length() > 0) { - * byte[] bytes = inventoryID.getBytes(); - * aOut.writeInt(bytes.length); - * aOut.writeBytes(bytes); - * } else { - * aOut.writeInt(0); - * } - * } - * if ((features & BOOLEANS) == BOOLEANS) { - * aOut.writeInt(booleans); - * } - * if ((features & SOUND) == SOUND) { - * aOut.writeByte(soundEvent); - * aOut.writeInt(soundEventValue); - * } - */ - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput in) { - Objects.requireNonNull(in); - final int packetFeatures = in.readInt(); - - final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(false); - - if (containsBit(packetFeatures, CoordinateData.COORDINATE_DATA_ID)) { - packet.addData(new CoordinateData()); - } - if (containsBit(packetFeatures, MultiTileEntityData.MULTI_TILE_ENTITY_DATA_ID)) { - packet.addData(new MultiTileEntityData()); - } - if (containsBit(packetFeatures, CommonData.COMMON_DATA_ID)) { - packet.addData(new CommonData()); - } - if (containsBit(packetFeatures, CasingData.CASING_DATA_ID)) { - packet.addData(new CasingData()); - } - - Set> set = packet.data.stream() - .sorted() - .collect( - HashSet>::new, - HashSet>::add, - HashSet>::addAll); - packet.clearData(); - packet.data.addAll(set); - for (PacketData data : packet.data) { - data.decode(in); - } - /* - * if ((packetFeatures & COVERS) == COVERS) { - * packet.setCoverData( - * in.readInt(), - * in.readInt(), - * in.readInt(), - * in.readInt(), - * in.readInt(), - * in.readInt()); - * } - * if ((packetFeatures & INVENTORY_INDEX) == INVENTORY_INDEX) { - * packet.setInventoryIndex(aData.readInt()); - * } - * if ((packetFeatures & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) { - * int nameLength = aData.readInt(); - * String inventoryName; - * if (nameLength > 0) { - * byte[] bytes = new byte[nameLength]; - * for (int i = 0; i < nameLength; i++) { - * bytes[i] = aData.readByte(); - * } - * inventoryName = new String(bytes); - * } else { - * inventoryName = null; - * } - * int idLength = aData.readInt(); - * String inventoryID; - * if (idLength > 0) { - * byte[] bytes = new byte[idLength]; - * for (int i = 0; i < idLength; i++) { - * bytes[i] = aData.readByte(); - * } - * inventoryID = new String(bytes); - * } else { - * inventoryID = null; - * } - * packet.setInventoryName(inventoryName, inventoryID); - * } - * if ((packetFeatures & BOOLEANS) == BOOLEANS) { - * packet.setBooleans(aData.readInt()); - * } - * if ((packetFeatures & SOUND) == SOUND) { - * packet.setSoundEvent(aData.readByte(), aData.readInt()); - * } - */ - return packet; - } - - @Override - public void process(IBlockAccess aWorld) { - if (aWorld == null) return; - MultiTileEntityProcess process = new MultiTileEntityProcess(aWorld); - for (PacketData data : data) { - data.process(process); - } - process.process(); - /* - * final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); - * try { - * final Block tBlock = aWorld.getBlock(mX, mY, mZ); - * if (tBlock instanceof MultiTileEntityBlock mteBlock) { - * final IMultiTileEntity mte = mteBlock.receiveMultiTileEntityData(aWorld, mX, mY, mZ, mRID, mID); - * if (mte == null) return; - * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COMMON_DATA, mCommonData); - * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COLOR, mColor); - * if ((features & COVERS) == COVERS) { - * mteBlock.receiveCoverData(mte, mC0, mC1, mC2, mC3, mC4, mC5); - * } - * if ((features & REDSTONE) == REDSTONE) { - * mte.receiveClientData(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, mRedstone); - * } - * if ((features & MODES) == MODES && mte instanceof IMultiTileEntity.IMTE_HasModes mteModes) { - * mteModes.setMode(mode); - * mteModes.setAllowedModes(allowedModes); - * } - * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID && mte instanceof Inventory invUpg) { - * invUpg.setInventoryName(mInventoryName); - * invUpg.setInventoryId(inventoryID); - * } - * if ((features & CONTROLLER) == CONTROLLER && mte instanceof IMultiBlockPart) { - * final IMultiBlockPart mtePart = (IMultiBlockPart) mte; - * mtePart.setTargetPos(mTargetPos); - * } - * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX && mte instanceof IMultiBlockPart) { - * final IMultiBlockPart mtePart = (IMultiBlockPart) mte; - * mtePart.setLockedInventoryIndex(mLockedInventoryIndex); - * } - * if ((features & BOOLEANS) == BOOLEANS && mte instanceof IMultiTileMachine) { - * final IMultiTileMachine machine = (IMultiTileMachine) mte; - * machine.setBooleans(booleans); - * } - * if ((features & SOUND) == SOUND && mte instanceof IMultiTileMachine) { - * final IMultiTileMachine machine = (IMultiTileMachine) mte; - * machine.setSound(soundEvent, soundEventValue); - * } - * } - * } catch (Exception e) { - * e.printStackTrace(); - * GT_Mod.GT_FML_LOGGER.error( - * "Exception setting tile entity data for tile entity {} at ({}, {}, {})", - * tTileEntity, - * mX, - * mY, - * mZ); - * } - */ - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.MULTI_TILE_ENTITY.id; - } - - public void clearData() { - data.clear(); - } - - public void addData(PacketData data) { - this.data.add(data); - } - - private static boolean containsBit(int toCheck, int bit) { - return (toCheck & (1 << bit)) > 0; - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_MusicSystemData.java b/src/main/java/gregtech/api/net/GT_Packet_MusicSystemData.java deleted file mode 100644 index 13ebf49205..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_MusicSystemData.java +++ /dev/null @@ -1,58 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.util.GT_MusicSystem; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; - -public class GT_Packet_MusicSystemData extends GT_Packet_New { - - ByteBuf storedData; - - public GT_Packet_MusicSystemData() { - super(true); - } - - public GT_Packet_MusicSystemData(ByteBuf data) { - super(false); - this.storedData = data; - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.MUSIC_SYSTEM_DATA.id; - } - - @Override - public void encode(ByteBuf aOut) { - if (storedData == null) { - return; - } - storedData.markReaderIndex(); - final int len = storedData.readableBytes(); - aOut.writeInt(len); - aOut.writeBytes(storedData); - storedData.resetReaderIndex(); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - final int len = aData.readInt(); - final byte[] fullData = new byte[len]; - aData.readFully(fullData); - return new GT_Packet_MusicSystemData(Unpooled.wrappedBuffer(fullData)); - } - - @Override - public void process(IBlockAccess aWorld) { - if (aWorld == null || storedData == null) { - return; - } - storedData.markReaderIndex(); - GT_MusicSystem.ClientSystem.loadUpdatedSources(storedData); - storedData.resetReaderIndex(); - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_New.java b/src/main/java/gregtech/api/net/GT_Packet_New.java deleted file mode 100644 index 41eb1740b3..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_New.java +++ /dev/null @@ -1,30 +0,0 @@ -package gregtech.api.net; - -import com.google.common.io.ByteArrayDataInput; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; - -@SuppressWarnings("deprecation") -public abstract class GT_Packet_New extends GT_Packet { - - public GT_Packet_New(boolean aIsReference) { - super(aIsReference); - } - - @Override - @Deprecated - public final byte[] encode() { - final ByteBuf tOut = Unpooled.buffer(); - encode(tOut); - final byte[] bytes = new byte[tOut.readableBytes()]; - tOut.readBytes(bytes); - return bytes; - } - - @Override - public abstract void encode(ByteBuf aOut); - - @Override - public abstract GT_Packet_New decode(ByteArrayDataInput aData); -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_Pollution.java b/src/main/java/gregtech/api/net/GT_Packet_Pollution.java deleted file mode 100644 index 9b4a367dc4..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_Pollution.java +++ /dev/null @@ -1,47 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.common.GT_Client; -import io.netty.buffer.ByteBuf; - -public class GT_Packet_Pollution extends GT_Packet_New { - - private ChunkCoordIntPair chunk; - private int pollution; - - public GT_Packet_Pollution() { - super(true); - } - - public GT_Packet_Pollution(ChunkCoordIntPair chunk, int pollution) { - super(false); - this.chunk = chunk; - this.pollution = pollution; - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(chunk.chunkXPos) - .writeInt(chunk.chunkZPos) - .writeInt(pollution); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_Pollution(new ChunkCoordIntPair(aData.readInt(), aData.readInt()), aData.readInt()); - } - - @Override - public void process(IBlockAccess aWorld) { - GT_Client.recieveChunkPollutionPacket(chunk, pollution); - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.POLLUTION.id; - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java b/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java deleted file mode 100644 index bca97b69a5..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java +++ /dev/null @@ -1,113 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.network.INetHandler; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.common.covers.CoverInfo; -import io.netty.buffer.ByteBuf; - -/** - * Client -> Server : ask for cover data - */ -public class GT_Packet_RequestCoverData extends GT_Packet_New { - - protected int mX; - protected short mY; - protected int mZ; - - protected ForgeDirection side; - protected int coverID; - - protected EntityPlayerMP mPlayer; - - public GT_Packet_RequestCoverData() { - super(true); - } - - public GT_Packet_RequestCoverData(CoverInfo info, ICoverable tile) { - super(false); - this.mX = tile.getXCoord(); - this.mY = tile.getYCoord(); - this.mZ = tile.getZCoord(); - - this.side = info.getSide(); - this.coverID = info.getCoverID(); - } - - public GT_Packet_RequestCoverData(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID) { - super(false); - this.mX = mX; - this.mY = mY; - this.mZ = mZ; - - this.side = coverSide; - this.coverID = coverID; - } - - public GT_Packet_RequestCoverData(ForgeDirection coverSide, int coverID, ICoverable tile) { - super(false); - this.mX = tile.getXCoord(); - this.mY = tile.getYCoord(); - this.mZ = tile.getZCoord(); - - this.side = coverSide; - this.coverID = coverID; - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.REQUEST_COVER_DATA.id; - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(mX); - aOut.writeShort(mY); - aOut.writeInt(mZ); - - aOut.writeByte(side.ordinal()); - aOut.writeInt(coverID); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_RequestCoverData( - aData.readInt(), - aData.readShort(), - aData.readInt(), - ForgeDirection.getOrientation(aData.readByte()), - aData.readInt()); - } - - @Override - public void setINetHandler(INetHandler aHandler) { - if (aHandler instanceof NetHandlerPlayServer) { - mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity; - } - } - - @Override - public void process(IBlockAccess aWorld) { - // impossible, but who knows - if (mPlayer == null) return; - final World world = DimensionManager.getWorld(mPlayer.dimension); - if (world != null) { - final TileEntity tile = world.getTileEntity(mX, mY, mZ); - if (tile instanceof CoverableTileEntity te) { - if (!te.isDead() && te.getCoverIDAtSide(side) == coverID) { - te.issueCoverUpdate(side); - } - } - } - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java b/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java deleted file mode 100644 index 268aaab803..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java +++ /dev/null @@ -1,107 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.api.util.ISerializableObject; -import gregtech.common.covers.CoverInfo; -import io.netty.buffer.ByteBuf; - -/** - * Server -> Client : Update cover data - */ -public class GT_Packet_SendCoverData extends GT_Packet_New { - - protected int mX; - protected short mY; - protected int mZ; - - protected ForgeDirection side; - protected int coverID; - protected ISerializableObject coverData; - - public GT_Packet_SendCoverData() { - super(true); - } - - public GT_Packet_SendCoverData(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID, - ISerializableObject coverData) { - super(false); - this.mX = mX; - this.mY = mY; - this.mZ = mZ; - - this.side = coverSide; - this.coverID = coverID; - this.coverData = coverData; - } - - public GT_Packet_SendCoverData(CoverInfo info, ICoverable tile) { - super(false); - this.mX = tile.getXCoord(); - this.mY = tile.getYCoord(); - this.mZ = tile.getZCoord(); - - this.side = info.getSide(); - this.coverID = info.getCoverID(); - this.coverData = info.getCoverData(); - } - - public GT_Packet_SendCoverData(ForgeDirection coverSide, int coverID, ISerializableObject coverData, - ICoverable tile) { - super(false); - this.mX = tile.getXCoord(); - this.mY = tile.getYCoord(); - this.mZ = tile.getZCoord(); - - this.side = coverSide; - this.coverID = coverID; - this.coverData = coverData; - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.SEND_COVER_DATA.id; - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(mX); - aOut.writeShort(mY); - aOut.writeInt(mZ); - - aOut.writeByte(side.ordinal()); - aOut.writeInt(coverID); - coverData.writeToByteBuf(aOut); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - final int coverId; - return new GT_Packet_SendCoverData( - aData.readInt(), - aData.readShort(), - aData.readInt(), - ForgeDirection.getOrientation(aData.readByte()), - coverId = aData.readInt(), - GregTech_API.getCoverBehaviorNew(coverId) - .createDataObject() - .readFromPacket(aData, null)); - } - - @Override - public void process(IBlockAccess aWorld) { - if (aWorld != null) { - final TileEntity tile = aWorld.getTileEntity(mX, mY, mZ); - if (tile instanceof CoverableTileEntity coverable && !coverable.isDead()) { - coverable.receiveCoverData(side, coverID, coverData, null); - } - } - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java b/src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java deleted file mode 100644 index 8213ee9c71..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java +++ /dev/null @@ -1,56 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.util.GT_Log; -import gregtech.common.GT_Worldgenerator; -import gregtech.common.GT_Worldgenerator.OregenPattern; -import io.netty.buffer.ByteBuf; - -public class GT_Packet_SendOregenPattern extends GT_Packet_New { - - protected OregenPattern pattern = OregenPattern.AXISSYMMETRICAL; - - public GT_Packet_SendOregenPattern() { - super(true); - } - - public GT_Packet_SendOregenPattern(OregenPattern pattern) { - super(false); - this.pattern = pattern; - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(this.pattern.ordinal()); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - int ordinal = aData.readInt(); - // make sure we get valid data: - if (ordinal >= 0 && ordinal < OregenPattern.values().length) { - return new GT_Packet_SendOregenPattern(OregenPattern.values()[ordinal]); - } - // invalid data, default to AXISSYMMETRICAL: - GT_Log.err.println( - String.format( - "Received invalid data! Received %d but value must be between 0 and %d! Default (0) will be used.", - ordinal, - OregenPattern.values().length - 1)); - return new GT_Packet_SendOregenPattern(); - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.SEND_OREGEN_PATTERN.id; - } - - @Override - public void process(IBlockAccess aWorld) { - GT_Worldgenerator.oregenPattern = this.pattern; - } - -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java b/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java deleted file mode 100644 index 2bfdbca9d2..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java +++ /dev/null @@ -1,110 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.item.ItemStack; -import net.minecraft.network.INetHandler; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; - -import com.google.common.io.ByteArrayDataInput; - -import cpw.mods.fml.common.network.ByteBufUtils; -import gregtech.api.interfaces.IConfigurationCircuitSupport; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IHasInventory; -import gregtech.api.metatileentity.BaseTileEntity; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import io.netty.buffer.ByteBuf; - -/** - * Client -> Server: Update machine configuration data - */ -public class GT_Packet_SetConfigurationCircuit extends GT_Packet_New { - - protected int mX; - protected short mY; - protected int mZ; - protected int dimId; - - protected ItemStack circuit; - - public GT_Packet_SetConfigurationCircuit() { - super(true); - } - - public GT_Packet_SetConfigurationCircuit(IGregTechTileEntity tile, ItemStack circuit) { - this(tile.getXCoord(), tile.getYCoord(), tile.getZCoord(), circuit); - } - - public GT_Packet_SetConfigurationCircuit(BaseTileEntity tile, ItemStack circuit) { - this(tile.getXCoord(), tile.getYCoord(), tile.getZCoord(), circuit); - } - - public GT_Packet_SetConfigurationCircuit(int x, short y, int z, ItemStack circuit) { - super(false); - - this.mX = x; - this.mY = y; - this.mZ = z; - - this.circuit = circuit; - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.SET_CONFIGURATION_CIRCUIT.id; - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(mX); - aOut.writeShort(mY); - aOut.writeInt(mZ); - - // no null check needed. ByteBufUtils will handle it - ByteBufUtils.writeItemStack(aOut, this.circuit); - } - - @Override - public void setINetHandler(INetHandler aHandler) { - if (aHandler instanceof NetHandlerPlayServer) { - dimId = ((NetHandlerPlayServer) aHandler).playerEntity.dimension; - } else { - // packet sent to wrong side, so we need to ignore this one - // but there is no way to disrupt packet pipeline - // so we will instead go find world -2, which (hopefully) doesn't exist - // then we will fail silently in process() - dimId = -2; - } - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_SetConfigurationCircuit( - aData.readInt(), - aData.readShort(), - aData.readInt(), - ISerializableObject.readItemStackFromGreggyByteBuf(aData)); - } - - @Override - public void process(IBlockAccess aWorld) { - final World world = DimensionManager.getWorld(dimId); - if (world == null) return; - - final TileEntity tile = world.getTileEntity(mX, mY, mZ); - if (!(tile instanceof BaseTileEntity) || ((BaseTileEntity) tile).isDead()) return; - - final IConfigurationCircuitSupport machine = ((BaseTileEntity) tile).getConfigurationCircuitSupport(); - if (machine == null) return; - if (!machine.allowSelectCircuit()) return; - machine.getConfigurationCircuits() - .stream() - .filter(stack -> GT_Utility.areStacksEqual(stack, circuit)) - .findFirst() - .ifPresent(stack -> ((IHasInventory) tile).setInventorySlotContents(machine.getCircuitSlot(), stack)); - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_Sound.java b/src/main/java/gregtech/api/net/GT_Packet_Sound.java deleted file mode 100644 index 93bfdfd3aa..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_Sound.java +++ /dev/null @@ -1,73 +0,0 @@ -package gregtech.api.net; - -import java.io.IOException; - -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufOutputStream; - -public class GT_Packet_Sound extends GT_Packet_New { - - private int mX, mZ; - private short mY; - private String mSoundName; - private float mSoundStrength, mSoundPitch; - - public GT_Packet_Sound() { - super(true); - } - - public GT_Packet_Sound(String aSoundName, float aSoundStrength, float aSoundPitch, int aX, short aY, int aZ) { - super(false); - mX = aX; - mY = aY; - mZ = aZ; - mSoundName = aSoundName; - mSoundStrength = aSoundStrength; - mSoundPitch = aSoundPitch; - } - - @Override - public void encode(ByteBuf aOut) { - try (ByteBufOutputStream byteOutputStream = new ByteBufOutputStream(aOut)) { - byteOutputStream.writeUTF(mSoundName); - byteOutputStream.writeFloat(mSoundStrength); - byteOutputStream.writeFloat(mSoundPitch); - byteOutputStream.writeInt(mX); - byteOutputStream.writeShort(mY); - byteOutputStream.writeInt(mZ); - } catch (IOException e) { - // this really shouldn't happen, but whatever - e.printStackTrace(GT_Log.err); - } - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_Sound( - aData.readUTF(), - aData.readFloat(), - aData.readFloat(), - aData.readInt(), - aData.readShort(), - aData.readInt()); - } - - @Override - public void process(IBlockAccess aWorld) { - if (mSoundName != null) { - GT_Utility.doSoundAtClient(new ResourceLocation(mSoundName), 1, mSoundStrength, mSoundPitch, mX, mY, mZ); - } - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.SOUND.id; - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java deleted file mode 100644 index b07277dc00..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java +++ /dev/null @@ -1,157 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.block.Block; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.GT_Mod; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import io.netty.buffer.ByteBuf; - -public class GT_Packet_TileEntity extends GT_Packet_New { - - private int mX, mZ, mC0, mC1, mC2, mC3, mC4, mC5; - private short mY, mID, mRID; - private byte mTexture, mTexturePage, mUpdate, mRedstone, mColor; - - public GT_Packet_TileEntity() { - super(true); - } - - // For multi tiles - public GT_Packet_TileEntity(int aX, short aY, int aZ, short aRID, short aID, int aC0, int aC1, int aC2, int aC3, - int aC4, int aC5, byte aTexture, byte aTexturePage, byte aUpdate, byte aRedstone, byte aColor) { - super(false); - mX = aX; - mY = aY; - mZ = aZ; - mC0 = aC0; - mC1 = aC1; - mC2 = aC2; - mC3 = aC3; - mC4 = aC4; - mC5 = aC5; - mRID = aRID; - mID = aID; - mTexture = aTexture; - mTexturePage = aTexturePage; - mUpdate = aUpdate; - mRedstone = aRedstone; - mColor = aColor; - } - - // For meta tiles - public GT_Packet_TileEntity(int aX, short aY, int aZ, short aID, int aC0, int aC1, int aC2, int aC3, int aC4, - int aC5, byte aTexture, byte aTexturePage, byte aUpdate, byte aRedstone, byte aColor) { - this( - aX, - aY, - aZ, - (short) 0, - aID, - aC0, - aC1, - aC2, - aC3, - aC4, - aC5, - aTexture, - aTexturePage, - aUpdate, - aRedstone, - aColor); - } - - // For pipes - public GT_Packet_TileEntity(int aX, short aY, int aZ, short aID, int aC0, int aC1, int aC2, int aC3, int aC4, - int aC5, byte aTexture, byte aUpdate, byte aRedstone, byte aColor) { - this(aX, aY, aZ, (short) 0, aID, aC0, aC1, aC2, aC3, aC4, aC5, aTexture, (byte) 0, aUpdate, aRedstone, aColor); - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(mX); - aOut.writeShort(mY); - aOut.writeInt(mZ); - - aOut.writeShort(mRID); - aOut.writeShort(mID); - - aOut.writeInt(mC0); - aOut.writeInt(mC1); - aOut.writeInt(mC2); - aOut.writeInt(mC3); - aOut.writeInt(mC4); - aOut.writeInt(mC5); - - aOut.writeByte(mTexture); - aOut.writeByte(mTexturePage); - aOut.writeByte(mUpdate); - aOut.writeByte(mRedstone); - aOut.writeByte(mColor); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_TileEntity( - // Coords - aData.readInt(), - aData.readShort(), - aData.readInt(), - // Registry & ID - aData.readShort(), - aData.readShort(), - // Covers - aData.readInt(), - aData.readInt(), - aData.readInt(), - aData.readInt(), - aData.readInt(), - aData.readInt(), - // Everything else - aData.readByte(), - aData.readByte(), - aData.readByte(), - aData.readByte(), - aData.readByte()); - } - - @Override - public void process(IBlockAccess aWorld) { - if (aWorld == null) return; - final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); - try { - final Block tBlock; - if (tTileEntity instanceof BaseMetaTileEntity) ((BaseMetaTileEntity) tTileEntity).receiveMetaTileEntityData( - mID, - mC0, - mC1, - mC2, - mC3, - mC4, - mC5, - mTexture, - mTexturePage, - mUpdate, - mRedstone, - mColor); - else if (tTileEntity instanceof BaseMetaPipeEntity) ((BaseMetaPipeEntity) tTileEntity) - .receiveMetaTileEntityData(mID, mC0, mC1, mC2, mC3, mC4, mC5, mTexture, mUpdate, mRedstone, mColor); - } catch (Exception e) { - GT_Mod.GT_FML_LOGGER.error( - "Exception setting tile entity data for tile entity {} at ({}, {}, {})", - tTileEntity, - mX, - mY, - mZ); - } - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.TILE_ENTITY.id; - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_ToolSwitchMode.java b/src/main/java/gregtech/api/net/GT_Packet_ToolSwitchMode.java deleted file mode 100644 index c7984d7434..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_ToolSwitchMode.java +++ /dev/null @@ -1,52 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.network.INetHandler; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.items.GT_MetaGenerated_Tool; -import io.netty.buffer.ByteBuf; - -public class GT_Packet_ToolSwitchMode extends GT_Packet_New { - - private EntityPlayerMP player; - - public GT_Packet_ToolSwitchMode() { - super(true); - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.TOOL_SWITCH_MODE.id; - } - - @Override - public void encode(ByteBuf aOut) { - - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_ToolSwitchMode(); - } - - @Override - public void setINetHandler(INetHandler aHandler) { - player = ((NetHandlerPlayServer) aHandler).playerEntity; - } - - @Override - public void process(IBlockAccess aWorld) { - ItemStack currentItem = player.inventory.getCurrentItem(); - if (currentItem == null || (!(currentItem.getItem() instanceof GT_MetaGenerated_Tool item))) return; - byte maxMode = item.getToolMaxMode(currentItem); - if (maxMode <= 1) return; - byte newMode = (byte) ((GT_MetaGenerated_Tool.getToolMode(currentItem) + 1) % maxMode); - GT_MetaGenerated_Tool.setToolMode(currentItem, newMode); - player.sendSlotContents(player.inventoryContainer, player.inventory.currentItem, currentItem); - } -} diff --git a/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java b/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java deleted file mode 100644 index 1b8a453234..0000000000 --- a/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java +++ /dev/null @@ -1,64 +0,0 @@ -package gregtech.api.net; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.INetHandler; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.world.IBlockAccess; - -import com.google.common.io.ByteArrayDataInput; - -import cpw.mods.fml.common.network.ByteBufUtils; -import gregtech.api.interfaces.INetworkUpdatableItem; -import gregtech.api.util.ISerializableObject; -import io.netty.buffer.ByteBuf; - -/** - * Client -> Server: send arbitrary data to server and update the currently held item. - */ -public class GT_Packet_UpdateItem extends GT_Packet_New { - - private NBTTagCompound tag; - private EntityPlayerMP mPlayer; - - public GT_Packet_UpdateItem() { - super(true); - } - - public GT_Packet_UpdateItem(NBTTagCompound tag) { - super(false); - this.tag = tag; - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.UPDATE_ITEM.id; - } - - @Override - public void setINetHandler(INetHandler aHandler) { - if (aHandler instanceof NetHandlerPlayServer) { - mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity; - } - } - - @Override - public void encode(ByteBuf aOut) { - ByteBufUtils.writeTag(aOut, tag); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_UpdateItem(ISerializableObject.readCompoundTagFromGreggyByteBuf(aData)); - } - - @Override - public void process(IBlockAccess aWorld) { - if (mPlayer == null) return; - ItemStack stack = mPlayer.inventory.getCurrentItem(); - if (stack != null && stack.getItem() instanceof INetworkUpdatableItem) { - ((INetworkUpdatableItem) stack.getItem()).receive(stack, mPlayer, tag); - } - } -} diff --git a/src/main/java/gregtech/api/net/IGT_NetworkHandler.java b/src/main/java/gregtech/api/net/IGT_NetworkHandler.java index 8436a89e9b..3569317b01 100644 --- a/src/main/java/gregtech/api/net/IGT_NetworkHandler.java +++ b/src/main/java/gregtech/api/net/IGT_NetworkHandler.java @@ -8,15 +8,15 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @SuppressWarnings("deprecation") public interface IGT_NetworkHandler { - void sendToPlayer(GT_Packet aPacket, EntityPlayerMP aPlayer); + void sendToPlayer(GTPacket aPacket, EntityPlayerMP aPlayer); - void sendToAllAround(GT_Packet aPacket, TargetPoint aPosition); + void sendToAllAround(GTPacket aPacket, TargetPoint aPosition); - default void sendToAll(GT_Packet aPacket) { + default void sendToAll(GTPacket aPacket) { throw new UnsupportedOperationException("sendToAll not implemented"); } - void sendToServer(GT_Packet aPacket); + void sendToServer(GTPacket aPacket); - void sendPacketToAllPlayersInRange(World aWorld, GT_Packet aPacket, int aX, int aZ); + void sendPacketToAllPlayersInRange(World aWorld, GTPacket aPacket, int aX, int aZ); } diff --git a/src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java b/src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java index c2e0556de9..3ede25f5ea 100644 --- a/src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java +++ b/src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java @@ -4,7 +4,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase; +import gregtech.common.tileentities.storage.MTEDigitalChestBase; public class AE2DigitalChestHandler implements appeng.api.storage.IExternalStorageHandler { @@ -12,14 +12,14 @@ public class AE2DigitalChestHandler implements appeng.api.storage.IExternalStora public boolean canHandle(final TileEntity te, final ForgeDirection d, final appeng.api.storage.StorageChannel chan, final appeng.api.networking.security.BaseActionSource mySrc) { return chan == appeng.api.storage.StorageChannel.ITEMS && te instanceof BaseMetaTileEntity - && ((BaseMetaTileEntity) te).getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase; + && ((BaseMetaTileEntity) te).getMetaTileEntity() instanceof MTEDigitalChestBase; } @Override public appeng.api.storage.IMEInventory getInventory(final TileEntity te, final ForgeDirection d, final appeng.api.storage.StorageChannel chan, final appeng.api.networking.security.BaseActionSource src) { if (chan == appeng.api.storage.StorageChannel.ITEMS) { - return ((GT_MetaTileEntity_DigitalChestBase) (((BaseMetaTileEntity) te).getMetaTileEntity())); + return ((MTEDigitalChestBase) (((BaseMetaTileEntity) te).getMetaTileEntity())); } return null; } diff --git a/src/main/java/gregtech/api/objects/GTArrayList.java b/src/main/java/gregtech/api/objects/GTArrayList.java new file mode 100644 index 0000000000..33fbb18571 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTArrayList.java @@ -0,0 +1,73 @@ +package gregtech.api.objects; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Objects; + +import com.google.common.collect.Collections2; + +public class GTArrayList extends ArrayList { + + private static final long serialVersionUID = 1L; + private int size_sS; + + private final boolean mAllowNulls; + + public GTArrayList(boolean aAllowNulls, int aCapacity) { + super(aCapacity); + mAllowNulls = aAllowNulls; + } + + @SafeVarargs + public GTArrayList(boolean aAllowNulls, E... aArray) { + super(Arrays.asList(aArray)); + mAllowNulls = aAllowNulls; + if (!mAllowNulls) { + size_sS = size(); + for (int i = 0; i < size_sS; i++) if (get(i) == null) { + remove(i--); + size_sS = size(); + } + } + } + + public GTArrayList(boolean aAllowNulls, Collection aList) { + super(aList); + mAllowNulls = aAllowNulls; + if (!mAllowNulls) { + size_sS = size(); + for (int i = 0; i < size_sS; i++) if (get(i) == null) { + remove(i--); + size_sS = size(); + } + } + } + + @Override + public E set(int aIndex, E aElement) { + if (mAllowNulls || aElement != null) return super.set(aIndex, aElement); + return null; + } + + @Override + public boolean add(E aElement) { + if (mAllowNulls || aElement != null) return super.add(aElement); + return false; + } + + @Override + public void add(int aIndex, E aElement) { + if (mAllowNulls || aElement != null) super.add(aIndex, aElement); + } + + @Override + public boolean addAll(Collection aList) { + return super.addAll(Collections2.filter(aList, Objects::nonNull)); + } + + @Override + public boolean addAll(int aIndex, Collection aList) { + return super.addAll(aIndex, Collections2.filter(aList, Objects::nonNull)); + } +} diff --git a/src/main/java/gregtech/api/objects/GTChunkManager.java b/src/main/java/gregtech/api/objects/GTChunkManager.java new file mode 100644 index 0000000000..59bc90aa1c --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTChunkManager.java @@ -0,0 +1,204 @@ +package gregtech.api.objects; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; + +import gregtech.GTMod; +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.IChunkLoader; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTLog; + +/** + * Handles re-initialization of chunks after a server restart. + */ +public class GTChunkManager + implements ForgeChunkManager.OrderedLoadingCallback, ForgeChunkManager.PlayerOrderedLoadingCallback { + + private final Map registeredTickets = new HashMap<>(); + public static GTChunkManager instance = new GTChunkManager(); + + public static void init() { + ForgeChunkManager.setForcedChunkLoadingCallback(GTMod.instance, instance); + } + + @Override + public void ticketsLoaded(List tickets, World world) {} + + /** + * Determines if tickets should be kept. Based on if the ticket is a machine or a working-chunk ticket. + * Working-chunk tickets are tossed and recreated when the machine reactivates. + * Machine tickets are kept only if the config {@code alwaysReloadChunkloaders} is true. + * Otherwise, machine chunks are tossed and recreated only when the machine reactivates, + * similarly to a Passive Anchor. + * + * @param tickets The tickets that you will want to select from. + * The list is immutable and cannot be manipulated directly. Copy it first. + * @param world The world + * @param maxTicketCount The maximum number of tickets that will be allowed. + * @return list of tickets + */ + + @Override + public List ticketsLoaded(List tickets, World world, int maxTicketCount) { + List validTickets = new ArrayList<>(); + if (GTValues.alwaysReloadChunkloaders) { + for (Ticket ticket : tickets) { + int x = ticket.getModData() + .getInteger("OwnerX"); + int y = ticket.getModData() + .getInteger("OwnerY"); + int z = ticket.getModData() + .getInteger("OwnerZ"); + if (y > 0) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof IGregTechTileEntity && ((IGregTechTileEntity) tile).isAllowedToWork()) { + ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(x >> 4, z >> 4)); + if (!registeredTickets.containsKey(tile)) { + registeredTickets.put(tile, ticket); + if (((IGregTechTileEntity) tile).getMetaTileEntity() instanceof IChunkLoader) + ForgeChunkManager.forceChunk( + ticket, + ((IChunkLoader) ((IGregTechTileEntity) tile).getMetaTileEntity()).getActiveChunk()); + validTickets.add(ticket); + } + } + } + } + } + return validTickets; + } + + /** + * Determines if player tickets should be kept. This is where a ticket list per-player would be created and + * maintained. When a player joins, an event occurs, their name/UUID/etc is compared against tickets on this list + * and those tickets are reactivated. + * Since that info would be maintained/dealt with on a per-player startup, the list returned back to Forge is empty. + * + * @param tickets The tickets that you will want to select from. + * The list is immutable and cannot be manipulated directly. Copy it first. + * @param world The world + * @return the list of string-ticket paris + */ + @Override + public ListMultimap playerTicketsLoaded(ListMultimap tickets, World world) { + // Not currently used, so just return an empty list. + return ArrayListMultimap.create(); + } + + /** + * Requests a chunk to be loaded for this machine. May pass a {@code null} chunk to load just the machine itself if + * {@code alwaysReloadChunkloaders} is enabled in config. + * + * @param owner owner of the TileEntity + * @param chunkXZ chunk coordinates + * @param player player + * @return if the chunk was loaded successfully + */ + public static boolean requestPlayerChunkLoad(TileEntity owner, ChunkCoordIntPair chunkXZ, String player) { + if (!GTValues.enableChunkloaders) return false; + if (!GTValues.alwaysReloadChunkloaders && chunkXZ == null) return false; + if (GTValues.debugChunkloaders && chunkXZ != null) + GTLog.out.println("GT_ChunkManager: Chunk request: (" + chunkXZ.chunkXPos + ", " + chunkXZ.chunkZPos + ")"); + if (instance.registeredTickets.containsKey(owner)) { + ForgeChunkManager.forceChunk(instance.registeredTickets.get(owner), chunkXZ); + } else { + Ticket ticket; + if (player.equals("")) ticket = ForgeChunkManager + .requestTicket(GTMod.instance, owner.getWorldObj(), ForgeChunkManager.Type.NORMAL); + else ticket = ForgeChunkManager + .requestPlayerTicket(GTMod.instance, player, owner.getWorldObj(), ForgeChunkManager.Type.NORMAL); + if (ticket == null) { + if (GTValues.debugChunkloaders) + GTLog.out.println("GT_ChunkManager: ForgeChunkManager.requestTicket failed"); + return false; + } + if (GTValues.debugChunkloaders) GTLog.out.println( + "GT_ChunkManager: ticket issued for machine at: (" + owner.xCoord + + ", " + + owner.yCoord + + ", " + + owner.zCoord + + ")"); + NBTTagCompound tag = ticket.getModData(); + tag.setInteger("OwnerX", owner.xCoord); + tag.setInteger("OwnerY", owner.yCoord); + tag.setInteger("OwnerZ", owner.zCoord); + ForgeChunkManager.forceChunk(ticket, chunkXZ); + if (GTValues.alwaysReloadChunkloaders) + ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(owner.xCoord >> 4, owner.zCoord >> 4)); + instance.registeredTickets.put(owner, ticket); + } + return true; + } + + @SuppressWarnings("UnusedReturnValue") + public static boolean requestChunkLoad(TileEntity owner, ChunkCoordIntPair chunkXZ) { + return requestPlayerChunkLoad(owner, chunkXZ, ""); + } + + public static void releaseChunk(TileEntity owner, ChunkCoordIntPair chunkXZ) { + if (!GTValues.enableChunkloaders) return; + Ticket ticket = instance.registeredTickets.get(owner); + if (ticket != null) { + if (GTValues.debugChunkloaders) GTLog.out + .println("GT_ChunkManager: Chunk release: (" + chunkXZ.chunkXPos + ", " + chunkXZ.chunkZPos + ")"); + ForgeChunkManager.unforceChunk(ticket, chunkXZ); + } + } + + public static void releaseTicket(TileEntity owner) { + if (!GTValues.enableChunkloaders) return; + Ticket ticket = instance.registeredTickets.get(owner); + if (ticket != null) { + if (GTValues.debugChunkloaders) { + GTLog.out.println( + "GT_ChunkManager: ticket released by machine at: (" + owner.xCoord + + ", " + + owner.yCoord + + ", " + + owner.zCoord + + ")"); + for (ChunkCoordIntPair chunk : ticket.getChunkList()) GTLog.out + .println("GT_ChunkManager: Chunk release: (" + chunk.chunkXPos + ", " + chunk.chunkZPos + ")"); + } + ForgeChunkManager.releaseTicket(ticket); + instance.registeredTickets.remove(owner); + } + } + + public static void printTickets() { + GTLog.out.println("GT_ChunkManager: Start forced chunks dump:"); + instance.registeredTickets.forEach((machine, ticket) -> { + GTLog.out.print( + "GT_ChunkManager: Chunks forced by the machine at (" + machine.xCoord + + ", " + + machine.yCoord + + ", " + + machine.zCoord + + ")"); + if (ticket.isPlayerTicket()) GTLog.out.print(" Owner: " + ticket.getPlayerName()); + GTLog.out.print(" :"); + for (ChunkCoordIntPair c : ticket.getChunkList()) { + GTLog.out.print("("); + GTLog.out.print(c.chunkXPos); + GTLog.out.print(", "); + GTLog.out.print(c.chunkZPos); + GTLog.out.print("), "); + } + }); + GTLog.out.println("GT_ChunkManager: End forced chunks dump:"); + } +} diff --git a/src/main/java/gregtech/api/objects/GTCopiedBlockTexture.java b/src/main/java/gregtech/api/objects/GTCopiedBlockTexture.java new file mode 100644 index 0000000000..79be90c3b6 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTCopiedBlockTexture.java @@ -0,0 +1,36 @@ +package gregtech.api.objects; + +import net.minecraft.block.Block; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.ITexture; +import gregtech.common.render.GTCopiedBlockTextureRender; + +/** + * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. + */ +@Deprecated +public class GTCopiedBlockTexture extends GTCopiedBlockTextureRender implements ITexture { + + // Backwards Compat + @Deprecated + public short[] mRGBa; + + public GTCopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean aAllowAlpha) { + super(aBlock, ordinalSide, aMeta, aRGBa, aAllowAlpha); + GTCopiedBlockTexture.this.mRGBa = aRGBa; + } + + public GTCopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa) { + this(aBlock, ordinalSide, aMeta, aRGBa, true); + } + + public GTCopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta) { + this(aBlock, ordinalSide, aMeta, Dyes._NULL.mRGBa); + } + + @Override + public boolean isOldTexture() { + return true; + } +} diff --git a/src/main/java/gregtech/api/objects/GTCoverDefault.java b/src/main/java/gregtech/api/objects/GTCoverDefault.java new file mode 100644 index 0000000000..6e9664c355 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTCoverDefault.java @@ -0,0 +1,81 @@ +package gregtech.api.objects; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; + +public class GTCoverDefault extends CoverBehavior { + + /** + * This is the Dummy, if there is a generic Cover without behavior + */ + public GTCoverDefault() { + super(); + } + + @Override + public boolean isSimpleCover() { + return true; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = ((aCoverVariable + 1) & 15); + GTUtility.sendChatToPlayer( + aPlayer, + ((aCoverVariable & 1) != 0 ? GTUtility.trans("128.1", "Redstone ") : "") + + ((aCoverVariable & 2) != 0 ? GTUtility.trans("129.1", "Energy ") : "") + + ((aCoverVariable & 4) != 0 ? GTUtility.trans("130.1", "Fluids ") : "") + + ((aCoverVariable & 8) != 0 ? GTUtility.trans("131.1", "Items ") : "")); + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return (aCoverVariable & 1) != 0; + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return (aCoverVariable & 1) != 0; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return (aCoverVariable & 2) != 0; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return (aCoverVariable & 2) != 0; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return (aCoverVariable & 4) != 0; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return (aCoverVariable & 4) != 0; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return (aCoverVariable & 8) != 0; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return (aCoverVariable & 8) != 0; + } +} diff --git a/src/main/java/gregtech/api/objects/GTCoverNone.java b/src/main/java/gregtech/api/objects/GTCoverNone.java new file mode 100644 index 0000000000..2c07538186 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTCoverNone.java @@ -0,0 +1,237 @@ +package gregtech.api.objects; + +import static gregtech.api.enums.GTValues.E; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.ISerializableObject; + +public class GTCoverNone extends CoverBehavior { + + /** + * This is the Dummy, if there is no Cover + */ + public GTCoverNone() {} + + @Override + public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 10.0F; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + @Override + public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + return false; + } + + @Override + public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + return true; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return 0; + } + + @Override + public boolean isSimpleCover() { + return true; + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + return false; + } + + @Override + protected ISerializableObject.LegacyCoverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, + int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + return aCoverVariable; + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + return false; + } + + @Override + protected ISerializableObject.LegacyCoverData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + return aCoverVariable; + } + + @Override + protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer) { + return false; + } + + @Override + protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, boolean aForced) { + return true; + } + + @Override + protected String getDescriptionImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return E; + } + + @Override + protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return 10.0F; + } + + @Override + protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return aInputRedstone; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, + ICoverable aTileEntity) { + return 0; + } + + @Override + protected byte getLensColorImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return -1; + } + + @Override + protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return null; + } +} diff --git a/src/main/java/gregtech/api/objects/GTFluid.java b/src/main/java/gregtech/api/objects/GTFluid.java new file mode 100644 index 0000000000..9ffeac5b8f --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTFluid.java @@ -0,0 +1,36 @@ +package gregtech.api.objects; + +import static gregtech.api.enums.Mods.GregTech; + +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.GregTechAPI; +import gregtech.api.fluid.GTFluidFactory; + +/** + * @deprecated use {@link GTFluidFactory#builder} + */ +@Deprecated +public class GTFluid extends Fluid implements Runnable { + + public final String mTextureName; + private final short[] mRGBa; + + public GTFluid(String aName, String aTextureName, short[] aRGBa) { + super(aName); + mRGBa = aRGBa; + mTextureName = aTextureName; + GregTechAPI.sGTBlockIconload.add(this); + } + + @Override + public int getColor() { + return (Math.max(0, Math.min(255, mRGBa[0])) << 16) | (Math.max(0, Math.min(255, mRGBa[1])) << 8) + | Math.max(0, Math.min(255, mRGBa[2])); + } + + @Override + public void run() { + setIcons(GregTechAPI.sBlockIcons.registerIcon(GregTech.getResourcePath("fluids", "fluid." + mTextureName))); + } +} diff --git a/src/main/java/gregtech/api/objects/GTHashSet.java b/src/main/java/gregtech/api/objects/GTHashSet.java new file mode 100644 index 0000000000..df012c05f7 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTHashSet.java @@ -0,0 +1,91 @@ +package gregtech.api.objects; + +import java.util.AbstractSet; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.util.GTUtility; + +public class GTHashSet extends AbstractSet { + + private static final Object OBJECT = new Object(); + private final transient HashMap map; + + public GTHashSet() { + map = new HashMap<>(); + GregTechAPI.sItemStackMappings.add(map); + } + + public GTHashSet(Collection c) { + map = new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16)); + addAll(c); + GregTechAPI.sItemStackMappings.add(map); + } + + public GTHashSet(int initialCapacity, float loadFactor) { + map = new HashMap<>(initialCapacity, loadFactor); + GregTechAPI.sItemStackMappings.add(map); + } + + public GTHashSet(int initialCapacity) { + map = new HashMap<>(initialCapacity); + GregTechAPI.sItemStackMappings.add(map); + } + + GTHashSet(int initialCapacity, float loadFactor, boolean dummy) { + map = new LinkedHashMap<>(initialCapacity, loadFactor); + GregTechAPI.sItemStackMappings.add(map); + } + + public Map getMap() { + return map; + } + + @SuppressWarnings("unchecked") // The downcasting below will throw ClassCastException unless E is GT_ItemStack. + @Override + public Iterator iterator() { + return (Iterator) map.keySet() + .iterator(); + } + + @Override + public int size() { + return map.size(); + } + + @Override + public boolean isEmpty() { + return map.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return map.containsKey(o); + } + + public boolean add(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return false; + return map.put(new GTItemStack(aStack), OBJECT) == null; + } + + @Override + public boolean add(E e) { + return map.put(e, OBJECT) == null; + } + + @Override + public boolean remove(Object o) { + return map.remove(o) == OBJECT; + } + + @Override + public void clear() { + map.clear(); + } +} diff --git a/src/main/java/gregtech/api/objects/GTItemStack.java b/src/main/java/gregtech/api/objects/GTItemStack.java new file mode 100644 index 0000000000..3ddfcd706a --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTItemStack.java @@ -0,0 +1,107 @@ +package gregtech.api.objects; + +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.GTValues; +import gregtech.api.util.GTUtility; +import gregtech.api.util.item.ItemHolder; +import it.unimi.dsi.fastutil.Hash; + +/** + * An optimization of {@link ItemStack} to have a better {@code hashcode} and {@code equals} in order to improve + * {@code HashMap} and {@code Set} performance + */ +public class GTItemStack extends ItemHolder { + + /** + * A better {@link Hash.Strategy} for {@link ItemStack}. Implementation originally from {@code GT_ItemStack2}. + */ + public static final Hash.Strategy ITEMSTACK_HASH_STRATEGY2 = new Hash.Strategy<>() { + + @Override + public int hashCode(ItemStack o) { + return o.getItem() + .hashCode() * 38197 + Items.feather.getDamage(o); + } + + @Override + public boolean equals(ItemStack a, ItemStack b) { + if (a == b) return true; + if (a == null || b == null) return false; + return a.getItem() == b.getItem() && Items.feather.getDamage(a) == Items.feather.getDamage(b); + } + }; + + public final Item mItem; + public final byte mStackSize; + public final short mMetaData; + + public GTItemStack(Item aItem, long aStackSize, long aMetaData) { + super(new ItemStack(aItem, 1, (int) aMetaData)); + mItem = aItem; + mStackSize = (byte) aStackSize; + mMetaData = (short) aMetaData; + } + + public GTItemStack(ItemStack aStack) { + this(aStack, false); + } + + public GTItemStack(ItemStack aStack, boolean wildcard) { + this( + aStack == null ? null : aStack.getItem(), + aStack == null ? 0 : aStack.stackSize, + aStack == null ? 0 : wildcard ? GTValues.W : Items.feather.getDamage(aStack)); + } + + public GTItemStack(int aHashCode) { + this(GTUtility.intToStack(aHashCode)); + } + + public final ItemStack toStack() { + if (mItem == null) return null; + return new ItemStack(mItem, 1, mMetaData); + } + + public final boolean isStackEqual(ItemStack aStack) { + return GTUtility.areStacksEqual(toStack(), aStack); + } + + public final boolean isStackEqual(GTItemStack aStack) { + return GTUtility.areStacksEqual(toStack(), aStack.toStack()); + } + + @Override + public boolean equals(Object aStack) { + if (aStack == this) return true; + if (aStack instanceof GTItemStack) { + return ((GTItemStack) aStack).mItem == mItem && ((GTItemStack) aStack).mMetaData == mMetaData; + } + return false; + } + + @Override + public int hashCode() { + return GTUtility.stackToInt(toStack()); + } + + /** + * @see #internalCopyStack(ItemStack, boolean) + */ + public static ItemStack internalCopyStack(ItemStack aStack) { + return internalCopyStack(aStack, false); + } + + /** + * Replicates the copy behavior of {@link #toStack()} but for normal {@link ItemStack}s. + * + * @param aStack the stack to copy + * @param wildcard whether to use wildcard damage value + * @return a copy of the stack with stack size 1 and no NBT + */ + public static ItemStack internalCopyStack(ItemStack aStack, boolean wildcard) { + return new ItemStack(aStack.getItem(), 1, wildcard ? GTValues.W : Items.feather.getDamage(aStack)); + } +} diff --git a/src/main/java/gregtech/api/objects/GTItemStack2.java b/src/main/java/gregtech/api/objects/GTItemStack2.java new file mode 100644 index 0000000000..798915d848 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTItemStack2.java @@ -0,0 +1,41 @@ +package gregtech.api.objects; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * GT_ItemStack, but with a better hashCode(). Due to this change, it should not be placed in the same hash based data + * structure with GT_ItemStack. It also shouldn't be used to construct search query into a hash based data structure + * that contains GT_ItemStack. + * + * @deprecated See {@link GTItemStack#ITEMSTACK_HASH_STRATEGY2} + */ +@Deprecated +public class GTItemStack2 extends GTItemStack { + + public GTItemStack2(Item aItem, long aStackSize, long aMetaData) { + super(aItem, aStackSize, aMetaData); + } + + public GTItemStack2(ItemStack aStack) { + super(aStack); + } + + public GTItemStack2(ItemStack aStack, boolean wildcard) { + super(aStack, wildcard); + } + + @Override + public boolean equals(Object aStack) { + if (aStack == this) return true; + if (aStack instanceof GTItemStack) { + return ((GTItemStack) aStack).mItem == mItem && ((GTItemStack) aStack).mMetaData == mMetaData; + } + return false; + } + + @Override + public int hashCode() { + return mItem.hashCode() * 38197 + mMetaData; + } +} diff --git a/src/main/java/gregtech/api/objects/GTMultiTexture.java b/src/main/java/gregtech/api/objects/GTMultiTexture.java new file mode 100644 index 0000000000..ecd2f55661 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTMultiTexture.java @@ -0,0 +1,27 @@ +package gregtech.api.objects; + +import gregtech.api.interfaces.ITexture; +import gregtech.common.render.GTMultiTextureRender; + +/** + *

+ * Lets Multiple ITextures Render overlay over each other.< + *

+ *

+ * I should have done this much earlier... + *

+ * + * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. + */ +@Deprecated +public class GTMultiTexture extends GTMultiTextureRender implements ITexture { + + public GTMultiTexture(ITexture... aTextures) { + super(aTextures); + } + + @Override + public boolean isOldTexture() { + return true; + } +} diff --git a/src/main/java/gregtech/api/objects/GTRenderedTexture.java b/src/main/java/gregtech/api/objects/GTRenderedTexture.java new file mode 100644 index 0000000000..a4d0a064ff --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTRenderedTexture.java @@ -0,0 +1,33 @@ +package gregtech.api.objects; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.IColorModulationContainer; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; + +@Deprecated +public class GTRenderedTexture extends gregtech.common.render.GTRenderedTexture + implements ITexture, IColorModulationContainer { + + @Deprecated + public short[] mRGBa; + + public GTRenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) { + super(aIcon, aRGBa, aAllowAlpha, false, true, false); + if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture"); + mRGBa = aRGBa; + } + + public GTRenderedTexture(IIconContainer aIcon, short[] aRGBa) { + this(aIcon, aRGBa, true); + } + + public GTRenderedTexture(IIconContainer aIcon) { + this(aIcon, Dyes._NULL.mRGBa); + } + + @Override + public boolean isOldTexture() { + return true; + } +} diff --git a/src/main/java/gregtech/api/objects/GTSidedTexture.java b/src/main/java/gregtech/api/objects/GTSidedTexture.java new file mode 100644 index 0000000000..d7b2291386 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTSidedTexture.java @@ -0,0 +1,48 @@ +package gregtech.api.objects; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.IColorModulationContainer; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.common.render.GTSidedTextureRender; + +/** + * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. + */ +@Deprecated +public class GTSidedTexture extends GTSidedTextureRender implements ITexture, IColorModulationContainer { + + @Deprecated + public short[] mRGBa; + + public GTSidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3, + IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa, boolean aAllowAlpha) { + super(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, aRGBa, aAllowAlpha); + + // Backwards Compat + GTSidedTexture.this.mRGBa = aRGBa; + } + + public GTSidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3, + IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa) { + this(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, aRGBa, true); + } + + public GTSidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3, + IIconContainer aIcon4, IIconContainer aIcon5) { + this(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, Dyes._NULL.mRGBa); + } + + public GTSidedTexture(IIconContainer aBottom, IIconContainer aTop, IIconContainer aSides, short[] aRGBa) { + this(aBottom, aTop, aSides, aSides, aSides, aSides, aRGBa); + } + + public GTSidedTexture(IIconContainer aBottom, IIconContainer aTop, IIconContainer aSides) { + this(aBottom, aTop, aSides, Dyes._NULL.mRGBa); + } + + @Override + public boolean isOldTexture() { + return true; + } +} diff --git a/src/main/java/gregtech/api/objects/GTStdRenderedTexture.java b/src/main/java/gregtech/api/objects/GTStdRenderedTexture.java new file mode 100644 index 0000000000..11a3a4818f --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTStdRenderedTexture.java @@ -0,0 +1,46 @@ +package gregtech.api.objects; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.util.LightingHelper; + +/** + * This ITexture implementation extends the GT_RenderedTexture class to render with bottom side flipped as with dumb + * blocks rendering. It is used in Ore blocks rendering so they better blends with dumb block ores from vanilla or other + * mods, when seen from bottom. + * + * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. + */ +@Deprecated +public class GTStdRenderedTexture extends GTRenderedTexture { + + @SuppressWarnings("unused") + public GTStdRenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) { + super(aIcon, aRGBa, aAllowAlpha); + } + + public GTStdRenderedTexture(IIconContainer aIcon, short[] aRGBa) { + super(aIcon, aRGBa, true); + } + + @SuppressWarnings("unused") + public GTStdRenderedTexture(IIconContainer aIcon) { + super(aIcon, Dyes._NULL.mRGBa); + } + + @Override + public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + LightingHelper lighting = new LightingHelper(aRenderer); + lighting.setupLightingYNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.DOWN, mRGBa); + aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, mIconContainer.getIcon()); + if (mIconContainer.getOverlayIcon() != null) { + lighting.setupColor(ForgeDirection.DOWN, 0xffffff); + aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, mIconContainer.getOverlayIcon()); + } + } +} diff --git a/src/main/java/gregtech/api/objects/GTUODimension.java b/src/main/java/gregtech/api/objects/GTUODimension.java new file mode 100644 index 0000000000..2fe10196bd --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTUODimension.java @@ -0,0 +1,54 @@ +package gregtech.api.objects; + +import java.util.Random; + +import net.minecraftforge.common.config.ConfigCategory; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +public class GTUODimension { + + private final BiMap fFluids; + private int maxChance; + public String Dimension = "null"; + + public GTUODimension(ConfigCategory aConfigCategory) { // TODO CONFIGURE + fFluids = HashBiMap.create(); + if (aConfigCategory.containsKey("Dimension")) { + aConfigCategory.get("Dimension").comment = "Dimension ID or Class Name"; + Dimension = aConfigCategory.get("Dimension") + .getString(); + } + maxChance = 0; + // GT_FML_LOGGER.info("GT UO "+aConfigCategory.getName()+" Dimension:"+Dimension); + for (int i = 0; i < aConfigCategory.getChildren() + .size(); i++) { + GTUOFluid fluid = new GTUOFluid( + (ConfigCategory) aConfigCategory.getChildren() + .toArray()[i]); + fFluids.put(fluid.Registry, fluid); + maxChance += fluid.Chance; + } + } + + public GTUOFluid getRandomFluid(Random aRandom) { + int random = aRandom.nextInt(1000); + for (BiMap.Entry fl : fFluids.entrySet()) { + int chance = fl.getValue().Chance * 1000 / maxChance; + if (random <= chance) return fl.getValue(); + // GT_FML_LOGGER.info("GT UO "+fl.getValue().Registry+" Chance:"+chance+" Random:"+random); + random -= chance; + } + return null; + } + + public String getUOFluidKey(GTUOFluid uoFluid) { + return fFluids.inverse() + .get(uoFluid); + } + + public GTUOFluid getUOFluid(String key) { + return fFluids.get(key); + } +} diff --git a/src/main/java/gregtech/api/objects/GTUODimensionList.java b/src/main/java/gregtech/api/objects/GTUODimensionList.java new file mode 100644 index 0000000000..60d11fdaa7 --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTUODimensionList.java @@ -0,0 +1,648 @@ +package gregtech.api.objects; + +import static gregtech.api.enums.Dimensions.AlphaCentauriBb; +import static gregtech.api.enums.Dimensions.BarnardaC; +import static gregtech.api.enums.Dimensions.BarnardaE; +import static gregtech.api.enums.Dimensions.BarnardaF; +import static gregtech.api.enums.Dimensions.Callisto; +import static gregtech.api.enums.Dimensions.Europa; +import static gregtech.api.enums.Dimensions.Io; +import static gregtech.api.enums.Dimensions.Makemake; +import static gregtech.api.enums.Dimensions.Mars; +import static gregtech.api.enums.Dimensions.Mercury; +import static gregtech.api.enums.Dimensions.Miranda; +import static gregtech.api.enums.Dimensions.Moon; +import static gregtech.api.enums.Dimensions.Oberon; +import static gregtech.api.enums.Dimensions.Overworld; +import static gregtech.api.enums.Dimensions.Pluto; +import static gregtech.api.enums.Dimensions.Proteus; +import static gregtech.api.enums.Dimensions.Ross128b; +import static gregtech.api.enums.Dimensions.Ross128ba; +import static gregtech.api.enums.Dimensions.TCetiE; +import static gregtech.api.enums.Dimensions.Titan; +import static gregtech.api.enums.Dimensions.Triton; +import static gregtech.api.enums.Dimensions.Venus; +import static gregtech.api.enums.UndergroundFluidNames.carbonDioxide; +import static gregtech.api.enums.UndergroundFluidNames.carbonMonoxide; +import static gregtech.api.enums.UndergroundFluidNames.chlorobenzene; +import static gregtech.api.enums.UndergroundFluidNames.deuterium; +import static gregtech.api.enums.UndergroundFluidNames.distilledWater; +import static gregtech.api.enums.UndergroundFluidNames.ethane; +import static gregtech.api.enums.UndergroundFluidNames.ethylene; +import static gregtech.api.enums.UndergroundFluidNames.fluorine; +import static gregtech.api.enums.UndergroundFluidNames.heavyOil; +import static gregtech.api.enums.UndergroundFluidNames.helium3; +import static gregtech.api.enums.UndergroundFluidNames.hydrofluoricAcid; +import static gregtech.api.enums.UndergroundFluidNames.hydrogen; +import static gregtech.api.enums.UndergroundFluidNames.hydrogenSulfide; +import static gregtech.api.enums.UndergroundFluidNames.lava; +import static gregtech.api.enums.UndergroundFluidNames.lightOil; +import static gregtech.api.enums.UndergroundFluidNames.liquidAir; +import static gregtech.api.enums.UndergroundFluidNames.mediumOil; +import static gregtech.api.enums.UndergroundFluidNames.methane; +import static gregtech.api.enums.UndergroundFluidNames.moltenCopper; +import static gregtech.api.enums.UndergroundFluidNames.moltenIron; +import static gregtech.api.enums.UndergroundFluidNames.moltenLead; +import static gregtech.api.enums.UndergroundFluidNames.moltenTin; +import static gregtech.api.enums.UndergroundFluidNames.naturalGas; +import static gregtech.api.enums.UndergroundFluidNames.nitrogen; +import static gregtech.api.enums.UndergroundFluidNames.oil; +import static gregtech.api.enums.UndergroundFluidNames.oxygen; +import static gregtech.api.enums.UndergroundFluidNames.saltWater; +import static gregtech.api.enums.UndergroundFluidNames.sulfuricAcid; +import static gregtech.api.enums.UndergroundFluidNames.unknownWater; +import static gregtech.api.enums.UndergroundFluidNames.veryHeavyOil; + +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.common.config.Configuration; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +import gregtech.api.enums.Dimensions; +import gregtech.api.enums.UndergroundFluidNames; + +public class GTUODimensionList { + + private Configuration fConfig; + private String fCategory; + private final BiMap fDimensionList; + + public int[] blackList = new int[0]; + + public GTUODimensionList() { + fDimensionList = HashBiMap.create(); + } + + public void save() { + fConfig.save(); + } + + public GTUODimension GetDimension(int aDimension) { + if (CheckBlackList(aDimension)) return null; + if (fDimensionList.containsKey(Integer.toString(aDimension))) + return fDimensionList.get(Integer.toString(aDimension)); + for (BiMap.Entry dl : fDimensionList.entrySet()) + if (DimensionManager.getProvider(aDimension) + .getClass() + .getName() + .contains(dl.getValue().Dimension)) return dl.getValue(); + return fDimensionList.get("Default"); + } + + private boolean CheckBlackList(int aDimensionId) { + try { + return java.util.Arrays.binarySearch(blackList, aDimensionId) >= 0; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public void SetConfigValues(String aDimensionName, String aDimension, String aName, String aRegistry, + int aMinAmount, int aMaxAmount, int aChance, int aDecreasePerOperationAmount) { + String Category = fCategory + "." + aDimensionName; + fConfig.get(Category, "Dimension", aDimension) + .getString(); + Category += "." + aName; + fConfig.get(Category, "Registry", aRegistry) + .getString(); + fConfig.get(Category, "MinAmount", aMinAmount) + .getInt(aMinAmount); + fConfig.get(Category, "MaxAmount", aMaxAmount) + .getInt(aMaxAmount); + fConfig.get(Category, "Chance", aChance) + .getInt(aChance); + fConfig.get(Category, "DecreasePerOperationAmount", aDecreasePerOperationAmount) + .getInt(aDecreasePerOperationAmount); + // IT IS IN BUCKETS!!! + } + + private void setOverworldValues() { + new ConfigSetter().dimension(Overworld) + .fluid(naturalGas) + .chance(20) + .decreaseAmount(5) + .maxAmount(350) + .minAmount(10) + .writeToConfig(); + + new ConfigSetter().dimension(Overworld) + .fluid(lightOil) + .chance(20) + .decreaseAmount(5) + .maxAmount(350) + .minAmount(10) + .writeToConfig(); + + new ConfigSetter().dimension(Overworld) + .fluid(mediumOil) + .chance(20) + .decreaseAmount(5) + .maxAmount(625) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Overworld) + .fluid(heavyOil) + .chance(20) + .decreaseAmount(5) + .maxAmount(625) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Overworld) + .fluid(oil) + .chance(20) + .decreaseAmount(5) + .maxAmount(625) + .minAmount(0) + .writeToConfig(); + } + + private void setMoonValues() { + new ConfigSetter().dimension(Moon) + .fluid(helium3) + .chance(100) + .decreaseAmount(5) + .maxAmount(425) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Moon) + .fluid(saltWater) + .chance(20) + .decreaseAmount(5) + .maxAmount(200) + .minAmount(0) + .writeToConfig(); + } + + private void setMercuryValues() { + new ConfigSetter().dimension(Mercury) + .fluid(helium3) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Mercury) + .fluid(moltenIron) + .chance(30) + .decreaseAmount(5) + .maxAmount(400) + .minAmount(0) + .writeToConfig(); + } + + private void setVenusValues() { + new ConfigSetter().dimension(Venus) + .fluid(moltenLead) + .chance(100) + .decreaseAmount(5) + .maxAmount(1600) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Venus) + .fluid(sulfuricAcid) + .chance(100) + .decreaseAmount(5) + .maxAmount(250) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Venus) + .fluid(carbonDioxide) + .chance(100) + .decreaseAmount(5) + .maxAmount(1500) + .minAmount(0) + .writeToConfig(); + } + + private void setMarsValues() { + new ConfigSetter().dimension(Mars) + .fluid(saltWater) + .chance(100) + .decreaseAmount(5) + .maxAmount(400) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Mars) + .fluid(chlorobenzene) + .chance(100) + .decreaseAmount(5) + .maxAmount(400) + .minAmount(0) + .writeToConfig(); + } + + private void setIoValues() { + new ConfigSetter().dimension(Io) + .fluid(moltenLead) + .chance(20) + .decreaseAmount(5) + .maxAmount(650) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Io) + .fluid(sulfuricAcid) + .chance(80) + .decreaseAmount(5) + .maxAmount(350) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Io) + .fluid(carbonDioxide) + .chance(80) + .decreaseAmount(5) + .maxAmount(750) + .minAmount(0) + .writeToConfig(); + } + + private void setEuropaValues() { + new ConfigSetter().dimension(Europa) + .fluid(saltWater) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Europa) + .fluid(veryHeavyOil) + .chance(20) + .decreaseAmount(5) + .maxAmount(200) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Europa) + .fluid(distilledWater) + .chance(80) + .decreaseAmount(5) + .maxAmount(3500) + .minAmount(0) + .writeToConfig(); + } + + private void setCallistoValues() { + new ConfigSetter().dimension(Callisto) + .fluid(oxygen) + .chance(100) + .decreaseAmount(5) + .maxAmount(200) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Callisto) + .fluid(liquidAir) + .chance(100) + .decreaseAmount(5) + .maxAmount(200) + .minAmount(0) + .writeToConfig(); + } + + private void setTitanValues() { + new ConfigSetter().dimension(Titan) + .fluid(methane) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Titan) + .fluid(ethane) + .chance(100) + .decreaseAmount(5) + .maxAmount(200) + .minAmount(0) + .writeToConfig(); + } + + private void setMirandaValues() { + new ConfigSetter().dimension(Miranda) + .fluid(hydrogenSulfide) + .chance(100) + .decreaseAmount(5) + .maxAmount(900) + .minAmount(0) + .writeToConfig(); + } + + private void setOberonValues() { + new ConfigSetter().dimension(Oberon) + .fluid(carbonMonoxide) + .chance(100) + .decreaseAmount(5) + .maxAmount(2000) + .minAmount(0) + .writeToConfig(); + } + + private void setTritonValues() { + new ConfigSetter().dimension(Triton) + .fluid(nitrogen) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Triton) + .fluid(ethylene) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + } + + private void setProteusValues() { + new ConfigSetter().dimension(Proteus) + .fluid(deuterium) + .chance(100) + .decreaseAmount(5) + .maxAmount(700) + .minAmount(0) + .writeToConfig(); + } + + private void setPlutoValues() { + new ConfigSetter().dimension(Pluto) + .fluid(nitrogen) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Pluto) + .fluid(oxygen) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Pluto) + .fluid(liquidAir) + .chance(40) + .decreaseAmount(5) + .maxAmount(300) + .minAmount(4) + .writeToConfig(); + + new ConfigSetter().dimension(Pluto) + .fluid(fluorine) + .chance(80) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(4) + .writeToConfig(); + } + + private void setMakeMakeValues() { + new ConfigSetter().dimension(Makemake) + .fluid(hydrofluoricAcid) + .chance(80) + .decreaseAmount(5) + .maxAmount(300) + .minAmount(0) + .writeToConfig(); + } + + private void setAlphaCentauriBBValues() { + new ConfigSetter().dimension(AlphaCentauriBb) + .fluid(moltenCopper) + .chance(10) + .decreaseAmount(5) + .maxAmount(300) + .minAmount(0) + .writeToConfig(); + } + + private void setBarnardaCValues() { + new ConfigSetter().dimension(BarnardaC) + .fluid(veryHeavyOil) + .chance(100) + .decreaseAmount(5) + .maxAmount(800) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(BarnardaC) + .fluid(unknownWater) + .chance(100) + .decreaseAmount(5) + .maxAmount(300) + .minAmount(0) + .writeToConfig(); + } + + private void setBarnardaEValues() { + new ConfigSetter().dimension(BarnardaE) + .fluid(liquidAir) + .chance(20) + .decreaseAmount(5) + .maxAmount(400) + .minAmount(0) + .writeToConfig(); + } + + private void setBarnardaFValues() { + new ConfigSetter().dimension(BarnardaF) + .fluid(moltenTin) + .chance(15) + .decreaseAmount(5) + .maxAmount(400) + .minAmount(0) + .writeToConfig(); + } + + private void setTcetiEValues() { + new ConfigSetter().dimension(TCetiE) + .fluid(veryHeavyOil) + .chance(100) + .decreaseAmount(5) + .maxAmount(200) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(TCetiE) + .fluid(hydrogen) + .chance(50) + .decreaseAmount(5) + .maxAmount(700) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(TCetiE) + .fluid(distilledWater) + .chance(100) + .decreaseAmount(5) + .maxAmount(10_000) + .minAmount(0) + .writeToConfig(); + } + + private void setRoss128bValues() { + new ConfigSetter().dimension(Ross128b) + .fluid(veryHeavyOil) + .chance(40) + .decreaseAmount(5) + .maxAmount(625) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Ross128b) + .fluid(lava) + .chance(5) + .decreaseAmount(5) + .maxAmount(820) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Ross128b) + .fluid(naturalGas) + .chance(65) + .decreaseAmount(5) + .maxAmount(625) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Ross128b) + .fluid(distilledWater) + .chance(100) + .decreaseAmount(5) + .maxAmount(5000) + .minAmount(0) + .writeToConfig(); + } + + private void setRoss128baValues() { + new ConfigSetter().dimension(Ross128ba) + .fluid(saltWater) + .chance(40) + .decreaseAmount(5) + .maxAmount(1250) + .minAmount(0) + .writeToConfig(); + + new ConfigSetter().dimension(Ross128ba) + .fluid(helium3) + .chance(60) + .decreaseAmount(5) + .maxAmount(1250) + .minAmount(0) + .writeToConfig(); + } + + public void setDefaultValues() { + setOverworldValues(); + setMoonValues(); + setMercuryValues(); + setVenusValues(); + setMarsValues(); + setIoValues(); + setEuropaValues(); + setCallistoValues(); + setTitanValues(); + setMirandaValues(); + setOberonValues(); + setTritonValues(); + setProteusValues(); + setPlutoValues(); + setMakeMakeValues(); + setAlphaCentauriBBValues(); + setBarnardaCValues(); + setBarnardaEValues(); + setBarnardaFValues(); + setTcetiEValues(); + setRoss128bValues(); + setRoss128baValues(); + } + + public void getConfig(Configuration aConfig, String aCategory) { + fCategory = aCategory; + fConfig = aConfig; + if (!fConfig.hasCategory(fCategory)) setDefaultValues(); + + blackList = new int[] { -1, 1 }; + blackList = aConfig.get(fCategory, "DimBlackList", blackList, "Dimension IDs Black List") + .getIntList(); + java.util.Arrays.sort(blackList); + + for (int i = 0; i < fConfig.getCategory(fCategory) + .getChildren() + .size(); i++) { + GTUODimension Dimension = new GTUODimension( + (ConfigCategory) fConfig.getCategory(fCategory) + .getChildren() + .toArray()[i]); + fDimensionList.put(Dimension.Dimension, Dimension); + } + save(); + } + + public class ConfigSetter { + + private int chance; + private int decreaseAmount; + private int maxAmount; + private int minAmount; + private UndergroundFluidNames fluid; + private Dimensions dim; + + public ConfigSetter chance(int chance) { + this.chance = chance; + return this; + } + + public ConfigSetter decreaseAmount(int decreaseAmount) { + this.decreaseAmount = decreaseAmount; + return this; + } + + public ConfigSetter maxAmount(int maxAmount) { + this.maxAmount = maxAmount; + return this; + } + + public ConfigSetter minAmount(int minAmount) { + this.minAmount = minAmount; + return this; + } + + public ConfigSetter fluid(UndergroundFluidNames fluid) { + this.fluid = fluid; + return this; + } + + public ConfigSetter dimension(Dimensions dim) { + this.dim = dim; + return this; + } + + public void writeToConfig() { + SetConfigValues( + dim.toString(), + dim.id, + fluid.toString(), + fluid.name, + minAmount, + maxAmount, + chance, + decreaseAmount); + } + } +} diff --git a/src/main/java/gregtech/api/objects/GTUOFluid.java b/src/main/java/gregtech/api/objects/GTUOFluid.java new file mode 100644 index 0000000000..cd019dbc8e --- /dev/null +++ b/src/main/java/gregtech/api/objects/GTUOFluid.java @@ -0,0 +1,69 @@ +package gregtech.api.objects; + +import static gregtech.common.UndergroundOil.DIVIDER; + +import java.util.Random; + +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; + +public class GTUOFluid { + + public String Registry = "null"; + public int MaxAmount = 0; + public int MinAmount = 0; + public int Chance = 0; + public int DecreasePerOperationAmount = 5; + + public GTUOFluid(ConfigCategory aConfigCategory) { // TODO CONFIGURE + if (aConfigCategory.containsKey("Registry")) { + aConfigCategory.get("Registry").comment = "Fluid registry name"; + Registry = aConfigCategory.get("Registry") + .getString(); + } + if (aConfigCategory.containsKey("MaxAmount")) { + aConfigCategory + .get("MaxAmount").comment = "Max amount generation (per operation, sets the VeinData) 80000 MAX"; + MaxAmount = aConfigCategory.get("MaxAmount") + .getInt(0); + } + if (aConfigCategory.containsKey("MinAmount")) { + aConfigCategory.get("MinAmount").comment = "Min amount generation (per operation, sets the VeinData) 0 MIN"; + MinAmount = aConfigCategory.get("MinAmount") + .getInt(0); + } + if (aConfigCategory.containsKey("Chance")) { + aConfigCategory + .get("Chance").comment = "Chance generating (weighted chance!, there will be a fluid in chunk always!)"; + Chance = aConfigCategory.get("Chance") + .getInt(0); + } + if (aConfigCategory.containsKey("DecreasePerOperationAmount")) { + aConfigCategory.get( + "DecreasePerOperationAmount").comment = "Decrease per operation (actual fluid gained works like (Litre)VeinData/5000)"; + DecreasePerOperationAmount = aConfigCategory.get("DecreasePerOperationAmount") + .getInt(5); + } + // GT_FML_LOGGER.info("GT UO "+aConfigCategory.getName()+" Fluid:"+Registry+" Max:"+MaxAmount+" + // Min:"+MinAmount+" Chance:"+Chance); + } + + public Fluid getFluid() { + try { + return FluidRegistry.getFluid(this.Registry); + } catch (Exception e) { + return null; + } + } + + public int getRandomAmount(Random aRandom) { // generates some random ass number that correlates to extraction + // speeds + int smax = (int) Math.floor(Math.pow(MaxAmount * 100.d * DIVIDER, 0.2d)); // use scaled max and min values for + // the randomness to make high values + // more rare. + double smin = Math.pow(MinAmount * 100.d * DIVIDER, 0.2d); + double samount = Math.max(smin, aRandom.nextInt(smax) + aRandom.nextDouble()); + return (int) (Math.pow(samount, 5) / 100); // reverses the computation above + } +} diff --git a/src/main/java/gregtech/api/objects/GT_ArrayList.java b/src/main/java/gregtech/api/objects/GT_ArrayList.java deleted file mode 100644 index 9124ef8616..0000000000 --- a/src/main/java/gregtech/api/objects/GT_ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package gregtech.api.objects; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Objects; - -import com.google.common.collect.Collections2; - -public class GT_ArrayList extends ArrayList { - - private static final long serialVersionUID = 1L; - private int size_sS; - - private final boolean mAllowNulls; - - public GT_ArrayList(boolean aAllowNulls, int aCapacity) { - super(aCapacity); - mAllowNulls = aAllowNulls; - } - - @SafeVarargs - public GT_ArrayList(boolean aAllowNulls, E... aArray) { - super(Arrays.asList(aArray)); - mAllowNulls = aAllowNulls; - if (!mAllowNulls) { - size_sS = size(); - for (int i = 0; i < size_sS; i++) if (get(i) == null) { - remove(i--); - size_sS = size(); - } - } - } - - public GT_ArrayList(boolean aAllowNulls, Collection aList) { - super(aList); - mAllowNulls = aAllowNulls; - if (!mAllowNulls) { - size_sS = size(); - for (int i = 0; i < size_sS; i++) if (get(i) == null) { - remove(i--); - size_sS = size(); - } - } - } - - @Override - public E set(int aIndex, E aElement) { - if (mAllowNulls || aElement != null) return super.set(aIndex, aElement); - return null; - } - - @Override - public boolean add(E aElement) { - if (mAllowNulls || aElement != null) return super.add(aElement); - return false; - } - - @Override - public void add(int aIndex, E aElement) { - if (mAllowNulls || aElement != null) super.add(aIndex, aElement); - } - - @Override - public boolean addAll(Collection aList) { - return super.addAll(Collections2.filter(aList, Objects::nonNull)); - } - - @Override - public boolean addAll(int aIndex, Collection aList) { - return super.addAll(aIndex, Collections2.filter(aList, Objects::nonNull)); - } -} diff --git a/src/main/java/gregtech/api/objects/GT_ChunkManager.java b/src/main/java/gregtech/api/objects/GT_ChunkManager.java deleted file mode 100644 index 14baaddd3d..0000000000 --- a/src/main/java/gregtech/api/objects/GT_ChunkManager.java +++ /dev/null @@ -1,204 +0,0 @@ -package gregtech.api.objects; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeChunkManager; -import net.minecraftforge.common.ForgeChunkManager.Ticket; - -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; - -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.IChunkLoader; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Log; - -/** - * Handles re-initialization of chunks after a server restart. - */ -public class GT_ChunkManager - implements ForgeChunkManager.OrderedLoadingCallback, ForgeChunkManager.PlayerOrderedLoadingCallback { - - private final Map registeredTickets = new HashMap<>(); - public static GT_ChunkManager instance = new GT_ChunkManager(); - - public static void init() { - ForgeChunkManager.setForcedChunkLoadingCallback(GT_Mod.instance, instance); - } - - @Override - public void ticketsLoaded(List tickets, World world) {} - - /** - * Determines if tickets should be kept. Based on if the ticket is a machine or a working-chunk ticket. - * Working-chunk tickets are tossed and recreated when the machine reactivates. - * Machine tickets are kept only if the config {@code alwaysReloadChunkloaders} is true. - * Otherwise, machine chunks are tossed and recreated only when the machine reactivates, - * similarly to a Passive Anchor. - * - * @param tickets The tickets that you will want to select from. - * The list is immutable and cannot be manipulated directly. Copy it first. - * @param world The world - * @param maxTicketCount The maximum number of tickets that will be allowed. - * @return list of tickets - */ - - @Override - public List ticketsLoaded(List tickets, World world, int maxTicketCount) { - List validTickets = new ArrayList<>(); - if (GT_Values.alwaysReloadChunkloaders) { - for (Ticket ticket : tickets) { - int x = ticket.getModData() - .getInteger("OwnerX"); - int y = ticket.getModData() - .getInteger("OwnerY"); - int z = ticket.getModData() - .getInteger("OwnerZ"); - if (y > 0) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile instanceof IGregTechTileEntity && ((IGregTechTileEntity) tile).isAllowedToWork()) { - ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(x >> 4, z >> 4)); - if (!registeredTickets.containsKey(tile)) { - registeredTickets.put(tile, ticket); - if (((IGregTechTileEntity) tile).getMetaTileEntity() instanceof IChunkLoader) - ForgeChunkManager.forceChunk( - ticket, - ((IChunkLoader) ((IGregTechTileEntity) tile).getMetaTileEntity()).getActiveChunk()); - validTickets.add(ticket); - } - } - } - } - } - return validTickets; - } - - /** - * Determines if player tickets should be kept. This is where a ticket list per-player would be created and - * maintained. When a player joins, an event occurs, their name/UUID/etc is compared against tickets on this list - * and those tickets are reactivated. - * Since that info would be maintained/dealt with on a per-player startup, the list returned back to Forge is empty. - * - * @param tickets The tickets that you will want to select from. - * The list is immutable and cannot be manipulated directly. Copy it first. - * @param world The world - * @return the list of string-ticket paris - */ - @Override - public ListMultimap playerTicketsLoaded(ListMultimap tickets, World world) { - // Not currently used, so just return an empty list. - return ArrayListMultimap.create(); - } - - /** - * Requests a chunk to be loaded for this machine. May pass a {@code null} chunk to load just the machine itself if - * {@code alwaysReloadChunkloaders} is enabled in config. - * - * @param owner owner of the TileEntity - * @param chunkXZ chunk coordinates - * @param player player - * @return if the chunk was loaded successfully - */ - public static boolean requestPlayerChunkLoad(TileEntity owner, ChunkCoordIntPair chunkXZ, String player) { - if (!GT_Values.enableChunkloaders) return false; - if (!GT_Values.alwaysReloadChunkloaders && chunkXZ == null) return false; - if (GT_Values.debugChunkloaders && chunkXZ != null) GT_Log.out - .println("GT_ChunkManager: Chunk request: (" + chunkXZ.chunkXPos + ", " + chunkXZ.chunkZPos + ")"); - if (instance.registeredTickets.containsKey(owner)) { - ForgeChunkManager.forceChunk(instance.registeredTickets.get(owner), chunkXZ); - } else { - Ticket ticket; - if (player.equals("")) ticket = ForgeChunkManager - .requestTicket(GT_Mod.instance, owner.getWorldObj(), ForgeChunkManager.Type.NORMAL); - else ticket = ForgeChunkManager - .requestPlayerTicket(GT_Mod.instance, player, owner.getWorldObj(), ForgeChunkManager.Type.NORMAL); - if (ticket == null) { - if (GT_Values.debugChunkloaders) - GT_Log.out.println("GT_ChunkManager: ForgeChunkManager.requestTicket failed"); - return false; - } - if (GT_Values.debugChunkloaders) GT_Log.out.println( - "GT_ChunkManager: ticket issued for machine at: (" + owner.xCoord - + ", " - + owner.yCoord - + ", " - + owner.zCoord - + ")"); - NBTTagCompound tag = ticket.getModData(); - tag.setInteger("OwnerX", owner.xCoord); - tag.setInteger("OwnerY", owner.yCoord); - tag.setInteger("OwnerZ", owner.zCoord); - ForgeChunkManager.forceChunk(ticket, chunkXZ); - if (GT_Values.alwaysReloadChunkloaders) - ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(owner.xCoord >> 4, owner.zCoord >> 4)); - instance.registeredTickets.put(owner, ticket); - } - return true; - } - - @SuppressWarnings("UnusedReturnValue") - public static boolean requestChunkLoad(TileEntity owner, ChunkCoordIntPair chunkXZ) { - return requestPlayerChunkLoad(owner, chunkXZ, ""); - } - - public static void releaseChunk(TileEntity owner, ChunkCoordIntPair chunkXZ) { - if (!GT_Values.enableChunkloaders) return; - Ticket ticket = instance.registeredTickets.get(owner); - if (ticket != null) { - if (GT_Values.debugChunkloaders) GT_Log.out - .println("GT_ChunkManager: Chunk release: (" + chunkXZ.chunkXPos + ", " + chunkXZ.chunkZPos + ")"); - ForgeChunkManager.unforceChunk(ticket, chunkXZ); - } - } - - public static void releaseTicket(TileEntity owner) { - if (!GT_Values.enableChunkloaders) return; - Ticket ticket = instance.registeredTickets.get(owner); - if (ticket != null) { - if (GT_Values.debugChunkloaders) { - GT_Log.out.println( - "GT_ChunkManager: ticket released by machine at: (" + owner.xCoord - + ", " - + owner.yCoord - + ", " - + owner.zCoord - + ")"); - for (ChunkCoordIntPair chunk : ticket.getChunkList()) GT_Log.out - .println("GT_ChunkManager: Chunk release: (" + chunk.chunkXPos + ", " + chunk.chunkZPos + ")"); - } - ForgeChunkManager.releaseTicket(ticket); - instance.registeredTickets.remove(owner); - } - } - - public static void printTickets() { - GT_Log.out.println("GT_ChunkManager: Start forced chunks dump:"); - instance.registeredTickets.forEach((machine, ticket) -> { - GT_Log.out.print( - "GT_ChunkManager: Chunks forced by the machine at (" + machine.xCoord - + ", " - + machine.yCoord - + ", " - + machine.zCoord - + ")"); - if (ticket.isPlayerTicket()) GT_Log.out.print(" Owner: " + ticket.getPlayerName()); - GT_Log.out.print(" :"); - for (ChunkCoordIntPair c : ticket.getChunkList()) { - GT_Log.out.print("("); - GT_Log.out.print(c.chunkXPos); - GT_Log.out.print(", "); - GT_Log.out.print(c.chunkZPos); - GT_Log.out.print("), "); - } - }); - GT_Log.out.println("GT_ChunkManager: End forced chunks dump:"); - } -} diff --git a/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java b/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java deleted file mode 100644 index c5307b4803..0000000000 --- a/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java +++ /dev/null @@ -1,35 +0,0 @@ -package gregtech.api.objects; - -import net.minecraft.block.Block; - -import gregtech.api.enums.Dyes; -import gregtech.api.interfaces.ITexture; - -/** - * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. - */ -@Deprecated -public class GT_CopiedBlockTexture extends gregtech.common.render.GT_CopiedBlockTexture implements ITexture { - - // Backwards Compat - @Deprecated - public short[] mRGBa; - - public GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean aAllowAlpha) { - super(aBlock, ordinalSide, aMeta, aRGBa, aAllowAlpha); - GT_CopiedBlockTexture.this.mRGBa = aRGBa; - } - - public GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa) { - this(aBlock, ordinalSide, aMeta, aRGBa, true); - } - - public GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta) { - this(aBlock, ordinalSide, aMeta, Dyes._NULL.mRGBa); - } - - @Override - public boolean isOldTexture() { - return true; - } -} diff --git a/src/main/java/gregtech/api/objects/GT_Cover_Default.java b/src/main/java/gregtech/api/objects/GT_Cover_Default.java deleted file mode 100644 index cc5f96eef3..0000000000 --- a/src/main/java/gregtech/api/objects/GT_Cover_Default.java +++ /dev/null @@ -1,81 +0,0 @@ -package gregtech.api.objects; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; - -public class GT_Cover_Default extends GT_CoverBehavior { - - /** - * This is the Dummy, if there is a generic Cover without behavior - */ - public GT_Cover_Default() { - super(); - } - - @Override - public boolean isSimpleCover() { - return true; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = ((aCoverVariable + 1) & 15); - GT_Utility.sendChatToPlayer( - aPlayer, - ((aCoverVariable & 1) != 0 ? GT_Utility.trans("128.1", "Redstone ") : "") - + ((aCoverVariable & 2) != 0 ? GT_Utility.trans("129.1", "Energy ") : "") - + ((aCoverVariable & 4) != 0 ? GT_Utility.trans("130.1", "Fluids ") : "") - + ((aCoverVariable & 8) != 0 ? GT_Utility.trans("131.1", "Items ") : "")); - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return (aCoverVariable & 1) != 0; - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return (aCoverVariable & 1) != 0; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return (aCoverVariable & 2) != 0; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return (aCoverVariable & 2) != 0; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return (aCoverVariable & 4) != 0; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return (aCoverVariable & 4) != 0; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return (aCoverVariable & 8) != 0; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return (aCoverVariable & 8) != 0; - } -} diff --git a/src/main/java/gregtech/api/objects/GT_Cover_None.java b/src/main/java/gregtech/api/objects/GT_Cover_None.java deleted file mode 100644 index 279efe63d8..0000000000 --- a/src/main/java/gregtech/api/objects/GT_Cover_None.java +++ /dev/null @@ -1,237 +0,0 @@ -package gregtech.api.objects; - -import static gregtech.api.enums.GT_Values.E; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.ISerializableObject; - -public class GT_Cover_None extends GT_CoverBehavior { - - /** - * This is the Dummy, if there is no Cover - */ - public GT_Cover_None() {} - - @Override - public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 10.0F; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - @Override - public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - return false; - } - - @Override - public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - boolean aForced) { - return true; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return 0; - } - - @Override - public boolean isSimpleCover() { - return true; - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - return false; - } - - @Override - protected ISerializableObject.LegacyCoverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, - int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - return aCoverVariable; - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - return false; - } - - @Override - protected ISerializableObject.LegacyCoverData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - return aCoverVariable; - } - - @Override - protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer) { - return false; - } - - @Override - protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, boolean aForced) { - return true; - } - - @Override - protected String getDescriptionImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return E; - } - - @Override - protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return 10.0F; - } - - @Override - protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return aInputRedstone; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, - ICoverable aTileEntity) { - return 0; - } - - @Override - protected byte getLensColorImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return -1; - } - - @Override - protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return null; - } -} diff --git a/src/main/java/gregtech/api/objects/GT_Fluid.java b/src/main/java/gregtech/api/objects/GT_Fluid.java deleted file mode 100644 index 10824d6327..0000000000 --- a/src/main/java/gregtech/api/objects/GT_Fluid.java +++ /dev/null @@ -1,36 +0,0 @@ -package gregtech.api.objects; - -import static gregtech.api.enums.Mods.GregTech; - -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.GregTech_API; -import gregtech.api.fluid.GT_FluidFactory; - -/** - * @deprecated use {@link GT_FluidFactory#builder} - */ -@Deprecated -public class GT_Fluid extends Fluid implements Runnable { - - public final String mTextureName; - private final short[] mRGBa; - - public GT_Fluid(String aName, String aTextureName, short[] aRGBa) { - super(aName); - mRGBa = aRGBa; - mTextureName = aTextureName; - GregTech_API.sGTBlockIconload.add(this); - } - - @Override - public int getColor() { - return (Math.max(0, Math.min(255, mRGBa[0])) << 16) | (Math.max(0, Math.min(255, mRGBa[1])) << 8) - | Math.max(0, Math.min(255, mRGBa[2])); - } - - @Override - public void run() { - setIcons(GregTech_API.sBlockIcons.registerIcon(GregTech.getResourcePath("fluids", "fluid." + mTextureName))); - } -} diff --git a/src/main/java/gregtech/api/objects/GT_HashSet.java b/src/main/java/gregtech/api/objects/GT_HashSet.java deleted file mode 100644 index d42f194e5d..0000000000 --- a/src/main/java/gregtech/api/objects/GT_HashSet.java +++ /dev/null @@ -1,91 +0,0 @@ -package gregtech.api.objects; - -import java.util.AbstractSet; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; - -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; -import gregtech.api.util.GT_Utility; - -public class GT_HashSet extends AbstractSet { - - private static final Object OBJECT = new Object(); - private final transient HashMap map; - - public GT_HashSet() { - map = new HashMap<>(); - GregTech_API.sItemStackMappings.add(map); - } - - public GT_HashSet(Collection c) { - map = new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16)); - addAll(c); - GregTech_API.sItemStackMappings.add(map); - } - - public GT_HashSet(int initialCapacity, float loadFactor) { - map = new HashMap<>(initialCapacity, loadFactor); - GregTech_API.sItemStackMappings.add(map); - } - - public GT_HashSet(int initialCapacity) { - map = new HashMap<>(initialCapacity); - GregTech_API.sItemStackMappings.add(map); - } - - GT_HashSet(int initialCapacity, float loadFactor, boolean dummy) { - map = new LinkedHashMap<>(initialCapacity, loadFactor); - GregTech_API.sItemStackMappings.add(map); - } - - public Map getMap() { - return map; - } - - @SuppressWarnings("unchecked") // The downcasting below will throw ClassCastException unless E is GT_ItemStack. - @Override - public Iterator iterator() { - return (Iterator) map.keySet() - .iterator(); - } - - @Override - public int size() { - return map.size(); - } - - @Override - public boolean isEmpty() { - return map.isEmpty(); - } - - @Override - public boolean contains(Object o) { - return map.containsKey(o); - } - - public boolean add(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return false; - return map.put(new GT_ItemStack(aStack), OBJECT) == null; - } - - @Override - public boolean add(E e) { - return map.put(e, OBJECT) == null; - } - - @Override - public boolean remove(Object o) { - return map.remove(o) == OBJECT; - } - - @Override - public void clear() { - map.clear(); - } -} diff --git a/src/main/java/gregtech/api/objects/GT_ItemStack.java b/src/main/java/gregtech/api/objects/GT_ItemStack.java deleted file mode 100644 index 492655740d..0000000000 --- a/src/main/java/gregtech/api/objects/GT_ItemStack.java +++ /dev/null @@ -1,107 +0,0 @@ -package gregtech.api.objects; - -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.GT_Values; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.item.ItemHolder; -import it.unimi.dsi.fastutil.Hash; - -/** - * An optimization of {@link ItemStack} to have a better {@code hashcode} and {@code equals} in order to improve - * {@code HashMap} and {@code Set} performance - */ -public class GT_ItemStack extends ItemHolder { - - /** - * A better {@link Hash.Strategy} for {@link ItemStack}. Implementation originally from {@code GT_ItemStack2}. - */ - public static final Hash.Strategy ITEMSTACK_HASH_STRATEGY2 = new Hash.Strategy<>() { - - @Override - public int hashCode(ItemStack o) { - return o.getItem() - .hashCode() * 38197 + Items.feather.getDamage(o); - } - - @Override - public boolean equals(ItemStack a, ItemStack b) { - if (a == b) return true; - if (a == null || b == null) return false; - return a.getItem() == b.getItem() && Items.feather.getDamage(a) == Items.feather.getDamage(b); - } - }; - - public final Item mItem; - public final byte mStackSize; - public final short mMetaData; - - public GT_ItemStack(Item aItem, long aStackSize, long aMetaData) { - super(new ItemStack(aItem, 1, (int) aMetaData)); - mItem = aItem; - mStackSize = (byte) aStackSize; - mMetaData = (short) aMetaData; - } - - public GT_ItemStack(ItemStack aStack) { - this(aStack, false); - } - - public GT_ItemStack(ItemStack aStack, boolean wildcard) { - this( - aStack == null ? null : aStack.getItem(), - aStack == null ? 0 : aStack.stackSize, - aStack == null ? 0 : wildcard ? GT_Values.W : Items.feather.getDamage(aStack)); - } - - public GT_ItemStack(int aHashCode) { - this(GT_Utility.intToStack(aHashCode)); - } - - public final ItemStack toStack() { - if (mItem == null) return null; - return new ItemStack(mItem, 1, mMetaData); - } - - public final boolean isStackEqual(ItemStack aStack) { - return GT_Utility.areStacksEqual(toStack(), aStack); - } - - public final boolean isStackEqual(GT_ItemStack aStack) { - return GT_Utility.areStacksEqual(toStack(), aStack.toStack()); - } - - @Override - public boolean equals(Object aStack) { - if (aStack == this) return true; - if (aStack instanceof GT_ItemStack) { - return ((GT_ItemStack) aStack).mItem == mItem && ((GT_ItemStack) aStack).mMetaData == mMetaData; - } - return false; - } - - @Override - public int hashCode() { - return GT_Utility.stackToInt(toStack()); - } - - /** - * @see #internalCopyStack(ItemStack, boolean) - */ - public static ItemStack internalCopyStack(ItemStack aStack) { - return internalCopyStack(aStack, false); - } - - /** - * Replicates the copy behavior of {@link #toStack()} but for normal {@link ItemStack}s. - * - * @param aStack the stack to copy - * @param wildcard whether to use wildcard damage value - * @return a copy of the stack with stack size 1 and no NBT - */ - public static ItemStack internalCopyStack(ItemStack aStack, boolean wildcard) { - return new ItemStack(aStack.getItem(), 1, wildcard ? GT_Values.W : Items.feather.getDamage(aStack)); - } -} diff --git a/src/main/java/gregtech/api/objects/GT_ItemStack2.java b/src/main/java/gregtech/api/objects/GT_ItemStack2.java deleted file mode 100644 index aa93876830..0000000000 --- a/src/main/java/gregtech/api/objects/GT_ItemStack2.java +++ /dev/null @@ -1,41 +0,0 @@ -package gregtech.api.objects; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -/** - * GT_ItemStack, but with a better hashCode(). Due to this change, it should not be placed in the same hash based data - * structure with GT_ItemStack. It also shouldn't be used to construct search query into a hash based data structure - * that contains GT_ItemStack. - * - * @deprecated See {@link GT_ItemStack#ITEMSTACK_HASH_STRATEGY2} - */ -@Deprecated -public class GT_ItemStack2 extends GT_ItemStack { - - public GT_ItemStack2(Item aItem, long aStackSize, long aMetaData) { - super(aItem, aStackSize, aMetaData); - } - - public GT_ItemStack2(ItemStack aStack) { - super(aStack); - } - - public GT_ItemStack2(ItemStack aStack, boolean wildcard) { - super(aStack, wildcard); - } - - @Override - public boolean equals(Object aStack) { - if (aStack == this) return true; - if (aStack instanceof GT_ItemStack) { - return ((GT_ItemStack) aStack).mItem == mItem && ((GT_ItemStack) aStack).mMetaData == mMetaData; - } - return false; - } - - @Override - public int hashCode() { - return mItem.hashCode() * 38197 + mMetaData; - } -} diff --git a/src/main/java/gregtech/api/objects/GT_MultiTexture.java b/src/main/java/gregtech/api/objects/GT_MultiTexture.java deleted file mode 100644 index 9748ecb934..0000000000 --- a/src/main/java/gregtech/api/objects/GT_MultiTexture.java +++ /dev/null @@ -1,26 +0,0 @@ -package gregtech.api.objects; - -import gregtech.api.interfaces.ITexture; - -/** - *

- * Lets Multiple ITextures Render overlay over each other.< - *

- *

- * I should have done this much earlier... - *

- * - * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. - */ -@Deprecated -public class GT_MultiTexture extends gregtech.common.render.GT_MultiTexture implements ITexture { - - public GT_MultiTexture(ITexture... aTextures) { - super(aTextures); - } - - @Override - public boolean isOldTexture() { - return true; - } -} diff --git a/src/main/java/gregtech/api/objects/GT_RenderedTexture.java b/src/main/java/gregtech/api/objects/GT_RenderedTexture.java deleted file mode 100644 index bbb22e7d36..0000000000 --- a/src/main/java/gregtech/api/objects/GT_RenderedTexture.java +++ /dev/null @@ -1,33 +0,0 @@ -package gregtech.api.objects; - -import gregtech.api.enums.Dyes; -import gregtech.api.interfaces.IColorModulationContainer; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; - -@Deprecated -public class GT_RenderedTexture extends gregtech.common.render.GT_RenderedTexture - implements ITexture, IColorModulationContainer { - - @Deprecated - public short[] mRGBa; - - public GT_RenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) { - super(aIcon, aRGBa, aAllowAlpha, false, true, false); - if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture"); - mRGBa = aRGBa; - } - - public GT_RenderedTexture(IIconContainer aIcon, short[] aRGBa) { - this(aIcon, aRGBa, true); - } - - public GT_RenderedTexture(IIconContainer aIcon) { - this(aIcon, Dyes._NULL.mRGBa); - } - - @Override - public boolean isOldTexture() { - return true; - } -} diff --git a/src/main/java/gregtech/api/objects/GT_SidedTexture.java b/src/main/java/gregtech/api/objects/GT_SidedTexture.java deleted file mode 100644 index d042ebede9..0000000000 --- a/src/main/java/gregtech/api/objects/GT_SidedTexture.java +++ /dev/null @@ -1,48 +0,0 @@ -package gregtech.api.objects; - -import gregtech.api.enums.Dyes; -import gregtech.api.interfaces.IColorModulationContainer; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; - -/** - * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. - */ -@Deprecated -public class GT_SidedTexture extends gregtech.common.render.GT_SidedTexture - implements ITexture, IColorModulationContainer { - - @Deprecated - public short[] mRGBa; - - public GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3, - IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa, boolean aAllowAlpha) { - super(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, aRGBa, aAllowAlpha); - - // Backwards Compat - GT_SidedTexture.this.mRGBa = aRGBa; - } - - public GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3, - IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa) { - this(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, aRGBa, true); - } - - public GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3, - IIconContainer aIcon4, IIconContainer aIcon5) { - this(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, Dyes._NULL.mRGBa); - } - - public GT_SidedTexture(IIconContainer aBottom, IIconContainer aTop, IIconContainer aSides, short[] aRGBa) { - this(aBottom, aTop, aSides, aSides, aSides, aSides, aRGBa); - } - - public GT_SidedTexture(IIconContainer aBottom, IIconContainer aTop, IIconContainer aSides) { - this(aBottom, aTop, aSides, Dyes._NULL.mRGBa); - } - - @Override - public boolean isOldTexture() { - return true; - } -} diff --git a/src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java b/src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java deleted file mode 100644 index d4b8d16da6..0000000000 --- a/src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java +++ /dev/null @@ -1,46 +0,0 @@ -package gregtech.api.objects; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.Dyes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.util.LightingHelper; - -/** - * This ITexture implementation extends the GT_RenderedTexture class to render with bottom side flipped as with dumb - * blocks rendering. It is used in Ore blocks rendering so they better blends with dumb block ores from vanilla or other - * mods, when seen from bottom. - * - * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API. - */ -@Deprecated -public class GT_StdRenderedTexture extends GT_RenderedTexture { - - @SuppressWarnings("unused") - public GT_StdRenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) { - super(aIcon, aRGBa, aAllowAlpha); - } - - public GT_StdRenderedTexture(IIconContainer aIcon, short[] aRGBa) { - super(aIcon, aRGBa, true); - } - - @SuppressWarnings("unused") - public GT_StdRenderedTexture(IIconContainer aIcon) { - super(aIcon, Dyes._NULL.mRGBa); - } - - @Override - public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - LightingHelper lighting = new LightingHelper(aRenderer); - lighting.setupLightingYNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.DOWN, mRGBa); - aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, mIconContainer.getIcon()); - if (mIconContainer.getOverlayIcon() != null) { - lighting.setupColor(ForgeDirection.DOWN, 0xffffff); - aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, mIconContainer.getOverlayIcon()); - } - } -} diff --git a/src/main/java/gregtech/api/objects/GT_UO_Dimension.java b/src/main/java/gregtech/api/objects/GT_UO_Dimension.java deleted file mode 100644 index af82c35dab..0000000000 --- a/src/main/java/gregtech/api/objects/GT_UO_Dimension.java +++ /dev/null @@ -1,54 +0,0 @@ -package gregtech.api.objects; - -import java.util.Random; - -import net.minecraftforge.common.config.ConfigCategory; - -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - -public class GT_UO_Dimension { - - private final BiMap fFluids; - private int maxChance; - public String Dimension = "null"; - - public GT_UO_Dimension(ConfigCategory aConfigCategory) { // TODO CONFIGURE - fFluids = HashBiMap.create(); - if (aConfigCategory.containsKey("Dimension")) { - aConfigCategory.get("Dimension").comment = "Dimension ID or Class Name"; - Dimension = aConfigCategory.get("Dimension") - .getString(); - } - maxChance = 0; - // GT_FML_LOGGER.info("GT UO "+aConfigCategory.getName()+" Dimension:"+Dimension); - for (int i = 0; i < aConfigCategory.getChildren() - .size(); i++) { - GT_UO_Fluid fluid = new GT_UO_Fluid( - (ConfigCategory) aConfigCategory.getChildren() - .toArray()[i]); - fFluids.put(fluid.Registry, fluid); - maxChance += fluid.Chance; - } - } - - public GT_UO_Fluid getRandomFluid(Random aRandom) { - int random = aRandom.nextInt(1000); - for (BiMap.Entry fl : fFluids.entrySet()) { - int chance = fl.getValue().Chance * 1000 / maxChance; - if (random <= chance) return fl.getValue(); - // GT_FML_LOGGER.info("GT UO "+fl.getValue().Registry+" Chance:"+chance+" Random:"+random); - random -= chance; - } - return null; - } - - public String getUOFluidKey(GT_UO_Fluid uoFluid) { - return fFluids.inverse() - .get(uoFluid); - } - - public GT_UO_Fluid getUOFluid(String key) { - return fFluids.get(key); - } -} diff --git a/src/main/java/gregtech/api/objects/GT_UO_DimensionList.java b/src/main/java/gregtech/api/objects/GT_UO_DimensionList.java deleted file mode 100644 index f057614ccf..0000000000 --- a/src/main/java/gregtech/api/objects/GT_UO_DimensionList.java +++ /dev/null @@ -1,648 +0,0 @@ -package gregtech.api.objects; - -import static gregtech.api.enums.Dimensions.AlphaCentauriBb; -import static gregtech.api.enums.Dimensions.BarnardaC; -import static gregtech.api.enums.Dimensions.BarnardaE; -import static gregtech.api.enums.Dimensions.BarnardaF; -import static gregtech.api.enums.Dimensions.Callisto; -import static gregtech.api.enums.Dimensions.Europa; -import static gregtech.api.enums.Dimensions.Io; -import static gregtech.api.enums.Dimensions.Makemake; -import static gregtech.api.enums.Dimensions.Mars; -import static gregtech.api.enums.Dimensions.Mercury; -import static gregtech.api.enums.Dimensions.Miranda; -import static gregtech.api.enums.Dimensions.Moon; -import static gregtech.api.enums.Dimensions.Oberon; -import static gregtech.api.enums.Dimensions.Overworld; -import static gregtech.api.enums.Dimensions.Pluto; -import static gregtech.api.enums.Dimensions.Proteus; -import static gregtech.api.enums.Dimensions.Ross128b; -import static gregtech.api.enums.Dimensions.Ross128ba; -import static gregtech.api.enums.Dimensions.TCetiE; -import static gregtech.api.enums.Dimensions.Titan; -import static gregtech.api.enums.Dimensions.Triton; -import static gregtech.api.enums.Dimensions.Venus; -import static gregtech.api.enums.UndergroundFluidNames.carbonDioxide; -import static gregtech.api.enums.UndergroundFluidNames.carbonMonoxide; -import static gregtech.api.enums.UndergroundFluidNames.chlorobenzene; -import static gregtech.api.enums.UndergroundFluidNames.deuterium; -import static gregtech.api.enums.UndergroundFluidNames.distilledWater; -import static gregtech.api.enums.UndergroundFluidNames.ethane; -import static gregtech.api.enums.UndergroundFluidNames.ethylene; -import static gregtech.api.enums.UndergroundFluidNames.fluorine; -import static gregtech.api.enums.UndergroundFluidNames.heavyOil; -import static gregtech.api.enums.UndergroundFluidNames.helium3; -import static gregtech.api.enums.UndergroundFluidNames.hydrofluoricAcid; -import static gregtech.api.enums.UndergroundFluidNames.hydrogen; -import static gregtech.api.enums.UndergroundFluidNames.hydrogenSulfide; -import static gregtech.api.enums.UndergroundFluidNames.lava; -import static gregtech.api.enums.UndergroundFluidNames.lightOil; -import static gregtech.api.enums.UndergroundFluidNames.liquidAir; -import static gregtech.api.enums.UndergroundFluidNames.mediumOil; -import static gregtech.api.enums.UndergroundFluidNames.methane; -import static gregtech.api.enums.UndergroundFluidNames.moltenCopper; -import static gregtech.api.enums.UndergroundFluidNames.moltenIron; -import static gregtech.api.enums.UndergroundFluidNames.moltenLead; -import static gregtech.api.enums.UndergroundFluidNames.moltenTin; -import static gregtech.api.enums.UndergroundFluidNames.naturalGas; -import static gregtech.api.enums.UndergroundFluidNames.nitrogen; -import static gregtech.api.enums.UndergroundFluidNames.oil; -import static gregtech.api.enums.UndergroundFluidNames.oxygen; -import static gregtech.api.enums.UndergroundFluidNames.saltWater; -import static gregtech.api.enums.UndergroundFluidNames.sulfuricAcid; -import static gregtech.api.enums.UndergroundFluidNames.unknownWater; -import static gregtech.api.enums.UndergroundFluidNames.veryHeavyOil; - -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.config.ConfigCategory; -import net.minecraftforge.common.config.Configuration; - -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - -import gregtech.api.enums.Dimensions; -import gregtech.api.enums.UndergroundFluidNames; - -public class GT_UO_DimensionList { - - private Configuration fConfig; - private String fCategory; - private final BiMap fDimensionList; - - public int[] blackList = new int[0]; - - public GT_UO_DimensionList() { - fDimensionList = HashBiMap.create(); - } - - public void save() { - fConfig.save(); - } - - public GT_UO_Dimension GetDimension(int aDimension) { - if (CheckBlackList(aDimension)) return null; - if (fDimensionList.containsKey(Integer.toString(aDimension))) - return fDimensionList.get(Integer.toString(aDimension)); - for (BiMap.Entry dl : fDimensionList.entrySet()) - if (DimensionManager.getProvider(aDimension) - .getClass() - .getName() - .contains(dl.getValue().Dimension)) return dl.getValue(); - return fDimensionList.get("Default"); - } - - private boolean CheckBlackList(int aDimensionId) { - try { - return java.util.Arrays.binarySearch(blackList, aDimensionId) >= 0; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - public void SetConfigValues(String aDimensionName, String aDimension, String aName, String aRegistry, - int aMinAmount, int aMaxAmount, int aChance, int aDecreasePerOperationAmount) { - String Category = fCategory + "." + aDimensionName; - fConfig.get(Category, "Dimension", aDimension) - .getString(); - Category += "." + aName; - fConfig.get(Category, "Registry", aRegistry) - .getString(); - fConfig.get(Category, "MinAmount", aMinAmount) - .getInt(aMinAmount); - fConfig.get(Category, "MaxAmount", aMaxAmount) - .getInt(aMaxAmount); - fConfig.get(Category, "Chance", aChance) - .getInt(aChance); - fConfig.get(Category, "DecreasePerOperationAmount", aDecreasePerOperationAmount) - .getInt(aDecreasePerOperationAmount); - // IT IS IN BUCKETS!!! - } - - private void setOverworldValues() { - new ConfigSetter().dimension(Overworld) - .fluid(naturalGas) - .chance(20) - .decreaseAmount(5) - .maxAmount(350) - .minAmount(10) - .writeToConfig(); - - new ConfigSetter().dimension(Overworld) - .fluid(lightOil) - .chance(20) - .decreaseAmount(5) - .maxAmount(350) - .minAmount(10) - .writeToConfig(); - - new ConfigSetter().dimension(Overworld) - .fluid(mediumOil) - .chance(20) - .decreaseAmount(5) - .maxAmount(625) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Overworld) - .fluid(heavyOil) - .chance(20) - .decreaseAmount(5) - .maxAmount(625) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Overworld) - .fluid(oil) - .chance(20) - .decreaseAmount(5) - .maxAmount(625) - .minAmount(0) - .writeToConfig(); - } - - private void setMoonValues() { - new ConfigSetter().dimension(Moon) - .fluid(helium3) - .chance(100) - .decreaseAmount(5) - .maxAmount(425) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Moon) - .fluid(saltWater) - .chance(20) - .decreaseAmount(5) - .maxAmount(200) - .minAmount(0) - .writeToConfig(); - } - - private void setMercuryValues() { - new ConfigSetter().dimension(Mercury) - .fluid(helium3) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Mercury) - .fluid(moltenIron) - .chance(30) - .decreaseAmount(5) - .maxAmount(400) - .minAmount(0) - .writeToConfig(); - } - - private void setVenusValues() { - new ConfigSetter().dimension(Venus) - .fluid(moltenLead) - .chance(100) - .decreaseAmount(5) - .maxAmount(1600) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Venus) - .fluid(sulfuricAcid) - .chance(100) - .decreaseAmount(5) - .maxAmount(250) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Venus) - .fluid(carbonDioxide) - .chance(100) - .decreaseAmount(5) - .maxAmount(1500) - .minAmount(0) - .writeToConfig(); - } - - private void setMarsValues() { - new ConfigSetter().dimension(Mars) - .fluid(saltWater) - .chance(100) - .decreaseAmount(5) - .maxAmount(400) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Mars) - .fluid(chlorobenzene) - .chance(100) - .decreaseAmount(5) - .maxAmount(400) - .minAmount(0) - .writeToConfig(); - } - - private void setIoValues() { - new ConfigSetter().dimension(Io) - .fluid(moltenLead) - .chance(20) - .decreaseAmount(5) - .maxAmount(650) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Io) - .fluid(sulfuricAcid) - .chance(80) - .decreaseAmount(5) - .maxAmount(350) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Io) - .fluid(carbonDioxide) - .chance(80) - .decreaseAmount(5) - .maxAmount(750) - .minAmount(0) - .writeToConfig(); - } - - private void setEuropaValues() { - new ConfigSetter().dimension(Europa) - .fluid(saltWater) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Europa) - .fluid(veryHeavyOil) - .chance(20) - .decreaseAmount(5) - .maxAmount(200) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Europa) - .fluid(distilledWater) - .chance(80) - .decreaseAmount(5) - .maxAmount(3500) - .minAmount(0) - .writeToConfig(); - } - - private void setCallistoValues() { - new ConfigSetter().dimension(Callisto) - .fluid(oxygen) - .chance(100) - .decreaseAmount(5) - .maxAmount(200) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Callisto) - .fluid(liquidAir) - .chance(100) - .decreaseAmount(5) - .maxAmount(200) - .minAmount(0) - .writeToConfig(); - } - - private void setTitanValues() { - new ConfigSetter().dimension(Titan) - .fluid(methane) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Titan) - .fluid(ethane) - .chance(100) - .decreaseAmount(5) - .maxAmount(200) - .minAmount(0) - .writeToConfig(); - } - - private void setMirandaValues() { - new ConfigSetter().dimension(Miranda) - .fluid(hydrogenSulfide) - .chance(100) - .decreaseAmount(5) - .maxAmount(900) - .minAmount(0) - .writeToConfig(); - } - - private void setOberonValues() { - new ConfigSetter().dimension(Oberon) - .fluid(carbonMonoxide) - .chance(100) - .decreaseAmount(5) - .maxAmount(2000) - .minAmount(0) - .writeToConfig(); - } - - private void setTritonValues() { - new ConfigSetter().dimension(Triton) - .fluid(nitrogen) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Triton) - .fluid(ethylene) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - } - - private void setProteusValues() { - new ConfigSetter().dimension(Proteus) - .fluid(deuterium) - .chance(100) - .decreaseAmount(5) - .maxAmount(700) - .minAmount(0) - .writeToConfig(); - } - - private void setPlutoValues() { - new ConfigSetter().dimension(Pluto) - .fluid(nitrogen) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Pluto) - .fluid(oxygen) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Pluto) - .fluid(liquidAir) - .chance(40) - .decreaseAmount(5) - .maxAmount(300) - .minAmount(4) - .writeToConfig(); - - new ConfigSetter().dimension(Pluto) - .fluid(fluorine) - .chance(80) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(4) - .writeToConfig(); - } - - private void setMakeMakeValues() { - new ConfigSetter().dimension(Makemake) - .fluid(hydrofluoricAcid) - .chance(80) - .decreaseAmount(5) - .maxAmount(300) - .minAmount(0) - .writeToConfig(); - } - - private void setAlphaCentauriBBValues() { - new ConfigSetter().dimension(AlphaCentauriBb) - .fluid(moltenCopper) - .chance(10) - .decreaseAmount(5) - .maxAmount(300) - .minAmount(0) - .writeToConfig(); - } - - private void setBarnardaCValues() { - new ConfigSetter().dimension(BarnardaC) - .fluid(veryHeavyOil) - .chance(100) - .decreaseAmount(5) - .maxAmount(800) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(BarnardaC) - .fluid(unknownWater) - .chance(100) - .decreaseAmount(5) - .maxAmount(300) - .minAmount(0) - .writeToConfig(); - } - - private void setBarnardaEValues() { - new ConfigSetter().dimension(BarnardaE) - .fluid(liquidAir) - .chance(20) - .decreaseAmount(5) - .maxAmount(400) - .minAmount(0) - .writeToConfig(); - } - - private void setBarnardaFValues() { - new ConfigSetter().dimension(BarnardaF) - .fluid(moltenTin) - .chance(15) - .decreaseAmount(5) - .maxAmount(400) - .minAmount(0) - .writeToConfig(); - } - - private void setTcetiEValues() { - new ConfigSetter().dimension(TCetiE) - .fluid(veryHeavyOil) - .chance(100) - .decreaseAmount(5) - .maxAmount(200) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(TCetiE) - .fluid(hydrogen) - .chance(50) - .decreaseAmount(5) - .maxAmount(700) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(TCetiE) - .fluid(distilledWater) - .chance(100) - .decreaseAmount(5) - .maxAmount(10_000) - .minAmount(0) - .writeToConfig(); - } - - private void setRoss128bValues() { - new ConfigSetter().dimension(Ross128b) - .fluid(veryHeavyOil) - .chance(40) - .decreaseAmount(5) - .maxAmount(625) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Ross128b) - .fluid(lava) - .chance(5) - .decreaseAmount(5) - .maxAmount(820) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Ross128b) - .fluid(naturalGas) - .chance(65) - .decreaseAmount(5) - .maxAmount(625) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Ross128b) - .fluid(distilledWater) - .chance(100) - .decreaseAmount(5) - .maxAmount(5000) - .minAmount(0) - .writeToConfig(); - } - - private void setRoss128baValues() { - new ConfigSetter().dimension(Ross128ba) - .fluid(saltWater) - .chance(40) - .decreaseAmount(5) - .maxAmount(1250) - .minAmount(0) - .writeToConfig(); - - new ConfigSetter().dimension(Ross128ba) - .fluid(helium3) - .chance(60) - .decreaseAmount(5) - .maxAmount(1250) - .minAmount(0) - .writeToConfig(); - } - - public void setDefaultValues() { - setOverworldValues(); - setMoonValues(); - setMercuryValues(); - setVenusValues(); - setMarsValues(); - setIoValues(); - setEuropaValues(); - setCallistoValues(); - setTitanValues(); - setMirandaValues(); - setOberonValues(); - setTritonValues(); - setProteusValues(); - setPlutoValues(); - setMakeMakeValues(); - setAlphaCentauriBBValues(); - setBarnardaCValues(); - setBarnardaEValues(); - setBarnardaFValues(); - setTcetiEValues(); - setRoss128bValues(); - setRoss128baValues(); - } - - public void getConfig(Configuration aConfig, String aCategory) { - fCategory = aCategory; - fConfig = aConfig; - if (!fConfig.hasCategory(fCategory)) setDefaultValues(); - - blackList = new int[] { -1, 1 }; - blackList = aConfig.get(fCategory, "DimBlackList", blackList, "Dimension IDs Black List") - .getIntList(); - java.util.Arrays.sort(blackList); - - for (int i = 0; i < fConfig.getCategory(fCategory) - .getChildren() - .size(); i++) { - GT_UO_Dimension Dimension = new GT_UO_Dimension( - (ConfigCategory) fConfig.getCategory(fCategory) - .getChildren() - .toArray()[i]); - fDimensionList.put(Dimension.Dimension, Dimension); - } - save(); - } - - public class ConfigSetter { - - private int chance; - private int decreaseAmount; - private int maxAmount; - private int minAmount; - private UndergroundFluidNames fluid; - private Dimensions dim; - - public ConfigSetter chance(int chance) { - this.chance = chance; - return this; - } - - public ConfigSetter decreaseAmount(int decreaseAmount) { - this.decreaseAmount = decreaseAmount; - return this; - } - - public ConfigSetter maxAmount(int maxAmount) { - this.maxAmount = maxAmount; - return this; - } - - public ConfigSetter minAmount(int minAmount) { - this.minAmount = minAmount; - return this; - } - - public ConfigSetter fluid(UndergroundFluidNames fluid) { - this.fluid = fluid; - return this; - } - - public ConfigSetter dimension(Dimensions dim) { - this.dim = dim; - return this; - } - - public void writeToConfig() { - SetConfigValues( - dim.toString(), - dim.id, - fluid.toString(), - fluid.name, - minAmount, - maxAmount, - chance, - decreaseAmount); - } - } -} diff --git a/src/main/java/gregtech/api/objects/GT_UO_Fluid.java b/src/main/java/gregtech/api/objects/GT_UO_Fluid.java deleted file mode 100644 index 7f9898e02e..0000000000 --- a/src/main/java/gregtech/api/objects/GT_UO_Fluid.java +++ /dev/null @@ -1,69 +0,0 @@ -package gregtech.api.objects; - -import static gregtech.common.GT_UndergroundOil.DIVIDER; - -import java.util.Random; - -import net.minecraftforge.common.config.ConfigCategory; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; - -public class GT_UO_Fluid { - - public String Registry = "null"; - public int MaxAmount = 0; - public int MinAmount = 0; - public int Chance = 0; - public int DecreasePerOperationAmount = 5; - - public GT_UO_Fluid(ConfigCategory aConfigCategory) { // TODO CONFIGURE - if (aConfigCategory.containsKey("Registry")) { - aConfigCategory.get("Registry").comment = "Fluid registry name"; - Registry = aConfigCategory.get("Registry") - .getString(); - } - if (aConfigCategory.containsKey("MaxAmount")) { - aConfigCategory - .get("MaxAmount").comment = "Max amount generation (per operation, sets the VeinData) 80000 MAX"; - MaxAmount = aConfigCategory.get("MaxAmount") - .getInt(0); - } - if (aConfigCategory.containsKey("MinAmount")) { - aConfigCategory.get("MinAmount").comment = "Min amount generation (per operation, sets the VeinData) 0 MIN"; - MinAmount = aConfigCategory.get("MinAmount") - .getInt(0); - } - if (aConfigCategory.containsKey("Chance")) { - aConfigCategory - .get("Chance").comment = "Chance generating (weighted chance!, there will be a fluid in chunk always!)"; - Chance = aConfigCategory.get("Chance") - .getInt(0); - } - if (aConfigCategory.containsKey("DecreasePerOperationAmount")) { - aConfigCategory.get( - "DecreasePerOperationAmount").comment = "Decrease per operation (actual fluid gained works like (Litre)VeinData/5000)"; - DecreasePerOperationAmount = aConfigCategory.get("DecreasePerOperationAmount") - .getInt(5); - } - // GT_FML_LOGGER.info("GT UO "+aConfigCategory.getName()+" Fluid:"+Registry+" Max:"+MaxAmount+" - // Min:"+MinAmount+" Chance:"+Chance); - } - - public Fluid getFluid() { - try { - return FluidRegistry.getFluid(this.Registry); - } catch (Exception e) { - return null; - } - } - - public int getRandomAmount(Random aRandom) { // generates some random ass number that correlates to extraction - // speeds - int smax = (int) Math.floor(Math.pow(MaxAmount * 100.d * DIVIDER, 0.2d)); // use scaled max and min values for - // the randomness to make high values - // more rare. - double smin = Math.pow(MinAmount * 100.d * DIVIDER, 0.2d); - double samount = Math.max(smin, aRandom.nextInt(smax) + aRandom.nextDouble()); - return (int) (Math.pow(samount, 5) / 100); // reverses the computation above - } -} diff --git a/src/main/java/gregtech/api/objects/ItemData.java b/src/main/java/gregtech/api/objects/ItemData.java index 779e45ac8b..071b09a55f 100644 --- a/src/main/java/gregtech/api/objects/ItemData.java +++ b/src/main/java/gregtech/api/objects/ItemData.java @@ -13,7 +13,7 @@ public class ItemData { private static final MaterialStack[] EMPTY_MATERIALSTACK_ARRAY = new MaterialStack[0]; - public final List mExtraData = new GT_ArrayList<>(false, 1); + public final List mExtraData = new GTArrayList<>(false, 1); public final OrePrefixes mPrefix; public final MaterialStack mMaterial; public final MaterialStack[] mByProducts; diff --git a/src/main/java/gregtech/api/objects/MaterialStack.java b/src/main/java/gregtech/api/objects/MaterialStack.java index 0a433e0d99..742c210901 100644 --- a/src/main/java/gregtech/api/objects/MaterialStack.java +++ b/src/main/java/gregtech/api/objects/MaterialStack.java @@ -1,7 +1,7 @@ package gregtech.api.objects; import gregtech.api.enums.Materials; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class MaterialStack implements Cloneable { @@ -44,7 +44,7 @@ public class MaterialStack implements Cloneable { public String toString(boolean single) { String temp1 = "", temp2 = mMaterial.getToolTip(true), temp3 = "", temp4 = ""; if (mAmount > 1) { - temp4 = GT_Utility.toSubscript(mAmount); + temp4 = GTUtility.toSubscript(mAmount); } if ((!single || mAmount > 1) && isMaterialListComplex(this)) { temp1 = "("; diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java index 1e29e2d812..6f73b5467a 100644 --- a/src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java +++ b/src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java @@ -1,13 +1,13 @@ package gregtech.api.objects.overclockdescriber; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import javax.annotation.ParametersAreNonnullByDefault; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.api.util.OverclockCalculator; import gregtech.nei.RecipeDisplayInfo; @ParametersAreNonnullByDefault @@ -28,13 +28,13 @@ public class EUNoOverclockDescriber extends OverclockDescriber { } @Override - public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) { - return GT_OverclockCalculator.ofNoOverclock(recipe); + public OverclockCalculator createCalculator(OverclockCalculator template, GTRecipe recipe) { + return OverclockCalculator.ofNoOverclock(recipe); } @Override public String getTierString() { - return GT_Utility.getColoredTierNameFromTier(tier); + return GTUtility.getColoredTierNameFromTier(tier); } @Override @@ -60,48 +60,48 @@ public class EUNoOverclockDescriber extends OverclockDescriber { } } - protected String getTotalPowerString(GT_OverclockCalculator calculator) { - return GT_Utility.formatNumbers(calculator.getConsumption() * calculator.getDuration()) + " EU"; + protected String getTotalPowerString(OverclockCalculator calculator) { + return GTUtility.formatNumbers(calculator.getConsumption() * calculator.getDuration()) + " EU"; } /** * @return If amperage should be shown on NEI. */ - protected boolean shouldShowAmperage(GT_OverclockCalculator calculator) { + protected boolean shouldShowAmperage(OverclockCalculator calculator) { return amperage != 1; } /** * @return Whole EU/t usage, without tier display. */ - protected String getEUtWithoutTier(GT_OverclockCalculator calculator) { - return GT_Utility.formatNumbers(calculator.getConsumption()) + " EU/t"; + protected String getEUtWithoutTier(OverclockCalculator calculator) { + return GTUtility.formatNumbers(calculator.getConsumption()) + " EU/t"; } /** * @return Whole EU/t usage, with tier display. */ - protected String getEUtWithTier(GT_OverclockCalculator calculator) { - return getEUtWithoutTier(calculator) + GT_Utility.getTierNameWithParentheses(calculator.getConsumption()); + protected String getEUtWithTier(OverclockCalculator calculator) { + return getEUtWithoutTier(calculator) + GTUtility.getTierNameWithParentheses(calculator.getConsumption()); } /** * @return Whole EU/t usage. Also displays voltage tier if it should be shown. */ - protected String getEUtDisplay(GT_OverclockCalculator calculator) { + protected String getEUtDisplay(OverclockCalculator calculator) { return shouldShowAmperage(calculator) ? getEUtWithoutTier(calculator) : getEUtWithTier(calculator); } /** * @return EU/t usage, divided by amperage. With tier display. */ - protected String getVoltageString(GT_OverclockCalculator calculator) { + protected String getVoltageString(OverclockCalculator calculator) { long voltage = computeVoltageForEURate(calculator.getConsumption()); - return GT_Utility.formatNumbers(voltage) + " EU/t" + GT_Utility.getTierNameWithParentheses(voltage); + return GTUtility.formatNumbers(voltage) + " EU/t" + GTUtility.getTierNameWithParentheses(voltage); } - protected String getAmperageString(GT_OverclockCalculator calculator) { - return GT_Utility.formatNumbers(amperage); + protected String getAmperageString(OverclockCalculator calculator) { + return GTUtility.formatNumbers(amperage); } protected long computeVoltageForEURate(long euPerTick) { diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java index 9d53711515..42b459e874 100644 --- a/src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java +++ b/src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java @@ -1,17 +1,17 @@ package gregtech.api.objects.overclockdescriber; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.util.GTUtility.trans; import javax.annotation.ParametersAreNonnullByDefault; import com.google.common.primitives.Ints; -import gregtech.GT_Mod; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.GTMod; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.api.util.OverclockCalculator; import gregtech.nei.RecipeDisplayInfo; @ParametersAreNonnullByDefault @@ -23,7 +23,7 @@ public class EUOverclockDescriber extends EUNoOverclockDescriber { } @Override - public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) { + public OverclockCalculator createCalculator(OverclockCalculator template, GTRecipe recipe) { return template.setEUt(Ints.saturatedCast(V[tier] * amperage)); } @@ -38,9 +38,9 @@ public class EUOverclockDescriber extends EUNoOverclockDescriber { if (shouldShowAmperage(recipeInfo.calculator)) { recipeInfo.drawText(trans("154", "Voltage: ") + getVoltageString(recipeInfo.calculator)); } - if (GT_Mod.gregtechproxy.mNEIOriginalVoltage) { + if (GTMod.gregtechproxy.mNEIOriginalVoltage) { EUNoOverclockDescriber originalPower = new EUNoOverclockDescriber(tier, amperage); - GT_OverclockCalculator originalPowerCalculator = GT_OverclockCalculator.ofNoOverclock(recipeInfo.recipe) + OverclockCalculator originalPowerCalculator = OverclockCalculator.ofNoOverclock(recipeInfo.recipe) .calculate(); recipeInfo .drawText(trans("275", "Original usage: ") + originalPower.getEUtDisplay(originalPowerCalculator)); @@ -51,30 +51,30 @@ public class EUOverclockDescriber extends EUNoOverclockDescriber { } @Override - protected String getEUtWithoutTier(GT_OverclockCalculator calculator) { + protected String getEUtWithoutTier(OverclockCalculator calculator) { return decorateWithOverclockLabel(super.getEUtWithoutTier(calculator), calculator); } @Override - protected String getEUtWithTier(GT_OverclockCalculator calculator) { - return this.getEUtWithoutTier(calculator) + GT_Utility.getTierNameWithParentheses(calculator.getConsumption()); + protected String getEUtWithTier(OverclockCalculator calculator) { + return this.getEUtWithoutTier(calculator) + GTUtility.getTierNameWithParentheses(calculator.getConsumption()); } @Override - protected String getVoltageString(GT_OverclockCalculator calculator) { + protected String getVoltageString(OverclockCalculator calculator) { long voltage = computeVoltageForEURate(calculator.getConsumption()); - return decorateWithOverclockLabel(GT_Utility.formatNumbers(voltage) + " EU/t", calculator) - + GT_Utility.getTierNameWithParentheses(voltage); + return decorateWithOverclockLabel(GTUtility.formatNumbers(voltage) + " EU/t", calculator) + + GTUtility.getTierNameWithParentheses(voltage); } - protected String decorateWithOverclockLabel(String s, GT_OverclockCalculator calculator) { + protected String decorateWithOverclockLabel(String s, OverclockCalculator calculator) { if (wasOverclocked(calculator)) { s += " (OC)"; } return s; } - protected boolean wasOverclocked(GT_OverclockCalculator calculator) { + protected boolean wasOverclocked(OverclockCalculator calculator) { return calculator.getPerformedOverclocks() > 0; } } diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java index b570ebcab5..019af073f0 100644 --- a/src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java +++ b/src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java @@ -4,11 +4,11 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.util.EnumChatFormatting; -import gregtech.api.enums.GT_Values; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.enums.GTValues; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.api.util.OverclockCalculator; import gregtech.nei.formatter.FusionSpecialValueFormatter; @ParametersAreNonnullByDefault @@ -23,7 +23,7 @@ public class FusionOverclockDescriber extends EUOverclockDescriber { } @Override - public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) { + public OverclockCalculator createCalculator(OverclockCalculator template, GTRecipe recipe) { return super.createCalculator(template, recipe) .limitOverclockCount(overclock(recipe.mSpecialValue, recipe.mEUt)) .setEUtIncreasePerOC(getEUtIncreasePerOC()) @@ -40,12 +40,12 @@ public class FusionOverclockDescriber extends EUOverclockDescriber { @Override public String getTierString() { - return GT_Values.TIER_COLORS[tier] + "MK " + getFusionTier() + EnumChatFormatting.RESET; + return GTValues.TIER_COLORS[tier] + "MK " + getFusionTier() + EnumChatFormatting.RESET; } @Override - public boolean canHandle(GT_Recipe recipe) { - byte tier = GT_Utility.getTier(recipe.mEUt); + public boolean canHandle(GTRecipe recipe) { + byte tier = GTUtility.getTier(recipe.mEUt); if (this.tier < tier) { return false; } diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java index 0b253c95fa..9f995e4758 100644 --- a/src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java +++ b/src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java @@ -1,14 +1,14 @@ package gregtech.api.objects.overclockdescriber; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import javax.annotation.ParametersAreNonnullByDefault; -import gregtech.GT_Mod; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.GTMod; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.api.util.OverclockCalculator; import gregtech.nei.RecipeDisplayInfo; /** @@ -45,12 +45,12 @@ public abstract class OverclockDescriber { /** * Creates overclock calculator from given template. This template should be used instead of building from the * ground to avoid issues coming from different caller using different templates, but it's not applicable when using - * {@link GT_OverclockCalculator#ofNoOverclock(GT_Recipe)}. + * {@link OverclockCalculator#ofNoOverclock(GTRecipe)}. * * @param template Calculator that can be used as template. Recipe EU/t and duration are already set. * @param recipe Recipe to calculate. */ - public abstract GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe); + public abstract OverclockCalculator createCalculator(OverclockCalculator template, GTRecipe recipe); /** * Draws info about the energy this object can handle on NEI recipe GUI. @@ -61,7 +61,7 @@ public abstract class OverclockDescriber { if (getDurationTicks(recipeInfo.calculator) <= 0) return; String textToDraw = trans("158", "Time: "); - if (GT_Mod.gregtechproxy.mNEIRecipeSecondMode) { + if (GTMod.gregtechproxy.mNEIRecipeSecondMode) { textToDraw += getDurationStringSeconds(recipeInfo.calculator); if (getDurationSeconds(recipeInfo.calculator) <= 1.0d) { textToDraw += String.format(" (%s)", getDurationStringTicks(recipeInfo.calculator)); @@ -81,26 +81,26 @@ public abstract class OverclockDescriber { * * @return If this object can handle the supplied recipe */ - public boolean canHandle(GT_Recipe recipe) { - byte tier = GT_Utility.getTier(recipe.mEUt); + public boolean canHandle(GTRecipe recipe) { + byte tier = GTUtility.getTier(recipe.mEUt); return this.tier >= tier; } - private int getDurationTicks(GT_OverclockCalculator calculator) { + private int getDurationTicks(OverclockCalculator calculator) { return calculator.getDuration(); } - private double getDurationSeconds(GT_OverclockCalculator calculator) { + private double getDurationSeconds(OverclockCalculator calculator) { return 0.05d * getDurationTicks(calculator); } - private String getDurationStringSeconds(GT_OverclockCalculator calculator) { - return GT_Utility.formatNumbers(getDurationSeconds(calculator)) + GT_Utility.trans("161", " secs"); + private String getDurationStringSeconds(OverclockCalculator calculator) { + return GTUtility.formatNumbers(getDurationSeconds(calculator)) + GTUtility.trans("161", " secs"); } - private String getDurationStringTicks(GT_OverclockCalculator calculator) { - String ticksString = getDurationTicks(calculator) == 1 ? GT_Utility.trans("209.1", " tick") - : GT_Utility.trans("209", " ticks"); - return GT_Utility.formatNumbers(getDurationTicks(calculator)) + ticksString; + private String getDurationStringTicks(OverclockCalculator calculator) { + String ticksString = getDurationTicks(calculator) == 1 ? GTUtility.trans("209.1", " tick") + : GTUtility.trans("209", " ticks"); + return GTUtility.formatNumbers(getDurationTicks(calculator)) + ticksString; } } diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java index 5da64d4028..3a2da01b08 100644 --- a/src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java +++ b/src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java @@ -1,16 +1,16 @@ package gregtech.api.objects.overclockdescriber; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.util.StatCollector; import gregtech.api.enums.SteamVariant; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.api.util.OverclockCalculator; import gregtech.nei.RecipeDisplayInfo; @ParametersAreNonnullByDefault @@ -34,8 +34,8 @@ public class SteamOverclockDescriber extends OverclockDescriber { } @Override - public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) { - return GT_OverclockCalculator.ofNoOverclock(recipe) + public OverclockCalculator createCalculator(OverclockCalculator template, GTRecipe recipe) { + return OverclockCalculator.ofNoOverclock(recipe) .setEUtDiscount(euPerTickMultiplier) .setSpeedBoost(durationMultiplier); } @@ -48,13 +48,13 @@ public class SteamOverclockDescriber extends OverclockDescriber { recipeInfo.drawText(trans("153", "Usage: ") + getSteamUsageString(recipeInfo.calculator)); } - private String getTotalPowerString(GT_OverclockCalculator calculator) { - return GT_Utility.formatNumbers(convertEUToSteam(calculator.getConsumption() * calculator.getDuration())) + private String getTotalPowerString(OverclockCalculator calculator) { + return GTUtility.formatNumbers(convertEUToSteam(calculator.getConsumption() * calculator.getDuration())) + " Steam"; } - private String getSteamUsageString(GT_OverclockCalculator calculator) { - return GT_Utility.formatNumbers(20 * convertEUToSteam(calculator.getConsumption())) + " L/s Steam"; + private String getSteamUsageString(OverclockCalculator calculator) { + return GTUtility.formatNumbers(20 * convertEUToSteam(calculator.getConsumption())) + " L/s Steam"; } private static long convertEUToSteam(long eu) { diff --git a/src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java b/src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java index 7be2c94b23..adb2ee40e8 100644 --- a/src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java +++ b/src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java @@ -20,7 +20,7 @@ import com.gtnewhorizons.modularui.api.math.Size; import com.gtnewhorizons.modularui.common.widget.ProgressBar; import gregtech.api.gui.modularui.FallbackableSteamTexture; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.gui.modularui.SteamTexture; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.common.gui.modularui.UIHelper; @@ -59,7 +59,7 @@ public final class BasicUIPropertiesBuilder { private final ImmutableList.Builder>> specialTexturesSteam = ImmutableList .builder(); - private IDrawable logo = GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT; + private IDrawable logo = GTUITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT; private Size logoSize = new Size(17, 17); private Pos2d logoPos = new Pos2d(152, 63); diff --git a/src/main/java/gregtech/api/recipe/FindRecipeQuery.java b/src/main/java/gregtech/api/recipe/FindRecipeQuery.java index 77c0648688..16702b6be6 100644 --- a/src/main/java/gregtech/api/recipe/FindRecipeQuery.java +++ b/src/main/java/gregtech/api/recipe/FindRecipeQuery.java @@ -9,7 +9,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; // spotless:off spotless likes formatting @code to @code @@ -20,7 +20,7 @@ import gregtech.api.util.MethodsReturnNonnullByDefault; * *
  * {@code
- *     GT_Recipe recipe = recipeMap.findRecipeQuery()
+ *     GTRecipe recipe = recipeMap.findRecipeQuery()
  *         .items(inputItems)
  *         .fluids(inputFluids)
  *         .find();
@@ -33,7 +33,7 @@ import gregtech.api.util.MethodsReturnNonnullByDefault;
 @MethodsReturnNonnullByDefault
 public final class FindRecipeQuery {
 
-    private static final Predicate ALWAYS = r -> true;
+    private static final Predicate ALWAYS = r -> true;
 
     private final RecipeMap recipeMap;
 
@@ -43,10 +43,10 @@ public final class FindRecipeQuery {
     private FluidStack[] fluids;
     @Nullable
     private ItemStack specialSlot;
-    private Predicate filter = ALWAYS;
+    private Predicate filter = ALWAYS;
     private long voltage = Integer.MAX_VALUE;
     @Nullable
-    private GT_Recipe cachedRecipe;
+    private GTRecipe cachedRecipe;
     private boolean notUnificated;
     private boolean dontCheckStackSizes;
     private boolean forCollisionCheck;
@@ -61,7 +61,7 @@ public final class FindRecipeQuery {
      * @return The first matched recipe, or null if not found.
      */
     @Nullable
-    public GT_Recipe find() {
+    public GTRecipe find() {
         return findAll().findFirst()
             .orElse(null);
     }
@@ -69,7 +69,7 @@ public final class FindRecipeQuery {
     /**
      * @return All the matched recipes in the form of Stream.
      */
-    public Stream findAll() {
+    public Stream findAll() {
         if (items == null) {
             items = new ItemStack[0];
         }
@@ -135,7 +135,7 @@ public final class FindRecipeQuery {
      * @param filter Matched recipe will be tested by this function. If it returns false, the query will attempt to
      *               find next recipe.
      */
-    public FindRecipeQuery filter(Predicate filter) {
+    public FindRecipeQuery filter(Predicate filter) {
         this.filter = filter;
         return this;
     }
@@ -152,7 +152,7 @@ public final class FindRecipeQuery {
     /**
      * @param cachedRecipe If this is not null, the query tests it before all other recipes.
      */
-    public FindRecipeQuery cachedRecipe(@Nullable GT_Recipe cachedRecipe) {
+    public FindRecipeQuery cachedRecipe(@Nullable GTRecipe cachedRecipe) {
         this.cachedRecipe = cachedRecipe;
         return this;
     }
diff --git a/src/main/java/gregtech/api/recipe/NEIRecipeProperties.java b/src/main/java/gregtech/api/recipe/NEIRecipeProperties.java
index 2ba49f5da1..1b62ca0390 100644
--- a/src/main/java/gregtech/api/recipe/NEIRecipeProperties.java
+++ b/src/main/java/gregtech/api/recipe/NEIRecipeProperties.java
@@ -12,7 +12,7 @@ import com.gtnewhorizons.modularui.api.math.Size;
 import codechicken.nei.recipe.HandlerInfo;
 import gregtech.api.objects.overclockdescriber.OverclockDescriber;
 import gregtech.api.util.FieldsAreNonnullByDefault;
-import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GTRecipe;
 import gregtech.api.util.MethodsReturnNonnullByDefault;
 import gregtech.nei.formatter.INEISpecialInfoFormatter;
 
@@ -49,7 +49,7 @@ public final class NEIRecipeProperties {
     public final Pos2d recipeBackgroundOffset;
 
     /**
-     * Formats special description for the recipe, mainly {@link gregtech.api.util.GT_Recipe#mSpecialValue}.
+     * Formats special description for the recipe, mainly {@link GTRecipe#mSpecialValue}.
      */
     public final INEISpecialInfoFormatter neiSpecialInfoFormatter;
 
@@ -68,14 +68,14 @@ public final class NEIRecipeProperties {
     public final boolean renderRealStackSizes;
 
     /**
-     * Comparator for NEI recipe sort. {@link GT_Recipe#compareTo(GT_Recipe)} by default.
+     * Comparator for NEI recipe sort. {@link GTRecipe#compareTo(GTRecipe)} by default.
      */
-    public final Comparator comparator;
+    public final Comparator comparator;
 
     NEIRecipeProperties(boolean registerNEI, @Nullable UnaryOperator handlerInfoCreator,
         Size recipeBackgroundSize, Pos2d recipeBackgroundOffset, INEISpecialInfoFormatter neiSpecialInfoFormatter,
         boolean unificateOutput, boolean useCustomFilter, boolean renderRealStackSizes,
-        Comparator comparator) {
+        Comparator comparator) {
         this.registerNEI = registerNEI;
         this.handlerInfoCreator = handlerInfoCreator;
         this.recipeBackgroundOffset = recipeBackgroundOffset;
diff --git a/src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java b/src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java
index 050a1c4920..3b47e9ce13 100644
--- a/src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java
+++ b/src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java
@@ -10,7 +10,7 @@ import com.gtnewhorizons.modularui.api.math.Pos2d;
 import com.gtnewhorizons.modularui.api.math.Size;
 
 import codechicken.nei.recipe.HandlerInfo;
-import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GTRecipe;
 import gregtech.api.util.MethodsReturnNonnullByDefault;
 import gregtech.nei.formatter.DefaultSpecialValueFormatter;
 import gregtech.nei.formatter.INEISpecialInfoFormatter;
@@ -36,7 +36,7 @@ public final class NEIRecipePropertiesBuilder {
     private boolean useCustomFilter;
     private boolean renderRealStackSizes = true;
 
-    private Comparator comparator = GT_Recipe::compareTo;
+    private Comparator comparator = GTRecipe::compareTo;
 
     NEIRecipePropertiesBuilder() {}
 
@@ -93,7 +93,7 @@ public final class NEIRecipePropertiesBuilder {
         return this;
     }
 
-    public NEIRecipePropertiesBuilder recipeComparator(Comparator comparator) {
+    public NEIRecipePropertiesBuilder recipeComparator(Comparator comparator) {
         this.comparator = comparator;
         return this;
     }
diff --git a/src/main/java/gregtech/api/recipe/RecipeMap.java b/src/main/java/gregtech/api/recipe/RecipeMap.java
index 46b32d18dd..669c7de2cf 100644
--- a/src/main/java/gregtech/api/recipe/RecipeMap.java
+++ b/src/main/java/gregtech/api/recipe/RecipeMap.java
@@ -1,6 +1,6 @@
 package gregtech.api.recipe;
 
-import static gregtech.api.util.GT_RecipeBuilder.ENABLE_COLLISION_CHECK;
+import static gregtech.api.util.GTRecipeBuilder.ENABLE_COLLISION_CHECK;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -23,8 +23,8 @@ import org.jetbrains.annotations.Unmodifiable;
 import gregtech.api.interfaces.IRecipeMap;
 import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
 import gregtech.api.util.FieldsAreNonnullByDefault;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GTRecipe;
+import gregtech.api.util.GTRecipeBuilder;
 import gregtech.api.util.MethodsReturnNonnullByDefault;
 
 /**
@@ -82,7 +82,7 @@ public final class RecipeMap implements IRecipeMap {
      * @return All the recipes belonging to this recipemap.
      */
     @Unmodifiable
-    public Collection getAllRecipes() {
+    public Collection getAllRecipes() {
         return backend.getAllRecipes();
     }
 
@@ -116,13 +116,13 @@ public final class RecipeMap implements IRecipeMap {
     // region add recipe
     @Deprecated
     @Nullable
-    public GT_Recipe addRecipe(GT_Recipe aRecipe) {
+    public GTRecipe addRecipe(GTRecipe aRecipe) {
         return addRecipe(aRecipe, true, false, false);
     }
 
     @Deprecated
     @Nullable
-    public GT_Recipe addRecipe(GT_Recipe aRecipe, boolean aCheckForCollisions, boolean aFakeRecipe, boolean aHidden) {
+    public GTRecipe addRecipe(GTRecipe aRecipe, boolean aCheckForCollisions, boolean aFakeRecipe, boolean aHidden) {
         aRecipe.mHidden = aHidden;
         aRecipe.mFakeRecipe = aFakeRecipe;
         if (aRecipe.mFluidInputs.length < backend.properties.minFluidInputs
@@ -137,13 +137,13 @@ public final class RecipeMap implements IRecipeMap {
      */
     @Deprecated
     @Nullable
-    public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, @Nullable ItemStack[] aInputs,
+    public GTRecipe addFakeRecipe(boolean aCheckForCollisions, @Nullable ItemStack[] aInputs,
         @Nullable ItemStack[] aOutputs, @Nullable Object aSpecial, @Nullable FluidStack[] aFluidInputs,
         @Nullable FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue, ItemStack[][] aAlt,
         boolean hidden) {
         return addFakeRecipe(
             aCheckForCollisions,
-            new GT_Recipe.GT_Recipe_WithAlt(
+            new GTRecipe.GTRecipe_WithAlt(
                 false,
                 aInputs,
                 aOutputs,
@@ -164,23 +164,23 @@ public final class RecipeMap implements IRecipeMap {
      */
     @Deprecated
     @Nullable
-    public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, GT_Recipe aRecipe) {
+    public GTRecipe addFakeRecipe(boolean aCheckForCollisions, GTRecipe aRecipe) {
         return addRecipe(aRecipe, aCheckForCollisions, true, false);
     }
 
     @Deprecated
     @Nullable
-    public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, GT_Recipe aRecipe, boolean hidden) {
+    public GTRecipe addFakeRecipe(boolean aCheckForCollisions, GTRecipe aRecipe, boolean hidden) {
         return addRecipe(aRecipe, aCheckForCollisions, true, hidden);
     }
 
     @Nonnull
     @Override
-    public Collection doAdd(GT_RecipeBuilder builder) {
+    public Collection doAdd(GTRecipeBuilder builder) {
         return backend.doAdd(builder);
     }
 
-    public GT_Recipe add(GT_Recipe aRecipe) {
+    public GTRecipe add(GTRecipe aRecipe) {
         return backend.compileRecipe(aRecipe);
     }
 
@@ -217,26 +217,26 @@ public final class RecipeMap implements IRecipeMap {
     }
 
     @Nullable
-    public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, boolean aNotUnificated, long aVoltage,
+    public GTRecipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, boolean aNotUnificated, long aVoltage,
         @Nullable FluidStack[] aFluids, @Nullable ItemStack... aInputs) {
         return findRecipe(aTileEntity, null, aNotUnificated, aVoltage, aFluids, null, aInputs);
     }
 
     @Nullable
-    public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, boolean aNotUnificated,
+    public GTRecipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, boolean aNotUnificated,
         boolean aDontCheckStackSizes, long aVoltage, @Nullable FluidStack[] aFluids, @Nullable ItemStack... aInputs) {
         return findRecipe(aTileEntity, null, aNotUnificated, aDontCheckStackSizes, aVoltage, aFluids, null, aInputs);
     }
 
     @Nullable
-    public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, @Nullable GT_Recipe aRecipe,
+    public GTRecipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, @Nullable GTRecipe aRecipe,
         boolean aNotUnificated, long aVoltage, @Nullable FluidStack[] aFluids, @Nullable ItemStack aSpecialSlot,
         @Nullable ItemStack... aInputs) {
         return findRecipe(aTileEntity, aRecipe, aNotUnificated, false, aVoltage, aFluids, aSpecialSlot, aInputs);
     }
 
     @Nullable
-    public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, @Nullable GT_Recipe aRecipe,
+    public GTRecipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, @Nullable GTRecipe aRecipe,
         boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, @Nullable FluidStack[] aFluids,
         @Nullable ItemStack aSpecialSlot, @Nullable ItemStack... aInputs) {
         return findRecipeQuery().items(aInputs != null ? aInputs : new ItemStack[0])
diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBackend.java b/src/main/java/gregtech/api/recipe/RecipeMapBackend.java
index 8ba0895a7f..f78e367adf 100644
--- a/src/main/java/gregtech/api/recipe/RecipeMapBackend.java
+++ b/src/main/java/gregtech/api/recipe/RecipeMapBackend.java
@@ -1,9 +1,9 @@
 package gregtech.api.recipe;
 
-import static gregtech.api.util.GT_RecipeBuilder.ENABLE_COLLISION_CHECK;
-import static gregtech.api.util.GT_RecipeBuilder.handleInvalidRecipe;
-import static gregtech.api.util.GT_RecipeBuilder.handleRecipeCollision;
-import static gregtech.api.util.GT_Utility.areStacksEqualOrNull;
+import static gregtech.api.util.GTRecipeBuilder.ENABLE_COLLISION_CHECK;
+import static gregtech.api.util.GTRecipeBuilder.handleInvalidRecipe;
+import static gregtech.api.util.GTRecipeBuilder.handleRecipeCollision;
+import static gregtech.api.util.GTUtility.areStacksEqualOrNull;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -28,13 +28,13 @@ import org.jetbrains.annotations.Unmodifiable;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.SetMultimap;
 
-import gregtech.api.GregTech_API;
+import gregtech.api.GregTechAPI;
 import gregtech.api.interfaces.IRecipeMap;
-import gregtech.api.objects.GT_ItemStack;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_StreamUtil;
+import gregtech.api.objects.GTItemStack;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipe;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTStreamUtil;
 import gregtech.api.util.MethodsReturnNonnullByDefault;
 
 /**
@@ -52,16 +52,16 @@ public class RecipeMapBackend {
     /**
      * Recipe index based on items.
      */
-    private final SetMultimap itemIndex = HashMultimap.create();
+    private final SetMultimap itemIndex = HashMultimap.create();
     /**
      * Recipe index based on fluids.
      */
-    private final SetMultimap fluidIndex = HashMultimap.create();
+    private final SetMultimap fluidIndex = HashMultimap.create();
 
     /**
      * All the recipes belonging to this backend, indexed by recipe category.
      */
-    private final Map> recipesByCategory = new HashMap<>();
+    private final Map> recipesByCategory = new HashMap<>();
 
     /**
      * List of recipemaps that also receive recipe addition from this backend.
@@ -75,7 +75,7 @@ public class RecipeMapBackend {
 
     public RecipeMapBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
         this.properties = propertiesBuilder.build();
-        GregTech_API.itemStackMultiMaps.add(itemIndex);
+        GregTechAPI.itemStackMultiMaps.add(itemIndex);
     }
 
     void setRecipeMap(RecipeMap recipeMap) {
@@ -94,14 +94,14 @@ public class RecipeMapBackend {
      *         use {@link #compileRecipe} to add / {@link #removeRecipes} to remove.
      */
     @Unmodifiable
-    public Collection getAllRecipes() {
+    public Collection getAllRecipes() {
         return Collections.unmodifiableCollection(allRecipes());
     }
 
     /**
      * @return Raw recipe list
      */
-    private Collection allRecipes() {
+    private Collection allRecipes() {
         return recipesByCategory.values()
             .stream()
             .flatMap(Collection::stream)
@@ -112,13 +112,13 @@ public class RecipeMapBackend {
      * @return All the recipes belonging to this backend, indexed by recipe category.
      */
     @Unmodifiable
-    public Collection getRecipesByCategory(RecipeCategory recipeCategory) {
+    public Collection getRecipesByCategory(RecipeCategory recipeCategory) {
         return Collections
             .unmodifiableCollection(recipesByCategory.getOrDefault(recipeCategory, Collections.emptyList()));
     }
 
     @Unmodifiable
-    public Map> getRecipeCategoryMap() {
+    public Map> getRecipeCategoryMap() {
         return Collections.unmodifiableMap(recipesByCategory);
     }
 
@@ -129,7 +129,7 @@ public class RecipeMapBackend {
      *
      * @return Supplied recipe.
      */
-    public GT_Recipe compileRecipe(GT_Recipe recipe) {
+    public GTRecipe compileRecipe(GTRecipe recipe) {
         if (recipe.getRecipeCategory() == null) {
             recipe.setRecipeCategory(recipeMap.getDefaultRecipeCategory());
         }
@@ -148,17 +148,17 @@ public class RecipeMapBackend {
     /**
      * Adds the supplied recipe to the item cache.
      */
-    protected GT_Recipe addToItemMap(GT_Recipe recipe) {
+    protected GTRecipe addToItemMap(GTRecipe recipe) {
         for (ItemStack item : recipe.mInputs) {
             if (item == null) continue;
-            itemIndex.put(new GT_ItemStack(item), recipe);
+            itemIndex.put(new GTItemStack(item), recipe);
         }
-        if (recipe instanceof GT_Recipe.GT_Recipe_WithAlt recipeWithAlt) {
+        if (recipe instanceof GTRecipe.GTRecipe_WithAlt recipeWithAlt) {
             for (ItemStack[] itemStacks : recipeWithAlt.mOreDictAlt) {
                 if (itemStacks == null) continue;
                 for (ItemStack item : itemStacks) {
                     if (item == null) continue;
-                    itemIndex.put(new GT_ItemStack(item), recipe);
+                    itemIndex.put(new GTItemStack(item), recipe);
                 }
             }
         }
@@ -168,10 +168,10 @@ public class RecipeMapBackend {
     /**
      * Builds recipe from supplied recipe builder and adds it.
      */
-    protected Collection doAdd(GT_RecipeBuilder builder) {
-        Iterable recipes = properties.recipeEmitter.apply(builder);
-        Collection ret = new ArrayList<>();
-        for (GT_Recipe recipe : recipes) {
+    protected Collection doAdd(GTRecipeBuilder builder) {
+        Iterable recipes = properties.recipeEmitter.apply(builder);
+        Collection ret = new ArrayList<>();
+        for (GTRecipe recipe : recipes) {
             if (recipe.mFluidInputs.length < properties.minFluidInputs
                 || recipe.mInputs.length < properties.minItemInputs) {
                 return Collections.emptyList();
@@ -199,7 +199,7 @@ public class RecipeMapBackend {
         return ret;
     }
 
-    private void handleCollision(GT_Recipe recipe) {
+    private void handleCollision(GTRecipe recipe) {
         StringBuilder errorInfo = new StringBuilder();
         boolean hasAnEntry = false;
         for (FluidStack fluid : recipe.mFluidInputs) {
@@ -241,11 +241,11 @@ public class RecipeMapBackend {
     /**
      * Removes supplied recipes from recipe list. Do not use unless absolute necessity!
      */
-    public void removeRecipes(Collection recipesToRemove) {
-        for (Collection recipes : recipesByCategory.values()) {
+    public void removeRecipes(Collection recipesToRemove) {
+        for (Collection recipes : recipesByCategory.values()) {
             recipes.removeAll(recipesToRemove);
         }
-        for (GT_ItemStack key : new HashMap<>(itemIndex.asMap()).keySet()) {
+        for (GTItemStack key : new HashMap<>(itemIndex.asMap()).keySet()) {
             itemIndex.get(key)
                 .removeAll(recipesToRemove);
         }
@@ -258,7 +258,7 @@ public class RecipeMapBackend {
     /**
      * Removes supplied recipe from recipe list. Do not use unless absolute necessity!
      */
-    public void removeRecipe(GT_Recipe recipe) {
+    public void removeRecipe(GTRecipe recipe) {
         removeRecipes(Collections.singleton(recipe));
     }
 
@@ -276,9 +276,9 @@ public class RecipeMapBackend {
      */
     public void reInit() {
         itemIndex.clear();
-        for (GT_Recipe recipe : allRecipes()) {
-            GT_OreDictUnificator.setStackArray(true, recipe.mInputs);
-            GT_OreDictUnificator.setStackArray(true, recipe.mOutputs);
+        for (GTRecipe recipe : allRecipes()) {
+            GTOreDictUnificator.setStackArray(true, recipe.mInputs);
+            GTOreDictUnificator.setStackArray(true, recipe.mOutputs);
             addToItemMap(recipe);
         }
     }
@@ -287,7 +287,7 @@ public class RecipeMapBackend {
      * @return If supplied item is a valid input for any of the recipes
      */
     public boolean containsInput(ItemStack item) {
-        return itemIndex.containsKey(new GT_ItemStack(item)) || itemIndex.containsKey(new GT_ItemStack(item, true));
+        return itemIndex.containsKey(new GTItemStack(item)) || itemIndex.containsKey(new GTItemStack(item, true));
     }
 
     /**
@@ -304,7 +304,7 @@ public class RecipeMapBackend {
      *
      * @return True if collision is found.
      */
-    boolean checkCollision(GT_Recipe recipe) {
+    boolean checkCollision(GTRecipe recipe) {
         return matchRecipeStream(recipe.mInputs, recipe.mFluidInputs, null, null, false, true, true).findAny()
             .isPresent();
     }
@@ -313,8 +313,8 @@ public class RecipeMapBackend {
      * Overwrites {@link #matchRecipeStream} method. Also override {@link #doesOverwriteFindRecipe} to make it work.
      */
     @Nullable
-    protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot,
-        @Nullable GT_Recipe cachedRecipe) {
+    protected GTRecipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+        @Nullable GTRecipe cachedRecipe) {
         return null;
     }
 
@@ -329,7 +329,7 @@ public class RecipeMapBackend {
      * Modifies successfully found recipe. Make sure not to mutate the found recipe but use copy!
      */
     @Nullable
-    protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids,
+    protected GTRecipe modifyFoundRecipe(GTRecipe recipe, ItemStack[] items, FluidStack[] fluids,
         @Nullable ItemStack specialSlot) {
         return recipe;
     }
@@ -338,7 +338,7 @@ public class RecipeMapBackend {
      * Called when {@link #matchRecipeStream} cannot find recipe.
      */
     @Nullable
-    protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
+    protected GTRecipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
         return null;
     }
 
@@ -357,11 +357,11 @@ public class RecipeMapBackend {
      * @param forCollisionCheck   If this method is called to check collision with already registered recipes.
      * @return Stream of matches recipes.
      */
-    Stream matchRecipeStream(ItemStack[] rawItems, FluidStack[] fluids, @Nullable ItemStack specialSlot,
-        @Nullable GT_Recipe cachedRecipe, boolean notUnificated, boolean dontCheckStackSizes,
+    Stream matchRecipeStream(ItemStack[] rawItems, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+        @Nullable GTRecipe cachedRecipe, boolean notUnificated, boolean dontCheckStackSizes,
         boolean forCollisionCheck) {
         if (doesOverwriteFindRecipe()) {
-            return GT_StreamUtil.ofNullable(overwriteFindRecipe(rawItems, fluids, specialSlot, cachedRecipe));
+            return GTStreamUtil.ofNullable(overwriteFindRecipe(rawItems, fluids, specialSlot, cachedRecipe));
         }
 
         if (recipesByCategory.isEmpty()) {
@@ -393,22 +393,22 @@ public class RecipeMapBackend {
         ItemStack[] items;
         // Unification happens here in case the item input isn't already unificated.
         if (notUnificated) {
-            items = GT_OreDictUnificator.getStackArray(true, (Object[]) rawItems);
+            items = GTOreDictUnificator.getStackArray(true, (Object[]) rawItems);
         } else {
             items = rawItems;
         }
 
-        return Stream.>of(
+        return Stream.>of(
             // Check the recipe which has been used last time in order to not have to search for it again, if possible.
-            GT_StreamUtil.ofNullable(cachedRecipe)
+            GTStreamUtil.ofNullable(cachedRecipe)
                 .filter(recipe -> recipe.mCanBeBuffered)
                 .filter(recipe -> filterFindRecipe(recipe, items, fluids, specialSlot, dontCheckStackSizes))
                 .map(recipe -> modifyFoundRecipe(recipe, items, fluids, specialSlot))
                 .filter(Objects::nonNull),
             // Now look for the recipes inside the item index, but only when the recipes actually can have items inputs.
-            GT_StreamUtil.ofConditional(!itemIndex.isEmpty(), items)
+            GTStreamUtil.ofConditional(!itemIndex.isEmpty(), items)
                 .filter(Objects::nonNull)
-                .flatMap(item -> Stream.of(new GT_ItemStack(item), new GT_ItemStack(item, true)))
+                .flatMap(item -> Stream.of(new GTItemStack(item), new GTItemStack(item, true)))
                 .map(itemIndex::get)
                 .flatMap(Collection::stream)
                 .filter(recipe -> filterFindRecipe(recipe, items, fluids, specialSlot, dontCheckStackSizes))
@@ -416,7 +416,7 @@ public class RecipeMapBackend {
                 .filter(Objects::nonNull),
             // If the minimum amount of items required for the recipes is 0, then it could match to fluid-only recipes,
             // so check fluid index too.
-            GT_StreamUtil.ofConditional(properties.minItemInputs == 0, fluids)
+            GTStreamUtil.ofConditional(properties.minItemInputs == 0, fluids)
                 .filter(Objects::nonNull)
                 .map(
                     fluidStack -> fluidIndex.get(
@@ -428,7 +428,7 @@ public class RecipeMapBackend {
                 .filter(Objects::nonNull),
             // Lastly, find fallback.
             forCollisionCheck ? Stream.empty()
-                : GT_StreamUtil.ofSupplier(() -> findFallback(items, fluids, specialSlot))
+                : GTStreamUtil.ofSupplier(() -> findFallback(items, fluids, specialSlot))
                     .filter(Objects::nonNull))
             .flatMap(Function.identity());
     }
@@ -440,7 +440,7 @@ public class RecipeMapBackend {
      * 

* Note that this won't be called if {@link #doesOverwriteFindRecipe} is true. */ - protected boolean filterFindRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids, + protected boolean filterFindRecipe(GTRecipe recipe, ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, boolean dontCheckStackSizes) { if (recipe.mEnabled && !recipe.mFakeRecipe && recipe.isRecipeInputEqual(false, dontCheckStackSizes, fluids, items)) { diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java b/src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java index 0cd08279a7..47c400a3dd 100644 --- a/src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java +++ b/src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java @@ -6,8 +6,8 @@ import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import gregtech.api.util.FieldsAreNonnullByDefault; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -44,18 +44,18 @@ public final class RecipeMapBackendProperties { /** * Changes how recipes are emitted by a particular recipe builder. */ - public final Function> recipeEmitter; + public final Function> recipeEmitter; /** * Runs a custom hook on all recipes added via builder. */ @Nullable - public final Function recipeTransformer; + public final Function recipeTransformer; RecipeMapBackendProperties(int minItemInputs, int minFluidInputs, boolean specialSlotSensitive, boolean disableOptimize, - Function> recipeEmitter, - @Nullable Function recipeTransformer) { + Function> recipeEmitter, + @Nullable Function recipeTransformer) { if (minItemInputs < 0 || minFluidInputs < 0) { throw new IllegalArgumentException("minItemInputs and minFluidInputs cannot be negative"); } diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java b/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java index 48a27fa42e..aad0748fa9 100644 --- a/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java +++ b/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java @@ -1,6 +1,6 @@ package gregtech.api.recipe; -import static gregtech.api.util.GT_RecipeMapUtil.buildOrEmpty; +import static gregtech.api.util.GTRecipeMapUtil.buildOrEmpty; import java.util.function.Function; @@ -9,8 +9,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.google.common.collect.Iterables; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -28,10 +28,10 @@ public final class RecipeMapBackendPropertiesBuilder { private boolean disableOptimize; - private Function> recipeEmitter = this::defaultBuildRecipe; + private Function> recipeEmitter = this::defaultBuildRecipe; @Nullable - private Function recipeTransformer; + private Function recipeTransformer; RecipeMapBackendPropertiesBuilder() {} @@ -66,40 +66,40 @@ public final class RecipeMapBackendPropertiesBuilder { } public RecipeMapBackendPropertiesBuilder recipeEmitter( - Function> recipeEmitter) { + Function> recipeEmitter) { this.recipeEmitter = recipeEmitter; return this; } public RecipeMapBackendPropertiesBuilder combineRecipeEmitter( - Function> func) { + Function> func) { // move recipeEmitter to local variable, so lambda capture the function itself instead of this - Function> cur = this.recipeEmitter; + Function> cur = this.recipeEmitter; return recipeEmitter(b -> Iterables.concat(cur.apply(b), func.apply(b))); } public RecipeMapBackendPropertiesBuilder recipeTransformer( - Function recipeTransformer) { + Function recipeTransformer) { this.recipeTransformer = recipeTransformer; return this; } public RecipeMapBackendPropertiesBuilder chainRecipeTransformer( - Function func) { + Function func) { this.recipeTransformer = this.recipeTransformer == null ? func : this.recipeTransformer.andThen(func); return this; } - private Iterable defaultBuildRecipe(GT_RecipeBuilder builder) { + private Iterable defaultBuildRecipe(GTRecipeBuilder builder) { // TODO sensible validation - GT_RecipeBuilder b = builder; + GTRecipeBuilder b = builder; if (disableOptimize && builder.isOptimize()) { b = copy(builder, b).noOptimize(); } return buildOrEmpty(b); } - private static GT_RecipeBuilder copy(GT_RecipeBuilder original, GT_RecipeBuilder b) { + private static GTRecipeBuilder copy(GTRecipeBuilder original, GTRecipeBuilder b) { return b == original ? b.copy() : b; } } diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBuilder.java b/src/main/java/gregtech/api/recipe/RecipeMapBuilder.java index a1638a5a34..2b7bc39066 100644 --- a/src/main/java/gregtech/api/recipe/RecipeMapBuilder.java +++ b/src/main/java/gregtech/api/recipe/RecipeMapBuilder.java @@ -20,11 +20,11 @@ import com.gtnewhorizons.modularui.common.widget.ProgressBar; import codechicken.nei.recipe.HandlerInfo; import gregtech.api.gui.modularui.FallbackableSteamTexture; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.gui.modularui.SteamTexture; import gregtech.api.objects.overclockdescriber.OverclockDescriber; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.nei.formatter.INEISpecialInfoFormatter; @@ -84,7 +84,7 @@ public final class RecipeMapBuilder { this.unlocalizedName = unlocalizedName; this.backendCreator = backendCreator; this.uiPropertiesBuilder = BasicUIProperties.builder() - .progressBarTexture(GT_UITextures.fallbackableProgressbar(unlocalizedName, GT_UITextures.PROGRESSBAR_ARROW)) + .progressBarTexture(GTUITextures.fallbackableProgressbar(unlocalizedName, GTUITextures.PROGRESSBAR_ARROW)) .neiTransferRectId(unlocalizedName); } @@ -119,7 +119,7 @@ public final class RecipeMapBuilder { * Changes how recipes are emitted by a particular recipe builder. Can emit multiple recipe per builder. */ public RecipeMapBuilder recipeEmitter( - Function> recipeEmitter) { + Function> recipeEmitter) { backendPropertiesBuilder.recipeEmitter(recipeEmitter); return this; } @@ -130,7 +130,7 @@ public final class RecipeMapBuilder { * Recipes added via one of the overloads of addRecipe will NOT be affected by this function. */ public RecipeMapBuilder recipeEmitterSingle( - Function recipeEmitter) { + Function recipeEmitter) { return recipeEmitter(recipeEmitter.andThen(Collections::singletonList)); } @@ -142,7 +142,7 @@ public final class RecipeMapBuilder { * Unlike {@link #recipeEmitter(Function)}, this one does not clear the existing recipe being emitted, if any */ public RecipeMapBuilder combineRecipeEmitter( - Function> recipeEmitter) { + Function> recipeEmitter) { backendPropertiesBuilder.combineRecipeEmitter(recipeEmitter); return this; } @@ -156,7 +156,7 @@ public final class RecipeMapBuilder { * Unlike {@link #recipeEmitter(Function)}, this one does not clear the existing recipe being emitted, if any */ public RecipeMapBuilder combineRecipeEmitterSingle( - Function recipeEmitter) { + Function recipeEmitter) { return combineRecipeEmitter(recipeEmitter.andThen(Collections::singletonList)); } @@ -166,7 +166,7 @@ public final class RecipeMapBuilder { *

* Recipes added via one of the overloads of addRecipe will NOT be affected by this function. */ - public RecipeMapBuilder recipeTransformer(Function recipeTransformer) { + public RecipeMapBuilder recipeTransformer(Function recipeTransformer) { backendPropertiesBuilder.recipeTransformer(recipeTransformer); return this; } @@ -177,7 +177,7 @@ public final class RecipeMapBuilder { *

* Recipes added via one of the overloads of addRecipe will NOT be affected by this function. */ - public RecipeMapBuilder recipeTransformer(Consumer recipeTransformer) { + public RecipeMapBuilder recipeTransformer(Consumer recipeTransformer) { return recipeTransformer(withIdentityReturn(recipeTransformer)); } @@ -191,7 +191,7 @@ public final class RecipeMapBuilder { * The supplied function will be given the output of existing handler when a recipe is added. */ public RecipeMapBuilder chainRecipeTransformer( - Function recipeTransformer) { + Function recipeTransformer) { backendPropertiesBuilder.chainRecipeTransformer(recipeTransformer); return this; } @@ -205,7 +205,7 @@ public final class RecipeMapBuilder { * Unlike {@link #recipeTransformer(Function)}, this one will not replace the existing special handler. * The supplied function will be given the output of existing handler when a recipe is added. */ - public RecipeMapBuilder chainRecipeTransformer(Consumer recipeTransformer) { + public RecipeMapBuilder chainRecipeTransformer(Consumer recipeTransformer) { return chainRecipeTransformer(withIdentityReturn(recipeTransformer)); } @@ -250,7 +250,7 @@ public final class RecipeMapBuilder { * By default, it's set to {@code GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT}. */ public RecipeMapBuilder progressBar(UITexture texture, ProgressBar.Direction direction) { - return progressBarWithFallback(GT_UITextures.fallbackableProgressbar(unlocalizedName, texture), direction); + return progressBarWithFallback(GTUITextures.fallbackableProgressbar(unlocalizedName, texture), direction); } /** @@ -438,7 +438,7 @@ public final class RecipeMapBuilder { } /** - * Sets formatter for special description for the recipe, mainly {@link gregtech.api.util.GT_Recipe#mSpecialValue}. + * Sets formatter for special description for the recipe, mainly {@link GTRecipe#mSpecialValue}. */ public RecipeMapBuilder neiSpecialInfoFormatter(INEISpecialInfoFormatter neiSpecialInfoFormatter) { neiPropertiesBuilder.neiSpecialInfoFormatter(neiSpecialInfoFormatter); @@ -478,7 +478,7 @@ public final class RecipeMapBuilder { /** * Sets custom comparator for NEI recipe sort. */ - public RecipeMapBuilder neiRecipeComparator(Comparator comparator) { + public RecipeMapBuilder neiRecipeComparator(Comparator comparator) { neiPropertiesBuilder.recipeComparator(comparator); return this; } diff --git a/src/main/java/gregtech/api/recipe/RecipeMapFrontend.java b/src/main/java/gregtech/api/recipe/RecipeMapFrontend.java index 63daa00dc7..36aee2872f 100644 --- a/src/main/java/gregtech/api/recipe/RecipeMapFrontend.java +++ b/src/main/java/gregtech/api/recipe/RecipeMapFrontend.java @@ -1,6 +1,6 @@ package gregtech.api.recipe; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import static net.minecraft.util.EnumChatFormatting.GRAY; import java.util.ArrayList; @@ -30,15 +30,15 @@ import com.gtnewhorizons.modularui.common.widget.ProgressBar; import com.gtnewhorizons.modularui.common.widget.SlotWidget; import codechicken.nei.PositionedStack; -import gregtech.GT_Mod; +import gregtech.GTMod; import gregtech.api.enums.SteamVariant; -import gregtech.api.gui.GT_GUIColorOverride; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.GUIColorOverride; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.metadata.IRecipeMetadataStorage; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.common.gui.modularui.UIHelper; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.nei.GTNEIDefaultHandler; import gregtech.nei.RecipeDisplayInfo; /** @@ -60,8 +60,8 @@ public class RecipeMapFrontend { */ protected final NEIRecipeProperties neiProperties; - protected final GT_GUIColorOverride colorOverride = GT_GUIColorOverride - .get(GT_UITextures.BACKGROUND_NEI_SINGLE_RECIPE.location); + protected final GUIColorOverride colorOverride = GUIColorOverride + .get(GTUITextures.BACKGROUND_NEI_SINGLE_RECIPE.location); public RecipeMapFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, NEIRecipePropertiesBuilder neiPropertiesBuilder) { @@ -96,7 +96,7 @@ public class RecipeMapFrontend { IItemHandlerModifiable fluidInputsInventory, IItemHandlerModifiable fluidOutputsInventory, Supplier progressSupplier, Pos2d windowOffset) { ModularWindow.Builder builder = ModularWindow.builder(neiProperties.recipeBackgroundSize) - .setBackground(GT_UITextures.BACKGROUND_NEI_SINGLE_RECIPE); + .setBackground(GTUITextures.BACKGROUND_NEI_SINGLE_RECIPE); UIHelper.forEachSlots( (i, backgrounds, pos) -> builder.widget( @@ -245,8 +245,8 @@ public class RecipeMapFrontend { } protected void drawRecipeOwnerInfo(RecipeDisplayInfo recipeInfo) { - GT_Recipe recipe = recipeInfo.recipe; - if (GT_Mod.gregtechproxy.mNEIRecipeOwner) { + GTRecipe recipe = recipeInfo.recipe; + if (GTMod.gregtechproxy.mNEIRecipeOwner) { if (recipe.owners.size() > 1) { recipeInfo.drawText( EnumChatFormatting.ITALIC + trans("273", "Original Recipe by: ") @@ -265,7 +265,7 @@ public class RecipeMapFrontend { .getName()); } } - if (GT_Mod.gregtechproxy.mNEIRecipeOwnerStackTrace && recipe.stackTraces != null + if (GTMod.gregtechproxy.mNEIRecipeOwnerStackTrace && recipe.stackTraces != null && !recipe.stackTraces.isEmpty()) { recipeInfo.drawText("stackTrace:"); // todo: good way to show all stacktraces @@ -276,23 +276,23 @@ public class RecipeMapFrontend { } public List handleNEIItemTooltip(ItemStack stack, List currentTip, - GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { for (PositionedStack pStack : neiCachedRecipe.mInputs) { if (stack == pStack.item) { - if (pStack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) { + if (pStack instanceof GTNEIDefaultHandler.FixedPositionedStack) { currentTip = handleNEIItemInputTooltip( currentTip, - (GT_NEI_DefaultHandler.FixedPositionedStack) pStack); + (GTNEIDefaultHandler.FixedPositionedStack) pStack); } break; } } for (PositionedStack pStack : neiCachedRecipe.mOutputs) { if (stack == pStack.item) { - if (pStack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) { + if (pStack instanceof GTNEIDefaultHandler.FixedPositionedStack) { currentTip = handleNEIItemOutputTooltip( currentTip, - (GT_NEI_DefaultHandler.FixedPositionedStack) pStack); + (GTNEIDefaultHandler.FixedPositionedStack) pStack); } break; } @@ -301,7 +301,7 @@ public class RecipeMapFrontend { } protected List handleNEIItemInputTooltip(List currentTip, - GT_NEI_DefaultHandler.FixedPositionedStack pStack) { + GTNEIDefaultHandler.FixedPositionedStack pStack) { if (pStack.isNotConsumed()) { currentTip.add(GRAY + trans("151", "Does not get consumed in the process")); } @@ -309,33 +309,33 @@ public class RecipeMapFrontend { } protected List handleNEIItemOutputTooltip(List currentTip, - GT_NEI_DefaultHandler.FixedPositionedStack pStack) { + GTNEIDefaultHandler.FixedPositionedStack pStack) { if (pStack.isChanceBased()) { currentTip.add(GRAY + trans("150", "Chance: ") + pStack.getChanceText()); } return currentTip; } - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { for (PositionedStack stack : neiCachedRecipe.mInputs) { - if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) { - drawNEIOverlayForInput((GT_NEI_DefaultHandler.FixedPositionedStack) stack); + if (stack instanceof GTNEIDefaultHandler.FixedPositionedStack) { + drawNEIOverlayForInput((GTNEIDefaultHandler.FixedPositionedStack) stack); } } for (PositionedStack stack : neiCachedRecipe.mOutputs) { - if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) { - drawNEIOverlayForOutput((GT_NEI_DefaultHandler.FixedPositionedStack) stack); + if (stack instanceof GTNEIDefaultHandler.FixedPositionedStack) { + drawNEIOverlayForOutput((GTNEIDefaultHandler.FixedPositionedStack) stack); } } } - protected void drawNEIOverlayForInput(GT_NEI_DefaultHandler.FixedPositionedStack stack) { + protected void drawNEIOverlayForInput(GTNEIDefaultHandler.FixedPositionedStack stack) { if (stack.isNotConsumed()) { drawNEIOverlayText("NC", stack); } } - protected void drawNEIOverlayForOutput(GT_NEI_DefaultHandler.FixedPositionedStack stack) { + protected void drawNEIOverlayForOutput(GTNEIDefaultHandler.FixedPositionedStack stack) { if (stack.isChanceBased()) { drawNEIOverlayText(stack.getChanceText(), stack); } diff --git a/src/main/java/gregtech/api/recipe/RecipeMaps.java b/src/main/java/gregtech/api/recipe/RecipeMaps.java index 293b4f36b5..b43b1144ee 100644 --- a/src/main/java/gregtech/api/recipe/RecipeMaps.java +++ b/src/main/java/gregtech/api/recipe/RecipeMaps.java @@ -4,18 +4,18 @@ import static gregtech.api.enums.Mods.Avaritia; import static gregtech.api.enums.Mods.GTNHIntergalactic; import static gregtech.api.enums.Mods.NEICustomDiagrams; import static gregtech.api.enums.Mods.Railcraft; -import static gregtech.api.util.GT_ModHandler.getModItem; -import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT; -import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE; -import static gregtech.api.util.GT_RecipeMapUtil.GT_RecipeTemplate; -import static gregtech.api.util.GT_RecipeMapUtil.asTemplate; -import static gregtech.api.util.GT_RecipeMapUtil.buildOrEmpty; -import static gregtech.api.util.GT_Utility.clamp; -import static gregtech.api.util.GT_Utility.copyAmount; -import static gregtech.api.util.GT_Utility.getFluidForFilledItem; -import static gregtech.api.util.GT_Utility.isArrayEmptyOrNull; -import static gregtech.api.util.GT_Utility.isArrayOfLength; -import static gregtech.api.util.GT_Utility.multiplyStack; +import static gregtech.api.util.GTModHandler.getModItem; +import static gregtech.api.util.GTRecipeConstants.ADDITIVE_AMOUNT; +import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE; +import static gregtech.api.util.GTRecipeMapUtil.GTRecipeTemplate; +import static gregtech.api.util.GTRecipeMapUtil.asTemplate; +import static gregtech.api.util.GTRecipeMapUtil.buildOrEmpty; +import static gregtech.api.util.GTUtility.clamp; +import static gregtech.api.util.GTUtility.copyAmount; +import static gregtech.api.util.GTUtility.getFluidForFilledItem; +import static gregtech.api.util.GTUtility.isArrayEmptyOrNull; +import static gregtech.api.util.GTUtility.isArrayOfLength; +import static gregtech.api.util.GTUtility.multiplyStack; import java.util.ArrayList; import java.util.Collection; @@ -32,11 +32,11 @@ import org.apache.commons.lang3.ArrayUtils; import com.gtnewhorizons.modularui.api.drawable.UITexture; import com.gtnewhorizons.modularui.common.widget.ProgressBar; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.ItemList; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.interfaces.IRecipeMap; import gregtech.api.objects.ItemData; import gregtech.api.recipe.maps.AssemblerBackend; @@ -68,12 +68,12 @@ import gregtech.api.recipe.maps.UnpackagerBackend; import gregtech.api.recipe.metadata.CompressionTierKey; import gregtech.api.recipe.metadata.PCBFactoryTierKey; import gregtech.api.recipe.metadata.PurificationPlantBaseChanceKey; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeConstants; -import gregtech.api.util.GT_RecipeMapUtil; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeConstants; +import gregtech.api.util.GTRecipeMapUtil; +import gregtech.api.util.GTUtility; import gregtech.common.tileentities.machines.multi.purification.PurifiedWaterHelpers; import gregtech.nei.formatter.FuelSpecialValueFormatter; import gregtech.nei.formatter.FusionSpecialValueFormatter; @@ -94,12 +94,12 @@ public final class RecipeMaps { return null; } if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_DUST; + return GTUITextures.OVERLAY_SLOT_DUST; } else { - return GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE; + return GTUITextures.OVERLAY_SLOT_CRUSHED_ORE; } }) - .progressBar(GT_UITextures.PROGRESSBAR_BATH, ProgressBar.Direction.CIRCULAR_CW) + .progressBar(GTUITextures.PROGRESSBAR_BATH, ProgressBar.Direction.CIRCULAR_CW) .build(); public static final RecipeMap thermalCentrifugeRecipes = RecipeMapBuilder .of("gt.recipe.thermalcentrifuge") @@ -111,9 +111,9 @@ public final class RecipeMaps { return null; } if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_DUST; + return GTUITextures.OVERLAY_SLOT_DUST; } else { - return GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE; + return GTUITextures.OVERLAY_SLOT_CRUSHED_ORE; } }) .build(); @@ -121,17 +121,17 @@ public final class RecipeMaps { .maxIO(1, 1, 0, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_COMPRESSOR + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_COMPRESSOR : null) - .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS) + .progressBar(GTUITextures.PROGRESSBAR_COMPRESS) .slotOverlaysSteam( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_COMPRESSOR_STEAM + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_COMPRESSOR_STEAM : null) - .progressBarSteam(GT_UITextures.PROGRESSBAR_COMPRESS_STEAM) + .progressBarSteam(GTUITextures.PROGRESSBAR_COMPRESS_STEAM) .neiRecipeComparator( Comparator - .comparing(recipe -> recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0)) - .thenComparing(GT_Recipe::compareTo)) + .comparing(recipe -> recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0)) + .thenComparing(GTRecipe::compareTo)) // Avoid steam machine being used as handler icon .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Compressor.get(1))) .build(); @@ -139,27 +139,27 @@ public final class RecipeMaps { .of("gt.recipe.neutroniumcompressor") .maxIO(1, 1, 1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_COMPRESSOR + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_COMPRESSOR : null) - .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS) + .progressBar(GTUITextures.PROGRESSBAR_COMPRESS) .neiHandlerInfo(builder -> builder.setDisplayStack(getModItem(Avaritia.ID, "Singularity", 1L, 0))) .disableOptimize() .neiRecipeComparator( Comparator - .comparing(recipe -> recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0)) - .thenComparing(GT_Recipe::compareTo)) + .comparing(recipe -> recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0)) + .thenComparing(GTRecipe::compareTo)) .build(); public static final RecipeMap extractorRecipes = RecipeMapBuilder.of("gt.recipe.extractor") .maxIO(1, 1, 0, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CENTRIFUGE + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_CENTRIFUGE : null) - .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT) + .progressBar(GTUITextures.PROGRESSBAR_EXTRACT) .slotOverlaysSteam( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CENTRIFUGE_STEAM + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_CENTRIFUGE_STEAM : null) - .progressBarSteam(GT_UITextures.PROGRESSBAR_EXTRACT_STEAM) + .progressBarSteam(GTUITextures.PROGRESSBAR_EXTRACT_STEAM) // Avoid steam machine being used as handler icon .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Extractor.get(1))) .build(); @@ -168,8 +168,8 @@ public final class RecipeMaps { .maxIO(1, 1, 0, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_RECYCLE : null) - .progressBar(GT_UITextures.PROGRESSBAR_RECYCLE, ProgressBar.Direction.CIRCULAR_CW) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_RECYCLE : null) + .progressBar(GTUITextures.PROGRESSBAR_RECYCLE, ProgressBar.Direction.CIRCULAR_CW) .neiTransferRectId("ic2.recycler") .disableRegisterNEI() .build(); @@ -178,11 +178,11 @@ public final class RecipeMaps { .maxIO(1, 1, 0, 0) .minInputs(1, 9) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE : null) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_FURNACE : null) .slotOverlaysSteam( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE_STEAM + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_FURNACE_STEAM : null) - .progressBarSteam(GT_UITextures.PROGRESSBAR_ARROW_STEAM) + .progressBarSteam(GTUITextures.PROGRESSBAR_ARROW_STEAM) .neiTransferRectId("smelting") .disableRegisterNEI() .build(); @@ -191,7 +191,7 @@ public final class RecipeMaps { .maxIO(1, 1, 0, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE : null) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_FURNACE : null) .neiTransferRectId("smelting") .disableRegisterNEI() .build(); @@ -201,10 +201,10 @@ public final class RecipeMaps { .useSpecialSlot() .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isSpecial) { - return GT_UITextures.OVERLAY_SLOT_DATA_ORB; + return GTUITextures.OVERLAY_SLOT_DATA_ORB; } if (!isFluid && !isOutput) { - return GT_UITextures.OVERLAY_SLOT_MICROSCOPE; + return GTUITextures.OVERLAY_SLOT_MICROSCOPE; } return null; }) @@ -214,12 +214,12 @@ public final class RecipeMaps { .maxIO(2, 1, 0, 0) .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE; + return GTUITextures.OVERLAY_SLOT_CRUSHED_ORE; } else { - return GT_UITextures.OVERLAY_SLOT_DUST; + return GTUITextures.OVERLAY_SLOT_DUST; } }) - .progressBar(GT_UITextures.PROGRESSBAR_MACERATE) + .progressBar(GTUITextures.PROGRESSBAR_MACERATE) .build(); public static final RecipeMap replicatorRecipes = RecipeMapBuilder .of("gt.recipe.replicator", ReplicatorBackend::new) @@ -228,23 +228,23 @@ public final class RecipeMaps { .useSpecialSlot() .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isSpecial) { - return GT_UITextures.OVERLAY_SLOT_DATA_ORB; + return GTUITextures.OVERLAY_SLOT_DATA_ORB; } if (isFluid && !isOutput) { - return GT_UITextures.OVERLAY_SLOT_UUM; + return GTUITextures.OVERLAY_SLOT_UUM; } return null; }) .build(); /** - * Use {@link GT_RecipeConstants#AssemblyLine} for recipe addition. + * Use {@link GTRecipeConstants#AssemblyLine} for recipe addition. */ public static final RecipeMap assemblylineVisualRecipes = RecipeMapBuilder .of("gt.recipe.fakeAssemblylineProcess") .maxIO(16, 1, 4, 0) .minInputs(1, 0) .useSpecialSlot() - .slotOverlays((index, isFluid, isOutput, isSpecial) -> isSpecial ? GT_UITextures.OVERLAY_SLOT_DATA_ORB : null) + .slotOverlays((index, isFluid, isOutput, isSpecial) -> isSpecial ? GTUITextures.OVERLAY_SLOT_DATA_ORB : null) .disableOptimize() .neiTransferRect(88, 8, 18, 72) .neiTransferRect(124, 8, 18, 72) @@ -252,7 +252,7 @@ public final class RecipeMaps { .frontend(AssemblyLineFrontend::new) .build(); /** - * Usually, but not always, you should use {@link GT_RecipeConstants#UniversalArcFurnace} instead. + * Usually, but not always, you should use {@link GTRecipeConstants#UniversalArcFurnace} instead. */ public static final RecipeMap plasmaArcFurnaceRecipes = RecipeMapBuilder .of("gt.recipe.plasmaarcfurnace") @@ -260,7 +260,7 @@ public final class RecipeMaps { .minInputs(1, 1) .build(); /** - * Usually, but not always, you should use {@link GT_RecipeConstants#UniversalArcFurnace} instead. + * Usually, but not always, you should use {@link GTRecipeConstants#UniversalArcFurnace} instead. */ public static final RecipeMap arcFurnaceRecipes = RecipeMapBuilder.of("gt.recipe.arcfurnace") .maxIO(1, 9, 1, 0) @@ -274,20 +274,20 @@ public final class RecipeMaps { .useSpecialSlot() .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isSpecial) { - return GT_UITextures.OVERLAY_SLOT_DATA_STICK; + return GTUITextures.OVERLAY_SLOT_DATA_STICK; } if (isFluid) { return null; } if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_PAGE_PRINTED; + return GTUITextures.OVERLAY_SLOT_PAGE_PRINTED; } - return GT_UITextures.OVERLAY_SLOT_PAGE_BLANK; + return GTUITextures.OVERLAY_SLOT_PAGE_BLANK; }) .build(); public static final RecipeMap sifterRecipes = RecipeMapBuilder.of("gt.recipe.sifter") .maxIO(1, 9, 1, 1) - .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN) + .progressBar(GTUITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN) .build(); public static final RecipeMap formingPressRecipes = RecipeMapBuilder .of("gt.recipe.press", FormingPressBackend::new) @@ -295,32 +295,32 @@ public final class RecipeMaps { .minInputs(2, 0) .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_PRESS_3; + return GTUITextures.OVERLAY_SLOT_PRESS_3; } if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_PRESS_1; + return GTUITextures.OVERLAY_SLOT_PRESS_1; } - return GT_UITextures.OVERLAY_SLOT_PRESS_2; + return GTUITextures.OVERLAY_SLOT_PRESS_2; }) - .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS) + .progressBar(GTUITextures.PROGRESSBAR_COMPRESS) .build(); public static final RecipeMap laserEngraverRecipes = RecipeMapBuilder .of("gt.recipe.laserengraver") .maxIO(4, 4, 2, 2) .slotOverlays( (index, isFluid, isOutput, - isSpecial) -> !isFluid && !isOutput && index != 0 ? GT_UITextures.OVERLAY_SLOT_LENS : null) + isSpecial) -> !isFluid && !isOutput && index != 0 ? GTUITextures.OVERLAY_SLOT_LENS : null) // Add a simple ordering so lower tier purified water is displayed first, otherwise it gets really confusing .neiRecipeComparator( (a, b) -> Comparator.comparing(PurifiedWaterHelpers::getWaterTierFromRecipe) - .thenComparing(GT_Recipe::compareTo) + .thenComparing(GTRecipe::compareTo) .compare(a, b)) .build(); public static final RecipeMap mixerRecipes = RecipeMapBuilder.of("gt.recipe.mixer") .maxIO(9, 4, 1, 1) .minInputs(1, 0) - .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isFluid ? GT_UITextures.OVERLAY_SLOT_DUST : null) - .progressBar(GT_UITextures.PROGRESSBAR_MIXER, ProgressBar.Direction.CIRCULAR_CW) + .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isFluid ? GTUITextures.OVERLAY_SLOT_DUST : null) + .progressBar(GTUITextures.PROGRESSBAR_MIXER, ProgressBar.Direction.CIRCULAR_CW) .build(); public static final RecipeMap autoclaveRecipes = RecipeMapBuilder.of("gt.recipe.autoclave") .maxIO(2, 4, 1, 1) @@ -331,11 +331,11 @@ public final class RecipeMaps { } if (isOutput) { if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_GEM; + return GTUITextures.OVERLAY_SLOT_GEM; } - return GT_UITextures.OVERLAY_SLOT_DUST; + return GTUITextures.OVERLAY_SLOT_DUST; } - return GT_UITextures.OVERLAY_SLOT_DUST; + return GTUITextures.OVERLAY_SLOT_DUST; }) .build(); public static final RecipeMap electroMagneticSeparatorRecipes = RecipeMapBuilder @@ -343,47 +343,47 @@ public final class RecipeMaps { .maxIO(1, 3, 0, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> isOutput ? GT_UITextures.OVERLAY_SLOT_DUST - : GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE) - .progressBar(GT_UITextures.PROGRESSBAR_MAGNET) + (index, isFluid, isOutput, isSpecial) -> isOutput ? GTUITextures.OVERLAY_SLOT_DUST + : GTUITextures.OVERLAY_SLOT_CRUSHED_ORE) + .progressBar(GTUITextures.PROGRESSBAR_MAGNET) .build(); public static final RecipeMap polarizerRecipes = RecipeMapBuilder.of("gt.recipe.polarizer") .maxIO(1, 1, 0, 0) .minInputs(1, 0) - .progressBar(GT_UITextures.PROGRESSBAR_MAGNET) + .progressBar(GTUITextures.PROGRESSBAR_MAGNET) .build(); public static final RecipeMap maceratorRecipes = RecipeMapBuilder.of("gt.recipe.macerator") .maxIO(1, 4, 0, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> isOutput ? GT_UITextures.OVERLAY_SLOT_DUST - : GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE) + (index, isFluid, isOutput, isSpecial) -> isOutput ? GTUITextures.OVERLAY_SLOT_DUST + : GTUITextures.OVERLAY_SLOT_CRUSHED_ORE) .slotOverlaysSteam( - (index, isFluid, isOutput, isSpecial) -> isOutput ? GT_UITextures.OVERLAY_SLOT_DUST_STEAM - : GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE_STEAM) - .progressBar(GT_UITextures.PROGRESSBAR_MACERATE) - .progressBarSteam(GT_UITextures.PROGRESSBAR_MACERATE_STEAM) + (index, isFluid, isOutput, isSpecial) -> isOutput ? GTUITextures.OVERLAY_SLOT_DUST_STEAM + : GTUITextures.OVERLAY_SLOT_CRUSHED_ORE_STEAM) + .progressBar(GTUITextures.PROGRESSBAR_MACERATE) + .progressBarSteam(GTUITextures.PROGRESSBAR_MACERATE_STEAM) // Avoid steam machine being used as handler icon .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Macerator.get(1))) .build(); public static final RecipeMap chemicalBathRecipes = RecipeMapBuilder.of("gt.recipe.chemicalbath") .maxIO(1, 3, 1, 1) .minInputs(1, 1) - .progressBar(GT_UITextures.PROGRESSBAR_BATH, ProgressBar.Direction.CIRCULAR_CW) + .progressBar(GTUITextures.PROGRESSBAR_BATH, ProgressBar.Direction.CIRCULAR_CW) .build(); public static final RecipeMap fluidCannerRecipes = RecipeMapBuilder .of("gt.recipe.fluidcanner", FluidCannerBackend::new) .maxIO(1, 1, 1, 1) .minInputs(1, 0) - .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isFluid ? GT_UITextures.OVERLAY_SLOT_CANISTER : null) - .progressBar(GT_UITextures.PROGRESSBAR_CANNER) + .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isFluid ? GTUITextures.OVERLAY_SLOT_CANISTER : null) + .progressBar(GTUITextures.PROGRESSBAR_CANNER) .build(); public static final RecipeMap brewingRecipes = RecipeMapBuilder.of("gt.recipe.brewer") .maxIO(1, 0, 1, 1) .minInputs(1, 1) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CAULDRON : null) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_CAULDRON : null) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .build(); public static final RecipeMap fluidHeaterRecipes = RecipeMapBuilder.of("gt.recipe.fluidheater") .maxIO(1, 0, 1, 1) @@ -392,11 +392,11 @@ public final class RecipeMaps { return null; } if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_HEATER_2; + return GTUITextures.OVERLAY_SLOT_HEATER_2; } - return GT_UITextures.OVERLAY_SLOT_HEATER_1; + return GTUITextures.OVERLAY_SLOT_HEATER_1; }) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .build(); public static final RecipeMap distilleryRecipes = RecipeMapBuilder.of("gt.recipe.distillery") .maxIO(1, 1, 1, 1) @@ -406,11 +406,11 @@ public final class RecipeMaps { return null; } if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_BEAKER_2; + return GTUITextures.OVERLAY_SLOT_BEAKER_2; } - return GT_UITextures.OVERLAY_SLOT_BEAKER_1; + return GTUITextures.OVERLAY_SLOT_BEAKER_1; }) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .recipeTransformer(r -> { int aInput = r.mFluidInputs[0].amount, aOutput = r.mFluidOutputs[0].amount, aDuration = r.mDuration; @@ -434,14 +434,14 @@ public final class RecipeMaps { aInput = (aInput + tScale - 1) / tScale; aOutput = aOutput / tScale; if (!isArrayEmptyOrNull(r.mOutputs)) { - ItemData tData = GT_OreDictUnificator.getItemData(r.mOutputs[0]); + ItemData tData = GTOreDictUnificator.getItemData(r.mOutputs[0]); if (tData != null && (tData.mPrefix == OrePrefixes.dust || OrePrefixes.dust.mFamiliarPrefixes.contains(tData.mPrefix))) { - r.mOutputs[0] = GT_OreDictUnificator.getDust( + r.mOutputs[0] = GTOreDictUnificator.getDust( tData.mMaterial.mMaterial, tData.mMaterial.mAmount * r.mOutputs[0].stackSize / tScale); } else { - if (r.mOutputs[0].stackSize / tScale == 0) r.mOutputs[0] = GT_Values.NI; + if (r.mOutputs[0].stackSize / tScale == 0) r.mOutputs[0] = GTValues.NI; else r.mOutputs[0] = copyAmount(r.mOutputs[0].stackSize / tScale, r.mOutputs[0]); } } @@ -455,14 +455,14 @@ public final class RecipeMaps { public static final RecipeMap fermentingRecipes = RecipeMapBuilder.of("gt.recipe.fermenter") .maxIO(0, 0, 1, 1) .minInputs(0, 1) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .build(); public static final RecipeMap fluidSolidifierRecipes = RecipeMapBuilder .of("gt.recipe.fluidsolidifier") .maxIO(1, 1, 1, 0) .minInputs(1, 1) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_MOLD : null) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_MOLD : null) .recipeTransformer(r -> { if (ArrayUtils.isNotEmpty(r.mFluidInputs)) { if (Materials.PhasedGold.getMolten(1) @@ -479,9 +479,9 @@ public final class RecipeMaps { .maxIO(1, 1, 0, 1) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CENTRIFUGE + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_CENTRIFUGE : null) - .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT) + .progressBar(GTUITextures.PROGRESSBAR_EXTRACT) .recipeTransformer(r -> { if (ArrayUtils.isNotEmpty(r.mFluidOutputs)) { if (Materials.PhasedGold.getMolten(1) @@ -498,10 +498,10 @@ public final class RecipeMaps { .minInputs(2, 0) .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_BOXED; + return GTUITextures.OVERLAY_SLOT_BOXED; } if (index != 0) { - return GT_UITextures.OVERLAY_SLOT_BOX; + return GTUITextures.OVERLAY_SLOT_BOX; } return null; }) @@ -510,7 +510,7 @@ public final class RecipeMaps { .of("gt.recipe.unpackager", UnpackagerBackend::new) .maxIO(1, 2, 0, 0) .minInputs(1, 0) - .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isOutput ? GT_UITextures.OVERLAY_SLOT_BOXED : null) + .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isOutput ? GTUITextures.OVERLAY_SLOT_BOXED : null) .build(); public static final RecipeMap fusionRecipes = RecipeMapBuilder.of("gt.recipe.fusionreactor") .maxIO(0, 0, 2, 1) @@ -520,9 +520,9 @@ public final class RecipeMaps { .neiSpecialInfoFormatter(FusionSpecialValueFormatter.INSTANCE) .neiRecipeComparator( Comparator - .comparing( + .comparing( recipe -> FusionSpecialValueFormatter.getFusionTier(recipe.mSpecialValue, recipe.mEUt)) - .thenComparing(GT_Recipe::compareTo)) + .thenComparing(GTRecipe::compareTo)) .frontend(FluidOnlyFrontend::new) .build(); public static final RecipeMap centrifugeRecipes = RecipeMapBuilder.of("gt.recipe.centrifuge") @@ -532,15 +532,15 @@ public final class RecipeMaps { return null; } if (isFluid) { - return GT_UITextures.OVERLAY_SLOT_CENTRIFUGE_FLUID; + return GTUITextures.OVERLAY_SLOT_CENTRIFUGE_FLUID; } else { if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_CENTRIFUGE; + return GTUITextures.OVERLAY_SLOT_CENTRIFUGE; } - return GT_UITextures.OVERLAY_SLOT_CANISTER; + return GTUITextures.OVERLAY_SLOT_CANISTER; } }) - .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT) + .progressBar(GTUITextures.PROGRESSBAR_EXTRACT) .build(); public static final RecipeMap electrolyzerRecipes = RecipeMapBuilder.of("gt.recipe.electrolyzer") .maxIO(2, 6, 1, 1) @@ -549,18 +549,18 @@ public final class RecipeMaps { return null; } if (isFluid) { - return GT_UITextures.OVERLAY_SLOT_CHARGER_FLUID; + return GTUITextures.OVERLAY_SLOT_CHARGER_FLUID; } else { if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_CHARGER; + return GTUITextures.OVERLAY_SLOT_CHARGER; } - return GT_UITextures.OVERLAY_SLOT_CANISTER; + return GTUITextures.OVERLAY_SLOT_CANISTER; } }) - .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT) + .progressBar(GTUITextures.PROGRESSBAR_EXTRACT) .build(); /** - * Use {@link GT_RecipeConstants#COIL_HEAT} as heat level. + * Use {@link GTRecipeConstants#COIL_HEAT} as heat level. */ public static final RecipeMap blastFurnaceRecipes = RecipeMapBuilder.of("gt.recipe.blastfurnace") .maxIO(6, 6, 1, 1) @@ -568,7 +568,7 @@ public final class RecipeMaps { .neiSpecialInfoFormatter(HeatingCoilSpecialValueFormatter.INSTANCE) .build(); /** - * Use {@link GT_RecipeConstants#COIL_HEAT} as heat level. + * Use {@link GTRecipeConstants#COIL_HEAT} as heat level. */ public static final RecipeMap plasmaForgeRecipes = RecipeMapBuilder.of("gt.recipe.plasmaforge") .maxIO(9, 9, 9, 9) @@ -606,14 +606,14 @@ public final class RecipeMaps { .disableOptimize() .build(); /** - * Uses {@link GT_RecipeConstants#ADDITIVE_AMOUNT} for coal/charcoal amount. + * Uses {@link GTRecipeConstants#ADDITIVE_AMOUNT} for coal/charcoal amount. */ public static final RecipeMap primitiveBlastRecipes = RecipeMapBuilder .of("gt.recipe.primitiveblastfurnace") .maxIO(3, 3, 0, 0) .minInputs(1, 0) .recipeEmitter(builder -> { - Optional rr = builder.eut(0) + Optional rr = builder.eut(0) .validateInputCount(1, 2) .validateOutputCount(1, 2) .validateNoInputFluid() @@ -629,7 +629,7 @@ public final class RecipeMaps { return Collections.emptyList(); int aCoalAmount = builder.getMetadataOrDefault(ADDITIVE_AMOUNT, 0); if (aCoalAmount <= 0) return Collections.emptyList(); - GT_RecipeTemplate coll = asTemplate(rr.get()); + GTRecipeTemplate coll = asTemplate(rr.get()); for (Materials coal : new Materials[] { Materials.Coal, Materials.Charcoal }) { coll.derive() .setInputs(aInput1, aInput2, coal.getGems(aCoalAmount)) @@ -684,7 +684,7 @@ public final class RecipeMaps { }) .build(); /** - * Uses {@link GT_RecipeConstants#ADDITIVE_AMOUNT} for TNT/ITNT/... amount. Value is truncated to [0, 64] + * Uses {@link GTRecipeConstants#ADDITIVE_AMOUNT} for TNT/ITNT/... amount. Value is truncated to [0, 64] */ public static final RecipeMap implosionRecipes = RecipeMapBuilder .of("gt.recipe.implosioncompressor") @@ -693,13 +693,13 @@ public final class RecipeMaps { .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (!isFluid && !isOutput) { if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_IMPLOSION; + return GTUITextures.OVERLAY_SLOT_IMPLOSION; } - return GT_UITextures.OVERLAY_SLOT_EXPLOSIVE; + return GTUITextures.OVERLAY_SLOT_EXPLOSIVE; } return null; }) - .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS) + .progressBar(GTUITextures.PROGRESSBAR_COMPRESS) .disableOptimize() .recipeEmitter(b -> { switch (b.getItemInputsBasic().length) { @@ -712,7 +712,7 @@ public final class RecipeMaps { .map(Collections::singletonList) .orElse(Collections.emptyList()); } - Optional t = b.noOptimize() + Optional t = b.noOptimize() .duration(20) .eut(30) .validateInputCount(1, 1) @@ -720,7 +720,7 @@ public final class RecipeMaps { .build(); if (!t.isPresent()) return Collections.emptyList(); ItemStack input = b.getItemInputBasic(0); - GT_RecipeTemplate coll = asTemplate(t.get()); + GTRecipeTemplate coll = asTemplate(t.get()); int tExplosives = Math.min(b.getMetadataOrDefault(ADDITIVE_AMOUNT, 0), 64); int tGunpowder = tExplosives << 1; // Worst int tDynamite = Math.max(1, tExplosives >> 1); // good @@ -730,11 +730,11 @@ public final class RecipeMaps { if (tGunpowder < 65) coll.derive() .setInputs(input, ItemList.Block_Powderbarrel.get(tGunpowder)); if (tDynamite < 17) coll.derive() - .setInputs(input, GT_ModHandler.getIC2Item("dynamite", tDynamite, null)); + .setInputs(input, GTModHandler.getIC2Item("dynamite", tDynamite, null)); coll.derive() .setInputs(input, new ItemStack(Blocks.tnt, tTNT)); coll.derive() - .setInputs(input, GT_ModHandler.getIC2Item("industrialTnt", tITNT, null)); + .setInputs(input, GTModHandler.getIC2Item("industrialTnt", tITNT, null)); return coll.getAll(); }) .build(); @@ -749,7 +749,7 @@ public final class RecipeMaps { && isArrayEmptyOrNull(b.getFluidOutputs()) && (in = getFluidForFilledItem(b.getItemInputBasic(0), true)) != null && (out = getFluidForFilledItem(b.getItemOutput(0), true)) != null) { - Collection ret = new ArrayList<>(); + Collection ret = new ArrayList<>(); b.build() .ifPresent(ret::add); b.itemInputs() @@ -765,7 +765,7 @@ public final class RecipeMaps { .build(); /** * Using {@code .addTo(chemicalReactorRecipes)} will cause the recipe to be added to single block recipe map ONLY! - * Use {@link GT_RecipeConstants#UniversalChemical} to add to both. + * Use {@link GTRecipeConstants#UniversalChemical} to add to both. */ public static final RecipeMap chemicalReactorRecipes = RecipeMapBuilder .of("gt.recipe.chemicalreactor") @@ -774,30 +774,30 @@ public final class RecipeMaps { .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isFluid) { if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_VIAL_2; + return GTUITextures.OVERLAY_SLOT_VIAL_2; } - return GT_UITextures.OVERLAY_SLOT_MOLECULAR_3; + return GTUITextures.OVERLAY_SLOT_MOLECULAR_3; } else { if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_VIAL_1; + return GTUITextures.OVERLAY_SLOT_VIAL_1; } if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_MOLECULAR_1; + return GTUITextures.OVERLAY_SLOT_MOLECULAR_1; } - return GT_UITextures.OVERLAY_SLOT_MOLECULAR_2; + return GTUITextures.OVERLAY_SLOT_MOLECULAR_2; } }) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .disableOptimize() .build(); /** * Using {@code .addTo(multiblockChemicalReactorRecipes)} will cause the recipe to be added to - * multiblock recipe map ONLY! Use {@link GT_RecipeConstants#UniversalChemical} to add to both. + * multiblock recipe map ONLY! Use {@link GTRecipeConstants#UniversalChemical} to add to both. */ public static final RecipeMap multiblockChemicalReactorRecipes = RecipeMapBuilder .of("gt.recipe.largechemicalreactor") .maxIO(6, 6, 6, 6) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .disableOptimize() .frontend(LargeNEIFrontend::new) .build(); @@ -809,12 +809,12 @@ public final class RecipeMaps { return null; } if (isFluid) { - return GT_UITextures.OVERLAY_SLOTS_NUMBER[index + 1]; + return GTUITextures.OVERLAY_SLOTS_NUMBER[index + 1]; } else { - return GT_UITextures.OVERLAY_SLOTS_NUMBER[0]; + return GTUITextures.OVERLAY_SLOTS_NUMBER[0]; } }) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .logoPos(80, 62) .frontend(DistillationTowerFrontend::new) .disableOptimize() @@ -823,7 +823,7 @@ public final class RecipeMaps { .of("gt.recipe.craker", OilCrackerBackend::new) .maxIO(1, 1, 2, 1) .minInputs(1, 2) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE) + .progressBar(GTUITextures.PROGRESSBAR_ARROW_MULTIPLE) .build(); public static final RecipeMap pyrolyseRecipes = RecipeMapBuilder.of("gt.recipe.pyro") .maxIO(2, 1, 1, 1) @@ -834,26 +834,26 @@ public final class RecipeMaps { .maxIO(2, 1, 0, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_WIREMILL : null) - .progressBar(GT_UITextures.PROGRESSBAR_WIREMILL) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_WIREMILL : null) + .progressBar(GTUITextures.PROGRESSBAR_WIREMILL) .build(); public static final RecipeMap benderRecipes = RecipeMapBuilder.of("gt.recipe.metalbender") .maxIO(2, 1, 0, 0) .minInputs(2, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_BENDER : null) - .progressBar(GT_UITextures.PROGRESSBAR_BENDING) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_BENDER : null) + .progressBar(GTUITextures.PROGRESSBAR_BENDING) .build(); public static final RecipeMap alloySmelterRecipes = RecipeMapBuilder.of("gt.recipe.alloysmelter") .maxIO(2, 1, 0, 0) .minInputs(2, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE : null) - .slotOverlaysSteam((index, isFluid, isOutput, isSpecial) -> GT_UITextures.OVERLAY_SLOT_FURNACE_STEAM) - .progressBarSteam(GT_UITextures.PROGRESSBAR_ARROW_STEAM) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_FURNACE : null) + .slotOverlaysSteam((index, isFluid, isOutput, isSpecial) -> GTUITextures.OVERLAY_SLOT_FURNACE_STEAM) + .progressBarSteam(GTUITextures.PROGRESSBAR_ARROW_STEAM) .recipeEmitter(b -> { if (Materials.Graphite.contains(b.getItemInputBasic(0))) return Collections.emptyList(); - if (GT_Utility.isArrayOfLength(b.getItemInputsBasic(), 1)) { + if (GTUtility.isArrayOfLength(b.getItemInputsBasic(), 1)) { ItemStack aInput1 = b.getItemInputBasic(0); if (((OrePrefixes.ingot.contains(aInput1)) || (OrePrefixes.dust.contains(aInput1)) || (OrePrefixes.gem.contains(aInput1)))) return Collections.emptyList(); @@ -872,8 +872,8 @@ public final class RecipeMaps { .maxIO(9, 1, 1, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CIRCUIT : null) - .progressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_CIRCUIT : null) + .progressBar(GTUITextures.PROGRESSBAR_ASSEMBLE) .disableOptimize() .build(); public static final RecipeMap circuitAssemblerRecipes = RecipeMapBuilder @@ -881,8 +881,8 @@ public final class RecipeMaps { .maxIO(6, 1, 1, 0) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CIRCUIT : null) - .progressBar(GT_UITextures.PROGRESSBAR_CIRCUIT_ASSEMBLER) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_CIRCUIT : null) + .progressBar(GTUITextures.PROGRESSBAR_CIRCUIT_ASSEMBLER) .unificateOutputNEI(!NEICustomDiagrams.isModLoaded()) .build(); public static final RecipeMap cannerRecipes = RecipeMapBuilder.of("gt.recipe.canner") @@ -893,11 +893,11 @@ public final class RecipeMaps { return null; } if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_CANNER; + return GTUITextures.OVERLAY_SLOT_CANNER; } - return GT_UITextures.OVERLAY_SLOT_CANISTER; + return GTUITextures.OVERLAY_SLOT_CANISTER; }) - .progressBar(GT_UITextures.PROGRESSBAR_CANNER) + .progressBar(GTUITextures.PROGRESSBAR_CANNER) .build(); public static final RecipeMap latheRecipes = RecipeMapBuilder.of("gt.recipe.lathe") .maxIO(1, 2, 0, 0) @@ -905,14 +905,14 @@ public final class RecipeMaps { .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isOutput) { if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_ROD_2; + return GTUITextures.OVERLAY_SLOT_ROD_2; } - return GT_UITextures.OVERLAY_SLOT_DUST; + return GTUITextures.OVERLAY_SLOT_DUST; } - return GT_UITextures.OVERLAY_SLOT_ROD_1; + return GTUITextures.OVERLAY_SLOT_ROD_1; }) - .progressBar(GT_UITextures.PROGRESSBAR_LATHE) - .addSpecialTexture(98, 24, 5, 18, GT_UITextures.PROGRESSBAR_LATHE_BASE) + .progressBar(GTUITextures.PROGRESSBAR_LATHE) + .addSpecialTexture(98, 24, 5, 18, GTUITextures.PROGRESSBAR_LATHE_BASE) .build(); public static final RecipeMap cutterRecipes = RecipeMapBuilder.of("gt.recipe.cuttingsaw") .maxIO(2, 4, 1, 0) @@ -923,13 +923,13 @@ public final class RecipeMaps { } if (isOutput) { if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_CUTTER_SLICED; + return GTUITextures.OVERLAY_SLOT_CUTTER_SLICED; } - return GT_UITextures.OVERLAY_SLOT_DUST; + return GTUITextures.OVERLAY_SLOT_DUST; } - return GT_UITextures.OVERLAY_SLOT_BOX; + return GTUITextures.OVERLAY_SLOT_BOX; }) - .progressBar(GT_UITextures.PROGRESSBAR_CUT) + .progressBar(GTUITextures.PROGRESSBAR_CUT) .recipeEmitter(b -> { b.validateInputCount(1, 2) .validateOutputCount(1, 4) @@ -937,14 +937,14 @@ public final class RecipeMaps { if ((b.getFluidInputs() != null && b.getFluidInputs().length > 0) || !b.isValid()) return buildOrEmpty(b.validateInputFluidCount(1, 1)); int aDuration = b.getDuration(), aEUt = b.getEUt(); - Collection ret = new ArrayList<>(); + Collection ret = new ArrayList<>(); b.copy() .fluidInputs(Materials.Water.getFluid(clamp(aDuration * aEUt / 320, 4, 1000))) .duration(aDuration * 2) .build() .ifPresent(ret::add); b.copy() - .fluidInputs(GT_ModHandler.getDistilledWater(clamp(aDuration * aEUt / 426, 3, 750))) + .fluidInputs(GTModHandler.getDistilledWater(clamp(aDuration * aEUt / 426, 3, 750))) .duration(aDuration * 2) .build() .ifPresent(ret::add); @@ -960,34 +960,34 @@ public final class RecipeMaps { .minInputs(2, 0) .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_SLICER_SLICED; + return GTUITextures.OVERLAY_SLOT_SLICER_SLICED; } if (index == 0) { - return GT_UITextures.OVERLAY_SLOT_SQUARE; + return GTUITextures.OVERLAY_SLOT_SQUARE; } - return GT_UITextures.OVERLAY_SLOT_SLICE_SHAPE; + return GTUITextures.OVERLAY_SLOT_SLICE_SHAPE; }) - .progressBar(GT_UITextures.PROGRESSBAR_SLICE) + .progressBar(GTUITextures.PROGRESSBAR_SLICE) .build(); public static final RecipeMap extruderRecipes = RecipeMapBuilder.of("gt.recipe.extruder") .maxIO(2, 1, 0, 0) .minInputs(2, 0) .slotOverlays( (index, isFluid, isOutput, - isSpecial) -> !isFluid && !isOutput && index != 0 ? GT_UITextures.OVERLAY_SLOT_EXTRUDER_SHAPE : null) - .progressBar(GT_UITextures.PROGRESSBAR_EXTRUDE) + isSpecial) -> !isFluid && !isOutput && index != 0 ? GTUITextures.OVERLAY_SLOT_EXTRUDER_SHAPE : null) + .progressBar(GTUITextures.PROGRESSBAR_EXTRUDE) .build(); public static final RecipeMap hammerRecipes = RecipeMapBuilder.of("gt.recipe.hammer") .maxIO(2, 2, 2, 2) .minInputs(1, 0) .slotOverlays( - (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_HAMMER : null) - .progressBar(GT_UITextures.PROGRESSBAR_HAMMER, ProgressBar.Direction.DOWN) - .addSpecialTexture(78, 42, 20, 6, GT_UITextures.PROGRESSBAR_HAMMER_BASE) + (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GTUITextures.OVERLAY_SLOT_HAMMER : null) + .progressBar(GTUITextures.PROGRESSBAR_HAMMER, ProgressBar.Direction.DOWN) + .addSpecialTexture(78, 42, 20, 6, GTUITextures.PROGRESSBAR_HAMMER_BASE) .slotOverlaysSteam( - (index, isFluid, isOutput, isSpecial) -> !isOutput ? GT_UITextures.OVERLAY_SLOT_HAMMER_STEAM : null) - .progressBarSteam(GT_UITextures.PROGRESSBAR_HAMMER_STEAM) - .addSpecialTextureSteam(78, 42, 20, 6, GT_UITextures.PROGRESSBAR_HAMMER_BASE_STEAM) + (index, isFluid, isOutput, isSpecial) -> !isOutput ? GTUITextures.OVERLAY_SLOT_HAMMER_STEAM : null) + .progressBarSteam(GTUITextures.PROGRESSBAR_HAMMER_STEAM) + .addSpecialTextureSteam(78, 42, 20, 6, GTUITextures.PROGRESSBAR_HAMMER_BASE_STEAM) // Avoid steam machine being used as handler icon .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Hammer.get(1))) .build(); @@ -996,14 +996,14 @@ public final class RecipeMaps { .minInputs(1, 0) .slotOverlays((index, isFluid, isOutput, isSpecial) -> { if (isFluid) { - return GT_UITextures.OVERLAY_SLOT_UUA; + return GTUITextures.OVERLAY_SLOT_UUA; } if (!isOutput) { - return GT_UITextures.OVERLAY_SLOT_CENTRIFUGE; + return GTUITextures.OVERLAY_SLOT_CENTRIFUGE; } return null; }) - .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT) + .progressBar(GTUITextures.PROGRESSBAR_EXTRACT) .build(); public static final RecipeMap massFabFakeRecipes = RecipeMapBuilder.of("gt.recipe.massfab") .maxIO(1, 0, 1, 1) @@ -1014,9 +1014,9 @@ public final class RecipeMaps { return null; } if (isOutput) { - return GT_UITextures.OVERLAY_SLOT_UUM; + return GTUITextures.OVERLAY_SLOT_UUM; } - return GT_UITextures.OVERLAY_SLOT_UUA; + return GTUITextures.OVERLAY_SLOT_UUA; }) .build(); public static final RecipeMap dieselFuels = RecipeMapBuilder @@ -1083,20 +1083,20 @@ public final class RecipeMaps { .of("gt.recipe.largeelectrolyzer") .maxIO(1, 6, 1, 6) .disableRegisterNEI() - .recipeEmitter(GT_RecipeMapUtil::buildRecipeForMultiblock) + .recipeEmitter(GTRecipeMapUtil::buildRecipeForMultiblock) .build(); public static final RecipeMap centrifugeNonCellRecipes = RecipeMapBuilder .of("gt.recipe.largecentrifuge") .maxIO(2, 6, 1, 6) .disableOptimize() .disableRegisterNEI() - .recipeEmitter(GT_RecipeMapUtil::buildRecipeForMultiblock) + .recipeEmitter(GTRecipeMapUtil::buildRecipeForMultiblock) .build(); public static final RecipeMap mixerNonCellRecipes = RecipeMapBuilder.of("gt.recipe.largemixer") .maxIO(9, 4, 6, 4) .disableOptimize() .disableRegisterNEI() - .recipeEmitter(GT_RecipeMapUtil::buildRecipeForMultiblockNoCircuit) + .recipeEmitter(GTRecipeMapUtil::buildRecipeForMultiblockNoCircuit) .build(); public static final RecipeMap largeBoilerFakeFuels = RecipeMapBuilder .of("gt.recipe.largeboilerfakefuels", LargeBoilerFuelBackend::new) @@ -1110,20 +1110,20 @@ public final class RecipeMaps { .minInputs(2, 1) .slotOverlays( (index, isFluid, isOutput, - isSpecial) -> !isFluid && !isOutput && index == 0 ? GT_UITextures.OVERLAY_SLOT_LENS : null) - .progressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE) + isSpecial) -> !isFluid && !isOutput && index == 0 ? GTUITextures.OVERLAY_SLOT_LENS : null) + .progressBar(GTUITextures.PROGRESSBAR_ASSEMBLE) .disableOptimize() .neiSpecialInfoFormatter(new SimpleSpecialValueFormatter("GT5U.nei.tier")) .build(); public static final RecipeMap pcbFactoryRecipes = RecipeMapBuilder.of("gt.recipe.pcbfactory") .maxIO(6, 9, 3, 0) .minInputs(3, 1) - .progressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE) + .progressBar(GTUITextures.PROGRESSBAR_ASSEMBLE) .disableOptimize() .neiRecipeComparator( Comparator - .comparing(recipe -> recipe.getMetadataOrDefault(PCBFactoryTierKey.INSTANCE, 1)) - .thenComparing(GT_Recipe::compareTo)) + .comparing(recipe -> recipe.getMetadataOrDefault(PCBFactoryTierKey.INSTANCE, 1)) + .thenComparing(GTRecipe::compareTo)) .build(); public static final RecipeMap purificationClarifierRecipes = RecipeMapBuilder .of("gt.recipe.purificationplantclarifier") @@ -1136,12 +1136,12 @@ public final class RecipeMaps { .of("gt.recipe.purificationplantozonation") .maxIO(0, 4, 2, 1) .minInputs(0, 2) - .progressBar(GT_UITextures.PROGRESSBAR_BATH) + .progressBar(GTUITextures.PROGRESSBAR_BATH) .neiRecipeComparator( Comparator - .comparing( + .comparing( recipe -> recipe.getMetadataOrDefault(PurificationPlantBaseChanceKey.INSTANCE, 0.0f)) - .thenComparing(GT_Recipe::compareTo)) + .thenComparing(GTRecipe::compareTo)) .frontend(PurificationUnitOzonationFrontend::new) .disableOptimize() .build(); @@ -1149,12 +1149,12 @@ public final class RecipeMaps { .of("gt.recipe.purificationplantflocculation") .maxIO(0, 3, 2, 2) .minInputs(0, 1) - .progressBar(GT_UITextures.PROGRESSBAR_BATH) + .progressBar(GTUITextures.PROGRESSBAR_BATH) .neiRecipeComparator( Comparator - .comparing( + .comparing( recipe -> recipe.getMetadataOrDefault(PurificationPlantBaseChanceKey.INSTANCE, 0.0f)) - .thenComparing(GT_Recipe::compareTo)) + .thenComparing(GTRecipe::compareTo)) .frontend(PurificationUnitFlocculatorFrontend::new) .disableOptimize() .build(); @@ -1163,7 +1163,7 @@ public final class RecipeMaps { .of("gt.recipe.purificationplantphadjustment") .maxIO(0, 0, 1, 1) .minInputs(0, 1) - .progressBar(GT_UITextures.PROGRESSBAR_MIXER) + .progressBar(GTUITextures.PROGRESSBAR_MIXER) .frontend(PurificationUnitPhAdjustmentFrontend::new) .disableOptimize() .build(); @@ -1172,7 +1172,7 @@ public final class RecipeMaps { .of("gt.recipe.purificationplantplasmaheating") .maxIO(0, 0, 1, 1) .minInputs(0, 1) - .progressBar(GT_UITextures.PROGRESSBAR_BOILER_HEAT) + .progressBar(GTUITextures.PROGRESSBAR_BOILER_HEAT) .frontend(PurificationUnitPlasmaHeaterFrontend::new) .disableOptimize() .build(); @@ -1180,7 +1180,7 @@ public final class RecipeMaps { .of("gt.recipe.purificationplantuvtreatment") .maxIO(9, 0, 1, 1) .minInputs(0, 1) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW) + .progressBar(GTUITextures.PROGRESSBAR_ARROW) .frontend(PurificationUnitLaserFrontend::new) .disableOptimize() .build(); @@ -1188,14 +1188,14 @@ public final class RecipeMaps { .of("gt.recipe.purificationplantdegasifier") .maxIO(0, 3, 1, 2) .minInputs(0, 1) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW) + .progressBar(GTUITextures.PROGRESSBAR_ARROW) .disableOptimize() .build(); public static final RecipeMap purificationParticleExtractionRecipes = RecipeMapBuilder .of("gt.recipe.purificationplantquarkextractor") .maxIO(2, 2, 1, 2) .minInputs(0, 1) - .progressBar(GT_UITextures.PROGRESSBAR_ARROW) + .progressBar(GTUITextures.PROGRESSBAR_ARROW) .frontend(PurificationUnitParticleExtractorFrontend::new) .disableOptimize() .build(); @@ -1203,10 +1203,10 @@ public final class RecipeMaps { .maxIO(1, 1, 0, 0) .minInputs(1, 0) .disableOptimize() - .logo(GT_UITextures.PICTURE_RADIATION_WARNING) + .logo(GTUITextures.PICTURE_RADIATION_WARNING) .logoPos(152, 41) .neiRecipeBackgroundSize(170, 60) - .neiHandlerInfo(builder -> builder.setDisplayStack(GT_ModHandler.getIC2Item("nuclearReactor", 1, null))) + .neiHandlerInfo(builder -> builder.setDisplayStack(GTModHandler.getIC2Item("nuclearReactor", 1, null))) .build(); static { diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java index 9383abad9d..18edab74e7 100644 --- a/src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java +++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java @@ -11,7 +11,7 @@ import net.minecraft.util.StatCollector; import org.jetbrains.annotations.NotNull; import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class ResultInsufficientHeat implements CheckRecipeResult { @@ -38,7 +38,7 @@ public class ResultInsufficientHeat implements CheckRecipeResult { return Objects.requireNonNull( StatCollector.translateToLocalFormatted( "GT5U.gui.text.insufficient_heat", - GT_Utility.formatNumbers(required), + GTUtility.formatNumbers(required), HeatingCoilLevel.getDisplayNameFromHeat(required, true))); } diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java index 1fb2183edb..2f144049f1 100644 --- a/src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java +++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java @@ -10,7 +10,7 @@ import net.minecraft.util.StatCollector; import org.jetbrains.annotations.NotNull; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class ResultInsufficientMachineTier implements CheckRecipeResult { @@ -37,7 +37,7 @@ public class ResultInsufficientMachineTier implements CheckRecipeResult { return Objects.requireNonNull( StatCollector.translateToLocalFormatted( "GT5U.gui.text.insufficient_machine_tier", - GT_Utility.formatNumbers(required))); + GTUtility.formatNumbers(required))); } @Override diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java index 45b50aebf6..33b86ecbf8 100644 --- a/src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java +++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java @@ -10,7 +10,7 @@ import net.minecraft.util.StatCollector; import org.jetbrains.annotations.NotNull; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class ResultInsufficientPower implements CheckRecipeResult { @@ -37,8 +37,8 @@ public class ResultInsufficientPower implements CheckRecipeResult { return Objects.requireNonNull( StatCollector.translateToLocalFormatted( "GT5U.gui.text.insufficient_power", - GT_Utility.formatNumbers(required), - GT_Utility.getColoredTierNameFromVoltage(required))); + GTUtility.formatNumbers(required), + GTUtility.getColoredTierNameFromVoltage(required))); } @Override diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java index c33e9bfff1..9adf82aa28 100644 --- a/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java +++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java @@ -10,7 +10,7 @@ import net.minecraft.util.StatCollector; import org.jetbrains.annotations.NotNull; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class ResultInsufficientStartupPower implements CheckRecipeResult { @@ -37,7 +37,7 @@ public class ResultInsufficientStartupPower implements CheckRecipeResult { return Objects.requireNonNull( StatCollector.translateToLocalFormatted( "GT5U.gui.text.insufficient_startup_power", - GT_Utility.formatNumbers(required))); + GTUtility.formatNumbers(required))); } @Override diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPowerBigInt.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPowerBigInt.java index f4b186c9a1..32aab79465 100644 --- a/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPowerBigInt.java +++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPowerBigInt.java @@ -1,6 +1,6 @@ package gregtech.api.recipe.check; -import static util.Util.toStandardForm; +import static kekztech.util.Util.toStandardForm; import java.math.BigInteger; import java.util.Objects; diff --git a/src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java b/src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java index 8683812d84..d339f8acfd 100644 --- a/src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java +++ b/src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java @@ -22,11 +22,11 @@ import net.minecraftforge.fluids.FluidStack; import com.google.common.collect.ImmutableMap; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.recipe.RecipeMap; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.GT_Utility.ItemId; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GTUtility.ItemId; /** * Used by machines that are locked to a single recipe, for faster recipe check. @@ -37,10 +37,10 @@ import gregtech.api.util.GT_Utility.ItemId; *

    * {@link gregtech.api.recipe.FindRecipeQuery#find Find recipe from recipemap}: O(NCR) * where N = number of machine inputs, C = average amount of recipe candidates found for specific input, - * R = computation time to {@link GT_Recipe#isRecipeInputEqual check if inputs match to recipe} + * R = computation time to {@link GTRecipe#isRecipeInputEqual check if inputs match to recipe} *
*
    - * {@link GT_Recipe#isRecipeInputEqual Check if inputs match to recipe}: O(NM) + * {@link GTRecipe#isRecipeInputEqual Check if inputs match to recipe}: O(NM) * where N = number of machine inputs, M = number of recipe inputs *
* @@ -52,7 +52,7 @@ import gregtech.api.util.GT_Utility.ItemId; public class SingleRecipeCheck { @Nonnull - private final GT_Recipe recipe; + private final GTRecipe recipe; @Nonnull private final RecipeMap recipeMap; @Nonnull @@ -63,7 +63,7 @@ public class SingleRecipeCheck { private final int totalItemCost; private final int totalFluidCost; - private SingleRecipeCheck(@Nonnull GT_Recipe recipe, @Nonnull RecipeMap recipeMap, + private SingleRecipeCheck(@Nonnull GTRecipe recipe, @Nonnull RecipeMap recipeMap, @Nonnull ImmutableMap itemCost, @Nonnull ImmutableMap fluidCost) { this.recipe = recipe; this.recipeMap = recipeMap; @@ -81,7 +81,7 @@ public class SingleRecipeCheck { } @Nonnull - public GT_Recipe getRecipe() { + public GTRecipe getRecipe() { return recipe; } @@ -188,14 +188,14 @@ public class SingleRecipeCheck { // At load time we do a recipe check again, so in case the recipe is gone, we can stop tracking. // Of course the next step would be auto migrating to new recipe (if any), but given // we don't yet have a mean to uniquely name a recipe, this will have to make do. - // Consider move serialization code to GT_Recipe once this has been proven to work + // Consider move serialization code to GTRecipe once this has been proven to work NBTTagCompound tag = new NBTTagCompound(); tag.setString("recipemap", recipeMap.unlocalizedName); if (recipe.mInputs != null) { - tag.setTag("inputs", writeList(recipe.mInputs, GT_Utility::saveItem)); + tag.setTag("inputs", writeList(recipe.mInputs, GTUtility::saveItem)); } if (recipe.mOutputs != null) { - tag.setTag("outputs", writeList(recipe.mOutputs, GT_Utility::saveItem)); + tag.setTag("outputs", writeList(recipe.mOutputs, GTUtility::saveItem)); } if (recipe.mChances != null) { tag.setIntArray("chances", recipe.mChances); @@ -270,45 +270,44 @@ public class SingleRecipeCheck { return null; } - GT_Recipe foundRecipe = tryFindRecipe(mapToUse, tag); + GTRecipe foundRecipe = tryFindRecipe(mapToUse, tag); if (foundRecipe == null) return null; return new SingleRecipeCheck(foundRecipe, mapToUse, loadItemCost(tag), loadFluidCost(tag)); } private static ImmutableMap loadFluidCost(NBTTagCompound tag) { - return GT_Utility.streamCompounds(tag.getTagList("fluidCost", Constants.NBT.TAG_COMPOUND)) + return GTUtility.streamCompounds(tag.getTagList("fluidCost", Constants.NBT.TAG_COMPOUND)) .collect( - GT_Utility + GTUtility .toImmutableMapSerial(t -> FluidRegistry.getFluid(t.getString("id")), t -> t.getInteger("count"))); } private static ImmutableMap loadItemCost(NBTTagCompound tag) { - return GT_Utility.streamCompounds(tag.getTagList("itemCost", Constants.NBT.TAG_COMPOUND)) + return GTUtility.streamCompounds(tag.getTagList("itemCost", Constants.NBT.TAG_COMPOUND)) .collect( - GT_Utility - .toImmutableMapSerial(t -> ItemId.create(t.getCompoundTag("id")), t -> t.getInteger("count"))); + GTUtility.toImmutableMapSerial(t -> ItemId.create(t.getCompoundTag("id")), t -> t.getInteger("count"))); } - private static GT_Recipe tryFindRecipe(@Nonnull RecipeMap recipeMap, NBTTagCompound tag) { - ItemStack[] inputs = GT_Utility.streamCompounds(tag.getTagList("inputs", Constants.NBT.TAG_COMPOUND)) - .map(GT_Utility::loadItem) + private static GTRecipe tryFindRecipe(@Nonnull RecipeMap recipeMap, NBTTagCompound tag) { + ItemStack[] inputs = GTUtility.streamCompounds(tag.getTagList("inputs", Constants.NBT.TAG_COMPOUND)) + .map(GTUtility::loadItem) .toArray(ItemStack[]::new); - ItemStack[] outputs = GT_Utility.streamCompounds(tag.getTagList("outputs", Constants.NBT.TAG_COMPOUND)) - .map(GT_Utility::loadItem) + ItemStack[] outputs = GTUtility.streamCompounds(tag.getTagList("outputs", Constants.NBT.TAG_COMPOUND)) + .map(GTUtility::loadItem) .toArray(ItemStack[]::new); - FluidStack[] fInputs = GT_Utility.streamCompounds(tag.getTagList("fInputs", Constants.NBT.TAG_COMPOUND)) + FluidStack[] fInputs = GTUtility.streamCompounds(tag.getTagList("fInputs", Constants.NBT.TAG_COMPOUND)) .map(FluidStack::loadFluidStackFromNBT) .toArray(FluidStack[]::new); - FluidStack[] fOutputs = GT_Utility.streamCompounds(tag.getTagList("fOutputs", Constants.NBT.TAG_COMPOUND)) + FluidStack[] fOutputs = GTUtility.streamCompounds(tag.getTagList("fOutputs", Constants.NBT.TAG_COMPOUND)) .map(FluidStack::loadFluidStackFromNBT) .toArray(FluidStack[]::new); int eut = tag.getInteger("eut"); - GT_Recipe found = recipeMap.findRecipe(null, false, GT_Values.V[GT_Utility.getTier(eut)], fInputs, inputs); + GTRecipe found = recipeMap.findRecipe(null, false, GTValues.V[GTUtility.getTier(eut)], fInputs, inputs); int[] chances = tag.getIntArray("chances"); if (chances.length == 0) chances = null; - if (found == null || !GT_Utility.equals(inputs, found.mInputs) + if (found == null || !GTUtility.equals(inputs, found.mInputs) || !Arrays.equals(fInputs, found.mFluidInputs) - || !GT_Utility.equals(outputs, found.mOutputs) + || !GTUtility.equals(outputs, found.mOutputs) || !Arrays.equals(fOutputs, found.mFluidOutputs) || !Arrays.equals(chances, found.mChances) || found.mDuration != tag.getInteger("duration") @@ -350,7 +349,7 @@ public class SingleRecipeCheck { private Map afterItems; private Map afterFluids; - private GT_Recipe recipe; + private GTRecipe recipe; private Builder(@Nonnull RecipeMap recipeMap) { this.recipeMap = recipeMap; @@ -368,7 +367,7 @@ public class SingleRecipeCheck { return this; } - public Builder setRecipe(@Nonnull GT_Recipe recipe) { + public Builder setRecipe(@Nonnull GTRecipe recipe) { this.recipe = recipe; return this; } diff --git a/src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java b/src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java index cfa25e9fe2..8273c895b2 100644 --- a/src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java @@ -9,7 +9,7 @@ import net.minecraftforge.fluids.FluidStack; import gregtech.api.enums.ItemList; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; @ParametersAreNonnullByDefault @@ -21,7 +21,7 @@ public class AssemblerBackend extends RecipeMapBackend { } @Override - protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids, + protected GTRecipe modifyFoundRecipe(GTRecipe recipe, ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { for (ItemStack item : items) { if (ItemList.Paper_Printed_Pages.isStackEqual(item, false, true)) { diff --git a/src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java b/src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java index 3d56c96b82..4bf3f7f56e 100644 --- a/src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java @@ -10,7 +10,7 @@ import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.common.widget.ProgressBar; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.recipe.RecipeMapFrontend; @@ -52,21 +52,21 @@ public class AssemblyLineFrontend extends RecipeMapFrontend { int bar2Width = 18; List> splitProgress = splitProgress(progressSupplier, bar1Width, bar2Width); builder.widget( - new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_1, bar1Width) + new ProgressBar().setTexture(GTUITextures.PROGRESSBAR_ASSEMBLY_LINE_1, bar1Width) .setDirection(ProgressBar.Direction.RIGHT) .setProgress(splitProgress.get(0)) .setSynced(false, false) .setPos(new Pos2d(88, 8).add(windowOffset)) .setSize(bar1Width, 72)); builder.widget( - new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_2, bar2Width) + new ProgressBar().setTexture(GTUITextures.PROGRESSBAR_ASSEMBLY_LINE_2, bar2Width) .setDirection(ProgressBar.Direction.RIGHT) .setProgress(splitProgress.get(1)) .setSynced(false, false) .setPos(new Pos2d(124, 8).add(windowOffset)) .setSize(bar2Width, 72)); builder.widget( - new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_3, 18) + new ProgressBar().setTexture(GTUITextures.PROGRESSBAR_ASSEMBLY_LINE_3, 18) .setDirection(ProgressBar.Direction.UP) .setProgress(progressSupplier) .setSynced(false, false) diff --git a/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java b/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java index e5681f59aa..9bbe087e54 100644 --- a/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java @@ -8,11 +8,11 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidContainerItem; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; @ParametersAreNonnullByDefault @@ -24,17 +24,17 @@ public class FluidCannerBackend extends RecipeMapBackend { } @Override - protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { + protected GTRecipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { if (items.length == 0 || items[0] == null) { return null; } if (fluids.length > 0 && fluids[0] != null) { - ItemStack filledItem = GT_Utility.fillFluidContainer(fluids[0], items[0], false, true); - FluidStack fluidToTake = GT_Utility.getFluidForFilledItem(filledItem, true); + ItemStack filledItem = GTUtility.fillFluidContainer(fluids[0], items[0], false, true); + FluidStack fluidToTake = GTUtility.getFluidForFilledItem(filledItem, true); if (fluidToTake != null) { - return GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, items[0])) + return GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, items[0])) .itemOutputs(filledItem) .fluidInputs(fluidToTake) .duration(Math.max(fluidToTake.amount / 64, 16)) @@ -45,11 +45,11 @@ public class FluidCannerBackend extends RecipeMapBackend { .orElse(null); } } - FluidStack drainedFluid = GT_Utility.getFluidForFilledItem(items[0], true); + FluidStack drainedFluid = GTUtility.getFluidForFilledItem(items[0], true); if (drainedFluid != null) { - return GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, items[0])) - .itemOutputs(GT_Utility.getContainerItem(items[0], true)) + return GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, items[0])) + .itemOutputs(GTUtility.getContainerItem(items[0], true)) .fluidOutputs(drainedFluid) .duration(Math.max(drainedFluid.amount / 64, 16)) .eut(1) diff --git a/src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java b/src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java index ce3ea3e89c..ccf6e63c29 100644 --- a/src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java @@ -7,12 +7,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.ItemList; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -27,7 +27,7 @@ public class FormingPressBackend extends RecipeMapBackend { } @Override - protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids, + protected GTRecipe modifyFoundRecipe(GTRecipe recipe, ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { for (ItemStack mold : items) { if (ItemList.Shape_Mold_Credit.isStackEqual(mold, false, true)) { @@ -46,7 +46,7 @@ public class FormingPressBackend extends RecipeMapBackend { } @Override - protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { + protected GTRecipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { if (items.length < 2) { return null; } @@ -54,16 +54,16 @@ public class FormingPressBackend extends RecipeMapBackend { } @Nullable - private GT_Recipe findRenamingRecipe(ItemStack[] inputs) { + private GTRecipe findRenamingRecipe(ItemStack[] inputs) { ItemStack mold = findNameMoldIndex(inputs); if (mold == null) return null; ItemStack input = findStackToRename(inputs, mold); if (input == null) return null; - ItemStack output = GT_Utility.copyAmount(1, input); + ItemStack output = GTUtility.copyAmount(1, input); if (output == null) return null; output.setStackDisplayName(mold.getDisplayName()); - return GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(0, mold), GT_Utility.copyAmount(1, input)) + return GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(0, mold), GTUtility.copyAmount(1, input)) .itemOutputs(output) .duration(128) .eut(8) diff --git a/src/main/java/gregtech/api/recipe/maps/FuelBackend.java b/src/main/java/gregtech/api/recipe/maps/FuelBackend.java index 49c989e174..e5f0ab40d1 100644 --- a/src/main/java/gregtech/api/recipe/maps/FuelBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/FuelBackend.java @@ -12,23 +12,23 @@ import net.minecraftforge.fluids.FluidStack; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FuelBackend extends RecipeMapBackend { - private final Map recipesByFluidInput = new HashMap<>(); + private final Map recipesByFluidInput = new HashMap<>(); public FuelBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) { super(propertiesBuilder.disableOptimize()); } @Override - protected Collection doAdd(GT_RecipeBuilder builder) { + protected Collection doAdd(GTRecipeBuilder builder) { if (builder.getDuration() == -1) { builder.duration(0); } @@ -39,11 +39,11 @@ public class FuelBackend extends RecipeMapBackend { } @Override - public GT_Recipe compileRecipe(GT_Recipe recipe) { + public GTRecipe compileRecipe(GTRecipe recipe) { super.compileRecipe(recipe); - if (recipe.mInputs != null && GT_Utility.getNonnullElementCount(recipe.mInputs) == 1 - && (recipe.mFluidInputs == null || GT_Utility.getNonnullElementCount(recipe.mFluidInputs) == 0)) { - FluidStack fluidStack = GT_Utility.getFluidForFilledItem(recipe.mInputs[0], true); + if (recipe.mInputs != null && GTUtility.getNonnullElementCount(recipe.mInputs) == 1 + && (recipe.mFluidInputs == null || GTUtility.getNonnullElementCount(recipe.mFluidInputs) == 0)) { + FluidStack fluidStack = GTUtility.getFluidForFilledItem(recipe.mInputs[0], true); if (fluidStack != null) { fluidStack.amount = 0; recipesByFluidInput.put( @@ -51,9 +51,9 @@ public class FuelBackend extends RecipeMapBackend { .getName(), recipe); } - } else if ((recipe.mInputs == null || GT_Utility.getNonnullElementCount(recipe.mInputs) == 0) + } else if ((recipe.mInputs == null || GTUtility.getNonnullElementCount(recipe.mInputs) == 0) && recipe.mFluidInputs != null - && GT_Utility.getNonnullElementCount(recipe.mFluidInputs) >= 1 + && GTUtility.getNonnullElementCount(recipe.mFluidInputs) >= 1 && recipe.mFluidInputs[0] != null) { recipesByFluidInput.put( recipe.mFluidInputs[0].getFluid() @@ -64,12 +64,12 @@ public class FuelBackend extends RecipeMapBackend { } @Nullable - public GT_Recipe findFuel(FluidStack fluidStack) { + public GTRecipe findFuel(FluidStack fluidStack) { return findFuel(fluidStack.getFluid()); } @Nullable - public GT_Recipe findFuel(Fluid fluid) { + public GTRecipe findFuel(Fluid fluid) { return recipesByFluidInput.get(fluid.getName()); } } diff --git a/src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java b/src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java index c4095eeb4e..e501db3c40 100644 --- a/src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java @@ -6,11 +6,11 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -25,18 +25,18 @@ public class FurnaceBackend extends NonGTBackend { } @Override - protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, - @Nullable GT_Recipe cachedRecipe) { + protected GTRecipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, + @Nullable GTRecipe cachedRecipe) { if (items.length == 0 || items[0] == null) { return null; } if (cachedRecipe != null && cachedRecipe.isRecipeInputEqual(false, true, fluids, items)) { return cachedRecipe; } - ItemStack output = GT_ModHandler.getSmeltingOutput(items[0], false, null); + ItemStack output = GTModHandler.getSmeltingOutput(items[0], false, null); return output == null ? null - : GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, items[0])) + : GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, items[0])) .itemOutputs(output) .duration(128) .eut(4) @@ -47,6 +47,6 @@ public class FurnaceBackend extends NonGTBackend { @Override public boolean containsInput(ItemStack item) { - return GT_ModHandler.getSmeltingOutput(item, false, null) != null; + return GTModHandler.getSmeltingOutput(item, false, null) != null; } } diff --git a/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java b/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java index b38b66e41b..a27e425efb 100644 --- a/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java @@ -9,11 +9,11 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; @SuppressWarnings({ "unused", "UnusedReturnValue" }) @@ -46,11 +46,11 @@ public class LargeBoilerFuelBackend extends RecipeMapBackend { return ALLOWED_SOLID_FUELS.add(itemregistryName + ":" + meta); } - public GT_Recipe addDenseLiquidRecipe(GT_Recipe recipe) { + public GTRecipe addDenseLiquidRecipe(GTRecipe recipe) { return addRecipe(recipe, ((double) recipe.mSpecialValue) / 10, false); } - public GT_Recipe addDieselRecipe(GT_Recipe recipe) { + public GTRecipe addDieselRecipe(GTRecipe recipe) { return addRecipe(recipe, ((double) recipe.mSpecialValue) / 40, false); } @@ -61,12 +61,12 @@ public class LargeBoilerFuelBackend extends RecipeMapBackend { } @Nullable - public GT_Recipe addSolidRecipe(@Nullable ItemStack fuelItemStack) { + public GTRecipe addSolidRecipe(@Nullable ItemStack fuelItemStack) { if (fuelItemStack == null) { return null; } if (!addedGeneralDesc) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .duration(1) .eut(1) .specialValue(1) @@ -82,17 +82,17 @@ public class LargeBoilerFuelBackend extends RecipeMapBackend { String registryName = Item.itemRegistry.getNameForObject(fuelItemStack.getItem()); boolean isHighTierAllowed = ALLOWED_SOLID_FUELS.contains(registryName + ":" + fuelItemStack.getItemDamage()); - return GT_Values.RA.stdBuilder() + return GTValues.RA.stdBuilder() .itemInputs(fuelItemStack) .duration(1) .eut(0) - .specialValue(GT_ModHandler.getFuelValue(fuelItemStack) / 1600) + .specialValue(GTModHandler.getFuelValue(fuelItemStack) / 1600) .build() - .map(r -> addRecipe(r, ((double) GT_ModHandler.getFuelValue(fuelItemStack)) / 1600, isHighTierAllowed)) + .map(r -> addRecipe(r, ((double) GTModHandler.getFuelValue(fuelItemStack)) / 1600, isHighTierAllowed)) .orElse(null); } - private GT_Recipe addRecipe(GT_Recipe recipe, double baseBurnTime, boolean isHighTierAllowed) { + private GTRecipe addRecipe(GTRecipe recipe, double baseBurnTime, boolean isHighTierAllowed) { // Some recipes will have a burn time like 15.9999999 and % always rounds down double floatErrorCorrection = 0.0001; diff --git a/src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java b/src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java index 53623cb0c7..ae4b5f5d35 100644 --- a/src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java @@ -1,8 +1,8 @@ package gregtech.api.recipe.maps; -import static gregtech.api.enums.GT_Values.W; -import static gregtech.api.util.GT_RecipeConstants.EXPLODE; -import static gregtech.api.util.GT_RecipeConstants.ON_FIRE; +import static gregtech.api.enums.GTValues.W; +import static gregtech.api.util.GTRecipeConstants.EXPLODE; +import static gregtech.api.util.GTRecipeConstants.ON_FIRE; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -13,18 +13,18 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.ItemList; import gregtech.api.enums.SubTag; import gregtech.api.objects.ItemData; import gregtech.api.objects.MaterialStack; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -39,8 +39,8 @@ public class MicrowaveBackend extends NonGTBackend { } @Override - protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, - @Nullable GT_Recipe cachedRecipe) { + protected GTRecipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, + @Nullable GTRecipe cachedRecipe) { if (items.length == 0 || items[0] == null) { return null; } @@ -48,12 +48,12 @@ public class MicrowaveBackend extends NonGTBackend { return cachedRecipe; } - ItemStack output = GT_ModHandler.getSmeltingOutput(items[0], false, null); + ItemStack output = GTModHandler.getSmeltingOutput(items[0], false, null); - if (GT_Utility.areStacksEqual(items[0], new ItemStack(Items.book, 1, W))) { - return GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, items[0])) - .itemOutputs(GT_Utility.getWrittenBook("Manual_Microwave", ItemList.Book_Written_03.get(1))) + if (GTUtility.areStacksEqual(items[0], new ItemStack(Items.book, 1, W))) { + return GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, items[0])) + .itemOutputs(GTUtility.getWrittenBook("Manual_Microwave", ItemList.Book_Written_03.get(1))) .duration(32) .eut(4) .noOptimize() @@ -63,37 +63,36 @@ public class MicrowaveBackend extends NonGTBackend { // Check Container Item of Input since it is around the Input, then the Input itself, then Container Item of // Output and last check the Output itself - for (ItemStack item : new ItemStack[] { GT_Utility.getContainerItem(items[0], true), items[0], - GT_Utility.getContainerItem(output, true), output }) { + for (ItemStack item : new ItemStack[] { GTUtility.getContainerItem(items[0], true), items[0], + GTUtility.getContainerItem(output, true), output }) { if (item == null) continue; - if (GT_Utility.areStacksEqual(item, new ItemStack(Blocks.netherrack, 1, W), true) - || GT_Utility.areStacksEqual(item, new ItemStack(Blocks.tnt, 1, W), true) - || GT_Utility.areStacksEqual(item, new ItemStack(Items.egg, 1, W), true) - || GT_Utility.areStacksEqual(item, new ItemStack(Items.firework_charge, 1, W), true) - || GT_Utility.areStacksEqual(item, new ItemStack(Items.fireworks, 1, W), true) - || GT_Utility.areStacksEqual(item, new ItemStack(Items.fire_charge, 1, W), true)) { - GT_Log.exp - .println("Microwave Explosion due to TNT || EGG || FIREWORKCHARGE || FIREWORK || FIRE CHARGE"); - return GT_RecipeBuilder.empty() + if (GTUtility.areStacksEqual(item, new ItemStack(Blocks.netherrack, 1, W), true) + || GTUtility.areStacksEqual(item, new ItemStack(Blocks.tnt, 1, W), true) + || GTUtility.areStacksEqual(item, new ItemStack(Items.egg, 1, W), true) + || GTUtility.areStacksEqual(item, new ItemStack(Items.firework_charge, 1, W), true) + || GTUtility.areStacksEqual(item, new ItemStack(Items.fireworks, 1, W), true) + || GTUtility.areStacksEqual(item, new ItemStack(Items.fire_charge, 1, W), true)) { + GTLog.exp.println("Microwave Explosion due to TNT || EGG || FIREWORKCHARGE || FIREWORK || FIRE CHARGE"); + return GTRecipeBuilder.empty() .metadata(EXPLODE, true) .build() .orElse(null); } - ItemData itemData = GT_OreDictUnificator.getItemData(item); + ItemData itemData = GTOreDictUnificator.getItemData(item); if (itemData != null) { if (itemData.mMaterial != null && itemData.mMaterial.mMaterial != null) { if (itemData.mMaterial.mMaterial.contains(SubTag.METAL) || itemData.mMaterial.mMaterial.contains(SubTag.EXPLOSIVE)) { - GT_Log.exp.println("Microwave Explosion due to METAL insertion"); - return GT_RecipeBuilder.empty() + GTLog.exp.println("Microwave Explosion due to METAL insertion"); + return GTRecipeBuilder.empty() .metadata(EXPLODE, true) .build() .orElse(null); } if (itemData.mMaterial.mMaterial.contains(SubTag.FLAMMABLE)) { - GT_Log.exp.println("Microwave INFLAMMATION due to FLAMMABLE insertion"); - return GT_RecipeBuilder.empty() + GTLog.exp.println("Microwave INFLAMMATION due to FLAMMABLE insertion"); + return GTRecipeBuilder.empty() .metadata(ON_FIRE, true) .build() .orElse(null); @@ -103,15 +102,15 @@ public class MicrowaveBackend extends NonGTBackend { if (materialStack == null) continue; if (materialStack.mMaterial.contains(SubTag.METAL) || materialStack.mMaterial.contains(SubTag.EXPLOSIVE)) { - GT_Log.exp.println("Microwave Explosion due to METAL insertion"); - return GT_RecipeBuilder.empty() + GTLog.exp.println("Microwave Explosion due to METAL insertion"); + return GTRecipeBuilder.empty() .metadata(EXPLODE, true) .build() .orElse(null); } if (materialStack.mMaterial.contains(SubTag.FLAMMABLE)) { - GT_Log.exp.println("Microwave INFLAMMATION due to FLAMMABLE insertion"); - return GT_RecipeBuilder.empty() + GTLog.exp.println("Microwave INFLAMMATION due to FLAMMABLE insertion"); + return GTRecipeBuilder.empty() .metadata(ON_FIRE, true) .build() .orElse(null); @@ -119,8 +118,8 @@ public class MicrowaveBackend extends NonGTBackend { } } if (TileEntityFurnace.getItemBurnTime(item) > 0) { - GT_Log.exp.println("Microwave INFLAMMATION due to BURNABLE insertion"); - return GT_RecipeBuilder.empty() + GTLog.exp.println("Microwave INFLAMMATION due to BURNABLE insertion"); + return GTRecipeBuilder.empty() .metadata(ON_FIRE, true) .build() .orElse(null); @@ -128,8 +127,8 @@ public class MicrowaveBackend extends NonGTBackend { } return output == null ? null - : GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, items[0])) + : GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, items[0])) .itemOutputs(output) .duration(32) .eut(4) @@ -140,6 +139,6 @@ public class MicrowaveBackend extends NonGTBackend { @Override public boolean containsInput(ItemStack item) { - return GT_ModHandler.getSmeltingOutput(item, false, null) != null; + return GTModHandler.getSmeltingOutput(item, false, null) != null; } } diff --git a/src/main/java/gregtech/api/recipe/maps/NonGTBackend.java b/src/main/java/gregtech/api/recipe/maps/NonGTBackend.java index 1e871df372..3a66a1c980 100644 --- a/src/main/java/gregtech/api/recipe/maps/NonGTBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/NonGTBackend.java @@ -9,7 +9,7 @@ import net.minecraftforge.fluids.FluidStack; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -24,8 +24,8 @@ public abstract class NonGTBackend extends RecipeMapBackend { } @Override - protected abstract GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, - @Nullable ItemStack specialSlot, @Nullable GT_Recipe cachedRecipe); + protected abstract GTRecipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, + @Nullable ItemStack specialSlot, @Nullable GTRecipe cachedRecipe); @Override protected boolean doesOverwriteFindRecipe() { @@ -46,7 +46,7 @@ public abstract class NonGTBackend extends RecipeMapBackend { public void reInit() {} @Override - protected GT_Recipe addToItemMap(GT_Recipe recipe) { + protected GTRecipe addToItemMap(GTRecipe recipe) { return recipe; } } diff --git a/src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java b/src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java index c2c312a48a..6417334d34 100644 --- a/src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java @@ -9,7 +9,7 @@ import net.minecraftforge.fluids.FluidStack; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; @ParametersAreNonnullByDefault @@ -23,7 +23,7 @@ public class OilCrackerBackend extends RecipeMapBackend { } @Override - public GT_Recipe compileRecipe(GT_Recipe recipe) { + public GTRecipe compileRecipe(GTRecipe recipe) { super.compileRecipe(recipe); if (recipe.mFluidInputs != null && recipe.mFluidInputs.length > 1 && recipe.mFluidInputs[1] != null) { validCatalystFluidNames.add( diff --git a/src/main/java/gregtech/api/recipe/maps/PrinterBackend.java b/src/main/java/gregtech/api/recipe/maps/PrinterBackend.java index a933886447..788828df52 100644 --- a/src/main/java/gregtech/api/recipe/maps/PrinterBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/PrinterBackend.java @@ -1,6 +1,6 @@ package gregtech.api.recipe.maps; -import static gregtech.api.enums.GT_Values.L; +import static gregtech.api.enums.GTValues.L; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -12,13 +12,13 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.ItemList; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -33,14 +33,14 @@ public class PrinterBackend extends RecipeMapBackend { } @Override - protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids, + protected GTRecipe modifyFoundRecipe(GTRecipe recipe, ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { if (items[0].getItem() == Items.paper) { assert specialSlot != null; if (!ItemList.Tool_DataStick.isStackEqual(specialSlot, false, true)) return null; NBTTagCompound nbt = specialSlot.getTagCompound(); - if (nbt == null || GT_Utility.isStringInvalid(nbt.getString("title")) - || GT_Utility.isStringInvalid(nbt.getString("author"))) return null; + if (nbt == null || GTUtility.isStringInvalid(nbt.getString("title")) + || GTUtility.isStringInvalid(nbt.getString("author"))) return null; recipe = recipe.copy(); recipe.mCanBeBuffered = false; @@ -67,7 +67,7 @@ public class PrinterBackend extends RecipeMapBackend { recipe = recipe.copy(); recipe.mCanBeBuffered = false; recipe.mOutputs[0].setTagCompound( - GT_Utility.getNBTContainingString( + GTUtility.getNBTContainingString( new NBTTagCompound(), "GT.PunchCardData", nbt.getString("GT.PunchCardData"))); @@ -77,7 +77,7 @@ public class PrinterBackend extends RecipeMapBackend { } @Override - protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { + protected GTRecipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { if (items.length == 0 || items[0] == null || fluids.length == 0 || fluids[0] == null) { return null; } @@ -88,7 +88,7 @@ public class PrinterBackend extends RecipeMapBackend { } if (dye == null) return null; - ItemStack batchRecolorOutput = GT_ModHandler.getAllRecipeOutput( + ItemStack batchRecolorOutput = GTModHandler.getAllRecipeOutput( null, items[0], items[0], @@ -100,8 +100,8 @@ public class PrinterBackend extends RecipeMapBackend { items[0], items[0]); if (batchRecolorOutput != null) { - return GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(8, items[0])) + return GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(8, items[0])) .itemOutputs(batchRecolorOutput) .fluidInputs(new FluidStack(fluids[0].getFluid(), (int) L)) .duration(256) @@ -112,11 +112,11 @@ public class PrinterBackend extends RecipeMapBackend { .orElse(null); } - ItemStack singleRecolorOutput = GT_ModHandler + ItemStack singleRecolorOutput = GTModHandler .getAllRecipeOutput(null, items[0], ItemList.DYE_ONLY_ITEMS[dye.mIndex].get(1)); if (singleRecolorOutput != null) { - return GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, items[0])) + return GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, items[0])) .itemOutputs(singleRecolorOutput) .fluidInputs(new FluidStack(fluids[0].getFluid(), (int) L)) .duration(32) diff --git a/src/main/java/gregtech/api/recipe/maps/PurificationUnitClarifierFrontend.java b/src/main/java/gregtech/api/recipe/maps/PurificationUnitClarifierFrontend.java index c7dad7ea3a..e681c95403 100644 --- a/src/main/java/gregtech/api/recipe/maps/PurificationUnitClarifierFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/PurificationUnitClarifierFrontend.java @@ -11,13 +11,13 @@ import com.gtnewhorizons.modularui.api.math.Size; import codechicken.nei.PositionedStack; import gregtech.api.enums.ItemList; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.common.gui.modularui.UIHelper; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitClarifier; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitClarifier; +import gregtech.nei.GTNEIDefaultHandler; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -28,7 +28,7 @@ public class PurificationUnitClarifierFrontend extends PurificationUnitRecipeMap super( 80, uiPropertiesBuilder.logoPos(new Pos2d(160, 100)) - .progressBarTexture(new FallbackableUITexture(GT_UITextures.PROGRESSBAR_CLARIFIER)) + .progressBarTexture(new FallbackableUITexture(GTUITextures.PROGRESSBAR_CLARIFIER)) .logoPos(new Pos2d(152, 90)), neiPropertiesBuilder.recipeBackgroundSize(new Size(170, 120))); } @@ -60,12 +60,12 @@ public class PurificationUnitClarifierFrontend extends PurificationUnitRecipeMap } @Override - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { super.drawNEIOverlays(neiCachedRecipe); for (PositionedStack stack : neiCachedRecipe.mInputs) { if (stack.item.isItemEqual(ItemList.ActivatedCarbonFilterMesh.get(1))) { - drawNEIOverlayText((int) (GT_MetaTileEntity_PurificationUnitClarifier.FILTER_DAMAGE_RATE) + "%", stack); + drawNEIOverlayText((int) (MTEPurificationUnitClarifier.FILTER_DAMAGE_RATE) + "%", stack); } } } diff --git a/src/main/java/gregtech/api/recipe/maps/PurificationUnitFlocculatorFrontend.java b/src/main/java/gregtech/api/recipe/maps/PurificationUnitFlocculatorFrontend.java index 9366237b67..d0373d4310 100644 --- a/src/main/java/gregtech/api/recipe/maps/PurificationUnitFlocculatorFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/PurificationUnitFlocculatorFrontend.java @@ -15,14 +15,14 @@ import com.gtnewhorizons.modularui.api.math.Size; import codechicken.nei.PositionedStack; import gregtech.api.enums.Materials; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.common.gui.modularui.UIHelper; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitFlocculation; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitFlocculation; +import gregtech.nei.GTNEIDefaultHandler; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -33,7 +33,7 @@ public class PurificationUnitFlocculatorFrontend extends PurificationUnitRecipeM super( 80, uiPropertiesBuilder.logoPos(new Pos2d(160, 100)) - .progressBarTexture(new FallbackableUITexture(GT_UITextures.PROGRESSBAR_FLOCCULATION)) + .progressBarTexture(new FallbackableUITexture(GTUITextures.PROGRESSBAR_FLOCCULATION)) .logoPos(new Pos2d(152, 100)), neiPropertiesBuilder.recipeBackgroundSize(new Size(170, 120))); } @@ -60,30 +60,29 @@ public class PurificationUnitFlocculatorFrontend extends PurificationUnitRecipeM @Override @NotNull public List handleNEIItemTooltip(ItemStack stack, List currentTip, - GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { - if (stack - .isItemEqual(GT_Utility.getFluidDisplayStack(Materials.PolyAluminiumChloride.getFluid(1000L), false))) { + GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + if (stack.isItemEqual(GTUtility.getFluidDisplayStack(Materials.PolyAluminiumChloride.getFluid(1000L), false))) { currentTip.add("Consumed during operation"); currentTip.add( - "+" + GT_MetaTileEntity_PurificationUnitFlocculation.SUCCESS_PER_LEVEL + "+" + MTEPurificationUnitFlocculation.SUCCESS_PER_LEVEL + "%/" - + GT_MetaTileEntity_PurificationUnitFlocculation.INPUT_CHEMICAL_PER_LEVEL + + MTEPurificationUnitFlocculation.INPUT_CHEMICAL_PER_LEVEL + "L"); } else if (stack - .isItemEqual(GT_Utility.getFluidDisplayStack(Materials.FlocculationWasteLiquid.getFluid(1000L), false))) { + .isItemEqual(GTUtility.getFluidDisplayStack(Materials.FlocculationWasteLiquid.getFluid(1000L), false))) { currentTip.add("Returned in amount equivalent to consumed flocculant."); } return super.handleNEIItemTooltip(stack, currentTip, neiCachedRecipe); } @Override - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { super.drawNEIOverlays(neiCachedRecipe); // Display flocculation chemical neiCachedRecipe.mInputs.add( new PositionedStack( - GT_Utility.getFluidDisplayStack(Materials.PolyAluminiumChloride.getFluid(100000L), true), + GTUtility.getFluidDisplayStack(Materials.PolyAluminiumChloride.getFluid(100000L), true), 5, -1, false)); @@ -91,7 +90,7 @@ public class PurificationUnitFlocculatorFrontend extends PurificationUnitRecipeM // Display waste output neiCachedRecipe.mOutputs.add( new PositionedStack( - GT_Utility.getFluidDisplayStack(Materials.FlocculationWasteLiquid.getFluid(100000L), true), + GTUtility.getFluidDisplayStack(Materials.FlocculationWasteLiquid.getFluid(100000L), true), 147, 48, false)); diff --git a/src/main/java/gregtech/api/recipe/maps/PurificationUnitLaserFrontend.java b/src/main/java/gregtech/api/recipe/maps/PurificationUnitLaserFrontend.java index df42259864..9c90acd8ad 100644 --- a/src/main/java/gregtech/api/recipe/maps/PurificationUnitLaserFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/PurificationUnitLaserFrontend.java @@ -11,8 +11,8 @@ import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.recipe.RecipeMapFrontend; import gregtech.common.gui.modularui.UIHelper; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitUVTreatment; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitUVTreatment; +import gregtech.nei.GTNEIDefaultHandler; public class PurificationUnitLaserFrontend extends RecipeMapFrontend { @@ -22,13 +22,13 @@ public class PurificationUnitLaserFrontend extends RecipeMapFrontend { } @Override - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { - final int numLenses = GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS.size(); + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + final int numLenses = MTEPurificationUnitUVTreatment.LENS_ITEMS.size(); List positions = UIHelper.getGridPositions(numLenses, 12, -4, 3, 3); // Put in lens items for (int i = 0; i < numLenses; ++i) { Pos2d position = positions.get(i); - ItemStack lens = GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS.get(i); + ItemStack lens = MTEPurificationUnitUVTreatment.LENS_ITEMS.get(i); neiCachedRecipe.mInputs.add(new PositionedStack(lens, position.x, position.y, false)); } super.drawNEIOverlays(neiCachedRecipe); diff --git a/src/main/java/gregtech/api/recipe/maps/PurificationUnitOzonationFrontend.java b/src/main/java/gregtech/api/recipe/maps/PurificationUnitOzonationFrontend.java index cdfd41b78c..e9c1277cb3 100644 --- a/src/main/java/gregtech/api/recipe/maps/PurificationUnitOzonationFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/PurificationUnitOzonationFrontend.java @@ -9,7 +9,7 @@ import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.math.Size; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.util.MethodsReturnNonnullByDefault; @@ -24,7 +24,7 @@ public class PurificationUnitOzonationFrontend extends PurificationUnitRecipeMap super( 120, uiPropertiesBuilder.logoPos(new Pos2d(160, 100)) - .progressBarTexture(new FallbackableUITexture(GT_UITextures.PROGRESSBAR_OZONATION)) + .progressBarTexture(new FallbackableUITexture(GTUITextures.PROGRESSBAR_OZONATION)) .logoPos(new Pos2d(152, 97)), neiPropertiesBuilder.recipeBackgroundSize(new Size(170, 180))); } diff --git a/src/main/java/gregtech/api/recipe/maps/PurificationUnitParticleExtractorFrontend.java b/src/main/java/gregtech/api/recipe/maps/PurificationUnitParticleExtractorFrontend.java index bbbd88fd5f..d738ce0750 100644 --- a/src/main/java/gregtech/api/recipe/maps/PurificationUnitParticleExtractorFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/PurificationUnitParticleExtractorFrontend.java @@ -12,7 +12,7 @@ import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.recipe.RecipeMapFrontend; import gregtech.common.gui.modularui.UIHelper; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.nei.GTNEIDefaultHandler; public class PurificationUnitParticleExtractorFrontend extends RecipeMapFrontend { @@ -25,7 +25,7 @@ public class PurificationUnitParticleExtractorFrontend extends RecipeMapFrontend } @Override - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { List positions = UIHelper.getGridPositions(2, 30, 14, 2, 1); Pos2d pos1 = positions.get(0); Pos2d pos2 = positions.get(1); diff --git a/src/main/java/gregtech/api/recipe/maps/PurificationUnitPhAdjustmentFrontend.java b/src/main/java/gregtech/api/recipe/maps/PurificationUnitPhAdjustmentFrontend.java index 7e9eded675..e78d2a395a 100644 --- a/src/main/java/gregtech/api/recipe/maps/PurificationUnitPhAdjustmentFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/PurificationUnitPhAdjustmentFrontend.java @@ -15,13 +15,13 @@ import com.gtnewhorizons.modularui.api.math.Size; import codechicken.nei.PositionedStack; import gregtech.api.enums.Materials; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitPhAdjustment; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitPhAdjustment; +import gregtech.nei.GTNEIDefaultHandler; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -32,7 +32,7 @@ public class PurificationUnitPhAdjustmentFrontend extends PurificationUnitRecipe super( 80, uiPropertiesBuilder.logoPos(new Pos2d(160, 100)) - .progressBarTexture(new FallbackableUITexture(GT_UITextures.PROGRESSBAR_PH_NEUTRALIZATION)) + .progressBarTexture(new FallbackableUITexture(GTUITextures.PROGRESSBAR_PH_NEUTRALIZATION)) .logoPos(new Pos2d(152, 90)), neiPropertiesBuilder.recipeBackgroundSize(new Size(170, 120))); } @@ -54,24 +54,23 @@ public class PurificationUnitPhAdjustmentFrontend extends PurificationUnitRecipe @Override @NotNull public List handleNEIItemTooltip(ItemStack stack, List currentTip, - GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { // Add pH adjustment values if (stack.isItemEqual(Materials.SodiumHydroxide.getDust(1))) { - currentTip - .add("+" + GT_MetaTileEntity_PurificationUnitPhAdjustment.PH_PER_ALKALINE_DUST * 64 + " pH/stack"); + currentTip.add("+" + MTEPurificationUnitPhAdjustment.PH_PER_ALKALINE_DUST * 64 + " pH/stack"); } else - if (stack.isItemEqual(GT_Utility.getFluidDisplayStack(Materials.HydrochloricAcid.getFluid(1000L), false))) { - currentTip.add(GT_MetaTileEntity_PurificationUnitPhAdjustment.PH_PER_10_ACID_LITER * 100 + " pH/1000L"); + if (stack.isItemEqual(GTUtility.getFluidDisplayStack(Materials.HydrochloricAcid.getFluid(1000L), false))) { + currentTip.add(MTEPurificationUnitPhAdjustment.PH_PER_10_ACID_LITER * 100 + " pH/1000L"); } return super.handleNEIItemTooltip(stack, currentTip, neiCachedRecipe); } @Override - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { neiCachedRecipe.mInputs.add(new PositionedStack(Materials.SodiumHydroxide.getDust(64), 3, 1, false)); neiCachedRecipe.mInputs.add( new PositionedStack( - GT_Utility.getFluidDisplayStack(Materials.HydrochloricAcid.getFluid(1000L), true), + GTUtility.getFluidDisplayStack(Materials.HydrochloricAcid.getFluid(1000L), true), 147, 1, false)); diff --git a/src/main/java/gregtech/api/recipe/maps/PurificationUnitPlasmaHeaterFrontend.java b/src/main/java/gregtech/api/recipe/maps/PurificationUnitPlasmaHeaterFrontend.java index 5c63353b98..a7f35c86a5 100644 --- a/src/main/java/gregtech/api/recipe/maps/PurificationUnitPlasmaHeaterFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/PurificationUnitPlasmaHeaterFrontend.java @@ -11,12 +11,12 @@ import com.gtnewhorizons.modularui.api.math.Size; import codechicken.nei.PositionedStack; import gregtech.api.enums.Materials; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.nei.GTNEIDefaultHandler; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -27,7 +27,7 @@ public class PurificationUnitPlasmaHeaterFrontend extends PurificationUnitRecipe super( 120, uiPropertiesBuilder.logoPos(new Pos2d(152, 90)) - .progressBarTexture(new FallbackableUITexture(GT_UITextures.PROGRESSBAR_PLASMA_HEATER)), + .progressBarTexture(new FallbackableUITexture(GTUITextures.PROGRESSBAR_PLASMA_HEATER)), neiPropertiesBuilder.recipeBackgroundSize(new Size(170, 120))); } @@ -46,12 +46,12 @@ public class PurificationUnitPlasmaHeaterFrontend extends PurificationUnitRecipe } @Override - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { neiCachedRecipe.mInputs.add( - new PositionedStack(GT_Utility.getFluidDisplayStack(Materials.Helium.getPlasma(10L), true), 26, 53, false)); + new PositionedStack(GTUtility.getFluidDisplayStack(Materials.Helium.getPlasma(10L), true), 26, 53, false)); neiCachedRecipe.mInputs.add( new PositionedStack( - GT_Utility.getFluidDisplayStack(Materials.SuperCoolant.getFluid(100L), true), + GTUtility.getFluidDisplayStack(Materials.SuperCoolant.getFluid(100L), true), 107, 52, false)); diff --git a/src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java b/src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java index 55fb9b4cc4..c149be4219 100644 --- a/src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java @@ -6,12 +6,12 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; /** @@ -26,17 +26,17 @@ public class RecyclerBackend extends NonGTBackend { } @Override - protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, - @Nullable GT_Recipe cachedRecipe) { + protected GTRecipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, + @Nullable GTRecipe cachedRecipe) { if (items.length == 0 || items[0] == null) { return null; } if (cachedRecipe != null && cachedRecipe.isRecipeInputEqual(false, true, fluids, items)) { return cachedRecipe; } - GT_RecipeBuilder builder = GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, items[0])); - ItemStack output = GT_ModHandler.getRecyclerOutput(items[0], 0); + GTRecipeBuilder builder = GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, items[0])); + ItemStack output = GTModHandler.getRecyclerOutput(items[0], 0); if (output != null) { builder.itemOutputs(output) .outputChances(1250); @@ -50,6 +50,6 @@ public class RecyclerBackend extends NonGTBackend { @Override public boolean containsInput(ItemStack item) { - return GT_ModHandler.getRecyclerOutput(item, 0) != null; + return GTModHandler.getRecyclerOutput(item, 0) != null; } } diff --git a/src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java b/src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java index f201698457..b40b3dd082 100644 --- a/src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java @@ -12,34 +12,34 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import gregtech.GT_Mod; +import gregtech.GTMod; import gregtech.api.enums.Element; import gregtech.api.enums.ItemList; import gregtech.api.enums.Materials; import gregtech.api.enums.TierEU; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_RecipeConstants; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTRecipeConstants; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; -import gregtech.common.items.behaviors.Behaviour_DataOrb; +import gregtech.common.items.behaviors.BehaviourDataOrb; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ReplicatorBackend extends RecipeMapBackend { - private final Map recipesByMaterial = new HashMap<>(); + private final Map recipesByMaterial = new HashMap<>(); public ReplicatorBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) { super(propertiesBuilder.recipeEmitter(ReplicatorBackend::replicatorRecipeEmitter)); } @Override - public GT_Recipe compileRecipe(GT_Recipe recipe) { + public GTRecipe compileRecipe(GTRecipe recipe) { super.compileRecipe(recipe); - Materials material = recipe.getMetadata(GT_RecipeConstants.MATERIAL); + Materials material = recipe.getMetadata(GTRecipeConstants.MATERIAL); assert material != null; // checked by replicatorRecipeEmitter recipesByMaterial.put(material, recipe); return recipe; @@ -51,8 +51,8 @@ public class ReplicatorBackend extends RecipeMapBackend { } @Override - protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, - @Nullable GT_Recipe cachedRecipe) { + protected GTRecipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot, + @Nullable GTRecipe cachedRecipe) { if (specialSlot == null) { return null; } @@ -65,19 +65,19 @@ public class ReplicatorBackend extends RecipeMapBackend { @Nullable private static Materials getMaterialFromDataOrb(ItemStack stack) { - if (ItemList.Tool_DataOrb.isStackEqual(stack, false, true) && Behaviour_DataOrb.getDataTitle(stack) + if (ItemList.Tool_DataOrb.isStackEqual(stack, false, true) && BehaviourDataOrb.getDataTitle(stack) .equals("Elemental-Scan")) { - return Element.get(Behaviour_DataOrb.getDataName(stack)).mLinkedMaterials.stream() + return Element.get(BehaviourDataOrb.getDataName(stack)).mLinkedMaterials.stream() .findFirst() .orElse(null); } return null; } - private static Collection replicatorRecipeEmitter(GT_RecipeBuilder builder) { - Materials material = builder.getMetadata(GT_RecipeConstants.MATERIAL); + private static Collection replicatorRecipeEmitter(GTRecipeBuilder builder) { + Materials material = builder.getMetadata(GTRecipeConstants.MATERIAL); if (material == null) { - throw new IllegalStateException("GT_RecipeConstants.MATERIAL must be set for replicator recipe"); + throw new IllegalStateException("GTRecipeConstants.MATERIAL must be set for replicator recipe"); } return Optional.of(material) .map(material1 -> material1.mElement) @@ -85,7 +85,7 @@ public class ReplicatorBackend extends RecipeMapBackend { .map(ReplicatorBackend::getUUMAmountFromMass) .flatMap( uum -> builder.fluidInputs(Materials.UUMatter.getFluid(uum)) - .duration(GT_Utility.safeInt(uum * 512L, 1)) + .duration(GTUtility.safeInt(uum * 512L, 1)) .eut(TierEU.RECIPE_LV) .ignoreCollision() .noOptimize() @@ -95,6 +95,6 @@ public class ReplicatorBackend extends RecipeMapBackend { } private static int getUUMAmountFromMass(long mass) { - return GT_Utility.safeInt((long) Math.pow(mass, GT_Mod.gregtechproxy.replicatorExponent), 1); + return GTUtility.safeInt((long) Math.pow(mass, GTMod.gregtechproxy.replicatorExponent), 1); } } diff --git a/src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java b/src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java index 98463dcc4d..70c9605e1b 100644 --- a/src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java @@ -1,6 +1,6 @@ package gregtech.api.recipe.maps; -import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.api.util.GTUtility.formatNumbers; import static net.minecraft.util.EnumChatFormatting.GRAY; import static net.minecraft.util.StatCollector.translateToLocal; @@ -22,7 +22,7 @@ import com.gtnewhorizons.modularui.common.widget.ProgressBar; import appeng.util.ReadableNumberConverter; import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.recipe.RecipeMapFrontend; @@ -31,7 +31,7 @@ import gregtech.common.gui.modularui.UIHelper; import gregtech.common.misc.spaceprojects.SpaceProjectManager; import gregtech.common.misc.spaceprojects.SpaceProjectManager.FakeSpaceProjectRecipe; import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; -import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.nei.GTNEIDefaultHandler; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -76,7 +76,7 @@ public class SpaceProjectFrontend extends RecipeMapFrontend { @Override protected List handleNEIItemInputTooltip(List currentTip, - GT_NEI_DefaultHandler.FixedPositionedStack pStack) { + GTNEIDefaultHandler.FixedPositionedStack pStack) { super.handleNEIItemOutputTooltip(currentTip, pStack); if (pStack.isFluid()) return currentTip; currentTip.add(GRAY + translateToLocal("Item Count: ") + formatNumbers(pStack.realStackSize)); @@ -84,11 +84,11 @@ public class SpaceProjectFrontend extends RecipeMapFrontend { } @Override - public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + public void drawNEIOverlays(GTNEIDefaultHandler.CachedDefaultRecipe neiCachedRecipe) { for (PositionedStack stack : neiCachedRecipe.mInputs) { - if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack pStack && stack.item != null + if (stack instanceof GTNEIDefaultHandler.FixedPositionedStack pStack && stack.item != null && !pStack.isFluid()) { - int stackSize = ((GT_NEI_DefaultHandler.FixedPositionedStack) stack).realStackSize; + int stackSize = ((GTNEIDefaultHandler.FixedPositionedStack) stack).realStackSize; String displayString; if (stack.item.stackSize > 9999) { displayString = ReadableNumberConverter.INSTANCE.toWideReadableForm(stackSize); @@ -114,14 +114,14 @@ public class SpaceProjectFrontend extends RecipeMapFrontend { int bar2Width = 18; List> splitProgress = splitProgress(progressSupplier, bar1Width, bar2Width); builder.widget( - new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_1, 17) + new ProgressBar().setTexture(GTUITextures.PROGRESSBAR_ASSEMBLY_LINE_1, 17) .setDirection(ProgressBar.Direction.RIGHT) .setProgress(splitProgress.get(0)) .setSynced(false, false) .setPos(new Pos2d(70, 28).add(windowOffset)) .setSize(bar1Width, 72)); builder.widget( - new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_2, 18) + new ProgressBar().setTexture(GTUITextures.PROGRESSBAR_ASSEMBLY_LINE_2, 18) .setDirection(ProgressBar.Direction.RIGHT) .setProgress(splitProgress.get(1)) .setSynced(false, false) diff --git a/src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java b/src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java index 7a5d7ff164..7a4036e7ba 100644 --- a/src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java +++ b/src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java @@ -1,6 +1,6 @@ package gregtech.api.recipe.maps; -import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.api.util.GTUtility.formatNumbers; import java.util.List; @@ -11,7 +11,7 @@ import com.gtnewhorizons.modularui.api.math.Pos2d; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.recipe.RecipeMapFrontend; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.common.gui.modularui.UIHelper; import gregtech.nei.RecipeDisplayInfo; @@ -45,12 +45,12 @@ public class TranscendentPlasmaMixerFrontend extends RecipeMapFrontend { // These look odd because recipeInfo.recipe.mEUt is actually the EU per litre of fluid processed, not // the EU/t. recipeInfo.drawText( - GT_Utility.trans("152", "Total: ") + GTUtility.trans("152", "Total: ") + formatNumbers(1000L * recipeInfo.recipe.mDuration / 100L * recipeInfo.recipe.mEUt) + " EU"); // 1000 / (20 ticks * 5 seconds) = 10L/t. 10L/t * x EU/L = 10 * x EU/t. long averageUsage = 10L * recipeInfo.recipe.mEUt; recipeInfo.drawText( - "Average: " + formatNumbers(averageUsage) + " EU/t" + GT_Utility.getTierNameWithParentheses(averageUsage)); + "Average: " + formatNumbers(averageUsage) + " EU/t" + GTUtility.getTierNameWithParentheses(averageUsage)); } } diff --git a/src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java b/src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java index e7297f0609..9ea34609f6 100644 --- a/src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java +++ b/src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java @@ -6,12 +6,12 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.ItemList; import gregtech.api.recipe.RecipeMapBackend; import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; @ParametersAreNonnullByDefault @@ -23,16 +23,16 @@ public class UnpackagerBackend extends RecipeMapBackend { } @Override - protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { + protected GTRecipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) { if (items.length == 0 || !ItemList.IC2_Scrapbox.isStackEqual(items[0], false, true)) { return null; } - ItemStack output = GT_ModHandler.getRandomScrapboxDrop(); + ItemStack output = GTModHandler.getRandomScrapboxDrop(); if (output == null) { return null; } - return GT_Values.RA.stdBuilder() + return GTValues.RA.stdBuilder() .itemInputs(ItemList.IC2_Scrapbox.get(1)) .itemOutputs(output) .duration(16) diff --git a/src/main/java/gregtech/api/recipe/metadata/CompressionTierKey.java b/src/main/java/gregtech/api/recipe/metadata/CompressionTierKey.java index 384b5ce2d9..88bd3d6664 100644 --- a/src/main/java/gregtech/api/recipe/metadata/CompressionTierKey.java +++ b/src/main/java/gregtech/api/recipe/metadata/CompressionTierKey.java @@ -1,6 +1,6 @@ package gregtech.api.recipe.metadata; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java index 05db919b57..ada5574b01 100644 --- a/src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java +++ b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java @@ -1,6 +1,6 @@ package gregtech.api.recipe.metadata; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java index 8257f1e6ef..4891c88848 100644 --- a/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java +++ b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java @@ -1,6 +1,6 @@ package gregtech.api.recipe.metadata; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/gregtech/api/registries/LHECoolantRegistry.java b/src/main/java/gregtech/api/registries/LHECoolantRegistry.java index 7944132572..084086c841 100644 --- a/src/main/java/gregtech/api/registries/LHECoolantRegistry.java +++ b/src/main/java/gregtech/api/registries/LHECoolantRegistry.java @@ -7,6 +7,8 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import gregtech.common.tileentities.machines.multi.MTEHeatExchanger; + public class LHECoolantRegistry { private static final Map lheCoolants = new HashMap<>(); @@ -15,9 +17,9 @@ public class LHECoolantRegistry { * Registers a coolant for use in Large Heat Exchangers and Whakawhiti Weras. * See the constants in {@link #registerBaseCoolants()} as a reference for what the multipliers should be. * The multipliers are used in - * {@link gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_HeatExchanger#checkProcessing()} - * and {@link gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_HeatExchanger#onRunningTick()}. - * + * {@link MTEHeatExchanger#checkProcessing()} + * and {@link MTEHeatExchanger#onRunningTick()}. + * * @param coldFluidName The fluid name of the resulting cold coolant * @param hotFluidName The fluid name of the input hot coolant * @param steamMultiplier The steam multiplier diff --git a/src/main/java/gregtech/api/render/TextureFactory.java b/src/main/java/gregtech/api/render/TextureFactory.java index 26142fd606..a87b20ccb4 100644 --- a/src/main/java/gregtech/api/render/TextureFactory.java +++ b/src/main/java/gregtech/api/render/TextureFactory.java @@ -6,7 +6,7 @@ import net.minecraftforge.common.util.ForgeDirection; import gregtech.api.interfaces.IIconContainer; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.ITextureBuilder; -import gregtech.common.render.GT_TextureBuilder; +import gregtech.common.render.GTTextureBuilder; /** *

@@ -152,6 +152,6 @@ public final class TextureFactory { * @return An instance of the {@link ITextureBuilder} implementation */ public static ITextureBuilder builder() { - return new GT_TextureBuilder(); + return new GTTextureBuilder(); } } diff --git a/src/main/java/gregtech/api/task/tasks/PollutionTask.java b/src/main/java/gregtech/api/task/tasks/PollutionTask.java index 060a91acab..3770409fb1 100644 --- a/src/main/java/gregtech/api/task/tasks/PollutionTask.java +++ b/src/main/java/gregtech/api/task/tasks/PollutionTask.java @@ -8,7 +8,7 @@ import gregtech.api.enums.TickTime; import gregtech.api.interfaces.tileentity.IMachineProgress; import gregtech.api.task.TaskHost; import gregtech.api.task.TickableTask; -import gregtech.common.GT_Pollution; +import gregtech.common.Pollution; public class PollutionTask extends TickableTask { @@ -38,7 +38,7 @@ public class PollutionTask extends Tickab public void update(long tick, boolean isServerSide) { if (isServerSide && tick % POLLUTION_TICK == 0 && taskHost.hasThingsToDo()) { if (taskHost instanceof final TileEntity entity) { - GT_Pollution.addPollution(entity, getPollutionPerSecond()); + Pollution.addPollution(entity, getPollutionPerSecond()); } } } diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java b/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java deleted file mode 100644 index 5e3b36f473..0000000000 --- a/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java +++ /dev/null @@ -1,87 +0,0 @@ -package gregtech.api.threads; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.gtnhlib.util.CoordinatePacker; - -import gregtech.GT_Mod; -import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.common.GT_Proxy; - -public class GT_Runnable_Cable_Update extends GT_Runnable_MachineBlockUpdate { - - protected GT_Runnable_Cable_Update(World aWorld, int posX, int posY, int posZ) { - super(aWorld, posX, posY, posZ); - } - - public static void setCableUpdateValues(World aWorld, int posX, int posY, int posZ) { - if (isEnabled) { - EXECUTOR_SERVICE.submit(new GT_Runnable_Cable_Update(aWorld, posX, posY, posZ)); - } - } - - @Override - public void run() { - int posX, posY, posZ; - try { - while (!tQueue.isEmpty()) { - final long packedCoords = tQueue.dequeueLong(); - posX = CoordinatePacker.unpackX(packedCoords); - posY = CoordinatePacker.unpackY(packedCoords); - posZ = CoordinatePacker.unpackZ(packedCoords); - - final TileEntity tTileEntity; - - GT_Proxy.TICK_LOCK.lock(); - try { - // we dont want to go over cables that are in unloaded chunks - // keeping the lock just to make sure no CME happens - if (world.blockExists(posX, posY, posZ)) { - tTileEntity = world.getTileEntity(posX, posY, posZ); - } else { - tTileEntity = null; - } - } finally { - GT_Proxy.TICK_LOCK.unlock(); - } - - // See if the block itself needs an update - if (tTileEntity instanceof IMachineBlockUpdateable) - ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); - - // Now see if we should add the nearby blocks to the queue: - // only add blocks the cable is connected to - if (tTileEntity instanceof BaseMetaPipeEntity metaPipe - && metaPipe.getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable cable) { - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { - final ForgeDirection side = ForgeDirection.VALID_DIRECTIONS[i]; - if (cable.isConnectedAtSide(side)) { - final long tCoords = CoordinatePacker - .pack(posX + side.offsetX, posY + side.offsetY, posZ + side.offsetZ); - if (visited.add(tCoords)) { - tQueue.enqueue(tCoords); - } - } - } - } - } - } catch (Exception e) { - GT_Mod.GT_FML_LOGGER.error( - "Well this update was broken... " + initialX - + ", " - + initialY - + ", " - + initialZ - + ", mWorld={" - + world.getProviderName() - + " @dimId " - + world.provider.dimensionId - + "}", - e); - } - } -} diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java deleted file mode 100644 index 339556e246..0000000000 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ /dev/null @@ -1,184 +0,0 @@ -package gregtech.api.threads; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.gtnhlib.util.CoordinatePacker; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.common.GT_Proxy; -import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import it.unimi.dsi.fastutil.longs.LongSet; - -public class GT_Runnable_MachineBlockUpdate implements Runnable { - - // used by runner thread - protected final int initialX, initialY, initialZ; - protected final World world; - protected final LongSet visited = new LongOpenHashSet(); - protected final LongArrayFIFOQueue tQueue = new LongArrayFIFOQueue(); - - // Threading - private static final ThreadFactory THREAD_FACTORY = r -> { - Thread thread = new Thread(r); - thread.setName("GT_MachineBlockUpdate"); - return thread; - }; - protected static ExecutorService EXECUTOR_SERVICE; - - // This class should never be initiated outside of this class! - protected GT_Runnable_MachineBlockUpdate(World aWorld, int posX, int posY, int posZ) { - this.world = aWorld; - this.initialX = posX; - this.initialY = posY; - this.initialZ = posZ; - final long coords = CoordinatePacker.pack(posX, posY, posZ); - visited.add(coords); - tQueue.enqueue(coords); - } - - public static boolean isEnabled() { - return isEnabled; - } - - public static void setEnabled() { - GT_Runnable_MachineBlockUpdate.isEnabled = true; - } - - public static void setDisabled() { - GT_Runnable_MachineBlockUpdate.isEnabled = false; - } - - public static void setEnabled(boolean isEnabled) { - GT_Runnable_MachineBlockUpdate.isEnabled = isEnabled; - } - - public static boolean isCurrentThreadEnabled() { - return perThreadEnable.get(); - } - - public static void setCurrentThreadEnabled(boolean perThreadEnable) { - GT_Runnable_MachineBlockUpdate.perThreadEnable.set(perThreadEnable); - } - - protected static boolean isEnabled = true; - protected static final ThreadLocal perThreadEnable = ThreadLocal.withInitial(() -> true); - - public static void setMachineUpdateValues(World aWorld, int posX, int posY, int posZ) { - if (isEnabled() && isCurrentThreadEnabled()) { - EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld, posX, posY, posZ)); - } - } - - public static void initExecutorService() { - EXECUTOR_SERVICE = Executors.newFixedThreadPool( - Math.max( - 1, - (Runtime.getRuntime() - .availableProcessors() * 2 - / 3)), - THREAD_FACTORY); - } - - public static void shutdownExecutorService() { - try { - GT_Mod.GT_FML_LOGGER.info("Shutting down Machine block update executor service"); - EXECUTOR_SERVICE.shutdown(); // Disable new tasks from being submitted - // Wait a while for existing tasks to terminate - if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) { - EXECUTOR_SERVICE.shutdownNow(); // Cancel currently executing tasks - // Wait a while for tasks to respond to being cancelled - if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) { - GT_Mod.GT_FML_LOGGER.error( - "Well this didn't terminated well... GT_Runnable_MachineBlockUpdate.shutdownExecutorService"); - } - } - } catch (InterruptedException ie) { - GT_Mod.GT_FML_LOGGER.error("Well this interruption got interrupted...", ie); - // (Re-)Cancel if current thread also interrupted - EXECUTOR_SERVICE.shutdownNow(); - // Preserve interrupt status - Thread.currentThread() - .interrupt(); - } catch (Exception e) { - GT_Mod.GT_FML_LOGGER.error("Well this didn't terminated well...", e); - // (Re-)Cancel in case - EXECUTOR_SERVICE.shutdownNow(); - } finally { - GT_Mod.GT_FML_LOGGER.info("Leaving... GT_Runnable_MachineBlockUpdate.shutdownExecutorService"); - } - } - - @Override - public void run() { - int posX, posY, posZ; - try { - while (!tQueue.isEmpty()) { - final long packedCoords = tQueue.dequeueLong(); - posX = CoordinatePacker.unpackX(packedCoords); - posY = CoordinatePacker.unpackY(packedCoords); - posZ = CoordinatePacker.unpackZ(packedCoords); - - final TileEntity tTileEntity; - final boolean isMachineBlock; - - // This might load a chunk... which might load a TileEntity... which might get added to - // `loadedTileEntityList`... which might be in the process - // of being iterated over during `UpdateEntities()`... which might cause a - // ConcurrentModificationException. So, lock that shit. - GT_Proxy.TICK_LOCK.lock(); - try { - tTileEntity = world.getTileEntity(posX, posY, posZ); - isMachineBlock = GregTech_API - .isMachineBlock(world.getBlock(posX, posY, posZ), world.getBlockMetadata(posX, posY, posZ)); - } finally { - GT_Proxy.TICK_LOCK.unlock(); - } - - // See if the block itself needs an update - if (tTileEntity instanceof IMachineBlockUpdateable) - ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); - - // Now see if we should add the nearby blocks to the queue: - // 1) If we've visited less than 5 blocks, then yes - // 2) If the tile says we should recursively updated (pipes don't, machine blocks do) - // 3) If the block at the coordinates is marked as a machine block - if (visited.size() < 5 - || (tTileEntity instanceof IMachineBlockUpdateable - && ((IMachineBlockUpdateable) tTileEntity).isMachineBlockUpdateRecursive()) - || isMachineBlock) { - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { - final ForgeDirection side = ForgeDirection.VALID_DIRECTIONS[i]; - final long tCoords = CoordinatePacker - .pack(posX + side.offsetX, posY + side.offsetY, posZ + side.offsetZ); - if (visited.add(tCoords)) { - tQueue.enqueue(tCoords); - } - } - } - } - } catch (Exception e) { - GT_Mod.GT_FML_LOGGER.error( - "Well this update was broken... " + initialX - + ", " - + initialY - + ", " - + initialZ - + ", mWorld={" - + world.getProviderName() - + " @dimId " - + world.provider.dimensionId - + "}", - e); - } - } -} diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_Sound.java b/src/main/java/gregtech/api/threads/GT_Runnable_Sound.java deleted file mode 100644 index 9021a60e89..0000000000 --- a/src/main/java/gregtech/api/threads/GT_Runnable_Sound.java +++ /dev/null @@ -1,41 +0,0 @@ -package gregtech.api.threads; - -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; - -import gregtech.api.util.GT_PlayedSound; -import gregtech.api.util.GT_Utility; - -public class GT_Runnable_Sound implements Runnable { - - private final double mX, mY, mZ; - private final int mTimeUntilNextSound; - private final World mWorld; - private final ResourceLocation mSoundResourceLocation; - private final float mSoundStrength, mSoundModulation; - - public GT_Runnable_Sound(World aWorld, double aX, double aY, double aZ, int aTimeUntilNextSound, - ResourceLocation aSoundResourceLocation, float aSoundStrength, float aSoundModulation) { - mWorld = aWorld; - mX = aX; - mY = aY; - mZ = aZ; - mTimeUntilNextSound = aTimeUntilNextSound; - mSoundResourceLocation = aSoundResourceLocation; - mSoundStrength = aSoundStrength; - mSoundModulation = aSoundModulation; - } - - @Override - public void run() { - try { - GT_PlayedSound tSound; - if (GT_Utility.sPlayedSoundMap.containsKey(tSound = new GT_PlayedSound(mSoundResourceLocation, mX, mY, mZ))) - return; - mWorld.playSound(mX, mY, mZ, mSoundResourceLocation.toString(), mSoundStrength, mSoundModulation, false); - GT_Utility.sPlayedSoundMap.put(tSound, mTimeUntilNextSound); - } catch (Throwable e) { - /**/ - } - } -} diff --git a/src/main/java/gregtech/api/threads/RunnableCableUpdate.java b/src/main/java/gregtech/api/threads/RunnableCableUpdate.java new file mode 100644 index 0000000000..7ed4e28554 --- /dev/null +++ b/src/main/java/gregtech/api/threads/RunnableCableUpdate.java @@ -0,0 +1,87 @@ +package gregtech.api.threads; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.gtnhlib.util.CoordinatePacker; + +import gregtech.GTMod; +import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.implementations.MTECable; +import gregtech.common.GTProxy; + +public class RunnableCableUpdate extends RunnableMachineUpdate { + + protected RunnableCableUpdate(World aWorld, int posX, int posY, int posZ) { + super(aWorld, posX, posY, posZ); + } + + public static void setCableUpdateValues(World aWorld, int posX, int posY, int posZ) { + if (isEnabled) { + EXECUTOR_SERVICE.submit(new RunnableCableUpdate(aWorld, posX, posY, posZ)); + } + } + + @Override + public void run() { + int posX, posY, posZ; + try { + while (!tQueue.isEmpty()) { + final long packedCoords = tQueue.dequeueLong(); + posX = CoordinatePacker.unpackX(packedCoords); + posY = CoordinatePacker.unpackY(packedCoords); + posZ = CoordinatePacker.unpackZ(packedCoords); + + final TileEntity tTileEntity; + + GTProxy.TICK_LOCK.lock(); + try { + // we dont want to go over cables that are in unloaded chunks + // keeping the lock just to make sure no CME happens + if (world.blockExists(posX, posY, posZ)) { + tTileEntity = world.getTileEntity(posX, posY, posZ); + } else { + tTileEntity = null; + } + } finally { + GTProxy.TICK_LOCK.unlock(); + } + + // See if the block itself needs an update + if (tTileEntity instanceof IMachineBlockUpdateable) + ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); + + // Now see if we should add the nearby blocks to the queue: + // only add blocks the cable is connected to + if (tTileEntity instanceof BaseMetaPipeEntity metaPipe + && metaPipe.getMetaTileEntity() instanceof MTECable cable) { + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + final ForgeDirection side = ForgeDirection.VALID_DIRECTIONS[i]; + if (cable.isConnectedAtSide(side)) { + final long tCoords = CoordinatePacker + .pack(posX + side.offsetX, posY + side.offsetY, posZ + side.offsetZ); + if (visited.add(tCoords)) { + tQueue.enqueue(tCoords); + } + } + } + } + } + } catch (Exception e) { + GTMod.GT_FML_LOGGER.error( + "Well this update was broken... " + initialX + + ", " + + initialY + + ", " + + initialZ + + ", mWorld={" + + world.getProviderName() + + " @dimId " + + world.provider.dimensionId + + "}", + e); + } + } +} diff --git a/src/main/java/gregtech/api/threads/RunnableMachineUpdate.java b/src/main/java/gregtech/api/threads/RunnableMachineUpdate.java new file mode 100644 index 0000000000..d11e176f3d --- /dev/null +++ b/src/main/java/gregtech/api/threads/RunnableMachineUpdate.java @@ -0,0 +1,184 @@ +package gregtech.api.threads; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.gtnhlib.util.CoordinatePacker; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; +import gregtech.common.GTProxy; +import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import it.unimi.dsi.fastutil.longs.LongSet; + +public class RunnableMachineUpdate implements Runnable { + + // used by runner thread + protected final int initialX, initialY, initialZ; + protected final World world; + protected final LongSet visited = new LongOpenHashSet(); + protected final LongArrayFIFOQueue tQueue = new LongArrayFIFOQueue(); + + // Threading + private static final ThreadFactory THREAD_FACTORY = r -> { + Thread thread = new Thread(r); + thread.setName("GT_MachineBlockUpdate"); + return thread; + }; + protected static ExecutorService EXECUTOR_SERVICE; + + // This class should never be initiated outside of this class! + protected RunnableMachineUpdate(World aWorld, int posX, int posY, int posZ) { + this.world = aWorld; + this.initialX = posX; + this.initialY = posY; + this.initialZ = posZ; + final long coords = CoordinatePacker.pack(posX, posY, posZ); + visited.add(coords); + tQueue.enqueue(coords); + } + + public static boolean isEnabled() { + return isEnabled; + } + + public static void setEnabled() { + RunnableMachineUpdate.isEnabled = true; + } + + public static void setDisabled() { + RunnableMachineUpdate.isEnabled = false; + } + + public static void setEnabled(boolean isEnabled) { + RunnableMachineUpdate.isEnabled = isEnabled; + } + + public static boolean isCurrentThreadEnabled() { + return perThreadEnable.get(); + } + + public static void setCurrentThreadEnabled(boolean perThreadEnable) { + RunnableMachineUpdate.perThreadEnable.set(perThreadEnable); + } + + protected static boolean isEnabled = true; + protected static final ThreadLocal perThreadEnable = ThreadLocal.withInitial(() -> true); + + public static void setMachineUpdateValues(World aWorld, int posX, int posY, int posZ) { + if (isEnabled() && isCurrentThreadEnabled()) { + EXECUTOR_SERVICE.submit(new RunnableMachineUpdate(aWorld, posX, posY, posZ)); + } + } + + public static void initExecutorService() { + EXECUTOR_SERVICE = Executors.newFixedThreadPool( + Math.max( + 1, + (Runtime.getRuntime() + .availableProcessors() * 2 + / 3)), + THREAD_FACTORY); + } + + public static void shutdownExecutorService() { + try { + GTMod.GT_FML_LOGGER.info("Shutting down Machine block update executor service"); + EXECUTOR_SERVICE.shutdown(); // Disable new tasks from being submitted + // Wait a while for existing tasks to terminate + if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) { + EXECUTOR_SERVICE.shutdownNow(); // Cancel currently executing tasks + // Wait a while for tasks to respond to being cancelled + if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) { + GTMod.GT_FML_LOGGER.error( + "Well this didn't terminated well... GT_Runnable_MachineBlockUpdate.shutdownExecutorService"); + } + } + } catch (InterruptedException ie) { + GTMod.GT_FML_LOGGER.error("Well this interruption got interrupted...", ie); + // (Re-)Cancel if current thread also interrupted + EXECUTOR_SERVICE.shutdownNow(); + // Preserve interrupt status + Thread.currentThread() + .interrupt(); + } catch (Exception e) { + GTMod.GT_FML_LOGGER.error("Well this didn't terminated well...", e); + // (Re-)Cancel in case + EXECUTOR_SERVICE.shutdownNow(); + } finally { + GTMod.GT_FML_LOGGER.info("Leaving... GT_Runnable_MachineBlockUpdate.shutdownExecutorService"); + } + } + + @Override + public void run() { + int posX, posY, posZ; + try { + while (!tQueue.isEmpty()) { + final long packedCoords = tQueue.dequeueLong(); + posX = CoordinatePacker.unpackX(packedCoords); + posY = CoordinatePacker.unpackY(packedCoords); + posZ = CoordinatePacker.unpackZ(packedCoords); + + final TileEntity tTileEntity; + final boolean isMachineBlock; + + // This might load a chunk... which might load a TileEntity... which might get added to + // `loadedTileEntityList`... which might be in the process + // of being iterated over during `UpdateEntities()`... which might cause a + // ConcurrentModificationException. So, lock that shit. + GTProxy.TICK_LOCK.lock(); + try { + tTileEntity = world.getTileEntity(posX, posY, posZ); + isMachineBlock = GregTechAPI + .isMachineBlock(world.getBlock(posX, posY, posZ), world.getBlockMetadata(posX, posY, posZ)); + } finally { + GTProxy.TICK_LOCK.unlock(); + } + + // See if the block itself needs an update + if (tTileEntity instanceof IMachineBlockUpdateable) + ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); + + // Now see if we should add the nearby blocks to the queue: + // 1) If we've visited less than 5 blocks, then yes + // 2) If the tile says we should recursively updated (pipes don't, machine blocks do) + // 3) If the block at the coordinates is marked as a machine block + if (visited.size() < 5 + || (tTileEntity instanceof IMachineBlockUpdateable + && ((IMachineBlockUpdateable) tTileEntity).isMachineBlockUpdateRecursive()) + || isMachineBlock) { + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + final ForgeDirection side = ForgeDirection.VALID_DIRECTIONS[i]; + final long tCoords = CoordinatePacker + .pack(posX + side.offsetX, posY + side.offsetY, posZ + side.offsetZ); + if (visited.add(tCoords)) { + tQueue.enqueue(tCoords); + } + } + } + } + } catch (Exception e) { + GTMod.GT_FML_LOGGER.error( + "Well this update was broken... " + initialX + + ", " + + initialY + + ", " + + initialZ + + ", mWorld={" + + world.getProviderName() + + " @dimId " + + world.provider.dimensionId + + "}", + e); + } + } +} diff --git a/src/main/java/gregtech/api/threads/RunnableSound.java b/src/main/java/gregtech/api/threads/RunnableSound.java new file mode 100644 index 0000000000..30704f2a97 --- /dev/null +++ b/src/main/java/gregtech/api/threads/RunnableSound.java @@ -0,0 +1,41 @@ +package gregtech.api.threads; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +import gregtech.api.util.GTPlayedSound; +import gregtech.api.util.GTUtility; + +public class RunnableSound implements Runnable { + + private final double mX, mY, mZ; + private final int mTimeUntilNextSound; + private final World mWorld; + private final ResourceLocation mSoundResourceLocation; + private final float mSoundStrength, mSoundModulation; + + public RunnableSound(World aWorld, double aX, double aY, double aZ, int aTimeUntilNextSound, + ResourceLocation aSoundResourceLocation, float aSoundStrength, float aSoundModulation) { + mWorld = aWorld; + mX = aX; + mY = aY; + mZ = aZ; + mTimeUntilNextSound = aTimeUntilNextSound; + mSoundResourceLocation = aSoundResourceLocation; + mSoundStrength = aSoundStrength; + mSoundModulation = aSoundModulation; + } + + @Override + public void run() { + try { + GTPlayedSound tSound; + if (GTUtility.sPlayedSoundMap.containsKey(tSound = new GTPlayedSound(mSoundResourceLocation, mX, mY, mZ))) + return; + mWorld.playSound(mX, mY, mZ, mSoundResourceLocation.toString(), mSoundStrength, mSoundModulation, false); + GTUtility.sPlayedSoundMap.put(tSound, mTimeUntilNextSound); + } catch (Throwable e) { + /**/ + } + } +} diff --git a/src/main/java/gregtech/api/util/AssemblyLineServer.java b/src/main/java/gregtech/api/util/AssemblyLineServer.java new file mode 100644 index 0000000000..49e3882982 --- /dev/null +++ b/src/main/java/gregtech/api/util/AssemblyLineServer.java @@ -0,0 +1,297 @@ +package gregtech.api.util; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; + +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsBotania; + +public class AssemblyLineServer { + + public static LinkedHashMap lServerNames = new LinkedHashMap<>(); + private static LinkedHashMap internal2 = new LinkedHashMap<>(), internal3 = new LinkedHashMap<>(), + internal4 = new LinkedHashMap<>(); + private static HashMap internal = new HashMap<>(); + + public static void fillMap(FMLPreInitializationEvent aEvent) { + Configuration conf = GTLanguageManager.sEnglishFile; + + ConfigCategory cat = conf.getCategory("languagefile"); + internal.putAll(cat.getValues()); + for (Map.Entry entry : internal.entrySet()) { + try { + String s = entry.getValue() + .getString() + .replaceAll("%", ""); + + if (entry.getKey() + .contains("metaitem") && s.contains("material")) internal2.put(entry.getKey(), s); + else if (entry.getKey() + .contains("blockmachines") && s.contains("material")) internal3.put(entry.getKey(), s); + else if ((entry.getKey() + .contains("blockores") + || (entry.getKey() + .contains("blockmetal") + || entry.getKey() + .contains("blockgem"))) + && s.contains("material")) internal4.put(entry.getKey(), s); + else lServerNames.put(entry.getKey(), s); + } catch (Exception ignored) {} + } + for (Map.Entry entry : internal2.entrySet()) { + try { + if (entry.getKey() + .contains("name")) { + int i = Integer.parseInt( + entry.getKey() + .substring( + "gt.metaitem.01.".length(), + entry.getKey() + .length() - ".name".length())); + i = i % 1000; + if (GregTechAPI.sGeneratedMaterials[i] != null) lServerNames.put( + entry.getKey(), + entry.getValue() + .replace("material", GregTechAPI.sGeneratedMaterials[i].toString())); + else lServerNames.put(entry.getKey(), null); + } + } catch (Exception ignored) {} + } + for (Map.Entry entry : internal3.entrySet()) { + try { + if (entry.getKey() + .contains("cable")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.cable.".length(), + entry.getKey() + .length() - ".01.name".length()))); + else if (entry.getKey() + .contains("gt_frame_")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_frame_".length(), + entry.getKey() + .length() - ".name".length()))); + else if (entry.getKey() + .contains("gt_pipe_")) { + if (!entry.getKey() + .contains("_huge") + && !entry.getKey() + .contains("_large") + && !entry.getKey() + .contains("_nonuple") + && !entry.getKey() + .contains("_quadruple") + && !entry.getKey() + .contains("_small") + && !entry.getKey() + .contains("_tiny")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - ".name".length()))); + else if (entry.getKey() + .contains("_huge") + || entry.getKey() + .contains("_tiny")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_tiny.name".length()))); + else if (entry.getKey() + .contains("_large") + || entry.getKey() + .contains("_small")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_large.name".length()))); + else if (entry.getKey() + .contains("_nonuple")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_nonuple.name".length()))); + else if (entry.getKey() + .contains("_quadruple")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_quadruple.name".length()))); + } else if (entry.getKey() + .contains("wire")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.wire.".length(), + entry.getKey() + .length() - ".01.name".length()))); + else lServerNames.put(entry.getKey(), entry.getValue()); + } catch (Exception ignored) {} + } + for (Map.Entry entry : internal4.entrySet()) { + try { + if (entry.getKey() + .contains("blockores")) { + int i = Integer.parseInt( + entry.getKey() + .substring( + "gt.blockores.".length(), + entry.getKey() + .length() - ".name".length())); + i = i % 1000; + if (GregTechAPI.sGeneratedMaterials[i] != null) lServerNames.put( + entry.getKey(), + entry.getValue() + .replace("material", GregTechAPI.sGeneratedMaterials[i].toString())); + else lServerNames.put(entry.getKey(), null); + } else if (entry.getKey() + .contains("blockmetal")) { + Materials[] mMats = null; + String t = entry.getKey() + .substring("gt.blockmetal".length()); + t = t.substring(0, 1); + int i = Integer.parseInt(t); + switch (i) { + case 1 -> mMats = new Materials[] { Materials.Adamantium, Materials.Aluminium, + Materials.Americium, Materials.AnnealedCopper, Materials.Antimony, Materials.Arsenic, + Materials.AstralSilver, Materials.BatteryAlloy, Materials.Beryllium, Materials.Bismuth, + Materials.BismuthBronze, Materials.BlackBronze, Materials.BlackSteel, + Materials.BlueAlloy, Materials.BlueSteel, Materials.Brass }; + case 2 -> mMats = new Materials[] { Materials.Bronze, Materials.Caesium, Materials.Cerium, + Materials.Chrome, Materials.ChromiumDioxide, Materials.Cobalt, Materials.CobaltBrass, + Materials.Copper, Materials.Cupronickel, Materials.DamascusSteel, Materials.DarkIron, + Materials.DeepIron, Materials.Desh, Materials.Duranium, Materials.Dysprosium, + Materials.Electrum }; + case 3 -> mMats = new Materials[] { Materials.ElectrumFlux, Materials.Enderium, + Materials.Erbium, Materials.Europium, Materials.FierySteel, Materials.Gadolinium, + Materials.Gallium, Materials.Holmium, Materials.HSLA, Materials.Indium, + Materials.InfusedGold, Materials.Invar, Materials.Iridium, Materials.IronMagnetic, + Materials.IronWood, Materials.Kanthal }; + case 4 -> mMats = new Materials[] { Materials.Knightmetal, Materials.Lanthanum, + Materials.Lead, Materials.Lutetium, Materials.Magnalium, Materials.Magnesium, + Materials.Manganese, Materials.MeteoricIron, Materials.MeteoricSteel, Materials.Trinium, + Materials.Mithril, Materials.Molybdenum, Materials.Naquadah, Materials.NaquadahAlloy, + Materials.NaquadahEnriched, Materials.Naquadria }; + case 5 -> mMats = new Materials[] { Materials.Neodymium, Materials.NeodymiumMagnetic, + Materials.Neutronium, Materials.Nichrome, Materials.Nickel, Materials.Niobium, + Materials.NiobiumNitride, Materials.NiobiumTitanium, Materials.Osmiridium, + Materials.Osmium, Materials.Palladium, Materials.PigIron, Materials.Platinum, + Materials.Plutonium, Materials.Plutonium241, Materials.Praseodymium }; + case 6 -> mMats = new Materials[] { Materials.Promethium, Materials.RedAlloy, + Materials.RedSteel, Materials.RoseGold, Materials.Rubidium, Materials.Samarium, + Materials.Scandium, Materials.ShadowIron, Materials.ShadowSteel, Materials.Silicon, + Materials.Silver, Materials.SolderingAlloy, Materials.StainlessSteel, Materials.Steel, + Materials.SteelMagnetic, Materials.SterlingSilver }; + case 7 -> mMats = new Materials[] { Materials.Sunnarium, Materials.Tantalum, + Materials.Tellurium, Materials.Terbium, Materials.Thaumium, Materials.Thorium, + Materials.Thulium, Materials.Tin, Materials.TinAlloy, Materials.Titanium, + Materials.Tritanium, Materials.Tungsten, Materials.TungstenSteel, Materials.Ultimet, + Materials.Uranium, Materials.Uranium235 }; + case 8 -> mMats = new Materials[] { Materials.Vanadium, Materials.VanadiumGallium, + Materials.WroughtIron, Materials.Ytterbium, Materials.Yttrium, + Materials.YttriumBariumCuprate, Materials.Zinc, Materials.TungstenCarbide, + Materials.VanadiumSteel, Materials.HSSG, Materials.HSSE, Materials.HSSS, + Materials.Steeleaf, Materials.Ichorium, Materials.Firestone }; + } + t = entry.getKey() + .substring( + "gt.blockmetal1.".length(), + entry.getKey() + .length() - ".name".length()); + i = Integer.parseInt(t); + lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString()); + mMats = null; + } else if (entry.getKey() + .contains("blockgem")) { + Materials[] mMats = null; + String t = entry.getKey() + .substring("gt.blockgem".length()); + t = t.substring(0, 1); + int i = Integer.parseInt(t); + switch (i) { + case 1 -> mMats = new Materials[] { Materials.InfusedAir, Materials.Amber, + Materials.Amethyst, Materials.InfusedWater, Materials.BlueTopaz, + Materials.CertusQuartz, Materials.Dilithium, Materials.EnderEye, + Materials.EnderPearl, Materials.FoolsRuby, Materials.Force, Materials.Forcicium, + Materials.Forcillium, Materials.GreenSapphire, Materials.InfusedFire, + Materials.Jasper, MaterialsBotania.ManaDiamond, + MaterialsBotania.BotaniaDragonstone }; + case 2 -> mMats = new Materials[] { Materials.Lazurite, Materials.Lignite, + Materials.Monazite, Materials.Niter, Materials.Olivine, Materials.Opal, + Materials.InfusedOrder, Materials.InfusedEntropy, Materials.Phosphorus, + Materials.Quartzite, Materials.GarnetRed, Materials.Ruby, Materials.Sapphire, + Materials.Sodalite, Materials.Tanzanite, Materials.InfusedEarth }; + case 3 -> mMats = new Materials[] { Materials.Topaz, Materials.Vinteum, + Materials.GarnetYellow, Materials.NetherStar, Materials.Charcoal, Materials.Blaze }; + } + t = entry.getKey() + .substring( + "gt.blockgem1.".length(), + entry.getKey() + .length() - ".name".length()); + i = Integer.parseInt(t); + lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString()); + mMats = null; + } + } catch (Exception ignored) {} + } + + internal = null; + internal2 = null; + internal3 = null; + internal4 = null; + } +} diff --git a/src/main/java/gregtech/api/util/AssemblyLineUtils.java b/src/main/java/gregtech/api/util/AssemblyLineUtils.java new file mode 100644 index 0000000000..22bed1884b --- /dev/null +++ b/src/main/java/gregtech/api/util/AssemblyLineUtils.java @@ -0,0 +1,561 @@ +package gregtech.api.util; + +import static gregtech.GTMod.GT_FML_LOGGER; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.fluids.FluidStack; + +import cpw.mods.fml.common.FMLCommonHandler; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.GTRecipe.RecipeAssemblyLine; + +public class AssemblyLineUtils { + + /** + * A cache of Recipes using the Output as Key. + */ + private static final HashMap sRecipeCacheByOutput = new HashMap<>(); + /** + * A cache of Recipes using the Recipe Hash String as Key. + */ + private static final HashMap sRecipeCacheByRecipeHash = new HashMap<>(); + + /** + * Checks the DataStick for deprecated/invalid recipes, updating them as required. + * + * @param aDataStick - The DataStick to process + * @return Is this DataStick now valid with a current recipe? + */ + public static GTRecipe.RecipeAssemblyLine processDataStick(ItemStack aDataStick) { + if (!isItemDataStick(aDataStick)) { + return null; + } + if (doesDataStickNeedUpdate(aDataStick)) { + ItemStack aStickOutput = getDataStickOutput(aDataStick); + if (aStickOutput != null) { + GTRecipe.RecipeAssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput); + if (aIntendedRecipe != null && setAssemblyLineRecipeOnDataStick(aDataStick, aIntendedRecipe)) + return aIntendedRecipe; + } + } + return null; + } + + /** + * Finds an Assembly Line recipe from a DataStick. + * + * @param aDataStick - The DataStick to check. + * @return The GTRecipe_AssemblyLine recipe contained on the DataStick, if any. + */ + public static RecipeAssemblyLine findAssemblyLineRecipeFromDataStick(ItemStack aDataStick) { + return findAssemblyLineRecipeFromDataStick(aDataStick, false).getRecipe(); + } + + /** + * Finds an Assembly Line recipe from a DataStick. + * + * @param aDataStick - The DataStick to check. + * @param aReturnBuiltRecipe - Do we return a GTRecipe_AssemblyLine built from the data on the Data Stick instead + * of searching the Recipe Map? + * @return The GTRecipe_AssemblyLine recipe contained on the DataStick, if any. + */ + @Nonnull + public static LookupResult findAssemblyLineRecipeFromDataStick(ItemStack aDataStick, boolean aReturnBuiltRecipe) { + if (!isItemDataStick(aDataStick) || !doesDataStickHaveOutput(aDataStick)) { + return LookupResultType.INVALID_STICK.getResult(); + } + List aInputs = new ArrayList<>(16); + ItemStack aOutput = getDataStickOutput(aDataStick); + List> mOreDictAlt = new ArrayList<>(16); + List aFluidInputs = new ArrayList<>(4); + + NBTTagCompound aTag = aDataStick.getTagCompound(); + if (aTag == null) { + return LookupResultType.INVALID_STICK.getResult(); + } + + // Get From Cache + if (doesDataStickHaveRecipeHash(aDataStick)) { + GTRecipe.RecipeAssemblyLine aRecipeFromCache = sRecipeCacheByRecipeHash + .get(getHashFromDataStack(aDataStick)); + if (aRecipeFromCache != null && GTUtility.areStacksEqual(aOutput, aRecipeFromCache.mOutput)) { + return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipeFromCache); + } // else: no cache, or the old recipe run into a hash collision with a different new recipe + } + + for (int i = 0; i < 16; i++) { + int count = aTag.getInteger("a" + i); + if (!aTag.hasKey("" + i) && count <= 0) { + continue; + } + + List tAltCurrent = new ArrayList<>(); + for (int j = 0; j < count; j++) { + ItemStack tLoaded = GTUtility.loadItem(aTag, "a" + i + ":" + j); + if (tLoaded == null) { + continue; + } + tAltCurrent.add(tLoaded); + if (GTValues.D1) { + GT_FML_LOGGER.info("Item Alt " + i + " : " + tLoaded.getUnlocalizedName()); + } + } + mOreDictAlt.add(tAltCurrent); + ItemStack tLoaded = GTUtility.loadItem(aTag, "" + i); + if (tLoaded == null) { + continue; + } + aInputs.add(tLoaded); + if (GTValues.D1) { + GT_FML_LOGGER.info("Item " + i + " : " + tLoaded.getUnlocalizedName()); + } + } + + if (GTValues.D1) { + GT_FML_LOGGER.info("All Items done, start fluid check"); + } + for (int i = 0; i < 4; i++) { + if (!aTag.hasKey("f" + i)) continue; + FluidStack tLoaded = GTUtility.loadFluid(aTag, "f" + i); + if (tLoaded == null) continue; + aFluidInputs.add(tLoaded); + if (GTValues.D1) { + GT_FML_LOGGER.info("Fluid " + i + " " + tLoaded.getUnlocalizedName()); + } + } + if (!aTag.hasKey("output") || !aTag.hasKey("time") + || aTag.getInteger("time") <= 0 + || !aTag.hasKey("eu") + || !GTUtility.isStackValid(aOutput)) { + return LookupResultType.INVALID_STICK.getResult(); + } + if (GTValues.D1) { + GT_FML_LOGGER.info("Found Data Stick recipe"); + } + + int aTime = aTag.getInteger("time"); + int aEU = aTag.getInteger("eu"); + + // Try build a recipe instance + if (aReturnBuiltRecipe) { + return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult( + new GTRecipe.RecipeAssemblyLine( + null, + 0, + aInputs.toArray(new ItemStack[0]), + aFluidInputs.toArray(new FluidStack[0]), + aOutput, + aTime, + aEU)); + } + + for (GTRecipe.RecipeAssemblyLine aRecipe : RecipeAssemblyLine.sAssemblylineRecipes) { + if (aRecipe.mEUt != aEU || aRecipe.mDuration != aTime) continue; + if (!GTUtility.areStacksEqual(aOutput, aRecipe.mOutput, true)) continue; + if (!GTUtility.areStackListsEqual(Arrays.asList(aRecipe.mInputs), aInputs, false, true)) continue; + if (!Objects.equals(Arrays.asList(aRecipe.mFluidInputs), aFluidInputs)) continue; + if (!areStacksEqual(aRecipe.mOreDictAlt, mOreDictAlt)) continue; + + // Cache it + String aRecipeHash = generateRecipeHash(aRecipe); + sRecipeCacheByRecipeHash.put(aRecipeHash, aRecipe); + sRecipeCacheByOutput.put(new GTItemStack(aRecipe.mOutput), aRecipe); + if (doesDataStickHaveRecipeHash(aDataStick)) { + String aStickHash = getHashFromDataStack(aDataStick); + if (aRecipeHash.equals(aStickHash)) + return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipe); + } + return LookupResultType.VALID_STACK_AND_VALID_RECIPE.getResult(aRecipe); + } + return LookupResultType.VALID_STACK_BUT_INVALID_RECIPE.getResult(); + } + + private static boolean areStacksEqual(ItemStack[][] lhs, List> rhs) { + for (int i = 0; i < lhs.length; i++) { + if (!areStacksEqual(lhs[i], rhs.get(i))) return false; + } + return true; + } + + private static boolean areStacksEqual(ItemStack[] lhs, List rhs) { + return lhs == null ? rhs.isEmpty() + : !rhs.isEmpty() && GTUtility.areStackListsEqual(Arrays.asList(lhs), rhs, false, true); + } + + /** + * Finds a GTRecipe_AssemblyLine based on the expected output ItemStack. + * + * @param aOutput - The Output of a GTRecipe_AssemblyLine. + * @return First found GTRecipe_AssemblyLine with matching output. + */ + public static GTRecipe.RecipeAssemblyLine findAssemblyLineRecipeByOutput(ItemStack aOutput) { + if (aOutput == null) { + return null; + } + + // Check the cache + GTItemStack aCacheStack = new GTItemStack(aOutput); + RecipeAssemblyLine aRecipeFromCache = sRecipeCacheByOutput.get(aCacheStack); + if (aRecipeFromCache != null) { + return aRecipeFromCache; + } + + // Iterate all recipes and return the first matching based on Output. + for (RecipeAssemblyLine aRecipe : GTRecipe.RecipeAssemblyLine.sAssemblylineRecipes) { + ItemStack aRecipeOutput = aRecipe.mOutput; + if (GTUtility.areStacksEqual(aRecipeOutput, aOutput)) { + // Cache it to prevent future iterations of all recipes + sRecipeCacheByOutput.put(aCacheStack, aRecipe); + sRecipeCacheByRecipeHash.put(generateRecipeHash(aRecipe), aRecipe); + return aRecipe; + } + } + return null; + } + + /** + * @param aRecipe - The recipe to generate a Recipe Hash String from. + * @return The Recipe Hash String. + */ + public static String generateRecipeHash(GTRecipe.RecipeAssemblyLine aRecipe) { + String aHash = "Invalid.Recipe.Hash"; + if (aRecipe != null) { + aHash = "Hash." + aRecipe.getPersistentHash(); + } + return aHash; + } + + /** + * @param aRecipe - The recipe to add to internal caches + * @throws IllegalArgumentException if given recipe collide with any existing recipe in the cache + */ + public static void addRecipeToCache(RecipeAssemblyLine aRecipe) { + if (aRecipe != null) { + String aHash = "Hash." + aRecipe.getPersistentHash(); + GTRecipe.RecipeAssemblyLine existing = sRecipeCacheByOutput.put(new GTItemStack(aRecipe.mOutput), aRecipe); + if (existing != null) throw new IllegalArgumentException("Duplicate assline recipe for " + aRecipe.mOutput); + existing = sRecipeCacheByRecipeHash.put(aHash, aRecipe); + if (existing != null && !existing.equals(aRecipe)) + throw new IllegalArgumentException("Recipe hash collision for " + aRecipe + " and " + existing); + } + } + + /** + * @param aHash - Recipe hash String, may be null but will just be treated as invalid. + * @return Is this Recipe Hash String valid? + */ + public static boolean isValidHash(String aHash) { + if (aHash != null && aHash.length() > 0) { + // persistent hash can never be 0 + return !aHash.equals("Invalid.Recipe.Hash") && !aHash.equals("Hash.0"); + } + return false; + } + + /** + * @param aStack - The ItemStack to check. + * @return Is this ItemStack a Data Stick? + */ + public static boolean isItemDataStick(ItemStack aStack) { + return GTUtility.isStackValid(aStack) && ItemList.Tool_DataStick.isStackEqual(aStack, false, true); + } + + /** + * @param aDataStick - The Data Stick to check. + * @return Does this Data Stick have a valid output ItemStack? + */ + public static boolean doesDataStickHaveOutput(ItemStack aDataStick) { + return isItemDataStick(aDataStick) && aDataStick.hasTagCompound() + && aDataStick.getTagCompound() + .hasKey("output"); + } + + /** + * @param aDataStick - The Data Stick to check. + * @return Does this Data Stick need recipe data updated. + */ + public static boolean doesDataStickNeedUpdate(ItemStack aDataStick) { + if (isItemDataStick(aDataStick) && doesDataStickHaveRecipeHash(aDataStick)) { + String aStickHash = getHashFromDataStack(aDataStick); + if (isValidHash(aStickHash) && doesDataStickHaveOutput(aDataStick)) { + ItemStack aStickOutput = getDataStickOutput(aDataStick); + GTRecipe.RecipeAssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput); + return !aStickHash.equals(generateRecipeHash(aIntendedRecipe)); + } + } + return true; + } + + /** + * @param aDataStick - The Data Stick to check. + * @return Does this have a Recipe Hash String at all? + */ + public static boolean doesDataStickHaveRecipeHash(ItemStack aDataStick) { + if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { + NBTTagCompound aNBT = aDataStick.getTagCompound(); + return aNBT.hasKey("Data.Recipe.Hash") && !aNBT.getString("Data.Recipe.Hash") + .equals("Hash.0"); + } + return false; + } + + /** + * Get the Output ItemStack from a Data Stick. + * + * @param aDataStick - The Data Stick to check. + * @return Output ItemStack contained on the Data Stick. + */ + public static ItemStack getDataStickOutput(ItemStack aDataStick) { + if (doesDataStickHaveOutput(aDataStick)) { + return GTUtility.loadItem(aDataStick.getTagCompound(), "output"); + } + return null; + } + + /** + * @param aDataStick - The Data Stick to process. + * @return The stored Recipe Hash String on the Data Stick, will return an invalid Hash if one is not found. + *

+ * The hash will be guaranteed to pass isValidHash(). + *

+ * Will not return Null. + */ + public static String getHashFromDataStack(ItemStack aDataStick) { + if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { + NBTTagCompound aNBT = aDataStick.getTagCompound(); + if (aNBT.hasKey("Data.Recipe.Hash", NBT.TAG_STRING)) { + String hash = aNBT.getString("Data.Recipe.Hash"); + if (isValidHash(hash)) return hash; + } + } + return "Invalid.Recipe.Hash"; + } + + /** + * + * @param aDataStick - The Data Stick to update. + * @param aRecipeHash - The Recipe Hash String to update with. + * @return Did we update the Recipe Hash String on the Data Stick? + */ + public static boolean setRecipeHashOnDataStick(ItemStack aDataStick, String aRecipeHash) { + if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { + NBTTagCompound aNBT = aDataStick.getTagCompound(); + aNBT.setString("Data.Recipe.Hash", aRecipeHash); + aDataStick.setTagCompound(aNBT); + return true; + } + return false; + } + + /** + * + * @param aDataStick - The Data Stick to update. + * @param aNewRecipe - The New GTRecipe_AssemblyLine recipe to update it with. + * @return Did we set the new recipe data & Recipe Hash String on the Data Stick? + */ + public static boolean setAssemblyLineRecipeOnDataStick(ItemStack aDataStick, + GTRecipe.RecipeAssemblyLine aNewRecipe) { + return setAssemblyLineRecipeOnDataStick(aDataStick, aNewRecipe, true); + } + + public static boolean setAssemblyLineRecipeOnDataStick(ItemStack aDataStick, GTRecipe.RecipeAssemblyLine aNewRecipe, + boolean setUpdateTime) { + if (isItemDataStick(aDataStick) && aNewRecipe.mOutput != null) { + String s = aNewRecipe.mOutput.getDisplayName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.lServerNames.get(aNewRecipe.mOutput.getDisplayName()); + if (s == null) { + s = aNewRecipe.mOutput.getDisplayName(); + } + } + + String aHash = generateRecipeHash(aNewRecipe); + if (GTValues.D1) { + GTRecipe.RecipeAssemblyLine aOldRecipe = findAssemblyLineRecipeFromDataStick(aDataStick, true).recipe; + GT_FML_LOGGER.info( + "Updating data stick: " + aDataStick.getDisplayName() + + " | Old Recipe Hash: " + + generateRecipeHash(aOldRecipe) + + ", New Recipe Hash: " + + aHash); + } + + String author = "Assembling Line Recipe Generator"; + String displayName = null; + if (aDataStick.hasTagCompound()) { + NBTTagCompound tag = aDataStick.getTagCompound(); + if (tag.hasKey("author", NBT.TAG_STRING)) { + author = tag.getString("author"); + } + if (tag.hasKey("display", NBT.TAG_COMPOUND)) { + NBTTagCompound displayTag = tag.getCompoundTag("display"); + if (displayTag.hasKey("Name", NBT.TAG_STRING)) displayName = displayTag.getString("Name"); + } + } + + // remove possible old NBTTagCompound + aDataStick.setTagCompound(new NBTTagCompound()); + if (displayName != null) aDataStick.setStackDisplayName(displayName); + if (GTValues.D1) { + GTUtility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data (" + aHash + ")"); + } else { + GTUtility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data"); + } + + NBTTagCompound tNBT = aDataStick.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + + tNBT.setTag("output", aNewRecipe.mOutput.writeToNBT(new NBTTagCompound())); + tNBT.setInteger("time", aNewRecipe.mDuration); + tNBT.setInteger("eu", aNewRecipe.mEUt); + tNBT.setString("author", author); + NBTTagList tNBTList = new NBTTagList(); + tNBTList.appendTag( + new NBTTagString( + "Construction plan for " + aNewRecipe.mOutput.stackSize + + " " + + s + + ". Needed EU/t: " + + aNewRecipe.mEUt + + " Production time: " + + (aNewRecipe.mDuration / 20))); + for (int i = 0; i < aNewRecipe.mInputs.length; i++) { + boolean hasSetOreDictAlt = false; + + if (aNewRecipe.mOreDictAlt[i] != null && aNewRecipe.mOreDictAlt[i].length > 0) { + tNBT.setInteger("a" + i, aNewRecipe.mOreDictAlt[i].length); + int count = 0; + StringBuilder tBuilder = new StringBuilder("Input Bus " + (i + 1) + ": "); + for (int j = 0; j < aNewRecipe.mOreDictAlt[i].length; j++) { + ItemStack tStack = aNewRecipe.mOreDictAlt[i][j]; + if (tStack != null) { + tNBT.setTag("a" + i + ":" + j, tStack.writeToNBT(new NBTTagCompound())); + + s = tStack.getDisplayName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.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())); + hasSetOreDictAlt = true; + } + } + + if (aNewRecipe.mInputs[i] != null) { + tNBT.setTag("" + i, aNewRecipe.mInputs[i].writeToNBT(new NBTTagCompound())); + + if (!hasSetOreDictAlt) { + s = aNewRecipe.mInputs[i].getDisplayName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.lServerNames.get(aNewRecipe.mInputs[i].getDisplayName()); + if (s == null) s = aNewRecipe.mInputs[i].getDisplayName(); + } + tNBTList.appendTag( + new NBTTagString( + "Input Bus " + (i + 1) + ": " + aNewRecipe.mInputs[i].stackSize + " " + s)); + } + } + } + for (int i = 0; i < aNewRecipe.mFluidInputs.length; i++) { + if (aNewRecipe.mFluidInputs[i] != null) { + tNBT.setTag("f" + i, aNewRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound())); + + s = aNewRecipe.mFluidInputs[i].getLocalizedName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.lServerNames.get(aNewRecipe.mFluidInputs[i].getLocalizedName()); + if (s == null) s = aNewRecipe.mFluidInputs[i].getLocalizedName(); + } + tNBTList.appendTag( + new NBTTagString( + "Input Hatch " + (i + 1) + ": " + aNewRecipe.mFluidInputs[i].amount + "L " + s)); + } + } + tNBT.setTag("pages", tNBTList); + if (setUpdateTime) tNBT.setLong("lastUpdate", System.currentTimeMillis()); + aDataStick.setTagCompound(tNBT); + // Set recipe hash + setRecipeHashOnDataStick(aDataStick, aHash); + return true; + } + return false; + } + + public enum LookupResultType { + + INVALID_STICK(true), + VALID_STACK_BUT_INVALID_RECIPE(true), + VALID_STACK_AND_VALID_RECIPE(false), + VALID_STACK_AND_VALID_HASH(false); + + private final boolean recipeNull; + private LookupResult singletonResult; + + LookupResultType(boolean recipeNull) { + this.recipeNull = recipeNull; + } + + public LookupResult getResult() { + if (!recipeNull) throw new IllegalArgumentException("This result type require a nonnull recipe"); + if (singletonResult == null) singletonResult = new LookupResult(null, this); + return singletonResult; + } + + public LookupResult getResult(GTRecipe.RecipeAssemblyLine recipe) { + if ((recipe == null) != recipeNull) + throw new IllegalArgumentException("This result type does not allow given input"); + return new LookupResult(recipe, this); + } + } + + public static class LookupResult { + + private final GTRecipe.RecipeAssemblyLine recipe; + private final LookupResultType type; + + LookupResult(GTRecipe.RecipeAssemblyLine recipe, LookupResultType type) { + this.recipe = recipe; + this.type = type; + } + + public GTRecipe.RecipeAssemblyLine getRecipe() { + return recipe; + } + + public LookupResultType getType() { + return type; + } + } +} diff --git a/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java b/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java index ac1601e846..822e2f036e 100644 --- a/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java +++ b/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java @@ -6,9 +6,8 @@ import java.util.List; import net.minecraftforge.fluids.FluidStack; -import com.github.bartimaeusnek.bartworks.system.material.Werkstoff; -import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader; - +import bartworks.system.material.Werkstoff; +import bartworks.system.material.WerkstoffLoader; import gregtech.api.enums.Materials; public class BlastFurnaceGasStat { diff --git a/src/main/java/gregtech/api/util/CircuitryBehavior.java b/src/main/java/gregtech/api/util/CircuitryBehavior.java new file mode 100644 index 0000000000..3859be590a --- /dev/null +++ b/src/main/java/gregtech/api/util/CircuitryBehavior.java @@ -0,0 +1,212 @@ +package gregtech.api.util; + +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.IRedstoneCircuitBlock; + +/** + * Redstone Circuit Control Code + *

+ * This should make everything possible what a Redstone Computer or BuildCraft Gate could do. It is intended to use this + * similar to BC-Gates (for acquiring Data) and RP Logic Gates. You could write an extremely specified and complex Logic + * Gate, which works only for you Setup, like with ComputerCraft, but you would have to write an extra Mod to add that, + * as it doesn't work Ingame. + *

+ * One can make use of the fact, that ItemStacks can be stored as Integer, so that you can scan Inventories for specific + * Items using that. Luckily the Buttons in the GUI enable Copy/Paste of ItemID+MetaData to Integer, including the + * WildCard Damage Value when you use rightclick to place it. You just need to use @GT_Utility.stackToInt(ItemStack + * aStack) to get it. + *

+ * All Functions run usually in a seperate try/catch Block, so that failed Logic won't crash the TileEntity. + */ +public abstract class CircuitryBehavior { + + /** + * @param aIndex 0 - 1023 are my own Indices, so use other Numbers! + */ + public CircuitryBehavior(int aIndex) { + GregTechAPI.sCircuitryBehaviors.put(aIndex, this); + } + + /** + * returns if there is Redstone applied to any of the valid Inputs (OR) + */ + public static boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { + return true; + } + } + } + return false; + } + + /** + * returns if there is Redstone applied to all the valid Inputs (AND) + */ + public static boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + if (aRedstoneCircuitBlock.getInputRedstone(side) == 0) { + return false; + } + } + } + return true; + } + + /** + * returns if there is Redstone applied to exactly one of the valid Inputs (XOR) + */ + public static boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + int tRedstoneAmount = 0; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { + tRedstoneAmount++; + } + } + } + return tRedstoneAmount == 1; + } + + /** + * returns the strongest incoming RS-Power + */ + public static byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + byte tRedstoneAmount = 0; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + tRedstoneAmount = (byte) Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); + } + } + return tRedstoneAmount; + } + + // region GUI Functions + + /** + * returns the weakest incoming non-zero RS-Power + */ + public static byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0; + byte tRedstoneAmount = 15; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) + tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); + } + } + return tRedstoneAmount; + } + + /** + * returns the weakest incoming RS-Power + */ + public static byte getWeakestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0; + byte tRedstoneAmount = 15; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); + } + } + return tRedstoneAmount; + } + + /** + * Initializes the Parameters of this Circuit, all Parameters have been set to 0 right before calling this + * + * @param aCircuitData, The Data Storage you can use (8 Slots) + * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself + */ + public abstract void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock); + + /** + * Validates the Parameters of this Circuit when a value has been changed by the GUI Also called right + * after @initParameters and when the Chunk reloads + * + * @param aCircuitData, The Data Storage you can use (8 Slots and only the first 4 are User definable) + * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself + */ + public abstract void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock); + + // endregion + + // region Utility Functions + + /** + * Called every tick if the Block has enough Energy and if the Block is Active + * + * @param aCircuitData, The Data Storage you can use (8 Slots) + * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself + */ + public abstract void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock); + + /** + * If the ItemStack should be displayed. Parameters are between 0 and 3. + */ + public abstract boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, + int aIndex); + + /** + * The Name of the Gate for the GUI + */ + @SideOnly(Side.CLIENT) + public abstract String getName(); + + /** + * The Description of the Gate for the GUI + */ + @SideOnly(Side.CLIENT) + public abstract String getDescription(); + + /** + * The Description of the Data Field for the GUI + */ + @SideOnly(Side.CLIENT) + public abstract String getDataDescription(int[] aCircuitData, int aCircuitDataIndex); + + /** + * How the Integer should be displayed in the GUI. null means, that it just displays as regular Number. + */ + @SideOnly(Side.CLIENT) + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + return null; + } + // endregion +} diff --git a/src/main/java/gregtech/api/util/ColorsMetadataSection.java b/src/main/java/gregtech/api/util/ColorsMetadataSection.java index fb9cc6dd56..7e420f3451 100644 --- a/src/main/java/gregtech/api/util/ColorsMetadataSection.java +++ b/src/main/java/gregtech/api/util/ColorsMetadataSection.java @@ -37,7 +37,7 @@ public class ColorsMetadataSection implements IMetadataSection { try { if (!hex.isEmpty()) colorValue = Integer.parseUnsignedInt(hex, 16); } catch (final NumberFormatException e) { - GT_Log.err.println("Couldn't format color correctly of " + key + " -> " + hex); + GTLog.err.println("Couldn't format color correctly of " + key + " -> " + hex); } intMap.put(key, colorValue); } diff --git a/src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java b/src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java index 389662d041..8eb91802cb 100644 --- a/src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java +++ b/src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java @@ -14,8 +14,8 @@ import com.google.gson.JsonSerializationContext; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; import gregtech.api.enums.Dyes; @SideOnly(Side.CLIENT) @@ -24,7 +24,7 @@ public class ColorsMetadataSectionSerializer extends BaseMetadataSectionSerializ public ColorsMetadataSection deserialize(JsonElement metadataColors, Type type, JsonDeserializationContext context) { // Default values - boolean enableGuiTint = GregTech_API.sColoredGUI; + boolean enableGuiTint = GregTechAPI.sColoredGUI; Map hexGuiTintMap = new HashMap<>(); Map hexTextColorMap = new HashMap<>(); @@ -39,7 +39,7 @@ public class ColorsMetadataSectionSerializer extends BaseMetadataSectionSerializ entry.getValue() .getAsString()); } else { - GT_Mod.GT_FML_LOGGER.warn("ColorOverride expects primitive value for key `textColor`"); + GTMod.GT_FML_LOGGER.warn("ColorOverride expects primitive value for key `textColor`"); } } } @@ -50,7 +50,7 @@ public class ColorsMetadataSectionSerializer extends BaseMetadataSectionSerializ .getJsonObjectBooleanFieldValueOrDefault(guiTints, "enableGuiTintWhenPainted", true); for (Dyes dye : Dyes.values()) { - hexGuiTintMap.put(dye.mName, GT_Util.toHexString(dye.getRGBA())); + hexGuiTintMap.put(dye.mName, GTUtil.toHexString(dye.getRGBA())); } for (String key : hexGuiTintMap.keySet()) { @@ -59,7 +59,7 @@ public class ColorsMetadataSectionSerializer extends BaseMetadataSectionSerializ key, JsonUtils.getJsonObjectStringFieldValueOrDefault(guiTints, key, hexGuiTintMap.get(key))); } else { - hexGuiTintMap.replace(key, GT_Util.toHexString(Dyes.dyeWhite.getRGBA())); + hexGuiTintMap.replace(key, GTUtil.toHexString(Dyes.dyeWhite.getRGBA())); } } } diff --git a/src/main/java/gregtech/api/util/CoverBehavior.java b/src/main/java/gregtech/api/util/CoverBehavior.java new file mode 100644 index 0000000000..7e6f1049e9 --- /dev/null +++ b/src/main/java/gregtech/api/util/CoverBehavior.java @@ -0,0 +1,402 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.E; + +import java.lang.ref.WeakReference; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; + +/** + * For Covers with a special behavior. Has fixed storage format of 4 byte. Not very convenient... + */ +public abstract class CoverBehavior extends CoverBehaviorBase { + + public boolean mPlayerNotified = false; + + public CoverBehavior() { + this(null); + } + + public CoverBehavior(ITexture coverTexture) { + super(ISerializableObject.LegacyCoverData.class, coverTexture); + } + + protected static int convert(ISerializableObject.LegacyCoverData data) { + return data == null ? 0 : data.get(); + } + + // region bridge the parent call to legacy calls + + @Override + public final ISerializableObject.LegacyCoverData createDataObject() { + return new ISerializableObject.LegacyCoverData(); + } + + @Override + public ISerializableObject.LegacyCoverData createDataObject(int aLegacyData) { + return new ISerializableObject.LegacyCoverData(aLegacyData); + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + return isRedstoneSensitive(side, aCoverID, aCoverVariable.get(), aTileEntity, aTimer); + } + + @Override + protected ISerializableObject.LegacyCoverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, + int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + if (aCoverVariable == null) aCoverVariable = new ISerializableObject.LegacyCoverData(); + aCoverVariable.set(doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable.get(), aTileEntity, aTimer)); + return aCoverVariable; + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + return onCoverRightclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ); + } + + @Override + protected ISerializableObject.LegacyCoverData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + if (aCoverVariable == null) aCoverVariable = new ISerializableObject.LegacyCoverData(); + aCoverVariable + .set(onCoverScrewdriverclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ)); + return aCoverVariable; + } + + @Override + protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer) { + return onCoverShiftRightclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer); + } + + @Override + protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, boolean aForced) { + return onCoverRemoval(side, aCoverID, convert(aCoverVariable), aTileEntity, aForced); + } + + @Override + protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + onBaseTEDestroyed(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected void onCoverUnloadImpl(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + onCoverUnload(aTileEntity); + } + + @Override + protected String getDescriptionImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return getDescription(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return getBlastProofLevel(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return letsRedstoneGoIn(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return letsRedstoneGoOut(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return letsEnergyIn(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return letsEnergyOut(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + return letsFluidIn(side, aCoverID, convert(aCoverVariable), aFluid, aTileEntity); + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + return letsFluidOut(side, aCoverID, convert(aCoverVariable), aFluid, aTileEntity); + } + + @Override + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { + return letsItemsIn(side, aCoverID, convert(aCoverVariable), aSlot, aTileEntity); + } + + @Override + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { + return letsItemsOut(side, aCoverID, convert(aCoverVariable), aSlot, aTileEntity); + } + + @Override + protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return isGUIClickable(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return manipulatesSidedRedstoneOutput(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return alwaysLookConnected(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return getRedstoneInput(side, aInputRedstone, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, + ICoverable aTileEntity) { + return getTickRate(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected byte getLensColorImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return getLensColor(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + @Override + protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return getDrop(side, aCoverID, convert(aCoverVariable), aTileEntity); + } + + // endregion + + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return true; + } + + /** + * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time. + */ + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return aCoverVariable; + } + + /** + * Called when someone rightclicks this Cover. + *

+ * return true, if something actually happens. + */ + public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + return false; + } + + /** + * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case. + *

+ * return the new Value of the Cover Variable + */ + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + return aCoverVariable; + } + + /** + * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case. + */ + public boolean onCoverShiftRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer) { + if (hasCoverGUI() && aPlayer instanceof EntityPlayerMP) { + lastPlayer = new WeakReference<>(aPlayer); + mPlayerNotified = false; + GTUIInfos.openCoverUI(aTileEntity, aPlayer, side); + return true; + } + return false; + } + + /** + * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is + * getting broken, only if you break the Cover away from the Machine. + */ + public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + return true; + } + + public void onCoverUnload(ICoverable aTileEntity) { + + } + + public void onBaseTEDestroyed(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {} + + /** + * Gives a small Text for the status of the Cover. + */ + public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return E; + } + + /** + * How Blast Proof the Cover is. 30 is normal. + */ + public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 10.0F; + } + + /** + * If it lets RS-Signals into the Block + *

+ * This is just Informative so that Machines know if their Redstone Input is blocked or not + */ + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + /** + * If it lets RS-Signals out of the Block + */ + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Energy into the Block + */ + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Energy out of the Block + */ + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not. + */ + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not. + */ + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no + * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each + * Slot). + */ + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no + * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each + * Slot). + */ + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets you rightclick the Machine normally + */ + public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + /** + * Needs to return true for Covers, which have a Redstone Output on their Facing. + */ + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + /** + * if this Cover should let Pipe Connections look connected even if it is not the case. + */ + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + /** + * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The + * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0. + */ + public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return letsRedstoneGoIn(side, aCoverID, aCoverVariable, aTileEntity) ? aInputRedstone : 0; + } + + /** + * Gets the Tick Rate for doCoverThings of the Cover + *

+ * 0 = No Ticks! Yes, 0 is Default, you have to override this + */ + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 0; + } + + /** + * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then). + */ + public byte getLensColor(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return -1; + } + + /** + * @return the ItemStack dropped by this Cover + */ + public ItemStack getDrop(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return GTOreDictUnificator.get(true, aTileEntity.getCoverItemAtSide(side)); + } +} diff --git a/src/main/java/gregtech/api/util/CoverBehaviorBase.java b/src/main/java/gregtech/api/util/CoverBehaviorBase.java new file mode 100644 index 0000000000..0c8ef81533 --- /dev/null +++ b/src/main/java/gregtech/api/util/CoverBehaviorBase.java @@ -0,0 +1,839 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.E; + +import java.lang.ref.WeakReference; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagInt; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.gui.GUIColorOverride; +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.gui.widgets.CoverTickRateButton; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.common.covers.CoverInfo; + +/** + * For Covers with a special behavior. + * + * @author glease + */ +public abstract class CoverBehaviorBase { + + public WeakReference lastPlayer = null; + private final Class typeToken; + private final ITexture coverFGTexture; + + protected CoverBehaviorBase(Class typeToken) { + this(typeToken, null); + } + + protected CoverBehaviorBase(Class typeToken, ITexture coverTexture) { + this.typeToken = typeToken; + this.coverFGTexture = coverTexture; + reloadColorOverride(); + } + + public void reloadColorOverride() { + this.colorOverride = GUIColorOverride.get(guiTexturePath); + } + + public abstract T createDataObject(int aLegacyData); + + public abstract T createDataObject(); + + public final T createDataObject(NBTBase aNBT) { + // Handle legacy data (migrating from GT_CoverBehavior to GT_CoverBehaviorBase) + if (aNBT instanceof NBTTagInt) { + return createDataObject(((NBTTagInt) aNBT).func_150287_d()); + } + + final T ret = createDataObject(); + ret.loadDataFromNBT(aNBT); + return ret; + } + + public final T cast(ISerializableObject aData) { + if (typeToken.isInstance(aData)) return forceCast(aData); + return null; + } + + private T forceCast(ISerializableObject aData) { + try { + return typeToken.cast(aData); + } catch (Exception e) { + throw new RuntimeException("Casting data in " + this.getClass() + ", data " + aData, e); + } + } + + // region facade + + /** + * Get target facade block. Does not affect rendering of **this** block. It is only used as a hint for other block + * in case of CTM + * + * @return null if none, otherwise return facade target block + */ + public final Block getFacadeBlock(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getFacadeBlockImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Get target facade block. Does not affect rendering of **this** block. It is only used as a hint for other block + * in case of CTM + * + * @return 0 if none, otherwise return facade target meta + */ + public final int getFacadeMeta(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getFacadeMetaImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Get the display stack. Default to {@code int2Stack(aCoverID)} + */ + public final ItemStack getDisplayStack(int aCoverID, ISerializableObject aCoverVariable) { + return getDisplayStackImpl(aCoverID, forceCast(aCoverVariable)); + } + + /** + * Get the special foreground cover texture associated with this cover. Return null if one should use the texture + * passed to {@link GregTechAPI#registerCover(ItemStack, ITexture, CoverBehaviorBase)} or its + * overloads. + */ + public final ITexture getSpecialCoverFGTexture(ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return getSpecialCoverFGTextureImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Get the special cover texture associated with this cover. Return null if one should use the texture passed to + * {@link GregTechAPI#registerCover(ItemStack, ITexture, CoverBehaviorBase)} or its overloads. + */ + public final ITexture getSpecialCoverTexture(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getSpecialCoverTextureImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Return whether cover data needs to be synced to client upon tile entity creation or cover placement. + *

+ * Note if you want to sync the data afterwards you will have to manually do it by calling + * {@link ICoverable#issueCoverUpdate(ForgeDirection)} This option only affects the initial sync. + */ + public final boolean isDataNeededOnClient(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return isDataNeededOnClientImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Called upon receiving data from network. Use {@link ICoverable#isClientSide()} to determine the side. + */ + public final void onDataChanged(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + onDataChangedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Called before receiving data from network. Use {@link ICoverable#isClientSide()} to determine the side. + */ + public final void preDataChanged(ForgeDirection side, int aCoverID, int aNewCoverId, + ISerializableObject aCoverVariable, ISerializableObject aNewCoverVariable, ICoverable aTileEntity) { + preDataChangedImpl( + side, + aCoverID, + aNewCoverId, + forceCast(aCoverVariable), + forceCast(aNewCoverVariable), + aTileEntity); + } + + /** + * Called upon cover being removed. Called on both server and client. + */ + public final void onDropped(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + onDroppedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + public final boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return isRedstoneSensitiveImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aTimer); + } + + /** + * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time. + */ + public final T doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity, long aTimer) { + return doCoverThingsImpl(side, aInputRedstone, aCoverID, forceCast(aCoverVariable), aTileEntity, aTimer); + } + + /** + * Called when someone rightclicks this Cover. + *

+ * return true, if something actually happens. + */ + public final boolean onCoverRightClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + return onCoverRightClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ); + } + + /** + * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case. + *

+ * return the new Value of the Cover Variable + */ + public final T onCoverScrewdriverClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + return onCoverScrewdriverClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ); + } + + /** + * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case. + */ + public final boolean onCoverShiftRightClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer) { + return onCoverShiftRightClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer); + } + + /** + * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is + * getting broken, only if you break the Cover away from the Machine. + */ + public final boolean onCoverRemoval(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity, boolean aForced) { + return onCoverRemovalImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aForced); + } + + /** + * Called upon Base TE being destroyed (once getDrops is called), thus getting called only when destroyed in + * survival. + */ + public final void onBaseTEDestroyed(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + onBaseTEDestroyedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Gives a small Text for the status of the Cover. + */ + public final String getDescription(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getDescriptionImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Called when Base TE being unloaded. + */ + public void onCoverUnload(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + onCoverUnloadImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * How Blast Proof the Cover is. 30 is normal. + */ + public final float getBlastProofLevel(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getBlastProofLevelImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * If it lets RS-Signals into the Block + *

+ * This is just Informative so that Machines know if their Redstone Input is blocked or not + */ + public final boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return letsRedstoneGoInImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * If it lets RS-Signals out of the Block + */ + public final boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return letsRedstoneGoOutImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * If it lets Energy into the Block + */ + public final boolean letsEnergyIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return letsEnergyInImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * If it lets Energy out of the Block + */ + public final boolean letsEnergyOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return letsEnergyOutImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not. + */ + public final boolean letsFluidIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + Fluid aFluid, ICoverable aTileEntity) { + return letsFluidInImpl(side, aCoverID, forceCast(aCoverVariable), aFluid, aTileEntity); + } + + /** + * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not. + */ + public final boolean letsFluidOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + Fluid aFluid, ICoverable aTileEntity) { + return letsFluidOutImpl(side, aCoverID, forceCast(aCoverVariable), aFluid, aTileEntity); + } + + /** + * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no + * reaction at all), aSlot = -2 means if it would accept for all Slots Impl(return true to skip the Checks for each + * Slot). + */ + public final boolean letsItemsIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return letsItemsInImpl(side, aCoverID, forceCast(aCoverVariable), aSlot, aTileEntity); + } + + /** + * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no + * reaction at all), aSlot = -2 means if it would accept for all Slots Impl(return true to skip the Checks for each + * Slot). + */ + public final boolean letsItemsOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return letsItemsOutImpl(side, aCoverID, forceCast(aCoverVariable), aSlot, aTileEntity); + } + + /** + * If it lets you rightclick the Machine normally + */ + public final boolean isGUIClickable(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return isGUIClickableImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Needs to return true for Covers, which have a Redstone Output on their Facing. + */ + public final boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return manipulatesSidedRedstoneOutputImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * if this Cover should let Pipe Connections look connected even if it is not the case. + */ + public final boolean alwaysLookConnected(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return alwaysLookConnectedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The + * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0. + */ + public final byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, + ISerializableObject aCoverVariable, ICoverable aTileEntity) { + return getRedstoneInputImpl(side, aInputRedstone, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Gets the Tick Rate for doCoverThings of the Cover + *

+ * 0 = No Ticks! Yes, 0 is Default, you have to override this + */ + public final int getTickRate(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getTickRateImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then). + */ + public final byte getLensColor(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getLensColorImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * @return the ItemStack dropped by this Cover + */ + public final ItemStack getDrop(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) { + return getDropImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); + } + + /** + * Called when the cover is initially attached to a machine. + * + * @param player The attaching player + * @param aCover An {@link ItemStack} containing the cover + * @param aTileEntity The machine receiving the cover + * @param side Which side the cover is attached to + */ + public void onPlayerAttach(EntityPlayer player, ItemStack aCover, ICoverable aTileEntity, ForgeDirection side) { + // Do nothing by default. + } + + // endregion + + // region UI stuff + + protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache(); + protected GUIColorOverride colorOverride; + private static final String guiTexturePath = "gregtech:textures/gui/GuiCover.png"; + + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new UIFactory(buildContext).createWindow(); + } + + /** + * Creates {@link ModularWindow} for this cover. This is separated from base class, as attaching the same covers in + * different sides of the same tile needs different UI with different context. + */ + protected class UIFactory { + + private final CoverUIBuildContext uiBuildContext; + + public UIFactory(CoverUIBuildContext buildContext) { + this.uiBuildContext = buildContext; + } + + public ModularWindow createWindow() { + ModularWindow.Builder builder = ModularWindow.builder(getGUIWidth(), getGUIHeight()); + builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); + builder.setGuiTint(getUIBuildContext().getGuiColorization()); + maybeBindPlayerInventory(builder); + addTitleToUI(builder); + addUIWidgets(builder); + if (getUIBuildContext().isAnotherWindow()) { + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(getGUIWidth() - 15, 3)); + } + + final CoverInfo coverInfo = uiBuildContext.getTile() + .getCoverInfoAtSide(uiBuildContext.getCoverSide()); + final CoverBehaviorBase behavior = coverInfo.getCoverBehavior(); + if (coverInfo.getMinimumTickRate() > 0 && behavior.allowsTickRateAddition()) { + builder.widget( + new CoverTickRateButton(coverInfo, builder).setPos(getGUIWidth() - 24, getGUIHeight() - 24)); + } + + return builder.build(); + } + + protected void maybeBindPlayerInventory(ModularWindow.Builder builder) { + if (doesBindPlayerInventory() && !getUIBuildContext().isAnotherWindow()) { + builder.bindPlayerInventory(getUIBuildContext().getPlayer(), 7, GUITextureSet.DEFAULT.getItemSlot()); + } + } + + /** + * Override this to add widgets for your UI. + */ + protected void addUIWidgets(ModularWindow.Builder builder) {} + + public CoverUIBuildContext getUIBuildContext() { + return uiBuildContext; + } + + /** + * Can return null when cover data is invalid e.g. tile is broken or cover is removed + */ + @Nullable + public T getCoverData() { + if (isCoverValid()) { + return forceCast( + getUIBuildContext().getTile() + .getComplexCoverDataAtSide(getUIBuildContext().getCoverSide())); + } else { + return null; + } + } + + public boolean setCoverData(T data) { + if (isCoverValid()) { + getUIBuildContext().getTile() + .receiveCoverData( + getUIBuildContext().getCoverSide(), + getUIBuildContext().getCoverID(), + data, + getUIBuildContext().getPlayer() instanceof EntityPlayerMP + ? (EntityPlayerMP) getUIBuildContext().getPlayer() + : null); + return true; + } else { + return false; + } + } + + public boolean isCoverValid() { + return !getUIBuildContext().getTile() + .isDead() + && getUIBuildContext().getTile() + .getCoverBehaviorAtSideNew(getUIBuildContext().getCoverSide()) != GregTechAPI.sNoBehavior; + } + + protected void addTitleToUI(ModularWindow.Builder builder) { + ItemStack coverItem = GTUtility.intToStack(getUIBuildContext().getCoverID()); + if (coverItem != null) { + builder.widget( + new ItemDrawable(coverItem).asWidget() + .setPos(5, 5) + .setSize(16, 16)) + .widget( + new TextWidget(coverItem.getDisplayName()).setDefaultColor(COLOR_TITLE.get()) + .setPos(25, 9)); + } + } + + protected int getGUIWidth() { + return 176; + } + + protected int getGUIHeight() { + return 107; + } + + protected boolean doesBindPlayerInventory() { + return false; + } + + protected int getTextColorOrDefault(String textType, int defaultColor) { + return colorOverride.getTextColorOrDefault(textType, defaultColor); + } + + protected final Supplier COLOR_TITLE = () -> getTextColorOrDefault("title", 0x222222); + protected final Supplier COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x555555); + protected final Supplier COLOR_TEXT_WARN = () -> getTextColorOrDefault("text_warn", 0xff0000); + } + + // endregion + + // region impl + + protected Block getFacadeBlockImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return null; + } + + protected int getFacadeMetaImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return 0; + } + + protected ItemStack getDisplayStackImpl(int aCoverID, T aCoverVariable) { + return GTUtility.intToStack(aCoverID); + } + + protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return coverFGTexture; + } + + protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return null; + } + + protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + protected void onDataChangedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {} + + protected void preDataChangedImpl(ForgeDirection side, int aCoverID, int aNewCoverId, T aCoverVariable, + T aNewCoverVariable, ICoverable aTileEntity) {} + + protected void onDroppedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {} + + protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {} + + protected void onCoverUnloadImpl(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, + ICoverable aTileEntity) {} + + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return false; + } + + /** + * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time. + */ + protected T doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, T aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return aCoverVariable; + } + + /** + * Called when someone rightclicks this Cover. + *

+ * return true, if something actually happens. + */ + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + return false; + } + + /** + * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case. + *

+ * return the new Value of the Cover Variable + */ + protected T onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + return aCoverVariable; + } + + /** + * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case. + */ + protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer) { + if (hasCoverGUI() && aPlayer instanceof EntityPlayerMP) { + lastPlayer = new WeakReference<>(aPlayer); + GTUIInfos.openCoverUI(aTileEntity, aPlayer, side); + return true; + } + return false; + } + + /** + * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is + * getting broken, only if you break the Cover away from the Machine. + */ + protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + return true; + } + + /** + * Gives a small Text for the status of the Cover. + */ + protected String getDescriptionImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return E; + } + + /** + * How Blast Proof the Cover is. 30 is normal. + */ + protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return 10.0F; + } + + /** + * If it lets RS-Signals into the Block + *

+ * This is just Informative so that Machines know if their Redstone Input is blocked or not + */ + protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets RS-Signals out of the Block + */ + protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Energy into the Block + */ + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Energy out of the Block + */ + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not. + */ + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not. + */ + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no + * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each + * Slot). + */ + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no + * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each + * Slot). + */ + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return false; + } + + /** + * If it lets you rightclick the Machine normally + */ + protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return true; + } + + /** + * Needs to return true for Covers, which have a Redstone Output on their Facing. + */ + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + /** + * if this Cover should let Pipe Connections look connected even if it is not the case. + */ + protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + /** + * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The + * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0. + */ + protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, T aCoverVariable, + ICoverable aTileEntity) { + return letsRedstoneGoIn(side, aCoverID, aCoverVariable, aTileEntity) ? aInputRedstone : 0; + } + + /** + * Gets the Tick Rate for doCoverThings of the Cover + *

+ * 0 = No Ticks! Yes, 0 is Default, you have to override this + */ + protected int getTickRateImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return 0; + } + + /** + * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then). + */ + protected byte getLensColorImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return -1; + } + + /** + * @return the ItemStack dropped by this Cover + */ + protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return GTOreDictUnificator.get(true, aTileEntity.getCoverItemAtSide(side)); + } + + // endregion + + // region no data + + /** + * Checks if the Cover can be placed on this. + */ + public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { + return true; + } + + public boolean hasCoverGUI() { + return false; + } + + /** + * Called when someone rightclicks this Cover Client Side + *

+ * return true, if something actually happens. + */ + public boolean onCoverRightclickClient(ForgeDirection side, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + return false; + } + + /** + * If this is a simple Cover, which can also be used on Bronze Machines and similar. + */ + public boolean isSimpleCover() { + return false; + } + + /** + * sets the Cover upon placement. + */ + public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) { + aTileEntity.setCoverIDAtSide(side, GTUtility.stackToInt(aCover)); + } + + public boolean allowsCopyPasteTool() { + return true; + } + + public boolean allowsTickRateAddition() { + return true; + } + + @NotNull + public final List getAdditionalTooltip(ISerializableObject coverData) { + return getAdditionalTooltipImpl(forceCast(coverData)); + } + + /** + * Override to add to the tooltip generated when a user hovers over the cover on the left side of a machine's UI. + * + * @param coverData The cover data associated with the cover on a particular side. + * @return A list of new tooltip entries. Entries are inserted at the top, just after the name and direction line. + */ + protected List getAdditionalTooltipImpl(T coverData) { + return ImmutableList.of(); + } + // endregion +} diff --git a/src/main/java/gregtech/api/util/ExoticEnergyInputHelper.java b/src/main/java/gregtech/api/util/ExoticEnergyInputHelper.java new file mode 100644 index 0000000000..6640f03835 --- /dev/null +++ b/src/main/java/gregtech/api/util/ExoticEnergyInputHelper.java @@ -0,0 +1,103 @@ +package gregtech.api.util; + +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatch; +import tectech.thing.metaTileEntity.hatch.MTEHatchEnergyMulti; +import tectech.thing.metaTileEntity.hatch.MTEHatchEnergyTunnel; + +public class ExoticEnergyInputHelper { + + /** + * The Valid Types of TecTech Hatch List. + */ + private static final List> sExoticEnergyHatchType = new ArrayList<>(); + + static { + register(MTEHatchEnergyMulti.class); + register(MTEHatchEnergyTunnel.class); + } + + public static void register(Class clazz) { + if (!MTEHatch.class.isAssignableFrom(clazz)) + throw new IllegalArgumentException(clazz.getName() + " is not a subclass of " + MTEHatch.class.getName()); + sExoticEnergyHatchType.add(clazz); + } + + public static boolean drainEnergy(long aEU, Collection hatches) { + for (MTEHatch tHatch : hatches) { + long tDrain = Math.min( + tHatch.getBaseMetaTileEntity() + .getStoredEU(), + aEU); + tHatch.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(tDrain, false); + aEU -= tDrain; + } + return aEU <= 0; + } + + public static boolean isExoticEnergyInput(IMetaTileEntity aHatch) { + for (Class clazz : sExoticEnergyHatchType) { + if (clazz.isInstance(aHatch)) return true; + } + return false; + } + + public static long getTotalEuMulti(Collection hatches) { + long rEU = 0L; + for (MTEHatch tHatch : filterValidMTEs(hatches)) { + rEU += tHatch.getBaseMetaTileEntity() + .getInputVoltage() * tHatch.maxWorkingAmperesIn(); + } + return rEU; + } + + public static long getMaxInputVoltageMulti(Collection hatches) { + long rVoltage = 0; + for (MTEHatch tHatch : filterValidMTEs(hatches)) { + rVoltage += tHatch.getBaseMetaTileEntity() + .getInputVoltage(); + } + return rVoltage; + } + + public static long getAverageInputVoltageMulti(Collection hatches) { + long rVoltage = 0; + for (MTEHatch tHatch : filterValidMTEs(hatches)) { + rVoltage += tHatch.getBaseMetaTileEntity() + .getInputVoltage(); + } + if (hatches.isEmpty()) { + return 0; + } + return rVoltage / hatches.size(); + } + + public static long getMaxInputAmpsMulti(Collection hatches) { + long rAmp = 0; + for (MTEHatch tHatch : filterValidMTEs(hatches)) { + rAmp += tHatch.getBaseMetaTileEntity() + .getInputAmperage(); + } + return rAmp; + } + + public static long getMaxWorkingInputAmpsMulti(Collection hatches) { + long rAmp = 0; + for (MTEHatch tHatch : filterValidMTEs(hatches)) { + rAmp += tHatch.maxWorkingAmperesIn(); + } + return rAmp; + } + + public static List> getAllClasses() { + return Collections.unmodifiableList(sExoticEnergyHatchType); + } +} diff --git a/src/main/java/gregtech/api/util/FishPondFakeRecipe.java b/src/main/java/gregtech/api/util/FishPondFakeRecipe.java index b5bfff9e29..8f36600e2a 100644 --- a/src/main/java/gregtech/api/util/FishPondFakeRecipe.java +++ b/src/main/java/gregtech/api/util/FishPondFakeRecipe.java @@ -1,6 +1,6 @@ package gregtech.api.util; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; import static gtPlusPlus.api.recipe.GTPPRecipeMaps.fishPondRecipes; import java.util.ArrayList; @@ -9,7 +9,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.WeightedRandomFishable; import net.minecraftforge.common.FishingHooks; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gtPlusPlus.api.objects.Logger; import gtPlusPlus.api.objects.data.AutoMap; import gtPlusPlus.core.util.minecraft.ItemUtils; @@ -50,8 +50,8 @@ public class FishPondFakeRecipe { ItemStack t = (ItemStack) ReflectionUtils .getField(WeightedRandomFishable.class, "field_150711_b") .get(u); - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(mType)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(mType)) .itemOutputs(t) .duration(5 * SECONDS) .eut(0) diff --git a/src/main/java/gregtech/api/util/GTApiaryModifier.java b/src/main/java/gregtech/api/util/GTApiaryModifier.java new file mode 100644 index 0000000000..955b2e60f9 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTApiaryModifier.java @@ -0,0 +1,24 @@ +package gregtech.api.util; + +import net.minecraft.world.biome.BiomeGenBase; + +public class GTApiaryModifier { + + public float territory = 1f; + public float mutation = 1f; + public float lifespan = 1f; + public float production = 2f; + public float flowering = 1f; + public float geneticDecay = 1f; + public boolean isSealed = false; + public boolean isSelfLighted = false; + public boolean isSelfUnlighted = false; + public boolean isSunlightSimulated = false; + public boolean isAutomated = false; + public boolean isCollectingPollen = false; + public BiomeGenBase biomeOverride = null; + public float energy = 1f; + public float temperature = 0f; + public float humidity = 0f; + public int maxSpeed = 0; +} diff --git a/src/main/java/gregtech/api/util/GTApiaryUpgrade.java b/src/main/java/gregtech/api/util/GTApiaryUpgrade.java new file mode 100644 index 0000000000..5de373a57e --- /dev/null +++ b/src/main/java/gregtech/api/util/GTApiaryUpgrade.java @@ -0,0 +1,224 @@ +package gregtech.api.util; + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.biome.BiomeGenBase; + +import gregtech.api.enums.OrePrefixes; +import gregtech.common.items.MetaGeneratedItem03; + +/** + * Actual items are defined in {@link MetaGeneratedItem03} + */ +public enum GTApiaryUpgrade { + + speed1(UNIQUE_INDEX.SPEED_UPGRADE, 32200, 1, (mods, n) -> mods.maxSpeed = 1), + speed2(UNIQUE_INDEX.SPEED_UPGRADE, 32201, 1, (mods, n) -> mods.maxSpeed = 2), + speed3(UNIQUE_INDEX.SPEED_UPGRADE, 32202, 1, (mods, n) -> mods.maxSpeed = 3), + speed4(UNIQUE_INDEX.SPEED_UPGRADE, 32203, 1, (mods, n) -> mods.maxSpeed = 4), + speed5(UNIQUE_INDEX.SPEED_UPGRADE, 32204, 1, (mods, n) -> mods.maxSpeed = 5), + speed6(UNIQUE_INDEX.SPEED_UPGRADE, 32205, 1, (mods, n) -> mods.maxSpeed = 6), + speed7(UNIQUE_INDEX.SPEED_UPGRADE, 32206, 1, (mods, n) -> mods.maxSpeed = 7), + speed8(UNIQUE_INDEX.SPEED_UPGRADE, 32207, 1, (mods, n) -> mods.maxSpeed = 8), + speed8upgraded(UNIQUE_INDEX.SPEED_UPGRADE, 32208, 1, (mods, n) -> { + mods.maxSpeed = 8; + mods.production = 17.19926784f; + mods.energy *= 14.75; + }), + production(UNIQUE_INDEX.PRODUCTION_UPGRADE, 32209, 8, (mods, n) -> { + mods.production = 4.f * (float) Math.pow(1.2d, n); + mods.energy *= Math.pow(1.4f, n); + }), + plains(UNIQUE_INDEX.PLAINS_UPGRADE, 32210, 1, (mods, n) -> { + mods.biomeOverride = BiomeGenBase.plains; + mods.energy *= 1.2f; + }), + light(UNIQUE_INDEX.LIGHT_UPGRADE, 32211, 1, (mods, n) -> { + mods.isSelfLighted = true; + mods.energy *= 1.05f; + }), + flowering(UNIQUE_INDEX.FLOWERING_UPGRADE, 32212, 8, (mods, n) -> { + mods.flowering *= Math.pow(1.2f, n); + mods.energy *= Math.pow(1.1f, n); + }), + winter(UNIQUE_INDEX.WINTER_UPGRADE, 32213, 1, (mods, n) -> { + mods.biomeOverride = BiomeGenBase.taiga; + mods.energy *= 1.5f; + }), + dryer(UNIQUE_INDEX.DRYER_UPGRADE, 32214, 16, (mods, n) -> { + mods.humidity -= 0.125f * n; + mods.energy *= Math.pow(1.025f, n); + }), + automation(UNIQUE_INDEX.AUTOMATION_UPGRADE, 32215, 1, (mods, n) -> { + mods.isAutomated = true; + mods.energy *= 1.1f; + }), + humidifier(UNIQUE_INDEX.HUMIDIFIER_UPGRADE, 32216, 16, (mods, n) -> { + mods.humidity += 0.125f * n; + mods.energy *= Math.pow(1.05f, n); + }), + hell(UNIQUE_INDEX.HELL_UPGRADE, 32217, 1, (mods, n) -> { + mods.biomeOverride = BiomeGenBase.hell; + mods.energy *= 1.5f; + }), + pollen(UNIQUE_INDEX.POLLEN_UPGRADE, 32218, 1, (mods, n) -> { + mods.flowering = 0f; + mods.energy *= 1.3f; + }), + desert(UNIQUE_INDEX.DESERT_UPGRADE, 32219, 1, (mods, n) -> { + mods.biomeOverride = BiomeGenBase.desert; + mods.energy *= 1.2f; + }), + cooler(UNIQUE_INDEX.COOLER_UPGRADE, 32220, 16, (mods, n) -> { + mods.temperature -= 0.125f * n; + mods.energy *= Math.pow(1.025f, n); + }), + lifespan(UNIQUE_INDEX.LIFESPAN_UPGRADE, 32221, 4, (mods, n) -> { + mods.lifespan /= Math.pow(1.5f, n); + mods.energy *= Math.pow(1.05f, n); + }), + seal(UNIQUE_INDEX.SEAL_UPGRADE, 32222, 1, (mods, n) -> { + mods.isSealed = true; + mods.energy *= 1.05f; + }), + stabilizer(UNIQUE_INDEX.STABILIZER_UPGRADE, 32223, 1, (mods, n) -> { + mods.geneticDecay = 0f; + mods.energy *= 2.50f; + }), + jungle(UNIQUE_INDEX.JUNGLE_UPGRADE, 32224, 1, (mods, n) -> { + mods.biomeOverride = BiomeGenBase.jungle; + mods.energy *= 1.20f; + }), + territory(UNIQUE_INDEX.TERRITORY_UPGRADE, 32225, 4, (mods, n) -> { + mods.territory *= Math.pow(1.5f, n); + mods.energy *= Math.pow(1.05f, n); + }), + ocean(UNIQUE_INDEX.OCEAN_UPGRADE, 32226, 1, (mods, n) -> { + mods.biomeOverride = BiomeGenBase.ocean; + mods.energy *= 1.20f; + }), + sky(UNIQUE_INDEX.SKY_UPGRADE, 32227, 1, (mods, n) -> { + mods.isSunlightSimulated = true; + mods.energy *= 1.05f; + }), + heater(UNIQUE_INDEX.HEATER_UPGRADE, 32228, 16, (mods, n) -> { + mods.temperature += 0.125f * n; + mods.energy *= Math.pow(1.025f, n); + }), + sieve(UNIQUE_INDEX.SIEVE_UPGRADE, 32229, 1, (mods, n) -> { + mods.isCollectingPollen = true; + mods.energy *= 1.05f; + }), + unlight(UNIQUE_INDEX.LIGHT_UPGRADE, 32231, 1, (mods, n) -> { + mods.isSelfUnlighted = true; + mods.energy *= 1.05f; + }),; + + private enum UNIQUE_INDEX { + + SPEED_UPGRADE, + PRODUCTION_UPGRADE, + PLAINS_UPGRADE, + LIGHT_UPGRADE, // also unlight + FLOWERING_UPGRADE, + WINTER_UPGRADE, + DRYER_UPGRADE, + AUTOMATION_UPGRADE, + HUMIDIFIER_UPGRADE, + HELL_UPGRADE, + POLLEN_UPGRADE, + DESERT_UPGRADE, + COOLER_UPGRADE, + LIFESPAN_UPGRADE, + SEAL_UPGRADE, + STABILIZER_UPGRADE, + JUNGLE_UPGRADE, + TERRITORY_UPGRADE, + OCEAN_UPGRADE, + SKY_UPGRADE, + HEATER_UPGRADE, + SIEVE_UPGRADE,; + + void apply(Consumer fn) { + UNIQUE_UPGRADE_LIST.get(this) + .forEach(fn); + } + } + + private static final EnumMap> UNIQUE_UPGRADE_LIST = new EnumMap<>( + UNIQUE_INDEX.class); + + private int meta = 0; + private int maxnumber = 1; + + private final GTUtility.ItemId id; + private final UNIQUE_INDEX unique_index; + private final BiConsumer applier; + + private final HashSet blacklistedUpgrades = new HashSet<>(); + + GTApiaryUpgrade(UNIQUE_INDEX unique_index, int meta, int maxnumber, BiConsumer applier) { + this.unique_index = unique_index; + this.meta = meta; + this.maxnumber = maxnumber; + this.applier = applier; + this.id = GTUtility.ItemId.createNoCopy(get(1)); + } + + private void setup_static_variables() { + quickLookup.put(this.meta, this); + ArrayList un = UNIQUE_UPGRADE_LIST.get(this.unique_index); + if (un != null) un.forEach((u) -> { + u.blacklistedUpgrades.add(this.id); + this.blacklistedUpgrades.add(u.id); + }); + else { + un = new ArrayList<>(1); + UNIQUE_UPGRADE_LIST.put(this.unique_index, un); + } + un.add(this); + } + + public static GTApiaryUpgrade getUpgrade(ItemStack s) { + if (s == null) return null; + if (!isUpgrade(s)) return null; + return quickLookup.get(s.getItemDamage()); + } + + public boolean isAllowedToWorkWith(ItemStack s) { + GTUtility.ItemId id = GTUtility.ItemId.createNoCopy(s); + return !blacklistedUpgrades.contains(id); + } + + public int getMaxNumber() { + return maxnumber; + } + + public void applyModifiers(GTApiaryModifier mods, ItemStack stack) { + if (applier != null) applier.accept(mods, stack.stackSize); + } + + public ItemStack get(int count) { + return new ItemStack(MetaGeneratedItem03.INSTANCE, count, meta); + } + + public static boolean isUpgrade(ItemStack s) { + return OrePrefixes.apiaryUpgrade.contains(s); + } + + private static final HashMap quickLookup = new HashMap<>(); + + static { + EnumSet.allOf(GTApiaryUpgrade.class) + .forEach(GTApiaryUpgrade::setup_static_variables); + speed8upgraded.blacklistedUpgrades.add(production.id); + production.blacklistedUpgrades.add(speed8upgraded.id); + } +} diff --git a/src/main/java/gregtech/api/util/GTBaseCrop.java b/src/main/java/gregtech/api/util/GTBaseCrop.java new file mode 100644 index 0000000000..2ddf37bbeb --- /dev/null +++ b/src/main/java/gregtech/api/util/GTBaseCrop.java @@ -0,0 +1,311 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.E; +import static gregtech.api.enums.Mods.IC2CropPlugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ConfigCategories; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.objects.ItemData; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; +import ic2.api.crops.CropCard; +import ic2.api.crops.Crops; +import ic2.api.crops.ICropTile; +import speiger.src.crops.api.ICropCardInfo; + +public class GTBaseCrop extends CropCard implements ICropCardInfo { + + public static ArrayList sCropList = new ArrayList<>(); + private String mName = E; + private String mDiscoveredBy = "Gregorius Techneticies"; + private String[] mAttributes; + private int mTier = 0; + private int mMaxSize = 0; + private int mAfterHarvestSize = 0; + private int mHarvestSize = 0; + private final int[] mStats = new int[5]; + private final int mGrowthSpeed = 0; + private ItemStack mDrop = null; + private ItemStack[] mSpecialDrops = null; + private Materials mBlock = null; + private static boolean bIc2NeiLoaded = IC2CropPlugin.isModLoaded(); + + /** + * To create new Crops + * + * @param aID Default ID + * @param aCropName Name of the Crop + * @param aDiscoveredBy The one who discovered the Crop + * @param aDrop The Item which is dropped by the Crop. must be != null + * @param aBaseSeed Baseseed to plant this Crop. null == crossbreed only + * @param aTier tier of the Crop. forced to be >= 1 + * @param aMaxSize maximum Size of the Crop. forced to be >= 3 + * @param aGrowthSpeed how fast the Crop grows. if < 0 then its set to Tier*300 + * @param aHarvestSize the size the Crop needs to be harvested. forced to be between 2 and max size + */ + public GTBaseCrop(int aID, String aCropName, String aDiscoveredBy, ItemStack aBaseSeed, int aTier, int aMaxSize, + int aGrowthSpeed, int aAfterHarvestSize, int aHarvestSize, int aStatChemical, int aStatFood, int aStatDefensive, + int aStatColor, int aStatWeed, String[] aAttributes, ItemStack aDrop, ItemStack[] aSpecialDrops) { + new GTBaseCrop( + aID, + aCropName, + aDiscoveredBy, + aBaseSeed, + aTier, + aMaxSize, + aGrowthSpeed, + aAfterHarvestSize, + aHarvestSize, + aStatChemical, + aStatFood, + aStatDefensive, + aStatColor, + aStatWeed, + aAttributes, + null, + aDrop, + aSpecialDrops); + } + + /** + * To create new Crops + * + * @param aID Default ID + * @param aCropName Name of the Crop + * @param aDiscoveredBy The one who discovered the Crop + * @param aDrop The Item which is dropped by the Crop. must be != null + * @param aBaseSeed Baseseed to plant this Crop. null == crossbreed only + * @param aTier tier of the Crop. forced to be >= 1 + * @param aMaxSize maximum Size of the Crop. forced to be >= 3 + * @param aGrowthSpeed how fast the Crop grows. if < 0 then its set to Tier*300 + * @param aHarvestSize the size the Crop needs to be harvested. forced to be between 2 and max size + * @param aBlock the block below needed for crop to grow. If null no block needed + */ + public GTBaseCrop(int aID, String aCropName, String aDiscoveredBy, ItemStack aBaseSeed, int aTier, int aMaxSize, + int aGrowthSpeed, int aAfterHarvestSize, int aHarvestSize, int aStatChemical, int aStatFood, int aStatDefensive, + int aStatColor, int aStatWeed, String[] aAttributes, Materials aBlock, ItemStack aDrop, + ItemStack[] aSpecialDrops) { + mName = aCropName; + aID = GTConfig.addIDConfig(ConfigCategories.IDs.crops, mName.replaceAll(" ", "_"), aID); + if (aDiscoveredBy != null && !aDiscoveredBy.equals(E)) mDiscoveredBy = aDiscoveredBy; + if (aDrop != null && aID > 0 && aID < 256) { + mDrop = GTUtility.copyOrNull(aDrop); + mSpecialDrops = aSpecialDrops; + mTier = Math.max(1, aTier); + mMaxSize = Math.max(3, aMaxSize); + mHarvestSize = Math.min(Math.max(aHarvestSize, 2), mMaxSize); + mAfterHarvestSize = Math.min(Math.max(aAfterHarvestSize, 1), mMaxSize - 1); + mStats[0] = aStatChemical; + mStats[1] = aStatFood; + mStats[2] = aStatDefensive; + mStats[3] = aStatColor; + mStats[4] = aStatWeed; + mAttributes = aAttributes; + mBlock = aBlock; + if (!Crops.instance.registerCrop(this, aID)) + throw new GTItsNotMyFaultException("Make sure the Crop ID is valid!"); + if (aBaseSeed != null) Crops.instance.registerBaseSeed(aBaseSeed, this, 1, 1, 1, 1); + sCropList.add(this); + } + if (bIc2NeiLoaded) { + try { + Class.forName("speiger.src.crops.api.CropPluginAPI") + .getMethod("registerCropInfo", Class.forName("speiger.src.crops.api.ICropCardInfo")) + .invoke( + Class.forName("speiger.src.crops.api.CropPluginAPI") + .getField("instance"), + this); + } catch (IllegalAccessException | ClassNotFoundException | SecurityException | NoSuchMethodException + | NoSuchFieldException | InvocationTargetException | IllegalArgumentException ex) { + bIc2NeiLoaded = false; + } + } + } + + @Override + public byte getSizeAfterHarvest(ICropTile crop) { + return (byte) mAfterHarvestSize; + } + + @Override + public int growthDuration(ICropTile aCrop) { + if (mGrowthSpeed < 200) return super.growthDuration(aCrop); + return tier() * mGrowthSpeed; + } + + @Override + public int getrootslength(ICropTile crop) { + return 5; + } + + @Override + public String[] attributes() { + return mAttributes; + } + + @Override + public String discoveredBy() { + return mDiscoveredBy; + } + + @Override + public final boolean canGrow(ICropTile aCrop) { + // block check is only performed at the last stage of growth + if (this.needsBlockBelow() && aCrop.getSize() == mMaxSize - 1) { + return isBlockBelow(aCrop); + } + return aCrop.getSize() < maxSize(); + } + + @Override + public final boolean canBeHarvested(ICropTile aCrop) { + return aCrop.getSize() >= mHarvestSize; + } + + @Override + public boolean canCross(ICropTile aCrop) { + return aCrop.getSize() + 2 > maxSize(); + } + + @Override + public int stat(int n) { + if (n < 0 || n >= mStats.length) return 0; + return mStats[n]; + } + + @Override + public String name() { + return mName; + } + + @Override + public int tier() { + return mTier; + } + + @Override + public int maxSize() { + return mMaxSize; + } + + @Override + public ItemStack getGain(ICropTile aCrop) { + int tDrop = 0; + if (mSpecialDrops != null && (tDrop = java.util.concurrent.ThreadLocalRandom.current() + .nextInt(0, (mSpecialDrops.length * 2) + 2)) < mSpecialDrops.length && mSpecialDrops[tDrop] != null) { + return GTUtility.copyOrNull(mSpecialDrops[tDrop]); + } + return GTUtility.copyOrNull(mDrop); + } + + @Override + public boolean rightclick(ICropTile aCrop, EntityPlayer aPlayer) { + if (!canBeHarvested(aCrop)) return false; + return aCrop.harvest(aPlayer instanceof EntityPlayerMP); + } + + @Override + public int getOptimalHavestSize(ICropTile crop) { + return maxSize(); + } + + /** + * Checks if the crop needs a block below it + * + * @return True if the crop needs a block below it to grow to its max size + */ + public boolean needsBlockBelow() { + return GTMod.gregtechproxy.mCropNeedBlock && this.mBlock != null; + } + + public boolean isBlockBelow(ICropTile aCrop) { + if (aCrop == null) { + return false; + } + for (int i = 1; i < this.getrootslength(aCrop); i++) { + Block tBlock = aCrop.getWorld() + .getBlock(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ); + if ((tBlock instanceof BlockOresAbstract)) { + TileEntity tTileEntity = aCrop.getWorld() + .getTileEntity(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ); + if ((tTileEntity instanceof TileEntityOres)) { + Materials tMaterial = GregTechAPI.sGeneratedMaterials[(((TileEntityOres) tTileEntity).mMetaData + % 1000)]; + if ((tMaterial != null) && (tMaterial != Materials._NULL)) { + return tMaterial == mBlock; + } + } + } else { + int tMetaID = aCrop.getWorld() + .getBlockMetadata(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ); + if (isBlockBelow(new ItemStack(tBlock, 1, tMetaID))) { + return true; + } + } + } + return false; + } + + /** + * An isolated function to check if an item stack is a block that should be below this crop + * + * @param aItem a stack of the block placed under the crop + * @return The result of the check + */ + public boolean isBlockBelow(ItemStack aItem) { + // safety in case someone calls this without checking if we have a block + if (!this.needsBlockBelow()) return true; + + // get material from stack + ItemData tAssociation = GTOreDictUnificator.getAssociation(aItem); + if (tAssociation == null) return false; + + // return true if it's an ore of the material + // note: some ores don't appear to have associations in testing, naq ore is an example of that + if (tAssociation.mPrefix.toString() + .startsWith("ore") && tAssociation.mMaterial.mMaterial == mBlock) { + return true; + } + + // return true if it's a block of the material + if (tAssociation.mPrefix == OrePrefixes.block && tAssociation.mMaterial.mMaterial == mBlock) { + return true; + } + return false; + } + + @Override + public List getCropInformation() { + if (mBlock != null) { + ArrayList result = new ArrayList<>(1); + result.add( + String.format( + "Requires %s Ore or Block of %s as soil block to reach full growth.", + mBlock.mName, + mBlock.mName)); + return result; + } + return null; + } + + @Override + public ItemStack getDisplayItem() { + if (mSpecialDrops != null && mSpecialDrops[mSpecialDrops.length - 1] != null) { + return GTUtility.copyOrNull(mSpecialDrops[mSpecialDrops.length - 1]); + } + return GTUtility.copyOrNull(mDrop); + } +} diff --git a/src/main/java/gregtech/api/util/GTBlockMap.java b/src/main/java/gregtech/api/util/GTBlockMap.java new file mode 100644 index 0000000000..a5ac98d427 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTBlockMap.java @@ -0,0 +1,134 @@ +package gregtech.api.util; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiFunction; + +import net.minecraft.block.Block; + +import gnu.trove.map.TByteObjectMap; +import gnu.trove.map.hash.TByteObjectHashMap; + +public class GTBlockMap { + + public static final byte WILDCARD = -1; + private final ConcurrentHashMap> backing = new ConcurrentHashMap<>(); + private int size = 0; + + private TByteObjectMap getSubmap(Block block) { + return backing.computeIfAbsent(block, b -> new TByteObjectHashMap<>()); + } + + /** + * Associate a value with that union key + * + * @param block block + * @param meta meta + * @return old mapping, or null if that doesn't exist + */ + public V put(Block block, byte meta, V value) { + V v = getSubmap(block).put(meta, value); + if (v == null) size++; + return v; + } + + /** + * Associate a value with that union key ONLY IF there isn't a prior EXACT mapping + * + * @param block block + * @param meta meta + * @return old mapping, or null if that doesn't exist + */ + public V putIfAbsent(Block block, byte meta, V value) { + V v = getSubmap(block).putIfAbsent(meta, value); + if (v == null) size++; + return v; + } + + /** + * Associate a value with that union key ONLY IF there isn't a prior EXACT mapping + * + * @param block block + * @param meta meta + * @return old mapping, or null if that doesn't exist + */ + public V computeIfAbsent(Block block, byte meta, BiFunction function) { + TByteObjectMap submap = getSubmap(block); + V v = submap.get(meta); + if (v == null) { + v = function.apply(block, meta); + submap.put(meta, v); + size++; + } + return v; + } + + /** + * Contains an associated value + * + * @param block block + * @param meta meta + * @return current mapping OR wildcard of that mapping exists + */ + public boolean containsKey(Block block, byte meta) { + TByteObjectMap submap = backing.get(block); + if (submap == null) return false; + return submap.containsKey(meta) || submap.containsKey(WILDCARD); + } + + /** + * Get the associated value + * + * @param block block + * @param meta meta + * @return current mapping OR wildcard of that block. null if neither exists + */ + public V get(Block block, byte meta) { + TByteObjectMap submap = backing.get(block); + if (submap == null) return null; + V v = submap.get(meta); + if (v != null) return v; + return submap.get(WILDCARD); + } + + /** + * Remove a mapping + * + * @param block block + * @param meta meta + * @return old value, or null if none + */ + public V remove(Block block, byte meta) { + TByteObjectMap submap = backing.get(block); + if (submap == null) return null; + V v = submap.remove(meta); + if (v != null) { + size--; + if (submap.isEmpty()) backing.remove(block); + } + return v; + } + + /** + * Size of all mappings + * + * @return size + */ + public int size() { + return size; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + GTBlockMap that = (GTBlockMap) o; + + return backing.equals(that.backing); + } + + @Override + public int hashCode() { + return backing.hashCode(); + } +} diff --git a/src/main/java/gregtech/api/util/GTBlockSet.java b/src/main/java/gregtech/api/util/GTBlockSet.java new file mode 100644 index 0000000000..6c91193832 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTBlockSet.java @@ -0,0 +1,39 @@ +package gregtech.api.util; + +import net.minecraft.block.Block; + +public class GTBlockSet { + + private final GTBlockMap backing = new GTBlockMap<>(); + + public boolean add(Block block, byte meta) { + return backing.put(block, meta, this) != this; + } + + public boolean contains(Block block, byte meta) { + return backing.get(block, meta) == this; + } + + public boolean remove(Block block, byte meta) { + return backing.remove(block, meta) == this; + } + + public int size() { + return backing.size(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + GTBlockSet that = (GTBlockSet) o; + + return backing.equals(that.backing); + } + + @Override + public int hashCode() { + return backing.hashCode(); + } +} diff --git a/src/main/java/gregtech/api/util/GTCLSCompat.java b/src/main/java/gregtech/api/util/GTCLSCompat.java new file mode 100644 index 0000000000..823a7b850e --- /dev/null +++ b/src/main/java/gregtech/api/util/GTCLSCompat.java @@ -0,0 +1,157 @@ +package gregtech.api.util; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; + +import cpw.mods.fml.common.ProgressManager; +import gregtech.GTMod; +import gregtech.api.enums.Materials; +import gregtech.common.GTProxy; +import gregtech.loaders.postload.GTPostLoad; + +@SuppressWarnings("rawtypes, unchecked, deprecation") +public class GTCLSCompat { + + private static Class alexiilMinecraftDisplayer; + private static Class alexiilProgressDisplayer; + private static Class cpwProgressBar; + + private static Method getLastPercent; + private static Method displayProgress; + + private static Field isReplacingVanillaMaterials; + private static Field isRegisteringGTmaterials; + private static Field progressBarStep; + + static { + // CLS + try { + alexiilMinecraftDisplayer = Class.forName("alexiil.mods.load.MinecraftDisplayer"); + alexiilProgressDisplayer = Class.forName("alexiil.mods.load.ProgressDisplayer"); + } catch (ClassNotFoundException ex) { + GTMod.GT_FML_LOGGER.catching(ex); + } + + try { + cpwProgressBar = Class.forName("cpw.mods.fml.common.ProgressManager$ProgressBar"); + } catch (ClassNotFoundException ex) { + GTMod.GT_FML_LOGGER.catching(ex); + } + + Optional.ofNullable(alexiilMinecraftDisplayer) + .ifPresent(e -> { + try { + getLastPercent = e.getMethod("getLastPercent"); + isReplacingVanillaMaterials = e.getField("isReplacingVanillaMaterials"); + isRegisteringGTmaterials = e.getField("isRegisteringGTmaterials"); + } catch (NoSuchMethodException | NoSuchFieldException ex) { + GTMod.GT_FML_LOGGER.catching(ex); + } + }); + + Optional.ofNullable(alexiilProgressDisplayer) + .ifPresent(e -> { + try { + displayProgress = e.getMethod("displayProgress", String.class, float.class); + } catch (NoSuchMethodException ex) { + GTMod.GT_FML_LOGGER.catching(ex); + } + }); + + try { + progressBarStep = cpwProgressBar.getDeclaredField("step"); + progressBarStep.setAccessible(true); + } catch (NoSuchFieldException ex) { + GTMod.GT_FML_LOGGER.catching(ex); + } + } + + private GTCLSCompat() {} + + private static void registerAndReportProgression(String materialsType, Collection materials, + ProgressManager.ProgressBar progressBar, Function getName, Consumer action) { + int sizeStep = materials.size(); + final long progressionReportsEvery = 100; + final long bakingMsgEvery = 1000; + long nextProgressionReportAt = 0; + long nextBakingMsgAt = 0; + int currentStep = 0; + + for (T m : materials) { + long now = System.currentTimeMillis(); + + if (nextProgressionReportAt < now) { + nextProgressionReportAt = now + progressionReportsEvery; + String materialName = getName.apply(m) + .toString(); + try { + displayProgress.invoke(null, materialName, (float) currentStep / sizeStep); + } catch (IllegalAccessException | InvocationTargetException iae) { + GTMod.GT_FML_LOGGER.error("While updating progression", iae); + } + try { + progressBarStep.set(progressBar, currentStep); + } catch (IllegalAccessException iae) { + GTMod.GT_FML_LOGGER.error("While updating intermediate progression steps number", iae); + } + progressBar.step(materialName); + } + if (nextBakingMsgAt < now) { + nextBakingMsgAt = now + bakingMsgEvery; + GTMod.GT_FML_LOGGER + .info(String.format("%s - Baking: %d%%", materialsType, currentStep * 100 / sizeStep)); + } + action.accept(m); + currentStep += 1; + } + GTMod.GT_FML_LOGGER.info(String.format("%s - Baking: Done", materialsType)); + try { + progressBarStep.set(progressBar, currentStep); + } catch (IllegalAccessException iae) { + GTMod.GT_FML_LOGGER.error("While updating final progression steps number", iae); + } + } + + public static void stepMaterialsCLS(Collection mEvents, + ProgressManager.ProgressBar progressBar) throws IllegalAccessException { + try { + isRegisteringGTmaterials.set(null, true); + } catch (IllegalArgumentException | IllegalAccessException e) { + GTMod.GT_FML_LOGGER.catching(e); + } + registerAndReportProgression( + "GregTech materials", + mEvents, + progressBar, + m -> m.mMaterial, + GTProxy::registerRecipes); + ProgressManager.pop(progressBar); + isRegisteringGTmaterials.set(null, false); + } + + public static void doActualRegistrationCLS(ProgressManager.ProgressBar progressBar, + Set replacedVanillaItemsSet) { + try { + isReplacingVanillaMaterials.set(null, true); + } catch (IllegalArgumentException | IllegalAccessException e) { + GTMod.GT_FML_LOGGER.catching(e); + } + registerAndReportProgression( + "Vanilla materials", + replacedVanillaItemsSet, + progressBar, + m -> m.mDefaultLocalName, + GTPostLoad::doActualRegistration); + } + + public static void pushToDisplayProgress() throws InvocationTargetException, IllegalAccessException { + isReplacingVanillaMaterials.set(null, false); + displayProgress.invoke(null, "Post Initialization: loading GregTech", getLastPercent.invoke(null)); + } +} diff --git a/src/main/java/gregtech/api/util/GTChunkAssociatedData.java b/src/main/java/gregtech/api/util/GTChunkAssociatedData.java new file mode 100644 index 0000000000..7a81c715cb --- /dev/null +++ b/src/main/java/gregtech/api/util/GTChunkAssociatedData.java @@ -0,0 +1,494 @@ +package gregtech.api.util; + +import static gregtech.api.enums.Mods.GregTech; + +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.lang.ref.WeakReference; +import java.lang.reflect.Array; +import java.nio.file.AtomicMoveNotSupportedException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.WorldEvent; + +import org.apache.commons.io.FileUtils; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +/** + * A utility to save all kinds of data that is a function of any chunk. + *

+ * GregTech takes care of saving and loading the data from disk, and an efficient mechanism to locate it. Subclass only + * need to define the exact scheme of each element data (by overriding the three protected abstract method) + *

+ * Oh, there is no limit on how large your data is, though you'd not have the familiar NBT interface, but DataOutput + * should be reasonably common anyway. + *

+ * It should be noted this class is NOT thread safe. + *

+ * Element cannot be null. + *

+ * TODO: Implement automatic region unloading. + * + * @param data element type + * @author glease + */ +@ParametersAreNonnullByDefault +public abstract class GTChunkAssociatedData { + + private static final Map> instances = new ConcurrentHashMap<>(); + private static final int IO_PARALLELISM = Math.min( + 8, + Math.max( + 1, + Runtime.getRuntime() + .availableProcessors() * 2 + / 3)); + private static final ExecutorService IO_WORKERS = Executors.newWorkStealingPool(IO_PARALLELISM); + private static final Pattern FILE_PATTERN = Pattern.compile("(.+)\\.(-?\\d+)\\.(-?\\d+)\\.dat"); + + static { + // register event handler + new EventHandler(); + } + + protected final String mId; + protected final Class elementtype; + private final int regionLength; + private final int version; + private final boolean saveDefaults; + /** + * Data is stored as a `(world id -> (super region id -> super region data))` hash map. where super region's size is + * determined by regionSize. Here it is called super region, to not confuse with vanilla's regions. + */ + private final Map> masterMap = new ConcurrentHashMap<>(); + + /** + * Initialize this instance. + * + * @param aId An arbitrary, but globally unique identifier for what this data is + * @param elementType The class of this element type. Used to create arrays. + * @param regionLength The length of one super region. Each super region will contain + * {@code regionLength * regionLength} chunks + * @param version An integer marking the version of this data. Useful later when the data's serialized form + * changed. + */ + protected GTChunkAssociatedData(String aId, Class elementType, int regionLength, byte version, + boolean saveDefaults) { + if (regionLength * regionLength > Short.MAX_VALUE || regionLength <= 0) + throw new IllegalArgumentException("Region invalid: " + regionLength); + if (!IData.class.isAssignableFrom(elementType)) throw new IllegalArgumentException("Data type invalid"); + if (aId.contains(".")) throw new IllegalArgumentException("ID cannot contains dot"); + this.mId = aId; + this.elementtype = elementType; + this.regionLength = regionLength; + this.version = version; + this.saveDefaults = saveDefaults; + if (instances.putIfAbsent(aId, this) != null) + throw new IllegalArgumentException("Duplicate GT_ChunkAssociatedData: " + aId); + } + + private ChunkCoordIntPair getRegionID(int aChunkX, int aChunkZ) { + return new ChunkCoordIntPair(Math.floorDiv(aChunkX, regionLength), Math.floorDiv(aChunkZ, regionLength)); + } + + /** + * Get a reference to data of the chunk that tile entity is in. The returned reference should be mutable. + */ + public final T get(IGregTechTileEntity tileEntity) { + return get(tileEntity.getWorld(), tileEntity.getXCoord() >> 4, tileEntity.getZCoord() >> 4); + } + + public final T get(Chunk chunk) { + return get(chunk.worldObj, chunk.xPosition, chunk.zPosition); + } + + public final T get(World world, ChunkCoordIntPair coord) { + return get(world, coord.chunkXPos, coord.chunkZPos); + } + + public final T get(World world, int chunkX, int chunkZ) { + SuperRegion region = masterMap.computeIfAbsent(world.provider.dimensionId, ignored -> new ConcurrentHashMap<>()) + .computeIfAbsent(getRegionID(chunkX, chunkZ), c -> new SuperRegion(world, c)); + return region.get(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength)); + } + + protected final void set(World world, int chunkX, int chunkZ, T data) { + SuperRegion region = masterMap.computeIfAbsent(world.provider.dimensionId, ignored -> new ConcurrentHashMap<>()) + .computeIfAbsent(getRegionID(chunkX, chunkZ), c -> new SuperRegion(world, c)); + region.set(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength), data); + } + + protected final boolean isCreated(int dimId, int chunkX, int chunkZ) { + Map dimData = masterMap.getOrDefault(dimId, null); + if (dimData == null) return false; + + SuperRegion region = dimData.getOrDefault(getRegionID(chunkX, chunkZ), null); + if (region == null) return false; + + return region.isCreated(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength)); + } + + public void clear() { + if (GTValues.debugWorldData) { + long dirtyRegionCount = masterMap.values() + .stream() + .flatMap( + m -> m.values() + .stream()) + .filter(SuperRegion::isDirty) + .count(); + if (dirtyRegionCount > 0) GTLog.out.println( + "Clearing ChunkAssociatedData with " + dirtyRegionCount + " regions dirty. Data might have been lost!"); + } + masterMap.clear(); + } + + public void save() { + saveRegions( + masterMap.values() + .stream() + .flatMap( + m -> m.values() + .stream())); + } + + public void save(World world) { + Map map = masterMap.get(world.provider.dimensionId); + if (map != null) saveRegions( + map.values() + .stream()); + } + + private void saveRegions(Stream stream) { + stream.filter(SuperRegion::isDirty) + .map(c -> (Runnable) c::save) + .map(r -> CompletableFuture.runAsync(r, IO_WORKERS)) + .reduce(CompletableFuture::allOf) + .ifPresent(f -> { + try { + f.get(); + } catch (Exception e) { + GTLog.err.println("Data save error: " + mId); + e.printStackTrace(GTLog.err); + } + }); + } + + protected abstract void writeElement(DataOutput output, T element, World world, int chunkX, int chunkZ) + throws IOException; + + protected abstract T readElement(DataInput input, int version, World world, int chunkX, int chunkZ) + throws IOException; + + protected abstract T createElement(World world, int chunkX, int chunkZ); + + /** + * Clear all mappings, regardless of whether they are dirty + */ + public static void clearAll() { + for (GTChunkAssociatedData d : instances.values()) d.clear(); + } + + /** + * Save all mappings + */ + public static void saveAll() { + for (GTChunkAssociatedData d : instances.values()) d.save(); + } + + /** + * Load data for all chunks for a given world. Current data for that world will be discarded. If this is what you + * intended, call {@link #save(World)} beforehand. + *

+ * Be aware of the memory consumption though. + */ + protected void loadAll(World w) { + if (GTValues.debugWorldData && masterMap.containsKey(w.provider.dimensionId)) GTLog.err.println( + "Reloading ChunkAssociatedData " + mId + " for world " + w.provider.dimensionId + " discards old data!"); + if (!getSaveDirectory(w).isDirectory()) + // nothing to load... + return; + try (Stream stream = Files.list(getSaveDirectory(w).toPath())) { + Map worldData = stream.map(f -> { + Matcher matcher = FILE_PATTERN.matcher( + f.getFileName() + .toString()); + return matcher.matches() ? matcher : null; + }) + .filter(Objects::nonNull) + .filter(m -> mId.equals(m.group(1))) + .map( + m -> CompletableFuture.supplyAsync( + () -> new SuperRegion(w, Integer.parseInt(m.group(2)), Integer.parseInt(m.group(3))), + IO_WORKERS)) + .map(f -> { + try { + return f.get(); + } catch (Exception e) { + GTLog.err.println("Error loading region"); + e.printStackTrace(GTLog.err); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toMap(SuperRegion::getCoord, Function.identity())); + masterMap.put(w.provider.dimensionId, worldData); + } catch (IOException | UncheckedIOException e) { + GTLog.err.println("Error loading all region"); + e.printStackTrace(GTLog.err); + } + } + + protected File getSaveDirectory(World w) { + File base; + if (w.provider.getSaveFolder() == null) base = w.getSaveHandler() + .getWorldDirectory(); + else base = new File( + w.getSaveHandler() + .getWorldDirectory(), + w.provider.getSaveFolder()); + return new File(base, GregTech.ID); + } + + public interface IData { + + /** + * @return Whether the data is different from chunk default + */ + boolean isSameAsDefault(); + } + + protected final class SuperRegion { + + private final T[] data = createData(); + private final File backingStorage; + private final WeakReference world; + /** + * Be aware, this means region coord, not bottom-left chunk coord + */ + private final ChunkCoordIntPair coord; + + private SuperRegion(World world, int regionX, int regionZ) { + this.world = new WeakReference<>(world); + this.coord = new ChunkCoordIntPair(regionX, regionZ); + backingStorage = new File(getSaveDirectory(world), String.format("%s.%d.%d.dat", mId, regionX, regionZ)); + if (backingStorage.isFile()) load(); + } + + private SuperRegion(World world, ChunkCoordIntPair regionCoord) { + this.world = new WeakReference<>(world); + this.coord = regionCoord; + backingStorage = new File( + getSaveDirectory(world), + String.format("%s.%d.%d.dat", mId, regionCoord.chunkXPos, regionCoord.chunkZPos)); + if (backingStorage.isFile()) load(); + } + + @SuppressWarnings("unchecked") + private T[] createData() { + return (T[]) Array.newInstance(elementtype, regionLength * regionLength); + } + + public T get(int subRegionX, int subRegionZ) { + int index = getIndex(subRegionX, subRegionZ); + T datum = data[index]; + if (datum == null) { + World world = Objects.requireNonNull(this.world.get()); + T newElem = createElement( + world, + coord.chunkXPos * regionLength + subRegionX, + coord.chunkZPos * regionLength + subRegionZ); + data[index] = newElem; + return newElem; + } + return datum; + } + + public void set(int subRegionX, int subRegionZ, T data) { + this.data[getIndex(subRegionX, subRegionZ)] = data; + } + + public boolean isCreated(int subRegionX, int subRegionZ) { + return this.data[getIndex(subRegionX, subRegionZ)] != null; + } + + public ChunkCoordIntPair getCoord() { + return coord; + } + + private int getIndex(int subRegionX, int subRegionY) { + return subRegionX * regionLength + subRegionY; + } + + private int getChunkX(int index) { + return index / regionLength + coord.chunkXPos * regionLength; + } + + private int getChunkZ(int index) { + return index % regionLength + coord.chunkZPos * regionLength; + } + + public boolean isDirty() { + for (T datum : data) { + if (datum != null && !datum.isSameAsDefault()) return true; + } + return false; + } + + public void save() { + try { + save0(); + } catch (IOException e) { + GTLog.err.println("Error saving data " + backingStorage.getPath()); + e.printStackTrace(GTLog.err); + } + } + + private void save0() throws IOException { + // noinspection ResultOfMethodCallIgnored + backingStorage.getParentFile() + .mkdirs(); + File tmpFile = getTmpFile(); + World world = Objects.requireNonNull(this.world.get(), "Attempting to save region of another world!"); + try (DataOutputStream output = new DataOutputStream(new FileOutputStream(tmpFile))) { + int ptr = 0; + boolean nullRange = data[0] == null; + // write a magic byte as storage format version + output.writeByte(0); + // write a magic byte as data format version + output.writeByte(version); + output.writeBoolean(nullRange); + while (ptr < data.length) { + // work out how long is this range + int rangeStart = ptr; + while (ptr < data.length + && (data[ptr] == null || (!saveDefaults && data[ptr].isSameAsDefault())) == nullRange) ptr++; + // write range length + output.writeShort(ptr - rangeStart); + if (!nullRange) + // write element data + for (int i = rangeStart; i < ptr; i++) + writeElement(output, data[i], world, getChunkX(ptr), getChunkZ(ptr)); + // or not + nullRange = !nullRange; + } + } + // first try to replace the destination file + // since atomic operation, no need to keep the backup in place + try { + Files.move( + tmpFile.toPath(), + backingStorage.toPath(), + StandardCopyOption.REPLACE_EXISTING, + StandardCopyOption.ATOMIC_MOVE); + } catch (AtomicMoveNotSupportedException ignored) { + // in case some dumb system/jre combination would cause this + // or if **somehow** two file inside the same directory belongs two separate filesystem + FileUtils.copyFile(tmpFile, backingStorage); + } + } + + public void load() { + try { + loadFromFile(backingStorage); + } catch (IOException | RuntimeException e) { + GTLog.err.println("Primary storage file broken in " + backingStorage.getPath()); + e.printStackTrace(GTLog.err); + // in case the primary storage is broken + try { + loadFromFile(getTmpFile()); + } catch (IOException | RuntimeException e2) { + GTLog.err.println("Backup storage file broken in " + backingStorage.getPath()); + e2.printStackTrace(GTLog.err); + } + } + } + + private void loadFromFile(File file) throws IOException { + World world = Objects.requireNonNull(this.world.get(), "Attempting to load region of another world!"); + try (DataInputStream input = new DataInputStream(new FileInputStream(file))) { + byte b = input.readByte(); + if (b == 0) { + loadV0(input, world); + } else { + GTLog.err.printf("Unknown ChunkAssociatedData version %d\n", b); + } + } + } + + private void loadV0(DataInput input, World world) throws IOException { + int version = input.readByte(); + boolean nullRange = input.readBoolean(); + int ptr = 0; + while (ptr != data.length) { + int rangeEnd = ptr + input.readUnsignedShort(); + if (!nullRange) { + for (; ptr < rangeEnd; ptr++) { + data[ptr] = readElement(input, version, world, getChunkX(ptr), getChunkZ(ptr)); + } + } else { + Arrays.fill(data, ptr, rangeEnd, null); + ptr = rangeEnd; + } + nullRange = !nullRange; + } + } + + private File getTmpFile() { + return new File(backingStorage.getParentFile(), backingStorage.getName() + ".tmp"); + } + } + + public static class EventHandler { + + private EventHandler() { + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + public void onWorldSave(WorldEvent.Save e) { + for (GTChunkAssociatedData d : instances.values()) { + d.save(e.world); + } + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload e) { + for (GTChunkAssociatedData d : instances.values()) { + // there is no need to explicitly do a save here + // forge will send a WorldEvent.Save on server thread before this event is distributed + d.masterMap.remove(e.world.provider.dimensionId); + } + } + } +} diff --git a/src/main/java/gregtech/api/util/GTClientPreference.java b/src/main/java/gregtech/api/util/GTClientPreference.java new file mode 100644 index 0000000000..f265094ca3 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTClientPreference.java @@ -0,0 +1,43 @@ +package gregtech.api.util; + +import gregtech.common.config.client.ConfigPreference; +import gregtech.common.config.client.ConfigWaila; + +public class GTClientPreference { + + private final boolean mSingleBlockInitialFilter; + private final boolean mSingleBlockInitialMultiStack; + private final boolean mInputBusInitialFilter; + private final boolean wailaAverageNS; + + public GTClientPreference(boolean mSingleBlockInitialFilter, boolean mSingleBlockInitialMultiStack, + boolean mInputBusInitialFilter, boolean wailaAverageNS) { + this.mSingleBlockInitialFilter = mSingleBlockInitialFilter; + this.mSingleBlockInitialMultiStack = mSingleBlockInitialMultiStack; + this.mInputBusInitialFilter = mInputBusInitialFilter; + this.wailaAverageNS = wailaAverageNS; + } + + public GTClientPreference() { + this.mSingleBlockInitialFilter = ConfigPreference.singleBlockInitialFilter; + this.mSingleBlockInitialMultiStack = ConfigPreference.singleBlockInitialAllowMultiStack; + this.mInputBusInitialFilter = ConfigPreference.inputBusInitialFilter; + this.wailaAverageNS = ConfigWaila.wailaAverageNS; + } + + public boolean isSingleBlockInitialFilterEnabled() { + return mSingleBlockInitialFilter; + } + + public boolean isSingleBlockInitialMultiStackEnabled() { + return mSingleBlockInitialMultiStack; + } + + public boolean isInputBusInitialFilterEnabled() { + return mInputBusInitialFilter; + } + + public boolean isWailaAverageNSEnabled() { + return wailaAverageNS; + } +} diff --git a/src/main/java/gregtech/api/util/GTConfig.java b/src/main/java/gregtech/api/util/GTConfig.java new file mode 100644 index 0000000000..68ff810414 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTConfig.java @@ -0,0 +1,162 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.E; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; + +public class GTConfig implements Runnable { + + public static boolean troll = false; + + public static Configuration sConfigFileIDs; + public static Configuration cleanroomFile; + public static Configuration undergroundFluidsFile; + public final Configuration mConfig; + + public GTConfig(Configuration aConfig) { + mConfig = aConfig; + mConfig.load(); + mConfig.save(); + GregTechAPI.sAfterGTPreload.add(this); // in case of crash on startup + GregTechAPI.sAfterGTLoad.add(this); // in case of crash on startup + GregTechAPI.sAfterGTPostload.add(this); + if (GTValues.lateConfigSave) GregTechAPI.sFirstWorldTick.add(this); + } + + private static boolean shouldSave() { + return GTValues.lateConfigSave ? GTValues.worldTickHappened : GregTechAPI.sPostloadFinished; + } + + public static int addIDConfig(Object aCategory, String aName, int aDefault) { + if (GTUtility.isStringInvalid(aName)) return aDefault; + Property tProperty = sConfigFileIDs.get( + aCategory.toString() + .replaceAll("\\|", "."), + aName.replaceAll("\\|", "."), + aDefault); + int rResult = tProperty.getInt(aDefault); + sConfigFileIDs.save(); + return rResult; + } + + public static String getStackConfigName(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return E; + Object rName = GTOreDictUnificator.getAssociation(aStack); + if (rName != null) return rName.toString(); + try { + if (GTUtility.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 (GTUtility.isStringInvalid(aName)) return aDefault; + Property tProperty = mConfig.get( + aCategory.toString() + .replaceAll("\\|", "_"), + (aName + "_" + aDefault).replaceAll("\\|", "_"), + aDefault); + boolean rResult = tProperty.getBoolean(aDefault); + if (!tProperty.wasRead() && shouldSave()) mConfig.save(); + return rResult; + } + + public int get(Object aCategory, ItemStack aStack, int aDefault) { + return get(aCategory, getStackConfigName(aStack), aDefault); + } + + public int get(Object aCategory, String aName, int aDefault) { + if (GTUtility.isStringInvalid(aName)) return aDefault; + Property tProperty = mConfig.get( + aCategory.toString() + .replaceAll("\\|", "_"), + (aName + "_" + aDefault).replaceAll("\\|", "_"), + aDefault); + int rResult = tProperty.getInt(aDefault); + if (!tProperty.wasRead() && shouldSave()) mConfig.save(); + return rResult; + } + + public double get(Object aCategory, ItemStack aStack, double aDefault) { + return get(aCategory, getStackConfigName(aStack), aDefault); + } + + public double get(Object aCategory, String aName, double aDefault) { + if (GTUtility.isStringInvalid(aName)) return aDefault; + Property tProperty = mConfig.get( + aCategory.toString() + .replaceAll("\\|", "_"), + (aName + "_" + aDefault).replaceAll("\\|", "_"), + aDefault); + double rResult = tProperty.getDouble(aDefault); + if (!tProperty.wasRead() && shouldSave()) mConfig.save(); + return rResult; + } + + public String get(Object aCategory, ItemStack aStack, String aDefault) { + return get(aCategory, getStackConfigName(aStack), aDefault); + } + + public String get(Object aCategory, String aName, String aDefault) { + if (GTUtility.isStringInvalid(aName)) return aDefault; + Property tProperty = mConfig.get( + aCategory.toString() + .replaceAll("\\|", "_"), + (aName + "_" + aDefault).replaceAll("\\|", "_"), + aDefault); + String rResult = tProperty.getString(); + if (!tProperty.wasRead() && shouldSave()) mConfig.save(); + return rResult; + } + + public String[] get(Object aCategory, ItemStack aStack, String... aDefault) { + return get(aCategory, getStackConfigName(aStack), aDefault); + } + + public String[] get(Object aCategory, String aName, String... aDefault) { + if (GTUtility.isStringInvalid(aName)) return aDefault; + Property tProperty = mConfig.get( + aCategory.toString() + .replaceAll("\\|", "_"), + aName.replaceAll("\\|", "_"), + aDefault); + String[] rResult = tProperty.getStringList(); + if (!tProperty.wasRead() && GregTechAPI.sPostloadFinished) mConfig.save(); + return rResult; + } + + public String getWithValidValues(Object aCategory, String aName, String[] validValues, String aDefault) { + if (GTUtility.isStringInvalid(aName)) return aDefault; + Property tProperty = mConfig.get( + aCategory.toString() + .replaceAll("\\|", "_"), + aName.replaceAll("\\|", "_"), + aDefault, + null, + validValues); + String rResult = tProperty.getString(); + if (!tProperty.wasRead() && GregTechAPI.sPostloadFinished) mConfig.save(); + return rResult; + } + + @Override + public void run() { + mConfig.save(); + } +} diff --git a/src/main/java/gregtech/api/util/GTCreativeTab.java b/src/main/java/gregtech/api/util/GTCreativeTab.java new file mode 100644 index 0000000000..54d8877a83 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTCreativeTab.java @@ -0,0 +1,26 @@ +package gregtech.api.util; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.ItemList; + +public class GTCreativeTab extends CreativeTabs { + + public GTCreativeTab(String aName, String aLocalName) { + super("GregTech." + aName); + GTLanguageManager.addStringLocalization("itemGroup.GregTech." + aName, aLocalName); + } + + @Override + public ItemStack getIconItemStack() { + return ItemList.Tool_Cheat.get(1, new ItemStack(Blocks.iron_block, 1)); + } + + @Override + public Item getTabIconItem() { + return ItemList.Circuit_Integrated.getItem(); + } +} diff --git a/src/main/java/gregtech/api/util/GTFoodStat.java b/src/main/java/gregtech/api/util/GTFoodStat.java new file mode 100644 index 0000000000..51e8818f62 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTFoodStat.java @@ -0,0 +1,122 @@ +package gregtech.api.util; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; + +import gregtech.api.damagesources.GTDamageSources; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IFoodStat; +import gregtech.api.items.MetaBaseItem; + +public class GTFoodStat implements IFoodStat { + + private final int mFoodLevel; + private final int[] mPotionEffects; + private final float mSaturation; + private final EnumAction mAction; + private final ItemStack mEmptyContainer; + private final boolean mAlwaysEdible, mInvisibleParticles, mIsRotten; + private boolean mExplosive = false, mMilk = false; + + /** + * @param aFoodLevel Amount of Food in Half Bacon [0 - 20] + * @param aSaturation Amount of Saturation [0.0F - 1.0F] + * @param aAction The Action to be used. If this is null, it uses the Eating Action + * @param aEmptyContainer An empty Container (Optional) + * @param aAlwaysEdible If this Item is always edible, like Golden Apples or Potions + * @param aInvisibleParticles If the Particles of the Potion Effects are invisible + * @param aPotionEffects An Array of Potion Effects with %4==0 Elements as follows ID of a Potion Effect. 0 for + * none Duration of the Potion in Ticks Level of the Effect. [0, 1, 2] are for [I, II, + * III] The likelihood that this Potion Effect takes place upon being eaten [1 - 100] + */ + public GTFoodStat(int aFoodLevel, float aSaturation, EnumAction aAction, ItemStack aEmptyContainer, + boolean aAlwaysEdible, boolean aInvisibleParticles, boolean aIsRotten, int... aPotionEffects) { + mFoodLevel = aFoodLevel; + mSaturation = aSaturation; + mAction = aAction == null ? EnumAction.eat : aAction; + mPotionEffects = aPotionEffects; + mEmptyContainer = GTUtility.copyOrNull(aEmptyContainer); + mInvisibleParticles = aInvisibleParticles; + mAlwaysEdible = aAlwaysEdible; + mIsRotten = aIsRotten; + } + + public GTFoodStat setExplosive() { + mExplosive = true; + return this; + } + + public GTFoodStat setMilk() { + mMilk = true; + return this; + } + + @Override + public int getFoodLevel(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer) { + return mFoodLevel; + } + + @Override + public float getSaturation(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer) { + return mSaturation; + } + + @Override + public void onEaten(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer) { + aStack.stackSize--; + ItemStack tStack = GTOreDictUnificator.get(GTUtility.copyOrNull(mEmptyContainer)); + if (tStack != null && !aPlayer.inventory.addItemStackToInventory(tStack)) + aPlayer.dropPlayerItemWithRandomChoice(tStack, true); + + new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setIdentifier(SoundResource.RANDOM_BURP) + .setVolume(0.5F) + .setPitch(aPlayer.worldObj.rand.nextFloat() * 0.1F + 0.9F) + .setEntity(aPlayer) + .setWorld(aPlayer.worldObj) + .run(); + + if (!aPlayer.worldObj.isRemote) { + if (mMilk) { + aPlayer.curePotionEffects(new ItemStack(Items.milk_bucket, 1, 0)); + } + for (int i = 3; i < mPotionEffects.length; i += 4) { + if (aPlayer.worldObj.rand.nextInt(100) < mPotionEffects[i]) { + aPlayer.addPotionEffect( + new PotionEffect( + mPotionEffects[i - 3], + mPotionEffects[i - 2], + mPotionEffects[i - 1], + mInvisibleParticles)); + } + } + if (mExplosive) { + new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder().setSmoking(true) + .setFlaming(true) + .setStrength(4f) + .setPosition(aPlayer.posX, aPlayer.posY, aPlayer.posZ) + .setEntity(aPlayer) + .setWorld(aPlayer.worldObj) + .run(); + aPlayer.attackEntityFrom(GTDamageSources.getExplodingDamage(), Float.MAX_VALUE); + } + } + } + + @Override + public EnumAction getFoodAction(MetaBaseItem aItem, ItemStack aStack) { + return mAction; + } + + @Override + public boolean alwaysEdible(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer) { + return mAlwaysEdible; + } + + @Override + public boolean isRotten(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer) { + return mIsRotten; + } +} diff --git a/src/main/java/gregtech/api/util/GTForestryCompat.java b/src/main/java/gregtech/api/util/GTForestryCompat.java new file mode 100644 index 0000000000..379604205a --- /dev/null +++ b/src/main/java/gregtech/api/util/GTForestryCompat.java @@ -0,0 +1,193 @@ +package gregtech.api.util; + +import static gregtech.api.recipe.RecipeMaps.centrifugeNonCellRecipes; +import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes; +import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; + +import java.util.Map; + +import net.minecraft.item.ItemStack; + +import forestry.api.recipes.ICentrifugeRecipe; +import forestry.api.recipes.ISqueezerRecipe; +import forestry.api.recipes.RecipeManagers; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.recipe.RecipeMaps; + +public class GTForestryCompat { + + public static void populateFakeNeiRecipes() { + if (ItemList.FR_Bee_Drone.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Bee_Drone.getWildcard(1L)) + .itemOutputs(ItemList.FR_Bee_Drone.getWithName(1L, "Scanned Drone")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_Bee_Princess.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Bee_Princess.getWildcard(1L)) + .itemOutputs(ItemList.FR_Bee_Princess.getWithName(1L, "Scanned Princess")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_Bee_Queen.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Bee_Queen.getWildcard(1L)) + .itemOutputs(ItemList.FR_Bee_Queen.getWithName(1L, "Scanned Queen")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_Tree_Sapling.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Tree_Sapling.getWildcard(1L)) + .itemOutputs(ItemList.FR_Tree_Sapling.getWithName(1L, "Scanned Sapling")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_Butterfly.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Butterfly.getWildcard(1L)) + .itemOutputs(ItemList.FR_Butterfly.getWithName(1L, "Scanned Butterfly")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_Larvae.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Larvae.getWildcard(1L)) + .itemOutputs(ItemList.FR_Larvae.getWithName(1L, "Scanned Larvae")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_Serum.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Serum.getWildcard(1L)) + .itemOutputs(ItemList.FR_Serum.getWithName(1L, "Scanned Serum")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_Caterpillar.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_Caterpillar.getWildcard(1L)) + .itemOutputs(ItemList.FR_Caterpillar.getWithName(1L, "Scanned Caterpillar")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + if (ItemList.FR_PollenFertile.get(1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(ItemList.FR_PollenFertile.getWildcard(1L)) + .itemOutputs(ItemList.FR_PollenFertile.getWithName(1L, "Scanned Pollen")) + .fluidInputs(Materials.Honey.getFluid(100L)) + .duration(25 * SECONDS) + .eut(2) + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes); + } + } + + public static void transferCentrifugeRecipes() { + try { + for (ICentrifugeRecipe tRecipe : RecipeManagers.centrifugeManager.recipes()) { + Map outputs = tRecipe.getAllProducts(); + ItemStack[] tOutputs = new ItemStack[outputs.size()]; + int[] tChances = new int[outputs.size()]; + int i = 0; + for (Map.Entry entry : outputs.entrySet()) { + tChances[i] = (int) (entry.getValue() * 10000); + tOutputs[i] = entry.getKey() + .copy(); + i++; + } + GTValues.RA.stdBuilder() + .itemInputs(tRecipe.getInput()) + .itemOutputs(tOutputs) + .outputChances(tChances) + .duration(6 * SECONDS + 8 * TICKS) + .eut(5) + .addTo(centrifugeRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(tRecipe.getInput()) + .itemOutputs(tOutputs) + .outputChances(tChances) + .duration(6 * SECONDS + 8 * TICKS) + .eut(5) + .addTo(centrifugeNonCellRecipes); + } + } catch (Throwable e) { + if (GTValues.D1) { + e.printStackTrace(GTLog.err); + } + } + } + + public static void transferSqueezerRecipes() { + try { + for (ISqueezerRecipe tRecipe : RecipeManagers.squeezerManager.recipes()) { + if ((tRecipe.getResources().length == 1) && (tRecipe.getFluidOutput() != null) + && (tRecipe.getResources()[0] != null)) { + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); + recipeBuilder.itemInputs(tRecipe.getResources()[0]); + if (tRecipe.getRemnants() != null) { + recipeBuilder.itemOutputs(tRecipe.getRemnants()) + .outputChances((int) (tRecipe.getRemnantsChance() * 10000)); + } + recipeBuilder.fluidOutputs(tRecipe.getFluidOutput()) + .duration(1 * SECONDS + 12 * TICKS) + .eut(8) + .addTo(RecipeMaps.fluidExtractionRecipes); + } + } + } catch (Throwable e) { + if (GTValues.D1) { + e.printStackTrace(GTLog.err); + } + } + } +} diff --git a/src/main/java/gregtech/api/util/GTGCCompat.java b/src/main/java/gregtech/api/util/GTGCCompat.java new file mode 100644 index 0000000000..0491d0f9f4 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTGCCompat.java @@ -0,0 +1,52 @@ +package gregtech.api.util; + +import static gregtech.api.enums.Mods.GalacticraftCore; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +import micdoodle8.mods.galacticraft.api.power.EnergySource; +import micdoodle8.mods.galacticraft.api.power.EnergySource.EnergySourceAdjacent; +import micdoodle8.mods.galacticraft.api.power.IEnergyHandlerGC; +import micdoodle8.mods.galacticraft.api.transmission.NetworkType; +import micdoodle8.mods.galacticraft.api.transmission.tile.IConnector; +import micdoodle8.mods.galacticraft.core.energy.EnergyConfigHandler; + +public class GTGCCompat { + + public static long insertEnergyInto(TileEntity tTileEntity, long aVoltage, ForgeDirection tDirection) { + // GC Compat + if (GalacticraftCore.isModLoaded() && tTileEntity instanceof IEnergyHandlerGC) { + if (!(tTileEntity instanceof IConnector) + || ((IConnector) tTileEntity).canConnect(tDirection, NetworkType.POWER)) { + EnergySource eSource = new EnergySourceAdjacent(tDirection); + + float tSizeToReceive = aVoltage * EnergyConfigHandler.IC2_RATIO, + tStored = ((IEnergyHandlerGC) tTileEntity).getEnergyStoredGC(eSource); + if (tSizeToReceive >= tStored + || tSizeToReceive <= ((IEnergyHandlerGC) tTileEntity).getMaxEnergyStoredGC(eSource) - tStored) { + float tReceived = ((IEnergyHandlerGC) tTileEntity).receiveEnergyGC(eSource, tSizeToReceive, false); + if (tReceived > 0) { + tSizeToReceive -= tReceived; + while (tSizeToReceive > 0) { + tReceived = ((IEnergyHandlerGC) tTileEntity) + .receiveEnergyGC(eSource, tSizeToReceive, false); + if (tReceived < 1) break; + tSizeToReceive -= tReceived; + } + return 1; + } + } + } + return 0; + } + return 2; + } + + public static boolean canConnect(TileEntity tTileEntity, ForgeDirection tDirection) { + // GC Compat + return GalacticraftCore.isModLoaded() && tTileEntity instanceof IEnergyHandlerGC + && (!(tTileEntity instanceof IConnector) + || ((IConnector) tTileEntity).canConnect(tDirection, NetworkType.POWER)); + } +} diff --git a/src/main/java/gregtech/api/util/GTIBoxableWrapper.java b/src/main/java/gregtech/api/util/GTIBoxableWrapper.java new file mode 100644 index 0000000000..fcb7846a20 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTIBoxableWrapper.java @@ -0,0 +1,13 @@ +package gregtech.api.util; + +import net.minecraft.item.ItemStack; + +import ic2.api.item.IBoxable; + +public class GTIBoxableWrapper implements IBoxable { + + @Override + public boolean canBeStoredInToolbox(ItemStack itemstack) { + return GTUtility.isStackInList(itemstack, GTModHandler.sBoxableItems); + } +} diff --git a/src/main/java/gregtech/api/util/GTItsNotMyFaultException.java b/src/main/java/gregtech/api/util/GTItsNotMyFaultException.java new file mode 100644 index 0000000000..5d21fd2420 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTItsNotMyFaultException.java @@ -0,0 +1,18 @@ +package gregtech.api.util; + +public class GTItsNotMyFaultException extends RuntimeException { + + private static final long serialVersionUID = -8752778866486460495L; + + private final String mError; + + public GTItsNotMyFaultException(String aError) { + mError = aError; + } + + @Override + public String toString() { + return "The GregTech-Addon has a Problem.\nIT'S NOT MY FAULT!!! Below is how to fix it.\n" + mError + + "\nDO NOT COME TO ME WITH THIS CRASH. YOU CAUSED IT YOURSELF, AND I TOLD YOU HOW TO FIX IT!!!"; + } +} diff --git a/src/main/java/gregtech/api/util/GTLanguageManager.java b/src/main/java/gregtech/api/util/GTLanguageManager.java new file mode 100644 index 0000000000..d68b438027 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTLanguageManager.java @@ -0,0 +1,603 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.E; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; + +import cpw.mods.fml.common.registry.LanguageRegistry; +import cpw.mods.fml.relauncher.ReflectionHelper; +import gregtech.api.GregTechAPI; + +public class GTLanguageManager { + + /** + * Buffer to reduce memory allocation when injecting data to LanguageRegistry. + */ + private static final HashMap TEMPMAP = new HashMap<>(); + /** + * Buffer used when something is trying to add new lang entry while config file is not set up yet. + */ + public static final Map BUFFERMAP = new HashMap<>(); + /** + * Map containing all the translation data coming into this class. + */ + private static final Map LANGMAP = new HashMap<>(); + /** + * Config file handler bound to GregTech.lang or GregTech_(locale_name).lang. Even though it says English file, + * it's not necessarily English, but on system it's always treated as English (as in, "default" language.) + */ + public static Configuration sEnglishFile; + /** + * If the game is running with en_US language. This does not get updated when user changes language in game; + * GT lang system cannot handle that anyway. + */ + public static boolean isEN_US; + /** + * If placeholder like %material should be used for writing lang entries to file. + */ + public static boolean i18nPlaceholder = true; + /** + * If there's any lang entry that is not found on lang file and waiting to be written. + */ + private static boolean hasUnsavedEntry = false; + + // TODO: convert to enum + public static String FACE_ANY = "gt.lang.face.any", FACE_BOTTOM = "gt.lang.face.bottom", + FACE_TOP = "gt.lang.face.top", FACE_LEFT = "gt.lang.face.left", FACE_FRONT = "gt.lang.face.front", + FACE_RIGHT = "gt.lang.face.right", FACE_BACK = "gt.lang.face.back", FACE_NONE = "gt.lang.face.none"; + + public static String[] FACES = { FACE_BOTTOM, FACE_TOP, FACE_LEFT, FACE_FRONT, FACE_RIGHT, FACE_BACK, FACE_NONE }; + + /** + * Map referencing private field of StringTranslate, used by StatCollector. Used to inject lang entries there. + */ + private static final Map stringTranslateLanguageList; + + static { + try { + Field fieldStringTranslateLanguageList = ReflectionHelper + .findField(net.minecraft.util.StringTranslate.class, "languageList", "field_74816_c"); + Field fieldStringTranslateInstance = ReflectionHelper + .findField(net.minecraft.util.StringTranslate.class, "instance", "field_74817_a"); + // noinspection unchecked + stringTranslateLanguageList = (Map) fieldStringTranslateLanguageList + .get(fieldStringTranslateInstance.get(null)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @deprecated Parameter aWriteIntoLangFile is no longer used, + * use {@link #addStringLocalization(String, String)} or consider migrating to MC lang system instead. + */ + @Deprecated + public static synchronized String addStringLocalization(String aKey, String aEnglish, boolean aWriteIntoLangFile) { + return addStringLocalization(aKey, aEnglish); + } + + /** + * If you newly use this method, please consider using MC lang system instead. + */ + public static synchronized String addStringLocalization(String aKey, String aEnglish) { + String trimmedKey = aKey != null ? aKey.trim() : ""; + if (trimmedKey.isEmpty()) return E; // RIP cascading class loading, don't use GT_Utility here + if (sEnglishFile == null) { + // Lang file is not set up yet + BUFFERMAP.put(trimmedKey, aEnglish); + return aEnglish; + } + if (!BUFFERMAP.isEmpty()) { + // Lang file is now set up, resolve all the buffers + // This won't be visited twice + for (Entry tEntry : BUFFERMAP.entrySet()) { + storeTranslation(tEntry.getKey(), tEntry.getValue()); + } + BUFFERMAP.clear(); + } + + if (!LANGMAP.containsKey(trimmedKey)) { + return storeTranslation(trimmedKey, aEnglish); + } + return LANGMAP.get(trimmedKey); + } + + private static synchronized String storeTranslation(String trimmedKey, String english) { + String translation = writeToLangFile(trimmedKey, english); + LANGMAP.put(trimmedKey, translation); + addToMCLangList(trimmedKey, translation); + TEMPMAP.put(trimmedKey, translation); + LanguageRegistry.instance() + // If we use the actual user configured locale here, switching lang to others while running game + // turns everything into unlocalized string. So we make it "default" and call it a day. + .injectLanguage("en_US", TEMPMAP); + TEMPMAP.clear(); + return translation; + } + + private static synchronized String writeToLangFile(String trimmedKey, String aEnglish) { + Property tProperty = sEnglishFile.get("LanguageFile", trimmedKey, aEnglish); + if (hasUnsavedEntry && GregTechAPI.sPostloadFinished) { + sEnglishFile.save(); + hasUnsavedEntry = false; + } + String translation = tProperty.getString(); + if (tProperty.wasRead()) { + if (isEN_US && !aEnglish.equals(translation)) { + tProperty.set(aEnglish); + markFileDirty(); + return aEnglish; + } + } else { + markFileDirty(); + } + return translation; + } + + private static synchronized void markFileDirty() { + if (GregTechAPI.sPostloadFinished) { + sEnglishFile.save(); + } else { + hasUnsavedEntry = true; + } + } + + public static String getTranslation(String aKey) { + String tTrimmedKey = aKey != null ? aKey.trim() : ""; + if (tTrimmedKey.isEmpty()) return E; + + if (StatCollector.canTranslate(tTrimmedKey)) { + return StatCollector.translateToLocal(tTrimmedKey); + } + String anotherKeyToTry; + if (tTrimmedKey.endsWith(".name")) { + anotherKeyToTry = tTrimmedKey.substring(0, tTrimmedKey.length() - 5); + } else { + anotherKeyToTry = tTrimmedKey + ".name"; + } + if (StatCollector.canTranslate(anotherKeyToTry)) { + return StatCollector.translateToLocal(anotherKeyToTry); + } + return tTrimmedKey; + } + + public static String getTranslation(String aKey, String aSeperator) { + if (aKey == null) return E; + String rTranslation = E; + StringBuilder rTranslationSB = new StringBuilder(rTranslation); + for (String tString : aKey.split(aSeperator)) { + rTranslationSB.append(getTranslation(tString)); + } + rTranslation = String.valueOf(rTranslationSB); + return rTranslation; + } + + @SuppressWarnings("unused") + public static String getTranslateableItemStackName(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return "null"; + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT != null && tNBT.hasKey("display")) { + String tName = tNBT.getCompoundTag("display") + .getString("Name"); + if (GTUtility.isStringValid(tName)) { + return tName; + } + } + return aStack.getUnlocalizedName() + ".name"; + } + + public static void writePlaceholderStrings() { + addStringLocalization("Interaction_DESCRIPTION_Index_001", "Puts out into adjacent Slot #"); + addStringLocalization("Interaction_DESCRIPTION_Index_002", "Grabs in for own Slot #"); + addStringLocalization("Interaction_DESCRIPTION_Index_003", "Enable with Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_004", "Disable with Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_005", "Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_006", "Export"); + addStringLocalization("Interaction_DESCRIPTION_Index_007", "Import"); + addStringLocalization("Interaction_DESCRIPTION_Index_008", "Export (conditional)"); + addStringLocalization("Interaction_DESCRIPTION_Index_009", "Import (conditional)"); + addStringLocalization("Interaction_DESCRIPTION_Index_010", "Export (invert cond)"); + addStringLocalization("Interaction_DESCRIPTION_Index_011", "Import (invert cond)"); + addStringLocalization("Interaction_DESCRIPTION_Index_012", "Export allow Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_013", "Import allow Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_014", "Export allow Input (conditional)"); + addStringLocalization("Interaction_DESCRIPTION_Index_015", "Import allow Output (conditional)"); + addStringLocalization("Interaction_DESCRIPTION_Index_016", "Export allow Input (invert cond)"); + addStringLocalization("Interaction_DESCRIPTION_Index_017", "Import allow Output (invert cond)"); + addStringLocalization("Interaction_DESCRIPTION_Index_018", "Normal"); + addStringLocalization("Interaction_DESCRIPTION_Index_019", "Inverted"); + addStringLocalization("Interaction_DESCRIPTION_Index_020", "Ready to work"); + addStringLocalization("Interaction_DESCRIPTION_Index_021", "Not ready to work"); + addStringLocalization("Interaction_DESCRIPTION_Index_022", "Import"); + addStringLocalization("Interaction_DESCRIPTION_Index_023", "Import (conditional)"); + addStringLocalization("Interaction_DESCRIPTION_Index_024", "Import (invert cond)"); + addStringLocalization("Interaction_DESCRIPTION_Index_025", "Keep Liquids Away"); + addStringLocalization("Interaction_DESCRIPTION_Index_026", "Keep Liquids Away (conditional)"); + addStringLocalization("Interaction_DESCRIPTION_Index_027", "Keep Liquids Away (invert cond)"); + addStringLocalization("Interaction_DESCRIPTION_Index_031", "Normal Universal Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_032", "Inverted Universal Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_033", "Normal Electricity Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_034", "Inverted Electricity Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_035", "Normal Steam Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_036", "Inverted Steam Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_037", "Normal Average Electric Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_038", "Inverted Average Electric Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_039", "Normal Average Electric Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_040", "Inverted Average Electric Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_041", "Normal Electricity Storage(Including Batteries)"); + addStringLocalization("Interaction_DESCRIPTION_Index_042", "Inverted Electricity Storage(Including Batteries)"); + addStringLocalization("Interaction_DESCRIPTION_Index_043", "Filter input, Deny output"); + addStringLocalization("Interaction_DESCRIPTION_Index_044", "Invert input, Deny output"); + addStringLocalization("Interaction_DESCRIPTION_Index_045", "Filter input, Permit any output"); + addStringLocalization("Interaction_DESCRIPTION_Index_046", "Invert input, Permit any output"); + addStringLocalization("Interaction_DESCRIPTION_Index_047", "Filter Fluid: "); + addStringLocalization("Interaction_DESCRIPTION_Index_048", "Pump speed: "); + addStringLocalization("Interaction_DESCRIPTION_Index_049", "L/tick "); + addStringLocalization("Interaction_DESCRIPTION_Index_050", "L/sec"); + addStringLocalization("Interaction_DESCRIPTION_Index_053", "Slot: "); + addStringLocalization("Interaction_DESCRIPTION_Index_054", "Inverted"); + addStringLocalization("Interaction_DESCRIPTION_Index_055", "Normal"); + addStringLocalization("Interaction_DESCRIPTION_Index_056", "Emit if 1 Maintenance Needed"); + addStringLocalization("Interaction_DESCRIPTION_Index_057", "Emit if 1 Maintenance Needed(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_058", "Emit if 2 Maintenance Needed"); + addStringLocalization("Interaction_DESCRIPTION_Index_059", "Emit if 2 Maintenance Needed(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_060", "Emit if 3 Maintenance Needed"); + addStringLocalization("Interaction_DESCRIPTION_Index_061", "Emit if 3 Maintenance Needed(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_062", "Emit if 4 Maintenance Needed"); + addStringLocalization("Interaction_DESCRIPTION_Index_063", "Emit if 4 Maintenance Needed(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_064", "Emit if 5 Maintenance Needed"); + addStringLocalization("Interaction_DESCRIPTION_Index_065", "Emit if 5 Maintenance Needed(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_066", "Emit if rotor needs maintenance low accuracy mod"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_067", + "Emit if rotor needs maintenance low accuracy mod(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_068", "Emit if rotor needs maintenance high accuracy mod"); + addStringLocalization("Interaction_DESCRIPTION_Index_068.1", "Emit if any Player is close"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_069", + "Emit if rotor needs maintenance high accuracy mod(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_069.1", "Emit if other Player is close"); + addStringLocalization("Interaction_DESCRIPTION_Index_070", "Emit if you are close"); + addStringLocalization("Interaction_DESCRIPTION_Index_071", "Conducts strongest Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_072", "Conducts from bottom Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_073", "Conducts from top Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_074", "Conducts from north Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_075", "Conducts from south Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_076", "Conducts from west Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_077", "Conducts from east Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_078", "Signal = "); + addStringLocalization("Interaction_DESCRIPTION_Index_079", "Conditional Signal = "); + addStringLocalization("Interaction_DESCRIPTION_Index_080", "Inverted Conditional Signal = "); + addStringLocalization("Interaction_DESCRIPTION_Index_081", "Frequency: "); + addStringLocalization("Interaction_DESCRIPTION_Index_082", "Open if work enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_083", "Open if work disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_084", "Only Output allowed"); + addStringLocalization("Interaction_DESCRIPTION_Index_085", "Only Input allowed"); + addStringLocalization("Interaction_DESCRIPTION_Index_086", "Auto-Input: "); + addStringLocalization("Interaction_DESCRIPTION_Index_087", "Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_088", "Enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_089", " Auto-Output: "); + addStringLocalization("Interaction_DESCRIPTION_Index_090", "Machine Processing: "); + addStringLocalization("Interaction_DESCRIPTION_Index_091", "Redstone Output at Side "); + addStringLocalization("Interaction_DESCRIPTION_Index_092", " set to: "); + addStringLocalization("Interaction_DESCRIPTION_Index_093", "Strong"); + addStringLocalization("Interaction_DESCRIPTION_Index_094", "Weak"); + addStringLocalization("Interaction_DESCRIPTION_Index_094.1", "Not enough soldering material!"); + addStringLocalization("Interaction_DESCRIPTION_Index_095", "Input from Output Side allowed"); + addStringLocalization("Interaction_DESCRIPTION_Index_096", "Input from Output Side forbidden"); + addStringLocalization("Interaction_DESCRIPTION_Index_098", "Do not regulate Item Stack Size"); + addStringLocalization("Interaction_DESCRIPTION_Index_099", "Regulate Item Stack Size to: "); + addStringLocalization("Interaction_DESCRIPTION_Index_100", "This is "); + addStringLocalization("Interaction_DESCRIPTION_Index_101", " Ore."); + addStringLocalization("Interaction_DESCRIPTION_Index_102", "There is Lava behind this Rock."); + addStringLocalization("Interaction_DESCRIPTION_Index_103", "There is a Liquid behind this Rock."); + addStringLocalization("Interaction_DESCRIPTION_Index_104", "There is an Air Pocket behind this Rock."); + addStringLocalization("Interaction_DESCRIPTION_Index_105", "Material is changing behind this Rock."); + addStringLocalization("Interaction_DESCRIPTION_Index_106", "Found traces of "); + addStringLocalization("Interaction_DESCRIPTION_Index_107", "No Ores found."); + addStringLocalization("Interaction_DESCRIPTION_Index_108", "Outputs misc. Fluids, Steam and Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_109", "Outputs Steam and Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_110", "Outputs Steam and misc. Fluids"); + addStringLocalization("Interaction_DESCRIPTION_Index_111", "Outputs Steam"); + addStringLocalization("Interaction_DESCRIPTION_Index_112", "Outputs misc. Fluids and Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_113", "Outputs only Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_114", "Outputs only misc. Fluids"); + addStringLocalization("Interaction_DESCRIPTION_Index_115", "Outputs nothing"); + // 116 moved to lang files + // 117 obsolete + // 118 moved to lang files + // 119 obsolete + // 120 moved to lang files + // 121 obsolete + addStringLocalization("Interaction_DESCRIPTION_Index_122", "Emit Redstone if slots contain something"); + addStringLocalization("Interaction_DESCRIPTION_Index_123", "Don't emit Redstone"); + // 124 moved to lang files + addStringLocalization("Interaction_DESCRIPTION_Index_124.1", "Blacklist Mode"); + // 125 obsolete + addStringLocalization("Interaction_DESCRIPTION_Index_125.1", "Whitelist Mode"); + // 126 moved to lang files + // 127 obsolete + addStringLocalization("Interaction_DESCRIPTION_Index_128", "Redstone"); + addStringLocalization("Interaction_DESCRIPTION_Index_128.1", "Redstone "); + addStringLocalization("Interaction_DESCRIPTION_Index_129", "Energy"); + addStringLocalization("Interaction_DESCRIPTION_Index_129.1", "Energy "); + addStringLocalization("Interaction_DESCRIPTION_Index_130", "Fluids"); + addStringLocalization("Interaction_DESCRIPTION_Index_130.1", "Fluids "); + addStringLocalization("Interaction_DESCRIPTION_Index_131", "Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_131.1", "Items "); + addStringLocalization("Interaction_DESCRIPTION_Index_132", "Pipe is loose."); + addStringLocalization("Interaction_DESCRIPTION_Index_133", "Screws are loose."); + addStringLocalization("Interaction_DESCRIPTION_Index_134", "Something is stuck."); + addStringLocalization("Interaction_DESCRIPTION_Index_135", "Platings are dented."); + addStringLocalization("Interaction_DESCRIPTION_Index_136", "Circuitry burned out."); + addStringLocalization("Interaction_DESCRIPTION_Index_137", "That doesn't belong there."); + addStringLocalization("Interaction_DESCRIPTION_Index_138", "Incomplete Structure."); + addStringLocalization("Interaction_DESCRIPTION_Index_139", "Hit with Soft Mallet"); + addStringLocalization("Interaction_DESCRIPTION_Index_140", "to (re-)start the Machine"); + addStringLocalization("Interaction_DESCRIPTION_Index_141", "if it doesn't start."); + addStringLocalization("Interaction_DESCRIPTION_Index_142", "Running perfectly."); + addStringLocalization("Interaction_DESCRIPTION_Index_143", "Missing Mining Pipe"); + addStringLocalization("Interaction_DESCRIPTION_Index_144", "Missing Turbine Rotor"); + addStringLocalization("Interaction_DESCRIPTION_Index_145", "Step Down, In: "); + addStringLocalization("Interaction_DESCRIPTION_Index_146", "Step Up, In: "); + addStringLocalization("Interaction_DESCRIPTION_Index_147", "A, Out: "); + addStringLocalization("Interaction_DESCRIPTION_Index_148", "V "); + addStringLocalization("Interaction_DESCRIPTION_Index_149", "A"); + addStringLocalization("Interaction_DESCRIPTION_Index_150", "Chance: "); + addStringLocalization("Interaction_DESCRIPTION_Index_151", "Does not get consumed in the process"); + addStringLocalization("Interaction_DESCRIPTION_Index_151.1", "Outputs items and 1 specific Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_151.2", "Outputs 1 specific Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_151.4", "Successfully locked Fluid to %s"); + addStringLocalization("Interaction_DESCRIPTION_Index_152", "Total: "); + addStringLocalization("Interaction_DESCRIPTION_Index_153", "Usage: "); + addStringLocalization("Interaction_DESCRIPTION_Index_154", "Voltage: "); + addStringLocalization("Interaction_DESCRIPTION_Index_155", "Amperage: "); + addStringLocalization("Interaction_DESCRIPTION_Index_156", "Voltage: unspecified"); + addStringLocalization("Interaction_DESCRIPTION_Index_157", "Amperage: unspecified"); + addStringLocalization("Interaction_DESCRIPTION_Index_158", "Time: "); + addStringLocalization("Interaction_DESCRIPTION_Index_159", "Needs Low Gravity"); + addStringLocalization("Interaction_DESCRIPTION_Index_160", "Needs Cleanroom"); + addStringLocalization("Interaction_DESCRIPTION_Index_160.1", "Needs Cleanroom & LowGrav"); + addStringLocalization("Interaction_DESCRIPTION_Index_161", " secs"); + addStringLocalization("Interaction_DESCRIPTION_Index_162", "Name: "); + addStringLocalization("Interaction_DESCRIPTION_Index_163", " MetaData: "); + addStringLocalization("Interaction_DESCRIPTION_Index_164", "Hardness: "); + addStringLocalization("Interaction_DESCRIPTION_Index_165", " Blast Resistance: "); + addStringLocalization("Interaction_DESCRIPTION_Index_166", "Is valid Beacon Pyramid Material"); + addStringLocalization("Interaction_DESCRIPTION_Index_167", "Tank "); + addStringLocalization("Interaction_DESCRIPTION_Index_168", "Heat: "); + addStringLocalization("Interaction_DESCRIPTION_Index_169", "HEM: "); + addStringLocalization("Interaction_DESCRIPTION_Index_170", " Base EU Output: "); + addStringLocalization("Interaction_DESCRIPTION_Index_171", "Facing: "); + addStringLocalization("Interaction_DESCRIPTION_Index_172", " / Chance: "); + addStringLocalization("Interaction_DESCRIPTION_Index_173", "You can remove this with a Wrench"); + addStringLocalization("Interaction_DESCRIPTION_Index_174", "You can NOT remove this with a Wrench"); + addStringLocalization("Interaction_DESCRIPTION_Index_175", "Conduction Loss: "); + addStringLocalization("Interaction_DESCRIPTION_Index_176", "Contained Energy: "); + addStringLocalization("Interaction_DESCRIPTION_Index_177", "Has Muffler Upgrade"); + addStringLocalization("Interaction_DESCRIPTION_Index_178", "Progress/Load: "); + addStringLocalization("Interaction_DESCRIPTION_Index_179", "Max IN: "); + addStringLocalization("Interaction_DESCRIPTION_Index_181", "Max OUT: "); + addStringLocalization("Interaction_DESCRIPTION_Index_182", " EU at "); + addStringLocalization("Interaction_DESCRIPTION_Index_183", " A"); + addStringLocalization("Interaction_DESCRIPTION_Index_184", "Energy: "); + addStringLocalization("Interaction_DESCRIPTION_Index_186", "Owned by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_187", "Type -- Crop-Name: "); + addStringLocalization("Interaction_DESCRIPTION_Index_188", " Growth: "); + addStringLocalization("Interaction_DESCRIPTION_Index_189", " Gain: "); + addStringLocalization("Interaction_DESCRIPTION_Index_190", " Resistance: "); + addStringLocalization("Interaction_DESCRIPTION_Index_191", "Plant -- Fertilizer: "); + addStringLocalization("Interaction_DESCRIPTION_Index_192", " Water: "); + addStringLocalization("Interaction_DESCRIPTION_Index_193", " Weed-Ex: "); + addStringLocalization("Interaction_DESCRIPTION_Index_194", " Scan-Level: "); + addStringLocalization("Interaction_DESCRIPTION_Index_195", "Environment -- Nutrients: "); + addStringLocalization("Interaction_DESCRIPTION_Index_196", " Humidity: "); + addStringLocalization("Interaction_DESCRIPTION_Index_197", " Air-Quality: "); + addStringLocalization("Interaction_DESCRIPTION_Index_198", "Attributes:"); + addStringLocalization("Interaction_DESCRIPTION_Index_199", "Discovered by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_200", "Sort mode: "); + addStringLocalization("Interaction_DESCRIPTION_Index_200.1", "Automatic Item Shuffling: "); + addStringLocalization("Interaction_DESCRIPTION_Index_201", "Nothing"); + addStringLocalization("Interaction_DESCRIPTION_Index_202", "Pollution in Chunk: "); + addStringLocalization("Interaction_DESCRIPTION_Index_203", " gibbl"); + addStringLocalization("Interaction_DESCRIPTION_Index_204", "No Pollution in Chunk! HAYO!"); + addStringLocalization("Interaction_DESCRIPTION_Index_206", "Scan for Assembly Line"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_207", + "Pump speed: %dL every %d ticks, %.2f L/sec on average"); + addStringLocalization("Interaction_DESCRIPTION_Index_208", " L"); + addStringLocalization("Interaction_DESCRIPTION_Index_209", " ticks"); + addStringLocalization("Interaction_DESCRIPTION_Index_209.1", " tick"); + addStringLocalization("Interaction_DESCRIPTION_Index_210", "Average: %.2f L/sec"); + addStringLocalization("Interaction_DESCRIPTION_Index_211", "Items per side: "); + addStringLocalization("Interaction_DESCRIPTION_Index_212", "Input enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_213", "Input disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_214", "Connected"); + addStringLocalization("Interaction_DESCRIPTION_Index_215", "Disconnected"); + addStringLocalization("Interaction_DESCRIPTION_Index_216", "Deprecated Recipe"); + addStringLocalization("Interaction_DESCRIPTION_Index_219", "Extended Facing: "); + addStringLocalization("Interaction_DESCRIPTION_Index_220", "Single recipe locking disabled."); + addStringLocalization("Interaction_DESCRIPTION_Index_221", "Item threshold"); + addStringLocalization("Interaction_DESCRIPTION_Index_222", "Fluid threshold"); + addStringLocalization("Interaction_DESCRIPTION_Index_222.1", "Energy threshold"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_223", + "Single recipe locking enabled. Will lock to next recipe."); + addStringLocalization("Interaction_DESCRIPTION_Index_224", "Always On"); + addStringLocalization("Interaction_DESCRIPTION_Index_225", "Active with Redstone Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_226", "Inactive with Redstone Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_227", "Allow Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_228", "Block Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_229", "Export/Import"); + addStringLocalization("Interaction_DESCRIPTION_Index_230", "Conditional"); + addStringLocalization("Interaction_DESCRIPTION_Index_231", "Enable Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_232", "Filter Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_233", "Filter Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_234", "Block Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_235", "Allow Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_236", "Whitelist Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_237", "Blacklist Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_238", "Filter Direction"); + addStringLocalization("Interaction_DESCRIPTION_Index_239", "Filter Type"); + addStringLocalization("Interaction_DESCRIPTION_Index_240", "Block Flow"); + addStringLocalization("Interaction_DESCRIPTION_Index_241", "Recipe progress"); + addStringLocalization("Interaction_DESCRIPTION_Index_242", "Machine idle"); + addStringLocalization("Interaction_DESCRIPTION_Index_243", "Enable with Redstone"); + addStringLocalization("Interaction_DESCRIPTION_Index_244", "Disable with Redstone"); + addStringLocalization("Interaction_DESCRIPTION_Index_245", "Disable machine"); + addStringLocalization("Interaction_DESCRIPTION_Index_246", "Frequency"); + addStringLocalization("Interaction_DESCRIPTION_Index_247", "1 Issue"); + addStringLocalization("Interaction_DESCRIPTION_Index_248", "2 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_249", "3 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_250", "4 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_251", "5 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_252", "Rotor < 20%"); + addStringLocalization("Interaction_DESCRIPTION_Index_253", "Rotor ≈ 0%"); + addStringLocalization("Interaction_DESCRIPTION_Index_254", "Detect slot#"); + addStringLocalization("Interaction_DESCRIPTION_Index_254.0", "Detect Slot"); + addStringLocalization("Interaction_DESCRIPTION_Index_254.1", "Internal slot#"); + addStringLocalization("Interaction_DESCRIPTION_Index_255", "Adjacent slot#"); + addStringLocalization("Interaction_DESCRIPTION_Index_256", "Universal Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_257", "Electricity Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_258", "Steam Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_259", "Average Electric Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_260", "Average Electric Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_261", "Electricity Storage(Including Batteries)"); + addStringLocalization("Interaction_DESCRIPTION_Index_262", "Fluid Auto Output Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_263", "Fluid Auto Output Enabled"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_264", + "currently none, will be locked to the next that is put in"); + addStringLocalization("Interaction_DESCRIPTION_Index_265", "1 specific Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_266", "Lock Fluid Mode Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_267", "Overflow Voiding Mode Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_268", "Overflow Voiding Mode Enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_269", "Void Full Mode Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_270", "Void Full Mode Enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_271", "unspecified"); + addStringLocalization("Interaction_DESCRIPTION_Index_272", "Recipe by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_273", "Original Recipe by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_274", "Modified by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_275", "Original voltage: "); + addStringLocalization("Interaction_DESCRIPTION_Index_299", "Item Filter: "); + addStringLocalization("Interaction_DESCRIPTION_Index_300", "Filter Cleared!"); + addStringLocalization("Interaction_DESCRIPTION_Index_300.1", "Fluid Lock Cleared."); + addStringLocalization("Interaction_DESCRIPTION_Index_301", "Universal"); + addStringLocalization("Interaction_DESCRIPTION_Index_302", "Int. EU"); + addStringLocalization("Interaction_DESCRIPTION_Index_303", "Steam"); + addStringLocalization("Interaction_DESCRIPTION_Index_304", "Avg. Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_305", "Avg. Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_306", "EU stored"); + addStringLocalization("Interaction_DESCRIPTION_Index_307", "Deny input, Filter output"); + addStringLocalization("Interaction_DESCRIPTION_Index_308", "Deny input, Invert output"); + addStringLocalization("Interaction_DESCRIPTION_Index_309", "Permit any input, Filter output"); + addStringLocalization("Interaction_DESCRIPTION_Index_310", "Permit any input, Invert output"); + addStringLocalization("Interaction_DESCRIPTION_Index_311", "Block Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_312", "Allow Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_313", "Block Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_314", "Allow Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_315", "Filter Empty"); + addStringLocalization("Interaction_DESCRIPTION_Index_316", "Pump speed limit reached!"); + addStringLocalization("Interaction_DESCRIPTION_Index_317", "Filter: "); + addStringLocalization("Interaction_DESCRIPTION_Index_318", "Check Mode"); + addStringLocalization("Interaction_DESCRIPTION_Index_319", "Any player"); + addStringLocalization("Interaction_DESCRIPTION_Index_320", "Other players"); + addStringLocalization("Interaction_DESCRIPTION_Index_321", "Only owner"); + addStringLocalization("Interaction_DESCRIPTION_Index_322", "Overflow point: "); + addStringLocalization("Interaction_DESCRIPTION_Index_323", "L"); + addStringLocalization("Interaction_DESCRIPTION_Index_324", "Now"); + addStringLocalization("Interaction_DESCRIPTION_Index_325", "Max"); + addStringLocalization("Interaction_DESCRIPTION_Index_326", "Public"); + addStringLocalization("Interaction_DESCRIPTION_Index_327", "Private"); + addStringLocalization("Interaction_DESCRIPTION_Index_328", "Channel"); + addStringLocalization("Interaction_DESCRIPTION_Index_329", "Public/Private"); + addStringLocalization("Interaction_DESCRIPTION_Index_330", "Sneak Rightclick to switch Mode"); + addStringLocalization("Interaction_DESCRIPTION_Index_331", "AND Gate"); + addStringLocalization("Interaction_DESCRIPTION_Index_332", "NAND Gate"); + addStringLocalization("Interaction_DESCRIPTION_Index_333", "OR Gate"); + addStringLocalization("Interaction_DESCRIPTION_Index_334", "NOR Gate"); + addStringLocalization("Interaction_DESCRIPTION_Index_335", "Gate Mode"); + addStringLocalization("Interaction_DESCRIPTION_Index_336", "PCB Factory Tier: "); + addStringLocalization("Interaction_DESCRIPTION_Index_337", "Upgrade Required: "); + addStringLocalization("Interaction_DESCRIPTION_Index_338", "Bio"); + addStringLocalization("Interaction_DESCRIPTION_Index_339", "Biochamber Upgrade Enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_339.1", "Biochamber Upgrade Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_340", "Rotated biochamber enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_340.1", "Rotated biochamber disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_341", "Tier 1 cooling enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_341.1", "Tier 1 cooling disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_342", "Tier 2 cooling enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_342.1", "Tier 2 cooling disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_343", "Use Machine Processing State"); + addStringLocalization("Interaction_DESCRIPTION_Index_343.1", "Use Inverted Machine Processing State"); + addStringLocalization("Interaction_DESCRIPTION_Index_344", "Input Blocking"); + addStringLocalization("Interaction_DESCRIPTION_Index_344.1", "Output Blocking"); + addStringLocalization("Interaction_DESCRIPTION_Index_400", "Running mode: "); + addStringLocalization("Interaction_DESCRIPTION_Index_500", "Fitting: Loose - More Flow"); + addStringLocalization("Interaction_DESCRIPTION_Index_501", "Fitting: Tight - More Efficiency"); + addStringLocalization("Interaction_DESCRIPTION_Index_502", "Mining chunk loading enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_503", "Mining chunk loading disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_505", "Enable with Signal (Safe)"); + addStringLocalization("Interaction_DESCRIPTION_Index_506", "Disable with Signal (Safe)"); + addStringLocalization("Interaction_DESCRIPTION_Index_507", "Safe Mode"); + addStringLocalization("Interaction_DESCRIPTION_Index_508", "Needs Stabilized Black Hole"); + addStringLocalization("Interaction_DESCRIPTION_Index_509", "Requires HIP Unit"); + addStringLocalization("Interaction_DESCRIPTION_Index_602", "Use Private Frequency"); + addStringLocalization("Interaction_DESCRIPTION_Index_756", "Connectable: "); + addStringLocalization("Interaction_DESCRIPTION_Index_ALL", "All"); + addStringLocalization("Interaction_DESCRIPTION_Index_ANY", "Any"); + addStringLocalization("Interaction_DESCRIPTION_Index_INVERTED", "Inverted"); + addStringLocalization("Interaction_DESCRIPTION_Index_NORMAL", "Normal"); + addStringLocalization("Interaction_DESCRIPTION_Index_SIDE", "Side: "); + + addStringLocalization("Item_DESCRIPTION_Index_000", "Stored Heat: %s"); + addStringLocalization("Item_DESCRIPTION_Index_001", "Durability: %s/%s"); + addStringLocalization("Item_DESCRIPTION_Index_002", "%s lvl %s"); + addStringLocalization("Item_DESCRIPTION_Index_003", "Attack Damage: %s"); + addStringLocalization("Item_DESCRIPTION_Index_004", "Mining Speed: %s"); + addStringLocalization("Item_DESCRIPTION_Index_005", "Turbine Efficiency: %s"); + addStringLocalization("Item_DESCRIPTION_Index_006", "Optimal Steam flow: %s L/t"); + addStringLocalization("Item_DESCRIPTION_Index_007", "Energy from Optimal Gas Flow: %s EU/t"); + addStringLocalization("Item_DESCRIPTION_Index_008", "Energy from Optimal Plasma Flow: %s EU/t"); + addStringLocalization("Item_DESCRIPTION_Index_009", "Contains %s EU Tier: %s"); + addStringLocalization("Item_DESCRIPTION_Index_010", "Empty. You should recycle it properly."); + addStringLocalization("Item_DESCRIPTION_Index_011", "%s / %s EU - Voltage: %s"); + addStringLocalization("Item_DESCRIPTION_Index_012", "No Fluids Contained"); + addStringLocalization("Item_DESCRIPTION_Index_013", "%sL / %sL"); + addStringLocalization("Item_DESCRIPTION_Index_014", "Missing Coodinates!"); + addStringLocalization("Item_DESCRIPTION_Index_015", "Device at:"); + addStringLocalization("Item_DESCRIPTION_Index_018", "State: %s"); + addStringLocalization("Item_DESCRIPTION_Index_019", "Bath with neutron in a hot reactor"); + addStringLocalization("Item_DESCRIPTION_Index_020", "Progress: %s/%s"); + addStringLocalization("Item_DESCRIPTION_Index_021", "Radiation Hazard"); + addStringLocalization("Item_DESCRIPTION_Index_500", "Turbine Efficiency (Loose): %s"); + addStringLocalization("Item_DESCRIPTION_Index_501", "Optimal Steam flow (Loose): %s L/t"); + addStringLocalization("Item_DESCRIPTION_Index_502", "Overflow Efficiency Tier: %s"); + addStringLocalization("Item_DESCRIPTION_Index_900", "Energy from Optimal Steam Flow: %s EU/t"); + addStringLocalization("Item_DESCRIPTION_Index_901", "Energy from Optimal Steam Flow (Loose): %s EU/t"); + + addStringLocalization(FACE_ANY, "Any Side"); + addStringLocalization(FACE_BOTTOM, "Bottom"); + addStringLocalization(FACE_TOP, "Top"); + addStringLocalization(FACE_LEFT, "Left"); + addStringLocalization(FACE_FRONT, "Front"); + addStringLocalization(FACE_RIGHT, "Right"); + addStringLocalization(FACE_BACK, "Back"); + addStringLocalization(FACE_NONE, "None"); + } + + private static void addToMCLangList(String aKey, String translation) { + if (stringTranslateLanguageList != null) { + stringTranslateLanguageList.put(aKey, translation); + } + } +} diff --git a/src/main/java/gregtech/api/util/GTLog.java b/src/main/java/gregtech/api/util/GTLog.java new file mode 100644 index 0000000000..eba6b0fe50 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTLog.java @@ -0,0 +1,45 @@ +package gregtech.api.util; + +import java.io.File; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * Just a simple Logging Function. If on Server, then this will point to System.out and System.err + */ +public class GTLog { + + public static PrintStream out = System.out; + public static PrintStream err = System.err; + public static PrintStream ore = new LogBuffer(); + public static PrintStream pal = null; + public static PrintStream exp = new LogBuffer(); + public static File mLogFile; + public static File mOreDictLogFile; + public static File mPlayerActivityLogFile; + public static File mExplosionLog; + + public static class LogBuffer extends PrintStream { + + public final List mBufferedOreDictLog = new ArrayList<>(); + + public LogBuffer() { + super(new OutputStream() { + + @Override + public void write(int arg0) { + /* Do nothing */ + } + }); + } + + @Override + public void println(String aString) { + mBufferedOreDictLog.add(aString); + } + } +} diff --git a/src/main/java/gregtech/api/util/GTModHandler.java b/src/main/java/gregtech/api/util/GTModHandler.java new file mode 100644 index 0000000000..8c06f2ad47 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTModHandler.java @@ -0,0 +1,2435 @@ +package gregtech.api.util; + +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.GTValues.B; +import static gregtech.api.enums.GTValues.D1; +import static gregtech.api.enums.GTValues.DW; +import static gregtech.api.enums.GTValues.E; +import static gregtech.api.enums.GTValues.M; +import static gregtech.api.enums.GTValues.RA; +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.GTValues.W; +import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes; +import static gregtech.api.recipe.RecipeMaps.oreWasherRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Tier; +import gregtech.api.enums.ToolDictNames; +import gregtech.api.interfaces.IDamagableItem; +import gregtech.api.interfaces.IItemContainer; +import gregtech.api.interfaces.internal.IGTCraftingRecipe; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.metatileentity.implementations.MTEBasicMachineWithRecipe; +import gregtech.api.objects.GTHashSet; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeCategories; +import gregtech.api.recipe.RecipeMap; +import ic2.api.item.IBoxable; +import ic2.api.item.IC2Items; +import ic2.api.item.IElectricItem; +import ic2.api.reactor.IReactorComponent; +import ic2.api.recipe.IRecipeInput; +import ic2.api.recipe.RecipeInputItemStack; +import ic2.api.recipe.RecipeOutput; +import ic2.core.item.ItemToolbox; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the Interface I use for interacting with other Mods. + *

+ * Due to the many imports, this File can cause compile Problems if not all the APIs are installed + */ +public class GTModHandler { + + public static final List sSingleNonBlockDamagableRecipeList = new ArrayList<>(1000); + private static final Map sIC2ItemMap = new HashMap<>(); + + // public for bartworks + public static final List sAllRecipeList = new ArrayList<>(5000), sBufferRecipeList = new ArrayList<>(1000); + private static final List delayedRemovalByOutput = new ArrayList<>(); + private static final List delayedRemovalByRecipe = new ArrayList<>(); + + public static Collection sNativeRecipeClasses = new HashSet<>(), sSpecialRecipeClasses = new HashSet<>(); + public static GTHashSet sNonReplaceableItems = new GTHashSet<>(); + public static Object sBoxableWrapper = new GTIBoxableWrapper(); + public static Collection sBoxableItems = new ArrayList<>(); + private static final Map emptyRecipeMap = new HashMap<>(); + private static Set recyclerWhitelist; + private static Set recyclerBlacklist; + + private static boolean sBufferCraftingRecipes = true; + public static List sSingleNonBlockDamagableRecipeList_list = new ArrayList<>(100); + private static final boolean sSingleNonBlockDamagableRecipeList_create = true; + private static final ItemStack sMt1 = new ItemStack(Blocks.dirt, 1, 0), sMt2 = new ItemStack(Blocks.dirt, 1, 0); + private static final String s_H = "h", s_F = "f", s_I = "I", s_P = "P", s_R = "R"; + private static final ItemStack[][] sShapes1 = new ItemStack[][] { + { sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1, null }, + { sMt1, null, sMt1, sMt1, null, sMt1, sMt1, sMt1, sMt1 }, + { null, sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1 }, + { sMt1, sMt1, sMt1, sMt1, null, sMt1, null, null, null }, + { sMt1, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 }, + { sMt1, sMt1, sMt1, sMt1, null, sMt1, sMt1, null, sMt1 }, + { null, null, null, sMt1, null, sMt1, sMt1, null, sMt1 }, + { null, sMt1, null, null, sMt1, null, null, sMt2, null }, + { sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2, null }, + { null, sMt1, null, null, sMt2, null, null, sMt2, null }, + { sMt1, sMt1, null, sMt1, sMt2, null, null, sMt2, null }, + { null, sMt1, sMt1, null, sMt2, sMt1, null, sMt2, null }, + { sMt1, sMt1, null, null, sMt2, null, null, sMt2, null }, + { null, sMt1, sMt1, null, sMt2, null, null, sMt2, null }, + { null, sMt1, null, sMt1, null, null, null, sMt1, sMt2 }, + { null, sMt1, null, null, null, sMt1, sMt2, sMt1, null }, + { null, sMt1, null, sMt1, null, sMt1, null, null, sMt2 }, + { null, sMt1, null, sMt1, null, sMt1, sMt2, null, null }, + { null, sMt2, null, null, sMt1, null, null, sMt1, null }, + { null, sMt2, null, null, sMt2, null, sMt1, sMt1, sMt1 }, + { null, sMt2, null, null, sMt2, null, null, sMt1, null }, + { null, sMt2, null, sMt1, sMt2, null, sMt1, sMt1, null }, + { null, sMt2, null, null, sMt2, sMt1, null, sMt1, sMt1 }, + { null, sMt2, null, null, sMt2, null, sMt1, sMt1, null }, + { sMt1, null, null, null, sMt2, null, null, null, sMt2 }, + { null, null, sMt1, null, sMt2, null, sMt2, null, null }, + { sMt1, null, null, null, sMt2, null, null, null, null }, + { null, null, sMt1, null, sMt2, null, null, null, null }, + { sMt1, sMt2, null, null, null, null, null, null, null }, + { sMt2, sMt1, null, null, null, null, null, null, null }, + { sMt1, null, null, sMt2, null, null, null, null, null }, + { sMt2, null, null, sMt1, null, null, null, null, null }, + { sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, null, sMt2, null }, + { sMt1, sMt1, null, sMt1, sMt1, sMt2, sMt1, sMt1, null }, + { null, sMt1, sMt1, sMt2, sMt1, sMt1, null, sMt1, sMt1 }, + { null, sMt2, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 }, + { sMt1, sMt1, sMt1, sMt1, sMt2, sMt1, null, sMt2, null }, + { sMt1, sMt1, null, sMt1, sMt2, sMt2, sMt1, sMt1, null }, + { null, sMt1, sMt1, sMt2, sMt2, sMt1, null, sMt1, sMt1 }, + { null, sMt2, null, sMt1, sMt2, sMt1, sMt1, sMt1, sMt1 }, + { sMt1, null, null, null, sMt1, null, null, null, null }, + { null, sMt1, null, sMt1, null, null, null, null, null }, + { sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null }, + { null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2 } }; + public static List sSingleNonBlockDamagableRecipeList_validsShapes1 = new ArrayList<>(44); + public static boolean sSingleNonBlockDamagableRecipeList_validsShapes1_update = false; + public static List sSingleNonBlockDamagableRecipeList_warntOutput = new ArrayList<>(50); + public static List sVanillaRecipeList_warntOutput = new ArrayList<>(50); + public static final List sSingleNonBlockDamagableRecipeList_verified = new ArrayList<>(1000); + public static List sAnySteamFluidIDs = new ArrayList<>(); + public static List sSuperHeatedSteamFluidIDs = new ArrayList<>(); + + static { + sNativeRecipeClasses.add(ShapedRecipes.class.getName()); + sNativeRecipeClasses.add(ShapedOreRecipe.class.getName()); + sNativeRecipeClasses.add(GTShapedRecipe.class.getName()); + sNativeRecipeClasses.add(ShapelessRecipes.class.getName()); + sNativeRecipeClasses.add(ShapelessOreRecipe.class.getName()); + sNativeRecipeClasses.add(GTShapelessRecipe.class.getName()); + sNativeRecipeClasses.add(ic2.core.AdvRecipe.class.getName()); + sNativeRecipeClasses.add(ic2.core.AdvShapelessRecipe.class.getName()); + sNativeRecipeClasses.add("appeng.recipes.game.ShapedRecipe"); + sNativeRecipeClasses.add("appeng.recipes.game.ShapelessRecipe"); + sNativeRecipeClasses.add("forestry.core.utils.ShapedRecipeCustom"); + + // Recipe Classes, which should never be removed. + sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeFireworks.class.getName()); + sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesArmorDyes.class.getName()); + sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeBookCloning.class.getName()); + sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapCloning.class.getName()); + sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapExtending.class.getName()); + sSpecialRecipeClasses.add("jds.bibliocraft.BiblioSpecialRecipes"); + sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQBlockRecipe"); + sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQuantumComputerRecipe"); + sSpecialRecipeClasses.add("dan200.qcraft.shared.QBlockRecipe"); + sSpecialRecipeClasses.add("appeng.recipes.game.FacadeRecipe"); + sSpecialRecipeClasses.add("appeng.recipes.game.DisassembleRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.carts.LocomotivePaintingRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RotorRepairRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTableCopyRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTicketCopyRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.TankCartFilterRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.emblems.LocomotiveEmblemRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostColorRecipe"); + sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostEmblemRecipe"); + sSpecialRecipeClasses.add("mods.immibis.redlogic.interaction.RecipeDyeLumarButton"); + sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesRobeArmorDyes"); + sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesVoidRobeArmorDyes"); + sSpecialRecipeClasses.add("thaumcraft.common.lib.crafting.ShapelessNBTOreRecipe"); + sSpecialRecipeClasses.add("twilightforest.item.TFMapCloningRecipe"); + sSpecialRecipeClasses.add("forestry.lepidopterology.MatingRecipe"); + sSpecialRecipeClasses.add("micdoodle8.mods.galacticraft.planets.asteroids.recipe.CanisterRecipes"); + sSpecialRecipeClasses.add("shedar.mods.ic2.nuclearcontrol.StorageArrayRecipe"); + } + + /** + * Returns if that Liquid is Water or Distilled Water + */ + public static boolean isWater(FluidStack aFluid) { + if (aFluid == null) return false; + return aFluid.isFluidEqual(getWater(1)) || aFluid.isFluidEqual(getDistilledWater(1)); + } + + /** + * Returns a Liquid Stack with given amount of Water. + */ + public static FluidStack getWater(long aAmount) { + return FluidRegistry.getFluidStack("water", (int) aAmount); + } + + /** + * Returns a Liquid Stack with given amount of distilled Water. + */ + public static FluidStack getDistilledWater(long aAmount) { + FluidStack tFluid = FluidRegistry.getFluidStack("ic2distilledwater", (int) aAmount); + if (tFluid == null) tFluid = getWater(aAmount); + return tFluid; + } + + /** + * Returns if that Liquid is Lava + */ + public static boolean isLava(FluidStack aFluid) { + if (aFluid == null) return false; + return aFluid.isFluidEqual(getLava(1)); + } + + /** + * Returns a Liquid Stack with given amount of Lava. + */ + public static FluidStack getLava(long aAmount) { + return FluidRegistry.getFluidStack("lava", (int) aAmount); + } + + /** + * Returns if that Liquid is Steam + */ + public static boolean isSteam(FluidStack aFluid) { + if (aFluid == null) return false; + return aFluid.isFluidEqual(getSteam(1)); + } + + /** + * Returns if that Liquid is Any Steam (including other mods) + */ + public static boolean isAnySteam(FluidStack aFluid) { + return (aFluid != null && (isSteam(aFluid) || sAnySteamFluidIDs.contains(aFluid.getFluidID()))); + } + + /** + * Returns if that Liquid is Super Heated Steam (including other mods) + */ + public static boolean isSuperHeatedSteam(FluidStack aFluid) { + return (aFluid != null && sSuperHeatedSteamFluidIDs.contains(aFluid.getFluidID())); + } + + /** + * Returns a Liquid Stack with given amount of Steam. + */ + public static FluidStack getSteam(long aAmount) { + return FluidRegistry.getFluidStack("steam", (int) aAmount); + } + + /** + * Returns if that Liquid is Milk + */ + public static boolean isMilk(FluidStack aFluid) { + if (aFluid == null) return false; + return aFluid.isFluidEqual(getMilk(1)); + } + + /** + * Returns a Liquid Stack with given amount of Milk. + */ + public static FluidStack getMilk(long aAmount) { + return FluidRegistry.getFluidStack("milk", (int) aAmount); + } + + public static ItemStack getEmptyCell(long aAmount) { + return ItemList.Cell_Empty.get(aAmount); + } + + public static ItemStack getAirCell(long aAmount) { + return ItemList.Cell_Air.get(aAmount); + } + + public static ItemStack getWaterCell(long aAmount) { + return ItemList.Cell_Water.get(aAmount); + } + + public static ItemStack getLavaCell(long aAmount) { + return ItemList.Cell_Lava.get(aAmount); + } + + /** + * @param aValue the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767 + * (that is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it + * properly, stupid Mojang... + */ + public static ItemStack setFuelValue(ItemStack aStack, short aValue) { + aStack.setTagCompound(GTUtility.getNBTContainingShort(aStack.getTagCompound(), "GT.ItemFuelValue", aValue)); + return aStack; + } + + /** + * @return the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767 (that + * is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it properly, stupid + * Mojang... + */ + public static int getFuelValue(ItemStack aStack) { + return TileEntityFurnace.getItemBurnTime(aStack); + } + + /** + * Gets an Item from IndustrialCraft, and returns a Replacement Item if not possible + */ + public static ItemStack getIC2Item(String aItem, long aAmount, ItemStack aReplacement) { + if (GTUtility.isStringInvalid(aItem) || !GregTechAPI.sPreloadStarted) return null; + // if (D1) GTLog.out.println("Requested the Item '" + aItem + "' from the IC2-API"); + if (!sIC2ItemMap.containsKey(aItem)) try { + ItemStack tStack = IC2Items.getItem(aItem); + sIC2ItemMap.put(aItem, tStack); + if (tStack == null && D1) GTLog.err.println(aItem + " is not found in the IC2 Items!"); + } catch (Throwable e) { + /* Do nothing */ + } + return GTUtility.copyAmount(aAmount, sIC2ItemMap.get(aItem), aReplacement); + } + + /** + * Gets an Item from IndustrialCraft, but the Damage Value can be specified, and returns a Replacement Item with the + * same Damage if not possible + */ + public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta, ItemStack aReplacement) { + ItemStack rStack = getIC2Item(aItem, aAmount, aReplacement); + if (rStack == null) return null; + Items.feather.setDamage(rStack, aMeta); + return rStack; + } + + /** + * Gets an Item from IndustrialCraft, but the Damage Value can be specified + */ + public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta) { + return getIC2Item(aItem, aAmount, aMeta, null); + } + + /** + * Gets an Item from IndustrialCraft + */ + public static ItemStack getIC2Item(String aItem, long aAmount) { + return getIC2Item(aItem, aAmount, null); + } + + /** + * Gets an Item from the specified mod + */ + public static ItemStack getModItem(String aModID, String aItem, long aAmount) { + return getModItem(aModID, aItem, aAmount, null); + } + + /** + * Gets an Item from the specified mod, and returns a Replacement Item if not possible + */ + public static ItemStack getModItem(String aModID, String aItem, long aAmount, ItemStack aReplacement) { + ItemStack result; + if (GTUtility.isStringInvalid(aItem) || !GregTechAPI.sPreloadStarted) { + result = null; + } else { + result = GTUtility + .copyAmount(aAmount, GameRegistry.findItemStack(aModID, aItem, (int) aAmount), aReplacement); + } + + if (result == null) { + String reason; + if (GTUtility.isStringInvalid(aItem)) { + reason = "the name of the item is an invalid string"; + } else if (!GregTechAPI.sPreloadStarted) { + reason = "the GT5U preloading phase has not yet started"; + } else { + reason = "the item was not found in the game registry"; + } + String log_message = "getModItem call: object \"" + aItem + + "\" with mod id \"" + + aModID + + "\" has returned null because " + + reason; + GTLog.out.println(log_message); + new Exception().printStackTrace(GTLog.out); + } + return result; + } + + /** + * Gets an Item from the specified mod, but the Damage Value can be specified + */ + public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta) { + ItemStack rStack = getModItem(aModID, aItem, aAmount); + if (rStack == null) return null; + Items.feather.setDamage(rStack, aMeta); + return rStack; + } + + /** + * Gets an Item from the specified mod, but the Damage Value can be specified, and returns a Replacement Item with + * the same Damage if not possible + */ + public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta, ItemStack aReplacement) { + ItemStack rStack = getModItem(aModID, aItem, aAmount, aReplacement); + if (rStack == null) return null; + Items.feather.setDamage(rStack, aMeta); + return rStack; + } + + /** + * OUT OF ORDER + */ + @Deprecated + public static boolean getModeKeyDown(EntityPlayer aPlayer) { + return false; + } + + /** + * OUT OF ORDER + */ + @Deprecated + public static boolean getBoostKeyDown(EntityPlayer aPlayer) { + return false; + } + + /** + * OUT OF ORDER + */ + @Deprecated + public static boolean getJumpKeyDown(EntityPlayer aPlayer) { + return false; + } + + /** + * Adds a Valuable Ore to the Miner + */ + public static boolean addValuableOre(Block aBlock, int aMeta, int aValue) { + if (aValue <= 0) return false; + try { + Class.forName("ic2.core.IC2") + .getMethod("addValuableOre", IRecipeInput.class, int.class) + .invoke(null, new RecipeInputItemStack(new ItemStack(aBlock, 1, aMeta)), aValue); + } catch (Throwable e) { + /* Do nothing */ + } + return true; + } + + /** + * Adds a Scrapbox Drop. Fails at April first for the "suddenly Hoes"-Feature of IC2 + */ + public static boolean addScrapboxDrop(float aChance, ItemStack aOutput) { + aOutput = GTOreDictUnificator.get(true, aOutput); + if (aOutput == null || aChance <= 0) return false; + aOutput.stackSize = 1; + if (GTConfig.troll && !GTUtility.areStacksEqual(aOutput, new ItemStack(Items.wooden_hoe, 1, 0))) return false; + try { + GTUtility.callMethod( + GTUtility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true), + "addDrop", + true, + false, + true, + GTUtility.copyOrNull(aOutput), + aChance); + GTUtility.callMethod( + GTUtility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true), + "addRecipe", + true, + true, + false, + GTUtility.copyOrNull(aOutput), + aChance); + } catch (Throwable e) { + /* Do nothing */ + } + return true; + } + + /** + * Adds an Item to the Recycler Blacklist + */ + public static boolean addToRecyclerBlackList(ItemStack aRecycledStack) { + if (aRecycledStack == null) return false; + try { + ic2.api.recipe.Recipes.recyclerBlacklist.add(new RecipeInputItemStack(aRecycledStack)); + } catch (Throwable e) { + /* Do nothing */ + } + return true; + } + + /** + * Just simple Furnace smelting. Unbelievable how Minecraft fails at making a simple ItemStack->ItemStack mapping... + */ + public static boolean addSmeltingRecipe(ItemStack aInput, ItemStack aOutput) { + aOutput = GTOreDictUnificator.get(true, aOutput); + if (aInput == null || aOutput == null) return false; + FurnaceRecipes.smelting() + .func_151394_a(aInput, GTUtility.copyOrNull(aOutput), 0.0F); + return true; + } + + /** + * Adds to Furnace AND Alloy Smelter + */ + public static boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aInput, ItemStack aOutput, boolean hidden) { + if (aInput == null || aOutput == null) { + return false; + } + boolean temp = aInput.stackSize == 1 && addSmeltingRecipe(aInput, aOutput); + ItemStack input2 = OrePrefixes.ingot.contains(aOutput) ? ItemList.Shape_Mold_Ingot.get(0) + : OrePrefixes.block.contains(aOutput) ? ItemList.Shape_Mold_Block.get(0) + : OrePrefixes.nugget.contains(aOutput) ? ItemList.Shape_Mold_Nugget.get(0) : null; + if (Materials.Graphite.contains(aInput)) { + return false; + } + if ((input2 == null) && ((OrePrefixes.ingot.contains(aInput)) || (OrePrefixes.dust.contains(aInput)) + || (OrePrefixes.gem.contains(aInput)))) { + return false; + } + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); + if (input2 == null) { + recipeBuilder.itemInputs(aInput); + } else { + recipeBuilder.itemInputs(aInput, input2); + } + recipeBuilder.itemOutputs(aOutput) + .duration(6 * SECONDS + 10 * TICKS) + .eut(3) + .recipeCategory(RecipeCategories.alloySmelterRecycling); + if (hidden) { + recipeBuilder.hidden(); + } + recipeBuilder.addTo(alloySmelterRecipes); + return true; + } + + /** + * Removes IC2 recipes. + */ + public static void removeAllIC2Recipes() { + getMaceratorRecipeList().entrySet() + .clear(); + getCompressorRecipeList().entrySet() + .clear(); + getExtractorRecipeList().entrySet() + .clear(); + getOreWashingRecipeList().entrySet() + .clear(); + getThermalCentrifugeRecipeList().entrySet() + .clear(); + } + + /** + * Adds GT versions of the IC2 recipes from the supplied IC2RecipeList. Deprecated because all IC2 recipes + * have been manually added to GT. + */ + @Deprecated + public static void addIC2RecipesToGT(Map aIC2RecipeList, RecipeMap aGTRecipeMap, + boolean aAddGTRecipe, boolean aRemoveIC2Recipe, boolean aExcludeGTIC2Items) { + Map aRecipesToRemove = new HashMap<>(); + for (Entry iRecipeInputRecipeOutputEntry : aIC2RecipeList.entrySet()) { + if (iRecipeInputRecipeOutputEntry.getValue().items.isEmpty()) { + continue; + } + + for (ItemStack tStack : (iRecipeInputRecipeOutputEntry.getKey()).getInputs()) { + if (!GTUtility.isStackValid(tStack)) { + continue; + } + + if (aAddGTRecipe) { + try { + if (aExcludeGTIC2Items && ((tStack.getUnlocalizedName() + .contains("gt.metaitem.01") + || tStack.getUnlocalizedName() + .contains("gt.blockores") + || tStack.getUnlocalizedName() + .contains("ic2.itemCrushed") + || tStack.getUnlocalizedName() + .contains("ic2.itemPurifiedCrushed")))) + continue; + switch (aGTRecipeMap.unlocalizedName) { + case "gt.recipe.macerator", "gt.recipe.extractor", "gt.recipe.compressor" -> GTValues.RA + .stdBuilder() + .itemInputs( + GTUtility.copyAmount( + iRecipeInputRecipeOutputEntry.getKey() + .getAmount(), + tStack)) + .itemOutputs(iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0])) + .duration(15 * SECONDS) + .eut(2) + .addTo(aGTRecipeMap); + case "gt.recipe.thermalcentrifuge" -> GTValues.RA.stdBuilder() + .itemInputs( + GTUtility.copyAmount( + iRecipeInputRecipeOutputEntry.getKey() + .getAmount(), + tStack)) + .itemOutputs(iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0])) + .duration(25 * SECONDS) + .eut(48) + .addTo(aGTRecipeMap); + } + } catch (Exception e) { + e.printStackTrace(GTLog.err); + } + } + if (aRemoveIC2Recipe) { + aRecipesToRemove.put(tStack, iRecipeInputRecipeOutputEntry.getValue().items.get(0)); + } + + } + + } + GTUtility.bulkRemoveSimpleIC2MachineRecipe(aRecipesToRemove, aIC2RecipeList); + } + + public static Map getExtractorRecipeList() { + try { + return ic2.api.recipe.Recipes.extractor.getRecipes(); + } catch (Throwable e) { + /* Do nothing */ + } + return emptyRecipeMap; + } + + public static Map getCompressorRecipeList() { + try { + return ic2.api.recipe.Recipes.compressor.getRecipes(); + } catch (Throwable e) { + /* Do nothing */ + } + return emptyRecipeMap; + } + + public static Map getMaceratorRecipeList() { + try { + return ic2.api.recipe.Recipes.macerator.getRecipes(); + } catch (Throwable e) { + /* Do nothing */ + } + return emptyRecipeMap; + } + + public static Map getThermalCentrifugeRecipeList() { + try { + return ic2.api.recipe.Recipes.centrifuge.getRecipes(); + } catch (Throwable e) { + /* Do nothing */ + } + return emptyRecipeMap; + } + + public static Map getOreWashingRecipeList() { + try { + return ic2.api.recipe.Recipes.oreWashing.getRecipes(); + } catch (Throwable e) { + /* Do nothing */ + } + return emptyRecipeMap; + } + + /** + * IC2-OreWasher Recipe. Overloads old Recipes automatically + */ + @Deprecated + public static boolean addOreWasherRecipe(ItemStack aInput, int[] aChances, int aWaterAmount, Object... aOutput) { + if (aInput == null || aOutput == null || aOutput.length == 0 || aOutput[0] == null) return false; + RA.stdBuilder() + .itemInputs(aInput) + .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2]) + .outputChances(aChances) + .fluidInputs(GTModHandler.getWater(aWaterAmount)) + .duration(25 * SECONDS) + .eut(16) + .addTo(oreWasherRecipes); + + RA.stdBuilder() + .itemInputs(aInput) + .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2]) + .outputChances(aChances) + .fluidInputs(GTModHandler.getDistilledWater(aWaterAmount / 5)) + .duration(15 * SECONDS) + .eut(16) + .addTo(oreWasherRecipes); + return true; + } + + public static void stopBufferingCraftingRecipes() { + sBufferCraftingRecipes = false; + + bulkRemoveRecipeByOutput(delayedRemovalByOutput); + bulkRemoveByRecipe(delayedRemovalByRecipe); + sBufferRecipeList.forEach(GameRegistry::addRecipe); + + delayedRemovalByOutput.clear(); + delayedRemovalByRecipe.clear(); + sBufferRecipeList.clear(); + } + + /** + * Shapeless Crafting Recipes. Deletes conflicting Recipes too. + */ + public static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, + int[] aEnchantmentLevelsAdded, Object[] aRecipe) { + return addCraftingRecipe( + aResult, + aEnchantmentsAdded, + aEnchantmentLevelsAdded, + false, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + aRecipe); + } + + /** + * Regular Crafting Recipes. Deletes conflicting Recipes too. + *

+ * You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)" + * on them. + *

+ * Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String. + *

+ * Lowercase Letters are reserved for Tools. They are as follows: + *

+ * 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd' + * ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h' + * ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j' + * ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm' + * ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r' + * ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench, + * 'x' ToolDictNames.craftingToolWireCutter, + */ + public static boolean addCraftingRecipe(ItemStack aResult, Object[] aRecipe) { + return addCraftingRecipe(aResult, 0, aRecipe); + } + + /** + * Regular Crafting Recipes. Deletes conflicting Recipes too. + *

+ * You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)" + * on them. + *

+ * Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String. + *

+ * Lowercase Letters are reserved for Tools. They are as follows: + *

+ * 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd' + * ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h' + * ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j' + * ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm' + * ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r' + * ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench, + * 'x' ToolDictNames.craftingToolWireCutter, + */ + public static boolean addCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) { + return addCraftingRecipe( + aResult, + new Enchantment[0], + new int[0], + (aBitMask & RecipeBits.MIRRORED) != 0, + (aBitMask & RecipeBits.BUFFERED) != 0, + (aBitMask & RecipeBits.KEEPNBT) != 0, + (aBitMask & RecipeBits.DISMANTLEABLE) != 0, + (aBitMask & RecipeBits.NOT_REMOVABLE) == 0, + (aBitMask & RecipeBits.REVERSIBLE) != 0, + (aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES) != 0, + (aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT) != 0, + (aBitMask & RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES) != 0, + (aBitMask & RecipeBits.DELETE_ALL_OTHER_NATIVE_RECIPES) != 0, + (aBitMask & RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS) == 0, + (aBitMask & RecipeBits.ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT) != 0, + (aBitMask & RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL) != 0, + aRecipe); + } + + public static boolean addMachineCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe, + int machineTier) { + if (aRecipe != null) { + for (int i = 3; i < aRecipe.length; i++) { + if (!(aRecipe[i] instanceof MTEBasicMachineWithRecipe.X)) continue; + + // spotless:off + aRecipe[i] = switch ((MTEBasicMachineWithRecipe.X) aRecipe[i]) { + case CIRCUIT -> Tier.ELECTRIC[machineTier].mManagingObject; + case BETTER_CIRCUIT -> Tier.ELECTRIC[machineTier].mBetterManagingObject; + case HULL -> Tier.ELECTRIC[machineTier].mHullObject; + case WIRE -> Tier.ELECTRIC[machineTier].mConductingObject; + case WIRE4 -> Tier.ELECTRIC[machineTier].mLargerConductingObject; + case STICK_DISTILLATION -> OrePrefixes.stick.get(Materials.Blaze); + + case GLASS -> switch (machineTier) { + case 0, 1, 2, 3 -> new ItemStack(Blocks.glass, 1, W); + case 4, 5, 6, 7, 8 -> "blockGlass" + VN[machineTier]; + default -> "blockGlass" + VN[8]; + }; + + case PLATE -> switch (machineTier) { + case 0, 1 -> OrePrefixes.plate.get(Materials.Steel); + case 2 -> OrePrefixes.plate.get(Materials.Aluminium); + case 3 -> OrePrefixes.plate.get(Materials.StainlessSteel); + case 4 -> OrePrefixes.plate.get(Materials.Titanium); + case 5 -> OrePrefixes.plate.get(Materials.TungstenSteel); + case 6 -> OrePrefixes.plate.get(Materials.HSSG); + case 7 -> OrePrefixes.plate.get(Materials.HSSE); + default -> OrePrefixes.plate.get(Materials.Neutronium); + }; + + case PIPE -> switch (machineTier) { + case 0, 1 -> OrePrefixes.pipeMedium.get(Materials.Bronze); + case 2 -> OrePrefixes.pipeMedium.get(Materials.Steel); + case 3 -> OrePrefixes.pipeMedium.get(Materials.StainlessSteel); + case 4 -> OrePrefixes.pipeMedium.get(Materials.Titanium); + case 5 -> OrePrefixes.pipeMedium.get(Materials.TungstenSteel); + case 6 -> OrePrefixes.pipeSmall.get(Materials.Ultimate); + case 7 -> OrePrefixes.pipeMedium.get(Materials.Ultimate); + case 8 -> OrePrefixes.pipeLarge.get(Materials.Ultimate); + default -> OrePrefixes.pipeHuge.get(Materials.Ultimate); + }; + + case COIL_HEATING -> switch (machineTier) { + case 0, 1 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); + case 2 -> OrePrefixes.wireGt02.get(Materials.Cupronickel); + case 3 -> OrePrefixes.wireGt02.get(Materials.Kanthal); + case 4 -> OrePrefixes.wireGt02.get(Materials.Nichrome); + case 5 -> OrePrefixes.wireGt02.get(Materials.TPV); + case 6 -> OrePrefixes.wireGt02.get(Materials.HSSG); + case 7 -> OrePrefixes.wireGt02.get(Materials.Naquadah); + case 8 -> OrePrefixes.wireGt02.get(Materials.NaquadahAlloy); + case 9 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); + default -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); + }; + + case COIL_HEATING_DOUBLE -> switch (machineTier) { + case 0, 1 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); + case 2 -> OrePrefixes.wireGt04.get(Materials.Cupronickel); + case 3 -> OrePrefixes.wireGt04.get(Materials.Kanthal); + case 4 -> OrePrefixes.wireGt04.get(Materials.Nichrome); + case 5 -> OrePrefixes.wireGt04.get(Materials.TPV); + case 6 -> OrePrefixes.wireGt04.get(Materials.HSSG); + case 7 -> OrePrefixes.wireGt04.get(Materials.Naquadah); + case 8 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); + case 9 -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); + default -> OrePrefixes.wireGt16.get(Materials.NaquadahAlloy); + }; + + case STICK_MAGNETIC -> switch (machineTier) { + case 0, 1 -> OrePrefixes.stick.get(Materials.IronMagnetic); + case 2, 3 -> OrePrefixes.stick.get(Materials.SteelMagnetic); + case 4, 5 -> OrePrefixes.stick.get(Materials.NeodymiumMagnetic); + case 6, 7, 8, 9 -> OrePrefixes.stick.get(Materials.SamariumMagnetic); + default -> OrePrefixes.stick.get(Materials.TengamAttuned); + }; + + case STICK_ELECTROMAGNETIC -> switch (machineTier) { + case 0, 1 -> OrePrefixes.stick.get(Materials.AnyIron); + case 2, 3 -> OrePrefixes.stick.get(Materials.Steel); + case 4 -> OrePrefixes.stick.get(Materials.Neodymium); + default -> OrePrefixes.stick.get(Materials.VanadiumGallium); + }; + + case COIL_ELECTRIC -> switch (machineTier) { + case 0 -> OrePrefixes.wireGt01.get(Materials.Lead); + case 1 -> OrePrefixes.wireGt02.get(Materials.Tin); + case 2 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); + case 3 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); + case 4 -> OrePrefixes.wireGt08.get(Materials.AnnealedCopper); + case 5 -> OrePrefixes.wireGt16.get(Materials.AnnealedCopper); + case 6 -> OrePrefixes.wireGt04.get(Materials.YttriumBariumCuprate); + case 7 -> OrePrefixes.wireGt08.get(Materials.Iridium); + default -> OrePrefixes.wireGt16.get(Materials.Osmium); + }; + + case ROBOT_ARM -> switch (machineTier) { + case 0, 1 -> ItemList.Robot_Arm_LV; + case 2 -> ItemList.Robot_Arm_MV; + case 3 -> ItemList.Robot_Arm_HV; + case 4 -> ItemList.Robot_Arm_EV; + case 5 -> ItemList.Robot_Arm_IV; + case 6 -> ItemList.Robot_Arm_LuV; + case 7 -> ItemList.Robot_Arm_ZPM; + case 8 -> ItemList.Robot_Arm_UV; + case 9 -> ItemList.Robot_Arm_UHV; + case 10 -> ItemList.Robot_Arm_UEV; + case 11 -> ItemList.Robot_Arm_UIV; + case 12 -> ItemList.Robot_Arm_UMV; + case 13 -> ItemList.Robot_Arm_UXV; + default -> ItemList.Robot_Arm_MAX; + }; + + case PUMP -> switch (machineTier) { + case 0, 1 -> ItemList.Electric_Pump_LV; + case 2 -> ItemList.Electric_Pump_MV; + case 3 -> ItemList.Electric_Pump_HV; + case 4 -> ItemList.Electric_Pump_EV; + case 5 -> ItemList.Electric_Pump_IV; + case 6 -> ItemList.Electric_Pump_LuV; + case 7 -> ItemList.Electric_Pump_ZPM; + case 8 -> ItemList.Electric_Pump_UV; + case 9 -> ItemList.Electric_Pump_UHV; + case 10 -> ItemList.Electric_Pump_UEV; + case 11 -> ItemList.Electric_Pump_UIV; + case 12 -> ItemList.Electric_Pump_UMV; + case 13 -> ItemList.Electric_Pump_UXV; + default -> ItemList.Electric_Pump_MAX; + }; + + case MOTOR -> switch (machineTier) { + case 0, 1 -> ItemList.Electric_Motor_LV; + case 2 -> ItemList.Electric_Motor_MV; + case 3 -> ItemList.Electric_Motor_HV; + case 4 -> ItemList.Electric_Motor_EV; + case 5 -> ItemList.Electric_Motor_IV; + case 6 -> ItemList.Electric_Motor_LuV; + case 7 -> ItemList.Electric_Motor_ZPM; + case 8 -> ItemList.Electric_Motor_UV; + case 9 -> ItemList.Electric_Motor_UHV; + case 10 -> ItemList.Electric_Motor_UEV; + case 11 -> ItemList.Electric_Motor_UIV; + case 12 -> ItemList.Electric_Motor_UMV; + case 13 -> ItemList.Electric_Motor_UXV; + default -> ItemList.Electric_Motor_MAX; + }; + + case PISTON -> switch (machineTier) { + case 0, 1 -> ItemList.Electric_Piston_LV; + case 2 -> ItemList.Electric_Piston_MV; + case 3 -> ItemList.Electric_Piston_HV; + case 4 -> ItemList.Electric_Piston_EV; + case 5 -> ItemList.Electric_Piston_IV; + case 6 -> ItemList.Electric_Piston_LuV; + case 7 -> ItemList.Electric_Piston_ZPM; + case 8 -> ItemList.Electric_Piston_UV; + case 9 -> ItemList.Electric_Piston_UHV; + case 10 -> ItemList.Electric_Piston_UEV; + case 11 -> ItemList.Electric_Piston_UIV; + case 12 -> ItemList.Electric_Piston_UMV; + case 13 -> ItemList.Electric_Piston_UXV; + default -> ItemList.Electric_Piston_MAX; + }; + + case CONVEYOR -> switch (machineTier) { + case 0, 1 -> ItemList.Conveyor_Module_LV; + case 2 -> ItemList.Conveyor_Module_MV; + case 3 -> ItemList.Conveyor_Module_HV; + case 4 -> ItemList.Conveyor_Module_EV; + case 5 -> ItemList.Conveyor_Module_IV; + case 6 -> ItemList.Conveyor_Module_LuV; + case 7 -> ItemList.Conveyor_Module_ZPM; + case 8 -> ItemList.Conveyor_Module_UV; + case 9 -> ItemList.Conveyor_Module_UHV; + case 10 -> ItemList.Conveyor_Module_UEV; + case 11 -> ItemList.Conveyor_Module_UIV; + case 12 -> ItemList.Conveyor_Module_UMV; + case 13 -> ItemList.Conveyor_Module_UXV; + default -> ItemList.Conveyor_Module_MAX; + }; + + case EMITTER -> switch (machineTier) { + case 0, 1 -> ItemList.Emitter_LV; + case 2 -> ItemList.Emitter_MV; + case 3 -> ItemList.Emitter_HV; + case 4 -> ItemList.Emitter_EV; + case 5 -> ItemList.Emitter_IV; + case 6 -> ItemList.Emitter_LuV; + case 7 -> ItemList.Emitter_ZPM; + case 8 -> ItemList.Emitter_UV; + case 9 -> ItemList.Emitter_UHV; + case 10 -> ItemList.Emitter_UEV; + case 11 -> ItemList.Emitter_UIV; + case 12 -> ItemList.Emitter_UMV; + case 13 -> ItemList.Emitter_UXV; + default -> ItemList.Emitter_MAX; + }; + + case SENSOR -> switch (machineTier) { + case 0, 1 -> ItemList.Sensor_LV; + case 2 -> ItemList.Sensor_MV; + case 3 -> ItemList.Sensor_HV; + case 4 -> ItemList.Sensor_EV; + case 5 -> ItemList.Sensor_IV; + case 6 -> ItemList.Sensor_LuV; + case 7 -> ItemList.Sensor_ZPM; + case 8 -> ItemList.Sensor_UV; + case 9 -> ItemList.Sensor_UHV; + case 10 -> ItemList.Sensor_UEV; + case 11 -> ItemList.Sensor_UIV; + case 12 -> ItemList.Sensor_UMV; + case 13 -> ItemList.Sensor_UXV; + default -> ItemList.Sensor_MAX; + }; + + case FIELD_GENERATOR -> switch (machineTier) { + case 0, 1 -> ItemList.Field_Generator_LV; + case 2 -> ItemList.Field_Generator_MV; + case 3 -> ItemList.Field_Generator_HV; + case 4 -> ItemList.Field_Generator_EV; + case 5 -> ItemList.Field_Generator_IV; + case 6 -> ItemList.Field_Generator_LuV; + case 7 -> ItemList.Field_Generator_ZPM; + case 8 -> ItemList.Field_Generator_UV; + case 9 -> ItemList.Field_Generator_UHV; + case 10 -> ItemList.Field_Generator_UEV; + case 11 -> ItemList.Field_Generator_UIV; + case 12 -> ItemList.Field_Generator_UMV; + case 13 -> ItemList.Field_Generator_UXV; + default -> ItemList.Field_Generator_MAX; + }; + + case ROTOR -> switch (machineTier) { + case 0, 1 -> OrePrefixes.rotor.get(Materials.Tin); + case 2 -> OrePrefixes.rotor.get(Materials.Bronze); + case 3 -> OrePrefixes.rotor.get(Materials.Steel); + case 4 -> OrePrefixes.rotor.get(Materials.StainlessSteel); + case 5 -> OrePrefixes.rotor.get(Materials.TungstenSteel); + case 6 -> OrePrefixes.rotor.get(ExternalMaterials.getRhodiumPlatedPalladium()); + case 7 -> OrePrefixes.rotor.get(Materials.Iridium); + default -> OrePrefixes.rotor.get(Materials.Osmium); + }; + + default -> throw new IllegalArgumentException("MISSING TIER MAPPING FOR: " + aRecipe[i] + " AT TIER " + machineTier); + }; + // spotless:on + } + + if (!GTModHandler.addCraftingRecipe( + aResult, + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.BUFFERED + | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + aRecipe)) { + throw new IllegalArgumentException("INVALID CRAFTING RECIPE FOR: " + aResult.getDisplayName()); + } + } + return true; + } + + /** + * Internal realisation of the Crafting Recipe adding Process. + */ + private static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, + int[] aEnchantmentLevelsAdded, boolean aMirrored, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable, + boolean aRemovable, boolean aReversible, boolean aRemoveAllOthersWithSameOutput, + boolean aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT, boolean aRemoveAllOtherShapedsWithSameOutput, + boolean aRemoveAllOtherNativeRecipes, boolean aCheckForCollisions, + boolean aOnlyAddIfThereIsAnyRecipeOutputtingThis, boolean aOnlyAddIfResultIsNotNull, Object[] aRecipe) { + + aResult = GTOreDictUnificator.get(true, aResult); + if (aOnlyAddIfResultIsNotNull && aResult == null) return false; + if (aResult != null && Items.feather.getDamage(aResult) == W) Items.feather.setDamage(aResult, 0); + if (aRecipe == null || aRecipe.length == 0) return false; + + // The renamed variable clarifies what's happening + // noinspection UnnecessaryLocalVariable + boolean tDoWeCareIfThereWasARecipe = aOnlyAddIfThereIsAnyRecipeOutputtingThis; + boolean tThereWasARecipe = false; + + for (byte i = 0; i < aRecipe.length; i++) { + if (aRecipe[i] instanceof IItemContainer) aRecipe[i] = ((IItemContainer) aRecipe[i]).get(1); + else if (aRecipe[i] instanceof Enum) aRecipe[i] = ((Enum) aRecipe[i]).name(); + else if (!(aRecipe[i] == null || aRecipe[i] instanceof ItemStack + || aRecipe[i] instanceof ItemData + || aRecipe[i] instanceof String + || aRecipe[i] instanceof Character)) aRecipe[i] = aRecipe[i].toString(); + } + + try { + StringBuilder shape = new StringBuilder(E); + int idx = 0; + if (aRecipe[idx] instanceof Boolean) { + throw new IllegalArgumentException(); + } + + ArrayList tRecipeList = new ArrayList<>(Arrays.asList(aRecipe)); + + while (aRecipe[idx] instanceof String) { + StringBuilder s = new StringBuilder((String) aRecipe[idx++]); + shape.append(s); + while (s.length() < 3) s.append(" "); + if (s.length() > 3) throw new IllegalArgumentException(); + + for (char c : s.toString() + .toCharArray()) { + switch (c) { + case 'b' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolBlade.name()); + } + case 'c' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolCrowbar.name()); + } + case 'd' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolScrewdriver.name()); + } + case 'f' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolFile.name()); + } + case 'h' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolHardHammer.name()); + } + case 'i' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolSolderingIron.name()); + } + case 'j' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolSolderingMetal.name()); + } + case 'k' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolKnife.name()); + } + case 'm' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolMortar.name()); + } + case 'p' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolDrawplate.name()); + } + case 'r' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolSoftHammer.name()); + } + case 's' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolSaw.name()); + } + case 'w' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolWrench.name()); + } + case 'x' -> { + tRecipeList.add(c); + tRecipeList.add(ToolDictNames.craftingToolWireCutter.name()); + } + } + } + } + + aRecipe = tRecipeList.toArray(); + + if (aRecipe[idx] instanceof Boolean) { + idx++; + } + Map tItemStackMap = new HashMap<>(); + Map 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) { + GTLog.err.println( + "WARNING: Missing Item for shaped Recipe: " + + (aResult == null ? "null" : aResult.getDisplayName())); + for (Object tContent : aRecipe) GTLog.err.println(tContent); + } + return false; + } + Character chr = (Character) aRecipe[idx]; + Object in = aRecipe[idx + 1]; + if (in instanceof ItemStack is) { + tItemStackMap.put(chr, GTUtility.copyOrNull(is)); + tItemDataMap.put(chr, GTOreDictUnificator.getItemData(is)); + } else if (in instanceof ItemData) { + String tString = in.toString(); + switch (tString) { + case "plankWood" -> tItemDataMap.put(chr, new ItemData(Materials.Wood, M)); + case "stoneNetherrack" -> tItemDataMap.put(chr, new ItemData(Materials.Netherrack, M)); + case "stoneObsidian" -> tItemDataMap.put(chr, new ItemData(Materials.Obsidian, M)); + case "stoneEndstone" -> tItemDataMap.put(chr, new ItemData(Materials.Endstone, M)); + default -> tItemDataMap.put(chr, (ItemData) in); + } + ItemStack tStack = GTOreDictUnificator.getFirstOre(in, 1); + if (tStack == null) tRemoveRecipe = false; + else tItemStackMap.put(chr, tStack); + in = aRecipe[idx + 1] = in.toString(); + } else if (in instanceof String) { + if (in.equals(OreDictNames.craftingChest.toString())) + tItemDataMap.put(chr, new ItemData(Materials.Wood, M * 8)); + else if (in.equals(OreDictNames.craftingBook.toString())) + tItemDataMap.put(chr, new ItemData(Materials.Paper, M * 3)); + else if (in.equals(OreDictNames.craftingPiston.toString())) + tItemDataMap.put(chr, new ItemData(Materials.Stone, M * 4, Materials.Wood, M * 3)); + else if (in.equals(OreDictNames.craftingFurnace.toString())) + tItemDataMap.put(chr, new ItemData(Materials.Stone, M * 8)); + else if (in.equals(OreDictNames.craftingIndustrialDiamond.toString())) + tItemDataMap.put(chr, new ItemData(Materials.Diamond, M)); + else if (in.equals(OreDictNames.craftingAnvil.toString())) + tItemDataMap.put(chr, new ItemData(Materials.Iron, M * 10)); + ItemStack tStack = GTOreDictUnificator.getFirstOre(in, 1); + if (tStack == null) tRemoveRecipe = false; + else tItemStackMap.put(chr, tStack); + } else { + throw new IllegalArgumentException(); + } + } + + if (aReversible && aResult != null) { + ItemData[] tData = new ItemData[9]; + int x = -1; + for (char chr : shape.toString() + .toCharArray()) tData[++x] = tItemDataMap.get(chr); + if (GTUtility.arrayContainsNonNull(tData)) + GTOreDictUnificator.addItemData(aResult, new ItemData(tData)); + } + + if (aCheckForCollisions && tRemoveRecipe) { + ItemStack[] tRecipe = new ItemStack[9]; + int x = -1; + for (char chr : shape.toString() + .toCharArray()) { + tRecipe[++x] = tItemStackMap.get(chr); + if (tRecipe[x] != null && Items.feather.getDamage(tRecipe[x]) == W) + Items.feather.setDamage(tRecipe[x], 0); + } + if (tDoWeCareIfThereWasARecipe || !aBuffered) tThereWasARecipe = removeRecipe(tRecipe) != null; + else removeRecipeDelayed(tRecipe); + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + + if (aResult == null || aResult.stackSize <= 0) return false; + + if (aRemoveAllOthersWithSameOutput || aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT + || aRemoveAllOtherShapedsWithSameOutput + || aRemoveAllOtherNativeRecipes) { + if (tDoWeCareIfThereWasARecipe || !aBuffered) tThereWasARecipe = removeRecipeByOutput( + aResult, + !aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT, + aRemoveAllOtherShapedsWithSameOutput, + aRemoveAllOtherNativeRecipes) || tThereWasARecipe; + else removeRecipeByOutputDelayed(aResult); + } + + if (aOnlyAddIfThereIsAnyRecipeOutputtingThis && !tDoWeCareIfThereWasARecipe && !tThereWasARecipe) { + ArrayList tList = (ArrayList) CraftingManager.getInstance() + .getRecipeList(); + int tList_sS = tList.size(); + for (int i = 0; i < tList_sS && !tThereWasARecipe; i++) { + IRecipe tRecipe = tList.get(i); + if (sSpecialRecipeClasses.contains( + tRecipe.getClass() + .getName())) + continue; + if (GTUtility.areStacksEqual(GTOreDictUnificator.get(tRecipe.getRecipeOutput()), aResult, true)) { + tList.remove(i--); + tList_sS = tList.size(); + tThereWasARecipe = true; + } + } + } + + if (Items.feather.getDamage(aResult) == W || Items.feather.getDamage(aResult) < 0) + Items.feather.setDamage(aResult, 0); + + GTUtility.updateItemStack(aResult); + + if (tThereWasARecipe || !aOnlyAddIfThereIsAnyRecipeOutputtingThis) { + if (sBufferCraftingRecipes && aBuffered) sBufferRecipeList.add( + new GTShapedRecipe( + GTUtility.copyOrNull(aResult), + aDismantleable, + aRemovable, + aKeepNBT, + aEnchantmentsAdded, + aEnchantmentLevelsAdded, + aRecipe).setMirrored(aMirrored)); + else GameRegistry.addRecipe( + new GTShapedRecipe( + GTUtility.copyOrNull(aResult), + aDismantleable, + aRemovable, + aKeepNBT, + aEnchantmentsAdded, + aEnchantmentLevelsAdded, + aRecipe).setMirrored(aMirrored)); + } + return true; + } + + /** + * Shapeless Crafting Recipes. Deletes conflicting Recipes too. + */ + public static boolean addShapelessEnchantingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, + int[] aEnchantmentLevelsAdded, Object[] aRecipe) { + return addShapelessCraftingRecipe( + aResult, + aEnchantmentsAdded, + aEnchantmentLevelsAdded, + true, + false, + false, + false, + aRecipe); + } + + /** + * Shapeless Crafting Recipes. Deletes conflicting Recipes too. + */ + public static boolean addShapelessCraftingRecipe(ItemStack aResult, Object[] aRecipe) { + return addShapelessCraftingRecipe( + aResult, + RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | RecipeBits.BUFFERED, + aRecipe); + } + + /** + * Shapeless Crafting Recipes. Deletes conflicting Recipes too. + */ + public static boolean addShapelessCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) { + return addShapelessCraftingRecipe( + aResult, + new Enchantment[0], + new int[0], + (aBitMask & RecipeBits.BUFFERED) != 0, + (aBitMask & RecipeBits.KEEPNBT) != 0, + (aBitMask & RecipeBits.DISMANTLEABLE) != 0, + (aBitMask & RecipeBits.NOT_REMOVABLE) == 0, + aRecipe); + } + + /** + * Shapeless Crafting Recipes. Deletes conflicting Recipes too. + */ + private static boolean addShapelessCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, + int[] aEnchantmentLevelsAdded, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable, boolean aRemovable, + Object[] aRecipe) { + aResult = GTOreDictUnificator.get(true, aResult); + if (aRecipe == null || aRecipe.length == 0) return false; + for (byte i = 0; i < aRecipe.length; i++) { + if (aRecipe[i] instanceof IItemContainer) aRecipe[i] = ((IItemContainer) aRecipe[i]).get(1); + else if (aRecipe[i] instanceof Enum) aRecipe[i] = ((Enum) aRecipe[i]).name(); + else if (!(aRecipe[i] == null || aRecipe[i] instanceof ItemStack + || aRecipe[i] instanceof String + || aRecipe[i] instanceof Character)) aRecipe[i] = aRecipe[i].toString(); + } + try { + ItemStack[] tRecipe = new ItemStack[9]; + int i = 0; + for (Object tObject : aRecipe) { + if (tObject == null) { + if (D1) GTLog.err.println( + "WARNING: Missing Item for shapeless Recipe: " + + (aResult == null ? "null" : aResult.getDisplayName())); + for (Object tContent : aRecipe) GTLog.err.println(tContent); + return false; + } + if (tObject instanceof ItemStack) { + tRecipe[i] = (ItemStack) tObject; + } else if (tObject instanceof String) { + tRecipe[i] = GTOreDictUnificator.getFirstOre(tObject, 1); + if (tRecipe[i] == null) break; + } + i++; + } + if (sBufferCraftingRecipes && aBuffered) removeRecipeDelayed(tRecipe); + else removeRecipe(tRecipe); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + + if (aResult == null || aResult.stackSize <= 0) return false; + + if (Items.feather.getDamage(aResult) == W || Items.feather.getDamage(aResult) < 0) + Items.feather.setDamage(aResult, 0); + + GTUtility.updateItemStack(aResult); + + if (sBufferCraftingRecipes && aBuffered) sBufferRecipeList.add( + new GTShapelessRecipe( + GTUtility.copyOrNull(aResult), + aDismantleable, + aRemovable, + aKeepNBT, + aEnchantmentsAdded, + aEnchantmentLevelsAdded, + aRecipe)); + else GameRegistry.addRecipe( + new GTShapelessRecipe( + GTUtility.copyOrNull(aResult), + aDismantleable, + aRemovable, + aKeepNBT, + aEnchantmentsAdded, + aEnchantmentLevelsAdded, + aRecipe)); + return true; + } + + /** + * Removes a Smelting Recipe + */ + public static boolean removeFurnaceSmelting(ItemStack aInput) { + if (aInput != null) { + for (ItemStack tInput : FurnaceRecipes.smelting() + .getSmeltingList() + .keySet()) { + if (GTUtility.isStackValid(tInput) && GTUtility.areStacksEqual(aInput, tInput, true)) { + FurnaceRecipes.smelting() + .getSmeltingList() + .remove(tInput); + return true; + } + } + } + return false; + } + + /** + * Removes all matching Smelting Recipes by output + */ + public static boolean removeFurnaceSmeltingByOutput(ItemStack aOutput) { + if (aOutput != null) { + return FurnaceRecipes.smelting() + .getSmeltingList() + .values() + .removeIf( + tOutput -> GTUtility.isStackValid(tOutput) && GTUtility.areStacksEqual(aOutput, tOutput, true)); + } + return false; + } + + /** + * Removes a Crafting Recipe and gives you the former output of it. + * + * @param aRecipe The content of the Crafting Grid as ItemStackArray with length 9 + * @return the output of the old Recipe or null if there was nothing. + */ + public static ItemStack removeRecipe(ItemStack... aRecipe) { + if (aRecipe == null) return null; + if (Arrays.stream(aRecipe) + .noneMatch(Objects::nonNull)) return null; + + ItemStack rReturn = null; + InventoryCrafting aCrafting = new InventoryCrafting(new Container() { + + @Override + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, 3, 3); + for (int i = 0; i < aRecipe.length && i < 9; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); + ArrayList tList = (ArrayList) CraftingManager.getInstance() + .getRecipeList(); + int tList_sS = tList.size(); + try { + for (int i = 0; i < tList_sS; i++) { + for (; i < tList_sS; i++) { + if ((!(tList.get(i) instanceof IGTCraftingRecipe) + || ((IGTCraftingRecipe) tList.get(i)).isRemovable()) && tList.get(i) + .matches(aCrafting, DW)) { + rReturn = tList.get(i) + .getCraftingResult(aCrafting); + if (rReturn != null) tList.remove(i--); + tList_sS = tList.size(); + } + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + return rReturn; + } + + public static void removeRecipeDelayed(ItemStack... aRecipe) { + if (!sBufferCraftingRecipes) { + removeRecipe(aRecipe); + return; + } + + if (aRecipe == null) return; + if (Arrays.stream(aRecipe) + .noneMatch(Objects::nonNull)) return; + + InventoryCrafting aCrafting = new InventoryCrafting(new Container() { + + @Override + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, 3, 3); + for (int i = 0; i < aRecipe.length && i < 9; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); + delayedRemovalByRecipe.add(aCrafting); + } + + public static void bulkRemoveByRecipe(List toRemove) { + ArrayList tList = (ArrayList) CraftingManager.getInstance() + .getRecipeList(); + GT_FML_LOGGER.info("BulkRemoveByRecipe: tList: " + tList.size() + " toRemove: " + toRemove.size()); + + Set tListToRemove = tList.parallelStream() + .filter(tRecipe -> { + if ((tRecipe instanceof IGTCraftingRecipe) && !((IGTCraftingRecipe) tRecipe).isRemovable()) + return false; + return toRemove.stream() + .anyMatch(aCrafting -> tRecipe.matches(aCrafting, DW)); + }) + .collect(Collectors.toSet()); + + tList.removeIf(tListToRemove::contains); + } + + public static boolean removeRecipeByOutputDelayed(ItemStack aOutput) { + if (sBufferCraftingRecipes) return delayedRemovalByOutput.add(aOutput); + else return removeRecipeByOutput(aOutput); + } + + public static boolean removeRecipeByOutputDelayed(ItemStack aOutput, boolean aIgnoreNBT, + boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) { + if (sBufferCraftingRecipes && (aIgnoreNBT && !aNotRemoveShapelessRecipes && !aOnlyRemoveNativeHandlers)) + // Too lazy to handle deferred versions of the parameters that aren't used very often + return delayedRemovalByOutput.add(aOutput); + else return removeRecipeByOutput(aOutput, aIgnoreNBT, aNotRemoveShapelessRecipes, aOnlyRemoveNativeHandlers); + } + + public static boolean removeRecipeByOutput(ItemStack aOutput) { + return removeRecipeByOutput(aOutput, true, false, false); + } + + /** + * Removes a Crafting Recipe. + * + * @param aOutput The output of the Recipe. + * @return if it has removed at least one Recipe. + */ + public static boolean removeRecipeByOutput(ItemStack aOutput, boolean aIgnoreNBT, + boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) { + if (aOutput == null) return false; + boolean rReturn = false; + final ArrayList tList = (ArrayList) CraftingManager.getInstance() + .getRecipeList(); + aOutput = GTOreDictUnificator.get(aOutput); + int tList_sS = tList.size(); + for (int i = 0; i < tList_sS; i++) { + final IRecipe tRecipe = tList.get(i); + if (aNotRemoveShapelessRecipes + && (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe)) continue; + if (aOnlyRemoveNativeHandlers) { + if (!sNativeRecipeClasses.contains( + tRecipe.getClass() + .getName())) + continue; + } else { + if (sSpecialRecipeClasses.contains( + tRecipe.getClass() + .getName())) + continue; + } + ItemStack tStack = tRecipe.getRecipeOutput(); + if ((!(tRecipe instanceof IGTCraftingRecipe) || ((IGTCraftingRecipe) tRecipe).isRemovable()) + && GTUtility.areStacksEqual(GTOreDictUnificator.get(tStack), aOutput, aIgnoreNBT)) { + tList.remove(i--); + tList_sS = tList.size(); + rReturn = true; + } + } + return rReturn; + } + + public static boolean bulkRemoveRecipeByOutput(List toRemove) { + ArrayList tList = (ArrayList) CraftingManager.getInstance() + .getRecipeList(); + + Set setToRemove = toRemove.parallelStream() + .map(GTOreDictUnificator::get_nocopy) + .collect(Collectors.toSet()); + + GT_FML_LOGGER.info("BulkRemoveRecipeByOutput: tList: " + tList.size() + " setToRemove: " + setToRemove.size()); + + Set tListToRemove = tList.parallelStream() + .filter(tRecipe -> { + if ((tRecipe instanceof IGTCraftingRecipe) && !((IGTCraftingRecipe) tRecipe).isRemovable()) + return false; + if (sSpecialRecipeClasses.contains( + tRecipe.getClass() + .getName())) + return false; + final ItemStack tStack = GTOreDictUnificator.get_nocopy(tRecipe.getRecipeOutput()); + return setToRemove.stream() + .anyMatch(aOutput -> GTUtility.areStacksEqual(tStack, aOutput, true)); + }) + .collect(Collectors.toSet()); + + tList.removeIf(tListToRemove::contains); + return true; + } + + /** + * Checks all Crafting Handlers for Recipe Output Used for the Autocrafting Table + */ + public static ItemStack getAllRecipeOutput(World aWorld, ItemStack... aRecipe) { + if (aRecipe == null || aRecipe.length == 0) return null; + + if (aWorld == null) aWorld = DW; + + boolean temp = false; + for (ItemStack itemStack : aRecipe) { + if (itemStack != null) { + temp = true; + break; + } + } + if (!temp) return null; + InventoryCrafting aCrafting = new InventoryCrafting(new Container() { + + @Override + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, 3, 3); + for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); + List tList = CraftingManager.getInstance() + .getRecipeList(); + synchronized (sAllRecipeList) { + if (sAllRecipeList.size() != tList.size()) { + sAllRecipeList.clear(); + sAllRecipeList.addAll(tList); + } + for (int i = 0, j = sAllRecipeList.size(); i < j; i++) { + IRecipe tRecipe = sAllRecipeList.get(i); + if (tRecipe.matches(aCrafting, aWorld)) { + if (i > 10) { + sAllRecipeList.remove(i); + sAllRecipeList.add(i - 10, tRecipe); + } + return tRecipe.getCraftingResult(aCrafting); + } + } + } + + int tIndex = 0; + ItemStack tStack1 = null, tStack2 = null; + for (int i = 0, j = aCrafting.getSizeInventory(); i < j; i++) { + ItemStack tStack = aCrafting.getStackInSlot(i); + if (tStack != null) { + if (tIndex == 0) tStack1 = tStack; + if (tIndex == 1) tStack2 = tStack; + tIndex++; + } + } + + if (tIndex == 2 && tStack2 != null) { + if (tStack1.getItem() == tStack2.getItem() && tStack1.stackSize == 1 + && tStack2.stackSize == 1 + && tStack1.getItem() + .isRepairable()) { + int tNewDamage = tStack1.getMaxDamage() + tStack1.getItemDamage() + - tStack2.getItemDamage() + + tStack1.getMaxDamage() / 20; + return new ItemStack(tStack1.getItem(), 1, Math.max(tNewDamage, 0)); + } + } + + return null; + } + + /** + * Gives you a copy of the Output from a Crafting Recipe Used for Recipe Detection. + */ + public static ItemStack getRecipeOutput(ItemStack... aRecipe) { + return getRecipeOutput(false, true, aRecipe); + } + + public static ItemStack getRecipeOutputNoOreDict(ItemStack... aRecipe) { + return getRecipeOutput(false, false, aRecipe); + } + + public static ItemStack getRecipeOutput(boolean aUncopiedStack, ItemStack... aRecipe) { + return getRecipeOutput(aUncopiedStack, true, aRecipe); + } + + /** + * Gives you a copy of the Output from a Crafting Recipe Used for Recipe Detection. + */ + public static ItemStack getRecipeOutput(boolean aUncopiedStack, boolean allowOreDict, ItemStack... aRecipe) { + if (aRecipe == null || Arrays.stream(aRecipe) + .noneMatch(Objects::nonNull)) return null; + + InventoryCrafting aCrafting = new InventoryCrafting(new Container() { + + @Override + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, 3, 3); + for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); + ArrayList tList = (ArrayList) CraftingManager.getInstance() + .getRecipeList(); + boolean found = false; + + for (IRecipe iRecipe : tList) { + found = false; + if (!allowOreDict && iRecipe instanceof ShapedOreRecipe) continue; + + try { + found = iRecipe.matches(aCrafting, DW); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + if (found) { + ItemStack tOutput = aUncopiedStack ? iRecipe.getRecipeOutput() : iRecipe.getCraftingResult(aCrafting); + if (tOutput == null || tOutput.stackSize <= 0) { + // Seriously, who would ever do that shit? + if (!GregTechAPI.sPostloadFinished) throw new GTItsNotMyFaultException( + "Seems another Mod added a Crafting Recipe with null Output. Tell the Developer of said Mod to fix that."); + } else { + if (aUncopiedStack) return tOutput; + return GTUtility.copyOrNull(tOutput); + } + } + } + return null; + } + + /** + * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for + * example This also removes old Recipes from the List. + */ + public static List getVanillyToolRecipeOutputs(ItemStack... aRecipe) { + if (!GregTechAPI.sPostloadStarted || GregTechAPI.sPostloadFinished) sSingleNonBlockDamagableRecipeList.clear(); + if (sSingleNonBlockDamagableRecipeList.isEmpty()) { + for (IRecipe tRecipe : CraftingManager.getInstance() + .getRecipeList()) { + ItemStack tStack = tRecipe.getRecipeOutput(); + if (GTUtility.isStackValid(tStack) && tStack.getMaxStackSize() == 1 + && tStack.getMaxDamage() > 0 + && !(tStack.getItem() instanceof ItemBlock) + && !(tStack.getItem() instanceof IReactorComponent) + && !isElectricItem(tStack) + && !GTUtility.isStackInList(tStack, sNonReplaceableItems)) { + if (!(tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe)) { + if (tRecipe instanceof ShapedOreRecipe) { + boolean temp = true; + for (Object tObject : ((ShapedOreRecipe) tRecipe).getInput()) if (tObject != null) { + if (tObject instanceof ItemStack && (((ItemStack) tObject).getItem() == null + || ((ItemStack) tObject).getMaxStackSize() < 2 + || ((ItemStack) tObject).getMaxDamage() > 0 + || ((ItemStack) tObject).getItem() instanceof ItemBlock)) { + temp = false; + break; + } + if (tObject instanceof List && ((List) tObject).isEmpty()) { + temp = false; + break; + } + } + if (temp) sSingleNonBlockDamagableRecipeList.add(tRecipe); + } else if (tRecipe instanceof ShapedRecipes) { + boolean temp = true; + for (ItemStack tObject : ((ShapedRecipes) tRecipe).recipeItems) { + if (tObject != null && (tObject.getItem() == null || tObject.getMaxStackSize() < 2 + || tObject.getMaxDamage() > 0 + || tObject.getItem() instanceof ItemBlock)) { + temp = false; + break; + } + } + if (temp) sSingleNonBlockDamagableRecipeList.add(tRecipe); + } else { + sSingleNonBlockDamagableRecipeList.add(tRecipe); + } + } + } + } + GTLog.out.println( + "GTMod: Created a List of Tool Recipes containing " + sSingleNonBlockDamagableRecipeList.size() + + " Recipes for recycling." + + (sSingleNonBlockDamagableRecipeList.size() > 1024 + ? " Scanning all these Recipes is the reason for the startup Lag you receive right now." + : E)); + } + List rList = getRecipeOutputs(sSingleNonBlockDamagableRecipeList, true, aRecipe); + if (!GregTechAPI.sPostloadStarted || GregTechAPI.sPostloadFinished) sSingleNonBlockDamagableRecipeList.clear(); + return rList; + } + + /** + * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for + * example + */ + public static List getRecipeOutputs(ItemStack... aRecipe) { + return getRecipeOutputs( + CraftingManager.getInstance() + .getRecipeList(), + false, + aRecipe); + } + + private static List bufferedRecipes = null; + + /** + * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for + * example Buffers a List which only has armor-alike crafting in it + */ + public static List getRecipeOutputsBuffered(ItemStack... aRecipe) { + + if (bufferedRecipes == null) bufferedRecipes = CraftingManager.getInstance() + .getRecipeList() + .stream() + .filter( + tRecipe -> !(tRecipe instanceof ShapelessRecipes) && !(tRecipe instanceof ShapelessOreRecipe) + && !(tRecipe instanceof IGTCraftingRecipe)) + .filter(tRecipe -> { + try { + ItemStack tOutput = tRecipe.getRecipeOutput(); + if (tOutput.stackSize == 1 && tOutput.getMaxDamage() > 0 && tOutput.getMaxStackSize() == 1) { + return true; + } + } catch (Exception ignored) {} + return false; + }) + .collect(Collectors.toList()); + return getRecipeOutputs(bufferedRecipes, false, aRecipe); + } + + /** + * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for + * example + */ + public static List getRecipeOutputs(List aList, boolean aDeleteFromList, ItemStack... aRecipe) { + List rList = new ArrayList<>(); + if (aRecipe == null || Arrays.stream(aRecipe) + .noneMatch(Objects::nonNull)) return rList; + InventoryCrafting aCrafting = new InventoryCrafting(new Container() { + + @Override + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, 3, 3); + for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); + if (!aDeleteFromList) { + HashSet stacks = new HashSet<>(); + aList.stream() + .filter(tRecipe -> { + if (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe + || tRecipe instanceof IGTCraftingRecipe) return false; + try { + return tRecipe.matches(aCrafting, DW); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + return false; + } + }) + .forEach(tRecipe -> stacks.add(tRecipe.getCraftingResult(aCrafting))); + rList = stacks.stream() + .filter( + tOutput -> tOutput.stackSize == 1 && tOutput.getMaxDamage() > 0 && tOutput.getMaxStackSize() == 1) + .collect(Collectors.toList()); + } else for (Iterator iterator = aList.iterator(); iterator.hasNext();) { + IRecipe tRecipe = iterator.next(); + boolean matched = false; + + try { + matched = tRecipe.matches(aCrafting, DW); + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + if (matched) { + ItemStack tOutput = tRecipe.getCraftingResult(aCrafting); + + if (tOutput == null || tOutput.stackSize <= 0) { + // Seriously, who would ever do that shit? + if (!GregTechAPI.sPostloadFinished) throw new GTItsNotMyFaultException( + "Seems another Mod added a Crafting Recipe with null Output. Tell the Developer of said Mod to fix that."); + continue; + } + if (tOutput.stackSize != 1) continue; + if (tOutput.getMaxDamage() <= 0) continue; + if (tOutput.getMaxStackSize() != 1) continue; + if (tRecipe instanceof ShapelessRecipes) continue; + if (tRecipe instanceof ShapelessOreRecipe) continue; + if (tRecipe instanceof IGTCraftingRecipe) continue; + rList.add(GTUtility.copyOrNull(tOutput)); + iterator.remove(); + } + } + return rList; + } + + /** + * Used in my own Furnace. + */ + public static ItemStack getSmeltingOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) { + if (aInput == null || aInput.stackSize < 1) return null; + ItemStack rStack = GTOreDictUnificator.get( + FurnaceRecipes.smelting() + .getSmeltingResult(aInput)); + + if (rStack != null && (aOutputSlot == null || (GTUtility.areStacksEqual(rStack, aOutputSlot) + && rStack.stackSize + aOutputSlot.stackSize <= aOutputSlot.getMaxStackSize()))) { + if (aRemoveInput) aInput.stackSize--; + return rStack; + } + return null; + } + + /** + * Used in my own Machines. Decreases StackSize of the Input if wanted. + *

+ * Checks also if there is enough Space in the Output Slots. + */ + public static ItemStack[] getMachineOutput(ItemStack aInput, Map aRecipeList, + boolean aRemoveInput, NBTTagCompound rRecipeMetaData, ItemStack... aOutputSlots) { + if (aOutputSlots == null || aOutputSlots.length == 0) return new ItemStack[0]; + if (aInput == null) return new ItemStack[aOutputSlots.length]; + try { + for (Entry tEntry : aRecipeList.entrySet()) { + if (tEntry.getKey() + .matches(aInput)) { + if (tEntry.getKey() + .getAmount() <= aInput.stackSize) { + ItemStack[] tList = tEntry.getValue().items.toArray(new ItemStack[0]); + if (tList.length == 0) break; + ItemStack[] rList = new ItemStack[aOutputSlots.length]; + rRecipeMetaData.setTag("return", tEntry.getValue().metadata); + for (byte i = 0; i < aOutputSlots.length && i < tList.length; i++) { + if (tList[i] != null) { + if (aOutputSlots[i] == null || (GTUtility.areStacksEqual(tList[i], aOutputSlots[i]) + && tList[i].stackSize + aOutputSlots[i].stackSize + <= aOutputSlots[i].getMaxStackSize())) { + rList[i] = GTUtility.copyOrNull(tList[i]); + } else { + return new ItemStack[aOutputSlots.length]; + } + } + } + + if (aRemoveInput) aInput.stackSize -= tEntry.getKey() + .getAmount(); + return rList; + } + break; + } + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + return new ItemStack[aOutputSlots.length]; + } + + /** + * Used in my own Recycler. + *

+ * Only produces Scrap if aScrapChance == 0. aScrapChance is usually the random Number I give to the Function If you + * directly insert 0 as aScrapChance then you can check if its Recycler-Blacklisted or similar + */ + @Nullable + public static ItemStack getRecyclerOutput(ItemStack aInput, int aScrapChance) { + if (aInput == null || aScrapChance != 0) return null; + if (recyclerWhitelist == null) { + generateRecyclerCache(); + } + + if (recyclerWhitelist.isEmpty()) { + if (searchRecyclerCache(aInput, recyclerBlacklist)) { + return null; + } else { + return ItemList.IC2_Scrap.get(1); + } + } else { + if (searchRecyclerCache(aInput, recyclerWhitelist)) { + return ItemList.IC2_Scrap.get(1); + } else { + return null; + } + } + } + + private static void generateRecyclerCache() { + recyclerWhitelist = new HashSet<>(); + for (IRecipeInput input : ic2.api.recipe.Recipes.recyclerWhitelist) { + for (ItemStack stack : input.getInputs()) { + recyclerWhitelist.add(GTUtility.ItemId.create(stack.getItem(), stack.getItemDamage(), null)); + } + } + recyclerBlacklist = new HashSet<>(); + for (IRecipeInput input : ic2.api.recipe.Recipes.recyclerBlacklist) { + for (ItemStack stack : input.getInputs()) { + recyclerBlacklist.add(GTUtility.ItemId.create(stack.getItem(), stack.getItemDamage(), null)); + } + } + } + + private static boolean searchRecyclerCache(ItemStack stack, Set set) { + if (set.contains(GTUtility.ItemId.createWithoutNBT(stack))) { + return true; + } + // ic2.api.recipe.RecipeInputItemStack#matches expects item with wildcard meta to accept arbitrary meta + return set.contains(GTUtility.ItemId.createAsWildcard(stack)); + } + + /** + * For the Scrapboxinator + */ + public static ItemStack getRandomScrapboxDrop() { + return ic2.api.recipe.Recipes.scrapboxDrops.getDrop(ItemList.IC2_Scrapbox.get(1), false); + } + + /** + * Charges an Electric Item. Only if it's a valid Electric Item of course. This forces the Usage of proper Voltages + * (so not the transfer limits defined by the Items) unless you ignore the Transfer Limit. If aTier is + * Integer.MAX_VALUE it will ignore Tier based Limitations. + * + * @return the actually used Energy. + */ + public static int chargeElectricItem(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreLimit, + boolean aSimulate) { + try { + if (isElectricItem(aStack)) { + int tTier = ((ic2.api.item.IElectricItem) aStack.getItem()).getTier(aStack); + if (tTier < 0 || tTier == aTier || aTier == Integer.MAX_VALUE) { + if (!aIgnoreLimit && tTier >= 0) + aCharge = (int) Math.min(aCharge, V[Math.max(0, Math.min(V.length - 1, tTier))]); + if (aCharge > 0) { + int rCharge = (int) Math.max( + 0.0, + ic2.api.item.ElectricItem.manager.charge(aStack, aCharge, tTier, true, aSimulate)); + return rCharge + (rCharge * 4 > aTier ? aTier : 0); + } + } + } + } catch (Throwable e) { + /* Do nothing */ + } + return 0; + } + + /** + * Discharges an Electric Item. Only if it's a valid Electric Item for that of course. This forces the Usage of + * proper Voltages (so not the transfer limits defined by the Items) unless you ignore the Transfer Limit. If aTier + * is Integer.MAX_VALUE it will ignore Tier based Limitations. + * + * @return the Energy got from the Item. + */ + public static int dischargeElectricItem(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreLimit, + boolean aSimulate, boolean aIgnoreDischargability) { + try { + // if (isElectricItem(aStack) && (aIgnoreDischargability || + // ((ic2.api.item.IElectricItem)aStack.getItem()).canProvideEnergy(aStack))) { + if (isElectricItem(aStack)) { + int tTier = ((ic2.api.item.IElectricItem) aStack.getItem()).getTier(aStack); + if (tTier < 0 || tTier == aTier || aTier == Integer.MAX_VALUE) { + if (!aIgnoreLimit && tTier >= 0) aCharge = (int) Math.min( + aCharge, + V[Math.max(0, Math.min(V.length - 1, tTier))] + B[Math.max(0, Math.min(V.length - 1, tTier))]); + if (aCharge > 0) { + int rCharge = (int) Math.max( + 0, + ic2.api.item.ElectricItem.manager.discharge( + aStack, + aCharge + (aCharge * 4 > aTier ? aTier : 0), + tTier, + true, + !aIgnoreDischargability, + aSimulate)); + return rCharge - (rCharge * 4 > aTier ? aTier : 0); + } + } + } + } catch (Throwable e) { + /* Do nothing */ + } + return 0; + } + + /** + * Uses an Electric Item. Only if it's a valid Electric Item for that of course. + * + * @return if the action was successful + */ + public static boolean canUseElectricItem(ItemStack aStack, int aCharge) { + try { + if (isElectricItem(aStack)) { + return ic2.api.item.ElectricItem.manager.canUse(aStack, aCharge); + } + } catch (Throwable e) { + /* Do nothing */ + } + return false; + } + + /** + * Uses an Electric Item. Only if it's a valid Electric Item for that of course. + * + * @return if the action was successful + */ + public static boolean useElectricItem(ItemStack aStack, int aCharge, EntityPlayer aPlayer) { + try { + if (isElectricItem(aStack)) { + ic2.api.item.ElectricItem.manager.use(aStack, 0, aPlayer); + if (ic2.api.item.ElectricItem.manager.canUse(aStack, aCharge)) { + return ic2.api.item.ElectricItem.manager.use(aStack, aCharge, aPlayer); + } + } + } catch (Throwable e) { + /* Do nothing */ + } + return false; + } + + /** + * Uses an Item. Tries to discharge in case of Electric Items + */ + public static boolean damageOrDechargeItem(ItemStack aStack, int aDamage, int aDecharge, EntityLivingBase aPlayer) { + if (GTUtility.isStackInvalid(aStack) || (aStack.getMaxStackSize() <= 1 && aStack.stackSize > 1)) return false; + if (aPlayer instanceof EntityPlayer && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) return true; + if (aStack.getItem() instanceof IDamagableItem) { + return ((IDamagableItem) aStack.getItem()).doDamageToItem(aStack, aDamage); + } else if (GTModHandler.isElectricItem(aStack)) { + if (canUseElectricItem(aStack, aDecharge)) { + if (aPlayer instanceof EntityPlayer) { + return GTModHandler.useElectricItem(aStack, aDecharge, (EntityPlayer) aPlayer); + } + return GTModHandler.dischargeElectricItem(aStack, aDecharge, Integer.MAX_VALUE, true, false, true) + >= aDecharge; + } + } else if (aStack.getItem() + .isDamageable()) { + if (aPlayer == null) { + aStack.setItemDamage(aStack.getItemDamage() + aDamage); + } else { + aStack.damageItem(aDamage, aPlayer); + } + if (aStack.getItemDamage() >= aStack.getMaxDamage()) { + aStack.setItemDamage(aStack.getMaxDamage() + 1); + ItemStack tStack = GTUtility.getContainerItem(aStack, true); + if (tStack != null) { + aStack.func_150996_a(tStack.getItem()); + aStack.setItemDamage(tStack.getItemDamage()); + aStack.stackSize = tStack.stackSize; + aStack.setTagCompound(tStack.getTagCompound()); + } else if (aStack.stackSize > 0) { + aStack.stackSize--; + } + } + return true; + } + return false; + } + + /** + * Uses a Soldering Iron from player or external inventory + */ + public static boolean useSolderingIron(ItemStack aStack, EntityLivingBase aPlayer, IInventory aExternalInventory) { + if (aPlayer == null || aStack == null) return false; + if (GTUtility.isStackInList(aStack, GregTechAPI.sSolderingToolList)) { + if (aPlayer instanceof EntityPlayer tPlayer) { + if (tPlayer.capabilities.isCreativeMode) return true; + if (isElectricItem(aStack) && ic2.api.item.ElectricItem.manager.getCharge(aStack) > 1000.0d) { + if (consumeSolderingMaterial(tPlayer) + || (aExternalInventory != null && consumeSolderingMaterial(aExternalInventory))) { + if (canUseElectricItem(aStack, 10000)) { + return GTModHandler.useElectricItem(aStack, 10000, (EntityPlayer) aPlayer); + } + GTModHandler.useElectricItem( + aStack, + (int) ic2.api.item.ElectricItem.manager.getCharge(aStack), + (EntityPlayer) aPlayer); + return false; + } else { + GTUtility.sendChatToPlayer( + (EntityPlayer) aPlayer, + GTUtility.trans("094.1", "Not enough soldering material!")); + } + } + } else { + damageOrDechargeItem(aStack, 1, 1000, aPlayer); + return true; + } + } + return false; + } + + public static boolean useSolderingIron(ItemStack aStack, EntityLivingBase aPlayer) { + return useSolderingIron(aStack, aPlayer, null); + } + + public static boolean consumeSolderingMaterial(EntityPlayer aPlayer) { + if (aPlayer.capabilities.isCreativeMode) return true; + IInventory tInventory = aPlayer.inventory; + if (consumeSolderingMaterial(tInventory)) { + if (aPlayer.inventoryContainer != null) { + aPlayer.inventoryContainer.detectAndSendChanges(); + } + return true; + } + for (int i = 0; i < tInventory.getSizeInventory(); i++) { + ItemStack tStack = tInventory.getStackInSlot(i); + if (tStack != null && tStack.getItem() instanceof ItemToolbox) { + IInventory tToolboxInventory = ((ItemToolbox) tStack.getItem()).getInventory(aPlayer, tStack); + if (consumeSolderingMaterial(tToolboxInventory)) { + tInventory.markDirty(); + if (aPlayer.inventoryContainer != null) { + aPlayer.inventoryContainer.detectAndSendChanges(); + } + return true; + } + } + } + return false; + } + + /** + * Consumes soldering material from given inventory + */ + public static boolean consumeSolderingMaterial(IInventory aInventory) { + for (int i = 0; i < aInventory.getSizeInventory(); i++) { + ItemStack tStack = aInventory.getStackInSlot(i); + if (GTUtility.isStackInList(tStack, GregTechAPI.sSolderingMetalList)) { + if (tStack.stackSize < 1) return false; + if (tStack.stackSize == 1) { + tStack = null; + } else { + tStack.stackSize--; + } + aInventory.setInventorySlotContents(i, tStack); + aInventory.markDirty(); + return true; + } + } + return false; + } + + /** + * Is this an electric Item, which can charge other Items? + */ + public static boolean isChargerItem(ItemStack aStack) { + try { + if (isElectricItem(aStack)) { + return ((ic2.api.item.IElectricItem) aStack.getItem()).canProvideEnergy(aStack); + } + } catch (Throwable e) { + /* Do nothing */ + } + return false; + } + + /** + * Is this an electric Item? + */ + public static boolean isElectricItem(ItemStack aStack) { + try { + return aStack != null && aStack.getItem() instanceof ic2.api.item.IElectricItem + && ((IElectricItem) aStack.getItem()).getTier(aStack) < Integer.MAX_VALUE; + } catch (Throwable e) { + /* Do nothing */ + } + return false; + } + + public static boolean isElectricItem(ItemStack aStack, byte aTier) { + try { + return aStack != null && aStack.getItem() instanceof ic2.api.item.IElectricItem + && ((IElectricItem) aStack.getItem()).getTier(aStack) == aTier; + } catch (Throwable e) { + /* Do nothing */ + } + return false; + } + + /** + * Returns the current charge and maximum charge of an ItemStack. + * + * @param aStack Any ItemStack. + * @return Optional.empty() if the stack is null or not an electric item, or an Optional containing a payload of an + * array containing [ current_charge, maximum_charge ] on success. + */ + public static Optional getElectricItemCharge(ItemStack aStack) { + if (aStack == null || !isElectricItem(aStack)) { + return Optional.empty(); + } + + final Item item = aStack.getItem(); + + if (item instanceof final MetaBaseItem metaBaseItem) { + final Long[] stats = metaBaseItem.getElectricStats(aStack); + if (stats != null && stats.length > 0) { + return Optional.of(new Long[] { metaBaseItem.getRealCharge(aStack), stats[0] }); + } + + } else if (item instanceof final IElectricItem ic2ElectricItem) { + return Optional.of( + new Long[] { (long) ic2.api.item.ElectricItem.manager.getCharge(aStack), + (long) ic2ElectricItem.getMaxCharge(aStack) }); + } + + return Optional.empty(); + } + + /** + * Allow item to be inserted into ic2 toolbox + */ + public static void registerBoxableItemToToolBox(ItemStack aStack) { + if (aStack != null) { + try { + ic2.api.item.ItemWrapper.registerBoxable(aStack.getItem(), (IBoxable) sBoxableWrapper); + } catch (Throwable ignored) { + /* Do nothing */ + } + sBoxableItems.add(new GTItemStack(aStack)); + } + } + + public static int getCapsuleCellContainerCountMultipliedWithStackSize(ItemStack... aStacks) { + int rAmount = 0; + for (ItemStack tStack : aStacks) + if (tStack != null) rAmount += getCapsuleCellContainerCount(tStack) * tStack.stackSize; + return rAmount; + } + + public static int getCapsuleCellContainerCount(ItemStack aStack) { + if (aStack == null) return 0; + + if (GTUtility.areStacksEqual(GTUtility.getContainerForFilledItem(aStack, true), ItemList.Cell_Empty.get(1))) { + return 1; + } + + if (GTUtility.areStacksEqual(aStack, getIC2Item("waterCell", 1, W))) { + return 1; + } + + for (OrePrefixes cellType : OrePrefixes.CELL_TYPES) { + if (cellType.contains(aStack)) { + return 1; + } + } + + return 0; + } + + public static class RecipeBits { + + /** + * Mirrors the Recipe + */ + public static long MIRRORED = B[0]; + /** + * Buffers the Recipe for later addition. This makes things more efficient. + */ + public static long BUFFERED = B[1]; + /** + * This is a special Tag I used for crafting Coins up and down. + */ + public static long KEEPNBT = B[2]; + /** + * Makes the Recipe Reverse Craftable in the Disassembler. + */ + public static long DISMANTLEABLE = B[3]; + /** + * Prevents the Recipe from accidentally getting removed by my own Handlers. + */ + public static long NOT_REMOVABLE = B[4]; + /** + * Reverses the Output of the Recipe for smelting and pulverising. + */ + public static long REVERSIBLE = B[5]; + /** + * Removes all Recipes with the same Output Item regardless of NBT, unless another Recipe Deletion Bit is added + * too. + */ + public static long DELETE_ALL_OTHER_RECIPES = B[6]; + /** + * Removes all Recipes with the same Output Item limited to the same NBT. + */ + public static long DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT = B[7]; + /** + * Removes all Recipes with the same Output Item limited to Shaped Recipes. + */ + public static long DELETE_ALL_OTHER_SHAPED_RECIPES = B[8]; + /** + * Removes all Recipes with the same Output Item limited to native Recipe Handlers. + */ + public static long DELETE_ALL_OTHER_NATIVE_RECIPES = B[9]; + /** + * Disables the check for colliding Recipes. + */ + public static long DO_NOT_CHECK_FOR_COLLISIONS = B[10]; + /** + * Only adds the Recipe if there is another Recipe having that Output + */ + public static long ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT = B[11]; + /** + * Only adds the Recipe if it has an Output + */ + public static long ONLY_ADD_IF_RESULT_IS_NOT_NULL = B[12]; + /** + * Don't remove shapeless recipes with this output + */ + public static long DONT_REMOVE_SHAPELESS = B[13]; + } +} diff --git a/src/main/java/gregtech/api/util/GTMusicSystem.java b/src/main/java/gregtech/api/util/GTMusicSystem.java new file mode 100644 index 0000000000..362c397e67 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTMusicSystem.java @@ -0,0 +1,667 @@ +package gregtech.api.util; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.TreeMap; +import java.util.UUID; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SoundEventAccessorComposite; +import net.minecraft.client.audio.SoundRegistry; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemRecord; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.ApiStatus; +import org.joml.Vector4i; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.jcraft.jorbis.VorbisFile; + +import baubles.api.BaublesApi; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.network.ByteBufUtils; +import gregtech.GTMod; +import gregtech.api.enums.GTValues; +import gregtech.api.net.GTPacketMusicSystemData; +import gregtech.client.ElectricJukeboxSound; +import gregtech.common.items.ItemWirelessHeadphones; +import gregtech.common.tileentities.machines.basic.MTEBetterJukebox; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +/** + * A system that keeps track of jukebox music tracks playing in different locations. + * Compared to vanilla jukebox handling, this allows music to resume playing after reloading the chunk the jukeboxes are + * in. + * It also allows the headphone item to modify the hearing range of a given disc, including other dimensions. + *

+ * Vector4i coordinates point to X,Y,Z,Dimension of the source + * + * @author eigenraven + */ +public final class GTMusicSystem { + + private GTMusicSystem() {} + + public static final class MusicSource { + + /** Flag keeping track of when the data of this source needs to be sent to clients again */ + public boolean modified; + public final UUID sourceID; + /** Currently playing track */ + public ResourceLocation currentRecord; + /** Headphone range */ + public MTEBetterJukebox.HeadphoneLimit headphoneLimit; + /** + * {@link System#currentTimeMillis()} at the time this record started playing, in server time + */ + public long startedPlayingAtMs; + /** Time the record was playing for at the time it was serialized. */ + public long playingForMs; + /** The origin of this source used for wireless headphone range calculations */ + public final Vector4i originPosition = new Vector4i(); + /** Number of blocks from {@link MusicSource#originPosition} the headphones can work */ + public int headphoneBlockRange; + /** Densely packed parameters for each "emitter" associated with the source, for fast iteration */ + public int[] emitterParameters; // [{x,y,z,dim,volume}, {x, ...}, {x, ...}, ...] + /** Offsets into the parameters array */ + public static final int EMITTER_X = 0; + /** Offsets into the parameters array */ + public static final int EMITTER_Y = 1; + /** Offsets into the parameters array */ + public static final int EMITTER_Z = 2; + /** Offsets into the parameters array */ + public static final int EMITTER_DIMENSION = 3; + /** 100 times the floating point "volume" used by the sound system for range calculations */ + public static final int EMITTER_VOLUME_X_100 = 4; + /** Iteration stride for packed emitter parameters */ + public static final int EMITTER_STRIDE = EMITTER_VOLUME_X_100 + 1; + + public MusicSource(UUID sourceID) { + this.sourceID = sourceID; + } + + public void resizeEmitterArray(int count) { + int len = count * EMITTER_STRIDE; + if (emitterParameters == null || emitterParameters.length != len) { + if (emitterParameters == null) { + emitterParameters = new int[len]; + } else { + emitterParameters = Arrays.copyOf(emitterParameters, len); + } + modified = true; + } + } + + public void setEmitter(int index, Vector4i position, float volume) { + int arrIndex = index * EMITTER_STRIDE; + if (arrIndex < 0 || arrIndex >= emitterParameters.length) { + throw new IndexOutOfBoundsException( + "Trying to access emitter with index " + index + + " in an array of " + + emitterParameters.length / EMITTER_STRIDE); + } + + if (emitterParameters[arrIndex + EMITTER_X] != position.x) { + modified = true; + emitterParameters[arrIndex + EMITTER_X] = position.x; + } + if (emitterParameters[arrIndex + EMITTER_Y] != position.y) { + modified = true; + emitterParameters[arrIndex + EMITTER_Y] = position.y; + } + if (emitterParameters[arrIndex + EMITTER_Z] != position.z) { + modified = true; + emitterParameters[arrIndex + EMITTER_Z] = position.z; + } + if (emitterParameters[arrIndex + EMITTER_DIMENSION] != position.w) { + modified = true; + emitterParameters[arrIndex + EMITTER_DIMENSION] = position.w; + } + final int intVolume = (int) (volume * 100.0f); + if (emitterParameters[arrIndex + EMITTER_VOLUME_X_100] != intVolume) { + modified = true; + emitterParameters[arrIndex + EMITTER_VOLUME_X_100] = intVolume; + } + } + + /** x squared */ + private static int sq(int x) { + return x * x; + } + + /** @return Index of closest emitter in range, or -1 if none is nearby. */ + public int closestEmitter(int x, int y, int z, int dim) { + int closest = -1; + int closestDistanceSq = Integer.MAX_VALUE; + final int emittersCount = emitterParameters.length / EMITTER_STRIDE; + for (int i = 0; i < emittersCount; i++) { + final int offset = i * EMITTER_STRIDE; + final int eDim = emitterParameters[offset + EMITTER_DIMENSION]; + if (eDim != dim) { + continue; + } + final int eX = emitterParameters[offset + EMITTER_X]; + final int eY = emitterParameters[offset + EMITTER_Y]; + final int eZ = emitterParameters[offset + EMITTER_Z]; + final int distanceSq = sq(x - eX) + sq(y - eY) + sq(z - eZ); + if (distanceSq < closestDistanceSq) { + closestDistanceSq = distanceSq; + closest = i; + } + } + return closest; + } + + public boolean inHeadphoneRange(int x, int y, int z, int dim) { + return switch (headphoneLimit) { + case BETWEEN_DIMENSIONS -> true; + case INSIDE_DIMENSION -> dim == originPosition.w; + case BLOCK_RANGE -> dim == originPosition.w + && originPosition.distanceSquared(x, y, z, dim) <= sq(headphoneBlockRange); + }; + } + + public void encode(final ByteBuf target) { + target.writeLong(sourceID.getMostSignificantBits()); + target.writeLong(sourceID.getLeastSignificantBits()); + if (currentRecord != null) { + final int duration = getMusicRecordDurations().getOrDefault(currentRecord, Integer.MAX_VALUE); + if (playingForMs >= duration) { + // Record already finished playing, let's not send it to the client anymore. + target.writeBoolean(false); + } else { + target.writeBoolean(true); + ByteBufUtils.writeUTF8String(target, currentRecord.getResourceDomain()); + ByteBufUtils.writeUTF8String(target, currentRecord.getResourcePath()); + } + } else { + target.writeBoolean(false); + } + target.writeByte((byte) headphoneLimit.ordinal()); + ByteBufUtils.writeVarInt(target, headphoneBlockRange, 5); + target.writeLong(startedPlayingAtMs); + target.writeLong(playingForMs); + ByteBufUtils.writeVarInt(target, originPosition.x, 5); + ByteBufUtils.writeVarInt(target, originPosition.y, 5); + ByteBufUtils.writeVarInt(target, originPosition.z, 5); + ByteBufUtils.writeVarInt(target, originPosition.w, 5); + ByteBufUtils.writeVarInt(target, emitterParameters.length, 5); + for (int emitterParameter : emitterParameters) { + ByteBufUtils.writeVarInt(target, emitterParameter, 5); + } + } + + public static MusicSource decode(final ByteBuf bytes) { + final long uuidMsb = bytes.readLong(); + final long uuidLsb = bytes.readLong(); + final MusicSource source = new MusicSource(new UUID(uuidMsb, uuidLsb)); + final boolean hasRecord = bytes.readBoolean(); + if (hasRecord) { + final String domain = ByteBufUtils.readUTF8String(bytes); + final String path = ByteBufUtils.readUTF8String(bytes); + source.currentRecord = new ResourceLocation(domain, path); + } + source.headphoneLimit = MTEBetterJukebox.HeadphoneLimit.ENTRIES.get(bytes.readByte()); + source.headphoneBlockRange = ByteBufUtils.readVarInt(bytes, 5); + source.startedPlayingAtMs = bytes.readLong(); + source.playingForMs = bytes.readLong(); + final int originX = ByteBufUtils.readVarInt(bytes, 5); + final int originY = ByteBufUtils.readVarInt(bytes, 5); + final int originZ = ByteBufUtils.readVarInt(bytes, 5); + final int originW = ByteBufUtils.readVarInt(bytes, 5); + source.originPosition.set(originX, originY, originZ, originW); + final int emittersLength = ByteBufUtils.readVarInt(bytes, 5); + source.emitterParameters = new int[emittersLength]; + for (int i = 0; i < emittersLength; i++) { + source.emitterParameters[i] = ByteBufUtils.readVarInt(bytes, 5); + } + + return source; + } + + public void setRecord(final ResourceLocation record) { + setRecord(record, 0); + } + + public void setRecord(final ResourceLocation record, long seekOffset) { + modified = true; + currentRecord = record; + playingForMs = seekOffset; + startedPlayingAtMs = System.currentTimeMillis() - seekOffset; + } + } + + public static final class ServerSystem { + + static final Object2ObjectOpenHashMap musicSources = new Object2ObjectOpenHashMap<>(32); + static boolean musicSourcesDirty = false; + + // Everything is synchronized to allow calling into here from the client when singleplayer synchronization is + // needed. + + public static synchronized MusicSource registerOrGetMusicSource(UUID uuid) { + return musicSources.computeIfAbsent(uuid, (UUID id) -> { + musicSourcesDirty = true; + return new MusicSource(id); + }); + } + + public static synchronized void removeMusicSource(UUID uuid) { + musicSources.remove(uuid); + musicSourcesDirty = true; + } + + public static synchronized void reset() { + musicSources.clear(); + musicSourcesDirty = true; + } + + public static synchronized ByteBuf serialize() { + final ByteBuf out = Unpooled.buffer(); + ByteBufUtils.writeVarInt(out, musicSources.size(), 5); + musicSources.forEach((uuid, source) -> source.encode(out)); + return out; + } + + private static boolean tickAnyDirty; + + public static synchronized void tick() { + final long now = System.currentTimeMillis(); + tickAnyDirty = false; + musicSources.forEach((uuid, source) -> { + source.playingForMs = now - source.startedPlayingAtMs; + tickAnyDirty |= source.modified; + source.modified = false; + }); + if (tickAnyDirty || musicSourcesDirty) { + musicSourcesDirty = false; + GTValues.NW.sendToAll(new GTPacketMusicSystemData(serialize())); + } + } + + static synchronized void onPauseMs(long pauseDurationMs) { + musicSources.forEach((uuid, source) -> { source.startedPlayingAtMs += pauseDurationMs; }); + } + } + + public static final class ClientSystem { + + private static final class ClientSourceData { + + /** Currently playing sound data */ + public ElectricJukeboxSound currentSound = null; + /** Currently playing sound data */ + public ResourceLocation currentSoundResource = null; + /** + * Server's timer value of when the music started, mostly meaningless except for checking for replays of the + * same music file. + */ + public long originalStartTime = 0; + /** + * Computed client value of {@link System#currentTimeMillis()} of the time when the playback would have + * started if it was synchronized with the server. + */ + public long clientReferenceStartTime = 0; + /** Flag for mark and sweep removal of outdated sounds */ + public boolean markFlag = false; + + public void resetMark() { + markFlag = false; + } + + public void mark() { + markFlag = true; + } + + public void clearSound(final Minecraft mc) { + currentSoundResource = null; + if (currentSound != null) { + mc.getSoundHandler() + .stopSound(currentSound); + currentSound = null; + originalStartTime = 0; + } + } + + public boolean equalSound(final MusicSource source) { + if (source == null || source.currentRecord == null) { + return currentSoundResource == null; + } else { + return source.currentRecord.equals(currentSoundResource) + && originalStartTime == source.startedPlayingAtMs; + } + } + + public void resetSound(final Minecraft mc, final MusicSource source, final boolean onHeadphones) { + clearSound(mc); + if (source == null || source.emitterParameters.length == 0) { + return; + } + int closestEmitter = onHeadphones ? 0 + : source.closestEmitter( + (int) Math.floor(mc.thePlayer.posX), + (int) Math.floor(mc.thePlayer.posY), + (int) Math.floor(mc.thePlayer.posZ), + currentDimension); + if (closestEmitter < 0) { + return; + } + this.currentSoundResource = source.currentRecord; + this.originalStartTime = source.startedPlayingAtMs; + this.clientReferenceStartTime = System.currentTimeMillis() - source.playingForMs; + if (currentSoundResource != null) { + this.currentSound = makeRecord(source, closestEmitter); + if (onHeadphones) { + this.currentSound.volume = 1.0e20f; + } + mc.getSoundHandler() + .playSound(this.currentSound); + } + } + + public void updateSound(final Minecraft mc, final MusicSource source, final boolean onHeadphones) { + if (source == null || currentSound == null || source.emitterParameters.length == 0) { + return; + } + int closestEmitter = onHeadphones ? 0 + : source.closestEmitter( + (int) Math.floor(mc.thePlayer.posX), + (int) Math.floor(mc.thePlayer.posY), + (int) Math.floor(mc.thePlayer.posZ), + currentDimension); + if (closestEmitter < 0) { + currentSound.volume = 0.0f; + return; + } + final int offset = closestEmitter * MusicSource.EMITTER_STRIDE; + currentSound.xPosition = source.emitterParameters[offset + MusicSource.EMITTER_X]; + currentSound.yPosition = source.emitterParameters[offset + MusicSource.EMITTER_Y]; + currentSound.zPosition = source.emitterParameters[offset + MusicSource.EMITTER_Z]; + currentSound.volume = onHeadphones ? 1.0e20f + : source.emitterParameters[offset + MusicSource.EMITTER_VOLUME_X_100] / 100.0f; + } + } + + /** Latest music source list as synchronized from the server */ + public static final Object2ObjectOpenHashMap musicSources = new Object2ObjectOpenHashMap<>(); + + private static final Object2ObjectOpenHashMap activelyPlayingMusic = new Object2ObjectOpenHashMap<>( + 16); + + private static final ObjectOpenHashSet wornHeadphones = new ObjectOpenHashSet<>(); + + private static int currentDimension = Integer.MIN_VALUE; + + private static boolean soundsPaused = false; + private static long pauseTimeMs = 0; + private static int tickCounter = 0; + + public static void loadUpdatedSources(ByteBuf bytes) { + final int sourceCount = ByteBufUtils.readVarInt(bytes, 5); + musicSources.clear(); + for (int i = 0; i < sourceCount; i++) { + final MusicSource source = MusicSource.decode(bytes); + musicSources.put(source.sourceID, source); + } + } + + private static ElectricJukeboxSound makeRecord(MusicSource source, int emitter) { + final int x = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE + MusicSource.EMITTER_X]; + final int y = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE + MusicSource.EMITTER_Y]; + final int z = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE + MusicSource.EMITTER_Z]; + final float volume = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE + + MusicSource.EMITTER_VOLUME_X_100] / 100.0f; + return new ElectricJukeboxSound(source.currentRecord, volume, source.playingForMs, x, y, z); + } + + public static void dumpAllRecordDurations() { + try { + final Minecraft mc = Minecraft.getMinecraft(); + final SoundRegistry sm = mc.getSoundHandler().sndRegistry; + final SoundDurationsJson json = new SoundDurationsJson(); + @SuppressWarnings("unchecked") + final Map allRecords = ItemRecord.field_150928_b; + // Cursed hack because JOrbis does not support seeking in anything other than filesystem files. + // This is only a dev tool, so it can be a bit slow and use real files here. + final File tempFile = File.createTempFile("mcdecode", ".ogg"); + for (final ItemRecord record : allRecords.values()) { + try { + final ResourceLocation res = record.getRecordResource(record.recordName); + SoundEventAccessorComposite registryEntry = (SoundEventAccessorComposite) sm.getObject(res); + if (registryEntry == null) { + registryEntry = (SoundEventAccessorComposite) sm.getObject( + new ResourceLocation(res.getResourceDomain(), "records." + res.getResourcePath())); + } + final ResourceLocation realPath = registryEntry.func_148720_g() + .getSoundPoolEntryLocation(); + try (final InputStream is = mc.getResourceManager() + .getResource(realPath) + .getInputStream(); final OutputStream os = FileUtils.openOutputStream(tempFile)) { + IOUtils.copy(is, os); + os.close(); + final VorbisFile vf = new VorbisFile(tempFile.getAbsolutePath()); + final float totalSeconds = vf.time_total(-1); + json.soundDurationsMs.put(res.toString(), (int) Math.ceil(totalSeconds * 1000.0f)); + } + } catch (Exception e) { + GTMod.GT_FML_LOGGER.warn("Skipping {}", record.recordName, e); + } + } + GTMod.GT_FML_LOGGER.info( + "Sound durations json: \n{}", + new GsonBuilder().setPrettyPrinting() + .create() + .toJson(json)); + tempFile.delete(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void reset() { + musicSources.clear(); + tick(); + } + + public static void tick() { + final Minecraft mc = Minecraft.getMinecraft(); + if (mc == null || mc.renderGlobal == null + || mc.theWorld == null + || mc.thePlayer == null + || mc.theWorld.provider == null) { + return; + } + tickCounter++; + final long now = System.currentTimeMillis(); + currentDimension = mc.theWorld.provider.dimensionId; + + headphoneCheck: if ((tickCounter % 20) == 0) { + wornHeadphones.clear(); + final IInventory baubles = BaublesApi.getBaubles(mc.thePlayer); + if (baubles == null) { + break headphoneCheck; + } + final int baublesSize = baubles.getSizeInventory(); + for (int i = 0; i < baublesSize; i++) { + final ItemStack item = baubles.getStackInSlot(i); + if (item != null && item.getItem() instanceof ItemWirelessHeadphones headphones) { + final UUID id = headphones.getBoundJukeboxUUID(item); + if (id != null) { + wornHeadphones.add(id); + } + } + } + } + + activelyPlayingMusic.forEach((uuid, data) -> data.resetMark()); + + // Update and mark all present music streams + musicSources.forEach((uuid, musicSource) -> { + final ClientSourceData data = activelyPlayingMusic + .computeIfAbsent(uuid, ignored -> new ClientSourceData()); + data.mark(); + if (data.currentSound != null && !mc.getSoundHandler() + .isSoundPlaying(data.currentSound) + && (now - data.clientReferenceStartTime) + < getMusicRecordDurations().getOrDefault(data.currentSoundResource, Integer.MAX_VALUE)) { + data.currentSound = null; + data.currentSoundResource = null; + } + final boolean onHeadphones = wornHeadphones.contains(uuid); + if (!data.equalSound(musicSource)) { + data.resetSound(mc, musicSource, onHeadphones); + } else { + data.updateSound(mc, musicSource, onHeadphones); + } + }); + + // Sweep no longer present music streams + final var entries = activelyPlayingMusic.object2ObjectEntrySet() + .fastIterator(); + while (entries.hasNext()) { + final ClientSourceData entry = entries.next() + .getValue(); + if (!entry.markFlag) { + entry.clearSound(mc); + entries.remove(); + } + } + } + + @ApiStatus.Internal + public static void onSoundBatchStop() { + // All music was forcibly stopped, we can forget about the currently playing music + // and let the update loop re-start them on next tick + long now = System.currentTimeMillis(); + activelyPlayingMusic.forEach((uuid, data) -> { + data.currentSound = null; + data.currentSoundResource = null; + final MusicSource source = musicSources.get(uuid); + if (source == null) { + return; + } + source.playingForMs = now - data.clientReferenceStartTime; + }); + } + + @ApiStatus.Internal + public static void onSoundBatchPause() { + if (soundsPaused) { + return; + } + soundsPaused = true; + pauseTimeMs = System.currentTimeMillis(); + } + + @ApiStatus.Internal + public static void onSoundBatchResume() { + if (!soundsPaused) { + return; + } + final Minecraft mc = Minecraft.getMinecraft(); + if (mc == null || mc.renderGlobal == null + || mc.theWorld == null + || mc.thePlayer == null + || mc.theWorld.provider == null) { + return; + } + soundsPaused = false; + + if (!(mc.isSingleplayer() && !mc.getIntegratedServer() + .getPublic())) { + return; + } + final long now = System.currentTimeMillis(); + final long pauseDurationMs = now - pauseTimeMs; + + // We manipulate server state here, because we've checked this is singleplayer pausing. + GTMusicSystem.ServerSystem.onPauseMs(pauseDurationMs); + musicSources.forEach((uuid, source) -> { source.startedPlayingAtMs += pauseDurationMs; }); + activelyPlayingMusic.forEach((uuid, data) -> { + data.originalStartTime += pauseDurationMs; + data.clientReferenceStartTime += pauseDurationMs; + }); + + } + } + + private static final Object2IntOpenHashMap musicRecordDurations = new Object2IntOpenHashMap<>(); + private static volatile boolean musicRecordsInitialized; + + /** For GSON consumption */ + public static class SoundDurationsJson { + + public Map soundDurationsMs = new TreeMap<>(); + } + + public static Object2IntOpenHashMap getMusicRecordDurations() { + if (musicRecordsInitialized) { + return musicRecordDurations; + } + // double-checked locking for efficiency + synchronized (musicRecordDurations) { + if (musicRecordsInitialized) { + return musicRecordDurations; + } + + final Gson gson = new Gson(); + + try { + final ArrayList candidates = Collections.list( + GTMusicSystem.class.getClassLoader() + .getResources("soundmeta/durations.json")); + final Path configPath = Loader.instance() + .getConfigDir() + .toPath() + .resolve("soundmeta") + .resolve("durations.json"); + if (Files.exists(configPath)) { + candidates.add( + configPath.toUri() + .toURL()); + } + for (final URL url : candidates) { + try { + final String objectJson = IOUtils.toString(url); + final SoundDurationsJson object = gson.fromJson(objectJson, SoundDurationsJson.class); + if (object == null || object.soundDurationsMs == null || object.soundDurationsMs.isEmpty()) { + continue; + } + for (final var entry : object.soundDurationsMs.entrySet()) { + musicRecordDurations.put( + new ResourceLocation(entry.getKey()), + entry.getValue() + .intValue()); + } + } catch (Exception e) { + GTMod.GT_FML_LOGGER.error("Could not parse sound durations from {}", url, e); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + musicRecordsInitialized = true; + return musicRecordDurations; + } + } + +} diff --git a/src/main/java/gregtech/api/util/GTOreDictUnificator.java b/src/main/java/gregtech/api/util/GTOreDictUnificator.java new file mode 100644 index 0000000000..6168b03211 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTOreDictUnificator.java @@ -0,0 +1,578 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.E; +import static gregtech.api.enums.GTValues.M; +import static gregtech.api.enums.GTValues.W; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.annotation.Nullable; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.MaterialStack; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * This is the Core of my OreDict Unification Code + *

+ * If you just want to use this to unificate your Items, then use the Function in the GregTechAPI File + *

+ * P.S. It is intended to be named "Unificator" and not "Unifier", because that sounds more awesome. + */ +public class GTOreDictUnificator { + + private static final Map sName2StackMap = new HashMap<>(); + private static final Map sItemStack2DataMap = new Object2ObjectOpenCustomHashMap<>( + GTItemStack.ITEMSTACK_HASH_STRATEGY2); + private static final Map> sUnificationTable = new Object2ObjectOpenCustomHashMap<>( + GTItemStack.ITEMSTACK_HASH_STRATEGY2); + private static final Set sNoUnificationList = new ObjectOpenCustomHashSet<>( + GTItemStack.ITEMSTACK_HASH_STRATEGY2); + private static int isRegisteringOre = 0, isAddingOre = 0; + private static boolean mRunThroughTheList = true; + + static { + GregTechAPI.sItemStackMappings.add(sItemStack2DataMap); + GregTechAPI.sItemStackMappings.add(sUnificationTable); + } + + /** + * The Blacklist just prevents the Item from being unificated into something else. Useful if you have things like + * the Industrial Diamond, which is better than regular Diamond, but also usable in absolutely all Diamond Recipes. + */ + public static void addToBlacklist(ItemStack aStack) { + if (GTUtility.isStackValid(aStack) && !GTUtility.isStackInStackSet(aStack, sNoUnificationList)) + sNoUnificationList.add(aStack); + } + + public static boolean isBlacklisted(ItemStack aStack) { + return GTUtility.isStackInStackSet(aStack, sNoUnificationList); + } + + public static void add(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack) { + set(aPrefix, aMaterial, aStack, false, false); + } + + public static void set(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack) { + set(aPrefix, aMaterial, aStack, true, false); + } + + public static void set(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack, boolean aOverwrite, + boolean aAlreadyRegistered) { + if (aMaterial == null || aPrefix == null + || GTUtility.isStackInvalid(aStack) + || Items.feather.getDamage(aStack) == W) return; + isAddingOre++; + aStack = GTUtility.copyAmount(1, aStack); + if (!aAlreadyRegistered) registerOre(aPrefix.get(aMaterial), aStack); + addAssociation(aPrefix, aMaterial, aStack, isBlacklisted(aStack)); + if (aOverwrite || GTUtility.isStackInvalid( + sName2StackMap.get( + aPrefix.get(aMaterial) + .toString()))) + sName2StackMap.put( + aPrefix.get(aMaterial) + .toString(), + aStack); + isAddingOre--; + } + + public static ItemStack getFirstOre(Object aName, long aAmount) { + if (GTUtility.isStringInvalid(aName)) return null; + ItemStack tStack = sName2StackMap.get(aName.toString()); + if (GTUtility.isStackValid(tStack)) return GTUtility.copyAmount(aAmount, tStack); + return GTUtility.copyAmount(aAmount, getOresImmutable(aName).toArray()); + } + + public static ItemStack get(Object aName, long aAmount) { + return get(aName, null, aAmount, true, true); + } + + public static ItemStack get(Object aName, ItemStack aReplacement, long aAmount) { + return get(aName, aReplacement, aAmount, true, true); + } + + public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, long aAmount) { + return get(aPrefix, aMaterial, null, aAmount); + } + + public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, ItemStack aReplacement, long aAmount) { + if (OrePrefixes.mPreventableComponents.contains(aPrefix) && aPrefix.mDisabledItems.contains(aMaterial)) + return aReplacement; + return get(aPrefix.get(aMaterial), aReplacement, aAmount, false, true); + } + + public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, long aAmount, boolean aNoInvalidAmounts) { + if (OrePrefixes.mPreventableComponents.contains(aPrefix) && aPrefix.mDisabledItems.contains(aMaterial)) + return null; + return get(aPrefix.get(aMaterial), null, aAmount, false, aNoInvalidAmounts); + } + + public static ItemStack get(Object aName, ItemStack aReplacement, long aAmount, boolean aMentionPossibleTypos, + boolean aNoInvalidAmounts) { + if (aNoInvalidAmounts && aAmount < 1) return null; + final ItemStack stackFromName = sName2StackMap.get(aName.toString()); + if (stackFromName != null) return GTUtility.copyAmount(aAmount, stackFromName); + if (aMentionPossibleTypos) { + GTLog.err.println("Unknown Key for Unification, Typo? " + aName); + } + final ItemStack stackFirstOre = getFirstOre(aName, aAmount); + if (stackFirstOre != null) return GTUtility.copyAmount(aAmount, stackFirstOre); + return GTUtility.copyAmount(aAmount, aReplacement); + } + + public static ItemStack[] setStackArray(boolean aUseBlackList, ItemStack... aStacks) { + for (int i = 0; i < aStacks.length; i++) aStacks[i] = get(aUseBlackList, GTUtility.copyOrNull(aStacks[i])); + return aStacks; + } + + public static ItemStack[] getStackArray(boolean aUseBlackList, Object... aStacks) { + ItemStack[] rStacks = new ItemStack[aStacks.length]; + for (int i = 0; i < aStacks.length; i++) { + rStacks[i] = get(aUseBlackList, GTUtility.copy(aStacks[i]), true); + } + return rStacks; + } + + public static ItemStack setStack(ItemStack aStack) { + return setStack(true, aStack); + } + + public static ItemStack setStack(boolean aUseBlackList, ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return aStack; + ItemStack tStack = get(aUseBlackList, aStack); + if (GTUtility.areStacksEqual(aStack, tStack)) return aStack; + aStack.func_150996_a(tStack.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(tStack)); + return aStack; + } + + public static ItemStack get(ItemStack aStack) { + return get(true, aStack); + } + + public static ItemStack get(boolean aUseBlackList, ItemStack aStack) { + return get(aUseBlackList, aStack, false); + } + + /** + * @param unsafe If true, it does not limit stack size by 64. + */ + public static ItemStack get(boolean aUseBlackList, ItemStack aStack, boolean unsafe) { + if (GTUtility.isStackInvalid(aStack)) return null; + ItemData tPrefixMaterial = getAssociation(aStack); + if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData() + || (aUseBlackList && tPrefixMaterial.mBlackListed)) return GTUtility.copyOrNull(aStack); + if (aUseBlackList && !GregTechAPI.sUnificationEntriesRegistered && isBlacklisted(aStack)) { + tPrefixMaterial.mBlackListed = true; + return GTUtility.copyOrNull(aStack); + } + if (tPrefixMaterial.mUnificationTarget == null) + tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString()); + ItemStack rStack = tPrefixMaterial.mUnificationTarget; + if (GTUtility.isStackInvalid(rStack)) return GTUtility.copyOrNull(aStack); + ItemStack newStack; + if (unsafe) { + newStack = GTUtility.copyAmountUnsafe(aStack.stackSize, rStack); + } else { + newStack = GTUtility.copyAmount(aStack.stackSize, rStack); + } + // NBT is assigned by reference here, so mutating it may have unexpected side effects. + newStack.setTagCompound(aStack.getTagCompound()); + return newStack; + } + + /** + * Doesn't copy the returned stack or set quantity. Be careful and do not mutate it; intended only to optimize + * comparisons + */ + public static ItemStack get_nocopy(ItemStack aStack) { + return get_nocopy(true, aStack); + } + + /** + * Doesn't copy the returned stack or set quantity. Be careful and do not mutate it; intended only to optimize + * comparisons + */ + static ItemStack get_nocopy(boolean aUseBlackList, ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return null; + ItemData tPrefixMaterial = getAssociation(aStack); + if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData() + || (aUseBlackList && tPrefixMaterial.mBlackListed)) return aStack; + if (aUseBlackList && !GregTechAPI.sUnificationEntriesRegistered && isBlacklisted(aStack)) { + tPrefixMaterial.mBlackListed = true; + return aStack; + } + if (tPrefixMaterial.mUnificationTarget == null) + tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString()); + ItemStack rStack = tPrefixMaterial.mUnificationTarget; + if (GTUtility.isStackInvalid(rStack)) return aStack; + + // Yes, == and not .equals(). + // This check is primarily intended to optimize for the case where both rStack and aStack + // do not have NBT, and so we would be comparing null == null. + // + // Even if aStack and rStack may have equal NBT, we prefer to do an inexpensive + // new ItemStack() over the potentially expensive NBTTagCompound.equals(). + if (aStack.getTagCompound() == rStack.getTagCompound()) { + // Warning: rStack's stack size may not be equal to aStack's stack size. + return rStack; + } + + // Okay, okay, I lied, we actually do need to make a copy. + // This is to fix a long-standing bug where we were mutating NBT directly on rStack, + // which had unexpected and unpredictable ripple effects. + // + // We will do some custom copying here, to avoid ItemStack.copy(), + // which calls the potentially expensive NBTTagCompound.copy() + // NBT is assigned by reference here, so mutating it may have unexpected side effects. + ItemStack newStack = new ItemStack(rStack.getItem(), aStack.stackSize, Items.feather.getDamage(rStack)); + newStack.setTagCompound(aStack.getTagCompound()); + return newStack; + } + + /** + * Compares the first argument against an already-unificated second argument as if aUseBlackList was both true and + * false. + */ + public static boolean isInputStackEqual(ItemStack aStack, ItemStack unified_tStack) { + if (GTUtility.isStackInvalid(aStack)) return false; + return isInputStackEqual(aStack, getAssociation(aStack), unified_tStack); + } + + /** + * Compares the first argument against an already-unificated second argument as if aUseBlackList was both true and + * false. + */ + public static boolean isInputStackEqual(ItemStack aStack, ItemData aStackPrefixData, ItemStack unified_tStack) { + boolean alreadyCompared = false; + if (GTUtility.isStackInvalid(aStack)) return false; + ItemStack rStack = null; + if (aStackPrefixData == null || !aStackPrefixData.hasValidPrefixMaterialData()) + return GTUtility.areStacksEqual(aStack, unified_tStack, true); + else if (aStackPrefixData.mBlackListed) { + if (GTUtility.areStacksEqual(aStack, unified_tStack, true)) return true; + else alreadyCompared = true; + } + if (!alreadyCompared && !GregTechAPI.sUnificationEntriesRegistered && isBlacklisted(aStack)) { + aStackPrefixData.mBlackListed = true; + if (GTUtility.areStacksEqual(aStack, unified_tStack, true)) return true; + else alreadyCompared = true; + } + if (aStackPrefixData.mUnificationTarget == null) + aStackPrefixData.mUnificationTarget = sName2StackMap.get(aStackPrefixData.toString()); + rStack = aStackPrefixData.mUnificationTarget; + if (GTUtility.isStackInvalid(rStack)) + return !alreadyCompared && GTUtility.areStacksEqual(aStack, unified_tStack, true); + return GTUtility.areStacksEqual(rStack, unified_tStack, true); + } + + public static List getNonUnifiedStacks(Object obj) { + if (sUnificationTable.isEmpty() && !sItemStack2DataMap.isEmpty()) { + // use something akin to double check lock. this synchronization overhead is causing lag whenever my + // 5900x tries to do NEI lookup + synchronized (sUnificationTable) { + if (sUnificationTable.isEmpty() && !sItemStack2DataMap.isEmpty()) { + for (ItemStack tGTStack0 : sItemStack2DataMap.keySet()) { + ItemStack tStack0 = GTItemStack.internalCopyStack(tGTStack0); + ItemStack tStack1 = get_nocopy(false, tStack0); + if (!GTUtility.areStacksEqual(tStack0, tStack1)) { + List list = sUnificationTable.computeIfAbsent(tStack1, k -> new ArrayList<>()); + // greg's original code tries to dedupe the list using List#contains, which won't work + // on vanilla ItemStack. I removed it since it never worked and can be slow. + list.add(tStack0); + } + } + } + } + } + ItemStack[] aStacks = {}; + if (obj instanceof ItemStack) aStacks = new ItemStack[] { (ItemStack) obj }; + else if (obj instanceof ItemStack[]) aStacks = (ItemStack[]) obj; + else if (obj instanceof List) aStacks = (ItemStack[]) ((List) obj).toArray(new ItemStack[0]); + List rList = new ArrayList<>(); + for (ItemStack aStack : aStacks) { + if (aStack == null) continue; + rList.add(aStack); + List tList = sUnificationTable.get(aStack); + if (tList != null) { + for (ItemStack tStack : tList) { + ItemStack tStack1 = GTUtility.copyAmount(aStack.stackSize, tStack); + rList.add(tStack1); + } + } + } + return rList; + } + + public static void addItemData(ItemStack aStack, ItemData aData) { + if (GTUtility.isStackValid(aStack) && getItemData(aStack) == null && aData != null) setItemData(aStack, aData); + } + + public static void addItemDataFromInputs(ItemStack output, Object... inputs) { + int length = inputs.length; + ItemData[] tData = new ItemData[length]; + for (int i = 0; i < length; i++) { + if (inputs[i] instanceof ItemStack) { + tData[i] = GTOreDictUnificator.getItemData((ItemStack) inputs[i]); + } else if (inputs[i] instanceof ItemData) { + tData[i] = (ItemData) inputs[i]; + } else { + throw new IllegalArgumentException(); + } + } + if (GTUtility.arrayContainsNonNull(tData)) { + GTOreDictUnificator.addItemData(output, new ItemData(tData)); + } + } + + public static void setItemData(ItemStack aStack, ItemData aData) { + if (GTUtility.isStackInvalid(aStack) || aData == null) return; + ItemData tData = getItemData(aStack); + if (tData == null || !tData.hasValidPrefixMaterialData()) { + if (tData != null) for (Object tObject : tData.mExtraData) + if (!aData.mExtraData.contains(tObject)) aData.mExtraData.add(tObject); + if (aStack.stackSize > 1) { + if (aData.mMaterial != null) aData.mMaterial.mAmount /= aStack.stackSize; + for (MaterialStack tMaterial : aData.mByProducts) tMaterial.mAmount /= aStack.stackSize; + aStack = GTUtility.copyAmount(1, aStack); + } + sItemStack2DataMap.put(aStack, aData); + if (aData.hasValidMaterialData()) { + long tValidMaterialAmount = aData.mMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0 + : aData.mMaterial.mAmount >= 0 ? aData.mMaterial.mAmount : M; + for (MaterialStack tMaterial : aData.mByProducts) + tValidMaterialAmount += tMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0 + : tMaterial.mAmount >= 0 ? tMaterial.mAmount : M; + if (tValidMaterialAmount < M) GTModHandler.addToRecyclerBlackList(aStack); + } + if (mRunThroughTheList) { + if (GregTechAPI.sLoadStarted) { + mRunThroughTheList = false; + for (Entry tEntry : sItemStack2DataMap.entrySet()) if (!tEntry.getValue() + .hasValidPrefixData() || tEntry.getValue().mPrefix.mAllowNormalRecycling) + GTRecipeRegistrator.registerMaterialRecycling( + GTItemStack.internalCopyStack(tEntry.getKey()), + tEntry.getValue()); + } + } else { + if (!aData.hasValidPrefixData() || aData.mPrefix.mAllowNormalRecycling) + GTRecipeRegistrator.registerMaterialRecycling(aStack, aData); + } + } else { + for (Object tObject : aData.mExtraData) + if (!tData.mExtraData.contains(tObject)) tData.mExtraData.add(tObject); + } + } + + public static void removeItemData(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) { + return; + } + sItemStack2DataMap.remove(aStack); + } + + public static void addAssociation(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack, + boolean aBlackListed) { + if (aPrefix == null || aMaterial == null || GTUtility.isStackInvalid(aStack)) return; + if (Items.feather.getDamage(aStack) == W) for (byte i = 0; i < 16; i++) + setItemData(GTUtility.copyAmountAndMetaData(1, i, aStack), new ItemData(aPrefix, aMaterial, aBlackListed)); + setItemData(aStack, new ItemData(aPrefix, aMaterial, aBlackListed)); + } + + @Nullable + public static ItemData getItemData(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return null; + ItemData rData = sItemStack2DataMap.get(aStack); + if (rData == null) { // Try the lookup again but with wildcard damage value + rData = sItemStack2DataMap.get(GTItemStack.internalCopyStack(aStack, true)); + } + return rData; + } + + @Nullable + public static ItemData getAssociation(ItemStack aStack) { + ItemData rData = getItemData(aStack); + return rData != null && rData.hasValidPrefixMaterialData() ? rData : null; + } + + public static boolean isItemStackInstanceOf(ItemStack aStack, Object aName) { + if (GTUtility.isStringInvalid(aName) || GTUtility.isStackInvalid(aStack)) return false; + for (ItemStack tOreStack : getOresImmutable(aName.toString())) + if (GTUtility.areStacksEqual(tOreStack, aStack, true)) return true; + return false; + } + + public static boolean isItemStackDye(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return false; + + for (Dyes tDye : Dyes.VALUES) if (isItemStackInstanceOf(aStack, tDye.toString())) return true; + + return false; + } + + public static boolean registerOre(OrePrefixes aPrefix, Object aMaterial, ItemStack aStack) { + return registerOre(aPrefix.get(aMaterial), aStack); + } + + public static boolean registerOre(Object aName, ItemStack aStack) { + if (aName == null || GTUtility.isStackInvalid(aStack)) return false; + + String tName = aName.toString(); + + if (GTUtility.isStringInvalid(tName)) return false; + + for (ItemStack itemStack : getOresImmutable(tName)) + if (GTUtility.areStacksEqual(itemStack, aStack, true)) return false; + + isRegisteringOre++; + OreDictionary.registerOre(tName, GTUtility.copyAmount(1, aStack)); + isRegisteringOre--; + return true; + } + + public static boolean isRegisteringOres() { + return isRegisteringOre > 0; + } + + public static boolean isAddingOres() { + return isAddingOre > 0; + } + + public static void resetUnificationEntries() { + for (ItemData tPrefixMaterial : sItemStack2DataMap.values()) tPrefixMaterial.mUnificationTarget = null; + } + + public static ItemStack getGem(MaterialStack aMaterial) { + return aMaterial == null ? null : getGem(aMaterial.mMaterial, aMaterial.mAmount); + } + + public static ItemStack getGem(Materials aMaterial, OrePrefixes aPrefix) { + return aMaterial == null ? null : getGem(aMaterial, aPrefix.mMaterialAmount); + } + + public static ItemStack getGem(Materials aMaterial, long aMaterialAmount) { + ItemStack rStack = null; + if (((aMaterialAmount >= M))) rStack = get(OrePrefixes.gem, aMaterial, aMaterialAmount / M); + if (rStack == null) { + if ((((aMaterialAmount * 2) % M == 0) || aMaterialAmount >= M * 16)) + rStack = get(OrePrefixes.gemFlawed, aMaterial, (aMaterialAmount * 2) / M); + if ((((aMaterialAmount * 4) >= M))) + rStack = get(OrePrefixes.gemChipped, aMaterial, (aMaterialAmount * 4) / M); + } + return rStack; + } + + public static ItemStack getDust(MaterialStack aMaterial) { + return aMaterial == null ? null : getDust(aMaterial.mMaterial, aMaterial.mAmount); + } + + public static ItemStack getDust(Materials aMaterial, OrePrefixes aPrefix) { + return aMaterial == null ? null : getDust(aMaterial, aPrefix.mMaterialAmount); + } + + public static ItemStack getDust(Materials aMaterial, long aMaterialAmount) { + if (aMaterialAmount <= 0) return null; + ItemStack rStack = null; + if (((aMaterialAmount % M == 0) || aMaterialAmount >= M * 16)) + rStack = get(OrePrefixes.dust, aMaterial, aMaterialAmount / M); + if (rStack == null && (((aMaterialAmount * 4) % M == 0) || aMaterialAmount >= M * 8)) + rStack = get(OrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M); + if (rStack == null && (((aMaterialAmount * 9) >= M))) + rStack = get(OrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M); + return rStack; + } + + public static ItemStack getIngot(MaterialStack aMaterial) { + return aMaterial == null ? null : getIngot(aMaterial.mMaterial, aMaterial.mAmount); + } + + public static ItemStack getIngot(Materials aMaterial, OrePrefixes aPrefix) { + return aMaterial == null ? null : getIngot(aMaterial, aPrefix.mMaterialAmount); + } + + public static ItemStack getIngot(Materials aMaterial, long aMaterialAmount) { + if (aMaterialAmount <= 0) return null; + ItemStack rStack = null; + if (((aMaterialAmount % (M * 9) == 0 && aMaterialAmount / (M * 9) > 1) || aMaterialAmount >= M * 72)) + rStack = get(OrePrefixes.block, aMaterial, aMaterialAmount / (M * 9)); + if (rStack == null && ((aMaterialAmount % M == 0) || aMaterialAmount >= M * 8)) + rStack = get(OrePrefixes.ingot, aMaterial, aMaterialAmount / M); + if (rStack == null && (((aMaterialAmount * 9) >= M))) + rStack = get(OrePrefixes.nugget, aMaterial, (aMaterialAmount * 9) / M); + return rStack; + } + + public static ItemStack getIngotOrDust(Materials aMaterial, long aMaterialAmount) { + if (aMaterialAmount <= 0) return null; + ItemStack rStack = getIngot(aMaterial, aMaterialAmount); + if (rStack == null) rStack = getDust(aMaterial, aMaterialAmount); + return rStack; + } + + public static ItemStack getIngotOrDust(MaterialStack aMaterial) { + ItemStack rStack = getIngot(aMaterial); + if (rStack == null) rStack = getDust(aMaterial); + return rStack; + } + + public static ItemStack getDustOrIngot(Materials aMaterial, long aMaterialAmount) { + if (aMaterialAmount <= 0) return null; + ItemStack rStack = getDust(aMaterial, aMaterialAmount); + if (rStack == null) rStack = getIngot(aMaterial, aMaterialAmount); + return rStack; + } + + public static ItemStack getDustOrIngot(MaterialStack aMaterial) { + ItemStack rStack = getDust(aMaterial); + if (rStack == null) rStack = getIngot(aMaterial); + return rStack; + } + + /** + * @return a Copy of the OreDictionary.getOres() List + */ + public static ArrayList getOres(OrePrefixes aPrefix, Object aMaterial) { + return getOres(aPrefix.get(aMaterial)); + } + + /** + * @return a Copy of the OreDictionary.getOres() List + */ + public static ArrayList getOres(Object aOreName) { + String aName = aOreName == null ? E : aOreName.toString(); + ArrayList rList = new ArrayList<>(); + if (GTUtility.isStringValid(aName)) rList.addAll(OreDictionary.getOres(aName)); + return rList; + } + + /** + * Fast version of {@link #getOres(Object)}, which doesn't call + * {@link System#arraycopy(Object, int, Object, int, int)} in {@link ArrayList#addAll} + */ + public static List getOresImmutable(@Nullable Object aOreName) { + String aName = aOreName == null ? E : aOreName.toString(); + + return GTUtility.isStringValid(aName) ? Collections.unmodifiableList(OreDictionary.getOres(aName)) + : Collections.emptyList(); + } +} diff --git a/src/main/java/gregtech/api/util/GTPlayedSound.java b/src/main/java/gregtech/api/util/GTPlayedSound.java new file mode 100644 index 0000000000..0b527136b3 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTPlayedSound.java @@ -0,0 +1,31 @@ +package gregtech.api.util; + +import net.minecraft.util.ResourceLocation; + +public class GTPlayedSound { + + public final String mSoundName; + public final int mX, mY, mZ; + + public GTPlayedSound(ResourceLocation aSoundResourceLocation, double aX, double aY, double aZ) { + mSoundName = aSoundResourceLocation.toString(); + mX = (int) aX; + mY = (int) aY; + mZ = (int) aZ; + } + + @Override + public boolean equals(Object aObject) { + if (aObject instanceof GTPlayedSound) { + return ((GTPlayedSound) aObject).mX == mX && ((GTPlayedSound) aObject).mY == mY + && ((GTPlayedSound) aObject).mZ == mZ + && ((GTPlayedSound) aObject).mSoundName.equals(mSoundName); + } + return false; + } + + @Override + public int hashCode() { + return mX + mY + mZ + mSoundName.hashCode(); + } +} diff --git a/src/main/java/gregtech/api/util/GTRecipe.java b/src/main/java/gregtech/api/util/GTRecipe.java new file mode 100644 index 0000000000..7aa3dfbdfb --- /dev/null +++ b/src/main/java/gregtech/api/util/GTRecipe.java @@ -0,0 +1,1366 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.D2; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModContainer; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.logic.FluidInventoryLogic; +import gregtech.api.logic.ItemInventoryLogic; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.metatileentity.implementations.MTEHatchMultiInput; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeCategory; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.RecipeMetadataKey; +import gregtech.api.recipe.metadata.EmptyRecipeMetadataStorage; +import gregtech.api.recipe.metadata.IRecipeMetadataStorage; +import gregtech.api.util.extensions.ArrayExt; +import gregtech.api.util.item.ItemHolder; +import gregtech.common.tileentities.machines.MTEHatchInputBusME; +import gregtech.common.tileentities.machines.MTEHatchInputME; +import gregtech.nei.GTNEIDefaultHandler; +import ic2.core.Ic2Items; +import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.Reference2LongArrayMap; +import it.unimi.dsi.fastutil.objects.Reference2LongMap; +import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap; + +public class GTRecipe implements Comparable { + + private static ItemStack dataStick; + private static ItemStack dataOrb; + private static ItemStack ic2FluidCell; + + public static void setItemStacks() { + ic2FluidCell = Ic2Items.FluidCell.copy(); + dataStick = ItemList.Tool_DataStick.get(1L); + dataOrb = ItemList.Tool_DataOrb.get(1L); + } + + /** + * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs, + * please add a new Recipe, because of the HashMaps. + */ + public ItemStack[] mInputs, mOutputs; + /** + * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs, + * please add a new Recipe, because of the HashMaps. + */ + public FluidStack[] mFluidInputs, mFluidOutputs; + /** + * If you changed the amount of Array-Items inside the Output Array then the length of this Array must be larger or + * equal to the Output Array. A chance of 10000 equals 100% + */ + public int[] mChances; + /** + * An Item that needs to be inside the Special Slot, like for example the Copy Slot inside the Printer. This is only + * useful for Fake Recipes in NEI, since findRecipe() and containsInput() don't give a shit about this Field. Lists + * are also possible. + */ + public Object mSpecialItems; + + public int mDuration, mEUt, mSpecialValue; + /** + * Use this to just disable a specific Recipe, but the Configuration enables that already for every single Recipe. + */ + public boolean mEnabled = true; + /** + * If this Recipe is hidden from NEI + */ + public boolean mHidden = false; + /** + * If this Recipe is Fake and therefore doesn't get found by the findRecipe Function (It is still in the HashMaps, + * so that containsInput does return T on those fake Inputs) + */ + public boolean mFakeRecipe = false; + /** + * If this Recipe can be stored inside a Machine in order to make Recipe searching more Efficient by trying the + * previously used Recipe first. In case you have a Recipe Map overriding things and returning one time use Recipes, + * you have to set this to F. + */ + public boolean mCanBeBuffered = true; + /** + * If this Recipe needs the Output Slots to be completely empty. Needed in case you have randomised Outputs + */ + public boolean mNeedsEmptyOutput = false; + /** + * If this is set to true, NBT equality is required for recipe check. + */ + public boolean isNBTSensitive = false; + /** + * Used for describing recipes that do not fit the default recipe pattern (for example Large Boiler Fuels) + */ + private String[] neiDesc = null; + /** + * Holds a set of metadata for this recipe. + */ + @Nonnull + private final IRecipeMetadataStorage metadataStorage; + /** + * Category this recipe belongs to. Recipes belonging to recipemap are forced to have non-null category when added, + * otherwise it can be null. + */ + private RecipeCategory recipeCategory; + /** + * Stores which mod added this recipe + */ + public List owners = new ArrayList<>(); + /** + * Stores stack traces where this recipe was added + */ + // BW wants to overwrite it, so no final + public List> stackTraces = new ArrayList<>(); + + /** Used for simple cache validation */ + private ItemStack[] inputsAtCacheTime = null; + /** Unified and type-merged stacks of mInputs, each item is guaranteed to be unique */ + private RecipeItemInput[] mergedInputCache = null; + private static final RecipeItemInput[] EMPTY_INPUT_CACHE = new RecipeItemInput[0]; + + /** A single recipe input, used for an internal cache to speed up recipe matching */ + public static final class RecipeItemInput { + + /** Item count is ignored on this stack, do not mutate it either */ + public final ItemStack unifiedStack; + /** Number of input items required */ + public long inputAmount; + /** True if the input is NBT-sensitive */ + public final boolean usesNbtMatching; + + public RecipeItemInput(ItemStack stack, boolean recipeIsNBTSensitive) { + Objects.requireNonNull(stack); + this.inputAmount = stack.stackSize; + final boolean stackNeedsNBT = GTRecipe.shouldCheckNBT(stack); + this.usesNbtMatching = recipeIsNBTSensitive | stackNeedsNBT; + if (stackNeedsNBT) { + this.unifiedStack = stack; + } else { + this.unifiedStack = GTOreDictUnificator.get_nocopy(true, stack); + if (!this.usesNbtMatching) { + this.unifiedStack.setTagCompound(null); + } + } + } + + /** + * @return True if the passed in stack is of the same item type as this input (respecting + * {@link RecipeItemInput#usesNbtMatching}). + */ + public boolean matchesType(final ItemStack other) { + return GTUtility.areStacksEqual(this.unifiedStack, other, !usesNbtMatching); + } + + /** + * @return True if the given input+oredict data for that input can be used as a valid recipe ingredient. + */ + public boolean matchesRecipe(final ItemData oredictOther, final ItemStack other) { + if (usesNbtMatching) { + return GTUtility.areStacksEqual(this.unifiedStack, other, false); + } else { + return GTOreDictUnificator.isInputStackEqual(other, oredictOther, unifiedStack); + } + } + } + + private GTRecipe(GTRecipe aRecipe, boolean shallow) { + mInputs = shallow ? aRecipe.mInputs : GTUtility.copyItemArray(aRecipe.mInputs); + mOutputs = shallow ? aRecipe.mOutputs : GTUtility.copyItemArray(aRecipe.mOutputs); + mSpecialItems = aRecipe.mSpecialItems; + mChances = aRecipe.mChances; + mFluidInputs = shallow ? aRecipe.mFluidInputs : GTUtility.copyFluidArray(aRecipe.mFluidInputs); + mFluidOutputs = shallow ? aRecipe.mFluidOutputs : GTUtility.copyFluidArray(aRecipe.mFluidOutputs); + mDuration = aRecipe.mDuration; + mSpecialValue = aRecipe.mSpecialValue; + mEUt = aRecipe.mEUt; + mNeedsEmptyOutput = aRecipe.mNeedsEmptyOutput; + isNBTSensitive = aRecipe.isNBTSensitive; + mCanBeBuffered = aRecipe.mCanBeBuffered; + mFakeRecipe = aRecipe.mFakeRecipe; + mEnabled = aRecipe.mEnabled; + mHidden = aRecipe.mHidden; + metadataStorage = EmptyRecipeMetadataStorage.INSTANCE; + owners = new ArrayList<>(aRecipe.owners); + reloadOwner(); + } + + /** + * Only for {@link GTRecipeBuilder}. + */ + GTRecipe(ItemStack[] mInputs, ItemStack[] mOutputs, FluidStack[] mFluidInputs, FluidStack[] mFluidOutputs, + int[] mChances, Object mSpecialItems, int mDuration, int mEUt, int mSpecialValue, boolean mEnabled, + boolean mHidden, boolean mFakeRecipe, boolean mCanBeBuffered, boolean mNeedsEmptyOutput, boolean nbtSensitive, + String[] neiDesc, @Nullable IRecipeMetadataStorage metadataStorage, RecipeCategory recipeCategory) { + this.mInputs = mInputs; + this.mOutputs = mOutputs; + this.mFluidInputs = mFluidInputs; + this.mFluidOutputs = mFluidOutputs; + this.mChances = mChances; + this.mSpecialItems = mSpecialItems; + this.mDuration = mDuration; + this.mEUt = mEUt; + this.mSpecialValue = mSpecialValue; + this.mEnabled = mEnabled; + this.mHidden = mHidden; + this.mFakeRecipe = mFakeRecipe; + this.mCanBeBuffered = mCanBeBuffered; + this.mNeedsEmptyOutput = mNeedsEmptyOutput; + this.isNBTSensitive = nbtSensitive; + this.neiDesc = neiDesc; + this.metadataStorage = metadataStorage == null ? EmptyRecipeMetadataStorage.INSTANCE : metadataStorage.copy(); + this.recipeCategory = recipeCategory; + + reloadOwner(); + } + + public GTRecipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances, + FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) { + if (aInputs == null) aInputs = new ItemStack[0]; + if (aOutputs == null) aOutputs = new ItemStack[0]; + if (aFluidInputs == null) aFluidInputs = new FluidStack[0]; + if (aFluidOutputs == null) aFluidOutputs = new FluidStack[0]; + if (aChances == null) aChances = new int[aOutputs.length]; + if (aChances.length < aOutputs.length) aChances = Arrays.copyOf(aChances, aOutputs.length); + + aInputs = ArrayExt.withoutTrailingNulls(aInputs, ItemStack[]::new); + aOutputs = ArrayExt.withoutTrailingNulls(aOutputs, ItemStack[]::new); + aFluidInputs = ArrayExt.withoutNulls(aFluidInputs, FluidStack[]::new); + aFluidOutputs = ArrayExt.withoutNulls(aFluidOutputs, FluidStack[]::new); + + GTOreDictUnificator.setStackArray(true, aInputs); + GTOreDictUnificator.setStackArray(true, aOutputs); + + for (ItemStack tStack : aOutputs) GTUtility.updateItemStack(tStack); + + for (int i = 0; i < aChances.length; i++) if (aChances[i] <= 0) aChances[i] = 10000; + for (int i = 0; i < aFluidInputs.length; i++) aFluidInputs[i] = aFluidInputs[i].copy(); + for (int i = 0; i < aFluidOutputs.length; i++) aFluidOutputs[i] = aFluidOutputs[i].copy(); + + if (aOptimize && aDuration >= 32) { + ArrayList tList = new ArrayList<>(); + tList.addAll(Arrays.asList(aInputs)); + tList.addAll(Arrays.asList(aOutputs)); + for (int i = 0; i < tList.size(); i++) if (tList.get(i) == null) tList.remove(i--); + + for (byte i = (byte) Math.min(64, aDuration / 16); i > 1; i--) if (aDuration / i >= 16) { + boolean temp = true; + for (ItemStack stack : tList) if (stack.stackSize % i != 0) { + temp = false; + break; + } + if (temp) for (FluidStack aFluidInput : aFluidInputs) if (aFluidInput.amount % i != 0) { + temp = false; + break; + } + if (temp) for (FluidStack aFluidOutput : aFluidOutputs) if (aFluidOutput.amount % i != 0) { + temp = false; + break; + } + if (temp) { + for (ItemStack itemStack : tList) itemStack.stackSize /= i; + for (FluidStack aFluidInput : aFluidInputs) aFluidInput.amount /= i; + for (FluidStack aFluidOutput : aFluidOutputs) aFluidOutput.amount /= i; + aDuration /= i; + } + } + } + + mInputs = aInputs; + mOutputs = aOutputs; + mSpecialItems = aSpecialItems; + mChances = aChances; + mFluidInputs = aFluidInputs; + mFluidOutputs = aFluidOutputs; + mDuration = aDuration; + mSpecialValue = aSpecialValue; + mEUt = aEUt; + metadataStorage = EmptyRecipeMetadataStorage.INSTANCE; + // checkCellBalance(); + reloadOwner(); + } + + // aSpecialValue = EU per Liter! If there is no Liquid for this Object, then it gets multiplied with 1000! + public GTRecipe(ItemStack aInput1, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4, + int aSpecialValue, int aType) { + this( + true, + new ItemStack[] { aInput1 }, + new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4 }, + null, + null, + null, + null, + 0, + 0, + Math.max(1, aSpecialValue)); + + if (mInputs.length > 0 && aSpecialValue > 0) { + switch (aType) { + // Diesel Generator + case 0 -> { + RecipeMaps.dieselFuels.addRecipe(this); + RecipeMaps.largeBoilerFakeFuels.getBackend() + .addDieselRecipe(this); + } + // Gas Turbine + case 1 -> RecipeMaps.gasTurbineFuels.addRecipe(this); + + // Thermal Generator + case 2 -> RecipeMaps.hotFuels.addRecipe(this); + + // Plasma Generator + case 4 -> RecipeMaps.plasmaFuels.addRecipe(this); + + // Magic Generator + case 5 -> RecipeMaps.magicFuels.addRecipe(this); + + // Fluid Generator. Usually 3. Every wrong Type ends up in the Semifluid Generator + default -> { + RecipeMaps.denseLiquidFuels.addRecipe(this); + RecipeMaps.largeBoilerFakeFuels.getBackend() + .addDenseLiquidRecipe(this); + } + } + } + } + + // Dummy GTRecipe maker... + public GTRecipe(ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances, + FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) { + this( + true, + aInputs, + aOutputs, + aSpecialItems, + aChances, + aFluidInputs, + aFluidOutputs, + aDuration, + aEUt, + aSpecialValue); + } + + /** + * Re-unificates all the items present in recipes. + */ + public static void reInit() { + GTLog.out.println("GTMod: Re-Unificating Recipes."); + for (RecipeMap map : RecipeMap.ALL_RECIPE_MAPS.values()) { + map.getBackend() + .reInit(); + } + } + + public ItemStack getRepresentativeInput(int aIndex) { + if (aIndex < 0 || aIndex >= mInputs.length) return null; + return GTUtility.copyOrNull(mInputs[aIndex]); + } + + public ItemStack getOutput(int aIndex) { + if (aIndex < 0 || aIndex >= mOutputs.length) return null; + return GTUtility.copyOrNull(mOutputs[aIndex]); + } + + /** + * Dictates the ItemStacks displayed in the output slots of any NEI page handled by the default GT NEI handler. + * Override to make shown items differ from a GTRecipe's item output array + * + * @see GTNEIDefaultHandler + * @param i Slot index + * @return ItemStack to be displayed in the slot + */ + public ItemStack getRepresentativeOutput(int i) { + return getOutput(i); + } + + public int getOutputChance(int aIndex) { + if (mChances == null) return 10000; + if (aIndex < 0 || aIndex >= mChances.length) return 10000; + return mChances[aIndex]; + } + + public FluidStack getRepresentativeFluidInput(int aIndex) { + if (aIndex < 0 || aIndex >= mFluidInputs.length || mFluidInputs[aIndex] == null) return null; + return mFluidInputs[aIndex].copy(); + } + + public FluidStack getFluidOutput(int aIndex) { + if (aIndex < 0 || aIndex >= mFluidOutputs.length || mFluidOutputs[aIndex] == null) return null; + return mFluidOutputs[aIndex].copy(); + } + + public void checkCellBalance() { + if (!D2 || mInputs.length < 1) return; + + int tInputAmount = GTModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(mInputs); + int tOutputAmount = GTModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(mOutputs); + + if (tInputAmount < tOutputAmount) { + if (!Materials.Tin.contains(mInputs)) { + GTLog.err.println("You get more Cells, than you put in? There must be something wrong."); + new Exception().printStackTrace(GTLog.err); + } + } else if (tInputAmount > tOutputAmount) { + if (!Materials.Tin.contains(mOutputs)) { + GTLog.err.println("You get less Cells, than you put in? GT Machines usually don't destroy Cells."); + new Exception().printStackTrace(GTLog.err); + } + } + } + + public GTRecipe copy() { + return new GTRecipe(this, false); + } + + public GTRecipe copyShallow() { + return new GTRecipe(this, true); + } + + public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, FluidStack[] aFluidInputs, + ItemStack... aInputs) { + return isRecipeInputEqual(aDecreaseStacksizeBySuccess, false, 1, aFluidInputs, aInputs); + } + + // For non-multiplied recipe amount values + public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, boolean aDontCheckStackSizes, + FluidStack[] aFluidInputs, ItemStack... aInputs) { + return isRecipeInputEqual(aDecreaseStacksizeBySuccess, aDontCheckStackSizes, 1, aFluidInputs, aInputs); + } + + /** + * Okay, did some code archeology to figure out what's going on here. + * + *

+ * This variable was added in this + * commit, in order to fix the issues mentioned in the PR. + * + *

+ * It looks like it controls checking NBT. At this point, since we are still using universal fluid cells which store + * their fluids in NBT, it probably will not be safe to disable the NBT checks in the near future. Data sticks may + * be another case. Anyway, we probably can't get rid of this without some significant changes to clean up recipe + * inputs. + */ + public static boolean GTppRecipeHelper; + + /** + * @return Computes a (cached) array of all input items, combined by type into stacks. Do not mutate. + */ + private @NotNull RecipeItemInput @NotNull [] getCachedCombinedItemInputs() { + if (mergedInputCache != null) { + if (mInputs != inputsAtCacheTime) { + throw new IllegalStateException( + "Inputs to this recipe have been modified since first recipe match: " + this); + } + return mergedInputCache; + } + + synchronized (this) { + // In case another thread initialized it while this synchronized block was locked: + if (mergedInputCache != null) { + if (mInputs != inputsAtCacheTime) { + throw new IllegalStateException( + "Inputs to this recipe have been modified since first recipe match: " + this); + } + return mergedInputCache; + } + + final ItemStack[] inputs = mInputs; + inputsAtCacheTime = inputs; + if (inputs == null || inputs.length == 0) { + mergedInputCache = EMPTY_INPUT_CACHE; + return mergedInputCache; + } + final ObjectArrayList<@NotNull RecipeItemInput> newCache = ObjectArrayList + .wrap(new RecipeItemInput[inputs.length], 0); + for (final ItemStack itemStack : inputs) { + if (itemStack == null) continue; + final RecipeItemInput existingInput = newCache.stream() + .filter(existing -> existing.matchesType(itemStack)) + .findAny() + .orElse(null); + if (existingInput == null) { + newCache.add(new RecipeItemInput(itemStack, isNBTSensitive)); + } else { + existingInput.inputAmount = Math.addExact(existingInput.inputAmount, itemStack.stackSize); + } + } + final RecipeItemInput[] frozenCache = newCache.toArray(new RecipeItemInput[0]); + if (GregTechAPI.sFullLoadFinished) { + mergedInputCache = frozenCache; + } + return frozenCache; + } + } + + /** + * WARNING: Do not call this method with both {@code aDecreaseStacksizeBySuccess} and {@code aDontCheckStackSizes} + * set to {@code true}! You'll get weird behavior. + */ + public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, boolean aDontCheckStackSizes, + int amountMultiplier, FluidStack[] aFluidInputs, ItemStack... aInputs) { + double maxParallel = maxParallelCalculatedByInputs(amountMultiplier, aFluidInputs, aInputs); + if (aDontCheckStackSizes) { + return maxParallel > 0; + } else if (maxParallel >= amountMultiplier) { + if (aDecreaseStacksizeBySuccess) { + consumeInput(amountMultiplier, aFluidInputs, aInputs); + } + return true; + } + return false; + } + + /** + * WARNING: Ensure that item inputs and fluid inputs are enough to be consumed with + * {@link #maxParallelCalculatedByInputs} before calling this method! + */ + public void consumeInput(int amountMultiplier, FluidStack[] aFluidInputs, ItemStack... aInputs) { + if (amountMultiplier <= 0) return; + + if (aFluidInputs != null) { + for (FluidStack recipeFluidCost : mFluidInputs) { + if (recipeFluidCost != null) { + long remainingCost = (long) recipeFluidCost.amount * amountMultiplier; + + for (FluidStack providedFluid : aFluidInputs) { + if (providedFluid != null && providedFluid.isFluidEqual(recipeFluidCost)) { + if (providedFluid.amount >= remainingCost) { + providedFluid.amount -= remainingCost; + break; + } else { + remainingCost -= providedFluid.amount; + providedFluid.amount = 0; + } + } + } + } + } + } + + if (aInputs == null || aInputs.length == 0) { + return; + } + + final ItemData[] unifiedProvidedInputs = new ItemData[aInputs.length]; + for (int i = 0; i < aInputs.length; i++) { + unifiedProvidedInputs[i] = GTOreDictUnificator.getAssociation(aInputs[i]); + } + final @NotNull RecipeItemInput @NotNull [] combinedInputs = getCachedCombinedItemInputs(); + + for (final RecipeItemInput recipeItemCost : combinedInputs) { + long remainingCost = recipeItemCost.inputAmount * amountMultiplier; + + for (int iProvided = 0; iProvided < aInputs.length && remainingCost > 0; iProvided++) { + final ItemStack providedItem = aInputs[iProvided]; + if (providedItem == null || providedItem.stackSize == 0) { + continue; + } + + final ItemData providedUnifiedItem = unifiedProvidedInputs[iProvided]; + if (!recipeItemCost.matchesRecipe(providedUnifiedItem, providedItem)) { + continue; + } + + if (providedItem.stackSize >= remainingCost) { + providedItem.stackSize -= (int) remainingCost; + break; + } else { + remainingCost -= providedItem.stackSize; + providedItem.stackSize = 0; + } + } + } + } + + /** + * Returns the number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that inputs + * are found but not enough. + */ + public double maxParallelCalculatedByInputs(int maxParallel, FluidStack[] aFluidInputs, ItemStack... aInputs) { + if (mInputs.length > 0 && aInputs == null) return 0; + if (mFluidInputs.length > 0 && aFluidInputs == null) return 0; + + double currentParallel = maxParallel; + + // We need to have any fluids inputs, otherwise the code below does nothing. The second check is always true + // because of early exit condition above. + if (mFluidInputs.length > 0 /* && aFluidInputs != null */) { + // Create map for fluid -> stored amount + Reference2LongMap fluidMap = new Reference2LongArrayMap<>(2); + Reference2LongMap fluidCost = new Reference2LongArrayMap<>(2); + for (FluidStack fluidStack : aFluidInputs) { + if (fluidStack == null) continue; + fluidMap.mergeLong(fluidStack.getFluid(), fluidStack.amount, Long::sum); + } + for (FluidStack fluidStack : mFluidInputs) { + if (fluidStack == null) continue; + fluidCost.mergeLong(fluidStack.getFluid(), fluidStack.amount, Long::sum); + } + + // Check how many parallels can it perform for each fluid + for (Reference2LongMap.Entry costEntry : fluidCost.reference2LongEntrySet()) { + if (costEntry.getLongValue() > 0) { + currentParallel = Math.min( + currentParallel, + (double) fluidMap.getOrDefault(costEntry.getKey(), 0L) / costEntry.getLongValue()); + } + if (currentParallel <= 0) { + return 0; + } + } + } + + if (mInputs.length > 0) { + final @NotNull RecipeItemInput @NotNull [] combinedInputs = getCachedCombinedItemInputs(); + + if (aInputs.length < combinedInputs.length) { + // Fewer item types provided than required by the recipe, making it impossible to satisfy. + return 0; + } + final ItemData[] unifiedProvidedInputs = new ItemData[aInputs.length]; + for (int i = 0; i < aInputs.length; i++) { + unifiedProvidedInputs[i] = GTOreDictUnificator.getAssociation(aInputs[i]); + } + + recipeItemLoop: for (final RecipeItemInput combinedInput : combinedInputs) { + double remainingCost = combinedInput.inputAmount * currentParallel; + long providedAmount = 0; + + for (int i = 0; i < unifiedProvidedInputs.length; i++) { + final ItemData providedUnifiedItem = unifiedProvidedInputs[i]; + final ItemStack providedItem = aInputs[i]; + if (!combinedInput.matchesRecipe(providedUnifiedItem, providedItem)) { + continue; + } + + providedAmount += providedItem.stackSize; + + if (providedAmount >= remainingCost) { + continue recipeItemLoop; + } + } + if (providedAmount == 0) { + return 0; + } + currentParallel = Math.min(currentParallel, (double) providedAmount / combinedInput.inputAmount); + } + } + return currentParallel; + } + + /** + * Please see JavaDoc on {@link #GTppRecipeHelper} for why this is here. + */ + private static boolean shouldCheckNBT(ItemStack item) { + if (GTppRecipeHelper) { + return GTUtility.areStacksEqual(item, ic2FluidCell, true) || GTUtility.areStacksEqual(item, dataStick, true) + || GTUtility.areStacksEqual(item, dataOrb, true); + } + return false; + } + + public boolean isRecipePossible(@Nullable ItemInventoryLogic itemInput, @Nullable FluidInventoryLogic fluidInput) { + return getAmountOfRecipesDone(itemInput, fluidInput, 1, true) > 0; + } + + public long getAmountOfRecipesDone(@Nullable ItemInventoryLogic itemInput, @Nullable FluidInventoryLogic fluidInput, + long maxParallel, boolean simulate) { + if (itemInput == null) { + itemInput = new ItemInventoryLogic(0); + } + + if (fluidInput == null) { + fluidInput = new FluidInventoryLogic(0, 0); + } + + itemInput.startRecipeCheck(); + Map recipeItems = getItemInputsAsItemMap(); + for (Entry entry : recipeItems.entrySet()) { + maxParallel = Math + .min(maxParallel, itemInput.calculateAmountOfTimesItemCanBeTaken(entry.getKey(), entry.getValue())); + } + + for (FluidStack fluid : mFluidInputs) { + if (fluid == null) continue; + maxParallel = Math + .min(maxParallel, fluidInput.calculateAmountOfTimesFluidCanBeTaken(fluid.getFluid(), fluid.amount)); + } + + if (simulate) { + itemInput.stopRecipeCheck(); + return maxParallel; + } + + for (Entry entry : recipeItems.entrySet()) { + itemInput.subtractItemAmount(entry.getKey(), entry.getValue() * maxParallel, false); + } + + for (FluidStack fluid : mFluidInputs) { + if (fluid == null) continue; + fluidInput.drain(fluid.getFluid(), fluid.amount * maxParallel, false); + } + itemInput.stopRecipeCheck(); + return maxParallel; + } + + private Map getItemInputsAsItemMap() { + Map items = new HashMap<>(); + for (ItemStack item : mInputs) { + if (item == null) continue; + ItemHolder itemHolder = new ItemHolder(item); + items.put(itemHolder, items.getOrDefault(itemHolder, 0L) + item.stackSize); + } + return items; + } + + @Override + public int compareTo(GTRecipe recipe) { + // first lowest tier recipes + // then fastest + // then with lowest special value + // then dry recipes + // then with fewer inputs + if (this.mEUt != recipe.mEUt) { + return Integer.compare(this.mEUt, recipe.mEUt); + } else if (this.mDuration != recipe.mDuration) { + return Integer.compare(this.mDuration, recipe.mDuration); + } else if (this.mSpecialValue != recipe.mSpecialValue) { + return Integer.compare(this.mSpecialValue, recipe.mSpecialValue); + } else if (this.mFluidInputs.length != recipe.mFluidInputs.length) { + return Integer.compare(this.mFluidInputs.length, recipe.mFluidInputs.length); + } else if (this.mInputs.length != recipe.mInputs.length) { + return Integer.compare(this.mInputs.length, recipe.mInputs.length); + } + return 0; + } + + public String[] getNeiDesc() { + return neiDesc; + } + + /** + * Sets description shown on NEI.
+ * If you have a large number of recipes for the recipemap, this is not efficient memory wise, so use + * {@link gregtech.api.recipe.RecipeMapBuilder#neiSpecialInfoFormatter} instead. + */ + public void setNeiDesc(String... neiDesc) { + this.neiDesc = neiDesc; + } + + // region metadata + + // Don't try implementing setMetadata, as metadataStorage can be EmptyRecipeMetadataStorage + + /** + * Gets metadata associated with this recipe. Can return null. Use + * {@link #getMetadataOrDefault(RecipeMetadataKey, Object)} + * if you want to specify default value. + */ + @Nullable + public T getMetadata(RecipeMetadataKey key) { + return key.cast(metadataStorage.getMetadata(key)); + } + + /** + * Gets metadata associated with this recipe with default value. Does not return null unless default value is null. + */ + @Contract("_, !null -> !null") + @Nullable + public T getMetadataOrDefault(RecipeMetadataKey key, @Nullable T defaultValue) { + return key.cast(metadataStorage.getMetadataOrDefault(key, defaultValue)); + } + + @Nonnull + public IRecipeMetadataStorage getMetadataStorage() { + return metadataStorage; + } + + // endregion + + public RecipeCategory getRecipeCategory() { + return recipeCategory; + } + + /** + * Exists only for recipe copying from external. For ordinal use case, use {@link GTRecipeBuilder#recipeCategory}. + */ + public void setRecipeCategory(RecipeCategory recipeCategory) { + this.recipeCategory = recipeCategory; + } + + private static final List excludedStacktraces = Arrays.asList( + "java.lang.Thread", + "gregtech.api.interfaces.IRecipeMap", + "gregtech.api.interfaces.IRecipeMap$1", + "gregtech.api.recipe.RecipeMap", + "gregtech.api.recipe.RecipeMapBackend", + "gregtech.api.recipe.RecipeMapBackendPropertiesBuilder", + "gregtech.api.util.GTRecipe", + "gregtech.api.util.GTRecipeBuilder", + "gregtech.api.util.GTRecipeConstants", + "gregtech.api.util.GTRecipeMapUtil", + "gregtech.common.GTRecipeAdder"); + + public void reloadOwner() { + setOwner( + Loader.instance() + .activeModContainer()); + + if (GTMod.gregtechproxy.mNEIRecipeOwnerStackTrace) { + List toAdd = new ArrayList<>(); + for (StackTraceElement stackTrace : Thread.currentThread() + .getStackTrace()) { + if (excludedStacktraces.stream() + .noneMatch( + c -> stackTrace.getClassName() + .equals(c))) { + toAdd.add(formatStackTrace(stackTrace)); + } + } + stackTraces.add(toAdd); + } + } + + private static String formatStackTrace(StackTraceElement stackTraceElement) { + String raw = stackTraceElement.toString(); + int startParen = raw.lastIndexOf('('); + int colon = raw.lastIndexOf(':'); + if (colon == -1) { + // native or unknown source + return raw; + } + // strip class name and leave line number, as class name is already shown + return raw.substring(0, startParen + 1) + raw.substring(colon); + } + + public void setOwner(ModContainer newOwner) { + ModContainer oldOwner = !owners.isEmpty() ? this.owners.get(owners.size() - 1) : null; + if (newOwner != null && newOwner != oldOwner) { + owners.add(newOwner); + } + } + + /** + * Use in case {@link Loader#activeModContainer()} isn't helpful + */ + public void setOwner(String modId) { + for (ModContainer mod : Loader.instance() + .getModList()) { + if (mod.getModId() + .equals(modId)) { + setOwner(mod); + return; + } + } + } + + public GTRecipe setInputs(ItemStack... aInputs) { + // TODO determine if we need this without trailing nulls call + this.mInputs = ArrayExt.withoutTrailingNulls(aInputs, ItemStack[]::new); + return this; + } + + public GTRecipe setOutputs(ItemStack... aOutputs) { + this.mOutputs = ArrayExt.withoutTrailingNulls(aOutputs, ItemStack[]::new); + return this; + } + + public GTRecipe setFluidInputs(FluidStack... aInputs) { + this.mFluidInputs = ArrayExt.withoutTrailingNulls(aInputs, FluidStack[]::new); + return this; + } + + public GTRecipe setFluidOutputs(FluidStack... aOutputs) { + this.mFluidOutputs = ArrayExt.withoutTrailingNulls(aOutputs, FluidStack[]::new); + return this; + } + + public GTRecipe setDuration(int aDuration) { + this.mDuration = aDuration; + return this; + } + + public GTRecipe setEUt(int aEUt) { + this.mEUt = aEUt; + return this; + } + + public static class RecipeAssemblyLine { + + public static final ArrayList sAssemblylineRecipes = new ArrayList<>(); + + static { + if (!Boolean.getBoolean("com.gtnh.gt5u.ignore-invalid-assline-recipe")) + GregTechAPI.sFirstWorldTick.add(RecipeAssemblyLine::checkInvalidRecipes); + else GTLog.out.println("NOT CHECKING INVALID ASSLINE RECIPE."); + } + + private static void checkInvalidRecipes() { + int invalidCount = 0; + GTLog.out.println("Started assline validation"); + for (RecipeAssemblyLine recipe : sAssemblylineRecipes) { + if (recipe.getPersistentHash() == 0) { + invalidCount++; + GTLog.err.printf("Invalid recipe: %s%n", recipe); + } + } + if (invalidCount > 0) throw new RuntimeException( + "There are " + invalidCount + " invalid assembly line recipe(s)! Check GregTech.log for details!"); + } + + public ItemStack mResearchItem; + public int mResearchTime; + public ItemStack[] mInputs; + public FluidStack[] mFluidInputs; + public ItemStack mOutput; + public int mDuration; + public int mEUt; + public ItemStack[][] mOreDictAlt; + private int mPersistentHash; + + /** + * THIS CONSTRUCTOR DOES SET THE PERSISTENT HASH. + *

+ * if you set one yourself, it will give you one of the RunetimeExceptions! + */ + public RecipeAssemblyLine(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs, + FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) { + this( + aResearchItem, + aResearchTime, + aInputs, + aFluidInputs, + aOutput, + aDuration, + aEUt, + new ItemStack[aInputs.length][]); + int tPersistentHash = 1; + for (ItemStack tInput : aInputs) + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(tInput, true, false); + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(aResearchItem, true, false); + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(aOutput, true, false); + for (FluidStack tFluidInput : aFluidInputs) + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(tFluidInput, true, false); + tPersistentHash = tPersistentHash * 31 + aResearchTime; + tPersistentHash = tPersistentHash * 31 + aDuration; + tPersistentHash = tPersistentHash * 31 + aEUt; + setPersistentHash(tPersistentHash); + } + + /** + * THIS CONSTRUCTOR DOES NOT SET THE PERSISTENT HASH. + *

+ * if you don't set one yourself, it will break a lot of stuff! + */ + public RecipeAssemblyLine(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs, + FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt, ItemStack[][] aAlt) { + mResearchItem = aResearchItem; + mResearchTime = aResearchTime; + mInputs = aInputs; + mFluidInputs = aFluidInputs; + mOutput = aOutput; + mDuration = aDuration; + mEUt = aEUt; + mOreDictAlt = aAlt; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + GTItemStack[] thisInputs = new GTItemStack[this.mInputs.length]; + int totalInputStackSize = 0; + for (int i = 0; i < this.mInputs.length; i++) { + thisInputs[i] = new GTItemStack(this.mInputs[i]); + totalInputStackSize += thisInputs[i].mStackSize; + } + int inputHash = Arrays.deepHashCode(thisInputs); + int inputFluidHash = Arrays.deepHashCode(this.mFluidInputs); + GTItemStack thisOutput = new GTItemStack(mOutput); + GTItemStack thisResearch = new GTItemStack(mResearchItem); + int miscRecipeDataHash = Arrays.deepHashCode( + new Object[] { totalInputStackSize, mDuration, mEUt, thisOutput, thisResearch, mResearchTime }); + result = prime * result + inputFluidHash; + result = prime * result + inputHash; + result = prime * result + miscRecipeDataHash; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof RecipeAssemblyLine other)) { + return false; + } + if (this.mInputs.length != other.mInputs.length) { + return false; + } + if (this.mFluidInputs.length != other.mFluidInputs.length) { + return false; + } + // Check Outputs Match + GTItemStack output1 = new GTItemStack(this.mOutput); + GTItemStack output2 = new GTItemStack(other.mOutput); + if (!output1.equals(output2)) { + return false; + } + // Check Scanned Item Match + GTItemStack scan1 = new GTItemStack(this.mResearchItem); + GTItemStack scan2 = new GTItemStack(other.mResearchItem); + if (!scan1.equals(scan2)) { + return false; + } + // Check Items Match + GTItemStack[] thisInputs = new GTItemStack[this.mInputs.length]; + GTItemStack[] otherInputs = new GTItemStack[other.mInputs.length]; + for (int i = 0; i < thisInputs.length; i++) { + thisInputs[i] = new GTItemStack(this.mInputs[i]); + otherInputs[i] = new GTItemStack(other.mInputs[i]); + } + for (int i = 0; i < thisInputs.length; i++) { + if (!thisInputs[i].equals(otherInputs[i]) || thisInputs[i].mStackSize != otherInputs[i].mStackSize) { + return false; + } + } + // Check Fluids Match + for (int i = 0; i < this.mFluidInputs.length; i++) { + if (!this.mFluidInputs[i].isFluidStackIdentical(other.mFluidInputs[i])) { + return false; + } + } + + return this.mDuration == other.mDuration && this.mEUt == other.mEUt + && this.mResearchTime == other.mResearchTime; + } + + public int getPersistentHash() { + if (mPersistentHash == 0) + GTLog.err.println("Assline recipe persistent hash has not been set! Recipe: " + mOutput); + return mPersistentHash; + } + + @Override + public String toString() { + return "GTRecipe_AssemblyLine{" + "mResearchItem=" + + mResearchItem + + ", mResearchTime=" + + mResearchTime + + ", mInputs=" + + Arrays.toString(mInputs) + + ", mFluidInputs=" + + Arrays.toString(mFluidInputs) + + ", mOutput=" + + mOutput + + ", mDuration=" + + mDuration + + ", mEUt=" + + mEUt + + ", mOreDictAlt=" + + Arrays.toString(mOreDictAlt) + + '}'; + } + + /** + * @param aPersistentHash the persistent hash. it should reflect the exact input used to generate this recipe If + * 0 is passed in, the actual persistent hash will be automatically remapped to 1 + * instead. + * @throws IllegalStateException if the persistent hash has been set already + */ + public void setPersistentHash(int aPersistentHash) { + if (this.mPersistentHash != 0) throw new IllegalStateException("Cannot set persistent hash twice!"); + if (aPersistentHash == 0) this.mPersistentHash = 1; + else this.mPersistentHash = aPersistentHash; + } + + /** + * @param inputBusses List of input busses to check. + * @return An array containing the amount of item to consume from the first slot of every input bus. + * {@code null} if at least one item fails to match the recipe ingredient. + */ + public static int[] getItemConsumptionAmountArray(ArrayList inputBusses, + RecipeAssemblyLine recipe) { + int itemCount = recipe.mInputs.length; + if (itemCount == 0) return null; + int[] tStacks = new int[itemCount]; + for (int i = 0; i < itemCount; i++) { + MTEHatchInputBus inputBus = inputBusses.get(i); + if (!inputBus.isValid()) return null; + ItemStack slotStack; + if (inputBus instanceof MTEHatchInputBusME meBus) { + slotStack = meBus.getShadowItemStack(0); + } else { + slotStack = inputBus.getStackInSlot(0); + } + if (slotStack == null) return null; + + int amount = getMatchedIngredientAmount(slotStack, recipe.mInputs[i], recipe.mOreDictAlt[i]); + if (amount < 0) return null; + + tStacks[i] = amount; + } + return tStacks; + } + + public static int getMatchedIngredientAmount(ItemStack aSlotStack, ItemStack aIngredient, ItemStack[] alts) { + if (alts == null || alts.length == 0) { + if (GTUtility.areStacksEqual(aSlotStack, aIngredient, true)) { + return aIngredient.stackSize; + } + return -1; + } + for (ItemStack tAltStack : alts) { + if (GTUtility.areStacksEqual(aSlotStack, tAltStack, true)) { + return tAltStack.stackSize; + } + } + return -1; + } + + /** + * @param inputBusses Input bus list to check. Usually the input bus list of multi. + * @param itemConsumptions Should be generated by {@link RecipeAssemblyLine#getItemConsumptionAmountArray}. + * @Return The number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that + * inputs are found but not enough. + */ + public static double maxParallelCalculatedByInputItems(ArrayList inputBusses, int maxParallel, + int[] itemConsumptions, Map inputsFromME) { + // Recipe item matching is done in the generation of itemConsumptions. + + Map itemConsumptionsFromME = new Object2LongOpenHashMap<>(); + double currentParallel = maxParallel; + + // Calculate the amount of each item to consume from ME + for (int i = 0; i < itemConsumptions.length; i++) { + MTEHatchInputBus inputBus = inputBusses.get(i); + if (!inputBus.isValid()) return 0; + if (inputBus instanceof MTEHatchInputBusME meBus) { + ItemStack item = meBus.getShadowItemStack(0); + if (item == null) return 0; + GTUtility.ItemId id = GTUtility.ItemId.createNoCopy(item); + itemConsumptionsFromME.merge(id, (long) itemConsumptions[i], Long::sum); + } + } + // Calculate parallel from ME input busses + for (Entry entry : itemConsumptionsFromME.entrySet()) { + if (!inputsFromME.containsKey(entry.getKey())) return 0; + long consume = entry.getValue(); + // For non-consumed inputs + if (consume == 0) continue; + currentParallel = Math + .min(currentParallel, (double) inputsFromME.get(entry.getKey()).stackSize / consume); + if (currentParallel <= 0) return 0; + } + + // Calculate parallel from regular input busses + for (int i = 0; i < itemConsumptions.length; i++) { + MTEHatchInputBus inputBus = inputBusses.get(i); + if (!inputBus.isValid()) return 0; + if (inputBus instanceof MTEHatchInputBusME) continue; + + ItemStack item = inputBus.getStackInSlot(0); + if (item == null) return 0; + // For non-consumed inputs + if (itemConsumptions[i] == 0) continue; + currentParallel = Math.min(currentParallel, (double) item.stackSize / itemConsumptions[i]); + if (currentParallel <= 0) return 0; + } + return currentParallel; + } + + /** + * @param inputHatches Input hatch list to check. Usually the input hatch list of multi. + * @param fluidConsumptions Fluid inputs of the recipe. + * @return The number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that + * fluids are found but not enough. + */ + public static double maxParallelCalculatedByInputFluids(ArrayList inputHatches, int maxParallel, + FluidStack[] fluidConsumptions, Map fluidsFromME) { + Map fluidConsumptionsFromME = new Reference2LongOpenHashMap<>(); + double currentParallel = maxParallel; + + // Calculate the amount of each fluid to consume from ME + for (int i = 0; i < fluidConsumptions.length; i++) { + MTEHatchInput inputHatch = inputHatches.get(i); + if (!inputHatch.isValid()) return 0; + if (inputHatch instanceof MTEHatchInputME meHatch) { + FluidStack fluid = meHatch.getShadowFluidStack(0); + if (fluid == null) return 0; + if (!GTUtility.areFluidsEqual(fluid, fluidConsumptions[i])) return 0; + fluidConsumptionsFromME.merge(fluid.getFluid(), (long) fluidConsumptions[i].amount, Long::sum); + } + } + // Calculate parallel from ME input hatches + for (Entry entry : fluidConsumptionsFromME.entrySet()) { + Fluid fluid = entry.getKey(); + if (!fluidsFromME.containsKey(fluid)) return 0; + long consume = entry.getValue(); + currentParallel = Math.min(currentParallel, (double) fluidsFromME.get(fluid).amount / consume); + if (currentParallel <= 0) return 0; + } + + // Calculate parallel from regular input hatches + for (int i = 0; i < fluidConsumptions.length; i++) { + MTEHatchInput inputHatch = inputHatches.get(i); + if (!inputHatch.isValid()) return 0; + if (inputHatch instanceof MTEHatchInputME) continue; + + FluidStack fluid; + if (inputHatch instanceof MTEHatchMultiInput multiInput) { + fluid = multiInput.getFluid(0); + } else { + fluid = inputHatch.getFillableStack(); + } + if (fluid == null) return 0; + if (!GTUtility.areFluidsEqual(fluid, fluidConsumptions[i])) return 0; + currentParallel = Math.min(currentParallel, (double) fluid.amount / fluidConsumptions[i].amount); + if (currentParallel <= 0) return 0; + } + return currentParallel; + } + + /** + * WARNING: Ensure that item inputs are enough to be consumed with + * {@link RecipeAssemblyLine#maxParallelCalculatedByInputItems} before calling this method! + * + * @param inputBusses Input bus list to check. Usually the input bus list of multi. + * @param itemConsumptions Should be generated by {@link RecipeAssemblyLine#getItemConsumptionAmountArray}. + */ + public static void consumeInputItems(ArrayList inputBusses, int amountMultiplier, + int[] itemConsumptions, Map inputsFromME) { + for (int i = 0; i < itemConsumptions.length; i++) { + MTEHatchInputBus inputBus = inputBusses.get(i); + if (!inputBus.isValid()) continue; + ItemStack item; + if (inputBus instanceof MTEHatchInputBusME meBus) { + item = inputsFromME.get(GTUtility.ItemId.createNoCopy(meBus.getShadowItemStack(0))); + } else { + item = inputBus.getStackInSlot(0); + } + item.stackSize -= itemConsumptions[i] * amountMultiplier; + } + } + + /** + * WARNING: Ensure that fluid inputs are enough to be consumed with + * {@link RecipeAssemblyLine#maxParallelCalculatedByInputFluids} before calling this method! + * + * @param inputHatches Input hatch list to check. Usually the input hatch list of multi. + * @param fluidConsumptions Fluid inputs of the recipe. + */ + public static void consumeInputFluids(ArrayList inputHatches, int amountMultiplier, + FluidStack[] fluidConsumptions, Map fluidsFromME) { + for (int i = 0; i < fluidConsumptions.length; i++) { + MTEHatchInput inputHatch = inputHatches.get(i); + if (!inputHatch.isValid()) continue; + FluidStack fluid; + if (inputHatch instanceof MTEHatchInputME meHatch) { + fluid = fluidsFromME.get( + meHatch.getShadowFluidStack(0) + .getFluid()); + } else if (inputHatch instanceof MTEHatchMultiInput multiInput) { + fluid = multiInput.getFluid(0); + } else { + fluid = inputHatch.getFillableStack(); + } + fluid.amount -= fluidConsumptions[i].amount * amountMultiplier; + } + } + } + + public static class GTRecipe_WithAlt extends GTRecipe { + + public ItemStack[][] mOreDictAlt; + + /** + * Only for {@link GTRecipeBuilder}. + */ + GTRecipe_WithAlt(ItemStack[] mInputs, ItemStack[] mOutputs, FluidStack[] mFluidInputs, + FluidStack[] mFluidOutputs, int[] mChances, Object mSpecialItems, int mDuration, int mEUt, + int mSpecialValue, boolean mEnabled, boolean mHidden, boolean mFakeRecipe, boolean mCanBeBuffered, + boolean mNeedsEmptyOutput, boolean nbtSensitive, String[] neiDesc, + @Nullable IRecipeMetadataStorage metadataStorage, RecipeCategory recipeCategory, + ItemStack[][] mOreDictAlt) { + super( + mInputs, + mOutputs, + mFluidInputs, + mFluidOutputs, + mChances, + mSpecialItems, + mDuration, + mEUt, + mSpecialValue, + mEnabled, + mHidden, + mFakeRecipe, + mCanBeBuffered, + mNeedsEmptyOutput, + nbtSensitive, + neiDesc, + metadataStorage, + recipeCategory); + this.mOreDictAlt = mOreDictAlt; + } + + public GTRecipe_WithAlt(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, + int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, + int aSpecialValue, ItemStack[][] aAlt) { + super( + aOptimize, + aInputs, + aOutputs, + aSpecialItems, + aChances, + aFluidInputs, + aFluidOutputs, + aDuration, + aEUt, + aSpecialValue); + mOreDictAlt = aAlt; + } + + public Object getAltRepresentativeInput(int aIndex) { + if (aIndex < 0) return null; + if (aIndex < mOreDictAlt.length) { + if (mOreDictAlt[aIndex] != null && mOreDictAlt[aIndex].length > 0) { + ItemStack[] rStacks = new ItemStack[mOreDictAlt[aIndex].length]; + for (int i = 0; i < mOreDictAlt[aIndex].length; i++) { + rStacks[i] = GTUtility.copyOrNull(mOreDictAlt[aIndex][i]); + } + return rStacks; + } + } + if (aIndex >= mInputs.length) return null; + return GTUtility.copyOrNull(mInputs[aIndex]); + } + } +} diff --git a/src/main/java/gregtech/api/util/GTRecipeBuilder.java b/src/main/java/gregtech/api/util/GTRecipeBuilder.java new file mode 100644 index 0000000000..6f8acfb2dc --- /dev/null +++ b/src/main/java/gregtech/api/util/GTRecipeBuilder.java @@ -0,0 +1,946 @@ +package gregtech.api.util; + +import static gregtech.api.util.GTRecipeMapUtil.SPECIAL_VALUE_ALIASES; +import static gregtech.api.util.GTUtility.copyFluidArray; +import static gregtech.api.util.GTUtility.copyItemArray; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Stream; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.item.ItemStack; +import net.minecraft.launchwrapper.Launch; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.Contract; + +import gregtech.GTMod; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Mods; +import gregtech.api.interfaces.IRecipeMap; +import gregtech.api.recipe.RecipeCategory; +import gregtech.api.recipe.RecipeMetadataKey; +import gregtech.api.recipe.metadata.IRecipeMetadataStorage; +import gregtech.api.recipe.metadata.RecipeMetadataStorage; +import gregtech.api.util.extensions.ArrayExt; + +@SuppressWarnings({ "unused", "UnusedReturnValue" }) +public class GTRecipeBuilder { + + // debug mode expose problems. panic mode help you check nothing is wrong-ish without you actively monitoring + private static final boolean DEBUG_MODE_NULL; + // Any stable release should be tested at least once with this: -Dgt.recipebuilder.panic.null=true + private static boolean PANIC_MODE_NULL; + private static final boolean DEBUG_MODE_INVALID; + private static final boolean DEBUG_MODE_FULL_ENERGY; + // Any stable release should be tested at least once with this: -Dgt.recipebuilder.panic.invalid=true + private static final boolean PANIC_MODE_INVALID; + private static final boolean DEBUG_MODE_COLLISION; + + // Any stable release should be tested at least once with this: -Dgt.recipebuilder.panic.collision=true + private static final boolean PANIC_MODE_COLLISION; + + // This should only be enabled in non stable instances only with -Dgt.recipebuilder.recipe_collision_check=true + public static final boolean ENABLE_COLLISION_CHECK; + + public static final int WILDCARD = 32767; + + // time units + public static final int HOURS = 20 * 60 * 60; + public static final int MINUTES = 20 * 60; + public static final int SECONDS = 20; + public static final int TICKS = 1; + + // fluid units + public static final int INGOTS = 144; + public static final int HALF_INGOT = 72; + public static final int QUARTER_INGOT = 36; + public static final int EIGHTH_INGOT = 18; + public static final int NUGGETS = 16; + public static final int BUCKETS = 1000; + + static { + final boolean debugAll; + if (System.getProperties() + .containsKey("gt.recipebuilder.debug")) { + debugAll = Boolean.getBoolean("gt.recipebuilder.debug"); + } else { + // turn on debug by default in dev mode + debugAll = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + } + DEBUG_MODE_NULL = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.null"); + DEBUG_MODE_INVALID = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.invalid"); + DEBUG_MODE_COLLISION = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.collision"); + DEBUG_MODE_FULL_ENERGY = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.fullenergy"); + + final boolean panicAll = Boolean.getBoolean("gt.recipebuilder.panic"); + PANIC_MODE_NULL = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.null"); + PANIC_MODE_INVALID = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.invalid"); + PANIC_MODE_COLLISION = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.collision"); + ENABLE_COLLISION_CHECK = Boolean.getBoolean("gt.recipebuilder.recipe_collision_check"); + } + + protected ItemStack[] inputsBasic = new ItemStack[0]; + protected Object[] inputsOreDict; + protected ItemStack[] outputs = new ItemStack[0]; + protected ItemStack[][] alts; + protected FluidStack[] fluidInputs = new FluidStack[0]; + protected FluidStack[] fluidOutputs = new FluidStack[0]; + protected int[] chances; + protected Object special; + protected int duration = -1; + protected int eut = -1; + protected int specialValue; + protected boolean enabled = true; + protected boolean hidden = false; + protected boolean fakeRecipe = false; + protected boolean mCanBeBuffered = true; + protected boolean mNeedsEmptyOutput = false; + protected boolean nbtSensitive = false; + protected String[] neiDesc; + protected RecipeCategory recipeCategory; + protected boolean optimize = true; + @Nullable + protected IRecipeMetadataStorage metadataStorage; + protected boolean checkForCollision = true; + /** + * If recipe addition should be skipped. + */ + protected boolean skip = false; + protected boolean valid = true; + + GTRecipeBuilder() {} + + private GTRecipeBuilder(ItemStack[] inputsBasic, Object[] inputsOreDict, ItemStack[] outputs, ItemStack[][] alts, + FluidStack[] fluidInputs, FluidStack[] fluidOutputs, int[] chances, Object special, int duration, int eut, + int specialValue, boolean enabled, boolean hidden, boolean fakeRecipe, boolean mCanBeBuffered, + boolean mNeedsEmptyOutput, boolean nbtSensitive, String[] neiDesc, RecipeCategory recipeCategory, + boolean optimize, @Nullable IRecipeMetadataStorage metadataStorage, boolean checkForCollision, boolean skip, + boolean valid) { + this.inputsBasic = inputsBasic; + this.inputsOreDict = inputsOreDict; + this.outputs = outputs; + this.alts = alts; + this.fluidInputs = fluidInputs; + this.fluidOutputs = fluidOutputs; + this.chances = chances; + this.special = special; + this.duration = duration; + this.eut = eut; + this.specialValue = specialValue; + this.enabled = enabled; + this.hidden = hidden; + this.fakeRecipe = fakeRecipe; + this.mCanBeBuffered = mCanBeBuffered; + this.mNeedsEmptyOutput = mNeedsEmptyOutput; + this.nbtSensitive = nbtSensitive; + this.neiDesc = neiDesc; + this.recipeCategory = recipeCategory; + this.optimize = optimize; + this.metadataStorage = metadataStorage; + if (this.metadataStorage != null) { + this.metadataStorage = this.metadataStorage.copy(); + } + this.checkForCollision = checkForCollision; + this.skip = skip; + this.valid = valid; + } + + // region helper methods + + private static FluidStack[] fix(FluidStack[] fluidInputs) { + return Arrays.stream(fluidInputs) + .filter(Objects::nonNull) + .map(FluidStack::copy) + .toArray(FluidStack[]::new); + } + + private static ItemStack[] fix(ItemStack[] inputs) { + return GTOreDictUnificator.setStackArray(true, ArrayExt.withoutTrailingNulls(inputs, ItemStack[]::new)); + } + + public static GTRecipeBuilder builder() { + return new GTRecipeBuilder(); + } + + /** + * Creates empty builder where only duration and EU/t are set to 0. + */ + public static GTRecipeBuilder empty() { + return new GTRecipeBuilder().duration(0) + .eut(0); + } + + private static boolean containsNull(Object[] arr) { + return arr == null || Arrays.stream(arr) + .anyMatch(Objects::isNull); + } + + private static void handleNullRecipeComponents(String componentType) { + // place a breakpoint here to catch all these issues + GTLog.err.print("null detected in "); + GTLog.err.println(componentType); + new NullPointerException().printStackTrace(GTLog.err); + if (PANIC_MODE_NULL) { + throw new IllegalArgumentException("null in argument"); + } + } + + private static boolean debugNull() { + return DEBUG_MODE_NULL || PANIC_MODE_NULL; + } + + public static void handleInvalidRecipe() { + if (!DEBUG_MODE_INVALID && !PANIC_MODE_INVALID) { + return; + } + // place a breakpoint here to catch all these issues + GTLog.err.print("invalid recipe"); + new IllegalArgumentException().printStackTrace(GTLog.err); + if (PANIC_MODE_INVALID) { + throw new IllegalArgumentException("invalid recipe"); + } + } + + public static void handleRecipeCollision(String details) { + if (!DEBUG_MODE_COLLISION && !PANIC_MODE_COLLISION) { + return; + } + GTLog.err.print("Recipe collision resulting in recipe loss detected with "); + GTLog.err.println(details); + if (PANIC_MODE_COLLISION) { + throw new IllegalArgumentException("Recipe Collision"); + } else { + // place a breakpoint here to catch all these issues + new IllegalArgumentException().printStackTrace(GTLog.err); + } + } + + public static void onConfigLoad() { + PANIC_MODE_NULL |= GTMod.gregtechproxy.crashOnNullRecipeInput; + } + + // endregion + + // region setter + + /** + * Non-OreDicted item inputs. Assumes input is unified. + */ + public GTRecipeBuilder itemInputsUnified(ItemStack... inputs) { + if (skip) return this; + if (debugNull() && containsNull(inputs)) handleNullRecipeComponents("itemInputUnified"); + inputsBasic = ArrayExt.withoutTrailingNulls(inputs, ItemStack[]::new); + inputsOreDict = null; + alts = null; + return this; + } + + /** + * Non-OreDicted item inputs. Assumes input is not unified. + */ + public GTRecipeBuilder itemInputs(ItemStack... inputs) { + if (skip) return this; + if (debugNull() && containsNull(inputs)) handleNullRecipeComponents("itemInputs"); + inputsBasic = fix(inputs); + inputsOreDict = null; + alts = null; + return this; + } + + /** + * OreDicted item inputs. Currently only used for assline recipes adder. + */ + public GTRecipeBuilder itemInputs(Object... inputs) { + if (skip) return this; + inputsOreDict = inputs; + alts = new ItemStack[inputs.length][]; + for (int i = 0, inputsLength = inputs.length; i < inputsLength; i++) { + Object input = inputs[i]; + if (input instanceof ItemStack) { + alts[i] = new ItemStack[] { (ItemStack) input }; + } else if (input instanceof ItemStack[]) { + alts[i] = ((ItemStack[]) input).clone(); + } else if (input instanceof Object[]arr) { + if (arr.length != 2) continue; + List ores = GTOreDictUnificator.getOres(arr[0]); + if (ores.isEmpty()) continue; + int size = ((Number) arr[1]).intValue(); + alts[i] = ores.stream() + .map(s -> GTUtility.copyAmount(size, s)) + .filter(GTUtility::isStackValid) + .toArray(ItemStack[]::new); + } else if (input == null) { + handleNullRecipeComponents("recipe oredict input"); + alts[i] = new ItemStack[0]; + } else { + throw new IllegalArgumentException("index " + i + ", unexpected type: " + input.getClass()); + } + } + inputsBasic = Arrays.stream(alts) + .map(ss -> ss.length > 0 ? ss[0] : null) + .toArray(ItemStack[]::new); + // optimize cannot handle recipes with alts + return noOptimize(); + } + + public GTRecipeBuilder itemOutputs(ItemStack... outputs) { + if (skip) return this; + if (debugNull() && containsNull(outputs)) handleNullRecipeComponents("itemOutputs"); + this.outputs = outputs; + if (chances != null && chances.length != outputs.length) { + throw new IllegalArgumentException("Output chances array and items array length differs"); + } + return this; + } + + /** + * Not intended to be used by recipe authors. + * Intended for recipe rewrite middlewares. + */ + public GTRecipeBuilder itemOutputs(ItemStack[] outputs, int[] chances) { + if (skip) return this; + if (debugNull() && containsNull(outputs)) handleNullRecipeComponents("itemOutputs"); + this.outputs = outputs; + this.chances = chances; + if (chances != null && chances.length != outputs.length) { + throw new IllegalArgumentException("Output chances array and items array length differs"); + } + return this; + } + + public GTRecipeBuilder fluidInputs(FluidStack... fluidInputs) { + if (skip) return this; + if (debugNull() && containsNull(fluidInputs)) handleNullRecipeComponents("fluidInputs"); + this.fluidInputs = fix(fluidInputs); + return this; + } + + public GTRecipeBuilder fluidOutputs(FluidStack... fluidOutputs) { + if (skip) return this; + if (debugNull() && containsNull(fluidOutputs)) handleNullRecipeComponents("fluidOutputs"); + this.fluidOutputs = fix(fluidOutputs); + return this; + } + + public GTRecipeBuilder outputChances(int... chances) { + if (skip) return this; + if (outputs != null && chances.length != outputs.length) { + throw new IllegalArgumentException("Output chances array and items array length differs"); + } + this.chances = chances; + return this; + } + + public GTRecipeBuilder special(Object special) { + this.special = special; + return this; + } + + public GTRecipeBuilder duration(int duration) { + this.duration = duration; + return this; + } + + public GTRecipeBuilder duration(long duration) { + this.duration = (int) duration; + return this; + } + + public GTRecipeBuilder eut(int eut) { + if (DEBUG_MODE_FULL_ENERGY) { + // Ignores ULV voltage + for (int i = 1; i < GTValues.VP.length; i++) { + if (eut <= GTValues.V[i] && eut > GTValues.VP[i]) { + GTLog.err.println( + "EUt > Practical Voltage detected. EUt: " + eut + ", Practical Voltage: " + GTValues.VP[i]); + new IllegalArgumentException().printStackTrace(GTLog.err); + break; + } + } + } + this.eut = eut; + return this; + } + + public GTRecipeBuilder eut(long eut) { + return eut((int) eut); + } + + /** + * prefer to use metadata over this. should only use when the target recipe map does not yet support metadata + * system, or it's to bridge legacy code and modern code. + */ + public GTRecipeBuilder specialValue(int specialValue) { + this.specialValue = specialValue; + return this; + } + + // I don't expect anyone to actually call this... + public GTRecipeBuilder disabled() { + this.enabled = false; + return this; + } + + public GTRecipeBuilder hidden() { + this.hidden = true; + return this; + } + + public GTRecipeBuilder fake() { + this.fakeRecipe = true; + return this; + } + + public GTRecipeBuilder noBuffer() { + this.mCanBeBuffered = false; + return this; + } + + public GTRecipeBuilder needsEmptyOutput() { + this.mNeedsEmptyOutput = true; + return this; + } + + public GTRecipeBuilder nbtSensitive() { + this.nbtSensitive = true; + return this; + } + + public GTRecipeBuilder setNEIDesc(String... neiDesc) { + this.neiDesc = neiDesc; + return this; + } + + public GTRecipeBuilder recipeCategory(RecipeCategory recipeCategory) { + this.recipeCategory = recipeCategory; + return this; + } + + /** + * Prevent the resulting recipe from optimizing recipe, which is a process that reduce recipe batch size. + */ + public GTRecipeBuilder noOptimize() { + this.optimize = false; + return this; + } + + /** + * Prevents checking collision with existing recipes when adding the built recipe. + */ + public GTRecipeBuilder ignoreCollision() { + this.checkForCollision = false; + return this; + } + + /** + * Sets metadata of the recipe. It can be used for recipe emitter to do special things, or for being stored in the + * built recipe and used for actual recipe processing. + *

+ * {@link GTRecipeConstants} has a series of metadata keys. Or you can create one by yourself. + */ + public GTRecipeBuilder metadata(RecipeMetadataKey key, T value) { + if (skip) return this; + if (metadataStorage == null) { + metadataStorage = new RecipeMetadataStorage(); + } + metadataStorage.store(key, value); + return this; + } + + /** + * Gets metadata already set for this builder. Can return null. Use + * {@link #getMetadataOrDefault(RecipeMetadataKey, Object)} + * if you want to specify default value. + */ + @Nullable + public T getMetadata(RecipeMetadataKey key) { + if (metadataStorage == null) { + return null; + } + return key.cast(metadataStorage.getMetadata(key)); + } + + /** + * Gets metadata already set for this builder with default value. Does not return null unless default value is null. + */ + @Contract("_, !null -> !null") + @Nullable + public T getMetadataOrDefault(RecipeMetadataKey key, T defaultValue) { + if (metadataStorage == null) { + return defaultValue; + } + return key.cast(metadataStorage.getMetadataOrDefault(key, defaultValue)); + } + + /** + * Specifies mods required to add the recipe. If any of the mods is not loaded, all the operations for this builder + * will be ignored. + * + * @param mods Mod(s) required for the recipe. + */ + public GTRecipeBuilder requireMods(Mods... mods) { + skip = Stream.of(mods) + .anyMatch(mod -> !mod.isModLoaded()); + return this; + } + + public GTRecipeBuilder requiresCleanRoom() { + return metadata(GTRecipeConstants.CLEANROOM, true); + } + + public GTRecipeBuilder requiresLowGravity() { + return metadata(GTRecipeConstants.LOW_GRAVITY, true); + } + + // endregion + + private static T[] copy(T[] arr) { + return arr == null ? null : arr.clone(); + } + + private static int[] copy(int[] arr) { + return arr == null ? null : arr.clone(); + } + + /** + * produce a deep copy of current values. anything unset will remain unset. IMPORTANT: If metadata contains mutable + * value, they will not be cloned! + *

+ * checkout docs/RecipeBuilder.md for more info on whether to copy or not. + */ + public GTRecipeBuilder copy() { + return new GTRecipeBuilder( + copyItemArray(inputsBasic), + copy(inputsOreDict), + copyItemArray(outputs), + copy(alts), + copyFluidArray(fluidInputs), + copyFluidArray(fluidOutputs), + copy(chances), + special, + duration, + eut, + specialValue, + enabled, + hidden, + fakeRecipe, + mCanBeBuffered, + mNeedsEmptyOutput, + nbtSensitive, + copy(neiDesc), + recipeCategory, + optimize, + metadataStorage, + checkForCollision, + skip, + valid); + } + + /** + * produce a deep copy of current values. anything unset will remain unset. discard all existing metadata + */ + public GTRecipeBuilder copyNoMetadata() { + return new GTRecipeBuilder( + copyItemArray(inputsBasic), + copy(inputsOreDict), + copyItemArray(outputs), + copy(alts), + copyFluidArray(fluidInputs), + copyFluidArray(fluidOutputs), + copy(chances), + special, + duration, + eut, + specialValue, + enabled, + hidden, + fakeRecipe, + mCanBeBuffered, + mNeedsEmptyOutput, + nbtSensitive, + copy(neiDesc), + recipeCategory, + optimize, + null, + checkForCollision, + skip, + valid); + } + + // region getter + + public ItemStack getItemInputBasic(int index) { + return index < inputsBasic.length ? inputsBasic[index] : null; + } + + public Object getItemInputOreDict(int index) { + return index < inputsOreDict.length ? inputsOreDict[index] : null; + } + + public ItemStack getItemOutput(int index) { + return index < outputs.length ? outputs[index] : null; + } + + public FluidStack getFluidInput(int index) { + return index < fluidInputs.length ? fluidInputs[index] : null; + } + + public FluidStack getFluidOutput(int index) { + return index < fluidOutputs.length ? fluidOutputs[index] : null; + } + + public ItemStack[] getItemInputsBasic() { + return inputsBasic; + } + + public Object[] getItemInputsOreDict() { + return inputsOreDict; + } + + public ItemStack[] getItemOutputs() { + return outputs; + } + + public FluidStack[] getFluidInputs() { + return fluidInputs; + } + + public FluidStack[] getFluidOutputs() { + return fluidOutputs; + } + + public int getDuration() { + return duration; + } + + public int[] getChances() { + return chances; + } + + public int getEUt() { + return eut; + } + + public RecipeCategory getRecipeCategory() { + return recipeCategory; + } + + public boolean isOptimize() { + return optimize; + } + + public boolean isCheckForCollision() { + return checkForCollision; + } + + // endregion + + // region validator + + public GTRecipeBuilder clearInvalid() { + valid = true; + return this; + } + + public GTRecipeBuilder invalidate() { + valid = false; + return this; + } + + public boolean isValid() { + return valid; + } + + private static boolean isArrayValid(@Nonnull Object[] arr, int min, int max) { + int count = 0; + for (Object o : arr) { + if (o != null) count += 1; + } + return min <= count && max >= count; + } + + /** + * Validate if input item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateNoInput() { + if (skip) return this; + return GTUtility.isArrayEmptyOrNull(inputsBasic) ? this : invalidate(); + } + + /** + * Validate if input fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateNoInputFluid() { + if (skip) return this; + return GTUtility.isArrayEmptyOrNull(fluidInputs) ? this : invalidate(); + } + + /** + * Validate if output item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateNoOutput() { + if (skip) return this; + return GTUtility.isArrayEmptyOrNull(outputs) ? this : invalidate(); + } + + /** + * Validate if output fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateNoOutputFluid() { + if (skip) return this; + return GTUtility.isArrayEmptyOrNull(fluidOutputs) ? this : invalidate(); + } + + /** + * Validate if input item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateInputCount(int min, int max) { + if (skip) return this; + if (inputsBasic == null) return min < 0 ? this : invalidate(); + return isArrayValid(inputsBasic, min, max) ? this : invalidate(); + } + + /** + * Validate if input fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateInputFluidCount(int min, int max) { + if (skip) return this; + if (fluidInputs == null) return min < 0 ? this : invalidate(); + return isArrayValid(fluidInputs, min, max) ? this : invalidate(); + } + + /** + * Validate if output item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateOutputCount(int min, int max) { + if (skip) return this; + if (outputs == null) return min < 0 ? this : invalidate(); + return isArrayValid(outputs, min, max) ? this : invalidate(); + } + + /** + * Validate if output fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow + * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. + */ + public GTRecipeBuilder validateOutputFluidCount(int min, int max) { + if (skip) return this; + if (fluidOutputs == null) return min < 0 ? this : invalidate(); + return isArrayValid(fluidOutputs, min, max) ? this : invalidate(); + } + + public GTRecipeBuilder validateAnyInput() { + if (skip) return this; + if (fluidInputs != null && isArrayValid(fluidInputs, 1, Integer.MAX_VALUE)) { + return this; + } + if (inputsBasic != null && isArrayValid(inputsBasic, 1, Integer.MAX_VALUE)) { + return this; + } + return invalidate(); + } + + public GTRecipeBuilder validateAnyOutput() { + if (skip) return this; + if (fluidOutputs != null && isArrayValid(fluidOutputs, 1, Integer.MAX_VALUE)) { + return this; + } + if (outputs != null && isArrayValid(outputs, 1, Integer.MAX_VALUE)) { + return this; + } + return invalidate(); + } + + // endregion + + /** + * Builds new recipe, without custom behavior of recipemaps. For adding recipe to recipemap, + * use {@link #addTo} instead. + * + * @return Built recipe. Returns empty if failed to build. + */ + public Optional build() { + if (skip) { + return Optional.empty(); + } + if (!valid) { + handleInvalidRecipe(); + return Optional.empty(); + } + preBuildChecks(); + optimize(); + return Optional.of( + decorate( + new GTRecipe( + inputsBasic, + outputs, + fluidInputs, + fluidOutputs, + chances, + special, + duration, + eut, + specialValue, + enabled, + hidden, + fakeRecipe, + mCanBeBuffered, + mNeedsEmptyOutput, + nbtSensitive, + neiDesc, + metadataStorage, + recipeCategory))); + } + + public GTRecipeBuilder forceOreDictInput() { + if (inputsOreDict != null || inputsBasic == null) return this; + return itemInputs((Object[]) inputsBasic); + } + + public Optional buildWithAlt() { + if (skip) { + return Optional.empty(); + } + if (inputsOreDict == null) { + throw new UnsupportedOperationException(); + } + if (!valid) { + handleInvalidRecipe(); + return Optional.empty(); + } + preBuildChecks(); + // no optimize. + return Optional.of( + decorate( + new GTRecipe.GTRecipe_WithAlt( + inputsBasic, + outputs, + fluidInputs, + fluidOutputs, + chances, + special, + duration, + eut, + specialValue, + enabled, + hidden, + fakeRecipe, + mCanBeBuffered, + mNeedsEmptyOutput, + nbtSensitive, + neiDesc, + metadataStorage, + recipeCategory, + alts))); + } + + private void preBuildChecks() { + if (duration == -1) throw new IllegalStateException("no duration"); + if (eut == -1) throw new IllegalStateException("no eut"); + } + + private void optimize() { + if (optimize) { + ArrayList l = new ArrayList<>(); + l.addAll(Arrays.asList(inputsBasic)); + l.addAll(Arrays.asList(outputs)); + for (int i = 0; i < l.size(); i++) if (l.get(i) == null) l.remove(i--); + + outer: for (byte i = (byte) Math.min(64, duration / 16); i > 1; i--) { + if (duration / i >= 16) { + for (ItemStack stack : l) { + if (stack.stackSize % i != 0) continue outer; + } + for (FluidStack fluidInput : fluidInputs) { + if (fluidInput.amount % i != 0) continue outer; + } + for (FluidStack fluidOutput : fluidOutputs) { + if (fluidOutput.amount % i != 0) continue outer; + } + for (ItemStack itemStack : l) itemStack.stackSize /= i; + for (FluidStack fluidInput : fluidInputs) fluidInput.amount /= i; + for (FluidStack fluidOutput : fluidOutputs) fluidOutput.amount /= i; + duration /= i; + } + } + optimize = false; + } + } + + private T decorate(T r) { + r.mHidden = hidden; + r.mCanBeBuffered = mCanBeBuffered; + r.mNeedsEmptyOutput = mNeedsEmptyOutput; + r.isNBTSensitive = nbtSensitive; + r.mFakeRecipe = fakeRecipe; + r.mEnabled = enabled; + if (neiDesc != null) r.setNeiDesc(neiDesc); + applyDefaultSpecialValues(r); + return r; + } + + private void applyDefaultSpecialValues(GTRecipe recipe) { + if (recipe.mSpecialValue != 0) return; + + int specialValue = 0; + if (getMetadataOrDefault(GTRecipeConstants.LOW_GRAVITY, false)) specialValue -= 100; + if (getMetadataOrDefault(GTRecipeConstants.CLEANROOM, false)) specialValue -= 200; + for (RecipeMetadataKey ident : SPECIAL_VALUE_ALIASES) { + Integer metadata = getMetadataOrDefault(ident, null); + if (metadata != null) { + specialValue = metadata; + break; + } + } + recipe.mSpecialValue = specialValue; + } + + public Collection addTo(IRecipeMap recipeMap) { + if (skip) { + return Collections.emptyList(); + } + return recipeMap.doAdd(this); + } + + public GTRecipeBuilder reset() { + metadataStorage = null; + alts = null; + chances = null; + duration = -1; + enabled = true; + eut = -1; + fakeRecipe = false; + fluidInputs = null; + fluidOutputs = null; + hidden = false; + inputsBasic = null; + inputsOreDict = null; + mCanBeBuffered = true; + mNeedsEmptyOutput = false; + nbtSensitive = false; + neiDesc = null; + recipeCategory = null; + optimize = true; + outputs = null; + special = null; + specialValue = 0; + skip = false; + valid = true; + return this; + } +} diff --git a/src/main/java/gregtech/api/util/GTRecipeConstants.java b/src/main/java/gregtech/api/util/GTRecipeConstants.java new file mode 100644 index 0000000000..82a477756a --- /dev/null +++ b/src/main/java/gregtech/api/util/GTRecipeConstants.java @@ -0,0 +1,691 @@ +package gregtech.api.util; + +import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes; +import static gregtech.api.util.GTRecipeMapUtil.convertCellToFluid; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Optional; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.TierEU; +import gregtech.api.interfaces.IRecipeMap; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeCategories; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.RecipeMetadataKey; +import gregtech.api.recipe.metadata.SimpleRecipeMetadataKey; +import gregtech.common.items.IDMetaItem03; +import gregtech.common.items.MetaGeneratedItem03; +import gtnhlanth.common.item.ItemPhotolithographicMask; +import gtnhlanth.common.item.MaskList; +import gtnhlanth.common.register.LanthItemList; + +// this class is intended to be import-static-ed on every recipe script +// so take care to not put unrelated stuff here! +public class GTRecipeConstants { + + /** + * Set to true to signal the recipe require low gravity. do nothing if recipe set specialValue explicitly. Can + * coexist with CLEANROOM just fine + */ + public static final RecipeMetadataKey LOW_GRAVITY = SimpleRecipeMetadataKey + .create(Boolean.class, "low_gravity"); + /** + * Set to true to signal the recipe require cleanroom. do nothing if recipe set specialValue explicitly. Can coexist + * with LOW_GRAVITY just fine + */ + public static final RecipeMetadataKey CLEANROOM = SimpleRecipeMetadataKey + .create(Boolean.class, "cleanroom"); + /** + * Common additive to use in recipe, e.g. for PBF, this is coal amount. + */ + public static final RecipeMetadataKey ADDITIVE_AMOUNT = SimpleRecipeMetadataKey + .create(Integer.class, "additives"); + /** + * Used for fusion reactor. Denotes ignition threshold. + */ + public static final RecipeMetadataKey FUSION_THRESHOLD = SimpleRecipeMetadataKey + .create(Integer.class, "fusion_threshold"); + /** + * Research time in a scanner used in ticks. + */ + public static final RecipeMetadataKey RESEARCH_TIME = SimpleRecipeMetadataKey + .create(Integer.class, "research_time"); + /** + * Fuel type. TODO should we use enum directly? + */ + public static final RecipeMetadataKey FUEL_TYPE = SimpleRecipeMetadataKey + .create(Integer.class, "fuel_type"); + /** + * Fuel value. + */ + public static final RecipeMetadataKey FUEL_VALUE = SimpleRecipeMetadataKey + .create(Integer.class, "fuel_value"); + /** + * Required heat for heating coil (Kelvin). + */ + public static final RecipeMetadataKey COIL_HEAT = SimpleRecipeMetadataKey + .create(Integer.class, "coil_heat"); + /** + * Research item used by assline recipes. + */ + public static final RecipeMetadataKey RESEARCH_ITEM = SimpleRecipeMetadataKey + .create(ItemStack.class, "research_item"); + /** + * For assembler. It accepts a single item as oredict. It looks like no one uses this anyway... + */ + public static final RecipeMetadataKey OREDICT_INPUT = SimpleRecipeMetadataKey + .create(Object.class, "oredict_input"); + /** + * Replicator output material. + */ + public static final RecipeMetadataKey MATERIAL = SimpleRecipeMetadataKey + .create(Materials.class, "material"); + /** + * Marker for {@link #UniversalArcFurnace} to tell that the recipe belongs to recycling category. + */ + public static final RecipeMetadataKey RECYCLE = SimpleRecipeMetadataKey.create(Boolean.class, "recycle"); + /** + * For Microwave. + */ + public static final RecipeMetadataKey EXPLODE = SimpleRecipeMetadataKey.create(Boolean.class, "explode"); + /** + * For Microwave. + */ + public static final RecipeMetadataKey ON_FIRE = SimpleRecipeMetadataKey.create(Boolean.class, "on_fire"); + + /** + * Nano Forge Tier. + */ + public static final RecipeMetadataKey NANO_FORGE_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "nano_forge_tier"); + + /** + * FOG Exotic recipe tier. + */ + public static final RecipeMetadataKey FOG_EXOTIC_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "fog_exotic_tier"); + + /** + * FOG Plasma recipe tier. + */ + public static final RecipeMetadataKey FOG_PLASMA_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "fog_plasma_tier"); + + /** + * DEFC Casing tier. + */ + public static final RecipeMetadataKey DEFC_CASING_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "defc_casing_tier"); + + /** + * Chemplant Casing tier. Beware, codewise index starts at 0, but it is tier 1. + */ + public static final RecipeMetadataKey CHEMPLANT_CASING_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "chemplant_casing_tier"); + + /** + * QFT Focus tier. + */ + public static final RecipeMetadataKey QFT_FOCUS_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "qft_focus_tier"); + + /** + * Tier of advanced compression (HIP/black hole) + */ + public static final RecipeMetadataKey COMPRESSION_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "compression"); + + /** + * Dissolution Tank Ratio. + */ + public static final RecipeMetadataKey DISSOLUTION_TANK_RATIO = SimpleRecipeMetadataKey + .create(Integer.class, "dissolution_tank_ratio"); + + /** + * Duration in days for the RTG. + */ + public static final RecipeMetadataKey RTG_DURATION_IN_DAYS = SimpleRecipeMetadataKey + .create(Integer.class, "rtg_duration_in_days"); + + /** + * Basic output for the Large Naquadah Generator. + */ + public static final RecipeMetadataKey LNG_BASIC_OUTPUT = SimpleRecipeMetadataKey + .create(Integer.class, "lng_basic_output"); + + /** + * Coil tier for the Naquadah Fuel Refinery. + */ + public static final RecipeMetadataKey NFR_COIL_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "nfr_coil_tier"); + + /** + * NKE range for the neutron activator. + */ + public static final RecipeMetadataKey NKE_RANGE = SimpleRecipeMetadataKey + .create(Integer.class, "nke_range"); + /** + * Precise Assembler casing tier. + */ + public static final RecipeMetadataKey PRECISE_ASSEMBLER_CASING_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "precise_assembler_casing_tier"); + /** + * CoAL casing tier. + */ + public static final RecipeMetadataKey COAL_CASING_TIER = SimpleRecipeMetadataKey + .create(Integer.class, "coal_casing_tier"); + + /** + * LFTR output power. + */ + public static final RecipeMetadataKey LFTR_OUTPUT_POWER = SimpleRecipeMetadataKey + .create(Integer.class, "lftr_output_power"); + + /** + * Research Station data. + */ + public static final RecipeMetadataKey RESEARCH_STATION_DATA = SimpleRecipeMetadataKey + .create(Integer.class, "research_station_data"); + + /** + * glass tier required for the biovat recipes. + */ + public static final RecipeMetadataKey SIEVERTS = SimpleRecipeMetadataKey.create(Integer.class, "sieverts"); + + public static final RecipeMetadataKey DECAY_TICKS = SimpleRecipeMetadataKey + .create(Integer.class, "decay_ticks"); + + public static final RecipeMetadataKey NOBLE_GASES = SimpleRecipeMetadataKey + .create(Boolean.class, "noble_gases"); + + public static final RecipeMetadataKey ANAEROBE_GASES = SimpleRecipeMetadataKey + .create(Boolean.class, "anaerobe_gases"); + + public static final RecipeMetadataKey NO_GAS = SimpleRecipeMetadataKey.create(Boolean.class, "no_gas"); + + /** + * Add a arc furnace recipe. Adds to both normal arc furnace and plasma arc furnace. + * Will override the fluid input with oxygen/plasma for the respective recipe maps, so there is no point setting it. + */ + public static final IRecipeMap UniversalArcFurnace = IRecipeMap.newRecipeMap(builder -> { + if (!GTUtility.isArrayOfLength(builder.getItemInputsBasic(), 1) + || GTUtility.isArrayEmptyOrNull(builder.getItemOutputs())) return Collections.emptyList(); + int aDuration = builder.getDuration(); + if (aDuration <= 0) { + return Collections.emptyList(); + } + builder.duration(aDuration); + boolean recycle = builder.getMetadataOrDefault(RECYCLE, false); + Collection ret = new ArrayList<>(); + for (Materials mat : new Materials[] { Materials.Argon, Materials.Nitrogen }) { + int tPlasmaAmount = (int) Math.max(1L, aDuration / (mat.getMass() * 16L)); + GTRecipeBuilder plasmaBuilder = builder.copy() + .fluidInputs(mat.getPlasma(tPlasmaAmount)) + .fluidOutputs(mat.getGas(tPlasmaAmount)); + if (recycle) { + plasmaBuilder.recipeCategory(RecipeCategories.plasmaArcFurnaceRecycling); + } + ret.addAll(RecipeMaps.plasmaArcFurnaceRecipes.doAdd(plasmaBuilder)); + } + GTRecipeBuilder arcBuilder = builder.copy() + .fluidInputs(Materials.Oxygen.getGas(aDuration)); + if (recycle) { + arcBuilder.recipeCategory(RecipeCategories.arcFurnaceRecycling); + } + ret.addAll(RecipeMaps.arcFurnaceRecipes.doAdd(arcBuilder)); + return ret; + }); + + /** + * Add a chemical reactor recipe to both LCR and singleblocks. + */ + public static final IRecipeMap UniversalChemical = IRecipeMap.newRecipeMap(builder -> { + for (ItemStack input : builder.getItemInputsBasic()) { + // config >= 10 -> this is a special chemical recipe that output fluid/canned fluid variant. + // it doesn't belong to multiblocks + if (GTUtility.isAnyIntegratedCircuit(input) && input.getItemDamage() >= 10) { + return builder.addTo(RecipeMaps.chemicalReactorRecipes); + } + } + return GTUtility.concat( + builder.copy() + .addTo(RecipeMaps.chemicalReactorRecipes), + convertCellToFluid(builder, false) + // LCR does not need cleanroom. + .metadata(CLEANROOM, false) + .addTo(RecipeMaps.multiblockChemicalReactorRecipes)); + }); + + /** + * Adds an engraver recipe that might use purified water. Still added to the regular recipemap if it ends up not + * needing it. + */ + public static final IRecipeMap WaferEngravingRecipes = IRecipeMap.newRecipeMap(builder -> { + // spotless:off + enum Wafer{ + Naquadah, + Europium, + Americium, + // Beamline masks + MaskT1, + MaskT2, + MaskT3, + } + // spotless:on + // Find the wafer used + Wafer wafer = null; + ItemPhotolithographicMask t1Item = (ItemPhotolithographicMask) LanthItemList.maskMap.get(MaskList.BLANK1); + ItemPhotolithographicMask t2Item = (ItemPhotolithographicMask) LanthItemList.maskMap.get(MaskList.BLANK2); + ItemPhotolithographicMask t3Item = (ItemPhotolithographicMask) LanthItemList.maskMap.get(MaskList.BLANK3); + for (ItemStack input : builder.getItemInputsBasic()) { + if (input.getItem() instanceof MetaGeneratedItem03) { + int meta = input.getItemDamage() - 32000; + // Check if this input item is indicating a wafer recipe we want to modify + if (meta == IDMetaItem03.Circuit_Silicon_Wafer3.ID) wafer = Wafer.Naquadah; + else if (meta == IDMetaItem03.Circuit_Silicon_Wafer4.ID) wafer = Wafer.Europium; + else if (meta == IDMetaItem03.Circuit_Silicon_Wafer5.ID) wafer = Wafer.Americium; + } + + // Now look for beamline masks + if (input.getItem() instanceof ItemPhotolithographicMask mask) { + String spectrum = mask.getDescSpectrum(); + if (spectrum.equals(t1Item.getDescSpectrum())) wafer = Wafer.MaskT1; + else if (spectrum.equals(t2Item.getDescSpectrum())) wafer = Wafer.MaskT2; + else if (spectrum.equals(t3Item.getDescSpectrum())) wafer = Wafer.MaskT3; + } + + // Found a wafer, stop checking inputs + if (wafer != null) break; + } + + int recipeTime = builder.duration; + // Bonus for using purified water of a higher tier than necessary + int halfBoostedRecipeTime = (int) (recipeTime * 0.75); + int boostedRecipeTime = (int) (recipeTime * 0.5); + + // If this recipe does not use a wafer, exit without modifying it. + if (wafer == null) return builder.addTo(RecipeMaps.laserEngraverRecipes); + switch (wafer) { + case Naquadah -> { + ArrayList items = new ArrayList<>(Arrays.asList(builder.getItemInputsBasic())); + ItemStack[] itemInputs = items.toArray(new ItemStack[] {}); + // Naquadah wafers can use grade 1-2 purified water for a bonus, otherwise use distilled so we don't + // have to + // deal with circuits + return GTUtility.concat( + builder.copy() + .itemInputs(itemInputs) + .fluidInputs(GTModHandler.getDistilledWater(100L)) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .itemInputs(itemInputs) + .fluidInputs(Materials.Grade1PurifiedWater.getFluid(100L)) + .duration(halfBoostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .itemInputs(itemInputs) + .fluidInputs(Materials.Grade2PurifiedWater.getFluid(100L)) + .duration(boostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes)); + } + case Europium -> { + // Require purified water for europium wafers, at least grade 3 + return GTUtility.concat( + builder.copy() + .fluidInputs(Materials.Grade3PurifiedWater.getFluid(100L)) + .duration(recipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .fluidInputs(Materials.Grade4PurifiedWater.getFluid(100L)) + .duration(boostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes)); + } + case Americium -> { + // Require purified water for americium wafers, at least grade 5 + return GTUtility.concat( + builder.copy() + .fluidInputs(Materials.Grade5PurifiedWater.getFluid(100L)) + .duration(recipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .fluidInputs(Materials.Grade6PurifiedWater.getFluid(100L)) + .duration(boostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes)); + } + // Masks require much more purified water because they can make many wafers at once + case MaskT1 -> { + // T1 masks require grade 1, 2 or 3 purified water + return GTUtility.concat( + builder.copy() + .fluidInputs(Materials.Grade1PurifiedWater.getFluid(32000L)) + .duration(recipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .fluidInputs(Materials.Grade2PurifiedWater.getFluid(32000L)) + .duration(halfBoostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .fluidInputs(Materials.Grade3PurifiedWater.getFluid(32000L)) + .duration(boostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes)); + } + case MaskT2 -> { + // T2 masks require grade 4 or 5 purified water + return GTUtility.concat( + builder.copy() + .fluidInputs(Materials.Grade4PurifiedWater.getFluid(32000L)) + .duration(recipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .fluidInputs(Materials.Grade5PurifiedWater.getFluid(32000L)) + .duration(boostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes)); + } + case MaskT3 -> { + // T3 masks require grade 6, 7 or 8 purified water + return GTUtility.concat( + builder.copy() + .fluidInputs(Materials.Grade6PurifiedWater.getFluid(32000L)) + .duration(recipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .fluidInputs(Materials.Grade7PurifiedWater.getFluid(32000L)) + .duration(halfBoostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes), + builder.copy() + .fluidInputs(Materials.Grade8PurifiedWater.getFluid(32000L)) + .duration(boostedRecipeTime) + .addTo(RecipeMaps.laserEngraverRecipes)); + } + } + + throw new RuntimeException("Unreachable code reached in Laser Engraver Recipe Transformer"); + }); + + /** + * The one and only :tm: assline recipe adder. + * Uses {@link #RESEARCH_ITEM} metadata as research item, and {@link #RESEARCH_TIME} metadata as research time, unit + * in ticks. + */ + public static final IRecipeMap AssemblyLine = IRecipeMap.newRecipeMap(builder -> { + Optional rr = builder.forceOreDictInput() + .validateInputCount(4, 16) + .validateOutputCount(1, 1) + .validateOutputFluidCount(-1, 0) + .validateInputFluidCount(1, 4) + .buildWithAlt(); + // noinspection SimplifyOptionalCallChains + if (!rr.isPresent()) return Collections.emptyList(); + GTRecipe.GTRecipe_WithAlt r = rr.get(); + ItemStack[][] mOreDictAlt = r.mOreDictAlt; + Object[] inputs = builder.getItemInputsOreDict(); + ItemStack aResearchItem = builder.getMetadata(RESEARCH_ITEM); + if (aResearchItem == null) { + return Collections.emptyList(); + } + ItemStack aOutput = r.mOutputs[0]; + int tPersistentHash = 1; + for (int i = 0, mOreDictAltLength = mOreDictAlt.length; i < mOreDictAltLength; i++) { + ItemStack[] alts = mOreDictAlt[i]; + Object input = inputs[i]; + if (input == null) { + GTLog.err.println( + "addAssemblingLineRecipe " + aResearchItem.getDisplayName() + + " --> " + + aOutput.getUnlocalizedName() + + " there is some null item in that recipe"); + } + if (input instanceof ItemStack) { + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash((ItemStack) input, true, false); + } else if (input instanceof ItemStack[]) { + for (ItemStack alt : ((ItemStack[]) input)) { + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(alt, true, false); + if (alt == null) { + GTLog.err.println( + "addAssemblingLineRecipe " + aResearchItem.getDisplayName() + + " --> " + + aOutput.getUnlocalizedName() + + " there is some null alt item in that recipe"); + } + } + tPersistentHash *= 31; + } else if (input instanceof Object[]objs) { + Arrays.sort( + alts, + Comparator + .comparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).modId) + .thenComparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).name) + .thenComparingInt(Items.feather::getDamage) + .thenComparingInt(s -> s.stackSize)); + + tPersistentHash = tPersistentHash * 31 + (objs[0] == null ? "" : objs[0].toString()).hashCode(); + tPersistentHash = tPersistentHash * 31 + ((Number) objs[1]).intValue(); + } + } + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(aResearchItem, true, false); + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(aOutput, true, false); + for (FluidStack fluidInput : r.mFluidInputs) { + if (fluidInput == null) continue; + tPersistentHash = tPersistentHash * 31 + GTUtility.persistentHash(fluidInput, true, false); + } + int aResearchTime = builder.getMetadataOrDefault(RESEARCH_TIME, 0); + tPersistentHash = tPersistentHash * 31 + aResearchTime; + tPersistentHash = tPersistentHash * 31 + r.mDuration; + tPersistentHash = tPersistentHash * 31 + r.mEUt; + + GTRecipe.RecipeAssemblyLine tRecipe = new GTRecipe.RecipeAssemblyLine( + aResearchItem, + aResearchTime, + r.mInputs, + r.mFluidInputs, + aOutput, + r.mDuration, + r.mEUt, + r.mOreDictAlt); + tRecipe.setPersistentHash(tPersistentHash); + GTRecipe.RecipeAssemblyLine.sAssemblylineRecipes.add(tRecipe); + AssemblyLineUtils.addRecipeToCache(tRecipe); + + ItemStack writesDataStick = ItemList.Tool_DataStick.getWithName(1L, "Writes Research result"); + AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(writesDataStick, tRecipe, false); + Collection ret = new ArrayList<>(3); + ret.addAll( + GTValues.RA.stdBuilder() + .itemInputs(aResearchItem) + .itemOutputs(aOutput) + .special(writesDataStick) + .duration(aResearchTime) + .eut(TierEU.RECIPE_LV) + .specialValue(-201) // means it's scanned + .noOptimize() + .ignoreCollision() + .fake() + .addTo(scannerFakeRecipes)); + + ItemStack readsDataStick = ItemList.Tool_DataStick.getWithName(1L, "Reads Research result"); + AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(readsDataStick, tRecipe, false); + ret.add( + RecipeMaps.assemblylineVisualRecipes.addFakeRecipe( + false, + r.mInputs, + new ItemStack[] { aOutput }, + new ItemStack[] { readsDataStick }, + r.mFluidInputs, + null, + r.mDuration, + r.mEUt, + 0, + r.mOreDictAlt, + false)); + + return ret; + }); + + /** + * Adds an Electric Blast Furnace recipe that might use gas. + */ + public static final IRecipeMap BlastFurnaceWithGas = IRecipeMap.newRecipeMap(builder -> { + Collection ret = new ArrayList<>(); + int basicGasAmount = builder.getMetadataOrDefault(ADDITIVE_AMOUNT, 1000); + double durationBase = builder.getDuration(); + ArrayList items = new ArrayList<>(Arrays.asList(builder.getItemInputsBasic())); + int circuitConfig = 1; + if (items.size() == 1) {// Set circuit config if it is a dust -> ingot recipe. + ItemData data = GTOreDictUnificator.getAssociation(items.get(0)); + if (data != null) { + OrePrefixes prefix = data.mPrefix; + if (OrePrefixes.dust.equals(prefix)) { + circuitConfig = 1; + } else if (OrePrefixes.dustSmall.equals(prefix)) { + circuitConfig = 4; + } else if (OrePrefixes.dustTiny.equals(prefix)) { + circuitConfig = 9; + } + } + } else { // Set circuit config if there is an integrated circuit + for (int i = 0; i < items.size(); i++) { + if (GTUtility.isAnyIntegratedCircuit(items.get(i))) { + circuitConfig = items.get(i) + .getItemDamage(); + items.remove(i--); + } + } + } + + if (builder.getMetadataOrDefault(NO_GAS, false)) { + items.add(GTUtility.getIntegratedCircuit(circuitConfig)); + ret.addAll( + builder.copy() + .itemInputs(items.toArray(new ItemStack[0])) + .fluidInputs() + .duration((int) Math.max(durationBase * 1.1, 1)) + .addTo(RecipeMaps.blastFurnaceRecipes)); + items.remove(items.size() - 1); + circuitConfig += 10; + } + + items.add(GTUtility.getIntegratedCircuit(circuitConfig)); + boolean nobleGases = builder.getMetadataOrDefault(NOBLE_GASES, false); + boolean anaerobeGases = builder.getMetadataOrDefault(ANAEROBE_GASES, false); + Collection gases = new ArrayList<>(); + + if (nobleGases && anaerobeGases) { + gases = BlastFurnaceGasStat.getNobleAndAnaerobeGases(); + } else if (nobleGases) { + gases = BlastFurnaceGasStat.getNobleGases(); + } else if (anaerobeGases) { + gases = BlastFurnaceGasStat.getAnaerobeGases(); + } + for (BlastFurnaceGasStat gas : gases) { + int gasAmount = (int) (gas.recipeConsumedAmountMultiplier * basicGasAmount); + int duration = (int) Math.max(gas.recipeTimeMultiplier * durationBase, 1); + ret.addAll( + builder.copy() + .itemInputs(items.toArray(new ItemStack[0])) + .fluidInputs(GTUtility.copyAmount(gasAmount, gas.gas)) + .duration(duration) + .addTo(RecipeMaps.blastFurnaceRecipes)); + } + return ret; + }); + + /** + * Just like any normal assembler recipe, however it accepts one input item to be oredicted. Pass in the item to + * oredict via {@link #OREDICT_INPUT}. It will be used along all other item inputs as input of this recipe. + */ + public static IRecipeMap AssemblerOD = IRecipeMap.newRecipeMap(builder -> { + Collection ret = new ArrayList<>(); + for (ItemStack input : GTOreDictUnificator.getOresImmutable(builder.getMetadata(OREDICT_INPUT))) { + ret.addAll( + builder.copy() + .itemInputs(GTRecipeMapUtil.appendArray(builder.getItemInputsBasic(), input)) + .addTo(RecipeMaps.assemblerRecipes)); + } + return ret; + }); + + /** + * A universal fuel adder. It's actually just a dispatcher towards all actual fuel recipe maps. + * Dispatch based on {@link #FUEL_TYPE}. Uses {@link #FUEL_VALUE} as fuel value. + * Can use {@link FuelType#ordinal()} as a human-readable form of what FUEL_TYPE should be. + * You can bypass this and add to relevant fuel maps directly if you wish. + */ + public static IRecipeMap Fuel = IRecipeMap.newRecipeMap(builder -> { + builder.validateInputCount(1, 1) + .validateNoInputFluid() + .validateOutputCount(-1, 1) + .validateNoOutputFluid(); + if (!builder.isValid()) return Collections.emptyList(); + Integer fuelType = builder.getMetadata(FUEL_TYPE); + if (fuelType == null) return Collections.emptyList(); + builder.metadata(FUEL_VALUE, builder.getMetadataOrDefault(FUEL_VALUE, 0)); + return FuelType.get(fuelType) + .getTarget() + .doAdd(builder); + }); + + public enum FuelType { + + // ORDER MATTERS. DO NOT INSERT ELEMENT BETWEEN EXISTING ONES + DieselFuel(RecipeMaps.dieselFuels), + GasTurbine(RecipeMaps.gasTurbineFuels), + // appears unused + HotFuel(RecipeMaps.hotFuels), + SemiFluid(RecipeMaps.denseLiquidFuels), + PlasmaTurbine(RecipeMaps.plasmaFuels), + Magic(RecipeMaps.magicFuels),; + + private static final FuelType[] VALUES = values(); + private final IRecipeMap target; + + FuelType(IRecipeMap target) { + this.target = target; + } + + public static FuelType get(int fuelType) { + if (fuelType < 0 || fuelType >= VALUES.length) return SemiFluid; + return VALUES[fuelType]; + } + + public IRecipeMap getTarget() { + return target; + } + } + + static { + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(COIL_HEAT); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FUSION_THRESHOLD); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FUEL_VALUE); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(NANO_FORGE_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FOG_EXOTIC_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FOG_PLASMA_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(DEFC_CASING_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(CHEMPLANT_CASING_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(QFT_FOCUS_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(DISSOLUTION_TANK_RATIO); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(RTG_DURATION_IN_DAYS); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(LNG_BASIC_OUTPUT); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(NFR_COIL_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(NKE_RANGE); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(PRECISE_ASSEMBLER_CASING_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(COAL_CASING_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(COMPRESSION_TIER); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(RESEARCH_STATION_DATA); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(SIEVERTS); + GTRecipeMapUtil.SPECIAL_VALUE_ALIASES.add(DECAY_TICKS); + + } +} diff --git a/src/main/java/gregtech/api/util/GTRecipeMapUtil.java b/src/main/java/gregtech/api/util/GTRecipeMapUtil.java new file mode 100644 index 0000000000..86ef5b4031 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTRecipeMapUtil.java @@ -0,0 +1,198 @@ +package gregtech.api.util; + +import static gregtech.api.enums.Mods.GregTech; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.common.Loader; +import gnu.trove.list.TIntList; +import gnu.trove.list.array.TIntArrayList; +import gregtech.api.interfaces.IRecipeMap; +import gregtech.api.recipe.RecipeMetadataKey; + +/** + * Define helpers useful in the creation of recipe maps. + */ +public class GTRecipeMapUtil { + + public static final Function ALL_FAKE_RECIPE = r -> { + r.mFakeRecipe = true; + return r; + }; + + private static final Map addonRecipeMaps = new HashMap<>(); + private static final Multimap> delayedActions = ArrayListMultimap.create(); + + /** + * Set of metadata that work as alias for special values. + */ + public static final Set> SPECIAL_VALUE_ALIASES = new HashSet<>(); + + public static T[] appendArray(T[] arr, T val) { + T[] newArr = Arrays.copyOf(arr, arr.length + 1); + newArr[arr.length] = val; + return newArr; + } + + public static GTRecipeTemplate asTemplate(GTRecipe r) { + return asTemplate(r, false); + } + + public static GTRecipeTemplate asTemplate(GTRecipe r, boolean includeTemplate) { + return new GTRecipeTemplate(r, includeTemplate); + } + + public static List buildRecipeForMultiblock(GTRecipeBuilder b) { + return buildOrEmpty(convertCellToFluid(b, true)); + + } + + public static List buildRecipeForMultiblockNoCircuit(GTRecipeBuilder b) { + return buildOrEmpty(convertCellToFluid(b, false)); + } + + public static GTRecipeBuilder convertCellToFluid(GTRecipeBuilder b, boolean removeIntegratedCircuit) { + List itemInputs = new ArrayList<>(Arrays.asList(b.getItemInputsBasic())); + List itemOutputs = new ArrayList<>(Arrays.asList(b.getItemOutputs())); + List fluidInputs = new ArrayList<>(Arrays.asList(b.getFluidInputs())); + List fluidOutputs = new ArrayList<>(Arrays.asList(b.getFluidOutputs())); + TIntList chances = b.getChances() != null ? new TIntArrayList(b.getChances()) : null; + cellToFluid(itemInputs, fluidInputs, removeIntegratedCircuit, null); + cellToFluid(itemOutputs, fluidOutputs, removeIntegratedCircuit, chances); + itemInputs.removeIf(Objects::isNull); + if (chances == null) { + itemOutputs.removeIf(Objects::isNull); + } + fluidInputs.removeIf(Objects::isNull); + fluidOutputs.removeIf(Objects::isNull); + b.itemInputs(itemInputs.toArray(new ItemStack[0])); + b.itemOutputs(itemOutputs.toArray(new ItemStack[0]), chances != null ? chances.toArray() : null); + b.fluidInputs(fluidInputs.toArray(new FluidStack[0])); + b.fluidOutputs(fluidOutputs.toArray(new FluidStack[0])); + return b; + } + + private static void cellToFluid(List items, List fluids, boolean removeIntegratedCircuit, + TIntList chances) { + for (int i = items.size() - 1; i >= 0; i--) { + ItemStack item = items.get(i); + if (GTUtility.getFluidForFilledItem(item, true) != null || GTUtility.isCellEmpty(item) + || (removeIntegratedCircuit && GTUtility.isAnyIntegratedCircuit(item))) { + fluids.add(GTUtility.convertCellToFluid(item)); + items.remove(i); + if (chances != null) chances.removeAt(i); + } + } + } + + public static List buildOrEmpty(GTRecipeBuilder builder) { + return builder.build() + .map(Collections::singletonList) + .orElse(Collections.emptyList()); + } + + /** + * Register a recipe map as part of your mod's public API under your modID and your given identifier. + * + * @param identifier map name + * @param recipeMap the map to register + * @param dependencies fully qualified identifier of dependent recipe maps. scheduler will only add recipes to one + * of the dependent recipe maps and this recipe map concurrently, guaranteeing thread safety. + * Currently unused, but you are advised to fill them, so that when The Day (tm) comes we don't + * end up with a bunch of weird concurrency bugs. + */ + public static void registerRecipeMap(String identifier, IRecipeMap recipeMap, RecipeMapDependency... dependencies) { + String modId = Loader.instance() + .activeModContainer() + .getModId(); + if (GregTech.ID.equals(modId)) throw new IllegalStateException( + "do not register recipe map under the name of gregtech! do it in your own preinit!"); + String id = modId + "@" + identifier; + addonRecipeMaps.put(id, recipeMap); + for (Consumer action : delayedActions.get(id)) { + action.accept(recipeMap); + } + } + + /** + * Use this to register recipes for a recipe map in addon not present at compile time. + *

+ * Do not use this for recipes maps already in {@link GTRecipeConstants}. None of them will be available via this + * interface! + * + * @param identifier recipe map id + * @param registerAction DO NOT ADD RECIPES TO MAPS OTHER THAN THE ONE PASSED TO YOU. DO NOT DO ANYTHING OTHER THAN + * ADDING RECIPES TO THIS R + */ + public static void registerRecipesFor(String modid, String identifier, Consumer registerAction) { + String id = modid + "@" + identifier; + IRecipeMap map = addonRecipeMaps.get(id); + if (map == null) delayedActions.put(id, registerAction); + else registerAction.accept(map); + } + + public static final class GTRecipeTemplate { + + private final GTRecipe template; + private final List derivatives = new ArrayList<>(); + + private GTRecipeTemplate(GTRecipe template, boolean includeTemplate) { + this.template = template; + if (includeTemplate) derivatives.add(template); + } + + public GTRecipe derive() { + GTRecipe derived = template.copyShallow(); + derivatives.add(derived); + return derived; + } + + public List getAll() { + // fix shallow references + Set references = Collections.newSetFromMap(new IdentityHashMap<>()); + for (GTRecipe r : derivatives) { + if (!references.add(r.mInputs)) r.mInputs = r.mInputs.clone(); + if (!references.add(r.mOutputs)) r.mOutputs = r.mOutputs.clone(); + if (!references.add(r.mFluidInputs)) r.mFluidInputs = r.mFluidInputs.clone(); + if (!references.add(r.mFluidOutputs)) r.mFluidOutputs = r.mFluidOutputs.clone(); + } + return derivatives; + } + } + + public static final class RecipeMapDependency { + + private final IRecipeMap obj; + private final String id; + + public RecipeMapDependency(IRecipeMap obj, String id) { + this.obj = obj; + this.id = id; + } + + public static RecipeMapDependency create(String id) { + return new RecipeMapDependency(null, id); + } + + public static RecipeMapDependency create(IRecipeMap obj) { + return new RecipeMapDependency(obj, null); + } + } +} diff --git a/src/main/java/gregtech/api/util/GTRecipeRegistrator.java b/src/main/java/gregtech/api/util/GTRecipeRegistrator.java new file mode 100644 index 0000000000..919b37e7d9 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTRecipeRegistrator.java @@ -0,0 +1,872 @@ +package gregtech.api.util; + +import static gregtech.api.enums.GTValues.L; +import static gregtech.api.enums.GTValues.M; +import static gregtech.api.enums.GTValues.RA; +import static gregtech.api.enums.GTValues.VP; +import static gregtech.api.enums.Materials.Bronze; +import static gregtech.api.enums.Materials.Cobalt; +import static gregtech.api.enums.Materials.DarkSteel; +import static gregtech.api.enums.Materials.Diamond; +import static gregtech.api.enums.Materials.FierySteel; +import static gregtech.api.enums.Materials.Gold; +import static gregtech.api.enums.Materials.Iron; +import static gregtech.api.enums.Materials.IronWood; +import static gregtech.api.enums.Materials.Knightmetal; +import static gregtech.api.enums.Materials.Lead; +import static gregtech.api.enums.Materials.Ruby; +import static gregtech.api.enums.Materials.Sapphire; +import static gregtech.api.enums.Materials.Steel; +import static gregtech.api.enums.Materials.Steeleaf; +import static gregtech.api.enums.Materials.Thaumium; +import static gregtech.api.enums.Materials.Void; +import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes; +import static gregtech.api.recipe.RecipeMaps.hammerRecipes; +import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; +import static gregtech.api.recipe.RecipeMaps.wiremillRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; +import static gregtech.api.util.GTRecipeConstants.RECYCLE; +import static gregtech.api.util.GTRecipeConstants.UniversalArcFurnace; +import static gregtech.api.util.GTUtility.calculateRecipeEU; +import static gregtech.api.util.GTUtility.getTier; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.SetMultimap; + +import cpw.mods.fml.relauncher.ReflectionHelper; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TierEU; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.MaterialStack; +import gregtech.api.recipe.RecipeCategories; +import ic2.api.reactor.IReactorComponent; + +/** + * Class for Automatic Recipe registering. + */ +public class GTRecipeRegistrator { + + /** + * List of Materials, which are used in the Creation of Sticks. All Rod Materials are automatically added to this + * List. + */ + public static final List sRodMaterialList = new ArrayList<>(); + + private static final ItemStack sMt1 = new ItemStack(Blocks.dirt, 1, 0), sMt2 = new ItemStack(Blocks.dirt, 1, 0); + private static final String s_H = "h", s_F = "f", s_I = "I", s_P = "P", s_R = "R"; + private static final RecipeShape[] sShapes = new RecipeShape[] { + new RecipeShape(sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1, null), + new RecipeShape(sMt1, null, sMt1, sMt1, null, sMt1, sMt1, sMt1, sMt1), + new RecipeShape(null, sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1), + new RecipeShape(sMt1, sMt1, sMt1, sMt1, null, sMt1, null, null, null), + new RecipeShape(sMt1, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1), + new RecipeShape(sMt1, sMt1, sMt1, sMt1, null, sMt1, sMt1, null, sMt1), + new RecipeShape(null, null, null, sMt1, null, sMt1, sMt1, null, sMt1), + new RecipeShape(null, sMt1, null, null, sMt1, null, null, sMt2, null), + new RecipeShape(sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2, null), + new RecipeShape(null, sMt1, null, null, sMt2, null, null, sMt2, null), + new RecipeShape(sMt1, sMt1, null, sMt1, sMt2, null, null, sMt2, null), + new RecipeShape(null, sMt1, sMt1, null, sMt2, sMt1, null, sMt2, null), + new RecipeShape(sMt1, sMt1, null, null, sMt2, null, null, sMt2, null), + new RecipeShape(null, sMt1, sMt1, null, sMt2, null, null, sMt2, null), + new RecipeShape(null, sMt1, null, sMt1, null, null, null, sMt1, sMt2), + new RecipeShape(null, sMt1, null, null, null, sMt1, sMt2, sMt1, null), + new RecipeShape(null, sMt1, null, sMt1, null, sMt1, null, null, sMt2), + new RecipeShape(null, sMt1, null, sMt1, null, sMt1, sMt2, null, null), + new RecipeShape(null, sMt2, null, null, sMt1, null, null, sMt1, null), + new RecipeShape(null, sMt2, null, null, sMt2, null, sMt1, sMt1, sMt1), + new RecipeShape(null, sMt2, null, null, sMt2, null, null, sMt1, null), + new RecipeShape(null, sMt2, null, sMt1, sMt2, null, sMt1, sMt1, null), + new RecipeShape(null, sMt2, null, null, sMt2, sMt1, null, sMt1, sMt1), + new RecipeShape(null, sMt2, null, null, sMt2, null, sMt1, sMt1, null), + new RecipeShape(sMt1, null, null, null, sMt2, null, null, null, sMt2), + new RecipeShape(null, null, sMt1, null, sMt2, null, sMt2, null, null), + new RecipeShape(sMt1, null, null, null, sMt2, null, null, null, null), + new RecipeShape(null, null, sMt1, null, sMt2, null, null, null, null), + new RecipeShape(sMt1, sMt2, null, null, null, null, null, null, null), + new RecipeShape(sMt2, sMt1, null, null, null, null, null, null, null), + new RecipeShape(sMt1, null, null, sMt2, null, null, null, null, null), + new RecipeShape(sMt2, null, null, sMt1, null, null, null, null, null), + new RecipeShape(sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, null, sMt2, null), + new RecipeShape(sMt1, sMt1, null, sMt1, sMt1, sMt2, sMt1, sMt1, null), + new RecipeShape(null, sMt1, sMt1, sMt2, sMt1, sMt1, null, sMt1, sMt1), + new RecipeShape(null, sMt2, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1), + new RecipeShape(sMt1, sMt1, sMt1, sMt1, sMt2, sMt1, null, sMt2, null), + new RecipeShape(sMt1, sMt1, null, sMt1, sMt2, sMt2, sMt1, sMt1, null), + new RecipeShape(null, sMt1, sMt1, sMt2, sMt2, sMt1, null, sMt1, sMt1), + new RecipeShape(null, sMt2, null, sMt1, sMt2, sMt1, sMt1, sMt1, sMt1), + new RecipeShape(sMt1, null, null, null, sMt1, null, null, null, null), + new RecipeShape(null, sMt1, null, sMt1, null, null, null, null, null), + new RecipeShape(sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null), + new RecipeShape(null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2) }; + public static final Field SHAPED_ORE_RECIPE_WIDTH = ReflectionHelper.findField(ShapedOreRecipe.class, "width"); + public static final Field SHAPED_ORE_RECIPE_HEIGHT = ReflectionHelper.findField(ShapedOreRecipe.class, "height"); + private static volatile Map> indexedRecipeListCache; + private static final String[][] sShapesA = new String[][] { null, null, null, + { "Helmet", s_P + s_P + s_P, s_P + s_H + s_P }, + { "ChestPlate", s_P + s_H + s_P, s_P + s_P + s_P, s_P + s_P + s_P }, + { "Pants", s_P + s_P + s_P, s_P + s_H + s_P, s_P + " " + s_P }, { "Boots", s_P + " " + s_P, s_P + s_H + s_P }, + { "Sword", " " + s_P + " ", s_F + s_P + s_H, " " + s_R + " " }, + { "Pickaxe", s_P + s_I + s_I, s_F + s_R + s_H, " " + s_R + " " }, + { "Shovel", s_F + s_P + s_H, " " + s_R + " ", " " + s_R + " " }, + { "Axe", s_P + s_I + s_H, s_P + s_R + " ", s_F + s_R + " " }, + { "Axe", s_P + s_I + s_H, s_P + s_R + " ", s_F + s_R + " " }, + { "Hoe", s_P + s_I + s_H, s_F + s_R + " ", " " + s_R + " " }, + { "Hoe", s_P + s_I + s_H, s_F + s_R + " ", " " + s_R + " " }, + { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, + { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, + { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, + { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, + { "Sword", " " + s_R + " ", s_F + s_P + s_H, " " + s_P + " " }, + { "Pickaxe", " " + s_R + " ", s_F + s_R + s_H, s_P + s_I + s_I }, + { "Shovel", " " + s_R + " ", " " + s_R + " ", s_F + s_P + s_H }, + { "Axe", s_F + s_R + " ", s_P + s_R + " ", s_P + s_I + s_H }, + { "Axe", s_F + s_R + " ", s_P + s_R + " ", s_P + s_I + s_H }, + { "Hoe", " " + s_R + " ", s_F + s_R + " ", s_P + s_I + s_H }, + { "Hoe", " " + s_R + " ", s_F + s_R + " ", s_P + s_I + s_H }, + { "Spear", s_P + s_H + " ", s_F + s_R + " ", " " + " " + s_R }, + { "Spear", s_P + s_H + " ", s_F + s_R + " ", " " + " " + s_R }, { "Knive", s_H + s_P, s_R + s_F }, + { "Knive", s_F + s_H, s_P + s_R }, { "Knive", s_F + s_H, s_P + s_R }, { "Knive", s_P + s_F, s_R + s_H }, + { "Knive", s_P + s_F, s_R + s_H }, null, null, null, null, + { "WarAxe", s_P + s_P + s_P, s_P + s_R + s_P, s_F + s_R + s_H }, null, null, null, + { "Shears", s_H + s_P, s_P + s_F }, { "Shears", s_H + s_P, s_P + s_F }, + { "Scythe", s_I + s_P + s_H, s_R + s_F + s_P, s_R + " " + " " }, + { "Scythe", s_H + s_P + s_I, s_P + s_F + s_R, " " + " " + s_R } }; + + static { + // flush the cache on post load finish + GregTechAPI.sAfterGTPostload.add(() -> indexedRecipeListCache = null); + } + + public static void registerMaterialRecycling(ItemStack aStack, Materials aMaterial, long aMaterialAmount, + MaterialStack aByproduct) { + if (GTUtility.isStackInvalid(aStack)) return; + if (aByproduct != null) { + aByproduct = aByproduct.clone(); + aByproduct.mAmount /= aStack.stackSize; + } + GTOreDictUnificator.addItemData( + GTUtility.copyAmount(1, aStack), + new ItemData(aMaterial, aMaterialAmount / aStack.stackSize, aByproduct)); + } + + public static void registerMaterialRecycling(ItemStack aStack, ItemData aData) { + if (GTUtility.isStackInvalid(aStack) || GTUtility.areStacksEqual(new ItemStack(Items.blaze_rod), aStack) + || aData == null + || !aData.hasValidMaterialData() + || !aData.mMaterial.mMaterial.mAutoGenerateRecycleRecipes + || aData.mMaterial.mAmount <= 0 + || GTUtility.getFluidForFilledItem(aStack, false) != null + || aData.mMaterial.mMaterial.mSubTags.contains(SubTag.NO_RECIPES)) return; + registerReverseMacerating(GTUtility.copyAmount(1, aStack), aData, aData.mPrefix == null); + if (!GTUtility.areStacksEqual(GTModHandler.getIC2Item("iridiumOre", 1L), aStack)) { + registerReverseSmelting( + GTUtility.copyAmount(1, aStack), + aData.mMaterial.mMaterial, + aData.mMaterial.mAmount, + true); + registerReverseFluidSmelting( + GTUtility.copyAmount(1, aStack), + aData.mMaterial.mMaterial, + aData.mMaterial.mAmount, + aData.getByProduct(0)); + registerReverseArcSmelting(GTUtility.copyAmount(1, aStack), aData); + } + } + + /** + * @param aStack the stack to be recycled. + * @param aMaterial the Material. + * @param aMaterialAmount the amount of it in Material Units. + */ + public static void registerReverseFluidSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount, + MaterialStack aByproduct) { + if (aStack == null || aMaterial == null + || aMaterial.mSmeltInto.mStandardMoltenFluid == null + || !aMaterial.contains(SubTag.SMELTING_TO_FLUID) + || (L * aMaterialAmount) / (M * aStack.stackSize) <= 0) return; + + ItemStack recipeOutput = aByproduct == null ? null + : aByproduct.mMaterial.contains(SubTag.NO_SMELTING) || !aByproduct.mMaterial.contains(SubTag.METAL) + ? aByproduct.mMaterial.contains(SubTag.FLAMMABLE) + ? GTOreDictUnificator.getDust(Materials.Ash, aByproduct.mAmount / 2) + : aByproduct.mMaterial.contains(SubTag.UNBURNABLE) + ? GTOreDictUnificator.getDustOrIngot(aByproduct.mMaterial.mSmeltInto, aByproduct.mAmount) + : null + : GTOreDictUnificator.getIngotOrDust(aByproduct.mMaterial.mSmeltInto, aByproduct.mAmount); + + GTRecipeBuilder builder = RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, aStack)); + if (recipeOutput != null) { + builder.itemOutputs(recipeOutput); + } + long powerUsage = Math.max(8, (long) Math.sqrt(2 * aMaterial.mSmeltInto.mStandardMoltenFluid.getTemperature())); + // avoid full amp recipes + int powerTier = getTier(powerUsage); + if (powerTier > 0 && powerTier < VP.length && powerUsage > VP[powerTier]) { + powerUsage = VP[powerTier]; + } + builder.fluidOutputs(aMaterial.mSmeltInto.getMolten((L * aMaterialAmount) / (M * aStack.stackSize))) + .duration((int) Math.max(1, (24 * aMaterialAmount) / M)) + .eut(powerUsage) + .recipeCategory(RecipeCategories.fluidExtractorRecycling) + .addTo(fluidExtractionRecipes); + } + + /** + * @param aStack the stack to be recycled. + * @param aMaterial the Material. + * @param aMaterialAmount the amount of it in Material Units. + * @param aAllowAlloySmelter if it is allowed to be recycled inside the Alloy Smelter. + */ + public static void registerReverseSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount, + boolean aAllowAlloySmelter) { + if (aStack == null || aMaterial == null + || aMaterialAmount <= 0 + || aMaterial.contains(SubTag.NO_SMELTING) + || (aMaterialAmount > M && aMaterial.contains(SubTag.METAL)) + || (aMaterial.getProcessingMaterialTierEU() > TierEU.IV)) return; + if (aMaterial == Materials.Naquadah || aMaterial == Materials.NaquadahEnriched) return; + + aMaterialAmount /= aStack.stackSize; + + if (aAllowAlloySmelter) GTModHandler.addSmeltingAndAlloySmeltingRecipe( + GTUtility.copyAmount(1, aStack), + GTOreDictUnificator.getIngot(aMaterial.mSmeltInto, aMaterialAmount), + false); + else GTModHandler.addSmeltingRecipe( + GTUtility.copyAmount(1, aStack), + GTOreDictUnificator.getIngot(aMaterial.mSmeltInto, aMaterialAmount)); + } + + public static void registerReverseArcSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount, + MaterialStack aByProduct01, MaterialStack aByProduct02, MaterialStack aByProduct03) { + registerReverseArcSmelting( + aStack, + new ItemData( + aMaterial == null ? null : new MaterialStack(aMaterial, aMaterialAmount), + aByProduct01, + aByProduct02, + aByProduct03)); + } + + public static void registerReverseArcSmelting(ItemStack aStack, ItemData aData) { + if (aStack == null || aData == null) return; + aData = new ItemData(aData); + + if (!aData.hasValidMaterialData()) return; + boolean isRecycle = true; + + for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { + if (tMaterial.mMaterial == Materials.Iron || tMaterial.mMaterial == Materials.Copper + || tMaterial.mMaterial == Materials.WroughtIron + || tMaterial.mMaterial == Materials.AnnealedCopper) { + ItemData stackData = GTOreDictUnificator.getItemData(aStack); + if (stackData != null + && (stackData.mPrefix == OrePrefixes.ingot || stackData.mPrefix == OrePrefixes.dust)) { + // iron ingot/dust -> wrought iron, copper ingot/dust -> annealed copper + isRecycle = false; + } + } + + if (tMaterial.mMaterial.contains(SubTag.UNBURNABLE)) { + tMaterial.mMaterial = tMaterial.mMaterial.mSmeltInto.mArcSmeltInto; + continue; + } + if (tMaterial.mMaterial.contains(SubTag.EXPLOSIVE)) { + tMaterial.mMaterial = Materials.Ash; + tMaterial.mAmount /= 16; + continue; + } + if (tMaterial.mMaterial.contains(SubTag.FLAMMABLE)) { + tMaterial.mMaterial = Materials.Ash; + tMaterial.mAmount /= 8; + continue; + } + if (tMaterial.mMaterial.contains(SubTag.NO_SMELTING)) { + tMaterial.mAmount = 0; + continue; + } + if (tMaterial.mMaterial.contains(SubTag.METAL)) { + + tMaterial.mMaterial = tMaterial.mMaterial.mSmeltInto.mArcSmeltInto; + continue; + } + tMaterial.mAmount = 0; + } + + aData = new ItemData(aData); + if (aData.mByProducts.length > 3) for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { + if (tMaterial.mMaterial == Materials.Ash) tMaterial.mAmount = 0; + } + + aData = new ItemData(aData); + + if (!aData.hasValidMaterialData()) return; + + long tAmount = 0; + for (MaterialStack tMaterial : aData.getAllMaterialStacks()) + tAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass(); + + ArrayList outputs = new ArrayList<>(); + if (GTOreDictUnificator.getIngotOrDust(aData.mMaterial) != null) { + outputs.add(GTOreDictUnificator.getIngotOrDust(aData.mMaterial)); + } + for (int i = 0; i < 8; i++) { + if (GTOreDictUnificator.getIngotOrDust(aData.getByProduct(i)) != null) { + outputs.add(GTOreDictUnificator.getIngotOrDust(aData.getByProduct(i))); + } + } + if (!outputs.isEmpty()) { + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); + recipeBuilder.itemInputs(aStack) + .itemOutputs(outputs.toArray(new ItemStack[0])) + .fluidInputs(Materials.Oxygen.getGas((int) Math.max(16, tAmount / M))) + .duration(((int) Math.max(16, tAmount / M)) * TICKS) + .eut(90) + .metadata(RECYCLE, isRecycle) + .addTo(UniversalArcFurnace); + } + + } + + public static void registerReverseMacerating(ItemStack aStack, Materials aMaterial, long aMaterialAmount, + MaterialStack aByProduct01, MaterialStack aByProduct02, MaterialStack aByProduct03, boolean aAllowHammer) { + registerReverseMacerating( + aStack, + new ItemData( + aMaterial == null ? null : new MaterialStack(aMaterial, aMaterialAmount), + aByProduct01, + aByProduct02, + aByProduct03), + aAllowHammer); + } + + public static void registerReverseMacerating(ItemStack aStack, ItemData aData, boolean aAllowHammer) { + if (aStack == null || aData == null) return; + aData = new ItemData(aData); + + if (!aData.hasValidMaterialData()) return; + + for (MaterialStack tMaterial : aData.getAllMaterialStacks()) + tMaterial.mMaterial = tMaterial.mMaterial.mMacerateInto; + + aData = new ItemData(aData); + + if (!aData.hasValidMaterialData()) return; + + long tAmount = 0; + for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { + tAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass(); + } + + { + ArrayList outputs = new ArrayList<>(); + if (GTOreDictUnificator.getDust(aData.mMaterial) != null) { + outputs.add(GTOreDictUnificator.getDust(aData.mMaterial)); + } + for (int i = 0; i < 3; i++) { + if (GTOreDictUnificator.getDust(aData.getByProduct(i)) != null) { + outputs.add(GTOreDictUnificator.getDust(aData.getByProduct(i))); + } + } + if (!outputs.isEmpty()) { + ItemStack[] outputsArray = outputs.toArray(new ItemStack[0]); + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); + recipeBuilder.itemInputs(aStack) + .itemOutputs(outputsArray) + .duration( + (aData.mMaterial.mMaterial == Materials.Marble ? 1 : (int) Math.max(16, tAmount / M)) * TICKS) + .eut(4) + .recipeCategory(RecipeCategories.maceratorRecycling) + .addTo(maceratorRecipes); + } + } + + if (!aAllowHammer) { + return; + } + + for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { + if (tMaterial.mMaterial.contains(SubTag.CRYSTAL) && !tMaterial.mMaterial.contains(SubTag.METAL) + && tMaterial.mMaterial != Materials.Glass + && GTOreDictUnificator.getDust(aData.mMaterial) != null) { + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, aStack)) + .itemOutputs(GTOreDictUnificator.getDust(aData.mMaterial)) + .duration(10 * SECONDS) + .eut(TierEU.RECIPE_LV) + .recipeCategory(RecipeCategories.forgeHammerRecycling) + .addTo(hammerRecipes); + break; + } + } + + } + + /** + * Place Materials which you want to replace in Non-GT-Recipes here (warning HUGHE impact on loading times!) + */ + private static final Materials[] VANILLA_MATS = { Cobalt, Gold, Iron, Lead, FierySteel, Void, Bronze, Diamond, Ruby, + Sapphire, Steel, IronWood, Steeleaf, Knightmetal, Thaumium, DarkSteel, }; + + /** + * You give this Function a Material and it will scan almost everything for adding recycling Recipes and replacing + * Ingots, Gems etc. + * + * @param aMats Materials, for example an Ingot or a Gem. + * @param aPlate the Plate referenced to aMat + * @param aRecipeReplacing allows to replace the Recipe with a Plate variant + */ + public static synchronized void registerUsagesForMaterials(String aPlate, boolean aRecipeReplacing, + ItemStack... aMats) { + for (ItemStack aMat : aMats) { + aMat = GTUtility.copyOrNull(aMat); + + if (aMat == null) continue; + + ItemData aItemData = GTOreDictUnificator.getItemData(aMat); + if (aItemData == null || aItemData.mPrefix != OrePrefixes.ingot) aPlate = null; + if (aPlate != null && GTOreDictUnificator.getFirstOre(aPlate, 1) == null) aPlate = null; + + sMt1.func_150996_a(aMat.getItem()); + sMt1.stackSize = 1; + Items.feather.setDamage(sMt1, Items.feather.getDamage(aMat)); + + sMt2.func_150996_a(new ItemStack(Blocks.dirt).getItem()); + sMt2.stackSize = 1; + Items.feather.setDamage(sMt2, 0); + + if (aItemData != null && aItemData.hasValidPrefixMaterialData()) { + for (RecipeShape tRecipe : sShapes) { + for (ItemStack tCrafted : GTModHandler.getRecipeOutputsBuffered(tRecipe.shape)) { + GTOreDictUnificator.addItemData( + tCrafted, + new ItemData(aItemData.mMaterial.mMaterial, aItemData.mMaterial.mAmount * tRecipe.amount1)); + // + // GTLog.out.println("###################################################################################"); + // GTLog.out.println("registerUsagesForMaterials used aPlate: "+aPlate); + // GTLog.out.println("registerUsagesForMaterials used aPlate: + // "+aMat.getUnlocalizedName()); + // GTLog.out.println("registerUsagesForMaterials used aPlate: + // "+aMat.getDisplayName()); + // + // GTLog.out.println("###################################################################################"); + } + } + } + registerStickStuff(aPlate, aItemData, aRecipeReplacing); + } + } + + private static List getRecipeList(RecipeShape shape) { + boolean force = !GregTechAPI.sPostloadStarted || GregTechAPI.sPostloadFinished; + if (force || indexedRecipeListCache == null) { + synchronized (GTRecipeRegistrator.class) { + if (indexedRecipeListCache == null || force) { + indexedRecipeListCache = createIndexedRecipeListCache(); + } + } + } + return indexedRecipeListCache.get(shape); + } + + private static Map> createIndexedRecipeListCache() { + Map> result = new IdentityHashMap<>(); + ArrayList allRecipeList = (ArrayList) CraftingManager.getInstance() + .getRecipeList(); + // filter using the empty slots in the shape. + // if the empty slots doesn't match, the recipe will definitely fail + SetMultimap, RecipeShape> filter = HashMultimap.create(); + for (RecipeShape shape : sShapes) { + for (List list : shape.getEmptySlotsAllVariants()) { + filter.put(list, shape); + } + } + List buffer = new ArrayList<>(9); + for (IRecipe tRecipe : allRecipeList) { + if (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe) { + // we don't target shapeless recipes + continue; + } + buffer.clear(); + ItemStack tStack = tRecipe.getRecipeOutput(); + if (GTUtility.isStackValid(tStack) && tStack.getMaxStackSize() == 1 + && tStack.getMaxDamage() > 0 + && !(tStack.getItem() instanceof ItemBlock) + && !(tStack.getItem() instanceof IReactorComponent) + && !GTModHandler.isElectricItem(tStack) + && !GTUtility.isStackInList(tStack, GTModHandler.sNonReplaceableItems)) { + if (tRecipe instanceof ShapedOreRecipe tShapedRecipe) { + if (checkRecipeShape( + buffer, + tShapedRecipe.getInput(), + getRecipeWidth(tShapedRecipe), + getRecipeHeight(tShapedRecipe))) { + for (RecipeShape s : filter.get(buffer)) { + result.computeIfAbsent(s, k -> new ArrayList<>()) + .add(tRecipe); + } + } + } else if (tRecipe instanceof ShapedRecipes tShapedRecipe) { + if (checkRecipeShape( + buffer, + tShapedRecipe.recipeItems, + getRecipeWidth(tShapedRecipe), + getRecipeHeight(tShapedRecipe))) { + for (RecipeShape s : filter.get(buffer)) { + result.computeIfAbsent(s, k -> new ArrayList<>()) + .add(tRecipe); + } + } + } else { + for (RecipeShape s : sShapes) { + // unknown recipe type. cannot determine empty slots. we choose to add to the recipe list for + // all shapes + result.computeIfAbsent(s, k -> new ArrayList<>()) + .add(tRecipe); + } + } + } + } + return result; + } + + private static boolean checkRecipeShape(List emptySlotIndexesBuffer, Object[] input, int tRecipeWidth, + int tRecipeHeight) { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + if (x >= tRecipeWidth || y >= tRecipeHeight) { + emptySlotIndexesBuffer.add(x + y * 3); + continue; + } + Object tObject = input[x + y * tRecipeWidth]; + if (tObject == null) { + emptySlotIndexesBuffer.add(x + y * 3); + continue; + } + if (tObject instanceof ItemStack + && (((ItemStack) tObject).getItem() == null || ((ItemStack) tObject).getMaxStackSize() < 2 + || ((ItemStack) tObject).getMaxDamage() > 0 + || ((ItemStack) tObject).getItem() instanceof ItemBlock)) { + return false; + } + if (tObject instanceof List && ((List) tObject).isEmpty()) { + return false; + } + } + } + return true; + } + + private static synchronized void registerStickStuff(String aPlate, ItemData aItemData, boolean aRecipeReplacing) { + ItemStack tStack; + for (Materials tMaterial : sRodMaterialList) { + ItemStack tMt2 = GTOreDictUnificator.get(OrePrefixes.stick, tMaterial, 1); + if (tMt2 != null) { + sMt2.func_150996_a(tMt2.getItem()); + sMt2.stackSize = 1; + Items.feather.setDamage(sMt2, Items.feather.getDamage(tMt2)); + + for (int i = 0; i < sShapes.length; i++) { + RecipeShape tRecipe = sShapes[i]; + + for (ItemStack tCrafted : GTModHandler + .getRecipeOutputs(getRecipeList(tRecipe), true, tRecipe.shape)) { + if (aItemData != null && aItemData.hasValidPrefixMaterialData()) + GTOreDictUnificator.addItemData( + tCrafted, + new ItemData( + aItemData.mMaterial.mMaterial, + aItemData.mMaterial.mAmount * tRecipe.amount1, + new MaterialStack(tMaterial, OrePrefixes.stick.mMaterialAmount * tRecipe.amount2))); + + if (aRecipeReplacing && aPlate != null && sShapesA[i] != null && sShapesA[i].length > 1) { + assert aItemData != null; + + if (null != (tStack = GTModHandler.removeRecipe(tRecipe.shape))) { + switch (sShapesA[i].length) { + case 2 -> GTModHandler.addCraftingRecipe( + tStack, + GTModHandler.RecipeBits.BUFFERED, + new Object[] { sShapesA[i][1], s_P.charAt(0), aPlate, s_R.charAt(0), + OrePrefixes.stick.get(tMaterial), s_I.charAt(0), aItemData }); + case 3 -> GTModHandler.addCraftingRecipe( + tStack, + GTModHandler.RecipeBits.BUFFERED, + new Object[] { sShapesA[i][1], sShapesA[i][2], s_P.charAt(0), aPlate, + s_R.charAt(0), OrePrefixes.stick.get(tMaterial), s_I.charAt(0), + aItemData }); + default -> GTModHandler.addCraftingRecipe( + tStack, + GTModHandler.RecipeBits.BUFFERED, + new Object[] { sShapesA[i][1], sShapesA[i][2], sShapesA[i][3], s_P.charAt(0), + aPlate, s_R.charAt(0), OrePrefixes.stick.get(tMaterial), s_I.charAt(0), + aItemData }); + } + } + } + } + } + } + } + } + + /** + * Registers wiremill recipes for given material using integrated circuits. + * + * @param aMaterial material to register + * @param baseDuration base duration ticks for ingot -> 1x wire recipe + * @param aEUt EU/t for recipe If you provide a proper EU tier for recipe processing then aEUt will be + * overriden with it. + */ + public static void registerWiremillRecipes(Materials aMaterial, int baseDuration, int aEUt) { + registerWiremillRecipes( + aMaterial, + baseDuration, + calculateRecipeEU(aMaterial, aEUt), + OrePrefixes.ingot, + OrePrefixes.stick, + 2); + } + + /** + * Registers wiremill recipes for given material using integrated circuits. + * + * @param aMaterial material to register + * @param baseDuration base duration ticks for ingot -> 1x wire recipe + * @param aEUt EU/t for recipe + * @param prefix1 prefix corresponds to ingot + * @param prefix2 prefix corresponds to stick + * @param multiplier amount of wires created from 1 ingot + */ + public static void registerWiremillRecipes(Materials aMaterial, int baseDuration, int aEUt, OrePrefixes prefix1, + OrePrefixes prefix2, int multiplier) { + if (GTOreDictUnificator.get(prefix1, aMaterial, 1L) != null + && GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(prefix1, aMaterial, 1L), GTUtility.getIntegratedCircuit(1)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, multiplier)) + .duration(baseDuration * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix1, aMaterial, 2L / multiplier), + GTUtility.getIntegratedCircuit(2)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L)) + .duration(((int) (baseDuration * 1.5f)) * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix1, aMaterial, 4L / multiplier), + GTUtility.getIntegratedCircuit(4)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L)) + .duration(baseDuration * 2 * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix1, aMaterial, 8L / multiplier), + GTUtility.getIntegratedCircuit(8)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L)) + .duration(((int) (baseDuration * 2.5f)) * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix1, aMaterial, 12L / multiplier), + GTUtility.getIntegratedCircuit(12)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L)) + .duration(baseDuration * 3 * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix1, aMaterial, 16L / multiplier), + GTUtility.getIntegratedCircuit(16)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L)) + .duration(((int) (baseDuration * 3.5f)) * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + } + + if (GTOreDictUnificator.get(prefix2, aMaterial, 1L) != null + && GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(prefix2, aMaterial, 1L), GTUtility.getIntegratedCircuit(1)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 2L / multiplier)) + .duration(((int) (baseDuration * 0.5f)) * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix2, aMaterial, 4L / multiplier), + GTUtility.getIntegratedCircuit(2)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L)) + .duration(baseDuration * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix2, aMaterial, 8L / multiplier), + GTUtility.getIntegratedCircuit(4)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L)) + .duration(((int) (baseDuration * 1.5f)) * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix2, aMaterial, 16L / multiplier), + GTUtility.getIntegratedCircuit(8)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L)) + .duration(baseDuration * 2 * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix2, aMaterial, 24L / multiplier), + GTUtility.getIntegratedCircuit(12)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L)) + .duration(((int) (baseDuration * 2.5f)) * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(prefix2, aMaterial, 32L / multiplier), + GTUtility.getIntegratedCircuit(16)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L)) + .duration(baseDuration * 3 * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + } + if (GTOreDictUnificator.get(prefix1, aMaterial, 1L) != null + && GTOreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(prefix1, aMaterial, 1L), GTUtility.getIntegratedCircuit(3)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 4L * multiplier)) + .duration(baseDuration * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + } + if (GTOreDictUnificator.get(prefix2, aMaterial, 1L) != null + && GTOreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) { + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(prefix2, aMaterial, 1L), GTUtility.getIntegratedCircuit(3)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 2L * multiplier)) + .duration(((int) (baseDuration * 0.5f)) * TICKS) + .eut(aEUt) + .addTo(wiremillRecipes); + } + } + + public static boolean hasVanillaRecipes(Materials materials) { + return Arrays.stream(VANILLA_MATS) + .anyMatch(mat -> mat == materials); + } + + private static int getRecipeWidth(ShapedOreRecipe r) { + try { + return (int) SHAPED_ORE_RECIPE_WIDTH.get(r); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + private static int getRecipeHeight(ShapedOreRecipe r) { + try { + return (int) SHAPED_ORE_RECIPE_HEIGHT.get(r); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + private static int getRecipeHeight(ShapedRecipes r) { + return r.recipeHeight; + } + + private static int getRecipeWidth(ShapedRecipes r) { + return r.recipeWidth; + } + + private static class RecipeShape { + + private final ItemStack[] shape; + private int amount1; + private int amount2; + + public RecipeShape(ItemStack... shape) { + this.shape = shape; + + for (ItemStack stack : shape) { + if (stack == sMt1) this.amount1++; + if (stack == sMt2) this.amount2++; + } + } + + public List> getEmptySlotsAllVariants() { + // "shake" the grid in 8 direction and see if the recipe shape is still valid + // also include the "no movement" case + ImmutableList.Builder> b = ImmutableList.builder(); + for (int i = -1; i < 2; i++) { + if (i != 0 && !isColClear(i + 1)) continue; + for (int j = -1; j < 2; j++) { + if (j != 0 && !isRowClear(j + 1)) continue; + b.add(getEmptySlots(i, j)); + } + } + return b.build(); + } + + private boolean isRowClear(int row) { + for (int i = 0; i < 3; i++) { + if (shape[i + row * 3] != null) return false; + } + return true; + } + + private boolean isColClear(int col) { + for (int i = 0; i < 3; i++) { + if (shape[col + i * 3] != null) return false; + } + return true; + } + + private List getEmptySlots(int offsetX, int offsetY) { + ImmutableList.Builder b = ImmutableList.builder(); + for (int i = 0; i < shape.length; i++) { + int mappedIndex = i - offsetX - offsetY * 3; + // empty slot if it either + // 1) map to a slot outside the original shape + // 2) map to an empty slot in original shape + if (mappedIndex < 0 || mappedIndex > 8 || shape[mappedIndex] == null) b.add(i); + } + return b.build(); + } + } +} diff --git a/src/main/java/gregtech/api/util/GTRenderingWorld.java b/src/main/java/gregtech/api/util/GTRenderingWorld.java new file mode 100644 index 0000000000..ace0e9cd8d --- /dev/null +++ b/src/main/java/gregtech/api/util/GTRenderingWorld.java @@ -0,0 +1,195 @@ +package gregtech.api.util; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.world.ChunkEvent; +import net.minecraftforge.event.world.WorldEvent; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; + +/** + * Provide a fake IBlockAccess to support CTM. Facade are supposed to set these when they are placed/received by client. + */ +public class GTRenderingWorld implements IBlockAccess { + + private static final GTRenderingWorld INSTANCE = new GTRenderingWorld(); + /* + * I do not think this map would ever grow too huge, so I won't go too overcomplicated on this one + */ + private final Map infos = new HashMap<>(); + private final Map> index = new HashMap<>(); + private IBlockAccess mWorld = Minecraft.getMinecraft().theWorld; + + private GTRenderingWorld() { + new FMLEventHandler(); + new ForgeEventHandler(); + } + + public static GTRenderingWorld getInstance() { + return INSTANCE; + } + + public static GTRenderingWorld getInstance(IBlockAccess aWorld) { + if (aWorld == INSTANCE) return INSTANCE; + if (aWorld == null) INSTANCE.mWorld = Minecraft.getMinecraft().theWorld; + else INSTANCE.mWorld = aWorld; + return INSTANCE; + } + + private void setWorld(IBlockAccess aWorld) { + if (aWorld == null) mWorld = Minecraft.getMinecraft().theWorld; + else mWorld = aWorld; + } + + public void register(int x, int y, int z, Block block, int meta) { + ChunkPosition key = new ChunkPosition(x, y, z); + infos.put(key, new BlockInfo(block, meta)); + index.computeIfAbsent(new ChunkCoordIntPair(x >> 4, z >> 4), p -> new HashSet<>()) + .add(key); + } + + public void unregister(int x, int y, int z, Block block, int meta) { + ChunkPosition key = new ChunkPosition(x, y, z); + if (infos.remove(key, new BlockInfo(block, meta))) { + ChunkCoordIntPair chunkKey = new ChunkCoordIntPair(x >> 4, z >> 4); + Set set = index.get(chunkKey); + set.remove(key); + if (set.isEmpty()) index.remove(chunkKey); + } + } + + @Override + public Block getBlock(int p_147439_1_, int p_147439_2_, int p_147439_3_) { + BlockInfo blockInfo = infos.get(new ChunkPosition(p_147439_1_, p_147439_2_, p_147439_3_)); + return blockInfo != null ? blockInfo.block : mWorld.getBlock(p_147439_1_, p_147439_2_, p_147439_3_); + } + + @Override + public TileEntity getTileEntity(int p_147438_1_, int p_147438_2_, int p_147438_3_) { + return mWorld.getTileEntity(p_147438_1_, p_147438_2_, p_147438_3_); + } + + @Override + public int getLightBrightnessForSkyBlocks(int p_72802_1_, int p_72802_2_, int p_72802_3_, int p_72802_4_) { + return mWorld.getLightBrightnessForSkyBlocks(p_72802_1_, p_72802_2_, p_72802_3_, p_72802_4_); + } + + @Override + public int getBlockMetadata(int p_72805_1_, int p_72805_2_, int p_72805_3_) { + BlockInfo blockInfo = infos.get(new ChunkPosition(p_72805_1_, p_72805_2_, p_72805_3_)); + return blockInfo != null ? blockInfo.meta : mWorld.getBlockMetadata(p_72805_1_, p_72805_2_, p_72805_3_); + } + + @Override + public int isBlockProvidingPowerTo(int p_72879_1_, int p_72879_2_, int p_72879_3_, int p_72879_4_) { + return mWorld.isBlockProvidingPowerTo(p_72879_1_, p_72879_2_, p_72879_3_, p_72879_4_); + } + + @Override + public boolean isAirBlock(int p_147437_1_, int p_147437_2_, int p_147437_3_) { + return getBlock(p_147437_1_, p_147437_2_, p_147437_3_).isAir(mWorld, p_147437_1_, p_147437_2_, p_147437_3_); + } + + @Override + public BiomeGenBase getBiomeGenForCoords(int p_72807_1_, int p_72807_2_) { + return mWorld.getBiomeGenForCoords(p_72807_1_, p_72807_2_); + } + + @Override + public int getHeight() { + return mWorld.getHeight(); + } + + @Override + public boolean extendedLevelsInChunkCache() { + return mWorld.extendedLevelsInChunkCache(); + } + + @Override + public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default) { + return getBlock(x, y, z).isSideSolid(this, x, y, z, side); + } + + public class FMLEventHandler { + + public FMLEventHandler() { + FMLCommonHandler.instance() + .bus() + .register(this); + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onRenderTickStart(TickEvent.RenderTickEvent e) { + if (e.phase == TickEvent.Phase.START) mWorld = Minecraft.getMinecraft().theWorld; + } + } + + public class ForgeEventHandler { + + private ForgeEventHandler() { + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + public void onChunkUnloaded(ChunkEvent.Unload e) { + if (!e.world.isRemote) return; + Set set = index.remove( + e.getChunk() + .getChunkCoordIntPair()); + if (set != null) infos.keySet() + .removeAll(set); + } + + @SubscribeEvent + public void onWorldUnloaded(WorldEvent.Unload e) { + if (!e.world.isRemote) return; + infos.clear(); + index.clear(); + } + } + + private static class BlockInfo { + + private final Block block; + private final int meta; + + public BlockInfo(Block block, int meta) { + this.block = block; + this.meta = meta; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + BlockInfo blockInfo = (BlockInfo) o; + + if (meta != blockInfo.meta) return false; + return Objects.equals(block, blockInfo.block); + } + + @Override + public int hashCode() { + int result = block != null ? block.hashCode() : 0; + result = 31 * result + meta; + return result; + } + } +} diff --git a/src/main/java/gregtech/api/util/GTShapedRecipe.java b/src/main/java/gregtech/api/util/GTShapedRecipe.java new file mode 100644 index 0000000000..587f3fa852 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTShapedRecipe.java @@ -0,0 +1,100 @@ +package gregtech.api.util; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; + +import gregtech.api.interfaces.internal.IGTCraftingRecipe; + +public class GTShapedRecipe extends ShapedOreRecipe implements IGTCraftingRecipe { + + public final boolean mRemovableByGT, mKeepingNBT; + private final Enchantment[] mEnchantmentsAdded; + private final int[] mEnchantmentLevelsAdded; + + public GTShapedRecipe(ItemStack aResult, boolean aDismantleAble, boolean aRemovableByGT, boolean aKeepingNBT, + Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, Object... aRecipe) { + super(aResult, aRecipe); + mEnchantmentsAdded = aEnchantmentsAdded; + mEnchantmentLevelsAdded = aEnchantmentLevelsAdded; + mRemovableByGT = aRemovableByGT; + mKeepingNBT = aKeepingNBT; + } + + @Override + public boolean matches(InventoryCrafting aGrid, World aWorld) { + if (mKeepingNBT) { + ItemStack tStack = null; + for (int i = 0; i < aGrid.getSizeInventory(); i++) { + if (aGrid.getStackInSlot(i) != null) { + if (tStack != null) { + if ((tStack.hasTagCompound() != aGrid.getStackInSlot(i) + .hasTagCompound()) || (tStack.hasTagCompound() + && !tStack.getTagCompound() + .equals( + aGrid.getStackInSlot(i) + .getTagCompound()))) + return false; + } + tStack = aGrid.getStackInSlot(i); + } + } + } + return super.matches(aGrid, aWorld); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting aGrid) { + ItemStack rStack = super.getCraftingResult(aGrid); + if (rStack != null) { + // Update the Stack + GTUtility.updateItemStack(rStack); + + // Keeping NBT + if (mKeepingNBT) for (int i = 0; i < aGrid.getSizeInventory(); i++) { + if (aGrid.getStackInSlot(i) != null && aGrid.getStackInSlot(i) + .hasTagCompound()) { + rStack.setTagCompound( + (NBTTagCompound) aGrid.getStackInSlot(i) + .getTagCompound() + .copy()); + break; + } + } + + // Charge Values + if (GTModHandler.isElectricItem(rStack)) { + GTModHandler.dischargeElectricItem(rStack, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false, true); + int tCharge = 0; + for (int i = 0; i < aGrid.getSizeInventory(); i++) tCharge += GTModHandler.dischargeElectricItem( + aGrid.getStackInSlot(i), + Integer.MAX_VALUE, + Integer.MAX_VALUE, + true, + true, + true); + if (tCharge > 0) GTModHandler.chargeElectricItem(rStack, tCharge, Integer.MAX_VALUE, true, false); + } + + // Add Enchantments + for (int i = 0; i < mEnchantmentsAdded.length; i++) GTUtility.ItemNBT.addEnchantment( + rStack, + mEnchantmentsAdded[i], + EnchantmentHelper.getEnchantmentLevel(mEnchantmentsAdded[i].effectId, rStack) + + mEnchantmentLevelsAdded[i]); + + // Update the Stack again + GTUtility.updateItemStack(rStack); + } + return rStack; + } + + @Override + public boolean isRemovable() { + return mRemovableByGT; + } +} diff --git a/src/main/java/gregtech/api/util/GTShapelessRecipe.java b/src/main/java/gregtech/api/util/GTShapelessRecipe.java new file mode 100644 index 0000000000..20c1d361be --- /dev/null +++ b/src/main/java/gregtech/api/util/GTShapelessRecipe.java @@ -0,0 +1,100 @@ +package gregtech.api.util; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +import gregtech.api.interfaces.internal.IGTCraftingRecipe; + +public class GTShapelessRecipe extends ShapelessOreRecipe implements IGTCraftingRecipe { + + public final boolean mRemovableByGT, mKeepingNBT; + private final Enchantment[] mEnchantmentsAdded; + private final int[] mEnchantmentLevelsAdded; + + public GTShapelessRecipe(ItemStack aResult, boolean aDismantleAble, boolean aRemovableByGT, boolean aKeepingNBT, + Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, Object... aRecipe) { + super(aResult, aRecipe); + mEnchantmentsAdded = aEnchantmentsAdded; + mEnchantmentLevelsAdded = aEnchantmentLevelsAdded; + mRemovableByGT = aRemovableByGT; + mKeepingNBT = aKeepingNBT; + } + + @Override + public boolean matches(InventoryCrafting aGrid, World aWorld) { + if (mKeepingNBT) { + ItemStack tStack = null; + for (int i = 0; i < aGrid.getSizeInventory(); i++) { + if (aGrid.getStackInSlot(i) != null) { + if (tStack != null) { + if ((tStack.hasTagCompound() != aGrid.getStackInSlot(i) + .hasTagCompound()) || (tStack.hasTagCompound() + && !tStack.getTagCompound() + .equals( + aGrid.getStackInSlot(i) + .getTagCompound()))) + return false; + } + tStack = aGrid.getStackInSlot(i); + } + } + } + return super.matches(aGrid, aWorld); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting aGrid) { + ItemStack rStack = super.getCraftingResult(aGrid); + if (rStack != null) { + // Update the Stack + GTUtility.updateItemStack(rStack); + + // Keeping NBT + if (mKeepingNBT) for (int i = 0; i < aGrid.getSizeInventory(); i++) { + if (aGrid.getStackInSlot(i) != null && aGrid.getStackInSlot(i) + .hasTagCompound()) { + rStack.setTagCompound( + (NBTTagCompound) aGrid.getStackInSlot(i) + .getTagCompound() + .copy()); + break; + } + } + + // Charge Values + if (GTModHandler.isElectricItem(rStack)) { + GTModHandler.dischargeElectricItem(rStack, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false, true); + int tCharge = 0; + for (int i = 0; i < aGrid.getSizeInventory(); i++) tCharge += GTModHandler.dischargeElectricItem( + aGrid.getStackInSlot(i), + Integer.MAX_VALUE, + Integer.MAX_VALUE, + true, + true, + true); + if (tCharge > 0) GTModHandler.chargeElectricItem(rStack, tCharge, Integer.MAX_VALUE, true, false); + } + + // Add Enchantments + for (int i = 0; i < mEnchantmentsAdded.length; i++) GTUtility.ItemNBT.addEnchantment( + rStack, + mEnchantmentsAdded[i], + EnchantmentHelper.getEnchantmentLevel(mEnchantmentsAdded[i].effectId, rStack) + + mEnchantmentLevelsAdded[i]); + + // Update the Stack again + GTUtility.updateItemStack(rStack); + } + return rStack; + } + + @Override + public boolean isRemovable() { + return mRemovableByGT; + } +} diff --git a/src/main/java/gregtech/api/util/GTSpawnEventHandler.java b/src/main/java/gregtech/api/util/GTSpawnEventHandler.java new file mode 100644 index 0000000000..2e86fef136 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTSpawnEventHandler.java @@ -0,0 +1,81 @@ +package gregtech.api.util; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.LivingSpawnEvent.CheckSpawn; + +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import gregtech.api.enums.GTValues; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.common.tileentities.machines.basic.MTEMonsterRepellent; + +public class GTSpawnEventHandler { + + public static volatile List mobReps = new CopyOnWriteArrayList<>(); + // Future Optimiztation ideas, if this isn't sufficient + // 1: Keep a weakref list of mob repellents so we already have the tile + // 2: Have the tick method update a HashMap of (int[], range) so we don't have to load the tile at all + + public GTSpawnEventHandler() { + MinecraftForge.EVENT_BUS.register(this); + } + + // Range of a powered repellent + public static int getPoweredRepellentRange(int aTier) { + return 16 + (48 * aTier); + } + + // Range of an unpowered repellent + public static int getUnpoweredRepellentRange(int aTier) { + return 4 + (12 * aTier); + } + + @SubscribeEvent + public void denyMobSpawn(CheckSpawn event) { + if (event.getResult() == Event.Result.DENY) return; + + if (event.entityLiving instanceof EntitySlime slime && !slime.hasCustomNameTag() + && event.getResult() == Event.Result.ALLOW) { + event.setResult(Event.Result.DEFAULT); + } + + if (event.getResult() == Event.Result.ALLOW) { + return; + } + + if (event.entityLiving.isCreatureType(EnumCreatureType.monster, false)) { + final double maxRangeCheck = Math.pow(getPoweredRepellentRange(GTValues.V.length - 1), 2); + for (int[] rep : mobReps) { + if (rep[3] == event.entity.worldObj.provider.dimensionId) { + // If the chunk isn't loaded, we ignore this Repellent + if (!event.entity.worldObj.blockExists(rep[0], rep[1], rep[2])) continue; + final double dx = rep[0] + 0.5F - event.entity.posX; + final double dy = rep[1] + 0.5F - event.entity.posY; + final double dz = rep[2] + 0.5F - event.entity.posZ; + + final double check = (dx * dx + dz * dz + dy * dy); + // Fail early if outside of max range + if (check > maxRangeCheck) continue; + + final TileEntity tTile = event.entity.worldObj.getTileEntity(rep[0], rep[1], rep[2]); + if (tTile instanceof BaseMetaTileEntity metaTile + && metaTile.getMetaTileEntity() instanceof MTEMonsterRepellent repellent + && check <= Math.pow(repellent.mRange, 2)) { + if (event.entityLiving instanceof EntitySlime slime) { + slime.setCustomNameTag("DoNotSpawnSlimes"); + } + event.setResult(Event.Result.DENY); + // We're already DENYing it. No reason to keep checking + return; + } + } + } + } + } +} diff --git a/src/main/java/gregtech/api/util/GTStreamUtil.java b/src/main/java/gregtech/api/util/GTStreamUtil.java new file mode 100644 index 0000000000..4b71fe5ee8 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTStreamUtil.java @@ -0,0 +1,44 @@ +package gregtech.api.util; + +import java.util.Arrays; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public final class GTStreamUtil { + + /** + * Backport of {@link Stream#ofNullable}. + */ + public static Stream ofNullable(@Nullable T value) { + return value == null ? Stream.empty() : Stream.of(value); + } + + /** + * Returns a sequential ordered {@code Stream} whose elements are the specified values, + * if {@code condition} is true, otherwise returns an empty {@code Stream}. + * + * @param the type of stream elements + * @param values the elements of the new stream + * @return the new stream + */ + public static Stream ofConditional(boolean condition, T[] values) { + return condition ? Arrays.stream(values) : Stream.empty(); + } + + /** + * Returns a sequential {@code Stream} containing a single element, which will be lazily evaluated from supplier. + * + * @param the type of stream elements + * @param supplier the supplier for single stream element + * @return the new stream + */ + public static Stream ofSupplier(Supplier supplier) { + return Stream.generate(supplier) + .limit(1); + } +} diff --git a/src/main/java/gregtech/api/util/GTStructureUtility.java b/src/main/java/gregtech/api/util/GTStructureUtility.java new file mode 100644 index 0000000000..2109a7e75b --- /dev/null +++ b/src/main/java/gregtech/api/util/GTStructureUtility.java @@ -0,0 +1,616 @@ +package gregtech.api.util; + +import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.ACCEPT; +import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.ACCEPT_STOP; +import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.REJECT; +import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.SKIP; +import static com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode.EXACT; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.structure.IStructureElementNoPlacement; +import com.gtnewhorizon.structurelib.util.ItemStackPredicate; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IHeatingCoil; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; +import gregtech.common.blocks.BlockCasings5; +import gregtech.common.blocks.BlockCyclotronCoils; +import gregtech.common.blocks.BlockFrameBox; +import gregtech.common.blocks.ItemMachines; + +public class GTStructureUtility { + + // private static final Map, String> customNames = new HashMap<>(); + private GTStructureUtility() { + throw new AssertionError("Not instantiable"); + } + + public static boolean hasMTE(IGregTechTileEntity aTile, Class clazz) { + return aTile != null && clazz.isInstance(aTile.getMetaTileEntity()); + } + + public static IStructureElementNoPlacement ofHatchAdder(IGTHatchAdder aHatchAdder, int aTextureIndex, + int aDots) { + return ofHatchAdder(aHatchAdder, aTextureIndex, StructureLibAPI.getBlockHint(), aDots - 1); + } + + public static IStructureElement ofFrame(Materials aFrameMaterial) { + if (aFrameMaterial == null) throw new IllegalArgumentException(); + return new IStructureElement<>() { + + private IIcon[] mIcons; + + @Override + public boolean check(T t, World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + if (block instanceof BlockFrameBox frameBox) { + int meta = world.getBlockMetadata(x, y, z); + Materials material = frameBox.getMaterial(meta); + return aFrameMaterial == material; + } + return false; + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + if (mIcons == null) { + mIcons = new IIcon[6]; + Arrays.fill(mIcons, aFrameMaterial.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon()); + } + StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, aFrameMaterial.mRGBa); + return true; + } + + @Override + public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { + ItemStack tFrameStack = getFrameStack(); + if (!GTUtility.isStackValid(tFrameStack) + || !(tFrameStack.getItem() instanceof ItemBlock tFrameStackItem)) return false; + return tFrameStackItem + .placeBlockAt(tFrameStack, null, world, x, y, z, 6, 0, 0, 0, Items.feather.getDamage(tFrameStack)); + } + + private ItemStack getFrameStack() { + return GTOreDictUnificator.get(OrePrefixes.frameGt, aFrameMaterial, 1); + } + + @Override + public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + ItemStack tFrameStack = getFrameStack(); + if (!GTUtility.isStackValid(tFrameStack) || !(tFrameStack.getItem() instanceof ItemBlock)) + return BlocksToPlace.errored; + return BlocksToPlace.create(tFrameStack); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + IItemSource s, EntityPlayerMP actor, Consumer chatter) { + return survivalPlaceBlock( + t, + world, + x, + y, + z, + trigger, + AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + if (check(t, world, x, y, z)) return SKIP; + ItemStack tFrameStack = getFrameStack(); + if (!GTUtility.isStackValid(tFrameStack) || !(tFrameStack.getItem() instanceof ItemBlock)) + return REJECT; // honestly, this is more like a programming error or pack issue + return com.gtnewhorizon.structurelib.structure.StructureUtility.survivalPlaceBlock( + tFrameStack, + ItemStackPredicate.NBTMode.IGNORE_KNOWN_INSIGNIFICANT_TAGS, + null, + false, + world, + x, + y, + z, + env.getSource(), + env.getActor(), + env.getChatter()); + } + }; + } + + public static HatchElementBuilder buildHatchAdder() { + return HatchElementBuilder.builder(); + } + + /** + * Completely equivalent to {@link #buildHatchAdder()}, except it plays nicer with type inference when statically + * imported + */ + public static HatchElementBuilder buildHatchAdder(Class typeToken) { + return HatchElementBuilder.builder(); + } + + public static IStructureElementNoPlacement ofHatchAdder(IGTHatchAdder aHatchAdder, int aTextureIndex, + Block aHintBlock, int aHintMeta) { + if (aHatchAdder == null || aHintBlock == null) { + throw new IllegalArgumentException(); + } + return new IStructureElementNoPlacement<>() { + + @Override + public boolean check(T t, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity + && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); + return true; + } + }; + } + + public static IStructureElement ofHatchAdder(IGTHatchAdder aHatchAdder, int aTextureIndex, + Block aHintBlock, int aHintMeta, BiPredicate shouldSkip, + Function> aMetaId, final IStructureElement.PlaceResult acceptType) { + if (aHatchAdder == null) { + throw new IllegalArgumentException(); + } + return new IStructureElement<>() { + + @Override + public boolean check(T t, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity + && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); + return true; + } + + @Override + public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) { + // TODO + return false; + } + + @Override + public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + Class clazz = aMetaId.apply(t); + if (clazz == null) return BlocksToPlace.createEmpty(); + return BlocksToPlace.create(is -> clazz.isInstance(ItemMachines.getMetaTileEntity(is))); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + IItemSource s, EntityPlayerMP actor, Consumer chatter) { + return survivalPlaceBlock( + t, + world, + x, + y, + z, + trigger, + AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + if (shouldSkip != null) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IGregTechTileEntity + && shouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return SKIP; + } + if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return REJECT; + Class clazz = aMetaId.apply(t); + if (clazz == null) return REJECT; + ItemStack taken = env.getSource() + .takeOne(is -> clazz.isInstance(ItemMachines.getMetaTileEntity(is)), true); + if (GTUtility.isStackInvalid(taken)) { + env.getChatter() + .accept( + new ChatComponentTranslation( + "GT5U.autoplace.error.no_mte.class_name", + clazz.getSimpleName())); + return REJECT; + } + if (com.gtnewhorizon.structurelib.structure.StructureUtility + .survivalPlaceBlock(taken, EXACT, null, true, world, x, y, z, env.getSource(), env.getActor()) + == ACCEPT) return acceptType; + return REJECT; + } + }; + } + + public static IStructureElement ofHatchAdder(IGTHatchAdder aHatchAdder, int aTextureIndex, + Block aHintBlock, int aHintMeta, BiPredicate shouldSkip, ToIntFunction aMetaId) { + if (aHatchAdder == null) { + throw new IllegalArgumentException(); + } + return new IStructureElement<>() { + + @Override + public boolean check(T t, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity + && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); + return true; + } + + @Override + public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) { + // TODO + return false; + } + + @Override + public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + ItemMachines item = (ItemMachines) Item.getItemFromBlock(GregTechAPI.sBlockMachines); + int meta = aMetaId.applyAsInt(t); + if (meta < 0) return BlocksToPlace.createEmpty(); + return BlocksToPlace.create( + ItemStackPredicate.from(item) + .setMeta(meta)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + IItemSource s, EntityPlayerMP actor, Consumer chatter) { + return survivalPlaceBlock( + t, + world, + x, + y, + z, + trigger, + AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + if (shouldSkip != null) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IGregTechTileEntity + && shouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return SKIP; + } + if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return REJECT; + ItemMachines item = (ItemMachines) Item.getItemFromBlock(GregTechAPI.sBlockMachines); + int meta = aMetaId.applyAsInt(t); + if (meta < 0) return REJECT; + ItemStack taken = env.getSource() + .takeOne( + ItemStackPredicate.from(item) + .setMeta(meta), + true); + if (GTUtility.isStackInvalid(taken)) { + env.getChatter() + .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_mte.id", meta)); + return REJECT; + } + return com.gtnewhorizon.structurelib.structure.StructureUtility + .survivalPlaceBlock(taken, EXACT, null, true, world, x, y, z, env.getSource(), env.getActor()) + == ACCEPT ? ACCEPT_STOP : REJECT; + } + }; + } + + public static IStructureElement ofHatchAdderOptional(IGTHatchAdder aHatchAdder, int textureIndex, + int dots, Block placeCasing, int placeCasingMeta) { + return ofHatchAdderOptional( + aHatchAdder, + textureIndex, + StructureLibAPI.getBlockHint(), + dots - 1, + placeCasing, + placeCasingMeta); + } + + public static IStructureElement ofHatchAdderOptional(IGTHatchAdder aHatchAdder, int aTextureIndex, + Block aHintBlock, int hintMeta, Block placeCasing, int placeCasingMeta) { + if (aHatchAdder == null || aHintBlock == null) { + throw new IllegalArgumentException(); + } + return new IStructureElement<>() { + + @Override + public boolean check(T t, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + Block worldBlock = world.getBlock(x, y, z); + return (tileEntity instanceof IGregTechTileEntity + && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex)) + || (worldBlock == placeCasing && worldBlock.getDamageValue(world, x, y, z) == placeCasingMeta); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, hintMeta); + return true; + } + + @Override + public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { + world.setBlock(x, y, z, placeCasing, placeCasingMeta, 2); + return true; + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + IItemSource s, EntityPlayerMP actor, Consumer chatter) { + if (check(t, world, x, y, z)) return SKIP; + return com.gtnewhorizon.structurelib.structure.StructureUtility + .survivalPlaceBlock(placeCasing, placeCasingMeta, world, x, y, z, s, actor, chatter); + } + }; + } + + /** + * Assume all coils accepted. + * + * @see #ofCoil(BiPredicate, Function) + */ + public static IStructureElement ofCoil(BiConsumer aHeatingCoilSetter, + Function aHeatingCoilGetter) { + return ofCoil((t, l) -> { + aHeatingCoilSetter.accept(t, l); + return true; + }, aHeatingCoilGetter); + } + + /** + * Heating coil structure element. + * + * @param aHeatingCoilSetter Notify the controller of this new coil. Got called exactly once per coil. Might be + * called less times if structure test fails. If the setter returns false then it assumes + * the coil is rejected. + * @param aHeatingCoilGetter Get the current heating level. Null means no coil recorded yet. + */ + public static IStructureElement ofCoil(BiPredicate aHeatingCoilSetter, + Function aHeatingCoilGetter) { + if (aHeatingCoilSetter == null || aHeatingCoilGetter == null) { + throw new IllegalArgumentException(); + } + return new IStructureElement<>() { + + @Override + public boolean check(T t, World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + if (!(block instanceof IHeatingCoil)) return false; + HeatingCoilLevel existingLevel = aHeatingCoilGetter.apply(t), + newLevel = ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)); + if (existingLevel == null || existingLevel == HeatingCoilLevel.None) { + return aHeatingCoilSetter.test(t, newLevel); + } else { + return newLevel == existingLevel; + } + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, GregTechAPI.sBlockCasings5, getMetaFromHint(trigger)); + return true; + } + + private int getMetaFromHint(ItemStack trigger) { + return BlockCasings5.getMetaFromCoilHeat(getHeatFromHint(trigger)); + } + + private HeatingCoilLevel getHeatFromHint(ItemStack trigger) { + return HeatingCoilLevel + .getFromTier((byte) Math.min(HeatingCoilLevel.getMaxTier(), Math.max(0, trigger.stackSize - 1))); + } + + @Override + public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { + return world.setBlock(x, y, z, GregTechAPI.sBlockCasings5, getMetaFromHint(trigger), 3); + } + + @Override + public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + return BlocksToPlace.create(GregTechAPI.sBlockCasings5, getMetaFromHint(trigger)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + IItemSource s, EntityPlayerMP actor, Consumer chatter) { + return survivalPlaceBlock( + t, + world, + x, + y, + z, + trigger, + AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + Block block = world.getBlock(x, y, z); + boolean isCoil = block instanceof IHeatingCoil + && ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)) == getHeatFromHint(trigger); + if (isCoil) return SKIP; + return com.gtnewhorizon.structurelib.structure.StructureUtility.survivalPlaceBlock( + GregTechAPI.sBlockCasings5, + getMetaFromHint(trigger), + world, + x, + y, + z, + env.getSource(), + env.getActor(), + env.getChatter()); + } + }; + } + + /** + * Assumes all solenoids are accepted. + * + * @see #ofSolenoidCoil(BiPredicate, Function) + */ + public static IStructureElement ofSolenoidCoil(BiConsumer aSolenoidTierSetter, + Function aSolenoidTierGetter) { + return ofSolenoidCoil((t, l) -> { + aSolenoidTierSetter.accept(t, l); + return true; + }, aSolenoidTierGetter); + } + + /** + * Solenoid coil structure element. + * + * @param aSolenoidTierSetter Notify the controller of this new solenoid. Got called exactly once per solenoid. + * Might be + * called less times if structure test fails. If the setter returns false then it assumes + * the solenoid is rejected. + * @param aSolenoidTierGetter Get the solenoid voltage tier. Null means no tier recorded yet. + */ + public static IStructureElement ofSolenoidCoil(BiPredicate aSolenoidTierSetter, + Function aSolenoidTierGetter) { + if (aSolenoidTierSetter == null || aSolenoidTierGetter == null) { + throw new IllegalArgumentException(); + } + return new IStructureElement<>() { + + @Override + public boolean check(T t, World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + + if (block != GregTechAPI.sSolenoidCoilCasings) return false; + + var coils = ((BlockCyclotronCoils) GregTechAPI.sSolenoidCoilCasings); + + Byte existingLevel = aSolenoidTierGetter.apply(t); + byte newLevel = (byte) (coils.getVoltageTier(world.getBlockMetadata(x, y, z))); + + if (existingLevel == null) { + return aSolenoidTierSetter.test(t, newLevel); + } else { + return newLevel == existingLevel; + } + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI + .hintParticle(world, x, y, z, GregTechAPI.sSolenoidCoilCasings, getMetaFromHint(trigger)); + return true; + } + + private int getMetaFromHint(ItemStack trigger) { + return Math.min(Math.max(trigger.stackSize - 1, 0), 10); + } + + @Override + public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { + return world.setBlock(x, y, z, GregTechAPI.sSolenoidCoilCasings, getMetaFromHint(trigger), 3); + } + + @Override + public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + return BlocksToPlace.create(GregTechAPI.sSolenoidCoilCasings, getMetaFromHint(trigger)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + IItemSource s, EntityPlayerMP actor, Consumer chatter) { + return survivalPlaceBlock( + t, + world, + x, + y, + z, + trigger, + AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + Block block = world.getBlock(x, y, z); + + boolean isCoil = block == GregTechAPI.sSolenoidCoilCasings + && world.getBlockMetadata(x, y, z) == getMetaFromHint(trigger); + + if (isCoil) return SKIP; + + return com.gtnewhorizon.structurelib.structure.StructureUtility.survivalPlaceBlock( + GregTechAPI.sSolenoidCoilCasings, + getMetaFromHint(trigger), + world, + x, + y, + z, + env.getSource(), + env.getActor(), + env.getChatter()); + } + }; + } + + @Nonnull + public static Predicate filterByMTEClass(List> list) { + return is -> { + IMetaTileEntity tile = ItemMachines.getMetaTileEntity(is); + return tile != null && list.stream() + .anyMatch(c -> c.isInstance(tile)); + }; + } + + @Nonnull + public static Predicate filterByMTETier(int aMinTier, int aMaxTier) { + return is -> { + IMetaTileEntity tile = ItemMachines.getMetaTileEntity(is); + return tile instanceof MTETieredMachineBlock && ((MTETieredMachineBlock) tile).mTier <= aMaxTier + && ((MTETieredMachineBlock) tile).mTier >= aMinTier; + }; + } +} diff --git a/src/main/java/gregtech/api/util/GTToolHarvestHelper.java b/src/main/java/gregtech/api/util/GTToolHarvestHelper.java new file mode 100644 index 0000000000..8dd5d6b93c --- /dev/null +++ b/src/main/java/gregtech/api/util/GTToolHarvestHelper.java @@ -0,0 +1,71 @@ +package gregtech.api.util; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; + +import ic2.core.block.BlockMultiID; +import ic2.core.block.BlockScaffold; +import ic2.core.block.machine.BlockMiningPipe; +import ic2.core.block.machine.BlockMiningTip; +import ic2.core.block.wiring.BlockCable; +import ic2.core.crop.BlockCrop; + +public class GTToolHarvestHelper { + + public static boolean isAppropriateTool(Block aBlock, byte aMetaData, String... tTools) { + + if (aBlock == null || tTools == null) { + return false; + } + String targetTool = aBlock.getHarvestTool(aMetaData); + return !isStringEmpty(targetTool) && isArrayContains(targetTool, tTools); + } + + public static boolean isAppropriateMaterial(Block aBlock, Material... tMats) { + if (aBlock == null || tMats == null) { + return false; + } + return isArrayContains(aBlock.getMaterial(), tMats); + } + + public static boolean isSpecialBlock(Block aBlock, Block... tBlocks) { + if (aBlock == null || tBlocks == null) { + return false; + } + return isArrayContains(aBlock, tBlocks); + } + + public static boolean isArrayContains(T obj, T[] list) { + + if (obj == null || list == null) { + return false; + } + + for (T iObj : list) { + if (obj == iObj || obj.equals(iObj)) { + return true; + } + } + return false; + } + + public static boolean isStringEmpty(String s) { + return s == null || s.isEmpty(); + } + + public static boolean isIC2Wrenchable(Block block) { + return (block instanceof BlockMultiID && !(block instanceof BlockCable) && !(block instanceof BlockCrop)) + || block instanceof BlockScaffold + || block instanceof BlockMiningPipe + || block instanceof BlockMiningTip; + } + + public static boolean hasNull(Object... obj) { + for (Object iObj : obj) { + if (iObj == null) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/gregtech/api/util/GTTooltipDataCache.java b/src/main/java/gregtech/api/util/GTTooltipDataCache.java new file mode 100644 index 0000000000..a26f7a84d8 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTTooltipDataCache.java @@ -0,0 +1,104 @@ +package gregtech.api.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.util.StatCollector; + +import gregtech.GTMod; + +public class GTTooltipDataCache { + + public static class TooltipData { + + public List text; + public List shiftText; + + public TooltipData(List text, List shiftText) { + this.text = text; + this.shiftText = shiftText; + } + } + + private final Map fetchedTooltipData = new HashMap<>(); + + /** + * Returns tooltip data respecting the user's configured verbosity levels, applying any formatting arguments. + * + * @param key the key to lookup + * @param args arguments for string formatting (prefer using positional arguments) + * @return The tooltip data the user asked for + */ + public TooltipData getData(String key, Object... args) { + TooltipData tooltipData = fetchedTooltipData.get(key); + if (tooltipData == null) { + tooltipData = getUncachedTooltipData(key, args); + fetchedTooltipData.put(key, tooltipData); + } + return tooltipData; + } + + /** + * Builds tooltip data respecting the user's configured verbosity levels, applying any formatting arguments. + * + * @param key the key to lookup + * @param args arguments for string formatting (prefer using positional arguments) + * @return The tooltip data the user asked for + */ + public TooltipData getUncachedTooltipData(String key, Object... args) { + List lines = getAllLines(key, args); + int normalLines = lines.size(); + if (Math.max(GTMod.gregtechproxy.mTooltipVerbosity, GTMod.gregtechproxy.mTooltipShiftVerbosity) >= 3) { + lines.addAll(getAllLines(key + ".extended", args)); // Are extended lines enabled? If so add them to the + // lines + } + if (lines.size() == 0) { + lines.add(key); // Fallback in case no lines could be found at all + } + return new TooltipData( + lines.subList(0, getVerbosityIndex(GTMod.gregtechproxy.mTooltipVerbosity, normalLines, lines.size())), + lines.subList(0, getVerbosityIndex(GTMod.gregtechproxy.mTooltipShiftVerbosity, normalLines, lines.size()))); + } + + /** + * Gets all the lines for the given key and every other subsequent consecutive key with a .n suffix, n in {1,2,3...} + * + * @param key the key to lookup + * @param args arguments for string formatting (prefer using positional arguments) + * @return The lines for the key and all of it's subkeys + */ + private List getAllLines(String key, Object... args) { + List lines = new ArrayList<>(); + String keyToLookup = key; + int i = 1; // First loop has no .number postfix + while (StatCollector.canTranslate(keyToLookup)) { + lines.add(StatCollector.translateToLocalFormatted(keyToLookup, args)); + keyToLookup = key + "." + i++; + } + return lines; + } + + /** + * Determines how many lines from a tooltip to include from the full line list to respect a given verbosity level. + * + * @param tooltipVerbosity the verbosity level we're applying + * @param defaultIndex return if tooltipVerbosity is 2 + * @param maxIndex return if tooltipVerbosity is greater than 2 + * @return verbosity appropriate index + */ + private static int getVerbosityIndex(int tooltipVerbosity, int defaultIndex, int maxIndex) { + int index; + if (tooltipVerbosity < 1) { + index = 0; + } else if (tooltipVerbosity == 1) { + index = 1; + } else if (tooltipVerbosity == 2) { + index = defaultIndex; + } else { + index = maxIndex; + } + return index; + } +} diff --git a/src/main/java/gregtech/api/util/GTUtil.java b/src/main/java/gregtech/api/util/GTUtil.java new file mode 100644 index 0000000000..db2a628bbe --- /dev/null +++ b/src/main/java/gregtech/api/util/GTUtil.java @@ -0,0 +1,344 @@ +package gregtech.api.util; + +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.Tuple; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.util.Constants; + +import gregtech.api.enums.ItemList; +import gregtech.api.interfaces.IDataCopyable; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +import gregtech.api.multitileentity.interfaces.IMultiTileEntity; +import gregtech.common.items.behaviors.BehaviourDataOrb; + +public class GTUtil { + + // Last broken tile entity + public static final ThreadLocal LAST_BROKEN_TILEENTITY = new ThreadLocal<>(); + + public static Tuple tuple(String key, Object value) { + return new Tuple(key, value); + } + + public static NBTTagCompound fuseNBT(NBTTagCompound nbt1, NBTTagCompound nbt2) { + if (nbt1 == null) return nbt2 == null ? new NBTTagCompound() : (NBTTagCompound) nbt2.copy(); + final NBTTagCompound rNBT = (NBTTagCompound) nbt1.copy(); + if (nbt2 == null) return rNBT; + for (Object tKey : nbt2.func_150296_c /* getKeySet */()) + if (!rNBT.hasKey(tKey.toString())) rNBT.setTag(tKey.toString(), nbt2.getTag(tKey.toString())); + return rNBT; + } + + /** + * Construct a NBTTagCompound from a series of key, value pairs. Inspired from GT6. + */ + public static NBTTagCompound makeNBT(Tuple... tags) { + final NBTTagCompound nbt = new NBTTagCompound(); + for (Tuple t : tags) { + if (t.getSecond() == null) continue; + + if (t.getSecond() instanceof Boolean) nbt.setBoolean( + t.getFirst() + .toString(), + (Boolean) t.getSecond()); + else if (t.getSecond() instanceof Byte) nbt.setByte( + t.getFirst() + .toString(), + (Byte) t.getSecond()); + else if (t.getSecond() instanceof Short) nbt.setShort( + t.getFirst() + .toString(), + (Short) t.getSecond()); + else if (t.getSecond() instanceof Integer) nbt.setInteger( + t.getFirst() + .toString(), + (Integer) t.getSecond()); + else if (t.getSecond() instanceof Long) nbt.setLong( + t.getFirst() + .toString(), + (Long) t.getSecond()); + else if (t.getSecond() instanceof Float) nbt.setFloat( + t.getFirst() + .toString(), + (Float) t.getSecond()); + else if (t.getSecond() instanceof Double) nbt.setDouble( + t.getFirst() + .toString(), + (Double) t.getSecond()); + else if (t.getSecond() instanceof String) nbt.setString( + t.getFirst() + .toString(), + (String) t.getSecond()); + else if (t.getSecond() instanceof NBTBase) nbt.setTag( + t.getFirst() + .toString(), + (NBTBase) t.getSecond()); + else nbt.setString( + t.getFirst() + .toString(), + t.getSecond() + .toString()); + } + + return nbt; + } + + /** + * Get a TileEntity + */ + public static TileEntity getTileEntity(World world, int x, int y, int z, boolean aLoadUnloadedChunks) { + if (aLoadUnloadedChunks || world.blockExists(x, y, z)) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IMultiTileEntity && ((IMultiTileEntity) tileEntity).isDead()) return null; + if (tileEntity != null) return tileEntity; + tileEntity = LAST_BROKEN_TILEENTITY.get(); + if (tileEntity != null && tileEntity.xCoord == x && tileEntity.yCoord == y && tileEntity.zCoord == z) + return tileEntity; + } + return null; + } + + /** + * Sets the TileEntity at the passed position, with the option of turning adjacent TileEntity updates off. + */ + public static TileEntity setTileEntity(World world, int x, int y, int z, TileEntity aTileEntity, + boolean aCauseTileEntityUpdates) { + if (aCauseTileEntityUpdates) world.setTileEntity(x, y, z, aTileEntity); + else { + final Chunk tChunk = world.getChunkFromChunkCoords(x >> 4, z >> 4); + if (tChunk != null) { + world.addTileEntity(aTileEntity); + tChunk.func_150812_a /* setBlockTileEntityInChunk */(x & 15, y, z & 15, aTileEntity); + tChunk.setChunkModified(); + } + } + return aTileEntity; + } + + public static boolean setBlock(World world, int x, int y, int z, Block block, short aMeta, long aFlags, + boolean aRemoveGrassBelow) { + if (aRemoveGrassBelow) { + final Block blockBelow = world.getBlock(x, y - 1, z); + if (blockBelow == Blocks.grass || blockBelow == Blocks.mycelium) + world.setBlock(x, y - 1, z, Blocks.dirt, 0, (byte) aFlags); + } + return world.setBlock(x, y, z, block, aMeta, (byte) aFlags); + } + + public static TileEntity getTileEntity(World world, ChunkCoordinates coords, boolean loadUnloadedChunks) { + return getTileEntity(world, coords.posX, coords.posY, coords.posZ, loadUnloadedChunks); + } + + /** + * Marks a Chunk dirty so it is saved + */ + public static boolean markChunkDirty(World world, int x, int z) { + if (world == null || world.isRemote) return false; + Chunk aChunk = world.getChunkFromBlockCoords(x, z); + if (aChunk == null) { + world.getBlockMetadata(x, 0, z); + aChunk = world.getChunkFromBlockCoords(x, z); + if (aChunk == null) { + GTLog.err.println( + "Some important Chunk does not exist for some reason at Coordinates X: " + x + " and Z: " + z); + return false; + } + } + aChunk.setChunkModified(); + return true; + } + + /** + * Marks a Chunk dirty so it is saved + */ + public static boolean markChunkDirty(Object maybeTile) { + return maybeTile instanceof TileEntity tileEntity + && markChunkDirty(tileEntity.getWorldObj(), tileEntity.xCoord, tileEntity.zCoord); + } + + public static int mixRGBInt(int aRGB1, int aRGB2) { + return getRGBInt( + new short[] { (short) ((getR(aRGB1) + getR(aRGB2)) >> 1), (short) ((getG(aRGB1) + getG(aRGB2)) >> 1), + (short) ((getB(aRGB1) + getB(aRGB2)) >> 1) }); + } + + public static int getRGBInt(short[] aColors) { + return aColors == null ? 16777215 : (aColors[0] << 16) | (aColors[1] << 8) | aColors[2]; + } + + public static int getRGBaInt(short[] aColors) { + return aColors == null ? 16777215 : (aColors[0]) << 16 | (aColors[1] << 8) | aColors[2] | (aColors[3] << 24); + } + + public static String toHexString(short[] aColors) { + return aColors == null ? "FFFFFF" : Integer.toHexString((aColors[0] << 16) | (aColors[1] << 8) | aColors[2]); + } + + public static int getRGBInt(short aR, short aG, short aB) { + return (aR << 16) | (aG << 8) | aB; + } + + public static int getRGBaInt(short aR, short aG, short aB, short aA) { + return (aR << 16) | (aG << 8) | aB | (aA << 24); + } + + public static short[] getRGBaArray(int aColors) { + return new short[] { (short) ((aColors >>> 16) & 255), (short) ((aColors >>> 8) & 255), (short) (aColors & 255), + (short) ((aColors >>> 24) & 255) }; + } + + public static short getR(int aColors) { + return (short) ((aColors >>> 16) & 255); + } + + public static short getG(int aColors) { + return (short) ((aColors >>> 8) & 255); + } + + public static short getB(int aColors) { + return (short) (aColors & 255); + } + + public static short getA(int aColors) { + return (short) ((aColors >>> 24) & 255); + } + + public static boolean saveMultiblockInputConfiguration(MTEMultiBlockBase controller, EntityPlayer player) { + NBTTagCompound newTag = new NBTTagCompound(); + ItemStack dataOrb = player.getHeldItem(); + if (GTUtility.isStackInvalid(dataOrb) || !ItemList.Tool_DataOrb.isStackEqual(dataOrb, false, true)) { + return false; + } + if (!controller.saveOtherHatchConfiguration(player)) { + return false; + } + newTag.setString("type", "MultiblockConfiguration"); + int count = 0; + NBTTagList list = saveConfigurationToDataStick(player, controller.mInputBusses); + if (list == null) return false; + newTag.setTag("mInputBusses", list); + count += list.tagCount(); + list = saveConfigurationToDataStick(player, controller.mInputHatches); + if (list == null) return false; + newTag.setTag("mInputHatches", list); + count += list.tagCount(); + list = saveConfigurationToDataStick(player, controller.mOutputBusses); + if (list == null) return false; + newTag.setTag("mOutputBusses", list); + count += list.tagCount(); + // Output hatch config currently cannot be copied, so we omit this part for now + // TODO this doesn't work for now + // newTag.setTag("mDualInputHatches", saveToDataStick(player, controller.mDualInputHatches)); + dataOrb.setTagCompound(newTag); + BehaviourDataOrb.setDataTitle(dataOrb, "Multiblock Hatch Configuration"); + BehaviourDataOrb.setDataName(dataOrb, String.format("%s configuration saved", count)); + return true; + } + + public static boolean hasMultiblockInputConfiguration(ItemStack dataOrb) { + return !GTUtility.isStackInvalid(dataOrb) && ItemList.Tool_DataOrb.isStackEqual(dataOrb, false, true) + && dataOrb.getTagCompound() != null + && "MultiblockConfiguration".equals( + dataOrb.getTagCompound() + .getString("type")); + } + + public static boolean loadMultiblockInputConfiguration(MTEMultiBlockBase controller, EntityPlayer player) { + ItemStack dataOrb = player.getHeldItem(); + if (!hasMultiblockInputConfiguration(dataOrb)) { + return false; + } + if (!controller.loadOtherHatchConfiguration(player)) { + return false; + } + NBTTagCompound tag = dataOrb.getTagCompound(); + if (!checkCanLoadConfigurationFromDataStick( + tag.getTagList("mInputBusses", Constants.NBT.TAG_COMPOUND), + player, + controller.mInputBusses) + || !checkCanLoadConfigurationFromDataStick( + tag.getTagList("mInputHatches", Constants.NBT.TAG_COMPOUND), + player, + controller.mInputHatches) + || !checkCanLoadConfigurationFromDataStick( + tag.getTagList("mOutputBusses", Constants.NBT.TAG_COMPOUND), + player, + controller.mOutputBusses)) + return false; + + if (!loadConfigurationFromDataStick( + tag.getTagList("mInputBusses", Constants.NBT.TAG_COMPOUND), + player, + controller.mInputBusses)) return false; + if (!loadConfigurationFromDataStick( + tag.getTagList("mInputHatches", Constants.NBT.TAG_COMPOUND), + player, + controller.mInputHatches)) return false; + if (!loadConfigurationFromDataStick( + tag.getTagList("mOutputBusses", Constants.NBT.TAG_COMPOUND), + player, + controller.mOutputBusses)) return false; + return true; + } + + private static NBTTagList saveConfigurationToDataStick(EntityPlayer player, List hatches) { + NBTTagList list = new NBTTagList(); + for (MTEHatch tHatch : filterValidMTEs(hatches)) { + if (!(tHatch instanceof IDataCopyable copyable)) { + list.appendTag(new NBTTagCompound()); + continue; + } + NBTTagCompound tag = copyable.getCopiedData(player); + if (tag == null) return null; + list.appendTag(tag); + } + return list; + } + + private static boolean loadConfigurationFromDataStick(NBTTagList list, EntityPlayer player, + List hatches) { + if (list == null || list.tagList.isEmpty()) return false; + List validMTEs = filterValidMTEs(hatches); + int end = Math.min(validMTEs.size(), list.tagCount()); + for (int i = 0; i < end; i++) { + MTEHatch tHatch = validMTEs.get(i); + NBTTagCompound tag = list.getCompoundTagAt(i); + if (!(tHatch instanceof IDataCopyable copyable)) { + if (tag.hasNoTags()) continue; + return false; + } + if (tag.hasNoTags()) return false; + if (!copyable.pasteCopiedData(player, tag)) return false; + } + return true; + } + + private static boolean checkCanLoadConfigurationFromDataStick(NBTTagList list, EntityPlayer player, + List hatches) { + if (list == null || list.tagList.isEmpty()) return false; + List validMTEs = filterValidMTEs(hatches); + int end = Math.min(validMTEs.size(), list.tagCount()); + for (int i = 0; i < end; i++) { + MTEHatch tHatch = validMTEs.get(i); + NBTTagCompound tag = list.getCompoundTagAt(i); + if (tag.hasNoTags()) continue; + if (!(tHatch instanceof IDataCopyable copyable) || !copyable.getCopiedDataIdentifier(player) + .equals(tag.getString("type"))) return false; + } + return true; + } +} diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java new file mode 100644 index 0000000000..08a1711b97 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -0,0 +1,4852 @@ +package gregtech.api.util; + +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.GTValues.COMPASS_DIRECTIONS; +import static gregtech.api.enums.GTValues.D1; +import static gregtech.api.enums.GTValues.E; +import static gregtech.api.enums.GTValues.GT; +import static gregtech.api.enums.GTValues.L; +import static gregtech.api.enums.GTValues.M; +import static gregtech.api.enums.GTValues.NW; +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.GTValues.W; +import static gregtech.api.enums.Materials.FLUID_MAP; +import static gregtech.api.enums.Mods.Translocator; +import static gregtech.common.UndergroundOil.undergroundOilReadInformation; +import static net.minecraftforge.common.util.ForgeDirection.DOWN; +import static net.minecraftforge.common.util.ForgeDirection.EAST; +import static net.minecraftforge.common.util.ForgeDirection.NORTH; +import static net.minecraftforge.common.util.ForgeDirection.SOUTH; +import static net.minecraftforge.common.util.ForgeDirection.UNKNOWN; +import static net.minecraftforge.common.util.ForgeDirection.UP; +import static net.minecraftforge.common.util.ForgeDirection.WEST; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.AbstractCollection; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.function.Function; +import java.util.function.IntFunction; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collector; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTBase.NBTPrimitive; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraft.network.play.server.S07PacketRespawn; +import net.minecraft.network.play.server.S1DPacketEntityEffect; +import net.minecraft.network.play.server.S1FPacketSetExperience; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.oredict.OreDictionary; + +import com.google.auto.value.AutoValue; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; +import com.google.common.collect.SetMultimap; +import com.gtnewhorizon.structurelib.alignment.IAlignment; +import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; +import com.mojang.authlib.GameProfile; + +import buildcraft.api.transport.IPipeTile; +import cofh.api.energy.IEnergyReceiver; +import cofh.api.transport.IItemDuct; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.GregTechAPI; +import gregtech.api.damagesources.GTDamageSources; +import gregtech.api.damagesources.GTDamageSources.DamageSourceHotItem; +import gregtech.api.enchants.EnchantmentHazmat; +import gregtech.api.enchants.EnchantmentRadioactivity; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Mods; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.Textures; +import gregtech.api.enums.ToolDictNames; +import gregtech.api.events.BlockScanningEvent; +import gregtech.api.interfaces.IBlockContainer; +import gregtech.api.interfaces.IDebugableBlock; +import gregtech.api.interfaces.IHasIndexedTexture; +import gregtech.api.interfaces.IProjectileItem; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IBasicEnergyContainer; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.interfaces.tileentity.IUpgradableMachine; +import gregtech.api.items.GTGenericItem; +import gregtech.api.items.ItemEnergyArmor; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.net.GTPacketSound; +import gregtech.api.objects.CollectorUtils; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.GTItemStack2; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.threads.RunnableSound; +import gregtech.api.util.extensions.ArrayExt; +import gregtech.common.Pollution; +import gregtech.common.blocks.BlockOresAbstract; +import ic2.api.recipe.IRecipeInput; +import ic2.api.recipe.RecipeInputItemStack; +import ic2.api.recipe.RecipeInputOreDict; +import ic2.api.recipe.RecipeOutput; +import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; +import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + *

+ * Just a few Utility Functions I use. + */ +public class GTUtility { + + /** + * Formats a number with group separator and at most 2 fraction digits. + */ + private static final Map decimalFormatters = new HashMap<>(); + + /** + * Forge screwed the Fluid Registry up again, so I make my own, which is also much more efficient than the stupid + * Stuff over there. + */ + private static final List sFluidContainerList = new ArrayList<>(); + + private static final Map sFilledContainerToData = new /* Concurrent */ HashMap<>(); + private static final Map> sEmptyContainerToFluidToData = new HashMap<>(); + private static final Map> sFluidToContainers = new HashMap<>(); + /** + * Must use {@code Supplier} here because the ore prefixes have not yet been registered at class load time. + */ + private static final Map> sOreToCobble = new HashMap<>(); + + private static final Map sOreTable = new HashMap<>(); + public static boolean TE_CHECK = false, BC_CHECK = false, CHECK_ALL = true, RF_CHECK = false; + public static Map sPlayedSoundMap = new /* Concurrent */ HashMap<>(); + private static int sBookCount = 0; + public static UUID defaultUuid = null; // maybe default non-null? + // UUID.fromString("00000000-0000-0000-0000-000000000000"); + + static { + GregTechAPI.sItemStackMappings.add(sFilledContainerToData); + GregTechAPI.sItemStackMappings.add(sEmptyContainerToFluidToData); + + // 1 is the magic index to get the cobblestone block. + // See: GT_Block_Stones.java, GT_Block_Granites.java + Function> materialToCobble = m -> Suppliers.memoize( + () -> GTOreDictUnificator.getOres(OrePrefixes.stone, m) + .get(1))::get; + sOreToCobble.put(OrePrefixes.oreBlackgranite, materialToCobble.apply(Materials.GraniteBlack)); + sOreToCobble.put(OrePrefixes.oreRedgranite, materialToCobble.apply(Materials.GraniteRed)); + sOreToCobble.put(OrePrefixes.oreMarble, materialToCobble.apply(Materials.Marble)); + sOreToCobble.put(OrePrefixes.oreBasalt, materialToCobble.apply(Materials.Basalt)); + sOreToCobble.put(OrePrefixes.oreNetherrack, () -> new ItemStack(Blocks.netherrack)); + sOreToCobble.put(OrePrefixes.oreEndstone, () -> new ItemStack(Blocks.end_stone)); + } + + public static int safeInt(long number, int margin) { + return number > Integer.MAX_VALUE - margin ? Integer.MAX_VALUE - margin : (int) number; + } + + public static int safeInt(long number) { + return number > V[V.length - 1] ? safeInt(V[V.length - 1], 1) + : number < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) number; + } + + public static Field getPublicField(Object aObject, String aField) { + Field rField = null; + try { + rField = aObject.getClass() + .getDeclaredField(aField); + } catch (Throwable e) { + /* Do nothing */ + } + return rField; + } + + public static Field getField(Object aObject, String aField) { + Field rField = null; + try { + rField = aObject.getClass() + .getDeclaredField(aField); + rField.setAccessible(true); + } catch (Throwable e) { + /* Do nothing */ + } + return rField; + } + + public static Field getField(Class aObject, String aField) { + Field rField = null; + try { + rField = aObject.getDeclaredField(aField); + rField.setAccessible(true); + } catch (Throwable e) { + /* Do nothing */ + } + return rField; + } + + public static Method getMethod(Class aObject, String aMethod, Class... aParameterTypes) { + Method rMethod = null; + try { + rMethod = aObject.getMethod(aMethod, aParameterTypes); + rMethod.setAccessible(true); + } catch (Throwable e) { + /* Do nothing */ + } + return rMethod; + } + + public static Method getMethod(Object aObject, String aMethod, Class... aParameterTypes) { + Method rMethod = null; + try { + rMethod = aObject.getClass() + .getMethod(aMethod, aParameterTypes); + rMethod.setAccessible(true); + } catch (Throwable e) { + /* Do nothing */ + } + return rMethod; + } + + public static Field getField(Object aObject, String aField, boolean aPrivate, boolean aLogErrors) { + try { + Field tField = (aObject instanceof Class) ? ((Class) aObject).getDeclaredField(aField) + : (aObject instanceof String) ? Class.forName((String) aObject) + .getDeclaredField(aField) + : aObject.getClass() + .getDeclaredField(aField); + if (aPrivate) tField.setAccessible(true); + return tField; + } catch (Throwable e) { + if (aLogErrors) e.printStackTrace(GTLog.err); + } + return null; + } + + public static Object getFieldContent(Object aObject, String aField, boolean aPrivate, boolean aLogErrors) { + try { + Field tField = (aObject instanceof Class) ? ((Class) aObject).getDeclaredField(aField) + : (aObject instanceof String) ? Class.forName((String) aObject) + .getDeclaredField(aField) + : aObject.getClass() + .getDeclaredField(aField); + if (aPrivate) tField.setAccessible(true); + return tField.get(aObject instanceof Class || aObject instanceof String ? null : aObject); + } catch (Throwable e) { + if (aLogErrors) e.printStackTrace(GTLog.err); + } + return null; + } + + public static Object callPublicMethod(Object aObject, String aMethod, Object... aParameters) { + return callMethod(aObject, aMethod, false, false, true, aParameters); + } + + public static Object callPrivateMethod(Object aObject, String aMethod, Object... aParameters) { + return callMethod(aObject, aMethod, true, false, true, aParameters); + } + + public static Object callMethod(Object aObject, String aMethod, boolean aPrivate, boolean aUseUpperCasedDataTypes, + boolean aLogErrors, Object... aParameters) { + try { + Class[] tParameterTypes = new Class[aParameters.length]; + for (byte i = 0; i < aParameters.length; i++) { + if (aParameters[i] instanceof Class) { + tParameterTypes[i] = (Class) aParameters[i]; + aParameters[i] = null; + } else { + tParameterTypes[i] = aParameters[i].getClass(); + } + if (!aUseUpperCasedDataTypes) { + if (tParameterTypes[i] == Boolean.class) tParameterTypes[i] = boolean.class; + else if (tParameterTypes[i] == Byte.class) tParameterTypes[i] = byte.class; + else if (tParameterTypes[i] == Short.class) tParameterTypes[i] = short.class; + else if (tParameterTypes[i] == Integer.class) tParameterTypes[i] = int.class; + else if (tParameterTypes[i] == Long.class) tParameterTypes[i] = long.class; + else if (tParameterTypes[i] == Float.class) tParameterTypes[i] = float.class; + else if (tParameterTypes[i] == Double.class) tParameterTypes[i] = double.class; + } + } + + Method tMethod = (aObject instanceof Class) ? ((Class) aObject).getMethod(aMethod, tParameterTypes) + : aObject.getClass() + .getMethod(aMethod, tParameterTypes); + if (aPrivate) tMethod.setAccessible(true); + return tMethod.invoke(aObject, aParameters); + } catch (Throwable e) { + if (aLogErrors) e.printStackTrace(GTLog.err); + } + return null; + } + + public static Object callConstructor(String aClass, int aConstructorIndex, Object aReplacementObject, + boolean aLogErrors, Object... aParameters) { + try { + return callConstructor( + Class.forName(aClass), + aConstructorIndex, + aReplacementObject, + aLogErrors, + aParameters); + } catch (Throwable e) { + if (aLogErrors) e.printStackTrace(GTLog.err); + } + return aReplacementObject; + } + + public static Object callConstructor(Class aClass, int aConstructorIndex, Object aReplacementObject, + boolean aLogErrors, Object... aParameters) { + if (aConstructorIndex < 0) { + try { + for (Constructor tConstructor : aClass.getConstructors()) { + try { + return tConstructor.newInstance(aParameters); + } catch (Throwable ignored) {} + } + } catch (Throwable e) { + if (aLogErrors) e.printStackTrace(GTLog.err); + } + } else { + try { + return aClass.getConstructors()[aConstructorIndex].newInstance(aParameters); + } catch (Throwable e) { + if (aLogErrors) e.printStackTrace(GTLog.err); + } + } + return aReplacementObject; + } + + public static String capitalizeString(String aString) { + if (aString != null && aString.length() > 0) return aString.substring(0, 1) + .toUpperCase() + aString.substring(1); + return E; + } + + public static boolean getPotion(EntityLivingBase aPlayer, int aPotionIndex) { + try { + Field tPotionHashmap = null; + + Field[] fields = EntityLiving.class.getDeclaredFields(); + + for (Field field : fields) { + if (field.getType() == HashMap.class) { + tPotionHashmap = field; + tPotionHashmap.setAccessible(true); + break; + } + } + + if (tPotionHashmap != null) return ((HashMap) tPotionHashmap.get(aPlayer)).get(aPotionIndex) != null; + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + return false; + } + + public static String getClassName(Object aObject) { + if (aObject == null) return "null"; + return aObject.getClass() + .getName() + .substring( + aObject.getClass() + .getName() + .lastIndexOf(".") + 1); + } + + public static void removePotion(EntityLivingBase aPlayer, int aPotionIndex) { + try { + Field tPotionHashmap = null; + + Field[] fields = EntityLiving.class.getDeclaredFields(); + + for (Field field : fields) { + if (field.getType() == HashMap.class) { + tPotionHashmap = field; + tPotionHashmap.setAccessible(true); + break; + } + } + + if (tPotionHashmap != null) ((HashMap) tPotionHashmap.get(aPlayer)).remove(aPotionIndex); + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + } + + public static boolean getFullInvisibility(EntityPlayer aPlayer) { + try { + if (aPlayer.isInvisible()) { + for (int i = 0; i < 4; i++) { + if (aPlayer.inventory.armorInventory[i] != null) { + if (aPlayer.inventory.armorInventory[i].getItem() instanceof ItemEnergyArmor) { + if ((((ItemEnergyArmor) aPlayer.inventory.armorInventory[i].getItem()).mSpecials & 512) + != 0) { + if (GTModHandler.canUseElectricItem(aPlayer.inventory.armorInventory[i], 10000)) { + return true; + } + } + } + } + } + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + return false; + } + + public static ItemStack suckOneItemStackAt(World aWorld, double aX, double aY, double aZ, double aL, double aH, + double aW) { + for (EntityItem tItem : aWorld.getEntitiesWithinAABB( + EntityItem.class, + AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + aL, aY + aH, aZ + aW))) { + if (!tItem.isDead) { + aWorld.removeEntity(tItem); + tItem.setDead(); + return tItem.getEntityItem(); + } + } + return null; + } + + public static byte getOppositeSide(ForgeDirection side) { + return (byte) side.getOpposite() + .ordinal(); + } + + public static byte getTier(long l) { + byte i = -1; + while (++i < V.length) if (l <= V[i]) return i; + return (byte) (V.length - 1); + } + + public static long getAmperageForTier(long voltage, byte tier) { + return ceilDiv(voltage, GTValues.V[tier]); + } + + /** + * Rounds up partial voltage that exceeds tiered voltage, e.g. 4,096 -> 8,192(IV) + */ + public static long roundUpVoltage(long voltage) { + if (voltage > V[V.length - 1]) { + return voltage; + } + return V[GTUtility.getTier(voltage)]; + } + + public static String getColoredTierNameFromVoltage(long voltage) { + return getColoredTierNameFromTier(getTier(voltage)); + } + + public static String getColoredTierNameFromTier(byte tier) { + return GTValues.TIER_COLORS[tier] + GTValues.VN[tier] + EnumChatFormatting.RESET; + } + + /** + * @return e.g. {@code " (LV)"} + */ + @Nonnull + public static String getTierNameWithParentheses(long voltage) { + byte tier = getTier(voltage); + if (tier < 0) { + return ""; + } else if (tier == 0) { + return " (" + GTValues.VN[1] + ")"; + } else if (tier >= GTValues.VN.length - 1) { + return " (MAX+)"; + } + return " (" + GTValues.VN[tier] + ")"; + } + + public static void sendChatToPlayer(EntityPlayer aPlayer, String aChatMessage) { + if (aPlayer instanceof EntityPlayerMP && aChatMessage != null) { + aPlayer.addChatComponentMessage(new ChatComponentText(aChatMessage)); + } + } + + public static void checkAvailabilities() { + if (CHECK_ALL) { + try { + Class tClass = IItemDuct.class; + tClass.getCanonicalName(); + TE_CHECK = true; + } catch (Throwable e) { + /**/ + } + try { + Class tClass = buildcraft.api.transport.IPipeTile.class; + tClass.getCanonicalName(); + BC_CHECK = true; + } catch (Throwable e) { + /**/ + } + try { + Class tClass = cofh.api.energy.IEnergyReceiver.class; + tClass.getCanonicalName(); + RF_CHECK = true; + } catch (Throwable e) { + /**/ + } + CHECK_ALL = false; + } + } + + public static boolean isConnectableNonInventoryPipe(TileEntity tileEntity, ForgeDirection side) { + if (tileEntity == null) return false; + checkAvailabilities(); + if (TE_CHECK && tileEntity instanceof IItemDuct) return true; + if (BC_CHECK && tileEntity instanceof buildcraft.api.transport.IPipeTile pipeTile) + return pipeTile.isPipeConnected(side); + return Translocator.isModLoaded() && tileEntity instanceof codechicken.translocator.TileItemTranslocator; + } + + /** + * Moves Stack from Inv-Slot to Inv-Slot, without checking if its even allowed. + * + * @return the Amount of moved Items + */ + public static byte moveStackIntoPipe(IInventory aTileEntity1, Object aTileEntity2, int[] aGrabSlots, + ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, + byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { + return moveStackIntoPipe( + aTileEntity1, + aTileEntity2, + aGrabSlots, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + true); + } + + /** + * Moves Stack from Inv-Slot to Inv-Slot, without checking if it is even allowed. + * + * @return the Amount of moved Items + */ + public static byte moveStackIntoPipe(IInventory fromInventory, Object toObject, int[] fromSlots, + ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, + byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, + boolean dropItem) { + if (fromInventory == null || aMaxTargetStackSize <= 0 + || aMinTargetStackSize <= 0 + || aMinTargetStackSize > aMaxTargetStackSize + || aMaxMoveAtOnce <= 0 + || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; + if (toObject != null) { + checkAvailabilities(); + if (TE_CHECK && toObject instanceof IItemDuct itemDuct) { + for (final int aGrabSlot : fromSlots) { + if (listContainsItem(aFilter, fromInventory.getStackInSlot(aGrabSlot), true, aInvertFilter)) { + if (isAllowedToTakeFromSlot( + fromInventory, + aGrabSlot, + fromSide, + fromInventory.getStackInSlot(aGrabSlot))) { + if (Math.max(aMinMoveAtOnce, aMinTargetStackSize) + <= fromInventory.getStackInSlot(aGrabSlot).stackSize) { + ItemStack tStack = copyAmount( + Math.min( + fromInventory.getStackInSlot(aGrabSlot).stackSize, + Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)), + fromInventory.getStackInSlot(aGrabSlot)); + ItemStack rStack = itemDuct.insertItem(putSide, copyOrNull(tStack)); + byte tMovedItemCount = (byte) (tStack.stackSize + - (rStack == null ? 0 : rStack.stackSize)); + if (tMovedItemCount >= 1 /* Math.max(aMinMoveAtOnce, aMinTargetStackSize) */) { + fromInventory.decrStackSize(aGrabSlot, tMovedItemCount); + fromInventory.markDirty(); + return tMovedItemCount; + } + } + } + } + } + return 0; + } + if (BC_CHECK && toObject instanceof buildcraft.api.transport.IPipeTile bcPipe) { + for (int fromSlot : fromSlots) { + if (listContainsItem(aFilter, fromInventory.getStackInSlot(fromSlot), true, aInvertFilter)) { + if (isAllowedToTakeFromSlot( + fromInventory, + fromSlot, + fromSide, + fromInventory.getStackInSlot(fromSlot))) { + if (Math.max(aMinMoveAtOnce, aMinTargetStackSize) + <= fromInventory.getStackInSlot(fromSlot).stackSize) { + ItemStack tStack = copyAmount( + Math.min( + fromInventory.getStackInSlot(fromSlot).stackSize, + Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)), + fromInventory.getStackInSlot(fromSlot)); + byte tMovedItemCount = (byte) bcPipe.injectItem(copyOrNull(tStack), false, putSide); + if (tMovedItemCount >= Math.max(aMinMoveAtOnce, aMinTargetStackSize)) { + tMovedItemCount = (byte) (bcPipe + .injectItem(copyAmount(tMovedItemCount, tStack), true, putSide)); + fromInventory.decrStackSize(fromSlot, tMovedItemCount); + fromInventory.markDirty(); + return tMovedItemCount; + } + } + } + } + } + return 0; + } + } + + if (fromInventory instanceof TileEntity fromTileEntity && fromSide != ForgeDirection.UNKNOWN + && fromSide.getOpposite() == ForgeDirection.getOrientation(putSide.ordinal())) { + int tX = fromTileEntity.xCoord + fromSide.offsetX, tY = fromTileEntity.yCoord + fromSide.offsetY, + tZ = fromTileEntity.zCoord + fromSide.offsetZ; + if (!hasBlockHitBox(((TileEntity) fromInventory).getWorldObj(), tX, tY, tZ) && dropItem) { + for (final int fromSlot : fromSlots) { + if (listContainsItem(aFilter, fromInventory.getStackInSlot(fromSlot), true, aInvertFilter)) { + if (isAllowedToTakeFromSlot( + fromInventory, + fromSlot, + fromSide, + fromInventory.getStackInSlot(fromSlot))) { + if (Math.max(aMinMoveAtOnce, aMinTargetStackSize) + <= fromInventory.getStackInSlot(fromSlot).stackSize) { + final ItemStack tStack = copyAmount( + Math.min( + fromInventory.getStackInSlot(fromSlot).stackSize, + Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)), + fromInventory.getStackInSlot(fromSlot)); + final EntityItem tEntity = new EntityItem( + ((TileEntity) fromInventory).getWorldObj(), + tX + 0.5, + tY + 0.5, + tZ + 0.5, + tStack); + tEntity.motionX = tEntity.motionY = tEntity.motionZ = 0; + ((TileEntity) fromInventory).getWorldObj() + .spawnEntityInWorld(tEntity); + assert tStack != null; + fromInventory.decrStackSize(fromSlot, tStack.stackSize); + fromInventory.markDirty(); + return (byte) tStack.stackSize; + } + } + } + } + } + } + return 0; + } + + /** + * Moves Stack from Inv-Slot to Inv-Slot, without checking if its even allowed. (useful for internal Inventory + * Operations) + * + * @return the Amount of moved Items + */ + public static byte moveStackFromSlotAToSlotB(IInventory aTileEntity1, IInventory aTileEntity2, int aGrabFrom, + int aPutTo, byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { + if (aTileEntity1 == null || aTileEntity2 == null + || aMinTargetStackSize <= 0 + || aMinTargetStackSize > aMaxTargetStackSize + || aMaxMoveAtOnce <= 0 + || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; + + ItemStack tStack1 = aTileEntity1.getStackInSlot(aGrabFrom), tStack2 = aTileEntity2.getStackInSlot(aPutTo), + tStack3; + if (tStack1 != null) { + if (tStack2 != null && !areStacksEqual(tStack1, tStack2)) return 0; + tStack3 = copyOrNull(tStack1); + aMaxTargetStackSize = (byte) Math.min( + aMaxTargetStackSize, + Math.min( + tStack3.getMaxStackSize(), + Math.min( + tStack2 == null ? Integer.MAX_VALUE : tStack2.getMaxStackSize(), + aTileEntity2.getInventoryStackLimit()))); + tStack3.stackSize = Math + .min(tStack3.stackSize, aMaxTargetStackSize - (tStack2 == null ? 0 : tStack2.stackSize)); + if (tStack3.stackSize > aMaxMoveAtOnce) tStack3.stackSize = aMaxMoveAtOnce; + if (tStack3.stackSize + (tStack2 == null ? 0 : tStack2.stackSize) + >= Math.min(tStack3.getMaxStackSize(), aMinTargetStackSize) && tStack3.stackSize >= aMinMoveAtOnce) { + tStack3 = aTileEntity1.decrStackSize(aGrabFrom, tStack3.stackSize); + aTileEntity1.markDirty(); + if (tStack3 != null) { + if (tStack2 == null) { + aTileEntity2.setInventorySlotContents(aPutTo, copyOrNull(tStack3)); + } else { + tStack2.stackSize += tStack3.stackSize; + } + aTileEntity2.markDirty(); + return (byte) tStack3.stackSize; + } + } + } + return 0; + } + + public static boolean isAllowedToTakeFromSlot(IInventory aTileEntity, int aSlot, ForgeDirection side, + ItemStack aStack) { + if (side == ForgeDirection.UNKNOWN) { + return Arrays.stream(ForgeDirection.VALID_DIRECTIONS) + .anyMatch(d -> isAllowedToTakeFromSlot(aTileEntity, aSlot, d, aStack)); + } + if (aTileEntity instanceof ISidedInventory sided) return sided.canExtractItem(aSlot, aStack, side.ordinal()); + return true; + } + + public static boolean isAllowedToPutIntoSlot(IInventory aTileEntity, int aSlot, ForgeDirection side, + ItemStack aStack, byte aMaxStackSize) { + ItemStack tStack = aTileEntity.getStackInSlot(aSlot); + if (tStack != null && (!areStacksEqual(tStack, aStack) || tStack.stackSize >= tStack.getMaxStackSize())) + return false; + if (side == ForgeDirection.UNKNOWN) { + return Arrays.stream(ForgeDirection.VALID_DIRECTIONS) + .anyMatch(d -> isAllowedToPutIntoSlot(aTileEntity, aSlot, d, aStack, aMaxStackSize)); + } + if (aTileEntity instanceof ISidedInventory + && !((ISidedInventory) aTileEntity).canInsertItem(aSlot, aStack, side.ordinal())) return false; + return aSlot < aTileEntity.getSizeInventory() && aTileEntity.isItemValidForSlot(aSlot, aStack); + } + + /** + * moves multiple stacks from Inv-Side to Inv-Side + * + * @return the Amount of moved Items + */ + public static int moveMultipleItemStacks(Object aTileEntity1, Object aTileEntity2, ForgeDirection fromSide, + ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, + byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, int aStackAmount) { + if (aTileEntity1 instanceof IInventory) return moveMultipleItemStacks( + (IInventory) aTileEntity1, + aTileEntity2, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aStackAmount, + true); + return 0; + } + + public static int moveMultipleItemStacks(IInventory fromInventory, Object toObject, ForgeDirection fromSide, + ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, + byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, int aMaxStackTransfer, + boolean aDoCheckChests) { + if (fromInventory == null || aMaxTargetStackSize <= 0 + || aMinTargetStackSize <= 0 + || aMaxMoveAtOnce <= 0 + || aMinTargetStackSize > aMaxTargetStackSize + || aMinMoveAtOnce > aMaxMoveAtOnce + || aMaxStackTransfer == 0) return 0; + + // find where to take from + final int[] tGrabSlots = new int[fromInventory.getSizeInventory()]; + int tGrabSlotsSize = 0; + if (fromInventory instanceof ISidedInventory) { + for (int i : ((ISidedInventory) fromInventory).getAccessibleSlotsFromSide(fromSide.ordinal())) { + final ItemStack s = fromInventory.getStackInSlot(i); + if (s == null || !isAllowedToTakeFromSlot(fromInventory, i, fromSide, s) + || s.stackSize < aMinMoveAtOnce + || !listContainsItem(aFilter, s, true, aInvertFilter)) continue; + tGrabSlots[tGrabSlotsSize++] = i; + } + } else { + for (int i = 0; i < tGrabSlots.length; i++) { + ItemStack s = fromInventory.getStackInSlot(i); + if (s == null || s.stackSize < aMinMoveAtOnce || !listContainsItem(aFilter, s, true, aInvertFilter)) + continue; + tGrabSlots[tGrabSlotsSize++] = i; + } + } + + // no source, bail out + if (tGrabSlotsSize == 0) { + // maybe source is a double chest. check it + if (aDoCheckChests && fromInventory instanceof TileEntityChest chest) return moveFromAdjacentChests( + chest, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer); + return 0; + } + + // if target is an inventory, e.g. chest, machine, drawers... + if (toObject instanceof IInventory toInventory) { + + // partially filled slot spare space mapping. + // value is the sum of all spare space left not counting completely empty slot + final HashMap tPutItems = new HashMap<>(toInventory.getSizeInventory()); + // partially filled slot contents + final HashMap> tPutItemStacks = new HashMap<>(toInventory.getSizeInventory()); + // completely empty slots + final List tPutFreeSlots = new ArrayList<>(toInventory.getSizeInventory()); + + // find possible target slots + int[] accessibleSlots = null; + if (toObject instanceof ISidedInventory sided) + accessibleSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal()); + for (int i = 0; i < toInventory.getSizeInventory(); i++) { + int slot = i; + if (accessibleSlots != null) { + if (accessibleSlots.length <= i) break; + slot = accessibleSlots[slot]; + } + ItemStack s = toInventory.getStackInSlot(slot); + if (s == null) { + tPutFreeSlots.add(slot); + } else if ((s.stackSize < s.getMaxStackSize() && s.stackSize < toInventory.getInventoryStackLimit()) + && aMinMoveAtOnce <= s.getMaxStackSize() - s.stackSize + && isAllowedToPutIntoSlot(toInventory, slot, putSide, s, (byte) 64)) { + ItemId sID = ItemId.createNoCopy(s); + tPutItems.merge( + sID, + (Math.min(s.getMaxStackSize(), toInventory.getInventoryStackLimit()) - s.stackSize), + Integer::sum); + tPutItemStacks.computeIfAbsent(sID, k -> new ArrayList<>()) + .add(s); + } + } + + // target completely filled, bail out + if (tPutItems.isEmpty() && tPutFreeSlots.isEmpty()) { + // maybe target is a double chest. check it. + if (aDoCheckChests && toObject instanceof TileEntityChest chest) return moveToAdjacentChests( + fromInventory, + chest, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer); + return 0; + } + + // go over source stacks one by one + int tStacksMoved = 0, tTotalItemsMoved = 0; + for (int j = 0; j < tGrabSlotsSize; j++) { + final int grabSlot = tGrabSlots[j]; + int tMovedItems; + int tStackSize; + do { + tMovedItems = 0; + final ItemStack tGrabStack = fromInventory.getStackInSlot(grabSlot); + if (tGrabStack == null) break; + tStackSize = tGrabStack.stackSize; + final ItemId sID = ItemId.createNoCopy(tGrabStack); + + if (tPutItems.containsKey(sID)) { + // there is a partially filled slot, try merging + final int canPut = Math.min(tPutItems.get(sID), aMaxMoveAtOnce); + if (canPut >= aMinMoveAtOnce) { + final List putStack = tPutItemStacks.get(sID); + if (!putStack.isEmpty()) { + // can move, do merge + int toPut = Math.min(canPut, tStackSize); + tMovedItems = toPut; + for (int i = 0; i < putStack.size(); i++) { + final ItemStack s = putStack.get(i); + final int sToPut = Math.min( + Math.min( + Math.min(toPut, s.getMaxStackSize() - s.stackSize), + toInventory.getInventoryStackLimit() - s.stackSize), + aMaxTargetStackSize - s.stackSize); + if (sToPut <= 0) continue; + if (sToPut < aMinMoveAtOnce) continue; + if (s.stackSize + sToPut < aMinTargetStackSize) continue; + toPut -= sToPut; + s.stackSize += sToPut; + if (s.stackSize == s.getMaxStackSize() + || s.stackSize == toInventory.getInventoryStackLimit()) { + // this slot is full. remove this stack from candidate list + putStack.remove(i); + i--; + } + if (toPut == 0) break; + } + tMovedItems -= toPut; + if (tMovedItems > 0) { + tStackSize -= tMovedItems; + tTotalItemsMoved += tMovedItems; + // deduct spare space + tPutItems.merge(sID, tMovedItems, (a, b) -> a.equals(b) ? null : a - b); + + if (tStackSize == 0) fromInventory.setInventorySlotContents(grabSlot, null); + else tGrabStack.stackSize = tStackSize; + + fromInventory.markDirty(); + toInventory.markDirty(); + } + } + } + } + // still stuff to move & have completely empty slots + if (tStackSize > 0 && !tPutFreeSlots.isEmpty()) { + for (int i = 0; i < tPutFreeSlots.size(); i++) { + final int tPutSlot = tPutFreeSlots.get(i); + if (isAllowedToPutIntoSlot(toInventory, tPutSlot, putSide, tGrabStack, (byte) 64)) { + // allowed, now do moving + final int tMoved = moveStackFromSlotAToSlotB( + fromInventory, + toInventory, + grabSlot, + tPutSlot, + aMaxTargetStackSize, + aMinTargetStackSize, + (byte) (aMaxMoveAtOnce - tMovedItems), + aMinMoveAtOnce); + if (tMoved > 0) { + final ItemStack s = toInventory.getStackInSlot(tPutSlot); + if (s != null) { + // s might be null if tPutInventory is very special, e.g. infinity chest + // if s is null, we will not mark this slot as target candidate for anything + final int spare = Math + .min(s.getMaxStackSize(), toInventory.getInventoryStackLimit()) + - s.stackSize; + if (spare > 0) { + final ItemId ssID = ItemId.createNoCopy(s); + // add back to spare space count + tPutItems.merge(ssID, spare, Integer::sum); + // add to partially filled slot list + tPutItemStacks.computeIfAbsent(ssID, k -> new ArrayList<>()) + .add(s); + } + // this is no longer free + tPutFreeSlots.remove(i); + i--; + } + // else -> noop + // this is still a free slot. no need to do anything. + tTotalItemsMoved += tMoved; + tMovedItems += tMoved; + tStackSize -= tMoved; + if (tStackSize == 0) break; + } + } + } + } + + if (tMovedItems > 0) { + // check if we have moved enough stacks + if (++tStacksMoved >= aMaxStackTransfer) return tTotalItemsMoved; + } + } while (tMovedItems > 0 && tStackSize > 0); // support inventories that store more than a stack in a + // slot + } + + // check if source is a double chest, if yes, try move from the adjacent as well + if (aDoCheckChests && fromInventory instanceof TileEntityChest chest) { + final int tAmount = moveFromAdjacentChests( + chest, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer - tStacksMoved); + if (tAmount != 0) return tAmount + tTotalItemsMoved; + } + + // check if target is a double chest, if yes, try move to the adjacent as well + if (aDoCheckChests && toObject instanceof TileEntityChest chest) { + final int tAmount = moveToAdjacentChests( + fromInventory, + chest, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer - tStacksMoved); + if (tAmount != 0) return tAmount + tTotalItemsMoved; + } + + return tTotalItemsMoved; + } + // there should be a function to transfer more than 1 stack in a pipe + // however I do not see any ways to improve it. too much work for what it is worth + int tTotalItemsMoved = 0; + final int tGrabInventorySize = tGrabSlots.length; + for (int i = 0; i < tGrabInventorySize; i++) { + final int tMoved = moveStackIntoPipe( + fromInventory, + toObject, + tGrabSlots, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aDoCheckChests); + if (tMoved == 0) return tTotalItemsMoved; + else tTotalItemsMoved += tMoved; + } + return 0; + } + + private static int moveToAdjacentChests(IInventory aTileEntity1, TileEntityChest aTargetChest, + ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, + byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, + int aMaxStackTransfer) { + if (aTargetChest.adjacentChestChecked) { + if (aTargetChest.adjacentChestXNeg != null) { + return moveMultipleItemStacks( + aTileEntity1, + aTargetChest.adjacentChestXNeg, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } else if (aTargetChest.adjacentChestZNeg != null) { + return moveMultipleItemStacks( + aTileEntity1, + aTargetChest.adjacentChestZNeg, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } else if (aTargetChest.adjacentChestXPos != null) { + return moveMultipleItemStacks( + aTileEntity1, + aTargetChest.adjacentChestXPos, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } else if (aTargetChest.adjacentChestZPos != null) { + return moveMultipleItemStacks( + aTileEntity1, + aTargetChest.adjacentChestZPos, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } + } + return 0; + } + + private static int moveFromAdjacentChests(TileEntityChest fromTileEntityChest, Object toObject, + ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, + byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, + int aMaxStackTransfer) { + if (fromTileEntityChest.adjacentChestXNeg != null) { + return moveMultipleItemStacks( + fromTileEntityChest.adjacentChestXNeg, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } else if (fromTileEntityChest.adjacentChestZNeg != null) { + return moveMultipleItemStacks( + fromTileEntityChest.adjacentChestZNeg, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } else if (fromTileEntityChest.adjacentChestXPos != null) { + return moveMultipleItemStacks( + fromTileEntityChest.adjacentChestXPos, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } else if (fromTileEntityChest.adjacentChestZPos != null) { + return moveMultipleItemStacks( + fromTileEntityChest.adjacentChestZPos, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aMaxStackTransfer, + false); + } + return 0; + } + + /** + * Moves Stack from Inv-Side to Inv-Side. + * + * @return the Amount of moved Items + */ + public static byte moveOneItemStack(Object fromObject, Object toObject, ForgeDirection fromSide, + ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, + byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { + if (fromObject instanceof IInventory inv) return moveOneItemStack( + inv, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + true); + return 0; + } + + /** + * This is only because I needed an additional Parameter for the Double Chest Check. + */ + private static byte moveOneItemStack(IInventory fromInventory, Object toObject, ForgeDirection fromSide, + ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, + byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, boolean aDoCheckChests) { + if (fromInventory == null || aMaxTargetStackSize <= 0 + || aMinTargetStackSize <= 0 + || aMaxMoveAtOnce <= 0 + || aMinTargetStackSize > aMaxTargetStackSize + || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; + + int[] tGrabSlots = null; + if (fromInventory instanceof ISidedInventory) + tGrabSlots = ((ISidedInventory) fromInventory).getAccessibleSlotsFromSide(fromSide.ordinal()); + if (tGrabSlots == null) { + tGrabSlots = new int[fromInventory.getSizeInventory()]; + for (int i = 0; i < tGrabSlots.length; i++) tGrabSlots[i] = i; + } + + if (toObject instanceof IInventory inv) { + int[] tPutSlots = null; + if (toObject instanceof ISidedInventory sided) + tPutSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal()); + + if (tPutSlots == null) { + tPutSlots = new int[inv.getSizeInventory()]; + for (int i = 0; i < tPutSlots.length; i++) tPutSlots[i] = i; + } + + for (final int tGrabSlot : tGrabSlots) { + byte tMovedItemCount = 0; + final ItemStack tGrabStack = fromInventory.getStackInSlot(tGrabSlot); + if (listContainsItem(aFilter, tGrabStack, true, aInvertFilter) + && (tGrabStack.stackSize >= aMinMoveAtOnce + && isAllowedToTakeFromSlot(fromInventory, tGrabSlot, fromSide, tGrabStack))) { + for (final int tPutSlot : tPutSlots) { + if (isAllowedToPutIntoSlot(inv, tPutSlot, putSide, tGrabStack, aMaxTargetStackSize)) { + tMovedItemCount += moveStackFromSlotAToSlotB( + fromInventory, + inv, + tGrabSlot, + tPutSlot, + aMaxTargetStackSize, + aMinTargetStackSize, + (byte) (aMaxMoveAtOnce - tMovedItemCount), + aMinMoveAtOnce); + if (tMovedItemCount >= aMaxMoveAtOnce || (tMovedItemCount > 0 && aMaxTargetStackSize < 64)) + return tMovedItemCount; + } + } + + } + if (tMovedItemCount > 0) return tMovedItemCount; + } + + if (aDoCheckChests && fromInventory instanceof TileEntityChest fromChest + && (fromChest.adjacentChestChecked)) { + byte tAmount = 0; + if (fromChest.adjacentChestXNeg != null) { + tAmount = moveOneItemStack( + fromChest.adjacentChestXNeg, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (fromChest.adjacentChestZNeg != null) { + tAmount = moveOneItemStack( + fromChest.adjacentChestZNeg, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (fromChest.adjacentChestXPos != null) { + tAmount = moveOneItemStack( + fromChest.adjacentChestXPos, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (fromChest.adjacentChestZPos != null) { + tAmount = moveOneItemStack( + fromChest.adjacentChestZPos, + toObject, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } + if (tAmount != 0) return tAmount; + + } + if (aDoCheckChests && toObject instanceof TileEntityChest toChest && (toChest.adjacentChestChecked)) { + byte tAmount = 0; + if (toChest.adjacentChestXNeg != null) { + tAmount = moveOneItemStack( + fromInventory, + toChest.adjacentChestXNeg, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (toChest.adjacentChestZNeg != null) { + tAmount = moveOneItemStack( + fromInventory, + toChest.adjacentChestZNeg, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (toChest.adjacentChestXPos != null) { + tAmount = moveOneItemStack( + fromInventory, + toChest.adjacentChestXPos, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (toChest.adjacentChestZPos != null) { + tAmount = moveOneItemStack( + fromInventory, + toChest.adjacentChestZPos, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } + if (tAmount != 0) return tAmount; + + } + } + + return moveStackIntoPipe( + fromInventory, + toObject, + tGrabSlots, + fromSide, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aDoCheckChests); + } + + /** + * Moves Stack from Inv-Side to Inv-Slot. + * + * @return the Amount of moved Items + */ + public static byte moveOneItemStackIntoSlot(Object fromTileEntity, Object toTileEntity, ForgeDirection fromSide, + int putSlot, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, + byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { + if (!(fromTileEntity instanceof IInventory fromInv) || aMaxTargetStackSize <= 0 + || aMinTargetStackSize <= 0 + || aMaxMoveAtOnce <= 0 + || aMinTargetStackSize > aMaxTargetStackSize + || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; + + int[] tGrabSlots = null; + if (fromTileEntity instanceof ISidedInventory sided) + tGrabSlots = sided.getAccessibleSlotsFromSide(fromSide.ordinal()); + if (tGrabSlots == null) { + tGrabSlots = new int[fromInv.getSizeInventory()]; + for (int i = 0; i < tGrabSlots.length; i++) tGrabSlots[i] = i; + } + + if (toTileEntity instanceof IInventory toInv) { + for (final int tGrabSlot : tGrabSlots) { + if (listContainsItem(aFilter, fromInv.getStackInSlot(tGrabSlot), true, aInvertFilter)) { + if (isAllowedToTakeFromSlot(fromInv, tGrabSlot, fromSide, fromInv.getStackInSlot(tGrabSlot))) { + if (isAllowedToPutIntoSlot( + toInv, + putSlot, + ForgeDirection.UNKNOWN, + fromInv.getStackInSlot(tGrabSlot), + aMaxTargetStackSize)) { + byte tMovedItemCount = moveStackFromSlotAToSlotB( + fromInv, + toInv, + tGrabSlot, + putSlot, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce); + if (tMovedItemCount > 0) return tMovedItemCount; + } + } + } + } + } + + final ForgeDirection toSide = fromSide.getOpposite(); + moveStackIntoPipe( + fromInv, + toTileEntity, + tGrabSlots, + fromSide, + ForgeDirection.UNKNOWN, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce); + return 0; + } + + /** + * Moves Stack from Inv-Slot to Inv-Slot. + * + * @return the Amount of moved Items + */ + public static byte moveFromSlotToSlot(IInventory fromInv, IInventory toInv, int aGrabFrom, int aPutTo, + List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, + byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { + if (fromInv == null || toInv == null + || aGrabFrom < 0 + || aPutTo < 0 + || aMinTargetStackSize <= 0 + || aMaxMoveAtOnce <= 0 + || aMinTargetStackSize > aMaxTargetStackSize + || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; + if (listContainsItem(aFilter, fromInv.getStackInSlot(aGrabFrom), true, aInvertFilter)) { + if (isAllowedToTakeFromSlot( + fromInv, + aGrabFrom, + ForgeDirection.UNKNOWN, + fromInv.getStackInSlot(aGrabFrom))) { + if (isAllowedToPutIntoSlot( + toInv, + aPutTo, + ForgeDirection.UNKNOWN, + fromInv.getStackInSlot(aGrabFrom), + aMaxTargetStackSize)) { + byte tMovedItemCount = moveStackFromSlotAToSlotB( + fromInv, + toInv, + aGrabFrom, + aPutTo, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce); + if (tMovedItemCount > 0) return tMovedItemCount; + } + } + } + return 0; + } + + /** + * Moves Stack from Inv-Side to Inv-Slot. + * + * @return the Amount of moved Items + */ + public static byte moveFromSlotToSide(IInventory fromTile, Object toTile, int fromSlot, ForgeDirection putSide, + List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, + byte aMaxMoveAtOnce, byte aMinMoveAtOnce, boolean aDoCheckChests) { + if (fromTile == null || fromSlot < 0 + || aMinTargetStackSize <= 0 + || aMaxMoveAtOnce <= 0 + || aMinTargetStackSize > aMaxTargetStackSize + || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; + + if (!listContainsItem(aFilter, fromTile.getStackInSlot(fromSlot), true, aInvertFilter) + || !isAllowedToTakeFromSlot(fromTile, fromSlot, ForgeDirection.UNKNOWN, fromTile.getStackInSlot(fromSlot))) + return 0; + + if (toTile instanceof IInventory) { + int[] tPutSlots = null; + if (toTile instanceof ISidedInventory sided) + tPutSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal()); + + if (tPutSlots == null) { + tPutSlots = new int[((IInventory) toTile).getSizeInventory()]; + for (int i = 0; i < tPutSlots.length; i++) tPutSlots[i] = i; + } + + byte tMovedItemCount = 0; + for (final int tPutSlot : tPutSlots) { + if (isAllowedToPutIntoSlot( + (IInventory) toTile, + tPutSlot, + putSide, + fromTile.getStackInSlot(fromSlot), + aMaxTargetStackSize)) { + tMovedItemCount += moveStackFromSlotAToSlotB( + fromTile, + (IInventory) toTile, + fromSlot, + tPutSlot, + aMaxTargetStackSize, + aMinTargetStackSize, + (byte) (aMaxMoveAtOnce - tMovedItemCount), + aMinMoveAtOnce); + if (tMovedItemCount >= aMaxMoveAtOnce) { + return tMovedItemCount; + } + } + } + if (tMovedItemCount > 0) return tMovedItemCount; + + if (aDoCheckChests && toTile instanceof TileEntityChest tTileEntity2) { + if (tTileEntity2.adjacentChestChecked) { + if (tTileEntity2.adjacentChestXNeg != null) { + tMovedItemCount = moveFromSlotToSide( + fromTile, + tTileEntity2.adjacentChestXNeg, + fromSlot, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (tTileEntity2.adjacentChestZNeg != null) { + tMovedItemCount = moveFromSlotToSide( + fromTile, + tTileEntity2.adjacentChestZNeg, + fromSlot, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (tTileEntity2.adjacentChestXPos != null) { + tMovedItemCount = moveFromSlotToSide( + fromTile, + tTileEntity2.adjacentChestXPos, + fromSlot, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } else if (tTileEntity2.adjacentChestZPos != null) { + tMovedItemCount = moveFromSlotToSide( + fromTile, + tTileEntity2.adjacentChestZPos, + fromSlot, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + false); + } + if (tMovedItemCount > 0) return tMovedItemCount; + } + } + } + return moveStackIntoPipe( + fromTile, + toTile, + new int[] { fromSlot }, + ForgeDirection.UNKNOWN, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + aDoCheckChests); + } + + public static byte moveFromSlotToSide(IInventory fromTile, Object toTile, int fromSlot, ForgeDirection putSide, + List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, + byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { + return moveFromSlotToSide( + fromTile, + toTile, + fromSlot, + putSide, + aFilter, + aInvertFilter, + aMaxTargetStackSize, + aMinTargetStackSize, + aMaxMoveAtOnce, + aMinMoveAtOnce, + true); + } + + /** + * Move up to maxAmount amount of fluid from source to dest, with optional filtering via allowMove. note that this + * filter cannot bypass filtering done by IFluidHandlers themselves. + * + * this overload will assume the fill side is the opposite of drainSide + * + * @param source tank to drain from. method become noop if this is null + * @param dest tank to fill to. method become noop if this is null + * @param drainSide side used during draining operation + * @param maxAmount max amount of fluid to transfer. method become noop if this is not a positive integer + * @param allowMove filter. can be null to signal all fluids are accepted + */ + public static void moveFluid(IFluidHandler source, IFluidHandler dest, ForgeDirection drainSide, int maxAmount, + @Nullable Predicate allowMove) { + moveFluid(source, dest, drainSide, drainSide.getOpposite(), maxAmount, allowMove); + } + + /** + * Move up to maxAmount amount of fluid from source to dest, with optional filtering via allowMove. note that this + * filter cannot bypass filtering done by IFluidHandlers themselves. + * + * @param source tank to drain from. method become noop if this is null + * @param dest tank to fill to. method become noop if this is null + * @param drainSide side used during draining operation + * @param fillSide side used during filling operation + * @param maxAmount max amount of fluid to transfer. method become noop if this is not a positive integer + * @param allowMove filter. can be null to signal all fluids are accepted + */ + public static void moveFluid(IFluidHandler source, IFluidHandler dest, ForgeDirection drainSide, + ForgeDirection fillSide, int maxAmount, @Nullable Predicate allowMove) { + if (source == null || dest == null || maxAmount <= 0) return; + FluidStack liquid = source.drain(drainSide, maxAmount, false); + if (liquid == null) return; + liquid = liquid.copy(); + liquid.amount = dest.fill(fillSide, liquid, false); + if (liquid.amount > 0 && (allowMove == null || allowMove.test(liquid))) { + dest.fill(fillSide, source.drain(drainSide, liquid.amount, true), true); + } + } + + public static boolean listContainsItem(Collection aList, ItemStack aStack, boolean aTIfListEmpty, + boolean aInvertFilter) { + if (aStack == null || aStack.stackSize < 1) return false; + if (aList == null) return aTIfListEmpty; + boolean tEmpty = true; + for (ItemStack tStack : aList) { + if (tStack != null) { + tEmpty = false; + if (areStacksEqual(aStack, tStack)) { + return !aInvertFilter; + } + } + } + return tEmpty ? aTIfListEmpty : aInvertFilter; + } + + public static boolean areStacksOrToolsEqual(ItemStack aStack1, ItemStack aStack2) { + if (aStack1 != null && aStack2 != null && aStack1.getItem() == aStack2.getItem()) { + if (aStack1.getItem() + .isDamageable()) return true; + return ((aStack1.getTagCompound() == null) == (aStack2.getTagCompound() == null)) + && (aStack1.getTagCompound() == null || aStack1.getTagCompound() + .equals(aStack2.getTagCompound())) + && (Items.feather.getDamage(aStack1) == Items.feather.getDamage(aStack2) + || Items.feather.getDamage(aStack1) == W + || Items.feather.getDamage(aStack2) == W); + } + return false; + } + + public static boolean areFluidsEqual(FluidStack aFluid1, FluidStack aFluid2) { + return areFluidsEqual(aFluid1, aFluid2, false); + } + + public static boolean areFluidsEqual(FluidStack aFluid1, FluidStack aFluid2, boolean aIgnoreNBT) { + return aFluid1 != null && aFluid2 != null + && aFluid1.getFluid() == aFluid2.getFluid() + && (aIgnoreNBT || ((aFluid1.tag == null) == (aFluid2.tag == null)) + && (aFluid1.tag == null || aFluid1.tag.equals(aFluid2.tag))); + } + + public static boolean areStacksEqual(ItemStack aStack1, ItemStack aStack2) { + return areStacksEqual(aStack1, aStack2, false); + } + + public static boolean areStacksEqual(ItemStack aStack1, ItemStack aStack2, boolean aIgnoreNBT) { + return aStack1 != null && aStack2 != null + && aStack1.getItem() == aStack2.getItem() + && (Items.feather.getDamage(aStack1) == Items.feather.getDamage(aStack2) + || Items.feather.getDamage(aStack1) == W + || Items.feather.getDamage(aStack2) == W) + && (aIgnoreNBT || (((aStack1.getTagCompound() == null) == (aStack2.getTagCompound() == null)) + && (aStack1.getTagCompound() == null || aStack1.getTagCompound() + .equals(aStack2.getTagCompound())))); + } + + public static boolean areStacksEqualOrNull(ItemStack stack1, ItemStack stack2) { + return (stack1 == null && stack2 == null) || GTUtility.areStacksEqual(stack1, stack2); + } + + /** + * Treat both null list, or both null item stack at same list position as equal. + *

+ * Since ItemStack doesn't override equals and hashCode, you cannot just use Objects.equals + */ + public static boolean areStackListsEqual(List lhs, List rhs, boolean ignoreStackSize, + boolean ignoreNBT) { + if (lhs == null) return rhs == null; + if (rhs == null) return false; + if (lhs.size() != rhs.size()) return false; + for (Iterator it1 = lhs.iterator(), it2 = rhs.iterator(); it1.hasNext() && it2.hasNext();) { + if (!areStacksEqualExtended(it1.next(), it2.next(), ignoreStackSize, ignoreNBT)) return false; + } + return true; + } + + private static boolean areStacksEqualExtended(ItemStack lhs, ItemStack rhs, boolean ignoreStackSize, + boolean ignoreNBT) { + if (lhs == null) return rhs == null; + if (rhs == null) return false; + return lhs.getItem() == rhs.getItem() + && (ignoreNBT || Objects.equals(lhs.stackTagCompound, rhs.stackTagCompound)) + && (ignoreStackSize || lhs.stackSize == rhs.stackSize); + } + + public static boolean areUnificationsEqual(ItemStack aStack1, ItemStack aStack2) { + return areUnificationsEqual(aStack1, aStack2, false); + } + + public static boolean areUnificationsEqual(ItemStack aStack1, ItemStack aStack2, boolean aIgnoreNBT) { + return areStacksEqual( + GTOreDictUnificator.get_nocopy(aStack1), + GTOreDictUnificator.get_nocopy(aStack2), + aIgnoreNBT); + } + + public static String getFluidName(Fluid aFluid, boolean aLocalized) { + if (aFluid == null) return E; + String rName = aLocalized ? aFluid.getLocalizedName(new FluidStack(aFluid, 0)) : aFluid.getUnlocalizedName(); + if (rName.contains("fluid.") || rName.contains("tile.")) return capitalizeString( + rName.replaceAll("fluid.", E) + .replaceAll("tile.", E)); + return rName; + } + + public static String getFluidName(FluidStack aFluid, boolean aLocalized) { + if (aFluid == null) return E; + return getFluidName(aFluid.getFluid(), aLocalized); + } + + public static void reInit() { + sFilledContainerToData.clear(); + sEmptyContainerToFluidToData.clear(); + sFluidToContainers.clear(); + for (FluidContainerData tData : sFluidContainerList) { + String fluidName = tData.fluid.getFluid() + .getName(); + sFilledContainerToData.put(new GTItemStack(tData.filledContainer), tData); + Map tFluidToContainer = sEmptyContainerToFluidToData + .get(new GTItemStack(tData.emptyContainer)); + List tContainers = sFluidToContainers.get(fluidName); + if (tFluidToContainer == null) { + sEmptyContainerToFluidToData + .put(new GTItemStack(tData.emptyContainer), tFluidToContainer = new /* Concurrent */ HashMap<>()); + } + tFluidToContainer.put(fluidName, tData); + if (tContainers == null) { + tContainers = new ArrayList<>(); + tContainers.add(tData.filledContainer); + sFluidToContainers.put(fluidName, tContainers); + } else tContainers.add(tData.filledContainer); + } + } + + public static void addFluidContainerData(FluidContainerData aData) { + String fluidName = aData.fluid.getFluid() + .getName(); + sFluidContainerList.add(aData); + sFilledContainerToData.put(new GTItemStack(aData.filledContainer), aData); + Map tFluidToContainer = sEmptyContainerToFluidToData + .get(new GTItemStack(aData.emptyContainer)); + List tContainers = sFluidToContainers.get(fluidName); + if (tFluidToContainer == null) { + sEmptyContainerToFluidToData + .put(new GTItemStack(aData.emptyContainer), tFluidToContainer = new /* Concurrent */ HashMap<>()); + } + tFluidToContainer.put(fluidName, aData); + if (tContainers == null) { + tContainers = new ArrayList<>(); + tContainers.add(aData.filledContainer); + sFluidToContainers.put(fluidName, tContainers); + } else tContainers.add(aData.filledContainer); + } + + public static List getContainersFromFluid(FluidStack tFluidStack) { + if (tFluidStack != null) { + List tContainers = sFluidToContainers.get( + tFluidStack.getFluid() + .getName()); + if (tContainers == null) return new ArrayList<>(); + return tContainers; + } + return new ArrayList<>(); + } + + public static ItemStack fillFluidContainer(FluidStack aFluid, ItemStack aStack, boolean aRemoveFluidDirectly, + boolean aCheckIFluidContainerItems) { + if (isStackInvalid(aStack) || aFluid == null) return null; + if (GTModHandler.isWater(aFluid) && ItemList.Bottle_Empty.isStackEqual(aStack)) { + if (aFluid.amount >= 1000) { + return new ItemStack(Items.potionitem, 1, 0); + } + return null; + } + if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem + && ((IFluidContainerItem) aStack.getItem()).getFluid(aStack) == null + && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) <= aFluid.amount) { + if (aRemoveFluidDirectly) aFluid.amount -= ((IFluidContainerItem) aStack.getItem()) + .fill(aStack = copyAmount(1, aStack), aFluid, true); + else((IFluidContainerItem) aStack.getItem()).fill(aStack = copyAmount(1, aStack), aFluid, true); + return aStack; + } + Map tFluidToContainer = sEmptyContainerToFluidToData.get(new GTItemStack(aStack)); + if (tFluidToContainer == null) return null; + FluidContainerData tData = tFluidToContainer.get( + aFluid.getFluid() + .getName()); + if (tData == null || tData.fluid.amount > aFluid.amount) return null; + if (aRemoveFluidDirectly) aFluid.amount -= tData.fluid.amount; + return copyAmount(1, tData.filledContainer); + } + + public static int calculateRecipeEU(Materials aMaterial, int defaultRecipeEUPerTick) { + return aMaterial.getProcessingMaterialTierEU() == 0 ? defaultRecipeEUPerTick + : aMaterial.getProcessingMaterialTierEU(); + } + + public static ItemStack getFluidDisplayStack(Fluid aFluid) { + return aFluid == null ? null : getFluidDisplayStack(new FluidStack(aFluid, 0), false); + } + + public static ItemStack getFluidDisplayStack(FluidStack aFluid, boolean aUseStackSize) { + return getFluidDisplayStack(aFluid, aUseStackSize, false); + } + + public static ItemStack getFluidDisplayStack(FluidStack aFluid, boolean aUseStackSize, boolean aHideStackSize) { + if (aFluid == null || aFluid.getFluid() == null) return null; + int tmp = 0; + try { + tmp = aFluid.getFluid() + .getID(); + } catch (Exception e) { + System.err.println(e); + } + ItemStack rStack = ItemList.Display_Fluid.getWithDamage(1, tmp); + NBTTagCompound tNBT = new NBTTagCompound(); + tNBT.setLong("mFluidDisplayAmount", aUseStackSize ? aFluid.amount : 0); + tNBT.setLong( + "mFluidDisplayHeat", + aFluid.getFluid() + .getTemperature(aFluid)); + tNBT.setBoolean( + "mFluidState", + aFluid.getFluid() + .isGaseous(aFluid)); + tNBT.setBoolean("mHideStackSize", aHideStackSize); + try { + tNBT.setString("mFluidMaterialName", FLUID_MAP.get(aFluid.getFluid()).mName); + } catch (Exception ignored) {} + rStack.setTagCompound(tNBT); + return rStack; + } + + public static FluidStack getFluidFromDisplayStack(ItemStack aDisplayStack) { + if (!isStackValid(aDisplayStack) || aDisplayStack.getItem() != ItemList.Display_Fluid.getItem() + || !aDisplayStack.hasTagCompound()) return null; + Fluid tFluid = FluidRegistry.getFluid( + ItemList.Display_Fluid.getItem() + .getDamage(aDisplayStack)); + return new FluidStack( + tFluid, + (int) aDisplayStack.getTagCompound() + .getLong("mFluidDisplayAmount")); + } + + public static boolean containsFluid(ItemStack aStack, FluidStack aFluid, boolean aCheckIFluidContainerItems) { + if (isStackInvalid(aStack) || aFluid == null) return false; + if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem + && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) + return aFluid + .isFluidEqual(((IFluidContainerItem) aStack.getItem()).getFluid(aStack = copyAmount(1, aStack))); + FluidContainerData tData = sFilledContainerToData.get(new GTItemStack(aStack)); + return tData != null && tData.fluid.isFluidEqual(aFluid); + } + + public static FluidStack getFluidForFilledItem(ItemStack aStack, boolean aCheckIFluidContainerItems) { + if (isStackInvalid(aStack)) return null; + if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem + && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) + return ((IFluidContainerItem) aStack.getItem()).drain(copyAmount(1, aStack), Integer.MAX_VALUE, true); + FluidContainerData tData = sFilledContainerToData.get(new GTItemStack(aStack)); + return tData == null ? null : tData.fluid.copy(); + } + + /** + * Get empty fluid container from filled one. + */ + public static ItemStack getContainerForFilledItem(ItemStack aStack, boolean aCheckIFluidContainerItems) { + if (isStackInvalid(aStack)) return null; + FluidContainerData tData = sFilledContainerToData.get(new GTItemStack(aStack)); + if (tData != null) return copyAmount(1, tData.emptyContainer); + if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem + && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) { + ((IFluidContainerItem) aStack.getItem()).drain(aStack = copyAmount(1, aStack), Integer.MAX_VALUE, true); + return aStack; + } + return null; + } + + /** + * This is NOT meant for fluid manipulation! It's for getting item container, which is generally used for + * crafting recipes. While it also works for many of the fluid containers, some don't. + *

+ * Use {@link #getContainerForFilledItem} for getting empty fluid container. + */ + public static ItemStack getContainerItem(ItemStack aStack, boolean aCheckIFluidContainerItems) { + if (isStackInvalid(aStack)) return null; + if (aStack.getItem() + .hasContainerItem(aStack)) + return aStack.getItem() + .getContainerItem(aStack); + /* + * These are all special Cases, in which it is intended to have only GT Blocks outputting those Container Items + */ + if (ItemList.Cell_Empty.isStackEqual(aStack, false, true)) return null; + if (aStack.getItem() == Items.potionitem || aStack.getItem() == Items.experience_bottle + || ItemList.TF_Vial_FieryBlood.isStackEqual(aStack) + || ItemList.TF_Vial_FieryTears.isStackEqual(aStack)) return ItemList.Bottle_Empty.get(1); + + if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem + && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) { + ItemStack tStack = copyAmount(1, aStack); + ((IFluidContainerItem) aStack.getItem()).drain(tStack, Integer.MAX_VALUE, true); + if (!areStacksEqual(aStack, tStack)) return tStack; + return null; + } + + int tCapsuleCount = GTModHandler.getCapsuleCellContainerCount(aStack); + if (tCapsuleCount > 0) return ItemList.Cell_Empty.get(tCapsuleCount); + + if (ItemList.IC2_ForgeHammer.isStackEqual(aStack) || ItemList.IC2_WireCutter.isStackEqual(aStack)) + return copyMetaData(Items.feather.getDamage(aStack) + 1, aStack); + return null; + } + + public static FluidStack getFluidFromContainerOrFluidDisplay(ItemStack stack) { + FluidStack fluidStack = GTUtility.getFluidForFilledItem(stack, true); + if (fluidStack == null) { + fluidStack = GTUtility.getFluidFromDisplayStack(stack); + } + return fluidStack; + } + + public static synchronized boolean removeIC2BottleRecipe(ItemStack aContainer, ItemStack aInput, + Map aRecipeList, ItemStack aOutput) { + if ((isStackInvalid(aInput) && isStackInvalid(aOutput) && isStackInvalid(aContainer)) || aRecipeList == null) + return false; + boolean rReturn = false; + Iterator> tIterator = aRecipeList + .entrySet() + .iterator(); + aOutput = GTOreDictUnificator.get(aOutput); + while (tIterator.hasNext()) { + Map.Entry tEntry = tIterator.next(); + if (aInput == null || tEntry.getKey() + .matches(aContainer, aInput)) { + List tList = tEntry.getValue().items; + if (tList != null) for (ItemStack tOutput : tList) + if (aOutput == null || areStacksEqual(GTOreDictUnificator.get(tOutput), aOutput)) { + tIterator.remove(); + rReturn = true; + break; + } + } + } + return rReturn; + } + + public static synchronized boolean removeSimpleIC2MachineRecipe(ItemStack aInput, + Map aRecipeList, ItemStack aOutput) { + if ((isStackInvalid(aInput) && isStackInvalid(aOutput)) || aRecipeList == null) return false; + boolean rReturn = false; + Iterator> tIterator = aRecipeList.entrySet() + .iterator(); + aOutput = GTOreDictUnificator.get(aOutput); + while (tIterator.hasNext()) { + Map.Entry tEntry = tIterator.next(); + if (aInput == null || tEntry.getKey() + .matches(aInput)) { + List tList = tEntry.getValue().items; + if (tList != null) for (ItemStack tOutput : tList) + if (aOutput == null || areStacksEqual(GTOreDictUnificator.get(tOutput), aOutput)) { + tIterator.remove(); + rReturn = true; + break; + } + } + } + return rReturn; + } + + public static synchronized void bulkRemoveSimpleIC2MachineRecipe(Map toRemove, + Map aRecipeList) { + if (aRecipeList == null || aRecipeList.isEmpty()) return; + toRemove.entrySet() + .removeIf(aEntry -> (isStackInvalid(aEntry.getKey()) && isStackInvalid(aEntry.getValue()))); + final Map finalToRemove = Maps.transformValues(toRemove, GTOreDictUnificator::get_nocopy); + + aRecipeList.entrySet() + .removeIf( + tEntry -> finalToRemove.entrySet() + .stream() + .anyMatch(aEntry -> { + final ItemStack aInput = aEntry.getKey(), aOutput = aEntry.getValue(); + final List tList = tEntry.getValue().items; + + if (tList == null) return false; + if (aInput != null && !tEntry.getKey() + .matches(aInput)) return false; + + return tList.stream() + .anyMatch( + tOutput -> (aOutput == null + || areStacksEqual(GTOreDictUnificator.get(tOutput), aOutput))); + })); + } + + public static boolean addSimpleIC2MachineRecipe(ItemStack aInput, Map aRecipeList, + NBTTagCompound aNBT, Object... aOutput) { + if (isStackInvalid(aInput) || aOutput.length == 0 || aRecipeList == null) return false; + ItemData tOreName = GTOreDictUnificator.getAssociation(aInput); + for (Object o : aOutput) { + if (o == null) { + GT_FML_LOGGER.info("EmptyIC2Output!" + aInput.getUnlocalizedName()); + return false; + } + } + ItemStack[] tStack = GTOreDictUnificator.getStackArray(true, aOutput); + if (tStack.length > 0 && areStacksEqual(aInput, tStack[0])) return false; + if (tOreName != null) { + if (tOreName.toString() + .equals("dustAsh") + && tStack[0].getUnlocalizedName() + .equals("tile.volcanicAsh")) + return false; + aRecipeList + .put(new RecipeInputOreDict(tOreName.toString(), aInput.stackSize), new RecipeOutput(aNBT, tStack)); + } else { + aRecipeList + .put(new RecipeInputItemStack(copyOrNull(aInput), aInput.stackSize), new RecipeOutput(aNBT, tStack)); + } + return true; + } + + public static ItemStack getWrittenBook(String aMapping, ItemStack aStackToPutNBT) { + if (isStringInvalid(aMapping)) return null; + ItemStack rStack = GregTechAPI.sBookList.get(aMapping); + if (rStack == null) return aStackToPutNBT; + if (aStackToPutNBT != null) { + aStackToPutNBT.setTagCompound(rStack.getTagCompound()); + return aStackToPutNBT; + } + return copyAmount(1, rStack); + } + + public static ItemStack getWrittenBook(String aMapping, String aTitle, String aAuthor, String... aPages) { + if (isStringInvalid(aMapping)) return null; + ItemStack rStack = GregTechAPI.sBookList.get(aMapping); + if (rStack != null) return copyAmount(1, rStack); + if (isStringInvalid(aTitle) || isStringInvalid(aAuthor) || aPages.length == 0) return null; + sBookCount++; + rStack = new ItemStack(Items.written_book, 1); + NBTTagCompound tNBT = new NBTTagCompound(); + tNBT.setString("title", GTLanguageManager.addStringLocalization("Book." + aTitle + ".Name", aTitle)); + tNBT.setString("author", aAuthor); + NBTTagList tNBTList = new NBTTagList(); + for (byte i = 0; i < aPages.length; i++) { + aPages[i] = GTLanguageManager + .addStringLocalization("Book." + aTitle + ".Page" + ((i < 10) ? "0" + i : i), aPages[i]); + if (i < 48) { + if (aPages[i].length() < 256) tNBTList.appendTag(new NBTTagString(aPages[i])); + else GTLog.err.println("WARNING: String for written Book too long! -> " + aPages[i]); + } else { + GTLog.err.println("WARNING: Too much Pages for written Book! -> " + aTitle); + break; + } + } + tNBTList.appendTag( + new NBTTagString( + "Credits to " + aAuthor + + " for writing this Book. This was Book Nr. " + + sBookCount + + " at its creation. Gotta get 'em all!")); + tNBT.setTag("pages", tNBTList); + rStack.setTagCompound(tNBT); + GTLog.out.println( + "GTMod: Added Book to Book List - Mapping: '" + aMapping + + "' - Name: '" + + aTitle + + "' - Author: '" + + aAuthor + + "'"); + GregTechAPI.sBookList.put(aMapping, rStack); + return copyOrNull(rStack); + } + + public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength) { + if (aSoundName == null) return false; + return doSoundAtClient(aSoundName, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer()); + } + + public static boolean doSoundAtClient(SoundResource sound, int aTimeUntilNextSound, float aSoundStrength) { + return doSoundAtClient(sound.resourceLocation, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer()); + } + + public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, + float aSoundStrength) { + return doSoundAtClient(aSoundResourceLocation, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer()); + } + + public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength, + Entity aEntity) { + if (aEntity == null || aSoundName == null) return false; + return doSoundAtClient( + aSoundName, + aTimeUntilNextSound, + aSoundStrength, + aEntity.posX, + aEntity.posY, + aEntity.posZ); + } + + public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, + float aSoundStrength, Entity aEntity) { + if (aEntity == null) return false; + return doSoundAtClient( + aSoundResourceLocation.toString(), + aTimeUntilNextSound, + aSoundStrength, + aEntity.posX, + aEntity.posY, + aEntity.posZ); + } + + public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, + float aSoundStrength, double aX, double aY, double aZ) { + return doSoundAtClient(aSoundResourceLocation, aTimeUntilNextSound, aSoundStrength, 1.01818028F, aX, aY, aZ); + } + + /** + * @inheritDoc + * @deprecated Use {@link #doSoundAtClient(ResourceLocation, int, float, double, double, double)} + */ + @Deprecated + public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength, double aX, + double aY, double aZ) { + if (aSoundName == null) return false; + return doSoundAtClient( + new ResourceLocation(aSoundName), + aTimeUntilNextSound, + aSoundStrength, + 1.01818028F, + aX, + aY, + aZ); + } + + public static boolean doSoundAtClient(SoundResource aSound, int aTimeUntilNextSound, float aSoundStrength, + double aX, double aY, double aZ) { + return doSoundAtClient(aSound.resourceLocation, aTimeUntilNextSound, aSoundStrength, aX, aY, aZ); + } + + public static boolean doSoundAtClient(SoundResource aSound, int aTimeUntilNextSound, float aSoundStrength, + float aSoundModulation, double aX, double aY, double aZ) { + return doSoundAtClient( + aSound.resourceLocation, + aTimeUntilNextSound, + aSoundStrength, + aSoundModulation, + aX, + aY, + aZ); + } + + public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, + float aSoundStrength, float aSoundModulation, double aX, double aY, double aZ) { + if (!FMLCommonHandler.instance() + .getEffectiveSide() + .isClient() || GT.getThePlayer() == null || !GT.getThePlayer().worldObj.isRemote) return false; + if (GregTechAPI.sMultiThreadedSounds) new Thread( + new RunnableSound( + GT.getThePlayer().worldObj, + aX, + aY, + aZ, + aTimeUntilNextSound, + aSoundResourceLocation, + aSoundStrength, + aSoundModulation), + "Sound Effect").start(); + else new RunnableSound( + GT.getThePlayer().worldObj, + aX, + aY, + aZ, + aTimeUntilNextSound, + aSoundResourceLocation, + aSoundStrength, + aSoundModulation).run(); + return true; + } + + public static boolean sendSoundToPlayers(World aWorld, String aSoundName, float aSoundStrength, + float aSoundModulation, int aX, int aY, int aZ) { + if (isStringInvalid(aSoundName) || aWorld == null || aWorld.isRemote) return false; + NW.sendPacketToAllPlayersInRange( + aWorld, + new GTPacketSound(aSoundName, aSoundStrength, aSoundModulation, aX, (short) aY, aZ), + aX, + aZ); + return true; + } + + public static boolean sendSoundToPlayers(World aWorld, SoundResource sound, float aSoundStrength, + float aSoundModulation, int aX, int aY, int aZ) { + if (aWorld == null || aWorld.isRemote) return false; + NW.sendPacketToAllPlayersInRange( + aWorld, + new GTPacketSound(sound.resourceLocation.toString(), aSoundStrength, aSoundModulation, aX, (short) aY, aZ), + aX, + aZ); + return true; + } + + public static int stackToInt(ItemStack aStack) { + if (isStackInvalid(aStack)) return 0; + return itemToInt(aStack.getItem(), Items.feather.getDamage(aStack)); + } + + public static int itemToInt(Item aItem, int aMeta) { + return Item.getIdFromItem(aItem) | (aMeta << 16); + } + + public static int stackToWildcard(ItemStack aStack) { + if (isStackInvalid(aStack)) return 0; + return Item.getIdFromItem(aStack.getItem()) | (W << 16); + } + + public static ItemStack intToStack(int aStack) { + int tID = aStack & (~0 >>> 16), tMeta = aStack >>> 16; + Item tItem = Item.getItemById(tID); + if (tItem != null) return new ItemStack(tItem, 1, tMeta); + return null; + } + + public static Integer[] stacksToIntegerArray(ItemStack... aStacks) { + Integer[] rArray = new Integer[aStacks.length]; + for (int i = 0; i < rArray.length; i++) { + rArray[i] = stackToInt(aStacks[i]); + } + return rArray; + } + + public static int[] stacksToIntArray(ItemStack... aStacks) { + int[] rArray = new int[aStacks.length]; + for (int i = 0; i < rArray.length; i++) { + rArray[i] = stackToInt(aStacks[i]); + } + return rArray; + } + + public static boolean arrayContains(Object aObject, Object... aObjects) { + return listContains(aObject, Arrays.asList(aObjects)); + } + + public static boolean listContains(Object aObject, Collection aObjects) { + if (aObjects == null) return false; + return aObjects.contains(aObject); + } + + @SafeVarargs + public static boolean arrayContainsNonNull(T... aArray) { + if (aArray != null) for (Object tObject : aArray) if (tObject != null) return true; + return false; + } + + /** + * Note: use {@link ArrayExt#withoutNulls(Object[], IntFunction)} if you want an array as a result. + */ + @SafeVarargs + public static ArrayList getArrayListWithoutNulls(T... aArray) { + if (aArray == null) return new ArrayList<>(); + ArrayList rList = new ArrayList<>(Arrays.asList(aArray)); + for (int i = 0; i < rList.size(); i++) if (rList.get(i) == null) rList.remove(i--); + return rList; + } + + /** + * Note: use {@link ArrayExt#withoutTrailingNulls(Object[], IntFunction)} if you want an array as a result. + */ + @SafeVarargs + public static ArrayList getArrayListWithoutTrailingNulls(T... aArray) { + if (aArray == null) return new ArrayList<>(); + ArrayList rList = new ArrayList<>(Arrays.asList(aArray)); + for (int i = rList.size() - 1; i >= 0 && rList.get(i) == null;) rList.remove(i--); + return rList; + } + + public static Block getBlockFromStack(ItemStack itemStack) { + if (isStackInvalid(itemStack)) return Blocks.air; + return getBlockFromItem(itemStack.getItem()); + } + + public static Block getBlockFromItem(Item item) { + return Block.getBlockFromItem(item); + } + + public static boolean isStringValid(Object aString) { + return aString != null && !aString.toString() + .isEmpty(); + } + + public static boolean isStringInvalid(Object aString) { + return aString == null || aString.toString() + .isEmpty(); + } + + @Deprecated + public static boolean isStackValid(Object aStack) { + return (aStack instanceof ItemStack stack) && isStackValid(stack); + } + + public static boolean isStackValid(ItemStack aStack) { + return (aStack != null) && aStack.getItem() != null && aStack.stackSize >= 0; + } + + @Deprecated + public static boolean isStackInvalid(Object aStack) { + return !(aStack instanceof ItemStack stack) || isStackInvalid(stack); + } + + public static boolean isStackInvalid(ItemStack aStack) { + return aStack == null || aStack.getItem() == null || aStack.stackSize < 0; + } + + public static boolean isDebugItem(ItemStack aStack) { + return /* ItemList.Armor_Cheat.isStackEqual(aStack, T, T) || */ areStacksEqual( + GTModHandler.getIC2Item("debug", 1), + aStack, + true); + } + + public static ItemStack updateItemStack(ItemStack aStack) { + if (isStackValid(aStack) && aStack.getItem() instanceof GTGenericItem) + ((GTGenericItem) aStack.getItem()).isItemStackUsable(aStack); + return aStack; + } + + public static boolean isOpaqueBlock(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlock(aX, aY, aZ) + .isOpaqueCube(); + } + + public static boolean isBlockAir(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlock(aX, aY, aZ) + .isAir(aWorld, aX, aY, aZ); + } + + public static boolean hasBlockHitBox(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlock(aX, aY, aZ) + .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ) != null; + } + + public static void setCoordsOnFire(World aWorld, int aX, int aY, int aZ, boolean aReplaceCenter) { + if (aReplaceCenter) if (aWorld.getBlock(aX, aY, aZ) + .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ) == null) aWorld.setBlock(aX, aY, aZ, Blocks.fire); + if (aWorld.getBlock(aX + 1, aY, aZ) + .getCollisionBoundingBoxFromPool(aWorld, aX + 1, aY, aZ) == null) + aWorld.setBlock(aX + 1, aY, aZ, Blocks.fire); + if (aWorld.getBlock(aX - 1, aY, aZ) + .getCollisionBoundingBoxFromPool(aWorld, aX - 1, aY, aZ) == null) + aWorld.setBlock(aX - 1, aY, aZ, Blocks.fire); + if (aWorld.getBlock(aX, aY + 1, aZ) + .getCollisionBoundingBoxFromPool(aWorld, aX, aY + 1, aZ) == null) + aWorld.setBlock(aX, aY + 1, aZ, Blocks.fire); + if (aWorld.getBlock(aX, aY - 1, aZ) + .getCollisionBoundingBoxFromPool(aWorld, aX, aY - 1, aZ) == null) + aWorld.setBlock(aX, aY - 1, aZ, Blocks.fire); + if (aWorld.getBlock(aX, aY, aZ + 1) + .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ + 1) == null) + aWorld.setBlock(aX, aY, aZ + 1, Blocks.fire); + if (aWorld.getBlock(aX, aY, aZ - 1) + .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ - 1) == null) + aWorld.setBlock(aX, aY, aZ - 1, Blocks.fire); + } + + public static ItemStack getProjectile(SubTag aProjectileType, IInventory aInventory) { + if (aInventory != null) for (int i = 0, j = aInventory.getSizeInventory(); i < j; i++) { + ItemStack rStack = aInventory.getStackInSlot(i); + if (isStackValid(rStack) && rStack.getItem() instanceof IProjectileItem + && ((IProjectileItem) rStack.getItem()).hasProjectile(aProjectileType, rStack)) + return updateItemStack(rStack); + } + return null; + } + + public static void removeNullStacksFromInventory(IInventory aInventory) { + if (aInventory != null) for (int i = 0, j = aInventory.getSizeInventory(); i < j; i++) { + ItemStack tStack = aInventory.getStackInSlot(i); + if (tStack != null && (tStack.stackSize == 0 || tStack.getItem() == null)) + aInventory.setInventorySlotContents(i, null); + } + } + + /** + * Initializes new empty texture page for casings page 0 is old CASING_BLOCKS + *

+ * Then casings should be registered like this: for (byte i = MIN_USED_META; i < MAX_USED_META; i = (byte) (i + 1)) + * { Textures.BlockIcons.casingTexturePages[PAGE][i+START_INDEX] = new GT_CopiedBlockTexture(this, 6, i); } + * + * @param page 0 to 127 + * @return true if it made empty page, false if one already existed... + */ + public static boolean addTexturePage(byte page) { + if (Textures.BlockIcons.casingTexturePages[page] == null) { + Textures.BlockIcons.casingTexturePages[page] = new ITexture[128]; + return true; + } + return false; + } + + /** + * Return texture id from page and index, for use when determining hatches, but can also be precomputed from: + * (page<<7)+index + * + * @param page 0 to 127 page + * @param index 0 to 127 texture index + * @return casing texture 0 to 16383 + */ + public static int getTextureId(byte page, byte index) { + if (page >= 0 && index >= 0) { + return (page << 7) + index; + } + throw new RuntimeException("Index out of range: [" + page + "][" + index + "]"); + } + + /** + * Return texture id from page and index, for use when determining hatches, but can also be precomputed from: + * (page<<7)+index + * + * @param page 0 to 127 page + * @param startIndex 0 to 127 start texture index + * @param blockMeta meta of the block + * @return casing texture 0 to 16383 + */ + public static int getTextureId(byte page, byte startIndex, byte blockMeta) { + if (page >= 0 && startIndex >= 0 && blockMeta >= 0 && (startIndex + blockMeta) <= 127) { + return (page << 7) + (startIndex + blockMeta); + } + throw new RuntimeException( + "Index out of range: [" + page + + "][" + + startIndex + + "+" + + blockMeta + + "=" + + (startIndex + blockMeta) + + "]"); + } + + /** + * Return texture id from item stack, unoptimized but readable? + * + * @return casing texture 0 to 16383 + */ + public static int getTextureId(Block blockFromBlock, byte metaFromBlock) { + for (int page = 0; page < Textures.BlockIcons.casingTexturePages.length; page++) { + ITexture[] casingTexturePage = Textures.BlockIcons.casingTexturePages[page]; + if (casingTexturePage != null) { + for (int index = 0; index < casingTexturePage.length; index++) { + ITexture iTexture = casingTexturePage[index]; + if (iTexture instanceof IBlockContainer) { + Block block = ((IBlockContainer) iTexture).getBlock(); + byte meta = ((IBlockContainer) iTexture).getMeta(); + if (meta == metaFromBlock && blockFromBlock == block) { + return (page << 7) + index; + } + } + } + } + } + throw new RuntimeException( + "Probably missing mapping or different texture class used for: " + blockFromBlock.getUnlocalizedName() + + " meta:" + + metaFromBlock); + } + + /** + * Converts a Number to a String + */ + public static String parseNumberToString(int aNumber) { + boolean temp = true, negative = false; + + if (aNumber < 0) { + aNumber *= -1; + negative = true; + } + + StringBuilder tStringB = new StringBuilder(); + for (int i = 1000000000; i > 0; i /= 10) { + int tDigit = (aNumber / i) % 10; + if (temp && tDigit != 0) temp = false; + if (!temp) { + tStringB.append(tDigit); + if (i != 1) for (int j = i; j > 0; j /= 1000) if (j == 1) tStringB.append(","); + } + } + + String tString = tStringB.toString(); + + if (tString.equals(E)) tString = "0"; + + return negative ? "-" + tString : tString; + } + + public static NBTTagCompound getNBTContainingBoolean(NBTTagCompound aNBT, Object aTag, boolean aValue) { + if (aNBT == null) aNBT = new NBTTagCompound(); + aNBT.setBoolean(aTag.toString(), aValue); + return aNBT; + } + + public static NBTTagCompound getNBTContainingByte(NBTTagCompound aNBT, Object aTag, byte aValue) { + if (aNBT == null) aNBT = new NBTTagCompound(); + aNBT.setByte(aTag.toString(), aValue); + return aNBT; + } + + public static NBTTagCompound getNBTContainingShort(NBTTagCompound aNBT, Object aTag, short aValue) { + if (aNBT == null) aNBT = new NBTTagCompound(); + aNBT.setShort(aTag.toString(), aValue); + return aNBT; + } + + public static NBTTagCompound getNBTContainingInteger(NBTTagCompound aNBT, Object aTag, int aValue) { + if (aNBT == null) aNBT = new NBTTagCompound(); + aNBT.setInteger(aTag.toString(), aValue); + return aNBT; + } + + public static NBTTagCompound getNBTContainingFloat(NBTTagCompound aNBT, Object aTag, float aValue) { + if (aNBT == null) aNBT = new NBTTagCompound(); + aNBT.setFloat(aTag.toString(), aValue); + return aNBT; + } + + public static NBTTagCompound getNBTContainingDouble(NBTTagCompound aNBT, Object aTag, double aValue) { + if (aNBT == null) aNBT = new NBTTagCompound(); + aNBT.setDouble(aTag.toString(), aValue); + return aNBT; + } + + public static NBTTagCompound getNBTContainingString(NBTTagCompound aNBT, Object aTag, Object aValue) { + if (aNBT == null) aNBT = new NBTTagCompound(); + if (aValue == null) return aNBT; + aNBT.setString(aTag.toString(), aValue.toString()); + return aNBT; + } + + public static boolean isWearingFullFrostHazmat(EntityLivingBase aEntity) { + for (byte i = 1; i < 5; i++) { + ItemStack tStack = aEntity.getEquipmentInSlot(i); + + if (!isStackInList(tStack, GregTechAPI.sFrostHazmatList) && !hasHazmatEnchant(tStack)) { + return false; + } + } + return true; + } + + public static boolean isWearingFullHeatHazmat(EntityLivingBase aEntity) { + for (byte i = 1; i < 5; i++) { + ItemStack tStack = aEntity.getEquipmentInSlot(i); + + if (!isStackInList(tStack, GregTechAPI.sHeatHazmatList) && !hasHazmatEnchant(tStack)) { + return false; + } + } + + return true; + } + + public static boolean isWearingFullBioHazmat(EntityLivingBase aEntity) { + for (byte i = 1; i < 5; i++) { + ItemStack tStack = aEntity.getEquipmentInSlot(i); + + if (!isStackInList(tStack, GregTechAPI.sBioHazmatList) && !hasHazmatEnchant(tStack)) { + return false; + } + } + return true; + } + + public static boolean isWearingFullRadioHazmat(EntityLivingBase aEntity) { + for (byte i = 1; i < 5; i++) { + ItemStack tStack = aEntity.getEquipmentInSlot(i); + + if (!isStackInList(tStack, GregTechAPI.sRadioHazmatList) && !hasHazmatEnchant(tStack)) { + return false; + } + } + return true; + } + + public static boolean isWearingFullElectroHazmat(EntityLivingBase aEntity) { + for (byte i = 1; i < 5; i++) { + ItemStack tStack = aEntity.getEquipmentInSlot(i); + + if (!isStackInList(tStack, GregTechAPI.sElectroHazmatList) && !hasHazmatEnchant(tStack)) { + return false; + } + } + return true; + } + + public static boolean isWearingFullGasHazmat(EntityLivingBase aEntity) { + for (byte i = 1; i < 5; i++) { + ItemStack tStack = aEntity.getEquipmentInSlot(i); + + if (!isStackInList(tStack, GregTechAPI.sGasHazmatList) && !hasHazmatEnchant(tStack)) { + return false; + } + } + return true; + } + + public static boolean hasHazmatEnchant(ItemStack aStack) { + if (aStack == null) return false; + Map tEnchantments = EnchantmentHelper.getEnchantments(aStack); + Integer tLevel = tEnchantments.get(EnchantmentHazmat.INSTANCE.effectId); + + return tLevel != null && tLevel >= 1; + } + + public static float getHeatDamageFromItem(ItemStack aStack) { + ItemData tData = GTOreDictUnificator.getItemData(aStack); + return tData == null ? 0 + : (tData.mPrefix == null ? 0 : tData.mPrefix.mHeatDamage) + + (tData.hasValidMaterialData() ? tData.mMaterial.mMaterial.mHeatDamage : 0); + } + + public static int getRadioactivityLevel(ItemStack aStack) { + ItemData tData = GTOreDictUnificator.getItemData(aStack); + if (tData != null && tData.hasValidMaterialData()) { + if (tData.mMaterial.mMaterial.mEnchantmentArmors instanceof EnchantmentRadioactivity) + return tData.mMaterial.mMaterial.mEnchantmentArmorsLevel; + if (tData.mMaterial.mMaterial.mEnchantmentTools instanceof EnchantmentRadioactivity) + return tData.mMaterial.mMaterial.mEnchantmentToolsLevel; + } + return EnchantmentHelper.getEnchantmentLevel(EnchantmentRadioactivity.INSTANCE.effectId, aStack); + } + + public static boolean isImmuneToBreathingGasses(EntityLivingBase aEntity) { + return isWearingFullGasHazmat(aEntity); + } + + public static boolean applyHeatDamage(EntityLivingBase entity, float damage) { + return applyHeatDamage(entity, damage, GTDamageSources.getHeatDamage()); + } + + public static boolean applyHeatDamageFromItem(EntityLivingBase entity, float damage, ItemStack item) { + return applyHeatDamage(entity, damage, new DamageSourceHotItem(item)); + } + + private static boolean applyHeatDamage(EntityLivingBase aEntity, float aDamage, DamageSource source) { + if (aDamage > 0 && aEntity != null && !isWearingFullHeatHazmat(aEntity)) { + return aEntity.attackEntityFrom(source, aDamage); + } + return false; + } + + public static boolean applyFrostDamage(EntityLivingBase aEntity, float aDamage) { + if (aDamage > 0 && aEntity != null && !isWearingFullFrostHazmat(aEntity)) { + return aEntity.attackEntityFrom(GTDamageSources.getFrostDamage(), aDamage); + } + return false; + } + + public static boolean applyElectricityDamage(EntityLivingBase aEntity, long aVoltage, long aAmperage) { + long aDamage = getTier(aVoltage) * aAmperage * 4; + if (aDamage > 0 && aEntity != null && !isWearingFullElectroHazmat(aEntity)) { + return aEntity.attackEntityFrom(GTDamageSources.getElectricDamage(), aDamage); + } + return false; + } + + public static boolean applyRadioactivity(EntityLivingBase aEntity, int aLevel, int aAmountOfItems) { + if (aLevel > 0 && aEntity != null + && aEntity.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD + && aEntity.getCreatureAttribute() != EnumCreatureAttribute.ARTHROPOD + && !isWearingFullRadioHazmat(aEntity)) { + PotionEffect tEffect = null; + aEntity.addPotionEffect( + new PotionEffect( + Potion.moveSlowdown.id, + aLevel * 140 * aAmountOfItems + Math.max( + 0, + ((tEffect = aEntity.getActivePotionEffect(Potion.moveSlowdown)) == null ? 0 + : tEffect.getDuration())), + Math.max(0, (5 * aLevel) / 7))); + aEntity.addPotionEffect( + new PotionEffect( + Potion.digSlowdown.id, + aLevel * 150 * aAmountOfItems + Math.max( + 0, + ((tEffect = aEntity.getActivePotionEffect(Potion.digSlowdown)) == null ? 0 + : tEffect.getDuration())), + Math.max(0, (5 * aLevel) / 7))); + aEntity.addPotionEffect( + new PotionEffect( + Potion.confusion.id, + aLevel * 130 * aAmountOfItems + Math.max( + 0, + ((tEffect = aEntity.getActivePotionEffect(Potion.confusion)) == null ? 0 + : tEffect.getDuration())), + Math.max(0, (5 * aLevel) / 7))); + aEntity.addPotionEffect( + new PotionEffect( + Potion.weakness.id, + aLevel * 150 * aAmountOfItems + Math.max( + 0, + ((tEffect = aEntity.getActivePotionEffect(Potion.weakness)) == null ? 0 + : tEffect.getDuration())), + Math.max(0, (5 * aLevel) / 7))); + aEntity.addPotionEffect( + new PotionEffect( + Potion.hunger.id, + aLevel * 130 * aAmountOfItems + Math.max( + 0, + ((tEffect = aEntity.getActivePotionEffect(Potion.hunger)) == null ? 0 : tEffect.getDuration())), + Math.max(0, (5 * aLevel) / 7))); + aEntity.addPotionEffect( + new PotionEffect( + 24 /* IC2 Radiation */, + aLevel * 180 * aAmountOfItems + Math.max( + 0, + ((tEffect = aEntity.getActivePotionEffect(Potion.potionTypes[24])) == null ? 0 + : tEffect.getDuration())), + Math.max(0, (5 * aLevel) / 7))); + return true; + } + return false; + } + + public static ItemStack setStack(ItemStack aSetStack, ItemStack aToStack) { + if (isStackInvalid(aSetStack) || isStackInvalid(aToStack)) return null; + aSetStack.func_150996_a(aToStack.getItem()); + aSetStack.stackSize = aToStack.stackSize; + Items.feather.setDamage(aSetStack, Items.feather.getDamage(aToStack)); + aSetStack.setTagCompound(aToStack.getTagCompound()); + return aSetStack; + } + + public static FluidStack[] copyFluidArray(FluidStack... aStacks) { + if (aStacks == null) return null; + FluidStack[] rStacks = new FluidStack[aStacks.length]; + for (int i = 0; i < aStacks.length; i++) if (aStacks[i] != null) rStacks[i] = aStacks[i].copy(); + return rStacks; + } + + public static ItemStack[] copyItemArray(ItemStack... aStacks) { + if (aStacks == null) return null; + ItemStack[] rStacks = new ItemStack[aStacks.length]; + for (int i = 0; i < aStacks.length; i++) rStacks[i] = copy(aStacks[i]); + return rStacks; + } + + /** + * @deprecated use {@link #copy(ItemStack)} instead + */ + @Deprecated + public static ItemStack copy(Object... aStacks) { + for (Object tStack : aStacks) if (isStackValid(tStack)) return ((ItemStack) tStack).copy(); + return null; + } + + public static ItemStack copy(ItemStack aStack) { + if (isStackValid(aStack)) return aStack.copy(); + return null; + } + + @Deprecated + private static ItemStack firstStackOrNull(Object... aStacks) { + for (Object tStack : aStacks) if (tStack instanceof ItemStack stack) return stack; + return null; + } + + @Nullable + public static ItemStack copyOrNull(@Nullable ItemStack stack) { + if (isStackValid(stack)) return stack.copy(); + return null; + } + + public static FluidStack copyAmount(int aAmount, FluidStack aStack) { + if (aStack == null) return null; + FluidStack rStack = aStack.copy(); + rStack.amount = aAmount; + return rStack; + } + + /** + * @deprecated use {@link #copyAmount(int, ItemStack)} instead + */ + @Deprecated + public static ItemStack copyAmount(long aAmount, Object... aStacks) { + return copyAmount(aAmount, firstStackOrNull(aStacks)); + } + + /** + * @deprecated use {@link #copyAmount(int, ItemStack)} instead + */ + @Deprecated + public static ItemStack copyAmount(long aAmount, ItemStack aStack) { + return copyAmount((int) aAmount, aStack); + } + + public static ItemStack copyAmount(int aAmount, ItemStack aStack) { + ItemStack rStack = copy(aStack); + if (isStackInvalid(rStack)) return null; + if (aAmount > 64) aAmount = 64; + else if (aAmount == -1) aAmount = 111; + else if (aAmount < 0) aAmount = 0; + rStack.stackSize = (byte) aAmount; + return rStack; + } + + public static ItemStack multiplyStack(int aMultiplier, ItemStack aStack) { + ItemStack rStack = copy(aStack); + if (isStackInvalid(rStack)) return null; + int tAmount = rStack.stackSize * aMultiplier; + if (tAmount > 64) tAmount = 64; + else if (tAmount == -1) tAmount = 111; + else if (tAmount < 0) tAmount = 0; + rStack.stackSize = (byte) tAmount; + return rStack; + } + + /** + * Unlike {@link #copyAmount(int, ItemStack)}, this method does not restrict stack size by 64. + */ + public static ItemStack copyAmountUnsafe(int aAmount, ItemStack aStack) { + ItemStack rStack = copy(aStack); + if (isStackInvalid(rStack)) return null; + else if (aAmount < 0) aAmount = 0; + rStack.stackSize = (int) aAmount; + return rStack; + } + + public static ItemStack copyMetaData(int aMetaData, ItemStack aStack) { + ItemStack rStack = copy(aStack); + if (isStackInvalid(rStack)) return null; + Items.feather.setDamage(rStack, aMetaData); + return rStack; + } + + /** + * @deprecated use {@link #copyAmountAndMetaData(int, int, ItemStack)} instead + */ + @Deprecated + public static ItemStack copyAmountAndMetaData(long aAmount, long aMetaData, ItemStack aStack) { + return copyAmountAndMetaData((int) aAmount, (int) aMetaData, aStack); + } + + public static ItemStack copyAmountAndMetaData(int aAmount, int aMetaData, ItemStack aStack) { + ItemStack rStack = copyAmount(aAmount, aStack); + if (isStackInvalid(rStack)) return null; + Items.feather.setDamage(rStack, aMetaData); + return rStack; + } + + /** + * returns a copy of an ItemStack with its Stacksize being multiplied by aMultiplier + */ + public static ItemStack mul(int aMultiplier, ItemStack aStack) { + ItemStack rStack = copy(aStack); + if (rStack == null) return null; + rStack.stackSize *= aMultiplier; + return rStack; + } + + /** + * Loads an ItemStack properly. + */ + public static ItemStack loadItem(NBTTagCompound aNBT, String aTagName) { + return loadItem(aNBT.getCompoundTag(aTagName)); + } + + public static FluidStack loadFluid(NBTTagCompound aNBT, String aTagName) { + return loadFluid(aNBT.getCompoundTag(aTagName)); + } + + /** + * Loads an ItemStack properly. + */ + public static ItemStack loadItem(NBTTagCompound aNBT) { + if (aNBT == null) return null; + ItemStack tRawStack = ItemStack.loadItemStackFromNBT(aNBT); + int tRealStackSize = 0; + if (tRawStack != null && aNBT.hasKey("Count", Constants.NBT.TAG_INT)) { + tRealStackSize = aNBT.getInteger("Count"); + tRawStack.stackSize = tRealStackSize; + } else if (tRawStack != null) { + tRealStackSize = tRawStack.stackSize; + } + ItemStack tRet = GTOreDictUnificator.get(true, tRawStack); + if (tRet != null) tRet.stackSize = tRealStackSize; + return tRet; + } + + public static void saveItem(NBTTagCompound aParentTag, String aTagName, ItemStack aStack) { + if (aStack != null) aParentTag.setTag(aTagName, saveItem(aStack)); + } + + public static NBTTagCompound saveItem(ItemStack aStack) { + if (aStack == null) return new NBTTagCompound(); + NBTTagCompound t = new NBTTagCompound(); + aStack.writeToNBT(t); + if (aStack.stackSize > Byte.MAX_VALUE) t.setInteger("Count", aStack.stackSize); + return t; + } + + /** + * Loads an FluidStack properly. + */ + public static FluidStack loadFluid(NBTTagCompound aNBT) { + if (aNBT == null) return null; + return FluidStack.loadFluidStackFromNBT(aNBT); + } + + public static E selectItemInList(int aIndex, E aReplacement, List aList) { + if (aList == null || aList.isEmpty()) return aReplacement; + if (aList.size() <= aIndex) return aList.get(aList.size() - 1); + if (aIndex < 0) return aList.get(0); + return aList.get(aIndex); + } + + @SafeVarargs + public static E selectItemInList(int aIndex, E aReplacement, E... aList) { + if (aList == null || aList.length == 0) return aReplacement; + if (aList.length <= aIndex) return aList[aList.length - 1]; + if (aIndex < 0) return aList[0]; + return aList[aIndex]; + } + + public static boolean isStackInStackSet(ItemStack aStack, Set aSet) { + if (aStack == null) return false; + if (aSet.contains(aStack)) return true; + + return aSet.contains(GTItemStack.internalCopyStack(aStack, true)); + } + + public static boolean isStackInList(ItemStack aStack, Collection aList) { + if (aStack == null) { + return false; + } + return isStackInList(new GTItemStack(aStack), aList); + } + + public static boolean isStackInList(ItemStack aStack, Set aList) { + if (aStack == null) { + return false; + } + return isStackInList(new GTItemStack2(aStack), aList); + } + + public static boolean isStackInList(GTItemStack aStack, Collection aList) { + return aStack != null + && (aList.contains(aStack) || aList.contains(new GTItemStack(aStack.mItem, aStack.mStackSize, W))); + } + + public static boolean isStackInList(GTItemStack2 aStack, Set aList) { + return aStack != null + && (aList.contains(aStack) || aList.contains(new GTItemStack2(aStack.mItem, aStack.mStackSize, W))); + } + + /** + * re-maps all Keys of a Map after the Keys were weakened. + */ + public static Map reMap(Map aMap) { + Map tMap = null; + // We try to clone the Map first (most Maps are Cloneable) in order to retain as much state of the Map as + // possible when rehashing. For example, "Custom" HashMaps from fastutil may have a custom hash function which + // would not be used to rehash if we just create a new HashMap. + if (aMap instanceof Cloneable) { + try { + tMap = (Map) aMap.getClass() + .getMethod("clone") + .invoke(aMap); + } catch (Throwable e) { + GTLog.err.println("Failed to clone Map of type " + aMap.getClass()); + e.printStackTrace(GTLog.err); + } + } + + if (tMap == null) { + tMap = new HashMap<>(aMap); + } + + aMap.clear(); + aMap.putAll(tMap); + return aMap; + } + + /** + * re-maps all Keys of a Map after the Keys were weakened. + */ + public static SetMultimap reMap(SetMultimap aMap) { + @SuppressWarnings("unchecked") + Map.Entry[] entries = aMap.entries() + .toArray(new Map.Entry[0]); + aMap.clear(); + for (Map.Entry entry : entries) { + aMap.put(entry.getKey(), entry.getValue()); + } + return aMap; + } + + public static > LinkedHashMap sortMapByValuesAcending(Map map) { + return map.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue()) + .collect(CollectorUtils.entriesToMap(LinkedHashMap::new)); + } + + /** + * Why the fuck do neither Java nor Guava have a Function to do this? + */ + public static > LinkedHashMap sortMapByValuesDescending(Map aMap) { + List> tEntrySet = new LinkedList<>(aMap.entrySet()); + tEntrySet.sort((aValue1, aValue2) -> { + return aValue2.getValue() + .compareTo(aValue1.getValue()); // FB: RV - RV_NEGATING_RESULT_OF_COMPARETO + }); + LinkedHashMap rMap = new LinkedHashMap<>(); + for (Map.Entry tEntry : tEntrySet) rMap.put(tEntry.getKey(), tEntry.getValue()); + return rMap; + } + + /** + * Translates a Material Amount into an Amount of Fluid in Fluid Material Units. + */ + public static long translateMaterialToFluidAmount(long aMaterialAmount, boolean aRoundUp) { + return translateMaterialToAmount(aMaterialAmount, L, aRoundUp); + } + + /** + * Translates a Material Amount into an Amount of Fluid. Second Parameter for things like Bucket Amounts (1000) and + * similar + */ + public static long translateMaterialToAmount(long aMaterialAmount, long aAmountPerUnit, boolean aRoundUp) { + return Math.max( + 0, + ((aMaterialAmount * aAmountPerUnit) / M) + + (aRoundUp && (aMaterialAmount * aAmountPerUnit) % M > 0 ? 1 : 0)); + } + + /** + * This checks if the Dimension is really a Dimension and not another Planet or something. Used for my Teleporter. + */ + public static boolean isRealDimension(int aDimensionID) { + if (aDimensionID <= 1 && aDimensionID >= -1 && !GregTechAPI.sDimensionalList.contains(aDimensionID)) + return true; + return !GregTechAPI.sDimensionalList.contains(aDimensionID) + && DimensionManager.isDimensionRegistered(aDimensionID); + } + + public static boolean moveEntityToDimensionAtCoords(Entity entity, int aDimension, double aX, double aY, + double aZ) { + // Credit goes to BrandonCore Author :!: + + if (entity == null || entity.worldObj.isRemote) return false; + if (entity.ridingEntity != null) entity.mountEntity(null); + if (entity.riddenByEntity != null) entity.riddenByEntity.mountEntity(null); + + World startWorld = entity.worldObj; + WorldServer destinationWorld = FMLCommonHandler.instance() + .getMinecraftServerInstance() + .worldServerForDimension(aDimension); + + if (destinationWorld == null) { + return false; + } + + boolean interDimensional = startWorld.provider.dimensionId != destinationWorld.provider.dimensionId; + if (!interDimensional) return false; + startWorld.updateEntityWithOptionalForce(entity, false); // added + + if (entity instanceof EntityPlayerMP player) { + player.closeScreen(); // added + player.dimension = aDimension; + player.playerNetServerHandler.sendPacket( + new S07PacketRespawn( + player.dimension, + player.worldObj.difficultySetting, + destinationWorld.getWorldInfo() + .getTerrainType(), + player.theItemInWorldManager.getGameType())); + ((WorldServer) startWorld).getPlayerManager() + .removePlayer(player); + + startWorld.playerEntities.remove(player); + startWorld.updateAllPlayersSleepingFlag(); + int i = entity.chunkCoordX; + int j = entity.chunkCoordZ; + if ((entity.addedToChunk) && (startWorld.getChunkProvider() + .chunkExists(i, j))) { + startWorld.getChunkFromChunkCoords(i, j) + .removeEntity(entity); + startWorld.getChunkFromChunkCoords(i, j).isModified = true; + } + startWorld.loadedEntityList.remove(entity); + startWorld.onEntityRemoved(entity); + } + + entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); + + destinationWorld.theChunkProviderServer.loadChunk((int) aX >> 4, (int) aZ >> 4); + + destinationWorld.theProfiler.startSection("placing"); + if (!(entity instanceof EntityPlayer)) { + NBTTagCompound entityNBT = new NBTTagCompound(); + entity.isDead = false; + entityNBT.setString("id", EntityList.getEntityString(entity)); + entity.writeToNBT(entityNBT); + entity.isDead = true; + entity = EntityList.createEntityFromNBT(entityNBT, destinationWorld); + if (entity == null) { + return false; + } + entity.dimension = destinationWorld.provider.dimensionId; + } + destinationWorld.spawnEntityInWorld(entity); + entity.setWorld(destinationWorld); + entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); + + destinationWorld.updateEntityWithOptionalForce(entity, false); + entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); + + if ((entity instanceof EntityPlayerMP player)) { + player.mcServer.getConfigurationManager() + .func_72375_a(player, destinationWorld); + player.playerNetServerHandler.setPlayerLocation(aX, aY, aZ, player.rotationYaw, player.rotationPitch); + } + + destinationWorld.updateEntityWithOptionalForce(entity, false); + + if (entity instanceof EntityPlayerMP player) { + player.theItemInWorldManager.setWorld(destinationWorld); + player.mcServer.getConfigurationManager() + .updateTimeAndWeatherForPlayer(player, destinationWorld); + player.mcServer.getConfigurationManager() + .syncPlayerInventory(player); + + for (PotionEffect potionEffect : player.getActivePotionEffects()) { + player.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(player.getEntityId(), potionEffect)); + } + + player.playerNetServerHandler.sendPacket( + new S1FPacketSetExperience(player.experience, player.experienceTotal, player.experienceLevel)); + FMLCommonHandler.instance() + .firePlayerChangedDimensionEvent( + player, + startWorld.provider.dimensionId, + destinationWorld.provider.dimensionId); + } + entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); + + destinationWorld.theProfiler.endSection(); + entity.fallDistance = 0; + return true; + } + + public static int getScaleCoordinates(double aValue, int aScale) { + return (int) Math.floor(aValue / aScale); + } + + public static int getCoordinateScan(ArrayList aList, EntityPlayer aPlayer, World aWorld, int aScanLevel, + int aX, int aY, int aZ, ForgeDirection side, float aClickX, float aClickY, float aClickZ) { + if (aList == null) return 0; + + ArrayList tList = new ArrayList<>(); + int rEUAmount = 0; + + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + + final Block tBlock = aWorld.getBlock(aX, aY, aZ); + + addBaseInfo(aPlayer, aWorld, aX, aY, aZ, tList, tTileEntity, tBlock); + + if (tTileEntity != null) { + rEUAmount += addFluidHandlerInfo(side, tList, tTileEntity); + + try { + if (tTileEntity instanceof ic2.api.reactor.IReactorChamber chamber) { + rEUAmount += 500; + // Redirect the rest of the scans to the reactor itself + tTileEntity = (TileEntity) chamber.getReactor(); + } + } catch (Throwable e) { + if (D1) e.printStackTrace(GTLog.err); + } + rEUAmount += addReactorInfo(tList, tTileEntity); + rEUAmount += addAlignmentInfo(tList, tTileEntity); + rEUAmount += addIC2WrenchableInfo(aPlayer, tList, tTileEntity); + rEUAmount += addIC2EnergyConductorInfo(tList, tTileEntity); + rEUAmount += addIC2EnergyStorageInfo(tList, tTileEntity); + rEUAmount += addUpgradableMachineInfo(tList, tTileEntity); + rEUAmount += addMachineProgressInfo(tList, tTileEntity); + rEUAmount += addCoverableInfo(side, tList, tTileEntity); + addEnergyContainerInfo(tList, tTileEntity); + addOwnerInfo(tList, tTileEntity); + addDeviceInfo(tList, tTileEntity); + + rEUAmount += addIC2CropInfo(tList, tTileEntity); + + rEUAmount += addForestryLeavesInfo(tList, tTileEntity); + } + + final Chunk currentChunk = aWorld.getChunkFromBlockCoords(aX, aZ); + addUndergroundFluidInfo(aPlayer, tList, currentChunk); + addPollutionInfo(tList, currentChunk); + + rEUAmount += addDebuggableBlockInfo(aPlayer, aX, aY, aZ, tList, tBlock); + + final BlockScanningEvent tEvent = new BlockScanningEvent( + aWorld, + aPlayer, + aX, + aY, + aZ, + side, + aScanLevel, + tBlock, + tTileEntity, + tList, + aClickX, + aClickY, + aClickZ); + tEvent.mEUCost = rEUAmount; + MinecraftForge.EVENT_BUS.post(tEvent); + if (!tEvent.isCanceled()) aList.addAll(tList); + return tEvent.mEUCost; + } + + private static void addBaseInfo(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, ArrayList tList, + TileEntity tTileEntity, Block tBlock) { + tList.add( + "----- X: " + EnumChatFormatting.AQUA + + formatNumbers(aX) + + EnumChatFormatting.RESET + + " Y: " + + EnumChatFormatting.AQUA + + formatNumbers(aY) + + EnumChatFormatting.RESET + + " Z: " + + EnumChatFormatting.AQUA + + formatNumbers(aZ) + + EnumChatFormatting.RESET + + " D: " + + EnumChatFormatting.AQUA + + aWorld.provider.dimensionId + + EnumChatFormatting.RESET + + " -----"); + try { + tList.add( + GTUtility.trans("162", "Name: ") + EnumChatFormatting.BLUE + + ((tTileEntity instanceof IInventory inv) ? inv.getInventoryName() : tBlock.getUnlocalizedName()) + + EnumChatFormatting.RESET + + GTUtility.trans("163", " MetaData: ") + + EnumChatFormatting.AQUA + + aWorld.getBlockMetadata(aX, aY, aZ) + + EnumChatFormatting.RESET); + tList.add( + GTUtility.trans("164", "Hardness: ") + EnumChatFormatting.YELLOW + + tBlock.getBlockHardness(aWorld, aX, aY, aZ) + + EnumChatFormatting.RESET + + GTUtility.trans("165", " Blast Resistance: ") + + EnumChatFormatting.YELLOW + + tBlock + .getExplosionResistance(aPlayer, aWorld, aX, aY, aZ, aPlayer.posX, aPlayer.posY, aPlayer.posZ) + + EnumChatFormatting.RESET); + if (tBlock.isBeaconBase(aWorld, aX, aY, aZ, aX, aY + 1, aZ)) tList.add( + EnumChatFormatting.GOLD + GTUtility.trans("166", "Is valid Beacon Pyramid Material") + + EnumChatFormatting.RESET); + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this block's info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + } + + private static int addFluidHandlerInfo(ForgeDirection side, ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof IFluidHandler fluidHandler) { + rEUAmount += 500; + final FluidTankInfo[] tTanks = fluidHandler.getTankInfo(side); + if (tTanks != null) for (byte i = 0; i < tTanks.length; i++) { + tList.add( + GTUtility.trans("167", "Tank ") + i + + ": " + + EnumChatFormatting.GREEN + + formatNumbers((tTanks[i].fluid == null ? 0 : tTanks[i].fluid.amount)) + + EnumChatFormatting.RESET + + " L / " + + EnumChatFormatting.YELLOW + + formatNumbers(tTanks[i].capacity) + + EnumChatFormatting.RESET + + " L " + + EnumChatFormatting.GOLD + + getFluidName(tTanks[i].fluid, true) + + EnumChatFormatting.RESET); + } + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this tile's fluid tank info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addDebuggableBlockInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, ArrayList tList, + Block tBlock) { + int rEUAmount = 0; + try { + if (tBlock instanceof IDebugableBlock debugableBlock) { + rEUAmount += 500; + final ArrayList temp = debugableBlock.getDebugInfo(aPlayer, aX, aY, aZ, 3); + if (temp != null) tList.addAll(temp); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this block's debug info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static void addPollutionInfo(ArrayList tList, Chunk currentChunk) { + if (Pollution.hasPollution(currentChunk)) { + tList.add( + GTUtility.trans("202", "Pollution in Chunk: ") + EnumChatFormatting.RED + + formatNumbers(Pollution.getPollution(currentChunk)) + + EnumChatFormatting.RESET + + GTUtility.trans("203", " gibbl")); + } else { + tList.add( + EnumChatFormatting.GREEN + GTUtility.trans("204", "No Pollution in Chunk! HAYO!") + + EnumChatFormatting.RESET); + } + } + + private static void addUndergroundFluidInfo(EntityPlayer aPlayer, ArrayList tList, Chunk currentChunk) { + if (aPlayer.capabilities.isCreativeMode) { + final FluidStack tFluid = undergroundOilReadInformation(currentChunk); // -# to only read + if (tFluid != null) tList.add( + EnumChatFormatting.GOLD + tFluid.getLocalizedName() + + EnumChatFormatting.RESET + + ": " + + EnumChatFormatting.YELLOW + + formatNumbers(tFluid.amount) + + EnumChatFormatting.RESET + + " L"); + else tList.add( + EnumChatFormatting.GOLD + GTUtility.trans("201", "Nothing") + + EnumChatFormatting.RESET + + ": " + + EnumChatFormatting.YELLOW + + '0' + + EnumChatFormatting.RESET + + " L"); + } + } + + private static int addForestryLeavesInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (Mods.Forestry.isModLoaded() + && tTileEntity instanceof forestry.arboriculture.tiles.TileLeaves tileLeaves) { + final forestry.api.arboriculture.ITree tree = tileLeaves.getTree(); + if (tree != null) { + rEUAmount += 1000; + if (!tree.isAnalyzed()) tree.analyze(); + tree.addTooltip(tList); + } + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this leaves' info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addIC2CropInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof ic2.api.crops.ICropTile crop) { + rEUAmount += 1000; + if (crop.getScanLevel() < 4) crop.setScanLevel((byte) 4); + if (crop.getCrop() != null) { + tList.add( + GTUtility.trans("187", "Type -- Crop-Name: ") + crop.getCrop() + .name() + + GTUtility.trans("188", " Growth: ") + + crop.getGrowth() + + GTUtility.trans("189", " Gain: ") + + crop.getGain() + + GTUtility.trans("190", " Resistance: ") + + crop.getResistance()); + } + tList.add( + GTUtility.trans("191", "Plant -- Fertilizer: ") + crop.getNutrientStorage() + + GTUtility.trans("192", " Water: ") + + crop.getHydrationStorage() + + GTUtility.trans("193", " Weed-Ex: ") + + crop.getWeedExStorage() + + GTUtility.trans("194", " Scan-Level: ") + + crop.getScanLevel()); + tList.add( + GTUtility.trans("195", "Environment -- Nutrients: ") + crop.getNutrients() + + GTUtility.trans("196", " Humidity: ") + + crop.getHumidity() + + GTUtility.trans("197", " Air-Quality: ") + + crop.getAirQuality()); + if (crop.getCrop() != null) { + final StringBuilder tStringB = new StringBuilder(); + for (final String tAttribute : crop.getCrop() + .attributes()) { + tStringB.append(", ") + .append(tAttribute); + } + final String tString = tStringB.toString(); + tList.add(GTUtility.trans("198", "Attributes:") + tString.replaceFirst(",", E)); + tList.add( + GTUtility.trans("199", "Discovered by: ") + crop.getCrop() + .discoveredBy()); + } + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this crop's info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static void addDeviceInfo(ArrayList tList, TileEntity tTileEntity) { + try { + if (tTileEntity instanceof IGregTechDeviceInformation info && info.isGivingInformation()) { + tList.addAll(Arrays.asList(info.getInfoData())); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + } + + private static void addOwnerInfo(ArrayList tList, TileEntity tTileEntity) { + try { + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + tList.add( + GTUtility.trans("186", "Owned by: ") + EnumChatFormatting.BLUE + + gtTE.getOwnerName() + + EnumChatFormatting.RESET); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's owner.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + } + + private static void addEnergyContainerInfo(ArrayList tList, TileEntity tTileEntity) { + try { + if (tTileEntity instanceof IBasicEnergyContainer energyContainer && energyContainer.getEUCapacity() > 0) { + tList.add( + GTUtility.trans("179", "Max IN: ") + EnumChatFormatting.RED + + formatNumbers(energyContainer.getInputVoltage()) + + " (" + + GTValues.VN[getTier(energyContainer.getInputVoltage())] + + ") " + + EnumChatFormatting.RESET + + GTUtility.trans("182", " EU at ") + + EnumChatFormatting.RED + + formatNumbers(energyContainer.getInputAmperage()) + + EnumChatFormatting.RESET + + GTUtility.trans("183", " A")); + tList.add( + GTUtility.trans("181", "Max OUT: ") + EnumChatFormatting.RED + + formatNumbers(energyContainer.getOutputVoltage()) + + " (" + + GTValues.VN[getTier(energyContainer.getOutputVoltage())] + + ") " + + EnumChatFormatting.RESET + + GTUtility.trans("182", " EU at ") + + EnumChatFormatting.RED + + formatNumbers(energyContainer.getOutputAmperage()) + + EnumChatFormatting.RESET + + GTUtility.trans("183", " A")); + tList.add( + GTUtility.trans("184", "Energy: ") + EnumChatFormatting.GREEN + + formatNumbers(energyContainer.getStoredEU()) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + formatNumbers(energyContainer.getEUCapacity()) + + EnumChatFormatting.RESET + + " EU"); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's energy info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + } + + private static int addCoverableInfo(ForgeDirection side, ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof ICoverable coverable) { + rEUAmount += 300; + final String tString = coverable.getCoverInfoAtSide(side) + .getBehaviorDescription(); + if (tString != null && !tString.equals(E)) tList.add(tString); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's covers.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addMachineProgressInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof IMachineProgress progress) { + if (progress.isAllowedToWork() && !progress.hasThingsToDo()) { + tList.add(EnumChatFormatting.RED + "Disabled." + EnumChatFormatting.RESET); + } + if (progress.wasShutdown() && isStringValid( + progress.getLastShutDownReason() + .getDisplayString())) { + tList.add( + progress.getLastShutDownReason() + .getDisplayString()); + } + rEUAmount += 400; + int tValue = 0; + if (0 < (tValue = progress.getMaxProgress())) tList.add( + GTUtility.trans("178", "Progress/Load: ") + EnumChatFormatting.GREEN + + formatNumbers(progress.getProgress()) + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.YELLOW + + formatNumbers(tValue) + + EnumChatFormatting.RESET); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's progress.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addUpgradableMachineInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof IUpgradableMachine upgradableMachine) { + rEUAmount += 500; + if (upgradableMachine.hasMufflerUpgrade()) tList.add( + EnumChatFormatting.GREEN + GTUtility.trans("177", "Has Muffler Upgrade") + + EnumChatFormatting.RESET); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's upgrades.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addIC2EnergyStorageInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof ic2.api.tile.IEnergyStorage storage) { + rEUAmount += 200; + tList.add( + GTUtility.trans("176", "Contained Energy: ") + EnumChatFormatting.YELLOW + + formatNumbers(storage.getStored()) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + formatNumbers(storage.getCapacity()) + + EnumChatFormatting.RESET + + " EU"); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's IC2 energy info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addIC2EnergyConductorInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof ic2.api.energy.tile.IEnergyConductor conductor) { + rEUAmount += 200; + tList.add( + GTUtility.trans("175", "Conduction Loss: ") + EnumChatFormatting.YELLOW + + conductor.getConductionLoss() + + EnumChatFormatting.RESET); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's EU conduction info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addIC2WrenchableInfo(EntityPlayer aPlayer, ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof ic2.api.tile.IWrenchable wrenchable) { + rEUAmount += 100; + tList.add( + GTUtility.trans("171", "Facing: ") + EnumChatFormatting.GREEN + + wrenchable.getFacing() + + EnumChatFormatting.RESET + + GTUtility.trans("172", " / Chance: ") + + EnumChatFormatting.YELLOW + + (wrenchable.getWrenchDropRate() * 100) + + EnumChatFormatting.RESET + + "%"); + tList.add( + wrenchable.wrenchCanRemove(aPlayer) + ? EnumChatFormatting.GREEN + GTUtility.trans("173", "You can remove this with a Wrench") + + EnumChatFormatting.RESET + : EnumChatFormatting.RED + GTUtility.trans("174", "You can NOT remove this with a Wrench") + + EnumChatFormatting.RESET); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's IC@ wrenchability.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addAlignmentInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof IAlignmentProvider alignmentProvider) { + final IAlignment tAlignment = alignmentProvider.getAlignment(); + if (tAlignment != null) { + rEUAmount += 100; + tList.add( + GTUtility.trans("219", "Extended Facing: ") + EnumChatFormatting.GREEN + + tAlignment.getExtendedFacing() + + EnumChatFormatting.RESET); + } + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this device's alignment info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + private static int addReactorInfo(ArrayList tList, TileEntity tTileEntity) { + int rEUAmount = 0; + try { + if (tTileEntity instanceof ic2.api.reactor.IReactor reactor) { + rEUAmount += 500; + tList.add( + GTUtility.trans("168", "Heat: ") + EnumChatFormatting.GREEN + + formatNumbers(reactor.getHeat()) + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.YELLOW + + formatNumbers(reactor.getMaxHeat()) + + EnumChatFormatting.RESET); + tList.add( + GTUtility.trans("169", "HEM: ") + EnumChatFormatting.YELLOW + + reactor.getHeatEffectModifier() + + EnumChatFormatting.RESET); + } + } catch (Throwable e) { + tList.add(String.format("§cAn exception was thrown while fetching this reactor's info.§r")); + if (D1) e.printStackTrace(GTLog.err); + } + return rEUAmount; + } + + public static String trans(String aKey, String aEnglish) { + return GTLanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_" + aKey, aEnglish); + } + + public static String getTrans(String aKey) { + return GTLanguageManager.getTranslation("Interaction_DESCRIPTION_Index_" + aKey); + } + + /** + * @return an Array containing the X and the Y Coordinate of the clicked Point, with the top left Corner as Origin, + * like on the Texture Sheet. return values should always be between [0.0F and 0.99F]. + */ + // TODO: use clamp() + public static float[] getClickedFacingCoords(ForgeDirection side, float aX, float aY, float aZ) { + return switch (side) { + case DOWN -> new float[] { Math.min(0.99F, Math.max(0, 1 - aX)), Math.min(0.99F, Math.max(0, aZ)) }; + case UP -> new float[] { Math.min(0.99F, Math.max(0, aX)), Math.min(0.99F, Math.max(0, aZ)) }; + case NORTH -> new float[] { Math.min(0.99F, Math.max(0, 1 - aX)), Math.min(0.99F, Math.max(0, 1 - aY)) }; + case SOUTH -> new float[] { Math.min(0.99F, Math.max(0, aX)), Math.min(0.99F, Math.max(0, 1 - aY)) }; + case WEST -> new float[] { Math.min(0.99F, Math.max(0, aZ)), Math.min(0.99F, Math.max(0, 1 - aY)) }; + case EAST -> new float[] { Math.min(0.99F, Math.max(0, 1 - aZ)), Math.min(0.99F, Math.max(0, 1 - aY)) }; + default -> new float[] { 0.5F, 0.5F }; + }; + } + + /** + * This Function determines the direction a Block gets when being Wrenched. returns -1 if invalid. Even though that + * could never happen. + */ + public static ForgeDirection determineWrenchingSide(ForgeDirection side, float aX, float aY, float aZ) { + ForgeDirection tBack = side.getOpposite(); + switch (side) { + case DOWN, UP -> { + if (aX < 0.25) { + if (aZ < 0.25) return tBack; + if (aZ > 0.75) return tBack; + return WEST; + } + if (aX > 0.75) { + if (aZ < 0.25) return tBack; + if (aZ > 0.75) return tBack; + return EAST; + } + if (aZ < 0.25) return NORTH; + if (aZ > 0.75) return SOUTH; + return side; + } + case NORTH, SOUTH -> { + if (aX < 0.25) { + if (aY < 0.25) return tBack; + if (aY > 0.75) return tBack; + return WEST; + } + if (aX > 0.75) { + if (aY < 0.25) return tBack; + if (aY > 0.75) return tBack; + return EAST; + } + if (aY < 0.25) return DOWN; + if (aY > 0.75) return UP; + return side; + } + case WEST, EAST -> { + if (aZ < 0.25) { + if (aY < 0.25) return tBack; + if (aY > 0.75) return tBack; + return NORTH; + } + if (aZ > 0.75) { + if (aY < 0.25) return tBack; + if (aY > 0.75) return tBack; + return SOUTH; + } + if (aY < 0.25) return DOWN; + if (aY > 0.75) return UP; + return side; + } + } + return UNKNOWN; + } + + private static DecimalFormat getDecimalFormat() { + return decimalFormatters.computeIfAbsent(Locale.getDefault(Locale.Category.FORMAT), locale -> { + DecimalFormat numberFormat = new DecimalFormat(); // uses the necessary locale inside anyway + numberFormat.setGroupingUsed(true); + numberFormat.setMaximumFractionDigits(2); + numberFormat.setRoundingMode(RoundingMode.HALF_UP); + DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols(); + decimalFormatSymbols.setGroupingSeparator(','); // Use sensible separator for best clarity. + numberFormat.setDecimalFormatSymbols(decimalFormatSymbols); + return numberFormat; + }); + } + + public static String formatNumbers(BigInteger aNumber) { + return getDecimalFormat().format(aNumber); + } + + public static String formatNumbers(long aNumber) { + return getDecimalFormat().format(aNumber); + } + + public static String formatNumbers(double aNumber) { + return getDecimalFormat().format(aNumber); + } + + /* + * Check if stack has enough items of given type and subtract from stack, if there's no creative or 111 stack. + */ + public static boolean consumeItems(EntityPlayer player, ItemStack stack, Item item, int count) { + if (stack != null && stack.getItem() == item && stack.stackSize >= count) { + if ((!player.capabilities.isCreativeMode) && (stack.stackSize != 111)) stack.stackSize -= count; + return true; + } + return false; + } + + /* + * Check if stack has enough items of given gregtech material (will be oredicted) and subtract from stack, if + * there's no creative or 111 stack. + */ + public static boolean consumeItems(EntityPlayer player, ItemStack stack, gregtech.api.enums.Materials mat, + int count) { + if (stack != null && GTOreDictUnificator.getItemData(stack).mMaterial.mMaterial == mat + && stack.stackSize >= count) { + if ((!player.capabilities.isCreativeMode) && (stack.stackSize != 111)) stack.stackSize -= count; + return true; + } + return false; + } + + public static ArrayList sortByValueToList(Map map) { + List> list = new LinkedList<>(map.entrySet()); + list.sort((o1, o2) -> o2.getValue() - o1.getValue()); + + ArrayList result = new ArrayList<>(); + for (Map.Entry e : list) result.add(e.getKey()); + return result; + } + + public static String joinListToString(List list) { + StringBuilder result = new StringBuilder(32); + for (String s : list) result.append(result.length() == 0 ? s : '|' + s); + return result.toString(); + } + + public static ItemStack getIntegratedCircuit(int config) { + return ItemList.Circuit_Integrated.getWithDamage(0, config); + } + + public static float getBlockHardnessAt(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlock(aX, aY, aZ) + .getBlockHardness(aWorld, aX, aY, aZ); + } + + public static FakePlayer getFakePlayer(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.getWorld() instanceof WorldServer) { + return FakePlayerFactory.get( + (WorldServer) aBaseMetaTileEntity.getWorld(), + new GameProfile(aBaseMetaTileEntity.getOwnerUuid(), aBaseMetaTileEntity.getOwnerName())); + } + return null; + } + + public static boolean eraseBlockByFakePlayer(FakePlayer aPlayer, int aX, int aY, int aZ, boolean isSimulate) { + if (aPlayer == null) return false; + World aWorld = aPlayer.worldObj; + BlockEvent.BreakEvent event = new BlockEvent.BreakEvent( + aX, + aY, + aZ, + aWorld, + aWorld.getBlock(aX, aY, aZ), + aWorld.getBlockMetadata(aX, aY, aZ), + aPlayer); + MinecraftForge.EVENT_BUS.post(event); + if (!event.isCanceled()) { + if (!isSimulate) return aWorld.setBlockToAir(aX, aY, aZ); + return true; + } + return false; + } + + public static boolean setBlockByFakePlayer(FakePlayer aPlayer, int aX, int aY, int aZ, Block aBlock, int aMeta, + boolean isSimulate) { + if (aPlayer == null) return false; + World aWorld = aPlayer.worldObj; + BlockEvent.PlaceEvent event = ForgeEventFactory + .onPlayerBlockPlace(aPlayer, new BlockSnapshot(aWorld, aX, aY, aZ, aBlock, aMeta), UNKNOWN); + if (!event.isCanceled()) { + if (!isSimulate) return aWorld.setBlock(aX, aY, aZ, aBlock, aMeta, 3); + return true; + } + return false; + } + + public static int findMatchingStackInList(List aStacks, ItemStack aStack) { + if (isStackInvalid(aStack)) return -1; + for (int i = 0, aStacksSize = aStacks.size(); i < aStacksSize; i++) { + ItemStack tStack = aStacks.get(i); + if (areStacksEqual(aStack, tStack)) return i; + } + return -1; + } + + public static Map convertItemListToMap(Collection itemStacks) { + Map result = new Object2LongOpenHashMap<>(); + for (ItemStack itemStack : itemStacks) { + if (itemStack != null && itemStack.stackSize > 0) { + GTUtility.ItemId itemId = GTUtility.ItemId.createNoCopy(itemStack); + result.merge(itemId, (long) itemStack.stackSize, Long::sum); + } + } + return result; + } + + public static Map convertFluidListToMap(Collection fluidStacks) { + Map result = new Reference2LongOpenHashMap<>(); + for (FluidStack fluidStack : fluidStacks) { + if (fluidStack != null && fluidStack.amount > 0) { + result.merge(fluidStack.getFluid(), (long) fluidStack.amount, Long::sum); + } + } + return result; + } + + /** + * @return Supplied collection that doesn't contain invalid MetaTileEntities + */ + public static , E extends MetaTileEntity> T filterValidMTEs(T metaTileEntities) { + metaTileEntities.removeIf(mte -> mte == null || !mte.isValid()); + return metaTileEntities; + } + + public static ForgeDirection getSideFromPlayerFacing(Entity player) { + if (player == null) return ForgeDirection.UNKNOWN; + if (player.rotationPitch >= 65) return ForgeDirection.UP; + if (player.rotationPitch <= -65) return ForgeDirection.DOWN; + final byte facing = COMPASS_DIRECTIONS[MathHelper.floor_double(0.5D + 4.0F * player.rotationYaw / 360.0F) + & 0x3]; + return ForgeDirection.getOrientation(facing); + } + + public static class ItemNBT { + + public static void setNBT(ItemStack aStack, NBTTagCompound aNBT) { + if (aNBT == null) { + aStack.setTagCompound(null); + return; + } + ArrayList tTagsToRemove = new ArrayList<>(); + for (String tKey : aNBT.func_150296_c()) { + NBTBase tValue = aNBT.getTag(tKey); + if (tValue == null || (tValue instanceof NBTPrimitive && ((NBTPrimitive) tValue).func_150291_c() == 0) + || (tValue instanceof NBTTagString && isStringInvalid(((NBTTagString) tValue).func_150285_a_()))) + tTagsToRemove.add(tKey); + } + for (String tKey : tTagsToRemove) aNBT.removeTag(tKey); + aStack.setTagCompound(aNBT.hasNoTags() ? null : aNBT); + } + + public static NBTTagCompound getNBT(ItemStack aStack) { + NBTTagCompound rNBT = aStack.getTagCompound(); + return rNBT == null ? new NBTTagCompound() : rNBT; + } + + public static void setPunchCardData(ItemStack aStack, String aPunchCardData) { + NBTTagCompound tNBT = getNBT(aStack); + tNBT.setString("GT.PunchCardData", aPunchCardData); + setNBT(aStack, tNBT); + } + + public static String getPunchCardData(ItemStack aStack) { + NBTTagCompound tNBT = getNBT(aStack); + return tNBT.getString("GT.PunchCardData"); + } + + public static void setLighterFuel(ItemStack aStack, long aFuel) { + NBTTagCompound tNBT = getNBT(aStack); + tNBT.setLong("GT.LighterFuel", aFuel); + setNBT(aStack, tNBT); + } + + public static long getLighterFuel(ItemStack aStack) { + NBTTagCompound tNBT = getNBT(aStack); + return tNBT.getLong("GT.LighterFuel"); + } + + public static void setMapID(ItemStack aStack, short aMapID) { + NBTTagCompound tNBT = getNBT(aStack); + tNBT.setShort("map_id", aMapID); + setNBT(aStack, tNBT); + } + + public static short getMapID(ItemStack aStack) { + NBTTagCompound tNBT = getNBT(aStack); + if (!tNBT.hasKey("map_id")) return -1; + return tNBT.getShort("map_id"); + } + + public static void setBookTitle(ItemStack aStack, String aTitle) { + NBTTagCompound tNBT = getNBT(aStack); + tNBT.setString("title", aTitle); + setNBT(aStack, tNBT); + } + + public static String getBookTitle(ItemStack aStack) { + NBTTagCompound tNBT = getNBT(aStack); + return tNBT.getString("title"); + } + + public static void setBookAuthor(ItemStack aStack, String aAuthor) { + NBTTagCompound tNBT = getNBT(aStack); + tNBT.setString("author", aAuthor); + setNBT(aStack, tNBT); + } + + public static String getBookAuthor(ItemStack aStack) { + NBTTagCompound tNBT = getNBT(aStack); + return tNBT.getString("author"); + } + + public static void setProspectionData(ItemStack aStack, int aX, int aY, int aZ, int aDim, FluidStack aFluid, + String... aOres) { + NBTTagCompound tNBT = getNBT(aStack); + StringBuilder tData = new StringBuilder(aX + "," + aY + "," + aZ + "," + aDim + ","); + if (aFluid != null) tData.append(aFluid.amount) + .append(",") + .append(aFluid.getLocalizedName()) + .append(","); // TODO + // CHECK + // IF + // THAT + // /5000 + // is + // needed + // (Not + // needed) + for (String tString : aOres) { + tData.append(tString) + .append(","); + } + tNBT.setString("prospection", tData.toString()); + setNBT(aStack, tNBT); + } + + public static void setAdvancedProspectionData(byte aTier, ItemStack aStack, int aX, short aY, int aZ, int aDim, + ArrayList aOils, ArrayList aOres, int aRadius) { + + setBookTitle(aStack, "Raw Prospection Data"); + + NBTTagCompound tNBT = getNBT(aStack); + + tNBT.setByte("prospection_tier", aTier); + tNBT.setString("prospection_pos", "Dim: " + aDim + "\nX: " + aX + " Y: " + aY + " Z: " + aZ); + + // ores + Collections.sort(aOres); + tNBT.setString("prospection_ores", joinListToString(aOres)); + + // oils + ArrayList tOilsTransformed = new ArrayList<>(aOils.size()); + for (String aStr : aOils) { + String[] aStats = aStr.split(","); + tOilsTransformed.add(aStats[0] + ": " + aStats[1] + "L " + aStats[2]); + } + + tNBT.setString("prospection_oils", joinListToString(tOilsTransformed)); + + String tOilsPosStr = "X: " + Math.floorDiv(aX, 16 * 8) * 16 * 8 + + " Z: " + + Math.floorDiv(aZ, 16 * 8) * 16 * 8 + + "\n"; + int xOff = aX - Math.floorDiv(aX, 16 * 8) * 16 * 8; + xOff = xOff / 16; + int xOffRemain = 7 - xOff; + + int zOff = aZ - Math.floorDiv(aZ, 16 * 8) * 16 * 8; + zOff = zOff / 16; + int zOffRemain = 7 - zOff; + + for (; zOff > 0; zOff--) { + tOilsPosStr = tOilsPosStr.concat("--------\n"); + } + for (; xOff > 0; xOff--) { + tOilsPosStr = tOilsPosStr.concat("-"); + } + + tOilsPosStr = tOilsPosStr.concat("P"); + + for (; xOffRemain > 0; xOffRemain--) { + tOilsPosStr = tOilsPosStr.concat("-"); + } + tOilsPosStr = tOilsPosStr.concat("\n"); + for (; zOffRemain > 0; zOffRemain--) { + tOilsPosStr = tOilsPosStr.concat("--------\n"); + } + tOilsPosStr = tOilsPosStr.concat( + " X: " + (Math.floorDiv(aX, 16 * 8) + 1) * 16 * 8 + + " Z: " + + (Math.floorDiv(aZ, 16 * 8) + 1) * 16 * 8); // +1 oilfied to find bottomright of [5] + + tNBT.setString("prospection_oils_pos", tOilsPosStr); + + tNBT.setString("prospection_radius", String.valueOf(aRadius)); + + setNBT(aStack, tNBT); + } + + public static void convertProspectionData(ItemStack aStack) { + NBTTagCompound tNBT = getNBT(aStack); + byte tTier = tNBT.getByte("prospection_tier"); + + if (tTier == 0) { // basic prospection data + String tData = tNBT.getString("prospection"); + String[] tDataArray = tData.split(","); + if (tDataArray.length > 6) { + tNBT.setString( + "author", + " Dim: " + tDataArray[3] + + "X: " + + tDataArray[0] + + " Y: " + + tDataArray[1] + + " Z: " + + tDataArray[2]); + NBTTagList tNBTList = new NBTTagList(); + StringBuilder tOres = new StringBuilder(" Prospected Ores: "); + for (int i = 6; tDataArray.length > i; i++) { + tOres.append(tDataArray[i]) + .append(" "); + } + tNBTList.appendTag( + new NBTTagString( + "Tier " + tTier + + " Prospecting Data From: X" + + tDataArray[0] + + " Z:" + + tDataArray[2] + + " Dim:" + + tDataArray[3] + + " Produces " + + tDataArray[4] + + "L " + + tDataArray[5] + + " " + + tOres)); + tNBT.setTag("pages", tNBTList); + } + } else { // advanced prospection data + String tPos = tNBT.getString("prospection_pos"); + String tRadius = tNBT.getString("prospection_radius"); + + String tOresStr = tNBT.getString("prospection_ores"); + String tOilsStr = tNBT.getString("prospection_oils"); + String tOilsPosStr = tNBT.getString("prospection_oils_pos"); + + String[] tOres = tOresStr.isEmpty() ? null : tOresStr.split("\\|"); + String[] tOils = tOilsStr.isEmpty() ? null : tOilsStr.split("\\|"); + + NBTTagList tNBTList = new NBTTagList(); + + String tPageText = "Prospector report\n" + tPos + + "\n\n" + + "Oils: " + + (tOils != null ? tOils.length : 0) + + "\n\n" + + "Ores within " + + tRadius + + " blocks\n\n" + + "Location is center of orevein\n\n" + + "Check NEI to confirm orevein type"; + tNBTList.appendTag(new NBTTagString(tPageText)); + + if (tOres != null) fillBookWithList(tNBTList, "Ores Found %s\n\n", "\n", 7, tOres); + + if (tOils != null) fillBookWithList(tNBTList, "Oils%s\n\n", "\n", 9, tOils); + + tPageText = """ + Oil notes + + Prospects from NW to SE 576 chunks(9 8x8 oilfields) + around and gives min-max amount + + [1][2][3] + [4][5][6] + [7][8][9] + + [5] - Prospector in this 8x8 area"""; + tNBTList.appendTag(new NBTTagString(tPageText)); + + tPageText = "Corners of [5] are \n" + tOilsPosStr + "\n" + "P - Prospector in 8x8 field"; + tNBTList.appendTag(new NBTTagString(tPageText)); + + tNBT.setString("author", tPos.replace("\n", " ")); + tNBT.setTag("pages", tNBTList); + } + setNBT(aStack, tNBT); + } + + public static void fillBookWithList(NBTTagList aBook, String aPageHeader, String aListDelimiter, + int aItemsPerPage, String[] list) { + String aPageFormatter = " %d/%d"; + int tTotalPages = list.length / aItemsPerPage + (list.length % aItemsPerPage > 0 ? 1 : 0); + int tPage = 0; + StringBuilder tPageText; + do { + tPageText = new StringBuilder(); + for (int i = tPage * aItemsPerPage; i < (tPage + 1) * aItemsPerPage && i < list.length; i += 1) + tPageText.append((tPageText.length() == 0) ? "" : aListDelimiter) + .append(list[i]); + + if (tPageText.length() > 0) { + String tPageCounter = tTotalPages > 1 ? String.format(aPageFormatter, tPage + 1, tTotalPages) : ""; + NBTTagString tPageTag = new NBTTagString(String.format(aPageHeader, tPageCounter) + tPageText); + aBook.appendTag(tPageTag); + } + + ++tPage; + } while (tPageText.length() > 0); + } + + public static void addEnchantment(ItemStack aStack, Enchantment aEnchantment, int aLevel) { + NBTTagCompound tNBT = getNBT(aStack), tEnchantmentTag; + if (!tNBT.hasKey("ench", 9)) tNBT.setTag("ench", new NBTTagList()); + NBTTagList tList = tNBT.getTagList("ench", 10); + + boolean temp = true; + + for (int i = 0; i < tList.tagCount(); i++) { + tEnchantmentTag = tList.getCompoundTagAt(i); + if (tEnchantmentTag.getShort("id") == aEnchantment.effectId) { + tEnchantmentTag.setShort("id", (short) aEnchantment.effectId); + tEnchantmentTag.setShort("lvl", (byte) aLevel); + temp = false; + break; + } + } + + if (temp) { + tEnchantmentTag = new NBTTagCompound(); + tEnchantmentTag.setShort("id", (short) aEnchantment.effectId); + tEnchantmentTag.setShort("lvl", (byte) aLevel); + tList.appendTag(tEnchantmentTag); + } + aStack.setTagCompound(tNBT); + } + } + + public static String toSubscript(long no) { + char[] chars = Long.toString(no) + .toCharArray(); + for (int i = 0; i < chars.length; i++) { + chars[i] += 8272; + } + return new String(chars); + } + + public static boolean isPartOfMaterials(ItemStack aStack, Materials aMaterials) { + return GTOreDictUnificator.getAssociation(aStack) != null + && GTOreDictUnificator.getAssociation(aStack).mMaterial.mMaterial.equals(aMaterials); + } + + public static boolean isPartOfOrePrefix(ItemStack aStack, OrePrefixes aPrefix) { + return GTOreDictUnificator.getAssociation(aStack) != null + && GTOreDictUnificator.getAssociation(aStack).mPrefix.equals(aPrefix); + } + + public static final ImmutableSet ORE_BLOCK_CLASSES = ImmutableSet.of( + "bartworks.system.material.BWMetaGeneratedOres", + "bartworks.system.material.BWMetaGeneratedSmallOres", + "gtPlusPlus.core.block.base.BlockBaseOre"); + + public static boolean isOre(Block aBlock, int aMeta) { + return (aBlock instanceof BlockOresAbstract) || isOre(new ItemStack(aBlock, 1, aMeta)) + || ORE_BLOCK_CLASSES.contains( + aBlock.getClass() + .getName()); + } + + public static boolean isOre(ItemStack aStack) { + int tItem = GTUtility.stackToInt(aStack); + if (sOreTable.containsKey(tItem)) { + return sOreTable.get(tItem); + } + for (int id : OreDictionary.getOreIDs(aStack)) { + if (OreDictionary.getOreName(id) + .startsWith("ore")) { + sOreTable.put(tItem, true); + return true; + } + } + sOreTable.put(tItem, false); + return false; + } + + /** + * Do NOT mutate the returned {@code ItemStack}! We return {@code ItemStack} instead of {@code Block} so that + * we can include metadata. + */ + public static ItemStack getCobbleForOre(Block ore, short metaData) { + // We need to convert small ores to regular ores because small ores don't have associated ItemData. + // We take the modulus of the metadata by 16000 because that is the magic number to convert small ores to + // regular ores. + // See: GT_TileEntity_Ores.java + ItemData association = GTOreDictUnificator + .getAssociation(new ItemStack(Item.getItemFromBlock(ore), 1, metaData % 16000)); + if (association != null) { + Supplier supplier = sOreToCobble.get(association.mPrefix); + if (supplier != null) { + return supplier.get(); + } + } + return new ItemStack(Blocks.cobblestone); + } + + public static Optional reverseShapelessRecipe(ItemStack output, Object... aRecipe) { + if (output == null) { + return Optional.empty(); + } + + List inputs = new ArrayList<>(); + + for (Object o : aRecipe) { + if (o instanceof ItemStack) { + ItemStack toAdd = ((ItemStack) o).copy(); + inputs.add(toAdd); + } else if (o instanceof String) { + ItemStack stack = GTOreDictUnificator.get(o, 1); + if (stack == null) { + Optional oStack = OreDictionary.getOres((String) o) + .stream() + .findAny(); + if (oStack.isPresent()) { + ItemStack copy = oStack.get() + .copy(); + inputs.add(copy); + } + } else { + ItemStack copy = stack.copy(); + inputs.add(copy); + } + } else if (o instanceof Item) inputs.add(new ItemStack((Item) o)); + else if (o instanceof Block) inputs.add(new ItemStack((Block) o)); + else throw new IllegalStateException("A Recipe contains an invalid input! Output: " + output); + } + + inputs.removeIf(x -> x.getItem() instanceof MetaGeneratedTool); + + return Optional.of( + new GTRecipe( + false, + new ItemStack[] { output }, + inputs.toArray(new ItemStack[0]), + null, + null, + null, + null, + 300, + 30, + 0)); + } + + public static Optional reverseShapedRecipe(ItemStack output, Object... aRecipe) { + if (output == null) { + return Optional.empty(); + } + + Map recipeAsMap = new HashMap<>(); + Map ingridients = new HashMap<>(); + Map amounts = new HashMap<>(); + boolean startFound = false; + for (int i = 0, aRecipeLength = aRecipe.length; i < aRecipeLength; i++) { + Object o = aRecipe[i]; + if (!startFound) { + if (o instanceof String) { + for (Character c : ((String) o).toCharArray()) amounts.merge(c, 1, (a, b) -> ++a); + } else if (o instanceof Character) startFound = true; + } else if (!(o instanceof Character)) ingridients.put((Character) aRecipe[i - 1], o); + } + for (Map.Entry characterObjectEntry : ingridients.entrySet()) { + for (Map.Entry characterIntegerEntry : amounts.entrySet()) { + if (characterObjectEntry.getKey() != characterIntegerEntry.getKey()) continue; + recipeAsMap.put(characterObjectEntry.getValue(), characterIntegerEntry.getValue()); + } + } + List inputs = new ArrayList<>(); + + for (Map.Entry o : recipeAsMap.entrySet()) { + final int amount = o.getValue(); + if (o.getKey() instanceof ItemStack) { + ItemStack toAdd = ((ItemStack) o.getKey()).copy(); + toAdd.stackSize = amount; + inputs.add(toAdd); + } else if (o.getKey() instanceof String dictName) { + // Do not register tools dictName in inputs + if (ToolDictNames.contains(dictName)) continue; + ItemStack stack = GTOreDictUnificator.get(dictName, null, amount, false, true); + if (stack == null) { + Optional oStack = OreDictionary.getOres(dictName) + .stream() + .findAny(); + if (oStack.isPresent()) { + ItemStack copy = oStack.get() + .copy(); + copy.stackSize = amount; + inputs.add(copy); + } + } else { + ItemStack copy = stack.copy(); + copy.stackSize = amount; + inputs.add(copy); + } + } else if (o.getKey() instanceof Item) inputs.add(new ItemStack((Item) o.getKey(), amount)); + else if (o.getKey() instanceof Block) inputs.add(new ItemStack((Block) o.getKey(), amount)); + else throw new IllegalStateException("A Recipe contains an invalid input! Output: " + output); + } + + // Remove tools from inputs in case a recipe has one as a direct Item or ItemStack reference + inputs.removeIf(x -> x.getItem() instanceof MetaGeneratedTool); + + return Optional.of( + new GTRecipe( + false, + new ItemStack[] { output }, + inputs.toArray(new ItemStack[0]), + null, + null, + null, + null, + 300, + 30, + 0)); + } + + /** + * Add an itemstack to player inventory, or drop on ground if full. Can be called on client but it probably won't + * work very well. + */ + public static void addItemToPlayerInventory(EntityPlayer aPlayer, ItemStack aStack) { + if (isStackInvalid(aStack)) return; + if (!aPlayer.inventory.addItemStackToInventory(aStack) && !aPlayer.worldObj.isRemote) { + EntityItem dropItem = aPlayer.entityDropItem(aStack, 0); + dropItem.delayBeforeCanPickup = 0; + } + } + + public static long getNonnullElementCount(Object[] tArray) { + return Arrays.stream(tArray) + .filter(Objects::nonNull) + .count(); + } + + public static int clamp(int val, int lo, int hi) { + return MathHelper.clamp_int(val, lo, hi); + } + + public static int ceilDiv(int lhs, int rhs) { + return (lhs + rhs - 1) / rhs; + } + + public static long ceilDiv(long lhs, long rhs) { + return (lhs + rhs - 1) / rhs; + } + + /** + * Hash an item stack for the purpose of storing hash across launches + */ + public static int persistentHash(ItemStack aStack, boolean aUseStackSize, boolean aUseNBT) { + if (aStack == null) return 0; + int result = Objects.hashCode(GameRegistry.findUniqueIdentifierFor(aStack.getItem())); + result = result * 31 + Items.feather.getDamage(aStack); + + if (aUseStackSize) result = result * 31 + aStack.stackSize; + if (aUseNBT) result = result * 31 + Objects.hashCode(aStack.stackTagCompound); + return result; + } + + /** + * Hash an item stack for the purpose of storing hash across launches + */ + public static int persistentHash(FluidStack aStack, boolean aUseStackSize, boolean aUseNBT) { + if (aStack == null) return 0; + int base = Objects.hashCode( + aStack.getFluid() + .getName()); + + if (aUseStackSize) base = base * 31 + aStack.amount; + if (aUseNBT) base = base * 31 + Objects.hashCode(aStack.tag); + return base; + } + + public static int getCasingTextureIndex(Block block, int meta) { + if (block instanceof IHasIndexedTexture) return ((IHasIndexedTexture) block).getTextureIndex(meta); + return Textures.BlockIcons.ERROR_TEXTURE_INDEX; + } + + public static boolean isCellEmpty(ItemStack itemStack) { + if (itemStack == null) return false; + ItemStack tStack = ItemList.Cell_Empty.get(1); + tStack.stackSize = itemStack.stackSize; + return GTUtility.areStacksEqual(itemStack, tStack); + } + + /** + * Convert a cell to fluid. If given itemstack does not contain any fluid, return null. Will correctly multiple + * output fluid amount if input stack size is greater than 1. + */ + public static FluidStack convertCellToFluid(ItemStack itemStack) { + if (itemStack == null) return null; + if (getFluidForFilledItem(itemStack, true) != null) { + FluidStack fluidStack = getFluidForFilledItem(itemStack, true); + if (fluidStack != null) fluidStack.amount = fluidStack.amount * itemStack.stackSize; + return fluidStack; + } + return null; + } + + public static boolean isAnyIntegratedCircuit(ItemStack itemStack) { + if (itemStack == null) return false; + return itemStack.getItem() == ItemList.Circuit_Integrated.getItem() && 0 <= itemStack.getItemDamage() + && itemStack.getItemDamage() < 25; + } + + public static byte convertRatioToRedstone(long used, long max, int threshold, boolean inverted) { + byte signal; + if (used <= 0) { // Empty + signal = 0; + } else if (used >= max) { // Full + signal = 15; + } else { // Range 1-14 + signal = (byte) (1 + (14 * used) / max); + } + + if (inverted) { + signal = (byte) (15 - signal); + } + + if (threshold > 0) { + if (inverted && used >= threshold) { + return 0; + } else if (!inverted && used < threshold) { + return 0; + } + } + + return signal; + } + + public static ItemStack getNaniteAsCatalyst(Materials material) { + ItemStack aItem = material.getNanite(1); + return new ItemStack(aItem.getItem(), 0, aItem.getItemDamage()); + } + + public static Stream streamCompounds(NBTTagList list) { + if (list == null) return Stream.empty(); + return IntStream.range(0, list.tagCount()) + .mapToObj(list::getCompoundTagAt); + } + + public static boolean equals(ItemStack[] a, ItemStack[] b) { + // because stupid mojang didn't override equals for us + if (a == null && b == null) return true; + if ((a == null) != (b == null)) return false; + if (a.length != b.length) return false; + for (int i = 0; i < a.length; i++) { + if (!areStacksEqual(a[i], b[i], false)) return false; + } + return true; + } + + /** + * Guava ImmutableMap variant of Collectors.toMap. Optimized for serial streams. + */ + public static Collector> toImmutableMapSerial( + Function keyMapper, Function valueMapper) { + // petty type inference cannot work out the correct type parameter + return Collector., ImmutableMap>of( + ImmutableMap::builder, + (b, t) -> b.put(keyMapper.apply(t), valueMapper.apply(t)), + (b1, b2) -> b1.putAll(b2.build()), + ImmutableMap.Builder::build); + } + + public static boolean isArrayEmptyOrNull(Object[] arr) { + return arr == null || arr.length == 0; + } + + public static boolean isArrayOfLength(Object[] arr, int expectedLength) { + return arr != null && arr.length == expectedLength; + } + + @SafeVarargs + public static Collection concat(Collection... colls) { + return concat(Arrays.asList(colls)); + } + + public static Collection concat(Collection> colls) { + return new ConcatCollection<>(colls); + } + + private static class ConcatCollection extends AbstractCollection { + + private final Collection> colls; + private final int size; + + public ConcatCollection(Collection> lists) { + Collection> colls1 = null; + for (Collection list : lists) { + if (list == null || list.isEmpty()) { + colls1 = lists.stream() + .filter(c -> c != null && !c.isEmpty()) + .collect(Collectors.toList()); + break; + } + } + if (colls1 == null) colls1 = lists; + colls = colls1; + int sum = 0; + for (Collection list : colls) { + sum += list.size(); + } + size = sum; + } + + @Nonnull + @Override + public Iterator iterator() { + return colls.stream() + .flatMap(Collection::stream) + .iterator(); + } + + @Override + public int size() { + return size; + } + } + + @AutoValue + public abstract static class ItemId { + + public static ItemId create(NBTTagCompound tag) { + return new AutoValue_GTUtility_ItemId( + Item.getItemById(tag.getShort("item")), + tag.getShort("meta"), + tag.hasKey("tag", Constants.NBT.TAG_COMPOUND) ? tag.getCompoundTag("tag") : null); + } + + /** + * This method copies NBT, as it is mutable. + */ + public static ItemId create(ItemStack itemStack) { + NBTTagCompound nbt = itemStack.getTagCompound(); + if (nbt != null) { + nbt = (NBTTagCompound) nbt.copy(); + } + + return new AutoValue_GTUtility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), nbt); + } + + /** + * This method copies NBT, as it is mutable. + */ + public static ItemId create(Item item, int metaData, @Nullable NBTTagCompound nbt) { + if (nbt != null) { + nbt = (NBTTagCompound) nbt.copy(); + } + return new AutoValue_GTUtility_ItemId(item, metaData, nbt); + } + + /** + * This method stores metadata as wildcard and NBT as null. + */ + public static ItemId createAsWildcard(ItemStack itemStack) { + return new AutoValue_GTUtility_ItemId(itemStack.getItem(), W, null); + } + + /** + * This method stores NBT as null. + */ + public static ItemId createWithoutNBT(ItemStack itemStack) { + return new AutoValue_GTUtility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), null); + } + + /** + * This method does not copy NBT in order to save time. Make sure not to mutate it! + */ + public static ItemId createNoCopy(ItemStack itemStack) { + return new AutoValue_GTUtility_ItemId( + itemStack.getItem(), + Items.feather.getDamage(itemStack), + itemStack.getTagCompound()); + } + + /** + * This method does not copy NBT in order to save time. Make sure not to mutate it! + */ + public static ItemId createNoCopy(Item item, int metaData, @Nullable NBTTagCompound nbt) { + return new AutoValue_GTUtility_ItemId(item, metaData, nbt); + } + + protected abstract Item item(); + + protected abstract int metaData(); + + @Nullable + protected abstract NBTTagCompound nbt(); + + public NBTTagCompound writeToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setShort("item", (short) Item.getIdFromItem(item())); + tag.setShort("meta", (short) metaData()); + if (nbt() != null) tag.setTag("tag", nbt()); + return tag; + } + + @Nonnull + public ItemStack getItemStack() { + ItemStack itemStack = new ItemStack(item(), 1, metaData()); + itemStack.setTagCompound(nbt()); + return itemStack; + } + } + + public static int getPlasmaFuelValueInEUPerLiterFromMaterial(Materials material) { + return getPlasmaFuelValueInEUPerLiterFromFluid(material.getPlasma(1)); + } + + public static int getPlasmaFuelValueInEUPerLiterFromFluid(FluidStack aLiquid) { + if (aLiquid == null) return 0; + GTRecipe tFuel = RecipeMaps.plasmaFuels.getBackend() + .findFuel(aLiquid); + if (tFuel != null) return tFuel.mSpecialValue; + return 0; + } + + public static MovingObjectPosition getPlayerLookingTarget(EntityPlayer viewpoint) { + double reachDistance = viewpoint instanceof EntityPlayerMP mp ? mp.theItemInWorldManager.getBlockReachDistance() + : getClientReachDistance(); + Vec3 posVec = Vec3.createVectorHelper( + viewpoint.posX, + viewpoint.posY + (viewpoint.getEyeHeight() - viewpoint.getDefaultEyeHeight()), + viewpoint.posZ); + Vec3 lookVec = viewpoint.getLook(0); + Vec3 modifiedPosVec = posVec + .addVector(lookVec.xCoord * reachDistance, lookVec.yCoord * reachDistance, lookVec.zCoord * reachDistance); + + return viewpoint.worldObj.rayTraceBlocks(posVec, modifiedPosVec); + } + + public static float getClientReachDistance() { + return Minecraft.getMinecraft().playerController.getBlockReachDistance(); + } +} diff --git a/src/main/java/gregtech/api/util/GTUtilityClient.java b/src/main/java/gregtech/api/util/GTUtilityClient.java new file mode 100644 index 0000000000..a6039e10d3 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTUtilityClient.java @@ -0,0 +1,52 @@ +package gregtech.api.util; + +import java.lang.reflect.Field; +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import com.google.common.collect.Lists; + +import cpw.mods.fml.relauncher.ReflectionHelper; + +public class GTUtilityClient { + + private static final Field isDrawingField = ReflectionHelper + .findField(Tessellator.class, "isDrawing", "field_78415_z"); + + public static boolean isDrawing(Tessellator tess) { + try { + return isDrawingField.getBoolean(tess); + } catch (IllegalAccessException e) { + e.printStackTrace(); + return false; + } + } + + public static List getTooltip(ItemStack aStack, boolean aGuiStyle) { + try { + List tooltip = aStack.getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips); + if (aGuiStyle) { + tooltip.set( + 0, + (aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor + tooltip.get(0)); + for (int i = 1; i < tooltip.size(); i++) { + tooltip.set(i, EnumChatFormatting.GRAY + tooltip.get(i)); + } + } + return tooltip; + } catch (RuntimeException e) { + // Collections.singletonList() can not be added to. we don't want that + if (aGuiStyle) return Lists.newArrayList( + (aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor + + aStack.getDisplayName()); + return Lists.newArrayList(aStack.getDisplayName()); + } + } +} diff --git a/src/main/java/gregtech/api/util/GTWaila.java b/src/main/java/gregtech/api/util/GTWaila.java new file mode 100644 index 0000000000..a52dd2e459 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTWaila.java @@ -0,0 +1,23 @@ +package gregtech.api.util; + +public abstract class GTWaila { + + public static String getMachineProgressString(boolean isActive, int maxProgresstime, int progresstime) { + return getMachineProgressString(isActive, (long) maxProgresstime, (long) progresstime); + } + + public static String getMachineProgressString(boolean isActive, long maxProgresstime, long progresstime) { + + if (!isActive) return "Idle"; + + StringBuilder ret = new StringBuilder("In progress: ") + .append(String.format("%,.2f", (double) progresstime / 20)) + .append("s / ") + .append(String.format("%,.2f", (double) maxProgresstime / 20)) + .append("s (") + .append(GTUtility.formatNumbers((Math.round((double) progresstime / maxProgresstime * 1000) / 10.0))) + .append("%)"); + + return ret.toString(); + } +} diff --git a/src/main/java/gregtech/api/util/GT_ApiaryModifier.java b/src/main/java/gregtech/api/util/GT_ApiaryModifier.java deleted file mode 100644 index 4a89345670..0000000000 --- a/src/main/java/gregtech/api/util/GT_ApiaryModifier.java +++ /dev/null @@ -1,24 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.world.biome.BiomeGenBase; - -public class GT_ApiaryModifier { - - public float territory = 1f; - public float mutation = 1f; - public float lifespan = 1f; - public float production = 2f; - public float flowering = 1f; - public float geneticDecay = 1f; - public boolean isSealed = false; - public boolean isSelfLighted = false; - public boolean isSelfUnlighted = false; - public boolean isSunlightSimulated = false; - public boolean isAutomated = false; - public boolean isCollectingPollen = false; - public BiomeGenBase biomeOverride = null; - public float energy = 1f; - public float temperature = 0f; - public float humidity = 0f; - public int maxSpeed = 0; -} diff --git a/src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java b/src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java deleted file mode 100644 index 9ed7a56e1e..0000000000 --- a/src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java +++ /dev/null @@ -1,225 +0,0 @@ -package gregtech.api.util; - -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.biome.BiomeGenBase; - -import gregtech.api.enums.OrePrefixes; -import gregtech.common.items.GT_MetaGenerated_Item_03; - -/** - * Actual items are defined in {@link GT_MetaGenerated_Item_03} - */ -public enum GT_ApiaryUpgrade { - - speed1(UNIQUE_INDEX.SPEED_UPGRADE, 32200, 1, (mods, n) -> mods.maxSpeed = 1), - speed2(UNIQUE_INDEX.SPEED_UPGRADE, 32201, 1, (mods, n) -> mods.maxSpeed = 2), - speed3(UNIQUE_INDEX.SPEED_UPGRADE, 32202, 1, (mods, n) -> mods.maxSpeed = 3), - speed4(UNIQUE_INDEX.SPEED_UPGRADE, 32203, 1, (mods, n) -> mods.maxSpeed = 4), - speed5(UNIQUE_INDEX.SPEED_UPGRADE, 32204, 1, (mods, n) -> mods.maxSpeed = 5), - speed6(UNIQUE_INDEX.SPEED_UPGRADE, 32205, 1, (mods, n) -> mods.maxSpeed = 6), - speed7(UNIQUE_INDEX.SPEED_UPGRADE, 32206, 1, (mods, n) -> mods.maxSpeed = 7), - speed8(UNIQUE_INDEX.SPEED_UPGRADE, 32207, 1, (mods, n) -> mods.maxSpeed = 8), - speed8upgraded(UNIQUE_INDEX.SPEED_UPGRADE, 32208, 1, (mods, n) -> { - mods.maxSpeed = 8; - mods.production = 17.19926784f; - mods.energy *= 14.75; - }), - production(UNIQUE_INDEX.PRODUCTION_UPGRADE, 32209, 8, (mods, n) -> { - mods.production = 4.f * (float) Math.pow(1.2d, n); - mods.energy *= Math.pow(1.4f, n); - }), - plains(UNIQUE_INDEX.PLAINS_UPGRADE, 32210, 1, (mods, n) -> { - mods.biomeOverride = BiomeGenBase.plains; - mods.energy *= 1.2f; - }), - light(UNIQUE_INDEX.LIGHT_UPGRADE, 32211, 1, (mods, n) -> { - mods.isSelfLighted = true; - mods.energy *= 1.05f; - }), - flowering(UNIQUE_INDEX.FLOWERING_UPGRADE, 32212, 8, (mods, n) -> { - mods.flowering *= Math.pow(1.2f, n); - mods.energy *= Math.pow(1.1f, n); - }), - winter(UNIQUE_INDEX.WINTER_UPGRADE, 32213, 1, (mods, n) -> { - mods.biomeOverride = BiomeGenBase.taiga; - mods.energy *= 1.5f; - }), - dryer(UNIQUE_INDEX.DRYER_UPGRADE, 32214, 16, (mods, n) -> { - mods.humidity -= 0.125f * n; - mods.energy *= Math.pow(1.025f, n); - }), - automation(UNIQUE_INDEX.AUTOMATION_UPGRADE, 32215, 1, (mods, n) -> { - mods.isAutomated = true; - mods.energy *= 1.1f; - }), - humidifier(UNIQUE_INDEX.HUMIDIFIER_UPGRADE, 32216, 16, (mods, n) -> { - mods.humidity += 0.125f * n; - mods.energy *= Math.pow(1.05f, n); - }), - hell(UNIQUE_INDEX.HELL_UPGRADE, 32217, 1, (mods, n) -> { - mods.biomeOverride = BiomeGenBase.hell; - mods.energy *= 1.5f; - }), - pollen(UNIQUE_INDEX.POLLEN_UPGRADE, 32218, 1, (mods, n) -> { - mods.flowering = 0f; - mods.energy *= 1.3f; - }), - desert(UNIQUE_INDEX.DESERT_UPGRADE, 32219, 1, (mods, n) -> { - mods.biomeOverride = BiomeGenBase.desert; - mods.energy *= 1.2f; - }), - cooler(UNIQUE_INDEX.COOLER_UPGRADE, 32220, 16, (mods, n) -> { - mods.temperature -= 0.125f * n; - mods.energy *= Math.pow(1.025f, n); - }), - lifespan(UNIQUE_INDEX.LIFESPAN_UPGRADE, 32221, 4, (mods, n) -> { - mods.lifespan /= Math.pow(1.5f, n); - mods.energy *= Math.pow(1.05f, n); - }), - seal(UNIQUE_INDEX.SEAL_UPGRADE, 32222, 1, (mods, n) -> { - mods.isSealed = true; - mods.energy *= 1.05f; - }), - stabilizer(UNIQUE_INDEX.STABILIZER_UPGRADE, 32223, 1, (mods, n) -> { - mods.geneticDecay = 0f; - mods.energy *= 2.50f; - }), - jungle(UNIQUE_INDEX.JUNGLE_UPGRADE, 32224, 1, (mods, n) -> { - mods.biomeOverride = BiomeGenBase.jungle; - mods.energy *= 1.20f; - }), - territory(UNIQUE_INDEX.TERRITORY_UPGRADE, 32225, 4, (mods, n) -> { - mods.territory *= Math.pow(1.5f, n); - mods.energy *= Math.pow(1.05f, n); - }), - ocean(UNIQUE_INDEX.OCEAN_UPGRADE, 32226, 1, (mods, n) -> { - mods.biomeOverride = BiomeGenBase.ocean; - mods.energy *= 1.20f; - }), - sky(UNIQUE_INDEX.SKY_UPGRADE, 32227, 1, (mods, n) -> { - mods.isSunlightSimulated = true; - mods.energy *= 1.05f; - }), - heater(UNIQUE_INDEX.HEATER_UPGRADE, 32228, 16, (mods, n) -> { - mods.temperature += 0.125f * n; - mods.energy *= Math.pow(1.025f, n); - }), - sieve(UNIQUE_INDEX.SIEVE_UPGRADE, 32229, 1, (mods, n) -> { - mods.isCollectingPollen = true; - mods.energy *= 1.05f; - }), - unlight(UNIQUE_INDEX.LIGHT_UPGRADE, 32231, 1, (mods, n) -> { - mods.isSelfUnlighted = true; - mods.energy *= 1.05f; - }),; - - private enum UNIQUE_INDEX { - - SPEED_UPGRADE, - PRODUCTION_UPGRADE, - PLAINS_UPGRADE, - LIGHT_UPGRADE, // also unlight - FLOWERING_UPGRADE, - WINTER_UPGRADE, - DRYER_UPGRADE, - AUTOMATION_UPGRADE, - HUMIDIFIER_UPGRADE, - HELL_UPGRADE, - POLLEN_UPGRADE, - DESERT_UPGRADE, - COOLER_UPGRADE, - LIFESPAN_UPGRADE, - SEAL_UPGRADE, - STABILIZER_UPGRADE, - JUNGLE_UPGRADE, - TERRITORY_UPGRADE, - OCEAN_UPGRADE, - SKY_UPGRADE, - HEATER_UPGRADE, - SIEVE_UPGRADE,; - - void apply(Consumer fn) { - UNIQUE_UPGRADE_LIST.get(this) - .forEach(fn); - } - } - - private static final EnumMap> UNIQUE_UPGRADE_LIST = new EnumMap<>( - UNIQUE_INDEX.class); - - private int meta = 0; - private int maxnumber = 1; - - private final GT_Utility.ItemId id; - private final UNIQUE_INDEX unique_index; - private final BiConsumer applier; - - private final HashSet blacklistedUpgrades = new HashSet<>(); - - GT_ApiaryUpgrade(UNIQUE_INDEX unique_index, int meta, int maxnumber, - BiConsumer applier) { - this.unique_index = unique_index; - this.meta = meta; - this.maxnumber = maxnumber; - this.applier = applier; - this.id = GT_Utility.ItemId.createNoCopy(get(1)); - } - - private void setup_static_variables() { - quickLookup.put(this.meta, this); - ArrayList un = UNIQUE_UPGRADE_LIST.get(this.unique_index); - if (un != null) un.forEach((u) -> { - u.blacklistedUpgrades.add(this.id); - this.blacklistedUpgrades.add(u.id); - }); - else { - un = new ArrayList<>(1); - UNIQUE_UPGRADE_LIST.put(this.unique_index, un); - } - un.add(this); - } - - public static GT_ApiaryUpgrade getUpgrade(ItemStack s) { - if (s == null) return null; - if (!isUpgrade(s)) return null; - return quickLookup.get(s.getItemDamage()); - } - - public boolean isAllowedToWorkWith(ItemStack s) { - GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(s); - return !blacklistedUpgrades.contains(id); - } - - public int getMaxNumber() { - return maxnumber; - } - - public void applyModifiers(GT_ApiaryModifier mods, ItemStack stack) { - if (applier != null) applier.accept(mods, stack.stackSize); - } - - public ItemStack get(int count) { - return new ItemStack(GT_MetaGenerated_Item_03.INSTANCE, count, meta); - } - - public static boolean isUpgrade(ItemStack s) { - return OrePrefixes.apiaryUpgrade.contains(s); - } - - private static final HashMap quickLookup = new HashMap<>(); - - static { - EnumSet.allOf(GT_ApiaryUpgrade.class) - .forEach(GT_ApiaryUpgrade::setup_static_variables); - speed8upgraded.blacklistedUpgrades.add(production.id); - production.blacklistedUpgrades.add(speed8upgraded.id); - } -} diff --git a/src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java b/src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java deleted file mode 100644 index dbe0ff2c40..0000000000 --- a/src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java +++ /dev/null @@ -1,559 +0,0 @@ -package gregtech.api.util; - -import static gregtech.GT_Mod.GT_FML_LOGGER; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.nbt.NBTTagString; -import net.minecraftforge.common.util.Constants.NBT; -import net.minecraftforge.fluids.FluidStack; - -import cpw.mods.fml.common.FMLCommonHandler; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_Recipe.GT_Recipe_AssemblyLine; - -public class GT_AssemblyLineUtils { - - /** - * A cache of Recipes using the Output as Key. - */ - private static final HashMap sRecipeCacheByOutput = new HashMap<>(); - /** - * A cache of Recipes using the Recipe Hash String as Key. - */ - private static final HashMap sRecipeCacheByRecipeHash = new HashMap<>(); - - /** - * Checks the DataStick for deprecated/invalid recipes, updating them as required. - * - * @param aDataStick - The DataStick to process - * @return Is this DataStick now valid with a current recipe? - */ - public static GT_Recipe_AssemblyLine processDataStick(ItemStack aDataStick) { - if (!isItemDataStick(aDataStick)) { - return null; - } - if (doesDataStickNeedUpdate(aDataStick)) { - ItemStack aStickOutput = getDataStickOutput(aDataStick); - if (aStickOutput != null) { - GT_Recipe_AssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput); - if (aIntendedRecipe != null && setAssemblyLineRecipeOnDataStick(aDataStick, aIntendedRecipe)) - return aIntendedRecipe; - } - } - return null; - } - - /** - * Finds an Assembly Line recipe from a DataStick. - * - * @param aDataStick - The DataStick to check. - * @return The GT_Recipe_AssemblyLine recipe contained on the DataStick, if any. - */ - public static GT_Recipe_AssemblyLine findAssemblyLineRecipeFromDataStick(ItemStack aDataStick) { - return findAssemblyLineRecipeFromDataStick(aDataStick, false).getRecipe(); - } - - /** - * Finds an Assembly Line recipe from a DataStick. - * - * @param aDataStick - The DataStick to check. - * @param aReturnBuiltRecipe - Do we return a GT_Recipe_AssemblyLine built from the data on the Data Stick instead - * of searching the Recipe Map? - * @return The GT_Recipe_AssemblyLine recipe contained on the DataStick, if any. - */ - @Nonnull - public static LookupResult findAssemblyLineRecipeFromDataStick(ItemStack aDataStick, boolean aReturnBuiltRecipe) { - if (!isItemDataStick(aDataStick) || !doesDataStickHaveOutput(aDataStick)) { - return LookupResultType.INVALID_STICK.getResult(); - } - List aInputs = new ArrayList<>(16); - ItemStack aOutput = getDataStickOutput(aDataStick); - List> mOreDictAlt = new ArrayList<>(16); - List aFluidInputs = new ArrayList<>(4); - - NBTTagCompound aTag = aDataStick.getTagCompound(); - if (aTag == null) { - return LookupResultType.INVALID_STICK.getResult(); - } - - // Get From Cache - if (doesDataStickHaveRecipeHash(aDataStick)) { - GT_Recipe_AssemblyLine aRecipeFromCache = sRecipeCacheByRecipeHash.get(getHashFromDataStack(aDataStick)); - if (aRecipeFromCache != null && GT_Utility.areStacksEqual(aOutput, aRecipeFromCache.mOutput)) { - return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipeFromCache); - } // else: no cache, or the old recipe run into a hash collision with a different new recipe - } - - for (int i = 0; i < 16; i++) { - int count = aTag.getInteger("a" + i); - if (!aTag.hasKey("" + i) && count <= 0) { - continue; - } - - List tAltCurrent = new ArrayList<>(); - for (int j = 0; j < count; j++) { - ItemStack tLoaded = GT_Utility.loadItem(aTag, "a" + i + ":" + j); - if (tLoaded == null) { - continue; - } - tAltCurrent.add(tLoaded); - if (GT_Values.D1) { - GT_FML_LOGGER.info("Item Alt " + i + " : " + tLoaded.getUnlocalizedName()); - } - } - mOreDictAlt.add(tAltCurrent); - ItemStack tLoaded = GT_Utility.loadItem(aTag, "" + i); - if (tLoaded == null) { - continue; - } - aInputs.add(tLoaded); - if (GT_Values.D1) { - GT_FML_LOGGER.info("Item " + i + " : " + tLoaded.getUnlocalizedName()); - } - } - - if (GT_Values.D1) { - GT_FML_LOGGER.info("All Items done, start fluid check"); - } - for (int i = 0; i < 4; i++) { - if (!aTag.hasKey("f" + i)) continue; - FluidStack tLoaded = GT_Utility.loadFluid(aTag, "f" + i); - if (tLoaded == null) continue; - aFluidInputs.add(tLoaded); - if (GT_Values.D1) { - GT_FML_LOGGER.info("Fluid " + i + " " + tLoaded.getUnlocalizedName()); - } - } - if (!aTag.hasKey("output") || !aTag.hasKey("time") - || aTag.getInteger("time") <= 0 - || !aTag.hasKey("eu") - || !GT_Utility.isStackValid(aOutput)) { - return LookupResultType.INVALID_STICK.getResult(); - } - if (GT_Values.D1) { - GT_FML_LOGGER.info("Found Data Stick recipe"); - } - - int aTime = aTag.getInteger("time"); - int aEU = aTag.getInteger("eu"); - - // Try build a recipe instance - if (aReturnBuiltRecipe) { - return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult( - new GT_Recipe_AssemblyLine( - null, - 0, - aInputs.toArray(new ItemStack[0]), - aFluidInputs.toArray(new FluidStack[0]), - aOutput, - aTime, - aEU)); - } - - for (GT_Recipe_AssemblyLine aRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) { - if (aRecipe.mEUt != aEU || aRecipe.mDuration != aTime) continue; - if (!GT_Utility.areStacksEqual(aOutput, aRecipe.mOutput, true)) continue; - if (!GT_Utility.areStackListsEqual(Arrays.asList(aRecipe.mInputs), aInputs, false, true)) continue; - if (!Objects.equals(Arrays.asList(aRecipe.mFluidInputs), aFluidInputs)) continue; - if (!areStacksEqual(aRecipe.mOreDictAlt, mOreDictAlt)) continue; - - // Cache it - String aRecipeHash = generateRecipeHash(aRecipe); - sRecipeCacheByRecipeHash.put(aRecipeHash, aRecipe); - sRecipeCacheByOutput.put(new GT_ItemStack(aRecipe.mOutput), aRecipe); - if (doesDataStickHaveRecipeHash(aDataStick)) { - String aStickHash = getHashFromDataStack(aDataStick); - if (aRecipeHash.equals(aStickHash)) - return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipe); - } - return LookupResultType.VALID_STACK_AND_VALID_RECIPE.getResult(aRecipe); - } - return LookupResultType.VALID_STACK_BUT_INVALID_RECIPE.getResult(); - } - - private static boolean areStacksEqual(ItemStack[][] lhs, List> rhs) { - for (int i = 0; i < lhs.length; i++) { - if (!areStacksEqual(lhs[i], rhs.get(i))) return false; - } - return true; - } - - private static boolean areStacksEqual(ItemStack[] lhs, List rhs) { - return lhs == null ? rhs.isEmpty() - : !rhs.isEmpty() && GT_Utility.areStackListsEqual(Arrays.asList(lhs), rhs, false, true); - } - - /** - * Finds a GT_Recipe_AssemblyLine based on the expected output ItemStack. - * - * @param aOutput - The Output of a GT_Recipe_AssemblyLine. - * @return First found GT_Recipe_AssemblyLine with matching output. - */ - public static GT_Recipe_AssemblyLine findAssemblyLineRecipeByOutput(ItemStack aOutput) { - if (aOutput == null) { - return null; - } - - // Check the cache - GT_ItemStack aCacheStack = new GT_ItemStack(aOutput); - GT_Recipe_AssemblyLine aRecipeFromCache = sRecipeCacheByOutput.get(aCacheStack); - if (aRecipeFromCache != null) { - return aRecipeFromCache; - } - - // Iterate all recipes and return the first matching based on Output. - for (GT_Recipe_AssemblyLine aRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) { - ItemStack aRecipeOutput = aRecipe.mOutput; - if (GT_Utility.areStacksEqual(aRecipeOutput, aOutput)) { - // Cache it to prevent future iterations of all recipes - sRecipeCacheByOutput.put(aCacheStack, aRecipe); - sRecipeCacheByRecipeHash.put(generateRecipeHash(aRecipe), aRecipe); - return aRecipe; - } - } - return null; - } - - /** - * @param aRecipe - The recipe to generate a Recipe Hash String from. - * @return The Recipe Hash String. - */ - public static String generateRecipeHash(GT_Recipe_AssemblyLine aRecipe) { - String aHash = "Invalid.Recipe.Hash"; - if (aRecipe != null) { - aHash = "Hash." + aRecipe.getPersistentHash(); - } - return aHash; - } - - /** - * @param aRecipe - The recipe to add to internal caches - * @throws IllegalArgumentException if given recipe collide with any existing recipe in the cache - */ - public static void addRecipeToCache(GT_Recipe_AssemblyLine aRecipe) { - if (aRecipe != null) { - String aHash = "Hash." + aRecipe.getPersistentHash(); - GT_Recipe_AssemblyLine existing = sRecipeCacheByOutput.put(new GT_ItemStack(aRecipe.mOutput), aRecipe); - if (existing != null) throw new IllegalArgumentException("Duplicate assline recipe for " + aRecipe.mOutput); - existing = sRecipeCacheByRecipeHash.put(aHash, aRecipe); - if (existing != null && !existing.equals(aRecipe)) - throw new IllegalArgumentException("Recipe hash collision for " + aRecipe + " and " + existing); - } - } - - /** - * @param aHash - Recipe hash String, may be null but will just be treated as invalid. - * @return Is this Recipe Hash String valid? - */ - public static boolean isValidHash(String aHash) { - if (aHash != null && aHash.length() > 0) { - // persistent hash can never be 0 - return !aHash.equals("Invalid.Recipe.Hash") && !aHash.equals("Hash.0"); - } - return false; - } - - /** - * @param aStack - The ItemStack to check. - * @return Is this ItemStack a Data Stick? - */ - public static boolean isItemDataStick(ItemStack aStack) { - return GT_Utility.isStackValid(aStack) && ItemList.Tool_DataStick.isStackEqual(aStack, false, true); - } - - /** - * @param aDataStick - The Data Stick to check. - * @return Does this Data Stick have a valid output ItemStack? - */ - public static boolean doesDataStickHaveOutput(ItemStack aDataStick) { - return isItemDataStick(aDataStick) && aDataStick.hasTagCompound() - && aDataStick.getTagCompound() - .hasKey("output"); - } - - /** - * @param aDataStick - The Data Stick to check. - * @return Does this Data Stick need recipe data updated. - */ - public static boolean doesDataStickNeedUpdate(ItemStack aDataStick) { - if (isItemDataStick(aDataStick) && doesDataStickHaveRecipeHash(aDataStick)) { - String aStickHash = getHashFromDataStack(aDataStick); - if (isValidHash(aStickHash) && doesDataStickHaveOutput(aDataStick)) { - ItemStack aStickOutput = getDataStickOutput(aDataStick); - GT_Recipe_AssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput); - return !aStickHash.equals(generateRecipeHash(aIntendedRecipe)); - } - } - return true; - } - - /** - * @param aDataStick - The Data Stick to check. - * @return Does this have a Recipe Hash String at all? - */ - public static boolean doesDataStickHaveRecipeHash(ItemStack aDataStick) { - if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { - NBTTagCompound aNBT = aDataStick.getTagCompound(); - return aNBT.hasKey("Data.Recipe.Hash") && !aNBT.getString("Data.Recipe.Hash") - .equals("Hash.0"); - } - return false; - } - - /** - * Get the Output ItemStack from a Data Stick. - * - * @param aDataStick - The Data Stick to check. - * @return Output ItemStack contained on the Data Stick. - */ - public static ItemStack getDataStickOutput(ItemStack aDataStick) { - if (doesDataStickHaveOutput(aDataStick)) { - return GT_Utility.loadItem(aDataStick.getTagCompound(), "output"); - } - return null; - } - - /** - * @param aDataStick - The Data Stick to process. - * @return The stored Recipe Hash String on the Data Stick, will return an invalid Hash if one is not found. - *

- * The hash will be guaranteed to pass isValidHash(). - *

- * Will not return Null. - */ - public static String getHashFromDataStack(ItemStack aDataStick) { - if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { - NBTTagCompound aNBT = aDataStick.getTagCompound(); - if (aNBT.hasKey("Data.Recipe.Hash", NBT.TAG_STRING)) { - String hash = aNBT.getString("Data.Recipe.Hash"); - if (isValidHash(hash)) return hash; - } - } - return "Invalid.Recipe.Hash"; - } - - /** - * - * @param aDataStick - The Data Stick to update. - * @param aRecipeHash - The Recipe Hash String to update with. - * @return Did we update the Recipe Hash String on the Data Stick? - */ - public static boolean setRecipeHashOnDataStick(ItemStack aDataStick, String aRecipeHash) { - if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { - NBTTagCompound aNBT = aDataStick.getTagCompound(); - aNBT.setString("Data.Recipe.Hash", aRecipeHash); - aDataStick.setTagCompound(aNBT); - return true; - } - return false; - } - - /** - * - * @param aDataStick - The Data Stick to update. - * @param aNewRecipe - The New GT_Recipe_AssemblyLine recipe to update it with. - * @return Did we set the new recipe data & Recipe Hash String on the Data Stick? - */ - public static boolean setAssemblyLineRecipeOnDataStick(ItemStack aDataStick, GT_Recipe_AssemblyLine aNewRecipe) { - return setAssemblyLineRecipeOnDataStick(aDataStick, aNewRecipe, true); - } - - public static boolean setAssemblyLineRecipeOnDataStick(ItemStack aDataStick, GT_Recipe_AssemblyLine aNewRecipe, - boolean setUpdateTime) { - if (isItemDataStick(aDataStick) && aNewRecipe.mOutput != null) { - String s = aNewRecipe.mOutput.getDisplayName(); - if (FMLCommonHandler.instance() - .getEffectiveSide() - .isServer()) { - s = GT_Assemblyline_Server.lServerNames.get(aNewRecipe.mOutput.getDisplayName()); - if (s == null) { - s = aNewRecipe.mOutput.getDisplayName(); - } - } - - String aHash = generateRecipeHash(aNewRecipe); - if (GT_Values.D1) { - GT_Recipe_AssemblyLine aOldRecipe = findAssemblyLineRecipeFromDataStick(aDataStick, true).recipe; - GT_FML_LOGGER.info( - "Updating data stick: " + aDataStick.getDisplayName() - + " | Old Recipe Hash: " - + generateRecipeHash(aOldRecipe) - + ", New Recipe Hash: " - + aHash); - } - - String author = "Assembling Line Recipe Generator"; - String displayName = null; - if (aDataStick.hasTagCompound()) { - NBTTagCompound tag = aDataStick.getTagCompound(); - if (tag.hasKey("author", NBT.TAG_STRING)) { - author = tag.getString("author"); - } - if (tag.hasKey("display", NBT.TAG_COMPOUND)) { - NBTTagCompound displayTag = tag.getCompoundTag("display"); - if (displayTag.hasKey("Name", NBT.TAG_STRING)) displayName = displayTag.getString("Name"); - } - } - - // remove possible old NBTTagCompound - aDataStick.setTagCompound(new NBTTagCompound()); - if (displayName != null) aDataStick.setStackDisplayName(displayName); - if (GT_Values.D1) { - GT_Utility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data (" + aHash + ")"); - } else { - GT_Utility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data"); - } - - NBTTagCompound tNBT = aDataStick.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - - tNBT.setTag("output", aNewRecipe.mOutput.writeToNBT(new NBTTagCompound())); - tNBT.setInteger("time", aNewRecipe.mDuration); - tNBT.setInteger("eu", aNewRecipe.mEUt); - tNBT.setString("author", author); - NBTTagList tNBTList = new NBTTagList(); - tNBTList.appendTag( - new NBTTagString( - "Construction plan for " + aNewRecipe.mOutput.stackSize - + " " - + s - + ". Needed EU/t: " - + aNewRecipe.mEUt - + " Production time: " - + (aNewRecipe.mDuration / 20))); - for (int i = 0; i < aNewRecipe.mInputs.length; i++) { - boolean hasSetOreDictAlt = false; - - if (aNewRecipe.mOreDictAlt[i] != null && aNewRecipe.mOreDictAlt[i].length > 0) { - tNBT.setInteger("a" + i, aNewRecipe.mOreDictAlt[i].length); - int count = 0; - StringBuilder tBuilder = new StringBuilder("Input Bus " + (i + 1) + ": "); - for (int j = 0; j < aNewRecipe.mOreDictAlt[i].length; j++) { - ItemStack tStack = aNewRecipe.mOreDictAlt[i][j]; - if (tStack != null) { - tNBT.setTag("a" + i + ":" + j, tStack.writeToNBT(new NBTTagCompound())); - - s = tStack.getDisplayName(); - if (FMLCommonHandler.instance() - .getEffectiveSide() - .isServer()) { - s = GT_Assemblyline_Server.lServerNames.get(tStack.getDisplayName()); - if (s == null) s = tStack.getDisplayName(); - } - - tBuilder.append(count == 0 ? "" : "\nOr ") - .append(tStack.stackSize) - .append(" ") - .append(s); - count++; - } - } - if (count > 0) { - tNBTList.appendTag(new NBTTagString(tBuilder.toString())); - hasSetOreDictAlt = true; - } - } - - if (aNewRecipe.mInputs[i] != null) { - tNBT.setTag("" + i, aNewRecipe.mInputs[i].writeToNBT(new NBTTagCompound())); - - if (!hasSetOreDictAlt) { - s = aNewRecipe.mInputs[i].getDisplayName(); - if (FMLCommonHandler.instance() - .getEffectiveSide() - .isServer()) { - s = GT_Assemblyline_Server.lServerNames.get(aNewRecipe.mInputs[i].getDisplayName()); - if (s == null) s = aNewRecipe.mInputs[i].getDisplayName(); - } - tNBTList.appendTag( - new NBTTagString( - "Input Bus " + (i + 1) + ": " + aNewRecipe.mInputs[i].stackSize + " " + s)); - } - } - } - for (int i = 0; i < aNewRecipe.mFluidInputs.length; i++) { - if (aNewRecipe.mFluidInputs[i] != null) { - tNBT.setTag("f" + i, aNewRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound())); - - s = aNewRecipe.mFluidInputs[i].getLocalizedName(); - if (FMLCommonHandler.instance() - .getEffectiveSide() - .isServer()) { - s = GT_Assemblyline_Server.lServerNames.get(aNewRecipe.mFluidInputs[i].getLocalizedName()); - if (s == null) s = aNewRecipe.mFluidInputs[i].getLocalizedName(); - } - tNBTList.appendTag( - new NBTTagString( - "Input Hatch " + (i + 1) + ": " + aNewRecipe.mFluidInputs[i].amount + "L " + s)); - } - } - tNBT.setTag("pages", tNBTList); - if (setUpdateTime) tNBT.setLong("lastUpdate", System.currentTimeMillis()); - aDataStick.setTagCompound(tNBT); - // Set recipe hash - setRecipeHashOnDataStick(aDataStick, aHash); - return true; - } - return false; - } - - public enum LookupResultType { - - INVALID_STICK(true), - VALID_STACK_BUT_INVALID_RECIPE(true), - VALID_STACK_AND_VALID_RECIPE(false), - VALID_STACK_AND_VALID_HASH(false); - - private final boolean recipeNull; - private LookupResult singletonResult; - - LookupResultType(boolean recipeNull) { - this.recipeNull = recipeNull; - } - - public LookupResult getResult() { - if (!recipeNull) throw new IllegalArgumentException("This result type require a nonnull recipe"); - if (singletonResult == null) singletonResult = new LookupResult(null, this); - return singletonResult; - } - - public LookupResult getResult(GT_Recipe_AssemblyLine recipe) { - if ((recipe == null) != recipeNull) - throw new IllegalArgumentException("This result type does not allow given input"); - return new LookupResult(recipe, this); - } - } - - public static class LookupResult { - - private final GT_Recipe_AssemblyLine recipe; - private final LookupResultType type; - - LookupResult(GT_Recipe_AssemblyLine recipe, LookupResultType type) { - this.recipe = recipe; - this.type = type; - } - - public GT_Recipe_AssemblyLine getRecipe() { - return recipe; - } - - public LookupResultType getType() { - return type; - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java b/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java deleted file mode 100644 index 4c0348683a..0000000000 --- a/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java +++ /dev/null @@ -1,297 +0,0 @@ -package gregtech.api.util; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -import net.minecraftforge.common.config.ConfigCategory; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; - -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.MaterialsBotania; - -public class GT_Assemblyline_Server { - - public static LinkedHashMap lServerNames = new LinkedHashMap<>(); - private static LinkedHashMap internal2 = new LinkedHashMap<>(), internal3 = new LinkedHashMap<>(), - internal4 = new LinkedHashMap<>(); - private static HashMap internal = new HashMap<>(); - - public static void fillMap(FMLPreInitializationEvent aEvent) { - Configuration conf = GT_LanguageManager.sEnglishFile; - - ConfigCategory cat = conf.getCategory("languagefile"); - internal.putAll(cat.getValues()); - for (Map.Entry entry : internal.entrySet()) { - try { - String s = entry.getValue() - .getString() - .replaceAll("%", ""); - - if (entry.getKey() - .contains("metaitem") && s.contains("material")) internal2.put(entry.getKey(), s); - else if (entry.getKey() - .contains("blockmachines") && s.contains("material")) internal3.put(entry.getKey(), s); - else if ((entry.getKey() - .contains("blockores") - || (entry.getKey() - .contains("blockmetal") - || entry.getKey() - .contains("blockgem"))) - && s.contains("material")) internal4.put(entry.getKey(), s); - else lServerNames.put(entry.getKey(), s); - } catch (Exception ignored) {} - } - for (Map.Entry entry : internal2.entrySet()) { - try { - if (entry.getKey() - .contains("name")) { - int i = Integer.parseInt( - entry.getKey() - .substring( - "gt.metaitem.01.".length(), - entry.getKey() - .length() - ".name".length())); - i = i % 1000; - if (GregTech_API.sGeneratedMaterials[i] != null) lServerNames.put( - entry.getKey(), - entry.getValue() - .replace("material", GregTech_API.sGeneratedMaterials[i].toString())); - else lServerNames.put(entry.getKey(), null); - } - } catch (Exception ignored) {} - } - for (Map.Entry entry : internal3.entrySet()) { - try { - if (entry.getKey() - .contains("cable")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.cable.".length(), - entry.getKey() - .length() - ".01.name".length()))); - else if (entry.getKey() - .contains("gt_frame_")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.gt_frame_".length(), - entry.getKey() - .length() - ".name".length()))); - else if (entry.getKey() - .contains("gt_pipe_")) { - if (!entry.getKey() - .contains("_huge") - && !entry.getKey() - .contains("_large") - && !entry.getKey() - .contains("_nonuple") - && !entry.getKey() - .contains("_quadruple") - && !entry.getKey() - .contains("_small") - && !entry.getKey() - .contains("_tiny")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.gt_pipe_".length(), - entry.getKey() - .length() - ".name".length()))); - else if (entry.getKey() - .contains("_huge") - || entry.getKey() - .contains("_tiny")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.gt_pipe_".length(), - entry.getKey() - .length() - "_tiny.name".length()))); - else if (entry.getKey() - .contains("_large") - || entry.getKey() - .contains("_small")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.gt_pipe_".length(), - entry.getKey() - .length() - "_large.name".length()))); - else if (entry.getKey() - .contains("_nonuple")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.gt_pipe_".length(), - entry.getKey() - .length() - "_nonuple.name".length()))); - else if (entry.getKey() - .contains("_quadruple")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.gt_pipe_".length(), - entry.getKey() - .length() - "_quadruple.name".length()))); - } else if (entry.getKey() - .contains("wire")) - lServerNames.put( - entry.getKey(), - entry.getValue() - .replace( - "material", - entry.getKey() - .substring( - "gt.blockmachines.wire.".length(), - entry.getKey() - .length() - ".01.name".length()))); - else lServerNames.put(entry.getKey(), entry.getValue()); - } catch (Exception ignored) {} - } - for (Map.Entry entry : internal4.entrySet()) { - try { - if (entry.getKey() - .contains("blockores")) { - int i = Integer.parseInt( - entry.getKey() - .substring( - "gt.blockores.".length(), - entry.getKey() - .length() - ".name".length())); - i = i % 1000; - if (GregTech_API.sGeneratedMaterials[i] != null) lServerNames.put( - entry.getKey(), - entry.getValue() - .replace("material", GregTech_API.sGeneratedMaterials[i].toString())); - else lServerNames.put(entry.getKey(), null); - } else if (entry.getKey() - .contains("blockmetal")) { - Materials[] mMats = null; - String t = entry.getKey() - .substring("gt.blockmetal".length()); - t = t.substring(0, 1); - int i = Integer.parseInt(t); - switch (i) { - case 1 -> mMats = new Materials[] { Materials.Adamantium, Materials.Aluminium, - Materials.Americium, Materials.AnnealedCopper, Materials.Antimony, Materials.Arsenic, - Materials.AstralSilver, Materials.BatteryAlloy, Materials.Beryllium, Materials.Bismuth, - Materials.BismuthBronze, Materials.BlackBronze, Materials.BlackSteel, - Materials.BlueAlloy, Materials.BlueSteel, Materials.Brass }; - case 2 -> mMats = new Materials[] { Materials.Bronze, Materials.Caesium, Materials.Cerium, - Materials.Chrome, Materials.ChromiumDioxide, Materials.Cobalt, Materials.CobaltBrass, - Materials.Copper, Materials.Cupronickel, Materials.DamascusSteel, Materials.DarkIron, - Materials.DeepIron, Materials.Desh, Materials.Duranium, Materials.Dysprosium, - Materials.Electrum }; - case 3 -> mMats = new Materials[] { Materials.ElectrumFlux, Materials.Enderium, - Materials.Erbium, Materials.Europium, Materials.FierySteel, Materials.Gadolinium, - Materials.Gallium, Materials.Holmium, Materials.HSLA, Materials.Indium, - Materials.InfusedGold, Materials.Invar, Materials.Iridium, Materials.IronMagnetic, - Materials.IronWood, Materials.Kanthal }; - case 4 -> mMats = new Materials[] { Materials.Knightmetal, Materials.Lanthanum, - Materials.Lead, Materials.Lutetium, Materials.Magnalium, Materials.Magnesium, - Materials.Manganese, Materials.MeteoricIron, Materials.MeteoricSteel, Materials.Trinium, - Materials.Mithril, Materials.Molybdenum, Materials.Naquadah, Materials.NaquadahAlloy, - Materials.NaquadahEnriched, Materials.Naquadria }; - case 5 -> mMats = new Materials[] { Materials.Neodymium, Materials.NeodymiumMagnetic, - Materials.Neutronium, Materials.Nichrome, Materials.Nickel, Materials.Niobium, - Materials.NiobiumNitride, Materials.NiobiumTitanium, Materials.Osmiridium, - Materials.Osmium, Materials.Palladium, Materials.PigIron, Materials.Platinum, - Materials.Plutonium, Materials.Plutonium241, Materials.Praseodymium }; - case 6 -> mMats = new Materials[] { Materials.Promethium, Materials.RedAlloy, - Materials.RedSteel, Materials.RoseGold, Materials.Rubidium, Materials.Samarium, - Materials.Scandium, Materials.ShadowIron, Materials.ShadowSteel, Materials.Silicon, - Materials.Silver, Materials.SolderingAlloy, Materials.StainlessSteel, Materials.Steel, - Materials.SteelMagnetic, Materials.SterlingSilver }; - case 7 -> mMats = new Materials[] { Materials.Sunnarium, Materials.Tantalum, - Materials.Tellurium, Materials.Terbium, Materials.Thaumium, Materials.Thorium, - Materials.Thulium, Materials.Tin, Materials.TinAlloy, Materials.Titanium, - Materials.Tritanium, Materials.Tungsten, Materials.TungstenSteel, Materials.Ultimet, - Materials.Uranium, Materials.Uranium235 }; - case 8 -> mMats = new Materials[] { Materials.Vanadium, Materials.VanadiumGallium, - Materials.WroughtIron, Materials.Ytterbium, Materials.Yttrium, - Materials.YttriumBariumCuprate, Materials.Zinc, Materials.TungstenCarbide, - Materials.VanadiumSteel, Materials.HSSG, Materials.HSSE, Materials.HSSS, - Materials.Steeleaf, Materials.Ichorium, Materials.Firestone }; - } - t = entry.getKey() - .substring( - "gt.blockmetal1.".length(), - entry.getKey() - .length() - ".name".length()); - i = Integer.parseInt(t); - lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString()); - mMats = null; - } else if (entry.getKey() - .contains("blockgem")) { - Materials[] mMats = null; - String t = entry.getKey() - .substring("gt.blockgem".length()); - t = t.substring(0, 1); - int i = Integer.parseInt(t); - switch (i) { - case 1 -> mMats = new Materials[] { Materials.InfusedAir, Materials.Amber, - Materials.Amethyst, Materials.InfusedWater, Materials.BlueTopaz, - Materials.CertusQuartz, Materials.Dilithium, Materials.EnderEye, - Materials.EnderPearl, Materials.FoolsRuby, Materials.Force, Materials.Forcicium, - Materials.Forcillium, Materials.GreenSapphire, Materials.InfusedFire, - Materials.Jasper, MaterialsBotania.ManaDiamond, - MaterialsBotania.BotaniaDragonstone }; - case 2 -> mMats = new Materials[] { Materials.Lazurite, Materials.Lignite, - Materials.Monazite, Materials.Niter, Materials.Olivine, Materials.Opal, - Materials.InfusedOrder, Materials.InfusedEntropy, Materials.Phosphorus, - Materials.Quartzite, Materials.GarnetRed, Materials.Ruby, Materials.Sapphire, - Materials.Sodalite, Materials.Tanzanite, Materials.InfusedEarth }; - case 3 -> mMats = new Materials[] { Materials.Topaz, Materials.Vinteum, - Materials.GarnetYellow, Materials.NetherStar, Materials.Charcoal, Materials.Blaze }; - } - t = entry.getKey() - .substring( - "gt.blockgem1.".length(), - entry.getKey() - .length() - ".name".length()); - i = Integer.parseInt(t); - lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString()); - mMats = null; - } - } catch (Exception ignored) {} - } - - internal = null; - internal2 = null; - internal3 = null; - internal4 = null; - } -} diff --git a/src/main/java/gregtech/api/util/GT_BaseCrop.java b/src/main/java/gregtech/api/util/GT_BaseCrop.java deleted file mode 100644 index d8608c85a0..0000000000 --- a/src/main/java/gregtech/api/util/GT_BaseCrop.java +++ /dev/null @@ -1,311 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.E; -import static gregtech.api.enums.Mods.IC2CropPlugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.ConfigCategories; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.objects.ItemData; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import gregtech.common.blocks.GT_TileEntity_Ores; -import ic2.api.crops.CropCard; -import ic2.api.crops.Crops; -import ic2.api.crops.ICropTile; -import speiger.src.crops.api.ICropCardInfo; - -public class GT_BaseCrop extends CropCard implements ICropCardInfo { - - public static ArrayList sCropList = new ArrayList<>(); - private String mName = E; - private String mDiscoveredBy = "Gregorius Techneticies"; - private String[] mAttributes; - private int mTier = 0; - private int mMaxSize = 0; - private int mAfterHarvestSize = 0; - private int mHarvestSize = 0; - private final int[] mStats = new int[5]; - private final int mGrowthSpeed = 0; - private ItemStack mDrop = null; - private ItemStack[] mSpecialDrops = null; - private Materials mBlock = null; - private static boolean bIc2NeiLoaded = IC2CropPlugin.isModLoaded(); - - /** - * To create new Crops - * - * @param aID Default ID - * @param aCropName Name of the Crop - * @param aDiscoveredBy The one who discovered the Crop - * @param aDrop The Item which is dropped by the Crop. must be != null - * @param aBaseSeed Baseseed to plant this Crop. null == crossbreed only - * @param aTier tier of the Crop. forced to be >= 1 - * @param aMaxSize maximum Size of the Crop. forced to be >= 3 - * @param aGrowthSpeed how fast the Crop grows. if < 0 then its set to Tier*300 - * @param aHarvestSize the size the Crop needs to be harvested. forced to be between 2 and max size - */ - public GT_BaseCrop(int aID, String aCropName, String aDiscoveredBy, ItemStack aBaseSeed, int aTier, int aMaxSize, - int aGrowthSpeed, int aAfterHarvestSize, int aHarvestSize, int aStatChemical, int aStatFood, int aStatDefensive, - int aStatColor, int aStatWeed, String[] aAttributes, ItemStack aDrop, ItemStack[] aSpecialDrops) { - new GT_BaseCrop( - aID, - aCropName, - aDiscoveredBy, - aBaseSeed, - aTier, - aMaxSize, - aGrowthSpeed, - aAfterHarvestSize, - aHarvestSize, - aStatChemical, - aStatFood, - aStatDefensive, - aStatColor, - aStatWeed, - aAttributes, - null, - aDrop, - aSpecialDrops); - } - - /** - * To create new Crops - * - * @param aID Default ID - * @param aCropName Name of the Crop - * @param aDiscoveredBy The one who discovered the Crop - * @param aDrop The Item which is dropped by the Crop. must be != null - * @param aBaseSeed Baseseed to plant this Crop. null == crossbreed only - * @param aTier tier of the Crop. forced to be >= 1 - * @param aMaxSize maximum Size of the Crop. forced to be >= 3 - * @param aGrowthSpeed how fast the Crop grows. if < 0 then its set to Tier*300 - * @param aHarvestSize the size the Crop needs to be harvested. forced to be between 2 and max size - * @param aBlock the block below needed for crop to grow. If null no block needed - */ - public GT_BaseCrop(int aID, String aCropName, String aDiscoveredBy, ItemStack aBaseSeed, int aTier, int aMaxSize, - int aGrowthSpeed, int aAfterHarvestSize, int aHarvestSize, int aStatChemical, int aStatFood, int aStatDefensive, - int aStatColor, int aStatWeed, String[] aAttributes, Materials aBlock, ItemStack aDrop, - ItemStack[] aSpecialDrops) { - mName = aCropName; - aID = GT_Config.addIDConfig(ConfigCategories.IDs.crops, mName.replaceAll(" ", "_"), aID); - if (aDiscoveredBy != null && !aDiscoveredBy.equals(E)) mDiscoveredBy = aDiscoveredBy; - if (aDrop != null && aID > 0 && aID < 256) { - mDrop = GT_Utility.copyOrNull(aDrop); - mSpecialDrops = aSpecialDrops; - mTier = Math.max(1, aTier); - mMaxSize = Math.max(3, aMaxSize); - mHarvestSize = Math.min(Math.max(aHarvestSize, 2), mMaxSize); - mAfterHarvestSize = Math.min(Math.max(aAfterHarvestSize, 1), mMaxSize - 1); - mStats[0] = aStatChemical; - mStats[1] = aStatFood; - mStats[2] = aStatDefensive; - mStats[3] = aStatColor; - mStats[4] = aStatWeed; - mAttributes = aAttributes; - mBlock = aBlock; - if (!Crops.instance.registerCrop(this, aID)) - throw new GT_ItsNotMyFaultException("Make sure the Crop ID is valid!"); - if (aBaseSeed != null) Crops.instance.registerBaseSeed(aBaseSeed, this, 1, 1, 1, 1); - sCropList.add(this); - } - if (bIc2NeiLoaded) { - try { - Class.forName("speiger.src.crops.api.CropPluginAPI") - .getMethod("registerCropInfo", Class.forName("speiger.src.crops.api.ICropCardInfo")) - .invoke( - Class.forName("speiger.src.crops.api.CropPluginAPI") - .getField("instance"), - this); - } catch (IllegalAccessException | ClassNotFoundException | SecurityException | NoSuchMethodException - | NoSuchFieldException | InvocationTargetException | IllegalArgumentException ex) { - bIc2NeiLoaded = false; - } - } - } - - @Override - public byte getSizeAfterHarvest(ICropTile crop) { - return (byte) mAfterHarvestSize; - } - - @Override - public int growthDuration(ICropTile aCrop) { - if (mGrowthSpeed < 200) return super.growthDuration(aCrop); - return tier() * mGrowthSpeed; - } - - @Override - public int getrootslength(ICropTile crop) { - return 5; - } - - @Override - public String[] attributes() { - return mAttributes; - } - - @Override - public String discoveredBy() { - return mDiscoveredBy; - } - - @Override - public final boolean canGrow(ICropTile aCrop) { - // block check is only performed at the last stage of growth - if (this.needsBlockBelow() && aCrop.getSize() == mMaxSize - 1) { - return isBlockBelow(aCrop); - } - return aCrop.getSize() < maxSize(); - } - - @Override - public final boolean canBeHarvested(ICropTile aCrop) { - return aCrop.getSize() >= mHarvestSize; - } - - @Override - public boolean canCross(ICropTile aCrop) { - return aCrop.getSize() + 2 > maxSize(); - } - - @Override - public int stat(int n) { - if (n < 0 || n >= mStats.length) return 0; - return mStats[n]; - } - - @Override - public String name() { - return mName; - } - - @Override - public int tier() { - return mTier; - } - - @Override - public int maxSize() { - return mMaxSize; - } - - @Override - public ItemStack getGain(ICropTile aCrop) { - int tDrop = 0; - if (mSpecialDrops != null && (tDrop = java.util.concurrent.ThreadLocalRandom.current() - .nextInt(0, (mSpecialDrops.length * 2) + 2)) < mSpecialDrops.length && mSpecialDrops[tDrop] != null) { - return GT_Utility.copyOrNull(mSpecialDrops[tDrop]); - } - return GT_Utility.copyOrNull(mDrop); - } - - @Override - public boolean rightclick(ICropTile aCrop, EntityPlayer aPlayer) { - if (!canBeHarvested(aCrop)) return false; - return aCrop.harvest(aPlayer instanceof EntityPlayerMP); - } - - @Override - public int getOptimalHavestSize(ICropTile crop) { - return maxSize(); - } - - /** - * Checks if the crop needs a block below it - * - * @return True if the crop needs a block below it to grow to its max size - */ - public boolean needsBlockBelow() { - return GT_Mod.gregtechproxy.mCropNeedBlock && this.mBlock != null; - } - - public boolean isBlockBelow(ICropTile aCrop) { - if (aCrop == null) { - return false; - } - for (int i = 1; i < this.getrootslength(aCrop); i++) { - Block tBlock = aCrop.getWorld() - .getBlock(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ); - if ((tBlock instanceof GT_Block_Ores_Abstract)) { - TileEntity tTileEntity = aCrop.getWorld() - .getTileEntity(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - Materials tMaterial = GregTech_API.sGeneratedMaterials[(((GT_TileEntity_Ores) tTileEntity).mMetaData - % 1000)]; - if ((tMaterial != null) && (tMaterial != Materials._NULL)) { - return tMaterial == mBlock; - } - } - } else { - int tMetaID = aCrop.getWorld() - .getBlockMetadata(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ); - if (isBlockBelow(new ItemStack(tBlock, 1, tMetaID))) { - return true; - } - } - } - return false; - } - - /** - * An isolated function to check if an item stack is a block that should be below this crop - * - * @param aItem a stack of the block placed under the crop - * @return The result of the check - */ - public boolean isBlockBelow(ItemStack aItem) { - // safety in case someone calls this without checking if we have a block - if (!this.needsBlockBelow()) return true; - - // get material from stack - ItemData tAssociation = GT_OreDictUnificator.getAssociation(aItem); - if (tAssociation == null) return false; - - // return true if it's an ore of the material - // note: some ores don't appear to have associations in testing, naq ore is an example of that - if (tAssociation.mPrefix.toString() - .startsWith("ore") && tAssociation.mMaterial.mMaterial == mBlock) { - return true; - } - - // return true if it's a block of the material - if (tAssociation.mPrefix == OrePrefixes.block && tAssociation.mMaterial.mMaterial == mBlock) { - return true; - } - return false; - } - - @Override - public List getCropInformation() { - if (mBlock != null) { - ArrayList result = new ArrayList<>(1); - result.add( - String.format( - "Requires %s Ore or Block of %s as soil block to reach full growth.", - mBlock.mName, - mBlock.mName)); - return result; - } - return null; - } - - @Override - public ItemStack getDisplayItem() { - if (mSpecialDrops != null && mSpecialDrops[mSpecialDrops.length - 1] != null) { - return GT_Utility.copyOrNull(mSpecialDrops[mSpecialDrops.length - 1]); - } - return GT_Utility.copyOrNull(mDrop); - } -} diff --git a/src/main/java/gregtech/api/util/GT_BlockMap.java b/src/main/java/gregtech/api/util/GT_BlockMap.java deleted file mode 100644 index 9ffe273cac..0000000000 --- a/src/main/java/gregtech/api/util/GT_BlockMap.java +++ /dev/null @@ -1,134 +0,0 @@ -package gregtech.api.util; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiFunction; - -import net.minecraft.block.Block; - -import gnu.trove.map.TByteObjectMap; -import gnu.trove.map.hash.TByteObjectHashMap; - -public class GT_BlockMap { - - public static final byte WILDCARD = -1; - private final ConcurrentHashMap> backing = new ConcurrentHashMap<>(); - private int size = 0; - - private TByteObjectMap getSubmap(Block block) { - return backing.computeIfAbsent(block, b -> new TByteObjectHashMap<>()); - } - - /** - * Associate a value with that union key - * - * @param block block - * @param meta meta - * @return old mapping, or null if that doesn't exist - */ - public V put(Block block, byte meta, V value) { - V v = getSubmap(block).put(meta, value); - if (v == null) size++; - return v; - } - - /** - * Associate a value with that union key ONLY IF there isn't a prior EXACT mapping - * - * @param block block - * @param meta meta - * @return old mapping, or null if that doesn't exist - */ - public V putIfAbsent(Block block, byte meta, V value) { - V v = getSubmap(block).putIfAbsent(meta, value); - if (v == null) size++; - return v; - } - - /** - * Associate a value with that union key ONLY IF there isn't a prior EXACT mapping - * - * @param block block - * @param meta meta - * @return old mapping, or null if that doesn't exist - */ - public V computeIfAbsent(Block block, byte meta, BiFunction function) { - TByteObjectMap submap = getSubmap(block); - V v = submap.get(meta); - if (v == null) { - v = function.apply(block, meta); - submap.put(meta, v); - size++; - } - return v; - } - - /** - * Contains an associated value - * - * @param block block - * @param meta meta - * @return current mapping OR wildcard of that mapping exists - */ - public boolean containsKey(Block block, byte meta) { - TByteObjectMap submap = backing.get(block); - if (submap == null) return false; - return submap.containsKey(meta) || submap.containsKey(WILDCARD); - } - - /** - * Get the associated value - * - * @param block block - * @param meta meta - * @return current mapping OR wildcard of that block. null if neither exists - */ - public V get(Block block, byte meta) { - TByteObjectMap submap = backing.get(block); - if (submap == null) return null; - V v = submap.get(meta); - if (v != null) return v; - return submap.get(WILDCARD); - } - - /** - * Remove a mapping - * - * @param block block - * @param meta meta - * @return old value, or null if none - */ - public V remove(Block block, byte meta) { - TByteObjectMap submap = backing.get(block); - if (submap == null) return null; - V v = submap.remove(meta); - if (v != null) { - size--; - if (submap.isEmpty()) backing.remove(block); - } - return v; - } - - /** - * Size of all mappings - * - * @return size - */ - public int size() { - return size; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - GT_BlockMap that = (GT_BlockMap) o; - - return backing.equals(that.backing); - } - - @Override - public int hashCode() { - return backing.hashCode(); - } -} diff --git a/src/main/java/gregtech/api/util/GT_BlockSet.java b/src/main/java/gregtech/api/util/GT_BlockSet.java deleted file mode 100644 index 1d13afd056..0000000000 --- a/src/main/java/gregtech/api/util/GT_BlockSet.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.block.Block; - -public class GT_BlockSet { - - private final GT_BlockMap backing = new GT_BlockMap<>(); - - public boolean add(Block block, byte meta) { - return backing.put(block, meta, this) != this; - } - - public boolean contains(Block block, byte meta) { - return backing.get(block, meta) == this; - } - - public boolean remove(Block block, byte meta) { - return backing.remove(block, meta) == this; - } - - public int size() { - return backing.size(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - GT_BlockSet that = (GT_BlockSet) o; - - return backing.equals(that.backing); - } - - @Override - public int hashCode() { - return backing.hashCode(); - } -} diff --git a/src/main/java/gregtech/api/util/GT_CLS_Compat.java b/src/main/java/gregtech/api/util/GT_CLS_Compat.java deleted file mode 100644 index c560435e30..0000000000 --- a/src/main/java/gregtech/api/util/GT_CLS_Compat.java +++ /dev/null @@ -1,157 +0,0 @@ -package gregtech.api.util; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Function; - -import cpw.mods.fml.common.ProgressManager; -import gregtech.GT_Mod; -import gregtech.api.enums.Materials; -import gregtech.common.GT_Proxy; -import gregtech.loaders.postload.GT_PostLoad; - -@SuppressWarnings("rawtypes, unchecked, deprecation") -public class GT_CLS_Compat { - - private static Class alexiilMinecraftDisplayer; - private static Class alexiilProgressDisplayer; - private static Class cpwProgressBar; - - private static Method getLastPercent; - private static Method displayProgress; - - private static Field isReplacingVanillaMaterials; - private static Field isRegisteringGTmaterials; - private static Field progressBarStep; - - static { - // CLS - try { - alexiilMinecraftDisplayer = Class.forName("alexiil.mods.load.MinecraftDisplayer"); - alexiilProgressDisplayer = Class.forName("alexiil.mods.load.ProgressDisplayer"); - } catch (ClassNotFoundException ex) { - GT_Mod.GT_FML_LOGGER.catching(ex); - } - - try { - cpwProgressBar = Class.forName("cpw.mods.fml.common.ProgressManager$ProgressBar"); - } catch (ClassNotFoundException ex) { - GT_Mod.GT_FML_LOGGER.catching(ex); - } - - Optional.ofNullable(alexiilMinecraftDisplayer) - .ifPresent(e -> { - try { - getLastPercent = e.getMethod("getLastPercent"); - isReplacingVanillaMaterials = e.getField("isReplacingVanillaMaterials"); - isRegisteringGTmaterials = e.getField("isRegisteringGTmaterials"); - } catch (NoSuchMethodException | NoSuchFieldException ex) { - GT_Mod.GT_FML_LOGGER.catching(ex); - } - }); - - Optional.ofNullable(alexiilProgressDisplayer) - .ifPresent(e -> { - try { - displayProgress = e.getMethod("displayProgress", String.class, float.class); - } catch (NoSuchMethodException ex) { - GT_Mod.GT_FML_LOGGER.catching(ex); - } - }); - - try { - progressBarStep = cpwProgressBar.getDeclaredField("step"); - progressBarStep.setAccessible(true); - } catch (NoSuchFieldException ex) { - GT_Mod.GT_FML_LOGGER.catching(ex); - } - } - - private GT_CLS_Compat() {} - - private static void registerAndReportProgression(String materialsType, Collection materials, - ProgressManager.ProgressBar progressBar, Function getName, Consumer action) { - int sizeStep = materials.size(); - final long progressionReportsEvery = 100; - final long bakingMsgEvery = 1000; - long nextProgressionReportAt = 0; - long nextBakingMsgAt = 0; - int currentStep = 0; - - for (T m : materials) { - long now = System.currentTimeMillis(); - - if (nextProgressionReportAt < now) { - nextProgressionReportAt = now + progressionReportsEvery; - String materialName = getName.apply(m) - .toString(); - try { - displayProgress.invoke(null, materialName, (float) currentStep / sizeStep); - } catch (IllegalAccessException | InvocationTargetException iae) { - GT_Mod.GT_FML_LOGGER.error("While updating progression", iae); - } - try { - progressBarStep.set(progressBar, currentStep); - } catch (IllegalAccessException iae) { - GT_Mod.GT_FML_LOGGER.error("While updating intermediate progression steps number", iae); - } - progressBar.step(materialName); - } - if (nextBakingMsgAt < now) { - nextBakingMsgAt = now + bakingMsgEvery; - GT_Mod.GT_FML_LOGGER - .info(String.format("%s - Baking: %d%%", materialsType, currentStep * 100 / sizeStep)); - } - action.accept(m); - currentStep += 1; - } - GT_Mod.GT_FML_LOGGER.info(String.format("%s - Baking: Done", materialsType)); - try { - progressBarStep.set(progressBar, currentStep); - } catch (IllegalAccessException iae) { - GT_Mod.GT_FML_LOGGER.error("While updating final progression steps number", iae); - } - } - - public static void stepMaterialsCLS(Collection mEvents, - ProgressManager.ProgressBar progressBar) throws IllegalAccessException { - try { - isRegisteringGTmaterials.set(null, true); - } catch (IllegalArgumentException | IllegalAccessException e) { - GT_Mod.GT_FML_LOGGER.catching(e); - } - registerAndReportProgression( - "GregTech materials", - mEvents, - progressBar, - m -> m.mMaterial, - GT_Proxy::registerRecipes); - ProgressManager.pop(progressBar); - isRegisteringGTmaterials.set(null, false); - } - - public static void doActualRegistrationCLS(ProgressManager.ProgressBar progressBar, - Set replacedVanillaItemsSet) { - try { - isReplacingVanillaMaterials.set(null, true); - } catch (IllegalArgumentException | IllegalAccessException e) { - GT_Mod.GT_FML_LOGGER.catching(e); - } - registerAndReportProgression( - "Vanilla materials", - replacedVanillaItemsSet, - progressBar, - m -> m.mDefaultLocalName, - GT_PostLoad::doActualRegistration); - } - - public static void pushToDisplayProgress() throws InvocationTargetException, IllegalAccessException { - isReplacingVanillaMaterials.set(null, false); - displayProgress.invoke(null, "Post Initialization: loading GregTech", getLastPercent.invoke(null)); - } -} diff --git a/src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java b/src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java deleted file mode 100644 index bb73cf77ed..0000000000 --- a/src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java +++ /dev/null @@ -1,494 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.Mods.GregTech; - -import java.io.DataInput; -import java.io.DataInputStream; -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.lang.ref.WeakReference; -import java.lang.reflect.Array; -import java.nio.file.AtomicMoveNotSupportedException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.Arrays; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.function.Function; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.world.WorldEvent; - -import org.apache.commons.io.FileUtils; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -/** - * A utility to save all kinds of data that is a function of any chunk. - *

- * GregTech takes care of saving and loading the data from disk, and an efficient mechanism to locate it. Subclass only - * need to define the exact scheme of each element data (by overriding the three protected abstract method) - *

- * Oh, there is no limit on how large your data is, though you'd not have the familiar NBT interface, but DataOutput - * should be reasonably common anyway. - *

- * It should be noted this class is NOT thread safe. - *

- * Element cannot be null. - *

- * TODO: Implement automatic region unloading. - * - * @param data element type - * @author glease - */ -@ParametersAreNonnullByDefault -public abstract class GT_ChunkAssociatedData { - - private static final Map> instances = new ConcurrentHashMap<>(); - private static final int IO_PARALLELISM = Math.min( - 8, - Math.max( - 1, - Runtime.getRuntime() - .availableProcessors() * 2 - / 3)); - private static final ExecutorService IO_WORKERS = Executors.newWorkStealingPool(IO_PARALLELISM); - private static final Pattern FILE_PATTERN = Pattern.compile("(.+)\\.(-?\\d+)\\.(-?\\d+)\\.dat"); - - static { - // register event handler - new EventHandler(); - } - - protected final String mId; - protected final Class elementtype; - private final int regionLength; - private final int version; - private final boolean saveDefaults; - /** - * Data is stored as a `(world id -> (super region id -> super region data))` hash map. where super region's size is - * determined by regionSize. Here it is called super region, to not confuse with vanilla's regions. - */ - private final Map> masterMap = new ConcurrentHashMap<>(); - - /** - * Initialize this instance. - * - * @param aId An arbitrary, but globally unique identifier for what this data is - * @param elementType The class of this element type. Used to create arrays. - * @param regionLength The length of one super region. Each super region will contain - * {@code regionLength * regionLength} chunks - * @param version An integer marking the version of this data. Useful later when the data's serialized form - * changed. - */ - protected GT_ChunkAssociatedData(String aId, Class elementType, int regionLength, byte version, - boolean saveDefaults) { - if (regionLength * regionLength > Short.MAX_VALUE || regionLength <= 0) - throw new IllegalArgumentException("Region invalid: " + regionLength); - if (!IData.class.isAssignableFrom(elementType)) throw new IllegalArgumentException("Data type invalid"); - if (aId.contains(".")) throw new IllegalArgumentException("ID cannot contains dot"); - this.mId = aId; - this.elementtype = elementType; - this.regionLength = regionLength; - this.version = version; - this.saveDefaults = saveDefaults; - if (instances.putIfAbsent(aId, this) != null) - throw new IllegalArgumentException("Duplicate GT_ChunkAssociatedData: " + aId); - } - - private ChunkCoordIntPair getRegionID(int aChunkX, int aChunkZ) { - return new ChunkCoordIntPair(Math.floorDiv(aChunkX, regionLength), Math.floorDiv(aChunkZ, regionLength)); - } - - /** - * Get a reference to data of the chunk that tile entity is in. The returned reference should be mutable. - */ - public final T get(IGregTechTileEntity tileEntity) { - return get(tileEntity.getWorld(), tileEntity.getXCoord() >> 4, tileEntity.getZCoord() >> 4); - } - - public final T get(Chunk chunk) { - return get(chunk.worldObj, chunk.xPosition, chunk.zPosition); - } - - public final T get(World world, ChunkCoordIntPair coord) { - return get(world, coord.chunkXPos, coord.chunkZPos); - } - - public final T get(World world, int chunkX, int chunkZ) { - SuperRegion region = masterMap.computeIfAbsent(world.provider.dimensionId, ignored -> new ConcurrentHashMap<>()) - .computeIfAbsent(getRegionID(chunkX, chunkZ), c -> new SuperRegion(world, c)); - return region.get(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength)); - } - - protected final void set(World world, int chunkX, int chunkZ, T data) { - SuperRegion region = masterMap.computeIfAbsent(world.provider.dimensionId, ignored -> new ConcurrentHashMap<>()) - .computeIfAbsent(getRegionID(chunkX, chunkZ), c -> new SuperRegion(world, c)); - region.set(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength), data); - } - - protected final boolean isCreated(int dimId, int chunkX, int chunkZ) { - Map dimData = masterMap.getOrDefault(dimId, null); - if (dimData == null) return false; - - SuperRegion region = dimData.getOrDefault(getRegionID(chunkX, chunkZ), null); - if (region == null) return false; - - return region.isCreated(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength)); - } - - public void clear() { - if (GT_Values.debugWorldData) { - long dirtyRegionCount = masterMap.values() - .stream() - .flatMap( - m -> m.values() - .stream()) - .filter(SuperRegion::isDirty) - .count(); - if (dirtyRegionCount > 0) GT_Log.out.println( - "Clearing ChunkAssociatedData with " + dirtyRegionCount + " regions dirty. Data might have been lost!"); - } - masterMap.clear(); - } - - public void save() { - saveRegions( - masterMap.values() - .stream() - .flatMap( - m -> m.values() - .stream())); - } - - public void save(World world) { - Map map = masterMap.get(world.provider.dimensionId); - if (map != null) saveRegions( - map.values() - .stream()); - } - - private void saveRegions(Stream stream) { - stream.filter(SuperRegion::isDirty) - .map(c -> (Runnable) c::save) - .map(r -> CompletableFuture.runAsync(r, IO_WORKERS)) - .reduce(CompletableFuture::allOf) - .ifPresent(f -> { - try { - f.get(); - } catch (Exception e) { - GT_Log.err.println("Data save error: " + mId); - e.printStackTrace(GT_Log.err); - } - }); - } - - protected abstract void writeElement(DataOutput output, T element, World world, int chunkX, int chunkZ) - throws IOException; - - protected abstract T readElement(DataInput input, int version, World world, int chunkX, int chunkZ) - throws IOException; - - protected abstract T createElement(World world, int chunkX, int chunkZ); - - /** - * Clear all mappings, regardless of whether they are dirty - */ - public static void clearAll() { - for (GT_ChunkAssociatedData d : instances.values()) d.clear(); - } - - /** - * Save all mappings - */ - public static void saveAll() { - for (GT_ChunkAssociatedData d : instances.values()) d.save(); - } - - /** - * Load data for all chunks for a given world. Current data for that world will be discarded. If this is what you - * intended, call {@link #save(World)} beforehand. - *

- * Be aware of the memory consumption though. - */ - protected void loadAll(World w) { - if (GT_Values.debugWorldData && masterMap.containsKey(w.provider.dimensionId)) GT_Log.err.println( - "Reloading ChunkAssociatedData " + mId + " for world " + w.provider.dimensionId + " discards old data!"); - if (!getSaveDirectory(w).isDirectory()) - // nothing to load... - return; - try (Stream stream = Files.list(getSaveDirectory(w).toPath())) { - Map worldData = stream.map(f -> { - Matcher matcher = FILE_PATTERN.matcher( - f.getFileName() - .toString()); - return matcher.matches() ? matcher : null; - }) - .filter(Objects::nonNull) - .filter(m -> mId.equals(m.group(1))) - .map( - m -> CompletableFuture.supplyAsync( - () -> new SuperRegion(w, Integer.parseInt(m.group(2)), Integer.parseInt(m.group(3))), - IO_WORKERS)) - .map(f -> { - try { - return f.get(); - } catch (Exception e) { - GT_Log.err.println("Error loading region"); - e.printStackTrace(GT_Log.err); - return null; - } - }) - .filter(Objects::nonNull) - .collect(Collectors.toMap(SuperRegion::getCoord, Function.identity())); - masterMap.put(w.provider.dimensionId, worldData); - } catch (IOException | UncheckedIOException e) { - GT_Log.err.println("Error loading all region"); - e.printStackTrace(GT_Log.err); - } - } - - protected File getSaveDirectory(World w) { - File base; - if (w.provider.getSaveFolder() == null) base = w.getSaveHandler() - .getWorldDirectory(); - else base = new File( - w.getSaveHandler() - .getWorldDirectory(), - w.provider.getSaveFolder()); - return new File(base, GregTech.ID); - } - - public interface IData { - - /** - * @return Whether the data is different from chunk default - */ - boolean isSameAsDefault(); - } - - protected final class SuperRegion { - - private final T[] data = createData(); - private final File backingStorage; - private final WeakReference world; - /** - * Be aware, this means region coord, not bottom-left chunk coord - */ - private final ChunkCoordIntPair coord; - - private SuperRegion(World world, int regionX, int regionZ) { - this.world = new WeakReference<>(world); - this.coord = new ChunkCoordIntPair(regionX, regionZ); - backingStorage = new File(getSaveDirectory(world), String.format("%s.%d.%d.dat", mId, regionX, regionZ)); - if (backingStorage.isFile()) load(); - } - - private SuperRegion(World world, ChunkCoordIntPair regionCoord) { - this.world = new WeakReference<>(world); - this.coord = regionCoord; - backingStorage = new File( - getSaveDirectory(world), - String.format("%s.%d.%d.dat", mId, regionCoord.chunkXPos, regionCoord.chunkZPos)); - if (backingStorage.isFile()) load(); - } - - @SuppressWarnings("unchecked") - private T[] createData() { - return (T[]) Array.newInstance(elementtype, regionLength * regionLength); - } - - public T get(int subRegionX, int subRegionZ) { - int index = getIndex(subRegionX, subRegionZ); - T datum = data[index]; - if (datum == null) { - World world = Objects.requireNonNull(this.world.get()); - T newElem = createElement( - world, - coord.chunkXPos * regionLength + subRegionX, - coord.chunkZPos * regionLength + subRegionZ); - data[index] = newElem; - return newElem; - } - return datum; - } - - public void set(int subRegionX, int subRegionZ, T data) { - this.data[getIndex(subRegionX, subRegionZ)] = data; - } - - public boolean isCreated(int subRegionX, int subRegionZ) { - return this.data[getIndex(subRegionX, subRegionZ)] != null; - } - - public ChunkCoordIntPair getCoord() { - return coord; - } - - private int getIndex(int subRegionX, int subRegionY) { - return subRegionX * regionLength + subRegionY; - } - - private int getChunkX(int index) { - return index / regionLength + coord.chunkXPos * regionLength; - } - - private int getChunkZ(int index) { - return index % regionLength + coord.chunkZPos * regionLength; - } - - public boolean isDirty() { - for (T datum : data) { - if (datum != null && !datum.isSameAsDefault()) return true; - } - return false; - } - - public void save() { - try { - save0(); - } catch (IOException e) { - GT_Log.err.println("Error saving data " + backingStorage.getPath()); - e.printStackTrace(GT_Log.err); - } - } - - private void save0() throws IOException { - // noinspection ResultOfMethodCallIgnored - backingStorage.getParentFile() - .mkdirs(); - File tmpFile = getTmpFile(); - World world = Objects.requireNonNull(this.world.get(), "Attempting to save region of another world!"); - try (DataOutputStream output = new DataOutputStream(new FileOutputStream(tmpFile))) { - int ptr = 0; - boolean nullRange = data[0] == null; - // write a magic byte as storage format version - output.writeByte(0); - // write a magic byte as data format version - output.writeByte(version); - output.writeBoolean(nullRange); - while (ptr < data.length) { - // work out how long is this range - int rangeStart = ptr; - while (ptr < data.length - && (data[ptr] == null || (!saveDefaults && data[ptr].isSameAsDefault())) == nullRange) ptr++; - // write range length - output.writeShort(ptr - rangeStart); - if (!nullRange) - // write element data - for (int i = rangeStart; i < ptr; i++) - writeElement(output, data[i], world, getChunkX(ptr), getChunkZ(ptr)); - // or not - nullRange = !nullRange; - } - } - // first try to replace the destination file - // since atomic operation, no need to keep the backup in place - try { - Files.move( - tmpFile.toPath(), - backingStorage.toPath(), - StandardCopyOption.REPLACE_EXISTING, - StandardCopyOption.ATOMIC_MOVE); - } catch (AtomicMoveNotSupportedException ignored) { - // in case some dumb system/jre combination would cause this - // or if **somehow** two file inside the same directory belongs two separate filesystem - FileUtils.copyFile(tmpFile, backingStorage); - } - } - - public void load() { - try { - loadFromFile(backingStorage); - } catch (IOException | RuntimeException e) { - GT_Log.err.println("Primary storage file broken in " + backingStorage.getPath()); - e.printStackTrace(GT_Log.err); - // in case the primary storage is broken - try { - loadFromFile(getTmpFile()); - } catch (IOException | RuntimeException e2) { - GT_Log.err.println("Backup storage file broken in " + backingStorage.getPath()); - e2.printStackTrace(GT_Log.err); - } - } - } - - private void loadFromFile(File file) throws IOException { - World world = Objects.requireNonNull(this.world.get(), "Attempting to load region of another world!"); - try (DataInputStream input = new DataInputStream(new FileInputStream(file))) { - byte b = input.readByte(); - if (b == 0) { - loadV0(input, world); - } else { - GT_Log.err.printf("Unknown ChunkAssociatedData version %d\n", b); - } - } - } - - private void loadV0(DataInput input, World world) throws IOException { - int version = input.readByte(); - boolean nullRange = input.readBoolean(); - int ptr = 0; - while (ptr != data.length) { - int rangeEnd = ptr + input.readUnsignedShort(); - if (!nullRange) { - for (; ptr < rangeEnd; ptr++) { - data[ptr] = readElement(input, version, world, getChunkX(ptr), getChunkZ(ptr)); - } - } else { - Arrays.fill(data, ptr, rangeEnd, null); - ptr = rangeEnd; - } - nullRange = !nullRange; - } - } - - private File getTmpFile() { - return new File(backingStorage.getParentFile(), backingStorage.getName() + ".tmp"); - } - } - - public static class EventHandler { - - private EventHandler() { - MinecraftForge.EVENT_BUS.register(this); - } - - @SubscribeEvent - public void onWorldSave(WorldEvent.Save e) { - for (GT_ChunkAssociatedData d : instances.values()) { - d.save(e.world); - } - } - - @SubscribeEvent - public void onWorldUnload(WorldEvent.Unload e) { - for (GT_ChunkAssociatedData d : instances.values()) { - // there is no need to explicitly do a save here - // forge will send a WorldEvent.Save on server thread before this event is distributed - d.masterMap.remove(e.world.provider.dimensionId); - } - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java b/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java deleted file mode 100644 index 63fb7d1e70..0000000000 --- a/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java +++ /dev/null @@ -1,212 +0,0 @@ -package gregtech.api.util; - -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.IRedstoneCircuitBlock; - -/** - * Redstone Circuit Control Code - *

- * This should make everything possible what a Redstone Computer or BuildCraft Gate could do. It is intended to use this - * similar to BC-Gates (for acquiring Data) and RP Logic Gates. You could write an extremely specified and complex Logic - * Gate, which works only for you Setup, like with ComputerCraft, but you would have to write an extra Mod to add that, - * as it doesn't work Ingame. - *

- * One can make use of the fact, that ItemStacks can be stored as Integer, so that you can scan Inventories for specific - * Items using that. Luckily the Buttons in the GUI enable Copy/Paste of ItemID+MetaData to Integer, including the - * WildCard Damage Value when you use rightclick to place it. You just need to use @GT_Utility.stackToInt(ItemStack - * aStack) to get it. - *

- * All Functions run usually in a seperate try/catch Block, so that failed Logic won't crash the TileEntity. - */ -public abstract class GT_CircuitryBehavior { - - /** - * @param aIndex 0 - 1023 are my own Indices, so use other Numbers! - */ - public GT_CircuitryBehavior(int aIndex) { - GregTech_API.sCircuitryBehaviors.put(aIndex, this); - } - - /** - * returns if there is Redstone applied to any of the valid Inputs (OR) - */ - public static boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) - .letsRedstoneGoIn( - side, - aRedstoneCircuitBlock.getCoverID(side), - aRedstoneCircuitBlock.getCoverVariable(side), - aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { - return true; - } - } - } - return false; - } - - /** - * returns if there is Redstone applied to all the valid Inputs (AND) - */ - public static boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) - .letsRedstoneGoIn( - side, - aRedstoneCircuitBlock.getCoverID(side), - aRedstoneCircuitBlock.getCoverVariable(side), - aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(side) == 0) { - return false; - } - } - } - return true; - } - - /** - * returns if there is Redstone applied to exactly one of the valid Inputs (XOR) - */ - public static boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - int tRedstoneAmount = 0; - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) - .letsRedstoneGoIn( - side, - aRedstoneCircuitBlock.getCoverID(side), - aRedstoneCircuitBlock.getCoverVariable(side), - aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { - tRedstoneAmount++; - } - } - } - return tRedstoneAmount == 1; - } - - /** - * returns the strongest incoming RS-Power - */ - public static byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - byte tRedstoneAmount = 0; - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) - .letsRedstoneGoIn( - side, - aRedstoneCircuitBlock.getCoverID(side), - aRedstoneCircuitBlock.getCoverVariable(side), - aRedstoneCircuitBlock.getOwnTileEntity())) { - tRedstoneAmount = (byte) Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); - } - } - return tRedstoneAmount; - } - - // region GUI Functions - - /** - * returns the weakest incoming non-zero RS-Power - */ - public static byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0; - byte tRedstoneAmount = 15; - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) - .letsRedstoneGoIn( - side, - aRedstoneCircuitBlock.getCoverID(side), - aRedstoneCircuitBlock.getCoverVariable(side), - aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) - tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); - } - } - return tRedstoneAmount; - } - - /** - * returns the weakest incoming RS-Power - */ - public static byte getWeakestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0; - byte tRedstoneAmount = 15; - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) - .letsRedstoneGoIn( - side, - aRedstoneCircuitBlock.getCoverID(side), - aRedstoneCircuitBlock.getCoverVariable(side), - aRedstoneCircuitBlock.getOwnTileEntity())) { - tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); - } - } - return tRedstoneAmount; - } - - /** - * Initializes the Parameters of this Circuit, all Parameters have been set to 0 right before calling this - * - * @param aCircuitData, The Data Storage you can use (8 Slots) - * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself - */ - public abstract void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock); - - /** - * Validates the Parameters of this Circuit when a value has been changed by the GUI Also called right - * after @initParameters and when the Chunk reloads - * - * @param aCircuitData, The Data Storage you can use (8 Slots and only the first 4 are User definable) - * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself - */ - public abstract void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock); - - // endregion - - // region Utility Functions - - /** - * Called every tick if the Block has enough Energy and if the Block is Active - * - * @param aCircuitData, The Data Storage you can use (8 Slots) - * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself - */ - public abstract void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock); - - /** - * If the ItemStack should be displayed. Parameters are between 0 and 3. - */ - public abstract boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, - int aIndex); - - /** - * The Name of the Gate for the GUI - */ - @SideOnly(Side.CLIENT) - public abstract String getName(); - - /** - * The Description of the Gate for the GUI - */ - @SideOnly(Side.CLIENT) - public abstract String getDescription(); - - /** - * The Description of the Data Field for the GUI - */ - @SideOnly(Side.CLIENT) - public abstract String getDataDescription(int[] aCircuitData, int aCircuitDataIndex); - - /** - * How the Integer should be displayed in the GUI. null means, that it just displays as regular Number. - */ - @SideOnly(Side.CLIENT) - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - return null; - } - // endregion -} diff --git a/src/main/java/gregtech/api/util/GT_ClientPreference.java b/src/main/java/gregtech/api/util/GT_ClientPreference.java deleted file mode 100644 index 3ea2730a0c..0000000000 --- a/src/main/java/gregtech/api/util/GT_ClientPreference.java +++ /dev/null @@ -1,43 +0,0 @@ -package gregtech.api.util; - -import gregtech.common.config.client.ConfigPreference; -import gregtech.common.config.client.ConfigWaila; - -public class GT_ClientPreference { - - private final boolean mSingleBlockInitialFilter; - private final boolean mSingleBlockInitialMultiStack; - private final boolean mInputBusInitialFilter; - private final boolean wailaAverageNS; - - public GT_ClientPreference(boolean mSingleBlockInitialFilter, boolean mSingleBlockInitialMultiStack, - boolean mInputBusInitialFilter, boolean wailaAverageNS) { - this.mSingleBlockInitialFilter = mSingleBlockInitialFilter; - this.mSingleBlockInitialMultiStack = mSingleBlockInitialMultiStack; - this.mInputBusInitialFilter = mInputBusInitialFilter; - this.wailaAverageNS = wailaAverageNS; - } - - public GT_ClientPreference() { - this.mSingleBlockInitialFilter = ConfigPreference.singleBlockInitialFilter; - this.mSingleBlockInitialMultiStack = ConfigPreference.singleBlockInitialAllowMultiStack; - this.mInputBusInitialFilter = ConfigPreference.inputBusInitialFilter; - this.wailaAverageNS = ConfigWaila.wailaAverageNS; - } - - public boolean isSingleBlockInitialFilterEnabled() { - return mSingleBlockInitialFilter; - } - - public boolean isSingleBlockInitialMultiStackEnabled() { - return mSingleBlockInitialMultiStack; - } - - public boolean isInputBusInitialFilterEnabled() { - return mInputBusInitialFilter; - } - - public boolean isWailaAverageNSEnabled() { - return wailaAverageNS; - } -} diff --git a/src/main/java/gregtech/api/util/GT_Config.java b/src/main/java/gregtech/api/util/GT_Config.java deleted file mode 100644 index e1157febb4..0000000000 --- a/src/main/java/gregtech/api/util/GT_Config.java +++ /dev/null @@ -1,162 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.E; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; - -public class GT_Config implements Runnable { - - public static boolean troll = false; - - public static Configuration sConfigFileIDs; - public static Configuration cleanroomFile; - public static Configuration undergroundFluidsFile; - public final Configuration mConfig; - - public GT_Config(Configuration aConfig) { - mConfig = aConfig; - mConfig.load(); - mConfig.save(); - GregTech_API.sAfterGTPreload.add(this); // in case of crash on startup - GregTech_API.sAfterGTLoad.add(this); // in case of crash on startup - GregTech_API.sAfterGTPostload.add(this); - if (GT_Values.lateConfigSave) GregTech_API.sFirstWorldTick.add(this); - } - - private static boolean shouldSave() { - return GT_Values.lateConfigSave ? GT_Values.worldTickHappened : GregTech_API.sPostloadFinished; - } - - public static int addIDConfig(Object aCategory, String aName, int aDefault) { - if (GT_Utility.isStringInvalid(aName)) return aDefault; - Property tProperty = sConfigFileIDs.get( - aCategory.toString() - .replaceAll("\\|", "."), - aName.replaceAll("\\|", "."), - aDefault); - int rResult = tProperty.getInt(aDefault); - sConfigFileIDs.save(); - return rResult; - } - - public static String getStackConfigName(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return E; - Object rName = GT_OreDictUnificator.getAssociation(aStack); - if (rName != null) return rName.toString(); - try { - if (GT_Utility.isStringValid(rName = aStack.getUnlocalizedName())) return rName.toString(); - } catch (Throwable e) { - /* Do nothing */ - } - String sName = aStack.getItem() - .toString(); - String[] tmp = sName.split("@"); - if (tmp.length > 0) sName = tmp[0]; - return sName + "." + aStack.getItemDamage(); - } - - public boolean get(Object aCategory, ItemStack aStack, boolean aDefault) { - String aName = getStackConfigName(aStack); - return get(aCategory, aName, aDefault); - } - - public boolean get(Object aCategory, String aName, boolean aDefault) { - if (GT_Utility.isStringInvalid(aName)) return aDefault; - Property tProperty = mConfig.get( - aCategory.toString() - .replaceAll("\\|", "_"), - (aName + "_" + aDefault).replaceAll("\\|", "_"), - aDefault); - boolean rResult = tProperty.getBoolean(aDefault); - if (!tProperty.wasRead() && shouldSave()) mConfig.save(); - return rResult; - } - - public int get(Object aCategory, ItemStack aStack, int aDefault) { - return get(aCategory, getStackConfigName(aStack), aDefault); - } - - public int get(Object aCategory, String aName, int aDefault) { - if (GT_Utility.isStringInvalid(aName)) return aDefault; - Property tProperty = mConfig.get( - aCategory.toString() - .replaceAll("\\|", "_"), - (aName + "_" + aDefault).replaceAll("\\|", "_"), - aDefault); - int rResult = tProperty.getInt(aDefault); - if (!tProperty.wasRead() && shouldSave()) mConfig.save(); - return rResult; - } - - public double get(Object aCategory, ItemStack aStack, double aDefault) { - return get(aCategory, getStackConfigName(aStack), aDefault); - } - - public double get(Object aCategory, String aName, double aDefault) { - if (GT_Utility.isStringInvalid(aName)) return aDefault; - Property tProperty = mConfig.get( - aCategory.toString() - .replaceAll("\\|", "_"), - (aName + "_" + aDefault).replaceAll("\\|", "_"), - aDefault); - double rResult = tProperty.getDouble(aDefault); - if (!tProperty.wasRead() && shouldSave()) mConfig.save(); - return rResult; - } - - public String get(Object aCategory, ItemStack aStack, String aDefault) { - return get(aCategory, getStackConfigName(aStack), aDefault); - } - - public String get(Object aCategory, String aName, String aDefault) { - if (GT_Utility.isStringInvalid(aName)) return aDefault; - Property tProperty = mConfig.get( - aCategory.toString() - .replaceAll("\\|", "_"), - (aName + "_" + aDefault).replaceAll("\\|", "_"), - aDefault); - String rResult = tProperty.getString(); - if (!tProperty.wasRead() && shouldSave()) mConfig.save(); - return rResult; - } - - public String[] get(Object aCategory, ItemStack aStack, String... aDefault) { - return get(aCategory, getStackConfigName(aStack), aDefault); - } - - public String[] get(Object aCategory, String aName, String... aDefault) { - if (GT_Utility.isStringInvalid(aName)) return aDefault; - Property tProperty = mConfig.get( - aCategory.toString() - .replaceAll("\\|", "_"), - aName.replaceAll("\\|", "_"), - aDefault); - String[] rResult = tProperty.getStringList(); - if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save(); - return rResult; - } - - public String getWithValidValues(Object aCategory, String aName, String[] validValues, String aDefault) { - if (GT_Utility.isStringInvalid(aName)) return aDefault; - Property tProperty = mConfig.get( - aCategory.toString() - .replaceAll("\\|", "_"), - aName.replaceAll("\\|", "_"), - aDefault, - null, - validValues); - String rResult = tProperty.getString(); - if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save(); - return rResult; - } - - @Override - public void run() { - mConfig.save(); - } -} diff --git a/src/main/java/gregtech/api/util/GT_CoverBehavior.java b/src/main/java/gregtech/api/util/GT_CoverBehavior.java deleted file mode 100644 index 9394b3957f..0000000000 --- a/src/main/java/gregtech/api/util/GT_CoverBehavior.java +++ /dev/null @@ -1,402 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.E; - -import java.lang.ref.WeakReference; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; - -/** - * For Covers with a special behavior. Has fixed storage format of 4 byte. Not very convenient... - */ -public abstract class GT_CoverBehavior extends GT_CoverBehaviorBase { - - public boolean mPlayerNotified = false; - - public GT_CoverBehavior() { - this(null); - } - - public GT_CoverBehavior(ITexture coverTexture) { - super(ISerializableObject.LegacyCoverData.class, coverTexture); - } - - protected static int convert(ISerializableObject.LegacyCoverData data) { - return data == null ? 0 : data.get(); - } - - // region bridge the parent call to legacy calls - - @Override - public final ISerializableObject.LegacyCoverData createDataObject() { - return new ISerializableObject.LegacyCoverData(); - } - - @Override - public ISerializableObject.LegacyCoverData createDataObject(int aLegacyData) { - return new ISerializableObject.LegacyCoverData(aLegacyData); - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - return isRedstoneSensitive(side, aCoverID, aCoverVariable.get(), aTileEntity, aTimer); - } - - @Override - protected ISerializableObject.LegacyCoverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, - int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - if (aCoverVariable == null) aCoverVariable = new ISerializableObject.LegacyCoverData(); - aCoverVariable.set(doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable.get(), aTileEntity, aTimer)); - return aCoverVariable; - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - return onCoverRightclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ); - } - - @Override - protected ISerializableObject.LegacyCoverData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - if (aCoverVariable == null) aCoverVariable = new ISerializableObject.LegacyCoverData(); - aCoverVariable - .set(onCoverScrewdriverclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ)); - return aCoverVariable; - } - - @Override - protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer) { - return onCoverShiftRightclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer); - } - - @Override - protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, boolean aForced) { - return onCoverRemoval(side, aCoverID, convert(aCoverVariable), aTileEntity, aForced); - } - - @Override - protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - onBaseTEDestroyed(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected void onCoverUnloadImpl(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - onCoverUnload(aTileEntity); - } - - @Override - protected String getDescriptionImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return getDescription(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return getBlastProofLevel(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return letsRedstoneGoIn(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return letsRedstoneGoOut(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return letsEnergyIn(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return letsEnergyOut(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { - return letsFluidIn(side, aCoverID, convert(aCoverVariable), aFluid, aTileEntity); - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { - return letsFluidOut(side, aCoverID, convert(aCoverVariable), aFluid, aTileEntity); - } - - @Override - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { - return letsItemsIn(side, aCoverID, convert(aCoverVariable), aSlot, aTileEntity); - } - - @Override - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) { - return letsItemsOut(side, aCoverID, convert(aCoverVariable), aSlot, aTileEntity); - } - - @Override - protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return isGUIClickable(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return manipulatesSidedRedstoneOutput(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return alwaysLookConnected(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return getRedstoneInput(side, aInputRedstone, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, - ICoverable aTileEntity) { - return getTickRate(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected byte getLensColorImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return getLensColor(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - @Override - protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return getDrop(side, aCoverID, convert(aCoverVariable), aTileEntity); - } - - // endregion - - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return true; - } - - /** - * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time. - */ - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return aCoverVariable; - } - - /** - * Called when someone rightclicks this Cover. - *

- * return true, if something actually happens. - */ - public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - return false; - } - - /** - * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case. - *

- * return the new Value of the Cover Variable - */ - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - return aCoverVariable; - } - - /** - * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case. - */ - public boolean onCoverShiftRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer) { - if (hasCoverGUI() && aPlayer instanceof EntityPlayerMP) { - lastPlayer = new WeakReference<>(aPlayer); - mPlayerNotified = false; - GT_UIInfos.openCoverUI(aTileEntity, aPlayer, side); - return true; - } - return false; - } - - /** - * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is - * getting broken, only if you break the Cover away from the Machine. - */ - public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - boolean aForced) { - return true; - } - - public void onCoverUnload(ICoverable aTileEntity) { - - } - - public void onBaseTEDestroyed(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {} - - /** - * Gives a small Text for the status of the Cover. - */ - public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return E; - } - - /** - * How Blast Proof the Cover is. 30 is normal. - */ - public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 10.0F; - } - - /** - * If it lets RS-Signals into the Block - *

- * This is just Informative so that Machines know if their Redstone Input is blocked or not - */ - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - /** - * If it lets RS-Signals out of the Block - */ - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Energy into the Block - */ - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Energy out of the Block - */ - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not. - */ - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not. - */ - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no - * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each - * Slot). - */ - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no - * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each - * Slot). - */ - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets you rightclick the Machine normally - */ - public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - /** - * Needs to return true for Covers, which have a Redstone Output on their Facing. - */ - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - /** - * if this Cover should let Pipe Connections look connected even if it is not the case. - */ - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - /** - * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The - * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0. - */ - public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return letsRedstoneGoIn(side, aCoverID, aCoverVariable, aTileEntity) ? aInputRedstone : 0; - } - - /** - * Gets the Tick Rate for doCoverThings of the Cover - *

- * 0 = No Ticks! Yes, 0 is Default, you have to override this - */ - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 0; - } - - /** - * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then). - */ - public byte getLensColor(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return -1; - } - - /** - * @return the ItemStack dropped by this Cover - */ - public ItemStack getDrop(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return GT_OreDictUnificator.get(true, aTileEntity.getCoverItemAtSide(side)); - } -} diff --git a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java deleted file mode 100644 index f5bd7a92f4..0000000000 --- a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java +++ /dev/null @@ -1,839 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.E; - -import java.lang.ref.WeakReference; -import java.util.List; -import java.util.function.Supplier; - -import javax.annotation.Nullable; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagInt; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.gui.GT_GUIColorOverride; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.gui.widgets.GT_CoverTickRateButton; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.common.covers.CoverInfo; - -/** - * For Covers with a special behavior. - * - * @author glease - */ -public abstract class GT_CoverBehaviorBase { - - public WeakReference lastPlayer = null; - private final Class typeToken; - private final ITexture coverFGTexture; - - protected GT_CoverBehaviorBase(Class typeToken) { - this(typeToken, null); - } - - protected GT_CoverBehaviorBase(Class typeToken, ITexture coverTexture) { - this.typeToken = typeToken; - this.coverFGTexture = coverTexture; - reloadColorOverride(); - } - - public void reloadColorOverride() { - this.colorOverride = GT_GUIColorOverride.get(guiTexturePath); - } - - public abstract T createDataObject(int aLegacyData); - - public abstract T createDataObject(); - - public final T createDataObject(NBTBase aNBT) { - // Handle legacy data (migrating from GT_CoverBehavior to GT_CoverBehaviorBase) - if (aNBT instanceof NBTTagInt) { - return createDataObject(((NBTTagInt) aNBT).func_150287_d()); - } - - final T ret = createDataObject(); - ret.loadDataFromNBT(aNBT); - return ret; - } - - public final T cast(ISerializableObject aData) { - if (typeToken.isInstance(aData)) return forceCast(aData); - return null; - } - - private T forceCast(ISerializableObject aData) { - try { - return typeToken.cast(aData); - } catch (Exception e) { - throw new RuntimeException("Casting data in " + this.getClass() + ", data " + aData, e); - } - } - - // region facade - - /** - * Get target facade block. Does not affect rendering of **this** block. It is only used as a hint for other block - * in case of CTM - * - * @return null if none, otherwise return facade target block - */ - public final Block getFacadeBlock(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getFacadeBlockImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Get target facade block. Does not affect rendering of **this** block. It is only used as a hint for other block - * in case of CTM - * - * @return 0 if none, otherwise return facade target meta - */ - public final int getFacadeMeta(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getFacadeMetaImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Get the display stack. Default to {@code int2Stack(aCoverID)} - */ - public final ItemStack getDisplayStack(int aCoverID, ISerializableObject aCoverVariable) { - return getDisplayStackImpl(aCoverID, forceCast(aCoverVariable)); - } - - /** - * Get the special foreground cover texture associated with this cover. Return null if one should use the texture - * passed to {@link gregtech.api.GregTech_API#registerCover(ItemStack, ITexture, GT_CoverBehaviorBase)} or its - * overloads. - */ - public final ITexture getSpecialCoverFGTexture(ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return getSpecialCoverFGTextureImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Get the special cover texture associated with this cover. Return null if one should use the texture passed to - * {@link gregtech.api.GregTech_API#registerCover(ItemStack, ITexture, GT_CoverBehaviorBase)} or its overloads. - */ - public final ITexture getSpecialCoverTexture(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getSpecialCoverTextureImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Return whether cover data needs to be synced to client upon tile entity creation or cover placement. - *

- * Note if you want to sync the data afterwards you will have to manually do it by calling - * {@link ICoverable#issueCoverUpdate(ForgeDirection)} This option only affects the initial sync. - */ - public final boolean isDataNeededOnClient(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return isDataNeededOnClientImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Called upon receiving data from network. Use {@link ICoverable#isClientSide()} to determine the side. - */ - public final void onDataChanged(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - onDataChangedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Called before receiving data from network. Use {@link ICoverable#isClientSide()} to determine the side. - */ - public final void preDataChanged(ForgeDirection side, int aCoverID, int aNewCoverId, - ISerializableObject aCoverVariable, ISerializableObject aNewCoverVariable, ICoverable aTileEntity) { - preDataChangedImpl( - side, - aCoverID, - aNewCoverId, - forceCast(aCoverVariable), - forceCast(aNewCoverVariable), - aTileEntity); - } - - /** - * Called upon cover being removed. Called on both server and client. - */ - public final void onDropped(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - onDroppedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - public final boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return isRedstoneSensitiveImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aTimer); - } - - /** - * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time. - */ - public final T doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity, long aTimer) { - return doCoverThingsImpl(side, aInputRedstone, aCoverID, forceCast(aCoverVariable), aTileEntity, aTimer); - } - - /** - * Called when someone rightclicks this Cover. - *

- * return true, if something actually happens. - */ - public final boolean onCoverRightClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - return onCoverRightClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ); - } - - /** - * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case. - *

- * return the new Value of the Cover Variable - */ - public final T onCoverScrewdriverClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - return onCoverScrewdriverClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ); - } - - /** - * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case. - */ - public final boolean onCoverShiftRightClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer) { - return onCoverShiftRightClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer); - } - - /** - * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is - * getting broken, only if you break the Cover away from the Machine. - */ - public final boolean onCoverRemoval(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity, boolean aForced) { - return onCoverRemovalImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aForced); - } - - /** - * Called upon Base TE being destroyed (once getDrops is called), thus getting called only when destroyed in - * survival. - */ - public final void onBaseTEDestroyed(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - onBaseTEDestroyedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Gives a small Text for the status of the Cover. - */ - public final String getDescription(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getDescriptionImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Called when Base TE being unloaded. - */ - public void onCoverUnload(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - onCoverUnloadImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * How Blast Proof the Cover is. 30 is normal. - */ - public final float getBlastProofLevel(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getBlastProofLevelImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * If it lets RS-Signals into the Block - *

- * This is just Informative so that Machines know if their Redstone Input is blocked or not - */ - public final boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return letsRedstoneGoInImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * If it lets RS-Signals out of the Block - */ - public final boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return letsRedstoneGoOutImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * If it lets Energy into the Block - */ - public final boolean letsEnergyIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return letsEnergyInImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * If it lets Energy out of the Block - */ - public final boolean letsEnergyOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return letsEnergyOutImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not. - */ - public final boolean letsFluidIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - Fluid aFluid, ICoverable aTileEntity) { - return letsFluidInImpl(side, aCoverID, forceCast(aCoverVariable), aFluid, aTileEntity); - } - - /** - * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not. - */ - public final boolean letsFluidOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - Fluid aFluid, ICoverable aTileEntity) { - return letsFluidOutImpl(side, aCoverID, forceCast(aCoverVariable), aFluid, aTileEntity); - } - - /** - * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no - * reaction at all), aSlot = -2 means if it would accept for all Slots Impl(return true to skip the Checks for each - * Slot). - */ - public final boolean letsItemsIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return letsItemsInImpl(side, aCoverID, forceCast(aCoverVariable), aSlot, aTileEntity); - } - - /** - * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no - * reaction at all), aSlot = -2 means if it would accept for all Slots Impl(return true to skip the Checks for each - * Slot). - */ - public final boolean letsItemsOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return letsItemsOutImpl(side, aCoverID, forceCast(aCoverVariable), aSlot, aTileEntity); - } - - /** - * If it lets you rightclick the Machine normally - */ - public final boolean isGUIClickable(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return isGUIClickableImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Needs to return true for Covers, which have a Redstone Output on their Facing. - */ - public final boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return manipulatesSidedRedstoneOutputImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * if this Cover should let Pipe Connections look connected even if it is not the case. - */ - public final boolean alwaysLookConnected(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return alwaysLookConnectedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The - * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0. - */ - public final byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, - ISerializableObject aCoverVariable, ICoverable aTileEntity) { - return getRedstoneInputImpl(side, aInputRedstone, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Gets the Tick Rate for doCoverThings of the Cover - *

- * 0 = No Ticks! Yes, 0 is Default, you have to override this - */ - public final int getTickRate(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getTickRateImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then). - */ - public final byte getLensColor(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getLensColorImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * @return the ItemStack dropped by this Cover - */ - public final ItemStack getDrop(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) { - return getDropImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity); - } - - /** - * Called when the cover is initially attached to a machine. - * - * @param player The attaching player - * @param aCover An {@link ItemStack} containing the cover - * @param aTileEntity The machine receiving the cover - * @param side Which side the cover is attached to - */ - public void onPlayerAttach(EntityPlayer player, ItemStack aCover, ICoverable aTileEntity, ForgeDirection side) { - // Do nothing by default. - } - - // endregion - - // region UI stuff - - protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache(); - protected GT_GUIColorOverride colorOverride; - private static final String guiTexturePath = "gregtech:textures/gui/GuiCover.png"; - - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new UIFactory(buildContext).createWindow(); - } - - /** - * Creates {@link ModularWindow} for this cover. This is separated from base class, as attaching the same covers in - * different sides of the same tile needs different UI with different context. - */ - protected class UIFactory { - - private final GT_CoverUIBuildContext uiBuildContext; - - public UIFactory(GT_CoverUIBuildContext buildContext) { - this.uiBuildContext = buildContext; - } - - public ModularWindow createWindow() { - ModularWindow.Builder builder = ModularWindow.builder(getGUIWidth(), getGUIHeight()); - builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); - builder.setGuiTint(getUIBuildContext().getGuiColorization()); - maybeBindPlayerInventory(builder); - addTitleToUI(builder); - addUIWidgets(builder); - if (getUIBuildContext().isAnotherWindow()) { - builder.widget( - ButtonWidget.closeWindowButton(true) - .setPos(getGUIWidth() - 15, 3)); - } - - final CoverInfo coverInfo = uiBuildContext.getTile() - .getCoverInfoAtSide(uiBuildContext.getCoverSide()); - final GT_CoverBehaviorBase behavior = coverInfo.getCoverBehavior(); - if (coverInfo.getMinimumTickRate() > 0 && behavior.allowsTickRateAddition()) { - builder.widget( - new GT_CoverTickRateButton(coverInfo, builder).setPos(getGUIWidth() - 24, getGUIHeight() - 24)); - } - - return builder.build(); - } - - protected void maybeBindPlayerInventory(ModularWindow.Builder builder) { - if (doesBindPlayerInventory() && !getUIBuildContext().isAnotherWindow()) { - builder.bindPlayerInventory(getUIBuildContext().getPlayer(), 7, GUITextureSet.DEFAULT.getItemSlot()); - } - } - - /** - * Override this to add widgets for your UI. - */ - protected void addUIWidgets(ModularWindow.Builder builder) {} - - public GT_CoverUIBuildContext getUIBuildContext() { - return uiBuildContext; - } - - /** - * Can return null when cover data is invalid e.g. tile is broken or cover is removed - */ - @Nullable - public T getCoverData() { - if (isCoverValid()) { - return forceCast( - getUIBuildContext().getTile() - .getComplexCoverDataAtSide(getUIBuildContext().getCoverSide())); - } else { - return null; - } - } - - public boolean setCoverData(T data) { - if (isCoverValid()) { - getUIBuildContext().getTile() - .receiveCoverData( - getUIBuildContext().getCoverSide(), - getUIBuildContext().getCoverID(), - data, - getUIBuildContext().getPlayer() instanceof EntityPlayerMP - ? (EntityPlayerMP) getUIBuildContext().getPlayer() - : null); - return true; - } else { - return false; - } - } - - public boolean isCoverValid() { - return !getUIBuildContext().getTile() - .isDead() - && getUIBuildContext().getTile() - .getCoverBehaviorAtSideNew(getUIBuildContext().getCoverSide()) != GregTech_API.sNoBehavior; - } - - protected void addTitleToUI(ModularWindow.Builder builder) { - ItemStack coverItem = GT_Utility.intToStack(getUIBuildContext().getCoverID()); - if (coverItem != null) { - builder.widget( - new ItemDrawable(coverItem).asWidget() - .setPos(5, 5) - .setSize(16, 16)) - .widget( - new TextWidget(coverItem.getDisplayName()).setDefaultColor(COLOR_TITLE.get()) - .setPos(25, 9)); - } - } - - protected int getGUIWidth() { - return 176; - } - - protected int getGUIHeight() { - return 107; - } - - protected boolean doesBindPlayerInventory() { - return false; - } - - protected int getTextColorOrDefault(String textType, int defaultColor) { - return colorOverride.getTextColorOrDefault(textType, defaultColor); - } - - protected final Supplier COLOR_TITLE = () -> getTextColorOrDefault("title", 0x222222); - protected final Supplier COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x555555); - protected final Supplier COLOR_TEXT_WARN = () -> getTextColorOrDefault("text_warn", 0xff0000); - } - - // endregion - - // region impl - - protected Block getFacadeBlockImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return null; - } - - protected int getFacadeMetaImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return 0; - } - - protected ItemStack getDisplayStackImpl(int aCoverID, T aCoverVariable) { - return GT_Utility.intToStack(aCoverID); - } - - protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return coverFGTexture; - } - - protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return null; - } - - protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - protected void onDataChangedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {} - - protected void preDataChangedImpl(ForgeDirection side, int aCoverID, int aNewCoverId, T aCoverVariable, - T aNewCoverVariable, ICoverable aTileEntity) {} - - protected void onDroppedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {} - - protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {} - - protected void onCoverUnloadImpl(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, - ICoverable aTileEntity) {} - - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return false; - } - - /** - * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time. - */ - protected T doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, T aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return aCoverVariable; - } - - /** - * Called when someone rightclicks this Cover. - *

- * return true, if something actually happens. - */ - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - return false; - } - - /** - * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case. - *

- * return the new Value of the Cover Variable - */ - protected T onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - return aCoverVariable; - } - - /** - * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case. - */ - protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer) { - if (hasCoverGUI() && aPlayer instanceof EntityPlayerMP) { - lastPlayer = new WeakReference<>(aPlayer); - GT_UIInfos.openCoverUI(aTileEntity, aPlayer, side); - return true; - } - return false; - } - - /** - * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is - * getting broken, only if you break the Cover away from the Machine. - */ - protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, - boolean aForced) { - return true; - } - - /** - * Gives a small Text for the status of the Cover. - */ - protected String getDescriptionImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return E; - } - - /** - * How Blast Proof the Cover is. 30 is normal. - */ - protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return 10.0F; - } - - /** - * If it lets RS-Signals into the Block - *

- * This is just Informative so that Machines know if their Redstone Input is blocked or not - */ - protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets RS-Signals out of the Block - */ - protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Energy into the Block - */ - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Energy out of the Block - */ - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not. - */ - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not. - */ - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no - * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each - * Slot). - */ - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no - * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each - * Slot). - */ - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return false; - } - - /** - * If it lets you rightclick the Machine normally - */ - protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return true; - } - - /** - * Needs to return true for Covers, which have a Redstone Output on their Facing. - */ - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - /** - * if this Cover should let Pipe Connections look connected even if it is not the case. - */ - protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - /** - * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The - * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0. - */ - protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, T aCoverVariable, - ICoverable aTileEntity) { - return letsRedstoneGoIn(side, aCoverID, aCoverVariable, aTileEntity) ? aInputRedstone : 0; - } - - /** - * Gets the Tick Rate for doCoverThings of the Cover - *

- * 0 = No Ticks! Yes, 0 is Default, you have to override this - */ - protected int getTickRateImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return 0; - } - - /** - * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then). - */ - protected byte getLensColorImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return -1; - } - - /** - * @return the ItemStack dropped by this Cover - */ - protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return GT_OreDictUnificator.get(true, aTileEntity.getCoverItemAtSide(side)); - } - - // endregion - - // region no data - - /** - * Checks if the Cover can be placed on this. - */ - public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { - return true; - } - - public boolean hasCoverGUI() { - return false; - } - - /** - * Called when someone rightclicks this Cover Client Side - *

- * return true, if something actually happens. - */ - public boolean onCoverRightclickClient(ForgeDirection side, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - return false; - } - - /** - * If this is a simple Cover, which can also be used on Bronze Machines and similar. - */ - public boolean isSimpleCover() { - return false; - } - - /** - * sets the Cover upon placement. - */ - public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) { - aTileEntity.setCoverIDAtSide(side, GT_Utility.stackToInt(aCover)); - } - - public boolean allowsCopyPasteTool() { - return true; - } - - public boolean allowsTickRateAddition() { - return true; - } - - @NotNull - public final List getAdditionalTooltip(ISerializableObject coverData) { - return getAdditionalTooltipImpl(forceCast(coverData)); - } - - /** - * Override to add to the tooltip generated when a user hovers over the cover on the left side of a machine's UI. - * - * @param coverData The cover data associated with the cover on a particular side. - * @return A list of new tooltip entries. Entries are inserted at the top, just after the name and direction line. - */ - protected List getAdditionalTooltipImpl(T coverData) { - return ImmutableList.of(); - } - // endregion -} diff --git a/src/main/java/gregtech/api/util/GT_CreativeTab.java b/src/main/java/gregtech/api/util/GT_CreativeTab.java deleted file mode 100644 index 1049f40278..0000000000 --- a/src/main/java/gregtech/api/util/GT_CreativeTab.java +++ /dev/null @@ -1,26 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.ItemList; - -public class GT_CreativeTab extends CreativeTabs { - - public GT_CreativeTab(String aName, String aLocalName) { - super("GregTech." + aName); - GT_LanguageManager.addStringLocalization("itemGroup.GregTech." + aName, aLocalName); - } - - @Override - public ItemStack getIconItemStack() { - return ItemList.Tool_Cheat.get(1, new ItemStack(Blocks.iron_block, 1)); - } - - @Override - public Item getTabIconItem() { - return ItemList.Circuit_Integrated.getItem(); - } -} diff --git a/src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java b/src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java deleted file mode 100644 index d59796b251..0000000000 --- a/src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java +++ /dev/null @@ -1,114 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; - -public class GT_ExoticEnergyInputHelper { - - /** - * The Valid Types of TecTech Hatch List. - */ - private static final List> sExoticEnergyHatchType = new ArrayList<>(); - - static { - tryRegister("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti"); - tryRegister("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel"); - } - - public static void register(Class clazz) { - if (!GT_MetaTileEntity_Hatch.class.isAssignableFrom(clazz)) throw new IllegalArgumentException( - clazz.getName() + " is not a subclass of " + GT_MetaTileEntity_Hatch.class.getName()); - sExoticEnergyHatchType.add(clazz); - } - - @SuppressWarnings("unchecked") - public static void tryRegister(String className) { - Class clazz; - try { - clazz = Class.forName(className); - } catch (ClassNotFoundException e) { - return; - } - if (!GT_MetaTileEntity_Hatch.class.isAssignableFrom(clazz)) throw new IllegalArgumentException( - clazz.getName() + " is not a subclass of " + GT_MetaTileEntity_Hatch.class.getName()); - sExoticEnergyHatchType.add((Class) clazz); - } - - public static boolean drainEnergy(long aEU, Collection hatches) { - for (GT_MetaTileEntity_Hatch tHatch : hatches) { - long tDrain = Math.min( - tHatch.getBaseMetaTileEntity() - .getStoredEU(), - aEU); - tHatch.getBaseMetaTileEntity() - .decreaseStoredEnergyUnits(tDrain, false); - aEU -= tDrain; - } - return aEU <= 0; - } - - public static boolean isExoticEnergyInput(IMetaTileEntity aHatch) { - for (Class clazz : sExoticEnergyHatchType) { - if (clazz.isInstance(aHatch)) return true; - } - return false; - } - - public static long getTotalEuMulti(Collection hatches) { - long rEU = 0L; - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) { - rEU += tHatch.getBaseMetaTileEntity() - .getInputVoltage() * tHatch.maxWorkingAmperesIn(); - } - return rEU; - } - - public static long getMaxInputVoltageMulti(Collection hatches) { - long rVoltage = 0; - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) { - rVoltage += tHatch.getBaseMetaTileEntity() - .getInputVoltage(); - } - return rVoltage; - } - - public static long getAverageInputVoltageMulti(Collection hatches) { - long rVoltage = 0; - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) { - rVoltage += tHatch.getBaseMetaTileEntity() - .getInputVoltage(); - } - if (hatches.isEmpty()) { - return 0; - } - return rVoltage / hatches.size(); - } - - public static long getMaxInputAmpsMulti(Collection hatches) { - long rAmp = 0; - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) { - rAmp += tHatch.getBaseMetaTileEntity() - .getInputAmperage(); - } - return rAmp; - } - - public static long getMaxWorkingInputAmpsMulti(Collection hatches) { - long rAmp = 0; - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) { - rAmp += tHatch.maxWorkingAmperesIn(); - } - return rAmp; - } - - public static List> getAllClasses() { - return Collections.unmodifiableList(sExoticEnergyHatchType); - } -} diff --git a/src/main/java/gregtech/api/util/GT_FoodStat.java b/src/main/java/gregtech/api/util/GT_FoodStat.java deleted file mode 100644 index 5eda76f9d0..0000000000 --- a/src/main/java/gregtech/api/util/GT_FoodStat.java +++ /dev/null @@ -1,122 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; - -import gregtech.api.damagesources.GT_DamageSources; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.IFoodStat; -import gregtech.api.items.GT_MetaBase_Item; - -public class GT_FoodStat implements IFoodStat { - - private final int mFoodLevel; - private final int[] mPotionEffects; - private final float mSaturation; - private final EnumAction mAction; - private final ItemStack mEmptyContainer; - private final boolean mAlwaysEdible, mInvisibleParticles, mIsRotten; - private boolean mExplosive = false, mMilk = false; - - /** - * @param aFoodLevel Amount of Food in Half Bacon [0 - 20] - * @param aSaturation Amount of Saturation [0.0F - 1.0F] - * @param aAction The Action to be used. If this is null, it uses the Eating Action - * @param aEmptyContainer An empty Container (Optional) - * @param aAlwaysEdible If this Item is always edible, like Golden Apples or Potions - * @param aInvisibleParticles If the Particles of the Potion Effects are invisible - * @param aPotionEffects An Array of Potion Effects with %4==0 Elements as follows ID of a Potion Effect. 0 for - * none Duration of the Potion in Ticks Level of the Effect. [0, 1, 2] are for [I, II, - * III] The likelihood that this Potion Effect takes place upon being eaten [1 - 100] - */ - public GT_FoodStat(int aFoodLevel, float aSaturation, EnumAction aAction, ItemStack aEmptyContainer, - boolean aAlwaysEdible, boolean aInvisibleParticles, boolean aIsRotten, int... aPotionEffects) { - mFoodLevel = aFoodLevel; - mSaturation = aSaturation; - mAction = aAction == null ? EnumAction.eat : aAction; - mPotionEffects = aPotionEffects; - mEmptyContainer = GT_Utility.copyOrNull(aEmptyContainer); - mInvisibleParticles = aInvisibleParticles; - mAlwaysEdible = aAlwaysEdible; - mIsRotten = aIsRotten; - } - - public GT_FoodStat setExplosive() { - mExplosive = true; - return this; - } - - public GT_FoodStat setMilk() { - mMilk = true; - return this; - } - - @Override - public int getFoodLevel(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) { - return mFoodLevel; - } - - @Override - public float getSaturation(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) { - return mSaturation; - } - - @Override - public void onEaten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) { - aStack.stackSize--; - ItemStack tStack = GT_OreDictUnificator.get(GT_Utility.copyOrNull(mEmptyContainer)); - if (tStack != null && !aPlayer.inventory.addItemStackToInventory(tStack)) - aPlayer.dropPlayerItemWithRandomChoice(tStack, true); - - new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setIdentifier(SoundResource.RANDOM_BURP) - .setVolume(0.5F) - .setPitch(aPlayer.worldObj.rand.nextFloat() * 0.1F + 0.9F) - .setEntity(aPlayer) - .setWorld(aPlayer.worldObj) - .run(); - - if (!aPlayer.worldObj.isRemote) { - if (mMilk) { - aPlayer.curePotionEffects(new ItemStack(Items.milk_bucket, 1, 0)); - } - for (int i = 3; i < mPotionEffects.length; i += 4) { - if (aPlayer.worldObj.rand.nextInt(100) < mPotionEffects[i]) { - aPlayer.addPotionEffect( - new PotionEffect( - mPotionEffects[i - 3], - mPotionEffects[i - 2], - mPotionEffects[i - 1], - mInvisibleParticles)); - } - } - if (mExplosive) { - new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder().setSmoking(true) - .setFlaming(true) - .setStrength(4f) - .setPosition(aPlayer.posX, aPlayer.posY, aPlayer.posZ) - .setEntity(aPlayer) - .setWorld(aPlayer.worldObj) - .run(); - aPlayer.attackEntityFrom(GT_DamageSources.getExplodingDamage(), Float.MAX_VALUE); - } - } - } - - @Override - public EnumAction getFoodAction(GT_MetaBase_Item aItem, ItemStack aStack) { - return mAction; - } - - @Override - public boolean alwaysEdible(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) { - return mAlwaysEdible; - } - - @Override - public boolean isRotten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) { - return mIsRotten; - } -} diff --git a/src/main/java/gregtech/api/util/GT_Forestry_Compat.java b/src/main/java/gregtech/api/util/GT_Forestry_Compat.java deleted file mode 100644 index 554964a4ed..0000000000 --- a/src/main/java/gregtech/api/util/GT_Forestry_Compat.java +++ /dev/null @@ -1,193 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.recipe.RecipeMaps.centrifugeNonCellRecipes; -import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes; -import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; - -import java.util.Map; - -import net.minecraft.item.ItemStack; - -import forestry.api.recipes.ICentrifugeRecipe; -import forestry.api.recipes.ISqueezerRecipe; -import forestry.api.recipes.RecipeManagers; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.recipe.RecipeMaps; - -public class GT_Forestry_Compat { - - public static void populateFakeNeiRecipes() { - if (ItemList.FR_Bee_Drone.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Bee_Drone.getWildcard(1L)) - .itemOutputs(ItemList.FR_Bee_Drone.getWithName(1L, "Scanned Drone")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_Bee_Princess.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Bee_Princess.getWildcard(1L)) - .itemOutputs(ItemList.FR_Bee_Princess.getWithName(1L, "Scanned Princess")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_Bee_Queen.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Bee_Queen.getWildcard(1L)) - .itemOutputs(ItemList.FR_Bee_Queen.getWithName(1L, "Scanned Queen")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_Tree_Sapling.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Tree_Sapling.getWildcard(1L)) - .itemOutputs(ItemList.FR_Tree_Sapling.getWithName(1L, "Scanned Sapling")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_Butterfly.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Butterfly.getWildcard(1L)) - .itemOutputs(ItemList.FR_Butterfly.getWithName(1L, "Scanned Butterfly")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_Larvae.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Larvae.getWildcard(1L)) - .itemOutputs(ItemList.FR_Larvae.getWithName(1L, "Scanned Larvae")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_Serum.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Serum.getWildcard(1L)) - .itemOutputs(ItemList.FR_Serum.getWithName(1L, "Scanned Serum")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_Caterpillar.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_Caterpillar.getWildcard(1L)) - .itemOutputs(ItemList.FR_Caterpillar.getWithName(1L, "Scanned Caterpillar")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - if (ItemList.FR_PollenFertile.get(1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.FR_PollenFertile.getWildcard(1L)) - .itemOutputs(ItemList.FR_PollenFertile.getWithName(1L, "Scanned Pollen")) - .fluidInputs(Materials.Honey.getFluid(100L)) - .duration(25 * SECONDS) - .eut(2) - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes); - } - } - - public static void transferCentrifugeRecipes() { - try { - for (ICentrifugeRecipe tRecipe : RecipeManagers.centrifugeManager.recipes()) { - Map outputs = tRecipe.getAllProducts(); - ItemStack[] tOutputs = new ItemStack[outputs.size()]; - int[] tChances = new int[outputs.size()]; - int i = 0; - for (Map.Entry entry : outputs.entrySet()) { - tChances[i] = (int) (entry.getValue() * 10000); - tOutputs[i] = entry.getKey() - .copy(); - i++; - } - GT_Values.RA.stdBuilder() - .itemInputs(tRecipe.getInput()) - .itemOutputs(tOutputs) - .outputChances(tChances) - .duration(6 * SECONDS + 8 * TICKS) - .eut(5) - .addTo(centrifugeRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(tRecipe.getInput()) - .itemOutputs(tOutputs) - .outputChances(tChances) - .duration(6 * SECONDS + 8 * TICKS) - .eut(5) - .addTo(centrifugeNonCellRecipes); - } - } catch (Throwable e) { - if (GT_Values.D1) { - e.printStackTrace(GT_Log.err); - } - } - } - - public static void transferSqueezerRecipes() { - try { - for (ISqueezerRecipe tRecipe : RecipeManagers.squeezerManager.recipes()) { - if ((tRecipe.getResources().length == 1) && (tRecipe.getFluidOutput() != null) - && (tRecipe.getResources()[0] != null)) { - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); - recipeBuilder.itemInputs(tRecipe.getResources()[0]); - if (tRecipe.getRemnants() != null) { - recipeBuilder.itemOutputs(tRecipe.getRemnants()) - .outputChances((int) (tRecipe.getRemnantsChance() * 10000)); - } - recipeBuilder.fluidOutputs(tRecipe.getFluidOutput()) - .duration(1 * SECONDS + 12 * TICKS) - .eut(8) - .addTo(RecipeMaps.fluidExtractionRecipes); - } - } - } catch (Throwable e) { - if (GT_Values.D1) { - e.printStackTrace(GT_Log.err); - } - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_GC_Compat.java b/src/main/java/gregtech/api/util/GT_GC_Compat.java deleted file mode 100644 index 24710ab0ac..0000000000 --- a/src/main/java/gregtech/api/util/GT_GC_Compat.java +++ /dev/null @@ -1,52 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.Mods.GalacticraftCore; - -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; - -import micdoodle8.mods.galacticraft.api.power.EnergySource; -import micdoodle8.mods.galacticraft.api.power.EnergySource.EnergySourceAdjacent; -import micdoodle8.mods.galacticraft.api.power.IEnergyHandlerGC; -import micdoodle8.mods.galacticraft.api.transmission.NetworkType; -import micdoodle8.mods.galacticraft.api.transmission.tile.IConnector; -import micdoodle8.mods.galacticraft.core.energy.EnergyConfigHandler; - -public class GT_GC_Compat { - - public static long insertEnergyInto(TileEntity tTileEntity, long aVoltage, ForgeDirection tDirection) { - // GC Compat - if (GalacticraftCore.isModLoaded() && tTileEntity instanceof IEnergyHandlerGC) { - if (!(tTileEntity instanceof IConnector) - || ((IConnector) tTileEntity).canConnect(tDirection, NetworkType.POWER)) { - EnergySource eSource = new EnergySourceAdjacent(tDirection); - - float tSizeToReceive = aVoltage * EnergyConfigHandler.IC2_RATIO, - tStored = ((IEnergyHandlerGC) tTileEntity).getEnergyStoredGC(eSource); - if (tSizeToReceive >= tStored - || tSizeToReceive <= ((IEnergyHandlerGC) tTileEntity).getMaxEnergyStoredGC(eSource) - tStored) { - float tReceived = ((IEnergyHandlerGC) tTileEntity).receiveEnergyGC(eSource, tSizeToReceive, false); - if (tReceived > 0) { - tSizeToReceive -= tReceived; - while (tSizeToReceive > 0) { - tReceived = ((IEnergyHandlerGC) tTileEntity) - .receiveEnergyGC(eSource, tSizeToReceive, false); - if (tReceived < 1) break; - tSizeToReceive -= tReceived; - } - return 1; - } - } - } - return 0; - } - return 2; - } - - public static boolean canConnect(TileEntity tTileEntity, ForgeDirection tDirection) { - // GC Compat - return GalacticraftCore.isModLoaded() && tTileEntity instanceof IEnergyHandlerGC - && (!(tTileEntity instanceof IConnector) - || ((IConnector) tTileEntity).canConnect(tDirection, NetworkType.POWER)); - } -} diff --git a/src/main/java/gregtech/api/util/GT_HatchElementBuilder.java b/src/main/java/gregtech/api/util/GT_HatchElementBuilder.java deleted file mode 100644 index 416edc9c11..0000000000 --- a/src/main/java/gregtech/api/util/GT_HatchElementBuilder.java +++ /dev/null @@ -1,547 +0,0 @@ -package gregtech.api.util; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.EnumSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.alignment.constructable.ChannelDataAccessor; -import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment; -import com.gtnewhorizon.structurelib.structure.IItemSource; -import com.gtnewhorizon.structurelib.structure.IStructureElement; -import com.gtnewhorizon.structurelib.structure.IStructureElementChain; -import com.gtnewhorizon.structurelib.structure.IStructureElementNoPlacement; -import com.gtnewhorizon.structurelib.structure.StructureUtility; -import com.gtnewhorizon.structurelib.util.ItemStackPredicate; - -import gnu.trove.TIntCollection; -import gnu.trove.list.array.TIntArrayList; -import gnu.trove.set.hash.TIntHashSet; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.common.blocks.GT_Item_Machines; - -public class GT_HatchElementBuilder { - - private interface Builtin { - } - - private IGT_HatchAdder mAdder; - private int mCasingIndex = -1; - private int mDot = -1; - private BiPredicate mShouldSkip; - private BiFunction> mHatchItemFilter; - private Supplier mHatchItemType; - private Predicate mReject; - private boolean mCacheHint; - private boolean mNoStop; - private boolean mExclusive; - private EnumSet mDisallowedDirection = EnumSet.noneOf(ForgeDirection.class); - - private GT_HatchElementBuilder() {} - - public static GT_HatchElementBuilder builder() { - return new GT_HatchElementBuilder<>(); - } - - // region composite - - /** - * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. TODO add doc - */ - @SafeVarargs - public final GT_HatchElementBuilder anyOf(IHatchElement... elements) { - if (elements == null || elements.length == 0) throw new IllegalArgumentException(); - return adder( - Arrays.stream(elements) - .map( - e -> e.adder() - .rebrand()) - .reduce(IGT_HatchAdder::orElse) - .get()).hatchClasses( - Arrays.stream(elements) - .map(IHatchElement::mteClasses) - .flatMap(Collection::stream) - .collect(Collectors.toList())) - .cacheHint( - () -> Arrays.stream(elements) - .map(IHatchElement::name) - .sorted() - .collect(Collectors.joining(" or ", "of type ", ""))); - } - - /** - * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. - *

- * Will rotate through all elements TODO add doc - */ - @SafeVarargs - public final GT_HatchElementBuilder atLeast(IHatchElement... elements) { - if (elements == null || elements.length == 0) throw new IllegalArgumentException(); - return atLeast( - Arrays.stream(elements) - .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))); - } - - /** - * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. - *

- * Will rotate through all elements TODO add doc - */ - public final GT_HatchElementBuilder atLeastList(List> elements) { - if (elements == null || elements.isEmpty()) throw new IllegalArgumentException(); - return atLeast( - elements.stream() - .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))); - } - - /** - * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. TODO add doc - */ - public final GT_HatchElementBuilder atLeast(Map, ? extends Number> elements) { - if (elements == null || elements.isEmpty() || elements.containsKey(null) || elements.containsValue(null)) - throw new IllegalArgumentException(); - List> list = elements.keySet() - .stream() - .map(IHatchElement::mteClasses) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - // map cannot be null or empty, so assert Optional isPresent - return adder( - elements.keySet() - .stream() - .map( - e -> e.adder() - .rebrand()) - .reduce(IGT_HatchAdder::orElse) - .orElseThrow(AssertionError::new)) - .hatchItemFilter( - obj -> GT_StructureUtility.filterByMTEClass( - elements.entrySet() - .stream() - .filter( - entry -> entry.getKey() - .count(obj) - < entry.getValue() - .longValue()) - .flatMap( - entry -> entry.getKey() - .mteClasses() - .stream()) - .collect(Collectors.toList()))) - .shouldReject( - obj -> elements.entrySet() - .stream() - .allMatch( - e -> e.getKey() - .count(obj) - >= e.getValue() - .longValue())) - .shouldSkip( - (BiPredicate & Builtin) (c, - t) -> t != null && list.stream() - .anyMatch(clazz -> clazz.isInstance(t.getMetaTileEntity()))) - .cacheHint( - () -> elements.keySet() - .stream() - .map(IHatchElement::name) - .sorted() - .collect(Collectors.joining(" or ", "of type ", ""))); - } - // endregion - - // region primitives - - /** - * Mark this hatch element as the only candidate of given structure element. (e.g. muffler hatch on top of EBF) - * Currently, this will make the built IStructureElement to ignore gt_no_hatch directive from player - * - * Do note that {@link #buildAndChain(IStructureElement[])} and its overloads will force the resulting structure - * element - * to be non-exclusive. - */ - public GT_HatchElementBuilder exclusive() { - mExclusive = true; - return this; - } - - public GT_HatchElementBuilder adder(IGT_HatchAdder aAdder) { - if (aAdder == null) throw new IllegalArgumentException(); - mAdder = aAdder; - return this; - } - - public GT_HatchElementBuilder casingIndex(int aCasingIndex) { - if (aCasingIndex <= 0) throw new IllegalArgumentException(); - mCasingIndex = aCasingIndex; - return this; - } - - public GT_HatchElementBuilder dot(int aDot) { - if (aDot <= 0) throw new IllegalArgumentException(); - mDot = aDot; - return this; - } - - public GT_HatchElementBuilder shouldSkip(BiPredicate aShouldSkip) { - if (!(aShouldSkip instanceof Builtin) || mShouldSkip != null) { - if (!(mShouldSkip instanceof Builtin) && mShouldSkip != null) throw new IllegalStateException(); - if (aShouldSkip == null) throw new IllegalArgumentException(); - } - mShouldSkip = aShouldSkip; - return this; - } - - public GT_HatchElementBuilder shouldReject(Predicate aShouldReject) { - if (aShouldReject == null) throw new IllegalArgumentException(); - mReject = aShouldReject; - return this; - } - - public GT_HatchElementBuilder hatchItemFilter( - Function> aHatchItemFilter) { - if (aHatchItemFilter == null) throw new IllegalArgumentException(); - mHatchItemFilter = (t, s) -> aHatchItemFilter.apply(t); - return this; - } - - public GT_HatchElementBuilder hatchItemFilterAnd( - Function> aHatchItemFilter) { - if (aHatchItemFilter == null) throw new IllegalArgumentException(); - BiFunction> tOldFilter = mHatchItemFilter; - mHatchItemFilter = (t, s) -> tOldFilter.apply(t, s) - .and(aHatchItemFilter.apply(t)); - return this; - } - - public GT_HatchElementBuilder hatchItemFilter( - BiFunction> aHatchItemFilter) { - if (aHatchItemFilter == null) throw new IllegalArgumentException(); - mHatchItemFilter = aHatchItemFilter; - return this; - } - - public GT_HatchElementBuilder hatchItemFilterAnd( - BiFunction> aHatchItemFilter) { - if (aHatchItemFilter == null) throw new IllegalArgumentException(); - BiFunction> tOldFilter = mHatchItemFilter; - mHatchItemFilter = (t, s) -> tOldFilter.apply(t, s) - .and(aHatchItemFilter.apply(t, s)); - return this; - } - - // region hint - public GT_HatchElementBuilder hint(Supplier aSupplier) { - if (aSupplier == null) throw new IllegalArgumentException(); - mHatchItemType = aSupplier; - mCacheHint = false; - return this; - } - - public GT_HatchElementBuilder cacheHint(Supplier aSupplier) { - if (aSupplier == null) throw new IllegalArgumentException(); - mHatchItemType = aSupplier; - mCacheHint = true; - return this; - } - - public GT_HatchElementBuilder cacheHint() { - if (mHatchItemType == null) throw new IllegalStateException(); - mCacheHint = true; - return this; - } - // endregion - - public GT_HatchElementBuilder continueIfSuccess() { - mNoStop = true; - return this; - } - - public GT_HatchElementBuilder stopIfSuccess() { - mNoStop = false; - return this; - } - - /** - * Help automatic hatch side determination code by ruling out some directions. Note the automatic hatch side - * determination code will choose to use the default facing if the final allowed facing set is empty. - *

- * This will clear the sides set by previous call to this or {@link #allowOnly(ForgeDirection...)} - *

- * Usually mandatory for multis with multiple slices, and otherwise not needed if it contains a single slice only. - * - * @param facings disallowed direction in ABC coordinate system - */ - public GT_HatchElementBuilder disallowOnly(ForgeDirection... facings) { - if (facings == null) throw new IllegalArgumentException(); - mDisallowedDirection = EnumSet.copyOf(Arrays.asList(facings)); - return this; - } - - /** - * Help automatic hatch side determination code by allowing only some directions. Note the automatic hatch side - * determination code will choose to use the default facing if the final allowed facing set is empty. - *

- * This will clear the sides set by previous call to this or {@link #disallowOnly(ForgeDirection...)} - *

- * Usually mandatory for multis with multiple slices, and otherwise not needed if it contains a single slice only. - * - * @param facings allowed direction in ABC coordinate system - */ - public GT_HatchElementBuilder allowOnly(ForgeDirection... facings) { - if (facings == null) throw new IllegalArgumentException(); - mDisallowedDirection = EnumSet.complementOf(EnumSet.copyOf(Arrays.asList(facings))); - mDisallowedDirection.remove(ForgeDirection.UNKNOWN); - return this; - } - // endregion - - // region intermediate - public GT_HatchElementBuilder hatchClass(Class clazz) { - return hatchItemFilter(c -> is -> clazz.isInstance(GT_Item_Machines.getMetaTileEntity(is))) - .cacheHint(() -> "of class " + clazz.getSimpleName()) - .shouldSkip( - (BiPredicate & Builtin) (c, t) -> clazz - .isInstance(t.getMetaTileEntity())); - } - - @SafeVarargs - public final GT_HatchElementBuilder hatchClasses(Class... classes) { - return hatchClasses(Arrays.asList(classes)); - } - - public final GT_HatchElementBuilder hatchClasses(List> classes) { - List> list = new ArrayList<>(classes); - return hatchItemFilter(obj -> GT_StructureUtility.filterByMTEClass(list)).cacheHint( - () -> list.stream() - .map(Class::getSimpleName) - .sorted() - .collect(Collectors.joining(" or ", "of class ", ""))) - .shouldSkip( - (BiPredicate & Builtin) (c, t) -> t != null && list.stream() - .anyMatch(clazz -> clazz.isInstance(t.getMetaTileEntity()))); - } - - public GT_HatchElementBuilder hatchId(int aId) { - return hatchItemFilter( - c -> is -> GT_Utility.isStackValid(is) && is.getItem() instanceof GT_Item_Machines - && is.getItemDamage() == aId).cacheHint(() -> "of id " + aId) - .shouldSkip( - (BiPredicate & Builtin) (c, t) -> t != null - && t.getMetaTileID() == aId); - } - - public GT_HatchElementBuilder hatchIds(int... aIds) { - if (aIds == null || aIds.length == 0) throw new IllegalArgumentException(); - if (aIds.length == 1) return hatchId(aIds[0]); - TIntCollection coll = aIds.length < 16 ? new TIntArrayList(aIds) : new TIntHashSet(aIds); - return hatchItemFilter( - c -> is -> GT_Utility.isStackValid(is) && is.getItem() instanceof GT_Item_Machines - && coll.contains(is.getItemDamage())).cacheHint( - () -> Arrays.stream(coll.toArray()) - .sorted() - .mapToObj(String::valueOf) - .collect(Collectors.joining(" or ", "of id ", ""))) - .shouldSkip( - (BiPredicate & Builtin) (c, t) -> t != null - && coll.contains(t.getMetaTileID())); - } - - // endregion - - @SuppressWarnings("unchecked") - @SafeVarargs - public final IStructureElementChain buildAndChain(IStructureElement... elements) { - // just in case - mExclusive = false; - List> l = new ArrayList<>(); - l.add(build()); - l.addAll(Arrays.asList(elements)); - IStructureElement[] array = l.toArray(new IStructureElement[0]); - return () -> array; - } - - public final IStructureElementChain buildAndChain(Block block, int meta) { - return buildAndChain(ofBlock(block, meta)); - } - - public IStructureElement build() { - if (mAdder == null || mCasingIndex == -1 || mDot == -1) { - throw new IllegalArgumentException(); - } - if (mHatchItemFilter == null) { - // no item filter -> no placement - return new IStructureElementNoPlacement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - return tileEntity instanceof IGregTechTileEntity - && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1); - return true; - } - }; - } - return new IStructureElement<>() { - - private String mHint = mHatchItemType == null ? "unspecified GT hatch" : mHatchItemType.get(); - - @Override - public boolean check(T t, World world, int x, int y, int z) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - return tileEntity instanceof IGregTechTileEntity - && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1); - return true; - } - - @Override - public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) { - // TODO - return false; - } - - private String getHint() { - if (mHint != null) return mHint; - String tHint = mHatchItemType.get(); - if (tHint == null) return "?"; - // TODO move this to some .lang instead of half ass it into the crappy gt lang file - tHint = GT_LanguageManager.addStringLocalization("Hatch_Type_" + tHint.replace(' ', '_'), tHint); - if (mCacheHint) { - mHint = tHint; - if (mHint != null) - // yeet the getter, since its product is retrieved and cached - mHatchItemType = null; - } - return tHint; - } - - @Override - public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - return BlocksToPlace.create(mHatchItemFilter.apply(t, trigger)); - } - - @Deprecated - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - IItemSource s, EntityPlayerMP actor, Consumer chatter) { - return survivalPlaceBlock( - t, - world, - x, - y, - z, - trigger, - AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - if (mShouldSkip != null) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - if (tileEntity instanceof IGregTechTileEntity - && mShouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return PlaceResult.SKIP; - } - if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) - return PlaceResult.REJECT; - if (mReject != null && mReject.test(t)) return PlaceResult.REJECT; - if (ChannelDataAccessor.hasSubChannel(trigger, "gt_no_hatch") && !mExclusive) { - String type = getHint(); - env.getChatter() - .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_hatch", type)); - return PlaceResult.REJECT; - } - ItemStack taken = env.getSource() - .takeOne(mHatchItemFilter.apply(t, trigger), true); - if (GT_Utility.isStackInvalid(taken)) { - String type = getHint(); - env.getChatter() - .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_hatch", type)); - return PlaceResult.REJECT; - } - if (StructureUtility.survivalPlaceBlock( - taken, - ItemStackPredicate.NBTMode.IGNORE, - null, - true, - world, - x, - y, - z, - env.getSource(), - env.getActor()) != PlaceResult.ACCEPT) { - return PlaceResult.REJECT; - } - // try to infer facing - EnumSet allowed = EnumSet.noneOf(ForgeDirection.class); - // first find which face of block is not contained in structure - if (env.getAPILevel() == AutoPlaceEnvironment.APILevel.Legacy) { - // a legacy decorator isn't passing down necessary information - // in that case, we just assume all facing is allowed - allowed.addAll(Arrays.asList(ForgeDirection.VALID_DIRECTIONS)); - } else { - for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { - // as noted on getWorldDirection Y axis should be flipped before use - if (env.isContainedInPiece(direction.offsetX, -direction.offsetY, direction.offsetZ)) continue; - // explicitly rejected, probably obstructed by another slice - if (mDisallowedDirection.contains(direction)) continue; - ForgeDirection rotated = env.getFacing() - .getWorldDirection( - (direction.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0 - ? direction.getOpposite() - : direction); - allowed.add(rotated); - } - } - if (!allowed.isEmpty()) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - if (tileEntity instanceof IGregTechTileEntity) { - ForgeDirection result = null; - // find the first facing available, but prefer a facing that isn't up/down - for (ForgeDirection facing : allowed) { - result = facing; - if ((facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) break; // Horizontal - } - assert result != null; - ((IGregTechTileEntity) tileEntity).setFrontFacing(result); - } - } - return mNoStop ? PlaceResult.ACCEPT : PlaceResult.ACCEPT_STOP; - } - }; - } -} diff --git a/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java b/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java deleted file mode 100644 index 796699c261..0000000000 --- a/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.item.ItemStack; - -import ic2.api.item.IBoxable; - -public class GT_IBoxableWrapper implements IBoxable { - - @Override - public boolean canBeStoredInToolbox(ItemStack itemstack) { - return GT_Utility.isStackInList(itemstack, GT_ModHandler.sBoxableItems); - } -} diff --git a/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java b/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java deleted file mode 100644 index f47a356d7b..0000000000 --- a/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java +++ /dev/null @@ -1,18 +0,0 @@ -package gregtech.api.util; - -public class GT_ItsNotMyFaultException extends RuntimeException { - - private static final long serialVersionUID = -8752778866486460495L; - - private final String mError; - - public GT_ItsNotMyFaultException(String aError) { - mError = aError; - } - - @Override - public String toString() { - return "The GregTech-Addon has a Problem.\nIT'S NOT MY FAULT!!! Below is how to fix it.\n" + mError - + "\nDO NOT COME TO ME WITH THIS CRASH. YOU CAUSED IT YOURSELF, AND I TOLD YOU HOW TO FIX IT!!!"; - } -} diff --git a/src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java b/src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java deleted file mode 100644 index f20a58c34a..0000000000 --- a/src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.api.util; - -import forestry.api.apiculture.IAlleleBeeSpecies; -import forestry.api.apiculture.IBeeGenome; -import forestry.api.apiculture.IBeeHousing; -import forestry.api.apiculture.IJubilanceProvider; - -public class GT_JubilanceMegaApiary implements IJubilanceProvider { - - public static final GT_JubilanceMegaApiary instance = new GT_JubilanceMegaApiary(); - - protected GT_JubilanceMegaApiary() {} - - @Override - public boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing) { - return false; - } - - @Override - public String getDescription() { - return "Will only be produced in mega Apiary"; - } -} diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java deleted file mode 100644 index 4a9dc878ed..0000000000 --- a/src/main/java/gregtech/api/util/GT_LanguageManager.java +++ /dev/null @@ -1,603 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.E; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; - -import cpw.mods.fml.common.registry.LanguageRegistry; -import cpw.mods.fml.relauncher.ReflectionHelper; -import gregtech.api.GregTech_API; - -public class GT_LanguageManager { - - /** - * Buffer to reduce memory allocation when injecting data to LanguageRegistry. - */ - private static final HashMap TEMPMAP = new HashMap<>(); - /** - * Buffer used when something is trying to add new lang entry while config file is not set up yet. - */ - public static final Map BUFFERMAP = new HashMap<>(); - /** - * Map containing all the translation data coming into this class. - */ - private static final Map LANGMAP = new HashMap<>(); - /** - * Config file handler bound to GregTech.lang or GregTech_(locale_name).lang. Even though it says English file, - * it's not necessarily English, but on system it's always treated as English (as in, "default" language.) - */ - public static Configuration sEnglishFile; - /** - * If the game is running with en_US language. This does not get updated when user changes language in game; - * GT lang system cannot handle that anyway. - */ - public static boolean isEN_US; - /** - * If placeholder like %material should be used for writing lang entries to file. - */ - public static boolean i18nPlaceholder = true; - /** - * If there's any lang entry that is not found on lang file and waiting to be written. - */ - private static boolean hasUnsavedEntry = false; - - // TODO: convert to enum - public static String FACE_ANY = "gt.lang.face.any", FACE_BOTTOM = "gt.lang.face.bottom", - FACE_TOP = "gt.lang.face.top", FACE_LEFT = "gt.lang.face.left", FACE_FRONT = "gt.lang.face.front", - FACE_RIGHT = "gt.lang.face.right", FACE_BACK = "gt.lang.face.back", FACE_NONE = "gt.lang.face.none"; - - public static String[] FACES = { FACE_BOTTOM, FACE_TOP, FACE_LEFT, FACE_FRONT, FACE_RIGHT, FACE_BACK, FACE_NONE }; - - /** - * Map referencing private field of StringTranslate, used by StatCollector. Used to inject lang entries there. - */ - private static final Map stringTranslateLanguageList; - - static { - try { - Field fieldStringTranslateLanguageList = ReflectionHelper - .findField(net.minecraft.util.StringTranslate.class, "languageList", "field_74816_c"); - Field fieldStringTranslateInstance = ReflectionHelper - .findField(net.minecraft.util.StringTranslate.class, "instance", "field_74817_a"); - // noinspection unchecked - stringTranslateLanguageList = (Map) fieldStringTranslateLanguageList - .get(fieldStringTranslateInstance.get(null)); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * @deprecated Parameter aWriteIntoLangFile is no longer used, - * use {@link #addStringLocalization(String, String)} or consider migrating to MC lang system instead. - */ - @Deprecated - public static synchronized String addStringLocalization(String aKey, String aEnglish, boolean aWriteIntoLangFile) { - return addStringLocalization(aKey, aEnglish); - } - - /** - * If you newly use this method, please consider using MC lang system instead. - */ - public static synchronized String addStringLocalization(String aKey, String aEnglish) { - String trimmedKey = aKey != null ? aKey.trim() : ""; - if (trimmedKey.isEmpty()) return E; // RIP cascading class loading, don't use GT_Utility here - if (sEnglishFile == null) { - // Lang file is not set up yet - BUFFERMAP.put(trimmedKey, aEnglish); - return aEnglish; - } - if (!BUFFERMAP.isEmpty()) { - // Lang file is now set up, resolve all the buffers - // This won't be visited twice - for (Entry tEntry : BUFFERMAP.entrySet()) { - storeTranslation(tEntry.getKey(), tEntry.getValue()); - } - BUFFERMAP.clear(); - } - - if (!LANGMAP.containsKey(trimmedKey)) { - return storeTranslation(trimmedKey, aEnglish); - } - return LANGMAP.get(trimmedKey); - } - - private static synchronized String storeTranslation(String trimmedKey, String english) { - String translation = writeToLangFile(trimmedKey, english); - LANGMAP.put(trimmedKey, translation); - addToMCLangList(trimmedKey, translation); - TEMPMAP.put(trimmedKey, translation); - LanguageRegistry.instance() - // If we use the actual user configured locale here, switching lang to others while running game - // turns everything into unlocalized string. So we make it "default" and call it a day. - .injectLanguage("en_US", TEMPMAP); - TEMPMAP.clear(); - return translation; - } - - private static synchronized String writeToLangFile(String trimmedKey, String aEnglish) { - Property tProperty = sEnglishFile.get("LanguageFile", trimmedKey, aEnglish); - if (hasUnsavedEntry && GregTech_API.sPostloadFinished) { - sEnglishFile.save(); - hasUnsavedEntry = false; - } - String translation = tProperty.getString(); - if (tProperty.wasRead()) { - if (isEN_US && !aEnglish.equals(translation)) { - tProperty.set(aEnglish); - markFileDirty(); - return aEnglish; - } - } else { - markFileDirty(); - } - return translation; - } - - private static synchronized void markFileDirty() { - if (GregTech_API.sPostloadFinished) { - sEnglishFile.save(); - } else { - hasUnsavedEntry = true; - } - } - - public static String getTranslation(String aKey) { - String tTrimmedKey = aKey != null ? aKey.trim() : ""; - if (tTrimmedKey.isEmpty()) return E; - - if (StatCollector.canTranslate(tTrimmedKey)) { - return StatCollector.translateToLocal(tTrimmedKey); - } - String anotherKeyToTry; - if (tTrimmedKey.endsWith(".name")) { - anotherKeyToTry = tTrimmedKey.substring(0, tTrimmedKey.length() - 5); - } else { - anotherKeyToTry = tTrimmedKey + ".name"; - } - if (StatCollector.canTranslate(anotherKeyToTry)) { - return StatCollector.translateToLocal(anotherKeyToTry); - } - return tTrimmedKey; - } - - public static String getTranslation(String aKey, String aSeperator) { - if (aKey == null) return E; - String rTranslation = E; - StringBuilder rTranslationSB = new StringBuilder(rTranslation); - for (String tString : aKey.split(aSeperator)) { - rTranslationSB.append(getTranslation(tString)); - } - rTranslation = String.valueOf(rTranslationSB); - return rTranslation; - } - - @SuppressWarnings("unused") - public static String getTranslateableItemStackName(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return "null"; - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT != null && tNBT.hasKey("display")) { - String tName = tNBT.getCompoundTag("display") - .getString("Name"); - if (GT_Utility.isStringValid(tName)) { - return tName; - } - } - return aStack.getUnlocalizedName() + ".name"; - } - - public static void writePlaceholderStrings() { - addStringLocalization("Interaction_DESCRIPTION_Index_001", "Puts out into adjacent Slot #"); - addStringLocalization("Interaction_DESCRIPTION_Index_002", "Grabs in for own Slot #"); - addStringLocalization("Interaction_DESCRIPTION_Index_003", "Enable with Signal"); - addStringLocalization("Interaction_DESCRIPTION_Index_004", "Disable with Signal"); - addStringLocalization("Interaction_DESCRIPTION_Index_005", "Disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_006", "Export"); - addStringLocalization("Interaction_DESCRIPTION_Index_007", "Import"); - addStringLocalization("Interaction_DESCRIPTION_Index_008", "Export (conditional)"); - addStringLocalization("Interaction_DESCRIPTION_Index_009", "Import (conditional)"); - addStringLocalization("Interaction_DESCRIPTION_Index_010", "Export (invert cond)"); - addStringLocalization("Interaction_DESCRIPTION_Index_011", "Import (invert cond)"); - addStringLocalization("Interaction_DESCRIPTION_Index_012", "Export allow Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_013", "Import allow Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_014", "Export allow Input (conditional)"); - addStringLocalization("Interaction_DESCRIPTION_Index_015", "Import allow Output (conditional)"); - addStringLocalization("Interaction_DESCRIPTION_Index_016", "Export allow Input (invert cond)"); - addStringLocalization("Interaction_DESCRIPTION_Index_017", "Import allow Output (invert cond)"); - addStringLocalization("Interaction_DESCRIPTION_Index_018", "Normal"); - addStringLocalization("Interaction_DESCRIPTION_Index_019", "Inverted"); - addStringLocalization("Interaction_DESCRIPTION_Index_020", "Ready to work"); - addStringLocalization("Interaction_DESCRIPTION_Index_021", "Not ready to work"); - addStringLocalization("Interaction_DESCRIPTION_Index_022", "Import"); - addStringLocalization("Interaction_DESCRIPTION_Index_023", "Import (conditional)"); - addStringLocalization("Interaction_DESCRIPTION_Index_024", "Import (invert cond)"); - addStringLocalization("Interaction_DESCRIPTION_Index_025", "Keep Liquids Away"); - addStringLocalization("Interaction_DESCRIPTION_Index_026", "Keep Liquids Away (conditional)"); - addStringLocalization("Interaction_DESCRIPTION_Index_027", "Keep Liquids Away (invert cond)"); - addStringLocalization("Interaction_DESCRIPTION_Index_031", "Normal Universal Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_032", "Inverted Universal Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_033", "Normal Electricity Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_034", "Inverted Electricity Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_035", "Normal Steam Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_036", "Inverted Steam Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_037", "Normal Average Electric Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_038", "Inverted Average Electric Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_039", "Normal Average Electric Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_040", "Inverted Average Electric Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_041", "Normal Electricity Storage(Including Batteries)"); - addStringLocalization("Interaction_DESCRIPTION_Index_042", "Inverted Electricity Storage(Including Batteries)"); - addStringLocalization("Interaction_DESCRIPTION_Index_043", "Filter input, Deny output"); - addStringLocalization("Interaction_DESCRIPTION_Index_044", "Invert input, Deny output"); - addStringLocalization("Interaction_DESCRIPTION_Index_045", "Filter input, Permit any output"); - addStringLocalization("Interaction_DESCRIPTION_Index_046", "Invert input, Permit any output"); - addStringLocalization("Interaction_DESCRIPTION_Index_047", "Filter Fluid: "); - addStringLocalization("Interaction_DESCRIPTION_Index_048", "Pump speed: "); - addStringLocalization("Interaction_DESCRIPTION_Index_049", "L/tick "); - addStringLocalization("Interaction_DESCRIPTION_Index_050", "L/sec"); - addStringLocalization("Interaction_DESCRIPTION_Index_053", "Slot: "); - addStringLocalization("Interaction_DESCRIPTION_Index_054", "Inverted"); - addStringLocalization("Interaction_DESCRIPTION_Index_055", "Normal"); - addStringLocalization("Interaction_DESCRIPTION_Index_056", "Emit if 1 Maintenance Needed"); - addStringLocalization("Interaction_DESCRIPTION_Index_057", "Emit if 1 Maintenance Needed(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_058", "Emit if 2 Maintenance Needed"); - addStringLocalization("Interaction_DESCRIPTION_Index_059", "Emit if 2 Maintenance Needed(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_060", "Emit if 3 Maintenance Needed"); - addStringLocalization("Interaction_DESCRIPTION_Index_061", "Emit if 3 Maintenance Needed(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_062", "Emit if 4 Maintenance Needed"); - addStringLocalization("Interaction_DESCRIPTION_Index_063", "Emit if 4 Maintenance Needed(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_064", "Emit if 5 Maintenance Needed"); - addStringLocalization("Interaction_DESCRIPTION_Index_065", "Emit if 5 Maintenance Needed(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_066", "Emit if rotor needs maintenance low accuracy mod"); - addStringLocalization( - "Interaction_DESCRIPTION_Index_067", - "Emit if rotor needs maintenance low accuracy mod(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_068", "Emit if rotor needs maintenance high accuracy mod"); - addStringLocalization("Interaction_DESCRIPTION_Index_068.1", "Emit if any Player is close"); - addStringLocalization( - "Interaction_DESCRIPTION_Index_069", - "Emit if rotor needs maintenance high accuracy mod(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_069.1", "Emit if other Player is close"); - addStringLocalization("Interaction_DESCRIPTION_Index_070", "Emit if you are close"); - addStringLocalization("Interaction_DESCRIPTION_Index_071", "Conducts strongest Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_072", "Conducts from bottom Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_073", "Conducts from top Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_074", "Conducts from north Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_075", "Conducts from south Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_076", "Conducts from west Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_077", "Conducts from east Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_078", "Signal = "); - addStringLocalization("Interaction_DESCRIPTION_Index_079", "Conditional Signal = "); - addStringLocalization("Interaction_DESCRIPTION_Index_080", "Inverted Conditional Signal = "); - addStringLocalization("Interaction_DESCRIPTION_Index_081", "Frequency: "); - addStringLocalization("Interaction_DESCRIPTION_Index_082", "Open if work enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_083", "Open if work disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_084", "Only Output allowed"); - addStringLocalization("Interaction_DESCRIPTION_Index_085", "Only Input allowed"); - addStringLocalization("Interaction_DESCRIPTION_Index_086", "Auto-Input: "); - addStringLocalization("Interaction_DESCRIPTION_Index_087", "Disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_088", "Enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_089", " Auto-Output: "); - addStringLocalization("Interaction_DESCRIPTION_Index_090", "Machine Processing: "); - addStringLocalization("Interaction_DESCRIPTION_Index_091", "Redstone Output at Side "); - addStringLocalization("Interaction_DESCRIPTION_Index_092", " set to: "); - addStringLocalization("Interaction_DESCRIPTION_Index_093", "Strong"); - addStringLocalization("Interaction_DESCRIPTION_Index_094", "Weak"); - addStringLocalization("Interaction_DESCRIPTION_Index_094.1", "Not enough soldering material!"); - addStringLocalization("Interaction_DESCRIPTION_Index_095", "Input from Output Side allowed"); - addStringLocalization("Interaction_DESCRIPTION_Index_096", "Input from Output Side forbidden"); - addStringLocalization("Interaction_DESCRIPTION_Index_098", "Do not regulate Item Stack Size"); - addStringLocalization("Interaction_DESCRIPTION_Index_099", "Regulate Item Stack Size to: "); - addStringLocalization("Interaction_DESCRIPTION_Index_100", "This is "); - addStringLocalization("Interaction_DESCRIPTION_Index_101", " Ore."); - addStringLocalization("Interaction_DESCRIPTION_Index_102", "There is Lava behind this Rock."); - addStringLocalization("Interaction_DESCRIPTION_Index_103", "There is a Liquid behind this Rock."); - addStringLocalization("Interaction_DESCRIPTION_Index_104", "There is an Air Pocket behind this Rock."); - addStringLocalization("Interaction_DESCRIPTION_Index_105", "Material is changing behind this Rock."); - addStringLocalization("Interaction_DESCRIPTION_Index_106", "Found traces of "); - addStringLocalization("Interaction_DESCRIPTION_Index_107", "No Ores found."); - addStringLocalization("Interaction_DESCRIPTION_Index_108", "Outputs misc. Fluids, Steam and Items"); - addStringLocalization("Interaction_DESCRIPTION_Index_109", "Outputs Steam and Items"); - addStringLocalization("Interaction_DESCRIPTION_Index_110", "Outputs Steam and misc. Fluids"); - addStringLocalization("Interaction_DESCRIPTION_Index_111", "Outputs Steam"); - addStringLocalization("Interaction_DESCRIPTION_Index_112", "Outputs misc. Fluids and Items"); - addStringLocalization("Interaction_DESCRIPTION_Index_113", "Outputs only Items"); - addStringLocalization("Interaction_DESCRIPTION_Index_114", "Outputs only misc. Fluids"); - addStringLocalization("Interaction_DESCRIPTION_Index_115", "Outputs nothing"); - // 116 moved to lang files - // 117 obsolete - // 118 moved to lang files - // 119 obsolete - // 120 moved to lang files - // 121 obsolete - addStringLocalization("Interaction_DESCRIPTION_Index_122", "Emit Redstone if slots contain something"); - addStringLocalization("Interaction_DESCRIPTION_Index_123", "Don't emit Redstone"); - // 124 moved to lang files - addStringLocalization("Interaction_DESCRIPTION_Index_124.1", "Blacklist Mode"); - // 125 obsolete - addStringLocalization("Interaction_DESCRIPTION_Index_125.1", "Whitelist Mode"); - // 126 moved to lang files - // 127 obsolete - addStringLocalization("Interaction_DESCRIPTION_Index_128", "Redstone"); - addStringLocalization("Interaction_DESCRIPTION_Index_128.1", "Redstone "); - addStringLocalization("Interaction_DESCRIPTION_Index_129", "Energy"); - addStringLocalization("Interaction_DESCRIPTION_Index_129.1", "Energy "); - addStringLocalization("Interaction_DESCRIPTION_Index_130", "Fluids"); - addStringLocalization("Interaction_DESCRIPTION_Index_130.1", "Fluids "); - addStringLocalization("Interaction_DESCRIPTION_Index_131", "Items"); - addStringLocalization("Interaction_DESCRIPTION_Index_131.1", "Items "); - addStringLocalization("Interaction_DESCRIPTION_Index_132", "Pipe is loose."); - addStringLocalization("Interaction_DESCRIPTION_Index_133", "Screws are loose."); - addStringLocalization("Interaction_DESCRIPTION_Index_134", "Something is stuck."); - addStringLocalization("Interaction_DESCRIPTION_Index_135", "Platings are dented."); - addStringLocalization("Interaction_DESCRIPTION_Index_136", "Circuitry burned out."); - addStringLocalization("Interaction_DESCRIPTION_Index_137", "That doesn't belong there."); - addStringLocalization("Interaction_DESCRIPTION_Index_138", "Incomplete Structure."); - addStringLocalization("Interaction_DESCRIPTION_Index_139", "Hit with Soft Mallet"); - addStringLocalization("Interaction_DESCRIPTION_Index_140", "to (re-)start the Machine"); - addStringLocalization("Interaction_DESCRIPTION_Index_141", "if it doesn't start."); - addStringLocalization("Interaction_DESCRIPTION_Index_142", "Running perfectly."); - addStringLocalization("Interaction_DESCRIPTION_Index_143", "Missing Mining Pipe"); - addStringLocalization("Interaction_DESCRIPTION_Index_144", "Missing Turbine Rotor"); - addStringLocalization("Interaction_DESCRIPTION_Index_145", "Step Down, In: "); - addStringLocalization("Interaction_DESCRIPTION_Index_146", "Step Up, In: "); - addStringLocalization("Interaction_DESCRIPTION_Index_147", "A, Out: "); - addStringLocalization("Interaction_DESCRIPTION_Index_148", "V "); - addStringLocalization("Interaction_DESCRIPTION_Index_149", "A"); - addStringLocalization("Interaction_DESCRIPTION_Index_150", "Chance: "); - addStringLocalization("Interaction_DESCRIPTION_Index_151", "Does not get consumed in the process"); - addStringLocalization("Interaction_DESCRIPTION_Index_151.1", "Outputs items and 1 specific Fluid"); - addStringLocalization("Interaction_DESCRIPTION_Index_151.2", "Outputs 1 specific Fluid"); - addStringLocalization("Interaction_DESCRIPTION_Index_151.4", "Successfully locked Fluid to %s"); - addStringLocalization("Interaction_DESCRIPTION_Index_152", "Total: "); - addStringLocalization("Interaction_DESCRIPTION_Index_153", "Usage: "); - addStringLocalization("Interaction_DESCRIPTION_Index_154", "Voltage: "); - addStringLocalization("Interaction_DESCRIPTION_Index_155", "Amperage: "); - addStringLocalization("Interaction_DESCRIPTION_Index_156", "Voltage: unspecified"); - addStringLocalization("Interaction_DESCRIPTION_Index_157", "Amperage: unspecified"); - addStringLocalization("Interaction_DESCRIPTION_Index_158", "Time: "); - addStringLocalization("Interaction_DESCRIPTION_Index_159", "Needs Low Gravity"); - addStringLocalization("Interaction_DESCRIPTION_Index_160", "Needs Cleanroom"); - addStringLocalization("Interaction_DESCRIPTION_Index_160.1", "Needs Cleanroom & LowGrav"); - addStringLocalization("Interaction_DESCRIPTION_Index_161", " secs"); - addStringLocalization("Interaction_DESCRIPTION_Index_162", "Name: "); - addStringLocalization("Interaction_DESCRIPTION_Index_163", " MetaData: "); - addStringLocalization("Interaction_DESCRIPTION_Index_164", "Hardness: "); - addStringLocalization("Interaction_DESCRIPTION_Index_165", " Blast Resistance: "); - addStringLocalization("Interaction_DESCRIPTION_Index_166", "Is valid Beacon Pyramid Material"); - addStringLocalization("Interaction_DESCRIPTION_Index_167", "Tank "); - addStringLocalization("Interaction_DESCRIPTION_Index_168", "Heat: "); - addStringLocalization("Interaction_DESCRIPTION_Index_169", "HEM: "); - addStringLocalization("Interaction_DESCRIPTION_Index_170", " Base EU Output: "); - addStringLocalization("Interaction_DESCRIPTION_Index_171", "Facing: "); - addStringLocalization("Interaction_DESCRIPTION_Index_172", " / Chance: "); - addStringLocalization("Interaction_DESCRIPTION_Index_173", "You can remove this with a Wrench"); - addStringLocalization("Interaction_DESCRIPTION_Index_174", "You can NOT remove this with a Wrench"); - addStringLocalization("Interaction_DESCRIPTION_Index_175", "Conduction Loss: "); - addStringLocalization("Interaction_DESCRIPTION_Index_176", "Contained Energy: "); - addStringLocalization("Interaction_DESCRIPTION_Index_177", "Has Muffler Upgrade"); - addStringLocalization("Interaction_DESCRIPTION_Index_178", "Progress/Load: "); - addStringLocalization("Interaction_DESCRIPTION_Index_179", "Max IN: "); - addStringLocalization("Interaction_DESCRIPTION_Index_181", "Max OUT: "); - addStringLocalization("Interaction_DESCRIPTION_Index_182", " EU at "); - addStringLocalization("Interaction_DESCRIPTION_Index_183", " A"); - addStringLocalization("Interaction_DESCRIPTION_Index_184", "Energy: "); - addStringLocalization("Interaction_DESCRIPTION_Index_186", "Owned by: "); - addStringLocalization("Interaction_DESCRIPTION_Index_187", "Type -- Crop-Name: "); - addStringLocalization("Interaction_DESCRIPTION_Index_188", " Growth: "); - addStringLocalization("Interaction_DESCRIPTION_Index_189", " Gain: "); - addStringLocalization("Interaction_DESCRIPTION_Index_190", " Resistance: "); - addStringLocalization("Interaction_DESCRIPTION_Index_191", "Plant -- Fertilizer: "); - addStringLocalization("Interaction_DESCRIPTION_Index_192", " Water: "); - addStringLocalization("Interaction_DESCRIPTION_Index_193", " Weed-Ex: "); - addStringLocalization("Interaction_DESCRIPTION_Index_194", " Scan-Level: "); - addStringLocalization("Interaction_DESCRIPTION_Index_195", "Environment -- Nutrients: "); - addStringLocalization("Interaction_DESCRIPTION_Index_196", " Humidity: "); - addStringLocalization("Interaction_DESCRIPTION_Index_197", " Air-Quality: "); - addStringLocalization("Interaction_DESCRIPTION_Index_198", "Attributes:"); - addStringLocalization("Interaction_DESCRIPTION_Index_199", "Discovered by: "); - addStringLocalization("Interaction_DESCRIPTION_Index_200", "Sort mode: "); - addStringLocalization("Interaction_DESCRIPTION_Index_200.1", "Automatic Item Shuffling: "); - addStringLocalization("Interaction_DESCRIPTION_Index_201", "Nothing"); - addStringLocalization("Interaction_DESCRIPTION_Index_202", "Pollution in Chunk: "); - addStringLocalization("Interaction_DESCRIPTION_Index_203", " gibbl"); - addStringLocalization("Interaction_DESCRIPTION_Index_204", "No Pollution in Chunk! HAYO!"); - addStringLocalization("Interaction_DESCRIPTION_Index_206", "Scan for Assembly Line"); - addStringLocalization( - "Interaction_DESCRIPTION_Index_207", - "Pump speed: %dL every %d ticks, %.2f L/sec on average"); - addStringLocalization("Interaction_DESCRIPTION_Index_208", " L"); - addStringLocalization("Interaction_DESCRIPTION_Index_209", " ticks"); - addStringLocalization("Interaction_DESCRIPTION_Index_209.1", " tick"); - addStringLocalization("Interaction_DESCRIPTION_Index_210", "Average: %.2f L/sec"); - addStringLocalization("Interaction_DESCRIPTION_Index_211", "Items per side: "); - addStringLocalization("Interaction_DESCRIPTION_Index_212", "Input enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_213", "Input disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_214", "Connected"); - addStringLocalization("Interaction_DESCRIPTION_Index_215", "Disconnected"); - addStringLocalization("Interaction_DESCRIPTION_Index_216", "Deprecated Recipe"); - addStringLocalization("Interaction_DESCRIPTION_Index_219", "Extended Facing: "); - addStringLocalization("Interaction_DESCRIPTION_Index_220", "Single recipe locking disabled."); - addStringLocalization("Interaction_DESCRIPTION_Index_221", "Item threshold"); - addStringLocalization("Interaction_DESCRIPTION_Index_222", "Fluid threshold"); - addStringLocalization("Interaction_DESCRIPTION_Index_222.1", "Energy threshold"); - addStringLocalization( - "Interaction_DESCRIPTION_Index_223", - "Single recipe locking enabled. Will lock to next recipe."); - addStringLocalization("Interaction_DESCRIPTION_Index_224", "Always On"); - addStringLocalization("Interaction_DESCRIPTION_Index_225", "Active with Redstone Signal"); - addStringLocalization("Interaction_DESCRIPTION_Index_226", "Inactive with Redstone Signal"); - addStringLocalization("Interaction_DESCRIPTION_Index_227", "Allow Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_228", "Block Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_229", "Export/Import"); - addStringLocalization("Interaction_DESCRIPTION_Index_230", "Conditional"); - addStringLocalization("Interaction_DESCRIPTION_Index_231", "Enable Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_232", "Filter Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_233", "Filter Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_234", "Block Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_235", "Allow Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_236", "Whitelist Fluid"); - addStringLocalization("Interaction_DESCRIPTION_Index_237", "Blacklist Fluid"); - addStringLocalization("Interaction_DESCRIPTION_Index_238", "Filter Direction"); - addStringLocalization("Interaction_DESCRIPTION_Index_239", "Filter Type"); - addStringLocalization("Interaction_DESCRIPTION_Index_240", "Block Flow"); - addStringLocalization("Interaction_DESCRIPTION_Index_241", "Recipe progress"); - addStringLocalization("Interaction_DESCRIPTION_Index_242", "Machine idle"); - addStringLocalization("Interaction_DESCRIPTION_Index_243", "Enable with Redstone"); - addStringLocalization("Interaction_DESCRIPTION_Index_244", "Disable with Redstone"); - addStringLocalization("Interaction_DESCRIPTION_Index_245", "Disable machine"); - addStringLocalization("Interaction_DESCRIPTION_Index_246", "Frequency"); - addStringLocalization("Interaction_DESCRIPTION_Index_247", "1 Issue"); - addStringLocalization("Interaction_DESCRIPTION_Index_248", "2 Issues"); - addStringLocalization("Interaction_DESCRIPTION_Index_249", "3 Issues"); - addStringLocalization("Interaction_DESCRIPTION_Index_250", "4 Issues"); - addStringLocalization("Interaction_DESCRIPTION_Index_251", "5 Issues"); - addStringLocalization("Interaction_DESCRIPTION_Index_252", "Rotor < 20%"); - addStringLocalization("Interaction_DESCRIPTION_Index_253", "Rotor ≈ 0%"); - addStringLocalization("Interaction_DESCRIPTION_Index_254", "Detect slot#"); - addStringLocalization("Interaction_DESCRIPTION_Index_254.0", "Detect Slot"); - addStringLocalization("Interaction_DESCRIPTION_Index_254.1", "Internal slot#"); - addStringLocalization("Interaction_DESCRIPTION_Index_255", "Adjacent slot#"); - addStringLocalization("Interaction_DESCRIPTION_Index_256", "Universal Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_257", "Electricity Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_258", "Steam Storage"); - addStringLocalization("Interaction_DESCRIPTION_Index_259", "Average Electric Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_260", "Average Electric Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_261", "Electricity Storage(Including Batteries)"); - addStringLocalization("Interaction_DESCRIPTION_Index_262", "Fluid Auto Output Disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_263", "Fluid Auto Output Enabled"); - addStringLocalization( - "Interaction_DESCRIPTION_Index_264", - "currently none, will be locked to the next that is put in"); - addStringLocalization("Interaction_DESCRIPTION_Index_265", "1 specific Fluid"); - addStringLocalization("Interaction_DESCRIPTION_Index_266", "Lock Fluid Mode Disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_267", "Overflow Voiding Mode Disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_268", "Overflow Voiding Mode Enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_269", "Void Full Mode Disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_270", "Void Full Mode Enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_271", "unspecified"); - addStringLocalization("Interaction_DESCRIPTION_Index_272", "Recipe by: "); - addStringLocalization("Interaction_DESCRIPTION_Index_273", "Original Recipe by: "); - addStringLocalization("Interaction_DESCRIPTION_Index_274", "Modified by: "); - addStringLocalization("Interaction_DESCRIPTION_Index_275", "Original voltage: "); - addStringLocalization("Interaction_DESCRIPTION_Index_299", "Item Filter: "); - addStringLocalization("Interaction_DESCRIPTION_Index_300", "Filter Cleared!"); - addStringLocalization("Interaction_DESCRIPTION_Index_300.1", "Fluid Lock Cleared."); - addStringLocalization("Interaction_DESCRIPTION_Index_301", "Universal"); - addStringLocalization("Interaction_DESCRIPTION_Index_302", "Int. EU"); - addStringLocalization("Interaction_DESCRIPTION_Index_303", "Steam"); - addStringLocalization("Interaction_DESCRIPTION_Index_304", "Avg. Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_305", "Avg. Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_306", "EU stored"); - addStringLocalization("Interaction_DESCRIPTION_Index_307", "Deny input, Filter output"); - addStringLocalization("Interaction_DESCRIPTION_Index_308", "Deny input, Invert output"); - addStringLocalization("Interaction_DESCRIPTION_Index_309", "Permit any input, Filter output"); - addStringLocalization("Interaction_DESCRIPTION_Index_310", "Permit any input, Invert output"); - addStringLocalization("Interaction_DESCRIPTION_Index_311", "Block Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_312", "Allow Output"); - addStringLocalization("Interaction_DESCRIPTION_Index_313", "Block Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_314", "Allow Input"); - addStringLocalization("Interaction_DESCRIPTION_Index_315", "Filter Empty"); - addStringLocalization("Interaction_DESCRIPTION_Index_316", "Pump speed limit reached!"); - addStringLocalization("Interaction_DESCRIPTION_Index_317", "Filter: "); - addStringLocalization("Interaction_DESCRIPTION_Index_318", "Check Mode"); - addStringLocalization("Interaction_DESCRIPTION_Index_319", "Any player"); - addStringLocalization("Interaction_DESCRIPTION_Index_320", "Other players"); - addStringLocalization("Interaction_DESCRIPTION_Index_321", "Only owner"); - addStringLocalization("Interaction_DESCRIPTION_Index_322", "Overflow point: "); - addStringLocalization("Interaction_DESCRIPTION_Index_323", "L"); - addStringLocalization("Interaction_DESCRIPTION_Index_324", "Now"); - addStringLocalization("Interaction_DESCRIPTION_Index_325", "Max"); - addStringLocalization("Interaction_DESCRIPTION_Index_326", "Public"); - addStringLocalization("Interaction_DESCRIPTION_Index_327", "Private"); - addStringLocalization("Interaction_DESCRIPTION_Index_328", "Channel"); - addStringLocalization("Interaction_DESCRIPTION_Index_329", "Public/Private"); - addStringLocalization("Interaction_DESCRIPTION_Index_330", "Sneak Rightclick to switch Mode"); - addStringLocalization("Interaction_DESCRIPTION_Index_331", "AND Gate"); - addStringLocalization("Interaction_DESCRIPTION_Index_332", "NAND Gate"); - addStringLocalization("Interaction_DESCRIPTION_Index_333", "OR Gate"); - addStringLocalization("Interaction_DESCRIPTION_Index_334", "NOR Gate"); - addStringLocalization("Interaction_DESCRIPTION_Index_335", "Gate Mode"); - addStringLocalization("Interaction_DESCRIPTION_Index_336", "PCB Factory Tier: "); - addStringLocalization("Interaction_DESCRIPTION_Index_337", "Upgrade Required: "); - addStringLocalization("Interaction_DESCRIPTION_Index_338", "Bio"); - addStringLocalization("Interaction_DESCRIPTION_Index_339", "Biochamber Upgrade Enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_339.1", "Biochamber Upgrade Disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_340", "Rotated biochamber enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_340.1", "Rotated biochamber disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_341", "Tier 1 cooling enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_341.1", "Tier 1 cooling disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_342", "Tier 2 cooling enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_342.1", "Tier 2 cooling disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_343", "Use Machine Processing State"); - addStringLocalization("Interaction_DESCRIPTION_Index_343.1", "Use Inverted Machine Processing State"); - addStringLocalization("Interaction_DESCRIPTION_Index_344", "Input Blocking"); - addStringLocalization("Interaction_DESCRIPTION_Index_344.1", "Output Blocking"); - addStringLocalization("Interaction_DESCRIPTION_Index_400", "Running mode: "); - addStringLocalization("Interaction_DESCRIPTION_Index_500", "Fitting: Loose - More Flow"); - addStringLocalization("Interaction_DESCRIPTION_Index_501", "Fitting: Tight - More Efficiency"); - addStringLocalization("Interaction_DESCRIPTION_Index_502", "Mining chunk loading enabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_503", "Mining chunk loading disabled"); - addStringLocalization("Interaction_DESCRIPTION_Index_505", "Enable with Signal (Safe)"); - addStringLocalization("Interaction_DESCRIPTION_Index_506", "Disable with Signal (Safe)"); - addStringLocalization("Interaction_DESCRIPTION_Index_507", "Safe Mode"); - addStringLocalization("Interaction_DESCRIPTION_Index_508", "Needs Stabilized Black Hole"); - addStringLocalization("Interaction_DESCRIPTION_Index_509", "Requires HIP Unit"); - addStringLocalization("Interaction_DESCRIPTION_Index_602", "Use Private Frequency"); - addStringLocalization("Interaction_DESCRIPTION_Index_756", "Connectable: "); - addStringLocalization("Interaction_DESCRIPTION_Index_ALL", "All"); - addStringLocalization("Interaction_DESCRIPTION_Index_ANY", "Any"); - addStringLocalization("Interaction_DESCRIPTION_Index_INVERTED", "Inverted"); - addStringLocalization("Interaction_DESCRIPTION_Index_NORMAL", "Normal"); - addStringLocalization("Interaction_DESCRIPTION_Index_SIDE", "Side: "); - - addStringLocalization("Item_DESCRIPTION_Index_000", "Stored Heat: %s"); - addStringLocalization("Item_DESCRIPTION_Index_001", "Durability: %s/%s"); - addStringLocalization("Item_DESCRIPTION_Index_002", "%s lvl %s"); - addStringLocalization("Item_DESCRIPTION_Index_003", "Attack Damage: %s"); - addStringLocalization("Item_DESCRIPTION_Index_004", "Mining Speed: %s"); - addStringLocalization("Item_DESCRIPTION_Index_005", "Turbine Efficiency: %s"); - addStringLocalization("Item_DESCRIPTION_Index_006", "Optimal Steam flow: %s L/t"); - addStringLocalization("Item_DESCRIPTION_Index_007", "Energy from Optimal Gas Flow: %s EU/t"); - addStringLocalization("Item_DESCRIPTION_Index_008", "Energy from Optimal Plasma Flow: %s EU/t"); - addStringLocalization("Item_DESCRIPTION_Index_009", "Contains %s EU Tier: %s"); - addStringLocalization("Item_DESCRIPTION_Index_010", "Empty. You should recycle it properly."); - addStringLocalization("Item_DESCRIPTION_Index_011", "%s / %s EU - Voltage: %s"); - addStringLocalization("Item_DESCRIPTION_Index_012", "No Fluids Contained"); - addStringLocalization("Item_DESCRIPTION_Index_013", "%sL / %sL"); - addStringLocalization("Item_DESCRIPTION_Index_014", "Missing Coodinates!"); - addStringLocalization("Item_DESCRIPTION_Index_015", "Device at:"); - addStringLocalization("Item_DESCRIPTION_Index_018", "State: %s"); - addStringLocalization("Item_DESCRIPTION_Index_019", "Bath with neutron in a hot reactor"); - addStringLocalization("Item_DESCRIPTION_Index_020", "Progress: %s/%s"); - addStringLocalization("Item_DESCRIPTION_Index_021", "Radiation Hazard"); - addStringLocalization("Item_DESCRIPTION_Index_500", "Turbine Efficiency (Loose): %s"); - addStringLocalization("Item_DESCRIPTION_Index_501", "Optimal Steam flow (Loose): %s L/t"); - addStringLocalization("Item_DESCRIPTION_Index_502", "Overflow Efficiency Tier: %s"); - addStringLocalization("Item_DESCRIPTION_Index_900", "Energy from Optimal Steam Flow: %s EU/t"); - addStringLocalization("Item_DESCRIPTION_Index_901", "Energy from Optimal Steam Flow (Loose): %s EU/t"); - - addStringLocalization(FACE_ANY, "Any Side"); - addStringLocalization(FACE_BOTTOM, "Bottom"); - addStringLocalization(FACE_TOP, "Top"); - addStringLocalization(FACE_LEFT, "Left"); - addStringLocalization(FACE_FRONT, "Front"); - addStringLocalization(FACE_RIGHT, "Right"); - addStringLocalization(FACE_BACK, "Back"); - addStringLocalization(FACE_NONE, "None"); - } - - private static void addToMCLangList(String aKey, String translation) { - if (stringTranslateLanguageList != null) { - stringTranslateLanguageList.put(aKey, translation); - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_Log.java b/src/main/java/gregtech/api/util/GT_Log.java deleted file mode 100644 index 2d00c2e061..0000000000 --- a/src/main/java/gregtech/api/util/GT_Log.java +++ /dev/null @@ -1,45 +0,0 @@ -package gregtech.api.util; - -import java.io.File; -import java.io.OutputStream; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.List; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * Just a simple Logging Function. If on Server, then this will point to System.out and System.err - */ -public class GT_Log { - - public static PrintStream out = System.out; - public static PrintStream err = System.err; - public static PrintStream ore = new LogBuffer(); - public static PrintStream pal = null; - public static PrintStream exp = new LogBuffer(); - public static File mLogFile; - public static File mOreDictLogFile; - public static File mPlayerActivityLogFile; - public static File mExplosionLog; - - public static class LogBuffer extends PrintStream { - - public final List mBufferedOreDictLog = new ArrayList<>(); - - public LogBuffer() { - super(new OutputStream() { - - @Override - public void write(int arg0) { - /* Do nothing */ - } - }); - } - - @Override - public void println(String aString) { - mBufferedOreDictLog.add(aString); - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_ModHandler.java b/src/main/java/gregtech/api/util/GT_ModHandler.java deleted file mode 100644 index b5c7c6fb6e..0000000000 --- a/src/main/java/gregtech/api/util/GT_ModHandler.java +++ /dev/null @@ -1,2437 +0,0 @@ -package gregtech.api.util; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_Values.B; -import static gregtech.api.enums.GT_Values.D1; -import static gregtech.api.enums.GT_Values.DW; -import static gregtech.api.enums.GT_Values.E; -import static gregtech.api.enums.GT_Values.M; -import static gregtech.api.enums.GT_Values.RA; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.GT_Values.W; -import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes; -import static gregtech.api.recipe.RecipeMaps.oreWasherRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OreDictNames; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.Tier; -import gregtech.api.enums.ToolDictNames; -import gregtech.api.interfaces.IDamagableItem; -import gregtech.api.interfaces.IItemContainer; -import gregtech.api.interfaces.internal.IGT_CraftingRecipe; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe; -import gregtech.api.objects.GT_HashSet; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeCategories; -import gregtech.api.recipe.RecipeMap; -import ic2.api.item.IBoxable; -import ic2.api.item.IC2Items; -import ic2.api.item.IElectricItem; -import ic2.api.reactor.IReactorComponent; -import ic2.api.recipe.IRecipeInput; -import ic2.api.recipe.RecipeInputItemStack; -import ic2.api.recipe.RecipeOutput; -import ic2.core.item.ItemToolbox; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the Interface I use for interacting with other Mods. - *

- * Due to the many imports, this File can cause compile Problems if not all the APIs are installed - */ -public class GT_ModHandler { - - public static final List sSingleNonBlockDamagableRecipeList = new ArrayList<>(1000); - private static final Map sIC2ItemMap = new HashMap<>(); - - // public for bartworks - public static final List sAllRecipeList = new ArrayList<>(5000), sBufferRecipeList = new ArrayList<>(1000); - private static final List delayedRemovalByOutput = new ArrayList<>(); - private static final List delayedRemovalByRecipe = new ArrayList<>(); - - public static Collection sNativeRecipeClasses = new HashSet<>(), sSpecialRecipeClasses = new HashSet<>(); - public static GT_HashSet sNonReplaceableItems = new GT_HashSet<>(); - public static Object sBoxableWrapper = new GT_IBoxableWrapper(); - public static Collection sBoxableItems = new ArrayList<>(); - private static final Map emptyRecipeMap = new HashMap<>(); - private static Set recyclerWhitelist; - private static Set recyclerBlacklist; - - private static boolean sBufferCraftingRecipes = true; - public static List sSingleNonBlockDamagableRecipeList_list = new ArrayList<>(100); - private static final boolean sSingleNonBlockDamagableRecipeList_create = true; - private static final ItemStack sMt1 = new ItemStack(Blocks.dirt, 1, 0), sMt2 = new ItemStack(Blocks.dirt, 1, 0); - private static final String s_H = "h", s_F = "f", s_I = "I", s_P = "P", s_R = "R"; - private static final ItemStack[][] sShapes1 = new ItemStack[][] { - { sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1, null }, - { sMt1, null, sMt1, sMt1, null, sMt1, sMt1, sMt1, sMt1 }, - { null, sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1 }, - { sMt1, sMt1, sMt1, sMt1, null, sMt1, null, null, null }, - { sMt1, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 }, - { sMt1, sMt1, sMt1, sMt1, null, sMt1, sMt1, null, sMt1 }, - { null, null, null, sMt1, null, sMt1, sMt1, null, sMt1 }, - { null, sMt1, null, null, sMt1, null, null, sMt2, null }, - { sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2, null }, - { null, sMt1, null, null, sMt2, null, null, sMt2, null }, - { sMt1, sMt1, null, sMt1, sMt2, null, null, sMt2, null }, - { null, sMt1, sMt1, null, sMt2, sMt1, null, sMt2, null }, - { sMt1, sMt1, null, null, sMt2, null, null, sMt2, null }, - { null, sMt1, sMt1, null, sMt2, null, null, sMt2, null }, - { null, sMt1, null, sMt1, null, null, null, sMt1, sMt2 }, - { null, sMt1, null, null, null, sMt1, sMt2, sMt1, null }, - { null, sMt1, null, sMt1, null, sMt1, null, null, sMt2 }, - { null, sMt1, null, sMt1, null, sMt1, sMt2, null, null }, - { null, sMt2, null, null, sMt1, null, null, sMt1, null }, - { null, sMt2, null, null, sMt2, null, sMt1, sMt1, sMt1 }, - { null, sMt2, null, null, sMt2, null, null, sMt1, null }, - { null, sMt2, null, sMt1, sMt2, null, sMt1, sMt1, null }, - { null, sMt2, null, null, sMt2, sMt1, null, sMt1, sMt1 }, - { null, sMt2, null, null, sMt2, null, sMt1, sMt1, null }, - { sMt1, null, null, null, sMt2, null, null, null, sMt2 }, - { null, null, sMt1, null, sMt2, null, sMt2, null, null }, - { sMt1, null, null, null, sMt2, null, null, null, null }, - { null, null, sMt1, null, sMt2, null, null, null, null }, - { sMt1, sMt2, null, null, null, null, null, null, null }, - { sMt2, sMt1, null, null, null, null, null, null, null }, - { sMt1, null, null, sMt2, null, null, null, null, null }, - { sMt2, null, null, sMt1, null, null, null, null, null }, - { sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, null, sMt2, null }, - { sMt1, sMt1, null, sMt1, sMt1, sMt2, sMt1, sMt1, null }, - { null, sMt1, sMt1, sMt2, sMt1, sMt1, null, sMt1, sMt1 }, - { null, sMt2, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 }, - { sMt1, sMt1, sMt1, sMt1, sMt2, sMt1, null, sMt2, null }, - { sMt1, sMt1, null, sMt1, sMt2, sMt2, sMt1, sMt1, null }, - { null, sMt1, sMt1, sMt2, sMt2, sMt1, null, sMt1, sMt1 }, - { null, sMt2, null, sMt1, sMt2, sMt1, sMt1, sMt1, sMt1 }, - { sMt1, null, null, null, sMt1, null, null, null, null }, - { null, sMt1, null, sMt1, null, null, null, null, null }, - { sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null }, - { null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2 } }; - public static List sSingleNonBlockDamagableRecipeList_validsShapes1 = new ArrayList<>(44); - public static boolean sSingleNonBlockDamagableRecipeList_validsShapes1_update = false; - public static List sSingleNonBlockDamagableRecipeList_warntOutput = new ArrayList<>(50); - public static List sVanillaRecipeList_warntOutput = new ArrayList<>(50); - public static final List sSingleNonBlockDamagableRecipeList_verified = new ArrayList<>(1000); - public static List sAnySteamFluidIDs = new ArrayList<>(); - public static List sSuperHeatedSteamFluidIDs = new ArrayList<>(); - - static { - sNativeRecipeClasses.add(ShapedRecipes.class.getName()); - sNativeRecipeClasses.add(ShapedOreRecipe.class.getName()); - sNativeRecipeClasses.add(GT_Shaped_Recipe.class.getName()); - sNativeRecipeClasses.add(ShapelessRecipes.class.getName()); - sNativeRecipeClasses.add(ShapelessOreRecipe.class.getName()); - sNativeRecipeClasses.add(GT_Shapeless_Recipe.class.getName()); - sNativeRecipeClasses.add(ic2.core.AdvRecipe.class.getName()); - sNativeRecipeClasses.add(ic2.core.AdvShapelessRecipe.class.getName()); - sNativeRecipeClasses.add("appeng.recipes.game.ShapedRecipe"); - sNativeRecipeClasses.add("appeng.recipes.game.ShapelessRecipe"); - sNativeRecipeClasses.add("forestry.core.utils.ShapedRecipeCustom"); - - // Recipe Classes, which should never be removed. - sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeFireworks.class.getName()); - sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesArmorDyes.class.getName()); - sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeBookCloning.class.getName()); - sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapCloning.class.getName()); - sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapExtending.class.getName()); - sSpecialRecipeClasses.add("jds.bibliocraft.BiblioSpecialRecipes"); - sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQBlockRecipe"); - sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQuantumComputerRecipe"); - sSpecialRecipeClasses.add("dan200.qcraft.shared.QBlockRecipe"); - sSpecialRecipeClasses.add("appeng.recipes.game.FacadeRecipe"); - sSpecialRecipeClasses.add("appeng.recipes.game.DisassembleRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.carts.LocomotivePaintingRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RotorRepairRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTableCopyRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTicketCopyRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.TankCartFilterRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.emblems.LocomotiveEmblemRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostColorRecipe"); - sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostEmblemRecipe"); - sSpecialRecipeClasses.add("mods.immibis.redlogic.interaction.RecipeDyeLumarButton"); - sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesRobeArmorDyes"); - sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesVoidRobeArmorDyes"); - sSpecialRecipeClasses.add("thaumcraft.common.lib.crafting.ShapelessNBTOreRecipe"); - sSpecialRecipeClasses.add("twilightforest.item.TFMapCloningRecipe"); - sSpecialRecipeClasses.add("forestry.lepidopterology.MatingRecipe"); - sSpecialRecipeClasses.add("micdoodle8.mods.galacticraft.planets.asteroids.recipe.CanisterRecipes"); - sSpecialRecipeClasses.add("shedar.mods.ic2.nuclearcontrol.StorageArrayRecipe"); - } - - /** - * Returns if that Liquid is Water or Distilled Water - */ - public static boolean isWater(FluidStack aFluid) { - if (aFluid == null) return false; - return aFluid.isFluidEqual(getWater(1)) || aFluid.isFluidEqual(getDistilledWater(1)); - } - - /** - * Returns a Liquid Stack with given amount of Water. - */ - public static FluidStack getWater(long aAmount) { - return FluidRegistry.getFluidStack("water", (int) aAmount); - } - - /** - * Returns a Liquid Stack with given amount of distilled Water. - */ - public static FluidStack getDistilledWater(long aAmount) { - FluidStack tFluid = FluidRegistry.getFluidStack("ic2distilledwater", (int) aAmount); - if (tFluid == null) tFluid = getWater(aAmount); - return tFluid; - } - - /** - * Returns if that Liquid is Lava - */ - public static boolean isLava(FluidStack aFluid) { - if (aFluid == null) return false; - return aFluid.isFluidEqual(getLava(1)); - } - - /** - * Returns a Liquid Stack with given amount of Lava. - */ - public static FluidStack getLava(long aAmount) { - return FluidRegistry.getFluidStack("lava", (int) aAmount); - } - - /** - * Returns if that Liquid is Steam - */ - public static boolean isSteam(FluidStack aFluid) { - if (aFluid == null) return false; - return aFluid.isFluidEqual(getSteam(1)); - } - - /** - * Returns if that Liquid is Any Steam (including other mods) - */ - public static boolean isAnySteam(FluidStack aFluid) { - return (aFluid != null && (isSteam(aFluid) || sAnySteamFluidIDs.contains(aFluid.getFluidID()))); - } - - /** - * Returns if that Liquid is Super Heated Steam (including other mods) - */ - public static boolean isSuperHeatedSteam(FluidStack aFluid) { - return (aFluid != null && sSuperHeatedSteamFluidIDs.contains(aFluid.getFluidID())); - } - - /** - * Returns a Liquid Stack with given amount of Steam. - */ - public static FluidStack getSteam(long aAmount) { - return FluidRegistry.getFluidStack("steam", (int) aAmount); - } - - /** - * Returns if that Liquid is Milk - */ - public static boolean isMilk(FluidStack aFluid) { - if (aFluid == null) return false; - return aFluid.isFluidEqual(getMilk(1)); - } - - /** - * Returns a Liquid Stack with given amount of Milk. - */ - public static FluidStack getMilk(long aAmount) { - return FluidRegistry.getFluidStack("milk", (int) aAmount); - } - - public static ItemStack getEmptyCell(long aAmount) { - return ItemList.Cell_Empty.get(aAmount); - } - - public static ItemStack getAirCell(long aAmount) { - return ItemList.Cell_Air.get(aAmount); - } - - public static ItemStack getWaterCell(long aAmount) { - return ItemList.Cell_Water.get(aAmount); - } - - public static ItemStack getLavaCell(long aAmount) { - return ItemList.Cell_Lava.get(aAmount); - } - - /** - * @param aValue the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767 - * (that is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it - * properly, stupid Mojang... - */ - public static ItemStack setFuelValue(ItemStack aStack, short aValue) { - aStack.setTagCompound(GT_Utility.getNBTContainingShort(aStack.getTagCompound(), "GT.ItemFuelValue", aValue)); - return aStack; - } - - /** - * @return the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767 (that - * is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it properly, stupid - * Mojang... - */ - public static int getFuelValue(ItemStack aStack) { - return TileEntityFurnace.getItemBurnTime(aStack); - } - - /** - * Gets an Item from IndustrialCraft, and returns a Replacement Item if not possible - */ - public static ItemStack getIC2Item(String aItem, long aAmount, ItemStack aReplacement) { - if (GT_Utility.isStringInvalid(aItem) || !GregTech_API.sPreloadStarted) return null; - // if (D1) GT_Log.out.println("Requested the Item '" + aItem + "' from the IC2-API"); - if (!sIC2ItemMap.containsKey(aItem)) try { - ItemStack tStack = IC2Items.getItem(aItem); - sIC2ItemMap.put(aItem, tStack); - if (tStack == null && D1) GT_Log.err.println(aItem + " is not found in the IC2 Items!"); - } catch (Throwable e) { - /* Do nothing */ - } - return GT_Utility.copyAmount(aAmount, sIC2ItemMap.get(aItem), aReplacement); - } - - /** - * Gets an Item from IndustrialCraft, but the Damage Value can be specified, and returns a Replacement Item with the - * same Damage if not possible - */ - public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta, ItemStack aReplacement) { - ItemStack rStack = getIC2Item(aItem, aAmount, aReplacement); - if (rStack == null) return null; - Items.feather.setDamage(rStack, aMeta); - return rStack; - } - - /** - * Gets an Item from IndustrialCraft, but the Damage Value can be specified - */ - public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta) { - return getIC2Item(aItem, aAmount, aMeta, null); - } - - /** - * Gets an Item from IndustrialCraft - */ - public static ItemStack getIC2Item(String aItem, long aAmount) { - return getIC2Item(aItem, aAmount, null); - } - - /** - * Gets an Item from the specified mod - */ - public static ItemStack getModItem(String aModID, String aItem, long aAmount) { - return getModItem(aModID, aItem, aAmount, null); - } - - /** - * Gets an Item from the specified mod, and returns a Replacement Item if not possible - */ - public static ItemStack getModItem(String aModID, String aItem, long aAmount, ItemStack aReplacement) { - ItemStack result; - if (GT_Utility.isStringInvalid(aItem) || !GregTech_API.sPreloadStarted) { - result = null; - } else { - result = GT_Utility - .copyAmount(aAmount, GameRegistry.findItemStack(aModID, aItem, (int) aAmount), aReplacement); - } - - if (result == null) { - String reason; - if (GT_Utility.isStringInvalid(aItem)) { - reason = "the name of the item is an invalid string"; - } else if (!GregTech_API.sPreloadStarted) { - reason = "the GT5U preloading phase has not yet started"; - } else { - reason = "the item was not found in the game registry"; - } - String log_message = "getModItem call: object \"" + aItem - + "\" with mod id \"" - + aModID - + "\" has returned null because " - + reason; - GT_Log.out.println(log_message); - new Exception().printStackTrace(GT_Log.out); - } - return result; - } - - /** - * Gets an Item from the specified mod, but the Damage Value can be specified - */ - public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta) { - ItemStack rStack = getModItem(aModID, aItem, aAmount); - if (rStack == null) return null; - Items.feather.setDamage(rStack, aMeta); - return rStack; - } - - /** - * Gets an Item from the specified mod, but the Damage Value can be specified, and returns a Replacement Item with - * the same Damage if not possible - */ - public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta, ItemStack aReplacement) { - ItemStack rStack = getModItem(aModID, aItem, aAmount, aReplacement); - if (rStack == null) return null; - Items.feather.setDamage(rStack, aMeta); - return rStack; - } - - /** - * OUT OF ORDER - */ - @Deprecated - public static boolean getModeKeyDown(EntityPlayer aPlayer) { - return false; - } - - /** - * OUT OF ORDER - */ - @Deprecated - public static boolean getBoostKeyDown(EntityPlayer aPlayer) { - return false; - } - - /** - * OUT OF ORDER - */ - @Deprecated - public static boolean getJumpKeyDown(EntityPlayer aPlayer) { - return false; - } - - /** - * Adds a Valuable Ore to the Miner - */ - public static boolean addValuableOre(Block aBlock, int aMeta, int aValue) { - if (aValue <= 0) return false; - try { - Class.forName("ic2.core.IC2") - .getMethod("addValuableOre", IRecipeInput.class, int.class) - .invoke(null, new RecipeInputItemStack(new ItemStack(aBlock, 1, aMeta)), aValue); - } catch (Throwable e) { - /* Do nothing */ - } - return true; - } - - /** - * Adds a Scrapbox Drop. Fails at April first for the "suddenly Hoes"-Feature of IC2 - */ - public static boolean addScrapboxDrop(float aChance, ItemStack aOutput) { - aOutput = GT_OreDictUnificator.get(true, aOutput); - if (aOutput == null || aChance <= 0) return false; - aOutput.stackSize = 1; - if (GT_Config.troll && !GT_Utility.areStacksEqual(aOutput, new ItemStack(Items.wooden_hoe, 1, 0))) return false; - try { - GT_Utility.callMethod( - GT_Utility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true), - "addDrop", - true, - false, - true, - GT_Utility.copyOrNull(aOutput), - aChance); - GT_Utility.callMethod( - GT_Utility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true), - "addRecipe", - true, - true, - false, - GT_Utility.copyOrNull(aOutput), - aChance); - } catch (Throwable e) { - /* Do nothing */ - } - return true; - } - - /** - * Adds an Item to the Recycler Blacklist - */ - public static boolean addToRecyclerBlackList(ItemStack aRecycledStack) { - if (aRecycledStack == null) return false; - try { - ic2.api.recipe.Recipes.recyclerBlacklist.add(new RecipeInputItemStack(aRecycledStack)); - } catch (Throwable e) { - /* Do nothing */ - } - return true; - } - - /** - * Just simple Furnace smelting. Unbelievable how Minecraft fails at making a simple ItemStack->ItemStack mapping... - */ - public static boolean addSmeltingRecipe(ItemStack aInput, ItemStack aOutput) { - aOutput = GT_OreDictUnificator.get(true, aOutput); - if (aInput == null || aOutput == null) return false; - FurnaceRecipes.smelting() - .func_151394_a(aInput, GT_Utility.copyOrNull(aOutput), 0.0F); - return true; - } - - /** - * Adds to Furnace AND Alloy Smelter - */ - public static boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aInput, ItemStack aOutput, boolean hidden) { - if (aInput == null || aOutput == null) { - return false; - } - boolean temp = aInput.stackSize == 1 && addSmeltingRecipe(aInput, aOutput); - ItemStack input2 = OrePrefixes.ingot.contains(aOutput) ? ItemList.Shape_Mold_Ingot.get(0) - : OrePrefixes.block.contains(aOutput) ? ItemList.Shape_Mold_Block.get(0) - : OrePrefixes.nugget.contains(aOutput) ? ItemList.Shape_Mold_Nugget.get(0) : null; - if (Materials.Graphite.contains(aInput)) { - return false; - } - if ((input2 == null) && ((OrePrefixes.ingot.contains(aInput)) || (OrePrefixes.dust.contains(aInput)) - || (OrePrefixes.gem.contains(aInput)))) { - return false; - } - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); - if (input2 == null) { - recipeBuilder.itemInputs(aInput); - } else { - recipeBuilder.itemInputs(aInput, input2); - } - recipeBuilder.itemOutputs(aOutput) - .duration(6 * SECONDS + 10 * TICKS) - .eut(3) - .recipeCategory(RecipeCategories.alloySmelterRecycling); - if (hidden) { - recipeBuilder.hidden(); - } - recipeBuilder.addTo(alloySmelterRecipes); - return true; - } - - /** - * Removes IC2 recipes. - */ - public static void removeAllIC2Recipes() { - getMaceratorRecipeList().entrySet() - .clear(); - getCompressorRecipeList().entrySet() - .clear(); - getExtractorRecipeList().entrySet() - .clear(); - getOreWashingRecipeList().entrySet() - .clear(); - getThermalCentrifugeRecipeList().entrySet() - .clear(); - } - - /** - * Adds GT versions of the IC2 recipes from the supplied IC2RecipeList. Deprecated because all IC2 recipes - * have been manually added to GT. - */ - @Deprecated - public static void addIC2RecipesToGT(Map aIC2RecipeList, RecipeMap aGTRecipeMap, - boolean aAddGTRecipe, boolean aRemoveIC2Recipe, boolean aExcludeGTIC2Items) { - Map aRecipesToRemove = new HashMap<>(); - for (Entry iRecipeInputRecipeOutputEntry : aIC2RecipeList.entrySet()) { - if (iRecipeInputRecipeOutputEntry.getValue().items.isEmpty()) { - continue; - } - - for (ItemStack tStack : (iRecipeInputRecipeOutputEntry.getKey()).getInputs()) { - if (!GT_Utility.isStackValid(tStack)) { - continue; - } - - if (aAddGTRecipe) { - try { - if (aExcludeGTIC2Items && ((tStack.getUnlocalizedName() - .contains("gt.metaitem.01") - || tStack.getUnlocalizedName() - .contains("gt.blockores") - || tStack.getUnlocalizedName() - .contains("ic2.itemCrushed") - || tStack.getUnlocalizedName() - .contains("ic2.itemPurifiedCrushed")))) - continue; - switch (aGTRecipeMap.unlocalizedName) { - case "gt.recipe.macerator", "gt.recipe.extractor", "gt.recipe.compressor" -> GT_Values.RA - .stdBuilder() - .itemInputs( - GT_Utility.copyAmount( - iRecipeInputRecipeOutputEntry.getKey() - .getAmount(), - tStack)) - .itemOutputs(iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0])) - .duration(15 * SECONDS) - .eut(2) - .addTo(aGTRecipeMap); - case "gt.recipe.thermalcentrifuge" -> GT_Values.RA.stdBuilder() - .itemInputs( - GT_Utility.copyAmount( - iRecipeInputRecipeOutputEntry.getKey() - .getAmount(), - tStack)) - .itemOutputs(iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0])) - .duration(25 * SECONDS) - .eut(48) - .addTo(aGTRecipeMap); - } - } catch (Exception e) { - e.printStackTrace(GT_Log.err); - } - } - if (aRemoveIC2Recipe) { - aRecipesToRemove.put(tStack, iRecipeInputRecipeOutputEntry.getValue().items.get(0)); - } - - } - - } - GT_Utility.bulkRemoveSimpleIC2MachineRecipe(aRecipesToRemove, aIC2RecipeList); - } - - public static Map getExtractorRecipeList() { - try { - return ic2.api.recipe.Recipes.extractor.getRecipes(); - } catch (Throwable e) { - /* Do nothing */ - } - return emptyRecipeMap; - } - - public static Map getCompressorRecipeList() { - try { - return ic2.api.recipe.Recipes.compressor.getRecipes(); - } catch (Throwable e) { - /* Do nothing */ - } - return emptyRecipeMap; - } - - public static Map getMaceratorRecipeList() { - try { - return ic2.api.recipe.Recipes.macerator.getRecipes(); - } catch (Throwable e) { - /* Do nothing */ - } - return emptyRecipeMap; - } - - public static Map getThermalCentrifugeRecipeList() { - try { - return ic2.api.recipe.Recipes.centrifuge.getRecipes(); - } catch (Throwable e) { - /* Do nothing */ - } - return emptyRecipeMap; - } - - public static Map getOreWashingRecipeList() { - try { - return ic2.api.recipe.Recipes.oreWashing.getRecipes(); - } catch (Throwable e) { - /* Do nothing */ - } - return emptyRecipeMap; - } - - /** - * IC2-OreWasher Recipe. Overloads old Recipes automatically - */ - @Deprecated - public static boolean addOreWasherRecipe(ItemStack aInput, int[] aChances, int aWaterAmount, Object... aOutput) { - if (aInput == null || aOutput == null || aOutput.length == 0 || aOutput[0] == null) return false; - RA.stdBuilder() - .itemInputs(aInput) - .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2]) - .outputChances(aChances) - .fluidInputs(GT_ModHandler.getWater(aWaterAmount)) - .duration(25 * SECONDS) - .eut(16) - .addTo(oreWasherRecipes); - - RA.stdBuilder() - .itemInputs(aInput) - .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2]) - .outputChances(aChances) - .fluidInputs(GT_ModHandler.getDistilledWater(aWaterAmount / 5)) - .duration(15 * SECONDS) - .eut(16) - .addTo(oreWasherRecipes); - return true; - } - - public static void stopBufferingCraftingRecipes() { - sBufferCraftingRecipes = false; - - bulkRemoveRecipeByOutput(delayedRemovalByOutput); - bulkRemoveByRecipe(delayedRemovalByRecipe); - sBufferRecipeList.forEach(GameRegistry::addRecipe); - - delayedRemovalByOutput.clear(); - delayedRemovalByRecipe.clear(); - sBufferRecipeList.clear(); - } - - /** - * Shapeless Crafting Recipes. Deletes conflicting Recipes too. - */ - public static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, - int[] aEnchantmentLevelsAdded, Object[] aRecipe) { - return addCraftingRecipe( - aResult, - aEnchantmentsAdded, - aEnchantmentLevelsAdded, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - true, - aRecipe); - } - - /** - * Regular Crafting Recipes. Deletes conflicting Recipes too. - *

- * You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)" - * on them. - *

- * Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String. - *

- * Lowercase Letters are reserved for Tools. They are as follows: - *

- * 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd' - * ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h' - * ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j' - * ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm' - * ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r' - * ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench, - * 'x' ToolDictNames.craftingToolWireCutter, - */ - public static boolean addCraftingRecipe(ItemStack aResult, Object[] aRecipe) { - return addCraftingRecipe(aResult, 0, aRecipe); - } - - /** - * Regular Crafting Recipes. Deletes conflicting Recipes too. - *

- * You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)" - * on them. - *

- * Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String. - *

- * Lowercase Letters are reserved for Tools. They are as follows: - *

- * 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd' - * ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h' - * ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j' - * ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm' - * ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r' - * ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench, - * 'x' ToolDictNames.craftingToolWireCutter, - */ - public static boolean addCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) { - return addCraftingRecipe( - aResult, - new Enchantment[0], - new int[0], - (aBitMask & RecipeBits.MIRRORED) != 0, - (aBitMask & RecipeBits.BUFFERED) != 0, - (aBitMask & RecipeBits.KEEPNBT) != 0, - (aBitMask & RecipeBits.DISMANTLEABLE) != 0, - (aBitMask & RecipeBits.NOT_REMOVABLE) == 0, - (aBitMask & RecipeBits.REVERSIBLE) != 0, - (aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES) != 0, - (aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT) != 0, - (aBitMask & RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES) != 0, - (aBitMask & RecipeBits.DELETE_ALL_OTHER_NATIVE_RECIPES) != 0, - (aBitMask & RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS) == 0, - (aBitMask & RecipeBits.ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT) != 0, - (aBitMask & RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL) != 0, - aRecipe); - } - - public static boolean addMachineCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe, - int machineTier) { - if (aRecipe != null) { - for (int i = 3; i < aRecipe.length; i++) { - if (!(aRecipe[i] instanceof GT_MetaTileEntity_BasicMachine_GT_Recipe.X)) continue; - - // spotless:off - aRecipe[i] = switch ((GT_MetaTileEntity_BasicMachine_GT_Recipe.X) aRecipe[i]) { - case CIRCUIT -> Tier.ELECTRIC[machineTier].mManagingObject; - case BETTER_CIRCUIT -> Tier.ELECTRIC[machineTier].mBetterManagingObject; - case HULL -> Tier.ELECTRIC[machineTier].mHullObject; - case WIRE -> Tier.ELECTRIC[machineTier].mConductingObject; - case WIRE4 -> Tier.ELECTRIC[machineTier].mLargerConductingObject; - case STICK_DISTILLATION -> OrePrefixes.stick.get(Materials.Blaze); - - case GLASS -> switch (machineTier) { - case 0, 1, 2, 3 -> new ItemStack(Blocks.glass, 1, W); - case 4, 5, 6, 7, 8 -> "blockGlass" + VN[machineTier]; - default -> "blockGlass" + VN[8]; - }; - - case PLATE -> switch (machineTier) { - case 0, 1 -> OrePrefixes.plate.get(Materials.Steel); - case 2 -> OrePrefixes.plate.get(Materials.Aluminium); - case 3 -> OrePrefixes.plate.get(Materials.StainlessSteel); - case 4 -> OrePrefixes.plate.get(Materials.Titanium); - case 5 -> OrePrefixes.plate.get(Materials.TungstenSteel); - case 6 -> OrePrefixes.plate.get(Materials.HSSG); - case 7 -> OrePrefixes.plate.get(Materials.HSSE); - default -> OrePrefixes.plate.get(Materials.Neutronium); - }; - - case PIPE -> switch (machineTier) { - case 0, 1 -> OrePrefixes.pipeMedium.get(Materials.Bronze); - case 2 -> OrePrefixes.pipeMedium.get(Materials.Steel); - case 3 -> OrePrefixes.pipeMedium.get(Materials.StainlessSteel); - case 4 -> OrePrefixes.pipeMedium.get(Materials.Titanium); - case 5 -> OrePrefixes.pipeMedium.get(Materials.TungstenSteel); - case 6 -> OrePrefixes.pipeSmall.get(Materials.Ultimate); - case 7 -> OrePrefixes.pipeMedium.get(Materials.Ultimate); - case 8 -> OrePrefixes.pipeLarge.get(Materials.Ultimate); - default -> OrePrefixes.pipeHuge.get(Materials.Ultimate); - }; - - case COIL_HEATING -> switch (machineTier) { - case 0, 1 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); - case 2 -> OrePrefixes.wireGt02.get(Materials.Cupronickel); - case 3 -> OrePrefixes.wireGt02.get(Materials.Kanthal); - case 4 -> OrePrefixes.wireGt02.get(Materials.Nichrome); - case 5 -> OrePrefixes.wireGt02.get(Materials.TPV); - case 6 -> OrePrefixes.wireGt02.get(Materials.HSSG); - case 7 -> OrePrefixes.wireGt02.get(Materials.Naquadah); - case 8 -> OrePrefixes.wireGt02.get(Materials.NaquadahAlloy); - case 9 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); - default -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); - }; - - case COIL_HEATING_DOUBLE -> switch (machineTier) { - case 0, 1 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); - case 2 -> OrePrefixes.wireGt04.get(Materials.Cupronickel); - case 3 -> OrePrefixes.wireGt04.get(Materials.Kanthal); - case 4 -> OrePrefixes.wireGt04.get(Materials.Nichrome); - case 5 -> OrePrefixes.wireGt04.get(Materials.TPV); - case 6 -> OrePrefixes.wireGt04.get(Materials.HSSG); - case 7 -> OrePrefixes.wireGt04.get(Materials.Naquadah); - case 8 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy); - case 9 -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy); - default -> OrePrefixes.wireGt16.get(Materials.NaquadahAlloy); - }; - - case STICK_MAGNETIC -> switch (machineTier) { - case 0, 1 -> OrePrefixes.stick.get(Materials.IronMagnetic); - case 2, 3 -> OrePrefixes.stick.get(Materials.SteelMagnetic); - case 4, 5 -> OrePrefixes.stick.get(Materials.NeodymiumMagnetic); - case 6, 7, 8, 9 -> OrePrefixes.stick.get(Materials.SamariumMagnetic); - default -> OrePrefixes.stick.get(Materials.TengamAttuned); - }; - - case STICK_ELECTROMAGNETIC -> switch (machineTier) { - case 0, 1 -> OrePrefixes.stick.get(Materials.AnyIron); - case 2, 3 -> OrePrefixes.stick.get(Materials.Steel); - case 4 -> OrePrefixes.stick.get(Materials.Neodymium); - default -> OrePrefixes.stick.get(Materials.VanadiumGallium); - }; - - case COIL_ELECTRIC -> switch (machineTier) { - case 0 -> OrePrefixes.wireGt01.get(Materials.Lead); - case 1 -> OrePrefixes.wireGt02.get(Materials.Tin); - case 2 -> OrePrefixes.wireGt02.get(Materials.AnyCopper); - case 3 -> OrePrefixes.wireGt04.get(Materials.AnyCopper); - case 4 -> OrePrefixes.wireGt08.get(Materials.AnnealedCopper); - case 5 -> OrePrefixes.wireGt16.get(Materials.AnnealedCopper); - case 6 -> OrePrefixes.wireGt04.get(Materials.YttriumBariumCuprate); - case 7 -> OrePrefixes.wireGt08.get(Materials.Iridium); - default -> OrePrefixes.wireGt16.get(Materials.Osmium); - }; - - case ROBOT_ARM -> switch (machineTier) { - case 0, 1 -> ItemList.Robot_Arm_LV; - case 2 -> ItemList.Robot_Arm_MV; - case 3 -> ItemList.Robot_Arm_HV; - case 4 -> ItemList.Robot_Arm_EV; - case 5 -> ItemList.Robot_Arm_IV; - case 6 -> ItemList.Robot_Arm_LuV; - case 7 -> ItemList.Robot_Arm_ZPM; - case 8 -> ItemList.Robot_Arm_UV; - case 9 -> ItemList.Robot_Arm_UHV; - case 10 -> ItemList.Robot_Arm_UEV; - case 11 -> ItemList.Robot_Arm_UIV; - case 12 -> ItemList.Robot_Arm_UMV; - case 13 -> ItemList.Robot_Arm_UXV; - default -> ItemList.Robot_Arm_MAX; - }; - - case PUMP -> switch (machineTier) { - case 0, 1 -> ItemList.Electric_Pump_LV; - case 2 -> ItemList.Electric_Pump_MV; - case 3 -> ItemList.Electric_Pump_HV; - case 4 -> ItemList.Electric_Pump_EV; - case 5 -> ItemList.Electric_Pump_IV; - case 6 -> ItemList.Electric_Pump_LuV; - case 7 -> ItemList.Electric_Pump_ZPM; - case 8 -> ItemList.Electric_Pump_UV; - case 9 -> ItemList.Electric_Pump_UHV; - case 10 -> ItemList.Electric_Pump_UEV; - case 11 -> ItemList.Electric_Pump_UIV; - case 12 -> ItemList.Electric_Pump_UMV; - case 13 -> ItemList.Electric_Pump_UXV; - default -> ItemList.Electric_Pump_MAX; - }; - - case MOTOR -> switch (machineTier) { - case 0, 1 -> ItemList.Electric_Motor_LV; - case 2 -> ItemList.Electric_Motor_MV; - case 3 -> ItemList.Electric_Motor_HV; - case 4 -> ItemList.Electric_Motor_EV; - case 5 -> ItemList.Electric_Motor_IV; - case 6 -> ItemList.Electric_Motor_LuV; - case 7 -> ItemList.Electric_Motor_ZPM; - case 8 -> ItemList.Electric_Motor_UV; - case 9 -> ItemList.Electric_Motor_UHV; - case 10 -> ItemList.Electric_Motor_UEV; - case 11 -> ItemList.Electric_Motor_UIV; - case 12 -> ItemList.Electric_Motor_UMV; - case 13 -> ItemList.Electric_Motor_UXV; - default -> ItemList.Electric_Motor_MAX; - }; - - case PISTON -> switch (machineTier) { - case 0, 1 -> ItemList.Electric_Piston_LV; - case 2 -> ItemList.Electric_Piston_MV; - case 3 -> ItemList.Electric_Piston_HV; - case 4 -> ItemList.Electric_Piston_EV; - case 5 -> ItemList.Electric_Piston_IV; - case 6 -> ItemList.Electric_Piston_LuV; - case 7 -> ItemList.Electric_Piston_ZPM; - case 8 -> ItemList.Electric_Piston_UV; - case 9 -> ItemList.Electric_Piston_UHV; - case 10 -> ItemList.Electric_Piston_UEV; - case 11 -> ItemList.Electric_Piston_UIV; - case 12 -> ItemList.Electric_Piston_UMV; - case 13 -> ItemList.Electric_Piston_UXV; - default -> ItemList.Electric_Piston_MAX; - }; - - case CONVEYOR -> switch (machineTier) { - case 0, 1 -> ItemList.Conveyor_Module_LV; - case 2 -> ItemList.Conveyor_Module_MV; - case 3 -> ItemList.Conveyor_Module_HV; - case 4 -> ItemList.Conveyor_Module_EV; - case 5 -> ItemList.Conveyor_Module_IV; - case 6 -> ItemList.Conveyor_Module_LuV; - case 7 -> ItemList.Conveyor_Module_ZPM; - case 8 -> ItemList.Conveyor_Module_UV; - case 9 -> ItemList.Conveyor_Module_UHV; - case 10 -> ItemList.Conveyor_Module_UEV; - case 11 -> ItemList.Conveyor_Module_UIV; - case 12 -> ItemList.Conveyor_Module_UMV; - case 13 -> ItemList.Conveyor_Module_UXV; - default -> ItemList.Conveyor_Module_MAX; - }; - - case EMITTER -> switch (machineTier) { - case 0, 1 -> ItemList.Emitter_LV; - case 2 -> ItemList.Emitter_MV; - case 3 -> ItemList.Emitter_HV; - case 4 -> ItemList.Emitter_EV; - case 5 -> ItemList.Emitter_IV; - case 6 -> ItemList.Emitter_LuV; - case 7 -> ItemList.Emitter_ZPM; - case 8 -> ItemList.Emitter_UV; - case 9 -> ItemList.Emitter_UHV; - case 10 -> ItemList.Emitter_UEV; - case 11 -> ItemList.Emitter_UIV; - case 12 -> ItemList.Emitter_UMV; - case 13 -> ItemList.Emitter_UXV; - default -> ItemList.Emitter_MAX; - }; - - case SENSOR -> switch (machineTier) { - case 0, 1 -> ItemList.Sensor_LV; - case 2 -> ItemList.Sensor_MV; - case 3 -> ItemList.Sensor_HV; - case 4 -> ItemList.Sensor_EV; - case 5 -> ItemList.Sensor_IV; - case 6 -> ItemList.Sensor_LuV; - case 7 -> ItemList.Sensor_ZPM; - case 8 -> ItemList.Sensor_UV; - case 9 -> ItemList.Sensor_UHV; - case 10 -> ItemList.Sensor_UEV; - case 11 -> ItemList.Sensor_UIV; - case 12 -> ItemList.Sensor_UMV; - case 13 -> ItemList.Sensor_UXV; - default -> ItemList.Sensor_MAX; - }; - - case FIELD_GENERATOR -> switch (machineTier) { - case 0, 1 -> ItemList.Field_Generator_LV; - case 2 -> ItemList.Field_Generator_MV; - case 3 -> ItemList.Field_Generator_HV; - case 4 -> ItemList.Field_Generator_EV; - case 5 -> ItemList.Field_Generator_IV; - case 6 -> ItemList.Field_Generator_LuV; - case 7 -> ItemList.Field_Generator_ZPM; - case 8 -> ItemList.Field_Generator_UV; - case 9 -> ItemList.Field_Generator_UHV; - case 10 -> ItemList.Field_Generator_UEV; - case 11 -> ItemList.Field_Generator_UIV; - case 12 -> ItemList.Field_Generator_UMV; - case 13 -> ItemList.Field_Generator_UXV; - default -> ItemList.Field_Generator_MAX; - }; - - case ROTOR -> switch (machineTier) { - case 0, 1 -> OrePrefixes.rotor.get(Materials.Tin); - case 2 -> OrePrefixes.rotor.get(Materials.Bronze); - case 3 -> OrePrefixes.rotor.get(Materials.Steel); - case 4 -> OrePrefixes.rotor.get(Materials.StainlessSteel); - case 5 -> OrePrefixes.rotor.get(Materials.TungstenSteel); - case 6 -> OrePrefixes.rotor.get(ExternalMaterials.getRhodiumPlatedPalladium()); - case 7 -> OrePrefixes.rotor.get(Materials.Iridium); - default -> OrePrefixes.rotor.get(Materials.Osmium); - }; - - default -> throw new IllegalArgumentException("MISSING TIER MAPPING FOR: " + aRecipe[i] + " AT TIER " + machineTier); - }; - // spotless:on - } - - if (!GT_ModHandler.addCraftingRecipe( - aResult, - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.BUFFERED - | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - aRecipe)) { - throw new IllegalArgumentException("INVALID CRAFTING RECIPE FOR: " + aResult.getDisplayName()); - } - } - return true; - } - - /** - * Internal realisation of the Crafting Recipe adding Process. - */ - private static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, - int[] aEnchantmentLevelsAdded, boolean aMirrored, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable, - boolean aRemovable, boolean aReversible, boolean aRemoveAllOthersWithSameOutput, - boolean aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT, boolean aRemoveAllOtherShapedsWithSameOutput, - boolean aRemoveAllOtherNativeRecipes, boolean aCheckForCollisions, - boolean aOnlyAddIfThereIsAnyRecipeOutputtingThis, boolean aOnlyAddIfResultIsNotNull, Object[] aRecipe) { - - aResult = GT_OreDictUnificator.get(true, aResult); - if (aOnlyAddIfResultIsNotNull && aResult == null) return false; - if (aResult != null && Items.feather.getDamage(aResult) == W) Items.feather.setDamage(aResult, 0); - if (aRecipe == null || aRecipe.length == 0) return false; - - // The renamed variable clarifies what's happening - // noinspection UnnecessaryLocalVariable - boolean tDoWeCareIfThereWasARecipe = aOnlyAddIfThereIsAnyRecipeOutputtingThis; - boolean tThereWasARecipe = false; - - for (byte i = 0; i < aRecipe.length; i++) { - if (aRecipe[i] instanceof IItemContainer) aRecipe[i] = ((IItemContainer) aRecipe[i]).get(1); - else if (aRecipe[i] instanceof Enum) aRecipe[i] = ((Enum) aRecipe[i]).name(); - else if (!(aRecipe[i] == null || aRecipe[i] instanceof ItemStack - || aRecipe[i] instanceof ItemData - || aRecipe[i] instanceof String - || aRecipe[i] instanceof Character)) aRecipe[i] = aRecipe[i].toString(); - } - - try { - StringBuilder shape = new StringBuilder(E); - int idx = 0; - if (aRecipe[idx] instanceof Boolean) { - throw new IllegalArgumentException(); - } - - ArrayList tRecipeList = new ArrayList<>(Arrays.asList(aRecipe)); - - while (aRecipe[idx] instanceof String) { - StringBuilder s = new StringBuilder((String) aRecipe[idx++]); - shape.append(s); - while (s.length() < 3) s.append(" "); - if (s.length() > 3) throw new IllegalArgumentException(); - - for (char c : s.toString() - .toCharArray()) { - switch (c) { - case 'b' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolBlade.name()); - } - case 'c' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolCrowbar.name()); - } - case 'd' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolScrewdriver.name()); - } - case 'f' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolFile.name()); - } - case 'h' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolHardHammer.name()); - } - case 'i' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolSolderingIron.name()); - } - case 'j' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolSolderingMetal.name()); - } - case 'k' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolKnife.name()); - } - case 'm' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolMortar.name()); - } - case 'p' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolDrawplate.name()); - } - case 'r' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolSoftHammer.name()); - } - case 's' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolSaw.name()); - } - case 'w' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolWrench.name()); - } - case 'x' -> { - tRecipeList.add(c); - tRecipeList.add(ToolDictNames.craftingToolWireCutter.name()); - } - } - } - } - - aRecipe = tRecipeList.toArray(); - - if (aRecipe[idx] instanceof Boolean) { - idx++; - } - Map tItemStackMap = new HashMap<>(); - Map tItemDataMap = new HashMap<>(); - tItemStackMap.put(' ', null); - - boolean tRemoveRecipe = true; - - for (; idx < aRecipe.length; idx += 2) { - if (aRecipe[idx] == null || aRecipe[idx + 1] == null) { - if (D1) { - GT_Log.err.println( - "WARNING: Missing Item for shaped Recipe: " - + (aResult == null ? "null" : aResult.getDisplayName())); - for (Object tContent : aRecipe) GT_Log.err.println(tContent); - } - return false; - } - Character chr = (Character) aRecipe[idx]; - Object in = aRecipe[idx + 1]; - if (in instanceof ItemStack is) { - tItemStackMap.put(chr, GT_Utility.copyOrNull(is)); - tItemDataMap.put(chr, GT_OreDictUnificator.getItemData(is)); - } else if (in instanceof ItemData) { - String tString = in.toString(); - switch (tString) { - case "plankWood" -> tItemDataMap.put(chr, new ItemData(Materials.Wood, M)); - case "stoneNetherrack" -> tItemDataMap.put(chr, new ItemData(Materials.Netherrack, M)); - case "stoneObsidian" -> tItemDataMap.put(chr, new ItemData(Materials.Obsidian, M)); - case "stoneEndstone" -> tItemDataMap.put(chr, new ItemData(Materials.Endstone, M)); - default -> tItemDataMap.put(chr, (ItemData) in); - } - ItemStack tStack = GT_OreDictUnificator.getFirstOre(in, 1); - if (tStack == null) tRemoveRecipe = false; - else tItemStackMap.put(chr, tStack); - in = aRecipe[idx + 1] = in.toString(); - } else if (in instanceof String) { - if (in.equals(OreDictNames.craftingChest.toString())) - tItemDataMap.put(chr, new ItemData(Materials.Wood, M * 8)); - else if (in.equals(OreDictNames.craftingBook.toString())) - tItemDataMap.put(chr, new ItemData(Materials.Paper, M * 3)); - else if (in.equals(OreDictNames.craftingPiston.toString())) - tItemDataMap.put(chr, new ItemData(Materials.Stone, M * 4, Materials.Wood, M * 3)); - else if (in.equals(OreDictNames.craftingFurnace.toString())) - tItemDataMap.put(chr, new ItemData(Materials.Stone, M * 8)); - else if (in.equals(OreDictNames.craftingIndustrialDiamond.toString())) - tItemDataMap.put(chr, new ItemData(Materials.Diamond, M)); - else if (in.equals(OreDictNames.craftingAnvil.toString())) - tItemDataMap.put(chr, new ItemData(Materials.Iron, M * 10)); - ItemStack tStack = GT_OreDictUnificator.getFirstOre(in, 1); - if (tStack == null) tRemoveRecipe = false; - else tItemStackMap.put(chr, tStack); - } else { - throw new IllegalArgumentException(); - } - } - - if (aReversible && aResult != null) { - ItemData[] tData = new ItemData[9]; - int x = -1; - for (char chr : shape.toString() - .toCharArray()) tData[++x] = tItemDataMap.get(chr); - if (GT_Utility.arrayContainsNonNull(tData)) - GT_OreDictUnificator.addItemData(aResult, new ItemData(tData)); - } - - if (aCheckForCollisions && tRemoveRecipe) { - ItemStack[] tRecipe = new ItemStack[9]; - int x = -1; - for (char chr : shape.toString() - .toCharArray()) { - tRecipe[++x] = tItemStackMap.get(chr); - if (tRecipe[x] != null && Items.feather.getDamage(tRecipe[x]) == W) - Items.feather.setDamage(tRecipe[x], 0); - } - if (tDoWeCareIfThereWasARecipe || !aBuffered) tThereWasARecipe = removeRecipe(tRecipe) != null; - else removeRecipeDelayed(tRecipe); - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - - if (aResult == null || aResult.stackSize <= 0) return false; - - if (aRemoveAllOthersWithSameOutput || aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT - || aRemoveAllOtherShapedsWithSameOutput - || aRemoveAllOtherNativeRecipes) { - if (tDoWeCareIfThereWasARecipe || !aBuffered) tThereWasARecipe = removeRecipeByOutput( - aResult, - !aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT, - aRemoveAllOtherShapedsWithSameOutput, - aRemoveAllOtherNativeRecipes) || tThereWasARecipe; - else removeRecipeByOutputDelayed(aResult); - } - - if (aOnlyAddIfThereIsAnyRecipeOutputtingThis && !tDoWeCareIfThereWasARecipe && !tThereWasARecipe) { - ArrayList tList = (ArrayList) CraftingManager.getInstance() - .getRecipeList(); - int tList_sS = tList.size(); - for (int i = 0; i < tList_sS && !tThereWasARecipe; i++) { - IRecipe tRecipe = tList.get(i); - if (sSpecialRecipeClasses.contains( - tRecipe.getClass() - .getName())) - continue; - if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get(tRecipe.getRecipeOutput()), aResult, true)) { - tList.remove(i--); - tList_sS = tList.size(); - tThereWasARecipe = true; - } - } - } - - if (Items.feather.getDamage(aResult) == W || Items.feather.getDamage(aResult) < 0) - Items.feather.setDamage(aResult, 0); - - GT_Utility.updateItemStack(aResult); - - if (tThereWasARecipe || !aOnlyAddIfThereIsAnyRecipeOutputtingThis) { - if (sBufferCraftingRecipes && aBuffered) sBufferRecipeList.add( - new GT_Shaped_Recipe( - GT_Utility.copyOrNull(aResult), - aDismantleable, - aRemovable, - aKeepNBT, - aEnchantmentsAdded, - aEnchantmentLevelsAdded, - aRecipe).setMirrored(aMirrored)); - else GameRegistry.addRecipe( - new GT_Shaped_Recipe( - GT_Utility.copyOrNull(aResult), - aDismantleable, - aRemovable, - aKeepNBT, - aEnchantmentsAdded, - aEnchantmentLevelsAdded, - aRecipe).setMirrored(aMirrored)); - } - return true; - } - - /** - * Shapeless Crafting Recipes. Deletes conflicting Recipes too. - */ - public static boolean addShapelessEnchantingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, - int[] aEnchantmentLevelsAdded, Object[] aRecipe) { - return addShapelessCraftingRecipe( - aResult, - aEnchantmentsAdded, - aEnchantmentLevelsAdded, - true, - false, - false, - false, - aRecipe); - } - - /** - * Shapeless Crafting Recipes. Deletes conflicting Recipes too. - */ - public static boolean addShapelessCraftingRecipe(ItemStack aResult, Object[] aRecipe) { - return addShapelessCraftingRecipe( - aResult, - RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | RecipeBits.BUFFERED, - aRecipe); - } - - /** - * Shapeless Crafting Recipes. Deletes conflicting Recipes too. - */ - public static boolean addShapelessCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) { - return addShapelessCraftingRecipe( - aResult, - new Enchantment[0], - new int[0], - (aBitMask & RecipeBits.BUFFERED) != 0, - (aBitMask & RecipeBits.KEEPNBT) != 0, - (aBitMask & RecipeBits.DISMANTLEABLE) != 0, - (aBitMask & RecipeBits.NOT_REMOVABLE) == 0, - aRecipe); - } - - /** - * Shapeless Crafting Recipes. Deletes conflicting Recipes too. - */ - private static boolean addShapelessCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, - int[] aEnchantmentLevelsAdded, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable, boolean aRemovable, - Object[] aRecipe) { - aResult = GT_OreDictUnificator.get(true, aResult); - if (aRecipe == null || aRecipe.length == 0) return false; - for (byte i = 0; i < aRecipe.length; i++) { - if (aRecipe[i] instanceof IItemContainer) aRecipe[i] = ((IItemContainer) aRecipe[i]).get(1); - else if (aRecipe[i] instanceof Enum) aRecipe[i] = ((Enum) aRecipe[i]).name(); - else if (!(aRecipe[i] == null || aRecipe[i] instanceof ItemStack - || aRecipe[i] instanceof String - || aRecipe[i] instanceof Character)) aRecipe[i] = aRecipe[i].toString(); - } - try { - ItemStack[] tRecipe = new ItemStack[9]; - int i = 0; - for (Object tObject : aRecipe) { - if (tObject == null) { - if (D1) GT_Log.err.println( - "WARNING: Missing Item for shapeless Recipe: " - + (aResult == null ? "null" : aResult.getDisplayName())); - for (Object tContent : aRecipe) GT_Log.err.println(tContent); - return false; - } - if (tObject instanceof ItemStack) { - tRecipe[i] = (ItemStack) tObject; - } else if (tObject instanceof String) { - tRecipe[i] = GT_OreDictUnificator.getFirstOre(tObject, 1); - if (tRecipe[i] == null) break; - } - i++; - } - if (sBufferCraftingRecipes && aBuffered) removeRecipeDelayed(tRecipe); - else removeRecipe(tRecipe); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - - if (aResult == null || aResult.stackSize <= 0) return false; - - if (Items.feather.getDamage(aResult) == W || Items.feather.getDamage(aResult) < 0) - Items.feather.setDamage(aResult, 0); - - GT_Utility.updateItemStack(aResult); - - if (sBufferCraftingRecipes && aBuffered) sBufferRecipeList.add( - new GT_Shapeless_Recipe( - GT_Utility.copyOrNull(aResult), - aDismantleable, - aRemovable, - aKeepNBT, - aEnchantmentsAdded, - aEnchantmentLevelsAdded, - aRecipe)); - else GameRegistry.addRecipe( - new GT_Shapeless_Recipe( - GT_Utility.copyOrNull(aResult), - aDismantleable, - aRemovable, - aKeepNBT, - aEnchantmentsAdded, - aEnchantmentLevelsAdded, - aRecipe)); - return true; - } - - /** - * Removes a Smelting Recipe - */ - public static boolean removeFurnaceSmelting(ItemStack aInput) { - if (aInput != null) { - for (ItemStack tInput : FurnaceRecipes.smelting() - .getSmeltingList() - .keySet()) { - if (GT_Utility.isStackValid(tInput) && GT_Utility.areStacksEqual(aInput, tInput, true)) { - FurnaceRecipes.smelting() - .getSmeltingList() - .remove(tInput); - return true; - } - } - } - return false; - } - - /** - * Removes all matching Smelting Recipes by output - */ - public static boolean removeFurnaceSmeltingByOutput(ItemStack aOutput) { - if (aOutput != null) { - return FurnaceRecipes.smelting() - .getSmeltingList() - .values() - .removeIf( - tOutput -> GT_Utility.isStackValid(tOutput) && GT_Utility.areStacksEqual(aOutput, tOutput, true)); - } - return false; - } - - /** - * Removes a Crafting Recipe and gives you the former output of it. - * - * @param aRecipe The content of the Crafting Grid as ItemStackArray with length 9 - * @return the output of the old Recipe or null if there was nothing. - */ - public static ItemStack removeRecipe(ItemStack... aRecipe) { - if (aRecipe == null) return null; - if (Arrays.stream(aRecipe) - .noneMatch(Objects::nonNull)) return null; - - ItemStack rReturn = null; - InventoryCrafting aCrafting = new InventoryCrafting(new Container() { - - @Override - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 3, 3); - for (int i = 0; i < aRecipe.length && i < 9; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); - ArrayList tList = (ArrayList) CraftingManager.getInstance() - .getRecipeList(); - int tList_sS = tList.size(); - try { - for (int i = 0; i < tList_sS; i++) { - for (; i < tList_sS; i++) { - if ((!(tList.get(i) instanceof IGT_CraftingRecipe) - || ((IGT_CraftingRecipe) tList.get(i)).isRemovable()) && tList.get(i) - .matches(aCrafting, DW)) { - rReturn = tList.get(i) - .getCraftingResult(aCrafting); - if (rReturn != null) tList.remove(i--); - tList_sS = tList.size(); - } - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - return rReturn; - } - - public static void removeRecipeDelayed(ItemStack... aRecipe) { - if (!sBufferCraftingRecipes) { - removeRecipe(aRecipe); - return; - } - - if (aRecipe == null) return; - if (Arrays.stream(aRecipe) - .noneMatch(Objects::nonNull)) return; - - InventoryCrafting aCrafting = new InventoryCrafting(new Container() { - - @Override - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 3, 3); - for (int i = 0; i < aRecipe.length && i < 9; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); - delayedRemovalByRecipe.add(aCrafting); - } - - public static void bulkRemoveByRecipe(List toRemove) { - ArrayList tList = (ArrayList) CraftingManager.getInstance() - .getRecipeList(); - GT_FML_LOGGER.info("BulkRemoveByRecipe: tList: " + tList.size() + " toRemove: " + toRemove.size()); - - Set tListToRemove = tList.parallelStream() - .filter(tRecipe -> { - if ((tRecipe instanceof IGT_CraftingRecipe) && !((IGT_CraftingRecipe) tRecipe).isRemovable()) - return false; - return toRemove.stream() - .anyMatch(aCrafting -> tRecipe.matches(aCrafting, DW)); - }) - .collect(Collectors.toSet()); - - tList.removeIf(tListToRemove::contains); - } - - public static boolean removeRecipeByOutputDelayed(ItemStack aOutput) { - if (sBufferCraftingRecipes) return delayedRemovalByOutput.add(aOutput); - else return removeRecipeByOutput(aOutput); - } - - public static boolean removeRecipeByOutputDelayed(ItemStack aOutput, boolean aIgnoreNBT, - boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) { - if (sBufferCraftingRecipes && (aIgnoreNBT && !aNotRemoveShapelessRecipes && !aOnlyRemoveNativeHandlers)) - // Too lazy to handle deferred versions of the parameters that aren't used very often - return delayedRemovalByOutput.add(aOutput); - else return removeRecipeByOutput(aOutput, aIgnoreNBT, aNotRemoveShapelessRecipes, aOnlyRemoveNativeHandlers); - } - - public static boolean removeRecipeByOutput(ItemStack aOutput) { - return removeRecipeByOutput(aOutput, true, false, false); - } - - /** - * Removes a Crafting Recipe. - * - * @param aOutput The output of the Recipe. - * @return if it has removed at least one Recipe. - */ - public static boolean removeRecipeByOutput(ItemStack aOutput, boolean aIgnoreNBT, - boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) { - if (aOutput == null) return false; - boolean rReturn = false; - final ArrayList tList = (ArrayList) CraftingManager.getInstance() - .getRecipeList(); - aOutput = GT_OreDictUnificator.get(aOutput); - int tList_sS = tList.size(); - for (int i = 0; i < tList_sS; i++) { - final IRecipe tRecipe = tList.get(i); - if (aNotRemoveShapelessRecipes - && (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe)) continue; - if (aOnlyRemoveNativeHandlers) { - if (!sNativeRecipeClasses.contains( - tRecipe.getClass() - .getName())) - continue; - } else { - if (sSpecialRecipeClasses.contains( - tRecipe.getClass() - .getName())) - continue; - } - ItemStack tStack = tRecipe.getRecipeOutput(); - if ((!(tRecipe instanceof IGT_CraftingRecipe) || ((IGT_CraftingRecipe) tRecipe).isRemovable()) - && GT_Utility.areStacksEqual(GT_OreDictUnificator.get(tStack), aOutput, aIgnoreNBT)) { - tList.remove(i--); - tList_sS = tList.size(); - rReturn = true; - } - } - return rReturn; - } - - public static boolean bulkRemoveRecipeByOutput(List toRemove) { - ArrayList tList = (ArrayList) CraftingManager.getInstance() - .getRecipeList(); - - Set setToRemove = toRemove.parallelStream() - .map(GT_OreDictUnificator::get_nocopy) - .collect(Collectors.toSet()); - - GT_FML_LOGGER.info("BulkRemoveRecipeByOutput: tList: " + tList.size() + " setToRemove: " + setToRemove.size()); - - Set tListToRemove = tList.parallelStream() - .filter(tRecipe -> { - if ((tRecipe instanceof IGT_CraftingRecipe) && !((IGT_CraftingRecipe) tRecipe).isRemovable()) - return false; - if (sSpecialRecipeClasses.contains( - tRecipe.getClass() - .getName())) - return false; - final ItemStack tStack = GT_OreDictUnificator.get_nocopy(tRecipe.getRecipeOutput()); - return setToRemove.stream() - .anyMatch(aOutput -> GT_Utility.areStacksEqual(tStack, aOutput, true)); - }) - .collect(Collectors.toSet()); - - tList.removeIf(tListToRemove::contains); - return true; - } - - /** - * Checks all Crafting Handlers for Recipe Output Used for the Autocrafting Table - */ - public static ItemStack getAllRecipeOutput(World aWorld, ItemStack... aRecipe) { - if (aRecipe == null || aRecipe.length == 0) return null; - - if (aWorld == null) aWorld = DW; - - boolean temp = false; - for (ItemStack itemStack : aRecipe) { - if (itemStack != null) { - temp = true; - break; - } - } - if (!temp) return null; - InventoryCrafting aCrafting = new InventoryCrafting(new Container() { - - @Override - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 3, 3); - for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); - List tList = CraftingManager.getInstance() - .getRecipeList(); - synchronized (sAllRecipeList) { - if (sAllRecipeList.size() != tList.size()) { - sAllRecipeList.clear(); - sAllRecipeList.addAll(tList); - } - for (int i = 0, j = sAllRecipeList.size(); i < j; i++) { - IRecipe tRecipe = sAllRecipeList.get(i); - if (tRecipe.matches(aCrafting, aWorld)) { - if (i > 10) { - sAllRecipeList.remove(i); - sAllRecipeList.add(i - 10, tRecipe); - } - return tRecipe.getCraftingResult(aCrafting); - } - } - } - - int tIndex = 0; - ItemStack tStack1 = null, tStack2 = null; - for (int i = 0, j = aCrafting.getSizeInventory(); i < j; i++) { - ItemStack tStack = aCrafting.getStackInSlot(i); - if (tStack != null) { - if (tIndex == 0) tStack1 = tStack; - if (tIndex == 1) tStack2 = tStack; - tIndex++; - } - } - - if (tIndex == 2 && tStack2 != null) { - if (tStack1.getItem() == tStack2.getItem() && tStack1.stackSize == 1 - && tStack2.stackSize == 1 - && tStack1.getItem() - .isRepairable()) { - int tNewDamage = tStack1.getMaxDamage() + tStack1.getItemDamage() - - tStack2.getItemDamage() - + tStack1.getMaxDamage() / 20; - return new ItemStack(tStack1.getItem(), 1, Math.max(tNewDamage, 0)); - } - } - - return null; - } - - /** - * Gives you a copy of the Output from a Crafting Recipe Used for Recipe Detection. - */ - public static ItemStack getRecipeOutput(ItemStack... aRecipe) { - return getRecipeOutput(false, true, aRecipe); - } - - public static ItemStack getRecipeOutputNoOreDict(ItemStack... aRecipe) { - return getRecipeOutput(false, false, aRecipe); - } - - public static ItemStack getRecipeOutput(boolean aUncopiedStack, ItemStack... aRecipe) { - return getRecipeOutput(aUncopiedStack, true, aRecipe); - } - - /** - * Gives you a copy of the Output from a Crafting Recipe Used for Recipe Detection. - */ - public static ItemStack getRecipeOutput(boolean aUncopiedStack, boolean allowOreDict, ItemStack... aRecipe) { - if (aRecipe == null || Arrays.stream(aRecipe) - .noneMatch(Objects::nonNull)) return null; - - InventoryCrafting aCrafting = new InventoryCrafting(new Container() { - - @Override - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 3, 3); - for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); - ArrayList tList = (ArrayList) CraftingManager.getInstance() - .getRecipeList(); - boolean found = false; - - for (IRecipe iRecipe : tList) { - found = false; - if (!allowOreDict && iRecipe instanceof ShapedOreRecipe) continue; - - try { - found = iRecipe.matches(aCrafting, DW); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - if (found) { - ItemStack tOutput = aUncopiedStack ? iRecipe.getRecipeOutput() : iRecipe.getCraftingResult(aCrafting); - if (tOutput == null || tOutput.stackSize <= 0) { - // Seriously, who would ever do that shit? - if (!GregTech_API.sPostloadFinished) throw new GT_ItsNotMyFaultException( - "Seems another Mod added a Crafting Recipe with null Output. Tell the Developer of said Mod to fix that."); - } else { - if (aUncopiedStack) return tOutput; - return GT_Utility.copyOrNull(tOutput); - } - } - } - return null; - } - - /** - * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for - * example This also removes old Recipes from the List. - */ - public static List getVanillyToolRecipeOutputs(ItemStack... aRecipe) { - if (!GregTech_API.sPostloadStarted || GregTech_API.sPostloadFinished) - sSingleNonBlockDamagableRecipeList.clear(); - if (sSingleNonBlockDamagableRecipeList.isEmpty()) { - for (IRecipe tRecipe : CraftingManager.getInstance() - .getRecipeList()) { - ItemStack tStack = tRecipe.getRecipeOutput(); - if (GT_Utility.isStackValid(tStack) && tStack.getMaxStackSize() == 1 - && tStack.getMaxDamage() > 0 - && !(tStack.getItem() instanceof ItemBlock) - && !(tStack.getItem() instanceof IReactorComponent) - && !isElectricItem(tStack) - && !GT_Utility.isStackInList(tStack, sNonReplaceableItems)) { - if (!(tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe)) { - if (tRecipe instanceof ShapedOreRecipe) { - boolean temp = true; - for (Object tObject : ((ShapedOreRecipe) tRecipe).getInput()) if (tObject != null) { - if (tObject instanceof ItemStack && (((ItemStack) tObject).getItem() == null - || ((ItemStack) tObject).getMaxStackSize() < 2 - || ((ItemStack) tObject).getMaxDamage() > 0 - || ((ItemStack) tObject).getItem() instanceof ItemBlock)) { - temp = false; - break; - } - if (tObject instanceof List && ((List) tObject).isEmpty()) { - temp = false; - break; - } - } - if (temp) sSingleNonBlockDamagableRecipeList.add(tRecipe); - } else if (tRecipe instanceof ShapedRecipes) { - boolean temp = true; - for (ItemStack tObject : ((ShapedRecipes) tRecipe).recipeItems) { - if (tObject != null && (tObject.getItem() == null || tObject.getMaxStackSize() < 2 - || tObject.getMaxDamage() > 0 - || tObject.getItem() instanceof ItemBlock)) { - temp = false; - break; - } - } - if (temp) sSingleNonBlockDamagableRecipeList.add(tRecipe); - } else { - sSingleNonBlockDamagableRecipeList.add(tRecipe); - } - } - } - } - GT_Log.out.println( - "GT_Mod: Created a List of Tool Recipes containing " + sSingleNonBlockDamagableRecipeList.size() - + " Recipes for recycling." - + (sSingleNonBlockDamagableRecipeList.size() > 1024 - ? " Scanning all these Recipes is the reason for the startup Lag you receive right now." - : E)); - } - List rList = getRecipeOutputs(sSingleNonBlockDamagableRecipeList, true, aRecipe); - if (!GregTech_API.sPostloadStarted || GregTech_API.sPostloadFinished) - sSingleNonBlockDamagableRecipeList.clear(); - return rList; - } - - /** - * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for - * example - */ - public static List getRecipeOutputs(ItemStack... aRecipe) { - return getRecipeOutputs( - CraftingManager.getInstance() - .getRecipeList(), - false, - aRecipe); - } - - private static List bufferedRecipes = null; - - /** - * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for - * example Buffers a List which only has armor-alike crafting in it - */ - public static List getRecipeOutputsBuffered(ItemStack... aRecipe) { - - if (bufferedRecipes == null) bufferedRecipes = CraftingManager.getInstance() - .getRecipeList() - .stream() - .filter( - tRecipe -> !(tRecipe instanceof ShapelessRecipes) && !(tRecipe instanceof ShapelessOreRecipe) - && !(tRecipe instanceof IGT_CraftingRecipe)) - .filter(tRecipe -> { - try { - ItemStack tOutput = tRecipe.getRecipeOutput(); - if (tOutput.stackSize == 1 && tOutput.getMaxDamage() > 0 && tOutput.getMaxStackSize() == 1) { - return true; - } - } catch (Exception ignored) {} - return false; - }) - .collect(Collectors.toList()); - return getRecipeOutputs(bufferedRecipes, false, aRecipe); - } - - /** - * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for - * example - */ - public static List getRecipeOutputs(List aList, boolean aDeleteFromList, ItemStack... aRecipe) { - List rList = new ArrayList<>(); - if (aRecipe == null || Arrays.stream(aRecipe) - .noneMatch(Objects::nonNull)) return rList; - InventoryCrafting aCrafting = new InventoryCrafting(new Container() { - - @Override - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 3, 3); - for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]); - if (!aDeleteFromList) { - HashSet stacks = new HashSet<>(); - aList.stream() - .filter(tRecipe -> { - if (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe - || tRecipe instanceof IGT_CraftingRecipe) return false; - try { - return tRecipe.matches(aCrafting, DW); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - return false; - } - }) - .forEach(tRecipe -> stacks.add(tRecipe.getCraftingResult(aCrafting))); - rList = stacks.stream() - .filter( - tOutput -> tOutput.stackSize == 1 && tOutput.getMaxDamage() > 0 && tOutput.getMaxStackSize() == 1) - .collect(Collectors.toList()); - } else for (Iterator iterator = aList.iterator(); iterator.hasNext();) { - IRecipe tRecipe = iterator.next(); - boolean matched = false; - - try { - matched = tRecipe.matches(aCrafting, DW); - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - if (matched) { - ItemStack tOutput = tRecipe.getCraftingResult(aCrafting); - - if (tOutput == null || tOutput.stackSize <= 0) { - // Seriously, who would ever do that shit? - if (!GregTech_API.sPostloadFinished) throw new GT_ItsNotMyFaultException( - "Seems another Mod added a Crafting Recipe with null Output. Tell the Developer of said Mod to fix that."); - continue; - } - if (tOutput.stackSize != 1) continue; - if (tOutput.getMaxDamage() <= 0) continue; - if (tOutput.getMaxStackSize() != 1) continue; - if (tRecipe instanceof ShapelessRecipes) continue; - if (tRecipe instanceof ShapelessOreRecipe) continue; - if (tRecipe instanceof IGT_CraftingRecipe) continue; - rList.add(GT_Utility.copyOrNull(tOutput)); - iterator.remove(); - } - } - return rList; - } - - /** - * Used in my own Furnace. - */ - public static ItemStack getSmeltingOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) { - if (aInput == null || aInput.stackSize < 1) return null; - ItemStack rStack = GT_OreDictUnificator.get( - FurnaceRecipes.smelting() - .getSmeltingResult(aInput)); - - if (rStack != null && (aOutputSlot == null || (GT_Utility.areStacksEqual(rStack, aOutputSlot) - && rStack.stackSize + aOutputSlot.stackSize <= aOutputSlot.getMaxStackSize()))) { - if (aRemoveInput) aInput.stackSize--; - return rStack; - } - return null; - } - - /** - * Used in my own Machines. Decreases StackSize of the Input if wanted. - *

- * Checks also if there is enough Space in the Output Slots. - */ - public static ItemStack[] getMachineOutput(ItemStack aInput, Map aRecipeList, - boolean aRemoveInput, NBTTagCompound rRecipeMetaData, ItemStack... aOutputSlots) { - if (aOutputSlots == null || aOutputSlots.length == 0) return new ItemStack[0]; - if (aInput == null) return new ItemStack[aOutputSlots.length]; - try { - for (Entry tEntry : aRecipeList.entrySet()) { - if (tEntry.getKey() - .matches(aInput)) { - if (tEntry.getKey() - .getAmount() <= aInput.stackSize) { - ItemStack[] tList = tEntry.getValue().items.toArray(new ItemStack[0]); - if (tList.length == 0) break; - ItemStack[] rList = new ItemStack[aOutputSlots.length]; - rRecipeMetaData.setTag("return", tEntry.getValue().metadata); - for (byte i = 0; i < aOutputSlots.length && i < tList.length; i++) { - if (tList[i] != null) { - if (aOutputSlots[i] == null || (GT_Utility.areStacksEqual(tList[i], aOutputSlots[i]) - && tList[i].stackSize + aOutputSlots[i].stackSize - <= aOutputSlots[i].getMaxStackSize())) { - rList[i] = GT_Utility.copyOrNull(tList[i]); - } else { - return new ItemStack[aOutputSlots.length]; - } - } - } - - if (aRemoveInput) aInput.stackSize -= tEntry.getKey() - .getAmount(); - return rList; - } - break; - } - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - return new ItemStack[aOutputSlots.length]; - } - - /** - * Used in my own Recycler. - *

- * Only produces Scrap if aScrapChance == 0. aScrapChance is usually the random Number I give to the Function If you - * directly insert 0 as aScrapChance then you can check if its Recycler-Blacklisted or similar - */ - @Nullable - public static ItemStack getRecyclerOutput(ItemStack aInput, int aScrapChance) { - if (aInput == null || aScrapChance != 0) return null; - if (recyclerWhitelist == null) { - generateRecyclerCache(); - } - - if (recyclerWhitelist.isEmpty()) { - if (searchRecyclerCache(aInput, recyclerBlacklist)) { - return null; - } else { - return ItemList.IC2_Scrap.get(1); - } - } else { - if (searchRecyclerCache(aInput, recyclerWhitelist)) { - return ItemList.IC2_Scrap.get(1); - } else { - return null; - } - } - } - - private static void generateRecyclerCache() { - recyclerWhitelist = new HashSet<>(); - for (IRecipeInput input : ic2.api.recipe.Recipes.recyclerWhitelist) { - for (ItemStack stack : input.getInputs()) { - recyclerWhitelist.add(GT_Utility.ItemId.create(stack.getItem(), stack.getItemDamage(), null)); - } - } - recyclerBlacklist = new HashSet<>(); - for (IRecipeInput input : ic2.api.recipe.Recipes.recyclerBlacklist) { - for (ItemStack stack : input.getInputs()) { - recyclerBlacklist.add(GT_Utility.ItemId.create(stack.getItem(), stack.getItemDamage(), null)); - } - } - } - - private static boolean searchRecyclerCache(ItemStack stack, Set set) { - if (set.contains(GT_Utility.ItemId.createWithoutNBT(stack))) { - return true; - } - // ic2.api.recipe.RecipeInputItemStack#matches expects item with wildcard meta to accept arbitrary meta - return set.contains(GT_Utility.ItemId.createAsWildcard(stack)); - } - - /** - * For the Scrapboxinator - */ - public static ItemStack getRandomScrapboxDrop() { - return ic2.api.recipe.Recipes.scrapboxDrops.getDrop(ItemList.IC2_Scrapbox.get(1), false); - } - - /** - * Charges an Electric Item. Only if it's a valid Electric Item of course. This forces the Usage of proper Voltages - * (so not the transfer limits defined by the Items) unless you ignore the Transfer Limit. If aTier is - * Integer.MAX_VALUE it will ignore Tier based Limitations. - * - * @return the actually used Energy. - */ - public static int chargeElectricItem(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreLimit, - boolean aSimulate) { - try { - if (isElectricItem(aStack)) { - int tTier = ((ic2.api.item.IElectricItem) aStack.getItem()).getTier(aStack); - if (tTier < 0 || tTier == aTier || aTier == Integer.MAX_VALUE) { - if (!aIgnoreLimit && tTier >= 0) - aCharge = (int) Math.min(aCharge, V[Math.max(0, Math.min(V.length - 1, tTier))]); - if (aCharge > 0) { - int rCharge = (int) Math.max( - 0.0, - ic2.api.item.ElectricItem.manager.charge(aStack, aCharge, tTier, true, aSimulate)); - return rCharge + (rCharge * 4 > aTier ? aTier : 0); - } - } - } - } catch (Throwable e) { - /* Do nothing */ - } - return 0; - } - - /** - * Discharges an Electric Item. Only if it's a valid Electric Item for that of course. This forces the Usage of - * proper Voltages (so not the transfer limits defined by the Items) unless you ignore the Transfer Limit. If aTier - * is Integer.MAX_VALUE it will ignore Tier based Limitations. - * - * @return the Energy got from the Item. - */ - public static int dischargeElectricItem(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreLimit, - boolean aSimulate, boolean aIgnoreDischargability) { - try { - // if (isElectricItem(aStack) && (aIgnoreDischargability || - // ((ic2.api.item.IElectricItem)aStack.getItem()).canProvideEnergy(aStack))) { - if (isElectricItem(aStack)) { - int tTier = ((ic2.api.item.IElectricItem) aStack.getItem()).getTier(aStack); - if (tTier < 0 || tTier == aTier || aTier == Integer.MAX_VALUE) { - if (!aIgnoreLimit && tTier >= 0) aCharge = (int) Math.min( - aCharge, - V[Math.max(0, Math.min(V.length - 1, tTier))] + B[Math.max(0, Math.min(V.length - 1, tTier))]); - if (aCharge > 0) { - int rCharge = (int) Math.max( - 0, - ic2.api.item.ElectricItem.manager.discharge( - aStack, - aCharge + (aCharge * 4 > aTier ? aTier : 0), - tTier, - true, - !aIgnoreDischargability, - aSimulate)); - return rCharge - (rCharge * 4 > aTier ? aTier : 0); - } - } - } - } catch (Throwable e) { - /* Do nothing */ - } - return 0; - } - - /** - * Uses an Electric Item. Only if it's a valid Electric Item for that of course. - * - * @return if the action was successful - */ - public static boolean canUseElectricItem(ItemStack aStack, int aCharge) { - try { - if (isElectricItem(aStack)) { - return ic2.api.item.ElectricItem.manager.canUse(aStack, aCharge); - } - } catch (Throwable e) { - /* Do nothing */ - } - return false; - } - - /** - * Uses an Electric Item. Only if it's a valid Electric Item for that of course. - * - * @return if the action was successful - */ - public static boolean useElectricItem(ItemStack aStack, int aCharge, EntityPlayer aPlayer) { - try { - if (isElectricItem(aStack)) { - ic2.api.item.ElectricItem.manager.use(aStack, 0, aPlayer); - if (ic2.api.item.ElectricItem.manager.canUse(aStack, aCharge)) { - return ic2.api.item.ElectricItem.manager.use(aStack, aCharge, aPlayer); - } - } - } catch (Throwable e) { - /* Do nothing */ - } - return false; - } - - /** - * Uses an Item. Tries to discharge in case of Electric Items - */ - public static boolean damageOrDechargeItem(ItemStack aStack, int aDamage, int aDecharge, EntityLivingBase aPlayer) { - if (GT_Utility.isStackInvalid(aStack) || (aStack.getMaxStackSize() <= 1 && aStack.stackSize > 1)) return false; - if (aPlayer instanceof EntityPlayer && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) return true; - if (aStack.getItem() instanceof IDamagableItem) { - return ((IDamagableItem) aStack.getItem()).doDamageToItem(aStack, aDamage); - } else if (GT_ModHandler.isElectricItem(aStack)) { - if (canUseElectricItem(aStack, aDecharge)) { - if (aPlayer instanceof EntityPlayer) { - return GT_ModHandler.useElectricItem(aStack, aDecharge, (EntityPlayer) aPlayer); - } - return GT_ModHandler.dischargeElectricItem(aStack, aDecharge, Integer.MAX_VALUE, true, false, true) - >= aDecharge; - } - } else if (aStack.getItem() - .isDamageable()) { - if (aPlayer == null) { - aStack.setItemDamage(aStack.getItemDamage() + aDamage); - } else { - aStack.damageItem(aDamage, aPlayer); - } - if (aStack.getItemDamage() >= aStack.getMaxDamage()) { - aStack.setItemDamage(aStack.getMaxDamage() + 1); - ItemStack tStack = GT_Utility.getContainerItem(aStack, true); - if (tStack != null) { - aStack.func_150996_a(tStack.getItem()); - aStack.setItemDamage(tStack.getItemDamage()); - aStack.stackSize = tStack.stackSize; - aStack.setTagCompound(tStack.getTagCompound()); - } else if (aStack.stackSize > 0) { - aStack.stackSize--; - } - } - return true; - } - return false; - } - - /** - * Uses a Soldering Iron from player or external inventory - */ - public static boolean useSolderingIron(ItemStack aStack, EntityLivingBase aPlayer, IInventory aExternalInventory) { - if (aPlayer == null || aStack == null) return false; - if (GT_Utility.isStackInList(aStack, GregTech_API.sSolderingToolList)) { - if (aPlayer instanceof EntityPlayer tPlayer) { - if (tPlayer.capabilities.isCreativeMode) return true; - if (isElectricItem(aStack) && ic2.api.item.ElectricItem.manager.getCharge(aStack) > 1000.0d) { - if (consumeSolderingMaterial(tPlayer) - || (aExternalInventory != null && consumeSolderingMaterial(aExternalInventory))) { - if (canUseElectricItem(aStack, 10000)) { - return GT_ModHandler.useElectricItem(aStack, 10000, (EntityPlayer) aPlayer); - } - GT_ModHandler.useElectricItem( - aStack, - (int) ic2.api.item.ElectricItem.manager.getCharge(aStack), - (EntityPlayer) aPlayer); - return false; - } else { - GT_Utility.sendChatToPlayer( - (EntityPlayer) aPlayer, - GT_Utility.trans("094.1", "Not enough soldering material!")); - } - } - } else { - damageOrDechargeItem(aStack, 1, 1000, aPlayer); - return true; - } - } - return false; - } - - public static boolean useSolderingIron(ItemStack aStack, EntityLivingBase aPlayer) { - return useSolderingIron(aStack, aPlayer, null); - } - - public static boolean consumeSolderingMaterial(EntityPlayer aPlayer) { - if (aPlayer.capabilities.isCreativeMode) return true; - IInventory tInventory = aPlayer.inventory; - if (consumeSolderingMaterial(tInventory)) { - if (aPlayer.inventoryContainer != null) { - aPlayer.inventoryContainer.detectAndSendChanges(); - } - return true; - } - for (int i = 0; i < tInventory.getSizeInventory(); i++) { - ItemStack tStack = tInventory.getStackInSlot(i); - if (tStack != null && tStack.getItem() instanceof ItemToolbox) { - IInventory tToolboxInventory = ((ItemToolbox) tStack.getItem()).getInventory(aPlayer, tStack); - if (consumeSolderingMaterial(tToolboxInventory)) { - tInventory.markDirty(); - if (aPlayer.inventoryContainer != null) { - aPlayer.inventoryContainer.detectAndSendChanges(); - } - return true; - } - } - } - return false; - } - - /** - * Consumes soldering material from given inventory - */ - public static boolean consumeSolderingMaterial(IInventory aInventory) { - for (int i = 0; i < aInventory.getSizeInventory(); i++) { - ItemStack tStack = aInventory.getStackInSlot(i); - if (GT_Utility.isStackInList(tStack, GregTech_API.sSolderingMetalList)) { - if (tStack.stackSize < 1) return false; - if (tStack.stackSize == 1) { - tStack = null; - } else { - tStack.stackSize--; - } - aInventory.setInventorySlotContents(i, tStack); - aInventory.markDirty(); - return true; - } - } - return false; - } - - /** - * Is this an electric Item, which can charge other Items? - */ - public static boolean isChargerItem(ItemStack aStack) { - try { - if (isElectricItem(aStack)) { - return ((ic2.api.item.IElectricItem) aStack.getItem()).canProvideEnergy(aStack); - } - } catch (Throwable e) { - /* Do nothing */ - } - return false; - } - - /** - * Is this an electric Item? - */ - public static boolean isElectricItem(ItemStack aStack) { - try { - return aStack != null && aStack.getItem() instanceof ic2.api.item.IElectricItem - && ((IElectricItem) aStack.getItem()).getTier(aStack) < Integer.MAX_VALUE; - } catch (Throwable e) { - /* Do nothing */ - } - return false; - } - - public static boolean isElectricItem(ItemStack aStack, byte aTier) { - try { - return aStack != null && aStack.getItem() instanceof ic2.api.item.IElectricItem - && ((IElectricItem) aStack.getItem()).getTier(aStack) == aTier; - } catch (Throwable e) { - /* Do nothing */ - } - return false; - } - - /** - * Returns the current charge and maximum charge of an ItemStack. - * - * @param aStack Any ItemStack. - * @return Optional.empty() if the stack is null or not an electric item, or an Optional containing a payload of an - * array containing [ current_charge, maximum_charge ] on success. - */ - public static Optional getElectricItemCharge(ItemStack aStack) { - if (aStack == null || !isElectricItem(aStack)) { - return Optional.empty(); - } - - final Item item = aStack.getItem(); - - if (item instanceof final GT_MetaBase_Item metaBaseItem) { - final Long[] stats = metaBaseItem.getElectricStats(aStack); - if (stats != null && stats.length > 0) { - return Optional.of(new Long[] { metaBaseItem.getRealCharge(aStack), stats[0] }); - } - - } else if (item instanceof final IElectricItem ic2ElectricItem) { - return Optional.of( - new Long[] { (long) ic2.api.item.ElectricItem.manager.getCharge(aStack), - (long) ic2ElectricItem.getMaxCharge(aStack) }); - } - - return Optional.empty(); - } - - /** - * Allow item to be inserted into ic2 toolbox - */ - public static void registerBoxableItemToToolBox(ItemStack aStack) { - if (aStack != null) { - try { - ic2.api.item.ItemWrapper.registerBoxable(aStack.getItem(), (IBoxable) sBoxableWrapper); - } catch (Throwable ignored) { - /* Do nothing */ - } - sBoxableItems.add(new GT_ItemStack(aStack)); - } - } - - public static int getCapsuleCellContainerCountMultipliedWithStackSize(ItemStack... aStacks) { - int rAmount = 0; - for (ItemStack tStack : aStacks) - if (tStack != null) rAmount += getCapsuleCellContainerCount(tStack) * tStack.stackSize; - return rAmount; - } - - public static int getCapsuleCellContainerCount(ItemStack aStack) { - if (aStack == null) return 0; - - if (GT_Utility.areStacksEqual(GT_Utility.getContainerForFilledItem(aStack, true), ItemList.Cell_Empty.get(1))) { - return 1; - } - - if (GT_Utility.areStacksEqual(aStack, getIC2Item("waterCell", 1, W))) { - return 1; - } - - for (OrePrefixes cellType : OrePrefixes.CELL_TYPES) { - if (cellType.contains(aStack)) { - return 1; - } - } - - return 0; - } - - public static class RecipeBits { - - /** - * Mirrors the Recipe - */ - public static long MIRRORED = B[0]; - /** - * Buffers the Recipe for later addition. This makes things more efficient. - */ - public static long BUFFERED = B[1]; - /** - * This is a special Tag I used for crafting Coins up and down. - */ - public static long KEEPNBT = B[2]; - /** - * Makes the Recipe Reverse Craftable in the Disassembler. - */ - public static long DISMANTLEABLE = B[3]; - /** - * Prevents the Recipe from accidentally getting removed by my own Handlers. - */ - public static long NOT_REMOVABLE = B[4]; - /** - * Reverses the Output of the Recipe for smelting and pulverising. - */ - public static long REVERSIBLE = B[5]; - /** - * Removes all Recipes with the same Output Item regardless of NBT, unless another Recipe Deletion Bit is added - * too. - */ - public static long DELETE_ALL_OTHER_RECIPES = B[6]; - /** - * Removes all Recipes with the same Output Item limited to the same NBT. - */ - public static long DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT = B[7]; - /** - * Removes all Recipes with the same Output Item limited to Shaped Recipes. - */ - public static long DELETE_ALL_OTHER_SHAPED_RECIPES = B[8]; - /** - * Removes all Recipes with the same Output Item limited to native Recipe Handlers. - */ - public static long DELETE_ALL_OTHER_NATIVE_RECIPES = B[9]; - /** - * Disables the check for colliding Recipes. - */ - public static long DO_NOT_CHECK_FOR_COLLISIONS = B[10]; - /** - * Only adds the Recipe if there is another Recipe having that Output - */ - public static long ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT = B[11]; - /** - * Only adds the Recipe if it has an Output - */ - public static long ONLY_ADD_IF_RESULT_IS_NOT_NULL = B[12]; - /** - * Don't remove shapeless recipes with this output - */ - public static long DONT_REMOVE_SHAPELESS = B[13]; - } -} diff --git a/src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java b/src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java deleted file mode 100644 index 2d6712788a..0000000000 --- a/src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java +++ /dev/null @@ -1,735 +0,0 @@ -package gregtech.api.util; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; - -import com.google.common.collect.Multimaps; -import com.google.common.collect.SetMultimap; -import com.gtnewhorizon.structurelib.StructureLibAPI; - -/** - * This makes it easier to build multi tooltips, with a standardized format.
- * Info section order should be:
- * addMachineType
- * addInfo, for what it does, special notes, etc.
- * addSeparator, if you need it
- * addPollutionAmount
- *
- * Structure order should be:
- * beginStructureBlock
- * addController
- * addCasingInfo
- * addOtherStructurePart, for secondary structure block info (pipes, coils, etc)
- * addEnergyHatch/addDynamoHatch
- * addMaintenanceHatch
- * addMufflerHatch
- * addInputBus/addInputHatch/addOutputBus/addOutputHatch, in that order
- * Use addStructureInfo for any comments on nonstandard structure info wherever needed
- * toolTipFinisher goes at the very end
- *
- * Originally created by kekzdealer - */ -public class GT_Multiblock_Tooltip_Builder { - - private static final String TAB = " "; - private static final String COLON = ": "; - private static final String SEPARATOR = ", "; - - private final List iLines; - private final List sLines; - private final List hLines; - private final SetMultimap hBlocks; - - private String[] iArray; - private String[] sArray; - private String[] hArray; - - // Localized tooltips - private static final String TT_machineType = StatCollector.translateToLocal("GT5U.MBTT.MachineType"); - private static final String TT_dimensions = StatCollector.translateToLocal("GT5U.MBTT.Dimensions"); - private static final String TT_hollow = StatCollector.translateToLocal("GT5U.MBTT.Hollow"); - private static final String TT_structure = StatCollector.translateToLocal("GT5U.MBTT.Structure"); - private static final String TT_controller = StatCollector.translateToLocal("GT5U.MBTT.Controller"); - private static final String TT_minimum = StatCollector.translateToLocal("GT5U.MBTT.Minimum"); - private static final String TT_tiered = StatCollector.translateToLocal("GT5U.MBTT.Tiered"); - private static final String TT_maintenancehatch = StatCollector.translateToLocal("GT5U.MBTT.MaintenanceHatch"); - private static final String TT_energyhatch = StatCollector.translateToLocal("GT5U.MBTT.EnergyHatch"); - private static final String TT_dynamohatch = StatCollector.translateToLocal("GT5U.MBTT.DynamoHatch"); - private static final String TT_mufflerhatch = StatCollector.translateToLocal("GT5U.MBTT.MufflerHatch"); - private static final String TT_inputbus = StatCollector.translateToLocal("GT5U.MBTT.InputBus"); - private static final String TT_inputhatch = StatCollector.translateToLocal("GT5U.MBTT.InputHatch"); - private static final String TT_outputbus = StatCollector.translateToLocal("GT5U.MBTT.OutputBus"); - private static final String TT_outputhatch = StatCollector.translateToLocal("GT5U.MBTT.OutputHatch"); - private static final String TT_causes = StatCollector.translateToLocal("GT5U.MBTT.Causes"); - private static final String TT_pps = StatCollector.translateToLocal("GT5U.MBTT.PPS"); - private static final String TT_hold = StatCollector.translateToLocal("GT5U.MBTT.Hold"); - private static final String TT_todisplay = StatCollector.translateToLocal("GT5U.MBTT.Display"); - private static final String TT_structurehint = StatCollector.translateToLocal("GT5U.MBTT.StructureHint"); - private static final String TT_mod = StatCollector.translateToLocal("GT5U.MBTT.Mod"); - private static final String TT_air = StatCollector.translateToLocal("GT5U.MBTT.Air"); - private static final String[] TT_dots = IntStream.range(0, 16) - .mapToObj(i -> StatCollector.translateToLocal("structurelib.blockhint." + i + ".name")) - .toArray(String[]::new); - - public GT_Multiblock_Tooltip_Builder() { - iLines = new LinkedList<>(); - sLines = new LinkedList<>(); - hLines = new LinkedList<>(); - hBlocks = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); - hBlocks.put(StructureLibAPI.HINT_BLOCK_META_AIR, TT_air); - } - - /** - * Add a line telling you what the machine type is. Usually, this will be the name of a SB version.
- * Machine Type: machine - * - * @param machine Name of the machine type - * - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addMachineType(String machine) { - iLines.add(TT_machineType + COLON + EnumChatFormatting.YELLOW + machine + EnumChatFormatting.RESET); - return this; - } - - /** - * Add a basic line of information about this structure - * - * @param info The line to be added. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addInfo(String info) { - iLines.add(info); - return this; - } - - /** - * Add a number of basic lines of information about this structure - * - * @param infoStrings The lines to be added. - * @return Instance this method was called on. - */ - - public GT_Multiblock_Tooltip_Builder addInfoAll(String... infoStrings) { - for (String str : infoStrings) { - iLines.add(str); - } - return this; - } - - /** - * Add a separator line like this:
- * ----------------------------------------- - * - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addSeparator() { - iLines.add("-----------------------------------------"); - return this; - } - - /** - * Add a line telling how much this machine pollutes. - * - * @param pollution Amount of pollution per second when active - * - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addPollutionAmount(int pollution) { - iLines.add( - TT_causes + COLON + EnumChatFormatting.DARK_PURPLE + pollution + " " + EnumChatFormatting.GRAY + TT_pps); - return this; - } - - /** - * Begin adding structural information by adding a line about the structure's dimensions and then inserting a - * "Structure:" line. - * - * @param w Structure width. - * @param h Structure height. - * @param l Structure depth/length. - * @param hollow T/F, adds a (hollow) comment if true - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder beginStructureBlock(int w, int h, int l, boolean hollow) { - sLines.add( - EnumChatFormatting.WHITE + TT_dimensions - + COLON - + EnumChatFormatting.GOLD - + w - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + h - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + l - + EnumChatFormatting.GRAY - + " (" - + EnumChatFormatting.GOLD - + "W" - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + "H" - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + "L" - + EnumChatFormatting.GRAY - + ") " - + EnumChatFormatting.RED - + (hollow ? EnumChatFormatting.RED + TT_hollow : "")); - sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON); - return this; - } - - /** - * Begin adding structural information by adding a line about the structure's dimensions
- * and then inserting a "Structure:" line. Variable version displays min and max - * - * @param wmin Structure min width. - * @param wmax Structure max width. - * @param hmin Structure min height. - * @param hmax Structure max height. - * @param lmin Structure min depth/length. - * @param lmax Structure max depth/length. - * @param hollow T/F, adds a (hollow) comment if true - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder beginVariableStructureBlock(int wmin, int wmax, int hmin, int hmax, int lmin, - int lmax, boolean hollow) { - sLines.add( - EnumChatFormatting.WHITE + TT_dimensions - + COLON - + EnumChatFormatting.GOLD - + wmin - + (wmin != wmax ? "-" + wmax : "") - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + hmin - + (hmin != hmax ? "-" + hmax : "") - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + lmin - + (lmin != lmax ? "-" + lmax : "") - + EnumChatFormatting.GRAY - + " (" - + EnumChatFormatting.GOLD - + "W" - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + "H" - + EnumChatFormatting.GRAY - + "x" - + EnumChatFormatting.GOLD - + "L" - + EnumChatFormatting.GRAY - + ") " - + (hollow ? EnumChatFormatting.RED + TT_hollow : "")); - sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Controller: info - * - * @param info Positional information. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addController(String info) { - sLines.add(TAB + EnumChatFormatting.WHITE + TT_controller + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)minCountx casingName (minimum) (tiered) - * - * @param casingName Name of the Casing. - * @param minCount Minimum needed for valid structure check. - * @return Instance this method was called on. - * - * @deprecated Replaced by {@link #addCasingInfoMin(String, int, boolean)} - * - */ - @Deprecated - public GT_Multiblock_Tooltip_Builder addCasingInfo(String casingName, int minCount) { - return addCasingInfoMin(casingName, minCount, false); - } - - /** - * Add a line of information about the structure:
- * (indent)countx casingName (tiered) - * - * @param casingName Name of the Casing. - * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addCasingInfoExactly(String casingName, int count, boolean isTiered) { - return addCasingInfoExactlyColored( - casingName, - EnumChatFormatting.GRAY, - count, - EnumChatFormatting.GOLD, - isTiered); - } - - /** - * Add a line of information about the structure:
- * (indent)countx casingName (tiered) - * - * @param casingName Name of the Casing. - * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) - * @param countColor Color of the casing count text - * @param textColor Color of the casing name text - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addCasingInfoExactlyColored(String casingName, EnumChatFormatting textColor, - int count, EnumChatFormatting countColor, boolean isTiered) { - sLines.add( - countColor + TAB - + count - + "x " - + EnumChatFormatting.RESET - + textColor - + casingName - + (isTiered ? " " + TT_tiered : "")); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)minCountx casingName (minimum) (tiered) - * - * @param casingName Name of the Casing. - * @param minCount Minimum needed for valid structure check. - * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addCasingInfoMin(String casingName, int minCount, boolean isTiered) { - return addCasingInfoMinColored( - casingName, - EnumChatFormatting.GRAY, - minCount, - EnumChatFormatting.GOLD, - isTiered); - } - - /** - * Add a line of information about the structure:
- * (indent)minCountx casingName (minimum) (tiered) - * - * @param casingName Name of the Casing. - * @param minCount Minimum needed for valid structure check. - * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) - * @param countColor Color of the casing count text - * @param textColor Color of the casing name text - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addCasingInfoMinColored(String casingName, EnumChatFormatting textColor, - int minCount, EnumChatFormatting countColor, boolean isTiered) { - sLines.add( - countColor + TAB - + minCount - + "x " - + EnumChatFormatting.RESET - + textColor - + casingName - + " " - + TT_minimum - + (isTiered ? " " + TT_tiered : "")); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)minCountx - maxCountx casingName (minimum) (tiered) - * - * @param casingName Name of the Casing. - * @param minCount Minimum needed for valid structure check. - * @param maxCount Maximum needed for valid structure check. - * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addCasingInfoRange(String casingName, int minCount, int maxCount, - boolean isTiered) { - return addCasingInfoRangeColored( - casingName, - EnumChatFormatting.GRAY, - minCount, - maxCount, - EnumChatFormatting.GOLD, - isTiered); - } - - /** - * Add a line of information about the structure:
- * (indent)minCountx - maxCountx casingName (minimum) (tiered) - * - * @param casingName Name of the Casing. - * @param minCount Minimum needed for valid structure check. - * @param maxCount Maximum needed for valid structure check. - * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) - * @param countColor Color of the casing count text - * @param textColor Color of the casing name text - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addCasingInfoRangeColored(String casingName, EnumChatFormatting textColor, - int minCount, int maxCount, EnumChatFormatting countColor, boolean isTiered) { - sLines.add( - countColor + TAB - + minCount - + "x" - + EnumChatFormatting.GRAY - + " - " - + countColor - + maxCount - + "x " - + EnumChatFormatting.RESET - + textColor - + casingName - + (isTiered ? " " + TT_tiered : "")); - return this; - } - - /** - * Use this method to add a structural part that isn't covered by the other methods.
- * (indent)name: info - * - * @param name Name of the hatch or other component. - * @param info Positional information. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addOtherStructurePart(String name, String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Maintenance Hatch: info - * - * @param info Positional information. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addMaintenanceHatch(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Muffler Hatch: info - * - * @param info Location where the hatch goes - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addMufflerHatch(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Energy Hatch: info - * - * @param info Positional information. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addEnergyHatch(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Dynamo Hatch: info - * - * @param info Positional information. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addDynamoHatch(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Input Bus: info - * - * @param info Location where the bus goes - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addInputBus(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Input Hatch: info - * - * @param info Location where the hatch goes - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addInputHatch(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Output Bus: info - * - * @param info Location where the bus goes - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addOutputBus(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Output Hatch: info - * - * @param info Location where the bus goes - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addOutputHatch(String info) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info); - return this; - } - - /** - * Use this method to add a structural part that isn't covered by the other methods.
- * (indent)name: info - * - * @param name Name of the hatch or other component. - * @param info Positional information. - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addOtherStructurePart(String name, String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, name); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Maintenance Hatch: info - * - * @param info Positional information. - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addMaintenanceHatch(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_maintenancehatch); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Muffler Hatch: info - * - * @param info Location where the hatch goes - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addMufflerHatch(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_mufflerhatch); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Energy Hatch: info - * - * @param info Positional information. - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addEnergyHatch(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_energyhatch); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Dynamo Hatch: info - * - * @param info Positional information. - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addDynamoHatch(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_dynamohatch); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Input Bus: info - * - * @param info Location where the bus goes - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addInputBus(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_inputbus); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Input Hatch: info - * - * @param info Location where the hatch goes - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addInputHatch(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_inputhatch); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Output Bus: info - * - * @param info Location where the bus goes - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addOutputBus(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_outputbus); - return this; - } - - /** - * Add a line of information about the structure:
- * (indent)Output Hatch: info - * - * @param info Location where the bus goes - * @param dots The valid locations for this part when asked to display hints - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addOutputHatch(String info, int... dots) { - sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info); - for (int dot : dots) hBlocks.put(dot, TT_outputhatch); - return this; - } - - /** - * Use this method to add non-standard structural info.
- * (indent)info - * - * @param info The line to be added. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addStructureInfo(String info) { - sLines.add(TAB + info); - return this; - } - - /** - * Use this method to add non-standard structural info.
- * (indent)info - * - * @param channel the name of subchannel - * @param purpose the purpose of subchannel - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addSubChannelUsage(String channel, String purpose) { - sLines.add(TAB + StatCollector.translateToLocalFormatted("GT5U.MBTT.subchannel", channel, purpose)); - return this; - } - - /** - * Use this method to add non-standard structural hint. This info will appear before the standard structural hint. - * - * @param info The line to be added. This should be an entry into minecraft's localization system. - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addStructureHint(String info) { - hLines.add(StatCollector.translateToLocal(info)); - return this; - } - - /** - * Use this method to add an entry to standard structural hint without creating a corresponding line in structure - * information - * - * @param name The name of block This should be an entry into minecraft's localization system. - * @param dots Possible locations of this block - * @return Instance this method was called on. - */ - public GT_Multiblock_Tooltip_Builder addStructureHint(String name, int... dots) { - for (int dot : dots) hBlocks.put(dot, StatCollector.translateToLocal(name)); - return this; - } - - /** - * Call at the very end.
- * Adds a final line with the mod name and information on how to display the structure guidelines.
- * Ends the building process. - * - * @param mod Name of the mod that adds this multiblock machine - */ - public GT_Multiblock_Tooltip_Builder toolTipFinisher(String mod) { - iLines.add( - TT_hold + " " - + EnumChatFormatting.BOLD - + "[LSHIFT]" - + EnumChatFormatting.RESET - + EnumChatFormatting.GRAY - + " " - + TT_todisplay); - iLines.add(TT_mod + COLON + EnumChatFormatting.GREEN + mod + EnumChatFormatting.GRAY); - hLines.add(TT_structurehint); - iArray = iLines.toArray(new String[0]); - sArray = sLines.toArray(new String[0]); - // e.getKey() - 1 because 1 dot is meta 0. - hArray = Stream.concat( - hLines.stream(), - hBlocks.asMap() - .entrySet() - .stream() - .map(e -> TT_dots[e.getKey() - 1] + COLON + String.join(SEPARATOR, e.getValue()))) - .toArray(String[]::new); - return this; - } - - public String[] getInformation() { - return iArray; - } - - public String[] getStructureInformation() { - return sArray; - } - - public String[] getStructureHint() { - return hArray; - } -} diff --git a/src/main/java/gregtech/api/util/GT_MusicSystem.java b/src/main/java/gregtech/api/util/GT_MusicSystem.java deleted file mode 100644 index 7c0ec929e9..0000000000 --- a/src/main/java/gregtech/api/util/GT_MusicSystem.java +++ /dev/null @@ -1,667 +0,0 @@ -package gregtech.api.util; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; -import java.util.TreeMap; -import java.util.UUID; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.SoundEventAccessorComposite; -import net.minecraft.client.audio.SoundRegistry; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemRecord; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.jetbrains.annotations.ApiStatus; -import org.joml.Vector4i; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.jcraft.jorbis.VorbisFile; - -import baubles.api.BaublesApi; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.network.ByteBufUtils; -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; -import gregtech.api.net.GT_Packet_MusicSystemData; -import gregtech.client.ElectricJukeboxSound; -import gregtech.common.items.GT_WirelessHeadphones; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_BetterJukebox; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; - -/** - * A system that keeps track of jukebox music tracks playing in different locations. - * Compared to vanilla jukebox handling, this allows music to resume playing after reloading the chunk the jukeboxes are - * in. - * It also allows the headphone item to modify the hearing range of a given disc, including other dimensions. - *

- * Vector4i coordinates point to X,Y,Z,Dimension of the source - * - * @author eigenraven - */ -public final class GT_MusicSystem { - - private GT_MusicSystem() {} - - public static final class MusicSource { - - /** Flag keeping track of when the data of this source needs to be sent to clients again */ - public boolean modified; - public final UUID sourceID; - /** Currently playing track */ - public ResourceLocation currentRecord; - /** Headphone range */ - public GT_MetaTileEntity_BetterJukebox.HeadphoneLimit headphoneLimit; - /** - * {@link System#currentTimeMillis()} at the time this record started playing, in server time - */ - public long startedPlayingAtMs; - /** Time the record was playing for at the time it was serialized. */ - public long playingForMs; - /** The origin of this source used for wireless headphone range calculations */ - public final Vector4i originPosition = new Vector4i(); - /** Number of blocks from {@link MusicSource#originPosition} the headphones can work */ - public int headphoneBlockRange; - /** Densely packed parameters for each "emitter" associated with the source, for fast iteration */ - public int[] emitterParameters; // [{x,y,z,dim,volume}, {x, ...}, {x, ...}, ...] - /** Offsets into the parameters array */ - public static final int EMITTER_X = 0; - /** Offsets into the parameters array */ - public static final int EMITTER_Y = 1; - /** Offsets into the parameters array */ - public static final int EMITTER_Z = 2; - /** Offsets into the parameters array */ - public static final int EMITTER_DIMENSION = 3; - /** 100 times the floating point "volume" used by the sound system for range calculations */ - public static final int EMITTER_VOLUME_X_100 = 4; - /** Iteration stride for packed emitter parameters */ - public static final int EMITTER_STRIDE = EMITTER_VOLUME_X_100 + 1; - - public MusicSource(UUID sourceID) { - this.sourceID = sourceID; - } - - public void resizeEmitterArray(int count) { - int len = count * EMITTER_STRIDE; - if (emitterParameters == null || emitterParameters.length != len) { - if (emitterParameters == null) { - emitterParameters = new int[len]; - } else { - emitterParameters = Arrays.copyOf(emitterParameters, len); - } - modified = true; - } - } - - public void setEmitter(int index, Vector4i position, float volume) { - int arrIndex = index * EMITTER_STRIDE; - if (arrIndex < 0 || arrIndex >= emitterParameters.length) { - throw new IndexOutOfBoundsException( - "Trying to access emitter with index " + index - + " in an array of " - + emitterParameters.length / EMITTER_STRIDE); - } - - if (emitterParameters[arrIndex + EMITTER_X] != position.x) { - modified = true; - emitterParameters[arrIndex + EMITTER_X] = position.x; - } - if (emitterParameters[arrIndex + EMITTER_Y] != position.y) { - modified = true; - emitterParameters[arrIndex + EMITTER_Y] = position.y; - } - if (emitterParameters[arrIndex + EMITTER_Z] != position.z) { - modified = true; - emitterParameters[arrIndex + EMITTER_Z] = position.z; - } - if (emitterParameters[arrIndex + EMITTER_DIMENSION] != position.w) { - modified = true; - emitterParameters[arrIndex + EMITTER_DIMENSION] = position.w; - } - final int intVolume = (int) (volume * 100.0f); - if (emitterParameters[arrIndex + EMITTER_VOLUME_X_100] != intVolume) { - modified = true; - emitterParameters[arrIndex + EMITTER_VOLUME_X_100] = intVolume; - } - } - - /** x squared */ - private static int sq(int x) { - return x * x; - } - - /** @return Index of closest emitter in range, or -1 if none is nearby. */ - public int closestEmitter(int x, int y, int z, int dim) { - int closest = -1; - int closestDistanceSq = Integer.MAX_VALUE; - final int emittersCount = emitterParameters.length / EMITTER_STRIDE; - for (int i = 0; i < emittersCount; i++) { - final int offset = i * EMITTER_STRIDE; - final int eDim = emitterParameters[offset + EMITTER_DIMENSION]; - if (eDim != dim) { - continue; - } - final int eX = emitterParameters[offset + EMITTER_X]; - final int eY = emitterParameters[offset + EMITTER_Y]; - final int eZ = emitterParameters[offset + EMITTER_Z]; - final int distanceSq = sq(x - eX) + sq(y - eY) + sq(z - eZ); - if (distanceSq < closestDistanceSq) { - closestDistanceSq = distanceSq; - closest = i; - } - } - return closest; - } - - public boolean inHeadphoneRange(int x, int y, int z, int dim) { - return switch (headphoneLimit) { - case BETWEEN_DIMENSIONS -> true; - case INSIDE_DIMENSION -> dim == originPosition.w; - case BLOCK_RANGE -> dim == originPosition.w - && originPosition.distanceSquared(x, y, z, dim) <= sq(headphoneBlockRange); - }; - } - - public void encode(final ByteBuf target) { - target.writeLong(sourceID.getMostSignificantBits()); - target.writeLong(sourceID.getLeastSignificantBits()); - if (currentRecord != null) { - final int duration = getMusicRecordDurations().getOrDefault(currentRecord, Integer.MAX_VALUE); - if (playingForMs >= duration) { - // Record already finished playing, let's not send it to the client anymore. - target.writeBoolean(false); - } else { - target.writeBoolean(true); - ByteBufUtils.writeUTF8String(target, currentRecord.getResourceDomain()); - ByteBufUtils.writeUTF8String(target, currentRecord.getResourcePath()); - } - } else { - target.writeBoolean(false); - } - target.writeByte((byte) headphoneLimit.ordinal()); - ByteBufUtils.writeVarInt(target, headphoneBlockRange, 5); - target.writeLong(startedPlayingAtMs); - target.writeLong(playingForMs); - ByteBufUtils.writeVarInt(target, originPosition.x, 5); - ByteBufUtils.writeVarInt(target, originPosition.y, 5); - ByteBufUtils.writeVarInt(target, originPosition.z, 5); - ByteBufUtils.writeVarInt(target, originPosition.w, 5); - ByteBufUtils.writeVarInt(target, emitterParameters.length, 5); - for (int emitterParameter : emitterParameters) { - ByteBufUtils.writeVarInt(target, emitterParameter, 5); - } - } - - public static MusicSource decode(final ByteBuf bytes) { - final long uuidMsb = bytes.readLong(); - final long uuidLsb = bytes.readLong(); - final MusicSource source = new MusicSource(new UUID(uuidMsb, uuidLsb)); - final boolean hasRecord = bytes.readBoolean(); - if (hasRecord) { - final String domain = ByteBufUtils.readUTF8String(bytes); - final String path = ByteBufUtils.readUTF8String(bytes); - source.currentRecord = new ResourceLocation(domain, path); - } - source.headphoneLimit = GT_MetaTileEntity_BetterJukebox.HeadphoneLimit.ENTRIES.get(bytes.readByte()); - source.headphoneBlockRange = ByteBufUtils.readVarInt(bytes, 5); - source.startedPlayingAtMs = bytes.readLong(); - source.playingForMs = bytes.readLong(); - final int originX = ByteBufUtils.readVarInt(bytes, 5); - final int originY = ByteBufUtils.readVarInt(bytes, 5); - final int originZ = ByteBufUtils.readVarInt(bytes, 5); - final int originW = ByteBufUtils.readVarInt(bytes, 5); - source.originPosition.set(originX, originY, originZ, originW); - final int emittersLength = ByteBufUtils.readVarInt(bytes, 5); - source.emitterParameters = new int[emittersLength]; - for (int i = 0; i < emittersLength; i++) { - source.emitterParameters[i] = ByteBufUtils.readVarInt(bytes, 5); - } - - return source; - } - - public void setRecord(final ResourceLocation record) { - setRecord(record, 0); - } - - public void setRecord(final ResourceLocation record, long seekOffset) { - modified = true; - currentRecord = record; - playingForMs = seekOffset; - startedPlayingAtMs = System.currentTimeMillis() - seekOffset; - } - } - - public static final class ServerSystem { - - static final Object2ObjectOpenHashMap musicSources = new Object2ObjectOpenHashMap<>(32); - static boolean musicSourcesDirty = false; - - // Everything is synchronized to allow calling into here from the client when singleplayer synchronization is - // needed. - - public static synchronized MusicSource registerOrGetMusicSource(UUID uuid) { - return musicSources.computeIfAbsent(uuid, (UUID id) -> { - musicSourcesDirty = true; - return new MusicSource(id); - }); - } - - public static synchronized void removeMusicSource(UUID uuid) { - musicSources.remove(uuid); - musicSourcesDirty = true; - } - - public static synchronized void reset() { - musicSources.clear(); - musicSourcesDirty = true; - } - - public static synchronized ByteBuf serialize() { - final ByteBuf out = Unpooled.buffer(); - ByteBufUtils.writeVarInt(out, musicSources.size(), 5); - musicSources.forEach((uuid, source) -> source.encode(out)); - return out; - } - - private static boolean tickAnyDirty; - - public static synchronized void tick() { - final long now = System.currentTimeMillis(); - tickAnyDirty = false; - musicSources.forEach((uuid, source) -> { - source.playingForMs = now - source.startedPlayingAtMs; - tickAnyDirty |= source.modified; - source.modified = false; - }); - if (tickAnyDirty || musicSourcesDirty) { - musicSourcesDirty = false; - GT_Values.NW.sendToAll(new GT_Packet_MusicSystemData(serialize())); - } - } - - static synchronized void onPauseMs(long pauseDurationMs) { - musicSources.forEach((uuid, source) -> { source.startedPlayingAtMs += pauseDurationMs; }); - } - } - - public static final class ClientSystem { - - private static final class ClientSourceData { - - /** Currently playing sound data */ - public ElectricJukeboxSound currentSound = null; - /** Currently playing sound data */ - public ResourceLocation currentSoundResource = null; - /** - * Server's timer value of when the music started, mostly meaningless except for checking for replays of the - * same music file. - */ - public long originalStartTime = 0; - /** - * Computed client value of {@link System#currentTimeMillis()} of the time when the playback would have - * started if it was synchronized with the server. - */ - public long clientReferenceStartTime = 0; - /** Flag for mark and sweep removal of outdated sounds */ - public boolean markFlag = false; - - public void resetMark() { - markFlag = false; - } - - public void mark() { - markFlag = true; - } - - public void clearSound(final Minecraft mc) { - currentSoundResource = null; - if (currentSound != null) { - mc.getSoundHandler() - .stopSound(currentSound); - currentSound = null; - originalStartTime = 0; - } - } - - public boolean equalSound(final MusicSource source) { - if (source == null || source.currentRecord == null) { - return currentSoundResource == null; - } else { - return source.currentRecord.equals(currentSoundResource) - && originalStartTime == source.startedPlayingAtMs; - } - } - - public void resetSound(final Minecraft mc, final MusicSource source, final boolean onHeadphones) { - clearSound(mc); - if (source == null || source.emitterParameters.length == 0) { - return; - } - int closestEmitter = onHeadphones ? 0 - : source.closestEmitter( - (int) Math.floor(mc.thePlayer.posX), - (int) Math.floor(mc.thePlayer.posY), - (int) Math.floor(mc.thePlayer.posZ), - currentDimension); - if (closestEmitter < 0) { - return; - } - this.currentSoundResource = source.currentRecord; - this.originalStartTime = source.startedPlayingAtMs; - this.clientReferenceStartTime = System.currentTimeMillis() - source.playingForMs; - if (currentSoundResource != null) { - this.currentSound = makeRecord(source, closestEmitter); - if (onHeadphones) { - this.currentSound.volume = 1.0e20f; - } - mc.getSoundHandler() - .playSound(this.currentSound); - } - } - - public void updateSound(final Minecraft mc, final MusicSource source, final boolean onHeadphones) { - if (source == null || currentSound == null || source.emitterParameters.length == 0) { - return; - } - int closestEmitter = onHeadphones ? 0 - : source.closestEmitter( - (int) Math.floor(mc.thePlayer.posX), - (int) Math.floor(mc.thePlayer.posY), - (int) Math.floor(mc.thePlayer.posZ), - currentDimension); - if (closestEmitter < 0) { - currentSound.volume = 0.0f; - return; - } - final int offset = closestEmitter * MusicSource.EMITTER_STRIDE; - currentSound.xPosition = source.emitterParameters[offset + MusicSource.EMITTER_X]; - currentSound.yPosition = source.emitterParameters[offset + MusicSource.EMITTER_Y]; - currentSound.zPosition = source.emitterParameters[offset + MusicSource.EMITTER_Z]; - currentSound.volume = onHeadphones ? 1.0e20f - : source.emitterParameters[offset + MusicSource.EMITTER_VOLUME_X_100] / 100.0f; - } - } - - /** Latest music source list as synchronized from the server */ - public static final Object2ObjectOpenHashMap musicSources = new Object2ObjectOpenHashMap<>(); - - private static final Object2ObjectOpenHashMap activelyPlayingMusic = new Object2ObjectOpenHashMap<>( - 16); - - private static final ObjectOpenHashSet wornHeadphones = new ObjectOpenHashSet<>(); - - private static int currentDimension = Integer.MIN_VALUE; - - private static boolean soundsPaused = false; - private static long pauseTimeMs = 0; - private static int tickCounter = 0; - - public static void loadUpdatedSources(ByteBuf bytes) { - final int sourceCount = ByteBufUtils.readVarInt(bytes, 5); - musicSources.clear(); - for (int i = 0; i < sourceCount; i++) { - final MusicSource source = MusicSource.decode(bytes); - musicSources.put(source.sourceID, source); - } - } - - private static ElectricJukeboxSound makeRecord(MusicSource source, int emitter) { - final int x = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE + MusicSource.EMITTER_X]; - final int y = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE + MusicSource.EMITTER_Y]; - final int z = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE + MusicSource.EMITTER_Z]; - final float volume = source.emitterParameters[emitter * MusicSource.EMITTER_STRIDE - + MusicSource.EMITTER_VOLUME_X_100] / 100.0f; - return new ElectricJukeboxSound(source.currentRecord, volume, source.playingForMs, x, y, z); - } - - public static void dumpAllRecordDurations() { - try { - final Minecraft mc = Minecraft.getMinecraft(); - final SoundRegistry sm = mc.getSoundHandler().sndRegistry; - final SoundDurationsJson json = new SoundDurationsJson(); - @SuppressWarnings("unchecked") - final Map allRecords = ItemRecord.field_150928_b; - // Cursed hack because JOrbis does not support seeking in anything other than filesystem files. - // This is only a dev tool, so it can be a bit slow and use real files here. - final File tempFile = File.createTempFile("mcdecode", ".ogg"); - for (final ItemRecord record : allRecords.values()) { - try { - final ResourceLocation res = record.getRecordResource(record.recordName); - SoundEventAccessorComposite registryEntry = (SoundEventAccessorComposite) sm.getObject(res); - if (registryEntry == null) { - registryEntry = (SoundEventAccessorComposite) sm.getObject( - new ResourceLocation(res.getResourceDomain(), "records." + res.getResourcePath())); - } - final ResourceLocation realPath = registryEntry.func_148720_g() - .getSoundPoolEntryLocation(); - try (final InputStream is = mc.getResourceManager() - .getResource(realPath) - .getInputStream(); final OutputStream os = FileUtils.openOutputStream(tempFile)) { - IOUtils.copy(is, os); - os.close(); - final VorbisFile vf = new VorbisFile(tempFile.getAbsolutePath()); - final float totalSeconds = vf.time_total(-1); - json.soundDurationsMs.put(res.toString(), (int) Math.ceil(totalSeconds * 1000.0f)); - } - } catch (Exception e) { - GT_Mod.GT_FML_LOGGER.warn("Skipping {}", record.recordName, e); - } - } - GT_Mod.GT_FML_LOGGER.info( - "Sound durations json: \n{}", - new GsonBuilder().setPrettyPrinting() - .create() - .toJson(json)); - tempFile.delete(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static void reset() { - musicSources.clear(); - tick(); - } - - public static void tick() { - final Minecraft mc = Minecraft.getMinecraft(); - if (mc == null || mc.renderGlobal == null - || mc.theWorld == null - || mc.thePlayer == null - || mc.theWorld.provider == null) { - return; - } - tickCounter++; - final long now = System.currentTimeMillis(); - currentDimension = mc.theWorld.provider.dimensionId; - - headphoneCheck: if ((tickCounter % 20) == 0) { - wornHeadphones.clear(); - final IInventory baubles = BaublesApi.getBaubles(mc.thePlayer); - if (baubles == null) { - break headphoneCheck; - } - final int baublesSize = baubles.getSizeInventory(); - for (int i = 0; i < baublesSize; i++) { - final ItemStack item = baubles.getStackInSlot(i); - if (item != null && item.getItem() instanceof GT_WirelessHeadphones headphones) { - final UUID id = headphones.getBoundJukeboxUUID(item); - if (id != null) { - wornHeadphones.add(id); - } - } - } - } - - activelyPlayingMusic.forEach((uuid, data) -> data.resetMark()); - - // Update and mark all present music streams - musicSources.forEach((uuid, musicSource) -> { - final ClientSourceData data = activelyPlayingMusic - .computeIfAbsent(uuid, ignored -> new ClientSourceData()); - data.mark(); - if (data.currentSound != null && !mc.getSoundHandler() - .isSoundPlaying(data.currentSound) - && (now - data.clientReferenceStartTime) - < getMusicRecordDurations().getOrDefault(data.currentSoundResource, Integer.MAX_VALUE)) { - data.currentSound = null; - data.currentSoundResource = null; - } - final boolean onHeadphones = wornHeadphones.contains(uuid); - if (!data.equalSound(musicSource)) { - data.resetSound(mc, musicSource, onHeadphones); - } else { - data.updateSound(mc, musicSource, onHeadphones); - } - }); - - // Sweep no longer present music streams - final var entries = activelyPlayingMusic.object2ObjectEntrySet() - .fastIterator(); - while (entries.hasNext()) { - final ClientSourceData entry = entries.next() - .getValue(); - if (!entry.markFlag) { - entry.clearSound(mc); - entries.remove(); - } - } - } - - @ApiStatus.Internal - public static void onSoundBatchStop() { - // All music was forcibly stopped, we can forget about the currently playing music - // and let the update loop re-start them on next tick - long now = System.currentTimeMillis(); - activelyPlayingMusic.forEach((uuid, data) -> { - data.currentSound = null; - data.currentSoundResource = null; - final MusicSource source = musicSources.get(uuid); - if (source == null) { - return; - } - source.playingForMs = now - data.clientReferenceStartTime; - }); - } - - @ApiStatus.Internal - public static void onSoundBatchPause() { - if (soundsPaused) { - return; - } - soundsPaused = true; - pauseTimeMs = System.currentTimeMillis(); - } - - @ApiStatus.Internal - public static void onSoundBatchResume() { - if (!soundsPaused) { - return; - } - final Minecraft mc = Minecraft.getMinecraft(); - if (mc == null || mc.renderGlobal == null - || mc.theWorld == null - || mc.thePlayer == null - || mc.theWorld.provider == null) { - return; - } - soundsPaused = false; - - if (!(mc.isSingleplayer() && !mc.getIntegratedServer() - .getPublic())) { - return; - } - final long now = System.currentTimeMillis(); - final long pauseDurationMs = now - pauseTimeMs; - - // We manipulate server state here, because we've checked this is singleplayer pausing. - GT_MusicSystem.ServerSystem.onPauseMs(pauseDurationMs); - musicSources.forEach((uuid, source) -> { source.startedPlayingAtMs += pauseDurationMs; }); - activelyPlayingMusic.forEach((uuid, data) -> { - data.originalStartTime += pauseDurationMs; - data.clientReferenceStartTime += pauseDurationMs; - }); - - } - } - - private static final Object2IntOpenHashMap musicRecordDurations = new Object2IntOpenHashMap<>(); - private static volatile boolean musicRecordsInitialized; - - /** For GSON consumption */ - public static class SoundDurationsJson { - - public Map soundDurationsMs = new TreeMap<>(); - } - - public static Object2IntOpenHashMap getMusicRecordDurations() { - if (musicRecordsInitialized) { - return musicRecordDurations; - } - // double-checked locking for efficiency - synchronized (musicRecordDurations) { - if (musicRecordsInitialized) { - return musicRecordDurations; - } - - final Gson gson = new Gson(); - - try { - final ArrayList candidates = Collections.list( - GT_MusicSystem.class.getClassLoader() - .getResources("soundmeta/durations.json")); - final Path configPath = Loader.instance() - .getConfigDir() - .toPath() - .resolve("soundmeta") - .resolve("durations.json"); - if (Files.exists(configPath)) { - candidates.add( - configPath.toUri() - .toURL()); - } - for (final URL url : candidates) { - try { - final String objectJson = IOUtils.toString(url); - final SoundDurationsJson object = gson.fromJson(objectJson, SoundDurationsJson.class); - if (object == null || object.soundDurationsMs == null || object.soundDurationsMs.isEmpty()) { - continue; - } - for (final var entry : object.soundDurationsMs.entrySet()) { - musicRecordDurations.put( - new ResourceLocation(entry.getKey()), - entry.getValue() - .intValue()); - } - } catch (Exception e) { - GT_Mod.GT_FML_LOGGER.error("Could not parse sound durations from {}", url, e); - } - } - } catch (IOException e) { - throw new RuntimeException(e); - } - - musicRecordsInitialized = true; - return musicRecordDurations; - } - } - -} diff --git a/src/main/java/gregtech/api/util/GT_OreDictUnificator.java b/src/main/java/gregtech/api/util/GT_OreDictUnificator.java deleted file mode 100644 index 82c14f2aeb..0000000000 --- a/src/main/java/gregtech/api/util/GT_OreDictUnificator.java +++ /dev/null @@ -1,578 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.E; -import static gregtech.api.enums.GT_Values.M; -import static gregtech.api.enums.GT_Values.W; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import javax.annotation.Nullable; - -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SubTag; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.ItemData; -import gregtech.api.objects.MaterialStack; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; -import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * This is the Core of my OreDict Unification Code - *

- * If you just want to use this to unificate your Items, then use the Function in the GregTech_API File - *

- * P.S. It is intended to be named "Unificator" and not "Unifier", because that sounds more awesome. - */ -public class GT_OreDictUnificator { - - private static final Map sName2StackMap = new HashMap<>(); - private static final Map sItemStack2DataMap = new Object2ObjectOpenCustomHashMap<>( - GT_ItemStack.ITEMSTACK_HASH_STRATEGY2); - private static final Map> sUnificationTable = new Object2ObjectOpenCustomHashMap<>( - GT_ItemStack.ITEMSTACK_HASH_STRATEGY2); - private static final Set sNoUnificationList = new ObjectOpenCustomHashSet<>( - GT_ItemStack.ITEMSTACK_HASH_STRATEGY2); - private static int isRegisteringOre = 0, isAddingOre = 0; - private static boolean mRunThroughTheList = true; - - static { - GregTech_API.sItemStackMappings.add(sItemStack2DataMap); - GregTech_API.sItemStackMappings.add(sUnificationTable); - } - - /** - * The Blacklist just prevents the Item from being unificated into something else. Useful if you have things like - * the Industrial Diamond, which is better than regular Diamond, but also usable in absolutely all Diamond Recipes. - */ - public static void addToBlacklist(ItemStack aStack) { - if (GT_Utility.isStackValid(aStack) && !GT_Utility.isStackInStackSet(aStack, sNoUnificationList)) - sNoUnificationList.add(aStack); - } - - public static boolean isBlacklisted(ItemStack aStack) { - return GT_Utility.isStackInStackSet(aStack, sNoUnificationList); - } - - public static void add(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack) { - set(aPrefix, aMaterial, aStack, false, false); - } - - public static void set(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack) { - set(aPrefix, aMaterial, aStack, true, false); - } - - public static void set(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack, boolean aOverwrite, - boolean aAlreadyRegistered) { - if (aMaterial == null || aPrefix == null - || GT_Utility.isStackInvalid(aStack) - || Items.feather.getDamage(aStack) == W) return; - isAddingOre++; - aStack = GT_Utility.copyAmount(1, aStack); - if (!aAlreadyRegistered) registerOre(aPrefix.get(aMaterial), aStack); - addAssociation(aPrefix, aMaterial, aStack, isBlacklisted(aStack)); - if (aOverwrite || GT_Utility.isStackInvalid( - sName2StackMap.get( - aPrefix.get(aMaterial) - .toString()))) - sName2StackMap.put( - aPrefix.get(aMaterial) - .toString(), - aStack); - isAddingOre--; - } - - public static ItemStack getFirstOre(Object aName, long aAmount) { - if (GT_Utility.isStringInvalid(aName)) return null; - ItemStack tStack = sName2StackMap.get(aName.toString()); - if (GT_Utility.isStackValid(tStack)) return GT_Utility.copyAmount(aAmount, tStack); - return GT_Utility.copyAmount(aAmount, getOresImmutable(aName).toArray()); - } - - public static ItemStack get(Object aName, long aAmount) { - return get(aName, null, aAmount, true, true); - } - - public static ItemStack get(Object aName, ItemStack aReplacement, long aAmount) { - return get(aName, aReplacement, aAmount, true, true); - } - - public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, long aAmount) { - return get(aPrefix, aMaterial, null, aAmount); - } - - public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, ItemStack aReplacement, long aAmount) { - if (OrePrefixes.mPreventableComponents.contains(aPrefix) && aPrefix.mDisabledItems.contains(aMaterial)) - return aReplacement; - return get(aPrefix.get(aMaterial), aReplacement, aAmount, false, true); - } - - public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, long aAmount, boolean aNoInvalidAmounts) { - if (OrePrefixes.mPreventableComponents.contains(aPrefix) && aPrefix.mDisabledItems.contains(aMaterial)) - return null; - return get(aPrefix.get(aMaterial), null, aAmount, false, aNoInvalidAmounts); - } - - public static ItemStack get(Object aName, ItemStack aReplacement, long aAmount, boolean aMentionPossibleTypos, - boolean aNoInvalidAmounts) { - if (aNoInvalidAmounts && aAmount < 1) return null; - final ItemStack stackFromName = sName2StackMap.get(aName.toString()); - if (stackFromName != null) return GT_Utility.copyAmount(aAmount, stackFromName); - if (aMentionPossibleTypos) { - GT_Log.err.println("Unknown Key for Unification, Typo? " + aName); - } - final ItemStack stackFirstOre = getFirstOre(aName, aAmount); - if (stackFirstOre != null) return GT_Utility.copyAmount(aAmount, stackFirstOre); - return GT_Utility.copyAmount(aAmount, aReplacement); - } - - public static ItemStack[] setStackArray(boolean aUseBlackList, ItemStack... aStacks) { - for (int i = 0; i < aStacks.length; i++) aStacks[i] = get(aUseBlackList, GT_Utility.copyOrNull(aStacks[i])); - return aStacks; - } - - public static ItemStack[] getStackArray(boolean aUseBlackList, Object... aStacks) { - ItemStack[] rStacks = new ItemStack[aStacks.length]; - for (int i = 0; i < aStacks.length; i++) { - rStacks[i] = get(aUseBlackList, GT_Utility.copy(aStacks[i]), true); - } - return rStacks; - } - - public static ItemStack setStack(ItemStack aStack) { - return setStack(true, aStack); - } - - public static ItemStack setStack(boolean aUseBlackList, ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return aStack; - ItemStack tStack = get(aUseBlackList, aStack); - if (GT_Utility.areStacksEqual(aStack, tStack)) return aStack; - aStack.func_150996_a(tStack.getItem()); - Items.feather.setDamage(aStack, Items.feather.getDamage(tStack)); - return aStack; - } - - public static ItemStack get(ItemStack aStack) { - return get(true, aStack); - } - - public static ItemStack get(boolean aUseBlackList, ItemStack aStack) { - return get(aUseBlackList, aStack, false); - } - - /** - * @param unsafe If true, it does not limit stack size by 64. - */ - public static ItemStack get(boolean aUseBlackList, ItemStack aStack, boolean unsafe) { - if (GT_Utility.isStackInvalid(aStack)) return null; - ItemData tPrefixMaterial = getAssociation(aStack); - if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData() - || (aUseBlackList && tPrefixMaterial.mBlackListed)) return GT_Utility.copyOrNull(aStack); - if (aUseBlackList && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) { - tPrefixMaterial.mBlackListed = true; - return GT_Utility.copyOrNull(aStack); - } - if (tPrefixMaterial.mUnificationTarget == null) - tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString()); - ItemStack rStack = tPrefixMaterial.mUnificationTarget; - if (GT_Utility.isStackInvalid(rStack)) return GT_Utility.copyOrNull(aStack); - ItemStack newStack; - if (unsafe) { - newStack = GT_Utility.copyAmountUnsafe(aStack.stackSize, rStack); - } else { - newStack = GT_Utility.copyAmount(aStack.stackSize, rStack); - } - // NBT is assigned by reference here, so mutating it may have unexpected side effects. - newStack.setTagCompound(aStack.getTagCompound()); - return newStack; - } - - /** - * Doesn't copy the returned stack or set quantity. Be careful and do not mutate it; intended only to optimize - * comparisons - */ - public static ItemStack get_nocopy(ItemStack aStack) { - return get_nocopy(true, aStack); - } - - /** - * Doesn't copy the returned stack or set quantity. Be careful and do not mutate it; intended only to optimize - * comparisons - */ - static ItemStack get_nocopy(boolean aUseBlackList, ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return null; - ItemData tPrefixMaterial = getAssociation(aStack); - if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData() - || (aUseBlackList && tPrefixMaterial.mBlackListed)) return aStack; - if (aUseBlackList && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) { - tPrefixMaterial.mBlackListed = true; - return aStack; - } - if (tPrefixMaterial.mUnificationTarget == null) - tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString()); - ItemStack rStack = tPrefixMaterial.mUnificationTarget; - if (GT_Utility.isStackInvalid(rStack)) return aStack; - - // Yes, == and not .equals(). - // This check is primarily intended to optimize for the case where both rStack and aStack - // do not have NBT, and so we would be comparing null == null. - // - // Even if aStack and rStack may have equal NBT, we prefer to do an inexpensive - // new ItemStack() over the potentially expensive NBTTagCompound.equals(). - if (aStack.getTagCompound() == rStack.getTagCompound()) { - // Warning: rStack's stack size may not be equal to aStack's stack size. - return rStack; - } - - // Okay, okay, I lied, we actually do need to make a copy. - // This is to fix a long-standing bug where we were mutating NBT directly on rStack, - // which had unexpected and unpredictable ripple effects. - // - // We will do some custom copying here, to avoid ItemStack.copy(), - // which calls the potentially expensive NBTTagCompound.copy() - // NBT is assigned by reference here, so mutating it may have unexpected side effects. - ItemStack newStack = new ItemStack(rStack.getItem(), aStack.stackSize, Items.feather.getDamage(rStack)); - newStack.setTagCompound(aStack.getTagCompound()); - return newStack; - } - - /** - * Compares the first argument against an already-unificated second argument as if aUseBlackList was both true and - * false. - */ - public static boolean isInputStackEqual(ItemStack aStack, ItemStack unified_tStack) { - if (GT_Utility.isStackInvalid(aStack)) return false; - return isInputStackEqual(aStack, getAssociation(aStack), unified_tStack); - } - - /** - * Compares the first argument against an already-unificated second argument as if aUseBlackList was both true and - * false. - */ - public static boolean isInputStackEqual(ItemStack aStack, ItemData aStackPrefixData, ItemStack unified_tStack) { - boolean alreadyCompared = false; - if (GT_Utility.isStackInvalid(aStack)) return false; - ItemStack rStack = null; - if (aStackPrefixData == null || !aStackPrefixData.hasValidPrefixMaterialData()) - return GT_Utility.areStacksEqual(aStack, unified_tStack, true); - else if (aStackPrefixData.mBlackListed) { - if (GT_Utility.areStacksEqual(aStack, unified_tStack, true)) return true; - else alreadyCompared = true; - } - if (!alreadyCompared && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) { - aStackPrefixData.mBlackListed = true; - if (GT_Utility.areStacksEqual(aStack, unified_tStack, true)) return true; - else alreadyCompared = true; - } - if (aStackPrefixData.mUnificationTarget == null) - aStackPrefixData.mUnificationTarget = sName2StackMap.get(aStackPrefixData.toString()); - rStack = aStackPrefixData.mUnificationTarget; - if (GT_Utility.isStackInvalid(rStack)) - return !alreadyCompared && GT_Utility.areStacksEqual(aStack, unified_tStack, true); - return GT_Utility.areStacksEqual(rStack, unified_tStack, true); - } - - public static List getNonUnifiedStacks(Object obj) { - if (sUnificationTable.isEmpty() && !sItemStack2DataMap.isEmpty()) { - // use something akin to double check lock. this synchronization overhead is causing lag whenever my - // 5900x tries to do NEI lookup - synchronized (sUnificationTable) { - if (sUnificationTable.isEmpty() && !sItemStack2DataMap.isEmpty()) { - for (ItemStack tGTStack0 : sItemStack2DataMap.keySet()) { - ItemStack tStack0 = GT_ItemStack.internalCopyStack(tGTStack0); - ItemStack tStack1 = get_nocopy(false, tStack0); - if (!GT_Utility.areStacksEqual(tStack0, tStack1)) { - List list = sUnificationTable.computeIfAbsent(tStack1, k -> new ArrayList<>()); - // greg's original code tries to dedupe the list using List#contains, which won't work - // on vanilla ItemStack. I removed it since it never worked and can be slow. - list.add(tStack0); - } - } - } - } - } - ItemStack[] aStacks = {}; - if (obj instanceof ItemStack) aStacks = new ItemStack[] { (ItemStack) obj }; - else if (obj instanceof ItemStack[]) aStacks = (ItemStack[]) obj; - else if (obj instanceof List) aStacks = (ItemStack[]) ((List) obj).toArray(new ItemStack[0]); - List rList = new ArrayList<>(); - for (ItemStack aStack : aStacks) { - if (aStack == null) continue; - rList.add(aStack); - List tList = sUnificationTable.get(aStack); - if (tList != null) { - for (ItemStack tStack : tList) { - ItemStack tStack1 = GT_Utility.copyAmount(aStack.stackSize, tStack); - rList.add(tStack1); - } - } - } - return rList; - } - - public static void addItemData(ItemStack aStack, ItemData aData) { - if (GT_Utility.isStackValid(aStack) && getItemData(aStack) == null && aData != null) setItemData(aStack, aData); - } - - public static void addItemDataFromInputs(ItemStack output, Object... inputs) { - int length = inputs.length; - ItemData[] tData = new ItemData[length]; - for (int i = 0; i < length; i++) { - if (inputs[i] instanceof ItemStack) { - tData[i] = GT_OreDictUnificator.getItemData((ItemStack) inputs[i]); - } else if (inputs[i] instanceof ItemData) { - tData[i] = (ItemData) inputs[i]; - } else { - throw new IllegalArgumentException(); - } - } - if (GT_Utility.arrayContainsNonNull(tData)) { - GT_OreDictUnificator.addItemData(output, new ItemData(tData)); - } - } - - public static void setItemData(ItemStack aStack, ItemData aData) { - if (GT_Utility.isStackInvalid(aStack) || aData == null) return; - ItemData tData = getItemData(aStack); - if (tData == null || !tData.hasValidPrefixMaterialData()) { - if (tData != null) for (Object tObject : tData.mExtraData) - if (!aData.mExtraData.contains(tObject)) aData.mExtraData.add(tObject); - if (aStack.stackSize > 1) { - if (aData.mMaterial != null) aData.mMaterial.mAmount /= aStack.stackSize; - for (MaterialStack tMaterial : aData.mByProducts) tMaterial.mAmount /= aStack.stackSize; - aStack = GT_Utility.copyAmount(1, aStack); - } - sItemStack2DataMap.put(aStack, aData); - if (aData.hasValidMaterialData()) { - long tValidMaterialAmount = aData.mMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0 - : aData.mMaterial.mAmount >= 0 ? aData.mMaterial.mAmount : M; - for (MaterialStack tMaterial : aData.mByProducts) - tValidMaterialAmount += tMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0 - : tMaterial.mAmount >= 0 ? tMaterial.mAmount : M; - if (tValidMaterialAmount < M) GT_ModHandler.addToRecyclerBlackList(aStack); - } - if (mRunThroughTheList) { - if (GregTech_API.sLoadStarted) { - mRunThroughTheList = false; - for (Entry tEntry : sItemStack2DataMap.entrySet()) if (!tEntry.getValue() - .hasValidPrefixData() || tEntry.getValue().mPrefix.mAllowNormalRecycling) - GT_RecipeRegistrator.registerMaterialRecycling( - GT_ItemStack.internalCopyStack(tEntry.getKey()), - tEntry.getValue()); - } - } else { - if (!aData.hasValidPrefixData() || aData.mPrefix.mAllowNormalRecycling) - GT_RecipeRegistrator.registerMaterialRecycling(aStack, aData); - } - } else { - for (Object tObject : aData.mExtraData) - if (!tData.mExtraData.contains(tObject)) tData.mExtraData.add(tObject); - } - } - - public static void removeItemData(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) { - return; - } - sItemStack2DataMap.remove(aStack); - } - - public static void addAssociation(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack, - boolean aBlackListed) { - if (aPrefix == null || aMaterial == null || GT_Utility.isStackInvalid(aStack)) return; - if (Items.feather.getDamage(aStack) == W) for (byte i = 0; i < 16; i++) - setItemData(GT_Utility.copyAmountAndMetaData(1, i, aStack), new ItemData(aPrefix, aMaterial, aBlackListed)); - setItemData(aStack, new ItemData(aPrefix, aMaterial, aBlackListed)); - } - - @Nullable - public static ItemData getItemData(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return null; - ItemData rData = sItemStack2DataMap.get(aStack); - if (rData == null) { // Try the lookup again but with wildcard damage value - rData = sItemStack2DataMap.get(GT_ItemStack.internalCopyStack(aStack, true)); - } - return rData; - } - - @Nullable - public static ItemData getAssociation(ItemStack aStack) { - ItemData rData = getItemData(aStack); - return rData != null && rData.hasValidPrefixMaterialData() ? rData : null; - } - - public static boolean isItemStackInstanceOf(ItemStack aStack, Object aName) { - if (GT_Utility.isStringInvalid(aName) || GT_Utility.isStackInvalid(aStack)) return false; - for (ItemStack tOreStack : getOresImmutable(aName.toString())) - if (GT_Utility.areStacksEqual(tOreStack, aStack, true)) return true; - return false; - } - - public static boolean isItemStackDye(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return false; - - for (Dyes tDye : Dyes.VALUES) if (isItemStackInstanceOf(aStack, tDye.toString())) return true; - - return false; - } - - public static boolean registerOre(OrePrefixes aPrefix, Object aMaterial, ItemStack aStack) { - return registerOre(aPrefix.get(aMaterial), aStack); - } - - public static boolean registerOre(Object aName, ItemStack aStack) { - if (aName == null || GT_Utility.isStackInvalid(aStack)) return false; - - String tName = aName.toString(); - - if (GT_Utility.isStringInvalid(tName)) return false; - - for (ItemStack itemStack : getOresImmutable(tName)) - if (GT_Utility.areStacksEqual(itemStack, aStack, true)) return false; - - isRegisteringOre++; - OreDictionary.registerOre(tName, GT_Utility.copyAmount(1, aStack)); - isRegisteringOre--; - return true; - } - - public static boolean isRegisteringOres() { - return isRegisteringOre > 0; - } - - public static boolean isAddingOres() { - return isAddingOre > 0; - } - - public static void resetUnificationEntries() { - for (ItemData tPrefixMaterial : sItemStack2DataMap.values()) tPrefixMaterial.mUnificationTarget = null; - } - - public static ItemStack getGem(MaterialStack aMaterial) { - return aMaterial == null ? null : getGem(aMaterial.mMaterial, aMaterial.mAmount); - } - - public static ItemStack getGem(Materials aMaterial, OrePrefixes aPrefix) { - return aMaterial == null ? null : getGem(aMaterial, aPrefix.mMaterialAmount); - } - - public static ItemStack getGem(Materials aMaterial, long aMaterialAmount) { - ItemStack rStack = null; - if (((aMaterialAmount >= M))) rStack = get(OrePrefixes.gem, aMaterial, aMaterialAmount / M); - if (rStack == null) { - if ((((aMaterialAmount * 2) % M == 0) || aMaterialAmount >= M * 16)) - rStack = get(OrePrefixes.gemFlawed, aMaterial, (aMaterialAmount * 2) / M); - if ((((aMaterialAmount * 4) >= M))) - rStack = get(OrePrefixes.gemChipped, aMaterial, (aMaterialAmount * 4) / M); - } - return rStack; - } - - public static ItemStack getDust(MaterialStack aMaterial) { - return aMaterial == null ? null : getDust(aMaterial.mMaterial, aMaterial.mAmount); - } - - public static ItemStack getDust(Materials aMaterial, OrePrefixes aPrefix) { - return aMaterial == null ? null : getDust(aMaterial, aPrefix.mMaterialAmount); - } - - public static ItemStack getDust(Materials aMaterial, long aMaterialAmount) { - if (aMaterialAmount <= 0) return null; - ItemStack rStack = null; - if (((aMaterialAmount % M == 0) || aMaterialAmount >= M * 16)) - rStack = get(OrePrefixes.dust, aMaterial, aMaterialAmount / M); - if (rStack == null && (((aMaterialAmount * 4) % M == 0) || aMaterialAmount >= M * 8)) - rStack = get(OrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M); - if (rStack == null && (((aMaterialAmount * 9) >= M))) - rStack = get(OrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M); - return rStack; - } - - public static ItemStack getIngot(MaterialStack aMaterial) { - return aMaterial == null ? null : getIngot(aMaterial.mMaterial, aMaterial.mAmount); - } - - public static ItemStack getIngot(Materials aMaterial, OrePrefixes aPrefix) { - return aMaterial == null ? null : getIngot(aMaterial, aPrefix.mMaterialAmount); - } - - public static ItemStack getIngot(Materials aMaterial, long aMaterialAmount) { - if (aMaterialAmount <= 0) return null; - ItemStack rStack = null; - if (((aMaterialAmount % (M * 9) == 0 && aMaterialAmount / (M * 9) > 1) || aMaterialAmount >= M * 72)) - rStack = get(OrePrefixes.block, aMaterial, aMaterialAmount / (M * 9)); - if (rStack == null && ((aMaterialAmount % M == 0) || aMaterialAmount >= M * 8)) - rStack = get(OrePrefixes.ingot, aMaterial, aMaterialAmount / M); - if (rStack == null && (((aMaterialAmount * 9) >= M))) - rStack = get(OrePrefixes.nugget, aMaterial, (aMaterialAmount * 9) / M); - return rStack; - } - - public static ItemStack getIngotOrDust(Materials aMaterial, long aMaterialAmount) { - if (aMaterialAmount <= 0) return null; - ItemStack rStack = getIngot(aMaterial, aMaterialAmount); - if (rStack == null) rStack = getDust(aMaterial, aMaterialAmount); - return rStack; - } - - public static ItemStack getIngotOrDust(MaterialStack aMaterial) { - ItemStack rStack = getIngot(aMaterial); - if (rStack == null) rStack = getDust(aMaterial); - return rStack; - } - - public static ItemStack getDustOrIngot(Materials aMaterial, long aMaterialAmount) { - if (aMaterialAmount <= 0) return null; - ItemStack rStack = getDust(aMaterial, aMaterialAmount); - if (rStack == null) rStack = getIngot(aMaterial, aMaterialAmount); - return rStack; - } - - public static ItemStack getDustOrIngot(MaterialStack aMaterial) { - ItemStack rStack = getDust(aMaterial); - if (rStack == null) rStack = getIngot(aMaterial); - return rStack; - } - - /** - * @return a Copy of the OreDictionary.getOres() List - */ - public static ArrayList getOres(OrePrefixes aPrefix, Object aMaterial) { - return getOres(aPrefix.get(aMaterial)); - } - - /** - * @return a Copy of the OreDictionary.getOres() List - */ - public static ArrayList getOres(Object aOreName) { - String aName = aOreName == null ? E : aOreName.toString(); - ArrayList rList = new ArrayList<>(); - if (GT_Utility.isStringValid(aName)) rList.addAll(OreDictionary.getOres(aName)); - return rList; - } - - /** - * Fast version of {@link #getOres(Object)}, which doesn't call - * {@link System#arraycopy(Object, int, Object, int, int)} in {@link ArrayList#addAll} - */ - public static List getOresImmutable(@Nullable Object aOreName) { - String aName = aOreName == null ? E : aOreName.toString(); - - return GT_Utility.isStringValid(aName) ? Collections.unmodifiableList(OreDictionary.getOres(aName)) - : Collections.emptyList(); - } -} diff --git a/src/main/java/gregtech/api/util/GT_OverclockCalculator.java b/src/main/java/gregtech/api/util/GT_OverclockCalculator.java deleted file mode 100644 index 5dda0b5c01..0000000000 --- a/src/main/java/gregtech/api/util/GT_OverclockCalculator.java +++ /dev/null @@ -1,621 +0,0 @@ -package gregtech.api.util; - -import java.util.function.Function; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; - -public class GT_OverclockCalculator { - - // region variables - // region basic properties - /** - * EUt the recipe originally runs at - */ - private long recipeEUt = 0; - /** - * Voltage of the machine - */ - private long machineVoltage = 0; - /** - * Amperage of the machine - */ - private long machineAmperage = 1; - /** - * Duration of the recipe - */ - private int duration = 0; - /** - * A supplier used for machines which have a custom way of calculating base duration, like Neutron Activator - */ - private Supplier durationUnderOneTickSupplier; - /** - * The parallel the machine has when trying to overclock - */ - private int parallel = 1; - // endregion - // region extra factors - /** - * Discount for EUt at the beginning of calculating overclocks, like GT++ machines - */ - private double eutDiscount = 1; - /** - * Speeding/Slowing up/down the duration of a recipe at the beginning of calculating overclocks, like GT++ machines - */ - private double speedBoost = 1; - // endregion - // region overclock parameters - /** - * How much the energy would be multiplied by per overclock available - */ - private double eutIncreasePerOC = 4; - /** - * A supplier used for machines which have a custom way of calculating energy increase multipliers for every - * overclock, like Advanced Assembling Line - */ - private Function eutIncreasePerOCSupplier = getDefaultEutIncreasePerOCSupplier(); - /** - * How much the duration would be divided by per overclock made that isn't an overclock from HEAT - */ - private double durationDecreasePerOC = 2; - /** - * A supplier used for machines which have a custom way of calculating duration decrease multipliers for every - * overclock - */ - private Function durationDecreasePerOCSupplier = getDefaultDurationDecreasePerOCSupplier(); - /** - * Whether at least one of {@link #eutIncreasePerOCSupplier} and {@link #durationDecreasePerOCSupplier} has been set - */ - private boolean hasAtLeastOneSupplierBeenSet; - /** - * Whether to give EUt Discount when the duration goes below one tick - */ - private boolean oneTickDiscount; - /** - * Whether the multi should use amperage to overclock normally. - */ - private boolean amperageOC; - /** - * If the OC calculator should only do a given amount of overclocks. Mainly used in fusion reactors - */ - private boolean limitOverclocks; - /** - * Maximum amount of overclocks to perform, when limitOverclocks = true - */ - private int maxOverclocks; - /** - * How many overclocks have been performed - */ - private int overclockCount; - /** - * Should we actually try to calculate overclocking - */ - private boolean noOverclock; - /** - * The parallel the machine actually used. - */ - private int currentParallel; - // endregion - // region heat overclock - /** - * The min heat required for the recipe - */ - private int recipeHeat = 0; - /** - * The heat the machine has when starting the recipe - */ - private int machineHeat = 0; - /** - * How much the duration should be divided by for each 1800K above recipe heat - */ - private double durationDecreasePerHeatOC = 4; - /** - * Whether to enable overclocking with heat like the EBF every 1800 heat difference - */ - private boolean heatOC; - /** - * Whether to enable heat discounts every 900 heat difference - */ - private boolean heatDiscount; - /** - * The value used for discount final eut per 900 heat - */ - private double heatDiscountExponent = 0.95; - // endregion - // region result - /** - * variable to check whether the overclocks have been calculated - */ - private boolean calculated; - /** - * The calculated duration result. - */ - private int calculatedDuration; - /** - * The calculated energy consumption result. - */ - private long calculatedConsumption; - // endregion - // region constants - private static final int HEAT_DISCOUNT_THRESHOLD = 900; - private static final int HEAT_PERFECT_OVERCLOCK_THRESHOLD = 1800; - private static final double LOG2 = Math.log(2); - // endregion - // endregion - - /** - * Creates calculator that doesn't do OC at all. Will use recipe duration. - */ - public static GT_OverclockCalculator ofNoOverclock(@Nonnull GT_Recipe recipe) { - return ofNoOverclock(recipe.mEUt, recipe.mDuration); - } - - /** - * Creates calculator that doesn't do OC at all, with set duration. - */ - public static GT_OverclockCalculator ofNoOverclock(long eut, int duration) { - return new GT_OverclockCalculator().setRecipeEUt(eut) - .setDuration(duration) - .setEUt(eut) - .setNoOverclock(true); - } - - /** - * An Overclock helper for calculating overclocks in many different situations - */ - public GT_OverclockCalculator() {} - - // region setters - /** - * @param recipeEUt Sets the Recipe's starting voltage - */ - @Nonnull - public GT_OverclockCalculator setRecipeEUt(long recipeEUt) { - this.recipeEUt = recipeEUt; - return this; - } - - /** - * @param machineVoltage Sets the EUt that the machine can use. This is the voltage of the machine - */ - @Nonnull - public GT_OverclockCalculator setEUt(long machineVoltage) { - this.machineVoltage = machineVoltage; - return this; - } - - /** - * @param duration Sets the duration of the recipe - */ - @Nonnull - public GT_OverclockCalculator setDuration(int duration) { - this.duration = duration; - return this; - } - - /** - * @param machineAmperage Sets the Amperage that the machine can support - */ - @Nonnull - public GT_OverclockCalculator setAmperage(long machineAmperage) { - this.machineAmperage = machineAmperage; - return this; - } - - /** - * Enables Perfect OC in calculation - */ - @Nonnull - public GT_OverclockCalculator enablePerfectOC() { - this.durationDecreasePerOC = 4; - return this; - } - - /** - * Set if we should be calculating overclocking using EBF's perfectOC - */ - @Nonnull - public GT_OverclockCalculator setHeatOC(boolean heatOC) { - this.heatOC = heatOC; - return this; - } - - /** - * Sets if we should add a heat discount at the end of calculating an overclock, just like the EBF - */ - @Nonnull - public GT_OverclockCalculator setHeatDiscount(boolean heatDiscount) { - this.heatDiscount = heatDiscount; - return this; - } - - /** - * Sets the starting heat of the recipe - */ - @Nonnull - public GT_OverclockCalculator setRecipeHeat(int recipeHeat) { - this.recipeHeat = recipeHeat; - return this; - } - - /** - * Sets the heat of the coils on the machine - */ - @Nonnull - public GT_OverclockCalculator setMachineHeat(int machineHeat) { - this.machineHeat = machineHeat; - return this; - } - - /** - * Sets an EUtDiscount. 0.9 is 10% less energy. 1.1 is 10% more energy - */ - @Nonnull - public GT_OverclockCalculator setEUtDiscount(float aEUtDiscount) { - this.eutDiscount = aEUtDiscount; - return this; - } - - /** - * Sets a Speed Boost for the multiblock. 0.9 is 10% faster. 1.1 is 10% slower - */ - @Nonnull - public GT_OverclockCalculator setSpeedBoost(float aSpeedBoost) { - this.speedBoost = aSpeedBoost; - return this; - } - - /** - * Sets the parallel that the multiblock uses - */ - @Nonnull - public GT_OverclockCalculator setParallel(int aParallel) { - this.parallel = aParallel; - return this; - } - - /** - * Sets the heat discount during OC calculation if HeatOC is used. Default: 0.95 = 5% discount Used like a EU/t - * Discount - */ - @Nonnull - public GT_OverclockCalculator setHeatDiscountMultiplier(float heatDiscountExponent) { - this.heatDiscountExponent = heatDiscountExponent; - return this; - } - - /** - * Sets the Overclock that should be calculated when a heat OC is applied. - */ - @Nonnull - public GT_OverclockCalculator setHeatPerfectOC(double heatPerfectOC) { - if (heatPerfectOC <= 0) throw new IllegalArgumentException("Heat OC can't be a negative number or zero"); - this.durationDecreasePerHeatOC = heatPerfectOC; - return this; - } - - /** - * Sets the amount that the eut would be multiplied by per overclock. Do not set as 1(ONE) if the duration decrease - * is also 1(ONE)! - */ - @Nonnull - public GT_OverclockCalculator setEUtIncreasePerOC(double eutIncreasePerOC) { - if (eutIncreasePerOC <= 0) - throw new IllegalArgumentException("EUt increase can't be a negative number or zero"); - this.eutIncreasePerOC = eutIncreasePerOC; - return this; - } - - /** - * Sets the amount that the duration would be divided by per overclock. Do not set as 1(ONE) if the eut increase is - * also 1(ONE)! - */ - @Nonnull - public GT_OverclockCalculator setDurationDecreasePerOC(double durationDecreasePerOC) { - if (durationDecreasePerOC <= 0) - throw new IllegalArgumentException("Duration decrease can't be a negative number or zero"); - this.durationDecreasePerOC = durationDecreasePerOC; - return this; - } - - /** - * Set One Tick Discount on EUt based on Duration Decrease Per Overclock. This functions the same as single blocks. - */ - @Nonnull - public GT_OverclockCalculator setOneTickDiscount(boolean oneTickDiscount) { - this.oneTickDiscount = oneTickDiscount; - return this; - } - - /** - * Limit the amount of overclocks that can be performed, regardless of how much power is available. Mainly used for - * fusion reactors. - */ - @Nonnull - public GT_OverclockCalculator limitOverclockCount(int maxOverclocks) { - this.limitOverclocks = true; - this.maxOverclocks = maxOverclocks; - return this; - } - - @Nonnull - public GT_OverclockCalculator setAmperageOC(boolean amperageOC) { - this.amperageOC = amperageOC; - return this; - } - - /** - * Set a supplier for calculating custom duration for when its needed under one tick - */ - @Nonnull - public GT_OverclockCalculator setDurationUnderOneTickSupplier(Supplier supplier) { - this.durationUnderOneTickSupplier = supplier; - return this; - } - - /** - * Sets if we should do overclocking or not - */ - @Nonnull - public GT_OverclockCalculator setNoOverclock(boolean noOverclock) { - this.noOverclock = noOverclock; - return this; - } - - /** - * Set a supplier for calculating custom EUt increase multipliers for every overclock - */ - public GT_OverclockCalculator setEutIncreasePerOCSupplier(Function eutIncreasePerOCSupplier) { - this.eutIncreasePerOCSupplier = eutIncreasePerOCSupplier; - this.hasAtLeastOneSupplierBeenSet = true; - return this; - } - - /** - * Set a supplier for calculating custom duration decrease multipliers for every overclock - */ - public GT_OverclockCalculator setDurationDecreasePerOCSupplier( - Function durationDecreasePerOCSupplier) { - this.durationDecreasePerOCSupplier = durationDecreasePerOCSupplier; - this.hasAtLeastOneSupplierBeenSet = true; - return this; - } - - /** - * Set actually performed parallel - */ - public GT_OverclockCalculator setCurrentParallel(int currentParallel) { - this.currentParallel = currentParallel; - // Sets parallel to the actually performed one if machine's parallel is underused. - this.parallel = Math.min(parallel, currentParallel); - return this; - } - - // endregion - // region calculate - /** - * Call this when all values have been put it. - */ - @Nonnull - public GT_OverclockCalculator calculate() { - if (calculated) { - throw new IllegalStateException("Tried to calculate overclocks twice"); - } - calculateOverclock(); - calculated = true; - return this; - } - - private void calculateOverclock() { - double durationInDouble = durationUnderOneTickSupplier != null ? durationUnderOneTickSupplier.get() - : duration * speedBoost; - calculatedConsumption = recipeEUt; - double heatDiscountMultiplier = calculateHeatDiscountMultiplier(); - // Usually a safeguard when currentParallel is not set: We assume parallel is fully used. - currentParallel = Math.max(currentParallel, parallel); - - if (noOverclock) { - calculatedConsumption = calculateFinalRecipeEUt(heatDiscountMultiplier); - calculatedDuration = (int) Math.ceil(durationInDouble); - return; - } - - // First we need to overclock to reach 1 tick. - // Then we need to overclock under one tick to get more extra parallels. - // We stop overclocking if we've already reached 1 tick and got enough parallels to actually perform. - double requiredUnderOneTickMultiplier = durationInDouble * currentParallel / parallel; - if (hasAtLeastOneSupplierBeenSet) { // custom overclock - double currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); - double currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); - double machinePower = calculateMachinePower(); - double currentConsumption = calculateRecipePower(heatDiscountMultiplier); - double currentUnderOneTickMultiplier = 1; - // Whether we have enough power for the next overclock; - // whether we need more overclock to reach 1 tick and get enough extra parallel; - // whether we have reached the overclock limit - while (machinePower > currentConsumption * currentEutIncrease - && requiredUnderOneTickMultiplier > currentUnderOneTickMultiplier - && (!limitOverclocks || overclockCount < maxOverclocks)) { - currentConsumption *= currentEutIncrease; - durationInDouble /= currentDurationDecrease; - overclockCount++; - currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); - currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); - } - calculatedConsumption = (long) Math.max(currentConsumption, 1); - calculatedDuration = (int) Math.max(durationInDouble, 1); - } else { // general overclock - double recipePowerTier = calculateRecipePowerTier(heatDiscountMultiplier); - double machinePowerTier = calculateMachinePowerTier(); - - int maxOverclockCount = calculateAmountOfOverclocks(machinePowerTier, recipePowerTier); - if (limitOverclocks) maxOverclockCount = Math.min(maxOverclocks, maxOverclockCount); - if (!amperageOC) { - // Limit overclocks by voltage tier. - maxOverclockCount = Math.min(maxOverclockCount, calculateRecipeToMachineVoltageDifference()); - } - overclockCount = calculateAmountOfNeededOverclocks(maxOverclockCount, requiredUnderOneTickMultiplier); - - // If triggered, it indicates that recipe power > machine power. - // Not just a safeguard. This also means that you can run a 1.2A recipe on a single hatch for a regular gt - // multi. - // This is intended, including the fact that you don't get an OC with a one tier upgrade in that case. - overclockCount = Math.max(overclockCount, 0); - - int heatOverclockCount = Math.min(calculateMaxAmountOfHeatOverclocks(), overclockCount); - calculatedConsumption = (long) Math.floor(recipeEUt * Math.pow(eutIncreasePerOC, overclockCount)); - durationInDouble /= Math.pow(durationDecreasePerHeatOC, heatOverclockCount) - * Math.pow(durationDecreasePerOC, overclockCount - heatOverclockCount); - if (oneTickDiscount) { - calculatedConsumption = (long) Math - .floor(calculatedConsumption / Math.pow(durationDecreasePerOC, maxOverclockCount - overclockCount)); - calculatedConsumption = Math.max(calculatedConsumption, 1); - } - calculatedConsumption = calculateFinalRecipeEUt(heatDiscountMultiplier); - calculatedDuration = (int) Math.max(durationInDouble, 1); - } - } - - private double calculateRecipePower(double heatDiscountMultiplier) { - return recipeEUt * parallel * eutDiscount * heatDiscountMultiplier; - } - - private double calculateRecipePowerTier(double heatDiscountMultiplier) { - return calculatePowerTier(calculateRecipePower(heatDiscountMultiplier)); - } - - private double calculateMachinePower() { - return machineVoltage * (amperageOC ? machineAmperage : Math.min(machineAmperage, parallel)); - } - - private double calculateMachinePowerTier() { - return calculatePowerTier(calculateMachinePower()); - } - - private int calculateRecipeToMachineVoltageDifference() { - return (int) (Math.ceil(calculatePowerTier(machineVoltage)) - Math.ceil(calculatePowerTier(recipeEUt))); - } - - private double calculatePowerTier(double voltage) { - return 1 + Math.max(0, (Math.log(voltage) / LOG2) - 5) / 2; - } - - private long calculateFinalRecipeEUt(double heatDiscountMultiplier) { - return (long) Math.ceil(calculatedConsumption * eutDiscount * heatDiscountMultiplier * parallel); - } - - private int calculateMaxAmountOfHeatOverclocks() { - return heatOC ? (machineHeat - recipeHeat) / HEAT_PERFECT_OVERCLOCK_THRESHOLD : 0; - } - - /** - * Calculate maximum possible overclocks ignoring if we are going to go under 1 tick - */ - private int calculateAmountOfOverclocks(double machinePowerTier, double recipePowerTier) { - return (int) (machinePowerTier - recipePowerTier); - } - - private int calculateAmountOfNeededOverclocks(int maxOverclockCount, double requiredUnderOneTickMultiplier) { - int neededHeatOC = (int) Math.min( - calculateMaxAmountOfHeatOverclocks(), - Math.ceil(Math.log(requiredUnderOneTickMultiplier) / Math.log(durationDecreasePerHeatOC))); - neededHeatOC = Math.max(neededHeatOC, 0); - int neededNormalOC = (int) Math.ceil( - (Math.log(requiredUnderOneTickMultiplier) - Math.log(durationDecreasePerHeatOC) * neededHeatOC) - / Math.log(durationDecreasePerOC)); - neededNormalOC = Math.max(neededNormalOC, 0); - return Math.min(maxOverclockCount, neededHeatOC + neededNormalOC); - } - - private double calculateHeatDiscountMultiplier() { - int heatDiscounts = heatDiscount ? (machineHeat - recipeHeat) / HEAT_DISCOUNT_THRESHOLD : 0; - return Math.pow(heatDiscountExponent, heatDiscounts); - } - - // endregion - // region result getters - /** - * @return The consumption after overclock has been calculated - */ - public long getConsumption() { - if (!calculated) { - throw new IllegalStateException("Tried to get consumption before calculating"); - } - return calculatedConsumption; - } - - /** - * @return The duration of the recipe after overclock has been calculated - */ - public int getDuration() { - if (!calculated) { - throw new IllegalStateException("Tried to get duration before calculating"); - } - return calculatedDuration; - } - - /** - * @return Number of performed overclocks - */ - public int getPerformedOverclocks() { - if (!calculated) { - throw new IllegalStateException("Tried to get performed overclocks before calculating"); - } - return overclockCount; - } - - /** - * @return Whether the calculation has happened - */ - public boolean getCalculationStatus() { - return calculated; - } - - // endregion - // region misc - /** - * Returns duration as a double to show how much it is overclocking too much to determine extra parallel. This - * doesn't count as calculating - */ - public double calculateDurationUnderOneTick() { - double durationInDouble = durationUnderOneTickSupplier != null ? durationUnderOneTickSupplier.get() - : duration * speedBoost; - if (noOverclock) return durationInDouble; - double heatDiscountMultiplier = calculateHeatDiscountMultiplier(); - if (hasAtLeastOneSupplierBeenSet) { - int overclockCount = 0; - double currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); - double currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); - double machinePower = calculateMachinePower(); - double recipePower = calculateRecipePower(heatDiscountMultiplier); - while (machinePower > recipePower * currentEutIncrease - && (!limitOverclocks || overclockCount < maxOverclocks)) { - recipePower *= currentEutIncrease; - durationInDouble /= currentDurationDecrease; - overclockCount++; - currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); - currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); - } - } else { - int maxOverclockCount = calculateAmountOfOverclocks( - calculateMachinePowerTier(), - calculateRecipePowerTier(heatDiscountMultiplier)); - if (limitOverclocks) maxOverclockCount = Math.min(maxOverclocks, maxOverclockCount); - int heatOverclocks = Math.min(calculateMaxAmountOfHeatOverclocks(), maxOverclockCount); - durationInDouble /= Math.pow(durationDecreasePerOC, maxOverclockCount - heatOverclocks) - * Math.pow(durationDecreasePerHeatOC, heatOverclocks); - } - return durationInDouble; - } - - private Function getDefaultEutIncreasePerOCSupplier() { - return overclockCount -> eutIncreasePerOC; - } - - private Function getDefaultDurationDecreasePerOCSupplier() { - return overclockCount -> overclockCount <= calculateMaxAmountOfHeatOverclocks() ? durationDecreasePerHeatOC - : durationDecreasePerOC; - } - - // endregion -} diff --git a/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java b/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java deleted file mode 100644 index 990e9bd174..0000000000 --- a/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java +++ /dev/null @@ -1,25 +0,0 @@ -package gregtech.api.util; - -import com.google.common.collect.HashBiMap; - -import gregtech.api.enums.Materials; - -public class GT_PCBFactoryManager { - - private static final HashBiMap mPlasticTiers = HashBiMap.create(); - public static int mTiersOfPlastics = 0; - - public static void addPlasticTier(Materials aMaterial, int aTier) { - mPlasticTiers.put(aMaterial, aTier); - mTiersOfPlastics++; - } - - public static int getPlasticTier(Materials aMaterial) { - return mPlasticTiers.get(aMaterial); - } - - public static Materials getPlasticMaterialFromTier(int aTier) { - return mPlasticTiers.inverse() - .get(aTier); - } -} diff --git a/src/main/java/gregtech/api/util/GT_ParallelHelper.java b/src/main/java/gregtech/api/util/GT_ParallelHelper.java deleted file mode 100644 index 157488a8ca..0000000000 --- a/src/main/java/gregtech/api/util/GT_ParallelHelper.java +++ /dev/null @@ -1,713 +0,0 @@ -package gregtech.api.util; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Objects; -import java.util.Random; -import java.util.function.Function; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.interfaces.tileentity.IRecipeLockable; -import gregtech.api.interfaces.tileentity.IVoidable; -import gregtech.api.logic.FluidInventoryLogic; -import gregtech.api.logic.ItemInventoryLogic; -import gregtech.api.objects.XSTR; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SingleRecipeCheck; - -@SuppressWarnings({ "unused", "UnusedReturnValue" }) -public class GT_ParallelHelper { - - private static final double MAX_BATCH_MODE_TICK_TIME = 128; - /** - * Machine used for calculation - */ - private IVoidable machine; - /** - * Machine used for single recipe locking calculation - */ - private IRecipeLockable singleRecipeMachine; - /** - * Is locked to a single recipe? - */ - private boolean isRecipeLocked; - /** - * Recipe used when trying to calculate parallels - */ - private GT_Recipe recipe; - /** - * EUt available to the multiblock (This should be the total eut available) - */ - private long availableEUt; - /** - * The current parallel possible for the multiblock - */ - private int currentParallel = 0; - /** - * The maximum possible parallel possible for the multiblock - */ - private int maxParallel = 1; - /** - * The Batch Modifier applied when batch mode is enabled. 1 does nothing. 2 doubles max possible - * parallel, but also duration - */ - private int batchModifier = 1; - /** - * The inputs of the multiblock for the current recipe check - */ - private ItemStack[] itemInputs; - /** - * The inputs of the machine for current recipe check - */ - private ItemInventoryLogic itemInputInventory; - /** - * The output item inventory of the machine - */ - private ItemInventoryLogic itemOutputInventory; - /** - * The outputs of the recipe with the applied parallel - */ - private ItemStack[] itemOutputs; - /** - * The inputs of the multiblock for the current recipe check - */ - private FluidStack[] fluidInputs; - /** - * The inputs of the machine for the current recipe check - */ - private FluidInventoryLogic fluidInputInventory; - /** - * The output fluid inventory of the machine; - */ - private FluidInventoryLogic fluidOutputInventory; - /** - * The outputs of the recipe with the applied parallel - */ - private FluidStack[] fluidOutputs; - /** - * Does the multi have void protection enabled for items - */ - private boolean protectExcessItem; - /** - * Does the multi have void protection enabled for fluids - */ - private boolean protectExcessFluid; - /** - * Should the Parallel Helper automatically consume for the multi - */ - private boolean consume; - /** - * Is batch mode turned on? - */ - private boolean batchMode; - /** - * Should the Parallel Helper automatically calculate the outputs of the recipe with current parallel? - */ - private boolean calculateOutputs; - /** - * Has the Parallel Helper been built? - */ - private boolean built; - /** - * What is the duration multiplier with batch mode enabled - */ - private double durationMultiplier; - /** - * Modifier which is applied on the recipe eut. Useful for GT++ machines - */ - private float eutModifier = 1; - /** - * Multiplier that is applied on the output chances - */ - private double chanceMultiplier = 1; - /** - * Multiplier by which the output will be multiplied - */ - private int outputMultiplier = 1; - /** - * Method for calculating max parallel from given inputs. - */ - private MaxParallelCalculator maxParallelCalculator = GT_Recipe::maxParallelCalculatedByInputs; - /** - * Method for consuming inputs after determining how many parallels it can execute. - */ - private InputConsumer inputConsumer = GT_Recipe::consumeInput; - - /** - * Calculator to use for overclocking - */ - private GT_OverclockCalculator calculator; - @Nonnull - private CheckRecipeResult result = CheckRecipeResultRegistry.NONE; - - private Function customItemOutputCalculation; - - private Function customFluidOutputCalculation; - - /** - * MuTE Mode this is a mode for changing how the GT_ParallelHelper works as Mutes don't use ItemStack and FluidStack - * arrays for inputs - */ - private boolean muteMode = false; - - public GT_ParallelHelper() {} - - /** - * Sets machine, with current configuration for void protection mode. - */ - @Nonnull - public GT_ParallelHelper setMachine(IVoidable machine) { - return setMachine(machine, machine.protectsExcessItem(), machine.protectsExcessFluid()); - } - - /** - * Sets machine, with void protection mode forcibly. - */ - @Nonnull - public GT_ParallelHelper setMachine(IVoidable machine, boolean protectExcessItem, boolean protectExcessFluid) { - this.protectExcessItem = protectExcessItem; - this.protectExcessFluid = protectExcessFluid; - this.machine = machine; - return this; - } - - /** - * Sets the recipe, which will be used for the parallel calculation - */ - @Nonnull - public GT_ParallelHelper setRecipe(@Nonnull GT_Recipe aRecipe) { - recipe = Objects.requireNonNull(aRecipe); - return this; - } - - @Nonnull - public GT_ParallelHelper setRecipeLocked(IRecipeLockable singleRecipeMachine, boolean isRecipeLocked) { - this.singleRecipeMachine = singleRecipeMachine; - this.isRecipeLocked = isRecipeLocked; - return this; - } - - /** - * Sets the items available for the recipe check - */ - @Nonnull - public GT_ParallelHelper setItemInputs(ItemStack... aItemInputs) { - this.itemInputs = aItemInputs; - return this; - } - - /** - * Sets the fluid inputs available for the recipe check - */ - @Nonnull - public GT_ParallelHelper setFluidInputs(FluidStack... aFluidInputs) { - this.fluidInputs = aFluidInputs; - return this; - } - - /** - * Sets the available eut when trying for more parallels - */ - @Nonnull - public GT_ParallelHelper setAvailableEUt(long aAvailableEUt) { - this.availableEUt = aAvailableEUt; - return this; - } - - /** - * Sets the modifier for recipe eut. 1 does nothing 0.9 is 10% less. 1.1 is 10% more - */ - @Nonnull - public GT_ParallelHelper setEUtModifier(float aEUtModifier) { - this.eutModifier = aEUtModifier; - return this; - } - - /** - * Sets the multiplier that is applied on output chances. 1 does nothing. 0.9 is 10% less. 1.1 is 10% more. - * Only useful for item outputs for sure. - */ - @Nonnull - public GT_ParallelHelper setChanceMultiplier(double chanceMultiplier) { - this.chanceMultiplier = chanceMultiplier; - return this; - } - - /** - * Sets the item/fluid output multiplier. 1 does nothing. 2 doubles the item and fluid outputs. - */ - @Nonnull - public GT_ParallelHelper setOutputMultiplier(int outputMultiplier) { - this.outputMultiplier = outputMultiplier; - return this; - } - - @Nonnull - public GT_ParallelHelper setCalculator(GT_OverclockCalculator calculator) { - this.calculator = calculator; - return this; - } - - /** - * Set if we should consume inputs or not when trying for parallels - * - * @param consume Should we consume inputs - */ - @Nonnull - public GT_ParallelHelper setConsumption(boolean consume) { - this.consume = consume; - return this; - } - - /** - * Sets the MaxParallel a multi can handle - */ - @Nonnull - public GT_ParallelHelper setMaxParallel(int maxParallel) { - this.maxParallel = maxParallel; - return this; - } - - /** - * Enables Batch mode. Can do up to an additional processed recipes of mCurrentParallel * mBatchModifier A batch - * modifier of 1 does nothing - */ - @Nonnull - public GT_ParallelHelper enableBatchMode(int batchModifier) { - this.batchMode = batchModifier > 1; - this.batchModifier = batchModifier; - return this; - } - - /** - * Sets if we should calculate outputs with the parallels we found or not - * - * @param calculateOutputs Should we calculate outputs with the helper or not - */ - @Nonnull - public GT_ParallelHelper setOutputCalculation(boolean calculateOutputs) { - this.calculateOutputs = calculateOutputs; - return this; - } - - /** - * Set a custom way to calculate item outputs. You are given the amount of parallels and must return an ItemStack - * array - */ - @Nonnull - public GT_ParallelHelper setCustomItemOutputCalculation(Function custom) { - customItemOutputCalculation = custom; - return this; - } - - /** - * Set a custom way to calculate item outputs. You are given the amount of parallels and must return a FluidStack - * array - */ - @Nonnull - public GT_ParallelHelper setCustomFluidOutputCalculation(Function custom) { - customFluidOutputCalculation = custom; - return this; - } - - @Nonnull - public GT_ParallelHelper setMuTEMode(boolean muteMode) { - this.muteMode = muteMode; - return this; - } - - @Nonnull - public GT_ParallelHelper setItemInputInventory(ItemInventoryLogic itemInputInventory) { - this.itemInputInventory = itemInputInventory; - return this; - } - - @Nonnull - public GT_ParallelHelper setFluidInputInventory(FluidInventoryLogic fluidInputInventory) { - this.fluidInputInventory = fluidInputInventory; - return this; - } - - /** - * Sets method for calculating max parallel from given inputs. - */ - public GT_ParallelHelper setMaxParallelCalculator(MaxParallelCalculator maxParallelCalculator) { - this.maxParallelCalculator = maxParallelCalculator; - return this; - } - - /** - * Sets method for consuming inputs after determining how many parallels it can execute. - */ - public GT_ParallelHelper setInputConsumer(InputConsumer inputConsumer) { - this.inputConsumer = inputConsumer; - return this; - } - - @Nonnull - public GT_ParallelHelper setItemOutputInventory(ItemInventoryLogic itemOutputInventory) { - this.itemOutputInventory = itemOutputInventory; - return this; - } - - @Nonnull - public GT_ParallelHelper setFluidOutputInventory(FluidInventoryLogic fluidOutputInventory) { - this.fluidOutputInventory = fluidOutputInventory; - return this; - } - - /** - * Finishes the GT_ParallelHelper. Anything changed after this will not effect anything - */ - @Nonnull - public GT_ParallelHelper build() { - if (built) { - throw new IllegalStateException("Tried to build twice"); - } - if (recipe == null) { - throw new IllegalStateException("Recipe is not set"); - } - built = true; - determineParallel(); - return this; - } - - /** - * @return The current parallels possible by the multiblock - */ - public int getCurrentParallel() { - if (!built) { - throw new IllegalStateException("Tried to get parallels before building"); - } - return currentParallel; - } - - /** - * @return The duration multiplier if batch mode was enabled for the multiblock - */ - public double getDurationMultiplierDouble() { - if (!built) { - throw new IllegalStateException("Tried to get duration multiplier before building"); - } - if (batchMode && durationMultiplier > 0) { - return durationMultiplier; - } - return 1; - } - - /** - * @return The ItemOutputs from the recipe - */ - @Nonnull - public ItemStack[] getItemOutputs() { - if (!built || !calculateOutputs) { - throw new IllegalStateException( - "Tried to get item outputs before building or without enabling calculation of outputs"); - } - return itemOutputs; - } - - /** - * @return The FluidOutputs from the recipe - */ - @Nonnull - public FluidStack[] getFluidOutputs() { - if (!built || !calculateOutputs) { - throw new IllegalStateException( - "Tried to get fluid outputs before building or without enabling calculation of outputs"); - } - return fluidOutputs; - } - - /** - * @return The result of why a recipe could've failed or succeeded - */ - @Nonnull - public CheckRecipeResult getResult() { - if (!built) { - throw new IllegalStateException("Tried to get recipe result before building"); - } - return result; - } - - /** - * Called by build(). Determines the parallels and everything else that needs to be done at build time - */ - protected void determineParallel() { - if (maxParallel <= 0) { - return; - } - if (itemInputs == null) { - itemInputs = new ItemStack[0]; - } - if (fluidInputs == null) { - fluidInputs = new FluidStack[0]; - } - - if (!consume) { - copyInputs(); - } - - if (calculator == null) { - calculator = new GT_OverclockCalculator().setEUt(availableEUt) - .setRecipeEUt(recipe.mEUt) - .setDuration(recipe.mDuration) - .setEUtDiscount(eutModifier); - } - - final int tRecipeEUt = (int) Math.ceil(recipe.mEUt * eutModifier); - if (availableEUt < tRecipeEUt) { - result = CheckRecipeResultRegistry.insufficientPower(tRecipeEUt); - return; - } - - // Save the original max parallel before calculating our overclocking under 1 tick - int originalMaxParallel = maxParallel; - calculator.setParallel(originalMaxParallel); - double tickTimeAfterOC = calculator.calculateDurationUnderOneTick(); - if (tickTimeAfterOC < 1) { - maxParallel = GT_Utility.safeInt((long) (maxParallel / tickTimeAfterOC), 0); - } - - int maxParallelBeforeBatchMode = maxParallel; - if (batchMode) { - maxParallel = GT_Utility.safeInt((long) maxParallel * batchModifier, 0); - } - - final ItemStack[] truncatedItemOutputs = recipe.mOutputs != null - ? Arrays.copyOfRange(recipe.mOutputs, 0, Math.min(machine.getItemOutputLimit(), recipe.mOutputs.length)) - : new ItemStack[0]; - final FluidStack[] truncatedFluidOutputs = recipe.mFluidOutputs != null ? Arrays - .copyOfRange(recipe.mFluidOutputs, 0, Math.min(machine.getFluidOutputLimit(), recipe.mFluidOutputs.length)) - : new FluidStack[0]; - - SingleRecipeCheck recipeCheck = null; - SingleRecipeCheck.Builder tSingleRecipeCheckBuilder = null; - if (isRecipeLocked && singleRecipeMachine != null) { - recipeCheck = singleRecipeMachine.getSingleRecipeCheck(); - if (recipeCheck == null) { - // Machine is configured to lock to a single recipe, but haven't built the recipe checker yet. - // Build the checker on next successful recipe. - RecipeMap recipeMap = singleRecipeMachine.getRecipeMap(); - if (recipeMap != null) { - tSingleRecipeCheckBuilder = SingleRecipeCheck.builder(recipeMap) - .setBefore(itemInputs, fluidInputs); - } - } - } - - // Let's look at how many parallels we can get with void protection - if (protectExcessItem || protectExcessFluid) { - if (machine == null && !muteMode) { - throw new IllegalStateException("Tried to calculate void protection, but machine is not set"); - } - VoidProtectionHelper voidProtectionHelper = new VoidProtectionHelper(); - voidProtectionHelper.setMachine(machine) - .setItemOutputs(truncatedItemOutputs) - .setFluidOutputs(truncatedFluidOutputs) - .setChangeGetter(recipe::getOutputChance) - .setOutputMultiplier(outputMultiplier) - .setChanceMultiplier(chanceMultiplier) - .setMaxParallel(maxParallel) - .setItemOutputInventory(itemOutputInventory) - .setFluidOutputInventory(fluidOutputInventory) - .setMuTEMode(muteMode) - .build(); - maxParallel = Math.min(voidProtectionHelper.getMaxParallel(), maxParallel); - if (voidProtectionHelper.isItemFull()) { - result = CheckRecipeResultRegistry.ITEM_OUTPUT_FULL; - return; - } - if (voidProtectionHelper.isFluidFull()) { - result = CheckRecipeResultRegistry.FLUID_OUTPUT_FULL; - return; - } - } - - maxParallelBeforeBatchMode = Math.min(maxParallel, maxParallelBeforeBatchMode); - - // determine normal parallel - int actualMaxParallel = tRecipeEUt > 0 ? (int) Math.min(maxParallelBeforeBatchMode, availableEUt / tRecipeEUt) - : maxParallelBeforeBatchMode; - if (recipeCheck != null) { - currentParallel = recipeCheck.checkRecipeInputs(true, actualMaxParallel, itemInputs, fluidInputs); - } else { - currentParallel = (int) maxParallelCalculator.calculate(recipe, actualMaxParallel, fluidInputs, itemInputs); - if (currentParallel > 0) { - if (tSingleRecipeCheckBuilder != null) { - // If recipe checker is not built yet, build and set it - inputConsumer.consume(recipe, 1, fluidInputs, itemInputs); - SingleRecipeCheck builtCheck = tSingleRecipeCheckBuilder.setAfter(itemInputs, fluidInputs) - .setRecipe(recipe) - .build(); - singleRecipeMachine.setSingleRecipeCheck(builtCheck); - inputConsumer.consume(recipe, currentParallel - 1, fluidInputs, itemInputs); - } else { - inputConsumer.consume(recipe, currentParallel, fluidInputs, itemInputs); - } - } - } - - if (currentParallel <= 0) { - result = CheckRecipeResultRegistry.INTERNAL_ERROR; - return; - } - - calculator.setCurrentParallel(currentParallel) - .calculate(); - // If Batch Mode is enabled determine how many extra parallels we can get - if (batchMode && currentParallel > 0 && calculator.getDuration() < MAX_BATCH_MODE_TICK_TIME) { - int tExtraParallels; - double batchMultiplierMax = MAX_BATCH_MODE_TICK_TIME / calculator.getDuration(); - final int maxExtraParallels = (int) Math.floor( - Math.min( - currentParallel * Math.min(batchMultiplierMax - 1, batchModifier - 1), - maxParallel - currentParallel)); - if (recipeCheck != null) { - tExtraParallels = recipeCheck.checkRecipeInputs(true, maxExtraParallels, itemInputs, fluidInputs); - } else { - tExtraParallels = (int) maxParallelCalculator - .calculate(recipe, maxExtraParallels, fluidInputs, itemInputs); - inputConsumer.consume(recipe, tExtraParallels, fluidInputs, itemInputs); - } - durationMultiplier = 1.0f + (float) tExtraParallels / currentParallel; - currentParallel += tExtraParallels; - } - - // If we want to calculate outputs we do it here - if (calculateOutputs && currentParallel > 0) { - calculateItemOutputs(truncatedItemOutputs); - calculateFluidOutputs(truncatedFluidOutputs); - } - result = CheckRecipeResultRegistry.SUCCESSFUL; - } - - protected void copyInputs() { - ItemStack[] itemInputsToUse; - FluidStack[] fluidInputsToUse; - itemInputsToUse = new ItemStack[itemInputs.length]; - for (int i = 0; i < itemInputs.length; i++) { - itemInputsToUse[i] = itemInputs[i].copy(); - } - fluidInputsToUse = new FluidStack[fluidInputs.length]; - for (int i = 0; i < fluidInputs.length; i++) { - fluidInputsToUse[i] = fluidInputs[i].copy(); - } - itemInputs = itemInputsToUse; - fluidInputs = fluidInputsToUse; - } - - private void calculateItemOutputs(ItemStack[] truncatedItemOutputs) { - if (customItemOutputCalculation != null) { - itemOutputs = customItemOutputCalculation.apply(currentParallel); - return; - } - if (truncatedItemOutputs.length == 0) return; - ArrayList itemOutputsList = new ArrayList<>(); - for (int i = 0; i < truncatedItemOutputs.length; i++) { - if (recipe.getOutput(i) == null) continue; - ItemStack origin = recipe.getOutput(i) - .copy(); - final long itemStackSize = origin.stackSize; - double chancedOutputMultiplier = calculateChancedOutputMultiplier( - (int) (recipe.getOutputChance(i) * chanceMultiplier), - currentParallel); - long items = (long) Math.ceil(itemStackSize * chancedOutputMultiplier * outputMultiplier); - addItemsLong(itemOutputsList, origin, items); - } - itemOutputs = itemOutputsList.toArray(new ItemStack[0]); - } - - private void calculateFluidOutputs(FluidStack[] truncatedFluidOutputs) { - if (customFluidOutputCalculation != null) { - fluidOutputs = customFluidOutputCalculation.apply(currentParallel); - return; - } - if (truncatedFluidOutputs.length == 0) return; - ArrayList fluidOutputsList = new ArrayList<>(); - for (int i = 0; i < truncatedFluidOutputs.length; i++) { - if (recipe.getFluidOutput(i) == null) continue; - FluidStack origin = recipe.getFluidOutput(i) - .copy(); - long fluids = (long) this.outputMultiplier * origin.amount * currentParallel; - - addFluidsLong(fluidOutputsList, origin, fluids); - } - fluidOutputs = fluidOutputsList.toArray(new FluidStack[0]); - } - - private static final Random rand = new Random(); - - public static double calculateChancedOutputMultiplier(int chanceInt, int parallel) { - // Multiply the integer part of the chance directly with parallel - double multiplier = Math.floorDiv(chanceInt, 10000) * parallel; - int transformedChanceInt = chanceInt % 10000; - if (transformedChanceInt == 0) return multiplier; - // Calculation of the Decimal Part of chance - double chance = transformedChanceInt / 10000.0; - double mean = parallel * chance; - double stdDev = Math.sqrt(parallel * chance * (1 - chance)); - // Check if everything within 3 standard deviations of mean is within the range - // of possible values (0 ~ currentParallel) - boolean isSuitableForFittingWithNormalDistribution = mean - 3 * stdDev >= 0 && mean + 3 * stdDev <= parallel; - if (isSuitableForFittingWithNormalDistribution) { - // Use Normal Distribution to fit Binomial Distribution - double tMultiplier = stdDev * rand.nextGaussian() + mean; - multiplier += Math.max(Math.min(tMultiplier, parallel), 0); - } else { - // Do Binomial Distribution by loop - for (int roll = 0; roll < parallel; roll++) { - if (transformedChanceInt > XSTR.XSTR_INSTANCE.nextInt(10000)) { - multiplier += 1; - } - } - } - return multiplier; - } - - public static void addItemsLong(ArrayList itemList, ItemStack origin, long amount) { - if (amount > 0) { - while (amount > Integer.MAX_VALUE) { - ItemStack item = origin.copy(); - item.stackSize = Integer.MAX_VALUE; - itemList.add(item); - amount -= Integer.MAX_VALUE; - } - ItemStack item = origin.copy(); - item.stackSize = (int) amount; - itemList.add(item); - } - } - - public static void addFluidsLong(ArrayList fluidList, FluidStack origin, long amount) { - if (amount > 0) { - while (amount > Integer.MAX_VALUE) { - FluidStack fluid = origin.copy(); - fluid.amount = Integer.MAX_VALUE; - fluidList.add(fluid); - amount -= Integer.MAX_VALUE; - } - FluidStack fluid = origin.copy(); - fluid.amount = (int) amount; - fluidList.add(fluid); - } - } - - @FunctionalInterface - public interface MaxParallelCalculator { - - double calculate(GT_Recipe recipe, int maxParallel, FluidStack[] fluids, ItemStack[] items); - } - - @FunctionalInterface - public interface InputConsumer { - - void consume(GT_Recipe recipe, int amountMultiplier, FluidStack[] aFluidInputs, ItemStack[] aInputs); - } -} diff --git a/src/main/java/gregtech/api/util/GT_PlayedSound.java b/src/main/java/gregtech/api/util/GT_PlayedSound.java deleted file mode 100644 index 8604d9b81f..0000000000 --- a/src/main/java/gregtech/api/util/GT_PlayedSound.java +++ /dev/null @@ -1,31 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.util.ResourceLocation; - -public class GT_PlayedSound { - - public final String mSoundName; - public final int mX, mY, mZ; - - public GT_PlayedSound(ResourceLocation aSoundResourceLocation, double aX, double aY, double aZ) { - mSoundName = aSoundResourceLocation.toString(); - mX = (int) aX; - mY = (int) aY; - mZ = (int) aZ; - } - - @Override - public boolean equals(Object aObject) { - if (aObject instanceof GT_PlayedSound) { - return ((GT_PlayedSound) aObject).mX == mX && ((GT_PlayedSound) aObject).mY == mY - && ((GT_PlayedSound) aObject).mZ == mZ - && ((GT_PlayedSound) aObject).mSoundName.equals(mSoundName); - } - return false; - } - - @Override - public int hashCode() { - return mX + mY + mZ + mSoundName.hashCode(); - } -} diff --git a/src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java b/src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java deleted file mode 100644 index ead9393d0e..0000000000 --- a/src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java +++ /dev/null @@ -1,51 +0,0 @@ -package gregtech.api.util; - -import java.util.HashMap; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.SoundResource; -import gregtech.api.recipe.RecipeMap; - -@Deprecated -public class GT_ProcessingArray_Manager { - - private static final HashMap> mRecipeSaves = new HashMap<>(); - private static final HashMap machineSounds = new HashMap<>(); - - // Adds recipe Maps to the PA using the machines unlocalized name. - // Example: basicmachine.electrolyzer, with its recipe map will add the electrolyzer's recipe map to the PA - public static void addRecipeMapToPA(String aMachineName, RecipeMap aMap) { - if (aMachineName != null) { - mRecipeSaves.put(aMachineName, aMap); - } - } - - // Allows the PA to extract the recipe map for the machine inside it. - public static RecipeMap giveRecipeMap(String aMachineName) { - if (aMachineName != null) { - return mRecipeSaves.get(aMachineName); - } - return null; - } - - public static void addSoundResourceToPA(String machineName, SoundResource soundResource) { - if (machineName != null) { - machineSounds.put(machineName, soundResource); - } - } - - public static SoundResource getSoundResource(String machineName) { - if (machineName != null) { - return machineSounds.get(machineName); - } - return null; - } - - public static String getMachineName(ItemStack stack) { - int length = stack.getUnlocalizedName() - .length(); - return stack.getUnlocalizedName() - .substring(17, length - 8); // trim "gt.blockmachines." and ".tier.xx" - } -} diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java deleted file mode 100644 index c0812dcaef..0000000000 --- a/src/main/java/gregtech/api/util/GT_Recipe.java +++ /dev/null @@ -1,1366 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.D2; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.ModContainer; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.logic.FluidInventoryLogic; -import gregtech.api.logic.ItemInventoryLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeCategory; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.RecipeMetadataKey; -import gregtech.api.recipe.metadata.EmptyRecipeMetadataStorage; -import gregtech.api.recipe.metadata.IRecipeMetadataStorage; -import gregtech.api.util.extensions.ArrayExt; -import gregtech.api.util.item.ItemHolder; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME; -import ic2.core.Ic2Items; -import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import it.unimi.dsi.fastutil.objects.Reference2LongArrayMap; -import it.unimi.dsi.fastutil.objects.Reference2LongMap; -import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap; - -public class GT_Recipe implements Comparable { - - private static ItemStack dataStick; - private static ItemStack dataOrb; - private static ItemStack ic2FluidCell; - - public static void setItemStacks() { - ic2FluidCell = Ic2Items.FluidCell.copy(); - dataStick = ItemList.Tool_DataStick.get(1L); - dataOrb = ItemList.Tool_DataOrb.get(1L); - } - - /** - * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs, - * please add a new Recipe, because of the HashMaps. - */ - public ItemStack[] mInputs, mOutputs; - /** - * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs, - * please add a new Recipe, because of the HashMaps. - */ - public FluidStack[] mFluidInputs, mFluidOutputs; - /** - * If you changed the amount of Array-Items inside the Output Array then the length of this Array must be larger or - * equal to the Output Array. A chance of 10000 equals 100% - */ - public int[] mChances; - /** - * An Item that needs to be inside the Special Slot, like for example the Copy Slot inside the Printer. This is only - * useful for Fake Recipes in NEI, since findRecipe() and containsInput() don't give a shit about this Field. Lists - * are also possible. - */ - public Object mSpecialItems; - - public int mDuration, mEUt, mSpecialValue; - /** - * Use this to just disable a specific Recipe, but the Configuration enables that already for every single Recipe. - */ - public boolean mEnabled = true; - /** - * If this Recipe is hidden from NEI - */ - public boolean mHidden = false; - /** - * If this Recipe is Fake and therefore doesn't get found by the findRecipe Function (It is still in the HashMaps, - * so that containsInput does return T on those fake Inputs) - */ - public boolean mFakeRecipe = false; - /** - * If this Recipe can be stored inside a Machine in order to make Recipe searching more Efficient by trying the - * previously used Recipe first. In case you have a Recipe Map overriding things and returning one time use Recipes, - * you have to set this to F. - */ - public boolean mCanBeBuffered = true; - /** - * If this Recipe needs the Output Slots to be completely empty. Needed in case you have randomised Outputs - */ - public boolean mNeedsEmptyOutput = false; - /** - * If this is set to true, NBT equality is required for recipe check. - */ - public boolean isNBTSensitive = false; - /** - * Used for describing recipes that do not fit the default recipe pattern (for example Large Boiler Fuels) - */ - private String[] neiDesc = null; - /** - * Holds a set of metadata for this recipe. - */ - @Nonnull - private final IRecipeMetadataStorage metadataStorage; - /** - * Category this recipe belongs to. Recipes belonging to recipemap are forced to have non-null category when added, - * otherwise it can be null. - */ - private RecipeCategory recipeCategory; - /** - * Stores which mod added this recipe - */ - public List owners = new ArrayList<>(); - /** - * Stores stack traces where this recipe was added - */ - // BW wants to overwrite it, so no final - public List> stackTraces = new ArrayList<>(); - - /** Used for simple cache validation */ - private ItemStack[] inputsAtCacheTime = null; - /** Unified and type-merged stacks of mInputs, each item is guaranteed to be unique */ - private RecipeItemInput[] mergedInputCache = null; - private static final RecipeItemInput[] EMPTY_INPUT_CACHE = new RecipeItemInput[0]; - - /** A single recipe input, used for an internal cache to speed up recipe matching */ - public static final class RecipeItemInput { - - /** Item count is ignored on this stack, do not mutate it either */ - public final ItemStack unifiedStack; - /** Number of input items required */ - public long inputAmount; - /** True if the input is NBT-sensitive */ - public final boolean usesNbtMatching; - - public RecipeItemInput(ItemStack stack, boolean recipeIsNBTSensitive) { - Objects.requireNonNull(stack); - this.inputAmount = stack.stackSize; - final boolean stackNeedsNBT = GT_Recipe.shouldCheckNBT(stack); - this.usesNbtMatching = recipeIsNBTSensitive | stackNeedsNBT; - if (stackNeedsNBT) { - this.unifiedStack = stack; - } else { - this.unifiedStack = GT_OreDictUnificator.get_nocopy(true, stack); - if (!this.usesNbtMatching) { - this.unifiedStack.setTagCompound(null); - } - } - } - - /** - * @return True if the passed in stack is of the same item type as this input (respecting - * {@link RecipeItemInput#usesNbtMatching}). - */ - public boolean matchesType(final ItemStack other) { - return GT_Utility.areStacksEqual(this.unifiedStack, other, !usesNbtMatching); - } - - /** - * @return True if the given input+oredict data for that input can be used as a valid recipe ingredient. - */ - public boolean matchesRecipe(final ItemData oredictOther, final ItemStack other) { - if (usesNbtMatching) { - return GT_Utility.areStacksEqual(this.unifiedStack, other, false); - } else { - return GT_OreDictUnificator.isInputStackEqual(other, oredictOther, unifiedStack); - } - } - } - - private GT_Recipe(GT_Recipe aRecipe, boolean shallow) { - mInputs = shallow ? aRecipe.mInputs : GT_Utility.copyItemArray(aRecipe.mInputs); - mOutputs = shallow ? aRecipe.mOutputs : GT_Utility.copyItemArray(aRecipe.mOutputs); - mSpecialItems = aRecipe.mSpecialItems; - mChances = aRecipe.mChances; - mFluidInputs = shallow ? aRecipe.mFluidInputs : GT_Utility.copyFluidArray(aRecipe.mFluidInputs); - mFluidOutputs = shallow ? aRecipe.mFluidOutputs : GT_Utility.copyFluidArray(aRecipe.mFluidOutputs); - mDuration = aRecipe.mDuration; - mSpecialValue = aRecipe.mSpecialValue; - mEUt = aRecipe.mEUt; - mNeedsEmptyOutput = aRecipe.mNeedsEmptyOutput; - isNBTSensitive = aRecipe.isNBTSensitive; - mCanBeBuffered = aRecipe.mCanBeBuffered; - mFakeRecipe = aRecipe.mFakeRecipe; - mEnabled = aRecipe.mEnabled; - mHidden = aRecipe.mHidden; - metadataStorage = EmptyRecipeMetadataStorage.INSTANCE; - owners = new ArrayList<>(aRecipe.owners); - reloadOwner(); - } - - /** - * Only for {@link GT_RecipeBuilder}. - */ - GT_Recipe(ItemStack[] mInputs, ItemStack[] mOutputs, FluidStack[] mFluidInputs, FluidStack[] mFluidOutputs, - int[] mChances, Object mSpecialItems, int mDuration, int mEUt, int mSpecialValue, boolean mEnabled, - boolean mHidden, boolean mFakeRecipe, boolean mCanBeBuffered, boolean mNeedsEmptyOutput, boolean nbtSensitive, - String[] neiDesc, @Nullable IRecipeMetadataStorage metadataStorage, RecipeCategory recipeCategory) { - this.mInputs = mInputs; - this.mOutputs = mOutputs; - this.mFluidInputs = mFluidInputs; - this.mFluidOutputs = mFluidOutputs; - this.mChances = mChances; - this.mSpecialItems = mSpecialItems; - this.mDuration = mDuration; - this.mEUt = mEUt; - this.mSpecialValue = mSpecialValue; - this.mEnabled = mEnabled; - this.mHidden = mHidden; - this.mFakeRecipe = mFakeRecipe; - this.mCanBeBuffered = mCanBeBuffered; - this.mNeedsEmptyOutput = mNeedsEmptyOutput; - this.isNBTSensitive = nbtSensitive; - this.neiDesc = neiDesc; - this.metadataStorage = metadataStorage == null ? EmptyRecipeMetadataStorage.INSTANCE : metadataStorage.copy(); - this.recipeCategory = recipeCategory; - - reloadOwner(); - } - - public GT_Recipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances, - FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) { - if (aInputs == null) aInputs = new ItemStack[0]; - if (aOutputs == null) aOutputs = new ItemStack[0]; - if (aFluidInputs == null) aFluidInputs = new FluidStack[0]; - if (aFluidOutputs == null) aFluidOutputs = new FluidStack[0]; - if (aChances == null) aChances = new int[aOutputs.length]; - if (aChances.length < aOutputs.length) aChances = Arrays.copyOf(aChances, aOutputs.length); - - aInputs = ArrayExt.withoutTrailingNulls(aInputs, ItemStack[]::new); - aOutputs = ArrayExt.withoutTrailingNulls(aOutputs, ItemStack[]::new); - aFluidInputs = ArrayExt.withoutNulls(aFluidInputs, FluidStack[]::new); - aFluidOutputs = ArrayExt.withoutNulls(aFluidOutputs, FluidStack[]::new); - - GT_OreDictUnificator.setStackArray(true, aInputs); - GT_OreDictUnificator.setStackArray(true, aOutputs); - - for (ItemStack tStack : aOutputs) GT_Utility.updateItemStack(tStack); - - for (int i = 0; i < aChances.length; i++) if (aChances[i] <= 0) aChances[i] = 10000; - for (int i = 0; i < aFluidInputs.length; i++) aFluidInputs[i] = aFluidInputs[i].copy(); - for (int i = 0; i < aFluidOutputs.length; i++) aFluidOutputs[i] = aFluidOutputs[i].copy(); - - if (aOptimize && aDuration >= 32) { - ArrayList tList = new ArrayList<>(); - tList.addAll(Arrays.asList(aInputs)); - tList.addAll(Arrays.asList(aOutputs)); - for (int i = 0; i < tList.size(); i++) if (tList.get(i) == null) tList.remove(i--); - - for (byte i = (byte) Math.min(64, aDuration / 16); i > 1; i--) if (aDuration / i >= 16) { - boolean temp = true; - for (ItemStack stack : tList) if (stack.stackSize % i != 0) { - temp = false; - break; - } - if (temp) for (FluidStack aFluidInput : aFluidInputs) if (aFluidInput.amount % i != 0) { - temp = false; - break; - } - if (temp) for (FluidStack aFluidOutput : aFluidOutputs) if (aFluidOutput.amount % i != 0) { - temp = false; - break; - } - if (temp) { - for (ItemStack itemStack : tList) itemStack.stackSize /= i; - for (FluidStack aFluidInput : aFluidInputs) aFluidInput.amount /= i; - for (FluidStack aFluidOutput : aFluidOutputs) aFluidOutput.amount /= i; - aDuration /= i; - } - } - } - - mInputs = aInputs; - mOutputs = aOutputs; - mSpecialItems = aSpecialItems; - mChances = aChances; - mFluidInputs = aFluidInputs; - mFluidOutputs = aFluidOutputs; - mDuration = aDuration; - mSpecialValue = aSpecialValue; - mEUt = aEUt; - metadataStorage = EmptyRecipeMetadataStorage.INSTANCE; - // checkCellBalance(); - reloadOwner(); - } - - // aSpecialValue = EU per Liter! If there is no Liquid for this Object, then it gets multiplied with 1000! - public GT_Recipe(ItemStack aInput1, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4, - int aSpecialValue, int aType) { - this( - true, - new ItemStack[] { aInput1 }, - new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4 }, - null, - null, - null, - null, - 0, - 0, - Math.max(1, aSpecialValue)); - - if (mInputs.length > 0 && aSpecialValue > 0) { - switch (aType) { - // Diesel Generator - case 0 -> { - RecipeMaps.dieselFuels.addRecipe(this); - RecipeMaps.largeBoilerFakeFuels.getBackend() - .addDieselRecipe(this); - } - // Gas Turbine - case 1 -> RecipeMaps.gasTurbineFuels.addRecipe(this); - - // Thermal Generator - case 2 -> RecipeMaps.hotFuels.addRecipe(this); - - // Plasma Generator - case 4 -> RecipeMaps.plasmaFuels.addRecipe(this); - - // Magic Generator - case 5 -> RecipeMaps.magicFuels.addRecipe(this); - - // Fluid Generator. Usually 3. Every wrong Type ends up in the Semifluid Generator - default -> { - RecipeMaps.denseLiquidFuels.addRecipe(this); - RecipeMaps.largeBoilerFakeFuels.getBackend() - .addDenseLiquidRecipe(this); - } - } - } - } - - // Dummy GT_Recipe maker... - public GT_Recipe(ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances, - FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) { - this( - true, - aInputs, - aOutputs, - aSpecialItems, - aChances, - aFluidInputs, - aFluidOutputs, - aDuration, - aEUt, - aSpecialValue); - } - - /** - * Re-unificates all the items present in recipes. - */ - public static void reInit() { - GT_Log.out.println("GT_Mod: Re-Unificating Recipes."); - for (RecipeMap map : RecipeMap.ALL_RECIPE_MAPS.values()) { - map.getBackend() - .reInit(); - } - } - - public ItemStack getRepresentativeInput(int aIndex) { - if (aIndex < 0 || aIndex >= mInputs.length) return null; - return GT_Utility.copyOrNull(mInputs[aIndex]); - } - - public ItemStack getOutput(int aIndex) { - if (aIndex < 0 || aIndex >= mOutputs.length) return null; - return GT_Utility.copyOrNull(mOutputs[aIndex]); - } - - /** - * Dictates the ItemStacks displayed in the output slots of any NEI page handled by the default GT NEI handler. - * Override to make shown items differ from a GT_Recipe's item output array - * - * @see gregtech.nei.GT_NEI_DefaultHandler - * @param i Slot index - * @return ItemStack to be displayed in the slot - */ - public ItemStack getRepresentativeOutput(int i) { - return getOutput(i); - } - - public int getOutputChance(int aIndex) { - if (mChances == null) return 10000; - if (aIndex < 0 || aIndex >= mChances.length) return 10000; - return mChances[aIndex]; - } - - public FluidStack getRepresentativeFluidInput(int aIndex) { - if (aIndex < 0 || aIndex >= mFluidInputs.length || mFluidInputs[aIndex] == null) return null; - return mFluidInputs[aIndex].copy(); - } - - public FluidStack getFluidOutput(int aIndex) { - if (aIndex < 0 || aIndex >= mFluidOutputs.length || mFluidOutputs[aIndex] == null) return null; - return mFluidOutputs[aIndex].copy(); - } - - public void checkCellBalance() { - if (!D2 || mInputs.length < 1) return; - - int tInputAmount = GT_ModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(mInputs); - int tOutputAmount = GT_ModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(mOutputs); - - if (tInputAmount < tOutputAmount) { - if (!Materials.Tin.contains(mInputs)) { - GT_Log.err.println("You get more Cells, than you put in? There must be something wrong."); - new Exception().printStackTrace(GT_Log.err); - } - } else if (tInputAmount > tOutputAmount) { - if (!Materials.Tin.contains(mOutputs)) { - GT_Log.err.println("You get less Cells, than you put in? GT Machines usually don't destroy Cells."); - new Exception().printStackTrace(GT_Log.err); - } - } - } - - public GT_Recipe copy() { - return new GT_Recipe(this, false); - } - - public GT_Recipe copyShallow() { - return new GT_Recipe(this, true); - } - - public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, FluidStack[] aFluidInputs, - ItemStack... aInputs) { - return isRecipeInputEqual(aDecreaseStacksizeBySuccess, false, 1, aFluidInputs, aInputs); - } - - // For non-multiplied recipe amount values - public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, boolean aDontCheckStackSizes, - FluidStack[] aFluidInputs, ItemStack... aInputs) { - return isRecipeInputEqual(aDecreaseStacksizeBySuccess, aDontCheckStackSizes, 1, aFluidInputs, aInputs); - } - - /** - * Okay, did some code archeology to figure out what's going on here. - * - *

- * This variable was added in this - * commit, in order to fix the issues mentioned in the PR. - * - *

- * It looks like it controls checking NBT. At this point, since we are still using universal fluid cells which store - * their fluids in NBT, it probably will not be safe to disable the NBT checks in the near future. Data sticks may - * be another case. Anyway, we probably can't get rid of this without some significant changes to clean up recipe - * inputs. - */ - public static boolean GTppRecipeHelper; - - /** - * @return Computes a (cached) array of all input items, combined by type into stacks. Do not mutate. - */ - private @NotNull RecipeItemInput @NotNull [] getCachedCombinedItemInputs() { - if (mergedInputCache != null) { - if (mInputs != inputsAtCacheTime) { - throw new IllegalStateException( - "Inputs to this recipe have been modified since first recipe match: " + this); - } - return mergedInputCache; - } - - synchronized (this) { - // In case another thread initialized it while this synchronized block was locked: - if (mergedInputCache != null) { - if (mInputs != inputsAtCacheTime) { - throw new IllegalStateException( - "Inputs to this recipe have been modified since first recipe match: " + this); - } - return mergedInputCache; - } - - final ItemStack[] inputs = mInputs; - inputsAtCacheTime = inputs; - if (inputs == null || inputs.length == 0) { - mergedInputCache = EMPTY_INPUT_CACHE; - return mergedInputCache; - } - final ObjectArrayList<@NotNull RecipeItemInput> newCache = ObjectArrayList - .wrap(new RecipeItemInput[inputs.length], 0); - for (final ItemStack itemStack : inputs) { - if (itemStack == null) continue; - final RecipeItemInput existingInput = newCache.stream() - .filter(existing -> existing.matchesType(itemStack)) - .findAny() - .orElse(null); - if (existingInput == null) { - newCache.add(new RecipeItemInput(itemStack, isNBTSensitive)); - } else { - existingInput.inputAmount = Math.addExact(existingInput.inputAmount, itemStack.stackSize); - } - } - final RecipeItemInput[] frozenCache = newCache.toArray(new RecipeItemInput[0]); - if (GregTech_API.sFullLoadFinished) { - mergedInputCache = frozenCache; - } - return frozenCache; - } - } - - /** - * WARNING: Do not call this method with both {@code aDecreaseStacksizeBySuccess} and {@code aDontCheckStackSizes} - * set to {@code true}! You'll get weird behavior. - */ - public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, boolean aDontCheckStackSizes, - int amountMultiplier, FluidStack[] aFluidInputs, ItemStack... aInputs) { - double maxParallel = maxParallelCalculatedByInputs(amountMultiplier, aFluidInputs, aInputs); - if (aDontCheckStackSizes) { - return maxParallel > 0; - } else if (maxParallel >= amountMultiplier) { - if (aDecreaseStacksizeBySuccess) { - consumeInput(amountMultiplier, aFluidInputs, aInputs); - } - return true; - } - return false; - } - - /** - * WARNING: Ensure that item inputs and fluid inputs are enough to be consumed with - * {@link #maxParallelCalculatedByInputs} before calling this method! - */ - public void consumeInput(int amountMultiplier, FluidStack[] aFluidInputs, ItemStack... aInputs) { - if (amountMultiplier <= 0) return; - - if (aFluidInputs != null) { - for (FluidStack recipeFluidCost : mFluidInputs) { - if (recipeFluidCost != null) { - long remainingCost = (long) recipeFluidCost.amount * amountMultiplier; - - for (FluidStack providedFluid : aFluidInputs) { - if (providedFluid != null && providedFluid.isFluidEqual(recipeFluidCost)) { - if (providedFluid.amount >= remainingCost) { - providedFluid.amount -= remainingCost; - break; - } else { - remainingCost -= providedFluid.amount; - providedFluid.amount = 0; - } - } - } - } - } - } - - if (aInputs == null || aInputs.length == 0) { - return; - } - - final ItemData[] unifiedProvidedInputs = new ItemData[aInputs.length]; - for (int i = 0; i < aInputs.length; i++) { - unifiedProvidedInputs[i] = GT_OreDictUnificator.getAssociation(aInputs[i]); - } - final @NotNull RecipeItemInput @NotNull [] combinedInputs = getCachedCombinedItemInputs(); - - for (final RecipeItemInput recipeItemCost : combinedInputs) { - long remainingCost = recipeItemCost.inputAmount * amountMultiplier; - - for (int iProvided = 0; iProvided < aInputs.length && remainingCost > 0; iProvided++) { - final ItemStack providedItem = aInputs[iProvided]; - if (providedItem == null || providedItem.stackSize == 0) { - continue; - } - - final ItemData providedUnifiedItem = unifiedProvidedInputs[iProvided]; - if (!recipeItemCost.matchesRecipe(providedUnifiedItem, providedItem)) { - continue; - } - - if (providedItem.stackSize >= remainingCost) { - providedItem.stackSize -= (int) remainingCost; - break; - } else { - remainingCost -= providedItem.stackSize; - providedItem.stackSize = 0; - } - } - } - } - - /** - * Returns the number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that inputs - * are found but not enough. - */ - public double maxParallelCalculatedByInputs(int maxParallel, FluidStack[] aFluidInputs, ItemStack... aInputs) { - if (mInputs.length > 0 && aInputs == null) return 0; - if (mFluidInputs.length > 0 && aFluidInputs == null) return 0; - - double currentParallel = maxParallel; - - // We need to have any fluids inputs, otherwise the code below does nothing. The second check is always true - // because of early exit condition above. - if (mFluidInputs.length > 0 /* && aFluidInputs != null */) { - // Create map for fluid -> stored amount - Reference2LongMap fluidMap = new Reference2LongArrayMap<>(2); - Reference2LongMap fluidCost = new Reference2LongArrayMap<>(2); - for (FluidStack fluidStack : aFluidInputs) { - if (fluidStack == null) continue; - fluidMap.mergeLong(fluidStack.getFluid(), fluidStack.amount, Long::sum); - } - for (FluidStack fluidStack : mFluidInputs) { - if (fluidStack == null) continue; - fluidCost.mergeLong(fluidStack.getFluid(), fluidStack.amount, Long::sum); - } - - // Check how many parallels can it perform for each fluid - for (Reference2LongMap.Entry costEntry : fluidCost.reference2LongEntrySet()) { - if (costEntry.getLongValue() > 0) { - currentParallel = Math.min( - currentParallel, - (double) fluidMap.getOrDefault(costEntry.getKey(), 0L) / costEntry.getLongValue()); - } - if (currentParallel <= 0) { - return 0; - } - } - } - - if (mInputs.length > 0) { - final @NotNull RecipeItemInput @NotNull [] combinedInputs = getCachedCombinedItemInputs(); - - if (aInputs.length < combinedInputs.length) { - // Fewer item types provided than required by the recipe, making it impossible to satisfy. - return 0; - } - final ItemData[] unifiedProvidedInputs = new ItemData[aInputs.length]; - for (int i = 0; i < aInputs.length; i++) { - unifiedProvidedInputs[i] = GT_OreDictUnificator.getAssociation(aInputs[i]); - } - - recipeItemLoop: for (final RecipeItemInput combinedInput : combinedInputs) { - double remainingCost = combinedInput.inputAmount * currentParallel; - long providedAmount = 0; - - for (int i = 0; i < unifiedProvidedInputs.length; i++) { - final ItemData providedUnifiedItem = unifiedProvidedInputs[i]; - final ItemStack providedItem = aInputs[i]; - if (!combinedInput.matchesRecipe(providedUnifiedItem, providedItem)) { - continue; - } - - providedAmount += providedItem.stackSize; - - if (providedAmount >= remainingCost) { - continue recipeItemLoop; - } - } - if (providedAmount == 0) { - return 0; - } - currentParallel = Math.min(currentParallel, (double) providedAmount / combinedInput.inputAmount); - } - } - return currentParallel; - } - - /** - * Please see JavaDoc on {@link #GTppRecipeHelper} for why this is here. - */ - private static boolean shouldCheckNBT(ItemStack item) { - if (GTppRecipeHelper) { - return GT_Utility.areStacksEqual(item, ic2FluidCell, true) - || GT_Utility.areStacksEqual(item, dataStick, true) - || GT_Utility.areStacksEqual(item, dataOrb, true); - } - return false; - } - - public boolean isRecipePossible(@Nullable ItemInventoryLogic itemInput, @Nullable FluidInventoryLogic fluidInput) { - return getAmountOfRecipesDone(itemInput, fluidInput, 1, true) > 0; - } - - public long getAmountOfRecipesDone(@Nullable ItemInventoryLogic itemInput, @Nullable FluidInventoryLogic fluidInput, - long maxParallel, boolean simulate) { - if (itemInput == null) { - itemInput = new ItemInventoryLogic(0); - } - - if (fluidInput == null) { - fluidInput = new FluidInventoryLogic(0, 0); - } - - itemInput.startRecipeCheck(); - Map recipeItems = getItemInputsAsItemMap(); - for (Entry entry : recipeItems.entrySet()) { - maxParallel = Math - .min(maxParallel, itemInput.calculateAmountOfTimesItemCanBeTaken(entry.getKey(), entry.getValue())); - } - - for (FluidStack fluid : mFluidInputs) { - if (fluid == null) continue; - maxParallel = Math - .min(maxParallel, fluidInput.calculateAmountOfTimesFluidCanBeTaken(fluid.getFluid(), fluid.amount)); - } - - if (simulate) { - itemInput.stopRecipeCheck(); - return maxParallel; - } - - for (Entry entry : recipeItems.entrySet()) { - itemInput.subtractItemAmount(entry.getKey(), entry.getValue() * maxParallel, false); - } - - for (FluidStack fluid : mFluidInputs) { - if (fluid == null) continue; - fluidInput.drain(fluid.getFluid(), fluid.amount * maxParallel, false); - } - itemInput.stopRecipeCheck(); - return maxParallel; - } - - private Map getItemInputsAsItemMap() { - Map items = new HashMap<>(); - for (ItemStack item : mInputs) { - if (item == null) continue; - ItemHolder itemHolder = new ItemHolder(item); - items.put(itemHolder, items.getOrDefault(itemHolder, 0L) + item.stackSize); - } - return items; - } - - @Override - public int compareTo(GT_Recipe recipe) { - // first lowest tier recipes - // then fastest - // then with lowest special value - // then dry recipes - // then with fewer inputs - if (this.mEUt != recipe.mEUt) { - return Integer.compare(this.mEUt, recipe.mEUt); - } else if (this.mDuration != recipe.mDuration) { - return Integer.compare(this.mDuration, recipe.mDuration); - } else if (this.mSpecialValue != recipe.mSpecialValue) { - return Integer.compare(this.mSpecialValue, recipe.mSpecialValue); - } else if (this.mFluidInputs.length != recipe.mFluidInputs.length) { - return Integer.compare(this.mFluidInputs.length, recipe.mFluidInputs.length); - } else if (this.mInputs.length != recipe.mInputs.length) { - return Integer.compare(this.mInputs.length, recipe.mInputs.length); - } - return 0; - } - - public String[] getNeiDesc() { - return neiDesc; - } - - /** - * Sets description shown on NEI.
- * If you have a large number of recipes for the recipemap, this is not efficient memory wise, so use - * {@link gregtech.api.recipe.RecipeMapBuilder#neiSpecialInfoFormatter} instead. - */ - public void setNeiDesc(String... neiDesc) { - this.neiDesc = neiDesc; - } - - // region metadata - - // Don't try implementing setMetadata, as metadataStorage can be EmptyRecipeMetadataStorage - - /** - * Gets metadata associated with this recipe. Can return null. Use - * {@link #getMetadataOrDefault(RecipeMetadataKey, Object)} - * if you want to specify default value. - */ - @Nullable - public T getMetadata(RecipeMetadataKey key) { - return key.cast(metadataStorage.getMetadata(key)); - } - - /** - * Gets metadata associated with this recipe with default value. Does not return null unless default value is null. - */ - @Contract("_, !null -> !null") - @Nullable - public T getMetadataOrDefault(RecipeMetadataKey key, @Nullable T defaultValue) { - return key.cast(metadataStorage.getMetadataOrDefault(key, defaultValue)); - } - - @Nonnull - public IRecipeMetadataStorage getMetadataStorage() { - return metadataStorage; - } - - // endregion - - public RecipeCategory getRecipeCategory() { - return recipeCategory; - } - - /** - * Exists only for recipe copying from external. For ordinal use case, use {@link GT_RecipeBuilder#recipeCategory}. - */ - public void setRecipeCategory(RecipeCategory recipeCategory) { - this.recipeCategory = recipeCategory; - } - - private static final List excludedStacktraces = Arrays.asList( - "java.lang.Thread", - "gregtech.api.interfaces.IRecipeMap", - "gregtech.api.interfaces.IRecipeMap$1", - "gregtech.api.recipe.RecipeMap", - "gregtech.api.recipe.RecipeMapBackend", - "gregtech.api.recipe.RecipeMapBackendPropertiesBuilder", - "gregtech.api.util.GT_Recipe", - "gregtech.api.util.GT_RecipeBuilder", - "gregtech.api.util.GT_RecipeConstants", - "gregtech.api.util.GT_RecipeMapUtil", - "gregtech.common.GT_RecipeAdder"); - - public void reloadOwner() { - setOwner( - Loader.instance() - .activeModContainer()); - - if (GT_Mod.gregtechproxy.mNEIRecipeOwnerStackTrace) { - List toAdd = new ArrayList<>(); - for (StackTraceElement stackTrace : Thread.currentThread() - .getStackTrace()) { - if (excludedStacktraces.stream() - .noneMatch( - c -> stackTrace.getClassName() - .equals(c))) { - toAdd.add(formatStackTrace(stackTrace)); - } - } - stackTraces.add(toAdd); - } - } - - private static String formatStackTrace(StackTraceElement stackTraceElement) { - String raw = stackTraceElement.toString(); - int startParen = raw.lastIndexOf('('); - int colon = raw.lastIndexOf(':'); - if (colon == -1) { - // native or unknown source - return raw; - } - // strip class name and leave line number, as class name is already shown - return raw.substring(0, startParen + 1) + raw.substring(colon); - } - - public void setOwner(ModContainer newOwner) { - ModContainer oldOwner = !owners.isEmpty() ? this.owners.get(owners.size() - 1) : null; - if (newOwner != null && newOwner != oldOwner) { - owners.add(newOwner); - } - } - - /** - * Use in case {@link Loader#activeModContainer()} isn't helpful - */ - public void setOwner(String modId) { - for (ModContainer mod : Loader.instance() - .getModList()) { - if (mod.getModId() - .equals(modId)) { - setOwner(mod); - return; - } - } - } - - public GT_Recipe setInputs(ItemStack... aInputs) { - // TODO determine if we need this without trailing nulls call - this.mInputs = ArrayExt.withoutTrailingNulls(aInputs, ItemStack[]::new); - return this; - } - - public GT_Recipe setOutputs(ItemStack... aOutputs) { - this.mOutputs = ArrayExt.withoutTrailingNulls(aOutputs, ItemStack[]::new); - return this; - } - - public GT_Recipe setFluidInputs(FluidStack... aInputs) { - this.mFluidInputs = ArrayExt.withoutTrailingNulls(aInputs, FluidStack[]::new); - return this; - } - - public GT_Recipe setFluidOutputs(FluidStack... aOutputs) { - this.mFluidOutputs = ArrayExt.withoutTrailingNulls(aOutputs, FluidStack[]::new); - return this; - } - - public GT_Recipe setDuration(int aDuration) { - this.mDuration = aDuration; - return this; - } - - public GT_Recipe setEUt(int aEUt) { - this.mEUt = aEUt; - return this; - } - - public static class GT_Recipe_AssemblyLine { - - public static final ArrayList sAssemblylineRecipes = new ArrayList<>(); - - static { - if (!Boolean.getBoolean("com.gtnh.gt5u.ignore-invalid-assline-recipe")) - GregTech_API.sFirstWorldTick.add(GT_Recipe_AssemblyLine::checkInvalidRecipes); - else GT_Log.out.println("NOT CHECKING INVALID ASSLINE RECIPE."); - } - - private static void checkInvalidRecipes() { - int invalidCount = 0; - GT_Log.out.println("Started assline validation"); - for (GT_Recipe_AssemblyLine recipe : sAssemblylineRecipes) { - if (recipe.getPersistentHash() == 0) { - invalidCount++; - GT_Log.err.printf("Invalid recipe: %s%n", recipe); - } - } - if (invalidCount > 0) throw new RuntimeException( - "There are " + invalidCount + " invalid assembly line recipe(s)! Check GregTech.log for details!"); - } - - public ItemStack mResearchItem; - public int mResearchTime; - public ItemStack[] mInputs; - public FluidStack[] mFluidInputs; - public ItemStack mOutput; - public int mDuration; - public int mEUt; - public ItemStack[][] mOreDictAlt; - private int mPersistentHash; - - /** - * THIS CONSTRUCTOR DOES SET THE PERSISTENT HASH. - *

- * if you set one yourself, it will give you one of the RunetimeExceptions! - */ - public GT_Recipe_AssemblyLine(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs, - FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) { - this( - aResearchItem, - aResearchTime, - aInputs, - aFluidInputs, - aOutput, - aDuration, - aEUt, - new ItemStack[aInputs.length][]); - int tPersistentHash = 1; - for (ItemStack tInput : aInputs) - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tInput, true, false); - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aResearchItem, true, false); - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aOutput, true, false); - for (FluidStack tFluidInput : aFluidInputs) - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tFluidInput, true, false); - tPersistentHash = tPersistentHash * 31 + aResearchTime; - tPersistentHash = tPersistentHash * 31 + aDuration; - tPersistentHash = tPersistentHash * 31 + aEUt; - setPersistentHash(tPersistentHash); - } - - /** - * THIS CONSTRUCTOR DOES NOT SET THE PERSISTENT HASH. - *

- * if you don't set one yourself, it will break a lot of stuff! - */ - public GT_Recipe_AssemblyLine(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs, - FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt, ItemStack[][] aAlt) { - mResearchItem = aResearchItem; - mResearchTime = aResearchTime; - mInputs = aInputs; - mFluidInputs = aFluidInputs; - mOutput = aOutput; - mDuration = aDuration; - mEUt = aEUt; - mOreDictAlt = aAlt; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - GT_ItemStack[] thisInputs = new GT_ItemStack[this.mInputs.length]; - int totalInputStackSize = 0; - for (int i = 0; i < this.mInputs.length; i++) { - thisInputs[i] = new GT_ItemStack(this.mInputs[i]); - totalInputStackSize += thisInputs[i].mStackSize; - } - int inputHash = Arrays.deepHashCode(thisInputs); - int inputFluidHash = Arrays.deepHashCode(this.mFluidInputs); - GT_ItemStack thisOutput = new GT_ItemStack(mOutput); - GT_ItemStack thisResearch = new GT_ItemStack(mResearchItem); - int miscRecipeDataHash = Arrays.deepHashCode( - new Object[] { totalInputStackSize, mDuration, mEUt, thisOutput, thisResearch, mResearchTime }); - result = prime * result + inputFluidHash; - result = prime * result + inputHash; - result = prime * result + miscRecipeDataHash; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof GT_Recipe_AssemblyLine other)) { - return false; - } - if (this.mInputs.length != other.mInputs.length) { - return false; - } - if (this.mFluidInputs.length != other.mFluidInputs.length) { - return false; - } - // Check Outputs Match - GT_ItemStack output1 = new GT_ItemStack(this.mOutput); - GT_ItemStack output2 = new GT_ItemStack(other.mOutput); - if (!output1.equals(output2)) { - return false; - } - // Check Scanned Item Match - GT_ItemStack scan1 = new GT_ItemStack(this.mResearchItem); - GT_ItemStack scan2 = new GT_ItemStack(other.mResearchItem); - if (!scan1.equals(scan2)) { - return false; - } - // Check Items Match - GT_ItemStack[] thisInputs = new GT_ItemStack[this.mInputs.length]; - GT_ItemStack[] otherInputs = new GT_ItemStack[other.mInputs.length]; - for (int i = 0; i < thisInputs.length; i++) { - thisInputs[i] = new GT_ItemStack(this.mInputs[i]); - otherInputs[i] = new GT_ItemStack(other.mInputs[i]); - } - for (int i = 0; i < thisInputs.length; i++) { - if (!thisInputs[i].equals(otherInputs[i]) || thisInputs[i].mStackSize != otherInputs[i].mStackSize) { - return false; - } - } - // Check Fluids Match - for (int i = 0; i < this.mFluidInputs.length; i++) { - if (!this.mFluidInputs[i].isFluidStackIdentical(other.mFluidInputs[i])) { - return false; - } - } - - return this.mDuration == other.mDuration && this.mEUt == other.mEUt - && this.mResearchTime == other.mResearchTime; - } - - public int getPersistentHash() { - if (mPersistentHash == 0) - GT_Log.err.println("Assline recipe persistent hash has not been set! Recipe: " + mOutput); - return mPersistentHash; - } - - @Override - public String toString() { - return "GT_Recipe_AssemblyLine{" + "mResearchItem=" - + mResearchItem - + ", mResearchTime=" - + mResearchTime - + ", mInputs=" - + Arrays.toString(mInputs) - + ", mFluidInputs=" - + Arrays.toString(mFluidInputs) - + ", mOutput=" - + mOutput - + ", mDuration=" - + mDuration - + ", mEUt=" - + mEUt - + ", mOreDictAlt=" - + Arrays.toString(mOreDictAlt) - + '}'; - } - - /** - * @param aPersistentHash the persistent hash. it should reflect the exact input used to generate this recipe If - * 0 is passed in, the actual persistent hash will be automatically remapped to 1 - * instead. - * @throws IllegalStateException if the persistent hash has been set already - */ - public void setPersistentHash(int aPersistentHash) { - if (this.mPersistentHash != 0) throw new IllegalStateException("Cannot set persistent hash twice!"); - if (aPersistentHash == 0) this.mPersistentHash = 1; - else this.mPersistentHash = aPersistentHash; - } - - /** - * @param inputBusses List of input busses to check. - * @return An array containing the amount of item to consume from the first slot of every input bus. - * {@code null} if at least one item fails to match the recipe ingredient. - */ - public static int[] getItemConsumptionAmountArray(ArrayList inputBusses, - GT_Recipe_AssemblyLine recipe) { - int itemCount = recipe.mInputs.length; - if (itemCount == 0) return null; - int[] tStacks = new int[itemCount]; - for (int i = 0; i < itemCount; i++) { - GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i); - if (!inputBus.isValid()) return null; - ItemStack slotStack; - if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) { - slotStack = meBus.getShadowItemStack(0); - } else { - slotStack = inputBus.getStackInSlot(0); - } - if (slotStack == null) return null; - - int amount = getMatchedIngredientAmount(slotStack, recipe.mInputs[i], recipe.mOreDictAlt[i]); - if (amount < 0) return null; - - tStacks[i] = amount; - } - return tStacks; - } - - public static int getMatchedIngredientAmount(ItemStack aSlotStack, ItemStack aIngredient, ItemStack[] alts) { - if (alts == null || alts.length == 0) { - if (GT_Utility.areStacksEqual(aSlotStack, aIngredient, true)) { - return aIngredient.stackSize; - } - return -1; - } - for (ItemStack tAltStack : alts) { - if (GT_Utility.areStacksEqual(aSlotStack, tAltStack, true)) { - return tAltStack.stackSize; - } - } - return -1; - } - - /** - * @param inputBusses Input bus list to check. Usually the input bus list of multi. - * @param itemConsumptions Should be generated by {@link GT_Recipe_AssemblyLine#getItemConsumptionAmountArray}. - * @Return The number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that - * inputs are found but not enough. - */ - public static double maxParallelCalculatedByInputItems(ArrayList inputBusses, - int maxParallel, int[] itemConsumptions, Map inputsFromME) { - // Recipe item matching is done in the generation of itemConsumptions. - - Map itemConsumptionsFromME = new Object2LongOpenHashMap<>(); - double currentParallel = maxParallel; - - // Calculate the amount of each item to consume from ME - for (int i = 0; i < itemConsumptions.length; i++) { - GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i); - if (!inputBus.isValid()) return 0; - if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) { - ItemStack item = meBus.getShadowItemStack(0); - if (item == null) return 0; - GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(item); - itemConsumptionsFromME.merge(id, (long) itemConsumptions[i], Long::sum); - } - } - // Calculate parallel from ME input busses - for (Entry entry : itemConsumptionsFromME.entrySet()) { - if (!inputsFromME.containsKey(entry.getKey())) return 0; - long consume = entry.getValue(); - // For non-consumed inputs - if (consume == 0) continue; - currentParallel = Math - .min(currentParallel, (double) inputsFromME.get(entry.getKey()).stackSize / consume); - if (currentParallel <= 0) return 0; - } - - // Calculate parallel from regular input busses - for (int i = 0; i < itemConsumptions.length; i++) { - GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i); - if (!inputBus.isValid()) return 0; - if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME) continue; - - ItemStack item = inputBus.getStackInSlot(0); - if (item == null) return 0; - // For non-consumed inputs - if (itemConsumptions[i] == 0) continue; - currentParallel = Math.min(currentParallel, (double) item.stackSize / itemConsumptions[i]); - if (currentParallel <= 0) return 0; - } - return currentParallel; - } - - /** - * @param inputHatches Input hatch list to check. Usually the input hatch list of multi. - * @param fluidConsumptions Fluid inputs of the recipe. - * @return The number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that - * fluids are found but not enough. - */ - public static double maxParallelCalculatedByInputFluids(ArrayList inputHatches, - int maxParallel, FluidStack[] fluidConsumptions, Map fluidsFromME) { - Map fluidConsumptionsFromME = new Reference2LongOpenHashMap<>(); - double currentParallel = maxParallel; - - // Calculate the amount of each fluid to consume from ME - for (int i = 0; i < fluidConsumptions.length; i++) { - GT_MetaTileEntity_Hatch_Input inputHatch = inputHatches.get(i); - if (!inputHatch.isValid()) return 0; - if (inputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) { - FluidStack fluid = meHatch.getShadowFluidStack(0); - if (fluid == null) return 0; - if (!GT_Utility.areFluidsEqual(fluid, fluidConsumptions[i])) return 0; - fluidConsumptionsFromME.merge(fluid.getFluid(), (long) fluidConsumptions[i].amount, Long::sum); - } - } - // Calculate parallel from ME input hatches - for (Entry entry : fluidConsumptionsFromME.entrySet()) { - Fluid fluid = entry.getKey(); - if (!fluidsFromME.containsKey(fluid)) return 0; - long consume = entry.getValue(); - currentParallel = Math.min(currentParallel, (double) fluidsFromME.get(fluid).amount / consume); - if (currentParallel <= 0) return 0; - } - - // Calculate parallel from regular input hatches - for (int i = 0; i < fluidConsumptions.length; i++) { - GT_MetaTileEntity_Hatch_Input inputHatch = inputHatches.get(i); - if (!inputHatch.isValid()) return 0; - if (inputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME) continue; - - FluidStack fluid; - if (inputHatch instanceof GT_MetaTileEntity_Hatch_MultiInput multiInput) { - fluid = multiInput.getFluid(0); - } else { - fluid = inputHatch.getFillableStack(); - } - if (fluid == null) return 0; - if (!GT_Utility.areFluidsEqual(fluid, fluidConsumptions[i])) return 0; - currentParallel = Math.min(currentParallel, (double) fluid.amount / fluidConsumptions[i].amount); - if (currentParallel <= 0) return 0; - } - return currentParallel; - } - - /** - * WARNING: Ensure that item inputs are enough to be consumed with - * {@link GT_Recipe_AssemblyLine#maxParallelCalculatedByInputItems} before calling this method! - * - * @param inputBusses Input bus list to check. Usually the input bus list of multi. - * @param itemConsumptions Should be generated by {@link GT_Recipe_AssemblyLine#getItemConsumptionAmountArray}. - */ - public static void consumeInputItems(ArrayList inputBusses, - int amountMultiplier, int[] itemConsumptions, Map inputsFromME) { - for (int i = 0; i < itemConsumptions.length; i++) { - GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i); - if (!inputBus.isValid()) continue; - ItemStack item; - if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) { - item = inputsFromME.get(GT_Utility.ItemId.createNoCopy(meBus.getShadowItemStack(0))); - } else { - item = inputBus.getStackInSlot(0); - } - item.stackSize -= itemConsumptions[i] * amountMultiplier; - } - } - - /** - * WARNING: Ensure that fluid inputs are enough to be consumed with - * {@link GT_Recipe_AssemblyLine#maxParallelCalculatedByInputFluids} before calling this method! - * - * @param inputHatches Input hatch list to check. Usually the input hatch list of multi. - * @param fluidConsumptions Fluid inputs of the recipe. - */ - public static void consumeInputFluids(ArrayList inputHatches, - int amountMultiplier, FluidStack[] fluidConsumptions, Map fluidsFromME) { - for (int i = 0; i < fluidConsumptions.length; i++) { - GT_MetaTileEntity_Hatch_Input inputHatch = inputHatches.get(i); - if (!inputHatch.isValid()) continue; - FluidStack fluid; - if (inputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) { - fluid = fluidsFromME.get( - meHatch.getShadowFluidStack(0) - .getFluid()); - } else if (inputHatch instanceof GT_MetaTileEntity_Hatch_MultiInput multiInput) { - fluid = multiInput.getFluid(0); - } else { - fluid = inputHatch.getFillableStack(); - } - fluid.amount -= fluidConsumptions[i].amount * amountMultiplier; - } - } - } - - public static class GT_Recipe_WithAlt extends GT_Recipe { - - public ItemStack[][] mOreDictAlt; - - /** - * Only for {@link GT_RecipeBuilder}. - */ - GT_Recipe_WithAlt(ItemStack[] mInputs, ItemStack[] mOutputs, FluidStack[] mFluidInputs, - FluidStack[] mFluidOutputs, int[] mChances, Object mSpecialItems, int mDuration, int mEUt, - int mSpecialValue, boolean mEnabled, boolean mHidden, boolean mFakeRecipe, boolean mCanBeBuffered, - boolean mNeedsEmptyOutput, boolean nbtSensitive, String[] neiDesc, - @Nullable IRecipeMetadataStorage metadataStorage, RecipeCategory recipeCategory, - ItemStack[][] mOreDictAlt) { - super( - mInputs, - mOutputs, - mFluidInputs, - mFluidOutputs, - mChances, - mSpecialItems, - mDuration, - mEUt, - mSpecialValue, - mEnabled, - mHidden, - mFakeRecipe, - mCanBeBuffered, - mNeedsEmptyOutput, - nbtSensitive, - neiDesc, - metadataStorage, - recipeCategory); - this.mOreDictAlt = mOreDictAlt; - } - - public GT_Recipe_WithAlt(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, - int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, - int aSpecialValue, ItemStack[][] aAlt) { - super( - aOptimize, - aInputs, - aOutputs, - aSpecialItems, - aChances, - aFluidInputs, - aFluidOutputs, - aDuration, - aEUt, - aSpecialValue); - mOreDictAlt = aAlt; - } - - public Object getAltRepresentativeInput(int aIndex) { - if (aIndex < 0) return null; - if (aIndex < mOreDictAlt.length) { - if (mOreDictAlt[aIndex] != null && mOreDictAlt[aIndex].length > 0) { - ItemStack[] rStacks = new ItemStack[mOreDictAlt[aIndex].length]; - for (int i = 0; i < mOreDictAlt[aIndex].length; i++) { - rStacks[i] = GT_Utility.copyOrNull(mOreDictAlt[aIndex][i]); - } - return rStacks; - } - } - if (aIndex >= mInputs.length) return null; - return GT_Utility.copyOrNull(mInputs[aIndex]); - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_RecipeBuilder.java b/src/main/java/gregtech/api/util/GT_RecipeBuilder.java deleted file mode 100644 index 137b7d6c86..0000000000 --- a/src/main/java/gregtech/api/util/GT_RecipeBuilder.java +++ /dev/null @@ -1,946 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.util.GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES; -import static gregtech.api.util.GT_Utility.copyFluidArray; -import static gregtech.api.util.GT_Utility.copyItemArray; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Stream; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.item.ItemStack; -import net.minecraft.launchwrapper.Launch; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.Contract; - -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Mods; -import gregtech.api.interfaces.IRecipeMap; -import gregtech.api.recipe.RecipeCategory; -import gregtech.api.recipe.RecipeMetadataKey; -import gregtech.api.recipe.metadata.IRecipeMetadataStorage; -import gregtech.api.recipe.metadata.RecipeMetadataStorage; -import gregtech.api.util.extensions.ArrayExt; - -@SuppressWarnings({ "unused", "UnusedReturnValue" }) -public class GT_RecipeBuilder { - - // debug mode expose problems. panic mode help you check nothing is wrong-ish without you actively monitoring - private static final boolean DEBUG_MODE_NULL; - // Any stable release should be tested at least once with this: -Dgt.recipebuilder.panic.null=true - private static boolean PANIC_MODE_NULL; - private static final boolean DEBUG_MODE_INVALID; - private static final boolean DEBUG_MODE_FULL_ENERGY; - // Any stable release should be tested at least once with this: -Dgt.recipebuilder.panic.invalid=true - private static final boolean PANIC_MODE_INVALID; - private static final boolean DEBUG_MODE_COLLISION; - - // Any stable release should be tested at least once with this: -Dgt.recipebuilder.panic.collision=true - private static final boolean PANIC_MODE_COLLISION; - - // This should only be enabled in non stable instances only with -Dgt.recipebuilder.recipe_collision_check=true - public static final boolean ENABLE_COLLISION_CHECK; - - public static final int WILDCARD = 32767; - - // time units - public static final int HOURS = 20 * 60 * 60; - public static final int MINUTES = 20 * 60; - public static final int SECONDS = 20; - public static final int TICKS = 1; - - // fluid units - public static final int INGOTS = 144; - public static final int HALF_INGOT = 72; - public static final int QUARTER_INGOT = 36; - public static final int EIGHTH_INGOT = 18; - public static final int NUGGETS = 16; - public static final int BUCKETS = 1000; - - static { - final boolean debugAll; - if (System.getProperties() - .containsKey("gt.recipebuilder.debug")) { - debugAll = Boolean.getBoolean("gt.recipebuilder.debug"); - } else { - // turn on debug by default in dev mode - debugAll = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); - } - DEBUG_MODE_NULL = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.null"); - DEBUG_MODE_INVALID = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.invalid"); - DEBUG_MODE_COLLISION = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.collision"); - DEBUG_MODE_FULL_ENERGY = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.fullenergy"); - - final boolean panicAll = Boolean.getBoolean("gt.recipebuilder.panic"); - PANIC_MODE_NULL = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.null"); - PANIC_MODE_INVALID = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.invalid"); - PANIC_MODE_COLLISION = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.collision"); - ENABLE_COLLISION_CHECK = Boolean.getBoolean("gt.recipebuilder.recipe_collision_check"); - } - - protected ItemStack[] inputsBasic = new ItemStack[0]; - protected Object[] inputsOreDict; - protected ItemStack[] outputs = new ItemStack[0]; - protected ItemStack[][] alts; - protected FluidStack[] fluidInputs = new FluidStack[0]; - protected FluidStack[] fluidOutputs = new FluidStack[0]; - protected int[] chances; - protected Object special; - protected int duration = -1; - protected int eut = -1; - protected int specialValue; - protected boolean enabled = true; - protected boolean hidden = false; - protected boolean fakeRecipe = false; - protected boolean mCanBeBuffered = true; - protected boolean mNeedsEmptyOutput = false; - protected boolean nbtSensitive = false; - protected String[] neiDesc; - protected RecipeCategory recipeCategory; - protected boolean optimize = true; - @Nullable - protected IRecipeMetadataStorage metadataStorage; - protected boolean checkForCollision = true; - /** - * If recipe addition should be skipped. - */ - protected boolean skip = false; - protected boolean valid = true; - - GT_RecipeBuilder() {} - - private GT_RecipeBuilder(ItemStack[] inputsBasic, Object[] inputsOreDict, ItemStack[] outputs, ItemStack[][] alts, - FluidStack[] fluidInputs, FluidStack[] fluidOutputs, int[] chances, Object special, int duration, int eut, - int specialValue, boolean enabled, boolean hidden, boolean fakeRecipe, boolean mCanBeBuffered, - boolean mNeedsEmptyOutput, boolean nbtSensitive, String[] neiDesc, RecipeCategory recipeCategory, - boolean optimize, @Nullable IRecipeMetadataStorage metadataStorage, boolean checkForCollision, boolean skip, - boolean valid) { - this.inputsBasic = inputsBasic; - this.inputsOreDict = inputsOreDict; - this.outputs = outputs; - this.alts = alts; - this.fluidInputs = fluidInputs; - this.fluidOutputs = fluidOutputs; - this.chances = chances; - this.special = special; - this.duration = duration; - this.eut = eut; - this.specialValue = specialValue; - this.enabled = enabled; - this.hidden = hidden; - this.fakeRecipe = fakeRecipe; - this.mCanBeBuffered = mCanBeBuffered; - this.mNeedsEmptyOutput = mNeedsEmptyOutput; - this.nbtSensitive = nbtSensitive; - this.neiDesc = neiDesc; - this.recipeCategory = recipeCategory; - this.optimize = optimize; - this.metadataStorage = metadataStorage; - if (this.metadataStorage != null) { - this.metadataStorage = this.metadataStorage.copy(); - } - this.checkForCollision = checkForCollision; - this.skip = skip; - this.valid = valid; - } - - // region helper methods - - private static FluidStack[] fix(FluidStack[] fluidInputs) { - return Arrays.stream(fluidInputs) - .filter(Objects::nonNull) - .map(FluidStack::copy) - .toArray(FluidStack[]::new); - } - - private static ItemStack[] fix(ItemStack[] inputs) { - return GT_OreDictUnificator.setStackArray(true, ArrayExt.withoutTrailingNulls(inputs, ItemStack[]::new)); - } - - public static GT_RecipeBuilder builder() { - return new GT_RecipeBuilder(); - } - - /** - * Creates empty builder where only duration and EU/t are set to 0. - */ - public static GT_RecipeBuilder empty() { - return new GT_RecipeBuilder().duration(0) - .eut(0); - } - - private static boolean containsNull(Object[] arr) { - return arr == null || Arrays.stream(arr) - .anyMatch(Objects::isNull); - } - - private static void handleNullRecipeComponents(String componentType) { - // place a breakpoint here to catch all these issues - GT_Log.err.print("null detected in "); - GT_Log.err.println(componentType); - new NullPointerException().printStackTrace(GT_Log.err); - if (PANIC_MODE_NULL) { - throw new IllegalArgumentException("null in argument"); - } - } - - private static boolean debugNull() { - return DEBUG_MODE_NULL || PANIC_MODE_NULL; - } - - public static void handleInvalidRecipe() { - if (!DEBUG_MODE_INVALID && !PANIC_MODE_INVALID) { - return; - } - // place a breakpoint here to catch all these issues - GT_Log.err.print("invalid recipe"); - new IllegalArgumentException().printStackTrace(GT_Log.err); - if (PANIC_MODE_INVALID) { - throw new IllegalArgumentException("invalid recipe"); - } - } - - public static void handleRecipeCollision(String details) { - if (!DEBUG_MODE_COLLISION && !PANIC_MODE_COLLISION) { - return; - } - GT_Log.err.print("Recipe collision resulting in recipe loss detected with "); - GT_Log.err.println(details); - if (PANIC_MODE_COLLISION) { - throw new IllegalArgumentException("Recipe Collision"); - } else { - // place a breakpoint here to catch all these issues - new IllegalArgumentException().printStackTrace(GT_Log.err); - } - } - - public static void onConfigLoad() { - PANIC_MODE_NULL |= GT_Mod.gregtechproxy.crashOnNullRecipeInput; - } - - // endregion - - // region setter - - /** - * Non-OreDicted item inputs. Assumes input is unified. - */ - public GT_RecipeBuilder itemInputsUnified(ItemStack... inputs) { - if (skip) return this; - if (debugNull() && containsNull(inputs)) handleNullRecipeComponents("itemInputUnified"); - inputsBasic = ArrayExt.withoutTrailingNulls(inputs, ItemStack[]::new); - inputsOreDict = null; - alts = null; - return this; - } - - /** - * Non-OreDicted item inputs. Assumes input is not unified. - */ - public GT_RecipeBuilder itemInputs(ItemStack... inputs) { - if (skip) return this; - if (debugNull() && containsNull(inputs)) handleNullRecipeComponents("itemInputs"); - inputsBasic = fix(inputs); - inputsOreDict = null; - alts = null; - return this; - } - - /** - * OreDicted item inputs. Currently only used for assline recipes adder. - */ - public GT_RecipeBuilder itemInputs(Object... inputs) { - if (skip) return this; - inputsOreDict = inputs; - alts = new ItemStack[inputs.length][]; - for (int i = 0, inputsLength = inputs.length; i < inputsLength; i++) { - Object input = inputs[i]; - if (input instanceof ItemStack) { - alts[i] = new ItemStack[] { (ItemStack) input }; - } else if (input instanceof ItemStack[]) { - alts[i] = ((ItemStack[]) input).clone(); - } else if (input instanceof Object[]arr) { - if (arr.length != 2) continue; - List ores = GT_OreDictUnificator.getOres(arr[0]); - if (ores.isEmpty()) continue; - int size = ((Number) arr[1]).intValue(); - alts[i] = ores.stream() - .map(s -> GT_Utility.copyAmount(size, s)) - .filter(GT_Utility::isStackValid) - .toArray(ItemStack[]::new); - } else if (input == null) { - handleNullRecipeComponents("recipe oredict input"); - alts[i] = new ItemStack[0]; - } else { - throw new IllegalArgumentException("index " + i + ", unexpected type: " + input.getClass()); - } - } - inputsBasic = Arrays.stream(alts) - .map(ss -> ss.length > 0 ? ss[0] : null) - .toArray(ItemStack[]::new); - // optimize cannot handle recipes with alts - return noOptimize(); - } - - public GT_RecipeBuilder itemOutputs(ItemStack... outputs) { - if (skip) return this; - if (debugNull() && containsNull(outputs)) handleNullRecipeComponents("itemOutputs"); - this.outputs = outputs; - if (chances != null && chances.length != outputs.length) { - throw new IllegalArgumentException("Output chances array and items array length differs"); - } - return this; - } - - /** - * Not intended to be used by recipe authors. - * Intended for recipe rewrite middlewares. - */ - public GT_RecipeBuilder itemOutputs(ItemStack[] outputs, int[] chances) { - if (skip) return this; - if (debugNull() && containsNull(outputs)) handleNullRecipeComponents("itemOutputs"); - this.outputs = outputs; - this.chances = chances; - if (chances != null && chances.length != outputs.length) { - throw new IllegalArgumentException("Output chances array and items array length differs"); - } - return this; - } - - public GT_RecipeBuilder fluidInputs(FluidStack... fluidInputs) { - if (skip) return this; - if (debugNull() && containsNull(fluidInputs)) handleNullRecipeComponents("fluidInputs"); - this.fluidInputs = fix(fluidInputs); - return this; - } - - public GT_RecipeBuilder fluidOutputs(FluidStack... fluidOutputs) { - if (skip) return this; - if (debugNull() && containsNull(fluidOutputs)) handleNullRecipeComponents("fluidOutputs"); - this.fluidOutputs = fix(fluidOutputs); - return this; - } - - public GT_RecipeBuilder outputChances(int... chances) { - if (skip) return this; - if (outputs != null && chances.length != outputs.length) { - throw new IllegalArgumentException("Output chances array and items array length differs"); - } - this.chances = chances; - return this; - } - - public GT_RecipeBuilder special(Object special) { - this.special = special; - return this; - } - - public GT_RecipeBuilder duration(int duration) { - this.duration = duration; - return this; - } - - public GT_RecipeBuilder duration(long duration) { - this.duration = (int) duration; - return this; - } - - public GT_RecipeBuilder eut(int eut) { - if (DEBUG_MODE_FULL_ENERGY) { - // Ignores ULV voltage - for (int i = 1; i < GT_Values.VP.length; i++) { - if (eut <= GT_Values.V[i] && eut > GT_Values.VP[i]) { - GT_Log.err.println( - "EUt > Practical Voltage detected. EUt: " + eut + ", Practical Voltage: " + GT_Values.VP[i]); - new IllegalArgumentException().printStackTrace(GT_Log.err); - break; - } - } - } - this.eut = eut; - return this; - } - - public GT_RecipeBuilder eut(long eut) { - return eut((int) eut); - } - - /** - * prefer to use metadata over this. should only use when the target recipe map does not yet support metadata - * system, or it's to bridge legacy code and modern code. - */ - public GT_RecipeBuilder specialValue(int specialValue) { - this.specialValue = specialValue; - return this; - } - - // I don't expect anyone to actually call this... - public GT_RecipeBuilder disabled() { - this.enabled = false; - return this; - } - - public GT_RecipeBuilder hidden() { - this.hidden = true; - return this; - } - - public GT_RecipeBuilder fake() { - this.fakeRecipe = true; - return this; - } - - public GT_RecipeBuilder noBuffer() { - this.mCanBeBuffered = false; - return this; - } - - public GT_RecipeBuilder needsEmptyOutput() { - this.mNeedsEmptyOutput = true; - return this; - } - - public GT_RecipeBuilder nbtSensitive() { - this.nbtSensitive = true; - return this; - } - - public GT_RecipeBuilder setNEIDesc(String... neiDesc) { - this.neiDesc = neiDesc; - return this; - } - - public GT_RecipeBuilder recipeCategory(RecipeCategory recipeCategory) { - this.recipeCategory = recipeCategory; - return this; - } - - /** - * Prevent the resulting recipe from optimizing recipe, which is a process that reduce recipe batch size. - */ - public GT_RecipeBuilder noOptimize() { - this.optimize = false; - return this; - } - - /** - * Prevents checking collision with existing recipes when adding the built recipe. - */ - public GT_RecipeBuilder ignoreCollision() { - this.checkForCollision = false; - return this; - } - - /** - * Sets metadata of the recipe. It can be used for recipe emitter to do special things, or for being stored in the - * built recipe and used for actual recipe processing. - *

- * {@link GT_RecipeConstants} has a series of metadata keys. Or you can create one by yourself. - */ - public GT_RecipeBuilder metadata(RecipeMetadataKey key, T value) { - if (skip) return this; - if (metadataStorage == null) { - metadataStorage = new RecipeMetadataStorage(); - } - metadataStorage.store(key, value); - return this; - } - - /** - * Gets metadata already set for this builder. Can return null. Use - * {@link #getMetadataOrDefault(RecipeMetadataKey, Object)} - * if you want to specify default value. - */ - @Nullable - public T getMetadata(RecipeMetadataKey key) { - if (metadataStorage == null) { - return null; - } - return key.cast(metadataStorage.getMetadata(key)); - } - - /** - * Gets metadata already set for this builder with default value. Does not return null unless default value is null. - */ - @Contract("_, !null -> !null") - @Nullable - public T getMetadataOrDefault(RecipeMetadataKey key, T defaultValue) { - if (metadataStorage == null) { - return defaultValue; - } - return key.cast(metadataStorage.getMetadataOrDefault(key, defaultValue)); - } - - /** - * Specifies mods required to add the recipe. If any of the mods is not loaded, all the operations for this builder - * will be ignored. - * - * @param mods Mod(s) required for the recipe. - */ - public GT_RecipeBuilder requireMods(Mods... mods) { - skip = Stream.of(mods) - .anyMatch(mod -> !mod.isModLoaded()); - return this; - } - - public GT_RecipeBuilder requiresCleanRoom() { - return metadata(GT_RecipeConstants.CLEANROOM, true); - } - - public GT_RecipeBuilder requiresLowGravity() { - return metadata(GT_RecipeConstants.LOW_GRAVITY, true); - } - - // endregion - - private static T[] copy(T[] arr) { - return arr == null ? null : arr.clone(); - } - - private static int[] copy(int[] arr) { - return arr == null ? null : arr.clone(); - } - - /** - * produce a deep copy of current values. anything unset will remain unset. IMPORTANT: If metadata contains mutable - * value, they will not be cloned! - *

- * checkout docs/RecipeBuilder.md for more info on whether to copy or not. - */ - public GT_RecipeBuilder copy() { - return new GT_RecipeBuilder( - copyItemArray(inputsBasic), - copy(inputsOreDict), - copyItemArray(outputs), - copy(alts), - copyFluidArray(fluidInputs), - copyFluidArray(fluidOutputs), - copy(chances), - special, - duration, - eut, - specialValue, - enabled, - hidden, - fakeRecipe, - mCanBeBuffered, - mNeedsEmptyOutput, - nbtSensitive, - copy(neiDesc), - recipeCategory, - optimize, - metadataStorage, - checkForCollision, - skip, - valid); - } - - /** - * produce a deep copy of current values. anything unset will remain unset. discard all existing metadata - */ - public GT_RecipeBuilder copyNoMetadata() { - return new GT_RecipeBuilder( - copyItemArray(inputsBasic), - copy(inputsOreDict), - copyItemArray(outputs), - copy(alts), - copyFluidArray(fluidInputs), - copyFluidArray(fluidOutputs), - copy(chances), - special, - duration, - eut, - specialValue, - enabled, - hidden, - fakeRecipe, - mCanBeBuffered, - mNeedsEmptyOutput, - nbtSensitive, - copy(neiDesc), - recipeCategory, - optimize, - null, - checkForCollision, - skip, - valid); - } - - // region getter - - public ItemStack getItemInputBasic(int index) { - return index < inputsBasic.length ? inputsBasic[index] : null; - } - - public Object getItemInputOreDict(int index) { - return index < inputsOreDict.length ? inputsOreDict[index] : null; - } - - public ItemStack getItemOutput(int index) { - return index < outputs.length ? outputs[index] : null; - } - - public FluidStack getFluidInput(int index) { - return index < fluidInputs.length ? fluidInputs[index] : null; - } - - public FluidStack getFluidOutput(int index) { - return index < fluidOutputs.length ? fluidOutputs[index] : null; - } - - public ItemStack[] getItemInputsBasic() { - return inputsBasic; - } - - public Object[] getItemInputsOreDict() { - return inputsOreDict; - } - - public ItemStack[] getItemOutputs() { - return outputs; - } - - public FluidStack[] getFluidInputs() { - return fluidInputs; - } - - public FluidStack[] getFluidOutputs() { - return fluidOutputs; - } - - public int getDuration() { - return duration; - } - - public int[] getChances() { - return chances; - } - - public int getEUt() { - return eut; - } - - public RecipeCategory getRecipeCategory() { - return recipeCategory; - } - - public boolean isOptimize() { - return optimize; - } - - public boolean isCheckForCollision() { - return checkForCollision; - } - - // endregion - - // region validator - - public GT_RecipeBuilder clearInvalid() { - valid = true; - return this; - } - - public GT_RecipeBuilder invalidate() { - valid = false; - return this; - } - - public boolean isValid() { - return valid; - } - - private static boolean isArrayValid(@Nonnull Object[] arr, int min, int max) { - int count = 0; - for (Object o : arr) { - if (o != null) count += 1; - } - return min <= count && max >= count; - } - - /** - * Validate if input item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateNoInput() { - if (skip) return this; - return GT_Utility.isArrayEmptyOrNull(inputsBasic) ? this : invalidate(); - } - - /** - * Validate if input fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateNoInputFluid() { - if (skip) return this; - return GT_Utility.isArrayEmptyOrNull(fluidInputs) ? this : invalidate(); - } - - /** - * Validate if output item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateNoOutput() { - if (skip) return this; - return GT_Utility.isArrayEmptyOrNull(outputs) ? this : invalidate(); - } - - /** - * Validate if output fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateNoOutputFluid() { - if (skip) return this; - return GT_Utility.isArrayEmptyOrNull(fluidOutputs) ? this : invalidate(); - } - - /** - * Validate if input item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateInputCount(int min, int max) { - if (skip) return this; - if (inputsBasic == null) return min < 0 ? this : invalidate(); - return isArrayValid(inputsBasic, min, max) ? this : invalidate(); - } - - /** - * Validate if input fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateInputFluidCount(int min, int max) { - if (skip) return this; - if (fluidInputs == null) return min < 0 ? this : invalidate(); - return isArrayValid(fluidInputs, min, max) ? this : invalidate(); - } - - /** - * Validate if output item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateOutputCount(int min, int max) { - if (skip) return this; - if (outputs == null) return min < 0 ? this : invalidate(); - return isArrayValid(outputs, min, max) ? this : invalidate(); - } - - /** - * Validate if output fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow - * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code. - */ - public GT_RecipeBuilder validateOutputFluidCount(int min, int max) { - if (skip) return this; - if (fluidOutputs == null) return min < 0 ? this : invalidate(); - return isArrayValid(fluidOutputs, min, max) ? this : invalidate(); - } - - public GT_RecipeBuilder validateAnyInput() { - if (skip) return this; - if (fluidInputs != null && isArrayValid(fluidInputs, 1, Integer.MAX_VALUE)) { - return this; - } - if (inputsBasic != null && isArrayValid(inputsBasic, 1, Integer.MAX_VALUE)) { - return this; - } - return invalidate(); - } - - public GT_RecipeBuilder validateAnyOutput() { - if (skip) return this; - if (fluidOutputs != null && isArrayValid(fluidOutputs, 1, Integer.MAX_VALUE)) { - return this; - } - if (outputs != null && isArrayValid(outputs, 1, Integer.MAX_VALUE)) { - return this; - } - return invalidate(); - } - - // endregion - - /** - * Builds new recipe, without custom behavior of recipemaps. For adding recipe to recipemap, - * use {@link #addTo} instead. - * - * @return Built recipe. Returns empty if failed to build. - */ - public Optional build() { - if (skip) { - return Optional.empty(); - } - if (!valid) { - handleInvalidRecipe(); - return Optional.empty(); - } - preBuildChecks(); - optimize(); - return Optional.of( - decorate( - new GT_Recipe( - inputsBasic, - outputs, - fluidInputs, - fluidOutputs, - chances, - special, - duration, - eut, - specialValue, - enabled, - hidden, - fakeRecipe, - mCanBeBuffered, - mNeedsEmptyOutput, - nbtSensitive, - neiDesc, - metadataStorage, - recipeCategory))); - } - - public GT_RecipeBuilder forceOreDictInput() { - if (inputsOreDict != null || inputsBasic == null) return this; - return itemInputs((Object[]) inputsBasic); - } - - public Optional buildWithAlt() { - if (skip) { - return Optional.empty(); - } - if (inputsOreDict == null) { - throw new UnsupportedOperationException(); - } - if (!valid) { - handleInvalidRecipe(); - return Optional.empty(); - } - preBuildChecks(); - // no optimize. - return Optional.of( - decorate( - new GT_Recipe.GT_Recipe_WithAlt( - inputsBasic, - outputs, - fluidInputs, - fluidOutputs, - chances, - special, - duration, - eut, - specialValue, - enabled, - hidden, - fakeRecipe, - mCanBeBuffered, - mNeedsEmptyOutput, - nbtSensitive, - neiDesc, - metadataStorage, - recipeCategory, - alts))); - } - - private void preBuildChecks() { - if (duration == -1) throw new IllegalStateException("no duration"); - if (eut == -1) throw new IllegalStateException("no eut"); - } - - private void optimize() { - if (optimize) { - ArrayList l = new ArrayList<>(); - l.addAll(Arrays.asList(inputsBasic)); - l.addAll(Arrays.asList(outputs)); - for (int i = 0; i < l.size(); i++) if (l.get(i) == null) l.remove(i--); - - outer: for (byte i = (byte) Math.min(64, duration / 16); i > 1; i--) { - if (duration / i >= 16) { - for (ItemStack stack : l) { - if (stack.stackSize % i != 0) continue outer; - } - for (FluidStack fluidInput : fluidInputs) { - if (fluidInput.amount % i != 0) continue outer; - } - for (FluidStack fluidOutput : fluidOutputs) { - if (fluidOutput.amount % i != 0) continue outer; - } - for (ItemStack itemStack : l) itemStack.stackSize /= i; - for (FluidStack fluidInput : fluidInputs) fluidInput.amount /= i; - for (FluidStack fluidOutput : fluidOutputs) fluidOutput.amount /= i; - duration /= i; - } - } - optimize = false; - } - } - - private T decorate(T r) { - r.mHidden = hidden; - r.mCanBeBuffered = mCanBeBuffered; - r.mNeedsEmptyOutput = mNeedsEmptyOutput; - r.isNBTSensitive = nbtSensitive; - r.mFakeRecipe = fakeRecipe; - r.mEnabled = enabled; - if (neiDesc != null) r.setNeiDesc(neiDesc); - applyDefaultSpecialValues(r); - return r; - } - - private void applyDefaultSpecialValues(GT_Recipe recipe) { - if (recipe.mSpecialValue != 0) return; - - int specialValue = 0; - if (getMetadataOrDefault(GT_RecipeConstants.LOW_GRAVITY, false)) specialValue -= 100; - if (getMetadataOrDefault(GT_RecipeConstants.CLEANROOM, false)) specialValue -= 200; - for (RecipeMetadataKey ident : SPECIAL_VALUE_ALIASES) { - Integer metadata = getMetadataOrDefault(ident, null); - if (metadata != null) { - specialValue = metadata; - break; - } - } - recipe.mSpecialValue = specialValue; - } - - public Collection addTo(IRecipeMap recipeMap) { - if (skip) { - return Collections.emptyList(); - } - return recipeMap.doAdd(this); - } - - public GT_RecipeBuilder reset() { - metadataStorage = null; - alts = null; - chances = null; - duration = -1; - enabled = true; - eut = -1; - fakeRecipe = false; - fluidInputs = null; - fluidOutputs = null; - hidden = false; - inputsBasic = null; - inputsOreDict = null; - mCanBeBuffered = true; - mNeedsEmptyOutput = false; - nbtSensitive = false; - neiDesc = null; - recipeCategory = null; - optimize = true; - outputs = null; - special = null; - specialValue = 0; - skip = false; - valid = true; - return this; - } -} diff --git a/src/main/java/gregtech/api/util/GT_RecipeConstants.java b/src/main/java/gregtech/api/util/GT_RecipeConstants.java deleted file mode 100644 index c8a002c6c2..0000000000 --- a/src/main/java/gregtech/api/util/GT_RecipeConstants.java +++ /dev/null @@ -1,692 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes; -import static gregtech.api.util.GT_RecipeMapUtil.convertCellToFluid; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Optional; - -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -import com.elisis.gtnhlanth.common.item.MaskList; -import com.elisis.gtnhlanth.common.item.PhotolithographicMask; -import com.elisis.gtnhlanth.common.register.LanthItemList; - -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.IRecipeMap; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeCategories; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.RecipeMetadataKey; -import gregtech.api.recipe.metadata.SimpleRecipeMetadataKey; -import gregtech.common.items.GT_MetaGenerated_Item_03; -import gregtech.common.items.ID_MetaItem_03; - -// this class is intended to be import-static-ed on every recipe script -// so take care to not put unrelated stuff here! -public class GT_RecipeConstants { - - /** - * Set to true to signal the recipe require low gravity. do nothing if recipe set specialValue explicitly. Can - * coexist with CLEANROOM just fine - */ - public static final RecipeMetadataKey LOW_GRAVITY = SimpleRecipeMetadataKey - .create(Boolean.class, "low_gravity"); - /** - * Set to true to signal the recipe require cleanroom. do nothing if recipe set specialValue explicitly. Can coexist - * with LOW_GRAVITY just fine - */ - public static final RecipeMetadataKey CLEANROOM = SimpleRecipeMetadataKey - .create(Boolean.class, "cleanroom"); - /** - * Common additive to use in recipe, e.g. for PBF, this is coal amount. - */ - public static final RecipeMetadataKey ADDITIVE_AMOUNT = SimpleRecipeMetadataKey - .create(Integer.class, "additives"); - /** - * Used for fusion reactor. Denotes ignition threshold. - */ - public static final RecipeMetadataKey FUSION_THRESHOLD = SimpleRecipeMetadataKey - .create(Integer.class, "fusion_threshold"); - /** - * Research time in a scanner used in ticks. - */ - public static final RecipeMetadataKey RESEARCH_TIME = SimpleRecipeMetadataKey - .create(Integer.class, "research_time"); - /** - * Fuel type. TODO should we use enum directly? - */ - public static final RecipeMetadataKey FUEL_TYPE = SimpleRecipeMetadataKey - .create(Integer.class, "fuel_type"); - /** - * Fuel value. - */ - public static final RecipeMetadataKey FUEL_VALUE = SimpleRecipeMetadataKey - .create(Integer.class, "fuel_value"); - /** - * Required heat for heating coil (Kelvin). - */ - public static final RecipeMetadataKey COIL_HEAT = SimpleRecipeMetadataKey - .create(Integer.class, "coil_heat"); - /** - * Research item used by assline recipes. - */ - public static final RecipeMetadataKey RESEARCH_ITEM = SimpleRecipeMetadataKey - .create(ItemStack.class, "research_item"); - /** - * For assembler. It accepts a single item as oredict. It looks like no one uses this anyway... - */ - public static final RecipeMetadataKey OREDICT_INPUT = SimpleRecipeMetadataKey - .create(Object.class, "oredict_input"); - /** - * Replicator output material. - */ - public static final RecipeMetadataKey MATERIAL = SimpleRecipeMetadataKey - .create(Materials.class, "material"); - /** - * Marker for {@link #UniversalArcFurnace} to tell that the recipe belongs to recycling category. - */ - public static final RecipeMetadataKey RECYCLE = SimpleRecipeMetadataKey.create(Boolean.class, "recycle"); - /** - * For Microwave. - */ - public static final RecipeMetadataKey EXPLODE = SimpleRecipeMetadataKey.create(Boolean.class, "explode"); - /** - * For Microwave. - */ - public static final RecipeMetadataKey ON_FIRE = SimpleRecipeMetadataKey.create(Boolean.class, "on_fire"); - - /** - * Nano Forge Tier. - */ - public static final RecipeMetadataKey NANO_FORGE_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "nano_forge_tier"); - - /** - * FOG Exotic recipe tier. - */ - public static final RecipeMetadataKey FOG_EXOTIC_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "fog_exotic_tier"); - - /** - * FOG Plasma recipe tier. - */ - public static final RecipeMetadataKey FOG_PLASMA_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "fog_plasma_tier"); - - /** - * DEFC Casing tier. - */ - public static final RecipeMetadataKey DEFC_CASING_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "defc_casing_tier"); - - /** - * Chemplant Casing tier. Beware, codewise index starts at 0, but it is tier 1. - */ - public static final RecipeMetadataKey CHEMPLANT_CASING_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "chemplant_casing_tier"); - - /** - * QFT Focus tier. - */ - public static final RecipeMetadataKey QFT_FOCUS_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "qft_focus_tier"); - - /** - * Tier of advanced compression (HIP/black hole) - */ - public static final RecipeMetadataKey COMPRESSION_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "compression"); - - /** - * Dissolution Tank Ratio. - */ - public static final RecipeMetadataKey DISSOLUTION_TANK_RATIO = SimpleRecipeMetadataKey - .create(Integer.class, "dissolution_tank_ratio"); - - /** - * Duration in days for the RTG. - */ - public static final RecipeMetadataKey RTG_DURATION_IN_DAYS = SimpleRecipeMetadataKey - .create(Integer.class, "rtg_duration_in_days"); - - /** - * Basic output for the Large Naquadah Generator. - */ - public static final RecipeMetadataKey LNG_BASIC_OUTPUT = SimpleRecipeMetadataKey - .create(Integer.class, "lng_basic_output"); - - /** - * Coil tier for the Naquadah Fuel Refinery. - */ - public static final RecipeMetadataKey NFR_COIL_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "nfr_coil_tier"); - - /** - * NKE range for the neutron activator. - */ - public static final RecipeMetadataKey NKE_RANGE = SimpleRecipeMetadataKey - .create(Integer.class, "nke_range"); - /** - * Precise Assembler casing tier. - */ - public static final RecipeMetadataKey PRECISE_ASSEMBLER_CASING_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "precise_assembler_casing_tier"); - /** - * CoAL casing tier. - */ - public static final RecipeMetadataKey COAL_CASING_TIER = SimpleRecipeMetadataKey - .create(Integer.class, "coal_casing_tier"); - - /** - * LFTR output power. - */ - public static final RecipeMetadataKey LFTR_OUTPUT_POWER = SimpleRecipeMetadataKey - .create(Integer.class, "lftr_output_power"); - - /** - * Research Station data. - */ - public static final RecipeMetadataKey RESEARCH_STATION_DATA = SimpleRecipeMetadataKey - .create(Integer.class, "research_station_data"); - - /** - * glass tier required for the biovat recipes. - */ - public static final RecipeMetadataKey SIEVERTS = SimpleRecipeMetadataKey.create(Integer.class, "sieverts"); - - public static final RecipeMetadataKey DECAY_TICKS = SimpleRecipeMetadataKey - .create(Integer.class, "decay_ticks"); - - public static final RecipeMetadataKey NOBLE_GASES = SimpleRecipeMetadataKey - .create(Boolean.class, "noble_gases"); - - public static final RecipeMetadataKey ANAEROBE_GASES = SimpleRecipeMetadataKey - .create(Boolean.class, "anaerobe_gases"); - - public static final RecipeMetadataKey NO_GAS = SimpleRecipeMetadataKey.create(Boolean.class, "no_gas"); - - /** - * Add a arc furnace recipe. Adds to both normal arc furnace and plasma arc furnace. - * Will override the fluid input with oxygen/plasma for the respective recipe maps, so there is no point setting it. - */ - public static final IRecipeMap UniversalArcFurnace = IRecipeMap.newRecipeMap(builder -> { - if (!GT_Utility.isArrayOfLength(builder.getItemInputsBasic(), 1) - || GT_Utility.isArrayEmptyOrNull(builder.getItemOutputs())) return Collections.emptyList(); - int aDuration = builder.getDuration(); - if (aDuration <= 0) { - return Collections.emptyList(); - } - builder.duration(aDuration); - boolean recycle = builder.getMetadataOrDefault(RECYCLE, false); - Collection ret = new ArrayList<>(); - for (Materials mat : new Materials[] { Materials.Argon, Materials.Nitrogen }) { - int tPlasmaAmount = (int) Math.max(1L, aDuration / (mat.getMass() * 16L)); - GT_RecipeBuilder plasmaBuilder = builder.copy() - .fluidInputs(mat.getPlasma(tPlasmaAmount)) - .fluidOutputs(mat.getGas(tPlasmaAmount)); - if (recycle) { - plasmaBuilder.recipeCategory(RecipeCategories.plasmaArcFurnaceRecycling); - } - ret.addAll(RecipeMaps.plasmaArcFurnaceRecipes.doAdd(plasmaBuilder)); - } - GT_RecipeBuilder arcBuilder = builder.copy() - .fluidInputs(Materials.Oxygen.getGas(aDuration)); - if (recycle) { - arcBuilder.recipeCategory(RecipeCategories.arcFurnaceRecycling); - } - ret.addAll(RecipeMaps.arcFurnaceRecipes.doAdd(arcBuilder)); - return ret; - }); - - /** - * Add a chemical reactor recipe to both LCR and singleblocks. - */ - public static final IRecipeMap UniversalChemical = IRecipeMap.newRecipeMap(builder -> { - for (ItemStack input : builder.getItemInputsBasic()) { - // config >= 10 -> this is a special chemical recipe that output fluid/canned fluid variant. - // it doesn't belong to multiblocks - if (GT_Utility.isAnyIntegratedCircuit(input) && input.getItemDamage() >= 10) { - return builder.addTo(RecipeMaps.chemicalReactorRecipes); - } - } - return GT_Utility.concat( - builder.copy() - .addTo(RecipeMaps.chemicalReactorRecipes), - convertCellToFluid(builder, false) - // LCR does not need cleanroom. - .metadata(CLEANROOM, false) - .addTo(RecipeMaps.multiblockChemicalReactorRecipes)); - }); - - /** - * Adds an engraver recipe that might use purified water. Still added to the regular recipemap if it ends up not - * needing it. - */ - public static final IRecipeMap WaferEngravingRecipes = IRecipeMap.newRecipeMap(builder -> { - // spotless:off - enum Wafer{ - Naquadah, - Europium, - Americium, - // Beamline masks - MaskT1, - MaskT2, - MaskT3, - } - // spotless:on - // Find the wafer used - Wafer wafer = null; - PhotolithographicMask t1Item = (PhotolithographicMask) LanthItemList.maskMap.get(MaskList.BLANK1); - PhotolithographicMask t2Item = (PhotolithographicMask) LanthItemList.maskMap.get(MaskList.BLANK2); - PhotolithographicMask t3Item = (PhotolithographicMask) LanthItemList.maskMap.get(MaskList.BLANK3); - for (ItemStack input : builder.getItemInputsBasic()) { - if (input.getItem() instanceof GT_MetaGenerated_Item_03) { - int meta = input.getItemDamage() - 32000; - // Check if this input item is indicating a wafer recipe we want to modify - if (meta == ID_MetaItem_03.Circuit_Silicon_Wafer3.ID) wafer = Wafer.Naquadah; - else if (meta == ID_MetaItem_03.Circuit_Silicon_Wafer4.ID) wafer = Wafer.Europium; - else if (meta == ID_MetaItem_03.Circuit_Silicon_Wafer5.ID) wafer = Wafer.Americium; - } - - // Now look for beamline masks - if (input.getItem() instanceof PhotolithographicMask mask) { - String spectrum = mask.getDescSpectrum(); - if (spectrum.equals(t1Item.getDescSpectrum())) wafer = Wafer.MaskT1; - else if (spectrum.equals(t2Item.getDescSpectrum())) wafer = Wafer.MaskT2; - else if (spectrum.equals(t3Item.getDescSpectrum())) wafer = Wafer.MaskT3; - } - - // Found a wafer, stop checking inputs - if (wafer != null) break; - } - - int recipeTime = builder.duration; - // Bonus for using purified water of a higher tier than necessary - int halfBoostedRecipeTime = (int) (recipeTime * 0.75); - int boostedRecipeTime = (int) (recipeTime * 0.5); - - // If this recipe does not use a wafer, exit without modifying it. - if (wafer == null) return builder.addTo(RecipeMaps.laserEngraverRecipes); - switch (wafer) { - case Naquadah -> { - ArrayList items = new ArrayList<>(Arrays.asList(builder.getItemInputsBasic())); - ItemStack[] itemInputs = items.toArray(new ItemStack[] {}); - // Naquadah wafers can use grade 1-2 purified water for a bonus, otherwise use distilled so we don't - // have to - // deal with circuits - return GT_Utility.concat( - builder.copy() - .itemInputs(itemInputs) - .fluidInputs(GT_ModHandler.getDistilledWater(100L)) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .itemInputs(itemInputs) - .fluidInputs(Materials.Grade1PurifiedWater.getFluid(100L)) - .duration(halfBoostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .itemInputs(itemInputs) - .fluidInputs(Materials.Grade2PurifiedWater.getFluid(100L)) - .duration(boostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes)); - } - case Europium -> { - // Require purified water for europium wafers, at least grade 3 - return GT_Utility.concat( - builder.copy() - .fluidInputs(Materials.Grade3PurifiedWater.getFluid(100L)) - .duration(recipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .fluidInputs(Materials.Grade4PurifiedWater.getFluid(100L)) - .duration(boostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes)); - } - case Americium -> { - // Require purified water for americium wafers, at least grade 5 - return GT_Utility.concat( - builder.copy() - .fluidInputs(Materials.Grade5PurifiedWater.getFluid(100L)) - .duration(recipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .fluidInputs(Materials.Grade6PurifiedWater.getFluid(100L)) - .duration(boostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes)); - } - // Masks require much more purified water because they can make many wafers at once - case MaskT1 -> { - // T1 masks require grade 1, 2 or 3 purified water - return GT_Utility.concat( - builder.copy() - .fluidInputs(Materials.Grade1PurifiedWater.getFluid(32000L)) - .duration(recipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .fluidInputs(Materials.Grade2PurifiedWater.getFluid(32000L)) - .duration(halfBoostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .fluidInputs(Materials.Grade3PurifiedWater.getFluid(32000L)) - .duration(boostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes)); - } - case MaskT2 -> { - // T2 masks require grade 4 or 5 purified water - return GT_Utility.concat( - builder.copy() - .fluidInputs(Materials.Grade4PurifiedWater.getFluid(32000L)) - .duration(recipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .fluidInputs(Materials.Grade5PurifiedWater.getFluid(32000L)) - .duration(boostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes)); - } - case MaskT3 -> { - // T3 masks require grade 6, 7 or 8 purified water - return GT_Utility.concat( - builder.copy() - .fluidInputs(Materials.Grade6PurifiedWater.getFluid(32000L)) - .duration(recipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .fluidInputs(Materials.Grade7PurifiedWater.getFluid(32000L)) - .duration(halfBoostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes), - builder.copy() - .fluidInputs(Materials.Grade8PurifiedWater.getFluid(32000L)) - .duration(boostedRecipeTime) - .addTo(RecipeMaps.laserEngraverRecipes)); - } - } - - throw new RuntimeException("Unreachable code reached in Laser Engraver Recipe Transformer"); - }); - - /** - * The one and only :tm: assline recipe adder. - * Uses {@link #RESEARCH_ITEM} metadata as research item, and {@link #RESEARCH_TIME} metadata as research time, unit - * in ticks. - */ - public static final IRecipeMap AssemblyLine = IRecipeMap.newRecipeMap(builder -> { - Optional rr = builder.forceOreDictInput() - .validateInputCount(4, 16) - .validateOutputCount(1, 1) - .validateOutputFluidCount(-1, 0) - .validateInputFluidCount(1, 4) - .buildWithAlt(); - // noinspection SimplifyOptionalCallChains - if (!rr.isPresent()) return Collections.emptyList(); - GT_Recipe.GT_Recipe_WithAlt r = rr.get(); - ItemStack[][] mOreDictAlt = r.mOreDictAlt; - Object[] inputs = builder.getItemInputsOreDict(); - ItemStack aResearchItem = builder.getMetadata(RESEARCH_ITEM); - if (aResearchItem == null) { - return Collections.emptyList(); - } - ItemStack aOutput = r.mOutputs[0]; - int tPersistentHash = 1; - for (int i = 0, mOreDictAltLength = mOreDictAlt.length; i < mOreDictAltLength; i++) { - ItemStack[] alts = mOreDictAlt[i]; - Object input = inputs[i]; - if (input == null) { - GT_Log.err.println( - "addAssemblingLineRecipe " + aResearchItem.getDisplayName() - + " --> " - + aOutput.getUnlocalizedName() - + " there is some null item in that recipe"); - } - if (input instanceof ItemStack) { - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash((ItemStack) input, true, false); - } else if (input instanceof ItemStack[]) { - for (ItemStack alt : ((ItemStack[]) input)) { - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(alt, true, false); - if (alt == null) { - GT_Log.err.println( - "addAssemblingLineRecipe " + aResearchItem.getDisplayName() - + " --> " - + aOutput.getUnlocalizedName() - + " there is some null alt item in that recipe"); - } - } - tPersistentHash *= 31; - } else if (input instanceof Object[]objs) { - Arrays.sort( - alts, - Comparator - .comparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).modId) - .thenComparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).name) - .thenComparingInt(Items.feather::getDamage) - .thenComparingInt(s -> s.stackSize)); - - tPersistentHash = tPersistentHash * 31 + (objs[0] == null ? "" : objs[0].toString()).hashCode(); - tPersistentHash = tPersistentHash * 31 + ((Number) objs[1]).intValue(); - } - } - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aResearchItem, true, false); - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aOutput, true, false); - for (FluidStack fluidInput : r.mFluidInputs) { - if (fluidInput == null) continue; - tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(fluidInput, true, false); - } - int aResearchTime = builder.getMetadataOrDefault(RESEARCH_TIME, 0); - tPersistentHash = tPersistentHash * 31 + aResearchTime; - tPersistentHash = tPersistentHash * 31 + r.mDuration; - tPersistentHash = tPersistentHash * 31 + r.mEUt; - - GT_Recipe.GT_Recipe_AssemblyLine tRecipe = new GT_Recipe.GT_Recipe_AssemblyLine( - aResearchItem, - aResearchTime, - r.mInputs, - r.mFluidInputs, - aOutput, - r.mDuration, - r.mEUt, - r.mOreDictAlt); - tRecipe.setPersistentHash(tPersistentHash); - GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add(tRecipe); - GT_AssemblyLineUtils.addRecipeToCache(tRecipe); - - ItemStack writesDataStick = ItemList.Tool_DataStick.getWithName(1L, "Writes Research result"); - GT_AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(writesDataStick, tRecipe, false); - Collection ret = new ArrayList<>(3); - ret.addAll( - GT_Values.RA.stdBuilder() - .itemInputs(aResearchItem) - .itemOutputs(aOutput) - .special(writesDataStick) - .duration(aResearchTime) - .eut(TierEU.RECIPE_LV) - .specialValue(-201) // means it's scanned - .noOptimize() - .ignoreCollision() - .fake() - .addTo(scannerFakeRecipes)); - - ItemStack readsDataStick = ItemList.Tool_DataStick.getWithName(1L, "Reads Research result"); - GT_AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(readsDataStick, tRecipe, false); - ret.add( - RecipeMaps.assemblylineVisualRecipes.addFakeRecipe( - false, - r.mInputs, - new ItemStack[] { aOutput }, - new ItemStack[] { readsDataStick }, - r.mFluidInputs, - null, - r.mDuration, - r.mEUt, - 0, - r.mOreDictAlt, - false)); - - return ret; - }); - - /** - * Adds an Electric Blast Furnace recipe that might use gas. - */ - public static final IRecipeMap BlastFurnaceWithGas = IRecipeMap.newRecipeMap(builder -> { - Collection ret = new ArrayList<>(); - int basicGasAmount = builder.getMetadataOrDefault(ADDITIVE_AMOUNT, 1000); - double durationBase = builder.getDuration(); - ArrayList items = new ArrayList<>(Arrays.asList(builder.getItemInputsBasic())); - int circuitConfig = 1; - if (items.size() == 1) {// Set circuit config if it is a dust -> ingot recipe. - ItemData data = GT_OreDictUnificator.getAssociation(items.get(0)); - if (data != null) { - OrePrefixes prefix = data.mPrefix; - if (OrePrefixes.dust.equals(prefix)) { - circuitConfig = 1; - } else if (OrePrefixes.dustSmall.equals(prefix)) { - circuitConfig = 4; - } else if (OrePrefixes.dustTiny.equals(prefix)) { - circuitConfig = 9; - } - } - } else { // Set circuit config if there is an integrated circuit - for (int i = 0; i < items.size(); i++) { - if (GT_Utility.isAnyIntegratedCircuit(items.get(i))) { - circuitConfig = items.get(i) - .getItemDamage(); - items.remove(i--); - } - } - } - - if (builder.getMetadataOrDefault(NO_GAS, false)) { - items.add(GT_Utility.getIntegratedCircuit(circuitConfig)); - ret.addAll( - builder.copy() - .itemInputs(items.toArray(new ItemStack[0])) - .fluidInputs() - .duration((int) Math.max(durationBase * 1.1, 1)) - .addTo(RecipeMaps.blastFurnaceRecipes)); - items.remove(items.size() - 1); - circuitConfig += 10; - } - - items.add(GT_Utility.getIntegratedCircuit(circuitConfig)); - boolean nobleGases = builder.getMetadataOrDefault(NOBLE_GASES, false); - boolean anaerobeGases = builder.getMetadataOrDefault(ANAEROBE_GASES, false); - Collection gases = new ArrayList<>(); - - if (nobleGases && anaerobeGases) { - gases = BlastFurnaceGasStat.getNobleAndAnaerobeGases(); - } else if (nobleGases) { - gases = BlastFurnaceGasStat.getNobleGases(); - } else if (anaerobeGases) { - gases = BlastFurnaceGasStat.getAnaerobeGases(); - } - for (BlastFurnaceGasStat gas : gases) { - int gasAmount = (int) (gas.recipeConsumedAmountMultiplier * basicGasAmount); - int duration = (int) Math.max(gas.recipeTimeMultiplier * durationBase, 1); - ret.addAll( - builder.copy() - .itemInputs(items.toArray(new ItemStack[0])) - .fluidInputs(GT_Utility.copyAmount(gasAmount, gas.gas)) - .duration(duration) - .addTo(RecipeMaps.blastFurnaceRecipes)); - } - return ret; - }); - - /** - * Just like any normal assembler recipe, however it accepts one input item to be oredicted. Pass in the item to - * oredict via {@link #OREDICT_INPUT}. It will be used along all other item inputs as input of this recipe. - */ - public static IRecipeMap AssemblerOD = IRecipeMap.newRecipeMap(builder -> { - Collection ret = new ArrayList<>(); - for (ItemStack input : GT_OreDictUnificator.getOresImmutable(builder.getMetadata(OREDICT_INPUT))) { - ret.addAll( - builder.copy() - .itemInputs(GT_RecipeMapUtil.appendArray(builder.getItemInputsBasic(), input)) - .addTo(RecipeMaps.assemblerRecipes)); - } - return ret; - }); - - /** - * A universal fuel adder. It's actually just a dispatcher towards all actual fuel recipe maps. - * Dispatch based on {@link #FUEL_TYPE}. Uses {@link #FUEL_VALUE} as fuel value. - * Can use {@link FuelType#ordinal()} as a human-readable form of what FUEL_TYPE should be. - * You can bypass this and add to relevant fuel maps directly if you wish. - */ - public static IRecipeMap Fuel = IRecipeMap.newRecipeMap(builder -> { - builder.validateInputCount(1, 1) - .validateNoInputFluid() - .validateOutputCount(-1, 1) - .validateNoOutputFluid(); - if (!builder.isValid()) return Collections.emptyList(); - Integer fuelType = builder.getMetadata(FUEL_TYPE); - if (fuelType == null) return Collections.emptyList(); - builder.metadata(FUEL_VALUE, builder.getMetadataOrDefault(FUEL_VALUE, 0)); - return FuelType.get(fuelType) - .getTarget() - .doAdd(builder); - }); - - public enum FuelType { - - // ORDER MATTERS. DO NOT INSERT ELEMENT BETWEEN EXISTING ONES - DieselFuel(RecipeMaps.dieselFuels), - GasTurbine(RecipeMaps.gasTurbineFuels), - // appears unused - HotFuel(RecipeMaps.hotFuels), - SemiFluid(RecipeMaps.denseLiquidFuels), - PlasmaTurbine(RecipeMaps.plasmaFuels), - Magic(RecipeMaps.magicFuels),; - - private static final FuelType[] VALUES = values(); - private final IRecipeMap target; - - FuelType(IRecipeMap target) { - this.target = target; - } - - public static FuelType get(int fuelType) { - if (fuelType < 0 || fuelType >= VALUES.length) return SemiFluid; - return VALUES[fuelType]; - } - - public IRecipeMap getTarget() { - return target; - } - } - - static { - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(COIL_HEAT); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FUSION_THRESHOLD); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FUEL_VALUE); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(NANO_FORGE_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FOG_EXOTIC_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FOG_PLASMA_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(DEFC_CASING_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(CHEMPLANT_CASING_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(QFT_FOCUS_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(DISSOLUTION_TANK_RATIO); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(RTG_DURATION_IN_DAYS); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(LNG_BASIC_OUTPUT); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(NFR_COIL_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(NKE_RANGE); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(PRECISE_ASSEMBLER_CASING_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(COAL_CASING_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(COMPRESSION_TIER); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(RESEARCH_STATION_DATA); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(SIEVERTS); - GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(DECAY_TICKS); - - } -} diff --git a/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java b/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java deleted file mode 100644 index 67d50188fe..0000000000 --- a/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java +++ /dev/null @@ -1,198 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.Mods.GregTech; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Function; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.common.Loader; -import gnu.trove.list.TIntList; -import gnu.trove.list.array.TIntArrayList; -import gregtech.api.interfaces.IRecipeMap; -import gregtech.api.recipe.RecipeMetadataKey; - -/** - * Define helpers useful in the creation of recipe maps. - */ -public class GT_RecipeMapUtil { - - public static final Function ALL_FAKE_RECIPE = r -> { - r.mFakeRecipe = true; - return r; - }; - - private static final Map addonRecipeMaps = new HashMap<>(); - private static final Multimap> delayedActions = ArrayListMultimap.create(); - - /** - * Set of metadata that work as alias for special values. - */ - public static final Set> SPECIAL_VALUE_ALIASES = new HashSet<>(); - - public static T[] appendArray(T[] arr, T val) { - T[] newArr = Arrays.copyOf(arr, arr.length + 1); - newArr[arr.length] = val; - return newArr; - } - - public static GT_RecipeTemplate asTemplate(GT_Recipe r) { - return asTemplate(r, false); - } - - public static GT_RecipeTemplate asTemplate(GT_Recipe r, boolean includeTemplate) { - return new GT_RecipeTemplate(r, includeTemplate); - } - - public static List buildRecipeForMultiblock(GT_RecipeBuilder b) { - return buildOrEmpty(convertCellToFluid(b, true)); - - } - - public static List buildRecipeForMultiblockNoCircuit(GT_RecipeBuilder b) { - return buildOrEmpty(convertCellToFluid(b, false)); - } - - public static GT_RecipeBuilder convertCellToFluid(GT_RecipeBuilder b, boolean removeIntegratedCircuit) { - List itemInputs = new ArrayList<>(Arrays.asList(b.getItemInputsBasic())); - List itemOutputs = new ArrayList<>(Arrays.asList(b.getItemOutputs())); - List fluidInputs = new ArrayList<>(Arrays.asList(b.getFluidInputs())); - List fluidOutputs = new ArrayList<>(Arrays.asList(b.getFluidOutputs())); - TIntList chances = b.getChances() != null ? new TIntArrayList(b.getChances()) : null; - cellToFluid(itemInputs, fluidInputs, removeIntegratedCircuit, null); - cellToFluid(itemOutputs, fluidOutputs, removeIntegratedCircuit, chances); - itemInputs.removeIf(Objects::isNull); - if (chances == null) { - itemOutputs.removeIf(Objects::isNull); - } - fluidInputs.removeIf(Objects::isNull); - fluidOutputs.removeIf(Objects::isNull); - b.itemInputs(itemInputs.toArray(new ItemStack[0])); - b.itemOutputs(itemOutputs.toArray(new ItemStack[0]), chances != null ? chances.toArray() : null); - b.fluidInputs(fluidInputs.toArray(new FluidStack[0])); - b.fluidOutputs(fluidOutputs.toArray(new FluidStack[0])); - return b; - } - - private static void cellToFluid(List items, List fluids, boolean removeIntegratedCircuit, - TIntList chances) { - for (int i = items.size() - 1; i >= 0; i--) { - ItemStack item = items.get(i); - if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item) - || (removeIntegratedCircuit && GT_Utility.isAnyIntegratedCircuit(item))) { - fluids.add(GT_Utility.convertCellToFluid(item)); - items.remove(i); - if (chances != null) chances.removeAt(i); - } - } - } - - public static List buildOrEmpty(GT_RecipeBuilder builder) { - return builder.build() - .map(Collections::singletonList) - .orElse(Collections.emptyList()); - } - - /** - * Register a recipe map as part of your mod's public API under your modID and your given identifier. - * - * @param identifier map name - * @param recipeMap the map to register - * @param dependencies fully qualified identifier of dependent recipe maps. scheduler will only add recipes to one - * of the dependent recipe maps and this recipe map concurrently, guaranteeing thread safety. - * Currently unused, but you are advised to fill them, so that when The Day (tm) comes we don't - * end up with a bunch of weird concurrency bugs. - */ - public static void registerRecipeMap(String identifier, IRecipeMap recipeMap, RecipeMapDependency... dependencies) { - String modId = Loader.instance() - .activeModContainer() - .getModId(); - if (GregTech.ID.equals(modId)) throw new IllegalStateException( - "do not register recipe map under the name of gregtech! do it in your own preinit!"); - String id = modId + "@" + identifier; - addonRecipeMaps.put(id, recipeMap); - for (Consumer action : delayedActions.get(id)) { - action.accept(recipeMap); - } - } - - /** - * Use this to register recipes for a recipe map in addon not present at compile time. - *

- * Do not use this for recipes maps already in {@link GT_RecipeConstants}. None of them will be available via this - * interface! - * - * @param identifier recipe map id - * @param registerAction DO NOT ADD RECIPES TO MAPS OTHER THAN THE ONE PASSED TO YOU. DO NOT DO ANYTHING OTHER THAN - * ADDING RECIPES TO THIS R - */ - public static void registerRecipesFor(String modid, String identifier, Consumer registerAction) { - String id = modid + "@" + identifier; - IRecipeMap map = addonRecipeMaps.get(id); - if (map == null) delayedActions.put(id, registerAction); - else registerAction.accept(map); - } - - public static final class GT_RecipeTemplate { - - private final GT_Recipe template; - private final List derivatives = new ArrayList<>(); - - private GT_RecipeTemplate(GT_Recipe template, boolean includeTemplate) { - this.template = template; - if (includeTemplate) derivatives.add(template); - } - - public GT_Recipe derive() { - GT_Recipe derived = template.copyShallow(); - derivatives.add(derived); - return derived; - } - - public List getAll() { - // fix shallow references - Set references = Collections.newSetFromMap(new IdentityHashMap<>()); - for (GT_Recipe r : derivatives) { - if (!references.add(r.mInputs)) r.mInputs = r.mInputs.clone(); - if (!references.add(r.mOutputs)) r.mOutputs = r.mOutputs.clone(); - if (!references.add(r.mFluidInputs)) r.mFluidInputs = r.mFluidInputs.clone(); - if (!references.add(r.mFluidOutputs)) r.mFluidOutputs = r.mFluidOutputs.clone(); - } - return derivatives; - } - } - - public static final class RecipeMapDependency { - - private final IRecipeMap obj; - private final String id; - - public RecipeMapDependency(IRecipeMap obj, String id) { - this.obj = obj; - this.id = id; - } - - public static RecipeMapDependency create(String id) { - return new RecipeMapDependency(null, id); - } - - public static RecipeMapDependency create(IRecipeMap obj) { - return new RecipeMapDependency(obj, null); - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java b/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java deleted file mode 100644 index 5acb15b242..0000000000 --- a/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java +++ /dev/null @@ -1,872 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.enums.GT_Values.L; -import static gregtech.api.enums.GT_Values.M; -import static gregtech.api.enums.GT_Values.RA; -import static gregtech.api.enums.GT_Values.VP; -import static gregtech.api.enums.Materials.Bronze; -import static gregtech.api.enums.Materials.Cobalt; -import static gregtech.api.enums.Materials.DarkSteel; -import static gregtech.api.enums.Materials.Diamond; -import static gregtech.api.enums.Materials.FierySteel; -import static gregtech.api.enums.Materials.Gold; -import static gregtech.api.enums.Materials.Iron; -import static gregtech.api.enums.Materials.IronWood; -import static gregtech.api.enums.Materials.Knightmetal; -import static gregtech.api.enums.Materials.Lead; -import static gregtech.api.enums.Materials.Ruby; -import static gregtech.api.enums.Materials.Sapphire; -import static gregtech.api.enums.Materials.Steel; -import static gregtech.api.enums.Materials.Steeleaf; -import static gregtech.api.enums.Materials.Thaumium; -import static gregtech.api.enums.Materials.Void; -import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes; -import static gregtech.api.recipe.RecipeMaps.hammerRecipes; -import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; -import static gregtech.api.recipe.RecipeMaps.wiremillRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; -import static gregtech.api.util.GT_RecipeConstants.RECYCLE; -import static gregtech.api.util.GT_RecipeConstants.UniversalArcFurnace; -import static gregtech.api.util.GT_Utility.calculateRecipeEU; -import static gregtech.api.util.GT_Utility.getTier; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.SetMultimap; - -import cpw.mods.fml.relauncher.ReflectionHelper; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TierEU; -import gregtech.api.objects.ItemData; -import gregtech.api.objects.MaterialStack; -import gregtech.api.recipe.RecipeCategories; -import ic2.api.reactor.IReactorComponent; - -/** - * Class for Automatic Recipe registering. - */ -public class GT_RecipeRegistrator { - - /** - * List of Materials, which are used in the Creation of Sticks. All Rod Materials are automatically added to this - * List. - */ - public static final List sRodMaterialList = new ArrayList<>(); - - private static final ItemStack sMt1 = new ItemStack(Blocks.dirt, 1, 0), sMt2 = new ItemStack(Blocks.dirt, 1, 0); - private static final String s_H = "h", s_F = "f", s_I = "I", s_P = "P", s_R = "R"; - private static final RecipeShape[] sShapes = new RecipeShape[] { - new RecipeShape(sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1, null), - new RecipeShape(sMt1, null, sMt1, sMt1, null, sMt1, sMt1, sMt1, sMt1), - new RecipeShape(null, sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1), - new RecipeShape(sMt1, sMt1, sMt1, sMt1, null, sMt1, null, null, null), - new RecipeShape(sMt1, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1), - new RecipeShape(sMt1, sMt1, sMt1, sMt1, null, sMt1, sMt1, null, sMt1), - new RecipeShape(null, null, null, sMt1, null, sMt1, sMt1, null, sMt1), - new RecipeShape(null, sMt1, null, null, sMt1, null, null, sMt2, null), - new RecipeShape(sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2, null), - new RecipeShape(null, sMt1, null, null, sMt2, null, null, sMt2, null), - new RecipeShape(sMt1, sMt1, null, sMt1, sMt2, null, null, sMt2, null), - new RecipeShape(null, sMt1, sMt1, null, sMt2, sMt1, null, sMt2, null), - new RecipeShape(sMt1, sMt1, null, null, sMt2, null, null, sMt2, null), - new RecipeShape(null, sMt1, sMt1, null, sMt2, null, null, sMt2, null), - new RecipeShape(null, sMt1, null, sMt1, null, null, null, sMt1, sMt2), - new RecipeShape(null, sMt1, null, null, null, sMt1, sMt2, sMt1, null), - new RecipeShape(null, sMt1, null, sMt1, null, sMt1, null, null, sMt2), - new RecipeShape(null, sMt1, null, sMt1, null, sMt1, sMt2, null, null), - new RecipeShape(null, sMt2, null, null, sMt1, null, null, sMt1, null), - new RecipeShape(null, sMt2, null, null, sMt2, null, sMt1, sMt1, sMt1), - new RecipeShape(null, sMt2, null, null, sMt2, null, null, sMt1, null), - new RecipeShape(null, sMt2, null, sMt1, sMt2, null, sMt1, sMt1, null), - new RecipeShape(null, sMt2, null, null, sMt2, sMt1, null, sMt1, sMt1), - new RecipeShape(null, sMt2, null, null, sMt2, null, sMt1, sMt1, null), - new RecipeShape(sMt1, null, null, null, sMt2, null, null, null, sMt2), - new RecipeShape(null, null, sMt1, null, sMt2, null, sMt2, null, null), - new RecipeShape(sMt1, null, null, null, sMt2, null, null, null, null), - new RecipeShape(null, null, sMt1, null, sMt2, null, null, null, null), - new RecipeShape(sMt1, sMt2, null, null, null, null, null, null, null), - new RecipeShape(sMt2, sMt1, null, null, null, null, null, null, null), - new RecipeShape(sMt1, null, null, sMt2, null, null, null, null, null), - new RecipeShape(sMt2, null, null, sMt1, null, null, null, null, null), - new RecipeShape(sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, null, sMt2, null), - new RecipeShape(sMt1, sMt1, null, sMt1, sMt1, sMt2, sMt1, sMt1, null), - new RecipeShape(null, sMt1, sMt1, sMt2, sMt1, sMt1, null, sMt1, sMt1), - new RecipeShape(null, sMt2, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1), - new RecipeShape(sMt1, sMt1, sMt1, sMt1, sMt2, sMt1, null, sMt2, null), - new RecipeShape(sMt1, sMt1, null, sMt1, sMt2, sMt2, sMt1, sMt1, null), - new RecipeShape(null, sMt1, sMt1, sMt2, sMt2, sMt1, null, sMt1, sMt1), - new RecipeShape(null, sMt2, null, sMt1, sMt2, sMt1, sMt1, sMt1, sMt1), - new RecipeShape(sMt1, null, null, null, sMt1, null, null, null, null), - new RecipeShape(null, sMt1, null, sMt1, null, null, null, null, null), - new RecipeShape(sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null), - new RecipeShape(null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2) }; - public static final Field SHAPED_ORE_RECIPE_WIDTH = ReflectionHelper.findField(ShapedOreRecipe.class, "width"); - public static final Field SHAPED_ORE_RECIPE_HEIGHT = ReflectionHelper.findField(ShapedOreRecipe.class, "height"); - private static volatile Map> indexedRecipeListCache; - private static final String[][] sShapesA = new String[][] { null, null, null, - { "Helmet", s_P + s_P + s_P, s_P + s_H + s_P }, - { "ChestPlate", s_P + s_H + s_P, s_P + s_P + s_P, s_P + s_P + s_P }, - { "Pants", s_P + s_P + s_P, s_P + s_H + s_P, s_P + " " + s_P }, { "Boots", s_P + " " + s_P, s_P + s_H + s_P }, - { "Sword", " " + s_P + " ", s_F + s_P + s_H, " " + s_R + " " }, - { "Pickaxe", s_P + s_I + s_I, s_F + s_R + s_H, " " + s_R + " " }, - { "Shovel", s_F + s_P + s_H, " " + s_R + " ", " " + s_R + " " }, - { "Axe", s_P + s_I + s_H, s_P + s_R + " ", s_F + s_R + " " }, - { "Axe", s_P + s_I + s_H, s_P + s_R + " ", s_F + s_R + " " }, - { "Hoe", s_P + s_I + s_H, s_F + s_R + " ", " " + s_R + " " }, - { "Hoe", s_P + s_I + s_H, s_F + s_R + " ", " " + s_R + " " }, - { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, - { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, - { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, - { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R }, - { "Sword", " " + s_R + " ", s_F + s_P + s_H, " " + s_P + " " }, - { "Pickaxe", " " + s_R + " ", s_F + s_R + s_H, s_P + s_I + s_I }, - { "Shovel", " " + s_R + " ", " " + s_R + " ", s_F + s_P + s_H }, - { "Axe", s_F + s_R + " ", s_P + s_R + " ", s_P + s_I + s_H }, - { "Axe", s_F + s_R + " ", s_P + s_R + " ", s_P + s_I + s_H }, - { "Hoe", " " + s_R + " ", s_F + s_R + " ", s_P + s_I + s_H }, - { "Hoe", " " + s_R + " ", s_F + s_R + " ", s_P + s_I + s_H }, - { "Spear", s_P + s_H + " ", s_F + s_R + " ", " " + " " + s_R }, - { "Spear", s_P + s_H + " ", s_F + s_R + " ", " " + " " + s_R }, { "Knive", s_H + s_P, s_R + s_F }, - { "Knive", s_F + s_H, s_P + s_R }, { "Knive", s_F + s_H, s_P + s_R }, { "Knive", s_P + s_F, s_R + s_H }, - { "Knive", s_P + s_F, s_R + s_H }, null, null, null, null, - { "WarAxe", s_P + s_P + s_P, s_P + s_R + s_P, s_F + s_R + s_H }, null, null, null, - { "Shears", s_H + s_P, s_P + s_F }, { "Shears", s_H + s_P, s_P + s_F }, - { "Scythe", s_I + s_P + s_H, s_R + s_F + s_P, s_R + " " + " " }, - { "Scythe", s_H + s_P + s_I, s_P + s_F + s_R, " " + " " + s_R } }; - - static { - // flush the cache on post load finish - GregTech_API.sAfterGTPostload.add(() -> indexedRecipeListCache = null); - } - - public static void registerMaterialRecycling(ItemStack aStack, Materials aMaterial, long aMaterialAmount, - MaterialStack aByproduct) { - if (GT_Utility.isStackInvalid(aStack)) return; - if (aByproduct != null) { - aByproduct = aByproduct.clone(); - aByproduct.mAmount /= aStack.stackSize; - } - GT_OreDictUnificator.addItemData( - GT_Utility.copyAmount(1, aStack), - new ItemData(aMaterial, aMaterialAmount / aStack.stackSize, aByproduct)); - } - - public static void registerMaterialRecycling(ItemStack aStack, ItemData aData) { - if (GT_Utility.isStackInvalid(aStack) || GT_Utility.areStacksEqual(new ItemStack(Items.blaze_rod), aStack) - || aData == null - || !aData.hasValidMaterialData() - || !aData.mMaterial.mMaterial.mAutoGenerateRecycleRecipes - || aData.mMaterial.mAmount <= 0 - || GT_Utility.getFluidForFilledItem(aStack, false) != null - || aData.mMaterial.mMaterial.mSubTags.contains(SubTag.NO_RECIPES)) return; - registerReverseMacerating(GT_Utility.copyAmount(1, aStack), aData, aData.mPrefix == null); - if (!GT_Utility.areStacksEqual(GT_ModHandler.getIC2Item("iridiumOre", 1L), aStack)) { - registerReverseSmelting( - GT_Utility.copyAmount(1, aStack), - aData.mMaterial.mMaterial, - aData.mMaterial.mAmount, - true); - registerReverseFluidSmelting( - GT_Utility.copyAmount(1, aStack), - aData.mMaterial.mMaterial, - aData.mMaterial.mAmount, - aData.getByProduct(0)); - registerReverseArcSmelting(GT_Utility.copyAmount(1, aStack), aData); - } - } - - /** - * @param aStack the stack to be recycled. - * @param aMaterial the Material. - * @param aMaterialAmount the amount of it in Material Units. - */ - public static void registerReverseFluidSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount, - MaterialStack aByproduct) { - if (aStack == null || aMaterial == null - || aMaterial.mSmeltInto.mStandardMoltenFluid == null - || !aMaterial.contains(SubTag.SMELTING_TO_FLUID) - || (L * aMaterialAmount) / (M * aStack.stackSize) <= 0) return; - - ItemStack recipeOutput = aByproduct == null ? null - : aByproduct.mMaterial.contains(SubTag.NO_SMELTING) || !aByproduct.mMaterial.contains(SubTag.METAL) - ? aByproduct.mMaterial.contains(SubTag.FLAMMABLE) - ? GT_OreDictUnificator.getDust(Materials.Ash, aByproduct.mAmount / 2) - : aByproduct.mMaterial.contains(SubTag.UNBURNABLE) - ? GT_OreDictUnificator.getDustOrIngot(aByproduct.mMaterial.mSmeltInto, aByproduct.mAmount) - : null - : GT_OreDictUnificator.getIngotOrDust(aByproduct.mMaterial.mSmeltInto, aByproduct.mAmount); - - GT_RecipeBuilder builder = RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, aStack)); - if (recipeOutput != null) { - builder.itemOutputs(recipeOutput); - } - long powerUsage = Math.max(8, (long) Math.sqrt(2 * aMaterial.mSmeltInto.mStandardMoltenFluid.getTemperature())); - // avoid full amp recipes - int powerTier = getTier(powerUsage); - if (powerTier > 0 && powerTier < VP.length && powerUsage > VP[powerTier]) { - powerUsage = VP[powerTier]; - } - builder.fluidOutputs(aMaterial.mSmeltInto.getMolten((L * aMaterialAmount) / (M * aStack.stackSize))) - .duration((int) Math.max(1, (24 * aMaterialAmount) / M)) - .eut(powerUsage) - .recipeCategory(RecipeCategories.fluidExtractorRecycling) - .addTo(fluidExtractionRecipes); - } - - /** - * @param aStack the stack to be recycled. - * @param aMaterial the Material. - * @param aMaterialAmount the amount of it in Material Units. - * @param aAllowAlloySmelter if it is allowed to be recycled inside the Alloy Smelter. - */ - public static void registerReverseSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount, - boolean aAllowAlloySmelter) { - if (aStack == null || aMaterial == null - || aMaterialAmount <= 0 - || aMaterial.contains(SubTag.NO_SMELTING) - || (aMaterialAmount > M && aMaterial.contains(SubTag.METAL)) - || (aMaterial.getProcessingMaterialTierEU() > TierEU.IV)) return; - if (aMaterial == Materials.Naquadah || aMaterial == Materials.NaquadahEnriched) return; - - aMaterialAmount /= aStack.stackSize; - - if (aAllowAlloySmelter) GT_ModHandler.addSmeltingAndAlloySmeltingRecipe( - GT_Utility.copyAmount(1, aStack), - GT_OreDictUnificator.getIngot(aMaterial.mSmeltInto, aMaterialAmount), - false); - else GT_ModHandler.addSmeltingRecipe( - GT_Utility.copyAmount(1, aStack), - GT_OreDictUnificator.getIngot(aMaterial.mSmeltInto, aMaterialAmount)); - } - - public static void registerReverseArcSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount, - MaterialStack aByProduct01, MaterialStack aByProduct02, MaterialStack aByProduct03) { - registerReverseArcSmelting( - aStack, - new ItemData( - aMaterial == null ? null : new MaterialStack(aMaterial, aMaterialAmount), - aByProduct01, - aByProduct02, - aByProduct03)); - } - - public static void registerReverseArcSmelting(ItemStack aStack, ItemData aData) { - if (aStack == null || aData == null) return; - aData = new ItemData(aData); - - if (!aData.hasValidMaterialData()) return; - boolean isRecycle = true; - - for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { - if (tMaterial.mMaterial == Materials.Iron || tMaterial.mMaterial == Materials.Copper - || tMaterial.mMaterial == Materials.WroughtIron - || tMaterial.mMaterial == Materials.AnnealedCopper) { - ItemData stackData = GT_OreDictUnificator.getItemData(aStack); - if (stackData != null - && (stackData.mPrefix == OrePrefixes.ingot || stackData.mPrefix == OrePrefixes.dust)) { - // iron ingot/dust -> wrought iron, copper ingot/dust -> annealed copper - isRecycle = false; - } - } - - if (tMaterial.mMaterial.contains(SubTag.UNBURNABLE)) { - tMaterial.mMaterial = tMaterial.mMaterial.mSmeltInto.mArcSmeltInto; - continue; - } - if (tMaterial.mMaterial.contains(SubTag.EXPLOSIVE)) { - tMaterial.mMaterial = Materials.Ash; - tMaterial.mAmount /= 16; - continue; - } - if (tMaterial.mMaterial.contains(SubTag.FLAMMABLE)) { - tMaterial.mMaterial = Materials.Ash; - tMaterial.mAmount /= 8; - continue; - } - if (tMaterial.mMaterial.contains(SubTag.NO_SMELTING)) { - tMaterial.mAmount = 0; - continue; - } - if (tMaterial.mMaterial.contains(SubTag.METAL)) { - - tMaterial.mMaterial = tMaterial.mMaterial.mSmeltInto.mArcSmeltInto; - continue; - } - tMaterial.mAmount = 0; - } - - aData = new ItemData(aData); - if (aData.mByProducts.length > 3) for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { - if (tMaterial.mMaterial == Materials.Ash) tMaterial.mAmount = 0; - } - - aData = new ItemData(aData); - - if (!aData.hasValidMaterialData()) return; - - long tAmount = 0; - for (MaterialStack tMaterial : aData.getAllMaterialStacks()) - tAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass(); - - ArrayList outputs = new ArrayList<>(); - if (GT_OreDictUnificator.getIngotOrDust(aData.mMaterial) != null) { - outputs.add(GT_OreDictUnificator.getIngotOrDust(aData.mMaterial)); - } - for (int i = 0; i < 8; i++) { - if (GT_OreDictUnificator.getIngotOrDust(aData.getByProduct(i)) != null) { - outputs.add(GT_OreDictUnificator.getIngotOrDust(aData.getByProduct(i))); - } - } - if (!outputs.isEmpty()) { - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); - recipeBuilder.itemInputs(aStack) - .itemOutputs(outputs.toArray(new ItemStack[0])) - .fluidInputs(Materials.Oxygen.getGas((int) Math.max(16, tAmount / M))) - .duration(((int) Math.max(16, tAmount / M)) * TICKS) - .eut(90) - .metadata(RECYCLE, isRecycle) - .addTo(UniversalArcFurnace); - } - - } - - public static void registerReverseMacerating(ItemStack aStack, Materials aMaterial, long aMaterialAmount, - MaterialStack aByProduct01, MaterialStack aByProduct02, MaterialStack aByProduct03, boolean aAllowHammer) { - registerReverseMacerating( - aStack, - new ItemData( - aMaterial == null ? null : new MaterialStack(aMaterial, aMaterialAmount), - aByProduct01, - aByProduct02, - aByProduct03), - aAllowHammer); - } - - public static void registerReverseMacerating(ItemStack aStack, ItemData aData, boolean aAllowHammer) { - if (aStack == null || aData == null) return; - aData = new ItemData(aData); - - if (!aData.hasValidMaterialData()) return; - - for (MaterialStack tMaterial : aData.getAllMaterialStacks()) - tMaterial.mMaterial = tMaterial.mMaterial.mMacerateInto; - - aData = new ItemData(aData); - - if (!aData.hasValidMaterialData()) return; - - long tAmount = 0; - for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { - tAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass(); - } - - { - ArrayList outputs = new ArrayList<>(); - if (GT_OreDictUnificator.getDust(aData.mMaterial) != null) { - outputs.add(GT_OreDictUnificator.getDust(aData.mMaterial)); - } - for (int i = 0; i < 3; i++) { - if (GT_OreDictUnificator.getDust(aData.getByProduct(i)) != null) { - outputs.add(GT_OreDictUnificator.getDust(aData.getByProduct(i))); - } - } - if (!outputs.isEmpty()) { - ItemStack[] outputsArray = outputs.toArray(new ItemStack[0]); - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); - recipeBuilder.itemInputs(aStack) - .itemOutputs(outputsArray) - .duration( - (aData.mMaterial.mMaterial == Materials.Marble ? 1 : (int) Math.max(16, tAmount / M)) * TICKS) - .eut(4) - .recipeCategory(RecipeCategories.maceratorRecycling) - .addTo(maceratorRecipes); - } - } - - if (!aAllowHammer) { - return; - } - - for (MaterialStack tMaterial : aData.getAllMaterialStacks()) { - if (tMaterial.mMaterial.contains(SubTag.CRYSTAL) && !tMaterial.mMaterial.contains(SubTag.METAL) - && tMaterial.mMaterial != Materials.Glass - && GT_OreDictUnificator.getDust(aData.mMaterial) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, aStack)) - .itemOutputs(GT_OreDictUnificator.getDust(aData.mMaterial)) - .duration(10 * SECONDS) - .eut(TierEU.RECIPE_LV) - .recipeCategory(RecipeCategories.forgeHammerRecycling) - .addTo(hammerRecipes); - break; - } - } - - } - - /** - * Place Materials which you want to replace in Non-GT-Recipes here (warning HUGHE impact on loading times!) - */ - private static final Materials[] VANILLA_MATS = { Cobalt, Gold, Iron, Lead, FierySteel, Void, Bronze, Diamond, Ruby, - Sapphire, Steel, IronWood, Steeleaf, Knightmetal, Thaumium, DarkSteel, }; - - /** - * You give this Function a Material and it will scan almost everything for adding recycling Recipes and replacing - * Ingots, Gems etc. - * - * @param aMats Materials, for example an Ingot or a Gem. - * @param aPlate the Plate referenced to aMat - * @param aRecipeReplacing allows to replace the Recipe with a Plate variant - */ - public static synchronized void registerUsagesForMaterials(String aPlate, boolean aRecipeReplacing, - ItemStack... aMats) { - for (ItemStack aMat : aMats) { - aMat = GT_Utility.copyOrNull(aMat); - - if (aMat == null) continue; - - ItemData aItemData = GT_OreDictUnificator.getItemData(aMat); - if (aItemData == null || aItemData.mPrefix != OrePrefixes.ingot) aPlate = null; - if (aPlate != null && GT_OreDictUnificator.getFirstOre(aPlate, 1) == null) aPlate = null; - - sMt1.func_150996_a(aMat.getItem()); - sMt1.stackSize = 1; - Items.feather.setDamage(sMt1, Items.feather.getDamage(aMat)); - - sMt2.func_150996_a(new ItemStack(Blocks.dirt).getItem()); - sMt2.stackSize = 1; - Items.feather.setDamage(sMt2, 0); - - if (aItemData != null && aItemData.hasValidPrefixMaterialData()) { - for (RecipeShape tRecipe : sShapes) { - for (ItemStack tCrafted : GT_ModHandler.getRecipeOutputsBuffered(tRecipe.shape)) { - GT_OreDictUnificator.addItemData( - tCrafted, - new ItemData(aItemData.mMaterial.mMaterial, aItemData.mMaterial.mAmount * tRecipe.amount1)); - // - // GT_Log.out.println("###################################################################################"); - // GT_Log.out.println("registerUsagesForMaterials used aPlate: "+aPlate); - // GT_Log.out.println("registerUsagesForMaterials used aPlate: - // "+aMat.getUnlocalizedName()); - // GT_Log.out.println("registerUsagesForMaterials used aPlate: - // "+aMat.getDisplayName()); - // - // GT_Log.out.println("###################################################################################"); - } - } - } - registerStickStuff(aPlate, aItemData, aRecipeReplacing); - } - } - - private static List getRecipeList(RecipeShape shape) { - boolean force = !GregTech_API.sPostloadStarted || GregTech_API.sPostloadFinished; - if (force || indexedRecipeListCache == null) { - synchronized (GT_RecipeRegistrator.class) { - if (indexedRecipeListCache == null || force) { - indexedRecipeListCache = createIndexedRecipeListCache(); - } - } - } - return indexedRecipeListCache.get(shape); - } - - private static Map> createIndexedRecipeListCache() { - Map> result = new IdentityHashMap<>(); - ArrayList allRecipeList = (ArrayList) CraftingManager.getInstance() - .getRecipeList(); - // filter using the empty slots in the shape. - // if the empty slots doesn't match, the recipe will definitely fail - SetMultimap, RecipeShape> filter = HashMultimap.create(); - for (RecipeShape shape : sShapes) { - for (List list : shape.getEmptySlotsAllVariants()) { - filter.put(list, shape); - } - } - List buffer = new ArrayList<>(9); - for (IRecipe tRecipe : allRecipeList) { - if (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe) { - // we don't target shapeless recipes - continue; - } - buffer.clear(); - ItemStack tStack = tRecipe.getRecipeOutput(); - if (GT_Utility.isStackValid(tStack) && tStack.getMaxStackSize() == 1 - && tStack.getMaxDamage() > 0 - && !(tStack.getItem() instanceof ItemBlock) - && !(tStack.getItem() instanceof IReactorComponent) - && !GT_ModHandler.isElectricItem(tStack) - && !GT_Utility.isStackInList(tStack, GT_ModHandler.sNonReplaceableItems)) { - if (tRecipe instanceof ShapedOreRecipe tShapedRecipe) { - if (checkRecipeShape( - buffer, - tShapedRecipe.getInput(), - getRecipeWidth(tShapedRecipe), - getRecipeHeight(tShapedRecipe))) { - for (RecipeShape s : filter.get(buffer)) { - result.computeIfAbsent(s, k -> new ArrayList<>()) - .add(tRecipe); - } - } - } else if (tRecipe instanceof ShapedRecipes tShapedRecipe) { - if (checkRecipeShape( - buffer, - tShapedRecipe.recipeItems, - getRecipeWidth(tShapedRecipe), - getRecipeHeight(tShapedRecipe))) { - for (RecipeShape s : filter.get(buffer)) { - result.computeIfAbsent(s, k -> new ArrayList<>()) - .add(tRecipe); - } - } - } else { - for (RecipeShape s : sShapes) { - // unknown recipe type. cannot determine empty slots. we choose to add to the recipe list for - // all shapes - result.computeIfAbsent(s, k -> new ArrayList<>()) - .add(tRecipe); - } - } - } - } - return result; - } - - private static boolean checkRecipeShape(List emptySlotIndexesBuffer, Object[] input, int tRecipeWidth, - int tRecipeHeight) { - for (int y = 0; y < 3; y++) { - for (int x = 0; x < 3; x++) { - if (x >= tRecipeWidth || y >= tRecipeHeight) { - emptySlotIndexesBuffer.add(x + y * 3); - continue; - } - Object tObject = input[x + y * tRecipeWidth]; - if (tObject == null) { - emptySlotIndexesBuffer.add(x + y * 3); - continue; - } - if (tObject instanceof ItemStack - && (((ItemStack) tObject).getItem() == null || ((ItemStack) tObject).getMaxStackSize() < 2 - || ((ItemStack) tObject).getMaxDamage() > 0 - || ((ItemStack) tObject).getItem() instanceof ItemBlock)) { - return false; - } - if (tObject instanceof List && ((List) tObject).isEmpty()) { - return false; - } - } - } - return true; - } - - private static synchronized void registerStickStuff(String aPlate, ItemData aItemData, boolean aRecipeReplacing) { - ItemStack tStack; - for (Materials tMaterial : sRodMaterialList) { - ItemStack tMt2 = GT_OreDictUnificator.get(OrePrefixes.stick, tMaterial, 1); - if (tMt2 != null) { - sMt2.func_150996_a(tMt2.getItem()); - sMt2.stackSize = 1; - Items.feather.setDamage(sMt2, Items.feather.getDamage(tMt2)); - - for (int i = 0; i < sShapes.length; i++) { - RecipeShape tRecipe = sShapes[i]; - - for (ItemStack tCrafted : GT_ModHandler - .getRecipeOutputs(getRecipeList(tRecipe), true, tRecipe.shape)) { - if (aItemData != null && aItemData.hasValidPrefixMaterialData()) - GT_OreDictUnificator.addItemData( - tCrafted, - new ItemData( - aItemData.mMaterial.mMaterial, - aItemData.mMaterial.mAmount * tRecipe.amount1, - new MaterialStack(tMaterial, OrePrefixes.stick.mMaterialAmount * tRecipe.amount2))); - - if (aRecipeReplacing && aPlate != null && sShapesA[i] != null && sShapesA[i].length > 1) { - assert aItemData != null; - - if (null != (tStack = GT_ModHandler.removeRecipe(tRecipe.shape))) { - switch (sShapesA[i].length) { - case 2 -> GT_ModHandler.addCraftingRecipe( - tStack, - GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { sShapesA[i][1], s_P.charAt(0), aPlate, s_R.charAt(0), - OrePrefixes.stick.get(tMaterial), s_I.charAt(0), aItemData }); - case 3 -> GT_ModHandler.addCraftingRecipe( - tStack, - GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { sShapesA[i][1], sShapesA[i][2], s_P.charAt(0), aPlate, - s_R.charAt(0), OrePrefixes.stick.get(tMaterial), s_I.charAt(0), - aItemData }); - default -> GT_ModHandler.addCraftingRecipe( - tStack, - GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { sShapesA[i][1], sShapesA[i][2], sShapesA[i][3], s_P.charAt(0), - aPlate, s_R.charAt(0), OrePrefixes.stick.get(tMaterial), s_I.charAt(0), - aItemData }); - } - } - } - } - } - } - } - } - - /** - * Registers wiremill recipes for given material using integrated circuits. - * - * @param aMaterial material to register - * @param baseDuration base duration ticks for ingot -> 1x wire recipe - * @param aEUt EU/t for recipe If you provide a proper EU tier for recipe processing then aEUt will be - * overriden with it. - */ - public static void registerWiremillRecipes(Materials aMaterial, int baseDuration, int aEUt) { - registerWiremillRecipes( - aMaterial, - baseDuration, - calculateRecipeEU(aMaterial, aEUt), - OrePrefixes.ingot, - OrePrefixes.stick, - 2); - } - - /** - * Registers wiremill recipes for given material using integrated circuits. - * - * @param aMaterial material to register - * @param baseDuration base duration ticks for ingot -> 1x wire recipe - * @param aEUt EU/t for recipe - * @param prefix1 prefix corresponds to ingot - * @param prefix2 prefix corresponds to stick - * @param multiplier amount of wires created from 1 ingot - */ - public static void registerWiremillRecipes(Materials aMaterial, int baseDuration, int aEUt, OrePrefixes prefix1, - OrePrefixes prefix2, int multiplier) { - if (GT_OreDictUnificator.get(prefix1, aMaterial, 1L) != null - && GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(prefix1, aMaterial, 1L), GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, multiplier)) - .duration(baseDuration * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix1, aMaterial, 2L / multiplier), - GT_Utility.getIntegratedCircuit(2)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L)) - .duration(((int) (baseDuration * 1.5f)) * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix1, aMaterial, 4L / multiplier), - GT_Utility.getIntegratedCircuit(4)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L)) - .duration(baseDuration * 2 * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix1, aMaterial, 8L / multiplier), - GT_Utility.getIntegratedCircuit(8)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L)) - .duration(((int) (baseDuration * 2.5f)) * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix1, aMaterial, 12L / multiplier), - GT_Utility.getIntegratedCircuit(12)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L)) - .duration(baseDuration * 3 * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix1, aMaterial, 16L / multiplier), - GT_Utility.getIntegratedCircuit(16)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L)) - .duration(((int) (baseDuration * 3.5f)) * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - } - - if (GT_OreDictUnificator.get(prefix2, aMaterial, 1L) != null - && GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(prefix2, aMaterial, 1L), GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 2L / multiplier)) - .duration(((int) (baseDuration * 0.5f)) * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix2, aMaterial, 4L / multiplier), - GT_Utility.getIntegratedCircuit(2)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L)) - .duration(baseDuration * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix2, aMaterial, 8L / multiplier), - GT_Utility.getIntegratedCircuit(4)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L)) - .duration(((int) (baseDuration * 1.5f)) * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix2, aMaterial, 16L / multiplier), - GT_Utility.getIntegratedCircuit(8)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L)) - .duration(baseDuration * 2 * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix2, aMaterial, 24L / multiplier), - GT_Utility.getIntegratedCircuit(12)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L)) - .duration(((int) (baseDuration * 2.5f)) * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(prefix2, aMaterial, 32L / multiplier), - GT_Utility.getIntegratedCircuit(16)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L)) - .duration(baseDuration * 3 * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - } - if (GT_OreDictUnificator.get(prefix1, aMaterial, 1L) != null - && GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(prefix1, aMaterial, 1L), GT_Utility.getIntegratedCircuit(3)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 4L * multiplier)) - .duration(baseDuration * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - } - if (GT_OreDictUnificator.get(prefix2, aMaterial, 1L) != null - && GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) { - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(prefix2, aMaterial, 1L), GT_Utility.getIntegratedCircuit(3)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 2L * multiplier)) - .duration(((int) (baseDuration * 0.5f)) * TICKS) - .eut(aEUt) - .addTo(wiremillRecipes); - } - } - - public static boolean hasVanillaRecipes(Materials materials) { - return Arrays.stream(VANILLA_MATS) - .anyMatch(mat -> mat == materials); - } - - private static int getRecipeWidth(ShapedOreRecipe r) { - try { - return (int) SHAPED_ORE_RECIPE_WIDTH.get(r); - } catch (ReflectiveOperationException e) { - throw new RuntimeException(e); - } - } - - private static int getRecipeHeight(ShapedOreRecipe r) { - try { - return (int) SHAPED_ORE_RECIPE_HEIGHT.get(r); - } catch (ReflectiveOperationException e) { - throw new RuntimeException(e); - } - } - - private static int getRecipeHeight(ShapedRecipes r) { - return r.recipeHeight; - } - - private static int getRecipeWidth(ShapedRecipes r) { - return r.recipeWidth; - } - - private static class RecipeShape { - - private final ItemStack[] shape; - private int amount1; - private int amount2; - - public RecipeShape(ItemStack... shape) { - this.shape = shape; - - for (ItemStack stack : shape) { - if (stack == sMt1) this.amount1++; - if (stack == sMt2) this.amount2++; - } - } - - public List> getEmptySlotsAllVariants() { - // "shake" the grid in 8 direction and see if the recipe shape is still valid - // also include the "no movement" case - ImmutableList.Builder> b = ImmutableList.builder(); - for (int i = -1; i < 2; i++) { - if (i != 0 && !isColClear(i + 1)) continue; - for (int j = -1; j < 2; j++) { - if (j != 0 && !isRowClear(j + 1)) continue; - b.add(getEmptySlots(i, j)); - } - } - return b.build(); - } - - private boolean isRowClear(int row) { - for (int i = 0; i < 3; i++) { - if (shape[i + row * 3] != null) return false; - } - return true; - } - - private boolean isColClear(int col) { - for (int i = 0; i < 3; i++) { - if (shape[col + i * 3] != null) return false; - } - return true; - } - - private List getEmptySlots(int offsetX, int offsetY) { - ImmutableList.Builder b = ImmutableList.builder(); - for (int i = 0; i < shape.length; i++) { - int mappedIndex = i - offsetX - offsetY * 3; - // empty slot if it either - // 1) map to a slot outside the original shape - // 2) map to an empty slot in original shape - if (mappedIndex < 0 || mappedIndex > 8 || shape[mappedIndex] == null) b.add(i); - } - return b.build(); - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_RenderingWorld.java b/src/main/java/gregtech/api/util/GT_RenderingWorld.java deleted file mode 100644 index 7220b921a5..0000000000 --- a/src/main/java/gregtech/api/util/GT_RenderingWorld.java +++ /dev/null @@ -1,195 +0,0 @@ -package gregtech.api.util; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.ChunkPosition; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.world.ChunkEvent; -import net.minecraftforge.event.world.WorldEvent; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.EventPriority; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; - -/** - * Provide a fake IBlockAccess to support CTM. Facade are supposed to set these when they are placed/received by client. - */ -public class GT_RenderingWorld implements IBlockAccess { - - private static final GT_RenderingWorld INSTANCE = new GT_RenderingWorld(); - /* - * I do not think this map would ever grow too huge, so I won't go too overcomplicated on this one - */ - private final Map infos = new HashMap<>(); - private final Map> index = new HashMap<>(); - private IBlockAccess mWorld = Minecraft.getMinecraft().theWorld; - - private GT_RenderingWorld() { - new FMLEventHandler(); - new ForgeEventHandler(); - } - - public static GT_RenderingWorld getInstance() { - return INSTANCE; - } - - public static GT_RenderingWorld getInstance(IBlockAccess aWorld) { - if (aWorld == INSTANCE) return INSTANCE; - if (aWorld == null) INSTANCE.mWorld = Minecraft.getMinecraft().theWorld; - else INSTANCE.mWorld = aWorld; - return INSTANCE; - } - - private void setWorld(IBlockAccess aWorld) { - if (aWorld == null) mWorld = Minecraft.getMinecraft().theWorld; - else mWorld = aWorld; - } - - public void register(int x, int y, int z, Block block, int meta) { - ChunkPosition key = new ChunkPosition(x, y, z); - infos.put(key, new BlockInfo(block, meta)); - index.computeIfAbsent(new ChunkCoordIntPair(x >> 4, z >> 4), p -> new HashSet<>()) - .add(key); - } - - public void unregister(int x, int y, int z, Block block, int meta) { - ChunkPosition key = new ChunkPosition(x, y, z); - if (infos.remove(key, new BlockInfo(block, meta))) { - ChunkCoordIntPair chunkKey = new ChunkCoordIntPair(x >> 4, z >> 4); - Set set = index.get(chunkKey); - set.remove(key); - if (set.isEmpty()) index.remove(chunkKey); - } - } - - @Override - public Block getBlock(int p_147439_1_, int p_147439_2_, int p_147439_3_) { - BlockInfo blockInfo = infos.get(new ChunkPosition(p_147439_1_, p_147439_2_, p_147439_3_)); - return blockInfo != null ? blockInfo.block : mWorld.getBlock(p_147439_1_, p_147439_2_, p_147439_3_); - } - - @Override - public TileEntity getTileEntity(int p_147438_1_, int p_147438_2_, int p_147438_3_) { - return mWorld.getTileEntity(p_147438_1_, p_147438_2_, p_147438_3_); - } - - @Override - public int getLightBrightnessForSkyBlocks(int p_72802_1_, int p_72802_2_, int p_72802_3_, int p_72802_4_) { - return mWorld.getLightBrightnessForSkyBlocks(p_72802_1_, p_72802_2_, p_72802_3_, p_72802_4_); - } - - @Override - public int getBlockMetadata(int p_72805_1_, int p_72805_2_, int p_72805_3_) { - BlockInfo blockInfo = infos.get(new ChunkPosition(p_72805_1_, p_72805_2_, p_72805_3_)); - return blockInfo != null ? blockInfo.meta : mWorld.getBlockMetadata(p_72805_1_, p_72805_2_, p_72805_3_); - } - - @Override - public int isBlockProvidingPowerTo(int p_72879_1_, int p_72879_2_, int p_72879_3_, int p_72879_4_) { - return mWorld.isBlockProvidingPowerTo(p_72879_1_, p_72879_2_, p_72879_3_, p_72879_4_); - } - - @Override - public boolean isAirBlock(int p_147437_1_, int p_147437_2_, int p_147437_3_) { - return getBlock(p_147437_1_, p_147437_2_, p_147437_3_).isAir(mWorld, p_147437_1_, p_147437_2_, p_147437_3_); - } - - @Override - public BiomeGenBase getBiomeGenForCoords(int p_72807_1_, int p_72807_2_) { - return mWorld.getBiomeGenForCoords(p_72807_1_, p_72807_2_); - } - - @Override - public int getHeight() { - return mWorld.getHeight(); - } - - @Override - public boolean extendedLevelsInChunkCache() { - return mWorld.extendedLevelsInChunkCache(); - } - - @Override - public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default) { - return getBlock(x, y, z).isSideSolid(this, x, y, z, side); - } - - public class FMLEventHandler { - - public FMLEventHandler() { - FMLCommonHandler.instance() - .bus() - .register(this); - } - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onRenderTickStart(TickEvent.RenderTickEvent e) { - if (e.phase == TickEvent.Phase.START) mWorld = Minecraft.getMinecraft().theWorld; - } - } - - public class ForgeEventHandler { - - private ForgeEventHandler() { - MinecraftForge.EVENT_BUS.register(this); - } - - @SubscribeEvent - public void onChunkUnloaded(ChunkEvent.Unload e) { - if (!e.world.isRemote) return; - Set set = index.remove( - e.getChunk() - .getChunkCoordIntPair()); - if (set != null) infos.keySet() - .removeAll(set); - } - - @SubscribeEvent - public void onWorldUnloaded(WorldEvent.Unload e) { - if (!e.world.isRemote) return; - infos.clear(); - index.clear(); - } - } - - private static class BlockInfo { - - private final Block block; - private final int meta; - - public BlockInfo(Block block, int meta) { - this.block = block; - this.meta = meta; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - BlockInfo blockInfo = (BlockInfo) o; - - if (meta != blockInfo.meta) return false; - return Objects.equals(block, blockInfo.block); - } - - @Override - public int hashCode() { - int result = block != null ? block.hashCode() : 0; - result = 31 * result + meta; - return result; - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_Shaped_Recipe.java b/src/main/java/gregtech/api/util/GT_Shaped_Recipe.java deleted file mode 100644 index 95a1a0bb66..0000000000 --- a/src/main/java/gregtech/api/util/GT_Shaped_Recipe.java +++ /dev/null @@ -1,100 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.oredict.ShapedOreRecipe; - -import gregtech.api.interfaces.internal.IGT_CraftingRecipe; - -public class GT_Shaped_Recipe extends ShapedOreRecipe implements IGT_CraftingRecipe { - - public final boolean mRemovableByGT, mKeepingNBT; - private final Enchantment[] mEnchantmentsAdded; - private final int[] mEnchantmentLevelsAdded; - - public GT_Shaped_Recipe(ItemStack aResult, boolean aDismantleAble, boolean aRemovableByGT, boolean aKeepingNBT, - Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, Object... aRecipe) { - super(aResult, aRecipe); - mEnchantmentsAdded = aEnchantmentsAdded; - mEnchantmentLevelsAdded = aEnchantmentLevelsAdded; - mRemovableByGT = aRemovableByGT; - mKeepingNBT = aKeepingNBT; - } - - @Override - public boolean matches(InventoryCrafting aGrid, World aWorld) { - if (mKeepingNBT) { - ItemStack tStack = null; - for (int i = 0; i < aGrid.getSizeInventory(); i++) { - if (aGrid.getStackInSlot(i) != null) { - if (tStack != null) { - if ((tStack.hasTagCompound() != aGrid.getStackInSlot(i) - .hasTagCompound()) || (tStack.hasTagCompound() - && !tStack.getTagCompound() - .equals( - aGrid.getStackInSlot(i) - .getTagCompound()))) - return false; - } - tStack = aGrid.getStackInSlot(i); - } - } - } - return super.matches(aGrid, aWorld); - } - - @Override - public ItemStack getCraftingResult(InventoryCrafting aGrid) { - ItemStack rStack = super.getCraftingResult(aGrid); - if (rStack != null) { - // Update the Stack - GT_Utility.updateItemStack(rStack); - - // Keeping NBT - if (mKeepingNBT) for (int i = 0; i < aGrid.getSizeInventory(); i++) { - if (aGrid.getStackInSlot(i) != null && aGrid.getStackInSlot(i) - .hasTagCompound()) { - rStack.setTagCompound( - (NBTTagCompound) aGrid.getStackInSlot(i) - .getTagCompound() - .copy()); - break; - } - } - - // Charge Values - if (GT_ModHandler.isElectricItem(rStack)) { - GT_ModHandler.dischargeElectricItem(rStack, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false, true); - int tCharge = 0; - for (int i = 0; i < aGrid.getSizeInventory(); i++) tCharge += GT_ModHandler.dischargeElectricItem( - aGrid.getStackInSlot(i), - Integer.MAX_VALUE, - Integer.MAX_VALUE, - true, - true, - true); - if (tCharge > 0) GT_ModHandler.chargeElectricItem(rStack, tCharge, Integer.MAX_VALUE, true, false); - } - - // Add Enchantments - for (int i = 0; i < mEnchantmentsAdded.length; i++) GT_Utility.ItemNBT.addEnchantment( - rStack, - mEnchantmentsAdded[i], - EnchantmentHelper.getEnchantmentLevel(mEnchantmentsAdded[i].effectId, rStack) - + mEnchantmentLevelsAdded[i]); - - // Update the Stack again - GT_Utility.updateItemStack(rStack); - } - return rStack; - } - - @Override - public boolean isRemovable() { - return mRemovableByGT; - } -} diff --git a/src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java b/src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java deleted file mode 100644 index 582dd7cc10..0000000000 --- a/src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java +++ /dev/null @@ -1,100 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -import gregtech.api.interfaces.internal.IGT_CraftingRecipe; - -public class GT_Shapeless_Recipe extends ShapelessOreRecipe implements IGT_CraftingRecipe { - - public final boolean mRemovableByGT, mKeepingNBT; - private final Enchantment[] mEnchantmentsAdded; - private final int[] mEnchantmentLevelsAdded; - - public GT_Shapeless_Recipe(ItemStack aResult, boolean aDismantleAble, boolean aRemovableByGT, boolean aKeepingNBT, - Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, Object... aRecipe) { - super(aResult, aRecipe); - mEnchantmentsAdded = aEnchantmentsAdded; - mEnchantmentLevelsAdded = aEnchantmentLevelsAdded; - mRemovableByGT = aRemovableByGT; - mKeepingNBT = aKeepingNBT; - } - - @Override - public boolean matches(InventoryCrafting aGrid, World aWorld) { - if (mKeepingNBT) { - ItemStack tStack = null; - for (int i = 0; i < aGrid.getSizeInventory(); i++) { - if (aGrid.getStackInSlot(i) != null) { - if (tStack != null) { - if ((tStack.hasTagCompound() != aGrid.getStackInSlot(i) - .hasTagCompound()) || (tStack.hasTagCompound() - && !tStack.getTagCompound() - .equals( - aGrid.getStackInSlot(i) - .getTagCompound()))) - return false; - } - tStack = aGrid.getStackInSlot(i); - } - } - } - return super.matches(aGrid, aWorld); - } - - @Override - public ItemStack getCraftingResult(InventoryCrafting aGrid) { - ItemStack rStack = super.getCraftingResult(aGrid); - if (rStack != null) { - // Update the Stack - GT_Utility.updateItemStack(rStack); - - // Keeping NBT - if (mKeepingNBT) for (int i = 0; i < aGrid.getSizeInventory(); i++) { - if (aGrid.getStackInSlot(i) != null && aGrid.getStackInSlot(i) - .hasTagCompound()) { - rStack.setTagCompound( - (NBTTagCompound) aGrid.getStackInSlot(i) - .getTagCompound() - .copy()); - break; - } - } - - // Charge Values - if (GT_ModHandler.isElectricItem(rStack)) { - GT_ModHandler.dischargeElectricItem(rStack, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false, true); - int tCharge = 0; - for (int i = 0; i < aGrid.getSizeInventory(); i++) tCharge += GT_ModHandler.dischargeElectricItem( - aGrid.getStackInSlot(i), - Integer.MAX_VALUE, - Integer.MAX_VALUE, - true, - true, - true); - if (tCharge > 0) GT_ModHandler.chargeElectricItem(rStack, tCharge, Integer.MAX_VALUE, true, false); - } - - // Add Enchantments - for (int i = 0; i < mEnchantmentsAdded.length; i++) GT_Utility.ItemNBT.addEnchantment( - rStack, - mEnchantmentsAdded[i], - EnchantmentHelper.getEnchantmentLevel(mEnchantmentsAdded[i].effectId, rStack) - + mEnchantmentLevelsAdded[i]); - - // Update the Stack again - GT_Utility.updateItemStack(rStack); - } - return rStack; - } - - @Override - public boolean isRemovable() { - return mRemovableByGT; - } -} diff --git a/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java b/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java deleted file mode 100644 index ebdba1144b..0000000000 --- a/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java +++ /dev/null @@ -1,81 +0,0 @@ -package gregtech.api.util; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.monster.EntitySlime; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.living.LivingSpawnEvent.CheckSpawn; - -import cpw.mods.fml.common.eventhandler.Event; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import gregtech.api.enums.GT_Values; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_MonsterRepellent; - -public class GT_SpawnEventHandler { - - public static volatile List mobReps = new CopyOnWriteArrayList<>(); - // Future Optimiztation ideas, if this isn't sufficient - // 1: Keep a weakref list of mob repellents so we already have the tile - // 2: Have the tick method update a HashMap of (int[], range) so we don't have to load the tile at all - - public GT_SpawnEventHandler() { - MinecraftForge.EVENT_BUS.register(this); - } - - // Range of a powered repellent - public static int getPoweredRepellentRange(int aTier) { - return 16 + (48 * aTier); - } - - // Range of an unpowered repellent - public static int getUnpoweredRepellentRange(int aTier) { - return 4 + (12 * aTier); - } - - @SubscribeEvent - public void denyMobSpawn(CheckSpawn event) { - if (event.getResult() == Event.Result.DENY) return; - - if (event.entityLiving instanceof EntitySlime slime && !slime.hasCustomNameTag() - && event.getResult() == Event.Result.ALLOW) { - event.setResult(Event.Result.DEFAULT); - } - - if (event.getResult() == Event.Result.ALLOW) { - return; - } - - if (event.entityLiving.isCreatureType(EnumCreatureType.monster, false)) { - final double maxRangeCheck = Math.pow(getPoweredRepellentRange(GT_Values.V.length - 1), 2); - for (int[] rep : mobReps) { - if (rep[3] == event.entity.worldObj.provider.dimensionId) { - // If the chunk isn't loaded, we ignore this Repellent - if (!event.entity.worldObj.blockExists(rep[0], rep[1], rep[2])) continue; - final double dx = rep[0] + 0.5F - event.entity.posX; - final double dy = rep[1] + 0.5F - event.entity.posY; - final double dz = rep[2] + 0.5F - event.entity.posZ; - - final double check = (dx * dx + dz * dz + dy * dy); - // Fail early if outside of max range - if (check > maxRangeCheck) continue; - - final TileEntity tTile = event.entity.worldObj.getTileEntity(rep[0], rep[1], rep[2]); - if (tTile instanceof BaseMetaTileEntity metaTile - && metaTile.getMetaTileEntity() instanceof GT_MetaTileEntity_MonsterRepellent repellent - && check <= Math.pow(repellent.mRange, 2)) { - if (event.entityLiving instanceof EntitySlime slime) { - slime.setCustomNameTag("DoNotSpawnSlimes"); - } - event.setResult(Event.Result.DENY); - // We're already DENYing it. No reason to keep checking - return; - } - } - } - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_StreamUtil.java b/src/main/java/gregtech/api/util/GT_StreamUtil.java deleted file mode 100644 index c29e611c4e..0000000000 --- a/src/main/java/gregtech/api/util/GT_StreamUtil.java +++ /dev/null @@ -1,44 +0,0 @@ -package gregtech.api.util; - -import java.util.Arrays; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public final class GT_StreamUtil { - - /** - * Backport of {@link Stream#ofNullable}. - */ - public static Stream ofNullable(@Nullable T value) { - return value == null ? Stream.empty() : Stream.of(value); - } - - /** - * Returns a sequential ordered {@code Stream} whose elements are the specified values, - * if {@code condition} is true, otherwise returns an empty {@code Stream}. - * - * @param the type of stream elements - * @param values the elements of the new stream - * @return the new stream - */ - public static Stream ofConditional(boolean condition, T[] values) { - return condition ? Arrays.stream(values) : Stream.empty(); - } - - /** - * Returns a sequential {@code Stream} containing a single element, which will be lazily evaluated from supplier. - * - * @param the type of stream elements - * @param supplier the supplier for single stream element - * @return the new stream - */ - public static Stream ofSupplier(Supplier supplier) { - return Stream.generate(supplier) - .limit(1); - } -} diff --git a/src/main/java/gregtech/api/util/GT_StructureUtility.java b/src/main/java/gregtech/api/util/GT_StructureUtility.java deleted file mode 100644 index 6bbb3e1223..0000000000 --- a/src/main/java/gregtech/api/util/GT_StructureUtility.java +++ /dev/null @@ -1,618 +0,0 @@ -package gregtech.api.util; - -import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.ACCEPT; -import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.ACCEPT_STOP; -import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.REJECT; -import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.SKIP; -import static com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode.EXACT; - -import java.util.Arrays; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.IChatComponent; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment; -import com.gtnewhorizon.structurelib.structure.IItemSource; -import com.gtnewhorizon.structurelib.structure.IStructureElement; -import com.gtnewhorizon.structurelib.structure.IStructureElementNoPlacement; -import com.gtnewhorizon.structurelib.structure.StructureUtility; -import com.gtnewhorizon.structurelib.util.ItemStackPredicate; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IHeatingCoil; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; -import gregtech.common.blocks.GT_Block_Casings5; -import gregtech.common.blocks.GT_Block_FrameBox; -import gregtech.common.blocks.GT_Cyclotron_Coils; -import gregtech.common.blocks.GT_Item_Machines; - -public class GT_StructureUtility { - - // private static final Map, String> customNames = new HashMap<>(); - private GT_StructureUtility() { - throw new AssertionError("Not instantiable"); - } - - public static boolean hasMTE(IGregTechTileEntity aTile, Class clazz) { - return aTile != null && clazz.isInstance(aTile.getMetaTileEntity()); - } - - public static IStructureElementNoPlacement ofHatchAdder(IGT_HatchAdder aHatchAdder, int aTextureIndex, - int aDots) { - return ofHatchAdder(aHatchAdder, aTextureIndex, StructureLibAPI.getBlockHint(), aDots - 1); - } - - public static IStructureElement ofFrame(Materials aFrameMaterial) { - if (aFrameMaterial == null) throw new IllegalArgumentException(); - return new IStructureElement<>() { - - private IIcon[] mIcons; - - @Override - public boolean check(T t, World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - if (block instanceof GT_Block_FrameBox frameBox) { - int meta = world.getBlockMetadata(x, y, z); - Materials material = frameBox.getMaterial(meta); - return aFrameMaterial == material; - } - return false; - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - if (mIcons == null) { - mIcons = new IIcon[6]; - Arrays.fill(mIcons, aFrameMaterial.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon()); - } - StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, aFrameMaterial.mRGBa); - return true; - } - - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - ItemStack tFrameStack = getFrameStack(); - if (!GT_Utility.isStackValid(tFrameStack) - || !(tFrameStack.getItem() instanceof ItemBlock tFrameStackItem)) return false; - return tFrameStackItem - .placeBlockAt(tFrameStack, null, world, x, y, z, 6, 0, 0, 0, Items.feather.getDamage(tFrameStack)); - } - - private ItemStack getFrameStack() { - return GT_OreDictUnificator.get(OrePrefixes.frameGt, aFrameMaterial, 1); - } - - @Override - public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - ItemStack tFrameStack = getFrameStack(); - if (!GT_Utility.isStackValid(tFrameStack) || !(tFrameStack.getItem() instanceof ItemBlock)) - return BlocksToPlace.errored; - return BlocksToPlace.create(tFrameStack); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - IItemSource s, EntityPlayerMP actor, Consumer chatter) { - return survivalPlaceBlock( - t, - world, - x, - y, - z, - trigger, - AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - if (check(t, world, x, y, z)) return SKIP; - ItemStack tFrameStack = getFrameStack(); - if (!GT_Utility.isStackValid(tFrameStack) || !(tFrameStack.getItem() instanceof ItemBlock)) - return REJECT; // honestly, this is more like a programming error or pack issue - return StructureUtility.survivalPlaceBlock( - tFrameStack, - ItemStackPredicate.NBTMode.IGNORE_KNOWN_INSIGNIFICANT_TAGS, - null, - false, - world, - x, - y, - z, - env.getSource(), - env.getActor(), - env.getChatter()); - } - }; - } - - public static GT_HatchElementBuilder buildHatchAdder() { - return GT_HatchElementBuilder.builder(); - } - - /** - * Completely equivalent to {@link #buildHatchAdder()}, except it plays nicer with type inference when statically - * imported - */ - public static GT_HatchElementBuilder buildHatchAdder(Class typeToken) { - return GT_HatchElementBuilder.builder(); - } - - public static IStructureElementNoPlacement ofHatchAdder(IGT_HatchAdder aHatchAdder, int aTextureIndex, - Block aHintBlock, int aHintMeta) { - if (aHatchAdder == null || aHintBlock == null) { - throw new IllegalArgumentException(); - } - return new IStructureElementNoPlacement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - return tileEntity instanceof IGregTechTileEntity - && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); - return true; - } - }; - } - - public static IStructureElement ofHatchAdder(IGT_HatchAdder aHatchAdder, int aTextureIndex, - Block aHintBlock, int aHintMeta, BiPredicate shouldSkip, - Function> aMetaId, final IStructureElement.PlaceResult acceptType) { - if (aHatchAdder == null) { - throw new IllegalArgumentException(); - } - return new IStructureElement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - return tileEntity instanceof IGregTechTileEntity - && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); - return true; - } - - @Override - public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) { - // TODO - return false; - } - - @Override - public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - Class clazz = aMetaId.apply(t); - if (clazz == null) return BlocksToPlace.createEmpty(); - return BlocksToPlace.create(is -> clazz.isInstance(GT_Item_Machines.getMetaTileEntity(is))); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - IItemSource s, EntityPlayerMP actor, Consumer chatter) { - return survivalPlaceBlock( - t, - world, - x, - y, - z, - trigger, - AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - if (shouldSkip != null) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - if (tileEntity instanceof IGregTechTileEntity - && shouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return SKIP; - } - if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return REJECT; - Class clazz = aMetaId.apply(t); - if (clazz == null) return REJECT; - ItemStack taken = env.getSource() - .takeOne(is -> clazz.isInstance(GT_Item_Machines.getMetaTileEntity(is)), true); - if (GT_Utility.isStackInvalid(taken)) { - env.getChatter() - .accept( - new ChatComponentTranslation( - "GT5U.autoplace.error.no_mte.class_name", - clazz.getSimpleName())); - return REJECT; - } - if (StructureUtility - .survivalPlaceBlock(taken, EXACT, null, true, world, x, y, z, env.getSource(), env.getActor()) - == ACCEPT) return acceptType; - return REJECT; - } - }; - } - - public static IStructureElement ofHatchAdder(IGT_HatchAdder aHatchAdder, int aTextureIndex, - Block aHintBlock, int aHintMeta, BiPredicate shouldSkip, ToIntFunction aMetaId) { - if (aHatchAdder == null) { - throw new IllegalArgumentException(); - } - return new IStructureElement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - return tileEntity instanceof IGregTechTileEntity - && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); - return true; - } - - @Override - public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) { - // TODO - return false; - } - - @Override - public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - GT_Item_Machines item = (GT_Item_Machines) Item.getItemFromBlock(GregTech_API.sBlockMachines); - int meta = aMetaId.applyAsInt(t); - if (meta < 0) return BlocksToPlace.createEmpty(); - return BlocksToPlace.create( - ItemStackPredicate.from(item) - .setMeta(meta)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - IItemSource s, EntityPlayerMP actor, Consumer chatter) { - return survivalPlaceBlock( - t, - world, - x, - y, - z, - trigger, - AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - if (shouldSkip != null) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - if (tileEntity instanceof IGregTechTileEntity - && shouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return SKIP; - } - if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return REJECT; - GT_Item_Machines item = (GT_Item_Machines) Item.getItemFromBlock(GregTech_API.sBlockMachines); - int meta = aMetaId.applyAsInt(t); - if (meta < 0) return REJECT; - ItemStack taken = env.getSource() - .takeOne( - ItemStackPredicate.from(item) - .setMeta(meta), - true); - if (GT_Utility.isStackInvalid(taken)) { - env.getChatter() - .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_mte.id", meta)); - return REJECT; - } - return StructureUtility - .survivalPlaceBlock(taken, EXACT, null, true, world, x, y, z, env.getSource(), env.getActor()) - == ACCEPT ? ACCEPT_STOP : REJECT; - } - }; - } - - public static IStructureElement ofHatchAdderOptional(IGT_HatchAdder aHatchAdder, int textureIndex, - int dots, Block placeCasing, int placeCasingMeta) { - return ofHatchAdderOptional( - aHatchAdder, - textureIndex, - StructureLibAPI.getBlockHint(), - dots - 1, - placeCasing, - placeCasingMeta); - } - - public static IStructureElement ofHatchAdderOptional(IGT_HatchAdder aHatchAdder, int aTextureIndex, - Block aHintBlock, int hintMeta, Block placeCasing, int placeCasingMeta) { - if (aHatchAdder == null || aHintBlock == null) { - throw new IllegalArgumentException(); - } - return new IStructureElement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - Block worldBlock = world.getBlock(x, y, z); - return (tileEntity instanceof IGregTechTileEntity - && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex)) - || (worldBlock == placeCasing && worldBlock.getDamageValue(world, x, y, z) == placeCasingMeta); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, hintMeta); - return true; - } - - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - world.setBlock(x, y, z, placeCasing, placeCasingMeta, 2); - return true; - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - IItemSource s, EntityPlayerMP actor, Consumer chatter) { - if (check(t, world, x, y, z)) return SKIP; - return StructureUtility - .survivalPlaceBlock(placeCasing, placeCasingMeta, world, x, y, z, s, actor, chatter); - } - }; - } - - /** - * Assume all coils accepted. - * - * @see #ofCoil(BiPredicate, Function) - */ - public static IStructureElement ofCoil(BiConsumer aHeatingCoilSetter, - Function aHeatingCoilGetter) { - return ofCoil((t, l) -> { - aHeatingCoilSetter.accept(t, l); - return true; - }, aHeatingCoilGetter); - } - - /** - * Heating coil structure element. - * - * @param aHeatingCoilSetter Notify the controller of this new coil. Got called exactly once per coil. Might be - * called less times if structure test fails. If the setter returns false then it assumes - * the coil is rejected. - * @param aHeatingCoilGetter Get the current heating level. Null means no coil recorded yet. - */ - public static IStructureElement ofCoil(BiPredicate aHeatingCoilSetter, - Function aHeatingCoilGetter) { - if (aHeatingCoilSetter == null || aHeatingCoilGetter == null) { - throw new IllegalArgumentException(); - } - return new IStructureElement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - if (!(block instanceof IHeatingCoil)) return false; - HeatingCoilLevel existingLevel = aHeatingCoilGetter.apply(t), - newLevel = ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)); - if (existingLevel == null || existingLevel == HeatingCoilLevel.None) { - return aHeatingCoilSetter.test(t, newLevel); - } else { - return newLevel == existingLevel; - } - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, GregTech_API.sBlockCasings5, getMetaFromHint(trigger)); - return true; - } - - private int getMetaFromHint(ItemStack trigger) { - return GT_Block_Casings5.getMetaFromCoilHeat(getHeatFromHint(trigger)); - } - - private HeatingCoilLevel getHeatFromHint(ItemStack trigger) { - return HeatingCoilLevel - .getFromTier((byte) Math.min(HeatingCoilLevel.getMaxTier(), Math.max(0, trigger.stackSize - 1))); - } - - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - return world.setBlock(x, y, z, GregTech_API.sBlockCasings5, getMetaFromHint(trigger), 3); - } - - @Override - public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - return BlocksToPlace.create(GregTech_API.sBlockCasings5, getMetaFromHint(trigger)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - IItemSource s, EntityPlayerMP actor, Consumer chatter) { - return survivalPlaceBlock( - t, - world, - x, - y, - z, - trigger, - AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - Block block = world.getBlock(x, y, z); - boolean isCoil = block instanceof IHeatingCoil - && ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)) == getHeatFromHint(trigger); - if (isCoil) return SKIP; - return StructureUtility.survivalPlaceBlock( - GregTech_API.sBlockCasings5, - getMetaFromHint(trigger), - world, - x, - y, - z, - env.getSource(), - env.getActor(), - env.getChatter()); - } - }; - } - - /** - * Assumes all solenoids are accepted. - * - * @see #ofSolenoidCoil(BiPredicate, Function) - */ - public static IStructureElement ofSolenoidCoil(BiConsumer aSolenoidTierSetter, - Function aSolenoidTierGetter) { - return ofSolenoidCoil((t, l) -> { - aSolenoidTierSetter.accept(t, l); - return true; - }, aSolenoidTierGetter); - } - - /** - * Solenoid coil structure element. - * - * @param aSolenoidTierSetter Notify the controller of this new solenoid. Got called exactly once per solenoid. - * Might be - * called less times if structure test fails. If the setter returns false then it assumes - * the solenoid is rejected. - * @param aSolenoidTierGetter Get the solenoid voltage tier. Null means no tier recorded yet. - */ - public static IStructureElement ofSolenoidCoil(BiPredicate aSolenoidTierSetter, - Function aSolenoidTierGetter) { - if (aSolenoidTierSetter == null || aSolenoidTierGetter == null) { - throw new IllegalArgumentException(); - } - return new IStructureElement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - - if (block != GregTech_API.sSolenoidCoilCasings) return false; - - var coils = ((GT_Cyclotron_Coils) GregTech_API.sSolenoidCoilCasings); - - Byte existingLevel = aSolenoidTierGetter.apply(t); - byte newLevel = (byte) (coils.getVoltageTier(world.getBlockMetadata(x, y, z))); - - if (existingLevel == null) { - return aSolenoidTierSetter.test(t, newLevel); - } else { - return newLevel == existingLevel; - } - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI - .hintParticle(world, x, y, z, GregTech_API.sSolenoidCoilCasings, getMetaFromHint(trigger)); - return true; - } - - private int getMetaFromHint(ItemStack trigger) { - return Math.min(Math.max(trigger.stackSize - 1, 0), 10); - } - - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - return world.setBlock(x, y, z, GregTech_API.sSolenoidCoilCasings, getMetaFromHint(trigger), 3); - } - - @Override - public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - return BlocksToPlace.create(GregTech_API.sSolenoidCoilCasings, getMetaFromHint(trigger)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - IItemSource s, EntityPlayerMP actor, Consumer chatter) { - return survivalPlaceBlock( - t, - world, - x, - y, - z, - trigger, - AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); - } - - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - Block block = world.getBlock(x, y, z); - - boolean isCoil = block == GregTech_API.sSolenoidCoilCasings - && world.getBlockMetadata(x, y, z) == getMetaFromHint(trigger); - - if (isCoil) return SKIP; - - return StructureUtility.survivalPlaceBlock( - GregTech_API.sSolenoidCoilCasings, - getMetaFromHint(trigger), - world, - x, - y, - z, - env.getSource(), - env.getActor(), - env.getChatter()); - } - }; - } - - @Nonnull - public static Predicate filterByMTEClass(List> list) { - return is -> { - IMetaTileEntity tile = GT_Item_Machines.getMetaTileEntity(is); - return tile != null && list.stream() - .anyMatch(c -> c.isInstance(tile)); - }; - } - - @Nonnull - public static Predicate filterByMTETier(int aMinTier, int aMaxTier) { - return is -> { - IMetaTileEntity tile = GT_Item_Machines.getMetaTileEntity(is); - return tile instanceof GT_MetaTileEntity_TieredMachineBlock - && ((GT_MetaTileEntity_TieredMachineBlock) tile).mTier <= aMaxTier - && ((GT_MetaTileEntity_TieredMachineBlock) tile).mTier >= aMinTier; - }; - } -} diff --git a/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java b/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java index a4c4630209..3efbebdcbf 100644 --- a/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java +++ b/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java @@ -1,6 +1,6 @@ package gregtech.api.util; -import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.GTMod.GT_FML_LOGGER; import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.*; import static gregtech.api.multitileentity.enums.GT_MultiTileUpgradeCasing.*; import static gregtech.loaders.preload.GT_Loader_MultiTileEntities.*; @@ -16,7 +16,7 @@ import net.minecraft.world.World; import com.gtnewhorizon.structurelib.StructureLibAPI; import com.gtnewhorizon.structurelib.structure.IStructureElement; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.OrePrefixes; import gregtech.api.enums.TextureSet; import gregtech.api.multitileentity.MultiTileEntityBlock; @@ -220,7 +220,7 @@ public class GT_StructureUtilityMuTE { public static class MuTEStructureCasing { private String registryName; - private int registryId = GT_Values.W; + private int registryId = GTValues.W; private final int defaultMeta; private final Integer[] validIds; @@ -253,7 +253,7 @@ public class GT_StructureUtilityMuTE { public int getRegistryId() { // TODO: MuTE registry seems to somehow shift, probably due to NBT shenanigans. Lazy init circumvents this // but it should be properly fixed in the future - if (registryId == GT_Values.W) { + if (registryId == GTValues.W) { MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryName); registryId = Block.getIdFromBlock(registry.getBlock()); } diff --git a/src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java b/src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java deleted file mode 100644 index 4263b77be6..0000000000 --- a/src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java +++ /dev/null @@ -1,71 +0,0 @@ -package gregtech.api.util; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; - -import ic2.core.block.BlockMultiID; -import ic2.core.block.BlockScaffold; -import ic2.core.block.machine.BlockMiningPipe; -import ic2.core.block.machine.BlockMiningTip; -import ic2.core.block.wiring.BlockCable; -import ic2.core.crop.BlockCrop; - -public class GT_ToolHarvestHelper { - - public static boolean isAppropriateTool(Block aBlock, byte aMetaData, String... tTools) { - - if (aBlock == null || tTools == null) { - return false; - } - String targetTool = aBlock.getHarvestTool(aMetaData); - return !isStringEmpty(targetTool) && isArrayContains(targetTool, tTools); - } - - public static boolean isAppropriateMaterial(Block aBlock, Material... tMats) { - if (aBlock == null || tMats == null) { - return false; - } - return isArrayContains(aBlock.getMaterial(), tMats); - } - - public static boolean isSpecialBlock(Block aBlock, Block... tBlocks) { - if (aBlock == null || tBlocks == null) { - return false; - } - return isArrayContains(aBlock, tBlocks); - } - - public static boolean isArrayContains(T obj, T[] list) { - - if (obj == null || list == null) { - return false; - } - - for (T iObj : list) { - if (obj == iObj || obj.equals(iObj)) { - return true; - } - } - return false; - } - - public static boolean isStringEmpty(String s) { - return s == null || s.isEmpty(); - } - - public static boolean isIC2Wrenchable(Block block) { - return (block instanceof BlockMultiID && !(block instanceof BlockCable) && !(block instanceof BlockCrop)) - || block instanceof BlockScaffold - || block instanceof BlockMiningPipe - || block instanceof BlockMiningTip; - } - - public static boolean hasNull(Object... obj) { - for (Object iObj : obj) { - if (iObj == null) { - return true; - } - } - return false; - } -} diff --git a/src/main/java/gregtech/api/util/GT_TooltipDataCache.java b/src/main/java/gregtech/api/util/GT_TooltipDataCache.java index 431ef34fa4..6b42a8e7fa 100644 --- a/src/main/java/gregtech/api/util/GT_TooltipDataCache.java +++ b/src/main/java/gregtech/api/util/GT_TooltipDataCache.java @@ -7,7 +7,7 @@ import java.util.Map; import net.minecraft.util.StatCollector; -import gregtech.GT_Mod; +import gregtech.GTMod; public class GT_TooltipDataCache { @@ -50,7 +50,7 @@ public class GT_TooltipDataCache { public TooltipData getUncachedTooltipData(String key, Object... args) { List lines = getAllLines(key, args); int normalLines = lines.size(); - if (Math.max(GT_Mod.gregtechproxy.mTooltipVerbosity, GT_Mod.gregtechproxy.mTooltipShiftVerbosity) >= 3) { + if (Math.max(GTMod.gregtechproxy.mTooltipVerbosity, GTMod.gregtechproxy.mTooltipShiftVerbosity) >= 3) { lines.addAll(getAllLines(key + ".extended", args)); // Are extended lines enabled? If so add them to the // lines } @@ -58,9 +58,8 @@ public class GT_TooltipDataCache { lines.add(key); // Fallback in case no lines could be found at all } return new TooltipData( - lines.subList(0, getVerbosityIndex(GT_Mod.gregtechproxy.mTooltipVerbosity, normalLines, lines.size())), - lines - .subList(0, getVerbosityIndex(GT_Mod.gregtechproxy.mTooltipShiftVerbosity, normalLines, lines.size()))); + lines.subList(0, getVerbosityIndex(GTMod.gregtechproxy.mTooltipVerbosity, normalLines, lines.size())), + lines.subList(0, getVerbosityIndex(GTMod.gregtechproxy.mTooltipShiftVerbosity, normalLines, lines.size()))); } /** diff --git a/src/main/java/gregtech/api/util/GT_Util.java b/src/main/java/gregtech/api/util/GT_Util.java deleted file mode 100644 index cdca6a1b9e..0000000000 --- a/src/main/java/gregtech/api/util/GT_Util.java +++ /dev/null @@ -1,347 +0,0 @@ -package gregtech.api.util; - -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.Tuple; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.common.util.Constants; - -import gregtech.api.enums.ItemList; -import gregtech.api.interfaces.IDataCopyable; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.multitileentity.interfaces.IMultiTileEntity; -import gregtech.common.items.behaviors.Behaviour_DataOrb; - -public class GT_Util { - - // Last broken tile entity - public static final ThreadLocal LAST_BROKEN_TILEENTITY = new ThreadLocal<>(); - - public static Tuple tuple(String key, Object value) { - return new Tuple(key, value); - } - - public static NBTTagCompound fuseNBT(NBTTagCompound nbt1, NBTTagCompound nbt2) { - if (nbt1 == null) return nbt2 == null ? new NBTTagCompound() : (NBTTagCompound) nbt2.copy(); - final NBTTagCompound rNBT = (NBTTagCompound) nbt1.copy(); - if (nbt2 == null) return rNBT; - for (Object tKey : nbt2.func_150296_c /* getKeySet */()) - if (!rNBT.hasKey(tKey.toString())) rNBT.setTag(tKey.toString(), nbt2.getTag(tKey.toString())); - return rNBT; - } - - /** - * Construct a NBTTagCompound from a series of key, value pairs. Inspired from GT6. - */ - public static NBTTagCompound makeNBT(Tuple... tags) { - final NBTTagCompound nbt = new NBTTagCompound(); - for (Tuple t : tags) { - if (t.getSecond() == null) continue; - - if (t.getSecond() instanceof Boolean) nbt.setBoolean( - t.getFirst() - .toString(), - (Boolean) t.getSecond()); - else if (t.getSecond() instanceof Byte) nbt.setByte( - t.getFirst() - .toString(), - (Byte) t.getSecond()); - else if (t.getSecond() instanceof Short) nbt.setShort( - t.getFirst() - .toString(), - (Short) t.getSecond()); - else if (t.getSecond() instanceof Integer) nbt.setInteger( - t.getFirst() - .toString(), - (Integer) t.getSecond()); - else if (t.getSecond() instanceof Long) nbt.setLong( - t.getFirst() - .toString(), - (Long) t.getSecond()); - else if (t.getSecond() instanceof Float) nbt.setFloat( - t.getFirst() - .toString(), - (Float) t.getSecond()); - else if (t.getSecond() instanceof Double) nbt.setDouble( - t.getFirst() - .toString(), - (Double) t.getSecond()); - else if (t.getSecond() instanceof String) nbt.setString( - t.getFirst() - .toString(), - (String) t.getSecond()); - else if (t.getSecond() instanceof NBTBase) nbt.setTag( - t.getFirst() - .toString(), - (NBTBase) t.getSecond()); - else nbt.setString( - t.getFirst() - .toString(), - t.getSecond() - .toString()); - } - - return nbt; - } - - /** - * Get a TileEntity - */ - public static TileEntity getTileEntity(World world, int x, int y, int z, boolean aLoadUnloadedChunks) { - if (aLoadUnloadedChunks || world.blockExists(x, y, z)) { - TileEntity tileEntity = world.getTileEntity(x, y, z); - if (tileEntity instanceof IMultiTileEntity && ((IMultiTileEntity) tileEntity).isDead()) return null; - if (tileEntity != null) return tileEntity; - tileEntity = LAST_BROKEN_TILEENTITY.get(); - if (tileEntity != null && tileEntity.xCoord == x && tileEntity.yCoord == y && tileEntity.zCoord == z) - return tileEntity; - } - return null; - } - - /** - * Sets the TileEntity at the passed position, with the option of turning adjacent TileEntity updates off. - */ - public static TileEntity setTileEntity(World world, int x, int y, int z, TileEntity aTileEntity, - boolean aCauseTileEntityUpdates) { - if (aCauseTileEntityUpdates) world.setTileEntity(x, y, z, aTileEntity); - else { - final Chunk tChunk = world.getChunkFromChunkCoords(x >> 4, z >> 4); - if (tChunk != null) { - world.addTileEntity(aTileEntity); - tChunk.func_150812_a /* setBlockTileEntityInChunk */(x & 15, y, z & 15, aTileEntity); - tChunk.setChunkModified(); - } - } - return aTileEntity; - } - - public static boolean setBlock(World world, int x, int y, int z, Block block, short aMeta, long aFlags, - boolean aRemoveGrassBelow) { - if (aRemoveGrassBelow) { - final Block blockBelow = world.getBlock(x, y - 1, z); - if (blockBelow == Blocks.grass || blockBelow == Blocks.mycelium) - world.setBlock(x, y - 1, z, Blocks.dirt, 0, (byte) aFlags); - } - return world.setBlock(x, y, z, block, aMeta, (byte) aFlags); - } - - public static TileEntity getTileEntity(World world, ChunkCoordinates coords, boolean loadUnloadedChunks) { - return getTileEntity(world, coords.posX, coords.posY, coords.posZ, loadUnloadedChunks); - } - - /** - * Marks a Chunk dirty so it is saved - */ - public static boolean markChunkDirty(World world, int x, int z) { - if (world == null || world.isRemote) return false; - Chunk aChunk = world.getChunkFromBlockCoords(x, z); - if (aChunk == null) { - world.getBlockMetadata(x, 0, z); - aChunk = world.getChunkFromBlockCoords(x, z); - if (aChunk == null) { - GT_Log.err.println( - "Some important Chunk does not exist for some reason at Coordinates X: " + x + " and Z: " + z); - return false; - } - } - aChunk.setChunkModified(); - return true; - } - - /** - * Marks a Chunk dirty so it is saved - */ - public static boolean markChunkDirty(Object maybeTile) { - return maybeTile instanceof TileEntity tileEntity - && markChunkDirty(tileEntity.getWorldObj(), tileEntity.xCoord, tileEntity.zCoord); - } - - public static int mixRGBInt(int aRGB1, int aRGB2) { - return getRGBInt( - new short[] { (short) ((getR(aRGB1) + getR(aRGB2)) >> 1), (short) ((getG(aRGB1) + getG(aRGB2)) >> 1), - (short) ((getB(aRGB1) + getB(aRGB2)) >> 1) }); - } - - public static int getRGBInt(short[] aColors) { - return aColors == null ? 16777215 : (aColors[0] << 16) | (aColors[1] << 8) | aColors[2]; - } - - public static int getRGBaInt(short[] aColors) { - return aColors == null ? 16777215 : (aColors[0]) << 16 | (aColors[1] << 8) | aColors[2] | (aColors[3] << 24); - } - - public static String toHexString(short[] aColors) { - return aColors == null ? "FFFFFF" : Integer.toHexString((aColors[0] << 16) | (aColors[1] << 8) | aColors[2]); - } - - public static int getRGBInt(short aR, short aG, short aB) { - return (aR << 16) | (aG << 8) | aB; - } - - public static int getRGBaInt(short aR, short aG, short aB, short aA) { - return (aR << 16) | (aG << 8) | aB | (aA << 24); - } - - public static short[] getRGBaArray(int aColors) { - return new short[] { (short) ((aColors >>> 16) & 255), (short) ((aColors >>> 8) & 255), (short) (aColors & 255), - (short) ((aColors >>> 24) & 255) }; - } - - public static short getR(int aColors) { - return (short) ((aColors >>> 16) & 255); - } - - public static short getG(int aColors) { - return (short) ((aColors >>> 8) & 255); - } - - public static short getB(int aColors) { - return (short) (aColors & 255); - } - - public static short getA(int aColors) { - return (short) ((aColors >>> 24) & 255); - } - - public static boolean saveMultiblockInputConfiguration(GT_MetaTileEntity_MultiBlockBase controller, - EntityPlayer player) { - NBTTagCompound newTag = new NBTTagCompound(); - ItemStack dataOrb = player.getHeldItem(); - if (GT_Utility.isStackInvalid(dataOrb) || !ItemList.Tool_DataOrb.isStackEqual(dataOrb, false, true)) { - return false; - } - if (!controller.saveOtherHatchConfiguration(player)) { - return false; - } - newTag.setString("type", "MultiblockConfiguration"); - int count = 0; - NBTTagList list = saveConfigurationToDataStick(player, controller.mInputBusses); - if (list == null) return false; - newTag.setTag("mInputBusses", list); - count += list.tagCount(); - list = saveConfigurationToDataStick(player, controller.mInputHatches); - if (list == null) return false; - newTag.setTag("mInputHatches", list); - count += list.tagCount(); - list = saveConfigurationToDataStick(player, controller.mOutputBusses); - if (list == null) return false; - newTag.setTag("mOutputBusses", list); - count += list.tagCount(); - // Output hatch config currently cannot be copied, so we omit this part for now - // TODO this doesn't work for now - // newTag.setTag("mDualInputHatches", saveToDataStick(player, controller.mDualInputHatches)); - dataOrb.setTagCompound(newTag); - Behaviour_DataOrb.setDataTitle(dataOrb, "Multiblock Hatch Configuration"); - Behaviour_DataOrb.setDataName(dataOrb, String.format("%s configuration saved", count)); - return true; - } - - public static boolean hasMultiblockInputConfiguration(ItemStack dataOrb) { - return !GT_Utility.isStackInvalid(dataOrb) && ItemList.Tool_DataOrb.isStackEqual(dataOrb, false, true) - && dataOrb.getTagCompound() != null - && "MultiblockConfiguration".equals( - dataOrb.getTagCompound() - .getString("type")); - } - - public static boolean loadMultiblockInputConfiguration(GT_MetaTileEntity_MultiBlockBase controller, - EntityPlayer player) { - ItemStack dataOrb = player.getHeldItem(); - if (!hasMultiblockInputConfiguration(dataOrb)) { - return false; - } - if (!controller.loadOtherHatchConfiguration(player)) { - return false; - } - NBTTagCompound tag = dataOrb.getTagCompound(); - if (!checkCanLoadConfigurationFromDataStick( - tag.getTagList("mInputBusses", Constants.NBT.TAG_COMPOUND), - player, - controller.mInputBusses) - || !checkCanLoadConfigurationFromDataStick( - tag.getTagList("mInputHatches", Constants.NBT.TAG_COMPOUND), - player, - controller.mInputHatches) - || !checkCanLoadConfigurationFromDataStick( - tag.getTagList("mOutputBusses", Constants.NBT.TAG_COMPOUND), - player, - controller.mOutputBusses)) - return false; - - if (!loadConfigurationFromDataStick( - tag.getTagList("mInputBusses", Constants.NBT.TAG_COMPOUND), - player, - controller.mInputBusses)) return false; - if (!loadConfigurationFromDataStick( - tag.getTagList("mInputHatches", Constants.NBT.TAG_COMPOUND), - player, - controller.mInputHatches)) return false; - if (!loadConfigurationFromDataStick( - tag.getTagList("mOutputBusses", Constants.NBT.TAG_COMPOUND), - player, - controller.mOutputBusses)) return false; - return true; - } - - private static NBTTagList saveConfigurationToDataStick(EntityPlayer player, - List hatches) { - NBTTagList list = new NBTTagList(); - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) { - if (!(tHatch instanceof IDataCopyable copyable)) { - list.appendTag(new NBTTagCompound()); - continue; - } - NBTTagCompound tag = copyable.getCopiedData(player); - if (tag == null) return null; - list.appendTag(tag); - } - return list; - } - - private static boolean loadConfigurationFromDataStick(NBTTagList list, EntityPlayer player, - List hatches) { - if (list == null || list.tagList.isEmpty()) return false; - List validMTEs = filterValidMTEs(hatches); - int end = Math.min(validMTEs.size(), list.tagCount()); - for (int i = 0; i < end; i++) { - GT_MetaTileEntity_Hatch tHatch = validMTEs.get(i); - NBTTagCompound tag = list.getCompoundTagAt(i); - if (!(tHatch instanceof IDataCopyable copyable)) { - if (tag.hasNoTags()) continue; - return false; - } - if (tag.hasNoTags()) return false; - if (!copyable.pasteCopiedData(player, tag)) return false; - } - return true; - } - - private static boolean checkCanLoadConfigurationFromDataStick(NBTTagList list, EntityPlayer player, - List hatches) { - if (list == null || list.tagList.isEmpty()) return false; - List validMTEs = filterValidMTEs(hatches); - int end = Math.min(validMTEs.size(), list.tagCount()); - for (int i = 0; i < end; i++) { - GT_MetaTileEntity_Hatch tHatch = validMTEs.get(i); - NBTTagCompound tag = list.getCompoundTagAt(i); - if (tag.hasNoTags()) continue; - if (!(tHatch instanceof IDataCopyable copyable) || !copyable.getCopiedDataIdentifier(player) - .equals(tag.getString("type"))) return false; - } - return true; - } -} diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java deleted file mode 100644 index 84e67ab728..0000000000 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ /dev/null @@ -1,4859 +0,0 @@ -package gregtech.api.util; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_Values.COMPASS_DIRECTIONS; -import static gregtech.api.enums.GT_Values.D1; -import static gregtech.api.enums.GT_Values.E; -import static gregtech.api.enums.GT_Values.GT; -import static gregtech.api.enums.GT_Values.L; -import static gregtech.api.enums.GT_Values.M; -import static gregtech.api.enums.GT_Values.NW; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.GT_Values.W; -import static gregtech.api.enums.Materials.FLUID_MAP; -import static gregtech.api.enums.Mods.Translocator; -import static gregtech.common.GT_UndergroundOil.undergroundOilReadInformation; -import static net.minecraftforge.common.util.ForgeDirection.DOWN; -import static net.minecraftforge.common.util.ForgeDirection.EAST; -import static net.minecraftforge.common.util.ForgeDirection.NORTH; -import static net.minecraftforge.common.util.ForgeDirection.SOUTH; -import static net.minecraftforge.common.util.ForgeDirection.UNKNOWN; -import static net.minecraftforge.common.util.ForgeDirection.UP; -import static net.minecraftforge.common.util.ForgeDirection.WEST; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.math.BigInteger; -import java.math.RoundingMode; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.util.AbstractCollection; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; -import java.util.function.IntFunction; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTBase.NBTPrimitive; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.nbt.NBTTagString; -import net.minecraft.network.play.server.S07PacketRespawn; -import net.minecraft.network.play.server.S1DPacketEntityEffect; -import net.minecraft.network.play.server.S1FPacketSetExperience; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidContainerItem; -import net.minecraftforge.fluids.IFluidHandler; -import net.minecraftforge.oredict.OreDictionary; - -import com.google.auto.value.AutoValue; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.common.collect.SetMultimap; -import com.gtnewhorizon.structurelib.alignment.IAlignment; -import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; -import com.mojang.authlib.GameProfile; - -import buildcraft.api.transport.IPipeTile; -import cofh.api.energy.IEnergyReceiver; -import cofh.api.transport.IItemDuct; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.api.GregTech_API; -import gregtech.api.damagesources.GT_DamageSources; -import gregtech.api.damagesources.GT_DamageSources.DamageSourceHotItem; -import gregtech.api.enchants.Enchantment_Hazmat; -import gregtech.api.enchants.Enchantment_Radioactivity; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.Mods; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.Textures; -import gregtech.api.enums.ToolDictNames; -import gregtech.api.events.BlockScanningEvent; -import gregtech.api.interfaces.IBlockContainer; -import gregtech.api.interfaces.IDebugableBlock; -import gregtech.api.interfaces.IHasIndexedTexture; -import gregtech.api.interfaces.IProjectileItem; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IBasicEnergyContainer; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.interfaces.tileentity.IUpgradableMachine; -import gregtech.api.items.GT_EnergyArmor_Item; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.net.GT_Packet_Sound; -import gregtech.api.objects.CollectorUtils; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.GT_ItemStack2; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.threads.GT_Runnable_Sound; -import gregtech.api.util.extensions.ArrayExt; -import gregtech.common.GT_Pollution; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import ic2.api.recipe.IRecipeInput; -import ic2.api.recipe.RecipeInputItemStack; -import ic2.api.recipe.RecipeInputOreDict; -import ic2.api.recipe.RecipeOutput; -import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; -import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap; - -/** - * NEVER INCLUDE THIS FILE IN YOUR MOD!!! - *

- * Just a few Utility Functions I use. - */ -public class GT_Utility { - - /** - * Formats a number with group separator and at most 2 fraction digits. - */ - private static final Map decimalFormatters = new HashMap<>(); - - /** - * Forge screwed the Fluid Registry up again, so I make my own, which is also much more efficient than the stupid - * Stuff over there. - */ - private static final List sFluidContainerList = new ArrayList<>(); - - private static final Map sFilledContainerToData = new /* Concurrent */ HashMap<>(); - private static final Map> sEmptyContainerToFluidToData = new HashMap<>(); - private static final Map> sFluidToContainers = new HashMap<>(); - /** - * Must use {@code Supplier} here because the ore prefixes have not yet been registered at class load time. - */ - private static final Map> sOreToCobble = new HashMap<>(); - - private static final Map sOreTable = new HashMap<>(); - public static boolean TE_CHECK = false, BC_CHECK = false, CHECK_ALL = true, RF_CHECK = false; - public static Map sPlayedSoundMap = new /* Concurrent */ HashMap<>(); - private static int sBookCount = 0; - public static UUID defaultUuid = null; // maybe default non-null? - // UUID.fromString("00000000-0000-0000-0000-000000000000"); - - static { - GregTech_API.sItemStackMappings.add(sFilledContainerToData); - GregTech_API.sItemStackMappings.add(sEmptyContainerToFluidToData); - - // 1 is the magic index to get the cobblestone block. - // See: GT_Block_Stones.java, GT_Block_Granites.java - Function> materialToCobble = m -> Suppliers.memoize( - () -> GT_OreDictUnificator.getOres(OrePrefixes.stone, m) - .get(1))::get; - sOreToCobble.put(OrePrefixes.oreBlackgranite, materialToCobble.apply(Materials.GraniteBlack)); - sOreToCobble.put(OrePrefixes.oreRedgranite, materialToCobble.apply(Materials.GraniteRed)); - sOreToCobble.put(OrePrefixes.oreMarble, materialToCobble.apply(Materials.Marble)); - sOreToCobble.put(OrePrefixes.oreBasalt, materialToCobble.apply(Materials.Basalt)); - sOreToCobble.put(OrePrefixes.oreNetherrack, () -> new ItemStack(Blocks.netherrack)); - sOreToCobble.put(OrePrefixes.oreEndstone, () -> new ItemStack(Blocks.end_stone)); - } - - public static int safeInt(long number, int margin) { - return number > Integer.MAX_VALUE - margin ? Integer.MAX_VALUE - margin : (int) number; - } - - public static int safeInt(long number) { - return number > V[V.length - 1] ? safeInt(V[V.length - 1], 1) - : number < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) number; - } - - public static Field getPublicField(Object aObject, String aField) { - Field rField = null; - try { - rField = aObject.getClass() - .getDeclaredField(aField); - } catch (Throwable e) { - /* Do nothing */ - } - return rField; - } - - public static Field getField(Object aObject, String aField) { - Field rField = null; - try { - rField = aObject.getClass() - .getDeclaredField(aField); - rField.setAccessible(true); - } catch (Throwable e) { - /* Do nothing */ - } - return rField; - } - - public static Field getField(Class aObject, String aField) { - Field rField = null; - try { - rField = aObject.getDeclaredField(aField); - rField.setAccessible(true); - } catch (Throwable e) { - /* Do nothing */ - } - return rField; - } - - public static Method getMethod(Class aObject, String aMethod, Class... aParameterTypes) { - Method rMethod = null; - try { - rMethod = aObject.getMethod(aMethod, aParameterTypes); - rMethod.setAccessible(true); - } catch (Throwable e) { - /* Do nothing */ - } - return rMethod; - } - - public static Method getMethod(Object aObject, String aMethod, Class... aParameterTypes) { - Method rMethod = null; - try { - rMethod = aObject.getClass() - .getMethod(aMethod, aParameterTypes); - rMethod.setAccessible(true); - } catch (Throwable e) { - /* Do nothing */ - } - return rMethod; - } - - public static Field getField(Object aObject, String aField, boolean aPrivate, boolean aLogErrors) { - try { - Field tField = (aObject instanceof Class) ? ((Class) aObject).getDeclaredField(aField) - : (aObject instanceof String) ? Class.forName((String) aObject) - .getDeclaredField(aField) - : aObject.getClass() - .getDeclaredField(aField); - if (aPrivate) tField.setAccessible(true); - return tField; - } catch (Throwable e) { - if (aLogErrors) e.printStackTrace(GT_Log.err); - } - return null; - } - - public static Object getFieldContent(Object aObject, String aField, boolean aPrivate, boolean aLogErrors) { - try { - Field tField = (aObject instanceof Class) ? ((Class) aObject).getDeclaredField(aField) - : (aObject instanceof String) ? Class.forName((String) aObject) - .getDeclaredField(aField) - : aObject.getClass() - .getDeclaredField(aField); - if (aPrivate) tField.setAccessible(true); - return tField.get(aObject instanceof Class || aObject instanceof String ? null : aObject); - } catch (Throwable e) { - if (aLogErrors) e.printStackTrace(GT_Log.err); - } - return null; - } - - public static Object callPublicMethod(Object aObject, String aMethod, Object... aParameters) { - return callMethod(aObject, aMethod, false, false, true, aParameters); - } - - public static Object callPrivateMethod(Object aObject, String aMethod, Object... aParameters) { - return callMethod(aObject, aMethod, true, false, true, aParameters); - } - - public static Object callMethod(Object aObject, String aMethod, boolean aPrivate, boolean aUseUpperCasedDataTypes, - boolean aLogErrors, Object... aParameters) { - try { - Class[] tParameterTypes = new Class[aParameters.length]; - for (byte i = 0; i < aParameters.length; i++) { - if (aParameters[i] instanceof Class) { - tParameterTypes[i] = (Class) aParameters[i]; - aParameters[i] = null; - } else { - tParameterTypes[i] = aParameters[i].getClass(); - } - if (!aUseUpperCasedDataTypes) { - if (tParameterTypes[i] == Boolean.class) tParameterTypes[i] = boolean.class; - else if (tParameterTypes[i] == Byte.class) tParameterTypes[i] = byte.class; - else if (tParameterTypes[i] == Short.class) tParameterTypes[i] = short.class; - else if (tParameterTypes[i] == Integer.class) tParameterTypes[i] = int.class; - else if (tParameterTypes[i] == Long.class) tParameterTypes[i] = long.class; - else if (tParameterTypes[i] == Float.class) tParameterTypes[i] = float.class; - else if (tParameterTypes[i] == Double.class) tParameterTypes[i] = double.class; - } - } - - Method tMethod = (aObject instanceof Class) ? ((Class) aObject).getMethod(aMethod, tParameterTypes) - : aObject.getClass() - .getMethod(aMethod, tParameterTypes); - if (aPrivate) tMethod.setAccessible(true); - return tMethod.invoke(aObject, aParameters); - } catch (Throwable e) { - if (aLogErrors) e.printStackTrace(GT_Log.err); - } - return null; - } - - public static Object callConstructor(String aClass, int aConstructorIndex, Object aReplacementObject, - boolean aLogErrors, Object... aParameters) { - try { - return callConstructor( - Class.forName(aClass), - aConstructorIndex, - aReplacementObject, - aLogErrors, - aParameters); - } catch (Throwable e) { - if (aLogErrors) e.printStackTrace(GT_Log.err); - } - return aReplacementObject; - } - - public static Object callConstructor(Class aClass, int aConstructorIndex, Object aReplacementObject, - boolean aLogErrors, Object... aParameters) { - if (aConstructorIndex < 0) { - try { - for (Constructor tConstructor : aClass.getConstructors()) { - try { - return tConstructor.newInstance(aParameters); - } catch (Throwable ignored) {} - } - } catch (Throwable e) { - if (aLogErrors) e.printStackTrace(GT_Log.err); - } - } else { - try { - return aClass.getConstructors()[aConstructorIndex].newInstance(aParameters); - } catch (Throwable e) { - if (aLogErrors) e.printStackTrace(GT_Log.err); - } - } - return aReplacementObject; - } - - public static String capitalizeString(String aString) { - if (aString != null && aString.length() > 0) return aString.substring(0, 1) - .toUpperCase() + aString.substring(1); - return E; - } - - public static boolean getPotion(EntityLivingBase aPlayer, int aPotionIndex) { - try { - Field tPotionHashmap = null; - - Field[] fields = EntityLiving.class.getDeclaredFields(); - - for (Field field : fields) { - if (field.getType() == HashMap.class) { - tPotionHashmap = field; - tPotionHashmap.setAccessible(true); - break; - } - } - - if (tPotionHashmap != null) return ((HashMap) tPotionHashmap.get(aPlayer)).get(aPotionIndex) != null; - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - return false; - } - - public static String getClassName(Object aObject) { - if (aObject == null) return "null"; - return aObject.getClass() - .getName() - .substring( - aObject.getClass() - .getName() - .lastIndexOf(".") + 1); - } - - public static void removePotion(EntityLivingBase aPlayer, int aPotionIndex) { - try { - Field tPotionHashmap = null; - - Field[] fields = EntityLiving.class.getDeclaredFields(); - - for (Field field : fields) { - if (field.getType() == HashMap.class) { - tPotionHashmap = field; - tPotionHashmap.setAccessible(true); - break; - } - } - - if (tPotionHashmap != null) ((HashMap) tPotionHashmap.get(aPlayer)).remove(aPotionIndex); - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - } - - public static boolean getFullInvisibility(EntityPlayer aPlayer) { - try { - if (aPlayer.isInvisible()) { - for (int i = 0; i < 4; i++) { - if (aPlayer.inventory.armorInventory[i] != null) { - if (aPlayer.inventory.armorInventory[i].getItem() instanceof GT_EnergyArmor_Item) { - if ((((GT_EnergyArmor_Item) aPlayer.inventory.armorInventory[i].getItem()).mSpecials & 512) - != 0) { - if (GT_ModHandler.canUseElectricItem(aPlayer.inventory.armorInventory[i], 10000)) { - return true; - } - } - } - } - } - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - return false; - } - - public static ItemStack suckOneItemStackAt(World aWorld, double aX, double aY, double aZ, double aL, double aH, - double aW) { - for (EntityItem tItem : aWorld.getEntitiesWithinAABB( - EntityItem.class, - AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + aL, aY + aH, aZ + aW))) { - if (!tItem.isDead) { - aWorld.removeEntity(tItem); - tItem.setDead(); - return tItem.getEntityItem(); - } - } - return null; - } - - public static byte getOppositeSide(ForgeDirection side) { - return (byte) side.getOpposite() - .ordinal(); - } - - public static byte getTier(long l) { - byte i = -1; - while (++i < V.length) if (l <= V[i]) return i; - return (byte) (V.length - 1); - } - - public static long getAmperageForTier(long voltage, byte tier) { - return ceilDiv(voltage, GT_Values.V[tier]); - } - - /** - * Rounds up partial voltage that exceeds tiered voltage, e.g. 4,096 -> 8,192(IV) - */ - public static long roundUpVoltage(long voltage) { - if (voltage > V[V.length - 1]) { - return voltage; - } - return V[GT_Utility.getTier(voltage)]; - } - - public static String getColoredTierNameFromVoltage(long voltage) { - return getColoredTierNameFromTier(getTier(voltage)); - } - - public static String getColoredTierNameFromTier(byte tier) { - return GT_Values.TIER_COLORS[tier] + GT_Values.VN[tier] + EnumChatFormatting.RESET; - } - - /** - * @return e.g. {@code " (LV)"} - */ - @Nonnull - public static String getTierNameWithParentheses(long voltage) { - byte tier = getTier(voltage); - if (tier < 0) { - return ""; - } else if (tier == 0) { - return " (" + GT_Values.VN[1] + ")"; - } else if (tier >= GT_Values.VN.length - 1) { - return " (MAX+)"; - } - return " (" + GT_Values.VN[tier] + ")"; - } - - public static void sendChatToPlayer(EntityPlayer aPlayer, String aChatMessage) { - if (aPlayer instanceof EntityPlayerMP && aChatMessage != null) { - aPlayer.addChatComponentMessage(new ChatComponentText(aChatMessage)); - } - } - - public static void checkAvailabilities() { - if (CHECK_ALL) { - try { - Class tClass = IItemDuct.class; - tClass.getCanonicalName(); - TE_CHECK = true; - } catch (Throwable e) { - /**/ - } - try { - Class tClass = buildcraft.api.transport.IPipeTile.class; - tClass.getCanonicalName(); - BC_CHECK = true; - } catch (Throwable e) { - /**/ - } - try { - Class tClass = cofh.api.energy.IEnergyReceiver.class; - tClass.getCanonicalName(); - RF_CHECK = true; - } catch (Throwable e) { - /**/ - } - CHECK_ALL = false; - } - } - - public static boolean isConnectableNonInventoryPipe(TileEntity tileEntity, ForgeDirection side) { - if (tileEntity == null) return false; - checkAvailabilities(); - if (TE_CHECK && tileEntity instanceof IItemDuct) return true; - if (BC_CHECK && tileEntity instanceof buildcraft.api.transport.IPipeTile pipeTile) - return pipeTile.isPipeConnected(side); - return Translocator.isModLoaded() && tileEntity instanceof codechicken.translocator.TileItemTranslocator; - } - - /** - * Moves Stack from Inv-Slot to Inv-Slot, without checking if its even allowed. - * - * @return the Amount of moved Items - */ - public static byte moveStackIntoPipe(IInventory aTileEntity1, Object aTileEntity2, int[] aGrabSlots, - ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, - byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { - return moveStackIntoPipe( - aTileEntity1, - aTileEntity2, - aGrabSlots, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - true); - } - - /** - * Moves Stack from Inv-Slot to Inv-Slot, without checking if it is even allowed. - * - * @return the Amount of moved Items - */ - public static byte moveStackIntoPipe(IInventory fromInventory, Object toObject, int[] fromSlots, - ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, - byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, - boolean dropItem) { - if (fromInventory == null || aMaxTargetStackSize <= 0 - || aMinTargetStackSize <= 0 - || aMinTargetStackSize > aMaxTargetStackSize - || aMaxMoveAtOnce <= 0 - || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; - if (toObject != null) { - checkAvailabilities(); - if (TE_CHECK && toObject instanceof IItemDuct itemDuct) { - for (final int aGrabSlot : fromSlots) { - if (listContainsItem(aFilter, fromInventory.getStackInSlot(aGrabSlot), true, aInvertFilter)) { - if (isAllowedToTakeFromSlot( - fromInventory, - aGrabSlot, - fromSide, - fromInventory.getStackInSlot(aGrabSlot))) { - if (Math.max(aMinMoveAtOnce, aMinTargetStackSize) - <= fromInventory.getStackInSlot(aGrabSlot).stackSize) { - ItemStack tStack = copyAmount( - Math.min( - fromInventory.getStackInSlot(aGrabSlot).stackSize, - Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)), - fromInventory.getStackInSlot(aGrabSlot)); - ItemStack rStack = itemDuct.insertItem(putSide, copyOrNull(tStack)); - byte tMovedItemCount = (byte) (tStack.stackSize - - (rStack == null ? 0 : rStack.stackSize)); - if (tMovedItemCount >= 1 /* Math.max(aMinMoveAtOnce, aMinTargetStackSize) */) { - fromInventory.decrStackSize(aGrabSlot, tMovedItemCount); - fromInventory.markDirty(); - return tMovedItemCount; - } - } - } - } - } - return 0; - } - if (BC_CHECK && toObject instanceof buildcraft.api.transport.IPipeTile bcPipe) { - for (int fromSlot : fromSlots) { - if (listContainsItem(aFilter, fromInventory.getStackInSlot(fromSlot), true, aInvertFilter)) { - if (isAllowedToTakeFromSlot( - fromInventory, - fromSlot, - fromSide, - fromInventory.getStackInSlot(fromSlot))) { - if (Math.max(aMinMoveAtOnce, aMinTargetStackSize) - <= fromInventory.getStackInSlot(fromSlot).stackSize) { - ItemStack tStack = copyAmount( - Math.min( - fromInventory.getStackInSlot(fromSlot).stackSize, - Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)), - fromInventory.getStackInSlot(fromSlot)); - byte tMovedItemCount = (byte) bcPipe.injectItem(copyOrNull(tStack), false, putSide); - if (tMovedItemCount >= Math.max(aMinMoveAtOnce, aMinTargetStackSize)) { - tMovedItemCount = (byte) (bcPipe - .injectItem(copyAmount(tMovedItemCount, tStack), true, putSide)); - fromInventory.decrStackSize(fromSlot, tMovedItemCount); - fromInventory.markDirty(); - return tMovedItemCount; - } - } - } - } - } - return 0; - } - } - - if (fromInventory instanceof TileEntity fromTileEntity && fromSide != ForgeDirection.UNKNOWN - && fromSide.getOpposite() == ForgeDirection.getOrientation(putSide.ordinal())) { - int tX = fromTileEntity.xCoord + fromSide.offsetX, tY = fromTileEntity.yCoord + fromSide.offsetY, - tZ = fromTileEntity.zCoord + fromSide.offsetZ; - if (!hasBlockHitBox(((TileEntity) fromInventory).getWorldObj(), tX, tY, tZ) && dropItem) { - for (final int fromSlot : fromSlots) { - if (listContainsItem(aFilter, fromInventory.getStackInSlot(fromSlot), true, aInvertFilter)) { - if (isAllowedToTakeFromSlot( - fromInventory, - fromSlot, - fromSide, - fromInventory.getStackInSlot(fromSlot))) { - if (Math.max(aMinMoveAtOnce, aMinTargetStackSize) - <= fromInventory.getStackInSlot(fromSlot).stackSize) { - final ItemStack tStack = copyAmount( - Math.min( - fromInventory.getStackInSlot(fromSlot).stackSize, - Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)), - fromInventory.getStackInSlot(fromSlot)); - final EntityItem tEntity = new EntityItem( - ((TileEntity) fromInventory).getWorldObj(), - tX + 0.5, - tY + 0.5, - tZ + 0.5, - tStack); - tEntity.motionX = tEntity.motionY = tEntity.motionZ = 0; - ((TileEntity) fromInventory).getWorldObj() - .spawnEntityInWorld(tEntity); - assert tStack != null; - fromInventory.decrStackSize(fromSlot, tStack.stackSize); - fromInventory.markDirty(); - return (byte) tStack.stackSize; - } - } - } - } - } - } - return 0; - } - - /** - * Moves Stack from Inv-Slot to Inv-Slot, without checking if its even allowed. (useful for internal Inventory - * Operations) - * - * @return the Amount of moved Items - */ - public static byte moveStackFromSlotAToSlotB(IInventory aTileEntity1, IInventory aTileEntity2, int aGrabFrom, - int aPutTo, byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { - if (aTileEntity1 == null || aTileEntity2 == null - || aMinTargetStackSize <= 0 - || aMinTargetStackSize > aMaxTargetStackSize - || aMaxMoveAtOnce <= 0 - || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; - - ItemStack tStack1 = aTileEntity1.getStackInSlot(aGrabFrom), tStack2 = aTileEntity2.getStackInSlot(aPutTo), - tStack3; - if (tStack1 != null) { - if (tStack2 != null && !areStacksEqual(tStack1, tStack2)) return 0; - tStack3 = copyOrNull(tStack1); - aMaxTargetStackSize = (byte) Math.min( - aMaxTargetStackSize, - Math.min( - tStack3.getMaxStackSize(), - Math.min( - tStack2 == null ? Integer.MAX_VALUE : tStack2.getMaxStackSize(), - aTileEntity2.getInventoryStackLimit()))); - tStack3.stackSize = Math - .min(tStack3.stackSize, aMaxTargetStackSize - (tStack2 == null ? 0 : tStack2.stackSize)); - if (tStack3.stackSize > aMaxMoveAtOnce) tStack3.stackSize = aMaxMoveAtOnce; - if (tStack3.stackSize + (tStack2 == null ? 0 : tStack2.stackSize) - >= Math.min(tStack3.getMaxStackSize(), aMinTargetStackSize) && tStack3.stackSize >= aMinMoveAtOnce) { - tStack3 = aTileEntity1.decrStackSize(aGrabFrom, tStack3.stackSize); - aTileEntity1.markDirty(); - if (tStack3 != null) { - if (tStack2 == null) { - aTileEntity2.setInventorySlotContents(aPutTo, copyOrNull(tStack3)); - } else { - tStack2.stackSize += tStack3.stackSize; - } - aTileEntity2.markDirty(); - return (byte) tStack3.stackSize; - } - } - } - return 0; - } - - public static boolean isAllowedToTakeFromSlot(IInventory aTileEntity, int aSlot, ForgeDirection side, - ItemStack aStack) { - if (side == ForgeDirection.UNKNOWN) { - return Arrays.stream(ForgeDirection.VALID_DIRECTIONS) - .anyMatch(d -> isAllowedToTakeFromSlot(aTileEntity, aSlot, d, aStack)); - } - if (aTileEntity instanceof ISidedInventory sided) return sided.canExtractItem(aSlot, aStack, side.ordinal()); - return true; - } - - public static boolean isAllowedToPutIntoSlot(IInventory aTileEntity, int aSlot, ForgeDirection side, - ItemStack aStack, byte aMaxStackSize) { - ItemStack tStack = aTileEntity.getStackInSlot(aSlot); - if (tStack != null && (!areStacksEqual(tStack, aStack) || tStack.stackSize >= tStack.getMaxStackSize())) - return false; - if (side == ForgeDirection.UNKNOWN) { - return Arrays.stream(ForgeDirection.VALID_DIRECTIONS) - .anyMatch(d -> isAllowedToPutIntoSlot(aTileEntity, aSlot, d, aStack, aMaxStackSize)); - } - if (aTileEntity instanceof ISidedInventory - && !((ISidedInventory) aTileEntity).canInsertItem(aSlot, aStack, side.ordinal())) return false; - return aSlot < aTileEntity.getSizeInventory() && aTileEntity.isItemValidForSlot(aSlot, aStack); - } - - /** - * moves multiple stacks from Inv-Side to Inv-Side - * - * @return the Amount of moved Items - */ - public static int moveMultipleItemStacks(Object aTileEntity1, Object aTileEntity2, ForgeDirection fromSide, - ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, - byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, int aStackAmount) { - if (aTileEntity1 instanceof IInventory) return moveMultipleItemStacks( - (IInventory) aTileEntity1, - aTileEntity2, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aStackAmount, - true); - return 0; - } - - public static int moveMultipleItemStacks(IInventory fromInventory, Object toObject, ForgeDirection fromSide, - ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, - byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, int aMaxStackTransfer, - boolean aDoCheckChests) { - if (fromInventory == null || aMaxTargetStackSize <= 0 - || aMinTargetStackSize <= 0 - || aMaxMoveAtOnce <= 0 - || aMinTargetStackSize > aMaxTargetStackSize - || aMinMoveAtOnce > aMaxMoveAtOnce - || aMaxStackTransfer == 0) return 0; - - // find where to take from - final int[] tGrabSlots = new int[fromInventory.getSizeInventory()]; - int tGrabSlotsSize = 0; - if (fromInventory instanceof ISidedInventory) { - for (int i : ((ISidedInventory) fromInventory).getAccessibleSlotsFromSide(fromSide.ordinal())) { - final ItemStack s = fromInventory.getStackInSlot(i); - if (s == null || !isAllowedToTakeFromSlot(fromInventory, i, fromSide, s) - || s.stackSize < aMinMoveAtOnce - || !listContainsItem(aFilter, s, true, aInvertFilter)) continue; - tGrabSlots[tGrabSlotsSize++] = i; - } - } else { - for (int i = 0; i < tGrabSlots.length; i++) { - ItemStack s = fromInventory.getStackInSlot(i); - if (s == null || s.stackSize < aMinMoveAtOnce || !listContainsItem(aFilter, s, true, aInvertFilter)) - continue; - tGrabSlots[tGrabSlotsSize++] = i; - } - } - - // no source, bail out - if (tGrabSlotsSize == 0) { - // maybe source is a double chest. check it - if (aDoCheckChests && fromInventory instanceof TileEntityChest chest) return moveFromAdjacentChests( - chest, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer); - return 0; - } - - // if target is an inventory, e.g. chest, machine, drawers... - if (toObject instanceof IInventory toInventory) { - - // partially filled slot spare space mapping. - // value is the sum of all spare space left not counting completely empty slot - final HashMap tPutItems = new HashMap<>(toInventory.getSizeInventory()); - // partially filled slot contents - final HashMap> tPutItemStacks = new HashMap<>(toInventory.getSizeInventory()); - // completely empty slots - final List tPutFreeSlots = new ArrayList<>(toInventory.getSizeInventory()); - - // find possible target slots - int[] accessibleSlots = null; - if (toObject instanceof ISidedInventory sided) - accessibleSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal()); - for (int i = 0; i < toInventory.getSizeInventory(); i++) { - int slot = i; - if (accessibleSlots != null) { - if (accessibleSlots.length <= i) break; - slot = accessibleSlots[slot]; - } - ItemStack s = toInventory.getStackInSlot(slot); - if (s == null) { - tPutFreeSlots.add(slot); - } else if ((s.stackSize < s.getMaxStackSize() && s.stackSize < toInventory.getInventoryStackLimit()) - && aMinMoveAtOnce <= s.getMaxStackSize() - s.stackSize - && isAllowedToPutIntoSlot(toInventory, slot, putSide, s, (byte) 64)) { - ItemId sID = ItemId.createNoCopy(s); - tPutItems.merge( - sID, - (Math.min(s.getMaxStackSize(), toInventory.getInventoryStackLimit()) - s.stackSize), - Integer::sum); - tPutItemStacks.computeIfAbsent(sID, k -> new ArrayList<>()) - .add(s); - } - } - - // target completely filled, bail out - if (tPutItems.isEmpty() && tPutFreeSlots.isEmpty()) { - // maybe target is a double chest. check it. - if (aDoCheckChests && toObject instanceof TileEntityChest chest) return moveToAdjacentChests( - fromInventory, - chest, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer); - return 0; - } - - // go over source stacks one by one - int tStacksMoved = 0, tTotalItemsMoved = 0; - for (int j = 0; j < tGrabSlotsSize; j++) { - final int grabSlot = tGrabSlots[j]; - int tMovedItems; - int tStackSize; - do { - tMovedItems = 0; - final ItemStack tGrabStack = fromInventory.getStackInSlot(grabSlot); - if (tGrabStack == null) break; - tStackSize = tGrabStack.stackSize; - final ItemId sID = ItemId.createNoCopy(tGrabStack); - - if (tPutItems.containsKey(sID)) { - // there is a partially filled slot, try merging - final int canPut = Math.min(tPutItems.get(sID), aMaxMoveAtOnce); - if (canPut >= aMinMoveAtOnce) { - final List putStack = tPutItemStacks.get(sID); - if (!putStack.isEmpty()) { - // can move, do merge - int toPut = Math.min(canPut, tStackSize); - tMovedItems = toPut; - for (int i = 0; i < putStack.size(); i++) { - final ItemStack s = putStack.get(i); - final int sToPut = Math.min( - Math.min( - Math.min(toPut, s.getMaxStackSize() - s.stackSize), - toInventory.getInventoryStackLimit() - s.stackSize), - aMaxTargetStackSize - s.stackSize); - if (sToPut <= 0) continue; - if (sToPut < aMinMoveAtOnce) continue; - if (s.stackSize + sToPut < aMinTargetStackSize) continue; - toPut -= sToPut; - s.stackSize += sToPut; - if (s.stackSize == s.getMaxStackSize() - || s.stackSize == toInventory.getInventoryStackLimit()) { - // this slot is full. remove this stack from candidate list - putStack.remove(i); - i--; - } - if (toPut == 0) break; - } - tMovedItems -= toPut; - if (tMovedItems > 0) { - tStackSize -= tMovedItems; - tTotalItemsMoved += tMovedItems; - // deduct spare space - tPutItems.merge(sID, tMovedItems, (a, b) -> a.equals(b) ? null : a - b); - - if (tStackSize == 0) fromInventory.setInventorySlotContents(grabSlot, null); - else tGrabStack.stackSize = tStackSize; - - fromInventory.markDirty(); - toInventory.markDirty(); - } - } - } - } - // still stuff to move & have completely empty slots - if (tStackSize > 0 && !tPutFreeSlots.isEmpty()) { - for (int i = 0; i < tPutFreeSlots.size(); i++) { - final int tPutSlot = tPutFreeSlots.get(i); - if (isAllowedToPutIntoSlot(toInventory, tPutSlot, putSide, tGrabStack, (byte) 64)) { - // allowed, now do moving - final int tMoved = moveStackFromSlotAToSlotB( - fromInventory, - toInventory, - grabSlot, - tPutSlot, - aMaxTargetStackSize, - aMinTargetStackSize, - (byte) (aMaxMoveAtOnce - tMovedItems), - aMinMoveAtOnce); - if (tMoved > 0) { - final ItemStack s = toInventory.getStackInSlot(tPutSlot); - if (s != null) { - // s might be null if tPutInventory is very special, e.g. infinity chest - // if s is null, we will not mark this slot as target candidate for anything - final int spare = Math - .min(s.getMaxStackSize(), toInventory.getInventoryStackLimit()) - - s.stackSize; - if (spare > 0) { - final ItemId ssID = ItemId.createNoCopy(s); - // add back to spare space count - tPutItems.merge(ssID, spare, Integer::sum); - // add to partially filled slot list - tPutItemStacks.computeIfAbsent(ssID, k -> new ArrayList<>()) - .add(s); - } - // this is no longer free - tPutFreeSlots.remove(i); - i--; - } - // else -> noop - // this is still a free slot. no need to do anything. - tTotalItemsMoved += tMoved; - tMovedItems += tMoved; - tStackSize -= tMoved; - if (tStackSize == 0) break; - } - } - } - } - - if (tMovedItems > 0) { - // check if we have moved enough stacks - if (++tStacksMoved >= aMaxStackTransfer) return tTotalItemsMoved; - } - } while (tMovedItems > 0 && tStackSize > 0); // support inventories that store more than a stack in a - // slot - } - - // check if source is a double chest, if yes, try move from the adjacent as well - if (aDoCheckChests && fromInventory instanceof TileEntityChest chest) { - final int tAmount = moveFromAdjacentChests( - chest, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer - tStacksMoved); - if (tAmount != 0) return tAmount + tTotalItemsMoved; - } - - // check if target is a double chest, if yes, try move to the adjacent as well - if (aDoCheckChests && toObject instanceof TileEntityChest chest) { - final int tAmount = moveToAdjacentChests( - fromInventory, - chest, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer - tStacksMoved); - if (tAmount != 0) return tAmount + tTotalItemsMoved; - } - - return tTotalItemsMoved; - } - // there should be a function to transfer more than 1 stack in a pipe - // however I do not see any ways to improve it. too much work for what it is worth - int tTotalItemsMoved = 0; - final int tGrabInventorySize = tGrabSlots.length; - for (int i = 0; i < tGrabInventorySize; i++) { - final int tMoved = moveStackIntoPipe( - fromInventory, - toObject, - tGrabSlots, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aDoCheckChests); - if (tMoved == 0) return tTotalItemsMoved; - else tTotalItemsMoved += tMoved; - } - return 0; - } - - private static int moveToAdjacentChests(IInventory aTileEntity1, TileEntityChest aTargetChest, - ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, - byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, - int aMaxStackTransfer) { - if (aTargetChest.adjacentChestChecked) { - if (aTargetChest.adjacentChestXNeg != null) { - return moveMultipleItemStacks( - aTileEntity1, - aTargetChest.adjacentChestXNeg, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } else if (aTargetChest.adjacentChestZNeg != null) { - return moveMultipleItemStacks( - aTileEntity1, - aTargetChest.adjacentChestZNeg, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } else if (aTargetChest.adjacentChestXPos != null) { - return moveMultipleItemStacks( - aTileEntity1, - aTargetChest.adjacentChestXPos, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } else if (aTargetChest.adjacentChestZPos != null) { - return moveMultipleItemStacks( - aTileEntity1, - aTargetChest.adjacentChestZPos, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } - } - return 0; - } - - private static int moveFromAdjacentChests(TileEntityChest fromTileEntityChest, Object toObject, - ForgeDirection fromSide, ForgeDirection putSide, List aFilter, boolean aInvertFilter, - byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, - int aMaxStackTransfer) { - if (fromTileEntityChest.adjacentChestXNeg != null) { - return moveMultipleItemStacks( - fromTileEntityChest.adjacentChestXNeg, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } else if (fromTileEntityChest.adjacentChestZNeg != null) { - return moveMultipleItemStacks( - fromTileEntityChest.adjacentChestZNeg, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } else if (fromTileEntityChest.adjacentChestXPos != null) { - return moveMultipleItemStacks( - fromTileEntityChest.adjacentChestXPos, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } else if (fromTileEntityChest.adjacentChestZPos != null) { - return moveMultipleItemStacks( - fromTileEntityChest.adjacentChestZPos, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aMaxStackTransfer, - false); - } - return 0; - } - - /** - * Moves Stack from Inv-Side to Inv-Side. - * - * @return the Amount of moved Items - */ - public static byte moveOneItemStack(Object fromObject, Object toObject, ForgeDirection fromSide, - ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, - byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { - if (fromObject instanceof IInventory inv) return moveOneItemStack( - inv, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - true); - return 0; - } - - /** - * This is only because I needed an additional Parameter for the Double Chest Check. - */ - private static byte moveOneItemStack(IInventory fromInventory, Object toObject, ForgeDirection fromSide, - ForgeDirection putSide, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, - byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, boolean aDoCheckChests) { - if (fromInventory == null || aMaxTargetStackSize <= 0 - || aMinTargetStackSize <= 0 - || aMaxMoveAtOnce <= 0 - || aMinTargetStackSize > aMaxTargetStackSize - || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; - - int[] tGrabSlots = null; - if (fromInventory instanceof ISidedInventory) - tGrabSlots = ((ISidedInventory) fromInventory).getAccessibleSlotsFromSide(fromSide.ordinal()); - if (tGrabSlots == null) { - tGrabSlots = new int[fromInventory.getSizeInventory()]; - for (int i = 0; i < tGrabSlots.length; i++) tGrabSlots[i] = i; - } - - if (toObject instanceof IInventory inv) { - int[] tPutSlots = null; - if (toObject instanceof ISidedInventory sided) - tPutSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal()); - - if (tPutSlots == null) { - tPutSlots = new int[inv.getSizeInventory()]; - for (int i = 0; i < tPutSlots.length; i++) tPutSlots[i] = i; - } - - for (final int tGrabSlot : tGrabSlots) { - byte tMovedItemCount = 0; - final ItemStack tGrabStack = fromInventory.getStackInSlot(tGrabSlot); - if (listContainsItem(aFilter, tGrabStack, true, aInvertFilter) - && (tGrabStack.stackSize >= aMinMoveAtOnce - && isAllowedToTakeFromSlot(fromInventory, tGrabSlot, fromSide, tGrabStack))) { - for (final int tPutSlot : tPutSlots) { - if (isAllowedToPutIntoSlot(inv, tPutSlot, putSide, tGrabStack, aMaxTargetStackSize)) { - tMovedItemCount += moveStackFromSlotAToSlotB( - fromInventory, - inv, - tGrabSlot, - tPutSlot, - aMaxTargetStackSize, - aMinTargetStackSize, - (byte) (aMaxMoveAtOnce - tMovedItemCount), - aMinMoveAtOnce); - if (tMovedItemCount >= aMaxMoveAtOnce || (tMovedItemCount > 0 && aMaxTargetStackSize < 64)) - return tMovedItemCount; - } - } - - } - if (tMovedItemCount > 0) return tMovedItemCount; - } - - if (aDoCheckChests && fromInventory instanceof TileEntityChest fromChest - && (fromChest.adjacentChestChecked)) { - byte tAmount = 0; - if (fromChest.adjacentChestXNeg != null) { - tAmount = moveOneItemStack( - fromChest.adjacentChestXNeg, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (fromChest.adjacentChestZNeg != null) { - tAmount = moveOneItemStack( - fromChest.adjacentChestZNeg, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (fromChest.adjacentChestXPos != null) { - tAmount = moveOneItemStack( - fromChest.adjacentChestXPos, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (fromChest.adjacentChestZPos != null) { - tAmount = moveOneItemStack( - fromChest.adjacentChestZPos, - toObject, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } - if (tAmount != 0) return tAmount; - - } - if (aDoCheckChests && toObject instanceof TileEntityChest toChest && (toChest.adjacentChestChecked)) { - byte tAmount = 0; - if (toChest.adjacentChestXNeg != null) { - tAmount = moveOneItemStack( - fromInventory, - toChest.adjacentChestXNeg, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (toChest.adjacentChestZNeg != null) { - tAmount = moveOneItemStack( - fromInventory, - toChest.adjacentChestZNeg, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (toChest.adjacentChestXPos != null) { - tAmount = moveOneItemStack( - fromInventory, - toChest.adjacentChestXPos, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (toChest.adjacentChestZPos != null) { - tAmount = moveOneItemStack( - fromInventory, - toChest.adjacentChestZPos, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } - if (tAmount != 0) return tAmount; - - } - } - - return moveStackIntoPipe( - fromInventory, - toObject, - tGrabSlots, - fromSide, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aDoCheckChests); - } - - /** - * Moves Stack from Inv-Side to Inv-Slot. - * - * @return the Amount of moved Items - */ - public static byte moveOneItemStackIntoSlot(Object fromTileEntity, Object toTileEntity, ForgeDirection fromSide, - int putSlot, List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, - byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { - if (!(fromTileEntity instanceof IInventory fromInv) || aMaxTargetStackSize <= 0 - || aMinTargetStackSize <= 0 - || aMaxMoveAtOnce <= 0 - || aMinTargetStackSize > aMaxTargetStackSize - || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; - - int[] tGrabSlots = null; - if (fromTileEntity instanceof ISidedInventory sided) - tGrabSlots = sided.getAccessibleSlotsFromSide(fromSide.ordinal()); - if (tGrabSlots == null) { - tGrabSlots = new int[fromInv.getSizeInventory()]; - for (int i = 0; i < tGrabSlots.length; i++) tGrabSlots[i] = i; - } - - if (toTileEntity instanceof IInventory toInv) { - for (final int tGrabSlot : tGrabSlots) { - if (listContainsItem(aFilter, fromInv.getStackInSlot(tGrabSlot), true, aInvertFilter)) { - if (isAllowedToTakeFromSlot(fromInv, tGrabSlot, fromSide, fromInv.getStackInSlot(tGrabSlot))) { - if (isAllowedToPutIntoSlot( - toInv, - putSlot, - ForgeDirection.UNKNOWN, - fromInv.getStackInSlot(tGrabSlot), - aMaxTargetStackSize)) { - byte tMovedItemCount = moveStackFromSlotAToSlotB( - fromInv, - toInv, - tGrabSlot, - putSlot, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce); - if (tMovedItemCount > 0) return tMovedItemCount; - } - } - } - } - } - - final ForgeDirection toSide = fromSide.getOpposite(); - moveStackIntoPipe( - fromInv, - toTileEntity, - tGrabSlots, - fromSide, - ForgeDirection.UNKNOWN, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce); - return 0; - } - - /** - * Moves Stack from Inv-Slot to Inv-Slot. - * - * @return the Amount of moved Items - */ - public static byte moveFromSlotToSlot(IInventory fromInv, IInventory toInv, int aGrabFrom, int aPutTo, - List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, - byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { - if (fromInv == null || toInv == null - || aGrabFrom < 0 - || aPutTo < 0 - || aMinTargetStackSize <= 0 - || aMaxMoveAtOnce <= 0 - || aMinTargetStackSize > aMaxTargetStackSize - || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; - if (listContainsItem(aFilter, fromInv.getStackInSlot(aGrabFrom), true, aInvertFilter)) { - if (isAllowedToTakeFromSlot( - fromInv, - aGrabFrom, - ForgeDirection.UNKNOWN, - fromInv.getStackInSlot(aGrabFrom))) { - if (isAllowedToPutIntoSlot( - toInv, - aPutTo, - ForgeDirection.UNKNOWN, - fromInv.getStackInSlot(aGrabFrom), - aMaxTargetStackSize)) { - byte tMovedItemCount = moveStackFromSlotAToSlotB( - fromInv, - toInv, - aGrabFrom, - aPutTo, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce); - if (tMovedItemCount > 0) return tMovedItemCount; - } - } - } - return 0; - } - - /** - * Moves Stack from Inv-Side to Inv-Slot. - * - * @return the Amount of moved Items - */ - public static byte moveFromSlotToSide(IInventory fromTile, Object toTile, int fromSlot, ForgeDirection putSide, - List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, - byte aMaxMoveAtOnce, byte aMinMoveAtOnce, boolean aDoCheckChests) { - if (fromTile == null || fromSlot < 0 - || aMinTargetStackSize <= 0 - || aMaxMoveAtOnce <= 0 - || aMinTargetStackSize > aMaxTargetStackSize - || aMinMoveAtOnce > aMaxMoveAtOnce) return 0; - - if (!listContainsItem(aFilter, fromTile.getStackInSlot(fromSlot), true, aInvertFilter) - || !isAllowedToTakeFromSlot(fromTile, fromSlot, ForgeDirection.UNKNOWN, fromTile.getStackInSlot(fromSlot))) - return 0; - - if (toTile instanceof IInventory) { - int[] tPutSlots = null; - if (toTile instanceof ISidedInventory sided) - tPutSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal()); - - if (tPutSlots == null) { - tPutSlots = new int[((IInventory) toTile).getSizeInventory()]; - for (int i = 0; i < tPutSlots.length; i++) tPutSlots[i] = i; - } - - byte tMovedItemCount = 0; - for (final int tPutSlot : tPutSlots) { - if (isAllowedToPutIntoSlot( - (IInventory) toTile, - tPutSlot, - putSide, - fromTile.getStackInSlot(fromSlot), - aMaxTargetStackSize)) { - tMovedItemCount += moveStackFromSlotAToSlotB( - fromTile, - (IInventory) toTile, - fromSlot, - tPutSlot, - aMaxTargetStackSize, - aMinTargetStackSize, - (byte) (aMaxMoveAtOnce - tMovedItemCount), - aMinMoveAtOnce); - if (tMovedItemCount >= aMaxMoveAtOnce) { - return tMovedItemCount; - } - } - } - if (tMovedItemCount > 0) return tMovedItemCount; - - if (aDoCheckChests && toTile instanceof TileEntityChest tTileEntity2) { - if (tTileEntity2.adjacentChestChecked) { - if (tTileEntity2.adjacentChestXNeg != null) { - tMovedItemCount = moveFromSlotToSide( - fromTile, - tTileEntity2.adjacentChestXNeg, - fromSlot, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (tTileEntity2.adjacentChestZNeg != null) { - tMovedItemCount = moveFromSlotToSide( - fromTile, - tTileEntity2.adjacentChestZNeg, - fromSlot, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (tTileEntity2.adjacentChestXPos != null) { - tMovedItemCount = moveFromSlotToSide( - fromTile, - tTileEntity2.adjacentChestXPos, - fromSlot, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } else if (tTileEntity2.adjacentChestZPos != null) { - tMovedItemCount = moveFromSlotToSide( - fromTile, - tTileEntity2.adjacentChestZPos, - fromSlot, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - false); - } - if (tMovedItemCount > 0) return tMovedItemCount; - } - } - } - return moveStackIntoPipe( - fromTile, - toTile, - new int[] { fromSlot }, - ForgeDirection.UNKNOWN, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - aDoCheckChests); - } - - public static byte moveFromSlotToSide(IInventory fromTile, Object toTile, int fromSlot, ForgeDirection putSide, - List aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize, - byte aMaxMoveAtOnce, byte aMinMoveAtOnce) { - return moveFromSlotToSide( - fromTile, - toTile, - fromSlot, - putSide, - aFilter, - aInvertFilter, - aMaxTargetStackSize, - aMinTargetStackSize, - aMaxMoveAtOnce, - aMinMoveAtOnce, - true); - } - - /** - * Move up to maxAmount amount of fluid from source to dest, with optional filtering via allowMove. note that this - * filter cannot bypass filtering done by IFluidHandlers themselves. - * - * this overload will assume the fill side is the opposite of drainSide - * - * @param source tank to drain from. method become noop if this is null - * @param dest tank to fill to. method become noop if this is null - * @param drainSide side used during draining operation - * @param maxAmount max amount of fluid to transfer. method become noop if this is not a positive integer - * @param allowMove filter. can be null to signal all fluids are accepted - */ - public static void moveFluid(IFluidHandler source, IFluidHandler dest, ForgeDirection drainSide, int maxAmount, - @Nullable Predicate allowMove) { - moveFluid(source, dest, drainSide, drainSide.getOpposite(), maxAmount, allowMove); - } - - /** - * Move up to maxAmount amount of fluid from source to dest, with optional filtering via allowMove. note that this - * filter cannot bypass filtering done by IFluidHandlers themselves. - * - * @param source tank to drain from. method become noop if this is null - * @param dest tank to fill to. method become noop if this is null - * @param drainSide side used during draining operation - * @param fillSide side used during filling operation - * @param maxAmount max amount of fluid to transfer. method become noop if this is not a positive integer - * @param allowMove filter. can be null to signal all fluids are accepted - */ - public static void moveFluid(IFluidHandler source, IFluidHandler dest, ForgeDirection drainSide, - ForgeDirection fillSide, int maxAmount, @Nullable Predicate allowMove) { - if (source == null || dest == null || maxAmount <= 0) return; - FluidStack liquid = source.drain(drainSide, maxAmount, false); - if (liquid == null) return; - liquid = liquid.copy(); - liquid.amount = dest.fill(fillSide, liquid, false); - if (liquid.amount > 0 && (allowMove == null || allowMove.test(liquid))) { - dest.fill(fillSide, source.drain(drainSide, liquid.amount, true), true); - } - } - - public static boolean listContainsItem(Collection aList, ItemStack aStack, boolean aTIfListEmpty, - boolean aInvertFilter) { - if (aStack == null || aStack.stackSize < 1) return false; - if (aList == null) return aTIfListEmpty; - boolean tEmpty = true; - for (ItemStack tStack : aList) { - if (tStack != null) { - tEmpty = false; - if (areStacksEqual(aStack, tStack)) { - return !aInvertFilter; - } - } - } - return tEmpty ? aTIfListEmpty : aInvertFilter; - } - - public static boolean areStacksOrToolsEqual(ItemStack aStack1, ItemStack aStack2) { - if (aStack1 != null && aStack2 != null && aStack1.getItem() == aStack2.getItem()) { - if (aStack1.getItem() - .isDamageable()) return true; - return ((aStack1.getTagCompound() == null) == (aStack2.getTagCompound() == null)) - && (aStack1.getTagCompound() == null || aStack1.getTagCompound() - .equals(aStack2.getTagCompound())) - && (Items.feather.getDamage(aStack1) == Items.feather.getDamage(aStack2) - || Items.feather.getDamage(aStack1) == W - || Items.feather.getDamage(aStack2) == W); - } - return false; - } - - public static boolean areFluidsEqual(FluidStack aFluid1, FluidStack aFluid2) { - return areFluidsEqual(aFluid1, aFluid2, false); - } - - public static boolean areFluidsEqual(FluidStack aFluid1, FluidStack aFluid2, boolean aIgnoreNBT) { - return aFluid1 != null && aFluid2 != null - && aFluid1.getFluid() == aFluid2.getFluid() - && (aIgnoreNBT || ((aFluid1.tag == null) == (aFluid2.tag == null)) - && (aFluid1.tag == null || aFluid1.tag.equals(aFluid2.tag))); - } - - public static boolean areStacksEqual(ItemStack aStack1, ItemStack aStack2) { - return areStacksEqual(aStack1, aStack2, false); - } - - public static boolean areStacksEqual(ItemStack aStack1, ItemStack aStack2, boolean aIgnoreNBT) { - return aStack1 != null && aStack2 != null - && aStack1.getItem() == aStack2.getItem() - && (Items.feather.getDamage(aStack1) == Items.feather.getDamage(aStack2) - || Items.feather.getDamage(aStack1) == W - || Items.feather.getDamage(aStack2) == W) - && (aIgnoreNBT || (((aStack1.getTagCompound() == null) == (aStack2.getTagCompound() == null)) - && (aStack1.getTagCompound() == null || aStack1.getTagCompound() - .equals(aStack2.getTagCompound())))); - } - - public static boolean areStacksEqualOrNull(ItemStack stack1, ItemStack stack2) { - return (stack1 == null && stack2 == null) || GT_Utility.areStacksEqual(stack1, stack2); - } - - /** - * Treat both null list, or both null item stack at same list position as equal. - *

- * Since ItemStack doesn't override equals and hashCode, you cannot just use Objects.equals - */ - public static boolean areStackListsEqual(List lhs, List rhs, boolean ignoreStackSize, - boolean ignoreNBT) { - if (lhs == null) return rhs == null; - if (rhs == null) return false; - if (lhs.size() != rhs.size()) return false; - for (Iterator it1 = lhs.iterator(), it2 = rhs.iterator(); it1.hasNext() && it2.hasNext();) { - if (!areStacksEqualExtended(it1.next(), it2.next(), ignoreStackSize, ignoreNBT)) return false; - } - return true; - } - - private static boolean areStacksEqualExtended(ItemStack lhs, ItemStack rhs, boolean ignoreStackSize, - boolean ignoreNBT) { - if (lhs == null) return rhs == null; - if (rhs == null) return false; - return lhs.getItem() == rhs.getItem() - && (ignoreNBT || Objects.equals(lhs.stackTagCompound, rhs.stackTagCompound)) - && (ignoreStackSize || lhs.stackSize == rhs.stackSize); - } - - public static boolean areUnificationsEqual(ItemStack aStack1, ItemStack aStack2) { - return areUnificationsEqual(aStack1, aStack2, false); - } - - public static boolean areUnificationsEqual(ItemStack aStack1, ItemStack aStack2, boolean aIgnoreNBT) { - return areStacksEqual( - GT_OreDictUnificator.get_nocopy(aStack1), - GT_OreDictUnificator.get_nocopy(aStack2), - aIgnoreNBT); - } - - public static String getFluidName(Fluid aFluid, boolean aLocalized) { - if (aFluid == null) return E; - String rName = aLocalized ? aFluid.getLocalizedName(new FluidStack(aFluid, 0)) : aFluid.getUnlocalizedName(); - if (rName.contains("fluid.") || rName.contains("tile.")) return capitalizeString( - rName.replaceAll("fluid.", E) - .replaceAll("tile.", E)); - return rName; - } - - public static String getFluidName(FluidStack aFluid, boolean aLocalized) { - if (aFluid == null) return E; - return getFluidName(aFluid.getFluid(), aLocalized); - } - - public static void reInit() { - sFilledContainerToData.clear(); - sEmptyContainerToFluidToData.clear(); - sFluidToContainers.clear(); - for (FluidContainerData tData : sFluidContainerList) { - String fluidName = tData.fluid.getFluid() - .getName(); - sFilledContainerToData.put(new GT_ItemStack(tData.filledContainer), tData); - Map tFluidToContainer = sEmptyContainerToFluidToData - .get(new GT_ItemStack(tData.emptyContainer)); - List tContainers = sFluidToContainers.get(fluidName); - if (tFluidToContainer == null) { - sEmptyContainerToFluidToData - .put(new GT_ItemStack(tData.emptyContainer), tFluidToContainer = new /* Concurrent */ HashMap<>()); - } - tFluidToContainer.put(fluidName, tData); - if (tContainers == null) { - tContainers = new ArrayList<>(); - tContainers.add(tData.filledContainer); - sFluidToContainers.put(fluidName, tContainers); - } else tContainers.add(tData.filledContainer); - } - } - - public static void addFluidContainerData(FluidContainerData aData) { - String fluidName = aData.fluid.getFluid() - .getName(); - sFluidContainerList.add(aData); - sFilledContainerToData.put(new GT_ItemStack(aData.filledContainer), aData); - Map tFluidToContainer = sEmptyContainerToFluidToData - .get(new GT_ItemStack(aData.emptyContainer)); - List tContainers = sFluidToContainers.get(fluidName); - if (tFluidToContainer == null) { - sEmptyContainerToFluidToData - .put(new GT_ItemStack(aData.emptyContainer), tFluidToContainer = new /* Concurrent */ HashMap<>()); - } - tFluidToContainer.put(fluidName, aData); - if (tContainers == null) { - tContainers = new ArrayList<>(); - tContainers.add(aData.filledContainer); - sFluidToContainers.put(fluidName, tContainers); - } else tContainers.add(aData.filledContainer); - } - - public static List getContainersFromFluid(FluidStack tFluidStack) { - if (tFluidStack != null) { - List tContainers = sFluidToContainers.get( - tFluidStack.getFluid() - .getName()); - if (tContainers == null) return new ArrayList<>(); - return tContainers; - } - return new ArrayList<>(); - } - - public static ItemStack fillFluidContainer(FluidStack aFluid, ItemStack aStack, boolean aRemoveFluidDirectly, - boolean aCheckIFluidContainerItems) { - if (isStackInvalid(aStack) || aFluid == null) return null; - if (GT_ModHandler.isWater(aFluid) && ItemList.Bottle_Empty.isStackEqual(aStack)) { - if (aFluid.amount >= 1000) { - return new ItemStack(Items.potionitem, 1, 0); - } - return null; - } - if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem - && ((IFluidContainerItem) aStack.getItem()).getFluid(aStack) == null - && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) <= aFluid.amount) { - if (aRemoveFluidDirectly) aFluid.amount -= ((IFluidContainerItem) aStack.getItem()) - .fill(aStack = copyAmount(1, aStack), aFluid, true); - else((IFluidContainerItem) aStack.getItem()).fill(aStack = copyAmount(1, aStack), aFluid, true); - return aStack; - } - Map tFluidToContainer = sEmptyContainerToFluidToData.get(new GT_ItemStack(aStack)); - if (tFluidToContainer == null) return null; - FluidContainerData tData = tFluidToContainer.get( - aFluid.getFluid() - .getName()); - if (tData == null || tData.fluid.amount > aFluid.amount) return null; - if (aRemoveFluidDirectly) aFluid.amount -= tData.fluid.amount; - return copyAmount(1, tData.filledContainer); - } - - public static int calculateRecipeEU(Materials aMaterial, int defaultRecipeEUPerTick) { - return aMaterial.getProcessingMaterialTierEU() == 0 ? defaultRecipeEUPerTick - : aMaterial.getProcessingMaterialTierEU(); - } - - public static ItemStack getFluidDisplayStack(Fluid aFluid) { - return aFluid == null ? null : getFluidDisplayStack(new FluidStack(aFluid, 0), false); - } - - public static ItemStack getFluidDisplayStack(FluidStack aFluid, boolean aUseStackSize) { - return getFluidDisplayStack(aFluid, aUseStackSize, false); - } - - public static ItemStack getFluidDisplayStack(FluidStack aFluid, boolean aUseStackSize, boolean aHideStackSize) { - if (aFluid == null || aFluid.getFluid() == null) return null; - int tmp = 0; - try { - tmp = aFluid.getFluid() - .getID(); - } catch (Exception e) { - System.err.println(e); - } - ItemStack rStack = ItemList.Display_Fluid.getWithDamage(1, tmp); - NBTTagCompound tNBT = new NBTTagCompound(); - tNBT.setLong("mFluidDisplayAmount", aUseStackSize ? aFluid.amount : 0); - tNBT.setLong( - "mFluidDisplayHeat", - aFluid.getFluid() - .getTemperature(aFluid)); - tNBT.setBoolean( - "mFluidState", - aFluid.getFluid() - .isGaseous(aFluid)); - tNBT.setBoolean("mHideStackSize", aHideStackSize); - try { - tNBT.setString("mFluidMaterialName", FLUID_MAP.get(aFluid.getFluid()).mName); - } catch (Exception ignored) {} - rStack.setTagCompound(tNBT); - return rStack; - } - - public static FluidStack getFluidFromDisplayStack(ItemStack aDisplayStack) { - if (!isStackValid(aDisplayStack) || aDisplayStack.getItem() != ItemList.Display_Fluid.getItem() - || !aDisplayStack.hasTagCompound()) return null; - Fluid tFluid = FluidRegistry.getFluid( - ItemList.Display_Fluid.getItem() - .getDamage(aDisplayStack)); - return new FluidStack( - tFluid, - (int) aDisplayStack.getTagCompound() - .getLong("mFluidDisplayAmount")); - } - - public static boolean containsFluid(ItemStack aStack, FluidStack aFluid, boolean aCheckIFluidContainerItems) { - if (isStackInvalid(aStack) || aFluid == null) return false; - if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem - && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) - return aFluid - .isFluidEqual(((IFluidContainerItem) aStack.getItem()).getFluid(aStack = copyAmount(1, aStack))); - FluidContainerData tData = sFilledContainerToData.get(new GT_ItemStack(aStack)); - return tData != null && tData.fluid.isFluidEqual(aFluid); - } - - public static FluidStack getFluidForFilledItem(ItemStack aStack, boolean aCheckIFluidContainerItems) { - if (isStackInvalid(aStack)) return null; - if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem - && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) - return ((IFluidContainerItem) aStack.getItem()).drain(copyAmount(1, aStack), Integer.MAX_VALUE, true); - FluidContainerData tData = sFilledContainerToData.get(new GT_ItemStack(aStack)); - return tData == null ? null : tData.fluid.copy(); - } - - /** - * Get empty fluid container from filled one. - */ - public static ItemStack getContainerForFilledItem(ItemStack aStack, boolean aCheckIFluidContainerItems) { - if (isStackInvalid(aStack)) return null; - FluidContainerData tData = sFilledContainerToData.get(new GT_ItemStack(aStack)); - if (tData != null) return copyAmount(1, tData.emptyContainer); - if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem - && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) { - ((IFluidContainerItem) aStack.getItem()).drain(aStack = copyAmount(1, aStack), Integer.MAX_VALUE, true); - return aStack; - } - return null; - } - - /** - * This is NOT meant for fluid manipulation! It's for getting item container, which is generally used for - * crafting recipes. While it also works for many of the fluid containers, some don't. - *

- * Use {@link #getContainerForFilledItem} for getting empty fluid container. - */ - public static ItemStack getContainerItem(ItemStack aStack, boolean aCheckIFluidContainerItems) { - if (isStackInvalid(aStack)) return null; - if (aStack.getItem() - .hasContainerItem(aStack)) - return aStack.getItem() - .getContainerItem(aStack); - /* - * These are all special Cases, in which it is intended to have only GT Blocks outputting those Container Items - */ - if (ItemList.Cell_Empty.isStackEqual(aStack, false, true)) return null; - if (aStack.getItem() == Items.potionitem || aStack.getItem() == Items.experience_bottle - || ItemList.TF_Vial_FieryBlood.isStackEqual(aStack) - || ItemList.TF_Vial_FieryTears.isStackEqual(aStack)) return ItemList.Bottle_Empty.get(1); - - if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem - && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) { - ItemStack tStack = copyAmount(1, aStack); - ((IFluidContainerItem) aStack.getItem()).drain(tStack, Integer.MAX_VALUE, true); - if (!areStacksEqual(aStack, tStack)) return tStack; - return null; - } - - int tCapsuleCount = GT_ModHandler.getCapsuleCellContainerCount(aStack); - if (tCapsuleCount > 0) return ItemList.Cell_Empty.get(tCapsuleCount); - - if (ItemList.IC2_ForgeHammer.isStackEqual(aStack) || ItemList.IC2_WireCutter.isStackEqual(aStack)) - return copyMetaData(Items.feather.getDamage(aStack) + 1, aStack); - return null; - } - - public static FluidStack getFluidFromContainerOrFluidDisplay(ItemStack stack) { - FluidStack fluidStack = GT_Utility.getFluidForFilledItem(stack, true); - if (fluidStack == null) { - fluidStack = GT_Utility.getFluidFromDisplayStack(stack); - } - return fluidStack; - } - - public static synchronized boolean removeIC2BottleRecipe(ItemStack aContainer, ItemStack aInput, - Map aRecipeList, ItemStack aOutput) { - if ((isStackInvalid(aInput) && isStackInvalid(aOutput) && isStackInvalid(aContainer)) || aRecipeList == null) - return false; - boolean rReturn = false; - Iterator> tIterator = aRecipeList - .entrySet() - .iterator(); - aOutput = GT_OreDictUnificator.get(aOutput); - while (tIterator.hasNext()) { - Map.Entry tEntry = tIterator.next(); - if (aInput == null || tEntry.getKey() - .matches(aContainer, aInput)) { - List tList = tEntry.getValue().items; - if (tList != null) for (ItemStack tOutput : tList) - if (aOutput == null || areStacksEqual(GT_OreDictUnificator.get(tOutput), aOutput)) { - tIterator.remove(); - rReturn = true; - break; - } - } - } - return rReturn; - } - - public static synchronized boolean removeSimpleIC2MachineRecipe(ItemStack aInput, - Map aRecipeList, ItemStack aOutput) { - if ((isStackInvalid(aInput) && isStackInvalid(aOutput)) || aRecipeList == null) return false; - boolean rReturn = false; - Iterator> tIterator = aRecipeList.entrySet() - .iterator(); - aOutput = GT_OreDictUnificator.get(aOutput); - while (tIterator.hasNext()) { - Map.Entry tEntry = tIterator.next(); - if (aInput == null || tEntry.getKey() - .matches(aInput)) { - List tList = tEntry.getValue().items; - if (tList != null) for (ItemStack tOutput : tList) - if (aOutput == null || areStacksEqual(GT_OreDictUnificator.get(tOutput), aOutput)) { - tIterator.remove(); - rReturn = true; - break; - } - } - } - return rReturn; - } - - public static synchronized void bulkRemoveSimpleIC2MachineRecipe(Map toRemove, - Map aRecipeList) { - if (aRecipeList == null || aRecipeList.isEmpty()) return; - toRemove.entrySet() - .removeIf(aEntry -> (isStackInvalid(aEntry.getKey()) && isStackInvalid(aEntry.getValue()))); - final Map finalToRemove = Maps - .transformValues(toRemove, GT_OreDictUnificator::get_nocopy); - - aRecipeList.entrySet() - .removeIf( - tEntry -> finalToRemove.entrySet() - .stream() - .anyMatch(aEntry -> { - final ItemStack aInput = aEntry.getKey(), aOutput = aEntry.getValue(); - final List tList = tEntry.getValue().items; - - if (tList == null) return false; - if (aInput != null && !tEntry.getKey() - .matches(aInput)) return false; - - return tList.stream() - .anyMatch( - tOutput -> (aOutput == null - || areStacksEqual(GT_OreDictUnificator.get(tOutput), aOutput))); - })); - } - - public static boolean addSimpleIC2MachineRecipe(ItemStack aInput, Map aRecipeList, - NBTTagCompound aNBT, Object... aOutput) { - if (isStackInvalid(aInput) || aOutput.length == 0 || aRecipeList == null) return false; - ItemData tOreName = GT_OreDictUnificator.getAssociation(aInput); - for (Object o : aOutput) { - if (o == null) { - GT_FML_LOGGER.info("EmptyIC2Output!" + aInput.getUnlocalizedName()); - return false; - } - } - ItemStack[] tStack = GT_OreDictUnificator.getStackArray(true, aOutput); - if (tStack.length > 0 && areStacksEqual(aInput, tStack[0])) return false; - if (tOreName != null) { - if (tOreName.toString() - .equals("dustAsh") - && tStack[0].getUnlocalizedName() - .equals("tile.volcanicAsh")) - return false; - aRecipeList - .put(new RecipeInputOreDict(tOreName.toString(), aInput.stackSize), new RecipeOutput(aNBT, tStack)); - } else { - aRecipeList - .put(new RecipeInputItemStack(copyOrNull(aInput), aInput.stackSize), new RecipeOutput(aNBT, tStack)); - } - return true; - } - - public static ItemStack getWrittenBook(String aMapping, ItemStack aStackToPutNBT) { - if (isStringInvalid(aMapping)) return null; - ItemStack rStack = GregTech_API.sBookList.get(aMapping); - if (rStack == null) return aStackToPutNBT; - if (aStackToPutNBT != null) { - aStackToPutNBT.setTagCompound(rStack.getTagCompound()); - return aStackToPutNBT; - } - return copyAmount(1, rStack); - } - - public static ItemStack getWrittenBook(String aMapping, String aTitle, String aAuthor, String... aPages) { - if (isStringInvalid(aMapping)) return null; - ItemStack rStack = GregTech_API.sBookList.get(aMapping); - if (rStack != null) return copyAmount(1, rStack); - if (isStringInvalid(aTitle) || isStringInvalid(aAuthor) || aPages.length == 0) return null; - sBookCount++; - rStack = new ItemStack(Items.written_book, 1); - NBTTagCompound tNBT = new NBTTagCompound(); - tNBT.setString("title", GT_LanguageManager.addStringLocalization("Book." + aTitle + ".Name", aTitle)); - tNBT.setString("author", aAuthor); - NBTTagList tNBTList = new NBTTagList(); - for (byte i = 0; i < aPages.length; i++) { - aPages[i] = GT_LanguageManager - .addStringLocalization("Book." + aTitle + ".Page" + ((i < 10) ? "0" + i : i), aPages[i]); - if (i < 48) { - if (aPages[i].length() < 256) tNBTList.appendTag(new NBTTagString(aPages[i])); - else GT_Log.err.println("WARNING: String for written Book too long! -> " + aPages[i]); - } else { - GT_Log.err.println("WARNING: Too much Pages for written Book! -> " + aTitle); - break; - } - } - tNBTList.appendTag( - new NBTTagString( - "Credits to " + aAuthor - + " for writing this Book. This was Book Nr. " - + sBookCount - + " at its creation. Gotta get 'em all!")); - tNBT.setTag("pages", tNBTList); - rStack.setTagCompound(tNBT); - GT_Log.out.println( - "GT_Mod: Added Book to Book List - Mapping: '" + aMapping - + "' - Name: '" - + aTitle - + "' - Author: '" - + aAuthor - + "'"); - GregTech_API.sBookList.put(aMapping, rStack); - return copyOrNull(rStack); - } - - public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength) { - if (aSoundName == null) return false; - return doSoundAtClient(aSoundName, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer()); - } - - public static boolean doSoundAtClient(SoundResource sound, int aTimeUntilNextSound, float aSoundStrength) { - return doSoundAtClient(sound.resourceLocation, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer()); - } - - public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, - float aSoundStrength) { - return doSoundAtClient(aSoundResourceLocation, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer()); - } - - public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength, - Entity aEntity) { - if (aEntity == null || aSoundName == null) return false; - return doSoundAtClient( - aSoundName, - aTimeUntilNextSound, - aSoundStrength, - aEntity.posX, - aEntity.posY, - aEntity.posZ); - } - - public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, - float aSoundStrength, Entity aEntity) { - if (aEntity == null) return false; - return doSoundAtClient( - aSoundResourceLocation.toString(), - aTimeUntilNextSound, - aSoundStrength, - aEntity.posX, - aEntity.posY, - aEntity.posZ); - } - - public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, - float aSoundStrength, double aX, double aY, double aZ) { - return doSoundAtClient(aSoundResourceLocation, aTimeUntilNextSound, aSoundStrength, 1.01818028F, aX, aY, aZ); - } - - /** - * @inheritDoc - * @deprecated Use {@link #doSoundAtClient(ResourceLocation, int, float, double, double, double)} - */ - @Deprecated - public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength, double aX, - double aY, double aZ) { - if (aSoundName == null) return false; - return doSoundAtClient( - new ResourceLocation(aSoundName), - aTimeUntilNextSound, - aSoundStrength, - 1.01818028F, - aX, - aY, - aZ); - } - - public static boolean doSoundAtClient(SoundResource aSound, int aTimeUntilNextSound, float aSoundStrength, - double aX, double aY, double aZ) { - return doSoundAtClient(aSound.resourceLocation, aTimeUntilNextSound, aSoundStrength, aX, aY, aZ); - } - - public static boolean doSoundAtClient(SoundResource aSound, int aTimeUntilNextSound, float aSoundStrength, - float aSoundModulation, double aX, double aY, double aZ) { - return doSoundAtClient( - aSound.resourceLocation, - aTimeUntilNextSound, - aSoundStrength, - aSoundModulation, - aX, - aY, - aZ); - } - - public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound, - float aSoundStrength, float aSoundModulation, double aX, double aY, double aZ) { - if (!FMLCommonHandler.instance() - .getEffectiveSide() - .isClient() || GT.getThePlayer() == null || !GT.getThePlayer().worldObj.isRemote) return false; - if (GregTech_API.sMultiThreadedSounds) new Thread( - new GT_Runnable_Sound( - GT.getThePlayer().worldObj, - aX, - aY, - aZ, - aTimeUntilNextSound, - aSoundResourceLocation, - aSoundStrength, - aSoundModulation), - "Sound Effect").start(); - else new GT_Runnable_Sound( - GT.getThePlayer().worldObj, - aX, - aY, - aZ, - aTimeUntilNextSound, - aSoundResourceLocation, - aSoundStrength, - aSoundModulation).run(); - return true; - } - - public static boolean sendSoundToPlayers(World aWorld, String aSoundName, float aSoundStrength, - float aSoundModulation, int aX, int aY, int aZ) { - if (isStringInvalid(aSoundName) || aWorld == null || aWorld.isRemote) return false; - NW.sendPacketToAllPlayersInRange( - aWorld, - new GT_Packet_Sound(aSoundName, aSoundStrength, aSoundModulation, aX, (short) aY, aZ), - aX, - aZ); - return true; - } - - public static boolean sendSoundToPlayers(World aWorld, SoundResource sound, float aSoundStrength, - float aSoundModulation, int aX, int aY, int aZ) { - if (aWorld == null || aWorld.isRemote) return false; - NW.sendPacketToAllPlayersInRange( - aWorld, - new GT_Packet_Sound( - sound.resourceLocation.toString(), - aSoundStrength, - aSoundModulation, - aX, - (short) aY, - aZ), - aX, - aZ); - return true; - } - - public static int stackToInt(ItemStack aStack) { - if (isStackInvalid(aStack)) return 0; - return itemToInt(aStack.getItem(), Items.feather.getDamage(aStack)); - } - - public static int itemToInt(Item aItem, int aMeta) { - return Item.getIdFromItem(aItem) | (aMeta << 16); - } - - public static int stackToWildcard(ItemStack aStack) { - if (isStackInvalid(aStack)) return 0; - return Item.getIdFromItem(aStack.getItem()) | (W << 16); - } - - public static ItemStack intToStack(int aStack) { - int tID = aStack & (~0 >>> 16), tMeta = aStack >>> 16; - Item tItem = Item.getItemById(tID); - if (tItem != null) return new ItemStack(tItem, 1, tMeta); - return null; - } - - public static Integer[] stacksToIntegerArray(ItemStack... aStacks) { - Integer[] rArray = new Integer[aStacks.length]; - for (int i = 0; i < rArray.length; i++) { - rArray[i] = stackToInt(aStacks[i]); - } - return rArray; - } - - public static int[] stacksToIntArray(ItemStack... aStacks) { - int[] rArray = new int[aStacks.length]; - for (int i = 0; i < rArray.length; i++) { - rArray[i] = stackToInt(aStacks[i]); - } - return rArray; - } - - public static boolean arrayContains(Object aObject, Object... aObjects) { - return listContains(aObject, Arrays.asList(aObjects)); - } - - public static boolean listContains(Object aObject, Collection aObjects) { - if (aObjects == null) return false; - return aObjects.contains(aObject); - } - - @SafeVarargs - public static boolean arrayContainsNonNull(T... aArray) { - if (aArray != null) for (Object tObject : aArray) if (tObject != null) return true; - return false; - } - - /** - * Note: use {@link ArrayExt#withoutNulls(Object[], IntFunction)} if you want an array as a result. - */ - @SafeVarargs - public static ArrayList getArrayListWithoutNulls(T... aArray) { - if (aArray == null) return new ArrayList<>(); - ArrayList rList = new ArrayList<>(Arrays.asList(aArray)); - for (int i = 0; i < rList.size(); i++) if (rList.get(i) == null) rList.remove(i--); - return rList; - } - - /** - * Note: use {@link ArrayExt#withoutTrailingNulls(Object[], IntFunction)} if you want an array as a result. - */ - @SafeVarargs - public static ArrayList getArrayListWithoutTrailingNulls(T... aArray) { - if (aArray == null) return new ArrayList<>(); - ArrayList rList = new ArrayList<>(Arrays.asList(aArray)); - for (int i = rList.size() - 1; i >= 0 && rList.get(i) == null;) rList.remove(i--); - return rList; - } - - public static Block getBlockFromStack(ItemStack itemStack) { - if (isStackInvalid(itemStack)) return Blocks.air; - return getBlockFromItem(itemStack.getItem()); - } - - public static Block getBlockFromItem(Item item) { - return Block.getBlockFromItem(item); - } - - public static boolean isStringValid(Object aString) { - return aString != null && !aString.toString() - .isEmpty(); - } - - public static boolean isStringInvalid(Object aString) { - return aString == null || aString.toString() - .isEmpty(); - } - - @Deprecated - public static boolean isStackValid(Object aStack) { - return (aStack instanceof ItemStack stack) && isStackValid(stack); - } - - public static boolean isStackValid(ItemStack aStack) { - return (aStack != null) && aStack.getItem() != null && aStack.stackSize >= 0; - } - - @Deprecated - public static boolean isStackInvalid(Object aStack) { - return !(aStack instanceof ItemStack stack) || isStackInvalid(stack); - } - - public static boolean isStackInvalid(ItemStack aStack) { - return aStack == null || aStack.getItem() == null || aStack.stackSize < 0; - } - - public static boolean isDebugItem(ItemStack aStack) { - return /* ItemList.Armor_Cheat.isStackEqual(aStack, T, T) || */ areStacksEqual( - GT_ModHandler.getIC2Item("debug", 1), - aStack, - true); - } - - public static ItemStack updateItemStack(ItemStack aStack) { - if (isStackValid(aStack) && aStack.getItem() instanceof GT_Generic_Item) - ((GT_Generic_Item) aStack.getItem()).isItemStackUsable(aStack); - return aStack; - } - - public static boolean isOpaqueBlock(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlock(aX, aY, aZ) - .isOpaqueCube(); - } - - public static boolean isBlockAir(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlock(aX, aY, aZ) - .isAir(aWorld, aX, aY, aZ); - } - - public static boolean hasBlockHitBox(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlock(aX, aY, aZ) - .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ) != null; - } - - public static void setCoordsOnFire(World aWorld, int aX, int aY, int aZ, boolean aReplaceCenter) { - if (aReplaceCenter) if (aWorld.getBlock(aX, aY, aZ) - .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ) == null) aWorld.setBlock(aX, aY, aZ, Blocks.fire); - if (aWorld.getBlock(aX + 1, aY, aZ) - .getCollisionBoundingBoxFromPool(aWorld, aX + 1, aY, aZ) == null) - aWorld.setBlock(aX + 1, aY, aZ, Blocks.fire); - if (aWorld.getBlock(aX - 1, aY, aZ) - .getCollisionBoundingBoxFromPool(aWorld, aX - 1, aY, aZ) == null) - aWorld.setBlock(aX - 1, aY, aZ, Blocks.fire); - if (aWorld.getBlock(aX, aY + 1, aZ) - .getCollisionBoundingBoxFromPool(aWorld, aX, aY + 1, aZ) == null) - aWorld.setBlock(aX, aY + 1, aZ, Blocks.fire); - if (aWorld.getBlock(aX, aY - 1, aZ) - .getCollisionBoundingBoxFromPool(aWorld, aX, aY - 1, aZ) == null) - aWorld.setBlock(aX, aY - 1, aZ, Blocks.fire); - if (aWorld.getBlock(aX, aY, aZ + 1) - .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ + 1) == null) - aWorld.setBlock(aX, aY, aZ + 1, Blocks.fire); - if (aWorld.getBlock(aX, aY, aZ - 1) - .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ - 1) == null) - aWorld.setBlock(aX, aY, aZ - 1, Blocks.fire); - } - - public static ItemStack getProjectile(SubTag aProjectileType, IInventory aInventory) { - if (aInventory != null) for (int i = 0, j = aInventory.getSizeInventory(); i < j; i++) { - ItemStack rStack = aInventory.getStackInSlot(i); - if (isStackValid(rStack) && rStack.getItem() instanceof IProjectileItem - && ((IProjectileItem) rStack.getItem()).hasProjectile(aProjectileType, rStack)) - return updateItemStack(rStack); - } - return null; - } - - public static void removeNullStacksFromInventory(IInventory aInventory) { - if (aInventory != null) for (int i = 0, j = aInventory.getSizeInventory(); i < j; i++) { - ItemStack tStack = aInventory.getStackInSlot(i); - if (tStack != null && (tStack.stackSize == 0 || tStack.getItem() == null)) - aInventory.setInventorySlotContents(i, null); - } - } - - /** - * Initializes new empty texture page for casings page 0 is old CASING_BLOCKS - *

- * Then casings should be registered like this: for (byte i = MIN_USED_META; i < MAX_USED_META; i = (byte) (i + 1)) - * { Textures.BlockIcons.casingTexturePages[PAGE][i+START_INDEX] = new GT_CopiedBlockTexture(this, 6, i); } - * - * @param page 0 to 127 - * @return true if it made empty page, false if one already existed... - */ - public static boolean addTexturePage(byte page) { - if (Textures.BlockIcons.casingTexturePages[page] == null) { - Textures.BlockIcons.casingTexturePages[page] = new ITexture[128]; - return true; - } - return false; - } - - /** - * Return texture id from page and index, for use when determining hatches, but can also be precomputed from: - * (page<<7)+index - * - * @param page 0 to 127 page - * @param index 0 to 127 texture index - * @return casing texture 0 to 16383 - */ - public static int getTextureId(byte page, byte index) { - if (page >= 0 && index >= 0) { - return (page << 7) + index; - } - throw new RuntimeException("Index out of range: [" + page + "][" + index + "]"); - } - - /** - * Return texture id from page and index, for use when determining hatches, but can also be precomputed from: - * (page<<7)+index - * - * @param page 0 to 127 page - * @param startIndex 0 to 127 start texture index - * @param blockMeta meta of the block - * @return casing texture 0 to 16383 - */ - public static int getTextureId(byte page, byte startIndex, byte blockMeta) { - if (page >= 0 && startIndex >= 0 && blockMeta >= 0 && (startIndex + blockMeta) <= 127) { - return (page << 7) + (startIndex + blockMeta); - } - throw new RuntimeException( - "Index out of range: [" + page - + "][" - + startIndex - + "+" - + blockMeta - + "=" - + (startIndex + blockMeta) - + "]"); - } - - /** - * Return texture id from item stack, unoptimized but readable? - * - * @return casing texture 0 to 16383 - */ - public static int getTextureId(Block blockFromBlock, byte metaFromBlock) { - for (int page = 0; page < Textures.BlockIcons.casingTexturePages.length; page++) { - ITexture[] casingTexturePage = Textures.BlockIcons.casingTexturePages[page]; - if (casingTexturePage != null) { - for (int index = 0; index < casingTexturePage.length; index++) { - ITexture iTexture = casingTexturePage[index]; - if (iTexture instanceof IBlockContainer) { - Block block = ((IBlockContainer) iTexture).getBlock(); - byte meta = ((IBlockContainer) iTexture).getMeta(); - if (meta == metaFromBlock && blockFromBlock == block) { - return (page << 7) + index; - } - } - } - } - } - throw new RuntimeException( - "Probably missing mapping or different texture class used for: " + blockFromBlock.getUnlocalizedName() - + " meta:" - + metaFromBlock); - } - - /** - * Converts a Number to a String - */ - public static String parseNumberToString(int aNumber) { - boolean temp = true, negative = false; - - if (aNumber < 0) { - aNumber *= -1; - negative = true; - } - - StringBuilder tStringB = new StringBuilder(); - for (int i = 1000000000; i > 0; i /= 10) { - int tDigit = (aNumber / i) % 10; - if (temp && tDigit != 0) temp = false; - if (!temp) { - tStringB.append(tDigit); - if (i != 1) for (int j = i; j > 0; j /= 1000) if (j == 1) tStringB.append(","); - } - } - - String tString = tStringB.toString(); - - if (tString.equals(E)) tString = "0"; - - return negative ? "-" + tString : tString; - } - - public static NBTTagCompound getNBTContainingBoolean(NBTTagCompound aNBT, Object aTag, boolean aValue) { - if (aNBT == null) aNBT = new NBTTagCompound(); - aNBT.setBoolean(aTag.toString(), aValue); - return aNBT; - } - - public static NBTTagCompound getNBTContainingByte(NBTTagCompound aNBT, Object aTag, byte aValue) { - if (aNBT == null) aNBT = new NBTTagCompound(); - aNBT.setByte(aTag.toString(), aValue); - return aNBT; - } - - public static NBTTagCompound getNBTContainingShort(NBTTagCompound aNBT, Object aTag, short aValue) { - if (aNBT == null) aNBT = new NBTTagCompound(); - aNBT.setShort(aTag.toString(), aValue); - return aNBT; - } - - public static NBTTagCompound getNBTContainingInteger(NBTTagCompound aNBT, Object aTag, int aValue) { - if (aNBT == null) aNBT = new NBTTagCompound(); - aNBT.setInteger(aTag.toString(), aValue); - return aNBT; - } - - public static NBTTagCompound getNBTContainingFloat(NBTTagCompound aNBT, Object aTag, float aValue) { - if (aNBT == null) aNBT = new NBTTagCompound(); - aNBT.setFloat(aTag.toString(), aValue); - return aNBT; - } - - public static NBTTagCompound getNBTContainingDouble(NBTTagCompound aNBT, Object aTag, double aValue) { - if (aNBT == null) aNBT = new NBTTagCompound(); - aNBT.setDouble(aTag.toString(), aValue); - return aNBT; - } - - public static NBTTagCompound getNBTContainingString(NBTTagCompound aNBT, Object aTag, Object aValue) { - if (aNBT == null) aNBT = new NBTTagCompound(); - if (aValue == null) return aNBT; - aNBT.setString(aTag.toString(), aValue.toString()); - return aNBT; - } - - public static boolean isWearingFullFrostHazmat(EntityLivingBase aEntity) { - for (byte i = 1; i < 5; i++) { - ItemStack tStack = aEntity.getEquipmentInSlot(i); - - if (!isStackInList(tStack, GregTech_API.sFrostHazmatList) && !hasHazmatEnchant(tStack)) { - return false; - } - } - return true; - } - - public static boolean isWearingFullHeatHazmat(EntityLivingBase aEntity) { - for (byte i = 1; i < 5; i++) { - ItemStack tStack = aEntity.getEquipmentInSlot(i); - - if (!isStackInList(tStack, GregTech_API.sHeatHazmatList) && !hasHazmatEnchant(tStack)) { - return false; - } - } - - return true; - } - - public static boolean isWearingFullBioHazmat(EntityLivingBase aEntity) { - for (byte i = 1; i < 5; i++) { - ItemStack tStack = aEntity.getEquipmentInSlot(i); - - if (!isStackInList(tStack, GregTech_API.sBioHazmatList) && !hasHazmatEnchant(tStack)) { - return false; - } - } - return true; - } - - public static boolean isWearingFullRadioHazmat(EntityLivingBase aEntity) { - for (byte i = 1; i < 5; i++) { - ItemStack tStack = aEntity.getEquipmentInSlot(i); - - if (!isStackInList(tStack, GregTech_API.sRadioHazmatList) && !hasHazmatEnchant(tStack)) { - return false; - } - } - return true; - } - - public static boolean isWearingFullElectroHazmat(EntityLivingBase aEntity) { - for (byte i = 1; i < 5; i++) { - ItemStack tStack = aEntity.getEquipmentInSlot(i); - - if (!isStackInList(tStack, GregTech_API.sElectroHazmatList) && !hasHazmatEnchant(tStack)) { - return false; - } - } - return true; - } - - public static boolean isWearingFullGasHazmat(EntityLivingBase aEntity) { - for (byte i = 1; i < 5; i++) { - ItemStack tStack = aEntity.getEquipmentInSlot(i); - - if (!isStackInList(tStack, GregTech_API.sGasHazmatList) && !hasHazmatEnchant(tStack)) { - return false; - } - } - return true; - } - - public static boolean hasHazmatEnchant(ItemStack aStack) { - if (aStack == null) return false; - Map tEnchantments = EnchantmentHelper.getEnchantments(aStack); - Integer tLevel = tEnchantments.get(Enchantment_Hazmat.INSTANCE.effectId); - - return tLevel != null && tLevel >= 1; - } - - public static float getHeatDamageFromItem(ItemStack aStack) { - ItemData tData = GT_OreDictUnificator.getItemData(aStack); - return tData == null ? 0 - : (tData.mPrefix == null ? 0 : tData.mPrefix.mHeatDamage) - + (tData.hasValidMaterialData() ? tData.mMaterial.mMaterial.mHeatDamage : 0); - } - - public static int getRadioactivityLevel(ItemStack aStack) { - ItemData tData = GT_OreDictUnificator.getItemData(aStack); - if (tData != null && tData.hasValidMaterialData()) { - if (tData.mMaterial.mMaterial.mEnchantmentArmors instanceof Enchantment_Radioactivity) - return tData.mMaterial.mMaterial.mEnchantmentArmorsLevel; - if (tData.mMaterial.mMaterial.mEnchantmentTools instanceof Enchantment_Radioactivity) - return tData.mMaterial.mMaterial.mEnchantmentToolsLevel; - } - return EnchantmentHelper.getEnchantmentLevel(Enchantment_Radioactivity.INSTANCE.effectId, aStack); - } - - public static boolean isImmuneToBreathingGasses(EntityLivingBase aEntity) { - return isWearingFullGasHazmat(aEntity); - } - - public static boolean applyHeatDamage(EntityLivingBase entity, float damage) { - return applyHeatDamage(entity, damage, GT_DamageSources.getHeatDamage()); - } - - public static boolean applyHeatDamageFromItem(EntityLivingBase entity, float damage, ItemStack item) { - return applyHeatDamage(entity, damage, new DamageSourceHotItem(item)); - } - - private static boolean applyHeatDamage(EntityLivingBase aEntity, float aDamage, DamageSource source) { - if (aDamage > 0 && aEntity != null && !isWearingFullHeatHazmat(aEntity)) { - return aEntity.attackEntityFrom(source, aDamage); - } - return false; - } - - public static boolean applyFrostDamage(EntityLivingBase aEntity, float aDamage) { - if (aDamage > 0 && aEntity != null && !isWearingFullFrostHazmat(aEntity)) { - return aEntity.attackEntityFrom(GT_DamageSources.getFrostDamage(), aDamage); - } - return false; - } - - public static boolean applyElectricityDamage(EntityLivingBase aEntity, long aVoltage, long aAmperage) { - long aDamage = getTier(aVoltage) * aAmperage * 4; - if (aDamage > 0 && aEntity != null && !isWearingFullElectroHazmat(aEntity)) { - return aEntity.attackEntityFrom(GT_DamageSources.getElectricDamage(), aDamage); - } - return false; - } - - public static boolean applyRadioactivity(EntityLivingBase aEntity, int aLevel, int aAmountOfItems) { - if (aLevel > 0 && aEntity != null - && aEntity.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD - && aEntity.getCreatureAttribute() != EnumCreatureAttribute.ARTHROPOD - && !isWearingFullRadioHazmat(aEntity)) { - PotionEffect tEffect = null; - aEntity.addPotionEffect( - new PotionEffect( - Potion.moveSlowdown.id, - aLevel * 140 * aAmountOfItems + Math.max( - 0, - ((tEffect = aEntity.getActivePotionEffect(Potion.moveSlowdown)) == null ? 0 - : tEffect.getDuration())), - Math.max(0, (5 * aLevel) / 7))); - aEntity.addPotionEffect( - new PotionEffect( - Potion.digSlowdown.id, - aLevel * 150 * aAmountOfItems + Math.max( - 0, - ((tEffect = aEntity.getActivePotionEffect(Potion.digSlowdown)) == null ? 0 - : tEffect.getDuration())), - Math.max(0, (5 * aLevel) / 7))); - aEntity.addPotionEffect( - new PotionEffect( - Potion.confusion.id, - aLevel * 130 * aAmountOfItems + Math.max( - 0, - ((tEffect = aEntity.getActivePotionEffect(Potion.confusion)) == null ? 0 - : tEffect.getDuration())), - Math.max(0, (5 * aLevel) / 7))); - aEntity.addPotionEffect( - new PotionEffect( - Potion.weakness.id, - aLevel * 150 * aAmountOfItems + Math.max( - 0, - ((tEffect = aEntity.getActivePotionEffect(Potion.weakness)) == null ? 0 - : tEffect.getDuration())), - Math.max(0, (5 * aLevel) / 7))); - aEntity.addPotionEffect( - new PotionEffect( - Potion.hunger.id, - aLevel * 130 * aAmountOfItems + Math.max( - 0, - ((tEffect = aEntity.getActivePotionEffect(Potion.hunger)) == null ? 0 : tEffect.getDuration())), - Math.max(0, (5 * aLevel) / 7))); - aEntity.addPotionEffect( - new PotionEffect( - 24 /* IC2 Radiation */, - aLevel * 180 * aAmountOfItems + Math.max( - 0, - ((tEffect = aEntity.getActivePotionEffect(Potion.potionTypes[24])) == null ? 0 - : tEffect.getDuration())), - Math.max(0, (5 * aLevel) / 7))); - return true; - } - return false; - } - - public static ItemStack setStack(ItemStack aSetStack, ItemStack aToStack) { - if (isStackInvalid(aSetStack) || isStackInvalid(aToStack)) return null; - aSetStack.func_150996_a(aToStack.getItem()); - aSetStack.stackSize = aToStack.stackSize; - Items.feather.setDamage(aSetStack, Items.feather.getDamage(aToStack)); - aSetStack.setTagCompound(aToStack.getTagCompound()); - return aSetStack; - } - - public static FluidStack[] copyFluidArray(FluidStack... aStacks) { - if (aStacks == null) return null; - FluidStack[] rStacks = new FluidStack[aStacks.length]; - for (int i = 0; i < aStacks.length; i++) if (aStacks[i] != null) rStacks[i] = aStacks[i].copy(); - return rStacks; - } - - public static ItemStack[] copyItemArray(ItemStack... aStacks) { - if (aStacks == null) return null; - ItemStack[] rStacks = new ItemStack[aStacks.length]; - for (int i = 0; i < aStacks.length; i++) rStacks[i] = copy(aStacks[i]); - return rStacks; - } - - /** - * @deprecated use {@link #copy(ItemStack)} instead - */ - @Deprecated - public static ItemStack copy(Object... aStacks) { - for (Object tStack : aStacks) if (isStackValid(tStack)) return ((ItemStack) tStack).copy(); - return null; - } - - public static ItemStack copy(ItemStack aStack) { - if (isStackValid(aStack)) return aStack.copy(); - return null; - } - - @Deprecated - private static ItemStack firstStackOrNull(Object... aStacks) { - for (Object tStack : aStacks) if (tStack instanceof ItemStack stack) return stack; - return null; - } - - @Nullable - public static ItemStack copyOrNull(@Nullable ItemStack stack) { - if (isStackValid(stack)) return stack.copy(); - return null; - } - - public static FluidStack copyAmount(int aAmount, FluidStack aStack) { - if (aStack == null) return null; - FluidStack rStack = aStack.copy(); - rStack.amount = aAmount; - return rStack; - } - - /** - * @deprecated use {@link #copyAmount(int, ItemStack)} instead - */ - @Deprecated - public static ItemStack copyAmount(long aAmount, Object... aStacks) { - return copyAmount(aAmount, firstStackOrNull(aStacks)); - } - - /** - * @deprecated use {@link #copyAmount(int, ItemStack)} instead - */ - @Deprecated - public static ItemStack copyAmount(long aAmount, ItemStack aStack) { - return copyAmount((int) aAmount, aStack); - } - - public static ItemStack copyAmount(int aAmount, ItemStack aStack) { - ItemStack rStack = copy(aStack); - if (isStackInvalid(rStack)) return null; - if (aAmount > 64) aAmount = 64; - else if (aAmount == -1) aAmount = 111; - else if (aAmount < 0) aAmount = 0; - rStack.stackSize = (byte) aAmount; - return rStack; - } - - public static ItemStack multiplyStack(int aMultiplier, ItemStack aStack) { - ItemStack rStack = copy(aStack); - if (isStackInvalid(rStack)) return null; - int tAmount = rStack.stackSize * aMultiplier; - if (tAmount > 64) tAmount = 64; - else if (tAmount == -1) tAmount = 111; - else if (tAmount < 0) tAmount = 0; - rStack.stackSize = (byte) tAmount; - return rStack; - } - - /** - * Unlike {@link #copyAmount(int, ItemStack)}, this method does not restrict stack size by 64. - */ - public static ItemStack copyAmountUnsafe(int aAmount, ItemStack aStack) { - ItemStack rStack = copy(aStack); - if (isStackInvalid(rStack)) return null; - else if (aAmount < 0) aAmount = 0; - rStack.stackSize = (int) aAmount; - return rStack; - } - - public static ItemStack copyMetaData(int aMetaData, ItemStack aStack) { - ItemStack rStack = copy(aStack); - if (isStackInvalid(rStack)) return null; - Items.feather.setDamage(rStack, aMetaData); - return rStack; - } - - /** - * @deprecated use {@link #copyAmountAndMetaData(int, int, ItemStack)} instead - */ - @Deprecated - public static ItemStack copyAmountAndMetaData(long aAmount, long aMetaData, ItemStack aStack) { - return copyAmountAndMetaData((int) aAmount, (int) aMetaData, aStack); - } - - public static ItemStack copyAmountAndMetaData(int aAmount, int aMetaData, ItemStack aStack) { - ItemStack rStack = copyAmount(aAmount, aStack); - if (isStackInvalid(rStack)) return null; - Items.feather.setDamage(rStack, aMetaData); - return rStack; - } - - /** - * returns a copy of an ItemStack with its Stacksize being multiplied by aMultiplier - */ - public static ItemStack mul(int aMultiplier, ItemStack aStack) { - ItemStack rStack = copy(aStack); - if (rStack == null) return null; - rStack.stackSize *= aMultiplier; - return rStack; - } - - /** - * Loads an ItemStack properly. - */ - public static ItemStack loadItem(NBTTagCompound aNBT, String aTagName) { - return loadItem(aNBT.getCompoundTag(aTagName)); - } - - public static FluidStack loadFluid(NBTTagCompound aNBT, String aTagName) { - return loadFluid(aNBT.getCompoundTag(aTagName)); - } - - /** - * Loads an ItemStack properly. - */ - public static ItemStack loadItem(NBTTagCompound aNBT) { - if (aNBT == null) return null; - ItemStack tRawStack = ItemStack.loadItemStackFromNBT(aNBT); - int tRealStackSize = 0; - if (tRawStack != null && aNBT.hasKey("Count", Constants.NBT.TAG_INT)) { - tRealStackSize = aNBT.getInteger("Count"); - tRawStack.stackSize = tRealStackSize; - } else if (tRawStack != null) { - tRealStackSize = tRawStack.stackSize; - } - ItemStack tRet = GT_OreDictUnificator.get(true, tRawStack); - if (tRet != null) tRet.stackSize = tRealStackSize; - return tRet; - } - - public static void saveItem(NBTTagCompound aParentTag, String aTagName, ItemStack aStack) { - if (aStack != null) aParentTag.setTag(aTagName, saveItem(aStack)); - } - - public static NBTTagCompound saveItem(ItemStack aStack) { - if (aStack == null) return new NBTTagCompound(); - NBTTagCompound t = new NBTTagCompound(); - aStack.writeToNBT(t); - if (aStack.stackSize > Byte.MAX_VALUE) t.setInteger("Count", aStack.stackSize); - return t; - } - - /** - * Loads an FluidStack properly. - */ - public static FluidStack loadFluid(NBTTagCompound aNBT) { - if (aNBT == null) return null; - return FluidStack.loadFluidStackFromNBT(aNBT); - } - - public static E selectItemInList(int aIndex, E aReplacement, List aList) { - if (aList == null || aList.isEmpty()) return aReplacement; - if (aList.size() <= aIndex) return aList.get(aList.size() - 1); - if (aIndex < 0) return aList.get(0); - return aList.get(aIndex); - } - - @SafeVarargs - public static E selectItemInList(int aIndex, E aReplacement, E... aList) { - if (aList == null || aList.length == 0) return aReplacement; - if (aList.length <= aIndex) return aList[aList.length - 1]; - if (aIndex < 0) return aList[0]; - return aList[aIndex]; - } - - public static boolean isStackInStackSet(ItemStack aStack, Set aSet) { - if (aStack == null) return false; - if (aSet.contains(aStack)) return true; - - return aSet.contains(GT_ItemStack.internalCopyStack(aStack, true)); - } - - public static boolean isStackInList(ItemStack aStack, Collection aList) { - if (aStack == null) { - return false; - } - return isStackInList(new GT_ItemStack(aStack), aList); - } - - public static boolean isStackInList(ItemStack aStack, Set aList) { - if (aStack == null) { - return false; - } - return isStackInList(new GT_ItemStack2(aStack), aList); - } - - public static boolean isStackInList(GT_ItemStack aStack, Collection aList) { - return aStack != null - && (aList.contains(aStack) || aList.contains(new GT_ItemStack(aStack.mItem, aStack.mStackSize, W))); - } - - public static boolean isStackInList(GT_ItemStack2 aStack, Set aList) { - return aStack != null - && (aList.contains(aStack) || aList.contains(new GT_ItemStack2(aStack.mItem, aStack.mStackSize, W))); - } - - /** - * re-maps all Keys of a Map after the Keys were weakened. - */ - public static Map reMap(Map aMap) { - Map tMap = null; - // We try to clone the Map first (most Maps are Cloneable) in order to retain as much state of the Map as - // possible when rehashing. For example, "Custom" HashMaps from fastutil may have a custom hash function which - // would not be used to rehash if we just create a new HashMap. - if (aMap instanceof Cloneable) { - try { - tMap = (Map) aMap.getClass() - .getMethod("clone") - .invoke(aMap); - } catch (Throwable e) { - GT_Log.err.println("Failed to clone Map of type " + aMap.getClass()); - e.printStackTrace(GT_Log.err); - } - } - - if (tMap == null) { - tMap = new HashMap<>(aMap); - } - - aMap.clear(); - aMap.putAll(tMap); - return aMap; - } - - /** - * re-maps all Keys of a Map after the Keys were weakened. - */ - public static SetMultimap reMap(SetMultimap aMap) { - @SuppressWarnings("unchecked") - Map.Entry[] entries = aMap.entries() - .toArray(new Map.Entry[0]); - aMap.clear(); - for (Map.Entry entry : entries) { - aMap.put(entry.getKey(), entry.getValue()); - } - return aMap; - } - - public static > LinkedHashMap sortMapByValuesAcending(Map map) { - return map.entrySet() - .stream() - .sorted(Map.Entry.comparingByValue()) - .collect(CollectorUtils.entriesToMap(LinkedHashMap::new)); - } - - /** - * Why the fuck do neither Java nor Guava have a Function to do this? - */ - public static > LinkedHashMap sortMapByValuesDescending(Map aMap) { - List> tEntrySet = new LinkedList<>(aMap.entrySet()); - tEntrySet.sort((aValue1, aValue2) -> { - return aValue2.getValue() - .compareTo(aValue1.getValue()); // FB: RV - RV_NEGATING_RESULT_OF_COMPARETO - }); - LinkedHashMap rMap = new LinkedHashMap<>(); - for (Map.Entry tEntry : tEntrySet) rMap.put(tEntry.getKey(), tEntry.getValue()); - return rMap; - } - - /** - * Translates a Material Amount into an Amount of Fluid in Fluid Material Units. - */ - public static long translateMaterialToFluidAmount(long aMaterialAmount, boolean aRoundUp) { - return translateMaterialToAmount(aMaterialAmount, L, aRoundUp); - } - - /** - * Translates a Material Amount into an Amount of Fluid. Second Parameter for things like Bucket Amounts (1000) and - * similar - */ - public static long translateMaterialToAmount(long aMaterialAmount, long aAmountPerUnit, boolean aRoundUp) { - return Math.max( - 0, - ((aMaterialAmount * aAmountPerUnit) / M) - + (aRoundUp && (aMaterialAmount * aAmountPerUnit) % M > 0 ? 1 : 0)); - } - - /** - * This checks if the Dimension is really a Dimension and not another Planet or something. Used for my Teleporter. - */ - public static boolean isRealDimension(int aDimensionID) { - if (aDimensionID <= 1 && aDimensionID >= -1 && !GregTech_API.sDimensionalList.contains(aDimensionID)) - return true; - return !GregTech_API.sDimensionalList.contains(aDimensionID) - && DimensionManager.isDimensionRegistered(aDimensionID); - } - - public static boolean moveEntityToDimensionAtCoords(Entity entity, int aDimension, double aX, double aY, - double aZ) { - // Credit goes to BrandonCore Author :!: - - if (entity == null || entity.worldObj.isRemote) return false; - if (entity.ridingEntity != null) entity.mountEntity(null); - if (entity.riddenByEntity != null) entity.riddenByEntity.mountEntity(null); - - World startWorld = entity.worldObj; - WorldServer destinationWorld = FMLCommonHandler.instance() - .getMinecraftServerInstance() - .worldServerForDimension(aDimension); - - if (destinationWorld == null) { - return false; - } - - boolean interDimensional = startWorld.provider.dimensionId != destinationWorld.provider.dimensionId; - if (!interDimensional) return false; - startWorld.updateEntityWithOptionalForce(entity, false); // added - - if (entity instanceof EntityPlayerMP player) { - player.closeScreen(); // added - player.dimension = aDimension; - player.playerNetServerHandler.sendPacket( - new S07PacketRespawn( - player.dimension, - player.worldObj.difficultySetting, - destinationWorld.getWorldInfo() - .getTerrainType(), - player.theItemInWorldManager.getGameType())); - ((WorldServer) startWorld).getPlayerManager() - .removePlayer(player); - - startWorld.playerEntities.remove(player); - startWorld.updateAllPlayersSleepingFlag(); - int i = entity.chunkCoordX; - int j = entity.chunkCoordZ; - if ((entity.addedToChunk) && (startWorld.getChunkProvider() - .chunkExists(i, j))) { - startWorld.getChunkFromChunkCoords(i, j) - .removeEntity(entity); - startWorld.getChunkFromChunkCoords(i, j).isModified = true; - } - startWorld.loadedEntityList.remove(entity); - startWorld.onEntityRemoved(entity); - } - - entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); - - destinationWorld.theChunkProviderServer.loadChunk((int) aX >> 4, (int) aZ >> 4); - - destinationWorld.theProfiler.startSection("placing"); - if (!(entity instanceof EntityPlayer)) { - NBTTagCompound entityNBT = new NBTTagCompound(); - entity.isDead = false; - entityNBT.setString("id", EntityList.getEntityString(entity)); - entity.writeToNBT(entityNBT); - entity.isDead = true; - entity = EntityList.createEntityFromNBT(entityNBT, destinationWorld); - if (entity == null) { - return false; - } - entity.dimension = destinationWorld.provider.dimensionId; - } - destinationWorld.spawnEntityInWorld(entity); - entity.setWorld(destinationWorld); - entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); - - destinationWorld.updateEntityWithOptionalForce(entity, false); - entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); - - if ((entity instanceof EntityPlayerMP player)) { - player.mcServer.getConfigurationManager() - .func_72375_a(player, destinationWorld); - player.playerNetServerHandler.setPlayerLocation(aX, aY, aZ, player.rotationYaw, player.rotationPitch); - } - - destinationWorld.updateEntityWithOptionalForce(entity, false); - - if (entity instanceof EntityPlayerMP player) { - player.theItemInWorldManager.setWorld(destinationWorld); - player.mcServer.getConfigurationManager() - .updateTimeAndWeatherForPlayer(player, destinationWorld); - player.mcServer.getConfigurationManager() - .syncPlayerInventory(player); - - for (PotionEffect potionEffect : player.getActivePotionEffects()) { - player.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(player.getEntityId(), potionEffect)); - } - - player.playerNetServerHandler.sendPacket( - new S1FPacketSetExperience(player.experience, player.experienceTotal, player.experienceLevel)); - FMLCommonHandler.instance() - .firePlayerChangedDimensionEvent( - player, - startWorld.provider.dimensionId, - destinationWorld.provider.dimensionId); - } - entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch); - - destinationWorld.theProfiler.endSection(); - entity.fallDistance = 0; - return true; - } - - public static int getScaleCoordinates(double aValue, int aScale) { - return (int) Math.floor(aValue / aScale); - } - - public static int getCoordinateScan(ArrayList aList, EntityPlayer aPlayer, World aWorld, int aScanLevel, - int aX, int aY, int aZ, ForgeDirection side, float aClickX, float aClickY, float aClickZ) { - if (aList == null) return 0; - - ArrayList tList = new ArrayList<>(); - int rEUAmount = 0; - - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - - final Block tBlock = aWorld.getBlock(aX, aY, aZ); - - addBaseInfo(aPlayer, aWorld, aX, aY, aZ, tList, tTileEntity, tBlock); - - if (tTileEntity != null) { - rEUAmount += addFluidHandlerInfo(side, tList, tTileEntity); - - try { - if (tTileEntity instanceof ic2.api.reactor.IReactorChamber chamber) { - rEUAmount += 500; - // Redirect the rest of the scans to the reactor itself - tTileEntity = (TileEntity) chamber.getReactor(); - } - } catch (Throwable e) { - if (D1) e.printStackTrace(GT_Log.err); - } - rEUAmount += addReactorInfo(tList, tTileEntity); - rEUAmount += addAlignmentInfo(tList, tTileEntity); - rEUAmount += addIC2WrenchableInfo(aPlayer, tList, tTileEntity); - rEUAmount += addIC2EnergyConductorInfo(tList, tTileEntity); - rEUAmount += addIC2EnergyStorageInfo(tList, tTileEntity); - rEUAmount += addUpgradableMachineInfo(tList, tTileEntity); - rEUAmount += addMachineProgressInfo(tList, tTileEntity); - rEUAmount += addCoverableInfo(side, tList, tTileEntity); - addEnergyContainerInfo(tList, tTileEntity); - addOwnerInfo(tList, tTileEntity); - addDeviceInfo(tList, tTileEntity); - - rEUAmount += addIC2CropInfo(tList, tTileEntity); - - rEUAmount += addForestryLeavesInfo(tList, tTileEntity); - } - - final Chunk currentChunk = aWorld.getChunkFromBlockCoords(aX, aZ); - addUndergroundFluidInfo(aPlayer, tList, currentChunk); - addPollutionInfo(tList, currentChunk); - - rEUAmount += addDebuggableBlockInfo(aPlayer, aX, aY, aZ, tList, tBlock); - - final BlockScanningEvent tEvent = new BlockScanningEvent( - aWorld, - aPlayer, - aX, - aY, - aZ, - side, - aScanLevel, - tBlock, - tTileEntity, - tList, - aClickX, - aClickY, - aClickZ); - tEvent.mEUCost = rEUAmount; - MinecraftForge.EVENT_BUS.post(tEvent); - if (!tEvent.isCanceled()) aList.addAll(tList); - return tEvent.mEUCost; - } - - private static void addBaseInfo(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, ArrayList tList, - TileEntity tTileEntity, Block tBlock) { - tList.add( - "----- X: " + EnumChatFormatting.AQUA - + formatNumbers(aX) - + EnumChatFormatting.RESET - + " Y: " - + EnumChatFormatting.AQUA - + formatNumbers(aY) - + EnumChatFormatting.RESET - + " Z: " - + EnumChatFormatting.AQUA - + formatNumbers(aZ) - + EnumChatFormatting.RESET - + " D: " - + EnumChatFormatting.AQUA - + aWorld.provider.dimensionId - + EnumChatFormatting.RESET - + " -----"); - try { - tList.add( - GT_Utility.trans("162", "Name: ") + EnumChatFormatting.BLUE - + ((tTileEntity instanceof IInventory inv) ? inv.getInventoryName() : tBlock.getUnlocalizedName()) - + EnumChatFormatting.RESET - + GT_Utility.trans("163", " MetaData: ") - + EnumChatFormatting.AQUA - + aWorld.getBlockMetadata(aX, aY, aZ) - + EnumChatFormatting.RESET); - tList.add( - GT_Utility.trans("164", "Hardness: ") + EnumChatFormatting.YELLOW - + tBlock.getBlockHardness(aWorld, aX, aY, aZ) - + EnumChatFormatting.RESET - + GT_Utility.trans("165", " Blast Resistance: ") - + EnumChatFormatting.YELLOW - + tBlock - .getExplosionResistance(aPlayer, aWorld, aX, aY, aZ, aPlayer.posX, aPlayer.posY, aPlayer.posZ) - + EnumChatFormatting.RESET); - if (tBlock.isBeaconBase(aWorld, aX, aY, aZ, aX, aY + 1, aZ)) tList.add( - EnumChatFormatting.GOLD + GT_Utility.trans("166", "Is valid Beacon Pyramid Material") - + EnumChatFormatting.RESET); - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this block's info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - } - - private static int addFluidHandlerInfo(ForgeDirection side, ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof IFluidHandler fluidHandler) { - rEUAmount += 500; - final FluidTankInfo[] tTanks = fluidHandler.getTankInfo(side); - if (tTanks != null) for (byte i = 0; i < tTanks.length; i++) { - tList.add( - GT_Utility.trans("167", "Tank ") + i - + ": " - + EnumChatFormatting.GREEN - + formatNumbers((tTanks[i].fluid == null ? 0 : tTanks[i].fluid.amount)) - + EnumChatFormatting.RESET - + " L / " - + EnumChatFormatting.YELLOW - + formatNumbers(tTanks[i].capacity) - + EnumChatFormatting.RESET - + " L " - + EnumChatFormatting.GOLD - + getFluidName(tTanks[i].fluid, true) - + EnumChatFormatting.RESET); - } - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this tile's fluid tank info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addDebuggableBlockInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, ArrayList tList, - Block tBlock) { - int rEUAmount = 0; - try { - if (tBlock instanceof IDebugableBlock debugableBlock) { - rEUAmount += 500; - final ArrayList temp = debugableBlock.getDebugInfo(aPlayer, aX, aY, aZ, 3); - if (temp != null) tList.addAll(temp); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this block's debug info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static void addPollutionInfo(ArrayList tList, Chunk currentChunk) { - if (GT_Pollution.hasPollution(currentChunk)) { - tList.add( - GT_Utility.trans("202", "Pollution in Chunk: ") + EnumChatFormatting.RED - + formatNumbers(GT_Pollution.getPollution(currentChunk)) - + EnumChatFormatting.RESET - + GT_Utility.trans("203", " gibbl")); - } else { - tList.add( - EnumChatFormatting.GREEN + GT_Utility.trans("204", "No Pollution in Chunk! HAYO!") - + EnumChatFormatting.RESET); - } - } - - private static void addUndergroundFluidInfo(EntityPlayer aPlayer, ArrayList tList, Chunk currentChunk) { - if (aPlayer.capabilities.isCreativeMode) { - final FluidStack tFluid = undergroundOilReadInformation(currentChunk); // -# to only read - if (tFluid != null) tList.add( - EnumChatFormatting.GOLD + tFluid.getLocalizedName() - + EnumChatFormatting.RESET - + ": " - + EnumChatFormatting.YELLOW - + formatNumbers(tFluid.amount) - + EnumChatFormatting.RESET - + " L"); - else tList.add( - EnumChatFormatting.GOLD + GT_Utility.trans("201", "Nothing") - + EnumChatFormatting.RESET - + ": " - + EnumChatFormatting.YELLOW - + '0' - + EnumChatFormatting.RESET - + " L"); - } - } - - private static int addForestryLeavesInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (Mods.Forestry.isModLoaded() - && tTileEntity instanceof forestry.arboriculture.tiles.TileLeaves tileLeaves) { - final forestry.api.arboriculture.ITree tree = tileLeaves.getTree(); - if (tree != null) { - rEUAmount += 1000; - if (!tree.isAnalyzed()) tree.analyze(); - tree.addTooltip(tList); - } - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this leaves' info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addIC2CropInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof ic2.api.crops.ICropTile crop) { - rEUAmount += 1000; - if (crop.getScanLevel() < 4) crop.setScanLevel((byte) 4); - if (crop.getCrop() != null) { - tList.add( - GT_Utility.trans("187", "Type -- Crop-Name: ") + crop.getCrop() - .name() - + GT_Utility.trans("188", " Growth: ") - + crop.getGrowth() - + GT_Utility.trans("189", " Gain: ") - + crop.getGain() - + GT_Utility.trans("190", " Resistance: ") - + crop.getResistance()); - } - tList.add( - GT_Utility.trans("191", "Plant -- Fertilizer: ") + crop.getNutrientStorage() - + GT_Utility.trans("192", " Water: ") - + crop.getHydrationStorage() - + GT_Utility.trans("193", " Weed-Ex: ") - + crop.getWeedExStorage() - + GT_Utility.trans("194", " Scan-Level: ") - + crop.getScanLevel()); - tList.add( - GT_Utility.trans("195", "Environment -- Nutrients: ") + crop.getNutrients() - + GT_Utility.trans("196", " Humidity: ") - + crop.getHumidity() - + GT_Utility.trans("197", " Air-Quality: ") - + crop.getAirQuality()); - if (crop.getCrop() != null) { - final StringBuilder tStringB = new StringBuilder(); - for (final String tAttribute : crop.getCrop() - .attributes()) { - tStringB.append(", ") - .append(tAttribute); - } - final String tString = tStringB.toString(); - tList.add(GT_Utility.trans("198", "Attributes:") + tString.replaceFirst(",", E)); - tList.add( - GT_Utility.trans("199", "Discovered by: ") + crop.getCrop() - .discoveredBy()); - } - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this crop's info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static void addDeviceInfo(ArrayList tList, TileEntity tTileEntity) { - try { - if (tTileEntity instanceof IGregTechDeviceInformation info && info.isGivingInformation()) { - tList.addAll(Arrays.asList(info.getInfoData())); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - } - - private static void addOwnerInfo(ArrayList tList, TileEntity tTileEntity) { - try { - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - tList.add( - GT_Utility.trans("186", "Owned by: ") + EnumChatFormatting.BLUE - + gtTE.getOwnerName() - + EnumChatFormatting.RESET); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's owner.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - } - - private static void addEnergyContainerInfo(ArrayList tList, TileEntity tTileEntity) { - try { - if (tTileEntity instanceof IBasicEnergyContainer energyContainer && energyContainer.getEUCapacity() > 0) { - tList.add( - GT_Utility.trans("179", "Max IN: ") + EnumChatFormatting.RED - + formatNumbers(energyContainer.getInputVoltage()) - + " (" - + GT_Values.VN[getTier(energyContainer.getInputVoltage())] - + ") " - + EnumChatFormatting.RESET - + GT_Utility.trans("182", " EU at ") - + EnumChatFormatting.RED - + formatNumbers(energyContainer.getInputAmperage()) - + EnumChatFormatting.RESET - + GT_Utility.trans("183", " A")); - tList.add( - GT_Utility.trans("181", "Max OUT: ") + EnumChatFormatting.RED - + formatNumbers(energyContainer.getOutputVoltage()) - + " (" - + GT_Values.VN[getTier(energyContainer.getOutputVoltage())] - + ") " - + EnumChatFormatting.RESET - + GT_Utility.trans("182", " EU at ") - + EnumChatFormatting.RED - + formatNumbers(energyContainer.getOutputAmperage()) - + EnumChatFormatting.RESET - + GT_Utility.trans("183", " A")); - tList.add( - GT_Utility.trans("184", "Energy: ") + EnumChatFormatting.GREEN - + formatNumbers(energyContainer.getStoredEU()) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + formatNumbers(energyContainer.getEUCapacity()) - + EnumChatFormatting.RESET - + " EU"); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's energy info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - } - - private static int addCoverableInfo(ForgeDirection side, ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof ICoverable coverable) { - rEUAmount += 300; - final String tString = coverable.getCoverInfoAtSide(side) - .getBehaviorDescription(); - if (tString != null && !tString.equals(E)) tList.add(tString); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's covers.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addMachineProgressInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof IMachineProgress progress) { - if (progress.isAllowedToWork() && !progress.hasThingsToDo()) { - tList.add(EnumChatFormatting.RED + "Disabled." + EnumChatFormatting.RESET); - } - if (progress.wasShutdown() && isStringValid( - progress.getLastShutDownReason() - .getDisplayString())) { - tList.add( - progress.getLastShutDownReason() - .getDisplayString()); - } - rEUAmount += 400; - int tValue = 0; - if (0 < (tValue = progress.getMaxProgress())) tList.add( - GT_Utility.trans("178", "Progress/Load: ") + EnumChatFormatting.GREEN - + formatNumbers(progress.getProgress()) - + EnumChatFormatting.RESET - + " / " - + EnumChatFormatting.YELLOW - + formatNumbers(tValue) - + EnumChatFormatting.RESET); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's progress.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addUpgradableMachineInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof IUpgradableMachine upgradableMachine) { - rEUAmount += 500; - if (upgradableMachine.hasMufflerUpgrade()) tList.add( - EnumChatFormatting.GREEN + GT_Utility.trans("177", "Has Muffler Upgrade") - + EnumChatFormatting.RESET); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's upgrades.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addIC2EnergyStorageInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof ic2.api.tile.IEnergyStorage storage) { - rEUAmount += 200; - tList.add( - GT_Utility.trans("176", "Contained Energy: ") + EnumChatFormatting.YELLOW - + formatNumbers(storage.getStored()) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + formatNumbers(storage.getCapacity()) - + EnumChatFormatting.RESET - + " EU"); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's IC2 energy info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addIC2EnergyConductorInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof ic2.api.energy.tile.IEnergyConductor conductor) { - rEUAmount += 200; - tList.add( - GT_Utility.trans("175", "Conduction Loss: ") + EnumChatFormatting.YELLOW - + conductor.getConductionLoss() - + EnumChatFormatting.RESET); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's EU conduction info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addIC2WrenchableInfo(EntityPlayer aPlayer, ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof ic2.api.tile.IWrenchable wrenchable) { - rEUAmount += 100; - tList.add( - GT_Utility.trans("171", "Facing: ") + EnumChatFormatting.GREEN - + wrenchable.getFacing() - + EnumChatFormatting.RESET - + GT_Utility.trans("172", " / Chance: ") - + EnumChatFormatting.YELLOW - + (wrenchable.getWrenchDropRate() * 100) - + EnumChatFormatting.RESET - + "%"); - tList.add( - wrenchable.wrenchCanRemove(aPlayer) - ? EnumChatFormatting.GREEN + GT_Utility.trans("173", "You can remove this with a Wrench") - + EnumChatFormatting.RESET - : EnumChatFormatting.RED + GT_Utility.trans("174", "You can NOT remove this with a Wrench") - + EnumChatFormatting.RESET); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's IC@ wrenchability.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addAlignmentInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof IAlignmentProvider alignmentProvider) { - final IAlignment tAlignment = alignmentProvider.getAlignment(); - if (tAlignment != null) { - rEUAmount += 100; - tList.add( - GT_Utility.trans("219", "Extended Facing: ") + EnumChatFormatting.GREEN - + tAlignment.getExtendedFacing() - + EnumChatFormatting.RESET); - } - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this device's alignment info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - private static int addReactorInfo(ArrayList tList, TileEntity tTileEntity) { - int rEUAmount = 0; - try { - if (tTileEntity instanceof ic2.api.reactor.IReactor reactor) { - rEUAmount += 500; - tList.add( - GT_Utility.trans("168", "Heat: ") + EnumChatFormatting.GREEN - + formatNumbers(reactor.getHeat()) - + EnumChatFormatting.RESET - + " / " - + EnumChatFormatting.YELLOW - + formatNumbers(reactor.getMaxHeat()) - + EnumChatFormatting.RESET); - tList.add( - GT_Utility.trans("169", "HEM: ") + EnumChatFormatting.YELLOW - + reactor.getHeatEffectModifier() - + EnumChatFormatting.RESET); - } - } catch (Throwable e) { - tList.add(String.format("§cAn exception was thrown while fetching this reactor's info.§r")); - if (D1) e.printStackTrace(GT_Log.err); - } - return rEUAmount; - } - - public static String trans(String aKey, String aEnglish) { - return GT_LanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_" + aKey, aEnglish); - } - - public static String getTrans(String aKey) { - return GT_LanguageManager.getTranslation("Interaction_DESCRIPTION_Index_" + aKey); - } - - /** - * @return an Array containing the X and the Y Coordinate of the clicked Point, with the top left Corner as Origin, - * like on the Texture Sheet. return values should always be between [0.0F and 0.99F]. - */ - // TODO: use clamp() - public static float[] getClickedFacingCoords(ForgeDirection side, float aX, float aY, float aZ) { - return switch (side) { - case DOWN -> new float[] { Math.min(0.99F, Math.max(0, 1 - aX)), Math.min(0.99F, Math.max(0, aZ)) }; - case UP -> new float[] { Math.min(0.99F, Math.max(0, aX)), Math.min(0.99F, Math.max(0, aZ)) }; - case NORTH -> new float[] { Math.min(0.99F, Math.max(0, 1 - aX)), Math.min(0.99F, Math.max(0, 1 - aY)) }; - case SOUTH -> new float[] { Math.min(0.99F, Math.max(0, aX)), Math.min(0.99F, Math.max(0, 1 - aY)) }; - case WEST -> new float[] { Math.min(0.99F, Math.max(0, aZ)), Math.min(0.99F, Math.max(0, 1 - aY)) }; - case EAST -> new float[] { Math.min(0.99F, Math.max(0, 1 - aZ)), Math.min(0.99F, Math.max(0, 1 - aY)) }; - default -> new float[] { 0.5F, 0.5F }; - }; - } - - /** - * This Function determines the direction a Block gets when being Wrenched. returns -1 if invalid. Even though that - * could never happen. - */ - public static ForgeDirection determineWrenchingSide(ForgeDirection side, float aX, float aY, float aZ) { - ForgeDirection tBack = side.getOpposite(); - switch (side) { - case DOWN, UP -> { - if (aX < 0.25) { - if (aZ < 0.25) return tBack; - if (aZ > 0.75) return tBack; - return WEST; - } - if (aX > 0.75) { - if (aZ < 0.25) return tBack; - if (aZ > 0.75) return tBack; - return EAST; - } - if (aZ < 0.25) return NORTH; - if (aZ > 0.75) return SOUTH; - return side; - } - case NORTH, SOUTH -> { - if (aX < 0.25) { - if (aY < 0.25) return tBack; - if (aY > 0.75) return tBack; - return WEST; - } - if (aX > 0.75) { - if (aY < 0.25) return tBack; - if (aY > 0.75) return tBack; - return EAST; - } - if (aY < 0.25) return DOWN; - if (aY > 0.75) return UP; - return side; - } - case WEST, EAST -> { - if (aZ < 0.25) { - if (aY < 0.25) return tBack; - if (aY > 0.75) return tBack; - return NORTH; - } - if (aZ > 0.75) { - if (aY < 0.25) return tBack; - if (aY > 0.75) return tBack; - return SOUTH; - } - if (aY < 0.25) return DOWN; - if (aY > 0.75) return UP; - return side; - } - } - return UNKNOWN; - } - - private static DecimalFormat getDecimalFormat() { - return decimalFormatters.computeIfAbsent(Locale.getDefault(Locale.Category.FORMAT), locale -> { - DecimalFormat numberFormat = new DecimalFormat(); // uses the necessary locale inside anyway - numberFormat.setGroupingUsed(true); - numberFormat.setMaximumFractionDigits(2); - numberFormat.setRoundingMode(RoundingMode.HALF_UP); - DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols(); - decimalFormatSymbols.setGroupingSeparator(','); // Use sensible separator for best clarity. - numberFormat.setDecimalFormatSymbols(decimalFormatSymbols); - return numberFormat; - }); - } - - public static String formatNumbers(BigInteger aNumber) { - return getDecimalFormat().format(aNumber); - } - - public static String formatNumbers(long aNumber) { - return getDecimalFormat().format(aNumber); - } - - public static String formatNumbers(double aNumber) { - return getDecimalFormat().format(aNumber); - } - - /* - * Check if stack has enough items of given type and subtract from stack, if there's no creative or 111 stack. - */ - public static boolean consumeItems(EntityPlayer player, ItemStack stack, Item item, int count) { - if (stack != null && stack.getItem() == item && stack.stackSize >= count) { - if ((!player.capabilities.isCreativeMode) && (stack.stackSize != 111)) stack.stackSize -= count; - return true; - } - return false; - } - - /* - * Check if stack has enough items of given gregtech material (will be oredicted) and subtract from stack, if - * there's no creative or 111 stack. - */ - public static boolean consumeItems(EntityPlayer player, ItemStack stack, gregtech.api.enums.Materials mat, - int count) { - if (stack != null && GT_OreDictUnificator.getItemData(stack).mMaterial.mMaterial == mat - && stack.stackSize >= count) { - if ((!player.capabilities.isCreativeMode) && (stack.stackSize != 111)) stack.stackSize -= count; - return true; - } - return false; - } - - public static ArrayList sortByValueToList(Map map) { - List> list = new LinkedList<>(map.entrySet()); - list.sort((o1, o2) -> o2.getValue() - o1.getValue()); - - ArrayList result = new ArrayList<>(); - for (Map.Entry e : list) result.add(e.getKey()); - return result; - } - - public static String joinListToString(List list) { - StringBuilder result = new StringBuilder(32); - for (String s : list) result.append(result.length() == 0 ? s : '|' + s); - return result.toString(); - } - - public static ItemStack getIntegratedCircuit(int config) { - return ItemList.Circuit_Integrated.getWithDamage(0, config); - } - - public static float getBlockHardnessAt(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlock(aX, aY, aZ) - .getBlockHardness(aWorld, aX, aY, aZ); - } - - public static FakePlayer getFakePlayer(IGregTechTileEntity aBaseMetaTileEntity) { - if (aBaseMetaTileEntity.getWorld() instanceof WorldServer) { - return FakePlayerFactory.get( - (WorldServer) aBaseMetaTileEntity.getWorld(), - new GameProfile(aBaseMetaTileEntity.getOwnerUuid(), aBaseMetaTileEntity.getOwnerName())); - } - return null; - } - - public static boolean eraseBlockByFakePlayer(FakePlayer aPlayer, int aX, int aY, int aZ, boolean isSimulate) { - if (aPlayer == null) return false; - World aWorld = aPlayer.worldObj; - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent( - aX, - aY, - aZ, - aWorld, - aWorld.getBlock(aX, aY, aZ), - aWorld.getBlockMetadata(aX, aY, aZ), - aPlayer); - MinecraftForge.EVENT_BUS.post(event); - if (!event.isCanceled()) { - if (!isSimulate) return aWorld.setBlockToAir(aX, aY, aZ); - return true; - } - return false; - } - - public static boolean setBlockByFakePlayer(FakePlayer aPlayer, int aX, int aY, int aZ, Block aBlock, int aMeta, - boolean isSimulate) { - if (aPlayer == null) return false; - World aWorld = aPlayer.worldObj; - BlockEvent.PlaceEvent event = ForgeEventFactory - .onPlayerBlockPlace(aPlayer, new BlockSnapshot(aWorld, aX, aY, aZ, aBlock, aMeta), UNKNOWN); - if (!event.isCanceled()) { - if (!isSimulate) return aWorld.setBlock(aX, aY, aZ, aBlock, aMeta, 3); - return true; - } - return false; - } - - public static int findMatchingStackInList(List aStacks, ItemStack aStack) { - if (isStackInvalid(aStack)) return -1; - for (int i = 0, aStacksSize = aStacks.size(); i < aStacksSize; i++) { - ItemStack tStack = aStacks.get(i); - if (areStacksEqual(aStack, tStack)) return i; - } - return -1; - } - - public static Map convertItemListToMap(Collection itemStacks) { - Map result = new Object2LongOpenHashMap<>(); - for (ItemStack itemStack : itemStacks) { - if (itemStack != null && itemStack.stackSize > 0) { - GT_Utility.ItemId itemId = GT_Utility.ItemId.createNoCopy(itemStack); - result.merge(itemId, (long) itemStack.stackSize, Long::sum); - } - } - return result; - } - - public static Map convertFluidListToMap(Collection fluidStacks) { - Map result = new Reference2LongOpenHashMap<>(); - for (FluidStack fluidStack : fluidStacks) { - if (fluidStack != null && fluidStack.amount > 0) { - result.merge(fluidStack.getFluid(), (long) fluidStack.amount, Long::sum); - } - } - return result; - } - - /** - * @return Supplied collection that doesn't contain invalid MetaTileEntities - */ - public static , E extends MetaTileEntity> T filterValidMTEs(T metaTileEntities) { - metaTileEntities.removeIf(mte -> mte == null || !mte.isValid()); - return metaTileEntities; - } - - public static ForgeDirection getSideFromPlayerFacing(Entity player) { - if (player == null) return ForgeDirection.UNKNOWN; - if (player.rotationPitch >= 65) return ForgeDirection.UP; - if (player.rotationPitch <= -65) return ForgeDirection.DOWN; - final byte facing = COMPASS_DIRECTIONS[MathHelper.floor_double(0.5D + 4.0F * player.rotationYaw / 360.0F) - & 0x3]; - return ForgeDirection.getOrientation(facing); - } - - public static class ItemNBT { - - public static void setNBT(ItemStack aStack, NBTTagCompound aNBT) { - if (aNBT == null) { - aStack.setTagCompound(null); - return; - } - ArrayList tTagsToRemove = new ArrayList<>(); - for (String tKey : aNBT.func_150296_c()) { - NBTBase tValue = aNBT.getTag(tKey); - if (tValue == null || (tValue instanceof NBTPrimitive && ((NBTPrimitive) tValue).func_150291_c() == 0) - || (tValue instanceof NBTTagString && isStringInvalid(((NBTTagString) tValue).func_150285_a_()))) - tTagsToRemove.add(tKey); - } - for (String tKey : tTagsToRemove) aNBT.removeTag(tKey); - aStack.setTagCompound(aNBT.hasNoTags() ? null : aNBT); - } - - public static NBTTagCompound getNBT(ItemStack aStack) { - NBTTagCompound rNBT = aStack.getTagCompound(); - return rNBT == null ? new NBTTagCompound() : rNBT; - } - - public static void setPunchCardData(ItemStack aStack, String aPunchCardData) { - NBTTagCompound tNBT = getNBT(aStack); - tNBT.setString("GT.PunchCardData", aPunchCardData); - setNBT(aStack, tNBT); - } - - public static String getPunchCardData(ItemStack aStack) { - NBTTagCompound tNBT = getNBT(aStack); - return tNBT.getString("GT.PunchCardData"); - } - - public static void setLighterFuel(ItemStack aStack, long aFuel) { - NBTTagCompound tNBT = getNBT(aStack); - tNBT.setLong("GT.LighterFuel", aFuel); - setNBT(aStack, tNBT); - } - - public static long getLighterFuel(ItemStack aStack) { - NBTTagCompound tNBT = getNBT(aStack); - return tNBT.getLong("GT.LighterFuel"); - } - - public static void setMapID(ItemStack aStack, short aMapID) { - NBTTagCompound tNBT = getNBT(aStack); - tNBT.setShort("map_id", aMapID); - setNBT(aStack, tNBT); - } - - public static short getMapID(ItemStack aStack) { - NBTTagCompound tNBT = getNBT(aStack); - if (!tNBT.hasKey("map_id")) return -1; - return tNBT.getShort("map_id"); - } - - public static void setBookTitle(ItemStack aStack, String aTitle) { - NBTTagCompound tNBT = getNBT(aStack); - tNBT.setString("title", aTitle); - setNBT(aStack, tNBT); - } - - public static String getBookTitle(ItemStack aStack) { - NBTTagCompound tNBT = getNBT(aStack); - return tNBT.getString("title"); - } - - public static void setBookAuthor(ItemStack aStack, String aAuthor) { - NBTTagCompound tNBT = getNBT(aStack); - tNBT.setString("author", aAuthor); - setNBT(aStack, tNBT); - } - - public static String getBookAuthor(ItemStack aStack) { - NBTTagCompound tNBT = getNBT(aStack); - return tNBT.getString("author"); - } - - public static void setProspectionData(ItemStack aStack, int aX, int aY, int aZ, int aDim, FluidStack aFluid, - String... aOres) { - NBTTagCompound tNBT = getNBT(aStack); - StringBuilder tData = new StringBuilder(aX + "," + aY + "," + aZ + "," + aDim + ","); - if (aFluid != null) tData.append(aFluid.amount) - .append(",") - .append(aFluid.getLocalizedName()) - .append(","); // TODO - // CHECK - // IF - // THAT - // /5000 - // is - // needed - // (Not - // needed) - for (String tString : aOres) { - tData.append(tString) - .append(","); - } - tNBT.setString("prospection", tData.toString()); - setNBT(aStack, tNBT); - } - - public static void setAdvancedProspectionData(byte aTier, ItemStack aStack, int aX, short aY, int aZ, int aDim, - ArrayList aOils, ArrayList aOres, int aRadius) { - - setBookTitle(aStack, "Raw Prospection Data"); - - NBTTagCompound tNBT = getNBT(aStack); - - tNBT.setByte("prospection_tier", aTier); - tNBT.setString("prospection_pos", "Dim: " + aDim + "\nX: " + aX + " Y: " + aY + " Z: " + aZ); - - // ores - Collections.sort(aOres); - tNBT.setString("prospection_ores", joinListToString(aOres)); - - // oils - ArrayList tOilsTransformed = new ArrayList<>(aOils.size()); - for (String aStr : aOils) { - String[] aStats = aStr.split(","); - tOilsTransformed.add(aStats[0] + ": " + aStats[1] + "L " + aStats[2]); - } - - tNBT.setString("prospection_oils", joinListToString(tOilsTransformed)); - - String tOilsPosStr = "X: " + Math.floorDiv(aX, 16 * 8) * 16 * 8 - + " Z: " - + Math.floorDiv(aZ, 16 * 8) * 16 * 8 - + "\n"; - int xOff = aX - Math.floorDiv(aX, 16 * 8) * 16 * 8; - xOff = xOff / 16; - int xOffRemain = 7 - xOff; - - int zOff = aZ - Math.floorDiv(aZ, 16 * 8) * 16 * 8; - zOff = zOff / 16; - int zOffRemain = 7 - zOff; - - for (; zOff > 0; zOff--) { - tOilsPosStr = tOilsPosStr.concat("--------\n"); - } - for (; xOff > 0; xOff--) { - tOilsPosStr = tOilsPosStr.concat("-"); - } - - tOilsPosStr = tOilsPosStr.concat("P"); - - for (; xOffRemain > 0; xOffRemain--) { - tOilsPosStr = tOilsPosStr.concat("-"); - } - tOilsPosStr = tOilsPosStr.concat("\n"); - for (; zOffRemain > 0; zOffRemain--) { - tOilsPosStr = tOilsPosStr.concat("--------\n"); - } - tOilsPosStr = tOilsPosStr.concat( - " X: " + (Math.floorDiv(aX, 16 * 8) + 1) * 16 * 8 - + " Z: " - + (Math.floorDiv(aZ, 16 * 8) + 1) * 16 * 8); // +1 oilfied to find bottomright of [5] - - tNBT.setString("prospection_oils_pos", tOilsPosStr); - - tNBT.setString("prospection_radius", String.valueOf(aRadius)); - - setNBT(aStack, tNBT); - } - - public static void convertProspectionData(ItemStack aStack) { - NBTTagCompound tNBT = getNBT(aStack); - byte tTier = tNBT.getByte("prospection_tier"); - - if (tTier == 0) { // basic prospection data - String tData = tNBT.getString("prospection"); - String[] tDataArray = tData.split(","); - if (tDataArray.length > 6) { - tNBT.setString( - "author", - " Dim: " + tDataArray[3] - + "X: " - + tDataArray[0] - + " Y: " - + tDataArray[1] - + " Z: " - + tDataArray[2]); - NBTTagList tNBTList = new NBTTagList(); - StringBuilder tOres = new StringBuilder(" Prospected Ores: "); - for (int i = 6; tDataArray.length > i; i++) { - tOres.append(tDataArray[i]) - .append(" "); - } - tNBTList.appendTag( - new NBTTagString( - "Tier " + tTier - + " Prospecting Data From: X" - + tDataArray[0] - + " Z:" - + tDataArray[2] - + " Dim:" - + tDataArray[3] - + " Produces " - + tDataArray[4] - + "L " - + tDataArray[5] - + " " - + tOres)); - tNBT.setTag("pages", tNBTList); - } - } else { // advanced prospection data - String tPos = tNBT.getString("prospection_pos"); - String tRadius = tNBT.getString("prospection_radius"); - - String tOresStr = tNBT.getString("prospection_ores"); - String tOilsStr = tNBT.getString("prospection_oils"); - String tOilsPosStr = tNBT.getString("prospection_oils_pos"); - - String[] tOres = tOresStr.isEmpty() ? null : tOresStr.split("\\|"); - String[] tOils = tOilsStr.isEmpty() ? null : tOilsStr.split("\\|"); - - NBTTagList tNBTList = new NBTTagList(); - - String tPageText = "Prospector report\n" + tPos - + "\n\n" - + "Oils: " - + (tOils != null ? tOils.length : 0) - + "\n\n" - + "Ores within " - + tRadius - + " blocks\n\n" - + "Location is center of orevein\n\n" - + "Check NEI to confirm orevein type"; - tNBTList.appendTag(new NBTTagString(tPageText)); - - if (tOres != null) fillBookWithList(tNBTList, "Ores Found %s\n\n", "\n", 7, tOres); - - if (tOils != null) fillBookWithList(tNBTList, "Oils%s\n\n", "\n", 9, tOils); - - tPageText = """ - Oil notes - - Prospects from NW to SE 576 chunks(9 8x8 oilfields) - around and gives min-max amount - - [1][2][3] - [4][5][6] - [7][8][9] - - [5] - Prospector in this 8x8 area"""; - tNBTList.appendTag(new NBTTagString(tPageText)); - - tPageText = "Corners of [5] are \n" + tOilsPosStr + "\n" + "P - Prospector in 8x8 field"; - tNBTList.appendTag(new NBTTagString(tPageText)); - - tNBT.setString("author", tPos.replace("\n", " ")); - tNBT.setTag("pages", tNBTList); - } - setNBT(aStack, tNBT); - } - - public static void fillBookWithList(NBTTagList aBook, String aPageHeader, String aListDelimiter, - int aItemsPerPage, String[] list) { - String aPageFormatter = " %d/%d"; - int tTotalPages = list.length / aItemsPerPage + (list.length % aItemsPerPage > 0 ? 1 : 0); - int tPage = 0; - StringBuilder tPageText; - do { - tPageText = new StringBuilder(); - for (int i = tPage * aItemsPerPage; i < (tPage + 1) * aItemsPerPage && i < list.length; i += 1) - tPageText.append((tPageText.length() == 0) ? "" : aListDelimiter) - .append(list[i]); - - if (tPageText.length() > 0) { - String tPageCounter = tTotalPages > 1 ? String.format(aPageFormatter, tPage + 1, tTotalPages) : ""; - NBTTagString tPageTag = new NBTTagString(String.format(aPageHeader, tPageCounter) + tPageText); - aBook.appendTag(tPageTag); - } - - ++tPage; - } while (tPageText.length() > 0); - } - - public static void addEnchantment(ItemStack aStack, Enchantment aEnchantment, int aLevel) { - NBTTagCompound tNBT = getNBT(aStack), tEnchantmentTag; - if (!tNBT.hasKey("ench", 9)) tNBT.setTag("ench", new NBTTagList()); - NBTTagList tList = tNBT.getTagList("ench", 10); - - boolean temp = true; - - for (int i = 0; i < tList.tagCount(); i++) { - tEnchantmentTag = tList.getCompoundTagAt(i); - if (tEnchantmentTag.getShort("id") == aEnchantment.effectId) { - tEnchantmentTag.setShort("id", (short) aEnchantment.effectId); - tEnchantmentTag.setShort("lvl", (byte) aLevel); - temp = false; - break; - } - } - - if (temp) { - tEnchantmentTag = new NBTTagCompound(); - tEnchantmentTag.setShort("id", (short) aEnchantment.effectId); - tEnchantmentTag.setShort("lvl", (byte) aLevel); - tList.appendTag(tEnchantmentTag); - } - aStack.setTagCompound(tNBT); - } - } - - public static String toSubscript(long no) { - char[] chars = Long.toString(no) - .toCharArray(); - for (int i = 0; i < chars.length; i++) { - chars[i] += 8272; - } - return new String(chars); - } - - public static boolean isPartOfMaterials(ItemStack aStack, Materials aMaterials) { - return GT_OreDictUnificator.getAssociation(aStack) != null - && GT_OreDictUnificator.getAssociation(aStack).mMaterial.mMaterial.equals(aMaterials); - } - - public static boolean isPartOfOrePrefix(ItemStack aStack, OrePrefixes aPrefix) { - return GT_OreDictUnificator.getAssociation(aStack) != null - && GT_OreDictUnificator.getAssociation(aStack).mPrefix.equals(aPrefix); - } - - public static final ImmutableSet ORE_BLOCK_CLASSES = ImmutableSet.of( - "com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Ores", - "com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_SmallOres", - "gtPlusPlus.core.block.base.BlockBaseOre"); - - public static boolean isOre(Block aBlock, int aMeta) { - return (aBlock instanceof GT_Block_Ores_Abstract) || isOre(new ItemStack(aBlock, 1, aMeta)) - || ORE_BLOCK_CLASSES.contains( - aBlock.getClass() - .getName()); - } - - public static boolean isOre(ItemStack aStack) { - int tItem = GT_Utility.stackToInt(aStack); - if (sOreTable.containsKey(tItem)) { - return sOreTable.get(tItem); - } - for (int id : OreDictionary.getOreIDs(aStack)) { - if (OreDictionary.getOreName(id) - .startsWith("ore")) { - sOreTable.put(tItem, true); - return true; - } - } - sOreTable.put(tItem, false); - return false; - } - - /** - * Do NOT mutate the returned {@code ItemStack}! We return {@code ItemStack} instead of {@code Block} so that - * we can include metadata. - */ - public static ItemStack getCobbleForOre(Block ore, short metaData) { - // We need to convert small ores to regular ores because small ores don't have associated ItemData. - // We take the modulus of the metadata by 16000 because that is the magic number to convert small ores to - // regular ores. - // See: GT_TileEntity_Ores.java - ItemData association = GT_OreDictUnificator - .getAssociation(new ItemStack(Item.getItemFromBlock(ore), 1, metaData % 16000)); - if (association != null) { - Supplier supplier = sOreToCobble.get(association.mPrefix); - if (supplier != null) { - return supplier.get(); - } - } - return new ItemStack(Blocks.cobblestone); - } - - public static Optional reverseShapelessRecipe(ItemStack output, Object... aRecipe) { - if (output == null) { - return Optional.empty(); - } - - List inputs = new ArrayList<>(); - - for (Object o : aRecipe) { - if (o instanceof ItemStack) { - ItemStack toAdd = ((ItemStack) o).copy(); - inputs.add(toAdd); - } else if (o instanceof String) { - ItemStack stack = GT_OreDictUnificator.get(o, 1); - if (stack == null) { - Optional oStack = OreDictionary.getOres((String) o) - .stream() - .findAny(); - if (oStack.isPresent()) { - ItemStack copy = oStack.get() - .copy(); - inputs.add(copy); - } - } else { - ItemStack copy = stack.copy(); - inputs.add(copy); - } - } else if (o instanceof Item) inputs.add(new ItemStack((Item) o)); - else if (o instanceof Block) inputs.add(new ItemStack((Block) o)); - else throw new IllegalStateException("A Recipe contains an invalid input! Output: " + output); - } - - inputs.removeIf(x -> x.getItem() instanceof GT_MetaGenerated_Tool); - - return Optional.of( - new GT_Recipe( - false, - new ItemStack[] { output }, - inputs.toArray(new ItemStack[0]), - null, - null, - null, - null, - 300, - 30, - 0)); - } - - public static Optional reverseShapedRecipe(ItemStack output, Object... aRecipe) { - if (output == null) { - return Optional.empty(); - } - - Map recipeAsMap = new HashMap<>(); - Map ingridients = new HashMap<>(); - Map amounts = new HashMap<>(); - boolean startFound = false; - for (int i = 0, aRecipeLength = aRecipe.length; i < aRecipeLength; i++) { - Object o = aRecipe[i]; - if (!startFound) { - if (o instanceof String) { - for (Character c : ((String) o).toCharArray()) amounts.merge(c, 1, (a, b) -> ++a); - } else if (o instanceof Character) startFound = true; - } else if (!(o instanceof Character)) ingridients.put((Character) aRecipe[i - 1], o); - } - for (Map.Entry characterObjectEntry : ingridients.entrySet()) { - for (Map.Entry characterIntegerEntry : amounts.entrySet()) { - if (characterObjectEntry.getKey() != characterIntegerEntry.getKey()) continue; - recipeAsMap.put(characterObjectEntry.getValue(), characterIntegerEntry.getValue()); - } - } - List inputs = new ArrayList<>(); - - for (Map.Entry o : recipeAsMap.entrySet()) { - final int amount = o.getValue(); - if (o.getKey() instanceof ItemStack) { - ItemStack toAdd = ((ItemStack) o.getKey()).copy(); - toAdd.stackSize = amount; - inputs.add(toAdd); - } else if (o.getKey() instanceof String dictName) { - // Do not register tools dictName in inputs - if (ToolDictNames.contains(dictName)) continue; - ItemStack stack = GT_OreDictUnificator.get(dictName, null, amount, false, true); - if (stack == null) { - Optional oStack = OreDictionary.getOres(dictName) - .stream() - .findAny(); - if (oStack.isPresent()) { - ItemStack copy = oStack.get() - .copy(); - copy.stackSize = amount; - inputs.add(copy); - } - } else { - ItemStack copy = stack.copy(); - copy.stackSize = amount; - inputs.add(copy); - } - } else if (o.getKey() instanceof Item) inputs.add(new ItemStack((Item) o.getKey(), amount)); - else if (o.getKey() instanceof Block) inputs.add(new ItemStack((Block) o.getKey(), amount)); - else throw new IllegalStateException("A Recipe contains an invalid input! Output: " + output); - } - - // Remove tools from inputs in case a recipe has one as a direct Item or ItemStack reference - inputs.removeIf(x -> x.getItem() instanceof GT_MetaGenerated_Tool); - - return Optional.of( - new GT_Recipe( - false, - new ItemStack[] { output }, - inputs.toArray(new ItemStack[0]), - null, - null, - null, - null, - 300, - 30, - 0)); - } - - /** - * Add an itemstack to player inventory, or drop on ground if full. Can be called on client but it probably won't - * work very well. - */ - public static void addItemToPlayerInventory(EntityPlayer aPlayer, ItemStack aStack) { - if (isStackInvalid(aStack)) return; - if (!aPlayer.inventory.addItemStackToInventory(aStack) && !aPlayer.worldObj.isRemote) { - EntityItem dropItem = aPlayer.entityDropItem(aStack, 0); - dropItem.delayBeforeCanPickup = 0; - } - } - - public static long getNonnullElementCount(Object[] tArray) { - return Arrays.stream(tArray) - .filter(Objects::nonNull) - .count(); - } - - public static int clamp(int val, int lo, int hi) { - return MathHelper.clamp_int(val, lo, hi); - } - - public static int ceilDiv(int lhs, int rhs) { - return (lhs + rhs - 1) / rhs; - } - - public static long ceilDiv(long lhs, long rhs) { - return (lhs + rhs - 1) / rhs; - } - - /** - * Hash an item stack for the purpose of storing hash across launches - */ - public static int persistentHash(ItemStack aStack, boolean aUseStackSize, boolean aUseNBT) { - if (aStack == null) return 0; - int result = Objects.hashCode(GameRegistry.findUniqueIdentifierFor(aStack.getItem())); - result = result * 31 + Items.feather.getDamage(aStack); - - if (aUseStackSize) result = result * 31 + aStack.stackSize; - if (aUseNBT) result = result * 31 + Objects.hashCode(aStack.stackTagCompound); - return result; - } - - /** - * Hash an item stack for the purpose of storing hash across launches - */ - public static int persistentHash(FluidStack aStack, boolean aUseStackSize, boolean aUseNBT) { - if (aStack == null) return 0; - int base = Objects.hashCode( - aStack.getFluid() - .getName()); - - if (aUseStackSize) base = base * 31 + aStack.amount; - if (aUseNBT) base = base * 31 + Objects.hashCode(aStack.tag); - return base; - } - - public static int getCasingTextureIndex(Block block, int meta) { - if (block instanceof IHasIndexedTexture) return ((IHasIndexedTexture) block).getTextureIndex(meta); - return Textures.BlockIcons.ERROR_TEXTURE_INDEX; - } - - public static boolean isCellEmpty(ItemStack itemStack) { - if (itemStack == null) return false; - ItemStack tStack = ItemList.Cell_Empty.get(1); - tStack.stackSize = itemStack.stackSize; - return GT_Utility.areStacksEqual(itemStack, tStack); - } - - /** - * Convert a cell to fluid. If given itemstack does not contain any fluid, return null. Will correctly multiple - * output fluid amount if input stack size is greater than 1. - */ - public static FluidStack convertCellToFluid(ItemStack itemStack) { - if (itemStack == null) return null; - if (getFluidForFilledItem(itemStack, true) != null) { - FluidStack fluidStack = getFluidForFilledItem(itemStack, true); - if (fluidStack != null) fluidStack.amount = fluidStack.amount * itemStack.stackSize; - return fluidStack; - } - return null; - } - - public static boolean isAnyIntegratedCircuit(ItemStack itemStack) { - if (itemStack == null) return false; - return itemStack.getItem() == ItemList.Circuit_Integrated.getItem() && 0 <= itemStack.getItemDamage() - && itemStack.getItemDamage() < 25; - } - - public static byte convertRatioToRedstone(long used, long max, int threshold, boolean inverted) { - byte signal; - if (used <= 0) { // Empty - signal = 0; - } else if (used >= max) { // Full - signal = 15; - } else { // Range 1-14 - signal = (byte) (1 + (14 * used) / max); - } - - if (inverted) { - signal = (byte) (15 - signal); - } - - if (threshold > 0) { - if (inverted && used >= threshold) { - return 0; - } else if (!inverted && used < threshold) { - return 0; - } - } - - return signal; - } - - public static ItemStack getNaniteAsCatalyst(Materials material) { - ItemStack aItem = material.getNanite(1); - return new ItemStack(aItem.getItem(), 0, aItem.getItemDamage()); - } - - public static Stream streamCompounds(NBTTagList list) { - if (list == null) return Stream.empty(); - return IntStream.range(0, list.tagCount()) - .mapToObj(list::getCompoundTagAt); - } - - public static boolean equals(ItemStack[] a, ItemStack[] b) { - // because stupid mojang didn't override equals for us - if (a == null && b == null) return true; - if ((a == null) != (b == null)) return false; - if (a.length != b.length) return false; - for (int i = 0; i < a.length; i++) { - if (!areStacksEqual(a[i], b[i], false)) return false; - } - return true; - } - - /** - * Guava ImmutableMap variant of Collectors.toMap. Optimized for serial streams. - */ - public static Collector> toImmutableMapSerial( - Function keyMapper, Function valueMapper) { - // petty type inference cannot work out the correct type parameter - return Collector., ImmutableMap>of( - ImmutableMap::builder, - (b, t) -> b.put(keyMapper.apply(t), valueMapper.apply(t)), - (b1, b2) -> b1.putAll(b2.build()), - ImmutableMap.Builder::build); - } - - public static boolean isArrayEmptyOrNull(Object[] arr) { - return arr == null || arr.length == 0; - } - - public static boolean isArrayOfLength(Object[] arr, int expectedLength) { - return arr != null && arr.length == expectedLength; - } - - @SafeVarargs - public static Collection concat(Collection... colls) { - return concat(Arrays.asList(colls)); - } - - public static Collection concat(Collection> colls) { - return new ConcatCollection<>(colls); - } - - private static class ConcatCollection extends AbstractCollection { - - private final Collection> colls; - private final int size; - - public ConcatCollection(Collection> lists) { - Collection> colls1 = null; - for (Collection list : lists) { - if (list == null || list.isEmpty()) { - colls1 = lists.stream() - .filter(c -> c != null && !c.isEmpty()) - .collect(Collectors.toList()); - break; - } - } - if (colls1 == null) colls1 = lists; - colls = colls1; - int sum = 0; - for (Collection list : colls) { - sum += list.size(); - } - size = sum; - } - - @Nonnull - @Override - public Iterator iterator() { - return colls.stream() - .flatMap(Collection::stream) - .iterator(); - } - - @Override - public int size() { - return size; - } - } - - @AutoValue - public abstract static class ItemId { - - public static ItemId create(NBTTagCompound tag) { - return new AutoValue_GT_Utility_ItemId( - Item.getItemById(tag.getShort("item")), - tag.getShort("meta"), - tag.hasKey("tag", Constants.NBT.TAG_COMPOUND) ? tag.getCompoundTag("tag") : null); - } - - /** - * This method copies NBT, as it is mutable. - */ - public static ItemId create(ItemStack itemStack) { - NBTTagCompound nbt = itemStack.getTagCompound(); - if (nbt != null) { - nbt = (NBTTagCompound) nbt.copy(); - } - - return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), nbt); - } - - /** - * This method copies NBT, as it is mutable. - */ - public static ItemId create(Item item, int metaData, @Nullable NBTTagCompound nbt) { - if (nbt != null) { - nbt = (NBTTagCompound) nbt.copy(); - } - return new AutoValue_GT_Utility_ItemId(item, metaData, nbt); - } - - /** - * This method stores metadata as wildcard and NBT as null. - */ - public static ItemId createAsWildcard(ItemStack itemStack) { - return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), W, null); - } - - /** - * This method stores NBT as null. - */ - public static ItemId createWithoutNBT(ItemStack itemStack) { - return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), null); - } - - /** - * This method does not copy NBT in order to save time. Make sure not to mutate it! - */ - public static ItemId createNoCopy(ItemStack itemStack) { - return new AutoValue_GT_Utility_ItemId( - itemStack.getItem(), - Items.feather.getDamage(itemStack), - itemStack.getTagCompound()); - } - - /** - * This method does not copy NBT in order to save time. Make sure not to mutate it! - */ - public static ItemId createNoCopy(Item item, int metaData, @Nullable NBTTagCompound nbt) { - return new AutoValue_GT_Utility_ItemId(item, metaData, nbt); - } - - protected abstract Item item(); - - protected abstract int metaData(); - - @Nullable - protected abstract NBTTagCompound nbt(); - - public NBTTagCompound writeToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setShort("item", (short) Item.getIdFromItem(item())); - tag.setShort("meta", (short) metaData()); - if (nbt() != null) tag.setTag("tag", nbt()); - return tag; - } - - @Nonnull - public ItemStack getItemStack() { - ItemStack itemStack = new ItemStack(item(), 1, metaData()); - itemStack.setTagCompound(nbt()); - return itemStack; - } - } - - public static int getPlasmaFuelValueInEUPerLiterFromMaterial(Materials material) { - return getPlasmaFuelValueInEUPerLiterFromFluid(material.getPlasma(1)); - } - - public static int getPlasmaFuelValueInEUPerLiterFromFluid(FluidStack aLiquid) { - if (aLiquid == null) return 0; - GT_Recipe tFuel = RecipeMaps.plasmaFuels.getBackend() - .findFuel(aLiquid); - if (tFuel != null) return tFuel.mSpecialValue; - return 0; - } - - public static MovingObjectPosition getPlayerLookingTarget(EntityPlayer viewpoint) { - double reachDistance = viewpoint instanceof EntityPlayerMP mp ? mp.theItemInWorldManager.getBlockReachDistance() - : getClientReachDistance(); - Vec3 posVec = Vec3.createVectorHelper( - viewpoint.posX, - viewpoint.posY + (viewpoint.getEyeHeight() - viewpoint.getDefaultEyeHeight()), - viewpoint.posZ); - Vec3 lookVec = viewpoint.getLook(0); - Vec3 modifiedPosVec = posVec - .addVector(lookVec.xCoord * reachDistance, lookVec.yCoord * reachDistance, lookVec.zCoord * reachDistance); - - return viewpoint.worldObj.rayTraceBlocks(posVec, modifiedPosVec); - } - - public static float getClientReachDistance() { - return Minecraft.getMinecraft().playerController.getBlockReachDistance(); - } -} diff --git a/src/main/java/gregtech/api/util/GT_UtilityClient.java b/src/main/java/gregtech/api/util/GT_UtilityClient.java deleted file mode 100644 index 398c1f6b41..0000000000 --- a/src/main/java/gregtech/api/util/GT_UtilityClient.java +++ /dev/null @@ -1,52 +0,0 @@ -package gregtech.api.util; - -import java.lang.reflect.Field; -import java.util.List; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; - -import com.google.common.collect.Lists; - -import cpw.mods.fml.relauncher.ReflectionHelper; - -public class GT_UtilityClient { - - private static final Field isDrawingField = ReflectionHelper - .findField(Tessellator.class, "isDrawing", "field_78415_z"); - - public static boolean isDrawing(Tessellator tess) { - try { - return isDrawingField.getBoolean(tess); - } catch (IllegalAccessException e) { - e.printStackTrace(); - return false; - } - } - - public static List getTooltip(ItemStack aStack, boolean aGuiStyle) { - try { - List tooltip = aStack.getTooltip( - Minecraft.getMinecraft().thePlayer, - Minecraft.getMinecraft().gameSettings.advancedItemTooltips); - if (aGuiStyle) { - tooltip.set( - 0, - (aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor + tooltip.get(0)); - for (int i = 1; i < tooltip.size(); i++) { - tooltip.set(i, EnumChatFormatting.GRAY + tooltip.get(i)); - } - } - return tooltip; - } catch (RuntimeException e) { - // Collections.singletonList() can not be added to. we don't want that - if (aGuiStyle) return Lists.newArrayList( - (aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor - + aStack.getDisplayName()); - return Lists.newArrayList(aStack.getDisplayName()); - } - } -} diff --git a/src/main/java/gregtech/api/util/GT_Waila.java b/src/main/java/gregtech/api/util/GT_Waila.java deleted file mode 100644 index aaa68ba4c7..0000000000 --- a/src/main/java/gregtech/api/util/GT_Waila.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.api.util; - -public abstract class GT_Waila { - - public static String getMachineProgressString(boolean isActive, int maxProgresstime, int progresstime) { - return getMachineProgressString(isActive, (long) maxProgresstime, (long) progresstime); - } - - public static String getMachineProgressString(boolean isActive, long maxProgresstime, long progresstime) { - - if (!isActive) return "Idle"; - - StringBuilder ret = new StringBuilder("In progress: ") - .append(String.format("%,.2f", (double) progresstime / 20)) - .append("s / ") - .append(String.format("%,.2f", (double) maxProgresstime / 20)) - .append("s (") - .append(GT_Utility.formatNumbers((Math.round((double) progresstime / maxProgresstime * 1000) / 10.0))) - .append("%)"); - - return ret.toString(); - } -} diff --git a/src/main/java/gregtech/api/util/HatchElementBuilder.java b/src/main/java/gregtech/api/util/HatchElementBuilder.java new file mode 100644 index 0000000000..8b93861114 --- /dev/null +++ b/src/main/java/gregtech/api/util/HatchElementBuilder.java @@ -0,0 +1,546 @@ +package gregtech.api.util; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.constructable.ChannelDataAccessor; +import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.structure.IStructureElementChain; +import com.gtnewhorizon.structurelib.structure.IStructureElementNoPlacement; +import com.gtnewhorizon.structurelib.util.ItemStackPredicate; + +import gnu.trove.TIntCollection; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.set.hash.TIntHashSet; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.common.blocks.ItemMachines; + +public class HatchElementBuilder { + + private interface Builtin { + } + + private IGTHatchAdder mAdder; + private int mCasingIndex = -1; + private int mDot = -1; + private BiPredicate mShouldSkip; + private BiFunction> mHatchItemFilter; + private Supplier mHatchItemType; + private Predicate mReject; + private boolean mCacheHint; + private boolean mNoStop; + private boolean mExclusive; + private EnumSet mDisallowedDirection = EnumSet.noneOf(ForgeDirection.class); + + private HatchElementBuilder() {} + + public static HatchElementBuilder builder() { + return new HatchElementBuilder<>(); + } + + // region composite + + /** + * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. TODO add doc + */ + @SafeVarargs + public final HatchElementBuilder anyOf(IHatchElement... elements) { + if (elements == null || elements.length == 0) throw new IllegalArgumentException(); + return adder( + Arrays.stream(elements) + .map( + e -> e.adder() + .rebrand()) + .reduce(IGTHatchAdder::orElse) + .get()).hatchClasses( + Arrays.stream(elements) + .map(IHatchElement::mteClasses) + .flatMap(Collection::stream) + .collect(Collectors.toList())) + .cacheHint( + () -> Arrays.stream(elements) + .map(IHatchElement::name) + .sorted() + .collect(Collectors.joining(" or ", "of type ", ""))); + } + + /** + * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. + *

+ * Will rotate through all elements TODO add doc + */ + @SafeVarargs + public final HatchElementBuilder atLeast(IHatchElement... elements) { + if (elements == null || elements.length == 0) throw new IllegalArgumentException(); + return atLeast( + Arrays.stream(elements) + .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))); + } + + /** + * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. + *

+ * Will rotate through all elements TODO add doc + */ + public final HatchElementBuilder atLeastList(List> elements) { + if (elements == null || elements.isEmpty()) throw new IllegalArgumentException(); + return atLeast( + elements.stream() + .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))); + } + + /** + * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. TODO add doc + */ + public final HatchElementBuilder atLeast(Map, ? extends Number> elements) { + if (elements == null || elements.isEmpty() || elements.containsKey(null) || elements.containsValue(null)) + throw new IllegalArgumentException(); + List> list = elements.keySet() + .stream() + .map(IHatchElement::mteClasses) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + // map cannot be null or empty, so assert Optional isPresent + return adder( + elements.keySet() + .stream() + .map( + e -> e.adder() + .rebrand()) + .reduce(IGTHatchAdder::orElse) + .orElseThrow(AssertionError::new)) + .hatchItemFilter( + obj -> GTStructureUtility.filterByMTEClass( + elements.entrySet() + .stream() + .filter( + entry -> entry.getKey() + .count(obj) + < entry.getValue() + .longValue()) + .flatMap( + entry -> entry.getKey() + .mteClasses() + .stream()) + .collect(Collectors.toList()))) + .shouldReject( + obj -> elements.entrySet() + .stream() + .allMatch( + e -> e.getKey() + .count(obj) + >= e.getValue() + .longValue())) + .shouldSkip( + (BiPredicate & Builtin) (c, + t) -> t != null && list.stream() + .anyMatch(clazz -> clazz.isInstance(t.getMetaTileEntity()))) + .cacheHint( + () -> elements.keySet() + .stream() + .map(IHatchElement::name) + .sorted() + .collect(Collectors.joining(" or ", "of type ", ""))); + } + // endregion + + // region primitives + + /** + * Mark this hatch element as the only candidate of given structure element. (e.g. muffler hatch on top of EBF) + * Currently, this will make the built IStructureElement to ignore gt_no_hatch directive from player + * + * Do note that {@link #buildAndChain(IStructureElement[])} and its overloads will force the resulting structure + * element + * to be non-exclusive. + */ + public HatchElementBuilder exclusive() { + mExclusive = true; + return this; + } + + public HatchElementBuilder adder(IGTHatchAdder aAdder) { + if (aAdder == null) throw new IllegalArgumentException(); + mAdder = aAdder; + return this; + } + + public HatchElementBuilder casingIndex(int aCasingIndex) { + if (aCasingIndex <= 0) throw new IllegalArgumentException(); + mCasingIndex = aCasingIndex; + return this; + } + + public HatchElementBuilder dot(int aDot) { + if (aDot <= 0) throw new IllegalArgumentException(); + mDot = aDot; + return this; + } + + public HatchElementBuilder shouldSkip(BiPredicate aShouldSkip) { + if (!(aShouldSkip instanceof Builtin) || mShouldSkip != null) { + if (!(mShouldSkip instanceof Builtin) && mShouldSkip != null) throw new IllegalStateException(); + if (aShouldSkip == null) throw new IllegalArgumentException(); + } + mShouldSkip = aShouldSkip; + return this; + } + + public HatchElementBuilder shouldReject(Predicate aShouldReject) { + if (aShouldReject == null) throw new IllegalArgumentException(); + mReject = aShouldReject; + return this; + } + + public HatchElementBuilder hatchItemFilter( + Function> aHatchItemFilter) { + if (aHatchItemFilter == null) throw new IllegalArgumentException(); + mHatchItemFilter = (t, s) -> aHatchItemFilter.apply(t); + return this; + } + + public HatchElementBuilder hatchItemFilterAnd( + Function> aHatchItemFilter) { + if (aHatchItemFilter == null) throw new IllegalArgumentException(); + BiFunction> tOldFilter = mHatchItemFilter; + mHatchItemFilter = (t, s) -> tOldFilter.apply(t, s) + .and(aHatchItemFilter.apply(t)); + return this; + } + + public HatchElementBuilder hatchItemFilter( + BiFunction> aHatchItemFilter) { + if (aHatchItemFilter == null) throw new IllegalArgumentException(); + mHatchItemFilter = aHatchItemFilter; + return this; + } + + public HatchElementBuilder hatchItemFilterAnd( + BiFunction> aHatchItemFilter) { + if (aHatchItemFilter == null) throw new IllegalArgumentException(); + BiFunction> tOldFilter = mHatchItemFilter; + mHatchItemFilter = (t, s) -> tOldFilter.apply(t, s) + .and(aHatchItemFilter.apply(t, s)); + return this; + } + + // region hint + public HatchElementBuilder hint(Supplier aSupplier) { + if (aSupplier == null) throw new IllegalArgumentException(); + mHatchItemType = aSupplier; + mCacheHint = false; + return this; + } + + public HatchElementBuilder cacheHint(Supplier aSupplier) { + if (aSupplier == null) throw new IllegalArgumentException(); + mHatchItemType = aSupplier; + mCacheHint = true; + return this; + } + + public HatchElementBuilder cacheHint() { + if (mHatchItemType == null) throw new IllegalStateException(); + mCacheHint = true; + return this; + } + // endregion + + public HatchElementBuilder continueIfSuccess() { + mNoStop = true; + return this; + } + + public HatchElementBuilder stopIfSuccess() { + mNoStop = false; + return this; + } + + /** + * Help automatic hatch side determination code by ruling out some directions. Note the automatic hatch side + * determination code will choose to use the default facing if the final allowed facing set is empty. + *

+ * This will clear the sides set by previous call to this or {@link #allowOnly(ForgeDirection...)} + *

+ * Usually mandatory for multis with multiple slices, and otherwise not needed if it contains a single slice only. + * + * @param facings disallowed direction in ABC coordinate system + */ + public HatchElementBuilder disallowOnly(ForgeDirection... facings) { + if (facings == null) throw new IllegalArgumentException(); + mDisallowedDirection = EnumSet.copyOf(Arrays.asList(facings)); + return this; + } + + /** + * Help automatic hatch side determination code by allowing only some directions. Note the automatic hatch side + * determination code will choose to use the default facing if the final allowed facing set is empty. + *

+ * This will clear the sides set by previous call to this or {@link #disallowOnly(ForgeDirection...)} + *

+ * Usually mandatory for multis with multiple slices, and otherwise not needed if it contains a single slice only. + * + * @param facings allowed direction in ABC coordinate system + */ + public HatchElementBuilder allowOnly(ForgeDirection... facings) { + if (facings == null) throw new IllegalArgumentException(); + mDisallowedDirection = EnumSet.complementOf(EnumSet.copyOf(Arrays.asList(facings))); + mDisallowedDirection.remove(ForgeDirection.UNKNOWN); + return this; + } + // endregion + + // region intermediate + public HatchElementBuilder hatchClass(Class clazz) { + return hatchItemFilter(c -> is -> clazz.isInstance(ItemMachines.getMetaTileEntity(is))) + .cacheHint(() -> "of class " + clazz.getSimpleName()) + .shouldSkip( + (BiPredicate & Builtin) (c, t) -> clazz + .isInstance(t.getMetaTileEntity())); + } + + @SafeVarargs + public final HatchElementBuilder hatchClasses(Class... classes) { + return hatchClasses(Arrays.asList(classes)); + } + + public final HatchElementBuilder hatchClasses(List> classes) { + List> list = new ArrayList<>(classes); + return hatchItemFilter(obj -> GTStructureUtility.filterByMTEClass(list)).cacheHint( + () -> list.stream() + .map(Class::getSimpleName) + .sorted() + .collect(Collectors.joining(" or ", "of class ", ""))) + .shouldSkip( + (BiPredicate & Builtin) (c, t) -> t != null && list.stream() + .anyMatch(clazz -> clazz.isInstance(t.getMetaTileEntity()))); + } + + public HatchElementBuilder hatchId(int aId) { + return hatchItemFilter( + c -> is -> GTUtility.isStackValid(is) && is.getItem() instanceof ItemMachines && is.getItemDamage() == aId) + .cacheHint(() -> "of id " + aId) + .shouldSkip( + (BiPredicate & Builtin) (c, t) -> t != null + && t.getMetaTileID() == aId); + } + + public HatchElementBuilder hatchIds(int... aIds) { + if (aIds == null || aIds.length == 0) throw new IllegalArgumentException(); + if (aIds.length == 1) return hatchId(aIds[0]); + TIntCollection coll = aIds.length < 16 ? new TIntArrayList(aIds) : new TIntHashSet(aIds); + return hatchItemFilter( + c -> is -> GTUtility.isStackValid(is) && is.getItem() instanceof ItemMachines + && coll.contains(is.getItemDamage())).cacheHint( + () -> Arrays.stream(coll.toArray()) + .sorted() + .mapToObj(String::valueOf) + .collect(Collectors.joining(" or ", "of id ", ""))) + .shouldSkip( + (BiPredicate & Builtin) (c, t) -> t != null + && coll.contains(t.getMetaTileID())); + } + + // endregion + + @SuppressWarnings("unchecked") + @SafeVarargs + public final IStructureElementChain buildAndChain(IStructureElement... elements) { + // just in case + mExclusive = false; + List> l = new ArrayList<>(); + l.add(build()); + l.addAll(Arrays.asList(elements)); + IStructureElement[] array = l.toArray(new IStructureElement[0]); + return () -> array; + } + + public final IStructureElementChain buildAndChain(Block block, int meta) { + return buildAndChain(ofBlock(block, meta)); + } + + public IStructureElement build() { + if (mAdder == null || mCasingIndex == -1 || mDot == -1) { + throw new IllegalArgumentException(); + } + if (mHatchItemFilter == null) { + // no item filter -> no placement + return new IStructureElementNoPlacement<>() { + + @Override + public boolean check(T t, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity + && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1); + return true; + } + }; + } + return new IStructureElement<>() { + + private String mHint = mHatchItemType == null ? "unspecified GT hatch" : mHatchItemType.get(); + + @Override + public boolean check(T t, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity + && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1); + return true; + } + + @Override + public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) { + // TODO + return false; + } + + private String getHint() { + if (mHint != null) return mHint; + String tHint = mHatchItemType.get(); + if (tHint == null) return "?"; + // TODO move this to some .lang instead of half ass it into the crappy gt lang file + tHint = GTLanguageManager.addStringLocalization("Hatch_Type_" + tHint.replace(' ', '_'), tHint); + if (mCacheHint) { + mHint = tHint; + if (mHint != null) + // yeet the getter, since its product is retrieved and cached + mHatchItemType = null; + } + return tHint; + } + + @Override + public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + return BlocksToPlace.create(mHatchItemFilter.apply(t, trigger)); + } + + @Deprecated + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + IItemSource s, EntityPlayerMP actor, Consumer chatter) { + return survivalPlaceBlock( + t, + world, + x, + y, + z, + trigger, + AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); + } + + @Override + public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, + AutoPlaceEnvironment env) { + if (mShouldSkip != null) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IGregTechTileEntity + && mShouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return PlaceResult.SKIP; + } + if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) + return PlaceResult.REJECT; + if (mReject != null && mReject.test(t)) return PlaceResult.REJECT; + if (ChannelDataAccessor.hasSubChannel(trigger, "gt_no_hatch") && !mExclusive) { + String type = getHint(); + env.getChatter() + .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_hatch", type)); + return PlaceResult.REJECT; + } + ItemStack taken = env.getSource() + .takeOne(mHatchItemFilter.apply(t, trigger), true); + if (GTUtility.isStackInvalid(taken)) { + String type = getHint(); + env.getChatter() + .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_hatch", type)); + return PlaceResult.REJECT; + } + if (com.gtnewhorizon.structurelib.structure.StructureUtility.survivalPlaceBlock( + taken, + ItemStackPredicate.NBTMode.IGNORE, + null, + true, + world, + x, + y, + z, + env.getSource(), + env.getActor()) != PlaceResult.ACCEPT) { + return PlaceResult.REJECT; + } + // try to infer facing + EnumSet allowed = EnumSet.noneOf(ForgeDirection.class); + // first find which face of block is not contained in structure + if (env.getAPILevel() == AutoPlaceEnvironment.APILevel.Legacy) { + // a legacy decorator isn't passing down necessary information + // in that case, we just assume all facing is allowed + allowed.addAll(Arrays.asList(ForgeDirection.VALID_DIRECTIONS)); + } else { + for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { + // as noted on getWorldDirection Y axis should be flipped before use + if (env.isContainedInPiece(direction.offsetX, -direction.offsetY, direction.offsetZ)) continue; + // explicitly rejected, probably obstructed by another slice + if (mDisallowedDirection.contains(direction)) continue; + ForgeDirection rotated = env.getFacing() + .getWorldDirection( + (direction.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0 + ? direction.getOpposite() + : direction); + allowed.add(rotated); + } + } + if (!allowed.isEmpty()) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IGregTechTileEntity) { + ForgeDirection result = null; + // find the first facing available, but prefer a facing that isn't up/down + for (ForgeDirection facing : allowed) { + result = facing; + if ((facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) break; // Horizontal + } + assert result != null; + ((IGregTechTileEntity) tileEntity).setFrontFacing(result); + } + } + return mNoStop ? PlaceResult.ACCEPT : PlaceResult.ACCEPT_STOP; + } + }; + } +} diff --git a/src/main/java/gregtech/api/util/IGTHatchAdder.java b/src/main/java/gregtech/api/util/IGTHatchAdder.java new file mode 100644 index 0000000000..35a30ad7de --- /dev/null +++ b/src/main/java/gregtech/api/util/IGTHatchAdder.java @@ -0,0 +1,28 @@ +package gregtech.api.util; + +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public interface IGTHatchAdder { + + /** + * Callback to add hatch, needs to check if hatch is valid (and add it) + * + * @param iGregTechTileEntity hatch + * @param aShort requested texture index, or null if not... + * @return managed to add hatch (structure still valid) + */ + boolean apply(T t, IGregTechTileEntity iGregTechTileEntity, Short aShort); + + /** + * hack to work around java generic issues. + */ + @SuppressWarnings("unchecked") + default IGTHatchAdder rebrand() { + return (IGTHatchAdder) this; + } + + default IGTHatchAdder orElse(IGTHatchAdder fallback) { + return (t, iGregTechTileEntity, aShort) -> IGTHatchAdder.this.apply(t, iGregTechTileEntity, aShort) + || fallback.apply(t, iGregTechTileEntity, aShort); + } +} diff --git a/src/main/java/gregtech/api/util/IGT_HatchAdder.java b/src/main/java/gregtech/api/util/IGT_HatchAdder.java deleted file mode 100644 index 21796f172e..0000000000 --- a/src/main/java/gregtech/api/util/IGT_HatchAdder.java +++ /dev/null @@ -1,28 +0,0 @@ -package gregtech.api.util; - -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public interface IGT_HatchAdder { - - /** - * Callback to add hatch, needs to check if hatch is valid (and add it) - * - * @param iGregTechTileEntity hatch - * @param aShort requested texture index, or null if not... - * @return managed to add hatch (structure still valid) - */ - boolean apply(T t, IGregTechTileEntity iGregTechTileEntity, Short aShort); - - /** - * hack to work around java generic issues. - */ - @SuppressWarnings("unchecked") - default IGT_HatchAdder rebrand() { - return (IGT_HatchAdder) this; - } - - default IGT_HatchAdder orElse(IGT_HatchAdder fallback) { - return (t, iGregTechTileEntity, aShort) -> IGT_HatchAdder.this.apply(t, iGregTechTileEntity, aShort) - || fallback.apply(t, iGregTechTileEntity, aShort); - } -} diff --git a/src/main/java/gregtech/api/util/JubilanceMegaApiary.java b/src/main/java/gregtech/api/util/JubilanceMegaApiary.java new file mode 100644 index 0000000000..e24cad6778 --- /dev/null +++ b/src/main/java/gregtech/api/util/JubilanceMegaApiary.java @@ -0,0 +1,23 @@ +package gregtech.api.util; + +import forestry.api.apiculture.IAlleleBeeSpecies; +import forestry.api.apiculture.IBeeGenome; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IJubilanceProvider; + +public class JubilanceMegaApiary implements IJubilanceProvider { + + public static final JubilanceMegaApiary instance = new JubilanceMegaApiary(); + + protected JubilanceMegaApiary() {} + + @Override + public boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing) { + return false; + } + + @Override + public String getDescription() { + return "Will only be produced in mega Apiary"; + } +} diff --git a/src/main/java/gregtech/api/util/MultiblockTooltipBuilder.java b/src/main/java/gregtech/api/util/MultiblockTooltipBuilder.java new file mode 100644 index 0000000000..e51f3a0524 --- /dev/null +++ b/src/main/java/gregtech/api/util/MultiblockTooltipBuilder.java @@ -0,0 +1,735 @@ +package gregtech.api.util; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; + +import com.google.common.collect.Multimaps; +import com.google.common.collect.SetMultimap; +import com.gtnewhorizon.structurelib.StructureLibAPI; + +/** + * This makes it easier to build multi tooltips, with a standardized format.
+ * Info section order should be:
+ * addMachineType
+ * addInfo, for what it does, special notes, etc.
+ * addSeparator, if you need it
+ * addPollutionAmount
+ *
+ * Structure order should be:
+ * beginStructureBlock
+ * addController
+ * addCasingInfo
+ * addOtherStructurePart, for secondary structure block info (pipes, coils, etc)
+ * addEnergyHatch/addDynamoHatch
+ * addMaintenanceHatch
+ * addMufflerHatch
+ * addInputBus/addInputHatch/addOutputBus/addOutputHatch, in that order
+ * Use addStructureInfo for any comments on nonstandard structure info wherever needed
+ * toolTipFinisher goes at the very end
+ *
+ * Originally created by kekzdealer + */ +public class MultiblockTooltipBuilder { + + private static final String TAB = " "; + private static final String COLON = ": "; + private static final String SEPARATOR = ", "; + + private final List iLines; + private final List sLines; + private final List hLines; + private final SetMultimap hBlocks; + + private String[] iArray; + private String[] sArray; + private String[] hArray; + + // Localized tooltips + private static final String TT_machineType = StatCollector.translateToLocal("GT5U.MBTT.MachineType"); + private static final String TT_dimensions = StatCollector.translateToLocal("GT5U.MBTT.Dimensions"); + private static final String TT_hollow = StatCollector.translateToLocal("GT5U.MBTT.Hollow"); + private static final String TT_structure = StatCollector.translateToLocal("GT5U.MBTT.Structure"); + private static final String TT_controller = StatCollector.translateToLocal("GT5U.MBTT.Controller"); + private static final String TT_minimum = StatCollector.translateToLocal("GT5U.MBTT.Minimum"); + private static final String TT_tiered = StatCollector.translateToLocal("GT5U.MBTT.Tiered"); + private static final String TT_maintenancehatch = StatCollector.translateToLocal("GT5U.MBTT.MaintenanceHatch"); + private static final String TT_energyhatch = StatCollector.translateToLocal("GT5U.MBTT.EnergyHatch"); + private static final String TT_dynamohatch = StatCollector.translateToLocal("GT5U.MBTT.DynamoHatch"); + private static final String TT_mufflerhatch = StatCollector.translateToLocal("GT5U.MBTT.MufflerHatch"); + private static final String TT_inputbus = StatCollector.translateToLocal("GT5U.MBTT.InputBus"); + private static final String TT_inputhatch = StatCollector.translateToLocal("GT5U.MBTT.InputHatch"); + private static final String TT_outputbus = StatCollector.translateToLocal("GT5U.MBTT.OutputBus"); + private static final String TT_outputhatch = StatCollector.translateToLocal("GT5U.MBTT.OutputHatch"); + private static final String TT_causes = StatCollector.translateToLocal("GT5U.MBTT.Causes"); + private static final String TT_pps = StatCollector.translateToLocal("GT5U.MBTT.PPS"); + private static final String TT_hold = StatCollector.translateToLocal("GT5U.MBTT.Hold"); + private static final String TT_todisplay = StatCollector.translateToLocal("GT5U.MBTT.Display"); + private static final String TT_structurehint = StatCollector.translateToLocal("GT5U.MBTT.StructureHint"); + private static final String TT_mod = StatCollector.translateToLocal("GT5U.MBTT.Mod"); + private static final String TT_air = StatCollector.translateToLocal("GT5U.MBTT.Air"); + private static final String[] TT_dots = IntStream.range(0, 16) + .mapToObj(i -> StatCollector.translateToLocal("structurelib.blockhint." + i + ".name")) + .toArray(String[]::new); + + public MultiblockTooltipBuilder() { + iLines = new LinkedList<>(); + sLines = new LinkedList<>(); + hLines = new LinkedList<>(); + hBlocks = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); + hBlocks.put(StructureLibAPI.HINT_BLOCK_META_AIR, TT_air); + } + + /** + * Add a line telling you what the machine type is. Usually, this will be the name of a SB version.
+ * Machine Type: machine + * + * @param machine Name of the machine type + * + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addMachineType(String machine) { + iLines.add(TT_machineType + COLON + EnumChatFormatting.YELLOW + machine + EnumChatFormatting.RESET); + return this; + } + + /** + * Add a basic line of information about this structure + * + * @param info The line to be added. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addInfo(String info) { + iLines.add(info); + return this; + } + + /** + * Add a number of basic lines of information about this structure + * + * @param infoStrings The lines to be added. + * @return Instance this method was called on. + */ + + public MultiblockTooltipBuilder addInfoAll(String... infoStrings) { + for (String str : infoStrings) { + iLines.add(str); + } + return this; + } + + /** + * Add a separator line like this:
+ * ----------------------------------------- + * + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addSeparator() { + iLines.add("-----------------------------------------"); + return this; + } + + /** + * Add a line telling how much this machine pollutes. + * + * @param pollution Amount of pollution per second when active + * + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addPollutionAmount(int pollution) { + iLines.add( + TT_causes + COLON + EnumChatFormatting.DARK_PURPLE + pollution + " " + EnumChatFormatting.GRAY + TT_pps); + return this; + } + + /** + * Begin adding structural information by adding a line about the structure's dimensions and then inserting a + * "Structure:" line. + * + * @param w Structure width. + * @param h Structure height. + * @param l Structure depth/length. + * @param hollow T/F, adds a (hollow) comment if true + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder beginStructureBlock(int w, int h, int l, boolean hollow) { + sLines.add( + EnumChatFormatting.WHITE + TT_dimensions + + COLON + + EnumChatFormatting.GOLD + + w + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + h + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + l + + EnumChatFormatting.GRAY + + " (" + + EnumChatFormatting.GOLD + + "W" + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + "H" + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + "L" + + EnumChatFormatting.GRAY + + ") " + + EnumChatFormatting.RED + + (hollow ? EnumChatFormatting.RED + TT_hollow : "")); + sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON); + return this; + } + + /** + * Begin adding structural information by adding a line about the structure's dimensions
+ * and then inserting a "Structure:" line. Variable version displays min and max + * + * @param wmin Structure min width. + * @param wmax Structure max width. + * @param hmin Structure min height. + * @param hmax Structure max height. + * @param lmin Structure min depth/length. + * @param lmax Structure max depth/length. + * @param hollow T/F, adds a (hollow) comment if true + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder beginVariableStructureBlock(int wmin, int wmax, int hmin, int hmax, int lmin, + int lmax, boolean hollow) { + sLines.add( + EnumChatFormatting.WHITE + TT_dimensions + + COLON + + EnumChatFormatting.GOLD + + wmin + + (wmin != wmax ? "-" + wmax : "") + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + hmin + + (hmin != hmax ? "-" + hmax : "") + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + lmin + + (lmin != lmax ? "-" + lmax : "") + + EnumChatFormatting.GRAY + + " (" + + EnumChatFormatting.GOLD + + "W" + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + "H" + + EnumChatFormatting.GRAY + + "x" + + EnumChatFormatting.GOLD + + "L" + + EnumChatFormatting.GRAY + + ") " + + (hollow ? EnumChatFormatting.RED + TT_hollow : "")); + sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Controller: info + * + * @param info Positional information. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addController(String info) { + sLines.add(TAB + EnumChatFormatting.WHITE + TT_controller + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)minCountx casingName (minimum) (tiered) + * + * @param casingName Name of the Casing. + * @param minCount Minimum needed for valid structure check. + * @return Instance this method was called on. + * + * @deprecated Replaced by {@link #addCasingInfoMin(String, int, boolean)} + * + */ + @Deprecated + public MultiblockTooltipBuilder addCasingInfo(String casingName, int minCount) { + return addCasingInfoMin(casingName, minCount, false); + } + + /** + * Add a line of information about the structure:
+ * (indent)countx casingName (tiered) + * + * @param casingName Name of the Casing. + * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addCasingInfoExactly(String casingName, int count, boolean isTiered) { + return addCasingInfoExactlyColored( + casingName, + EnumChatFormatting.GRAY, + count, + EnumChatFormatting.GOLD, + isTiered); + } + + /** + * Add a line of information about the structure:
+ * (indent)countx casingName (tiered) + * + * @param casingName Name of the Casing. + * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) + * @param countColor Color of the casing count text + * @param textColor Color of the casing name text + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addCasingInfoExactlyColored(String casingName, EnumChatFormatting textColor, + int count, EnumChatFormatting countColor, boolean isTiered) { + sLines.add( + countColor + TAB + + count + + "x " + + EnumChatFormatting.RESET + + textColor + + casingName + + (isTiered ? " " + TT_tiered : "")); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)minCountx casingName (minimum) (tiered) + * + * @param casingName Name of the Casing. + * @param minCount Minimum needed for valid structure check. + * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addCasingInfoMin(String casingName, int minCount, boolean isTiered) { + return addCasingInfoMinColored( + casingName, + EnumChatFormatting.GRAY, + minCount, + EnumChatFormatting.GOLD, + isTiered); + } + + /** + * Add a line of information about the structure:
+ * (indent)minCountx casingName (minimum) (tiered) + * + * @param casingName Name of the Casing. + * @param minCount Minimum needed for valid structure check. + * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) + * @param countColor Color of the casing count text + * @param textColor Color of the casing name text + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addCasingInfoMinColored(String casingName, EnumChatFormatting textColor, + int minCount, EnumChatFormatting countColor, boolean isTiered) { + sLines.add( + countColor + TAB + + minCount + + "x " + + EnumChatFormatting.RESET + + textColor + + casingName + + " " + + TT_minimum + + (isTiered ? " " + TT_tiered : "")); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)minCountx - maxCountx casingName (minimum) (tiered) + * + * @param casingName Name of the Casing. + * @param minCount Minimum needed for valid structure check. + * @param maxCount Maximum needed for valid structure check. + * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addCasingInfoRange(String casingName, int minCount, int maxCount, + boolean isTiered) { + return addCasingInfoRangeColored( + casingName, + EnumChatFormatting.GRAY, + minCount, + maxCount, + EnumChatFormatting.GOLD, + isTiered); + } + + /** + * Add a line of information about the structure:
+ * (indent)minCountx - maxCountx casingName (minimum) (tiered) + * + * @param casingName Name of the Casing. + * @param minCount Minimum needed for valid structure check. + * @param maxCount Maximum needed for valid structure check. + * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils) + * @param countColor Color of the casing count text + * @param textColor Color of the casing name text + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addCasingInfoRangeColored(String casingName, EnumChatFormatting textColor, + int minCount, int maxCount, EnumChatFormatting countColor, boolean isTiered) { + sLines.add( + countColor + TAB + + minCount + + "x" + + EnumChatFormatting.GRAY + + " - " + + countColor + + maxCount + + "x " + + EnumChatFormatting.RESET + + textColor + + casingName + + (isTiered ? " " + TT_tiered : "")); + return this; + } + + /** + * Use this method to add a structural part that isn't covered by the other methods.
+ * (indent)name: info + * + * @param name Name of the hatch or other component. + * @param info Positional information. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addOtherStructurePart(String name, String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Maintenance Hatch: info + * + * @param info Positional information. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addMaintenanceHatch(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Muffler Hatch: info + * + * @param info Location where the hatch goes + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addMufflerHatch(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Energy Hatch: info + * + * @param info Positional information. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addEnergyHatch(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Dynamo Hatch: info + * + * @param info Positional information. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addDynamoHatch(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Input Bus: info + * + * @param info Location where the bus goes + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addInputBus(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Input Hatch: info + * + * @param info Location where the hatch goes + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addInputHatch(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Output Bus: info + * + * @param info Location where the bus goes + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addOutputBus(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Output Hatch: info + * + * @param info Location where the bus goes + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addOutputHatch(String info) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info); + return this; + } + + /** + * Use this method to add a structural part that isn't covered by the other methods.
+ * (indent)name: info + * + * @param name Name of the hatch or other component. + * @param info Positional information. + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addOtherStructurePart(String name, String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, name); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Maintenance Hatch: info + * + * @param info Positional information. + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addMaintenanceHatch(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_maintenancehatch); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Muffler Hatch: info + * + * @param info Location where the hatch goes + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addMufflerHatch(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_mufflerhatch); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Energy Hatch: info + * + * @param info Positional information. + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addEnergyHatch(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_energyhatch); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Dynamo Hatch: info + * + * @param info Positional information. + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addDynamoHatch(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_dynamohatch); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Input Bus: info + * + * @param info Location where the bus goes + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addInputBus(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_inputbus); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Input Hatch: info + * + * @param info Location where the hatch goes + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addInputHatch(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_inputhatch); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Output Bus: info + * + * @param info Location where the bus goes + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addOutputBus(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_outputbus); + return this; + } + + /** + * Add a line of information about the structure:
+ * (indent)Output Hatch: info + * + * @param info Location where the bus goes + * @param dots The valid locations for this part when asked to display hints + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addOutputHatch(String info, int... dots) { + sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info); + for (int dot : dots) hBlocks.put(dot, TT_outputhatch); + return this; + } + + /** + * Use this method to add non-standard structural info.
+ * (indent)info + * + * @param info The line to be added. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addStructureInfo(String info) { + sLines.add(TAB + info); + return this; + } + + /** + * Use this method to add non-standard structural info.
+ * (indent)info + * + * @param channel the name of subchannel + * @param purpose the purpose of subchannel + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addSubChannelUsage(String channel, String purpose) { + sLines.add(TAB + StatCollector.translateToLocalFormatted("GT5U.MBTT.subchannel", channel, purpose)); + return this; + } + + /** + * Use this method to add non-standard structural hint. This info will appear before the standard structural hint. + * + * @param info The line to be added. This should be an entry into minecraft's localization system. + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addStructureHint(String info) { + hLines.add(StatCollector.translateToLocal(info)); + return this; + } + + /** + * Use this method to add an entry to standard structural hint without creating a corresponding line in structure + * information + * + * @param name The name of block This should be an entry into minecraft's localization system. + * @param dots Possible locations of this block + * @return Instance this method was called on. + */ + public MultiblockTooltipBuilder addStructureHint(String name, int... dots) { + for (int dot : dots) hBlocks.put(dot, StatCollector.translateToLocal(name)); + return this; + } + + /** + * Call at the very end.
+ * Adds a final line with the mod name and information on how to display the structure guidelines.
+ * Ends the building process. + * + * @param mod Name of the mod that adds this multiblock machine + */ + public MultiblockTooltipBuilder toolTipFinisher(String mod) { + iLines.add( + TT_hold + " " + + EnumChatFormatting.BOLD + + "[LSHIFT]" + + EnumChatFormatting.RESET + + EnumChatFormatting.GRAY + + " " + + TT_todisplay); + iLines.add(TT_mod + COLON + EnumChatFormatting.GREEN + mod + EnumChatFormatting.GRAY); + hLines.add(TT_structurehint); + iArray = iLines.toArray(new String[0]); + sArray = sLines.toArray(new String[0]); + // e.getKey() - 1 because 1 dot is meta 0. + hArray = Stream.concat( + hLines.stream(), + hBlocks.asMap() + .entrySet() + .stream() + .map(e -> TT_dots[e.getKey() - 1] + COLON + String.join(SEPARATOR, e.getValue()))) + .toArray(String[]::new); + return this; + } + + public String[] getInformation() { + return iArray; + } + + public String[] getStructureInformation() { + return sArray; + } + + public String[] getStructureHint() { + return hArray; + } +} diff --git a/src/main/java/gregtech/api/util/OutputHatchWrapper.java b/src/main/java/gregtech/api/util/OutputHatchWrapper.java index b2e74d24cf..55f467198a 100644 --- a/src/main/java/gregtech/api/util/OutputHatchWrapper.java +++ b/src/main/java/gregtech/api/util/OutputHatchWrapper.java @@ -8,17 +8,17 @@ import net.minecraftforge.fluids.FluidTankInfo; import org.jetbrains.annotations.NotNull; import gregtech.api.interfaces.fluid.IFluidStore; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; /** * Wrapper for output hatch to allow multiblocks to apply specific filter. */ public class OutputHatchWrapper implements IFluidStore { - private final GT_MetaTileEntity_Hatch_Output outputHatch; + private final MTEHatchOutput outputHatch; private final Predicate filter; - public OutputHatchWrapper(GT_MetaTileEntity_Hatch_Output outputHatch, Predicate filter) { + public OutputHatchWrapper(MTEHatchOutput outputHatch, Predicate filter) { this.outputHatch = outputHatch; this.filter = filter; } diff --git a/src/main/java/gregtech/api/util/OverclockCalculator.java b/src/main/java/gregtech/api/util/OverclockCalculator.java new file mode 100644 index 0000000000..0b27942355 --- /dev/null +++ b/src/main/java/gregtech/api/util/OverclockCalculator.java @@ -0,0 +1,621 @@ +package gregtech.api.util; + +import java.util.function.Function; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class OverclockCalculator { + + // region variables + // region basic properties + /** + * EUt the recipe originally runs at + */ + private long recipeEUt = 0; + /** + * Voltage of the machine + */ + private long machineVoltage = 0; + /** + * Amperage of the machine + */ + private long machineAmperage = 1; + /** + * Duration of the recipe + */ + private int duration = 0; + /** + * A supplier used for machines which have a custom way of calculating base duration, like Neutron Activator + */ + private Supplier durationUnderOneTickSupplier; + /** + * The parallel the machine has when trying to overclock + */ + private int parallel = 1; + // endregion + // region extra factors + /** + * Discount for EUt at the beginning of calculating overclocks, like GT++ machines + */ + private double eutDiscount = 1; + /** + * Speeding/Slowing up/down the duration of a recipe at the beginning of calculating overclocks, like GT++ machines + */ + private double speedBoost = 1; + // endregion + // region overclock parameters + /** + * How much the energy would be multiplied by per overclock available + */ + private double eutIncreasePerOC = 4; + /** + * A supplier used for machines which have a custom way of calculating energy increase multipliers for every + * overclock, like Advanced Assembling Line + */ + private Function eutIncreasePerOCSupplier = getDefaultEutIncreasePerOCSupplier(); + /** + * How much the duration would be divided by per overclock made that isn't an overclock from HEAT + */ + private double durationDecreasePerOC = 2; + /** + * A supplier used for machines which have a custom way of calculating duration decrease multipliers for every + * overclock + */ + private Function durationDecreasePerOCSupplier = getDefaultDurationDecreasePerOCSupplier(); + /** + * Whether at least one of {@link #eutIncreasePerOCSupplier} and {@link #durationDecreasePerOCSupplier} has been set + */ + private boolean hasAtLeastOneSupplierBeenSet; + /** + * Whether to give EUt Discount when the duration goes below one tick + */ + private boolean oneTickDiscount; + /** + * Whether the multi should use amperage to overclock normally. + */ + private boolean amperageOC; + /** + * If the OC calculator should only do a given amount of overclocks. Mainly used in fusion reactors + */ + private boolean limitOverclocks; + /** + * Maximum amount of overclocks to perform, when limitOverclocks = true + */ + private int maxOverclocks; + /** + * How many overclocks have been performed + */ + private int overclockCount; + /** + * Should we actually try to calculate overclocking + */ + private boolean noOverclock; + /** + * The parallel the machine actually used. + */ + private int currentParallel; + // endregion + // region heat overclock + /** + * The min heat required for the recipe + */ + private int recipeHeat = 0; + /** + * The heat the machine has when starting the recipe + */ + private int machineHeat = 0; + /** + * How much the duration should be divided by for each 1800K above recipe heat + */ + private double durationDecreasePerHeatOC = 4; + /** + * Whether to enable overclocking with heat like the EBF every 1800 heat difference + */ + private boolean heatOC; + /** + * Whether to enable heat discounts every 900 heat difference + */ + private boolean heatDiscount; + /** + * The value used for discount final eut per 900 heat + */ + private double heatDiscountExponent = 0.95; + // endregion + // region result + /** + * variable to check whether the overclocks have been calculated + */ + private boolean calculated; + /** + * The calculated duration result. + */ + private int calculatedDuration; + /** + * The calculated energy consumption result. + */ + private long calculatedConsumption; + // endregion + // region constants + private static final int HEAT_DISCOUNT_THRESHOLD = 900; + private static final int HEAT_PERFECT_OVERCLOCK_THRESHOLD = 1800; + private static final double LOG2 = Math.log(2); + // endregion + // endregion + + /** + * Creates calculator that doesn't do OC at all. Will use recipe duration. + */ + public static OverclockCalculator ofNoOverclock(@Nonnull GTRecipe recipe) { + return ofNoOverclock(recipe.mEUt, recipe.mDuration); + } + + /** + * Creates calculator that doesn't do OC at all, with set duration. + */ + public static OverclockCalculator ofNoOverclock(long eut, int duration) { + return new OverclockCalculator().setRecipeEUt(eut) + .setDuration(duration) + .setEUt(eut) + .setNoOverclock(true); + } + + /** + * An Overclock helper for calculating overclocks in many different situations + */ + public OverclockCalculator() {} + + // region setters + /** + * @param recipeEUt Sets the Recipe's starting voltage + */ + @Nonnull + public OverclockCalculator setRecipeEUt(long recipeEUt) { + this.recipeEUt = recipeEUt; + return this; + } + + /** + * @param machineVoltage Sets the EUt that the machine can use. This is the voltage of the machine + */ + @Nonnull + public OverclockCalculator setEUt(long machineVoltage) { + this.machineVoltage = machineVoltage; + return this; + } + + /** + * @param duration Sets the duration of the recipe + */ + @Nonnull + public OverclockCalculator setDuration(int duration) { + this.duration = duration; + return this; + } + + /** + * @param machineAmperage Sets the Amperage that the machine can support + */ + @Nonnull + public OverclockCalculator setAmperage(long machineAmperage) { + this.machineAmperage = machineAmperage; + return this; + } + + /** + * Enables Perfect OC in calculation + */ + @Nonnull + public OverclockCalculator enablePerfectOC() { + this.durationDecreasePerOC = 4; + return this; + } + + /** + * Set if we should be calculating overclocking using EBF's perfectOC + */ + @Nonnull + public OverclockCalculator setHeatOC(boolean heatOC) { + this.heatOC = heatOC; + return this; + } + + /** + * Sets if we should add a heat discount at the end of calculating an overclock, just like the EBF + */ + @Nonnull + public OverclockCalculator setHeatDiscount(boolean heatDiscount) { + this.heatDiscount = heatDiscount; + return this; + } + + /** + * Sets the starting heat of the recipe + */ + @Nonnull + public OverclockCalculator setRecipeHeat(int recipeHeat) { + this.recipeHeat = recipeHeat; + return this; + } + + /** + * Sets the heat of the coils on the machine + */ + @Nonnull + public OverclockCalculator setMachineHeat(int machineHeat) { + this.machineHeat = machineHeat; + return this; + } + + /** + * Sets an EUtDiscount. 0.9 is 10% less energy. 1.1 is 10% more energy + */ + @Nonnull + public OverclockCalculator setEUtDiscount(float aEUtDiscount) { + this.eutDiscount = aEUtDiscount; + return this; + } + + /** + * Sets a Speed Boost for the multiblock. 0.9 is 10% faster. 1.1 is 10% slower + */ + @Nonnull + public OverclockCalculator setSpeedBoost(float aSpeedBoost) { + this.speedBoost = aSpeedBoost; + return this; + } + + /** + * Sets the parallel that the multiblock uses + */ + @Nonnull + public OverclockCalculator setParallel(int aParallel) { + this.parallel = aParallel; + return this; + } + + /** + * Sets the heat discount during OC calculation if HeatOC is used. Default: 0.95 = 5% discount Used like a EU/t + * Discount + */ + @Nonnull + public OverclockCalculator setHeatDiscountMultiplier(float heatDiscountExponent) { + this.heatDiscountExponent = heatDiscountExponent; + return this; + } + + /** + * Sets the Overclock that should be calculated when a heat OC is applied. + */ + @Nonnull + public OverclockCalculator setHeatPerfectOC(double heatPerfectOC) { + if (heatPerfectOC <= 0) throw new IllegalArgumentException("Heat OC can't be a negative number or zero"); + this.durationDecreasePerHeatOC = heatPerfectOC; + return this; + } + + /** + * Sets the amount that the eut would be multiplied by per overclock. Do not set as 1(ONE) if the duration decrease + * is also 1(ONE)! + */ + @Nonnull + public OverclockCalculator setEUtIncreasePerOC(double eutIncreasePerOC) { + if (eutIncreasePerOC <= 0) + throw new IllegalArgumentException("EUt increase can't be a negative number or zero"); + this.eutIncreasePerOC = eutIncreasePerOC; + return this; + } + + /** + * Sets the amount that the duration would be divided by per overclock. Do not set as 1(ONE) if the eut increase is + * also 1(ONE)! + */ + @Nonnull + public OverclockCalculator setDurationDecreasePerOC(double durationDecreasePerOC) { + if (durationDecreasePerOC <= 0) + throw new IllegalArgumentException("Duration decrease can't be a negative number or zero"); + this.durationDecreasePerOC = durationDecreasePerOC; + return this; + } + + /** + * Set One Tick Discount on EUt based on Duration Decrease Per Overclock. This functions the same as single blocks. + */ + @Nonnull + public OverclockCalculator setOneTickDiscount(boolean oneTickDiscount) { + this.oneTickDiscount = oneTickDiscount; + return this; + } + + /** + * Limit the amount of overclocks that can be performed, regardless of how much power is available. Mainly used for + * fusion reactors. + */ + @Nonnull + public OverclockCalculator limitOverclockCount(int maxOverclocks) { + this.limitOverclocks = true; + this.maxOverclocks = maxOverclocks; + return this; + } + + @Nonnull + public OverclockCalculator setAmperageOC(boolean amperageOC) { + this.amperageOC = amperageOC; + return this; + } + + /** + * Set a supplier for calculating custom duration for when its needed under one tick + */ + @Nonnull + public OverclockCalculator setDurationUnderOneTickSupplier(Supplier supplier) { + this.durationUnderOneTickSupplier = supplier; + return this; + } + + /** + * Sets if we should do overclocking or not + */ + @Nonnull + public OverclockCalculator setNoOverclock(boolean noOverclock) { + this.noOverclock = noOverclock; + return this; + } + + /** + * Set a supplier for calculating custom EUt increase multipliers for every overclock + */ + public OverclockCalculator setEutIncreasePerOCSupplier(Function eutIncreasePerOCSupplier) { + this.eutIncreasePerOCSupplier = eutIncreasePerOCSupplier; + this.hasAtLeastOneSupplierBeenSet = true; + return this; + } + + /** + * Set a supplier for calculating custom duration decrease multipliers for every overclock + */ + public OverclockCalculator setDurationDecreasePerOCSupplier( + Function durationDecreasePerOCSupplier) { + this.durationDecreasePerOCSupplier = durationDecreasePerOCSupplier; + this.hasAtLeastOneSupplierBeenSet = true; + return this; + } + + /** + * Set actually performed parallel + */ + public OverclockCalculator setCurrentParallel(int currentParallel) { + this.currentParallel = currentParallel; + // Sets parallel to the actually performed one if machine's parallel is underused. + this.parallel = Math.min(parallel, currentParallel); + return this; + } + + // endregion + // region calculate + /** + * Call this when all values have been put it. + */ + @Nonnull + public OverclockCalculator calculate() { + if (calculated) { + throw new IllegalStateException("Tried to calculate overclocks twice"); + } + calculateOverclock(); + calculated = true; + return this; + } + + private void calculateOverclock() { + double durationInDouble = durationUnderOneTickSupplier != null ? durationUnderOneTickSupplier.get() + : duration * speedBoost; + calculatedConsumption = recipeEUt; + double heatDiscountMultiplier = calculateHeatDiscountMultiplier(); + // Usually a safeguard when currentParallel is not set: We assume parallel is fully used. + currentParallel = Math.max(currentParallel, parallel); + + if (noOverclock) { + calculatedConsumption = calculateFinalRecipeEUt(heatDiscountMultiplier); + calculatedDuration = (int) Math.ceil(durationInDouble); + return; + } + + // First we need to overclock to reach 1 tick. + // Then we need to overclock under one tick to get more extra parallels. + // We stop overclocking if we've already reached 1 tick and got enough parallels to actually perform. + double requiredUnderOneTickMultiplier = durationInDouble * currentParallel / parallel; + if (hasAtLeastOneSupplierBeenSet) { // custom overclock + double currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); + double currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); + double machinePower = calculateMachinePower(); + double currentConsumption = calculateRecipePower(heatDiscountMultiplier); + double currentUnderOneTickMultiplier = 1; + // Whether we have enough power for the next overclock; + // whether we need more overclock to reach 1 tick and get enough extra parallel; + // whether we have reached the overclock limit + while (machinePower > currentConsumption * currentEutIncrease + && requiredUnderOneTickMultiplier > currentUnderOneTickMultiplier + && (!limitOverclocks || overclockCount < maxOverclocks)) { + currentConsumption *= currentEutIncrease; + durationInDouble /= currentDurationDecrease; + overclockCount++; + currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); + currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); + } + calculatedConsumption = (long) Math.max(currentConsumption, 1); + calculatedDuration = (int) Math.max(durationInDouble, 1); + } else { // general overclock + double recipePowerTier = calculateRecipePowerTier(heatDiscountMultiplier); + double machinePowerTier = calculateMachinePowerTier(); + + int maxOverclockCount = calculateAmountOfOverclocks(machinePowerTier, recipePowerTier); + if (limitOverclocks) maxOverclockCount = Math.min(maxOverclocks, maxOverclockCount); + if (!amperageOC) { + // Limit overclocks by voltage tier. + maxOverclockCount = Math.min(maxOverclockCount, calculateRecipeToMachineVoltageDifference()); + } + overclockCount = calculateAmountOfNeededOverclocks(maxOverclockCount, requiredUnderOneTickMultiplier); + + // If triggered, it indicates that recipe power > machine power. + // Not just a safeguard. This also means that you can run a 1.2A recipe on a single hatch for a regular gt + // multi. + // This is intended, including the fact that you don't get an OC with a one tier upgrade in that case. + overclockCount = Math.max(overclockCount, 0); + + int heatOverclockCount = Math.min(calculateMaxAmountOfHeatOverclocks(), overclockCount); + calculatedConsumption = (long) Math.floor(recipeEUt * Math.pow(eutIncreasePerOC, overclockCount)); + durationInDouble /= Math.pow(durationDecreasePerHeatOC, heatOverclockCount) + * Math.pow(durationDecreasePerOC, overclockCount - heatOverclockCount); + if (oneTickDiscount) { + calculatedConsumption = (long) Math + .floor(calculatedConsumption / Math.pow(durationDecreasePerOC, maxOverclockCount - overclockCount)); + calculatedConsumption = Math.max(calculatedConsumption, 1); + } + calculatedConsumption = calculateFinalRecipeEUt(heatDiscountMultiplier); + calculatedDuration = (int) Math.max(durationInDouble, 1); + } + } + + private double calculateRecipePower(double heatDiscountMultiplier) { + return recipeEUt * parallel * eutDiscount * heatDiscountMultiplier; + } + + private double calculateRecipePowerTier(double heatDiscountMultiplier) { + return calculatePowerTier(calculateRecipePower(heatDiscountMultiplier)); + } + + private double calculateMachinePower() { + return machineVoltage * (amperageOC ? machineAmperage : Math.min(machineAmperage, parallel)); + } + + private double calculateMachinePowerTier() { + return calculatePowerTier(calculateMachinePower()); + } + + private int calculateRecipeToMachineVoltageDifference() { + return (int) (Math.ceil(calculatePowerTier(machineVoltage)) - Math.ceil(calculatePowerTier(recipeEUt))); + } + + private double calculatePowerTier(double voltage) { + return 1 + Math.max(0, (Math.log(voltage) / LOG2) - 5) / 2; + } + + private long calculateFinalRecipeEUt(double heatDiscountMultiplier) { + return (long) Math.ceil(calculatedConsumption * eutDiscount * heatDiscountMultiplier * parallel); + } + + private int calculateMaxAmountOfHeatOverclocks() { + return heatOC ? (machineHeat - recipeHeat) / HEAT_PERFECT_OVERCLOCK_THRESHOLD : 0; + } + + /** + * Calculate maximum possible overclocks ignoring if we are going to go under 1 tick + */ + private int calculateAmountOfOverclocks(double machinePowerTier, double recipePowerTier) { + return (int) (machinePowerTier - recipePowerTier); + } + + private int calculateAmountOfNeededOverclocks(int maxOverclockCount, double requiredUnderOneTickMultiplier) { + int neededHeatOC = (int) Math.min( + calculateMaxAmountOfHeatOverclocks(), + Math.ceil(Math.log(requiredUnderOneTickMultiplier) / Math.log(durationDecreasePerHeatOC))); + neededHeatOC = Math.max(neededHeatOC, 0); + int neededNormalOC = (int) Math.ceil( + (Math.log(requiredUnderOneTickMultiplier) - Math.log(durationDecreasePerHeatOC) * neededHeatOC) + / Math.log(durationDecreasePerOC)); + neededNormalOC = Math.max(neededNormalOC, 0); + return Math.min(maxOverclockCount, neededHeatOC + neededNormalOC); + } + + private double calculateHeatDiscountMultiplier() { + int heatDiscounts = heatDiscount ? (machineHeat - recipeHeat) / HEAT_DISCOUNT_THRESHOLD : 0; + return Math.pow(heatDiscountExponent, heatDiscounts); + } + + // endregion + // region result getters + /** + * @return The consumption after overclock has been calculated + */ + public long getConsumption() { + if (!calculated) { + throw new IllegalStateException("Tried to get consumption before calculating"); + } + return calculatedConsumption; + } + + /** + * @return The duration of the recipe after overclock has been calculated + */ + public int getDuration() { + if (!calculated) { + throw new IllegalStateException("Tried to get duration before calculating"); + } + return calculatedDuration; + } + + /** + * @return Number of performed overclocks + */ + public int getPerformedOverclocks() { + if (!calculated) { + throw new IllegalStateException("Tried to get performed overclocks before calculating"); + } + return overclockCount; + } + + /** + * @return Whether the calculation has happened + */ + public boolean getCalculationStatus() { + return calculated; + } + + // endregion + // region misc + /** + * Returns duration as a double to show how much it is overclocking too much to determine extra parallel. This + * doesn't count as calculating + */ + public double calculateDurationUnderOneTick() { + double durationInDouble = durationUnderOneTickSupplier != null ? durationUnderOneTickSupplier.get() + : duration * speedBoost; + if (noOverclock) return durationInDouble; + double heatDiscountMultiplier = calculateHeatDiscountMultiplier(); + if (hasAtLeastOneSupplierBeenSet) { + int overclockCount = 0; + double currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); + double currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); + double machinePower = calculateMachinePower(); + double recipePower = calculateRecipePower(heatDiscountMultiplier); + while (machinePower > recipePower * currentEutIncrease + && (!limitOverclocks || overclockCount < maxOverclocks)) { + recipePower *= currentEutIncrease; + durationInDouble /= currentDurationDecrease; + overclockCount++; + currentEutIncrease = eutIncreasePerOCSupplier.apply(overclockCount + 1); + currentDurationDecrease = durationDecreasePerOCSupplier.apply(overclockCount + 1); + } + } else { + int maxOverclockCount = calculateAmountOfOverclocks( + calculateMachinePowerTier(), + calculateRecipePowerTier(heatDiscountMultiplier)); + if (limitOverclocks) maxOverclockCount = Math.min(maxOverclocks, maxOverclockCount); + int heatOverclocks = Math.min(calculateMaxAmountOfHeatOverclocks(), maxOverclockCount); + durationInDouble /= Math.pow(durationDecreasePerOC, maxOverclockCount - heatOverclocks) + * Math.pow(durationDecreasePerHeatOC, heatOverclocks); + } + return durationInDouble; + } + + private Function getDefaultEutIncreasePerOCSupplier() { + return overclockCount -> eutIncreasePerOC; + } + + private Function getDefaultDurationDecreasePerOCSupplier() { + return overclockCount -> overclockCount <= calculateMaxAmountOfHeatOverclocks() ? durationDecreasePerHeatOC + : durationDecreasePerOC; + } + + // endregion +} diff --git a/src/main/java/gregtech/api/util/PCBFactoryManager.java b/src/main/java/gregtech/api/util/PCBFactoryManager.java new file mode 100644 index 0000000000..2d3efa29d4 --- /dev/null +++ b/src/main/java/gregtech/api/util/PCBFactoryManager.java @@ -0,0 +1,25 @@ +package gregtech.api.util; + +import com.google.common.collect.HashBiMap; + +import gregtech.api.enums.Materials; + +public class PCBFactoryManager { + + private static final HashBiMap mPlasticTiers = HashBiMap.create(); + public static int mTiersOfPlastics = 0; + + public static void addPlasticTier(Materials aMaterial, int aTier) { + mPlasticTiers.put(aMaterial, aTier); + mTiersOfPlastics++; + } + + public static int getPlasticTier(Materials aMaterial) { + return mPlasticTiers.get(aMaterial); + } + + public static Materials getPlasticMaterialFromTier(int aTier) { + return mPlasticTiers.inverse() + .get(aTier); + } +} diff --git a/src/main/java/gregtech/api/util/ParallelHelper.java b/src/main/java/gregtech/api/util/ParallelHelper.java new file mode 100644 index 0000000000..0c995cba7d --- /dev/null +++ b/src/main/java/gregtech/api/util/ParallelHelper.java @@ -0,0 +1,713 @@ +package gregtech.api.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; +import java.util.Random; +import java.util.function.Function; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.interfaces.tileentity.IRecipeLockable; +import gregtech.api.interfaces.tileentity.IVoidable; +import gregtech.api.logic.FluidInventoryLogic; +import gregtech.api.logic.ItemInventoryLogic; +import gregtech.api.objects.XSTR; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SingleRecipeCheck; + +@SuppressWarnings({ "unused", "UnusedReturnValue" }) +public class ParallelHelper { + + private static final double MAX_BATCH_MODE_TICK_TIME = 128; + /** + * Machine used for calculation + */ + private IVoidable machine; + /** + * Machine used for single recipe locking calculation + */ + private IRecipeLockable singleRecipeMachine; + /** + * Is locked to a single recipe? + */ + private boolean isRecipeLocked; + /** + * Recipe used when trying to calculate parallels + */ + private GTRecipe recipe; + /** + * EUt available to the multiblock (This should be the total eut available) + */ + private long availableEUt; + /** + * The current parallel possible for the multiblock + */ + private int currentParallel = 0; + /** + * The maximum possible parallel possible for the multiblock + */ + private int maxParallel = 1; + /** + * The Batch Modifier applied when batch mode is enabled. 1 does nothing. 2 doubles max possible + * parallel, but also duration + */ + private int batchModifier = 1; + /** + * The inputs of the multiblock for the current recipe check + */ + private ItemStack[] itemInputs; + /** + * The inputs of the machine for current recipe check + */ + private ItemInventoryLogic itemInputInventory; + /** + * The output item inventory of the machine + */ + private ItemInventoryLogic itemOutputInventory; + /** + * The outputs of the recipe with the applied parallel + */ + private ItemStack[] itemOutputs; + /** + * The inputs of the multiblock for the current recipe check + */ + private FluidStack[] fluidInputs; + /** + * The inputs of the machine for the current recipe check + */ + private FluidInventoryLogic fluidInputInventory; + /** + * The output fluid inventory of the machine; + */ + private FluidInventoryLogic fluidOutputInventory; + /** + * The outputs of the recipe with the applied parallel + */ + private FluidStack[] fluidOutputs; + /** + * Does the multi have void protection enabled for items + */ + private boolean protectExcessItem; + /** + * Does the multi have void protection enabled for fluids + */ + private boolean protectExcessFluid; + /** + * Should the Parallel Helper automatically consume for the multi + */ + private boolean consume; + /** + * Is batch mode turned on? + */ + private boolean batchMode; + /** + * Should the Parallel Helper automatically calculate the outputs of the recipe with current parallel? + */ + private boolean calculateOutputs; + /** + * Has the Parallel Helper been built? + */ + private boolean built; + /** + * What is the duration multiplier with batch mode enabled + */ + private double durationMultiplier; + /** + * Modifier which is applied on the recipe eut. Useful for GT++ machines + */ + private float eutModifier = 1; + /** + * Multiplier that is applied on the output chances + */ + private double chanceMultiplier = 1; + /** + * Multiplier by which the output will be multiplied + */ + private int outputMultiplier = 1; + /** + * Method for calculating max parallel from given inputs. + */ + private MaxParallelCalculator maxParallelCalculator = GTRecipe::maxParallelCalculatedByInputs; + /** + * Method for consuming inputs after determining how many parallels it can execute. + */ + private InputConsumer inputConsumer = GTRecipe::consumeInput; + + /** + * Calculator to use for overclocking + */ + private OverclockCalculator calculator; + @Nonnull + private CheckRecipeResult result = CheckRecipeResultRegistry.NONE; + + private Function customItemOutputCalculation; + + private Function customFluidOutputCalculation; + + /** + * MuTE Mode this is a mode for changing how the GT_ParallelHelper works as Mutes don't use ItemStack and FluidStack + * arrays for inputs + */ + private boolean muteMode = false; + + public ParallelHelper() {} + + /** + * Sets machine, with current configuration for void protection mode. + */ + @Nonnull + public ParallelHelper setMachine(IVoidable machine) { + return setMachine(machine, machine.protectsExcessItem(), machine.protectsExcessFluid()); + } + + /** + * Sets machine, with void protection mode forcibly. + */ + @Nonnull + public ParallelHelper setMachine(IVoidable machine, boolean protectExcessItem, boolean protectExcessFluid) { + this.protectExcessItem = protectExcessItem; + this.protectExcessFluid = protectExcessFluid; + this.machine = machine; + return this; + } + + /** + * Sets the recipe, which will be used for the parallel calculation + */ + @Nonnull + public ParallelHelper setRecipe(@Nonnull GTRecipe aRecipe) { + recipe = Objects.requireNonNull(aRecipe); + return this; + } + + @Nonnull + public ParallelHelper setRecipeLocked(IRecipeLockable singleRecipeMachine, boolean isRecipeLocked) { + this.singleRecipeMachine = singleRecipeMachine; + this.isRecipeLocked = isRecipeLocked; + return this; + } + + /** + * Sets the items available for the recipe check + */ + @Nonnull + public ParallelHelper setItemInputs(ItemStack... aItemInputs) { + this.itemInputs = aItemInputs; + return this; + } + + /** + * Sets the fluid inputs available for the recipe check + */ + @Nonnull + public ParallelHelper setFluidInputs(FluidStack... aFluidInputs) { + this.fluidInputs = aFluidInputs; + return this; + } + + /** + * Sets the available eut when trying for more parallels + */ + @Nonnull + public ParallelHelper setAvailableEUt(long aAvailableEUt) { + this.availableEUt = aAvailableEUt; + return this; + } + + /** + * Sets the modifier for recipe eut. 1 does nothing 0.9 is 10% less. 1.1 is 10% more + */ + @Nonnull + public ParallelHelper setEUtModifier(float aEUtModifier) { + this.eutModifier = aEUtModifier; + return this; + } + + /** + * Sets the multiplier that is applied on output chances. 1 does nothing. 0.9 is 10% less. 1.1 is 10% more. + * Only useful for item outputs for sure. + */ + @Nonnull + public ParallelHelper setChanceMultiplier(double chanceMultiplier) { + this.chanceMultiplier = chanceMultiplier; + return this; + } + + /** + * Sets the item/fluid output multiplier. 1 does nothing. 2 doubles the item and fluid outputs. + */ + @Nonnull + public ParallelHelper setOutputMultiplier(int outputMultiplier) { + this.outputMultiplier = outputMultiplier; + return this; + } + + @Nonnull + public ParallelHelper setCalculator(OverclockCalculator calculator) { + this.calculator = calculator; + return this; + } + + /** + * Set if we should consume inputs or not when trying for parallels + * + * @param consume Should we consume inputs + */ + @Nonnull + public ParallelHelper setConsumption(boolean consume) { + this.consume = consume; + return this; + } + + /** + * Sets the MaxParallel a multi can handle + */ + @Nonnull + public ParallelHelper setMaxParallel(int maxParallel) { + this.maxParallel = maxParallel; + return this; + } + + /** + * Enables Batch mode. Can do up to an additional processed recipes of mCurrentParallel * mBatchModifier A batch + * modifier of 1 does nothing + */ + @Nonnull + public ParallelHelper enableBatchMode(int batchModifier) { + this.batchMode = batchModifier > 1; + this.batchModifier = batchModifier; + return this; + } + + /** + * Sets if we should calculate outputs with the parallels we found or not + * + * @param calculateOutputs Should we calculate outputs with the helper or not + */ + @Nonnull + public ParallelHelper setOutputCalculation(boolean calculateOutputs) { + this.calculateOutputs = calculateOutputs; + return this; + } + + /** + * Set a custom way to calculate item outputs. You are given the amount of parallels and must return an ItemStack + * array + */ + @Nonnull + public ParallelHelper setCustomItemOutputCalculation(Function custom) { + customItemOutputCalculation = custom; + return this; + } + + /** + * Set a custom way to calculate item outputs. You are given the amount of parallels and must return a FluidStack + * array + */ + @Nonnull + public ParallelHelper setCustomFluidOutputCalculation(Function custom) { + customFluidOutputCalculation = custom; + return this; + } + + @Nonnull + public ParallelHelper setMuTEMode(boolean muteMode) { + this.muteMode = muteMode; + return this; + } + + @Nonnull + public ParallelHelper setItemInputInventory(ItemInventoryLogic itemInputInventory) { + this.itemInputInventory = itemInputInventory; + return this; + } + + @Nonnull + public ParallelHelper setFluidInputInventory(FluidInventoryLogic fluidInputInventory) { + this.fluidInputInventory = fluidInputInventory; + return this; + } + + /** + * Sets method for calculating max parallel from given inputs. + */ + public ParallelHelper setMaxParallelCalculator(MaxParallelCalculator maxParallelCalculator) { + this.maxParallelCalculator = maxParallelCalculator; + return this; + } + + /** + * Sets method for consuming inputs after determining how many parallels it can execute. + */ + public ParallelHelper setInputConsumer(InputConsumer inputConsumer) { + this.inputConsumer = inputConsumer; + return this; + } + + @Nonnull + public ParallelHelper setItemOutputInventory(ItemInventoryLogic itemOutputInventory) { + this.itemOutputInventory = itemOutputInventory; + return this; + } + + @Nonnull + public ParallelHelper setFluidOutputInventory(FluidInventoryLogic fluidOutputInventory) { + this.fluidOutputInventory = fluidOutputInventory; + return this; + } + + /** + * Finishes the GT_ParallelHelper. Anything changed after this will not effect anything + */ + @Nonnull + public ParallelHelper build() { + if (built) { + throw new IllegalStateException("Tried to build twice"); + } + if (recipe == null) { + throw new IllegalStateException("Recipe is not set"); + } + built = true; + determineParallel(); + return this; + } + + /** + * @return The current parallels possible by the multiblock + */ + public int getCurrentParallel() { + if (!built) { + throw new IllegalStateException("Tried to get parallels before building"); + } + return currentParallel; + } + + /** + * @return The duration multiplier if batch mode was enabled for the multiblock + */ + public double getDurationMultiplierDouble() { + if (!built) { + throw new IllegalStateException("Tried to get duration multiplier before building"); + } + if (batchMode && durationMultiplier > 0) { + return durationMultiplier; + } + return 1; + } + + /** + * @return The ItemOutputs from the recipe + */ + @Nonnull + public ItemStack[] getItemOutputs() { + if (!built || !calculateOutputs) { + throw new IllegalStateException( + "Tried to get item outputs before building or without enabling calculation of outputs"); + } + return itemOutputs; + } + + /** + * @return The FluidOutputs from the recipe + */ + @Nonnull + public FluidStack[] getFluidOutputs() { + if (!built || !calculateOutputs) { + throw new IllegalStateException( + "Tried to get fluid outputs before building or without enabling calculation of outputs"); + } + return fluidOutputs; + } + + /** + * @return The result of why a recipe could've failed or succeeded + */ + @Nonnull + public CheckRecipeResult getResult() { + if (!built) { + throw new IllegalStateException("Tried to get recipe result before building"); + } + return result; + } + + /** + * Called by build(). Determines the parallels and everything else that needs to be done at build time + */ + protected void determineParallel() { + if (maxParallel <= 0) { + return; + } + if (itemInputs == null) { + itemInputs = new ItemStack[0]; + } + if (fluidInputs == null) { + fluidInputs = new FluidStack[0]; + } + + if (!consume) { + copyInputs(); + } + + if (calculator == null) { + calculator = new OverclockCalculator().setEUt(availableEUt) + .setRecipeEUt(recipe.mEUt) + .setDuration(recipe.mDuration) + .setEUtDiscount(eutModifier); + } + + final int tRecipeEUt = (int) Math.ceil(recipe.mEUt * eutModifier); + if (availableEUt < tRecipeEUt) { + result = CheckRecipeResultRegistry.insufficientPower(tRecipeEUt); + return; + } + + // Save the original max parallel before calculating our overclocking under 1 tick + int originalMaxParallel = maxParallel; + calculator.setParallel(originalMaxParallel); + double tickTimeAfterOC = calculator.calculateDurationUnderOneTick(); + if (tickTimeAfterOC < 1) { + maxParallel = GTUtility.safeInt((long) (maxParallel / tickTimeAfterOC), 0); + } + + int maxParallelBeforeBatchMode = maxParallel; + if (batchMode) { + maxParallel = GTUtility.safeInt((long) maxParallel * batchModifier, 0); + } + + final ItemStack[] truncatedItemOutputs = recipe.mOutputs != null + ? Arrays.copyOfRange(recipe.mOutputs, 0, Math.min(machine.getItemOutputLimit(), recipe.mOutputs.length)) + : new ItemStack[0]; + final FluidStack[] truncatedFluidOutputs = recipe.mFluidOutputs != null ? Arrays + .copyOfRange(recipe.mFluidOutputs, 0, Math.min(machine.getFluidOutputLimit(), recipe.mFluidOutputs.length)) + : new FluidStack[0]; + + SingleRecipeCheck recipeCheck = null; + SingleRecipeCheck.Builder tSingleRecipeCheckBuilder = null; + if (isRecipeLocked && singleRecipeMachine != null) { + recipeCheck = singleRecipeMachine.getSingleRecipeCheck(); + if (recipeCheck == null) { + // Machine is configured to lock to a single recipe, but haven't built the recipe checker yet. + // Build the checker on next successful recipe. + RecipeMap recipeMap = singleRecipeMachine.getRecipeMap(); + if (recipeMap != null) { + tSingleRecipeCheckBuilder = SingleRecipeCheck.builder(recipeMap) + .setBefore(itemInputs, fluidInputs); + } + } + } + + // Let's look at how many parallels we can get with void protection + if (protectExcessItem || protectExcessFluid) { + if (machine == null && !muteMode) { + throw new IllegalStateException("Tried to calculate void protection, but machine is not set"); + } + VoidProtectionHelper voidProtectionHelper = new VoidProtectionHelper(); + voidProtectionHelper.setMachine(machine) + .setItemOutputs(truncatedItemOutputs) + .setFluidOutputs(truncatedFluidOutputs) + .setChangeGetter(recipe::getOutputChance) + .setOutputMultiplier(outputMultiplier) + .setChanceMultiplier(chanceMultiplier) + .setMaxParallel(maxParallel) + .setItemOutputInventory(itemOutputInventory) + .setFluidOutputInventory(fluidOutputInventory) + .setMuTEMode(muteMode) + .build(); + maxParallel = Math.min(voidProtectionHelper.getMaxParallel(), maxParallel); + if (voidProtectionHelper.isItemFull()) { + result = CheckRecipeResultRegistry.ITEM_OUTPUT_FULL; + return; + } + if (voidProtectionHelper.isFluidFull()) { + result = CheckRecipeResultRegistry.FLUID_OUTPUT_FULL; + return; + } + } + + maxParallelBeforeBatchMode = Math.min(maxParallel, maxParallelBeforeBatchMode); + + // determine normal parallel + int actualMaxParallel = tRecipeEUt > 0 ? (int) Math.min(maxParallelBeforeBatchMode, availableEUt / tRecipeEUt) + : maxParallelBeforeBatchMode; + if (recipeCheck != null) { + currentParallel = recipeCheck.checkRecipeInputs(true, actualMaxParallel, itemInputs, fluidInputs); + } else { + currentParallel = (int) maxParallelCalculator.calculate(recipe, actualMaxParallel, fluidInputs, itemInputs); + if (currentParallel > 0) { + if (tSingleRecipeCheckBuilder != null) { + // If recipe checker is not built yet, build and set it + inputConsumer.consume(recipe, 1, fluidInputs, itemInputs); + SingleRecipeCheck builtCheck = tSingleRecipeCheckBuilder.setAfter(itemInputs, fluidInputs) + .setRecipe(recipe) + .build(); + singleRecipeMachine.setSingleRecipeCheck(builtCheck); + inputConsumer.consume(recipe, currentParallel - 1, fluidInputs, itemInputs); + } else { + inputConsumer.consume(recipe, currentParallel, fluidInputs, itemInputs); + } + } + } + + if (currentParallel <= 0) { + result = CheckRecipeResultRegistry.INTERNAL_ERROR; + return; + } + + calculator.setCurrentParallel(currentParallel) + .calculate(); + // If Batch Mode is enabled determine how many extra parallels we can get + if (batchMode && currentParallel > 0 && calculator.getDuration() < MAX_BATCH_MODE_TICK_TIME) { + int tExtraParallels; + double batchMultiplierMax = MAX_BATCH_MODE_TICK_TIME / calculator.getDuration(); + final int maxExtraParallels = (int) Math.floor( + Math.min( + currentParallel * Math.min(batchMultiplierMax - 1, batchModifier - 1), + maxParallel - currentParallel)); + if (recipeCheck != null) { + tExtraParallels = recipeCheck.checkRecipeInputs(true, maxExtraParallels, itemInputs, fluidInputs); + } else { + tExtraParallels = (int) maxParallelCalculator + .calculate(recipe, maxExtraParallels, fluidInputs, itemInputs); + inputConsumer.consume(recipe, tExtraParallels, fluidInputs, itemInputs); + } + durationMultiplier = 1.0f + (float) tExtraParallels / currentParallel; + currentParallel += tExtraParallels; + } + + // If we want to calculate outputs we do it here + if (calculateOutputs && currentParallel > 0) { + calculateItemOutputs(truncatedItemOutputs); + calculateFluidOutputs(truncatedFluidOutputs); + } + result = CheckRecipeResultRegistry.SUCCESSFUL; + } + + protected void copyInputs() { + ItemStack[] itemInputsToUse; + FluidStack[] fluidInputsToUse; + itemInputsToUse = new ItemStack[itemInputs.length]; + for (int i = 0; i < itemInputs.length; i++) { + itemInputsToUse[i] = itemInputs[i].copy(); + } + fluidInputsToUse = new FluidStack[fluidInputs.length]; + for (int i = 0; i < fluidInputs.length; i++) { + fluidInputsToUse[i] = fluidInputs[i].copy(); + } + itemInputs = itemInputsToUse; + fluidInputs = fluidInputsToUse; + } + + private void calculateItemOutputs(ItemStack[] truncatedItemOutputs) { + if (customItemOutputCalculation != null) { + itemOutputs = customItemOutputCalculation.apply(currentParallel); + return; + } + if (truncatedItemOutputs.length == 0) return; + ArrayList itemOutputsList = new ArrayList<>(); + for (int i = 0; i < truncatedItemOutputs.length; i++) { + if (recipe.getOutput(i) == null) continue; + ItemStack origin = recipe.getOutput(i) + .copy(); + final long itemStackSize = origin.stackSize; + double chancedOutputMultiplier = calculateChancedOutputMultiplier( + (int) (recipe.getOutputChance(i) * chanceMultiplier), + currentParallel); + long items = (long) Math.ceil(itemStackSize * chancedOutputMultiplier * outputMultiplier); + addItemsLong(itemOutputsList, origin, items); + } + itemOutputs = itemOutputsList.toArray(new ItemStack[0]); + } + + private void calculateFluidOutputs(FluidStack[] truncatedFluidOutputs) { + if (customFluidOutputCalculation != null) { + fluidOutputs = customFluidOutputCalculation.apply(currentParallel); + return; + } + if (truncatedFluidOutputs.length == 0) return; + ArrayList fluidOutputsList = new ArrayList<>(); + for (int i = 0; i < truncatedFluidOutputs.length; i++) { + if (recipe.getFluidOutput(i) == null) continue; + FluidStack origin = recipe.getFluidOutput(i) + .copy(); + long fluids = (long) this.outputMultiplier * origin.amount * currentParallel; + + addFluidsLong(fluidOutputsList, origin, fluids); + } + fluidOutputs = fluidOutputsList.toArray(new FluidStack[0]); + } + + private static final Random rand = new Random(); + + public static double calculateChancedOutputMultiplier(int chanceInt, int parallel) { + // Multiply the integer part of the chance directly with parallel + double multiplier = Math.floorDiv(chanceInt, 10000) * parallel; + int transformedChanceInt = chanceInt % 10000; + if (transformedChanceInt == 0) return multiplier; + // Calculation of the Decimal Part of chance + double chance = transformedChanceInt / 10000.0; + double mean = parallel * chance; + double stdDev = Math.sqrt(parallel * chance * (1 - chance)); + // Check if everything within 3 standard deviations of mean is within the range + // of possible values (0 ~ currentParallel) + boolean isSuitableForFittingWithNormalDistribution = mean - 3 * stdDev >= 0 && mean + 3 * stdDev <= parallel; + if (isSuitableForFittingWithNormalDistribution) { + // Use Normal Distribution to fit Binomial Distribution + double tMultiplier = stdDev * rand.nextGaussian() + mean; + multiplier += Math.max(Math.min(tMultiplier, parallel), 0); + } else { + // Do Binomial Distribution by loop + for (int roll = 0; roll < parallel; roll++) { + if (transformedChanceInt > XSTR.XSTR_INSTANCE.nextInt(10000)) { + multiplier += 1; + } + } + } + return multiplier; + } + + public static void addItemsLong(ArrayList itemList, ItemStack origin, long amount) { + if (amount > 0) { + while (amount > Integer.MAX_VALUE) { + ItemStack item = origin.copy(); + item.stackSize = Integer.MAX_VALUE; + itemList.add(item); + amount -= Integer.MAX_VALUE; + } + ItemStack item = origin.copy(); + item.stackSize = (int) amount; + itemList.add(item); + } + } + + public static void addFluidsLong(ArrayList fluidList, FluidStack origin, long amount) { + if (amount > 0) { + while (amount > Integer.MAX_VALUE) { + FluidStack fluid = origin.copy(); + fluid.amount = Integer.MAX_VALUE; + fluidList.add(fluid); + amount -= Integer.MAX_VALUE; + } + FluidStack fluid = origin.copy(); + fluid.amount = (int) amount; + fluidList.add(fluid); + } + } + + @FunctionalInterface + public interface MaxParallelCalculator { + + double calculate(GTRecipe recipe, int maxParallel, FluidStack[] fluids, ItemStack[] items); + } + + @FunctionalInterface + public interface InputConsumer { + + void consume(GTRecipe recipe, int amountMultiplier, FluidStack[] aFluidInputs, ItemStack[] aInputs); + } +} diff --git a/src/main/java/gregtech/api/util/ProcessingArrayManager.java b/src/main/java/gregtech/api/util/ProcessingArrayManager.java new file mode 100644 index 0000000000..adbb8f76b8 --- /dev/null +++ b/src/main/java/gregtech/api/util/ProcessingArrayManager.java @@ -0,0 +1,51 @@ +package gregtech.api.util; + +import java.util.HashMap; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.SoundResource; +import gregtech.api.recipe.RecipeMap; + +@Deprecated +public class ProcessingArrayManager { + + private static final HashMap> mRecipeSaves = new HashMap<>(); + private static final HashMap machineSounds = new HashMap<>(); + + // Adds recipe Maps to the PA using the machines unlocalized name. + // Example: basicmachine.electrolyzer, with its recipe map will add the electrolyzer's recipe map to the PA + public static void addRecipeMapToPA(String aMachineName, RecipeMap aMap) { + if (aMachineName != null) { + mRecipeSaves.put(aMachineName, aMap); + } + } + + // Allows the PA to extract the recipe map for the machine inside it. + public static RecipeMap giveRecipeMap(String aMachineName) { + if (aMachineName != null) { + return mRecipeSaves.get(aMachineName); + } + return null; + } + + public static void addSoundResourceToPA(String machineName, SoundResource soundResource) { + if (machineName != null) { + machineSounds.put(machineName, soundResource); + } + } + + public static SoundResource getSoundResource(String machineName) { + if (machineName != null) { + return machineSounds.get(machineName); + } + return null; + } + + public static String getMachineName(ItemStack stack) { + int length = stack.getUnlocalizedName() + .length(); + return stack.getUnlocalizedName() + .substring(17, length - 8); // trim "gt.blockmachines." and ".tier.xx" + } +} diff --git a/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java b/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java index aa983a5804..50cad72f9c 100644 --- a/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java +++ b/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java @@ -1,6 +1,6 @@ package gregtech.api.util; -import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE; +import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE; import static gtPlusPlus.api.recipe.GTPPRecipeMaps.semiFluidFuels; import java.util.HashMap; @@ -9,7 +9,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.recipe.RecipeMaps; import gtPlusPlus.api.objects.Logger; import gtPlusPlus.api.objects.data.Pair; @@ -23,9 +23,9 @@ public class SemiFluidFuelHandler { final FluidStack aHeavyOil = FluidUtils.getFluidStack("liquid_heavy_oil", 1000); final HashMap> aFoundFluidsFromItems = new HashMap<>(); // Find Fluids From items - for (final GT_Recipe r : RecipeMaps.denseLiquidFuels.getAllRecipes()) { + for (final GTRecipe r : RecipeMaps.denseLiquidFuels.getAllRecipes()) { - GT_Recipe g = r.copy(); + GTRecipe g = r.copy(); if (g != null && g.mEnabled && g.mInputs.length > 0 && g.mInputs[0] != null) { for (ItemStack i : g.mInputs) { @@ -71,7 +71,7 @@ public class SemiFluidFuelHandler { if (aFuelValue <= (128 * 3)) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .fluidInputs(p.getKey()) .duration(0) .eut(0) diff --git a/src/main/java/gregtech/api/util/VoidProtectionHelper.java b/src/main/java/gregtech/api/util/VoidProtectionHelper.java index fdf47d06df..cf98e26b66 100644 --- a/src/main/java/gregtech/api/util/VoidProtectionHelper.java +++ b/src/main/java/gregtech/api/util/VoidProtectionHelper.java @@ -397,7 +397,7 @@ public class VoidProtectionHelper { int tSlotsFree = 0; int index = 0; for (ItemStack tItem : itemOutputs) { - // GT_RecipeBuilder doesn't handle null item output + // GTRecipeBuilder doesn't handle null item output if (tItem == null) continue; int itemStackSize = (int) (tItem.stackSize * outputMultiplier * Math.ceil(chanceMultiplier * chanceGetter.apply(index++) / 10000)); diff --git a/src/main/java/gregtech/api/util/item/ItemHolder.java b/src/main/java/gregtech/api/util/item/ItemHolder.java index 4675d0ba0e..51215c93cb 100644 --- a/src/main/java/gregtech/api/util/item/ItemHolder.java +++ b/src/main/java/gregtech/api/util/item/ItemHolder.java @@ -11,7 +11,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class ItemHolder { @@ -67,7 +67,7 @@ public class ItemHolder { @Override public int hashCode() { - return GT_Utility.stackToInt(toStack()); + return GTUtility.stackToInt(toStack()); } @Nonnull diff --git a/src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java b/src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java index 590c104101..485ee991c5 100644 --- a/src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java +++ b/src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java @@ -12,7 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.api.util.item.ItemHolder; public class RecipeInputRequirements { @@ -24,7 +24,7 @@ public class RecipeInputRequirements { protected Set fluidInputsMet = new HashSet<>(); protected boolean metAllFluid = false; - public RecipeInputRequirements(@Nonnull GT_Recipe recipe) { + public RecipeInputRequirements(@Nonnull GTRecipe recipe) { this(recipe.mInputs, recipe.mFluidInputs); } @@ -42,7 +42,7 @@ public class RecipeInputRequirements { } /** - * + * * @param itemInputs we have and want to fill this request * @return {@code true} when all item inputs are met */ @@ -59,7 +59,7 @@ public class RecipeInputRequirements { } /** - * + * * @param fluidInputs we have and want to fill this request * @return {@code true} when all fluid inputs are met */ diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java index 0194afbc04..10684f5848 100644 --- a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java +++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java @@ -1,7 +1,7 @@ package gregtech.api.util.shutdown; -import static gregtech.api.util.GT_ModHandler.getWater; -import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.api.util.GTModHandler.getWater; +import static gregtech.api.util.GTUtility.formatNumbers; import java.util.Objects; diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java index 8f51bd83b2..f512e2fa84 100644 --- a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java +++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java @@ -1,6 +1,6 @@ package gregtech.api.util.shutdown; -import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.api.util.GTUtility.formatNumbers; import java.util.Objects; diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java index 72a75b062f..288c733a90 100644 --- a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java +++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java @@ -1,6 +1,6 @@ package gregtech.api.util.shutdown; -import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.api.util.GTUtility.formatNumbers; import java.util.Objects; diff --git a/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java b/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java index 298c5db237..1cdfb60ddb 100644 --- a/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java +++ b/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java @@ -1,6 +1,6 @@ package gregtech.api.util.shutdown; -import static gregtech.api.util.GT_ModHandler.getWater; +import static gregtech.api.util.GTModHandler.getWater; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/gregtech/api/world/GTWorldgen.java b/src/main/java/gregtech/api/world/GTWorldgen.java new file mode 100644 index 0000000000..da3a66ef7e --- /dev/null +++ b/src/main/java/gregtech/api/world/GTWorldgen.java @@ -0,0 +1,123 @@ +package gregtech.api.world; + +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraftforge.common.DimensionManager; + +import gregtech.common.WorldgenGTOreLayer; +import gregtech.common.WorldgenGTOreSmallPieces; + +public abstract class GTWorldgen { + + public final String mWorldGenName; + public final boolean mEnabled; + private final Map mDimensionMap = new ConcurrentHashMap<>(); + + @SuppressWarnings({ "unchecked", "rawtypes" }) // The adding of "this" needs a List which does not exist + public GTWorldgen(String aName, List aList, boolean aDefault) { + mWorldGenName = aName; + mEnabled = aDefault; + if (mEnabled) aList.add(this); + } + + /** + * @param aWorld The World Object + * @param aRandom The Random Generator to use + * @param aBiome The Name of the Biome (always != null) + * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End + * @param aChunkX xCoord of the Chunk + * @param aChunkZ zCoord of the Chunk + * @return if the Worldgeneration has been successfully completed + */ + public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, + int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { + return false; + } + + public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, + int aChunkZ, int seedX, int seedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { + return 4; // This is for the empty Orevein + } + + /** + * + * @param aDimName The Dimension Name + * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End + * @param aAllowedDimensionType The Type of allowed Worldgeneration + * @return if generation for this world is allowed for MoronTech (tm) OreGen (ATM (2.0.3.1Dev) only End, Nether, + * Overworld, Twilight Forest and Deep Dark) + */ + public boolean isGenerationAllowed(String aDimName, int aDimensionType, int aAllowedDimensionType) { + if (aDimName.equalsIgnoreCase("Underdark")) { + return false; + } + if (!(aDimName.equalsIgnoreCase("Overworld") || aDimName.equalsIgnoreCase("Nether") + || aDimName.equalsIgnoreCase("The End") + || aDimName.equalsIgnoreCase("Twilight Forest"))) return false; + + Boolean tAllowed = mDimensionMap.get(aDimName); + if (tAllowed == null) { + mDimensionMap.put(aDimName, aDimensionType == aAllowedDimensionType); + return aDimensionType == aAllowedDimensionType; + } + return tAllowed; + } + + public boolean isGenerationAllowed(World aWorld, int aAllowedDimensionType) { + World allowedWorld = DimensionManager.getWorld(aAllowedDimensionType); + if (allowedWorld != null && allowedWorld.provider != null) { + return isGenerationAllowed(aWorld, allowedWorld.provider.getClass()); + } else { + return aWorld.provider.dimensionId == aAllowedDimensionType; + } + } + + /** + * + * @param aWorld The World Object + * @param aAllowedDimensionTypes The Types of allowed Worldgeneration + * @return if generation for this world is allowed for MoronTech (tm) OreGen (ATM (2.0.3.1Dev) only End, Nether, + * Overworld, Twilight Forest and Deep Dark) + */ + public boolean isGenerationAllowed(World aWorld, Class... aAllowedDimensionTypes) { + String aDimName = aWorld.provider.getDimensionName(); + if (aDimName.equalsIgnoreCase("Underdark")) { + return false; + } + if (!(aDimName.equalsIgnoreCase("Overworld") || aDimName.equalsIgnoreCase("Nether") + || aDimName.equalsIgnoreCase("The End") + || aDimName.equalsIgnoreCase("Twilight Forest"))) return false; + + Boolean tAllowed = mDimensionMap.get(aDimName); + if (tAllowed == null) { + boolean value = false; + for (int i = 0; i < aAllowedDimensionTypes.length; i++) { + if (aAllowedDimensionTypes[i].isInstance(aWorld.provider)) { + value = true; + } + } + + // ugly, but idk how to do it better without hard depping on tf provider in ore constructors + if (this instanceof WorldgenGTOreSmallPieces ore) { + if (ore.twilightForest && aWorld.provider.dimensionId == 7) { + value = true; + } + } + + if (this instanceof WorldgenGTOreLayer ore) { + if (ore.twilightForest && aWorld.provider.dimensionId == 7) { + value = true; + } + } + + mDimensionMap.put(aDimName, value); + return value; + } + return tAllowed; + } +} diff --git a/src/main/java/gregtech/api/world/GT_Worldgen.java b/src/main/java/gregtech/api/world/GT_Worldgen.java deleted file mode 100644 index a3393324c2..0000000000 --- a/src/main/java/gregtech/api/world/GT_Worldgen.java +++ /dev/null @@ -1,123 +0,0 @@ -package gregtech.api.world; - -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.world.World; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraftforge.common.DimensionManager; - -import gregtech.common.GT_Worldgen_GT_Ore_Layer; -import gregtech.common.GT_Worldgen_GT_Ore_SmallPieces; - -public abstract class GT_Worldgen { - - public final String mWorldGenName; - public final boolean mEnabled; - private final Map mDimensionMap = new ConcurrentHashMap<>(); - - @SuppressWarnings({ "unchecked", "rawtypes" }) // The adding of "this" needs a List which does not exist - public GT_Worldgen(String aName, List aList, boolean aDefault) { - mWorldGenName = aName; - mEnabled = aDefault; - if (mEnabled) aList.add(this); - } - - /** - * @param aWorld The World Object - * @param aRandom The Random Generator to use - * @param aBiome The Name of the Biome (always != null) - * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End - * @param aChunkX xCoord of the Chunk - * @param aChunkZ zCoord of the Chunk - * @return if the Worldgeneration has been successfully completed - */ - public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, - int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { - return false; - } - - public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, - int aChunkZ, int seedX, int seedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { - return 4; // This is for the empty Orevein - } - - /** - * - * @param aDimName The Dimension Name - * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End - * @param aAllowedDimensionType The Type of allowed Worldgeneration - * @return if generation for this world is allowed for MoronTech (tm) OreGen (ATM (2.0.3.1Dev) only End, Nether, - * Overworld, Twilight Forest and Deep Dark) - */ - public boolean isGenerationAllowed(String aDimName, int aDimensionType, int aAllowedDimensionType) { - if (aDimName.equalsIgnoreCase("Underdark")) { - return false; - } - if (!(aDimName.equalsIgnoreCase("Overworld") || aDimName.equalsIgnoreCase("Nether") - || aDimName.equalsIgnoreCase("The End") - || aDimName.equalsIgnoreCase("Twilight Forest"))) return false; - - Boolean tAllowed = mDimensionMap.get(aDimName); - if (tAllowed == null) { - mDimensionMap.put(aDimName, aDimensionType == aAllowedDimensionType); - return aDimensionType == aAllowedDimensionType; - } - return tAllowed; - } - - public boolean isGenerationAllowed(World aWorld, int aAllowedDimensionType) { - World allowedWorld = DimensionManager.getWorld(aAllowedDimensionType); - if (allowedWorld != null && allowedWorld.provider != null) { - return isGenerationAllowed(aWorld, allowedWorld.provider.getClass()); - } else { - return aWorld.provider.dimensionId == aAllowedDimensionType; - } - } - - /** - * - * @param aWorld The World Object - * @param aAllowedDimensionTypes The Types of allowed Worldgeneration - * @return if generation for this world is allowed for MoronTech (tm) OreGen (ATM (2.0.3.1Dev) only End, Nether, - * Overworld, Twilight Forest and Deep Dark) - */ - public boolean isGenerationAllowed(World aWorld, Class... aAllowedDimensionTypes) { - String aDimName = aWorld.provider.getDimensionName(); - if (aDimName.equalsIgnoreCase("Underdark")) { - return false; - } - if (!(aDimName.equalsIgnoreCase("Overworld") || aDimName.equalsIgnoreCase("Nether") - || aDimName.equalsIgnoreCase("The End") - || aDimName.equalsIgnoreCase("Twilight Forest"))) return false; - - Boolean tAllowed = mDimensionMap.get(aDimName); - if (tAllowed == null) { - boolean value = false; - for (int i = 0; i < aAllowedDimensionTypes.length; i++) { - if (aAllowedDimensionTypes[i].isInstance(aWorld.provider)) { - value = true; - } - } - - // ugly, but idk how to do it better without hard depping on tf provider in ore constructors - if (this instanceof GT_Worldgen_GT_Ore_SmallPieces ore) { - if (ore.twilightForest && aWorld.provider.dimensionId == 7) { - value = true; - } - } - - if (this instanceof GT_Worldgen_GT_Ore_Layer ore) { - if (ore.twilightForest && aWorld.provider.dimensionId == 7) { - value = true; - } - } - - mDimensionMap.put(aDimName, value); - return value; - } - return tAllowed; - } -} diff --git a/src/main/java/gregtech/asm/GTCorePlugin.java b/src/main/java/gregtech/asm/GTCorePlugin.java index 0f50b78f1d..1d44fb9017 100644 --- a/src/main/java/gregtech/asm/GTCorePlugin.java +++ b/src/main/java/gregtech/asm/GTCorePlugin.java @@ -7,21 +7,20 @@ import java.util.Set; import net.minecraftforge.common.config.Configuration; -import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler; import com.gtnewhorizon.gtnhmixins.IEarlyMixinLoader; +import bartworks.common.configs.ConfigHandler; import cpw.mods.fml.relauncher.FMLInjectionData; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import gregtech.mixin.Mixin; -import gtPlusPlus.preloader.CORE_Preloader; +import gtPlusPlus.preloader.PreloaderCore; import gtPlusPlus.preloader.asm.AsmConfig; -import gtPlusPlus.preloader.asm.Preloader_DummyContainer; +import gtPlusPlus.preloader.asm.PreloaderDummyContainer; import gtPlusPlus.preloader.asm.transformers.Preloader_Transformer_Handler; @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", "gtPlusPlus.preloader", - "gregtech.asm" }) +@IFMLLoadingPlugin.TransformerExclusions({ "bartworks.ASM", "gtPlusPlus.preloader", "gregtech.asm" }) @IFMLLoadingPlugin.Name("GregTech 5 Unofficial core plugin") @SuppressWarnings("unused") // loaded by FML public class GTCorePlugin implements IFMLLoadingPlugin, IEarlyMixinLoader { @@ -44,7 +43,7 @@ public class GTCorePlugin implements IFMLLoadingPlugin, IEarlyMixinLoader { @Override public String getModContainerClass() { - return Preloader_DummyContainer.class.getName(); + return PreloaderDummyContainer.class.getName(); } @Override @@ -55,12 +54,12 @@ public class GTCorePlugin implements IFMLLoadingPlugin, IEarlyMixinLoader { @Override public void injectData(Map data) { // GT++ - CORE_Preloader.DEV_ENVIRONMENT = !(boolean) data.get("runtimeDeobfuscationEnabled"); + PreloaderCore.DEV_ENVIRONMENT = !(boolean) data.get("runtimeDeobfuscationEnabled"); File mcDir = (File) data.get("mcLocation"); if (mcDir != null && mcDir.exists()) { - CORE_Preloader.setMinecraftDirectory(mcDir); + PreloaderCore.setMinecraftDirectory(mcDir); } - CORE_Preloader.DEBUG_MODE = AsmConfig.debugMode; + PreloaderCore.DEBUG_MODE = AsmConfig.debugMode; } @Override diff --git a/src/main/java/gregtech/client/GTGUIClientConfig.java b/src/main/java/gregtech/client/GTGUIClientConfig.java new file mode 100644 index 0000000000..e210f6f25f --- /dev/null +++ b/src/main/java/gregtech/client/GTGUIClientConfig.java @@ -0,0 +1,29 @@ +package gregtech.client; + +import static gregtech.api.enums.Mods.GregTech; + +import net.minecraft.client.gui.GuiScreen; + +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhlib.config.SimpleGuiConfig; + +import gregtech.common.config.client.ConfigColorModulation; +import gregtech.common.config.client.ConfigInterface; +import gregtech.common.config.client.ConfigPreference; +import gregtech.common.config.client.ConfigRender; +import gregtech.common.config.client.ConfigWaila; + +public class GTGUIClientConfig extends SimpleGuiConfig { + + public GTGUIClientConfig(GuiScreen parentScreen) throws ConfigException { + super( + parentScreen, + GregTech.ID, + "GregTech", + ConfigColorModulation.class, + ConfigInterface.class, + ConfigPreference.class, + ConfigRender.class, + ConfigWaila.class); + } +} diff --git a/src/main/java/gregtech/client/GTGuiFactory.java b/src/main/java/gregtech/client/GTGuiFactory.java new file mode 100644 index 0000000000..e8749f20d2 --- /dev/null +++ b/src/main/java/gregtech/client/GTGuiFactory.java @@ -0,0 +1,13 @@ +package gregtech.client; + +import net.minecraft.client.gui.GuiScreen; + +import com.gtnewhorizon.gtnhlib.config.SimpleGuiFactory; + +public class GTGuiFactory implements SimpleGuiFactory { + + @Override + public Class mainConfigGuiClass() { + return GTGUIClientConfig.class; + } +} diff --git a/src/main/java/gregtech/client/GTSoundLoop.java b/src/main/java/gregtech/client/GTSoundLoop.java new file mode 100644 index 0000000000..23569a83e4 --- /dev/null +++ b/src/main/java/gregtech/client/GTSoundLoop.java @@ -0,0 +1,80 @@ +package gregtech.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.MovingSound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.multitileentity.machine.MultiTileBasicMachine; + +@SideOnly(Side.CLIENT) +public class GTSoundLoop extends MovingSound { + + private static final float VOLUME_RAMP = 0.0625f; + private final boolean whileActive; + private final boolean whileInactive; + private final int worldID; + private boolean fadeMe = false; + + public GTSoundLoop(ResourceLocation p_i45104_1_, IGregTechTileEntity base, boolean stopWhenActive, + boolean stopWhenInactive) { + super(p_i45104_1_); + this.whileActive = stopWhenActive; + this.whileInactive = stopWhenInactive; + xPosF = base.getXCoord(); + yPosF = base.getYCoord(); + zPosF = base.getZCoord(); + worldID = base.getWorld().provider.dimensionId; + repeat = true; + volume = VOLUME_RAMP; + } + + public GTSoundLoop(ResourceLocation sound, MultiTileBasicMachine base, boolean stopWhenActive, + boolean stopWhenInactive) { + super(sound); + this.whileActive = stopWhenActive; + this.whileInactive = stopWhenInactive; + xPosF = base.getXCoord(); + yPosF = base.getYCoord(); + zPosF = base.getZCoord(); + worldID = base.getWorld().provider.dimensionId; + repeat = true; + volume = VOLUME_RAMP; + } + + @Override + public void update() { + if (donePlaying) { + return; + } + if (fadeMe) { + volume -= VOLUME_RAMP; + if (volume <= 0) { + volume = 0; + donePlaying = true; + } + } else if (volume < 1) { + volume += VOLUME_RAMP; + } + World world = Minecraft.getMinecraft().thePlayer.worldObj; + donePlaying = world.provider.dimensionId != worldID + || !world.checkChunksExist((int) xPosF, (int) yPosF, (int) zPosF, (int) xPosF, (int) yPosF, (int) zPosF); + if (donePlaying) return; + TileEntity tile = world.getTileEntity((int) xPosF, (int) yPosF, (int) zPosF); + if ((tile instanceof IGregTechTileEntity)) { + fadeMe |= ((IGregTechTileEntity) tile).isActive() ? whileActive : whileInactive; + return; + } + + if ((tile instanceof MultiTileBasicMachine)) { + fadeMe |= ((MultiTileBasicMachine) tile).isActive() ? whileActive : whileInactive; + return; + } + + donePlaying = true; + } +} diff --git a/src/main/java/gregtech/client/GTTooltipHandler.java b/src/main/java/gregtech/client/GTTooltipHandler.java new file mode 100644 index 0000000000..7236550058 --- /dev/null +++ b/src/main/java/gregtech/client/GTTooltipHandler.java @@ -0,0 +1,195 @@ +package gregtech.client; + +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.AQUA; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BLUE; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BOLD; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_BLUE; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_GRAY; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_GREEN; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_PURPLE; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_RED; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GOLD; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GRAY; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GREEN; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.LIGHT_PURPLE; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.OBFUSCATED; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.RED; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.UNDERLINE; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.WHITE; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.YELLOW; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.addItemTooltip; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.animatedText; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.chain; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.text; + +import java.util.function.Supplier; + +import net.minecraft.item.ItemStack; + +public class GTTooltipHandler { + + public static void registerTieredTooltip(ItemStack item, Tier tier) { + addItemTooltip(item, tier.tooltip); + } + + public enum Tier { + + ULV(text(WHITE + "ULV-Tier")), + LV(text(GRAY + "LV-Tier")), + MV(text(GOLD + "MV-Tier")), + HV(text(YELLOW + "HV-Tier")), + EV(text(DARK_GRAY + "EV-Tier")), + IV(text(GREEN + "IV-Tier")), + LuV(text(LIGHT_PURPLE + "LuV-Tier")), + ZPM(text(AQUA + "ZPM-Tier")), + UV(text(DARK_GREEN + "UV-Tier")), + UHV(text(DARK_RED + "UHV-Tier")), + UEV(text(DARK_PURPLE + "UEV-Tier")), + UIV(text(DARK_BLUE + BOLD + "UIV-Tier")), + UMV(text(RED + BOLD + UNDERLINE + "UMV-Tier")), + UXV(animatedText("UXV-Tier", 1, 100, DARK_PURPLE + BOLD + UNDERLINE, DARK_RED + UNDERLINE + BOLD)), + MAX(chain( + animatedText( + "X", + 1, + 100, + LIGHT_PURPLE + BOLD + OBFUSCATED + UNDERLINE, + RED + BOLD + OBFUSCATED + UNDERLINE, + GOLD + OBFUSCATED + BOLD + UNDERLINE, + YELLOW + OBFUSCATED + BOLD + UNDERLINE, + GREEN + OBFUSCATED + BOLD + UNDERLINE, + AQUA + OBFUSCATED + BOLD + UNDERLINE, + BLUE + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "MAX-Tier", + 1, + 100, + RED + BOLD + UNDERLINE, + GOLD + BOLD + UNDERLINE, + YELLOW + BOLD + UNDERLINE, + GREEN + BOLD + UNDERLINE, + AQUA + BOLD + UNDERLINE, + BLUE + BOLD + UNDERLINE, + LIGHT_PURPLE + BOLD + UNDERLINE), + animatedText( + "X", + 1, + 100, + GOLD + OBFUSCATED + BOLD + UNDERLINE, + YELLOW + OBFUSCATED + BOLD + UNDERLINE, + GREEN + OBFUSCATED + BOLD + UNDERLINE, + AQUA + OBFUSCATED + BOLD + UNDERLINE, + BLUE + OBFUSCATED + BOLD + UNDERLINE, + LIGHT_PURPLE + OBFUSCATED + BOLD + UNDERLINE, + RED + OBFUSCATED + BOLD + UNDERLINE))), + ERV(chain( + animatedText( + "E", + 1, + 100, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "R", + 1, + 100, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "R", + 1, + 200, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "O", + 1, + 150, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "R", + 1, + 150, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "-", + 1, + 150, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "T", + 1, + 200, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "i", + 1, + 100, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "e", + 1, + 150, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), + animatedText( + "r", + 1, + 100, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_RED + BOLD + UNDERLINE, + DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE))); + + private final Supplier tooltip; + + Tier(Supplier tooltip) { + this.tooltip = tooltip; + } + } +} diff --git a/src/main/java/gregtech/client/GT_GUI_ClientConfig.java b/src/main/java/gregtech/client/GT_GUI_ClientConfig.java deleted file mode 100644 index dfb4b2800c..0000000000 --- a/src/main/java/gregtech/client/GT_GUI_ClientConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package gregtech.client; - -import static gregtech.api.enums.Mods.GregTech; - -import net.minecraft.client.gui.GuiScreen; - -import com.gtnewhorizon.gtnhlib.config.ConfigException; -import com.gtnewhorizon.gtnhlib.config.SimpleGuiConfig; - -import gregtech.common.config.client.ConfigColorModulation; -import gregtech.common.config.client.ConfigInterface; -import gregtech.common.config.client.ConfigPreference; -import gregtech.common.config.client.ConfigRender; -import gregtech.common.config.client.ConfigWaila; - -public class GT_GUI_ClientConfig extends SimpleGuiConfig { - - public GT_GUI_ClientConfig(GuiScreen parentScreen) throws ConfigException { - super( - parentScreen, - GregTech.ID, - "GregTech", - ConfigColorModulation.class, - ConfigInterface.class, - ConfigPreference.class, - ConfigRender.class, - ConfigWaila.class); - } -} diff --git a/src/main/java/gregtech/client/GT_GuiFactory.java b/src/main/java/gregtech/client/GT_GuiFactory.java deleted file mode 100644 index ecf317a6fa..0000000000 --- a/src/main/java/gregtech/client/GT_GuiFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package gregtech.client; - -import net.minecraft.client.gui.GuiScreen; - -import com.gtnewhorizon.gtnhlib.config.SimpleGuiFactory; - -public class GT_GuiFactory implements SimpleGuiFactory { - - @Override - public Class mainConfigGuiClass() { - return GT_GUI_ClientConfig.class; - } -} diff --git a/src/main/java/gregtech/client/GT_SoundLoop.java b/src/main/java/gregtech/client/GT_SoundLoop.java deleted file mode 100644 index 905f2c20d3..0000000000 --- a/src/main/java/gregtech/client/GT_SoundLoop.java +++ /dev/null @@ -1,80 +0,0 @@ -package gregtech.client; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.MovingSound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.multitileentity.machine.MultiTileBasicMachine; - -@SideOnly(Side.CLIENT) -public class GT_SoundLoop extends MovingSound { - - private static final float VOLUME_RAMP = 0.0625f; - private final boolean whileActive; - private final boolean whileInactive; - private final int worldID; - private boolean fadeMe = false; - - public GT_SoundLoop(ResourceLocation p_i45104_1_, IGregTechTileEntity base, boolean stopWhenActive, - boolean stopWhenInactive) { - super(p_i45104_1_); - this.whileActive = stopWhenActive; - this.whileInactive = stopWhenInactive; - xPosF = base.getXCoord(); - yPosF = base.getYCoord(); - zPosF = base.getZCoord(); - worldID = base.getWorld().provider.dimensionId; - repeat = true; - volume = VOLUME_RAMP; - } - - public GT_SoundLoop(ResourceLocation sound, MultiTileBasicMachine base, boolean stopWhenActive, - boolean stopWhenInactive) { - super(sound); - this.whileActive = stopWhenActive; - this.whileInactive = stopWhenInactive; - xPosF = base.getXCoord(); - yPosF = base.getYCoord(); - zPosF = base.getZCoord(); - worldID = base.getWorld().provider.dimensionId; - repeat = true; - volume = VOLUME_RAMP; - } - - @Override - public void update() { - if (donePlaying) { - return; - } - if (fadeMe) { - volume -= VOLUME_RAMP; - if (volume <= 0) { - volume = 0; - donePlaying = true; - } - } else if (volume < 1) { - volume += VOLUME_RAMP; - } - World world = Minecraft.getMinecraft().thePlayer.worldObj; - donePlaying = world.provider.dimensionId != worldID - || !world.checkChunksExist((int) xPosF, (int) yPosF, (int) zPosF, (int) xPosF, (int) yPosF, (int) zPosF); - if (donePlaying) return; - TileEntity tile = world.getTileEntity((int) xPosF, (int) yPosF, (int) zPosF); - if ((tile instanceof IGregTechTileEntity)) { - fadeMe |= ((IGregTechTileEntity) tile).isActive() ? whileActive : whileInactive; - return; - } - - if ((tile instanceof MultiTileBasicMachine)) { - fadeMe |= ((MultiTileBasicMachine) tile).isActive() ? whileActive : whileInactive; - return; - } - - donePlaying = true; - } -} diff --git a/src/main/java/gregtech/client/GT_TooltipHandler.java b/src/main/java/gregtech/client/GT_TooltipHandler.java deleted file mode 100644 index c527729abd..0000000000 --- a/src/main/java/gregtech/client/GT_TooltipHandler.java +++ /dev/null @@ -1,195 +0,0 @@ -package gregtech.client; - -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.AQUA; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BLUE; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BOLD; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_BLUE; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_GRAY; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_GREEN; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_PURPLE; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_RED; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GOLD; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GRAY; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GREEN; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.LIGHT_PURPLE; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.OBFUSCATED; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.RED; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.UNDERLINE; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.WHITE; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.YELLOW; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.addItemTooltip; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.animatedText; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.chain; -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.text; - -import java.util.function.Supplier; - -import net.minecraft.item.ItemStack; - -public class GT_TooltipHandler { - - public static void registerTieredTooltip(ItemStack item, Tier tier) { - addItemTooltip(item, tier.tooltip); - } - - public enum Tier { - - ULV(text(WHITE + "ULV-Tier")), - LV(text(GRAY + "LV-Tier")), - MV(text(GOLD + "MV-Tier")), - HV(text(YELLOW + "HV-Tier")), - EV(text(DARK_GRAY + "EV-Tier")), - IV(text(GREEN + "IV-Tier")), - LuV(text(LIGHT_PURPLE + "LuV-Tier")), - ZPM(text(AQUA + "ZPM-Tier")), - UV(text(DARK_GREEN + "UV-Tier")), - UHV(text(DARK_RED + "UHV-Tier")), - UEV(text(DARK_PURPLE + "UEV-Tier")), - UIV(text(DARK_BLUE + BOLD + "UIV-Tier")), - UMV(text(RED + BOLD + UNDERLINE + "UMV-Tier")), - UXV(animatedText("UXV-Tier", 1, 100, DARK_PURPLE + BOLD + UNDERLINE, DARK_RED + UNDERLINE + BOLD)), - MAX(chain( - animatedText( - "X", - 1, - 100, - LIGHT_PURPLE + BOLD + OBFUSCATED + UNDERLINE, - RED + BOLD + OBFUSCATED + UNDERLINE, - GOLD + OBFUSCATED + BOLD + UNDERLINE, - YELLOW + OBFUSCATED + BOLD + UNDERLINE, - GREEN + OBFUSCATED + BOLD + UNDERLINE, - AQUA + OBFUSCATED + BOLD + UNDERLINE, - BLUE + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "MAX-Tier", - 1, - 100, - RED + BOLD + UNDERLINE, - GOLD + BOLD + UNDERLINE, - YELLOW + BOLD + UNDERLINE, - GREEN + BOLD + UNDERLINE, - AQUA + BOLD + UNDERLINE, - BLUE + BOLD + UNDERLINE, - LIGHT_PURPLE + BOLD + UNDERLINE), - animatedText( - "X", - 1, - 100, - GOLD + OBFUSCATED + BOLD + UNDERLINE, - YELLOW + OBFUSCATED + BOLD + UNDERLINE, - GREEN + OBFUSCATED + BOLD + UNDERLINE, - AQUA + OBFUSCATED + BOLD + UNDERLINE, - BLUE + OBFUSCATED + BOLD + UNDERLINE, - LIGHT_PURPLE + OBFUSCATED + BOLD + UNDERLINE, - RED + OBFUSCATED + BOLD + UNDERLINE))), - ERV(chain( - animatedText( - "E", - 1, - 100, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "R", - 1, - 100, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "R", - 1, - 200, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "O", - 1, - 150, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "R", - 1, - 150, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "-", - 1, - 150, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "T", - 1, - 200, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "i", - 1, - 100, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "e", - 1, - 150, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE), - animatedText( - "r", - 1, - 100, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_RED + BOLD + UNDERLINE, - DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE))); - - private final Supplier tooltip; - - Tier(Supplier tooltip) { - this.tooltip = tooltip; - } - } -} diff --git a/src/main/java/gregtech/common/GTClient.java b/src/main/java/gregtech/common/GTClient.java new file mode 100644 index 0000000000..e5af28dacd --- /dev/null +++ b/src/main/java/gregtech/common/GTClient.java @@ -0,0 +1,1073 @@ +// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +// Jad home page: http://www.kpdus.com/jad.html +// Decompiler options: packimports(3) +// Source File Name: GT_Client.java + +package gregtech.common; + +import static gregtech.api.enums.GTValues.calculateMaxPlasmaTurbineEfficiency; +import static gregtech.api.enums.Mods.Forestry; +import static gregtech.api.enums.Mods.GregTech; +import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; + +import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.function.Function; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.resources.IReloadableResourceManager; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import net.minecraftforge.client.event.sound.SoundSetupEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; + +import com.glodblock.github.nei.recipes.FluidRecipe; +import com.glodblock.github.nei.recipes.extractor.GregTech5RecipeExtractor; +import com.gtnewhorizon.structurelib.alignment.IAlignment; +import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; + +import appeng.api.util.IOrientable; +import appeng.tile.misc.TileInterface; +import codechicken.lib.vec.Rotation; +import codechicken.lib.vec.Scale; +import codechicken.lib.vec.Transformation; +import codechicken.lib.vec.Translation; +import cpw.mods.fml.client.event.ConfigChangedEvent; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.network.FMLNetworkEvent; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.gui.GUIColorOverride; +import gregtech.api.gui.modularui.FallbackableSteamTexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.ITurnable; +import gregtech.api.items.MetaGeneratedItem; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.metatileentity.MetaPipeEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; +import gregtech.api.net.GTPacketClientPreference; +import gregtech.api.objects.GTItemStack; +import gregtech.api.recipe.RecipeCategory; +import gregtech.api.util.ColorsMetadataSection; +import gregtech.api.util.ColorsMetadataSectionSerializer; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTClientPreference; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTMusicSystem; +import gregtech.api.util.GTPlayedSound; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder; +import gregtech.client.SeekingOggCodec; +import gregtech.common.blocks.BlockFrameBox; +import gregtech.common.blocks.ItemMachines; +import gregtech.common.render.DroneRender; +import gregtech.common.render.FlaskRenderer; +import gregtech.common.render.FluidDisplayStackRenderer; +import gregtech.common.render.GTCapeRenderer; +import gregtech.common.render.GTRendererBlock; +import gregtech.common.render.LaserRenderer; +import gregtech.common.render.MetaGeneratedToolRenderer; +import gregtech.common.render.MultiTileRenderer; +import gregtech.common.render.PollutionRenderer; +import gregtech.common.render.WormholeRenderer; +import gregtech.common.render.items.MetaGeneratedItemRenderer; +import gregtech.common.tileentities.debug.MTEAdvDebugStructureWriter; +import gregtech.loaders.ExtraIcons; +import gregtech.loaders.misc.GTBees; +import gregtech.loaders.preload.GTPreLoad; +import gregtech.nei.GTNEIConfig; +import ic2.api.tile.IWrenchable; +import paulscode.sound.SoundSystemConfig; +import paulscode.sound.SoundSystemException; + +// Referenced classes of package gregtech.common: +// GTProxy + +public class GTClient extends GTProxy implements Runnable { + + public static final String GTNH_CAPE_LIST_URL = "https://raw.githubusercontent.com/GTNewHorizons/CustomGTCapeHook-Cape-List/master/capes.txt"; + public static final String GT_CAPE_LIST_URL = "http://gregtech.overminddl1.com/com/gregoriust/gregtech/supporterlist.txt"; + private static final List ROTATABLE_VANILLA_BLOCKS; + + private static final int[][] GRID_SWITCH_TABLE = new int[][] { { 0, 5, 3, 1, 2, 4 }, { 5, 0, 1, 3, 2, 4 }, + { 1, 3, 0, 5, 2, 4 }, { 3, 1, 5, 0, 2, 4 }, { 4, 2, 3, 1, 0, 5 }, { 2, 4, 3, 1, 5, 0 }, }; + + // don't ask. these "just works" + private static final Transformation ROTATION_MARKER_TRANSFORM_CENTER = new Scale(0.5); + private static final Transformation[] ROTATION_MARKER_TRANSFORMS_SIDES_TRANSFORMS = { + new Scale(0.25).with(new Translation(0, 0, 0.375)) + .compile(), + new Scale(0.25).with(new Translation(0.375, 0, 0)) + .compile(), + new Scale(0.25).with(new Translation(0, 0, -0.375)) + .compile(), + new Scale(0.25).with(new Translation(-0.375, 0, 0)) + .compile(), }; + private static final int[] ROTATION_MARKER_TRANSFORMS_SIDES = { -1, -1, 2, 0, 3, 1, -1, -1, 0, 2, 3, 1, 0, 2, -1, + -1, 3, 1, 2, 0, -1, -1, 3, 1, 1, 3, 2, 0, -1, -1, 3, 1, 2, 0, -1, -1 }; + private static final Transformation[] ROTATION_MARKER_TRANSFORMS_CORNER = { + new Scale(0.25).with(new Translation(0.375, 0, 0.375)) + .compile(), + new Scale(0.25).with(new Translation(-0.375, 0, 0.375)) + .compile(), + new Scale(0.25).with(new Translation(0.375, 0, -0.375)) + .compile(), + new Scale(0.25).with(new Translation(-0.375, 0, -0.375)) + .compile(), }; + private static int rotationMarkerDisplayList; + private static boolean rotationMarkerDisplayListCompiled = false; + + static { + ROTATABLE_VANILLA_BLOCKS = Arrays.asList( + Blocks.piston, + Blocks.sticky_piston, + Blocks.furnace, + Blocks.lit_furnace, + Blocks.dropper, + Blocks.dispenser, + Blocks.chest, + Blocks.trapped_chest, + Blocks.ender_chest, + Blocks.hopper, + Blocks.pumpkin, + Blocks.lit_pumpkin); + } + + private final HashSet mCapeList = new HashSet<>(); + public static final PollutionRenderer mPollutionRenderer = new PollutionRenderer(); + private final GTCapeRenderer mCapeRenderer; + private final List mPosR; + private final List mPosG; + private final List mPosB; + private final List mPosA = Collections.emptyList(); + private final List mNegR; + private final List mNegG; + private final List mNegB; + private final List mNegA = Collections.emptyList(); + private final List mMoltenPosR; + private final List mMoltenPosG; + private final List mMoltenPosB; + private final List mMoltenPosA = Collections.emptyList(); + private final List mMoltenNegR; + private final List mMoltenNegG; + private final List mMoltenNegB; + private final List mMoltenNegA = Collections.emptyList(); + private long mAnimationTick; + /** + * This is the place to def the value used below + **/ + private long afterSomeTime; + + private boolean mAnimationDirection; + private GTClientPreference mPreference; + private boolean mFirstTick = false; + public static final int ROTATION_MARKER_RESOLUTION = 120; + private int mReloadCount; + private float renderTickTime; + public static MetaGeneratedItemRenderer metaGeneratedItemRenderer; + + public GTClient() { + mCapeRenderer = new GTCapeRenderer(mCapeList); + mAnimationTick = 0L; + mAnimationDirection = false; + mPosR = Arrays.asList( + Materials.Enderium, + Materials.Vinteum, + Materials.Uranium235, + Materials.InfusedGold, + Materials.Plutonium241, + Materials.NaquadahEnriched, + Materials.Naquadria, + Materials.InfusedOrder, + Materials.Force, + Materials.Pyrotheum, + Materials.Sunnarium, + Materials.Glowstone, + Materials.Thaumium, + Materials.InfusedVis, + Materials.InfusedAir, + Materials.InfusedFire, + Materials.FierySteel, + Materials.Firestone); + mPosG = Arrays.asList( + Materials.Enderium, + Materials.Vinteum, + Materials.Uranium235, + Materials.InfusedGold, + Materials.Plutonium241, + Materials.NaquadahEnriched, + Materials.Naquadria, + Materials.InfusedOrder, + Materials.Force, + Materials.Pyrotheum, + Materials.Sunnarium, + Materials.Glowstone, + Materials.InfusedAir, + Materials.InfusedEarth); + mPosB = Arrays.asList( + Materials.Enderium, + Materials.Vinteum, + Materials.Uranium235, + Materials.InfusedGold, + Materials.Plutonium241, + Materials.NaquadahEnriched, + Materials.Naquadria, + Materials.InfusedOrder, + Materials.InfusedVis, + Materials.InfusedWater, + Materials.Thaumium); + mNegR = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar); + mNegG = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar); + mNegB = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar); + mMoltenPosR = Arrays.asList( + Materials.Enderium, + Materials.NetherStar, + Materials.Vinteum, + Materials.Uranium235, + Materials.InfusedGold, + Materials.Plutonium241, + Materials.NaquadahEnriched, + Materials.Naquadria, + Materials.InfusedOrder, + Materials.Force, + Materials.Pyrotheum, + Materials.Sunnarium, + Materials.Glowstone, + Materials.Thaumium, + Materials.InfusedVis, + Materials.InfusedAir, + Materials.InfusedFire, + Materials.FierySteel, + Materials.Firestone); + mMoltenPosG = Arrays.asList( + Materials.Enderium, + Materials.NetherStar, + Materials.Vinteum, + Materials.Uranium235, + Materials.InfusedGold, + Materials.Plutonium241, + Materials.NaquadahEnriched, + Materials.Naquadria, + Materials.InfusedOrder, + Materials.Force, + Materials.Pyrotheum, + Materials.Sunnarium, + Materials.Glowstone, + Materials.InfusedAir, + Materials.InfusedEarth); + mMoltenPosB = Arrays.asList( + Materials.Enderium, + Materials.NetherStar, + Materials.Vinteum, + Materials.Uranium235, + Materials.InfusedGold, + Materials.Plutonium241, + Materials.NaquadahEnriched, + Materials.Naquadria, + Materials.InfusedOrder, + Materials.InfusedVis, + Materials.InfusedWater, + Materials.Thaumium); + mMoltenNegR = Collections.singletonList(Materials.InfusedEntropy); + mMoltenNegG = Collections.singletonList(Materials.InfusedEntropy); + mMoltenNegB = Collections.singletonList(Materials.InfusedEntropy); + } + + private static boolean checkedForChicken = false; + + private static void drawGrid(DrawBlockHighlightEvent aEvent, boolean showCoverConnections, boolean aIsWrench, + boolean aIsSneaking) { + if (!checkedForChicken) { + try { + Class.forName("codechicken.lib.vec.Rotation"); + } catch (ClassNotFoundException e) { + return; + } + checkedForChicken = true; + } + + GL11.glPushMatrix(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + // pause shader + int program = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + GL20.glUseProgram(0); + + MovingObjectPosition target = aEvent.target; + EntityPlayer player = aEvent.player; + double camX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) aEvent.partialTicks; + double camY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) aEvent.partialTicks; + double camZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) aEvent.partialTicks; + GL11.glTranslated(target.blockX - (int) camX, target.blockY - (int) camY, target.blockZ - (int) camZ); + GL11.glTranslated(0.5D - (camX - (int) camX), 0.5D - (camY - (int) camY), 0.5D - (camZ - (int) camZ)); + final int tSideHit = target.sideHit; + Rotation.sideRotations[tSideHit].glApply(); + // draw grid + GL11.glTranslated(0.0D, -0.502D, 0.0D); + GL11.glLineWidth(2.5F); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.5F); + GL11.glBegin(GL11.GL_LINES); + GL11.glVertex3d(+.50D, .0D, -.25D); + GL11.glVertex3d(-.50D, .0D, -.25D); + GL11.glVertex3d(+.50D, .0D, +.25D); + GL11.glVertex3d(-.50D, .0D, +.25D); + GL11.glVertex3d(+.25D, .0D, -.50D); + GL11.glVertex3d(+.25D, .0D, +.50D); + GL11.glVertex3d(-.25D, .0D, -.50D); + GL11.glVertex3d(-.25D, .0D, +.50D); + final TileEntity tTile = player.worldObj.getTileEntity(target.blockX, target.blockY, target.blockZ); + final Block block = player.worldObj.getBlock(target.blockX, target.blockY, target.blockZ); + final int meta = player.worldObj.getBlockMetadata(target.blockX, target.blockY, target.blockZ); + + // draw connection indicators + int tConnections = 0; + if (tTile instanceof ICoverable iCoverable) { + if (showCoverConnections) { + for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { + if (iCoverable.getCoverIDAtSide(tSide) != 0) tConnections |= tSide.flag; + } + } else if (tTile instanceof BaseMetaTileEntity baseMetaTile && baseMetaTile.getAlignment() == null) { + if (!aIsSneaking) tConnections |= baseMetaTile.getFrontFacing().flag; + else if (baseMetaTile.getMetaTileEntity() instanceof MTEBasicMachine basicMachine) { + tConnections |= basicMachine.mMainFacing.flag; + } + } else if (tTile instanceof BaseMetaPipeEntity pipeEntity) tConnections = pipeEntity.mConnections; + } else if (tTile instanceof IWrenchable wrenchable) { + tConnections |= ForgeDirection.getOrientation(wrenchable.getFacing()).flag; + } else if (ROTATABLE_VANILLA_BLOCKS.contains(block)) { + tConnections |= ForgeDirection.getOrientation(meta).flag; + } else if (tTile instanceof TileInterface tileInterface) tConnections |= tileInterface.getUp() + .getOpposite().flag; + + if (tConnections != 0) { + for (ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { + if ((tConnections & tSide.flag) != 0) { + switch (GRID_SWITCH_TABLE[target.sideHit][tSide.ordinal()]) { + case 0 -> { + GL11.glVertex3d(+.25D, .0D, +.25D); + GL11.glVertex3d(-.25D, .0D, -.25D); + GL11.glVertex3d(-.25D, .0D, +.25D); + GL11.glVertex3d(+.25D, .0D, -.25D); + } + case 1 -> { + GL11.glVertex3d(-.25D, .0D, +.50D); + GL11.glVertex3d(+.25D, .0D, +.25D); + GL11.glVertex3d(-.25D, .0D, +.25D); + GL11.glVertex3d(+.25D, .0D, +.50D); + } + case 2 -> { + GL11.glVertex3d(-.50D, .0D, -.25D); + GL11.glVertex3d(-.25D, .0D, +.25D); + GL11.glVertex3d(-.50D, .0D, +.25D); + GL11.glVertex3d(-.25D, .0D, -.25D); + } + case 3 -> { + GL11.glVertex3d(-.25D, .0D, -.50D); + GL11.glVertex3d(+.25D, .0D, -.25D); + GL11.glVertex3d(-.25D, .0D, -.25D); + GL11.glVertex3d(+.25D, .0D, -.50D); + } + case 4 -> { + GL11.glVertex3d(+.50D, .0D, -.25D); + GL11.glVertex3d(+.25D, .0D, +.25D); + GL11.glVertex3d(+.50D, .0D, +.25D); + GL11.glVertex3d(+.25D, .0D, -.25D); + } + case 5 -> { + GL11.glVertex3d(+.50D, .0D, +.50D); + GL11.glVertex3d(+.25D, .0D, +.25D); + GL11.glVertex3d(+.50D, .0D, +.25D); + GL11.glVertex3d(+.25D, .0D, +.50D); + GL11.glVertex3d(+.50D, .0D, -.50D); + GL11.glVertex3d(+.25D, .0D, -.25D); + GL11.glVertex3d(+.50D, .0D, -.25D); + GL11.glVertex3d(+.25D, .0D, -.50D); + GL11.glVertex3d(-.50D, .0D, +.50D); + GL11.glVertex3d(-.25D, .0D, +.25D); + GL11.glVertex3d(-.50D, .0D, +.25D); + GL11.glVertex3d(-.25D, .0D, +.50D); + GL11.glVertex3d(-.50D, .0D, -.50D); + GL11.glVertex3d(-.25D, .0D, -.25D); + GL11.glVertex3d(-.50D, .0D, -.25D); + GL11.glVertex3d(-.25D, .0D, -.50D); + } + } + } + } + } + GL11.glEnd(); + // draw turning indicator + Function getTransform = (ForgeDirection direction) -> { + try { + if (direction.ordinal() == tSideHit) return new Transformation[] { ROTATION_MARKER_TRANSFORM_CENTER }; + else if (direction.getOpposite() + .ordinal() == tSideHit) { + return ROTATION_MARKER_TRANSFORMS_CORNER; + } else { + return new Transformation[] { + ROTATION_MARKER_TRANSFORMS_SIDES_TRANSFORMS[ROTATION_MARKER_TRANSFORMS_SIDES[tSideHit * 6 + + direction.ordinal()]] }; + } + } catch (ArrayIndexOutOfBoundsException e) { + return new Transformation[] {}; + } + + }; + + if (aIsWrench && tTile instanceof IAlignmentProvider) { + final IAlignment tAlignment = ((IAlignmentProvider) (tTile)).getAlignment(); + if (tAlignment != null) { + for (var transform : getTransform.apply(tAlignment.getDirection())) { + drawExtendedRotationMarker(transform, aIsSneaking, tAlignment); + } + } + } + if (aIsWrench && tTile instanceof IOrientable orientable + && !(tTile instanceof TileInterface) + && orientable.canBeRotated()) { + for (var transform : getTransform.apply(aIsSneaking ? orientable.getForward() : orientable.getUp())) { + drawExtendedRotationMarker(transform, aIsSneaking, orientable); + } + } + GL20.glUseProgram(program); // resume shader + GL11.glPopMatrix(); // get back to player center + } + + private static void drawExtendedRotationMarker(Transformation transform, boolean sneaking, IAlignment alignment) { + if (sneaking) { + if (alignment.isFlipChangeAllowed()) { + drawFlipMarker(transform); + } + } else { + if (alignment.isRotationChangeAllowed()) { + drawRotationMarker(transform); + } + } + } + + private static void drawExtendedRotationMarker(Transformation transform, boolean sneaking, IOrientable orientable) { + drawRotationMarker(transform); + } + + private static void drawRotationMarker(Transformation transform) { + if (!rotationMarkerDisplayListCompiled) { + rotationMarkerDisplayList = GLAllocation.generateDisplayLists(1); + compileRotationMarkerDisplayList(rotationMarkerDisplayList); + rotationMarkerDisplayListCompiled = true; + } + GL11.glPushMatrix(); + transform.glApply(); + GL11.glCallList(rotationMarkerDisplayList); + GL11.glPopMatrix(); + } + + private static void compileRotationMarkerDisplayList(int displayList) { + GL11.glNewList(displayList, GL11.GL_COMPILE); + GL11.glBegin(GL_LINE_LOOP); + for (int i = 0; i <= ROTATION_MARKER_RESOLUTION; i++) { + GL11.glVertex3d( + Math.cos(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.4, + 0, + Math.sin(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.4); + } + for (int i = ROTATION_MARKER_RESOLUTION; i >= 0; i--) { + GL11.glVertex3d( + Math.cos(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.24, + 0, + Math.sin(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.24); + } + GL11.glVertex3d(0.141114561800, 0, 0); + GL11.glVertex3d(0.32, 0, -0.178885438199); + GL11.glVertex3d(0.498885438199, 0, 0); + GL11.glEnd(); + GL11.glEndList(); + } + + private static void drawFlipMarker(Transformation transform) { + GL11.glPushMatrix(); + transform.glApply(); + final Tessellator t = Tessellator.instance; + // right shape + GL11.glLineStipple(4, (short) 0xAAAA); + GL11.glEnable(GL11.GL_LINE_STIPPLE); + t.startDrawing(GL11.GL_LINE_STRIP); + t.addVertex(0.1d, 0d, 0.04d); + t.addVertex(0.1d, 0d, 0.2d); + t.addVertex(0.35d, 0d, 0.35d); + t.addVertex(0.35d, 0d, -0.35d); + t.addVertex(0.1d, 0d, -0.2d); + t.addVertex(0.1d, 0d, -0.04d); + t.draw(); + GL11.glDisable(GL11.GL_LINE_STIPPLE); + // left shape + t.startDrawing(GL11.GL_LINE_STRIP); + t.addVertex(-0.1d, 0d, 0.04d); + t.addVertex(-0.1d, 0d, 0.2d); + t.addVertex(-0.35d, 0d, 0.35d); + t.addVertex(-0.35d, 0d, -0.35d); + t.addVertex(-0.1d, 0d, -0.2d); + t.addVertex(-0.1d, 0d, -0.04d); + t.draw(); + // arrow + t.startDrawing(GL11.GL_LINE_LOOP); + t.addVertex(0.15d, 0d, -0.04d); + t.addVertex(0.15d, 0d, -0.1d); + t.addVertex(0.25d, 0d, 0.d); + t.addVertex(0.15d, 0d, 0.1d); + t.addVertex(0.15d, 0d, 0.04d); + t.addVertex(-0.15d, 0d, 0.04d); + t.addVertex(-0.15d, 0d, 0.1d); + t.addVertex(-0.25d, 0d, 0.d); + t.addVertex(-0.15d, 0d, -0.1d); + t.addVertex(-0.15d, 0d, -0.04d); + t.draw(); + GL11.glPopMatrix(); + } + + @Override + public boolean isServerSide() { + return true; + } + + @Override + public boolean isClientSide() { + return true; + } + + @Override + public boolean isBukkitSide() { + return false; + } + + @Override + public EntityPlayer getThePlayer() { + return Minecraft.getMinecraft().thePlayer; + } + + @Override + public int addArmor(String aPrefix) { + return RenderingRegistry.addNewArmourRendererPrefix(aPrefix); + } + + @Override + public void onPreLoad() { + super.onPreLoad(); + + MinecraftForge.EVENT_BUS.register(new ExtraIcons()); + Minecraft.getMinecraft() + .getResourcePackRepository().rprMetadataSerializer + .registerMetadataSectionType(new ColorsMetadataSectionSerializer(), ColorsMetadataSection.class); + + new MTEAdvDebugStructureWriter.ForgeEventHandler(); + + final String[] arr = { "renadi", "hanakocz", "MysteryDump", "Flaver4", "x_Fame", "Peluche321", + "Goshen_Ithilien", "manf", "Bimgo", "leagris", "IAmMinecrafter02", "Cerous", "Devilin_Pixy", "Bkarlsson87", + "BadAlchemy", "CaballoCraft", "melanclock", "Resursator", "demanzke", "AndrewAmmerlaan", "Deathlycraft", + "Jirajha", "Axlegear", "kei_kouma", "Dracion", "dungi", "Dorfschwein", "Zero Tw0", "mattiagraz85", + "sebastiank30", "Plem", "invultri", "grillo126", "malcanteth", "Malevolence_", "Nicholas_Manuel", "Sirbab", + "kehaan", "bpgames123", "semig0d", "9000bowser", "Sovereignty89", "Kris1432", "xander_cage_", "samuraijp", + "bsaa", "SpwnX", "tworf", "Kadah", "kanni", "Stute", "Hegik", "Onlyme", "t3hero", "Hotchi", "jagoly", + "Nullav", "BH5432", "Sibmer", "inceee", "foxxx0", "Hartok", "TMSama", "Shlnen", "Carsso", "zessirb", + "meep310", "Seldron", "yttr1um", "hohounk", "freebug", "Sylphio", "jmarler", "Saberawr", "r00teniy", + "Neonbeta", "yinscape", "voooon24", "Quintine", "peach774", "lepthymo", "bildeman", "Kremnari", "Aerosalo", + "OndraSter", "oscares91", "mr10movie", "Daxx367x2", "EGERTRONx", "aka13_404", "Abouttabs", "Johnstaal", + "djshiny99", "megatronp", "DZCreeper", "Kane_Hart", "Truculent", "vidplace7", "simon6689", "MomoNasty", + "UnknownXLV", "goreacraft", "Fluttermine", "Daddy_Cecil", "MrMaleficus", "TigersFangs", "cublikefoot", + "chainman564", "NikitaBuker", "Misha999777", "25FiveDetail", "AntiCivilBoy", "michaelbrady", + "xXxIceFirexXx", "Speedynutty68", "GarretSidzaka", "HallowCharm977", "mastermind1919", "The_Hypersonic", + "diamondguy2798", "zF4ll3nPr3d4t0r", "CrafterOfMines57", "XxELIT3xSNIP3RxX", "SuterusuKusanagi", + "xavier0014", "adamros", "alexbegt" }; + for (String tName : arr) { + mCapeList.add(tName.toLowerCase()); + } + new Thread(this).start(); + + mPollutionRenderer.preLoad(); + + mPreference = new GTClientPreference(); + + Materials.initClient(); + } + + @Override + public void onLoad() { + super.onLoad(); + GTRendererBlock.register(); + new MultiTileRenderer(); + new DroneRender(); + new LaserRenderer(); + new WormholeRenderer(); + + metaGeneratedItemRenderer = new MetaGeneratedItemRenderer(); + for (MetaGeneratedItem item : MetaGeneratedItem.sInstances.values()) { + metaGeneratedItemRenderer.registerItem(item); + } + if (Forestry.isModLoaded()) { + metaGeneratedItemRenderer.registerItem(GTBees.combs); + } + new MetaGeneratedToolRenderer(); + new FlaskRenderer(); + new FluidDisplayStackRenderer(); + MinecraftForge.EVENT_BUS.register(new GTNEIConfig()); + } + + @Override + public void onPostLoad() { + super.onPostLoad(); + + // reobf doesn't work with lambda, so this must be a class + // noinspection Convert2Lambda + ((IReloadableResourceManager) Minecraft.getMinecraft() + .getResourceManager()).registerReloadListener(new IResourceManagerReloadListener() { + + @Override + public void onResourceManagerReload(IResourceManager l) { + GUIColorOverride.onResourceManagerReload(); + FallbackableSteamTexture.reload(); + GregTechAPI.sCoverBehaviors.values() + .forEach(CoverBehaviorBase::reloadColorOverride); + } + }); + } + + @Override + public void onLoadComplete() { + super.onLoadComplete(); + for (RecipeCategory category : RecipeCategory.ALL_RECIPE_CATEGORIES.values()) { + if (category.recipeMap.getFrontend() + .getNEIProperties().registerNEI) { + FluidRecipe.addRecipeMap( + category.unlocalizedName, + new GregTech5RecipeExtractor( + category.unlocalizedName.equals("gt.recipe.scanner") + || category.unlocalizedName.equals("gt.recipe.fakeAssemblylineProcess"))); + } + } + } + + @SubscribeEvent + @SuppressWarnings("unused") // used by the event bus + public void onSoundSetup(SoundSetupEvent event) { + try { + SoundSystemConfig.setCodec(SeekingOggCodec.EXTENSION, SeekingOggCodec.class); + } catch (SoundSystemException e) { + throw new RuntimeException(e); + } + } + + @Override + public void run() { + GTLog.out.println("GTMod: Downloading Cape List."); + try (final Scanner tScanner = new Scanner(new URL(GT_CAPE_LIST_URL).openStream())) { + while (tScanner.hasNextLine()) { + this.mCapeList.add( + tScanner.nextLine() + .toLowerCase()); + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + GTLog.out.println("GT New Horizons: Downloading Cape List."); + try (final Scanner tScanner = new Scanner(new URL(GTNH_CAPE_LIST_URL).openStream())) { + while (tScanner.hasNextLine()) { + final String tName = tScanner.nextLine() + .toLowerCase(); + if (tName.contains(":")) { + if (!this.mCapeList.contains(tName.substring(0, tName.indexOf(":")))) { + this.mCapeList.add(tName); + } + } else { + this.mCapeList.add(tName); + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + @Override + @SubscribeEvent + public void onClientConnectedToServerEvent(FMLNetworkEvent.ClientConnectedToServerEvent aEvent) { + mFirstTick = true; + mReloadCount++; + GTMusicSystem.ClientSystem.reset(); + // For utility methods elsewhere. + calculateMaxPlasmaTurbineEfficiency(); + } + + @Override + public void reloadNEICache() { + mReloadCount++; + } + + @Override + public int getNEIReloadCount() { + return mReloadCount; + } + + @SubscribeEvent + public void receiveRenderSpecialsEvent(net.minecraftforge.client.event.RenderPlayerEvent.Specials.Pre aEvent) { + mCapeRenderer.receiveRenderSpecialsEvent(aEvent); + } + + @SubscribeEvent + public void onPlayerTickEventClient(TickEvent.PlayerTickEvent aEvent) { + if ((aEvent.side.isClient()) && (aEvent.phase == TickEvent.Phase.END) && (!aEvent.player.isDead)) { + if (mFirstTick) { + mFirstTick = false; + GTValues.NW.sendToServer(new GTPacketClientPreference(mPreference)); + + if (!Minecraft.getMinecraft() + .isSingleplayer()) { + GTModHandler.removeAllIC2Recipes(); + } + } + afterSomeTime++; + if (afterSomeTime >= 100L) { + afterSomeTime = 0; + } + for (Iterator> iterator = GTUtility.sPlayedSoundMap.entrySet() + .iterator(); iterator.hasNext();) { + Map.Entry tEntry = iterator.next(); + if (tEntry.getValue() < 0) { + iterator.remove(); + } else { + tEntry.setValue(tEntry.getValue() - 1); + } + } + if (!GregTechAPI.mServerStarted) GregTechAPI.mServerStarted = true; + } + } + + @SubscribeEvent + public void onConfigChange(ConfigChangedEvent.OnConfigChangedEvent e) { + if (GregTech.ID.equals(e.modID) && "kekztech/client".equals(e.configID)) { + // refresh client preference and send to server, since it's the only config we allow changing at runtime. + mPreference = new GTClientPreference(); + GTPreLoad.loadClientConfig(); + if (e.isWorldRunning) GTValues.NW.sendToServer(new GTPacketClientPreference(mPreference)); + } + } + + @SubscribeEvent + public void onDrawBlockHighlight(DrawBlockHighlightEvent aEvent) { + final Block aBlock = aEvent.player.worldObj + .getBlock(aEvent.target.blockX, aEvent.target.blockY, aEvent.target.blockZ); + final TileEntity aTileEntity = aEvent.player.worldObj + .getTileEntity(aEvent.target.blockX, aEvent.target.blockY, aEvent.target.blockZ); + + if (GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sWrenchList)) { + if (aTileEntity instanceof ITurnable || ROTATABLE_VANILLA_BLOCKS.contains(aBlock) + || aTileEntity instanceof IWrenchable + || (aTileEntity instanceof IOrientable orientable && orientable.canBeRotated()) + || (aBlock instanceof BlockFrameBox)) drawGrid(aEvent, false, true, aEvent.player.isSneaking()); + return; + } + + // If there is no tile entity and the block is a frame box block, still draw the grid if a cover is held + if (aTileEntity == null && aBlock instanceof BlockFrameBox) { + if (GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sCovers.keySet())) { + drawGrid(aEvent, true, false, aEvent.player.isSneaking()); + } + return; + } + + if (!(aTileEntity instanceof ICoverable)) return; + + if (aEvent.player.isSneaking() && aTileEntity instanceof IGregTechTileEntity gtEntity + && gtEntity.getMetaTileEntity() instanceof MetaPipeEntity) { + if (aEvent.currentItem != null && aEvent.currentItem.getItem() instanceof ItemMachines + && GregTechAPI.METATILEENTITIES[aEvent.currentItem.getItemDamage()] instanceof MetaPipeEntity) { + drawGrid(aEvent, false, false, false); + } + } + + if (GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sWireCutterList) + || GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sSolderingToolList) + || (GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sSoftHammerList) + && aTileEntity instanceof MultiBlockPart) && aEvent.player.isSneaking()) { + if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) + drawGrid(aEvent, false, false, aEvent.player.isSneaking()); + return; + } + + if ((aEvent.currentItem == null && aEvent.player.isSneaking()) + || GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sCrowbarList) + || GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sScrewdriverList)) { + if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) + for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { + if (((ICoverable) aTileEntity).getCoverIDAtSide(tSide) > 0) { + drawGrid(aEvent, true, false, true); + return; + } + } + return; + } + + if (GTUtility.isStackInList(aEvent.currentItem, GregTechAPI.sCovers.keySet())) { + if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) + drawGrid(aEvent, true, false, aEvent.player.isSneaking()); + } + + if (GTUtility.areStacksEqual(ItemList.Tool_Cover_Copy_Paste.get(1), aEvent.currentItem, true)) { + if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) + drawGrid(aEvent, true, false, aEvent.player.isSneaking()); + } + } + + @SubscribeEvent + public void receiveRenderEvent(net.minecraftforge.client.event.RenderPlayerEvent.Pre aEvent) { + if (GTUtility.getFullInvisibility(aEvent.entityPlayer)) { + aEvent.setCanceled(true); + } + } + + @SubscribeEvent + public void onRenderStart(cpw.mods.fml.common.gameevent.TickEvent.RenderTickEvent aEvent) { + if (aEvent.phase == TickEvent.Phase.START) { + renderTickTime = aEvent.renderTickTime; + } + } + + @SubscribeEvent + public void onClientTickEvent(cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent aEvent) { + if (aEvent.phase == cpw.mods.fml.common.gameevent.TickEvent.Phase.END) { + GTMusicSystem.ClientSystem.tick(); + + if (changeDetected > 0) changeDetected--; + final int newHideValue = shouldHeldItemHideThings(); + if (newHideValue != hideValue) { + hideValue = newHideValue; + changeDetected = 5; + } + mAnimationTick++; + if (mAnimationTick % 50L == 0L) { + mAnimationDirection = !mAnimationDirection; + } + final int tDirection = mAnimationDirection ? 1 : -1; + for (Materials tMaterial : mPosR) { + tMaterial.mRGBa[0] = getSafeRGBValue(tMaterial.mRGBa[0], tDirection); + } + + for (Materials tMaterial : mPosG) { + tMaterial.mRGBa[1] = getSafeRGBValue(tMaterial.mRGBa[1], tDirection); + } + + for (Materials tMaterial : mPosB) { + tMaterial.mRGBa[2] = getSafeRGBValue(tMaterial.mRGBa[2], tDirection); + } + + for (Materials tMaterial : mPosA) { + tMaterial.mRGBa[3] = getSafeRGBValue(tMaterial.mRGBa[3], tDirection); + } + + for (Materials tMaterial : mNegR) { + tMaterial.mRGBa[0] = getSafeRGBValue(tMaterial.mRGBa[0], -tDirection); + } + + for (Materials tMaterial : mNegG) { + tMaterial.mRGBa[1] = getSafeRGBValue(tMaterial.mRGBa[1], -tDirection); + } + + for (Materials tMaterial : mNegB) { + tMaterial.mRGBa[2] = getSafeRGBValue(tMaterial.mRGBa[2], -tDirection); + } + + for (Materials tMaterial : mNegA) { + tMaterial.mRGBa[3] = getSafeRGBValue(tMaterial.mRGBa[3], -tDirection); + } + + for (Materials tMaterial : mMoltenPosR) { + tMaterial.mMoltenRGBa[0] = getSafeRGBValue(tMaterial.mMoltenRGBa[0], tDirection); + } + + for (Materials tMaterial : mMoltenPosG) { + tMaterial.mMoltenRGBa[1] = getSafeRGBValue(tMaterial.mMoltenRGBa[1], tDirection); + } + + for (Materials tMaterial : mMoltenPosB) { + tMaterial.mMoltenRGBa[2] = getSafeRGBValue(tMaterial.mMoltenRGBa[2], tDirection); + } + + for (Materials tMaterial : mMoltenPosA) { + tMaterial.mMoltenRGBa[3] = getSafeRGBValue(tMaterial.mMoltenRGBa[3], tDirection); + } + + for (Materials tMaterial : mMoltenNegR) { + tMaterial.mMoltenRGBa[0] = getSafeRGBValue(tMaterial.mMoltenRGBa[0], -tDirection); + } + + for (Materials tMaterial : mMoltenNegG) { + tMaterial.mMoltenRGBa[1] = getSafeRGBValue(tMaterial.mMoltenRGBa[1], -tDirection); + } + + for (Materials tMaterial : mMoltenNegB) { + tMaterial.mMoltenRGBa[2] = getSafeRGBValue(tMaterial.mMoltenRGBa[2], -tDirection); + } + + for (Materials tMaterial : mMoltenNegA) { + tMaterial.mMoltenRGBa[3] = getSafeRGBValue(tMaterial.mMoltenRGBa[3], -tDirection); + } + } + } + + public short getSafeRGBValue(short aRBG, int aDelta) { + int tmp = aRBG + aDelta; + if (tmp > 255) tmp = 255; + if (tmp < 0) tmp = 0; + return (short) tmp; + } + + @Override + public long getAnimationTicks() { + return mAnimationTick; + } + + @Override + public float getPartialRenderTicks() { + return renderTickTime; + } + + @Override + public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) { + if (GTUtility.isStackInvalid(aStack)) return; + String tString = SoundResource.NOTE_HARP.toString(); + int i = 0; + int j = mSoundItems.size(); + do { + if (i >= j) break; + if (GTUtility.areStacksEqual(mSoundItems.get(i), aStack)) { + tString = mSoundNames.get(i); + break; + } + i++; + } while (true); + if (tString.startsWith(SoundResource.RANDOM_EXPLODE.toString())) + if (aStack.stackSize == 3) tString = SoundResource.RANDOM_FUSE.toString(); + else if (aStack.stackSize == 2) tString = "random.old_explode"; + if (tString.startsWith("streaming.")) tString = switch (aStack.stackSize) { + case 1 -> // '\001' + tString + "13"; + case 2 -> // '\002' + tString + "cat"; + case 3 -> // '\003' + tString + "blocks"; + case 4 -> // '\004' + tString + "chirp"; + case 5 -> // '\005' + tString + "far"; + case 6 -> // '\006' + tString + "mall"; + case 7 -> // '\007' + tString + "mellohi"; + case 8 -> // '\b' + tString + "stal"; + case 9 -> // '\t' + tString + "strad"; + case 10 -> // '\n' + tString + "ward"; + case 11 -> // '\013' + tString + "11"; + case 12 -> // '\f' + tString + "wait"; + default -> tString + "wherearewenow"; + }; + if (tString.startsWith("streaming.")) { + new WorldSpawnedEventBuilder.RecordEffectEventBuilder().setIdentifier(tString.substring(10)) + .setPosition(aX, aY, aZ) + .run(); + } else { + new WorldSpawnedEventBuilder.SoundEventBuilder().setVolume(3f) + .setPitch( + tString.startsWith("note.") ? (float) Math.pow(2D, (double) (aStack.stackSize - 13) / 12D) : 1.0F) + .setIdentifier(tString) + .setPosition(aX, aY, aZ) + .run(); + } + } + + public static int hideValue = 0; + + /** + *

+ * Client tick counter that is set to 5 on hiding pipes and covers. + *

+ *

+ * It triggers a texture update next client tick when reaching 4, with provision for 3 more update tasks, spreading + * client change detection related work and network traffic on different ticks, until it reaches 0. + *

+ */ + public static int changeDetected = 0; + + private static int shouldHeldItemHideThings() { + try { + final EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if (player == null) return 0; + final ItemStack tCurrentItem = player.getCurrentEquippedItem(); + if (tCurrentItem == null) return 0; + final int[] ids = OreDictionary.getOreIDs(tCurrentItem); + int hide = 0; + for (int i : ids) { + if (OreDictionary.getOreName(i) + .equals("craftingToolSolderingIron")) { + hide |= 0x1; + break; + } + } + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWrenchList) + || GTUtility.isStackInList(tCurrentItem, GregTechAPI.sScrewdriverList) + || GTUtility.isStackInList(tCurrentItem, GregTechAPI.sHardHammerList) + || GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSoftHammerList) + || GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWireCutterList) + || GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSolderingToolList) + || GTUtility.isStackInList(tCurrentItem, GregTechAPI.sCrowbarList) + || GregTechAPI.sCovers.containsKey(new GTItemStack(tCurrentItem)) + || (tCurrentItem.getItem() instanceof ItemMachines + && GregTechAPI.METATILEENTITIES[tCurrentItem.getItemDamage()] instanceof MetaPipeEntity + && player.isSneaking())) { + hide |= 0x2; + } + return hide; + } catch (Exception e) { + return 0; + } + } + + public static void recieveChunkPollutionPacket(ChunkCoordIntPair chunk, int pollution) { + mPollutionRenderer.processPacket(chunk, pollution); + } +} diff --git a/src/main/java/gregtech/common/GTDummyWorld.java b/src/main/java/gregtech/common/GTDummyWorld.java new file mode 100644 index 0000000000..733db0818c --- /dev/null +++ b/src/main/java/gregtech/common/GTDummyWorld.java @@ -0,0 +1,138 @@ +package gregtech.common; + +import java.io.File; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.WorldProvider; +import net.minecraft.world.WorldSettings; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.chunk.storage.IChunkLoader; +import net.minecraft.world.storage.IPlayerFileData; +import net.minecraft.world.storage.ISaveHandler; +import net.minecraft.world.storage.WorldInfo; + +public class GTDummyWorld extends World { + + public GTIteratorRandom mRandom = new GTIteratorRandom(); + public ItemStack mLastSetBlock = null; + + public GTDummyWorld(ISaveHandler saveHandler, String name, WorldProvider worldProvider, WorldSettings worldSettings, + Profiler profiler) { + super(saveHandler, name, worldSettings, worldProvider, profiler); + this.rand = this.mRandom; + } + + public GTDummyWorld() { + this(new ISaveHandler() { + + @Override + public void saveWorldInfoWithPlayer(WorldInfo worldInfo, NBTTagCompound nbtTagCompound) {} + + @Override + public void saveWorldInfo(WorldInfo worldInfo) {} + + @Override + public WorldInfo loadWorldInfo() { + return null; + } + + @Override + public IPlayerFileData getSaveHandler() { + return null; + } + + @Override + public File getMapFileFromName(String mapName) { + return null; + } + + @Override + public IChunkLoader getChunkLoader(WorldProvider worldProvider) { + return null; + } + + @Override + public void flush() {} + + @Override + public void checkSessionLock() {} + + @Override + public String getWorldDirectoryName() { + return null; + } + + @Override + public File getWorldDirectory() { + return null; + } + }, "DUMMY_DIMENSION", null, new WorldSettings(new WorldInfo(new NBTTagCompound())), new Profiler()); + } + + @Override + protected IChunkProvider createChunkProvider() { + return null; + } + + @Override + public Entity getEntityByID(int aEntityID) { + return null; + } + + @Override + public boolean setBlock(int aX, int aY, int aZ, Block aBlock, int aMeta, int aFlags) { + this.mLastSetBlock = new ItemStack(aBlock, 1, aMeta); + return true; + } + + @Override + public float getSunBrightnessFactor(float p_72967_1_) { + return 1.0F; + } + + @Override + public BiomeGenBase getBiomeGenForCoords(int aX, int aZ) { + if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) { + return BiomeGenBase.plains; + } + return BiomeGenBase.ocean; + } + + @Override + public int getFullBlockLightValue(int aX, int aY, int aZ) { + return 10; + } + + @Override + public Block getBlock(int aX, int aY, int aZ) { + if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) { + return aY == 64 ? Blocks.grass : Blocks.air; + } + return Blocks.air; + } + + @Override + public int getBlockMetadata(int aX, int aY, int aZ) { + return 0; + } + + @Override + public boolean canBlockSeeTheSky(int aX, int aY, int aZ) { + if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) { + return aY > 64; + } + return true; + } + + @Override + protected int func_152379_p() { + return 0; + } +} diff --git a/src/main/java/gregtech/common/GTIteratorRandom.java b/src/main/java/gregtech/common/GTIteratorRandom.java new file mode 100644 index 0000000000..1b14e5b8ff --- /dev/null +++ b/src/main/java/gregtech/common/GTIteratorRandom.java @@ -0,0 +1,17 @@ +package gregtech.common; + +import java.util.Random; + +public class GTIteratorRandom extends Random { + + private static final long serialVersionUID = 1L; + public int mIterationStep = 2147483647; + + @Override + public int nextInt(int aParameter) { + if ((this.mIterationStep == 0) || (this.mIterationStep > aParameter)) { + this.mIterationStep = aParameter; + } + return --this.mIterationStep; + } +} diff --git a/src/main/java/gregtech/common/GTNetwork.java b/src/main/java/gregtech/common/GTNetwork.java new file mode 100644 index 0000000000..30aaecc6cb --- /dev/null +++ b/src/main/java/gregtech/common/GTNetwork.java @@ -0,0 +1,154 @@ +package gregtech.common; + +import static gregtech.GTMod.GT_FML_LOGGER; + +import java.util.EnumMap; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; + +import cpw.mods.fml.common.network.FMLEmbeddedChannel; +import cpw.mods.fml.common.network.FMLOutboundHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.internal.FMLProxyPacket; +import cpw.mods.fml.relauncher.Side; +import gregtech.api.enums.GTValues; +import gregtech.api.net.GTPacket; +import gregtech.api.net.GTPacketNew; +import gregtech.api.net.GTPacketTypes; +import gregtech.api.net.IGT_NetworkHandler; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.MessageToMessageCodec; + +@ChannelHandler.Sharable +@SuppressWarnings("deprecation") +public class GTNetwork extends MessageToMessageCodec implements IGT_NetworkHandler { + + private final EnumMap mChannel; + private final GTPacket[] mSubChannels; + + public GTNetwork() { + this("GregTech", GTPacketTypes.referencePackets()); + } + + public GTNetwork(String channelName, GTPacketNew... packetTypes) { + this.mChannel = NetworkRegistry.INSTANCE.newChannel(channelName, this, new HandlerShared()); + final int lastPId = packetTypes[packetTypes.length - 1].getPacketID(); + this.mSubChannels = new GTPacket[lastPId + 1]; + for (GTPacket packetType : packetTypes) { + final int pId = packetType.getPacketID(); + if (this.mSubChannels[pId] == null) this.mSubChannels[pId] = packetType; + else throw new IllegalArgumentException("Duplicate Packet ID! " + pId); + } + } + + @Override + protected void encode(ChannelHandlerContext aContext, GTPacket aPacket, List aOutput) { + final ByteBuf tBuf = Unpooled.buffer() + .writeByte(aPacket.getPacketID()); + aPacket.encode(tBuf); + aOutput.add( + new FMLProxyPacket( + tBuf, + aContext.channel() + .attr(NetworkRegistry.FML_CHANNEL) + .get())); + } + + @Override + protected void decode(ChannelHandlerContext aContext, FMLProxyPacket aPacket, List aOutput) { + final ByteArrayDataInput aData = ByteStreams.newDataInput( + aPacket.payload() + .array()); + final GTPacket tPacket = this.mSubChannels[aData.readByte()].decode(aData); + tPacket.setINetHandler(aPacket.handler()); + aOutput.add(tPacket); + } + + @Override + public void sendToPlayer(GTPacket aPacket, EntityPlayerMP aPlayer) { + if (aPacket == null) { + GT_FML_LOGGER.info("packet null"); + return; + } + if (aPlayer == null) { + GT_FML_LOGGER.info("player null"); + return; + } + this.mChannel.get(Side.SERVER) + .attr(FMLOutboundHandler.FML_MESSAGETARGET) + .set(FMLOutboundHandler.OutboundTarget.PLAYER); + this.mChannel.get(Side.SERVER) + .attr(FMLOutboundHandler.FML_MESSAGETARGETARGS) + .set(aPlayer); + this.mChannel.get(Side.SERVER) + .writeAndFlush(aPacket); + } + + @Override + public void sendToAllAround(GTPacket 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 sendToAll(GTPacket aPacket) { + this.mChannel.get(Side.SERVER) + .attr(FMLOutboundHandler.FML_MESSAGETARGET) + .set(FMLOutboundHandler.OutboundTarget.ALL); + this.mChannel.get(Side.SERVER) + .writeAndFlush(aPacket); + } + + @Override + public void sendToServer(GTPacket 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, GTPacket aPacket, int aX, int aZ) { + if (!aWorld.isRemote) { + for (Object tObject : aWorld.playerEntities) { + if (!(tObject instanceof EntityPlayerMP tPlayer)) { + break; + } + Chunk tChunk = aWorld.getChunkFromBlockCoords(aX, aZ); + if (tPlayer.getServerForPlayer() + .getPlayerManager() + .isPlayerWatchingChunk(tPlayer, tChunk.xPosition, tChunk.zPosition)) { + sendToPlayer(aPacket, tPlayer); + } + } + } + } + + @ChannelHandler.Sharable + static final class HandlerShared extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, GTPacket aPacket) { + final EntityPlayer aPlayer = GTValues.GT.getThePlayer(); + aPacket.process(aPlayer == null ? null : aPlayer.worldObj); + } + } +} diff --git a/src/main/java/gregtech/common/GTPlayerActivityLogger.java b/src/main/java/gregtech/common/GTPlayerActivityLogger.java new file mode 100644 index 0000000000..7bd5ba508e --- /dev/null +++ b/src/main/java/gregtech/common/GTPlayerActivityLogger.java @@ -0,0 +1,34 @@ +package gregtech.common; + +import java.util.ArrayList; + +import gregtech.GTMod; +import gregtech.api.util.GTLog; + +public class GTPlayerActivityLogger implements Runnable { + + @Override + public void run() { + try { + ArrayList buffer = new ArrayList<>(); + for (;;) { + if (GTLog.pal == null) { + return; + } + String tLastOutput = ""; + // Block on first element for efficiency + buffer.add(GTMod.gregtechproxy.mBufferedPlayerActivity.take()); + GTMod.gregtechproxy.mBufferedPlayerActivity.drainTo(buffer); + for (String output : buffer) { + if (!output.equals(tLastOutput)) { + GTLog.pal.println(output); + tLastOutput = output; + } + } + buffer.clear(); + // TODO: swap from sleep to event bus + Thread.sleep(10000L); + } + } catch (Throwable ignored) {} + } +} diff --git a/src/main/java/gregtech/common/GTProxy.java b/src/main/java/gregtech/common/GTProxy.java new file mode 100644 index 0000000000..d12c2bbe61 --- /dev/null +++ b/src/main/java/gregtech/common/GTProxy.java @@ -0,0 +1,2892 @@ +package gregtech.common; + +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.FluidState.GAS; +import static gregtech.api.enums.FluidState.LIQUID; +import static gregtech.api.enums.FluidState.MOLTEN; +import static gregtech.api.enums.FluidState.PLASMA; +import static gregtech.api.enums.GTValues.W; +import static gregtech.api.enums.GTValues.debugEntityCramming; +import static gregtech.api.enums.Mods.AdvancedSolarPanel; +import static gregtech.api.enums.Mods.AppliedEnergistics2; +import static gregtech.api.enums.Mods.Avaritia; +import static gregtech.api.enums.Mods.BetterLoadingScreen; +import static gregtech.api.enums.Mods.DraconicEvolution; +import static gregtech.api.enums.Mods.ElectroMagicTools; +import static gregtech.api.enums.Mods.EnderIO; +import static gregtech.api.enums.Mods.Forestry; +import static gregtech.api.enums.Mods.GTPlusPlus; +import static gregtech.api.enums.Mods.GalacticraftCore; +import static gregtech.api.enums.Mods.GalaxySpace; +import static gregtech.api.enums.Mods.GraviSuite; +import static gregtech.api.enums.Mods.GregTech; +import static gregtech.api.enums.Mods.IguanaTweaksTinkerConstruct; +import static gregtech.api.enums.Mods.Names; +import static gregtech.api.enums.Mods.Railcraft; +import static gregtech.api.enums.Mods.TaintedMagic; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.enums.Mods.ThaumicBoots; +import static gregtech.api.enums.Mods.ThaumicTinkerer; +import static gregtech.api.enums.Mods.TinkerConstruct; +import static gregtech.api.enums.Mods.TwilightForest; +import static gregtech.api.enums.Mods.WitchingGadgets; +import static gregtech.api.recipe.RecipeMaps.crackingRecipes; +import static gregtech.api.recipe.RecipeMaps.cutterRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTUtil.LAST_BROKEN_TILEENTITY; +import static net.minecraftforge.fluids.FluidRegistry.getFluidStack; + +import java.io.File; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemBow; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraft.world.WorldSettings.GameType; +import net.minecraft.world.gen.feature.WorldGenMinable; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.entity.EntityJoinWorldEvent; +import net.minecraftforge.event.entity.living.EnderTeleportEvent; +import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; +import net.minecraftforge.event.entity.player.ArrowLooseEvent; +import net.minecraftforge.event.entity.player.ArrowNockEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.terraingen.OreGenEvent; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.RecipeSorter; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.IFuelHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.ProgressManager; +import cpw.mods.fml.common.eventhandler.Event.Result; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.network.FMLNetworkEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.FluidState; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.ManualOreDictTweaks; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TCAspects.TC_AspectStack; +import gregtech.api.enums.TierEU; +import gregtech.api.enums.ToolDictNames; +import gregtech.api.fluid.GTFluidFactory; +import gregtech.api.interfaces.IBlockOnWalkOver; +import gregtech.api.interfaces.IProjectileItem; +import gregtech.api.interfaces.IToolStats; +import gregtech.api.interfaces.internal.IGTMod; +import gregtech.api.interfaces.internal.IThaumcraftCompat; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaGeneratedItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.net.GTPacketMusicSystemData; +import gregtech.api.objects.GTChunkManager; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.GTUODimensionList; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeCategory; +import gregtech.api.recipe.RecipeCategorySetting; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTBlockMap; +import gregtech.api.util.GTCLSCompat; +import gregtech.api.util.GTChunkAssociatedData; +import gregtech.api.util.GTClientPreference; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTMusicSystem; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipeRegistrator; +import gregtech.api.util.GTShapedRecipe; +import gregtech.api.util.GTShapelessRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder; +import gregtech.common.config.opstuff.ConfigGeneral; +import gregtech.common.items.IDMetaTool01; +import gregtech.common.items.MetaGeneratedItem98; +import gregtech.common.items.MetaGeneratedTool01; +import gregtech.common.misc.GlobalEnergyWorldSavedData; +import gregtech.common.misc.GlobalMetricsCoverDatabase; +import gregtech.common.misc.spaceprojects.SpaceProjectWorldSavedData; +import gregtech.common.tileentities.machines.multi.drone.MTEDroneCentre; +import gregtech.nei.GTNEIDefaultHandler; + +public abstract class GTProxy implements IGTMod, IFuelHandler { + + private static final EnumSet PREVENTED_ORES = EnumSet.of( + OreGenEvent.GenerateMinable.EventType.COAL, + OreGenEvent.GenerateMinable.EventType.IRON, + OreGenEvent.GenerateMinable.EventType.GOLD, + OreGenEvent.GenerateMinable.EventType.DIAMOND, + OreGenEvent.GenerateMinable.EventType.REDSTONE, + OreGenEvent.GenerateMinable.EventType.LAPIS, + OreGenEvent.GenerateMinable.EventType.QUARTZ); + public final HashSet mRegisteredOres = new HashSet<>(10000); + public final ArrayList mSoundNames = new ArrayList<>(); + public final ArrayList mSoundItems = new ArrayList<>(); + public final ArrayList mSoundCounts = new ArrayList<>(); + private final Collection mEvents = new HashSet<>(); + private final Collection mIgnoredItems = new HashSet<>( + Arrays.asList( + "itemGhastTear", + "itemFlint", + "itemClay", + "itemBucketSaltWater", + "itemBucketFreshWater", + "itemBucketWater", + "itemRock", + "itemReed", + "itemArrow", + "itemSaw", + "itemKnife", + "itemHammer", + "itemChisel", + "itemRubber", + "itemEssence", + "itemIlluminatedPanel", + "itemSkull", + "itemRawRubber", + "itemBacon", + "itemJetpackAccelerator", + "itemLazurite", + "itemIridium", + "itemTear", + "itemClaw", + "itemFertilizer", + "itemTar", + "itemSlimeball", + "itemCoke", + "itemBeeswax", + "itemBeeQueen", + "itemForcicium", + "itemForcillium", + "itemRoyalJelly", + "itemHoneydew", + "itemHoney", + "itemPollen", + "itemReedTypha", + "itemSulfuricAcid", + "itemPotash", + "itemCompressedCarbon", + "itemBitumen", + "itemBioFuel", + "itemCokeSugar", + "itemCokeCactus", + "itemCharcoalSugar", + "itemCharcoalCactus", + "itemSludge", + "itemEnrichedAlloy", + "itemQuicksilver", + "itemMercury", + "itemOsmium", + "itemUltimateCircuit", + "itemEnergizedStar", + "itemAntimatterMolecule", + "itemAntimatterGlob", + "itemCoal", + "itemBoat", + "itemHerbalMedicineCake", + "itemCakeSponge", + "itemFishandPumpkinCakeSponge", + "itemSoulCleaver", + "itemInstantCake", + "itemWhippingCream", + "itemGlisteningWhippingCream", + "itemCleaver", + "itemHerbalMedicineWhippingCream", + "itemStrangeWhippingCream", + "itemBlazeCleaver", + "itemBakedCakeSponge", + "itemMagmaCake", + "itemGlisteningCake", + "itemOgreCleaver", + "itemFishandPumpkinCake", + "itemMagmaWhippingCream", + "itemMultimeter", + "itemSuperconductor")); + private final Collection mIgnoredNames = new HashSet<>( + Arrays.asList( + "grubBee", + "chainLink", + "candyCane", + "bRedString", + "bVial", + "bFlask", + "anorthositeSmooth", + "migmatiteSmooth", + "slateSmooth", + "travertineSmooth", + "limestoneSmooth", + "orthogneissSmooth", + "marbleSmooth", + "honeyDrop", + "lumpClay", + "honeyEqualssugar", + "flourEqualswheat", + "bluestoneInsulated", + "blockWaterstone", + "blockSand", + "blockTorch", + "blockPumpkin", + "blockClothRock", + "blockStainedHardenedClay", + "blockQuartzPillar", + "blockQuartzChiselled", + "blockSpawner", + "blockCloth", + "mobHead", + "mobEgg", + "enderFlower", + "enderChest", + "clayHardened", + "dayGemMaterial", + "nightGemMaterial", + "snowLayer", + "bPlaceholder", + "hardenedClay", + "eternalLifeEssence", + "sandstone", + "wheatRice", + "transdimBlock", + "bambooBasket", + "lexicaBotania", + "livingwoodTwig", + "redstoneCrystal", + "pestleAndMortar", + "glowstone", + "whiteStone", + "stoneSlab", + "transdimBlock", + "clayBowl", + "clayPlate", + "ceramicBowl", + "ceramicPlate", + "ovenRack", + "clayCup", + "ceramicCup", + "batteryBox", + "transmutationStone", + "torchRedstoneActive", + "coal", + "charcoal", + "cloth", + "cobblestoneSlab", + "stoneBrickSlab", + "cobblestoneWall", + "stoneBrickWall", + "cobblestoneStair", + "stoneBrickStair", + "blockCloud", + "blockDirt", + "blockTyrian", + "blockCarpet", + "blockFft", + "blockLavastone", + "blockHolystone", + "blockConcrete", + "sunnariumPart", + "brSmallMachineCyaniteProcessor", + "meteoriteCoal", + "blockCobble", + "pressOreProcessor", + "crusherOreProcessor", + "grinderOreProcessor", + "blockRubber", + "blockHoney", + "blockHoneydew", + "blockPeat", + "blockRadioactive", + "blockSlime", + "blockCocoa", + "blockSugarCane", + "blockLeather", + "blockClayBrick", + "solarPanelHV", + "cableRedNet", + "stoneBowl", + "crafterWood", + "taintedSoil", + "brickXyEngineering", + "breederUranium", + "wireMill", + "chunkLazurite", + "aluminumNatural", + "aluminiumNatural", + "naturalAluminum", + "naturalAluminium", + "antimatterMilligram", + "antimatterGram", + "strangeMatter", + "coalGenerator", + "electricFurnace", + "unfinishedTank", + "valvePart", + "aquaRegia", + "leatherSeal", + "leatherSlimeSeal", + "hambone", + "slimeball", + "clay", + "enrichedUranium", + "camoPaste", + "antiBlock", + "burntQuartz", + "salmonRaw", + "blockHopper", + "blockEnderObsidian", + "blockIcestone", + "blockMagicWood", + "blockEnderCore", + "blockHeeEndium", + "oreHeeEndPowder", + "oreHeeStardust", + "oreHeeIgneousRock", + "oreHeeInstabilityOrb", + "crystalPureFluix", + "shardNether", + "gemFluorite", + "stickObsidian", + "caveCrystal", + "shardCrystal", + "dyeCrystal", + "shardFire", + "shardWater", + "shardAir", + "shardEarth", + "ingotRefinedIron", + "blockMarble", + "ingotUnstable", + "obsidian", + "dirt", + "gravel", + "grass", + "soulsand", + "paper", + "brick", + "chest")); + private final Collection mInvalidNames = new HashSet<>( + Arrays.asList( + "diamondShard", + "redstoneRoot", + "obsidianStick", + "bloodstoneOre", + "universalCable", + "bronzeTube", + "ironTube", + "netherTube", + "obbyTube", + "infiniteBattery", + "eliteBattery", + "advancedBattery", + "10kEUStore", + "blueDye", + "MonazitOre", + "quartzCrystal", + "whiteLuminiteCrystal", + "darkStoneIngot", + "invisiumIngot", + "demoniteOrb", + "enderGem", + "starconiumGem", + "osmoniumIngot", + "tapaziteGem", + "zectiumIngot", + "foolsRubyGem", + "rubyGem", + "meteoriteGem", + "adamiteShard", + "sapphireGem", + "copperIngot", + "ironStick", + "goldStick", + "diamondStick", + "reinforcedStick", + "draconicStick", + "emeraldStick", + "copperStick", + "tinStick", + "silverStick", + "bronzeStick", + "steelStick", + "leadStick", + "manyullynStick", + "arditeStick", + "cobaltStick", + "aluminiumStick", + "alumiteStick", + "oilsandsOre", + "copperWire", + "superconductorWire", + "sulfuricAcid", + "conveyorBelt", + "ironWire", + "aluminumWire", + "aluminiumWire", + "silverWire", + "tinWire", + "dustSiliconSmall", + "AluminumOre", + "plateHeavyT2", + "blockWool", + "alloyPlateEnergizedHardened", + "gasWood", + "alloyPlateEnergized", + "SilverOre", + "LeadOre", + "TinOre", + "CopperOre", + "silverOre", + "leadOre", + "tinOre", + "copperOre", + "bauxiteOre", + "HSLivingmetalIngot", + "oilMoving", + "oilStill", + "oilBucket", + "petroleumOre", + "dieselFuel", + "diamondNugget", + "planks", + "wood", + "stick", + "sticks", + "naquadah", + "obsidianRod", + "stoneRod", + "thaumiumRod", + "steelRod", + "netherrackRod", + "woodRod", + "ironRod", + "cactusRod", + "flintRod", + "copperRod", + "cobaltRod", + "alumiteRod", + "blueslimeRod", + "arditeRod", + "manyullynRod", + "bronzeRod", + "boneRod", + "slimeRod", + "redalloyBundled", + "bluestoneBundled", + "infusedteslatiteInsulated", + "redalloyInsulated", + "infusedteslatiteBundled")); + private final DateFormat mDateFormat = DateFormat.getInstance(); + public final BlockingQueue mBufferedPlayerActivity = new LinkedBlockingQueue<>(); + public final GTBlockMap mCTMBlockCache = new GTBlockMap<>(); + public boolean mDisableVanillaOres = true; + public boolean mAllowSmallBoilerAutomation = false; + public boolean mCraftingUnification = true; + public boolean mInventoryUnification = true; + public boolean mIncreaseDungeonLoot = true; + public boolean mAxeWhenAdventure = true; + public boolean mSurvivalIntoAdventure = false; + public boolean mNerfedWoodPlank = true; + public boolean mNerfedVanillaTools = true; + public boolean mHungerEffect = true; + public boolean mIgnoreTcon = true; + public boolean mAchievements = true; + private boolean isFirstServerWorldTick = true; + private boolean isFirstWorldTick = true; + private boolean mOreDictActivated = false; + public boolean mChangeHarvestLevels = false; + public boolean mGTBees = true; + public boolean mHideUnusedOres = true; + public boolean mPollution = true; + public boolean mExplosionItemDrop = false; + public int mMaxEqualEntitiesAtOneSpot = 3; + public int mFlintChance = 30; + public int mItemDespawnTime = 6000; + public int mUpgradeCount = 4; + public int[] mHarvestLevel = new int[1000]; + public int mGraniteHavestLevel = 3; + public int mMaxHarvestLevel = 7; + public double replicatorExponent = 1.2D; + public int mPollutionSmogLimit = 550000; + public int mPollutionPoisonLimit = 750000; + public int mPollutionVegetationLimit = 1000000; + public int mPollutionSourRainLimit = 2000000; + public int mPollutionOnExplosion = 100000; + public int mPollutionPrimitveBlastFurnacePerSecond = 200; + public int mPollutionEBFPerSecond = 400; + public int mPollutionCharcoalPitPerSecond = 100; + public int mPollutionLargeCombustionEnginePerSecond = 480; + public int mPollutionExtremeCombustionEnginePerSecond = 3840; + public int mPollutionImplosionCompressorPerSecond = 10000; + public int mPollutionLargeBronzeBoilerPerSecond = 1000; + public int mPollutionLargeSteelBoilerPerSecond = 2000; + public int mPollutionLargeTitaniumBoilerPerSecond = 3000; + public int mPollutionLargeTungstenSteelBoilerPerSecond = 4000; + public double mPollutionReleasedByThrottle = 1.0 / 24.0; // divided by 24 because 24 circuit conf + public int mPollutionLargeGasTurbinePerSecond = 300; + public int mPollutionMultiSmelterPerSecond = 400; + public int mPollutionPyrolyseOvenPerSecond = 300; + public int mPollutionSmallCoalBoilerPerSecond = 20; + public int mPollutionHighPressureLavaBoilerPerSecond = 20; + public int mPollutionHighPressureCoalBoilerPerSecond = 30; + public int mPollutionBaseDieselGeneratorPerSecond = 200; + public double[] mPollutionDieselGeneratorReleasedByTier = new double[] { 0.1, 1.0, 0.9, 0.8 }; + public int mPollutionBaseGasTurbinePerSecond = 200; + public double[] mPollutionGasTurbineReleasedByTier = new double[] { 0.1, 1.0, 0.9, 0.8, 0.7, 0.6 }; + public final GTUODimensionList mUndergroundOil = new GTUODimensionList(); + public boolean enableUndergroundGravelGen = true; + public boolean enableUndergroundDirtGen = true; + public int mTicksUntilNextCraftSound = 0; + private World mUniverse = null; + public boolean mEnableAllMaterials = false; + public boolean mEnableCleanroom = true; + public boolean mLowGravProcessing = false; + public boolean mCropNeedBlock = true; + public boolean mAMHInteraction = true; + public boolean mForceFreeFace = true; + public boolean mMixedOreOnlyYieldsTwoThirdsOfPureOre = false; + public boolean mRichOreYieldMultiplier = true; + public boolean mNetherOreYieldMultiplier = true; + public boolean mEndOreYieldMultiplier = true; + public boolean enableBlackGraniteOres = true; + public boolean enableRedGraniteOres = true; + public boolean enableMarbleOres = true; + public boolean enableBasaltOres = true; + public boolean gt6Pipe = true; + public boolean gt6Cable = true; + public boolean ic2EnergySourceCompat = true; + public boolean costlyCableConnection = false; + public boolean crashOnNullRecipeInput = false; + + public enum OreDropSystem { + Block, + PerDimBlock, + UnifiedBlock, + FortuneItem, + Item + } + + public OreDropSystem oreDropSystem = OreDropSystem.FortuneItem; + + /** + * This enables ambient-occlusion smooth lighting on tiles + */ + public boolean mRenderTileAmbientOcclusion = true; + + /** + * This enables rendering of glowing textures + */ + public boolean mRenderGlowTextures = true; + + /** + * Render flipped textures + */ + public boolean mRenderFlippedMachinesFlipped = true; + + /** + * This enables indicators on input/output hatches + */ + public boolean mRenderIndicatorsOnHatch = true; + + /** + * This enables the rendering of dirt particles if pollution is enabled too + */ + public boolean mRenderDirtParticles = true; + + /** + * This enables the rendering of the pollution fog if pollution is enabled too + */ + public boolean mRenderPollutionFog = true; + + /** + * This enables BaseMetaTileEntity block updates handled by BlockUpdateHandler + */ + public boolean mUseBlockUpdateHandler = false; + + /** + * This makes cover tabs visible on GregTech machines + */ + public boolean mCoverTabsVisible = true; + + /** + * This controls whether cover tabs display on the left (default) or right side of the UI + */ + public boolean mCoverTabsFlipped = false; + + /** + * How verbose should tooltips be? 0: disabled, 1: one-line, 2: normal, 3+: extended + */ + public int mTooltipVerbosity = 2; + + /** + * How verbose should tooltips be when LSHIFT is held? 0: disabled, 1: one-line, 2: normal, 3+: extended + */ + public int mTooltipShiftVerbosity = 3; + + /** + * Which style to use for title tab on machine GUI? 0: text tab split-dark, 1: text tab unified, 2: item icon tab + */ + public int mTitleTabStyle = 0; + + /** + * Whether to show seconds or ticks on NEI + */ + public boolean mNEIRecipeSecondMode = true; + + /** + * This enables "Recipe by" display on NEI + */ + public boolean mNEIRecipeOwner = false; + + /** + * This enables showing stack traces where the recipe was added. Reboot needed + */ + public boolean mNEIRecipeOwnerStackTrace = false; + + /** + * This enables showing original voltage when overclocked + */ + public boolean mNEIOriginalVoltage = false; + + /** + * This enables the green->red durability for an item's damage value + */ + public boolean mRenderItemDurabilityBar = true; + + /** + * This enables the blue charge bar for an electric item's charge + */ + public boolean mRenderItemChargeBar = true; + + public final Map recipeCategorySettings = new HashMap<>(); + + /** + * This enables showing voltage tier of transformer for Waila, instead of raw voltage number + */ + public boolean mWailaTransformerVoltageTier = true; + + /** + * This enables showing the cpu load in nanoseconds via waila. + */ + public boolean wailaAverageNS = false; + + public static final int GUI_ID_COVER_SIDE_BASE = 10; // Takes GUI ID 10 - 15 + + public static Map oreDictBurnTimes = new HashMap<>(); + + // Locking + public static ReentrantLock TICK_LOCK = new ReentrantLock(); + + private final ConcurrentMap mClientPrefernces = new ConcurrentHashMap<>(); + + static { + oreDictBurnTimes.put("dustTinyWood", 11); + oreDictBurnTimes.put("dustTinySodium", 44); + oreDictBurnTimes.put("dustSmallWood", 25); + oreDictBurnTimes.put("dustSmallSodium", 100); + oreDictBurnTimes.put("dustWood", 100); + oreDictBurnTimes.put("dustTinyCoal", 177); + oreDictBurnTimes.put("dustTinyCharcoal", 177); + oreDictBurnTimes.put("dustTinyLignite", 166); + oreDictBurnTimes.put("plateWood", 300); + oreDictBurnTimes.put("dustSmallLignite", 375); + oreDictBurnTimes.put("dustSodium", 400); + oreDictBurnTimes.put("dustSmallCoal", 400); + oreDictBurnTimes.put("dustSmallCharcoal", 400); + oreDictBurnTimes.put("dustTinyLithium", 888); + oreDictBurnTimes.put("dustTinyCaesium", 888); + oreDictBurnTimes.put("gemLignite", 1200); + oreDictBurnTimes.put("crushedLignite", 1200); + oreDictBurnTimes.put("dustImpureLignite", 1200); + oreDictBurnTimes.put("dustLignite", 1200); + oreDictBurnTimes.put("dustSulfur", 1600); + oreDictBurnTimes.put("gemCoal", 1600); + oreDictBurnTimes.put("crushedCoal", 1600); + oreDictBurnTimes.put("dustImpureCoal", 1600); + oreDictBurnTimes.put("dustCoal", 1600); + oreDictBurnTimes.put("gemCharcoal", 1600); + oreDictBurnTimes.put("crushedCharcoal", 1600); + oreDictBurnTimes.put("dustImpureCharcoal", 1600); + oreDictBurnTimes.put("dustCharcoal", 1600); + oreDictBurnTimes.put("dustSmallLithium", 2000); + oreDictBurnTimes.put("dustSmallCaesium", 2000); + oreDictBurnTimes.put("gemSodium", 4000); + oreDictBurnTimes.put("crushedSodium", 4000); + oreDictBurnTimes.put("dustImpureSodium", 4000); + oreDictBurnTimes.put("gemLithium", 6000); + oreDictBurnTimes.put("crushedLithium", 6000); + oreDictBurnTimes.put("dustImpureLithium", 6000); + oreDictBurnTimes.put("dustLithium", 6000); + oreDictBurnTimes.put("gemCaesium", 6000); + oreDictBurnTimes.put("crushedCaesium", 6000); + oreDictBurnTimes.put("dustImpureCaesium", 6000); + oreDictBurnTimes.put("dustCaesium", 6000); + oreDictBurnTimes.put("blockLignite", 12000); + oreDictBurnTimes.put("blockCharcoal", 16000); + oreDictBurnTimes.put("gemDiamond", 102400); + oreDictBurnTimes.put("blockDiamond", 1024000); + oreDictBurnTimes.put("crushedDiamond", 102400); + oreDictBurnTimes.put("dustImpureDiamond", 102400); + oreDictBurnTimes.put("dustDiamond", 102400); + oreDictBurnTimes.put("dustSmallDiamond", 25600); + oreDictBurnTimes.put("dustTinyDiamond", 11378); + } + + public GTProxy() { + GameRegistry.registerFuelHandler(this); + MinecraftForge.EVENT_BUS.register(this); + MinecraftForge.ORE_GEN_BUS.register(this); + FMLCommonHandler.instance() + .bus() + .register(this); + GregTechAPI.sThaumcraftCompat = (IThaumcraftCompat) GTUtility + .callConstructor("gregtech.common.GT_ThaumcraftCompat", 0, null, GTValues.D1, new Object[0]); + for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry + .getRegisteredFluidContainerData()) { + onFluidContainerRegistration(new FluidContainerRegistry.FluidContainerRegisterEvent(tData)); + } + try { + for (String tOreName : OreDictionary.getOreNames()) { + ItemStack tOreStack; + for (Iterator i$ = OreDictionary.getOres(tOreName) + .iterator(); i$.hasNext(); registerOre(new OreDictionary.OreRegisterEvent(tOreName, tOreStack))) { + tOreStack = i$.next(); + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + public void onPreLoad() { + GTLog.out.println("GTMod: Preload-Phase started!"); + GTLog.ore.println("GTMod: Preload-Phase started!"); + + GregTechAPI.sPreloadStarted = true; + this.mIgnoreTcon = ConfigGeneral.ignoreTinkerConstruct; + this.replicatorExponent = ConfigGeneral.replicatorExponent; + for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry + .getRegisteredFluidContainerData()) { + if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { + tData.fluid.amount = 0; + break; + } + } + GTLog.out.println("GTMod: Getting required Items of other Mods."); + + ItemList.RC_ShuntingWire.set(GTModHandler.getModItem(Railcraft.ID, "machine.delta", 1L, 0)); + ItemList.RC_ShuntingWireFrame.set(GTModHandler.getModItem(Railcraft.ID, "frame", 1L, 0)); + ItemList.RC_Rail_Standard.set(GTModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 0)); + ItemList.RC_Rail_Adv.set(GTModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 1)); + ItemList.RC_Rail_Wooden.set(GTModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 2)); + ItemList.RC_Rail_HS.set(GTModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 3)); + ItemList.RC_Rail_Reinforced.set(GTModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 4)); + ItemList.RC_Rail_Electric.set(GTModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 5)); + ItemList.RC_Tie_Wood.set(GTModHandler.getModItem(Railcraft.ID, "part.tie", 1L, 0)); + ItemList.RC_Tie_Stone.set(GTModHandler.getModItem(Railcraft.ID, "part.tie", 1L, 1)); + ItemList.RC_Bed_Wood.set(GTModHandler.getModItem(Railcraft.ID, "part.railbed", 1L, 0)); + ItemList.RC_Bed_Stone.set(GTModHandler.getModItem(Railcraft.ID, "part.railbed", 1L, 1)); + ItemList.RC_Rebar.set(GTModHandler.getModItem(Railcraft.ID, "part.rebar", 1L)); + ItemList.TC_Thaumometer.set(GTModHandler.getModItem(Thaumcraft.ID, "ItemThaumometer", 1L, 0)); + ItemList.Tool_Sword_Steel.set(GTModHandler.getModItem(Railcraft.ID, "tool.steel.sword", 1L)); + ItemList.Tool_Pickaxe_Steel.set(GTModHandler.getModItem(Railcraft.ID, "tool.steel.pickaxe", 1L)); + ItemList.Tool_Shovel_Steel.set(GTModHandler.getModItem(Railcraft.ID, "tool.steel.shovel", 1L)); + ItemList.Tool_Axe_Steel.set(GTModHandler.getModItem(Railcraft.ID, "tool.steel.axe", 1L)); + ItemList.Tool_Hoe_Steel.set(GTModHandler.getModItem(Railcraft.ID, "tool.steel.hoe", 1L)); + + ItemList.TF_LiveRoot.set(GTModHandler.getModItem(TwilightForest.ID, "item.liveRoot", 1L, 0)); + ItemList.TF_Vial_FieryBlood.set(GTModHandler.getModItem(TwilightForest.ID, "item.fieryBlood", 1L)); + ItemList.TF_Vial_FieryTears.set(GTModHandler.getModItem(TwilightForest.ID, "item.fieryTears", 1L)); + + ItemList.FR_Lemon.set(GTModHandler.getModItem(Forestry.ID, "fruits", 1L, 3)); + ItemList.FR_Mulch.set(GTModHandler.getModItem(Forestry.ID, "mulch", 1L)); + ItemList.FR_Fertilizer.set(GTModHandler.getModItem(Forestry.ID, "fertilizerCompound", 1L)); + ItemList.FR_Compost.set(GTModHandler.getModItem(Forestry.ID, "fertilizerBio", 1L)); + ItemList.FR_Silk.set(GTModHandler.getModItem(Forestry.ID, "craftingMaterial", 1L, 2)); + ItemList.FR_Wax.set(GTModHandler.getModItem(Forestry.ID, "beeswax", 1L)); + ItemList.FR_WaxCapsule.set(GTModHandler.getModItem(Forestry.ID, "waxCapsule", 1L)); + ItemList.FR_RefractoryWax.set(GTModHandler.getModItem(Forestry.ID, "refractoryWax", 1L)); + ItemList.FR_RefractoryCapsule.set(GTModHandler.getModItem(Forestry.ID, "refractoryEmpty", 1L)); + ItemList.FR_Bee_Drone.set(GTModHandler.getModItem(Forestry.ID, "beeDroneGE", 1L)); + ItemList.FR_Bee_Princess.set(GTModHandler.getModItem(Forestry.ID, "beePrincessGE", 1L)); + ItemList.FR_Bee_Queen.set(GTModHandler.getModItem(Forestry.ID, "beeQueenGE", 1L)); + ItemList.FR_Tree_Sapling.set( + GTModHandler.getModItem(Forestry.ID, "sapling", 1L, GTModHandler.getModItem(Forestry.ID, "saplingGE", 1L))); + ItemList.FR_Butterfly.set(GTModHandler.getModItem(Forestry.ID, "butterflyGE", 1L)); + ItemList.FR_Larvae.set(GTModHandler.getModItem(Forestry.ID, "beeLarvaeGE", 1L)); + ItemList.FR_Serum.set(GTModHandler.getModItem(Forestry.ID, "serumGE", 1L)); + ItemList.FR_Caterpillar.set(GTModHandler.getModItem(Forestry.ID, "caterpillarGE", 1L)); + ItemList.FR_PollenFertile.set(GTModHandler.getModItem(Forestry.ID, "pollenFertile", 1L)); + ItemList.FR_Stick.set(GTModHandler.getModItem(Forestry.ID, "oakStick", 1L)); + ItemList.FR_Casing_Impregnated.set(GTModHandler.getModItem(Forestry.ID, "impregnatedCasing", 1L)); + ItemList.FR_Casing_Sturdy.set(GTModHandler.getModItem(Forestry.ID, "sturdyMachine", 1L)); + ItemList.FR_Casing_Hardened.set(GTModHandler.getModItem(Forestry.ID, "hardenedMachine", 1L)); + + ItemList.Bottle_Empty.set(new ItemStack(Items.glass_bottle, 1)); + + ItemList.Cell_Universal_Fluid.set(GTModHandler.getIC2Item("FluidCell", 1L)); + ItemList.Cell_Empty.set( + GTModHandler.getIC2Item( + "cell", + 1L, + GTModHandler.getIC2Item("cellEmpty", 1L, GTModHandler.getIC2Item("emptyCell", 1L)))); + ItemList.Cell_Water.set(GTModHandler.getIC2Item("waterCell", 1L, GTModHandler.getIC2Item("cellWater", 1L))); + ItemList.Cell_Lava.set(GTModHandler.getIC2Item("lavaCell", 1L, GTModHandler.getIC2Item("cellLava", 1L))); + ItemList.Cell_Air.set( + GTModHandler.getIC2Item( + "airCell", + 1L, + GTModHandler.getIC2Item("cellAir", 1L, GTModHandler.getIC2Item("cellOxygen", 1L)))); + + ItemList.IC2_Item_Casing_Iron.set(GTModHandler.getIC2Item("casingiron", 1L)); + ItemList.IC2_Item_Casing_Gold.set(GTModHandler.getIC2Item("casinggold", 1L)); + ItemList.IC2_Item_Casing_Bronze.set(GTModHandler.getIC2Item("casingbronze", 1L)); + ItemList.IC2_Item_Casing_Copper.set(GTModHandler.getIC2Item("casingcopper", 1L)); + ItemList.IC2_Item_Casing_Tin.set(GTModHandler.getIC2Item("casingtin", 1L)); + ItemList.IC2_Item_Casing_Lead.set(GTModHandler.getIC2Item("casinglead", 1L)); + ItemList.IC2_Item_Casing_Steel.set(GTModHandler.getIC2Item("casingadviron", 1L)); + ItemList.IC2_Spray_WeedEx.set(GTModHandler.getIC2Item("weedEx", 1L)); + ItemList.IC2_Mixed_Metal_Ingot.set(GTModHandler.getIC2Item("mixedMetalIngot", 1L)); + ItemList.IC2_Fertilizer.set(GTModHandler.getIC2Item("fertilizer", 1L)); + ItemList.IC2_CoffeeBeans.set(GTModHandler.getIC2Item("coffeeBeans", 1L)); + ItemList.IC2_CoffeePowder.set(GTModHandler.getIC2Item("coffeePowder", 1L)); + ItemList.IC2_Hops.set(GTModHandler.getIC2Item("hops", 1L)); + ItemList.IC2_Resin.set(GTModHandler.getIC2Item("resin", 1L)); + ItemList.IC2_Plantball.set(GTModHandler.getIC2Item("plantBall", 1L)); + ItemList.IC2_PlantballCompressed + .set(GTModHandler.getIC2Item("compressedPlantBall", 1L, ItemList.IC2_Plantball.get(1L))); + ItemList.IC2_Crop_Seeds.set(GTModHandler.getIC2Item("cropSeed", 1L)); + ItemList.IC2_Grin_Powder.set(GTModHandler.getIC2Item("grinPowder", 1L)); + ItemList.IC2_Energium_Dust.set(GTModHandler.getIC2Item("energiumDust", 1L)); + ItemList.IC2_Scrap.set(GTModHandler.getIC2Item("scrap", 1L)); + ItemList.IC2_Scrapbox.set(GTModHandler.getIC2Item("scrapBox", 1L)); + ItemList.IC2_Fuel_Rod_Empty.set(GTModHandler.getIC2Item("fuelRod", 1L)); + ItemList.IC2_Food_Can_Empty.set(GTModHandler.getIC2Item("tinCan", 1L)); + ItemList.IC2_Food_Can_Filled.set(GTModHandler.getIC2Item("filledTinCan", 1L, 0)); + ItemList.IC2_Food_Can_Spoiled.set(GTModHandler.getIC2Item("filledTinCan", 1L, 1)); + ItemList.IC2_Industrial_Diamond + .set(GTModHandler.getIC2Item("industrialDiamond", 1L, new ItemStack(Items.diamond, 1))); + ItemList.IC2_Compressed_Coal_Ball.set(GTModHandler.getIC2Item("compressedCoalBall", 1L)); + ItemList.IC2_Compressed_Coal_Chunk.set(GTModHandler.getIC2Item("coalChunk", 1L)); + ItemList.IC2_ShaftIron.set(GTModHandler.getIC2Item("ironshaft", 1L)); + ItemList.IC2_ShaftSteel.set(GTModHandler.getIC2Item("steelshaft", 1L)); + + ItemList.IC2_SuBattery.set(GTModHandler.getIC2Item("suBattery", 1L)); + ItemList.IC2_ReBattery.set(GTModHandler.getIC2Item("reBattery", 1L)); + ItemList.IC2_AdvBattery.set(GTModHandler.getIC2Item("advBattery", 1L)); + ItemList.IC2_EnergyCrystal.set(GTModHandler.getIC2Item("energyCrystal", 1L)); + ItemList.IC2_LapotronCrystal.set(GTModHandler.getIC2Item("lapotronCrystal", 1L)); + + ItemList.Tool_Sword_Bronze.set(GTModHandler.getIC2Item("bronzeSword", 1L)); + ItemList.Tool_Pickaxe_Bronze.set(GTModHandler.getIC2Item("bronzePickaxe", 1L)); + ItemList.Tool_Shovel_Bronze.set(GTModHandler.getIC2Item("bronzeShovel", 1L)); + ItemList.Tool_Axe_Bronze.set(GTModHandler.getIC2Item("bronzeAxe", 1L)); + ItemList.Tool_Hoe_Bronze.set(GTModHandler.getIC2Item("bronzeHoe", 1L)); + ItemList.IC2_ForgeHammer.set(GTModHandler.getIC2Item("ForgeHammer", 1L)); + ItemList.IC2_WireCutter.set(GTModHandler.getIC2Item("cutter", 1L)); + + ItemList.Credit_Iron.set(GTModHandler.getIC2Item("coin", 1L)); + + ItemList.Circuit_Basic.set(GTModHandler.getIC2Item("electronicCircuit", 1L)); + ItemList.Circuit_Advanced.set(GTModHandler.getIC2Item("advancedCircuit", 1L)); + + ItemList.Upgrade_Overclocker.set(GTModHandler.getIC2Item("overclockerUpgrade", 1L)); + ItemList.Upgrade_Battery.set(GTModHandler.getIC2Item("energyStorageUpgrade", 1L)); + + ItemList.Dye_Bonemeal.set(new ItemStack(Items.dye, 1, 15)); + ItemList.Dye_SquidInk.set(new ItemStack(Items.dye, 1, 0)); + ItemList.Dye_Cocoa.set(new ItemStack(Items.dye, 1, 3)); + + ItemList.Book_Written_00.set(new ItemStack(Items.written_book, 1, 0)); + + ItemList.Food_Baked_Bread.set(new ItemStack(Items.bread, 1, 0)); + ItemList.Food_Raw_Potato.set(new ItemStack(Items.potato, 1, 0)); + ItemList.Food_Baked_Potato.set(new ItemStack(Items.baked_potato, 1, 0)); + ItemList.Food_Poisonous_Potato.set(new ItemStack(Items.poisonous_potato, 1, 0)); + + OrePrefixes.bottle.mContainerItem = ItemList.Bottle_Empty.get(1L); + OrePrefixes.bucket.mContainerItem = new ItemStack(Items.bucket, 1); + OrePrefixes.cellPlasma.mContainerItem = ItemList.Cell_Empty.get(1L); + OrePrefixes.cellMolten.mContainerItem = ItemList.Cell_Empty.get(1L); + OrePrefixes.cell.mContainerItem = ItemList.Cell_Empty.get(1L); + + GTModHandler.sNonReplaceableItems.add(new ItemStack(Items.bow, 1, 32767)); + GTModHandler.sNonReplaceableItems.add(new ItemStack(Items.fishing_rod, 1, 32767)); + GTModHandler.sNonReplaceableItems.add(ItemList.IC2_ForgeHammer.getWithDamage(1L, 32767L)); + GTModHandler.sNonReplaceableItems.add(ItemList.IC2_WireCutter.getWithDamage(1L, 32767L)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("painter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("blackPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("redPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("greenPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("brownPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("bluePainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("purplePainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("cyanPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("lightGreyPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("darkGreyPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("pinkPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("limePainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("yellowPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("cloudPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("magentaPainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("orangePainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("whitePainter", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("cfPack", 1L, 32767)); + // GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("jetpack", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("treetap", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("weedEx", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("staticBoots", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("compositeArmor", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("hazmatHelmet", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("hazmatChestplate", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("hazmatLeggings", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getIC2Item("hazmatBoots", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Railcraft.ID, "part.turbine.disk", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Railcraft.ID, "part.turbine.blade", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Railcraft.ID, "part.turbine.rotor", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Railcraft.ID, "borehead.diamond", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Railcraft.ID, "borehead.steel", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Railcraft.ID, "borehead.iron", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.plateNaga", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.legsNaga", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.arcticHelm", 1L, 32767)); + GTModHandler.sNonReplaceableItems + .add(GTModHandler.getModItem(TwilightForest.ID, "item.arcticPlate", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.arcticLegs", 1L, 32767)); + GTModHandler.sNonReplaceableItems + .add(GTModHandler.getModItem(TwilightForest.ID, "item.arcticBoots", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.yetiHelm", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.yetiPlate", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.yetiLegs", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(TwilightForest.ID, "item.yetiBoots", 1L, 32767)); + GTModHandler.sNonReplaceableItems + .add(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ToolCertusQuartzCuttingKnife", 1L, 32767)); + GTModHandler.sNonReplaceableItems + .add(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ToolNetherQuartzCuttingKnife", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "apiaristHelmet", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "apiaristChest", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "apiaristLegs", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "apiaristBoots", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "frameUntreated", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "frameImpregnated", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "frameProven", 1L, 32767)); + GTModHandler.sNonReplaceableItems.add(GTModHandler.getModItem(Forestry.ID, "waxCast", 1L, 32767)); + GTModHandler.sNonReplaceableItems + .add(GTModHandler.getModItem(GalacticraftCore.ID, "item.sensorGlasses", 1L, 32767)); + + RecipeSorter.register( + "gregtech:shaped", + GTShapedRecipe.class, + RecipeSorter.Category.SHAPED, + "after:minecraft:shaped before:minecraft:shapeless"); + RecipeSorter.register( + "gregtech:shapeless", + GTShapelessRecipe.class, + RecipeSorter.Category.SHAPELESS, + "after:minecraft:shapeless"); + + // Register chunk manager with Forge + GTChunkManager.init(); + } + + public void onLoad() { + GTLog.out.println("GTMod: Beginning Load-Phase."); + GTLog.ore.println("GTMod: Beginning Load-Phase."); + + // Clay buckets, which don't get registered until Iguana Tweaks pre-init + if (IguanaTweaksTinkerConstruct.isModLoaded()) { + OrePrefixes.bucketClay.mContainerItem = GTModHandler + .getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketFired", 1L, 0); + GTOreDictUnificator.set( + OrePrefixes.bucketClay, + Materials.Empty, + GTModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketFired", 1L, 0)); + GTOreDictUnificator.set( + OrePrefixes.bucketClay, + Materials.Water, + GTModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketWater", 1L, 0)); + GTOreDictUnificator.set( + OrePrefixes.bucketClay, + Materials.Lava, + GTModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketLava", 1L, 0)); + GTOreDictUnificator.set( + OrePrefixes.bucketClay, + Materials.Milk, + GTModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketMilk", 1L, 0)); + + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.Milk.getFluid(1000L), + GTOreDictUnificator.get(OrePrefixes.bucketClay, Materials.Milk, 1L), + GTOreDictUnificator.get(OrePrefixes.bucketClay, Materials.Empty, 1L))); + } + + if (!GTMod.gregtechproxy.enableUndergroundGravelGen) + PREVENTED_ORES.add(OreGenEvent.GenerateMinable.EventType.GRAVEL); + if (!GTMod.gregtechproxy.enableUndergroundDirtGen) + PREVENTED_ORES.add(OreGenEvent.GenerateMinable.EventType.DIRT); + + MinecraftForge.EVENT_BUS.register(new SpaceProjectWorldSavedData()); + MinecraftForge.EVENT_BUS.register(new GlobalEnergyWorldSavedData("")); + MinecraftForge.EVENT_BUS.register(new GTWorldgenerator.OregenPatternSavedData("")); + MinecraftForge.EVENT_BUS.register(new GlobalMetricsCoverDatabase()); + FMLCommonHandler.instance() + .bus() + .register(new GTWorldgenerator.OregenPatternSavedData("")); + + // IC2 Hazmat + addFullHazmatToIC2Item("hazmatHelmet"); + addFullHazmatToIC2Item("hazmatChestplate"); + addFullHazmatToIC2Item("hazmatLeggings"); + addFullHazmatToIC2Item("hazmatBoots"); + addFullHazmatToIC2Item("nanoHelmet"); + addFullHazmatToIC2Item("nanoBoots"); + addFullHazmatToIC2Item("nanoLeggings"); + addFullHazmatToIC2Item("nanoBodyarmor"); + addFullHazmatToIC2Item("quantumHelmet"); + addFullHazmatToIC2Item("quantumBodyarmor"); + addFullHazmatToIC2Item("quantumLeggings"); + addFullHazmatToIC2Item("quantumBoots"); + + // GT++ Hazmat + addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatHelmetEx", 1); + addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatChestplateEx", 1); + addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatLeggingsEx", 1); + addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorRubBootsEx", 1); + + // GraviSuite Hazmat + addFullHazmatToGeneralItem(GraviSuite.ID, "graviChestPlate", 1L); + addFullHazmatToGeneralItem(GraviSuite.ID, "advNanoChestPlate", 1L); + + // EMT Hazmat + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "itemArmorQuantumChestplate", 1L); + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanoBootsTraveller", 1L); + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanosuitGogglesRevealing", 1L); + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumBootsTraveller", 1L); + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumGogglesRevealing", 1L); + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "SolarHelmetRevealing", 1L); + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanosuitWing", 1L); + addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumWing", 1L); + + // Thaumic Boots Hazmat + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumVoid", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumMeteor", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumComet", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoVoid", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoMeteor", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoComet", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemElectricVoid", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemVoidMeteor", 1L); + addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemVoidComet", 1L); + + // DraconicEvolution Hazmat + addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicBoots", 1L, 0); + addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicHelm", 1L, 0); + addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicLeggs", 1L, 0); + addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicChest", 1L, 0); + addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernBoots", 1L, 0); + addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernHelm", 1L, 0); + addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernLeggs", 1L, 0); + addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernChest", 1L, 0); + + // AdvancedSolarPanel + addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "advanced_solar_helmet", 1L); + addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "hybrid_solar_helmet", 1L); + addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "ultimate_solar_helmet", 1L); + + // TaintedMagic Hazmat + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidwalkerBoots", 1L); + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressHelmet", 1L); + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressChestplate", 1L); + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressLeggings", 1L); + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressHelmet", 1L); + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressChestplate", 1L); + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressLeggings", 1L); + addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidmetalGoggles", 1L); + + // WitchingGadgets Hazmat + addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialHelm", 1L); + addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialChest", 1L); + addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialLegs", 1L); + addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialBoots", 1L); + + // ThaumicTinkerer Hazmat + addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothChestGem", 1L); + addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothBootsGem", 1L); + addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothHelmGem", 1L); + addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothLegsGem", 1L); + + // GalaxySpace Hazmat + addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_helmet", 1L); + addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_helmetglasses", 1L); + addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_plate", 1L); + addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_jetplate", 1L); + addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_leg", 1L); + addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_boots", 1L); + addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_gravityboots", 1L); + + // Extra Hazmat + GregTechAPI.sElectroHazmatList.add(new ItemStack(Items.chainmail_helmet, 1, W)); + GregTechAPI.sElectroHazmatList.add(new ItemStack(Items.chainmail_chestplate, 1, W)); + GregTechAPI.sElectroHazmatList.add(new ItemStack(Items.chainmail_leggings, 1, W)); + GregTechAPI.sElectroHazmatList.add(new ItemStack(Items.chainmail_boots, 1, W)); + + // Infinity Hazmat + addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Helm", 1L); + addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Chest", 1L); + addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Pants", 1L); + addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Shoes", 1L); + + // EnderIO Hazmat + addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_helmet", 1L); + addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_chestplate", 1L); + addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_leggings", 1L); + addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_boots", 1L); + addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_helmet", 1L); + addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_chestplate", 1L); + addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_leggings", 1L); + addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_boots", 1L); + + GregTechAPI.sLoadStarted = true; + for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry + .getRegisteredFluidContainerData()) { + if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { + tData.fluid.amount = 0; + break; + } + } + GTLanguageManager.writePlaceholderStrings(); + } + + public static long tBits = GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED + | GTModHandler.RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL + | GTModHandler.RecipeBits.NOT_REMOVABLE; + + public void onPostLoad() { + GTLog.out.println("GTMod: Beginning PostLoad-Phase."); + GTLog.ore.println("GTMod: Beginning PostLoad-Phase."); + if (GTLog.pal != null) { + final Thread playerActivityLogger = new Thread(new GTPlayerActivityLogger()); + playerActivityLogger.setDaemon(true); + playerActivityLogger.setName("GT5U Player activity logger"); + playerActivityLogger.start(); + } + GregTechAPI.sPostloadStarted = true; + + // This needs to happen late enough that all of the fluids we need have been registered. + // onLoad() seems to be too early, as the New Horizons Core Mod registers some fluids in post-load. + MetaGeneratedItem98.init(); + + GTOreDictUnificator.addItemData(new ItemStack(Items.iron_door, 1), new ItemData(Materials.Iron, 21772800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Items.wooden_door, 1, 32767), new ItemData(Materials.Wood, 21772800L)); + for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry + .getRegisteredFluidContainerData()) { + if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { + tData.fluid.amount = 0; + break; + } + } + GTLog.out.println("GTMod: Adding Configs specific for MetaTileEntities"); + try { + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + if (GregTechAPI.METATILEENTITIES[i] != null) { + GregTechAPI.METATILEENTITIES[i].onConfigLoad(); + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + GTLog.out.println("GTMod: Adding Tool Usage Crafting Recipes for OreDict Items."); + for (Materials aMaterial : Materials.values()) { + if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)) { + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.crushedCentrifuged.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.crystalline.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.crystal.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.crushedPurified.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.cleanGravel.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.reduced.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.clump.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.shard.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.crushed.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), + tBits, + new Object[] { "h", "X", 'X', OrePrefixes.dirtyGravel.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 4L), + tBits, + new Object[] { " X ", 'X', OrePrefixes.dust.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 9L), + tBits, + new Object[] { "X ", 'X', OrePrefixes.dust.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L), + tBits, + new Object[] { "XX", "XX", 'X', OrePrefixes.dustSmall.get(aMaterial) }); + GTModHandler.addCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L), + tBits, + new Object[] { "XXX", "XXX", "XXX", 'X', OrePrefixes.dustTiny.get(aMaterial) }); + } + } + } + + public void onLoadComplete() {} + + public void onServerAboutToStart() { + dimensionWisePollution.clear(); // !!! IMPORTANT for map switching... + GTChunkAssociatedData.clearAll(); + } + + public void onServerStarting() { + GTLog.out.println("GTMod: ServerStarting-Phase started!"); + GTLog.ore.println("GTMod: ServerStarting-Phase started!"); + + GTMusicSystem.ServerSystem.reset(); + + this.mUniverse = null; + this.isFirstServerWorldTick = true; + for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry + .getRegisteredFluidContainerData()) { + if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { + tData.fluid.amount = 0; + break; + } + } + try { + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + if (GregTechAPI.METATILEENTITIES[i] != null) { + GregTechAPI.METATILEENTITIES[i].onServerStart(); + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + public void onServerStarted() { + GregTechAPI.sWirelessRedstone.clear(); + MTEDroneCentre.getCentreMap() + .clear(); + GTLog.out.println( + "GTMod: Cleaning up all OreDict Crafting Recipes, which have an empty List in them, since they are never meeting any Condition."); + List tList = CraftingManager.getInstance() + .getRecipeList(); + for (int i = 0; i < tList.size(); i++) { + if ((tList.get(i) instanceof ShapedOreRecipe)) { + for (Object tObject : ((ShapedOreRecipe) tList.get(i)).getInput()) { + if (((tObject instanceof List)) && (((List) tObject).isEmpty())) { + tList.remove(i--); + break; + } + } + } else if ((tList.get(i) instanceof ShapelessOreRecipe)) { + for (Object tObject : ((ShapelessOreRecipe) tList.get(i)).getInput()) { + if (((tObject instanceof List)) && (((List) tObject).isEmpty())) { + tList.remove(i--); + break; + } + } + } + } + } + + public void onServerStopping() { + GTMusicSystem.ServerSystem.reset(); + File tSaveDirectory = getSaveDirectory(); + GregTechAPI.sWirelessRedstone.clear(); + if (tSaveDirectory != null) { + try { + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + if (GregTechAPI.METATILEENTITIES[i] != null) { + GregTechAPI.METATILEENTITIES[i].onWorldSave(tSaveDirectory); + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + this.mUniverse = null; + // GT_ChunkAssociatedData.saveAll(); todo: figure out if this is needed + + } + + @SubscribeEvent + public void onClientConnectedToServerEvent(FMLNetworkEvent.ClientConnectedToServerEvent aEvent) {} + + /** + * Tells {@link GTNEIDefaultHandler} to reload recipes. + */ + public void reloadNEICache() {} + + /** + * Logging in to server or {@link #reloadNEICache} being called increases the count. + */ + public int getNEIReloadCount() { + return 0; + } + + @SubscribeEvent + public void onArrowNockEvent(ArrowNockEvent aEvent) { + if ((!aEvent.isCanceled()) && (GTUtility.isStackValid(aEvent.result)) + && (GTUtility.getProjectile(SubTag.PROJECTILE_ARROW, aEvent.entityPlayer.inventory) != null)) { + aEvent.entityPlayer.setItemInUse( + aEvent.result, + aEvent.result.getItem() + .getMaxItemUseDuration(aEvent.result)); + aEvent.setCanceled(true); + } + } + + @SubscribeEvent + public void onArrowLooseEvent(ArrowLooseEvent aEvent) { + ItemStack aArrow = GTUtility.getProjectile(SubTag.PROJECTILE_ARROW, aEvent.entityPlayer.inventory); + if ((!aEvent.isCanceled()) && (GTUtility.isStackValid(aEvent.bow)) + && (aArrow != null) + && ((aEvent.bow.getItem() instanceof ItemBow))) { + float tSpeed = aEvent.charge / 20.0F; + tSpeed = (tSpeed * tSpeed + tSpeed * 2.0F) / 3.0F; + if (tSpeed < 0.1D) { + return; + } + if (tSpeed > 1.0D) { + tSpeed = 1.0F; + } + EntityArrow tArrowEntity = ((IProjectileItem) aArrow.getItem()).getProjectile( + SubTag.PROJECTILE_ARROW, + aArrow, + aEvent.entityPlayer.worldObj, + aEvent.entityPlayer, + tSpeed * 2.0F); + if (tSpeed >= 1.0F) { + tArrowEntity.setIsCritical(true); + } + int tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, aEvent.bow); + if (tLevel > 0) { + tArrowEntity.setDamage(tArrowEntity.getDamage() + tLevel * 0.5D + 0.5D); + } + tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, aEvent.bow); + if (tLevel > 0) { + tArrowEntity.setKnockbackStrength(tLevel); + } + tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, aEvent.bow); + if (tLevel > 0) { + tArrowEntity.setFire(tLevel * 100); + } + aEvent.bow.damageItem(1, aEvent.entityPlayer); + aEvent.bow.getItem(); + + new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setPitch(0.64893958288F + tSpeed * 0.5F) + .setVolume(1f) + .setIdentifier(SoundResource.RANDOM_BOW) + .setEntity(aEvent.entityPlayer) + .setWorld(aEvent.entityPlayer.worldObj) + .run(); + + tArrowEntity.canBePickedUp = 1; + if (!aEvent.entityPlayer.capabilities.isCreativeMode) { + aArrow.stackSize -= 1; + } + if (aArrow.stackSize == 0) { + GTUtility.removeNullStacksFromInventory(aEvent.entityPlayer.inventory); + } + if (!aEvent.entityPlayer.worldObj.isRemote) { + aEvent.entityPlayer.worldObj.spawnEntityInWorld(tArrowEntity); + } + aEvent.setCanceled(true); + } + } + + @SubscribeEvent + public void onEndermanTeleportEvent(EnderTeleportEvent aEvent) { + if (((aEvent.entityLiving instanceof EntityEnderman)) + && (aEvent.entityLiving.getActivePotionEffect(Potion.weakness) != null)) { + aEvent.setCanceled(true); + } + } + + @SubscribeEvent + public void onEntitySpawningEvent(EntityJoinWorldEvent aEvent) { + if (aEvent.entity == null) { + return; + } + + if (aEvent.entity.worldObj.isRemote) { + return; + } + + if ((aEvent.entity instanceof EntityItem)) { + ((EntityItem) aEvent.entity) + .setEntityItemStack(GTOreDictUnificator.get(true, ((EntityItem) aEvent.entity).getEntityItem(), true)); + } + } + + @SubscribeEvent + public void onPlayerJoinEvent(cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent event) { + if (event.player == null || event.player.isClientWorld() + || !(event.player instanceof EntityPlayerMP mpPlayer)) { + return; + } + GTValues.NW.sendToPlayer(new GTPacketMusicSystemData(GTMusicSystem.ServerSystem.serialize()), mpPlayer); + } + + @SubscribeEvent + public void onOreGenEvent(OreGenEvent.GenerateMinable aGenerator) { + if ((this.mDisableVanillaOres) && ((aGenerator.generator instanceof WorldGenMinable)) + && (PREVENTED_ORES.contains(aGenerator.type))) { + aGenerator.setResult(Result.DENY); + } + } + + private String getDataAndTime() { + return this.mDateFormat.format(new Date()); + } + + @SubscribeEvent + public void onPlayerInteraction(PlayerInteractEvent aEvent) { + if ((aEvent.entityPlayer == null) || (aEvent.entityPlayer.worldObj == null) + || (aEvent.action == null) + || (aEvent.world.provider == null)) { + return; + } + if ((!aEvent.entityPlayer.worldObj.isRemote) && (aEvent.action != PlayerInteractEvent.Action.RIGHT_CLICK_AIR) + && (GTLog.pal != null)) { + this.mBufferedPlayerActivity.offer( + getDataAndTime() + ";" + + aEvent.action.name() + + ";" + + aEvent.entityPlayer.getDisplayName() + + ";DIM:" + + aEvent.world.provider.dimensionId + + ";" + + aEvent.x + + ";" + + aEvent.y + + ";" + + aEvent.z + + ";|;" + + aEvent.x / 10 + + ";" + + aEvent.y / 10 + + ";" + + aEvent.z / 10); + } + ItemStack aStack = aEvent.entityPlayer.getCurrentEquippedItem(); + if ((aStack != null) && (aEvent.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) + && (aStack.getItem() == Items.flint_and_steel)) { + if ((!aEvent.world.isRemote) && (!aEvent.entityPlayer.capabilities.isCreativeMode) + && (aEvent.world.rand.nextInt(100) >= this.mFlintChance)) { + aEvent.setCanceled(true); + aStack.damageItem(1, aEvent.entityPlayer); + if (aStack.getItemDamage() >= aStack.getMaxDamage()) { + aStack.stackSize -= 1; + } + if (aStack.stackSize <= 0) { + ForgeEventFactory.onPlayerDestroyItem(aEvent.entityPlayer, aStack); + } + } + } + } + + @SubscribeEvent + public void onBlockBreakingEvent(BlockEvent.BreakEvent event) { + EntityPlayer player = event.getPlayer(); + if (player == null) return; + + ItemStack item = event.getPlayer() + .getCurrentEquippedItem(); + if (item == null) return; + + if (!(item.getItem() instanceof MetaGeneratedTool tool)) return; + + IToolStats stats = tool.getToolStats(item); + if (stats == null) return; + + TileEntity tile = event.world.getTileEntity(event.x, event.y, event.z); + stats.onBreakBlock(player, event.x, event.y, event.z, event.block, (byte) event.blockMetadata, tile, event); + } + + @SubscribeEvent + public void onBlockHarvestingEvent(BlockEvent.HarvestDropsEvent aEvent) { + if (aEvent.harvester == null) return; + + if ((!aEvent.world.isRemote) && (GTLog.pal != null)) { + this.mBufferedPlayerActivity.offer( + getDataAndTime() + ";HARVEST_BLOCK;" + + aEvent.harvester.getDisplayName() + + ";DIM:" + + aEvent.world.provider.dimensionId + + ";" + + aEvent.x + + ";" + + aEvent.y + + ";" + + aEvent.z + + ";|;" + + aEvent.x / 10 + + ";" + + aEvent.y / 10 + + ";" + + aEvent.z / 10); + } + + ItemStack aStack = aEvent.harvester.getCurrentEquippedItem(); + if (aStack == null) return; + + if ((aStack.getItem() instanceof MetaGeneratedTool tool)) { + tool.onHarvestBlockEvent( + aEvent.drops, + aStack, + aEvent.harvester, + aEvent.block, + aEvent.x, + aEvent.y, + aEvent.z, + (byte) aEvent.blockMetadata, + aEvent.fortuneLevel, + aEvent.isSilkTouching, + aEvent); + } + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.fireAspect.effectId, aStack) > 2) { + try { + for (ItemStack tDrop : aEvent.drops) { + ItemStack tSmeltingOutput = GTModHandler.getSmeltingOutput(tDrop, false, null); + if (tSmeltingOutput != null) { + tDrop.stackSize *= tSmeltingOutput.stackSize; + tSmeltingOutput.stackSize = tDrop.stackSize; + GTUtility.setStack(tDrop, tSmeltingOutput); + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + } + + @SubscribeEvent + public void registerOre(OreDictionary.OreRegisterEvent aEvent) { + ModContainer tContainer = Loader.instance() + .activeModContainer(); + String aMod = tContainer == null ? "UNKNOWN" : tContainer.getModId(); + String aOriginalMod = aMod; + if (GTOreDictUnificator.isRegisteringOres()) { + aMod = GregTech.ID; + } else if (aMod.equals(GregTech.ID)) { + aMod = "UNKNOWN"; + } + if ((aEvent == null) || (aEvent.Ore == null) + || (aEvent.Ore.getItem() == null) + || (aEvent.Name == null) + || (aEvent.Name.isEmpty()) + || (aEvent.Name.replaceAll("_", "") + .length() - aEvent.Name.length() == 9)) { + if (aOriginalMod.equals(GregTech.ID)) { + aOriginalMod = "UNKNOWN"; + } + GTLog.ore.println( + aOriginalMod + + " did something very bad! The registration is too invalid to even be shown properly. This happens only if you register null, invalid Items, empty Strings or even nonexisting Events to the OreDict."); + throw new IllegalArgumentException( + aOriginalMod + + " did something very bad! The registration is too invalid to even be shown properly. This happens only if you register null, invalid Items, empty Strings or even nonexisting Events to the OreDict."); + } + try { + aEvent.Ore.stackSize = 1; + + // skipping TinkerConstruct ore registration + if (this.mIgnoreTcon && aOriginalMod.equals(TinkerConstruct.ID)) { + return; + } + String tModToName = aMod + " -> " + aEvent.Name; + if (this.mOreDictActivated || GregTechAPI.sPostloadStarted || GregTechAPI.sLoadFinished) { + tModToName = aOriginalMod + " --Late--> " + aEvent.Name; + } + if (((aEvent.Ore.getItem() instanceof ItemBlock)) + || (GTUtility.getBlockFromStack(aEvent.Ore) != Blocks.air)) { + GTOreDictUnificator.addToBlacklist(aEvent.Ore); + } + this.mRegisteredOres.add(aEvent.Ore); + if (this.mIgnoredItems.contains(aEvent.Name)) { + if ((aEvent.Name.startsWith("item"))) { + GTLog.ore.println(tModToName); + if (aEvent.Name.equals("itemCopperWire")) { + GTOreDictUnificator.registerOre(OreDictNames.craftingWireCopper, aEvent.Ore); + } + if (aEvent.Name.equals("itemRubber")) { + GTOreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Rubber, aEvent.Ore); + } + return; + } + } else if (this.mIgnoredNames.contains(aEvent.Name)) { + GTLog.ore.println(tModToName + " is getting ignored via hardcode."); + return; + } else if (aEvent.Name.equals("stone")) { + GTOreDictUnificator.registerOre("stoneSmooth", aEvent.Ore); + return; + } else if (aEvent.Name.equals("cobblestone")) { + GTOreDictUnificator.registerOre("stoneCobble", aEvent.Ore); + return; + } else if ((aEvent.Name.contains("|")) || (aEvent.Name.contains("*")) + || (aEvent.Name.contains(":")) + || (aEvent.Name.contains(".")) + || (aEvent.Name.contains("$"))) { + GTLog.ore + .println(tModToName + " is using a private Prefix and is therefor getting ignored properly."); + return; + } else if (aEvent.Name.equals("copperWire")) { + GTOreDictUnificator.registerOre(OreDictNames.craftingWireCopper, aEvent.Ore); + } else if (aEvent.Name.equals("oreHeeEndrium")) { + GTOreDictUnificator.registerOre(OrePrefixes.ore, Materials.HeeEndium, aEvent.Ore); + } else if (aEvent.Name.equals("sheetPlastic")) { + GTOreDictUnificator.registerOre(OrePrefixes.plate, Materials.Plastic, aEvent.Ore); + } else if (aEvent.Name.startsWith("shard")) { + switch (aEvent.Name) { + case "shardAir" -> { + GTOreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedAir, aEvent.Ore); + return; + } + case "shardWater" -> { + GTOreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedWater, aEvent.Ore); + return; + } + case "shardFire" -> { + GTOreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedFire, aEvent.Ore); + return; + } + case "shardEarth" -> { + GTOreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedEarth, aEvent.Ore); + return; + } + case "shardOrder" -> { + GTOreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedOrder, aEvent.Ore); + return; + } + case "shardEntropy" -> { + GTOreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedEntropy, aEvent.Ore); + return; + } + } + } else if (aEvent.Name.equals("fieryIngot")) { + GTOreDictUnificator.registerOre(OrePrefixes.ingot, Materials.FierySteel, aEvent.Ore); + return; + } else if (aEvent.Name.equals("ironwood")) { + GTOreDictUnificator.registerOre(OrePrefixes.ingot, Materials.IronWood, aEvent.Ore); + return; + } else if (aEvent.Name.equals("steeleaf")) { + GTOreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Steeleaf, aEvent.Ore); + return; + } else if (aEvent.Name.equals("knightmetal")) { + GTOreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Knightmetal, aEvent.Ore); + return; + } else if (aEvent.Name.equals("compressedAluminum")) { + GTOreDictUnificator.registerOre(OrePrefixes.compressed, Materials.Aluminium, aEvent.Ore); + return; + } else if (aEvent.Name.contains(" ")) { + GTLog.ore.println( + tModToName + " is getting re-registered because the OreDict Name containing invalid spaces."); + GTOreDictUnificator + .registerOre(aEvent.Name.replaceAll(" ", ""), GTUtility.copyAmount(1, aEvent.Ore)); + aEvent.Ore.setStackDisplayName("Invalid OreDictionary Tag"); + return; + } else if (this.mInvalidNames.contains(aEvent.Name)) { + GTLog.ore.println(tModToName + " is wrongly registered and therefor getting ignored."); + + return; + } + OrePrefixes aPrefix = OrePrefixes.getOrePrefix(aEvent.Name); + Materials aMaterial = Materials._NULL; + if ((aPrefix == OrePrefixes.nugget) && (aMod.equals(Thaumcraft.ID)) + && (aEvent.Ore.getItem() + .getUnlocalizedName() + .contains("ItemResource"))) { + return; + } + if (aPrefix == null) { + if (aEvent.Name.toLowerCase() + .equals(aEvent.Name)) { + GTLog.ore.println(tModToName + " is invalid due to being solely lowercased."); + return; + } else if (aEvent.Name.toUpperCase() + .equals(aEvent.Name)) { + GTLog.ore.println(tModToName + " is invalid due to being solely uppercased."); + return; + } else if (Character.isUpperCase(aEvent.Name.charAt(0))) { + GTLog.ore.println(tModToName + " is invalid due to the first character being uppercased."); + } + } else { + if (aPrefix.mDontUnificateActively) { + GTOreDictUnificator.addToBlacklist(aEvent.Ore); + } + if (aPrefix != aPrefix.mPrefixInto) { + String tNewName = aEvent.Name.replaceFirst(aPrefix.toString(), aPrefix.mPrefixInto.toString()); + if (!GTOreDictUnificator.isRegisteringOres()) { + GTLog.ore.println( + tModToName + " uses a depricated Prefix, and is getting re-registered as " + tNewName); + } + GTOreDictUnificator.registerOre(tNewName, aEvent.Ore); + return; + } + String tName = aEvent.Name.replaceFirst(aPrefix.toString(), ""); + if (tName.length() > 0) { + char firstChar = tName.charAt(0); + if (Character.isUpperCase(firstChar) || Character.isLowerCase(firstChar) + || firstChar == '_' + || Character.isDigit(firstChar)) { + if (aPrefix.mIsMaterialBased) { + aMaterial = Materials.get(tName); + if (aMaterial != aMaterial.mMaterialInto) { + GTOreDictUnificator.registerOre(aPrefix, aMaterial.mMaterialInto, aEvent.Ore); + if (!GTOreDictUnificator.isRegisteringOres()) { + GTLog.ore.println( + tModToName + " uses a deprecated Material and is getting re-registered as " + + aPrefix.get(aMaterial.mMaterialInto)); + } + return; + } + if (!aPrefix.isIgnored(aMaterial)) { + aPrefix.add(GTUtility.copyAmount(1, aEvent.Ore)); + } + if (aMaterial != Materials._NULL) { + Materials tReRegisteredMaterial; + for (Iterator i$ = aMaterial.mOreReRegistrations.iterator(); i$ + .hasNext(); GTOreDictUnificator + .registerOre(aPrefix, tReRegisteredMaterial, aEvent.Ore)) { + tReRegisteredMaterial = i$.next(); + } + aMaterial.add(GTUtility.copyAmount(1, aEvent.Ore)); + + if (GregTechAPI.sThaumcraftCompat != null && aPrefix.doGenerateItem(aMaterial) + && !aPrefix.isIgnored(aMaterial)) { + List tAspects = new ArrayList<>(); + for (TC_AspectStack tAspect : aPrefix.mAspects) tAspect.addToAspectList(tAspects); + if (aPrefix.mMaterialAmount >= 3628800 || aPrefix.mMaterialAmount < 0) + for (TC_AspectStack tAspect : aMaterial.mAspects) + tAspect.addToAspectList(tAspects); + GregTechAPI.sThaumcraftCompat.registerThaumcraftAspectsToItem( + GTUtility.copyAmount(1, aEvent.Ore), + tAspects, + aEvent.Name); + } + + switch (aPrefix) { + case crystal -> { + if ((aMaterial == Materials.CertusQuartz) + || (aMaterial == Materials.NetherQuartz) + || (aMaterial == Materials.Fluix)) { + GTOreDictUnificator.registerOre(OrePrefixes.gem, aMaterial, aEvent.Ore); + } + } + case gem -> { + if (aMaterial == Materials.Lapis || aMaterial == Materials.Sodalite) { + GTOreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore); + } else if (aMaterial == Materials.Lazurite) { + GTOreDictUnificator.registerOre(Dyes.dyeCyan, aEvent.Ore); + } else + if (aMaterial == Materials.InfusedAir || aMaterial == Materials.InfusedWater + || aMaterial == Materials.InfusedFire + || aMaterial == Materials.InfusedEarth + || aMaterial == Materials.InfusedOrder + || aMaterial == Materials.InfusedEntropy) { + GTOreDictUnificator.registerOre( + aMaterial.mName.replaceFirst("Infused", "shard"), + aEvent.Ore); + } else if (aMaterial == Materials.Chocolate) { + GTOreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); + } else if (aMaterial == Materials.CertusQuartz + || aMaterial == Materials.NetherQuartz) { + GTOreDictUnificator + .registerOre(OrePrefixes.item.get(aMaterial), aEvent.Ore); + GTOreDictUnificator + .registerOre(OrePrefixes.crystal, aMaterial, aEvent.Ore); + GTOreDictUnificator + .registerOre(OreDictNames.craftingQuartz, aEvent.Ore); + } else + if (aMaterial == Materials.Fluix || aMaterial == Materials.Quartz + || aMaterial == Materials.Quartzite) { + GTOreDictUnificator.registerOre( + OrePrefixes.crystal, + aMaterial, + aEvent.Ore); + GTOreDictUnificator + .registerOre(OreDictNames.craftingQuartz, aEvent.Ore); + } + } + case cableGt01 -> { + if (aMaterial == Materials.Tin) { + GTOreDictUnificator.registerOre(OreDictNames.craftingWireTin, aEvent.Ore); + } else if (aMaterial == Materials.AnyCopper) { + GTOreDictUnificator + .registerOre(OreDictNames.craftingWireCopper, aEvent.Ore); + } else if (aMaterial == Materials.Gold) { + GTOreDictUnificator.registerOre(OreDictNames.craftingWireGold, aEvent.Ore); + } else if (aMaterial == Materials.AnyIron) { + GTOreDictUnificator.registerOre(OreDictNames.craftingWireIron, aEvent.Ore); + } + } + case lens -> { + if ((aMaterial.contains(SubTag.TRANSPARENT)) + && (aMaterial.mColor != Dyes._NULL)) { + GTOreDictUnificator.registerOre( + "craftingLens" + aMaterial.mColor.toString() + .replaceFirst("dye", ""), + aEvent.Ore); + } + } + case plate -> { + if ((aMaterial == Materials.Plastic) || (aMaterial == Materials.Rubber)) { + GTOreDictUnificator.registerOre(OrePrefixes.sheet, aMaterial, aEvent.Ore); + } else if (aMaterial == Materials.Silicon) { + GTOreDictUnificator.registerOre(OrePrefixes.item, aMaterial, aEvent.Ore); + } else if (aMaterial == Materials.Wood) { + GTOreDictUnificator.addToBlacklist(aEvent.Ore); + GTOreDictUnificator.registerOre(OrePrefixes.plank, aMaterial, aEvent.Ore); + } + } + case cell -> { + if (aMaterial == Materials.Empty) { + GTOreDictUnificator.addToBlacklist(aEvent.Ore); + } + } + case gearGt -> GTOreDictUnificator + .registerOre(OrePrefixes.gear, aMaterial, aEvent.Ore); + case stick -> { + if (!GTRecipeRegistrator.sRodMaterialList.contains(aMaterial)) { + GTRecipeRegistrator.sRodMaterialList.add(aMaterial); + } else if (aMaterial == Materials.Wood) { + GTOreDictUnificator.addToBlacklist(aEvent.Ore); + } else if ((aMaterial == Materials.Tin) || (aMaterial == Materials.Lead) + || (aMaterial == Materials.SolderingAlloy)) { + GTOreDictUnificator + .registerOre(ToolDictNames.craftingToolSolderingMetal, aEvent.Ore); + } + } + case dust -> { + if (aMaterial == Materials.Salt) { + GTOreDictUnificator.registerOre("itemSalt", aEvent.Ore); + } else if (aMaterial == Materials.Wood) { + GTOreDictUnificator.registerOre("pulpWood", aEvent.Ore); + } else if (aMaterial == Materials.Wheat) { + GTOreDictUnificator.registerOre("foodFlour", aEvent.Ore); + } else if (aMaterial == Materials.Lapis) { + GTOreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore); + } else if (aMaterial == Materials.Lazurite) { + GTOreDictUnificator.registerOre(Dyes.dyeCyan, aEvent.Ore); + } else if (aMaterial == Materials.Sodalite) { + GTOreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore); + } else if (aMaterial == Materials.Cocoa) { + GTOreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); + GTOreDictUnificator.registerOre("foodCocoapowder", aEvent.Ore); + } else if (aMaterial == Materials.Coffee) { + GTOreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); + } else if (aMaterial == Materials.BrownLimonite) { + GTOreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); + } else if (aMaterial == Materials.YellowLimonite) { + GTOreDictUnificator.registerOre(Dyes.dyeYellow, aEvent.Ore); + } + } + case ingot -> { + if (aMaterial == Materials.Rubber) { + GTOreDictUnificator.registerOre("itemRubber", aEvent.Ore); + } else if (aMaterial == Materials.FierySteel) { + GTOreDictUnificator.registerOre("fieryIngot", aEvent.Ore); + } else if (aMaterial == Materials.IronWood) { + GTOreDictUnificator.registerOre("ironwood", aEvent.Ore); + } else if (aMaterial == Materials.Steeleaf) { + GTOreDictUnificator.registerOre("steeleaf", aEvent.Ore); + } else if (aMaterial == Materials.Knightmetal) { + GTOreDictUnificator.registerOre("knightmetal", aEvent.Ore); + } else if ((aMaterial == Materials.Brass) && (aEvent.Ore.getItemDamage() == 2) + && (aEvent.Ore.getUnlocalizedName() + .equals("item.ingotBrass")) + && (new ItemStack(aEvent.Ore.getItem(), 1, 0).getUnlocalizedName() + .contains("red"))) { + GTOreDictUnificator.set( + OrePrefixes.ingot, + Materials.RedAlloy, + new ItemStack(aEvent.Ore.getItem(), 1, 0)); + GTOreDictUnificator.set( + OrePrefixes.ingot, + Materials.BlueAlloy, + new ItemStack(aEvent.Ore.getItem(), 1, 1)); + GTOreDictUnificator.set( + OrePrefixes.ingot, + Materials.Brass, + new ItemStack(aEvent.Ore.getItem(), 1, 2)); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(aEvent.Ore.getItem(), 1, 3)) + .itemOutputs(new ItemStack(aEvent.Ore.getItem(), 16, 4)) + .duration(20 * SECONDS) + .eut(8) + .addTo(cutterRecipes); + } + } + default -> {} + } + if (aPrefix.mIsUnificatable && !aMaterial.mUnificatable) { + return; + } + } else { + for (Dyes tDye : Dyes.VALUES) { + if (aEvent.Name.endsWith( + tDye.name() + .replaceFirst("dye", ""))) { + GTOreDictUnificator.addToBlacklist(aEvent.Ore); + GTLog.ore.println( + tModToName + + " Oh man, why the fuck would anyone need a OreDictified Color for this, that is even too much for GregTech... do not report this, this is just a random Comment about how ridiculous this is."); + return; + } + } + // GT_FML_LOGGER.info("Material Name: "+aEvent.Name+ " + // !!!Unknown Material detected!!! Please report to GregTech Intergalactical for + // additional compatiblity. This is not an Error, an Issue nor a Lag Source, it is just + // an Information, which you should pass to me."); + // GTLog.ore.println(tModToName + " uses an unknown + // Material. Report this to GregTech."); + return; + } + } else { + aPrefix.add(GTUtility.copyAmount(1, aEvent.Ore)); + } + } + } else if (aPrefix.mIsSelfReferencing) { + aPrefix.add(GTUtility.copyAmount(1, aEvent.Ore)); + } else { + GTLog.ore.println(tModToName + " uses a Prefix as full OreDict Name, and is therefor invalid."); + aEvent.Ore.setStackDisplayName("Invalid OreDictionary Tag"); + return; + } + switch (aPrefix) { + case dye -> { + if (GTUtility.isStringValid(tName)) { + GTOreDictUnificator.registerOre(OrePrefixes.dye, aEvent.Ore); + } + } + case stoneSmooth -> GTOreDictUnificator.registerOre("stone", aEvent.Ore); + case stoneCobble -> GTOreDictUnificator.registerOre("cobblestone", aEvent.Ore); + case plank -> { + if (tName.equals("Wood")) { + GTOreDictUnificator.addItemData(aEvent.Ore, new ItemData(Materials.Wood, 3628800L)); + } + } + case slab -> { + if (tName.equals("Wood")) { + GTOreDictUnificator.addItemData(aEvent.Ore, new ItemData(Materials.Wood, 1814400L)); + } + } + case sheet -> { + if (tName.equals("Plastic")) { + GTOreDictUnificator.registerOre(OrePrefixes.plate, Materials.Plastic, aEvent.Ore); + } else if (tName.equals("Rubber")) { + GTOreDictUnificator.registerOre(OrePrefixes.plate, Materials.Rubber, aEvent.Ore); + } + } + case crafting -> { + switch (tName) { + case "ToolSolderingMetal" -> GregTechAPI.registerSolderingMetal(aEvent.Ore); + case "IndustrialDiamond" -> GTOreDictUnificator.addToBlacklist(aEvent.Ore); + case "WireCopper" -> GTOreDictUnificator + .registerOre(OrePrefixes.wire, Materials.Copper, aEvent.Ore); + } + } + case wood -> { + if (tName.equals("Rubber")) { + GTOreDictUnificator.registerOre("logRubber", aEvent.Ore); + } + } + case food -> { + if (tName.equals("Cocoapowder")) { + GTOreDictUnificator.registerOre(OrePrefixes.dust, Materials.Cocoa, aEvent.Ore); + } + } + default -> {} + } + } + GTLog.ore.println(tModToName); + + OreDictEventContainer tOre = new OreDictEventContainer(aEvent, aPrefix, aMaterial, aMod); + if ((!this.mOreDictActivated) || (!GregTechAPI.sUnificationEntriesRegistered)) { + this.mEvents.add(tOre); + } else { + this.mEvents.clear(); + } + if (this.mOreDictActivated) { + registerRecipes(tOre); + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + + @SuppressWarnings("deprecated") + public static void stepMaterialsVanilla(Collection mEvents, + ProgressManager.ProgressBar progressBar) { + int size = 5; + int sizeStep = mEvents.size() / 20 - 1; + GTProxy.OreDictEventContainer tEvent; + for (Iterator i$ = mEvents.iterator(); i$.hasNext(); GTProxy + .registerRecipes(tEvent)) { + tEvent = i$.next(); + sizeStep--; + if (sizeStep == 0) { + GT_FML_LOGGER.info("Baking : " + size + "%", new Object[0]); + sizeStep = mEvents.size() / 20 - 1; + size += 5; + } + progressBar.step(tEvent.mMaterial == null ? "" : tEvent.mMaterial.toString()); + } + ProgressManager.pop(progressBar); + } + + @SubscribeEvent + public void onLivingUpdate(LivingUpdateEvent aEvent) { + if (aEvent.entityLiving.onGround) { + int tX = MathHelper.floor_double(aEvent.entityLiving.posX), + tY = MathHelper.floor_double(aEvent.entityLiving.boundingBox.minY - 0.001F), + tZ = MathHelper.floor_double(aEvent.entityLiving.posZ); + Block tBlock = aEvent.entityLiving.worldObj.getBlock(tX, tY, tZ); + if (tBlock instanceof IBlockOnWalkOver) + ((IBlockOnWalkOver) tBlock).onWalkOver(aEvent.entityLiving, aEvent.entityLiving.worldObj, tX, tY, tZ); + } + } + + @SubscribeEvent + public void onFluidContainerRegistration(FluidContainerRegistry.FluidContainerRegisterEvent aFluidEvent) { + if ((aFluidEvent.data.filledContainer.getItem() == Items.potionitem) + && (aFluidEvent.data.filledContainer.getItemDamage() == 0)) { + aFluidEvent.data.fluid.amount = 0; + } + GTOreDictUnificator.addToBlacklist(aFluidEvent.data.emptyContainer); + GTOreDictUnificator.addToBlacklist(aFluidEvent.data.filledContainer); + GTUtility.addFluidContainerData(aFluidEvent.data); + } + + @SubscribeEvent + public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) { + if (aEvent.side.isServer()) { + if (aEvent.phase == TickEvent.Phase.START) { + TICK_LOCK.lock(); + } else { + TICK_LOCK.unlock(); + GTMusicSystem.ServerSystem.tick(); + } + + // Making sure it is being freed up in order to prevent exploits or Garbage Collection mishaps. + LAST_BROKEN_TILEENTITY.set(null); + } + } + + @SubscribeEvent + public void onWorldTickEvent(TickEvent.WorldTickEvent aEvent) { + if (aEvent.world.provider.dimensionId == 0) mTicksUntilNextCraftSound--; + if (isFirstWorldTick) { + for (Runnable runnable : GregTechAPI.sFirstWorldTick) runnable.run(); + isFirstWorldTick = false; + GTValues.worldTickHappened = true; + } + if (aEvent.side.isServer()) { + if (this.mUniverse == null) { + this.mUniverse = aEvent.world; + } + if (this.isFirstServerWorldTick) { + File tSaveDiretory = getSaveDirectory(); + if (tSaveDiretory != null) { + this.isFirstServerWorldTick = false; + try { + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + if (GregTechAPI.METATILEENTITIES[i] != null) { + GregTechAPI.METATILEENTITIES[i].onWorldLoad(tSaveDiretory); + } + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + } + if ((aEvent.world.getTotalWorldTime() % 100L == 0L) + && ((this.mItemDespawnTime != 6000) || (this.mMaxEqualEntitiesAtOneSpot > 0))) { + long startTime = System.nanoTime(); + double oldX = 0, oldY = 0, oldZ = 0; + if (debugEntityCramming && (aEvent.world.loadedEntityList.size() != 0)) { + GTLog.out.println("CRAM: Entity list size " + aEvent.world.loadedEntityList.size()); + } + for (int i = 0; i < aEvent.world.loadedEntityList.size(); i++) { + if ((aEvent.world.loadedEntityList.get(i) instanceof Entity)) { + Entity tEntity = aEvent.world.loadedEntityList.get(i); + if (((tEntity instanceof EntityItem)) && (this.mItemDespawnTime != 6000) + && (((EntityItem) tEntity).lifespan == 6000)) { + ((EntityItem) tEntity).lifespan = this.mItemDespawnTime; + } else if (((tEntity instanceof EntityLivingBase)) && (this.mMaxEqualEntitiesAtOneSpot > 0) + && (!(tEntity instanceof EntityPlayer)) + && (tEntity.canBePushed()) + && (((EntityLivingBase) tEntity).getHealth() > 0.0F)) { + List tList = tEntity.worldObj.getEntitiesWithinAABBExcludingEntity( + tEntity, + tEntity.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); + Class tClass = tEntity.getClass(); + int tEntityCount = 1; + if (tList != null) { + for (Object o : tList) { + if ((o != null) && (o.getClass() == tClass)) { + tEntityCount++; + } + } + } + if (tEntityCount > this.mMaxEqualEntitiesAtOneSpot) { + if (debugEntityCramming) { + // Cheeseball way of not receiving a bunch of spam caused by 1 location + // obviously fails if there are crammed entities in more than one spot. + if (tEntity.posX != oldX && tEntity.posY != oldY && tEntity.posZ != oldZ) { + GTLog.out.println( + "CRAM: Excess entities: " + tEntityCount + + " at X " + + tEntity.posX + + " Y " + + tEntity.posY + + " Z " + + tEntity.posZ); + oldX = tEntity.posX; + oldY = tEntity.posY; + oldZ = tEntity.posZ; + } + } + tEntity.attackEntityFrom( + DamageSource.inWall, + tEntityCount - this.mMaxEqualEntitiesAtOneSpot); + } + } + } + } + if (debugEntityCramming && (aEvent.world.loadedEntityList.size() != 0)) { + GTLog.out.println( + "CRAM: Time spent checking " + (System.nanoTime() - startTime) / 1000 + " microseconds"); + } + } + + Pollution.onWorldTick(aEvent); + } + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) { + for (TileEntity tileEntity : event.world.loadedTileEntityList) { + if (tileEntity instanceof IGregTechTileEntity) { + tileEntity.onChunkUnload(); + } + } + } + + public static void registerRecipes(GTProxy.OreDictEventContainer aOre) { + if ((aOre.mEvent.Ore == null) || (aOre.mEvent.Ore.getItem() == null) + || (aOre.mPrefix == null) + || (aOre.mPrefix.isIgnored(aOre.mMaterial))) { + return; + } + if (aOre.mEvent.Ore.stackSize != 1) { + aOre.mEvent.Ore.stackSize = 1; + } + + aOre.mPrefix.processOre( + aOre.mMaterial == null ? Materials._NULL : aOre.mMaterial, + aOre.mEvent.Name, + aOre.mModID, + GTUtility.copyAmount(1, aOre.mEvent.Ore)); + } + + @SubscribeEvent + public void onPlayerTickEventServer(TickEvent.PlayerTickEvent aEvent) { + if ((!aEvent.side.isServer()) || (aEvent.phase == TickEvent.Phase.END) || (aEvent.player.isDead)) { + return; + } + + if ((aEvent.player.ticksExisted % 200 == 0) && (aEvent.player.capabilities.allowEdit) + && (!aEvent.player.capabilities.isCreativeMode) + && (this.mSurvivalIntoAdventure)) { + aEvent.player.setGameType(GameType.ADVENTURE); + aEvent.player.capabilities.allowEdit = false; + if (this.mAxeWhenAdventure) { + GTUtility.sendChatToPlayer( + aEvent.player, + GTLanguageManager.addStringLocalization( + "Interaction_DESCRIPTION_Index_097", + "It's dangerous to go alone! Take this.")); + aEvent.player.worldObj.spawnEntityInWorld( + new EntityItem( + aEvent.player.worldObj, + aEvent.player.posX, + aEvent.player.posY, + aEvent.player.posZ, + MetaGeneratedTool01.INSTANCE + .getToolWithStats(IDMetaTool01.AXE.ID, 1, Materials.Flint, Materials.Wood, null))); + } + } + final boolean tHungerEffect = (this.mHungerEffect) && (aEvent.player.ticksExisted % 2400 == 1200); + + if (aEvent.player.ticksExisted % 120 != 0) { + return; + } + + int tCount = 64; + for (int i = 0; i < 36; i++) { + final ItemStack tStack = aEvent.player.inventory.getStackInSlot(i); + if (tStack == null) { + continue; + } + + if (!aEvent.player.capabilities.isCreativeMode) { + GTUtility.applyRadioactivity(aEvent.player, GTUtility.getRadioactivityLevel(tStack), tStack.stackSize); + final float tHeat = GTUtility.getHeatDamageFromItem(tStack); + if (tHeat != 0.0F) { + if (tHeat > 0.0F) { + GTUtility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack); + } else { + GTUtility.applyFrostDamage(aEvent.player, -tHeat); + } + } + } + if (tHungerEffect) { + tCount += tStack.stackSize * 64 / Math.max(1, tStack.getMaxStackSize()); + } + if (this.mInventoryUnification) { + GTOreDictUnificator.setStack(true, tStack); + } + + } + for (int i = 0; i < 4; i++) { + final ItemStack tStack = aEvent.player.inventory.armorInventory[i]; + if (tStack == null) { + continue; + } + + if (!aEvent.player.capabilities.isCreativeMode) { + GTUtility.applyRadioactivity(aEvent.player, GTUtility.getRadioactivityLevel(tStack), tStack.stackSize); + final float tHeat = GTUtility.getHeatDamageFromItem(tStack); + if (tHeat != 0.0F) { + if (tHeat > 0.0F) { + GTUtility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack); + } else { + GTUtility.applyFrostDamage(aEvent.player, -tHeat); + } + } + } + if (tHungerEffect) { + tCount += 256; + } + + } + if (tHungerEffect) { + aEvent.player.addExhaustion(Math.max(1.0F, tCount / 666.6F)); + } + } + + public GTClientPreference getClientPreference(UUID aPlayerID) { + return mClientPrefernces.get(aPlayerID); + } + + public void setClientPreference(UUID aPlayerID, GTClientPreference aPreference) { + mClientPrefernces.put(aPlayerID, aPreference); + } + + private static List getOreDictNames(ItemStack stack) { + return Arrays.stream(OreDictionary.getOreIDs(stack)) + .mapToObj(OreDictionary::getOreName) + .collect(Collectors.toList()); + } + + @Override + public int getBurnTime(ItemStack aFuel) { + if ((aFuel == null) || (aFuel.getItem() == null)) { + return 0; + } + int rFuelValue = 0; + if ((aFuel.getItem() instanceof MetaGeneratedItem)) { + final Short tFuelValue = ((MetaGeneratedItem) aFuel.getItem()).mBurnValues + .get((short) aFuel.getItemDamage()); + if (tFuelValue != null) { + rFuelValue = Math.max(rFuelValue, tFuelValue); + } + } + final NBTTagCompound tNBT = aFuel.getTagCompound(); + if (tNBT != null) { + // See if we have something defined by NBT + final short tValue = tNBT.getShort("GT.ItemFuelValue"); + rFuelValue = Math.max(rFuelValue, tValue); + } else { + // If not check the ore dict + rFuelValue = Math.max( + rFuelValue, + getOreDictNames(aFuel).stream() + .mapToInt(f -> oreDictBurnTimes.getOrDefault(f, 0)) + .max() + .orElse(0)); + } + + // If we have something from the GT MetaGenerated_Item, ItemFuelValue, or OreDict return + if (rFuelValue > 0) return rFuelValue; + + // Otherwise, a few more checks + if (GTUtility.areStacksEqual(aFuel, new ItemStack(Blocks.wooden_button, 1))) return 150; + else if (GTUtility.areStacksEqual(aFuel, new ItemStack(Blocks.ladder, 1))) return 100; + else if (GTUtility.areStacksEqual(aFuel, new ItemStack(Items.sign, 1))) return 600; + else if (GTUtility.areStacksEqual(aFuel, new ItemStack(Items.wooden_door, 1))) return 600; + else if (GTUtility.areStacksEqual(aFuel, ItemList.Block_MSSFUEL.get(1))) return 150000; + else if (GTUtility.areStacksEqual(aFuel, ItemList.Block_SSFUEL.get(1))) return 100000; + + return 0; + } + + // ------------------------ Adds all fluids corresponding to materials ------------------------ + + public Fluid addAutoGeneratedCorrespondingFluid(Materials aMaterial) { + // If the fluid is registered as custom inside the Material's constructor then to add custom fluid + // textures go to blocks/fluids and place the .png. File should be called fluid.fluid.{unlocalised_name}.png. + // All lower case. + final String fluidTexture = aMaterial.mIconSet.is_custom ? "fluid." + aMaterial.mName.toLowerCase() + : "autogenerated"; + + return GTFluidFactory.builder(aMaterial.mName.toLowerCase(Locale.ENGLISH)) + .withLocalizedName(aMaterial.mDefaultLocalName) + .withTextureName(fluidTexture) + .withColorRGBA(aMaterial.mRGBa) + .withStateAndTemperature(LIQUID, aMaterial.getLiquidTemperature()) + .buildAndRegister() + .configureMaterials(aMaterial) + .registerBContainers(GTOreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), ItemList.Cell_Empty.get(1L)) + .asFluid(); + } + + public Fluid addAutoGeneratedCorrespondingGas(Materials aMaterial) { + // If the fluid is registered as custom inside the Material's constructor then to add custom fluid + // textures go to blocks/fluids and place the .png. File should be called fluid.gas.{unlocalised_name}.png. All + // lower case. + final String fluidTexture = aMaterial.mIconSet.is_custom ? ("gas." + aMaterial.mName.toLowerCase()) + : "autogenerated"; + + return GTFluidFactory.builder(aMaterial.mName.toLowerCase(Locale.ENGLISH)) + .withLocalizedName(aMaterial.mDefaultLocalName) + .withTextureName(fluidTexture) + .withColorRGBA(aMaterial.mRGBa) + .withStateAndTemperature(GAS, aMaterial.getGasTemperature()) + .buildAndRegister() + .configureMaterials(aMaterial) + .registerBContainers(GTOreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), ItemList.Cell_Empty.get(1L)) + .asFluid(); + } + + public Fluid addAutogeneratedPlasmaFluid(Materials aMaterial) { + // If the fluid is registered as custom inside the Material's constructor then to add custom fluid + // textures go to blocks/fluids and place the .png. File should be called fluid.plasma.{unlocalised_name}.png. + // All lower case. + final String fluidTexture = aMaterial.mIconSet.is_custom ? ("plasma." + aMaterial.mName.toLowerCase()) + : "plasma.autogenerated"; + + return GTFluidFactory.builder("plasma." + aMaterial.mName.toLowerCase(Locale.ENGLISH)) + .withLocalizedName(aMaterial.mDefaultLocalName + " Plasma") + .withTextureName(fluidTexture) + .withColorRGBA(aMaterial.mMoltenRGBa) + .withStateAndTemperature(PLASMA, 10000) + .buildAndRegister() + .configureMaterials(aMaterial) + .registerContainers( + GTOreDictUnificator.get(OrePrefixes.cellPlasma, aMaterial, 1L), + ItemList.Cell_Empty.get(1L), + aMaterial.getMolten(1) != null ? 144 : 1000) + .asFluid(); + } + + public Fluid addAutogeneratedMoltenFluid(Materials aMaterial) { + // If the fluid is registered as custom inside the Material's constructor then to add custom fluid + // textures go to blocks/fluids and place the .png. File should be called fluid.molten.{unlocalised_name}.png. + // All lower case. + final String fluidTexture = aMaterial.mIconSet.is_custom ? ("molten." + aMaterial.mName.toLowerCase()) + : "molten.autogenerated"; + + return GTFluidFactory.builder("molten." + aMaterial.mName.toLowerCase(Locale.ENGLISH)) + .withLocalizedName("Molten " + aMaterial.mDefaultLocalName) + .withTextureName(fluidTexture) + .withColorRGBA(aMaterial.mMoltenRGBa) + .withStateAndTemperature(MOLTEN, aMaterial.mMeltingPoint < 0 ? 1000 : aMaterial.mMeltingPoint) + .buildAndRegister() + .configureMaterials(aMaterial) + .registerContainers( + GTOreDictUnificator.get(OrePrefixes.cellMolten, aMaterial, 1L), + ItemList.Cell_Empty.get(1L), + 144) + .asFluid(); + } + + // ------------------------------------------------------------------------------------------------------------ + + public void addAutoGeneratedHydroCrackedFluids(Materials aMaterial) { + Fluid[] crackedFluids = new Fluid[3]; + String[] namePrefixes = { "lightlyhydrocracked.", "moderatelyhydrocracked.", "severelyhydrocracked." }; + OrePrefixes[] orePrefixes = { OrePrefixes.cellHydroCracked1, OrePrefixes.cellHydroCracked2, + OrePrefixes.cellHydroCracked3 }; + final Fluid uncrackedFluid; + if (aMaterial.mFluid != null) { + uncrackedFluid = aMaterial.mFluid; + } else if (aMaterial.mGas != null) { + uncrackedFluid = aMaterial.mGas; + } else return; + for (int i = 0; i < 3; i++) { + crackedFluids[i] = GTFluidFactory.builder(namePrefixes[i] + aMaterial.mName.toLowerCase(Locale.ENGLISH)) + .withIconsFrom(uncrackedFluid) + .withLocalizedName(orePrefixes[i].mLocalizedMaterialPre + aMaterial.mDefaultLocalName) + .withColorRGBA(aMaterial.mRGBa) + .withStateAndTemperature(GAS, 775) + .buildAndRegister() + .registerBContainers( + GTOreDictUnificator.get(orePrefixes[i], aMaterial, 1L), + ItemList.Cell_Empty.get(1L)) + .asFluid(); + + int hydrogenAmount = 2 * i + 2; + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(i + 1)) + .fluidInputs(new FluidStack(uncrackedFluid, 1000), Materials.Hydrogen.getGas(hydrogenAmount * 800)) + .fluidOutputs(new FluidStack(crackedFluids[i], 1000)) + .duration((1 + i) * SECONDS) + .eut(240) + .addTo(crackingRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(Materials.Hydrogen.getCells(hydrogenAmount), GTUtility.getIntegratedCircuit(i + 1)) + .itemOutputs(Materials.Empty.getCells(hydrogenAmount)) + .fluidInputs(new FluidStack(uncrackedFluid, 1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 800)) + .duration((8 + 4 * i) * SECONDS) + .eut(TierEU.RECIPE_LV) + .addTo(RecipeMaps.chemicalReactorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(aMaterial.getCells(1), GTUtility.getIntegratedCircuit(i + 1)) + .itemOutputs(Materials.Empty.getCells(1)) + .fluidInputs(Materials.Hydrogen.getGas(hydrogenAmount * 1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 800)) + .duration((8 + 4 * i) * SECONDS) + .eut(TierEU.RECIPE_LV) + .addTo(RecipeMaps.chemicalReactorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(i + 1)) + .fluidInputs(new FluidStack(uncrackedFluid, 1000), Materials.Hydrogen.getGas(hydrogenAmount * 1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 800)) + .duration((4 + 2 * i) * SECONDS) + .eut(TierEU.RECIPE_HV) + .addTo(RecipeMaps.multiblockChemicalReactorRecipes); + } + aMaterial.setHydroCrackedFluids(crackedFluids); + } + + public void addAutoGeneratedSteamCrackedFluids(Materials aMaterial) { + Fluid[] crackedFluids = new Fluid[3]; + String[] namePrefixes = { "lightlysteamcracked.", "moderatelysteamcracked.", "severelysteamcracked." }; + OrePrefixes[] orePrefixes = { OrePrefixes.cellSteamCracked1, OrePrefixes.cellSteamCracked2, + OrePrefixes.cellSteamCracked3 }; + final Fluid uncrackedFluid; + if (aMaterial.mFluid != null) { + uncrackedFluid = aMaterial.mFluid; + } else if (aMaterial.mGas != null) { + uncrackedFluid = aMaterial.mGas; + } else return; + for (int i = 0; i < 3; i++) { + crackedFluids[i] = GTFluidFactory.builder(namePrefixes[i] + aMaterial.mName.toLowerCase(Locale.ENGLISH)) + .withIconsFrom(uncrackedFluid) + .withLocalizedName(orePrefixes[i].mLocalizedMaterialPre + aMaterial.mDefaultLocalName) + .withColorRGBA(aMaterial.mRGBa) + .withStateAndTemperature(GAS, 775) + .buildAndRegister() + .registerBContainers( + GTOreDictUnificator.get(orePrefixes[i], aMaterial, 1L), + ItemList.Cell_Empty.get(1L)) + .asFluid(); + + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(i + 1)) + .fluidInputs(new FluidStack(uncrackedFluid, 1000), GTModHandler.getSteam(1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 1200)) + .duration((1 + i) * SECONDS) + .eut(240) + .addTo(crackingRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("steamCell", 1L), GTUtility.getIntegratedCircuit(i + 1)) + .itemOutputs(Materials.Empty.getCells(1)) + .fluidInputs(new FluidStack(uncrackedFluid, 1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 800)) + .duration((8 + 4 * i) * SECONDS) + .eut(TierEU.RECIPE_LV) + .addTo(RecipeMaps.chemicalReactorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(aMaterial.getCells(1), GTUtility.getIntegratedCircuit(i + 1)) + .itemOutputs(Materials.Empty.getCells(1)) + .fluidInputs(GTModHandler.getSteam(1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 800)) + .duration((8 + 4 * i) * SECONDS) + .eut(TierEU.RECIPE_LV) + .addTo(RecipeMaps.chemicalReactorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(aMaterial.getCells(1), GTUtility.getIntegratedCircuit(i + 1)) + .itemOutputs(Materials.Empty.getCells(1)) + .fluidInputs(getFluidStack("ic2steam", 1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 800)) + .duration((8 + 4 * i) * SECONDS) + .eut(TierEU.RECIPE_LV) + .addTo(RecipeMaps.chemicalReactorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(i + 1)) + .fluidInputs(new FluidStack(uncrackedFluid, 1000), GTModHandler.getSteam(1000)) + .fluidOutputs(new FluidStack(crackedFluids[i], 800)) + .duration((4 + 2 * i) * SECONDS) + .eut(TierEU.RECIPE_HV) + .addTo(RecipeMaps.multiblockChemicalReactorRecipes); + } + aMaterial.setSteamCrackedFluids(crackedFluids); + } + + /** + * @see GTFluidFactory#of(String, String, Materials, FluidState, int) + * @see GTFluidFactory#of(String, String, FluidState, int) + * @deprecated use {@link GTFluidFactory#builder} + */ + @Deprecated + public Fluid addFluid(String aName, String aLocalized, Materials aMaterial, int aState, int aTemperatureK) { + return GTFluidFactory.of(aName, aLocalized, aMaterial, FluidState.VALID_STATES[aState], aTemperatureK); + } + + /** + * @deprecated use {@link GTFluidFactory#builder} + */ + @SuppressWarnings({ "MethodWithTooManyParameters" }) // Deprecated method + @Deprecated + public Fluid addFluid(String aName, String aLocalized, Materials aMaterial, int aState, int aTemperatureK, + ItemStack aFullContainer, ItemStack aEmptyContainer, int aFluidAmount) { + return GTFluidFactory.builder(aName) + .withLocalizedName(aLocalized) + .withStateAndTemperature(FluidState.fromValue(aState), aTemperatureK) + .buildAndRegister() + .configureMaterials(aMaterial) + .registerContainers(aFullContainer, aEmptyContainer, aFluidAmount) + .asFluid(); + } + + /** + * @deprecated use {@link GTFluidFactory#builder} + */ + @Deprecated + @SuppressWarnings({ "MethodWithTooManyParameters" }) // Deprecated method + public Fluid addFluid(String aName, String aTexture, String aLocalized, Materials aMaterial, short[] aRGBa, + int aState, int aTemperatureK, ItemStack aFullContainer, ItemStack aEmptyContainer, int aFluidAmount) { + return GTFluidFactory.builder(aName) + .withLocalizedName(aLocalized) + .withStillIconResourceLocation(new ResourceLocation(GregTech.ID, "fluids/fluid." + aTexture)) + .withColorRGBA(aRGBa) + .withStateAndTemperature(FluidState.fromValue(aState), aTemperatureK) + .buildAndRegister() + .configureMaterials(aMaterial) + .registerContainers(aFullContainer, aEmptyContainer, aFluidAmount) + .asFluid(); + } + + public File getSaveDirectory() { + return this.mUniverse == null ? null + : this.mUniverse.getSaveHandler() + .getWorldDirectory(); + } + + public long getAnimationTicks() { + return 0L; + } + + public float getPartialRenderTicks() { + return 0; + } + + public void registerUnificationEntries() { + GTOreDictUnificator.resetUnificationEntries(); + for (OreDictEventContainer tOre : this.mEvents) { + if ((!(tOre.mEvent.Ore.getItem() instanceof MetaGeneratedItem)) && (tOre.mPrefix != null) + && (tOre.mPrefix.mIsUnificatable) + && (tOre.mMaterial != null)) { + boolean checkModID = tOre.mModID != null; + + if (checkModID) { + if (tOre.mModID.equals(Names.ENDER_I_O)) { + if (tOre.mPrefix == OrePrefixes.ingot && tOre.mMaterial == Materials.DarkSteel) { + GTOreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false); + GTOreDictUnificator.set( + tOre.mPrefix, + tOre.mMaterial, + tOre.mEvent.Ore, + ManualOreDictTweaks.shouldOredictBeOverwritten(tOre.mModID, tOre.mEvent.Name), + true); + continue; + } + } + } + if (GTOreDictUnificator.isBlacklisted(tOre.mEvent.Ore)) { + GTOreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, true); + } else { + GTOreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false); + GTOreDictUnificator.set( + tOre.mPrefix, + tOre.mMaterial, + tOre.mEvent.Ore, + checkModID && ManualOreDictTweaks.shouldOredictBeOverwritten(tOre.mModID, tOre.mEvent.Name), + true); + } + } + } + + for (OreDictEventContainer tOre : this.mEvents) { + if (((tOre.mEvent.Ore.getItem() instanceof MetaGeneratedItem)) && (tOre.mPrefix != null) + && (tOre.mPrefix.mIsUnificatable) + && (tOre.mMaterial != null)) { + if (GTOreDictUnificator.isBlacklisted(tOre.mEvent.Ore)) { + GTOreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, true); + } else { + GTOreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false); + GTOreDictUnificator.set( + tOre.mPrefix, + tOre.mMaterial, + tOre.mEvent.Ore, + (tOre.mModID != null) + && ManualOreDictTweaks.shouldOredictBeOverwritten(tOre.mModID, tOre.mEvent.Name), + true); + } + } + } + GregTechAPI.sUnificationEntriesRegistered = true; + GTRecipe.reInit(); + } + + @SuppressWarnings("deprecation") + public void activateOreDictHandler() { + this.mOreDictActivated = true; + ProgressManager.ProgressBar progressBar = ProgressManager.push("Register materials", mEvents.size()); + + if (BetterLoadingScreen.isModLoaded()) { + GTValues.cls_enabled = true; + try { + GTCLSCompat.stepMaterialsCLS(mEvents, progressBar); + } catch (IllegalAccessException e) { + GT_FML_LOGGER.catching(e); + } + } else GTProxy.stepMaterialsVanilla(this.mEvents, progressBar); + } + + @Deprecated + public static final HashMap> dimensionWiseChunkData = new HashMap<>(16); // stores + // chunk + // data + // that + // is + // loaded/saved + + public static final HashMap dimensionWisePollution = new HashMap<>(16); // stores + // GT_Polluttors + // objects + public static final byte GTOIL = 3, GTOILFLUID = 2, GTPOLLUTION = 1, GTMETADATA = 0, NOT_LOADED = 0, LOADED = 1; // consts + + // TO get default's fast + @Deprecated + public static int[] getDefaultChunkDataOnCreation() { + return new int[] { NOT_LOADED, 0, -1, -1 }; + } + + @Deprecated + public static int[] getDefaultChunkDataOnLoad() { + return new int[] { LOADED, 0, -1, -1 }; + } + + @SubscribeEvent + public void handleChunkLoadEvent(ChunkDataEvent.Load event) { + UndergroundOil.migrate(event); + Pollution.migrate(event); + } + + @SubscribeEvent + public void onBlockBreakSpeedEvent(PlayerEvent.BreakSpeed aEvent) { + if (aEvent.entityPlayer != null) { + ItemStack aStack = aEvent.entityPlayer.getCurrentEquippedItem(); + if ((aStack != null) && ((aStack.getItem() instanceof MetaGeneratedTool))) { + aEvent.newSpeed = ((MetaGeneratedTool) aStack.getItem()).onBlockBreakSpeedEvent( + aEvent.newSpeed, + aStack, + aEvent.entityPlayer, + aEvent.block, + aEvent.x, + aEvent.y, + aEvent.z, + (byte) aEvent.metadata, + aEvent); + } + } + } + + public static class OreDictEventContainer { + + public final OreDictionary.OreRegisterEvent mEvent; + public final OrePrefixes mPrefix; + public final Materials mMaterial; + public final String mModID; + + public OreDictEventContainer(OreDictionary.OreRegisterEvent aEvent, OrePrefixes aPrefix, Materials aMaterial, + String aModID) { + this.mEvent = aEvent; + this.mPrefix = aPrefix; + this.mMaterial = aMaterial; + this.mModID = ((aModID == null) || (aModID.equals("UNKNOWN")) ? null : aModID); + } + } + + @SubscribeEvent + public void onBlockEvent(BlockEvent event) { + if (event.block.getUnlocalizedName() + .equals("blockAlloyGlass")) GregTechAPI.causeMachineUpdate(event.world, event.x, event.y, event.z); + } + + public static void addFullHazmatToGeneralItem(String aModID, String aItem, long aAmount, int aMeta) { + ItemStack item = GTModHandler.getModItem(aModID, aItem, aAmount, aMeta); + addItemToHazmatLists(item); + } + + public static void addFullHazmatToGeneralItem(String aModID, String aItem, long aAmount) { + ItemStack item = GTModHandler.getModItem(aModID, aItem, aAmount, W); + addItemToHazmatLists(item); + } + + public static void addFullHazmatToIC2Item(String aItem) { + ItemStack item = GTModHandler.getIC2Item(aItem, 1L, W); + addItemToHazmatLists(item); + } + + private static void addItemToHazmatLists(ItemStack item) { + GregTechAPI.sGasHazmatList.add(item); + GregTechAPI.sBioHazmatList.add(item); + GregTechAPI.sFrostHazmatList.add(item); + GregTechAPI.sHeatHazmatList.add(item); + GregTechAPI.sRadioHazmatList.add(item); + GregTechAPI.sElectroHazmatList.add(item); + } + + public static boolean providesProtection(ItemStack aStack) { + + if (GTUtility.hasHazmatEnchant(aStack)) return true; + + boolean isGas = GTUtility.isStackInList(aStack, GregTechAPI.sGasHazmatList); + boolean isBio = GTUtility.isStackInList(aStack, GregTechAPI.sBioHazmatList); + boolean isFrost = GTUtility.isStackInList(aStack, GregTechAPI.sFrostHazmatList); + boolean isHeat = GTUtility.isStackInList(aStack, GregTechAPI.sHeatHazmatList); + boolean isRadio = GTUtility.isStackInList(aStack, GregTechAPI.sRadioHazmatList); + boolean isElectro = GTUtility.isStackInList(aStack, GregTechAPI.sElectroHazmatList); + return isGas && isBio && isFrost && isHeat && isRadio && isElectro; + } + + @SubscribeEvent + public void onItemTooltip(ItemTooltipEvent event) { + if (event.itemStack != null) { + ItemStack aStackTemp = event.itemStack; + GTItemStack aStack = new GTItemStack(aStackTemp); + if (providesProtection(aStackTemp)) { + event.toolTip.add(EnumChatFormatting.LIGHT_PURPLE + "Provides full hazmat protection."); + } + } + } +} diff --git a/src/main/java/gregtech/common/GTServer.java b/src/main/java/gregtech/common/GTServer.java new file mode 100644 index 0000000000..b9758ac657 --- /dev/null +++ b/src/main/java/gregtech/common/GTServer.java @@ -0,0 +1,36 @@ +package gregtech.common; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class GTServer extends GTProxy { + + @Override + public boolean isServerSide() { + return true; + } + + @Override + public boolean isClientSide() { + return false; + } + + @Override + public boolean isBukkitSide() { + return false; + } + + @Override + public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) {} + + @Override + public int addArmor(String aPrefix) { + return 0; + } + + @Override + public EntityPlayer getThePlayer() { + return null; + } +} diff --git a/src/main/java/gregtech/common/GTThaumcraftCompat.java b/src/main/java/gregtech/common/GTThaumcraftCompat.java new file mode 100644 index 0000000000..7f8c6dd8c7 --- /dev/null +++ b/src/main/java/gregtech/common/GTThaumcraftCompat.java @@ -0,0 +1,285 @@ +package gregtech.common; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.ResourceLocation; + +import gregtech.api.enums.TCAspects; +import gregtech.api.interfaces.internal.IThaumcraftCompat; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import thaumcraft.api.ThaumcraftApi; +import thaumcraft.api.ThaumcraftApiHelper; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.crafting.CrucibleRecipe; +import thaumcraft.api.crafting.IArcaneRecipe; +import thaumcraft.api.crafting.InfusionEnchantmentRecipe; +import thaumcraft.api.crafting.InfusionRecipe; +import thaumcraft.api.research.ResearchCategories; +import thaumcraft.api.research.ResearchCategoryList; +import thaumcraft.api.research.ResearchItem; +import thaumcraft.api.research.ResearchPage; + +public class GTThaumcraftCompat implements IThaumcraftCompat { + + public GTThaumcraftCompat() { + TCAspects.AER.mAspect = Aspect.AIR; + TCAspects.ALIENIS.mAspect = Aspect.ELDRITCH; + TCAspects.AQUA.mAspect = Aspect.WATER; + TCAspects.ARBOR.mAspect = Aspect.TREE; + TCAspects.AURAM.mAspect = Aspect.AURA; + TCAspects.BESTIA.mAspect = Aspect.BEAST; + TCAspects.COGNITIO.mAspect = Aspect.MIND; + TCAspects.CORPUS.mAspect = Aspect.FLESH; + TCAspects.EXANIMIS.mAspect = Aspect.UNDEAD; + TCAspects.FABRICO.mAspect = Aspect.CRAFT; + TCAspects.FAMES.mAspect = Aspect.HUNGER; + TCAspects.GELUM.mAspect = Aspect.COLD; + TCAspects.GRANUM.mAspect = Aspect.PLANT; + TCAspects.HERBA.mAspect = Aspect.PLANT; + TCAspects.HUMANUS.mAspect = Aspect.MAN; + TCAspects.IGNIS.mAspect = Aspect.FIRE; + TCAspects.INSTRUMENTUM.mAspect = Aspect.TOOL; + TCAspects.ITER.mAspect = Aspect.TRAVEL; + TCAspects.LIMUS.mAspect = Aspect.SLIME; + TCAspects.LUCRUM.mAspect = Aspect.GREED; + TCAspects.LUX.mAspect = Aspect.LIGHT; + TCAspects.MACHINA.mAspect = Aspect.MECHANISM; + TCAspects.MESSIS.mAspect = Aspect.CROP; + TCAspects.METALLUM.mAspect = Aspect.METAL; + TCAspects.METO.mAspect = Aspect.HARVEST; + TCAspects.MORTUUS.mAspect = Aspect.DEATH; + TCAspects.MOTUS.mAspect = Aspect.MOTION; + TCAspects.ORDO.mAspect = Aspect.ORDER; + TCAspects.PANNUS.mAspect = Aspect.CLOTH; + TCAspects.PERDITIO.mAspect = Aspect.ENTROPY; + TCAspects.PERFODIO.mAspect = Aspect.MINE; + TCAspects.PERMUTATIO.mAspect = Aspect.EXCHANGE; + TCAspects.POTENTIA.mAspect = Aspect.ENERGY; + TCAspects.PRAECANTATIO.mAspect = Aspect.MAGIC; + TCAspects.SANO.mAspect = Aspect.HEAL; + TCAspects.SENSUS.mAspect = Aspect.SENSES; + TCAspects.SPIRITUS.mAspect = Aspect.SOUL; + TCAspects.TELUM.mAspect = Aspect.WEAPON; + TCAspects.TERRA.mAspect = Aspect.EARTH; + TCAspects.TEMPESTAS.mAspect = Aspect.WEATHER; + TCAspects.TENEBRAE.mAspect = Aspect.DARKNESS; + TCAspects.TUTAMEN.mAspect = Aspect.ARMOR; + TCAspects.VACUOS.mAspect = Aspect.VOID; + TCAspects.VENENUM.mAspect = Aspect.POISON; + TCAspects.VICTUS.mAspect = Aspect.LIFE; + TCAspects.VINCULUM.mAspect = Aspect.TRAP; + TCAspects.VITIUM.mAspect = Aspect.TAINT; + TCAspects.VITREUS.mAspect = Aspect.CRYSTAL; + TCAspects.VOLATUS.mAspect = Aspect.FLIGHT; + + TCAspects.STRONTIO.mAspect = new Aspect( + "strontio", + 0xEEC2B3, + new Aspect[] { Aspect.MIND, Aspect.ENTROPY }, + new ResourceLocation("gregtech:textures/aspects/" + TCAspects.STRONTIO.name() + ".png"), + 1); + TCAspects.NEBRISUM.mAspect = new Aspect( + "nebrisum", + 0xEEEE7E, + new Aspect[] { Aspect.MINE, Aspect.GREED }, + new ResourceLocation("gregtech:textures/aspects/" + TCAspects.NEBRISUM.name() + ".png"), + 1); + TCAspects.ELECTRUM.mAspect = new Aspect( + "electrum", + 0xC0EEEE, + new Aspect[] { Aspect.ENERGY, Aspect.MECHANISM }, + new ResourceLocation("gregtech:textures/aspects/" + TCAspects.ELECTRUM.name() + ".png"), + 1); + TCAspects.MAGNETO.mAspect = new Aspect( + "magneto", + 0xC0C0C0, + new Aspect[] { Aspect.METAL, Aspect.TRAVEL }, + new ResourceLocation("gregtech:textures/aspects/" + TCAspects.MAGNETO.name() + ".png"), + 1); + TCAspects.RADIO.mAspect = new Aspect( + "radio", + 0xC0FFC0, + new Aspect[] { Aspect.LIGHT, Aspect.ENERGY }, + new ResourceLocation("gregtech:textures/aspects/" + TCAspects.RADIO.name() + ".png"), + 1); + + GTLanguageManager.addStringLocalization("tc.aspect.strontio", "Stupidness, Incompetence"); + GTLanguageManager.addStringLocalization("tc.aspect.nebrisum", "Cheatyness, Raiding"); + GTLanguageManager.addStringLocalization("tc.aspect.electrum", "Electricity, Lightning"); + GTLanguageManager.addStringLocalization("tc.aspect.magneto", "Magnetism, Attraction"); + GTLanguageManager.addStringLocalization("tc.aspect.radio", "Radiation"); + } + + private static AspectList getAspectList(List aAspects) { + AspectList rAspects = new AspectList(); + TCAspects.TC_AspectStack tAspect; + for (Iterator i$ = aAspects.iterator(); i$.hasNext(); rAspects + .add((Aspect) tAspect.mAspect.mAspect, (int) tAspect.mAmount)) { + tAspect = i$.next(); + } + return rAspects; + } + + @Override + public Object addResearch(String aResearch, String aName, String aText, String[] aParentResearches, + String aCategory, ItemStack aIcon, int aComplexity, int aType, int aX, int aY, + List aAspects, ItemStack[] aResearchTriggers, Object[] aPages) { + ResearchCategoryList tCategory = ResearchCategories.getResearchList(aCategory); + if (tCategory == null) { + return null; + } + for (ResearchItem tResearch : tCategory.research.values()) { + if ((tResearch.displayColumn == aX) && (tResearch.displayRow == aY)) { + aX += (aX > 0 ? 5 : -5); + aY += (aY > 0 ? 5 : -5); + } + } + ResearchItem rResearch = new ResearchItem( + aResearch, + aCategory, + getAspectList(aAspects), + aX, + aY, + aComplexity, + aIcon); + ArrayList tPages = new ArrayList<>(aPages.length); + GTLanguageManager.addStringLocalization("tc.research_name." + aResearch, aName); + GTLanguageManager.addStringLocalization("tc.research_text." + aResearch, "[GT] " + aText); + for (Object tPage : aPages) { + if ((tPage instanceof String)) { + tPages.add(new ResearchPage((String) tPage)); + } else if ((tPage instanceof IRecipe)) { + tPages.add(new ResearchPage((IRecipe) tPage)); + } else if ((tPage instanceof IArcaneRecipe)) { + tPages.add(new ResearchPage((IArcaneRecipe) tPage)); + } else if ((tPage instanceof CrucibleRecipe)) { + tPages.add(new ResearchPage((CrucibleRecipe) tPage)); + } else if ((tPage instanceof InfusionRecipe)) { + tPages.add(new ResearchPage((InfusionRecipe) tPage)); + } else if ((tPage instanceof InfusionEnchantmentRecipe)) { + tPages.add(new ResearchPage((InfusionEnchantmentRecipe) tPage)); + } + } + if ((aType & 0x40) != 0) { + rResearch.setAutoUnlock(); + } + if ((aType & 0x1) != 0) { + rResearch.setSecondary(); + } + if ((aType & 0x20) != 0) { + rResearch.setSpecial(); + } + if ((aType & 0x8) != 0) { + rResearch.setVirtual(); + } + if ((aType & 0x4) != 0) { + rResearch.setHidden(); + } + if ((aType & 0x10) != 0) { + rResearch.setRound(); + } + if ((aType & 0x2) != 0) { + rResearch.setStub(); + } + if (aParentResearches != null) { + ArrayList tParentResearches = new ArrayList<>(); + Collections.addAll(tParentResearches, aParentResearches); + if (tParentResearches.size() > 0) { + rResearch.setParents(tParentResearches.toArray(new String[0])); + rResearch.setConcealed(); + } + } + if (aResearchTriggers != null) { + rResearch.setItemTriggers(aResearchTriggers); + rResearch.setHidden(); + } + rResearch.setPages(tPages.toArray(new ResearchPage[0])); + return rResearch.registerResearchItem(); + } + + @Override + public Object addCrucibleRecipe(String aResearch, Object aInput, ItemStack aOutput, + List aAspects) { + if ((GTUtility.isStringInvalid(aResearch)) || (aInput == null) + || (aOutput == null) + || (aAspects == null) + || (aAspects.isEmpty())) { + return null; + } + return ThaumcraftApi.addCrucibleRecipe( + aResearch, + GTUtility.copyOrNull(aOutput), + ((aInput instanceof ItemStack)) || ((aInput instanceof ArrayList)) ? aInput : aInput.toString(), + getAspectList(aAspects)); + } + + @Override + public Object addInfusionRecipe(String aResearch, ItemStack aMainInput, ItemStack[] aSideInputs, ItemStack aOutput, + int aInstability, List aAspects) { + if ((GTUtility.isStringInvalid(aResearch)) || (aMainInput == null) + || (aSideInputs == null) + || (aOutput == null) + || (aAspects == null) + || (aAspects.isEmpty())) { + return null; + } + return ThaumcraftApi.addInfusionCraftingRecipe( + aResearch, + GTUtility.copyOrNull(aOutput), + aInstability, + getAspectList(aAspects), + aMainInput, + aSideInputs); + } + + @Override + public Object addInfusionEnchantmentRecipe(String aResearch, Enchantment aEnchantment, int aInstability, + List aAspects, ItemStack[] aSideInputs) { + if ((GTUtility.isStringInvalid(aResearch)) || (aSideInputs == null) + || (aAspects == null) + || (aEnchantment == null) + || (aAspects.isEmpty())) { + return null; + } + return ThaumcraftApi + .addInfusionEnchantmentRecipe(aResearch, aEnchantment, aInstability, getAspectList(aAspects), aSideInputs); + } + + @Override + public boolean registerThaumcraftAspectsToItem(ItemStack aExampleStack, List aAspects, + String aOreDict) { + if (aAspects.isEmpty()) return false; + ThaumcraftApi.registerObjectTag(aOreDict, getAspectList(aAspects)); + return true; + } + + @Override + public boolean registerThaumcraftAspectsToItem(ItemStack aStack, List aAspects, + boolean aAdditive) { + if (aAspects.isEmpty()) return false; + if (aAdditive) { + ThaumcraftApi.registerComplexObjectTag(aStack, getAspectList(aAspects)); + return true; + } + AspectList tAlreadyRegisteredAspects = ThaumcraftApiHelper.getObjectAspects(aStack); + if (tAlreadyRegisteredAspects == null || tAlreadyRegisteredAspects.size() <= 0) { + ThaumcraftApi.registerObjectTag(aStack, getAspectList(aAspects)); + } + return true; + } + + @Override + public boolean registerPortholeBlacklistedBlock(Block aBlock) { + ThaumcraftApi.portableHoleBlackList.add(aBlock); + return true; + } +} diff --git a/src/main/java/gregtech/common/GTWorldgenerator.java b/src/main/java/gregtech/common/GTWorldgenerator.java new file mode 100644 index 0000000000..6762fb868c --- /dev/null +++ b/src/main/java/gregtech/common/GTWorldgenerator.java @@ -0,0 +1,686 @@ +package gregtech.common; + +import static gregtech.api.enums.GTValues.debugOrevein; +import static gregtech.api.enums.GTValues.debugWorldGen; +import static gregtech.api.enums.GTValues.oreveinAttempts; +import static gregtech.api.enums.GTValues.oreveinMaxPlacementAttempts; +import static gregtech.api.enums.GTValues.oreveinPercentage; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.WorldSavedData; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraftforge.event.world.WorldEvent; + +import cpw.mods.fml.common.IWorldGenerator; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.net.GTPacketSendOregenPattern; +import gregtech.api.objects.XSTR; +import gregtech.api.util.GTLog; +import gregtech.api.world.GTWorldgen; +import gregtech.common.blocks.TileEntityOres; +import gregtech.common.config.worldgen.ConfigEndAsteroids; + +public class GTWorldgenerator implements IWorldGenerator { + + private static int mEndAsteroidProbability = 300; + private static int mSize = 100; + private static int endMinSize = 50; + private static int endMaxSize = 200; + private static boolean endAsteroids = true; + public static List mList = new ArrayList<>(); + public static HashSet 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 WorldgenGTOreLayer noOresInVein = new WorldgenGTOreLayer( + new OreMixBuilder().name("NoOresInVein") + .disabledByDefault() + .heightRange(0, 255) + .weight(0) + .density(255) + .size(16) + .primary(Materials.Aluminium) + .secondary(Materials.Aluminium) + .inBetween(Materials.Aluminium) + .sporadic(Materials.Aluminium)); + + public static Hashtable validOreveins = new Hashtable<>(1024); + public boolean mIsGenerating = false; + public static final Object listLock = new Object(); + public static OregenPattern oregenPattern = OregenPattern.AXISSYMMETRICAL; + + public GTWorldgenerator() { + endAsteroids = ConfigEndAsteroids.generateEndAsteroids; + endMinSize = ConfigEndAsteroids.EndAsteroidMinSize; + endMaxSize = ConfigEndAsteroids.EndAsteroidMaxSize; + mEndAsteroidProbability = ConfigEndAsteroids.EndAsteroidProbability; + GameRegistry.registerWorldGenerator(this, 1073741823); + if (debugWorldGen) { + GTLog.out.println("GT_Worldgenerator created"); + } + } + + @Override + public void generate(Random aRandom, int aX, int aZ, World aWorld, IChunkProvider aChunkGenerator, + IChunkProvider aChunkProvider) { + synchronized (listLock) { + mList.add( + new WorldGenContainer( + new XSTR(Math.abs(aRandom.nextInt()) + 1), + aX, + aZ, + aWorld.provider.dimensionId, + aWorld, + aChunkGenerator, + aChunkProvider, + aWorld.getBiomeGenForCoords(aX * 16 + 8, aZ * 16 + 8).biomeName)); + if (debugWorldGen) GTLog.out.println( + "ADD WorldSeed:" + aWorld.getSeed() + + " DimId" + + aWorld.provider.dimensionId + + " chunk x:" + + aX + + " z:" + + aZ + + " SIZE: " + + mList.size()); + } + + if (!this.mIsGenerating) { + this.mIsGenerating = true; + int mList_sS = mList.size(); + mList_sS = Math.min(mList_sS, 5); // Run a maximum of 5 chunks at a time through worldgen. Extra chunks get + // done later. + for (int i = 0; i < mList_sS; i++) { + WorldGenContainer toRun = (WorldGenContainer) mList.get(0); + if (debugWorldGen) GTLog.out.println( + "RUN WorldSeed:" + aWorld.getSeed() + + " DimId" + + aWorld.provider.dimensionId + + " chunk x:" + + toRun.mX + + " z:" + + toRun.mZ + + " SIZE: " + + mList.size() + + " i: " + + i); + synchronized (listLock) { + mList.remove(0); + } + toRun.run(); + } + this.mIsGenerating = false; + } + } + + public static boolean isOreChunk(int chunkX, int chunkZ) { + if (oregenPattern == OregenPattern.EQUAL_SPACING) { + return Math.floorMod(chunkX, 3) == 1 && Math.floorMod(chunkZ, 3) == 1; + } + // add next if statement here or convert to switch when expanding OregenPattern enum + + // AXISSYMMETRICAL + return Math.abs(chunkX) % 3 == 1 && Math.abs(chunkZ) % 3 == 1; + } + + public static class OregenPatternSavedData extends WorldSavedData { + + private static final String NAME = "GregTech_OregenPattern"; + private static final String KEY = "oregenPattern"; + + public OregenPatternSavedData(String p_i2141_1_) { + super(p_i2141_1_); + } + + public static void loadData(World world) { + if (world.getWorldInfo() + .getWorldTotalTime() == 0L) { + // The world has just been created -> use newest pattern + oregenPattern = OregenPattern.values()[OregenPattern.values().length - 1]; + } else { + // This is an old world. Use legacy pattern for now, readFromNBT may change this if + // GregTech_OregenPattern.dat is present + oregenPattern = OregenPattern.AXISSYMMETRICAL; + } + + // load OregenPatternSavedData + WorldSavedData instance = world.mapStorage + .loadData(OregenPatternSavedData.class, OregenPatternSavedData.NAME); + if (instance == null) { + instance = new OregenPatternSavedData(NAME); + world.mapStorage.setData(OregenPatternSavedData.NAME, instance); + } + instance.markDirty(); + } + + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load event) { + final World world = event.world; + if (!world.isRemote && world.provider.dimensionId == 0) { + loadData(world); + } + } + + @SubscribeEvent + public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + if (event.player instanceof EntityPlayerMP player) { + GTValues.NW.sendToPlayer(new GTPacketSendOregenPattern(oregenPattern), player); + } + } + + @Override + public void readFromNBT(NBTTagCompound p_76184_1_) { + if (p_76184_1_.hasKey(KEY)) { + int ordinal = p_76184_1_.getByte(KEY); + ordinal = MathHelper.clamp_int(ordinal, 0, OregenPattern.values().length - 1); + oregenPattern = OregenPattern.values()[ordinal]; + } + } + + @Override + public void writeToNBT(NBTTagCompound p_76187_1_) { + // If we have so many different OregenPatterns that byte isn't good enough something is wrong + p_76187_1_.setByte(KEY, (byte) oregenPattern.ordinal()); + } + + } + + public enum OregenPattern { + // The last value is used when creating a new world + AXISSYMMETRICAL, + EQUAL_SPACING; + } + + public static class WorldGenContainer implements Runnable { + + public final Random mRandom; + public final int mX; + public final int mZ; + public final int mDimensionType; + public final World mWorld; + public final IChunkProvider mChunkGenerator; + public final IChunkProvider mChunkProvider; + public final String mBiome; + // Used for outputting orevein weights and bins + // static int test=0; + + // Local class to track which orevein seeds must be checked when doing chunkified worldgen + static class NearbySeeds { + + public int mX; + public int mZ; + + NearbySeeds(int x, int z) { + this.mX = x; + this.mZ = z; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof NearbySeeds that)) return false; + if (this.mX != that.mX) return false; + return this.mZ == that.mZ; + } + + @Override + public int hashCode() { + int result = this.mX; + result = 31 * result + this.mZ; + return result; + } + } + + public static ArrayList seedList = new ArrayList<>(); + + // aX and aZ are now the by-chunk X and Z for the chunk of interest + public WorldGenContainer(Random aRandom, int aX, int aZ, int aDimensionType, World aWorld, + IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) { + this.mRandom = aRandom; + this.mX = aX; + this.mZ = aZ; + this.mDimensionType = aDimensionType; + this.mWorld = aWorld; + this.mChunkGenerator = aChunkGenerator; + this.mChunkProvider = aChunkProvider; + this.mBiome = aBiome; + } + + // How to evaluate oregen distribution + // - Enable debugOreveins + // - Fly around for a while, or teleport jumping ~320 blocks at a time, with + // a 15-30s pause for worldgen to catch up + // - Do this across a large area, at least 2000x2000 blocks for good numbers + // - Open logs\gregtech.log + // - Using notepad++, do a Search | Find - enter "Added" for the search term + // - Select Find All In Current Document + // - In the Search window, right-click and Select All + // - Copy and paste to a new file + // - Delete extraneous stuff at top, and blank line at bottom. Line count is + // # of total oreveins + // - For simple spot checks, use Find All in Current Document for specific + // oremixes, ie ore.mix.diamond, to check how many appear in the list. + // - For more complex work, import file into Excel, and sort based on oremix + // column. Drag select the oremix names, in the bottom right will be how many + // entries to add in a seperate tab to calculate %ages. + // + // When using the ore weights, discount or remove the high altitude veins since + // their high weight are offset by their rareness. I usually just use zero for them. + // Actual spawn rates will vary based upon the average height of the stone layers + // in the dimension. For example veins that range above and below the average height + // will be less, and veins that are completely above the average height will be much less. + + public void worldGenFindVein(int oreseedX, int oreseedZ) { + // Explanation of oreveinseed implementation. + // (long)this.mWorld.getSeed()<<16) Deep Dark does two oregen passes, one with getSeed set to +1 the + // original world seed. This pushes that +1 off the low bits of oreseedZ, so that the hashes are far apart + // for the two passes. + // ((this.mWorld.provider.dimensionId & 0xffL)<<56) Puts the dimension in the top bits of the hash, to + // make sure to get unique hashes per dimension + // ((long)oreseedX & 0x000000000fffffffL) << 28) Puts the chunk X in the bits 29-55. Cuts off the top few + // bits of the chunk so we have bits for dimension. + // ( (long)oreseedZ & 0x000000000fffffffL )) Puts the chunk Z in the bits 0-27. Cuts off the top few bits + // of the chunk so we have bits for dimension. + long oreveinSeed = (this.mWorld.getSeed() << 16) + ^ (((this.mWorld.provider.dimensionId & 0xffL) << 56) | (((long) oreseedX & 0x000000000fffffffL) << 28) + | ((long) oreseedZ & 0x000000000fffffffL)); // Use an RNG that is identical every time it is + // called for + // this oreseed. + XSTR oreveinRNG = new XSTR(oreveinSeed); + int oreveinPercentageRoll = oreveinRNG.nextInt(100); // Roll the dice, see if we get an orevein here at all + int noOrePlacedCount = 0; + String tDimensionName = ""; + if (debugOrevein) { + tDimensionName = this.mWorld.provider.getDimensionName(); + } + + if (debugOrevein) GTLog.out.println( + " Finding oreveins for oreveinSeed=" + oreveinSeed + + " mX=" + + this.mX + + " mZ=" + + this.mZ + + " oreseedX=" + + oreseedX + + " oreseedZ=" + + oreseedZ + + " worldSeed=" + + this.mWorld.getSeed()); + + // Search for a valid orevein for this dimension + if (!validOreveins.containsKey(oreveinSeed)) { + if ((oreveinPercentageRoll < oreveinPercentage) && (WorldgenGTOreLayer.sWeight > 0) + && (WorldgenGTOreLayer.sList.size() > 0)) { + int placementAttempts = 0; + boolean oreveinFound = false; + int i; + + // Used for outputting orevein weights and bins + /* + * if( test==0 ) { test = 1; GTLog.out.println( "sWeight = " + GT_Worldgen_GT_Ore_Layer.sWeight ); + * for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) { GTLog.out.println( ( + * tWorldGen).mWorldGenName + " mWeight = " + ( tWorldGen).mWeight + " mSize = " + (tWorldGen).mSize + * ); } } + */ + for (i = 0; (i < oreveinAttempts) && (!oreveinFound) + && (placementAttempts < oreveinMaxPlacementAttempts); i++) { + int tRandomWeight = oreveinRNG.nextInt(WorldgenGTOreLayer.sWeight); + for (WorldgenGTOreLayer tWorldGen : WorldgenGTOreLayer.sList) { + tRandomWeight -= (tWorldGen).mWeight; + if (tRandomWeight <= 0) { + try { + // Adjust the seed so that this layer has a series of unique random numbers. + // Otherwise multiple attempts at this same oreseed will get the same offset and X/Z + // values. If an orevein failed, any orevein with the + // same minimum heights would fail as well. This prevents that, giving each orevein + // a unique height each pass through here. + int placementResult = tWorldGen.executeWorldgenChunkified( + this.mWorld, + new XSTR(oreveinSeed ^ (tWorldGen.mPrimaryMeta)), + this.mBiome, + this.mDimensionType, + this.mX * 16, + this.mZ * 16, + oreseedX * 16, + oreseedZ * 16, + this.mChunkGenerator, + this.mChunkProvider); + switch (placementResult) { + case WorldgenGTOreLayer.ORE_PLACED -> { + if (debugOrevein) GTLog.out.println( + " Added near oreveinSeed=" + oreveinSeed + + " " + + (tWorldGen).mWorldGenName + + " tries at oremix=" + + i + + " placementAttempts=" + + placementAttempts + + " dimensionName=" + + tDimensionName); + validOreveins.put(oreveinSeed, tWorldGen); + oreveinFound = true; + } + case WorldgenGTOreLayer.NO_ORE_IN_BOTTOM_LAYER -> placementAttempts++; + + // SHould do retry in this case until out of chances + case WorldgenGTOreLayer.NO_OVERLAP -> { + if (debugOrevein) GTLog.out.println( + " Added far oreveinSeed=" + oreveinSeed + + " " + + (tWorldGen).mWorldGenName + + " tries at oremix=" + + i + + " placementAttempts=" + + placementAttempts + + " dimensionName=" + + tDimensionName); + validOreveins.put(oreveinSeed, tWorldGen); + oreveinFound = true; + } + case WorldgenGTOreLayer.NO_OVERLAP_AIR_BLOCK -> { + if (debugOrevein) GTLog.out.println( + " No overlap and air block in test spot=" + oreveinSeed + + " " + + (tWorldGen).mWorldGenName + + " tries at oremix=" + + i + + " placementAttempts=" + + placementAttempts + + " dimensionName=" + + tDimensionName); + // SHould do retry in this case until out of chances + placementAttempts++; + } + } + break; // Try the next orevein + } catch (Throwable e) { + if (debugOrevein) GTLog.out.println( + "Exception occurred on oreVein" + tWorldGen + + " oreveinSeed=" + + oreveinSeed + + " mX=" + + this.mX + + " mZ=" + + this.mZ + + " oreseedX=" + + oreseedX + + " oreseedZ=" + + oreseedZ); + e.printStackTrace(GTLog.err); + } + } + } + } + // Only add an empty orevein if unable to place a vein at the oreseed chunk. + if ((!oreveinFound) && (this.mX == oreseedX) && (this.mZ == oreseedZ)) { + if (debugOrevein) GTLog.out.println( + " Empty oreveinSeed=" + oreveinSeed + + " mX=" + + this.mX + + " mZ=" + + this.mZ + + " oreseedX=" + + oreseedX + + " oreseedZ=" + + oreseedZ + + " tries at oremix=" + + i + + " placementAttempts=" + + placementAttempts + + " dimensionName=" + + tDimensionName); + validOreveins.put(oreveinSeed, noOresInVein); + } + } else if (oreveinPercentageRoll >= oreveinPercentage) { + if (debugOrevein) GTLog.out.println( + " Skipped oreveinSeed=" + oreveinSeed + + " mX=" + + this.mX + + " mZ=" + + this.mZ + + " oreseedX=" + + oreseedX + + " oreseedZ=" + + oreseedZ + + " RNG=" + + oreveinPercentageRoll + + " %=" + + oreveinPercentage + + " dimensionName=" + + tDimensionName); + validOreveins.put(oreveinSeed, noOresInVein); + } + } else { + // oreseed is located in the previously processed table + if (debugOrevein) GTLog.out + .print(" Valid oreveinSeed=" + oreveinSeed + " validOreveins.size()=" + validOreveins.size() + " "); + WorldgenGTOreLayer tWorldGen = validOreveins.get(oreveinSeed); + oreveinRNG.setSeed(oreveinSeed ^ (tWorldGen.mPrimaryMeta)); // Reset RNG to only be based on oreseed X/Z + // and type of vein + int placementResult = tWorldGen.executeWorldgenChunkified( + this.mWorld, + oreveinRNG, + this.mBiome, + this.mDimensionType, + this.mX * 16, + this.mZ * 16, + oreseedX * 16, + oreseedZ * 16, + this.mChunkGenerator, + this.mChunkProvider); + switch (placementResult) { + case WorldgenGTOreLayer.NO_ORE_IN_BOTTOM_LAYER -> { + if (debugOrevein) GTLog.out.println(" No ore in bottom layer"); + } + case WorldgenGTOreLayer.NO_OVERLAP -> { + if (debugOrevein) GTLog.out.println(" No overlap"); + } + } + } + } + + @Override + public void run() { + long startTime = System.nanoTime(); + Chunk tChunk = this.mWorld.getChunkFromChunkCoords(this.mX, this.mZ); + + int oreveinMaxSize; + + // Do GT_Stones and GT_small_ores oregen for this chunk + try { + for (GTWorldgen tWorldGen : GregTechAPI.sWorldgenList) { + /* + * if (debugWorldGen) GTLog.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(GTLog.err); + } + long leftOverTime = System.nanoTime(); + + // Determine bounding box on how far out to check for oreveins affecting this chunk + // For now, manually reducing oreveinMaxSize when not in the Underdark for performance + if (this.mWorld.provider.getDimensionName() + .equals("Underdark")) { + oreveinMaxSize = 32; // Leave Deep Dark/Underdark max oregen at 32, instead of 64 + } else { + oreveinMaxSize = 32; + } + + int wXbox = this.mX - (oreveinMaxSize / 16); + int eXbox = this.mX + (oreveinMaxSize / 16 + 1); // Need to add 1 since it is compared using a < + int nZbox = this.mZ - (oreveinMaxSize / 16); + int sZbox = this.mZ + (oreveinMaxSize / 16 + 1); + + // Search for orevein seeds and add to the list; + for (int x = wXbox; x < eXbox; x++) { + for (int z = nZbox; z < sZbox; z++) { + // Determine if this X/Z is an orevein seed + if (isOreChunk(x, z)) { + if (debugWorldGen) GTLog.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) + GTLog.out.println("Processing seed x=" + seedList.get(0).mX + " z=" + seedList.get(0).mZ); + worldGenFindVein(seedList.get(0).mX, seedList.get(0).mZ); + } + + long oregenTime = System.nanoTime(); + + // Asteroid Worldgen + int tDimensionType = this.mWorld.provider.dimensionId; + // String tDimensionName = this.mWorld.provider.getDimensionName(); + // if (((tDimensionType == 1) && endAsteroids && ((mEndAsteroidProbability <= 1) || + // (aRandom.nextInt(mEndAsteroidProbability) == 0))) || ((tDimensionName.equals("Asteroids")) && gcAsteroids + // && ((mGCAsteroidProbability <= 1) || (aRandom.nextInt(mGCAsteroidProbability) == 0)))) { + if ((tDimensionType == 1 /* the end */) && endAsteroids) { + XSTR random = new XSTR( + mWorld.getSeed() + mX * mX * 91777L + mZ * mZ * 137413L + mX * mZ * 1853L + mX * 3L + mZ * 17L); + + if (mEndAsteroidProbability <= 1 || random.nextInt(mEndAsteroidProbability) == 0) { + generateAsteroid(mWorld, random, mX, mZ); + } + } + + if (tChunk != null) { + tChunk.isModified = true; + } + long endTime = System.nanoTime(); + long duration = (endTime - startTime); + if (debugWorldGen) { + GTLog.out.println( + " Oregen took " + (oregenTime - leftOverTime) + + " Leftover gen took " + + (leftOverTime - startTime) + + " Worldgen took " + + duration + + " nanoseconds"); + } + } + + private void generateAsteroid(World world, Random random, int chunkX, int chunkZ) { + short primaryMeta = 0; + short secondaryMeta = 0; + short betweenMeta = 0; + short sporadicMeta = 0; + if ((WorldgenGTOreLayer.sWeight > 0) && (WorldgenGTOreLayer.sList.size() > 0)) { + boolean temp = true; + int tRandomWeight; + for (int i = 0; (i < oreveinAttempts) && (temp); i++) { + tRandomWeight = random.nextInt(WorldgenGTOreLayer.sWeight); + for (WorldgenGTOreLayer tWorldGen : WorldgenGTOreLayer.sList) { + tRandomWeight -= tWorldGen.mWeight; + if (tRandomWeight <= 0) { + try { + if (tWorldGen.mEndAsteroid) { + primaryMeta = tWorldGen.mPrimaryMeta; + secondaryMeta = tWorldGen.mSecondaryMeta; + betweenMeta = tWorldGen.mBetweenMeta; + sporadicMeta = tWorldGen.mSporadicMeta; + temp = false; + break; + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + } + } + } + } + // if(GT_Values.D1)GT_FML_LOGGER.info("do asteroid gen: "+this.mX+" "+this.mZ); + int tX = chunkX * 16 + random.nextInt(16); + int tY = 50 + random.nextInt(200 - 50); + int tZ = chunkZ * 16 + random.nextInt(16); + mSize = endMinSize + random.nextInt(endMaxSize - endMinSize + 1); + + if ((world.getBlock(tX, tY, tZ) + .isAir(world, tX, tY, tZ))) { + float randomRadian = random.nextFloat() * (float) Math.PI; + double xBase = tX + 8 + MathHelper.sin(randomRadian) * mSize / 8.0F; + double xFactor = tX + 8 - MathHelper.sin(randomRadian) * mSize / 8.0F; + double zBase = tZ + 8 + MathHelper.cos(randomRadian) * mSize / 8.0F; + double zFactor = tZ + 8 - MathHelper.cos(randomRadian) * mSize / 8.0F; + double yBase = tY + random.nextInt(3) - 2; + double yFactor = tY + random.nextInt(3) - 2; + + for (int i = 0; i <= mSize; i++) { + double xCenter = xBase + (xFactor - xBase) * i / mSize; + double yCenter = yBase + (yFactor - yBase) * i / mSize; + double zCenter = zBase + (zFactor - zBase) * i / mSize; + double randomDistance = random.nextDouble() * mSize / 16.0D; + double halfLength = (MathHelper.sin(i * (float) Math.PI / mSize) + 1.0F) * randomDistance + 1.0D; + double halfHeight = (MathHelper.sin(i * (float) Math.PI / mSize) + 1.0F) * randomDistance + 1.0D; + int tMinX = MathHelper.floor_double(xCenter - halfLength / 2.0D); + int tMinY = MathHelper.floor_double(yCenter - halfHeight / 2.0D); + int tMinZ = MathHelper.floor_double(zCenter - halfLength / 2.0D); + int tMaxX = MathHelper.floor_double(xCenter + halfLength / 2.0D); + int tMaxY = MathHelper.floor_double(yCenter + halfHeight / 2.0D); + int tMaxZ = MathHelper.floor_double(zCenter + halfLength / 2.0D); + + for (int eX = tMinX; eX <= tMaxX; eX++) { + double xChance = (eX + 0.5D - xCenter) / (halfLength / 2.0D); + if (xChance * xChance < 1.0D) { + for (int eY = tMinY; eY <= tMaxY; eY++) { + double yChance = (eY + 0.5D - yCenter) / (halfHeight / 2.0D); + if (xChance * xChance + yChance * yChance < 1.0D) { + for (int eZ = tMinZ; eZ <= tMaxZ; eZ++) { + double zChance = (eZ + 0.5D - zCenter) / (halfLength / 2.0D); + if (xChance * xChance + yChance * yChance + zChance * zChance >= 1.0D) { + continue; + } + if (!world.getBlock(tX, tY, tZ) + .isAir(world, tX, tY, tZ)) { + continue; + } + int ranOre = random.nextInt(50); + if (ranOre < 3) { + TileEntityOres.setOreBlock(world, eX, eY, eZ, primaryMeta, false); + } else if (ranOre < 6) { + TileEntityOres.setOreBlock(world, eX, eY, eZ, secondaryMeta, false); + } else if (ranOre < 8) { + TileEntityOres.setOreBlock(world, eX, eY, eZ, betweenMeta, false); + } else if (ranOre < 10) { + TileEntityOres.setOreBlock(world, eX, eY, eZ, sporadicMeta, false); + } else { + world.setBlock(eX, eY, eZ, Blocks.end_stone, 0, 0); + } + } + } + } + } + } + } + } + } + } +} diff --git a/src/main/java/gregtech/common/GT_Client.java b/src/main/java/gregtech/common/GT_Client.java deleted file mode 100644 index 66e042a051..0000000000 --- a/src/main/java/gregtech/common/GT_Client.java +++ /dev/null @@ -1,1073 +0,0 @@ -// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. -// Jad home page: http://www.kpdus.com/jad.html -// Decompiler options: packimports(3) -// Source File Name: GT_Client.java - -package gregtech.common; - -import static gregtech.api.enums.GT_Values.calculateMaxPlasmaTurbineEfficiency; -import static gregtech.api.enums.Mods.Forestry; -import static gregtech.api.enums.Mods.GregTech; -import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; - -import java.net.URL; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Scanner; -import java.util.function.Function; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.resources.IReloadableResourceManager; -import net.minecraft.client.resources.IResourceManager; -import net.minecraft.client.resources.IResourceManagerReloadListener; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraftforge.client.event.DrawBlockHighlightEvent; -import net.minecraftforge.client.event.sound.SoundSetupEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; - -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL20; - -import com.glodblock.github.nei.recipes.FluidRecipe; -import com.glodblock.github.nei.recipes.extractor.GregTech5RecipeExtractor; -import com.gtnewhorizon.structurelib.alignment.IAlignment; -import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; - -import appeng.api.util.IOrientable; -import appeng.tile.misc.TileInterface; -import codechicken.lib.vec.Rotation; -import codechicken.lib.vec.Scale; -import codechicken.lib.vec.Transformation; -import codechicken.lib.vec.Translation; -import cpw.mods.fml.client.event.ConfigChangedEvent; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.common.network.FMLNetworkEvent; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -import gregtech.api.gui.GT_GUIColorOverride; -import gregtech.api.gui.modularui.FallbackableSteamTexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.ITurnable; -import gregtech.api.items.GT_MetaGenerated_Item; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.metatileentity.MetaPipeEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; -import gregtech.api.net.GT_Packet_ClientPreference; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.recipe.RecipeCategory; -import gregtech.api.util.ColorsMetadataSection; -import gregtech.api.util.ColorsMetadataSectionSerializer; -import gregtech.api.util.GT_ClientPreference; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_MusicSystem; -import gregtech.api.util.GT_PlayedSound; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder; -import gregtech.client.SeekingOggCodec; -import gregtech.common.blocks.GT_Block_FrameBox; -import gregtech.common.blocks.GT_Item_Machines; -import gregtech.common.render.GT_CapeRenderer; -import gregtech.common.render.GT_FlaskRenderer; -import gregtech.common.render.GT_FluidDisplayStackRenderer; -import gregtech.common.render.GT_LaserRenderer; -import gregtech.common.render.GT_MetaGenerated_Tool_Renderer; -import gregtech.common.render.GT_MultiTile_Renderer; -import gregtech.common.render.GT_PollutionRenderer; -import gregtech.common.render.GT_RenderDrone; -import gregtech.common.render.GT_Renderer_Block; -import gregtech.common.render.GT_WormholeRenderer; -import gregtech.common.render.items.GT_MetaGenerated_Item_Renderer; -import gregtech.common.tileentities.debug.GT_MetaTileEntity_AdvDebugStructureWriter; -import gregtech.loaders.ExtraIcons; -import gregtech.loaders.misc.GT_Bees; -import gregtech.loaders.preload.GT_PreLoad; -import gregtech.nei.NEI_GT_Config; -import ic2.api.tile.IWrenchable; -import paulscode.sound.SoundSystemConfig; -import paulscode.sound.SoundSystemException; - -// Referenced classes of package gregtech.common: -// GT_Proxy - -public class GT_Client extends GT_Proxy implements Runnable { - - public static final String GTNH_CAPE_LIST_URL = "https://raw.githubusercontent.com/GTNewHorizons/CustomGTCapeHook-Cape-List/master/capes.txt"; - public static final String GT_CAPE_LIST_URL = "http://gregtech.overminddl1.com/com/gregoriust/gregtech/supporterlist.txt"; - private static final List ROTATABLE_VANILLA_BLOCKS; - - private static final int[][] GRID_SWITCH_TABLE = new int[][] { { 0, 5, 3, 1, 2, 4 }, { 5, 0, 1, 3, 2, 4 }, - { 1, 3, 0, 5, 2, 4 }, { 3, 1, 5, 0, 2, 4 }, { 4, 2, 3, 1, 0, 5 }, { 2, 4, 3, 1, 5, 0 }, }; - - // don't ask. these "just works" - private static final Transformation ROTATION_MARKER_TRANSFORM_CENTER = new Scale(0.5); - private static final Transformation[] ROTATION_MARKER_TRANSFORMS_SIDES_TRANSFORMS = { - new Scale(0.25).with(new Translation(0, 0, 0.375)) - .compile(), - new Scale(0.25).with(new Translation(0.375, 0, 0)) - .compile(), - new Scale(0.25).with(new Translation(0, 0, -0.375)) - .compile(), - new Scale(0.25).with(new Translation(-0.375, 0, 0)) - .compile(), }; - private static final int[] ROTATION_MARKER_TRANSFORMS_SIDES = { -1, -1, 2, 0, 3, 1, -1, -1, 0, 2, 3, 1, 0, 2, -1, - -1, 3, 1, 2, 0, -1, -1, 3, 1, 1, 3, 2, 0, -1, -1, 3, 1, 2, 0, -1, -1 }; - private static final Transformation[] ROTATION_MARKER_TRANSFORMS_CORNER = { - new Scale(0.25).with(new Translation(0.375, 0, 0.375)) - .compile(), - new Scale(0.25).with(new Translation(-0.375, 0, 0.375)) - .compile(), - new Scale(0.25).with(new Translation(0.375, 0, -0.375)) - .compile(), - new Scale(0.25).with(new Translation(-0.375, 0, -0.375)) - .compile(), }; - private static int rotationMarkerDisplayList; - private static boolean rotationMarkerDisplayListCompiled = false; - - static { - ROTATABLE_VANILLA_BLOCKS = Arrays.asList( - Blocks.piston, - Blocks.sticky_piston, - Blocks.furnace, - Blocks.lit_furnace, - Blocks.dropper, - Blocks.dispenser, - Blocks.chest, - Blocks.trapped_chest, - Blocks.ender_chest, - Blocks.hopper, - Blocks.pumpkin, - Blocks.lit_pumpkin); - } - - private final HashSet mCapeList = new HashSet<>(); - public static final GT_PollutionRenderer mPollutionRenderer = new GT_PollutionRenderer(); - private final GT_CapeRenderer mCapeRenderer; - private final List mPosR; - private final List mPosG; - private final List mPosB; - private final List mPosA = Collections.emptyList(); - private final List mNegR; - private final List mNegG; - private final List mNegB; - private final List mNegA = Collections.emptyList(); - private final List mMoltenPosR; - private final List mMoltenPosG; - private final List mMoltenPosB; - private final List mMoltenPosA = Collections.emptyList(); - private final List mMoltenNegR; - private final List mMoltenNegG; - private final List mMoltenNegB; - private final List mMoltenNegA = Collections.emptyList(); - private long mAnimationTick; - /** - * This is the place to def the value used below - **/ - private long afterSomeTime; - - private boolean mAnimationDirection; - private GT_ClientPreference mPreference; - private boolean mFirstTick = false; - public static final int ROTATION_MARKER_RESOLUTION = 120; - private int mReloadCount; - private float renderTickTime; - public static GT_MetaGenerated_Item_Renderer metaGeneratedItemRenderer; - - public GT_Client() { - mCapeRenderer = new GT_CapeRenderer(mCapeList); - mAnimationTick = 0L; - mAnimationDirection = false; - mPosR = Arrays.asList( - Materials.Enderium, - Materials.Vinteum, - Materials.Uranium235, - Materials.InfusedGold, - Materials.Plutonium241, - Materials.NaquadahEnriched, - Materials.Naquadria, - Materials.InfusedOrder, - Materials.Force, - Materials.Pyrotheum, - Materials.Sunnarium, - Materials.Glowstone, - Materials.Thaumium, - Materials.InfusedVis, - Materials.InfusedAir, - Materials.InfusedFire, - Materials.FierySteel, - Materials.Firestone); - mPosG = Arrays.asList( - Materials.Enderium, - Materials.Vinteum, - Materials.Uranium235, - Materials.InfusedGold, - Materials.Plutonium241, - Materials.NaquadahEnriched, - Materials.Naquadria, - Materials.InfusedOrder, - Materials.Force, - Materials.Pyrotheum, - Materials.Sunnarium, - Materials.Glowstone, - Materials.InfusedAir, - Materials.InfusedEarth); - mPosB = Arrays.asList( - Materials.Enderium, - Materials.Vinteum, - Materials.Uranium235, - Materials.InfusedGold, - Materials.Plutonium241, - Materials.NaquadahEnriched, - Materials.Naquadria, - Materials.InfusedOrder, - Materials.InfusedVis, - Materials.InfusedWater, - Materials.Thaumium); - mNegR = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar); - mNegG = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar); - mNegB = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar); - mMoltenPosR = Arrays.asList( - Materials.Enderium, - Materials.NetherStar, - Materials.Vinteum, - Materials.Uranium235, - Materials.InfusedGold, - Materials.Plutonium241, - Materials.NaquadahEnriched, - Materials.Naquadria, - Materials.InfusedOrder, - Materials.Force, - Materials.Pyrotheum, - Materials.Sunnarium, - Materials.Glowstone, - Materials.Thaumium, - Materials.InfusedVis, - Materials.InfusedAir, - Materials.InfusedFire, - Materials.FierySteel, - Materials.Firestone); - mMoltenPosG = Arrays.asList( - Materials.Enderium, - Materials.NetherStar, - Materials.Vinteum, - Materials.Uranium235, - Materials.InfusedGold, - Materials.Plutonium241, - Materials.NaquadahEnriched, - Materials.Naquadria, - Materials.InfusedOrder, - Materials.Force, - Materials.Pyrotheum, - Materials.Sunnarium, - Materials.Glowstone, - Materials.InfusedAir, - Materials.InfusedEarth); - mMoltenPosB = Arrays.asList( - Materials.Enderium, - Materials.NetherStar, - Materials.Vinteum, - Materials.Uranium235, - Materials.InfusedGold, - Materials.Plutonium241, - Materials.NaquadahEnriched, - Materials.Naquadria, - Materials.InfusedOrder, - Materials.InfusedVis, - Materials.InfusedWater, - Materials.Thaumium); - mMoltenNegR = Collections.singletonList(Materials.InfusedEntropy); - mMoltenNegG = Collections.singletonList(Materials.InfusedEntropy); - mMoltenNegB = Collections.singletonList(Materials.InfusedEntropy); - } - - private static boolean checkedForChicken = false; - - private static void drawGrid(DrawBlockHighlightEvent aEvent, boolean showCoverConnections, boolean aIsWrench, - boolean aIsSneaking) { - if (!checkedForChicken) { - try { - Class.forName("codechicken.lib.vec.Rotation"); - } catch (ClassNotFoundException e) { - return; - } - checkedForChicken = true; - } - - GL11.glPushMatrix(); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - // pause shader - int program = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); - GL20.glUseProgram(0); - - MovingObjectPosition target = aEvent.target; - EntityPlayer player = aEvent.player; - double camX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) aEvent.partialTicks; - double camY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) aEvent.partialTicks; - double camZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) aEvent.partialTicks; - GL11.glTranslated(target.blockX - (int) camX, target.blockY - (int) camY, target.blockZ - (int) camZ); - GL11.glTranslated(0.5D - (camX - (int) camX), 0.5D - (camY - (int) camY), 0.5D - (camZ - (int) camZ)); - final int tSideHit = target.sideHit; - Rotation.sideRotations[tSideHit].glApply(); - // draw grid - GL11.glTranslated(0.0D, -0.502D, 0.0D); - GL11.glLineWidth(2.5F); - GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.5F); - GL11.glBegin(GL11.GL_LINES); - GL11.glVertex3d(+.50D, .0D, -.25D); - GL11.glVertex3d(-.50D, .0D, -.25D); - GL11.glVertex3d(+.50D, .0D, +.25D); - GL11.glVertex3d(-.50D, .0D, +.25D); - GL11.glVertex3d(+.25D, .0D, -.50D); - GL11.glVertex3d(+.25D, .0D, +.50D); - GL11.glVertex3d(-.25D, .0D, -.50D); - GL11.glVertex3d(-.25D, .0D, +.50D); - final TileEntity tTile = player.worldObj.getTileEntity(target.blockX, target.blockY, target.blockZ); - final Block block = player.worldObj.getBlock(target.blockX, target.blockY, target.blockZ); - final int meta = player.worldObj.getBlockMetadata(target.blockX, target.blockY, target.blockZ); - - // draw connection indicators - int tConnections = 0; - if (tTile instanceof ICoverable iCoverable) { - if (showCoverConnections) { - for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { - if (iCoverable.getCoverIDAtSide(tSide) != 0) tConnections |= tSide.flag; - } - } else if (tTile instanceof BaseMetaTileEntity baseMetaTile && baseMetaTile.getAlignment() == null) { - if (!aIsSneaking) tConnections |= baseMetaTile.getFrontFacing().flag; - else if (baseMetaTile.getMetaTileEntity() instanceof GT_MetaTileEntity_BasicMachine basicMachine) { - tConnections |= basicMachine.mMainFacing.flag; - } - } else if (tTile instanceof BaseMetaPipeEntity pipeEntity) tConnections = pipeEntity.mConnections; - } else if (tTile instanceof IWrenchable wrenchable) { - tConnections |= ForgeDirection.getOrientation(wrenchable.getFacing()).flag; - } else if (ROTATABLE_VANILLA_BLOCKS.contains(block)) { - tConnections |= ForgeDirection.getOrientation(meta).flag; - } else if (tTile instanceof TileInterface tileInterface) tConnections |= tileInterface.getUp() - .getOpposite().flag; - - if (tConnections != 0) { - for (ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { - if ((tConnections & tSide.flag) != 0) { - switch (GRID_SWITCH_TABLE[target.sideHit][tSide.ordinal()]) { - case 0 -> { - GL11.glVertex3d(+.25D, .0D, +.25D); - GL11.glVertex3d(-.25D, .0D, -.25D); - GL11.glVertex3d(-.25D, .0D, +.25D); - GL11.glVertex3d(+.25D, .0D, -.25D); - } - case 1 -> { - GL11.glVertex3d(-.25D, .0D, +.50D); - GL11.glVertex3d(+.25D, .0D, +.25D); - GL11.glVertex3d(-.25D, .0D, +.25D); - GL11.glVertex3d(+.25D, .0D, +.50D); - } - case 2 -> { - GL11.glVertex3d(-.50D, .0D, -.25D); - GL11.glVertex3d(-.25D, .0D, +.25D); - GL11.glVertex3d(-.50D, .0D, +.25D); - GL11.glVertex3d(-.25D, .0D, -.25D); - } - case 3 -> { - GL11.glVertex3d(-.25D, .0D, -.50D); - GL11.glVertex3d(+.25D, .0D, -.25D); - GL11.glVertex3d(-.25D, .0D, -.25D); - GL11.glVertex3d(+.25D, .0D, -.50D); - } - case 4 -> { - GL11.glVertex3d(+.50D, .0D, -.25D); - GL11.glVertex3d(+.25D, .0D, +.25D); - GL11.glVertex3d(+.50D, .0D, +.25D); - GL11.glVertex3d(+.25D, .0D, -.25D); - } - case 5 -> { - GL11.glVertex3d(+.50D, .0D, +.50D); - GL11.glVertex3d(+.25D, .0D, +.25D); - GL11.glVertex3d(+.50D, .0D, +.25D); - GL11.glVertex3d(+.25D, .0D, +.50D); - GL11.glVertex3d(+.50D, .0D, -.50D); - GL11.glVertex3d(+.25D, .0D, -.25D); - GL11.glVertex3d(+.50D, .0D, -.25D); - GL11.glVertex3d(+.25D, .0D, -.50D); - GL11.glVertex3d(-.50D, .0D, +.50D); - GL11.glVertex3d(-.25D, .0D, +.25D); - GL11.glVertex3d(-.50D, .0D, +.25D); - GL11.glVertex3d(-.25D, .0D, +.50D); - GL11.glVertex3d(-.50D, .0D, -.50D); - GL11.glVertex3d(-.25D, .0D, -.25D); - GL11.glVertex3d(-.50D, .0D, -.25D); - GL11.glVertex3d(-.25D, .0D, -.50D); - } - } - } - } - } - GL11.glEnd(); - // draw turning indicator - Function getTransform = (ForgeDirection direction) -> { - try { - if (direction.ordinal() == tSideHit) return new Transformation[] { ROTATION_MARKER_TRANSFORM_CENTER }; - else if (direction.getOpposite() - .ordinal() == tSideHit) { - return ROTATION_MARKER_TRANSFORMS_CORNER; - } else { - return new Transformation[] { - ROTATION_MARKER_TRANSFORMS_SIDES_TRANSFORMS[ROTATION_MARKER_TRANSFORMS_SIDES[tSideHit * 6 - + direction.ordinal()]] }; - } - } catch (ArrayIndexOutOfBoundsException e) { - return new Transformation[] {}; - } - - }; - - if (aIsWrench && tTile instanceof IAlignmentProvider) { - final IAlignment tAlignment = ((IAlignmentProvider) (tTile)).getAlignment(); - if (tAlignment != null) { - for (var transform : getTransform.apply(tAlignment.getDirection())) { - drawExtendedRotationMarker(transform, aIsSneaking, tAlignment); - } - } - } - if (aIsWrench && tTile instanceof IOrientable orientable - && !(tTile instanceof TileInterface) - && orientable.canBeRotated()) { - for (var transform : getTransform.apply(aIsSneaking ? orientable.getForward() : orientable.getUp())) { - drawExtendedRotationMarker(transform, aIsSneaking, orientable); - } - } - GL20.glUseProgram(program); // resume shader - GL11.glPopMatrix(); // get back to player center - } - - private static void drawExtendedRotationMarker(Transformation transform, boolean sneaking, IAlignment alignment) { - if (sneaking) { - if (alignment.isFlipChangeAllowed()) { - drawFlipMarker(transform); - } - } else { - if (alignment.isRotationChangeAllowed()) { - drawRotationMarker(transform); - } - } - } - - private static void drawExtendedRotationMarker(Transformation transform, boolean sneaking, IOrientable orientable) { - drawRotationMarker(transform); - } - - private static void drawRotationMarker(Transformation transform) { - if (!rotationMarkerDisplayListCompiled) { - rotationMarkerDisplayList = GLAllocation.generateDisplayLists(1); - compileRotationMarkerDisplayList(rotationMarkerDisplayList); - rotationMarkerDisplayListCompiled = true; - } - GL11.glPushMatrix(); - transform.glApply(); - GL11.glCallList(rotationMarkerDisplayList); - GL11.glPopMatrix(); - } - - private static void compileRotationMarkerDisplayList(int displayList) { - GL11.glNewList(displayList, GL11.GL_COMPILE); - GL11.glBegin(GL_LINE_LOOP); - for (int i = 0; i <= ROTATION_MARKER_RESOLUTION; i++) { - GL11.glVertex3d( - Math.cos(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.4, - 0, - Math.sin(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.4); - } - for (int i = ROTATION_MARKER_RESOLUTION; i >= 0; i--) { - GL11.glVertex3d( - Math.cos(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.24, - 0, - Math.sin(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.24); - } - GL11.glVertex3d(0.141114561800, 0, 0); - GL11.glVertex3d(0.32, 0, -0.178885438199); - GL11.glVertex3d(0.498885438199, 0, 0); - GL11.glEnd(); - GL11.glEndList(); - } - - private static void drawFlipMarker(Transformation transform) { - GL11.glPushMatrix(); - transform.glApply(); - final Tessellator t = Tessellator.instance; - // right shape - GL11.glLineStipple(4, (short) 0xAAAA); - GL11.glEnable(GL11.GL_LINE_STIPPLE); - t.startDrawing(GL11.GL_LINE_STRIP); - t.addVertex(0.1d, 0d, 0.04d); - t.addVertex(0.1d, 0d, 0.2d); - t.addVertex(0.35d, 0d, 0.35d); - t.addVertex(0.35d, 0d, -0.35d); - t.addVertex(0.1d, 0d, -0.2d); - t.addVertex(0.1d, 0d, -0.04d); - t.draw(); - GL11.glDisable(GL11.GL_LINE_STIPPLE); - // left shape - t.startDrawing(GL11.GL_LINE_STRIP); - t.addVertex(-0.1d, 0d, 0.04d); - t.addVertex(-0.1d, 0d, 0.2d); - t.addVertex(-0.35d, 0d, 0.35d); - t.addVertex(-0.35d, 0d, -0.35d); - t.addVertex(-0.1d, 0d, -0.2d); - t.addVertex(-0.1d, 0d, -0.04d); - t.draw(); - // arrow - t.startDrawing(GL11.GL_LINE_LOOP); - t.addVertex(0.15d, 0d, -0.04d); - t.addVertex(0.15d, 0d, -0.1d); - t.addVertex(0.25d, 0d, 0.d); - t.addVertex(0.15d, 0d, 0.1d); - t.addVertex(0.15d, 0d, 0.04d); - t.addVertex(-0.15d, 0d, 0.04d); - t.addVertex(-0.15d, 0d, 0.1d); - t.addVertex(-0.25d, 0d, 0.d); - t.addVertex(-0.15d, 0d, -0.1d); - t.addVertex(-0.15d, 0d, -0.04d); - t.draw(); - GL11.glPopMatrix(); - } - - @Override - public boolean isServerSide() { - return true; - } - - @Override - public boolean isClientSide() { - return true; - } - - @Override - public boolean isBukkitSide() { - return false; - } - - @Override - public EntityPlayer getThePlayer() { - return Minecraft.getMinecraft().thePlayer; - } - - @Override - public int addArmor(String aPrefix) { - return RenderingRegistry.addNewArmourRendererPrefix(aPrefix); - } - - @Override - public void onPreLoad() { - super.onPreLoad(); - - MinecraftForge.EVENT_BUS.register(new ExtraIcons()); - Minecraft.getMinecraft() - .getResourcePackRepository().rprMetadataSerializer - .registerMetadataSectionType(new ColorsMetadataSectionSerializer(), ColorsMetadataSection.class); - - new GT_MetaTileEntity_AdvDebugStructureWriter.ForgeEventHandler(); - - final String[] arr = { "renadi", "hanakocz", "MysteryDump", "Flaver4", "x_Fame", "Peluche321", - "Goshen_Ithilien", "manf", "Bimgo", "leagris", "IAmMinecrafter02", "Cerous", "Devilin_Pixy", "Bkarlsson87", - "BadAlchemy", "CaballoCraft", "melanclock", "Resursator", "demanzke", "AndrewAmmerlaan", "Deathlycraft", - "Jirajha", "Axlegear", "kei_kouma", "Dracion", "dungi", "Dorfschwein", "Zero Tw0", "mattiagraz85", - "sebastiank30", "Plem", "invultri", "grillo126", "malcanteth", "Malevolence_", "Nicholas_Manuel", "Sirbab", - "kehaan", "bpgames123", "semig0d", "9000bowser", "Sovereignty89", "Kris1432", "xander_cage_", "samuraijp", - "bsaa", "SpwnX", "tworf", "Kadah", "kanni", "Stute", "Hegik", "Onlyme", "t3hero", "Hotchi", "jagoly", - "Nullav", "BH5432", "Sibmer", "inceee", "foxxx0", "Hartok", "TMSama", "Shlnen", "Carsso", "zessirb", - "meep310", "Seldron", "yttr1um", "hohounk", "freebug", "Sylphio", "jmarler", "Saberawr", "r00teniy", - "Neonbeta", "yinscape", "voooon24", "Quintine", "peach774", "lepthymo", "bildeman", "Kremnari", "Aerosalo", - "OndraSter", "oscares91", "mr10movie", "Daxx367x2", "EGERTRONx", "aka13_404", "Abouttabs", "Johnstaal", - "djshiny99", "megatronp", "DZCreeper", "Kane_Hart", "Truculent", "vidplace7", "simon6689", "MomoNasty", - "UnknownXLV", "goreacraft", "Fluttermine", "Daddy_Cecil", "MrMaleficus", "TigersFangs", "cublikefoot", - "chainman564", "NikitaBuker", "Misha999777", "25FiveDetail", "AntiCivilBoy", "michaelbrady", - "xXxIceFirexXx", "Speedynutty68", "GarretSidzaka", "HallowCharm977", "mastermind1919", "The_Hypersonic", - "diamondguy2798", "zF4ll3nPr3d4t0r", "CrafterOfMines57", "XxELIT3xSNIP3RxX", "SuterusuKusanagi", - "xavier0014", "adamros", "alexbegt" }; - for (String tName : arr) { - mCapeList.add(tName.toLowerCase()); - } - new Thread(this).start(); - - mPollutionRenderer.preLoad(); - - mPreference = new GT_ClientPreference(); - - Materials.initClient(); - } - - @Override - public void onLoad() { - super.onLoad(); - GT_Renderer_Block.register(); - new GT_MultiTile_Renderer(); - new GT_RenderDrone(); - new GT_LaserRenderer(); - new GT_WormholeRenderer(); - - metaGeneratedItemRenderer = new GT_MetaGenerated_Item_Renderer(); - for (GT_MetaGenerated_Item item : GT_MetaGenerated_Item.sInstances.values()) { - metaGeneratedItemRenderer.registerItem(item); - } - if (Forestry.isModLoaded()) { - metaGeneratedItemRenderer.registerItem(GT_Bees.combs); - } - new GT_MetaGenerated_Tool_Renderer(); - new GT_FlaskRenderer(); - new GT_FluidDisplayStackRenderer(); - MinecraftForge.EVENT_BUS.register(new NEI_GT_Config()); - } - - @Override - public void onPostLoad() { - super.onPostLoad(); - - // reobf doesn't work with lambda, so this must be a class - // noinspection Convert2Lambda - ((IReloadableResourceManager) Minecraft.getMinecraft() - .getResourceManager()).registerReloadListener(new IResourceManagerReloadListener() { - - @Override - public void onResourceManagerReload(IResourceManager l) { - GT_GUIColorOverride.onResourceManagerReload(); - FallbackableSteamTexture.reload(); - GregTech_API.sCoverBehaviors.values() - .forEach(GT_CoverBehaviorBase::reloadColorOverride); - } - }); - } - - @Override - public void onLoadComplete() { - super.onLoadComplete(); - for (RecipeCategory category : RecipeCategory.ALL_RECIPE_CATEGORIES.values()) { - if (category.recipeMap.getFrontend() - .getNEIProperties().registerNEI) { - FluidRecipe.addRecipeMap( - category.unlocalizedName, - new GregTech5RecipeExtractor( - category.unlocalizedName.equals("gt.recipe.scanner") - || category.unlocalizedName.equals("gt.recipe.fakeAssemblylineProcess"))); - } - } - } - - @SubscribeEvent - @SuppressWarnings("unused") // used by the event bus - public void onSoundSetup(SoundSetupEvent event) { - try { - SoundSystemConfig.setCodec(SeekingOggCodec.EXTENSION, SeekingOggCodec.class); - } catch (SoundSystemException e) { - throw new RuntimeException(e); - } - } - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Downloading Cape List."); - try (final Scanner tScanner = new Scanner(new URL(GT_CAPE_LIST_URL).openStream())) { - while (tScanner.hasNextLine()) { - this.mCapeList.add( - tScanner.nextLine() - .toLowerCase()); - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - GT_Log.out.println("GT New Horizons: Downloading Cape List."); - try (final Scanner tScanner = new Scanner(new URL(GTNH_CAPE_LIST_URL).openStream())) { - while (tScanner.hasNextLine()) { - final String tName = tScanner.nextLine() - .toLowerCase(); - if (tName.contains(":")) { - if (!this.mCapeList.contains(tName.substring(0, tName.indexOf(":")))) { - this.mCapeList.add(tName); - } - } else { - this.mCapeList.add(tName); - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - @Override - @SubscribeEvent - public void onClientConnectedToServerEvent(FMLNetworkEvent.ClientConnectedToServerEvent aEvent) { - mFirstTick = true; - mReloadCount++; - GT_MusicSystem.ClientSystem.reset(); - // For utility methods elsewhere. - calculateMaxPlasmaTurbineEfficiency(); - } - - @Override - public void reloadNEICache() { - mReloadCount++; - } - - @Override - public int getNEIReloadCount() { - return mReloadCount; - } - - @SubscribeEvent - public void receiveRenderSpecialsEvent(net.minecraftforge.client.event.RenderPlayerEvent.Specials.Pre aEvent) { - mCapeRenderer.receiveRenderSpecialsEvent(aEvent); - } - - @SubscribeEvent - public void onPlayerTickEventClient(TickEvent.PlayerTickEvent aEvent) { - if ((aEvent.side.isClient()) && (aEvent.phase == TickEvent.Phase.END) && (!aEvent.player.isDead)) { - if (mFirstTick) { - mFirstTick = false; - GT_Values.NW.sendToServer(new GT_Packet_ClientPreference(mPreference)); - - if (!Minecraft.getMinecraft() - .isSingleplayer()) { - GT_ModHandler.removeAllIC2Recipes(); - } - } - afterSomeTime++; - if (afterSomeTime >= 100L) { - afterSomeTime = 0; - } - for (Iterator> iterator = GT_Utility.sPlayedSoundMap.entrySet() - .iterator(); iterator.hasNext();) { - Map.Entry tEntry = iterator.next(); - if (tEntry.getValue() < 0) { - iterator.remove(); - } else { - tEntry.setValue(tEntry.getValue() - 1); - } - } - if (!GregTech_API.mServerStarted) GregTech_API.mServerStarted = true; - } - } - - @SubscribeEvent - public void onConfigChange(ConfigChangedEvent.OnConfigChangedEvent e) { - if (GregTech.ID.equals(e.modID) && "client".equals(e.configID)) { - // refresh client preference and send to server, since it's the only config we allow changing at runtime. - mPreference = new GT_ClientPreference(); - GT_PreLoad.loadClientConfig(); - if (e.isWorldRunning) GT_Values.NW.sendToServer(new GT_Packet_ClientPreference(mPreference)); - } - } - - @SubscribeEvent - public void onDrawBlockHighlight(DrawBlockHighlightEvent aEvent) { - final Block aBlock = aEvent.player.worldObj - .getBlock(aEvent.target.blockX, aEvent.target.blockY, aEvent.target.blockZ); - final TileEntity aTileEntity = aEvent.player.worldObj - .getTileEntity(aEvent.target.blockX, aEvent.target.blockY, aEvent.target.blockZ); - - if (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sWrenchList)) { - if (aTileEntity instanceof ITurnable || ROTATABLE_VANILLA_BLOCKS.contains(aBlock) - || aTileEntity instanceof IWrenchable - || (aTileEntity instanceof IOrientable orientable && orientable.canBeRotated()) - || (aBlock instanceof GT_Block_FrameBox)) drawGrid(aEvent, false, true, aEvent.player.isSneaking()); - return; - } - - // If there is no tile entity and the block is a frame box block, still draw the grid if a cover is held - if (aTileEntity == null && aBlock instanceof GT_Block_FrameBox) { - if (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sCovers.keySet())) { - drawGrid(aEvent, true, false, aEvent.player.isSneaking()); - } - return; - } - - if (!(aTileEntity instanceof ICoverable)) return; - - if (aEvent.player.isSneaking() && aTileEntity instanceof IGregTechTileEntity gtEntity - && gtEntity.getMetaTileEntity() instanceof MetaPipeEntity) { - if (aEvent.currentItem != null && aEvent.currentItem.getItem() instanceof GT_Item_Machines - && GregTech_API.METATILEENTITIES[aEvent.currentItem.getItemDamage()] instanceof MetaPipeEntity) { - drawGrid(aEvent, false, false, false); - } - } - - if (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sWireCutterList) - || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sSolderingToolList) - || (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sSoftHammerList) - && aTileEntity instanceof MultiBlockPart) && aEvent.player.isSneaking()) { - if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) - drawGrid(aEvent, false, false, aEvent.player.isSneaking()); - return; - } - - if ((aEvent.currentItem == null && aEvent.player.isSneaking()) - || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sCrowbarList) - || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sScrewdriverList)) { - if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) - for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { - if (((ICoverable) aTileEntity).getCoverIDAtSide(tSide) > 0) { - drawGrid(aEvent, true, false, true); - return; - } - } - return; - } - - if (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sCovers.keySet())) { - if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) - drawGrid(aEvent, true, false, aEvent.player.isSneaking()); - } - - if (GT_Utility.areStacksEqual(ItemList.Tool_Cover_Copy_Paste.get(1), aEvent.currentItem, true)) { - if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0) - drawGrid(aEvent, true, false, aEvent.player.isSneaking()); - } - } - - @SubscribeEvent - public void receiveRenderEvent(net.minecraftforge.client.event.RenderPlayerEvent.Pre aEvent) { - if (GT_Utility.getFullInvisibility(aEvent.entityPlayer)) { - aEvent.setCanceled(true); - } - } - - @SubscribeEvent - public void onRenderStart(cpw.mods.fml.common.gameevent.TickEvent.RenderTickEvent aEvent) { - if (aEvent.phase == TickEvent.Phase.START) { - renderTickTime = aEvent.renderTickTime; - } - } - - @SubscribeEvent - public void onClientTickEvent(cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent aEvent) { - if (aEvent.phase == cpw.mods.fml.common.gameevent.TickEvent.Phase.END) { - GT_MusicSystem.ClientSystem.tick(); - - if (changeDetected > 0) changeDetected--; - final int newHideValue = shouldHeldItemHideThings(); - if (newHideValue != hideValue) { - hideValue = newHideValue; - changeDetected = 5; - } - mAnimationTick++; - if (mAnimationTick % 50L == 0L) { - mAnimationDirection = !mAnimationDirection; - } - final int tDirection = mAnimationDirection ? 1 : -1; - for (Materials tMaterial : mPosR) { - tMaterial.mRGBa[0] = getSafeRGBValue(tMaterial.mRGBa[0], tDirection); - } - - for (Materials tMaterial : mPosG) { - tMaterial.mRGBa[1] = getSafeRGBValue(tMaterial.mRGBa[1], tDirection); - } - - for (Materials tMaterial : mPosB) { - tMaterial.mRGBa[2] = getSafeRGBValue(tMaterial.mRGBa[2], tDirection); - } - - for (Materials tMaterial : mPosA) { - tMaterial.mRGBa[3] = getSafeRGBValue(tMaterial.mRGBa[3], tDirection); - } - - for (Materials tMaterial : mNegR) { - tMaterial.mRGBa[0] = getSafeRGBValue(tMaterial.mRGBa[0], -tDirection); - } - - for (Materials tMaterial : mNegG) { - tMaterial.mRGBa[1] = getSafeRGBValue(tMaterial.mRGBa[1], -tDirection); - } - - for (Materials tMaterial : mNegB) { - tMaterial.mRGBa[2] = getSafeRGBValue(tMaterial.mRGBa[2], -tDirection); - } - - for (Materials tMaterial : mNegA) { - tMaterial.mRGBa[3] = getSafeRGBValue(tMaterial.mRGBa[3], -tDirection); - } - - for (Materials tMaterial : mMoltenPosR) { - tMaterial.mMoltenRGBa[0] = getSafeRGBValue(tMaterial.mMoltenRGBa[0], tDirection); - } - - for (Materials tMaterial : mMoltenPosG) { - tMaterial.mMoltenRGBa[1] = getSafeRGBValue(tMaterial.mMoltenRGBa[1], tDirection); - } - - for (Materials tMaterial : mMoltenPosB) { - tMaterial.mMoltenRGBa[2] = getSafeRGBValue(tMaterial.mMoltenRGBa[2], tDirection); - } - - for (Materials tMaterial : mMoltenPosA) { - tMaterial.mMoltenRGBa[3] = getSafeRGBValue(tMaterial.mMoltenRGBa[3], tDirection); - } - - for (Materials tMaterial : mMoltenNegR) { - tMaterial.mMoltenRGBa[0] = getSafeRGBValue(tMaterial.mMoltenRGBa[0], -tDirection); - } - - for (Materials tMaterial : mMoltenNegG) { - tMaterial.mMoltenRGBa[1] = getSafeRGBValue(tMaterial.mMoltenRGBa[1], -tDirection); - } - - for (Materials tMaterial : mMoltenNegB) { - tMaterial.mMoltenRGBa[2] = getSafeRGBValue(tMaterial.mMoltenRGBa[2], -tDirection); - } - - for (Materials tMaterial : mMoltenNegA) { - tMaterial.mMoltenRGBa[3] = getSafeRGBValue(tMaterial.mMoltenRGBa[3], -tDirection); - } - } - } - - public short getSafeRGBValue(short aRBG, int aDelta) { - int tmp = aRBG + aDelta; - if (tmp > 255) tmp = 255; - if (tmp < 0) tmp = 0; - return (short) tmp; - } - - @Override - public long getAnimationTicks() { - return mAnimationTick; - } - - @Override - public float getPartialRenderTicks() { - return renderTickTime; - } - - @Override - public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) { - if (GT_Utility.isStackInvalid(aStack)) return; - String tString = SoundResource.NOTE_HARP.toString(); - int i = 0; - int j = mSoundItems.size(); - do { - if (i >= j) break; - if (GT_Utility.areStacksEqual(mSoundItems.get(i), aStack)) { - tString = mSoundNames.get(i); - break; - } - i++; - } while (true); - if (tString.startsWith(SoundResource.RANDOM_EXPLODE.toString())) - if (aStack.stackSize == 3) tString = SoundResource.RANDOM_FUSE.toString(); - else if (aStack.stackSize == 2) tString = "random.old_explode"; - if (tString.startsWith("streaming.")) tString = switch (aStack.stackSize) { - case 1 -> // '\001' - tString + "13"; - case 2 -> // '\002' - tString + "cat"; - case 3 -> // '\003' - tString + "blocks"; - case 4 -> // '\004' - tString + "chirp"; - case 5 -> // '\005' - tString + "far"; - case 6 -> // '\006' - tString + "mall"; - case 7 -> // '\007' - tString + "mellohi"; - case 8 -> // '\b' - tString + "stal"; - case 9 -> // '\t' - tString + "strad"; - case 10 -> // '\n' - tString + "ward"; - case 11 -> // '\013' - tString + "11"; - case 12 -> // '\f' - tString + "wait"; - default -> tString + "wherearewenow"; - }; - if (tString.startsWith("streaming.")) { - new WorldSpawnedEventBuilder.RecordEffectEventBuilder().setIdentifier(tString.substring(10)) - .setPosition(aX, aY, aZ) - .run(); - } else { - new WorldSpawnedEventBuilder.SoundEventBuilder().setVolume(3f) - .setPitch( - tString.startsWith("note.") ? (float) Math.pow(2D, (double) (aStack.stackSize - 13) / 12D) : 1.0F) - .setIdentifier(tString) - .setPosition(aX, aY, aZ) - .run(); - } - } - - public static int hideValue = 0; - - /** - *

- * Client tick counter that is set to 5 on hiding pipes and covers. - *

- *

- * It triggers a texture update next client tick when reaching 4, with provision for 3 more update tasks, spreading - * client change detection related work and network traffic on different ticks, until it reaches 0. - *

- */ - public static int changeDetected = 0; - - private static int shouldHeldItemHideThings() { - try { - final EntityPlayer player = Minecraft.getMinecraft().thePlayer; - if (player == null) return 0; - final ItemStack tCurrentItem = player.getCurrentEquippedItem(); - if (tCurrentItem == null) return 0; - final int[] ids = OreDictionary.getOreIDs(tCurrentItem); - int hide = 0; - for (int i : ids) { - if (OreDictionary.getOreName(i) - .equals("craftingToolSolderingIron")) { - hide |= 0x1; - break; - } - } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList) - || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList) - || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList) - || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList) - || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList) - || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList) - || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList) - || GregTech_API.sCovers.containsKey(new GT_ItemStack(tCurrentItem)) - || (tCurrentItem.getItem() instanceof GT_Item_Machines - && GregTech_API.METATILEENTITIES[tCurrentItem.getItemDamage()] instanceof MetaPipeEntity - && player.isSneaking())) { - hide |= 0x2; - } - return hide; - } catch (Exception e) { - return 0; - } - } - - public static void recieveChunkPollutionPacket(ChunkCoordIntPair chunk, int pollution) { - mPollutionRenderer.processPacket(chunk, pollution); - } -} diff --git a/src/main/java/gregtech/common/GT_DummyWorld.java b/src/main/java/gregtech/common/GT_DummyWorld.java deleted file mode 100644 index d394ad3703..0000000000 --- a/src/main/java/gregtech/common/GT_DummyWorld.java +++ /dev/null @@ -1,138 +0,0 @@ -package gregtech.common; - -import java.io.File; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.profiler.Profiler; -import net.minecraft.world.World; -import net.minecraft.world.WorldProvider; -import net.minecraft.world.WorldSettings; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraft.world.chunk.storage.IChunkLoader; -import net.minecraft.world.storage.IPlayerFileData; -import net.minecraft.world.storage.ISaveHandler; -import net.minecraft.world.storage.WorldInfo; - -public class GT_DummyWorld extends World { - - public GT_IteratorRandom mRandom = new GT_IteratorRandom(); - public ItemStack mLastSetBlock = null; - - public GT_DummyWorld(ISaveHandler saveHandler, String name, WorldProvider worldProvider, - WorldSettings worldSettings, Profiler profiler) { - super(saveHandler, name, worldSettings, worldProvider, profiler); - this.rand = this.mRandom; - } - - public GT_DummyWorld() { - this(new ISaveHandler() { - - @Override - public void saveWorldInfoWithPlayer(WorldInfo worldInfo, NBTTagCompound nbtTagCompound) {} - - @Override - public void saveWorldInfo(WorldInfo worldInfo) {} - - @Override - public WorldInfo loadWorldInfo() { - return null; - } - - @Override - public IPlayerFileData getSaveHandler() { - return null; - } - - @Override - public File getMapFileFromName(String mapName) { - return null; - } - - @Override - public IChunkLoader getChunkLoader(WorldProvider worldProvider) { - return null; - } - - @Override - public void flush() {} - - @Override - public void checkSessionLock() {} - - @Override - public String getWorldDirectoryName() { - return null; - } - - @Override - public File getWorldDirectory() { - return null; - } - }, "DUMMY_DIMENSION", null, new WorldSettings(new WorldInfo(new NBTTagCompound())), new Profiler()); - } - - @Override - protected IChunkProvider createChunkProvider() { - return null; - } - - @Override - public Entity getEntityByID(int aEntityID) { - return null; - } - - @Override - public boolean setBlock(int aX, int aY, int aZ, Block aBlock, int aMeta, int aFlags) { - this.mLastSetBlock = new ItemStack(aBlock, 1, aMeta); - return true; - } - - @Override - public float getSunBrightnessFactor(float p_72967_1_) { - return 1.0F; - } - - @Override - public BiomeGenBase getBiomeGenForCoords(int aX, int aZ) { - if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) { - return BiomeGenBase.plains; - } - return BiomeGenBase.ocean; - } - - @Override - public int getFullBlockLightValue(int aX, int aY, int aZ) { - return 10; - } - - @Override - public Block getBlock(int aX, int aY, int aZ) { - if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) { - return aY == 64 ? Blocks.grass : Blocks.air; - } - return Blocks.air; - } - - @Override - public int getBlockMetadata(int aX, int aY, int aZ) { - return 0; - } - - @Override - public boolean canBlockSeeTheSky(int aX, int aY, int aZ) { - if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) { - return aY > 64; - } - return true; - } - - @Override - protected int func_152379_p() { - return 0; - } -} diff --git a/src/main/java/gregtech/common/GT_IteratorRandom.java b/src/main/java/gregtech/common/GT_IteratorRandom.java deleted file mode 100644 index addce0a456..0000000000 --- a/src/main/java/gregtech/common/GT_IteratorRandom.java +++ /dev/null @@ -1,17 +0,0 @@ -package gregtech.common; - -import java.util.Random; - -public class GT_IteratorRandom extends Random { - - private static final long serialVersionUID = 1L; - public int mIterationStep = 2147483647; - - @Override - public int nextInt(int aParameter) { - if ((this.mIterationStep == 0) || (this.mIterationStep > aParameter)) { - this.mIterationStep = aParameter; - } - return --this.mIterationStep; - } -} diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java deleted file mode 100644 index bf5826e9ae..0000000000 --- a/src/main/java/gregtech/common/GT_Network.java +++ /dev/null @@ -1,154 +0,0 @@ -package gregtech.common; - -import static gregtech.GT_Mod.GT_FML_LOGGER; - -import java.util.EnumMap; -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; - -import com.google.common.io.ByteArrayDataInput; -import com.google.common.io.ByteStreams; - -import cpw.mods.fml.common.network.FMLEmbeddedChannel; -import cpw.mods.fml.common.network.FMLOutboundHandler; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import cpw.mods.fml.relauncher.Side; -import gregtech.api.enums.GT_Values; -import gregtech.api.net.GT_Packet; -import gregtech.api.net.GT_PacketTypes; -import gregtech.api.net.GT_Packet_New; -import gregtech.api.net.IGT_NetworkHandler; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.handler.codec.MessageToMessageCodec; - -@ChannelHandler.Sharable -@SuppressWarnings("deprecation") -public class GT_Network extends MessageToMessageCodec implements IGT_NetworkHandler { - - private final EnumMap mChannel; - private final GT_Packet[] mSubChannels; - - public GT_Network() { - this("GregTech", GT_PacketTypes.referencePackets()); - } - - public GT_Network(String channelName, GT_Packet_New... packetTypes) { - this.mChannel = NetworkRegistry.INSTANCE.newChannel(channelName, this, new HandlerShared()); - final int lastPId = packetTypes[packetTypes.length - 1].getPacketID(); - this.mSubChannels = new GT_Packet[lastPId + 1]; - for (GT_Packet packetType : packetTypes) { - final int pId = packetType.getPacketID(); - if (this.mSubChannels[pId] == null) this.mSubChannels[pId] = packetType; - else throw new IllegalArgumentException("Duplicate Packet ID! " + pId); - } - } - - @Override - protected void encode(ChannelHandlerContext aContext, GT_Packet aPacket, List aOutput) { - final ByteBuf tBuf = Unpooled.buffer() - .writeByte(aPacket.getPacketID()); - aPacket.encode(tBuf); - aOutput.add( - new FMLProxyPacket( - tBuf, - aContext.channel() - .attr(NetworkRegistry.FML_CHANNEL) - .get())); - } - - @Override - protected void decode(ChannelHandlerContext aContext, FMLProxyPacket aPacket, List aOutput) { - final ByteArrayDataInput aData = ByteStreams.newDataInput( - aPacket.payload() - .array()); - final GT_Packet tPacket = this.mSubChannels[aData.readByte()].decode(aData); - tPacket.setINetHandler(aPacket.handler()); - aOutput.add(tPacket); - } - - @Override - public void sendToPlayer(GT_Packet aPacket, EntityPlayerMP aPlayer) { - if (aPacket == null) { - GT_FML_LOGGER.info("packet null"); - return; - } - if (aPlayer == null) { - GT_FML_LOGGER.info("player null"); - return; - } - this.mChannel.get(Side.SERVER) - .attr(FMLOutboundHandler.FML_MESSAGETARGET) - .set(FMLOutboundHandler.OutboundTarget.PLAYER); - this.mChannel.get(Side.SERVER) - .attr(FMLOutboundHandler.FML_MESSAGETARGETARGS) - .set(aPlayer); - this.mChannel.get(Side.SERVER) - .writeAndFlush(aPacket); - } - - @Override - public void sendToAllAround(GT_Packet aPacket, NetworkRegistry.TargetPoint aPosition) { - this.mChannel.get(Side.SERVER) - .attr(FMLOutboundHandler.FML_MESSAGETARGET) - .set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); - this.mChannel.get(Side.SERVER) - .attr(FMLOutboundHandler.FML_MESSAGETARGETARGS) - .set(aPosition); - this.mChannel.get(Side.SERVER) - .writeAndFlush(aPacket); - } - - @Override - public void sendToAll(GT_Packet aPacket) { - this.mChannel.get(Side.SERVER) - .attr(FMLOutboundHandler.FML_MESSAGETARGET) - .set(FMLOutboundHandler.OutboundTarget.ALL); - this.mChannel.get(Side.SERVER) - .writeAndFlush(aPacket); - } - - @Override - public void sendToServer(GT_Packet aPacket) { - this.mChannel.get(Side.CLIENT) - .attr(FMLOutboundHandler.FML_MESSAGETARGET) - .set(FMLOutboundHandler.OutboundTarget.TOSERVER); - this.mChannel.get(Side.CLIENT) - .writeAndFlush(aPacket); - } - - @Override - public void sendPacketToAllPlayersInRange(World aWorld, GT_Packet aPacket, int aX, int aZ) { - if (!aWorld.isRemote) { - for (Object tObject : aWorld.playerEntities) { - if (!(tObject instanceof EntityPlayerMP tPlayer)) { - break; - } - Chunk tChunk = aWorld.getChunkFromBlockCoords(aX, aZ); - if (tPlayer.getServerForPlayer() - .getPlayerManager() - .isPlayerWatchingChunk(tPlayer, tChunk.xPosition, tChunk.zPosition)) { - sendToPlayer(aPacket, tPlayer); - } - } - } - } - - @ChannelHandler.Sharable - static final class HandlerShared extends SimpleChannelInboundHandler { - - @Override - protected void channelRead0(ChannelHandlerContext ctx, GT_Packet aPacket) { - final EntityPlayer aPlayer = GT_Values.GT.getThePlayer(); - aPacket.process(aPlayer == null ? null : aPlayer.worldObj); - } - } -} diff --git a/src/main/java/gregtech/common/GT_PlayerActivityLogger.java b/src/main/java/gregtech/common/GT_PlayerActivityLogger.java deleted file mode 100644 index c60378ca5e..0000000000 --- a/src/main/java/gregtech/common/GT_PlayerActivityLogger.java +++ /dev/null @@ -1,34 +0,0 @@ -package gregtech.common; - -import java.util.ArrayList; - -import gregtech.GT_Mod; -import gregtech.api.util.GT_Log; - -public class GT_PlayerActivityLogger implements Runnable { - - @Override - public void run() { - try { - ArrayList buffer = new ArrayList<>(); - for (;;) { - if (GT_Log.pal == null) { - return; - } - String tLastOutput = ""; - // Block on first element for efficiency - buffer.add(GT_Mod.gregtechproxy.mBufferedPlayerActivity.take()); - GT_Mod.gregtechproxy.mBufferedPlayerActivity.drainTo(buffer); - for (String output : buffer) { - if (!output.equals(tLastOutput)) { - GT_Log.pal.println(output); - tLastOutput = output; - } - } - buffer.clear(); - // TODO: swap from sleep to event bus - Thread.sleep(10000L); - } - } catch (Throwable ignored) {} - } -} diff --git a/src/main/java/gregtech/common/GT_Pollution.java b/src/main/java/gregtech/common/GT_Pollution.java deleted file mode 100644 index 6a2b1e1082..0000000000 --- a/src/main/java/gregtech/common/GT_Pollution.java +++ /dev/null @@ -1,507 +0,0 @@ -package gregtech.common; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; -import static gregtech.common.GT_Proxy.dimensionWisePollution; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.ChunkPosition; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.world.ChunkDataEvent; -import net.minecraftforge.event.world.ChunkWatchEvent; -import net.minecraftforge.event.world.WorldEvent; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.common.network.NetworkRegistry; -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.ICleanroom; -import gregtech.api.interfaces.ICleanroomReceiver; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.net.GT_Packet_Pollution; -import gregtech.api.util.GT_ChunkAssociatedData; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.GT_PollutionRenderer; - -public class GT_Pollution { - - private static final Storage STORAGE = new Storage(); - /** - * Pollution dispersion until effects start: Calculation: ((Limit * 0.01) + 2000) * (4 <- spreading rate) - *

- * SMOG(500k) 466.7 pollution/sec Poison(750k) 633,3 pollution/sec Dying Plants(1mio) 800 pollution/sec Sour - * Rain(1.5mio) 1133.3 pollution/sec - *

- * Pollution producers (pollution/sec) Bronze Boiler(20) Lava Boiler(20) High Pressure Boiler(20) Bronze Blast - * Furnace(50) Diesel Generator(40/80/160) Gas Turbine(20/40/80) Charcoal Pile(100) - *

- * Large Diesel Engine(320) Electric Blast Furnace(100) Implosion Compressor(2000) Large Boiler(240) Large Gas - * Turbine(160) Multi Smelter(100) Pyrolyse Oven(400) - *

- * Machine Explosion(100,000) - *

- * Other Random Shit: lots and lots - *

- * Muffler Hatch Pollution reduction: ** inaccurate ** LV (0%), MV (30%), HV (52%), EV (66%), IV (76%), LuV (84%), - * ZPM (89%), UV (92%), MAX (95%) - */ - private List pollutionList = new ArrayList<>(); // chunks left to process in this cycle - - private final Set pollutedChunks = new HashSet<>(); // a global list of all chunks with positive - // pollution - private int operationsPerTick = 0; // how much chunks should be processed in each cycle - private static final short cycleLen = 1200; - private final World world; - private boolean blank = true; - public static int mPlayerPollution; - - private static final int POLLUTIONPACKET_MINVALUE = 1000; - - private static GT_PollutionEventHandler EVENT_HANDLER; - - public GT_Pollution(World world) { - this.world = world; - - if (EVENT_HANDLER == null) { - EVENT_HANDLER = new GT_PollutionEventHandler(); - MinecraftForge.EVENT_BUS.register(EVENT_HANDLER); - } - } - - public static void onWorldTick(TickEvent.WorldTickEvent aEvent) { // called from proxy - // return if pollution disabled - if (!GT_Mod.gregtechproxy.mPollution) return; - if (aEvent.phase == TickEvent.Phase.START) return; - final GT_Pollution pollutionInstance = dimensionWisePollution.get(aEvent.world.provider.dimensionId); - if (pollutionInstance == null) return; - pollutionInstance.tickPollutionInWorld((int) (aEvent.world.getTotalWorldTime() % cycleLen)); - } - - private void tickPollutionInWorld(int aTickID) { // called from method above - // gen data set - if (aTickID == 0 || blank) { - // make a snapshot of what to work on - pollutionList = new ArrayList<>(pollutedChunks); - // set operations per tick - if (pollutionList.size() > 0) operationsPerTick = Math.max(1, pollutionList.size() / cycleLen); - else operationsPerTick = 0; // SANity - blank = false; - } - - for (int chunksProcessed = 0; chunksProcessed < operationsPerTick; chunksProcessed++) { - if (pollutionList.size() == 0) break; // no more stuff to do - ChunkCoordIntPair actualPos = pollutionList.remove(pollutionList.size() - 1); // faster - // get pollution - ChunkData currentData = STORAGE.get(world, actualPos); - int tPollution = currentData.getAmount(); - // remove some - tPollution = (int) (0.9945f * tPollution); - - if (tPollution > 400000) { // Spread Pollution - - ChunkCoordIntPair[] tNeighbors = new ChunkCoordIntPair[4]; // array is faster - tNeighbors[0] = (new ChunkCoordIntPair(actualPos.chunkXPos + 1, actualPos.chunkZPos)); - tNeighbors[1] = (new ChunkCoordIntPair(actualPos.chunkXPos - 1, actualPos.chunkZPos)); - tNeighbors[2] = (new ChunkCoordIntPair(actualPos.chunkXPos, actualPos.chunkZPos + 1)); - tNeighbors[3] = (new ChunkCoordIntPair(actualPos.chunkXPos, actualPos.chunkZPos - 1)); - for (ChunkCoordIntPair neighborPosition : tNeighbors) { - ChunkData neighbor = STORAGE.get(world, neighborPosition); - int neighborPollution = neighbor.getAmount(); - if (neighborPollution * 6 < tPollution * 5) { // MATHEMATICS... - int tDiff = tPollution - neighborPollution; - tDiff = tDiff / 20; - neighborPollution = GT_Utility.safeInt((long) neighborPollution + tDiff); // tNPol += tDiff; - tPollution -= tDiff; - setChunkPollution(neighborPosition, neighborPollution); - } - } - - // Create Pollution effects - // Smog filter TODO - if (tPollution > GT_Mod.gregtechproxy.mPollutionSmogLimit) { - AxisAlignedBB chunk = AxisAlignedBB.getBoundingBox( - actualPos.chunkXPos << 4, - 0, - actualPos.chunkZPos << 4, - (actualPos.chunkXPos << 4) + 16, - 256, - (actualPos.chunkZPos << 4) + 16); - List tEntitys = world.getEntitiesWithinAABB(EntityLivingBase.class, chunk); - for (EntityLivingBase tEnt : tEntitys) { - if (tEnt instanceof EntityPlayerMP && ((EntityPlayerMP) tEnt).capabilities.isCreativeMode) - continue; - if (!(GT_Utility.isWearingFullGasHazmat(tEnt))) { - switch (XSTR_INSTANCE.nextInt(3)) { - default: - tEnt.addPotionEffect( - new PotionEffect( - Potion.digSlowdown.id, - Math.min(tPollution / 1000, 1000), - tPollution / 400000)); - case 1: - tEnt.addPotionEffect( - new PotionEffect( - Potion.weakness.id, - Math.min(tPollution / 1000, 1000), - tPollution / 400000)); - case 2: - tEnt.addPotionEffect( - new PotionEffect( - Potion.moveSlowdown.id, - Math.min(tPollution / 1000, 1000), - tPollution / 400000)); - } - } - } - - // Poison effects - if (tPollution > GT_Mod.gregtechproxy.mPollutionPoisonLimit) { - for (EntityLivingBase tEnt : tEntitys) { - if (tEnt instanceof EntityPlayerMP && ((EntityPlayerMP) tEnt).capabilities.isCreativeMode) - continue; - if (!GT_Utility.isWearingFullGasHazmat(tEnt)) { - switch (XSTR_INSTANCE.nextInt(4)) { - default: - tEnt.addPotionEffect(new PotionEffect(Potion.hunger.id, tPollution / 500000)); - case 1: - tEnt.addPotionEffect( - new PotionEffect( - Potion.confusion.id, - Math.min(tPollution / 2000, 1000), - 1)); - case 2: - tEnt.addPotionEffect( - new PotionEffect( - Potion.poison.id, - Math.min(tPollution / 4000, 1000), - tPollution / 500000)); - case 3: - tEnt.addPotionEffect( - new PotionEffect( - Potion.blindness.id, - Math.min(tPollution / 2000, 1000), - 1)); - } - } - } - - // killing plants - if (tPollution > GT_Mod.gregtechproxy.mPollutionVegetationLimit) { - int f = 20; - for (; f < (tPollution / 25000); f++) { - int x = (actualPos.chunkXPos << 4) + XSTR_INSTANCE.nextInt(16); - int y = 60 + (-f + XSTR_INSTANCE.nextInt(f * 2 + 1)); - int z = (actualPos.chunkZPos << 4) + XSTR_INSTANCE.nextInt(16); - damageBlock(world, x, y, z, tPollution > GT_Mod.gregtechproxy.mPollutionSourRainLimit); - } - } - } - } - } - // Write new pollution to Hashmap !!! - setChunkPollution(actualPos, tPollution); - - // Send new value to players nearby - if (tPollution > POLLUTIONPACKET_MINVALUE) { - NetworkRegistry.TargetPoint point = new NetworkRegistry.TargetPoint( - world.provider.dimensionId, - (actualPos.chunkXPos << 4), - 64, - (actualPos.chunkZPos << 4), - 256); - GT_Values.NW.sendToAllAround(new GT_Packet_Pollution(actualPos, tPollution), point); - } - } - } - - private void setChunkPollution(ChunkCoordIntPair coord, int pollution) { - mutatePollution(world, coord.chunkXPos, coord.chunkZPos, c -> c.setAmount(pollution), pollutedChunks); - } - - private static void damageBlock(World world, int x, int y, int z, boolean sourRain) { - if (world.isRemote) return; - Block tBlock = world.getBlock(x, y, z); - int tMeta = world.getBlockMetadata(x, y, z); - if (tBlock == Blocks.air || tBlock == Blocks.stone || tBlock == Blocks.sand || tBlock == Blocks.deadbush) - return; - - if (tBlock == Blocks.leaves || tBlock == Blocks.leaves2 || tBlock.getMaterial() == Material.leaves) - world.setBlockToAir(x, y, z); - if (tBlock == Blocks.reeds) { - tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); - world.setBlockToAir(x, y, z); - } - if (tBlock == Blocks.tallgrass) world.setBlock(x, y, z, Blocks.deadbush); - if (tBlock == Blocks.vine) { - tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); - world.setBlockToAir(x, y, z); - } - if (tBlock == Blocks.waterlily || tBlock == Blocks.wheat - || tBlock == Blocks.cactus - || tBlock.getMaterial() == Material.cactus - || tBlock == Blocks.melon_block - || tBlock == Blocks.melon_stem) { - tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); - world.setBlockToAir(x, y, z); - } - if (tBlock == Blocks.red_flower || tBlock == Blocks.yellow_flower - || tBlock == Blocks.carrots - || tBlock == Blocks.potatoes - || tBlock == Blocks.pumpkin - || tBlock == Blocks.pumpkin_stem) { - tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); - world.setBlockToAir(x, y, z); - } - if (tBlock == Blocks.sapling || tBlock.getMaterial() == Material.plants) - world.setBlock(x, y, z, Blocks.deadbush); - if (tBlock == Blocks.cocoa) { - tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); - world.setBlockToAir(x, y, z); - } - if (tBlock == Blocks.mossy_cobblestone) world.setBlock(x, y, z, Blocks.cobblestone); - if (tBlock == Blocks.grass || tBlock.getMaterial() == Material.grass) world.setBlock(x, y, z, Blocks.dirt); - if (tBlock == Blocks.farmland || tBlock == Blocks.dirt) { - world.setBlock(x, y, z, Blocks.sand); - } - - if (sourRain && world.isRaining() - && (tBlock == Blocks.gravel || tBlock == Blocks.cobblestone) - && world.getBlock(x, y + 1, z) == Blocks.air - && world.canBlockSeeTheSky(x, y, z)) { - if (tBlock == Blocks.cobblestone) { - world.setBlock(x, y, z, Blocks.gravel); - } else { - world.setBlock(x, y, z, Blocks.sand); - } - } - } - - private static GT_Pollution getPollutionManager(World world) { - return dimensionWisePollution.computeIfAbsent(world.provider.dimensionId, i -> new GT_Pollution(world)); - } - - /** @see #addPollution(TileEntity, int) */ - public static void addPollution(IGregTechTileEntity te, int aPollution) { - addPollution((TileEntity) te, aPollution); - } - - /** - * Also pollutes cleanroom if {@code te} is an instance of {@link ICleanroomReceiver}. - * - * @see #addPollution(World, int, int, int) - */ - public static void addPollution(TileEntity te, int aPollution) { - if (!GT_Mod.gregtechproxy.mPollution || aPollution == 0 || te.getWorldObj().isRemote) return; - - if (aPollution > 0 && te instanceof ICleanroomReceiver receiver) { - ICleanroom cleanroom = receiver.getCleanroom(); - if (cleanroom != null && cleanroom.isValidCleanroom()) { - cleanroom.pollute(); - } - } - - addPollution(te.getWorldObj(), te.xCoord >> 4, te.zCoord >> 4, aPollution); - } - - /** @see #addPollution(World, int, int, int) */ - public static void addPollution(Chunk ch, int aPollution) { - addPollution(ch.worldObj, ch.xPosition, ch.zPosition, aPollution); - } - - /** - * Add some pollution to given chunk. Can pass in negative to remove pollution. Will clamp the final pollution - * number to 0 if it would be changed into negative. - * - * @param w world to modify. do nothing if it's a client world - * @param chunkX chunk coordinate X, i.e. blockX >> 4 - * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4 - * @param aPollution desired delta. Positive means the pollution in chunk would go higher. - */ - public static void addPollution(World w, int chunkX, int chunkZ, int aPollution) { - if (!GT_Mod.gregtechproxy.mPollution || aPollution == 0 || w.isRemote) return; - mutatePollution(w, chunkX, chunkZ, d -> d.changeAmount(aPollution), null); - } - - private static void mutatePollution(World world, int x, int z, Consumer mutator, - @Nullable Set chunks) { - ChunkData data = STORAGE.get(world, x, z); - boolean hadPollution = data.getAmount() > 0; - mutator.accept(data); - boolean hasPollution = data.getAmount() > 0; - if (hasPollution != hadPollution) { - if (chunks == null) chunks = getPollutionManager(world).pollutedChunks; - if (hasPollution) chunks.add(new ChunkCoordIntPair(x, z)); - else chunks.remove(new ChunkCoordIntPair(x, z)); - } - } - - /** @see #getPollution(World, int, int) */ - public static int getPollution(IGregTechTileEntity te) { - return getPollution(te.getWorld(), te.getXCoord() >> 4, te.getZCoord() >> 4); - } - - /** @see #getPollution(World, int, int) */ - public static int getPollution(Chunk ch) { - return getPollution(ch.worldObj, ch.xPosition, ch.zPosition); - } - - /** - * Get the pollution in specified chunk - * - * @param w world to look in. can be a client world, but that limits the knowledge to what server side send us - * @param chunkX chunk coordinate X, i.e. blockX >> 4 - * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4 - * @return pollution amount. may be 0 if pollution is disabled, or if it's a client world and server did not send us - * info about this chunk - */ - public static int getPollution(World w, int chunkX, int chunkZ) { - if (!GT_Mod.gregtechproxy.mPollution) return 0; - if (w.isRemote) - // it really should be querying the client side stuff instead - return GT_PollutionRenderer.getKnownPollution(chunkX << 4, chunkZ << 4); - return STORAGE.get(w, chunkX, chunkZ) - .getAmount(); - } - - @Deprecated - public static int getPollution(ChunkCoordIntPair aCh, int aDim) { - return getPollution(DimensionManager.getWorld(aDim), aCh.chunkXPos, aCh.chunkZPos); - } - - public static boolean hasPollution(Chunk ch) { - if (!GT_Mod.gregtechproxy.mPollution) return false; - return STORAGE.isCreated(ch.worldObj, ch.getChunkCoordIntPair()) && STORAGE.get(ch) - .getAmount() > 0; - } - - // Add compatibility with old code - @Deprecated /* Don't use it... too weird way of passing position */ - public static void addPollution(World aWorld, ChunkPosition aPos, int aPollution) { - // The abuse of ChunkPosition to store block position and dim... - // is just bad especially when that is both used to store ChunkPos and BlockPos depending on context - addPollution(aWorld.getChunkFromBlockCoords(aPos.chunkPosX, aPos.chunkPosZ), aPollution); - } - - static void migrate(ChunkDataEvent.Load e) { - addPollution( - e.getChunk(), - e.getData() - .getInteger("GTPOLLUTION")); - } - - public static class GT_PollutionEventHandler { - - @SubscribeEvent - public void chunkWatch(ChunkWatchEvent.Watch event) { - if (!GT_Mod.gregtechproxy.mPollution) return; - World world = event.player.worldObj; - if (STORAGE.isCreated(world, event.chunk)) { - int pollution = STORAGE.get(world, event.chunk) - .getAmount(); - if (pollution > POLLUTIONPACKET_MINVALUE) - GT_Values.NW.sendToPlayer(new GT_Packet_Pollution(event.chunk, pollution), event.player); - } - } - - @SubscribeEvent - public void onWorldLoad(WorldEvent.Load e) { - // super class loads everything lazily. We force it to load them all. - if (!e.world.isRemote) STORAGE.loadAll(e.world); - } - } - - @ParametersAreNonnullByDefault - private static final class Storage extends GT_ChunkAssociatedData { - - private Storage() { - super("Pollution", ChunkData.class, 64, (byte) 0, false); - } - - @Override - protected void writeElement(DataOutput output, ChunkData element, World world, int chunkX, int chunkZ) - throws IOException { - output.writeInt(element.getAmount()); - } - - @Override - protected ChunkData readElement(DataInput input, int version, World world, int chunkX, int chunkZ) - throws IOException { - if (version != 0) throw new IOException("Region file corrupted"); - ChunkData data = new ChunkData(input.readInt()); - if (data.getAmount() > 0) - getPollutionManager(world).pollutedChunks.add(new ChunkCoordIntPair(chunkX, chunkZ)); - return data; - } - - @Override - protected ChunkData createElement(World world, int chunkX, int chunkZ) { - return new ChunkData(); - } - - @Override - public void loadAll(World w) { - super.loadAll(w); - } - - public boolean isCreated(World world, ChunkCoordIntPair coord) { - return isCreated(world.provider.dimensionId, coord.chunkXPos, coord.chunkZPos); - } - } - - private static final class ChunkData implements GT_ChunkAssociatedData.IData { - - public int amount; - - private ChunkData() { - this(0); - } - - private ChunkData(int amount) { - this.amount = Math.max(0, amount); - } - - /** - * Current pollution amount. - */ - public int getAmount() { - return amount; - } - - public void setAmount(int amount) { - this.amount = Math.max(amount, 0); - } - - public void changeAmount(int delta) { - this.amount = Math.max(GT_Utility.safeInt(amount + (long) delta, 0), 0); - } - - @Override - public boolean isSameAsDefault() { - return amount == 0; - } - } -} diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java deleted file mode 100644 index 40fa1d1548..0000000000 --- a/src/main/java/gregtech/common/GT_Proxy.java +++ /dev/null @@ -1,2899 +0,0 @@ -package gregtech.common; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.FluidState.GAS; -import static gregtech.api.enums.FluidState.LIQUID; -import static gregtech.api.enums.FluidState.MOLTEN; -import static gregtech.api.enums.FluidState.PLASMA; -import static gregtech.api.enums.GT_Values.W; -import static gregtech.api.enums.GT_Values.debugEntityCramming; -import static gregtech.api.enums.Mods.AdvancedSolarPanel; -import static gregtech.api.enums.Mods.AppliedEnergistics2; -import static gregtech.api.enums.Mods.Avaritia; -import static gregtech.api.enums.Mods.BetterLoadingScreen; -import static gregtech.api.enums.Mods.DraconicEvolution; -import static gregtech.api.enums.Mods.ElectroMagicTools; -import static gregtech.api.enums.Mods.EnderIO; -import static gregtech.api.enums.Mods.Forestry; -import static gregtech.api.enums.Mods.GTPlusPlus; -import static gregtech.api.enums.Mods.GalacticraftCore; -import static gregtech.api.enums.Mods.GalaxySpace; -import static gregtech.api.enums.Mods.GraviSuite; -import static gregtech.api.enums.Mods.GregTech; -import static gregtech.api.enums.Mods.IguanaTweaksTinkerConstruct; -import static gregtech.api.enums.Mods.Names; -import static gregtech.api.enums.Mods.Railcraft; -import static gregtech.api.enums.Mods.TaintedMagic; -import static gregtech.api.enums.Mods.Thaumcraft; -import static gregtech.api.enums.Mods.ThaumicBoots; -import static gregtech.api.enums.Mods.ThaumicTinkerer; -import static gregtech.api.enums.Mods.TinkerConstruct; -import static gregtech.api.enums.Mods.TwilightForest; -import static gregtech.api.enums.Mods.WitchingGadgets; -import static gregtech.api.recipe.RecipeMaps.crackingRecipes; -import static gregtech.api.recipe.RecipeMaps.cutterRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_Util.LAST_BROKEN_TILEENTITY; -import static net.minecraftforge.fluids.FluidRegistry.getFluidStack; - -import java.io.File; -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.locks.ReentrantLock; -import java.util.stream.Collectors; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntityEnderman; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraft.world.WorldSettings.GameType; -import net.minecraft.world.gen.feature.WorldGenMinable; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import net.minecraftforge.event.entity.living.EnderTeleportEvent; -import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.event.entity.player.ArrowLooseEvent; -import net.minecraftforge.event.entity.player.ArrowNockEvent; -import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.terraingen.OreGenEvent; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.event.world.ChunkDataEvent; -import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidContainerRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.RecipeSorter; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.IFuelHandler; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.ModContainer; -import cpw.mods.fml.common.ProgressManager; -import cpw.mods.fml.common.eventhandler.Event.Result; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.common.network.FMLNetworkEvent; -import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.FluidState; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.ManualOreDictTweaks; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OreDictNames; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TC_Aspects.TC_AspectStack; -import gregtech.api.enums.TierEU; -import gregtech.api.enums.ToolDictNames; -import gregtech.api.fluid.GT_FluidFactory; -import gregtech.api.interfaces.IBlockOnWalkOver; -import gregtech.api.interfaces.IProjectileItem; -import gregtech.api.interfaces.IToolStats; -import gregtech.api.interfaces.internal.IGT_Mod; -import gregtech.api.interfaces.internal.IThaumcraftCompat; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaGenerated_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.net.GT_Packet_MusicSystemData; -import gregtech.api.objects.GT_ChunkManager; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.GT_UO_DimensionList; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeCategory; -import gregtech.api.recipe.RecipeCategorySetting; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_BlockMap; -import gregtech.api.util.GT_CLS_Compat; -import gregtech.api.util.GT_ChunkAssociatedData; -import gregtech.api.util.GT_ClientPreference; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_MusicSystem; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_RecipeRegistrator; -import gregtech.api.util.GT_Shaped_Recipe; -import gregtech.api.util.GT_Shapeless_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder; -import gregtech.common.config.opstuff.ConfigGeneral; -import gregtech.common.items.GT_MetaGenerated_Item_98; -import gregtech.common.items.GT_MetaGenerated_Tool_01; -import gregtech.common.items.ID_MetaTool_01; -import gregtech.common.misc.GlobalEnergyWorldSavedData; -import gregtech.common.misc.GlobalMetricsCoverDatabase; -import gregtech.common.misc.spaceprojects.SpaceProjectWorldSavedData; -import gregtech.common.tileentities.machines.multi.drone.GT_MetaTileEntity_DroneCentre; - -public abstract class GT_Proxy implements IGT_Mod, IFuelHandler { - - private static final EnumSet PREVENTED_ORES = EnumSet.of( - OreGenEvent.GenerateMinable.EventType.COAL, - OreGenEvent.GenerateMinable.EventType.IRON, - OreGenEvent.GenerateMinable.EventType.GOLD, - OreGenEvent.GenerateMinable.EventType.DIAMOND, - OreGenEvent.GenerateMinable.EventType.REDSTONE, - OreGenEvent.GenerateMinable.EventType.LAPIS, - OreGenEvent.GenerateMinable.EventType.QUARTZ); - public final HashSet mRegisteredOres = new HashSet<>(10000); - public final ArrayList mSoundNames = new ArrayList<>(); - public final ArrayList mSoundItems = new ArrayList<>(); - public final ArrayList mSoundCounts = new ArrayList<>(); - private final Collection mEvents = new HashSet<>(); - private final Collection mIgnoredItems = new HashSet<>( - Arrays.asList( - "itemGhastTear", - "itemFlint", - "itemClay", - "itemBucketSaltWater", - "itemBucketFreshWater", - "itemBucketWater", - "itemRock", - "itemReed", - "itemArrow", - "itemSaw", - "itemKnife", - "itemHammer", - "itemChisel", - "itemRubber", - "itemEssence", - "itemIlluminatedPanel", - "itemSkull", - "itemRawRubber", - "itemBacon", - "itemJetpackAccelerator", - "itemLazurite", - "itemIridium", - "itemTear", - "itemClaw", - "itemFertilizer", - "itemTar", - "itemSlimeball", - "itemCoke", - "itemBeeswax", - "itemBeeQueen", - "itemForcicium", - "itemForcillium", - "itemRoyalJelly", - "itemHoneydew", - "itemHoney", - "itemPollen", - "itemReedTypha", - "itemSulfuricAcid", - "itemPotash", - "itemCompressedCarbon", - "itemBitumen", - "itemBioFuel", - "itemCokeSugar", - "itemCokeCactus", - "itemCharcoalSugar", - "itemCharcoalCactus", - "itemSludge", - "itemEnrichedAlloy", - "itemQuicksilver", - "itemMercury", - "itemOsmium", - "itemUltimateCircuit", - "itemEnergizedStar", - "itemAntimatterMolecule", - "itemAntimatterGlob", - "itemCoal", - "itemBoat", - "itemHerbalMedicineCake", - "itemCakeSponge", - "itemFishandPumpkinCakeSponge", - "itemSoulCleaver", - "itemInstantCake", - "itemWhippingCream", - "itemGlisteningWhippingCream", - "itemCleaver", - "itemHerbalMedicineWhippingCream", - "itemStrangeWhippingCream", - "itemBlazeCleaver", - "itemBakedCakeSponge", - "itemMagmaCake", - "itemGlisteningCake", - "itemOgreCleaver", - "itemFishandPumpkinCake", - "itemMagmaWhippingCream", - "itemMultimeter", - "itemSuperconductor")); - private final Collection mIgnoredNames = new HashSet<>( - Arrays.asList( - "grubBee", - "chainLink", - "candyCane", - "bRedString", - "bVial", - "bFlask", - "anorthositeSmooth", - "migmatiteSmooth", - "slateSmooth", - "travertineSmooth", - "limestoneSmooth", - "orthogneissSmooth", - "marbleSmooth", - "honeyDrop", - "lumpClay", - "honeyEqualssugar", - "flourEqualswheat", - "bluestoneInsulated", - "blockWaterstone", - "blockSand", - "blockTorch", - "blockPumpkin", - "blockClothRock", - "blockStainedHardenedClay", - "blockQuartzPillar", - "blockQuartzChiselled", - "blockSpawner", - "blockCloth", - "mobHead", - "mobEgg", - "enderFlower", - "enderChest", - "clayHardened", - "dayGemMaterial", - "nightGemMaterial", - "snowLayer", - "bPlaceholder", - "hardenedClay", - "eternalLifeEssence", - "sandstone", - "wheatRice", - "transdimBlock", - "bambooBasket", - "lexicaBotania", - "livingwoodTwig", - "redstoneCrystal", - "pestleAndMortar", - "glowstone", - "whiteStone", - "stoneSlab", - "transdimBlock", - "clayBowl", - "clayPlate", - "ceramicBowl", - "ceramicPlate", - "ovenRack", - "clayCup", - "ceramicCup", - "batteryBox", - "transmutationStone", - "torchRedstoneActive", - "coal", - "charcoal", - "cloth", - "cobblestoneSlab", - "stoneBrickSlab", - "cobblestoneWall", - "stoneBrickWall", - "cobblestoneStair", - "stoneBrickStair", - "blockCloud", - "blockDirt", - "blockTyrian", - "blockCarpet", - "blockFft", - "blockLavastone", - "blockHolystone", - "blockConcrete", - "sunnariumPart", - "brSmallMachineCyaniteProcessor", - "meteoriteCoal", - "blockCobble", - "pressOreProcessor", - "crusherOreProcessor", - "grinderOreProcessor", - "blockRubber", - "blockHoney", - "blockHoneydew", - "blockPeat", - "blockRadioactive", - "blockSlime", - "blockCocoa", - "blockSugarCane", - "blockLeather", - "blockClayBrick", - "solarPanelHV", - "cableRedNet", - "stoneBowl", - "crafterWood", - "taintedSoil", - "brickXyEngineering", - "breederUranium", - "wireMill", - "chunkLazurite", - "aluminumNatural", - "aluminiumNatural", - "naturalAluminum", - "naturalAluminium", - "antimatterMilligram", - "antimatterGram", - "strangeMatter", - "coalGenerator", - "electricFurnace", - "unfinishedTank", - "valvePart", - "aquaRegia", - "leatherSeal", - "leatherSlimeSeal", - "hambone", - "slimeball", - "clay", - "enrichedUranium", - "camoPaste", - "antiBlock", - "burntQuartz", - "salmonRaw", - "blockHopper", - "blockEnderObsidian", - "blockIcestone", - "blockMagicWood", - "blockEnderCore", - "blockHeeEndium", - "oreHeeEndPowder", - "oreHeeStardust", - "oreHeeIgneousRock", - "oreHeeInstabilityOrb", - "crystalPureFluix", - "shardNether", - "gemFluorite", - "stickObsidian", - "caveCrystal", - "shardCrystal", - "dyeCrystal", - "shardFire", - "shardWater", - "shardAir", - "shardEarth", - "ingotRefinedIron", - "blockMarble", - "ingotUnstable", - "obsidian", - "dirt", - "gravel", - "grass", - "soulsand", - "paper", - "brick", - "chest")); - private final Collection mInvalidNames = new HashSet<>( - Arrays.asList( - "diamondShard", - "redstoneRoot", - "obsidianStick", - "bloodstoneOre", - "universalCable", - "bronzeTube", - "ironTube", - "netherTube", - "obbyTube", - "infiniteBattery", - "eliteBattery", - "advancedBattery", - "10kEUStore", - "blueDye", - "MonazitOre", - "quartzCrystal", - "whiteLuminiteCrystal", - "darkStoneIngot", - "invisiumIngot", - "demoniteOrb", - "enderGem", - "starconiumGem", - "osmoniumIngot", - "tapaziteGem", - "zectiumIngot", - "foolsRubyGem", - "rubyGem", - "meteoriteGem", - "adamiteShard", - "sapphireGem", - "copperIngot", - "ironStick", - "goldStick", - "diamondStick", - "reinforcedStick", - "draconicStick", - "emeraldStick", - "copperStick", - "tinStick", - "silverStick", - "bronzeStick", - "steelStick", - "leadStick", - "manyullynStick", - "arditeStick", - "cobaltStick", - "aluminiumStick", - "alumiteStick", - "oilsandsOre", - "copperWire", - "superconductorWire", - "sulfuricAcid", - "conveyorBelt", - "ironWire", - "aluminumWire", - "aluminiumWire", - "silverWire", - "tinWire", - "dustSiliconSmall", - "AluminumOre", - "plateHeavyT2", - "blockWool", - "alloyPlateEnergizedHardened", - "gasWood", - "alloyPlateEnergized", - "SilverOre", - "LeadOre", - "TinOre", - "CopperOre", - "silverOre", - "leadOre", - "tinOre", - "copperOre", - "bauxiteOre", - "HSLivingmetalIngot", - "oilMoving", - "oilStill", - "oilBucket", - "petroleumOre", - "dieselFuel", - "diamondNugget", - "planks", - "wood", - "stick", - "sticks", - "naquadah", - "obsidianRod", - "stoneRod", - "thaumiumRod", - "steelRod", - "netherrackRod", - "woodRod", - "ironRod", - "cactusRod", - "flintRod", - "copperRod", - "cobaltRod", - "alumiteRod", - "blueslimeRod", - "arditeRod", - "manyullynRod", - "bronzeRod", - "boneRod", - "slimeRod", - "redalloyBundled", - "bluestoneBundled", - "infusedteslatiteInsulated", - "redalloyInsulated", - "infusedteslatiteBundled")); - private final DateFormat mDateFormat = DateFormat.getInstance(); - public final BlockingQueue mBufferedPlayerActivity = new LinkedBlockingQueue<>(); - public final GT_BlockMap mCTMBlockCache = new GT_BlockMap<>(); - public boolean mDisableVanillaOres = true; - public boolean mAllowSmallBoilerAutomation = false; - public boolean mCraftingUnification = true; - public boolean mInventoryUnification = true; - public boolean mIncreaseDungeonLoot = true; - public boolean mAxeWhenAdventure = true; - public boolean mSurvivalIntoAdventure = false; - public boolean mNerfedWoodPlank = true; - public boolean mNerfedVanillaTools = true; - public boolean mHungerEffect = true; - public boolean mIgnoreTcon = true; - public boolean mAchievements = true; - private boolean isFirstServerWorldTick = true; - private boolean isFirstWorldTick = true; - private boolean mOreDictActivated = false; - public boolean mChangeHarvestLevels = false; - public boolean mGTBees = true; - public boolean mHideUnusedOres = true; - public boolean mPollution = true; - public boolean mExplosionItemDrop = false; - public int mMaxEqualEntitiesAtOneSpot = 3; - public int mFlintChance = 30; - public int mItemDespawnTime = 6000; - public int mUpgradeCount = 4; - public int[] mHarvestLevel = new int[1000]; - public int mGraniteHavestLevel = 3; - public int mMaxHarvestLevel = 7; - public double replicatorExponent = 1.2D; - public int mPollutionSmogLimit = 550000; - public int mPollutionPoisonLimit = 750000; - public int mPollutionVegetationLimit = 1000000; - public int mPollutionSourRainLimit = 2000000; - public int mPollutionOnExplosion = 100000; - public int mPollutionPrimitveBlastFurnacePerSecond = 200; - public int mPollutionEBFPerSecond = 400; - public int mPollutionCharcoalPitPerSecond = 100; - public int mPollutionLargeCombustionEnginePerSecond = 480; - public int mPollutionExtremeCombustionEnginePerSecond = 3840; - public int mPollutionImplosionCompressorPerSecond = 10000; - public int mPollutionLargeBronzeBoilerPerSecond = 1000; - public int mPollutionLargeSteelBoilerPerSecond = 2000; - public int mPollutionLargeTitaniumBoilerPerSecond = 3000; - public int mPollutionLargeTungstenSteelBoilerPerSecond = 4000; - public double mPollutionReleasedByThrottle = 1.0 / 24.0; // divided by 24 because 24 circuit conf - public int mPollutionLargeGasTurbinePerSecond = 300; - public int mPollutionMultiSmelterPerSecond = 400; - public int mPollutionPyrolyseOvenPerSecond = 300; - public int mPollutionSmallCoalBoilerPerSecond = 20; - public int mPollutionHighPressureLavaBoilerPerSecond = 20; - public int mPollutionHighPressureCoalBoilerPerSecond = 30; - public int mPollutionBaseDieselGeneratorPerSecond = 200; - public double[] mPollutionDieselGeneratorReleasedByTier = new double[] { 0.1, 1.0, 0.9, 0.8 }; - public int mPollutionBaseGasTurbinePerSecond = 200; - public double[] mPollutionGasTurbineReleasedByTier = new double[] { 0.1, 1.0, 0.9, 0.8, 0.7, 0.6 }; - public final GT_UO_DimensionList mUndergroundOil = new GT_UO_DimensionList(); - public boolean enableUndergroundGravelGen = true; - public boolean enableUndergroundDirtGen = true; - public int mTicksUntilNextCraftSound = 0; - private World mUniverse = null; - public boolean mEnableAllMaterials = false; - public boolean mEnableCleanroom = true; - public boolean mLowGravProcessing = false; - public boolean mCropNeedBlock = true; - public boolean mAMHInteraction = true; - public boolean mForceFreeFace = true; - public boolean mMixedOreOnlyYieldsTwoThirdsOfPureOre = false; - public boolean mRichOreYieldMultiplier = true; - public boolean mNetherOreYieldMultiplier = true; - public boolean mEndOreYieldMultiplier = true; - public boolean enableBlackGraniteOres = true; - public boolean enableRedGraniteOres = true; - public boolean enableMarbleOres = true; - public boolean enableBasaltOres = true; - public boolean gt6Pipe = true; - public boolean gt6Cable = true; - public boolean ic2EnergySourceCompat = true; - public boolean costlyCableConnection = false; - public boolean crashOnNullRecipeInput = false; - - public enum OreDropSystem { - Block, - PerDimBlock, - UnifiedBlock, - FortuneItem, - Item - } - - public OreDropSystem oreDropSystem = OreDropSystem.FortuneItem; - - /** - * This enables ambient-occlusion smooth lighting on tiles - */ - public boolean mRenderTileAmbientOcclusion = true; - - /** - * This enables rendering of glowing textures - */ - public boolean mRenderGlowTextures = true; - - /** - * Render flipped textures - */ - public boolean mRenderFlippedMachinesFlipped = true; - - /** - * This enables indicators on input/output hatches - */ - public boolean mRenderIndicatorsOnHatch = true; - - /** - * This enables the rendering of dirt particles if pollution is enabled too - */ - public boolean mRenderDirtParticles = true; - - /** - * This enables the rendering of the pollution fog if pollution is enabled too - */ - public boolean mRenderPollutionFog = true; - - /** - * This enables BaseMetaTileEntity block updates handled by BlockUpdateHandler - */ - public boolean mUseBlockUpdateHandler = false; - - /** - * This makes cover tabs visible on GregTech machines - */ - public boolean mCoverTabsVisible = true; - - /** - * This controls whether cover tabs display on the left (default) or right side of the UI - */ - public boolean mCoverTabsFlipped = false; - - /** - * How verbose should tooltips be? 0: disabled, 1: one-line, 2: normal, 3+: extended - */ - public int mTooltipVerbosity = 2; - - /** - * How verbose should tooltips be when LSHIFT is held? 0: disabled, 1: one-line, 2: normal, 3+: extended - */ - public int mTooltipShiftVerbosity = 3; - - /** - * Which style to use for title tab on machine GUI? 0: text tab split-dark, 1: text tab unified, 2: item icon tab - */ - public int mTitleTabStyle = 0; - - /** - * Whether to show seconds or ticks on NEI - */ - public boolean mNEIRecipeSecondMode = true; - - /** - * This enables "Recipe by" display on NEI - */ - public boolean mNEIRecipeOwner = false; - - /** - * This enables showing stack traces where the recipe was added. Reboot needed - */ - public boolean mNEIRecipeOwnerStackTrace = false; - - /** - * This enables showing original voltage when overclocked - */ - public boolean mNEIOriginalVoltage = false; - - /** - * This enables the green->red durability for an item's damage value - */ - public boolean mRenderItemDurabilityBar = true; - - /** - * This enables the blue charge bar for an electric item's charge - */ - public boolean mRenderItemChargeBar = true; - - public final Map recipeCategorySettings = new HashMap<>(); - - /** - * This enables showing voltage tier of transformer for Waila, instead of raw voltage number - */ - public boolean mWailaTransformerVoltageTier = true; - - /** - * This enables showing the cpu load in nanoseconds via waila. - */ - public boolean wailaAverageNS = false; - - public static final int GUI_ID_COVER_SIDE_BASE = 10; // Takes GUI ID 10 - 15 - - public static Map oreDictBurnTimes = new HashMap<>(); - - // Locking - public static ReentrantLock TICK_LOCK = new ReentrantLock(); - - private final ConcurrentMap mClientPrefernces = new ConcurrentHashMap<>(); - - static { - oreDictBurnTimes.put("dustTinyWood", 11); - oreDictBurnTimes.put("dustTinySodium", 44); - oreDictBurnTimes.put("dustSmallWood", 25); - oreDictBurnTimes.put("dustSmallSodium", 100); - oreDictBurnTimes.put("dustWood", 100); - oreDictBurnTimes.put("dustTinyCoal", 177); - oreDictBurnTimes.put("dustTinyCharcoal", 177); - oreDictBurnTimes.put("dustTinyLignite", 166); - oreDictBurnTimes.put("plateWood", 300); - oreDictBurnTimes.put("dustSmallLignite", 375); - oreDictBurnTimes.put("dustSodium", 400); - oreDictBurnTimes.put("dustSmallCoal", 400); - oreDictBurnTimes.put("dustSmallCharcoal", 400); - oreDictBurnTimes.put("dustTinyLithium", 888); - oreDictBurnTimes.put("dustTinyCaesium", 888); - oreDictBurnTimes.put("gemLignite", 1200); - oreDictBurnTimes.put("crushedLignite", 1200); - oreDictBurnTimes.put("dustImpureLignite", 1200); - oreDictBurnTimes.put("dustLignite", 1200); - oreDictBurnTimes.put("dustSulfur", 1600); - oreDictBurnTimes.put("gemCoal", 1600); - oreDictBurnTimes.put("crushedCoal", 1600); - oreDictBurnTimes.put("dustImpureCoal", 1600); - oreDictBurnTimes.put("dustCoal", 1600); - oreDictBurnTimes.put("gemCharcoal", 1600); - oreDictBurnTimes.put("crushedCharcoal", 1600); - oreDictBurnTimes.put("dustImpureCharcoal", 1600); - oreDictBurnTimes.put("dustCharcoal", 1600); - oreDictBurnTimes.put("dustSmallLithium", 2000); - oreDictBurnTimes.put("dustSmallCaesium", 2000); - oreDictBurnTimes.put("gemSodium", 4000); - oreDictBurnTimes.put("crushedSodium", 4000); - oreDictBurnTimes.put("dustImpureSodium", 4000); - oreDictBurnTimes.put("gemLithium", 6000); - oreDictBurnTimes.put("crushedLithium", 6000); - oreDictBurnTimes.put("dustImpureLithium", 6000); - oreDictBurnTimes.put("dustLithium", 6000); - oreDictBurnTimes.put("gemCaesium", 6000); - oreDictBurnTimes.put("crushedCaesium", 6000); - oreDictBurnTimes.put("dustImpureCaesium", 6000); - oreDictBurnTimes.put("dustCaesium", 6000); - oreDictBurnTimes.put("blockLignite", 12000); - oreDictBurnTimes.put("blockCharcoal", 16000); - oreDictBurnTimes.put("gemDiamond", 102400); - oreDictBurnTimes.put("blockDiamond", 1024000); - oreDictBurnTimes.put("crushedDiamond", 102400); - oreDictBurnTimes.put("dustImpureDiamond", 102400); - oreDictBurnTimes.put("dustDiamond", 102400); - oreDictBurnTimes.put("dustSmallDiamond", 25600); - oreDictBurnTimes.put("dustTinyDiamond", 11378); - } - - public GT_Proxy() { - GameRegistry.registerFuelHandler(this); - MinecraftForge.EVENT_BUS.register(this); - MinecraftForge.ORE_GEN_BUS.register(this); - FMLCommonHandler.instance() - .bus() - .register(this); - GregTech_API.sThaumcraftCompat = (IThaumcraftCompat) GT_Utility - .callConstructor("gregtech.common.GT_ThaumcraftCompat", 0, null, GT_Values.D1, new Object[0]); - for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry - .getRegisteredFluidContainerData()) { - onFluidContainerRegistration(new FluidContainerRegistry.FluidContainerRegisterEvent(tData)); - } - try { - for (String tOreName : OreDictionary.getOreNames()) { - ItemStack tOreStack; - for (Iterator i$ = OreDictionary.getOres(tOreName) - .iterator(); i$.hasNext(); registerOre(new OreDictionary.OreRegisterEvent(tOreName, tOreStack))) { - tOreStack = i$.next(); - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - public void onPreLoad() { - GT_Log.out.println("GT_Mod: Preload-Phase started!"); - GT_Log.ore.println("GT_Mod: Preload-Phase started!"); - - GregTech_API.sPreloadStarted = true; - this.mIgnoreTcon = ConfigGeneral.ignoreTinkerConstruct; - this.replicatorExponent = ConfigGeneral.replicatorExponent; - for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry - .getRegisteredFluidContainerData()) { - if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { - tData.fluid.amount = 0; - break; - } - } - GT_Log.out.println("GT_Mod: Getting required Items of other Mods."); - - ItemList.RC_ShuntingWire.set(GT_ModHandler.getModItem(Railcraft.ID, "machine.delta", 1L, 0)); - ItemList.RC_ShuntingWireFrame.set(GT_ModHandler.getModItem(Railcraft.ID, "frame", 1L, 0)); - ItemList.RC_Rail_Standard.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 0)); - ItemList.RC_Rail_Adv.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 1)); - ItemList.RC_Rail_Wooden.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 2)); - ItemList.RC_Rail_HS.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 3)); - ItemList.RC_Rail_Reinforced.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 4)); - ItemList.RC_Rail_Electric.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 5)); - ItemList.RC_Tie_Wood.set(GT_ModHandler.getModItem(Railcraft.ID, "part.tie", 1L, 0)); - ItemList.RC_Tie_Stone.set(GT_ModHandler.getModItem(Railcraft.ID, "part.tie", 1L, 1)); - ItemList.RC_Bed_Wood.set(GT_ModHandler.getModItem(Railcraft.ID, "part.railbed", 1L, 0)); - ItemList.RC_Bed_Stone.set(GT_ModHandler.getModItem(Railcraft.ID, "part.railbed", 1L, 1)); - ItemList.RC_Rebar.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rebar", 1L)); - ItemList.TC_Thaumometer.set(GT_ModHandler.getModItem(Thaumcraft.ID, "ItemThaumometer", 1L, 0)); - ItemList.Tool_Sword_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.sword", 1L)); - ItemList.Tool_Pickaxe_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.pickaxe", 1L)); - ItemList.Tool_Shovel_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.shovel", 1L)); - ItemList.Tool_Axe_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.axe", 1L)); - ItemList.Tool_Hoe_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.hoe", 1L)); - - ItemList.TF_LiveRoot.set(GT_ModHandler.getModItem(TwilightForest.ID, "item.liveRoot", 1L, 0)); - ItemList.TF_Vial_FieryBlood.set(GT_ModHandler.getModItem(TwilightForest.ID, "item.fieryBlood", 1L)); - ItemList.TF_Vial_FieryTears.set(GT_ModHandler.getModItem(TwilightForest.ID, "item.fieryTears", 1L)); - - ItemList.FR_Lemon.set(GT_ModHandler.getModItem(Forestry.ID, "fruits", 1L, 3)); - ItemList.FR_Mulch.set(GT_ModHandler.getModItem(Forestry.ID, "mulch", 1L)); - ItemList.FR_Fertilizer.set(GT_ModHandler.getModItem(Forestry.ID, "fertilizerCompound", 1L)); - ItemList.FR_Compost.set(GT_ModHandler.getModItem(Forestry.ID, "fertilizerBio", 1L)); - ItemList.FR_Silk.set(GT_ModHandler.getModItem(Forestry.ID, "craftingMaterial", 1L, 2)); - ItemList.FR_Wax.set(GT_ModHandler.getModItem(Forestry.ID, "beeswax", 1L)); - ItemList.FR_WaxCapsule.set(GT_ModHandler.getModItem(Forestry.ID, "waxCapsule", 1L)); - ItemList.FR_RefractoryWax.set(GT_ModHandler.getModItem(Forestry.ID, "refractoryWax", 1L)); - ItemList.FR_RefractoryCapsule.set(GT_ModHandler.getModItem(Forestry.ID, "refractoryEmpty", 1L)); - ItemList.FR_Bee_Drone.set(GT_ModHandler.getModItem(Forestry.ID, "beeDroneGE", 1L)); - ItemList.FR_Bee_Princess.set(GT_ModHandler.getModItem(Forestry.ID, "beePrincessGE", 1L)); - ItemList.FR_Bee_Queen.set(GT_ModHandler.getModItem(Forestry.ID, "beeQueenGE", 1L)); - ItemList.FR_Tree_Sapling.set( - GT_ModHandler - .getModItem(Forestry.ID, "sapling", 1L, GT_ModHandler.getModItem(Forestry.ID, "saplingGE", 1L))); - ItemList.FR_Butterfly.set(GT_ModHandler.getModItem(Forestry.ID, "butterflyGE", 1L)); - ItemList.FR_Larvae.set(GT_ModHandler.getModItem(Forestry.ID, "beeLarvaeGE", 1L)); - ItemList.FR_Serum.set(GT_ModHandler.getModItem(Forestry.ID, "serumGE", 1L)); - ItemList.FR_Caterpillar.set(GT_ModHandler.getModItem(Forestry.ID, "caterpillarGE", 1L)); - ItemList.FR_PollenFertile.set(GT_ModHandler.getModItem(Forestry.ID, "pollenFertile", 1L)); - ItemList.FR_Stick.set(GT_ModHandler.getModItem(Forestry.ID, "oakStick", 1L)); - ItemList.FR_Casing_Impregnated.set(GT_ModHandler.getModItem(Forestry.ID, "impregnatedCasing", 1L)); - ItemList.FR_Casing_Sturdy.set(GT_ModHandler.getModItem(Forestry.ID, "sturdyMachine", 1L)); - ItemList.FR_Casing_Hardened.set(GT_ModHandler.getModItem(Forestry.ID, "hardenedMachine", 1L)); - - ItemList.Bottle_Empty.set(new ItemStack(Items.glass_bottle, 1)); - - ItemList.Cell_Universal_Fluid.set(GT_ModHandler.getIC2Item("FluidCell", 1L)); - ItemList.Cell_Empty.set( - GT_ModHandler.getIC2Item( - "cell", - 1L, - GT_ModHandler.getIC2Item("cellEmpty", 1L, GT_ModHandler.getIC2Item("emptyCell", 1L)))); - ItemList.Cell_Water.set(GT_ModHandler.getIC2Item("waterCell", 1L, GT_ModHandler.getIC2Item("cellWater", 1L))); - ItemList.Cell_Lava.set(GT_ModHandler.getIC2Item("lavaCell", 1L, GT_ModHandler.getIC2Item("cellLava", 1L))); - ItemList.Cell_Air.set( - GT_ModHandler.getIC2Item( - "airCell", - 1L, - GT_ModHandler.getIC2Item("cellAir", 1L, GT_ModHandler.getIC2Item("cellOxygen", 1L)))); - - ItemList.IC2_Item_Casing_Iron.set(GT_ModHandler.getIC2Item("casingiron", 1L)); - ItemList.IC2_Item_Casing_Gold.set(GT_ModHandler.getIC2Item("casinggold", 1L)); - ItemList.IC2_Item_Casing_Bronze.set(GT_ModHandler.getIC2Item("casingbronze", 1L)); - ItemList.IC2_Item_Casing_Copper.set(GT_ModHandler.getIC2Item("casingcopper", 1L)); - ItemList.IC2_Item_Casing_Tin.set(GT_ModHandler.getIC2Item("casingtin", 1L)); - ItemList.IC2_Item_Casing_Lead.set(GT_ModHandler.getIC2Item("casinglead", 1L)); - ItemList.IC2_Item_Casing_Steel.set(GT_ModHandler.getIC2Item("casingadviron", 1L)); - ItemList.IC2_Spray_WeedEx.set(GT_ModHandler.getIC2Item("weedEx", 1L)); - ItemList.IC2_Mixed_Metal_Ingot.set(GT_ModHandler.getIC2Item("mixedMetalIngot", 1L)); - ItemList.IC2_Fertilizer.set(GT_ModHandler.getIC2Item("fertilizer", 1L)); - ItemList.IC2_CoffeeBeans.set(GT_ModHandler.getIC2Item("coffeeBeans", 1L)); - ItemList.IC2_CoffeePowder.set(GT_ModHandler.getIC2Item("coffeePowder", 1L)); - ItemList.IC2_Hops.set(GT_ModHandler.getIC2Item("hops", 1L)); - ItemList.IC2_Resin.set(GT_ModHandler.getIC2Item("resin", 1L)); - ItemList.IC2_Plantball.set(GT_ModHandler.getIC2Item("plantBall", 1L)); - ItemList.IC2_PlantballCompressed - .set(GT_ModHandler.getIC2Item("compressedPlantBall", 1L, ItemList.IC2_Plantball.get(1L))); - ItemList.IC2_Crop_Seeds.set(GT_ModHandler.getIC2Item("cropSeed", 1L)); - ItemList.IC2_Grin_Powder.set(GT_ModHandler.getIC2Item("grinPowder", 1L)); - ItemList.IC2_Energium_Dust.set(GT_ModHandler.getIC2Item("energiumDust", 1L)); - ItemList.IC2_Scrap.set(GT_ModHandler.getIC2Item("scrap", 1L)); - ItemList.IC2_Scrapbox.set(GT_ModHandler.getIC2Item("scrapBox", 1L)); - ItemList.IC2_Fuel_Rod_Empty.set(GT_ModHandler.getIC2Item("fuelRod", 1L)); - ItemList.IC2_Food_Can_Empty.set(GT_ModHandler.getIC2Item("tinCan", 1L)); - ItemList.IC2_Food_Can_Filled.set(GT_ModHandler.getIC2Item("filledTinCan", 1L, 0)); - ItemList.IC2_Food_Can_Spoiled.set(GT_ModHandler.getIC2Item("filledTinCan", 1L, 1)); - ItemList.IC2_Industrial_Diamond - .set(GT_ModHandler.getIC2Item("industrialDiamond", 1L, new ItemStack(Items.diamond, 1))); - ItemList.IC2_Compressed_Coal_Ball.set(GT_ModHandler.getIC2Item("compressedCoalBall", 1L)); - ItemList.IC2_Compressed_Coal_Chunk.set(GT_ModHandler.getIC2Item("coalChunk", 1L)); - ItemList.IC2_ShaftIron.set(GT_ModHandler.getIC2Item("ironshaft", 1L)); - ItemList.IC2_ShaftSteel.set(GT_ModHandler.getIC2Item("steelshaft", 1L)); - - ItemList.IC2_SuBattery.set(GT_ModHandler.getIC2Item("suBattery", 1L)); - ItemList.IC2_ReBattery.set(GT_ModHandler.getIC2Item("reBattery", 1L)); - ItemList.IC2_AdvBattery.set(GT_ModHandler.getIC2Item("advBattery", 1L)); - ItemList.IC2_EnergyCrystal.set(GT_ModHandler.getIC2Item("energyCrystal", 1L)); - ItemList.IC2_LapotronCrystal.set(GT_ModHandler.getIC2Item("lapotronCrystal", 1L)); - - ItemList.Tool_Sword_Bronze.set(GT_ModHandler.getIC2Item("bronzeSword", 1L)); - ItemList.Tool_Pickaxe_Bronze.set(GT_ModHandler.getIC2Item("bronzePickaxe", 1L)); - ItemList.Tool_Shovel_Bronze.set(GT_ModHandler.getIC2Item("bronzeShovel", 1L)); - ItemList.Tool_Axe_Bronze.set(GT_ModHandler.getIC2Item("bronzeAxe", 1L)); - ItemList.Tool_Hoe_Bronze.set(GT_ModHandler.getIC2Item("bronzeHoe", 1L)); - ItemList.IC2_ForgeHammer.set(GT_ModHandler.getIC2Item("ForgeHammer", 1L)); - ItemList.IC2_WireCutter.set(GT_ModHandler.getIC2Item("cutter", 1L)); - - ItemList.Credit_Iron.set(GT_ModHandler.getIC2Item("coin", 1L)); - - ItemList.Circuit_Basic.set(GT_ModHandler.getIC2Item("electronicCircuit", 1L)); - ItemList.Circuit_Advanced.set(GT_ModHandler.getIC2Item("advancedCircuit", 1L)); - - ItemList.Upgrade_Overclocker.set(GT_ModHandler.getIC2Item("overclockerUpgrade", 1L)); - ItemList.Upgrade_Battery.set(GT_ModHandler.getIC2Item("energyStorageUpgrade", 1L)); - - ItemList.Dye_Bonemeal.set(new ItemStack(Items.dye, 1, 15)); - ItemList.Dye_SquidInk.set(new ItemStack(Items.dye, 1, 0)); - ItemList.Dye_Cocoa.set(new ItemStack(Items.dye, 1, 3)); - - ItemList.Book_Written_00.set(new ItemStack(Items.written_book, 1, 0)); - - ItemList.Food_Baked_Bread.set(new ItemStack(Items.bread, 1, 0)); - ItemList.Food_Raw_Potato.set(new ItemStack(Items.potato, 1, 0)); - ItemList.Food_Baked_Potato.set(new ItemStack(Items.baked_potato, 1, 0)); - ItemList.Food_Poisonous_Potato.set(new ItemStack(Items.poisonous_potato, 1, 0)); - - OrePrefixes.bottle.mContainerItem = ItemList.Bottle_Empty.get(1L); - OrePrefixes.bucket.mContainerItem = new ItemStack(Items.bucket, 1); - OrePrefixes.cellPlasma.mContainerItem = ItemList.Cell_Empty.get(1L); - OrePrefixes.cellMolten.mContainerItem = ItemList.Cell_Empty.get(1L); - OrePrefixes.cell.mContainerItem = ItemList.Cell_Empty.get(1L); - - GT_ModHandler.sNonReplaceableItems.add(new ItemStack(Items.bow, 1, 32767)); - GT_ModHandler.sNonReplaceableItems.add(new ItemStack(Items.fishing_rod, 1, 32767)); - GT_ModHandler.sNonReplaceableItems.add(ItemList.IC2_ForgeHammer.getWithDamage(1L, 32767L)); - GT_ModHandler.sNonReplaceableItems.add(ItemList.IC2_WireCutter.getWithDamage(1L, 32767L)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("painter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("blackPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("redPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("greenPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("brownPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("bluePainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("purplePainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("cyanPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("lightGreyPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("darkGreyPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("pinkPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("limePainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("yellowPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("cloudPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("magentaPainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("orangePainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("whitePainter", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("cfPack", 1L, 32767)); - // GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("jetpack", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("treetap", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("weedEx", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("staticBoots", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("compositeArmor", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatHelmet", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatChestplate", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatLeggings", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatBoots", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "part.turbine.disk", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "part.turbine.blade", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "part.turbine.rotor", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "borehead.diamond", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "borehead.steel", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "borehead.iron", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.plateNaga", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(TwilightForest.ID, "item.legsNaga", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticHelm", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticPlate", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticLegs", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticBoots", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiHelm", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiPlate", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiLegs", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiBoots", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ToolCertusQuartzCuttingKnife", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ToolNetherQuartzCuttingKnife", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristHelmet", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristChest", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristLegs", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristBoots", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "frameUntreated", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "frameImpregnated", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "frameProven", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "waxCast", 1L, 32767)); - GT_ModHandler.sNonReplaceableItems - .add(GT_ModHandler.getModItem(GalacticraftCore.ID, "item.sensorGlasses", 1L, 32767)); - - RecipeSorter.register( - "gregtech:shaped", - GT_Shaped_Recipe.class, - RecipeSorter.Category.SHAPED, - "after:minecraft:shaped before:minecraft:shapeless"); - RecipeSorter.register( - "gregtech:shapeless", - GT_Shapeless_Recipe.class, - RecipeSorter.Category.SHAPELESS, - "after:minecraft:shapeless"); - - // Register chunk manager with Forge - GT_ChunkManager.init(); - } - - public void onLoad() { - GT_Log.out.println("GT_Mod: Beginning Load-Phase."); - GT_Log.ore.println("GT_Mod: Beginning Load-Phase."); - - // Clay buckets, which don't get registered until Iguana Tweaks pre-init - if (IguanaTweaksTinkerConstruct.isModLoaded()) { - OrePrefixes.bucketClay.mContainerItem = GT_ModHandler - .getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketFired", 1L, 0); - GT_OreDictUnificator.set( - OrePrefixes.bucketClay, - Materials.Empty, - GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketFired", 1L, 0)); - GT_OreDictUnificator.set( - OrePrefixes.bucketClay, - Materials.Water, - GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketWater", 1L, 0)); - GT_OreDictUnificator.set( - OrePrefixes.bucketClay, - Materials.Lava, - GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketLava", 1L, 0)); - GT_OreDictUnificator.set( - OrePrefixes.bucketClay, - Materials.Milk, - GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketMilk", 1L, 0)); - - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.Milk.getFluid(1000L), - GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Milk, 1L), - GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Empty, 1L))); - } - - if (!GT_Mod.gregtechproxy.enableUndergroundGravelGen) - PREVENTED_ORES.add(OreGenEvent.GenerateMinable.EventType.GRAVEL); - if (!GT_Mod.gregtechproxy.enableUndergroundDirtGen) - PREVENTED_ORES.add(OreGenEvent.GenerateMinable.EventType.DIRT); - - MinecraftForge.EVENT_BUS.register(new SpaceProjectWorldSavedData()); - MinecraftForge.EVENT_BUS.register(new GlobalEnergyWorldSavedData("")); - MinecraftForge.EVENT_BUS.register(new GT_Worldgenerator.OregenPatternSavedData("")); - MinecraftForge.EVENT_BUS.register(new GlobalMetricsCoverDatabase()); - FMLCommonHandler.instance() - .bus() - .register(new GT_Worldgenerator.OregenPatternSavedData("")); - - // IC2 Hazmat - addFullHazmatToIC2Item("hazmatHelmet"); - addFullHazmatToIC2Item("hazmatChestplate"); - addFullHazmatToIC2Item("hazmatLeggings"); - addFullHazmatToIC2Item("hazmatBoots"); - addFullHazmatToIC2Item("nanoHelmet"); - addFullHazmatToIC2Item("nanoBoots"); - addFullHazmatToIC2Item("nanoLeggings"); - addFullHazmatToIC2Item("nanoBodyarmor"); - addFullHazmatToIC2Item("quantumHelmet"); - addFullHazmatToIC2Item("quantumBodyarmor"); - addFullHazmatToIC2Item("quantumLeggings"); - addFullHazmatToIC2Item("quantumBoots"); - - // GT++ Hazmat - addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatHelmetEx", 1); - addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatChestplateEx", 1); - addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatLeggingsEx", 1); - addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorRubBootsEx", 1); - - // GraviSuite Hazmat - addFullHazmatToGeneralItem(GraviSuite.ID, "graviChestPlate", 1L); - addFullHazmatToGeneralItem(GraviSuite.ID, "advNanoChestPlate", 1L); - - // EMT Hazmat - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "itemArmorQuantumChestplate", 1L); - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanoBootsTraveller", 1L); - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanosuitGogglesRevealing", 1L); - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumBootsTraveller", 1L); - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumGogglesRevealing", 1L); - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "SolarHelmetRevealing", 1L); - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanosuitWing", 1L); - addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumWing", 1L); - - // Thaumic Boots Hazmat - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumVoid", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumMeteor", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumComet", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoVoid", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoMeteor", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoComet", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemElectricVoid", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemVoidMeteor", 1L); - addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemVoidComet", 1L); - - // DraconicEvolution Hazmat - addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicBoots", 1L, 0); - addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicHelm", 1L, 0); - addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicLeggs", 1L, 0); - addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicChest", 1L, 0); - addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernBoots", 1L, 0); - addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernHelm", 1L, 0); - addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernLeggs", 1L, 0); - addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernChest", 1L, 0); - - // AdvancedSolarPanel - addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "advanced_solar_helmet", 1L); - addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "hybrid_solar_helmet", 1L); - addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "ultimate_solar_helmet", 1L); - - // TaintedMagic Hazmat - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidwalkerBoots", 1L); - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressHelmet", 1L); - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressChestplate", 1L); - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressLeggings", 1L); - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressHelmet", 1L); - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressChestplate", 1L); - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressLeggings", 1L); - addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidmetalGoggles", 1L); - - // WitchingGadgets Hazmat - addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialHelm", 1L); - addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialChest", 1L); - addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialLegs", 1L); - addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialBoots", 1L); - - // ThaumicTinkerer Hazmat - addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothChestGem", 1L); - addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothBootsGem", 1L); - addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothHelmGem", 1L); - addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothLegsGem", 1L); - - // GalaxySpace Hazmat - addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_helmet", 1L); - addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_helmetglasses", 1L); - addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_plate", 1L); - addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_jetplate", 1L); - addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_leg", 1L); - addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_boots", 1L); - addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_gravityboots", 1L); - - // Extra Hazmat - GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_helmet, 1, W)); - GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_chestplate, 1, W)); - GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_leggings, 1, W)); - GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_boots, 1, W)); - - // Infinity Hazmat - addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Helm", 1L); - addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Chest", 1L); - addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Pants", 1L); - addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Shoes", 1L); - - // EnderIO Hazmat - addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_helmet", 1L); - addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_chestplate", 1L); - addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_leggings", 1L); - addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_boots", 1L); - addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_helmet", 1L); - addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_chestplate", 1L); - addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_leggings", 1L); - addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_boots", 1L); - - GregTech_API.sLoadStarted = true; - for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry - .getRegisteredFluidContainerData()) { - if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { - tData.fluid.amount = 0; - break; - } - } - GT_LanguageManager.writePlaceholderStrings(); - } - - public static long tBits = GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED - | GT_ModHandler.RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL - | GT_ModHandler.RecipeBits.NOT_REMOVABLE; - - public void onPostLoad() { - GT_Log.out.println("GT_Mod: Beginning PostLoad-Phase."); - GT_Log.ore.println("GT_Mod: Beginning PostLoad-Phase."); - if (GT_Log.pal != null) { - final Thread playerActivityLogger = new Thread(new GT_PlayerActivityLogger()); - playerActivityLogger.setDaemon(true); - playerActivityLogger.setName("GT5U Player activity logger"); - playerActivityLogger.start(); - } - GregTech_API.sPostloadStarted = true; - - // This needs to happen late enough that all of the fluids we need have been registered. - // onLoad() seems to be too early, as the New Horizons Core Mod registers some fluids in post-load. - GT_MetaGenerated_Item_98.init(); - - GT_OreDictUnificator.addItemData(new ItemStack(Items.iron_door, 1), new ItemData(Materials.Iron, 21772800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.wooden_door, 1, 32767), new ItemData(Materials.Wood, 21772800L)); - for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry - .getRegisteredFluidContainerData()) { - if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { - tData.fluid.amount = 0; - break; - } - } - GT_Log.out.println("GT_Mod: Adding Configs specific for MetaTileEntities"); - try { - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - if (GregTech_API.METATILEENTITIES[i] != null) { - GregTech_API.METATILEENTITIES[i].onConfigLoad(); - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - GT_Log.out.println("GT_Mod: Adding Tool Usage Crafting Recipes for OreDict Items."); - for (Materials aMaterial : Materials.values()) { - if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)) { - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.crushedCentrifuged.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.crystalline.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.crystal.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.crushedPurified.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.cleanGravel.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.reduced.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.clump.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.shard.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.crushed.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L), - tBits, - new Object[] { "h", "X", 'X', OrePrefixes.dirtyGravel.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 4L), - tBits, - new Object[] { " X ", 'X', OrePrefixes.dust.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 9L), - tBits, - new Object[] { "X ", 'X', OrePrefixes.dust.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L), - tBits, - new Object[] { "XX", "XX", 'X', OrePrefixes.dustSmall.get(aMaterial) }); - GT_ModHandler.addCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L), - tBits, - new Object[] { "XXX", "XXX", "XXX", 'X', OrePrefixes.dustTiny.get(aMaterial) }); - } - } - } - - public void onLoadComplete() {} - - public void onServerAboutToStart() { - dimensionWisePollution.clear(); // !!! IMPORTANT for map switching... - GT_ChunkAssociatedData.clearAll(); - } - - public void onServerStarting() { - GT_Log.out.println("GT_Mod: ServerStarting-Phase started!"); - GT_Log.ore.println("GT_Mod: ServerStarting-Phase started!"); - - GT_MusicSystem.ServerSystem.reset(); - - this.mUniverse = null; - this.isFirstServerWorldTick = true; - for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry - .getRegisteredFluidContainerData()) { - if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) { - tData.fluid.amount = 0; - break; - } - } - try { - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - if (GregTech_API.METATILEENTITIES[i] != null) { - GregTech_API.METATILEENTITIES[i].onServerStart(); - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - public void onServerStarted() { - GregTech_API.sWirelessRedstone.clear(); - GT_MetaTileEntity_DroneCentre.getCentreMap() - .clear(); - GT_Log.out.println( - "GT_Mod: Cleaning up all OreDict Crafting Recipes, which have an empty List in them, since they are never meeting any Condition."); - List tList = CraftingManager.getInstance() - .getRecipeList(); - for (int i = 0; i < tList.size(); i++) { - if ((tList.get(i) instanceof ShapedOreRecipe)) { - for (Object tObject : ((ShapedOreRecipe) tList.get(i)).getInput()) { - if (((tObject instanceof List)) && (((List) tObject).isEmpty())) { - tList.remove(i--); - break; - } - } - } else if ((tList.get(i) instanceof ShapelessOreRecipe)) { - for (Object tObject : ((ShapelessOreRecipe) tList.get(i)).getInput()) { - if (((tObject instanceof List)) && (((List) tObject).isEmpty())) { - tList.remove(i--); - break; - } - } - } - } - } - - public void onServerStopping() { - GT_MusicSystem.ServerSystem.reset(); - File tSaveDirectory = getSaveDirectory(); - GregTech_API.sWirelessRedstone.clear(); - if (tSaveDirectory != null) { - try { - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - if (GregTech_API.METATILEENTITIES[i] != null) { - GregTech_API.METATILEENTITIES[i].onWorldSave(tSaveDirectory); - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - this.mUniverse = null; - // GT_ChunkAssociatedData.saveAll(); todo: figure out if this is needed - - } - - @SubscribeEvent - public void onClientConnectedToServerEvent(FMLNetworkEvent.ClientConnectedToServerEvent aEvent) {} - - /** - * Tells {@link gregtech.nei.GT_NEI_DefaultHandler} to reload recipes. - */ - public void reloadNEICache() {} - - /** - * Logging in to server or {@link #reloadNEICache} being called increases the count. - */ - public int getNEIReloadCount() { - return 0; - } - - @SubscribeEvent - public void onArrowNockEvent(ArrowNockEvent aEvent) { - if ((!aEvent.isCanceled()) && (GT_Utility.isStackValid(aEvent.result)) - && (GT_Utility.getProjectile(SubTag.PROJECTILE_ARROW, aEvent.entityPlayer.inventory) != null)) { - aEvent.entityPlayer.setItemInUse( - aEvent.result, - aEvent.result.getItem() - .getMaxItemUseDuration(aEvent.result)); - aEvent.setCanceled(true); - } - } - - @SubscribeEvent - public void onArrowLooseEvent(ArrowLooseEvent aEvent) { - ItemStack aArrow = GT_Utility.getProjectile(SubTag.PROJECTILE_ARROW, aEvent.entityPlayer.inventory); - if ((!aEvent.isCanceled()) && (GT_Utility.isStackValid(aEvent.bow)) - && (aArrow != null) - && ((aEvent.bow.getItem() instanceof ItemBow))) { - float tSpeed = aEvent.charge / 20.0F; - tSpeed = (tSpeed * tSpeed + tSpeed * 2.0F) / 3.0F; - if (tSpeed < 0.1D) { - return; - } - if (tSpeed > 1.0D) { - tSpeed = 1.0F; - } - EntityArrow tArrowEntity = ((IProjectileItem) aArrow.getItem()).getProjectile( - SubTag.PROJECTILE_ARROW, - aArrow, - aEvent.entityPlayer.worldObj, - aEvent.entityPlayer, - tSpeed * 2.0F); - if (tSpeed >= 1.0F) { - tArrowEntity.setIsCritical(true); - } - int tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, aEvent.bow); - if (tLevel > 0) { - tArrowEntity.setDamage(tArrowEntity.getDamage() + tLevel * 0.5D + 0.5D); - } - tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, aEvent.bow); - if (tLevel > 0) { - tArrowEntity.setKnockbackStrength(tLevel); - } - tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, aEvent.bow); - if (tLevel > 0) { - tArrowEntity.setFire(tLevel * 100); - } - aEvent.bow.damageItem(1, aEvent.entityPlayer); - aEvent.bow.getItem(); - - new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setPitch(0.64893958288F + tSpeed * 0.5F) - .setVolume(1f) - .setIdentifier(SoundResource.RANDOM_BOW) - .setEntity(aEvent.entityPlayer) - .setWorld(aEvent.entityPlayer.worldObj) - .run(); - - tArrowEntity.canBePickedUp = 1; - if (!aEvent.entityPlayer.capabilities.isCreativeMode) { - aArrow.stackSize -= 1; - } - if (aArrow.stackSize == 0) { - GT_Utility.removeNullStacksFromInventory(aEvent.entityPlayer.inventory); - } - if (!aEvent.entityPlayer.worldObj.isRemote) { - aEvent.entityPlayer.worldObj.spawnEntityInWorld(tArrowEntity); - } - aEvent.setCanceled(true); - } - } - - @SubscribeEvent - public void onEndermanTeleportEvent(EnderTeleportEvent aEvent) { - if (((aEvent.entityLiving instanceof EntityEnderman)) - && (aEvent.entityLiving.getActivePotionEffect(Potion.weakness) != null)) { - aEvent.setCanceled(true); - } - } - - @SubscribeEvent - public void onEntitySpawningEvent(EntityJoinWorldEvent aEvent) { - if (aEvent.entity == null) { - return; - } - - if (aEvent.entity.worldObj.isRemote) { - return; - } - - if ((aEvent.entity instanceof EntityItem)) { - ((EntityItem) aEvent.entity) - .setEntityItemStack(GT_OreDictUnificator.get(true, ((EntityItem) aEvent.entity).getEntityItem(), true)); - } - } - - @SubscribeEvent - public void onPlayerJoinEvent(cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent event) { - if (event.player == null || event.player.isClientWorld() - || !(event.player instanceof EntityPlayerMP mpPlayer)) { - return; - } - GT_Values.NW.sendToPlayer(new GT_Packet_MusicSystemData(GT_MusicSystem.ServerSystem.serialize()), mpPlayer); - } - - @SubscribeEvent - public void onOreGenEvent(OreGenEvent.GenerateMinable aGenerator) { - if ((this.mDisableVanillaOres) && ((aGenerator.generator instanceof WorldGenMinable)) - && (PREVENTED_ORES.contains(aGenerator.type))) { - aGenerator.setResult(Result.DENY); - } - } - - private String getDataAndTime() { - return this.mDateFormat.format(new Date()); - } - - @SubscribeEvent - public void onPlayerInteraction(PlayerInteractEvent aEvent) { - if ((aEvent.entityPlayer == null) || (aEvent.entityPlayer.worldObj == null) - || (aEvent.action == null) - || (aEvent.world.provider == null)) { - return; - } - if ((!aEvent.entityPlayer.worldObj.isRemote) && (aEvent.action != PlayerInteractEvent.Action.RIGHT_CLICK_AIR) - && (GT_Log.pal != null)) { - this.mBufferedPlayerActivity.offer( - getDataAndTime() + ";" - + aEvent.action.name() - + ";" - + aEvent.entityPlayer.getDisplayName() - + ";DIM:" - + aEvent.world.provider.dimensionId - + ";" - + aEvent.x - + ";" - + aEvent.y - + ";" - + aEvent.z - + ";|;" - + aEvent.x / 10 - + ";" - + aEvent.y / 10 - + ";" - + aEvent.z / 10); - } - ItemStack aStack = aEvent.entityPlayer.getCurrentEquippedItem(); - if ((aStack != null) && (aEvent.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) - && (aStack.getItem() == Items.flint_and_steel)) { - if ((!aEvent.world.isRemote) && (!aEvent.entityPlayer.capabilities.isCreativeMode) - && (aEvent.world.rand.nextInt(100) >= this.mFlintChance)) { - aEvent.setCanceled(true); - aStack.damageItem(1, aEvent.entityPlayer); - if (aStack.getItemDamage() >= aStack.getMaxDamage()) { - aStack.stackSize -= 1; - } - if (aStack.stackSize <= 0) { - ForgeEventFactory.onPlayerDestroyItem(aEvent.entityPlayer, aStack); - } - } - } - } - - @SubscribeEvent - public void onBlockBreakingEvent(BlockEvent.BreakEvent event) { - EntityPlayer player = event.getPlayer(); - if (player == null) return; - - ItemStack item = event.getPlayer() - .getCurrentEquippedItem(); - if (item == null) return; - - if (!(item.getItem() instanceof GT_MetaGenerated_Tool tool)) return; - - IToolStats stats = tool.getToolStats(item); - if (stats == null) return; - - TileEntity tile = event.world.getTileEntity(event.x, event.y, event.z); - stats.onBreakBlock(player, event.x, event.y, event.z, event.block, (byte) event.blockMetadata, tile, event); - } - - @SubscribeEvent - public void onBlockHarvestingEvent(BlockEvent.HarvestDropsEvent aEvent) { - if (aEvent.harvester == null) return; - - if ((!aEvent.world.isRemote) && (GT_Log.pal != null)) { - this.mBufferedPlayerActivity.offer( - getDataAndTime() + ";HARVEST_BLOCK;" - + aEvent.harvester.getDisplayName() - + ";DIM:" - + aEvent.world.provider.dimensionId - + ";" - + aEvent.x - + ";" - + aEvent.y - + ";" - + aEvent.z - + ";|;" - + aEvent.x / 10 - + ";" - + aEvent.y / 10 - + ";" - + aEvent.z / 10); - } - - ItemStack aStack = aEvent.harvester.getCurrentEquippedItem(); - if (aStack == null) return; - - if ((aStack.getItem() instanceof GT_MetaGenerated_Tool tool)) { - tool.onHarvestBlockEvent( - aEvent.drops, - aStack, - aEvent.harvester, - aEvent.block, - aEvent.x, - aEvent.y, - aEvent.z, - (byte) aEvent.blockMetadata, - aEvent.fortuneLevel, - aEvent.isSilkTouching, - aEvent); - } - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.fireAspect.effectId, aStack) > 2) { - try { - for (ItemStack tDrop : aEvent.drops) { - ItemStack tSmeltingOutput = GT_ModHandler.getSmeltingOutput(tDrop, false, null); - if (tSmeltingOutput != null) { - tDrop.stackSize *= tSmeltingOutput.stackSize; - tSmeltingOutput.stackSize = tDrop.stackSize; - GT_Utility.setStack(tDrop, tSmeltingOutput); - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - } - - @SubscribeEvent - public void registerOre(OreDictionary.OreRegisterEvent aEvent) { - ModContainer tContainer = Loader.instance() - .activeModContainer(); - String aMod = tContainer == null ? "UNKNOWN" : tContainer.getModId(); - String aOriginalMod = aMod; - if (GT_OreDictUnificator.isRegisteringOres()) { - aMod = GregTech.ID; - } else if (aMod.equals(GregTech.ID)) { - aMod = "UNKNOWN"; - } - if ((aEvent == null) || (aEvent.Ore == null) - || (aEvent.Ore.getItem() == null) - || (aEvent.Name == null) - || (aEvent.Name.isEmpty()) - || (aEvent.Name.replaceAll("_", "") - .length() - aEvent.Name.length() == 9)) { - if (aOriginalMod.equals(GregTech.ID)) { - aOriginalMod = "UNKNOWN"; - } - GT_Log.ore.println( - aOriginalMod - + " did something very bad! The registration is too invalid to even be shown properly. This happens only if you register null, invalid Items, empty Strings or even nonexisting Events to the OreDict."); - throw new IllegalArgumentException( - aOriginalMod - + " did something very bad! The registration is too invalid to even be shown properly. This happens only if you register null, invalid Items, empty Strings or even nonexisting Events to the OreDict."); - } - try { - aEvent.Ore.stackSize = 1; - - // skipping TinkerConstruct ore registration - if (this.mIgnoreTcon && aOriginalMod.equals(TinkerConstruct.ID)) { - return; - } - String tModToName = aMod + " -> " + aEvent.Name; - if (this.mOreDictActivated || GregTech_API.sPostloadStarted || GregTech_API.sLoadFinished) { - tModToName = aOriginalMod + " --Late--> " + aEvent.Name; - } - if (((aEvent.Ore.getItem() instanceof ItemBlock)) - || (GT_Utility.getBlockFromStack(aEvent.Ore) != Blocks.air)) { - GT_OreDictUnificator.addToBlacklist(aEvent.Ore); - } - this.mRegisteredOres.add(aEvent.Ore); - if (this.mIgnoredItems.contains(aEvent.Name)) { - if ((aEvent.Name.startsWith("item"))) { - GT_Log.ore.println(tModToName); - if (aEvent.Name.equals("itemCopperWire")) { - GT_OreDictUnificator.registerOre(OreDictNames.craftingWireCopper, aEvent.Ore); - } - if (aEvent.Name.equals("itemRubber")) { - GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Rubber, aEvent.Ore); - } - return; - } - } else if (this.mIgnoredNames.contains(aEvent.Name)) { - GT_Log.ore.println(tModToName + " is getting ignored via hardcode."); - return; - } else if (aEvent.Name.equals("stone")) { - GT_OreDictUnificator.registerOre("stoneSmooth", aEvent.Ore); - return; - } else if (aEvent.Name.equals("cobblestone")) { - GT_OreDictUnificator.registerOre("stoneCobble", aEvent.Ore); - return; - } else if ((aEvent.Name.contains("|")) || (aEvent.Name.contains("*")) - || (aEvent.Name.contains(":")) - || (aEvent.Name.contains(".")) - || (aEvent.Name.contains("$"))) { - GT_Log.ore - .println(tModToName + " is using a private Prefix and is therefor getting ignored properly."); - return; - } else if (aEvent.Name.equals("copperWire")) { - GT_OreDictUnificator.registerOre(OreDictNames.craftingWireCopper, aEvent.Ore); - } else if (aEvent.Name.equals("oreHeeEndrium")) { - GT_OreDictUnificator.registerOre(OrePrefixes.ore, Materials.HeeEndium, aEvent.Ore); - } else if (aEvent.Name.equals("sheetPlastic")) { - GT_OreDictUnificator.registerOre(OrePrefixes.plate, Materials.Plastic, aEvent.Ore); - } else if (aEvent.Name.startsWith("shard")) { - switch (aEvent.Name) { - case "shardAir" -> { - GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedAir, aEvent.Ore); - return; - } - case "shardWater" -> { - GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedWater, aEvent.Ore); - return; - } - case "shardFire" -> { - GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedFire, aEvent.Ore); - return; - } - case "shardEarth" -> { - GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedEarth, aEvent.Ore); - return; - } - case "shardOrder" -> { - GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedOrder, aEvent.Ore); - return; - } - case "shardEntropy" -> { - GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedEntropy, aEvent.Ore); - return; - } - } - } else if (aEvent.Name.equals("fieryIngot")) { - GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.FierySteel, aEvent.Ore); - return; - } else if (aEvent.Name.equals("ironwood")) { - GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.IronWood, aEvent.Ore); - return; - } else if (aEvent.Name.equals("steeleaf")) { - GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Steeleaf, aEvent.Ore); - return; - } else if (aEvent.Name.equals("knightmetal")) { - GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Knightmetal, aEvent.Ore); - return; - } else if (aEvent.Name.equals("compressedAluminum")) { - GT_OreDictUnificator.registerOre(OrePrefixes.compressed, Materials.Aluminium, aEvent.Ore); - return; - } else if (aEvent.Name.contains(" ")) { - GT_Log.ore.println( - tModToName + " is getting re-registered because the OreDict Name containing invalid spaces."); - GT_OreDictUnificator - .registerOre(aEvent.Name.replaceAll(" ", ""), GT_Utility.copyAmount(1, aEvent.Ore)); - aEvent.Ore.setStackDisplayName("Invalid OreDictionary Tag"); - return; - } else if (this.mInvalidNames.contains(aEvent.Name)) { - GT_Log.ore.println(tModToName + " is wrongly registered and therefor getting ignored."); - - return; - } - OrePrefixes aPrefix = OrePrefixes.getOrePrefix(aEvent.Name); - Materials aMaterial = Materials._NULL; - if ((aPrefix == OrePrefixes.nugget) && (aMod.equals(Thaumcraft.ID)) - && (aEvent.Ore.getItem() - .getUnlocalizedName() - .contains("ItemResource"))) { - return; - } - if (aPrefix == null) { - if (aEvent.Name.toLowerCase() - .equals(aEvent.Name)) { - GT_Log.ore.println(tModToName + " is invalid due to being solely lowercased."); - return; - } else if (aEvent.Name.toUpperCase() - .equals(aEvent.Name)) { - GT_Log.ore.println(tModToName + " is invalid due to being solely uppercased."); - return; - } else if (Character.isUpperCase(aEvent.Name.charAt(0))) { - GT_Log.ore.println(tModToName + " is invalid due to the first character being uppercased."); - } - } else { - if (aPrefix.mDontUnificateActively) { - GT_OreDictUnificator.addToBlacklist(aEvent.Ore); - } - if (aPrefix != aPrefix.mPrefixInto) { - String tNewName = aEvent.Name.replaceFirst(aPrefix.toString(), aPrefix.mPrefixInto.toString()); - if (!GT_OreDictUnificator.isRegisteringOres()) { - GT_Log.ore.println( - tModToName + " uses a depricated Prefix, and is getting re-registered as " + tNewName); - } - GT_OreDictUnificator.registerOre(tNewName, aEvent.Ore); - return; - } - String tName = aEvent.Name.replaceFirst(aPrefix.toString(), ""); - if (tName.length() > 0) { - char firstChar = tName.charAt(0); - if (Character.isUpperCase(firstChar) || Character.isLowerCase(firstChar) - || firstChar == '_' - || Character.isDigit(firstChar)) { - if (aPrefix.mIsMaterialBased) { - aMaterial = Materials.get(tName); - if (aMaterial != aMaterial.mMaterialInto) { - GT_OreDictUnificator.registerOre(aPrefix, aMaterial.mMaterialInto, aEvent.Ore); - if (!GT_OreDictUnificator.isRegisteringOres()) { - GT_Log.ore.println( - tModToName + " uses a deprecated Material and is getting re-registered as " - + aPrefix.get(aMaterial.mMaterialInto)); - } - return; - } - if (!aPrefix.isIgnored(aMaterial)) { - aPrefix.add(GT_Utility.copyAmount(1, aEvent.Ore)); - } - if (aMaterial != Materials._NULL) { - Materials tReRegisteredMaterial; - for (Iterator i$ = aMaterial.mOreReRegistrations.iterator(); i$ - .hasNext(); GT_OreDictUnificator - .registerOre(aPrefix, tReRegisteredMaterial, aEvent.Ore)) { - tReRegisteredMaterial = i$.next(); - } - aMaterial.add(GT_Utility.copyAmount(1, aEvent.Ore)); - - if (GregTech_API.sThaumcraftCompat != null && aPrefix.doGenerateItem(aMaterial) - && !aPrefix.isIgnored(aMaterial)) { - List tAspects = new ArrayList<>(); - for (TC_AspectStack tAspect : aPrefix.mAspects) tAspect.addToAspectList(tAspects); - if (aPrefix.mMaterialAmount >= 3628800 || aPrefix.mMaterialAmount < 0) - for (TC_AspectStack tAspect : aMaterial.mAspects) - tAspect.addToAspectList(tAspects); - GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem( - GT_Utility.copyAmount(1, aEvent.Ore), - tAspects, - aEvent.Name); - } - - switch (aPrefix) { - case crystal -> { - if ((aMaterial == Materials.CertusQuartz) - || (aMaterial == Materials.NetherQuartz) - || (aMaterial == Materials.Fluix)) { - GT_OreDictUnificator.registerOre(OrePrefixes.gem, aMaterial, aEvent.Ore); - } - } - case gem -> { - if (aMaterial == Materials.Lapis || aMaterial == Materials.Sodalite) { - GT_OreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore); - } else if (aMaterial == Materials.Lazurite) { - GT_OreDictUnificator.registerOre(Dyes.dyeCyan, aEvent.Ore); - } else - if (aMaterial == Materials.InfusedAir || aMaterial == Materials.InfusedWater - || aMaterial == Materials.InfusedFire - || aMaterial == Materials.InfusedEarth - || aMaterial == Materials.InfusedOrder - || aMaterial == Materials.InfusedEntropy) { - GT_OreDictUnificator.registerOre( - aMaterial.mName.replaceFirst("Infused", "shard"), - aEvent.Ore); - } else if (aMaterial == Materials.Chocolate) { - GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); - } else if (aMaterial == Materials.CertusQuartz - || aMaterial == Materials.NetherQuartz) { - GT_OreDictUnificator - .registerOre(OrePrefixes.item.get(aMaterial), aEvent.Ore); - GT_OreDictUnificator - .registerOre(OrePrefixes.crystal, aMaterial, aEvent.Ore); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingQuartz, aEvent.Ore); - } else - if (aMaterial == Materials.Fluix || aMaterial == Materials.Quartz - || aMaterial == Materials.Quartzite) { - GT_OreDictUnificator.registerOre( - OrePrefixes.crystal, - aMaterial, - aEvent.Ore); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingQuartz, aEvent.Ore); - } - } - case cableGt01 -> { - if (aMaterial == Materials.Tin) { - GT_OreDictUnificator.registerOre(OreDictNames.craftingWireTin, aEvent.Ore); - } else if (aMaterial == Materials.AnyCopper) { - GT_OreDictUnificator - .registerOre(OreDictNames.craftingWireCopper, aEvent.Ore); - } else if (aMaterial == Materials.Gold) { - GT_OreDictUnificator.registerOre(OreDictNames.craftingWireGold, aEvent.Ore); - } else if (aMaterial == Materials.AnyIron) { - GT_OreDictUnificator.registerOre(OreDictNames.craftingWireIron, aEvent.Ore); - } - } - case lens -> { - if ((aMaterial.contains(SubTag.TRANSPARENT)) - && (aMaterial.mColor != Dyes._NULL)) { - GT_OreDictUnificator.registerOre( - "craftingLens" + aMaterial.mColor.toString() - .replaceFirst("dye", ""), - aEvent.Ore); - } - } - case plate -> { - if ((aMaterial == Materials.Plastic) || (aMaterial == Materials.Rubber)) { - GT_OreDictUnificator.registerOre(OrePrefixes.sheet, aMaterial, aEvent.Ore); - } else if (aMaterial == Materials.Silicon) { - GT_OreDictUnificator.registerOre(OrePrefixes.item, aMaterial, aEvent.Ore); - } else if (aMaterial == Materials.Wood) { - GT_OreDictUnificator.addToBlacklist(aEvent.Ore); - GT_OreDictUnificator.registerOre(OrePrefixes.plank, aMaterial, aEvent.Ore); - } - } - case cell -> { - if (aMaterial == Materials.Empty) { - GT_OreDictUnificator.addToBlacklist(aEvent.Ore); - } - } - case gearGt -> GT_OreDictUnificator - .registerOre(OrePrefixes.gear, aMaterial, aEvent.Ore); - case stick -> { - if (!GT_RecipeRegistrator.sRodMaterialList.contains(aMaterial)) { - GT_RecipeRegistrator.sRodMaterialList.add(aMaterial); - } else if (aMaterial == Materials.Wood) { - GT_OreDictUnificator.addToBlacklist(aEvent.Ore); - } else if ((aMaterial == Materials.Tin) || (aMaterial == Materials.Lead) - || (aMaterial == Materials.SolderingAlloy)) { - GT_OreDictUnificator - .registerOre(ToolDictNames.craftingToolSolderingMetal, aEvent.Ore); - } - } - case dust -> { - if (aMaterial == Materials.Salt) { - GT_OreDictUnificator.registerOre("itemSalt", aEvent.Ore); - } else if (aMaterial == Materials.Wood) { - GT_OreDictUnificator.registerOre("pulpWood", aEvent.Ore); - } else if (aMaterial == Materials.Wheat) { - GT_OreDictUnificator.registerOre("foodFlour", aEvent.Ore); - } else if (aMaterial == Materials.Lapis) { - GT_OreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore); - } else if (aMaterial == Materials.Lazurite) { - GT_OreDictUnificator.registerOre(Dyes.dyeCyan, aEvent.Ore); - } else if (aMaterial == Materials.Sodalite) { - GT_OreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore); - } else if (aMaterial == Materials.Cocoa) { - GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); - GT_OreDictUnificator.registerOre("foodCocoapowder", aEvent.Ore); - } else if (aMaterial == Materials.Coffee) { - GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); - } else if (aMaterial == Materials.BrownLimonite) { - GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore); - } else if (aMaterial == Materials.YellowLimonite) { - GT_OreDictUnificator.registerOre(Dyes.dyeYellow, aEvent.Ore); - } - } - case ingot -> { - if (aMaterial == Materials.Rubber) { - GT_OreDictUnificator.registerOre("itemRubber", aEvent.Ore); - } else if (aMaterial == Materials.FierySteel) { - GT_OreDictUnificator.registerOre("fieryIngot", aEvent.Ore); - } else if (aMaterial == Materials.IronWood) { - GT_OreDictUnificator.registerOre("ironwood", aEvent.Ore); - } else if (aMaterial == Materials.Steeleaf) { - GT_OreDictUnificator.registerOre("steeleaf", aEvent.Ore); - } else if (aMaterial == Materials.Knightmetal) { - GT_OreDictUnificator.registerOre("knightmetal", aEvent.Ore); - } else if ((aMaterial == Materials.Brass) && (aEvent.Ore.getItemDamage() == 2) - && (aEvent.Ore.getUnlocalizedName() - .equals("item.ingotBrass")) - && (new ItemStack(aEvent.Ore.getItem(), 1, 0).getUnlocalizedName() - .contains("red"))) { - GT_OreDictUnificator.set( - OrePrefixes.ingot, - Materials.RedAlloy, - new ItemStack(aEvent.Ore.getItem(), 1, 0)); - GT_OreDictUnificator.set( - OrePrefixes.ingot, - Materials.BlueAlloy, - new ItemStack(aEvent.Ore.getItem(), 1, 1)); - GT_OreDictUnificator.set( - OrePrefixes.ingot, - Materials.Brass, - new ItemStack(aEvent.Ore.getItem(), 1, 2)); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(aEvent.Ore.getItem(), 1, 3)) - .itemOutputs(new ItemStack(aEvent.Ore.getItem(), 16, 4)) - .duration(20 * SECONDS) - .eut(8) - .addTo(cutterRecipes); - } - } - default -> {} - } - if (aPrefix.mIsUnificatable && !aMaterial.mUnificatable) { - return; - } - } else { - for (Dyes tDye : Dyes.VALUES) { - if (aEvent.Name.endsWith( - tDye.name() - .replaceFirst("dye", ""))) { - GT_OreDictUnificator.addToBlacklist(aEvent.Ore); - GT_Log.ore.println( - tModToName - + " Oh man, why the fuck would anyone need a OreDictified Color for this, that is even too much for GregTech... do not report this, this is just a random Comment about how ridiculous this is."); - return; - } - } - // GT_FML_LOGGER.info("Material Name: "+aEvent.Name+ " - // !!!Unknown Material detected!!! Please report to GregTech Intergalactical for - // additional compatiblity. This is not an Error, an Issue nor a Lag Source, it is just - // an Information, which you should pass to me."); - // GT_Log.ore.println(tModToName + " uses an unknown - // Material. Report this to GregTech."); - return; - } - } else { - aPrefix.add(GT_Utility.copyAmount(1, aEvent.Ore)); - } - } - } else if (aPrefix.mIsSelfReferencing) { - aPrefix.add(GT_Utility.copyAmount(1, aEvent.Ore)); - } else { - GT_Log.ore.println(tModToName + " uses a Prefix as full OreDict Name, and is therefor invalid."); - aEvent.Ore.setStackDisplayName("Invalid OreDictionary Tag"); - return; - } - switch (aPrefix) { - case dye -> { - if (GT_Utility.isStringValid(tName)) { - GT_OreDictUnificator.registerOre(OrePrefixes.dye, aEvent.Ore); - } - } - case stoneSmooth -> GT_OreDictUnificator.registerOre("stone", aEvent.Ore); - case stoneCobble -> GT_OreDictUnificator.registerOre("cobblestone", aEvent.Ore); - case plank -> { - if (tName.equals("Wood")) { - GT_OreDictUnificator.addItemData(aEvent.Ore, new ItemData(Materials.Wood, 3628800L)); - } - } - case slab -> { - if (tName.equals("Wood")) { - GT_OreDictUnificator.addItemData(aEvent.Ore, new ItemData(Materials.Wood, 1814400L)); - } - } - case sheet -> { - if (tName.equals("Plastic")) { - GT_OreDictUnificator.registerOre(OrePrefixes.plate, Materials.Plastic, aEvent.Ore); - } else if (tName.equals("Rubber")) { - GT_OreDictUnificator.registerOre(OrePrefixes.plate, Materials.Rubber, aEvent.Ore); - } - } - case crafting -> { - switch (tName) { - case "ToolSolderingMetal" -> GregTech_API.registerSolderingMetal(aEvent.Ore); - case "IndustrialDiamond" -> GT_OreDictUnificator.addToBlacklist(aEvent.Ore); - case "WireCopper" -> GT_OreDictUnificator - .registerOre(OrePrefixes.wire, Materials.Copper, aEvent.Ore); - } - } - case wood -> { - if (tName.equals("Rubber")) { - GT_OreDictUnificator.registerOre("logRubber", aEvent.Ore); - } - } - case food -> { - if (tName.equals("Cocoapowder")) { - GT_OreDictUnificator.registerOre(OrePrefixes.dust, Materials.Cocoa, aEvent.Ore); - } - } - default -> {} - } - } - GT_Log.ore.println(tModToName); - - OreDictEventContainer tOre = new OreDictEventContainer(aEvent, aPrefix, aMaterial, aMod); - if ((!this.mOreDictActivated) || (!GregTech_API.sUnificationEntriesRegistered)) { - this.mEvents.add(tOre); - } else { - this.mEvents.clear(); - } - if (this.mOreDictActivated) { - registerRecipes(tOre); - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - - @SuppressWarnings("deprecated") - public static void stepMaterialsVanilla(Collection mEvents, - ProgressManager.ProgressBar progressBar) { - int size = 5; - int sizeStep = mEvents.size() / 20 - 1; - GT_Proxy.OreDictEventContainer tEvent; - for (Iterator i$ = mEvents.iterator(); i$.hasNext(); GT_Proxy - .registerRecipes(tEvent)) { - tEvent = i$.next(); - sizeStep--; - if (sizeStep == 0) { - GT_FML_LOGGER.info("Baking : " + size + "%", new Object[0]); - sizeStep = mEvents.size() / 20 - 1; - size += 5; - } - progressBar.step(tEvent.mMaterial == null ? "" : tEvent.mMaterial.toString()); - } - ProgressManager.pop(progressBar); - } - - @SubscribeEvent - public void onLivingUpdate(LivingUpdateEvent aEvent) { - if (aEvent.entityLiving.onGround) { - int tX = MathHelper.floor_double(aEvent.entityLiving.posX), - tY = MathHelper.floor_double(aEvent.entityLiving.boundingBox.minY - 0.001F), - tZ = MathHelper.floor_double(aEvent.entityLiving.posZ); - Block tBlock = aEvent.entityLiving.worldObj.getBlock(tX, tY, tZ); - if (tBlock instanceof IBlockOnWalkOver) - ((IBlockOnWalkOver) tBlock).onWalkOver(aEvent.entityLiving, aEvent.entityLiving.worldObj, tX, tY, tZ); - } - } - - @SubscribeEvent - public void onFluidContainerRegistration(FluidContainerRegistry.FluidContainerRegisterEvent aFluidEvent) { - if ((aFluidEvent.data.filledContainer.getItem() == Items.potionitem) - && (aFluidEvent.data.filledContainer.getItemDamage() == 0)) { - aFluidEvent.data.fluid.amount = 0; - } - GT_OreDictUnificator.addToBlacklist(aFluidEvent.data.emptyContainer); - GT_OreDictUnificator.addToBlacklist(aFluidEvent.data.filledContainer); - GT_Utility.addFluidContainerData(aFluidEvent.data); - } - - @SubscribeEvent - public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) { - if (aEvent.side.isServer()) { - if (aEvent.phase == TickEvent.Phase.START) { - TICK_LOCK.lock(); - } else { - TICK_LOCK.unlock(); - GT_MusicSystem.ServerSystem.tick(); - } - - // Making sure it is being freed up in order to prevent exploits or Garbage Collection mishaps. - LAST_BROKEN_TILEENTITY.set(null); - } - } - - @SubscribeEvent - public void onWorldTickEvent(TickEvent.WorldTickEvent aEvent) { - if (aEvent.world.provider.dimensionId == 0) mTicksUntilNextCraftSound--; - if (isFirstWorldTick) { - for (Runnable runnable : GregTech_API.sFirstWorldTick) runnable.run(); - isFirstWorldTick = false; - GT_Values.worldTickHappened = true; - } - if (aEvent.side.isServer()) { - if (this.mUniverse == null) { - this.mUniverse = aEvent.world; - } - if (this.isFirstServerWorldTick) { - File tSaveDiretory = getSaveDirectory(); - if (tSaveDiretory != null) { - this.isFirstServerWorldTick = false; - try { - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - if (GregTech_API.METATILEENTITIES[i] != null) { - GregTech_API.METATILEENTITIES[i].onWorldLoad(tSaveDiretory); - } - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - } - if ((aEvent.world.getTotalWorldTime() % 100L == 0L) - && ((this.mItemDespawnTime != 6000) || (this.mMaxEqualEntitiesAtOneSpot > 0))) { - long startTime = System.nanoTime(); - double oldX = 0, oldY = 0, oldZ = 0; - if (debugEntityCramming && (aEvent.world.loadedEntityList.size() != 0)) { - GT_Log.out.println("CRAM: Entity list size " + aEvent.world.loadedEntityList.size()); - } - for (int i = 0; i < aEvent.world.loadedEntityList.size(); i++) { - if ((aEvent.world.loadedEntityList.get(i) instanceof Entity)) { - Entity tEntity = aEvent.world.loadedEntityList.get(i); - if (((tEntity instanceof EntityItem)) && (this.mItemDespawnTime != 6000) - && (((EntityItem) tEntity).lifespan == 6000)) { - ((EntityItem) tEntity).lifespan = this.mItemDespawnTime; - } else if (((tEntity instanceof EntityLivingBase)) && (this.mMaxEqualEntitiesAtOneSpot > 0) - && (!(tEntity instanceof EntityPlayer)) - && (tEntity.canBePushed()) - && (((EntityLivingBase) tEntity).getHealth() > 0.0F)) { - List tList = tEntity.worldObj.getEntitiesWithinAABBExcludingEntity( - tEntity, - tEntity.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - Class tClass = tEntity.getClass(); - int tEntityCount = 1; - if (tList != null) { - for (Object o : tList) { - if ((o != null) && (o.getClass() == tClass)) { - tEntityCount++; - } - } - } - if (tEntityCount > this.mMaxEqualEntitiesAtOneSpot) { - if (debugEntityCramming) { - // Cheeseball way of not receiving a bunch of spam caused by 1 location - // obviously fails if there are crammed entities in more than one spot. - if (tEntity.posX != oldX && tEntity.posY != oldY && tEntity.posZ != oldZ) { - GT_Log.out.println( - "CRAM: Excess entities: " + tEntityCount - + " at X " - + tEntity.posX - + " Y " - + tEntity.posY - + " Z " - + tEntity.posZ); - oldX = tEntity.posX; - oldY = tEntity.posY; - oldZ = tEntity.posZ; - } - } - tEntity.attackEntityFrom( - DamageSource.inWall, - tEntityCount - this.mMaxEqualEntitiesAtOneSpot); - } - } - } - } - if (debugEntityCramming && (aEvent.world.loadedEntityList.size() != 0)) { - GT_Log.out.println( - "CRAM: Time spent checking " + (System.nanoTime() - startTime) / 1000 + " microseconds"); - } - } - - GT_Pollution.onWorldTick(aEvent); - } - } - - @SubscribeEvent - public void onWorldUnload(WorldEvent.Unload event) { - for (TileEntity tileEntity : event.world.loadedTileEntityList) { - if (tileEntity instanceof IGregTechTileEntity) { - tileEntity.onChunkUnload(); - } - } - } - - public static void registerRecipes(GT_Proxy.OreDictEventContainer aOre) { - if ((aOre.mEvent.Ore == null) || (aOre.mEvent.Ore.getItem() == null) - || (aOre.mPrefix == null) - || (aOre.mPrefix.isIgnored(aOre.mMaterial))) { - return; - } - if (aOre.mEvent.Ore.stackSize != 1) { - aOre.mEvent.Ore.stackSize = 1; - } - - aOre.mPrefix.processOre( - aOre.mMaterial == null ? Materials._NULL : aOre.mMaterial, - aOre.mEvent.Name, - aOre.mModID, - GT_Utility.copyAmount(1, aOre.mEvent.Ore)); - } - - @SubscribeEvent - public void onPlayerTickEventServer(TickEvent.PlayerTickEvent aEvent) { - if ((!aEvent.side.isServer()) || (aEvent.phase == TickEvent.Phase.END) || (aEvent.player.isDead)) { - return; - } - - if ((aEvent.player.ticksExisted % 200 == 0) && (aEvent.player.capabilities.allowEdit) - && (!aEvent.player.capabilities.isCreativeMode) - && (this.mSurvivalIntoAdventure)) { - aEvent.player.setGameType(GameType.ADVENTURE); - aEvent.player.capabilities.allowEdit = false; - if (this.mAxeWhenAdventure) { - GT_Utility.sendChatToPlayer( - aEvent.player, - GT_LanguageManager.addStringLocalization( - "Interaction_DESCRIPTION_Index_097", - "It's dangerous to go alone! Take this.")); - aEvent.player.worldObj.spawnEntityInWorld( - new EntityItem( - aEvent.player.worldObj, - aEvent.player.posX, - aEvent.player.posY, - aEvent.player.posZ, - GT_MetaGenerated_Tool_01.INSTANCE - .getToolWithStats(ID_MetaTool_01.AXE.ID, 1, Materials.Flint, Materials.Wood, null))); - } - } - final boolean tHungerEffect = (this.mHungerEffect) && (aEvent.player.ticksExisted % 2400 == 1200); - - if (aEvent.player.ticksExisted % 120 != 0) { - return; - } - - int tCount = 64; - for (int i = 0; i < 36; i++) { - final ItemStack tStack = aEvent.player.inventory.getStackInSlot(i); - if (tStack == null) { - continue; - } - - if (!aEvent.player.capabilities.isCreativeMode) { - GT_Utility - .applyRadioactivity(aEvent.player, GT_Utility.getRadioactivityLevel(tStack), tStack.stackSize); - final float tHeat = GT_Utility.getHeatDamageFromItem(tStack); - if (tHeat != 0.0F) { - if (tHeat > 0.0F) { - GT_Utility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack); - } else { - GT_Utility.applyFrostDamage(aEvent.player, -tHeat); - } - } - } - if (tHungerEffect) { - tCount += tStack.stackSize * 64 / Math.max(1, tStack.getMaxStackSize()); - } - if (this.mInventoryUnification) { - GT_OreDictUnificator.setStack(true, tStack); - } - - } - for (int i = 0; i < 4; i++) { - final ItemStack tStack = aEvent.player.inventory.armorInventory[i]; - if (tStack == null) { - continue; - } - - if (!aEvent.player.capabilities.isCreativeMode) { - GT_Utility - .applyRadioactivity(aEvent.player, GT_Utility.getRadioactivityLevel(tStack), tStack.stackSize); - final float tHeat = GT_Utility.getHeatDamageFromItem(tStack); - if (tHeat != 0.0F) { - if (tHeat > 0.0F) { - GT_Utility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack); - } else { - GT_Utility.applyFrostDamage(aEvent.player, -tHeat); - } - } - } - if (tHungerEffect) { - tCount += 256; - } - - } - if (tHungerEffect) { - aEvent.player.addExhaustion(Math.max(1.0F, tCount / 666.6F)); - } - } - - public GT_ClientPreference getClientPreference(UUID aPlayerID) { - return mClientPrefernces.get(aPlayerID); - } - - public void setClientPreference(UUID aPlayerID, GT_ClientPreference aPreference) { - mClientPrefernces.put(aPlayerID, aPreference); - } - - private static List getOreDictNames(ItemStack stack) { - return Arrays.stream(OreDictionary.getOreIDs(stack)) - .mapToObj(OreDictionary::getOreName) - .collect(Collectors.toList()); - } - - @Override - public int getBurnTime(ItemStack aFuel) { - if ((aFuel == null) || (aFuel.getItem() == null)) { - return 0; - } - int rFuelValue = 0; - if ((aFuel.getItem() instanceof GT_MetaGenerated_Item)) { - final Short tFuelValue = ((GT_MetaGenerated_Item) aFuel.getItem()).mBurnValues - .get((short) aFuel.getItemDamage()); - if (tFuelValue != null) { - rFuelValue = Math.max(rFuelValue, tFuelValue); - } - } - final NBTTagCompound tNBT = aFuel.getTagCompound(); - if (tNBT != null) { - // See if we have something defined by NBT - final short tValue = tNBT.getShort("GT.ItemFuelValue"); - rFuelValue = Math.max(rFuelValue, tValue); - } else { - // If not check the ore dict - rFuelValue = Math.max( - rFuelValue, - getOreDictNames(aFuel).stream() - .mapToInt(f -> oreDictBurnTimes.getOrDefault(f, 0)) - .max() - .orElse(0)); - } - - // If we have something from the GT MetaGenerated_Item, ItemFuelValue, or OreDict return - if (rFuelValue > 0) return rFuelValue; - - // Otherwise, a few more checks - if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Blocks.wooden_button, 1))) return 150; - else if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Blocks.ladder, 1))) return 100; - else if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Items.sign, 1))) return 600; - else if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Items.wooden_door, 1))) return 600; - else if (GT_Utility.areStacksEqual(aFuel, ItemList.Block_MSSFUEL.get(1))) return 150000; - else if (GT_Utility.areStacksEqual(aFuel, ItemList.Block_SSFUEL.get(1))) return 100000; - - return 0; - } - - // ------------------------ Adds all fluids corresponding to materials ------------------------ - - public Fluid addAutoGeneratedCorrespondingFluid(Materials aMaterial) { - // If the fluid is registered as custom inside the Material's constructor then to add custom fluid - // textures go to blocks/fluids and place the .png. File should be called fluid.fluid.{unlocalised_name}.png. - // All lower case. - final String fluidTexture = aMaterial.mIconSet.is_custom ? "fluid." + aMaterial.mName.toLowerCase() - : "autogenerated"; - - return GT_FluidFactory.builder(aMaterial.mName.toLowerCase(Locale.ENGLISH)) - .withLocalizedName(aMaterial.mDefaultLocalName) - .withTextureName(fluidTexture) - .withColorRGBA(aMaterial.mRGBa) - .withStateAndTemperature(LIQUID, aMaterial.getLiquidTemperature()) - .buildAndRegister() - .configureMaterials(aMaterial) - .registerBContainers(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), ItemList.Cell_Empty.get(1L)) - .asFluid(); - } - - public Fluid addAutoGeneratedCorrespondingGas(Materials aMaterial) { - // If the fluid is registered as custom inside the Material's constructor then to add custom fluid - // textures go to blocks/fluids and place the .png. File should be called fluid.gas.{unlocalised_name}.png. All - // lower case. - final String fluidTexture = aMaterial.mIconSet.is_custom ? ("gas." + aMaterial.mName.toLowerCase()) - : "autogenerated"; - - return GT_FluidFactory.builder(aMaterial.mName.toLowerCase(Locale.ENGLISH)) - .withLocalizedName(aMaterial.mDefaultLocalName) - .withTextureName(fluidTexture) - .withColorRGBA(aMaterial.mRGBa) - .withStateAndTemperature(GAS, aMaterial.getGasTemperature()) - .buildAndRegister() - .configureMaterials(aMaterial) - .registerBContainers(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), ItemList.Cell_Empty.get(1L)) - .asFluid(); - } - - public Fluid addAutogeneratedPlasmaFluid(Materials aMaterial) { - // If the fluid is registered as custom inside the Material's constructor then to add custom fluid - // textures go to blocks/fluids and place the .png. File should be called fluid.plasma.{unlocalised_name}.png. - // All lower case. - final String fluidTexture = aMaterial.mIconSet.is_custom ? ("plasma." + aMaterial.mName.toLowerCase()) - : "plasma.autogenerated"; - - return GT_FluidFactory.builder("plasma." + aMaterial.mName.toLowerCase(Locale.ENGLISH)) - .withLocalizedName(aMaterial.mDefaultLocalName + " Plasma") - .withTextureName(fluidTexture) - .withColorRGBA(aMaterial.mMoltenRGBa) - .withStateAndTemperature(PLASMA, 10000) - .buildAndRegister() - .configureMaterials(aMaterial) - .registerContainers( - GT_OreDictUnificator.get(OrePrefixes.cellPlasma, aMaterial, 1L), - ItemList.Cell_Empty.get(1L), - aMaterial.getMolten(1) != null ? 144 : 1000) - .asFluid(); - } - - public Fluid addAutogeneratedMoltenFluid(Materials aMaterial) { - // If the fluid is registered as custom inside the Material's constructor then to add custom fluid - // textures go to blocks/fluids and place the .png. File should be called fluid.molten.{unlocalised_name}.png. - // All lower case. - final String fluidTexture = aMaterial.mIconSet.is_custom ? ("molten." + aMaterial.mName.toLowerCase()) - : "molten.autogenerated"; - - return GT_FluidFactory.builder("molten." + aMaterial.mName.toLowerCase(Locale.ENGLISH)) - .withLocalizedName("Molten " + aMaterial.mDefaultLocalName) - .withTextureName(fluidTexture) - .withColorRGBA(aMaterial.mMoltenRGBa) - .withStateAndTemperature(MOLTEN, aMaterial.mMeltingPoint < 0 ? 1000 : aMaterial.mMeltingPoint) - .buildAndRegister() - .configureMaterials(aMaterial) - .registerContainers( - GT_OreDictUnificator.get(OrePrefixes.cellMolten, aMaterial, 1L), - ItemList.Cell_Empty.get(1L), - 144) - .asFluid(); - } - - // ------------------------------------------------------------------------------------------------------------ - - public void addAutoGeneratedHydroCrackedFluids(Materials aMaterial) { - Fluid[] crackedFluids = new Fluid[3]; - String[] namePrefixes = { "lightlyhydrocracked.", "moderatelyhydrocracked.", "severelyhydrocracked." }; - OrePrefixes[] orePrefixes = { OrePrefixes.cellHydroCracked1, OrePrefixes.cellHydroCracked2, - OrePrefixes.cellHydroCracked3 }; - final Fluid uncrackedFluid; - if (aMaterial.mFluid != null) { - uncrackedFluid = aMaterial.mFluid; - } else if (aMaterial.mGas != null) { - uncrackedFluid = aMaterial.mGas; - } else return; - for (int i = 0; i < 3; i++) { - crackedFluids[i] = GT_FluidFactory.builder(namePrefixes[i] + aMaterial.mName.toLowerCase(Locale.ENGLISH)) - .withIconsFrom(uncrackedFluid) - .withLocalizedName(orePrefixes[i].mLocalizedMaterialPre + aMaterial.mDefaultLocalName) - .withColorRGBA(aMaterial.mRGBa) - .withStateAndTemperature(GAS, 775) - .buildAndRegister() - .registerBContainers( - GT_OreDictUnificator.get(orePrefixes[i], aMaterial, 1L), - ItemList.Cell_Empty.get(1L)) - .asFluid(); - - int hydrogenAmount = 2 * i + 2; - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(i + 1)) - .fluidInputs(new FluidStack(uncrackedFluid, 1000), Materials.Hydrogen.getGas(hydrogenAmount * 800)) - .fluidOutputs(new FluidStack(crackedFluids[i], 1000)) - .duration((1 + i) * SECONDS) - .eut(240) - .addTo(crackingRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(Materials.Hydrogen.getCells(hydrogenAmount), GT_Utility.getIntegratedCircuit(i + 1)) - .itemOutputs(Materials.Empty.getCells(hydrogenAmount)) - .fluidInputs(new FluidStack(uncrackedFluid, 1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 800)) - .duration((8 + 4 * i) * SECONDS) - .eut(TierEU.RECIPE_LV) - .addTo(RecipeMaps.chemicalReactorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(aMaterial.getCells(1), GT_Utility.getIntegratedCircuit(i + 1)) - .itemOutputs(Materials.Empty.getCells(1)) - .fluidInputs(Materials.Hydrogen.getGas(hydrogenAmount * 1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 800)) - .duration((8 + 4 * i) * SECONDS) - .eut(TierEU.RECIPE_LV) - .addTo(RecipeMaps.chemicalReactorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(i + 1)) - .fluidInputs(new FluidStack(uncrackedFluid, 1000), Materials.Hydrogen.getGas(hydrogenAmount * 1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 800)) - .duration((4 + 2 * i) * SECONDS) - .eut(TierEU.RECIPE_HV) - .addTo(RecipeMaps.multiblockChemicalReactorRecipes); - } - aMaterial.setHydroCrackedFluids(crackedFluids); - } - - public void addAutoGeneratedSteamCrackedFluids(Materials aMaterial) { - Fluid[] crackedFluids = new Fluid[3]; - String[] namePrefixes = { "lightlysteamcracked.", "moderatelysteamcracked.", "severelysteamcracked." }; - OrePrefixes[] orePrefixes = { OrePrefixes.cellSteamCracked1, OrePrefixes.cellSteamCracked2, - OrePrefixes.cellSteamCracked3 }; - final Fluid uncrackedFluid; - if (aMaterial.mFluid != null) { - uncrackedFluid = aMaterial.mFluid; - } else if (aMaterial.mGas != null) { - uncrackedFluid = aMaterial.mGas; - } else return; - for (int i = 0; i < 3; i++) { - crackedFluids[i] = GT_FluidFactory.builder(namePrefixes[i] + aMaterial.mName.toLowerCase(Locale.ENGLISH)) - .withIconsFrom(uncrackedFluid) - .withLocalizedName(orePrefixes[i].mLocalizedMaterialPre + aMaterial.mDefaultLocalName) - .withColorRGBA(aMaterial.mRGBa) - .withStateAndTemperature(GAS, 775) - .buildAndRegister() - .registerBContainers( - GT_OreDictUnificator.get(orePrefixes[i], aMaterial, 1L), - ItemList.Cell_Empty.get(1L)) - .asFluid(); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(i + 1)) - .fluidInputs(new FluidStack(uncrackedFluid, 1000), GT_ModHandler.getSteam(1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 1200)) - .duration((1 + i) * SECONDS) - .eut(240) - .addTo(crackingRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("steamCell", 1L), GT_Utility.getIntegratedCircuit(i + 1)) - .itemOutputs(Materials.Empty.getCells(1)) - .fluidInputs(new FluidStack(uncrackedFluid, 1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 800)) - .duration((8 + 4 * i) * SECONDS) - .eut(TierEU.RECIPE_LV) - .addTo(RecipeMaps.chemicalReactorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(aMaterial.getCells(1), GT_Utility.getIntegratedCircuit(i + 1)) - .itemOutputs(Materials.Empty.getCells(1)) - .fluidInputs(GT_ModHandler.getSteam(1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 800)) - .duration((8 + 4 * i) * SECONDS) - .eut(TierEU.RECIPE_LV) - .addTo(RecipeMaps.chemicalReactorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(aMaterial.getCells(1), GT_Utility.getIntegratedCircuit(i + 1)) - .itemOutputs(Materials.Empty.getCells(1)) - .fluidInputs(getFluidStack("ic2steam", 1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 800)) - .duration((8 + 4 * i) * SECONDS) - .eut(TierEU.RECIPE_LV) - .addTo(RecipeMaps.chemicalReactorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(i + 1)) - .fluidInputs(new FluidStack(uncrackedFluid, 1000), GT_ModHandler.getSteam(1000)) - .fluidOutputs(new FluidStack(crackedFluids[i], 800)) - .duration((4 + 2 * i) * SECONDS) - .eut(TierEU.RECIPE_HV) - .addTo(RecipeMaps.multiblockChemicalReactorRecipes); - } - aMaterial.setSteamCrackedFluids(crackedFluids); - } - - /** - * @see GT_FluidFactory#of(String, String, Materials, FluidState, int) - * @see GT_FluidFactory#of(String, String, FluidState, int) - * @deprecated use {@link GT_FluidFactory#builder} - */ - @Deprecated - public Fluid addFluid(String aName, String aLocalized, Materials aMaterial, int aState, int aTemperatureK) { - return GT_FluidFactory.of(aName, aLocalized, aMaterial, FluidState.VALID_STATES[aState], aTemperatureK); - } - - /** - * @deprecated use {@link GT_FluidFactory#builder} - */ - @SuppressWarnings({ "MethodWithTooManyParameters" }) // Deprecated method - @Deprecated - public Fluid addFluid(String aName, String aLocalized, Materials aMaterial, int aState, int aTemperatureK, - ItemStack aFullContainer, ItemStack aEmptyContainer, int aFluidAmount) { - return GT_FluidFactory.builder(aName) - .withLocalizedName(aLocalized) - .withStateAndTemperature(FluidState.fromValue(aState), aTemperatureK) - .buildAndRegister() - .configureMaterials(aMaterial) - .registerContainers(aFullContainer, aEmptyContainer, aFluidAmount) - .asFluid(); - } - - /** - * @deprecated use {@link GT_FluidFactory#builder} - */ - @Deprecated - @SuppressWarnings({ "MethodWithTooManyParameters" }) // Deprecated method - public Fluid addFluid(String aName, String aTexture, String aLocalized, Materials aMaterial, short[] aRGBa, - int aState, int aTemperatureK, ItemStack aFullContainer, ItemStack aEmptyContainer, int aFluidAmount) { - return GT_FluidFactory.builder(aName) - .withLocalizedName(aLocalized) - .withStillIconResourceLocation(new ResourceLocation(GregTech.ID, "fluids/fluid." + aTexture)) - .withColorRGBA(aRGBa) - .withStateAndTemperature(FluidState.fromValue(aState), aTemperatureK) - .buildAndRegister() - .configureMaterials(aMaterial) - .registerContainers(aFullContainer, aEmptyContainer, aFluidAmount) - .asFluid(); - } - - public File getSaveDirectory() { - return this.mUniverse == null ? null - : this.mUniverse.getSaveHandler() - .getWorldDirectory(); - } - - public long getAnimationTicks() { - return 0L; - } - - public float getPartialRenderTicks() { - return 0; - } - - public void registerUnificationEntries() { - GT_OreDictUnificator.resetUnificationEntries(); - for (OreDictEventContainer tOre : this.mEvents) { - if ((!(tOre.mEvent.Ore.getItem() instanceof GT_MetaGenerated_Item)) && (tOre.mPrefix != null) - && (tOre.mPrefix.mIsUnificatable) - && (tOre.mMaterial != null)) { - boolean checkModID = tOre.mModID != null; - - if (checkModID) { - if (tOre.mModID.equals(Names.ENDER_I_O)) { - if (tOre.mPrefix == OrePrefixes.ingot && tOre.mMaterial == Materials.DarkSteel) { - GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false); - GT_OreDictUnificator.set( - tOre.mPrefix, - tOre.mMaterial, - tOre.mEvent.Ore, - ManualOreDictTweaks.shouldOredictBeOverwritten(tOre.mModID, tOre.mEvent.Name), - true); - continue; - } - } - } - if (GT_OreDictUnificator.isBlacklisted(tOre.mEvent.Ore)) { - GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, true); - } else { - GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false); - GT_OreDictUnificator.set( - tOre.mPrefix, - tOre.mMaterial, - tOre.mEvent.Ore, - checkModID && ManualOreDictTweaks.shouldOredictBeOverwritten(tOre.mModID, tOre.mEvent.Name), - true); - } - } - } - - for (OreDictEventContainer tOre : this.mEvents) { - if (((tOre.mEvent.Ore.getItem() instanceof GT_MetaGenerated_Item)) && (tOre.mPrefix != null) - && (tOre.mPrefix.mIsUnificatable) - && (tOre.mMaterial != null)) { - if (GT_OreDictUnificator.isBlacklisted(tOre.mEvent.Ore)) { - GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, true); - } else { - GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false); - GT_OreDictUnificator.set( - tOre.mPrefix, - tOre.mMaterial, - tOre.mEvent.Ore, - (tOre.mModID != null) - && ManualOreDictTweaks.shouldOredictBeOverwritten(tOre.mModID, tOre.mEvent.Name), - true); - } - } - } - GregTech_API.sUnificationEntriesRegistered = true; - GT_Recipe.reInit(); - } - - @SuppressWarnings("deprecation") - public void activateOreDictHandler() { - this.mOreDictActivated = true; - ProgressManager.ProgressBar progressBar = ProgressManager.push("Register materials", mEvents.size()); - - if (BetterLoadingScreen.isModLoaded()) { - GT_Values.cls_enabled = true; - try { - GT_CLS_Compat.stepMaterialsCLS(mEvents, progressBar); - } catch (IllegalAccessException e) { - GT_FML_LOGGER.catching(e); - } - } else GT_Proxy.stepMaterialsVanilla(this.mEvents, progressBar); - } - - @Deprecated - public static final HashMap> dimensionWiseChunkData = new HashMap<>(16); // stores - // chunk - // data - // that - // is - // loaded/saved - - public static final HashMap dimensionWisePollution = new HashMap<>(16); // stores - // GT_Polluttors - // objects - public static final byte GTOIL = 3, GTOILFLUID = 2, GTPOLLUTION = 1, GTMETADATA = 0, NOT_LOADED = 0, LOADED = 1; // consts - - // TO get default's fast - @Deprecated - public static int[] getDefaultChunkDataOnCreation() { - return new int[] { NOT_LOADED, 0, -1, -1 }; - } - - @Deprecated - public static int[] getDefaultChunkDataOnLoad() { - return new int[] { LOADED, 0, -1, -1 }; - } - - @SubscribeEvent - public void handleChunkLoadEvent(ChunkDataEvent.Load event) { - GT_UndergroundOil.migrate(event); - GT_Pollution.migrate(event); - } - - @SubscribeEvent - public void onBlockBreakSpeedEvent(PlayerEvent.BreakSpeed aEvent) { - if (aEvent.entityPlayer != null) { - ItemStack aStack = aEvent.entityPlayer.getCurrentEquippedItem(); - if ((aStack != null) && ((aStack.getItem() instanceof GT_MetaGenerated_Tool))) { - aEvent.newSpeed = ((GT_MetaGenerated_Tool) aStack.getItem()).onBlockBreakSpeedEvent( - aEvent.newSpeed, - aStack, - aEvent.entityPlayer, - aEvent.block, - aEvent.x, - aEvent.y, - aEvent.z, - (byte) aEvent.metadata, - aEvent); - } - } - } - - public static class OreDictEventContainer { - - public final OreDictionary.OreRegisterEvent mEvent; - public final OrePrefixes mPrefix; - public final Materials mMaterial; - public final String mModID; - - public OreDictEventContainer(OreDictionary.OreRegisterEvent aEvent, OrePrefixes aPrefix, Materials aMaterial, - String aModID) { - this.mEvent = aEvent; - this.mPrefix = aPrefix; - this.mMaterial = aMaterial; - this.mModID = ((aModID == null) || (aModID.equals("UNKNOWN")) ? null : aModID); - } - } - - @SubscribeEvent - public void onBlockEvent(BlockEvent event) { - if (event.block.getUnlocalizedName() - .equals("blockAlloyGlass")) GregTech_API.causeMachineUpdate(event.world, event.x, event.y, event.z); - } - - public static void addFullHazmatToGeneralItem(String aModID, String aItem, long aAmount, int aMeta) { - ItemStack item = GT_ModHandler.getModItem(aModID, aItem, aAmount, aMeta); - addItemToHazmatLists(item); - } - - public static void addFullHazmatToGeneralItem(String aModID, String aItem, long aAmount) { - ItemStack item = GT_ModHandler.getModItem(aModID, aItem, aAmount, W); - addItemToHazmatLists(item); - } - - public static void addFullHazmatToIC2Item(String aItem) { - ItemStack item = GT_ModHandler.getIC2Item(aItem, 1L, W); - addItemToHazmatLists(item); - } - - private static void addItemToHazmatLists(ItemStack item) { - GregTech_API.sGasHazmatList.add(item); - GregTech_API.sBioHazmatList.add(item); - GregTech_API.sFrostHazmatList.add(item); - GregTech_API.sHeatHazmatList.add(item); - GregTech_API.sRadioHazmatList.add(item); - GregTech_API.sElectroHazmatList.add(item); - } - - public static boolean providesProtection(ItemStack aStack) { - - if (GT_Utility.hasHazmatEnchant(aStack)) return true; - - boolean isGas = GT_Utility.isStackInList(aStack, GregTech_API.sGasHazmatList); - boolean isBio = GT_Utility.isStackInList(aStack, GregTech_API.sBioHazmatList); - boolean isFrost = GT_Utility.isStackInList(aStack, GregTech_API.sFrostHazmatList); - boolean isHeat = GT_Utility.isStackInList(aStack, GregTech_API.sHeatHazmatList); - boolean isRadio = GT_Utility.isStackInList(aStack, GregTech_API.sRadioHazmatList); - boolean isElectro = GT_Utility.isStackInList(aStack, GregTech_API.sElectroHazmatList); - return isGas && isBio && isFrost && isHeat && isRadio && isElectro; - } - - @SubscribeEvent - public void onItemTooltip(ItemTooltipEvent event) { - if (event.itemStack != null) { - ItemStack aStackTemp = event.itemStack; - GT_ItemStack aStack = new GT_ItemStack(aStackTemp); - if (providesProtection(aStackTemp)) { - event.toolTip.add(EnumChatFormatting.LIGHT_PURPLE + "Provides full hazmat protection."); - } - } - } -} diff --git a/src/main/java/gregtech/common/GT_RecipeAdder.java b/src/main/java/gregtech/common/GT_RecipeAdder.java deleted file mode 100644 index 8f48ec19bf..0000000000 --- a/src/main/java/gregtech/common/GT_RecipeAdder.java +++ /dev/null @@ -1,12 +0,0 @@ -package gregtech.common; - -import gregtech.api.interfaces.internal.IGT_RecipeAdder; -import gregtech.api.util.GT_RecipeBuilder; - -public class GT_RecipeAdder implements IGT_RecipeAdder { - - @Override - public GT_RecipeBuilder stdBuilder() { - return GT_RecipeBuilder.builder(); - } -} diff --git a/src/main/java/gregtech/common/GT_Server.java b/src/main/java/gregtech/common/GT_Server.java deleted file mode 100644 index 1a2d8e6b5a..0000000000 --- a/src/main/java/gregtech/common/GT_Server.java +++ /dev/null @@ -1,36 +0,0 @@ -package gregtech.common; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class GT_Server extends GT_Proxy { - - @Override - public boolean isServerSide() { - return true; - } - - @Override - public boolean isClientSide() { - return false; - } - - @Override - public boolean isBukkitSide() { - return false; - } - - @Override - public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) {} - - @Override - public int addArmor(String aPrefix) { - return 0; - } - - @Override - public EntityPlayer getThePlayer() { - return null; - } -} diff --git a/src/main/java/gregtech/common/GT_ThaumcraftCompat.java b/src/main/java/gregtech/common/GT_ThaumcraftCompat.java deleted file mode 100644 index 43c3dce569..0000000000 --- a/src/main/java/gregtech/common/GT_ThaumcraftCompat.java +++ /dev/null @@ -1,285 +0,0 @@ -package gregtech.common; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; - -import gregtech.api.enums.TC_Aspects; -import gregtech.api.interfaces.internal.IThaumcraftCompat; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import thaumcraft.api.ThaumcraftApi; -import thaumcraft.api.ThaumcraftApiHelper; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.crafting.CrucibleRecipe; -import thaumcraft.api.crafting.IArcaneRecipe; -import thaumcraft.api.crafting.InfusionEnchantmentRecipe; -import thaumcraft.api.crafting.InfusionRecipe; -import thaumcraft.api.research.ResearchCategories; -import thaumcraft.api.research.ResearchCategoryList; -import thaumcraft.api.research.ResearchItem; -import thaumcraft.api.research.ResearchPage; - -public class GT_ThaumcraftCompat implements IThaumcraftCompat { - - public GT_ThaumcraftCompat() { - TC_Aspects.AER.mAspect = Aspect.AIR; - TC_Aspects.ALIENIS.mAspect = Aspect.ELDRITCH; - TC_Aspects.AQUA.mAspect = Aspect.WATER; - TC_Aspects.ARBOR.mAspect = Aspect.TREE; - TC_Aspects.AURAM.mAspect = Aspect.AURA; - TC_Aspects.BESTIA.mAspect = Aspect.BEAST; - TC_Aspects.COGNITIO.mAspect = Aspect.MIND; - TC_Aspects.CORPUS.mAspect = Aspect.FLESH; - TC_Aspects.EXANIMIS.mAspect = Aspect.UNDEAD; - TC_Aspects.FABRICO.mAspect = Aspect.CRAFT; - TC_Aspects.FAMES.mAspect = Aspect.HUNGER; - TC_Aspects.GELUM.mAspect = Aspect.COLD; - TC_Aspects.GRANUM.mAspect = Aspect.PLANT; - TC_Aspects.HERBA.mAspect = Aspect.PLANT; - TC_Aspects.HUMANUS.mAspect = Aspect.MAN; - TC_Aspects.IGNIS.mAspect = Aspect.FIRE; - TC_Aspects.INSTRUMENTUM.mAspect = Aspect.TOOL; - TC_Aspects.ITER.mAspect = Aspect.TRAVEL; - TC_Aspects.LIMUS.mAspect = Aspect.SLIME; - TC_Aspects.LUCRUM.mAspect = Aspect.GREED; - TC_Aspects.LUX.mAspect = Aspect.LIGHT; - TC_Aspects.MACHINA.mAspect = Aspect.MECHANISM; - TC_Aspects.MESSIS.mAspect = Aspect.CROP; - TC_Aspects.METALLUM.mAspect = Aspect.METAL; - TC_Aspects.METO.mAspect = Aspect.HARVEST; - TC_Aspects.MORTUUS.mAspect = Aspect.DEATH; - TC_Aspects.MOTUS.mAspect = Aspect.MOTION; - TC_Aspects.ORDO.mAspect = Aspect.ORDER; - TC_Aspects.PANNUS.mAspect = Aspect.CLOTH; - TC_Aspects.PERDITIO.mAspect = Aspect.ENTROPY; - TC_Aspects.PERFODIO.mAspect = Aspect.MINE; - TC_Aspects.PERMUTATIO.mAspect = Aspect.EXCHANGE; - TC_Aspects.POTENTIA.mAspect = Aspect.ENERGY; - TC_Aspects.PRAECANTATIO.mAspect = Aspect.MAGIC; - TC_Aspects.SANO.mAspect = Aspect.HEAL; - TC_Aspects.SENSUS.mAspect = Aspect.SENSES; - TC_Aspects.SPIRITUS.mAspect = Aspect.SOUL; - TC_Aspects.TELUM.mAspect = Aspect.WEAPON; - TC_Aspects.TERRA.mAspect = Aspect.EARTH; - TC_Aspects.TEMPESTAS.mAspect = Aspect.WEATHER; - TC_Aspects.TENEBRAE.mAspect = Aspect.DARKNESS; - TC_Aspects.TUTAMEN.mAspect = Aspect.ARMOR; - TC_Aspects.VACUOS.mAspect = Aspect.VOID; - TC_Aspects.VENENUM.mAspect = Aspect.POISON; - TC_Aspects.VICTUS.mAspect = Aspect.LIFE; - TC_Aspects.VINCULUM.mAspect = Aspect.TRAP; - TC_Aspects.VITIUM.mAspect = Aspect.TAINT; - TC_Aspects.VITREUS.mAspect = Aspect.CRYSTAL; - TC_Aspects.VOLATUS.mAspect = Aspect.FLIGHT; - - TC_Aspects.STRONTIO.mAspect = new Aspect( - "strontio", - 0xEEC2B3, - new Aspect[] { Aspect.MIND, Aspect.ENTROPY }, - new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.STRONTIO.name() + ".png"), - 1); - TC_Aspects.NEBRISUM.mAspect = new Aspect( - "nebrisum", - 0xEEEE7E, - new Aspect[] { Aspect.MINE, Aspect.GREED }, - new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.NEBRISUM.name() + ".png"), - 1); - TC_Aspects.ELECTRUM.mAspect = new Aspect( - "electrum", - 0xC0EEEE, - new Aspect[] { Aspect.ENERGY, Aspect.MECHANISM }, - new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.ELECTRUM.name() + ".png"), - 1); - TC_Aspects.MAGNETO.mAspect = new Aspect( - "magneto", - 0xC0C0C0, - new Aspect[] { Aspect.METAL, Aspect.TRAVEL }, - new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.MAGNETO.name() + ".png"), - 1); - TC_Aspects.RADIO.mAspect = new Aspect( - "radio", - 0xC0FFC0, - new Aspect[] { Aspect.LIGHT, Aspect.ENERGY }, - new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.RADIO.name() + ".png"), - 1); - - GT_LanguageManager.addStringLocalization("tc.aspect.strontio", "Stupidness, Incompetence"); - GT_LanguageManager.addStringLocalization("tc.aspect.nebrisum", "Cheatyness, Raiding"); - GT_LanguageManager.addStringLocalization("tc.aspect.electrum", "Electricity, Lightning"); - GT_LanguageManager.addStringLocalization("tc.aspect.magneto", "Magnetism, Attraction"); - GT_LanguageManager.addStringLocalization("tc.aspect.radio", "Radiation"); - } - - private static AspectList getAspectList(List aAspects) { - AspectList rAspects = new AspectList(); - TC_Aspects.TC_AspectStack tAspect; - for (Iterator i$ = aAspects.iterator(); i$.hasNext(); rAspects - .add((Aspect) tAspect.mAspect.mAspect, (int) tAspect.mAmount)) { - tAspect = i$.next(); - } - return rAspects; - } - - @Override - public Object addResearch(String aResearch, String aName, String aText, String[] aParentResearches, - String aCategory, ItemStack aIcon, int aComplexity, int aType, int aX, int aY, - List aAspects, ItemStack[] aResearchTriggers, Object[] aPages) { - ResearchCategoryList tCategory = ResearchCategories.getResearchList(aCategory); - if (tCategory == null) { - return null; - } - for (ResearchItem tResearch : tCategory.research.values()) { - if ((tResearch.displayColumn == aX) && (tResearch.displayRow == aY)) { - aX += (aX > 0 ? 5 : -5); - aY += (aY > 0 ? 5 : -5); - } - } - ResearchItem rResearch = new ResearchItem( - aResearch, - aCategory, - getAspectList(aAspects), - aX, - aY, - aComplexity, - aIcon); - ArrayList tPages = new ArrayList<>(aPages.length); - GT_LanguageManager.addStringLocalization("tc.research_name." + aResearch, aName); - GT_LanguageManager.addStringLocalization("tc.research_text." + aResearch, "[GT] " + aText); - for (Object tPage : aPages) { - if ((tPage instanceof String)) { - tPages.add(new ResearchPage((String) tPage)); - } else if ((tPage instanceof IRecipe)) { - tPages.add(new ResearchPage((IRecipe) tPage)); - } else if ((tPage instanceof IArcaneRecipe)) { - tPages.add(new ResearchPage((IArcaneRecipe) tPage)); - } else if ((tPage instanceof CrucibleRecipe)) { - tPages.add(new ResearchPage((CrucibleRecipe) tPage)); - } else if ((tPage instanceof InfusionRecipe)) { - tPages.add(new ResearchPage((InfusionRecipe) tPage)); - } else if ((tPage instanceof InfusionEnchantmentRecipe)) { - tPages.add(new ResearchPage((InfusionEnchantmentRecipe) tPage)); - } - } - if ((aType & 0x40) != 0) { - rResearch.setAutoUnlock(); - } - if ((aType & 0x1) != 0) { - rResearch.setSecondary(); - } - if ((aType & 0x20) != 0) { - rResearch.setSpecial(); - } - if ((aType & 0x8) != 0) { - rResearch.setVirtual(); - } - if ((aType & 0x4) != 0) { - rResearch.setHidden(); - } - if ((aType & 0x10) != 0) { - rResearch.setRound(); - } - if ((aType & 0x2) != 0) { - rResearch.setStub(); - } - if (aParentResearches != null) { - ArrayList tParentResearches = new ArrayList<>(); - Collections.addAll(tParentResearches, aParentResearches); - if (tParentResearches.size() > 0) { - rResearch.setParents(tParentResearches.toArray(new String[0])); - rResearch.setConcealed(); - } - } - if (aResearchTriggers != null) { - rResearch.setItemTriggers(aResearchTriggers); - rResearch.setHidden(); - } - rResearch.setPages(tPages.toArray(new ResearchPage[0])); - return rResearch.registerResearchItem(); - } - - @Override - public Object addCrucibleRecipe(String aResearch, Object aInput, ItemStack aOutput, - List aAspects) { - if ((GT_Utility.isStringInvalid(aResearch)) || (aInput == null) - || (aOutput == null) - || (aAspects == null) - || (aAspects.isEmpty())) { - return null; - } - return ThaumcraftApi.addCrucibleRecipe( - aResearch, - GT_Utility.copyOrNull(aOutput), - ((aInput instanceof ItemStack)) || ((aInput instanceof ArrayList)) ? aInput : aInput.toString(), - getAspectList(aAspects)); - } - - @Override - public Object addInfusionRecipe(String aResearch, ItemStack aMainInput, ItemStack[] aSideInputs, ItemStack aOutput, - int aInstability, List aAspects) { - if ((GT_Utility.isStringInvalid(aResearch)) || (aMainInput == null) - || (aSideInputs == null) - || (aOutput == null) - || (aAspects == null) - || (aAspects.isEmpty())) { - return null; - } - return ThaumcraftApi.addInfusionCraftingRecipe( - aResearch, - GT_Utility.copyOrNull(aOutput), - aInstability, - getAspectList(aAspects), - aMainInput, - aSideInputs); - } - - @Override - public Object addInfusionEnchantmentRecipe(String aResearch, Enchantment aEnchantment, int aInstability, - List aAspects, ItemStack[] aSideInputs) { - if ((GT_Utility.isStringInvalid(aResearch)) || (aSideInputs == null) - || (aAspects == null) - || (aEnchantment == null) - || (aAspects.isEmpty())) { - return null; - } - return ThaumcraftApi - .addInfusionEnchantmentRecipe(aResearch, aEnchantment, aInstability, getAspectList(aAspects), aSideInputs); - } - - @Override - public boolean registerThaumcraftAspectsToItem(ItemStack aExampleStack, List aAspects, - String aOreDict) { - if (aAspects.isEmpty()) return false; - ThaumcraftApi.registerObjectTag(aOreDict, getAspectList(aAspects)); - return true; - } - - @Override - public boolean registerThaumcraftAspectsToItem(ItemStack aStack, List aAspects, - boolean aAdditive) { - if (aAspects.isEmpty()) return false; - if (aAdditive) { - ThaumcraftApi.registerComplexObjectTag(aStack, getAspectList(aAspects)); - return true; - } - AspectList tAlreadyRegisteredAspects = ThaumcraftApiHelper.getObjectAspects(aStack); - if (tAlreadyRegisteredAspects == null || tAlreadyRegisteredAspects.size() <= 0) { - ThaumcraftApi.registerObjectTag(aStack, getAspectList(aAspects)); - } - return true; - } - - @Override - public boolean registerPortholeBlacklistedBlock(Block aBlock) { - ThaumcraftApi.portableHoleBlackList.add(aBlock); - return true; - } -} diff --git a/src/main/java/gregtech/common/GT_UndergroundOil.java b/src/main/java/gregtech/common/GT_UndergroundOil.java deleted file mode 100644 index 17a5662c09..0000000000 --- a/src/main/java/gregtech/common/GT_UndergroundOil.java +++ /dev/null @@ -1,339 +0,0 @@ -package gregtech.common; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.Objects; -import java.util.WeakHashMap; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.event.world.ChunkDataEvent; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.apache.commons.lang3.tuple.Pair; - -import gregtech.GT_Mod; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.objects.GT_UO_Dimension; -import gregtech.api.objects.GT_UO_Fluid; -import gregtech.api.objects.XSTR; -import gregtech.api.util.GT_ChunkAssociatedData; - -/** - * Created by Tec on 29.04.2017. - */ -public class GT_UndergroundOil { - - public static final short DIVIDER = 5000; - private static final GT_UndergroundOilStore STORAGE = new GT_UndergroundOilStore(); - private static final ChunkData NIL_FLUID_STACK = new ChunkData(-1, null, null, false); - - /** - * Effectively just call {@code undergroundOil(te, -1)} for you - * - * @see #undergroundOil(World, int, int, float) - */ - public static FluidStack undergroundOilReadInformation(IGregTechTileEntity te) { - return undergroundOil( - te.getWorld() - .getChunkFromBlockCoords(te.getXCoord(), te.getZCoord()), - -1); - } - - /** - * Effectively just call {@code undergroundOil(chunk, -1)} for you - * - * @see #undergroundOil(World, int, int, float) - */ - public static FluidStack undergroundOilReadInformation(Chunk chunk) { - return undergroundOil(chunk, -1); - } - - /** @see #undergroundOil(World, int, int, float) */ - public static FluidStack undergroundOil(IGregTechTileEntity te, float readOrDrainCoefficient) { - return undergroundOil( - te.getWorld() - .getChunkFromBlockCoords(te.getXCoord(), te.getZCoord()), - readOrDrainCoefficient); - } - - // Returns whole content for information purposes -> when drainSpeedCoefficient < 0 - // Else returns extracted fluidStack if amount > 0, or null otherwise - /** @see #undergroundOil(World, int, int, float) */ - public static FluidStack undergroundOil(Chunk chunk, float readOrDrainCoefficient) { - return undergroundOil(chunk.worldObj, chunk.xPosition, chunk.zPosition, readOrDrainCoefficient); - } - - /** - * Pump fluid or read info. - * - * @param w a remote World. For a WorldClient it will always tell you null - * @param chunkX chunk coordinate X, i.e. blockX >> 4 - * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4 - * @param readOrDrainCoefficient how fast to pump. The higher the faster. use negative to read expected current - * output - * @return null if nothing here, or depleted already, or a client side world - */ - public static FluidStack undergroundOil(World w, int chunkX, int chunkZ, float readOrDrainCoefficient) { - if (w.isRemote) return null; // troublemakers go away - ChunkData chunkData = STORAGE.get(w, chunkX, chunkZ); - if (chunkData.getVein() == null || chunkData.getFluid() == null) // nothing here... - return null; - // do stuff on it if needed - FluidStack fluidInChunk = new FluidStack(chunkData.getFluid(), 0); - if (readOrDrainCoefficient >= 0) { - int fluidExtracted = (int) Math.floor(chunkData.getAmount() * (double) readOrDrainCoefficient / DIVIDER); - double averageDecrease = chunkData.getVein().DecreasePerOperationAmount * (double) readOrDrainCoefficient; - int decrease = (int) Math.ceil(averageDecrease); - if (fluidExtracted <= 0 || chunkData.amount <= decrease) { // decrease - here it is max value of extraction - // for easy check - chunkData.setAmount(0); - } else { - fluidInChunk.amount = fluidExtracted; // give appropriate amount - if (XSTR_INSTANCE.nextFloat() < (decrease - averageDecrease)) decrease--; // use XSTR_INSTANCE to - // "subtract double from int" - // ex. - // averageDecrease=3.9 - // decrease= ceil from 3.9 = 4 - // decrease-averageDecrease=0.1 -> chance to subtract 1 - // if XSTR_INSTANCE is < chance then subtract 1 - chunkData.changeAmount(-decrease); // diminish amount, "randomly" adjusted to double value - // (averageDecrease) - } - } else { // just get info - if (chunkData.amount <= DIVIDER) { - chunkData.setAmount(0); - } else { - // get the expected current output - fluidInChunk.amount = (int) Math - .floor(chunkData.getAmount() * (double) -readOrDrainCoefficient / DIVIDER); - } - } - return fluidInChunk; - } - - /** - * Get the deposit as if it is never exploited - * - * @return UO fluid kind and amount, or null if nothing here. - */ - public static Pair getPristineAmount(World world, int chunkX, int chunkZ) { - int dimensionId = world.provider.dimensionId; - GT_UO_Dimension dimension = GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(dimensionId); - if (dimension == null) return null; - // prepare RNG - final XSTR tVeinRNG = new XSTR(world.getSeed() + dimensionId * 2L + (chunkX >> 3) + 8267L * (chunkZ >> 3)); - GT_UO_Fluid uoFluid = dimension.getRandomFluid(tVeinRNG); - // nothing here :( - if (uoFluid == null || uoFluid.getFluid() == null) return null; - // offset each chunk's fluid amount by +-25% - // discard random values not for current chunk - int veinAverage = uoFluid.getRandomAmount(tVeinRNG); - for (int i = 0; i < (((chunkX & 0x7) << 3) | chunkZ & 0x7); i++) { - tVeinRNG.next(24); - } - int amount = (int) ((float) veinAverage * (0.75f + (tVeinRNG.nextFloat() / 2f))); - return Pair.of(uoFluid, amount); - } - - static void migrate(ChunkDataEvent.Load e) { - if (e.getData() - .hasKey("GTOIL") - && e.getData() - .hasKey("GTOILFLUID")) { - ChunkData chunkData = STORAGE.get(e.getChunk()); - Fluid fluid = chunkData.getFluid(); - if (fluid != null && fluid.getID() == e.getData() - .getInteger("GTOILFLUID")) chunkData.setAmount( - Math.min( - chunkData.getAmount(), - e.getData() - .getInteger("GTOIL"))); - } - } - - /** - * Revamped UO store. - *

- * Primary functionality: - * - *

    - *
  • Decouple data storage with chunk, making it possible to pump oil from unloaded chunks
  • - *
  • Regen detection. If fluid generation config is changed, chunk fluid will be regenerated.
  • - *
- * - *

Serialized form

- *

- * Since the exact file layout is controlled by the super class, here we only concern how each chunk's data is - * written. - *

Form A: Empty Chunk

- *
    - *
  1. 4 bytes of 0
  2. - *
- * - *

Form B: Normal Chunk

- *
    - *
  1. 4 bytes unsigned integer. Vein Hash.
  2. - *
  3. UTF string. Vein Key.
  4. - *
  5. 4 bytes signed integer. Fluid amount.
  6. - *
- * - * @author glease - */ - @ParametersAreNonnullByDefault - private static class GT_UndergroundOilStore extends GT_ChunkAssociatedData { - - private static final WeakHashMap hashes = new WeakHashMap<>(); - - private GT_UndergroundOilStore() { - super("UO", GT_UndergroundOil.ChunkData.class, 64, (byte) 0, false); - } - - @Override - protected void writeElement(DataOutput output, ChunkData element, World world, int chunkX, int chunkZ) - throws IOException { - /* see class javadoc for explanation */ - output.writeInt(element.getVeinHash()); - if (element.getVeinKey() == null) return; - output.writeUTF(element.getVeinKey()); - if (element.getAmount() > 0 && element.getFluid() != null) { - output.writeInt(element.getAmount()); - } else { - output.writeInt(-1); - } - } - - @Override - protected GT_UndergroundOil.ChunkData readElement(DataInput input, int version, World world, int chunkX, - int chunkZ) throws IOException { - /* see class javadoc for explanation */ - if (version != 0) throw new IOException("Region file corrupted"); - GT_UndergroundOil.ChunkData pristine = createElement(world, chunkX, chunkZ); - int hash = input.readInt(); - String veinKey = hash != 0 ? input.readUTF() : null; - int amount = hash != 0 ? input.readInt() : -1; - if (hash != pristine.veinHash || !Objects.equals(veinKey, pristine.getVeinKey())) { - // vein config changed. use regen-ed data. - return pristine; - } - if (hash == 0) return NIL_FLUID_STACK; - return new GT_UndergroundOil.ChunkData( - amount, - GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(world.provider.dimensionId) - .getUOFluid(veinKey), - veinKey); - } - - @Override - protected GT_UndergroundOil.ChunkData createElement(World world, int chunkX, int chunkZ) { - Pair pristine = getPristineAmount(world, chunkX, chunkZ); - if (pristine == null) return NIL_FLUID_STACK; - int dimensionId = world.provider.dimensionId; - GT_UO_Dimension dimension = GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(dimensionId); - return new GT_UndergroundOil.ChunkData( - pristine.getRight(), - pristine.getLeft(), - dimension.getUOFluidKey(pristine.getLeft()), - false); - } - - private static int hash(@Nullable GT_UO_Fluid fluid) { - if (fluid == null) return 0; - int result = fluid.Registry.hashCode(); - result = 31 * result + fluid.MaxAmount; - result = 31 * result + fluid.MinAmount; - result = 31 * result + fluid.Chance; - result = 31 * result + fluid.DecreasePerOperationAmount; - return result == 0 ? 1 : result; - } - } - - /** - * Represent the amount of fluid in a given chunk. - */ - private static final class ChunkData implements GT_ChunkAssociatedData.IData { - - private final Fluid fluid; - - @Nullable - private final GT_UO_Fluid vein; - - private final String veinKey; - private final int veinHash; - private int amount; - private boolean dirty; - - private ChunkData(int amount, GT_UO_Fluid veinKey, String veinID) { - this(amount, veinKey, veinID, true); - } - - private ChunkData(int amount, @Nullable GT_UO_Fluid vein, @Nullable String veinKey, boolean dirty) { - this.amount = amount; - this.vein = vein; - this.dirty = dirty; - if (vein == null) { - fluid = null; - this.veinKey = null; - veinHash = 0; - } else { - fluid = vein.getFluid(); - this.veinKey = veinKey; - veinHash = GT_UndergroundOilStore.hashes.computeIfAbsent(vein, GT_UndergroundOilStore::hash); - } - } - - /** - * The current fluid type. {@code null} if vein is generated to be empty. - */ - @Nullable - public Fluid getFluid() { - return fluid; - } - - /** - * Current fluid amount. Might be 0 if empty. Cannot be negative - */ - public int getAmount() { - return amount; - } - - public void setAmount(int amount) { - if (this.amount != amount) dirty = true; - this.amount = Math.max(0, amount); - } - - public void changeAmount(int delta) { - if (delta != 0) dirty = true; - this.amount = Math.max(amount + delta, 0); - } - - @Nullable - public GT_UO_Fluid getVein() { - return vein; - } - - /** - * The vein ID. Might be null if generated to be empty. - */ - @Nullable - public String getVeinKey() { - return veinKey; - } - - public int getVeinHash() { - return veinHash; - } - - @Override - public boolean isSameAsDefault() { - return !dirty; - } - } -} diff --git a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java deleted file mode 100644 index 718b682916..0000000000 --- a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java +++ /dev/null @@ -1,442 +0,0 @@ -package gregtech.common; - -import static gregtech.api.enums.GT_Values.debugOrevein; -import static gregtech.api.enums.GT_Values.oreveinPlacerOres; -import static gregtech.api.enums.GT_Values.oreveinPlacerOresMultiplier; - -import java.util.ArrayList; -import java.util.List; -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.WorldProviderEnd; -import net.minecraft.world.WorldProviderHell; -import net.minecraft.world.WorldProviderSurface; -import net.minecraft.world.chunk.IChunkProvider; - -import bloodasp.galacticgreg.api.enums.DimensionDef; -import gregtech.api.GregTech_API; -import gregtech.api.util.GT_Log; -import gregtech.api.world.GT_Worldgen; -import gregtech.common.blocks.GT_TileEntity_Ores; - -public class GT_Worldgen_GT_Ore_Layer extends GT_Worldgen { - - public static ArrayList sList = new ArrayList<>(); - public static int sWeight = 0; - public final short mMinY; - public final short mMaxY; - public final short mWeight; - public final short mDensity; - public final short mSize; - public final short mPrimaryMeta; - public final short mSecondaryMeta; - public final short mBetweenMeta; - public final short mSporadicMeta; - public final String mRestrictBiome; - public final boolean mOverworld; - public final boolean mNether; - public final boolean mEnd; - public final boolean mEndAsteroid; - public final boolean twilightForest; - 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 Class[] mAllowedProviders; - - public GT_Worldgen_GT_Ore_Layer(OreMixBuilder mix) { - super(mix.oreMixName, sList, mix.enabledByDefault); - this.mOverworld = mix.dimsEnabled.getOrDefault(OreMixBuilder.OW, false); - this.mNether = mix.dimsEnabled.getOrDefault(OreMixBuilder.NETHER, false); - this.mEnd = mix.dimsEnabled.getOrDefault(OreMixBuilder.THE_END, false); - this.mEndAsteroid = mix.dimsEnabled - .getOrDefault(DimensionDef.EndAsteroids.modDimensionDef.getDimensionName(), false); - this.twilightForest = mix.dimsEnabled.getOrDefault(OreMixBuilder.TWILIGHT_FOREST, false); - this.mMinY = ((short) mix.minY); - short mMaxY = ((short) mix.maxY); - if (mMaxY < (this.mMinY + 9)) { - GT_Log.out.println("Oremix " + this.mWorldGenName + " has invalid Min/Max heights!"); - mMaxY = (short) (this.mMinY + 9); - } - this.mMaxY = mMaxY; - this.mWeight = (short) mix.weight; - this.mDensity = (short) mix.density; - this.mSize = (short) Math.max(1, mix.size); - this.mPrimaryMeta = (short) mix.primary.mMetaItemSubID; - this.mSecondaryMeta = (short) mix.secondary.mMetaItemSubID; - this.mBetweenMeta = (short) mix.between.mMetaItemSubID; - this.mSporadicMeta = (short) mix.sporadic.mMetaItemSubID; - this.mRestrictBiome = "None"; - - if (this.mEnabled) { - sWeight += this.mWeight; - } - - List allowedProviders = new ArrayList<>(); - if (this.mNether) { - allowedProviders.add(WorldProviderHell.class); - } - - if (this.mOverworld) { - allowedProviders.add(WorldProviderSurface.class); - } - - if (this.mEnd) { - allowedProviders.add(WorldProviderEnd.class); - } - mAllowedProviders = allowedProviders.toArray(new Class[allowedProviders.size()]); - } - - @Override - public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, - int aChunkZ, int aSeedX, int aSeedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { - if (mWorldGenName.equals("NoOresInVein")) { - if (debugOrevein) GT_Log.out.println(" NoOresInVein"); - // Return a special empty orevein - return ORE_PLACED; - } - - if (!isGenerationAllowed(aWorld, mAllowedProviders)) { - // The following code can be used for debugging, but it spams in logs - // if (debugOrevein) { GT_Log.out.println( "Wrong dimension" ); } - return WRONG_DIMENSION; - } - - if (!this.mRestrictBiome.equals("None") && !(this.mRestrictBiome.equals(aBiome))) { - return WRONG_BIOME; - } - // For optimal performance, this should be done upstream. Meh - String tDimensionName = aWorld.provider.getDimensionName(); - boolean isUnderdark = tDimensionName.equals("Underdark"); - - int[] placeCount = new int[4]; - - int tMinY = mMinY + aRandom.nextInt(mMaxY - mMinY - 5); - // Determine West/East ends of orevein - int wXVein = aSeedX - aRandom.nextInt(mSize); // West side - int eXVein = aSeedX + 16 + aRandom.nextInt(mSize); - // Limit Orevein to only blocks present in current chunk - int wX = Math.max(wXVein, aChunkX + 2); // Bias placement by 2 blocks to prevent worldgen cascade. - int eX = Math.min(eXVein, aChunkX + 2 + 16); - - // Get a block at the center of the chunk and the bottom of the orevein. - Block tBlock = aWorld.getBlock(aChunkX + 7, tMinY, aChunkZ + 9); - - if (wX >= eX) { // No overlap between orevein and this chunk exists in X - if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.stone) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.netherrack) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.end_stone) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockGranites) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockStones)) { - // Didn't reach, but could have placed. Save orevein for future use. - return NO_OVERLAP; - } else { - // Didn't reach, but couldn't place in test spot anywys, try for another orevein - return NO_OVERLAP_AIR_BLOCK; - } - } - // Determine North/Sound ends of orevein - int nZVein = aSeedZ - aRandom.nextInt(mSize); - int sZVein = aSeedZ + 16 + aRandom.nextInt(mSize); - - int nZ = Math.max(nZVein, aChunkZ + 2); // Bias placement by 2 blocks to prevent worldgen cascade. - int sZ = Math.min(sZVein, aChunkZ + 2 + 16); - if (nZ >= sZ) { // No overlap between orevein and this chunk exists in Z - if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.stone) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.netherrack) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.end_stone) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockGranites) - || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockStones)) { - // Didn't reach, but could have placed. Save orevein for future use. - return NO_OVERLAP; - } else { - // Didn't reach, but couldn't place in test spot anywys, try for another orevein - return NO_OVERLAP_AIR_BLOCK; - } - } - - if (debugOrevein) { - GT_Log.out.print( - "Trying Orevein:" + this.mWorldGenName - + " Dimension=" - + tDimensionName - + " mX=" - + aChunkX / 16 - + " mZ=" - + aChunkZ / 16 - + " oreseedX=" - + aSeedX / 16 - + " oreseedZ=" - + aSeedZ / 16 - + " cY=" - + tMinY); - } - // Adjust the density down the more chunks we are away from the oreseed. The 5 chunks surrounding the seed - // should always be max density due to truncation of Math.sqrt(). - int localDensity = Math.max( - 1, - this.mDensity / ((int) Math - .sqrt(2 + Math.pow(aChunkX / 16 - aSeedX / 16, 2) + Math.pow(aChunkZ / 16 - aSeedZ / 16, 2)))); - - // To allow for early exit due to no ore placed in the bottom layer (probably because we are in the sky), unroll - // 1 pass through the loop - // Now we do bottom-level-first oregen, and work our way upwards. - // Layer -1 Secondary and Sporadic - int level = tMinY - 1; // Dunno why, but the first layer is actually played one below tMinY. Go figure. - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math - .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mSecondaryMeta > 0)) { - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) { - placeCount[1]++; - } - } else - if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - if ((placeCount[1] + placeCount[3]) == 0) { - if (debugOrevein) GT_Log.out.println(" No ore in bottom layer"); - return NO_ORE_IN_BOTTOM_LAYER; // Exit early, didn't place anything in the bottom layer - } - // Layers 0 & 1 Secondary and Sporadic - for (level = tMinY; level < (tMinY + 2); level++) { - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math.max( - 1, - Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSecondaryMeta > 0)) { - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) { - placeCount[1]++; - } - } else if ((aRandom.nextInt(7) == 0) - && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - } - // Layer 2 is Secondary, in-between, and sporadic - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math - .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate - if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { - placeCount[2]++; - } - } else if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSecondaryMeta > 0)) { - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) { - placeCount[1]++; - } - } else - if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - level++; // Increment level to next layer - // Layer 3 is In-between, and sporadic - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math - .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate - if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { - placeCount[2]++; - } - } else - if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - level++; // Increment level to next layer - // Layer 4 is In-between, Primary and sporadic - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math - .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate - if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { - placeCount[2]++; - } - } else - if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { - placeCount[1]++; - } - } else if ((aRandom.nextInt(7) == 0) - && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - level++; // Increment level to next layer - // Layer 5 is In-between, Primary and sporadic - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math - .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate - if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { - placeCount[2]++; - } - } else - if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { - placeCount[1]++; - } - } else if ((aRandom.nextInt(7) == 0) - && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - level++; // Increment level to next layer - // Layer 6 is Primary and sporadic - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math - .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { - if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { - placeCount[1]++; - } - } else - if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - level++; // Increment level to next layer - // Layer 7 is Primary and sporadic - for (int tX = wX; tX < eX; tX++) { - int placeX = Math - .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); - for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math - .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); - if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { - if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { - placeCount[1]++; - } - } else - if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) - && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate - if (GT_TileEntity_Ores - .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) - placeCount[3]++; - } - } - } - // Place small ores for the vein - if (oreveinPlacerOres) { - int nSmallOres = (eX - wX) * (sZ - nZ) * this.mDensity / 10 * oreveinPlacerOresMultiplier; - // Small ores are placed in the whole chunk in which the vein appears. - for (int nSmallOresCount = 0; nSmallOresCount < nSmallOres; nSmallOresCount++) { - int tX = aRandom.nextInt(16) + aChunkX + 2; - int tZ = aRandom.nextInt(16) + aChunkZ + 2; - int tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores. - if (this.mPrimaryMeta > 0) - GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mPrimaryMeta, true, isUnderdark); - tX = aRandom.nextInt(16) + aChunkX + 2; - tZ = aRandom.nextInt(16) + aChunkZ + 2; - tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores. - if (this.mSecondaryMeta > 0) - GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mSecondaryMeta, true, isUnderdark); - tX = aRandom.nextInt(16) + aChunkX + 2; - tZ = aRandom.nextInt(16) + aChunkZ + 2; - tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores. - if (this.mBetweenMeta > 0) - GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mBetweenMeta, true, isUnderdark); - tX = aRandom.nextInt(16) + aChunkX + 2; - tZ = aRandom.nextInt(16) + aChunkZ + 2; - tY = aRandom.nextInt(190) + 10; // Y height can vary from 10 to 200 for small ores. - if (this.mSporadicMeta > 0) - GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mSporadicMeta, true, isUnderdark); - } - } - if (debugOrevein) { - GT_Log.out.println( - " wXVein" + wXVein - + " eXVein" - + eXVein - + " nZVein" - + nZVein - + " sZVein" - + sZVein - + " locDen=" - + localDensity - + " Den=" - + this.mDensity - + " Sec=" - + placeCount[1] - + " Spo=" - + placeCount[3] - + " Bet=" - + placeCount[2] - + " Pri=" - + placeCount[0]); - } - // Something (at least the bottom layer must have 1 block) must have been placed, return true - return ORE_PLACED; - } -} diff --git a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java deleted file mode 100644 index ef01c2ea0f..0000000000 --- a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java +++ /dev/null @@ -1,107 +0,0 @@ -package gregtech.common; - -import static gregtech.api.enums.GT_Values.debugSmallOres; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.WorldProviderEnd; -import net.minecraft.world.WorldProviderHell; -import net.minecraft.world.WorldProviderSurface; -import net.minecraft.world.chunk.IChunkProvider; - -import gregtech.api.GregTech_API; -import gregtech.api.util.GT_Log; -import gregtech.api.world.GT_Worldgen; -import gregtech.common.blocks.GT_TileEntity_Ores; - -public class GT_Worldgen_GT_Ore_SmallPieces extends GT_Worldgen { - - public final short mMinY; - public final short mMaxY; - public final short mAmount; - public final short mMeta; - public final boolean mOverworld; - public final boolean mNether; - public final boolean mEnd; - public final boolean twilightForest; - public final String mBiome; - public static ArrayList sList = new ArrayList<>(); - - public Class[] mAllowedProviders; - - public GT_Worldgen_GT_Ore_SmallPieces(SmallOreBuilder ore) { - super(ore.smallOreName, GregTech_API.sWorldgenList, ore.enabledByDefault); - this.mOverworld = ore.dimsEnabled.getOrDefault(SmallOreBuilder.OW, false); - this.mNether = ore.dimsEnabled.getOrDefault(SmallOreBuilder.NETHER, false); - this.mEnd = ore.dimsEnabled.getOrDefault(SmallOreBuilder.THE_END, false); - this.twilightForest = ore.dimsEnabled.getOrDefault(SmallOreBuilder.TWILIGHT_FOREST, false); - - this.mMinY = (short) ore.minY; - this.mMaxY = (short) Math.max(this.mMinY + 1, ore.maxY); - this.mAmount = (short) Math.max(1, ore.amount); - this.mMeta = (short) ore.ore.mMetaItemSubID; - this.mBiome = "None"; - - if (this.mEnabled) sList.add(this); - - List allowedProviders = new ArrayList<>(); - if (this.mNether) { - allowedProviders.add(WorldProviderHell.class); - } - - if (this.mOverworld) { - allowedProviders.add(WorldProviderSurface.class); - } - - if (this.mEnd) { - allowedProviders.add(WorldProviderEnd.class); - } - mAllowedProviders = allowedProviders.toArray(new Class[allowedProviders.size()]); - } - - @Override - public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, - int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { - if (!this.mBiome.equals("None") && !(this.mBiome.equals(aBiome))) { - return false; // Not the correct biome for ore mix - } - if (!isGenerationAllowed(aWorld, mAllowedProviders)) { - return false; - } - int count = 0; - // For optimal performance, this should be done upstream. Meh - String tDimensionName = aWorld.provider.getDimensionName(); - boolean isUnderdark = tDimensionName.equals("Underdark"); - - if (this.mMeta > 0) { - int j = Math.max(1, this.mAmount / 2 + aRandom.nextInt(this.mAmount) / 2); - for (int i = 0; i < j; i++) { - GT_TileEntity_Ores.setOreBlock( - aWorld, - aChunkX + 8 + aRandom.nextInt(16), - this.mMinY + aRandom.nextInt(Math.max(1, this.mMaxY - this.mMinY)), - aChunkZ + 8 + aRandom.nextInt(16), - this.mMeta, - true, - isUnderdark); - count++; - } - } - if (debugSmallOres) { - GT_Log.out.println( - "Small Ore:" + this.mWorldGenName - + " @ dim=" - + aDimensionType - + " mX=" - + aChunkX / 16 - + " mZ=" - + aChunkZ / 16 - + " ore=" - + count); - } - return true; - } -} diff --git a/src/main/java/gregtech/common/GT_Worldgen_Stone.java b/src/main/java/gregtech/common/GT_Worldgen_Stone.java deleted file mode 100644 index 97621865bc..0000000000 --- a/src/main/java/gregtech/common/GT_Worldgen_Stone.java +++ /dev/null @@ -1,297 +0,0 @@ -package gregtech.common; - -import static gregtech.api.enums.GT_Values.debugStones; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Hashtable; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraft.world.chunk.IChunkProvider; - -import gregtech.api.GregTech_API; -import gregtech.api.objects.XSTR; -import gregtech.api.util.GT_Log; -import gregtech.api.world.GT_Worldgen; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import gregtech.common.blocks.GT_TileEntity_Ores; - -public class GT_Worldgen_Stone extends GT_Worldgen { - - static final double[] sizeConversion = { 1, 1, 1.333333, 1.333333, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; // Bias - // the - // sizes - // towards - // skinnier - // boulders, - // ie - // more - // "shafts" - // than - // dikes - // or - // sills. - - public final int mBlockMeta, mAmount, mSize, mMinY, mMaxY, mProbability, mDimensionType; - public final Block mBlock; - public final Collection mBiomeList; - public final boolean mAllowToGenerateinVoid; - private final String aTextWorldgen = "worldgen."; - - public Hashtable validStoneSeeds = new Hashtable<>(1024); - - static class StoneSeeds { - - public boolean mExists; - - StoneSeeds(boolean exists) { - mExists = exists; - } - } - - static class ValidSeeds { - - public int mX; - public int mZ; - - ValidSeeds(int x, int z) { - this.mX = x; - this.mZ = z; - } - } - - public GT_Worldgen_Stone(StoneBuilder stone) { - super(stone.stoneName, GregTech_API.sWorldgenList, stone.enabledByDefault); - mDimensionType = stone.dimension; - mBlock = stone.block; - mBlockMeta = Math.min(Math.max(stone.blockMeta, 0), 15); - mProbability = stone.probability; - mAmount = stone.amount; - mSize = stone.size; - mMinY = stone.minY; - mMaxY = stone.maxY; - mBiomeList = new ArrayList<>(); - mAllowToGenerateinVoid = stone.allowToGenerateInVoid; - } - - @Override - public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, - int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { - XSTR stoneRNG = new XSTR(); - ArrayList stones = new ArrayList<>(); - - if (!isGenerationAllowed(aWorld, mDimensionType)) { - return false; - } - if (!(this.mBiomeList.isEmpty() || this.mBiomeList.contains(aBiome))) { - return false; - } - // I think the real size of the balls is mSize/8, but the original code was difficult to understand. - // Overall there will be less GT stones since they aren't spheres any more. /16 since this code uses it as a - // radius. - double realSize = mSize / 16; - int windowWidth = ((int) realSize) / 16 + 1; // Width of chunks to check for a potential stoneseed - // Check stone seeds to see if they have been added - for (int x = aChunkX / 16 - windowWidth; x < (aChunkX / 16 + windowWidth + 1); x++) { - for (int z = aChunkZ / 16 - windowWidth; z < (aChunkZ / 16 + windowWidth + 1); z++) { - long hash = (((aWorld.provider.dimensionId & 0xffL) << 56) | (((long) x & 0x000000000fffffffL) << 28) - | ((long) z & 0x000000000fffffffL)); - if (!validStoneSeeds.containsKey(hash)) { - // Determine if RNG says to add stone at this chunk - stoneRNG.setSeed( - aWorld.getSeed() ^ hash + Math.abs(mBlockMeta) - + Math.abs(mSize) - + ((GregTech_API.sBlockGranites == mBlock) ? (32768) : (0))); // Don't judge me. - // Want different - // values for - // different block - // types - if ((this.mProbability <= 1) || (stoneRNG.nextInt(this.mProbability) == 0)) { - // Add stone at this chunk - validStoneSeeds.put(hash, new StoneSeeds(true)); - // Add to generation list - stones.add(new ValidSeeds(x, z)); - if (debugStones) GT_Log.out.println( - "New stoneseed=" + mWorldGenName + " x=" + x + " z=" + z + " realSize=" + realSize); - } else { - validStoneSeeds.put(hash, new StoneSeeds(false)); - } - } else { - // This chunk has already been checked, check to see if a boulder exists here - if (validStoneSeeds.get(hash).mExists) { - // Add to generation list - stones.add(new ValidSeeds(x, z)); - } - } - } - } - - boolean result = stones.size() != 0; - // Now process each oreseed vs this requested chunk - for (; stones.size() != 0; stones.remove(0)) { - int x = stones.get(0).mX * 16; - int z = stones.get(0).mZ * 16; - - stoneRNG.setSeed( - aWorld.getSeed() - ^ (((aWorld.provider.dimensionId & 0xffL) << 56) | (((long) x & 0x000000000fffffffL) << 28) - | ((long) z & 0x000000000fffffffL)) + Math.abs(mBlockMeta) - + Math.abs(mSize) - + ((GregTech_API.sBlockGranites == mBlock) ? (32768) : (0))); // Don't judge me - for (int i = 0; i < this.mAmount; i++) { // Not sure why you would want more than one in a chunk! Left alone - // though. - // Locate the stoneseed XYZ. Original code would request an isAir at the seed location, causing a chunk - // generation request. - // To reduce potential worldgen cascade, we just always try to place a ball and use the check inside the - // for loop to prevent - // placement instead. - int tX = x + stoneRNG.nextInt(16); - int tY = mMinY + stoneRNG.nextInt(mMaxY - mMinY); - int tZ = z + stoneRNG.nextInt(16); - - // Determine the XYZ sizes of the stoneseed - double xSize = sizeConversion[stoneRNG.nextInt(sizeConversion.length)]; - double ySize = sizeConversion[stoneRNG.nextInt(sizeConversion.length) / 2]; // Skew the ySize towards - // the larger sizes, more - // long skinny pipes - double zSize = sizeConversion[stoneRNG.nextInt(sizeConversion.length)]; - - // Equation for an ellipsoid centered around 0,0,0 - // Sx, Sy, and Sz are size controls (size = 1/S_) - // 1 = full size, 1.333 = 75%, 2 = 50%, 4 = 25% - // (x * Sx)^2 + (y * Sy)^2 + (z * sZ)^2 <= (mSize)^2 - - // So, we setup the intial boundaries to be the size of the boulder plus a block in each direction - int tMinX = tX - (int) (realSize / xSize - 1.0); - int tMaxX = tX + (int) (realSize / xSize + 2.0); - int tMinY = tY - (int) (realSize / ySize - 1.0); - int tMaxY = tY + (int) (realSize / ySize + 2.0); - int tMinZ = tZ - (int) (realSize / zSize - 1.0); - int tMaxZ = tZ + (int) (realSize / zSize + 2.0); - - // If the (tY-ySize) of the stoneseed is air in the current chunk, mark the seed empty and move on. - if (aWorld.getBlock(aChunkX + 8, tMinY, aChunkZ + 8) - .isAir(aWorld, aChunkX + 8, tMinY, aChunkZ + 8)) { - if (debugStones) GT_Log.out.println( - mWorldGenName + " tX=" - + tX - + " tY=" - + tY - + " tZ=" - + tZ - + " realSize=" - + realSize - + " xSize=" - + realSize / xSize - + " ySize=" - + realSize / ySize - + " zSize=" - + realSize / zSize - + " tMinY=" - + tMinY - + " tMaxY=" - + tMaxY - + " - Skipped because first requesting chunk would not contain this stone"); - long hash = (((aWorld.provider.dimensionId & 0xffL) << 56) - | (((long) x & 0x000000000fffffffL) << 28) - | ((long) z & 0x000000000fffffffL)); - validStoneSeeds.remove(hash); - validStoneSeeds.put(hash, new StoneSeeds(false)); - } - - // Chop the boundaries by the parts that intersect with the current chunk - int wX = Math.max(tMinX, aChunkX + 8); - int eX = Math.min(tMaxX, aChunkX + 8 + 16); - - int sZ = Math.max(tMinZ, aChunkZ + 8); - int nZ = Math.min(tMaxZ, aChunkZ + 8 + 16); - - if (debugStones) GT_Log.out.println( - mWorldGenName + " tX=" - + tX - + " tY=" - + tY - + " tZ=" - + tZ - + " realSize=" - + realSize - + " xSize=" - + realSize / xSize - + " ySize=" - + realSize / ySize - + " zSize=" - + realSize / zSize - + " wX=" - + wX - + " eX=" - + eX - + " tMinY=" - + tMinY - + " tMaxY=" - + tMaxY - + " sZ=" - + sZ - + " nZ=" - + nZ); - - double rightHandSide = realSize * realSize + 1; // Precalc the right hand side - for (int iY = tMinY; iY < tMaxY; iY++) { // Do placement from the bottom up layer up. Maybe better on - // cache usage? - double yCalc = ((double) (iY - tY) * ySize); - yCalc = yCalc * yCalc; // (y*Sy)^2 - double leftHandSize = yCalc; - if (leftHandSize > rightHandSide) { - continue; // If Y alone is larger than the RHS, skip the rest of the loops - } - for (int iX = wX; iX < eX; iX++) { - double xCalc = ((double) (iX - tX) * xSize); - xCalc = xCalc * xCalc; - leftHandSize = yCalc + xCalc; - if (leftHandSize > rightHandSide) { // Again, if X and Y is larger than the RHS, skip to the - // next value - continue; - } - for (int iZ = sZ; iZ < nZ; iZ++) { - double zCalc = ((double) (iZ - tZ) * zSize); - zCalc = zCalc * zCalc; - leftHandSize = zCalc + xCalc + yCalc; - if (leftHandSize <= rightHandSide) { - // Yay! We can actually place a block now. (this part copied from original code) - Block tTargetedBlock = aWorld.getBlock(iX, iY, iZ); - if (tTargetedBlock instanceof GT_Block_Ores_Abstract) { - TileEntity tTileEntity = aWorld.getTileEntity(iX, iY, iZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - if (tTargetedBlock != GregTech_API.sBlockOres1) { - ((GT_TileEntity_Ores) tTileEntity).convertOreBlock(aWorld, iX, iY, iZ); - } - ((GT_TileEntity_Ores) tTileEntity) - .overrideOreBlockMaterial(this.mBlock, (byte) this.mBlockMeta); - } - } else if (((this.mAllowToGenerateinVoid) && (aWorld.getBlock(iX, iY, iZ) - .isAir(aWorld, iX, iY, iZ))) - || ((tTargetedBlock != null) && ((tTargetedBlock - .isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.stone)) - || (tTargetedBlock - .isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.stained_hardened_clay)) - || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.cobblestone)) - || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.end_stone)) - || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.netherrack)) - || (tTargetedBlock - .isReplaceableOreGen(aWorld, iX, iY, iZ, GregTech_API.sBlockGranites)) - || (tTargetedBlock - .isReplaceableOreGen(aWorld, iX, iY, iZ, GregTech_API.sBlockStones))))) { - aWorld.setBlock(iX, iY, iZ, this.mBlock, this.mBlockMeta, 0); - } - } - } - } - } - } - } - return result; - } -} diff --git a/src/main/java/gregtech/common/GT_Worldgenerator.java b/src/main/java/gregtech/common/GT_Worldgenerator.java deleted file mode 100644 index 68ce3e4d82..0000000000 --- a/src/main/java/gregtech/common/GT_Worldgenerator.java +++ /dev/null @@ -1,686 +0,0 @@ -package gregtech.common; - -import static gregtech.api.enums.GT_Values.debugOrevein; -import static gregtech.api.enums.GT_Values.debugWorldGen; -import static gregtech.api.enums.GT_Values.oreveinAttempts; -import static gregtech.api.enums.GT_Values.oreveinMaxPlacementAttempts; -import static gregtech.api.enums.GT_Values.oreveinPercentage; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.WorldSavedData; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraftforge.event.world.WorldEvent; - -import cpw.mods.fml.common.IWorldGenerator; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.PlayerEvent; -import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.net.GT_Packet_SendOregenPattern; -import gregtech.api.objects.XSTR; -import gregtech.api.util.GT_Log; -import gregtech.api.world.GT_Worldgen; -import gregtech.common.blocks.GT_TileEntity_Ores; -import gregtech.common.config.worldgen.ConfigEndAsteroids; - -public class GT_Worldgenerator implements IWorldGenerator { - - private static int mEndAsteroidProbability = 300; - private static int mSize = 100; - private static int endMinSize = 50; - private static int endMaxSize = 200; - private static boolean endAsteroids = true; - public static List mList = new ArrayList<>(); - public static HashSet ProcChunks = new HashSet<>(); - // This is probably not going to work. Trying to create a fake orevein to put into hashtable when there will be no - // ores in a vein. - public static GT_Worldgen_GT_Ore_Layer noOresInVein = new GT_Worldgen_GT_Ore_Layer( - new OreMixBuilder().name("NoOresInVein") - .disabledByDefault() - .heightRange(0, 255) - .weight(0) - .density(255) - .size(16) - .primary(Materials.Aluminium) - .secondary(Materials.Aluminium) - .inBetween(Materials.Aluminium) - .sporadic(Materials.Aluminium)); - - public static Hashtable validOreveins = new Hashtable<>(1024); - public boolean mIsGenerating = false; - public static final Object listLock = new Object(); - public static OregenPattern oregenPattern = OregenPattern.AXISSYMMETRICAL; - - public GT_Worldgenerator() { - endAsteroids = ConfigEndAsteroids.generateEndAsteroids; - endMinSize = ConfigEndAsteroids.EndAsteroidMinSize; - endMaxSize = ConfigEndAsteroids.EndAsteroidMaxSize; - mEndAsteroidProbability = ConfigEndAsteroids.EndAsteroidProbability; - GameRegistry.registerWorldGenerator(this, 1073741823); - if (debugWorldGen) { - GT_Log.out.println("GT_Worldgenerator created"); - } - } - - @Override - public void generate(Random aRandom, int aX, int aZ, World aWorld, IChunkProvider aChunkGenerator, - IChunkProvider aChunkProvider) { - synchronized (listLock) { - mList.add( - new WorldGenContainer( - new XSTR(Math.abs(aRandom.nextInt()) + 1), - aX, - aZ, - aWorld.provider.dimensionId, - aWorld, - aChunkGenerator, - aChunkProvider, - aWorld.getBiomeGenForCoords(aX * 16 + 8, aZ * 16 + 8).biomeName)); - if (debugWorldGen) GT_Log.out.println( - "ADD WorldSeed:" + aWorld.getSeed() - + " DimId" - + aWorld.provider.dimensionId - + " chunk x:" - + aX - + " z:" - + aZ - + " SIZE: " - + mList.size()); - } - - if (!this.mIsGenerating) { - this.mIsGenerating = true; - int mList_sS = mList.size(); - mList_sS = Math.min(mList_sS, 5); // Run a maximum of 5 chunks at a time through worldgen. Extra chunks get - // done later. - for (int i = 0; i < mList_sS; i++) { - WorldGenContainer toRun = (WorldGenContainer) mList.get(0); - if (debugWorldGen) GT_Log.out.println( - "RUN WorldSeed:" + aWorld.getSeed() - + " DimId" - + aWorld.provider.dimensionId - + " chunk x:" - + toRun.mX - + " z:" - + toRun.mZ - + " SIZE: " - + mList.size() - + " i: " - + i); - synchronized (listLock) { - mList.remove(0); - } - toRun.run(); - } - this.mIsGenerating = false; - } - } - - public static boolean isOreChunk(int chunkX, int chunkZ) { - if (oregenPattern == OregenPattern.EQUAL_SPACING) { - return Math.floorMod(chunkX, 3) == 1 && Math.floorMod(chunkZ, 3) == 1; - } - // add next if statement here or convert to switch when expanding OregenPattern enum - - // AXISSYMMETRICAL - return Math.abs(chunkX) % 3 == 1 && Math.abs(chunkZ) % 3 == 1; - } - - public static class OregenPatternSavedData extends WorldSavedData { - - private static final String NAME = "GregTech_OregenPattern"; - private static final String KEY = "oregenPattern"; - - public OregenPatternSavedData(String p_i2141_1_) { - super(p_i2141_1_); - } - - public static void loadData(World world) { - if (world.getWorldInfo() - .getWorldTotalTime() == 0L) { - // The world has just been created -> use newest pattern - oregenPattern = OregenPattern.values()[OregenPattern.values().length - 1]; - } else { - // This is an old world. Use legacy pattern for now, readFromNBT may change this if - // GregTech_OregenPattern.dat is present - oregenPattern = OregenPattern.AXISSYMMETRICAL; - } - - // load OregenPatternSavedData - WorldSavedData instance = world.mapStorage - .loadData(OregenPatternSavedData.class, OregenPatternSavedData.NAME); - if (instance == null) { - instance = new OregenPatternSavedData(NAME); - world.mapStorage.setData(OregenPatternSavedData.NAME, instance); - } - instance.markDirty(); - } - - @SubscribeEvent - public void onWorldLoad(WorldEvent.Load event) { - final World world = event.world; - if (!world.isRemote && world.provider.dimensionId == 0) { - loadData(world); - } - } - - @SubscribeEvent - public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { - if (event.player instanceof EntityPlayerMP player) { - GT_Values.NW.sendToPlayer(new GT_Packet_SendOregenPattern(oregenPattern), player); - } - } - - @Override - public void readFromNBT(NBTTagCompound p_76184_1_) { - if (p_76184_1_.hasKey(KEY)) { - int ordinal = p_76184_1_.getByte(KEY); - ordinal = MathHelper.clamp_int(ordinal, 0, OregenPattern.values().length - 1); - oregenPattern = OregenPattern.values()[ordinal]; - } - } - - @Override - public void writeToNBT(NBTTagCompound p_76187_1_) { - // If we have so many different OregenPatterns that byte isn't good enough something is wrong - p_76187_1_.setByte(KEY, (byte) oregenPattern.ordinal()); - } - - } - - public enum OregenPattern { - // The last value is used when creating a new world - AXISSYMMETRICAL, - EQUAL_SPACING; - } - - public static class WorldGenContainer implements Runnable { - - public final Random mRandom; - public final int mX; - public final int mZ; - public final int mDimensionType; - public final World mWorld; - public final IChunkProvider mChunkGenerator; - public final IChunkProvider mChunkProvider; - public final String mBiome; - // Used for outputting orevein weights and bins - // static int test=0; - - // Local class to track which orevein seeds must be checked when doing chunkified worldgen - static class NearbySeeds { - - public int mX; - public int mZ; - - NearbySeeds(int x, int z) { - this.mX = x; - this.mZ = z; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof NearbySeeds that)) return false; - if (this.mX != that.mX) return false; - return this.mZ == that.mZ; - } - - @Override - public int hashCode() { - int result = this.mX; - result = 31 * result + this.mZ; - return result; - } - } - - public static ArrayList seedList = new ArrayList<>(); - - // aX and aZ are now the by-chunk X and Z for the chunk of interest - public WorldGenContainer(Random aRandom, int aX, int aZ, int aDimensionType, World aWorld, - IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) { - this.mRandom = aRandom; - this.mX = aX; - this.mZ = aZ; - this.mDimensionType = aDimensionType; - this.mWorld = aWorld; - this.mChunkGenerator = aChunkGenerator; - this.mChunkProvider = aChunkProvider; - this.mBiome = aBiome; - } - - // How to evaluate oregen distribution - // - Enable debugOreveins - // - Fly around for a while, or teleport jumping ~320 blocks at a time, with - // a 15-30s pause for worldgen to catch up - // - Do this across a large area, at least 2000x2000 blocks for good numbers - // - Open logs\gregtech.log - // - Using notepad++, do a Search | Find - enter "Added" for the search term - // - Select Find All In Current Document - // - In the Search window, right-click and Select All - // - Copy and paste to a new file - // - Delete extraneous stuff at top, and blank line at bottom. Line count is - // # of total oreveins - // - For simple spot checks, use Find All in Current Document for specific - // oremixes, ie ore.mix.diamond, to check how many appear in the list. - // - For more complex work, import file into Excel, and sort based on oremix - // column. Drag select the oremix names, in the bottom right will be how many - // entries to add in a seperate tab to calculate %ages. - // - // When using the ore weights, discount or remove the high altitude veins since - // their high weight are offset by their rareness. I usually just use zero for them. - // Actual spawn rates will vary based upon the average height of the stone layers - // in the dimension. For example veins that range above and below the average height - // will be less, and veins that are completely above the average height will be much less. - - public void worldGenFindVein(int oreseedX, int oreseedZ) { - // Explanation of oreveinseed implementation. - // (long)this.mWorld.getSeed()<<16) Deep Dark does two oregen passes, one with getSeed set to +1 the - // original world seed. This pushes that +1 off the low bits of oreseedZ, so that the hashes are far apart - // for the two passes. - // ((this.mWorld.provider.dimensionId & 0xffL)<<56) Puts the dimension in the top bits of the hash, to - // make sure to get unique hashes per dimension - // ((long)oreseedX & 0x000000000fffffffL) << 28) Puts the chunk X in the bits 29-55. Cuts off the top few - // bits of the chunk so we have bits for dimension. - // ( (long)oreseedZ & 0x000000000fffffffL )) Puts the chunk Z in the bits 0-27. Cuts off the top few bits - // of the chunk so we have bits for dimension. - long oreveinSeed = (this.mWorld.getSeed() << 16) - ^ (((this.mWorld.provider.dimensionId & 0xffL) << 56) | (((long) oreseedX & 0x000000000fffffffL) << 28) - | ((long) oreseedZ & 0x000000000fffffffL)); // Use an RNG that is identical every time it is - // called for - // this oreseed. - XSTR oreveinRNG = new XSTR(oreveinSeed); - int oreveinPercentageRoll = oreveinRNG.nextInt(100); // Roll the dice, see if we get an orevein here at all - int noOrePlacedCount = 0; - String tDimensionName = ""; - if (debugOrevein) { - tDimensionName = this.mWorld.provider.getDimensionName(); - } - - if (debugOrevein) GT_Log.out.println( - " Finding oreveins for oreveinSeed=" + oreveinSeed - + " mX=" - + this.mX - + " mZ=" - + this.mZ - + " oreseedX=" - + oreseedX - + " oreseedZ=" - + oreseedZ - + " worldSeed=" - + this.mWorld.getSeed()); - - // Search for a valid orevein for this dimension - if (!validOreveins.containsKey(oreveinSeed)) { - if ((oreveinPercentageRoll < oreveinPercentage) && (GT_Worldgen_GT_Ore_Layer.sWeight > 0) - && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) { - int placementAttempts = 0; - boolean oreveinFound = false; - int i; - - // Used for outputting orevein weights and bins - /* - * if( test==0 ) { test = 1; GT_Log.out.println( "sWeight = " + GT_Worldgen_GT_Ore_Layer.sWeight ); - * for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) { GT_Log.out.println( ( - * tWorldGen).mWorldGenName + " mWeight = " + ( tWorldGen).mWeight + " mSize = " + (tWorldGen).mSize - * ); } } - */ - for (i = 0; (i < oreveinAttempts) && (!oreveinFound) - && (placementAttempts < oreveinMaxPlacementAttempts); i++) { - int tRandomWeight = oreveinRNG.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight); - for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) { - tRandomWeight -= (tWorldGen).mWeight; - if (tRandomWeight <= 0) { - try { - // Adjust the seed so that this layer has a series of unique random numbers. - // Otherwise multiple attempts at this same oreseed will get the same offset and X/Z - // values. If an orevein failed, any orevein with the - // same minimum heights would fail as well. This prevents that, giving each orevein - // a unique height each pass through here. - int placementResult = tWorldGen.executeWorldgenChunkified( - this.mWorld, - new XSTR(oreveinSeed ^ (tWorldGen.mPrimaryMeta)), - this.mBiome, - this.mDimensionType, - this.mX * 16, - this.mZ * 16, - oreseedX * 16, - oreseedZ * 16, - this.mChunkGenerator, - this.mChunkProvider); - switch (placementResult) { - case GT_Worldgen_GT_Ore_Layer.ORE_PLACED -> { - if (debugOrevein) GT_Log.out.println( - " Added near oreveinSeed=" + oreveinSeed - + " " - + (tWorldGen).mWorldGenName - + " tries at oremix=" - + i - + " placementAttempts=" - + placementAttempts - + " dimensionName=" - + tDimensionName); - validOreveins.put(oreveinSeed, tWorldGen); - oreveinFound = true; - } - case GT_Worldgen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> placementAttempts++; - - // SHould do retry in this case until out of chances - case GT_Worldgen_GT_Ore_Layer.NO_OVERLAP -> { - if (debugOrevein) GT_Log.out.println( - " Added far oreveinSeed=" + oreveinSeed - + " " - + (tWorldGen).mWorldGenName - + " tries at oremix=" - + i - + " placementAttempts=" - + placementAttempts - + " dimensionName=" - + tDimensionName); - validOreveins.put(oreveinSeed, tWorldGen); - oreveinFound = true; - } - case GT_Worldgen_GT_Ore_Layer.NO_OVERLAP_AIR_BLOCK -> { - if (debugOrevein) GT_Log.out.println( - " No overlap and air block in test spot=" + oreveinSeed - + " " - + (tWorldGen).mWorldGenName - + " tries at oremix=" - + i - + " placementAttempts=" - + placementAttempts - + " dimensionName=" - + tDimensionName); - // SHould do retry in this case until out of chances - placementAttempts++; - } - } - break; // Try the next orevein - } catch (Throwable e) { - if (debugOrevein) GT_Log.out.println( - "Exception occurred on oreVein" + tWorldGen - + " oreveinSeed=" - + oreveinSeed - + " mX=" - + this.mX - + " mZ=" - + this.mZ - + " oreseedX=" - + oreseedX - + " oreseedZ=" - + oreseedZ); - e.printStackTrace(GT_Log.err); - } - } - } - } - // Only add an empty orevein if unable to place a vein at the oreseed chunk. - if ((!oreveinFound) && (this.mX == oreseedX) && (this.mZ == oreseedZ)) { - if (debugOrevein) GT_Log.out.println( - " Empty oreveinSeed=" + oreveinSeed - + " mX=" - + this.mX - + " mZ=" - + this.mZ - + " oreseedX=" - + oreseedX - + " oreseedZ=" - + oreseedZ - + " tries at oremix=" - + i - + " placementAttempts=" - + placementAttempts - + " dimensionName=" - + tDimensionName); - validOreveins.put(oreveinSeed, noOresInVein); - } - } else if (oreveinPercentageRoll >= oreveinPercentage) { - if (debugOrevein) GT_Log.out.println( - " Skipped oreveinSeed=" + oreveinSeed - + " mX=" - + this.mX - + " mZ=" - + this.mZ - + " oreseedX=" - + oreseedX - + " oreseedZ=" - + oreseedZ - + " RNG=" - + oreveinPercentageRoll - + " %=" - + oreveinPercentage - + " dimensionName=" - + tDimensionName); - validOreveins.put(oreveinSeed, noOresInVein); - } - } else { - // oreseed is located in the previously processed table - if (debugOrevein) GT_Log.out - .print(" Valid oreveinSeed=" + oreveinSeed + " validOreveins.size()=" + validOreveins.size() + " "); - GT_Worldgen_GT_Ore_Layer tWorldGen = validOreveins.get(oreveinSeed); - oreveinRNG.setSeed(oreveinSeed ^ (tWorldGen.mPrimaryMeta)); // Reset RNG to only be based on oreseed X/Z - // and type of vein - int placementResult = tWorldGen.executeWorldgenChunkified( - this.mWorld, - oreveinRNG, - this.mBiome, - this.mDimensionType, - this.mX * 16, - this.mZ * 16, - oreseedX * 16, - oreseedZ * 16, - this.mChunkGenerator, - this.mChunkProvider); - switch (placementResult) { - case GT_Worldgen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> { - if (debugOrevein) GT_Log.out.println(" No ore in bottom layer"); - } - case GT_Worldgen_GT_Ore_Layer.NO_OVERLAP -> { - if (debugOrevein) GT_Log.out.println(" No overlap"); - } - } - } - } - - @Override - public void run() { - long startTime = System.nanoTime(); - Chunk tChunk = this.mWorld.getChunkFromChunkCoords(this.mX, this.mZ); - - int oreveinMaxSize; - - // Do GT_Stones and GT_small_ores oregen for this chunk - try { - for (GT_Worldgen tWorldGen : GregTech_API.sWorldgenList) { - /* - * if (debugWorldGen) GT_Log.out.println( "tWorldGen.mWorldGenName="+tWorldGen.mWorldGenName ); - */ - tWorldGen.executeWorldgen( - this.mWorld, - this.mRandom, - this.mBiome, - this.mDimensionType, - this.mX * 16, - this.mZ * 16, - this.mChunkGenerator, - this.mChunkProvider); - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - long leftOverTime = System.nanoTime(); - - // Determine bounding box on how far out to check for oreveins affecting this chunk - // For now, manually reducing oreveinMaxSize when not in the Underdark for performance - if (this.mWorld.provider.getDimensionName() - .equals("Underdark")) { - oreveinMaxSize = 32; // Leave Deep Dark/Underdark max oregen at 32, instead of 64 - } else { - oreveinMaxSize = 32; - } - - int wXbox = this.mX - (oreveinMaxSize / 16); - int eXbox = this.mX + (oreveinMaxSize / 16 + 1); // Need to add 1 since it is compared using a < - int nZbox = this.mZ - (oreveinMaxSize / 16); - int sZbox = this.mZ + (oreveinMaxSize / 16 + 1); - - // Search for orevein seeds and add to the list; - for (int x = wXbox; x < eXbox; x++) { - for (int z = nZbox; z < sZbox; z++) { - // Determine if this X/Z is an orevein seed - if (isOreChunk(x, z)) { - if (debugWorldGen) GT_Log.out.println("Adding seed x=" + x + " z=" + z); - seedList.add(new NearbySeeds(x, z)); - } - } - } - - // Now process each oreseed vs this requested chunk - for (; seedList.size() != 0; seedList.remove(0)) { - if (debugWorldGen) - GT_Log.out.println("Processing seed x=" + seedList.get(0).mX + " z=" + seedList.get(0).mZ); - worldGenFindVein(seedList.get(0).mX, seedList.get(0).mZ); - } - - long oregenTime = System.nanoTime(); - - // Asteroid Worldgen - int tDimensionType = this.mWorld.provider.dimensionId; - // String tDimensionName = this.mWorld.provider.getDimensionName(); - // if (((tDimensionType == 1) && endAsteroids && ((mEndAsteroidProbability <= 1) || - // (aRandom.nextInt(mEndAsteroidProbability) == 0))) || ((tDimensionName.equals("Asteroids")) && gcAsteroids - // && ((mGCAsteroidProbability <= 1) || (aRandom.nextInt(mGCAsteroidProbability) == 0)))) { - if ((tDimensionType == 1 /* the end */) && endAsteroids) { - XSTR random = new XSTR( - mWorld.getSeed() + mX * mX * 91777L + mZ * mZ * 137413L + mX * mZ * 1853L + mX * 3L + mZ * 17L); - - if (mEndAsteroidProbability <= 1 || random.nextInt(mEndAsteroidProbability) == 0) { - generateAsteroid(mWorld, random, mX, mZ); - } - } - - if (tChunk != null) { - tChunk.isModified = true; - } - long endTime = System.nanoTime(); - long duration = (endTime - startTime); - if (debugWorldGen) { - GT_Log.out.println( - " Oregen took " + (oregenTime - leftOverTime) - + " Leftover gen took " - + (leftOverTime - startTime) - + " Worldgen took " - + duration - + " nanoseconds"); - } - } - - private void generateAsteroid(World world, Random random, int chunkX, int chunkZ) { - short primaryMeta = 0; - short secondaryMeta = 0; - short betweenMeta = 0; - short sporadicMeta = 0; - if ((GT_Worldgen_GT_Ore_Layer.sWeight > 0) && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) { - boolean temp = true; - int tRandomWeight; - for (int i = 0; (i < oreveinAttempts) && (temp); i++) { - tRandomWeight = random.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight); - for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) { - tRandomWeight -= tWorldGen.mWeight; - if (tRandomWeight <= 0) { - try { - if (tWorldGen.mEndAsteroid) { - primaryMeta = tWorldGen.mPrimaryMeta; - secondaryMeta = tWorldGen.mSecondaryMeta; - betweenMeta = tWorldGen.mBetweenMeta; - sporadicMeta = tWorldGen.mSporadicMeta; - temp = false; - break; - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - } - } - } - } - // if(GT_Values.D1)GT_FML_LOGGER.info("do asteroid gen: "+this.mX+" "+this.mZ); - int tX = chunkX * 16 + random.nextInt(16); - int tY = 50 + random.nextInt(200 - 50); - int tZ = chunkZ * 16 + random.nextInt(16); - mSize = endMinSize + random.nextInt(endMaxSize - endMinSize + 1); - - if ((world.getBlock(tX, tY, tZ) - .isAir(world, tX, tY, tZ))) { - float randomRadian = random.nextFloat() * (float) Math.PI; - double xBase = tX + 8 + MathHelper.sin(randomRadian) * mSize / 8.0F; - double xFactor = tX + 8 - MathHelper.sin(randomRadian) * mSize / 8.0F; - double zBase = tZ + 8 + MathHelper.cos(randomRadian) * mSize / 8.0F; - double zFactor = tZ + 8 - MathHelper.cos(randomRadian) * mSize / 8.0F; - double yBase = tY + random.nextInt(3) - 2; - double yFactor = tY + random.nextInt(3) - 2; - - for (int i = 0; i <= mSize; i++) { - double xCenter = xBase + (xFactor - xBase) * i / mSize; - double yCenter = yBase + (yFactor - yBase) * i / mSize; - double zCenter = zBase + (zFactor - zBase) * i / mSize; - double randomDistance = random.nextDouble() * mSize / 16.0D; - double halfLength = (MathHelper.sin(i * (float) Math.PI / mSize) + 1.0F) * randomDistance + 1.0D; - double halfHeight = (MathHelper.sin(i * (float) Math.PI / mSize) + 1.0F) * randomDistance + 1.0D; - int tMinX = MathHelper.floor_double(xCenter - halfLength / 2.0D); - int tMinY = MathHelper.floor_double(yCenter - halfHeight / 2.0D); - int tMinZ = MathHelper.floor_double(zCenter - halfLength / 2.0D); - int tMaxX = MathHelper.floor_double(xCenter + halfLength / 2.0D); - int tMaxY = MathHelper.floor_double(yCenter + halfHeight / 2.0D); - int tMaxZ = MathHelper.floor_double(zCenter + halfLength / 2.0D); - - for (int eX = tMinX; eX <= tMaxX; eX++) { - double xChance = (eX + 0.5D - xCenter) / (halfLength / 2.0D); - if (xChance * xChance < 1.0D) { - for (int eY = tMinY; eY <= tMaxY; eY++) { - double yChance = (eY + 0.5D - yCenter) / (halfHeight / 2.0D); - if (xChance * xChance + yChance * yChance < 1.0D) { - for (int eZ = tMinZ; eZ <= tMaxZ; eZ++) { - double zChance = (eZ + 0.5D - zCenter) / (halfLength / 2.0D); - if (xChance * xChance + yChance * yChance + zChance * zChance >= 1.0D) { - continue; - } - if (!world.getBlock(tX, tY, tZ) - .isAir(world, tX, tY, tZ)) { - continue; - } - int ranOre = random.nextInt(50); - if (ranOre < 3) { - GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, primaryMeta, false); - } else if (ranOre < 6) { - GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, secondaryMeta, false); - } else if (ranOre < 8) { - GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, betweenMeta, false); - } else if (ranOre < 10) { - GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, sporadicMeta, false); - } else { - world.setBlock(eX, eY, eZ, Blocks.end_stone, 0, 0); - } - } - } - } - } - } - } - } - } - } -} diff --git a/src/main/java/gregtech/common/OreMixBuilder.java b/src/main/java/gregtech/common/OreMixBuilder.java index 2a78f516a0..cd8d14c884 100644 --- a/src/main/java/gregtech/common/OreMixBuilder.java +++ b/src/main/java/gregtech/common/OreMixBuilder.java @@ -3,7 +3,7 @@ package gregtech.common; import java.util.HashMap; import java.util.Map; -import bloodasp.galacticgreg.api.enums.DimensionDef; +import galacticgreg.api.enums.DimensionDef; import gregtech.api.enums.Materials; public class OreMixBuilder { diff --git a/src/main/java/gregtech/common/Pollution.java b/src/main/java/gregtech/common/Pollution.java new file mode 100644 index 0000000000..928b944142 --- /dev/null +++ b/src/main/java/gregtech/common/Pollution.java @@ -0,0 +1,507 @@ +package gregtech.common; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; +import static gregtech.common.GTProxy.dimensionWisePollution; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.event.world.ChunkWatchEvent; +import net.minecraftforge.event.world.WorldEvent; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.network.NetworkRegistry; +import gregtech.GTMod; +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.ICleanroom; +import gregtech.api.interfaces.ICleanroomReceiver; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.net.GTPacketPollution; +import gregtech.api.util.GTChunkAssociatedData; +import gregtech.api.util.GTUtility; +import gregtech.common.render.PollutionRenderer; + +public class Pollution { + + private static final Storage STORAGE = new Storage(); + /** + * Pollution dispersion until effects start: Calculation: ((Limit * 0.01) + 2000) * (4 <- spreading rate) + *

+ * SMOG(500k) 466.7 pollution/sec Poison(750k) 633,3 pollution/sec Dying Plants(1mio) 800 pollution/sec Sour + * Rain(1.5mio) 1133.3 pollution/sec + *

+ * Pollution producers (pollution/sec) Bronze Boiler(20) Lava Boiler(20) High Pressure Boiler(20) Bronze Blast + * Furnace(50) Diesel Generator(40/80/160) Gas Turbine(20/40/80) Charcoal Pile(100) + *

+ * Large Diesel Engine(320) Electric Blast Furnace(100) Implosion Compressor(2000) Large Boiler(240) Large Gas + * Turbine(160) Multi Smelter(100) Pyrolyse Oven(400) + *

+ * Machine Explosion(100,000) + *

+ * Other Random Shit: lots and lots + *

+ * Muffler Hatch Pollution reduction: ** inaccurate ** LV (0%), MV (30%), HV (52%), EV (66%), IV (76%), LuV (84%), + * ZPM (89%), UV (92%), MAX (95%) + */ + private List pollutionList = new ArrayList<>(); // chunks left to process in this cycle + + private final Set pollutedChunks = new HashSet<>(); // a global list of all chunks with positive + // pollution + private int operationsPerTick = 0; // how much chunks should be processed in each cycle + private static final short cycleLen = 1200; + private final World world; + private boolean blank = true; + public static int mPlayerPollution; + + private static final int POLLUTIONPACKET_MINVALUE = 1000; + + private static GT_PollutionEventHandler EVENT_HANDLER; + + public Pollution(World world) { + this.world = world; + + if (EVENT_HANDLER == null) { + EVENT_HANDLER = new GT_PollutionEventHandler(); + MinecraftForge.EVENT_BUS.register(EVENT_HANDLER); + } + } + + public static void onWorldTick(TickEvent.WorldTickEvent aEvent) { // called from proxy + // return if pollution disabled + if (!GTMod.gregtechproxy.mPollution) return; + if (aEvent.phase == TickEvent.Phase.START) return; + final Pollution pollutionInstance = dimensionWisePollution.get(aEvent.world.provider.dimensionId); + if (pollutionInstance == null) return; + pollutionInstance.tickPollutionInWorld((int) (aEvent.world.getTotalWorldTime() % cycleLen)); + } + + private void tickPollutionInWorld(int aTickID) { // called from method above + // gen data set + if (aTickID == 0 || blank) { + // make a snapshot of what to work on + pollutionList = new ArrayList<>(pollutedChunks); + // set operations per tick + if (pollutionList.size() > 0) operationsPerTick = Math.max(1, pollutionList.size() / cycleLen); + else operationsPerTick = 0; // SANity + blank = false; + } + + for (int chunksProcessed = 0; chunksProcessed < operationsPerTick; chunksProcessed++) { + if (pollutionList.size() == 0) break; // no more stuff to do + ChunkCoordIntPair actualPos = pollutionList.remove(pollutionList.size() - 1); // faster + // get pollution + ChunkData currentData = STORAGE.get(world, actualPos); + int tPollution = currentData.getAmount(); + // remove some + tPollution = (int) (0.9945f * tPollution); + + if (tPollution > 400000) { // Spread Pollution + + ChunkCoordIntPair[] tNeighbors = new ChunkCoordIntPair[4]; // array is faster + tNeighbors[0] = (new ChunkCoordIntPair(actualPos.chunkXPos + 1, actualPos.chunkZPos)); + tNeighbors[1] = (new ChunkCoordIntPair(actualPos.chunkXPos - 1, actualPos.chunkZPos)); + tNeighbors[2] = (new ChunkCoordIntPair(actualPos.chunkXPos, actualPos.chunkZPos + 1)); + tNeighbors[3] = (new ChunkCoordIntPair(actualPos.chunkXPos, actualPos.chunkZPos - 1)); + for (ChunkCoordIntPair neighborPosition : tNeighbors) { + ChunkData neighbor = STORAGE.get(world, neighborPosition); + int neighborPollution = neighbor.getAmount(); + if (neighborPollution * 6 < tPollution * 5) { // MATHEMATICS... + int tDiff = tPollution - neighborPollution; + tDiff = tDiff / 20; + neighborPollution = GTUtility.safeInt((long) neighborPollution + tDiff); // tNPol += tDiff; + tPollution -= tDiff; + setChunkPollution(neighborPosition, neighborPollution); + } + } + + // Create Pollution effects + // Smog filter TODO + if (tPollution > GTMod.gregtechproxy.mPollutionSmogLimit) { + AxisAlignedBB chunk = AxisAlignedBB.getBoundingBox( + actualPos.chunkXPos << 4, + 0, + actualPos.chunkZPos << 4, + (actualPos.chunkXPos << 4) + 16, + 256, + (actualPos.chunkZPos << 4) + 16); + List tEntitys = world.getEntitiesWithinAABB(EntityLivingBase.class, chunk); + for (EntityLivingBase tEnt : tEntitys) { + if (tEnt instanceof EntityPlayerMP && ((EntityPlayerMP) tEnt).capabilities.isCreativeMode) + continue; + if (!(GTUtility.isWearingFullGasHazmat(tEnt))) { + switch (XSTR_INSTANCE.nextInt(3)) { + default: + tEnt.addPotionEffect( + new PotionEffect( + Potion.digSlowdown.id, + Math.min(tPollution / 1000, 1000), + tPollution / 400000)); + case 1: + tEnt.addPotionEffect( + new PotionEffect( + Potion.weakness.id, + Math.min(tPollution / 1000, 1000), + tPollution / 400000)); + case 2: + tEnt.addPotionEffect( + new PotionEffect( + Potion.moveSlowdown.id, + Math.min(tPollution / 1000, 1000), + tPollution / 400000)); + } + } + } + + // Poison effects + if (tPollution > GTMod.gregtechproxy.mPollutionPoisonLimit) { + for (EntityLivingBase tEnt : tEntitys) { + if (tEnt instanceof EntityPlayerMP && ((EntityPlayerMP) tEnt).capabilities.isCreativeMode) + continue; + if (!GTUtility.isWearingFullGasHazmat(tEnt)) { + switch (XSTR_INSTANCE.nextInt(4)) { + default: + tEnt.addPotionEffect(new PotionEffect(Potion.hunger.id, tPollution / 500000)); + case 1: + tEnt.addPotionEffect( + new PotionEffect( + Potion.confusion.id, + Math.min(tPollution / 2000, 1000), + 1)); + case 2: + tEnt.addPotionEffect( + new PotionEffect( + Potion.poison.id, + Math.min(tPollution / 4000, 1000), + tPollution / 500000)); + case 3: + tEnt.addPotionEffect( + new PotionEffect( + Potion.blindness.id, + Math.min(tPollution / 2000, 1000), + 1)); + } + } + } + + // killing plants + if (tPollution > GTMod.gregtechproxy.mPollutionVegetationLimit) { + int f = 20; + for (; f < (tPollution / 25000); f++) { + int x = (actualPos.chunkXPos << 4) + XSTR_INSTANCE.nextInt(16); + int y = 60 + (-f + XSTR_INSTANCE.nextInt(f * 2 + 1)); + int z = (actualPos.chunkZPos << 4) + XSTR_INSTANCE.nextInt(16); + damageBlock(world, x, y, z, tPollution > GTMod.gregtechproxy.mPollutionSourRainLimit); + } + } + } + } + } + // Write new pollution to Hashmap !!! + setChunkPollution(actualPos, tPollution); + + // Send new value to players nearby + if (tPollution > POLLUTIONPACKET_MINVALUE) { + NetworkRegistry.TargetPoint point = new NetworkRegistry.TargetPoint( + world.provider.dimensionId, + (actualPos.chunkXPos << 4), + 64, + (actualPos.chunkZPos << 4), + 256); + GTValues.NW.sendToAllAround(new GTPacketPollution(actualPos, tPollution), point); + } + } + } + + private void setChunkPollution(ChunkCoordIntPair coord, int pollution) { + mutatePollution(world, coord.chunkXPos, coord.chunkZPos, c -> c.setAmount(pollution), pollutedChunks); + } + + private static void damageBlock(World world, int x, int y, int z, boolean sourRain) { + if (world.isRemote) return; + Block tBlock = world.getBlock(x, y, z); + int tMeta = world.getBlockMetadata(x, y, z); + if (tBlock == Blocks.air || tBlock == Blocks.stone || tBlock == Blocks.sand || tBlock == Blocks.deadbush) + return; + + if (tBlock == Blocks.leaves || tBlock == Blocks.leaves2 || tBlock.getMaterial() == Material.leaves) + world.setBlockToAir(x, y, z); + if (tBlock == Blocks.reeds) { + tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); + world.setBlockToAir(x, y, z); + } + if (tBlock == Blocks.tallgrass) world.setBlock(x, y, z, Blocks.deadbush); + if (tBlock == Blocks.vine) { + tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); + world.setBlockToAir(x, y, z); + } + if (tBlock == Blocks.waterlily || tBlock == Blocks.wheat + || tBlock == Blocks.cactus + || tBlock.getMaterial() == Material.cactus + || tBlock == Blocks.melon_block + || tBlock == Blocks.melon_stem) { + tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); + world.setBlockToAir(x, y, z); + } + if (tBlock == Blocks.red_flower || tBlock == Blocks.yellow_flower + || tBlock == Blocks.carrots + || tBlock == Blocks.potatoes + || tBlock == Blocks.pumpkin + || tBlock == Blocks.pumpkin_stem) { + tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); + world.setBlockToAir(x, y, z); + } + if (tBlock == Blocks.sapling || tBlock.getMaterial() == Material.plants) + world.setBlock(x, y, z, Blocks.deadbush); + if (tBlock == Blocks.cocoa) { + tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0); + world.setBlockToAir(x, y, z); + } + if (tBlock == Blocks.mossy_cobblestone) world.setBlock(x, y, z, Blocks.cobblestone); + if (tBlock == Blocks.grass || tBlock.getMaterial() == Material.grass) world.setBlock(x, y, z, Blocks.dirt); + if (tBlock == Blocks.farmland || tBlock == Blocks.dirt) { + world.setBlock(x, y, z, Blocks.sand); + } + + if (sourRain && world.isRaining() + && (tBlock == Blocks.gravel || tBlock == Blocks.cobblestone) + && world.getBlock(x, y + 1, z) == Blocks.air + && world.canBlockSeeTheSky(x, y, z)) { + if (tBlock == Blocks.cobblestone) { + world.setBlock(x, y, z, Blocks.gravel); + } else { + world.setBlock(x, y, z, Blocks.sand); + } + } + } + + private static Pollution getPollutionManager(World world) { + return dimensionWisePollution.computeIfAbsent(world.provider.dimensionId, i -> new Pollution(world)); + } + + /** @see #addPollution(TileEntity, int) */ + public static void addPollution(IGregTechTileEntity te, int aPollution) { + addPollution((TileEntity) te, aPollution); + } + + /** + * Also pollutes cleanroom if {@code te} is an instance of {@link ICleanroomReceiver}. + * + * @see #addPollution(World, int, int, int) + */ + public static void addPollution(TileEntity te, int aPollution) { + if (!GTMod.gregtechproxy.mPollution || aPollution == 0 || te.getWorldObj().isRemote) return; + + if (aPollution > 0 && te instanceof ICleanroomReceiver receiver) { + ICleanroom cleanroom = receiver.getCleanroom(); + if (cleanroom != null && cleanroom.isValidCleanroom()) { + cleanroom.pollute(); + } + } + + addPollution(te.getWorldObj(), te.xCoord >> 4, te.zCoord >> 4, aPollution); + } + + /** @see #addPollution(World, int, int, int) */ + public static void addPollution(Chunk ch, int aPollution) { + addPollution(ch.worldObj, ch.xPosition, ch.zPosition, aPollution); + } + + /** + * Add some pollution to given chunk. Can pass in negative to remove pollution. Will clamp the final pollution + * number to 0 if it would be changed into negative. + * + * @param w world to modify. do nothing if it's a client world + * @param chunkX chunk coordinate X, i.e. blockX >> 4 + * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4 + * @param aPollution desired delta. Positive means the pollution in chunk would go higher. + */ + public static void addPollution(World w, int chunkX, int chunkZ, int aPollution) { + if (!GTMod.gregtechproxy.mPollution || aPollution == 0 || w.isRemote) return; + mutatePollution(w, chunkX, chunkZ, d -> d.changeAmount(aPollution), null); + } + + private static void mutatePollution(World world, int x, int z, Consumer mutator, + @Nullable Set chunks) { + ChunkData data = STORAGE.get(world, x, z); + boolean hadPollution = data.getAmount() > 0; + mutator.accept(data); + boolean hasPollution = data.getAmount() > 0; + if (hasPollution != hadPollution) { + if (chunks == null) chunks = getPollutionManager(world).pollutedChunks; + if (hasPollution) chunks.add(new ChunkCoordIntPair(x, z)); + else chunks.remove(new ChunkCoordIntPair(x, z)); + } + } + + /** @see #getPollution(World, int, int) */ + public static int getPollution(IGregTechTileEntity te) { + return getPollution(te.getWorld(), te.getXCoord() >> 4, te.getZCoord() >> 4); + } + + /** @see #getPollution(World, int, int) */ + public static int getPollution(Chunk ch) { + return getPollution(ch.worldObj, ch.xPosition, ch.zPosition); + } + + /** + * Get the pollution in specified chunk + * + * @param w world to look in. can be a client world, but that limits the knowledge to what server side send us + * @param chunkX chunk coordinate X, i.e. blockX >> 4 + * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4 + * @return pollution amount. may be 0 if pollution is disabled, or if it's a client world and server did not send us + * info about this chunk + */ + public static int getPollution(World w, int chunkX, int chunkZ) { + if (!GTMod.gregtechproxy.mPollution) return 0; + if (w.isRemote) + // it really should be querying the client side stuff instead + return PollutionRenderer.getKnownPollution(chunkX << 4, chunkZ << 4); + return STORAGE.get(w, chunkX, chunkZ) + .getAmount(); + } + + @Deprecated + public static int getPollution(ChunkCoordIntPair aCh, int aDim) { + return getPollution(DimensionManager.getWorld(aDim), aCh.chunkXPos, aCh.chunkZPos); + } + + public static boolean hasPollution(Chunk ch) { + if (!GTMod.gregtechproxy.mPollution) return false; + return STORAGE.isCreated(ch.worldObj, ch.getChunkCoordIntPair()) && STORAGE.get(ch) + .getAmount() > 0; + } + + // Add compatibility with old code + @Deprecated /* Don't use it... too weird way of passing position */ + public static void addPollution(World aWorld, ChunkPosition aPos, int aPollution) { + // The abuse of ChunkPosition to store block position and dim... + // is just bad especially when that is both used to store ChunkPos and BlockPos depending on context + addPollution(aWorld.getChunkFromBlockCoords(aPos.chunkPosX, aPos.chunkPosZ), aPollution); + } + + static void migrate(ChunkDataEvent.Load e) { + addPollution( + e.getChunk(), + e.getData() + .getInteger("GTPOLLUTION")); + } + + public static class GT_PollutionEventHandler { + + @SubscribeEvent + public void chunkWatch(ChunkWatchEvent.Watch event) { + if (!GTMod.gregtechproxy.mPollution) return; + World world = event.player.worldObj; + if (STORAGE.isCreated(world, event.chunk)) { + int pollution = STORAGE.get(world, event.chunk) + .getAmount(); + if (pollution > POLLUTIONPACKET_MINVALUE) + GTValues.NW.sendToPlayer(new GTPacketPollution(event.chunk, pollution), event.player); + } + } + + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load e) { + // super class loads everything lazily. We force it to load them all. + if (!e.world.isRemote) STORAGE.loadAll(e.world); + } + } + + @ParametersAreNonnullByDefault + private static final class Storage extends GTChunkAssociatedData { + + private Storage() { + super("Pollution", ChunkData.class, 64, (byte) 0, false); + } + + @Override + protected void writeElement(DataOutput output, ChunkData element, World world, int chunkX, int chunkZ) + throws IOException { + output.writeInt(element.getAmount()); + } + + @Override + protected ChunkData readElement(DataInput input, int version, World world, int chunkX, int chunkZ) + throws IOException { + if (version != 0) throw new IOException("Region file corrupted"); + ChunkData data = new ChunkData(input.readInt()); + if (data.getAmount() > 0) + getPollutionManager(world).pollutedChunks.add(new ChunkCoordIntPair(chunkX, chunkZ)); + return data; + } + + @Override + protected ChunkData createElement(World world, int chunkX, int chunkZ) { + return new ChunkData(); + } + + @Override + public void loadAll(World w) { + super.loadAll(w); + } + + public boolean isCreated(World world, ChunkCoordIntPair coord) { + return isCreated(world.provider.dimensionId, coord.chunkXPos, coord.chunkZPos); + } + } + + private static final class ChunkData implements GTChunkAssociatedData.IData { + + public int amount; + + private ChunkData() { + this(0); + } + + private ChunkData(int amount) { + this.amount = Math.max(0, amount); + } + + /** + * Current pollution amount. + */ + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = Math.max(amount, 0); + } + + public void changeAmount(int delta) { + this.amount = Math.max(GTUtility.safeInt(amount + (long) delta, 0), 0); + } + + @Override + public boolean isSameAsDefault() { + return amount == 0; + } + } +} diff --git a/src/main/java/gregtech/common/RecipeAdder.java b/src/main/java/gregtech/common/RecipeAdder.java new file mode 100644 index 0000000000..dd36fd4727 --- /dev/null +++ b/src/main/java/gregtech/common/RecipeAdder.java @@ -0,0 +1,12 @@ +package gregtech.common; + +import gregtech.api.interfaces.internal.IGTRecipeAdder; +import gregtech.api.util.GTRecipeBuilder; + +public class RecipeAdder implements IGTRecipeAdder { + + @Override + public GTRecipeBuilder stdBuilder() { + return GTRecipeBuilder.builder(); + } +} diff --git a/src/main/java/gregtech/common/SmallOreBuilder.java b/src/main/java/gregtech/common/SmallOreBuilder.java index e9a68e7caf..727ea98fc6 100644 --- a/src/main/java/gregtech/common/SmallOreBuilder.java +++ b/src/main/java/gregtech/common/SmallOreBuilder.java @@ -3,7 +3,7 @@ package gregtech.common; import java.util.HashMap; import java.util.Map; -import bloodasp.galacticgreg.api.enums.DimensionDef; +import galacticgreg.api.enums.DimensionDef; import gregtech.api.enums.Materials; public class SmallOreBuilder { diff --git a/src/main/java/gregtech/common/UndergroundOil.java b/src/main/java/gregtech/common/UndergroundOil.java new file mode 100644 index 0000000000..e5da237288 --- /dev/null +++ b/src/main/java/gregtech/common/UndergroundOil.java @@ -0,0 +1,339 @@ +package gregtech.common; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.Objects; +import java.util.WeakHashMap; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.tuple.Pair; + +import gregtech.GTMod; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.objects.GTUODimension; +import gregtech.api.objects.GTUOFluid; +import gregtech.api.objects.XSTR; +import gregtech.api.util.GTChunkAssociatedData; + +/** + * Created by Tec on 29.04.2017. + */ +public class UndergroundOil { + + public static final short DIVIDER = 5000; + private static final GT_UndergroundOilStore STORAGE = new GT_UndergroundOilStore(); + private static final ChunkData NIL_FLUID_STACK = new ChunkData(-1, null, null, false); + + /** + * Effectively just call {@code undergroundOil(te, -1)} for you + * + * @see #undergroundOil(World, int, int, float) + */ + public static FluidStack undergroundOilReadInformation(IGregTechTileEntity te) { + return undergroundOil( + te.getWorld() + .getChunkFromBlockCoords(te.getXCoord(), te.getZCoord()), + -1); + } + + /** + * Effectively just call {@code undergroundOil(chunk, -1)} for you + * + * @see #undergroundOil(World, int, int, float) + */ + public static FluidStack undergroundOilReadInformation(Chunk chunk) { + return undergroundOil(chunk, -1); + } + + /** @see #undergroundOil(World, int, int, float) */ + public static FluidStack undergroundOil(IGregTechTileEntity te, float readOrDrainCoefficient) { + return undergroundOil( + te.getWorld() + .getChunkFromBlockCoords(te.getXCoord(), te.getZCoord()), + readOrDrainCoefficient); + } + + // Returns whole content for information purposes -> when drainSpeedCoefficient < 0 + // Else returns extracted fluidStack if amount > 0, or null otherwise + /** @see #undergroundOil(World, int, int, float) */ + public static FluidStack undergroundOil(Chunk chunk, float readOrDrainCoefficient) { + return undergroundOil(chunk.worldObj, chunk.xPosition, chunk.zPosition, readOrDrainCoefficient); + } + + /** + * Pump fluid or read info. + * + * @param w a remote World. For a WorldClient it will always tell you null + * @param chunkX chunk coordinate X, i.e. blockX >> 4 + * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4 + * @param readOrDrainCoefficient how fast to pump. The higher the faster. use negative to read expected current + * output + * @return null if nothing here, or depleted already, or a client side world + */ + public static FluidStack undergroundOil(World w, int chunkX, int chunkZ, float readOrDrainCoefficient) { + if (w.isRemote) return null; // troublemakers go away + ChunkData chunkData = STORAGE.get(w, chunkX, chunkZ); + if (chunkData.getVein() == null || chunkData.getFluid() == null) // nothing here... + return null; + // do stuff on it if needed + FluidStack fluidInChunk = new FluidStack(chunkData.getFluid(), 0); + if (readOrDrainCoefficient >= 0) { + int fluidExtracted = (int) Math.floor(chunkData.getAmount() * (double) readOrDrainCoefficient / DIVIDER); + double averageDecrease = chunkData.getVein().DecreasePerOperationAmount * (double) readOrDrainCoefficient; + int decrease = (int) Math.ceil(averageDecrease); + if (fluidExtracted <= 0 || chunkData.amount <= decrease) { // decrease - here it is max value of extraction + // for easy check + chunkData.setAmount(0); + } else { + fluidInChunk.amount = fluidExtracted; // give appropriate amount + if (XSTR_INSTANCE.nextFloat() < (decrease - averageDecrease)) decrease--; // use XSTR_INSTANCE to + // "subtract double from int" + // ex. + // averageDecrease=3.9 + // decrease= ceil from 3.9 = 4 + // decrease-averageDecrease=0.1 -> chance to subtract 1 + // if XSTR_INSTANCE is < chance then subtract 1 + chunkData.changeAmount(-decrease); // diminish amount, "randomly" adjusted to double value + // (averageDecrease) + } + } else { // just get info + if (chunkData.amount <= DIVIDER) { + chunkData.setAmount(0); + } else { + // get the expected current output + fluidInChunk.amount = (int) Math + .floor(chunkData.getAmount() * (double) -readOrDrainCoefficient / DIVIDER); + } + } + return fluidInChunk; + } + + /** + * Get the deposit as if it is never exploited + * + * @return UO fluid kind and amount, or null if nothing here. + */ + public static Pair getPristineAmount(World world, int chunkX, int chunkZ) { + int dimensionId = world.provider.dimensionId; + GTUODimension dimension = GTMod.gregtechproxy.mUndergroundOil.GetDimension(dimensionId); + if (dimension == null) return null; + // prepare RNG + final XSTR tVeinRNG = new XSTR(world.getSeed() + dimensionId * 2L + (chunkX >> 3) + 8267L * (chunkZ >> 3)); + GTUOFluid uoFluid = dimension.getRandomFluid(tVeinRNG); + // nothing here :( + if (uoFluid == null || uoFluid.getFluid() == null) return null; + // offset each chunk's fluid amount by +-25% + // discard random values not for current chunk + int veinAverage = uoFluid.getRandomAmount(tVeinRNG); + for (int i = 0; i < (((chunkX & 0x7) << 3) | chunkZ & 0x7); i++) { + tVeinRNG.next(24); + } + int amount = (int) ((float) veinAverage * (0.75f + (tVeinRNG.nextFloat() / 2f))); + return Pair.of(uoFluid, amount); + } + + static void migrate(ChunkDataEvent.Load e) { + if (e.getData() + .hasKey("GTOIL") + && e.getData() + .hasKey("GTOILFLUID")) { + ChunkData chunkData = STORAGE.get(e.getChunk()); + Fluid fluid = chunkData.getFluid(); + if (fluid != null && fluid.getID() == e.getData() + .getInteger("GTOILFLUID")) chunkData.setAmount( + Math.min( + chunkData.getAmount(), + e.getData() + .getInteger("GTOIL"))); + } + } + + /** + * Revamped UO store. + *

+ * Primary functionality: + * + *

    + *
  • Decouple data storage with chunk, making it possible to pump oil from unloaded chunks
  • + *
  • Regen detection. If fluid generation config is changed, chunk fluid will be regenerated.
  • + *
+ * + *

Serialized form

+ *

+ * Since the exact file layout is controlled by the super class, here we only concern how each chunk's data is + * written. + *

Form A: Empty Chunk

+ *
    + *
  1. 4 bytes of 0
  2. + *
+ * + *

Form B: Normal Chunk

+ *
    + *
  1. 4 bytes unsigned integer. Vein Hash.
  2. + *
  3. UTF string. Vein Key.
  4. + *
  5. 4 bytes signed integer. Fluid amount.
  6. + *
+ * + * @author glease + */ + @ParametersAreNonnullByDefault + private static class GT_UndergroundOilStore extends GTChunkAssociatedData { + + private static final WeakHashMap hashes = new WeakHashMap<>(); + + private GT_UndergroundOilStore() { + super("UO", UndergroundOil.ChunkData.class, 64, (byte) 0, false); + } + + @Override + protected void writeElement(DataOutput output, ChunkData element, World world, int chunkX, int chunkZ) + throws IOException { + /* see class javadoc for explanation */ + output.writeInt(element.getVeinHash()); + if (element.getVeinKey() == null) return; + output.writeUTF(element.getVeinKey()); + if (element.getAmount() > 0 && element.getFluid() != null) { + output.writeInt(element.getAmount()); + } else { + output.writeInt(-1); + } + } + + @Override + protected UndergroundOil.ChunkData readElement(DataInput input, int version, World world, int chunkX, + int chunkZ) throws IOException { + /* see class javadoc for explanation */ + if (version != 0) throw new IOException("Region file corrupted"); + UndergroundOil.ChunkData pristine = createElement(world, chunkX, chunkZ); + int hash = input.readInt(); + String veinKey = hash != 0 ? input.readUTF() : null; + int amount = hash != 0 ? input.readInt() : -1; + if (hash != pristine.veinHash || !Objects.equals(veinKey, pristine.getVeinKey())) { + // vein config changed. use regen-ed data. + return pristine; + } + if (hash == 0) return NIL_FLUID_STACK; + return new UndergroundOil.ChunkData( + amount, + GTMod.gregtechproxy.mUndergroundOil.GetDimension(world.provider.dimensionId) + .getUOFluid(veinKey), + veinKey); + } + + @Override + protected UndergroundOil.ChunkData createElement(World world, int chunkX, int chunkZ) { + Pair pristine = getPristineAmount(world, chunkX, chunkZ); + if (pristine == null) return NIL_FLUID_STACK; + int dimensionId = world.provider.dimensionId; + GTUODimension dimension = GTMod.gregtechproxy.mUndergroundOil.GetDimension(dimensionId); + return new UndergroundOil.ChunkData( + pristine.getRight(), + pristine.getLeft(), + dimension.getUOFluidKey(pristine.getLeft()), + false); + } + + private static int hash(@Nullable GTUOFluid fluid) { + if (fluid == null) return 0; + int result = fluid.Registry.hashCode(); + result = 31 * result + fluid.MaxAmount; + result = 31 * result + fluid.MinAmount; + result = 31 * result + fluid.Chance; + result = 31 * result + fluid.DecreasePerOperationAmount; + return result == 0 ? 1 : result; + } + } + + /** + * Represent the amount of fluid in a given chunk. + */ + private static final class ChunkData implements GTChunkAssociatedData.IData { + + private final Fluid fluid; + + @Nullable + private final GTUOFluid vein; + + private final String veinKey; + private final int veinHash; + private int amount; + private boolean dirty; + + private ChunkData(int amount, GTUOFluid veinKey, String veinID) { + this(amount, veinKey, veinID, true); + } + + private ChunkData(int amount, @Nullable GTUOFluid vein, @Nullable String veinKey, boolean dirty) { + this.amount = amount; + this.vein = vein; + this.dirty = dirty; + if (vein == null) { + fluid = null; + this.veinKey = null; + veinHash = 0; + } else { + fluid = vein.getFluid(); + this.veinKey = veinKey; + veinHash = GT_UndergroundOilStore.hashes.computeIfAbsent(vein, GT_UndergroundOilStore::hash); + } + } + + /** + * The current fluid type. {@code null} if vein is generated to be empty. + */ + @Nullable + public Fluid getFluid() { + return fluid; + } + + /** + * Current fluid amount. Might be 0 if empty. Cannot be negative + */ + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + if (this.amount != amount) dirty = true; + this.amount = Math.max(0, amount); + } + + public void changeAmount(int delta) { + if (delta != 0) dirty = true; + this.amount = Math.max(amount + delta, 0); + } + + @Nullable + public GTUOFluid getVein() { + return vein; + } + + /** + * The vein ID. Might be null if generated to be empty. + */ + @Nullable + public String getVeinKey() { + return veinKey; + } + + public int getVeinHash() { + return veinHash; + } + + @Override + public boolean isSameAsDefault() { + return !dirty; + } + } +} diff --git a/src/main/java/gregtech/common/WirelessComputationPacket.java b/src/main/java/gregtech/common/WirelessComputationPacket.java index cafe4d93dc..1b485a63c9 100644 --- a/src/main/java/gregtech/common/WirelessComputationPacket.java +++ b/src/main/java/gregtech/common/WirelessComputationPacket.java @@ -4,11 +4,11 @@ import static gregtech.common.misc.GlobalVariableStorage.GlobalWirelessComputati import java.util.UUID; -import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket; import com.gtnewhorizon.structurelib.util.Vec3Impl; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.common.misc.spaceprojects.SpaceProjectManager; +import tectech.mechanics.dataTransport.QuantumDataPacket; public class WirelessComputationPacket { diff --git a/src/main/java/gregtech/common/WorldgenGTOreLayer.java b/src/main/java/gregtech/common/WorldgenGTOreLayer.java new file mode 100644 index 0000000000..a8f57ef1de --- /dev/null +++ b/src/main/java/gregtech/common/WorldgenGTOreLayer.java @@ -0,0 +1,439 @@ +package gregtech.common; + +import static gregtech.api.enums.GTValues.debugOrevein; +import static gregtech.api.enums.GTValues.oreveinPlacerOres; +import static gregtech.api.enums.GTValues.oreveinPlacerOresMultiplier; + +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.util.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.WorldProviderEnd; +import net.minecraft.world.WorldProviderHell; +import net.minecraft.world.WorldProviderSurface; +import net.minecraft.world.chunk.IChunkProvider; + +import galacticgreg.api.enums.DimensionDef; +import gregtech.api.GregTechAPI; +import gregtech.api.util.GTLog; +import gregtech.api.world.GTWorldgen; +import gregtech.common.blocks.TileEntityOres; + +public class WorldgenGTOreLayer extends GTWorldgen { + + public static ArrayList sList = new ArrayList<>(); + public static int sWeight = 0; + public final short mMinY; + public final short mMaxY; + public final short mWeight; + public final short mDensity; + public final short mSize; + public final short mPrimaryMeta; + public final short mSecondaryMeta; + public final short mBetweenMeta; + public final short mSporadicMeta; + public final String mRestrictBiome; + public final boolean mOverworld; + public final boolean mNether; + public final boolean mEnd; + public final boolean mEndAsteroid; + public final boolean twilightForest; + 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 Class[] mAllowedProviders; + + public WorldgenGTOreLayer(OreMixBuilder mix) { + super(mix.oreMixName, sList, mix.enabledByDefault); + this.mOverworld = mix.dimsEnabled.getOrDefault(OreMixBuilder.OW, false); + this.mNether = mix.dimsEnabled.getOrDefault(OreMixBuilder.NETHER, false); + this.mEnd = mix.dimsEnabled.getOrDefault(OreMixBuilder.THE_END, false); + this.mEndAsteroid = mix.dimsEnabled + .getOrDefault(DimensionDef.EndAsteroids.modDimensionDef.getDimensionName(), false); + this.twilightForest = mix.dimsEnabled.getOrDefault(OreMixBuilder.TWILIGHT_FOREST, false); + this.mMinY = ((short) mix.minY); + short mMaxY = ((short) mix.maxY); + if (mMaxY < (this.mMinY + 9)) { + GTLog.out.println("Oremix " + this.mWorldGenName + " has invalid Min/Max heights!"); + mMaxY = (short) (this.mMinY + 9); + } + this.mMaxY = mMaxY; + this.mWeight = (short) mix.weight; + this.mDensity = (short) mix.density; + this.mSize = (short) Math.max(1, mix.size); + this.mPrimaryMeta = (short) mix.primary.mMetaItemSubID; + this.mSecondaryMeta = (short) mix.secondary.mMetaItemSubID; + this.mBetweenMeta = (short) mix.between.mMetaItemSubID; + this.mSporadicMeta = (short) mix.sporadic.mMetaItemSubID; + this.mRestrictBiome = "None"; + + if (this.mEnabled) { + sWeight += this.mWeight; + } + + List allowedProviders = new ArrayList<>(); + if (this.mNether) { + allowedProviders.add(WorldProviderHell.class); + } + + if (this.mOverworld) { + allowedProviders.add(WorldProviderSurface.class); + } + + if (this.mEnd) { + allowedProviders.add(WorldProviderEnd.class); + } + mAllowedProviders = allowedProviders.toArray(new Class[allowedProviders.size()]); + } + + @Override + public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, + int aChunkZ, int aSeedX, int aSeedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { + if (mWorldGenName.equals("NoOresInVein")) { + if (debugOrevein) GTLog.out.println(" NoOresInVein"); + // Return a special empty orevein + return ORE_PLACED; + } + + if (!isGenerationAllowed(aWorld, mAllowedProviders)) { + // The following code can be used for debugging, but it spams in logs + // if (debugOrevein) { GTLog.out.println( "Wrong dimension" ); } + return WRONG_DIMENSION; + } + + if (!this.mRestrictBiome.equals("None") && !(this.mRestrictBiome.equals(aBiome))) { + return WRONG_BIOME; + } + // For optimal performance, this should be done upstream. Meh + String tDimensionName = aWorld.provider.getDimensionName(); + boolean isUnderdark = tDimensionName.equals("Underdark"); + + int[] placeCount = new int[4]; + + int tMinY = mMinY + aRandom.nextInt(mMaxY - mMinY - 5); + // Determine West/East ends of orevein + int wXVein = aSeedX - aRandom.nextInt(mSize); // West side + int eXVein = aSeedX + 16 + aRandom.nextInt(mSize); + // Limit Orevein to only blocks present in current chunk + int wX = Math.max(wXVein, aChunkX + 2); // Bias placement by 2 blocks to prevent worldgen cascade. + int eX = Math.min(eXVein, aChunkX + 2 + 16); + + // Get a block at the center of the chunk and the bottom of the orevein. + Block tBlock = aWorld.getBlock(aChunkX + 7, tMinY, aChunkZ + 9); + + if (wX >= eX) { // No overlap between orevein and this chunk exists in X + if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.stone) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.netherrack) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.end_stone) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTechAPI.sBlockGranites) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTechAPI.sBlockStones)) { + // Didn't reach, but could have placed. Save orevein for future use. + return NO_OVERLAP; + } else { + // Didn't reach, but couldn't place in test spot anywys, try for another orevein + return NO_OVERLAP_AIR_BLOCK; + } + } + // Determine North/Sound ends of orevein + int nZVein = aSeedZ - aRandom.nextInt(mSize); + int sZVein = aSeedZ + 16 + aRandom.nextInt(mSize); + + int nZ = Math.max(nZVein, aChunkZ + 2); // Bias placement by 2 blocks to prevent worldgen cascade. + int sZ = Math.min(sZVein, aChunkZ + 2 + 16); + if (nZ >= sZ) { // No overlap between orevein and this chunk exists in Z + if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.stone) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.netherrack) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.end_stone) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTechAPI.sBlockGranites) + || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTechAPI.sBlockStones)) { + // Didn't reach, but could have placed. Save orevein for future use. + return NO_OVERLAP; + } else { + // Didn't reach, but couldn't place in test spot anywys, try for another orevein + return NO_OVERLAP_AIR_BLOCK; + } + } + + if (debugOrevein) { + GTLog.out.print( + "Trying Orevein:" + this.mWorldGenName + + " Dimension=" + + tDimensionName + + " mX=" + + aChunkX / 16 + + " mZ=" + + aChunkZ / 16 + + " oreseedX=" + + aSeedX / 16 + + " oreseedZ=" + + aSeedZ / 16 + + " cY=" + + tMinY); + } + // Adjust the density down the more chunks we are away from the oreseed. The 5 chunks surrounding the seed + // should always be max density due to truncation of Math.sqrt(). + int localDensity = Math.max( + 1, + this.mDensity / ((int) Math + .sqrt(2 + Math.pow(aChunkX / 16 - aSeedX / 16, 2) + Math.pow(aChunkZ / 16 - aSeedZ / 16, 2)))); + + // To allow for early exit due to no ore placed in the bottom layer (probably because we are in the sky), unroll + // 1 pass through the loop + // Now we do bottom-level-first oregen, and work our way upwards. + // Layer -1 Secondary and Sporadic + int level = tMinY - 1; // Dunno why, but the first layer is actually played one below tMinY. Go figure. + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math + .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mSecondaryMeta > 0)) { + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) { + placeCount[1]++; + } + } else + if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + if ((placeCount[1] + placeCount[3]) == 0) { + if (debugOrevein) GTLog.out.println(" No ore in bottom layer"); + return NO_ORE_IN_BOTTOM_LAYER; // Exit early, didn't place anything in the bottom layer + } + // Layers 0 & 1 Secondary and Sporadic + for (level = tMinY; level < (tMinY + 2); level++) { + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math.max( + 1, + Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSecondaryMeta > 0)) { + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) { + placeCount[1]++; + } + } else if ((aRandom.nextInt(7) == 0) + && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + } + // Layer 2 is Secondary, in-between, and sporadic + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math + .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { + placeCount[2]++; + } + } else if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSecondaryMeta > 0)) { + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) { + placeCount[1]++; + } + } else + if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + level++; // Increment level to next layer + // Layer 3 is In-between, and sporadic + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math + .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { + placeCount[2]++; + } + } else + if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + level++; // Increment level to next layer + // Layer 4 is In-between, Primary and sporadic + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math + .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { + placeCount[2]++; + } + } else + if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { + placeCount[1]++; + } + } else if ((aRandom.nextInt(7) == 0) + && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + level++; // Increment level to next layer + // Layer 5 is In-between, Primary and sporadic + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math + .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) { + placeCount[2]++; + } + } else + if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { + placeCount[1]++; + } + } else if ((aRandom.nextInt(7) == 0) + && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + level++; // Increment level to next layer + // Layer 6 is Primary and sporadic + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math + .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { + placeCount[1]++; + } + } else + if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + level++; // Increment level to next layer + // Layer 7 is Primary and sporadic + for (int tX = wX; tX < eX; tX++) { + int placeX = Math + .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity); + for (int tZ = nZ; tZ < sZ; tZ++) { + int placeZ = Math + .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity); + if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) { + if (TileEntityOres.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) { + placeCount[1]++; + } + } else + if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) + && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate + if (TileEntityOres + .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark)) + placeCount[3]++; + } + } + } + // Place small ores for the vein + if (oreveinPlacerOres) { + int nSmallOres = (eX - wX) * (sZ - nZ) * this.mDensity / 10 * oreveinPlacerOresMultiplier; + // Small ores are placed in the whole chunk in which the vein appears. + for (int nSmallOresCount = 0; nSmallOresCount < nSmallOres; nSmallOresCount++) { + int tX = aRandom.nextInt(16) + aChunkX + 2; + int tZ = aRandom.nextInt(16) + aChunkZ + 2; + int tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores. + if (this.mPrimaryMeta > 0) + TileEntityOres.setOreBlock(aWorld, tX, tY, tZ, this.mPrimaryMeta, true, isUnderdark); + tX = aRandom.nextInt(16) + aChunkX + 2; + tZ = aRandom.nextInt(16) + aChunkZ + 2; + tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores. + if (this.mSecondaryMeta > 0) + TileEntityOres.setOreBlock(aWorld, tX, tY, tZ, this.mSecondaryMeta, true, isUnderdark); + tX = aRandom.nextInt(16) + aChunkX + 2; + tZ = aRandom.nextInt(16) + aChunkZ + 2; + tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores. + if (this.mBetweenMeta > 0) + TileEntityOres.setOreBlock(aWorld, tX, tY, tZ, this.mBetweenMeta, true, isUnderdark); + tX = aRandom.nextInt(16) + aChunkX + 2; + tZ = aRandom.nextInt(16) + aChunkZ + 2; + tY = aRandom.nextInt(190) + 10; // Y height can vary from 10 to 200 for small ores. + if (this.mSporadicMeta > 0) + TileEntityOres.setOreBlock(aWorld, tX, tY, tZ, this.mSporadicMeta, true, isUnderdark); + } + } + if (debugOrevein) { + GTLog.out.println( + " wXVein" + wXVein + + " eXVein" + + eXVein + + " nZVein" + + nZVein + + " sZVein" + + sZVein + + " locDen=" + + localDensity + + " Den=" + + this.mDensity + + " Sec=" + + placeCount[1] + + " Spo=" + + placeCount[3] + + " Bet=" + + placeCount[2] + + " Pri=" + + placeCount[0]); + } + // Something (at least the bottom layer must have 1 block) must have been placed, return true + return ORE_PLACED; + } +} diff --git a/src/main/java/gregtech/common/WorldgenGTOreSmallPieces.java b/src/main/java/gregtech/common/WorldgenGTOreSmallPieces.java new file mode 100644 index 0000000000..86d9c84e5f --- /dev/null +++ b/src/main/java/gregtech/common/WorldgenGTOreSmallPieces.java @@ -0,0 +1,107 @@ +package gregtech.common; + +import static gregtech.api.enums.GTValues.debugSmallOres; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.world.World; +import net.minecraft.world.WorldProviderEnd; +import net.minecraft.world.WorldProviderHell; +import net.minecraft.world.WorldProviderSurface; +import net.minecraft.world.chunk.IChunkProvider; + +import gregtech.api.GregTechAPI; +import gregtech.api.util.GTLog; +import gregtech.api.world.GTWorldgen; +import gregtech.common.blocks.TileEntityOres; + +public class WorldgenGTOreSmallPieces extends GTWorldgen { + + public final short mMinY; + public final short mMaxY; + public final short mAmount; + public final short mMeta; + public final boolean mOverworld; + public final boolean mNether; + public final boolean mEnd; + public final boolean twilightForest; + public final String mBiome; + public static ArrayList sList = new ArrayList<>(); + + public Class[] mAllowedProviders; + + public WorldgenGTOreSmallPieces(SmallOreBuilder ore) { + super(ore.smallOreName, GregTechAPI.sWorldgenList, ore.enabledByDefault); + this.mOverworld = ore.dimsEnabled.getOrDefault(SmallOreBuilder.OW, false); + this.mNether = ore.dimsEnabled.getOrDefault(SmallOreBuilder.NETHER, false); + this.mEnd = ore.dimsEnabled.getOrDefault(SmallOreBuilder.THE_END, false); + this.twilightForest = ore.dimsEnabled.getOrDefault(SmallOreBuilder.TWILIGHT_FOREST, false); + + this.mMinY = (short) ore.minY; + this.mMaxY = (short) Math.max(this.mMinY + 1, ore.maxY); + this.mAmount = (short) Math.max(1, ore.amount); + this.mMeta = (short) ore.ore.mMetaItemSubID; + this.mBiome = "None"; + + if (this.mEnabled) sList.add(this); + + List allowedProviders = new ArrayList<>(); + if (this.mNether) { + allowedProviders.add(WorldProviderHell.class); + } + + if (this.mOverworld) { + allowedProviders.add(WorldProviderSurface.class); + } + + if (this.mEnd) { + allowedProviders.add(WorldProviderEnd.class); + } + mAllowedProviders = allowedProviders.toArray(new Class[allowedProviders.size()]); + } + + @Override + public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, + int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { + if (!this.mBiome.equals("None") && !(this.mBiome.equals(aBiome))) { + return false; // Not the correct biome for ore mix + } + if (!isGenerationAllowed(aWorld, mAllowedProviders)) { + return false; + } + int count = 0; + // For optimal performance, this should be done upstream. Meh + String tDimensionName = aWorld.provider.getDimensionName(); + boolean isUnderdark = tDimensionName.equals("Underdark"); + + if (this.mMeta > 0) { + int j = Math.max(1, this.mAmount / 2 + aRandom.nextInt(this.mAmount) / 2); + for (int i = 0; i < j; i++) { + TileEntityOres.setOreBlock( + aWorld, + aChunkX + 8 + aRandom.nextInt(16), + this.mMinY + aRandom.nextInt(Math.max(1, this.mMaxY - this.mMinY)), + aChunkZ + 8 + aRandom.nextInt(16), + this.mMeta, + true, + isUnderdark); + count++; + } + } + if (debugSmallOres) { + GTLog.out.println( + "Small Ore:" + this.mWorldGenName + + " @ dim=" + + aDimensionType + + " mX=" + + aChunkX / 16 + + " mZ=" + + aChunkZ / 16 + + " ore=" + + count); + } + return true; + } +} diff --git a/src/main/java/gregtech/common/WorldgenStone.java b/src/main/java/gregtech/common/WorldgenStone.java new file mode 100644 index 0000000000..d995375437 --- /dev/null +++ b/src/main/java/gregtech/common/WorldgenStone.java @@ -0,0 +1,297 @@ +package gregtech.common; + +import static gregtech.api.enums.GTValues.debugStones; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Hashtable; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; + +import gregtech.api.GregTechAPI; +import gregtech.api.objects.XSTR; +import gregtech.api.util.GTLog; +import gregtech.api.world.GTWorldgen; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; + +public class WorldgenStone extends GTWorldgen { + + static final double[] sizeConversion = { 1, 1, 1.333333, 1.333333, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; // Bias + // the + // sizes + // towards + // skinnier + // boulders, + // ie + // more + // "shafts" + // than + // dikes + // or + // sills. + + public final int mBlockMeta, mAmount, mSize, mMinY, mMaxY, mProbability, mDimensionType; + public final Block mBlock; + public final Collection mBiomeList; + public final boolean mAllowToGenerateinVoid; + private final String aTextWorldgen = "worldgen."; + + public Hashtable validStoneSeeds = new Hashtable<>(1024); + + static class StoneSeeds { + + public boolean mExists; + + StoneSeeds(boolean exists) { + mExists = exists; + } + } + + static class ValidSeeds { + + public int mX; + public int mZ; + + ValidSeeds(int x, int z) { + this.mX = x; + this.mZ = z; + } + } + + public WorldgenStone(StoneBuilder stone) { + super(stone.stoneName, GregTechAPI.sWorldgenList, stone.enabledByDefault); + mDimensionType = stone.dimension; + mBlock = stone.block; + mBlockMeta = Math.min(Math.max(stone.blockMeta, 0), 15); + mProbability = stone.probability; + mAmount = stone.amount; + mSize = stone.size; + mMinY = stone.minY; + mMaxY = stone.maxY; + mBiomeList = new ArrayList<>(); + mAllowToGenerateinVoid = stone.allowToGenerateInVoid; + } + + @Override + public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, + int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { + XSTR stoneRNG = new XSTR(); + ArrayList stones = new ArrayList<>(); + + if (!isGenerationAllowed(aWorld, mDimensionType)) { + return false; + } + if (!(this.mBiomeList.isEmpty() || this.mBiomeList.contains(aBiome))) { + return false; + } + // I think the real size of the balls is mSize/8, but the original code was difficult to understand. + // Overall there will be less GT stones since they aren't spheres any more. /16 since this code uses it as a + // radius. + double realSize = mSize / 16; + int windowWidth = ((int) realSize) / 16 + 1; // Width of chunks to check for a potential stoneseed + // Check stone seeds to see if they have been added + for (int x = aChunkX / 16 - windowWidth; x < (aChunkX / 16 + windowWidth + 1); x++) { + for (int z = aChunkZ / 16 - windowWidth; z < (aChunkZ / 16 + windowWidth + 1); z++) { + long hash = (((aWorld.provider.dimensionId & 0xffL) << 56) | (((long) x & 0x000000000fffffffL) << 28) + | ((long) z & 0x000000000fffffffL)); + if (!validStoneSeeds.containsKey(hash)) { + // Determine if RNG says to add stone at this chunk + stoneRNG.setSeed( + aWorld.getSeed() ^ hash + Math.abs(mBlockMeta) + + Math.abs(mSize) + + ((GregTechAPI.sBlockGranites == mBlock) ? (32768) : (0))); // Don't judge me. + // Want different + // values for + // different block + // types + if ((this.mProbability <= 1) || (stoneRNG.nextInt(this.mProbability) == 0)) { + // Add stone at this chunk + validStoneSeeds.put(hash, new StoneSeeds(true)); + // Add to generation list + stones.add(new ValidSeeds(x, z)); + if (debugStones) GTLog.out.println( + "New stoneseed=" + mWorldGenName + " x=" + x + " z=" + z + " realSize=" + realSize); + } else { + validStoneSeeds.put(hash, new StoneSeeds(false)); + } + } else { + // This chunk has already been checked, check to see if a boulder exists here + if (validStoneSeeds.get(hash).mExists) { + // Add to generation list + stones.add(new ValidSeeds(x, z)); + } + } + } + } + + boolean result = stones.size() != 0; + // Now process each oreseed vs this requested chunk + for (; stones.size() != 0; stones.remove(0)) { + int x = stones.get(0).mX * 16; + int z = stones.get(0).mZ * 16; + + stoneRNG.setSeed( + aWorld.getSeed() + ^ (((aWorld.provider.dimensionId & 0xffL) << 56) | (((long) x & 0x000000000fffffffL) << 28) + | ((long) z & 0x000000000fffffffL)) + Math.abs(mBlockMeta) + + Math.abs(mSize) + + ((GregTechAPI.sBlockGranites == mBlock) ? (32768) : (0))); // Don't judge me + for (int i = 0; i < this.mAmount; i++) { // Not sure why you would want more than one in a chunk! Left alone + // though. + // Locate the stoneseed XYZ. Original code would request an isAir at the seed location, causing a chunk + // generation request. + // To reduce potential worldgen cascade, we just always try to place a ball and use the check inside the + // for loop to prevent + // placement instead. + int tX = x + stoneRNG.nextInt(16); + int tY = mMinY + stoneRNG.nextInt(mMaxY - mMinY); + int tZ = z + stoneRNG.nextInt(16); + + // Determine the XYZ sizes of the stoneseed + double xSize = sizeConversion[stoneRNG.nextInt(sizeConversion.length)]; + double ySize = sizeConversion[stoneRNG.nextInt(sizeConversion.length) / 2]; // Skew the ySize towards + // the larger sizes, more + // long skinny pipes + double zSize = sizeConversion[stoneRNG.nextInt(sizeConversion.length)]; + + // Equation for an ellipsoid centered around 0,0,0 + // Sx, Sy, and Sz are size controls (size = 1/S_) + // 1 = full size, 1.333 = 75%, 2 = 50%, 4 = 25% + // (x * Sx)^2 + (y * Sy)^2 + (z * sZ)^2 <= (mSize)^2 + + // So, we setup the intial boundaries to be the size of the boulder plus a block in each direction + int tMinX = tX - (int) (realSize / xSize - 1.0); + int tMaxX = tX + (int) (realSize / xSize + 2.0); + int tMinY = tY - (int) (realSize / ySize - 1.0); + int tMaxY = tY + (int) (realSize / ySize + 2.0); + int tMinZ = tZ - (int) (realSize / zSize - 1.0); + int tMaxZ = tZ + (int) (realSize / zSize + 2.0); + + // If the (tY-ySize) of the stoneseed is air in the current chunk, mark the seed empty and move on. + if (aWorld.getBlock(aChunkX + 8, tMinY, aChunkZ + 8) + .isAir(aWorld, aChunkX + 8, tMinY, aChunkZ + 8)) { + if (debugStones) GTLog.out.println( + mWorldGenName + " tX=" + + tX + + " tY=" + + tY + + " tZ=" + + tZ + + " realSize=" + + realSize + + " xSize=" + + realSize / xSize + + " ySize=" + + realSize / ySize + + " zSize=" + + realSize / zSize + + " tMinY=" + + tMinY + + " tMaxY=" + + tMaxY + + " - Skipped because first requesting chunk would not contain this stone"); + long hash = (((aWorld.provider.dimensionId & 0xffL) << 56) + | (((long) x & 0x000000000fffffffL) << 28) + | ((long) z & 0x000000000fffffffL)); + validStoneSeeds.remove(hash); + validStoneSeeds.put(hash, new StoneSeeds(false)); + } + + // Chop the boundaries by the parts that intersect with the current chunk + int wX = Math.max(tMinX, aChunkX + 8); + int eX = Math.min(tMaxX, aChunkX + 8 + 16); + + int sZ = Math.max(tMinZ, aChunkZ + 8); + int nZ = Math.min(tMaxZ, aChunkZ + 8 + 16); + + if (debugStones) GTLog.out.println( + mWorldGenName + " tX=" + + tX + + " tY=" + + tY + + " tZ=" + + tZ + + " realSize=" + + realSize + + " xSize=" + + realSize / xSize + + " ySize=" + + realSize / ySize + + " zSize=" + + realSize / zSize + + " wX=" + + wX + + " eX=" + + eX + + " tMinY=" + + tMinY + + " tMaxY=" + + tMaxY + + " sZ=" + + sZ + + " nZ=" + + nZ); + + double rightHandSide = realSize * realSize + 1; // Precalc the right hand side + for (int iY = tMinY; iY < tMaxY; iY++) { // Do placement from the bottom up layer up. Maybe better on + // cache usage? + double yCalc = ((double) (iY - tY) * ySize); + yCalc = yCalc * yCalc; // (y*Sy)^2 + double leftHandSize = yCalc; + if (leftHandSize > rightHandSide) { + continue; // If Y alone is larger than the RHS, skip the rest of the loops + } + for (int iX = wX; iX < eX; iX++) { + double xCalc = ((double) (iX - tX) * xSize); + xCalc = xCalc * xCalc; + leftHandSize = yCalc + xCalc; + if (leftHandSize > rightHandSide) { // Again, if X and Y is larger than the RHS, skip to the + // next value + continue; + } + for (int iZ = sZ; iZ < nZ; iZ++) { + double zCalc = ((double) (iZ - tZ) * zSize); + zCalc = zCalc * zCalc; + leftHandSize = zCalc + xCalc + yCalc; + if (leftHandSize <= rightHandSide) { + // Yay! We can actually place a block now. (this part copied from original code) + Block tTargetedBlock = aWorld.getBlock(iX, iY, iZ); + if (tTargetedBlock instanceof BlockOresAbstract) { + TileEntity tTileEntity = aWorld.getTileEntity(iX, iY, iZ); + if ((tTileEntity instanceof TileEntityOres)) { + if (tTargetedBlock != GregTechAPI.sBlockOres1) { + ((TileEntityOres) tTileEntity).convertOreBlock(aWorld, iX, iY, iZ); + } + ((TileEntityOres) tTileEntity) + .overrideOreBlockMaterial(this.mBlock, (byte) this.mBlockMeta); + } + } else if (((this.mAllowToGenerateinVoid) && (aWorld.getBlock(iX, iY, iZ) + .isAir(aWorld, iX, iY, iZ))) + || ((tTargetedBlock != null) && ((tTargetedBlock + .isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.stone)) + || (tTargetedBlock + .isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.stained_hardened_clay)) + || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.cobblestone)) + || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.end_stone)) + || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.netherrack)) + || (tTargetedBlock + .isReplaceableOreGen(aWorld, iX, iY, iZ, GregTechAPI.sBlockGranites)) + || (tTargetedBlock + .isReplaceableOreGen(aWorld, iX, iY, iZ, GregTechAPI.sBlockStones))))) { + aWorld.setBlock(iX, iY, iZ, this.mBlock, this.mBlockMeta, 0); + } + } + } + } + } + } + } + return result; + } +} diff --git a/src/main/java/gregtech/common/bees/GTAlleleBeeSpecies.java b/src/main/java/gregtech/common/bees/GTAlleleBeeSpecies.java new file mode 100644 index 0000000000..59bc4737e2 --- /dev/null +++ b/src/main/java/gregtech/common/bees/GTAlleleBeeSpecies.java @@ -0,0 +1,53 @@ +package gregtech.common.bees; + +import java.awt.Color; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +import forestry.api.apiculture.EnumBeeChromosome; +import forestry.api.apiculture.IAlleleBeeSpeciesCustom; +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IClassification; +import forestry.apiculture.genetics.alleles.AlleleBeeSpecies; + +public class GTAlleleBeeSpecies extends AlleleBeeSpecies { + + public GTAlleleBeeSpecies(String uid, boolean dominant, String unlocalizedName, String authority, + String unlocalizedDescription, IClassification branch, String binomial, Color primaryColor, + Color secondaryColor) { + super( + uid, + unlocalizedName, + authority, + unlocalizedDescription, + dominant, + branch, + binomial, + primaryColor.getRGB(), + secondaryColor.getRGB()); + AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPECIES); + } + + @Override + public IAlleleBeeSpeciesCustom addProduct(ItemStack product, Float chance) { + if (product == null || product.getItem() == null) { + product = new ItemStack(Items.boat); + } + if (chance <= 0.0f || chance > 1.0f) { + chance = 0.1f; + } + return super.addProduct(product, chance); + } + + @Override + public IAlleleBeeSpeciesCustom addSpecialty(ItemStack specialty, Float chance) { + if (specialty == null || specialty.getItem() == null) { + specialty = new ItemStack(Items.boat); + } + if (chance <= 0.0f || chance > 1.0f) { + chance = 0.1f; + } + return super.addSpecialty(specialty, chance); + } +} diff --git a/src/main/java/gregtech/common/bees/GTAlleleHelper.java b/src/main/java/gregtech/common/bees/GTAlleleHelper.java new file mode 100644 index 0000000000..88c46fed3d --- /dev/null +++ b/src/main/java/gregtech/common/bees/GTAlleleHelper.java @@ -0,0 +1,268 @@ +package gregtech.common.bees; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import forestry.api.apiculture.EnumBeeChromosome; +import forestry.api.arboriculture.EnumTreeChromosome; +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.EnumTolerance; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IAlleleBoolean; +import forestry.api.genetics.IAlleleInteger; +import forestry.api.genetics.IAlleleTolerance; +import forestry.api.genetics.IChromosomeType; +import forestry.api.lepidopterology.EnumButterflyChromosome; +import forestry.apiculture.flowers.FlowerProvider; +import forestry.core.config.Constants; +import forestry.core.genetics.alleles.AlleleBoolean; +import forestry.core.genetics.alleles.AlleleHelper; +import forestry.core.genetics.alleles.AlleleInteger; +import forestry.core.genetics.alleles.AlleleTolerance; +import forestry.core.genetics.alleles.EnumAllele; +import forestry.core.genetics.alleles.IAlleleValue; +import forestry.core.utils.vect.IVect; +import forestry.plugins.PluginManager; +import gregtech.GTMod; + +public class GTAlleleHelper extends AlleleHelper { + + private static final String modId = Constants.ID; + + private Map, Map> alleleMaps = new HashMap<>(); + + @Override + public void init() { + if (PluginManager.Module.APICULTURE.isEnabled()) { + createAlleles(EnumAllele.Fertility.class, EnumBeeChromosome.FERTILITY); + createAlleles(EnumAllele.Flowering.class, EnumBeeChromosome.FLOWERING); + } + + if (PluginManager.Module.APICULTURE.isEnabled() || PluginManager.Module.ARBORICULTURE.isEnabled()) { + createAlleles(EnumAllele.Territory.class, EnumBeeChromosome.TERRITORY, EnumTreeChromosome.TERRITORY); + + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.territoryDefault", get(EnumAllele.Territory.AVERAGE)); + } + + if (PluginManager.Module.APICULTURE.isEnabled() || PluginManager.Module.LEPIDOPTEROLOGY.isEnabled()) { + createAlleles(EnumAllele.Speed.class, EnumBeeChromosome.SPEED, EnumButterflyChromosome.SPEED); + createAlleles(EnumAllele.Lifespan.class, EnumBeeChromosome.LIFESPAN, EnumButterflyChromosome.LIFESPAN); + createAlleles( + EnumAllele.Tolerance.class, + EnumBeeChromosome.TEMPERATURE_TOLERANCE, + EnumBeeChromosome.HUMIDITY_TOLERANCE, + EnumButterflyChromosome.TEMPERATURE_TOLERANCE, + EnumButterflyChromosome.HUMIDITY_TOLERANCE); + createAlleles( + EnumAllele.Flowers.class, + EnumBeeChromosome.FLOWER_PROVIDER, + EnumButterflyChromosome.FLOWER_PROVIDER); + + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.speedNorm", get(EnumAllele.Speed.NORMAL)); + } + + if (PluginManager.Module.ARBORICULTURE.isEnabled()) { + createAlleles(EnumAllele.Height.class, EnumTreeChromosome.HEIGHT); + createAlleles(EnumAllele.Saplings.class, EnumTreeChromosome.FERTILITY); + createAlleles(EnumAllele.Yield.class, EnumTreeChromosome.YIELD); + createAlleles(EnumAllele.Fireproof.class, EnumTreeChromosome.FIREPROOF); + createAlleles(EnumAllele.Maturation.class, EnumTreeChromosome.MATURATION); + createAlleles(EnumAllele.Sappiness.class, EnumTreeChromosome.SAPPINESS); + + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.heightMax10", get(EnumAllele.Height.AVERAGE)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.saplingsDefault", get(EnumAllele.Saplings.AVERAGE)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.saplingsDouble", get(EnumAllele.Saplings.HIGH)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.saplingsTriple", get(EnumAllele.Saplings.HIGHER)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.yieldDefault", get(EnumAllele.Yield.AVERAGE)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.maturitySlowest", get(EnumAllele.Maturation.SLOWEST)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.maturitySlower", get(EnumAllele.Maturation.SLOWER)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.maturitySlow", get(EnumAllele.Maturation.SLOW)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.maturityAverage", get(EnumAllele.Maturation.AVERAGE)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.maturityFast", get(EnumAllele.Maturation.FAST)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.maturityFaster", get(EnumAllele.Maturation.FASTER)); + AlleleManager.alleleRegistry + .registerDeprecatedAlleleReplacement("forestry.maturityFastest", get(EnumAllele.Maturation.FASTEST)); + } + + if (PluginManager.Module.LEPIDOPTEROLOGY.isEnabled()) { + createAlleles(EnumAllele.Size.class, EnumButterflyChromosome.SIZE); + } + + Map integers = new HashMap<>(); + for (int i = 1; i <= 10; i++) { + IAlleleInteger alleleInteger = new AlleleInteger(modId, "i", i + "d", i, true); + AlleleManager.alleleRegistry.registerAllele( + alleleInteger, + EnumTreeChromosome.GIRTH, + EnumButterflyChromosome.METABOLISM, + EnumButterflyChromosome.FERTILITY); + integers.put(i, alleleInteger); + } + alleleMaps.put(Integer.class, integers); + + Map booleans = new HashMap<>(); + booleans.put(true, new AlleleBoolean(modId, "bool", true, false)); + booleans.put(false, new AlleleBoolean(modId, "bool", false, false)); + for (IAlleleBoolean alleleBoolean : booleans.values()) { + AlleleManager.alleleRegistry.registerAllele( + alleleBoolean, + EnumBeeChromosome.NOCTURNAL, + EnumBeeChromosome.TOLERANT_FLYER, + EnumBeeChromosome.CAVE_DWELLING, + EnumButterflyChromosome.NOCTURNAL, + EnumButterflyChromosome.TOLERANT_FLYER, + EnumButterflyChromosome.FIRE_RESIST); + } + alleleMaps.put(Boolean.class, booleans); + } + + @SuppressWarnings("unchecked") + public static void initialisation() { + GTAlleleHelper helper = new GTAlleleHelper(); + + try { + helper.alleleMaps = (Map, Map>) FieldUtils + .readField(FieldUtils.getField(AlleleHelper.class, "alleleMaps", true), AlleleHelper.instance, true); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + AlleleHelper.instance = helper; + // AlleleHelper.instance.init(); + } + + @Override + public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, IAllele allele) { + + if (allele == null) { + GTMod.GT_FML_LOGGER.info("Allele is null!"); + return; + } + + if (!chromosomeType.getAlleleClass() + .isInstance(allele)) { + GTMod.GT_FML_LOGGER.info("chromosomeType is not an instance of allele!" + allele.getName()); + return; + } + + // TODO: uncomment this once all addon mods are using the allele registration with IChromosomeType + // Collection validTypes = AlleleManager.alleleRegistry.getChromosomeTypes(allele); + // if (validTypes.size() > 0 && !validTypes.contains(chromosomeType)) { + // throw new IllegalArgumentException("Allele can't be applied to this Chromosome type. Expected: " + validTypes + // + " Got: " + chromosomeType); + // } + + alleles[chromosomeType.ordinal()] = allele; + } + + @Override + public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, IAlleleValue value) { + set(alleles, chromosomeType, get(value)); + } + + @Override + public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, boolean value) { + set(alleles, chromosomeType, get(value)); + } + + @Override + public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, int value) { + set(alleles, chromosomeType, get(value)); + } + + private IAllele get(Object value) { + Class valueClass = value.getClass(); + Map map = alleleMaps.get(valueClass); + if (map == null) { + throw new IllegalArgumentException("There is no IAllele type for: " + valueClass + ' ' + value); + } + IAllele allele = map.get(value); + if (allele == null) { + allele = new IAllele() { + + @Override + public String getUID() { + return "NOT_FOUND"; + } + + @Override + public boolean isDominant() { + return false; + } + + @Override + public String getName() { + return "NOT_FOUND"; + } + + @Override + public String getUnlocalizedName() { + return "NOT_FOUND"; + } + }; + } + return allele; + } + + private & IAlleleValue, V> void createAlleles(Class enumClass, IChromosomeType... types) { + String category = enumClass.getSimpleName() + .toLowerCase(Locale.ENGLISH); + EnumMap map = new EnumMap<>(enumClass); + for (K enumValue : enumClass.getEnumConstants()) { + IAllele allele = createAllele(category, enumValue, types); + map.put(enumValue, allele); + } + alleleMaps.put(enumClass, map); + } + + private static , V> IAllele createAllele(String category, K enumValue, + IChromosomeType... types) { + V value = enumValue.getValue(); + boolean isDominant = enumValue.isDominant(); + String name = enumValue.toString() + .toLowerCase(Locale.ENGLISH); + + Class valueClass = value.getClass(); + if (Float.class.isAssignableFrom(valueClass)) { + return AlleleManager.alleleFactory.createFloat(modId, category, name, (Float) value, isDominant, types); + } else if (Integer.class.isAssignableFrom(valueClass)) { + return AlleleManager.alleleFactory.createInteger(modId, category, name, (Integer) value, isDominant, types); + } else if (IVect.class.isAssignableFrom(valueClass)) { + IVect area = (IVect) value; + return AlleleManager.alleleFactory + .createArea(modId, category, name, area.getX(), area.getY(), area.getZ(), isDominant, types); + } else if (Boolean.class.isAssignableFrom(valueClass)) { + return AlleleManager.alleleFactory.createBoolean(modId, category, (Boolean) value, isDominant, types); + } else if (EnumTolerance.class.isAssignableFrom(valueClass)) { + IAlleleTolerance alleleTolerance = new AlleleTolerance( + modId, + category, + name, + (EnumTolerance) value, + isDominant); + AlleleManager.alleleRegistry.registerAllele(alleleTolerance, types); + return alleleTolerance; + } else if (FlowerProvider.class.isAssignableFrom(valueClass)) { + return AlleleManager.alleleFactory + .createFlowers(modId, category, name, (FlowerProvider) value, isDominant, types); + } + throw new RuntimeException("could not create allele for category: " + category + " and value " + valueClass); + } +} diff --git a/src/main/java/gregtech/common/bees/GTBeeMutation.java b/src/main/java/gregtech/common/bees/GTBeeMutation.java new file mode 100644 index 0000000000..871b25f41f --- /dev/null +++ b/src/main/java/gregtech/common/bees/GTBeeMutation.java @@ -0,0 +1,85 @@ +package gregtech.common.bees; + +import java.lang.reflect.Field; +import java.util.List; + +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import forestry.api.apiculture.BeeManager; +import forestry.api.apiculture.IAlleleBeeSpecies; +import forestry.api.apiculture.IBeeGenome; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.core.IClimateProvider; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IGenome; +import forestry.api.genetics.IMutationCondition; +import forestry.apiculture.genetics.BeeMutation; +import forestry.core.genetics.mutations.Mutation; + +public class GTBeeMutation extends BeeMutation { + + private final float split; + + public GTBeeMutation(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 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) f.get(this) : null; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + if (mutationConditions != null) for (IMutationCondition mutationCondition : mutationConditions) { + mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate); + if (mutationChance == 0) { + return 0; + } + } + return mutationChance; + } +} diff --git a/src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java b/src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java deleted file mode 100644 index b264737677..0000000000 --- a/src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.common.bees; - -import java.awt.Color; - -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -import forestry.api.apiculture.EnumBeeChromosome; -import forestry.api.apiculture.IAlleleBeeSpeciesCustom; -import forestry.api.genetics.AlleleManager; -import forestry.api.genetics.IClassification; -import forestry.apiculture.genetics.alleles.AlleleBeeSpecies; - -public class GT_AlleleBeeSpecies extends AlleleBeeSpecies { - - public GT_AlleleBeeSpecies(String uid, boolean dominant, String unlocalizedName, String authority, - String unlocalizedDescription, IClassification branch, String binomial, Color primaryColor, - Color secondaryColor) { - super( - uid, - unlocalizedName, - authority, - unlocalizedDescription, - dominant, - branch, - binomial, - primaryColor.getRGB(), - secondaryColor.getRGB()); - AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPECIES); - } - - @Override - public IAlleleBeeSpeciesCustom addProduct(ItemStack product, Float chance) { - if (product == null || product.getItem() == null) { - product = new ItemStack(Items.boat); - } - if (chance <= 0.0f || chance > 1.0f) { - chance = 0.1f; - } - return super.addProduct(product, chance); - } - - @Override - public IAlleleBeeSpeciesCustom addSpecialty(ItemStack specialty, Float chance) { - if (specialty == null || specialty.getItem() == null) { - specialty = new ItemStack(Items.boat); - } - if (chance <= 0.0f || chance > 1.0f) { - chance = 0.1f; - } - return super.addSpecialty(specialty, chance); - } -} diff --git a/src/main/java/gregtech/common/bees/GT_AlleleHelper.java b/src/main/java/gregtech/common/bees/GT_AlleleHelper.java deleted file mode 100644 index 496aff29ca..0000000000 --- a/src/main/java/gregtech/common/bees/GT_AlleleHelper.java +++ /dev/null @@ -1,268 +0,0 @@ -package gregtech.common.bees; - -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import org.apache.commons.lang3.reflect.FieldUtils; - -import forestry.api.apiculture.EnumBeeChromosome; -import forestry.api.arboriculture.EnumTreeChromosome; -import forestry.api.genetics.AlleleManager; -import forestry.api.genetics.EnumTolerance; -import forestry.api.genetics.IAllele; -import forestry.api.genetics.IAlleleBoolean; -import forestry.api.genetics.IAlleleInteger; -import forestry.api.genetics.IAlleleTolerance; -import forestry.api.genetics.IChromosomeType; -import forestry.api.lepidopterology.EnumButterflyChromosome; -import forestry.apiculture.flowers.FlowerProvider; -import forestry.core.config.Constants; -import forestry.core.genetics.alleles.AlleleBoolean; -import forestry.core.genetics.alleles.AlleleHelper; -import forestry.core.genetics.alleles.AlleleInteger; -import forestry.core.genetics.alleles.AlleleTolerance; -import forestry.core.genetics.alleles.EnumAllele; -import forestry.core.genetics.alleles.IAlleleValue; -import forestry.core.utils.vect.IVect; -import forestry.plugins.PluginManager; -import gregtech.GT_Mod; - -public class GT_AlleleHelper extends AlleleHelper { - - private static final String modId = Constants.ID; - - private Map, Map> alleleMaps = new HashMap<>(); - - @Override - public void init() { - if (PluginManager.Module.APICULTURE.isEnabled()) { - createAlleles(EnumAllele.Fertility.class, EnumBeeChromosome.FERTILITY); - createAlleles(EnumAllele.Flowering.class, EnumBeeChromosome.FLOWERING); - } - - if (PluginManager.Module.APICULTURE.isEnabled() || PluginManager.Module.ARBORICULTURE.isEnabled()) { - createAlleles(EnumAllele.Territory.class, EnumBeeChromosome.TERRITORY, EnumTreeChromosome.TERRITORY); - - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.territoryDefault", get(EnumAllele.Territory.AVERAGE)); - } - - if (PluginManager.Module.APICULTURE.isEnabled() || PluginManager.Module.LEPIDOPTEROLOGY.isEnabled()) { - createAlleles(EnumAllele.Speed.class, EnumBeeChromosome.SPEED, EnumButterflyChromosome.SPEED); - createAlleles(EnumAllele.Lifespan.class, EnumBeeChromosome.LIFESPAN, EnumButterflyChromosome.LIFESPAN); - createAlleles( - EnumAllele.Tolerance.class, - EnumBeeChromosome.TEMPERATURE_TOLERANCE, - EnumBeeChromosome.HUMIDITY_TOLERANCE, - EnumButterflyChromosome.TEMPERATURE_TOLERANCE, - EnumButterflyChromosome.HUMIDITY_TOLERANCE); - createAlleles( - EnumAllele.Flowers.class, - EnumBeeChromosome.FLOWER_PROVIDER, - EnumButterflyChromosome.FLOWER_PROVIDER); - - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.speedNorm", get(EnumAllele.Speed.NORMAL)); - } - - if (PluginManager.Module.ARBORICULTURE.isEnabled()) { - createAlleles(EnumAllele.Height.class, EnumTreeChromosome.HEIGHT); - createAlleles(EnumAllele.Saplings.class, EnumTreeChromosome.FERTILITY); - createAlleles(EnumAllele.Yield.class, EnumTreeChromosome.YIELD); - createAlleles(EnumAllele.Fireproof.class, EnumTreeChromosome.FIREPROOF); - createAlleles(EnumAllele.Maturation.class, EnumTreeChromosome.MATURATION); - createAlleles(EnumAllele.Sappiness.class, EnumTreeChromosome.SAPPINESS); - - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.heightMax10", get(EnumAllele.Height.AVERAGE)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.saplingsDefault", get(EnumAllele.Saplings.AVERAGE)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.saplingsDouble", get(EnumAllele.Saplings.HIGH)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.saplingsTriple", get(EnumAllele.Saplings.HIGHER)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.yieldDefault", get(EnumAllele.Yield.AVERAGE)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.maturitySlowest", get(EnumAllele.Maturation.SLOWEST)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.maturitySlower", get(EnumAllele.Maturation.SLOWER)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.maturitySlow", get(EnumAllele.Maturation.SLOW)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.maturityAverage", get(EnumAllele.Maturation.AVERAGE)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.maturityFast", get(EnumAllele.Maturation.FAST)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.maturityFaster", get(EnumAllele.Maturation.FASTER)); - AlleleManager.alleleRegistry - .registerDeprecatedAlleleReplacement("forestry.maturityFastest", get(EnumAllele.Maturation.FASTEST)); - } - - if (PluginManager.Module.LEPIDOPTEROLOGY.isEnabled()) { - createAlleles(EnumAllele.Size.class, EnumButterflyChromosome.SIZE); - } - - Map integers = new HashMap<>(); - for (int i = 1; i <= 10; i++) { - IAlleleInteger alleleInteger = new AlleleInteger(modId, "i", i + "d", i, true); - AlleleManager.alleleRegistry.registerAllele( - alleleInteger, - EnumTreeChromosome.GIRTH, - EnumButterflyChromosome.METABOLISM, - EnumButterflyChromosome.FERTILITY); - integers.put(i, alleleInteger); - } - alleleMaps.put(Integer.class, integers); - - Map booleans = new HashMap<>(); - booleans.put(true, new AlleleBoolean(modId, "bool", true, false)); - booleans.put(false, new AlleleBoolean(modId, "bool", false, false)); - for (IAlleleBoolean alleleBoolean : booleans.values()) { - AlleleManager.alleleRegistry.registerAllele( - alleleBoolean, - EnumBeeChromosome.NOCTURNAL, - EnumBeeChromosome.TOLERANT_FLYER, - EnumBeeChromosome.CAVE_DWELLING, - EnumButterflyChromosome.NOCTURNAL, - EnumButterflyChromosome.TOLERANT_FLYER, - EnumButterflyChromosome.FIRE_RESIST); - } - alleleMaps.put(Boolean.class, booleans); - } - - @SuppressWarnings("unchecked") - public static void initialisation() { - GT_AlleleHelper helper = new GT_AlleleHelper(); - - try { - helper.alleleMaps = (Map, Map>) FieldUtils - .readField(FieldUtils.getField(AlleleHelper.class, "alleleMaps", true), AlleleHelper.instance, true); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - AlleleHelper.instance = helper; - // AlleleHelper.instance.init(); - } - - @Override - public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, IAllele allele) { - - if (allele == null) { - GT_Mod.GT_FML_LOGGER.info("Allele is null!"); - return; - } - - if (!chromosomeType.getAlleleClass() - .isInstance(allele)) { - GT_Mod.GT_FML_LOGGER.info("chromosomeType is not an instance of allele!" + allele.getName()); - return; - } - - // TODO: uncomment this once all addon mods are using the allele registration with IChromosomeType - // Collection validTypes = AlleleManager.alleleRegistry.getChromosomeTypes(allele); - // if (validTypes.size() > 0 && !validTypes.contains(chromosomeType)) { - // throw new IllegalArgumentException("Allele can't be applied to this Chromosome type. Expected: " + validTypes - // + " Got: " + chromosomeType); - // } - - alleles[chromosomeType.ordinal()] = allele; - } - - @Override - public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, IAlleleValue value) { - set(alleles, chromosomeType, get(value)); - } - - @Override - public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, boolean value) { - set(alleles, chromosomeType, get(value)); - } - - @Override - public & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, int value) { - set(alleles, chromosomeType, get(value)); - } - - private IAllele get(Object value) { - Class valueClass = value.getClass(); - Map map = alleleMaps.get(valueClass); - if (map == null) { - throw new IllegalArgumentException("There is no IAllele type for: " + valueClass + ' ' + value); - } - IAllele allele = map.get(value); - if (allele == null) { - allele = new IAllele() { - - @Override - public String getUID() { - return "NOT_FOUND"; - } - - @Override - public boolean isDominant() { - return false; - } - - @Override - public String getName() { - return "NOT_FOUND"; - } - - @Override - public String getUnlocalizedName() { - return "NOT_FOUND"; - } - }; - } - return allele; - } - - private & IAlleleValue, V> void createAlleles(Class enumClass, IChromosomeType... types) { - String category = enumClass.getSimpleName() - .toLowerCase(Locale.ENGLISH); - EnumMap map = new EnumMap<>(enumClass); - for (K enumValue : enumClass.getEnumConstants()) { - IAllele allele = createAllele(category, enumValue, types); - map.put(enumValue, allele); - } - alleleMaps.put(enumClass, map); - } - - private static , V> IAllele createAllele(String category, K enumValue, - IChromosomeType... types) { - V value = enumValue.getValue(); - boolean isDominant = enumValue.isDominant(); - String name = enumValue.toString() - .toLowerCase(Locale.ENGLISH); - - Class valueClass = value.getClass(); - if (Float.class.isAssignableFrom(valueClass)) { - return AlleleManager.alleleFactory.createFloat(modId, category, name, (Float) value, isDominant, types); - } else if (Integer.class.isAssignableFrom(valueClass)) { - return AlleleManager.alleleFactory.createInteger(modId, category, name, (Integer) value, isDominant, types); - } else if (IVect.class.isAssignableFrom(valueClass)) { - IVect area = (IVect) value; - return AlleleManager.alleleFactory - .createArea(modId, category, name, area.getX(), area.getY(), area.getZ(), isDominant, types); - } else if (Boolean.class.isAssignableFrom(valueClass)) { - return AlleleManager.alleleFactory.createBoolean(modId, category, (Boolean) value, isDominant, types); - } else if (EnumTolerance.class.isAssignableFrom(valueClass)) { - IAlleleTolerance alleleTolerance = new AlleleTolerance( - modId, - category, - name, - (EnumTolerance) value, - isDominant); - AlleleManager.alleleRegistry.registerAllele(alleleTolerance, types); - return alleleTolerance; - } else if (FlowerProvider.class.isAssignableFrom(valueClass)) { - return AlleleManager.alleleFactory - .createFlowers(modId, category, name, (FlowerProvider) value, isDominant, types); - } - throw new RuntimeException("could not create allele for category: " + category + " and value " + valueClass); - } -} diff --git a/src/main/java/gregtech/common/bees/GT_Bee_Mutation.java b/src/main/java/gregtech/common/bees/GT_Bee_Mutation.java deleted file mode 100644 index e8b2d5b8c6..0000000000 --- a/src/main/java/gregtech/common/bees/GT_Bee_Mutation.java +++ /dev/null @@ -1,85 +0,0 @@ -package gregtech.common.bees; - -import java.lang.reflect.Field; -import java.util.List; - -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; - -import org.apache.commons.lang3.reflect.FieldUtils; - -import forestry.api.apiculture.BeeManager; -import forestry.api.apiculture.IAlleleBeeSpecies; -import forestry.api.apiculture.IBeeGenome; -import forestry.api.apiculture.IBeeHousing; -import forestry.api.apiculture.IBeeModifier; -import forestry.api.core.IClimateProvider; -import forestry.api.genetics.IAllele; -import forestry.api.genetics.IGenome; -import forestry.api.genetics.IMutationCondition; -import forestry.apiculture.genetics.BeeMutation; -import forestry.core.genetics.mutations.Mutation; - -public class GT_Bee_Mutation extends BeeMutation { - - private final float split; - - public GT_Bee_Mutation(IAlleleBeeSpecies bee0, IAlleleBeeSpecies bee1, IAllele[] result, int chance, float split) { - super(bee0, bee1, result, chance); - this.split = split; - BeeManager.beeRoot.registerMutation(this); - } - - @Override - public float getBaseChance() { - return super.getBaseChance() / split; - } - - @Override - public float getChance(IBeeHousing housing, IAlleleBeeSpecies allele0, IAlleleBeeSpecies allele1, - IBeeGenome genome0, IBeeGenome genome1) { - World world = housing != null ? housing.getWorld() : null; - ChunkCoordinates housingCoordinates = housing != null ? housing.getCoordinates() : null; - int x = housingCoordinates != null ? housingCoordinates.posX : 0; - int y = housingCoordinates != null ? housingCoordinates.posY : 0; - int z = housingCoordinates != null ? housingCoordinates.posZ : 0; - - float processedChance = getBasicChance(world, x, y, z, allele0, allele1, genome0, genome1, housing); - - if (processedChance <= 0f) { - return 0f; - } - - IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing); - IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world) - .getBeeModifier(); - - processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance); - processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance); - - return processedChance; - } - - @SuppressWarnings("unchecked") - private float getBasicChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0, - IGenome genome1, IClimateProvider climate) { - float mutationChance = this.getBaseChance(); - List 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) f.get(this) : null; - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - if (mutationConditions != null) for (IMutationCondition mutationCondition : mutationConditions) { - mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate); - if (mutationChance == 0) { - return 0; - } - } - return mutationChance; - } -} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings1.java b/src/main/java/gregtech/common/blocks/BlockCasings1.java new file mode 100644 index 0000000000..5410847176 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings1.java @@ -0,0 +1,107 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings1 extends BlockCasingsAbstract { + + /** + * Texture Index Information Textures.BlockIcons.casingTexturePages[0][0-63] - Gregtech + * Textures.BlockIcons.casingTexturePages[0][64-127] - GT++ Textures.BlockIcons.casingTexturePages[1][0-127] - + * Gregtech Textures.BlockIcons.casingTexturePages[2][0-127] - Free Textures.BlockIcons.casingTexturePages[3][0-127] + * - Free Textures.BlockIcons.casingTexturePages[4][0-127] - Free Textures.BlockIcons.casingTexturePages[5][0-127] - + * Free Textures.BlockIcons.casingTexturePages[6][0-127] - Free Textures.BlockIcons.casingTexturePages[7][0-127] - + * TecTech Textures.BlockIcons.casingTexturePages[8][0-127] - TecTech + */ + public BlockCasings1() { + super(ItemCasings1.class, "gt.blockcasings", MaterialCasings.INSTANCE, 16); + + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "ULV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "LV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "MV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "HV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "EV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "IV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "LuV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "ZPM Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "UV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "UHV Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Bronze Plated Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Heat Proof Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Dimensionally Transcendent Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Dimensional Injection Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Dimensional Bridge"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Superconducting Coil Block"); + ItemList.Casing_ULV.set(new ItemStack(this, 1, 0)); + ItemList.Casing_LV.set(new ItemStack(this, 1, 1)); + ItemList.Casing_MV.set(new ItemStack(this, 1, 2)); + ItemList.Casing_HV.set(new ItemStack(this, 1, 3)); + ItemList.Casing_EV.set(new ItemStack(this, 1, 4)); + ItemList.Casing_IV.set(new ItemStack(this, 1, 5)); + ItemList.Casing_LuV.set(new ItemStack(this, 1, 6)); + ItemList.Casing_ZPM.set(new ItemStack(this, 1, 7)); + ItemList.Casing_UV.set(new ItemStack(this, 1, 8)); + ItemList.Casing_MAX.set(new ItemStack(this, 1, 9)); + ItemList.Casing_BronzePlatedBricks.set(new ItemStack(this, 1, 10)); + ItemList.Casing_HeatProof.set(new ItemStack(this, 1, 11)); + ItemList.Casing_Dim_Trans.set(new ItemStack(this, 1, 12)); + ItemList.Casing_Dim_Injector.set(new ItemStack(this, 1, 13)); + ItemList.Casing_Dim_Bridge.set(new ItemStack(this, 1, 14)); + ItemList.Casing_Coil_Superconductor.set(new ItemStack(this, 1, 15)); + } + + @Override + public int getTextureIndex(int aMeta) { + return aMeta; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16)) { + switch (aMeta) { + case 10 -> { + return Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon(); + } + case 11 -> { + return Textures.BlockIcons.MACHINE_HEATPROOFCASING.getIcon(); + } + case 12 -> { + return Textures.BlockIcons.MACHINE_DIM_TRANS_CASING.getIcon(); + } + case 13 -> { + return Textures.BlockIcons.MACHINE_DIM_INJECTOR.getIcon(); + } + case 14 -> { + return Textures.BlockIcons.MACHINE_DIM_BRIDGE.getIcon(); + } + case 15 -> { + return Textures.BlockIcons.MACHINE_COIL_SUPERCONDUCTOR.getIcon(); + } + } + if (ordinalSide == 0) { + return Textures.BlockIcons.MACHINECASINGS_BOTTOM[aMeta].getIcon(); + } + if (ordinalSide == 1) { + return Textures.BlockIcons.MACHINECASINGS_TOP[aMeta].getIcon(); + } + return Textures.BlockIcons.MACHINECASINGS_SIDE[aMeta].getIcon(); + } + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + + @Override + public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ) > 9 ? super.colorMultiplier(aWorld, aX, aY, aZ) + : gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8 + | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2]; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings10.java b/src/main/java/gregtech/common/blocks/BlockCasings10.java new file mode 100644 index 0000000000..11c3f81f01 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings10.java @@ -0,0 +1,76 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings10 extends BlockCasingsAbstract { + + public BlockCasings10() { + super(ItemCasings10.class, "gt.blockcasings10", MaterialCasings.INSTANCE, 16); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "MagTech Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Laser Containment Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Quark Exclusion Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Pressure Containment Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Electric Compressor Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Compression Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Neutronium Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Active Neutronium Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Neutronium Stabilization Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Coolant Duct"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Heating Duct"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".11.name", "Extreme Density Space-Bending Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".12.name", "Background Radiation Absorbent Casing"); + + ItemList.Casing_Electromagnetic_Separator.set(new ItemStack(this, 1, 0)); + ItemList.Casing_Laser.set(new ItemStack(this, 1, 1)); + ItemList.BlockQuarkContainmentCasing.set(new ItemStack(this, 1, 2)); + ItemList.Casing_Autoclave.set(new ItemStack(this, 1, 3)); + ItemList.Compressor_Casing.set(new ItemStack(this, 1, 4)); + ItemList.Compressor_Pipe_Casing.set(new ItemStack(this, 1, 5)); + ItemList.Neutronium_Casing.set(new ItemStack(this, 1, 6)); + ItemList.Neutronium_Active_Casing.set(new ItemStack(this, 1, 7)); + ItemList.Neutronium_Stable_Casing.set(new ItemStack(this, 1, 8)); + ItemList.Coolant_Duct_Casing.set(new ItemStack(this, 1, 9)); + ItemList.Heating_Duct_Casing.set(new ItemStack(this, 1, 10)); + ItemList.Extreme_Density_Casing.set(new ItemStack(this, 1, 11)); + ItemList.Background_Radiation_Casing.set(new ItemStack(this, 1, 12)); + } + + @Override + public int getTextureIndex(int aMeta) { + return (16 << 7) | (aMeta + 48); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.MACHINE_CASING_EMS.getIcon(); + case 1 -> Textures.BlockIcons.MACHINE_CASING_LASER.getIcon(); + case 2 -> Textures.BlockIcons.BLOCK_QUARK_CONTAINMENT_CASING.getIcon(); + case 3 -> Textures.BlockIcons.MACHINE_CASING_AUTOCLAVE.getIcon(); + case 4 -> Textures.BlockIcons.COMPRESSOR_CASING.getIcon(); + case 5 -> Textures.BlockIcons.COMPRESSOR_PIPE_CASING.getIcon(); + case 6 -> Textures.BlockIcons.NEUTRONIUM_CASING.getIcon(); + case 7 -> Textures.BlockIcons.NEUTRONIUM_ACTIVE_CASING.getIcon(); + case 8 -> Textures.BlockIcons.NEUTRONIUM_STABLE_CASING.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TUNGSTENSTEEL.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_CASING_PIPE_BRONZE.getIcon(); + case 11 -> Textures.BlockIcons.EXTREME_DENSITY_CASING.getIcon(); + case 12 -> Textures.BlockIcons.RADIATION_ABSORBENT_CASING.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); + }; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings11.java b/src/main/java/gregtech/common/blocks/BlockCasings11.java new file mode 100644 index 0000000000..a654aae3d7 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings11.java @@ -0,0 +1,58 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings11 extends BlockCasingsAbstract { + + public BlockCasings11() { + super(ItemCasings11.class, "gt.blockcasings11", MaterialCasings.INSTANCE, 16); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Tin Item Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Brass Item Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Electrum Item Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Platinum Item Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Osmium Item Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Quantium Item Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Fluxed Electrum Item Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Black Plutonium Item Pipe Casing"); + + ItemList.Casing_Item_Pipe_Tin.set(new ItemStack(this, 1, 0)); + ItemList.Casing_Item_Pipe_Brass.set(new ItemStack(this, 1, 1)); + ItemList.Casing_Item_Pipe_Electrum.set(new ItemStack(this, 1, 2)); + ItemList.Casing_Item_Pipe_Platinum.set(new ItemStack(this, 1, 3)); + ItemList.Casing_Item_Pipe_Osmium.set(new ItemStack(this, 1, 4)); + ItemList.Casing_Item_Pipe_Quantium.set(new ItemStack(this, 1, 5)); + ItemList.Casing_Item_Pipe_Fluxed_Electrum.set(new ItemStack(this, 1, 6)); + ItemList.Casing_Item_Pipe_Black_Plutonium.set(new ItemStack(this, 1, 7)); + } + + @Override + public int getTextureIndex(int aMeta) { + return (16 << 7) | (aMeta + 64); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 1 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_BRASS.getIcon(); + case 2 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_ELECTRUM.getIcon(); + case 3 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_PLATINUM.getIcon(); + case 4 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_OSMIUM.getIcon(); + case 5 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_QUANTIUM.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_FLUXED_ELECTRUM.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_BLACK_PLUTONIUM.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_TIN.getIcon(); + }; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings2.java b/src/main/java/gregtech/common/blocks/BlockCasings2.java new file mode 100644 index 0000000000..441bbd9b82 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings2.java @@ -0,0 +1,102 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings2 extends BlockCasingsAbstract { + + public BlockCasings2() { + super(ItemCasings2.class, "gt.blockcasings2", MaterialCasings.INSTANCE, 96); + // Special handler for Pyrolyse Oven Casing on hatches... + Textures.BlockIcons.casingTexturePages[0][22] = TextureFactory.of( + Block.getBlockFromItem( + ItemList.Casing_ULV.get(1) + .getItem()), + 0, + ForgeDirection.UNKNOWN, + Dyes.MACHINE_METAL.mRGBa); + + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Solid Steel Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Frost Proof Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Bronze Gear Box Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Steel Gear Box Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Titanium Gear Box Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Assembling Line Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Processor Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Data Drive Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Containment Field Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Assembler Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Pump Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Motor Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Bronze Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Steel Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Titanium Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Tungstensteel Pipe Casing"); + ItemList.Casing_SolidSteel.set(new ItemStack(this, 1, 0)); + ItemList.Casing_FrostProof.set(new ItemStack(this, 1, 1)); + ItemList.Casing_Gearbox_Bronze.set(new ItemStack(this, 1, 2)); + ItemList.Casing_Gearbox_Steel.set(new ItemStack(this, 1, 3)); + ItemList.Casing_Gearbox_Titanium.set(new ItemStack(this, 1, 4)); + ItemList.Casing_Gearbox_TungstenSteel.set(new ItemStack(this, 1, 5)); + ItemList.Casing_Processor.set(new ItemStack(this, 1, 6)); + ItemList.Casing_DataDrive.set(new ItemStack(this, 1, 7)); + ItemList.Casing_ContainmentField.set(new ItemStack(this, 1, 8)); + ItemList.Casing_Assembler.set(new ItemStack(this, 1, 9)); + ItemList.Casing_Pump.set(new ItemStack(this, 1, 10)); + ItemList.Casing_Motor.set(new ItemStack(this, 1, 11)); + ItemList.Casing_Pipe_Bronze.set(new ItemStack(this, 1, 12)); + ItemList.Casing_Pipe_Steel.set(new ItemStack(this, 1, 13)); + ItemList.Casing_Pipe_Titanium.set(new ItemStack(this, 1, 14)); + ItemList.Casing_Pipe_TungstenSteel.set(new ItemStack(this, 1, 15)); + } + + @Override + public int getTextureIndex(int aMeta) { + return aMeta == 6 ? ((1 << 7) + 96) : aMeta + 16; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + case 1 -> Textures.BlockIcons.MACHINE_CASING_FROST_PROOF.getIcon(); + case 2 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_BRONZE.getIcon(); + case 3 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_STEEL.getIcon(); + case 4 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_TITANIUM.getIcon(); + case 5 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_CASING_PROCESSOR.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_CASING_DATA_DRIVE.getIcon(); + case 8 -> Textures.BlockIcons.MACHINE_CASING_CONTAINMENT_FIELD.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_CASING_ASSEMBLER.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_CASING_PUMP.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_CASING_MOTOR.getIcon(); + case 12 -> Textures.BlockIcons.MACHINE_CASING_PIPE_BRONZE.getIcon(); + case 13 -> Textures.BlockIcons.MACHINE_CASING_PIPE_STEEL.getIcon(); + case 14 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TITANIUM.getIcon(); + case 15 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TUNGSTENSTEEL.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + }; + } + + @Override + public float getExplosionResistance(Entity aTNT, World aWorld, int aX, int aY, int aZ, double eX, double eY, + double eZ) { + return aWorld.getBlockMetadata(aX, aY, aZ) == 8 ? Blocks.bedrock.getExplosionResistance(aTNT) + : super.getExplosionResistance(aTNT, aWorld, aX, aY, aZ, eX, eY, eZ); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings3.java b/src/main/java/gregtech/common/blocks/BlockCasings3.java new file mode 100644 index 0000000000..fdd48b62ed --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings3.java @@ -0,0 +1,82 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings3 extends BlockCasingsAbstract { + + public BlockCasings3() { + super(ItemCasings3.class, "gt.blockcasings3", MaterialCasings.INSTANCE, 16); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Yellow Stripes Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Yellow Stripes Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Radioactive Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Bio Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Explosion Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Fire Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Acid Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Magic Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Frost Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Noise Hazard Sign Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Grate Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Filter Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Radiation Proof Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Bronze Firebox Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Steel Firebox Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Tungstensteel Firebox Casing"); + ItemList.Casing_Stripes_A.set(new ItemStack(this, 1, 0)); + ItemList.Casing_Stripes_B.set(new ItemStack(this, 1, 1)); + ItemList.Casing_RadioactiveHazard.set(new ItemStack(this, 1, 2)); + ItemList.Casing_BioHazard.set(new ItemStack(this, 1, 3)); + ItemList.Casing_ExplosionHazard.set(new ItemStack(this, 1, 4)); + ItemList.Casing_FireHazard.set(new ItemStack(this, 1, 5)); + ItemList.Casing_AcidHazard.set(new ItemStack(this, 1, 6)); + ItemList.Casing_MagicHazard.set(new ItemStack(this, 1, 7)); + ItemList.Casing_FrostHazard.set(new ItemStack(this, 1, 8)); + ItemList.Casing_NoiseHazard.set(new ItemStack(this, 1, 9)); + ItemList.Casing_Grate.set(new ItemStack(this, 1, 10)); + ItemList.Casing_Vent.set(new ItemStack(this, 1, 11)); + ItemList.Casing_RadiationProof.set(new ItemStack(this, 1, 12)); + ItemList.Casing_Firebox_Bronze.set(new ItemStack(this, 1, 13)); + ItemList.Casing_Firebox_Steel.set(new ItemStack(this, 1, 14)); + ItemList.Casing_Firebox_TungstenSteel.set(new ItemStack(this, 1, 15)); + } + + @Override + public int getTextureIndex(int aMeta) { + return aMeta + 32; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.MACHINE_CASING_STRIPES_A.getIcon(); + case 1 -> Textures.BlockIcons.MACHINE_CASING_STRIPES_B.getIcon(); + case 2 -> Textures.BlockIcons.MACHINE_CASING_RADIOACTIVEHAZARD.getIcon(); + case 3 -> Textures.BlockIcons.MACHINE_CASING_BIOHAZARD.getIcon(); + case 4 -> Textures.BlockIcons.MACHINE_CASING_EXPLOSIONHAZARD.getIcon(); + case 5 -> Textures.BlockIcons.MACHINE_CASING_FIREHAZARD.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_CASING_MAGICHAZARD.getIcon(); + case 8 -> Textures.BlockIcons.MACHINE_CASING_FROSTHAZARD.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_CASING_NOISEHAZARD.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_CASING_GRATE.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_CASING_VENT.getIcon(); + case 12 -> Textures.BlockIcons.MACHINE_CASING_RADIATIONPROOF.getIcon(); + case 13 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_BRONZE.getIcon() + : Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon(); + case 14 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_STEEL.getIcon() + : Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + case 15 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_TUNGSTENSTEEL.getIcon() + : Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + }; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings4.java b/src/main/java/gregtech/common/blocks/BlockCasings4.java new file mode 100644 index 0000000000..0cba916548 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings4.java @@ -0,0 +1,239 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTRenderingWorld; +import gregtech.common.tileentities.machines.multi.MTELargeTurbine; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings4 extends BlockCasingsAbstract { + + /** + * This mapping is used to look up which texture should be used to render the connected texture for fusion casings. + *

+ * This mapping is computed from that giant if ladder from #getIcon in commit + * da3421547afadc49938b5b6a7f9a9679afa1d570 The exact meaning of these numbers are like black magic. Read the + * original getIcon implementation to understand why it is 0, 1, etc, if that if ladder is even intelligible. + */ + private static final int[][] mapping = new int[][] { + { 7, 7, 7, 7, 0, 7, 0, 7, 1, 7, 1, 7, 8, 7, 8, 7, 0, 7, 0, 7, 0, 7, 0, 7, 9, 7, 9, 7, 3, 7, 3, 7, 1, 7, 1, 7, + 11, 7, 11, 7, 1, 7, 1, 7, 2, 7, 2, 7, 10, 7, 10, 7, 5, 7, 5, 7, 4, 7, 4, 7, 6, 7, 6, 7 }, + { 7, 7, 7, 7, 0, 0, 7, 7, 1, 1, 7, 7, 8, 8, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 9, 9, 7, 7, 3, 3, 7, 7, 1, 1, 7, 7, + 11, 11, 7, 7, 1, 1, 7, 7, 2, 2, 7, 7, 10, 10, 7, 7, 5, 5, 7, 7, 4, 4, 7, 7, 6, 6, 7, 7 }, + { 7, 1, 1, 1, 0, 9, 10, 4, 7, 1, 1, 1, 0, 9, 10, 4, 0, 8, 11, 2, 0, 3, 5, 6, 0, 8, 11, 2, 0, 3, 5, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, + { 7, 1, 1, 1, 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, + 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7 }, + { 7, 1, 1, 1, 7, 1, 1, 1, 0, 8, 11, 2, 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, + 0, 9, 10, 4, 0, 3, 5, 6, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, + { 7, 1, 1, 1, 7, 7, 7, 7, 0, 9, 10, 4, 7, 7, 7, 7, 7, 1, 1, 1, 7, 7, 7, 7, 0, 9, 10, 4, 7, 7, 7, 7, 0, 8, 11, 2, + 7, 7, 7, 7, 0, 3, 5, 6, 7, 7, 7, 7, 0, 8, 11, 2, 7, 7, 7, 7, 0, 3, 5, 6, 7, 7, 7, 7 }, }; + + public static boolean mConnectedMachineTextures = true; + + public BlockCasings4() { + super(ItemCasings4.class, "gt.blockcasings4", MaterialCasings.INSTANCE, 16); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".0.name", "Robust Tungstensteel Machine Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".1.name", "Clean Stainless Steel Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Stable Titanium Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Titanium Firebox Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Fusion Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Fusion Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Fusion Machine Casing MK II"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Turbine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Stainless Steel Turbine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Titanium Turbine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Tungstensteel Turbine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Engine Intake Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Mining Osmiridium Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Firebricks"); + + ItemList.Casing_RobustTungstenSteel.set(new ItemStack(this, 1, 0)); + ItemList.Casing_CleanStainlessSteel.set(new ItemStack(this, 1, 1)); + ItemList.Casing_StableTitanium.set(new ItemStack(this, 1, 2)); + ItemList.Casing_Firebox_Titanium.set(new ItemStack(this, 1, 3)); + ItemList.Casing_Fusion.set(new ItemStack(this, 1, 6)); + ItemList.Casing_Fusion_Coil.set(new ItemStack(this, 1, 7)); + ItemList.Casing_Fusion2.set(new ItemStack(this, 1, 8)); + ItemList.Casing_Turbine.set(new ItemStack(this, 1, 9)); + ItemList.Casing_Turbine1.set(new ItemStack(this, 1, 10)); + ItemList.Casing_Turbine2.set(new ItemStack(this, 1, 11)); + ItemList.Casing_Turbine3.set(new ItemStack(this, 1, 12)); + ItemList.Casing_EngineIntake.set(new ItemStack(this, 1, 13)); + ItemList.Casing_MiningOsmiridium.set(new ItemStack(this, 1, 14)); + ItemList.Casing_Firebricks.set(new ItemStack(this, 1, 15)); + + GTMod.gregtechproxy.mCTMBlockCache.put(this, (byte) 6, true); + GTMod.gregtechproxy.mCTMBlockCache.put(this, (byte) 8, true); + } + + @Override + public int getTextureIndex(int aMeta) { + return aMeta + 48; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); + case 1 -> Textures.BlockIcons.MACHINE_CASING_CLEAN_STAINLESSSTEEL.getIcon(); + case 2 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon(); + case 3 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_TITANIUM.getIcon() + : Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon(); + case 4 -> + // Do not overwrite! + Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW.getIcon(); + case 5 -> + // Do not overwrite! + Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_CASING_FUSION.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_CASING_FUSION_COIL.getIcon(); + case 8 -> Textures.BlockIcons.MACHINE_CASING_FUSION_2.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_CASING_TURBINE.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_STAINLESSSTEEL.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TITANIUM.getIcon(); + case 12 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TUNGSTENSTEEL.getIcon(); + case 13 -> Textures.BlockIcons.MACHINE_CASING_ENGINE_INTAKE.getIcon(); + case 14 -> Textures.BlockIcons.MACHINE_CASING_MINING_OSMIRIDIUM.getIcon(); + case 15 -> Textures.BlockIcons.MACHINE_CASING_DENSEBRICKS.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + }; + } + + @Deprecated + public IIcon getTurbineCasing(int meta, int iconIndex, boolean active, boolean hasTurbine) { + return switch (meta) { + case 10 -> active ? Textures.BlockIcons.TURBINE_ACTIVE1[iconIndex].getIcon() + : hasTurbine ? Textures.BlockIcons.TURBINE1[iconIndex].getIcon() + : Textures.BlockIcons.TURBINE_EMPTY1[iconIndex].getIcon(); + case 11 -> active ? Textures.BlockIcons.TURBINE_ACTIVE2[iconIndex].getIcon() + : hasTurbine ? Textures.BlockIcons.TURBINE2[iconIndex].getIcon() + : Textures.BlockIcons.TURBINE_EMPTY2[iconIndex].getIcon(); + case 12 -> active ? Textures.BlockIcons.TURBINE_ACTIVE3[iconIndex].getIcon() + : hasTurbine ? Textures.BlockIcons.TURBINE3[iconIndex].getIcon() + : Textures.BlockIcons.TURBINE_EMPTY3[iconIndex].getIcon(); + default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon() + : hasTurbine ? Textures.BlockIcons.TURBINE[iconIndex].getIcon() + : Textures.BlockIcons.TURBINE_EMPTY[iconIndex].getIcon(); + }; + } + + private static int isTurbineControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0; + if (tTile.getMetaTileEntity() instanceof MTELargeTurbine turbine && tTile.getFrontFacing() + .ordinal() == ordinalSide) { + if (turbine.isNewStyleRendering()) return 0; + if (tTile.isActive()) return 1; + return turbine.hasTurbine() ? 2 : 3; + } + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { + aWorld = GTRenderingWorld.getInstance(aWorld); + int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + if (tMeta != 6 && tMeta != 8 && tMeta != 9 && tMeta != 10 && tMeta != 11 && tMeta != 12 + || !mConnectedMachineTextures) { + return getIcon(ordinalSide, tMeta); + } + // noinspection ConstantValue // tMeta < 13 should stay because mConnectedMachineTextures can be changed + if (tMeta > 8 && tMeta < 13) { + int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1; + switch (ordinalSide / 2) { + case 0 -> { + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + if (i == 0 && j == 0) continue; + int tState; + if ((tState = isTurbineControllerWithSide( + aWorld, + xCoord + j, + yCoord, + zCoord + i, + ordinalSide)) != 0) { + return getTurbineCasing(tMeta, 4 - i * 3 - j, tState == 1, tState == 2); + } + } + } + } + case 1 -> { + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + if (i == 0 && j == 0) continue; + int tState; + if ((tState = isTurbineControllerWithSide( + aWorld, + xCoord + j, + yCoord + i, + zCoord, + ordinalSide)) != 0) { + return getTurbineCasing( + tMeta, + 4 + i * 3 - j * tInvertLeftRightMod, + tState == 1, + tState == 2); + } + } + } + } + case 2 -> { + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + if (i == 0 && j == 0) continue; + int tState; + if ((tState = isTurbineControllerWithSide( + aWorld, + xCoord, + yCoord + i, + zCoord + j, + ordinalSide)) != 0) { + return getTurbineCasing( + tMeta, + 4 + i * 3 + j * tInvertLeftRightMod, + tState == 1, + tState == 2); + } + } + } + } + } + return switch (tMeta) { + case 10 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_STAINLESSSTEEL.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TITANIUM.getIcon(); + case 12 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TUNGSTENSTEEL.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + }; + } + int tStartIndex = tMeta == 6 ? 1 : 13; + int tIndexIntoMapping = 0; + if (isSameBlock(aWorld, xCoord, yCoord - 1, zCoord, tMeta)) tIndexIntoMapping |= 1; + if (isSameBlock(aWorld, xCoord, yCoord + 1, zCoord, tMeta)) tIndexIntoMapping |= 1 << 1; + if (isSameBlock(aWorld, xCoord + 1, yCoord, zCoord, tMeta)) tIndexIntoMapping |= 1 << 2; + if (isSameBlock(aWorld, xCoord, yCoord, zCoord + 1, tMeta)) tIndexIntoMapping |= 1 << 3; + if (isSameBlock(aWorld, xCoord - 1, yCoord, zCoord, tMeta)) tIndexIntoMapping |= 1 << 4; + if (isSameBlock(aWorld, xCoord, yCoord, zCoord - 1, tMeta)) tIndexIntoMapping |= 1 << 5; + return Textures.BlockIcons.CONNECTED_HULLS[tStartIndex + mapping[ordinalSide][tIndexIntoMapping]].getIcon(); + } + + private boolean isSameBlock(IBlockAccess aWorld, int aX, int aY, int aZ, int aMeta) { + return aWorld.getBlock(aX, aY, aZ) == this && aWorld.getBlockMetadata(aX, aY, aZ) == aMeta; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings5.java b/src/main/java/gregtech/common/blocks/BlockCasings5.java new file mode 100644 index 0000000000..15b3eedcba --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings5.java @@ -0,0 +1,161 @@ +package gregtech.common.blocks; + +import static gregtech.api.enums.HeatingCoilLevel.EV; +import static gregtech.api.enums.HeatingCoilLevel.HV; +import static gregtech.api.enums.HeatingCoilLevel.IV; +import static gregtech.api.enums.HeatingCoilLevel.LV; +import static gregtech.api.enums.HeatingCoilLevel.LuV; +import static gregtech.api.enums.HeatingCoilLevel.MAX; +import static gregtech.api.enums.HeatingCoilLevel.MV; +import static gregtech.api.enums.HeatingCoilLevel.None; +import static gregtech.api.enums.HeatingCoilLevel.UEV; +import static gregtech.api.enums.HeatingCoilLevel.UHV; +import static gregtech.api.enums.HeatingCoilLevel.UIV; +import static gregtech.api.enums.HeatingCoilLevel.UMV; +import static gregtech.api.enums.HeatingCoilLevel.UV; +import static gregtech.api.enums.HeatingCoilLevel.UXV; +import static gregtech.api.enums.HeatingCoilLevel.ZPM; + +import java.util.function.Consumer; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IHeatingCoil; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings5 extends BlockCasingsAbstract implements IHeatingCoil { + + public BlockCasings5() { + super(ItemCasings5.class, "gt.blockcasings5", MaterialCasings.INSTANCE, 16); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Cupronickel Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Kanthal Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Nichrome Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "TPV-Alloy Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "HSS-G Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Naquadah Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Naquadah Alloy Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Electrum Flux Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Awakened Draconium Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "HSS-S Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Trinium Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Infinity Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Hypogen Coil Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Eternal Coil Block"); + + ItemList.Casing_Coil_Cupronickel.set(new ItemStack(this, 1, 0)); + ItemList.Casing_Coil_Kanthal.set(new ItemStack(this, 1, 1)); + ItemList.Casing_Coil_Nichrome.set(new ItemStack(this, 1, 2)); + ItemList.Casing_Coil_TungstenSteel.set(new ItemStack(this, 1, 3)); + ItemList.Casing_Coil_HSSG.set(new ItemStack(this, 1, 4)); + ItemList.Casing_Coil_Naquadah.set(new ItemStack(this, 1, 5)); + ItemList.Casing_Coil_NaquadahAlloy.set(new ItemStack(this, 1, 6)); + ItemList.Casing_Coil_ElectrumFlux.set(new ItemStack(this, 1, 7)); + ItemList.Casing_Coil_AwakenedDraconium.set(new ItemStack(this, 1, 8)); + ItemList.Casing_Coil_HSSS.set(new ItemStack(this, 1, 9)); + ItemList.Casing_Coil_Trinium.set(new ItemStack(this, 1, 10)); + ItemList.Casing_Coil_Infinity.set(new ItemStack(this, 1, 11)); + ItemList.Casing_Coil_Hypogen.set(new ItemStack(this, 1, 12)); + ItemList.Casing_Coil_Eternal.set(new ItemStack(this, 1, 13)); + ItemList.Casing_Shielded_Accelerator.set(new ItemStack(this, 1, 14)); + } + + @Override + public int getTextureIndex(int aMeta) { + return (1 << 7) | aMeta; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.MACHINE_COIL_CUPRONICKEL.getIcon(); + case 1 -> Textures.BlockIcons.MACHINE_COIL_KANTHAL.getIcon(); + case 2 -> Textures.BlockIcons.MACHINE_COIL_NICHROME.getIcon(); + case 3 -> Textures.BlockIcons.MACHINE_COIL_TUNGSTENSTEEL.getIcon(); + case 4 -> Textures.BlockIcons.MACHINE_COIL_HSSG.getIcon(); + case 5 -> Textures.BlockIcons.MACHINE_COIL_NAQUADAH.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_COIL_NAQUADAHALLOY.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_COIL_ELECTRUMFLUX.getIcon(); + case 8 -> Textures.BlockIcons.MACHINE_COIL_AWAKENEDDRACONIUM.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_COIL_HSSS.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_COIL_TRINIUM.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_COIL_INFINITY.getIcon(); + case 12 -> Textures.BlockIcons.MACHINE_COIL_HYPOGEN.getIcon(); + case 13 -> Textures.BlockIcons.MACHINE_COIL_ETERNAL.getIcon(); + case 14 -> Textures.BlockIcons.MACHINE_CASING_SHIELDED_ACCELERATOR.getIcon(); + default -> Textures.BlockIcons.MACHINE_COIL_CUPRONICKEL.getIcon(); + }; + } + + /*--------------- COIL CHECK IMPL. ------------*/ + + public static HeatingCoilLevel getCoilHeatFromDamage(int meta) { + return switch (meta) { + case 0 -> LV; + case 1 -> MV; + case 2 -> HV; + case 3 -> EV; + case 4 -> IV; + case 5 -> ZPM; + case 6 -> UV; + case 7 -> UEV; + case 8 -> UIV; + case 9 -> LuV; + case 10 -> UHV; + case 11 -> UMV; + case 12 -> UXV; + case 13 -> MAX; + default -> None; + }; + } + + public static int getMetaFromCoilHeat(HeatingCoilLevel level) { + return switch (level) { + case LV -> 0; + case MV -> 1; + case HV -> 2; + case EV -> 3; + case IV -> 4; + case ZPM -> 5; + case UV -> 6; + case UEV -> 7; + case UIV -> 8; + case LuV -> 9; + case UHV -> 10; + case UMV -> 11; + case UXV -> 12; + case MAX -> 13; + default -> 0; + }; + } + + @Override + public HeatingCoilLevel getCoilHeat(int meta) { + getOnCoilCheck().accept(this); + return getCoilHeatFromDamage(meta); + } + + /*--------------- CALLBACK ------------*/ + + private Consumer callback = coil -> {}; + + @Override + public void setOnCoilCheck(Consumer callback) { + this.callback = callback; + } + + @Override + public Consumer getOnCoilCheck() { + return this.callback; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings6.java b/src/main/java/gregtech/common/blocks/BlockCasings6.java new file mode 100644 index 0000000000..e638f36547 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings6.java @@ -0,0 +1,94 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings6 extends BlockCasingsAbstract { + + public BlockCasings6() { + super(ItemCasings6.class, "gt.blockcasings6", MaterialCasings.INSTANCE, 16); + + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Hermetic Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Hermetic Casing I"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Hermetic Casing II"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Hermetic Casing III"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Hermetic Casing IV"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Hermetic Casing V"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Hermetic Casing VI"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Hermetic Casing VII"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Hermetic Casing VIII"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Hermetic Casing IX"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Hermetic Casing X"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Hermetic Casing XI"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Hermetic Casing XII"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Hermetic Casing XIII"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Hermetic Casing XIV"); + + ItemList.Casing_Tank_0.set(new ItemStack(this, 1, 0)); + ItemList.Casing_Tank_1.set(new ItemStack(this, 1, 1)); + ItemList.Casing_Tank_2.set(new ItemStack(this, 1, 2)); + ItemList.Casing_Tank_3.set(new ItemStack(this, 1, 3)); + ItemList.Casing_Tank_4.set(new ItemStack(this, 1, 4)); + ItemList.Casing_Tank_5.set(new ItemStack(this, 1, 5)); + ItemList.Casing_Tank_6.set(new ItemStack(this, 1, 6)); + ItemList.Casing_Tank_7.set(new ItemStack(this, 1, 7)); + ItemList.Casing_Tank_8.set(new ItemStack(this, 1, 8)); + ItemList.Casing_Tank_9.set(new ItemStack(this, 1, 9)); + ItemList.Casing_Tank_10.set(new ItemStack(this, 1, 10)); + ItemList.Casing_Tank_11.set(new ItemStack(this, 1, 11)); + ItemList.Casing_Tank_12.set(new ItemStack(this, 1, 12)); + ItemList.Casing_Tank_13.set(new ItemStack(this, 1, 13)); + ItemList.Casing_Tank_14.set(new ItemStack(this, 1, 14)); + } + + @Override + public int getTextureIndex(int aMeta) { + return (8 << 7) | (aMeta + 112); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + if (ordinalSide == 0) { + return Textures.BlockIcons.MACHINECASINGS_BOTTOM[aMeta].getIcon(); + } + if (ordinalSide == 1) { + return Textures.BlockIcons.MACHINECASINGS_TOP[aMeta].getIcon(); + } + return switch (aMeta) { + case 1 -> Textures.BlockIcons.MACHINE_CASING_TANK_1.getIcon(); + case 2 -> Textures.BlockIcons.MACHINE_CASING_TANK_2.getIcon(); + case 3 -> Textures.BlockIcons.MACHINE_CASING_TANK_3.getIcon(); + case 4 -> Textures.BlockIcons.MACHINE_CASING_TANK_4.getIcon(); + case 5 -> Textures.BlockIcons.MACHINE_CASING_TANK_5.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_CASING_TANK_6.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_CASING_TANK_7.getIcon(); + case 8 -> Textures.BlockIcons.MACHINE_CASING_TANK_8.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_CASING_TANK_9.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_CASING_TANK_10.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_CASING_TANK_11.getIcon(); + case 12 -> Textures.BlockIcons.MACHINE_CASING_TANK_12.getIcon(); + case 13 -> Textures.BlockIcons.MACHINE_CASING_TANK_13.getIcon(); + case 14 -> Textures.BlockIcons.MACHINE_CASING_TANK_14.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_TANK_0.getIcon(); + }; + } + + @Override + public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) { + return gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 + | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8 + | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2]; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings8.java b/src/main/java/gregtech/common/blocks/BlockCasings8.java new file mode 100644 index 0000000000..2e8781bca1 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings8.java @@ -0,0 +1,188 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTRenderingWorld; +import gregtech.common.tileentities.machines.multi.MTELargeTurbine; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings8 extends BlockCasingsAbstract { + + public static boolean mConnectedMachineTextures = true; + + // WATCH OUT FOR TEXTURE ID's + public BlockCasings8() { + super(ItemCasings8.class, "gt.blockcasings8", MaterialCasings.INSTANCE, 15); + /* + * DO NOT USE INDEX 15 ! USED HERE: https://github.com/GTNewHorizons/KubaTech/pull/101 + */ + + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Chemically Inert Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "PTFE Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mining Neutronium Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Mining Black Plutonium Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Extreme Engine Intake Casing"); + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + ".5.name", + "Europium Reinforced Radiation Proof Machine Casing"); + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + ".6.name", + "Advanced Rhodium Plated Palladium Machine Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".7.name", "Advanced Iridium Plated Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Magical Machine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "HSS-S Turbine Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Radiant Naquadah Alloy Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".11.name", "Basic Photolithographic Framework Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".12.name", "Reinforced Photolithographic Framework Casing"); + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + ".13.name", + "Radiation Proof Photolithographic Framework Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Infinity Cooled Casing"); + + ItemList.Casing_Chemically_Inert.set(new ItemStack(this, 1, 0)); + ItemList.Casing_Pipe_Polytetrafluoroethylene.set(new ItemStack(this, 1, 1)); + ItemList.Casing_MiningNeutronium.set(new ItemStack(this, 1, 2)); + ItemList.Casing_MiningBlackPlutonium.set(new ItemStack(this, 1, 3)); + ItemList.Casing_ExtremeEngineIntake.set(new ItemStack(this, 1, 4)); + ItemList.Casing_AdvancedRadiationProof.set(new ItemStack(this, 1, 5)); + ItemList.Casing_Advanced_Rhodium_Palladium.set(new ItemStack(this, 1, 6)); + ItemList.Casing_Advanced_Iridium.set(new ItemStack(this, 1, 7)); + ItemList.Casing_Magical.set(new ItemStack(this, 1, 8)); + ItemList.Casing_TurbineGasAdvanced.set(new ItemStack(this, 1, 9)); + ItemList.RadiantNaquadahAlloyCasing.set(new ItemStack(this, 1, 10)); + ItemList.BasicPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 11)); + ItemList.ReinforcedPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 12)); + ItemList.RadiationProofPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 13)); + ItemList.InfinityCooledCasing.set(new ItemStack(this, 1, 14)); + } + + @Override + public int getTextureIndex(int aMeta) { + return (1 << 7) | (aMeta + 48); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.MACHINE_CASING_CHEMICALLY_INERT.getIcon(); + case 1 -> Textures.BlockIcons.MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.getIcon(); + case 2 -> Textures.BlockIcons.MACHINE_CASING_MINING_NEUTRONIUM.getIcon(); + case 3 -> Textures.BlockIcons.MACHINE_CASING_MINING_BLACKPLUTONIUM.getIcon(); + case 4 -> Textures.BlockIcons.MACHINE_CASING_EXTREME_ENGINE_INTAKE.getIcon(); // changed color in a + // terrible way + case 5 -> Textures.BlockIcons.MACHINE_CASING_ADVANCEDRADIATIONPROOF.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_CASING_RHODIUM_PALLADIUM.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_CASING_IRIDIUM.getIcon(); + case 8 -> Textures.BlockIcons.MACHINE_CASING_MAGICAL.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_CASING_ADVANCEDGAS.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_1.getIcon(); + case 12 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_2.getIcon(); + case 13 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_3.getIcon(); + case 14 -> Textures.BlockIcons.INFINITY_COOLED_CASING.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); + }; + } + + public IIcon getTurbineCasing(int meta, int iconIndex, boolean active, boolean hasTurbine) { + // noinspection SwitchStatementWithTooFewBranches // "if" is harder to edit + return switch (meta) { + case 9 -> active ? Textures.BlockIcons.TURBINE_ADVGASACTIVE[iconIndex].getIcon() + : hasTurbine ? Textures.BlockIcons.TURBINEADVGAS[iconIndex].getIcon() + : Textures.BlockIcons.TURBINE_ADVGASEMPTY[iconIndex].getIcon(); + default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon() + : hasTurbine ? Textures.BlockIcons.TURBINE[iconIndex].getIcon() + : Textures.BlockIcons.TURBINE_EMPTY[iconIndex].getIcon(); + }; + } + + private static int isTurbineControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0; + if (tTile.getMetaTileEntity() instanceof MTELargeTurbine turbine && tTile.getFrontFacing() + .ordinal() == ordinalSide) { + if (turbine.isNewStyleRendering()) return 0; + if (tTile.isActive()) return 1; + return turbine.hasTurbine() ? 2 : 3; + } + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { + aWorld = GTRenderingWorld.getInstance(aWorld); + final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + + if (tMeta != 9 || !mConnectedMachineTextures) { + return getIcon(ordinalSide, tMeta); + } + + int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1; + + switch (ordinalSide / 2) { + case 0 -> { + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + if (i == 0 && j == 0) continue; + int tState; + if ((tState = isTurbineControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, ordinalSide)) + != 0) { + return getTurbineCasing(tMeta, 4 - i * 3 - j, tState == 1, tState == 2); + } + } + } + } + case 1 -> { + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + if (i == 0 && j == 0) continue; + int tState; + if ((tState = isTurbineControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, ordinalSide)) + != 0) { + return getTurbineCasing( + tMeta, + 4 + i * 3 - j * tInvertLeftRightMod, + tState == 1, + tState == 2); + } + } + } + } + case 2 -> { + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + if (i == 0 && j == 0) continue; + int tState; + if ((tState = isTurbineControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, ordinalSide)) + != 0) { + return getTurbineCasing( + tMeta, + 4 + i * 3 + j * tInvertLeftRightMod, + tState == 1, + tState == 2); + } + } + } + } + } + + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasings9.java b/src/main/java/gregtech/common/blocks/BlockCasings9.java new file mode 100644 index 0000000000..a58ac1f25c --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasings9.java @@ -0,0 +1,96 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class BlockCasings9 extends BlockCasingsAbstract { + + public BlockCasings9() { + super(ItemCasings9.class, "gt.blockcasings9", MaterialCasings.INSTANCE, 16); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "PBI Pipe Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Advanced Filter Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".1.tooltip", "Less than five 0.1μm particles per m^3"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Primitive Wooden Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".3.name", "Superplasticizer-Treated High Strength Concrete"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Sterile Water Plant Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".5.name", "Reinforced Sterile Water Plant Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Slick Sterile Flocculation Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".7.name", "Stabilized Naquadah Water Plant Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".8.name", "Inert Neutralization Water Plant Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Reactive Gas Containment Casing"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Inert Filtration Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".11.name", "Heat-Resistant Trinium Plated Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".12.name", "Naquadria-Reinforced Water Plant Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".13.name", "High Energy Ultraviolet Emitter Casing"); + // placeholder name + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".14.name", "Particle Beam Guidance Pipe Casing"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".15.name", "Femtometer-Calibrated Particle Beam Casing"); + + ItemList.Casing_Pipe_Polybenzimidazole.set(new ItemStack(this, 1, 0)); + ItemList.Casing_Vent_T2.set(new ItemStack(this, 1, 1)); + ItemList.WoodenCasing.set(new ItemStack(this, 1, 2)); + ItemList.BlockIndustrialStrengthConcrete.set(new ItemStack(this, 1, 3)); + ItemList.BlockIndustrialWaterPlantCasing.set(new ItemStack(this, 1, 4)); + ItemList.BlockSterileWaterPlantCasing.set(new ItemStack(this, 1, 5)); + ItemList.BlockFlocculationCasing.set(new ItemStack(this, 1, 6)); + ItemList.BlockNaquadahReinforcedWaterPlantCasing.set(new ItemStack(this, 1, 7)); + ItemList.BlockExtremeCorrosionResistantCasing.set(new ItemStack(this, 1, 8)); + ItemList.BlockHighPressureResistantCasing.set(new ItemStack(this, 1, 9)); + ItemList.BlockOzoneCasing.set(new ItemStack(this, 1, 10)); + ItemList.BlockPlasmaHeatingCasing.set(new ItemStack(this, 1, 11)); + ItemList.BlockNaquadriaReinforcedWaterPlantCasing.set(new ItemStack(this, 1, 12)); + ItemList.BlockUltraVioletLaserEmitter.set(new ItemStack(this, 1, 13)); + ItemList.BlockQuarkPipe.set(new ItemStack(this, 1, 14)); + ItemList.BlockQuarkReleaseChamber.set(new ItemStack(this, 1, 15)); + } + + @Override + public int getTextureIndex(int aMeta) { + return (16 << 7) | (aMeta + 16); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE.getIcon(); + case 1 -> Textures.BlockIcons.MACHINE_CASING_VENT_T2.getIcon(); + case 2 -> ordinalSide >= 2 ? Textures.BlockIcons.TEXTURE_METAL_PANEL_E.getIcon() + : Textures.BlockIcons.TEXTURE_METAL_PANEL_E_A.getIcon(); + case 3 -> Textures.BlockIcons.INDUSTRIAL_STRENGTH_CONCRETE.getIcon(); + case 4 -> Textures.BlockIcons.MACHINE_CASING_INDUSTRIAL_WATER_PLANT.getIcon(); + case 5 -> Textures.BlockIcons.WATER_PLANT_CONCRETE_CASING.getIcon(); + case 6 -> Textures.BlockIcons.MACHINE_CASING_FLOCCULATION.getIcon(); + case 7 -> Textures.BlockIcons.MACHINE_CASING_NAQUADAH_REINFORCED_WATER_PLANT.getIcon(); + case 8 -> Textures.BlockIcons.MACHINE_CASING_EXTREME_CORROSION_RESISTANT.getIcon(); + case 9 -> Textures.BlockIcons.MACHINE_CASING_HIGH_PRESSURE_RESISTANT.getIcon(); + case 10 -> Textures.BlockIcons.MACHINE_CASING_OZONE.getIcon(); + case 11 -> Textures.BlockIcons.MACHINE_CASING_PLASMA_HEATER.getIcon(); + case 12 -> Textures.BlockIcons.NAQUADRIA_REINFORCED_WATER_PLANT_CASING.getIcon(); + case 13 -> Textures.BlockIcons.UV_BACKLIGHT_STERILIZER_CASING.getIcon(); + case 14 -> Textures.BlockIcons.BLOCK_QUARK_PIPE.getIcon(); + case 15 -> Textures.BlockIcons.BLOCK_QUARK_RELEASE_CHAMBER.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); + }; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCasingsAbstract.java b/src/main/java/gregtech/common/blocks/BlockCasingsAbstract.java new file mode 100644 index 0000000000..5481f1f058 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCasingsAbstract.java @@ -0,0 +1,143 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Textures; +import gregtech.api.items.GTGenericBlock; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; + +/** + * The base class for casings. Casings are the blocks that are mainly used to build multiblocks. + */ +public abstract class BlockCasingsAbstract extends GTGenericBlock + implements gregtech.api.interfaces.IHasIndexedTexture { + + public BlockCasingsAbstract(Class aItemClass, String aName, Material aMaterial) { + super(aItemClass, aName, aMaterial); + setStepSound(soundTypeMetal); + setCreativeTab(GregTechAPI.TAB_GREGTECH); + GregTechAPI.registerMachineBlock(this, -1); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this"); + } + + public BlockCasingsAbstract(Class aItemClass, String aName, Material aMaterial, int aMaxMeta) { + this(aItemClass, aName, aMaterial); + for (int i = 0; i < aMaxMeta; i++) { + Textures.BlockIcons.setCasingTextureForId(getTextureIndex(i), TextureFactory.of(this, i)); + } + } + + @Override + public String getHarvestTool(int aMeta) { + return "wrench"; + } + + @Override + public int getHarvestLevel(int aMeta) { + return 2; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ); + } + + @Override + public float getExplosionResistance(Entity aTNT) { + return Blocks.iron_block.getExplosionResistance(aTNT); + } + + @Override + protected boolean canSilkHarvest() { + return false; + } + + @Override + public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { + if (GregTechAPI.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public String getUnlocalizedName() { + return this.mUnlocalizedName; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return true; + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) { + if (GregTechAPI.isMachineBlock(this, aMetaData)) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + public int damageDropped(int metadata) { + return metadata; + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister aIconRegister) {} + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < 16; i++) { + ItemStack aStack = new ItemStack(aItem, 1, i); + if (!aStack.getDisplayName() + .contains(".name")) aList.add(aStack); + } + } + + /** + * Provide a fallback to subclasses in addons. + */ + @Override + public int getTextureIndex(int aMeta) { + return Textures.BlockIcons.ERROR_TEXTURE_INDEX; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockConcretes.java b/src/main/java/gregtech/common/blocks/BlockConcretes.java new file mode 100644 index 0000000000..1bf8dcf2fe --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockConcretes.java @@ -0,0 +1,83 @@ +package gregtech.common.blocks; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IBlockOnWalkOver; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTOreDictUnificator; + +public class BlockConcretes extends BlockStonesAbstract implements IBlockOnWalkOver { + + public BlockConcretes() { + super(ItemConcretes.class, "gt.blockconcretes"); + setResistance(20.0F); + // this.slipperiness = 0.9F; + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Dark Concrete"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Dark Concrete Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Dark Concrete Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Dark Concrete Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Dark Concrete Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Dark Concrete Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Dark Concrete"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Dark Concrete"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Light Concrete"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Light Concrete Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Light Concrete Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Light Concrete Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Light Concrete Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Light Concrete Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Light Concrete"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Light Concrete"); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 0)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 1)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 2)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 3)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 4)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 5)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 6)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 7)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 8)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 9)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 10)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 11)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 12)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 13)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 14)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 15)); + } + + @Override + public int getHarvestLevel(int aMeta) { + return 1; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16)) { + return gregtech.api.enums.Textures.BlockIcons.CONCRETES[aMeta].getIcon(); + } + return gregtech.api.enums.Textures.BlockIcons.CONCRETES[0].getIcon(); + } + + @Override + public void onWalkOver(EntityLivingBase aEntity, World aWorld, int aX, int aY, int aZ) { + if ((aEntity.motionX != 0 || aEntity.motionZ != 0) && !aEntity.isInWater() + && !aEntity.isWet() + && !aEntity.isSneaking()) { + double tSpeed = (aWorld.getBlock(aX, aY - 1, aZ).slipperiness >= 0.8 ? 1.5 : 1.2); + aEntity.motionX *= tSpeed; + aEntity.motionZ *= tSpeed; + } + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockCyclotronCoils.java b/src/main/java/gregtech/common/blocks/BlockCyclotronCoils.java new file mode 100644 index 0000000000..437e48a37a --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockCyclotronCoils.java @@ -0,0 +1,131 @@ +package gregtech.common.blocks; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +public class BlockCyclotronCoils extends BlockCasingsAbstract { + + public BlockCyclotronCoils() { + super(ItemCyclotronCasings.class, "gt.blockcasings.cyclotron_coils", MaterialCasings.INSTANCE, 16); + + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "MV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "HV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "EV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "IV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "LuV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "ZPM Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "UV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "UHV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "UEV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "UIV Solenoid Superconductor Coil"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "UMV Solenoid Superconductor Coil"); + + ItemList.Superconducting_Magnet_Solenoid_MV.set(new ItemStack(this, 1, 0)); + ItemList.Superconducting_Magnet_Solenoid_HV.set(new ItemStack(this, 1, 1)); + ItemList.Superconducting_Magnet_Solenoid_EV.set(new ItemStack(this, 1, 2)); + ItemList.Superconducting_Magnet_Solenoid_IV.set(new ItemStack(this, 1, 3)); + ItemList.Superconducting_Magnet_Solenoid_LuV.set(new ItemStack(this, 1, 4)); + ItemList.Superconducting_Magnet_Solenoid_ZPM.set(new ItemStack(this, 1, 5)); + ItemList.Superconducting_Magnet_Solenoid_UV.set(new ItemStack(this, 1, 6)); + ItemList.Superconducting_Magnet_Solenoid_UHV.set(new ItemStack(this, 1, 7)); + ItemList.Superconducting_Magnet_Solenoid_UEV.set(new ItemStack(this, 1, 8)); + ItemList.Superconducting_Magnet_Solenoid_UIV.set(new ItemStack(this, 1, 9)); + ItemList.Superconducting_Magnet_Solenoid_UMV.set(new ItemStack(this, 1, 10)); + } + + @Override + public int getTextureIndex(int aMeta) { + return (2 << 7) | (aMeta); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16)) { + switch (aMeta) { + case 0 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.MV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.MV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 1 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.HV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.HV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 2 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.EV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.EV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 3 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.IV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.IV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 4 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.LuV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.LuV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 5 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.ZPM_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.ZPM_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 6 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.UV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.UV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 7 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.UHV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.UHV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 8 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.UEV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.UEV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 9 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.UIV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.UIV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + case 10 -> { + if (ordinalSide == 0 || ordinalSide == 1) { + return Textures.BlockIcons.UMV_TOP_CYCLOTRON_SOLENOID.getIcon(); + } + return Textures.BlockIcons.UMV_SIDE_CYCLOTRON_SOLENOID.getIcon(); + } + } + } + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + + public int getVoltageTier(int meta) { + return meta + 2; + } + + @Override + public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ) > 9 ? super.colorMultiplier(aWorld, aX, aY, aZ) + : gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8 + | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2]; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockDrone.java b/src/main/java/gregtech/common/blocks/BlockDrone.java new file mode 100644 index 0000000000..2d1bedff9a --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockDrone.java @@ -0,0 +1,65 @@ +package gregtech.common.blocks; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.common.tileentities.render.TileEntityDrone; + +public class BlockDrone extends Block { + + public BlockDrone() { + super(Material.iron); + this.setResistance(20f); + this.setHardness(-1.0f); + this.setCreativeTab(GregTechAPI.TAB_GREGTECH); + this.setBlockName("gt.dronerender"); + this.setLightLevel(100.0f); + GameRegistry.registerBlock(this, getUnlocalizedName()); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT"); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean canRenderInPass(int a) { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + return new TileEntityDrone(); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) { + return new ArrayList<>(); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockFrameBox.java b/src/main/java/gregtech/common/blocks/BlockFrameBox.java new file mode 100644 index 0000000000..59ca98ef8e --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockFrameBox.java @@ -0,0 +1,446 @@ +package gregtech.common.blocks; + +import static gregtech.api.enums.GTValues.W; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +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.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.metatileentity.BaseTileEntity; +import gregtech.api.metatileentity.CoverableTileEntity; +import gregtech.api.metatileentity.implementations.MTEFrame; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.common.render.GTRendererBlock; + +public class BlockFrameBox extends BlockContainer { + + protected final String mUnlocalizedName; + + private static final String DOT_NAME = ".name"; + private static final String DOT_TOOLTIP = ".tooltip"; + + // We need to keep around a temporary TE to preserve this TE after breaking the block, so we can + // properly call getDrops() on it + private static final ThreadLocal mTemporaryTileEntity = new ThreadLocal<>(); + + public BlockFrameBox() { + super(new MaterialMachines()); + this.mUnlocalizedName = "gt.blockframes"; + setBlockName(this.mUnlocalizedName); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + "." + W + ".name", "Any Sub Block of this one"); + + GameRegistry.registerBlock(this, ItemFrames.class, getUnlocalizedName()); + + for (int meta = 1; meta < GregTechAPI.sGeneratedMaterials.length; meta++) { + Materials material = GregTechAPI.sGeneratedMaterials[meta]; + if (material != null && (material.mTypes & 0x02) != 0) { + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + "." + meta + DOT_NAME, + GTLanguageManager.i18nPlaceholder ? getLocalizedNameFormat(material) : getLocalizedName(material)); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + "." + meta + DOT_TOOLTIP, material.getToolTip()); + } + } + } + + public ItemStack getStackForm(int amount, int meta) { + return new ItemStack(this, amount, meta); + } + + public String getLocalizedNameFormat(Materials aMaterial) { + return switch (aMaterial.mName) { + case "InfusedAir", "InfusedDull", "InfusedEarth", "InfusedEntropy", "InfusedFire", "InfusedOrder", "InfusedVis", "InfusedWater" -> "%material Infused Stone"; + case "Vermiculite", "Bentonite", "Kaolinite", "Talc", "BasalticMineralSand", "GraniticMineralSand", "GlauconiteSand", "CassiteriteSand", "GarnetSand", "QuartzSand", "Pitchblende", "FullersEarth" -> "%material"; + default -> "%material" + " Frame Box"; + }; + } + + @Override + public String getUnlocalizedName() { + return mUnlocalizedName; + } + + public String getLocalizedName(Materials aMaterial) { + return aMaterial.getDefaultLocalizedNameForItem(getLocalizedNameFormat(aMaterial)); + } + + private boolean isCover(ItemStack item) { + return GTUtility.isStackInList(item, GregTechAPI.sCovers.keySet()); + } + + private void createFrame(World worldIn, int x, int y, int z, BaseMetaPipeEntity baseMte) { + // Obtain metadata to grab proper material identifier + int meta = worldIn.getBlockMetadata(x, y, z); + Materials material = getMaterial(meta); + MTEFrame frame = new MTEFrame("GT_Frame_" + material, material); + baseMte.setMetaTileEntity(frame); + frame.setBaseMetaTileEntity(baseMte); + } + + private BaseMetaPipeEntity spawnFrameEntity(World worldIn, int x, int y, int z) { + // Spawn a TE frame box at this location, then apply the cover + BaseMetaPipeEntity newTileEntity = new BaseMetaPipeEntity(); + createFrame(worldIn, x, y, z, newTileEntity); + worldIn.setTileEntity(x, y, z, newTileEntity); + return newTileEntity; + } + + // Get the material that this frame box is made of + public static Materials getMaterial(int meta) { + return GregTechAPI.sGeneratedMaterials[meta]; + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + // Get ForgeDirection from side identifier. + ForgeDirection direction = ForgeDirection.getOrientation(side); + // If this block already holds a TE, just forward the call + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof BaseMetaPipeEntity baseTileEntity) { + // If this baseTileEntity has no MetaTileEntity associated with it, we need to create it + // This happens on world load for some reason + if (baseTileEntity.getMetaTileEntity() == null) { + createFrame(worldIn, x, y, z, baseTileEntity); + } + return baseTileEntity.onRightclick(player, direction, subX, subY, subZ); + } + + // If there was no TileEntity yet, we need to check if the player was holding a cover item and if so + // spawn a new frame box to apply the cover to + ItemStack item = player.getHeldItem(); + if (isCover(item)) { + BaseMetaPipeEntity newTileEntity = spawnFrameEntity(worldIn, x, y, z); + newTileEntity.onRightclick(player, direction, subX, subY, subZ); + return true; + } + + return false; + } + + @Override + public int getRenderType() { + if (GTRendererBlock.INSTANCE == null) { + return super.getRenderType(); + } + return GTRendererBlock.mRenderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderBlockPass() { + return 1; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item aItem, CreativeTabs aTab, List aList) { + for (int i = 0; i < GregTechAPI.sGeneratedMaterials.length; i++) { + Materials tMaterial = GregTechAPI.sGeneratedMaterials[i]; + // If material is not null and has a frame box item associated with it + if ((tMaterial != null) && ((tMaterial.mTypes & 0x02) != 0)) { + aList.add(new ItemStack(aItem, 1, i)); + } + } + } + + @Override + public String getHarvestTool(int aMeta) { + return "wrench"; + } + + @Override + public int getHarvestLevel(int aMeta) { + return aMeta % 4; + } + + @Override + public boolean canConnectRedstone(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + ForgeDirection forgeSide = switch (ordinalSide) { + case (-2) -> ForgeDirection.DOWN; + case (-1) -> ForgeDirection.UP; + case (0) -> ForgeDirection.NORTH; + case (2) -> ForgeDirection.SOUTH; + case (3) -> ForgeDirection.WEST; + case (1) -> ForgeDirection.EAST; + default -> ForgeDirection.UNKNOWN; + }; + final TileEntity frameEntity = aWorld.getTileEntity(aX, aY, aZ); + return frameEntity instanceof CoverableTileEntity cte && cte.getCoverInfoAtSide(forgeSide) + .getCoverID() != 0; + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ); + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + gtTE.onBlockDestroyed(); + mTemporaryTileEntity.set(gtTE); + } + // Cause structure update + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata); + } + + @Override + public void onBlockAdded(World worldIn, int x, int y, int z) { + // Cause structure update + GregTechAPI.causeMachineUpdate(worldIn, x, y, z); + super.onBlockAdded(worldIn, x, y, z); + } + + @Override + public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { + gtTE.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); + return; + } + super.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); + } + + @Override + public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + return (tTileEntity instanceof BaseMetaTileEntity baseMTE) && baseMTE.privateAccess() + && !baseMTE.playerOwnsThis(aPlayer, true) ? -1.0F + : super.getPlayerRelativeBlockHardness(aPlayer, aWorld, aX, aY, aZ); + } + + @Override + public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof BaseTileEntity baseTE) { + baseTE.onAdjacentBlockChange(aTileX, aTileY, aTileZ); + } + } + + @Override + public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof BaseMetaPipeEntity baseMetaPipe) { + baseMetaPipe.onNeighborBlockChange(aX, aY, aZ); + } + } + + @Override + public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, + List outputAABB, Entity collider) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { + gtTE.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); + return; + } + super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { + return gtTE.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + return super.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { + return gtTE.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + return super.getSelectedBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + + @Override + public boolean isSideSolid(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) { + if (aWorld.getBlockMetadata(aX, aY, aZ) == 0) { + return true; + } + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof BaseMetaTileEntity) { + return true; + } + if (tTileEntity instanceof BaseMetaPipeEntity baseMetaPipe && (baseMetaPipe.mConnections & 0xFFFFFFC0) != 0) { + return true; + } + return (tTileEntity instanceof ICoverable coverable) && coverable.getCoverIDAtSide(side) != 0; + } + + @Override // THIS + public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int aX, int aY, int aZ) { + final TileEntity tTileEntity = blockAccess.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { + final AxisAlignedBB bbb = gtTE.getCollisionBoundingBoxFromPool(gtTE.getWorld(), 0, 0, 0); + minX = bbb.minX; // This essentially sets block bounds + minY = bbb.minY; + minZ = bbb.minZ; + maxX = bbb.maxX; + maxY = bbb.maxY; + maxZ = bbb.maxZ; + return; + } + super.setBlockBoundsBasedOnState(blockAccess, aX, aY, aZ); + } + + @Override + public void setBlockBoundsForItemRender() { + super.setBlockBounds(0, 0, 0, 1, 1, 1); + } + + @Override + public int getFlammability(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { + return 0; + } + + @Override + public int getFireSpreadSpeed(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { + return 0; + } + + @Override + public boolean isFireSource(World aWorld, int aX, int aY, int aZ, ForgeDirection side) { + return false; + } + + @Override + public boolean isFlammable(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { + return false; + } + + @Override + public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean hasTileEntity(int aMeta) { + return true; + } + + @Override + public boolean onBlockEventReceived(World aWorld, int aX, int aY, int aZ, int aData1, int aData2) { + super.onBlockEventReceived(aWorld, aX, aY, aZ, aData1, aData2); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + return tTileEntity != null && tTileEntity.receiveClientEvent(aData1, aData2); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + // Find temporary TE if there was one + final IGregTechTileEntity tempTe = mTemporaryTileEntity.get(); + ArrayList drops = new ArrayList<>(); + drops.add(getStackForm(1, metadata)); + // If there is one, grab all attached covers and drop them + if (tempTe != null) { + for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { + ItemStack cover = tempTe.getCoverItemAtSide(direction); + if (cover != null) drops.add(cover); + } + } + // Make sure to clear the temporary TE + mTemporaryTileEntity.remove(); + return drops; + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + if (ordinalSide < 0 || ordinalSide > 5) { + return 0; + } + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + return gtTE.getOutputRedstoneSignal( + ForgeDirection.getOrientation(ordinalSide) + .getOpposite()); + } + return 0; + } + + @Override + public int isProvidingStrongPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + if (ordinalSide < 0 || ordinalSide > 5) { + return 0; + } + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + return gtTE.getStrongOutputRedstoneSignal( + ForgeDirection.getOrientation(ordinalSide) + .getOpposite()); + } + return 0; + } + + @Override + public IIcon getIcon(int side, int meta) { + Materials material = GregTechAPI.sGeneratedMaterials[meta]; + if (material == null) return null; + return material.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon(); + } + + public ITexture[] getTexture(int meta) { + Materials material = getMaterial(meta); + if (material == null) return null; + return new ITexture[] { TextureFactory.of( + material.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex], + Dyes.getModulation(-1, material.mRGBa)) }; + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return null; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockGlass1.java b/src/main/java/gregtech/common/blocks/BlockGlass1.java new file mode 100644 index 0000000000..a8a287248b --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockGlass1.java @@ -0,0 +1,107 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Facing; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +/** + * The glass is split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + * + * This class hosts various special types of tiered glass with not many tiers. + */ +public class BlockGlass1 extends BlockCasingsAbstract { + + public BlockGlass1() { + super(ItemGlass1.class, "gt.blockglass1", Material.glass, 4); + this.opaque = false; + + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Chemical Grade Glass"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".1.name", "Electron-Permeable Neutronium Coated Glass"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Omni-Purpose Infinity Fused Glass"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".3.name", "Non-Photonic Matter Exclusion Glass"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".4.name", "Hawking Radiation Realignment Focus"); + + ItemList.GlassPHResistant.set(new ItemStack(this, 1, 0)); + ItemList.GlassUVResistant.set(new ItemStack(this, 1, 1)); + ItemList.GlassOmniPurposeInfinityFused.set(new ItemStack(this, 1, 2)); + ItemList.GlassQuarkContainment.set(new ItemStack(this, 1, 3)); + ItemList.GlassQuarkContainment.set(new ItemStack(this, 1, 3)); + ItemList.Hawking_Glass.set(new ItemStack(this, 1, 4)); + } + + @Override + public int getTextureIndex(int aMeta) { + // Page 16, 0-16 + return (16 << 7) | (aMeta); + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.GLASS_PH_RESISTANT.getIcon(); + case 1 -> Textures.BlockIcons.NEUTRONIUM_COATED_UV_RESISTANT_GLASS.getIcon(); + case 2 -> Textures.BlockIcons.OMNI_PURPOSE_INFINITY_FUSED_GLASS.getIcon(); + case 3 -> Textures.BlockIcons.GLASS_QUARK_CONTAINMENT.getIcon(); + case 4 -> Textures.BlockIcons.HAWKING_GLASS.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); + }; + } + + /** + * 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 + */ + @SideOnly(Side.CLIENT) + @Override + public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { + Block block = worldIn.getBlock(x, y, z); + + if (worldIn.getBlockMetadata(x, y, z) != worldIn.getBlockMetadata( + x - Facing.offsetsXForSide[side], + y - Facing.offsetsYForSide[side], + z - Facing.offsetsZForSide[side])) { + return true; + } + + if (block == this) { + return false; + } + + return super.shouldSideBeRendered(worldIn, x, y, z, side); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockGranites.java b/src/main/java/gregtech/common/blocks/BlockGranites.java new file mode 100644 index 0000000000..43a3f7a7e2 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockGranites.java @@ -0,0 +1,77 @@ +package gregtech.common.blocks; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTOreDictUnificator; + +public class BlockGranites extends BlockStonesAbstract { + + public BlockGranites() { + super(ItemGranites.class, "gt.blockgranites"); + setResistance(60.0F); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Black Granite"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Black Granite Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Black Granite Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Black Granite Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Black Granite Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Black Granite Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Black Granite"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Black Granite"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Red Granite"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Red Granite Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Red Granite Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Red Granite Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Red Granite Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Red Granite Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Red Granite"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Red Granite"); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 0)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 1)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 2)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 3)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 4)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 5)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 6)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 7)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 8)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 9)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 10)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 11)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 12)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 13)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 14)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 15)); + } + + @Override + public int getHarvestLevel(int aMeta) { + return 3; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16)) { + return gregtech.api.enums.Textures.BlockIcons.GRANITES[aMeta].getIcon(); + } + return gregtech.api.enums.Textures.BlockIcons.GRANITES[0].getIcon(); + } + + @Override + public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { + return !(entity instanceof EntityWither); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockLaser.java b/src/main/java/gregtech/common/blocks/BlockLaser.java new file mode 100644 index 0000000000..8a67ed6bc9 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockLaser.java @@ -0,0 +1,104 @@ +package gregtech.common.blocks; + +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.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 gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; +import gregtech.common.tileentities.render.TileEntityLaser; + +public class BlockLaser extends Block implements ITileEntityProvider { + + public static IIcon[] textures; + + public BlockLaser() { + super(Material.iron); + setBlockName("LaserPlate"); + this.setCreativeTab(GregTechAPI.TAB_GREGTECH); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".name", "Laser Resistant Plate"); + GregTechAPI.registerMachineBlock(this, -1); + GameRegistry.registerBlock(this, ItemBlockLaser.class, getUnlocalizedName()); + ItemList.Laser_Plate.set(new ItemStack(this, 1)); + } + + @Override + public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { + if (GregTechAPI.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) { + if (GregTechAPI.isMachineBlock(this, aMetaData)) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public String getHarvestTool(int aMeta) { + return "wrench"; + } + + @Override + public int getHarvestLevel(int aMeta) { + return 2; + } + + @Override + public String getUnlocalizedName() { + return "gt.laserplate"; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + blockIcon = Textures.BlockIcons.LASER_PLATE.getIcon(); + } + + @Override + public IIcon getIcon(int side, int meta) { + return blockIcon; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public float getBlockHardness(World world, int x, int y, int z) { + return 1.0f; + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityLaser(); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockMachines.java b/src/main/java/gregtech/common/blocks/BlockMachines.java new file mode 100644 index 0000000000..1db6f51730 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockMachines.java @@ -0,0 +1,703 @@ +package gregtech.common.blocks; + +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.cricketcraft.chisel.api.IFacade; + +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IDebugableBlock; +import gregtech.api.interfaces.tileentity.IColoredTileEntity; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IDebugableTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.GTGenericBlock; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.metatileentity.BaseTileEntity; +import gregtech.api.metatileentity.CoverableTileEntity; +import gregtech.api.util.GTBaseCrop; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import gregtech.common.covers.CoverInfo; +import gregtech.common.render.GTRendererBlock; +import gregtech.common.tileentities.storage.MTEQuantumChest; +import gtPlusPlus.xmod.gregtech.common.tileentities.redstone.MTERedstoneBase; + +@Optional.Interface(iface = "com.cricketcraft.chisel.api.IFacade", modid = "ChiselAPI") +public class BlockMachines extends GTGenericBlock implements IDebugableBlock, ITileEntityProvider, IFacade { + + private static final ThreadLocal mTemporaryTileEntity = new ThreadLocal<>(); + private boolean renderAsNormalBlock; + + public BlockMachines() { + super(ItemMachines.class, "gt.blockmachines", new MaterialMachines()); + GregTechAPI.registerMachineBlock(this, -1); + setHardness(1.0F); + setResistance(10.0F); + setStepSound(soundTypeMetal); + setCreativeTab(GregTechAPI.TAB_GREGTECH); + this.isBlockContainer = true; + this.renderAsNormalBlock = true; + this.useNeighborBrightness = true; + } + + @Override + public String getHarvestTool(int aMeta) { + if (aMeta >= 8 && aMeta <= 11) { + return "cutter"; + } + return "wrench"; + } + + @Override + public int getHarvestLevel(int aMeta) { + return aMeta % 4; + } + + @Override + protected boolean canSilkHarvest() { + return false; + } + + @Override + public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof BaseTileEntity)) { + ((BaseTileEntity) tTileEntity).onAdjacentBlockChange(aTileX, aTileY, aTileZ); + } + } + + @Override + public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof BaseMetaPipeEntity)) { + ((BaseMetaPipeEntity) tTileEntity).onNeighborBlockChange(aX, aY, aZ); + } + } + + @Override + public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { + super.onBlockAdded(aWorld, aX, aY, aZ); + if (GregTechAPI.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public String getUnlocalizedName() { + return "gt.blockmachines"; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(getUnlocalizedName() + ".name"); + } + + @Override + public int getFlammability(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { + return 0; + } + + @Override + public int getFireSpreadSpeed(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { + return GregTechAPI.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0) ? 100 : 0; + } + + @Override + public int getRenderType() { + if (GTRendererBlock.INSTANCE == null) { + return super.getRenderType(); + } + return GTRendererBlock.INSTANCE.mRenderID; + } + + @Override + public boolean isFireSource(World aWorld, int aX, int aY, int aZ, ForgeDirection side) { + return GregTechAPI.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0); + } + + @Override + public boolean isFlammable(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { + return GregTechAPI.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0); + } + + @Override + public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean canConnectRedstone(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + ForgeDirection forgeSide = switch (ordinalSide) { + case (-2) -> ForgeDirection.DOWN; + case (-1) -> ForgeDirection.UP; + case (0) -> ForgeDirection.NORTH; + case (2) -> ForgeDirection.SOUTH; + case (3) -> ForgeDirection.WEST; + case (1) -> ForgeDirection.EAST; + default -> ForgeDirection.UNKNOWN; + }; + final TileEntity machineEntity = aWorld.getTileEntity(aX, aY, aZ); + return machineEntity instanceof BaseMetaTileEntity bmte && (bmte.getCoverInfoAtSide(forgeSide) + .getCoverID() != 0 || bmte.getMetaTileEntity() instanceof MTERedstoneBase); + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean hasTileEntity(int aMeta) { + return true; + } + + @Override + public boolean hasComparatorInputOverride() { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return renderAsNormalBlock; + } + + public BlockMachines setRenderAsNormalBlock(boolean aBool) { + renderAsNormalBlock = aBool; + return this; + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public TileEntity createNewTileEntity(World aWorld, int aMeta) { + return createTileEntity(aWorld, aMeta); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) { + return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon(); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon(); + } + + @Override + public boolean onBlockEventReceived(World aWorld, int aX, int aY, int aZ, int aData1, int aData2) { + super.onBlockEventReceived(aWorld, aX, aY, aZ, aData1, aData2); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + return tTileEntity != null && tTileEntity.receiveClientEvent(aData1, aData2); + } + + @Override + public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, + List outputAABB, Entity collider) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity + && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { + ((IGregTechTileEntity) tTileEntity) + .addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); + return; + } + super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity + && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { + return ((IGregTechTileEntity) tTileEntity).getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + return super.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity + && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { + return ((IGregTechTileEntity) tTileEntity).getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + return super.getSelectedBoundingBoxFromPool(aWorld, aX, aY, aZ); + } + + @Override // THIS + public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int aX, int aY, int aZ) { + final TileEntity tTileEntity = blockAccess.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity + && (((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null)) { + final AxisAlignedBB bbb = ((IGregTechTileEntity) tTileEntity) + .getCollisionBoundingBoxFromPool(((IGregTechTileEntity) tTileEntity).getWorld(), 0, 0, 0); + minX = bbb.minX; // This essentially sets block bounds + minY = bbb.minY; + minZ = bbb.minZ; + maxX = bbb.maxX; + maxY = bbb.maxY; + maxZ = bbb.maxZ; + return; + } + super.setBlockBoundsBasedOnState(blockAccess, aX, aY, aZ); + } + + @Override + public void setBlockBoundsForItemRender() { + super.setBlockBounds(0, 0, 0, 1, 1, 1); + } + + @Override + public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity + && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { + ((IGregTechTileEntity) tTileEntity).onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); + return; + } + super.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + if (!GregTechAPI.sPostloadFinished) return; + GTLog.out.println("GTMod: Setting up Icon Register for Blocks"); + GregTechAPI.setBlockIconRegister(aIconRegister); + + GTLog.out.println("GTMod: Registering MetaTileEntity specific Textures"); + try { + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + if (GregTechAPI.METATILEENTITIES[i] != null) { + GregTechAPI.METATILEENTITIES[i].registerIcons(aIconRegister); + } + } + } catch (Exception e) { + e.printStackTrace(GTLog.err); + } + GTLog.out.println("GTMod: Registering Crop specific Textures"); + try { + for (GTBaseCrop tCrop : GTBaseCrop.sCropList) { + tCrop.registerSprites(aIconRegister); + } + } catch (Exception e) { + e.printStackTrace(GTLog.err); + } + GTLog.out.println("GTMod: Starting Block Icon Load Phase"); + GT_FML_LOGGER.info("GTMod: Starting Block Icon Load Phase"); + try { + for (Runnable tRunnable : GregTechAPI.sGTBlockIconload) { + tRunnable.run(); + } + } catch (Exception e) { + e.printStackTrace(GTLog.err); + } + GTLog.out.println("GTMod: Finished Block Icon Load Phase"); + GT_FML_LOGGER.info("GTMod: Finished Block Icon Load Phase"); + } + + @Override + public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + return tTileEntity instanceof BaseMetaTileEntity && ((BaseMetaTileEntity) tTileEntity).privateAccess() + && !((BaseMetaTileEntity) tTileEntity).playerOwnsThis(aPlayer, true) ? -1.0F + : super.getPlayerRelativeBlockHardness(aPlayer, aWorld, aX, aY, aZ); + } + + @Override + public boolean onBlockActivated(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer, int ordinalSide, + float aOffsetX, float aOffsetY, float aOffsetZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity == null) { + return false; + } + if (aPlayer.isSneaking()) { + final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); + if (tCurrentItem != null && !GTUtility.isStackInList(tCurrentItem, GregTechAPI.sScrewdriverList) + && !GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWrenchList) + && !GTUtility.isStackInList(tCurrentItem, GregTechAPI.sWireCutterList) + && !GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSolderingToolList) + && !GTUtility.isStackInList(tCurrentItem, GregTechAPI.sJackhammerList)) return false; + } + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + if (gtTE.getTimer() < 1L) { + return false; + } + if ((!aWorld.isRemote) && !gtTE.isUseableByPlayer(aPlayer)) { + return true; + } + return ((IGregTechTileEntity) tTileEntity) + .onRightclick(aPlayer, ForgeDirection.getOrientation(ordinalSide), aOffsetX, aOffsetY, aOffsetZ); + } + return false; + } + + @Override + public void onBlockClicked(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + gtTE.onLeftclick(aPlayer); + } + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + return gtTE.getMetaTileID(); + } + return 0; + } + + @Override + public void onBlockExploded(World aWorld, int aX, int aY, int aZ, Explosion aExplosion) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof BaseMetaTileEntity baseTE) { + GTLog.exp.printf( + "Explosion at : %d | %d | %d DIMID: %s due to near explosion!%n", + aX, + aY, + aZ, + aWorld.provider.dimensionId); + baseTE.doEnergyExplosion(); + } + super.onBlockExploded(aWorld, aX, aY, aZ, aExplosion); + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + gtTE.onBlockDestroyed(); + mTemporaryTileEntity.set(gtTE); + if (!(gtTE.getMetaTileEntity() instanceof MTEQuantumChest)) { + for (int i = 0; i < gtTE.getSizeInventory(); i++) { + final ItemStack tItem = gtTE.getStackInSlot(i); + if ((tItem != null) && (tItem.stackSize > 0) && (gtTE.isValidSlot(i)) && gtTE.shouldDropItemAt(i)) { + final EntityItem tItemEntity = new EntityItem( + aWorld, + aX + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, + aY + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, + aZ + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, + new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage())); + if (tItem.hasTagCompound()) { + tItemEntity.getEntityItem() + .setTagCompound( + (NBTTagCompound) tItem.getTagCompound() + .copy()); + } + tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D); + tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.25D); + tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D); + aWorld.spawnEntityInWorld(tItemEntity); + tItem.stackSize = 0; + gtTE.setInventorySlotContents(i, null); + } + } + } + } + super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata); + aWorld.removeTileEntity(aX, aY, aZ); + } + + @Override + public ArrayList getDrops(World aWorld, int aX, int aY, int aZ, int aMeta, int aFortune) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + return gtTE.getDrops(); + } + final IGregTechTileEntity tGregTechTileEntity = mTemporaryTileEntity.get(); + final ArrayList tDrops; + if (tGregTechTileEntity == null) { + tDrops = new ArrayList<>(); + } else { + tDrops = tGregTechTileEntity.getDrops(); + mTemporaryTileEntity.remove(); + } + return tDrops; + } + + @Override + public boolean removedByPlayer(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, boolean aWillHarvest) { + // This delays deletion of the block until after getDrops + return aWillHarvest || super.removedByPlayer(aWorld, aPlayer, aX, aY, aZ, false); + } + + @Override + public void harvestBlock(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, int aMeta) { + super.harvestBlock(aWorld, aPlayer, aX, aY, aZ, aMeta); + aWorld.setBlockToAir(aX, aY, aZ); + } + + @Override + public int getComparatorInputOverride(World aWorld, int aX, int aY, int aZ, int ordinalSide) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + return gtTE.getComparatorValue(ForgeDirection.getOrientation(ordinalSide)); + } + return 0; + } + + @Override + public int isProvidingWeakPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + if (ordinalSide < 0 || ordinalSide > 5) { + return 0; + } + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + return gtTE.getOutputRedstoneSignal( + ForgeDirection.getOrientation(ordinalSide) + .getOpposite()); + } + return 0; + } + + @Override + public int isProvidingStrongPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + if (ordinalSide < 0 || ordinalSide > 5) { + return 0; + } + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity gtTE) { + return gtTE.getStrongOutputRedstoneSignal( + ForgeDirection.getOrientation(ordinalSide) + .getOpposite()); + } + return 0; + } + + @Override + public void dropBlockAsItemWithChance(World aWorld, int aX, int aY, int aZ, int aMetadata, float chance, + int aFortune) { + if (!aWorld.isRemote) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity != null && (chance < 1.0F)) { + if (tTileEntity instanceof BaseMetaTileEntity bmte && (GregTechAPI.sMachineNonWrenchExplosions)) { + GTLog.exp.printf( + "Explosion at : %d | %d | %d DIMID: %s NonWrench picking/Rain!%n", + aX, + aY, + aZ, + aWorld.provider.dimensionId); + bmte.doEnergyExplosion(); + } + } else { + super.dropBlockAsItemWithChance(aWorld, aX, aY, aZ, aMetadata, chance, aFortune); + } + } + } + + @Override + public boolean isSideSolid(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) { + if (aWorld.getBlockMetadata(aX, aY, aZ) == 0) { + return true; + } + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity != null) { + if (tTileEntity instanceof BaseMetaTileEntity) { + return true; + } + if (tTileEntity instanceof BaseMetaPipeEntity + && (((BaseMetaPipeEntity) tTileEntity).mConnections & 0xFFFFFFC0) != 0) { + return true; + } + return tTileEntity instanceof ICoverable && ((ICoverable) tTileEntity).getCoverIDAtSide(side) != 0; + } + return false; + } + + @Override + public boolean isBlockNormalCube() { + return true; + } + + /** + * Returns the default ambient occlusion value based on block opacity + */ + @SideOnly(Side.CLIENT) + @Override + public float getAmbientOcclusionLightValue() { + return this.renderAsNormalBlock() ? 0.2F : 0.5F; + } + + /** + * @inheritDoc + */ + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World aWorld, int aX, int aY, int aZ, Random aRandom) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity) { + ((IGregTechTileEntity) tTileEntity).onRandomDisplayTick(); + } + } + + @Override + public int getLightOpacity(IBlockAccess aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity) { + return ((IGregTechTileEntity) tTileEntity).getLightOpacity(); + } + return aWorld.getBlockMetadata(aX, aY, aZ) == 0 ? 255 : 0; + } + + @Override + public int getLightValue(IBlockAccess aWorld, int aX, int aY, int aZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof BaseMetaTileEntity) { + return ((BaseMetaTileEntity) tTileEntity).getLightValue(); + } + return 0; + } + + @Override + public TileEntity createTileEntity(World aWorld, int aMeta) { + return GregTechAPI.createTileEntity(aMeta); + } + + @Override + public float getExplosionResistance(Entity entity, World aWorld, int aX, int aY, int aZ, double explosionX, + double explosionY, double explosionZ) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IGregTechTileEntity) { + return ((IGregTechTileEntity) tTileEntity).getBlastResistance(ForgeDirection.UNKNOWN); + } + return 10.0F; + } + + @SideOnly(Side.CLIENT) + @Override + public void getSubBlocks(Item item, CreativeTabs aCreativeTab, List outputSubBlocks) { + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + if (GregTechAPI.METATILEENTITIES[i] != null) { + outputSubBlocks.add(new ItemStack(item, 1, i)); + } + } + } + + @Override + public void onBlockPlacedBy(World aWorld, int aX, int aY, int aZ, EntityLivingBase aPlayer, ItemStack aStack) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (!(tTileEntity instanceof IGregTechTileEntity iGregTechTileEntity)) return; + iGregTechTileEntity.setFrontFacing( + BaseTileEntity.getSideForPlayerPlacing(aPlayer, ForgeDirection.UP, iGregTechTileEntity.getValidFacings())); + } + + @Override + public ArrayList getDebugInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, int aLogLevel) { + final TileEntity tTileEntity = aPlayer.worldObj.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IDebugableTileEntity) { + return ((IDebugableTileEntity) tTileEntity).getDebugInfo(aPlayer, aLogLevel); + } + return new ArrayList<>(); + } + + @Override + public boolean recolourBlock(World aWorld, int aX, int aY, int aZ, ForgeDirection side, int aColor) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IColoredTileEntity coloredTE) { + if (coloredTE.getColorization() == (byte) ((~aColor) & 0xF)) { + return false; + } + coloredTE.setColorization((byte) ((~aColor) & 0xF)); + return true; + } + return false; + } + + @Override + public Block getFacade(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof CoverableTileEntity tile) { + final ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide); + if (dir != ForgeDirection.UNKNOWN) { + final Block facadeBlock = tile.getCoverInfoAtSide(dir) + .getFacadeBlock(); + if (facadeBlock != null) return facadeBlock; + } else { + // we do not allow more than one type of facade per block, so no need to check every side + // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable + for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { + final Block facadeBlock = tile.getCoverInfoAtSide(tSide) + .getFacadeBlock(); + if (facadeBlock != null) { + return facadeBlock; + } + } + } + } + return Blocks.air; + } + + @Override + public int getFacadeMetadata(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof CoverableTileEntity tile) { + final ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide); + if (ordinalSide != -1) { + final CoverInfo coverInfo = tile.getCoverInfoAtSide(dir); + final Block facadeBlock = coverInfo.getFacadeBlock(); + if (facadeBlock != null) return coverInfo.getFacadeMeta(); + } else { + // we do not allow more than one type of facade per block, so no need to check every side + // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable + for (final ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) { + final CoverInfo coverInfo = tile.getCoverInfoAtSide(d); + final Block facadeBlock = coverInfo.getFacadeBlock(); + if (facadeBlock != null) { + return coverInfo.getFacadeMeta(); + } + } + } + } + return 0; + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockMetal.java b/src/main/java/gregtech/common/blocks/BlockMetal.java new file mode 100644 index 0000000000..642de8b39c --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockMetal.java @@ -0,0 +1,68 @@ +package gregtech.common.blocks; + +import static gregtech.api.enums.Mods.NotEnoughItems; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTOreDictUnificator; + +public class BlockMetal extends BlockStorage { + + public Materials[] mMats; + public OrePrefixes mPrefix; + public IIconContainer[] mBlockIcons; + public boolean mHideBlocks; + public static boolean mNEIisLoaded = NotEnoughItems.isModLoaded(); + + public BlockMetal(String aName, Materials[] aMats, OrePrefixes aPrefix, IIconContainer[] aBlockIcons) { + super(ItemStorage.class, aName, Material.iron); + mMats = aMats; + mPrefix = aPrefix; + mBlockIcons = aBlockIcons; + mHideBlocks = mNEIisLoaded; + + for (int i = 0; i < aMats.length; i++) { + if (aMats[i].mMetaItemSubID > 0 && aMats[i].mHasParentMod) { + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + "." + i + ".name", + "Block of " + (GTLanguageManager.i18nPlaceholder ? "%material" : aMats[i].mDefaultLocalName)); + GTOreDictUnificator.registerOre(aPrefix, aMats[i], new ItemStack(this, 1, i)); + } + } + if (aMats.length < 16 && mNEIisLoaded) { + for (int i = aMats.length; i < 16; i++) codechicken.nei.api.API.hideItem(new ItemStack(this, 1, i)); + } + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16) && aMeta < mMats.length) { + return mBlockIcons[aMeta].getIcon(); + } + return null; + } + + @Override + public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { + if (GregTechAPI.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) { + if (GregTechAPI.isMachineBlock(this, aMetaData)) { + GregTechAPI.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + +} diff --git a/src/main/java/gregtech/common/blocks/BlockOres.java b/src/main/java/gregtech/common/blocks/BlockOres.java new file mode 100644 index 0000000000..f2ae18f195 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockOres.java @@ -0,0 +1,154 @@ +package gregtech.common.blocks; + +import static gregtech.api.enums.Textures.BlockIcons.BASALT_STONE; +import static gregtech.api.enums.Textures.BlockIcons.GRANITE_BLACK_STONE; +import static gregtech.api.enums.Textures.BlockIcons.GRANITE_RED_STONE; +import static gregtech.api.enums.Textures.BlockIcons.MARBLE_STONE; + +import java.util.Arrays; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.render.TextureFactory; + +public class BlockOres extends BlockOresAbstract { + + private static final String UNLOCALIZED_NAME = "gt.blockores"; + + public BlockOres() { + super(UNLOCALIZED_NAME, 7, false, Material.rock); + } + + @Override + public String getUnlocalizedName() { + return UNLOCALIZED_NAME; + } + + @Override + public OrePrefixes[] getProcessingPrefix() { // Must have 8 entries; an entry can be null to disable automatic + // recipes. + return new OrePrefixes[] { OrePrefixes.ore, OrePrefixes.oreNetherrack, OrePrefixes.oreEndstone, + OrePrefixes.oreBlackgranite, OrePrefixes.oreRedgranite, OrePrefixes.oreMarble, OrePrefixes.oreBasalt, + null }; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int meta) { + int index = ((meta / 1000) % 16); + return switch (index) { + case 1 -> Blocks.netherrack.getIcon(ordinalSide, 0); + case 2 -> Blocks.end_stone.getIcon(ordinalSide, 0); + case 3 -> GRANITE_BLACK_STONE.getIcon(); + case 4 -> GRANITE_RED_STONE.getIcon(); + case 5 -> MARBLE_STONE.getIcon(); + case 6 -> BASALT_STONE.getIcon(); + default -> Blocks.stone.getIcon(ordinalSide, 0); + }; + } + + /** + * @inheritDoc + */ + @Override + public boolean isFireSource(World world, int x, int y, int z, ForgeDirection side) { + return (side == ForgeDirection.UP && getDamageValue(world, x, y, z) / 1000 % 16 == 1); + } + + /** + * @inheritDoc + */ + @Override + public MapColor getMapColor(int meta) { + return meta == 1 ? MapColor.netherrackColor : MapColor.stoneColor; + } + + @Override + public int getBaseBlockHarvestLevel(int aMeta) { + return switch (aMeta) { + case 3, 4 -> 3; + default -> 0; + }; + } + + @Override + public Block getDroppedBlock() { + return GregTechAPI.sBlockOres1; + } + + @Override + public Materials[] getDroppedDusts() { // Must have 8 entries; can be null. + return new Materials[] { Materials.Stone, Materials.Netherrack, Materials.Endstone, Materials.GraniteBlack, + Materials.GraniteRed, Materials.Marble, Materials.Basalt, Materials.Stone }; + } + + @Override + public boolean[] getEnabledMetas() { + return new boolean[] { true, true, true, GTMod.gregtechproxy.enableBlackGraniteOres, + GTMod.gregtechproxy.enableRedGraniteOres, GTMod.gregtechproxy.enableMarbleOres, + GTMod.gregtechproxy.enableBasaltOres, true }; + } + + @Override + public ITexture[] getTextureSet() { + final ITexture[] rTextures = new ITexture[16]; // Must have 16 entries. + Arrays.fill(rTextures, TextureFactory.of(Blocks.stone)); + rTextures[1] = TextureFactory.of(Blocks.netherrack); + rTextures[2] = TextureFactory.of(Blocks.end_stone); + rTextures[3] = TextureFactory.builder() + .addIcon(GRANITE_BLACK_STONE) + .stdOrient() + .build(); + rTextures[4] = TextureFactory.builder() + .addIcon(GRANITE_RED_STONE) + .stdOrient() + .build(); + rTextures[5] = TextureFactory.builder() + .addIcon(MARBLE_STONE) + .stdOrient() + .build(); + rTextures[6] = TextureFactory.builder() + .addIcon(BASALT_STONE) + .stdOrient() + .build(); + return rTextures; + } + + @Override + public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta) { + + if (EnchantmentHelper.getSilkTouchModifier(player)) { + TileEntityOres.shouldSilkTouch = true; + super.harvestBlock(worldIn, player, x, y, z, meta); + + if (TileEntityOres.shouldSilkTouch) { + TileEntityOres.shouldSilkTouch = false; + } + return; + } + + if (!(player instanceof FakePlayer)) { + TileEntityOres.shouldFortune = true; + } + super.harvestBlock(worldIn, player, x, y, z, meta); + if (TileEntityOres.shouldFortune) { + TileEntityOres.shouldFortune = false; + } + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockOresAbstract.java b/src/main/java/gregtech/common/blocks/BlockOresAbstract.java new file mode 100644 index 0000000000..f147c1c41d --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockOresAbstract.java @@ -0,0 +1,324 @@ +package gregtech.common.blocks; + +import static gregtech.api.enums.Mods.NotEnoughItems; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.block.material.Material; +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.items.GTGenericBlock; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.render.GTRendererBlock; + +public abstract class BlockOresAbstract extends GTGenericBlock implements ITileEntityProvider { + + private static final String DOT_NAME = ".name"; + private static final String DOT_TOOLTIP = ".tooltip"; + public static ThreadLocal mTemporaryTileEntity = new ThreadLocal<>(); + public static boolean FUCKING_LOCK = false; + public static boolean tHideOres; + public static Set aBlockedOres = new HashSet<>(); + + protected BlockOresAbstract(String aUnlocalizedName, int aOreMetaCount, boolean aHideFirstMeta, + Material aMaterial) { + super(ItemOres.class, aUnlocalizedName, aMaterial); + this.isBlockContainer = true; + setStepSound(soundTypeStone); + setCreativeTab(GregTechAPI.TAB_GREGTECH_ORES); + tHideOres = NotEnoughItems.isModLoaded() && GTMod.gregtechproxy.mHideUnusedOres; + if (aOreMetaCount > 8 || aOreMetaCount < 0) aOreMetaCount = 8; + + for (int i = 0; i < 16; i++) { + GTModHandler.addValuableOre(this, i, 1); + } + for (int i = 1; i < GregTechAPI.sGeneratedMaterials.length; i++) { + if (GregTechAPI.sGeneratedMaterials[i] != null) { + for (int j = 0; j < aOreMetaCount; j++) { + if (!this.getEnabledMetas()[j]) continue; + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + "." + (i + (j * 1000)) + DOT_NAME, + GTLanguageManager.i18nPlaceholder ? getLocalizedNameFormat(GregTechAPI.sGeneratedMaterials[i]) + : getLocalizedName(GregTechAPI.sGeneratedMaterials[i])); + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + "." + (i + (j * 1000)) + DOT_TOOLTIP, + GregTechAPI.sGeneratedMaterials[i].getToolTip()); + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + "." + ((i + 16000) + (j * 1000)) + DOT_NAME, + "Small " + (GTLanguageManager.i18nPlaceholder + ? getLocalizedNameFormat(GregTechAPI.sGeneratedMaterials[i]) + : getLocalizedName(GregTechAPI.sGeneratedMaterials[i]))); + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + "." + ((i + 16000) + (j * 1000)) + DOT_TOOLTIP, + GregTechAPI.sGeneratedMaterials[i].getToolTip()); + if ((GregTechAPI.sGeneratedMaterials[i].mTypes & 0x8) != 0 + && !aBlockedOres.contains(GregTechAPI.sGeneratedMaterials[i])) { + GTOreDictUnificator.registerOre( + this.getProcessingPrefix()[j] != null + ? this.getProcessingPrefix()[j].get(GregTechAPI.sGeneratedMaterials[i]) + : "", + new ItemStack(this, 1, i + (j * 1000))); + if (tHideOres) { + if (!(j == 0 && !aHideFirstMeta)) { + codechicken.nei.api.API.hideItem(new ItemStack(this, 1, i + (j * 1000))); + } + codechicken.nei.api.API.hideItem(new ItemStack(this, 1, (i + 16000) + (j * 1000))); + } + } + } + } + } + } + + public int getBaseBlockHarvestLevel(int aMeta) { + return 0; + } + + @Override + public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) { + if (!FUCKING_LOCK) { + FUCKING_LOCK = true; + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof TileEntityOres)) { + ((TileEntityOres) tTileEntity).onUpdated(); + } + } + FUCKING_LOCK = false; + } + + @Override + public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) { + if (!FUCKING_LOCK) { + FUCKING_LOCK = true; + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof TileEntityOres)) { + ((TileEntityOres) tTileEntity).onUpdated(); + } + } + FUCKING_LOCK = false; + } + + public String getLocalizedNameFormat(Materials aMaterial) { + return switch (aMaterial.mName) { + case "InfusedAir", "InfusedDull", "InfusedEarth", "InfusedEntropy", "InfusedFire", "InfusedOrder", "InfusedVis", "InfusedWater" -> "%material Infused Stone"; + case "Vermiculite", "Bentonite", "Kaolinite", "Talc", "BasalticMineralSand", "GraniticMineralSand", "GlauconiteSand", "CassiteriteSand", "GarnetSand", "QuartzSand", "Pitchblende", "FullersEarth" -> "%material"; + default -> "%material" + OrePrefixes.ore.mLocalizedMaterialPost; + }; + } + + public String getLocalizedName(Materials aMaterial) { + return aMaterial.getDefaultLocalizedNameForItem(getLocalizedNameFormat(aMaterial)); + } + + @Override + public boolean onBlockActivated(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer, int ordinalSide, + float aOffsetX, float aOffsetY, float aOffsetZ) { + if (!aPlayer.isSneaking() || !aPlayer.capabilities.isCreativeMode) { + return false; + } + + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (!(tTileEntity instanceof TileEntityOres)) { + return false; + } + + boolean tNatural = (((TileEntityOres) tTileEntity).mNatural = !((TileEntityOres) tTileEntity).mNatural); + GTUtility.sendChatToPlayer(aPlayer, "Ore \"mNatural\" flag set to: " + tNatural); + return true; + } + + @Override + public boolean onBlockEventReceived(World p_149696_1_, int p_149696_2_, int p_149696_3_, int p_149696_4_, + int p_149696_5_, int p_149696_6_) { + super.onBlockEventReceived(p_149696_1_, p_149696_2_, p_149696_3_, p_149696_4_, p_149696_5_, p_149696_6_); + TileEntity tileentity = p_149696_1_.getTileEntity(p_149696_2_, p_149696_3_, p_149696_4_); + return tileentity != null && tileentity.receiveClientEvent(p_149696_5_, p_149696_6_); + } + + @Override + public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { + return (!(entity instanceof EntityDragon)) && (super.canEntityDestroy(world, x, y, z, entity)); + } + + @Override + public String getHarvestTool(int aMeta) { + return aMeta < 8 ? "pickaxe" : "shovel"; + } + + @Override + public int getHarvestLevel(int aMeta) { + return aMeta == 5 || aMeta == 6 ? 2 : aMeta % 8; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return 1.0F + getHarvestLevel(aWorld.getBlockMetadata(aX, aY, aZ)) * 1.0F; + } + + @Override + public float getExplosionResistance(Entity entity, World aWorld, int aX, int aY, int aZ, double explosionX, + double explosionY, double explosionZ) { + return 1.0F + getHarvestLevel(aWorld.getBlockMetadata(aX, aY, aZ)) * 1.0F; + } + + @Override + protected boolean canSilkHarvest() { + return false; + } + + @Override + public abstract String getUnlocalizedName(); + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(getUnlocalizedName() + DOT_NAME); + } + + @Override + public int getRenderType() { + if (GTRendererBlock.INSTANCE == null) { + return super.getRenderType(); + } + return GTRendererBlock.INSTANCE.mRenderID; + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return true; + } + + @Override + public boolean hasTileEntity(int aMeta) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World aWorld, int aMeta) { + return createTileEntity(aWorld, aMeta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) { + return Blocks.stone.getIcon(0, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return Blocks.stone.getIcon(0, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister aIconRegister) {} + + @Override + @SideOnly(Side.CLIENT) + public boolean addHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer) { + GTRendererBlock + .addHitEffects(effectRenderer, this, worldObj, target.blockX, target.blockY, target.blockZ, target.sideHit); + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean addDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { + GTRendererBlock.addDestroyEffects(effectRenderer, this, world, x, y, z); + return true; + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (((tTileEntity instanceof TileEntityOres))) { + return ((TileEntityOres) tTileEntity).getMetaData(); + } + return 0; + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) { + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof TileEntityOres)) { + mTemporaryTileEntity.set((TileEntityOres) tTileEntity); + } + super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata); + aWorld.removeTileEntity(aX, aY, aZ); + } + + public abstract OrePrefixes[] getProcessingPrefix(); // Must have 8 entries; an entry can be null to disable + // automatic recipes. + + public abstract boolean[] getEnabledMetas(); // Must have 8 entries. + + public abstract Block getDroppedBlock(); + + public abstract Materials[] getDroppedDusts(); // Must have 8 entries; can be null. + + @Override + public ArrayList getDrops(World aWorld, int aX, int aY, int aZ, int aMeta, int aFortune) { + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof TileEntityOres)) { + return ((TileEntityOres) tTileEntity).getDrops(getDroppedBlock(), aFortune); + } + return mTemporaryTileEntity.get() == null ? new ArrayList<>() + : mTemporaryTileEntity.get() + .getDrops(getDroppedBlock(), aFortune); + } + + @Override + public TileEntity createTileEntity(World aWorld, int aMeta) { + return new TileEntityOres(); + } + + public abstract ITexture[] getTextureSet(); // Must have 16 entries. + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item aItem, CreativeTabs aTab, List aList) { + for (int i = 0; i < GregTechAPI.sGeneratedMaterials.length; i++) { + Materials tMaterial = GregTechAPI.sGeneratedMaterials[i]; + if ((tMaterial != null) && ((tMaterial.mTypes & 0x8) != 0) && !aBlockedOres.contains(tMaterial)) { + for (int meta = i; meta < 23000 + i; meta += 1000) { + if (!(new ItemStack(aItem, 1, meta).getDisplayName() + .contains(DOT_NAME))) aList.add(new ItemStack(aItem, 1, meta)); + } + } + } + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockReinforced.java b/src/main/java/gregtech/common/blocks/BlockReinforced.java new file mode 100644 index 0000000000..034d18e62e --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockReinforced.java @@ -0,0 +1,409 @@ +package gregtech.common.blocks; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.items.GTGenericBlock; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.WorldSpawnedEventBuilder; + +public class BlockReinforced extends GTGenericBlock { + + public BlockReinforced(String aName) { + super(ItemStorage.class, aName, new MaterialReinforced()); + for (int i = 0; i < 16; i++) { + Textures.BlockIcons.casingTexturePages[1][i + 80] = TextureFactory.of(this, i); + } + setStepSound(soundTypeStone); + setCreativeTab(GregTechAPI.TAB_GREGTECH); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Bronzeplate Reinforced Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Iridium Reinforced Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Plascrete Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Tungstensteel Reinforced Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Brittle Charcoal"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Powderbarrel"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Solid Super Fuel"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Magic Solid Super Fuel"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Steel Reinforced Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Titanium Reinforced Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Naquadah Reinforced Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Neutronium Reinforced Block"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Raw Deep Dark Portal Block"); + ItemList.Block_BronzePlate.set( + new ItemStack( + this.setHardness(60.0f) + .setResistance(150.0f), + 1, + 0)); + ItemList.Block_IridiumTungstensteel.set( + new ItemStack( + this.setHardness(400.0f) + .setResistance(600.0f), + 1, + 1)); + ItemList.Block_Plascrete.set( + new ItemStack( + this.setHardness(5.0f) + .setResistance(6.0f), + 1, + 2)); + ItemList.Block_TungstenSteelReinforced.set( + new ItemStack( + this.setHardness(250.0f) + .setResistance(400.0f), + 1, + 3)); + ItemList.Block_BrittleCharcoal.set( + new ItemStack( + this.setHardness(0.5f) + .setResistance(8.0f), + 1, + 4)); + ItemList.Block_Powderbarrel.set( + new ItemStack( + this.setHardness(2.5f) + .setResistance(2.0f), + 1, + 5)); + ItemList.Block_SSFUEL.set( + new ItemStack( + this.setHardness(2.5f) + .setResistance(2.0f), + 1, + 6)); + ItemList.Block_MSSFUEL.set( + new ItemStack( + this.setHardness(2.5f) + .setResistance(2.0f), + 1, + 7)); + ItemList.Block_SteelPlate.set( + new ItemStack( + this.setHardness(150.0f) + .setResistance(200.0f), + 1, + 8)); + ItemList.Block_TitaniumPlate.set( + new ItemStack( + this.setHardness(200.0f) + .setResistance(300.0f), + 1, + 9)); + ItemList.Block_NaquadahPlate.set( + new ItemStack( + this.setHardness(500.0f) + .setResistance(1000.0f), + 1, + 10)); + ItemList.Block_NeutroniumPlate.set( + new ItemStack( + this.setHardness(750.0f) + .setResistance(2500.0f), + 1, + 11)); + ItemList.Block_BedrockiumCompressed.set( + new ItemStack( + this.setHardness(1500.0f) + .setResistance(5000.0f), + 1, + 12)); + GTModHandler.addShapelessCraftingRecipe( + new ItemStack(Items.coal, 1, 1), + new Object[] { ItemList.Block_BrittleCharcoal.get(1) }); + GTModHandler.addCraftingRecipe( + ItemList.Block_Powderbarrel.get(1L), + GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "WSW", "GGG", "WGW", 'W', OrePrefixes.plate.get(Materials.Wood), 'G', + new ItemStack(Items.gunpowder, 1), 'S', new ItemStack(Items.string, 1) }); + } + + @Override + public String getHarvestTool(int aMeta) { + if (aMeta == 5 || aMeta == 4 || aMeta == 6 || aMeta == 7) return "axe"; + if (aMeta == 2) return "wrench"; + return "pickaxe"; + } + + @Override + public int getHarvestLevel(int aMeta) { + if (aMeta == 4 || aMeta == 5 || aMeta == 6 || aMeta == 7) return 1; + if (aMeta == 2) return 2; + if (aMeta == 9 || aMeta == 3 || aMeta == 1) return 5; + if (aMeta == 10 || aMeta == 11) return 7; + return 4; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16)) { + switch (aMeta) { + case 0 -> { + return Textures.BlockIcons.BLOCK_BRONZEPREIN.getIcon(); + } + case 1 -> { + return Textures.BlockIcons.BLOCK_IRREIN.getIcon(); + } + case 2 -> { + return Textures.BlockIcons.BLOCK_PLASCRETE.getIcon(); + } + case 3 -> { + return Textures.BlockIcons.BLOCK_TSREIN.getIcon(); + } + case 4, 6, 7 -> { + return Blocks.coal_block.getIcon(0, 0); + } + case 5 -> { + return Textures.BlockIcons.COVER_WOOD_PLATE.getIcon(); + } + case 8 -> { + return Textures.BlockIcons.BLOCK_STEELPREIN.getIcon(); + } + case 9 -> { + return Textures.BlockIcons.BLOCK_TITANIUMPREIN.getIcon(); + } + case 10 -> { + return Textures.BlockIcons.BLOCK_NAQUADAHPREIN.getIcon(); + } + case 11 -> { + return Textures.BlockIcons.BLOCK_NEUTRONIUMPREIN.getIcon(); + } + case 12 -> { + return Textures.BlockIcons.BLOCK_DEEP_DARK_RAW.getIcon(); + } + } + } + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + if (aWorld == null) { + return 0.0F; + } + if (aWorld.isAirBlock(aX, aY, aZ)) { + return 0.0F; + } + int tMeta = aWorld.getBlockMetadata(aX, aY, aZ); + if (tMeta == 0) { + return 60.0F; + } + if (tMeta == 1) { + return 400.0F; + } + if (tMeta == 2) { + return 5.0F; + } + if (tMeta == 3) { + return 250.0F; + } + if (tMeta == 4 || tMeta == 5 || tMeta == 6 || tMeta == 7) { + return 0.5F; + } + if (tMeta == 8) { + return 150.0F; + } + if (tMeta == 9) { + return 200.0F; + } + if (tMeta == 10) { + return 500.0F; + } + if (tMeta == 11) { + return 750.0F; + } + return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ); + } + + @Override + public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, + double explosionY, double explosionZ) { + if (world == null) { + return 0.0F; + } + int tMeta = world.getBlockMetadata(x, y, z); + if (tMeta == 0) { + return 150.0F; + } + if (tMeta == 1) { + return 600.0F; + } + if (tMeta == 2) { + return 6.0F; + } + if (tMeta == 3) { + return 400.0F; + } + if (tMeta == 4 || tMeta == 6 || tMeta == 7) { + return 8.0F; + } + if (tMeta == 5) { + return 1.0F; + } + if (tMeta == 8) { + return 200.0F; + } + if (tMeta == 9) { + return 300.0F; + } + if (tMeta == 10) { + return 1000.0F; + } + if (tMeta == 11) { + return 2500.0F; + } + return super.getExplosionResistance(entity, world, x, y, z, explosionX, explosionY, explosionZ); + } + + @Override + public String getUnlocalizedName() { + return this.mUnlocalizedName; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return true; + } + + @Override + public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + public int damageDropped(int metadata) { + return metadata; + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ); + } + + @Override + public void dropBlockAsItemWithChance(World aWorld, int aX, int aY, int aZ, int aMetadata, float chance, + int aFortune) { + if (aMetadata == 4) { + this.dropBlockAsItem(aWorld, aX, aY, aZ, new ItemStack(Items.coal, XSTR_INSTANCE.nextInt(2) + 1, 1)); + } else { + super.dropBlockAsItemWithChance(aWorld, aX, aY, aZ, aMetadata, chance, aFortune); + } + } + + @SuppressWarnings("deprecation") + @Override + public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) { + if (!world.isRemote && world.getBlockMetadata(x, y, z) == 5) { + EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, x + 0.5F, y + 0.5F, z + 0.5F, player); + world.spawnEntityInWorld(entitytntprimed); + new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setPitch(1f) + .setVolume(1f) + .setIdentifier(SoundResource.GAME_TNT_PRIMED) + .setEntity(entitytntprimed) + .setWorld(world) + .run(); + world.setBlockToAir(x, y, z); + return false; + } + return super.removedByPlayer(world, player, x, y, z); + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) { + super.onBlockAdded(world, x, y, z); + if (world.isBlockIndirectlyGettingPowered(x, y, z) && world.getBlockMetadata(x, y, z) == 5) { + removedByPlayer(world, null, x, y, z); + } + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + if (world.isBlockIndirectlyGettingPowered(x, y, z) && world.getBlockMetadata(x, y, z) == 5) { + removedByPlayer(world, null, x, y, z); + } + } + + @Override + public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) { + if (!world.isRemote && world.getBlockMetadata(x, y, z) == 5) { + EntityTNTPrimed entitytntprimed = new EntityTNTPrimed( + world, + x + 0.5F, + y + 0.5F, + z + 0.5F, + explosion.getExplosivePlacedBy()); + entitytntprimed.fuse = (world.rand.nextInt(entitytntprimed.fuse / 4) + entitytntprimed.fuse / 8); + world.spawnEntityInWorld(entitytntprimed); + } + super.onBlockExploded(world, x, y, z, explosion); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int ordinalSide, + float xOffset, float yOffset, float zOffset) { + if ((player.getCurrentEquippedItem() != null) && (player.getCurrentEquippedItem() + .getItem() == Items.flint_and_steel) && world.getBlockMetadata(x, y, z) == 5) { + removedByPlayer(world, player, x, y, z); + + return true; + } + return super.onBlockActivated(world, x, y, z, player, ordinalSide, xOffset, yOffset, zOffset); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister aIconRegister) {} + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < 16; i++) { + ItemStack aStack = new ItemStack(aItem, 1, i); + if (!aStack.getDisplayName() + .contains(".name")) aList.add(aStack); + } + } + + @Override + public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { + return !(entity instanceof EntityWither); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockStones.java b/src/main/java/gregtech/common/blocks/BlockStones.java new file mode 100644 index 0000000000..895a103016 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockStones.java @@ -0,0 +1,62 @@ +package gregtech.common.blocks; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTOreDictUnificator; + +public class BlockStones extends BlockStonesAbstract { + + public BlockStones() { + super(ItemGranites.class, "gt.blockstones"); + setResistance(60.0F); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Marble"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Marble Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Marble Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Marble Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Marble Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Marble Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Marble"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Marble"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Basalt"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Basalt Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Basalt Cobblestone"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Basalt Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Basalt Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Basalt Bricks"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Basalt"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Basalt"); + for (int i = 0; i < 16; i++) { + GTOreDictUnificator + .registerOre(OrePrefixes.stone, i < 8 ? Materials.Marble : Materials.Basalt, new ItemStack(this, 1, i)); + GTOreDictUnificator + .registerOre(OrePrefixes.block, i < 8 ? Materials.Marble : Materials.Basalt, new ItemStack(this, 1, i)); + GTOreDictUnificator.registerOre( + (i < 8 ? Materials.Marble.mName.toLowerCase() : Materials.Basalt.mName.toLowerCase()), + new ItemStack(this, 1, i)); + } + } + + @Override + public int getHarvestLevel(int aMeta) { + return 2; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16)) { + return gregtech.api.enums.Textures.BlockIcons.STONES[aMeta].getIcon(); + } + return gregtech.api.enums.Textures.BlockIcons.STONES[0].getIcon(); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockStonesAbstract.java b/src/main/java/gregtech/common/blocks/BlockStonesAbstract.java new file mode 100644 index 0000000000..3d8c4e9feb --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockStonesAbstract.java @@ -0,0 +1,250 @@ +package gregtech.common.blocks; + +import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; +import static gregtech.api.recipe.RecipeMaps.hammerRecipes; +import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IOreRecipeRegistrator; +import gregtech.api.items.GTGenericBlock; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class BlockStonesAbstract extends GTGenericBlock implements IOreRecipeRegistrator { + + public BlockStonesAbstract(Class aItemClass, String aName) { + super(aItemClass, aName, Material.rock); + OrePrefixes.crafting.add(this); + setStepSound(soundTypeStone); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + + this.registerSmeltingRecipes(); + this.registerAssemblerRecipes(); + this.registerCraftingRecipes(); + this.registerForgeHammerRecipes(); + + } + + private void registerSmeltingRecipes() { + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 0), new ItemStack(this, 1, 7)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 1), new ItemStack(this, 1, 0)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 2), new ItemStack(this, 1, 0)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 3), new ItemStack(this, 1, 0)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 4), new ItemStack(this, 1, 0)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 5), new ItemStack(this, 1, 0)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 6), new ItemStack(this, 1, 0)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 7), new ItemStack(this, 1, 0)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 8), new ItemStack(this, 1, 15)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 9), new ItemStack(this, 1, 8)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 10), new ItemStack(this, 1, 8)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 11), new ItemStack(this, 1, 8)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 12), new ItemStack(this, 1, 8)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 13), new ItemStack(this, 1, 8)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 14), new ItemStack(this, 1, 8)); + GTModHandler.addSmeltingRecipe(new ItemStack(this, 1, 15), new ItemStack(this, 1, 8)); + + } + + private void registerAssemblerRecipes() { + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 0), GTUtility.getIntegratedCircuit(4)) + .itemOutputs(new ItemStack(this, 1, 3)) + .duration(2 * SECONDS + 10 * TICKS) + .eut(4) + .addTo(assemblerRecipes); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 8), GTUtility.getIntegratedCircuit(4)) + .itemOutputs(new ItemStack(this, 1, 11)) + .duration(2 * SECONDS + 10 * TICKS) + .eut(4) + .addTo(assemblerRecipes); + } + + private void registerCraftingRecipes() { + GTModHandler.addCraftingRecipe( + new ItemStack(this, 1, 6), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "f", "X", 'X', new ItemStack(this, 1, 7) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 1, 14), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "f", "X", 'X', new ItemStack(this, 1, 15) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 1, 4), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "h", "X", 'X', new ItemStack(this, 1, 3) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 1, 12), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "h", "X", 'X', new ItemStack(this, 1, 11) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 1, 1), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "h", "X", 'X', new ItemStack(this, 1, 0) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 1, 9), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "h", "X", 'X', new ItemStack(this, 1, 8) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 4, 3), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 0) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 4, 11), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 8) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 4, 3), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 7) }); + GTModHandler.addCraftingRecipe( + new ItemStack(this, 4, 11), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 15) }); + } + + private void registerForgeHammerRecipes() { + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 3)) + .itemOutputs(new ItemStack(this, 1, 4)) + .duration(16 * TICKS) + .eut(10) + .addTo(hammerRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 11)) + .itemOutputs(new ItemStack(this, 1, 12)) + .duration(16 * TICKS) + .eut(10) + .addTo(hammerRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 0)) + .itemOutputs(new ItemStack(this, 1, 1)) + .duration(16 * TICKS) + .eut(10) + .addTo(hammerRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 8)) + .itemOutputs(new ItemStack(this, 1, 9)) + .duration(16 * TICKS) + .eut(10) + .addTo(hammerRecipes); + } + + @Override + public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName, + ItemStack aStack) { + if (aOreDictName.equals(OreDictNames.craftingLensWhite.toString())) { + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 7), GTUtility.copyAmount(0, aStack)) + .itemOutputs(new ItemStack(this, 1, 6)) + .duration(2 * SECONDS + 10 * TICKS) + .eut(16) + .addTo(laserEngraverRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(this, 1, 15), GTUtility.copyAmount(0, aStack)) + .itemOutputs(new ItemStack(this, 1, 14)) + .duration(2 * SECONDS + 10 * TICKS) + .eut(16) + .addTo(laserEngraverRecipes); + + } + } + + @Override + public String getHarvestTool(int aMeta) { + return "pickaxe"; + } + + @Override + public int getHarvestLevel(int aMeta) { + return 1; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F; + } + + @Override + public String getUnlocalizedName() { + return this.mUnlocalizedName; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return true; + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if ((aMeta >= 0) && (aMeta < 16)) { + return gregtech.api.enums.Textures.BlockIcons.GRANITES[aMeta].getIcon(); + } + return null; + } + + @Override + public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { + return world.getBlockMetadata(x, y, z) % 8 < 3; + } + + @Override + public int damageDropped(int metadata) { + return metadata % 8 == 0 ? metadata + 1 : metadata; + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister aIconRegister) {} + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < 16; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockStorage.java b/src/main/java/gregtech/common/blocks/BlockStorage.java new file mode 100644 index 0000000000..1886d25d9b --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockStorage.java @@ -0,0 +1,103 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.items.GTGenericBlock; + +public class BlockStorage extends GTGenericBlock { + + protected BlockStorage(Class aItemClass, String aName, Material aMaterial) { + super(aItemClass, aName, aMaterial); + setStepSound(soundTypeMetal); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + } + + @Override + public String getHarvestTool(int aMeta) { + return "pickaxe"; + } + + @Override + public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) { + return true; + } + + @Override + public int getHarvestLevel(int aMeta) { + return 1; + } + + @Override + public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { + return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ); + } + + @Override + public float getExplosionResistance(Entity aTNT) { + return Blocks.iron_block.getExplosionResistance(aTNT); + } + + @Override + public String getUnlocalizedName() { + return this.mUnlocalizedName; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return true; + } + + @Override + public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public int damageDropped(int metadata) { + return metadata; + } + + @Override + public int getDamageValue(World aWorld, int aX, int aY, int aZ) { + return aWorld.getBlockMetadata(aX, aY, aZ); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister aIconRegister) {} + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { + for (int i = 0; i < 16; i++) { + if (!(new ItemStack(aItem, 1, i).getDisplayName() + .contains(".name"))) aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockTintedIndustrialGlass.java b/src/main/java/gregtech/common/blocks/BlockTintedIndustrialGlass.java new file mode 100644 index 0000000000..16a22e7c35 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockTintedIndustrialGlass.java @@ -0,0 +1,98 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Facing; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.oredict.OreDictionary; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.util.GTLanguageManager; + +public class BlockTintedIndustrialGlass extends BlockCasingsAbstract { + + public BlockTintedIndustrialGlass() { + super(ItemGlass1.class, "gt.blocktintedglass", Material.glass, 4); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Tinted Industrial Glass (White)"); + GTLanguageManager + .addStringLocalization(getUnlocalizedName() + ".1.name", "Tinted Industrial Glass (Light Gray)"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Tinted Industrial Glass (Gray)"); + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Tinted Industrial Glass (Black)"); + ItemList.GlassTintedIndustrialWhite.set(new ItemStack(this, 1, 0)); + ItemList.GlassTintedIndustrialLightGray.set(new ItemStack(this, 1, 1)); + ItemList.GlassTintedIndustrialGray.set(new ItemStack(this, 1, 2)); + ItemList.GlassTintedIndustrialBlack.set(new ItemStack(this, 1, 3)); + + // Register tinted industrial glass as EV-Tier glass + OreDictionary.registerOre("blockGlassEV", this); + + this.opaque = false; + } + + @Override + public int getTextureIndex(int aMeta) { + // Page 16, 32-47 + return (16 << 7) | (aMeta + 32); + } + + @Override + public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int ordinalSide, int aMeta) { + return switch (aMeta) { + case 0 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_WHITE.getIcon(); + case 1 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_LIGHT_GRAY.getIcon(); + case 2 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_GRAY.getIcon(); + case 3 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_BLACK.getIcon(); + default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); + }; + } + + /** + * 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 + */ + @SideOnly(Side.CLIENT) + @Override + public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { + Block block = worldIn.getBlock(x, y, z); + + if (worldIn.getBlockMetadata(x, y, z) != worldIn.getBlockMetadata( + x - Facing.offsetsXForSide[side], + y - Facing.offsetsYForSide[side], + z - Facing.offsetsZForSide[side])) { + return true; + } + + if (block == this) { + return false; + } + + return super.shouldSideBeRendered(worldIn, x, y, z, side); + } +} diff --git a/src/main/java/gregtech/common/blocks/BlockWormholeRender.java b/src/main/java/gregtech/common/blocks/BlockWormholeRender.java new file mode 100644 index 0000000000..7ae7615639 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockWormholeRender.java @@ -0,0 +1,75 @@ +package gregtech.common.blocks; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.common.tileentities.render.TileEntityWormhole; + +public class BlockWormholeRender extends Block { + + public BlockWormholeRender() { + super(Material.iron); + this.setResistance(20f); + this.setHardness(-1.0f); + // this.setCreativeTab(TecTech.creativeTabTecTech); + this.setBlockName("WormholeRenderer"); + this.setLightLevel(100.0f); + GameRegistry.registerBlock(this, getUnlocalizedName()); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT"); + } + + @Override + public String getUnlocalizedName() { + return "gt.wormholerenderer"; + } + + @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 TileEntityWormhole(); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) { + return new ArrayList<>(); + } + + @Override + public boolean isCollidable() { + return true; + } + +} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings1.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings1.java deleted file mode 100644 index 897011eba9..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings1.java +++ /dev/null @@ -1,108 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings1 extends GT_Block_Casings_Abstract { - - /** - * Texture Index Information Textures.BlockIcons.casingTexturePages[0][0-63] - Gregtech - * Textures.BlockIcons.casingTexturePages[0][64-127] - GT++ Textures.BlockIcons.casingTexturePages[1][0-127] - - * Gregtech Textures.BlockIcons.casingTexturePages[2][0-127] - Free Textures.BlockIcons.casingTexturePages[3][0-127] - * - Free Textures.BlockIcons.casingTexturePages[4][0-127] - Free Textures.BlockIcons.casingTexturePages[5][0-127] - - * Free Textures.BlockIcons.casingTexturePages[6][0-127] - Free Textures.BlockIcons.casingTexturePages[7][0-127] - - * TecTech Textures.BlockIcons.casingTexturePages[8][0-127] - TecTech - */ - public GT_Block_Casings1() { - super(GT_Item_Casings1.class, "gt.blockcasings", GT_Material_Casings.INSTANCE, 16); - - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "ULV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "LV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "MV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "HV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "EV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "IV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "LuV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "ZPM Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "UV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "UHV Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Bronze Plated Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Heat Proof Machine Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".12.name", "Dimensionally Transcendent Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Dimensional Injection Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Dimensional Bridge"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Superconducting Coil Block"); - ItemList.Casing_ULV.set(new ItemStack(this, 1, 0)); - ItemList.Casing_LV.set(new ItemStack(this, 1, 1)); - ItemList.Casing_MV.set(new ItemStack(this, 1, 2)); - ItemList.Casing_HV.set(new ItemStack(this, 1, 3)); - ItemList.Casing_EV.set(new ItemStack(this, 1, 4)); - ItemList.Casing_IV.set(new ItemStack(this, 1, 5)); - ItemList.Casing_LuV.set(new ItemStack(this, 1, 6)); - ItemList.Casing_ZPM.set(new ItemStack(this, 1, 7)); - ItemList.Casing_UV.set(new ItemStack(this, 1, 8)); - ItemList.Casing_MAX.set(new ItemStack(this, 1, 9)); - ItemList.Casing_BronzePlatedBricks.set(new ItemStack(this, 1, 10)); - ItemList.Casing_HeatProof.set(new ItemStack(this, 1, 11)); - ItemList.Casing_Dim_Trans.set(new ItemStack(this, 1, 12)); - ItemList.Casing_Dim_Injector.set(new ItemStack(this, 1, 13)); - ItemList.Casing_Dim_Bridge.set(new ItemStack(this, 1, 14)); - ItemList.Casing_Coil_Superconductor.set(new ItemStack(this, 1, 15)); - } - - @Override - public int getTextureIndex(int aMeta) { - return aMeta; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16)) { - switch (aMeta) { - case 10 -> { - return Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon(); - } - case 11 -> { - return Textures.BlockIcons.MACHINE_HEATPROOFCASING.getIcon(); - } - case 12 -> { - return Textures.BlockIcons.MACHINE_DIM_TRANS_CASING.getIcon(); - } - case 13 -> { - return Textures.BlockIcons.MACHINE_DIM_INJECTOR.getIcon(); - } - case 14 -> { - return Textures.BlockIcons.MACHINE_DIM_BRIDGE.getIcon(); - } - case 15 -> { - return Textures.BlockIcons.MACHINE_COIL_SUPERCONDUCTOR.getIcon(); - } - } - if (ordinalSide == 0) { - return Textures.BlockIcons.MACHINECASINGS_BOTTOM[aMeta].getIcon(); - } - if (ordinalSide == 1) { - return Textures.BlockIcons.MACHINECASINGS_TOP[aMeta].getIcon(); - } - return Textures.BlockIcons.MACHINECASINGS_SIDE[aMeta].getIcon(); - } - return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - } - - @Override - public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ) > 9 ? super.colorMultiplier(aWorld, aX, aY, aZ) - : gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8 - | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2]; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings10.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings10.java deleted file mode 100644 index 1a0902da97..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings10.java +++ /dev/null @@ -1,76 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings10 extends GT_Block_Casings_Abstract { - - public GT_Block_Casings10() { - super(GT_Item_Casings10.class, "gt.blockcasings10", GT_Material_Casings.INSTANCE, 16); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "MagTech Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Laser Containment Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Quark Exclusion Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Pressure Containment Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Electric Compressor Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Compression Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Neutronium Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Active Neutronium Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Neutronium Stabilization Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Coolant Duct"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Heating Duct"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".11.name", "Extreme Density Space-Bending Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".12.name", "Background Radiation Absorbent Casing"); - - ItemList.Casing_Electromagnetic_Separator.set(new ItemStack(this, 1, 0)); - ItemList.Casing_Laser.set(new ItemStack(this, 1, 1)); - ItemList.BlockQuarkContainmentCasing.set(new ItemStack(this, 1, 2)); - ItemList.Casing_Autoclave.set(new ItemStack(this, 1, 3)); - ItemList.Compressor_Casing.set(new ItemStack(this, 1, 4)); - ItemList.Compressor_Pipe_Casing.set(new ItemStack(this, 1, 5)); - ItemList.Neutronium_Casing.set(new ItemStack(this, 1, 6)); - ItemList.Neutronium_Active_Casing.set(new ItemStack(this, 1, 7)); - ItemList.Neutronium_Stable_Casing.set(new ItemStack(this, 1, 8)); - ItemList.Coolant_Duct_Casing.set(new ItemStack(this, 1, 9)); - ItemList.Heating_Duct_Casing.set(new ItemStack(this, 1, 10)); - ItemList.Extreme_Density_Casing.set(new ItemStack(this, 1, 11)); - ItemList.Background_Radiation_Casing.set(new ItemStack(this, 1, 12)); - } - - @Override - public int getTextureIndex(int aMeta) { - return (16 << 7) | (aMeta + 48); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.MACHINE_CASING_EMS.getIcon(); - case 1 -> Textures.BlockIcons.MACHINE_CASING_LASER.getIcon(); - case 2 -> Textures.BlockIcons.BLOCK_QUARK_CONTAINMENT_CASING.getIcon(); - case 3 -> Textures.BlockIcons.MACHINE_CASING_AUTOCLAVE.getIcon(); - case 4 -> Textures.BlockIcons.COMPRESSOR_CASING.getIcon(); - case 5 -> Textures.BlockIcons.COMPRESSOR_PIPE_CASING.getIcon(); - case 6 -> Textures.BlockIcons.NEUTRONIUM_CASING.getIcon(); - case 7 -> Textures.BlockIcons.NEUTRONIUM_ACTIVE_CASING.getIcon(); - case 8 -> Textures.BlockIcons.NEUTRONIUM_STABLE_CASING.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TUNGSTENSTEEL.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_CASING_PIPE_BRONZE.getIcon(); - case 11 -> Textures.BlockIcons.EXTREME_DENSITY_CASING.getIcon(); - case 12 -> Textures.BlockIcons.RADIATION_ABSORBENT_CASING.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); - }; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings11.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings11.java deleted file mode 100644 index b4ec07ab70..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings11.java +++ /dev/null @@ -1,58 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings11 extends GT_Block_Casings_Abstract { - - public GT_Block_Casings11() { - super(GT_Item_Casings11.class, "gt.blockcasings11", GT_Material_Casings.INSTANCE, 16); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Tin Item Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Brass Item Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Electrum Item Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Platinum Item Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Osmium Item Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Quantium Item Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Fluxed Electrum Item Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Black Plutonium Item Pipe Casing"); - - ItemList.Casing_Item_Pipe_Tin.set(new ItemStack(this, 1, 0)); - ItemList.Casing_Item_Pipe_Brass.set(new ItemStack(this, 1, 1)); - ItemList.Casing_Item_Pipe_Electrum.set(new ItemStack(this, 1, 2)); - ItemList.Casing_Item_Pipe_Platinum.set(new ItemStack(this, 1, 3)); - ItemList.Casing_Item_Pipe_Osmium.set(new ItemStack(this, 1, 4)); - ItemList.Casing_Item_Pipe_Quantium.set(new ItemStack(this, 1, 5)); - ItemList.Casing_Item_Pipe_Fluxed_Electrum.set(new ItemStack(this, 1, 6)); - ItemList.Casing_Item_Pipe_Black_Plutonium.set(new ItemStack(this, 1, 7)); - } - - @Override - public int getTextureIndex(int aMeta) { - return (16 << 7) | (aMeta + 64); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 1 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_BRASS.getIcon(); - case 2 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_ELECTRUM.getIcon(); - case 3 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_PLATINUM.getIcon(); - case 4 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_OSMIUM.getIcon(); - case 5 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_QUANTIUM.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_FLUXED_ELECTRUM.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_BLACK_PLUTONIUM.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_ITEM_PIPE_TIN.getIcon(); - }; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings2.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings2.java deleted file mode 100644 index f1fbc30236..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings2.java +++ /dev/null @@ -1,102 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings2 extends GT_Block_Casings_Abstract { - - public GT_Block_Casings2() { - super(GT_Item_Casings2.class, "gt.blockcasings2", GT_Material_Casings.INSTANCE, 96); - // Special handler for Pyrolyse Oven Casing on hatches... - Textures.BlockIcons.casingTexturePages[0][22] = TextureFactory.of( - Block.getBlockFromItem( - ItemList.Casing_ULV.get(1) - .getItem()), - 0, - ForgeDirection.UNKNOWN, - Dyes.MACHINE_METAL.mRGBa); - - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Solid Steel Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Frost Proof Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Bronze Gear Box Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Steel Gear Box Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Titanium Gear Box Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Assembling Line Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Processor Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Data Drive Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Containment Field Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Assembler Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Pump Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Motor Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Bronze Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Steel Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Titanium Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Tungstensteel Pipe Casing"); - ItemList.Casing_SolidSteel.set(new ItemStack(this, 1, 0)); - ItemList.Casing_FrostProof.set(new ItemStack(this, 1, 1)); - ItemList.Casing_Gearbox_Bronze.set(new ItemStack(this, 1, 2)); - ItemList.Casing_Gearbox_Steel.set(new ItemStack(this, 1, 3)); - ItemList.Casing_Gearbox_Titanium.set(new ItemStack(this, 1, 4)); - ItemList.Casing_Gearbox_TungstenSteel.set(new ItemStack(this, 1, 5)); - ItemList.Casing_Processor.set(new ItemStack(this, 1, 6)); - ItemList.Casing_DataDrive.set(new ItemStack(this, 1, 7)); - ItemList.Casing_ContainmentField.set(new ItemStack(this, 1, 8)); - ItemList.Casing_Assembler.set(new ItemStack(this, 1, 9)); - ItemList.Casing_Pump.set(new ItemStack(this, 1, 10)); - ItemList.Casing_Motor.set(new ItemStack(this, 1, 11)); - ItemList.Casing_Pipe_Bronze.set(new ItemStack(this, 1, 12)); - ItemList.Casing_Pipe_Steel.set(new ItemStack(this, 1, 13)); - ItemList.Casing_Pipe_Titanium.set(new ItemStack(this, 1, 14)); - ItemList.Casing_Pipe_TungstenSteel.set(new ItemStack(this, 1, 15)); - } - - @Override - public int getTextureIndex(int aMeta) { - return aMeta == 6 ? ((1 << 7) + 96) : aMeta + 16; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - case 1 -> Textures.BlockIcons.MACHINE_CASING_FROST_PROOF.getIcon(); - case 2 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_BRONZE.getIcon(); - case 3 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_STEEL.getIcon(); - case 4 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_TITANIUM.getIcon(); - case 5 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_CASING_PROCESSOR.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_CASING_DATA_DRIVE.getIcon(); - case 8 -> Textures.BlockIcons.MACHINE_CASING_CONTAINMENT_FIELD.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_CASING_ASSEMBLER.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_CASING_PUMP.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_CASING_MOTOR.getIcon(); - case 12 -> Textures.BlockIcons.MACHINE_CASING_PIPE_BRONZE.getIcon(); - case 13 -> Textures.BlockIcons.MACHINE_CASING_PIPE_STEEL.getIcon(); - case 14 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TITANIUM.getIcon(); - case 15 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TUNGSTENSTEEL.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - }; - } - - @Override - public float getExplosionResistance(Entity aTNT, World aWorld, int aX, int aY, int aZ, double eX, double eY, - double eZ) { - return aWorld.getBlockMetadata(aX, aY, aZ) == 8 ? Blocks.bedrock.getExplosionResistance(aTNT) - : super.getExplosionResistance(aTNT, aWorld, aX, aY, aZ, eX, eY, eZ); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings3.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings3.java deleted file mode 100644 index ada77814c8..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings3.java +++ /dev/null @@ -1,82 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings3 extends GT_Block_Casings_Abstract { - - public GT_Block_Casings3() { - super(GT_Item_Casings3.class, "gt.blockcasings3", GT_Material_Casings.INSTANCE, 16); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Yellow Stripes Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Yellow Stripes Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Radioactive Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Bio Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Explosion Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Fire Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Acid Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Magic Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Frost Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Noise Hazard Sign Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Grate Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Filter Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Radiation Proof Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Bronze Firebox Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Steel Firebox Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Tungstensteel Firebox Casing"); - ItemList.Casing_Stripes_A.set(new ItemStack(this, 1, 0)); - ItemList.Casing_Stripes_B.set(new ItemStack(this, 1, 1)); - ItemList.Casing_RadioactiveHazard.set(new ItemStack(this, 1, 2)); - ItemList.Casing_BioHazard.set(new ItemStack(this, 1, 3)); - ItemList.Casing_ExplosionHazard.set(new ItemStack(this, 1, 4)); - ItemList.Casing_FireHazard.set(new ItemStack(this, 1, 5)); - ItemList.Casing_AcidHazard.set(new ItemStack(this, 1, 6)); - ItemList.Casing_MagicHazard.set(new ItemStack(this, 1, 7)); - ItemList.Casing_FrostHazard.set(new ItemStack(this, 1, 8)); - ItemList.Casing_NoiseHazard.set(new ItemStack(this, 1, 9)); - ItemList.Casing_Grate.set(new ItemStack(this, 1, 10)); - ItemList.Casing_Vent.set(new ItemStack(this, 1, 11)); - ItemList.Casing_RadiationProof.set(new ItemStack(this, 1, 12)); - ItemList.Casing_Firebox_Bronze.set(new ItemStack(this, 1, 13)); - ItemList.Casing_Firebox_Steel.set(new ItemStack(this, 1, 14)); - ItemList.Casing_Firebox_TungstenSteel.set(new ItemStack(this, 1, 15)); - } - - @Override - public int getTextureIndex(int aMeta) { - return aMeta + 32; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.MACHINE_CASING_STRIPES_A.getIcon(); - case 1 -> Textures.BlockIcons.MACHINE_CASING_STRIPES_B.getIcon(); - case 2 -> Textures.BlockIcons.MACHINE_CASING_RADIOACTIVEHAZARD.getIcon(); - case 3 -> Textures.BlockIcons.MACHINE_CASING_BIOHAZARD.getIcon(); - case 4 -> Textures.BlockIcons.MACHINE_CASING_EXPLOSIONHAZARD.getIcon(); - case 5 -> Textures.BlockIcons.MACHINE_CASING_FIREHAZARD.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_CASING_MAGICHAZARD.getIcon(); - case 8 -> Textures.BlockIcons.MACHINE_CASING_FROSTHAZARD.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_CASING_NOISEHAZARD.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_CASING_GRATE.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_CASING_VENT.getIcon(); - case 12 -> Textures.BlockIcons.MACHINE_CASING_RADIATIONPROOF.getIcon(); - case 13 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_BRONZE.getIcon() - : Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon(); - case 14 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_STEEL.getIcon() - : Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - case 15 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_TUNGSTENSTEEL.getIcon() - : Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - }; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java deleted file mode 100644 index 77f36a4523..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java +++ /dev/null @@ -1,239 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_RenderingWorld; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings4 extends GT_Block_Casings_Abstract { - - /** - * This mapping is used to look up which texture should be used to render the connected texture for fusion casings. - *

- * This mapping is computed from that giant if ladder from #getIcon in commit - * da3421547afadc49938b5b6a7f9a9679afa1d570 The exact meaning of these numbers are like black magic. Read the - * original getIcon implementation to understand why it is 0, 1, etc, if that if ladder is even intelligible. - */ - private static final int[][] mapping = new int[][] { - { 7, 7, 7, 7, 0, 7, 0, 7, 1, 7, 1, 7, 8, 7, 8, 7, 0, 7, 0, 7, 0, 7, 0, 7, 9, 7, 9, 7, 3, 7, 3, 7, 1, 7, 1, 7, - 11, 7, 11, 7, 1, 7, 1, 7, 2, 7, 2, 7, 10, 7, 10, 7, 5, 7, 5, 7, 4, 7, 4, 7, 6, 7, 6, 7 }, - { 7, 7, 7, 7, 0, 0, 7, 7, 1, 1, 7, 7, 8, 8, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 9, 9, 7, 7, 3, 3, 7, 7, 1, 1, 7, 7, - 11, 11, 7, 7, 1, 1, 7, 7, 2, 2, 7, 7, 10, 10, 7, 7, 5, 5, 7, 7, 4, 4, 7, 7, 6, 6, 7, 7 }, - { 7, 1, 1, 1, 0, 9, 10, 4, 7, 1, 1, 1, 0, 9, 10, 4, 0, 8, 11, 2, 0, 3, 5, 6, 0, 8, 11, 2, 0, 3, 5, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, - { 7, 1, 1, 1, 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, - 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7 }, - { 7, 1, 1, 1, 7, 1, 1, 1, 0, 8, 11, 2, 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, - 0, 9, 10, 4, 0, 3, 5, 6, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, - { 7, 1, 1, 1, 7, 7, 7, 7, 0, 9, 10, 4, 7, 7, 7, 7, 7, 1, 1, 1, 7, 7, 7, 7, 0, 9, 10, 4, 7, 7, 7, 7, 0, 8, 11, 2, - 7, 7, 7, 7, 0, 3, 5, 6, 7, 7, 7, 7, 0, 8, 11, 2, 7, 7, 7, 7, 0, 3, 5, 6, 7, 7, 7, 7 }, }; - - public static boolean mConnectedMachineTextures = true; - - public GT_Block_Casings4() { - super(GT_Item_Casings4.class, "gt.blockcasings4", GT_Material_Casings.INSTANCE, 16); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".0.name", "Robust Tungstensteel Machine Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".1.name", "Clean Stainless Steel Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Stable Titanium Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Titanium Firebox Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Fusion Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Fusion Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Fusion Machine Casing MK II"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Turbine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Stainless Steel Turbine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Titanium Turbine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Tungstensteel Turbine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Engine Intake Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Mining Osmiridium Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Firebricks"); - - ItemList.Casing_RobustTungstenSteel.set(new ItemStack(this, 1, 0)); - ItemList.Casing_CleanStainlessSteel.set(new ItemStack(this, 1, 1)); - ItemList.Casing_StableTitanium.set(new ItemStack(this, 1, 2)); - ItemList.Casing_Firebox_Titanium.set(new ItemStack(this, 1, 3)); - ItemList.Casing_Fusion.set(new ItemStack(this, 1, 6)); - ItemList.Casing_Fusion_Coil.set(new ItemStack(this, 1, 7)); - ItemList.Casing_Fusion2.set(new ItemStack(this, 1, 8)); - ItemList.Casing_Turbine.set(new ItemStack(this, 1, 9)); - ItemList.Casing_Turbine1.set(new ItemStack(this, 1, 10)); - ItemList.Casing_Turbine2.set(new ItemStack(this, 1, 11)); - ItemList.Casing_Turbine3.set(new ItemStack(this, 1, 12)); - ItemList.Casing_EngineIntake.set(new ItemStack(this, 1, 13)); - ItemList.Casing_MiningOsmiridium.set(new ItemStack(this, 1, 14)); - ItemList.Casing_Firebricks.set(new ItemStack(this, 1, 15)); - - GT_Mod.gregtechproxy.mCTMBlockCache.put(this, (byte) 6, true); - GT_Mod.gregtechproxy.mCTMBlockCache.put(this, (byte) 8, true); - } - - @Override - public int getTextureIndex(int aMeta) { - return aMeta + 48; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); - case 1 -> Textures.BlockIcons.MACHINE_CASING_CLEAN_STAINLESSSTEEL.getIcon(); - case 2 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon(); - case 3 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_TITANIUM.getIcon() - : Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon(); - case 4 -> - // Do not overwrite! - Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW.getIcon(); - case 5 -> - // Do not overwrite! - Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_CASING_FUSION.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_CASING_FUSION_COIL.getIcon(); - case 8 -> Textures.BlockIcons.MACHINE_CASING_FUSION_2.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_CASING_TURBINE.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_STAINLESSSTEEL.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TITANIUM.getIcon(); - case 12 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TUNGSTENSTEEL.getIcon(); - case 13 -> Textures.BlockIcons.MACHINE_CASING_ENGINE_INTAKE.getIcon(); - case 14 -> Textures.BlockIcons.MACHINE_CASING_MINING_OSMIRIDIUM.getIcon(); - case 15 -> Textures.BlockIcons.MACHINE_CASING_DENSEBRICKS.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - }; - } - - @Deprecated - public IIcon getTurbineCasing(int meta, int iconIndex, boolean active, boolean hasTurbine) { - return switch (meta) { - case 10 -> active ? Textures.BlockIcons.TURBINE_ACTIVE1[iconIndex].getIcon() - : hasTurbine ? Textures.BlockIcons.TURBINE1[iconIndex].getIcon() - : Textures.BlockIcons.TURBINE_EMPTY1[iconIndex].getIcon(); - case 11 -> active ? Textures.BlockIcons.TURBINE_ACTIVE2[iconIndex].getIcon() - : hasTurbine ? Textures.BlockIcons.TURBINE2[iconIndex].getIcon() - : Textures.BlockIcons.TURBINE_EMPTY2[iconIndex].getIcon(); - case 12 -> active ? Textures.BlockIcons.TURBINE_ACTIVE3[iconIndex].getIcon() - : hasTurbine ? Textures.BlockIcons.TURBINE3[iconIndex].getIcon() - : Textures.BlockIcons.TURBINE_EMPTY3[iconIndex].getIcon(); - default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon() - : hasTurbine ? Textures.BlockIcons.TURBINE[iconIndex].getIcon() - : Textures.BlockIcons.TURBINE_EMPTY[iconIndex].getIcon(); - }; - } - - private static int isTurbineControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0; - if (tTile.getMetaTileEntity() instanceof GT_MetaTileEntity_LargeTurbine turbine && tTile.getFrontFacing() - .ordinal() == ordinalSide) { - if (turbine.isNewStyleRendering()) return 0; - if (tTile.isActive()) return 1; - return turbine.hasTurbine() ? 2 : 3; - } - return 0; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { - aWorld = GT_RenderingWorld.getInstance(aWorld); - int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); - if (tMeta != 6 && tMeta != 8 && tMeta != 9 && tMeta != 10 && tMeta != 11 && tMeta != 12 - || !mConnectedMachineTextures) { - return getIcon(ordinalSide, tMeta); - } - // noinspection ConstantValue // tMeta < 13 should stay because mConnectedMachineTextures can be changed - if (tMeta > 8 && tMeta < 13) { - int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1; - switch (ordinalSide / 2) { - case 0 -> { - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - if (i == 0 && j == 0) continue; - int tState; - if ((tState = isTurbineControllerWithSide( - aWorld, - xCoord + j, - yCoord, - zCoord + i, - ordinalSide)) != 0) { - return getTurbineCasing(tMeta, 4 - i * 3 - j, tState == 1, tState == 2); - } - } - } - } - case 1 -> { - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - if (i == 0 && j == 0) continue; - int tState; - if ((tState = isTurbineControllerWithSide( - aWorld, - xCoord + j, - yCoord + i, - zCoord, - ordinalSide)) != 0) { - return getTurbineCasing( - tMeta, - 4 + i * 3 - j * tInvertLeftRightMod, - tState == 1, - tState == 2); - } - } - } - } - case 2 -> { - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - if (i == 0 && j == 0) continue; - int tState; - if ((tState = isTurbineControllerWithSide( - aWorld, - xCoord, - yCoord + i, - zCoord + j, - ordinalSide)) != 0) { - return getTurbineCasing( - tMeta, - 4 + i * 3 + j * tInvertLeftRightMod, - tState == 1, - tState == 2); - } - } - } - } - } - return switch (tMeta) { - case 10 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_STAINLESSSTEEL.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TITANIUM.getIcon(); - case 12 -> Textures.BlockIcons.MACHINE_CASING_TURBINE_TUNGSTENSTEEL.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - }; - } - int tStartIndex = tMeta == 6 ? 1 : 13; - int tIndexIntoMapping = 0; - if (isSameBlock(aWorld, xCoord, yCoord - 1, zCoord, tMeta)) tIndexIntoMapping |= 1; - if (isSameBlock(aWorld, xCoord, yCoord + 1, zCoord, tMeta)) tIndexIntoMapping |= 1 << 1; - if (isSameBlock(aWorld, xCoord + 1, yCoord, zCoord, tMeta)) tIndexIntoMapping |= 1 << 2; - if (isSameBlock(aWorld, xCoord, yCoord, zCoord + 1, tMeta)) tIndexIntoMapping |= 1 << 3; - if (isSameBlock(aWorld, xCoord - 1, yCoord, zCoord, tMeta)) tIndexIntoMapping |= 1 << 4; - if (isSameBlock(aWorld, xCoord, yCoord, zCoord - 1, tMeta)) tIndexIntoMapping |= 1 << 5; - return Textures.BlockIcons.CONNECTED_HULLS[tStartIndex + mapping[ordinalSide][tIndexIntoMapping]].getIcon(); - } - - private boolean isSameBlock(IBlockAccess aWorld, int aX, int aY, int aZ, int aMeta) { - return aWorld.getBlock(aX, aY, aZ) == this && aWorld.getBlockMetadata(aX, aY, aZ) == aMeta; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings5.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings5.java deleted file mode 100644 index 0cb1934dec..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings5.java +++ /dev/null @@ -1,161 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.enums.HeatingCoilLevel.EV; -import static gregtech.api.enums.HeatingCoilLevel.HV; -import static gregtech.api.enums.HeatingCoilLevel.IV; -import static gregtech.api.enums.HeatingCoilLevel.LV; -import static gregtech.api.enums.HeatingCoilLevel.LuV; -import static gregtech.api.enums.HeatingCoilLevel.MAX; -import static gregtech.api.enums.HeatingCoilLevel.MV; -import static gregtech.api.enums.HeatingCoilLevel.None; -import static gregtech.api.enums.HeatingCoilLevel.UEV; -import static gregtech.api.enums.HeatingCoilLevel.UHV; -import static gregtech.api.enums.HeatingCoilLevel.UIV; -import static gregtech.api.enums.HeatingCoilLevel.UMV; -import static gregtech.api.enums.HeatingCoilLevel.UV; -import static gregtech.api.enums.HeatingCoilLevel.UXV; -import static gregtech.api.enums.HeatingCoilLevel.ZPM; - -import java.util.function.Consumer; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IHeatingCoil; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings5 extends GT_Block_Casings_Abstract implements IHeatingCoil { - - public GT_Block_Casings5() { - super(GT_Item_Casings5.class, "gt.blockcasings5", GT_Material_Casings.INSTANCE, 16); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Cupronickel Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Kanthal Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Nichrome Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "TPV-Alloy Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "HSS-G Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Naquadah Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Naquadah Alloy Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Electrum Flux Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Awakened Draconium Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "HSS-S Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Trinium Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Infinity Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Hypogen Coil Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Eternal Coil Block"); - - ItemList.Casing_Coil_Cupronickel.set(new ItemStack(this, 1, 0)); - ItemList.Casing_Coil_Kanthal.set(new ItemStack(this, 1, 1)); - ItemList.Casing_Coil_Nichrome.set(new ItemStack(this, 1, 2)); - ItemList.Casing_Coil_TungstenSteel.set(new ItemStack(this, 1, 3)); - ItemList.Casing_Coil_HSSG.set(new ItemStack(this, 1, 4)); - ItemList.Casing_Coil_Naquadah.set(new ItemStack(this, 1, 5)); - ItemList.Casing_Coil_NaquadahAlloy.set(new ItemStack(this, 1, 6)); - ItemList.Casing_Coil_ElectrumFlux.set(new ItemStack(this, 1, 7)); - ItemList.Casing_Coil_AwakenedDraconium.set(new ItemStack(this, 1, 8)); - ItemList.Casing_Coil_HSSS.set(new ItemStack(this, 1, 9)); - ItemList.Casing_Coil_Trinium.set(new ItemStack(this, 1, 10)); - ItemList.Casing_Coil_Infinity.set(new ItemStack(this, 1, 11)); - ItemList.Casing_Coil_Hypogen.set(new ItemStack(this, 1, 12)); - ItemList.Casing_Coil_Eternal.set(new ItemStack(this, 1, 13)); - ItemList.Casing_Shielded_Accelerator.set(new ItemStack(this, 1, 14)); - } - - @Override - public int getTextureIndex(int aMeta) { - return (1 << 7) | aMeta; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.MACHINE_COIL_CUPRONICKEL.getIcon(); - case 1 -> Textures.BlockIcons.MACHINE_COIL_KANTHAL.getIcon(); - case 2 -> Textures.BlockIcons.MACHINE_COIL_NICHROME.getIcon(); - case 3 -> Textures.BlockIcons.MACHINE_COIL_TUNGSTENSTEEL.getIcon(); - case 4 -> Textures.BlockIcons.MACHINE_COIL_HSSG.getIcon(); - case 5 -> Textures.BlockIcons.MACHINE_COIL_NAQUADAH.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_COIL_NAQUADAHALLOY.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_COIL_ELECTRUMFLUX.getIcon(); - case 8 -> Textures.BlockIcons.MACHINE_COIL_AWAKENEDDRACONIUM.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_COIL_HSSS.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_COIL_TRINIUM.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_COIL_INFINITY.getIcon(); - case 12 -> Textures.BlockIcons.MACHINE_COIL_HYPOGEN.getIcon(); - case 13 -> Textures.BlockIcons.MACHINE_COIL_ETERNAL.getIcon(); - case 14 -> Textures.BlockIcons.MACHINE_CASING_SHIELDED_ACCELERATOR.getIcon(); - default -> Textures.BlockIcons.MACHINE_COIL_CUPRONICKEL.getIcon(); - }; - } - - /*--------------- COIL CHECK IMPL. ------------*/ - - public static HeatingCoilLevel getCoilHeatFromDamage(int meta) { - return switch (meta) { - case 0 -> LV; - case 1 -> MV; - case 2 -> HV; - case 3 -> EV; - case 4 -> IV; - case 5 -> ZPM; - case 6 -> UV; - case 7 -> UEV; - case 8 -> UIV; - case 9 -> LuV; - case 10 -> UHV; - case 11 -> UMV; - case 12 -> UXV; - case 13 -> MAX; - default -> None; - }; - } - - public static int getMetaFromCoilHeat(HeatingCoilLevel level) { - return switch (level) { - case LV -> 0; - case MV -> 1; - case HV -> 2; - case EV -> 3; - case IV -> 4; - case ZPM -> 5; - case UV -> 6; - case UEV -> 7; - case UIV -> 8; - case LuV -> 9; - case UHV -> 10; - case UMV -> 11; - case UXV -> 12; - case MAX -> 13; - default -> 0; - }; - } - - @Override - public HeatingCoilLevel getCoilHeat(int meta) { - getOnCoilCheck().accept(this); - return getCoilHeatFromDamage(meta); - } - - /*--------------- CALLBACK ------------*/ - - private Consumer callback = coil -> {}; - - @Override - public void setOnCoilCheck(Consumer callback) { - this.callback = callback; - } - - @Override - public Consumer getOnCoilCheck() { - return this.callback; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings6.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings6.java deleted file mode 100644 index 9bdbf256cc..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings6.java +++ /dev/null @@ -1,94 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings6 extends GT_Block_Casings_Abstract { - - public GT_Block_Casings6() { - super(GT_Item_Casings6.class, "gt.blockcasings6", GT_Material_Casings.INSTANCE, 16); - - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Hermetic Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Hermetic Casing I"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Hermetic Casing II"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Hermetic Casing III"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Hermetic Casing IV"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Hermetic Casing V"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Hermetic Casing VI"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Hermetic Casing VII"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Hermetic Casing VIII"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Hermetic Casing IX"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Hermetic Casing X"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Hermetic Casing XI"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Hermetic Casing XII"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Hermetic Casing XIII"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Hermetic Casing XIV"); - - ItemList.Casing_Tank_0.set(new ItemStack(this, 1, 0)); - ItemList.Casing_Tank_1.set(new ItemStack(this, 1, 1)); - ItemList.Casing_Tank_2.set(new ItemStack(this, 1, 2)); - ItemList.Casing_Tank_3.set(new ItemStack(this, 1, 3)); - ItemList.Casing_Tank_4.set(new ItemStack(this, 1, 4)); - ItemList.Casing_Tank_5.set(new ItemStack(this, 1, 5)); - ItemList.Casing_Tank_6.set(new ItemStack(this, 1, 6)); - ItemList.Casing_Tank_7.set(new ItemStack(this, 1, 7)); - ItemList.Casing_Tank_8.set(new ItemStack(this, 1, 8)); - ItemList.Casing_Tank_9.set(new ItemStack(this, 1, 9)); - ItemList.Casing_Tank_10.set(new ItemStack(this, 1, 10)); - ItemList.Casing_Tank_11.set(new ItemStack(this, 1, 11)); - ItemList.Casing_Tank_12.set(new ItemStack(this, 1, 12)); - ItemList.Casing_Tank_13.set(new ItemStack(this, 1, 13)); - ItemList.Casing_Tank_14.set(new ItemStack(this, 1, 14)); - } - - @Override - public int getTextureIndex(int aMeta) { - return (8 << 7) | (aMeta + 112); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - if (ordinalSide == 0) { - return Textures.BlockIcons.MACHINECASINGS_BOTTOM[aMeta].getIcon(); - } - if (ordinalSide == 1) { - return Textures.BlockIcons.MACHINECASINGS_TOP[aMeta].getIcon(); - } - return switch (aMeta) { - case 1 -> Textures.BlockIcons.MACHINE_CASING_TANK_1.getIcon(); - case 2 -> Textures.BlockIcons.MACHINE_CASING_TANK_2.getIcon(); - case 3 -> Textures.BlockIcons.MACHINE_CASING_TANK_3.getIcon(); - case 4 -> Textures.BlockIcons.MACHINE_CASING_TANK_4.getIcon(); - case 5 -> Textures.BlockIcons.MACHINE_CASING_TANK_5.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_CASING_TANK_6.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_CASING_TANK_7.getIcon(); - case 8 -> Textures.BlockIcons.MACHINE_CASING_TANK_8.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_CASING_TANK_9.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_CASING_TANK_10.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_CASING_TANK_11.getIcon(); - case 12 -> Textures.BlockIcons.MACHINE_CASING_TANK_12.getIcon(); - case 13 -> Textures.BlockIcons.MACHINE_CASING_TANK_13.getIcon(); - case 14 -> Textures.BlockIcons.MACHINE_CASING_TANK_14.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_TANK_0.getIcon(); - }; - } - - @Override - public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) { - return gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 - | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8 - | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2]; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java deleted file mode 100644 index 0baeea1411..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java +++ /dev/null @@ -1,188 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_RenderingWorld; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings8 extends GT_Block_Casings_Abstract { - - public static boolean mConnectedMachineTextures = true; - - // WATCH OUT FOR TEXTURE ID's - public GT_Block_Casings8() { - super(GT_Item_Casings8.class, "gt.blockcasings8", GT_Material_Casings.INSTANCE, 15); - /* - * DO NOT USE INDEX 15 ! USED HERE: https://github.com/GTNewHorizons/KubaTech/pull/101 - */ - - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Chemically Inert Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "PTFE Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mining Neutronium Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Mining Black Plutonium Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Extreme Engine Intake Casing"); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + ".5.name", - "Europium Reinforced Radiation Proof Machine Casing"); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + ".6.name", - "Advanced Rhodium Plated Palladium Machine Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".7.name", "Advanced Iridium Plated Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Magical Machine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "HSS-S Turbine Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Radiant Naquadah Alloy Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".11.name", "Basic Photolithographic Framework Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".12.name", "Reinforced Photolithographic Framework Casing"); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + ".13.name", - "Radiation Proof Photolithographic Framework Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Infinity Cooled Casing"); - - ItemList.Casing_Chemically_Inert.set(new ItemStack(this, 1, 0)); - ItemList.Casing_Pipe_Polytetrafluoroethylene.set(new ItemStack(this, 1, 1)); - ItemList.Casing_MiningNeutronium.set(new ItemStack(this, 1, 2)); - ItemList.Casing_MiningBlackPlutonium.set(new ItemStack(this, 1, 3)); - ItemList.Casing_ExtremeEngineIntake.set(new ItemStack(this, 1, 4)); - ItemList.Casing_AdvancedRadiationProof.set(new ItemStack(this, 1, 5)); - ItemList.Casing_Advanced_Rhodium_Palladium.set(new ItemStack(this, 1, 6)); - ItemList.Casing_Advanced_Iridium.set(new ItemStack(this, 1, 7)); - ItemList.Casing_Magical.set(new ItemStack(this, 1, 8)); - ItemList.Casing_TurbineGasAdvanced.set(new ItemStack(this, 1, 9)); - ItemList.RadiantNaquadahAlloyCasing.set(new ItemStack(this, 1, 10)); - ItemList.BasicPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 11)); - ItemList.ReinforcedPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 12)); - ItemList.RadiationProofPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 13)); - ItemList.InfinityCooledCasing.set(new ItemStack(this, 1, 14)); - } - - @Override - public int getTextureIndex(int aMeta) { - return (1 << 7) | (aMeta + 48); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.MACHINE_CASING_CHEMICALLY_INERT.getIcon(); - case 1 -> Textures.BlockIcons.MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.getIcon(); - case 2 -> Textures.BlockIcons.MACHINE_CASING_MINING_NEUTRONIUM.getIcon(); - case 3 -> Textures.BlockIcons.MACHINE_CASING_MINING_BLACKPLUTONIUM.getIcon(); - case 4 -> Textures.BlockIcons.MACHINE_CASING_EXTREME_ENGINE_INTAKE.getIcon(); // changed color in a - // terrible way - case 5 -> Textures.BlockIcons.MACHINE_CASING_ADVANCEDRADIATIONPROOF.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_CASING_RHODIUM_PALLADIUM.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_CASING_IRIDIUM.getIcon(); - case 8 -> Textures.BlockIcons.MACHINE_CASING_MAGICAL.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_CASING_ADVANCEDGAS.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_1.getIcon(); - case 12 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_2.getIcon(); - case 13 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_3.getIcon(); - case 14 -> Textures.BlockIcons.INFINITY_COOLED_CASING.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); - }; - } - - public IIcon getTurbineCasing(int meta, int iconIndex, boolean active, boolean hasTurbine) { - // noinspection SwitchStatementWithTooFewBranches // "if" is harder to edit - return switch (meta) { - case 9 -> active ? Textures.BlockIcons.TURBINE_ADVGASACTIVE[iconIndex].getIcon() - : hasTurbine ? Textures.BlockIcons.TURBINEADVGAS[iconIndex].getIcon() - : Textures.BlockIcons.TURBINE_ADVGASEMPTY[iconIndex].getIcon(); - default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon() - : hasTurbine ? Textures.BlockIcons.TURBINE[iconIndex].getIcon() - : Textures.BlockIcons.TURBINE_EMPTY[iconIndex].getIcon(); - }; - } - - private static int isTurbineControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0; - if (tTile.getMetaTileEntity() instanceof GT_MetaTileEntity_LargeTurbine turbine && tTile.getFrontFacing() - .ordinal() == ordinalSide) { - if (turbine.isNewStyleRendering()) return 0; - if (tTile.isActive()) return 1; - return turbine.hasTurbine() ? 2 : 3; - } - return 0; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { - aWorld = GT_RenderingWorld.getInstance(aWorld); - final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); - - if (tMeta != 9 || !mConnectedMachineTextures) { - return getIcon(ordinalSide, tMeta); - } - - int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1; - - switch (ordinalSide / 2) { - case 0 -> { - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - if (i == 0 && j == 0) continue; - int tState; - if ((tState = isTurbineControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, ordinalSide)) - != 0) { - return getTurbineCasing(tMeta, 4 - i * 3 - j, tState == 1, tState == 2); - } - } - } - } - case 1 -> { - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - if (i == 0 && j == 0) continue; - int tState; - if ((tState = isTurbineControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, ordinalSide)) - != 0) { - return getTurbineCasing( - tMeta, - 4 + i * 3 - j * tInvertLeftRightMod, - tState == 1, - tState == 2); - } - } - } - } - case 2 -> { - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - if (i == 0 && j == 0) continue; - int tState; - if ((tState = isTurbineControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, ordinalSide)) - != 0) { - return getTurbineCasing( - tMeta, - 4 + i * 3 + j * tInvertLeftRightMod, - tState == 1, - tState == 2); - } - } - } - } - } - - return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings9.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings9.java deleted file mode 100644 index 6f33cda013..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings9.java +++ /dev/null @@ -1,96 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Block_Casings9 extends GT_Block_Casings_Abstract { - - public GT_Block_Casings9() { - super(GT_Item_Casings9.class, "gt.blockcasings9", GT_Material_Casings.INSTANCE, 16); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "PBI Pipe Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Advanced Filter Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".1.tooltip", "Less than five 0.1μm particles per m^3"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Primitive Wooden Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".3.name", "Superplasticizer-Treated High Strength Concrete"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Sterile Water Plant Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".5.name", "Reinforced Sterile Water Plant Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Slick Sterile Flocculation Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".7.name", "Stabilized Naquadah Water Plant Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".8.name", "Inert Neutralization Water Plant Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Reactive Gas Containment Casing"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Inert Filtration Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".11.name", "Heat-Resistant Trinium Plated Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".12.name", "Naquadria-Reinforced Water Plant Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".13.name", "High Energy Ultraviolet Emitter Casing"); - // placeholder name - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".14.name", "Particle Beam Guidance Pipe Casing"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".15.name", "Femtometer-Calibrated Particle Beam Casing"); - - ItemList.Casing_Pipe_Polybenzimidazole.set(new ItemStack(this, 1, 0)); - ItemList.Casing_Vent_T2.set(new ItemStack(this, 1, 1)); - ItemList.WoodenCasing.set(new ItemStack(this, 1, 2)); - ItemList.BlockIndustrialStrengthConcrete.set(new ItemStack(this, 1, 3)); - ItemList.BlockIndustrialWaterPlantCasing.set(new ItemStack(this, 1, 4)); - ItemList.BlockSterileWaterPlantCasing.set(new ItemStack(this, 1, 5)); - ItemList.BlockFlocculationCasing.set(new ItemStack(this, 1, 6)); - ItemList.BlockNaquadahReinforcedWaterPlantCasing.set(new ItemStack(this, 1, 7)); - ItemList.BlockExtremeCorrosionResistantCasing.set(new ItemStack(this, 1, 8)); - ItemList.BlockHighPressureResistantCasing.set(new ItemStack(this, 1, 9)); - ItemList.BlockOzoneCasing.set(new ItemStack(this, 1, 10)); - ItemList.BlockPlasmaHeatingCasing.set(new ItemStack(this, 1, 11)); - ItemList.BlockNaquadriaReinforcedWaterPlantCasing.set(new ItemStack(this, 1, 12)); - ItemList.BlockUltraVioletLaserEmitter.set(new ItemStack(this, 1, 13)); - ItemList.BlockQuarkPipe.set(new ItemStack(this, 1, 14)); - ItemList.BlockQuarkReleaseChamber.set(new ItemStack(this, 1, 15)); - } - - @Override - public int getTextureIndex(int aMeta) { - return (16 << 7) | (aMeta + 16); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE.getIcon(); - case 1 -> Textures.BlockIcons.MACHINE_CASING_VENT_T2.getIcon(); - case 2 -> ordinalSide >= 2 ? Textures.BlockIcons.TEXTURE_METAL_PANEL_E.getIcon() - : Textures.BlockIcons.TEXTURE_METAL_PANEL_E_A.getIcon(); - case 3 -> Textures.BlockIcons.INDUSTRIAL_STRENGTH_CONCRETE.getIcon(); - case 4 -> Textures.BlockIcons.MACHINE_CASING_INDUSTRIAL_WATER_PLANT.getIcon(); - case 5 -> Textures.BlockIcons.WATER_PLANT_CONCRETE_CASING.getIcon(); - case 6 -> Textures.BlockIcons.MACHINE_CASING_FLOCCULATION.getIcon(); - case 7 -> Textures.BlockIcons.MACHINE_CASING_NAQUADAH_REINFORCED_WATER_PLANT.getIcon(); - case 8 -> Textures.BlockIcons.MACHINE_CASING_EXTREME_CORROSION_RESISTANT.getIcon(); - case 9 -> Textures.BlockIcons.MACHINE_CASING_HIGH_PRESSURE_RESISTANT.getIcon(); - case 10 -> Textures.BlockIcons.MACHINE_CASING_OZONE.getIcon(); - case 11 -> Textures.BlockIcons.MACHINE_CASING_PLASMA_HEATER.getIcon(); - case 12 -> Textures.BlockIcons.NAQUADRIA_REINFORCED_WATER_PLANT_CASING.getIcon(); - case 13 -> Textures.BlockIcons.UV_BACKLIGHT_STERILIZER_CASING.getIcon(); - case 14 -> Textures.BlockIcons.BLOCK_QUARK_PIPE.getIcon(); - case 15 -> Textures.BlockIcons.BLOCK_QUARK_RELEASE_CHAMBER.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); - }; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java deleted file mode 100644 index cfa51f8e99..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java +++ /dev/null @@ -1,144 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Textures; -import gregtech.api.items.GT_Generic_Block; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; - -/** - * The base class for casings. Casings are the blocks that are mainly used to build multiblocks. - */ -public abstract class GT_Block_Casings_Abstract extends GT_Generic_Block - implements gregtech.api.interfaces.IHasIndexedTexture { - - public GT_Block_Casings_Abstract(Class aItemClass, String aName, Material aMaterial) { - super(aItemClass, aName, aMaterial); - setStepSound(soundTypeMetal); - setCreativeTab(GregTech_API.TAB_GREGTECH); - GregTech_API.registerMachineBlock(this, -1); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this"); - } - - public GT_Block_Casings_Abstract(Class aItemClass, String aName, Material aMaterial, - int aMaxMeta) { - this(aItemClass, aName, aMaterial); - for (int i = 0; i < aMaxMeta; i++) { - Textures.BlockIcons.setCasingTextureForId(getTextureIndex(i), TextureFactory.of(this, i)); - } - } - - @Override - public String getHarvestTool(int aMeta) { - return "wrench"; - } - - @Override - public int getHarvestLevel(int aMeta) { - return 2; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ); - } - - @Override - public float getExplosionResistance(Entity aTNT) { - return Blocks.iron_block.getExplosionResistance(aTNT); - } - - @Override - protected boolean canSilkHarvest() { - return false; - } - - @Override - public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { - if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - } - } - - @Override - public String getUnlocalizedName() { - return this.mUnlocalizedName; - } - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return true; - } - - @Override - public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) { - if (GregTech_API.isMachineBlock(this, aMetaData)) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - } - } - - @Override - public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { - return false; - } - - @Override - public int damageDropped(int metadata) { - return metadata; - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister aIconRegister) {} - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < 16; i++) { - ItemStack aStack = new ItemStack(aItem, 1, i); - if (!aStack.getDisplayName() - .contains(".name")) aList.add(aStack); - } - } - - /** - * Provide a fallback to subclasses in addons. - */ - @Override - public int getTextureIndex(int aMeta) { - return Textures.BlockIcons.ERROR_TEXTURE_INDEX; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Concretes.java b/src/main/java/gregtech/common/blocks/GT_Block_Concretes.java deleted file mode 100644 index c7b7e2bb04..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Concretes.java +++ /dev/null @@ -1,83 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IBlockOnWalkOver; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_OreDictUnificator; - -public class GT_Block_Concretes extends GT_Block_Stones_Abstract implements IBlockOnWalkOver { - - public GT_Block_Concretes() { - super(GT_Item_Concretes.class, "gt.blockconcretes"); - setResistance(20.0F); - // this.slipperiness = 0.9F; - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Dark Concrete"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Dark Concrete Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Dark Concrete Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Dark Concrete Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Dark Concrete Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Dark Concrete Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Dark Concrete"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Dark Concrete"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Light Concrete"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Light Concrete Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Light Concrete Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Light Concrete Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Light Concrete Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Light Concrete Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Light Concrete"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Light Concrete"); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 0)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 1)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 2)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 3)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 4)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 5)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 6)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 7)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 8)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 9)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 10)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 11)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 12)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 13)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 14)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 15)); - } - - @Override - public int getHarvestLevel(int aMeta) { - return 1; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ); - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16)) { - return gregtech.api.enums.Textures.BlockIcons.CONCRETES[aMeta].getIcon(); - } - return gregtech.api.enums.Textures.BlockIcons.CONCRETES[0].getIcon(); - } - - @Override - public void onWalkOver(EntityLivingBase aEntity, World aWorld, int aX, int aY, int aZ) { - if ((aEntity.motionX != 0 || aEntity.motionZ != 0) && !aEntity.isInWater() - && !aEntity.isWet() - && !aEntity.isSneaking()) { - double tSpeed = (aWorld.getBlock(aX, aY - 1, aZ).slipperiness >= 0.8 ? 1.5 : 1.2); - aEntity.motionX *= tSpeed; - aEntity.motionZ *= tSpeed; - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Drone.java b/src/main/java/gregtech/common/blocks/GT_Block_Drone.java deleted file mode 100644 index 81d1acc228..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Drone.java +++ /dev/null @@ -1,65 +0,0 @@ -package gregtech.common.blocks; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.common.tileentities.render.TileDrone; - -public class GT_Block_Drone extends Block { - - public GT_Block_Drone() { - super(Material.iron); - this.setResistance(20f); - this.setHardness(-1.0f); - this.setCreativeTab(GregTech_API.TAB_GREGTECH); - this.setBlockName("gt.dronerender"); - this.setLightLevel(100.0f); - GameRegistry.registerBlock(this, getUnlocalizedName()); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT"); - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean canRenderInPass(int a) { - return true; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean hasTileEntity(int metadata) { - return true; - } - - @Override - public TileEntity createTileEntity(World world, int metadata) { - return new TileDrone(); - } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) { - return new ArrayList<>(); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_FrameBox.java b/src/main/java/gregtech/common/blocks/GT_Block_FrameBox.java deleted file mode 100644 index 76e3180d58..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_FrameBox.java +++ /dev/null @@ -1,446 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.enums.GT_Values.W; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -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.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.metatileentity.BaseTileEntity; -import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.GT_Renderer_Block; - -public class GT_Block_FrameBox extends BlockContainer { - - protected final String mUnlocalizedName; - - private static final String DOT_NAME = ".name"; - private static final String DOT_TOOLTIP = ".tooltip"; - - // We need to keep around a temporary TE to preserve this TE after breaking the block, so we can - // properly call getDrops() on it - private static final ThreadLocal mTemporaryTileEntity = new ThreadLocal<>(); - - public GT_Block_FrameBox() { - super(new GT_Material_Machines()); - this.mUnlocalizedName = "gt.blockframes"; - setBlockName(this.mUnlocalizedName); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + W + ".name", "Any Sub Block of this one"); - - GameRegistry.registerBlock(this, GT_Item_Frames.class, getUnlocalizedName()); - - for (int meta = 1; meta < GregTech_API.sGeneratedMaterials.length; meta++) { - Materials material = GregTech_API.sGeneratedMaterials[meta]; - if (material != null && (material.mTypes & 0x02) != 0) { - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + "." + meta + DOT_NAME, - GT_LanguageManager.i18nPlaceholder ? getLocalizedNameFormat(material) : getLocalizedName(material)); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + "." + meta + DOT_TOOLTIP, material.getToolTip()); - } - } - } - - public ItemStack getStackForm(int amount, int meta) { - return new ItemStack(this, amount, meta); - } - - public String getLocalizedNameFormat(Materials aMaterial) { - return switch (aMaterial.mName) { - case "InfusedAir", "InfusedDull", "InfusedEarth", "InfusedEntropy", "InfusedFire", "InfusedOrder", "InfusedVis", "InfusedWater" -> "%material Infused Stone"; - case "Vermiculite", "Bentonite", "Kaolinite", "Talc", "BasalticMineralSand", "GraniticMineralSand", "GlauconiteSand", "CassiteriteSand", "GarnetSand", "QuartzSand", "Pitchblende", "FullersEarth" -> "%material"; - default -> "%material" + " Frame Box"; - }; - } - - @Override - public String getUnlocalizedName() { - return mUnlocalizedName; - } - - public String getLocalizedName(Materials aMaterial) { - return aMaterial.getDefaultLocalizedNameForItem(getLocalizedNameFormat(aMaterial)); - } - - private boolean isCover(ItemStack item) { - return GT_Utility.isStackInList(item, GregTech_API.sCovers.keySet()); - } - - private void createFrame(World worldIn, int x, int y, int z, BaseMetaPipeEntity baseMte) { - // Obtain metadata to grab proper material identifier - int meta = worldIn.getBlockMetadata(x, y, z); - Materials material = getMaterial(meta); - GT_MetaPipeEntity_Frame frame = new GT_MetaPipeEntity_Frame("GT_Frame_" + material, material); - baseMte.setMetaTileEntity(frame); - frame.setBaseMetaTileEntity(baseMte); - } - - private BaseMetaPipeEntity spawnFrameEntity(World worldIn, int x, int y, int z) { - // Spawn a TE frame box at this location, then apply the cover - BaseMetaPipeEntity newTileEntity = new BaseMetaPipeEntity(); - createFrame(worldIn, x, y, z, newTileEntity); - worldIn.setTileEntity(x, y, z, newTileEntity); - return newTileEntity; - } - - // Get the material that this frame box is made of - public static Materials getMaterial(int meta) { - return GregTech_API.sGeneratedMaterials[meta]; - } - - @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, - float subY, float subZ) { - // Get ForgeDirection from side identifier. - ForgeDirection direction = ForgeDirection.getOrientation(side); - // If this block already holds a TE, just forward the call - TileEntity te = worldIn.getTileEntity(x, y, z); - if (te instanceof BaseMetaPipeEntity baseTileEntity) { - // If this baseTileEntity has no MetaTileEntity associated with it, we need to create it - // This happens on world load for some reason - if (baseTileEntity.getMetaTileEntity() == null) { - createFrame(worldIn, x, y, z, baseTileEntity); - } - return baseTileEntity.onRightclick(player, direction, subX, subY, subZ); - } - - // If there was no TileEntity yet, we need to check if the player was holding a cover item and if so - // spawn a new frame box to apply the cover to - ItemStack item = player.getHeldItem(); - if (isCover(item)) { - BaseMetaPipeEntity newTileEntity = spawnFrameEntity(worldIn, x, y, z); - newTileEntity.onRightclick(player, direction, subX, subY, subZ); - return true; - } - - return false; - } - - @Override - public int getRenderType() { - if (GT_Renderer_Block.INSTANCE == null) { - return super.getRenderType(); - } - return GT_Renderer_Block.mRenderID; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public int getRenderBlockPass() { - return 1; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item aItem, CreativeTabs aTab, List aList) { - for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++) { - Materials tMaterial = GregTech_API.sGeneratedMaterials[i]; - // If material is not null and has a frame box item associated with it - if ((tMaterial != null) && ((tMaterial.mTypes & 0x02) != 0)) { - aList.add(new ItemStack(aItem, 1, i)); - } - } - } - - @Override - public String getHarvestTool(int aMeta) { - return "wrench"; - } - - @Override - public int getHarvestLevel(int aMeta) { - return aMeta % 4; - } - - @Override - public boolean canConnectRedstone(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - ForgeDirection forgeSide = switch (ordinalSide) { - case (-2) -> ForgeDirection.DOWN; - case (-1) -> ForgeDirection.UP; - case (0) -> ForgeDirection.NORTH; - case (2) -> ForgeDirection.SOUTH; - case (3) -> ForgeDirection.WEST; - case (1) -> ForgeDirection.EAST; - default -> ForgeDirection.UNKNOWN; - }; - final TileEntity frameEntity = aWorld.getTileEntity(aX, aY, aZ); - return frameEntity instanceof CoverableTileEntity cte && cte.getCoverInfoAtSide(forgeSide) - .getCoverID() != 0; - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ); - } - - @Override - public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - gtTE.onBlockDestroyed(); - mTemporaryTileEntity.set(gtTE); - } - // Cause structure update - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata); - } - - @Override - public void onBlockAdded(World worldIn, int x, int y, int z) { - // Cause structure update - GregTech_API.causeMachineUpdate(worldIn, x, y, z); - super.onBlockAdded(worldIn, x, y, z); - } - - @Override - public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { - gtTE.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); - return; - } - super.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); - } - - @Override - public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - return (tTileEntity instanceof BaseMetaTileEntity baseMTE) && baseMTE.privateAccess() - && !baseMTE.playerOwnsThis(aPlayer, true) ? -1.0F - : super.getPlayerRelativeBlockHardness(aPlayer, aWorld, aX, aY, aZ); - } - - @Override - public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof BaseTileEntity baseTE) { - baseTE.onAdjacentBlockChange(aTileX, aTileY, aTileZ); - } - } - - @Override - public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof BaseMetaPipeEntity baseMetaPipe) { - baseMetaPipe.onNeighborBlockChange(aX, aY, aZ); - } - } - - @Override - public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, - List outputAABB, Entity collider) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { - gtTE.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); - return; - } - super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { - return gtTE.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - return super.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - - @Override - @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { - return gtTE.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - return super.getSelectedBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - - @Override - public boolean isSideSolid(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) { - if (aWorld.getBlockMetadata(aX, aY, aZ) == 0) { - return true; - } - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof BaseMetaTileEntity) { - return true; - } - if (tTileEntity instanceof BaseMetaPipeEntity baseMetaPipe && (baseMetaPipe.mConnections & 0xFFFFFFC0) != 0) { - return true; - } - return (tTileEntity instanceof ICoverable coverable) && coverable.getCoverIDAtSide(side) != 0; - } - - @Override // THIS - public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int aX, int aY, int aZ) { - final TileEntity tTileEntity = blockAccess.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE && gtTE.getMetaTileEntity() != null) { - final AxisAlignedBB bbb = gtTE.getCollisionBoundingBoxFromPool(gtTE.getWorld(), 0, 0, 0); - minX = bbb.minX; // This essentially sets block bounds - minY = bbb.minY; - minZ = bbb.minZ; - maxX = bbb.maxX; - maxY = bbb.maxY; - maxZ = bbb.maxZ; - return; - } - super.setBlockBoundsBasedOnState(blockAccess, aX, aY, aZ); - } - - @Override - public void setBlockBoundsForItemRender() { - super.setBlockBounds(0, 0, 0, 1, 1, 1); - } - - @Override - public int getFlammability(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { - return 0; - } - - @Override - public int getFireSpreadSpeed(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { - return 0; - } - - @Override - public boolean isFireSource(World aWorld, int aX, int aY, int aZ, ForgeDirection side) { - return false; - } - - @Override - public boolean isFlammable(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { - return false; - } - - @Override - public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean hasTileEntity(int aMeta) { - return true; - } - - @Override - public boolean onBlockEventReceived(World aWorld, int aX, int aY, int aZ, int aData1, int aData2) { - super.onBlockEventReceived(aWorld, aX, aY, aZ, aData1, aData2); - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - return tTileEntity != null && tTileEntity.receiveClientEvent(aData1, aData2); - } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { - // Find temporary TE if there was one - final IGregTechTileEntity tempTe = mTemporaryTileEntity.get(); - ArrayList drops = new ArrayList<>(); - drops.add(getStackForm(1, metadata)); - // If there is one, grab all attached covers and drop them - if (tempTe != null) { - for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { - ItemStack cover = tempTe.getCoverItemAtSide(direction); - if (cover != null) drops.add(cover); - } - } - // Make sure to clear the temporary TE - mTemporaryTileEntity.remove(); - return drops; - } - - @Override - public boolean canProvidePower() { - return true; - } - - @Override - public int isProvidingWeakPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - if (ordinalSide < 0 || ordinalSide > 5) { - return 0; - } - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - return gtTE.getOutputRedstoneSignal( - ForgeDirection.getOrientation(ordinalSide) - .getOpposite()); - } - return 0; - } - - @Override - public int isProvidingStrongPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - if (ordinalSide < 0 || ordinalSide > 5) { - return 0; - } - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - return gtTE.getStrongOutputRedstoneSignal( - ForgeDirection.getOrientation(ordinalSide) - .getOpposite()); - } - return 0; - } - - @Override - public IIcon getIcon(int side, int meta) { - Materials material = GregTech_API.sGeneratedMaterials[meta]; - if (material == null) return null; - return material.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon(); - } - - public ITexture[] getTexture(int meta) { - Materials material = getMaterial(meta); - if (material == null) return null; - return new ITexture[] { TextureFactory.of( - material.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex], - Dyes.getModulation(-1, material.mRGBa)) }; - } - - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) { - return null; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Glass1.java b/src/main/java/gregtech/common/blocks/GT_Block_Glass1.java deleted file mode 100644 index 2aa5613d11..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Glass1.java +++ /dev/null @@ -1,107 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Facing; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -/** - * The glass is split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - * - * This class hosts various special types of tiered glass with not many tiers. - */ -public class GT_Block_Glass1 extends GT_Block_Casings_Abstract { - - public GT_Block_Glass1() { - super(GT_Item_Glass1.class, "gt.blockglass1", Material.glass, 4); - this.opaque = false; - - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Chemical Grade Glass"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".1.name", "Electron-Permeable Neutronium Coated Glass"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Omni-Purpose Infinity Fused Glass"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".3.name", "Non-Photonic Matter Exclusion Glass"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".4.name", "Hawking Radiation Realignment Focus"); - - ItemList.GlassPHResistant.set(new ItemStack(this, 1, 0)); - ItemList.GlassUVResistant.set(new ItemStack(this, 1, 1)); - ItemList.GlassOmniPurposeInfinityFused.set(new ItemStack(this, 1, 2)); - ItemList.GlassQuarkContainment.set(new ItemStack(this, 1, 3)); - ItemList.GlassQuarkContainment.set(new ItemStack(this, 1, 3)); - ItemList.Hawking_Glass.set(new ItemStack(this, 1, 4)); - } - - @Override - public int getTextureIndex(int aMeta) { - // Page 16, 0-16 - return (16 << 7) | (aMeta); - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderBlockPass() { - return 1; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.GLASS_PH_RESISTANT.getIcon(); - case 1 -> Textures.BlockIcons.NEUTRONIUM_COATED_UV_RESISTANT_GLASS.getIcon(); - case 2 -> Textures.BlockIcons.OMNI_PURPOSE_INFINITY_FUSED_GLASS.getIcon(); - case 3 -> Textures.BlockIcons.GLASS_QUARK_CONTAINMENT.getIcon(); - case 4 -> Textures.BlockIcons.HAWKING_GLASS.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); - }; - } - - /** - * 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 - */ - @SideOnly(Side.CLIENT) - @Override - public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { - Block block = worldIn.getBlock(x, y, z); - - if (worldIn.getBlockMetadata(x, y, z) != worldIn.getBlockMetadata( - x - Facing.offsetsXForSide[side], - y - Facing.offsetsYForSide[side], - z - Facing.offsetsZForSide[side])) { - return true; - } - - if (block == this) { - return false; - } - - return super.shouldSideBeRendered(worldIn, x, y, z, side); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Granites.java b/src/main/java/gregtech/common/blocks/GT_Block_Granites.java deleted file mode 100644 index 69ebc2e733..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Granites.java +++ /dev/null @@ -1,77 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.boss.EntityWither; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_OreDictUnificator; - -public class GT_Block_Granites extends GT_Block_Stones_Abstract { - - public GT_Block_Granites() { - super(GT_Item_Granites.class, "gt.blockgranites"); - setResistance(60.0F); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Black Granite"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Black Granite Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Black Granite Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Black Granite Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Black Granite Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Black Granite Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Black Granite"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Black Granite"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Red Granite"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Red Granite Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Red Granite Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Red Granite Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Red Granite Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Red Granite Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Red Granite"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Red Granite"); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 0)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 1)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 2)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 3)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 4)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 5)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 6)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 7)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 8)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 9)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 10)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 11)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 12)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 13)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 14)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 15)); - } - - @Override - public int getHarvestLevel(int aMeta) { - return 3; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16)) { - return gregtech.api.enums.Textures.BlockIcons.GRANITES[aMeta].getIcon(); - } - return gregtech.api.enums.Textures.BlockIcons.GRANITES[0].getIcon(); - } - - @Override - public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { - return !(entity instanceof EntityWither); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Laser.java b/src/main/java/gregtech/common/blocks/GT_Block_Laser.java deleted file mode 100644 index 038b114284..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Laser.java +++ /dev/null @@ -1,104 +0,0 @@ -package gregtech.common.blocks; - -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.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 gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; -import gregtech.common.tileentities.render.TileLaser; - -public class GT_Block_Laser extends Block implements ITileEntityProvider { - - public static IIcon[] textures; - - public GT_Block_Laser() { - super(Material.iron); - setBlockName("LaserPlate"); - this.setCreativeTab(GregTech_API.TAB_GREGTECH); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".name", "Laser Resistant Plate"); - GregTech_API.registerMachineBlock(this, -1); - GameRegistry.registerBlock(this, GT_Item_Block_Laser.class, getUnlocalizedName()); - ItemList.Laser_Plate.set(new ItemStack(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, aMetaData)) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - } - } - - @Override - public String getHarvestTool(int aMeta) { - return "wrench"; - } - - @Override - public int getHarvestLevel(int aMeta) { - return 2; - } - - @Override - public String getUnlocalizedName() { - return "gt.laserplate"; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - blockIcon = Textures.BlockIcons.LASER_PLATE.getIcon(); - } - - @Override - public IIcon getIcon(int side, int meta) { - return blockIcon; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public float getBlockHardness(World world, int x, int y, int z) { - return 1.0f; - } - - @Override - public int damageDropped(int meta) { - return meta; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean hasTileEntity(int metadata) { - return true; - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileLaser(); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java deleted file mode 100644 index 2f80929d94..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java +++ /dev/null @@ -1,703 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.ITileEntityProvider; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.Explosion; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.cricketcraft.chisel.api.IFacade; - -import cpw.mods.fml.common.Optional; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IDebugableBlock; -import gregtech.api.interfaces.tileentity.IColoredTileEntity; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IDebugableTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_Generic_Block; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.metatileentity.BaseTileEntity; -import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.api.util.GT_BaseCrop; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; -import gregtech.common.covers.CoverInfo; -import gregtech.common.render.GT_Renderer_Block; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_QuantumChest; -import gtPlusPlus.xmod.gregtech.common.tileentities.redstone.GT_MetaTileEntity_RedstoneBase; - -@Optional.Interface(iface = "com.cricketcraft.chisel.api.IFacade", modid = "ChiselAPI") -public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlock, ITileEntityProvider, IFacade { - - private static final ThreadLocal mTemporaryTileEntity = new ThreadLocal<>(); - private boolean renderAsNormalBlock; - - public GT_Block_Machines() { - super(GT_Item_Machines.class, "gt.blockmachines", new GT_Material_Machines()); - GregTech_API.registerMachineBlock(this, -1); - setHardness(1.0F); - setResistance(10.0F); - setStepSound(soundTypeMetal); - setCreativeTab(GregTech_API.TAB_GREGTECH); - this.isBlockContainer = true; - this.renderAsNormalBlock = true; - this.useNeighborBrightness = true; - } - - @Override - public String getHarvestTool(int aMeta) { - if (aMeta >= 8 && aMeta <= 11) { - return "cutter"; - } - return "wrench"; - } - - @Override - public int getHarvestLevel(int aMeta) { - return aMeta % 4; - } - - @Override - protected boolean canSilkHarvest() { - return false; - } - - @Override - public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof BaseTileEntity)) { - ((BaseTileEntity) tTileEntity).onAdjacentBlockChange(aTileX, aTileY, aTileZ); - } - } - - @Override - public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof BaseMetaPipeEntity)) { - ((BaseMetaPipeEntity) tTileEntity).onNeighborBlockChange(aX, aY, aZ); - } - } - - @Override - public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { - super.onBlockAdded(aWorld, aX, aY, aZ); - if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - } - } - - @Override - public String getUnlocalizedName() { - return "gt.blockmachines"; - } - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(getUnlocalizedName() + ".name"); - } - - @Override - public int getFlammability(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { - return 0; - } - - @Override - public int getFireSpreadSpeed(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { - return GregTech_API.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0) ? 100 : 0; - } - - @Override - public int getRenderType() { - if (GT_Renderer_Block.INSTANCE == null) { - return super.getRenderType(); - } - return GT_Renderer_Block.INSTANCE.mRenderID; - } - - @Override - public boolean isFireSource(World aWorld, int aX, int aY, int aZ, ForgeDirection side) { - return GregTech_API.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0); - } - - @Override - public boolean isFlammable(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) { - return GregTech_API.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0); - } - - @Override - public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean canConnectRedstone(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - ForgeDirection forgeSide = switch (ordinalSide) { - case (-2) -> ForgeDirection.DOWN; - case (-1) -> ForgeDirection.UP; - case (0) -> ForgeDirection.NORTH; - case (2) -> ForgeDirection.SOUTH; - case (3) -> ForgeDirection.WEST; - case (1) -> ForgeDirection.EAST; - default -> ForgeDirection.UNKNOWN; - }; - final TileEntity machineEntity = aWorld.getTileEntity(aX, aY, aZ); - return machineEntity instanceof BaseMetaTileEntity bmte && (bmte.getCoverInfoAtSide(forgeSide) - .getCoverID() != 0 || bmte.getMetaTileEntity() instanceof GT_MetaTileEntity_RedstoneBase); - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean hasTileEntity(int aMeta) { - return true; - } - - @Override - public boolean hasComparatorInputOverride() { - return true; - } - - @Override - public boolean renderAsNormalBlock() { - return renderAsNormalBlock; - } - - public GT_Block_Machines setRenderAsNormalBlock(boolean aBool) { - renderAsNormalBlock = aBool; - return this; - } - - @Override - public boolean canProvidePower() { - return true; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public TileEntity createNewTileEntity(World aWorld, int aMeta) { - return createTileEntity(aWorld, aMeta); - } - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) { - return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon(); - } - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon(); - } - - @Override - public boolean onBlockEventReceived(World aWorld, int aX, int aY, int aZ, int aData1, int aData2) { - super.onBlockEventReceived(aWorld, aX, aY, aZ, aData1, aData2); - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - return tTileEntity != null && tTileEntity.receiveClientEvent(aData1, aData2); - } - - @Override - public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB, - List outputAABB, Entity collider) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity - && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { - ((IGregTechTileEntity) tTileEntity) - .addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); - return; - } - super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity - && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { - return ((IGregTechTileEntity) tTileEntity).getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - return super.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - - @Override - @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity - && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { - return ((IGregTechTileEntity) tTileEntity).getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - return super.getSelectedBoundingBoxFromPool(aWorld, aX, aY, aZ); - } - - @Override // THIS - public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int aX, int aY, int aZ) { - final TileEntity tTileEntity = blockAccess.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity - && (((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null)) { - final AxisAlignedBB bbb = ((IGregTechTileEntity) tTileEntity) - .getCollisionBoundingBoxFromPool(((IGregTechTileEntity) tTileEntity).getWorld(), 0, 0, 0); - minX = bbb.minX; // This essentially sets block bounds - minY = bbb.minY; - minZ = bbb.minZ; - maxX = bbb.maxX; - maxY = bbb.maxY; - maxZ = bbb.maxZ; - return; - } - super.setBlockBoundsBasedOnState(blockAccess, aX, aY, aZ); - } - - @Override - public void setBlockBoundsForItemRender() { - super.setBlockBounds(0, 0, 0, 1, 1, 1); - } - - @Override - public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity - && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) { - ((IGregTechTileEntity) tTileEntity).onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); - return; - } - super.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister aIconRegister) { - if (!GregTech_API.sPostloadFinished) return; - GT_Log.out.println("GT_Mod: Setting up Icon Register for Blocks"); - GregTech_API.setBlockIconRegister(aIconRegister); - - GT_Log.out.println("GT_Mod: Registering MetaTileEntity specific Textures"); - try { - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - if (GregTech_API.METATILEENTITIES[i] != null) { - GregTech_API.METATILEENTITIES[i].registerIcons(aIconRegister); - } - } - } catch (Exception e) { - e.printStackTrace(GT_Log.err); - } - GT_Log.out.println("GT_Mod: Registering Crop specific Textures"); - try { - for (GT_BaseCrop tCrop : GT_BaseCrop.sCropList) { - tCrop.registerSprites(aIconRegister); - } - } catch (Exception e) { - e.printStackTrace(GT_Log.err); - } - GT_Log.out.println("GT_Mod: Starting Block Icon Load Phase"); - GT_FML_LOGGER.info("GT_Mod: Starting Block Icon Load Phase"); - try { - for (Runnable tRunnable : GregTech_API.sGTBlockIconload) { - tRunnable.run(); - } - } catch (Exception e) { - e.printStackTrace(GT_Log.err); - } - GT_Log.out.println("GT_Mod: Finished Block Icon Load Phase"); - GT_FML_LOGGER.info("GT_Mod: Finished Block Icon Load Phase"); - } - - @Override - public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - return tTileEntity instanceof BaseMetaTileEntity && ((BaseMetaTileEntity) tTileEntity).privateAccess() - && !((BaseMetaTileEntity) tTileEntity).playerOwnsThis(aPlayer, true) ? -1.0F - : super.getPlayerRelativeBlockHardness(aPlayer, aWorld, aX, aY, aZ); - } - - @Override - public boolean onBlockActivated(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer, int ordinalSide, - float aOffsetX, float aOffsetY, float aOffsetZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity == null) { - return false; - } - if (aPlayer.isSneaking()) { - final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); - if (tCurrentItem != null && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList) - && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList) - && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList) - && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList) - && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sJackhammerList)) return false; - } - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - if (gtTE.getTimer() < 1L) { - return false; - } - if ((!aWorld.isRemote) && !gtTE.isUseableByPlayer(aPlayer)) { - return true; - } - return ((IGregTechTileEntity) tTileEntity) - .onRightclick(aPlayer, ForgeDirection.getOrientation(ordinalSide), aOffsetX, aOffsetY, aOffsetZ); - } - return false; - } - - @Override - public void onBlockClicked(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - gtTE.onLeftclick(aPlayer); - } - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - return gtTE.getMetaTileID(); - } - return 0; - } - - @Override - public void onBlockExploded(World aWorld, int aX, int aY, int aZ, Explosion aExplosion) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof BaseMetaTileEntity baseTE) { - GT_Log.exp.printf( - "Explosion at : %d | %d | %d DIMID: %s due to near explosion!%n", - aX, - aY, - aZ, - aWorld.provider.dimensionId); - baseTE.doEnergyExplosion(); - } - super.onBlockExploded(aWorld, aX, aY, aZ, aExplosion); - } - - @Override - public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - gtTE.onBlockDestroyed(); - mTemporaryTileEntity.set(gtTE); - if (!(gtTE.getMetaTileEntity() instanceof GT_MetaTileEntity_QuantumChest)) { - for (int i = 0; i < gtTE.getSizeInventory(); i++) { - final ItemStack tItem = gtTE.getStackInSlot(i); - if ((tItem != null) && (tItem.stackSize > 0) && (gtTE.isValidSlot(i)) && gtTE.shouldDropItemAt(i)) { - final EntityItem tItemEntity = new EntityItem( - aWorld, - aX + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, - aY + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, - aZ + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, - new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage())); - if (tItem.hasTagCompound()) { - tItemEntity.getEntityItem() - .setTagCompound( - (NBTTagCompound) tItem.getTagCompound() - .copy()); - } - tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D); - tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.25D); - tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D); - aWorld.spawnEntityInWorld(tItemEntity); - tItem.stackSize = 0; - gtTE.setInventorySlotContents(i, null); - } - } - } - } - super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata); - aWorld.removeTileEntity(aX, aY, aZ); - } - - @Override - public ArrayList getDrops(World aWorld, int aX, int aY, int aZ, int aMeta, int aFortune) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - return gtTE.getDrops(); - } - final IGregTechTileEntity tGregTechTileEntity = mTemporaryTileEntity.get(); - final ArrayList tDrops; - if (tGregTechTileEntity == null) { - tDrops = new ArrayList<>(); - } else { - tDrops = tGregTechTileEntity.getDrops(); - mTemporaryTileEntity.remove(); - } - return tDrops; - } - - @Override - public boolean removedByPlayer(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, boolean aWillHarvest) { - // This delays deletion of the block until after getDrops - return aWillHarvest || super.removedByPlayer(aWorld, aPlayer, aX, aY, aZ, false); - } - - @Override - public void harvestBlock(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, int aMeta) { - super.harvestBlock(aWorld, aPlayer, aX, aY, aZ, aMeta); - aWorld.setBlockToAir(aX, aY, aZ); - } - - @Override - public int getComparatorInputOverride(World aWorld, int aX, int aY, int aZ, int ordinalSide) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - return gtTE.getComparatorValue(ForgeDirection.getOrientation(ordinalSide)); - } - return 0; - } - - @Override - public int isProvidingWeakPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - if (ordinalSide < 0 || ordinalSide > 5) { - return 0; - } - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - return gtTE.getOutputRedstoneSignal( - ForgeDirection.getOrientation(ordinalSide) - .getOpposite()); - } - return 0; - } - - @Override - public int isProvidingStrongPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - if (ordinalSide < 0 || ordinalSide > 5) { - return 0; - } - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity gtTE) { - return gtTE.getStrongOutputRedstoneSignal( - ForgeDirection.getOrientation(ordinalSide) - .getOpposite()); - } - return 0; - } - - @Override - public void dropBlockAsItemWithChance(World aWorld, int aX, int aY, int aZ, int aMetadata, float chance, - int aFortune) { - if (!aWorld.isRemote) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity != null && (chance < 1.0F)) { - if (tTileEntity instanceof BaseMetaTileEntity bmte && (GregTech_API.sMachineNonWrenchExplosions)) { - GT_Log.exp.printf( - "Explosion at : %d | %d | %d DIMID: %s NonWrench picking/Rain!%n", - aX, - aY, - aZ, - aWorld.provider.dimensionId); - bmte.doEnergyExplosion(); - } - } else { - super.dropBlockAsItemWithChance(aWorld, aX, aY, aZ, aMetadata, chance, aFortune); - } - } - } - - @Override - public boolean isSideSolid(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) { - if (aWorld.getBlockMetadata(aX, aY, aZ) == 0) { - return true; - } - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity != null) { - if (tTileEntity instanceof BaseMetaTileEntity) { - return true; - } - if (tTileEntity instanceof BaseMetaPipeEntity - && (((BaseMetaPipeEntity) tTileEntity).mConnections & 0xFFFFFFC0) != 0) { - return true; - } - return tTileEntity instanceof ICoverable && ((ICoverable) tTileEntity).getCoverIDAtSide(side) != 0; - } - return false; - } - - @Override - public boolean isBlockNormalCube() { - return true; - } - - /** - * Returns the default ambient occlusion value based on block opacity - */ - @SideOnly(Side.CLIENT) - @Override - public float getAmbientOcclusionLightValue() { - return this.renderAsNormalBlock() ? 0.2F : 0.5F; - } - - /** - * @inheritDoc - */ - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World aWorld, int aX, int aY, int aZ, Random aRandom) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity) { - ((IGregTechTileEntity) tTileEntity).onRandomDisplayTick(); - } - } - - @Override - public int getLightOpacity(IBlockAccess aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity) { - return ((IGregTechTileEntity) tTileEntity).getLightOpacity(); - } - return aWorld.getBlockMetadata(aX, aY, aZ) == 0 ? 255 : 0; - } - - @Override - public int getLightValue(IBlockAccess aWorld, int aX, int aY, int aZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof BaseMetaTileEntity) { - return ((BaseMetaTileEntity) tTileEntity).getLightValue(); - } - return 0; - } - - @Override - public TileEntity createTileEntity(World aWorld, int aMeta) { - return GregTech_API.createTileEntity(aMeta); - } - - @Override - public float getExplosionResistance(Entity entity, World aWorld, int aX, int aY, int aZ, double explosionX, - double explosionY, double explosionZ) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IGregTechTileEntity) { - return ((IGregTechTileEntity) tTileEntity).getBlastResistance(ForgeDirection.UNKNOWN); - } - return 10.0F; - } - - @SideOnly(Side.CLIENT) - @Override - public void getSubBlocks(Item item, CreativeTabs aCreativeTab, List outputSubBlocks) { - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - if (GregTech_API.METATILEENTITIES[i] != null) { - outputSubBlocks.add(new ItemStack(item, 1, i)); - } - } - } - - @Override - public void onBlockPlacedBy(World aWorld, int aX, int aY, int aZ, EntityLivingBase aPlayer, ItemStack aStack) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (!(tTileEntity instanceof IGregTechTileEntity iGregTechTileEntity)) return; - iGregTechTileEntity.setFrontFacing( - BaseTileEntity.getSideForPlayerPlacing(aPlayer, ForgeDirection.UP, iGregTechTileEntity.getValidFacings())); - } - - @Override - public ArrayList getDebugInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, int aLogLevel) { - final TileEntity tTileEntity = aPlayer.worldObj.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IDebugableTileEntity) { - return ((IDebugableTileEntity) tTileEntity).getDebugInfo(aPlayer, aLogLevel); - } - return new ArrayList<>(); - } - - @Override - public boolean recolourBlock(World aWorld, int aX, int aY, int aZ, ForgeDirection side, int aColor) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IColoredTileEntity coloredTE) { - if (coloredTE.getColorization() == (byte) ((~aColor) & 0xF)) { - return false; - } - coloredTE.setColorization((byte) ((~aColor) & 0xF)); - return true; - } - return false; - } - - @Override - public Block getFacade(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof CoverableTileEntity tile) { - final ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide); - if (dir != ForgeDirection.UNKNOWN) { - final Block facadeBlock = tile.getCoverInfoAtSide(dir) - .getFacadeBlock(); - if (facadeBlock != null) return facadeBlock; - } else { - // we do not allow more than one type of facade per block, so no need to check every side - // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable - for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { - final Block facadeBlock = tile.getCoverInfoAtSide(tSide) - .getFacadeBlock(); - if (facadeBlock != null) { - return facadeBlock; - } - } - } - } - return Blocks.air; - } - - @Override - public int getFacadeMetadata(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof CoverableTileEntity tile) { - final ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide); - if (ordinalSide != -1) { - final CoverInfo coverInfo = tile.getCoverInfoAtSide(dir); - final Block facadeBlock = coverInfo.getFacadeBlock(); - if (facadeBlock != null) return coverInfo.getFacadeMeta(); - } else { - // we do not allow more than one type of facade per block, so no need to check every side - // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable - for (final ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) { - final CoverInfo coverInfo = tile.getCoverInfoAtSide(d); - final Block facadeBlock = coverInfo.getFacadeBlock(); - if (facadeBlock != null) { - return coverInfo.getFacadeMeta(); - } - } - } - } - return 0; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Metal.java b/src/main/java/gregtech/common/blocks/GT_Block_Metal.java deleted file mode 100644 index 753c590e51..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Metal.java +++ /dev/null @@ -1,68 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.enums.Mods.NotEnoughItems; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_OreDictUnificator; - -public class GT_Block_Metal extends GT_Block_Storage { - - public Materials[] mMats; - public OrePrefixes mPrefix; - public IIconContainer[] mBlockIcons; - public boolean mHideBlocks; - public static boolean mNEIisLoaded = NotEnoughItems.isModLoaded(); - - public GT_Block_Metal(String aName, Materials[] aMats, OrePrefixes aPrefix, IIconContainer[] aBlockIcons) { - super(GT_Item_Storage.class, aName, Material.iron); - mMats = aMats; - mPrefix = aPrefix; - mBlockIcons = aBlockIcons; - mHideBlocks = mNEIisLoaded; - - for (int i = 0; i < aMats.length; i++) { - if (aMats[i].mMetaItemSubID > 0 && aMats[i].mHasParentMod) { - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + "." + i + ".name", - "Block of " + (GT_LanguageManager.i18nPlaceholder ? "%material" : aMats[i].mDefaultLocalName)); - GT_OreDictUnificator.registerOre(aPrefix, aMats[i], new ItemStack(this, 1, i)); - } - } - if (aMats.length < 16 && mNEIisLoaded) { - for (int i = aMats.length; i < 16; i++) codechicken.nei.api.API.hideItem(new ItemStack(this, 1, i)); - } - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16) && aMeta < mMats.length) { - return mBlockIcons[aMeta].getIcon(); - } - return null; - } - - @Override - public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { - if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - } - } - - @Override - public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) { - if (GregTech_API.isMachineBlock(this, aMetaData)) { - GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); - } - } - -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Ores.java b/src/main/java/gregtech/common/blocks/GT_Block_Ores.java deleted file mode 100644 index 015baa2319..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Ores.java +++ /dev/null @@ -1,154 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.enums.Textures.BlockIcons.BASALT_STONE; -import static gregtech.api.enums.Textures.BlockIcons.GRANITE_BLACK_STONE; -import static gregtech.api.enums.Textures.BlockIcons.GRANITE_RED_STONE; -import static gregtech.api.enums.Textures.BlockIcons.MARBLE_STONE; - -import java.util.Arrays; - -import net.minecraft.block.Block; -import net.minecraft.block.material.MapColor; -import net.minecraft.block.material.Material; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.ITexture; -import gregtech.api.render.TextureFactory; - -public class GT_Block_Ores extends GT_Block_Ores_Abstract { - - private static final String UNLOCALIZED_NAME = "gt.blockores"; - - public GT_Block_Ores() { - super(UNLOCALIZED_NAME, 7, false, Material.rock); - } - - @Override - public String getUnlocalizedName() { - return UNLOCALIZED_NAME; - } - - @Override - public OrePrefixes[] getProcessingPrefix() { // Must have 8 entries; an entry can be null to disable automatic - // recipes. - return new OrePrefixes[] { OrePrefixes.ore, OrePrefixes.oreNetherrack, OrePrefixes.oreEndstone, - OrePrefixes.oreBlackgranite, OrePrefixes.oreRedgranite, OrePrefixes.oreMarble, OrePrefixes.oreBasalt, - null }; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int meta) { - int index = ((meta / 1000) % 16); - return switch (index) { - case 1 -> Blocks.netherrack.getIcon(ordinalSide, 0); - case 2 -> Blocks.end_stone.getIcon(ordinalSide, 0); - case 3 -> GRANITE_BLACK_STONE.getIcon(); - case 4 -> GRANITE_RED_STONE.getIcon(); - case 5 -> MARBLE_STONE.getIcon(); - case 6 -> BASALT_STONE.getIcon(); - default -> Blocks.stone.getIcon(ordinalSide, 0); - }; - } - - /** - * @inheritDoc - */ - @Override - public boolean isFireSource(World world, int x, int y, int z, ForgeDirection side) { - return (side == ForgeDirection.UP && getDamageValue(world, x, y, z) / 1000 % 16 == 1); - } - - /** - * @inheritDoc - */ - @Override - public MapColor getMapColor(int meta) { - return meta == 1 ? MapColor.netherrackColor : MapColor.stoneColor; - } - - @Override - public int getBaseBlockHarvestLevel(int aMeta) { - return switch (aMeta) { - case 3, 4 -> 3; - default -> 0; - }; - } - - @Override - public Block getDroppedBlock() { - return GregTech_API.sBlockOres1; - } - - @Override - public Materials[] getDroppedDusts() { // Must have 8 entries; can be null. - return new Materials[] { Materials.Stone, Materials.Netherrack, Materials.Endstone, Materials.GraniteBlack, - Materials.GraniteRed, Materials.Marble, Materials.Basalt, Materials.Stone }; - } - - @Override - public boolean[] getEnabledMetas() { - return new boolean[] { true, true, true, GT_Mod.gregtechproxy.enableBlackGraniteOres, - GT_Mod.gregtechproxy.enableRedGraniteOres, GT_Mod.gregtechproxy.enableMarbleOres, - GT_Mod.gregtechproxy.enableBasaltOres, true }; - } - - @Override - public ITexture[] getTextureSet() { - final ITexture[] rTextures = new ITexture[16]; // Must have 16 entries. - Arrays.fill(rTextures, TextureFactory.of(Blocks.stone)); - rTextures[1] = TextureFactory.of(Blocks.netherrack); - rTextures[2] = TextureFactory.of(Blocks.end_stone); - rTextures[3] = TextureFactory.builder() - .addIcon(GRANITE_BLACK_STONE) - .stdOrient() - .build(); - rTextures[4] = TextureFactory.builder() - .addIcon(GRANITE_RED_STONE) - .stdOrient() - .build(); - rTextures[5] = TextureFactory.builder() - .addIcon(MARBLE_STONE) - .stdOrient() - .build(); - rTextures[6] = TextureFactory.builder() - .addIcon(BASALT_STONE) - .stdOrient() - .build(); - return rTextures; - } - - @Override - public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta) { - - if (EnchantmentHelper.getSilkTouchModifier(player)) { - GT_TileEntity_Ores.shouldSilkTouch = true; - super.harvestBlock(worldIn, player, x, y, z, meta); - - if (GT_TileEntity_Ores.shouldSilkTouch) { - GT_TileEntity_Ores.shouldSilkTouch = false; - } - return; - } - - if (!(player instanceof FakePlayer)) { - GT_TileEntity_Ores.shouldFortune = true; - } - super.harvestBlock(worldIn, player, x, y, z, meta); - if (GT_TileEntity_Ores.shouldFortune) { - GT_TileEntity_Ores.shouldFortune = false; - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java deleted file mode 100644 index 8e68c5c39a..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java +++ /dev/null @@ -1,324 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.enums.Mods.NotEnoughItems; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import net.minecraft.block.Block; -import net.minecraft.block.ITileEntityProvider; -import net.minecraft.block.material.Material; -import net.minecraft.client.particle.EffectRenderer; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.boss.EntityDragon; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.StatCollector; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.ITexture; -import gregtech.api.items.GT_Generic_Block; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.GT_Renderer_Block; - -public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements ITileEntityProvider { - - private static final String DOT_NAME = ".name"; - private static final String DOT_TOOLTIP = ".tooltip"; - public static ThreadLocal mTemporaryTileEntity = new ThreadLocal<>(); - public static boolean FUCKING_LOCK = false; - public static boolean tHideOres; - public static Set aBlockedOres = new HashSet<>(); - - protected GT_Block_Ores_Abstract(String aUnlocalizedName, int aOreMetaCount, boolean aHideFirstMeta, - Material aMaterial) { - super(GT_Item_Ores.class, aUnlocalizedName, aMaterial); - this.isBlockContainer = true; - setStepSound(soundTypeStone); - setCreativeTab(GregTech_API.TAB_GREGTECH_ORES); - tHideOres = NotEnoughItems.isModLoaded() && GT_Mod.gregtechproxy.mHideUnusedOres; - if (aOreMetaCount > 8 || aOreMetaCount < 0) aOreMetaCount = 8; - - for (int i = 0; i < 16; i++) { - GT_ModHandler.addValuableOre(this, i, 1); - } - for (int i = 1; i < GregTech_API.sGeneratedMaterials.length; i++) { - if (GregTech_API.sGeneratedMaterials[i] != null) { - for (int j = 0; j < aOreMetaCount; j++) { - if (!this.getEnabledMetas()[j]) continue; - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + "." + (i + (j * 1000)) + DOT_NAME, - GT_LanguageManager.i18nPlaceholder ? getLocalizedNameFormat(GregTech_API.sGeneratedMaterials[i]) - : getLocalizedName(GregTech_API.sGeneratedMaterials[i])); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + "." + (i + (j * 1000)) + DOT_TOOLTIP, - GregTech_API.sGeneratedMaterials[i].getToolTip()); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + "." + ((i + 16000) + (j * 1000)) + DOT_NAME, - "Small " + (GT_LanguageManager.i18nPlaceholder - ? getLocalizedNameFormat(GregTech_API.sGeneratedMaterials[i]) - : getLocalizedName(GregTech_API.sGeneratedMaterials[i]))); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + "." + ((i + 16000) + (j * 1000)) + DOT_TOOLTIP, - GregTech_API.sGeneratedMaterials[i].getToolTip()); - if ((GregTech_API.sGeneratedMaterials[i].mTypes & 0x8) != 0 - && !aBlockedOres.contains(GregTech_API.sGeneratedMaterials[i])) { - GT_OreDictUnificator.registerOre( - this.getProcessingPrefix()[j] != null - ? this.getProcessingPrefix()[j].get(GregTech_API.sGeneratedMaterials[i]) - : "", - new ItemStack(this, 1, i + (j * 1000))); - if (tHideOres) { - if (!(j == 0 && !aHideFirstMeta)) { - codechicken.nei.api.API.hideItem(new ItemStack(this, 1, i + (j * 1000))); - } - codechicken.nei.api.API.hideItem(new ItemStack(this, 1, (i + 16000) + (j * 1000))); - } - } - } - } - } - } - - public int getBaseBlockHarvestLevel(int aMeta) { - return 0; - } - - @Override - public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) { - if (!FUCKING_LOCK) { - FUCKING_LOCK = true; - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - ((GT_TileEntity_Ores) tTileEntity).onUpdated(); - } - } - FUCKING_LOCK = false; - } - - @Override - public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) { - if (!FUCKING_LOCK) { - FUCKING_LOCK = true; - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - ((GT_TileEntity_Ores) tTileEntity).onUpdated(); - } - } - FUCKING_LOCK = false; - } - - public String getLocalizedNameFormat(Materials aMaterial) { - return switch (aMaterial.mName) { - case "InfusedAir", "InfusedDull", "InfusedEarth", "InfusedEntropy", "InfusedFire", "InfusedOrder", "InfusedVis", "InfusedWater" -> "%material Infused Stone"; - case "Vermiculite", "Bentonite", "Kaolinite", "Talc", "BasalticMineralSand", "GraniticMineralSand", "GlauconiteSand", "CassiteriteSand", "GarnetSand", "QuartzSand", "Pitchblende", "FullersEarth" -> "%material"; - default -> "%material" + OrePrefixes.ore.mLocalizedMaterialPost; - }; - } - - public String getLocalizedName(Materials aMaterial) { - return aMaterial.getDefaultLocalizedNameForItem(getLocalizedNameFormat(aMaterial)); - } - - @Override - public boolean onBlockActivated(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer, int ordinalSide, - float aOffsetX, float aOffsetY, float aOffsetZ) { - if (!aPlayer.isSneaking() || !aPlayer.capabilities.isCreativeMode) { - return false; - } - - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (!(tTileEntity instanceof GT_TileEntity_Ores)) { - return false; - } - - boolean tNatural = (((GT_TileEntity_Ores) tTileEntity).mNatural = !((GT_TileEntity_Ores) tTileEntity).mNatural); - GT_Utility.sendChatToPlayer(aPlayer, "Ore \"mNatural\" flag set to: " + tNatural); - return true; - } - - @Override - public boolean onBlockEventReceived(World p_149696_1_, int p_149696_2_, int p_149696_3_, int p_149696_4_, - int p_149696_5_, int p_149696_6_) { - super.onBlockEventReceived(p_149696_1_, p_149696_2_, p_149696_3_, p_149696_4_, p_149696_5_, p_149696_6_); - TileEntity tileentity = p_149696_1_.getTileEntity(p_149696_2_, p_149696_3_, p_149696_4_); - return tileentity != null && tileentity.receiveClientEvent(p_149696_5_, p_149696_6_); - } - - @Override - public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { - return (!(entity instanceof EntityDragon)) && (super.canEntityDestroy(world, x, y, z, entity)); - } - - @Override - public String getHarvestTool(int aMeta) { - return aMeta < 8 ? "pickaxe" : "shovel"; - } - - @Override - public int getHarvestLevel(int aMeta) { - return aMeta == 5 || aMeta == 6 ? 2 : aMeta % 8; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return 1.0F + getHarvestLevel(aWorld.getBlockMetadata(aX, aY, aZ)) * 1.0F; - } - - @Override - public float getExplosionResistance(Entity entity, World aWorld, int aX, int aY, int aZ, double explosionX, - double explosionY, double explosionZ) { - return 1.0F + getHarvestLevel(aWorld.getBlockMetadata(aX, aY, aZ)) * 1.0F; - } - - @Override - protected boolean canSilkHarvest() { - return false; - } - - @Override - public abstract String getUnlocalizedName(); - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(getUnlocalizedName() + DOT_NAME); - } - - @Override - public int getRenderType() { - if (GT_Renderer_Block.INSTANCE == null) { - return super.getRenderType(); - } - return GT_Renderer_Block.INSTANCE.mRenderID; - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return true; - } - - @Override - public boolean hasTileEntity(int aMeta) { - return true; - } - - @Override - public TileEntity createNewTileEntity(World aWorld, int aMeta) { - return createTileEntity(aWorld, aMeta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) { - return Blocks.stone.getIcon(0, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return Blocks.stone.getIcon(0, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister aIconRegister) {} - - @Override - @SideOnly(Side.CLIENT) - public boolean addHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer) { - GT_Renderer_Block - .addHitEffects(effectRenderer, this, worldObj, target.blockX, target.blockY, target.blockZ, target.sideHit); - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean addDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { - GT_Renderer_Block.addDestroyEffects(effectRenderer, this, world, x, y, z); - return true; - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (((tTileEntity instanceof GT_TileEntity_Ores))) { - return ((GT_TileEntity_Ores) tTileEntity).getMetaData(); - } - return 0; - } - - @Override - public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - mTemporaryTileEntity.set((GT_TileEntity_Ores) tTileEntity); - } - super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata); - aWorld.removeTileEntity(aX, aY, aZ); - } - - public abstract OrePrefixes[] getProcessingPrefix(); // Must have 8 entries; an entry can be null to disable - // automatic recipes. - - public abstract boolean[] getEnabledMetas(); // Must have 8 entries. - - public abstract Block getDroppedBlock(); - - public abstract Materials[] getDroppedDusts(); // Must have 8 entries; can be null. - - @Override - public ArrayList getDrops(World aWorld, int aX, int aY, int aZ, int aMeta, int aFortune) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - return ((GT_TileEntity_Ores) tTileEntity).getDrops(getDroppedBlock(), aFortune); - } - return mTemporaryTileEntity.get() == null ? new ArrayList<>() - : mTemporaryTileEntity.get() - .getDrops(getDroppedBlock(), aFortune); - } - - @Override - public TileEntity createTileEntity(World aWorld, int aMeta) { - return new GT_TileEntity_Ores(); - } - - public abstract ITexture[] getTextureSet(); // Must have 16 entries. - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item aItem, CreativeTabs aTab, List aList) { - for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++) { - Materials tMaterial = GregTech_API.sGeneratedMaterials[i]; - if ((tMaterial != null) && ((tMaterial.mTypes & 0x8) != 0) && !aBlockedOres.contains(tMaterial)) { - for (int meta = i; meta < 23000 + i; meta += 1000) { - if (!(new ItemStack(aItem, 1, meta).getDisplayName() - .contains(DOT_NAME))) aList.add(new ItemStack(aItem, 1, meta)); - } - } - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java b/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java deleted file mode 100644 index a78fe5b70d..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java +++ /dev/null @@ -1,409 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.boss.EntityWither; -import net.minecraft.entity.item.EntityTNTPrimed; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.Explosion; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.items.GT_Generic_Block; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.WorldSpawnedEventBuilder; - -public class GT_Block_Reinforced extends GT_Generic_Block { - - public GT_Block_Reinforced(String aName) { - super(GT_Item_Storage.class, aName, new GT_Material_Reinforced()); - for (int i = 0; i < 16; i++) { - Textures.BlockIcons.casingTexturePages[1][i + 80] = TextureFactory.of(this, i); - } - setStepSound(soundTypeStone); - setCreativeTab(GregTech_API.TAB_GREGTECH); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Bronzeplate Reinforced Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Iridium Reinforced Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Plascrete Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Tungstensteel Reinforced Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Brittle Charcoal"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Powderbarrel"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Solid Super Fuel"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Magic Solid Super Fuel"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Steel Reinforced Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Titanium Reinforced Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Naquadah Reinforced Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Neutronium Reinforced Block"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Raw Deep Dark Portal Block"); - ItemList.Block_BronzePlate.set( - new ItemStack( - this.setHardness(60.0f) - .setResistance(150.0f), - 1, - 0)); - ItemList.Block_IridiumTungstensteel.set( - new ItemStack( - this.setHardness(400.0f) - .setResistance(600.0f), - 1, - 1)); - ItemList.Block_Plascrete.set( - new ItemStack( - this.setHardness(5.0f) - .setResistance(6.0f), - 1, - 2)); - ItemList.Block_TungstenSteelReinforced.set( - new ItemStack( - this.setHardness(250.0f) - .setResistance(400.0f), - 1, - 3)); - ItemList.Block_BrittleCharcoal.set( - new ItemStack( - this.setHardness(0.5f) - .setResistance(8.0f), - 1, - 4)); - ItemList.Block_Powderbarrel.set( - new ItemStack( - this.setHardness(2.5f) - .setResistance(2.0f), - 1, - 5)); - ItemList.Block_SSFUEL.set( - new ItemStack( - this.setHardness(2.5f) - .setResistance(2.0f), - 1, - 6)); - ItemList.Block_MSSFUEL.set( - new ItemStack( - this.setHardness(2.5f) - .setResistance(2.0f), - 1, - 7)); - ItemList.Block_SteelPlate.set( - new ItemStack( - this.setHardness(150.0f) - .setResistance(200.0f), - 1, - 8)); - ItemList.Block_TitaniumPlate.set( - new ItemStack( - this.setHardness(200.0f) - .setResistance(300.0f), - 1, - 9)); - ItemList.Block_NaquadahPlate.set( - new ItemStack( - this.setHardness(500.0f) - .setResistance(1000.0f), - 1, - 10)); - ItemList.Block_NeutroniumPlate.set( - new ItemStack( - this.setHardness(750.0f) - .setResistance(2500.0f), - 1, - 11)); - ItemList.Block_BedrockiumCompressed.set( - new ItemStack( - this.setHardness(1500.0f) - .setResistance(5000.0f), - 1, - 12)); - GT_ModHandler.addShapelessCraftingRecipe( - new ItemStack(Items.coal, 1, 1), - new Object[] { ItemList.Block_BrittleCharcoal.get(1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Block_Powderbarrel.get(1L), - GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "WSW", "GGG", "WGW", 'W', OrePrefixes.plate.get(Materials.Wood), 'G', - new ItemStack(Items.gunpowder, 1), 'S', new ItemStack(Items.string, 1) }); - } - - @Override - public String getHarvestTool(int aMeta) { - if (aMeta == 5 || aMeta == 4 || aMeta == 6 || aMeta == 7) return "axe"; - if (aMeta == 2) return "wrench"; - return "pickaxe"; - } - - @Override - public int getHarvestLevel(int aMeta) { - if (aMeta == 4 || aMeta == 5 || aMeta == 6 || aMeta == 7) return 1; - if (aMeta == 2) return 2; - if (aMeta == 9 || aMeta == 3 || aMeta == 1) return 5; - if (aMeta == 10 || aMeta == 11) return 7; - return 4; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16)) { - switch (aMeta) { - case 0 -> { - return Textures.BlockIcons.BLOCK_BRONZEPREIN.getIcon(); - } - case 1 -> { - return Textures.BlockIcons.BLOCK_IRREIN.getIcon(); - } - case 2 -> { - return Textures.BlockIcons.BLOCK_PLASCRETE.getIcon(); - } - case 3 -> { - return Textures.BlockIcons.BLOCK_TSREIN.getIcon(); - } - case 4, 6, 7 -> { - return Blocks.coal_block.getIcon(0, 0); - } - case 5 -> { - return Textures.BlockIcons.COVER_WOOD_PLATE.getIcon(); - } - case 8 -> { - return Textures.BlockIcons.BLOCK_STEELPREIN.getIcon(); - } - case 9 -> { - return Textures.BlockIcons.BLOCK_TITANIUMPREIN.getIcon(); - } - case 10 -> { - return Textures.BlockIcons.BLOCK_NAQUADAHPREIN.getIcon(); - } - case 11 -> { - return Textures.BlockIcons.BLOCK_NEUTRONIUMPREIN.getIcon(); - } - case 12 -> { - return Textures.BlockIcons.BLOCK_DEEP_DARK_RAW.getIcon(); - } - } - } - return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - if (aWorld == null) { - return 0.0F; - } - if (aWorld.isAirBlock(aX, aY, aZ)) { - return 0.0F; - } - int tMeta = aWorld.getBlockMetadata(aX, aY, aZ); - if (tMeta == 0) { - return 60.0F; - } - if (tMeta == 1) { - return 400.0F; - } - if (tMeta == 2) { - return 5.0F; - } - if (tMeta == 3) { - return 250.0F; - } - if (tMeta == 4 || tMeta == 5 || tMeta == 6 || tMeta == 7) { - return 0.5F; - } - if (tMeta == 8) { - return 150.0F; - } - if (tMeta == 9) { - return 200.0F; - } - if (tMeta == 10) { - return 500.0F; - } - if (tMeta == 11) { - return 750.0F; - } - return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ); - } - - @Override - public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, - double explosionY, double explosionZ) { - if (world == null) { - return 0.0F; - } - int tMeta = world.getBlockMetadata(x, y, z); - if (tMeta == 0) { - return 150.0F; - } - if (tMeta == 1) { - return 600.0F; - } - if (tMeta == 2) { - return 6.0F; - } - if (tMeta == 3) { - return 400.0F; - } - if (tMeta == 4 || tMeta == 6 || tMeta == 7) { - return 8.0F; - } - if (tMeta == 5) { - return 1.0F; - } - if (tMeta == 8) { - return 200.0F; - } - if (tMeta == 9) { - return 300.0F; - } - if (tMeta == 10) { - return 1000.0F; - } - if (tMeta == 11) { - return 2500.0F; - } - return super.getExplosionResistance(entity, world, x, y, z, explosionX, explosionY, explosionZ); - } - - @Override - public String getUnlocalizedName() { - return this.mUnlocalizedName; - } - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return true; - } - - @Override - public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { - return false; - } - - @Override - public int damageDropped(int metadata) { - return metadata; - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ); - } - - @Override - public void dropBlockAsItemWithChance(World aWorld, int aX, int aY, int aZ, int aMetadata, float chance, - int aFortune) { - if (aMetadata == 4) { - this.dropBlockAsItem(aWorld, aX, aY, aZ, new ItemStack(Items.coal, XSTR_INSTANCE.nextInt(2) + 1, 1)); - } else { - super.dropBlockAsItemWithChance(aWorld, aX, aY, aZ, aMetadata, chance, aFortune); - } - } - - @SuppressWarnings("deprecation") - @Override - public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) { - if (!world.isRemote && world.getBlockMetadata(x, y, z) == 5) { - EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, x + 0.5F, y + 0.5F, z + 0.5F, player); - world.spawnEntityInWorld(entitytntprimed); - new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setPitch(1f) - .setVolume(1f) - .setIdentifier(SoundResource.GAME_TNT_PRIMED) - .setEntity(entitytntprimed) - .setWorld(world) - .run(); - world.setBlockToAir(x, y, z); - return false; - } - return super.removedByPlayer(world, player, x, y, z); - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); - if (world.isBlockIndirectlyGettingPowered(x, y, z) && world.getBlockMetadata(x, y, z) == 5) { - removedByPlayer(world, null, x, y, z); - } - } - - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { - if (world.isBlockIndirectlyGettingPowered(x, y, z) && world.getBlockMetadata(x, y, z) == 5) { - removedByPlayer(world, null, x, y, z); - } - } - - @Override - public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) { - if (!world.isRemote && world.getBlockMetadata(x, y, z) == 5) { - EntityTNTPrimed entitytntprimed = new EntityTNTPrimed( - world, - x + 0.5F, - y + 0.5F, - z + 0.5F, - explosion.getExplosivePlacedBy()); - entitytntprimed.fuse = (world.rand.nextInt(entitytntprimed.fuse / 4) + entitytntprimed.fuse / 8); - world.spawnEntityInWorld(entitytntprimed); - } - super.onBlockExploded(world, x, y, z, explosion); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int ordinalSide, - float xOffset, float yOffset, float zOffset) { - if ((player.getCurrentEquippedItem() != null) && (player.getCurrentEquippedItem() - .getItem() == Items.flint_and_steel) && world.getBlockMetadata(x, y, z) == 5) { - removedByPlayer(world, player, x, y, z); - - return true; - } - return super.onBlockActivated(world, x, y, z, player, ordinalSide, xOffset, yOffset, zOffset); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister aIconRegister) {} - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < 16; i++) { - ItemStack aStack = new ItemStack(aItem, 1, i); - if (!aStack.getDisplayName() - .contains(".name")) aList.add(aStack); - } - } - - @Override - public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { - return !(entity instanceof EntityWither); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Stones.java b/src/main/java/gregtech/common/blocks/GT_Block_Stones.java deleted file mode 100644 index 4ca52aee56..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Stones.java +++ /dev/null @@ -1,62 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_OreDictUnificator; - -public class GT_Block_Stones extends GT_Block_Stones_Abstract { - - public GT_Block_Stones() { - super(GT_Item_Granites.class, "gt.blockstones"); - setResistance(60.0F); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Marble"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Marble Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Marble Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Marble Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Marble Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Marble Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Marble"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Marble"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Basalt"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Basalt Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Basalt Cobblestone"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Basalt Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Basalt Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Basalt Bricks"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Basalt"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Basalt"); - for (int i = 0; i < 16; i++) { - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, i < 8 ? Materials.Marble : Materials.Basalt, new ItemStack(this, 1, i)); - GT_OreDictUnificator - .registerOre(OrePrefixes.block, i < 8 ? Materials.Marble : Materials.Basalt, new ItemStack(this, 1, i)); - GT_OreDictUnificator.registerOre( - (i < 8 ? Materials.Marble.mName.toLowerCase() : Materials.Basalt.mName.toLowerCase()), - new ItemStack(this, 1, i)); - } - } - - @Override - public int getHarvestLevel(int aMeta) { - return 2; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16)) { - return gregtech.api.enums.Textures.BlockIcons.STONES[aMeta].getIcon(); - } - return gregtech.api.enums.Textures.BlockIcons.STONES[0].getIcon(); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java deleted file mode 100644 index 4a5bb9456e..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java +++ /dev/null @@ -1,250 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; -import static gregtech.api.recipe.RecipeMaps.hammerRecipes; -import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; - -import java.util.List; - -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OreDictNames; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IOreRecipeRegistrator; -import gregtech.api.items.GT_Generic_Block; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class GT_Block_Stones_Abstract extends GT_Generic_Block implements IOreRecipeRegistrator { - - public GT_Block_Stones_Abstract(Class aItemClass, String aName) { - super(aItemClass, aName, Material.rock); - OrePrefixes.crafting.add(this); - setStepSound(soundTypeStone); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - - this.registerSmeltingRecipes(); - this.registerAssemblerRecipes(); - this.registerCraftingRecipes(); - this.registerForgeHammerRecipes(); - - } - - private void registerSmeltingRecipes() { - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 0), new ItemStack(this, 1, 7)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 1), new ItemStack(this, 1, 0)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 2), new ItemStack(this, 1, 0)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 3), new ItemStack(this, 1, 0)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 4), new ItemStack(this, 1, 0)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 5), new ItemStack(this, 1, 0)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 6), new ItemStack(this, 1, 0)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 7), new ItemStack(this, 1, 0)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 8), new ItemStack(this, 1, 15)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 9), new ItemStack(this, 1, 8)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 10), new ItemStack(this, 1, 8)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 11), new ItemStack(this, 1, 8)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 12), new ItemStack(this, 1, 8)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 13), new ItemStack(this, 1, 8)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 14), new ItemStack(this, 1, 8)); - GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 15), new ItemStack(this, 1, 8)); - - } - - private void registerAssemblerRecipes() { - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 0), GT_Utility.getIntegratedCircuit(4)) - .itemOutputs(new ItemStack(this, 1, 3)) - .duration(2 * SECONDS + 10 * TICKS) - .eut(4) - .addTo(assemblerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 8), GT_Utility.getIntegratedCircuit(4)) - .itemOutputs(new ItemStack(this, 1, 11)) - .duration(2 * SECONDS + 10 * TICKS) - .eut(4) - .addTo(assemblerRecipes); - } - - private void registerCraftingRecipes() { - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 1, 6), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "f", "X", 'X', new ItemStack(this, 1, 7) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 1, 14), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "f", "X", 'X', new ItemStack(this, 1, 15) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 1, 4), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "h", "X", 'X', new ItemStack(this, 1, 3) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 1, 12), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "h", "X", 'X', new ItemStack(this, 1, 11) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 1, 1), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "h", "X", 'X', new ItemStack(this, 1, 0) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 1, 9), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "h", "X", 'X', new ItemStack(this, 1, 8) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 4, 3), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 0) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 4, 11), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 8) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 4, 3), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 7) }); - GT_ModHandler.addCraftingRecipe( - new ItemStack(this, 4, 11), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 15) }); - } - - private void registerForgeHammerRecipes() { - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 3)) - .itemOutputs(new ItemStack(this, 1, 4)) - .duration(16 * TICKS) - .eut(10) - .addTo(hammerRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 11)) - .itemOutputs(new ItemStack(this, 1, 12)) - .duration(16 * TICKS) - .eut(10) - .addTo(hammerRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 0)) - .itemOutputs(new ItemStack(this, 1, 1)) - .duration(16 * TICKS) - .eut(10) - .addTo(hammerRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 8)) - .itemOutputs(new ItemStack(this, 1, 9)) - .duration(16 * TICKS) - .eut(10) - .addTo(hammerRecipes); - } - - @Override - public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName, - ItemStack aStack) { - if (aOreDictName.equals(OreDictNames.craftingLensWhite.toString())) { - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 7), GT_Utility.copyAmount(0, aStack)) - .itemOutputs(new ItemStack(this, 1, 6)) - .duration(2 * SECONDS + 10 * TICKS) - .eut(16) - .addTo(laserEngraverRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(this, 1, 15), GT_Utility.copyAmount(0, aStack)) - .itemOutputs(new ItemStack(this, 1, 14)) - .duration(2 * SECONDS + 10 * TICKS) - .eut(16) - .addTo(laserEngraverRecipes); - - } - } - - @Override - public String getHarvestTool(int aMeta) { - return "pickaxe"; - } - - @Override - public int getHarvestLevel(int aMeta) { - return 1; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F; - } - - @Override - public String getUnlocalizedName() { - return this.mUnlocalizedName; - } - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return true; - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16)) { - return gregtech.api.enums.Textures.BlockIcons.GRANITES[aMeta].getIcon(); - } - return null; - } - - @Override - public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { - return world.getBlockMetadata(x, y, z) % 8 < 3; - } - - @Override - public int damageDropped(int metadata) { - return metadata % 8 == 0 ? metadata + 1 : metadata; - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister aIconRegister) {} - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < 16; i++) { - aList.add(new ItemStack(aItem, 1, i)); - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Storage.java b/src/main/java/gregtech/common/blocks/GT_Block_Storage.java deleted file mode 100644 index ada3f01cde..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_Storage.java +++ /dev/null @@ -1,103 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.items.GT_Generic_Block; - -public class GT_Block_Storage extends GT_Generic_Block { - - protected GT_Block_Storage(Class aItemClass, String aName, Material aMaterial) { - super(aItemClass, aName, aMaterial); - setStepSound(soundTypeMetal); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - } - - @Override - public String getHarvestTool(int aMeta) { - return "pickaxe"; - } - - @Override - public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) { - return true; - } - - @Override - public int getHarvestLevel(int aMeta) { - return 1; - } - - @Override - public float getBlockHardness(World aWorld, int aX, int aY, int aZ) { - return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ); - } - - @Override - public float getExplosionResistance(Entity aTNT) { - return Blocks.iron_block.getExplosionResistance(aTNT); - } - - @Override - public String getUnlocalizedName() { - return this.mUnlocalizedName; - } - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(this.mUnlocalizedName + ".name"); - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return true; - } - - @Override - public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { - return true; - } - - @Override - public int damageDropped(int metadata) { - return metadata; - } - - @Override - public int getDamageValue(World aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister aIconRegister) {} - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List aList) { - for (int i = 0; i < 16; i++) { - if (!(new ItemStack(aItem, 1, i).getDisplayName() - .contains(".name"))) aList.add(new ItemStack(aItem, 1, i)); - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Block_TintedIndustrialGlass.java b/src/main/java/gregtech/common/blocks/GT_Block_TintedIndustrialGlass.java deleted file mode 100644 index 93c6ebb298..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Block_TintedIndustrialGlass.java +++ /dev/null @@ -1,98 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Facing; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.oredict.OreDictionary; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -public class GT_Block_TintedIndustrialGlass extends GT_Block_Casings_Abstract { - - public GT_Block_TintedIndustrialGlass() { - super(GT_Item_Glass1.class, "gt.blocktintedglass", Material.glass, 4); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Tinted Industrial Glass (White)"); - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".1.name", "Tinted Industrial Glass (Light Gray)"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Tinted Industrial Glass (Gray)"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Tinted Industrial Glass (Black)"); - ItemList.GlassTintedIndustrialWhite.set(new ItemStack(this, 1, 0)); - ItemList.GlassTintedIndustrialLightGray.set(new ItemStack(this, 1, 1)); - ItemList.GlassTintedIndustrialGray.set(new ItemStack(this, 1, 2)); - ItemList.GlassTintedIndustrialBlack.set(new ItemStack(this, 1, 3)); - - // Register tinted industrial glass as EV-Tier glass - OreDictionary.registerOre("blockGlassEV", this); - - this.opaque = false; - } - - @Override - public int getTextureIndex(int aMeta) { - // Page 16, 32-47 - return (16 << 7) | (aMeta + 32); - } - - @Override - public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderBlockPass() { - return 1; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int ordinalSide, int aMeta) { - return switch (aMeta) { - case 0 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_WHITE.getIcon(); - case 1 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_LIGHT_GRAY.getIcon(); - case 2 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_GRAY.getIcon(); - case 3 -> Textures.BlockIcons.GLASS_TINTED_INDUSTRIAL_BLACK.getIcon(); - default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon(); - }; - } - - /** - * 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 - */ - @SideOnly(Side.CLIENT) - @Override - public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { - Block block = worldIn.getBlock(x, y, z); - - if (worldIn.getBlockMetadata(x, y, z) != worldIn.getBlockMetadata( - x - Facing.offsetsXForSide[side], - y - Facing.offsetsYForSide[side], - z - Facing.offsetsZForSide[side])) { - return true; - } - - if (block == this) { - return false; - } - - return super.shouldSideBeRendered(worldIn, x, y, z, side); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java b/src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java deleted file mode 100644 index 3c4250540c..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java +++ /dev/null @@ -1,131 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.util.GT_LanguageManager; - -public class GT_Cyclotron_Coils extends GT_Block_Casings_Abstract { - - public GT_Cyclotron_Coils() { - super(GT_Cyclotron_Item_Casings.class, "gt.blockcasings.cyclotron_coils", GT_Material_Casings.INSTANCE, 16); - - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "MV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "HV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "EV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "IV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "LuV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "ZPM Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "UV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "UHV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "UEV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "UIV Solenoid Superconductor Coil"); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "UMV Solenoid Superconductor Coil"); - - ItemList.Superconducting_Magnet_Solenoid_MV.set(new ItemStack(this, 1, 0)); - ItemList.Superconducting_Magnet_Solenoid_HV.set(new ItemStack(this, 1, 1)); - ItemList.Superconducting_Magnet_Solenoid_EV.set(new ItemStack(this, 1, 2)); - ItemList.Superconducting_Magnet_Solenoid_IV.set(new ItemStack(this, 1, 3)); - ItemList.Superconducting_Magnet_Solenoid_LuV.set(new ItemStack(this, 1, 4)); - ItemList.Superconducting_Magnet_Solenoid_ZPM.set(new ItemStack(this, 1, 5)); - ItemList.Superconducting_Magnet_Solenoid_UV.set(new ItemStack(this, 1, 6)); - ItemList.Superconducting_Magnet_Solenoid_UHV.set(new ItemStack(this, 1, 7)); - ItemList.Superconducting_Magnet_Solenoid_UEV.set(new ItemStack(this, 1, 8)); - ItemList.Superconducting_Magnet_Solenoid_UIV.set(new ItemStack(this, 1, 9)); - ItemList.Superconducting_Magnet_Solenoid_UMV.set(new ItemStack(this, 1, 10)); - } - - @Override - public int getTextureIndex(int aMeta) { - return (2 << 7) | (aMeta); - } - - @Override - public IIcon getIcon(int ordinalSide, int aMeta) { - if ((aMeta >= 0) && (aMeta < 16)) { - switch (aMeta) { - case 0 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.MV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.MV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 1 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.HV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.HV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 2 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.EV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.EV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 3 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.IV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.IV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 4 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.LuV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.LuV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 5 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.ZPM_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.ZPM_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 6 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.UV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.UV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 7 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.UHV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.UHV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 8 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.UEV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.UEV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 9 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.UIV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.UIV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - case 10 -> { - if (ordinalSide == 0 || ordinalSide == 1) { - return Textures.BlockIcons.UMV_TOP_CYCLOTRON_SOLENOID.getIcon(); - } - return Textures.BlockIcons.UMV_SIDE_CYCLOTRON_SOLENOID.getIcon(); - } - } - } - return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); - } - - public int getVoltageTier(int meta) { - return meta + 2; - } - - @Override - public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) { - return aWorld.getBlockMetadata(aX, aY, aZ) > 9 ? super.colorMultiplier(aWorld, aX, aY, aZ) - : gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8 - | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2]; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java b/src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java deleted file mode 100644 index f1ca45a805..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java +++ /dev/null @@ -1,10 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -public class GT_Cyclotron_Item_Casings extends GT_Item_Casings_Abstract { - - public GT_Cyclotron_Item_Casings(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Block_Laser.java b/src/main/java/gregtech/common/blocks/GT_Item_Block_Laser.java deleted file mode 100644 index db4f6ddddc..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Block_Laser.java +++ /dev/null @@ -1,24 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; - -import gregtech.api.util.GT_LanguageManager; - -public class GT_Item_Block_Laser extends ItemBlock { - - public GT_Item_Block_Laser(Block block) { - super(block); - } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean f3_h) { - tooltip.add( - GT_LanguageManager - .addStringLocalization("gt.laserplatingtooltip", "Engineered to withstand extreme temperatures")); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings1.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings1.java deleted file mode 100644 index 1a86a2e534..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings1.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings1 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings1(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings10.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings10.java deleted file mode 100644 index 519549ce6b..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings10.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings10 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings10(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings11.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings11.java deleted file mode 100644 index 2941022b9c..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings11.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings11 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings11(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings2.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings2.java deleted file mode 100644 index f98c169c7f..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings2.java +++ /dev/null @@ -1,26 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings2 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings2(Block block) { - super(block); - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - super.addInformation(aStack, aPlayer, aList, aF3_H); - if (getDamage(aStack) == 8) { - aList.add(this.mBlastProofTooltip); - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings3.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings3.java deleted file mode 100644 index 861774d96f..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings3.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings3 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings3(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings4.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings4.java deleted file mode 100644 index e2badca2cb..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings4.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings4 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings4(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings5.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings5.java deleted file mode 100644 index 3b3ab68cb1..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings5.java +++ /dev/null @@ -1,36 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.util.GT_LanguageManager; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings5 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings5(Block block) { - super(block); - } - - protected static final String mCoilHeatTooltip = GT_LanguageManager - .addStringLocalization("gt.coilheattooltip", "Base Heating Capacity = "); - protected static final String mCoilUnitTooltip = GT_LanguageManager - .addStringLocalization("gt.coilunittooltip", " Kelvin"); - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - super.addInformation(aStack, aPlayer, aList, aF3_H); - HeatingCoilLevel coilLevel = GT_Block_Casings5.getCoilHeatFromDamage(aStack.getItemDamage()); - aList.add(mCoilHeatTooltip + coilLevel.getHeat() + mCoilUnitTooltip); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings6.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings6.java deleted file mode 100644 index af533acfa8..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings6.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings6 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings6(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings8.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings8.java deleted file mode 100644 index e3f3bbdf97..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings8.java +++ /dev/null @@ -1,14 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings8 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings8(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings9.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings9.java deleted file mode 100644 index e9b39ee2cd..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings9.java +++ /dev/null @@ -1,28 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -/** - * The casings are split into separate files because they are registered as regular blocks, and a regular block can have - * 16 subtypes at most. - */ -public class GT_Item_Casings9 extends GT_Item_Casings_Abstract { - - public GT_Item_Casings9(Block block) { - super(block); - } - - /* - * @Override - * public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - * // Add tooltip info if it was given - * String localizedTooltip = GT_LanguageManager.getTranslation(aStack.getUnlocalizedName() + ".tooltip"); - * // getTranslation returns the key if no translation was found, but this just means - * // no tooltip was set. - * if (localizedTooltip.startsWith("gt.")) { - * aList.add(localizedTooltip); - * } - * super.addInformation(aStack, aPlayer, aList, aF3_H); - * } - */ -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java deleted file mode 100644 index 46b0aba237..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java +++ /dev/null @@ -1,63 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; -import gregtech.api.util.GT_LanguageManager; - -public abstract class GT_Item_Casings_Abstract extends ItemBlock { - - protected final String mNoMobsToolTip = GT_LanguageManager - .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block"); - protected final String mNoTileEntityToolTip = GT_LanguageManager - .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!"); - protected final String mCoil01Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil01tooltip", "Base Heating Capacity = 1800 Kelvin"); - protected final String mCoil02Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil02tooltip", "Base Heating Capacity = 2700 Kelvin"); - protected final String mCoil03Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil03tooltip", "Base Heating Capacity = 3600 Kelvin"); - protected final String mCoil04Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil04tooltip", "Base Heating Capacity = 4500 Kelvin"); - protected final String mCoil05Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil05tooltip", "Base Heating Capacity = 5400 Kelvin"); - protected final String mCoil06Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil06tooltip", "Base Heating Capacity = 7200 Kelvin"); - protected final String mCoil07Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil07tooltip", "Base Heating Capacity = 9001 Kelvin"); - protected final String mCoil08Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil08tooltip", "Base Heating Capacity = 9900 Kelvin"); - protected final String mCoil09Tooltip = GT_LanguageManager - .addStringLocalization("gt.coil09tooltip", "Base Heating Capacity = 10800 Kelvin"); - protected final String mBlastProofTooltip = GT_LanguageManager - .addStringLocalization("gt.blastprooftooltip", "This Block is Blast Proof"); - - public GT_Item_Casings_Abstract(Block block) { - super(block); - setMaxDamage(0); - setHasSubtypes(true); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - } - - @Override - public int getMetadata(int aMeta) { - return aMeta; - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - super.addInformation(aStack, aPlayer, aList, aF3_H); - aList.add(this.mNoMobsToolTip); - aList.add(this.mNoTileEntityToolTip); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Concretes.java b/src/main/java/gregtech/common/blocks/GT_Item_Concretes.java deleted file mode 100644 index 44c094aa41..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Concretes.java +++ /dev/null @@ -1,25 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import gregtech.api.util.GT_LanguageManager; - -public class GT_Item_Concretes extends GT_Item_Stones_Abstract { - - private final String mRunFasterToolTip = GT_LanguageManager - .addStringLocalization("gt.runfastertooltip", "You can walk faster on this Block"); - - public GT_Item_Concretes(Block block) { - super(block); - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - super.addInformation(aStack, aPlayer, aList, aF3_H); - aList.add(this.mRunFasterToolTip); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Frames.java b/src/main/java/gregtech/common/blocks/GT_Item_Frames.java deleted file mode 100644 index 002e19f5a6..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Frames.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.util.GT_LanguageManager; - -public class GT_Item_Frames extends ItemBlock { - - public GT_Item_Frames(Block block) { - super(block); - setMaxDamage(0); - setHasSubtypes(true); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - } - - private Block block() { - return this.field_150939_a; - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return this.block() - .getUnlocalizedName() + "." - + getDamage(aStack); - } - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - String aName = super.getItemStackDisplayName(aStack); - if (this.block() instanceof GT_Block_FrameBox) { - aName = Materials.getLocalizedNameForItem(aName, aStack.getItemDamage()); - } - return aName; - } - - @Override - public int getColorFromItemStack(ItemStack aStack, int aPass) { - int meta = aStack.getItemDamage(); - Materials material = GT_Block_FrameBox.getMaterial(meta); - return (material.mRGBa[0] << 16) | (material.mRGBa[1] << 8) | material.mRGBa[2]; - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - aList.add(GT_LanguageManager.getTranslation("gt.blockframes." + aStack.getItemDamage() + ".tooltip")); - aList.add(GT_LanguageManager.getTranslation("gt.blockmachines.gt_frame.desc.format")); - } - - @Override - public int getMetadata(int meta) { - return meta; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Glass1.java b/src/main/java/gregtech/common/blocks/GT_Item_Glass1.java deleted file mode 100644 index e8d0b6c236..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Glass1.java +++ /dev/null @@ -1,36 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import gregtech.api.util.GT_LanguageManager; - -/** - * The glass types are split into separate files because they are registered as regular blocks, and a regular block can - * have - * 16 subtypes at most. - */ -public class GT_Item_Glass1 extends GT_Item_Casings_Abstract { - - protected final String chemicalGlassTooltip = GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + ".0.tooltip", - "Able to resist the most extreme chemical conditions."); - protected final String hawkingGlassTooltip = GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + ".4.tooltip", - "Controls the outward flow of Hawking Radiation to stabilize a black hole."); - - public GT_Item_Glass1(Block block) { - super(block); - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - switch (getDamage(aStack)) { - case 0 -> aList.add(chemicalGlassTooltip); - case 4 -> aList.add(hawkingGlassTooltip); - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Granites.java b/src/main/java/gregtech/common/blocks/GT_Item_Granites.java deleted file mode 100644 index 6e3eb8f12c..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Granites.java +++ /dev/null @@ -1,10 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -public class GT_Item_Granites extends GT_Item_Stones_Abstract { - - public GT_Item_Granites(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java b/src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java deleted file mode 100644 index 52d0db5165..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java +++ /dev/null @@ -1,43 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; -import gregtech.api.util.GT_LanguageManager; - -public class GT_Item_LongDistancePipe extends ItemBlock { - - protected final String mNoMobsToolTip = GT_LanguageManager - .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block"); - protected final String mNoTileEntityToolTip = GT_LanguageManager - .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!"); - - public GT_Item_LongDistancePipe(Block block) { - super(block); - setMaxDamage(0); - setHasSubtypes(true); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - } - - @Override - public int getMetadata(int aMeta) { - return aMeta; - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - super.addInformation(aStack, aPlayer, aList, aF3_H); - aList.add(this.mNoMobsToolTip); - aList.add(this.mNoTileEntityToolTip); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Machines.java b/src/main/java/gregtech/common/blocks/GT_Item_Machines.java deleted file mode 100644 index 059a3fda94..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Machines.java +++ /dev/null @@ -1,430 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.GT_Mod.GT_FML_LOGGER; - -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidContainerItem; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.ISecondaryDescribable; -import gregtech.api.interfaces.metatileentity.IConnectable; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item; -import gregtech.api.util.GT_ItsNotMyFaultException; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperChest; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperTank; - -public class GT_Item_Machines extends ItemBlock implements IFluidContainerItem { - - public GT_Item_Machines(Block block) { - super(block); - setMaxDamage(0); - setHasSubtypes(true); - setCreativeTab(GregTech_API.TAB_GREGTECH); - } - - public static IMetaTileEntity getMetaTileEntity(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) return null; - if (!(aStack.getItem() instanceof GT_Item_Machines)) return null; - if (aStack.getItemDamage() < 0 || aStack.getItemDamage() > GregTech_API.METATILEENTITIES.length) return null; - return GregTech_API.METATILEENTITIES[aStack.getItemDamage()]; - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - try { - final int tDamage = getDamage(aStack); - if ((tDamage <= 0) || (tDamage >= GregTech_API.METATILEENTITIES.length)) { - return; - } - - if (GregTech_API.METATILEENTITIES[tDamage] != null) { - final IGregTechTileEntity tTileEntity = GregTech_API.METATILEENTITIES[tDamage].getBaseMetaTileEntity(); - if (!GregTech_API.sPostloadFinished - && tTileEntity.getMetaTileEntity() instanceof ISecondaryDescribable) { - final String[] tSecondaryDescription = ((ISecondaryDescribable) tTileEntity.getMetaTileEntity()) - .getSecondaryDescription(); - addDescription(null, tSecondaryDescription, tDamage, "_Secondary"); - } - { - final IMetaTileEntity tMetaTileEntity = tTileEntity.getMetaTileEntity(); - final String tSuffix = (tMetaTileEntity instanceof ISecondaryDescribable - && ((ISecondaryDescribable) tMetaTileEntity).isDisplaySecondaryDescription()) ? "_Secondary" - : ""; - addDescription(aList, tTileEntity.getDescription(), tDamage, tSuffix); - tMetaTileEntity.addAdditionalTooltipInformation(aStack, aList); - } - if (tTileEntity.getEUCapacity() > 0L) { - if (tTileEntity.getInputVoltage() > 0L) { - final byte inputTier = GT_Utility.getTier(tTileEntity.getInputVoltage()); - aList.add( - GT_LanguageManager.addStringLocalization("TileEntity_EUp_IN", "Voltage IN: ") - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(tTileEntity.getInputVoltage()) - + " (" - + GT_Utility.getColoredTierNameFromTier(inputTier) - + EnumChatFormatting.GREEN - + ")" - + EnumChatFormatting.GRAY); - } - if (tTileEntity.getOutputVoltage() > 0L) { - final byte outputTier = GT_Utility.getTier(tTileEntity.getOutputVoltage()); - aList.add( - GT_LanguageManager.addStringLocalization("TileEntity_EUp_OUT", "Voltage OUT: ") - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(tTileEntity.getOutputVoltage()) - + " (" - + GT_Utility.getColoredTierNameFromTier(outputTier) - + EnumChatFormatting.GREEN - + ")" - + EnumChatFormatting.GRAY); - } - if (tTileEntity.getOutputAmperage() > 1L) { - aList.add( - GT_LanguageManager.addStringLocalization("TileEntity_EUp_AMOUNT", "Amperage: ") - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(tTileEntity.getOutputAmperage()) - + EnumChatFormatting.GRAY); - } - aList.add( - GT_LanguageManager.addStringLocalization("TileEntity_EUp_STORE", "Capacity: ") - + EnumChatFormatting.BLUE - + GT_Utility.formatNumbers(tTileEntity.getEUCapacity()) - + EnumChatFormatting.GRAY - + " EU"); - } - } - final NBTTagCompound aNBT = aStack.getTagCompound(); - if (aNBT != null) { - if (aNBT.getBoolean("mMuffler")) { - aList.add(GT_LanguageManager.addStringLocalization("GT_TileEntity_MUFFLER", "has Muffler Upgrade")); - } - if (aNBT.getBoolean("mSteamConverter")) { - aList.add( - GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMCONVERTER", "has Steam Upgrade")); - } - int tAmount = 0; - if ((tAmount = aNBT.getByte("mSteamTanks")) > 0) { - aList.add( - tAmount + " " - + GT_LanguageManager - .addStringLocalization("GT_TileEntity_STEAMTANKS", "Steam Tank Upgrades")); - } - - CoverableTileEntity.addInstalledCoversInformation(aNBT, aList); - if (aNBT.hasKey("mColor") && aNBT.getByte("mColor") != -1) { - aList.add( - GT_LanguageManager.addStringLocalization("GT_TileEntity_COLORED", "Colored") + " (" - + Dyes.get(aNBT.getByte("mColor") - 1).formatting - + Dyes.get(aNBT.getByte("mColor") - 1).mName - + EnumChatFormatting.GRAY - + ")"); - } - } - } catch (Throwable e) { - GT_FML_LOGGER.error("addInformation", e); - } - } - - private void addDescription(@Nullable List aList, @Nullable String[] aDescription, int aDamage, - String aSuffix) { - if (aDescription == null) return; - for (int i = 0, tLength = aDescription.length; i < tLength; i++) { - String tDescLine = aDescription[i]; - if (!GT_Utility.isStringValid(tDescLine)) continue; - - String tKey = String.format("TileEntity_DESCRIPTION_%05d%s_Index_%02d", aDamage, aSuffix, i); - if (tDescLine.contains("%%%")) { - final String[] tSplitStrings = tDescLine.split("%%%"); - final StringBuilder tBuffer = new StringBuilder(); - final String[] tRep = new String[tSplitStrings.length / 2]; - for (int j = 0; j < tSplitStrings.length; j++) if (j % 2 == 0) tBuffer.append(tSplitStrings[j]); - else { - tBuffer.append("%s"); - tRep[j / 2] = tSplitStrings[j]; - } - final String tTranslated = String - .format(GT_LanguageManager.addStringLocalization(tKey, tBuffer.toString()), (Object[]) tRep); - if (aList != null) aList.add(tTranslated); - } else { - String tTranslated = GT_LanguageManager.addStringLocalization(tKey, tDescLine); - if (aList != null) aList.add(tTranslated.equals("") ? tDescLine : tTranslated); - } - } - } - - @SideOnly(Side.CLIENT) - public void registerDescription(int aDamage) { - if (aDamage >= GregTech_API.METATILEENTITIES.length) return; - if (GregTech_API.METATILEENTITIES[aDamage] != null) { - final IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aDamage].getBaseMetaTileEntity() - .getMetaTileEntity(); - if (tMetaTileEntity instanceof ISecondaryDescribable) { - final String[] tSecondaryDescription = ((ISecondaryDescribable) tMetaTileEntity) - .getSecondaryDescription(); - addDescription(null, tSecondaryDescription, aDamage, "_Secondary"); - } - addDescription(null, tMetaTileEntity.getDescription(), aDamage, ""); - } - } - - @Override - public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, - int ordinalSide, float hitX, float hitY, float hitZ) { - return false; - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - final short tDamage = (short) getDamage(aStack); - if ((tDamage < 0) || (tDamage >= GregTech_API.METATILEENTITIES.length)) { - return ""; - } - if (GregTech_API.METATILEENTITIES[tDamage] != null) { - return getUnlocalizedName() + "." + GregTech_API.METATILEENTITIES[tDamage].getMetaName(); - } - return ""; - } - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - String aName = super.getItemStackDisplayName(aStack); - final short aDamage = (short) getDamage(aStack); - if (aDamage >= 0 && aDamage < GregTech_API.METATILEENTITIES.length - && GregTech_API.METATILEENTITIES[aDamage] != null) { - Materials aMaterial = null; - if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Item) { - aMaterial = ((GT_MetaPipeEntity_Item) GregTech_API.METATILEENTITIES[aDamage]).mMaterial; - } else if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Fluid) { - aMaterial = ((GT_MetaPipeEntity_Fluid) GregTech_API.METATILEENTITIES[aDamage]).mMaterial; - } else if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Cable) { - aMaterial = ((GT_MetaPipeEntity_Cable) GregTech_API.METATILEENTITIES[aDamage]).mMaterial; - } else if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Frame) { - aMaterial = ((GT_MetaPipeEntity_Frame) GregTech_API.METATILEENTITIES[aDamage]).mMaterial; - } - if (aMaterial != null) { - aName = aMaterial.getLocalizedNameForItem(aName); - } - } - return aName; - } - - @Override - public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - super.onCreated(aStack, aWorld, aPlayer); - final short tDamage = (short) getDamage(aStack); - if ((tDamage < 0) || ((tDamage >= GregTech_API.METATILEENTITIES.length) - && (GregTech_API.METATILEENTITIES[tDamage] != null))) { - GregTech_API.METATILEENTITIES[tDamage].onCreated(aStack, aWorld, aPlayer); - } - } - - @Override - public boolean placeBlockAt(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, - int ordinalSide, float hitX, float hitY, float hitZ, int aMeta) { - final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide); - final short tDamage = (short) getDamage(aStack); - if (tDamage > 0) { - if (GregTech_API.METATILEENTITIES[tDamage] == null) { - return false; - } - final int tMetaData = GregTech_API.METATILEENTITIES[tDamage].getTileEntityBaseType(); - if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, tMetaData, 3)) { - return false; - } - if (aWorld.getBlock(aX, aY, aZ) != this.field_150939_a) { - throw new GT_ItsNotMyFaultException( - "Failed to place Block even though World.setBlock returned true. It COULD be MCPC/Bukkit causing that. In case you really have that installed, don't report this Bug to me, I don't know how to fix it."); - } - if (aWorld.getBlockMetadata(aX, aY, aZ) != tMetaData) { - throw new GT_ItsNotMyFaultException( - "Failed to set the MetaValue of the Block even though World.setBlock returned true. It COULD be MCPC/Bukkit causing that. In case you really have that installed, don't report this Bug to me, I don't know how to fix it."); - } - final IGregTechTileEntity tTileEntity = (IGregTechTileEntity) aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity != null) { - tTileEntity.setInitialValuesAsNBT(tTileEntity.isServerSide() ? aStack.getTagCompound() : null, tDamage); - if (aPlayer != null) { - tTileEntity.setOwnerName(aPlayer.getDisplayName()); - tTileEntity.setOwnerUuid(aPlayer.getUniqueID()); - } - tTileEntity.getMetaTileEntity() - .initDefaultModes(aStack.getTagCompound()); - final ForgeDirection oppositeSide = side.getOpposite(); - if (tTileEntity.getMetaTileEntity() instanceof IConnectable connectable) { - // If we're connectable, try connecting to whatever we're up against - connectable.connect(oppositeSide); - } else if (aPlayer != null && aPlayer.isSneaking()) { - // If we're being placed against something that is connectable, try telling it to connect to us - final IGregTechTileEntity aTileEntity = tTileEntity.getIGregTechTileEntityAtSide(oppositeSide); - if (aTileEntity != null && aTileEntity.getMetaTileEntity() instanceof IConnectable connectable) { - connectable.connect(side); - } - } - } - } else if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, tDamage, 3)) { - return false; - } - if (aWorld.getBlock(aX, aY, aZ) == this.field_150939_a) { - this.field_150939_a.onBlockPlacedBy(aWorld, aX, aY, aZ, aPlayer, aStack); - this.field_150939_a.onPostBlockPlaced(aWorld, aX, aY, aZ, tDamage); - } - return true; - } - - @Override - public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) { - super.onUpdate(aStack, aWorld, aPlayer, aTimer, aIsInHand); - final short tDamage = (short) getDamage(aStack); - final EntityLivingBase tPlayer = (EntityPlayer) aPlayer; - if (GregTech_API.METATILEENTITIES[tDamage] instanceof GT_MetaTileEntity_SuperChest - || GregTech_API.METATILEENTITIES[tDamage] instanceof GT_MetaTileEntity_SuperTank) { - final NBTTagCompound tNBT = aStack.stackTagCompound; - if (tNBT == null) return; - if (tNBT.hasNoTags()) { - aStack.setTagCompound(null); - return; - } - if ((tNBT.hasKey("mItemCount") && tNBT.getInteger("mItemCount") > 0) || (tNBT.hasKey("mFluid") - && FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid")).amount > 64000)) { - final FluidStack tFluid = FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid")); - int tEffectDuration = 1200; - if (tFluid != null) { - final double tFluidAmount = tFluid.amount; - final double tMiddlePoint = 4096000; - final double tSmoothingCoefficient = 2000000; - final int tMaxDuration = 12000; - final double tmp = (tFluidAmount - tMiddlePoint) / tSmoothingCoefficient; - tEffectDuration = (int) (Math.exp(tmp) / (Math.exp(tmp) + Math.exp(-tmp)) * tMaxDuration); - } - tPlayer.addPotionEffect(new PotionEffect(Potion.hunger.id, tEffectDuration, 1)); - tPlayer.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, tEffectDuration, 1)); - tPlayer.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, tEffectDuration, 1)); - tPlayer.addPotionEffect(new PotionEffect(Potion.weakness.id, tEffectDuration, 1)); - } - } - } - - @Override - public FluidStack getFluid(ItemStack container) { - if (container != null) { - final NBTTagCompound tNBT = container.stackTagCompound; - if (tNBT != null && tNBT.hasKey("mFluid", 10)) { - return FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid")); - } - } - return null; - } - - @Override - public int getCapacity(ItemStack container) { - if (container != null) { - final int tDamage = container.getItemDamage(); - final IMetaTileEntity tMetaTile = GregTech_API.METATILEENTITIES[tDamage]; - if (tMetaTile != null) return tMetaTile.getCapacity(); - } - return 0; - } - - @Nullable - private Fluid getLockedFluid(@Nonnull ItemStack container) { - final NBTTagCompound tag = container.stackTagCompound; - if (tag == null) return null; - String lockedName = tag.getString("lockedFluidName"); - if (GT_Utility.isStringInvalid(lockedName)) return null; - return FluidRegistry.getFluid(lockedName); - } - - @Override - public int fill(ItemStack container, FluidStack resource, boolean doFill) { - if (container != null && resource != null) { - final int tDamage = container.getItemDamage(); - final IMetaTileEntity tMetaTile = GregTech_API.METATILEENTITIES[tDamage]; - if (!(tMetaTile instanceof GT_MetaTileEntity_DigitalTankBase)) { - return 0; - } - if (container.stackTagCompound == null) container.stackTagCompound = new NBTTagCompound(); - final FluidStack tStoredFluid = getFluid(container); - final int tCapacity = getCapacity(container); - if (tCapacity <= 0) return 0; - final Fluid lockedFluid = getLockedFluid(container); - if (lockedFluid != null && resource.getFluid() != lockedFluid) { - return 0; - } - if (tStoredFluid != null && tStoredFluid.isFluidEqual(resource)) { - final int tAmount = Math.min(tCapacity - tStoredFluid.amount, resource.amount); - if (doFill) { - final FluidStack tNewFluid = new FluidStack(tStoredFluid, tAmount + tStoredFluid.amount); - container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound())); - } - return tAmount; - } - if (tStoredFluid == null) { - final int tAmount = Math.min(tCapacity, resource.amount); - if (doFill) { - final FluidStack tNewFluid = new FluidStack(resource, tAmount); - container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound())); - } - return tAmount; - } - } - return 0; - } - - @Override - public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) { - if (container != null && container.hasTagCompound()) { - final int tDamage = container.getItemDamage(); - final IMetaTileEntity tMetaTile = GregTech_API.METATILEENTITIES[tDamage]; - if (!(tMetaTile instanceof GT_MetaTileEntity_DigitalTankBase)) { - return null; - } - final FluidStack tStoredFluid = getFluid(container); - if (tStoredFluid != null) { - final int tAmount = Math.min(maxDrain, tStoredFluid.amount); - final FluidStack tNewFluid = new FluidStack(tStoredFluid, tStoredFluid.amount - tAmount); - final FluidStack tOutputFluid = new FluidStack(tStoredFluid, tAmount); - if (doDrain) { - if (tNewFluid.amount <= 0) { - container.stackTagCompound.removeTag("mFluid"); - if (container.stackTagCompound.hasNoTags()) container.setTagCompound(null); - } else { - container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound())); - } - } - return tOutputFluid; - } - } - return null; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Ores.java b/src/main/java/gregtech/common/blocks/GT_Item_Ores.java deleted file mode 100644 index 2ba78572b3..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Ores.java +++ /dev/null @@ -1,81 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; - -import org.apache.commons.lang3.StringUtils; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; - -public class GT_Item_Ores extends ItemBlock { - - public GT_Item_Ores(Block block) { - super(block); - setMaxDamage(0); - setHasSubtypes(true); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - } - - @Override - public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, - int ordinalSide, float hitX, float hitY, float hitZ) { - return false; - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); - } - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - String aName = super.getItemStackDisplayName(aStack); - if (this.field_150939_a instanceof GT_Block_Ores_Abstract) { - aName = Materials.getLocalizedNameForItem(aName, aStack.getItemDamage() % 1000); - } - return aName; - } - - @Override - public boolean placeBlockAt(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, - int ordinalSide, float hitX, float hitY, float hitZ, int aMeta) { - short tDamage = (short) getDamage(aStack); - if (tDamage > 0) { - if (!aWorld.setBlock( - aX, - aY, - aZ, - this.field_150939_a, - GT_TileEntity_Ores.getHarvestData( - tDamage, - ((GT_Block_Ores_Abstract) field_150939_a).getBaseBlockHarvestLevel(aMeta % 16000 / 1000)), - 3)) { - return false; - } - GT_TileEntity_Ores tTileEntity = (GT_TileEntity_Ores) aWorld.getTileEntity(aX, aY, aZ); - tTileEntity.mMetaData = tDamage; - tTileEntity.mNatural = false; - } else if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, 0, 3)) { - return false; - } - if (aWorld.getBlock(aX, aY, aZ) == this.field_150939_a) { - this.field_150939_a.onBlockPlacedBy(aWorld, aX, aY, aZ, aPlayer, aStack); - this.field_150939_a.onPostBlockPlaced(aWorld, aX, aY, aZ, tDamage); - } - return true; - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - String formula = StatCollector - .translateToLocal(field_150939_a.getUnlocalizedName() + '.' + getDamage(aStack) + ".tooltip"); - if (!StringUtils.isBlank(formula)) aList.add(formula); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java deleted file mode 100644 index 5b73108301..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java +++ /dev/null @@ -1,42 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; -import gregtech.api.util.GT_LanguageManager; - -public class GT_Item_Stones_Abstract extends ItemBlock { - - private final String mNoMobsToolTip = GT_LanguageManager - .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block"); - - public GT_Item_Stones_Abstract(Block block) { - super(block); - setMaxDamage(0); - setHasSubtypes(true); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); - } - - @Override - public int getMetadata(int aMeta) { - return aMeta; - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - super.addInformation(aStack, aPlayer, aList, aF3_H); - if (aStack.getItemDamage() % 8 >= 3) { - aList.add(this.mNoMobsToolTip); - } - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Storage.java b/src/main/java/gregtech/common/blocks/GT_Item_Storage.java deleted file mode 100644 index 4ac1b9cdfd..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_Storage.java +++ /dev/null @@ -1,47 +0,0 @@ -package gregtech.common.blocks; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; - -public class GT_Item_Storage extends ItemBlock { - - public GT_Item_Storage(Block block) { - super(block); - setMaxDamage(0); - setHasSubtypes(true); - setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS); - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); - } - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - String aName = super.getItemStackDisplayName(aStack); - if (this.field_150939_a instanceof GT_Block_Metal) { - int aDamage = aStack.getItemDamage(); - if (aDamage >= 0 && aDamage < ((GT_Block_Metal) this.field_150939_a).mMats.length) { - aName = ((GT_Block_Metal) this.field_150939_a).mMats[aDamage].getLocalizedNameForItem(aName); - } - } - return aName; - } - - @Override - public int getMetadata(int aMeta) { - return aMeta; - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - super.addInformation(aStack, aPlayer, aList, aF3_H); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Item_TintedIndustrialGlass.java b/src/main/java/gregtech/common/blocks/GT_Item_TintedIndustrialGlass.java deleted file mode 100644 index 9f633922ac..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Item_TintedIndustrialGlass.java +++ /dev/null @@ -1,10 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.Block; - -public class GT_Item_TintedIndustrialGlass extends GT_Item_Casings_Abstract { - - public GT_Item_TintedIndustrialGlass(Block block) { - super(block); - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Material_Casings.java b/src/main/java/gregtech/common/blocks/GT_Material_Casings.java deleted file mode 100644 index 2fc839768f..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Material_Casings.java +++ /dev/null @@ -1,19 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.material.MapColor; -import net.minecraft.block.material.Material; - -public class GT_Material_Casings extends Material { - - public static final Material INSTANCE = new GT_Material_Casings(); - - private GT_Material_Casings() { - super(MapColor.ironColor); - setRequiresTool(); - } - - @Override - public boolean isOpaque() { - return true; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Material_Machines.java b/src/main/java/gregtech/common/blocks/GT_Material_Machines.java deleted file mode 100644 index df8b57226c..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Material_Machines.java +++ /dev/null @@ -1,19 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.material.MapColor; -import net.minecraft.block.material.Material; - -public class GT_Material_Machines extends Material { - - public GT_Material_Machines() { - super(MapColor.ironColor); - setRequiresTool(); - setImmovableMobility(); - setAdventureModeExempt(); - } - - @Override - public boolean isOpaque() { - return true; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java b/src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java deleted file mode 100644 index 2e3301bb60..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java +++ /dev/null @@ -1,18 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.block.material.MapColor; -import net.minecraft.block.material.Material; - -public class GT_Material_Reinforced extends Material { - - public GT_Material_Reinforced() { - super(MapColor.stoneColor); - setRequiresTool(); - setAdventureModeExempt(); - } - - @Override - public boolean isOpaque() { - return true; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_Packet_Ores.java b/src/main/java/gregtech/common/blocks/GT_Packet_Ores.java deleted file mode 100644 index a65ac47c44..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_Packet_Ores.java +++ /dev/null @@ -1,62 +0,0 @@ -package gregtech.common.blocks; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.net.GT_PacketTypes; -import gregtech.api.net.GT_Packet_New; -import io.netty.buffer.ByteBuf; - -public class GT_Packet_Ores extends GT_Packet_New { - - private int mX; - private int mZ; - private short mY; - private short mMetaData; - - public GT_Packet_Ores() { - super(true); - } - - public GT_Packet_Ores(int aX, short aY, int aZ, short aMetaData) { - super(false); - this.mX = aX; - this.mY = aY; - this.mZ = aZ; - this.mMetaData = aMetaData; - } - - @Override - public void encode(ByteBuf aOut) { - aOut.writeInt(this.mX); - aOut.writeShort(this.mY); - aOut.writeInt(this.mZ); - aOut.writeShort(this.mMetaData); - } - - @Override - public GT_Packet_New decode(ByteArrayDataInput aData) { - return new GT_Packet_Ores(aData.readInt(), aData.readShort(), aData.readInt(), aData.readShort()); - } - - @Override - public void process(IBlockAccess aWorld) { - if (aWorld != null) { - TileEntity tTileEntity = aWorld.getTileEntity(this.mX, this.mY, this.mZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - ((GT_TileEntity_Ores) tTileEntity).mMetaData = this.mMetaData; - } - if (((aWorld instanceof World)) && (((World) aWorld).isRemote)) { - ((World) aWorld).markBlockForUpdate(this.mX, this.mY, this.mZ); - } - } - } - - @Override - public byte getPacketID() { - return GT_PacketTypes.ORES.id; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java deleted file mode 100644 index de69c011a2..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java +++ /dev/null @@ -1,486 +0,0 @@ -package gregtech.common.blocks; - -import static gregtech.api.enums.TextureSet.SET_NONE; - -import java.util.ArrayList; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.Packet; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import org.jetbrains.annotations.NotNull; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity; -import gregtech.api.objects.XSTR; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; - -public class GT_TileEntity_Ores extends TileEntity implements IAllSidedTexturedTileEntity { - - public short mMetaData = 0; - protected static boolean shouldFortune = false; - protected static boolean shouldSilkTouch = false; - public boolean mNatural = false; - public boolean mBlocked = true; - public boolean mBlockedChecked = false; - private short mMetadataForCachedTexture = -1; - private ITexture[] mCachedTexture; - - public static byte getHarvestData(short aMetaData, int aBaseBlockHarvestLevel) { - Materials aMaterial = GregTech_API.sGeneratedMaterials[(aMetaData % 1000)]; - byte tByte = aMaterial == null ? 0 - : (byte) Math - .max(aBaseBlockHarvestLevel, Math.min(7, aMaterial.mToolQuality - (aMetaData < 16000 ? 0 : 1))); - if (GT_Mod.gregtechproxy.mChangeHarvestLevels) { - tByte = aMaterial == null ? 0 - : (byte) Math.max( - aBaseBlockHarvestLevel, - Math.min( - GT_Mod.gregtechproxy.mMaxHarvestLevel, - GT_Mod.gregtechproxy.mHarvestLevel[aMaterial.mMetaItemSubID] - (aMetaData < 16000 ? 0 : 1))); - } - return tByte; - } - - public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre) { - return setOreBlock(aWorld, aX, aY, aZ, aMetaData, isSmallOre, true); - } - - public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre, - boolean air) { - if (!air) { - aY = Math.min(aWorld.getActualHeight(), Math.max(aY, 1)); - } - Block tBlock = aWorld.getBlock(aX, aY, aZ); - Block tOreBlock = GregTech_API.sBlockOres1; - int BlockMeta = aWorld.getBlockMetadata(aX, aY, aZ); - String BlockName = tBlock.getUnlocalizedName(); - aMetaData += isSmallOre ? 16000 : 0; - if ((aMetaData > 0) && ((tBlock != Blocks.air) || air)) { - if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone)) { - // Do nothing, stone background is default background. - // Do this comparison first since stone is most common - } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack)) { - aMetaData += 1000; - } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone)) { - aMetaData += 2000; - } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites)) { - if (tBlock == GregTech_API.sBlockGranites) { - if (aWorld.getBlockMetadata(aX, aY, aZ) < 8) { - aMetaData += 3000; - } else { - aMetaData += 4000; - } - } else { - aMetaData += 3000; - } - } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockStones)) { - if (tBlock == GregTech_API.sBlockStones) { - if (aWorld.getBlockMetadata(aX, aY, aZ) < 8) { - aMetaData += 5000; - } else { - aMetaData += 6000; - } - } else { - aMetaData += 5000; - } - } else if (BlockName.equals("tile.igneousStone")) { - if (GregTech_API.sBlockOresUb1 != null) { - tOreBlock = GregTech_API.sBlockOresUb1; - aMetaData += (BlockMeta * 1000); - // GT_FML_LOGGER.info("Block changed to UB1"); - } - } else if (BlockName.equals("tile.metamorphicStone")) { - if (GregTech_API.sBlockOresUb2 != null) { - tOreBlock = GregTech_API.sBlockOresUb2; - aMetaData += (BlockMeta * 1000); - // GT_FML_LOGGER.info("Block changed to UB2"); - } - } else if (BlockName.equals("tile.sedimentaryStone")) { - if (GregTech_API.sBlockOresUb3 != null) { - tOreBlock = GregTech_API.sBlockOresUb3; - aMetaData += (BlockMeta * 1000); - // GT_FML_LOGGER.info("Block changed to UB3"); - } - } else { - return false; - } - // GT_FML_LOGGER.info(tOreBlock); - aWorld.setBlock( - aX, - aY, - aZ, - tOreBlock, - getHarvestData( - (short) aMetaData, - ((GT_Block_Ores_Abstract) tOreBlock).getBaseBlockHarvestLevel(aMetaData % 16000 / 1000)), - 0); - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - ((GT_TileEntity_Ores) tTileEntity).mMetaData = ((short) aMetaData); - ((GT_TileEntity_Ores) tTileEntity).mNatural = true; - } - return true; - } - return false; - } - - @Override - public void readFromNBT(NBTTagCompound aNBT) { - super.readFromNBT(aNBT); - this.mMetaData = aNBT.getShort("m"); - this.mNatural = aNBT.getBoolean("n"); - } - - @Override - public void writeToNBT(NBTTagCompound aNBT) { - super.writeToNBT(aNBT); - aNBT.setShort("m", this.mMetaData); - aNBT.setBoolean("n", this.mNatural); - } - - public void onUpdated() { - if ((!this.worldObj.isRemote) && (this.mBlocked)) { - this.mBlocked = false; - GT_Values.NW.sendPacketToAllPlayersInRange( - this.worldObj, - new GT_Packet_Ores(this.xCoord, (short) this.yCoord, this.zCoord, this.mMetaData), - this.xCoord, - this.zCoord); - } - } - - @Override - public Packet getDescriptionPacket() { - if (!this.worldObj.isRemote) { - boolean sendUpdate = mBlockedChecked ? !mBlocked : checkBlocked(); - if (sendUpdate) { - GT_Values.NW.sendPacketToAllPlayersInRange( - this.worldObj, - new GT_Packet_Ores(this.xCoord, (short) this.yCoord, this.zCoord, this.mMetaData), - this.xCoord, - this.zCoord); - } - } - return null; - } - - private boolean checkBlocked() { - // this is called very frequently and is performance critical. unroll the loop. - mBlockedChecked = true; - if (!worldObj.blockExists(xCoord + 1, yCoord, zCoord)) { - mBlockedChecked = false; - } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord + 1, yCoord, zCoord)) { - mBlocked = false; - return true; - } - if (!worldObj.blockExists(xCoord - 1, yCoord, zCoord)) { - mBlockedChecked = false; - } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord - 1, yCoord, zCoord)) { - mBlocked = false; - return true; - } - if (!worldObj.blockExists(xCoord, yCoord + 1, zCoord)) { - mBlockedChecked = false; - } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord + 1, zCoord)) { - mBlocked = false; - return true; - } - if (!worldObj.blockExists(xCoord, yCoord - 1, zCoord)) { - mBlockedChecked = false; - } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord - 1, zCoord)) { - mBlocked = false; - return true; - } - if (!worldObj.blockExists(xCoord, yCoord, zCoord + 1)) { - mBlockedChecked = false; - } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord, zCoord + 1)) { - mBlocked = false; - return true; - } - if (!worldObj.blockExists(xCoord, yCoord, zCoord - 1)) { - mBlockedChecked = false; - } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord, zCoord - 1)) { - mBlocked = false; - return true; - } - mBlocked = true; - return false; - } - - public void overrideOreBlockMaterial(Block aOverridingStoneBlock, byte aOverridingStoneMeta) { - if (this.worldObj == null || blockType == null) return; - this.mMetaData = ((short) (int) (this.mMetaData % 1000L + this.mMetaData / 16000L * 16000L)); - if (aOverridingStoneBlock - .isReplaceableOreGen(this.worldObj, this.xCoord, this.yCoord, this.zCoord, Blocks.netherrack)) { - this.mMetaData = ((short) (this.mMetaData + 1000)); - } else if (aOverridingStoneBlock - .isReplaceableOreGen(this.worldObj, this.xCoord, this.yCoord, this.zCoord, Blocks.end_stone)) { - this.mMetaData = ((short) (this.mMetaData + 2000)); - } else if (aOverridingStoneBlock.isReplaceableOreGen( - this.worldObj, - this.xCoord, - this.yCoord, - this.zCoord, - GregTech_API.sBlockGranites)) { - if (aOverridingStoneBlock == GregTech_API.sBlockGranites) { - if (aOverridingStoneMeta < 8) { - this.mMetaData = ((short) (this.mMetaData + 3000)); - } else { - this.mMetaData = ((short) (this.mMetaData + 4000)); - } - } else { - this.mMetaData = ((short) (this.mMetaData + 3000)); - } - } else if (aOverridingStoneBlock.isReplaceableOreGen( - this.worldObj, - this.xCoord, - this.yCoord, - this.zCoord, - GregTech_API.sBlockStones)) { - if (aOverridingStoneBlock == GregTech_API.sBlockStones) { - if (aOverridingStoneMeta < 8) { - this.mMetaData = ((short) (this.mMetaData + 5000)); - } else { - this.mMetaData = ((short) (this.mMetaData + 6000)); - } - } else { - this.mMetaData = ((short) (this.mMetaData + 5000)); - } - } - this.worldObj.setBlockMetadataWithNotify( - this.xCoord, - this.yCoord, - this.zCoord, - getHarvestData( - this.mMetaData, - ((GT_Block_Ores_Abstract) blockType).getBaseBlockHarvestLevel(mMetaData % 16000 / 1000)), - 0); - } - - public void convertOreBlock(World aWorld, int aX, int aY, int aZ) { - short aMeta = ((short) (this.mMetaData % 1000 + (this.mMetaData / 16000 * 16000))); - aWorld.setBlock(aX, aY, aZ, GregTech_API.sBlockOres1); - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof GT_TileEntity_Ores) { - ((GT_TileEntity_Ores) tTileEntity).mMetaData = aMeta; - this.worldObj.setBlockMetadataWithNotify( - this.xCoord, - this.yCoord, - this.zCoord, - getHarvestData( - aMeta, - ((GT_Block_Ores_Abstract) tTileEntity.blockType).getBaseBlockHarvestLevel(aMeta % 16000 / 1000)), - 0); - } - } - - public short getMetaData() { - return this.mMetaData; - } - - @Override - public boolean canUpdate() { - return false; - } - - public ArrayList getDrops(Block aDroppedOre, int aFortune) { - ArrayList rList = new ArrayList<>(); - if (this.mMetaData <= 0) { - rList.add(new ItemStack(Blocks.cobblestone, 1, 0)); - return rList; - } - Materials aOreMaterial = GregTech_API.sGeneratedMaterials[(this.mMetaData % 1000)]; - if (this.mMetaData < 16000) { - boolean tIsRich = false; - - // For Sake of god of balance! - - // Dense ore - - // NetherOre - if (GT_Mod.gregtechproxy.mNetherOreYieldMultiplier && !tIsRich) { - tIsRich = (this.mMetaData >= 1000 && this.mMetaData < 2000); - } - // EndOre - if (GT_Mod.gregtechproxy.mEndOreYieldMultiplier && !tIsRich) { - tIsRich = (this.mMetaData >= 2000 && this.mMetaData < 3000); - } - - // Silk Touch - if (shouldSilkTouch) { - rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData)); - - } else { - switch (GT_Mod.gregtechproxy.oreDropSystem) { - case Item -> { - rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, (tIsRich ? 2 : 1))); - } - // TODO: Test - case FortuneItem -> { - // if shouldFortune and isNatural then get fortune drops - // if not shouldFortune or not isNatural then get normal drops - // if not shouldFortune and isNatural then get normal drops - // if shouldFortune and not isNatural then get normal drops - if (shouldFortune && this.mNatural && aFortune > 0) { - int aMinAmount = 1; - // Max applicable fortune - if (aFortune > 3) aFortune = 3; - int amount = aMinAmount - + Math.max(worldObj.rand.nextInt(aFortune * (tIsRich ? 2 : 1) + 2) - 1, 0); - for (int i = 0; i < amount; i++) { - rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1)); - } - } else { - for (int i = 0; i < (tIsRich ? 2 : 1); i++) { - rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1)); - } - } - } - case UnifiedBlock -> { - // Unified ore - for (int i = 0; i < (tIsRich ? 2 : 1); i++) { - rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData % 1000)); - } - } - case PerDimBlock -> { - // Per Dimension ore - if (tIsRich) { - rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData)); - } else { - rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData % 1000)); - } - } - case Block -> { - // Regular ore - rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData)); - } - } - } - return rList; - } - - // Everyone gets a free small fortune boost - aFortune += 1; - if (!this.mNatural) { - aFortune = 0; - } - if (aOreMaterial != null) { - Random tRandom = new XSTR(this.xCoord ^ this.yCoord ^ this.zCoord); - ArrayList tSelector = new ArrayList<>(); - - Materials aMaterial = aOreMaterial.mOreReplacement; - - ItemStack tStack = GT_OreDictUnificator - .get(OrePrefixes.gemExquisite, aMaterial, GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L), 1L); - if (tStack != null) { - for (int i = 0; i < 1; i++) { - tSelector.add(tStack); - } - } - tStack = GT_OreDictUnificator - .get(OrePrefixes.gemFlawless, aMaterial, GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L), 1L); - if (tStack != null) { - for (int i = 0; i < 2; i++) { - tSelector.add(tStack); - } - } - tStack = GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L); - if (tStack != null) { - for (int i = 0; i < 12; i++) { - tSelector.add(tStack); - } - } - tStack = GT_OreDictUnificator.get( - OrePrefixes.gemFlawed, - aMaterial, - GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1L), - 1L); - if (tStack != null) { - for (int i = 0; i < 5; i++) { - tSelector.add(tStack); - } - } - tStack = GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1L); - if (tStack != null) { - for (int i = 0; i < 10; i++) { - tSelector.add(tStack); - } - } - tStack = GT_OreDictUnificator.get( - OrePrefixes.gemChipped, - aMaterial, - GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L), - 1L); - if (tStack != null) { - for (int i = 0; i < 5; i++) { - tSelector.add(tStack); - } - } - tStack = GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L); - if (tStack != null) { - for (int i = 0; i < 10; i++) { - tSelector.add(tStack); - } - } - if (!tSelector.isEmpty()) { - int i = 0; - for (int j = Math.max( - 1, - aMaterial.mOreMultiplier - + (aFortune > 0 ? tRandom.nextInt(1 + aFortune * aMaterial.mOreMultiplier) : 0) / 2); i - < j; i++) { - rList.add(GT_Utility.copyAmount(1, tSelector.get(tRandom.nextInt(tSelector.size())))); - } - } - if (tRandom.nextInt(3 + aFortune) > 1) { - Materials dustMat = ((GT_Block_Ores_Abstract) aDroppedOre).getDroppedDusts()[this.mMetaData / 1000 - % 16]; - if (dustMat != null) rList.add( - GT_OreDictUnificator - .get(tRandom.nextInt(3) > 0 ? OrePrefixes.dustImpure : OrePrefixes.dust, dustMat, 1L)); - } - } - return rList; - } - - @Override - public ITexture[] getTexture(Block aBlock) { - if (mMetadataForCachedTexture == mMetaData && mCachedTexture != null) return mCachedTexture; - - mMetadataForCachedTexture = mMetaData; - mCachedTexture = getTextureInternal(aBlock); - return mCachedTexture; - } - - private ITexture @NotNull [] getTextureInternal(Block aBlock) { - Materials aMaterial = GregTech_API.sGeneratedMaterials[(this.mMetaData % 1000)]; - if ((aMaterial != null) && (this.mMetaData < 32000) && (aBlock instanceof GT_Block_Ores_Abstract)) { - ITexture iTexture = TextureFactory.builder() - .addIcon( - aMaterial.mIconSet.mTextures[this.mMetaData / 16000 == 0 ? OrePrefixes.ore.mTextureIndex - : OrePrefixes.oreSmall.mTextureIndex]) - .setRGBA(aMaterial.mRGBa) - .stdOrient() - .build(); - return new ITexture[] { ((GT_Block_Ores_Abstract) aBlock).getTextureSet()[((this.mMetaData / 1000) % 16)], - iTexture }; - } - return new ITexture[] { TextureFactory.of(Blocks.stone, 0), TextureFactory.builder() - .addIcon(SET_NONE.mTextures[OrePrefixes.ore.mTextureIndex]) - .stdOrient() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/blocks/GT_WormholeRenderBlock.java b/src/main/java/gregtech/common/blocks/GT_WormholeRenderBlock.java deleted file mode 100644 index 1c6e434477..0000000000 --- a/src/main/java/gregtech/common/blocks/GT_WormholeRenderBlock.java +++ /dev/null @@ -1,75 +0,0 @@ -package gregtech.common.blocks; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.common.tileentities.render.TileWormhole; - -public class GT_WormholeRenderBlock extends Block { - - public GT_WormholeRenderBlock() { - super(Material.iron); - this.setResistance(20f); - this.setHardness(-1.0f); - // this.setCreativeTab(TecTech.creativeTabTecTech); - this.setBlockName("WormholeRenderer"); - this.setLightLevel(100.0f); - GameRegistry.registerBlock(this, getUnlocalizedName()); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT"); - } - - @Override - public String getUnlocalizedName() { - return "gt.wormholerenderer"; - } - - @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 TileWormhole(); - } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) { - return new ArrayList<>(); - } - - @Override - public boolean isCollidable() { - return true; - } - -} diff --git a/src/main/java/gregtech/common/blocks/ItemBlockLaser.java b/src/main/java/gregtech/common/blocks/ItemBlockLaser.java new file mode 100644 index 0000000000..c8b4d4ce06 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemBlockLaser.java @@ -0,0 +1,24 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import gregtech.api.util.GTLanguageManager; + +public class ItemBlockLaser extends ItemBlock { + + public ItemBlockLaser(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean f3_h) { + tooltip.add( + GTLanguageManager + .addStringLocalization("gt.laserplatingtooltip", "Engineered to withstand extreme temperatures")); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings1.java b/src/main/java/gregtech/common/blocks/ItemCasings1.java new file mode 100644 index 0000000000..ad1c8c09e1 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings1.java @@ -0,0 +1,14 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings1 extends ItemCasingsAbstract { + + public ItemCasings1(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings10.java b/src/main/java/gregtech/common/blocks/ItemCasings10.java new file mode 100644 index 0000000000..0931987cd4 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings10.java @@ -0,0 +1,14 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings10 extends ItemCasingsAbstract { + + public ItemCasings10(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings11.java b/src/main/java/gregtech/common/blocks/ItemCasings11.java new file mode 100644 index 0000000000..5cae92a55d --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings11.java @@ -0,0 +1,14 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings11 extends ItemCasingsAbstract { + + public ItemCasings11(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings2.java b/src/main/java/gregtech/common/blocks/ItemCasings2.java new file mode 100644 index 0000000000..b0981c0dc3 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings2.java @@ -0,0 +1,26 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings2 extends ItemCasingsAbstract { + + public ItemCasings2(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + super.addInformation(aStack, aPlayer, aList, aF3_H); + if (getDamage(aStack) == 8) { + aList.add(this.mBlastProofTooltip); + } + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings3.java b/src/main/java/gregtech/common/blocks/ItemCasings3.java new file mode 100644 index 0000000000..737c9e5145 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings3.java @@ -0,0 +1,14 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings3 extends ItemCasingsAbstract { + + public ItemCasings3(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings4.java b/src/main/java/gregtech/common/blocks/ItemCasings4.java new file mode 100644 index 0000000000..97d160105a --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings4.java @@ -0,0 +1,14 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings4 extends ItemCasingsAbstract { + + public ItemCasings4(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings5.java b/src/main/java/gregtech/common/blocks/ItemCasings5.java new file mode 100644 index 0000000000..4192fb2a64 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings5.java @@ -0,0 +1,36 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.util.GTLanguageManager; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings5 extends ItemCasingsAbstract { + + public ItemCasings5(Block block) { + super(block); + } + + protected static final String mCoilHeatTooltip = GTLanguageManager + .addStringLocalization("gt.coilheattooltip", "Base Heating Capacity = "); + protected static final String mCoilUnitTooltip = GTLanguageManager + .addStringLocalization("gt.coilunittooltip", " Kelvin"); + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + super.addInformation(aStack, aPlayer, aList, aF3_H); + HeatingCoilLevel coilLevel = BlockCasings5.getCoilHeatFromDamage(aStack.getItemDamage()); + aList.add(mCoilHeatTooltip + coilLevel.getHeat() + mCoilUnitTooltip); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings6.java b/src/main/java/gregtech/common/blocks/ItemCasings6.java new file mode 100644 index 0000000000..36a25f7796 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings6.java @@ -0,0 +1,14 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings6 extends ItemCasingsAbstract { + + public ItemCasings6(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings8.java b/src/main/java/gregtech/common/blocks/ItemCasings8.java new file mode 100644 index 0000000000..7183d78986 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings8.java @@ -0,0 +1,14 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings8 extends ItemCasingsAbstract { + + public ItemCasings8(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasings9.java b/src/main/java/gregtech/common/blocks/ItemCasings9.java new file mode 100644 index 0000000000..c4ae95a2f7 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasings9.java @@ -0,0 +1,28 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +/** + * The casings are split into separate files because they are registered as regular blocks, and a regular block can have + * 16 subtypes at most. + */ +public class ItemCasings9 extends ItemCasingsAbstract { + + public ItemCasings9(Block block) { + super(block); + } + + /* + * @Override + * public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + * // Add tooltip info if it was given + * String localizedTooltip = GTLanguageManager.getTranslation(aStack.getUnlocalizedName() + ".tooltip"); + * // getTranslation returns the key if no translation was found, but this just means + * // no tooltip was set. + * if (localizedTooltip.startsWith("gt.")) { + * aList.add(localizedTooltip); + * } + * super.addInformation(aStack, aPlayer, aList, aF3_H); + * } + */ +} diff --git a/src/main/java/gregtech/common/blocks/ItemCasingsAbstract.java b/src/main/java/gregtech/common/blocks/ItemCasingsAbstract.java new file mode 100644 index 0000000000..577b1fb821 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCasingsAbstract.java @@ -0,0 +1,63 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.util.GTLanguageManager; + +public abstract class ItemCasingsAbstract extends ItemBlock { + + protected final String mNoMobsToolTip = GTLanguageManager + .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block"); + protected final String mNoTileEntityToolTip = GTLanguageManager + .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!"); + protected final String mCoil01Tooltip = GTLanguageManager + .addStringLocalization("gt.coil01tooltip", "Base Heating Capacity = 1800 Kelvin"); + protected final String mCoil02Tooltip = GTLanguageManager + .addStringLocalization("gt.coil02tooltip", "Base Heating Capacity = 2700 Kelvin"); + protected final String mCoil03Tooltip = GTLanguageManager + .addStringLocalization("gt.coil03tooltip", "Base Heating Capacity = 3600 Kelvin"); + protected final String mCoil04Tooltip = GTLanguageManager + .addStringLocalization("gt.coil04tooltip", "Base Heating Capacity = 4500 Kelvin"); + protected final String mCoil05Tooltip = GTLanguageManager + .addStringLocalization("gt.coil05tooltip", "Base Heating Capacity = 5400 Kelvin"); + protected final String mCoil06Tooltip = GTLanguageManager + .addStringLocalization("gt.coil06tooltip", "Base Heating Capacity = 7200 Kelvin"); + protected final String mCoil07Tooltip = GTLanguageManager + .addStringLocalization("gt.coil07tooltip", "Base Heating Capacity = 9001 Kelvin"); + protected final String mCoil08Tooltip = GTLanguageManager + .addStringLocalization("gt.coil08tooltip", "Base Heating Capacity = 9900 Kelvin"); + protected final String mCoil09Tooltip = GTLanguageManager + .addStringLocalization("gt.coil09tooltip", "Base Heating Capacity = 10800 Kelvin"); + protected final String mBlastProofTooltip = GTLanguageManager + .addStringLocalization("gt.blastprooftooltip", "This Block is Blast Proof"); + + public ItemCasingsAbstract(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + } + + @Override + public int getMetadata(int aMeta) { + return aMeta; + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + super.addInformation(aStack, aPlayer, aList, aF3_H); + aList.add(this.mNoMobsToolTip); + aList.add(this.mNoTileEntityToolTip); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemConcretes.java b/src/main/java/gregtech/common/blocks/ItemConcretes.java new file mode 100644 index 0000000000..64f778d5d4 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemConcretes.java @@ -0,0 +1,25 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import gregtech.api.util.GTLanguageManager; + +public class ItemConcretes extends ItemStonesAbstract { + + private final String mRunFasterToolTip = GTLanguageManager + .addStringLocalization("gt.runfastertooltip", "You can walk faster on this Block"); + + public ItemConcretes(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + super.addInformation(aStack, aPlayer, aList, aF3_H); + aList.add(this.mRunFasterToolTip); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemCyclotronCasings.java b/src/main/java/gregtech/common/blocks/ItemCyclotronCasings.java new file mode 100644 index 0000000000..febd101e0f --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemCyclotronCasings.java @@ -0,0 +1,10 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +public class ItemCyclotronCasings extends ItemCasingsAbstract { + + public ItemCyclotronCasings(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemFrames.java b/src/main/java/gregtech/common/blocks/ItemFrames.java new file mode 100644 index 0000000000..daa6ca2d2e --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemFrames.java @@ -0,0 +1,60 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.util.GTLanguageManager; + +public class ItemFrames extends ItemBlock { + + public ItemFrames(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + } + + private Block block() { + return this.field_150939_a; + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return this.block() + .getUnlocalizedName() + "." + + getDamage(aStack); + } + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + String aName = super.getItemStackDisplayName(aStack); + if (this.block() instanceof BlockFrameBox) { + aName = Materials.getLocalizedNameForItem(aName, aStack.getItemDamage()); + } + return aName; + } + + @Override + public int getColorFromItemStack(ItemStack aStack, int aPass) { + int meta = aStack.getItemDamage(); + Materials material = BlockFrameBox.getMaterial(meta); + return (material.mRGBa[0] << 16) | (material.mRGBa[1] << 8) | material.mRGBa[2]; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + aList.add(GTLanguageManager.getTranslation("gt.blockframes." + aStack.getItemDamage() + ".tooltip")); + aList.add(GTLanguageManager.getTranslation("gt.blockmachines.gt_frame.desc.format")); + } + + @Override + public int getMetadata(int meta) { + return meta; + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemGlass1.java b/src/main/java/gregtech/common/blocks/ItemGlass1.java new file mode 100644 index 0000000000..5605bba48d --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemGlass1.java @@ -0,0 +1,36 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import gregtech.api.util.GTLanguageManager; + +/** + * The glass types are split into separate files because they are registered as regular blocks, and a regular block can + * have + * 16 subtypes at most. + */ +public class ItemGlass1 extends ItemCasingsAbstract { + + protected final String chemicalGlassTooltip = GTLanguageManager.addStringLocalization( + getUnlocalizedName() + ".0.tooltip", + "Able to resist the most extreme chemical conditions."); + protected final String hawkingGlassTooltip = GTLanguageManager.addStringLocalization( + getUnlocalizedName() + ".4.tooltip", + "Controls the outward flow of Hawking Radiation to stabilize a black hole."); + + public ItemGlass1(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + switch (getDamage(aStack)) { + case 0 -> aList.add(chemicalGlassTooltip); + case 4 -> aList.add(hawkingGlassTooltip); + } + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemGranites.java b/src/main/java/gregtech/common/blocks/ItemGranites.java new file mode 100644 index 0000000000..090ebc2a5a --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemGranites.java @@ -0,0 +1,10 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +public class ItemGranites extends ItemStonesAbstract { + + public ItemGranites(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemLongDistancePipe.java b/src/main/java/gregtech/common/blocks/ItemLongDistancePipe.java new file mode 100644 index 0000000000..55f5c2c768 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemLongDistancePipe.java @@ -0,0 +1,43 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.util.GTLanguageManager; + +public class ItemLongDistancePipe extends ItemBlock { + + protected final String mNoMobsToolTip = GTLanguageManager + .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block"); + protected final String mNoTileEntityToolTip = GTLanguageManager + .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!"); + + public ItemLongDistancePipe(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + } + + @Override + public int getMetadata(int aMeta) { + return aMeta; + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + super.addInformation(aStack, aPlayer, aList, aF3_H); + aList.add(this.mNoMobsToolTip); + aList.add(this.mNoTileEntityToolTip); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemMachines.java b/src/main/java/gregtech/common/blocks/ItemMachines.java new file mode 100644 index 0000000000..ff031c8456 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemMachines.java @@ -0,0 +1,430 @@ +package gregtech.common.blocks; + +import static gregtech.GTMod.GT_FML_LOGGER; + +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.ISecondaryDescribable; +import gregtech.api.interfaces.metatileentity.IConnectable; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.CoverableTileEntity; +import gregtech.api.metatileentity.implementations.MTECable; +import gregtech.api.metatileentity.implementations.MTEFluid; +import gregtech.api.metatileentity.implementations.MTEFrame; +import gregtech.api.metatileentity.implementations.MTEItem; +import gregtech.api.util.GTItsNotMyFaultException; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.common.tileentities.storage.MTEDigitalTankBase; +import gregtech.common.tileentities.storage.MTESuperChest; +import gregtech.common.tileentities.storage.MTESuperTank; + +public class ItemMachines extends ItemBlock implements IFluidContainerItem { + + public ItemMachines(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + setCreativeTab(GregTechAPI.TAB_GREGTECH); + } + + public static IMetaTileEntity getMetaTileEntity(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) return null; + if (!(aStack.getItem() instanceof ItemMachines)) return null; + if (aStack.getItemDamage() < 0 || aStack.getItemDamage() > GregTechAPI.METATILEENTITIES.length) return null; + return GregTechAPI.METATILEENTITIES[aStack.getItemDamage()]; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + try { + final int tDamage = getDamage(aStack); + if ((tDamage <= 0) || (tDamage >= GregTechAPI.METATILEENTITIES.length)) { + return; + } + + if (GregTechAPI.METATILEENTITIES[tDamage] != null) { + final IGregTechTileEntity tTileEntity = GregTechAPI.METATILEENTITIES[tDamage].getBaseMetaTileEntity(); + if (!GregTechAPI.sPostloadFinished + && tTileEntity.getMetaTileEntity() instanceof ISecondaryDescribable) { + final String[] tSecondaryDescription = ((ISecondaryDescribable) tTileEntity.getMetaTileEntity()) + .getSecondaryDescription(); + addDescription(null, tSecondaryDescription, tDamage, "_Secondary"); + } + { + final IMetaTileEntity tMetaTileEntity = tTileEntity.getMetaTileEntity(); + final String tSuffix = (tMetaTileEntity instanceof ISecondaryDescribable + && ((ISecondaryDescribable) tMetaTileEntity).isDisplaySecondaryDescription()) ? "_Secondary" + : ""; + addDescription(aList, tTileEntity.getDescription(), tDamage, tSuffix); + tMetaTileEntity.addAdditionalTooltipInformation(aStack, aList); + } + if (tTileEntity.getEUCapacity() > 0L) { + if (tTileEntity.getInputVoltage() > 0L) { + final byte inputTier = GTUtility.getTier(tTileEntity.getInputVoltage()); + aList.add( + GTLanguageManager.addStringLocalization("TileEntity_EUp_IN", "Voltage IN: ") + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(tTileEntity.getInputVoltage()) + + " (" + + GTUtility.getColoredTierNameFromTier(inputTier) + + EnumChatFormatting.GREEN + + ")" + + EnumChatFormatting.GRAY); + } + if (tTileEntity.getOutputVoltage() > 0L) { + final byte outputTier = GTUtility.getTier(tTileEntity.getOutputVoltage()); + aList.add( + GTLanguageManager.addStringLocalization("TileEntity_EUp_OUT", "Voltage OUT: ") + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(tTileEntity.getOutputVoltage()) + + " (" + + GTUtility.getColoredTierNameFromTier(outputTier) + + EnumChatFormatting.GREEN + + ")" + + EnumChatFormatting.GRAY); + } + if (tTileEntity.getOutputAmperage() > 1L) { + aList.add( + GTLanguageManager.addStringLocalization("TileEntity_EUp_AMOUNT", "Amperage: ") + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(tTileEntity.getOutputAmperage()) + + EnumChatFormatting.GRAY); + } + aList.add( + GTLanguageManager.addStringLocalization("TileEntity_EUp_STORE", "Capacity: ") + + EnumChatFormatting.BLUE + + GTUtility.formatNumbers(tTileEntity.getEUCapacity()) + + EnumChatFormatting.GRAY + + " EU"); + } + } + final NBTTagCompound aNBT = aStack.getTagCompound(); + if (aNBT != null) { + if (aNBT.getBoolean("mMuffler")) { + aList.add(GTLanguageManager.addStringLocalization("GT_TileEntity_MUFFLER", "has Muffler Upgrade")); + } + if (aNBT.getBoolean("mSteamConverter")) { + aList.add( + GTLanguageManager.addStringLocalization("GT_TileEntity_STEAMCONVERTER", "has Steam Upgrade")); + } + int tAmount = 0; + if ((tAmount = aNBT.getByte("mSteamTanks")) > 0) { + aList.add( + tAmount + " " + + GTLanguageManager + .addStringLocalization("GT_TileEntity_STEAMTANKS", "Steam Tank Upgrades")); + } + + CoverableTileEntity.addInstalledCoversInformation(aNBT, aList); + if (aNBT.hasKey("mColor") && aNBT.getByte("mColor") != -1) { + aList.add( + GTLanguageManager.addStringLocalization("GT_TileEntity_COLORED", "Colored") + " (" + + Dyes.get(aNBT.getByte("mColor") - 1).formatting + + Dyes.get(aNBT.getByte("mColor") - 1).mName + + EnumChatFormatting.GRAY + + ")"); + } + } + } catch (Throwable e) { + GT_FML_LOGGER.error("addInformation", e); + } + } + + private void addDescription(@Nullable List aList, @Nullable String[] aDescription, int aDamage, + String aSuffix) { + if (aDescription == null) return; + for (int i = 0, tLength = aDescription.length; i < tLength; i++) { + String tDescLine = aDescription[i]; + if (!GTUtility.isStringValid(tDescLine)) continue; + + String tKey = String.format("TileEntity_DESCRIPTION_%05d%s_Index_%02d", aDamage, aSuffix, i); + if (tDescLine.contains("%%%")) { + final String[] tSplitStrings = tDescLine.split("%%%"); + final StringBuilder tBuffer = new StringBuilder(); + final String[] tRep = new String[tSplitStrings.length / 2]; + for (int j = 0; j < tSplitStrings.length; j++) if (j % 2 == 0) tBuffer.append(tSplitStrings[j]); + else { + tBuffer.append("%s"); + tRep[j / 2] = tSplitStrings[j]; + } + final String tTranslated = String + .format(GTLanguageManager.addStringLocalization(tKey, tBuffer.toString()), (Object[]) tRep); + if (aList != null) aList.add(tTranslated); + } else { + String tTranslated = GTLanguageManager.addStringLocalization(tKey, tDescLine); + if (aList != null) aList.add(tTranslated.equals("") ? tDescLine : tTranslated); + } + } + } + + @SideOnly(Side.CLIENT) + public void registerDescription(int aDamage) { + if (aDamage >= GregTechAPI.METATILEENTITIES.length) return; + if (GregTechAPI.METATILEENTITIES[aDamage] != null) { + final IMetaTileEntity tMetaTileEntity = GregTechAPI.METATILEENTITIES[aDamage].getBaseMetaTileEntity() + .getMetaTileEntity(); + if (tMetaTileEntity instanceof ISecondaryDescribable) { + final String[] tSecondaryDescription = ((ISecondaryDescribable) tMetaTileEntity) + .getSecondaryDescription(); + addDescription(null, tSecondaryDescription, aDamage, "_Secondary"); + } + addDescription(null, tMetaTileEntity.getDescription(), aDamage, ""); + } + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, + int ordinalSide, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + final short tDamage = (short) getDamage(aStack); + if ((tDamage < 0) || (tDamage >= GregTechAPI.METATILEENTITIES.length)) { + return ""; + } + if (GregTechAPI.METATILEENTITIES[tDamage] != null) { + return getUnlocalizedName() + "." + GregTechAPI.METATILEENTITIES[tDamage].getMetaName(); + } + return ""; + } + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + String aName = super.getItemStackDisplayName(aStack); + final short aDamage = (short) getDamage(aStack); + if (aDamage >= 0 && aDamage < GregTechAPI.METATILEENTITIES.length + && GregTechAPI.METATILEENTITIES[aDamage] != null) { + Materials aMaterial = null; + if (GregTechAPI.METATILEENTITIES[aDamage] instanceof MTEItem) { + aMaterial = ((MTEItem) GregTechAPI.METATILEENTITIES[aDamage]).mMaterial; + } else if (GregTechAPI.METATILEENTITIES[aDamage] instanceof MTEFluid) { + aMaterial = ((MTEFluid) GregTechAPI.METATILEENTITIES[aDamage]).mMaterial; + } else if (GregTechAPI.METATILEENTITIES[aDamage] instanceof MTECable) { + aMaterial = ((MTECable) GregTechAPI.METATILEENTITIES[aDamage]).mMaterial; + } else if (GregTechAPI.METATILEENTITIES[aDamage] instanceof MTEFrame) { + aMaterial = ((MTEFrame) GregTechAPI.METATILEENTITIES[aDamage]).mMaterial; + } + if (aMaterial != null) { + aName = aMaterial.getLocalizedNameForItem(aName); + } + } + return aName; + } + + @Override + public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + super.onCreated(aStack, aWorld, aPlayer); + final short tDamage = (short) getDamage(aStack); + if ((tDamage < 0) + || ((tDamage >= GregTechAPI.METATILEENTITIES.length) && (GregTechAPI.METATILEENTITIES[tDamage] != null))) { + GregTechAPI.METATILEENTITIES[tDamage].onCreated(aStack, aWorld, aPlayer); + } + } + + @Override + public boolean placeBlockAt(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, + int ordinalSide, float hitX, float hitY, float hitZ, int aMeta) { + final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide); + final short tDamage = (short) getDamage(aStack); + if (tDamage > 0) { + if (GregTechAPI.METATILEENTITIES[tDamage] == null) { + return false; + } + final int tMetaData = GregTechAPI.METATILEENTITIES[tDamage].getTileEntityBaseType(); + if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, tMetaData, 3)) { + return false; + } + if (aWorld.getBlock(aX, aY, aZ) != this.field_150939_a) { + throw new GTItsNotMyFaultException( + "Failed to place Block even though World.setBlock returned true. It COULD be MCPC/Bukkit causing that. In case you really have that installed, don't report this Bug to me, I don't know how to fix it."); + } + if (aWorld.getBlockMetadata(aX, aY, aZ) != tMetaData) { + throw new GTItsNotMyFaultException( + "Failed to set the MetaValue of the Block even though World.setBlock returned true. It COULD be MCPC/Bukkit causing that. In case you really have that installed, don't report this Bug to me, I don't know how to fix it."); + } + final IGregTechTileEntity tTileEntity = (IGregTechTileEntity) aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity != null) { + tTileEntity.setInitialValuesAsNBT(tTileEntity.isServerSide() ? aStack.getTagCompound() : null, tDamage); + if (aPlayer != null) { + tTileEntity.setOwnerName(aPlayer.getDisplayName()); + tTileEntity.setOwnerUuid(aPlayer.getUniqueID()); + } + tTileEntity.getMetaTileEntity() + .initDefaultModes(aStack.getTagCompound()); + final ForgeDirection oppositeSide = side.getOpposite(); + if (tTileEntity.getMetaTileEntity() instanceof IConnectable connectable) { + // If we're connectable, try connecting to whatever we're up against + connectable.connect(oppositeSide); + } else if (aPlayer != null && aPlayer.isSneaking()) { + // If we're being placed against something that is connectable, try telling it to connect to us + final IGregTechTileEntity aTileEntity = tTileEntity.getIGregTechTileEntityAtSide(oppositeSide); + if (aTileEntity != null && aTileEntity.getMetaTileEntity() instanceof IConnectable connectable) { + connectable.connect(side); + } + } + } + } else if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, tDamage, 3)) { + return false; + } + if (aWorld.getBlock(aX, aY, aZ) == this.field_150939_a) { + this.field_150939_a.onBlockPlacedBy(aWorld, aX, aY, aZ, aPlayer, aStack); + this.field_150939_a.onPostBlockPlaced(aWorld, aX, aY, aZ, tDamage); + } + return true; + } + + @Override + public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) { + super.onUpdate(aStack, aWorld, aPlayer, aTimer, aIsInHand); + final short tDamage = (short) getDamage(aStack); + final EntityLivingBase tPlayer = (EntityPlayer) aPlayer; + if (GregTechAPI.METATILEENTITIES[tDamage] instanceof MTESuperChest + || GregTechAPI.METATILEENTITIES[tDamage] instanceof MTESuperTank) { + final NBTTagCompound tNBT = aStack.stackTagCompound; + if (tNBT == null) return; + if (tNBT.hasNoTags()) { + aStack.setTagCompound(null); + return; + } + if ((tNBT.hasKey("mItemCount") && tNBT.getInteger("mItemCount") > 0) || (tNBT.hasKey("mFluid") + && FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid")).amount > 64000)) { + final FluidStack tFluid = FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid")); + int tEffectDuration = 1200; + if (tFluid != null) { + final double tFluidAmount = tFluid.amount; + final double tMiddlePoint = 4096000; + final double tSmoothingCoefficient = 2000000; + final int tMaxDuration = 12000; + final double tmp = (tFluidAmount - tMiddlePoint) / tSmoothingCoefficient; + tEffectDuration = (int) (Math.exp(tmp) / (Math.exp(tmp) + Math.exp(-tmp)) * tMaxDuration); + } + tPlayer.addPotionEffect(new PotionEffect(Potion.hunger.id, tEffectDuration, 1)); + tPlayer.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, tEffectDuration, 1)); + tPlayer.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, tEffectDuration, 1)); + tPlayer.addPotionEffect(new PotionEffect(Potion.weakness.id, tEffectDuration, 1)); + } + } + } + + @Override + public FluidStack getFluid(ItemStack container) { + if (container != null) { + final NBTTagCompound tNBT = container.stackTagCompound; + if (tNBT != null && tNBT.hasKey("mFluid", 10)) { + return FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid")); + } + } + return null; + } + + @Override + public int getCapacity(ItemStack container) { + if (container != null) { + final int tDamage = container.getItemDamage(); + final IMetaTileEntity tMetaTile = GregTechAPI.METATILEENTITIES[tDamage]; + if (tMetaTile != null) return tMetaTile.getCapacity(); + } + return 0; + } + + @Nullable + private Fluid getLockedFluid(@Nonnull ItemStack container) { + final NBTTagCompound tag = container.stackTagCompound; + if (tag == null) return null; + String lockedName = tag.getString("lockedFluidName"); + if (GTUtility.isStringInvalid(lockedName)) return null; + return FluidRegistry.getFluid(lockedName); + } + + @Override + public int fill(ItemStack container, FluidStack resource, boolean doFill) { + if (container != null && resource != null) { + final int tDamage = container.getItemDamage(); + final IMetaTileEntity tMetaTile = GregTechAPI.METATILEENTITIES[tDamage]; + if (!(tMetaTile instanceof MTEDigitalTankBase)) { + return 0; + } + if (container.stackTagCompound == null) container.stackTagCompound = new NBTTagCompound(); + final FluidStack tStoredFluid = getFluid(container); + final int tCapacity = getCapacity(container); + if (tCapacity <= 0) return 0; + final Fluid lockedFluid = getLockedFluid(container); + if (lockedFluid != null && resource.getFluid() != lockedFluid) { + return 0; + } + if (tStoredFluid != null && tStoredFluid.isFluidEqual(resource)) { + final int tAmount = Math.min(tCapacity - tStoredFluid.amount, resource.amount); + if (doFill) { + final FluidStack tNewFluid = new FluidStack(tStoredFluid, tAmount + tStoredFluid.amount); + container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound())); + } + return tAmount; + } + if (tStoredFluid == null) { + final int tAmount = Math.min(tCapacity, resource.amount); + if (doFill) { + final FluidStack tNewFluid = new FluidStack(resource, tAmount); + container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound())); + } + return tAmount; + } + } + return 0; + } + + @Override + public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) { + if (container != null && container.hasTagCompound()) { + final int tDamage = container.getItemDamage(); + final IMetaTileEntity tMetaTile = GregTechAPI.METATILEENTITIES[tDamage]; + if (!(tMetaTile instanceof MTEDigitalTankBase)) { + return null; + } + final FluidStack tStoredFluid = getFluid(container); + if (tStoredFluid != null) { + final int tAmount = Math.min(maxDrain, tStoredFluid.amount); + final FluidStack tNewFluid = new FluidStack(tStoredFluid, tStoredFluid.amount - tAmount); + final FluidStack tOutputFluid = new FluidStack(tStoredFluid, tAmount); + if (doDrain) { + if (tNewFluid.amount <= 0) { + container.stackTagCompound.removeTag("mFluid"); + if (container.stackTagCompound.hasNoTags()) container.setTagCompound(null); + } else { + container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound())); + } + } + return tOutputFluid; + } + } + return null; + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemOres.java b/src/main/java/gregtech/common/blocks/ItemOres.java new file mode 100644 index 0000000000..0691142bc3 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemOres.java @@ -0,0 +1,81 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import org.apache.commons.lang3.StringUtils; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; + +public class ItemOres extends ItemBlock { + + public ItemOres(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, + int ordinalSide, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); + } + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + String aName = super.getItemStackDisplayName(aStack); + if (this.field_150939_a instanceof BlockOresAbstract) { + aName = Materials.getLocalizedNameForItem(aName, aStack.getItemDamage() % 1000); + } + return aName; + } + + @Override + public boolean placeBlockAt(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, + int ordinalSide, float hitX, float hitY, float hitZ, int aMeta) { + short tDamage = (short) getDamage(aStack); + if (tDamage > 0) { + if (!aWorld.setBlock( + aX, + aY, + aZ, + this.field_150939_a, + TileEntityOres.getHarvestData( + tDamage, + ((BlockOresAbstract) field_150939_a).getBaseBlockHarvestLevel(aMeta % 16000 / 1000)), + 3)) { + return false; + } + TileEntityOres tTileEntity = (TileEntityOres) aWorld.getTileEntity(aX, aY, aZ); + tTileEntity.mMetaData = tDamage; + tTileEntity.mNatural = false; + } else if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, 0, 3)) { + return false; + } + if (aWorld.getBlock(aX, aY, aZ) == this.field_150939_a) { + this.field_150939_a.onBlockPlacedBy(aWorld, aX, aY, aZ, aPlayer, aStack); + this.field_150939_a.onPostBlockPlaced(aWorld, aX, aY, aZ, tDamage); + } + return true; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + String formula = StatCollector + .translateToLocal(field_150939_a.getUnlocalizedName() + '.' + getDamage(aStack) + ".tooltip"); + if (!StringUtils.isBlank(formula)) aList.add(formula); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemStonesAbstract.java b/src/main/java/gregtech/common/blocks/ItemStonesAbstract.java new file mode 100644 index 0000000000..b8f924b609 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemStonesAbstract.java @@ -0,0 +1,42 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.util.GTLanguageManager; + +public class ItemStonesAbstract extends ItemBlock { + + private final String mNoMobsToolTip = GTLanguageManager + .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block"); + + public ItemStonesAbstract(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); + } + + @Override + public int getMetadata(int aMeta) { + return aMeta; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + super.addInformation(aStack, aPlayer, aList, aF3_H); + if (aStack.getItemDamage() % 8 >= 3) { + aList.add(this.mNoMobsToolTip); + } + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemStorage.java b/src/main/java/gregtech/common/blocks/ItemStorage.java new file mode 100644 index 0000000000..6dd0a2a6b4 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemStorage.java @@ -0,0 +1,47 @@ +package gregtech.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; + +public class ItemStorage extends ItemBlock { + + public ItemStorage(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + setCreativeTab(GregTechAPI.TAB_GREGTECH_MATERIALS); + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack); + } + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + String aName = super.getItemStackDisplayName(aStack); + if (this.field_150939_a instanceof BlockMetal) { + int aDamage = aStack.getItemDamage(); + if (aDamage >= 0 && aDamage < ((BlockMetal) this.field_150939_a).mMats.length) { + aName = ((BlockMetal) this.field_150939_a).mMats[aDamage].getLocalizedNameForItem(aName); + } + } + return aName; + } + + @Override + public int getMetadata(int aMeta) { + return aMeta; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + super.addInformation(aStack, aPlayer, aList, aF3_H); + } +} diff --git a/src/main/java/gregtech/common/blocks/ItemTintedIndustrialGlass.java b/src/main/java/gregtech/common/blocks/ItemTintedIndustrialGlass.java new file mode 100644 index 0000000000..bba737ad15 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/ItemTintedIndustrialGlass.java @@ -0,0 +1,10 @@ +package gregtech.common.blocks; + +import net.minecraft.block.Block; + +public class ItemTintedIndustrialGlass extends ItemCasingsAbstract { + + public ItemTintedIndustrialGlass(Block block) { + super(block); + } +} diff --git a/src/main/java/gregtech/common/blocks/MaterialCasings.java b/src/main/java/gregtech/common/blocks/MaterialCasings.java new file mode 100644 index 0000000000..cde784d137 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/MaterialCasings.java @@ -0,0 +1,19 @@ +package gregtech.common.blocks; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; + +public class MaterialCasings extends Material { + + public static final Material INSTANCE = new MaterialCasings(); + + private MaterialCasings() { + super(MapColor.ironColor); + setRequiresTool(); + } + + @Override + public boolean isOpaque() { + return true; + } +} diff --git a/src/main/java/gregtech/common/blocks/MaterialMachines.java b/src/main/java/gregtech/common/blocks/MaterialMachines.java new file mode 100644 index 0000000000..311b72c764 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/MaterialMachines.java @@ -0,0 +1,19 @@ +package gregtech.common.blocks; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; + +public class MaterialMachines extends Material { + + public MaterialMachines() { + super(MapColor.ironColor); + setRequiresTool(); + setImmovableMobility(); + setAdventureModeExempt(); + } + + @Override + public boolean isOpaque() { + return true; + } +} diff --git a/src/main/java/gregtech/common/blocks/MaterialReinforced.java b/src/main/java/gregtech/common/blocks/MaterialReinforced.java new file mode 100644 index 0000000000..b5256d306d --- /dev/null +++ b/src/main/java/gregtech/common/blocks/MaterialReinforced.java @@ -0,0 +1,18 @@ +package gregtech.common.blocks; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; + +public class MaterialReinforced extends Material { + + public MaterialReinforced() { + super(MapColor.stoneColor); + setRequiresTool(); + setAdventureModeExempt(); + } + + @Override + public boolean isOpaque() { + return true; + } +} diff --git a/src/main/java/gregtech/common/blocks/PacketOres.java b/src/main/java/gregtech/common/blocks/PacketOres.java new file mode 100644 index 0000000000..6548f8ae66 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/PacketOres.java @@ -0,0 +1,62 @@ +package gregtech.common.blocks; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.net.GTPacketNew; +import gregtech.api.net.GTPacketTypes; +import io.netty.buffer.ByteBuf; + +public class PacketOres extends GTPacketNew { + + private int mX; + private int mZ; + private short mY; + private short mMetaData; + + public PacketOres() { + super(true); + } + + public PacketOres(int aX, short aY, int aZ, short aMetaData) { + super(false); + this.mX = aX; + this.mY = aY; + this.mZ = aZ; + this.mMetaData = aMetaData; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(this.mX); + aOut.writeShort(this.mY); + aOut.writeInt(this.mZ); + aOut.writeShort(this.mMetaData); + } + + @Override + public GTPacketNew decode(ByteArrayDataInput aData) { + return new PacketOres(aData.readInt(), aData.readShort(), aData.readInt(), aData.readShort()); + } + + @Override + public void process(IBlockAccess aWorld) { + if (aWorld != null) { + TileEntity tTileEntity = aWorld.getTileEntity(this.mX, this.mY, this.mZ); + if ((tTileEntity instanceof TileEntityOres)) { + ((TileEntityOres) tTileEntity).mMetaData = this.mMetaData; + } + if (((aWorld instanceof World)) && (((World) aWorld).isRemote)) { + ((World) aWorld).markBlockForUpdate(this.mX, this.mY, this.mZ); + } + } + } + + @Override + public byte getPacketID() { + return GTPacketTypes.ORES.id; + } +} diff --git a/src/main/java/gregtech/common/blocks/TileEntityOres.java b/src/main/java/gregtech/common/blocks/TileEntityOres.java new file mode 100644 index 0000000000..9ddcbcc19c --- /dev/null +++ b/src/main/java/gregtech/common/blocks/TileEntityOres.java @@ -0,0 +1,482 @@ +package gregtech.common.blocks; + +import static gregtech.api.enums.TextureSet.SET_NONE; + +import java.util.ArrayList; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity; +import gregtech.api.objects.XSTR; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; + +public class TileEntityOres extends TileEntity implements IAllSidedTexturedTileEntity { + + public short mMetaData = 0; + protected static boolean shouldFortune = false; + protected static boolean shouldSilkTouch = false; + public boolean mNatural = false; + public boolean mBlocked = true; + public boolean mBlockedChecked = false; + private short mMetadataForCachedTexture = -1; + private ITexture[] mCachedTexture; + + public static byte getHarvestData(short aMetaData, int aBaseBlockHarvestLevel) { + Materials aMaterial = GregTechAPI.sGeneratedMaterials[(aMetaData % 1000)]; + byte tByte = aMaterial == null ? 0 + : (byte) Math + .max(aBaseBlockHarvestLevel, Math.min(7, aMaterial.mToolQuality - (aMetaData < 16000 ? 0 : 1))); + if (GTMod.gregtechproxy.mChangeHarvestLevels) { + tByte = aMaterial == null ? 0 + : (byte) Math.max( + aBaseBlockHarvestLevel, + Math.min( + GTMod.gregtechproxy.mMaxHarvestLevel, + GTMod.gregtechproxy.mHarvestLevel[aMaterial.mMetaItemSubID] - (aMetaData < 16000 ? 0 : 1))); + } + return tByte; + } + + public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre) { + return setOreBlock(aWorld, aX, aY, aZ, aMetaData, isSmallOre, true); + } + + public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre, + boolean air) { + if (!air) { + aY = Math.min(aWorld.getActualHeight(), Math.max(aY, 1)); + } + Block tBlock = aWorld.getBlock(aX, aY, aZ); + Block tOreBlock = GregTechAPI.sBlockOres1; + int BlockMeta = aWorld.getBlockMetadata(aX, aY, aZ); + String BlockName = tBlock.getUnlocalizedName(); + aMetaData += isSmallOre ? 16000 : 0; + if ((aMetaData > 0) && ((tBlock != Blocks.air) || air)) { + if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone)) { + // Do nothing, stone background is default background. + // Do this comparison first since stone is most common + } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack)) { + aMetaData += 1000; + } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone)) { + aMetaData += 2000; + } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTechAPI.sBlockGranites)) { + if (tBlock == GregTechAPI.sBlockGranites) { + if (aWorld.getBlockMetadata(aX, aY, aZ) < 8) { + aMetaData += 3000; + } else { + aMetaData += 4000; + } + } else { + aMetaData += 3000; + } + } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTechAPI.sBlockStones)) { + if (tBlock == GregTechAPI.sBlockStones) { + if (aWorld.getBlockMetadata(aX, aY, aZ) < 8) { + aMetaData += 5000; + } else { + aMetaData += 6000; + } + } else { + aMetaData += 5000; + } + } else if (BlockName.equals("tile.igneousStone")) { + if (GregTechAPI.sBlockOresUb1 != null) { + tOreBlock = GregTechAPI.sBlockOresUb1; + aMetaData += (BlockMeta * 1000); + // GT_FML_LOGGER.info("Block changed to UB1"); + } + } else if (BlockName.equals("tile.metamorphicStone")) { + if (GregTechAPI.sBlockOresUb2 != null) { + tOreBlock = GregTechAPI.sBlockOresUb2; + aMetaData += (BlockMeta * 1000); + // GT_FML_LOGGER.info("Block changed to UB2"); + } + } else if (BlockName.equals("tile.sedimentaryStone")) { + if (GregTechAPI.sBlockOresUb3 != null) { + tOreBlock = GregTechAPI.sBlockOresUb3; + aMetaData += (BlockMeta * 1000); + // GT_FML_LOGGER.info("Block changed to UB3"); + } + } else { + return false; + } + // GT_FML_LOGGER.info(tOreBlock); + aWorld.setBlock( + aX, + aY, + aZ, + tOreBlock, + getHarvestData( + (short) aMetaData, + ((BlockOresAbstract) tOreBlock).getBaseBlockHarvestLevel(aMetaData % 16000 / 1000)), + 0); + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof TileEntityOres)) { + ((TileEntityOres) tTileEntity).mMetaData = ((short) aMetaData); + ((TileEntityOres) tTileEntity).mNatural = true; + } + return true; + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound aNBT) { + super.readFromNBT(aNBT); + this.mMetaData = aNBT.getShort("m"); + this.mNatural = aNBT.getBoolean("n"); + } + + @Override + public void writeToNBT(NBTTagCompound aNBT) { + super.writeToNBT(aNBT); + aNBT.setShort("m", this.mMetaData); + aNBT.setBoolean("n", this.mNatural); + } + + public void onUpdated() { + if ((!this.worldObj.isRemote) && (this.mBlocked)) { + this.mBlocked = false; + GTValues.NW.sendPacketToAllPlayersInRange( + this.worldObj, + new PacketOres(this.xCoord, (short) this.yCoord, this.zCoord, this.mMetaData), + this.xCoord, + this.zCoord); + } + } + + @Override + public Packet getDescriptionPacket() { + if (!this.worldObj.isRemote) { + boolean sendUpdate = mBlockedChecked ? !mBlocked : checkBlocked(); + if (sendUpdate) { + GTValues.NW.sendPacketToAllPlayersInRange( + this.worldObj, + new PacketOres(this.xCoord, (short) this.yCoord, this.zCoord, this.mMetaData), + this.xCoord, + this.zCoord); + } + } + return null; + } + + private boolean checkBlocked() { + // this is called very frequently and is performance critical. unroll the loop. + mBlockedChecked = true; + if (!worldObj.blockExists(xCoord + 1, yCoord, zCoord)) { + mBlockedChecked = false; + } else if (!GTUtility.isOpaqueBlock(worldObj, xCoord + 1, yCoord, zCoord)) { + mBlocked = false; + return true; + } + if (!worldObj.blockExists(xCoord - 1, yCoord, zCoord)) { + mBlockedChecked = false; + } else if (!GTUtility.isOpaqueBlock(worldObj, xCoord - 1, yCoord, zCoord)) { + mBlocked = false; + return true; + } + if (!worldObj.blockExists(xCoord, yCoord + 1, zCoord)) { + mBlockedChecked = false; + } else if (!GTUtility.isOpaqueBlock(worldObj, xCoord, yCoord + 1, zCoord)) { + mBlocked = false; + return true; + } + if (!worldObj.blockExists(xCoord, yCoord - 1, zCoord)) { + mBlockedChecked = false; + } else if (!GTUtility.isOpaqueBlock(worldObj, xCoord, yCoord - 1, zCoord)) { + mBlocked = false; + return true; + } + if (!worldObj.blockExists(xCoord, yCoord, zCoord + 1)) { + mBlockedChecked = false; + } else if (!GTUtility.isOpaqueBlock(worldObj, xCoord, yCoord, zCoord + 1)) { + mBlocked = false; + return true; + } + if (!worldObj.blockExists(xCoord, yCoord, zCoord - 1)) { + mBlockedChecked = false; + } else if (!GTUtility.isOpaqueBlock(worldObj, xCoord, yCoord, zCoord - 1)) { + mBlocked = false; + return true; + } + mBlocked = true; + return false; + } + + public void overrideOreBlockMaterial(Block aOverridingStoneBlock, byte aOverridingStoneMeta) { + if (this.worldObj == null || blockType == null) return; + this.mMetaData = ((short) (int) (this.mMetaData % 1000L + this.mMetaData / 16000L * 16000L)); + if (aOverridingStoneBlock + .isReplaceableOreGen(this.worldObj, this.xCoord, this.yCoord, this.zCoord, Blocks.netherrack)) { + this.mMetaData = ((short) (this.mMetaData + 1000)); + } else if (aOverridingStoneBlock + .isReplaceableOreGen(this.worldObj, this.xCoord, this.yCoord, this.zCoord, Blocks.end_stone)) { + this.mMetaData = ((short) (this.mMetaData + 2000)); + } else if (aOverridingStoneBlock.isReplaceableOreGen( + this.worldObj, + this.xCoord, + this.yCoord, + this.zCoord, + GregTechAPI.sBlockGranites)) { + if (aOverridingStoneBlock == GregTechAPI.sBlockGranites) { + if (aOverridingStoneMeta < 8) { + this.mMetaData = ((short) (this.mMetaData + 3000)); + } else { + this.mMetaData = ((short) (this.mMetaData + 4000)); + } + } else { + this.mMetaData = ((short) (this.mMetaData + 3000)); + } + } else if (aOverridingStoneBlock.isReplaceableOreGen( + this.worldObj, + this.xCoord, + this.yCoord, + this.zCoord, + GregTechAPI.sBlockStones)) { + if (aOverridingStoneBlock == GregTechAPI.sBlockStones) { + if (aOverridingStoneMeta < 8) { + this.mMetaData = ((short) (this.mMetaData + 5000)); + } else { + this.mMetaData = ((short) (this.mMetaData + 6000)); + } + } else { + this.mMetaData = ((short) (this.mMetaData + 5000)); + } + } + this.worldObj.setBlockMetadataWithNotify( + this.xCoord, + this.yCoord, + this.zCoord, + getHarvestData( + this.mMetaData, + ((BlockOresAbstract) blockType).getBaseBlockHarvestLevel(mMetaData % 16000 / 1000)), + 0); + } + + public void convertOreBlock(World aWorld, int aX, int aY, int aZ) { + short aMeta = ((short) (this.mMetaData % 1000 + (this.mMetaData / 16000 * 16000))); + aWorld.setBlock(aX, aY, aZ, GregTechAPI.sBlockOres1); + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof TileEntityOres) { + ((TileEntityOres) tTileEntity).mMetaData = aMeta; + this.worldObj.setBlockMetadataWithNotify( + this.xCoord, + this.yCoord, + this.zCoord, + getHarvestData( + aMeta, + ((BlockOresAbstract) tTileEntity.blockType).getBaseBlockHarvestLevel(aMeta % 16000 / 1000)), + 0); + } + } + + public short getMetaData() { + return this.mMetaData; + } + + @Override + public boolean canUpdate() { + return false; + } + + public ArrayList getDrops(Block aDroppedOre, int aFortune) { + ArrayList rList = new ArrayList<>(); + if (this.mMetaData <= 0) { + rList.add(new ItemStack(Blocks.cobblestone, 1, 0)); + return rList; + } + Materials aOreMaterial = GregTechAPI.sGeneratedMaterials[(this.mMetaData % 1000)]; + if (this.mMetaData < 16000) { + boolean tIsRich = false; + + // For Sake of god of balance! + + // Dense ore + + // NetherOre + if (GTMod.gregtechproxy.mNetherOreYieldMultiplier && !tIsRich) { + tIsRich = (this.mMetaData >= 1000 && this.mMetaData < 2000); + } + // EndOre + if (GTMod.gregtechproxy.mEndOreYieldMultiplier && !tIsRich) { + tIsRich = (this.mMetaData >= 2000 && this.mMetaData < 3000); + } + + // Silk Touch + if (shouldSilkTouch) { + rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData)); + + } else { + switch (GTMod.gregtechproxy.oreDropSystem) { + case Item -> { + rList.add(GTOreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, (tIsRich ? 2 : 1))); + } + // TODO: Test + case FortuneItem -> { + // if shouldFortune and isNatural then get fortune drops + // if not shouldFortune or not isNatural then get normal drops + // if not shouldFortune and isNatural then get normal drops + // if shouldFortune and not isNatural then get normal drops + if (shouldFortune && this.mNatural && aFortune > 0) { + int aMinAmount = 1; + // Max applicable fortune + if (aFortune > 3) aFortune = 3; + int amount = aMinAmount + + Math.max(worldObj.rand.nextInt(aFortune * (tIsRich ? 2 : 1) + 2) - 1, 0); + for (int i = 0; i < amount; i++) { + rList.add(GTOreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1)); + } + } else { + for (int i = 0; i < (tIsRich ? 2 : 1); i++) { + rList.add(GTOreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1)); + } + } + } + case UnifiedBlock -> { + // Unified ore + for (int i = 0; i < (tIsRich ? 2 : 1); i++) { + rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData % 1000)); + } + } + case PerDimBlock -> { + // Per Dimension ore + if (tIsRich) { + rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData)); + } else { + rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData % 1000)); + } + } + case Block -> { + // Regular ore + rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData)); + } + } + } + return rList; + } + + // Everyone gets a free small fortune boost + aFortune += 1; + if (!this.mNatural) { + aFortune = 0; + } + if (aOreMaterial != null) { + Random tRandom = new XSTR(this.xCoord ^ this.yCoord ^ this.zCoord); + ArrayList tSelector = new ArrayList<>(); + + Materials aMaterial = aOreMaterial.mOreReplacement; + + ItemStack tStack = GTOreDictUnificator + .get(OrePrefixes.gemExquisite, aMaterial, GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L), 1L); + if (tStack != null) { + for (int i = 0; i < 1; i++) { + tSelector.add(tStack); + } + } + tStack = GTOreDictUnificator + .get(OrePrefixes.gemFlawless, aMaterial, GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L), 1L); + if (tStack != null) { + for (int i = 0; i < 2; i++) { + tSelector.add(tStack); + } + } + tStack = GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L); + if (tStack != null) { + for (int i = 0; i < 12; i++) { + tSelector.add(tStack); + } + } + tStack = GTOreDictUnificator + .get(OrePrefixes.gemFlawed, aMaterial, GTOreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1L), 1L); + if (tStack != null) { + for (int i = 0; i < 5; i++) { + tSelector.add(tStack); + } + } + tStack = GTOreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1L); + if (tStack != null) { + for (int i = 0; i < 10; i++) { + tSelector.add(tStack); + } + } + tStack = GTOreDictUnificator.get( + OrePrefixes.gemChipped, + aMaterial, + GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L), + 1L); + if (tStack != null) { + for (int i = 0; i < 5; i++) { + tSelector.add(tStack); + } + } + tStack = GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L); + if (tStack != null) { + for (int i = 0; i < 10; i++) { + tSelector.add(tStack); + } + } + if (!tSelector.isEmpty()) { + int i = 0; + for (int j = Math.max( + 1, + aMaterial.mOreMultiplier + + (aFortune > 0 ? tRandom.nextInt(1 + aFortune * aMaterial.mOreMultiplier) : 0) / 2); i + < j; i++) { + rList.add(GTUtility.copyAmount(1, tSelector.get(tRandom.nextInt(tSelector.size())))); + } + } + if (tRandom.nextInt(3 + aFortune) > 1) { + Materials dustMat = ((BlockOresAbstract) aDroppedOre).getDroppedDusts()[this.mMetaData / 1000 % 16]; + if (dustMat != null) rList.add( + GTOreDictUnificator + .get(tRandom.nextInt(3) > 0 ? OrePrefixes.dustImpure : OrePrefixes.dust, dustMat, 1L)); + } + } + return rList; + } + + @Override + public ITexture[] getTexture(Block aBlock) { + if (mMetadataForCachedTexture == mMetaData && mCachedTexture != null) return mCachedTexture; + + mMetadataForCachedTexture = mMetaData; + mCachedTexture = getTextureInternal(aBlock); + return mCachedTexture; + } + + private ITexture @NotNull [] getTextureInternal(Block aBlock) { + Materials aMaterial = GregTechAPI.sGeneratedMaterials[(this.mMetaData % 1000)]; + if ((aMaterial != null) && (this.mMetaData < 32000) && (aBlock instanceof BlockOresAbstract)) { + ITexture iTexture = TextureFactory.builder() + .addIcon( + aMaterial.mIconSet.mTextures[this.mMetaData / 16000 == 0 ? OrePrefixes.ore.mTextureIndex + : OrePrefixes.oreSmall.mTextureIndex]) + .setRGBA(aMaterial.mRGBa) + .stdOrient() + .build(); + return new ITexture[] { ((BlockOresAbstract) aBlock).getTextureSet()[((this.mMetaData / 1000) % 16)], + iTexture }; + } + return new ITexture[] { TextureFactory.of(Blocks.stone, 0), TextureFactory.builder() + .addIcon(SET_NONE.mTextures[OrePrefixes.ore.mTextureIndex]) + .stdOrient() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverArm.java b/src/main/java/gregtech/common/covers/CoverArm.java new file mode 100644 index 0000000000..fef9ef1327 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverArm.java @@ -0,0 +1,431 @@ +package gregtech.common.covers; + +import java.text.FieldPosition; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverArm extends CoverBehavior { + + public final int mTickRate; + // msb converted, 2nd : direction (1=export) + // right 14 bits: internalSlot, next 14 bits adjSlot, 0 = all, slot = -1 + protected static final int EXPORT_MASK = 0x40000000; + protected static final int SLOT_ID_MASK = 0x3FFF; + protected static final int SLOT_ID_MIN = 0; + protected static final int CONVERTED_BIT = 0x80000000; + + public CoverArm(int aTickRate, ITexture coverTexture) { + super(coverTexture); + this.mTickRate = aTickRate; + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if ((((aTileEntity instanceof IMachineProgress)) && (!((IMachineProgress) aTileEntity).isAllowedToWork()))) { + return aCoverVariable; + } + + // Convert from ver. 5.09.33.50, check if 3 last bits are equal + if ((aCoverVariable >>> 29) == 0) { + aCoverVariable = CONVERTED_BIT | (((aCoverVariable + 1) & SLOT_ID_MASK) << 14) | EXPORT_MASK; + } else if ((aCoverVariable >>> 29) == 7) { + aCoverVariable = CONVERTED_BIT | Math.min(Math.abs(aCoverVariable - 1), SLOT_ID_MASK); + } + + final TileEntity toTile; + final TileEntity fromTile; + final int toSlot; + final int fromSlot; + + if ((aCoverVariable & EXPORT_MASK) > 0) { + fromTile = (TileEntity) aTileEntity; + toTile = aTileEntity.getTileEntityAtSide(side); + fromSlot = aCoverVariable & SLOT_ID_MASK; + toSlot = (aCoverVariable >> 14) & SLOT_ID_MASK; + } else { + fromTile = aTileEntity.getTileEntityAtSide(side); + toTile = (TileEntity) aTileEntity; + fromSlot = (aCoverVariable >> 14) & SLOT_ID_MASK; + toSlot = aCoverVariable & SLOT_ID_MASK; + } + + if (fromSlot > 0 && toSlot > 0) { + if (fromTile instanceof IInventory fromInventory && toTile instanceof IInventory toInventory) + GTUtility.moveFromSlotToSlot( + fromInventory, + toInventory, + fromSlot - 1, + toSlot - 1, + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1); + } else if (toSlot > 0) { + final ForgeDirection toSide; + if ((aCoverVariable & EXPORT_MASK) > 0) toSide = side; + else toSide = side.getOpposite(); + GTUtility.moveOneItemStackIntoSlot( + fromTile, + toTile, + toSide, + toSlot - 1, + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1); + } else if (fromSlot > 0) { + final ForgeDirection toSide; + if ((aCoverVariable & EXPORT_MASK) > 0) toSide = side; + else toSide = side.getOpposite(); + if (fromTile instanceof IInventory) GTUtility.moveFromSlotToSide( + (IInventory) fromTile, + toTile, + fromSlot - 1, + toSide, + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1); + } else { + final ForgeDirection fromSide; + final ForgeDirection toSide; + if ((aCoverVariable & EXPORT_MASK) > 0) { + fromSide = side; + toSide = side.getOpposite(); + } else { + fromSide = side.getOpposite(); + toSide = side; + } + GTUtility.moveOneItemStack( + fromTile, + toTile, + fromSide, + toSide, + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1); + } + + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + int step = 0; + if (GTUtility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) { + step += aPlayer.isSneaking() ? 256 : 16; + } else { + step -= aPlayer.isSneaking() ? 256 : 16; + } + aCoverVariable = getNewVar(aCoverVariable, step); + sendMessageToPlayer(aPlayer, aCoverVariable); + return aCoverVariable; + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + int step = (GTUtility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) ? 1 : -1; + int tCoverVariable = getNewVar(aCoverVariable.get(), step); + sendMessageToPlayer(aPlayer, tCoverVariable); + aCoverVariable.set(tCoverVariable); + return true; + } + + @Override + @SuppressWarnings("deprecation") + public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + final int step = (GTUtility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) ? 1 : -1; + aCoverVariable = getNewVar(aCoverVariable, step); + sendMessageToPlayer(aPlayer, aCoverVariable); + aTileEntity.setCoverDataAtSide(side, aCoverVariable); + return true; + } + + @Override + protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return false; + } + + private void sendMessageToPlayer(EntityPlayer aPlayer, int var) { + if ((var & EXPORT_MASK) != 0) GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("001", "Puts out into adjacent Slot #") + (((var >> 14) & SLOT_ID_MASK) - 1)); + else GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("002", "Grabs in for own Slot #") + ((var & SLOT_ID_MASK) - 1)); + } + + private int getNewVar(int var, int step) { + int intSlot = (var & SLOT_ID_MASK); + int adjSlot = (var >> 14) & SLOT_ID_MASK; + if ((var & EXPORT_MASK) == 0) { + int x = (intSlot + step); + if (x > SLOT_ID_MASK) return createVar(0, SLOT_ID_MASK, 0); + else if (x < 1) return createVar(-step - intSlot + 1, 0, EXPORT_MASK); + else return createVar(0, x, 0); + } else { + int x = (adjSlot - step); + if (x > SLOT_ID_MASK) return createVar(SLOT_ID_MASK, 0, EXPORT_MASK); + else if (x < 1) return createVar(0, step - adjSlot + 1, 0); + else return createVar(x, 0, EXPORT_MASK); + } + } + + private int createVar(int adjSlot, int intSlot, int export) { + return CONVERTED_BIT | export | ((adjSlot & SLOT_ID_MASK) << 14) | (intSlot & SLOT_ID_MASK); + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return this.mTickRate; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new ArmUIFactory(buildContext).createWindow(); + } + + private class ArmUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + private int maxSlot; + + /** + * Display the text "Any" instead of a number when the slot is set to -1. + */ + protected static final NumberFormatMUI numberFormatAny = new NumberFormatMUI() { + + @Override + public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { + if (number < 0) { + return toAppendTo.append(GTUtility.trans("ANY", "Any")); + } else { + return super.format(number, toAppendTo, pos); + } + } + }; + + protected ArmUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + maxSlot = getMaxSlot(); + builder.widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverArm.this).addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> getFlagExport(convert(coverData)) > 0, + (coverData, state) -> { + if (state) { + return new ISerializableObject.LegacyCoverData( + convert(coverData) | EXPORT_MASK | CONVERTED_BIT); + } else { + return new ISerializableObject.LegacyCoverData( + convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT); + } + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GTUtility.trans("006", "Export")) + .setPos(spaceX * 0, spaceY * 0)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> getFlagExport(convert(coverData)) == 0, + (coverData, state) -> { + if (state) { + return new ISerializableObject.LegacyCoverData( + convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT); + } else { + return new ISerializableObject.LegacyCoverData( + convert(coverData) | EXPORT_MASK | CONVERTED_BIT); + } + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GTUtility.trans("007", "Import")) + .setPos(spaceX * 1, spaceY * 0)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) (getFlagInternalSlot(convert(coverData)) - 1), + (coverData, state) -> { + final int coverVariable = convert(coverData); + return new ISerializableObject.LegacyCoverData( + getFlagExport(coverVariable) | ((state.intValue() + 1) & SLOT_ID_MASK) + | (getFlagAdjacentSlot(coverVariable) << 14) + | CONVERTED_BIT); + }, + widget -> widget.setBounds(-1, maxSlot) + .setDefaultValue(-1) + .setScrollValues(1, 100, 10) + .setNumberFormat(numberFormatAny) + .setPos(spaceX * 0, spaceY * 1 + 2) + .setSize(spaceX * 2 + 5, 12)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) (getFlagAdjacentSlot(convert(coverData)) - 1), + (coverData, state) -> { + final int coverVariable = convert(coverData); + return new ISerializableObject.LegacyCoverData( + getFlagExport(coverVariable) | getFlagInternalSlot(coverVariable) + | (((state.intValue() + 1) & SLOT_ID_MASK) << 14) + | CONVERTED_BIT); + }, + widget -> widget.setValidator(val -> { + // We need to check the adjacent inventory here, and can't simply set a maximum value, + // because it can change while this cover is alive. + final int adjacentMaxSlot; + final ICoverable tile = getUIBuildContext().getTile(); + if (tile instanceof TileEntity && !tile.isDead()) { + TileEntity adj = tile.getTileEntityAtSide(getUIBuildContext().getCoverSide()); + if (adj instanceof IInventory) + adjacentMaxSlot = ((IInventory) adj).getSizeInventory() - 1; + else adjacentMaxSlot = -1; + } else { + adjacentMaxSlot = -1; + } + return Math.min(val, adjacentMaxSlot); + }) + .setMinValue(-1) + .setDefaultValue(-1) + .setScrollValues(1, 100, 10) + .setNumberFormat(numberFormatAny) + .setPos(spaceX * 0, spaceY * 2 + 2) + .setSize(spaceX * 2 + 5, 12)) + .setPos(startX, startY)) + .widget( + new TextWidget() + .setStringSupplier( + () -> (convert(getCoverData()) & EXPORT_MASK) > 0 ? GTUtility.trans("006", "Export") + : GTUtility.trans("007", "Import")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("254.1", "Internal slot#")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("255", "Adjacent slot#")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 2)); + } + + private int getMaxSlot() { + final ICoverable tile = getUIBuildContext().getTile(); + if (tile instanceof TileEntity && !tile.isDead()) { + return tile.getSizeInventory() - 1; + } else { + return -1; + } + } + + private int getFlagExport(int coverVariable) { + return coverVariable & EXPORT_MASK; + } + + private int getFlagInternalSlot(int coverVariable) { + return coverVariable & SLOT_ID_MASK; + } + + private int getFlagAdjacentSlot(int coverVariable) { + return (coverVariable >> 14) & SLOT_ID_MASK; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverChest.java b/src/main/java/gregtech/common/covers/CoverChest.java new file mode 100644 index 0000000000..4afc3b9578 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverChest.java @@ -0,0 +1,274 @@ +package gregtech.common.covers; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; + +import cpw.mods.fml.common.network.ByteBufUtils; +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import io.netty.buffer.ByteBuf; + +public class CoverChest extends CoverBehaviorBase { + + private final int slots; + private final int stackSizeLimit = 1; + + public CoverChest(int slots, ITexture coverTexture) { + super(ChestInventory.class, coverTexture); + if (slots <= 0) throw new IllegalArgumentException("slots must be greater than 0"); + this.slots = slots; + } + + @Override + public ChestInventory createDataObject(int aLegacyData) { + return new ChestInventory(slots, stackSizeLimit); + } + + @Override + public ChestInventory createDataObject() { + return new ChestInventory(slots, stackSizeLimit); + } + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public boolean isSimpleCover() { + return true; + } + + @Override + public boolean allowsCopyPasteTool() { + return false; + } + + @Override + public boolean allowsTickRateAddition() { + return false; + } + + @Override + protected void onDroppedImpl(ForgeDirection side, int aCoverID, ChestInventory aCoverVariable, + ICoverable aTileEntity) { + if (aTileEntity.getWorld().isRemote) return; + aCoverVariable.dropAll(aTileEntity, side); + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, ChestInventory aCoverVariable, + ICoverable aTileEntity) { + return aCoverVariable.firstTick ? 1 : 0; + } + + @Override + protected ChestInventory doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ChestInventory aCoverVariable, ICoverable aTileEntity, long aTimer) { + // migrate slots. mostly needed while in development. still can be useful if we ever resize the inventory in the + // future + if (aCoverVariable.items.getSlots() != slots) { + if (aCoverVariable.items.getSlots() > slots) { + for (int i = slots; i < aCoverVariable.items.getSlots(); i++) { + ItemStack item = aCoverVariable.items.getStackInSlot(i); + if (item != null) { + dropItem(aTileEntity, side, item); + } + } + } + + ChestInventory newData = createDataObject(); + int toCopy = Math.min(newData.items.getSlots(), aCoverVariable.items.getSlots()); + for (int i = 0; i < toCopy; i++) { + newData.items.setStackInSlot(i, aCoverVariable.items.getStackInSlot(i)); + } + return newData; + } + aCoverVariable.firstTick = false; + return super.doCoverThingsImpl(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity, aTimer); + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new ChestUIFactory(buildContext).createWindow(); + } + + public class ChestUIFactory extends UIFactory { + + private static final int spaceX = 18; + private static final int spaceY = 18; + + public ChestUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getGUIHeight() { + int height = slots / 3 * 18 + 8; + if (!getUIBuildContext().isAnotherWindow()) { + // player inv is 4 row + return height + 4 * 18 + 14; + } + return height; + } + + @Override + protected void addTitleToUI(ModularWindow.Builder builder) {} + + @Override + protected int getGUIWidth() { + if (getUIBuildContext().isAnotherWindow()) { + return 18 * 3 + 20; + } else { + return 18 * 9 + 20; + } + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + CoverDataControllerWidget w = new CoverDataControllerWidget<>( + this::getCoverData, + this::setCoverData, + CoverChest.this); + ChestInventory d = getCoverData(); + LimitingItemStackHandler h; + if (d == null) { + // ??? + return; + } + h = d.items; + SlotGroup slotGroup = SlotGroup.ofItemHandler(h, 3) + .build(); + if (getUIBuildContext().isAnotherWindow()) { + slotGroup.setPos(4, 4); + } else { + slotGroup.setPos(getGUIWidth() / 2 - 18 * 3 / 2, 6); + } + w.addChild(slotGroup); + builder.widget(w); + + builder.setPos( + (p, t) -> Alignment.Center.getAlignedPos( + new Size(getUIBuildContext().isAnotherWindow() ? t.getPos().x : p.width, p.height), + new Size(getGUIWidth(), getGUIHeight()))); + } + + @Override + protected boolean doesBindPlayerInventory() { + return true; + } + } + + private static class LimitingItemStackHandler extends ItemStackHandler { + + private final int slotLimit; + + private LimitingItemStackHandler(int slots, int slotLimit) { + super(slots); + this.slotLimit = slotLimit; + } + + @Override + public int getSlotLimit(int slot) { + return slotLimit; + } + } + + public static class ChestInventory implements ISerializableObject { + + final LimitingItemStackHandler items; + boolean firstTick; + + public ChestInventory(int slots, int stackSize) { + items = new LimitingItemStackHandler(slots, stackSize); + } + + @NotNull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { + items.deserializeNBT(ISerializableObject.readCompoundTagFromGreggyByteBuf(aBuf)); + return this; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + ByteBufUtils.writeTag(aBuf, items.serializeNBT()); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + if (!(aNBT instanceof NBTTagCompound)) return; + items.deserializeNBT((NBTTagCompound) aNBT); + firstTick = true; + } + + @NotNull + @Override + public NBTBase saveDataToNBT() { + return items.serializeNBT(); + } + + @NotNull + @Override + public ISerializableObject copy() { + ChestInventory copy = new ChestInventory(items.getSlots(), items.getSlotLimit(0)); + for (int i = 0; i < items.getSlots(); i++) { + copy.items.setStackInSlot(i, items.getStackInSlot(i)); + } + return copy; + } + + public void dropAll(ICoverable coverable, ForgeDirection direction) { + for (int i = 0; i < items.getSlots(); i++) { + ItemStack tItem = items.getStackInSlot(i); + if (tItem == null) { + continue; + } + dropItem(coverable, direction, tItem); + items.setStackInSlot(i, null); + } + } + } + + private static void dropItem(ICoverable coverable, ForgeDirection direction, ItemStack tItem) { + final EntityItem tItemEntity = new EntityItem( + coverable.getWorld(), + coverable.getXCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F + direction.offsetX, + coverable.getYCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F + direction.offsetY, + coverable.getZCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F + direction.offsetZ, + new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage())); + if (tItem.hasTagCompound()) { + tItemEntity.getEntityItem() + .setTagCompound( + (NBTTagCompound) tItem.getTagCompound() + .copy()); + } + tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D); + tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.05D + 0.2D); + tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D); + tItemEntity.hurtResistantTime = 999999; + tItemEntity.lifespan = 60000; + coverable.getWorld() + .spawnEntityInWorld(tItemEntity); + } +} diff --git a/src/main/java/gregtech/common/covers/CoverControlsWork.java b/src/main/java/gregtech/common/covers/CoverControlsWork.java new file mode 100644 index 0000000000..6c92c61351 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverControlsWork.java @@ -0,0 +1,270 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.covers.IControlsWorkCover; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverControlsWork extends CoverBehavior implements IControlsWorkCover { + + public CoverControlsWork(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if (!makeSureOnlyOne(side, aTileEntity)) return 0; + if (aTileEntity instanceof IMachineProgress machine) { + if (aCoverVariable < 2) { + if ((aInputRedstone > 0) == (aCoverVariable == 0)) { + if (!machine.isAllowedToWork()) machine.enableWorking(); + } else if (machine.isAllowedToWork()) machine.disableWorking(); + machine.setWorkDataValue(aInputRedstone); + } else if (aCoverVariable == 2) { + machine.disableWorking(); + } else { + if (machine.wasShutdown() && machine.getLastShutDownReason() + .wasCritical()) { + machine.disableWorking(); + if (!mPlayerNotified) { + EntityPlayer player = lastPlayer == null ? null : lastPlayer.get(); + if (player != null) { + lastPlayer = null; + mPlayerNotified = true; + GTUtility.sendChatToPlayer( + player, + aTileEntity.getInventoryName() + "at " + + String.format( + "(%d,%d,%d)", + aTileEntity.getXCoord(), + aTileEntity.getYCoord(), + aTileEntity.getZCoord()) + + " shut down."); + } + } + return 2; + } else { + return 3 + doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable - 3, aTileEntity, aTimer); + } + } + } + return aCoverVariable; + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + return aCoverVariable.get() != 2; // always off, so no redstone needed either + } + + /** + * Make sure there is only one GT_Cover_ControlsWork on the aTileEntity TODO this is a migration thing. Remove this + * after 2.3.0 is released. + * + * @return true if the cover is the first (side) one + **/ + private boolean makeSureOnlyOne(ForgeDirection side, ICoverable aTileEntity) { + return IControlsWorkCover.makeSureOnlyOne(side, aTileEntity); + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + if ((aTileEntity instanceof IMachineProgress)) { + ((IMachineProgress) aTileEntity).enableWorking(); + ((IMachineProgress) aTileEntity).setWorkDataValue((byte) 0); + } + return true; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 5; + if (aCoverVariable < 0) { + aCoverVariable = 2; + } + if (aCoverVariable == 0) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("003", "Enable with Signal")); + } + if (aCoverVariable == 1) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("004", "Disable with Signal")); + } + if (aCoverVariable == 2) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("005", "Disabled")); + } + if (aCoverVariable == 3) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("505", "Enable with Signal (Safe)")); + } + if (aCoverVariable == 4) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("506", "Disable with Signal (Safe)")); + } + // TODO: Set lastPlayer + return aCoverVariable; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } + + @Override + public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { + if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false; + for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { + if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { + return false; + } + } + return true; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new ControlsWorkUIFactory(buildContext).createWindow(); + } + + private class ControlsWorkUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public ControlsWorkUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder + .widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverControlsWork.this, + (id, coverData) -> !getClickable(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_REDSTONE_ON) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_REDSTONE_OFF) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_CROSS) + .setPos(spaceX * 0, spaceY * 2)) + .setPos(startX, startY)) + .widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverControlsWork.this) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofCheckAndCross(), + coverData -> convert(coverData) > 2, + (coverData, state) -> new ISerializableObject.LegacyCoverData( + adjustCoverVariable(state, convert(coverData))), + widget -> widget.setPos(spaceX * 0, spaceY * 3)) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("243", "Enable with Redstone")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("244", "Disable with Redstone")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("245", "Disable machine")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2)) + .widget( + new TextWidget(GTUtility.trans("507", "Safe Mode")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3)); + } + + private int getNewCoverVariable(int id, int coverVariable) { + if (coverVariable > 2) { + return id + 3; + } else { + return id; + } + } + + private boolean getClickable(int id, int coverVariable) { + return ((id != coverVariable && id != coverVariable - 3) || id == 3); + } + + private int adjustCoverVariable(boolean safeMode, int coverVariable) { + if (safeMode && coverVariable <= 2) { + coverVariable += 3; + } + if (!safeMode && coverVariable > 2) { + coverVariable -= 3; + } + return coverVariable; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java new file mode 100644 index 0000000000..cb2690d95b --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -0,0 +1,325 @@ +package gregtech.common.covers; + +import static gregtech.api.util.GTUtility.moveMultipleItemStacks; + +import java.util.Arrays; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverConveyor extends CoverBehavior { + + public final int mTickRate; + private final int mMaxStacks; + + public CoverConveyor(int aTickRate, int maxStacks, ITexture coverTexture) { + super(coverTexture); + this.mTickRate = aTickRate; + this.mMaxStacks = maxStacks; + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if ((aCoverVariable % 6 > 1) && ((aTileEntity instanceof IMachineProgress))) { + if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { + return aCoverVariable; + } + } + final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(side); + final Object fromEntity = aCoverVariable % 2 == 0 ? aTileEntity : tTileEntity; + final Object toEntity = aCoverVariable % 2 != 0 ? aTileEntity : tTileEntity; + final ForgeDirection fromSide = aCoverVariable % 2 != 0 ? side.getOpposite() : side; + final ForgeDirection toSide = aCoverVariable % 2 == 0 ? side.getOpposite() : side; + + moveMultipleItemStacks( + fromEntity, + toEntity, + fromSide, + toSide, + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1, + this.mMaxStacks); + + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 12; + if (aCoverVariable < 0) { + aCoverVariable = 11; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("006", "Export")); + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("007", "Import")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("008", "Export (conditional)")); + case 3 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("009", "Import (conditional)")); + case 4 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("010", "Export (invert cond)")); + case 5 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("011", "Import (invert cond)")); + case 6 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("012", "Export allow Input")); + case 7 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("013", "Import allow Output")); + case 8 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("014", "Export allow Input (conditional)")); + case 9 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("015", "Import allow Output (conditional)")); + case 10 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("016", "Export allow Input (invert cond)")); + case 11 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("017", "Import allow Output (invert cond)")); + } + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return (aCoverVariable >= 6) || (aCoverVariable % 2 != 0); + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return (aCoverVariable >= 6) || (aCoverVariable % 2 == 0); + } + + @Override + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return this.mTickRate; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new ConveyorUIFactory(buildContext).createWindow(); + } + + private class ConveyorUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + private CoverDataFollowerToggleButtonWidget mBlockWidget = null; + private CoverDataFollowerToggleButtonWidget mAllowWidget = null; + + public ConveyorUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverConveyor.this, + (id, coverData) -> !getClickable(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GTUtility.trans("006", "Export")) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GTUtility.trans("007", "Import")) + .setPos(spaceX * 1, spaceY * 0)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK) + .addTooltip(GTUtility.trans("224", "Always On")) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 3, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE) + .addTooltip(GTUtility.trans("343", "Use Machine Processing State")) + .setPos(spaceX * 1, spaceY * 1)) + .addToggleButton( + 4, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE) + .addTooltip(GTUtility.trans("343.1", "Use Inverted Machine Processing State")) + .setPos(spaceX * 2, spaceY * 1)) + .addToggleButton(5, CoverDataFollowerToggleButtonWidget.ofDisableable(), widget -> { + mAllowWidget = widget; + widget.setTextureGetter(i -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return coverData == null || coverData.get() % 2 == 0 + ? GTUITextures.OVERLAY_BUTTON_ALLOW_INPUT + : GTUITextures.OVERLAY_BUTTON_ALLOW_OUTPUT; + }) + .dynamicTooltip(() -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return Arrays.asList( + coverData == null || coverData.get() % 2 == 0 + ? GTUtility.trans("314", "Allow Input") + : GTUtility.trans("312", "Allow Output")); + }) + .setPos(spaceX * 0, spaceY * 2); + }) + .addToggleButton(6, CoverDataFollowerToggleButtonWidget.ofDisableable(), widget -> { + mBlockWidget = widget; + widget.setTextureGetter(i -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return coverData == null || coverData.get() % 2 == 0 + ? GTUITextures.OVERLAY_BUTTON_BLOCK_INPUT + : GTUITextures.OVERLAY_BUTTON_BLOCK_OUTPUT; + }) + .dynamicTooltip(() -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return Arrays.asList( + coverData == null || coverData.get() % 2 == 0 + ? GTUtility.trans("313", "Block Input") + : GTUtility.trans("311", "Block Output")); + }) + .setPos(spaceX * 1, spaceY * 2); + }) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 1)) + .widget(TextWidget.dynamicString(() -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return coverData == null || coverData.get() % 2 == 0 ? GTUtility.trans("344", "Input Blocking") + : GTUtility.trans("344.1", "Output Blocking"); + }) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 2)); + } + + private int getNewCoverVariable(int id, int coverVariable) { + switch (id) { + case 0 -> { + if (mBlockWidget != null) { + mBlockWidget.notifyTooltipChange(); + } + if (mAllowWidget != null) { + mAllowWidget.notifyTooltipChange(); + } + return coverVariable & ~0x1; + } + case 1 -> { + if (mBlockWidget != null) { + mBlockWidget.notifyTooltipChange(); + } + if (mAllowWidget != null) { + mAllowWidget.notifyTooltipChange(); + } + return coverVariable | 0x1; + } + case 2 -> { + if (coverVariable > 5) return 0x6 | (coverVariable & ~0xE); + return (coverVariable & ~0xE); + } + case 3 -> { + if (coverVariable > 5) return 0x8 | (coverVariable & ~0xE); + return 0x2 | (coverVariable & ~0xE); + } + case 4 -> { + if (coverVariable > 5) return 0xA | (coverVariable & ~0xE); + return (0x4 | (coverVariable & ~0xE)); + } + case 5 -> { + if (coverVariable <= 5) return coverVariable + 6; + } + case 6 -> { + if (coverVariable > 5) return coverVariable - 6; + } + } + return coverVariable; + } + + private boolean getClickable(int id, int coverVariable) { + if (coverVariable < 0 || 11 < coverVariable) return false; + return switch (id) { + case 0, 1 -> (0x1 & coverVariable) != id; + case 2 -> (coverVariable % 6) >= 2; + case 3 -> (coverVariable % 6) < 2 || 4 <= (coverVariable % 6); + case 4 -> (coverVariable % 6) < 4; + case 5 -> coverVariable < 6; + case 6 -> coverVariable >= 6; + default -> false; + }; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverCrafting.java b/src/main/java/gregtech/common/covers/CoverCrafting.java new file mode 100644 index 0000000000..10da32033c --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverCrafting.java @@ -0,0 +1,56 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.ContainerWorkbench; +import net.minecraft.network.play.server.S2DPacketOpenWindow; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.ISerializableObject; + +public class CoverCrafting extends CoverBehavior { + + public CoverCrafting(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + if ((aPlayer instanceof EntityPlayerMP)) { + ((EntityPlayerMP) aPlayer).getNextWindowId(); + ((EntityPlayerMP) aPlayer).playerNetServerHandler.sendPacket( + new S2DPacketOpenWindow(((EntityPlayerMP) aPlayer).currentWindowId, 1, "Crafting", 9, true)); + aPlayer.openContainer = new ContainerWorkbench( + aPlayer.inventory, + aPlayer.worldObj, + aTileEntity.getXCoord(), + aTileEntity.getYCoord(), + aTileEntity.getZCoord()) { + + @Override + public boolean canInteractWith(EntityPlayer player) { + return true; + } + }; + aPlayer.openContainer.windowId = ((EntityPlayerMP) aPlayer).currentWindowId; + aPlayer.openContainer.addCraftingToCrafters((EntityPlayerMP) aPlayer); + } + return true; + } + + @Override + protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return false; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverDoesWork.java b/src/main/java/gregtech/common/covers/CoverDoesWork.java new file mode 100644 index 0000000000..1575f243ab --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverDoesWork.java @@ -0,0 +1,252 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverDoesWork extends CoverBehavior { + + private static int FLAG_INVERTED = 0x1; + private static int FLAG_PROGRESS = 0x2; + private static int FLAG_ENABLED = 0x4; + + public CoverDoesWork(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if ((aTileEntity instanceof IMachineProgress)) { + IMachineProgress mProgress = (IMachineProgress) aTileEntity; + boolean inverted = isFlagSet(aCoverVariable, FLAG_INVERTED); + int signal = 0; + + if (isFlagSet(aCoverVariable, FLAG_ENABLED)) { + signal = inverted == mProgress.isAllowedToWork() ? 0 : 15; + } else if (isFlagSet(aCoverVariable, FLAG_PROGRESS)) { + signal = inverted == (mProgress.getMaxProgress() == 0) ? 0 : 15; + } else { + int tScale = mProgress.getMaxProgress() / 15; + + if (tScale > 0 && mProgress.hasThingsToDo()) { + signal = inverted ? (15 - mProgress.getProgress() / tScale) : (mProgress.getProgress() / tScale); + } else { + signal = inverted ? 15 : 0; + } + } + + aTileEntity.setOutputRedstoneSignal(side, (byte) signal); + } else { + aTileEntity.setOutputRedstoneSignal(side, (byte) 0); + } + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 6; + if (aCoverVariable < 0) { + aCoverVariable = 5; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("018", "Normal")); + // Progress scaled + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("019", "Inverted")); + // ^ inverted + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("020", "Ready to work")); + // Not Running + case 3 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("021", "Not ready to work")); + // Running + case 4 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("028", "Machine Enabled")); + // Enabled + case 5 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("029", "Machine Disabled")); + // Disabled + } + return aCoverVariable; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 5; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new DoesWorkUIFactory(buildContext).createWindow(); + } + + private static boolean isFlagSet(int coverVariable, int flag) { + return (coverVariable & flag) == flag; + } + + private class DoesWorkUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public DoesWorkUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder + .widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverDoesWork.this, + (id, coverData) -> isEnabled(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_PROGRESS) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK) + .setPos(spaceX * 1, spaceY * 0)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON) + .setPos(spaceX * 2, spaceY * 0)) + .addToggleButton( + 3, + CoverDataFollowerToggleButtonWidget.ofRedstone(), + widget -> widget.setPos(spaceX * 0, spaceY * 1)) + .setPos(startX, startY)) + .widget(TextWidget.dynamicString(() -> { + int coverVariable = convert(getCoverData()); + + if (isFlagSet(coverVariable, FLAG_ENABLED)) { + return GTUtility.trans("271", "Machine enabled"); + } else if (isFlagSet(coverVariable, FLAG_PROGRESS)) { + return GTUtility.trans("242", "Machine idle"); + } else { + return GTUtility.trans("241", "Recipe progress"); + } + + }) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0)) + .widget( + TextWidget + .dynamicString( + () -> isFlagSet(convert(getCoverData()), FLAG_INVERTED) + ? GTUtility.trans("INVERTED", "Inverted") + : GTUtility.trans("NORMAL", "Normal")) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1)); + } + + private int getNewCoverVariable(int id, int coverVariable) { + switch (id) { + case 0 -> { + return (coverVariable & ~FLAG_ENABLED) & ~FLAG_PROGRESS; + } + case 1 -> { + return (coverVariable & ~FLAG_ENABLED) | FLAG_PROGRESS; + } + case 2 -> { + return (coverVariable & ~FLAG_PROGRESS) | FLAG_ENABLED; + } + case 3 -> { + if (isFlagSet(coverVariable, FLAG_INVERTED)) { + return coverVariable & ~FLAG_INVERTED; + } else { + return coverVariable | FLAG_INVERTED; + } + } + } + return coverVariable; + } + + private boolean isEnabled(int id, int coverVariable) { + return switch (id) { + case 0 -> !isFlagSet(coverVariable, FLAG_PROGRESS) && !isFlagSet(coverVariable, FLAG_ENABLED); + case 1 -> isFlagSet(coverVariable, FLAG_PROGRESS); + case 2 -> isFlagSet(coverVariable, FLAG_ENABLED); + case 3 -> isFlagSet(coverVariable, FLAG_INVERTED); + default -> true; + }; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverDrain.java b/src/main/java/gregtech/common/covers/CoverDrain.java new file mode 100644 index 0000000000..ff10c3a992 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverDrain.java @@ -0,0 +1,140 @@ +package gregtech.common.covers; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.IFluidHandler; + +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; + +public class CoverDrain extends CoverBehavior { + + public CoverDrain(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if ((aCoverVariable % 3 > 1) && ((aTileEntity instanceof IMachineProgress))) { + if (((IMachineProgress) aTileEntity).isAllowedToWork()) { + return aCoverVariable; + } + } + if (side != ForgeDirection.UNKNOWN) { + final Block tBlock = aTileEntity.getBlockAtSide(side); + if ((aCoverVariable < 3) && ((aTileEntity instanceof IFluidHandler))) { + if ((side == ForgeDirection.UP) && (aTileEntity.getWorld() + .isRaining()) + && (aTileEntity.getWorld() + .getPrecipitationHeight(aTileEntity.getXCoord(), aTileEntity.getZCoord()) - 2 + < aTileEntity.getYCoord())) { + int tAmount = (int) (aTileEntity.getBiome().rainfall * 10.0F); + if (tAmount > 0) { + ((IFluidHandler) aTileEntity).fill( + side, + Materials.Water.getFluid( + aTileEntity.getWorld() + .isThundering() ? tAmount * 2L : tAmount), + true); + } + } + FluidStack tLiquid = null; + if (tBlock != null) { + if (((tBlock == Blocks.water) || (tBlock == Blocks.flowing_water)) + && (aTileEntity.getMetaIDAtSide(side) == 0)) { + tLiquid = Materials.Water.getFluid(1000L); + } else if (((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava)) + && (aTileEntity.getMetaIDAtSide(side) == 0)) { + tLiquid = Materials.Lava.getFluid(1000L); + } else if ((tBlock instanceof IFluidBlock)) { + tLiquid = ((IFluidBlock) tBlock).drain( + aTileEntity.getWorld(), + aTileEntity.getOffsetX(side, 1), + aTileEntity.getOffsetY(side, 1), + aTileEntity.getOffsetZ(side, 1), + false); + } + if ((tLiquid != null) && (tLiquid.getFluid() != null) + && ((side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 // Horizontal + || ((side == ForgeDirection.DOWN) && (tLiquid.getFluid() + .getDensity() <= 0)) + || ((side == ForgeDirection.UP) && (tLiquid.getFluid() + .getDensity() >= 0))) + && (((IFluidHandler) aTileEntity).fill(side, tLiquid, false) == tLiquid.amount)) { + ((IFluidHandler) aTileEntity).fill(side, tLiquid, true); + aTileEntity.getWorld() + .setBlockToAir( + aTileEntity.getXCoord() + side.offsetX, + aTileEntity.getYCoord() + side.offsetY, + aTileEntity.getZCoord() + side.offsetZ); + } + } + } + if ((aCoverVariable >= 3) && (tBlock != null) + && ((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava) + || (tBlock == Blocks.water) + || (tBlock == Blocks.flowing_water) + || ((tBlock instanceof IFluidBlock)))) { + aTileEntity.getWorld() + .setBlock( + aTileEntity.getOffsetX(side, 1), + aTileEntity.getOffsetY(side, 1), + aTileEntity.getOffsetZ(side, 1), + Blocks.air, + 0, + 0); + } + } + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 6; + if (aCoverVariable < 0) { + aCoverVariable = 5; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("022", "Import")); + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("023", "Import (conditional)")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("024", "Import (invert cond)")); + case 3 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("025", "Keep Liquids Away")); + case 4 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("026", "Keep Liquids Away (conditional)")); + case 5 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("027", "Keep Liquids Away (invert cond)")); + } + return aCoverVariable; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return ((IMachineProgress) aTileEntity).isAllowedToWork() == aCoverVariable < 2; + } + + @Override + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return aCoverVariable < 3 ? 50 : 1; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverEUMeter.java b/src/main/java/gregtech/common/covers/CoverEUMeter.java new file mode 100644 index 0000000000..07f54012d5 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverEUMeter.java @@ -0,0 +1,408 @@ +package gregtech.common.covers; + +import java.util.function.Function; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEBasicBatteryBuffer; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerCycleButtonWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public class CoverEUMeter extends CoverBehaviorBase { + + public CoverEUMeter(ITexture coverTexture) { + super(EUMeterData.class, coverTexture); + } + + @Override + public EUMeterData createDataObject(int aLegacyData) { + return new EUMeterData(aLegacyData, 0); + } + + @Override + public EUMeterData createDataObject() { + return new EUMeterData(); + } + + @Override + protected EUMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + EUMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + final long stored = aCoverVariable.type.getTileEntityStoredEnergy(aTileEntity); + final long capacity = aCoverVariable.type.getTileEntityEnergyCapacity(aTileEntity); + + byte redstoneSignal; + + if (stored == 0L) { + // nothing + redstoneSignal = 0; + } else if (stored >= capacity) { + // full + redstoneSignal = 15; + } else { + // 1-14 range + redstoneSignal = (byte) (1 + (14 * stored) / capacity); + } + + if (aCoverVariable.inverted) { + redstoneSignal = (byte) (15 - redstoneSignal); + } + + if (aCoverVariable.threshold > 0) { + if (aCoverVariable.inverted && stored >= aCoverVariable.threshold) { + redstoneSignal = 0; + } else if (!aCoverVariable.inverted && stored < aCoverVariable.threshold) { + redstoneSignal = 0; + } + } + + aTileEntity.setOutputRedstoneSignal(side, redstoneSignal); + return aCoverVariable; + } + + @Override + protected EUMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + int num = (aCoverVariable.getNum() + (aPlayer.isSneaking() ? -1 : 1) + EnergyType.values().length * 2) + % (EnergyType.values().length * 2); + switch (num) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("031", "Normal Universal Storage")); + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("032", "Inverted Universal Storage")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("033", "Normal Electricity Storage")); + case 3 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("034", "Inverted Electricity Storage")); + case 4 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("035", "Normal Steam Storage")); + case 5 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("036", "Inverted Steam Storage")); + case 6 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("037", "Normal Average Electric Input")); + case 7 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("038", "Inverted Average Electric Input")); + case 8 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("039", "Normal Average Electric Output")); + case 9 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("040", "Inverted Average Electric Output")); + case 10 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("041", "Normal Electricity Storage(Including Batteries)")); + case 11 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("042", "Inverted Electricity Storage(Including Batteries)")); + } + aCoverVariable.setNum(num); + return aCoverVariable; + } + + // region Static Result Methods + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return false; + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, + ICoverable aTileEntity) { + return 20; + } + // endregion + + // region GUI Stuff + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new EUMeterUIFactory(buildContext).createWindow(); + } + + private class EUMeterUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public EUMeterUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + final String INVERTED = GTUtility.trans("INVERTED", "Inverted"); + final String NORMAL = GTUtility.trans("NORMAL", "Normal"); + + final CoverDataFollowerNumericWidget numericWidget = new CoverDataFollowerNumericWidget<>(); + + builder.widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverEUMeter.this).addFollower( + new CoverDataFollowerCycleButtonWidget<>(), + coverData -> coverData.type.ordinal(), + (coverData, state) -> { + coverData.type = EnergyType.getEnergyType(state); + return coverData; + }, + widget -> widget.setLength(EnergyType.values().length) + .addTooltip( + state -> EnergyType.getEnergyType(state) + .getTooltip()) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_CYCLIC) + .setPos(spaceX * 0, spaceY * 0)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofRedstone(), + coverData -> coverData.inverted, + (coverData, state) -> { + coverData.inverted = state; + return coverData; + }, + widget -> widget.addTooltip(0, NORMAL) + .addTooltip(1, INVERTED) + .setPos(spaceX * 0, spaceY * 1)) + .addFollower(numericWidget, coverData -> (double) coverData.threshold, (coverData, state) -> { + coverData.threshold = state.longValue(); + return coverData; + }, + widget -> widget.setScrollValues(1000, 100, 100000) + .setFocusOnGuiOpen(true) + .setPos(spaceX * 0, spaceY * 2 + 2) + .setSize(spaceX * 8, 12)) + .setPos(startX, startY)) + .widget( + new TextWidget() + .setStringSupplier(() -> getCoverData() != null ? getCoverData().type.getTitle() : "") + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX, 4 + startY)) + .widget( + new TextWidget() + .setStringSupplier( + () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "") + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX, 4 + startY + spaceY)) + .widget( + new TextWidget(GTUtility.trans("222.1", "Energy threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX, startY + spaceY * 3 + 4)) + + .widget( + new FakeSyncWidget.LongSyncer( + () -> getCoverData() != null + ? getCoverData().type.getTileEntityEnergyCapacity(getUIBuildContext().getTile()) + : Long.MAX_VALUE, + value -> numericWidget.setMaxValue(value))); + } + } + + // endregion + + public static class EUMeterData implements ISerializableObject { + + private EnergyType type; + private boolean inverted; + /** + * The special value {@code 0} means threshold check is disabled. + */ + private long threshold; + + public EUMeterData() { + type = EnergyType.UNIVERSAL_STORAGE; + inverted = false; + threshold = 0; + } + + public EUMeterData(EnergyType type, boolean inverted, long threshold) { + this.type = type; + this.inverted = inverted; + this.threshold = threshold; + } + + public EUMeterData(int num, long threshold) { + this(); + this.setNum(num); + this.threshold = threshold; + } + + public int getNum() { + return type.ordinal() * 2 + (inverted ? 1 : 0); + } + + public void setNum(int num) { + type = EnergyType.getEnergyType(num / 2); + inverted = num % 2 == 1; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new EUMeterData(type, inverted, threshold); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("typeOrdinal", type.ordinal()); + tag.setBoolean("inverted", inverted); + tag.setLong("threshold", threshold); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeInt(type.ordinal()); + aBuf.writeBoolean(inverted); + aBuf.writeLong(threshold); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + NBTTagCompound tag = (NBTTagCompound) aNBT; + int typeOrdinal = tag.getInteger("typeOrdinal"); + type = EnergyType.getEnergyType(typeOrdinal); + inverted = tag.getBoolean("inverted"); + threshold = tag.getLong("threshold"); + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { + int typeOrdinal = aBuf.readInt(); + type = EnergyType.getEnergyType(typeOrdinal); + inverted = aBuf.readBoolean(); + threshold = aBuf.readLong(); + return this; + } + } + + private enum EnergyType { + + UNIVERSAL_STORAGE(GTUtility.trans("301", "Universal"), GTUtility.trans("256", "Universal Storage"), + ICoverable::getUniversalEnergyStored, ICoverable::getUniversalEnergyCapacity), + ELECTRICITY_STORAGE(GTUtility.trans("302", "Int. EU"), GTUtility.trans("257", "Electricity Storage"), + ICoverable::getStoredEU, ICoverable::getEUCapacity), + STEAM_STORAGE(GTUtility.trans("303", "Steam"), GTUtility.trans("258", "Steam Storage"), + ICoverable::getStoredSteam, ICoverable::getSteamCapacity), + AVERAGE_ELECTRIC_INPUT(GTUtility.trans("304", "Avg. Input"), GTUtility.trans("259", "Average Electric Input"), + ICoverable::getAverageElectricInput, (te) -> te.getInputVoltage() * te.getInputAmperage()), + AVERAGE_ELECTRIC_OUTPUT(GTUtility.trans("305", "Avg. Output"), + GTUtility.trans("260", "Average Electric Output"), ICoverable::getAverageElectricOutput, + (te) -> te.getOutputVoltage() * te.getOutputAmperage()), + ELECTRICITY_STORAGE_INCLUDING_BATTERIES(GTUtility.trans("306", "EU stored"), + GTUtility.trans("261", "Electricity Storage(Including Batteries)"), (te) -> { + if (te instanceof IGregTechTileEntity) { + IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity(); + if (mte instanceof MTEBasicBatteryBuffer buffer) { + return buffer.getStoredEnergy()[0]; + } + } + return te.getStoredEU(); + }, (te) -> { + if (te instanceof IGregTechTileEntity) { + IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity(); + if (mte instanceof MTEBasicBatteryBuffer buffer) { + return buffer.getStoredEnergy()[1]; + } + } + return te.getEUCapacity(); + }); + + private final String title; + private final String tooltip; + private final Function getTileEntityStoredEnergyFunc; + private final Function getTileEntityEnergyCapacityFunc; + + EnergyType(String title, String tooltip, Function getTileEntityStoredEnergyFunc, + Function getTileEntityEnergyCapacityFunc) { + this.title = title; + this.tooltip = tooltip; + this.getTileEntityStoredEnergyFunc = getTileEntityStoredEnergyFunc; + this.getTileEntityEnergyCapacityFunc = getTileEntityEnergyCapacityFunc; + } + + public String getTitle() { + return title; + } + + public String getTooltip() { + return tooltip; + } + + public long getTileEntityStoredEnergy(ICoverable aTileEntity) { + return getTileEntityStoredEnergyFunc.apply(aTileEntity); + } + + public long getTileEntityEnergyCapacity(ICoverable aTileEntity) { + return getTileEntityEnergyCapacityFunc.apply(aTileEntity); + } + + public EnergyType getNext() { + return values()[(ordinal() + 1) % values().length]; + } + + public static EnergyType getEnergyType(int ordinal) { + if (ordinal < 0 || values().length <= ordinal) { + ordinal = 0; + } + return values()[ordinal]; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverFacadeAE.java b/src/main/java/gregtech/common/covers/CoverFacadeAE.java new file mode 100644 index 0000000000..2104f711c5 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverFacadeAE.java @@ -0,0 +1,31 @@ +package gregtech.common.covers; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import appeng.facade.IFacadeItem; + +public class CoverFacadeAE extends CoverFacadeBase { + + @Override + protected Block getTargetBlock(ItemStack aFacadeStack) { + if (aFacadeStack == null) return null; + final Item item = aFacadeStack.getItem(); + if (!(item instanceof IFacadeItem)) return null; + return ((IFacadeItem) item).getBlock(aFacadeStack); + } + + @Override + protected int getTargetMeta(ItemStack aFacadeStack) { + if (aFacadeStack == null) return 0; + final Item item = aFacadeStack.getItem(); + if (!(item instanceof IFacadeItem)) return 0; + return ((IFacadeItem) item).getMeta(aFacadeStack); + } + + @Override + protected ItemStack getDisplayStackImpl(int aCoverID, FacadeData aCoverVariable) { + return aCoverVariable.mStack; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverFacadeBase.java b/src/main/java/gregtech/common/covers/CoverFacadeBase.java new file mode 100644 index 0000000000..b5aa93d530 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverFacadeBase.java @@ -0,0 +1,396 @@ +package gregtech.common.covers; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.common.network.ByteBufUtils; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTRenderingWorld; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public abstract class CoverFacadeBase extends CoverBehaviorBase { + + /** + * This is the Dummy, if there is a generic Cover without behavior + */ + public CoverFacadeBase() { + super(FacadeData.class); + } + + @Override + public boolean isSimpleCover() { + return true; + } + + @Override + public FacadeData createDataObject(int aLegacyData) { + return new FacadeData(); + } + + @Override + public FacadeData createDataObject() { + return new FacadeData(); + } + + @Override + protected FacadeData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable.mFlags = ((aCoverVariable.mFlags + 1) & 15); + GTUtility.sendChatToPlayer( + aPlayer, + ((aCoverVariable.mFlags & 1) != 0 ? GTUtility.trans("128.1", "Redstone ") : "") + + ((aCoverVariable.mFlags & 2) != 0 ? GTUtility.trans("129.1", "Energy ") : "") + + ((aCoverVariable.mFlags & 4) != 0 ? GTUtility.trans("130.1", "Fluids ") : "") + + ((aCoverVariable.mFlags & 8) != 0 ? GTUtility.trans("131.1", "Items ") : "")); + return aCoverVariable; + } + + @Override + protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 1) != 0; + } + + @Override + protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 1) != 0; + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 2) != 0; + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 2) != 0; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 4) != 0; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 4) != 0; + } + + @Override + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 8) != 0; + } + + @Override + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return (aCoverVariable.mFlags & 8) != 0; + } + + @Override + public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) { + aTileEntity.setCoverIdAndDataAtSide( + side, + GTUtility.stackToInt(aCover), + new FacadeData(GTUtility.copyAmount(1, aCover), 0)); + + if (aTileEntity.isClientSide()) GTRenderingWorld.getInstance() + .register( + aTileEntity.getXCoord(), + aTileEntity.getYCoord(), + aTileEntity.getZCoord(), + getTargetBlock(aCover), + getTargetMeta(aCover)); + } + + @Override + protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + return aCoverVariable.mStack; + } + + @Override + protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + return getSpecialCoverTextureImpl(side, aCoverID, aCoverVariable, aTileEntity); + } + + @Override + protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + if (GTUtility.isStackInvalid(aCoverVariable.mStack)) return Textures.BlockIcons.ERROR_RENDERING[0]; + Block block = getTargetBlock(aCoverVariable.mStack); + if (block == null) return Textures.BlockIcons.ERROR_RENDERING[0]; + // TODO: change this when *someone* made the block render in both pass + if (block.getRenderBlockPass() != 0) return Textures.BlockIcons.ERROR_RENDERING[0]; + return TextureFactory.builder() + .setFromBlock(block, getTargetMeta(aCoverVariable.mStack)) + .useWorldCoord() + .setFromSide(side) + .build(); + } + + @Override + protected Block getFacadeBlockImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + if (GTUtility.isStackInvalid(aCoverVariable.mStack)) return null; + return getTargetBlock(aCoverVariable.mStack); + } + + @Override + protected int getFacadeMetaImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + if (GTUtility.isStackInvalid(aCoverVariable.mStack)) return 0; + return getTargetMeta(aCoverVariable.mStack); + } + + protected abstract Block getTargetBlock(ItemStack aFacadeStack); + + protected abstract int getTargetMeta(ItemStack aFacadeStack); + + @Override + protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected void onDataChangedImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity) { + if (aTileEntity.isClientSide()) GTRenderingWorld.getInstance() + .register( + aTileEntity.getXCoord(), + aTileEntity.getYCoord(), + aTileEntity.getZCoord(), + getTargetBlock(aCoverVariable.mStack), + getTargetMeta(aCoverVariable.mStack)); + } + + @Override + protected void onDroppedImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) { + if (aTileEntity.isClientSide()) { + for (final ForgeDirection iSide : ForgeDirection.VALID_DIRECTIONS) { + if (iSide == side) continue; + // since we do not allow multiple type of facade per block, this check would be enough. + if (aTileEntity.getCoverBehaviorAtSideNew(iSide) instanceof CoverFacadeBase) return; + } + if (aCoverVariable.mStack != null) + // mStack == null -> cover removed before data reach client + GTRenderingWorld.getInstance() + .unregister( + aTileEntity.getXCoord(), + aTileEntity.getYCoord(), + aTileEntity.getZCoord(), + getTargetBlock(aCoverVariable.mStack), + getTargetMeta(aCoverVariable.mStack)); + } + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + // in case cover data didn't hit client somehow. maybe he had a ridiculous view distance + aTileEntity.issueCoverUpdate(side); + return super.onCoverRightClickImpl(side, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ); + } + + @Override + public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { + // blocks that are not rendered in pass 0 are now accepted but rendered awkwardly + // to render it correctly require changing GT_Block_Machine to render in both pass, which is not really a good + // idea... + if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false; + final Block targetBlock = getTargetBlock(aStack); + if (targetBlock == null) return false; + // we allow one single type of facade on the same block for now + // otherwise it's not clear which block this block should impersonate + // this restriction can be lifted later by specifying a certain facade as dominate one as an extension to this + // class + for (final ForgeDirection iSide : ForgeDirection.VALID_DIRECTIONS) { + if (iSide == side) continue; + final CoverInfo coverInfo = aTileEntity.getCoverInfoAtSide(iSide); + if (!coverInfo.isValid()) continue; + final Block facadeBlock = coverInfo.getFacadeBlock(); + if (facadeBlock == null) continue; + if (facadeBlock != targetBlock) return false; + if (coverInfo.getFacadeMeta() != getTargetMeta(aStack)) return false; + } + return true; + } + + public static class FacadeData implements ISerializableObject { + + ItemStack mStack; + int mFlags; + + public FacadeData() {} + + public FacadeData(ItemStack mStack, int mFlags) { + this.mStack = mStack; + this.mFlags = mFlags; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new FacadeData(mStack, mFlags); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + final NBTTagCompound tag = new NBTTagCompound(); + if (mStack != null) tag.setTag("mStack", mStack.writeToNBT(new NBTTagCompound())); + tag.setByte("mFlags", (byte) mFlags); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + ByteBufUtils.writeItemStack(aBuf, mStack); + aBuf.writeByte(mFlags); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + final NBTTagCompound tag = (NBTTagCompound) aNBT; + mStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mStack")); + mFlags = tag.getByte("mFlags"); + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + mStack = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf); + mFlags = aBuf.readByte(); + return this; + } + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new FacadeBaseUIFactory(buildContext).createWindow(); + } + + private class FacadeBaseUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public FacadeBaseUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverFacadeBase.this, + this::isEnabled, + (id, coverData) -> { + coverData.mFlags = getNewCoverVariable(id, coverData); + return coverData; + }).addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofCheckAndCross(), + widget -> widget.setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofCheckAndCross(), + widget -> widget.setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofCheckAndCross(), + widget -> widget.setPos(spaceX * 0, spaceY * 2)) + .addToggleButton( + 3, + CoverDataFollowerToggleButtonWidget.ofCheckAndCross(), + widget -> widget.setPos(spaceX * 0, spaceY * 3)) + .setPos(startX, startY)) + .widget( + new ItemDrawable(() -> getCoverData() != null ? getCoverData().mStack : null).asWidget() + .setPos(5, 5) + .setSize(16, 16)) + .widget( + TextWidget.dynamicString(() -> getCoverData() != null ? getCoverData().mStack.getDisplayName() : "") + .setSynced(false) + .setDefaultColor(COLOR_TITLE.get()) + .setPos(25, 9)) + .widget( + new TextWidget(GTUtility.trans("128", "Redstone")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("129", "Energy")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("130", "Fluids")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2)) + .widget( + new TextWidget(GTUtility.trans("131", "Items")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3)); + } + + @Override + protected void addTitleToUI(ModularWindow.Builder builder) {} + + private int getNewCoverVariable(int id, FacadeData coverVariable) { + return switch (id) { + case 0 -> coverVariable.mFlags ^ 0x1; + case 1 -> coverVariable.mFlags ^ 0x2; + case 2 -> coverVariable.mFlags ^ 0x4; + case 3 -> coverVariable.mFlags ^ 0x8; + default -> coverVariable.mFlags; + }; + } + + private boolean isEnabled(int id, FacadeData coverVariable) { + return switch (id) { + case 0 -> (coverVariable.mFlags & 0x1) > 0; + case 1 -> (coverVariable.mFlags & 0x2) > 0; + case 2 -> (coverVariable.mFlags & 0x4) > 0; + case 3 -> (coverVariable.mFlags & 0x8) > 0; + default -> false; + }; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverFluidLimiter.java b/src/main/java/gregtech/common/covers/CoverFluidLimiter.java new file mode 100644 index 0000000000..4669a3a442 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverFluidLimiter.java @@ -0,0 +1,202 @@ +package gregtech.common.covers; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import io.netty.buffer.ByteBuf; + +/*** + * @author TrainerSnow#5086 + */ +public class CoverFluidLimiter extends CoverBehaviorBase { + + public CoverFluidLimiter(ITexture coverTexture) { + super(FluidLimiterData.class, coverTexture); + } + + @Override + protected FluidLimiterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + FluidLimiterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aTileEntity instanceof IFluidHandler) { + adjustThreshold(aCoverVariable, !aPlayer.isSneaking()); + GTUtility.sendChatToPlayer(aPlayer, String.format("Threshold: %f", aCoverVariable.threshold)); + } + return aCoverVariable; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidLimiterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return allowsFluidIn(aCoverVariable, aTileEntity); + } + + @Override + protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidLimiterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + /* + * Helpers + */ + + private boolean allowsFluidIn(FluidLimiterData aCoverVariable, ICoverable c) { + if (c instanceof IFluidHandler) { + return aCoverVariable.threshold > getFillLevelInputSlots((IFluidHandler) c); + } + return false; + } + + private void adjustThreshold(FluidLimiterData coverVariable, boolean way) { + if (way) { + if ((coverVariable.threshold + 0.05f) > 1F) { + coverVariable.threshold = 0F; + return; + } + coverVariable.threshold += 0.05F; + } else { + if ((Math.abs(coverVariable.threshold) - 0.05F) < 0F) { + coverVariable.threshold = 1F; + return; + } + coverVariable.threshold -= 0.05F; + } + } + + private float getFillLevelInputSlots(IFluidHandler fh) { + FluidTankInfo[] tankInfo = fh.getTankInfo(ForgeDirection.UNKNOWN); + long tMax; + long tUsed; + if (tankInfo != null) { + // 0 Because we acces first slot only + FluidTankInfo inputSlot = tankInfo[0]; + if (inputSlot.fluid != null) { + tMax = inputSlot.capacity; + tUsed = inputSlot.fluid.amount; + return (float) tUsed / (float) tMax; + } + } + return 0F; + } + + /* + * Data + */ + + @Override + public FluidLimiterData createDataObject(int aLegacyData) { + return createDataObject(); + } + + @Override + public FluidLimiterData createDataObject() { + return new FluidLimiterData(1F); + } + + public static class FluidLimiterData implements ISerializableObject { + + private float threshold; + + public FluidLimiterData(float threshold) { + this.threshold = threshold; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new FluidLimiterData(threshold); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setFloat("threshold", this.threshold); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeFloat(this.threshold); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + if (aNBT instanceof NBTTagCompound tag) { + this.threshold = tag.getFloat("threshold"); + } + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { + this.threshold = aBuf.readFloat(); + return this; + } + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new FluidLimiterUIFactory(buildContext).createWindow(); + } + + private class FluidLimiterUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public FluidLimiterUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverFluidLimiter.this) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) Math.round(coverData.threshold * 100), + (coverData, val) -> { + coverData.threshold = val.floatValue() / 100; + return coverData; + }, + widget -> widget.setBounds(0, 100) + .setFocusOnGuiOpen(true) + .setPos(startX, startY + spaceY * 2 - 24) + .setSize(spaceX * 4 - 3, 12))) + .widget( + new TextWidget("Percent threshold").setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX, startY + spaceY * 2 - 35)); + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java new file mode 100644 index 0000000000..a41ed08320 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java @@ -0,0 +1,520 @@ +package gregtech.common.covers; + +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +/** + * Cover variable + * + *

+ * 1111 1111 1111 1111 1111 1111 1111 1111
+ *  |- interval-| |- flow rate 2 compl. -|
+ * ^ export?
+ * 
+ * + * Concat export and flow rate 2 compl. together to get actual flow rate. A positive actual flow rate is export, and + * vice versa. + *

+ * Interval is an unsigned 11 bit integer minus 1, so the range is 1~2048. The stored bits will be flipped bitwise if + * speed is negative. This way, `0` means 1tick interval, while `-1` means 1 tick interval as well, preserving the + * legacy behavior. + */ +public class CoverFluidRegulator extends CoverBehaviorBase { + + private static final int SPEED_LENGTH = 20; + private static final int TICK_RATE_LENGTH = Integer.SIZE - SPEED_LENGTH - 1; + private static final int TICK_RATE_MIN = 1; + private static final int TICK_RATE_MAX = (-1 >>> (Integer.SIZE - TICK_RATE_LENGTH)) + TICK_RATE_MIN; + private static final int TICK_RATE_BITMASK = (TICK_RATE_MAX - TICK_RATE_MIN) << SPEED_LENGTH; + + public final int mTransferRate; + private boolean allowFluid = false; + + public CoverFluidRegulator(int aTransferRate, ITexture coverTexture) { + super(FluidRegulatorData.class, coverTexture); + if (aTransferRate > (-1 >>> (Integer.SIZE - SPEED_LENGTH))) + throw new IllegalArgumentException("aTransferRate too big: " + aTransferRate); + this.mTransferRate = aTransferRate; + } + + @Override + public FluidRegulatorData createDataObject(int aLegacyData) { + return new FluidRegulatorData(aLegacyData); + } + + @Override + public FluidRegulatorData createDataObject() { + return new FluidRegulatorData(); + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return aCoverVariable.condition.isRedstoneSensitive(); + } + + @Override + protected FluidRegulatorData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + FluidRegulatorData aCoverVariable, ICoverable aTileEntity, long aTimer) { + if (aCoverVariable.speed == 0 || !aCoverVariable.condition.isAllowedToWork(side, aCoverID, aTileEntity)) { + return aCoverVariable; + } + if ((aTileEntity instanceof IFluidHandler)) { + final IFluidHandler tTank1; + final IFluidHandler tTank2; + final ForgeDirection directionFrom; + final ForgeDirection directionTo; + if (aCoverVariable.speed > 0) { + tTank2 = aTileEntity.getITankContainerAtSide(side); + tTank1 = (IFluidHandler) aTileEntity; + directionFrom = side; + directionTo = side.getOpposite(); + } else { + tTank1 = aTileEntity.getITankContainerAtSide(side); + tTank2 = (IFluidHandler) aTileEntity; + directionFrom = side.getOpposite(); + directionTo = side; + } + if (tTank1 != null && tTank2 != null) { + allowFluid = true; + GTUtility + .moveFluid(tTank1, tTank2, directionFrom, Math.abs(aCoverVariable.speed), this::canTransferFluid); + allowFluid = false; + } + } + return aCoverVariable; + } + + private void adjustSpeed(EntityPlayer aPlayer, FluidRegulatorData aCoverVariable, int scale) { + int tSpeed = aCoverVariable.speed; + tSpeed += scale; + int tTickRate = aCoverVariable.tickRate; + if (Math.abs(tSpeed) > mTransferRate * tTickRate) { + tSpeed = mTransferRate * tTickRate * (tSpeed > 0 ? 1 : -1); + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("316", "Pump speed limit reached!")); + } + if (tTickRate == 1) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("048", "Pump speed: ") + tSpeed + + GTUtility.trans("049", "L/tick ") + + tSpeed * 20 + + GTUtility.trans("050", "L/sec")); + } else { + GTUtility.sendChatToPlayer( + aPlayer, + String.format( + GTUtility.trans("207", "Pump speed: %dL every %d ticks, %.2f L/sec on average"), + tSpeed, + tTickRate, + tSpeed * 20d / tTickRate)); + } + } + + @Override + public FluidRegulatorData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + FluidRegulatorData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (GTUtility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) { + adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? 256 : 16); + } else { + adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? -256 : -16); + } + return aCoverVariable; + } + + protected boolean canTransferFluid(FluidStack fluid) { + return true; + } + + @Override + public boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return allowFluid; + } + + @Override + public boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return allowFluid; + } + + @Override + protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, + ICoverable aTileEntity) { + return aCoverVariable.tickRate; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new FluidRegulatorUIFactory(buildContext).createWindow(); + } + + private class FluidRegulatorUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + private static final NumberFormatMUI numberFormat; + static { + numberFormat = new NumberFormatMUI(); + numberFormat.setMaximumFractionDigits(2); + } + + public FluidRegulatorUIFactory(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, CoverFluidRegulator.this) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.speed >= 0, + (coverData, state) -> { + coverData.speed = Math.abs(coverData.speed); + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GTUtility.trans("006", "Export")) + .setPos(spaceX * 0, spaceY * 0)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.speed <= 0, + (coverData, state) -> { + coverData.speed = -Math.abs(coverData.speed); + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GTUtility.trans("007", "Import")) + .setPos(spaceX * 1, spaceY * 0)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.condition == Conditional.Always, + (coverData, state) -> { + coverData.condition = Conditional.Always; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK) + .addTooltip(GTUtility.trans("224", "Always On")) + .setPos(spaceX * 0, spaceY * 1)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.condition == Conditional.Conditional, + (coverData, state) -> { + coverData.condition = Conditional.Conditional; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE) + .addTooltip(GTUtility.trans("343", "Use Machine Processing State")) + .setPos(spaceX * 1, spaceY * 1)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.condition == Conditional.Inverted, + (coverData, state) -> { + coverData.condition = Conditional.Inverted; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE) + .addTooltip(GTUtility.trans("343.1", "Use Inverted Machine Processing State")) + .setPos(spaceX * 2, spaceY * 1)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.speed, + (coverData, state) -> { + coverData.speed = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY) + .setValidator(val -> { + final int tickRate = getCoverData() != null ? getCoverData().tickRate : 0; + final long maxFlow = (long) mTransferRate + * GTUtility.clamp(tickRate, TICK_RATE_MIN, TICK_RATE_MAX); + warn.set(false); + if (val > maxFlow) { + val = maxFlow; + warn.set(true); + } else if (val < -maxFlow) { + val = -maxFlow; + warn.set(true); + } + return val; + }) + .setScrollValues(1, 144, 1000) + .setFocusOnGuiOpen(true) + .setPos(spaceX * 0, spaceY * 2 + 2) + .setSize(spaceX * 4 - 3, 12)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.tickRate, + (coverData, state) -> { + coverData.tickRate = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(0, TICK_RATE_MAX) + .setValidator(val -> { + final int speed = getCoverData() != null ? getCoverData().speed : 0; + warn.set(false); + if (val > TICK_RATE_MAX) { + val = (long) TICK_RATE_MAX; + warn.set(true); + } else if (Math.abs(speed) > mTransferRate * val) { + val = (long) Math + .min(TICK_RATE_MAX, (Math.abs(speed) + mTransferRate - 1) / mTransferRate); + warn.set(true); + } else if (val < TICK_RATE_MIN) { + val = 1L; + } + return val; + }) + .setPos(spaceX * 5, spaceY * 2 + 2) + .setSize(spaceX * 2 - 3, 12)) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 4, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 4, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("208", " L")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 4, 4 + startY + spaceY * 2)) + .widget( + new TextWidget(GTUtility.trans("209", " ticks")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 7, 4 + startY + spaceY * 2)) + .widget(new TextWidget().setTextSupplier(() -> { + FluidRegulatorData coverVariable = getCoverData(); + if (coverVariable == null) return new Text(""); + return new Text( + GTUtility.trans("210.1", "Average:") + " " + + numberFormat.format( + coverVariable.tickRate == 0 ? 0 : coverVariable.speed * 20d / coverVariable.tickRate) + + " " + + GTUtility.trans("210.2", "L/sec")) + .color(warn.get() ? COLOR_TEXT_WARN.get() : COLOR_TEXT_GRAY.get()); + }) + .setPos(startX + spaceX * 0, 4 + startY + spaceY * 3)); + } + } + + @Override + public boolean allowsTickRateAddition() { + return false; + } + + public enum Conditional { + + Always(false) { + + @Override + boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) { + return true; + } + }, + Conditional(true) { + + @Override + boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) { + return !(aTileEntity instanceof IMachineProgress) || ((IMachineProgress) aTileEntity).isAllowedToWork(); + } + }, + Inverted(true) { + + @Override + boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) { + return !(aTileEntity instanceof IMachineProgress) + || !((IMachineProgress) aTileEntity).isAllowedToWork(); + } + }; + + static final Conditional[] VALUES = values(); + private final boolean redstoneSensitive; + + Conditional(boolean redstoneSensitive) { + this.redstoneSensitive = redstoneSensitive; + } + + abstract boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity); + + boolean isRedstoneSensitive() { + return redstoneSensitive; + } + } + + public static class FluidRegulatorData implements ISerializableObject { + + private int tickRate; + private int speed; + private Conditional condition; + + private static int getSpeed(int aCoverVariable) { + // positive or 0 -> interval bits need to be set to zero + // negative -> interval bits need to be set to one + return aCoverVariable >= 0 ? aCoverVariable & ~TICK_RATE_BITMASK : aCoverVariable | TICK_RATE_BITMASK; + } + + private static int getTickRate(int aCoverVariable) { + // range: TICK_RATE_MIN ~ TICK_RATE_MAX + return ((Math.abs(aCoverVariable) & TICK_RATE_BITMASK) >>> SPEED_LENGTH) + TICK_RATE_MIN; + } + + public FluidRegulatorData() { + this(0); + } + + public FluidRegulatorData(int legacy) { + this(getTickRate(legacy), getSpeed(legacy), Conditional.Always); + } + + public FluidRegulatorData(int tickRate, int speed, Conditional condition) { + this.tickRate = tickRate; + this.speed = speed; + this.condition = condition; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new FluidRegulatorData(tickRate, speed, condition); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("mSpeed", speed); + tag.setInteger("mTickRate", tickRate); + tag.setByte("mCondition", (byte) condition.ordinal()); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeInt(tickRate) + .writeInt(speed) + .writeByte(condition.ordinal()); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + if (!(aNBT instanceof NBTTagCompound tag)) return; // not very good... + speed = tag.getInteger("mSpeed"); + tickRate = tag.getInteger("mTickRate"); + condition = Conditional.VALUES[tag.getByte("mCondition")]; + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { + return new FluidRegulatorData(aBuf.readInt(), aBuf.readInt(), Conditional.VALUES[aBuf.readUnsignedByte()]); + } + + public int getTickRate() { + return tickRate; + } + + public void setTickRate(int tickRate) { + this.tickRate = tickRate; + } + + public int getSpeed() { + return speed; + } + + public void setSpeed(int speed) { + this.speed = speed; + } + + public Conditional getCondition() { + return condition; + } + + public void setCondition(Conditional condition) { + this.condition = condition; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverFluidStorageMonitor.java b/src/main/java/gregtech/common/covers/CoverFluidStorageMonitor.java new file mode 100644 index 0000000000..bf829f1f1d --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverFluidStorageMonitor.java @@ -0,0 +1,507 @@ +package gregtech.common.covers; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR0; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR1; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR10; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR11; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR12; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR13; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR14; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR2; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR3; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR4; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR5; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR6; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR7; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR8; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR9; + +import java.util.Optional; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.ITextureBuilder; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.tileentities.storage.MTEDigitalTankBase; +import io.netty.buffer.ByteBuf; + +/** + * TODO: Implement overlay rendering only with + * {@link CoverBehaviorBase#getSpecialCoverFGTextureImpl(ForgeDirection, int, ISerializableObject, ICoverable)} + */ +public class CoverFluidStorageMonitor extends CoverBehaviorBase { + + private static final IIconContainer[] icons = new IIconContainer[] { OVERLAY_FLUID_STORAGE_MONITOR0, + OVERLAY_FLUID_STORAGE_MONITOR1, OVERLAY_FLUID_STORAGE_MONITOR2, OVERLAY_FLUID_STORAGE_MONITOR3, + OVERLAY_FLUID_STORAGE_MONITOR4, OVERLAY_FLUID_STORAGE_MONITOR5, OVERLAY_FLUID_STORAGE_MONITOR6, + OVERLAY_FLUID_STORAGE_MONITOR7, OVERLAY_FLUID_STORAGE_MONITOR8, OVERLAY_FLUID_STORAGE_MONITOR9, + OVERLAY_FLUID_STORAGE_MONITOR10, OVERLAY_FLUID_STORAGE_MONITOR11, OVERLAY_FLUID_STORAGE_MONITOR12, + OVERLAY_FLUID_STORAGE_MONITOR13, OVERLAY_FLUID_STORAGE_MONITOR14, }; + + public CoverFluidStorageMonitor() { + super(FluidStorageData.class); + } + + @Override + public FluidStorageData createDataObject(int aLegacyData) { + return new FluidStorageData(); + } + + @Override + public FluidStorageData createDataObject() { + return new FluidStorageData(); + } + + @Override + protected FluidStorageData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + FluidStorageData aCoverVariable, ICoverable aTileEntity, long aTimer) { + final FluidTankInfo[] tanks = getValidFluidTankInfosForDisplay(aTileEntity, aCoverVariable.side); + if (tanks == null) { + return aCoverVariable.disable() + .issueCoverUpdateIfNeeded(aTileEntity, side); + } + assert 0 < tanks.length; + + if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) { + aCoverVariable.setSlot(0); + } + + final FluidTankInfo tank = tanks[aCoverVariable.slot]; + if (tank == null) { + return aCoverVariable.setNullTank() + .issueCoverUpdateIfNeeded(aTileEntity, side); + } + + return aCoverVariable.setFluid(tank.fluid) + .setScale(getTankScale(tank)) + .issueCoverUpdateIfNeeded(aTileEntity, side); + } + + @Override + protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, + ICoverable aTileEntity) { + return getSpecialCoverTextureImpl(side, aCoverID, aCoverVariable, aTileEntity); + } + + @Override + protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, + ICoverable aTileEntity) { + if (aCoverVariable.slot == -1 || aCoverVariable.fluid == null || aCoverVariable.scale == 0) { + return TextureFactory.of(OVERLAY_FLUID_STORAGE_MONITOR0); + } + final IIconContainer fluidIcon = new IIconContainer() { + + @Override + public IIcon getIcon() { + return aCoverVariable.fluid.getStillIcon(); + } + + @Override + public IIcon getOverlayIcon() { + return null; + } + + @Override + public ResourceLocation getTextureFile() { + return TextureMap.locationBlocksTexture; + } + }; + + final short[] fluidRGBA = colorToRGBA(aCoverVariable.fluid.getColor()); + final ITextureBuilder fluidTextureBuilder = TextureFactory.builder() + .addIcon(fluidIcon) + .setRGBA(fluidRGBA); + if (aCoverVariable.fluid.getLuminosity() > 0) fluidTextureBuilder.glow(); + return TextureFactory.of(fluidTextureBuilder.build(), TextureFactory.of(icons[aCoverVariable.scale])); + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer == null || aPlayer.worldObj == null || aPlayer.worldObj.isRemote) { + return false; + } + final ItemStack heldItem = aPlayer.getHeldItem(); + if (aPlayer.isSneaking() || heldItem == null) { + return false; + } + final FluidTankInfo[] tanks = getValidFluidTankInfos(aTileEntity, aCoverVariable.side); + if (tanks == null) { + return false; + } + if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) { + return false; + } + final FluidTankInfo tank = tanks[aCoverVariable.slot]; + if (tank == null) { + return false; + } + IFluidHandler tankHandler = (IFluidHandler) aTileEntity; + + final ItemStack heldItemSizedOne = GTUtility.copyAmount(1, heldItem); + if (heldItemSizedOne == null || heldItemSizedOne.stackSize <= 0) { + return false; + } + + ItemStack result; + result = fillToTank(heldItemSizedOne, tankHandler, aCoverVariable.side); + if (result != null) { + replaceHeldItemStack(aPlayer, heldItem, result); + return true; + } + result = fillToContainer(heldItemSizedOne, tank, tankHandler, aCoverVariable.side); + if (result != null) { + replaceHeldItemStack(aPlayer, heldItem, result); + return true; + } + return false; + } + + protected static ItemStack fillToTank(@Nonnull ItemStack container, @Nonnull IFluidHandler tank, + ForgeDirection side) { + final FluidStack fluidToFill = GTUtility.getFluidForFilledItem(container, true); + if (fluidToFill == null || fluidToFill.getFluid() == null || fluidToFill.amount <= 0) { + return null; + } + if (!tank.canFill(side, fluidToFill.getFluid())) { + return null; + } + + if (container.getItem() instanceof IFluidContainerItem containerItem) { + final int filled = tank.fill(side, fluidToFill, true); + if (filled == 0) { + return null; + } + containerItem.drain(container, filled, true); + return container; + } else { + final int filled = tank.fill(side, fluidToFill, false); + if (filled != fluidToFill.amount) { + return null; + } + tank.fill(side, fluidToFill, true); + return GTUtility.getContainerForFilledItem(container, false); + } + } + + protected static ItemStack fillToContainer(@Nonnull ItemStack container, @Nonnull FluidTankInfo tankInfo, + @Nonnull IFluidHandler tank, ForgeDirection side) { + if (tankInfo.fluid == null || tankInfo.fluid.getFluid() == null || tankInfo.fluid.amount <= 0) { + return null; + } + if (!tank.canDrain(side, tankInfo.fluid.getFluid())) { + return null; + } + + if (container.getItem() instanceof IFluidContainerItem containerItem) { + final int filled = Math.min( + Optional + .ofNullable( + tank.drain( + side, + new FluidStack(tankInfo.fluid.getFluid(), containerItem.getCapacity(container)), + false)) + .filter(fs -> GTUtility.areFluidsEqual(fs, tankInfo.fluid)) + .map(fs -> fs.amount) + .orElse(0), + containerItem.fill( + container, + new FluidStack(tankInfo.fluid.getFluid(), containerItem.getCapacity(container)), + false)); + if (filled == 0) { + return null; + } + containerItem.fill(container, new FluidStack(tankInfo.fluid.getFluid(), filled), true); + tank.drain(side, new FluidStack(tankInfo.fluid.getFluid(), filled), true); + return container; + } else { + final ItemStack filledContainer = GTUtility.fillFluidContainer(tankInfo.fluid, container, false, false); + if (filledContainer == null) { + return null; + } + final FluidStack filledFluid = GTUtility.getFluidForFilledItem(filledContainer, false); + if (filledFluid == null || filledFluid.getFluid() == null || filledFluid.amount <= 0) { + return null; + } + if (Optional.ofNullable(tank.drain(side, filledFluid, false)) + .filter(fs -> GTUtility.areFluidsEqual(fs, filledFluid)) + .map(fs -> fs.amount) + .orElse(0) != filledFluid.amount) { + return null; + } + tank.drain(side, filledFluid, true); + return filledContainer; + } + } + + protected static void replaceHeldItemStack(@Nonnull EntityPlayer player, @Nonnull ItemStack heldItem, + @Nonnull ItemStack result) { + heldItem.stackSize--; + GTUtility.addItemToPlayerInventory(player, result); + player.inventoryContainer.detectAndSendChanges(); + } + + @Override + protected FluidStorageData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + FluidStorageData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) { + aCoverVariable + .setSide(ForgeDirection.values()[(aCoverVariable.side.ordinal() + 1) % ForgeDirection.values().length]) + .setSlot(0); + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("SIDE", "Side: ") + aCoverVariable.side.name()); + return aCoverVariable; + } + final FluidTankInfo[] tanks = getValidFluidTankInfos(aTileEntity, aCoverVariable.side); + if (tanks == null) { + return aCoverVariable.disable(); + } + assert 0 < tanks.length; + if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) { + aCoverVariable.setSlot(0); + } else { + aCoverVariable + .setSlot((aCoverVariable.slot + tanks.length + (aPlayer.isSneaking() ? -1 : 1)) % tanks.length); + } + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("053", "Slot: ") + aCoverVariable.slot); + return aCoverVariable; + } + + @Override + protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, + ICoverable aTileEntity) { + return 10; + } + + @Nullable + protected static FluidTankInfo[] getValidFluidTankInfos(@Nullable ICoverable tileEntity, + @Nonnull ForgeDirection side) { + if (tileEntity instanceof IFluidHandler) { + final FluidTankInfo[] tanks = ((IFluidHandler) tileEntity).getTankInfo(side); + if (tanks != null && tanks.length > 0) { + return tanks; + } + } + return null; + } + + @Nullable + protected static FluidTankInfo[] getValidFluidTankInfosForDisplay(@Nullable ICoverable tileEntity, + @Nonnull ForgeDirection side) { + if (tileEntity instanceof IGregTechTileEntity baseMetaTileEntity + && baseMetaTileEntity.getMetaTileEntity() instanceof MTEDigitalTankBase digitalTank) { + return digitalTank.getRealTankInfo(side); + } + return getValidFluidTankInfos(tileEntity, side); + } + + protected static int getTankScale(@Nonnull FluidTankInfo tank) { + if (tank.fluid == null || tank.capacity <= 0) { + return 0; + } + return (int) Math.ceil(tank.fluid.amount / (double) tank.capacity * (icons.length - 1)); + } + + protected short[] colorToRGBA(int color) { + return new short[] { (short) (color >> 16 & 0xFF), (short) (color >> 8 & 0xFF), (short) (color & 0xFF), + (short) (0xFF) }; + } + + public static class FluidStorageData implements ISerializableObject { + + private ForgeDirection side; + private int slot; + private Fluid fluid; + private int scale; + private boolean dirty; + + public FluidStorageData() { + this(ForgeDirection.UNKNOWN, 0, null, 0, false); + } + + public FluidStorageData(ForgeDirection side, int slot, Fluid fluid, int scale, boolean dirty) { + this.side = side; + this.slot = slot; + this.fluid = fluid; + this.scale = scale; + this.dirty = dirty; + } + + public FluidStorageData setSide(ForgeDirection side) { + this.side = side; + return this; + } + + /** + * @param slot 0-based index of the tank, -1 for no correct FluidTankInfo[] for the current side. + */ + public FluidStorageData setSlot(int slot) { + if (this.slot != slot) { + if (this.slot == -1 || slot == -1) { + this.dirty = true; + } + this.slot = slot; + } + return this; + } + + /** + * Means there is no correct FluidTankInfo[] for the current side. + */ + public FluidStorageData disable() { + setSlot(-1); + return this; + } + + public FluidStorageData setFluid(@Nullable Fluid fluid) { + if (!Util.areFluidsEqual(this.fluid, fluid)) { + this.fluid = fluid; + this.dirty = true; + } + return this; + } + + public FluidStorageData setFluid(@Nullable FluidStack fluidStack) { + final Fluid fluid = fluidStack == null ? null : fluidStack.getFluid(); + return setFluid(fluid); + } + + public FluidStorageData setScale(int scale) { + if (this.scale != scale) { + this.scale = scale; + this.dirty = true; + } + return this; + } + + public FluidStorageData setNullTank() { + return this.setFluid((Fluid) null) + .setScale(0); + } + + public FluidStorageData issueCoverUpdateIfNeeded(ICoverable tileEntity, ForgeDirection side) { + if (this.dirty) { + tileEntity.issueCoverUpdate(side); + this.dirty = false; + } + return this; + } + + // region ISerializableObject + @Nonnull + @Override + public ISerializableObject copy() { + return new FluidStorageData(side, slot, fluid, scale, dirty); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + NBTTagCompound tag = (NBTTagCompound) aNBT; + side = ForgeDirection.getOrientation(tag.getByte("side")); + slot = tag.getInteger("slot"); + fluid = Util.getFluid(tag.getString("fluidName")); + scale = tag.getInteger("scale"); + dirty = tag.getBoolean("dirty"); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("side", (byte) side.ordinal()); + tag.setInteger("slot", slot); + tag.setString("fluidName", Util.getFluidName(fluid)); + tag.setInteger("scale", scale); + tag.setBoolean("dirty", dirty); + return tag; + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { + final ForgeDirection side = ForgeDirection.getOrientation(aBuf.readByte()); + final int slot = aBuf.readInt(); + final Fluid fluid = Util.getFluid(aBuf.readInt()); + final int scale = aBuf.readInt(); + final boolean dirty = aBuf.readBoolean(); + return new FluidStorageData(side, slot, fluid, scale, dirty); + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeByte(side.ordinal()); + aBuf.writeInt(slot); + aBuf.writeInt(Util.getFluidID(fluid)); + aBuf.writeInt(scale); + aBuf.writeBoolean(dirty); + } + // endregion + + } + + protected static class Util { + + public static int getFluidID(@Nullable Fluid fluid) { + return fluid == null ? -1 : fluid.getID(); + } + + public static String getFluidName(@Nullable Fluid fluid) { + return fluid == null ? "" : fluid.getName(); + } + + public static Fluid getFluid(int id) { + return id == -1 ? null : FluidRegistry.getFluid(id); + } + + public static Fluid getFluid(String name) { + return name.isEmpty() ? null : FluidRegistry.getFluid(name); + } + + public static boolean areFluidsEqual(@Nullable Fluid a, @Nullable Fluid b) { + return getFluidID(a) == getFluidID(b); + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverFluidfilter.java b/src/main/java/gregtech/common/covers/CoverFluidfilter.java new file mode 100644 index 0000000000..630a7c9ddf --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverFluidfilter.java @@ -0,0 +1,414 @@ +package gregtech.common.covers; + +import static gregtech.api.enums.GTValues.E; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerSlotWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public class CoverFluidfilter extends CoverBehaviorBase { + + // Uses the lower 3 bits of the cover variable, so we have 8 options to work with (0-7) + private final int FILTER_INPUT_DENY_OUTPUT = 0; // 000 + private final int INVERT_INPUT_DENY_OUTPUT = 1; // 001 + private final int FILTER_INPUT_ANY_OUTPUT = 2; // 010 + private final int INVERT_INPUT_ANY_OUTPUT = 3; // 011 + private final int DENY_INPUT_FILTER_OUTPUT = 4; // 100 + private final int DENY_INPUT_INVERT_OUTPUT = 5; // 101 + private final int ANY_INPUT_FILTER_OUTPUT = 6; // 110 + private final int ANY_INPUT_INVERT_OUTPUT = 7; // 111 + + public CoverFluidfilter(ITexture coverTexture) { + super(FluidFilterData.class, coverTexture); + } + + @Override + public FluidFilterData createDataObject() { + return new FluidFilterData(-1, 0); + } + + @Override + public FluidFilterData createDataObject(int aLegacyData) { + return new FluidFilterData(aLegacyData >>> 3, aLegacyData & 0x7); + } + + @Override + protected String getDescriptionImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity) { + final Fluid fluid = FluidRegistry.getFluid(aCoverVariable.mFluidID); + if (fluid == null) return E; + + final FluidStack sFluid = new FluidStack(fluid, 1000); + return (String + .format("Filtering Fluid: %s - %s", sFluid.getLocalizedName(), getFilterMode(aCoverVariable.mFilterMode))); + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return false; + } + + @Override + protected FluidFilterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + FluidFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + return aCoverVariable; + } + + public String getFilterMode(int aFilterMode) { + return switch (aFilterMode) { + case FILTER_INPUT_DENY_OUTPUT -> GTUtility.trans("043", "Filter input, Deny output"); + case INVERT_INPUT_DENY_OUTPUT -> GTUtility.trans("044", "Invert input, Deny output"); + case FILTER_INPUT_ANY_OUTPUT -> GTUtility.trans("045", "Filter input, Permit any output"); + case INVERT_INPUT_ANY_OUTPUT -> GTUtility.trans("046", "Invert input, Permit any output"); + case DENY_INPUT_FILTER_OUTPUT -> GTUtility.trans("307", "Deny input, Filter output"); + case DENY_INPUT_INVERT_OUTPUT -> GTUtility.trans("308", "Deny input, Invert output"); + case ANY_INPUT_FILTER_OUTPUT -> GTUtility.trans("309", "Permit any input, Filter output"); + case ANY_INPUT_INVERT_OUTPUT -> GTUtility.trans("310", "Permit any input, Invert output"); + default -> ("UNKNOWN"); + }; + } + + @Override + protected FluidFilterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + FluidFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable.mFilterMode = (aCoverVariable.mFilterMode + (aPlayer.isSneaking() ? -1 : 1)) % 8; + if (aCoverVariable.mFilterMode < 0) { + aCoverVariable.mFilterMode = 7; + } + + GTUtility.sendChatToPlayer(aPlayer, getFilterMode(aCoverVariable.mFilterMode)); + + return aCoverVariable; + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (side == ForgeDirection.UNKNOWN) return false; + if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D))) + || (side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0 && aZ > 0.375D && aZ < 0.625D + || (side.offsetZ != 0)) { + final ItemStack tStack = aPlayer.inventory.getCurrentItem(); + if (tStack == null) return true; + + final FluidStack tFluid = GTUtility.getFluidForFilledItem(tStack, true); + if (tFluid != null) { + final int aFluid = tFluid.getFluidID(); + aCoverVariable.mFluidID = aFluid; + aTileEntity.setCoverDataAtSide(side, aCoverVariable); + final FluidStack sFluid = new FluidStack(FluidRegistry.getFluid(aFluid), 1000); + GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("047", "Filter Fluid: ") + sFluid.getLocalizedName()); + } + return true; + } + return false; + } + + @Override + protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + if (aFluid == null) return true; + + int aFilterMode = aCoverVariable.mFilterMode; + int aFilterFluid = aCoverVariable.mFluidID; + + if (aFilterMode == DENY_INPUT_FILTER_OUTPUT || aFilterMode == DENY_INPUT_INVERT_OUTPUT) return false; + else if (aFilterMode == ANY_INPUT_FILTER_OUTPUT || aFilterMode == ANY_INPUT_INVERT_OUTPUT) return true; + else if (aFluid.getID() == aFilterFluid) + return aFilterMode == FILTER_INPUT_DENY_OUTPUT || aFilterMode == FILTER_INPUT_ANY_OUTPUT; + else return aFilterMode == INVERT_INPUT_DENY_OUTPUT || aFilterMode == INVERT_INPUT_ANY_OUTPUT; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + if (aFluid == null) return true; + + int aFilterMode = aCoverVariable.mFilterMode; + int aFilterFluid = aCoverVariable.mFluidID; + + if (aFilterMode == FILTER_INPUT_DENY_OUTPUT || aFilterMode == INVERT_INPUT_DENY_OUTPUT) return false; + else if (aFilterMode == FILTER_INPUT_ANY_OUTPUT || aFilterMode == INVERT_INPUT_ANY_OUTPUT) return true; + else if (aFluid.getID() == aFilterFluid) + return aFilterMode == DENY_INPUT_FILTER_OUTPUT || aFilterMode == ANY_INPUT_FILTER_OUTPUT; + else return aFilterMode == DENY_INPUT_INVERT_OUTPUT || aFilterMode == ANY_INPUT_INVERT_OUTPUT; + } + + @Override + protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, + ICoverable aTileEntity) { + return 0; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new FluidFilterUIFactory(buildContext).createWindow(); + } + + private class FluidFilterUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public FluidFilterUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverFluidfilter.this, + (id, coverData) -> !getClickable(id, coverData), + (id, coverData) -> { + coverData.mFilterMode = getNewFilterMode(id, coverData); + return coverData; + }).addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GTUtility.trans("232", "Filter Input")) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GTUtility.trans("233", "Filter Output")) + .setPos(spaceX * 1, spaceY * 0)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_BLOCK_INPUT) + .addTooltip(GTUtility.trans("234", "Block Output")) + .setPos(spaceX * 0, spaceY * 2)) + .addToggleButton( + 3, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_ALLOW_INPUT) + .addTooltip(GTUtility.trans("235", "Allow Output")) + .setPos(spaceX * 1, spaceY * 2)) + .addToggleButton( + 4, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_WHITELIST) + .addTooltip(GTUtility.trans("236", "Whitelist Fluid")) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 5, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_BLACKLIST) + .addTooltip(GTUtility.trans("237", "Blacklist Fluid")) + .setPos(spaceX * 1, spaceY * 1)) + .addFollower(new CoverDataFollowerSlotWidget(new ItemStackHandler(), 0, true) { + + @Override + protected void putClickedStack(ItemStack stack, int mouseButton) { + if (stack != null && GTUtility.getFluidFromContainerOrFluidDisplay(stack) == null) + return; + super.putClickedStack( + GTUtility.getFluidDisplayStack( + GTUtility.getFluidFromContainerOrFluidDisplay(stack), + false), + mouseButton); + } + }, this::getFluidDisplayItem, (coverData, stack) -> { + if (stack == null) { + coverData.mFluidID = -1; + } else { + FluidStack fluid = GTUtility.getFluidFromDisplayStack(stack); + if (fluid != null && fluid.getFluid() != null) { + coverData.mFluidID = fluid.getFluid() + .getID(); + } + } + return coverData; + }, + widget -> widget.setBackground(ModularUITextures.FLUID_SLOT) + .setPos(0, spaceY * 3 + 2)) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("238", "Filter Direction")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 2, 3 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("239", "Filter Type")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 2, 3 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("240", "Block Flow")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 2, 3 + startY + spaceY * 2)) + .widget(TextWidget.dynamicString(() -> { + if (getCoverData() != null) { + ItemStack fluidDisplay = getFluidDisplayItem(getCoverData()); + if (fluidDisplay != null) { + return fluidDisplay.getDisplayName(); + } + } + return GTUtility.trans("315", "Filter Empty"); + }) + .setSynced(false) + .setDefaultColor(COLOR_TITLE.get()) + .setPos(startX + spaceX + 3, 4 + startY + spaceY * 3)); + } + + private int getNewFilterMode(int id, FluidFilterData coverVariable) { + return switch (id) { + case 0 -> (coverVariable.mFilterMode & 0x3); + case 1 -> (coverVariable.mFilterMode | 0x4); + case 2 -> (coverVariable.mFilterMode & 0x5); + case 3 -> (coverVariable.mFilterMode | 0x2); + case 4 -> (coverVariable.mFilterMode & 0x6); + case 5 -> (coverVariable.mFilterMode | 0x1); + default -> coverVariable.mFilterMode; + }; + } + + private boolean getClickable(int id, FluidFilterData coverVariable) { + return switch (id) { + case 0, 1 -> (coverVariable.mFilterMode >> 2 & 0x1) != (id & 0x1); + case 2, 3 -> (coverVariable.mFilterMode >> 1 & 0x1) != (id & 0x1); + case 4, 5 -> (coverVariable.mFilterMode & 0x1) != (id & 0x1); + default -> false; + }; + } + + private ItemStack getFluidDisplayItem(FluidFilterData coverData) { + Fluid fluid = FluidRegistry.getFluid(coverData.mFluidID); + return GTUtility.getFluidDisplayStack(fluid); + } + } + + public static class FluidFilterData implements ISerializableObject { + + private int mFluidID; + private int mFilterMode; + + public FluidFilterData(int mFluidID, int mFilterMode) { + this.mFluidID = mFluidID; + this.mFilterMode = mFilterMode; + } + + @Override + @Nonnull + public ISerializableObject copy() { + return new FluidFilterData(mFluidID, mFilterMode); + } + + @Override + @Nonnull + public NBTBase saveDataToNBT() { + NBTTagCompound tNBT = new NBTTagCompound(); + tNBT.setInteger("mFilterMode", mFilterMode); + if (mFluidID >= 0) tNBT.setString( + "mFluid", + FluidRegistry.getFluid(mFluidID) + .getName()); + return tNBT; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeByte(mFilterMode) + .writeInt(mFluidID); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + if (aNBT instanceof NBTTagCompound tNBT) { + mFilterMode = tNBT.getInteger("mFilterMode"); + if (tNBT.hasKey("mFluid", NBT.TAG_STRING)) + mFluidID = FluidRegistry.getFluidID(tNBT.getString("mFluid")); + else mFluidID = -1; + } + } + + @Override + @Nonnull + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + mFilterMode = aBuf.readByte(); + mFluidID = aBuf.readInt(); + return this; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverInfo.java b/src/main/java/gregtech/common/covers/CoverInfo.java index 48f6dd9748..0a3ef3a07b 100644 --- a/src/main/java/gregtech/common/covers/CoverInfo.java +++ b/src/main/java/gregtech/common/covers/CoverInfo.java @@ -15,12 +15,12 @@ import org.jetbrains.annotations.NotNull; import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import gregtech.api.GregTech_API; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.GregTechAPI; +import gregtech.api.gui.modularui.CoverUIBuildContext; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; import gregtech.api.util.ISerializableObject; public final class CoverInfo { @@ -33,7 +33,7 @@ public final class CoverInfo { public static final CoverInfo EMPTY_INFO = new CoverInfo(ForgeDirection.UNKNOWN, null); private final ForgeDirection coverSide; private int coverID = 0; - private GT_CoverBehaviorBase coverBehavior; + private CoverBehaviorBase coverBehavior; private ISerializableObject coverData; private final WeakReference coveredTile; private boolean needsUpdate = false; @@ -43,13 +43,13 @@ public final class CoverInfo { public CoverInfo(ForgeDirection side, ICoverable aTile) { coverSide = side; coveredTile = new WeakReference<>(aTile); - coverBehavior = GregTech_API.sNoBehavior; + coverBehavior = GregTechAPI.sNoBehavior; } public CoverInfo(ForgeDirection side, int aID, ICoverable aTile, ISerializableObject aCoverData) { coverSide = side; coverID = aID; - coverBehavior = GregTech_API.getCoverBehaviorNew(aID); + coverBehavior = GregTechAPI.getCoverBehaviorNew(aID); coverData = aCoverData == null ? coverBehavior.createDataObject() : aCoverData; coveredTile = new WeakReference<>(aTile); } @@ -57,7 +57,7 @@ public final class CoverInfo { public CoverInfo(ICoverable aTile, NBTTagCompound aNBT) { coverSide = ForgeDirection.getOrientation(aNBT.getByte(NBT_SIDE)); coverID = aNBT.getInteger(NBT_ID); - coverBehavior = GregTech_API.getCoverBehaviorNew(coverID); + coverBehavior = GregTechAPI.getCoverBehaviorNew(coverID); coverData = aNBT.hasKey(NBT_DATA) ? coverBehavior.createDataObject(aNBT.getTag(NBT_DATA)) : coverBehavior.createDataObject(); coveredTile = new WeakReference<>(aTile); @@ -89,13 +89,13 @@ public final class CoverInfo { needsUpdate = aUpdate; } - public GT_CoverBehaviorBase getCoverBehavior() { + public CoverBehaviorBase getCoverBehavior() { return coverBehavior; } public ISerializableObject getCoverData() { if (coverData != null) return coverData; - return GregTech_API.sNoBehavior.createDataObject(); + return GregTechAPI.sNoBehavior.createDataObject(); } public boolean onCoverRemoval(boolean aForced) { @@ -160,7 +160,7 @@ public final class CoverInfo { } public void updateCoverBehavior() { - coverBehavior = GregTech_API.getCoverBehaviorNew(coverID); + coverBehavior = GregTechAPI.getCoverBehaviorNew(coverID); } public void preDataChanged(int aCoverID, ISerializableObject aCoverData) { @@ -176,7 +176,7 @@ public final class CoverInfo { } public ModularWindow createWindow(EntityPlayer player) { - final GT_CoverUIBuildContext buildContext = new GT_CoverUIBuildContext( + final CoverUIBuildContext buildContext = new CoverUIBuildContext( player, coverID, coverSide, @@ -246,7 +246,7 @@ public final class CoverInfo { public void onCoverJackhammer(EntityPlayer aPlayer) { adjustTickRateMultiplier(aPlayer.isSneaking()); - GT_Utility.sendChatToPlayer( + GTUtility.sendChatToPlayer( aPlayer, StatCollector.translateToLocalFormatted("gt.cover.info.chat.tick_rate", getCurrentTickRateFormatted())); } diff --git a/src/main/java/gregtech/common/covers/CoverItemFilter.java b/src/main/java/gregtech/common/covers/CoverItemFilter.java new file mode 100644 index 0000000000..acdbda795b --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverItemFilter.java @@ -0,0 +1,298 @@ +package gregtech.common.covers; + +import static gregtech.api.util.GTUtility.intToStack; +import static gregtech.api.util.GTUtility.moveMultipleItemStacks; + +import java.util.Collections; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.common.network.ByteBufUtils; +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerSlotWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public class CoverItemFilter extends CoverBehaviorBase { + + private final boolean mExport; + + public CoverItemFilter(boolean isExport, ITexture coverTexture) { + super(ItemFilterData.class, coverTexture); + this.mExport = isExport; + } + + @Override + public ItemFilterData createDataObject(int aLegacyData) { + return new ItemFilterData((aLegacyData & 0x1) == 0, intToStack(aLegacyData >>> 1)); + } + + @Override + public ItemFilterData createDataObject() { + return new ItemFilterData(); + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return false; + } + + @Override + protected ItemFilterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ItemFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(side); + final Object fromEntity = mExport ? aTileEntity : tTileEntity; + final Object toEntity = !mExport ? aTileEntity : tTileEntity; + final ForgeDirection fromSide = !mExport ? side.getOpposite() : side; + final ForgeDirection toSide = mExport ? side.getOpposite() : side; + + final List filter = Collections.singletonList(aCoverVariable.mFilter); + + moveMultipleItemStacks( + fromEntity, + toEntity, + fromSide, + toSide, + filter, + aCoverVariable.mWhitelist, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1, + 64); + + return aCoverVariable; + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + final ItemStack tStack = aPlayer.inventory.getCurrentItem(); + if (tStack != null) { + aCoverVariable.mFilter = tStack; + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("299", "Item Filter: ") + tStack.getDisplayName()); + } else { + aCoverVariable.mFilter = null; + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("300", "Filter Cleared!")); + } + return true; + } + + @Override + protected ItemFilterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + ItemFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable.mWhitelist = !aCoverVariable.mWhitelist; + GTUtility.sendChatToPlayer( + aPlayer, + aCoverVariable.mWhitelist ? GTUtility.trans("125.1", "Whitelist Mode") + : GTUtility.trans("124.1", "Blacklist Mode")); + return aCoverVariable; + } + + @Override + protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + @Override + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, + ICoverable aTileEntity) { + return 1; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new ItemFilterUIFactory(buildContext).createWindow(); + } + + private class ItemFilterUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public ItemFilterUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + ItemStackHandler filterInvHandler = new ItemStackHandler(1); + if (getCoverData() != null) { + filterInvHandler.setStackInSlot(0, setStackSize1(getCoverData().mFilter)); + } + builder.widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverItemFilter.this) + .addFollower( + new CoverDataFollowerToggleButtonWidget<>(), + coverData -> coverData.mWhitelist, + (coverData, state) -> { + coverData.mWhitelist = state; + return coverData; + }, + widget -> widget + .setToggleTexture( + GTUITextures.OVERLAY_BUTTON_BLACKLIST, + GTUITextures.OVERLAY_BUTTON_WHITELIST) + .addTooltip(0, GTUtility.trans("125.1", "Whitelist Mode")) + .addTooltip(1, GTUtility.trans("124.1", "Blacklist Mode")) + .setPos(spaceX * 0, spaceY * 0)) + .addFollower( + new CoverDataFollowerSlotWidget<>(filterInvHandler, 0, true), + coverData -> setStackSize1(coverData.mFilter), + (coverData, stack) -> { + coverData.mFilter = setStackSize1(stack); + return coverData; + }, + widget -> widget.setBackground(GTUITextures.SLOT_DARK_GRAY) + .setPos(spaceX * 0, spaceY * 2)) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("317", "Filter: ")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 0, 3 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("318", "Check Mode")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 2, 3 + startY + spaceY * 0)); + } + + private ItemStack setStackSize1(ItemStack stack) { + if (stack != null) { + stack.stackSize = 1; + } + return stack; + } + } + + public static class ItemFilterData implements ISerializableObject { + + private boolean mWhitelist; + private ItemStack mFilter; + + public ItemFilterData() {} + + public ItemFilterData(boolean mWhitelist, ItemStack mFilter) { + this.mWhitelist = mWhitelist; + this.mFilter = mFilter; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new ItemFilterData(mWhitelist, mFilter); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setBoolean("mWhitelist", mWhitelist); + if (mFilter != null) tag.setTag("mFilter", mFilter.writeToNBT(new NBTTagCompound())); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeBoolean(mWhitelist); + ByteBufUtils.writeItemStack(aBuf, mFilter); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + NBTTagCompound tag = (NBTTagCompound) aNBT; + mWhitelist = tag.getBoolean("mWhitelist"); + if (tag.hasKey("mFilter", Constants.NBT.TAG_COMPOUND)) + mFilter = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mFilter")); + else mFilter = null; + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + mWhitelist = aBuf.readBoolean(); + mFilter = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf); + return this; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverItemMeter.java b/src/main/java/gregtech/common/covers/CoverItemMeter.java new file mode 100644 index 0000000000..376a93682c --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverItemMeter.java @@ -0,0 +1,384 @@ +package gregtech.common.covers; + +import java.text.FieldPosition; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import gregtech.common.gui.modularui.widget.ItemWatcherSlotWidget; +import gregtech.common.tileentities.machines.MTEHatchOutputBusME; +import gregtech.common.tileentities.storage.MTEDigitalChestBase; +import io.netty.buffer.ByteBuf; + +public class CoverItemMeter extends CoverBehaviorBase { + + // Legacy data format + private static final int SLOT_MASK = 0x3FFFFFFF; // 0 = all, 1 = 0 ... + private static final int CONVERTED_BIT = 0x80000000; + private static final int INVERT_BIT = 0x40000000; + + public CoverItemMeter(ITexture coverTexture) { + super(ItemMeterData.class, coverTexture); + } + + @Override + public ItemMeterData createDataObject(int aLegacyData) { + // Convert from ver. 5.09.33.50 + if ((CONVERTED_BIT & aLegacyData) == 0) if (aLegacyData == 0) aLegacyData = CONVERTED_BIT; + else if (aLegacyData == 1) aLegacyData = CONVERTED_BIT | INVERT_BIT; + else if (aLegacyData > 1) aLegacyData = CONVERTED_BIT | Math.min((aLegacyData - 2), SLOT_MASK); + + boolean invert = (aLegacyData & INVERT_BIT) == INVERT_BIT; + int slot = (aLegacyData & SLOT_MASK) - 1; + + return new ItemMeterData(invert, slot, 0); + } + + @Override + public ItemMeterData createDataObject() { + return new ItemMeterData(); + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return false; + } + + public static byte computeSignalBasedOnItems(ICoverable tileEntity, boolean inverted, int threshold, int slot, + int ordinalSide) { + long max = 0; + long used = 0; + final IMetaTileEntity mte = ((IGregTechTileEntity) tileEntity).getMetaTileEntity(); + if (mte instanceof MTEDigitalChestBase dc) { + max = dc.getMaxItemCount(); + used = dc.getProgresstime(); + } else if (mte instanceof MTEHatchOutputBusME) { + if (((MTEHatchOutputBusME) mte).canAcceptItem()) { + max = 64; + used = 0; + } + } else { + final int[] slots = slot >= 0 ? new int[] { slot } : tileEntity.getAccessibleSlotsFromSide(ordinalSide); + + for (int i : slots) { + if (i >= 0 && i < tileEntity.getSizeInventory()) { + max += 64; + final ItemStack stack = tileEntity.getStackInSlot(i); + if (stack != null) used += ((long) stack.stackSize << 6) / stack.getMaxStackSize(); + } + } + } + + return GTUtility.convertRatioToRedstone(used, max, threshold, inverted); + } + + @Override + protected ItemMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ItemMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + byte signal = computeSignalBasedOnItems( + aTileEntity, + aCoverVariable.inverted, + aCoverVariable.threshold, + aCoverVariable.slot, + side.ordinal()); + aTileEntity.setOutputRedstoneSignal(side, signal); + + return aCoverVariable; + } + + @Override + protected ItemMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, + ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) { + if (aCoverVariable.inverted) { + aCoverVariable.inverted = false; + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("055", "Normal")); + } else { + aCoverVariable.inverted = true; + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("054", "Inverted")); + } + } else { + aCoverVariable.slot++; + if (aCoverVariable.slot > aTileEntity.getSizeInventory()) aCoverVariable.slot = -1; + + if (aCoverVariable.slot == -1) + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("053", "Slot: ") + GTUtility.trans("ALL", "All")); + else GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("053", "Slot: ") + aCoverVariable.slot); + } + + return aCoverVariable; + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + ItemMeterData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, + ICoverable aTileEntity) { + return 5; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new ItemMeterUIFactory(buildContext).createWindow(); + } + + private class ItemMeterUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + /** + * Display the text "All" instead of a number when the slot is set to -1. + */ + protected static final NumberFormatMUI numberFormatAll = new NumberFormatMUI() { + + @Override + public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { + if (number < 0) { + return toAppendTo.append(GTUtility.trans("ALL", "All")); + } else { + return super.format(number, toAppendTo, pos); + } + } + }; + + private int maxSlot; + private int maxThreshold; + + public ItemMeterUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + final String INVERTED = GTUtility.trans("INVERTED", "Inverted"); + final String NORMAL = GTUtility.trans("NORMAL", "Normal"); + + setMaxSlot(); + setMaxThreshold(); + + builder.widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverItemMeter.this) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofRedstone(), + coverData -> coverData.inverted, + (coverData, state) -> { + coverData.inverted = state; + return coverData; + }, + widget -> widget.addTooltip(0, NORMAL) + .addTooltip(1, INVERTED) + .setPos(0, 0)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.threshold, + (coverData, state) -> { + coverData.threshold = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(0, maxThreshold) + .setScrollValues(1, 64, 1000) + .setFocusOnGuiOpen(true) + .setPos(0, 2 + spaceY) + .setSize(spaceX * 4 + 5, 12)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.slot, + (coverData, state) -> { + coverData.slot = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(-1, maxSlot) + .setDefaultValue(-1) + .setScrollValues(1, 100, 10) + .setNumberFormat(numberFormatAll) + .setPos(0, 2 + spaceY * 2) + .setSize(spaceX * 3 + 1, 12)) + .setPos(startX, startY)) + .widget( + new ItemWatcherSlotWidget().setGetter(this::getTargetItem) + .setPos(startX + spaceX * 3 + 8, startY + spaceY * 2)) + .widget( + new TextWidget() + .setStringSupplier( + () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "") + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX, 4 + startY)) + .widget( + new TextWidget(GTUtility.trans("254", "Detect slot #")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 4 + 9, 4 + startY + spaceY * 2)) + .widget( + new TextWidget(GTUtility.trans("221", "Item threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 4 + 9, 4 + startY + spaceY)); + } + + private void setMaxSlot() { + final ICoverable tile = getUIBuildContext().getTile(); + if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile + && !(gtTile.getMetaTileEntity() instanceof MTEDigitalChestBase)) { + maxSlot = Math.min(tile.getSizeInventory() - 1, SLOT_MASK - 1); + } else { + maxSlot = -1; + } + } + + private void setMaxThreshold() { + final ICoverable tile = getUIBuildContext().getTile(); + if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile + && gtTile.getMetaTileEntity() instanceof MTEDigitalChestBase) { + maxThreshold = gtTile.getMaxItemCount(); + } else { + maxThreshold = maxSlot > 0 ? maxSlot * 64 : Integer.MAX_VALUE; + } + } + + private ItemStack getTargetItem() { + ItemMeterData coverVariable = getCoverData(); + if (coverVariable == null || coverVariable.slot < 0) { + return null; + } + ICoverable tile = getUIBuildContext().getTile(); + if (tile instanceof TileEntity && !tile.isDead()) { + if (tile.getSizeInventory() >= coverVariable.slot) { + return tile.getStackInSlot(coverVariable.slot); + } + } + return null; + } + } + + public static class ItemMeterData implements ISerializableObject { + + private boolean inverted; + /** The special value {@code -1} means all slots. */ + private int slot; + /** The special value {@code 0} means threshold check is disabled. */ + private int threshold; + + public ItemMeterData() { + inverted = false; + slot = -1; + threshold = 0; + } + + public ItemMeterData(boolean inverted, int slot, int threshold) { + this.inverted = inverted; + this.slot = slot; + this.threshold = threshold; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new ItemMeterData(inverted, slot, threshold); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setBoolean("invert", inverted); + tag.setInteger("slot", slot); + tag.setInteger("threshold", threshold); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeBoolean(inverted); + aBuf.writeInt(slot); + aBuf.writeInt(threshold); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + NBTTagCompound tag = (NBTTagCompound) aNBT; + inverted = tag.getBoolean("invert"); + slot = tag.getInteger("slot"); + threshold = tag.getInteger("threshold"); + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + inverted = aBuf.readBoolean(); + slot = aBuf.readInt(); + threshold = aBuf.readInt(); + return this; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverLens.java b/src/main/java/gregtech/common/covers/CoverLens.java new file mode 100644 index 0000000000..37c257ff4d --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverLens.java @@ -0,0 +1,28 @@ +package gregtech.common.covers; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; + +public class CoverLens extends CoverBehavior { + + private final byte mColor; + + public CoverLens(byte aColor, ITexture coverTexture) { + super(coverTexture); + this.mColor = aColor; + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public byte getLensColor(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return this.mColor; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverLiquidMeter.java b/src/main/java/gregtech/common/covers/CoverLiquidMeter.java new file mode 100644 index 0000000000..2f13f25421 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverLiquidMeter.java @@ -0,0 +1,292 @@ +package gregtech.common.covers; + +import java.util.Arrays; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import gregtech.common.tileentities.storage.MTEDigitalTankBase; +import io.netty.buffer.ByteBuf; + +/** + * TODO: Implement overlay rendering only with + * {@link CoverBehaviorBase#getSpecialCoverFGTextureImpl(ForgeDirection, int, ISerializableObject, ICoverable)} + */ +public class CoverLiquidMeter extends CoverBehaviorBase { + + public CoverLiquidMeter(ITexture coverTexture) { + super(LiquidMeterData.class, coverTexture); + } + + @Override + public LiquidMeterData createDataObject(int aLegacyData) { + return new LiquidMeterData(aLegacyData == 0, 0); + } + + @Override + public LiquidMeterData createDataObject() { + return new LiquidMeterData(); + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return false; + } + + public static byte computeSignalBasedOnFluid(ICoverable tileEntity, boolean inverted, int threshold) { + if (tileEntity instanceof IFluidHandler) { + FluidTankInfo[] tanks = ((IFluidHandler) tileEntity).getTankInfo(ForgeDirection.UNKNOWN); + long max = 0; + long used = 0; + if (tanks != null) { + for (FluidTankInfo tank : tanks) { + if (tank != null) { + if (tileEntity instanceof BaseMetaTileEntity + && ((BaseMetaTileEntity) tileEntity).getMetaTileEntity() instanceof MTEDigitalTankBase) { + max += ((MTEDigitalTankBase) ((BaseMetaTileEntity) tileEntity).getMetaTileEntity()) + .getRealCapacity(); + } else max += tank.capacity; + FluidStack tLiquid = tank.fluid; + if (tLiquid != null) { + used += tLiquid.amount; + } + } + } + } + + return GTUtility.convertRatioToRedstone(used, max, threshold, inverted); + } else { + return 0; + } + } + + @Override + protected LiquidMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + LiquidMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + byte signal = computeSignalBasedOnFluid(aTileEntity, aCoverVariable.inverted, aCoverVariable.threshold); + aTileEntity.setOutputRedstoneSignal(side, signal); + + return aCoverVariable; + } + + @Override + protected LiquidMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, + LiquidMeterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aCoverVariable.inverted) { + aCoverVariable.inverted = false; + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("055", "Normal")); + } else { + aCoverVariable.inverted = true; + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("054", "Inverted")); + } + return aCoverVariable; + } + + @Override + protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + LiquidMeterData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, + ICoverable aTileEntity) { + return 5; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new LiquidMeterUIFactory(buildContext).createWindow(); + } + + private class LiquidMeterUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + private int maxCapacity; + + public LiquidMeterUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + final String INVERTED = GTUtility.trans("INVERTED", "Inverted"); + final String NORMAL = GTUtility.trans("NORMAL", "Normal"); + + setMaxCapacity(); + + builder.widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverLiquidMeter.this) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofRedstone(), + coverData -> coverData.inverted, + (coverData, state) -> { + coverData.inverted = state; + return coverData; + }, + widget -> widget.addTooltip(0, NORMAL) + .addTooltip(1, INVERTED) + .setPos(spaceX * 0, spaceY * 0)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.threshold, + (coverData, state) -> { + coverData.threshold = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(0, maxCapacity > 0 ? maxCapacity : Integer.MAX_VALUE) + .setScrollValues(1000, 144, 100000) + .setFocusOnGuiOpen(true) + .setPos(spaceX * 0, spaceY * 1 + 2) + .setSize(spaceX * 4 + 5, 12)) + .setPos(startX, startY)) + .widget( + new TextWidget() + .setStringSupplier( + () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "") + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("222", "Fluid threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5 - 10, startY + spaceY * 1 + 4)); + } + + private void setMaxCapacity() { + final ICoverable tile = getUIBuildContext().getTile(); + if (!tile.isDead() && tile instanceof IFluidHandler) { + FluidTankInfo[] tanks = ((IFluidHandler) tile).getTankInfo(ForgeDirection.UNKNOWN); + maxCapacity = Arrays.stream(tanks) + .mapToInt(tank -> tank.capacity) + .sum(); + } else { + maxCapacity = -1; + } + } + } + + public static class LiquidMeterData implements ISerializableObject { + + private boolean inverted; + /** + * The special value {@code 0} means threshold check is disabled. + */ + private int threshold; + + public LiquidMeterData() { + inverted = false; + threshold = 0; + } + + public LiquidMeterData(boolean inverted, int threshold) { + this.inverted = inverted; + this.threshold = threshold; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new LiquidMeterData(inverted, threshold); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setBoolean("invert", inverted); + tag.setInteger("threshold", threshold); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeBoolean(inverted); + aBuf.writeInt(threshold); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + NBTTagCompound tag = (NBTTagCompound) aNBT; + inverted = tag.getBoolean("invert"); + threshold = tag.getInteger("threshold"); + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + inverted = aBuf.readBoolean(); + threshold = aBuf.readInt(); + return this; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverMetricsTransmitter.java b/src/main/java/gregtech/common/covers/CoverMetricsTransmitter.java new file mode 100644 index 0000000000..9715fd11f0 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverMetricsTransmitter.java @@ -0,0 +1,211 @@ +package gregtech.common.covers; + +import java.util.List; +import java.util.UUID; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.ImmutableList; +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.enums.ItemList; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetricsExporter; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.ISerializableObject; +import gregtech.common.events.MetricsCoverDataEvent; +import gregtech.common.events.MetricsCoverSelfDestructEvent; +import gregtech.common.misc.GlobalMetricsCoverDatabase; +import gregtech.common.misc.GlobalMetricsCoverDatabase.State; +import io.netty.buffer.ByteBuf; + +/** + * Used to transmit Nuclear Control information across dimensions. The only reason this is a cover is to artificially + * limit the number of total machines that transmit this data, for performance reasons. + *

+ * This cover will retrieve information, preferentially, using {@link IMetricsExporter#reportMetrics()}. Absent this + * method, it will resort to {@link BaseMetaTileEntity#getInfoData()} instead. + */ +public class CoverMetricsTransmitter extends CoverBehaviorBase { + + @SuppressWarnings("SpellCheckingInspection") + public static final String FREQUENCY_MSB_KEY = "gt.metricscover.freq_msb"; + @SuppressWarnings("SpellCheckingInspection") + public static final String FREQUENCY_LSB_KEY = "gt.metricscover.freq_lsb"; + public static final String MACHINE_KEY = "machine_name"; + public static final String CARD_STATE_KEY = "card_state"; + + @SuppressWarnings("unused") + public CoverMetricsTransmitter() { + this(null); + } + + public CoverMetricsTransmitter(ITexture coverTexture) { + super(MetricsTransmitterData.class, coverTexture); + } + + @Override + public MetricsTransmitterData createDataObject(int aLegacyData) { + // As a new cover, this shouldn't fire. + return new MetricsTransmitterData(); + } + + @Override + public MetricsTransmitterData createDataObject() { + return new MetricsTransmitterData(); + } + + @Override + protected int getTickRateImpl(ForgeDirection side, int aCoverID, MetricsTransmitterData aCoverVariable, + ICoverable aTileEntity) { + return 20; + } + + @Override + public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { + return aTileEntity instanceof final IGregTechDeviceInformation device && device.isGivingInformation(); + } + + @Override + protected MetricsTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + MetricsTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + if (aTileEntity instanceof final BaseMetaTileEntity baseMTE && baseMTE.isGivingInformation()) { + final List payload; + + if (baseMTE.getMetaTileEntity() instanceof final IMetricsExporter metricsExporter) { + payload = metricsExporter.reportMetrics(); + } else { + payload = ImmutableList.copyOf(baseMTE.getInfoData()); + } + + MinecraftForge.EVENT_BUS.post(new MetricsCoverDataEvent( + aCoverVariable.frequency, + payload, + new GlobalMetricsCoverDatabase.Coordinates( + baseMTE.getWorld().provider.getDimensionName(), + baseMTE.getXCoord(), + baseMTE.getYCoord(), + baseMTE.getZCoord() + ) + )); + } + + return aCoverVariable; + } + + @Override + protected void onDroppedImpl(ForgeDirection side, int aCoverID, MetricsTransmitterData aCoverVariable, + ICoverable aTileEntity) { + MinecraftForge.EVENT_BUS.post(new MetricsCoverSelfDestructEvent(aCoverVariable.frequency)); + } + + @Override + public void onPlayerAttach(EntityPlayer player, ItemStack aCover, ICoverable aTileEntity, ForgeDirection side) { + final UUID newFrequency = UUID.randomUUID(); + final ItemStack cardStack = ItemList.NC_AdvancedSensorCard.get(1); + + if (cardStack == null) { + return; + } + + final NBTTagCompound tagCompound = new NBTTagCompound(); + tagCompound.setLong(FREQUENCY_MSB_KEY, newFrequency.getMostSignificantBits()); + tagCompound.setLong(FREQUENCY_LSB_KEY, newFrequency.getLeastSignificantBits()); + tagCompound.setInteger(CARD_STATE_KEY, State.OPERATIONAL.getType()); + + if (aTileEntity instanceof final BaseMetaTileEntity baseMTE) { + final ItemStack baseMTEStack = baseMTE.getStackForm(1); + if (baseMTEStack != null) { + tagCompound.setTag(MACHINE_KEY, baseMTEStack.writeToNBT(new NBTTagCompound())); + } + } + + cardStack.setTagCompound(tagCompound); + aTileEntity.getCoverInfoAtSide(side) + .setCoverData(new MetricsTransmitterData(newFrequency)); + + final EntityItem cardEntity = new EntityItem(player.worldObj, player.posX, player.posY, player.posZ, cardStack); + cardEntity.delayBeforeCanPickup = 0; + player.worldObj.spawnEntityInWorld(cardEntity); + } + + @Override + public boolean allowsCopyPasteTool() { + return false; + } + + @Override + public List getAdditionalTooltipImpl(MetricsTransmitterData data) { + return ImmutableList.of( + StatCollector.translateToLocalFormatted( + "gt.item.adv_sensor_card.tooltip.frequency", + EnumChatFormatting.UNDERLINE.toString() + EnumChatFormatting.YELLOW + data.frequency.toString())); + } + + public static class MetricsTransmitterData implements ISerializableObject { + + private UUID frequency; + + public MetricsTransmitterData() { + this.frequency = UUID.randomUUID(); + } + + public MetricsTransmitterData(@NotNull UUID frequency) { + this.frequency = frequency; + } + + @NotNull + public UUID getFrequency() { + return frequency; + } + + @NotNull + @Override + public ISerializableObject copy() { + return new MetricsTransmitterData(frequency); + } + + @NotNull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setLong(FREQUENCY_MSB_KEY, frequency.getMostSignificantBits()); + tag.setLong(FREQUENCY_LSB_KEY, frequency.getLeastSignificantBits()); + return tag; + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + if (aNBT instanceof final NBTTagCompound tag) { + frequency = new UUID(tag.getLong(FREQUENCY_MSB_KEY), tag.getLong(FREQUENCY_LSB_KEY)); + } + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeLong(frequency.getMostSignificantBits()); + aBuf.writeLong(frequency.getLeastSignificantBits()); + } + + @NotNull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { + return new MetricsTransmitterData(new UUID(aBuf.readLong(), aBuf.readLong())); + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverNeedMaintainance.java b/src/main/java/gregtech/common/covers/CoverNeedMaintainance.java new file mode 100644 index 0000000000..f137ce5844 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverNeedMaintainance.java @@ -0,0 +1,297 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverNeedMaintainance extends CoverBehavior { + + public CoverNeedMaintainance(ITexture coverTexture) { + super(coverTexture); + } + + public static boolean isRotor(ItemStack rotor) { + return (rotor != null && rotor.getItem() instanceof MetaGeneratedTool + && rotor.getItemDamage() >= 170 + && rotor.getItemDamage() <= 176); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + boolean needsRepair = false; + if (aTileEntity instanceof IGregTechTileEntity tTileEntity) { + final IMetaTileEntity mTileEntity = tTileEntity.getMetaTileEntity(); + if (mTileEntity instanceof MTEMultiBlockBase multi) { + final int ideal = multi.getIdealStatus(); + final int real = multi.getRepairStatus(); + final ItemStack tRotor = multi.getRealInventory()[1]; + final int coverVar = aCoverVariable >>> 1; + if (coverVar < 5) { + if (ideal - real > coverVar) needsRepair = true; + } else if (coverVar == 5 || coverVar == 6) { + if (isRotor(tRotor)) { + long tMax = MetaGeneratedTool.getToolMaxDamage(tRotor); + long tCur = MetaGeneratedTool.getToolDamage(tRotor); + if (coverVar == 5) { + needsRepair = (tCur >= tMax * 8 / 10); + } else { + long mExpectedDamage = Math.round( + Math.min( + multi.mEUt / multi.damageFactorLow, + Math.pow(multi.mEUt, multi.damageFactorHigh))); + needsRepair = tCur + mExpectedDamage * 2 >= tMax; + } + } else { + needsRepair = true; + } + } + } + } + if (aCoverVariable % 2 == 0) { + needsRepair = !needsRepair; + } + + aTileEntity.setOutputRedstoneSignal(side, (byte) (needsRepair ? 0 : 15)); + aTileEntity.setOutputRedstoneSignal(side.getOpposite(), (byte) (needsRepair ? 0 : 15)); + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 14; + if (aCoverVariable < 0) { + aCoverVariable = 13; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("056", "Emit if 1 Maintenance Needed")); + case 1 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("057", "Emit if 1 Maintenance Needed(inverted)")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("058", "Emit if 2 Maintenance Needed")); + case 3 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("059", "Emit if 2 Maintenance Needed(inverted)")); + case 4 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("060", "Emit if 3 Maintenance Needed")); + case 5 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("061", "Emit if 3 Maintenance Needed(inverted)")); + case 6 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("062", "Emit if 4 Maintenance Needed")); + case 7 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("063", "Emit if 4 Maintenance Needed(inverted)")); + case 8 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("064", "Emit if 5 Maintenance Needed")); + case 9 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("065", "Emit if 5 Maintenance Needed(inverted)")); + case 10 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("066", "Emit if rotor needs maintenance low accuracy mod")); + case 11 -> GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("067", "Emit if rotor needs maintenance low accuracy mod(inverted)")); + case 12 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("068", "Emit if rotor needs maintenance high accuracy mod")); + case 13 -> GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("069", "Emit if rotor needs maintenance high accuracy mod(inverted)")); + } + return aCoverVariable; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 60; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new NeedMaintainanceUIFactory(buildContext).createWindow(); + } + + private class NeedMaintainanceUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public NeedMaintainanceUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + final String[] tooltipText = { GTUtility.trans("056", "Emit if 1 Maintenance Needed"), + GTUtility.trans("058", "Emit if 2 Maintenance Needed"), + GTUtility.trans("060", "Emit if 3 Maintenance Needed"), + GTUtility.trans("062", "Emit if 4 Maintenance Needed"), + GTUtility.trans("064", "Emit if 5 Maintenance Needed"), + GTUtility.trans("066", "Emit if rotor needs maintenance low accuracy mod"), + GTUtility.trans("068", "Emit if rotor needs maintenance high accuracy mod"), }; + + final String[] buttonText = { GTUtility.trans("247", "1 Issue"), GTUtility.trans("248", "2 Issues"), + GTUtility.trans("249", "3 Issues"), GTUtility.trans("250", "4 Issues"), + GTUtility.trans("251", "5 Issues"), GTUtility.trans("252", "Rotor < 20%"), + GTUtility.trans("253", "Rotor ≈ 0%"), GTUtility.trans("INVERTED", "Inverted"), + GTUtility.trans("NORMAL", "Normal"), }; + + builder + .widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverNeedMaintainance.this, + (index, coverData) -> isEnabled(index, convert(coverData)), + (index, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(index, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(tooltipText[0]) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(tooltipText[1]) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(tooltipText[2]) + .setPos(spaceX * 0, spaceY * 2)) + .addToggleButton( + 3, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(tooltipText[3]) + .setPos(spaceX * 0, spaceY * 3)) + .addToggleButton( + 4, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(tooltipText[4]) + .setPos(spaceX * 4 + 4, spaceY * 0)) + .addToggleButton( + 5, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(tooltipText[5]) + .setPos(spaceX * 4 + 4, spaceY * 1)) + .addToggleButton( + 6, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(tooltipText[6]) + .setPos(spaceX * 4 + 4, spaceY * 2)) + .addToggleButton( + 7, + CoverDataFollowerToggleButtonWidget.ofRedstone(), + widget -> widget.setPos(spaceX * 4 + 4, spaceY * 3)) + .setPos(startX, startY)) + .widget( + new TextWidget(buttonText[0]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(buttonText[1]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(buttonText[2]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 2)) + .widget( + new TextWidget(buttonText[3]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 3)) + .widget( + new TextWidget(buttonText[4]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(buttonText[5]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(buttonText[6]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 2)) + .widget( + TextWidget + .dynamicString(() -> isEnabled(7, convert(getCoverData())) ? buttonText[7] : buttonText[8]) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 3)); + } + + private int getNewCoverVariable(int id, int coverVariable) { + final boolean checked = (coverVariable & 0x1) > 0; + if (id == 7) { + if (checked) return coverVariable & ~0x1; + else return coverVariable | 0x1; + } + return (coverVariable & 0x1) | (id << 1); + } + + private boolean isEnabled(int id, int coverVariable) { + if (id == 7) return (coverVariable & 0x1) > 0; + return (coverVariable >>> 1) == id; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverPlayerDetector.java b/src/main/java/gregtech/common/covers/CoverPlayerDetector.java new file mode 100644 index 0000000000..48fe9260bb --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverPlayerDetector.java @@ -0,0 +1,202 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverPlayerDetector extends CoverBehavior { + + private String placer = ""; + private int range = 8; + + public CoverPlayerDetector(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + boolean playerDetected = false; + + if (aTileEntity instanceof IGregTechTileEntity) { + if (aTileEntity.isUniversalEnergyStored(20)) { + aTileEntity.decreaseStoredEnergyUnits(20, true); + range = 32; + } else { + range = 8; + } + placer = ((IGregTechTileEntity) aTileEntity).getOwnerName(); + } + for (Object tObject : aTileEntity.getWorld().playerEntities) { + if ((tObject instanceof EntityPlayerMP tEntity)) { + int dist = Math.max( + 1, + (int) tEntity.getDistance( + aTileEntity.getXCoord() + 0.5D, + aTileEntity.getYCoord() + 0.5D, + aTileEntity.getZCoord() + 0.5D)); + if (dist < range) { + if (aCoverVariable == 0) { + playerDetected = true; + break; + } + if (tEntity.getDisplayName() + .equalsIgnoreCase(placer)) { + if (aCoverVariable == 1) { + playerDetected = true; + break; + } + } else if (aCoverVariable == 2) { + playerDetected = true; + break; + } + } + } + } + + aTileEntity.setOutputRedstoneSignal(side, (byte) (playerDetected ? 15 : 0)); + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 3; + if (aCoverVariable < 0) { + aCoverVariable = 2; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("068.1", "Emit if any Player is close")); + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("069.1", "Emit if other Player is close")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("070", "Emit if you are close")); + } + return aCoverVariable; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 20; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new PlayerDetectorUIFactory(buildContext).createWindow(); + } + + private class PlayerDetectorUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public PlayerDetectorUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder + .widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverPlayerDetector.this, + (index, coverData) -> index == convert(coverData), + (index, coverData) -> new ISerializableObject.LegacyCoverData(index)) + .addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(GTUtility.trans("068.1", "Emit if any Player is close")) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(GTUtility.trans("069.1", "Emit if other Player is close")) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.addTooltip(GTUtility.trans("070", "Emit if you are close")) + .setPos(spaceX * 0, spaceY * 2)) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("319", "Any player")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("320", "Other players")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("321", "Only owner")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, 4 + startY + spaceY * 2)); + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java new file mode 100644 index 0000000000..99d39dccad --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -0,0 +1,331 @@ +package gregtech.common.covers; + +import java.util.Arrays; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverPump extends CoverBehavior { + + public final int mTransferRate; + + public CoverPump(int aTransferRate, ITexture coverTexture) { + super(coverTexture); + this.mTransferRate = aTransferRate; + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if ((aCoverVariable % 6 > 1) && ((aTileEntity instanceof IMachineProgress))) { + if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { + return aCoverVariable; + } + } + + if (aTileEntity instanceof IFluidHandler current) { + final IFluidHandler toAccess = aTileEntity.getITankContainerAtSide(side); + if (toAccess == null) return aCoverVariable; + + transferFluid(current, toAccess, side, aCoverVariable % 2 == 0); + } + return aCoverVariable; + } + + protected void transferFluid(IFluidHandler current, IFluidHandler toAccess, ForgeDirection side, boolean export) { + IFluidHandler source = export ? current : toAccess; + IFluidHandler dest = export ? toAccess : current; + ForgeDirection drainSide = export ? side : side.getOpposite(); + GTUtility.moveFluid(source, dest, drainSide, mTransferRate, this::canTransferFluid); + } + + protected boolean canTransferFluid(FluidStack fluid) { + return true; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 12; + if (aCoverVariable < 0) { + aCoverVariable = 11; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("006", "Export")); + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("007", "Import")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("008", "Export (conditional)")); + case 3 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("009", "Import (conditional)")); + case 4 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("010", "Export (invert cond)")); + case 5 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("011", "Import (invert cond)")); + case 6 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("012", "Export allow Input")); + case 7 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("013", "Import allow Output")); + case 8 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("014", "Export allow Input (conditional)")); + case 9 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("015", "Import allow Output (conditional)")); + case 10 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("016", "Export allow Input (invert cond)")); + case 11 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("017", "Import allow Output (invert cond)")); + } + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + if ((aCoverVariable > 1) && ((aTileEntity instanceof IMachineProgress))) { + if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { + return false; + } + } + return (aCoverVariable >= 6) || (aCoverVariable % 2 != 0); + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + if ((aCoverVariable > 1) && ((aTileEntity instanceof IMachineProgress))) { + if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { + return false; + } + } + return (aCoverVariable >= 6) || (aCoverVariable % 2 == 0); + } + + @Override + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new PumpUIFactory(buildContext).createWindow(); + } + + private class PumpUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + private CoverDataFollowerToggleButtonWidget mBlockWidget = null; + private CoverDataFollowerToggleButtonWidget mAllowWidget = null; + + public PumpUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverPump.this, + (id, coverData) -> !getClickable(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GTUtility.trans("006", "Export")) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GTUtility.trans("007", "Import")) + .setPos(spaceX * 1, spaceY * 0)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK) + .addTooltip(GTUtility.trans("224", "Always On")) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 3, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE) + .addTooltip(GTUtility.trans("343", "Use Machine Processing State")) + .setPos(spaceX * 1, spaceY * 1)) + .addToggleButton( + 4, + CoverDataFollowerToggleButtonWidget.ofDisableable(), + widget -> widget + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE) + .addTooltip(GTUtility.trans("343.1", "Use Inverted Machine Processing State")) + .setPos(spaceX * 2, spaceY * 1)) + .addToggleButton(5, CoverDataFollowerToggleButtonWidget.ofDisableable(), widget -> { + mAllowWidget = widget; + widget.setTextureGetter(i -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return coverData == null || coverData.get() % 2 == 0 + ? GTUITextures.OVERLAY_BUTTON_ALLOW_INPUT + : GTUITextures.OVERLAY_BUTTON_ALLOW_OUTPUT; + }) + .dynamicTooltip(() -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return Arrays.asList( + coverData == null || coverData.get() % 2 == 0 + ? GTUtility.trans("314", "Allow Input") + : GTUtility.trans("312", "Allow Output")); + }) + .setPos(spaceX * 0, spaceY * 2); + }) + .addToggleButton(6, CoverDataFollowerToggleButtonWidget.ofDisableable(), widget -> { + mBlockWidget = widget; + widget.setTextureGetter(i -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return coverData == null || coverData.get() % 2 == 0 + ? GTUITextures.OVERLAY_BUTTON_BLOCK_INPUT + : GTUITextures.OVERLAY_BUTTON_BLOCK_OUTPUT; + }) + .dynamicTooltip(() -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return Arrays.asList( + coverData == null || coverData.get() % 2 == 0 + ? GTUtility.trans("313", "Block Input") + : GTUtility.trans("311", "Block Output")); + }) + .setPos(spaceX * 1, spaceY * 2); + }) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 1)) + .widget(TextWidget.dynamicString(() -> { + ISerializableObject.LegacyCoverData coverData = getCoverData(); + return coverData == null || coverData.get() % 2 == 0 ? GTUtility.trans("344", "Input Blocking") + : GTUtility.trans("344.1", "Output Blocking"); + }) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 2)); + } + + private int getNewCoverVariable(int id, int coverVariable) { + switch (id) { + case 0 -> { + if (mBlockWidget != null) { + mBlockWidget.notifyTooltipChange(); + } + if (mAllowWidget != null) { + mAllowWidget.notifyTooltipChange(); + } + return coverVariable & ~0x1; + } + case 1 -> { + if (mBlockWidget != null) { + mBlockWidget.notifyTooltipChange(); + } + if (mAllowWidget != null) { + mAllowWidget.notifyTooltipChange(); + } + return coverVariable | 0x1; + } + case 2 -> { + if (coverVariable > 5) return 0x6 | (coverVariable & ~0xE); + return (coverVariable & ~0xE); + } + case 3 -> { + if (coverVariable > 5) return 0x8 | (coverVariable & ~0xE); + return 0x2 | (coverVariable & ~0xE); + } + case 4 -> { + if (coverVariable > 5) return 0xA | (coverVariable & ~0xE); + return (0x4 | (coverVariable & ~0xE)); + } + case 5 -> { + if (coverVariable <= 5) return coverVariable + 6; + } + case 6 -> { + if (coverVariable > 5) return coverVariable - 6; + } + } + return coverVariable; + } + + private boolean getClickable(int id, int coverVariable) { + if (coverVariable < 0 | 11 < coverVariable) return false; + return switch (id) { + case 0, 1 -> (0x1 & coverVariable) != id; + case 2 -> (coverVariable % 6) >= 2; + case 3 -> (coverVariable % 6) < 2 | 4 <= (coverVariable % 6); + case 4 -> (coverVariable % 6) < 4; + case 5 -> coverVariable < 6; + case 6 -> coverVariable >= 6; + default -> false; + }; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverRedstoneConductor.java b/src/main/java/gregtech/common/covers/CoverRedstoneConductor.java new file mode 100644 index 0000000000..a85a20b703 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverRedstoneConductor.java @@ -0,0 +1,101 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; + +@SuppressWarnings("unused") // Legacy from GT4. TODO: Consider re-enable registration +public class CoverRedstoneConductor extends CoverBehavior { + + CoverRedstoneConductor(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if (aCoverVariable == 0) { + aTileEntity.setOutputRedstoneSignal(side, aTileEntity.getStrongestRedstone()); + } else if (aCoverVariable < 7) { + aTileEntity.setOutputRedstoneSignal( + side, + aTileEntity.getInternalInputRedstoneSignal(ForgeDirection.getOrientation((aCoverVariable - 1)))); + } + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 7; + if (aCoverVariable < 0) { + aCoverVariable = 6; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("071", "Conducts strongest Input")); + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("072", "Conducts from bottom Input")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("073", "Conducts from top Input")); + case 3 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("074", "Conducts from north Input")); + case 4 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("075", "Conducts from south Input")); + case 5 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("076", "Conducts from west Input")); + case 6 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("077", "Conducts from east Input")); + } + return aCoverVariable; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverRedstoneReceiverExternal.java b/src/main/java/gregtech/common/covers/CoverRedstoneReceiverExternal.java new file mode 100644 index 0000000000..aeaacb3404 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverRedstoneReceiverExternal.java @@ -0,0 +1,41 @@ +package gregtech.common.covers; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; + +public class CoverRedstoneReceiverExternal extends CoverRedstoneWirelessBase { + + public CoverRedstoneReceiverExternal(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + aTileEntity.setOutputRedstoneSignal( + side, + GregTechAPI.sWirelessRedstone.get(aCoverVariable) == null ? 0 + : GregTechAPI.sWirelessRedstone.get(aCoverVariable)); + return aCoverVariable; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverRedstoneReceiverInternal.java b/src/main/java/gregtech/common/covers/CoverRedstoneReceiverInternal.java new file mode 100644 index 0000000000..0fc5802ba4 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverRedstoneReceiverInternal.java @@ -0,0 +1,46 @@ +package gregtech.common.covers; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.ISerializableObject; + +public class CoverRedstoneReceiverInternal extends CoverRedstoneWirelessBase { + + public CoverRedstoneReceiverInternal(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if (aTileEntity instanceof IMachineProgress) { + if (getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity) > 0) + ((IMachineProgress) aTileEntity).enableWorking(); + else((IMachineProgress) aTileEntity).disableWorking(); + ((IMachineProgress) aTileEntity).setWorkDataValue(aInputRedstone); + } + return aCoverVariable; + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + return true; + } + + @Override + public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return GregTechAPI.sWirelessRedstone.get(aCoverVariable) == null ? 0 + : GregTechAPI.sWirelessRedstone.get(aCoverVariable); + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverRedstoneSignalizer.java b/src/main/java/gregtech/common/covers/CoverRedstoneSignalizer.java new file mode 100644 index 0000000000..0f3937044a --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverRedstoneSignalizer.java @@ -0,0 +1,98 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; + +@SuppressWarnings("unused") // TODO: Consider re-registering this +public class CoverRedstoneSignalizer extends CoverBehavior { + + CoverRedstoneSignalizer(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + 1) % 48; + switch (aCoverVariable / 16) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("078", "Signal = ") + (aCoverVariable & 0xF)); + case 1 -> GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("079", "Conditional Signal = ") + (aCoverVariable & 0xF)); + case 2 -> GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("080", "Inverted Conditional Signal = ") + (aCoverVariable & 0xF)); + } + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + if (aCoverVariable < 16) { + return (byte) (aCoverVariable & 0xF); + } + if ((aTileEntity instanceof IMachineProgress)) { + if (((IMachineProgress) aTileEntity).isAllowedToWork()) { + if (aCoverVariable / 16 == 1) { + return (byte) (aCoverVariable & 0xF); + } + } else if (aCoverVariable / 16 == 2) { + return (byte) (aCoverVariable & 0xF); + } + return 0; + } + return (byte) (aCoverVariable & 0xF); + } +} diff --git a/src/main/java/gregtech/common/covers/CoverRedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/CoverRedstoneTransmitterExternal.java new file mode 100644 index 0000000000..130ba4c5d7 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverRedstoneTransmitterExternal.java @@ -0,0 +1,53 @@ +package gregtech.common.covers; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.covers.IControlsWorkCover; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.ISerializableObject; + +public class CoverRedstoneTransmitterExternal extends CoverRedstoneWirelessBase { + + public CoverRedstoneTransmitterExternal(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + // TODO remove next line after 2.3.0 + if (!IControlsWorkCover.makeSureOnlyOne(side, aTileEntity)) return aCoverVariable; + GregTechAPI.sWirelessRedstone.put(aCoverVariable, aInputRedstone); + return aCoverVariable; + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + return true; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } + + @Override + public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { + if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false; + for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { + if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { + return false; + } + } + return true; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverRedstoneTransmitterInternal.java b/src/main/java/gregtech/common/covers/CoverRedstoneTransmitterInternal.java new file mode 100644 index 0000000000..10a63a6642 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverRedstoneTransmitterInternal.java @@ -0,0 +1,43 @@ +package gregtech.common.covers; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; + +public class CoverRedstoneTransmitterInternal extends CoverRedstoneWirelessBase { + + public CoverRedstoneTransmitterInternal(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + GregTechAPI.sWirelessRedstone.put(aCoverVariable, aTileEntity.getOutputRedstoneSignal(side)); + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return true; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverRedstoneWirelessBase.java b/src/main/java/gregtech/common/covers/CoverRedstoneWirelessBase.java new file mode 100644 index 0000000000..0ec962fc02 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverRedstoneWirelessBase.java @@ -0,0 +1,222 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public abstract class CoverRedstoneWirelessBase extends CoverBehavior { + + private static final int MAX_CHANNEL = 65535; + private static final int PRIVATE_MASK = 0xFFFE0000; + private static final int PUBLIC_MASK = 0x0000FFFF; + private static final int CHECKBOX_MASK = 0x00010000; + + public CoverRedstoneWirelessBase(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + GregTechAPI.sWirelessRedstone.put(aCoverVariable, (byte) 0); + return true; + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D)))) { + GregTechAPI.sWirelessRedstone.put(aCoverVariable.get(), (byte) 0); + aCoverVariable.set( + (aCoverVariable.get() & (PRIVATE_MASK | CHECKBOX_MASK)) + | (((Integer) GTUtility.stackToInt(aPlayer.inventory.getCurrentItem())).hashCode() & PUBLIC_MASK)); + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("081", "Frequency: ") + aCoverVariable); + return true; + } + return false; + } + + @Override + @SuppressWarnings("deprecation") + public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D)))) { + GregTechAPI.sWirelessRedstone.put(aCoverVariable, (byte) 0); + + int val = GTUtility.stackToInt(aPlayer.inventory.getCurrentItem()) * (1 + aPlayer.inventory.getCurrentItem() + .getItemDamage()); + + aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | (val & PUBLIC_MASK); + + aTileEntity.setCoverDataAtSide(side, aCoverVariable); + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("081", "Frequency: ") + (aCoverVariable & PUBLIC_MASK)); + return true; + } + return false; + } + + @Override + protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (((aX > 0.375D) && (aX < 0.625D)) + || ((side.offsetX == 0) || (((aY > 0.375D) && (aY < 0.625D)) || ((((aZ <= 0.375D) || (aZ >= 0.625D))))))) { + GregTechAPI.sWirelessRedstone.put(aCoverVariable, (byte) 0); + final float[] tCoords = GTUtility.getClickedFacingCoords(side, aX, aY, aZ); + + final short tAdjustVal = switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + + 2 * (byte) (int) (tCoords[1] * 2.0F))) { + case 0 -> -32; + case 1 -> 32; + case 2 -> -1024; + case 3 -> 1024; + default -> 0; + }; + + final int tPublicChannel = (aCoverVariable & PUBLIC_MASK) + tAdjustVal; + + if (tPublicChannel < 0) { + aCoverVariable = aCoverVariable & ~PUBLIC_MASK; + } else if (tPublicChannel > MAX_CHANNEL) { + aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | MAX_CHANNEL; + } else { + aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | tPublicChannel; + } + } + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("081", "Frequency: ") + (aCoverVariable & PUBLIC_MASK)); + return aCoverVariable; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return GTUtility.trans("081", "Frequency: ") + aCoverVariable; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new RedstoneWirelessBaseUIFactory(buildContext).createWindow(); + } + + private class RedstoneWirelessBaseUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public RedstoneWirelessBaseUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getGUIWidth() { + return 250; + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget( + new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, CoverRedstoneWirelessBase.this) + + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) getFlagFrequency(convert(coverData)), + (coverData, state) -> new ISerializableObject.LegacyCoverData( + state.intValue() | getFlagCheckbox(convert(coverData))), + widget -> widget.setBounds(0, MAX_CHANNEL) + .setScrollValues(1, 1000, 10) + .setFocusOnGuiOpen(true) + .setPos(spaceX * 0, spaceY * 0 + 2) + .setSize(spaceX * 4 - 3, 12)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofCheck(), + coverData -> getFlagCheckbox(convert(coverData)) > 0, + (coverData, state) -> new ISerializableObject.LegacyCoverData( + getFlagFrequency(convert(coverData)) | (state ? CHECKBOX_MASK : 0)), + widget -> widget.setPos(spaceX * 0, spaceY * 2)) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("246", "Frequency")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 4, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("602", "Use Private Frequency")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 1, startY + spaceY * 2 + 4)); + } + + private int getFlagFrequency(int coverVariable) { + return coverVariable & PUBLIC_MASK; + } + + private int getFlagCheckbox(int coverVariable) { + return coverVariable & CHECKBOX_MASK; + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverScreen.java b/src/main/java/gregtech/common/covers/CoverScreen.java new file mode 100644 index 0000000000..09f45730d8 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverScreen.java @@ -0,0 +1,100 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; + +public class CoverScreen extends CoverBehavior { + + public CoverScreen(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 20.0F; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return false; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return false; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return false; + } + + @Override + public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, + ICoverable aTileEntity) { + return false; + } + + @Override + public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + return false; + } + + @Override + public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + return true; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return 0; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverShutter.java b/src/main/java/gregtech/common/covers/CoverShutter.java new file mode 100644 index 0000000000..480062d430 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverShutter.java @@ -0,0 +1,195 @@ +package gregtech.common.covers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; + +public class CoverShutter extends CoverBehavior { + + public CoverShutter(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return aCoverVariable; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 4; + if (aCoverVariable < 0) { + aCoverVariable = 3; + } + switch (aCoverVariable) { + case 0 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("082", "Open if work enabled")); + case 1 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("083", "Open if work disabled")); + case 2 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("084", "Only Output allowed")); + case 3 -> GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("085", "Only Input allowed")); + } + if (aTileEntity instanceof BaseMetaPipeEntity) { + ((BaseMetaPipeEntity) aTileEntity).reloadLocks(); + } + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 3 + : !(aTileEntity instanceof IMachineProgress) + || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0)); + } + + @Override + public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 2 + : !(aTileEntity instanceof IMachineProgress) + || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0)); + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 3 + : !(aTileEntity instanceof IMachineProgress) + || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0)); + } + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 2 + : !(aTileEntity instanceof IMachineProgress) + || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 3 + : !(aTileEntity instanceof IMachineProgress) + || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 2 + : !(aTileEntity instanceof IMachineProgress) + || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 3 + : !(aTileEntity instanceof IMachineProgress) + || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return aCoverVariable >= 2 ? aCoverVariable == 2 + : !(aTileEntity instanceof IMachineProgress) + || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); + } + + @Override + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 0; + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new ShutterUIFactory(buildContext).createWindow(); + } + + private class ShutterUIFactory extends UIFactory { + + private static final int startX = 10; + private static final int startY = 25; + private static final int spaceX = 18; + private static final int spaceY = 18; + + public ShutterUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + builder + .widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + CoverShutter.this, + (index, coverData) -> index == convert(coverData), + (index, coverData) -> new ISerializableObject.LegacyCoverData(index)) + .addToggleButton( + 0, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 2, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.setPos(spaceX * 0, spaceY * 2)) + .addToggleButton( + 3, + CoverDataFollowerToggleButtonWidget.ofCheck(), + widget -> widget.setPos(spaceX * 0, spaceY * 3)) + .setPos(startX, startY)) + .widget( + new TextWidget(GTUtility.trans("082", "Open if work enabled")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0)) + .widget( + new TextWidget(GTUtility.trans("083", "Open if work disabled")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1)) + .widget( + new TextWidget(GTUtility.trans("084", "Only Output allowed")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2)) + .widget( + new TextWidget(GTUtility.trans("085", "Only Input allowed")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3)); + } + } +} diff --git a/src/main/java/gregtech/common/covers/CoverSolarPanel.java b/src/main/java/gregtech/common/covers/CoverSolarPanel.java new file mode 100644 index 0000000000..f0b544633d --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverSolarPanel.java @@ -0,0 +1,139 @@ +package gregtech.common.covers; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; + +public class CoverSolarPanel extends CoverBehavior { + + private final int mVoltage; + + public CoverSolarPanel(int aVoltage) { + this.mVoltage = aVoltage; + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if (side != ForgeDirection.UP) return 0; + int coverState = aCoverVariable & 0x3; + int coverNum = aCoverVariable >> 2; + if (aTimer % 100L == 0L) { + if (aTileEntity.getWorld() + .isThundering()) { + return aTileEntity.getBiome().rainfall > 0.0F && aTileEntity.getSkyAtSide(side) + ? Math.min(20, coverNum) << 2 + : coverNum << 2; + } else { + if (aTileEntity.getWorld() + .isRaining() && aTileEntity.getBiome().rainfall > 0.0F) { // really rains + if (aTileEntity.getSkyAtSide(side)) coverNum = Math.min(30, coverNum); + if (aTileEntity.getWorld().skylightSubtracted >= 4) { + if (aTileEntity.getWorld() + .isDaytime()) { + coverState = 2; + } else { + return coverNum << 2; + } + } + } else { // not rains + if (aTileEntity.getWorld() + .isDaytime()) { + coverState = 1; + } else { + coverState = 2; + } + } + } + } + if (coverState == 1) { + aTileEntity.injectEnergyUnits( + ForgeDirection.UNKNOWN, + ((100L - (long) coverNum) * ((long) this.mVoltage)) / 100L, + 1L); + } + if (aTimer % 28800L == 0L && coverNum < 100 && (coverNum > 10 || XSTR_INSTANCE.nextInt(3) == 2)) coverNum++; + return coverState + (coverNum << 2); + } + + @Override + protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, + float aY, float aZ) { + if (aPlayer.capabilities.isCreativeMode) { + GTUtility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable.get() >> 2) + "% dirt"); + aCoverVariable.set(aCoverVariable.get() & 0x3); + return true; + } + for (int i = 0; i < aPlayer.inventory.mainInventory.length; i++) { + ItemStack is = aPlayer.inventory.mainInventory[i]; + if (is == null) continue; + if (is.getUnlocalizedName() + .equals(new ItemStack(Items.water_bucket).getUnlocalizedName())) { + aPlayer.inventory.mainInventory[i] = new ItemStack(Items.bucket); + if (aPlayer.inventoryContainer != null) aPlayer.inventoryContainer.detectAndSendChanges(); + GTUtility + .sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable.get() >> 2) + "% dirt"); + aCoverVariable.set(aCoverVariable.get() & 0x3); + return true; + } + } + GTUtility.sendChatToPlayer(aPlayer, "You need water bucket in inventory to clean the panel."); + return false; + } + + @Override + @SuppressWarnings("deprecation") + public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer.capabilities.isCreativeMode) { + GTUtility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable >> 2) + "% dirt"); + aTileEntity.setCoverDataAtSide(side, (aCoverVariable & 0x3)); + return true; + } + for (int i = 0; i < aPlayer.inventory.mainInventory.length; i++) { + ItemStack is = aPlayer.inventory.mainInventory[i]; + if (is == null) continue; + if (is.getUnlocalizedName() + .equals(new ItemStack(Items.water_bucket).getUnlocalizedName())) { + aPlayer.inventory.mainInventory[i] = new ItemStack(Items.bucket); + if (aPlayer.inventoryContainer != null) aPlayer.inventoryContainer.detectAndSendChanges(); + GTUtility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable >> 2) + "% dirt"); + aTileEntity.setCoverDataAtSide(side, (aCoverVariable & 0x3)); + return true; + } + } + GTUtility.sendChatToPlayer(aPlayer, "You need water bucket in inventory to clean the panel."); + return false; + } + + @Override + protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, + ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { + return false; + } + + @Override + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 1; + } +} diff --git a/src/main/java/gregtech/common/covers/CoverSteamRegulator.java b/src/main/java/gregtech/common/covers/CoverSteamRegulator.java new file mode 100644 index 0000000000..413e835ad2 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverSteamRegulator.java @@ -0,0 +1,18 @@ +package gregtech.common.covers; + +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.util.GTModHandler; + +public class CoverSteamRegulator extends CoverFluidRegulator { + + public CoverSteamRegulator(int aTransferRate, ITexture coverTexture) { + super(aTransferRate, coverTexture); + } + + @Override + protected boolean canTransferFluid(FluidStack fluid) { + return GTModHandler.isAnySteam(fluid) || GTModHandler.isSuperHeatedSteam(fluid); + } +} diff --git a/src/main/java/gregtech/common/covers/CoverSteamValve.java b/src/main/java/gregtech/common/covers/CoverSteamValve.java new file mode 100644 index 0000000000..329cf634a7 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverSteamValve.java @@ -0,0 +1,26 @@ +package gregtech.common.covers; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.GTModHandler; + +public class CoverSteamValve extends CoverPump { + + public CoverSteamValve(int aTransferRate, ITexture coverTexture) { + super(aTransferRate, coverTexture); + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + protected boolean canTransferFluid(FluidStack fluid) { + return GTModHandler.isAnySteam(fluid) || GTModHandler.isSuperHeatedSteam(fluid); + } +} diff --git a/src/main/java/gregtech/common/covers/CoverVent.java b/src/main/java/gregtech/common/covers/CoverVent.java new file mode 100644 index 0000000000..02907da4c2 --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverVent.java @@ -0,0 +1,111 @@ +package gregtech.common.covers; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.CoverBehavior; +import gregtech.api.util.GTUtility; + +public class CoverVent extends CoverBehavior { + + private final int mEfficiency; + private final Fluid IC2_HOT_COOLANT = FluidRegistry.getFluid("ic2hotcoolant"); + private final Fluid IC2_COOLANT = FluidRegistry.getFluid("ic2coolant"); + + public CoverVent(int aEfficiency) { + this.mEfficiency = aEfficiency; + } + + @Override + public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + long aTimer) { + return false; + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if (side == ForgeDirection.UNKNOWN) return 0; + int ret = 0; + if (aTileEntity instanceof IFluidHandler) { + ret = doCoolFluid(side, aTileEntity); + } + if ((aTileEntity instanceof IMachineProgress)) { + ret = doProgressEfficiency(side, (IMachineProgress) aTileEntity, aCoverID); + } + return ret; + } + + @Override + public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 100; + } + + protected int doProgressEfficiency(final ForgeDirection side, final IMachineProgress aTileEntity, + final int aCoverVariable) { + final int offsetX = aTileEntity.getOffsetX(side, 1); + final int offsetY = aTileEntity.getOffsetY(side, 1); + final int offsetZ = aTileEntity.getOffsetZ(side, 1); + final World world = aTileEntity.getWorld(); + if (aTileEntity.hasThingsToDo() && aCoverVariable != aTileEntity.getProgress() + && !GTUtility.hasBlockHitBox(world, offsetX, offsetY, offsetZ)) { + aTileEntity.increaseProgress(this.mEfficiency); + } + return aTileEntity.getProgress(); + } + + protected int doCoolFluid(final ForgeDirection side, final ICoverable aTileEntity) { + final int offsetX = aTileEntity.getOffsetX(side, 1); + final int offsetY = aTileEntity.getOffsetY(side, 1); + final int offsetZ = aTileEntity.getOffsetZ(side, 1); + final World world = aTileEntity.getWorld(); + final IFluidHandler fluidHandler = (IFluidHandler) aTileEntity; + if (!fluidHandler.canDrain(ForgeDirection.UNKNOWN, IC2_HOT_COOLANT)) { + return 0; + } + final int chances; // 10000 = 100% + final Block blockAtSide = aTileEntity.getBlockAtSide(side); + if (blockAtSide == null) { + return 0; + } + if (blockAtSide == Blocks.water || blockAtSide == Blocks.flowing_water) { + chances = switch (mEfficiency) { + case 3 -> 10000; // 100% chances for Diamond reactor vent with water + case 2 -> 5000; // 50% chances for Gold and Overclocked reactor vents with water + default -> 2500; // 25% chances for Basic reactor vent with water + }; + } else if (blockAtSide.isAir(world, offsetX, offsetY, offsetZ)) { + switch (mEfficiency) { + case 3 -> chances = 2500; // 25% chances for Diamond reactor vent with air + case 2 -> chances = 1250; // 12.5% chances for Gold and Overclocked reactor vents with air + default -> { + return 0; // Basic reactor vent cannot be used with air + } + } + } else { + return 0; // Vent cover need water or air + } + if (chances > XSTR_INSTANCE.nextInt(10000)) { + final FluidStack hotFluidStack = fluidHandler.drain(ForgeDirection.UNKNOWN, Integer.MAX_VALUE, true); + final FluidStack coldFluidStack = new FluidStack(IC2_COOLANT, hotFluidStack.amount); + fluidHandler.fill(ForgeDirection.UNKNOWN, coldFluidStack, true); + return hotFluidStack.amount; + } + return 0; + } +} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Arm.java b/src/main/java/gregtech/common/covers/GT_Cover_Arm.java deleted file mode 100644 index 51f330e8df..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Arm.java +++ /dev/null @@ -1,431 +0,0 @@ -package gregtech.common.covers; - -import java.text.FieldPosition; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_Arm extends GT_CoverBehavior { - - public final int mTickRate; - // msb converted, 2nd : direction (1=export) - // right 14 bits: internalSlot, next 14 bits adjSlot, 0 = all, slot = -1 - protected static final int EXPORT_MASK = 0x40000000; - protected static final int SLOT_ID_MASK = 0x3FFF; - protected static final int SLOT_ID_MIN = 0; - protected static final int CONVERTED_BIT = 0x80000000; - - public GT_Cover_Arm(int aTickRate, ITexture coverTexture) { - super(coverTexture); - this.mTickRate = aTickRate; - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if ((((aTileEntity instanceof IMachineProgress)) && (!((IMachineProgress) aTileEntity).isAllowedToWork()))) { - return aCoverVariable; - } - - // Convert from ver. 5.09.33.50, check if 3 last bits are equal - if ((aCoverVariable >>> 29) == 0) { - aCoverVariable = CONVERTED_BIT | (((aCoverVariable + 1) & SLOT_ID_MASK) << 14) | EXPORT_MASK; - } else if ((aCoverVariable >>> 29) == 7) { - aCoverVariable = CONVERTED_BIT | Math.min(Math.abs(aCoverVariable - 1), SLOT_ID_MASK); - } - - final TileEntity toTile; - final TileEntity fromTile; - final int toSlot; - final int fromSlot; - - if ((aCoverVariable & EXPORT_MASK) > 0) { - fromTile = (TileEntity) aTileEntity; - toTile = aTileEntity.getTileEntityAtSide(side); - fromSlot = aCoverVariable & SLOT_ID_MASK; - toSlot = (aCoverVariable >> 14) & SLOT_ID_MASK; - } else { - fromTile = aTileEntity.getTileEntityAtSide(side); - toTile = (TileEntity) aTileEntity; - fromSlot = (aCoverVariable >> 14) & SLOT_ID_MASK; - toSlot = aCoverVariable & SLOT_ID_MASK; - } - - if (fromSlot > 0 && toSlot > 0) { - if (fromTile instanceof IInventory fromInventory && toTile instanceof IInventory toInventory) - GT_Utility.moveFromSlotToSlot( - fromInventory, - toInventory, - fromSlot - 1, - toSlot - 1, - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1); - } else if (toSlot > 0) { - final ForgeDirection toSide; - if ((aCoverVariable & EXPORT_MASK) > 0) toSide = side; - else toSide = side.getOpposite(); - GT_Utility.moveOneItemStackIntoSlot( - fromTile, - toTile, - toSide, - toSlot - 1, - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1); - } else if (fromSlot > 0) { - final ForgeDirection toSide; - if ((aCoverVariable & EXPORT_MASK) > 0) toSide = side; - else toSide = side.getOpposite(); - if (fromTile instanceof IInventory) GT_Utility.moveFromSlotToSide( - (IInventory) fromTile, - toTile, - fromSlot - 1, - toSide, - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1); - } else { - final ForgeDirection fromSide; - final ForgeDirection toSide; - if ((aCoverVariable & EXPORT_MASK) > 0) { - fromSide = side; - toSide = side.getOpposite(); - } else { - fromSide = side.getOpposite(); - toSide = side; - } - GT_Utility.moveOneItemStack( - fromTile, - toTile, - fromSide, - toSide, - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1); - } - - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - int step = 0; - if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) { - step += aPlayer.isSneaking() ? 256 : 16; - } else { - step -= aPlayer.isSneaking() ? 256 : 16; - } - aCoverVariable = getNewVar(aCoverVariable, step); - sendMessageToPlayer(aPlayer, aCoverVariable); - return aCoverVariable; - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - int step = (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) ? 1 : -1; - int tCoverVariable = getNewVar(aCoverVariable.get(), step); - sendMessageToPlayer(aPlayer, tCoverVariable); - aCoverVariable.set(tCoverVariable); - return true; - } - - @Override - @SuppressWarnings("deprecation") - public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - final int step = (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) ? 1 : -1; - aCoverVariable = getNewVar(aCoverVariable, step); - sendMessageToPlayer(aPlayer, aCoverVariable); - aTileEntity.setCoverDataAtSide(side, aCoverVariable); - return true; - } - - @Override - protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return false; - } - - private void sendMessageToPlayer(EntityPlayer aPlayer, int var) { - if ((var & EXPORT_MASK) != 0) GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("001", "Puts out into adjacent Slot #") + (((var >> 14) & SLOT_ID_MASK) - 1)); - else GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("002", "Grabs in for own Slot #") + ((var & SLOT_ID_MASK) - 1)); - } - - private int getNewVar(int var, int step) { - int intSlot = (var & SLOT_ID_MASK); - int adjSlot = (var >> 14) & SLOT_ID_MASK; - if ((var & EXPORT_MASK) == 0) { - int x = (intSlot + step); - if (x > SLOT_ID_MASK) return createVar(0, SLOT_ID_MASK, 0); - else if (x < 1) return createVar(-step - intSlot + 1, 0, EXPORT_MASK); - else return createVar(0, x, 0); - } else { - int x = (adjSlot - step); - if (x > SLOT_ID_MASK) return createVar(SLOT_ID_MASK, 0, EXPORT_MASK); - else if (x < 1) return createVar(0, step - adjSlot + 1, 0); - else return createVar(x, 0, EXPORT_MASK); - } - } - - private int createVar(int adjSlot, int intSlot, int export) { - return CONVERTED_BIT | export | ((adjSlot & SLOT_ID_MASK) << 14) | (intSlot & SLOT_ID_MASK); - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return this.mTickRate; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new ArmUIFactory(buildContext).createWindow(); - } - - private class ArmUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - private int maxSlot; - - /** - * Display the text "Any" instead of a number when the slot is set to -1. - */ - protected static final NumberFormatMUI numberFormatAny = new NumberFormatMUI() { - - @Override - public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { - if (number < 0) { - return toAppendTo.append(GT_Utility.trans("ANY", "Any")); - } else { - return super.format(number, toAppendTo, pos); - } - } - }; - - protected ArmUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - maxSlot = getMaxSlot(); - builder.widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_Arm.this).addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> getFlagExport(convert(coverData)) > 0, - (coverData, state) -> { - if (state) { - return new ISerializableObject.LegacyCoverData( - convert(coverData) | EXPORT_MASK | CONVERTED_BIT); - } else { - return new ISerializableObject.LegacyCoverData( - convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT); - } - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) - .addTooltip(GT_Utility.trans("006", "Export")) - .setPos(spaceX * 0, spaceY * 0)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> getFlagExport(convert(coverData)) == 0, - (coverData, state) -> { - if (state) { - return new ISerializableObject.LegacyCoverData( - convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT); - } else { - return new ISerializableObject.LegacyCoverData( - convert(coverData) | EXPORT_MASK | CONVERTED_BIT); - } - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) - .addTooltip(GT_Utility.trans("007", "Import")) - .setPos(spaceX * 1, spaceY * 0)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) (getFlagInternalSlot(convert(coverData)) - 1), - (coverData, state) -> { - final int coverVariable = convert(coverData); - return new ISerializableObject.LegacyCoverData( - getFlagExport(coverVariable) | ((state.intValue() + 1) & SLOT_ID_MASK) - | (getFlagAdjacentSlot(coverVariable) << 14) - | CONVERTED_BIT); - }, - widget -> widget.setBounds(-1, maxSlot) - .setDefaultValue(-1) - .setScrollValues(1, 100, 10) - .setNumberFormat(numberFormatAny) - .setPos(spaceX * 0, spaceY * 1 + 2) - .setSize(spaceX * 2 + 5, 12)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) (getFlagAdjacentSlot(convert(coverData)) - 1), - (coverData, state) -> { - final int coverVariable = convert(coverData); - return new ISerializableObject.LegacyCoverData( - getFlagExport(coverVariable) | getFlagInternalSlot(coverVariable) - | (((state.intValue() + 1) & SLOT_ID_MASK) << 14) - | CONVERTED_BIT); - }, - widget -> widget.setValidator(val -> { - // We need to check the adjacent inventory here, and can't simply set a maximum value, - // because it can change while this cover is alive. - final int adjacentMaxSlot; - final ICoverable tile = getUIBuildContext().getTile(); - if (tile instanceof TileEntity && !tile.isDead()) { - TileEntity adj = tile.getTileEntityAtSide(getUIBuildContext().getCoverSide()); - if (adj instanceof IInventory) - adjacentMaxSlot = ((IInventory) adj).getSizeInventory() - 1; - else adjacentMaxSlot = -1; - } else { - adjacentMaxSlot = -1; - } - return Math.min(val, adjacentMaxSlot); - }) - .setMinValue(-1) - .setDefaultValue(-1) - .setScrollValues(1, 100, 10) - .setNumberFormat(numberFormatAny) - .setPos(spaceX * 0, spaceY * 2 + 2) - .setSize(spaceX * 2 + 5, 12)) - .setPos(startX, startY)) - .widget( - new TextWidget() - .setStringSupplier( - () -> (convert(getCoverData()) & EXPORT_MASK) > 0 ? GT_Utility.trans("006", "Export") - : GT_Utility.trans("007", "Import")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("254.1", "Internal slot#")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("255", "Adjacent slot#")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 3, 4 + startY + spaceY * 2)); - } - - private int getMaxSlot() { - final ICoverable tile = getUIBuildContext().getTile(); - if (tile instanceof TileEntity && !tile.isDead()) { - return tile.getSizeInventory() - 1; - } else { - return -1; - } - } - - private int getFlagExport(int coverVariable) { - return coverVariable & EXPORT_MASK; - } - - private int getFlagInternalSlot(int coverVariable) { - return coverVariable & SLOT_ID_MASK; - } - - private int getFlagAdjacentSlot(int coverVariable) { - return (coverVariable >> 14) & SLOT_ID_MASK; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Chest.java b/src/main/java/gregtech/common/covers/GT_Cover_Chest.java deleted file mode 100644 index 36e441102b..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Chest.java +++ /dev/null @@ -1,274 +0,0 @@ -package gregtech.common.covers; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Size; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; - -import cpw.mods.fml.common.network.ByteBufUtils; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_Chest extends GT_CoverBehaviorBase { - - private final int slots; - private final int stackSizeLimit = 1; - - public GT_Cover_Chest(int slots, ITexture coverTexture) { - super(ChestInventory.class, coverTexture); - if (slots <= 0) throw new IllegalArgumentException("slots must be greater than 0"); - this.slots = slots; - } - - @Override - public ChestInventory createDataObject(int aLegacyData) { - return new ChestInventory(slots, stackSizeLimit); - } - - @Override - public ChestInventory createDataObject() { - return new ChestInventory(slots, stackSizeLimit); - } - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public boolean isSimpleCover() { - return true; - } - - @Override - public boolean allowsCopyPasteTool() { - return false; - } - - @Override - public boolean allowsTickRateAddition() { - return false; - } - - @Override - protected void onDroppedImpl(ForgeDirection side, int aCoverID, ChestInventory aCoverVariable, - ICoverable aTileEntity) { - if (aTileEntity.getWorld().isRemote) return; - aCoverVariable.dropAll(aTileEntity, side); - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, ChestInventory aCoverVariable, - ICoverable aTileEntity) { - return aCoverVariable.firstTick ? 1 : 0; - } - - @Override - protected ChestInventory doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ChestInventory aCoverVariable, ICoverable aTileEntity, long aTimer) { - // migrate slots. mostly needed while in development. still can be useful if we ever resize the inventory in the - // future - if (aCoverVariable.items.getSlots() != slots) { - if (aCoverVariable.items.getSlots() > slots) { - for (int i = slots; i < aCoverVariable.items.getSlots(); i++) { - ItemStack item = aCoverVariable.items.getStackInSlot(i); - if (item != null) { - dropItem(aTileEntity, side, item); - } - } - } - - ChestInventory newData = createDataObject(); - int toCopy = Math.min(newData.items.getSlots(), aCoverVariable.items.getSlots()); - for (int i = 0; i < toCopy; i++) { - newData.items.setStackInSlot(i, aCoverVariable.items.getStackInSlot(i)); - } - return newData; - } - aCoverVariable.firstTick = false; - return super.doCoverThingsImpl(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity, aTimer); - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new ChestUIFactory(buildContext).createWindow(); - } - - public class ChestUIFactory extends UIFactory { - - private static final int spaceX = 18; - private static final int spaceY = 18; - - public ChestUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getGUIHeight() { - int height = slots / 3 * 18 + 8; - if (!getUIBuildContext().isAnotherWindow()) { - // player inv is 4 row - return height + 4 * 18 + 14; - } - return height; - } - - @Override - protected void addTitleToUI(ModularWindow.Builder builder) {} - - @Override - protected int getGUIWidth() { - if (getUIBuildContext().isAnotherWindow()) { - return 18 * 3 + 20; - } else { - return 18 * 9 + 20; - } - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - CoverDataControllerWidget w = new CoverDataControllerWidget<>( - this::getCoverData, - this::setCoverData, - GT_Cover_Chest.this); - ChestInventory d = getCoverData(); - LimitingItemStackHandler h; - if (d == null) { - // ??? - return; - } - h = d.items; - SlotGroup slotGroup = SlotGroup.ofItemHandler(h, 3) - .build(); - if (getUIBuildContext().isAnotherWindow()) { - slotGroup.setPos(4, 4); - } else { - slotGroup.setPos(getGUIWidth() / 2 - 18 * 3 / 2, 6); - } - w.addChild(slotGroup); - builder.widget(w); - - builder.setPos( - (p, t) -> Alignment.Center.getAlignedPos( - new Size(getUIBuildContext().isAnotherWindow() ? t.getPos().x : p.width, p.height), - new Size(getGUIWidth(), getGUIHeight()))); - } - - @Override - protected boolean doesBindPlayerInventory() { - return true; - } - } - - private static class LimitingItemStackHandler extends ItemStackHandler { - - private final int slotLimit; - - private LimitingItemStackHandler(int slots, int slotLimit) { - super(slots); - this.slotLimit = slotLimit; - } - - @Override - public int getSlotLimit(int slot) { - return slotLimit; - } - } - - public static class ChestInventory implements ISerializableObject { - - final LimitingItemStackHandler items; - boolean firstTick; - - public ChestInventory(int slots, int stackSize) { - items = new LimitingItemStackHandler(slots, stackSize); - } - - @NotNull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { - items.deserializeNBT(ISerializableObject.readCompoundTagFromGreggyByteBuf(aBuf)); - return this; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - ByteBufUtils.writeTag(aBuf, items.serializeNBT()); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - if (!(aNBT instanceof NBTTagCompound)) return; - items.deserializeNBT((NBTTagCompound) aNBT); - firstTick = true; - } - - @NotNull - @Override - public NBTBase saveDataToNBT() { - return items.serializeNBT(); - } - - @NotNull - @Override - public ISerializableObject copy() { - ChestInventory copy = new ChestInventory(items.getSlots(), items.getSlotLimit(0)); - for (int i = 0; i < items.getSlots(); i++) { - copy.items.setStackInSlot(i, items.getStackInSlot(i)); - } - return copy; - } - - public void dropAll(ICoverable coverable, ForgeDirection direction) { - for (int i = 0; i < items.getSlots(); i++) { - ItemStack tItem = items.getStackInSlot(i); - if (tItem == null) { - continue; - } - dropItem(coverable, direction, tItem); - items.setStackInSlot(i, null); - } - } - } - - private static void dropItem(ICoverable coverable, ForgeDirection direction, ItemStack tItem) { - final EntityItem tItemEntity = new EntityItem( - coverable.getWorld(), - coverable.getXCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F + direction.offsetX, - coverable.getYCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F + direction.offsetY, - coverable.getZCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F + direction.offsetZ, - new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage())); - if (tItem.hasTagCompound()) { - tItemEntity.getEntityItem() - .setTagCompound( - (NBTTagCompound) tItem.getTagCompound() - .copy()); - } - tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D); - tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.05D + 0.2D); - tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D); - tItemEntity.hurtResistantTime = 999999; - tItemEntity.lifespan = 60000; - coverable.getWorld() - .spawnEntityInWorld(tItemEntity); - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java deleted file mode 100644 index 2c51cdc355..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java +++ /dev/null @@ -1,270 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.covers.IControlsWorkCover; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_ControlsWork extends GT_CoverBehavior implements IControlsWorkCover { - - public GT_Cover_ControlsWork(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if (!makeSureOnlyOne(side, aTileEntity)) return 0; - if (aTileEntity instanceof IMachineProgress machine) { - if (aCoverVariable < 2) { - if ((aInputRedstone > 0) == (aCoverVariable == 0)) { - if (!machine.isAllowedToWork()) machine.enableWorking(); - } else if (machine.isAllowedToWork()) machine.disableWorking(); - machine.setWorkDataValue(aInputRedstone); - } else if (aCoverVariable == 2) { - machine.disableWorking(); - } else { - if (machine.wasShutdown() && machine.getLastShutDownReason() - .wasCritical()) { - machine.disableWorking(); - if (!mPlayerNotified) { - EntityPlayer player = lastPlayer == null ? null : lastPlayer.get(); - if (player != null) { - lastPlayer = null; - mPlayerNotified = true; - GT_Utility.sendChatToPlayer( - player, - aTileEntity.getInventoryName() + "at " - + String.format( - "(%d,%d,%d)", - aTileEntity.getXCoord(), - aTileEntity.getYCoord(), - aTileEntity.getZCoord()) - + " shut down."); - } - } - return 2; - } else { - return 3 + doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable - 3, aTileEntity, aTimer); - } - } - } - return aCoverVariable; - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - return aCoverVariable.get() != 2; // always off, so no redstone needed either - } - - /** - * Make sure there is only one GT_Cover_ControlsWork on the aTileEntity TODO this is a migration thing. Remove this - * after 2.3.0 is released. - * - * @return true if the cover is the first (side) one - **/ - private boolean makeSureOnlyOne(ForgeDirection side, ICoverable aTileEntity) { - return IControlsWorkCover.makeSureOnlyOne(side, aTileEntity); - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - boolean aForced) { - if ((aTileEntity instanceof IMachineProgress)) { - ((IMachineProgress) aTileEntity).enableWorking(); - ((IMachineProgress) aTileEntity).setWorkDataValue((byte) 0); - } - return true; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 5; - if (aCoverVariable < 0) { - aCoverVariable = 2; - } - if (aCoverVariable == 0) { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("003", "Enable with Signal")); - } - if (aCoverVariable == 1) { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("004", "Disable with Signal")); - } - if (aCoverVariable == 2) { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("005", "Disabled")); - } - if (aCoverVariable == 3) { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("505", "Enable with Signal (Safe)")); - } - if (aCoverVariable == 4) { - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("506", "Disable with Signal (Safe)")); - } - // TODO: Set lastPlayer - return aCoverVariable; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } - - @Override - public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { - if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false; - for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { - if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { - return false; - } - } - return true; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new ControlsWorkUIFactory(buildContext).createWindow(); - } - - private class ControlsWorkUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public ControlsWorkUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder - .widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_ControlsWork.this, - (id, coverData) -> !getClickable(id, convert(coverData)), - (id, coverData) -> new ISerializableObject.LegacyCoverData( - getNewCoverVariable(id, convert(coverData)))) - .addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON) - .setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF) - .setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CROSS) - .setPos(spaceX * 0, spaceY * 2)) - .setPos(startX, startY)) - .widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_ControlsWork.this) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(), - coverData -> convert(coverData) > 2, - (coverData, state) -> new ISerializableObject.LegacyCoverData( - adjustCoverVariable(state, convert(coverData))), - widget -> widget.setPos(spaceX * 0, spaceY * 3)) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("243", "Enable with Redstone")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("244", "Disable with Redstone")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("245", "Disable machine")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2)) - .widget( - new TextWidget(GT_Utility.trans("507", "Safe Mode")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3)); - } - - private int getNewCoverVariable(int id, int coverVariable) { - if (coverVariable > 2) { - return id + 3; - } else { - return id; - } - } - - private boolean getClickable(int id, int coverVariable) { - return ((id != coverVariable && id != coverVariable - 3) || id == 3); - } - - private int adjustCoverVariable(boolean safeMode, int coverVariable) { - if (safeMode && coverVariable <= 2) { - coverVariable += 3; - } - if (!safeMode && coverVariable > 2) { - coverVariable -= 3; - } - return coverVariable; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java deleted file mode 100644 index b7eb782bbf..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java +++ /dev/null @@ -1,328 +0,0 @@ -package gregtech.common.covers; - -import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; - -import java.util.Arrays; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_Conveyor extends GT_CoverBehavior { - - public final int mTickRate; - private final int mMaxStacks; - - public GT_Cover_Conveyor(int aTickRate, int maxStacks, ITexture coverTexture) { - super(coverTexture); - this.mTickRate = aTickRate; - this.mMaxStacks = maxStacks; - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if ((aCoverVariable % 6 > 1) && ((aTileEntity instanceof IMachineProgress))) { - if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { - return aCoverVariable; - } - } - final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(side); - final Object fromEntity = aCoverVariable % 2 == 0 ? aTileEntity : tTileEntity; - final Object toEntity = aCoverVariable % 2 != 0 ? aTileEntity : tTileEntity; - final ForgeDirection fromSide = aCoverVariable % 2 != 0 ? side.getOpposite() : side; - final ForgeDirection toSide = aCoverVariable % 2 == 0 ? side.getOpposite() : side; - - moveMultipleItemStacks( - fromEntity, - toEntity, - fromSide, - toSide, - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1, - this.mMaxStacks); - - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 12; - if (aCoverVariable < 0) { - aCoverVariable = 11; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("006", "Export")); - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("007", "Import")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("008", "Export (conditional)")); - case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("009", "Import (conditional)")); - case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("010", "Export (invert cond)")); - case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("011", "Import (invert cond)")); - case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("012", "Export allow Input")); - case 7 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("013", "Import allow Output")); - case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("014", "Export allow Input (conditional)")); - case 9 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("015", "Import allow Output (conditional)")); - case 10 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("016", "Export allow Input (invert cond)")); - case 11 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("017", "Import allow Output (invert cond)")); - } - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return (aCoverVariable >= 6) || (aCoverVariable % 2 != 0); - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return (aCoverVariable >= 6) || (aCoverVariable % 2 == 0); - } - - @Override - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return this.mTickRate; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new ConveyorUIFactory(buildContext).createWindow(); - } - - private class ConveyorUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - private CoverDataFollower_ToggleButtonWidget mBlockWidget = null; - private CoverDataFollower_ToggleButtonWidget mAllowWidget = null; - - public ConveyorUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder.widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_Conveyor.this, - (id, coverData) -> !getClickable(id, convert(coverData)), - (id, coverData) -> new ISerializableObject.LegacyCoverData( - getNewCoverVariable(id, convert(coverData)))) - .addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) - .addTooltip(GT_Utility.trans("006", "Export")) - .setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) - .addTooltip(GT_Utility.trans("007", "Import")) - .setPos(spaceX * 1, spaceY * 0)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK) - .addTooltip(GT_Utility.trans("224", "Always On")) - .setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 3, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE) - .addTooltip(GT_Utility.trans("343", "Use Machine Processing State")) - .setPos(spaceX * 1, spaceY * 1)) - .addToggleButton( - 4, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE) - .addTooltip(GT_Utility.trans("343.1", "Use Inverted Machine Processing State")) - .setPos(spaceX * 2, spaceY * 1)) - .addToggleButton(5, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> { - mAllowWidget = widget; - widget.setTextureGetter(i -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return coverData == null || coverData.get() % 2 == 0 - ? GT_UITextures.OVERLAY_BUTTON_ALLOW_INPUT - : GT_UITextures.OVERLAY_BUTTON_ALLOW_OUTPUT; - }) - .dynamicTooltip(() -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return Arrays.asList( - coverData == null || coverData.get() % 2 == 0 - ? GT_Utility.trans("314", "Allow Input") - : GT_Utility.trans("312", "Allow Output")); - }) - .setPos(spaceX * 0, spaceY * 2); - }) - .addToggleButton(6, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> { - mBlockWidget = widget; - widget.setTextureGetter(i -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return coverData == null || coverData.get() % 2 == 0 - ? GT_UITextures.OVERLAY_BUTTON_BLOCK_INPUT - : GT_UITextures.OVERLAY_BUTTON_BLOCK_OUTPUT; - }) - .dynamicTooltip(() -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return Arrays.asList( - coverData == null || coverData.get() % 2 == 0 - ? GT_Utility.trans("313", "Block Input") - : GT_Utility.trans("311", "Block Output")); - }) - .setPos(spaceX * 1, spaceY * 2); - }) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 1)) - .widget(TextWidget.dynamicString(() -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return coverData == null || coverData.get() % 2 == 0 ? GT_Utility.trans("344", "Input Blocking") - : GT_Utility.trans("344.1", "Output Blocking"); - }) - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 2)); - } - - private int getNewCoverVariable(int id, int coverVariable) { - switch (id) { - case 0 -> { - if (mBlockWidget != null) { - mBlockWidget.notifyTooltipChange(); - } - if (mAllowWidget != null) { - mAllowWidget.notifyTooltipChange(); - } - return coverVariable & ~0x1; - } - case 1 -> { - if (mBlockWidget != null) { - mBlockWidget.notifyTooltipChange(); - } - if (mAllowWidget != null) { - mAllowWidget.notifyTooltipChange(); - } - return coverVariable | 0x1; - } - case 2 -> { - if (coverVariable > 5) return 0x6 | (coverVariable & ~0xE); - return (coverVariable & ~0xE); - } - case 3 -> { - if (coverVariable > 5) return 0x8 | (coverVariable & ~0xE); - return 0x2 | (coverVariable & ~0xE); - } - case 4 -> { - if (coverVariable > 5) return 0xA | (coverVariable & ~0xE); - return (0x4 | (coverVariable & ~0xE)); - } - case 5 -> { - if (coverVariable <= 5) return coverVariable + 6; - } - case 6 -> { - if (coverVariable > 5) return coverVariable - 6; - } - } - return coverVariable; - } - - private boolean getClickable(int id, int coverVariable) { - if (coverVariable < 0 || 11 < coverVariable) return false; - return switch (id) { - case 0, 1 -> (0x1 & coverVariable) != id; - case 2 -> (coverVariable % 6) >= 2; - case 3 -> (coverVariable % 6) < 2 || 4 <= (coverVariable % 6); - case 4 -> (coverVariable % 6) < 4; - case 5 -> coverVariable < 6; - case 6 -> coverVariable >= 6; - default -> false; - }; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Crafting.java b/src/main/java/gregtech/common/covers/GT_Cover_Crafting.java deleted file mode 100644 index f492542fa9..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Crafting.java +++ /dev/null @@ -1,56 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.ContainerWorkbench; -import net.minecraft.network.play.server.S2DPacketOpenWindow; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.ISerializableObject; - -public class GT_Cover_Crafting extends GT_CoverBehavior { - - public GT_Cover_Crafting(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - if ((aPlayer instanceof EntityPlayerMP)) { - ((EntityPlayerMP) aPlayer).getNextWindowId(); - ((EntityPlayerMP) aPlayer).playerNetServerHandler.sendPacket( - new S2DPacketOpenWindow(((EntityPlayerMP) aPlayer).currentWindowId, 1, "Crafting", 9, true)); - aPlayer.openContainer = new ContainerWorkbench( - aPlayer.inventory, - aPlayer.worldObj, - aTileEntity.getXCoord(), - aTileEntity.getYCoord(), - aTileEntity.getZCoord()) { - - @Override - public boolean canInteractWith(EntityPlayer player) { - return true; - } - }; - aPlayer.openContainer.windowId = ((EntityPlayerMP) aPlayer).currentWindowId; - aPlayer.openContainer.addCraftingToCrafters((EntityPlayerMP) aPlayer); - } - return true; - } - - @Override - protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return false; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java b/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java deleted file mode 100644 index 96ef77f207..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java +++ /dev/null @@ -1,252 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_DoesWork extends GT_CoverBehavior { - - private static int FLAG_INVERTED = 0x1; - private static int FLAG_PROGRESS = 0x2; - private static int FLAG_ENABLED = 0x4; - - public GT_Cover_DoesWork(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if ((aTileEntity instanceof IMachineProgress)) { - IMachineProgress mProgress = (IMachineProgress) aTileEntity; - boolean inverted = isFlagSet(aCoverVariable, FLAG_INVERTED); - int signal = 0; - - if (isFlagSet(aCoverVariable, FLAG_ENABLED)) { - signal = inverted == mProgress.isAllowedToWork() ? 0 : 15; - } else if (isFlagSet(aCoverVariable, FLAG_PROGRESS)) { - signal = inverted == (mProgress.getMaxProgress() == 0) ? 0 : 15; - } else { - int tScale = mProgress.getMaxProgress() / 15; - - if (tScale > 0 && mProgress.hasThingsToDo()) { - signal = inverted ? (15 - mProgress.getProgress() / tScale) : (mProgress.getProgress() / tScale); - } else { - signal = inverted ? 15 : 0; - } - } - - aTileEntity.setOutputRedstoneSignal(side, (byte) signal); - } else { - aTileEntity.setOutputRedstoneSignal(side, (byte) 0); - } - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 6; - if (aCoverVariable < 0) { - aCoverVariable = 5; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("018", "Normal")); - // Progress scaled - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("019", "Inverted")); - // ^ inverted - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("020", "Ready to work")); - // Not Running - case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("021", "Not ready to work")); - // Running - case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("028", "Machine Enabled")); - // Enabled - case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("029", "Machine Disabled")); - // Disabled - } - return aCoverVariable; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 5; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new DoesWorkUIFactory(buildContext).createWindow(); - } - - private static boolean isFlagSet(int coverVariable, int flag) { - return (coverVariable & flag) == flag; - } - - private class DoesWorkUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public DoesWorkUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder - .widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_DoesWork.this, - (id, coverData) -> isEnabled(id, convert(coverData)), - (id, coverData) -> new ISerializableObject.LegacyCoverData( - getNewCoverVariable(id, convert(coverData)))) - .addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_PROGRESS) - .setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK) - .setPos(spaceX * 1, spaceY * 0)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON) - .setPos(spaceX * 2, spaceY * 0)) - .addToggleButton( - 3, - CoverDataFollower_ToggleButtonWidget.ofRedstone(), - widget -> widget.setPos(spaceX * 0, spaceY * 1)) - .setPos(startX, startY)) - .widget(TextWidget.dynamicString(() -> { - int coverVariable = convert(getCoverData()); - - if (isFlagSet(coverVariable, FLAG_ENABLED)) { - return GT_Utility.trans("271", "Machine enabled"); - } else if (isFlagSet(coverVariable, FLAG_PROGRESS)) { - return GT_Utility.trans("242", "Machine idle"); - } else { - return GT_Utility.trans("241", "Recipe progress"); - } - - }) - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0)) - .widget( - TextWidget - .dynamicString( - () -> isFlagSet(convert(getCoverData()), FLAG_INVERTED) - ? GT_Utility.trans("INVERTED", "Inverted") - : GT_Utility.trans("NORMAL", "Normal")) - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1)); - } - - private int getNewCoverVariable(int id, int coverVariable) { - switch (id) { - case 0 -> { - return (coverVariable & ~FLAG_ENABLED) & ~FLAG_PROGRESS; - } - case 1 -> { - return (coverVariable & ~FLAG_ENABLED) | FLAG_PROGRESS; - } - case 2 -> { - return (coverVariable & ~FLAG_PROGRESS) | FLAG_ENABLED; - } - case 3 -> { - if (isFlagSet(coverVariable, FLAG_INVERTED)) { - return coverVariable & ~FLAG_INVERTED; - } else { - return coverVariable | FLAG_INVERTED; - } - } - } - return coverVariable; - } - - private boolean isEnabled(int id, int coverVariable) { - return switch (id) { - case 0 -> !isFlagSet(coverVariable, FLAG_PROGRESS) && !isFlagSet(coverVariable, FLAG_ENABLED); - case 1 -> isFlagSet(coverVariable, FLAG_PROGRESS); - case 2 -> isFlagSet(coverVariable, FLAG_ENABLED); - case 3 -> isFlagSet(coverVariable, FLAG_INVERTED); - default -> true; - }; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Drain.java b/src/main/java/gregtech/common/covers/GT_Cover_Drain.java deleted file mode 100644 index 2590f8e7ae..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Drain.java +++ /dev/null @@ -1,140 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fluids.IFluidHandler; - -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; - -public class GT_Cover_Drain extends GT_CoverBehavior { - - public GT_Cover_Drain(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if ((aCoverVariable % 3 > 1) && ((aTileEntity instanceof IMachineProgress))) { - if (((IMachineProgress) aTileEntity).isAllowedToWork()) { - return aCoverVariable; - } - } - if (side != ForgeDirection.UNKNOWN) { - final Block tBlock = aTileEntity.getBlockAtSide(side); - if ((aCoverVariable < 3) && ((aTileEntity instanceof IFluidHandler))) { - if ((side == ForgeDirection.UP) && (aTileEntity.getWorld() - .isRaining()) - && (aTileEntity.getWorld() - .getPrecipitationHeight(aTileEntity.getXCoord(), aTileEntity.getZCoord()) - 2 - < aTileEntity.getYCoord())) { - int tAmount = (int) (aTileEntity.getBiome().rainfall * 10.0F); - if (tAmount > 0) { - ((IFluidHandler) aTileEntity).fill( - side, - Materials.Water.getFluid( - aTileEntity.getWorld() - .isThundering() ? tAmount * 2L : tAmount), - true); - } - } - FluidStack tLiquid = null; - if (tBlock != null) { - if (((tBlock == Blocks.water) || (tBlock == Blocks.flowing_water)) - && (aTileEntity.getMetaIDAtSide(side) == 0)) { - tLiquid = Materials.Water.getFluid(1000L); - } else if (((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava)) - && (aTileEntity.getMetaIDAtSide(side) == 0)) { - tLiquid = Materials.Lava.getFluid(1000L); - } else if ((tBlock instanceof IFluidBlock)) { - tLiquid = ((IFluidBlock) tBlock).drain( - aTileEntity.getWorld(), - aTileEntity.getOffsetX(side, 1), - aTileEntity.getOffsetY(side, 1), - aTileEntity.getOffsetZ(side, 1), - false); - } - if ((tLiquid != null) && (tLiquid.getFluid() != null) - && ((side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 // Horizontal - || ((side == ForgeDirection.DOWN) && (tLiquid.getFluid() - .getDensity() <= 0)) - || ((side == ForgeDirection.UP) && (tLiquid.getFluid() - .getDensity() >= 0))) - && (((IFluidHandler) aTileEntity).fill(side, tLiquid, false) == tLiquid.amount)) { - ((IFluidHandler) aTileEntity).fill(side, tLiquid, true); - aTileEntity.getWorld() - .setBlockToAir( - aTileEntity.getXCoord() + side.offsetX, - aTileEntity.getYCoord() + side.offsetY, - aTileEntity.getZCoord() + side.offsetZ); - } - } - } - if ((aCoverVariable >= 3) && (tBlock != null) - && ((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava) - || (tBlock == Blocks.water) - || (tBlock == Blocks.flowing_water) - || ((tBlock instanceof IFluidBlock)))) { - aTileEntity.getWorld() - .setBlock( - aTileEntity.getOffsetX(side, 1), - aTileEntity.getOffsetY(side, 1), - aTileEntity.getOffsetZ(side, 1), - Blocks.air, - 0, - 0); - } - } - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 6; - if (aCoverVariable < 0) { - aCoverVariable = 5; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("022", "Import")); - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("023", "Import (conditional)")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("024", "Import (invert cond)")); - case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("025", "Keep Liquids Away")); - case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("026", "Keep Liquids Away (conditional)")); - case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("027", "Keep Liquids Away (invert cond)")); - } - return aCoverVariable; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return ((IMachineProgress) aTileEntity).isAllowedToWork() == aCoverVariable < 2; - } - - @Override - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return aCoverVariable < 3 ? 50 : 1; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java deleted file mode 100644 index 5b1f48d04f..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java +++ /dev/null @@ -1,410 +0,0 @@ -package gregtech.common.covers; - -import java.util.function.Function; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_CycleButtonWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_EUMeter extends GT_CoverBehaviorBase { - - public GT_Cover_EUMeter(ITexture coverTexture) { - super(EUMeterData.class, coverTexture); - } - - @Override - public EUMeterData createDataObject(int aLegacyData) { - return new EUMeterData(aLegacyData, 0); - } - - @Override - public EUMeterData createDataObject() { - return new EUMeterData(); - } - - @Override - protected EUMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - EUMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - final long stored = aCoverVariable.type.getTileEntityStoredEnergy(aTileEntity); - final long capacity = aCoverVariable.type.getTileEntityEnergyCapacity(aTileEntity); - - byte redstoneSignal; - - if (stored == 0L) { - // nothing - redstoneSignal = 0; - } else if (stored >= capacity) { - // full - redstoneSignal = 15; - } else { - // 1-14 range - redstoneSignal = (byte) (1 + (14 * stored) / capacity); - } - - if (aCoverVariable.inverted) { - redstoneSignal = (byte) (15 - redstoneSignal); - } - - if (aCoverVariable.threshold > 0) { - if (aCoverVariable.inverted && stored >= aCoverVariable.threshold) { - redstoneSignal = 0; - } else if (!aCoverVariable.inverted && stored < aCoverVariable.threshold) { - redstoneSignal = 0; - } - } - - aTileEntity.setOutputRedstoneSignal(side, redstoneSignal); - return aCoverVariable; - } - - @Override - protected EUMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - int num = (aCoverVariable.getNum() + (aPlayer.isSneaking() ? -1 : 1) + EnergyType.values().length * 2) - % (EnergyType.values().length * 2); - switch (num) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("031", "Normal Universal Storage")); - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("032", "Inverted Universal Storage")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("033", "Normal Electricity Storage")); - case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("034", "Inverted Electricity Storage")); - case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("035", "Normal Steam Storage")); - case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("036", "Inverted Steam Storage")); - case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("037", "Normal Average Electric Input")); - case 7 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("038", "Inverted Average Electric Input")); - case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("039", "Normal Average Electric Output")); - case 9 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("040", "Inverted Average Electric Output")); - case 10 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("041", "Normal Electricity Storage(Including Batteries)")); - case 11 -> GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("042", "Inverted Electricity Storage(Including Batteries)")); - } - aCoverVariable.setNum(num); - return aCoverVariable; - } - - // region Static Result Methods - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return false; - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, - ICoverable aTileEntity) { - return 20; - } - // endregion - - // region GUI Stuff - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new EUMeterUIFactory(buildContext).createWindow(); - } - - private class EUMeterUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public EUMeterUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - final String INVERTED = GT_Utility.trans("INVERTED", "Inverted"); - final String NORMAL = GT_Utility.trans("NORMAL", "Normal"); - - final CoverDataFollower_NumericWidget numericWidget = new CoverDataFollower_NumericWidget<>(); - - builder.widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_EUMeter.this) - .addFollower( - new CoverDataFollower_CycleButtonWidget<>(), - coverData -> coverData.type.ordinal(), - (coverData, state) -> { - coverData.type = EnergyType.getEnergyType(state); - return coverData; - }, - widget -> widget.setLength(EnergyType.values().length) - .addTooltip( - state -> EnergyType.getEnergyType(state) - .getTooltip()) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CYCLIC) - .setPos(spaceX * 0, spaceY * 0)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofRedstone(), - coverData -> coverData.inverted, - (coverData, state) -> { - coverData.inverted = state; - return coverData; - }, - widget -> widget.addTooltip(0, NORMAL) - .addTooltip(1, INVERTED) - .setPos(spaceX * 0, spaceY * 1)) - .addFollower(numericWidget, coverData -> (double) coverData.threshold, (coverData, state) -> { - coverData.threshold = state.longValue(); - return coverData; - }, - widget -> widget.setScrollValues(1000, 100, 100000) - .setFocusOnGuiOpen(true) - .setPos(spaceX * 0, spaceY * 2 + 2) - .setSize(spaceX * 8, 12)) - .setPos(startX, startY)) - .widget( - new TextWidget() - .setStringSupplier(() -> getCoverData() != null ? getCoverData().type.getTitle() : "") - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX, 4 + startY)) - .widget( - new TextWidget() - .setStringSupplier( - () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "") - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX, 4 + startY + spaceY)) - .widget( - new TextWidget(GT_Utility.trans("222.1", "Energy threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX, startY + spaceY * 3 + 4)) - - .widget( - new FakeSyncWidget.LongSyncer( - () -> getCoverData() != null - ? getCoverData().type.getTileEntityEnergyCapacity(getUIBuildContext().getTile()) - : Long.MAX_VALUE, - value -> numericWidget.setMaxValue(value))); - } - } - - // endregion - - public static class EUMeterData implements ISerializableObject { - - private EnergyType type; - private boolean inverted; - /** - * The special value {@code 0} means threshold check is disabled. - */ - private long threshold; - - public EUMeterData() { - type = EnergyType.UNIVERSAL_STORAGE; - inverted = false; - threshold = 0; - } - - public EUMeterData(EnergyType type, boolean inverted, long threshold) { - this.type = type; - this.inverted = inverted; - this.threshold = threshold; - } - - public EUMeterData(int num, long threshold) { - this(); - this.setNum(num); - this.threshold = threshold; - } - - public int getNum() { - return type.ordinal() * 2 + (inverted ? 1 : 0); - } - - public void setNum(int num) { - type = EnergyType.getEnergyType(num / 2); - inverted = num % 2 == 1; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new EUMeterData(type, inverted, threshold); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("typeOrdinal", type.ordinal()); - tag.setBoolean("inverted", inverted); - tag.setLong("threshold", threshold); - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeInt(type.ordinal()); - aBuf.writeBoolean(inverted); - aBuf.writeLong(threshold); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; - int typeOrdinal = tag.getInteger("typeOrdinal"); - type = EnergyType.getEnergyType(typeOrdinal); - inverted = tag.getBoolean("inverted"); - threshold = tag.getLong("threshold"); - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { - int typeOrdinal = aBuf.readInt(); - type = EnergyType.getEnergyType(typeOrdinal); - inverted = aBuf.readBoolean(); - threshold = aBuf.readLong(); - return this; - } - } - - private enum EnergyType { - - UNIVERSAL_STORAGE(GT_Utility.trans("301", "Universal"), GT_Utility.trans("256", "Universal Storage"), - ICoverable::getUniversalEnergyStored, ICoverable::getUniversalEnergyCapacity), - ELECTRICITY_STORAGE(GT_Utility.trans("302", "Int. EU"), GT_Utility.trans("257", "Electricity Storage"), - ICoverable::getStoredEU, ICoverable::getEUCapacity), - STEAM_STORAGE(GT_Utility.trans("303", "Steam"), GT_Utility.trans("258", "Steam Storage"), - ICoverable::getStoredSteam, ICoverable::getSteamCapacity), - AVERAGE_ELECTRIC_INPUT(GT_Utility.trans("304", "Avg. Input"), GT_Utility.trans("259", "Average Electric Input"), - ICoverable::getAverageElectricInput, (te) -> te.getInputVoltage() * te.getInputAmperage()), - AVERAGE_ELECTRIC_OUTPUT(GT_Utility.trans("305", "Avg. Output"), - GT_Utility.trans("260", "Average Electric Output"), ICoverable::getAverageElectricOutput, - (te) -> te.getOutputVoltage() * te.getOutputAmperage()), - ELECTRICITY_STORAGE_INCLUDING_BATTERIES(GT_Utility.trans("306", "EU stored"), - GT_Utility.trans("261", "Electricity Storage(Including Batteries)"), (te) -> { - if (te instanceof IGregTechTileEntity) { - IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity(); - if (mte instanceof GT_MetaTileEntity_BasicBatteryBuffer buffer) { - return buffer.getStoredEnergy()[0]; - } - } - return te.getStoredEU(); - }, (te) -> { - if (te instanceof IGregTechTileEntity) { - IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity(); - if (mte instanceof GT_MetaTileEntity_BasicBatteryBuffer buffer) { - return buffer.getStoredEnergy()[1]; - } - } - return te.getEUCapacity(); - }); - - private final String title; - private final String tooltip; - private final Function getTileEntityStoredEnergyFunc; - private final Function getTileEntityEnergyCapacityFunc; - - EnergyType(String title, String tooltip, Function getTileEntityStoredEnergyFunc, - Function getTileEntityEnergyCapacityFunc) { - this.title = title; - this.tooltip = tooltip; - this.getTileEntityStoredEnergyFunc = getTileEntityStoredEnergyFunc; - this.getTileEntityEnergyCapacityFunc = getTileEntityEnergyCapacityFunc; - } - - public String getTitle() { - return title; - } - - public String getTooltip() { - return tooltip; - } - - public long getTileEntityStoredEnergy(ICoverable aTileEntity) { - return getTileEntityStoredEnergyFunc.apply(aTileEntity); - } - - public long getTileEntityEnergyCapacity(ICoverable aTileEntity) { - return getTileEntityEnergyCapacityFunc.apply(aTileEntity); - } - - public EnergyType getNext() { - return values()[(ordinal() + 1) % values().length]; - } - - public static EnergyType getEnergyType(int ordinal) { - if (ordinal < 0 || values().length <= ordinal) { - ordinal = 0; - } - return values()[ordinal]; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java deleted file mode 100644 index da6c2c9cfa..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java +++ /dev/null @@ -1,31 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import appeng.facade.IFacadeItem; - -public class GT_Cover_FacadeAE extends GT_Cover_FacadeBase { - - @Override - protected Block getTargetBlock(ItemStack aFacadeStack) { - if (aFacadeStack == null) return null; - final Item item = aFacadeStack.getItem(); - if (!(item instanceof IFacadeItem)) return null; - return ((IFacadeItem) item).getBlock(aFacadeStack); - } - - @Override - protected int getTargetMeta(ItemStack aFacadeStack) { - if (aFacadeStack == null) return 0; - final Item item = aFacadeStack.getItem(); - if (!(item instanceof IFacadeItem)) return 0; - return ((IFacadeItem) item).getMeta(aFacadeStack); - } - - @Override - protected ItemStack getDisplayStackImpl(int aCoverID, FacadeData aCoverVariable) { - return aCoverVariable.mStack; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java deleted file mode 100644 index 4d7d0eb7ee..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java +++ /dev/null @@ -1,396 +0,0 @@ -package gregtech.common.covers; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import cpw.mods.fml.common.network.ByteBufUtils; -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_RenderingWorld; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase { - - /** - * This is the Dummy, if there is a generic Cover without behavior - */ - public GT_Cover_FacadeBase() { - super(FacadeData.class); - } - - @Override - public boolean isSimpleCover() { - return true; - } - - @Override - public FacadeData createDataObject(int aLegacyData) { - return new FacadeData(); - } - - @Override - public FacadeData createDataObject() { - return new FacadeData(); - } - - @Override - protected FacadeData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable.mFlags = ((aCoverVariable.mFlags + 1) & 15); - GT_Utility.sendChatToPlayer( - aPlayer, - ((aCoverVariable.mFlags & 1) != 0 ? GT_Utility.trans("128.1", "Redstone ") : "") - + ((aCoverVariable.mFlags & 2) != 0 ? GT_Utility.trans("129.1", "Energy ") : "") - + ((aCoverVariable.mFlags & 4) != 0 ? GT_Utility.trans("130.1", "Fluids ") : "") - + ((aCoverVariable.mFlags & 8) != 0 ? GT_Utility.trans("131.1", "Items ") : "")); - return aCoverVariable; - } - - @Override - protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 1) != 0; - } - - @Override - protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 1) != 0; - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 2) != 0; - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 2) != 0; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 4) != 0; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 4) != 0; - } - - @Override - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 8) != 0; - } - - @Override - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return (aCoverVariable.mFlags & 8) != 0; - } - - @Override - public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) { - aTileEntity.setCoverIdAndDataAtSide( - side, - GT_Utility.stackToInt(aCover), - new FacadeData(GT_Utility.copyAmount(1, aCover), 0)); - - if (aTileEntity.isClientSide()) GT_RenderingWorld.getInstance() - .register( - aTileEntity.getXCoord(), - aTileEntity.getYCoord(), - aTileEntity.getZCoord(), - getTargetBlock(aCover), - getTargetMeta(aCover)); - } - - @Override - protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - return aCoverVariable.mStack; - } - - @Override - protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - return getSpecialCoverTextureImpl(side, aCoverID, aCoverVariable, aTileEntity); - } - - @Override - protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return Textures.BlockIcons.ERROR_RENDERING[0]; - Block block = getTargetBlock(aCoverVariable.mStack); - if (block == null) return Textures.BlockIcons.ERROR_RENDERING[0]; - // TODO: change this when *someone* made the block render in both pass - if (block.getRenderBlockPass() != 0) return Textures.BlockIcons.ERROR_RENDERING[0]; - return TextureFactory.builder() - .setFromBlock(block, getTargetMeta(aCoverVariable.mStack)) - .useWorldCoord() - .setFromSide(side) - .build(); - } - - @Override - protected Block getFacadeBlockImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return null; - return getTargetBlock(aCoverVariable.mStack); - } - - @Override - protected int getFacadeMetaImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return 0; - return getTargetMeta(aCoverVariable.mStack); - } - - protected abstract Block getTargetBlock(ItemStack aFacadeStack); - - protected abstract int getTargetMeta(ItemStack aFacadeStack); - - @Override - protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected void onDataChangedImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity) { - if (aTileEntity.isClientSide()) GT_RenderingWorld.getInstance() - .register( - aTileEntity.getXCoord(), - aTileEntity.getYCoord(), - aTileEntity.getZCoord(), - getTargetBlock(aCoverVariable.mStack), - getTargetMeta(aCoverVariable.mStack)); - } - - @Override - protected void onDroppedImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) { - if (aTileEntity.isClientSide()) { - for (final ForgeDirection iSide : ForgeDirection.VALID_DIRECTIONS) { - if (iSide == side) continue; - // since we do not allow multiple type of facade per block, this check would be enough. - if (aTileEntity.getCoverBehaviorAtSideNew(iSide) instanceof GT_Cover_FacadeBase) return; - } - if (aCoverVariable.mStack != null) - // mStack == null -> cover removed before data reach client - GT_RenderingWorld.getInstance() - .unregister( - aTileEntity.getXCoord(), - aTileEntity.getYCoord(), - aTileEntity.getZCoord(), - getTargetBlock(aCoverVariable.mStack), - getTargetMeta(aCoverVariable.mStack)); - } - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - // in case cover data didn't hit client somehow. maybe he had a ridiculous view distance - aTileEntity.issueCoverUpdate(side); - return super.onCoverRightClickImpl(side, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ); - } - - @Override - public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { - // blocks that are not rendered in pass 0 are now accepted but rendered awkwardly - // to render it correctly require changing GT_Block_Machine to render in both pass, which is not really a good - // idea... - if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false; - final Block targetBlock = getTargetBlock(aStack); - if (targetBlock == null) return false; - // we allow one single type of facade on the same block for now - // otherwise it's not clear which block this block should impersonate - // this restriction can be lifted later by specifying a certain facade as dominate one as an extension to this - // class - for (final ForgeDirection iSide : ForgeDirection.VALID_DIRECTIONS) { - if (iSide == side) continue; - final CoverInfo coverInfo = aTileEntity.getCoverInfoAtSide(iSide); - if (!coverInfo.isValid()) continue; - final Block facadeBlock = coverInfo.getFacadeBlock(); - if (facadeBlock == null) continue; - if (facadeBlock != targetBlock) return false; - if (coverInfo.getFacadeMeta() != getTargetMeta(aStack)) return false; - } - return true; - } - - public static class FacadeData implements ISerializableObject { - - ItemStack mStack; - int mFlags; - - public FacadeData() {} - - public FacadeData(ItemStack mStack, int mFlags) { - this.mStack = mStack; - this.mFlags = mFlags; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new FacadeData(mStack, mFlags); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - final NBTTagCompound tag = new NBTTagCompound(); - if (mStack != null) tag.setTag("mStack", mStack.writeToNBT(new NBTTagCompound())); - tag.setByte("mFlags", (byte) mFlags); - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - ByteBufUtils.writeItemStack(aBuf, mStack); - aBuf.writeByte(mFlags); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - final NBTTagCompound tag = (NBTTagCompound) aNBT; - mStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mStack")); - mFlags = tag.getByte("mFlags"); - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - mStack = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf); - mFlags = aBuf.readByte(); - return this; - } - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new FacadeBaseUIFactory(buildContext).createWindow(); - } - - private class FacadeBaseUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public FacadeBaseUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder.widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_FacadeBase.this, - this::isEnabled, - (id, coverData) -> { - coverData.mFlags = getNewCoverVariable(id, coverData); - return coverData; - }).addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(), - widget -> widget.setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(), - widget -> widget.setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(), - widget -> widget.setPos(spaceX * 0, spaceY * 2)) - .addToggleButton( - 3, - CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(), - widget -> widget.setPos(spaceX * 0, spaceY * 3)) - .setPos(startX, startY)) - .widget( - new ItemDrawable(() -> getCoverData() != null ? getCoverData().mStack : null).asWidget() - .setPos(5, 5) - .setSize(16, 16)) - .widget( - TextWidget.dynamicString(() -> getCoverData() != null ? getCoverData().mStack.getDisplayName() : "") - .setSynced(false) - .setDefaultColor(COLOR_TITLE.get()) - .setPos(25, 9)) - .widget( - new TextWidget(GT_Utility.trans("128", "Redstone")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("129", "Energy")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("130", "Fluids")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2)) - .widget( - new TextWidget(GT_Utility.trans("131", "Items")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3)); - } - - @Override - protected void addTitleToUI(ModularWindow.Builder builder) {} - - private int getNewCoverVariable(int id, FacadeData coverVariable) { - return switch (id) { - case 0 -> coverVariable.mFlags ^ 0x1; - case 1 -> coverVariable.mFlags ^ 0x2; - case 2 -> coverVariable.mFlags ^ 0x4; - case 3 -> coverVariable.mFlags ^ 0x8; - default -> coverVariable.mFlags; - }; - } - - private boolean isEnabled(int id, FacadeData coverVariable) { - return switch (id) { - case 0 -> (coverVariable.mFlags & 0x1) > 0; - case 1 -> (coverVariable.mFlags & 0x2) > 0; - case 2 -> (coverVariable.mFlags & 0x4) > 0; - case 3 -> (coverVariable.mFlags & 0x8) > 0; - default -> false; - }; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java deleted file mode 100644 index e7d8288ccf..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java +++ /dev/null @@ -1,202 +0,0 @@ -package gregtech.common.covers; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidHandler; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import io.netty.buffer.ByteBuf; - -/*** - * @author TrainerSnow#5086 - */ -public class GT_Cover_FluidLimiter extends GT_CoverBehaviorBase { - - public GT_Cover_FluidLimiter(ITexture coverTexture) { - super(FluidLimiterData.class, coverTexture); - } - - @Override - protected FluidLimiterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - FluidLimiterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aTileEntity instanceof IFluidHandler) { - adjustThreshold(aCoverVariable, !aPlayer.isSneaking()); - GT_Utility.sendChatToPlayer(aPlayer, String.format("Threshold: %f", aCoverVariable.threshold)); - } - return aCoverVariable; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidLimiterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return allowsFluidIn(aCoverVariable, aTileEntity); - } - - @Override - protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidLimiterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - /* - * Helpers - */ - - private boolean allowsFluidIn(FluidLimiterData aCoverVariable, ICoverable c) { - if (c instanceof IFluidHandler) { - return aCoverVariable.threshold > getFillLevelInputSlots((IFluidHandler) c); - } - return false; - } - - private void adjustThreshold(FluidLimiterData coverVariable, boolean way) { - if (way) { - if ((coverVariable.threshold + 0.05f) > 1F) { - coverVariable.threshold = 0F; - return; - } - coverVariable.threshold += 0.05F; - } else { - if ((Math.abs(coverVariable.threshold) - 0.05F) < 0F) { - coverVariable.threshold = 1F; - return; - } - coverVariable.threshold -= 0.05F; - } - } - - private float getFillLevelInputSlots(IFluidHandler fh) { - FluidTankInfo[] tankInfo = fh.getTankInfo(ForgeDirection.UNKNOWN); - long tMax; - long tUsed; - if (tankInfo != null) { - // 0 Because we acces first slot only - FluidTankInfo inputSlot = tankInfo[0]; - if (inputSlot.fluid != null) { - tMax = inputSlot.capacity; - tUsed = inputSlot.fluid.amount; - return (float) tUsed / (float) tMax; - } - } - return 0F; - } - - /* - * Data - */ - - @Override - public FluidLimiterData createDataObject(int aLegacyData) { - return createDataObject(); - } - - @Override - public FluidLimiterData createDataObject() { - return new FluidLimiterData(1F); - } - - public static class FluidLimiterData implements ISerializableObject { - - private float threshold; - - public FluidLimiterData(float threshold) { - this.threshold = threshold; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new FluidLimiterData(threshold); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setFloat("threshold", this.threshold); - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeFloat(this.threshold); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - if (aNBT instanceof NBTTagCompound tag) { - this.threshold = tag.getFloat("threshold"); - } - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { - this.threshold = aBuf.readFloat(); - return this; - } - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new FluidLimiterUIFactory(buildContext).createWindow(); - } - - private class FluidLimiterUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public FluidLimiterUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder.widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_FluidLimiter.this) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) Math.round(coverData.threshold * 100), - (coverData, val) -> { - coverData.threshold = val.floatValue() / 100; - return coverData; - }, - widget -> widget.setBounds(0, 100) - .setFocusOnGuiOpen(true) - .setPos(startX, startY + spaceY * 2 - 24) - .setSize(spaceX * 4 - 3, 12))) - .widget( - new TextWidget("Percent threshold").setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX, startY + spaceY * 2 - 35)); - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java deleted file mode 100644 index 3805dfe2de..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java +++ /dev/null @@ -1,520 +0,0 @@ -package gregtech.common.covers; - -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.drawable.Text; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -/** - * Cover variable - * - *

- * 1111 1111 1111 1111 1111 1111 1111 1111
- *  |- interval-| |- flow rate 2 compl. -|
- * ^ export?
- * 
- * - * Concat export and flow rate 2 compl. together to get actual flow rate. A positive actual flow rate is export, and - * vice versa. - *

- * Interval is an unsigned 11 bit integer minus 1, so the range is 1~2048. The stored bits will be flipped bitwise if - * speed is negative. This way, `0` means 1tick interval, while `-1` means 1 tick interval as well, preserving the - * legacy behavior. - */ -public class GT_Cover_FluidRegulator extends GT_CoverBehaviorBase { - - private static final int SPEED_LENGTH = 20; - private static final int TICK_RATE_LENGTH = Integer.SIZE - SPEED_LENGTH - 1; - private static final int TICK_RATE_MIN = 1; - private static final int TICK_RATE_MAX = (-1 >>> (Integer.SIZE - TICK_RATE_LENGTH)) + TICK_RATE_MIN; - private static final int TICK_RATE_BITMASK = (TICK_RATE_MAX - TICK_RATE_MIN) << SPEED_LENGTH; - - public final int mTransferRate; - private boolean allowFluid = false; - - public GT_Cover_FluidRegulator(int aTransferRate, ITexture coverTexture) { - super(FluidRegulatorData.class, coverTexture); - if (aTransferRate > (-1 >>> (Integer.SIZE - SPEED_LENGTH))) - throw new IllegalArgumentException("aTransferRate too big: " + aTransferRate); - this.mTransferRate = aTransferRate; - } - - @Override - public FluidRegulatorData createDataObject(int aLegacyData) { - return new FluidRegulatorData(aLegacyData); - } - - @Override - public FluidRegulatorData createDataObject() { - return new FluidRegulatorData(); - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return aCoverVariable.condition.isRedstoneSensitive(); - } - - @Override - protected FluidRegulatorData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - FluidRegulatorData aCoverVariable, ICoverable aTileEntity, long aTimer) { - if (aCoverVariable.speed == 0 || !aCoverVariable.condition.isAllowedToWork(side, aCoverID, aTileEntity)) { - return aCoverVariable; - } - if ((aTileEntity instanceof IFluidHandler)) { - final IFluidHandler tTank1; - final IFluidHandler tTank2; - final ForgeDirection directionFrom; - final ForgeDirection directionTo; - if (aCoverVariable.speed > 0) { - tTank2 = aTileEntity.getITankContainerAtSide(side); - tTank1 = (IFluidHandler) aTileEntity; - directionFrom = side; - directionTo = side.getOpposite(); - } else { - tTank1 = aTileEntity.getITankContainerAtSide(side); - tTank2 = (IFluidHandler) aTileEntity; - directionFrom = side.getOpposite(); - directionTo = side; - } - if (tTank1 != null && tTank2 != null) { - allowFluid = true; - GT_Utility - .moveFluid(tTank1, tTank2, directionFrom, Math.abs(aCoverVariable.speed), this::canTransferFluid); - allowFluid = false; - } - } - return aCoverVariable; - } - - private void adjustSpeed(EntityPlayer aPlayer, FluidRegulatorData aCoverVariable, int scale) { - int tSpeed = aCoverVariable.speed; - tSpeed += scale; - int tTickRate = aCoverVariable.tickRate; - if (Math.abs(tSpeed) > mTransferRate * tTickRate) { - tSpeed = mTransferRate * tTickRate * (tSpeed > 0 ? 1 : -1); - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("316", "Pump speed limit reached!")); - } - if (tTickRate == 1) { - GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("048", "Pump speed: ") + tSpeed - + GT_Utility.trans("049", "L/tick ") - + tSpeed * 20 - + GT_Utility.trans("050", "L/sec")); - } else { - GT_Utility.sendChatToPlayer( - aPlayer, - String.format( - GT_Utility.trans("207", "Pump speed: %dL every %d ticks, %.2f L/sec on average"), - tSpeed, - tTickRate, - tSpeed * 20d / tTickRate)); - } - } - - @Override - public FluidRegulatorData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - FluidRegulatorData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) { - adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? 256 : 16); - } else { - adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? -256 : -16); - } - return aCoverVariable; - } - - protected boolean canTransferFluid(FluidStack fluid) { - return true; - } - - @Override - public boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return allowFluid; - } - - @Override - public boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return allowFluid; - } - - @Override - protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, - ICoverable aTileEntity) { - return aCoverVariable.tickRate; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new FluidRegulatorUIFactory(buildContext).createWindow(); - } - - private class FluidRegulatorUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - private static final NumberFormatMUI numberFormat; - static { - numberFormat = new NumberFormatMUI(); - numberFormat.setMaximumFractionDigits(2); - } - - public FluidRegulatorUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - AtomicBoolean warn = new AtomicBoolean(false); - - builder.widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_FluidRegulator.this) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.speed >= 0, - (coverData, state) -> { - coverData.speed = Math.abs(coverData.speed); - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) - .addTooltip(GT_Utility.trans("006", "Export")) - .setPos(spaceX * 0, spaceY * 0)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.speed <= 0, - (coverData, state) -> { - coverData.speed = -Math.abs(coverData.speed); - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) - .addTooltip(GT_Utility.trans("007", "Import")) - .setPos(spaceX * 1, spaceY * 0)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.condition == Conditional.Always, - (coverData, state) -> { - coverData.condition = Conditional.Always; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK) - .addTooltip(GT_Utility.trans("224", "Always On")) - .setPos(spaceX * 0, spaceY * 1)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.condition == Conditional.Conditional, - (coverData, state) -> { - coverData.condition = Conditional.Conditional; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE) - .addTooltip(GT_Utility.trans("343", "Use Machine Processing State")) - .setPos(spaceX * 1, spaceY * 1)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.condition == Conditional.Inverted, - (coverData, state) -> { - coverData.condition = Conditional.Inverted; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE) - .addTooltip(GT_Utility.trans("343.1", "Use Inverted Machine Processing State")) - .setPos(spaceX * 2, spaceY * 1)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.speed, - (coverData, state) -> { - coverData.speed = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY) - .setValidator(val -> { - final int tickRate = getCoverData() != null ? getCoverData().tickRate : 0; - final long maxFlow = (long) mTransferRate - * GT_Utility.clamp(tickRate, TICK_RATE_MIN, TICK_RATE_MAX); - warn.set(false); - if (val > maxFlow) { - val = maxFlow; - warn.set(true); - } else if (val < -maxFlow) { - val = -maxFlow; - warn.set(true); - } - return val; - }) - .setScrollValues(1, 144, 1000) - .setFocusOnGuiOpen(true) - .setPos(spaceX * 0, spaceY * 2 + 2) - .setSize(spaceX * 4 - 3, 12)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.tickRate, - (coverData, state) -> { - coverData.tickRate = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(0, TICK_RATE_MAX) - .setValidator(val -> { - final int speed = getCoverData() != null ? getCoverData().speed : 0; - warn.set(false); - if (val > TICK_RATE_MAX) { - val = (long) TICK_RATE_MAX; - warn.set(true); - } else if (Math.abs(speed) > mTransferRate * val) { - val = (long) Math - .min(TICK_RATE_MAX, (Math.abs(speed) + mTransferRate - 1) / mTransferRate); - warn.set(true); - } else if (val < TICK_RATE_MIN) { - val = 1L; - } - return val; - }) - .setPos(spaceX * 5, spaceY * 2 + 2) - .setSize(spaceX * 2 - 3, 12)) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 4, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 4, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("208", " L")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 4, 4 + startY + spaceY * 2)) - .widget( - new TextWidget(GT_Utility.trans("209", " ticks")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 7, 4 + startY + spaceY * 2)) - .widget(new TextWidget().setTextSupplier(() -> { - FluidRegulatorData coverVariable = getCoverData(); - if (coverVariable == null) return new Text(""); - return new Text( - GT_Utility.trans("210.1", "Average:") + " " - + numberFormat.format( - coverVariable.tickRate == 0 ? 0 : coverVariable.speed * 20d / coverVariable.tickRate) - + " " - + GT_Utility.trans("210.2", "L/sec")) - .color(warn.get() ? COLOR_TEXT_WARN.get() : COLOR_TEXT_GRAY.get()); - }) - .setPos(startX + spaceX * 0, 4 + startY + spaceY * 3)); - } - } - - @Override - public boolean allowsTickRateAddition() { - return false; - } - - public enum Conditional { - - Always(false) { - - @Override - boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) { - return true; - } - }, - Conditional(true) { - - @Override - boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) { - return !(aTileEntity instanceof IMachineProgress) || ((IMachineProgress) aTileEntity).isAllowedToWork(); - } - }, - Inverted(true) { - - @Override - boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) { - return !(aTileEntity instanceof IMachineProgress) - || !((IMachineProgress) aTileEntity).isAllowedToWork(); - } - }; - - static final Conditional[] VALUES = values(); - private final boolean redstoneSensitive; - - Conditional(boolean redstoneSensitive) { - this.redstoneSensitive = redstoneSensitive; - } - - abstract boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity); - - boolean isRedstoneSensitive() { - return redstoneSensitive; - } - } - - public static class FluidRegulatorData implements ISerializableObject { - - private int tickRate; - private int speed; - private Conditional condition; - - private static int getSpeed(int aCoverVariable) { - // positive or 0 -> interval bits need to be set to zero - // negative -> interval bits need to be set to one - return aCoverVariable >= 0 ? aCoverVariable & ~TICK_RATE_BITMASK : aCoverVariable | TICK_RATE_BITMASK; - } - - private static int getTickRate(int aCoverVariable) { - // range: TICK_RATE_MIN ~ TICK_RATE_MAX - return ((Math.abs(aCoverVariable) & TICK_RATE_BITMASK) >>> SPEED_LENGTH) + TICK_RATE_MIN; - } - - public FluidRegulatorData() { - this(0); - } - - public FluidRegulatorData(int legacy) { - this(getTickRate(legacy), getSpeed(legacy), Conditional.Always); - } - - public FluidRegulatorData(int tickRate, int speed, Conditional condition) { - this.tickRate = tickRate; - this.speed = speed; - this.condition = condition; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new FluidRegulatorData(tickRate, speed, condition); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("mSpeed", speed); - tag.setInteger("mTickRate", tickRate); - tag.setByte("mCondition", (byte) condition.ordinal()); - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeInt(tickRate) - .writeInt(speed) - .writeByte(condition.ordinal()); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - if (!(aNBT instanceof NBTTagCompound tag)) return; // not very good... - speed = tag.getInteger("mSpeed"); - tickRate = tag.getInteger("mTickRate"); - condition = Conditional.VALUES[tag.getByte("mCondition")]; - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { - return new FluidRegulatorData(aBuf.readInt(), aBuf.readInt(), Conditional.VALUES[aBuf.readUnsignedByte()]); - } - - public int getTickRate() { - return tickRate; - } - - public void setTickRate(int tickRate) { - this.tickRate = tickRate; - } - - public int getSpeed() { - return speed; - } - - public void setSpeed(int speed) { - this.speed = speed; - } - - public Conditional getCondition() { - return condition; - } - - public void setCondition(Conditional condition) { - this.condition = condition; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java deleted file mode 100644 index 7f9fda7cbc..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java +++ /dev/null @@ -1,507 +0,0 @@ -package gregtech.common.covers; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR0; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR1; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR10; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR11; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR12; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR13; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR14; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR2; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR3; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR4; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR5; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR6; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR7; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR8; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR9; - -import java.util.Optional; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.IIcon; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidContainerItem; -import net.minecraftforge.fluids.IFluidHandler; - -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.ITextureBuilder; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase; -import io.netty.buffer.ByteBuf; - -/** - * TODO: Implement overlay rendering only with - * {@link GT_CoverBehaviorBase#getSpecialCoverFGTextureImpl(ForgeDirection, int, ISerializableObject, ICoverable)} - */ -public class GT_Cover_FluidStorageMonitor extends GT_CoverBehaviorBase { - - private static final IIconContainer[] icons = new IIconContainer[] { OVERLAY_FLUID_STORAGE_MONITOR0, - OVERLAY_FLUID_STORAGE_MONITOR1, OVERLAY_FLUID_STORAGE_MONITOR2, OVERLAY_FLUID_STORAGE_MONITOR3, - OVERLAY_FLUID_STORAGE_MONITOR4, OVERLAY_FLUID_STORAGE_MONITOR5, OVERLAY_FLUID_STORAGE_MONITOR6, - OVERLAY_FLUID_STORAGE_MONITOR7, OVERLAY_FLUID_STORAGE_MONITOR8, OVERLAY_FLUID_STORAGE_MONITOR9, - OVERLAY_FLUID_STORAGE_MONITOR10, OVERLAY_FLUID_STORAGE_MONITOR11, OVERLAY_FLUID_STORAGE_MONITOR12, - OVERLAY_FLUID_STORAGE_MONITOR13, OVERLAY_FLUID_STORAGE_MONITOR14, }; - - public GT_Cover_FluidStorageMonitor() { - super(FluidStorageData.class); - } - - @Override - public FluidStorageData createDataObject(int aLegacyData) { - return new FluidStorageData(); - } - - @Override - public FluidStorageData createDataObject() { - return new FluidStorageData(); - } - - @Override - protected FluidStorageData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - FluidStorageData aCoverVariable, ICoverable aTileEntity, long aTimer) { - final FluidTankInfo[] tanks = getValidFluidTankInfosForDisplay(aTileEntity, aCoverVariable.side); - if (tanks == null) { - return aCoverVariable.disable() - .issueCoverUpdateIfNeeded(aTileEntity, side); - } - assert 0 < tanks.length; - - if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) { - aCoverVariable.setSlot(0); - } - - final FluidTankInfo tank = tanks[aCoverVariable.slot]; - if (tank == null) { - return aCoverVariable.setNullTank() - .issueCoverUpdateIfNeeded(aTileEntity, side); - } - - return aCoverVariable.setFluid(tank.fluid) - .setScale(getTankScale(tank)) - .issueCoverUpdateIfNeeded(aTileEntity, side); - } - - @Override - protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, - ICoverable aTileEntity) { - return getSpecialCoverTextureImpl(side, aCoverID, aCoverVariable, aTileEntity); - } - - @Override - protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, - ICoverable aTileEntity) { - if (aCoverVariable.slot == -1 || aCoverVariable.fluid == null || aCoverVariable.scale == 0) { - return TextureFactory.of(OVERLAY_FLUID_STORAGE_MONITOR0); - } - final IIconContainer fluidIcon = new IIconContainer() { - - @Override - public IIcon getIcon() { - return aCoverVariable.fluid.getStillIcon(); - } - - @Override - public IIcon getOverlayIcon() { - return null; - } - - @Override - public ResourceLocation getTextureFile() { - return TextureMap.locationBlocksTexture; - } - }; - - final short[] fluidRGBA = colorToRGBA(aCoverVariable.fluid.getColor()); - final ITextureBuilder fluidTextureBuilder = TextureFactory.builder() - .addIcon(fluidIcon) - .setRGBA(fluidRGBA); - if (aCoverVariable.fluid.getLuminosity() > 0) fluidTextureBuilder.glow(); - return TextureFactory.of(fluidTextureBuilder.build(), TextureFactory.of(icons[aCoverVariable.scale])); - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aPlayer == null || aPlayer.worldObj == null || aPlayer.worldObj.isRemote) { - return false; - } - final ItemStack heldItem = aPlayer.getHeldItem(); - if (aPlayer.isSneaking() || heldItem == null) { - return false; - } - final FluidTankInfo[] tanks = getValidFluidTankInfos(aTileEntity, aCoverVariable.side); - if (tanks == null) { - return false; - } - if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) { - return false; - } - final FluidTankInfo tank = tanks[aCoverVariable.slot]; - if (tank == null) { - return false; - } - IFluidHandler tankHandler = (IFluidHandler) aTileEntity; - - final ItemStack heldItemSizedOne = GT_Utility.copyAmount(1, heldItem); - if (heldItemSizedOne == null || heldItemSizedOne.stackSize <= 0) { - return false; - } - - ItemStack result; - result = fillToTank(heldItemSizedOne, tankHandler, aCoverVariable.side); - if (result != null) { - replaceHeldItemStack(aPlayer, heldItem, result); - return true; - } - result = fillToContainer(heldItemSizedOne, tank, tankHandler, aCoverVariable.side); - if (result != null) { - replaceHeldItemStack(aPlayer, heldItem, result); - return true; - } - return false; - } - - protected static ItemStack fillToTank(@Nonnull ItemStack container, @Nonnull IFluidHandler tank, - ForgeDirection side) { - final FluidStack fluidToFill = GT_Utility.getFluidForFilledItem(container, true); - if (fluidToFill == null || fluidToFill.getFluid() == null || fluidToFill.amount <= 0) { - return null; - } - if (!tank.canFill(side, fluidToFill.getFluid())) { - return null; - } - - if (container.getItem() instanceof IFluidContainerItem containerItem) { - final int filled = tank.fill(side, fluidToFill, true); - if (filled == 0) { - return null; - } - containerItem.drain(container, filled, true); - return container; - } else { - final int filled = tank.fill(side, fluidToFill, false); - if (filled != fluidToFill.amount) { - return null; - } - tank.fill(side, fluidToFill, true); - return GT_Utility.getContainerForFilledItem(container, false); - } - } - - protected static ItemStack fillToContainer(@Nonnull ItemStack container, @Nonnull FluidTankInfo tankInfo, - @Nonnull IFluidHandler tank, ForgeDirection side) { - if (tankInfo.fluid == null || tankInfo.fluid.getFluid() == null || tankInfo.fluid.amount <= 0) { - return null; - } - if (!tank.canDrain(side, tankInfo.fluid.getFluid())) { - return null; - } - - if (container.getItem() instanceof IFluidContainerItem containerItem) { - final int filled = Math.min( - Optional - .ofNullable( - tank.drain( - side, - new FluidStack(tankInfo.fluid.getFluid(), containerItem.getCapacity(container)), - false)) - .filter(fs -> GT_Utility.areFluidsEqual(fs, tankInfo.fluid)) - .map(fs -> fs.amount) - .orElse(0), - containerItem.fill( - container, - new FluidStack(tankInfo.fluid.getFluid(), containerItem.getCapacity(container)), - false)); - if (filled == 0) { - return null; - } - containerItem.fill(container, new FluidStack(tankInfo.fluid.getFluid(), filled), true); - tank.drain(side, new FluidStack(tankInfo.fluid.getFluid(), filled), true); - return container; - } else { - final ItemStack filledContainer = GT_Utility.fillFluidContainer(tankInfo.fluid, container, false, false); - if (filledContainer == null) { - return null; - } - final FluidStack filledFluid = GT_Utility.getFluidForFilledItem(filledContainer, false); - if (filledFluid == null || filledFluid.getFluid() == null || filledFluid.amount <= 0) { - return null; - } - if (Optional.ofNullable(tank.drain(side, filledFluid, false)) - .filter(fs -> GT_Utility.areFluidsEqual(fs, filledFluid)) - .map(fs -> fs.amount) - .orElse(0) != filledFluid.amount) { - return null; - } - tank.drain(side, filledFluid, true); - return filledContainer; - } - } - - protected static void replaceHeldItemStack(@Nonnull EntityPlayer player, @Nonnull ItemStack heldItem, - @Nonnull ItemStack result) { - heldItem.stackSize--; - GT_Utility.addItemToPlayerInventory(player, result); - player.inventoryContainer.detectAndSendChanges(); - } - - @Override - protected FluidStorageData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - FluidStorageData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aPlayer.isSneaking()) { - aCoverVariable - .setSide(ForgeDirection.values()[(aCoverVariable.side.ordinal() + 1) % ForgeDirection.values().length]) - .setSlot(0); - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("SIDE", "Side: ") + aCoverVariable.side.name()); - return aCoverVariable; - } - final FluidTankInfo[] tanks = getValidFluidTankInfos(aTileEntity, aCoverVariable.side); - if (tanks == null) { - return aCoverVariable.disable(); - } - assert 0 < tanks.length; - if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) { - aCoverVariable.setSlot(0); - } else { - aCoverVariable - .setSlot((aCoverVariable.slot + tanks.length + (aPlayer.isSneaking() ? -1 : 1)) % tanks.length); - } - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("053", "Slot: ") + aCoverVariable.slot); - return aCoverVariable; - } - - @Override - protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, - ICoverable aTileEntity) { - return 10; - } - - @Nullable - protected static FluidTankInfo[] getValidFluidTankInfos(@Nullable ICoverable tileEntity, - @Nonnull ForgeDirection side) { - if (tileEntity instanceof IFluidHandler) { - final FluidTankInfo[] tanks = ((IFluidHandler) tileEntity).getTankInfo(side); - if (tanks != null && tanks.length > 0) { - return tanks; - } - } - return null; - } - - @Nullable - protected static FluidTankInfo[] getValidFluidTankInfosForDisplay(@Nullable ICoverable tileEntity, - @Nonnull ForgeDirection side) { - if (tileEntity instanceof IGregTechTileEntity baseMetaTileEntity - && baseMetaTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalTankBase digitalTank) { - return digitalTank.getRealTankInfo(side); - } - return getValidFluidTankInfos(tileEntity, side); - } - - protected static int getTankScale(@Nonnull FluidTankInfo tank) { - if (tank.fluid == null || tank.capacity <= 0) { - return 0; - } - return (int) Math.ceil(tank.fluid.amount / (double) tank.capacity * (icons.length - 1)); - } - - protected short[] colorToRGBA(int color) { - return new short[] { (short) (color >> 16 & 0xFF), (short) (color >> 8 & 0xFF), (short) (color & 0xFF), - (short) (0xFF) }; - } - - public static class FluidStorageData implements ISerializableObject { - - private ForgeDirection side; - private int slot; - private Fluid fluid; - private int scale; - private boolean dirty; - - public FluidStorageData() { - this(ForgeDirection.UNKNOWN, 0, null, 0, false); - } - - public FluidStorageData(ForgeDirection side, int slot, Fluid fluid, int scale, boolean dirty) { - this.side = side; - this.slot = slot; - this.fluid = fluid; - this.scale = scale; - this.dirty = dirty; - } - - public FluidStorageData setSide(ForgeDirection side) { - this.side = side; - return this; - } - - /** - * @param slot 0-based index of the tank, -1 for no correct FluidTankInfo[] for the current side. - */ - public FluidStorageData setSlot(int slot) { - if (this.slot != slot) { - if (this.slot == -1 || slot == -1) { - this.dirty = true; - } - this.slot = slot; - } - return this; - } - - /** - * Means there is no correct FluidTankInfo[] for the current side. - */ - public FluidStorageData disable() { - setSlot(-1); - return this; - } - - public FluidStorageData setFluid(@Nullable Fluid fluid) { - if (!Util.areFluidsEqual(this.fluid, fluid)) { - this.fluid = fluid; - this.dirty = true; - } - return this; - } - - public FluidStorageData setFluid(@Nullable FluidStack fluidStack) { - final Fluid fluid = fluidStack == null ? null : fluidStack.getFluid(); - return setFluid(fluid); - } - - public FluidStorageData setScale(int scale) { - if (this.scale != scale) { - this.scale = scale; - this.dirty = true; - } - return this; - } - - public FluidStorageData setNullTank() { - return this.setFluid((Fluid) null) - .setScale(0); - } - - public FluidStorageData issueCoverUpdateIfNeeded(ICoverable tileEntity, ForgeDirection side) { - if (this.dirty) { - tileEntity.issueCoverUpdate(side); - this.dirty = false; - } - return this; - } - - // region ISerializableObject - @Nonnull - @Override - public ISerializableObject copy() { - return new FluidStorageData(side, slot, fluid, scale, dirty); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; - side = ForgeDirection.getOrientation(tag.getByte("side")); - slot = tag.getInteger("slot"); - fluid = Util.getFluid(tag.getString("fluidName")); - scale = tag.getInteger("scale"); - dirty = tag.getBoolean("dirty"); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setByte("side", (byte) side.ordinal()); - tag.setInteger("slot", slot); - tag.setString("fluidName", Util.getFluidName(fluid)); - tag.setInteger("scale", scale); - tag.setBoolean("dirty", dirty); - return tag; - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { - final ForgeDirection side = ForgeDirection.getOrientation(aBuf.readByte()); - final int slot = aBuf.readInt(); - final Fluid fluid = Util.getFluid(aBuf.readInt()); - final int scale = aBuf.readInt(); - final boolean dirty = aBuf.readBoolean(); - return new FluidStorageData(side, slot, fluid, scale, dirty); - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeByte(side.ordinal()); - aBuf.writeInt(slot); - aBuf.writeInt(Util.getFluidID(fluid)); - aBuf.writeInt(scale); - aBuf.writeBoolean(dirty); - } - // endregion - - } - - protected static class Util { - - public static int getFluidID(@Nullable Fluid fluid) { - return fluid == null ? -1 : fluid.getID(); - } - - public static String getFluidName(@Nullable Fluid fluid) { - return fluid == null ? "" : fluid.getName(); - } - - public static Fluid getFluid(int id) { - return id == -1 ? null : FluidRegistry.getFluid(id); - } - - public static Fluid getFluid(String name) { - return name.isEmpty() ? null : FluidRegistry.getFluid(name); - } - - public static boolean areFluidsEqual(@Nullable Fluid a, @Nullable Fluid b) { - return getFluidID(a) == getFluidID(b); - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java b/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java deleted file mode 100644 index 44e264c8e8..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java +++ /dev/null @@ -1,417 +0,0 @@ -package gregtech.common.covers; - -import static gregtech.api.enums.GT_Values.E; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.Constants.NBT; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_SlotWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_Fluidfilter extends GT_CoverBehaviorBase { - - // Uses the lower 3 bits of the cover variable, so we have 8 options to work with (0-7) - private final int FILTER_INPUT_DENY_OUTPUT = 0; // 000 - private final int INVERT_INPUT_DENY_OUTPUT = 1; // 001 - private final int FILTER_INPUT_ANY_OUTPUT = 2; // 010 - private final int INVERT_INPUT_ANY_OUTPUT = 3; // 011 - private final int DENY_INPUT_FILTER_OUTPUT = 4; // 100 - private final int DENY_INPUT_INVERT_OUTPUT = 5; // 101 - private final int ANY_INPUT_FILTER_OUTPUT = 6; // 110 - private final int ANY_INPUT_INVERT_OUTPUT = 7; // 111 - - public GT_Cover_Fluidfilter(ITexture coverTexture) { - super(FluidFilterData.class, coverTexture); - } - - @Override - public FluidFilterData createDataObject() { - return new FluidFilterData(-1, 0); - } - - @Override - public FluidFilterData createDataObject(int aLegacyData) { - return new FluidFilterData(aLegacyData >>> 3, aLegacyData & 0x7); - } - - @Override - protected String getDescriptionImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity) { - final Fluid fluid = FluidRegistry.getFluid(aCoverVariable.mFluidID); - if (fluid == null) return E; - - final FluidStack sFluid = new FluidStack(fluid, 1000); - return (String - .format("Filtering Fluid: %s - %s", sFluid.getLocalizedName(), getFilterMode(aCoverVariable.mFilterMode))); - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return false; - } - - @Override - protected FluidFilterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - FluidFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - return aCoverVariable; - } - - public String getFilterMode(int aFilterMode) { - return switch (aFilterMode) { - case FILTER_INPUT_DENY_OUTPUT -> GT_Utility.trans("043", "Filter input, Deny output"); - case INVERT_INPUT_DENY_OUTPUT -> GT_Utility.trans("044", "Invert input, Deny output"); - case FILTER_INPUT_ANY_OUTPUT -> GT_Utility.trans("045", "Filter input, Permit any output"); - case INVERT_INPUT_ANY_OUTPUT -> GT_Utility.trans("046", "Invert input, Permit any output"); - case DENY_INPUT_FILTER_OUTPUT -> GT_Utility.trans("307", "Deny input, Filter output"); - case DENY_INPUT_INVERT_OUTPUT -> GT_Utility.trans("308", "Deny input, Invert output"); - case ANY_INPUT_FILTER_OUTPUT -> GT_Utility.trans("309", "Permit any input, Filter output"); - case ANY_INPUT_INVERT_OUTPUT -> GT_Utility.trans("310", "Permit any input, Invert output"); - default -> ("UNKNOWN"); - }; - } - - @Override - protected FluidFilterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - FluidFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable.mFilterMode = (aCoverVariable.mFilterMode + (aPlayer.isSneaking() ? -1 : 1)) % 8; - if (aCoverVariable.mFilterMode < 0) { - aCoverVariable.mFilterMode = 7; - } - - GT_Utility.sendChatToPlayer(aPlayer, getFilterMode(aCoverVariable.mFilterMode)); - - return aCoverVariable; - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (side == ForgeDirection.UNKNOWN) return false; - if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D))) - || (side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0 && aZ > 0.375D && aZ < 0.625D - || (side.offsetZ != 0)) { - final ItemStack tStack = aPlayer.inventory.getCurrentItem(); - if (tStack == null) return true; - - final FluidStack tFluid = GT_Utility.getFluidForFilledItem(tStack, true); - if (tFluid != null) { - final int aFluid = tFluid.getFluidID(); - aCoverVariable.mFluidID = aFluid; - aTileEntity.setCoverDataAtSide(side, aCoverVariable); - final FluidStack sFluid = new FluidStack(FluidRegistry.getFluid(aFluid), 1000); - GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("047", "Filter Fluid: ") + sFluid.getLocalizedName()); - } - return true; - } - return false; - } - - @Override - protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - if (aFluid == null) return true; - - int aFilterMode = aCoverVariable.mFilterMode; - int aFilterFluid = aCoverVariable.mFluidID; - - if (aFilterMode == DENY_INPUT_FILTER_OUTPUT || aFilterMode == DENY_INPUT_INVERT_OUTPUT) return false; - else if (aFilterMode == ANY_INPUT_FILTER_OUTPUT || aFilterMode == ANY_INPUT_INVERT_OUTPUT) return true; - else if (aFluid.getID() == aFilterFluid) - return aFilterMode == FILTER_INPUT_DENY_OUTPUT || aFilterMode == FILTER_INPUT_ANY_OUTPUT; - else return aFilterMode == INVERT_INPUT_DENY_OUTPUT || aFilterMode == INVERT_INPUT_ANY_OUTPUT; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - if (aFluid == null) return true; - - int aFilterMode = aCoverVariable.mFilterMode; - int aFilterFluid = aCoverVariable.mFluidID; - - if (aFilterMode == FILTER_INPUT_DENY_OUTPUT || aFilterMode == INVERT_INPUT_DENY_OUTPUT) return false; - else if (aFilterMode == FILTER_INPUT_ANY_OUTPUT || aFilterMode == INVERT_INPUT_ANY_OUTPUT) return true; - else if (aFluid.getID() == aFilterFluid) - return aFilterMode == DENY_INPUT_FILTER_OUTPUT || aFilterMode == ANY_INPUT_FILTER_OUTPUT; - else return aFilterMode == DENY_INPUT_INVERT_OUTPUT || aFilterMode == ANY_INPUT_INVERT_OUTPUT; - } - - @Override - protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, - ICoverable aTileEntity) { - return 0; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new FluidFilterUIFactory(buildContext).createWindow(); - } - - private class FluidFilterUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public FluidFilterUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder.widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_Fluidfilter.this, - (id, coverData) -> !getClickable(id, coverData), - (id, coverData) -> { - coverData.mFilterMode = getNewFilterMode(id, coverData); - return coverData; - }).addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) - .addTooltip(GT_Utility.trans("232", "Filter Input")) - .setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) - .addTooltip(GT_Utility.trans("233", "Filter Output")) - .setPos(spaceX * 1, spaceY * 0)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BLOCK_INPUT) - .addTooltip(GT_Utility.trans("234", "Block Output")) - .setPos(spaceX * 0, spaceY * 2)) - .addToggleButton( - 3, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_ALLOW_INPUT) - .addTooltip(GT_Utility.trans("235", "Allow Output")) - .setPos(spaceX * 1, spaceY * 2)) - .addToggleButton( - 4, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_WHITELIST) - .addTooltip(GT_Utility.trans("236", "Whitelist Fluid")) - .setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 5, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BLACKLIST) - .addTooltip(GT_Utility.trans("237", "Blacklist Fluid")) - .setPos(spaceX * 1, spaceY * 1)) - .addFollower( - new CoverDataFollower_SlotWidget(new ItemStackHandler(), 0, true) { - - @Override - protected void putClickedStack(ItemStack stack, int mouseButton) { - if (stack != null && GT_Utility.getFluidFromContainerOrFluidDisplay(stack) == null) - return; - super.putClickedStack( - GT_Utility.getFluidDisplayStack( - GT_Utility.getFluidFromContainerOrFluidDisplay(stack), - false), - mouseButton); - } - }, - this::getFluidDisplayItem, - (coverData, stack) -> { - if (stack == null) { - coverData.mFluidID = -1; - } else { - FluidStack fluid = GT_Utility.getFluidFromDisplayStack(stack); - if (fluid != null && fluid.getFluid() != null) { - coverData.mFluidID = fluid.getFluid() - .getID(); - } - } - return coverData; - }, - widget -> widget.setBackground(ModularUITextures.FLUID_SLOT) - .setPos(0, spaceY * 3 + 2)) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("238", "Filter Direction")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 2, 3 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("239", "Filter Type")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 2, 3 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("240", "Block Flow")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 2, 3 + startY + spaceY * 2)) - .widget(TextWidget.dynamicString(() -> { - if (getCoverData() != null) { - ItemStack fluidDisplay = getFluidDisplayItem(getCoverData()); - if (fluidDisplay != null) { - return fluidDisplay.getDisplayName(); - } - } - return GT_Utility.trans("315", "Filter Empty"); - }) - .setSynced(false) - .setDefaultColor(COLOR_TITLE.get()) - .setPos(startX + spaceX + 3, 4 + startY + spaceY * 3)); - } - - private int getNewFilterMode(int id, FluidFilterData coverVariable) { - return switch (id) { - case 0 -> (coverVariable.mFilterMode & 0x3); - case 1 -> (coverVariable.mFilterMode | 0x4); - case 2 -> (coverVariable.mFilterMode & 0x5); - case 3 -> (coverVariable.mFilterMode | 0x2); - case 4 -> (coverVariable.mFilterMode & 0x6); - case 5 -> (coverVariable.mFilterMode | 0x1); - default -> coverVariable.mFilterMode; - }; - } - - private boolean getClickable(int id, FluidFilterData coverVariable) { - return switch (id) { - case 0, 1 -> (coverVariable.mFilterMode >> 2 & 0x1) != (id & 0x1); - case 2, 3 -> (coverVariable.mFilterMode >> 1 & 0x1) != (id & 0x1); - case 4, 5 -> (coverVariable.mFilterMode & 0x1) != (id & 0x1); - default -> false; - }; - } - - private ItemStack getFluidDisplayItem(FluidFilterData coverData) { - Fluid fluid = FluidRegistry.getFluid(coverData.mFluidID); - return GT_Utility.getFluidDisplayStack(fluid); - } - } - - public static class FluidFilterData implements ISerializableObject { - - private int mFluidID; - private int mFilterMode; - - public FluidFilterData(int mFluidID, int mFilterMode) { - this.mFluidID = mFluidID; - this.mFilterMode = mFilterMode; - } - - @Override - @Nonnull - public ISerializableObject copy() { - return new FluidFilterData(mFluidID, mFilterMode); - } - - @Override - @Nonnull - public NBTBase saveDataToNBT() { - NBTTagCompound tNBT = new NBTTagCompound(); - tNBT.setInteger("mFilterMode", mFilterMode); - if (mFluidID >= 0) tNBT.setString( - "mFluid", - FluidRegistry.getFluid(mFluidID) - .getName()); - return tNBT; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeByte(mFilterMode) - .writeInt(mFluidID); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - if (aNBT instanceof NBTTagCompound tNBT) { - mFilterMode = tNBT.getInteger("mFilterMode"); - if (tNBT.hasKey("mFluid", NBT.TAG_STRING)) - mFluidID = FluidRegistry.getFluidID(tNBT.getString("mFluid")); - else mFluidID = -1; - } - } - - @Override - @Nonnull - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - mFilterMode = aBuf.readByte(); - mFluidID = aBuf.readInt(); - return this; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java deleted file mode 100644 index 2274722c9a..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java +++ /dev/null @@ -1,298 +0,0 @@ -package gregtech.common.covers; - -import static gregtech.api.util.GT_Utility.intToStack; -import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; - -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import cpw.mods.fml.common.network.ByteBufUtils; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_SlotWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_ItemFilter extends GT_CoverBehaviorBase { - - private final boolean mExport; - - public GT_Cover_ItemFilter(boolean isExport, ITexture coverTexture) { - super(ItemFilterData.class, coverTexture); - this.mExport = isExport; - } - - @Override - public ItemFilterData createDataObject(int aLegacyData) { - return new ItemFilterData((aLegacyData & 0x1) == 0, intToStack(aLegacyData >>> 1)); - } - - @Override - public ItemFilterData createDataObject() { - return new ItemFilterData(); - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return false; - } - - @Override - protected ItemFilterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ItemFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(side); - final Object fromEntity = mExport ? aTileEntity : tTileEntity; - final Object toEntity = !mExport ? aTileEntity : tTileEntity; - final ForgeDirection fromSide = !mExport ? side.getOpposite() : side; - final ForgeDirection toSide = mExport ? side.getOpposite() : side; - - final List filter = Collections.singletonList(aCoverVariable.mFilter); - - moveMultipleItemStacks( - fromEntity, - toEntity, - fromSide, - toSide, - filter, - aCoverVariable.mWhitelist, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1, - 64); - - return aCoverVariable; - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - final ItemStack tStack = aPlayer.inventory.getCurrentItem(); - if (tStack != null) { - aCoverVariable.mFilter = tStack; - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("299", "Item Filter: ") + tStack.getDisplayName()); - } else { - aCoverVariable.mFilter = null; - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("300", "Filter Cleared!")); - } - return true; - } - - @Override - protected ItemFilterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - ItemFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable.mWhitelist = !aCoverVariable.mWhitelist; - GT_Utility.sendChatToPlayer( - aPlayer, - aCoverVariable.mWhitelist ? GT_Utility.trans("125.1", "Whitelist Mode") - : GT_Utility.trans("124.1", "Blacklist Mode")); - return aCoverVariable; - } - - @Override - protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - @Override - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, - ICoverable aTileEntity) { - return 1; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new ItemFilterUIFactory(buildContext).createWindow(); - } - - private class ItemFilterUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public ItemFilterUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - ItemStackHandler filterInvHandler = new ItemStackHandler(1); - if (getCoverData() != null) { - filterInvHandler.setStackInSlot(0, setStackSize1(getCoverData().mFilter)); - } - builder.widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_ItemFilter.this) - .addFollower( - new CoverDataFollower_ToggleButtonWidget<>(), - coverData -> coverData.mWhitelist, - (coverData, state) -> { - coverData.mWhitelist = state; - return coverData; - }, - widget -> widget - .setToggleTexture( - GT_UITextures.OVERLAY_BUTTON_BLACKLIST, - GT_UITextures.OVERLAY_BUTTON_WHITELIST) - .addTooltip(0, GT_Utility.trans("125.1", "Whitelist Mode")) - .addTooltip(1, GT_Utility.trans("124.1", "Blacklist Mode")) - .setPos(spaceX * 0, spaceY * 0)) - .addFollower( - new CoverDataFollower_SlotWidget<>(filterInvHandler, 0, true), - coverData -> setStackSize1(coverData.mFilter), - (coverData, stack) -> { - coverData.mFilter = setStackSize1(stack); - return coverData; - }, - widget -> widget.setBackground(GT_UITextures.SLOT_DARK_GRAY) - .setPos(spaceX * 0, spaceY * 2)) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("317", "Filter: ")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 0, 3 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("318", "Check Mode")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 2, 3 + startY + spaceY * 0)); - } - - private ItemStack setStackSize1(ItemStack stack) { - if (stack != null) { - stack.stackSize = 1; - } - return stack; - } - } - - public static class ItemFilterData implements ISerializableObject { - - private boolean mWhitelist; - private ItemStack mFilter; - - public ItemFilterData() {} - - public ItemFilterData(boolean mWhitelist, ItemStack mFilter) { - this.mWhitelist = mWhitelist; - this.mFilter = mFilter; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new ItemFilterData(mWhitelist, mFilter); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("mWhitelist", mWhitelist); - if (mFilter != null) tag.setTag("mFilter", mFilter.writeToNBT(new NBTTagCompound())); - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeBoolean(mWhitelist); - ByteBufUtils.writeItemStack(aBuf, mFilter); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; - mWhitelist = tag.getBoolean("mWhitelist"); - if (tag.hasKey("mFilter", Constants.NBT.TAG_COMPOUND)) - mFilter = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mFilter")); - else mFilter = null; - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - mWhitelist = aBuf.readBoolean(); - mFilter = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf); - return this; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java deleted file mode 100644 index 46be8daddd..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java +++ /dev/null @@ -1,384 +0,0 @@ -package gregtech.common.covers; - -import java.text.FieldPosition; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import gregtech.common.gui.modularui.widget.ItemWatcherSlotWidget; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_ItemMeter extends GT_CoverBehaviorBase { - - // Legacy data format - private static final int SLOT_MASK = 0x3FFFFFFF; // 0 = all, 1 = 0 ... - private static final int CONVERTED_BIT = 0x80000000; - private static final int INVERT_BIT = 0x40000000; - - public GT_Cover_ItemMeter(ITexture coverTexture) { - super(ItemMeterData.class, coverTexture); - } - - @Override - public ItemMeterData createDataObject(int aLegacyData) { - // Convert from ver. 5.09.33.50 - if ((CONVERTED_BIT & aLegacyData) == 0) if (aLegacyData == 0) aLegacyData = CONVERTED_BIT; - else if (aLegacyData == 1) aLegacyData = CONVERTED_BIT | INVERT_BIT; - else if (aLegacyData > 1) aLegacyData = CONVERTED_BIT | Math.min((aLegacyData - 2), SLOT_MASK); - - boolean invert = (aLegacyData & INVERT_BIT) == INVERT_BIT; - int slot = (aLegacyData & SLOT_MASK) - 1; - - return new ItemMeterData(invert, slot, 0); - } - - @Override - public ItemMeterData createDataObject() { - return new ItemMeterData(); - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return false; - } - - public static byte computeSignalBasedOnItems(ICoverable tileEntity, boolean inverted, int threshold, int slot, - int ordinalSide) { - long max = 0; - long used = 0; - final IMetaTileEntity mte = ((IGregTechTileEntity) tileEntity).getMetaTileEntity(); - if (mte instanceof GT_MetaTileEntity_DigitalChestBase dc) { - max = dc.getMaxItemCount(); - used = dc.getProgresstime(); - } else if (mte instanceof GT_MetaTileEntity_Hatch_OutputBus_ME) { - if (((GT_MetaTileEntity_Hatch_OutputBus_ME) mte).canAcceptItem()) { - max = 64; - used = 0; - } - } else { - final int[] slots = slot >= 0 ? new int[] { slot } : tileEntity.getAccessibleSlotsFromSide(ordinalSide); - - for (int i : slots) { - if (i >= 0 && i < tileEntity.getSizeInventory()) { - max += 64; - final ItemStack stack = tileEntity.getStackInSlot(i); - if (stack != null) used += ((long) stack.stackSize << 6) / stack.getMaxStackSize(); - } - } - } - - return GT_Utility.convertRatioToRedstone(used, max, threshold, inverted); - } - - @Override - protected ItemMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ItemMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - byte signal = computeSignalBasedOnItems( - aTileEntity, - aCoverVariable.inverted, - aCoverVariable.threshold, - aCoverVariable.slot, - side.ordinal()); - aTileEntity.setOutputRedstoneSignal(side, signal); - - return aCoverVariable; - } - - @Override - protected ItemMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, - ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aPlayer.isSneaking()) { - if (aCoverVariable.inverted) { - aCoverVariable.inverted = false; - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("055", "Normal")); - } else { - aCoverVariable.inverted = true; - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("054", "Inverted")); - } - } else { - aCoverVariable.slot++; - if (aCoverVariable.slot > aTileEntity.getSizeInventory()) aCoverVariable.slot = -1; - - if (aCoverVariable.slot == -1) GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("053", "Slot: ") + GT_Utility.trans("ALL", "All")); - else GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("053", "Slot: ") + aCoverVariable.slot); - } - - return aCoverVariable; - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - ItemMeterData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, - ICoverable aTileEntity) { - return 5; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new ItemMeterUIFactory(buildContext).createWindow(); - } - - private class ItemMeterUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - /** - * Display the text "All" instead of a number when the slot is set to -1. - */ - protected static final NumberFormatMUI numberFormatAll = new NumberFormatMUI() { - - @Override - public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { - if (number < 0) { - return toAppendTo.append(GT_Utility.trans("ALL", "All")); - } else { - return super.format(number, toAppendTo, pos); - } - } - }; - - private int maxSlot; - private int maxThreshold; - - public ItemMeterUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - final String INVERTED = GT_Utility.trans("INVERTED", "Inverted"); - final String NORMAL = GT_Utility.trans("NORMAL", "Normal"); - - setMaxSlot(); - setMaxThreshold(); - - builder.widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_ItemMeter.this) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofRedstone(), - coverData -> coverData.inverted, - (coverData, state) -> { - coverData.inverted = state; - return coverData; - }, - widget -> widget.addTooltip(0, NORMAL) - .addTooltip(1, INVERTED) - .setPos(0, 0)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.threshold, - (coverData, state) -> { - coverData.threshold = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(0, maxThreshold) - .setScrollValues(1, 64, 1000) - .setFocusOnGuiOpen(true) - .setPos(0, 2 + spaceY) - .setSize(spaceX * 4 + 5, 12)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.slot, - (coverData, state) -> { - coverData.slot = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(-1, maxSlot) - .setDefaultValue(-1) - .setScrollValues(1, 100, 10) - .setNumberFormat(numberFormatAll) - .setPos(0, 2 + spaceY * 2) - .setSize(spaceX * 3 + 1, 12)) - .setPos(startX, startY)) - .widget( - new ItemWatcherSlotWidget().setGetter(this::getTargetItem) - .setPos(startX + spaceX * 3 + 8, startY + spaceY * 2)) - .widget( - new TextWidget() - .setStringSupplier( - () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "") - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX, 4 + startY)) - .widget( - new TextWidget(GT_Utility.trans("254", "Detect slot #")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 4 + 9, 4 + startY + spaceY * 2)) - .widget( - new TextWidget(GT_Utility.trans("221", "Item threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 4 + 9, 4 + startY + spaceY)); - } - - private void setMaxSlot() { - final ICoverable tile = getUIBuildContext().getTile(); - if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile - && !(gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase)) { - maxSlot = Math.min(tile.getSizeInventory() - 1, SLOT_MASK - 1); - } else { - maxSlot = -1; - } - } - - private void setMaxThreshold() { - final ICoverable tile = getUIBuildContext().getTile(); - if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile - && gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase) { - maxThreshold = gtTile.getMaxItemCount(); - } else { - maxThreshold = maxSlot > 0 ? maxSlot * 64 : Integer.MAX_VALUE; - } - } - - private ItemStack getTargetItem() { - ItemMeterData coverVariable = getCoverData(); - if (coverVariable == null || coverVariable.slot < 0) { - return null; - } - ICoverable tile = getUIBuildContext().getTile(); - if (tile instanceof TileEntity && !tile.isDead()) { - if (tile.getSizeInventory() >= coverVariable.slot) { - return tile.getStackInSlot(coverVariable.slot); - } - } - return null; - } - } - - public static class ItemMeterData implements ISerializableObject { - - private boolean inverted; - /** The special value {@code -1} means all slots. */ - private int slot; - /** The special value {@code 0} means threshold check is disabled. */ - private int threshold; - - public ItemMeterData() { - inverted = false; - slot = -1; - threshold = 0; - } - - public ItemMeterData(boolean inverted, int slot, int threshold) { - this.inverted = inverted; - this.slot = slot; - this.threshold = threshold; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new ItemMeterData(inverted, slot, threshold); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("invert", inverted); - tag.setInteger("slot", slot); - tag.setInteger("threshold", threshold); - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeBoolean(inverted); - aBuf.writeInt(slot); - aBuf.writeInt(threshold); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; - inverted = tag.getBoolean("invert"); - slot = tag.getInteger("slot"); - threshold = tag.getInteger("threshold"); - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - inverted = aBuf.readBoolean(); - slot = aBuf.readInt(); - threshold = aBuf.readInt(); - return this; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Lens.java b/src/main/java/gregtech/common/covers/GT_Cover_Lens.java deleted file mode 100644 index 94794e5892..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Lens.java +++ /dev/null @@ -1,28 +0,0 @@ -package gregtech.common.covers; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; - -public class GT_Cover_Lens extends GT_CoverBehavior { - - private final byte mColor; - - public GT_Cover_Lens(byte aColor, ITexture coverTexture) { - super(coverTexture); - this.mColor = aColor; - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public byte getLensColor(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return this.mColor; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java deleted file mode 100644 index f7c8bb8cd3..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java +++ /dev/null @@ -1,292 +0,0 @@ -package gregtech.common.covers; - -import java.util.Arrays; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidHandler; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase; -import io.netty.buffer.ByteBuf; - -/** - * TODO: Implement overlay rendering only with - * {@link GT_CoverBehaviorBase#getSpecialCoverFGTextureImpl(ForgeDirection, int, ISerializableObject, ICoverable)} - */ -public class GT_Cover_LiquidMeter extends GT_CoverBehaviorBase { - - public GT_Cover_LiquidMeter(ITexture coverTexture) { - super(LiquidMeterData.class, coverTexture); - } - - @Override - public LiquidMeterData createDataObject(int aLegacyData) { - return new LiquidMeterData(aLegacyData == 0, 0); - } - - @Override - public LiquidMeterData createDataObject() { - return new LiquidMeterData(); - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return false; - } - - public static byte computeSignalBasedOnFluid(ICoverable tileEntity, boolean inverted, int threshold) { - if (tileEntity instanceof IFluidHandler) { - FluidTankInfo[] tanks = ((IFluidHandler) tileEntity).getTankInfo(ForgeDirection.UNKNOWN); - long max = 0; - long used = 0; - if (tanks != null) { - for (FluidTankInfo tank : tanks) { - if (tank != null) { - if (tileEntity instanceof BaseMetaTileEntity && ((BaseMetaTileEntity) tileEntity) - .getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalTankBase) { - max += ((GT_MetaTileEntity_DigitalTankBase) ((BaseMetaTileEntity) tileEntity) - .getMetaTileEntity()).getRealCapacity(); - } else max += tank.capacity; - FluidStack tLiquid = tank.fluid; - if (tLiquid != null) { - used += tLiquid.amount; - } - } - } - } - - return GT_Utility.convertRatioToRedstone(used, max, threshold, inverted); - } else { - return 0; - } - } - - @Override - protected LiquidMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - LiquidMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - byte signal = computeSignalBasedOnFluid(aTileEntity, aCoverVariable.inverted, aCoverVariable.threshold); - aTileEntity.setOutputRedstoneSignal(side, signal); - - return aCoverVariable; - } - - @Override - protected LiquidMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, - LiquidMeterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aCoverVariable.inverted) { - aCoverVariable.inverted = false; - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("055", "Normal")); - } else { - aCoverVariable.inverted = true; - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("054", "Inverted")); - } - return aCoverVariable; - } - - @Override - protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - LiquidMeterData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, - ICoverable aTileEntity) { - return 5; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new LiquidMeterUIFactory(buildContext).createWindow(); - } - - private class LiquidMeterUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - private int maxCapacity; - - public LiquidMeterUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - final String INVERTED = GT_Utility.trans("INVERTED", "Inverted"); - final String NORMAL = GT_Utility.trans("NORMAL", "Normal"); - - setMaxCapacity(); - - builder.widget( - new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_LiquidMeter.this) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofRedstone(), - coverData -> coverData.inverted, - (coverData, state) -> { - coverData.inverted = state; - return coverData; - }, - widget -> widget.addTooltip(0, NORMAL) - .addTooltip(1, INVERTED) - .setPos(spaceX * 0, spaceY * 0)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.threshold, - (coverData, state) -> { - coverData.threshold = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(0, maxCapacity > 0 ? maxCapacity : Integer.MAX_VALUE) - .setScrollValues(1000, 144, 100000) - .setFocusOnGuiOpen(true) - .setPos(spaceX * 0, spaceY * 1 + 2) - .setSize(spaceX * 4 + 5, 12)) - .setPos(startX, startY)) - .widget( - new TextWidget() - .setStringSupplier( - () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "") - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("222", "Fluid threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5 - 10, startY + spaceY * 1 + 4)); - } - - private void setMaxCapacity() { - final ICoverable tile = getUIBuildContext().getTile(); - if (!tile.isDead() && tile instanceof IFluidHandler) { - FluidTankInfo[] tanks = ((IFluidHandler) tile).getTankInfo(ForgeDirection.UNKNOWN); - maxCapacity = Arrays.stream(tanks) - .mapToInt(tank -> tank.capacity) - .sum(); - } else { - maxCapacity = -1; - } - } - } - - public static class LiquidMeterData implements ISerializableObject { - - private boolean inverted; - /** - * The special value {@code 0} means threshold check is disabled. - */ - private int threshold; - - public LiquidMeterData() { - inverted = false; - threshold = 0; - } - - public LiquidMeterData(boolean inverted, int threshold) { - this.inverted = inverted; - this.threshold = threshold; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new LiquidMeterData(inverted, threshold); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("invert", inverted); - tag.setInteger("threshold", threshold); - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeBoolean(inverted); - aBuf.writeInt(threshold); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; - inverted = tag.getBoolean("invert"); - threshold = tag.getInteger("threshold"); - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - inverted = aBuf.readBoolean(); - threshold = aBuf.readInt(); - return this; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java b/src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java deleted file mode 100644 index 6d3cf529d3..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java +++ /dev/null @@ -1,212 +0,0 @@ -package gregtech.common.covers; - -import java.util.List; -import java.util.UUID; - -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.ImmutableList; -import com.google.common.io.ByteArrayDataInput; - -import gregtech.api.enums.ItemList; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetricsExporter; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.ISerializableObject; -import gregtech.common.events.MetricsCoverDataEvent; -import gregtech.common.events.MetricsCoverSelfDestructEvent; -import gregtech.common.misc.GlobalMetricsCoverDatabase; -import gregtech.common.misc.GlobalMetricsCoverDatabase.State; -import io.netty.buffer.ByteBuf; - -/** - * Used to transmit Nuclear Control information across dimensions. The only reason this is a cover is to artificially - * limit the number of total machines that transmit this data, for performance reasons. - *

- * This cover will retrieve information, preferentially, using {@link IMetricsExporter#reportMetrics()}. Absent this - * method, it will resort to {@link BaseMetaTileEntity#getInfoData()} instead. - */ -public class GT_Cover_Metrics_Transmitter - extends GT_CoverBehaviorBase { - - @SuppressWarnings("SpellCheckingInspection") - public static final String FREQUENCY_MSB_KEY = "gt.metricscover.freq_msb"; - @SuppressWarnings("SpellCheckingInspection") - public static final String FREQUENCY_LSB_KEY = "gt.metricscover.freq_lsb"; - public static final String MACHINE_KEY = "machine_name"; - public static final String CARD_STATE_KEY = "card_state"; - - @SuppressWarnings("unused") - public GT_Cover_Metrics_Transmitter() { - this(null); - } - - public GT_Cover_Metrics_Transmitter(ITexture coverTexture) { - super(MetricsTransmitterData.class, coverTexture); - } - - @Override - public MetricsTransmitterData createDataObject(int aLegacyData) { - // As a new cover, this shouldn't fire. - return new MetricsTransmitterData(); - } - - @Override - public MetricsTransmitterData createDataObject() { - return new MetricsTransmitterData(); - } - - @Override - protected int getTickRateImpl(ForgeDirection side, int aCoverID, MetricsTransmitterData aCoverVariable, - ICoverable aTileEntity) { - return 20; - } - - @Override - public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { - return aTileEntity instanceof final IGregTechDeviceInformation device && device.isGivingInformation(); - } - - @Override - protected MetricsTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - MetricsTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - if (aTileEntity instanceof final BaseMetaTileEntity baseMTE && baseMTE.isGivingInformation()) { - final List payload; - - if (baseMTE.getMetaTileEntity() instanceof final IMetricsExporter metricsExporter) { - payload = metricsExporter.reportMetrics(); - } else { - payload = ImmutableList.copyOf(baseMTE.getInfoData()); - } - - MinecraftForge.EVENT_BUS.post(new MetricsCoverDataEvent( - aCoverVariable.frequency, - payload, - new GlobalMetricsCoverDatabase.Coordinates( - baseMTE.getWorld().provider.getDimensionName(), - baseMTE.getXCoord(), - baseMTE.getYCoord(), - baseMTE.getZCoord() - ) - )); - } - - return aCoverVariable; - } - - @Override - protected void onDroppedImpl(ForgeDirection side, int aCoverID, MetricsTransmitterData aCoverVariable, - ICoverable aTileEntity) { - MinecraftForge.EVENT_BUS.post(new MetricsCoverSelfDestructEvent(aCoverVariable.frequency)); - } - - @Override - public void onPlayerAttach(EntityPlayer player, ItemStack aCover, ICoverable aTileEntity, ForgeDirection side) { - final UUID newFrequency = UUID.randomUUID(); - final ItemStack cardStack = ItemList.NC_AdvancedSensorCard.get(1); - - if (cardStack == null) { - return; - } - - final NBTTagCompound tagCompound = new NBTTagCompound(); - tagCompound.setLong(FREQUENCY_MSB_KEY, newFrequency.getMostSignificantBits()); - tagCompound.setLong(FREQUENCY_LSB_KEY, newFrequency.getLeastSignificantBits()); - tagCompound.setInteger(CARD_STATE_KEY, State.OPERATIONAL.getType()); - - if (aTileEntity instanceof final BaseMetaTileEntity baseMTE) { - final ItemStack baseMTEStack = baseMTE.getStackForm(1); - if (baseMTEStack != null) { - tagCompound.setTag(MACHINE_KEY, baseMTEStack.writeToNBT(new NBTTagCompound())); - } - } - - cardStack.setTagCompound(tagCompound); - aTileEntity.getCoverInfoAtSide(side) - .setCoverData(new MetricsTransmitterData(newFrequency)); - - final EntityItem cardEntity = new EntityItem(player.worldObj, player.posX, player.posY, player.posZ, cardStack); - cardEntity.delayBeforeCanPickup = 0; - player.worldObj.spawnEntityInWorld(cardEntity); - } - - @Override - public boolean allowsCopyPasteTool() { - return false; - } - - @Override - public List getAdditionalTooltipImpl(MetricsTransmitterData data) { - return ImmutableList.of( - StatCollector.translateToLocalFormatted( - "gt.item.adv_sensor_card.tooltip.frequency", - EnumChatFormatting.UNDERLINE.toString() + EnumChatFormatting.YELLOW + data.frequency.toString())); - } - - public static class MetricsTransmitterData implements ISerializableObject { - - private UUID frequency; - - public MetricsTransmitterData() { - this.frequency = UUID.randomUUID(); - } - - public MetricsTransmitterData(@NotNull UUID frequency) { - this.frequency = frequency; - } - - @NotNull - public UUID getFrequency() { - return frequency; - } - - @NotNull - @Override - public ISerializableObject copy() { - return new MetricsTransmitterData(frequency); - } - - @NotNull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setLong(FREQUENCY_MSB_KEY, frequency.getMostSignificantBits()); - tag.setLong(FREQUENCY_LSB_KEY, frequency.getLeastSignificantBits()); - return tag; - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - if (aNBT instanceof final NBTTagCompound tag) { - frequency = new UUID(tag.getLong(FREQUENCY_MSB_KEY), tag.getLong(FREQUENCY_LSB_KEY)); - } - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeLong(frequency.getMostSignificantBits()); - aBuf.writeLong(frequency.getLeastSignificantBits()); - } - - @NotNull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) { - return new MetricsTransmitterData(new UUID(aBuf.readLong(), aBuf.readLong())); - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java b/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java deleted file mode 100644 index cf51f9bdea..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java +++ /dev/null @@ -1,298 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_NeedMaintainance extends GT_CoverBehavior { - - public GT_Cover_NeedMaintainance(ITexture coverTexture) { - super(coverTexture); - } - - public static boolean isRotor(ItemStack rotor) { - return (rotor != null && rotor.getItem() instanceof GT_MetaGenerated_Tool - && rotor.getItemDamage() >= 170 - && rotor.getItemDamage() <= 176); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - boolean needsRepair = false; - if (aTileEntity instanceof IGregTechTileEntity tTileEntity) { - final IMetaTileEntity mTileEntity = tTileEntity.getMetaTileEntity(); - if (mTileEntity instanceof GT_MetaTileEntity_MultiBlockBase multi) { - final int ideal = multi.getIdealStatus(); - final int real = multi.getRepairStatus(); - final ItemStack tRotor = multi.getRealInventory()[1]; - final int coverVar = aCoverVariable >>> 1; - if (coverVar < 5) { - if (ideal - real > coverVar) needsRepair = true; - } else if (coverVar == 5 || coverVar == 6) { - if (isRotor(tRotor)) { - long tMax = GT_MetaGenerated_Tool.getToolMaxDamage(tRotor); - long tCur = GT_MetaGenerated_Tool.getToolDamage(tRotor); - if (coverVar == 5) { - needsRepair = (tCur >= tMax * 8 / 10); - } else { - long mExpectedDamage = Math.round( - Math.min( - multi.mEUt / multi.damageFactorLow, - Math.pow(multi.mEUt, multi.damageFactorHigh))); - needsRepair = tCur + mExpectedDamage * 2 >= tMax; - } - } else { - needsRepair = true; - } - } - } - } - if (aCoverVariable % 2 == 0) { - needsRepair = !needsRepair; - } - - aTileEntity.setOutputRedstoneSignal(side, (byte) (needsRepair ? 0 : 15)); - aTileEntity.setOutputRedstoneSignal(side.getOpposite(), (byte) (needsRepair ? 0 : 15)); - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 14; - if (aCoverVariable < 0) { - aCoverVariable = 13; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("056", "Emit if 1 Maintenance Needed")); - case 1 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("057", "Emit if 1 Maintenance Needed(inverted)")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("058", "Emit if 2 Maintenance Needed")); - case 3 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("059", "Emit if 2 Maintenance Needed(inverted)")); - case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("060", "Emit if 3 Maintenance Needed")); - case 5 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("061", "Emit if 3 Maintenance Needed(inverted)")); - case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("062", "Emit if 4 Maintenance Needed")); - case 7 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("063", "Emit if 4 Maintenance Needed(inverted)")); - case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("064", "Emit if 5 Maintenance Needed")); - case 9 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("065", "Emit if 5 Maintenance Needed(inverted)")); - case 10 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("066", "Emit if rotor needs maintenance low accuracy mod")); - case 11 -> GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("067", "Emit if rotor needs maintenance low accuracy mod(inverted)")); - case 12 -> GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("068", "Emit if rotor needs maintenance high accuracy mod")); - case 13 -> GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("069", "Emit if rotor needs maintenance high accuracy mod(inverted)")); - } - return aCoverVariable; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 60; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new NeedMaintainanceUIFactory(buildContext).createWindow(); - } - - private class NeedMaintainanceUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public NeedMaintainanceUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - final String[] tooltipText = { GT_Utility.trans("056", "Emit if 1 Maintenance Needed"), - GT_Utility.trans("058", "Emit if 2 Maintenance Needed"), - GT_Utility.trans("060", "Emit if 3 Maintenance Needed"), - GT_Utility.trans("062", "Emit if 4 Maintenance Needed"), - GT_Utility.trans("064", "Emit if 5 Maintenance Needed"), - GT_Utility.trans("066", "Emit if rotor needs maintenance low accuracy mod"), - GT_Utility.trans("068", "Emit if rotor needs maintenance high accuracy mod"), }; - - final String[] buttonText = { GT_Utility.trans("247", "1 Issue"), GT_Utility.trans("248", "2 Issues"), - GT_Utility.trans("249", "3 Issues"), GT_Utility.trans("250", "4 Issues"), - GT_Utility.trans("251", "5 Issues"), GT_Utility.trans("252", "Rotor < 20%"), - GT_Utility.trans("253", "Rotor ≈ 0%"), GT_Utility.trans("INVERTED", "Inverted"), - GT_Utility.trans("NORMAL", "Normal"), }; - - builder - .widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_NeedMaintainance.this, - (index, coverData) -> isEnabled(index, convert(coverData)), - (index, coverData) -> new ISerializableObject.LegacyCoverData( - getNewCoverVariable(index, convert(coverData)))) - .addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(tooltipText[0]) - .setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(tooltipText[1]) - .setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(tooltipText[2]) - .setPos(spaceX * 0, spaceY * 2)) - .addToggleButton( - 3, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(tooltipText[3]) - .setPos(spaceX * 0, spaceY * 3)) - .addToggleButton( - 4, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(tooltipText[4]) - .setPos(spaceX * 4 + 4, spaceY * 0)) - .addToggleButton( - 5, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(tooltipText[5]) - .setPos(spaceX * 4 + 4, spaceY * 1)) - .addToggleButton( - 6, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(tooltipText[6]) - .setPos(spaceX * 4 + 4, spaceY * 2)) - .addToggleButton( - 7, - CoverDataFollower_ToggleButtonWidget.ofRedstone(), - widget -> widget.setPos(spaceX * 4 + 4, spaceY * 3)) - .setPos(startX, startY)) - .widget( - new TextWidget(buttonText[0]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(buttonText[1]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(buttonText[2]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 2)) - .widget( - new TextWidget(buttonText[3]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 3)) - .widget( - new TextWidget(buttonText[4]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(buttonText[5]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(buttonText[6]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 2)) - .widget( - TextWidget - .dynamicString(() -> isEnabled(7, convert(getCoverData())) ? buttonText[7] : buttonText[8]) - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 3)); - } - - private int getNewCoverVariable(int id, int coverVariable) { - final boolean checked = (coverVariable & 0x1) > 0; - if (id == 7) { - if (checked) return coverVariable & ~0x1; - else return coverVariable | 0x1; - } - return (coverVariable & 0x1) | (id << 1); - } - - private boolean isEnabled(int id, int coverVariable) { - if (id == 7) return (coverVariable & 0x1) > 0; - return (coverVariable >>> 1) == id; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java b/src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java deleted file mode 100644 index 600e167f2d..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java +++ /dev/null @@ -1,202 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_PlayerDetector extends GT_CoverBehavior { - - private String placer = ""; - private int range = 8; - - public GT_Cover_PlayerDetector(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - boolean playerDetected = false; - - if (aTileEntity instanceof IGregTechTileEntity) { - if (aTileEntity.isUniversalEnergyStored(20)) { - aTileEntity.decreaseStoredEnergyUnits(20, true); - range = 32; - } else { - range = 8; - } - placer = ((IGregTechTileEntity) aTileEntity).getOwnerName(); - } - for (Object tObject : aTileEntity.getWorld().playerEntities) { - if ((tObject instanceof EntityPlayerMP tEntity)) { - int dist = Math.max( - 1, - (int) tEntity.getDistance( - aTileEntity.getXCoord() + 0.5D, - aTileEntity.getYCoord() + 0.5D, - aTileEntity.getZCoord() + 0.5D)); - if (dist < range) { - if (aCoverVariable == 0) { - playerDetected = true; - break; - } - if (tEntity.getDisplayName() - .equalsIgnoreCase(placer)) { - if (aCoverVariable == 1) { - playerDetected = true; - break; - } - } else if (aCoverVariable == 2) { - playerDetected = true; - break; - } - } - } - } - - aTileEntity.setOutputRedstoneSignal(side, (byte) (playerDetected ? 15 : 0)); - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 3; - if (aCoverVariable < 0) { - aCoverVariable = 2; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("068.1", "Emit if any Player is close")); - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("069.1", "Emit if other Player is close")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("070", "Emit if you are close")); - } - return aCoverVariable; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 20; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new PlayerDetectorUIFactory(buildContext).createWindow(); - } - - private class PlayerDetectorUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public PlayerDetectorUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder - .widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_PlayerDetector.this, - (index, coverData) -> index == convert(coverData), - (index, coverData) -> new ISerializableObject.LegacyCoverData(index)) - .addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(GT_Utility.trans("068.1", "Emit if any Player is close")) - .setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(GT_Utility.trans("069.1", "Emit if other Player is close")) - .setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.addTooltip(GT_Utility.trans("070", "Emit if you are close")) - .setPos(spaceX * 0, spaceY * 2)) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("319", "Any player")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("320", "Other players")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("321", "Only owner")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, 4 + startY + spaceY * 2)); - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Pump.java b/src/main/java/gregtech/common/covers/GT_Cover_Pump.java deleted file mode 100644 index c4671f586e..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Pump.java +++ /dev/null @@ -1,334 +0,0 @@ -package gregtech.common.covers; - -import java.util.Arrays; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_Pump extends GT_CoverBehavior { - - public final int mTransferRate; - - public GT_Cover_Pump(int aTransferRate, ITexture coverTexture) { - super(coverTexture); - this.mTransferRate = aTransferRate; - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if ((aCoverVariable % 6 > 1) && ((aTileEntity instanceof IMachineProgress))) { - if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { - return aCoverVariable; - } - } - - if (aTileEntity instanceof IFluidHandler current) { - final IFluidHandler toAccess = aTileEntity.getITankContainerAtSide(side); - if (toAccess == null) return aCoverVariable; - - transferFluid(current, toAccess, side, aCoverVariable % 2 == 0); - } - return aCoverVariable; - } - - protected void transferFluid(IFluidHandler current, IFluidHandler toAccess, ForgeDirection side, boolean export) { - IFluidHandler source = export ? current : toAccess; - IFluidHandler dest = export ? toAccess : current; - ForgeDirection drainSide = export ? side : side.getOpposite(); - GT_Utility.moveFluid(source, dest, drainSide, mTransferRate, this::canTransferFluid); - } - - protected boolean canTransferFluid(FluidStack fluid) { - return true; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 12; - if (aCoverVariable < 0) { - aCoverVariable = 11; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("006", "Export")); - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("007", "Import")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("008", "Export (conditional)")); - case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("009", "Import (conditional)")); - case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("010", "Export (invert cond)")); - case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("011", "Import (invert cond)")); - case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("012", "Export allow Input")); - case 7 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("013", "Import allow Output")); - case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("014", "Export allow Input (conditional)")); - case 9 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("015", "Import allow Output (conditional)")); - case 10 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("016", "Export allow Input (invert cond)")); - case 11 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("017", "Import allow Output (invert cond)")); - } - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - if ((aCoverVariable > 1) && ((aTileEntity instanceof IMachineProgress))) { - if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { - return false; - } - } - return (aCoverVariable >= 6) || (aCoverVariable % 2 != 0); - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - if ((aCoverVariable > 1) && ((aTileEntity instanceof IMachineProgress))) { - if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) { - return false; - } - } - return (aCoverVariable >= 6) || (aCoverVariable % 2 == 0); - } - - @Override - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new PumpUIFactory(buildContext).createWindow(); - } - - private class PumpUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - private CoverDataFollower_ToggleButtonWidget mBlockWidget = null; - private CoverDataFollower_ToggleButtonWidget mAllowWidget = null; - - public PumpUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder.widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_Pump.this, - (id, coverData) -> !getClickable(id, convert(coverData)), - (id, coverData) -> new ISerializableObject.LegacyCoverData( - getNewCoverVariable(id, convert(coverData)))) - .addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) - .addTooltip(GT_Utility.trans("006", "Export")) - .setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) - .addTooltip(GT_Utility.trans("007", "Import")) - .setPos(spaceX * 1, spaceY * 0)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK) - .addTooltip(GT_Utility.trans("224", "Always On")) - .setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 3, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE) - .addTooltip(GT_Utility.trans("343", "Use Machine Processing State")) - .setPos(spaceX * 1, spaceY * 1)) - .addToggleButton( - 4, - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - widget -> widget - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE) - .addTooltip(GT_Utility.trans("343.1", "Use Inverted Machine Processing State")) - .setPos(spaceX * 2, spaceY * 1)) - .addToggleButton(5, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> { - mAllowWidget = widget; - widget.setTextureGetter(i -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return coverData == null || coverData.get() % 2 == 0 - ? GT_UITextures.OVERLAY_BUTTON_ALLOW_INPUT - : GT_UITextures.OVERLAY_BUTTON_ALLOW_OUTPUT; - }) - .dynamicTooltip(() -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return Arrays.asList( - coverData == null || coverData.get() % 2 == 0 - ? GT_Utility.trans("314", "Allow Input") - : GT_Utility.trans("312", "Allow Output")); - }) - .setPos(spaceX * 0, spaceY * 2); - }) - .addToggleButton(6, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> { - mBlockWidget = widget; - widget.setTextureGetter(i -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return coverData == null || coverData.get() % 2 == 0 - ? GT_UITextures.OVERLAY_BUTTON_BLOCK_INPUT - : GT_UITextures.OVERLAY_BUTTON_BLOCK_OUTPUT; - }) - .dynamicTooltip(() -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return Arrays.asList( - coverData == null || coverData.get() % 2 == 0 - ? GT_Utility.trans("313", "Block Input") - : GT_Utility.trans("311", "Block Output")); - }) - .setPos(spaceX * 1, spaceY * 2); - }) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 1)) - .widget(TextWidget.dynamicString(() -> { - ISerializableObject.LegacyCoverData coverData = getCoverData(); - return coverData == null || coverData.get() % 2 == 0 ? GT_Utility.trans("344", "Input Blocking") - : GT_Utility.trans("344.1", "Output Blocking"); - }) - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 2)); - } - - private int getNewCoverVariable(int id, int coverVariable) { - switch (id) { - case 0 -> { - if (mBlockWidget != null) { - mBlockWidget.notifyTooltipChange(); - } - if (mAllowWidget != null) { - mAllowWidget.notifyTooltipChange(); - } - return coverVariable & ~0x1; - } - case 1 -> { - if (mBlockWidget != null) { - mBlockWidget.notifyTooltipChange(); - } - if (mAllowWidget != null) { - mAllowWidget.notifyTooltipChange(); - } - return coverVariable | 0x1; - } - case 2 -> { - if (coverVariable > 5) return 0x6 | (coverVariable & ~0xE); - return (coverVariable & ~0xE); - } - case 3 -> { - if (coverVariable > 5) return 0x8 | (coverVariable & ~0xE); - return 0x2 | (coverVariable & ~0xE); - } - case 4 -> { - if (coverVariable > 5) return 0xA | (coverVariable & ~0xE); - return (0x4 | (coverVariable & ~0xE)); - } - case 5 -> { - if (coverVariable <= 5) return coverVariable + 6; - } - case 6 -> { - if (coverVariable > 5) return coverVariable - 6; - } - } - return coverVariable; - } - - private boolean getClickable(int id, int coverVariable) { - if (coverVariable < 0 | 11 < coverVariable) return false; - return switch (id) { - case 0, 1 -> (0x1 & coverVariable) != id; - case 2 -> (coverVariable % 6) >= 2; - case 3 -> (coverVariable % 6) < 2 | 4 <= (coverVariable % 6); - case 4 -> (coverVariable % 6) < 4; - case 5 -> coverVariable < 6; - case 6 -> coverVariable >= 6; - default -> false; - }; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java deleted file mode 100644 index edaec13a81..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java +++ /dev/null @@ -1,101 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; - -@SuppressWarnings("unused") // Legacy from GT4. TODO: Consider re-enable registration -public class GT_Cover_RedstoneConductor extends GT_CoverBehavior { - - GT_Cover_RedstoneConductor(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if (aCoverVariable == 0) { - aTileEntity.setOutputRedstoneSignal(side, aTileEntity.getStrongestRedstone()); - } else if (aCoverVariable < 7) { - aTileEntity.setOutputRedstoneSignal( - side, - aTileEntity.getInternalInputRedstoneSignal(ForgeDirection.getOrientation((aCoverVariable - 1)))); - } - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 7; - if (aCoverVariable < 0) { - aCoverVariable = 6; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("071", "Conducts strongest Input")); - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("072", "Conducts from bottom Input")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("073", "Conducts from top Input")); - case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("074", "Conducts from north Input")); - case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("075", "Conducts from south Input")); - case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("076", "Conducts from west Input")); - case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("077", "Conducts from east Input")); - } - return aCoverVariable; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java deleted file mode 100644 index eabf90f4de..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java +++ /dev/null @@ -1,41 +0,0 @@ -package gregtech.common.covers; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; - -public class GT_Cover_RedstoneReceiverExternal extends GT_Cover_RedstoneWirelessBase { - - public GT_Cover_RedstoneReceiverExternal(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - aTileEntity.setOutputRedstoneSignal( - side, - GregTech_API.sWirelessRedstone.get(aCoverVariable) == null ? 0 - : GregTech_API.sWirelessRedstone.get(aCoverVariable)); - return aCoverVariable; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java deleted file mode 100644 index 3edd7f7e43..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java +++ /dev/null @@ -1,46 +0,0 @@ -package gregtech.common.covers; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.ISerializableObject; - -public class GT_Cover_RedstoneReceiverInternal extends GT_Cover_RedstoneWirelessBase { - - public GT_Cover_RedstoneReceiverInternal(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if (aTileEntity instanceof IMachineProgress) { - if (getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity) > 0) - ((IMachineProgress) aTileEntity).enableWorking(); - else((IMachineProgress) aTileEntity).disableWorking(); - ((IMachineProgress) aTileEntity).setWorkDataValue(aInputRedstone); - } - return aCoverVariable; - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - return true; - } - - @Override - public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return GregTech_API.sWirelessRedstone.get(aCoverVariable) == null ? 0 - : GregTech_API.sWirelessRedstone.get(aCoverVariable); - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java deleted file mode 100644 index 4eead134c8..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java +++ /dev/null @@ -1,99 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; - -@SuppressWarnings("unused") // TODO: Consider re-registering this -public class GT_Cover_RedstoneSignalizer extends GT_CoverBehavior { - - GT_Cover_RedstoneSignalizer(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + 1) % 48; - switch (aCoverVariable / 16) { - case 0 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("078", "Signal = ") + (aCoverVariable & 0xF)); - case 1 -> GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("079", "Conditional Signal = ") + (aCoverVariable & 0xF)); - case 2 -> GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("080", "Inverted Conditional Signal = ") + (aCoverVariable & 0xF)); - } - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - if (aCoverVariable < 16) { - return (byte) (aCoverVariable & 0xF); - } - if ((aTileEntity instanceof IMachineProgress)) { - if (((IMachineProgress) aTileEntity).isAllowedToWork()) { - if (aCoverVariable / 16 == 1) { - return (byte) (aCoverVariable & 0xF); - } - } else if (aCoverVariable / 16 == 2) { - return (byte) (aCoverVariable & 0xF); - } - return 0; - } - return (byte) (aCoverVariable & 0xF); - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java deleted file mode 100644 index 1ee0a05837..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.covers.IControlsWorkCover; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.ISerializableObject; - -public class GT_Cover_RedstoneTransmitterExternal extends GT_Cover_RedstoneWirelessBase { - - public GT_Cover_RedstoneTransmitterExternal(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - // TODO remove next line after 2.3.0 - if (!IControlsWorkCover.makeSureOnlyOne(side, aTileEntity)) return aCoverVariable; - GregTech_API.sWirelessRedstone.put(aCoverVariable, aInputRedstone); - return aCoverVariable; - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - return true; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } - - @Override - public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { - if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false; - for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { - if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { - return false; - } - } - return true; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java deleted file mode 100644 index a812a49990..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java +++ /dev/null @@ -1,43 +0,0 @@ -package gregtech.common.covers; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; - -public class GT_Cover_RedstoneTransmitterInternal extends GT_Cover_RedstoneWirelessBase { - - public GT_Cover_RedstoneTransmitterInternal(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - GregTech_API.sWirelessRedstone.put(aCoverVariable, aTileEntity.getOutputRedstoneSignal(side)); - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return true; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java deleted file mode 100644 index 54d025898a..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java +++ /dev/null @@ -1,228 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public abstract class GT_Cover_RedstoneWirelessBase extends GT_CoverBehavior { - - private static final int MAX_CHANNEL = 65535; - private static final int PRIVATE_MASK = 0xFFFE0000; - private static final int PUBLIC_MASK = 0x0000FFFF; - private static final int CHECKBOX_MASK = 0x00010000; - - public GT_Cover_RedstoneWirelessBase(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - boolean aForced) { - GregTech_API.sWirelessRedstone.put(aCoverVariable, (byte) 0); - return true; - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D)))) { - GregTech_API.sWirelessRedstone.put(aCoverVariable.get(), (byte) 0); - aCoverVariable.set( - (aCoverVariable.get() & (PRIVATE_MASK | CHECKBOX_MASK)) - | (((Integer) GT_Utility.stackToInt(aPlayer.inventory.getCurrentItem())).hashCode() & PUBLIC_MASK)); - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("081", "Frequency: ") + aCoverVariable); - return true; - } - return false; - } - - @Override - @SuppressWarnings("deprecation") - public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D)))) { - GregTech_API.sWirelessRedstone.put(aCoverVariable, (byte) 0); - - int val = GT_Utility.stackToInt(aPlayer.inventory.getCurrentItem()) - * (1 + aPlayer.inventory.getCurrentItem() - .getItemDamage()); - - aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | (val & PUBLIC_MASK); - - aTileEntity.setCoverDataAtSide(side, aCoverVariable); - GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("081", "Frequency: ") + (aCoverVariable & PUBLIC_MASK)); - return true; - } - return false; - } - - @Override - protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (((aX > 0.375D) && (aX < 0.625D)) - || ((side.offsetX == 0) || (((aY > 0.375D) && (aY < 0.625D)) || ((((aZ <= 0.375D) || (aZ >= 0.625D))))))) { - GregTech_API.sWirelessRedstone.put(aCoverVariable, (byte) 0); - final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ); - - final short tAdjustVal = switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) - + 2 * (byte) (int) (tCoords[1] * 2.0F))) { - case 0 -> -32; - case 1 -> 32; - case 2 -> -1024; - case 3 -> 1024; - default -> 0; - }; - - final int tPublicChannel = (aCoverVariable & PUBLIC_MASK) + tAdjustVal; - - if (tPublicChannel < 0) { - aCoverVariable = aCoverVariable & ~PUBLIC_MASK; - } else if (tPublicChannel > MAX_CHANNEL) { - aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | MAX_CHANNEL; - } else { - aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | tPublicChannel; - } - } - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("081", "Frequency: ") + (aCoverVariable & PUBLIC_MASK)); - return aCoverVariable; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return GT_Utility.trans("081", "Frequency: ") + aCoverVariable; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new RedstoneWirelessBaseUIFactory(buildContext).createWindow(); - } - - private class RedstoneWirelessBaseUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public RedstoneWirelessBaseUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getGUIWidth() { - return 250; - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder - .widget( - new CoverDataControllerWidget<>( - this::getCoverData, - this::setCoverData, - GT_Cover_RedstoneWirelessBase.this) - - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) getFlagFrequency(convert(coverData)), - (coverData, state) -> new ISerializableObject.LegacyCoverData( - state.intValue() | getFlagCheckbox(convert(coverData))), - widget -> widget.setBounds(0, MAX_CHANNEL) - .setScrollValues(1, 1000, 10) - .setFocusOnGuiOpen(true) - .setPos(spaceX * 0, spaceY * 0 + 2) - .setSize(spaceX * 4 - 3, 12)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofCheck(), - coverData -> getFlagCheckbox(convert(coverData)) > 0, - (coverData, state) -> new ISerializableObject.LegacyCoverData( - getFlagFrequency(convert(coverData)) | (state ? CHECKBOX_MASK : 0)), - widget -> widget.setPos(spaceX * 0, spaceY * 2)) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("246", "Frequency")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 4, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("602", "Use Private Frequency")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 1, startY + spaceY * 2 + 4)); - } - - private int getFlagFrequency(int coverVariable) { - return coverVariable & PUBLIC_MASK; - } - - private int getFlagCheckbox(int coverVariable) { - return coverVariable & CHECKBOX_MASK; - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Screen.java b/src/main/java/gregtech/common/covers/GT_Cover_Screen.java deleted file mode 100644 index fab2b81b0b..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Screen.java +++ /dev/null @@ -1,100 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; - -public class GT_Cover_Screen extends GT_CoverBehavior { - - public GT_Cover_Screen(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 20.0F; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return false; - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return false; - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return false; - } - - @Override - public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable, - ICoverable aTileEntity) { - return false; - } - - @Override - public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - return false; - } - - @Override - public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - boolean aForced) { - return true; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return 0; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Shutter.java b/src/main/java/gregtech/common/covers/GT_Cover_Shutter.java deleted file mode 100644 index 40fad1c537..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Shutter.java +++ /dev/null @@ -1,196 +0,0 @@ -package gregtech.common.covers; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; - -public class GT_Cover_Shutter extends GT_CoverBehavior { - - public GT_Cover_Shutter(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return aCoverVariable; - } - - @Override - public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 4; - if (aCoverVariable < 0) { - aCoverVariable = 3; - } - switch (aCoverVariable) { - case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("082", "Open if work enabled")); - case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("083", "Open if work disabled")); - case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("084", "Only Output allowed")); - case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("085", "Only Input allowed")); - } - if (aTileEntity instanceof BaseMetaPipeEntity) { - ((BaseMetaPipeEntity) aTileEntity).reloadLocks(); - } - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 3 - : !(aTileEntity instanceof IMachineProgress) - || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0)); - } - - @Override - public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 2 - : !(aTileEntity instanceof IMachineProgress) - || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0)); - } - - @Override - public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 3 - : !(aTileEntity instanceof IMachineProgress) - || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0)); - } - - @Override - public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 2 - : !(aTileEntity instanceof IMachineProgress) - || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); - } - - @Override - public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 3 - : !(aTileEntity instanceof IMachineProgress) - || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); - } - - @Override - public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 2 - : !(aTileEntity instanceof IMachineProgress) - || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); - } - - @Override - public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 3 - : !(aTileEntity instanceof IMachineProgress) - || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); - } - - @Override - public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return aCoverVariable >= 2 ? aCoverVariable == 2 - : !(aTileEntity instanceof IMachineProgress) - || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0); - } - - @Override - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 0; - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new ShutterUIFactory(buildContext).createWindow(); - } - - private class ShutterUIFactory extends UIFactory { - - private static final int startX = 10; - private static final int startY = 25; - private static final int spaceX = 18; - private static final int spaceY = 18; - - public ShutterUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - builder - .widget( - new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( - this::getCoverData, - this::setCoverData, - GT_Cover_Shutter.this, - (index, coverData) -> index == convert(coverData), - (index, coverData) -> new ISerializableObject.LegacyCoverData(index)) - .addToggleButton( - 0, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.setPos(spaceX * 0, spaceY * 0)) - .addToggleButton( - 1, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.setPos(spaceX * 0, spaceY * 1)) - .addToggleButton( - 2, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.setPos(spaceX * 0, spaceY * 2)) - .addToggleButton( - 3, - CoverDataFollower_ToggleButtonWidget.ofCheck(), - widget -> widget.setPos(spaceX * 0, spaceY * 3)) - .setPos(startX, startY)) - .widget( - new TextWidget(GT_Utility.trans("082", "Open if work enabled")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0)) - .widget( - new TextWidget(GT_Utility.trans("083", "Open if work disabled")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1)) - .widget( - new TextWidget(GT_Utility.trans("084", "Only Output allowed")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2)) - .widget( - new TextWidget(GT_Utility.trans("085", "Only Input allowed")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3)); - } - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java b/src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java deleted file mode 100644 index 4b88a90194..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java +++ /dev/null @@ -1,139 +0,0 @@ -package gregtech.common.covers; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; - -public class GT_Cover_SolarPanel extends GT_CoverBehavior { - - private final int mVoltage; - - public GT_Cover_SolarPanel(int aVoltage) { - this.mVoltage = aVoltage; - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if (side != ForgeDirection.UP) return 0; - int coverState = aCoverVariable & 0x3; - int coverNum = aCoverVariable >> 2; - if (aTimer % 100L == 0L) { - if (aTileEntity.getWorld() - .isThundering()) { - return aTileEntity.getBiome().rainfall > 0.0F && aTileEntity.getSkyAtSide(side) - ? Math.min(20, coverNum) << 2 - : coverNum << 2; - } else { - if (aTileEntity.getWorld() - .isRaining() && aTileEntity.getBiome().rainfall > 0.0F) { // really rains - if (aTileEntity.getSkyAtSide(side)) coverNum = Math.min(30, coverNum); - if (aTileEntity.getWorld().skylightSubtracted >= 4) { - if (aTileEntity.getWorld() - .isDaytime()) { - coverState = 2; - } else { - return coverNum << 2; - } - } - } else { // not rains - if (aTileEntity.getWorld() - .isDaytime()) { - coverState = 1; - } else { - coverState = 2; - } - } - } - } - if (coverState == 1) { - aTileEntity.injectEnergyUnits( - ForgeDirection.UNKNOWN, - ((100L - (long) coverNum) * ((long) this.mVoltage)) / 100L, - 1L); - } - if (aTimer % 28800L == 0L && coverNum < 100 && (coverNum > 10 || XSTR_INSTANCE.nextInt(3) == 2)) coverNum++; - return coverState + (coverNum << 2); - } - - @Override - protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, - float aY, float aZ) { - if (aPlayer.capabilities.isCreativeMode) { - GT_Utility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable.get() >> 2) + "% dirt"); - aCoverVariable.set(aCoverVariable.get() & 0x3); - return true; - } - for (int i = 0; i < aPlayer.inventory.mainInventory.length; i++) { - ItemStack is = aPlayer.inventory.mainInventory[i]; - if (is == null) continue; - if (is.getUnlocalizedName() - .equals(new ItemStack(Items.water_bucket).getUnlocalizedName())) { - aPlayer.inventory.mainInventory[i] = new ItemStack(Items.bucket); - if (aPlayer.inventoryContainer != null) aPlayer.inventoryContainer.detectAndSendChanges(); - GT_Utility - .sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable.get() >> 2) + "% dirt"); - aCoverVariable.set(aCoverVariable.get() & 0x3); - return true; - } - } - GT_Utility.sendChatToPlayer(aPlayer, "You need water bucket in inventory to clean the panel."); - return false; - } - - @Override - @SuppressWarnings("deprecation") - public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aPlayer.capabilities.isCreativeMode) { - GT_Utility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable >> 2) + "% dirt"); - aTileEntity.setCoverDataAtSide(side, (aCoverVariable & 0x3)); - return true; - } - for (int i = 0; i < aPlayer.inventory.mainInventory.length; i++) { - ItemStack is = aPlayer.inventory.mainInventory[i]; - if (is == null) continue; - if (is.getUnlocalizedName() - .equals(new ItemStack(Items.water_bucket).getUnlocalizedName())) { - aPlayer.inventory.mainInventory[i] = new ItemStack(Items.bucket); - if (aPlayer.inventoryContainer != null) aPlayer.inventoryContainer.detectAndSendChanges(); - GT_Utility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable >> 2) + "% dirt"); - aTileEntity.setCoverDataAtSide(side, (aCoverVariable & 0x3)); - return true; - } - } - GT_Utility.sendChatToPlayer(aPlayer, "You need water bucket in inventory to clean the panel."); - return false; - } - - @Override - protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, - ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) { - return false; - } - - @Override - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java b/src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java deleted file mode 100644 index e67e8b05d1..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java +++ /dev/null @@ -1,18 +0,0 @@ -package gregtech.common.covers; - -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.util.GT_ModHandler; - -public class GT_Cover_SteamRegulator extends GT_Cover_FluidRegulator { - - public GT_Cover_SteamRegulator(int aTransferRate, ITexture coverTexture) { - super(aTransferRate, coverTexture); - } - - @Override - protected boolean canTransferFluid(FluidStack fluid) { - return GT_ModHandler.isAnySteam(fluid) || GT_ModHandler.isSuperHeatedSteam(fluid); - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java b/src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java deleted file mode 100644 index 5787a99c0b..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java +++ /dev/null @@ -1,26 +0,0 @@ -package gregtech.common.covers; - -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_ModHandler; - -public class GT_Cover_SteamValve extends GT_Cover_Pump { - - public GT_Cover_SteamValve(int aTransferRate, ITexture coverTexture) { - super(aTransferRate, coverTexture); - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - protected boolean canTransferFluid(FluidStack fluid) { - return GT_ModHandler.isAnySteam(fluid) || GT_ModHandler.isSuperHeatedSteam(fluid); - } -} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Vent.java b/src/main/java/gregtech/common/covers/GT_Cover_Vent.java deleted file mode 100644 index e2be64b475..0000000000 --- a/src/main/java/gregtech/common/covers/GT_Cover_Vent.java +++ /dev/null @@ -1,111 +0,0 @@ -package gregtech.common.covers; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; - -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_CoverBehavior; -import gregtech.api.util.GT_Utility; - -public class GT_Cover_Vent extends GT_CoverBehavior { - - private final int mEfficiency; - private final Fluid IC2_HOT_COOLANT = FluidRegistry.getFluid("ic2hotcoolant"); - private final Fluid IC2_COOLANT = FluidRegistry.getFluid("ic2coolant"); - - public GT_Cover_Vent(int aEfficiency) { - this.mEfficiency = aEfficiency; - } - - @Override - public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - return false; - } - - @Override - public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, - ICoverable aTileEntity, long aTimer) { - if (side == ForgeDirection.UNKNOWN) return 0; - int ret = 0; - if (aTileEntity instanceof IFluidHandler) { - ret = doCoolFluid(side, aTileEntity); - } - if ((aTileEntity instanceof IMachineProgress)) { - ret = doProgressEfficiency(side, (IMachineProgress) aTileEntity, aCoverID); - } - return ret; - } - - @Override - public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 100; - } - - protected int doProgressEfficiency(final ForgeDirection side, final IMachineProgress aTileEntity, - final int aCoverVariable) { - final int offsetX = aTileEntity.getOffsetX(side, 1); - final int offsetY = aTileEntity.getOffsetY(side, 1); - final int offsetZ = aTileEntity.getOffsetZ(side, 1); - final World world = aTileEntity.getWorld(); - if (aTileEntity.hasThingsToDo() && aCoverVariable != aTileEntity.getProgress() - && !GT_Utility.hasBlockHitBox(world, offsetX, offsetY, offsetZ)) { - aTileEntity.increaseProgress(this.mEfficiency); - } - return aTileEntity.getProgress(); - } - - protected int doCoolFluid(final ForgeDirection side, final ICoverable aTileEntity) { - final int offsetX = aTileEntity.getOffsetX(side, 1); - final int offsetY = aTileEntity.getOffsetY(side, 1); - final int offsetZ = aTileEntity.getOffsetZ(side, 1); - final World world = aTileEntity.getWorld(); - final IFluidHandler fluidHandler = (IFluidHandler) aTileEntity; - if (!fluidHandler.canDrain(ForgeDirection.UNKNOWN, IC2_HOT_COOLANT)) { - return 0; - } - final int chances; // 10000 = 100% - final Block blockAtSide = aTileEntity.getBlockAtSide(side); - if (blockAtSide == null) { - return 0; - } - if (blockAtSide == Blocks.water || blockAtSide == Blocks.flowing_water) { - chances = switch (mEfficiency) { - case 3 -> 10000; // 100% chances for Diamond reactor vent with water - case 2 -> 5000; // 50% chances for Gold and Overclocked reactor vents with water - default -> 2500; // 25% chances for Basic reactor vent with water - }; - } else if (blockAtSide.isAir(world, offsetX, offsetY, offsetZ)) { - switch (mEfficiency) { - case 3 -> chances = 2500; // 25% chances for Diamond reactor vent with air - case 2 -> chances = 1250; // 12.5% chances for Gold and Overclocked reactor vents with air - default -> { - return 0; // Basic reactor vent cannot be used with air - } - } - } else { - return 0; // Vent cover need water or air - } - if (chances > XSTR_INSTANCE.nextInt(10000)) { - final FluidStack hotFluidStack = fluidHandler.drain(ForgeDirection.UNKNOWN, Integer.MAX_VALUE, true); - final FluidStack coldFluidStack = new FluidStack(IC2_COOLANT, hotFluidStack.amount); - fluidHandler.fill(ForgeDirection.UNKNOWN, coldFluidStack, true); - return hotFluidStack.amount; - } - return 0; - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverBase.java b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverBase.java new file mode 100644 index 0000000000..68564e33e5 --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverBase.java @@ -0,0 +1,202 @@ +package gregtech.common.covers.redstone; + +import java.util.Arrays; +import java.util.UUID; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public abstract class CoverAdvancedRedstoneReceiverBase + extends CoverAdvancedWirelessRedstoneBase { + + public CoverAdvancedRedstoneReceiverBase(ITexture coverTexture) { + super(ReceiverData.class, coverTexture); + } + + @Override + public ReceiverData createDataObject() { + return new ReceiverData(); + } + + @Override + public ReceiverData createDataObject(int aLegacyData) { + return createDataObject(); + } + + // GUI stuff + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new AdvancedRedstoneReceiverBaseUIFactory(buildContext).createWindow(); + } + + private class AdvancedRedstoneReceiverBaseUIFactory extends AdvancedWirelessRedstoneBaseUIFactory { + + public AdvancedRedstoneReceiverBaseUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getFrequencyRow() { + return 0; + } + + @Override + protected int getButtonRow() { + return 1; + } + + @Override + protected boolean isShiftPrivateLeft() { + return false; + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + super.addUIWidgets(builder); + builder.widget( + new TextWidget(GTUtility.trans("335", "Gate Mode")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2)); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIForDataController(CoverDataControllerWidget controller) { + super.addUIForDataController(controller); + controller.addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == GateMode.AND, + (coverData, state) -> { + coverData.mode = GateMode.AND; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_GATE_AND) + .addTooltip(GTUtility.trans("331", "AND Gate")) + .setPos(spaceX * 0, spaceY * 2)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == GateMode.NAND, + (coverData, state) -> { + coverData.mode = GateMode.NAND; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_GATE_NAND) + .addTooltip(GTUtility.trans("332", "NAND Gate")) + .setPos(spaceX * 1, spaceY * 2)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == GateMode.OR, + (coverData, state) -> { + coverData.mode = GateMode.OR; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_GATE_OR) + .addTooltip(GTUtility.trans("333", "OR Gate")) + .setPos(spaceX * 2, spaceY * 2)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == GateMode.NOR, + (coverData, state) -> { + coverData.mode = GateMode.NOR; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_GATE_NOR) + .addTooltip(GTUtility.trans("334", "NOR Gate")) + .setPos(spaceX * 3, spaceY * 2)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == GateMode.SINGLE_SOURCE, + (coverData, state) -> { + coverData.mode = GateMode.SINGLE_SOURCE; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_ANALOG) + .addTooltips( + Arrays.asList( + "ANALOG Mode", + "Only use this mode with ONE transmitter in total,", + "no logic involved")) + .setPos(spaceX * 4, spaceY * 2)); + } + } + + public enum GateMode { + AND, + NAND, + OR, + NOR, + SINGLE_SOURCE + } + + public static class ReceiverData extends CoverAdvancedWirelessRedstoneBase.WirelessData { + + private GateMode mode; + + public ReceiverData(int frequency, UUID uuid, GateMode mode) { + super(frequency, uuid); + this.mode = mode; + } + + public ReceiverData() { + this(0, null, GateMode.AND); + } + + public GateMode getGateMode() { + return mode; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new ReceiverData(frequency, uuid, mode); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); + tag.setByte("mode", (byte) mode.ordinal()); + + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + super.writeToByteBuf(aBuf); + aBuf.writeByte(mode.ordinal()); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + super.loadDataFromNBT(aNBT); + + NBTTagCompound tag = (NBTTagCompound) aNBT; + mode = GateMode.values()[tag.getByte("mode")]; + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + super.readFromPacket(aBuf, aPlayer); + mode = GateMode.values()[aBuf.readByte()]; + + return this; + } + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverExternal.java b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverExternal.java new file mode 100644 index 0000000000..5473ab3fec --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverExternal.java @@ -0,0 +1,35 @@ +package gregtech.common.covers.redstone; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; + +public class CoverAdvancedRedstoneReceiverExternal extends CoverAdvancedRedstoneReceiverBase { + + public CoverAdvancedRedstoneReceiverExternal(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public ReceiverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ReceiverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + aTileEntity.setOutputRedstoneSignal( + side, + getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode())); + + return aCoverVariable; + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return false; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable, + ICoverable aTileEntity) { + return true; + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverInternal.java b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverInternal.java new file mode 100644 index 0000000000..f22a81bdba --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneReceiverInternal.java @@ -0,0 +1,42 @@ +package gregtech.common.covers.redstone; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; + +public class CoverAdvancedRedstoneReceiverInternal extends CoverAdvancedRedstoneReceiverBase { + + public CoverAdvancedRedstoneReceiverInternal(ITexture coverTexture) { + super(coverTexture); + } + + @Override + public ReceiverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ReceiverData aCoverVariable, ICoverable aTileEntity, long aTimer) { + if (aTileEntity instanceof IMachineProgress machine) { + if (getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity) > 0) { + machine.enableWorking(); + } else { + machine.disableWorking(); + } + + machine.setWorkDataValue(aInputRedstone); + } + + return aCoverVariable; + } + + @Override + protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ReceiverData aCoverVariable, ICoverable aTileEntity) { + return getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode()); + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return true; + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterBase.java b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterBase.java new file mode 100644 index 0000000000..cfa5461305 --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterBase.java @@ -0,0 +1,188 @@ +package gregtech.common.covers.redstone; + +import java.util.Objects; +import java.util.UUID; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public abstract class CoverAdvancedRedstoneTransmitterBase + extends CoverAdvancedWirelessRedstoneBase { + + public CoverAdvancedRedstoneTransmitterBase(Class typeToken, ITexture coverTexture) { + super(typeToken, coverTexture); + } + + private static void unregisterSignal(ForgeDirection side, TransmitterData aCoverVariable, ICoverable aTileEntity) { + final long hash = hashCoverCoords(aTileEntity, side); + removeSignalAt(aCoverVariable.uuid, aCoverVariable.frequency, hash); + } + + @Override + public boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, + ICoverable aTileEntity, boolean aForced) { + unregisterSignal(side, aCoverVariable, aTileEntity); + return true; + } + + @Override + protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, + ICoverable aTileEntity) { + unregisterSignal(side, aCoverVariable, aTileEntity); + } + + @Override + protected T onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable.invert = !aCoverVariable.invert; + GTUtility.sendChatToPlayer( + aPlayer, + aCoverVariable.invert ? GTUtility.trans("054", "Inverted") : GTUtility.trans("055", "Normal")); + + return aCoverVariable; + } + + @Override + protected void preDataChangedImpl(ForgeDirection side, int aCoverID, int aNewCoverId, T aCoverVariable, + T aNewCoverVariable, ICoverable aTileEntity) { + if (aCoverVariable.frequency != aNewCoverVariable.frequency + || !Objects.equals(aCoverVariable.uuid, aNewCoverVariable.uuid)) { + unregisterSignal(side, aCoverVariable, aTileEntity); + } + } + + public static class TransmitterData extends CoverAdvancedWirelessRedstoneBase.WirelessData { + + protected boolean invert; + + public TransmitterData(int frequency, UUID uuid, boolean invert) { + super(frequency, uuid); + this.invert = invert; + } + + public TransmitterData() { + this(0, null, false); + } + + public boolean isInvert() { + return invert; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new TransmitterData(frequency, uuid, invert); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); + tag.setBoolean("invert", invert); + + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + super.writeToByteBuf(aBuf); + aBuf.writeBoolean(invert); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + super.loadDataFromNBT(aNBT); + + NBTTagCompound tag = (NBTTagCompound) aNBT; + invert = tag.getBoolean("invert"); + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + super.readFromPacket(aBuf, aPlayer); + invert = aBuf.readBoolean(); + + return this; + } + } + + // GUI stuff + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new AdvancedRedstoneTransmitterBaseUIFactory(buildContext).createWindow(); + } + + protected class AdvancedRedstoneTransmitterBaseUIFactory extends AdvancedWirelessRedstoneBaseUIFactory { + + public AdvancedRedstoneTransmitterBaseUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getFrequencyRow() { + return 0; + } + + @Override + protected int getButtonRow() { + return 1; + } + + @Override + protected boolean isShiftPrivateLeft() { + return true; + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + super.addUIWidgets(builder); + builder.widget(TextWidget.dynamicString(() -> { + T coverData = getCoverData(); + if (coverData != null) { + return getCoverData().invert ? GTUtility.trans("INVERTED", "Inverted") + : GTUtility.trans("NORMAL", "Normal"); + } else { + return ""; + } + }) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 10, 4 + startY + spaceY * getButtonRow())); + } + + @Override + protected void addUIForDataController(CoverDataControllerWidget controller) { + super.addUIForDataController(controller); + controller.addFollower( + CoverDataFollowerToggleButtonWidget.ofRedstone(), + coverData -> coverData.invert, + (coverData, state) -> { + coverData.invert = state; + return coverData; + }, + widget -> widget.addTooltip(0, GTUtility.trans("NORMAL", "Normal")) + .addTooltip(1, GTUtility.trans("INVERTED", "Inverted")) + .setPos(spaceX * 9, spaceY * getButtonRow())); + } + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterExternal.java new file mode 100644 index 0000000000..71003974c5 --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterExternal.java @@ -0,0 +1,51 @@ +package gregtech.common.covers.redstone; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; + +public class CoverAdvancedRedstoneTransmitterExternal + extends CoverAdvancedRedstoneTransmitterBase { + + public CoverAdvancedRedstoneTransmitterExternal(ITexture coverTexture) { + super(TransmitterData.class, coverTexture); + } + + @Override + public TransmitterData createDataObject() { + return new TransmitterData(); + } + + @Override + public TransmitterData createDataObject(int aLegacyData) { + return createDataObject(); + } + + @Override + public TransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + TransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + byte outputRedstone = aInputRedstone; + if (aCoverVariable.isInvert()) { + if (outputRedstone > 0) outputRedstone = 0; + else outputRedstone = 15; + } + + final long hash = hashCoverCoords(aTileEntity, side); + setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone); + + return aCoverVariable; + } + + @Override + protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, + ICoverable aTileEntity, long aTimer) { + return true; + } + + @Override + public boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterInternal.java b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterInternal.java new file mode 100644 index 0000000000..ab368e0c5b --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedRedstoneTransmitterInternal.java @@ -0,0 +1,50 @@ +package gregtech.common.covers.redstone; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; + +public class CoverAdvancedRedstoneTransmitterInternal + extends CoverAdvancedRedstoneTransmitterBase { + + public CoverAdvancedRedstoneTransmitterInternal(ITexture coverTexture) { + super(TransmitterData.class, coverTexture); + } + + @Override + public TransmitterData createDataObject() { + return new TransmitterData(); + } + + @Override + public TransmitterData createDataObject(int aLegacyData) { + return createDataObject(); + } + + @Override + public TransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + TransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + byte outputRedstone = aTileEntity.getOutputRedstoneSignal(side); + if (aCoverVariable.isInvert()) { + if (outputRedstone > 0) outputRedstone = 0; + else outputRedstone = 15; + } + + final long hash = hashCoverCoords(aTileEntity, side); + setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone); + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + TransmitterData aCoverVariable, ICoverable aTileEntity) { + return true; + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverAdvancedWirelessRedstoneBase.java b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedWirelessRedstoneBase.java new file mode 100644 index 0000000000..963678a24c --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverAdvancedWirelessRedstoneBase.java @@ -0,0 +1,298 @@ +package gregtech.common.covers.redstone; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public abstract class CoverAdvancedWirelessRedstoneBase + extends CoverBehaviorBase { + + public CoverAdvancedWirelessRedstoneBase(Class typeToken, ITexture coverTexture) { + super(typeToken, coverTexture); + } + + public static Byte getSignalAt(UUID uuid, int frequency, CoverAdvancedRedstoneReceiverBase.GateMode mode) { + Map> frequencies = GregTechAPI.sAdvancedWirelessRedstone.get(String.valueOf(uuid)); + if (frequencies == null) return 0; + + Map signals = frequencies.get(frequency); + if (signals == null) signals = new ConcurrentHashMap<>(); + + switch (mode) { + case AND -> { + return (byte) (signals.values() + .stream() + .map(signal -> signal > 0) + .reduce(true, (signalA, signalB) -> signalA && signalB) ? 15 : 0); + } + case NAND -> { + return (byte) (signals.values() + .stream() + .map(signal -> signal > 0) + .reduce(true, (signalA, signalB) -> signalA && signalB) ? 0 : 15); + } + case OR -> { + return (byte) (signals.values() + .stream() + .map(signal -> signal > 0) + .reduce(false, (signalA, signalB) -> signalA || signalB) ? 15 : 0); + } + case NOR -> { + return (byte) (signals.values() + .stream() + .map(signal -> signal > 0) + .reduce(false, (signalA, signalB) -> signalA || signalB) ? 0 : 15); + } + case SINGLE_SOURCE -> { + if (signals.values() + .isEmpty()) { + return 0; + } + return signals.values() + .iterator() + .next(); + } + default -> { + return 0; + } + } + } + + public static void removeSignalAt(UUID uuid, int frequency, long hash) { + Map> frequencies = GregTechAPI.sAdvancedWirelessRedstone.get(String.valueOf(uuid)); + if (frequencies == null) return; + frequencies.computeIfPresent(frequency, (freq, longByteMap) -> { + longByteMap.remove(hash); + return longByteMap.isEmpty() ? null : longByteMap; + }); + } + + public static void setSignalAt(UUID uuid, int frequency, long hash, byte value) { + Map> frequencies = GregTechAPI.sAdvancedWirelessRedstone + .computeIfAbsent(String.valueOf(uuid), k -> new ConcurrentHashMap<>()); + Map signals = frequencies.computeIfAbsent(frequency, k -> new ConcurrentHashMap<>()); + signals.put(hash, value); + } + + /** + * x hashed into first 20 bytes y hashed into second 20 bytes z hashed into fifth 10 bytes dim hashed into sixth 10 + * bytes side hashed into last 4 bytes + */ + public static long hashCoverCoords(ICoverable tile, ForgeDirection side) { + return (((((long) tile.getXCoord() << 20) + tile.getZCoord() << 10) + tile.getYCoord() << 10) + + tile.getWorld().provider.dimensionId << 4) + side.ordinal(); + } + + @Override + public boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public String getDescriptionImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return GTUtility.trans("081", "Frequency: ") + aCoverVariable.frequency + + ", Transmission: " + + (aCoverVariable.uuid == null ? "Public" : "Private"); + } + + @Override + public int getTickRateImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { + return 5; + } + + public abstract static class WirelessData implements ISerializableObject { + + protected int frequency; + + /** + * If UUID is set to null, the cover frequency is public, rather than private + **/ + protected UUID uuid; + + public WirelessData(int frequency, UUID uuid) { + this.frequency = frequency; + this.uuid = uuid; + } + + public UUID getUuid() { + return uuid; + } + + public int getFrequency() { + return frequency; + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("frequency", frequency); + if (uuid != null) { + tag.setString("uuid", uuid.toString()); + } + + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeInt(frequency); + aBuf.writeBoolean(uuid != null); + if (uuid != null) { + aBuf.writeLong(uuid.getLeastSignificantBits()); + aBuf.writeLong(uuid.getMostSignificantBits()); + } + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + NBTTagCompound tag = (NBTTagCompound) aNBT; + frequency = tag.getInteger("frequency"); + if (tag.hasKey("uuid")) { + uuid = UUID.fromString(tag.getString("uuid")); + } + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + frequency = aBuf.readInt(); + if (aBuf.readBoolean()) { + uuid = new UUID(aBuf.readLong(), aBuf.readLong()); + } + + return this; + } + } + + // GUI stuff + + @Override + public boolean hasCoverGUI() { + return true; + } + + protected abstract class AdvancedWirelessRedstoneBaseUIFactory extends UIFactory { + + protected static final int startX = 10; + protected static final int startY = 25; + protected static final int spaceX = 18; + protected static final int spaceY = 18; + + public AdvancedWirelessRedstoneBaseUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getGUIWidth() { + return 250; + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + final int privateExtraColumn = isShiftPrivateLeft() ? 1 : 5; + + CoverDataControllerWidget dataController = new CoverDataControllerWidget<>( + this::getCoverData, + this::setCoverData, + CoverAdvancedWirelessRedstoneBase.this); + dataController.setPos(startX, startY); + addUIForDataController(dataController); + + builder.widget(dataController) + .widget( + new TextWidget(GTUtility.trans("246", "Frequency")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5, 4 + startY + spaceY * getFrequencyRow())) + .widget( + new TextWidget(GTUtility.trans("602", "Use Private Frequency")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * privateExtraColumn, 4 + startY + spaceY * getButtonRow())); + } + + protected void addUIForDataController(CoverDataControllerWidget controller) { + controller.addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.frequency, + (coverData, state) -> { + coverData.frequency = state.intValue(); + return coverData; + }, + widget -> widget.setScrollValues(1, 1000, 10) + .setBounds(0, Integer.MAX_VALUE) + .setPos(1, 2 + spaceY * getFrequencyRow()) + .setSize(spaceX * 5 - 4, 12)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofCheck(), + coverData -> coverData.uuid != null, + (coverData, state) -> { + if (state) { + coverData.uuid = getUIBuildContext().getPlayer() + .getUniqueID(); + } else { + coverData.uuid = null; + } + return coverData; + }, + widget -> widget.setPos(0, spaceY * getButtonRow())); + } + + protected abstract int getFrequencyRow(); + + protected abstract int getButtonRow(); + + protected abstract boolean isShiftPrivateLeft(); + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverWirelessDoesWorkDetector.java b/src/main/java/gregtech/common/covers/redstone/CoverWirelessDoesWorkDetector.java new file mode 100644 index 0000000000..ed55280b7f --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverWirelessDoesWorkDetector.java @@ -0,0 +1,244 @@ +package gregtech.common.covers.redstone; + +import java.util.UUID; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public class CoverWirelessDoesWorkDetector + extends CoverAdvancedRedstoneTransmitterBase { + + public CoverWirelessDoesWorkDetector(ITexture coverTexture) { + super(ActivityTransmitterData.class, coverTexture); + } + + @Override + public ActivityTransmitterData createDataObject() { + return new ActivityTransmitterData(); + } + + @Override + public ActivityTransmitterData createDataObject(int aLegacyData) { + return createDataObject(); + } + + private static byte computeSignalBasedOnActivity(ActivityTransmitterData coverVariable, ICoverable tileEntity) { + + if (tileEntity instanceof IMachineProgress) { + IMachineProgress mProgress = (IMachineProgress) tileEntity; + boolean inverted = coverVariable.invert; + int signal = 0; + + switch (coverVariable.mode) { + case MACHINE_ENABLED -> signal = inverted == mProgress.isAllowedToWork() ? 0 : 15; + case MACHINE_IDLE -> signal = inverted == (mProgress.getMaxProgress() == 0) ? 0 : 15; + case RECIPE_PROGRESS -> { + int tScale = mProgress.getMaxProgress() / 15; + + if (tScale > 0 && mProgress.hasThingsToDo()) { + signal = inverted ? (15 - mProgress.getProgress() / tScale) + : (mProgress.getProgress() / tScale); + } else { + signal = inverted ? 15 : 0; + } + } + } + + return (byte) signal; + } else { + return (byte) 0; + } + + } + + @Override + public ActivityTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ActivityTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + final byte signal = computeSignalBasedOnActivity(aCoverVariable, aTileEntity); + final long hash = hashCoverCoords(aTileEntity, side); + setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); + + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ActivityTransmitterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + ActivityTransmitterData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRateImpl(ForgeDirection side, int aCoverID, ActivityTransmitterData aCoverVariable, + ICoverable aTileEntity) { + return 5; + } + + public enum ActivityMode { + RECIPE_PROGRESS, + MACHINE_IDLE, + MACHINE_ENABLED, + } + + public static class ActivityTransmitterData extends CoverAdvancedRedstoneTransmitterBase.TransmitterData { + + private ActivityMode mode; + + public ActivityTransmitterData(int frequency, UUID uuid, boolean invert, ActivityMode mode) { + super(frequency, uuid, invert); + this.mode = mode; + } + + public ActivityTransmitterData() { + super(); + this.mode = ActivityMode.MACHINE_IDLE; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new ActivityTransmitterData(frequency, uuid, invert, mode); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); + tag.setInteger("mode", mode.ordinal()); + + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + super.writeToByteBuf(aBuf); + aBuf.writeInt(mode.ordinal()); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + super.loadDataFromNBT(aNBT); + + NBTTagCompound tag = (NBTTagCompound) aNBT; + mode = ActivityMode.values()[tag.getInteger("mode")]; + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + super.readFromPacket(aBuf, aPlayer); + mode = ActivityMode.values()[aBuf.readInt()]; + + return this; + } + } + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new WirelessActivityDetectorUIFactory(buildContext).createWindow(); + } + + private class WirelessActivityDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { + + public WirelessActivityDetectorUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getGUIHeight() { + return 107; + } + + @Override + protected int getFrequencyRow() { + return 0; + } + + @Override + protected int getButtonRow() { + return 1; + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + super.addUIWidgets(builder); + builder.widget(TextWidget.dynamicString(() -> { + + ActivityMode mode = getCoverData().mode; + + if (mode == ActivityMode.MACHINE_ENABLED) { + return GTUtility.trans("271", "Machine enabled"); + } else if (mode == ActivityMode.MACHINE_IDLE) { + return GTUtility.trans("242", "Machine idle"); + } else { + return GTUtility.trans("241", "Recipe progress"); + } + + }) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 2)); + } + + @Override + protected void addUIForDataController(CoverDataControllerWidget controller) { + super.addUIForDataController(controller); + + controller.addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == ActivityMode.RECIPE_PROGRESS, + (coverData, state) -> { + coverData.mode = ActivityMode.RECIPE_PROGRESS; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_PROGRESS) + .addTooltip(GTUtility.trans("241", "Recipe progress")) + .setPos(spaceX * 0, spaceY * 2)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == ActivityMode.MACHINE_IDLE, + (coverData, state) -> { + coverData.mode = ActivityMode.MACHINE_IDLE; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK) + .addTooltip(GTUtility.trans("242", "Machine idle")) + .setPos(spaceX * 1, spaceY * 2)) + .addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == ActivityMode.MACHINE_ENABLED, + (coverData, state) -> { + coverData.mode = ActivityMode.MACHINE_ENABLED; + return coverData; + }, + widget -> widget.setStaticTexture(GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON) + .addTooltip(GTUtility.trans("271", "Machine enabled")) + .setPos(spaceX * 2, spaceY * 2)); + } + } + +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverWirelessFluidDetector.java b/src/main/java/gregtech/common/covers/redstone/CoverWirelessFluidDetector.java new file mode 100644 index 0000000000..cfea9b7b28 --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverWirelessFluidDetector.java @@ -0,0 +1,186 @@ +package gregtech.common.covers.redstone; + +import java.util.Arrays; +import java.util.UUID; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverLiquidMeter; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import io.netty.buffer.ByteBuf; + +public class CoverWirelessFluidDetector + extends CoverAdvancedRedstoneTransmitterBase { + + public CoverWirelessFluidDetector(ITexture coverTexture) { + super(FluidTransmitterData.class, coverTexture); + } + + @Override + public FluidTransmitterData createDataObject() { + return new FluidTransmitterData(); + } + + @Override + public FluidTransmitterData createDataObject(int aLegacyData) { + return createDataObject(); + } + + @Override + public FluidTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + FluidTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + final byte signal = CoverLiquidMeter + .computeSignalBasedOnFluid(aTileEntity, aCoverVariable.invert, aCoverVariable.threshold); + final long hash = hashCoverCoords(aTileEntity, side); + setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); + + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidTransmitterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + FluidTransmitterData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + public static class FluidTransmitterData extends CoverAdvancedRedstoneTransmitterBase.TransmitterData { + + /** The special value {@code 0} means threshold check is disabled. */ + private int threshold; + + public FluidTransmitterData(int frequency, UUID uuid, boolean invert, int threshold) { + super(frequency, uuid, invert); + this.threshold = threshold; + } + + public FluidTransmitterData() { + super(); + this.threshold = 0; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new FluidTransmitterData(frequency, uuid, invert, threshold); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); + tag.setInteger("threshold", threshold); + + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + super.writeToByteBuf(aBuf); + aBuf.writeInt(threshold); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + super.loadDataFromNBT(aNBT); + + NBTTagCompound tag = (NBTTagCompound) aNBT; + threshold = tag.getInteger("threshold"); + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + super.readFromPacket(aBuf, aPlayer); + threshold = aBuf.readInt(); + + return this; + } + } + + // GUI stuff + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new WirelessFluidDetectorUIFactory(buildContext).createWindow(); + } + + private class WirelessFluidDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { + + private int maxCapacity; + + public WirelessFluidDetectorUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getFrequencyRow() { + return 0; + } + + @Override + protected int getButtonRow() { + return 1; + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + setMaxCapacity(); + super.addUIWidgets(builder); + builder.widget( + new TextWidget(GTUtility.trans("222", "Fluid threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2)); + } + + @Override + protected void addUIForDataController(CoverDataControllerWidget controller) { + super.addUIForDataController(controller); + controller.addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.threshold, + (coverData, state) -> { + coverData.threshold = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(0, maxCapacity > 0 ? maxCapacity : Integer.MAX_VALUE) + .setScrollValues(1000, 144, 100000) + .setFocusOnGuiOpen(true) + .setPos(1, 2 + spaceY * 2) + .setSize(spaceX * 5 - 4, 12)); + } + + private void setMaxCapacity() { + final ICoverable tile = getUIBuildContext().getTile(); + if (!tile.isDead() && tile instanceof IFluidHandler) { + FluidTankInfo[] tanks = ((IFluidHandler) tile).getTankInfo(ForgeDirection.UNKNOWN); + maxCapacity = Arrays.stream(tanks) + .mapToInt(tank -> tank.capacity) + .sum(); + } else { + maxCapacity = -1; + } + } + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverWirelessItemDetector.java b/src/main/java/gregtech/common/covers/redstone/CoverWirelessItemDetector.java new file mode 100644 index 0000000000..19cefdabcf --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverWirelessItemDetector.java @@ -0,0 +1,262 @@ +package gregtech.common.covers.redstone; + +import java.text.FieldPosition; +import java.util.UUID; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverItemMeter; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerNumericWidget; +import gregtech.common.gui.modularui.widget.ItemWatcherSlotWidget; +import gregtech.common.tileentities.storage.MTEDigitalChestBase; +import io.netty.buffer.ByteBuf; + +public class CoverWirelessItemDetector + extends CoverAdvancedRedstoneTransmitterBase { + + public CoverWirelessItemDetector(ITexture coverTexture) { + super(ItemTransmitterData.class, coverTexture); + } + + @Override + public ItemTransmitterData createDataObject() { + return new ItemTransmitterData(); + } + + @Override + public ItemTransmitterData createDataObject(int aLegacyData) { + return createDataObject(); + } + + @Override + public ItemTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + ItemTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + byte signal = CoverItemMeter.computeSignalBasedOnItems( + aTileEntity, + aCoverVariable.invert, + aCoverVariable.threshold, + aCoverVariable.slot, + side.ordinal()); + final long hash = hashCoverCoords(aTileEntity, side); + setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); + + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ItemTransmitterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + ItemTransmitterData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + public static class ItemTransmitterData extends CoverAdvancedRedstoneTransmitterBase.TransmitterData { + + /** + * The special value {@code -1} means all slots. + */ + private int slot; + /** + * The special value {@code 0} means threshold check is disabled. + */ + private int threshold; + + public ItemTransmitterData(int frequency, UUID uuid, boolean invert, int threshold, int slot) { + super(frequency, uuid, invert); + this.threshold = threshold; + this.slot = slot; + } + + public ItemTransmitterData() { + super(); + this.threshold = 0; + this.slot = -1; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new ItemTransmitterData(frequency, uuid, invert, threshold, slot); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); + tag.setInteger("threshold", threshold); + tag.setInteger("slot", slot); + + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + super.writeToByteBuf(aBuf); + aBuf.writeInt(threshold); + aBuf.writeInt(slot); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + super.loadDataFromNBT(aNBT); + + NBTTagCompound tag = (NBTTagCompound) aNBT; + threshold = tag.getInteger("threshold"); + slot = tag.getInteger("slot"); + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + super.readFromPacket(aBuf, aPlayer); + threshold = aBuf.readInt(); + slot = aBuf.readInt(); + + return this; + } + } + + // GUI stuff + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new WirelessItemDetectorUIFactory(buildContext).createWindow(); + } + + private class WirelessItemDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { + + private int maxSlot; + private int maxThreshold; + /** + * Display the text "All" instead of a number when the slot is set to -1. + */ + private static final NumberFormatMUI numberFormatAll = new NumberFormatMUI() { + + @Override + public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { + if (number < 0) { + return toAppendTo.append(GTUtility.trans("ALL", "All")); + } else { + return super.format(number, toAppendTo, pos); + } + } + }; + + public WirelessItemDetectorUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getFrequencyRow() { + return 0; + } + + @Override + protected int getButtonRow() { + return 1; + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + setMaxSlot(); + setMaxThreshold(); + super.addUIWidgets(builder); + builder.widget( + new ItemWatcherSlotWidget().setGetter(this::getTargetItem) + .setPos(startX + spaceX * 4 - 1, startY + spaceY * 3)) + .widget( + new TextWidget(GTUtility.trans("221", "Item threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2)) + .widget( + new TextWidget(GTUtility.trans("254", "Detect Slot #")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 5, 4 + startY + spaceY * 3)); + } + + @Override + protected void addUIForDataController(CoverDataControllerWidget controller) { + super.addUIForDataController(controller); + controller.addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.threshold, + (coverData, state) -> { + coverData.threshold = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(0, maxThreshold) + .setScrollValues(1, 64, 1000) + .setFocusOnGuiOpen(true) + .setPos(1, 2 + spaceY * 2) + .setSize(spaceX * 5 - 4, 12)) + .addFollower( + new CoverDataFollowerNumericWidget<>(), + coverData -> (double) coverData.slot, + (coverData, state) -> { + coverData.slot = state.intValue(); + return coverData; + }, + widget -> widget.setBounds(-1, maxSlot) + .setDefaultValue(-1) + .setScrollValues(1, 100, 10) + .setNumberFormat(numberFormatAll) + .setPos(1, 2 + spaceY * 3) + .setSize(spaceX * 4 - 8, 12)); + } + + private void setMaxSlot() { + final ICoverable tile = getUIBuildContext().getTile(); + if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile + && !(gtTile.getMetaTileEntity() instanceof MTEDigitalChestBase)) { + maxSlot = tile.getSizeInventory() - 1; + } else { + maxSlot = -1; + } + } + + private void setMaxThreshold() { + final ICoverable tile = getUIBuildContext().getTile(); + if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile + && gtTile.getMetaTileEntity() instanceof MTEDigitalChestBase) { + maxThreshold = gtTile.getMaxItemCount(); + } else { + maxThreshold = maxSlot > 0 ? maxSlot * 64 : Integer.MAX_VALUE; + } + } + + private ItemStack getTargetItem() { + final ICoverable tile = getUIBuildContext().getTile(); + final ItemTransmitterData coverVariable = getCoverData(); + if (coverVariable != null && coverVariable.slot >= 0 + && tile instanceof TileEntity + && !tile.isDead() + && tile.getSizeInventory() >= coverVariable.slot) { + return tile.getStackInSlot(coverVariable.slot); + } else { + return null; + } + } + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/CoverWirelessMaintenanceDetector.java b/src/main/java/gregtech/common/covers/redstone/CoverWirelessMaintenanceDetector.java new file mode 100644 index 0000000000..f3d62f2c81 --- /dev/null +++ b/src/main/java/gregtech/common/covers/redstone/CoverWirelessMaintenanceDetector.java @@ -0,0 +1,242 @@ +package gregtech.common.covers.redstone; + +import java.util.UUID; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.io.ByteArrayDataInput; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.CoverUIBuildContext; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverNeedMaintainance; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollowerToggleButtonWidget; +import io.netty.buffer.ByteBuf; + +public class CoverWirelessMaintenanceDetector + extends CoverAdvancedRedstoneTransmitterBase { + + public CoverWirelessMaintenanceDetector(ITexture coverTexture) { + super(MaintenanceTransmitterData.class, coverTexture); + } + + @Override + public MaintenanceTransmitterData createDataObject() { + return new MaintenanceTransmitterData(); + } + + @Override + public MaintenanceTransmitterData createDataObject(int aLegacyData) { + return createDataObject(); + } + + private static byte computeSignalBasedOnMaintenance(MaintenanceTransmitterData coverVariable, + ICoverable tileEntity) { + boolean signal = false; + + if (tileEntity instanceof IGregTechTileEntity) { + IMetaTileEntity metaTE = ((IGregTechTileEntity) tileEntity).getMetaTileEntity(); + if (metaTE instanceof MTEMultiBlockBase multiTE) { + int ideal = multiTE.getIdealStatus(); + int real = multiTE.getRepairStatus(); + + switch (coverVariable.mode) { + case NO_ISSUE -> signal = ideal == real; + case ONE_ISSUE, TWO_ISSUES, THREE_ISSUES, FOUR_ISSUES, FIVE_ISSUES -> signal = ideal - real + >= coverVariable.mode.ordinal(); + case ROTOR_80, ROTOR_100 -> { + ItemStack rotor = multiTE.getRealInventory()[1]; + if (CoverNeedMaintainance.isRotor(rotor)) { + long max = MetaGeneratedTool.getToolMaxDamage(rotor); + long current = MetaGeneratedTool.getToolDamage(rotor); + + if (coverVariable.mode == MaintenanceMode.ROTOR_80) { + signal = current >= max * 8 / 10; + } else { + long expectedDamage = Math.round( + Math.min( + (double) multiTE.mEUt / multiTE.damageFactorLow, + Math.pow(multiTE.mEUt, multiTE.damageFactorHigh))); + signal = current + expectedDamage * 2 >= max; + } + } else { + signal = true; + } + } + } + } + } + + if (coverVariable.invert) { + signal = !signal; + } + + return (byte) (signal ? 15 : 0); + } + + @Override + public MaintenanceTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, + MaintenanceTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { + final byte signal = computeSignalBasedOnMaintenance(aCoverVariable, aTileEntity); + final long hash = hashCoverCoords(aTileEntity, side); + setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); + + return aCoverVariable; + } + + @Override + public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, MaintenanceTransmitterData aCoverVariable, + ICoverable aTileEntity) { + return true; + } + + @Override + protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, + MaintenanceTransmitterData aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int getTickRateImpl(ForgeDirection side, int aCoverID, MaintenanceTransmitterData aCoverVariable, + ICoverable aTileEntity) { + return 60; + } + + public enum MaintenanceMode { + NO_ISSUE, + ONE_ISSUE, + TWO_ISSUES, + THREE_ISSUES, + FOUR_ISSUES, + FIVE_ISSUES, + ROTOR_80, + ROTOR_100 + } + + public static class MaintenanceTransmitterData extends CoverAdvancedRedstoneTransmitterBase.TransmitterData { + + private MaintenanceMode mode; + + public MaintenanceTransmitterData(int frequency, UUID uuid, boolean invert, MaintenanceMode mode) { + super(frequency, uuid, invert); + this.mode = mode; + } + + public MaintenanceTransmitterData() { + super(); + this.mode = MaintenanceMode.ONE_ISSUE; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new MaintenanceTransmitterData(frequency, uuid, invert, mode); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); + tag.setInteger("mode", mode.ordinal()); + + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + super.writeToByteBuf(aBuf); + aBuf.writeInt(mode.ordinal()); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + super.loadDataFromNBT(aNBT); + + NBTTagCompound tag = (NBTTagCompound) aNBT; + mode = MaintenanceMode.values()[tag.getInteger("mode")]; + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + super.readFromPacket(aBuf, aPlayer); + mode = MaintenanceMode.values()[aBuf.readInt()]; + + return this; + } + } + + // GUI stuff + + private static final String[] extraTexts = new String[] { "No Issues", ">= 1 Issue", ">= 2 Issues", ">= 3 Issues", + ">= 4 Issues", ">= 5 Issues", "Rotor < 20%", "Rotor ≈ 0%" }; + + @Override + public ModularWindow createWindow(CoverUIBuildContext buildContext) { + return new WirelessMaintenanceDetectorUIFactory(buildContext).createWindow(); + } + + private class WirelessMaintenanceDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { + + public WirelessMaintenanceDetectorUIFactory(CoverUIBuildContext buildContext) { + super(buildContext); + } + + @Override + protected int getGUIHeight() { + return 143; + } + + @Override + protected int getFrequencyRow() { + return 0; + } + + @Override + protected int getButtonRow() { + return 1; + } + + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + super.addUIWidgets(builder); + for (int i = 0; i < 8; i++) { + builder.widget( + new TextWidget(extraTexts[i]).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * (i % 2 == 0 ? 1 : 7), 4 + startY + spaceY * (2 + i / 2))); + } + } + + @Override + protected void addUIForDataController(CoverDataControllerWidget controller) { + super.addUIForDataController(controller); + for (int i = 0; i < 8; i++) { + final int index = i; + controller.addFollower( + CoverDataFollowerToggleButtonWidget.ofDisableable(), + coverData -> coverData.mode == MaintenanceMode.values()[index], + (coverData, state) -> { + coverData.mode = MaintenanceMode.values()[index]; + return coverData; + }, + widget -> widget.setToggleTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK, GTUITextures.TRANSPARENT) + .setPos(spaceX * (index % 2 == 0 ? 0 : 6), spaceY * (2 + index / 2))); + } + } + } +} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java deleted file mode 100644 index afd0f67b37..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java +++ /dev/null @@ -1,202 +0,0 @@ -package gregtech.common.covers.redstone; - -import java.util.Arrays; -import java.util.UUID; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public abstract class GT_Cover_AdvancedRedstoneReceiverBase - extends GT_Cover_AdvancedWirelessRedstoneBase { - - public GT_Cover_AdvancedRedstoneReceiverBase(ITexture coverTexture) { - super(ReceiverData.class, coverTexture); - } - - @Override - public ReceiverData createDataObject() { - return new ReceiverData(); - } - - @Override - public ReceiverData createDataObject(int aLegacyData) { - return createDataObject(); - } - - // GUI stuff - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new AdvancedRedstoneReceiverBaseUIFactory(buildContext).createWindow(); - } - - private class AdvancedRedstoneReceiverBaseUIFactory extends AdvancedWirelessRedstoneBaseUIFactory { - - public AdvancedRedstoneReceiverBaseUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getFrequencyRow() { - return 0; - } - - @Override - protected int getButtonRow() { - return 1; - } - - @Override - protected boolean isShiftPrivateLeft() { - return false; - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - super.addUIWidgets(builder); - builder.widget( - new TextWidget(GT_Utility.trans("335", "Gate Mode")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2)); - } - - @SuppressWarnings("PointlessArithmeticExpression") - @Override - protected void addUIForDataController(CoverDataControllerWidget controller) { - super.addUIForDataController(controller); - controller.addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == GateMode.AND, - (coverData, state) -> { - coverData.mode = GateMode.AND; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_AND) - .addTooltip(GT_Utility.trans("331", "AND Gate")) - .setPos(spaceX * 0, spaceY * 2)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == GateMode.NAND, - (coverData, state) -> { - coverData.mode = GateMode.NAND; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_NAND) - .addTooltip(GT_Utility.trans("332", "NAND Gate")) - .setPos(spaceX * 1, spaceY * 2)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == GateMode.OR, - (coverData, state) -> { - coverData.mode = GateMode.OR; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_OR) - .addTooltip(GT_Utility.trans("333", "OR Gate")) - .setPos(spaceX * 2, spaceY * 2)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == GateMode.NOR, - (coverData, state) -> { - coverData.mode = GateMode.NOR; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_NOR) - .addTooltip(GT_Utility.trans("334", "NOR Gate")) - .setPos(spaceX * 3, spaceY * 2)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == GateMode.SINGLE_SOURCE, - (coverData, state) -> { - coverData.mode = GateMode.SINGLE_SOURCE; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_ANALOG) - .addTooltips( - Arrays.asList( - "ANALOG Mode", - "Only use this mode with ONE transmitter in total,", - "no logic involved")) - .setPos(spaceX * 4, spaceY * 2)); - } - } - - public enum GateMode { - AND, - NAND, - OR, - NOR, - SINGLE_SOURCE - } - - public static class ReceiverData extends GT_Cover_AdvancedWirelessRedstoneBase.WirelessData { - - private GateMode mode; - - public ReceiverData(int frequency, UUID uuid, GateMode mode) { - super(frequency, uuid); - this.mode = mode; - } - - public ReceiverData() { - this(0, null, GateMode.AND); - } - - public GateMode getGateMode() { - return mode; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new ReceiverData(frequency, uuid, mode); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); - tag.setByte("mode", (byte) mode.ordinal()); - - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - super.writeToByteBuf(aBuf); - aBuf.writeByte(mode.ordinal()); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - super.loadDataFromNBT(aNBT); - - NBTTagCompound tag = (NBTTagCompound) aNBT; - mode = GateMode.values()[tag.getByte("mode")]; - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - super.readFromPacket(aBuf, aPlayer); - mode = GateMode.values()[aBuf.readByte()]; - - return this; - } - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java deleted file mode 100644 index a8a30de9b1..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java +++ /dev/null @@ -1,35 +0,0 @@ -package gregtech.common.covers.redstone; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; - -public class GT_Cover_AdvancedRedstoneReceiverExternal extends GT_Cover_AdvancedRedstoneReceiverBase { - - public GT_Cover_AdvancedRedstoneReceiverExternal(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public ReceiverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ReceiverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - aTileEntity.setOutputRedstoneSignal( - side, - getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode())); - - return aCoverVariable; - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return false; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable, - ICoverable aTileEntity) { - return true; - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java deleted file mode 100644 index 5553cb7c9c..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java +++ /dev/null @@ -1,42 +0,0 @@ -package gregtech.common.covers.redstone; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; - -public class GT_Cover_AdvancedRedstoneReceiverInternal extends GT_Cover_AdvancedRedstoneReceiverBase { - - public GT_Cover_AdvancedRedstoneReceiverInternal(ITexture coverTexture) { - super(coverTexture); - } - - @Override - public ReceiverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ReceiverData aCoverVariable, ICoverable aTileEntity, long aTimer) { - if (aTileEntity instanceof IMachineProgress machine) { - if (getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity) > 0) { - machine.enableWorking(); - } else { - machine.disableWorking(); - } - - machine.setWorkDataValue(aInputRedstone); - } - - return aCoverVariable; - } - - @Override - protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ReceiverData aCoverVariable, ICoverable aTileEntity) { - return getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode()); - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return true; - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java deleted file mode 100644 index 3417542bec..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java +++ /dev/null @@ -1,188 +0,0 @@ -package gregtech.common.covers.redstone; - -import java.util.Objects; -import java.util.UUID; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public abstract class GT_Cover_AdvancedRedstoneTransmitterBase - extends GT_Cover_AdvancedWirelessRedstoneBase { - - public GT_Cover_AdvancedRedstoneTransmitterBase(Class typeToken, ITexture coverTexture) { - super(typeToken, coverTexture); - } - - private static void unregisterSignal(ForgeDirection side, TransmitterData aCoverVariable, ICoverable aTileEntity) { - final long hash = hashCoverCoords(aTileEntity, side); - removeSignalAt(aCoverVariable.uuid, aCoverVariable.frequency, hash); - } - - @Override - public boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, - ICoverable aTileEntity, boolean aForced) { - unregisterSignal(side, aCoverVariable, aTileEntity); - return true; - } - - @Override - protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, - ICoverable aTileEntity) { - unregisterSignal(side, aCoverVariable, aTileEntity); - } - - @Override - protected T onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { - aCoverVariable.invert = !aCoverVariable.invert; - GT_Utility.sendChatToPlayer( - aPlayer, - aCoverVariable.invert ? GT_Utility.trans("054", "Inverted") : GT_Utility.trans("055", "Normal")); - - return aCoverVariable; - } - - @Override - protected void preDataChangedImpl(ForgeDirection side, int aCoverID, int aNewCoverId, T aCoverVariable, - T aNewCoverVariable, ICoverable aTileEntity) { - if (aCoverVariable.frequency != aNewCoverVariable.frequency - || !Objects.equals(aCoverVariable.uuid, aNewCoverVariable.uuid)) { - unregisterSignal(side, aCoverVariable, aTileEntity); - } - } - - public static class TransmitterData extends GT_Cover_AdvancedWirelessRedstoneBase.WirelessData { - - protected boolean invert; - - public TransmitterData(int frequency, UUID uuid, boolean invert) { - super(frequency, uuid); - this.invert = invert; - } - - public TransmitterData() { - this(0, null, false); - } - - public boolean isInvert() { - return invert; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new TransmitterData(frequency, uuid, invert); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); - tag.setBoolean("invert", invert); - - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - super.writeToByteBuf(aBuf); - aBuf.writeBoolean(invert); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - super.loadDataFromNBT(aNBT); - - NBTTagCompound tag = (NBTTagCompound) aNBT; - invert = tag.getBoolean("invert"); - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - super.readFromPacket(aBuf, aPlayer); - invert = aBuf.readBoolean(); - - return this; - } - } - - // GUI stuff - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new AdvancedRedstoneTransmitterBaseUIFactory(buildContext).createWindow(); - } - - protected class AdvancedRedstoneTransmitterBaseUIFactory extends AdvancedWirelessRedstoneBaseUIFactory { - - public AdvancedRedstoneTransmitterBaseUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getFrequencyRow() { - return 0; - } - - @Override - protected int getButtonRow() { - return 1; - } - - @Override - protected boolean isShiftPrivateLeft() { - return true; - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - super.addUIWidgets(builder); - builder.widget(TextWidget.dynamicString(() -> { - T coverData = getCoverData(); - if (coverData != null) { - return getCoverData().invert ? GT_Utility.trans("INVERTED", "Inverted") - : GT_Utility.trans("NORMAL", "Normal"); - } else { - return ""; - } - }) - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 10, 4 + startY + spaceY * getButtonRow())); - } - - @Override - protected void addUIForDataController(CoverDataControllerWidget controller) { - super.addUIForDataController(controller); - controller.addFollower( - CoverDataFollower_ToggleButtonWidget.ofRedstone(), - coverData -> coverData.invert, - (coverData, state) -> { - coverData.invert = state; - return coverData; - }, - widget -> widget.addTooltip(0, GT_Utility.trans("NORMAL", "Normal")) - .addTooltip(1, GT_Utility.trans("INVERTED", "Inverted")) - .setPos(spaceX * 9, spaceY * getButtonRow())); - } - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java deleted file mode 100644 index 139ec64843..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java +++ /dev/null @@ -1,51 +0,0 @@ -package gregtech.common.covers.redstone; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; - -public class GT_Cover_AdvancedRedstoneTransmitterExternal - extends GT_Cover_AdvancedRedstoneTransmitterBase { - - public GT_Cover_AdvancedRedstoneTransmitterExternal(ITexture coverTexture) { - super(TransmitterData.class, coverTexture); - } - - @Override - public TransmitterData createDataObject() { - return new TransmitterData(); - } - - @Override - public TransmitterData createDataObject(int aLegacyData) { - return createDataObject(); - } - - @Override - public TransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - TransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - byte outputRedstone = aInputRedstone; - if (aCoverVariable.isInvert()) { - if (outputRedstone > 0) outputRedstone = 0; - else outputRedstone = 15; - } - - final long hash = hashCoverCoords(aTileEntity, side); - setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone); - - return aCoverVariable; - } - - @Override - protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, - ICoverable aTileEntity, long aTimer) { - return true; - } - - @Override - public boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java deleted file mode 100644 index 01a46fcc86..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java +++ /dev/null @@ -1,50 +0,0 @@ -package gregtech.common.covers.redstone; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; - -public class GT_Cover_AdvancedRedstoneTransmitterInternal - extends GT_Cover_AdvancedRedstoneTransmitterBase { - - public GT_Cover_AdvancedRedstoneTransmitterInternal(ITexture coverTexture) { - super(TransmitterData.class, coverTexture); - } - - @Override - public TransmitterData createDataObject() { - return new TransmitterData(); - } - - @Override - public TransmitterData createDataObject(int aLegacyData) { - return createDataObject(); - } - - @Override - public TransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - TransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - byte outputRedstone = aTileEntity.getOutputRedstoneSignal(side); - if (aCoverVariable.isInvert()) { - if (outputRedstone > 0) outputRedstone = 0; - else outputRedstone = 15; - } - - final long hash = hashCoverCoords(aTileEntity, side); - setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone); - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - TransmitterData aCoverVariable, ICoverable aTileEntity) { - return true; - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java deleted file mode 100644 index 6ee9e2480f..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java +++ /dev/null @@ -1,298 +0,0 @@ -package gregtech.common.covers.redstone; - -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public abstract class GT_Cover_AdvancedWirelessRedstoneBase - extends GT_CoverBehaviorBase { - - public GT_Cover_AdvancedWirelessRedstoneBase(Class typeToken, ITexture coverTexture) { - super(typeToken, coverTexture); - } - - public static Byte getSignalAt(UUID uuid, int frequency, GT_Cover_AdvancedRedstoneReceiverBase.GateMode mode) { - Map> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid)); - if (frequencies == null) return 0; - - Map signals = frequencies.get(frequency); - if (signals == null) signals = new ConcurrentHashMap<>(); - - switch (mode) { - case AND -> { - return (byte) (signals.values() - .stream() - .map(signal -> signal > 0) - .reduce(true, (signalA, signalB) -> signalA && signalB) ? 15 : 0); - } - case NAND -> { - return (byte) (signals.values() - .stream() - .map(signal -> signal > 0) - .reduce(true, (signalA, signalB) -> signalA && signalB) ? 0 : 15); - } - case OR -> { - return (byte) (signals.values() - .stream() - .map(signal -> signal > 0) - .reduce(false, (signalA, signalB) -> signalA || signalB) ? 15 : 0); - } - case NOR -> { - return (byte) (signals.values() - .stream() - .map(signal -> signal > 0) - .reduce(false, (signalA, signalB) -> signalA || signalB) ? 0 : 15); - } - case SINGLE_SOURCE -> { - if (signals.values() - .isEmpty()) { - return 0; - } - return signals.values() - .iterator() - .next(); - } - default -> { - return 0; - } - } - } - - public static void removeSignalAt(UUID uuid, int frequency, long hash) { - Map> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid)); - if (frequencies == null) return; - frequencies.computeIfPresent(frequency, (freq, longByteMap) -> { - longByteMap.remove(hash); - return longByteMap.isEmpty() ? null : longByteMap; - }); - } - - public static void setSignalAt(UUID uuid, int frequency, long hash, byte value) { - Map> frequencies = GregTech_API.sAdvancedWirelessRedstone - .computeIfAbsent(String.valueOf(uuid), k -> new ConcurrentHashMap<>()); - Map signals = frequencies.computeIfAbsent(frequency, k -> new ConcurrentHashMap<>()); - signals.put(hash, value); - } - - /** - * x hashed into first 20 bytes y hashed into second 20 bytes z hashed into fifth 10 bytes dim hashed into sixth 10 - * bytes side hashed into last 4 bytes - */ - public static long hashCoverCoords(ICoverable tile, ForgeDirection side) { - return (((((long) tile.getXCoord() << 20) + tile.getZCoord() << 10) + tile.getYCoord() << 10) - + tile.getWorld().provider.dimensionId << 4) + side.ordinal(); - } - - @Override - public boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot, - ICoverable aTileEntity) { - return true; - } - - @Override - public String getDescriptionImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return GT_Utility.trans("081", "Frequency: ") + aCoverVariable.frequency - + ", Transmission: " - + (aCoverVariable.uuid == null ? "Public" : "Private"); - } - - @Override - public int getTickRateImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) { - return 5; - } - - public abstract static class WirelessData implements ISerializableObject { - - protected int frequency; - - /** - * If UUID is set to null, the cover frequency is public, rather than private - **/ - protected UUID uuid; - - public WirelessData(int frequency, UUID uuid) { - this.frequency = frequency; - this.uuid = uuid; - } - - public UUID getUuid() { - return uuid; - } - - public int getFrequency() { - return frequency; - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("frequency", frequency); - if (uuid != null) { - tag.setString("uuid", uuid.toString()); - } - - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - aBuf.writeInt(frequency); - aBuf.writeBoolean(uuid != null); - if (uuid != null) { - aBuf.writeLong(uuid.getLeastSignificantBits()); - aBuf.writeLong(uuid.getMostSignificantBits()); - } - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; - frequency = tag.getInteger("frequency"); - if (tag.hasKey("uuid")) { - uuid = UUID.fromString(tag.getString("uuid")); - } - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - frequency = aBuf.readInt(); - if (aBuf.readBoolean()) { - uuid = new UUID(aBuf.readLong(), aBuf.readLong()); - } - - return this; - } - } - - // GUI stuff - - @Override - public boolean hasCoverGUI() { - return true; - } - - protected abstract class AdvancedWirelessRedstoneBaseUIFactory extends UIFactory { - - protected static final int startX = 10; - protected static final int startY = 25; - protected static final int spaceX = 18; - protected static final int spaceY = 18; - - public AdvancedWirelessRedstoneBaseUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getGUIWidth() { - return 250; - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - final int privateExtraColumn = isShiftPrivateLeft() ? 1 : 5; - - CoverDataControllerWidget dataController = new CoverDataControllerWidget<>( - this::getCoverData, - this::setCoverData, - GT_Cover_AdvancedWirelessRedstoneBase.this); - dataController.setPos(startX, startY); - addUIForDataController(dataController); - - builder.widget(dataController) - .widget( - new TextWidget(GT_Utility.trans("246", "Frequency")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5, 4 + startY + spaceY * getFrequencyRow())) - .widget( - new TextWidget(GT_Utility.trans("602", "Use Private Frequency")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * privateExtraColumn, 4 + startY + spaceY * getButtonRow())); - } - - protected void addUIForDataController(CoverDataControllerWidget controller) { - controller.addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.frequency, - (coverData, state) -> { - coverData.frequency = state.intValue(); - return coverData; - }, - widget -> widget.setScrollValues(1, 1000, 10) - .setBounds(0, Integer.MAX_VALUE) - .setPos(1, 2 + spaceY * getFrequencyRow()) - .setSize(spaceX * 5 - 4, 12)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofCheck(), - coverData -> coverData.uuid != null, - (coverData, state) -> { - if (state) { - coverData.uuid = getUIBuildContext().getPlayer() - .getUniqueID(); - } else { - coverData.uuid = null; - } - return coverData; - }, - widget -> widget.setPos(0, spaceY * getButtonRow())); - } - - protected abstract int getFrequencyRow(); - - protected abstract int getButtonRow(); - - protected abstract boolean isShiftPrivateLeft(); - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java deleted file mode 100644 index 724f12b8f8..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java +++ /dev/null @@ -1,245 +0,0 @@ -package gregtech.common.covers.redstone; - -import java.util.UUID; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.covers.redstone.GT_Cover_WirelessDoesWorkDetector.ActivityMode; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_WirelessDoesWorkDetector - extends GT_Cover_AdvancedRedstoneTransmitterBase { - - public GT_Cover_WirelessDoesWorkDetector(ITexture coverTexture) { - super(ActivityTransmitterData.class, coverTexture); - } - - @Override - public ActivityTransmitterData createDataObject() { - return new ActivityTransmitterData(); - } - - @Override - public ActivityTransmitterData createDataObject(int aLegacyData) { - return createDataObject(); - } - - private static byte computeSignalBasedOnActivity(ActivityTransmitterData coverVariable, ICoverable tileEntity) { - - if (tileEntity instanceof IMachineProgress) { - IMachineProgress mProgress = (IMachineProgress) tileEntity; - boolean inverted = coverVariable.invert; - int signal = 0; - - switch (coverVariable.mode) { - case MACHINE_ENABLED -> signal = inverted == mProgress.isAllowedToWork() ? 0 : 15; - case MACHINE_IDLE -> signal = inverted == (mProgress.getMaxProgress() == 0) ? 0 : 15; - case RECIPE_PROGRESS -> { - int tScale = mProgress.getMaxProgress() / 15; - - if (tScale > 0 && mProgress.hasThingsToDo()) { - signal = inverted ? (15 - mProgress.getProgress() / tScale) - : (mProgress.getProgress() / tScale); - } else { - signal = inverted ? 15 : 0; - } - } - } - - return (byte) signal; - } else { - return (byte) 0; - } - - } - - @Override - public ActivityTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ActivityTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - final byte signal = computeSignalBasedOnActivity(aCoverVariable, aTileEntity); - final long hash = hashCoverCoords(aTileEntity, side); - setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); - - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ActivityTransmitterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - ActivityTransmitterData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRateImpl(ForgeDirection side, int aCoverID, ActivityTransmitterData aCoverVariable, - ICoverable aTileEntity) { - return 5; - } - - public enum ActivityMode { - RECIPE_PROGRESS, - MACHINE_IDLE, - MACHINE_ENABLED, - } - - public static class ActivityTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData { - - private ActivityMode mode; - - public ActivityTransmitterData(int frequency, UUID uuid, boolean invert, ActivityMode mode) { - super(frequency, uuid, invert); - this.mode = mode; - } - - public ActivityTransmitterData() { - super(); - this.mode = ActivityMode.MACHINE_IDLE; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new ActivityTransmitterData(frequency, uuid, invert, mode); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); - tag.setInteger("mode", mode.ordinal()); - - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - super.writeToByteBuf(aBuf); - aBuf.writeInt(mode.ordinal()); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - super.loadDataFromNBT(aNBT); - - NBTTagCompound tag = (NBTTagCompound) aNBT; - mode = ActivityMode.values()[tag.getInteger("mode")]; - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - super.readFromPacket(aBuf, aPlayer); - mode = ActivityMode.values()[aBuf.readInt()]; - - return this; - } - } - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new WirelessActivityDetectorUIFactory(buildContext).createWindow(); - } - - private class WirelessActivityDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { - - public WirelessActivityDetectorUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getGUIHeight() { - return 107; - } - - @Override - protected int getFrequencyRow() { - return 0; - } - - @Override - protected int getButtonRow() { - return 1; - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - super.addUIWidgets(builder); - builder.widget(TextWidget.dynamicString(() -> { - - ActivityMode mode = getCoverData().mode; - - if (mode == ActivityMode.MACHINE_ENABLED) { - return GT_Utility.trans("271", "Machine enabled"); - } else if (mode == ActivityMode.MACHINE_IDLE) { - return GT_Utility.trans("242", "Machine idle"); - } else { - return GT_Utility.trans("241", "Recipe progress"); - } - - }) - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 3, 4 + startY + spaceY * 2)); - } - - @Override - protected void addUIForDataController(CoverDataControllerWidget controller) { - super.addUIForDataController(controller); - - controller.addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == ActivityMode.RECIPE_PROGRESS, - (coverData, state) -> { - coverData.mode = ActivityMode.RECIPE_PROGRESS; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_PROGRESS) - .addTooltip(GT_Utility.trans("241", "Recipe progress")) - .setPos(spaceX * 0, spaceY * 2)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == ActivityMode.MACHINE_IDLE, - (coverData, state) -> { - coverData.mode = ActivityMode.MACHINE_IDLE; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK) - .addTooltip(GT_Utility.trans("242", "Machine idle")) - .setPos(spaceX * 1, spaceY * 2)) - .addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == ActivityMode.MACHINE_ENABLED, - (coverData, state) -> { - coverData.mode = ActivityMode.MACHINE_ENABLED; - return coverData; - }, - widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON) - .addTooltip(GT_Utility.trans("271", "Machine enabled")) - .setPos(spaceX * 2, spaceY * 2)); - } - } - -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java deleted file mode 100644 index 9a9d419be6..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java +++ /dev/null @@ -1,186 +0,0 @@ -package gregtech.common.covers.redstone; - -import java.util.Arrays; -import java.util.UUID; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidHandler; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.covers.GT_Cover_LiquidMeter; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_WirelessFluidDetector - extends GT_Cover_AdvancedRedstoneTransmitterBase { - - public GT_Cover_WirelessFluidDetector(ITexture coverTexture) { - super(FluidTransmitterData.class, coverTexture); - } - - @Override - public FluidTransmitterData createDataObject() { - return new FluidTransmitterData(); - } - - @Override - public FluidTransmitterData createDataObject(int aLegacyData) { - return createDataObject(); - } - - @Override - public FluidTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - FluidTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - final byte signal = GT_Cover_LiquidMeter - .computeSignalBasedOnFluid(aTileEntity, aCoverVariable.invert, aCoverVariable.threshold); - final long hash = hashCoverCoords(aTileEntity, side); - setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); - - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidTransmitterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - FluidTransmitterData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - public static class FluidTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData { - - /** The special value {@code 0} means threshold check is disabled. */ - private int threshold; - - public FluidTransmitterData(int frequency, UUID uuid, boolean invert, int threshold) { - super(frequency, uuid, invert); - this.threshold = threshold; - } - - public FluidTransmitterData() { - super(); - this.threshold = 0; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new FluidTransmitterData(frequency, uuid, invert, threshold); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); - tag.setInteger("threshold", threshold); - - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - super.writeToByteBuf(aBuf); - aBuf.writeInt(threshold); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - super.loadDataFromNBT(aNBT); - - NBTTagCompound tag = (NBTTagCompound) aNBT; - threshold = tag.getInteger("threshold"); - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - super.readFromPacket(aBuf, aPlayer); - threshold = aBuf.readInt(); - - return this; - } - } - - // GUI stuff - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new WirelessFluidDetectorUIFactory(buildContext).createWindow(); - } - - private class WirelessFluidDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { - - private int maxCapacity; - - public WirelessFluidDetectorUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getFrequencyRow() { - return 0; - } - - @Override - protected int getButtonRow() { - return 1; - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - setMaxCapacity(); - super.addUIWidgets(builder); - builder.widget( - new TextWidget(GT_Utility.trans("222", "Fluid threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2)); - } - - @Override - protected void addUIForDataController(CoverDataControllerWidget controller) { - super.addUIForDataController(controller); - controller.addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.threshold, - (coverData, state) -> { - coverData.threshold = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(0, maxCapacity > 0 ? maxCapacity : Integer.MAX_VALUE) - .setScrollValues(1000, 144, 100000) - .setFocusOnGuiOpen(true) - .setPos(1, 2 + spaceY * 2) - .setSize(spaceX * 5 - 4, 12)); - } - - private void setMaxCapacity() { - final ICoverable tile = getUIBuildContext().getTile(); - if (!tile.isDead() && tile instanceof IFluidHandler) { - FluidTankInfo[] tanks = ((IFluidHandler) tile).getTankInfo(ForgeDirection.UNKNOWN); - maxCapacity = Arrays.stream(tanks) - .mapToInt(tank -> tank.capacity) - .sum(); - } else { - maxCapacity = -1; - } - } - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java deleted file mode 100644 index 3cc7f60984..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java +++ /dev/null @@ -1,262 +0,0 @@ -package gregtech.common.covers.redstone; - -import java.text.FieldPosition; -import java.util.UUID; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.covers.GT_Cover_ItemMeter; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget; -import gregtech.common.gui.modularui.widget.ItemWatcherSlotWidget; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_WirelessItemDetector - extends GT_Cover_AdvancedRedstoneTransmitterBase { - - public GT_Cover_WirelessItemDetector(ITexture coverTexture) { - super(ItemTransmitterData.class, coverTexture); - } - - @Override - public ItemTransmitterData createDataObject() { - return new ItemTransmitterData(); - } - - @Override - public ItemTransmitterData createDataObject(int aLegacyData) { - return createDataObject(); - } - - @Override - public ItemTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - ItemTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - byte signal = GT_Cover_ItemMeter.computeSignalBasedOnItems( - aTileEntity, - aCoverVariable.invert, - aCoverVariable.threshold, - aCoverVariable.slot, - side.ordinal()); - final long hash = hashCoverCoords(aTileEntity, side); - setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); - - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ItemTransmitterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - ItemTransmitterData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - public static class ItemTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData { - - /** - * The special value {@code -1} means all slots. - */ - private int slot; - /** - * The special value {@code 0} means threshold check is disabled. - */ - private int threshold; - - public ItemTransmitterData(int frequency, UUID uuid, boolean invert, int threshold, int slot) { - super(frequency, uuid, invert); - this.threshold = threshold; - this.slot = slot; - } - - public ItemTransmitterData() { - super(); - this.threshold = 0; - this.slot = -1; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new ItemTransmitterData(frequency, uuid, invert, threshold, slot); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); - tag.setInteger("threshold", threshold); - tag.setInteger("slot", slot); - - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - super.writeToByteBuf(aBuf); - aBuf.writeInt(threshold); - aBuf.writeInt(slot); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - super.loadDataFromNBT(aNBT); - - NBTTagCompound tag = (NBTTagCompound) aNBT; - threshold = tag.getInteger("threshold"); - slot = tag.getInteger("slot"); - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - super.readFromPacket(aBuf, aPlayer); - threshold = aBuf.readInt(); - slot = aBuf.readInt(); - - return this; - } - } - - // GUI stuff - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new WirelessItemDetectorUIFactory(buildContext).createWindow(); - } - - private class WirelessItemDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { - - private int maxSlot; - private int maxThreshold; - /** - * Display the text "All" instead of a number when the slot is set to -1. - */ - private static final NumberFormatMUI numberFormatAll = new NumberFormatMUI() { - - @Override - public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { - if (number < 0) { - return toAppendTo.append(GT_Utility.trans("ALL", "All")); - } else { - return super.format(number, toAppendTo, pos); - } - } - }; - - public WirelessItemDetectorUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getFrequencyRow() { - return 0; - } - - @Override - protected int getButtonRow() { - return 1; - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - setMaxSlot(); - setMaxThreshold(); - super.addUIWidgets(builder); - builder.widget( - new ItemWatcherSlotWidget().setGetter(this::getTargetItem) - .setPos(startX + spaceX * 4 - 1, startY + spaceY * 3)) - .widget( - new TextWidget(GT_Utility.trans("221", "Item threshold")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2)) - .widget( - new TextWidget(GT_Utility.trans("254", "Detect Slot #")).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * 5, 4 + startY + spaceY * 3)); - } - - @Override - protected void addUIForDataController(CoverDataControllerWidget controller) { - super.addUIForDataController(controller); - controller.addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.threshold, - (coverData, state) -> { - coverData.threshold = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(0, maxThreshold) - .setScrollValues(1, 64, 1000) - .setFocusOnGuiOpen(true) - .setPos(1, 2 + spaceY * 2) - .setSize(spaceX * 5 - 4, 12)) - .addFollower( - new CoverDataFollower_NumericWidget<>(), - coverData -> (double) coverData.slot, - (coverData, state) -> { - coverData.slot = state.intValue(); - return coverData; - }, - widget -> widget.setBounds(-1, maxSlot) - .setDefaultValue(-1) - .setScrollValues(1, 100, 10) - .setNumberFormat(numberFormatAll) - .setPos(1, 2 + spaceY * 3) - .setSize(spaceX * 4 - 8, 12)); - } - - private void setMaxSlot() { - final ICoverable tile = getUIBuildContext().getTile(); - if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile - && !(gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase)) { - maxSlot = tile.getSizeInventory() - 1; - } else { - maxSlot = -1; - } - } - - private void setMaxThreshold() { - final ICoverable tile = getUIBuildContext().getTile(); - if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile - && gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase) { - maxThreshold = gtTile.getMaxItemCount(); - } else { - maxThreshold = maxSlot > 0 ? maxSlot * 64 : Integer.MAX_VALUE; - } - } - - private ItemStack getTargetItem() { - final ICoverable tile = getUIBuildContext().getTile(); - final ItemTransmitterData coverVariable = getCoverData(); - if (coverVariable != null && coverVariable.slot >= 0 - && tile instanceof TileEntity - && !tile.isDead() - && tile.getSizeInventory() >= coverVariable.slot) { - return tile.getStackInSlot(coverVariable.slot); - } else { - return null; - } - } - } -} diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java deleted file mode 100644 index f6c76591df..0000000000 --- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java +++ /dev/null @@ -1,242 +0,0 @@ -package gregtech.common.covers.redstone; - -import java.util.UUID; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.io.ByteArrayDataInput; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.util.ISerializableObject; -import gregtech.common.covers.GT_Cover_NeedMaintainance; -import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; -import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; -import io.netty.buffer.ByteBuf; - -public class GT_Cover_WirelessMaintenanceDetector - extends GT_Cover_AdvancedRedstoneTransmitterBase { - - public GT_Cover_WirelessMaintenanceDetector(ITexture coverTexture) { - super(MaintenanceTransmitterData.class, coverTexture); - } - - @Override - public MaintenanceTransmitterData createDataObject() { - return new MaintenanceTransmitterData(); - } - - @Override - public MaintenanceTransmitterData createDataObject(int aLegacyData) { - return createDataObject(); - } - - private static byte computeSignalBasedOnMaintenance(MaintenanceTransmitterData coverVariable, - ICoverable tileEntity) { - boolean signal = false; - - if (tileEntity instanceof IGregTechTileEntity) { - IMetaTileEntity metaTE = ((IGregTechTileEntity) tileEntity).getMetaTileEntity(); - if (metaTE instanceof GT_MetaTileEntity_MultiBlockBase multiTE) { - int ideal = multiTE.getIdealStatus(); - int real = multiTE.getRepairStatus(); - - switch (coverVariable.mode) { - case NO_ISSUE -> signal = ideal == real; - case ONE_ISSUE, TWO_ISSUES, THREE_ISSUES, FOUR_ISSUES, FIVE_ISSUES -> signal = ideal - real - >= coverVariable.mode.ordinal(); - case ROTOR_80, ROTOR_100 -> { - ItemStack rotor = multiTE.getRealInventory()[1]; - if (GT_Cover_NeedMaintainance.isRotor(rotor)) { - long max = GT_MetaGenerated_Tool.getToolMaxDamage(rotor); - long current = GT_MetaGenerated_Tool.getToolDamage(rotor); - - if (coverVariable.mode == MaintenanceMode.ROTOR_80) { - signal = current >= max * 8 / 10; - } else { - long expectedDamage = Math.round( - Math.min( - (double) multiTE.mEUt / multiTE.damageFactorLow, - Math.pow(multiTE.mEUt, multiTE.damageFactorHigh))); - signal = current + expectedDamage * 2 >= max; - } - } else { - signal = true; - } - } - } - } - } - - if (coverVariable.invert) { - signal = !signal; - } - - return (byte) (signal ? 15 : 0); - } - - @Override - public MaintenanceTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, - MaintenanceTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) { - final byte signal = computeSignalBasedOnMaintenance(aCoverVariable, aTileEntity); - final long hash = hashCoverCoords(aTileEntity, side); - setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal); - - return aCoverVariable; - } - - @Override - public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, MaintenanceTransmitterData aCoverVariable, - ICoverable aTileEntity) { - return true; - } - - @Override - protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, - MaintenanceTransmitterData aCoverVariable, ICoverable aTileEntity) { - return true; - } - - @Override - public int getTickRateImpl(ForgeDirection side, int aCoverID, MaintenanceTransmitterData aCoverVariable, - ICoverable aTileEntity) { - return 60; - } - - public enum MaintenanceMode { - NO_ISSUE, - ONE_ISSUE, - TWO_ISSUES, - THREE_ISSUES, - FOUR_ISSUES, - FIVE_ISSUES, - ROTOR_80, - ROTOR_100 - } - - public static class MaintenanceTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData { - - private MaintenanceMode mode; - - public MaintenanceTransmitterData(int frequency, UUID uuid, boolean invert, MaintenanceMode mode) { - super(frequency, uuid, invert); - this.mode = mode; - } - - public MaintenanceTransmitterData() { - super(); - this.mode = MaintenanceMode.ONE_ISSUE; - } - - @Nonnull - @Override - public ISerializableObject copy() { - return new MaintenanceTransmitterData(frequency, uuid, invert, mode); - } - - @Nonnull - @Override - public NBTBase saveDataToNBT() { - NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT(); - tag.setInteger("mode", mode.ordinal()); - - return tag; - } - - @Override - public void writeToByteBuf(ByteBuf aBuf) { - super.writeToByteBuf(aBuf); - aBuf.writeInt(mode.ordinal()); - } - - @Override - public void loadDataFromNBT(NBTBase aNBT) { - super.loadDataFromNBT(aNBT); - - NBTTagCompound tag = (NBTTagCompound) aNBT; - mode = MaintenanceMode.values()[tag.getInteger("mode")]; - } - - @Nonnull - @Override - public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { - super.readFromPacket(aBuf, aPlayer); - mode = MaintenanceMode.values()[aBuf.readInt()]; - - return this; - } - } - - // GUI stuff - - private static final String[] extraTexts = new String[] { "No Issues", ">= 1 Issue", ">= 2 Issues", ">= 3 Issues", - ">= 4 Issues", ">= 5 Issues", "Rotor < 20%", "Rotor ≈ 0%" }; - - @Override - public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { - return new WirelessMaintenanceDetectorUIFactory(buildContext).createWindow(); - } - - private class WirelessMaintenanceDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory { - - public WirelessMaintenanceDetectorUIFactory(GT_CoverUIBuildContext buildContext) { - super(buildContext); - } - - @Override - protected int getGUIHeight() { - return 143; - } - - @Override - protected int getFrequencyRow() { - return 0; - } - - @Override - protected int getButtonRow() { - return 1; - } - - @Override - protected void addUIWidgets(ModularWindow.Builder builder) { - super.addUIWidgets(builder); - for (int i = 0; i < 8; i++) { - builder.widget( - new TextWidget(extraTexts[i]).setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(startX + spaceX * (i % 2 == 0 ? 1 : 7), 4 + startY + spaceY * (2 + i / 2))); - } - } - - @Override - protected void addUIForDataController(CoverDataControllerWidget controller) { - super.addUIForDataController(controller); - for (int i = 0; i < 8; i++) { - final int index = i; - controller.addFollower( - CoverDataFollower_ToggleButtonWidget.ofDisableable(), - coverData -> coverData.mode == MaintenanceMode.values()[index], - (coverData, state) -> { - coverData.mode = MaintenanceMode.values()[index]; - return coverData; - }, - widget -> widget.setToggleTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK, GT_UITextures.TRANSPARENT) - .setPos(spaceX * (index % 2 == 0 ? 0 : 6), spaceY * (2 + index / 2))); - } - } - } -} diff --git a/src/main/java/gregtech/common/entities/EntityFXPollution.java b/src/main/java/gregtech/common/entities/EntityFXPollution.java new file mode 100644 index 0000000000..facd3d3364 --- /dev/null +++ b/src/main/java/gregtech/common/entities/EntityFXPollution.java @@ -0,0 +1,59 @@ +package gregtech.common.entities; + +import java.util.Random; + +import net.minecraft.client.particle.EntityFX; +import net.minecraft.world.World; + +public class EntityFXPollution extends EntityFX { + + public EntityFXPollution(World world, double x, double y, double z) { + super(world, x, y, z, 0, 0, 0); + + this.particleRed = 0.25F; + this.particleGreen = 0.2F; + this.particleBlue = 0.25F; + + this.motionX *= 0.1D; + this.motionY *= -0.1D; + this.motionZ *= 0.1F; + + Random random = world.rand; + this.motionX += random.nextFloat() * -1.9D * random.nextFloat() * 0.1D; + this.motionY += random.nextFloat() * -0.5D * random.nextFloat() * 0.1D * 5.0D; + this.motionZ += random.nextFloat() * -1.9D * random.nextFloat() * 0.1D; + + this.particleTextureIndexX = 0; + this.particleTextureIndexY = 0; + + this.particleMaxAge = (int) ((double) 20 / ((double) random.nextFloat() * 0.8D + 0.2D)); + + this.particleScale *= 0.75F; + this.noClip = true; + } + + @Override + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + + if (this.particleAge++ >= this.particleMaxAge) { + this.setDead(); + } else { + this.motionY -= 5.0E-4D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + if (this.posY == this.prevPosY) { + this.motionX *= 1.1D; + this.motionZ *= 1.1D; + } + this.motionX *= 0.96D; + this.motionY *= 0.96D; + this.motionZ *= 0.96D; + if (this.onGround) { + this.motionX *= 0.7D; + this.motionZ *= 0.7D; + } + } + } +} diff --git a/src/main/java/gregtech/common/entities/GT_EntityFXPollution.java b/src/main/java/gregtech/common/entities/GT_EntityFXPollution.java deleted file mode 100644 index d5121a38ad..0000000000 --- a/src/main/java/gregtech/common/entities/GT_EntityFXPollution.java +++ /dev/null @@ -1,59 +0,0 @@ -package gregtech.common.entities; - -import java.util.Random; - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.world.World; - -public class GT_EntityFXPollution extends EntityFX { - - public GT_EntityFXPollution(World world, double x, double y, double z) { - super(world, x, y, z, 0, 0, 0); - - this.particleRed = 0.25F; - this.particleGreen = 0.2F; - this.particleBlue = 0.25F; - - this.motionX *= 0.1D; - this.motionY *= -0.1D; - this.motionZ *= 0.1F; - - Random random = world.rand; - this.motionX += random.nextFloat() * -1.9D * random.nextFloat() * 0.1D; - this.motionY += random.nextFloat() * -0.5D * random.nextFloat() * 0.1D * 5.0D; - this.motionZ += random.nextFloat() * -1.9D * random.nextFloat() * 0.1D; - - this.particleTextureIndexX = 0; - this.particleTextureIndexY = 0; - - this.particleMaxAge = (int) ((double) 20 / ((double) random.nextFloat() * 0.8D + 0.2D)); - - this.particleScale *= 0.75F; - this.noClip = true; - } - - @Override - public void onUpdate() { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - if (this.particleAge++ >= this.particleMaxAge) { - this.setDead(); - } else { - this.motionY -= 5.0E-4D; - this.moveEntity(this.motionX, this.motionY, this.motionZ); - if (this.posY == this.prevPosY) { - this.motionX *= 1.1D; - this.motionZ *= 1.1D; - } - this.motionX *= 0.96D; - this.motionY *= 0.96D; - this.motionZ *= 0.96D; - if (this.onGround) { - this.motionX *= 0.7D; - this.motionZ *= 0.7D; - } - } - } -} diff --git a/src/main/java/gregtech/common/fluid/GTFluid.java b/src/main/java/gregtech/common/fluid/GTFluid.java new file mode 100644 index 0000000000..3969817ee9 --- /dev/null +++ b/src/main/java/gregtech/common/fluid/GTFluid.java @@ -0,0 +1,209 @@ +package gregtech.common.fluid; + +import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.FluidState; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.fluid.IGTFluid; +import gregtech.api.interfaces.fluid.IGTRegisteredFluid; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class GTFluid extends Fluid implements IGTFluid, IGTRegisteredFluid, Runnable { + + private final String localizedName; + private final ResourceLocation stillIconResourceLocation; + private final ResourceLocation flowingIconResourceLocation; + private final short[] colorRGBA; + private final FluidState fluidState; + private final Fluid iconsFrom; + private Fluid registeredFluid; + + /** + * Constructs this {@link IGTFluid} implementation from an {@link GTFluidBuilder} instance + * + * @param builder The {@link GTFluidBuilder} instance to construct this {@link IGTFluid} implementation + */ + protected GTFluid(@Nonnull final GTFluidBuilder builder) { + super(builder.fluidName); + this.localizedName = builder.localizedName; + this.stillIconResourceLocation = builder.stillIconResourceLocation; + this.flowingIconResourceLocation = builder.flowingIconResourceLocation; + this.iconsFrom = builder.iconsFrom; + this.block = builder.fluidBlock; + this.colorRGBA = builder.colorRGBA; + this.fluidState = builder.fluidState; + this.temperature = builder.temperature; + configureFromStateTemperature(); + } + + /** + * Adjusts this {@link Fluid}'s settings based on this {@link IGTFluid}'s state + */ + protected void configureFromStateTemperature() { + switch (fluidState) { + case SLURRY: + setGaseous(false).setViscosity(10000); + break; + case GAS: + setGaseous(true).setDensity(-100) + .setViscosity(200); + break; + case PLASMA: + setGaseous(true).setDensity(55536) + .setViscosity(10) + .setLuminosity(15); + break; + case MOLTEN: + final int luminosity; + if (temperature >= 3500) { + luminosity = 15; + } else { + luminosity = temperature < 1000 ? 0 : 14 * (temperature - 1000) / 2500 + 1; + } + setLuminosity(luminosity); + case LIQUID: + default: + setGaseous(false).setViscosity(1000); + break; + } + } + + // ----- Fluid implementations ----- + + /** + * @inheritDoc + */ + @Override + public int getColor() { + return (Math.max(0, Math.min(255, colorRGBA[0])) << 16) | (Math.max(0, Math.min(255, colorRGBA[1])) << 8) + | Math.max(0, Math.min(255, colorRGBA[2])); + } + + // ----- IGTFluid interface implementations ----- + + public IGTRegisteredFluid addFluid() { + if (FluidRegistry.registerFluid(GTFluid.this)) { + // Registered as a new Fluid + registeredFluid = this; + // Adds a server-side localized-name + GTLanguageManager.addStringLocalization(getUnlocalizedName(), localizedName); + } else { + // Fluid already registered, get it from the registry + registeredFluid = FluidRegistry.getFluid(GTFluid.this.fluidName); + // Sets temperature of already registered fluids if they use the default (temperature = 300) + if (registeredFluid.getTemperature() == new Fluid("test").getTemperature()) { + registeredFluid.setTemperature(GTFluid.this.temperature); + } + } + // Schedules the fluid for the block icons loader run() tasks + GregTechAPI.sGTBlockIconload.add(this); + return this; + } + + // ----- IGT_RegisteredFluid interface implementations ----- + + /** + * @inheritDoc + */ + @Override + public IGTRegisteredFluid registerContainers(final ItemStack fullContainer, final ItemStack emptyContainer, + final int containerSize) { + if (fullContainer != null && emptyContainer != null) { + final FluidStack fluidStack = new FluidStack(registeredFluid, containerSize); + if (!FluidContainerRegistry.registerFluidContainer(fluidStack, fullContainer, emptyContainer)) { + GTValues.RA.stdBuilder() + .itemInputs(fullContainer) + .itemOutputs(GTUtility.getContainerItem(fullContainer, false)) + .fluidOutputs(fluidStack) + .duration(fluidStack.amount / 62) + .eut(1) + .addTo(fluidCannerRecipes); + } + } + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTRegisteredFluid registerBContainers(final ItemStack fullContainer, final ItemStack emptyContainer) { + return registerContainers(fullContainer, emptyContainer, 1000); + } + + /** + * @inheritDoc + */ + @Override + public IGTRegisteredFluid registerPContainers(final ItemStack fullContainer, final ItemStack emptyContainer) { + return registerContainers(fullContainer, emptyContainer, 250); + } + + /** + * @inheritDoc + */ + @Override + public IGTRegisteredFluid configureMaterials(final Materials material) { + if (material != null) { + switch (fluidState) { + case SLURRY -> material.mSolid = registeredFluid; + case GAS -> material.mGas = registeredFluid; + case PLASMA -> material.mPlasma = registeredFluid; + case MOLTEN -> material.mStandardMoltenFluid = registeredFluid; + default -> material.mFluid = registeredFluid; + } + Materials.FLUID_MAP.put(registeredFluid, material); + } + return this; + } + + /** + * @inheritDoc + */ + @Override + public Fluid asFluid() { + return registeredFluid; + } + + // ----- Runnable interface implementations ----- + + /** + * This {@link Runnable#run()} implementation is scheduled within the {@link GregTechAPI#sGTBlockIconload} to load + * this {@link IGTFluid}'s texture icons. + * + * @see Runnable#run() + */ + @Override + public void run() { + if (iconsFrom instanceof GTFluid) { + // Needs the GTFluid to have registered its icons + ((GTFluid) iconsFrom).run(); + stillIcon = iconsFrom.getStillIcon(); + flowingIcon = iconsFrom.getFlowingIcon(); + } else { + if (stillIconResourceLocation != null) { + stillIcon = GregTechAPI.sBlockIcons.registerIcon(stillIconResourceLocation.toString()); + } + if (flowingIconResourceLocation != null) { + flowingIcon = GregTechAPI.sBlockIcons.registerIcon(flowingIconResourceLocation.toString()); + } + } + } + + @Override + public String toString() { + return "GTFluid{" + "fluidName='" + fluidName + '\'' + '}'; + } +} diff --git a/src/main/java/gregtech/common/fluid/GTFluidBuilder.java b/src/main/java/gregtech/common/fluid/GTFluidBuilder.java new file mode 100644 index 0000000000..e1532f0dbf --- /dev/null +++ b/src/main/java/gregtech/common/fluid/GTFluidBuilder.java @@ -0,0 +1,146 @@ +package gregtech.common.fluid; + +import static gregtech.api.enums.Mods.GregTech; + +import java.util.Locale; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.FluidState; +import gregtech.api.interfaces.fluid.IGTFluid; +import gregtech.api.interfaces.fluid.IGTFluidBuilder; +import gregtech.api.interfaces.fluid.IGTRegisteredFluid; + +public class GTFluidBuilder implements IGTFluidBuilder { + + final String fluidName; + String localizedName; + ResourceLocation stillIconResourceLocation = null, flowingIconResourceLocation = null; + short[] colorRGBA = Dyes._NULL.getRGBA(); + Block fluidBlock = null; + FluidState fluidState; + int temperature; + IIcon stillIcon; + IIcon flowingIcon; + Fluid iconsFrom; + + public GTFluidBuilder(final String fluidName) { + this.fluidName = fluidName.toLowerCase(Locale.ENGLISH); + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withColorRGBA(final short[] colorRGBA) { + this.colorRGBA = colorRGBA; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withLocalizedName(final String localizedName) { + this.localizedName = localizedName; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withStateAndTemperature(final FluidState fluidState, final int temperature) { + this.fluidState = fluidState; + this.temperature = temperature; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withStillIconResourceLocation(final ResourceLocation stillIconResourceLocation) { + this.stillIconResourceLocation = stillIconResourceLocation; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withFlowingIconResourceLocation(final ResourceLocation flowingIconResourceLocation) { + this.flowingIconResourceLocation = flowingIconResourceLocation; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withTextureName(final String textureName) { + this.stillIconResourceLocation = new ResourceLocation(GregTech.ID, "fluids/fluid." + textureName); + this.flowingIconResourceLocation = null; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withIconsFrom(@Nonnull final Fluid fromFluid) { + this.iconsFrom = fromFluid; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withFluidBlock(final Block fluidBlock) { + this.fluidBlock = fluidBlock; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluidBuilder withTextures(final ResourceLocation stillIconResourceLocation, + final ResourceLocation flowingIconResourceLocation) { + this.stillIconResourceLocation = stillIconResourceLocation; + this.flowingIconResourceLocation = flowingIconResourceLocation; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGTFluid build() { + if (colorRGBA == null) { + colorRGBA = Dyes._NULL.getRGBA(); + } + if (stillIconResourceLocation == null) { + withTextureName(fluidName.toLowerCase(Locale.ENGLISH)); + } + if (localizedName == null) { + localizedName = fluidName; + } + return new GTFluid(this); + } + + /** + * @inheritDoc + */ + @Override + public IGTRegisteredFluid buildAndRegister() { + return build().addFluid(); + } +} diff --git a/src/main/java/gregtech/common/fluid/GT_Fluid.java b/src/main/java/gregtech/common/fluid/GT_Fluid.java deleted file mode 100644 index 6ba8d7d23a..0000000000 --- a/src/main/java/gregtech/common/fluid/GT_Fluid.java +++ /dev/null @@ -1,209 +0,0 @@ -package gregtech.common.fluid; - -import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidContainerRegistry; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.FluidState; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.fluid.IGT_Fluid; -import gregtech.api.interfaces.fluid.IGT_RegisteredFluid; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class GT_Fluid extends Fluid implements IGT_Fluid, IGT_RegisteredFluid, Runnable { - - private final String localizedName; - private final ResourceLocation stillIconResourceLocation; - private final ResourceLocation flowingIconResourceLocation; - private final short[] colorRGBA; - private final FluidState fluidState; - private final Fluid iconsFrom; - private Fluid registeredFluid; - - /** - * Constructs this {@link IGT_Fluid} implementation from an {@link GT_FluidBuilder} instance - * - * @param builder The {@link GT_FluidBuilder} instance to construct this {@link IGT_Fluid} implementation - */ - protected GT_Fluid(@Nonnull final GT_FluidBuilder builder) { - super(builder.fluidName); - this.localizedName = builder.localizedName; - this.stillIconResourceLocation = builder.stillIconResourceLocation; - this.flowingIconResourceLocation = builder.flowingIconResourceLocation; - this.iconsFrom = builder.iconsFrom; - this.block = builder.fluidBlock; - this.colorRGBA = builder.colorRGBA; - this.fluidState = builder.fluidState; - this.temperature = builder.temperature; - configureFromStateTemperature(); - } - - /** - * Adjusts this {@link Fluid}'s settings based on this {@link IGT_Fluid}'s state - */ - protected void configureFromStateTemperature() { - switch (fluidState) { - case SLURRY: - setGaseous(false).setViscosity(10000); - break; - case GAS: - setGaseous(true).setDensity(-100) - .setViscosity(200); - break; - case PLASMA: - setGaseous(true).setDensity(55536) - .setViscosity(10) - .setLuminosity(15); - break; - case MOLTEN: - final int luminosity; - if (temperature >= 3500) { - luminosity = 15; - } else { - luminosity = temperature < 1000 ? 0 : 14 * (temperature - 1000) / 2500 + 1; - } - setLuminosity(luminosity); - case LIQUID: - default: - setGaseous(false).setViscosity(1000); - break; - } - } - - // ----- Fluid implementations ----- - - /** - * @inheritDoc - */ - @Override - public int getColor() { - return (Math.max(0, Math.min(255, colorRGBA[0])) << 16) | (Math.max(0, Math.min(255, colorRGBA[1])) << 8) - | Math.max(0, Math.min(255, colorRGBA[2])); - } - - // ----- IGT_Fluid interface implementations ----- - - public IGT_RegisteredFluid addFluid() { - if (FluidRegistry.registerFluid(GT_Fluid.this)) { - // Registered as a new Fluid - registeredFluid = this; - // Adds a server-side localized-name - GT_LanguageManager.addStringLocalization(getUnlocalizedName(), localizedName); - } else { - // Fluid already registered, get it from the registry - registeredFluid = FluidRegistry.getFluid(GT_Fluid.this.fluidName); - // Sets temperature of already registered fluids if they use the default (temperature = 300) - if (registeredFluid.getTemperature() == new Fluid("test").getTemperature()) { - registeredFluid.setTemperature(GT_Fluid.this.temperature); - } - } - // Schedules the fluid for the block icons loader run() tasks - GregTech_API.sGTBlockIconload.add(this); - return this; - } - - // ----- IGT_RegisteredFluid interface implementations ----- - - /** - * @inheritDoc - */ - @Override - public IGT_RegisteredFluid registerContainers(final ItemStack fullContainer, final ItemStack emptyContainer, - final int containerSize) { - if (fullContainer != null && emptyContainer != null) { - final FluidStack fluidStack = new FluidStack(registeredFluid, containerSize); - if (!FluidContainerRegistry.registerFluidContainer(fluidStack, fullContainer, emptyContainer)) { - GT_Values.RA.stdBuilder() - .itemInputs(fullContainer) - .itemOutputs(GT_Utility.getContainerItem(fullContainer, false)) - .fluidOutputs(fluidStack) - .duration(fluidStack.amount / 62) - .eut(1) - .addTo(fluidCannerRecipes); - } - } - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_RegisteredFluid registerBContainers(final ItemStack fullContainer, final ItemStack emptyContainer) { - return registerContainers(fullContainer, emptyContainer, 1000); - } - - /** - * @inheritDoc - */ - @Override - public IGT_RegisteredFluid registerPContainers(final ItemStack fullContainer, final ItemStack emptyContainer) { - return registerContainers(fullContainer, emptyContainer, 250); - } - - /** - * @inheritDoc - */ - @Override - public IGT_RegisteredFluid configureMaterials(final Materials material) { - if (material != null) { - switch (fluidState) { - case SLURRY -> material.mSolid = registeredFluid; - case GAS -> material.mGas = registeredFluid; - case PLASMA -> material.mPlasma = registeredFluid; - case MOLTEN -> material.mStandardMoltenFluid = registeredFluid; - default -> material.mFluid = registeredFluid; - } - Materials.FLUID_MAP.put(registeredFluid, material); - } - return this; - } - - /** - * @inheritDoc - */ - @Override - public Fluid asFluid() { - return registeredFluid; - } - - // ----- Runnable interface implementations ----- - - /** - * This {@link Runnable#run()} implementation is scheduled within the {@link GregTech_API#sGTBlockIconload} to load - * this {@link IGT_Fluid}'s texture icons. - * - * @see Runnable#run() - */ - @Override - public void run() { - if (iconsFrom instanceof GT_Fluid) { - // Needs the GT_Fluid to have registered its icons - ((GT_Fluid) iconsFrom).run(); - stillIcon = iconsFrom.getStillIcon(); - flowingIcon = iconsFrom.getFlowingIcon(); - } else { - if (stillIconResourceLocation != null) { - stillIcon = GregTech_API.sBlockIcons.registerIcon(stillIconResourceLocation.toString()); - } - if (flowingIconResourceLocation != null) { - flowingIcon = GregTech_API.sBlockIcons.registerIcon(flowingIconResourceLocation.toString()); - } - } - } - - @Override - public String toString() { - return "GT_Fluid{" + "fluidName='" + fluidName + '\'' + '}'; - } -} diff --git a/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java b/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java deleted file mode 100644 index 9a18b8d812..0000000000 --- a/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java +++ /dev/null @@ -1,146 +0,0 @@ -package gregtech.common.fluid; - -import static gregtech.api.enums.Mods.GregTech; - -import java.util.Locale; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.util.IIcon; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fluids.Fluid; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.FluidState; -import gregtech.api.interfaces.fluid.IGT_Fluid; -import gregtech.api.interfaces.fluid.IGT_FluidBuilder; -import gregtech.api.interfaces.fluid.IGT_RegisteredFluid; - -public class GT_FluidBuilder implements IGT_FluidBuilder { - - final String fluidName; - String localizedName; - ResourceLocation stillIconResourceLocation = null, flowingIconResourceLocation = null; - short[] colorRGBA = Dyes._NULL.getRGBA(); - Block fluidBlock = null; - FluidState fluidState; - int temperature; - IIcon stillIcon; - IIcon flowingIcon; - Fluid iconsFrom; - - public GT_FluidBuilder(final String fluidName) { - this.fluidName = fluidName.toLowerCase(Locale.ENGLISH); - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withColorRGBA(final short[] colorRGBA) { - this.colorRGBA = colorRGBA; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withLocalizedName(final String localizedName) { - this.localizedName = localizedName; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withStateAndTemperature(final FluidState fluidState, final int temperature) { - this.fluidState = fluidState; - this.temperature = temperature; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withStillIconResourceLocation(final ResourceLocation stillIconResourceLocation) { - this.stillIconResourceLocation = stillIconResourceLocation; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withFlowingIconResourceLocation(final ResourceLocation flowingIconResourceLocation) { - this.flowingIconResourceLocation = flowingIconResourceLocation; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withTextureName(final String textureName) { - this.stillIconResourceLocation = new ResourceLocation(GregTech.ID, "fluids/fluid." + textureName); - this.flowingIconResourceLocation = null; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withIconsFrom(@Nonnull final Fluid fromFluid) { - this.iconsFrom = fromFluid; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withFluidBlock(final Block fluidBlock) { - this.fluidBlock = fluidBlock; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_FluidBuilder withTextures(final ResourceLocation stillIconResourceLocation, - final ResourceLocation flowingIconResourceLocation) { - this.stillIconResourceLocation = stillIconResourceLocation; - this.flowingIconResourceLocation = flowingIconResourceLocation; - return this; - } - - /** - * @inheritDoc - */ - @Override - public IGT_Fluid build() { - if (colorRGBA == null) { - colorRGBA = Dyes._NULL.getRGBA(); - } - if (stillIconResourceLocation == null) { - withTextureName(fluidName.toLowerCase(Locale.ENGLISH)); - } - if (localizedName == null) { - localizedName = fluidName; - } - return new GT_Fluid(this); - } - - /** - * @inheritDoc - */ - @Override - public IGT_RegisteredFluid buildAndRegister() { - return build().addFluid(); - } -} diff --git a/src/main/java/gregtech/common/gui/MachineGUIProvider.java b/src/main/java/gregtech/common/gui/MachineGUIProvider.java index 3cc889f000..a8d8804ebe 100644 --- a/src/main/java/gregtech/common/gui/MachineGUIProvider.java +++ b/src/main/java/gregtech/common/gui/MachineGUIProvider.java @@ -35,7 +35,7 @@ import gregtech.api.enums.SoundResource; import gregtech.api.enums.VoidingMode; import gregtech.api.gui.GUIHost; import gregtech.api.gui.GUIProvider; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.gui.modularui.GUITextureSet; import gregtech.api.logic.MuTEProcessingLogic; import gregtech.api.logic.PowerLogic; @@ -74,7 +74,7 @@ public class MachineGUIProvider { if (host.isAllowedToWork()) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON }; + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON }; } else { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF }; + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF }; } }) .attachSyncer(new FakeSyncWidget.BooleanSyncer(host::isAllowedToWork, host::setAllowedToWork), builder) @@ -343,7 +343,7 @@ public class MachineGUIProvider { List ret = new ArrayList<>(); if (host.isInputSeparated()) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); if (host.supportsInputSeparation()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON); + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON); } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED); + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED); } } else { - ret.add(GT_UITextures.BUTTON_STANDARD); + ret.add(GTUITextures.BUTTON_STANDARD); if (host.supportsInputSeparation()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF); + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF); } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED); + ret.add(GTUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED); } } if (!host.supportsInputSeparation()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN); + ret.add(GTUITextures.OVERLAY_BUTTON_FORBIDDEN); } return ret.toArray(new IDrawable[0]); }) @@ -430,22 +430,22 @@ public class MachineGUIProvider { List ret = new ArrayList<>(); if (host.isBatchModeEnabled()) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); if (host.supportsBatchMode()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON); + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_ON); } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED); + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED); } } else { - ret.add(GT_UITextures.BUTTON_STANDARD); + ret.add(GTUITextures.BUTTON_STANDARD); if (host.supportsBatchMode()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF); + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_OFF); } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED); + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED); } } if (!host.supportsBatchMode()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN); + ret.add(GTUITextures.OVERLAY_BUTTON_FORBIDDEN); } return ret.toArray(new IDrawable[0]); }) @@ -476,22 +476,22 @@ public class MachineGUIProvider { List ret = new ArrayList<>(); if (host.isRecipeLockingEnabled()) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); if (host.supportsSingleRecipeLocking()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED); + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_LOCKED); } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED); + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED); } } else { - ret.add(GT_UITextures.BUTTON_STANDARD); + ret.add(GTUITextures.BUTTON_STANDARD); if (host.supportsSingleRecipeLocking()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED); + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED); } else { - ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED); + ret.add(GTUITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED); } } if (!host.supportsSingleRecipeLocking()) { - ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN); + ret.add(GTUITextures.OVERLAY_BUTTON_FORBIDDEN); } return ret.toArray(new IDrawable[0]); }) diff --git a/src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java b/src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java index 452ca36c0c..0163c6fb7b 100644 --- a/src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java +++ b/src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java @@ -23,10 +23,10 @@ import com.gtnewhorizons.modularui.common.widget.DrawableWidget; import com.gtnewhorizons.modularui.common.widget.TextWidget; import gregtech.api.enums.Dyes; -import gregtech.api.gui.GT_GUIColorOverride; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; +import gregtech.api.gui.GUIColorOverride; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; /** * Creates UI for selecting item from given list. This is client-only UI to allow using client-preferred settings. @@ -44,10 +44,10 @@ public class SelectItemUIFactory { private int selected; private boolean anotherWindow = false; private AtomicBoolean dialogOpened; - private int guiTint = GT_Util.getRGBInt(Dyes.MACHINE_METAL.getRGBA()); + private int guiTint = GTUtil.getRGBInt(Dyes.MACHINE_METAL.getRGBA()); private Supplier currentGetter; - private final GT_GUIColorOverride colorOverride = GT_GUIColorOverride.get("SelectItemUIFactory"); + private final GUIColorOverride colorOverride = GUIColorOverride.get("SelectItemUIFactory"); private int getTextColorOrDefault(String textType, int defaultColor) { return colorOverride.getTextColorOrDefault(textType, defaultColor); @@ -139,10 +139,10 @@ public class SelectItemUIFactory { super.onScreenUpdate(); if (currentGetter != null) { ItemStack current = currentGetter.get(); - selected = GT_Utility.findMatchingStackInList(stacks, current); + selected = GTUtility.findMatchingStackInList(stacks, current); } } - }.setDrawable(GT_UITextures.SLOT_DARK_GRAY) + }.setDrawable(GTUITextures.SLOT_DARK_GRAY) .setPos(currentSlotX, currentSlotY) .setSize(18, 18)) .widget( @@ -178,7 +178,7 @@ public class SelectItemUIFactory { .setUpdateTooltipEveryTick(true) .setBackground( () -> new IDrawable[] { - index == selected ? GT_UITextures.SLOT_DARK_GRAY : ModularUITextures.ITEM_SLOT, }) + index == selected ? GTUITextures.SLOT_DARK_GRAY : ModularUITextures.ITEM_SLOT, }) .setPos(7 + 18 * (index % cols), 43 + 18 * (index / cols)) .setSize(18, 18)); } @@ -209,7 +209,7 @@ public class SelectItemUIFactory { public void setSelected(int selected) { if (selected == this.selected) return; - int newSelected = GT_Utility.clamp(selected, UNSELECTED, stacks.size() - 1); + int newSelected = GTUtility.clamp(selected, UNSELECTED, stacks.size() - 1); if (noDeselect && newSelected == UNSELECTED) return; this.selected = newSelected; diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java index 4d1c6649ae..e244fcf5e5 100644 --- a/src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java +++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java @@ -8,7 +8,7 @@ import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; /** * Fires click action on mouse release, not on press. Draws different backgrounds depending on whether the mouse is @@ -16,12 +16,12 @@ import gregtech.api.gui.modularui.GT_UITextures; */ public class CoverCycleButtonWidget extends CycleButtonWidget { - private static final UITexture BUTTON_NORMAL_NOT_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL + private static final UITexture BUTTON_NORMAL_NOT_PRESSED = GTUITextures.BUTTON_COVER_NORMAL .getSubArea(0, 0, 1, 0.5f); - private static final UITexture BUTTON_NORMAL_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0.5f, 1, 1); - private static final UITexture BUTTON_HOVERED_NOT_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL_HOVERED + private static final UITexture BUTTON_NORMAL_PRESSED = GTUITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0.5f, 1, 1); + private static final UITexture BUTTON_HOVERED_NOT_PRESSED = GTUITextures.BUTTON_COVER_NORMAL_HOVERED .getSubArea(0, 0, 1, 0.5f); - private static final UITexture BUTTON_HOVERED_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL_HOVERED + private static final UITexture BUTTON_HOVERED_PRESSED = GTUITextures.BUTTON_COVER_NORMAL_HOVERED .getSubArea(0, 0.5f, 1, 1); private boolean clickPressed; diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java index 4543980ce1..c89c541273 100644 --- a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java +++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java @@ -12,12 +12,12 @@ import com.gtnewhorizons.modularui.api.widget.Widget; import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; import gregtech.api.gui.modularui.IDataFollowerWidget; -import gregtech.api.util.GT_CoverBehaviorBase; +import gregtech.api.util.CoverBehaviorBase; import gregtech.api.util.ISerializableObject; public class CoverDataControllerWidget extends DataControllerWidget { - protected final GT_CoverBehaviorBase coverBehavior; + protected final CoverBehaviorBase coverBehavior; /** * @param dataGetter () -> cover data this widget handles @@ -25,7 +25,7 @@ public class CoverDataControllerWidget extends Da * @param coverBehavior cover this widget handles data update */ public CoverDataControllerWidget(Supplier dataGetter, Function dataSetter, - GT_CoverBehaviorBase coverBehavior) { + CoverBehaviorBase coverBehavior) { super(dataGetter, dataSetter); this.coverBehavior = coverBehavior; } @@ -68,7 +68,7 @@ public class CoverDataControllerWidget extends Da * @param dataUpdater (index of button, current cover data) -> new cover data */ public CoverDataIndexedControllerWidget_ToggleButtons(Supplier coverDataGetter, - Function coverDataSetter, GT_CoverBehaviorBase coverBehavior, + Function coverDataSetter, CoverBehaviorBase coverBehavior, BiFunction dataToStateGetter, BiFunction dataUpdater) { super(coverDataGetter, coverDataSetter, coverBehavior); this.dataToStateGetter = dataToStateGetter; @@ -80,8 +80,8 @@ public class CoverDataControllerWidget extends Da * @param widget widget to add * @param applyForWidget methods to call for widget to add */ - public > CoverDataIndexedControllerWidget_ToggleButtons addToggleButton( - int index, W widget, Consumer> applyForWidget) { + public > CoverDataIndexedControllerWidget_ToggleButtons addToggleButton( + int index, W widget, Consumer> applyForWidget) { addFollower( widget, data -> dataToStateGetter.apply(index, data), @@ -108,7 +108,7 @@ public class CoverDataControllerWidget extends Da * @param dataUpdater (index of button, current cover data) -> new cover data */ public CoverDataIndexedControllerWidget_CycleButtons(Supplier coverDataGetter, - Function coverDataSetter, GT_CoverBehaviorBase coverBehavior, + Function coverDataSetter, CoverBehaviorBase coverBehavior, BiFunction dataToStateGetter, BiFunction dataUpdater) { super(coverDataGetter, coverDataSetter, coverBehavior); this.dataToStateGetter = dataToStateGetter; @@ -120,8 +120,8 @@ public class CoverDataControllerWidget extends Da * @param widget widget to add * @param applyForWidget methods to call for the widget to add */ - public > CoverDataIndexedControllerWidget_CycleButtons addCycleButton( - int index, W widget, Consumer> applyForWidget) { + public > CoverDataIndexedControllerWidget_CycleButtons addCycleButton( + int index, W widget, Consumer> applyForWidget) { addFollower( widget, data -> dataToStateGetter.apply(index, data), diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerCycleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerCycleButtonWidget.java new file mode 100644 index 0000000000..4408dbd54e --- /dev/null +++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerCycleButtonWidget.java @@ -0,0 +1,39 @@ +package gregtech.common.gui.modularui.widget; + +import java.util.function.Consumer; +import java.util.function.Function; + +import gregtech.api.gui.modularui.IDataFollowerWidget; +import gregtech.api.util.ISerializableObject; + +/** + * Determines button state with cover data. + */ +public class CoverDataFollowerCycleButtonWidget extends CoverCycleButtonWidget + implements IDataFollowerWidget { + + private Function dataToStateGetter; + + public CoverDataFollowerCycleButtonWidget() { + super(); + setGetter(() -> 0); // fake getter; used only for init + setSynced(false, false); + } + + @Override + public CoverDataFollowerCycleButtonWidget setDataToStateGetter(Function dataToStateGetter) { + this.dataToStateGetter = dataToStateGetter; + return this; + } + + @Override + public CoverDataFollowerCycleButtonWidget setStateSetter(Consumer setter) { + super.setSetter(setter); + return this; + } + + @Override + public void updateState(T data) { + setState(dataToStateGetter.apply(data), false, false); + } +} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerNumericWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerNumericWidget.java new file mode 100644 index 0000000000..316109ed64 --- /dev/null +++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerNumericWidget.java @@ -0,0 +1,60 @@ +package gregtech.common.gui.modularui.widget; + +import java.util.function.Consumer; +import java.util.function.Function; + +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.IDataFollowerWidget; +import gregtech.api.util.ISerializableObject; + +public class CoverDataFollowerNumericWidget extends NumericWidget + implements IDataFollowerWidget { + + private Function dataToStateGetter; + + public CoverDataFollowerNumericWidget() { + super(); + setGetter(() -> 0); // fake getter; used only for init + setSynced(false, false); + setTextColor(Color.WHITE.dark(1)); + setTextAlignment(Alignment.CenterLeft); + setBackground(GTUITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)); + } + + @Override + public void onPostInit() { + // Widget#onPostInit is called earlier than IDataFollowerWidget#onPostInit, + // so we make sure cursor is set after text is set + super.onPostInit(); + + // On first call #handler does not contain text. + // On second call, it contains correct text to update #lastText, + // but #shouldGetFocus call is skipped by Cursor#updateFocused, + // so we need to manually call this. + if (focusOnGuiOpen) { + shouldGetFocus(); + } + } + + @Override + public CoverDataFollowerNumericWidget setDataToStateGetter(Function dataToStateGetter) { + this.dataToStateGetter = dataToStateGetter; + return this; + } + + @Override + public CoverDataFollowerNumericWidget setStateSetter(Consumer setter) { + super.setSetter(setter::accept); + return this; + } + + @Override + public void updateState(T data) { + setValue(dataToStateGetter.apply(data)); + } + +} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerSlotWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerSlotWidget.java new file mode 100644 index 0000000000..a3995deda0 --- /dev/null +++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerSlotWidget.java @@ -0,0 +1,101 @@ +package gregtech.common.gui.modularui.widget; + +import java.util.function.Consumer; +import java.util.function.Function; + +import net.minecraft.item.ItemStack; + +import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.api.widget.Interactable; +import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.api.gui.modularui.IDataFollowerWidget; +import gregtech.api.util.ISerializableObject; + +public class CoverDataFollowerSlotWidget extends SlotWidget + implements IDataFollowerWidget { + + private Function dataToStateGetter; + private Consumer dataSetter; + + public CoverDataFollowerSlotWidget(BaseSlot slot) { + super(slot); + } + + public CoverDataFollowerSlotWidget(IItemHandlerModifiable handler, int index, boolean phantom) { + this(new BaseSlot(handler, index, phantom)); + } + + public CoverDataFollowerSlotWidget(IItemHandlerModifiable handler, int index) { + this(handler, index, false); + } + + @Override + public CoverDataFollowerSlotWidget setDataToStateGetter(Function dataToStateGetter) { + this.dataToStateGetter = dataToStateGetter; + return this; + } + + @Override + public CoverDataFollowerSlotWidget setStateSetter(Consumer setter) { + this.dataSetter = setter; + return this; + } + + @Override + public void updateState(T data) { + getMcSlot().putStack(dataToStateGetter.apply(data)); + } + + @Override + public void detectAndSendChanges(boolean init) {} + + // Slot sync is handled differently from other DataFollowers, + // so we need to also sync slot content directly to server. + + @Override + public ClickResult onClick(int buttonId, boolean doubleClick) { + if (interactionDisabled) return ClickResult.REJECT; + if (isPhantom()) { + ClickData clickData = ClickData.create(buttonId, doubleClick); + syncToServer(2, clickData::writeToPacket); + phantomClick(clickData); + dataSetter.accept(getMcSlot().getStack()); + return ClickResult.ACCEPT; + } + return ClickResult.REJECT; + } + + @Override + public boolean onMouseScroll(int direction) { + if (interactionDisabled) return false; + if (isPhantom()) { + if (Interactable.hasShiftDown()) { + direction *= 8; + } + final int finalDirection = direction; + syncToServer(3, buffer -> buffer.writeVarIntToBuffer(finalDirection)); + phantomScroll(finalDirection); + dataSetter.accept(getMcSlot().getStack()); + return true; + } + return false; + } + + @Override + public boolean handleDragAndDrop(ItemStack draggedStack, int button) { + if (interactionDisabled) return false; + if (!isPhantom()) return false; + ClickData clickData = ClickData.create(button, false); + syncToServer(5, buffer -> { + clickData.writeToPacket(buffer); + NetworkUtils.writeItemStack(buffer, draggedStack); + }); + phantomClick(clickData, draggedStack); + dataSetter.accept(getMcSlot().getStack()); + draggedStack.stackSize = 0; + return true; + } +} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerTextFieldWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerTextFieldWidget.java new file mode 100644 index 0000000000..95ceafaadd --- /dev/null +++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerTextFieldWidget.java @@ -0,0 +1,134 @@ +package gregtech.common.gui.modularui.widget; + +import java.util.function.Consumer; +import java.util.function.Function; + +import net.minecraft.client.gui.GuiScreen; + +import com.gtnewhorizon.gtnhlib.util.parsing.MathExpressionParser; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.IDataFollowerWidget; +import gregtech.api.util.ISerializableObject; + +public class CoverDataFollowerTextFieldWidget extends TextFieldWidget + implements IDataFollowerWidget { + + private Function dataToStateGetter; + + public CoverDataFollowerTextFieldWidget() { + super(); + setGetter(() -> ""); // fake getter; used only for init + setSynced(false, false); + setTextColor(Color.WHITE.dark(1)); + setTextAlignment(Alignment.CenterLeft); + setBackground(GTUITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)); + } + + @Override + public void onPostInit() { + // Widget#onPostInit is called earlier than IDataFollowerWidget#onPostInit, + // so we make sure cursor is set after text is set + super.onPostInit(); + + // On first call #handler does not contain text. + // On second call, it contains correct text to update #lastText, + // but #shouldGetFocus call is skipped by Cursor#updateFocused, + // so we need to manually call this. + if (focusOnGuiOpen) { + shouldGetFocus(); + } + } + + @Override + public CoverDataFollowerTextFieldWidget setDataToStateGetter(Function dataToStateGetter) { + this.dataToStateGetter = dataToStateGetter; + return this; + } + + @Override + public CoverDataFollowerTextFieldWidget setStateSetter(Consumer setter) { + super.setSetter(setter); + return this; + } + + @Override + public void updateState(T data) { + setText(dataToStateGetter.apply(data)); + } + + /** + * @deprecated Use {@link CoverDataFollowerNumericWidget} + */ + @Deprecated + public CoverDataFollowerTextFieldWidget setOnScrollNumbers(int baseStep, int ctrlStep, int shiftStep) { + setOnScrollNumbers((val, direction) -> { + int step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep) + * direction; + try { + val = Math.addExact(val, step); + } catch (ArithmeticException ignored) { + val = Integer.MAX_VALUE; + } + return val; + }); + return this; + } + + /** + * @deprecated Use {@link CoverDataFollowerNumericWidget} + */ + @Deprecated + public CoverDataFollowerTextFieldWidget setOnScrollNumbers() { + return setOnScrollNumbers(1, 50, 1000); + } + + /** + * @deprecated Use {@link CoverDataFollowerNumericWidget} + */ + @Deprecated + public CoverDataFollowerTextFieldWidget setOnScrollText(int baseStep, int ctrlStep, int shiftStep) { + setOnScroll((text, direction) -> { + int val = (int) MathExpressionParser.parse(text); + int step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep) + * direction; + try { + val = Math.addExact(val, step); + } catch (ArithmeticException ignored) { + val = Integer.MAX_VALUE; + } + return this.getDecimalFormatter() + .format(val); + }); + return this; + } + + /** + * @deprecated Use {@link CoverDataFollowerNumericWidget} + */ + @Deprecated + public CoverDataFollowerTextFieldWidget setOnScrollText() { + return setOnScrollText(1, 5, 50); + } + + /** + * @deprecated Use {@link CoverDataFollowerNumericWidget} + */ + @Deprecated + public CoverDataFollowerTextFieldWidget setOnScrollNumbersLong(long baseStep, long ctrlStep, long shiftStep) { + setOnScrollNumbersLong((val, direction) -> { + long step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep) + * direction; + try { + val = Math.addExact(val, step); + } catch (ArithmeticException ignored) { + val = Long.MAX_VALUE; + } + return val; + }); + return this; + } +} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerToggleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerToggleButtonWidget.java new file mode 100644 index 0000000000..0fcac5009c --- /dev/null +++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollowerToggleButtonWidget.java @@ -0,0 +1,86 @@ +package gregtech.common.gui.modularui.widget; + +import java.util.function.Consumer; +import java.util.function.Function; + +import com.gtnewhorizons.modularui.api.drawable.IDrawable; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.IDataFollowerWidget; +import gregtech.api.util.ISerializableObject; + +public class CoverDataFollowerToggleButtonWidget extends CoverCycleButtonWidget + implements IDataFollowerWidget { + + private Function dataToStateGetter; + + public CoverDataFollowerToggleButtonWidget() { + super(); + setGetter(() -> 0); // fake getter; used only for init + setSynced(false, false); + setLength(2); + } + + @Override + public CoverDataFollowerToggleButtonWidget setDataToStateGetter(Function dataToStateGetter) { + this.dataToStateGetter = dataToStateGetter; + return this; + } + + @Override + public CoverDataFollowerToggleButtonWidget setStateSetter(Consumer setter) { + super.setSetter(val -> setter.accept(val == 1)); + return this; + } + + @Override + public void updateState(T data) { + setState(dataToStateGetter.apply(data) ? 1 : 0, false, false); + } + + public CoverDataFollowerToggleButtonWidget setToggleTexture(IDrawable active, IDrawable inactive) { + setTextureGetter(state -> state == 1 ? active : inactive); + return this; + } + + public static CoverDataFollowerToggleButtonWidget ofCheckAndCross() { + return new CoverDataFollowerToggleButtonWidget() + .setToggleTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK, GTUITextures.OVERLAY_BUTTON_CROSS); + } + + public static CoverDataFollowerToggleButtonWidget ofCheck() { + return new CoverDataFollowerToggleButtonWidget() + .setToggleTexture(GTUITextures.OVERLAY_BUTTON_CHECKMARK, GTUITextures.TRANSPARENT); + } + + public static CoverDataFollowerToggleButtonWidget ofRedstone() { + return new CoverDataFollowerToggleButtonWidget() + .setToggleTexture(GTUITextures.OVERLAY_BUTTON_REDSTONE_ON, GTUITextures.OVERLAY_BUTTON_REDSTONE_OFF); + } + + public static CoverDataFollowerToggleButtonWidget ofDisableable() { + return new CoverDataFollower_DisableableToggleButtonWidget<>(); + } + + /** + * Disables clicking if button is already pressed. + */ + public static class CoverDataFollower_DisableableToggleButtonWidget + extends CoverDataFollowerToggleButtonWidget { + + public CoverDataFollower_DisableableToggleButtonWidget() { + super(); + } + + @Override + protected boolean canClick() { + return getState() == 0; + } + + @Override + public IDrawable[] getBackground() { + if (!canClick()) return new IDrawable[] { GTUITextures.BUTTON_COVER_NORMAL_DISABLED }; + return super.getBackground(); + } + } +} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java deleted file mode 100644 index ec7d31ca7e..0000000000 --- a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.gui.modularui.widget; - -import java.util.function.Consumer; -import java.util.function.Function; - -import gregtech.api.gui.modularui.IDataFollowerWidget; -import gregtech.api.util.ISerializableObject; - -/** - * Determines button state with cover data. - */ -public class CoverDataFollower_CycleButtonWidget extends CoverCycleButtonWidget - implements IDataFollowerWidget { - - private Function dataToStateGetter; - - public CoverDataFollower_CycleButtonWidget() { - super(); - setGetter(() -> 0); // fake getter; used only for init - setSynced(false, false); - } - - @Override - public CoverDataFollower_CycleButtonWidget setDataToStateGetter(Function dataToStateGetter) { - this.dataToStateGetter = dataToStateGetter; - return this; - } - - @Override - public CoverDataFollower_CycleButtonWidget setStateSetter(Consumer setter) { - super.setSetter(setter); - return this; - } - - @Override - public void updateState(T data) { - setState(dataToStateGetter.apply(data), false, false); - } -} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java deleted file mode 100644 index f641ed090b..0000000000 --- a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.common.gui.modularui.widget; - -import java.util.function.Consumer; -import java.util.function.Function; - -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.IDataFollowerWidget; -import gregtech.api.util.ISerializableObject; - -public class CoverDataFollower_NumericWidget extends NumericWidget - implements IDataFollowerWidget { - - private Function dataToStateGetter; - - public CoverDataFollower_NumericWidget() { - super(); - setGetter(() -> 0); // fake getter; used only for init - setSynced(false, false); - setTextColor(Color.WHITE.dark(1)); - setTextAlignment(Alignment.CenterLeft); - setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)); - } - - @Override - public void onPostInit() { - // Widget#onPostInit is called earlier than IDataFollowerWidget#onPostInit, - // so we make sure cursor is set after text is set - super.onPostInit(); - - // On first call #handler does not contain text. - // On second call, it contains correct text to update #lastText, - // but #shouldGetFocus call is skipped by Cursor#updateFocused, - // so we need to manually call this. - if (focusOnGuiOpen) { - shouldGetFocus(); - } - } - - @Override - public CoverDataFollower_NumericWidget setDataToStateGetter(Function dataToStateGetter) { - this.dataToStateGetter = dataToStateGetter; - return this; - } - - @Override - public CoverDataFollower_NumericWidget setStateSetter(Consumer setter) { - super.setSetter(setter::accept); - return this; - } - - @Override - public void updateState(T data) { - setValue(dataToStateGetter.apply(data)); - } - -} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java deleted file mode 100644 index 0b827bfbc6..0000000000 --- a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java +++ /dev/null @@ -1,101 +0,0 @@ -package gregtech.common.gui.modularui.widget; - -import java.util.function.Consumer; -import java.util.function.Function; - -import net.minecraft.item.ItemStack; - -import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; -import com.gtnewhorizons.modularui.api.widget.Interactable; -import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.api.gui.modularui.IDataFollowerWidget; -import gregtech.api.util.ISerializableObject; - -public class CoverDataFollower_SlotWidget extends SlotWidget - implements IDataFollowerWidget { - - private Function dataToStateGetter; - private Consumer dataSetter; - - public CoverDataFollower_SlotWidget(BaseSlot slot) { - super(slot); - } - - public CoverDataFollower_SlotWidget(IItemHandlerModifiable handler, int index, boolean phantom) { - this(new BaseSlot(handler, index, phantom)); - } - - public CoverDataFollower_SlotWidget(IItemHandlerModifiable handler, int index) { - this(handler, index, false); - } - - @Override - public CoverDataFollower_SlotWidget setDataToStateGetter(Function dataToStateGetter) { - this.dataToStateGetter = dataToStateGetter; - return this; - } - - @Override - public CoverDataFollower_SlotWidget setStateSetter(Consumer setter) { - this.dataSetter = setter; - return this; - } - - @Override - public void updateState(T data) { - getMcSlot().putStack(dataToStateGetter.apply(data)); - } - - @Override - public void detectAndSendChanges(boolean init) {} - - // Slot sync is handled differently from other DataFollowers, - // so we need to also sync slot content directly to server. - - @Override - public ClickResult onClick(int buttonId, boolean doubleClick) { - if (interactionDisabled) return ClickResult.REJECT; - if (isPhantom()) { - ClickData clickData = ClickData.create(buttonId, doubleClick); - syncToServer(2, clickData::writeToPacket); - phantomClick(clickData); - dataSetter.accept(getMcSlot().getStack()); - return ClickResult.ACCEPT; - } - return ClickResult.REJECT; - } - - @Override - public boolean onMouseScroll(int direction) { - if (interactionDisabled) return false; - if (isPhantom()) { - if (Interactable.hasShiftDown()) { - direction *= 8; - } - final int finalDirection = direction; - syncToServer(3, buffer -> buffer.writeVarIntToBuffer(finalDirection)); - phantomScroll(finalDirection); - dataSetter.accept(getMcSlot().getStack()); - return true; - } - return false; - } - - @Override - public boolean handleDragAndDrop(ItemStack draggedStack, int button) { - if (interactionDisabled) return false; - if (!isPhantom()) return false; - ClickData clickData = ClickData.create(button, false); - syncToServer(5, buffer -> { - clickData.writeToPacket(buffer); - NetworkUtils.writeItemStack(buffer, draggedStack); - }); - phantomClick(clickData, draggedStack); - dataSetter.accept(getMcSlot().getStack()); - draggedStack.stackSize = 0; - return true; - } -} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java deleted file mode 100644 index 1907aaf22f..0000000000 --- a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java +++ /dev/null @@ -1,134 +0,0 @@ -package gregtech.common.gui.modularui.widget; - -import java.util.function.Consumer; -import java.util.function.Function; - -import net.minecraft.client.gui.GuiScreen; - -import com.gtnewhorizon.gtnhlib.util.parsing.MathExpressionParser; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.IDataFollowerWidget; -import gregtech.api.util.ISerializableObject; - -public class CoverDataFollower_TextFieldWidget extends TextFieldWidget - implements IDataFollowerWidget { - - private Function dataToStateGetter; - - public CoverDataFollower_TextFieldWidget() { - super(); - setGetter(() -> ""); // fake getter; used only for init - setSynced(false, false); - setTextColor(Color.WHITE.dark(1)); - setTextAlignment(Alignment.CenterLeft); - setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)); - } - - @Override - public void onPostInit() { - // Widget#onPostInit is called earlier than IDataFollowerWidget#onPostInit, - // so we make sure cursor is set after text is set - super.onPostInit(); - - // On first call #handler does not contain text. - // On second call, it contains correct text to update #lastText, - // but #shouldGetFocus call is skipped by Cursor#updateFocused, - // so we need to manually call this. - if (focusOnGuiOpen) { - shouldGetFocus(); - } - } - - @Override - public CoverDataFollower_TextFieldWidget setDataToStateGetter(Function dataToStateGetter) { - this.dataToStateGetter = dataToStateGetter; - return this; - } - - @Override - public CoverDataFollower_TextFieldWidget setStateSetter(Consumer setter) { - super.setSetter(setter); - return this; - } - - @Override - public void updateState(T data) { - setText(dataToStateGetter.apply(data)); - } - - /** - * @deprecated Use {@link CoverDataFollower_NumericWidget} - */ - @Deprecated - public CoverDataFollower_TextFieldWidget setOnScrollNumbers(int baseStep, int ctrlStep, int shiftStep) { - setOnScrollNumbers((val, direction) -> { - int step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep) - * direction; - try { - val = Math.addExact(val, step); - } catch (ArithmeticException ignored) { - val = Integer.MAX_VALUE; - } - return val; - }); - return this; - } - - /** - * @deprecated Use {@link CoverDataFollower_NumericWidget} - */ - @Deprecated - public CoverDataFollower_TextFieldWidget setOnScrollNumbers() { - return setOnScrollNumbers(1, 50, 1000); - } - - /** - * @deprecated Use {@link CoverDataFollower_NumericWidget} - */ - @Deprecated - public CoverDataFollower_TextFieldWidget setOnScrollText(int baseStep, int ctrlStep, int shiftStep) { - setOnScroll((text, direction) -> { - int val = (int) MathExpressionParser.parse(text); - int step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep) - * direction; - try { - val = Math.addExact(val, step); - } catch (ArithmeticException ignored) { - val = Integer.MAX_VALUE; - } - return this.getDecimalFormatter() - .format(val); - }); - return this; - } - - /** - * @deprecated Use {@link CoverDataFollower_NumericWidget} - */ - @Deprecated - public CoverDataFollower_TextFieldWidget setOnScrollText() { - return setOnScrollText(1, 5, 50); - } - - /** - * @deprecated Use {@link CoverDataFollower_NumericWidget} - */ - @Deprecated - public CoverDataFollower_TextFieldWidget setOnScrollNumbersLong(long baseStep, long ctrlStep, long shiftStep) { - setOnScrollNumbersLong((val, direction) -> { - long step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep) - * direction; - try { - val = Math.addExact(val, step); - } catch (ArithmeticException ignored) { - val = Long.MAX_VALUE; - } - return val; - }); - return this; - } -} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java deleted file mode 100644 index 6f798a93d5..0000000000 --- a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java +++ /dev/null @@ -1,86 +0,0 @@ -package gregtech.common.gui.modularui.widget; - -import java.util.function.Consumer; -import java.util.function.Function; - -import com.gtnewhorizons.modularui.api.drawable.IDrawable; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.IDataFollowerWidget; -import gregtech.api.util.ISerializableObject; - -public class CoverDataFollower_ToggleButtonWidget extends CoverCycleButtonWidget - implements IDataFollowerWidget { - - private Function dataToStateGetter; - - public CoverDataFollower_ToggleButtonWidget() { - super(); - setGetter(() -> 0); // fake getter; used only for init - setSynced(false, false); - setLength(2); - } - - @Override - public CoverDataFollower_ToggleButtonWidget setDataToStateGetter(Function dataToStateGetter) { - this.dataToStateGetter = dataToStateGetter; - return this; - } - - @Override - public CoverDataFollower_ToggleButtonWidget setStateSetter(Consumer setter) { - super.setSetter(val -> setter.accept(val == 1)); - return this; - } - - @Override - public void updateState(T data) { - setState(dataToStateGetter.apply(data) ? 1 : 0, false, false); - } - - public CoverDataFollower_ToggleButtonWidget setToggleTexture(IDrawable active, IDrawable inactive) { - setTextureGetter(state -> state == 1 ? active : inactive); - return this; - } - - public static CoverDataFollower_ToggleButtonWidget ofCheckAndCross() { - return new CoverDataFollower_ToggleButtonWidget() - .setToggleTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK, GT_UITextures.OVERLAY_BUTTON_CROSS); - } - - public static CoverDataFollower_ToggleButtonWidget ofCheck() { - return new CoverDataFollower_ToggleButtonWidget() - .setToggleTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK, GT_UITextures.TRANSPARENT); - } - - public static CoverDataFollower_ToggleButtonWidget ofRedstone() { - return new CoverDataFollower_ToggleButtonWidget() - .setToggleTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON, GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF); - } - - public static CoverDataFollower_ToggleButtonWidget ofDisableable() { - return new CoverDataFollower_DisableableToggleButtonWidget<>(); - } - - /** - * Disables clicking if button is already pressed. - */ - public static class CoverDataFollower_DisableableToggleButtonWidget - extends CoverDataFollower_ToggleButtonWidget { - - public CoverDataFollower_DisableableToggleButtonWidget() { - super(); - } - - @Override - protected boolean canClick() { - return getState() == 0; - } - - @Override - public IDrawable[] getBackground() { - if (!canClick()) return new IDrawable[] { GT_UITextures.BUTTON_COVER_NORMAL_DISABLED }; - return super.getBackground(); - } - } -} diff --git a/src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java index 5200c1a416..9e458af6a5 100644 --- a/src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java +++ b/src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java @@ -9,7 +9,7 @@ import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; /** * Watches specific ItemStack and pulls changes from it. Player cannot interact with slot, other than viewing NEI recipe @@ -33,7 +33,7 @@ public class ItemWatcherSlotWidget extends SlotWidget { @Override public void detectAndSendChanges(boolean init) { ItemStack target = getter.get(); - if (init || !GT_Utility.areStacksEqual(lastItem, target)) { + if (init || !GTUtility.areStacksEqual(lastItem, target)) { ItemStack toPut; if (target != null) { toPut = target.copy(); diff --git a/src/main/java/gregtech/common/items/CombType.java b/src/main/java/gregtech/common/items/CombType.java index 84ca2fa493..0a659f0684 100644 --- a/src/main/java/gregtech/common/items/CombType.java +++ b/src/main/java/gregtech/common/items/CombType.java @@ -5,7 +5,7 @@ import java.util.Arrays; import org.apache.commons.lang3.text.WordUtils; import gregtech.api.enums.Materials; -import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GTLanguageManager; public enum CombType { @@ -243,7 +243,7 @@ public enum CombType { this.chance = chance; this.showInList = show; this.color = new int[] { color1, color2 }; - this.localizedName = GT_LanguageManager + this.localizedName = GTLanguageManager .addStringLocalization("comb." + pName, WordUtils.capitalize(pName.replaceAll("_", " ")) + " Comb"); } diff --git a/src/main/java/gregtech/common/items/DropType.java b/src/main/java/gregtech/common/items/DropType.java index 1f9523a5b7..00525a0da6 100644 --- a/src/main/java/gregtech/common/items/DropType.java +++ b/src/main/java/gregtech/common/items/DropType.java @@ -3,7 +3,7 @@ package gregtech.common.items; import org.apache.commons.lang3.text.WordUtils; import gregtech.api.enums.Materials; -import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GTLanguageManager; public enum DropType { @@ -36,7 +36,7 @@ public enum DropType { public String getName() { - return GT_LanguageManager.addStringLocalization("drop." + this.name, WordUtils.capitalize(this.name) + " Drop"); + return GTLanguageManager.addStringLocalization("drop." + this.name, WordUtils.capitalize(this.name) + " Drop"); } public int[] getColours() { diff --git a/src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java b/src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java deleted file mode 100644 index 723a7ffad5..0000000000 --- a/src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java +++ /dev/null @@ -1,330 +0,0 @@ -package gregtech.common.items; - -import static gregtech.api.enums.Mods.GregTech; -import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.CARD_STATE_KEY; -import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.FREQUENCY_LSB_KEY; -import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.FREQUENCY_MSB_KEY; -import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.MACHINE_KEY; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.function.Predicate; -import java.util.stream.IntStream; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.common.misc.GlobalMetricsCoverDatabase; -import gregtech.common.misc.GlobalMetricsCoverDatabase.State; -import shedar.mods.ic2.nuclearcontrol.api.CardState; -import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper; -import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource; -import shedar.mods.ic2.nuclearcontrol.api.PanelSetting; -import shedar.mods.ic2.nuclearcontrol.api.PanelString; - -@SuppressWarnings("unused") -public class GT_AdvancedSensorCard_Item extends Item implements IPanelDataSource { - - public static final UUID CARD_TYPE_ID = UUID.fromString("ff952e84-7608-4c4a-85af-dd6e1aa27fc7"); - - // This has obfuscated formatting, so no need to localize it. - private static final String SELF_DESTRUCTED_OUTPUT = EnumChatFormatting.OBFUSCATED + "critical error" - + EnumChatFormatting.RESET; - - private static final ImmutableList DECONSTRUCTED_OUTPUT = ImmutableList.of( - StatCollector.translateToLocal("gt.item.adv_sensor_card.error.deconstructed.1"), - StatCollector.translateToLocal("gt.item.adv_sensor_card.error.deconstructed.2")); - - private static final String NO_DATA_FOUND = StatCollector.translateToLocal("gt.item.adv_sensor_card.error.no_data"); - - private static final String MACHINE_NAME_KEY = "client_machine_name"; - private static final String OUTPUT_ENTRY_KEY = "client_entry_%d"; - private static final String OUTPUT_ENTRY_LENGTH_KEY = "client_entry_length"; - - private int payloadSize = 0; - - @SideOnly(Side.CLIENT) - private IIcon normalIcon; - @SideOnly(Side.CLIENT) - private IIcon selfDestructedIcon; - - @SuppressWarnings("unused") - public GT_AdvancedSensorCard_Item() { - super(); - - GameRegistry.registerItem(this, "gt.advancedsensorcard", GregTech.ID); - setUnlocalizedName("gt.advancedsensorcard"); - setMaxStackSize(1); - setNoRepair(); - } - - @Override - public void addInformation(final ItemStack itemStack, final EntityPlayer player, final List tooltip, - final boolean p_77624_4_) { - super.addInformation(itemStack, player, tooltip, p_77624_4_); - - final Optional cardState = getCardState(itemStack); - if (cardState.isPresent()) { - final State state = cardState.get(); - - if (state == State.SELF_DESTRUCTED) { - tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.1")); - tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.2")); - tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.3")); - } else { - getMachineName(itemStack).ifPresent( - machineName -> tooltip.add( - StatCollector - .translateToLocalFormatted("gt.item.adv_sensor_card.tooltip.machine", machineName))); - getUUID(itemStack).ifPresent( - uuid -> tooltip.add( - StatCollector - .translateToLocalFormatted("gt.item.adv_sensor_card.tooltip.frequency", uuid.toString()))); - } - } else { - tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.recipe_hint")); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aOutputSubItems) {} - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(final IIconRegister aIconRegister) { - super.registerIcons(aIconRegister); - itemIcon = aIconRegister.registerIcon(GregTech.ID + ":gt.advancedsensorcard"); - normalIcon = itemIcon; - selfDestructedIcon = aIconRegister.registerIcon(GregTech.ID + ":gt.advancedsensorcardburned"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(final ItemStack stack, final int renderPass) { - return getIconIndex(stack); - } - - @Override - public IIcon getIconIndex(final ItemStack itemStack) { - return getCardState(itemStack).filter(Predicate.isEqual(State.SELF_DESTRUCTED)) - .map(ignored -> selfDestructedIcon) - .orElse(normalIcon); - } - - @Override - public CardState update(TileEntity tileEntity, ICardWrapper card, int maxRange) { - return update(tileEntity.getWorldObj(), card, maxRange); - } - - @Override - public CardState update(World world, ICardWrapper card, int maxRange) { - final Optional optionalData = getDataFromDatabase(card); - - optionalData.ifPresent(data -> { - final State machineState = data.getState(); - reconcileSelfDestructedCard(card.getItemStack(), machineState); - card.setInt(CARD_STATE_KEY, machineState.getType()); - - getMachineName(card.getItemStack()) - .ifPresent(name -> card.setString(MACHINE_NAME_KEY, machineState == State.SELF_DESTRUCTED ? "" : name)); - - final ImmutableList.Builder builder = ImmutableList.builder(); - switch (machineState) { - case SELF_DESTRUCTED -> builder.add(SELF_DESTRUCTED_OUTPUT); - case HOST_DECONSTRUCTED -> builder.addAll(DECONSTRUCTED_OUTPUT); - case OPERATIONAL -> { - data.getCoordinates() - .ifPresent( - coordinates -> builder.add( - StatCollector.translateToLocalFormatted( - "gt.item.adv_sensor_card.dimension", - coordinates.getDimension()), - StatCollector.translateToLocalFormatted( - "gt.item.adv_sensor_card.coords", - coordinates.getLocalizedCoordinates()))); - - data.getPayload() - .ifPresent(builder::addAll); - } - default -> builder.add(NO_DATA_FOUND); - } - - final List payload = builder.build(); - card.setInt(OUTPUT_ENTRY_LENGTH_KEY, payload.size()); - for (int i = 0; i < payload.size(); i++) { - final String payloadItem = payload.get(i); - if (!payloadItem.isEmpty()) { - card.setString(String.format(OUTPUT_ENTRY_KEY, i), payloadItem); - } - } - }); - - return CardState.OK; - } - - @Override - public List getStringData(final int displaySettings, final ICardWrapper card, - final boolean showLabels) { - final List returned = new ArrayList<>(); - final String machineName = card.getString(MACHINE_NAME_KEY); - final int bitmaskOffset; - - payloadSize = card.getInt(OUTPUT_ENTRY_LENGTH_KEY); - - if (!machineName.isEmpty() && (displaySettings & 1) != 0) { - returned.add(panelString(machineName, true)); - payloadSize += 1; - bitmaskOffset = 1; - } else { - bitmaskOffset = 0; - } - - // Not reusing payloadSize here because it can be conditionally mutated. - IntStream.range(0, card.getInt(OUTPUT_ENTRY_LENGTH_KEY)) - .forEach(i -> { - if ((displaySettings & 1 << (i + bitmaskOffset)) != 0) { - returned.add(panelString(card.getString(String.format(OUTPUT_ENTRY_KEY, i)))); - } - }); - - return returned; - } - - @Override - public List getSettingsList() { - return payloadSize == 0 ? ImmutableList.of() - : ImmutableList.copyOf( - IntStream.range(0, Math.min(payloadSize, 31)) - .mapToObj(i -> new PanelSetting(String.valueOf(i + 1), 1 << i, getCardType())) - .iterator()); - } - - @Override - public UUID getCardType() { - return CARD_TYPE_ID; - } - - @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int slot, boolean isHeld) { - super.onUpdate(stack, worldIn, entityIn, slot, isHeld); - // At the time of this comment's writing, there are 52 matches of the regex: - // /% \d+0 \)?\s*== 0/ in the code base, indicating an over-reliance on events happening on either the 10th or - // 20th tick. Let's tick on something slightly off of that. A prime number will do nicely. - if ((worldIn.getWorldTime() % 20) == 13) { - getDataFromDatabase(stack).ifPresent(data -> { - reconcileSelfDestructedCard(stack, data.getState()); - if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); - } - - stack.getTagCompound() - .setInteger( - CARD_STATE_KEY, - data.getState() - .getType()); - }); - } - } - - private void reconcileSelfDestructedCard(ItemStack stack, State newState) { - getUUID(stack).ifPresent(uuid -> getCardState(stack).ifPresent(oldState -> { - if (newState == State.SELF_DESTRUCTED && oldState != State.SELF_DESTRUCTED) { - GlobalMetricsCoverDatabase.clearSelfDestructedFrequency(uuid); - } - })); - - } - - @NotNull - private Optional getCardState(ICardWrapper card) { - return getCardState(card.getItemStack()); - } - - @NotNull - private Optional getCardState(ItemStack itemStack) { - if (itemStack.hasTagCompound() && itemStack.getTagCompound() - .hasKey(CARD_STATE_KEY)) { - return State.find( - itemStack.getTagCompound() - .getInteger(CARD_STATE_KEY)); - } - - return Optional.empty(); - } - - @NotNull - private Optional getUUID(ItemStack stack) { - if (stack.hasTagCompound()) { - NBTTagCompound nbt = stack.getTagCompound(); - if (nbt.hasKey(FREQUENCY_LSB_KEY) && nbt.hasKey(FREQUENCY_MSB_KEY)) { - return Optional.of(new UUID(nbt.getLong(FREQUENCY_MSB_KEY), nbt.getLong(FREQUENCY_LSB_KEY))); - } - } - - return Optional.empty(); - } - - @NotNull - private Optional getMachineName(ItemStack stack) { - if (stack.hasTagCompound() && stack.getTagCompound() - .hasKey(MACHINE_KEY)) { - try { - final ItemStack machine = ItemStack.loadItemStackFromNBT( - stack.getTagCompound() - .getCompoundTag(MACHINE_KEY)); - if (machine != null) { - return Optional.of(machine.getDisplayName()); - } - } catch (Exception ignored) {} - } - - return Optional.empty(); - } - - @NotNull - private Optional getDataFromDatabase(ICardWrapper card) { - return getDataFromDatabase(card.getItemStack()); - } - - @NotNull - private Optional getDataFromDatabase(ItemStack stack) { - return getUUID(stack).flatMap(GlobalMetricsCoverDatabase::getData); - } - - @NotNull - private static PanelString panelString(String info) { - return panelString(info, false); - } - - @NotNull - private static PanelString panelString(String info, boolean center) { - final PanelString panelString = new PanelString(); - if (center) { - panelString.textCenter = info; - } else { - panelString.textLeft = info; - } - return panelString; - - } -} diff --git a/src/main/java/gregtech/common/items/GT_DepletetCell_Item.java b/src/main/java/gregtech/common/items/GT_DepletetCell_Item.java deleted file mode 100644 index df14adc39b..0000000000 --- a/src/main/java/gregtech/common/items/GT_DepletetCell_Item.java +++ /dev/null @@ -1,49 +0,0 @@ -package gregtech.common.items; - -import net.minecraft.item.ItemStack; - -import gregtech.api.items.GT_RadioactiveCellIC_Item; -import ic2.api.reactor.IReactor; - -public class GT_DepletetCell_Item extends GT_RadioactiveCellIC_Item { - - public GT_DepletetCell_Item(String aUnlocalized, String aEnglish, int aRadiation) { - super(aUnlocalized, aEnglish, 1, 1, 0, aRadiation, 0, null, false); - } - - @Override - public void processChamber(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2, - boolean paramBoolean) {} - - @Override - public boolean acceptUraniumPulse(IReactor paramIReactor, ItemStack paramItemStack1, ItemStack paramItemStack2, - int paramInt1, int paramInt2, int paramInt3, int paramInt4, boolean paramBoolean) { - return false; - } - - @Override - public boolean canStoreHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) { - return false; - } - - @Override - public int getMaxHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) { - return 0; - } - - @Override - public int getCurrentHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) { - return 0; - } - - @Override - public int alterHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2, - int paramInt3) { - return 0; - } - - @Override - public float influenceExplosion(IReactor paramIReactor, ItemStack paramItemStack) { - return 0.0F; - } -} diff --git a/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java b/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java deleted file mode 100644 index 850fe21811..0000000000 --- a/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java +++ /dev/null @@ -1,181 +0,0 @@ -package gregtech.common.items; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Stream; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.oredict.OreDictionary; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.util.GT_Utility; - -public class GT_FluidDisplayItem extends GT_Generic_Item { - - private static final Map sFluidTooltips = new HashMap<>(); - - public GT_FluidDisplayItem() { - super("GregTech_FluidDisplay", "Fluid Display", null); - ItemList.Display_Fluid.set(this); - } - - @Override - protected void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - if (FluidRegistry.getFluid(aStack.getItemDamage()) != null) { - String tChemicalFormula = getChemicalFormula( - new FluidStack(FluidRegistry.getFluid(aStack.getItemDamage()), 1)); - if (!tChemicalFormula.isEmpty()) - aList.add(EnumChatFormatting.YELLOW + tChemicalFormula + EnumChatFormatting.RESET); - } - NBTTagCompound aNBT = aStack.getTagCompound(); - if (GT_Values.D1 || Minecraft.getMinecraft().gameSettings.advancedItemTooltips) { - Fluid tFluid = FluidRegistry.getFluid(aStack.getItemDamage()); - if (tFluid != null) { - aList.add("Registry: " + tFluid.getName()); - } - } - if (aNBT != null) { - long tToolTipAmount = aNBT.getLong("mFluidDisplayAmount"); - if (tToolTipAmount > 0L) { - aList.add( - EnumChatFormatting.BLUE + "Amount: " - + GT_Utility.formatNumbers(tToolTipAmount) - + " L" - + EnumChatFormatting.GRAY); - } - aList.add( - EnumChatFormatting.RED + "Temperature: " - + GT_Utility.formatNumbers(aNBT.getLong("mFluidDisplayHeat")) - + " K" - + EnumChatFormatting.GRAY); - aList.add( - EnumChatFormatting.GREEN - + String.format(transItem("018", "State: %s"), aNBT.getBoolean("mFluidState") ? "Gas" : "Liquid") - + EnumChatFormatting.GRAY); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister aIconRegister) {} - - @Override - public IIcon getIconFromDamage(int aMetaData) { - return Stream.of(FluidRegistry.getFluid(aMetaData), FluidRegistry.WATER) - .filter(Objects::nonNull) - .map(Fluid::getStillIcon) - .filter(Objects::nonNull) - .findFirst() - .orElseThrow(IllegalStateException::new); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack aStack, int aRenderPass) { - Fluid tFluid = FluidRegistry.getFluid(aStack.getItemDamage()); - return tFluid == null ? 16777215 : tFluid.getColor(); - } - - @Override - public int getSpriteNumber() { - return 0; - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - if (aStack != null) { - return GT_Utility.getFluidName(FluidRegistry.getFluid(aStack.getItemDamage()), false); - } - return ""; - } - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - if (aStack != null) { - return GT_Utility.getFluidName(FluidRegistry.getFluid(aStack.getItemDamage()), true); - } - return ""; - } - - @SideOnly(Side.CLIENT) - public static String getChemicalFormula(FluidStack aRealFluid) { - return sFluidTooltips.computeIfAbsent(aRealFluid.getFluid(), fluid -> { - for (ItemStack tContainer : GT_Utility.getContainersFromFluid(aRealFluid)) { - if (isCell(tContainer)) { - Materials tMaterial = getMaterialFromCell(tContainer); - if (!tMaterial.equals(Materials._NULL)) { - if (tMaterial.mChemicalFormula.equals("?")) { - return ""; - } else { - return tMaterial.mChemicalFormula; - } - } else { - // For GT++ Fluid Display - // GT++ didn't register a Material in GT, so I have too find the Chemical Formula in its cell's - // tooltip - List tTooltip = tContainer.getTooltip(null, true); - for (String tInfo : tTooltip) { - if (!tInfo.contains(" ") && !tInfo.contains(":") && tTooltip.indexOf(tInfo) != 0) { - return tInfo; - } - } - } - } - } - return ""; - }); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item aItem, CreativeTabs aTab, List aList) { - if (GT_Values.D1) { - int i = 0; - for (int j = FluidRegistry.getMaxID(); i < j; i++) { - ItemStack tStack = GT_Utility.getFluidDisplayStack(FluidRegistry.getFluid(i)); - if (tStack != null) { - aList.add(tStack); - } - } - } - } - - public static boolean isCell(ItemStack tItemStack) { - for (int tOreDict : OreDictionary.getOreIDs(tItemStack)) { - String tOreDictName = OreDictionary.getOreName(tOreDict); - if (tOreDictName.startsWith("cell")) return true; - } - return false; - } - - public static Materials getMaterialFromCell(ItemStack tItemStack) { - for (int tOreDict : OreDictionary.getOreIDs(tItemStack)) { - String tOreDictName = OreDictionary.getOreName(tOreDict); - if (tOreDictName.startsWith("cell")) { - return Materials.getRealMaterial( - tOreDictName.replace("cell", "") - .replace("Molten", "") - .replace("Plasma", "")); - } - } - return Materials._NULL; - } -} diff --git a/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java b/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java deleted file mode 100644 index d0ef03a1ae..0000000000 --- a/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java +++ /dev/null @@ -1,328 +0,0 @@ -package gregtech.common.items; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.Mods.GregTech; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.Predicate; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.FakePlayer; - -import org.apache.commons.lang3.tuple.Pair; - -import com.gtnewhorizons.modularui.api.UIInfos; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.INetworkUpdatableItem; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.net.GT_Packet_UpdateItem; -import gregtech.api.objects.XSTR; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory; - -public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetworkUpdatableItem { - - private static final String aTextEmptyRow = " "; - private static final List ALL_VARIANTS = new ArrayList<>(); - protected final IIcon[] mIconDamage = new IIcon[25]; - - public GT_IntegratedCircuit_Item() { - super("integrated_circuit", "Programmed Circuit", ""); - setHasSubtypes(true); - setMaxDamage(0); - - ItemList.Circuit_Integrated.set(this); - - ALL_VARIANTS.add(new ItemStack(this, 0, 0)); - for (int i = 1; i <= 24; i++) { - ItemStack aStack = new ItemStack(this, 0, i); - GregTech_API.registerConfigurationCircuit(aStack, 1); - ALL_VARIANTS.add(aStack); - } - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 0L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { OrePrefixes.circuit.get(Materials.LV) }); - long bits = GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE; - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 1L), - bits, - new Object[] { "d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 2L), - bits, - new Object[] { " d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 3L), - bits, - new Object[] { " d", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 4L), - bits, - new Object[] { aTextEmptyRow, " Pd", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 5L), - bits, - new Object[] { aTextEmptyRow, " P ", " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 6L), - bits, - new Object[] { aTextEmptyRow, " P ", " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 7L), - bits, - new Object[] { aTextEmptyRow, " P ", "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 8L), - bits, - new Object[] { aTextEmptyRow, "dP ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 9L), - bits, - new Object[] { "P d", aTextEmptyRow, aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 10L), - bits, - new Object[] { "P ", " d", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 11L), - bits, - new Object[] { "P ", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 12L), - bits, - new Object[] { "P ", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 13L), - bits, - new Object[] { " P", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 14L), - bits, - new Object[] { " P", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 15L), - bits, - new Object[] { " P", aTextEmptyRow, "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 16L), - bits, - new Object[] { " P", "d ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 17L), - bits, - new Object[] { aTextEmptyRow, aTextEmptyRow, "d P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 18L), - bits, - new Object[] { aTextEmptyRow, "d ", " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 19L), - bits, - new Object[] { "d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 20L), - bits, - new Object[] { " d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 21L), - bits, - new Object[] { "d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 22L), - bits, - new Object[] { " d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 23L), - bits, - new Object[] { " d", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Circuit_Integrated.getWithDamage(1L, 24L), - bits, - new Object[] { aTextEmptyRow, " d", "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); - } - - private static String getModeString(int aMetaData) { - return switch ((byte) (aMetaData >>> 8)) { - case 0 -> "=="; - case 1 -> "<="; - case 2 -> ">="; - case 3 -> "<"; - case 4 -> ">"; - default -> ""; - }; - } - - private static String getConfigurationString(int aMetaData) { - return getModeString(aMetaData) + " " + (byte) (aMetaData & 0xFF); - } - - @Override - public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - super.addAdditionalToolTips(aList, aStack, aPlayer); - aList.add( - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".configuration", "Configuration: ") - + getConfigurationString(getDamage(aStack))); - aList.add( - GT_LanguageManager - .addStringLocalization(getUnlocalizedName() + ".tooltip.0", "Right click to reconfigure")); - aList.add( - GT_LanguageManager.addStringLocalization( - getUnlocalizedName() + ".tooltip.1", - "Needs a screwdriver or circuit programming tool")); - } - - @Override - public String getUnlocalizedName(ItemStack aStack) { - return getUnlocalizedName(); - } - - @Override - @SideOnly(Side.CLIENT) - public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { - aList.add(new ItemStack(this, 1, 0)); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister aIconRegister) { - super.registerIcons(aIconRegister); - for (int i = 0; i < mIconDamage.length; i++) { - mIconDamage[i] = aIconRegister - .registerIcon(GregTech.getResourcePath(GT_Config.troll ? "troll" : getUnlocalizedName() + "/" + i)); - } - if (GregTech_API.sPostloadFinished) { - GT_Log.out.println("GT_Mod: Starting Item Icon Load Phase"); - GT_FML_LOGGER.info("GT_Mod: Starting Item Icon Load Phase"); - GregTech_API.sItemIcons = aIconRegister; - try { - for (Runnable tRunnable : GregTech_API.sGTItemIconload) { - tRunnable.run(); - } - } catch (Throwable e) { - e.printStackTrace(GT_Log.err); - } - GT_Log.out.println("GT_Mod: Finished Item Icon Load Phase"); - GT_FML_LOGGER.info("GT_Mod: Finished Item Icon Load Phase"); - } - } - - @Override - public IIcon getIconFromDamage(int aMetaData) { - byte circuitMode = ((byte) (aMetaData & 0xFF)); // Mask out the MSB Comparison Mode Bits. See: getModeString - return mIconDamage[circuitMode < mIconDamage.length ? circuitMode : 0]; - } - - @Override - public boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag) { - int meta = tag.hasKey("meta", Constants.NBT.TAG_BYTE) ? tag.getByte("meta") : -1; - if (meta < 0 || meta > 24) return true; - - if (!player.capabilities.isCreativeMode) { - Pair> 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 configurator = findConfiguratorInInv(player); - if (configurator == null) { - int count; - try { - count = Integer - .parseInt(StatCollector.translateToLocal("GT5U.item.programmed_circuit.no_screwdriver.count")); - } catch (NumberFormatException e) { - player.addChatComponentMessage( - new ChatComponentText( - "Error in translation GT5U.item.programmed_circuit.no_screwdriver.count: " - + e.getMessage())); - count = 1; - } - player.addChatComponentMessage( - new ChatComponentTranslation( - "GT5U.item.programmed_circuit.no_screwdriver." + XSTR.XSTR_INSTANCE.nextInt(count))); - return stack; - } - configuratorStack = player.inventory.mainInventory[configurator.getKey()]; - } - openSelectorGui(configuratorStack, stack.getItemDamage(), player); - return stack; - } - - private void openSelectorGui(ItemStack configurator, int meta, EntityPlayer player) { - UIInfos.openClientUI( - player, - buildContext -> new SelectItemUIFactory( - StatCollector.translateToLocal("GT5U.item.programmed_circuit.select.header"), - configurator, - GT_IntegratedCircuit_Item::onConfigured, - ALL_VARIANTS, - meta, - true).createWindow(buildContext)); - } - - private static void onConfigured(ItemStack stack) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setByte("meta", (byte) stack.getItemDamage()); - GT_Values.NW.sendToServer(new GT_Packet_UpdateItem(tag)); - } - - private static Pair> 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, BiFunction> p : GregTech_API.sCircuitProgrammerList - .entrySet()) - if (p.getKey() - .test(toolStack)) return Pair.of(j, p.getValue()); - } - return null; - } -} diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java deleted file mode 100644 index b7380d9eff..0000000000 --- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java +++ /dev/null @@ -1,4635 +0,0 @@ -package gregtech.common.items; - -import static gregtech.api.enums.Textures.BlockIcons.COVER_WOOD_PLATE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ACTIVITYDETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ACTIVITYDETECTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ARM; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CONTROLLER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CONVEYOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CRAFTING; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DRAIN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGYDETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUIDDETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR0; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ITEMDETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MAINTENANCE_DETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PUMP; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_REDSTONE_RECEIVER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_REDSTONE_TRANSMITTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCREEN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCREEN_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SHUTTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_VALVE; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_8V; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_EV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_HV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_IV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_LV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_LuV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_MV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_ZPM; -import static gregtech.client.GT_TooltipHandler.Tier.ERV; -import static gregtech.client.GT_TooltipHandler.Tier.EV; -import static gregtech.client.GT_TooltipHandler.Tier.HV; -import static gregtech.client.GT_TooltipHandler.Tier.IV; -import static gregtech.client.GT_TooltipHandler.Tier.LV; -import static gregtech.client.GT_TooltipHandler.Tier.LuV; -import static gregtech.client.GT_TooltipHandler.Tier.MAX; -import static gregtech.client.GT_TooltipHandler.Tier.MV; -import static gregtech.client.GT_TooltipHandler.Tier.UEV; -import static gregtech.client.GT_TooltipHandler.Tier.UHV; -import static gregtech.client.GT_TooltipHandler.Tier.UIV; -import static gregtech.client.GT_TooltipHandler.Tier.ULV; -import static gregtech.client.GT_TooltipHandler.Tier.UMV; -import static gregtech.client.GT_TooltipHandler.Tier.UV; -import static gregtech.client.GT_TooltipHandler.Tier.UXV; -import static gregtech.client.GT_TooltipHandler.Tier.ZPM; -import static gregtech.client.GT_TooltipHandler.registerTieredTooltip; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_EV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_EV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_IV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_IV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_LuV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_LuV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UEV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UEV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UHV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UHV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UIV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UIV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UMV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UMV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UxV; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_UxV_Full; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_ZPM; -import static gregtech.common.items.ID_MetaItem_01.BatteryHull_ZPM_Full; -import static gregtech.common.items.ID_MetaItem_01.Battery_Hull_HV; -import static gregtech.common.items.ID_MetaItem_01.Battery_Hull_LV; -import static gregtech.common.items.ID_MetaItem_01.Battery_Hull_MV; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_HV_Cadmium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_HV_Lithium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_HV_Sodium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_LV_Cadmium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_LV_Lithium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_LV_Sodium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_MV_Cadmium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_MV_Lithium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_MV_Sodium; -import static gregtech.common.items.ID_MetaItem_01.Battery_RE_ULV_Tantalum; -import static gregtech.common.items.ID_MetaItem_01.Battery_SU_HV_Mercury; -import static gregtech.common.items.ID_MetaItem_01.Battery_SU_HV_Sulfuric_Acid; -import static gregtech.common.items.ID_MetaItem_01.Battery_SU_LV_Mercury; -import static gregtech.common.items.ID_MetaItem_01.Battery_SU_LV_Sulfuric_Acid; -import static gregtech.common.items.ID_MetaItem_01.Battery_SU_MV_Mercury; -import static gregtech.common.items.ID_MetaItem_01.Battery_SU_MV_Sulfuric_Acid; -import static gregtech.common.items.ID_MetaItem_01.Black_Hole_Closer; -import static gregtech.common.items.ID_MetaItem_01.Black_Hole_Opener; -import static gregtech.common.items.ID_MetaItem_01.Book_Written_01; -import static gregtech.common.items.ID_MetaItem_01.Book_Written_02; -import static gregtech.common.items.ID_MetaItem_01.Book_Written_03; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Advanced; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Basic; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Board_Advanced; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Board_Basic; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Board_Elite; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Data; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Elite; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Good; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Master; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Parts_Advanced; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Parts_Crystal_Chip_Elite; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Parts_Crystal_Chip_Master; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Parts_Crystal_Chip_Wetware; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Parts_Wiring_Advanced; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Parts_Wiring_Basic; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Parts_Wiring_Elite; -import static gregtech.common.items.ID_MetaItem_01.Circuit_Primitive; -import static gregtech.common.items.ID_MetaItem_01.Component_Filter; -import static gregtech.common.items.ID_MetaItem_01.Component_Grinder_Diamond; -import static gregtech.common.items.ID_MetaItem_01.Component_Grinder_Tungsten; -import static gregtech.common.items.ID_MetaItem_01.Component_Minecraft_Wheels_Iron; -import static gregtech.common.items.ID_MetaItem_01.Component_Minecraft_Wheels_Steel; -import static gregtech.common.items.ID_MetaItem_01.Component_Sawblade_Diamond; -import static gregtech.common.items.ID_MetaItem_01.Compressed_Fireclay; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_EV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_HV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_IV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_LV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_LuV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_MAX; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_MV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_UEV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_UHV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_UIV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_UMV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_UV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_UXV; -import static gregtech.common.items.ID_MetaItem_01.Conveyor_Module_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Cover_ActivityDetector; -import static gregtech.common.items.ID_MetaItem_01.Cover_Chest_Advanced; -import static gregtech.common.items.ID_MetaItem_01.Cover_Chest_Basic; -import static gregtech.common.items.ID_MetaItem_01.Cover_Chest_Good; -import static gregtech.common.items.ID_MetaItem_01.Cover_Controller; -import static gregtech.common.items.ID_MetaItem_01.Cover_Crafting; -import static gregtech.common.items.ID_MetaItem_01.Cover_Drain; -import static gregtech.common.items.ID_MetaItem_01.Cover_EnergyDetector; -import static gregtech.common.items.ID_MetaItem_01.Cover_FLuidStorageMonitor; -import static gregtech.common.items.ID_MetaItem_01.Cover_FluidDetector; -import static gregtech.common.items.ID_MetaItem_01.Cover_FluidLimiter; -import static gregtech.common.items.ID_MetaItem_01.Cover_ItemDetector; -import static gregtech.common.items.ID_MetaItem_01.Cover_NeedsMaintenance; -import static gregtech.common.items.ID_MetaItem_01.Cover_PlayerDetector; -import static gregtech.common.items.ID_MetaItem_01.Cover_RedstoneReceiverExternal; -import static gregtech.common.items.ID_MetaItem_01.Cover_RedstoneReceiverInternal; -import static gregtech.common.items.ID_MetaItem_01.Cover_RedstoneTransmitterExternal; -import static gregtech.common.items.ID_MetaItem_01.Cover_RedstoneTransmitterInternal; -import static gregtech.common.items.ID_MetaItem_01.Cover_Screen; -import static gregtech.common.items.ID_MetaItem_01.Cover_Shutter; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_8V; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_EV; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_HV; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_IV; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_LV; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_LuV; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_MV; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_UV; -import static gregtech.common.items.ID_MetaItem_01.Cover_SolarPanel_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Crate_Empty; -import static gregtech.common.items.ID_MetaItem_01.Duct_Tape; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_EV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_HV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_IV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_LV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_LuV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_MAX; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_MV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_UEV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_UHV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_UIV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_UMV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_UV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_UXV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Motor_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_EV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_HV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_IV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_LV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_LuV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_MAX; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_MV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_UEV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_UHV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_UIV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_UMV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_UV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_UXV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Piston_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_EV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_HV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_IV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_LV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_LuV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_MAX; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_MV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_UEV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_UHV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_UIV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_UMV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_UV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_UXV; -import static gregtech.common.items.ID_MetaItem_01.Electric_Pump_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Electromagnet_Iron; -import static gregtech.common.items.ID_MetaItem_01.Electromagnet_Neodymium; -import static gregtech.common.items.ID_MetaItem_01.Electromagnet_Samarium; -import static gregtech.common.items.ID_MetaItem_01.Electromagnet_Steel; -import static gregtech.common.items.ID_MetaItem_01.Electromagnet_Tengam; -import static gregtech.common.items.ID_MetaItem_01.Emitter_EV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_HV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_IV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_LV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_LuV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_MAX; -import static gregtech.common.items.ID_MetaItem_01.Emitter_MV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_UEV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_UHV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_UIV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_UMV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_UV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_UXV; -import static gregtech.common.items.ID_MetaItem_01.Emitter_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Empty_Board_Basic; -import static gregtech.common.items.ID_MetaItem_01.Empty_Board_Elite; -import static gregtech.common.items.ID_MetaItem_01.EnergisedTesseract; -import static gregtech.common.items.ID_MetaItem_01.Energy_Cluster; -import static gregtech.common.items.ID_MetaItem_01.Energy_Lapotronic_Orb; -import static gregtech.common.items.ID_MetaItem_01.Energy_Lapotronic_orb_2; -import static gregtech.common.items.ID_MetaItem_01.Energy_Module; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_EV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_HV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_IV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_LV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_LuV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_MAX; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_MV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_UEV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_UHV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_UIV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_UMV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_UV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_UXV; -import static gregtech.common.items.ID_MetaItem_01.Field_Generator_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Firebrick; -import static gregtech.common.items.ID_MetaItem_01.FluidFilter; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_EV; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_HV; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_IV; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_LV; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_LuV; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_MV; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_UV; -import static gregtech.common.items.ID_MetaItem_01.FluidRegulator_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Fuel_Can_Plastic_Empty; -import static gregtech.common.items.ID_MetaItem_01.Fuel_Can_Plastic_Filled; -import static gregtech.common.items.ID_MetaItem_01.GigaChad; -import static gregtech.common.items.ID_MetaItem_01.Gravistar; -import static gregtech.common.items.ID_MetaItem_01.Ingot_Heavy1; -import static gregtech.common.items.ID_MetaItem_01.Ingot_Heavy2; -import static gregtech.common.items.ID_MetaItem_01.Ingot_Heavy3; -import static gregtech.common.items.ID_MetaItem_01.Ingot_Iridium_Alloy; -import static gregtech.common.items.ID_MetaItem_01.ItemFilter_Export; -import static gregtech.common.items.ID_MetaItem_01.ItemFilter_Import; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_Aluminium; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_Chrome; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_Iridium; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_Neutronium; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_Osmium; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_StainlessSteel; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_Steel; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_Titanium; -import static gregtech.common.items.ID_MetaItem_01.Large_Fluid_Cell_TungstenSteel; -import static gregtech.common.items.ID_MetaItem_01.McGuffium_239; -import static gregtech.common.items.ID_MetaItem_01.NC_SensorKit; -import static gregtech.common.items.ID_MetaItem_01.NaquadriaSupersolid; -import static gregtech.common.items.ID_MetaItem_01.Paper_Magic_Empty; -import static gregtech.common.items.ID_MetaItem_01.Paper_Magic_Page; -import static gregtech.common.items.ID_MetaItem_01.Paper_Magic_Pages; -import static gregtech.common.items.ID_MetaItem_01.Paper_Printed_Pages; -import static gregtech.common.items.ID_MetaItem_01.Paper_Punch_Card_Empty; -import static gregtech.common.items.ID_MetaItem_01.Paper_Punch_Card_Encoded; -import static gregtech.common.items.ID_MetaItem_01.QuantumEye; -import static gregtech.common.items.ID_MetaItem_01.QuantumStar; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_EV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_HV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_IV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_LV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_LuV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_MAX; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_MV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_UEV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_UHV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_UIV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_UMV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_UV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_UXV; -import static gregtech.common.items.ID_MetaItem_01.Robot_Arm_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Schematic; -import static gregtech.common.items.ID_MetaItem_01.Schematic_1by1; -import static gregtech.common.items.ID_MetaItem_01.Schematic_2by2; -import static gregtech.common.items.ID_MetaItem_01.Schematic_3by3; -import static gregtech.common.items.ID_MetaItem_01.Schematic_Crafting; -import static gregtech.common.items.ID_MetaItem_01.Schematic_Dust; -import static gregtech.common.items.ID_MetaItem_01.Sensor_EV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_HV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_IV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_LV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_LuV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_MAX; -import static gregtech.common.items.ID_MetaItem_01.Sensor_MV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_UEV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_UHV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_UIV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_UMV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_UV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_UXV; -import static gregtech.common.items.ID_MetaItem_01.Sensor_ZPM; -import static gregtech.common.items.ID_MetaItem_01.Shape_Empty; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Axe; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Block; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Bolt; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Bottle; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Casing; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Cell; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_File; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Gear; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Hammer; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Hoe; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Ingot; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Pickaxe; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Pipe_Huge; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Pipe_Large; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Pipe_Medium; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Pipe_Small; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Pipe_Tiny; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Plate; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Ring; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Rod; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Rotor; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Saw; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Shovel; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Small_Gear; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Sword; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Tool_Head_Drill; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Turbine_Blade; -import static gregtech.common.items.ID_MetaItem_01.Shape_Extruder_Wire; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Anvil; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Arrow; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Baguette; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Ball; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Block; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Bolt; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Bottle; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Bread; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Bun; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Casing; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Credit; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Cylinder; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Gear; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Gear_Small; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Ingot; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Name; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Nugget; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Pipe_Huge; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Pipe_Large; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Pipe_Medium; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Pipe_Small; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Pipe_Tiny; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Plate; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Ring; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Rod; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Rod_Long; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Rotor; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Round; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Screw; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Tool_Head_Drill; -import static gregtech.common.items.ID_MetaItem_01.Shape_Mold_Turbine_Blade; -import static gregtech.common.items.ID_MetaItem_01.Shape_Slicer_Flat; -import static gregtech.common.items.ID_MetaItem_01.Shape_Slicer_Stripes; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_0; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_1; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_10; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_11; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_12; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_13; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_14; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_15; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_2; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_3; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_4; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_5; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_6; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_7; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_8; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_9; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Remover; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Remover_Empty; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_0; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_1; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_10; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_11; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_12; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_13; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_14; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_15; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_2; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_3; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_4; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_5; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_6; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_7; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_8; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_9; -import static gregtech.common.items.ID_MetaItem_01.Spray_Color_Used_Remover; -import static gregtech.common.items.ID_MetaItem_01.Spray_Empty; -import static gregtech.common.items.ID_MetaItem_01.StableAdhesive; -import static gregtech.common.items.ID_MetaItem_01.Steam_Regulator_EV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Regulator_HV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Regulator_IV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Regulator_LV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Regulator_MV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Valve_EV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Valve_HV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Valve_IV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Valve_LV; -import static gregtech.common.items.ID_MetaItem_01.Steam_Valve_MV; -import static gregtech.common.items.ID_MetaItem_01.SuperconductorComposite; -import static gregtech.common.items.ID_MetaItem_01.Tesseract; -import static gregtech.common.items.ID_MetaItem_01.Thermos_Can_Empty; -import static gregtech.common.items.ID_MetaItem_01.Tool_Cheat; -import static gregtech.common.items.ID_MetaItem_01.Tool_Cover_Copy_Paste; -import static gregtech.common.items.ID_MetaItem_01.Tool_DataOrb; -import static gregtech.common.items.ID_MetaItem_01.Tool_DataStick; -import static gregtech.common.items.ID_MetaItem_01.Tool_Lighter_Invar_Empty; -import static gregtech.common.items.ID_MetaItem_01.Tool_Lighter_Invar_Full; -import static gregtech.common.items.ID_MetaItem_01.Tool_Lighter_Invar_Used; -import static gregtech.common.items.ID_MetaItem_01.Tool_Lighter_Platinum_Empty; -import static gregtech.common.items.ID_MetaItem_01.Tool_Lighter_Platinum_Full; -import static gregtech.common.items.ID_MetaItem_01.Tool_Lighter_Platinum_Used; -import static gregtech.common.items.ID_MetaItem_01.Tool_MatchBox_Full; -import static gregtech.common.items.ID_MetaItem_01.Tool_MatchBox_Used; -import static gregtech.common.items.ID_MetaItem_01.Tool_Matches; -import static gregtech.common.items.ID_MetaItem_01.Tool_Scanner; -import static gregtech.common.items.ID_MetaItem_01.Tool_Sonictron; -import static gregtech.common.items.ID_MetaItem_01.Upgrade_Lock; -import static gregtech.common.items.ID_MetaItem_01.Upgrade_Muffler; -import static gregtech.common.items.ID_MetaItem_01.ZPM2; -import static gregtech.common.items.ID_MetaItem_01.ZPM3; -import static gregtech.common.items.ID_MetaItem_01.ZPM4; -import static gregtech.common.items.ID_MetaItem_01.ZPM5; -import static gregtech.common.items.ID_MetaItem_01.ZPM6; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MathHelper; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OreDictNames; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TC_Aspects; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.interfaces.ITexture; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Item_X32; -import gregtech.api.objects.ItemData; -import gregtech.api.objects.MaterialStack; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_FoodStat; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.config.other.ConfigGeneral; -import gregtech.common.covers.GT_Cover_Arm; -import gregtech.common.covers.GT_Cover_Chest; -import gregtech.common.covers.GT_Cover_ControlsWork; -import gregtech.common.covers.GT_Cover_Conveyor; -import gregtech.common.covers.GT_Cover_Crafting; -import gregtech.common.covers.GT_Cover_DoesWork; -import gregtech.common.covers.GT_Cover_Drain; -import gregtech.common.covers.GT_Cover_EUMeter; -import gregtech.common.covers.GT_Cover_FluidLimiter; -import gregtech.common.covers.GT_Cover_FluidRegulator; -import gregtech.common.covers.GT_Cover_FluidStorageMonitor; -import gregtech.common.covers.GT_Cover_Fluidfilter; -import gregtech.common.covers.GT_Cover_ItemFilter; -import gregtech.common.covers.GT_Cover_ItemMeter; -import gregtech.common.covers.GT_Cover_LiquidMeter; -import gregtech.common.covers.GT_Cover_NeedMaintainance; -import gregtech.common.covers.GT_Cover_PlayerDetector; -import gregtech.common.covers.GT_Cover_Pump; -import gregtech.common.covers.GT_Cover_RedstoneReceiverExternal; -import gregtech.common.covers.GT_Cover_RedstoneReceiverInternal; -import gregtech.common.covers.GT_Cover_RedstoneTransmitterExternal; -import gregtech.common.covers.GT_Cover_RedstoneTransmitterInternal; -import gregtech.common.covers.GT_Cover_Screen; -import gregtech.common.covers.GT_Cover_Shutter; -import gregtech.common.covers.GT_Cover_SolarPanel; -import gregtech.common.covers.GT_Cover_SteamRegulator; -import gregtech.common.covers.GT_Cover_SteamValve; -import gregtech.common.items.behaviors.Behaviour_Cover_Tool; -import gregtech.common.items.behaviors.Behaviour_DataOrb; -import gregtech.common.items.behaviors.Behaviour_DataStick; -import gregtech.common.items.behaviors.Behaviour_Lighter; -import gregtech.common.items.behaviors.Behaviour_PrintedPages; -import gregtech.common.items.behaviors.Behaviour_Scanner; -import gregtech.common.items.behaviors.Behaviour_SensorKit; -import gregtech.common.items.behaviors.Behaviour_Sonictron; -import gregtech.common.items.behaviors.Behaviour_Spray_Color; -import gregtech.common.items.behaviors.Behaviour_Spray_Color_Remover; -import gregtech.common.items.behaviors.Behaviour_WrittenBook; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_IndustrialElectromagneticSeparator.MagnetTiers; - -public class GT_MetaGenerated_Item_01 extends GT_MetaGenerated_Item_X32 { - - public static GT_MetaGenerated_Item_01 INSTANCE; - private final String mToolTipPurify = GT_LanguageManager - .addStringLocalization("metaitem.01.tooltip.purify", "Throw into Cauldron to get clean Dust"); - private static final String aTextEmptyRow = " "; - private static final String aTextShape = " P "; - private static final String PartCoverText = " L/t ("; - private static final String PartCoverText2 = " L/s) as Cover"; - private static final String PartNotCoverText = "Cannot be used as a Cover"; - private static final String RAText = "Grabs from and inserts into specific slots"; - private static final String FRText1 = "Configurable up to "; - private static final String FRText2 = " L/sec (as Cover)/n Rightclick/Screwdriver-rightclick/Shift-screwdriver-rightclick/n to adjust the pump speed by 1/16/256 L/sec per click"; - - private static final int[] Spray_Colors = new int[] { Spray_Color_0.ID, Spray_Color_1.ID, Spray_Color_2.ID, - Spray_Color_3.ID, Spray_Color_4.ID, Spray_Color_5.ID, Spray_Color_6.ID, Spray_Color_7.ID, Spray_Color_8.ID, - Spray_Color_9.ID, Spray_Color_10.ID, Spray_Color_11.ID, Spray_Color_12.ID, Spray_Color_13.ID, Spray_Color_14.ID, - Spray_Color_15.ID }; - private static final int[] Spray_Colors_Used = new int[] { Spray_Color_Used_0.ID, Spray_Color_Used_1.ID, - Spray_Color_Used_2.ID, Spray_Color_Used_3.ID, Spray_Color_Used_4.ID, Spray_Color_Used_5.ID, - Spray_Color_Used_6.ID, Spray_Color_Used_7.ID, Spray_Color_Used_8.ID, Spray_Color_Used_9.ID, - Spray_Color_Used_10.ID, Spray_Color_Used_11.ID, Spray_Color_Used_12.ID, Spray_Color_Used_13.ID, - Spray_Color_Used_14.ID, Spray_Color_Used_15.ID }; - - public GT_MetaGenerated_Item_01() { - super( - "metaitem.01", - OrePrefixes.dustTiny, - OrePrefixes.dustSmall, - OrePrefixes.dust, - OrePrefixes.dustImpure, - OrePrefixes.dustPure, - OrePrefixes.crushed, - OrePrefixes.crushedPurified, - OrePrefixes.crushedCentrifuged, - OrePrefixes.gem, - OrePrefixes.nugget, - null, - OrePrefixes.ingot, - OrePrefixes.ingotHot, - OrePrefixes.ingotDouble, - OrePrefixes.ingotTriple, - OrePrefixes.ingotQuadruple, - OrePrefixes.ingotQuintuple, - OrePrefixes.plate, - OrePrefixes.plateDouble, - OrePrefixes.plateTriple, - OrePrefixes.plateQuadruple, - OrePrefixes.plateQuintuple, - OrePrefixes.plateDense, - OrePrefixes.stick, - OrePrefixes.lens, - OrePrefixes.round, - OrePrefixes.bolt, - OrePrefixes.screw, - OrePrefixes.ring, - OrePrefixes.foil, - OrePrefixes.cell, - OrePrefixes.cellPlasma); - INSTANCE = this; - - ItemList.Credit_Greg_Copper - .set(addItem(ID_MetaItem_01.Credit_Greg_Copper.ID, "Copper GT Credit", "0.125 Credits")); - ItemList.Credit_Greg_Cupronickel.set( - addItem( - ID_MetaItem_01.Credit_Greg_Cupronickel.ID, - "Cupronickel GT Credit", - "1 Credit", - new ItemData(Materials.Cupronickel, 907200L))); - ItemList.Credit_Greg_Silver.set( - addItem( - ID_MetaItem_01.Credit_Greg_Silver.ID, - "Silver GT Credit", - "8 Credits", - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - ItemList.Credit_Greg_Gold.set(addItem(ID_MetaItem_01.Credit_Greg_Gold.ID, "Gold GT Credit", "64 Credits")); - ItemList.Credit_Greg_Platinum - .set(addItem(ID_MetaItem_01.Credit_Greg_Platinum.ID, "Platinum GT Credit", "512 Credits")); - ItemList.Credit_Greg_Osmium - .set(addItem(ID_MetaItem_01.Credit_Greg_Osmium.ID, "Osmium GT Credit", "4,096 Credits")); - ItemList.Credit_Greg_Naquadah - .set(addItem(ID_MetaItem_01.Credit_Greg_Naquadah.ID, "Naquadah GT Credit", "32,768 Credits")); - ItemList.Credit_Greg_Neutronium - .set(addItem(ID_MetaItem_01.Credit_Greg_Neutronium.ID, "Neutronium GT Credit", "262,144 Credits")); - ItemList.Coin_Gold_Ancient.set( - addItem( - ID_MetaItem_01.Coin_Gold_Ancient.ID, - "Ancient Gold Coin", - "Found in ancient Ruins", - new ItemData(Materials.Gold, 907200L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 8L))); - ItemList.Coin_Doge.set( - addItem( - ID_MetaItem_01.Coin_Doge.ID, - "Doge Coin", - "wow much coin how money so crypto plz mine v rich very currency wow", - new ItemData(Materials.Brass, 907200L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - ItemList.Coin_Chocolate.set( - addItem( - ID_MetaItem_01.Coin_Chocolate.ID, - "Chocolate Coin", - "Wrapped in Gold", - new ItemData(Materials.Gold, OrePrefixes.foil.mMaterialAmount), - new GT_FoodStat( - 1, - 0.1F, - EnumAction.eat, - GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, 1L), - true, - false, - false, - Potion.moveSpeed.id, - 200, - 1, - 100))); - ItemList.Credit_Copper - .set(addItem(ID_MetaItem_01.Credit_Copper.ID, "Industrial Copper Credit", "0.125 Credits")); - - ItemList.Credit_Silver.set( - addItem( - ID_MetaItem_01.Credit_Silver.ID, - "Industrial Silver Credit", - "8 Credits", - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - ItemList.Credit_Gold.set(addItem(ID_MetaItem_01.Credit_Gold.ID, "Industrial Gold Credit", "64 Credits")); - ItemList.Credit_Platinum - .set(addItem(ID_MetaItem_01.Credit_Platinum.ID, "Industrial Platinum Credit", "512 Credits")); - ItemList.Credit_Osmium - .set(addItem(ID_MetaItem_01.Credit_Osmium.ID, "Industrial Osmium Credit", "4096 Credits")); - - ItemList.Component_Minecart_Wheels_Iron.set( - addItem( - Component_Minecraft_Wheels_Iron.ID, - "Iron Minecart Wheels", - "To get things rolling", - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L))); - ItemList.Component_Minecart_Wheels_Steel.set( - addItem( - Component_Minecraft_Wheels_Steel.ID, - "Steel Minecart Wheels", - "To get things rolling", - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L))); - - GT_ModHandler.addCraftingRecipe( - ItemList.Component_Minecart_Wheels_Iron.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { " h ", "RSR", " w ", 'R', OrePrefixes.ring.get(Materials.AnyIron), 'S', - OrePrefixes.stick.get(Materials.AnyIron) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Component_Minecart_Wheels_Steel.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { " h ", "RSR", " w ", 'R', OrePrefixes.ring.get(Materials.Steel), 'S', - OrePrefixes.stick.get(Materials.Steel) }); - - ItemList.CompressedFireclay.set(addItem(Compressed_Fireclay.ID, "Compressed Fireclay", "Brick-shaped")); - GT_OreDictUnificator.addItemDataFromInputs(ItemList.CompressedFireclay.get(1), Materials.Fireclay.getDust(1)); - - ItemList.Firebrick.set(addItem(Firebrick.ID, "Firebrick", "Heat resistant")); - GT_OreDictUnificator.addItemDataFromInputs(ItemList.Firebrick.get(1), Materials.Fireclay.getDust(1)); - - ItemList.Shape_Empty.set( - addItem( - Shape_Empty.ID, - "Empty Shape Plate", - "Raw Plate to make Molds and Extruder Shapes", - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L))); - - ItemList.Shape_Mold_Plate.set(addItem(Shape_Mold_Plate.ID, "Mold (Plate)", "Mold for making Plates")); - ItemList.Shape_Mold_Casing.set(addItem(Shape_Mold_Casing.ID, "Mold (Casing)", "Mold for making Item Casings")); - ItemList.Shape_Mold_Gear.set(addItem(Shape_Mold_Gear.ID, "Mold (Gear)", "Mold for making Gears")); - ItemList.Shape_Mold_Credit - .set(addItem(Shape_Mold_Credit.ID, "Mold (Coinage)", "Secure Mold for making Coins (Don't lose it!)")); - ItemList.Shape_Mold_Bottle.set(addItem(Shape_Mold_Bottle.ID, "Mold (Bottle)", "Mold for making Bottles")); - ItemList.Shape_Mold_Ingot.set(addItem(Shape_Mold_Ingot.ID, "Mold (Ingot)", "Mold for making Ingots")); - ItemList.Shape_Mold_Ball.set(addItem(Shape_Mold_Ball.ID, "Mold (Ball)", "Mold for making Balls")); - ItemList.Shape_Mold_Block.set(addItem(Shape_Mold_Block.ID, "Mold (Block)", "Mold for making Blocks")); - ItemList.Shape_Mold_Nugget.set(addItem(Shape_Mold_Nugget.ID, "Mold (Nuggets)", "Mold for making Nuggets")); - ItemList.Shape_Mold_Bun.set(addItem(Shape_Mold_Bun.ID, "Mold (Buns)", "Mold for shaping Buns")); - ItemList.Shape_Mold_Bread.set(addItem(Shape_Mold_Bread.ID, "Mold (Bread)", "Mold for shaping Breads")); - ItemList.Shape_Mold_Baguette - .set(addItem(Shape_Mold_Baguette.ID, "Mold (Baguette)", "Mold for shaping Baguettes")); - ItemList.Shape_Mold_Cylinder - .set(addItem(Shape_Mold_Cylinder.ID, "Mold (Cylinder)", "Mold for shaping Cylinders")); - ItemList.Shape_Mold_Anvil.set(addItem(Shape_Mold_Anvil.ID, "Mold (Anvil)", "Mold for shaping Anvils")); - ItemList.Shape_Mold_Name - .set(addItem(Shape_Mold_Name.ID, "Mold (Name)", "Mold for naming Items (rename Mold with Anvil)")); - ItemList.Shape_Mold_Arrow.set(addItem(Shape_Mold_Arrow.ID, "Mold (Arrow Head)", "Mold for making Arrow Heads")); - ItemList.Shape_Mold_Gear_Small - .set(addItem(Shape_Mold_Gear_Small.ID, "Mold (Small Gear)", "Mold for making small Gears")); - ItemList.Shape_Mold_Rod.set(addItem(Shape_Mold_Rod.ID, "Mold (Rod)", "Mold for making Rods")); - ItemList.Shape_Mold_Bolt.set(addItem(Shape_Mold_Bolt.ID, "Mold (Bolt)", "Mold for making Bolts")); - ItemList.Shape_Mold_Round.set(addItem(Shape_Mold_Round.ID, "Mold (Round)", "Mold for making Rounds")); - ItemList.Shape_Mold_Screw.set(addItem(Shape_Mold_Screw.ID, "Mold (Screw)", "Mold for making Screws")); - ItemList.Shape_Mold_Ring.set(addItem(Shape_Mold_Ring.ID, "Mold (Ring)", "Mold for making Rings")); - ItemList.Shape_Mold_Rod_Long - .set(addItem(Shape_Mold_Rod_Long.ID, "Mold (Long Rod)", "Mold for making Long Rods")); - ItemList.Shape_Mold_Rotor.set(addItem(Shape_Mold_Rotor.ID, "Mold (Rotor)", "Mold for making a Rotor")); - ItemList.Shape_Mold_Turbine_Blade - .set(addItem(Shape_Mold_Turbine_Blade.ID, "Mold (Turbine Blade)", "Mold for making a Turbine Blade")); - ItemList.Shape_Mold_Pipe_Tiny - .set(addItem(Shape_Mold_Pipe_Tiny.ID, "Mold (Tiny Pipe)", "Mold for making tiny Pipes")); - ItemList.Shape_Mold_Pipe_Small - .set(addItem(Shape_Mold_Pipe_Small.ID, "Mold (Small Pipe)", "Mold for making small Pipes")); - ItemList.Shape_Mold_Pipe_Medium - .set(addItem(Shape_Mold_Pipe_Medium.ID, "Mold (Normal Pipe)", "Mold for making Pipes")); - ItemList.Shape_Mold_Pipe_Large - .set(addItem(Shape_Mold_Pipe_Large.ID, "Mold (Large Pipe)", "Mold for making large Pipes")); - ItemList.Shape_Mold_Pipe_Huge - .set(addItem(Shape_Mold_Pipe_Huge.ID, "Mold (Huge Pipe)", "Mold for making full Block Pipes")); - ItemList.Shape_Mold_ToolHeadDrill - .set(addItem(Shape_Mold_Tool_Head_Drill.ID, "Mold (Drill Head)", "Mold for making Drill Heads")); - - ItemList.Shape_Extruder_Plate - .set(addItem(Shape_Extruder_Plate.ID, "Extruder Shape (Plate)", "Extruder Shape for making Plates")); - ItemList.Shape_Extruder_Rod - .set(addItem(Shape_Extruder_Rod.ID, "Extruder Shape (Rod)", "Extruder Shape for making Rods")); - ItemList.Shape_Extruder_Bolt - .set(addItem(Shape_Extruder_Bolt.ID, "Extruder Shape (Bolt)", "Extruder Shape for making Bolts")); - ItemList.Shape_Extruder_Ring - .set(addItem(Shape_Extruder_Ring.ID, "Extruder Shape (Ring)", "Extruder Shape for making Rings")); - ItemList.Shape_Extruder_Cell - .set(addItem(Shape_Extruder_Cell.ID, "Extruder Shape (Cell)", "Extruder Shape for making Cells")); - ItemList.Shape_Extruder_Ingot.set( - addItem( - Shape_Extruder_Ingot.ID, - "Extruder Shape (Ingot)", - "Extruder Shape for, wait, can't we just use a Furnace?")); - ItemList.Shape_Extruder_Wire - .set(addItem(Shape_Extruder_Wire.ID, "Extruder Shape (Wire)", "Extruder Shape for making Wires")); - ItemList.Shape_Extruder_Casing.set( - addItem(Shape_Extruder_Casing.ID, "Extruder Shape (Casing)", "Extruder Shape for making Item Casings")); - ItemList.Shape_Extruder_Pipe_Tiny.set( - addItem(Shape_Extruder_Pipe_Tiny.ID, "Extruder Shape (Tiny Pipe)", "Extruder Shape for making tiny Pipes")); - ItemList.Shape_Extruder_Pipe_Small.set( - addItem( - Shape_Extruder_Pipe_Small.ID, - "Extruder Shape (Small Pipe)", - "Extruder Shape for making small Pipes")); - ItemList.Shape_Extruder_Pipe_Medium.set( - addItem(Shape_Extruder_Pipe_Medium.ID, "Extruder Shape (Normal Pipe)", "Extruder Shape for making Pipes")); - ItemList.Shape_Extruder_Pipe_Large.set( - addItem( - Shape_Extruder_Pipe_Large.ID, - "Extruder Shape (Large Pipe)", - "Extruder Shape for making large Pipes")); - ItemList.Shape_Extruder_Pipe_Huge.set( - addItem( - Shape_Extruder_Pipe_Huge.ID, - "Extruder Shape (Huge Pipe)", - "Extruder Shape for making full Block Pipes")); - ItemList.Shape_Extruder_Block - .set(addItem(Shape_Extruder_Block.ID, "Extruder Shape (Block)", "Extruder Shape for making Blocks")); - ItemList.Shape_Extruder_Sword - .set(addItem(Shape_Extruder_Sword.ID, "Extruder Shape (Sword Blade)", "Extruder Shape for making Swords")); - ItemList.Shape_Extruder_Pickaxe.set( - addItem(Shape_Extruder_Pickaxe.ID, "Extruder Shape (Pickaxe Head)", "Extruder Shape for making Pickaxes")); - ItemList.Shape_Extruder_Shovel.set( - addItem(Shape_Extruder_Shovel.ID, "Extruder Shape (Shovel Head)", "Extruder Shape for making Shovels")); - ItemList.Shape_Extruder_Axe - .set(addItem(Shape_Extruder_Axe.ID, "Extruder Shape (Axe Head)", "Extruder Shape for making Axes")); - ItemList.Shape_Extruder_Hoe - .set(addItem(Shape_Extruder_Hoe.ID, "Extruder Shape (Hoe Head)", "Extruder Shape for making Hoes")); - ItemList.Shape_Extruder_Hammer.set( - addItem(Shape_Extruder_Hammer.ID, "Extruder Shape (Hammer Head)", "Extruder Shape for making Hammers")); - ItemList.Shape_Extruder_File - .set(addItem(Shape_Extruder_File.ID, "Extruder Shape (File Head)", "Extruder Shape for making Files")); - ItemList.Shape_Extruder_Saw - .set(addItem(Shape_Extruder_Saw.ID, "Extruder Shape (Saw Blade)", "Extruder Shape for making Saws")); - ItemList.Shape_Extruder_Gear - .set(addItem(Shape_Extruder_Gear.ID, "Extruder Shape (Gear)", "Extruder Shape for making Gears")); - ItemList.Shape_Extruder_Bottle - .set(addItem(Shape_Extruder_Bottle.ID, "Extruder Shape (Bottle)", "Extruder Shape for making Bottles")); - ItemList.Shape_Extruder_Rotor - .set(addItem(Shape_Extruder_Rotor.ID, "Extruder Shape (Rotor)", "Extruder Shape for a Rotor")); - ItemList.Shape_Extruder_Small_Gear.set( - addItem(Shape_Extruder_Small_Gear.ID, "Extruder Shape (Small Gear)", "Extruder Shape for a Small Gear")); - ItemList.Shape_Extruder_Turbine_Blade.set( - addItem( - Shape_Extruder_Turbine_Blade.ID, - "Extruder Shape (Turbine Blade)", - "Extruder Shape for a Turbine Blade")); - ItemList.Shape_Extruder_ToolHeadDrill.set( - addItem( - Shape_Extruder_Tool_Head_Drill.ID, - "Extruder Shape (Drill Head)", - "Extruder Shape for a Drill Head")); - - ItemList.Shape_Slicer_Flat - .set(addItem(Shape_Slicer_Flat.ID, "Slicer Blade (Flat)", "Slicer Blade for cutting Flat")); - ItemList.Shape_Slicer_Stripes - .set(addItem(Shape_Slicer_Stripes.ID, "Slicer Blade (Stripes)", "Slicer Blade for cutting Stripes")); - - ItemList.Fuel_Can_Plastic_Empty.set( - addItem( - Fuel_Can_Plastic_Empty.ID, - "Empty Plastic Fuel Can", - "Used to store Fuels", - new ItemData(Materials.Plastic, OrePrefixes.plate.mMaterialAmount * 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L))); - ItemList.Fuel_Can_Plastic_Filled.set( - addItem( - Fuel_Can_Plastic_Filled.ID, - "Plastic Fuel Can", - "Burns well in Diesel Generators", - new ItemData(Materials.Plastic, OrePrefixes.plate.mMaterialAmount * 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L))); - - ItemList.Spray_Empty.set( - addItem( - Spray_Empty.ID, - "Empty Spray Can", - "Used for making Sprays", - new ItemData( - Materials.Tin, - OrePrefixes.plate.mMaterialAmount * 2L, - Materials.Redstone, - OrePrefixes.dust.mMaterialAmount), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - - ItemList.Crate_Empty.set( - addItem( - Crate_Empty.ID, - "Empty Crate", - "To Package lots of Material", - new ItemData(Materials.Wood, 3628800L, Materials.Iron, OrePrefixes.screw.mMaterialAmount), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L))); - - ItemList.ThermosCan_Empty.set( - addItem( - Thermos_Can_Empty.ID, - "Empty Thermos Can", - "Keeping hot things hot and cold things cold", - new ItemData( - Materials.Aluminium, - OrePrefixes.plateDouble.mMaterialAmount * 1L + 2L * OrePrefixes.ring.mMaterialAmount), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L))); - - ItemList.Large_Fluid_Cell_Steel.set( - addItem( - Large_Fluid_Cell_Steel.ID, - "Large Steel Fluid Cell", - "", - new ItemData( - Materials.Steel, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.Bronze, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - - ItemList.Large_Fluid_Cell_TungstenSteel.set( - addItem( - Large_Fluid_Cell_TungstenSteel.ID, - "Large Tungstensteel Fluid Cell", - "", - new ItemData( - Materials.TungstenSteel, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.Platinum, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 9L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 7L))); - - ItemList.Large_Fluid_Cell_Aluminium.set( - addItem( - Large_Fluid_Cell_Aluminium.ID, - "Large Aluminium Fluid Cell", - "", - new ItemData( - Materials.Aluminium, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.Silver, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 3L))); - - ItemList.Large_Fluid_Cell_StainlessSteel.set( - addItem( - Large_Fluid_Cell_StainlessSteel.ID, - "Large Stainless Steel Fluid Cell", - "", - new ItemData( - Materials.StainlessSteel, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.Electrum, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 6L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))); - - ItemList.Large_Fluid_Cell_Titanium.set( - addItem( - Large_Fluid_Cell_Titanium.ID, - "Large Titanium Fluid Cell", - "", - new ItemData( - Materials.Titanium, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.RoseGold, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 7L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 5L))); - - ItemList.Large_Fluid_Cell_Chrome.set( - addItem( - Large_Fluid_Cell_Chrome.ID, - "Large Chrome Fluid Cell", - "", - new ItemData( - Materials.Chrome, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.Palladium, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 6L))); - - ItemList.Large_Fluid_Cell_Iridium.set( - addItem( - Large_Fluid_Cell_Iridium.ID, - "Large Iridium Fluid Cell", - "", - new ItemData( - Materials.Iridium, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.Naquadah, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L))); - - ItemList.Large_Fluid_Cell_Osmium.set( - addItem( - Large_Fluid_Cell_Osmium.ID, - "Large Osmium Fluid Cell", - "", - new ItemData( - Materials.Osmium, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.ElectrumFlux, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 11L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 9L))); - - ItemList.Large_Fluid_Cell_Neutronium.set( - addItem( - Large_Fluid_Cell_Neutronium.ID, - "Large Neutronium Fluid Cell", - "", - new ItemData( - Materials.Neutronium, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - new MaterialStack(Materials.Draconium, OrePrefixes.ring.mMaterialAmount * 4L)), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 12L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 10L))); - - for (byte i = 0; i < 16; i = (byte) (i + 1)) { - ItemList.SPRAY_CAN_DYES[i].set( - addItem( - Spray_Colors[i], - "Spray Can (" + Dyes.get(i).mName + ")", - "Full", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L))); - ItemList.SPRAY_CAN_DYES_USED[i].set( - addItem( - Spray_Colors_Used[i], - "Spray Can (" + Dyes.get(i).mName + ")", - "Used", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 3L), - SubTag.INVISIBLE)); - } - - ItemList.Spray_Color_Remover.set( - addItem( - Spray_Color_Remover.ID, - "Spray Can Solvent", - "Full", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 8L))); - ItemList.Spray_Color_Used_Remover.set( - addItem( - Spray_Color_Used_Remover.ID, - "Spray Can Solvent", - "Used", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 6L), - SubTag.INVISIBLE)); - - ItemList.Spray_Color_Remover_Empty.set( - addItem( - Spray_Color_Remover_Empty.ID, - "Empty Spray Can Solvent Cannister", - "Used for making Spray Can Solvent", - new ItemData( - Materials.Aluminium, - OrePrefixes.plateDouble.mMaterialAmount * 4L, - Materials.Redstone, - OrePrefixes.dust.mMaterialAmount), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - - ItemList.Tool_Matches.set( - addItem( - Tool_Matches.ID, - "Match", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L))); - - ItemList.Tool_MatchBox_Used.set( - addItem( - Tool_MatchBox_Used.ID, - "Match Box", - "This is not a Car", - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L), - SubTag.INVISIBLE)); - - ItemList.Tool_MatchBox_Full.set( - addItem( - Tool_MatchBox_Full.ID, - "Match Box (Full)", - "This is not a Car", - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - ItemList.Tool_Lighter_Invar_Empty.set( - addItem( - Tool_Lighter_Invar_Empty.ID, - "Lighter (Empty)", - "", - new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L))); - ItemList.Tool_Lighter_Invar_Used.set( - addItem( - Tool_Lighter_Invar_Used.ID, - "Lighter", - "", - new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L), - SubTag.INVISIBLE)); - ItemList.Tool_Lighter_Invar_Full.set( - addItem( - Tool_Lighter_Invar_Full.ID, - "Lighter (Full)", - "", - new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - ItemList.Tool_Lighter_Platinum_Empty.set( - addItem( - Tool_Lighter_Platinum_Empty.ID, - "Platinum Lighter (Empty)", - "A known Prank Master is engraved on it", - new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L))); - ItemList.Tool_Lighter_Platinum_Used.set( - addItem( - Tool_Lighter_Platinum_Used.ID, - "Platinum Lighter", - "A known Prank Master is engraved on it", - new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L), - SubTag.INVISIBLE)); - ItemList.Tool_Lighter_Platinum_Full.set( - addItem( - Tool_Lighter_Platinum_Full.ID, - "Platinum Lighter (Full)", - "A known Prank Master is engraved on it", - new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - ItemList.Ingot_Heavy1 - .set(addItem(Ingot_Heavy1.ID, "Heavy Duty Alloy Ingot T1", "Used to make Heavy Duty Plates T1")); - ItemList.Ingot_Heavy2 - .set(addItem(Ingot_Heavy2.ID, "Heavy Duty Alloy Ingot T2", "Used to make Heavy Duty Plates T2")); - ItemList.Ingot_Heavy3 - .set(addItem(Ingot_Heavy3.ID, "Heavy Duty Alloy Ingot T3", "Used to make Heavy Duty Plates T3")); - - ItemList.Ingot_IridiumAlloy.set( - addItem( - Ingot_Iridium_Alloy.ID, - "Iridium Alloy Ingot", - "Used to make Iridium Plates", - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L))); - - ItemList.Paper_Printed_Pages.set( - addItem( - Paper_Printed_Pages.ID, - "Printed Pages", - "Used to make written Books", - new ItemData(Materials.Paper, 10886400L), - new Behaviour_PrintedPages(), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L))); - ItemList.Paper_Magic_Empty.set( - addItem( - Paper_Magic_Empty.ID, - "Magic Paper", - "", - SubTag.INVISIBLE, - new ItemData(Materials.Paper, 3628800L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1L))); - ItemList.Paper_Magic_Page.set( - addItem( - Paper_Magic_Page.ID, - "Enchanted Page", - "", - SubTag.INVISIBLE, - new ItemData(Materials.Paper, 3628800L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2L))); - ItemList.Paper_Magic_Pages.set( - addItem( - Paper_Magic_Pages.ID, - "Enchanted Pages", - "", - SubTag.INVISIBLE, - new ItemData(Materials.Paper, 10886400L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 4L))); - ItemList.Paper_Punch_Card_Empty.set( - addItem( - Paper_Punch_Card_Empty.ID, - "Punch Card", - "", - SubTag.INVISIBLE, - new ItemData(Materials.Paper, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L))); - ItemList.Paper_Punch_Card_Encoded.set( - addItem( - Paper_Punch_Card_Encoded.ID, - "Punched Card", - "", - SubTag.INVISIBLE, - new ItemData(Materials.Paper, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L))); - ItemList.Book_Written_01.set( - addItem( - Book_Written_01.ID, - "Book", - "", - new ItemData(Materials.Paper, 10886400L), - "bookWritten", - OreDictNames.craftingBook, - new Behaviour_WrittenBook(), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L))); - ItemList.Book_Written_02.set( - addItem( - Book_Written_02.ID, - "Book", - "", - new ItemData(Materials.Paper, 10886400L), - "bookWritten", - OreDictNames.craftingBook, - new Behaviour_WrittenBook(), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L))); - ItemList.Book_Written_03.set( - addItem( - Book_Written_03.ID, - "Book", - "", - new ItemData(Materials.Paper, 10886400L), - "bookWritten", - OreDictNames.craftingBook, - new Behaviour_WrittenBook(), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L))); - - ItemList.Schematic.set( - addItem( - Schematic.ID, - "Schematic", - "EMPTY", - new ItemData(Materials.Steel, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 1L))); - ItemList.Schematic_Crafting.set( - addItem( - Schematic_Crafting.ID, - "Schematic (Crafting)", - "Crafts the Programmed Recipe", - new ItemData(Materials.Steel, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L))); - ItemList.Schematic_1by1.set( - addItem( - Schematic_1by1.ID, - "Schematic (1x1)", - "Crafts 1 Items as 1x1 (use in Packager)", - new ItemData(Materials.Steel, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L))); - ItemList.Schematic_2by2.set( - addItem( - Schematic_2by2.ID, - "Schematic (2x2)", - "Crafts 4 Items as 2x2 (use in Packager)", - new ItemData(Materials.Steel, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L))); - ItemList.Schematic_3by3.set( - addItem( - Schematic_3by3.ID, - "Schematic (3x3)", - "Crafts 9 Items as 3x3 (use in Packager)", - new ItemData(Materials.Steel, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L))); - ItemList.Schematic_Dust.set( - addItem( - Schematic_Dust.ID, - "Schematic (Dusts)", - "Combines Dusts (use in Packager)", - new ItemData(Materials.Steel, 7257600L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L))); - - ItemList.Battery_Hull_LV.set( - addItem( - Battery_Hull_LV.ID, - "Small Battery Hull", - "An empty LV Battery Hull", - new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L))); - ItemList.Battery_Hull_MV.set( - addItem( - Battery_Hull_MV.ID, - "Medium Battery Hull", - "An empty MV Battery Hull", - new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L))); - ItemList.Battery_Hull_HV.set( - addItem( - Battery_Hull_HV.ID, - "Large Battery Hull", - "An empty HV Battery Hull", - new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 9L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L))); - - // ULV Batteries - ItemList.Battery_RE_ULV_Tantalum.set( - addItem( - Battery_RE_ULV_Tantalum.ID, - "Tantalum Capacitor", - "Reusable", - "batteryULV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L))); - - // LV Batteries - ItemList.Battery_SU_LV_SulfuricAcid.set( - addItem( - Battery_SU_LV_Sulfuric_Acid.ID, - "Small Acid Battery", - "Single Use", - "batteryLV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - ItemList.Battery_SU_LV_Mercury.set( - addItem( - Battery_SU_LV_Mercury.ID, - "Small Mercury Battery", - "Single Use", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - ItemList.Battery_RE_LV_Cadmium.set( - addItem( - Battery_RE_LV_Cadmium.ID, - "Small Cadmium Battery", - "Reusable", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L), - "batteryLV")); - - ItemList.Battery_RE_LV_Lithium.set( - addItem( - Battery_RE_LV_Lithium.ID, - "Small Lithium Battery", - "Reusable", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L), - "batteryLV")); - - ItemList.Battery_RE_LV_Sodium.set( - addItem( - Battery_RE_LV_Sodium.ID, - "Small Sodium Battery", - "Reusable", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L), - "batteryLV")); - - // MV Batteries - ItemList.Battery_SU_MV_SulfuricAcid.set( - addItem( - Battery_SU_MV_Sulfuric_Acid.ID, - "Medium Acid Battery", - "Single Use", - "batteryMV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L))); - - ItemList.Battery_SU_MV_Mercury.set( - addItem( - Battery_SU_MV_Mercury.ID, - "Medium Mercury Battery", - "Single Use", - "batteryMV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L))); - - ItemList.Battery_RE_MV_Cadmium.set( - addItem( - Battery_RE_MV_Cadmium.ID, - "Medium Cadmium Battery", - "Reusable", - "batteryMV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - ItemList.Battery_RE_MV_Lithium.set( - addItem( - Battery_RE_MV_Lithium.ID, - "Medium Lithium Battery", - "Reusable", - "batteryMV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - ItemList.Battery_RE_MV_Sodium.set( - addItem( - Battery_RE_MV_Sodium.ID, - "Medium Sodium Battery", - "Reusable", - "batteryMV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - - // HV Batteries - ItemList.Battery_SU_HV_SulfuricAcid.set( - addItem( - Battery_SU_HV_Sulfuric_Acid.ID, - "Large Acid Battery", - "Single Use", - "batteryHV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 8L))); - - ItemList.Battery_SU_HV_Mercury.set( - addItem( - Battery_SU_HV_Mercury.ID, - "Large Mercury Battery", - "Single Use", - "batteryHV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 8L))); - - ItemList.Battery_RE_HV_Cadmium.set( - addItem( - Battery_RE_HV_Cadmium.ID, - "Large Cadmium Battery", - "Reusable", - "batteryHV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L))); - - ItemList.Battery_RE_HV_Lithium.set( - addItem( - Battery_RE_HV_Lithium.ID, - "Large Lithium Battery", - "Reusable", - "batteryHV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L))); - - ItemList.Battery_RE_HV_Sodium.set( - addItem( - Battery_RE_HV_Sodium.ID, - "Large Sodium Battery", - "Reusable", - "batteryHV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L))); - - // IV Battery - ItemList.Energy_LapotronicOrb.set( - addItem( - Energy_Lapotronic_Orb.ID, - "Lapotronic Energy Orb", - "Reusable battery", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L), - OrePrefixes.battery.get(Materials.IV))); - - // ZPM Module - ItemList.ZPM.set( - addItem( - ID_MetaItem_01.ZPM.ID, - "Zero Point Module", - "Single use battery", - "batteryZPM", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L))); - - // LuV Lapotron orb cluster battery - ItemList.Energy_LapotronicOrb2.set( - addItem( - Energy_Lapotronic_orb_2.ID, - "Lapotronic Energy Orb Cluster", - "Reusable battery", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L), - OrePrefixes.battery.get(Materials.LuV))); - - // UV Battery - ItemList.ZPM2.set( - addItem( - ZPM2.ID, - "Ultimate Battery", - "Fill this to win minecraft", - "batteryUV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L))); - - // UMV Battery - ItemList.ZPM3.set( - addItem( - ZPM3.ID, - "Really Ultimate Battery", - "Fill this to be way older", - "batteryUMV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L))); - - // UXV Battery - ItemList.ZPM4.set( - addItem( - ZPM4.ID, - "Extremely Ultimate Battery", - "Fill this to be older", - "batteryUXV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L))); - - // MAX Battery - ItemList.ZPM5.set( - addItem( - ZPM5.ID, - "Insanely Ultimate Battery", - "Fill this for fun", - "batteryMAX", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L))); - - // ERROR Battery - ItemList.ZPM6.set( - addItem( - ZPM6.ID, - "Mega Ultimate Battery", - "Fill the capacitor to reach enlightenment", - "batteryERV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L))); - - // ZPM Cluster - ItemList.Energy_Module.set( - addItem( - Energy_Module.ID, - "Energy Module", - "Reusable battery", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L), - OrePrefixes.battery.get(Materials.ZPM))); - - // UV Cluster - ItemList.Energy_Cluster.set( - addItem( - Energy_Cluster.ID, - "Energy Cluster", - "Reusable battery", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L), - OrePrefixes.battery.get(Materials.UV))); - - // UIV, UMV, UXV and MAX component textures backported from gregicality. - ItemList.Electric_Motor_LV.set( - addItem( - Electric_Motor_LV.ID, - "Electric Motor (LV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - ItemList.Electric_Motor_MV.set( - addItem( - Electric_Motor_MV.ID, - "Electric Motor (MV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L))); - ItemList.Electric_Motor_HV.set( - addItem( - Electric_Motor_HV.ID, - "Electric Motor (HV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 4L))); - ItemList.Electric_Motor_EV.set( - addItem( - Electric_Motor_EV.ID, - "Electric Motor (EV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 8L))); - ItemList.Electric_Motor_IV.set( - addItem( - Electric_Motor_IV.ID, - "Electric Motor (IV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 16L))); - ItemList.Electric_Motor_LuV.set( - addItem( - Electric_Motor_LuV.ID, - "Electric Motor (LuV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 32L))); - ItemList.Electric_Motor_ZPM.set( - addItem( - Electric_Motor_ZPM.ID, - "Electric Motor (ZPM)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 64L))); - ItemList.Electric_Motor_UV.set( - addItem( - Electric_Motor_UV.ID, - "Electric Motor (UV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 128L))); - ItemList.Electric_Motor_UHV.set( - addItem( - Electric_Motor_UHV.ID, - "Electric Motor (UHV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 256L))); - ItemList.Electric_Motor_UEV.set( - addItem( - Electric_Motor_UEV.ID, - "Electric Motor (UEV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Motor_UIV.set( - addItem( - Electric_Motor_UIV.ID, - "Electric Motor (UIV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Motor_UMV.set( - addItem( - Electric_Motor_UMV.ID, - "Electric Motor (UMV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Motor_UXV.set( - addItem( - Electric_Motor_UXV.ID, - "Electric Motor (UXV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Motor_MAX.set( - addItem( - Electric_Motor_MAX.ID, - "Electric Motor (MAX)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.IronMagnetic), 'R', - OrePrefixes.stick.get(Materials.AnyIron), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', - OrePrefixes.stick.get(Materials.Steel), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', - OrePrefixes.stick.get(Materials.Aluminium), 'W', OrePrefixes.wireGt02.get(Materials.Cupronickel), 'C', - OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', - OrePrefixes.stick.get(Materials.StainlessSteel), 'W', OrePrefixes.wireGt04.get(Materials.Electrum), 'C', - OrePrefixes.cableGt02.get(Materials.Silver) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', - OrePrefixes.stick.get(Materials.Titanium), 'W', OrePrefixes.wireGt04.get(Materials.BlackSteel), 'C', - OrePrefixes.cableGt02.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', - OrePrefixes.stick.get(Materials.TungstenSteel), 'W', OrePrefixes.wireGt04.get(Materials.Graphene), 'C', - OrePrefixes.cableGt02.get(Materials.Tungsten) }); - - ItemList.ElectronicsLump.set( - addItem( - 414, - "Lump of Electronics", - "How did they even produce this?", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - - ItemList.Tesseract.set( - addItem( - Tesseract.ID, - "Raw Tesseract", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - ItemList.GigaChad.set( - addItem( - GigaChad.ID, - "Giga Chad Token", - "You are worthy", - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1000L))); - ItemList.EnergisedTesseract.set( - addItem( - EnergisedTesseract.ID, - "Energised Tesseract", - "Higher dimensional engineering", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - - ItemList.Electric_Piston_LV.set( - addItem( - Electric_Piston_LV.ID, - "Electric Piston (LV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - ItemList.Electric_Piston_MV.set( - addItem( - Electric_Piston_MV.ID, - "Electric Piston (MV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L))); - ItemList.Electric_Piston_HV.set( - addItem( - Electric_Piston_HV.ID, - "Electric Piston (HV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 4L))); - ItemList.Electric_Piston_EV.set( - addItem( - Electric_Piston_EV.ID, - "Electric Piston (EV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 8L))); - ItemList.Electric_Piston_IV.set( - addItem( - Electric_Piston_IV.ID, - "Electric Piston (IV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 16L))); - ItemList.Electric_Piston_LuV.set( - addItem( - Electric_Piston_LuV.ID, - "Electric Piston (LuV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 32L))); - ItemList.Electric_Piston_ZPM.set( - addItem( - Electric_Piston_ZPM.ID, - "Electric Piston (ZPM)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 64L))); - ItemList.Electric_Piston_UV.set( - addItem( - Electric_Piston_UV.ID, - "Electric Piston (UV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 128L))); - ItemList.Electric_Piston_UHV.set( - addItem( - Electric_Piston_UHV.ID, - "Electric Piston (UHV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 256L))); - ItemList.Electric_Piston_UEV.set( - addItem( - Electric_Piston_UEV.ID, - "Electric Piston (UEV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Piston_UIV.set( - addItem( - Electric_Piston_UIV.ID, - "Electric Piston (UIV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Piston_UMV.set( - addItem( - Electric_Piston_UMV.ID, - "Electric Piston (UMV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Piston_UXV.set( - addItem( - Electric_Piston_UXV.ID, - "Electric Piston (UXV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - ItemList.Electric_Piston_MAX.set( - addItem( - Electric_Piston_MAX.ID, - "Electric Piston (MAX)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L))); - - ItemList.Electric_Pump_LV.set( - addItem( - Electric_Pump_LV.ID, - "Electric Pump (LV)", - GT_Utility.formatNumbers(32) + PartCoverText + GT_Utility.formatNumbers(32 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))); - ItemList.Electric_Pump_MV.set( - addItem( - Electric_Pump_MV.ID, - "Electric Pump (MV)", - GT_Utility.formatNumbers(128) + PartCoverText + GT_Utility.formatNumbers(128 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - ItemList.Electric_Pump_HV.set( - addItem( - Electric_Pump_HV.ID, - "Electric Pump (HV)", - GT_Utility.formatNumbers(512) + PartCoverText + GT_Utility.formatNumbers(512 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))); - ItemList.Electric_Pump_EV.set( - addItem( - Electric_Pump_EV.ID, - "Electric Pump (EV)", - GT_Utility.formatNumbers(2048) + PartCoverText + GT_Utility.formatNumbers(2048 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L))); - ItemList.Electric_Pump_IV.set( - addItem( - Electric_Pump_IV.ID, - "Electric Pump (IV)", - GT_Utility.formatNumbers(8192) + PartCoverText + GT_Utility.formatNumbers(8192 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 16L))); - ItemList.Electric_Pump_LuV.set( - addItem( - Electric_Pump_LuV.ID, - "Electric Pump (LuV)", - GT_Utility.formatNumbers(32768) + PartCoverText + GT_Utility.formatNumbers(32768 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 32L))); - ItemList.Electric_Pump_ZPM.set( - addItem( - Electric_Pump_ZPM.ID, - "Electric Pump (ZPM)", - GT_Utility.formatNumbers(131072) + PartCoverText - + GT_Utility.formatNumbers(131072 * 20) - + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 64L))); - ItemList.Electric_Pump_UV.set( - addItem( - Electric_Pump_UV.ID, - "Electric Pump (UV)", - GT_Utility.formatNumbers(524288) + PartCoverText - + GT_Utility.formatNumbers(524288 * 20) - + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 128L))); - ItemList.Electric_Pump_UHV.set( - addItem( - Electric_Pump_UHV.ID, - "Electric Pump (UHV)", - GT_Utility.formatNumbers(1048576) + PartCoverText - + GT_Utility.formatNumbers(1048576 * 20) - + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 256L))); - ItemList.Electric_Pump_UEV.set( - addItem( - Electric_Pump_UEV.ID, - "Electric Pump (UEV)", - GT_Utility.formatNumbers(2097152) + PartCoverText - + GT_Utility.formatNumbers(2097152 * 20) - + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L))); - ItemList.Electric_Pump_UIV.set( - addItem( - Electric_Pump_UIV.ID, - "Electric Pump (UIV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L))); - ItemList.Electric_Pump_UMV.set( - addItem( - Electric_Pump_UMV.ID, - "Electric Pump (UMV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L))); - ItemList.Electric_Pump_UXV.set( - addItem( - Electric_Pump_UXV.ID, - "Electric Pump (UXV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L))); - ItemList.Electric_Pump_MAX.set( - addItem( - Electric_Pump_MAX.ID, - "Electric Pump (MAX)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L))); - - ItemList.Steam_Valve_LV.set( - addItem( - Steam_Valve_LV.ID, - "Steam Valve (LV)", - GT_Utility.formatNumbers(1024) + PartCoverText + GT_Utility.formatNumbers(1024 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))); - ItemList.Steam_Valve_MV.set( - addItem( - Steam_Valve_MV.ID, - "Steam Valve (MV)", - GT_Utility.formatNumbers(2048) + PartCoverText + GT_Utility.formatNumbers(2048 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - ItemList.Steam_Valve_HV.set( - addItem( - Steam_Valve_HV.ID, - "Steam Valve (HV)", - GT_Utility.formatNumbers(4096) + PartCoverText + GT_Utility.formatNumbers(4096 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))); - ItemList.Steam_Valve_EV.set( - addItem( - Steam_Valve_EV.ID, - "Steam Valve (EV)", - GT_Utility.formatNumbers(8192) + PartCoverText + GT_Utility.formatNumbers(8192 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L))); - ItemList.Steam_Valve_IV.set( - addItem( - Steam_Valve_IV.ID, - "Steam Valve (IV)", - GT_Utility.formatNumbers(16384) + PartCoverText + GT_Utility.formatNumbers(16384 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 16L))); - - ItemList.FluidRegulator_LV.set( - addItem(FluidRegulator_LV.ID, "Fluid Regulator (LV)", FRText1 + GT_Utility.formatNumbers(640) + FRText2)); - ItemList.FluidRegulator_MV.set( - addItem(FluidRegulator_MV.ID, "Fluid Regulator (MV)", FRText1 + GT_Utility.formatNumbers(2560) + FRText2)); - ItemList.FluidRegulator_HV.set( - addItem(FluidRegulator_HV.ID, "Fluid Regulator (HV)", FRText1 + GT_Utility.formatNumbers(10240) + FRText2)); - ItemList.FluidRegulator_EV.set( - addItem(FluidRegulator_EV.ID, "Fluid Regulator (EV)", FRText1 + GT_Utility.formatNumbers(40960) + FRText2)); - ItemList.FluidRegulator_IV.set( - addItem( - FluidRegulator_IV.ID, - "Fluid Regulator (IV)", - FRText1 + GT_Utility.formatNumbers(163840) + FRText2)); - ItemList.FluidRegulator_LuV.set( - addItem( - FluidRegulator_LuV.ID, - "Fluid Regulator (LuV)", - FRText1 + GT_Utility.formatNumbers(655360) + FRText2)); - ItemList.FluidRegulator_ZPM.set( - addItem( - FluidRegulator_ZPM.ID, - "Fluid Regulator (ZPM)", - FRText1 + GT_Utility.formatNumbers(2621440) + FRText2)); - ItemList.FluidRegulator_UV.set( - addItem( - FluidRegulator_UV.ID, - "Fluid Regulator (UV)", - FRText1 + GT_Utility.formatNumbers(10485760) + FRText2)); - - ItemList.FluidFilter.set( - addItem(FluidFilter.ID, "Fluid Filter Cover", "Set with Fluid Container to only accept one Fluid Type")); - - ItemList.ItemFilter_Export.set( - addItem( - ItemFilter_Export.ID, - "Filtered Conveyor Cover (Export)", - "Right click with an item to set filter (Only supports Export Mode)")); - - ItemList.ItemFilter_Import.set( - addItem( - ItemFilter_Import.ID, - "Filtered Conveyor Cover (Import)", - "Right click with an item to set filter (Only supports Import Mode)")); - - ItemList.Cover_FluidLimiter - .set(addItem(Cover_FluidLimiter.ID, "Fluid Limiter Cover", "Limits fluid input depending on fill level")); - - ItemList.Conveyor_Module_LV.set( - addItem( - Conveyor_Module_LV.ID, - "Conveyor Module (LV)", - "1 stack every 20 secs (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L))); - ItemList.Conveyor_Module_MV.set( - addItem( - Conveyor_Module_MV.ID, - "Conveyor Module (MV)", - "1 stack every 5 secs (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L))); - ItemList.Conveyor_Module_HV.set( - addItem( - Conveyor_Module_HV.ID, - "Conveyor Module (HV)", - "1 stack every 1 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L))); - ItemList.Conveyor_Module_EV.set( - addItem( - Conveyor_Module_EV.ID, - "Conveyor Module (EV)", - "1 stack every 1/5 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L))); - ItemList.Conveyor_Module_IV.set( - addItem( - Conveyor_Module_IV.ID, - "Conveyor Module (IV)", - "1 stack every 1/20 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L))); - ItemList.Conveyor_Module_LuV.set( - addItem( - Conveyor_Module_LuV.ID, - "Conveyor Module (LuV)", - "2 stacks every 1/20 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 32L))); - ItemList.Conveyor_Module_ZPM.set( - addItem( - Conveyor_Module_ZPM.ID, - "Conveyor Module (ZPM)", - "4 stacks every 1/20 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 64L))); - ItemList.Conveyor_Module_UV.set( - addItem( - Conveyor_Module_UV.ID, - "Conveyor Module (UV)", - "8 stacks every 1/20 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 128L))); - ItemList.Conveyor_Module_UHV.set( - addItem( - Conveyor_Module_UHV.ID, - "Conveyor Module (UHV)", - "16 stacks every 1/20 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 256L))); - ItemList.Conveyor_Module_UEV.set( - addItem( - Conveyor_Module_UEV.ID, - "Conveyor Module (UEV)", - "32 stacks every 1/20 sec (as Cover)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L))); - ItemList.Conveyor_Module_UIV.set( - addItem( - Conveyor_Module_UIV.ID, - "Conveyor Module (UIV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L))); - ItemList.Conveyor_Module_UMV.set( - addItem( - Conveyor_Module_UMV.ID, - "Conveyor Module (UMV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L))); - ItemList.Conveyor_Module_UXV.set( - addItem( - Conveyor_Module_UXV.ID, - "Conveyor Module (UXV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L))); - ItemList.Conveyor_Module_MAX.set( - addItem( - Conveyor_Module_MAX.ID, - "Conveyor Module (MAX)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L))); - - ItemList.Robot_Arm_LV.set( - addItem( - Robot_Arm_LV.ID, - "Robot Arm (LV)", - "1 stack every 20 secs (as Cover)/n " + RAText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L))); - ItemList.Robot_Arm_MV.set( - addItem( - Robot_Arm_MV.ID, - "Robot Arm (MV)", - "1 stack every 5 secs (as Cover)/n " + RAText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L))); - ItemList.Robot_Arm_HV.set( - addItem( - Robot_Arm_HV.ID, - "Robot Arm (HV)", - "1 stack every 1 sec (as Cover)/n " + RAText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 4L))); - ItemList.Robot_Arm_EV.set( - addItem( - Robot_Arm_EV.ID, - "Robot Arm (EV)", - "1 stack every 1/5 sec (as Cover)/n " + RAText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 8L))); - ItemList.Robot_Arm_IV.set( - addItem( - Robot_Arm_IV.ID, - "Robot Arm (IV)", - "1 stack every 1/20 sec (as Cover)/n " + RAText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 16L))); - ItemList.Robot_Arm_LuV.set( - addItem( - Robot_Arm_LuV.ID, - "Robot Arm (LuV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 32L))); - ItemList.Robot_Arm_ZPM.set( - addItem( - Robot_Arm_ZPM.ID, - "Robot Arm (ZPM)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 64L))); - ItemList.Robot_Arm_UV.set( - addItem( - Robot_Arm_UV.ID, - "Robot Arm (UV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 128L))); - ItemList.Robot_Arm_UHV.set( - addItem( - Robot_Arm_UHV.ID, - "Robot Arm (UHV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 256L))); - ItemList.Robot_Arm_UEV.set( - addItem( - Robot_Arm_UEV.ID, - "Robot Arm (UEV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L))); - ItemList.Robot_Arm_UIV.set( - addItem( - Robot_Arm_UIV.ID, - "Robot Arm (UIV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L))); - ItemList.Robot_Arm_UMV.set( - addItem( - Robot_Arm_UMV.ID, - "Robot Arm (UMV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L))); - ItemList.Robot_Arm_UXV.set( - addItem( - Robot_Arm_UXV.ID, - "Robot Arm (UXV)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L))); - ItemList.Robot_Arm_MAX.set( - addItem( - Robot_Arm_MAX.ID, - "Robot Arm (MAX)", - PartNotCoverText, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L))); - - ItemList.QuantumEye.set(addItem(QuantumEye.ID, "Quantum Eye", "Improved Ender Eye")); - ItemList.QuantumStar.set(addItem(QuantumStar.ID, "Quantum Star", "Improved Nether Star")); - ItemList.Gravistar.set(addItem(Gravistar.ID, "Gravi Star", "Ultimate Nether Star")); - - ItemList.Emitter_LV.set( - addItem( - Emitter_LV.ID, - "Emitter (LV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 1L))); - ItemList.Emitter_MV.set( - addItem( - Emitter_MV.ID, - "Emitter (MV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 2L))); - ItemList.Emitter_HV.set( - addItem( - Emitter_HV.ID, - "Emitter (HV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 4L))); - ItemList.Emitter_EV.set( - addItem( - Emitter_EV.ID, - "Emitter (EV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 8L))); - ItemList.Emitter_IV.set( - addItem( - Emitter_IV.ID, - "Emitter (IV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 16L))); - ItemList.Emitter_LuV.set( - addItem( - Emitter_LuV.ID, - "Emitter (LuV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 32L))); - ItemList.Emitter_ZPM.set( - addItem( - Emitter_ZPM.ID, - "Emitter (ZPM)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 64L))); - ItemList.Emitter_UV.set( - addItem( - Emitter_UV.ID, - "Emitter (UV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 128L))); - ItemList.Emitter_UHV.set( - addItem( - Emitter_UHV.ID, - "Emitter (UHV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 256L))); - ItemList.Emitter_UEV.set( - addItem( - Emitter_UEV.ID, - "Emitter (UEV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L))); - ItemList.Emitter_UIV.set( - addItem( - Emitter_UIV.ID, - "Emitter (UIV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L))); - ItemList.Emitter_UMV.set( - addItem( - Emitter_UMV.ID, - "Emitter (UMV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L))); - ItemList.Emitter_UXV.set( - addItem( - Emitter_UXV.ID, - "Emitter (UXV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L))); - ItemList.Emitter_MAX.set( - addItem( - Emitter_MAX.ID, - "Emitter (MAX)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L))); - - ItemList.Sensor_LV.set( - addItem( - Sensor_LV.ID, - "Sensor (LV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L))); - - ItemList.Sensor_MV.set( - addItem( - Sensor_MV.ID, - "Sensor (MV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L))); - ItemList.Sensor_HV.set( - addItem( - Sensor_HV.ID, - "Sensor (HV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L))); - ItemList.Sensor_EV.set( - addItem( - Sensor_EV.ID, - "Sensor (EV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 8L))); - ItemList.Sensor_IV.set( - addItem( - Sensor_IV.ID, - "Sensor (IV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 16L))); - ItemList.Sensor_LuV.set( - addItem( - Sensor_LuV.ID, - "Sensor (LuV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 32L))); - ItemList.Sensor_ZPM.set( - addItem( - Sensor_ZPM.ID, - "Sensor (ZPM)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 64L))); - ItemList.Sensor_UV.set( - addItem( - Sensor_UV.ID, - "Sensor (UV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 128L))); - ItemList.Sensor_UHV.set( - addItem( - Sensor_UHV.ID, - "Sensor (UHV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 256L))); - ItemList.Sensor_UEV.set( - addItem( - Sensor_UEV.ID, - "Sensor (UEV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L))); - ItemList.Sensor_UIV.set( - addItem( - Sensor_UIV.ID, - "Sensor (UIV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L))); - ItemList.Sensor_UMV.set( - addItem( - Sensor_UMV.ID, - "Sensor (UMV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L))); - ItemList.Sensor_UXV.set( - addItem( - Sensor_UXV.ID, - "Sensor (UXV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L))); - ItemList.Sensor_MAX.set( - addItem( - Sensor_MAX.ID, - "Sensor (MAX)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L))); - - ItemList.Field_Generator_LV.set( - addItem( - Field_Generator_LV.ID, - "Field Generator (LV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L))); - ItemList.Field_Generator_MV.set( - addItem( - Field_Generator_MV.ID, - "Field Generator (MV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 2L))); - ItemList.Field_Generator_HV.set( - addItem( - Field_Generator_HV.ID, - "Field Generator (HV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 4L))); - ItemList.Field_Generator_EV.set( - addItem( - Field_Generator_EV.ID, - "Field Generator (EV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 8L))); - ItemList.Field_Generator_IV.set( - addItem( - Field_Generator_IV.ID, - "Field Generator (IV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 16L))); - ItemList.Field_Generator_LuV.set( - addItem( - Field_Generator_LuV.ID, - "Field Generator (LuV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 32L))); - ItemList.Field_Generator_ZPM.set( - addItem( - Field_Generator_ZPM.ID, - "Field Generator (ZPM)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 64L))); - ItemList.Field_Generator_UV.set( - addItem( - Field_Generator_UV.ID, - "Field Generator (UV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 128L))); - ItemList.Field_Generator_UHV.set( - addItem( - Field_Generator_UHV.ID, - "Field Generator (UHV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 256L))); - ItemList.Field_Generator_UEV.set( - addItem( - Field_Generator_UEV.ID, - "Field Generator (UEV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L))); - ItemList.Field_Generator_UIV.set( - addItem( - Field_Generator_UIV.ID, - "Field Generator (UIV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L))); - ItemList.Field_Generator_UMV.set( - addItem( - Field_Generator_UMV.ID, - "Field Generator (UMV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L))); - ItemList.Field_Generator_UXV.set( - addItem( - Field_Generator_UXV.ID, - "Field Generator (UXV)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L))); - ItemList.Field_Generator_MAX.set( - addItem( - Field_Generator_MAX.ID, - "Field Generator (MAX)", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L))); - - ItemList.StableAdhesive.set( - addItem( - StableAdhesive.ID, - "Hyper-Stable Self-Healing Adhesive", - "Complete and selective adhesion, even when torn or damaged", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 30L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 5L))); - ItemList.SuperconductorComposite.set( - addItem( - SuperconductorComposite.ID, - "Superconductor Rare-Earth Composite", - "Zero resistance to electrical and quantum flow, regardless of temperature", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 50L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 25L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 15L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 10L))); - ItemList.NaquadriaSupersolid.set( - addItem( - NaquadriaSupersolid.ID, - "Black Body Naquadria Supersolid", - "Flows like a fluid and reflects nothing, perfect absorption and transfer", - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 100L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 60L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 40L), - new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 10L))); - - // Circuits ULV - LuV. - ItemList.Circuit_Primitive.set( - addItem( - Circuit_Primitive.ID, - "Vacuum Tube", - "A very simple Circuit", - OrePrefixes.circuit.get(Materials.ULV), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Basic.set( - addItem( - Circuit_Basic.ID, - "Integrated Logic Circuit", - "A Basic Circuit", - OrePrefixes.circuit.get(Materials.LV), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Good.set( - addItem( - Circuit_Good.ID, - "Good Electronic Circuit", - "A Good Circuit", - OrePrefixes.circuit.get(Materials.MV), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Advanced.set( - addItem( - Circuit_Advanced.ID, - "Processor Assembly", - "An Advanced Circuit", - OrePrefixes.circuit.get(Materials.HV), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Data.set( - addItem( - Circuit_Data.ID, - "Workstation", - "An Extreme Circuit", - OrePrefixes.circuit.get(Materials.EV), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Elite.set( - addItem( - Circuit_Elite.ID, - "Mainframe", - "An Elite Circuit", - OrePrefixes.circuit.get(Materials.IV), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Master.set( - addItem( - Circuit_Master.ID, - "Nanoprocessor Mainframe", - "A Master Circuit", - OrePrefixes.circuit.get(Materials.LuV), - SubTag.NO_UNIFICATION)); - - // Backwards compatibility. - ItemList.Circuit_Parts_Vacuum_Tube.set(ItemList.Circuit_Primitive.get(1)); - ItemList.Circuit_Computer.set(ItemList.Circuit_Advanced.get(1)); - - ItemList.Tool_DataOrb.set( - addItem( - Tool_DataOrb.ID, - "Data Orb", - "A High Capacity Data Storage", - SubTag.NO_UNIFICATION, - new Behaviour_DataOrb())); - - ItemList.Tool_DataStick.set( - addItem( - Tool_DataStick.ID, - "Data Stick", - "A Low Capacity Data Storage", - SubTag.NO_UNIFICATION, - new Behaviour_DataStick())); - - ItemList.Tool_Cover_Copy_Paste.set( - addItem( - Tool_Cover_Copy_Paste.ID, - "Cover Copy/Paste tool", - "Set Cover Massively.", - Behaviour_Cover_Tool.INSTANCE, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 6L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 6L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 6L))); - - ItemList.Circuit_Board_Basic.set(addItem(Circuit_Board_Basic.ID, "Coated Circuit Board", "A Basic Board")); - ItemList.Circuit_Board_Coated.set(ItemList.Circuit_Board_Basic.get(1)); - ItemList.Circuit_Board_Advanced - .set(addItem(Circuit_Board_Advanced.ID, "Epoxy Circuit Board", "An Advanced Board")); - ItemList.Circuit_Board_Epoxy.set(ItemList.Circuit_Board_Advanced.get(1)); - ItemList.Circuit_Board_Elite - .set(addItem(Circuit_Board_Elite.ID, "Multilayer Fiber-Reinforced Circuit Board", "An Elite Board")); - ItemList.Circuit_Board_Multifiberglass.set(ItemList.Circuit_Board_Elite.get(1)); - ItemList.Circuit_Parts_Crystal_Chip_Elite - .set(addItem(Circuit_Parts_Crystal_Chip_Elite.ID, "Engraved Crystal Chip", "Needed for Circuits")); - ItemList.Circuit_Parts_Crystal_Chip_Master - .set(addItem(Circuit_Parts_Crystal_Chip_Master.ID, "Engraved Lapotron Chip", "Needed for Circuits")); - ItemList.Circuit_Parts_Crystal_Chip_Wetware - .set(addItem(Circuit_Parts_Crystal_Chip_Wetware.ID, "Living Crystal Chip", "Needed for Circuits")); - ItemList.Circuit_Parts_Advanced.set(addItem(Circuit_Parts_Advanced.ID, "Diode", "Basic Electronic Component")); - ItemList.Circuit_Parts_Diode.set(ItemList.Circuit_Parts_Advanced.get(1)); - ItemList.Circuit_Parts_Wiring_Basic - .set(addItem(Circuit_Parts_Wiring_Basic.ID, "Resistor", "Basic Electronic Component")); - ItemList.Circuit_Parts_Resistor.set(ItemList.Circuit_Parts_Wiring_Basic.get(1)); - ItemList.Circuit_Parts_Wiring_Advanced - .set(addItem(Circuit_Parts_Wiring_Advanced.ID, "Transistor", "Basic Electronic Component")); - ItemList.Circuit_Parts_Transistor.set(ItemList.Circuit_Parts_Wiring_Advanced.get(1)); - ItemList.Circuit_Parts_Wiring_Elite - .set(addItem(Circuit_Parts_Wiring_Elite.ID, "Capacitor", "Electronic Component")); - ItemList.Circuit_Parts_Capacitor.set(ItemList.Circuit_Parts_Wiring_Elite.get(1)); - ItemList.Empty_Board_Basic.set(addItem(Empty_Board_Basic.ID, "Phenolic Circuit Board", "A Good Board")); - ItemList.Circuit_Board_Phenolic.set(ItemList.Empty_Board_Basic.get(1)); - ItemList.Empty_Board_Elite - .set(addItem(Empty_Board_Elite.ID, "Fiber-Reinforced Circuit Board", "An Extreme Board")); - ItemList.Circuit_Board_Fiberglass.set(ItemList.Empty_Board_Elite.get(1)); - - ItemList.Component_Sawblade_Diamond.set( - addItem( - Component_Sawblade_Diamond.ID, - "Diamond Sawblade", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L), - OreDictNames.craftingDiamondBlade)); - ItemList.Component_Grinder_Diamond.set( - addItem( - Component_Grinder_Diamond.ID, - "Diamond Grinding Head", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 6L), - OreDictNames.craftingGrinder)); - ItemList.Component_Grinder_Tungsten.set( - addItem( - Component_Grinder_Tungsten.ID, - "Tungsten Grinding Head", - "", - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 6L), - OreDictNames.craftingGrinder)); - - ItemList.Upgrade_Muffler.set( - addItem( - Upgrade_Muffler.ID, - "Muffler Upgrade", - "Makes Machines silent", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L))); - ItemList.Upgrade_Lock.set( - addItem( - Upgrade_Lock.ID, - "Lock Upgrade", - "Protects your Machines", - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 4L))); - - ItemList.Component_Filter.set( - addItem( - Component_Filter.ID, - "Item Filter", - "", - new ItemData(Materials.Zinc, OrePrefixes.foil.mMaterialAmount * 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L), - OreDictNames.craftingFilter)); - - ItemList.Cover_Controller.set( - addItem( - Cover_Controller.ID, - "Machine Controller Cover", - "Turns Machines ON/OFF", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - ItemList.Cover_ActivityDetector.set( - addItem( - Cover_ActivityDetector.ID, - "Activity Detector Cover", - "Gives out Activity as Redstone", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - ItemList.Cover_FluidDetector.set( - addItem( - Cover_FluidDetector.ID, - "Fluid Detector Cover", - "Gives out Fluid Amount as Redstone", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))); - ItemList.Cover_ItemDetector.set( - addItem( - Cover_ItemDetector.ID, - "Item Detector Cover", - "Gives out Item Amount as Redstone", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L))); - ItemList.Cover_EnergyDetector.set( - addItem( - Cover_EnergyDetector.ID, - "Energy Detector Cover", - "Gives out Energy Amount as Redstone", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L))); - ItemList.Cover_PlayerDetector.set( - addItem( - Cover_PlayerDetector.ID, - "Player Detector Cover", - "Gives out close Players as Redstone", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - ItemList.Cover_FluidStorageMonitor.set( - addItem( - Cover_FLuidStorageMonitor.ID, - "Fluid Storage Monitor Cover", - "Displays the fluid stored in the Tank", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))); - ItemList.Cover_Chest_Basic.set( - addItem( - Cover_Chest_Basic.ID, - "Basic Item Holder", - "Hold a few item for use within machine GUI", - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L))); - ItemList.Cover_Chest_Good.set( - addItem( - Cover_Chest_Good.ID, - "Good Item Holder", - "Hold a few item for use within machine GUI", - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L))); - ItemList.Cover_Chest_Advanced.set( - addItem( - Cover_Chest_Advanced.ID, - "Advanced Item Holder", - "Hold a few item for use within machine GUI", - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L))); - - ItemList.Cover_Screen.set( - addItem( - Cover_Screen.ID, - "Computer Monitor Cover", - "Displays Data and GUI", - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L))); - ItemList.Cover_Crafting.set( - addItem( - Cover_Crafting.ID, - "Crafting Table Cover", - "Better than a wooden Workbench", - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 4L))); - ItemList.Cover_Drain.set( - addItem( - Cover_Drain.ID, - "Drain Module Cover", - "Absorbs Fluids and collects Rain", - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - - ItemList.Cover_Shutter.set( - addItem( - Cover_Shutter.ID, - "Shutter Module Cover", - "Blocks Inventory/Tank Side. Use together with Machine Controller.", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L))); - - ItemList.Cover_SolarPanel.set( - addItem( - Cover_SolarPanel.ID, - "Solar Panel", - "May the Sun be with you (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 1L))); - ItemList.Cover_SolarPanel_8V.set( - addItem( - Cover_SolarPanel_8V.ID, - "Solar Panel (8V)", - "8 Volt Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 2L))); - ItemList.Cover_SolarPanel_LV.set( - addItem( - Cover_SolarPanel_LV.ID, - "Solar Panel (LV)", - "Low Voltage Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 4L))); - ItemList.Cover_SolarPanel_MV.set( - addItem( - Cover_SolarPanel_MV.ID, - "Solar Panel (MV)", - "Medium Voltage Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 8L))); - ItemList.Cover_SolarPanel_HV.set( - addItem( - Cover_SolarPanel_HV.ID, - "Solar Panel (HV)", - "High Voltage Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 16L))); - ItemList.Cover_SolarPanel_EV.set( - addItem( - Cover_SolarPanel_EV.ID, - "Solar Panel (EV)", - "Extreme Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 32L))); - ItemList.Cover_SolarPanel_IV.set( - addItem( - Cover_SolarPanel_IV.ID, - "Solar Panel (IV)", - "Insane Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L))); - ItemList.Cover_SolarPanel_LuV.set( - addItem( - Cover_SolarPanel_LuV.ID, - "Solar Panel (LuV)", - "Ludicrous Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L))); - ItemList.Cover_SolarPanel_ZPM.set( - addItem( - Cover_SolarPanel_ZPM.ID, - "Solar Panel (ZPM)", - "ZPM Voltage Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L))); - ItemList.Cover_SolarPanel_UV.set( - addItem( - Cover_SolarPanel_UV.ID, - "Solar Panel (UV)", - "Ultimate Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L))); - - ItemList.Tool_Sonictron.set( - addItem( - Tool_Sonictron.ID, - "Sonictron", - "Bring your Music with you", - Behaviour_Sonictron.INSTANCE, - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L))); - ItemList.Tool_Cheat.set( - addItem( - Tool_Cheat.ID, - "Debug Scanner", - "Also an Infinite Energy Source", - Behaviour_Scanner.INSTANCE, - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 64L))); - ItemList.Tool_Scanner.set( - addItem( - Tool_Scanner.ID, - "Portable Scanner", - "Tricorder", - Behaviour_Scanner.INSTANCE, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 6L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 6L))); - - ItemList.NC_SensorKit.set(addItem(NC_SensorKit.ID, "GregTech Sensor Kit", "", new Behaviour_SensorKit())); - ItemList.Duct_Tape.set( - addItem( - Duct_Tape.ID, - "BrainTech Aerospace Advanced Reinforced Duct Tape FAL-84", - "If you can't fix it with this, use more of it!", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - OreDictNames.craftingDuctTape)); - ItemList.McGuffium_239.set( - addItem( - McGuffium_239.ID, - "Mc Guffium 239", - "42% better than Phlebotnium", - new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SPIRITUS, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITIUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 8L))); - - ItemList.Cover_RedstoneTransmitterExternal.set( - addItem( - Cover_RedstoneTransmitterExternal.ID, - "Redstone Transmitter (External)", - "Transfers Redstone signals wireless", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - ItemList.Cover_RedstoneTransmitterInternal.set( - addItem( - Cover_RedstoneTransmitterInternal.ID, - "Redstone Transmitter (Internal)", - "Transfers Redstone signals wireless", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - ItemList.Cover_RedstoneReceiverExternal.set( - addItem( - Cover_RedstoneReceiverExternal.ID, - "Redstone Receiver (External)", - "Transfers Redstone signals wireless", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - ItemList.Cover_RedstoneReceiverInternal.set( - addItem( - Cover_RedstoneReceiverInternal.ID, - "Redstone Receiver (Internal)", - "Transfers Redstone signals wireless", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - - ItemList.Cover_NeedsMaintainance.set( - addItem( - Cover_NeedsMaintenance.ID, - "Needs Maintenance Cover", - "Attach to Multiblock Controller. Emits Redstone Signal if needs Maintenance", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L))); - - ItemList.Steam_Regulator_LV.set( - addItem( - Steam_Regulator_LV.ID, - "Steam Regulator (LV)", - GT_Utility.formatNumbers(1024) + PartCoverText + GT_Utility.formatNumbers(1024 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))); - ItemList.Steam_Regulator_MV.set( - addItem( - Steam_Regulator_MV.ID, - "Steam Regulator (MV)", - GT_Utility.formatNumbers(2048) + PartCoverText + GT_Utility.formatNumbers(2048 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - ItemList.Steam_Regulator_HV.set( - addItem( - Steam_Regulator_HV.ID, - "Steam Regulator (HV)", - GT_Utility.formatNumbers(4096) + PartCoverText + GT_Utility.formatNumbers(4096 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))); - ItemList.Steam_Regulator_EV.set( - addItem( - Steam_Regulator_EV.ID, - "Steam Regulator (EV)", - GT_Utility.formatNumbers(8192) + PartCoverText + GT_Utility.formatNumbers(8192 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L))); - ItemList.Steam_Regulator_IV.set( - addItem( - Steam_Regulator_IV.ID, - "Steam Regulator (IV)", - GT_Utility.formatNumbers(16384) + PartCoverText + GT_Utility.formatNumbers(16384 * 20) + PartCoverText2, - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 16L))); - ItemList.Electromagnet_Iron.set( - addItem( - Electromagnet_Iron.ID, - "Iron Electromagnet", - MagnetTiers.buildMagnetTooltip(MagnetTiers.Iron), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 8))); - ItemList.Electromagnet_Steel.set( - addItem( - Electromagnet_Steel.ID, - "Steel Electromagnet", - MagnetTiers.buildMagnetTooltip(MagnetTiers.Steel), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 16))); - ItemList.Electromagnet_Neodymium.set( - addItem( - Electromagnet_Neodymium.ID, - "Neodymium Electromagnet", - MagnetTiers.buildMagnetTooltip(MagnetTiers.Neodymium), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 24))); - ItemList.Electromagnet_Samarium.set( - addItem( - Electromagnet_Samarium.ID, - EnumChatFormatting.YELLOW + "Samarium Electromagnet", - MagnetTiers.buildMagnetTooltip(MagnetTiers.Samarium), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 32))); - ItemList.Electromagnet_Tengam.set( - addItem( - Electromagnet_Tengam.ID, - EnumChatFormatting.GREEN + "Tengam Electromagnet", - MagnetTiers.buildMagnetTooltip(MagnetTiers.Tengam), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 40))); - ItemList.Black_Hole_Opener.set( - addItem( - Black_Hole_Opener.ID, - "Black Hole Activation Catalyst", - "Opens a semi-stable black hole", - new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 32), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 64))); - ItemList.Black_Hole_Closer.set( - addItem( - Black_Hole_Closer.ID, - "Black Hole Deactivation Catalyst", - "Safely closes a semi-stable black hole", - new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 32), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 64))); - - // Empty battery hulls - ItemList.BatteryHull_EV.set( - addItem( - BatteryHull_EV.ID, - "Small Sunnarium Battery (Empty)", - "An empty EV Battery Container", - new ItemData(Materials.BlueSteel, OrePrefixes.plate.mMaterialAmount * 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 8L))); - ItemList.BatteryHull_IV.set( - addItem( - BatteryHull_IV.ID, - "Medium Sunnarium Battery (Empty)", - "An empty IV Battery Container", - new ItemData(Materials.RoseGold, OrePrefixes.plate.mMaterialAmount * 6L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 16L))); - ItemList.BatteryHull_LuV.set( - addItem( - BatteryHull_LuV.ID, - "Large Sunnarium Battery (Empty)", - "An empty LuV Battery Container", - new ItemData(Materials.RedSteel, OrePrefixes.plate.mMaterialAmount * 18L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 32L))); - ItemList.BatteryHull_ZPM.set( - addItem( - BatteryHull_ZPM.ID, - "Medium Naquadria Battery (Empty)", - "An empty ZPM Energy Storage", - new ItemData(Materials.Europium, OrePrefixes.plate.mMaterialAmount * 6L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 64L))); - ItemList.BatteryHull_UV.set( - addItem( - BatteryHull_UV.ID, - "Large Naquadria Battery (Empty)", - "An empty UV Energy Storage", - new ItemData(Materials.Americium, OrePrefixes.plate.mMaterialAmount * 18L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 128L))); - ItemList.BatteryHull_UHV.set( - addItem( - BatteryHull_UHV.ID, - "Small Neutronium Battery (Empty)", - "An empty UHV Energy Storage", - new ItemData(Materials.Naquadah, OrePrefixes.plate.mMaterialAmount * 24L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 256L))); - ItemList.BatteryHull_UEV.set( - addItem( - BatteryHull_UEV.ID, - "Medium Neutronium Battery (Empty)", - "An empty UEV Energy Storage", - new ItemData(Materials.NaquadahEnriched, OrePrefixes.plate.mMaterialAmount * 36L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 512L))); - ItemList.BatteryHull_UIV.set( - addItem( - BatteryHull_UIV.ID, - "Large Neutronium Battery (Empty)", - "An empty UIV Energy Storage", - new ItemData(Materials.NaquadahAlloy, OrePrefixes.plate.mMaterialAmount * 48L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1024L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1024L))); - ItemList.BatteryHull_UMV.set( - addItem( - BatteryHull_UMV.ID, - "Medium Plasma Battery (Empty)", - "An empty UMV Energy Storage", - new ItemData(Materials.Neutronium, OrePrefixes.plate.mMaterialAmount * 56L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2048L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2048L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2048L))); - ItemList.BatteryHull_UxV.set( - addItem( - BatteryHull_UxV.ID, - "Large Plasma Battery (Empty)", - "An empty UXV Energy Storage", - new ItemData(Materials.DraconiumAwakened, OrePrefixes.plate.mMaterialAmount * 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4096L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4096L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 4096L))); - - ItemList.BatteryHull_EV_Full.set( - addItem( - BatteryHull_EV_Full.ID, - "Small Sunnarium Battery", - "Reusable", - "batteryEV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_IV_Full.set( - addItem( - BatteryHull_IV_Full.ID, - "Medium Sunnarium Battery", - "Reusable", - "batteryIV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_LuV_Full.set( - addItem( - BatteryHull_LuV_Full.ID, - "Large Sunnarium Battery", - "Reusable", - "batteryLuV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_ZPM_Full.set( - addItem( - BatteryHull_ZPM_Full.ID, - "Medium Naquadria Battery", - "Reusable", - "batteryZPM", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_UV_Full.set( - addItem( - BatteryHull_UV_Full.ID, - "Large Naquadria Battery", - "Reusable", - "batteryUV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_UHV_Full.set( - addItem( - BatteryHull_UHV_Full.ID, - "Small Neutronium Battery", - "Reusable", - "batteryUHV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_UEV_Full.set( - addItem( - BatteryHull_UEV_Full.ID, - "Medium Neutronium Battery", - "Reusable", - "batteryUEV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_UIV_Full.set( - addItem( - BatteryHull_UIV_Full.ID, - "Large Neutronium Battery", - "Reusable", - "batteryUIV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_UMV_Full.set( - addItem( - BatteryHull_UMV_Full.ID, - "Medium Infinity Battery", - "Reusable", - "batteryUMV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - ItemList.BatteryHull_UxV_Full.set( - addItem( - BatteryHull_UxV_Full.ID, - "Large Infinity Battery", - "Reusable", - "batteryUXV", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L))); - - removeRecipes(); - setBurnValues(); - oredictBlacklistEntries(); - registerCovers(); - registerBehaviors(); - setAllFluidContainerStats(); - setAllElectricStats(); - registerTieredTooltips(); - - craftingShapedRecipes(); - craftingShapelessRecipes(); - } - - private static final Map cauldronRemap = new HashMap<>(); - - public static void registerCauldronCleaningFor(Materials in, Materials out) { - cauldronRemap.put(in, out); - } - - @Override - public boolean onEntityItemUpdate(EntityItem aItemEntity) { - int aDamage = aItemEntity.getEntityItem() - .getItemDamage(); - if ((aDamage < 32000) && (aDamage >= 0) && (!aItemEntity.worldObj.isRemote)) { - Materials aMaterial = GregTech_API.sGeneratedMaterials[(aDamage % 1000)]; - if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) { - int tX = MathHelper.floor_double(aItemEntity.posX); - int tY = MathHelper.floor_double(aItemEntity.posY); - int tZ = MathHelper.floor_double(aItemEntity.posZ); - OrePrefixes aPrefix = this.mGeneratedPrefixList[(aDamage / 1000)]; - if ((aPrefix == OrePrefixes.dustImpure) || (aPrefix == OrePrefixes.dustPure)) { - Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ); - byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ); - if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) { - - aMaterial = cauldronRemap.getOrDefault(aMaterial, aMaterial); - - aItemEntity.setEntityItemStack( - GT_OreDictUnificator - .get(OrePrefixes.dust, aMaterial, aItemEntity.getEntityItem().stackSize)); - aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3); - return true; - } - } else if (aPrefix == OrePrefixes.crushed) { - Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ); - byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ); - if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) { - aItemEntity.setEntityItemStack( - GT_OreDictUnificator - .get(OrePrefixes.crushedPurified, aMaterial, aItemEntity.getEntityItem().stackSize)); - aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3); - return true; - } - } else if (aPrefix == OrePrefixes.dust && aMaterial == Materials.Wheat) { - Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ); - byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ); - if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) { - aItemEntity.setEntityItemStack(ItemList.Food_Dough.get(aItemEntity.getEntityItem().stackSize)); - aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3); - return true; - } - } - } - } - return false; - } - - @Override - protected void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - super.addAdditionalToolTips(aList, aStack, aPlayer); - int aDamage = aStack.getItemDamage(); - if ((aDamage < 32000) && (aDamage >= 0)) { - Materials aMaterial = GregTech_API.sGeneratedMaterials[(aDamage % 1000)]; - if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) { - OrePrefixes aPrefix = this.mGeneratedPrefixList[(aDamage / 1000)]; - if ((aPrefix == OrePrefixes.dustImpure) || (aPrefix == OrePrefixes.dustPure)) { - aList.add(this.mToolTipPurify); - } - } - } - } - - public boolean isPlasmaCellUsed(OrePrefixes aPrefix, Materials aMaterial) { - Collection fusionRecipes = RecipeMaps.fusionRecipes.getAllRecipes(); - if (aPrefix == OrePrefixes.cellPlasma && aMaterial.getPlasma(1L) != null) { // Materials has a plasma fluid - for (GT_Recipe recipe : fusionRecipes) { // Loop through fusion recipes - if (recipe.getFluidOutput(0) != null) { // Make sure fluid output can't be null (not sure if possible) - if (recipe.getFluidOutput(0) - .isFluidEqual(aMaterial.getPlasma(1L))) return true; // Fusion recipe - // output matches - // current plasma - // cell fluid - } - } - } - return false; - } - - @Override - public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { - return (aDoShowAllItems) || (((aPrefix != OrePrefixes.gem) || (!aMaterial.mName.startsWith("Infused"))) - && (aPrefix != OrePrefixes.dustTiny) - && (aPrefix != OrePrefixes.dustSmall) - && (aPrefix != OrePrefixes.dustImpure) - && (aPrefix != OrePrefixes.dustPure) - && (aPrefix != OrePrefixes.crushed) - && (aPrefix != OrePrefixes.crushedPurified) - && (aPrefix != OrePrefixes.crushedCentrifuged) - && (aPrefix != OrePrefixes.ingotHot) - && !(aPrefix == OrePrefixes.cellPlasma && !isPlasmaCellUsed(aPrefix, aMaterial))); - } - - @Override - public ItemStack getContainerItem(ItemStack aStack) { - int aDamage = aStack.getItemDamage(); - if (((aDamage >= 32430) && (aDamage <= 32461)) || (aDamage == 32465 || aDamage == 32466)) { - return ItemList.Spray_Empty.get(1L); - } - if ((aDamage == 32479) || (aDamage == 32476)) { - return new ItemStack(this, 1, aDamage - 2); - } - if (aDamage == 32401) { - return new ItemStack(this, 1, aDamage - 1); - } - return super.getContainerItem(aStack); - } - - @Override - public boolean doesMaterialAllowGeneration(OrePrefixes aPrefix, Materials aMaterial) { - return (super.doesMaterialAllowGeneration(aPrefix, aMaterial)); - } - - private void setBurnValues() { - setBurnValue(17000 + Materials.Wood.mMetaItemSubID, 1600); - } - - private void setAllFluidContainerStats() { - setFluidContainerStats(32000 + Large_Fluid_Cell_Steel.ID, 8_000L, 64L); - setFluidContainerStats(32000 + Large_Fluid_Cell_TungstenSteel.ID, 512_000L, 32L); - setFluidContainerStats(32000 + Large_Fluid_Cell_Aluminium.ID, 32_000L, 64L); - setFluidContainerStats(32000 + Large_Fluid_Cell_StainlessSteel.ID, 64_000L, 64L); - setFluidContainerStats(32000 + Large_Fluid_Cell_Titanium.ID, 128_000L, 64L); - setFluidContainerStats(32000 + Large_Fluid_Cell_Chrome.ID, 2_048_000L, 8L); - setFluidContainerStats(32000 + Large_Fluid_Cell_Iridium.ID, 8_192_000L, 2L); - setFluidContainerStats(32000 + Large_Fluid_Cell_Osmium.ID, 32_768_000L, 1L); - setFluidContainerStats(32000 + Large_Fluid_Cell_Neutronium.ID, 131_072_000L, 1L); - setFluidContainerStats(32000 + Electromagnet_Iron.ID, 0L, 1L); - setFluidContainerStats(32000 + Electromagnet_Steel.ID, 0L, 1L); - setFluidContainerStats(32000 + Electromagnet_Neodymium.ID, 0L, 1L); - setFluidContainerStats(32000 + Electromagnet_Samarium.ID, 0L, 1L); - setFluidContainerStats(32000 + Electromagnet_Tengam.ID, 0L, 1L); - } - - private void oredictBlacklistEntries() { - GT_OreDictUnificator.addToBlacklist(new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID)); - } - - private void registerCovers() { - final ITexture doesWorkCoverTexture = TextureFactory.of( - TextureFactory.of(OVERLAY_ACTIVITYDETECTOR), - TextureFactory.builder() - .addIcon(OVERLAY_ACTIVITYDETECTOR_GLOW) - .glow() - .build()); - - final ITexture playerDectectorCoverTexture = TextureFactory.of( - TextureFactory.of(OVERLAY_ACTIVITYDETECTOR), - TextureFactory.builder() - .addIcon(OVERLAY_ACTIVITYDETECTOR_GLOW) - .glow() - .build()); - final ITexture screenCoverTexture = TextureFactory.of( - TextureFactory.of(OVERLAY_SCREEN), - TextureFactory.builder() - .addIcon(OVERLAY_SCREEN_GLOW) - .glow() - .build()); - - GregTech_API.registerCover( - new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID), - TextureFactory.of(COVER_WOOD_PLATE), - null); - - GregTech_API.registerCover( - ItemList.Electric_Pump_LV.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(32, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_MV.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(128, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_HV.get(1L), - TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(512, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_EV.get(1L), - TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(2048, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_IV.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(8192, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_LuV.get(1L), - TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(32768, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_ZPM.get(1L), - TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(131072, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_UV.get(1L), - TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(524288, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_UHV.get(1L), - TextureFactory.of(MACHINE_CASINGS[9][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(1048576, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.Electric_Pump_UEV.get(1L), - TextureFactory.of(MACHINE_CASINGS[10][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_Pump(2097152, TextureFactory.of(OVERLAY_PUMP))); - - GregTech_API.registerCover( - ItemList.Steam_Valve_LV.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamValve(1024, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Valve_MV.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamValve(2048, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Valve_HV.get(1L), - TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamValve(4096, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Valve_EV.get(1L), - TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamValve(8192, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Valve_IV.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamValve(16384, TextureFactory.of(OVERLAY_VALVE))); - - GregTech_API.registerCover( - ItemList.FluidRegulator_LV.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(32, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.FluidRegulator_MV.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(128, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.FluidRegulator_HV.get(1L), - TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(512, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.FluidRegulator_EV.get(1L), - TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(2048, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.FluidRegulator_IV.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(8192, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.FluidRegulator_LuV.get(1L), - TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(32768, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.FluidRegulator_ZPM.get(1L), - TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(131072, TextureFactory.of(OVERLAY_PUMP))); - GregTech_API.registerCover( - ItemList.FluidRegulator_UV.get(1L), - TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_PUMP)), - new GT_Cover_FluidRegulator(524288, TextureFactory.of(OVERLAY_PUMP))); - - GregTech_API.registerCover( - ItemList.FluidFilter.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)), - new GT_Cover_Fluidfilter(TextureFactory.of(OVERLAY_SHUTTER))); - - GregTech_API.registerCover( - ItemList.ItemFilter_Export.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_ItemFilter(true, TextureFactory.of(OVERLAY_CONVEYOR))); - - GregTech_API.registerCover( - ItemList.ItemFilter_Import.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_ItemFilter(false, TextureFactory.of(OVERLAY_CONVEYOR))); - - GregTech_API.registerCover( - ItemList.Cover_FluidLimiter.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)), - new GT_Cover_FluidLimiter(TextureFactory.of(OVERLAY_SHUTTER))); - - GregTech_API.registerCover( - ItemList.Conveyor_Module_LV.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(400, 1, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_MV.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(100, 1, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_HV.get(1L), - TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(20, 1, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_EV.get(1L), - TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(4, 1, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_IV.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(1, 1, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_LuV.get(1L), - TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(1, 2, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_ZPM.get(1L), - TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(1, 4, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_UV.get(1L), - TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(1, 8, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_UHV.get(1L), - TextureFactory.of(MACHINE_CASINGS[9][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(1, 16, TextureFactory.of(OVERLAY_CONVEYOR))); - GregTech_API.registerCover( - ItemList.Conveyor_Module_UEV.get(1L), - TextureFactory.of(MACHINE_CASINGS[10][0], TextureFactory.of(OVERLAY_CONVEYOR)), - new GT_Cover_Conveyor(1, 32, TextureFactory.of(OVERLAY_CONVEYOR))); - - GregTech_API.registerCover( - ItemList.Robot_Arm_LV.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_ARM)), - new GT_Cover_Arm(400, TextureFactory.of(OVERLAY_ARM))); - GregTech_API.registerCover( - ItemList.Robot_Arm_MV.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ARM)), - new GT_Cover_Arm(100, TextureFactory.of(OVERLAY_ARM))); - GregTech_API.registerCover( - ItemList.Robot_Arm_HV.get(1L), - TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_ARM)), - new GT_Cover_Arm(20, TextureFactory.of(OVERLAY_ARM))); - GregTech_API.registerCover( - ItemList.Robot_Arm_EV.get(1L), - TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_ARM)), - new GT_Cover_Arm(4, TextureFactory.of(OVERLAY_ARM))); - GregTech_API.registerCover( - ItemList.Robot_Arm_IV.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_ARM)), - new GT_Cover_Arm(1, TextureFactory.of(OVERLAY_ARM))); - - GregTech_API.registerCover( - ItemList.Cover_Controller.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_CONTROLLER)), - new GT_Cover_ControlsWork(TextureFactory.of(OVERLAY_CONTROLLER))); - - GregTech_API.registerCover( - ItemList.Cover_Chest_Basic.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_1)), - new GT_Cover_Chest(9, TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_1))); - GregTech_API.registerCover( - ItemList.Cover_Chest_Good.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_2)), - new GT_Cover_Chest(12, TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_2))); - GregTech_API.registerCover( - ItemList.Cover_Chest_Advanced.get(1L), - TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_3)), - new GT_Cover_Chest(15, TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_3))); - GregTech_API.registerCover( - ItemList.Cover_ActivityDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], doesWorkCoverTexture), - new GT_Cover_DoesWork(doesWorkCoverTexture)); - GregTech_API.registerCover( - ItemList.Cover_FluidDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_FLUIDDETECTOR)), - new GT_Cover_LiquidMeter(TextureFactory.of(OVERLAY_FLUIDDETECTOR))); - GregTech_API.registerCover( - ItemList.Cover_ItemDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ITEMDETECTOR)), - new GT_Cover_ItemMeter(TextureFactory.of(OVERLAY_ITEMDETECTOR))); - GregTech_API.registerCover( - ItemList.Cover_EnergyDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ENERGYDETECTOR)), - new GT_Cover_EUMeter(TextureFactory.of(OVERLAY_ENERGYDETECTOR))); - - GregTech_API.registerCover( - ItemList.Cover_PlayerDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], playerDectectorCoverTexture), - new GT_Cover_PlayerDetector(playerDectectorCoverTexture)); - GregTech_API.registerCover( - ItemList.Cover_FluidStorageMonitor.get(1L), - TextureFactory.of(OVERLAY_FLUID_STORAGE_MONITOR0), - new GT_Cover_FluidStorageMonitor()); - - GregTech_API.registerCover( - ItemList.Cover_Screen.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], screenCoverTexture), - new GT_Cover_Screen(screenCoverTexture)); - GregTech_API.registerCover( - ItemList.Cover_Crafting.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_CRAFTING)), - new GT_Cover_Crafting(TextureFactory.of(OVERLAY_CRAFTING))); - GregTech_API.registerCover( - ItemList.Cover_Drain.get(1L), - TextureFactory.of(MACHINE_CASINGS[0][0], TextureFactory.of(OVERLAY_DRAIN)), - new GT_Cover_Drain(TextureFactory.of(OVERLAY_DRAIN))); - GregTech_API.registerCover( - ItemList.Cover_Shutter.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)), - new GT_Cover_Shutter(TextureFactory.of(OVERLAY_SHUTTER))); - - GregTech_API.registerCover( - ItemList.Cover_SolarPanel.get(1L), - TextureFactory.of(SOLARPANEL), - new GT_Cover_SolarPanel(1)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_8V.get(1L), - TextureFactory.of(SOLARPANEL_8V), - new GT_Cover_SolarPanel(8)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_LV.get(1L), - TextureFactory.of(SOLARPANEL_LV), - new GT_Cover_SolarPanel(32)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_MV.get(1L), - TextureFactory.of(SOLARPANEL_MV), - new GT_Cover_SolarPanel(128)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_HV.get(1L), - TextureFactory.of(SOLARPANEL_HV), - new GT_Cover_SolarPanel(512)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_EV.get(1L), - TextureFactory.of(SOLARPANEL_EV), - new GT_Cover_SolarPanel(2048)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_IV.get(1L), - TextureFactory.of(SOLARPANEL_IV), - new GT_Cover_SolarPanel(8192)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_LuV.get(1L), - TextureFactory.of(SOLARPANEL_LuV), - new GT_Cover_SolarPanel(32768)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_ZPM.get(1L), - TextureFactory.of(SOLARPANEL_ZPM), - new GT_Cover_SolarPanel(131072)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_UV.get(1L), - TextureFactory.of(SOLARPANEL_UV), - new GT_Cover_SolarPanel(524288)); - - GregTech_API.registerCover( - ItemList.Cover_RedstoneTransmitterExternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)), - new GT_Cover_RedstoneTransmitterExternal(TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER))); - GregTech_API.registerCover( - ItemList.Cover_RedstoneTransmitterInternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)), - new GT_Cover_RedstoneTransmitterInternal(TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER))); - GregTech_API.registerCover( - ItemList.Cover_RedstoneReceiverExternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)), - new GT_Cover_RedstoneReceiverExternal(TextureFactory.of(OVERLAY_REDSTONE_RECEIVER))); - GregTech_API.registerCover( - ItemList.Cover_RedstoneReceiverInternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)), - new GT_Cover_RedstoneReceiverInternal(TextureFactory.of(OVERLAY_REDSTONE_RECEIVER))); - - GregTech_API.registerCover( - ItemList.Steam_Regulator_LV.get(1L), - TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamRegulator(1024, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Regulator_MV.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamRegulator(2048, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Regulator_HV.get(1L), - TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamRegulator(4096, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Regulator_EV.get(1L), - TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamRegulator(8192, TextureFactory.of(OVERLAY_VALVE))); - GregTech_API.registerCover( - ItemList.Steam_Regulator_IV.get(1L), - TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_VALVE)), - new GT_Cover_SteamRegulator(16384, TextureFactory.of(OVERLAY_VALVE))); - - GregTech_API.registerCover( - ItemList.Cover_NeedsMaintainance.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_MAINTENANCE_DETECTOR)), - new GT_Cover_NeedMaintainance(TextureFactory.of(OVERLAY_MAINTENANCE_DETECTOR))); - - } - - private void removeRecipes() { - GT_ModHandler.removeRecipe( - new ItemStack(Blocks.glass), - null, - new ItemStack(Blocks.glass), - null, - new ItemStack(Blocks.glass)); - } - - private void craftingShapedRecipes() { - ItemStack tStack = new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID); - tStack.setStackDisplayName("The holy Planks of Sengir"); - GT_Utility.ItemNBT.addEnchantment(tStack, Enchantment.smite, 10); - GT_ModHandler.addCraftingRecipe( - tStack, - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "XXX", "XDX", "XXX", 'X', OrePrefixes.gem.get(Materials.NetherStar), 'D', - new ItemStack(Blocks.dragon_egg, 1, 32767) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Shape_Slicer_Flat.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "hXS", aTextShape, "fXd", 'P', ItemList.Shape_Extruder_Block, 'X', - OrePrefixes.plate.get(Materials.StainlessSteel), 'S', - OrePrefixes.screw.get(Materials.StainlessSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Shape_Slicer_Stripes.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "hXS", "XPX", "fXd", 'P', ItemList.Shape_Extruder_Block, 'X', - OrePrefixes.plate.get(Materials.StainlessSteel), 'S', - OrePrefixes.screw.get(Materials.StainlessSteel) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Fuel_Can_Plastic_Empty.get(7L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " PP", "P P", "PPP", 'P', OrePrefixes.plate.get(Materials.Plastic) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Crate_Empty.get(4L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "SWS", "WdW", "SWS", 'W', OrePrefixes.plank.get(Materials.Wood), 'S', - OrePrefixes.screw.get(Materials.AnyIron) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Crate_Empty.get(4L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "SWS", "WdW", "SWS", 'W', OrePrefixes.plank.get(Materials.Wood), 'S', - OrePrefixes.screw.get(Materials.Steel) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Schematic_1by1.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "d ", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic }); - GT_ModHandler.addCraftingRecipe( - ItemList.Schematic_2by2.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " d ", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic }); - GT_ModHandler.addCraftingRecipe( - ItemList.Schematic_3by3.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " d", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic }); - GT_ModHandler.addCraftingRecipe( - ItemList.Schematic_Dust.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { aTextEmptyRow, aTextShape, " d", 'P', ItemList.Schematic }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Hull_LV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "Cf ", "Ph ", "Ps ", 'P', OrePrefixes.plate.get(Materials.BatteryAlloy), 'C', - OreDictNames.craftingWireTin }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.IronMagnetic), 'R', - OrePrefixes.stick.get(Materials.AnyIron), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', - OrePrefixes.stick.get(Materials.Steel), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', - OrePrefixes.stick.get(Materials.Aluminium), 'W', OrePrefixes.wireGt02.get(Materials.Cupronickel), 'C', - OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', - OrePrefixes.stick.get(Materials.StainlessSteel), 'W', OrePrefixes.wireGt04.get(Materials.Electrum), 'C', - OrePrefixes.cableGt02.get(Materials.Silver) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', - OrePrefixes.stick.get(Materials.Titanium), 'W', OrePrefixes.wireGt04.get(Materials.BlackSteel), 'C', - OrePrefixes.cableGt02.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Motor_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', - OrePrefixes.stick.get(Materials.TungstenSteel), 'W', OrePrefixes.wireGt04.get(Materials.Graphene), 'C', - OrePrefixes.cableGt02.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Piston_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Steel), 'S', - OrePrefixes.stick.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'M', - ItemList.Electric_Motor_LV, 'C', OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Piston_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'S', - OrePrefixes.stick.get(Materials.Aluminium), 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'M', - ItemList.Electric_Motor_MV, 'C', OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Piston_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'S', - OrePrefixes.stick.get(Materials.StainlessSteel), 'G', - OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'M', ItemList.Electric_Motor_HV, 'C', - OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Piston_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Titanium), 'S', - OrePrefixes.stick.get(Materials.Titanium), 'G', OrePrefixes.gearGtSmall.get(Materials.Titanium), 'M', - ItemList.Electric_Motor_EV, 'C', OrePrefixes.cableGt01.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Piston_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'S', - OrePrefixes.stick.get(Materials.TungstenSteel), 'G', - OrePrefixes.gearGtSmall.get(Materials.TungstenSteel), 'M', ItemList.Electric_Motor_IV, 'C', - OrePrefixes.cableGt01.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Pump_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_LV, 'O', - OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Tin), 'S', - OrePrefixes.screw.get(Materials.Tin), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'P', - OrePrefixes.pipeMedium.get(Materials.Bronze) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Pump_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_MV, 'O', - OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Bronze), 'S', - OrePrefixes.screw.get(Materials.Bronze), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'P', - OrePrefixes.pipeMedium.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Pump_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_HV, 'O', - OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Steel), 'S', - OrePrefixes.screw.get(Materials.Steel), 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'P', - OrePrefixes.pipeMedium.get(Materials.StainlessSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Pump_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_EV, 'O', - OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.StainlessSteel), 'S', - OrePrefixes.screw.get(Materials.StainlessSteel), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium), - 'P', OrePrefixes.pipeMedium.get(Materials.Titanium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Electric_Pump_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_IV, 'O', - OrePrefixes.ring.get(Materials.AnySyntheticRubber), 'X', OrePrefixes.rotor.get(Materials.TungstenSteel), - 'S', OrePrefixes.screw.get(Materials.TungstenSteel), 'W', OrePrefixes.cableGt01.get(Materials.Tungsten), - 'P', OrePrefixes.pipeMedium.get(Materials.TungstenSteel) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Conveyor_Module_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_LV, 'C', - OrePrefixes.cableGt01.get(Materials.Tin), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Conveyor_Module_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_MV, 'C', - OrePrefixes.cableGt01.get(Materials.AnyCopper), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Conveyor_Module_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_HV, 'C', - OrePrefixes.cableGt01.get(Materials.Gold), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Conveyor_Module_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_EV, 'C', - OrePrefixes.cableGt01.get(Materials.Aluminium), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Conveyor_Module_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_IV, 'C', - OrePrefixes.cableGt01.get(Materials.Tungsten), 'R', - OrePrefixes.plate.get(Materials.AnySyntheticRubber) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Robot_Arm_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Steel), 'M', - ItemList.Electric_Motor_LV, 'P', ItemList.Electric_Piston_LV, 'E', - OrePrefixes.circuit.get(Materials.LV), 'C', OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Robot_Arm_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Aluminium), 'M', - ItemList.Electric_Motor_MV, 'P', ItemList.Electric_Piston_MV, 'E', - OrePrefixes.circuit.get(Materials.MV), 'C', OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Robot_Arm_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.StainlessSteel), 'M', - ItemList.Electric_Motor_HV, 'P', ItemList.Electric_Piston_HV, 'E', - OrePrefixes.circuit.get(Materials.HV), 'C', OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Robot_Arm_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Titanium), 'M', - ItemList.Electric_Motor_EV, 'P', ItemList.Electric_Piston_EV, 'E', - OrePrefixes.circuit.get(Materials.EV), 'C', OrePrefixes.cableGt01.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Robot_Arm_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.TungstenSteel), 'M', - ItemList.Electric_Motor_IV, 'P', ItemList.Electric_Piston_IV, 'E', - OrePrefixes.circuit.get(Materials.IV), 'C', OrePrefixes.cableGt01.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Emitter_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.CertusQuartz), 'S', - OrePrefixes.stick.get(Materials.Brass), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Emitter_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.EnderPearl), 'S', - OrePrefixes.stick.get(Materials.Electrum), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Emitter_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.EnderEye), 'S', - OrePrefixes.stick.get(Materials.Chrome), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Emitter_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SSC", "WQS", "CWS", 'Q', ItemList.QuantumEye, 'S', - OrePrefixes.stick.get(Materials.Platinum), 'C', OrePrefixes.circuit.get(Materials.EV), 'W', - OrePrefixes.cableGt01.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Emitter_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "SSC", "WQS", "CWS", 'Q', ItemList.QuantumStar, 'S', - OrePrefixes.stick.get(Materials.Iridium), 'C', OrePrefixes.circuit.get(Materials.IV), 'W', - OrePrefixes.cableGt01.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Sensor_LV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gem.get(Materials.CertusQuartz), 'S', - OrePrefixes.stick.get(Materials.Brass), 'P', OrePrefixes.plate.get(Materials.Steel), 'C', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Sensor_MV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gemFlawless.get(Materials.Emerald), 'S', - OrePrefixes.stick.get(Materials.Electrum), 'P', OrePrefixes.plate.get(Materials.Aluminium), 'C', - OrePrefixes.circuit.get(Materials.MV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Sensor_HV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gem.get(Materials.EnderEye), 'S', - OrePrefixes.stick.get(Materials.Chrome), 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'C', - OrePrefixes.circuit.get(Materials.HV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Sensor_EV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "P Q", "PS ", "CPP", 'Q', ItemList.QuantumEye, 'S', - OrePrefixes.stick.get(Materials.Platinum), 'P', OrePrefixes.plate.get(Materials.Titanium), 'C', - OrePrefixes.circuit.get(Materials.EV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Sensor_IV.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "P Q", "PS ", "CPP", 'Q', ItemList.QuantumStar, 'S', - OrePrefixes.stick.get(Materials.Iridium), 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'C', - OrePrefixes.circuit.get(Materials.IV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Component_Sawblade_Diamond.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { " D ", "DGD", " D ", 'D', OrePrefixes.dustSmall.get(Materials.Diamond), 'G', - OrePrefixes.gearGt.get(Materials.CobaltBrass) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Component_Grinder_Diamond.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "DSD", "SIS", "DSD", 'I', OrePrefixes.gem.get(Materials.Diamond), 'D', - OrePrefixes.dust.get(Materials.Diamond), 'S', OrePrefixes.plateDouble.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Component_Grinder_Tungsten.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "TST", "SIS", "TST", 'I', OreDictNames.craftingIndustrialDiamond, 'T', - OrePrefixes.plate.get(Materials.Tungsten), 'S', OrePrefixes.plateDouble.get(Materials.Steel) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Cover_Screen.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "AGA", "RPB", "ALA", 'A', OrePrefixes.plate.get(Materials.Aluminium), 'L', - OrePrefixes.dust.get(Materials.Glowstone), 'R', Dyes.dyeRed, 'G', Dyes.dyeLime, 'B', Dyes.dyeBlue, 'P', - OrePrefixes.plate.get(Materials.Glass) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Tool_Scanner.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "EPR", "CSC", "PBP", 'C', OrePrefixes.circuit.get(Materials.HV), 'P', - OrePrefixes.plate.get(Materials.Aluminium), 'E', ItemList.Emitter_MV, 'R', ItemList.Sensor_MV, 'S', - ItemList.Cover_Screen, 'B', ItemList.Battery_RE_MV_Lithium }); - - GT_ModHandler.addCraftingRecipe( - ItemList.ItemFilter_Export.get(1L), - new Object[] { "SPS", "dIC", "SPS", 'P', OrePrefixes.plate.get(Materials.Tin), 'S', - OrePrefixes.screw.get(Materials.Iron), 'I', ItemList.Component_Filter, 'C', - ItemList.Conveyor_Module_LV }); - GT_ModHandler.addCraftingRecipe( - ItemList.ItemFilter_Import.get(1L), - new Object[] { "SPS", "CId", "SPS", 'P', OrePrefixes.plate.get(Materials.Tin), 'S', - OrePrefixes.screw.get(Materials.Iron), 'I', ItemList.Component_Filter, 'C', - ItemList.Conveyor_Module_LV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Tool_Cover_Copy_Paste.get(1L), - GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "PSP", "PCP", "PBP", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'S', - ItemList.Tool_DataStick.get(1L), 'C', ItemList.Cover_Screen.get(1L), 'B', - ItemList.Battery_RE_MV_Lithium.get(1L) }); - } - - private void craftingShapelessRecipes() { - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Coin_Chocolate.get(1L), - new Object[] { OrePrefixes.dust.get(Materials.Cocoa), OrePrefixes.dust.get(Materials.Milk), - OrePrefixes.dust.get(Materials.Sugar), OrePrefixes.foil.get(Materials.Gold) }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Copper.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Iron }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Iron.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Silver }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Silver.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Gold }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Gold.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Platinum }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Platinum.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Osmium }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Iron.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper, - ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper, - ItemList.Credit_Copper }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Silver.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, - ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Gold.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver, - ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver, - ItemList.Credit_Silver }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Platinum.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, - ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Osmium.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum, - ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum, - ItemList.Credit_Platinum }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Copper.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Cupronickel }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Cupronickel.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Silver }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Silver.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Gold }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Gold.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Platinum }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Platinum.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Osmium }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Osmium.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Naquadah }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Naquadah.get(8L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Neutronium }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Cupronickel.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, - ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, - ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Silver.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, - ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, - ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Gold.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, - ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, - ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Platinum.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, - ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, - ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Osmium.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, - ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, - ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Naquadah.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, - ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, - ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Credit_Greg_Neutronium.get(1L), - GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, - ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, - ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Schematic.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Schematic_Crafting }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Schematic.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Schematic_1by1 }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Schematic.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Schematic_2by2 }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Schematic.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Schematic_3by3 }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Schematic.get(1L), - GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Schematic_Dust }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Tool_DataOrb.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Tool_DataOrb.get(1L) }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Tool_DataStick.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ItemList.Tool_DataStick.get(1L) }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_RedstoneTransmitterInternal.get(1L), - new Object[] { ItemList.Cover_RedstoneTransmitterExternal.get(1L) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_RedstoneReceiverInternal.get(1L), - new Object[] { ItemList.Cover_RedstoneReceiverExternal.get(1L) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_RedstoneTransmitterExternal.get(1L), - new Object[] { ItemList.Cover_RedstoneTransmitterInternal.get(1L) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_RedstoneReceiverExternal.get(1L), - new Object[] { ItemList.Cover_RedstoneReceiverInternal.get(1L) }); - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.ItemFilter_Export.get(1L), - new Object[] { ItemList.ItemFilter_Import.get(1L) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.ItemFilter_Import.get(1L), - new Object[] { ItemList.ItemFilter_Export.get(1L) }); - - } - - private void registerBehaviors() { - IItemBehaviour behaviourSprayColorRemover = new Behaviour_Spray_Color_Remover( - ItemList.Spray_Empty.get(1L), - ItemList.Spray_Color_Used_Remover.get(1L), - ItemList.Spray_Color_Remover.get(1L), - 1024L); - addItemBehavior(32000 + Spray_Color_Remover.ID, behaviourSprayColorRemover); - addItemBehavior(32000 + Spray_Color_Used_Remover.ID, behaviourSprayColorRemover); - - IItemBehaviour behaviourMatches = new Behaviour_Lighter( - null, - ItemList.Tool_Matches.get(1L), - ItemList.Tool_Matches.get(1L), - 1L); - addItemBehavior(32000 + Tool_Matches.ID, behaviourMatches); - IItemBehaviour behaviourMatchBox = new Behaviour_Lighter( - null, - ItemList.Tool_MatchBox_Used.get(1L), - ItemList.Tool_MatchBox_Full.get(1L), - 16L); - addItemBehavior(32000 + Tool_MatchBox_Used.ID, behaviourMatchBox); - addItemBehavior(32000 + Tool_MatchBox_Full.ID, behaviourMatchBox); - - IItemBehaviour behaviourLighterInvar = new Behaviour_Lighter( - ItemList.Tool_Lighter_Invar_Empty.get(1L), - ItemList.Tool_Lighter_Invar_Used.get(1L), - ItemList.Tool_Lighter_Invar_Full.get(1L), - 100L); - addItemBehavior(32000 + Tool_Lighter_Invar_Used.ID, behaviourLighterInvar); - addItemBehavior(32000 + Tool_Lighter_Invar_Full.ID, behaviourLighterInvar); - - IItemBehaviour behaviourLighterPlatinum = new Behaviour_Lighter( - ItemList.Tool_Lighter_Platinum_Empty.get(1L), - ItemList.Tool_Lighter_Platinum_Used.get(1L), - ItemList.Tool_Lighter_Platinum_Full.get(1L), - 1000L); - addItemBehavior(32000 + Tool_Lighter_Platinum_Used.ID, behaviourLighterPlatinum); - addItemBehavior(32000 + Tool_Lighter_Platinum_Full.ID, behaviourLighterPlatinum); - - for (int i = 0; i < 16; i++) { - IItemBehaviour behaviourSprayColor = new Behaviour_Spray_Color( - ItemList.Spray_Empty.get(1L), - ItemList.SPRAY_CAN_DYES_USED[i].get(1L), - ItemList.SPRAY_CAN_DYES[i].get(1L), - ConfigGeneral.sprayCanUses, - i); - addItemBehavior(32000 + Spray_Colors[i], behaviourSprayColor); - addItemBehavior(32000 + Spray_Colors_Used[i], behaviourSprayColor); - } - } - - private void setAllElectricStats() { - setElectricStats(32000 + Battery_RE_ULV_Tantalum.ID, 1000L, GT_Values.V[0], 0L, -3L, false); - setElectricStats(32000 + Battery_SU_LV_Sulfuric_Acid.ID, 18000L, GT_Values.V[1], 1L, -2L, true); - setElectricStats(32000 + Battery_SU_LV_Mercury.ID, 32000L, GT_Values.V[1], 1L, -2L, true); - setElectricStats(32000 + Battery_RE_LV_Cadmium.ID, 75000L, GT_Values.V[1], 1L, -3L, true); - setElectricStats(32000 + Battery_RE_LV_Lithium.ID, 100000L, GT_Values.V[1], 1L, -3L, true); - setElectricStats(32000 + Battery_RE_LV_Sodium.ID, 50000L, GT_Values.V[1], 1L, -3L, true); - setElectricStats(32000 + Battery_SU_MV_Sulfuric_Acid.ID, 72000L, GT_Values.V[2], 2L, -2L, true); - setElectricStats(32000 + Battery_SU_MV_Mercury.ID, 128000L, GT_Values.V[2], 2L, -2L, true); - setElectricStats(32000 + Battery_RE_MV_Cadmium.ID, 300000L, GT_Values.V[2], 2L, -3L, true); - setElectricStats(32000 + Battery_RE_MV_Lithium.ID, 400000L, GT_Values.V[2], 2L, -3L, true); - setElectricStats(32000 + Battery_RE_MV_Sodium.ID, 200000L, GT_Values.V[2], 2L, -3L, true); - setElectricStats(32000 + Battery_SU_HV_Sulfuric_Acid.ID, 288000L, GT_Values.V[3], 3L, -2L, true); - setElectricStats(32000 + Battery_SU_HV_Mercury.ID, 512000L, GT_Values.V[3], 3L, -2L, true); - setElectricStats(32000 + Battery_RE_HV_Cadmium.ID, 1200000L, GT_Values.V[3], 3L, -3L, true); - setElectricStats(32000 + Battery_RE_HV_Lithium.ID, 1600000L, GT_Values.V[3], 3L, -3L, true); - setElectricStats(32000 + Battery_RE_HV_Sodium.ID, 800000L, GT_Values.V[3], 3L, -3L, true); - setElectricStats(32000 + Energy_Lapotronic_Orb.ID, 100000000L, GT_Values.V[5], 5L, -3L, true); - setElectricStats(32000 + ID_MetaItem_01.ZPM.ID, 2000000000000L, GT_Values.V[7], 7L, -2L, true); - setElectricStats(32000 + Energy_Lapotronic_orb_2.ID, 1000000000L, GT_Values.V[6], 6L, -3L, true); - setElectricStats(32000 + ZPM2.ID, Long.MAX_VALUE, GT_Values.V[8], 8L, -3L, true); - setElectricStats(32000 + ZPM3.ID, Long.MAX_VALUE, GT_Values.V[12], 12L, -3L, true); - setElectricStats(32000 + ZPM4.ID, Long.MAX_VALUE, GT_Values.V[13], 13L, -3L, true); - setElectricStats(32000 + ZPM5.ID, Long.MAX_VALUE, GT_Values.V[14], 14L, -3L, true); - setElectricStats(32000 + ZPM6.ID, Long.MAX_VALUE, GT_Values.V[15], 15L, -3L, true); - setElectricStats(32000 + Energy_Module.ID, 10000000000L, GT_Values.V[7], 7L, -3L, true); - setElectricStats(32000 + Energy_Cluster.ID, 100000000000L, GT_Values.V[8], 8L, -3L, true); - setElectricStats(32000 + Tool_Cover_Copy_Paste.ID, 400000L, GT_Values.V[2], 2L, -1L, false); - setElectricStats(32000 + Tool_Cheat.ID, -2000000000L, 1000000000L, -1L, -3L, false); - setElectricStats(32000 + Tool_Scanner.ID, 400000L, GT_Values.V[2], 2L, -1L, false); - setElectricStats(32000 + BatteryHull_EV_Full.ID, 6400000L, GT_Values.V[4], 4L, -3L, true); - setElectricStats(32000 + BatteryHull_IV_Full.ID, 25600000L, GT_Values.V[5], 5L, -3L, true); - setElectricStats(32000 + BatteryHull_LuV_Full.ID, 102400000L, GT_Values.V[6], 6L, -3L, true); - setElectricStats(32000 + BatteryHull_ZPM_Full.ID, 409600000L, GT_Values.V[7], 7L, -3L, true); - setElectricStats(32000 + BatteryHull_UV_Full.ID, 1638400000L, GT_Values.V[8], 8L, -3L, true); - setElectricStats(32000 + BatteryHull_UHV_Full.ID, 6553600000L, GT_Values.V[9], 9L, -3L, true); - setElectricStats(32000 + BatteryHull_UEV_Full.ID, 26214400000L, GT_Values.V[10], 10L, -3L, true); - setElectricStats(32000 + BatteryHull_UIV_Full.ID, 104857600000L, GT_Values.V[11], 11L, -3L, true); - setElectricStats(32000 + BatteryHull_UMV_Full.ID, 419430400000L, GT_Values.V[12], 12L, -3L, true); - setElectricStats(32000 + BatteryHull_UxV_Full.ID, 1677721600000L, GT_Values.V[13], 13L, -3L, true); - } - - private void registerTieredTooltips() { - registerTieredTooltip(ItemList.Battery_RE_ULV_Tantalum.get(1), ULV); - registerTieredTooltip(ItemList.Battery_SU_LV_SulfuricAcid.get(1), LV); - registerTieredTooltip(ItemList.Battery_SU_LV_Mercury.get(1), LV); - registerTieredTooltip(ItemList.Battery_RE_LV_Cadmium.get(1), LV); - registerTieredTooltip(ItemList.Battery_RE_LV_Lithium.get(1), LV); - registerTieredTooltip(ItemList.Battery_RE_LV_Sodium.get(1), LV); - registerTieredTooltip(ItemList.Battery_SU_MV_SulfuricAcid.get(1), MV); - registerTieredTooltip(ItemList.Battery_SU_MV_Mercury.get(1), MV); - registerTieredTooltip(ItemList.Battery_RE_MV_Cadmium.get(1), MV); - registerTieredTooltip(ItemList.Battery_RE_MV_Lithium.get(1), MV); - registerTieredTooltip(ItemList.Battery_RE_MV_Sodium.get(1), MV); - registerTieredTooltip(ItemList.Battery_SU_HV_SulfuricAcid.get(1), HV); - registerTieredTooltip(ItemList.Battery_SU_HV_Mercury.get(1), HV); - registerTieredTooltip(ItemList.Battery_RE_HV_Cadmium.get(1), HV); - registerTieredTooltip(ItemList.Battery_RE_HV_Lithium.get(1), HV); - registerTieredTooltip(ItemList.Battery_RE_HV_Sodium.get(1), HV); - registerTieredTooltip(ItemList.Energy_LapotronicOrb.get(1), IV); - registerTieredTooltip(ItemList.ZPM.get(1), ZPM); - registerTieredTooltip(ItemList.Energy_LapotronicOrb2.get(1), LuV); - registerTieredTooltip(ItemList.ZPM2.get(1), UV); - registerTieredTooltip(ItemList.ZPM3.get(1), UMV); - registerTieredTooltip(ItemList.ZPM4.get(1), UXV); - registerTieredTooltip(ItemList.ZPM5.get(1), MAX); - registerTieredTooltip(ItemList.ZPM6.get(1), ERV); - registerTieredTooltip(ItemList.Energy_Module.get(1), ZPM); - registerTieredTooltip(ItemList.Energy_Cluster.get(1), UV); - registerTieredTooltip(ItemList.Circuit_Primitive.get(1), ULV); - registerTieredTooltip(ItemList.Circuit_Basic.get(1), LV); - registerTieredTooltip(ItemList.Circuit_Good.get(1), MV); - registerTieredTooltip(ItemList.Circuit_Advanced.get(1), HV); - registerTieredTooltip(ItemList.Circuit_Data.get(1), EV); - registerTieredTooltip(ItemList.Circuit_Elite.get(1), IV); - registerTieredTooltip(ItemList.Circuit_Master.get(1), LuV); - registerTieredTooltip(ItemList.BatteryHull_EV_Full.get(1), EV); - registerTieredTooltip(ItemList.BatteryHull_IV_Full.get(1), IV); - registerTieredTooltip(ItemList.BatteryHull_LuV_Full.get(1), LuV); - registerTieredTooltip(ItemList.BatteryHull_ZPM_Full.get(1), ZPM); - registerTieredTooltip(ItemList.BatteryHull_UV_Full.get(1), UV); - registerTieredTooltip(ItemList.BatteryHull_UHV_Full.get(1), UHV); - registerTieredTooltip(ItemList.BatteryHull_UEV_Full.get(1), UEV); - registerTieredTooltip(ItemList.BatteryHull_UIV_Full.get(1), UIV); - registerTieredTooltip(ItemList.BatteryHull_UMV_Full.get(1), UMV); - registerTieredTooltip(ItemList.BatteryHull_UxV_Full.get(1), UXV); - - } -} diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java deleted file mode 100644 index 857de00e6a..0000000000 --- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java +++ /dev/null @@ -1,3115 +0,0 @@ -package gregtech.common.items; - -import static gregtech.api.enums.GT_Values.RA; -import static gregtech.api.enums.Mods.Forestry; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ADVANCED_REDSTONE_RECEIVER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ADVANCED_REDSTONE_TRANSMITTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_ACTIVITYDETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_FLUID_DETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_ITEM_DETECTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_MAINTENANCE_DETECTOR; -import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; -import static gregtech.api.recipe.RecipeMaps.compressorRecipes; -import static gregtech.api.recipe.RecipeMaps.extractorRecipes; -import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; -import static gregtech.api.util.GT_RecipeBuilder.MINUTES; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.WILDCARD; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Alcopops; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Apple_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Beer; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Cave_Johnsons_Grenade_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Chilly_Sauce; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Cider; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Dark_Beer; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Diablo_Sauce; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Diabolo_Sauce; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Dragon_Blood; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Glen_McKenner; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Golden_Apple_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Golden_Cider; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Grape_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Holy_Water; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Hops_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Hot_Sauce; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Iduns_Apple_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Lemon_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Lemonade; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Leninade; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Limoncello; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Milk; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Mineral_Water; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Notches_Brew; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Pirate_Brew; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Potato_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Purple_Drink; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Reed_Water; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Rum; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Salty_Water; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Scotch; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Snitches_Glitch_Sauce; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Vinegar; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Vodka; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Wheaty_Hops_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Wheaty_Juice; -import static gregtech.common.items.ID_MetaItem_02.Bottle_Wine; -import static gregtech.common.items.ID_MetaItem_02.Cover_AdvancedRedstoneReceiverExternal; -import static gregtech.common.items.ID_MetaItem_02.Cover_AdvancedRedstoneReceiverInternal; -import static gregtech.common.items.ID_MetaItem_02.Cover_AdvancedRedstoneTransmitterExternal; -import static gregtech.common.items.ID_MetaItem_02.Cover_AdvancedRedstoneTransmitterInternal; -import static gregtech.common.items.ID_MetaItem_02.Cover_WirelessActivityDetector; -import static gregtech.common.items.ID_MetaItem_02.Cover_WirelessFluidDetector; -import static gregtech.common.items.ID_MetaItem_02.Cover_WirelessItemDetector; -import static gregtech.common.items.ID_MetaItem_02.Cover_WirelessNeedsMaintainance; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Argentia; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Aurelia; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Bauxite; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_BobsYerUncleRanks; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Chilly; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Coppon; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Cucumber; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Ferru; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Grapes; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Ilmenite; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Indigo; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Iridium; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Lemon; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_MTomato; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Manganese; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Mica; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_MilkWart; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Naquadah; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Nickel; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_OilBerry; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Onion; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Osmium; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Pitchblende; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Platinum; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Plumbilia; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Rape; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Scheelite; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_TeaLeaf; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Thorium; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Tine; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Tomato; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_UUABerry; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_UUMBerry; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Uraninite; -import static gregtech.common.items.ID_MetaItem_02.Crop_Drop_Zinc; -import static gregtech.common.items.ID_MetaItem_02.Display_ITS_FREE; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_00; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_01; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_02; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_03; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_04; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_05; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_06; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_07; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_08; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_09; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_10; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_11; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_12; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_13; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_14; -import static gregtech.common.items.ID_MetaItem_02.Dye_Color_15; -import static gregtech.common.items.ID_MetaItem_02.Dye_Indigo; -import static gregtech.common.items.ID_MetaItem_02.Food_Baked_Baguette; -import static gregtech.common.items.ID_MetaItem_02.Food_Baked_Bun; -import static gregtech.common.items.ID_MetaItem_02.Food_Baked_Cake; -import static gregtech.common.items.ID_MetaItem_02.Food_Baked_Pizza_Cheese; -import static gregtech.common.items.ID_MetaItem_02.Food_Baked_Pizza_Meat; -import static gregtech.common.items.ID_MetaItem_02.Food_Baked_Pizza_Veggie; -import static gregtech.common.items.ID_MetaItem_02.Food_Burger_Cheese; -import static gregtech.common.items.ID_MetaItem_02.Food_Burger_Chum; -import static gregtech.common.items.ID_MetaItem_02.Food_Burger_Meat; -import static gregtech.common.items.ID_MetaItem_02.Food_Burger_Veggie; -import static gregtech.common.items.ID_MetaItem_02.Food_Cheese; -import static gregtech.common.items.ID_MetaItem_02.Food_ChiliChips; -import static gregtech.common.items.ID_MetaItem_02.Food_Chum; -import static gregtech.common.items.ID_MetaItem_02.Food_Chum_On_Stick; -import static gregtech.common.items.ID_MetaItem_02.Food_Dough; -import static gregtech.common.items.ID_MetaItem_02.Food_Dough_Chocolate; -import static gregtech.common.items.ID_MetaItem_02.Food_Dough_Sugar; -import static gregtech.common.items.ID_MetaItem_02.Food_Flat_Dough; -import static gregtech.common.items.ID_MetaItem_02.Food_Fries; -import static gregtech.common.items.ID_MetaItem_02.Food_Large_Sandwich_Bacon; -import static gregtech.common.items.ID_MetaItem_02.Food_Large_Sandwich_Cheese; -import static gregtech.common.items.ID_MetaItem_02.Food_Large_Sandwich_Steak; -import static gregtech.common.items.ID_MetaItem_02.Food_Large_Sandwich_Veggie; -import static gregtech.common.items.ID_MetaItem_02.Food_Packaged_ChiliChips; -import static gregtech.common.items.ID_MetaItem_02.Food_Packaged_Fries; -import static gregtech.common.items.ID_MetaItem_02.Food_Packaged_PotatoChips; -import static gregtech.common.items.ID_MetaItem_02.Food_PotatoChips; -import static gregtech.common.items.ID_MetaItem_02.Food_Potato_On_Stick; -import static gregtech.common.items.ID_MetaItem_02.Food_Potato_On_Stick_Roasted; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Baguette; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Bread; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Bun; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Cake; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Cookie; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Fries; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Pizza_Cheese; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Pizza_Meat; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_Pizza_Veggie; -import static gregtech.common.items.ID_MetaItem_02.Food_Raw_PotatoChips; -import static gregtech.common.items.ID_MetaItem_02.Food_Sandwich_Bacon; -import static gregtech.common.items.ID_MetaItem_02.Food_Sandwich_Cheese; -import static gregtech.common.items.ID_MetaItem_02.Food_Sandwich_Steak; -import static gregtech.common.items.ID_MetaItem_02.Food_Sandwich_Veggie; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Baguette; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Baguettes; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Bread; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Breads; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Bun; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Buns; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Cheese; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Cucumber; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Lemon; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Onion; -import static gregtech.common.items.ID_MetaItem_02.Food_Sliced_Tomato; -import static gregtech.common.items.ID_MetaItem_02.GelledToluene; -import static gregtech.common.items.ID_MetaItem_02.MSFMixture; -import static gregtech.common.items.ID_MetaItem_02.Plank_Acacia; -import static gregtech.common.items.ID_MetaItem_02.Plank_Acacia_Green; -import static gregtech.common.items.ID_MetaItem_02.Plank_Balsa; -import static gregtech.common.items.ID_MetaItem_02.Plank_Baobab; -import static gregtech.common.items.ID_MetaItem_02.Plank_Birch; -import static gregtech.common.items.ID_MetaItem_02.Plank_Cherry; -import static gregtech.common.items.ID_MetaItem_02.Plank_Chestnut; -import static gregtech.common.items.ID_MetaItem_02.Plank_Citrus; -import static gregtech.common.items.ID_MetaItem_02.Plank_DarkOak; -import static gregtech.common.items.ID_MetaItem_02.Plank_Ebony; -import static gregtech.common.items.ID_MetaItem_02.Plank_Greenheart; -import static gregtech.common.items.ID_MetaItem_02.Plank_Jungle; -import static gregtech.common.items.ID_MetaItem_02.Plank_Kapok; -import static gregtech.common.items.ID_MetaItem_02.Plank_Larch; -import static gregtech.common.items.ID_MetaItem_02.Plank_Lime; -import static gregtech.common.items.ID_MetaItem_02.Plank_Mahagony; -import static gregtech.common.items.ID_MetaItem_02.Plank_Mahoe; -import static gregtech.common.items.ID_MetaItem_02.Plank_Maple; -import static gregtech.common.items.ID_MetaItem_02.Plank_Oak; -import static gregtech.common.items.ID_MetaItem_02.Plank_Palm; -import static gregtech.common.items.ID_MetaItem_02.Plank_Papaya; -import static gregtech.common.items.ID_MetaItem_02.Plank_Pine; -import static gregtech.common.items.ID_MetaItem_02.Plank_Plum; -import static gregtech.common.items.ID_MetaItem_02.Plank_Poplar; -import static gregtech.common.items.ID_MetaItem_02.Plank_Sequoia; -import static gregtech.common.items.ID_MetaItem_02.Plank_Spruce; -import static gregtech.common.items.ID_MetaItem_02.Plank_Teak; -import static gregtech.common.items.ID_MetaItem_02.Plank_Walnut; -import static gregtech.common.items.ID_MetaItem_02.Plank_Wenge; -import static gregtech.common.items.ID_MetaItem_02.Plank_Willow; -import static gregtech.common.items.ID_MetaItem_02.SFMixture; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Cafe_au_lait; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Chocolate_Milk; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Coffee; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Dark_Cafe_au_lait; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Dark_Chocolate_Milk; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Dark_Coffee; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Ice_Tea; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Lait_au_cafe; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Sweet_Tea; -import static gregtech.common.items.ID_MetaItem_02.ThermosCan_Tea; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnumEnchantmentType; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.MaterialsUEVplus; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TC_Aspects; -import gregtech.api.enums.TierEU; -import gregtech.api.items.GT_MetaGenerated_Item_X32; -import gregtech.api.objects.ItemData; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_FoodStat; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneReceiverExternal; -import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneReceiverInternal; -import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneTransmitterExternal; -import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneTransmitterInternal; -import gregtech.common.covers.redstone.GT_Cover_WirelessDoesWorkDetector; -import gregtech.common.covers.redstone.GT_Cover_WirelessFluidDetector; -import gregtech.common.covers.redstone.GT_Cover_WirelessItemDetector; -import gregtech.common.covers.redstone.GT_Cover_WirelessMaintenanceDetector; -import ic2.api.crops.CropCard; -import ic2.api.crops.Crops; - -public class GT_MetaGenerated_Item_02 extends GT_MetaGenerated_Item_X32 { - - public static GT_MetaGenerated_Item_02 INSTANCE; - private static final String aTextCover = "Usable as Cover"; - - public GT_MetaGenerated_Item_02() { - super( - "metaitem.02", - OrePrefixes.toolHeadSword, - OrePrefixes.toolHeadPickaxe, - OrePrefixes.toolHeadShovel, - OrePrefixes.toolHeadAxe, - OrePrefixes.toolHeadHoe, - OrePrefixes.toolHeadHammer, - OrePrefixes.toolHeadFile, - OrePrefixes.toolHeadSaw, - OrePrefixes.toolHeadDrill, - OrePrefixes.toolHeadChainsaw, - OrePrefixes.toolHeadWrench, - OrePrefixes.toolHeadUniversalSpade, - OrePrefixes.toolHeadSense, - OrePrefixes.toolHeadPlow, - OrePrefixes.___placeholder___, - OrePrefixes.toolHeadBuzzSaw, - OrePrefixes.turbineBlade, - null, - OrePrefixes.itemCasing, - OrePrefixes.wireFine, - OrePrefixes.gearGtSmall, - OrePrefixes.rotor, - OrePrefixes.stickLong, - OrePrefixes.springSmall, - OrePrefixes.spring, - OrePrefixes.___placeholder___, - OrePrefixes.___placeholder___, - OrePrefixes.gemChipped, - OrePrefixes.gemFlawed, - OrePrefixes.gemFlawless, - OrePrefixes.gemExquisite, - OrePrefixes.gearGt); - INSTANCE = this; - - ItemList.ThermosCan_Dark_Coffee.set( - addItem( - ThermosCan_Dark_Coffee.ID, - "Dark Coffee", - "Coffee, dark, without anything else", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSpeed.id, - 400, - 1, - 70, - Potion.digSpeed.id, - 400, - 1, - 70), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L))); - ItemList.ThermosCan_Dark_Cafe_au_lait.set( - addItem( - ThermosCan_Dark_Cafe_au_lait.ID, - "Dark Coffee au lait", - "Keeping you awake the whole night", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSpeed.id, - 400, - 2, - 90, - Potion.digSpeed.id, - 400, - 2, - 90), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 3L))); - ItemList.ThermosCan_Coffee.set( - addItem( - ThermosCan_Coffee.ID, - "Coffee", - "Just the regular morning Coffee", - new GT_FoodStat( - 3, - 0.4F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSpeed.id, - 400, - 0, - 50, - Potion.digSpeed.id, - 400, - 0, - 50), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L))); - ItemList.ThermosCan_Cafe_au_lait.set( - addItem( - ThermosCan_Cafe_au_lait.ID, - "Cafe au lait", - "Sweet Coffee", - new GT_FoodStat( - 3, - 0.4F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSpeed.id, - 400, - 1, - 70, - Potion.digSpeed.id, - 400, - 1, - 70), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L))); - ItemList.ThermosCan_Lait_au_cafe.set( - addItem( - ThermosCan_Lait_au_cafe.ID, - "Lait au cafe", - "You want Coffee to your Sugar?", - new GT_FoodStat( - 3, - 0.4F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSpeed.id, - 400, - 2, - 90, - Potion.digSpeed.id, - 400, - 2, - 90), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 3L))); - ItemList.ThermosCan_Dark_Chocolate_Milk.set( - addItem( - ThermosCan_Dark_Chocolate_Milk.ID, - "Dark Chocolate Milk", - "A bit bitter, better add a bit Sugar", - new GT_FoodStat( - 3, - 0.4F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.regeneration.id, - 50, - 1, - 60), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - ItemList.ThermosCan_Chocolate_Milk.set( - addItem( - ThermosCan_Chocolate_Milk.ID, - "Chocolate Milk", - "Sweet Goodness", - new GT_FoodStat( - 3, - 0.4F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.regeneration.id, - 50, - 1, - 90), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 2L))); - ItemList.ThermosCan_Tea.set( - addItem( - ThermosCan_Tea.ID, - "Tea", - "Keep calm and carry on", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSlowdown.id, - 300, - 0, - 50), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - ItemList.ThermosCan_Sweet_Tea.set( - addItem( - ThermosCan_Sweet_Tea.ID, - "Sweet Tea", - "How about a Tea Party? In Boston?", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - ItemList.ThermosCan_Ice_Tea.set( - addItem( - ThermosCan_Ice_Tea.ID, - "Ice Tea", - "Better than this purple Junk Drink from failed Potions", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.ThermosCan_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSlowdown.id, - 300, - 0, - 50), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L))); - - ItemList.GelledToluene.set(addItem(GelledToluene.ID, "Gelled Toluene", "Raw Explosive")); - - ItemList.Bottle_Purple_Drink.set( - addItem( - Bottle_Purple_Drink.ID, - "Purple Drink", - "How about Lemonade. Or some Ice Tea? I got Purple Drink!", - new GT_FoodStat( - 8, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.moveSlowdown.id, - 400, - 1, - 90), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 1L))); - ItemList.Bottle_Grape_Juice.set( - addItem( - Bottle_Grape_Juice.ID, - "Grape Juice", - "This has a cleaning effect on your internals.", - new GT_FoodStat( - 4, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.hunger.id, - 400, - 1, - 60), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - ItemList.Bottle_Wine.set( - addItem( - Bottle_Wine.ID, - "Wine", - "Ordinary", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 400, - 1, - 60, - Potion.heal.id, - 0, - 0, - 60, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - ItemList.Bottle_Vinegar.set( - addItem( - Bottle_Vinegar.ID, - "Vinegar", - "Exquisite", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 400, - 1, - 90, - Potion.heal.id, - 0, - 1, - 90, - Potion.poison.id, - 200, - 2, - 10, - Potion.harm.id, - 0, - 2, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - ItemList.Bottle_Potato_Juice.set( - addItem( - Bottle_Potato_Juice.ID, - "Potato Juice", - "Ever seen Potato Juice in stores? No? That has a reason.", - new GT_FoodStat( - 3, - 0.3F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L))); - ItemList.Bottle_Vodka.set( - addItem( - Bottle_Vodka.ID, - "Vodka", - "Not to confuse with Water", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 500, - 0, - 60, - Potion.damageBoost.id, - 500, - 1, - 60, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L))); - ItemList.Bottle_Leninade.set( - addItem( - Bottle_Leninade.ID, - "Leninade", - "Let the Communism flow through you!", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 500, - 1, - 90, - Potion.damageBoost.id, - 500, - 2, - 90, - Potion.poison.id, - 200, - 2, - 10, - Potion.harm.id, - 0, - 2, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 2L))); - ItemList.Bottle_Mineral_Water.set( - addItem( - Bottle_Mineral_Water.ID, - "Mineral Water", - "The best Stuff you can drink to stay healthy", - new GT_FoodStat( - 1, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.regeneration.id, - 100, - 1, - 10), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - ItemList.Bottle_Salty_Water.set( - addItem( - Bottle_Salty_Water.ID, - "Salty Water", - "Like Sea Water but less dirty", - SubTag.INVISIBLE, - new GT_FoodStat( - 1, - 0.0F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.hunger.id, - 400, - 2, - 95), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TEMPESTAS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Bottle_Reed_Water.set( - addItem( - Bottle_Reed_Water.ID, - "Reed Water", - "I guess this tastes better when fermented", - new GT_FoodStat( - 1, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - ItemList.Bottle_Rum.set( - addItem( - Bottle_Rum.ID, - "Rum", - "A buddle o' rum", - new GT_FoodStat( - 4, - 0.4F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 300, - 0, - 60, - Potion.damageBoost.id, - 300, - 1, - 60, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - ItemList.Bottle_Pirate_Brew.set( - addItem( - Bottle_Pirate_Brew.ID, - "Pirate Brew", - "Set the Sails, we are going to Torrentuga!", - new GT_FoodStat( - 4, - 0.4F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 300, - 1, - 90, - Potion.damageBoost.id, - 300, - 2, - 90, - Potion.poison.id, - 200, - 2, - 10, - Potion.harm.id, - 0, - 2, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 2L))); - ItemList.Bottle_Hops_Juice.set( - addItem( - Bottle_Hops_Juice.ID, - "Hops Juice", - "Every Beer has a start", - new GT_FoodStat( - 1, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L))); - ItemList.Bottle_Dark_Beer.set( - addItem( - Bottle_Dark_Beer.ID, - "Dark Beer", - "Dark Beer, for the real Men", - new GT_FoodStat( - 4, - 0.4F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 300, - 1, - 60, - Potion.damageBoost.id, - 300, - 1, - 60, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L))); - ItemList.Bottle_Dragon_Blood.set( - addItem( - Bottle_Dragon_Blood.ID, - "Dragon Blood", - "FUS RO DAH!", - new GT_FoodStat( - 4, - 0.4F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 300, - 2, - 90, - Potion.damageBoost.id, - 300, - 2, - 90, - Potion.poison.id, - 200, - 2, - 10, - Potion.harm.id, - 0, - 2, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L))); - ItemList.Bottle_Wheaty_Juice.set( - addItem( - Bottle_Wheaty_Juice.ID, - "Wheaty Juice", - "Is this liquefied Bread or what?", - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L))); - ItemList.Bottle_Scotch.set( - addItem( - Bottle_Scotch.ID, - "Scotch", - "Technically this is just a Whisky", - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 400, - 0, - 60, - Potion.resistance.id, - 400, - 1, - 60, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L))); - ItemList.Bottle_Glen_McKenner.set( - addItem( - Bottle_Glen_McKenner.ID, - "Glen McKenner", - "Don't hand to easily surprised people, they will shatter it.", - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 400, - 1, - 90, - Potion.resistance.id, - 400, - 2, - 90, - Potion.poison.id, - 200, - 2, - 10, - Potion.harm.id, - 0, - 2, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 2L))); - ItemList.Bottle_Wheaty_Hops_Juice.set( - addItem( - Bottle_Wheaty_Hops_Juice.ID, - "Wheaty Hops Juice", - "Also known as 'Duff-Lite'", - new GT_FoodStat( - 1, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 2L))); - ItemList.Bottle_Beer.set( - addItem( - Bottle_Beer.ID, - "Beer", - "Good old Beer", - new GT_FoodStat( - 6, - 0.4F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 400, - 0, - 60, - Potion.digSpeed.id, - 400, - 2, - 60, - Potion.poison.id, - 100, - 0, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L))); - ItemList.Bottle_Chilly_Sauce.set( - addItem( - Bottle_Chilly_Sauce.ID, - "Chilly Sauce", - "Spicy", - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 1000, - 0, - 10, - Potion.fireResistance.id, - 1000, - 0, - 60), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Bottle_Hot_Sauce.set( - addItem( - Bottle_Hot_Sauce.ID, - "Hot Sauce", - "Very Spicy, I guess?", - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 2000, - 0, - 30, - Potion.fireResistance.id, - 2000, - 0, - 70), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L))); - ItemList.Bottle_Diabolo_Sauce.set( - addItem( - Bottle_Diabolo_Sauce.ID, - "Diabolo Sauce", - "As if the Devil made this Sauce", - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 3000, - 1, - 50, - Potion.fireResistance.id, - 3000, - 0, - 80), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L))); - ItemList.Bottle_Diablo_Sauce.set( - addItem( - Bottle_Diablo_Sauce.ID, - "Diablo Sauce", - "Diablo always comes back!", - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 4000, - 1, - 70, - Potion.fireResistance.id, - 4000, - 0, - 90), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 4L))); - ItemList.Bottle_Snitches_Glitch_Sauce.set( - addItem( - Bottle_Snitches_Glitch_Sauce.ID, - "Old Man Snitches glitched Diablo Sauce", - "[Missing No]", - SubTag.INVISIBLE, - new GT_FoodStat( - 2, - 0.1F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 9999, - 2, - 999, - Potion.fireResistance.id, - 9999, - 9, - 999), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 5L))); - ItemList.Bottle_Apple_Juice.set( - addItem( - Bottle_Apple_Juice.ID, - "Apple Juice", - "Made of the Apples from our best Oak Farms", - new GT_FoodStat( - 4, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.hunger.id, - 400, - 0, - 20), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - ItemList.Bottle_Cider.set( - addItem( - Bottle_Cider.ID, - "Cider", - "If you have nothing better to do with your Apples", - new GT_FoodStat( - 4, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 400, - 0, - 60, - Potion.resistance.id, - 400, - 1, - 60, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L))); - ItemList.Bottle_Golden_Apple_Juice.set( - addItem( - Bottle_Golden_Apple_Juice.ID, - "Golden Apple Juice", - "A golden Apple in liquid form", - new GT_FoodStat( - 4, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.hunger.id, - 400, - 0, - 20, - Potion.field_76444_x.id, - 2400, - 0, - 100, - Potion.regeneration.id, - 100, - 1, - 100), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - ItemList.Bottle_Golden_Cider.set( - addItem( - Bottle_Golden_Cider.ID, - "Golden Cider", - "More Resistance, less Regeneration", - new GT_FoodStat( - 4, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.confusion.id, - 400, - 0, - 60, - Potion.field_76444_x.id, - 2400, - 1, - 95, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L))); - ItemList.Bottle_Iduns_Apple_Juice.set( - addItem( - Bottle_Iduns_Apple_Juice.ID, - "Idun's Apple Juice", - "So you got the Idea of using Notch Apples for a drink?", - new GT_FoodStat( - 4, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.regeneration.id, - 600, - 4, - 100, - Potion.field_76444_x.id, - 2400, - 0, - 100, - Potion.resistance.id, - 6000, - 0, - 100, - Potion.fireResistance.id, - 6000, - 0, - 100), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 9L))); - ItemList.Bottle_Notches_Brew.set( - addItem( - Bottle_Notches_Brew.ID, - "Notches Brew", - "This is just overpowered", - new GT_FoodStat( - 4, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.regeneration.id, - 700, - 4, - 95, - Potion.field_76444_x.id, - 3000, - 1, - 95, - Potion.resistance.id, - 7000, - 1, - 95, - Potion.fireResistance.id, - 7000, - 0, - 95, - Potion.harm.id, - 0, - 2, - 20), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 9L))); - ItemList.Bottle_Lemon_Juice.set( - addItem( - Bottle_Lemon_Juice.ID, - "Lemon Juice", - "Maybe adding Sugar will make it less sour", - new GT_FoodStat( - 2, - 0.4F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.digSpeed.id, - 1200, - 0, - 60), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L))); - ItemList.Bottle_Limoncello.set( - addItem( - Bottle_Limoncello.ID, - "Limoncello", - "An alcoholic Drink which tastes like Lemons", - new GT_FoodStat( - 2, - 0.4F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.digSpeed.id, - 1200, - 0, - 90, - Potion.poison.id, - 200, - 1, - 5), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L))); - ItemList.Bottle_Lemonade.set( - addItem( - Bottle_Lemonade.ID, - "Lemonade", - "Cold and refreshing Lemonade", - new GT_FoodStat( - 4, - 0.3F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.digSpeed.id, - 900, - 1, - 90), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L))); - ItemList.Bottle_Alcopops.set( - addItem( - Bottle_Alcopops.ID, - "Alcopops", - "Don't let your Children drink this junk!", - new GT_FoodStat( - 2, - 0.2F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.digSpeed.id, - 900, - 1, - 90, - Potion.poison.id, - 300, - 2, - 20), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 1L))); - ItemList.Bottle_Cave_Johnsons_Grenade_Juice.set( - addItem( - Bottle_Cave_Johnsons_Grenade_Juice.ID, - "Cave Johnson's Grenade Juice", - "When life gives you Lemons, make Life take them Lemons back!", - new GT_FoodStat( - 0, - 0.0F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false).setExplosive(), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MORTUUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 1L))); - ItemList.Bottle_Milk.set( - addItem( - Bottle_Milk.ID, - "Milk", - "Got Milk?", - OrePrefixes.bottle.get(Materials.Milk), - new GT_FoodStat( - 0, - 0.0F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false).setMilk(), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - ItemList.Bottle_Holy_Water.set( - addItem( - Bottle_Holy_Water.ID, - "Holy Water", - "May the holy Planks be with you", - OrePrefixes.bottle.get(Materials.HolyWater), - new GT_FoodStat( - 0, - 0.0F, - EnumAction.drink, - ItemList.Bottle_Empty.get(1L), - GregTech_API.sDrinksAlwaysDrinkable, - false, - false, - Potion.poison.id, - 100, - 1, - 100).setMilk(), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 1L))); - - ItemList.Food_Potato_On_Stick.set( - addItem( - Food_Potato_On_Stick.ID, - "Potato on a Stick", - "Totally looks like a Crab Claw", - new GT_FoodStat(1, 0.3F, EnumAction.eat, new ItemStack(Items.stick, 1), false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Food_Potato_On_Stick_Roasted.set( - addItem( - Food_Potato_On_Stick_Roasted.ID, - "Roasted Potato on a Stick", - "Still looks like a Crab Claw", - new GT_FoodStat(6, 0.6F, EnumAction.eat, new ItemStack(Items.stick, 1), false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Raw_Fries.set( - addItem( - Food_Raw_Fries.ID, - "Potato Strips", - "It's Potato in Stripe Form", - new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - ItemList.Food_Fries.set( - addItem( - Food_Fries.ID, - "Fries", - "Not to confuse with Fry the Delivery Boy", - new GT_FoodStat(7, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Packaged_Fries.set( - addItem( - Food_Packaged_Fries.ID, - "Fries", - "Ketchup not included", - new GT_FoodStat( - 7, - 0.5F, - EnumAction.eat, - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 1L), - false, - true, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Raw_PotatoChips.set( - addItem( - Food_Raw_PotatoChips.ID, - "Potato Chips (Raw)", - "Just like a Potato", - new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - ItemList.Food_PotatoChips.set( - addItem( - Food_PotatoChips.ID, - "Potato Chips", - "Crunchy", - new GT_FoodStat(7, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_ChiliChips.set( - addItem( - Food_ChiliChips.ID, - "Chili Chips", - "Spicy", - new GT_FoodStat(7, 0.6F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Packaged_PotatoChips.set( - addItem( - Food_Packaged_PotatoChips.ID, - "Bag of Potato Chips", - "Full of delicious Air", - new GT_FoodStat( - 7, - 0.5F, - EnumAction.eat, - GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1L), - false, - true, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Packaged_ChiliChips.set( - addItem( - Food_Packaged_ChiliChips.ID, - "Bag of Chili Chips", - "Stop making noises Baj!", - new GT_FoodStat( - 7, - 0.6F, - EnumAction.eat, - GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1L), - false, - true, - false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Chum.set( - addItem( - Food_Chum.ID, - "Chum", - "Chum is Fum!", - new GT_FoodStat( - 5, - 0.2F, - EnumAction.eat, - null, - true, - false, - true, - Potion.hunger.id, - 1000, - 4, - 100, - Potion.confusion.id, - 300, - 1, - 80), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Chum_On_Stick.set( - addItem( - Food_Chum_On_Stick.ID, - "Chum on a Stick", - "Don't forget to try our Chum-balaya", - new GT_FoodStat( - 5, - 0.2F, - EnumAction.eat, - new ItemStack(Items.stick, 1), - true, - false, - true, - Potion.hunger.id, - 1000, - 4, - 100, - Potion.confusion.id, - 300, - 1, - 80), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Dough_Sugar.set( - addItem( - Food_Dough_Sugar.ID, - "Sugary Dough", - "Don't eat the Dough before it is baken", - new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Dough_Chocolate.set( - addItem( - Food_Dough_Chocolate.ID, - "Chocolate Dough", - "I said don't eat the Dough!", - new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Raw_Cookie.set( - addItem( - Food_Raw_Cookie.ID, - "Cookie shaped Dough", - "For baking Cookies", - new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - - ItemList.Food_Sliced_Buns.set( - addItem( - Food_Sliced_Buns.ID, - "Buns", - "Pre Sliced", - new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Burger_Veggie.set( - addItem( - Food_Burger_Veggie.ID, - "Veggieburger", - "No matter how you call this, this is NOT a Burger!", - new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Burger_Cheese.set( - addItem( - Food_Burger_Cheese.ID, - "Cheeseburger", - "Cheesy!", - new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new ItemData(Materials.Cheese, 907200L))); - ItemList.Food_Burger_Meat.set( - addItem( - Food_Burger_Meat.ID, - "Hamburger", - "The Mc Burger Queen Burger", - new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Burger_Chum.set( - addItem( - Food_Burger_Chum.ID, - "Chumburger", - "Fum is Chum!", - new GT_FoodStat( - 5, - 0.2F, - EnumAction.eat, - null, - true, - false, - true, - Potion.hunger.id, - 1000, - 4, - 100, - Potion.confusion.id, - 300, - 1, - 80), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - - ItemList.Food_Sliced_Breads.set( - addItem( - Food_Sliced_Breads.ID, - "Breads", - "Pre Sliced", - new GT_FoodStat(5, 0.6F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sandwich_Veggie.set( - addItem( - Food_Sandwich_Veggie.ID, - "Veggie Sandwich", - "Meatless", - new GT_FoodStat(7, 0.6F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sandwich_Cheese.set( - addItem( - Food_Sandwich_Cheese.ID, - "Cheese Sandwich", - "Say Cheese!", - new GT_FoodStat(7, 0.6F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sandwich_Bacon.set( - addItem( - Food_Sandwich_Bacon.ID, - "Bacon Sandwich", - "The best Sandwich ever!", - new GT_FoodStat(10, 0.8F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sandwich_Steak.set( - addItem( - Food_Sandwich_Steak.ID, - "Steak Sandwich", - "Not a 'Steam Sandwich'", - new GT_FoodStat(10, 0.8F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sliced_Baguettes.set( - addItem( - Food_Sliced_Baguettes.ID, - "Baguettes", - "Pre Sliced", - new GT_FoodStat(8, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Large_Sandwich_Veggie.set( - addItem( - Food_Large_Sandwich_Veggie.ID, - "Large Veggie Sandwich", - "Just not worth it", - new GT_FoodStat(15, 0.8F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Large_Sandwich_Cheese.set( - addItem( - Food_Large_Sandwich_Cheese.ID, - "Large Cheese Sandwich", - "I need another cheesy tooltip for this", - new GT_FoodStat(15, 0.8F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Large_Sandwich_Bacon.set( - addItem( - Food_Large_Sandwich_Bacon.ID, - "Large Bacon Sandwich", - "For Men! (and manly Women)", - new GT_FoodStat(20, 1.0F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Large_Sandwich_Steak.set( - addItem( - Food_Large_Sandwich_Steak.ID, - "Large Steak Sandwich", - "Yes, I once accidentially called it 'Steam Sandwich'", - new GT_FoodStat(20, 1.0F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Raw_Pizza_Veggie.set( - addItem( - Food_Raw_Pizza_Veggie.ID, - "Raw Veggie Pizza", - "Into the Oven with it!", - new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Raw_Pizza_Cheese.set( - addItem( - Food_Raw_Pizza_Cheese.ID, - "Raw Cheese Pizza", - "Into the Oven with it!", - new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Raw_Pizza_Meat.set( - addItem( - Food_Raw_Pizza_Meat.ID, - "Raw Mince Meat Pizza", - "Into the Oven with it!", - new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - - ItemList.Food_Baked_Pizza_Veggie.set( - addItem( - Food_Baked_Pizza_Veggie.ID, - "Veggie Pizza", - "The next they want is Gluten Free Pizzas...", - new GT_FoodStat(3, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Baked_Pizza_Cheese.set( - addItem( - Food_Baked_Pizza_Cheese.ID, - "Cheese Pizza", - "Pizza Magarita", - new GT_FoodStat(4, 0.4F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Baked_Pizza_Meat.set( - addItem( - Food_Baked_Pizza_Meat.ID, - "Mince Meat Pizza", - "Emo Pizza, it cuts itself!", - new GT_FoodStat(5, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - - ItemList.Dye_Indigo.set( - addItem( - Dye_Indigo.ID, - "Indigo Dye", - "Blue Dye", - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L), - Dyes.dyeBlue)); - - int[] Dye_Colors = new int[] { Dye_Color_00.ID, Dye_Color_01.ID, Dye_Color_02.ID, Dye_Color_03.ID, - Dye_Color_04.ID, Dye_Color_05.ID, Dye_Color_06.ID, Dye_Color_07.ID, Dye_Color_08.ID, Dye_Color_09.ID, - Dye_Color_10.ID, Dye_Color_11.ID, Dye_Color_12.ID, Dye_Color_13.ID, Dye_Color_14.ID, Dye_Color_15.ID }; - for (int i = 0; i < 16; i = i + 1) { - ItemList.DYE_ONLY_ITEMS[i].set( - addItem( - Dye_Colors[i], - Dyes.get(i).mName + " Dye", - "", - Dyes.get(i) - .name(), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L))); - } - - ItemList.Plank_Oak - .set(addItem(Plank_Oak.ID, "Oak Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Spruce.set( - addItem(Plank_Spruce.ID, "Spruce Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Birch.set( - addItem(Plank_Birch.ID, "Birch Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Jungle.set( - addItem(Plank_Jungle.ID, "Jungle Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Acacia.set( - addItem(Plank_Acacia.ID, "Acacia Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_DarkOak.set( - addItem( - Plank_DarkOak.ID, - "Dark Oak Plank", - aTextCover, - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Larch.set( - addItem(Plank_Larch.ID, "Larch Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Teak - .set(addItem(Plank_Teak.ID, "Teak Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Acacia_Green.set( - addItem( - Plank_Acacia_Green.ID, - "Green Acacia Plank", - aTextCover, - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Lime - .set(addItem(Plank_Lime.ID, "Lime Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Chestnut.set( - addItem( - Plank_Chestnut.ID, - "Chestnut Plank", - aTextCover, - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Wenge.set( - addItem(Plank_Wenge.ID, "Wenge Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Baobab.set( - addItem(Plank_Baobab.ID, "Baobab Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Sequoia.set( - addItem( - Plank_Sequoia.ID, - "Sequoia Plank", - aTextCover, - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Kapok.set( - addItem(Plank_Kapok.ID, "Kapok Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Ebony.set( - addItem(Plank_Ebony.ID, "Ebony Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Mahagony.set( - addItem( - Plank_Mahagony.ID, - "Mahagony Plank", - aTextCover, - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Balsa.set( - addItem(Plank_Balsa.ID, "Balsa Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Willow.set( - addItem(Plank_Willow.ID, "Willow Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Walnut.set( - addItem(Plank_Walnut.ID, "Walnut Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Greenheart.set( - addItem( - Plank_Greenheart.ID, - "Greenheart Plank", - aTextCover, - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Cherry.set( - addItem(Plank_Cherry.ID, "Cherry Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Mahoe.set( - addItem(Plank_Mahoe.ID, "Mahoe Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Poplar.set( - addItem(Plank_Poplar.ID, "Poplar Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Palm - .set(addItem(Plank_Palm.ID, "Palm Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Papaya.set( - addItem(Plank_Papaya.ID, "Papaya Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Pine - .set(addItem(Plank_Pine.ID, "Pine Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Plum - .set(addItem(Plank_Plum.ID, "Plum Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Maple.set( - addItem(Plank_Maple.ID, "Maple Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.Plank_Citrus.set( - addItem(Plank_Citrus.ID, "Citrus Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - ItemList.SFMixture.set(addItem(SFMixture.ID, "Super Fuel Binder", "Raw Material")); - ItemList.MSFMixture.set(addItem(MSFMixture.ID, "Magic Super Fuel Binder", "Raw Material")); - - ItemList.Crop_Drop_Plumbilia.set( - addItem( - Crop_Drop_Plumbilia.ID, - "Plumbilia Leaf", - "Source of Lead", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L))); - ItemList.Crop_Drop_Argentia.set( - addItem( - Crop_Drop_Argentia.ID, - "Argentia Leaf", - "Source of Silver", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - ItemList.Crop_Drop_Indigo.set( - addItem( - Crop_Drop_Indigo.ID, - "Indigo Blossom", - "Used for making Blue Dye", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L))); - ItemList.Crop_Drop_Ferru.set( - addItem( - Crop_Drop_Ferru.ID, - "Ferru Leaf", - "Source of Iron", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L))); - ItemList.Crop_Drop_Aurelia.set( - addItem( - Crop_Drop_Aurelia.ID, - "Aurelia Leaf", - "Source of Gold", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - ItemList.Crop_Drop_TeaLeaf.set( - addItem( - Crop_Drop_TeaLeaf.ID, - "Tea Leaf", - "Source of Tea", - "cropTea", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - - ItemList.Crop_Drop_OilBerry.set( - addItem( - Crop_Drop_OilBerry.ID, - "Oil Berry", - "Oil in Berry form", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L))); - ItemList.Crop_Drop_BobsYerUncleRanks.set( - addItem( - Crop_Drop_BobsYerUncleRanks.ID, - "Bobs-Yer-Uncle-Berry", - "Source of Emeralds", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - ItemList.Crop_Drop_UUMBerry.set( - addItem( - Crop_Drop_UUMBerry.ID, - "UUM Berry", - "UUM in Berry form", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L))); - ItemList.Crop_Drop_UUABerry.set( - addItem( - Crop_Drop_UUABerry.ID, - "UUA Berry", - "UUA in Berry form", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L))); - - ItemList.Crop_Drop_MilkWart.set( - addItem( - Crop_Drop_MilkWart.ID, - "Milk Wart", - "Source of Milk", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))); - - ItemList.Crop_Drop_Coppon.set( - addItem( - Crop_Drop_Coppon.ID, - "Coppon Fiber", - "ORANGE WOOOOOOOL!!!", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L))); - - ItemList.Crop_Drop_Tine.set( - addItem( - Crop_Drop_Tine.ID, - "Tine Twig", - "Source of Tin", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - - ItemList.Crop_Drop_Mica.set( - addItem( - Crop_Drop_Mica.ID, - "Micadia Twig", - "Source of Mica", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L))); - - ItemList.Crop_Drop_Bauxite.set(addItem(Crop_Drop_Bauxite.ID, "Bauxia Leaf", "Source of Aluminium")); - ItemList.Crop_Drop_Ilmenite.set(addItem(Crop_Drop_Ilmenite.ID, "Titania Leaf", "Source of Titanium")); - ItemList.Crop_Drop_Pitchblende.set(addItem(Crop_Drop_Pitchblende.ID, "Reactoria Leaf", "Source of Uranium")); - ItemList.Crop_Drop_Uraninite.set(addItem(Crop_Drop_Uraninite.ID, "Uranium Leaf", "Source of Uranite")); - ItemList.Crop_Drop_Thorium.set(addItem(Crop_Drop_Thorium.ID, "Thunder Leaf", "Source of Thorium")); - ItemList.Crop_Drop_Nickel.set(addItem(Crop_Drop_Nickel.ID, "Nickelback Leaf", "Source of Nickel")); - ItemList.Crop_Drop_Zinc.set(addItem(Crop_Drop_Zinc.ID, "Galvania Leaf", "Source of Zinc")); - ItemList.Crop_Drop_Manganese.set(addItem(Crop_Drop_Manganese.ID, "Pyrolusium Leaf", "Source of Manganese")); - ItemList.Crop_Drop_Scheelite.set(addItem(Crop_Drop_Scheelite.ID, "Scheelinium Leaf", "Source of Tungsten")); - ItemList.Crop_Drop_Platinum.set(addItem(Crop_Drop_Platinum.ID, "Platina Leaf", "Source of Platinum")); - ItemList.Crop_Drop_Iridium.set(addItem(Crop_Drop_Iridium.ID, "Quantaria Leaf", "Source of Iridium")); - ItemList.Crop_Drop_Osmium.set(addItem(Crop_Drop_Osmium.ID, "Quantaria Leaf", "Source of Osmium")); - ItemList.Crop_Drop_Naquadah.set(addItem(Crop_Drop_Naquadah.ID, "Stargatium Leaf", "Source of Naquadah")); - - ItemList.Crop_Drop_Chilly.set( - addItem( - Crop_Drop_Chilly.ID, - "Chilly Pepper", - "It is red and hot", - "cropChilipepper", - new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false, Potion.confusion.id, 200, 1, 40), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Crop_Drop_Lemon.set( - addItem( - Crop_Drop_Lemon.ID, - "Lemon", - "Don't make Lemonade", - "cropLemon", - new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Crop_Drop_Tomato.set( - addItem( - Crop_Drop_Tomato.ID, - "Tomato", - "Solid Ketchup", - "cropTomato", - new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Crop_Drop_MTomato.set( - addItem( - Crop_Drop_MTomato.ID, - "Max Tomato", - "Full Health in one Tomato", - "cropTomato", - new GT_FoodStat( - 9, - 1.0F, - EnumAction.eat, - null, - false, - true, - false, - Potion.regeneration.id, - 100, - 100, - 100), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Crop_Drop_Grapes.set( - addItem( - Crop_Drop_Grapes.ID, - "Grapes", - "Source of Wine", - "cropGrape", - new GT_FoodStat(2, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Crop_Drop_Onion.set( - addItem( - Crop_Drop_Onion.ID, - "Onion", - "Taking over the whole Taste", - "cropOnion", - new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Crop_Drop_Cucumber.set( - addItem( - Crop_Drop_Cucumber.ID, - "Cucumber", - "Not a Sea Cucumber!", - "cropCucumber", - new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Crop_Drop_Rape.set( - addItem( - Crop_Drop_Rape.ID, - "Rape", - "Also known as Canola.", - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L))); - - ItemList.Food_Cheese.set( - addItem( - Food_Cheese.ID, - "Cheese", - "Click the Cheese", - "foodCheese", - new GT_FoodStat(3, 0.6F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L))); - ItemList.Food_Dough.set( - addItem( - Food_Dough.ID, - "Dough", - "For making Breads", - "foodDough", - new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Flat_Dough.set( - addItem( - Food_Flat_Dough.ID, - "Flattened Dough", - "For making Pizza", - new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Raw_Bread.set( - addItem( - Food_Raw_Bread.ID, - "Dough", - "In Bread Shape", - new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Raw_Bun.set( - addItem( - Food_Raw_Bun.ID, - "Dough", - "In Bun Shape", - new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Raw_Baguette.set( - addItem( - Food_Raw_Baguette.ID, - "Dough", - "In Baguette Shape", - new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Baked_Bun.set( - addItem( - Food_Baked_Bun.ID, - "Bun", - "Do not teleport Bread!", - new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Baked_Baguette.set( - addItem( - Food_Baked_Baguette.ID, - "Baguette", - "I teleported nothing BUT Bread!!!", - new GT_FoodStat(8, 0.5F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sliced_Bread.set( - addItem( - Food_Sliced_Bread.ID, - "Sliced Bread", - "Just half a Bread", - new GT_FoodStat(2, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sliced_Bun.set( - addItem( - Food_Sliced_Bun.ID, - "Sliced Bun", - "Just half a Bun", - new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Sliced_Baguette.set( - addItem( - Food_Sliced_Baguette.ID, - "Sliced Baguette", - "Just half a Baguette", - new GT_FoodStat(4, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))); - ItemList.Food_Raw_Cake.set( - addItem( - Food_Raw_Cake.ID, - "Cake Bottom", - "For making Cake", - new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Baked_Cake.set( - addItem( - Food_Baked_Cake.ID, - "Baked Cake Bottom", - "I know I promised you an actual Cake, but well...", - new GT_FoodStat(3, 0.3F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - ItemList.Food_Sliced_Lemon.set( - addItem( - Food_Sliced_Lemon.ID, - "Lemon Slice", - "Ideal to put on your Drink", - new GT_FoodStat(1, 0.075F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - ItemList.Food_Sliced_Tomato.set( - addItem( - Food_Sliced_Tomato.ID, - "Tomato Slice", - "Solid Ketchup", - new GT_FoodStat(1, 0.05F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - ItemList.Food_Sliced_Onion.set( - addItem( - Food_Sliced_Onion.ID, - "Onion Slice", - "ONIONS, UNITE!", - new GT_FoodStat(1, 0.05F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - ItemList.Food_Sliced_Cucumber.set( - addItem( - Food_Sliced_Cucumber.ID, - "Cucumber Slice", - "QUEWWW-CUMMM-BERRR!!!", - new GT_FoodStat(1, 0.05F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L))); - - ItemList.Food_Sliced_Cheese.set( - addItem( - Food_Sliced_Cheese.ID, - "Cheese Slice", - "ALIEN ATTACK!!!, throw the CHEEEEESE!!!", - new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), - new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L))); - - ItemList.Cover_AdvancedRedstoneTransmitterExternal.set( - addItem( - Cover_AdvancedRedstoneTransmitterExternal.ID, - "Advanced Redstone Transmitter (External)", - "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L))); - ItemList.Cover_AdvancedRedstoneTransmitterInternal.set( - addItem( - Cover_AdvancedRedstoneTransmitterInternal.ID, - "Advanced Redstone Transmitter (Internal)", - "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L))); - ItemList.Cover_AdvancedRedstoneReceiverExternal.set( - addItem( - Cover_AdvancedRedstoneReceiverExternal.ID, - "Advanced Redstone Receiver (External)", - "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L))); - ItemList.Cover_AdvancedRedstoneReceiverInternal.set( - addItem( - Cover_AdvancedRedstoneReceiverInternal.ID, - "Advanced Redstone Receiver (Internal)", - "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L))); - - ItemList.Cover_WirelessFluidDetector.set( - addItem( - Cover_WirelessFluidDetector.ID, - "Wireless Fluid Detector Cover", - "Transfers Fluid Amount as Redstone wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))); - ItemList.Cover_WirelessItemDetector.set( - addItem( - Cover_WirelessItemDetector.ID, - "Wireless Item Detector Cover", - "Transfers Item Amount as Redstone wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L))); - - ItemList.Cover_WirelessNeedsMaintainance.set( - addItem( - Cover_WirelessNeedsMaintainance.ID, - "Wireless Needs Maintenance Cover", - "Transfers Maintenance Issues as Redstone wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 3L))); - - ItemList.Cover_WirelessActivityDetector.set( - addItem( - Cover_WirelessActivityDetector.ID, - "Wireless Activity Detector Cover", - "Transfers Activity as Redstone wirelessly/n Can only connect with advanced wireless covers", - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L))); - - ItemList.Display_ITS_FREE.set( - addItem( - Display_ITS_FREE.ID, - "ITS FREE", - "(or at least almost free)", - SubTag.INVISIBLE, - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))); - - try { - CropCard tCrop; - GT_Utility.getField(tCrop = Crops.instance.getCropList()[13], "mDrop") - .set(tCrop, ItemList.Crop_Drop_Ferru.get(1L)); - GT_Utility.getField(tCrop = Crops.instance.getCropList()[14], "mDrop") - .set(tCrop, ItemList.Crop_Drop_Aurelia.get(1L)); - } catch (Throwable e) { - if (GT_Values.D1) { - e.printStackTrace(GT_Log.err); - } - } - - setAllFluidContainerStats(); - setBurnValues(); - registerCovers(); - initCraftingShapedRecipes(); - initCraftingShapelessRecipes(); - initAssemblerRecipes(); - initExtractorRecipes(); - initMaceratorRecipes(); - initCompressorRecipes(); - } - - @Override - public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { - super.onLeftClickEntity(aStack, aPlayer, aEntity); - return false; - } - - @Override - public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) { - int aDamage = aStack.getItemDamage(); - return ((aDamage >= 25000) && (aDamage < 27000)) || (super.hasProjectile(aProjectileType, aStack)); - } - - @Override - public boolean isItemStackUsable(ItemStack aStack) { - int aDamage = aStack.getItemDamage(); - Materials aMaterial = GregTech_API.sGeneratedMaterials[(aDamage % 1000)]; - if ((aDamage >= 25000) && (aDamage < 27000) && (aMaterial != null) && (aMaterial.mEnchantmentTools != null)) { - Enchantment tEnchant = aMaterial.mEnchantmentTools == Enchantment.fortune ? Enchantment.looting - : aMaterial.mEnchantmentTools; - if (tEnchant.type == EnumEnchantmentType.weapon) { - NBTTagCompound tNBT = GT_Utility.ItemNBT.getNBT(aStack); - if (!tNBT.getBoolean("GT.HasBeenUpdated")) { - tNBT.setBoolean("GT.HasBeenUpdated", true); - GT_Utility.ItemNBT.setNBT(aStack, tNBT); - GT_Utility.ItemNBT.addEnchantment(aStack, tEnchant, aMaterial.mEnchantmentToolsLevel); - } - } - } - return super.isItemStackUsable(aStack); - } - - private void setAllFluidContainerStats() { - setFluidContainerStats(32000 + Food_Raw_Fries.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_Fries.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_Raw_PotatoChips.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_PotatoChips.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_ChiliChips.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_Sandwich_Veggie.ID, 0L, 32L); - setFluidContainerStats(32000 + Food_Sandwich_Cheese.ID, 0L, 32L); - setFluidContainerStats(32000 + Food_Sandwich_Bacon.ID, 0L, 32L); - setFluidContainerStats(32000 + Food_Sandwich_Steak.ID, 0L, 32L); - setFluidContainerStats(32000 + Food_Large_Sandwich_Veggie.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_Large_Sandwich_Cheese.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_Large_Sandwich_Bacon.ID, 0L, 16L); - setFluidContainerStats(32000 + Food_Large_Sandwich_Steak.ID, 0L, 16L); - } - - private void setBurnValues() { - setBurnValue(32000 + Plank_Oak.ID, 75); - setBurnValue(32000 + Plank_Spruce.ID, 75); - setBurnValue(32000 + Plank_Birch.ID, 75); - setBurnValue(32000 + Plank_Jungle.ID, 75); - setBurnValue(32000 + Plank_Acacia.ID, 75); - setBurnValue(32000 + Plank_DarkOak.ID, 75); - setBurnValue(32000 + Plank_Larch.ID, 75); - setBurnValue(32000 + Plank_Teak.ID, 75); - setBurnValue(32000 + Plank_Acacia_Green.ID, 75); - setBurnValue(32000 + Plank_Lime.ID, 75); - setBurnValue(32000 + Plank_Chestnut.ID, 75); - setBurnValue(32000 + Plank_Wenge.ID, 75); - setBurnValue(32000 + Plank_Baobab.ID, 75); - setBurnValue(32000 + Plank_Sequoia.ID, 75); - setBurnValue(32000 + Plank_Kapok.ID, 75); - setBurnValue(32000 + Plank_Ebony.ID, 75); - setBurnValue(32000 + Plank_Mahagony.ID, 75); - setBurnValue(32000 + Plank_Balsa.ID, 75); - setBurnValue(32000 + Plank_Willow.ID, 75); - setBurnValue(32000 + Plank_Walnut.ID, 75); - setBurnValue(32000 + Plank_Greenheart.ID, 75); - setBurnValue(32000 + Plank_Cherry.ID, 75); - setBurnValue(32000 + Plank_Mahoe.ID, 75); - setBurnValue(32000 + Plank_Poplar.ID, 75); - setBurnValue(32000 + Plank_Palm.ID, 75); - setBurnValue(32000 + Plank_Papaya.ID, 75); - setBurnValue(32000 + Plank_Pine.ID, 75); - setBurnValue(32000 + Plank_Plum.ID, 75); - setBurnValue(32000 + Plank_Maple.ID, 75); - setBurnValue(32000 + Plank_Citrus.ID, 75); - setBurnValue(32000 + Crop_Drop_Tine.ID, 100); - setBurnValue(32000 + Crop_Drop_Mica.ID, 240); - } - - public void initCraftingShapedRecipes() { - GT_ModHandler.addCraftingRecipe( - ItemList.Plank_Oak.get(2L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 0) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Plank_Spruce.get(2L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Plank_Birch.get(2L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 2) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Plank_Jungle.get(2L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 3) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Plank_Acacia.get(2L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 4) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Plank_DarkOak.get(2L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, - new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 5) }); - } - - public void initAssemblerRecipes() { - RA.stdBuilder() - .itemInputs( - ItemList.Cover_RedstoneTransmitterExternal.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), - GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L)) - .duration(2 * MINUTES + 40 * SECONDS) - .eut(TierEU.RECIPE_MV) - .addTo(assemblerRecipes); - RA.stdBuilder() - .itemInputs( - ItemList.Cover_RedstoneReceiverExternal.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), - GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L)) - .duration(2 * MINUTES + 40 * SECONDS) - .eut(TierEU.RECIPE_MV) - .addTo(assemblerRecipes); - RA.stdBuilder() - .itemInputs( - ItemList.Cover_FluidDetector.get(1L), - ItemList.Emitter_EV.get(1L), - GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(ItemList.Cover_WirelessFluidDetector.get(1L)) - .duration(2 * MINUTES + 40 * SECONDS) - .eut(TierEU.RECIPE_MV) - .addTo(assemblerRecipes); - RA.stdBuilder() - .itemInputs( - ItemList.Cover_ItemDetector.get(1L), - ItemList.Emitter_EV.get(1L), - GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(ItemList.Cover_WirelessItemDetector.get(1L)) - .duration(2 * MINUTES + 40 * SECONDS) - .eut(TierEU.RECIPE_MV) - .addTo(assemblerRecipes); - RA.stdBuilder() - .itemInputs( - ItemList.Cover_NeedsMaintainance.get(1L), - ItemList.Emitter_EV.get(1L), - GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(ItemList.Cover_WirelessNeedsMaintainance.get(1L)) - .duration(2 * MINUTES + 40 * SECONDS) - .eut(TierEU.RECIPE_MV) - .addTo(assemblerRecipes); - RA.stdBuilder() - .itemInputs( - ItemList.Cover_ActivityDetector.get(1L), - ItemList.Emitter_EV.get(1L), - GT_Utility.getIntegratedCircuit(1)) - .itemOutputs(ItemList.Cover_WirelessActivityDetector.get(1L)) - .duration(2 * MINUTES + 40 * SECONDS) - .eut(TierEU.RECIPE_MV) - .addTo(assemblerRecipes); - } - - public void initCraftingShapelessRecipes() { - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L), - new Object[] { ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L), - new Object[] { ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L), - new Object[] { ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L), - new Object[] { ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L) }); - } - - public void initExtractorRecipes() { - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 0)) - .itemOutputs(new ItemStack(Items.dye, 2, 1)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 1)) - .itemOutputs(new ItemStack(Items.dye, 2, 12)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 2)) - .itemOutputs(new ItemStack(Items.dye, 2, 13)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 3)) - .itemOutputs(new ItemStack(Items.dye, 2, 7)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 4)) - .itemOutputs(new ItemStack(Items.dye, 2, 1)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 5)) - .itemOutputs(new ItemStack(Items.dye, 2, 14)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 6)) - .itemOutputs(new ItemStack(Items.dye, 2, 7)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 7)) - .itemOutputs(new ItemStack(Items.dye, 2, 9)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 1, 8)) - .itemOutputs(new ItemStack(Items.dye, 2, 7)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.yellow_flower, 1, 0)) - .itemOutputs(new ItemStack(Items.dye, 2, 11)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.double_plant, 1, 0)) - .itemOutputs(new ItemStack(Items.dye, 3, 11)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.double_plant, 1, 1)) - .itemOutputs(new ItemStack(Items.dye, 3, 13)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.double_plant, 1, 4)) - .itemOutputs(new ItemStack(Items.dye, 3, 1)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.double_plant, 1, 5)) - .itemOutputs(new ItemStack(Items.dye, 3, 9)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Plumbilia.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lead, 1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Argentia.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Silver, 1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Indigo.get(1L)) - .itemOutputs(ItemList.Dye_Indigo.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_MilkWart.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Coppon.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Copper, 1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Tine.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tin, 1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(extractorRecipes); - - } - - public void initCompressorRecipes() { - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Coppon.get(4L)) - .itemOutputs(new ItemStack(Blocks.wool, 1, 1)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Plumbilia.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Argentia.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Indigo.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Ferru.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Aurelia.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_OilBerry.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_BobsYerUncleRanks.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Tine.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Rape.get(4L)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.red_flower, 8, 32767)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.yellow_flower, 8, 32767)) - .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) - .duration(15 * SECONDS) - .eut(2) - .addTo(compressorRecipes); - } - - public void initMaceratorRecipes() { - RA.stdBuilder() - .itemInputs(ItemList.Food_Sliced_Cheese.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Cheese, 1L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Dye_Cocoa.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Crop_Drop_Tine.get(1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.pumpkin, 1, 0)) - .itemOutputs(new ItemStack(Items.pumpkin_seeds, 4, 0)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(new ItemStack(Items.melon, 1, 0)) - .itemOutputs(new ItemStack(Items.melon_seeds, 1, 0)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("crop", 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(new ItemStack(Items.stick, 1)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.wool, 1, WILDCARD)) - .itemOutputs(new ItemStack(Items.string, 2), new ItemStack(Items.string, 1)) - .outputChances(10000, 5000) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - RA.stdBuilder() - .itemInputs(ItemList.Tesseract.get(1)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsUEVplus.TranscendentMetal, 8L)) - .duration(5 * SECONDS) - .eut(TierEU.RECIPE_UIV) - .addTo(maceratorRecipes); - } - - public void registerCovers() { - GregTech_API.registerCover(ItemList.Plank_Oak.get(1L), TextureFactory.of(Blocks.planks, 0), null); - GregTech_API.registerCover(ItemList.Plank_Spruce.get(1L), TextureFactory.of(Blocks.planks, 1), null); - GregTech_API.registerCover(ItemList.Plank_Birch.get(1L), TextureFactory.of(Blocks.planks, 2), null); - GregTech_API.registerCover(ItemList.Plank_Jungle.get(1L), TextureFactory.of(Blocks.planks, 3), null); - GregTech_API.registerCover(ItemList.Plank_Acacia.get(1L), TextureFactory.of(Blocks.planks, 4), null); - GregTech_API.registerCover(ItemList.Plank_DarkOak.get(1L), TextureFactory.of(Blocks.planks, 5), null); - GregTech_API.registerCover( - ItemList.Plank_Larch.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 0, new ItemStack(Blocks.planks, 1, 0))), - 0), - null); - GregTech_API.registerCover( - ItemList.Plank_Teak.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 1, new ItemStack(Blocks.planks, 1, 0))), - 1), - null); - GregTech_API.registerCover( - ItemList.Plank_Acacia_Green.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 2, new ItemStack(Blocks.planks, 1, 0))), - 2), - null); - GregTech_API.registerCover( - ItemList.Plank_Lime.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 3, new ItemStack(Blocks.planks, 1, 0))), - 3), - null); - GregTech_API.registerCover( - ItemList.Plank_Chestnut.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 4, new ItemStack(Blocks.planks, 1, 0))), - 4), - null); - GregTech_API.registerCover( - ItemList.Plank_Wenge.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 5, new ItemStack(Blocks.planks, 1, 0))), - 5), - null); - GregTech_API.registerCover( - ItemList.Plank_Baobab.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 6, new ItemStack(Blocks.planks, 1, 0))), - 6), - null); - GregTech_API.registerCover( - ItemList.Plank_Sequoia.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 7, new ItemStack(Blocks.planks, 1, 0))), - 7), - null); - GregTech_API.registerCover( - ItemList.Plank_Kapok.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 8, new ItemStack(Blocks.planks, 1, 0))), - 8), - null); - GregTech_API.registerCover( - ItemList.Plank_Ebony.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 9, new ItemStack(Blocks.planks, 1, 0))), - 9), - null); - GregTech_API.registerCover( - ItemList.Plank_Mahagony.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 10, new ItemStack(Blocks.planks, 1, 0))), - 10), - null); - GregTech_API.registerCover( - ItemList.Plank_Balsa.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 11, new ItemStack(Blocks.planks, 1, 0))), - 11), - null); - GregTech_API.registerCover( - ItemList.Plank_Willow.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 12, new ItemStack(Blocks.planks, 1, 0))), - 12), - null); - GregTech_API.registerCover( - ItemList.Plank_Walnut.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 13, new ItemStack(Blocks.planks, 1, 0))), - 13), - null); - GregTech_API.registerCover( - ItemList.Plank_Greenheart.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 14, new ItemStack(Blocks.planks, 1, 0))), - 14), - null); - GregTech_API.registerCover( - ItemList.Plank_Cherry.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 15, new ItemStack(Blocks.planks, 1, 0))), - 15), - null); - GregTech_API.registerCover( - ItemList.Plank_Mahoe.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 16, new ItemStack(Blocks.planks, 1, 0))), - 0), - null); - GregTech_API.registerCover( - ItemList.Plank_Poplar.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 17, new ItemStack(Blocks.planks, 1, 0))), - 1), - null); - GregTech_API.registerCover( - ItemList.Plank_Palm.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 18, new ItemStack(Blocks.planks, 1, 0))), - 2), - null); - GregTech_API.registerCover( - ItemList.Plank_Papaya.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 19, new ItemStack(Blocks.planks, 1, 0))), - 3), - null); - GregTech_API.registerCover( - ItemList.Plank_Pine.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 20, new ItemStack(Blocks.planks, 1, 0))), - 4), - null); - GregTech_API.registerCover( - ItemList.Plank_Plum.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 21, new ItemStack(Blocks.planks, 1, 0))), - 5), - null); - GregTech_API.registerCover( - ItemList.Plank_Maple.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 22, new ItemStack(Blocks.planks, 1, 0))), - 6), - null); - GregTech_API.registerCover( - ItemList.Plank_Citrus.get(1L), - TextureFactory.of( - GT_Utility.getBlockFromStack( - GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 23, new ItemStack(Blocks.planks, 1, 0))), - 7), - null); - - GregTech_API.registerCover( - ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)), - new GT_Cover_AdvancedRedstoneTransmitterExternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER))); - - GregTech_API.registerCover( - ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)), - new GT_Cover_AdvancedRedstoneTransmitterInternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER))); - - GregTech_API.registerCover( - ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)), - new GT_Cover_AdvancedRedstoneReceiverExternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER))); - - GregTech_API.registerCover( - ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)), - new GT_Cover_AdvancedRedstoneReceiverInternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER))); - - GregTech_API.registerCover( - ItemList.Cover_WirelessFluidDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_FLUID_DETECTOR)), - new GT_Cover_WirelessFluidDetector(TextureFactory.of(OVERLAY_WIRELESS_FLUID_DETECTOR))); - - GregTech_API.registerCover( - ItemList.Cover_WirelessItemDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_ITEM_DETECTOR)), - new GT_Cover_WirelessItemDetector(TextureFactory.of(OVERLAY_WIRELESS_ITEM_DETECTOR))); - - GregTech_API.registerCover( - ItemList.Cover_WirelessActivityDetector.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_ACTIVITYDETECTOR)), - new GT_Cover_WirelessDoesWorkDetector(TextureFactory.of(OVERLAY_WIRELESS_ACTIVITYDETECTOR))); - - GregTech_API.registerCover( - ItemList.Cover_WirelessNeedsMaintainance.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_MAINTENANCE_DETECTOR)), - new GT_Cover_WirelessMaintenanceDetector(TextureFactory.of(OVERLAY_WIRELESS_MAINTENANCE_DETECTOR))); - } - - @Override - public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { - return (aDoShowAllItems) || (!aPrefix.name() - .startsWith("toolHead")); - } - - @Override - public final ItemStack getContainerItem(ItemStack aStack) { - int aDamage = aStack.getItemDamage(); - if (aDamage < 32000) { - return null; - } - if (aDamage < 32100) { - return ItemList.ThermosCan_Empty.get(1L); - } - if (aDamage < 32200) { - return ItemList.Bottle_Empty.get(1L); - } - return null; - } -} diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java deleted file mode 100644 index 7d24a9e339..0000000000 --- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java +++ /dev/null @@ -1,1492 +0,0 @@ -package gregtech.common.items; - -import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.addItemTooltip; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_METRICS_TRANSMITTER; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UEV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UHV; -import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UIV; -import static gregtech.client.GT_TooltipHandler.Tier.EV; -import static gregtech.client.GT_TooltipHandler.Tier.HV; -import static gregtech.client.GT_TooltipHandler.Tier.IV; -import static gregtech.client.GT_TooltipHandler.Tier.LV; -import static gregtech.client.GT_TooltipHandler.Tier.LuV; -import static gregtech.client.GT_TooltipHandler.Tier.MAX; -import static gregtech.client.GT_TooltipHandler.Tier.MV; -import static gregtech.client.GT_TooltipHandler.Tier.UEV; -import static gregtech.client.GT_TooltipHandler.Tier.UHV; -import static gregtech.client.GT_TooltipHandler.Tier.UIV; -import static gregtech.client.GT_TooltipHandler.Tier.ULV; -import static gregtech.client.GT_TooltipHandler.Tier.UMV; -import static gregtech.client.GT_TooltipHandler.Tier.UV; -import static gregtech.client.GT_TooltipHandler.Tier.UXV; -import static gregtech.client.GT_TooltipHandler.Tier.ZPM; -import static gregtech.client.GT_TooltipHandler.registerTieredTooltip; -import static gregtech.common.items.ID_MetaItem_03.Activated_Carbon_Filter_Mesh; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Biomainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Bioprocessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Biowarecomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Biowaresupercomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Bio; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Bio_Ultra; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Coated_Basic; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Epoxy_Advanced; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Fiberglass_Advanced; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Multifiberglass_Elite; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Optical; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Phenolic_Good; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Plastic; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Plastic_Advanced; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Wetware; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Board_Wetware_Extreme; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_BioCPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_Biocell; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_CPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_CrystalCPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_CrystalSoC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_CrystalSoC2; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_HPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_ILC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_LPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_NAND; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_NOR; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_NPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_NanoCPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_NeuroCPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_Optical; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_PIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_PPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_QPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_QuantumCPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_Ram; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_Simple_SoC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_SoC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_SoC2; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_Stemcell; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_UHPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Chip_ULPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_CosmicAssembly; -import static gregtech.common.items.ID_MetaItem_03.Circuit_CosmicComputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_CosmicMainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_CosmicProcessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Crystalcomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Crystalmainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Crystalprocessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Elitenanocomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_ExoticAssembly; -import static gregtech.common.items.ID_MetaItem_03.Circuit_ExoticComputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_ExoticMainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_ExoticProcessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Integrated_Good; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Masterquantumcomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Microprocessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Nanocomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Nanoprocessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Neuroprocessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_OpticalAssembly; -import static gregtech.common.items.ID_MetaItem_03.Circuit_OpticalComputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_OpticalMainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_OpticalProcessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_CapacitorASMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_CapacitorSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_CapacitorXSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_Chip_Bioware; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_Coil; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_DiodeASMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_DiodeSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_DiodeXSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_GlassFiber; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_Glass_Tube; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_InductorASMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_InductorSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_InductorXSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_PetriDish; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_RawCrystalChip; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_RawCrystalParts; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_Reinforced_Glass_Tube; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_ResistorASMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_ResistorSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_ResistorXSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_TransistorASMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_TransistorSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Parts_TransistorXSMD; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Processor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Quantumcomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Quantummainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Quantumprocessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Ingot; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Ingot2; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Ingot3; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Ingot4; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Ingot5; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Ingot6; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Wafer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Wafer2; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Wafer3; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Wafer4; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Wafer5; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Wafer6; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Silicon_Wafer7; -import static gregtech.common.items.ID_MetaItem_03.Circuit_TranscendentAssembly; -import static gregtech.common.items.ID_MetaItem_03.Circuit_TranscendentComputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_TranscendentMainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_TranscendentProcessor; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Ultimatecrystalcomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_Bioware; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_CPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_HPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_ILC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_LPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_NAND; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_NOR; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_NPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_NanoCPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_PIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_PPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_QPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_QuantumCPU; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_Ram; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_Simple_SoC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_SoC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_SoC2; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_UHPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wafer_ULPIC; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wetwarecomputer; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wetwaremainframe; -import static gregtech.common.items.ID_MetaItem_03.Circuit_Wetwaresupercomputer; -import static gregtech.common.items.ID_MetaItem_03.Cover_Metrics_Transmitter; -import static gregtech.common.items.ID_MetaItem_03.Cover_SolarPanel_UEV; -import static gregtech.common.items.ID_MetaItem_03.Cover_SolarPanel_UHV; -import static gregtech.common.items.ID_MetaItem_03.Cover_SolarPanel_UIV; -import static gregtech.common.items.ID_MetaItem_03.EV_Coil; -import static gregtech.common.items.ID_MetaItem_03.GalliumArsenideCrystal; -import static gregtech.common.items.ID_MetaItem_03.GalliumArsenideCrystalSmallPart; -import static gregtech.common.items.ID_MetaItem_03.HV_Coil; -import static gregtech.common.items.ID_MetaItem_03.IV_Coil; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_AUTOMATION; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_1; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_2; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_3; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_4; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_5; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_6; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_7; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_8; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Acceleration_8_Upgraded; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_COOLER; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_DESERT; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_DRYER; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_FLOWERING; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_Frame; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_HEATER; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_HELL; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_HUMIDIFIER; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_JUNGLE; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_LIFESPAN; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_LIGHT; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_OCEAN; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_PLAINS; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_POLLEN; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_PRODUCTION; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_SEAL; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_SIEVE; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_SKY; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_STABILIZER; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_TERRITORY; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_UNLIGHT; -import static gregtech.common.items.ID_MetaItem_03.IndustrialApiary_Upgrade_WINTER; -import static gregtech.common.items.ID_MetaItem_03.KevlarFiber; -import static gregtech.common.items.ID_MetaItem_03.LV_Coil; -import static gregtech.common.items.ID_MetaItem_03.LuV_Coil; -import static gregtech.common.items.ID_MetaItem_03.MV_Coil; -import static gregtech.common.items.ID_MetaItem_03.NandChip; -import static gregtech.common.items.ID_MetaItem_03.NuclearStar; -import static gregtech.common.items.ID_MetaItem_03.Optical_Cpu_Containment_Housing; -import static gregtech.common.items.ID_MetaItem_03.Optically_Compatible_Memory; -import static gregtech.common.items.ID_MetaItem_03.Optically_Perfected_CPU; -import static gregtech.common.items.ID_MetaItem_03.Phononic_Seed_Crystal; -import static gregtech.common.items.ID_MetaItem_03.Quark_Catalyst_Housing; -import static gregtech.common.items.ID_MetaItem_03.Quark_Creation_Catalyst_Bottom; -import static gregtech.common.items.ID_MetaItem_03.Quark_Creation_Catalyst_Charm; -import static gregtech.common.items.ID_MetaItem_03.Quark_Creation_Catalyst_Down; -import static gregtech.common.items.ID_MetaItem_03.Quark_Creation_Catalyst_Strange; -import static gregtech.common.items.ID_MetaItem_03.Quark_Creation_Catalyst_Top; -import static gregtech.common.items.ID_MetaItem_03.Quark_Creation_Catalyst_Unaligned; -import static gregtech.common.items.ID_MetaItem_03.Quark_Creation_Catalyst_Up; -import static gregtech.common.items.ID_MetaItem_03.Relativistic_Heat_Capacitor; -import static gregtech.common.items.ID_MetaItem_03.Spinneret; -import static gregtech.common.items.ID_MetaItem_03.Thermal_Superconductor; -import static gregtech.common.items.ID_MetaItem_03.Timepiece; -import static gregtech.common.items.ID_MetaItem_03.Transdimensional_Alignment_Matrix; -import static gregtech.common.items.ID_MetaItem_03.Tube_Wires; -import static gregtech.common.items.ID_MetaItem_03.UHV_Coil; -import static gregtech.common.items.ID_MetaItem_03.ULV_Coil; -import static gregtech.common.items.ID_MetaItem_03.UV_Coil; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Axe; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Block; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Bolt; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Bottle; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Casing; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Cell; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_File; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Gear; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Hammer; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Hoe; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Ingot; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Pickaxe; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Pipe_Huge; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Pipe_Large; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Pipe_Medium; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Pipe_Small; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Pipe_Tiny; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Plate; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Ring; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Rod; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Rotor; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Saw; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Shovel; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Small_Gear; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Sword; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_ToolHeadDrill; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Turbine_Blade; -import static gregtech.common.items.ID_MetaItem_03.White_Dwarf_Shape_Extruder_Wire; -import static gregtech.common.items.ID_MetaItem_03.WovenKevlar; -import static gregtech.common.items.ID_MetaItem_03.ZPM_Coil; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TC_Aspects; -import gregtech.api.items.GT_MetaGenerated_Item_X32; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.common.covers.GT_Cover_Metrics_Transmitter; -import gregtech.common.covers.GT_Cover_SolarPanel; - -public class GT_MetaGenerated_Item_03 extends GT_MetaGenerated_Item_X32 { - - public static GT_MetaGenerated_Item_03 INSTANCE; - - public GT_MetaGenerated_Item_03() { - super( - "metaitem.03", - OrePrefixes.___placeholder___, - OrePrefixes.___placeholder___, - OrePrefixes.___placeholder___, - OrePrefixes.___placeholder___, - OrePrefixes.nanite, - OrePrefixes.rawOre); - INSTANCE = this; - Object[] o = new Object[0]; - - /* - * circuit boards tier 1-7: coated circuit board / wood plate + resin Plastic Circuit Board / Plastic + Copper - * Foil + Sulfuric Acid phenolic circuit board /carton+glue+chemical bath epoxy circuit board /epoxy plate + - * copper foil + sulfuric acid fiberglass circuit board (simple + multilayer) / glass + plastic + electrum foil - * + sulfuric acid wetware lifesupport board / fiberglass CB + teflon + - */ - ItemList.Circuit_Board_Wetware.set( - addItem(Circuit_Board_Wetware.ID, "Wetware Lifesupport Circuit Board", "The Board that keeps life", o)); - ItemList.Circuit_Board_Plastic - .set(addItem(Circuit_Board_Plastic.ID, "Plastic Circuit Board", "A Good Board", o)); - ItemList.Circuit_Board_Bio - .set(addItem(Circuit_Board_Bio.ID, "Bio Circuit Board", "Bio genetic mutated Board", o)); - - /* - * electronic components: vacuum tube (glass tube + red alloy cables) basic electronic circuits normal+smd coils - * diodes normal+smd transistors normal+smd capacitors normal+smd Glass Fibers - */ - ItemList.Circuit_Parts_ResistorSMD.set( - addItem( - Circuit_Parts_ResistorSMD.ID, - "SMD Resistor", - "Electronic Component", - OrePrefixes.componentCircuit.get(Materials.Resistor), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Parts_Glass_Tube.set(addItem(Circuit_Parts_Glass_Tube.ID, "Glass Tube", "", o)); - ItemList.Circuit_Parts_Coil.set(addItem(Circuit_Parts_Coil.ID, "Small Coil", "Basic Electronic Component", o)); - ItemList.Circuit_Parts_DiodeSMD.set( - addItem( - Circuit_Parts_DiodeSMD.ID, - "SMD Diode", - "Electronic Component", - OrePrefixes.componentCircuit.get(Materials.Diode), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Parts_TransistorSMD.set( - addItem( - Circuit_Parts_TransistorSMD.ID, - "SMD Transistor", - "Electronic Component", - OrePrefixes.componentCircuit.get(Materials.Transistor), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Parts_CapacitorSMD.set( - addItem( - Circuit_Parts_CapacitorSMD.ID, - "SMD Capacitor", - "Electronic Component", - OrePrefixes.componentCircuit.get(Materials.Capacitor), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Parts_GlassFiber - .set(addItem(Circuit_Parts_GlassFiber.ID, "Glass Fiber", Materials.BorosilicateGlass.mChemicalFormula, o)); - ItemList.Circuit_Parts_PetriDish - .set(addItem(Circuit_Parts_PetriDish.ID, "Petri Dish", "For cultivating cells", o)); - ItemList.Circuit_Parts_Reinforced_Glass_Tube - .set(addItem(Circuit_Parts_Reinforced_Glass_Tube.ID, "Reinforced Glass Tube", "", o)); - - ItemList.Circuit_Parts_ResistorASMD - .set(addItem(Circuit_Parts_ResistorASMD.ID, "Advanced SMD Resistor", "Advanced Electronic Component", o)); - ItemList.Circuit_Parts_DiodeASMD - .set(addItem(Circuit_Parts_DiodeASMD.ID, "Advanced SMD Diode", "Advanced Electronic Component", o)); - ItemList.Circuit_Parts_TransistorASMD.set( - addItem(Circuit_Parts_TransistorASMD.ID, "Advanced SMD Transistor", "Advanced Electronic Component", o)); - ItemList.Circuit_Parts_CapacitorASMD - .set(addItem(Circuit_Parts_CapacitorASMD.ID, "Advanced SMD Capacitor", "Advanced Electronic Component", o)); - - ItemList.Circuit_Parts_ResistorXSMD.set( - addItem(Circuit_Parts_ResistorXSMD.ID, "Optical SMD Resistor", "Highly Advanced Electronic Component", o)); - ItemList.Circuit_Parts_DiodeXSMD - .set(addItem(Circuit_Parts_DiodeXSMD.ID, "Optical SMD Diode", "Highly Advanced Electronic Component", o)); - ItemList.Circuit_Parts_TransistorXSMD.set( - addItem( - Circuit_Parts_TransistorXSMD.ID, - "Optical SMD Transistor", - "Highly Advanced Electronic Component", - o)); - ItemList.Circuit_Parts_CapacitorXSMD.set( - addItem( - Circuit_Parts_CapacitorXSMD.ID, - "Optical SMD Capacitor", - "Highly Advanced Electronic Component", - o)); - - ItemList.Circuit_Parts_InductorSMD.set( - addItem( - Circuit_Parts_InductorSMD.ID, - "SMD Inductor", - "Electronic Component", - OrePrefixes.componentCircuit.get(Materials.Inductor), - SubTag.NO_UNIFICATION)); - ItemList.Circuit_Parts_InductorASMD - .set(addItem(Circuit_Parts_InductorASMD.ID, "Advanced SMD Inductor", "Advanced Electronic Component", o)); - ItemList.Circuit_Parts_InductorXSMD.set( - addItem(Circuit_Parts_InductorXSMD.ID, "Optical SMD Inductor", "Highly Advanced Electronic Component", o)); - - /* - * ICs Lenses made from perfect crystals first instead of plates Monocrystalline silicon ingot - * (normal+glowstone+naquadah) EBF, normal silicon no EBF need anymore wafer(normal+glowstone+naquadah) cut mono - * silicon ingot in cutting machine - * Integrated Logic Circuit(8bit DIP) RAM NAND Memory NOR Memory CPU (4 sizes) SoCs(2 sizes, high tier cheap low - * tech component) Power IC/High Power IC/Ultra High power - * nanotube interconnected circuit (H-IC + nanotubes) - * quantum chips - */ - ItemList.Circuit_Silicon_Ingot - .set(addItem(Circuit_Silicon_Ingot.ID, "Monocrystalline Silicon Boule", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Ingot2.set( - addItem(Circuit_Silicon_Ingot2.ID, "Phosphorus doped Monocrystalline Silicon Boule", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Ingot3 - .set(addItem(Circuit_Silicon_Ingot3.ID, "Naquadah doped Monocrystalline Silicon Boule", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Ingot4 - .set(addItem(Circuit_Silicon_Ingot4.ID, "Europium doped Monocrystalline Silicon Boule", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Ingot5 - .set(addItem(Circuit_Silicon_Ingot5.ID, "Americium doped Monocrystalline Silicon Boule", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Ingot6 - .set(addItem(Circuit_Silicon_Ingot6.ID, "Optically Enriched Crystalline Boule", "Raw Circuit", o)); - - ItemList.Circuit_Silicon_Wafer.set(addItem(Circuit_Silicon_Wafer.ID, "Wafer", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Wafer2 - .set(addItem(Circuit_Silicon_Wafer2.ID, "Phosphorus doped Wafer", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Wafer3 - .set(addItem(Circuit_Silicon_Wafer3.ID, "Naquadah doped Wafer", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Wafer4 - .set(addItem(Circuit_Silicon_Wafer4.ID, "Europium doped Wafer", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Wafer5 - .set(addItem(Circuit_Silicon_Wafer5.ID, "Americium doped Wafer", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Wafer6 - .set(addItem(Circuit_Silicon_Wafer6.ID, "Photonically Prepared Wafer", "Raw Circuit", o)); - ItemList.Circuit_Silicon_Wafer7 - .set(addItem(Circuit_Silicon_Wafer7.ID, "Photonically Enhanced Wafer", "Raw Circuit", o)); - - ItemList.Circuit_Wafer_ILC - .set(addItem(Circuit_Wafer_ILC.ID, "Integrated Logic Circuit (Wafer)", "Raw Circuit", o)); - ItemList.Circuit_Chip_ILC - .set(addItem(Circuit_Chip_ILC.ID, "Integrated Logic Circuit", "Integrated Circuit", o)); - - ItemList.Circuit_Wafer_Ram - .set(addItem(Circuit_Wafer_Ram.ID, "Random Access Memory Chip (Wafer)", "Raw Circuit", o)); - ItemList.Circuit_Chip_Ram - .set(addItem(Circuit_Chip_Ram.ID, "Random Access Memory Chip", "Integrated Circuit", o)); - - ItemList.Circuit_Wafer_NAND.set(addItem(Circuit_Wafer_NAND.ID, "NAND Memory Chip (Wafer)", "Raw Circuit", o)); - ItemList.Circuit_Chip_NAND.set(addItem(Circuit_Chip_NAND.ID, "NAND Memory Chip", "Integrated Circuit", o)); - - ItemList.Circuit_Wafer_NOR.set(addItem(Circuit_Wafer_NOR.ID, "NOR Memory Chip (Wafer)", "Raw Circuit", o)); - ItemList.Circuit_Chip_NOR.set(addItem(Circuit_Chip_NOR.ID, "NOR Memory Chip", "Integrated Circuit", o)); - - ItemList.Circuit_Wafer_CPU - .set(addItem(Circuit_Wafer_CPU.ID, "Central Processing Unit (Wafer)", "Raw Circuit", o)); - ItemList.Circuit_Chip_CPU.set(addItem(Circuit_Chip_CPU.ID, "Central Processing Unit", "Integrated Circuit", o)); - - ItemList.Circuit_Wafer_SoC.set(addItem(Circuit_Wafer_SoC.ID, "SoC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_SoC.set(addItem(Circuit_Chip_SoC.ID, "SoC", "System on a Chip", o)); - - ItemList.Circuit_Wafer_SoC2.set(addItem(Circuit_Wafer_SoC2.ID, "ASoC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_SoC2.set(addItem(Circuit_Chip_SoC2.ID, "ASoC", "Advanced System on a Chip", o)); - - ItemList.Circuit_Wafer_PIC.set(addItem(Circuit_Wafer_PIC.ID, "PIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_PIC.set(addItem(Circuit_Chip_PIC.ID, "Power IC", "Power Circuit", o)); - - ItemList.Circuit_Wafer_HPIC.set(addItem(Circuit_Wafer_HPIC.ID, "HPIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_HPIC.set(addItem(Circuit_Chip_HPIC.ID, "High Power IC", "High Power Circuit", o)); - - ItemList.Circuit_Wafer_NanoCPU.set(addItem(Circuit_Wafer_NanoCPU.ID, "NanoCPU Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_NanoCPU - .set(addItem(Circuit_Chip_NanoCPU.ID, "Nanocomponent Central Processing Unit", "Power Circuit", o)); - - ItemList.Circuit_Wafer_QuantumCPU.set(addItem(Circuit_Wafer_QuantumCPU.ID, "QBit Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_QuantumCPU - .set(addItem(Circuit_Chip_QuantumCPU.ID, "QBit Processing Unit", "Quantum CPU", o)); - - ItemList.Circuit_Wafer_UHPIC.set(addItem(Circuit_Wafer_UHPIC.ID, "UHPIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_UHPIC - .set(addItem(Circuit_Chip_UHPIC.ID, "Ultra High Power IC", "Ultra High Power Circuit", o)); - - ItemList.Circuit_Wafer_Simple_SoC - .set(addItem(Circuit_Wafer_Simple_SoC.ID, "Simple SoC Wafer", "Raw Primitive Circuit", o)); - ItemList.Circuit_Chip_Simple_SoC - .set(addItem(Circuit_Chip_Simple_SoC.ID, "Simple SoC", "Simple System on a Chip", o)); - - ItemList.Circuit_Wafer_ULPIC.set(addItem(Circuit_Wafer_ULPIC.ID, "ULPIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_ULPIC - .set(addItem(Circuit_Chip_ULPIC.ID, "Ultra Low Power IC", "Ultra Low Power Circuit", o)); - - ItemList.Circuit_Wafer_LPIC.set(addItem(Circuit_Wafer_LPIC.ID, "LPIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_LPIC.set(addItem(Circuit_Chip_LPIC.ID, "Low Power IC", "Low Power Circuit", o)); - - ItemList.Circuit_Wafer_NPIC.set(addItem(Circuit_Wafer_NPIC.ID, "NPIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_NPIC.set(addItem(Circuit_Chip_NPIC.ID, "Nano Power IC", "Nano Power Circuit", o)); - - ItemList.Circuit_Wafer_PPIC.set(addItem(Circuit_Wafer_PPIC.ID, "PPIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_PPIC.set(addItem(Circuit_Chip_PPIC.ID, "Piko Power IC", "Piko Power Circuit", o)); - - ItemList.Circuit_Wafer_QPIC.set(addItem(Circuit_Wafer_QPIC.ID, "QPIC Wafer", "Raw Circuit", o)); - ItemList.Circuit_Chip_QPIC.set(addItem(Circuit_Chip_QPIC.ID, "Quantum Power IC", "Quantum Power Circuit", o)); - - ItemList.Circuit_Wafer_Bioware.set(addItem(Circuit_Wafer_Bioware.ID, "Living Bio Wafer", "Raw Circuit", o)); - ItemList.Circuit_Parts_Chip_Bioware - .set(addItem(Circuit_Parts_Chip_Bioware.ID, "Living Bio Chip", "Needed for Circuits", o)); - /* - * Engraved Crystal Chip Engraved Lapotron Chip Crystal CPU SoCrystal stem cells (disassemble eggs) - */ - ItemList.Circuit_Chip_CrystalSoC2.set( - addItem(Circuit_Chip_CrystalSoC2.ID, "Raw Advanced Crystal Chip", "Raw Advanced Crystal Processor", o)); - ItemList.Circuit_Parts_RawCrystalChip - .set(addItem(Circuit_Parts_RawCrystalChip.ID, "Raw Crystal Chip", "Raw Crystal Processor", o)); - ItemList.Circuit_Chip_CrystalCPU - .set(addItem(Circuit_Chip_CrystalCPU.ID, "Crystal Processing Unit", "Crystal CPU", o)); // Crystal - // chip - // elite - // part - ItemList.Circuit_Chip_CrystalSoC - .set(addItem(Circuit_Chip_CrystalSoC.ID, "Crystal SoC", "Crystal System on a Chip", o)); - ItemList.Circuit_Chip_NeuroCPU.set(addItem(Circuit_Chip_NeuroCPU.ID, "Neuro Processing Unit", "Neuro CPU", o)); - ItemList.Circuit_Chip_Stemcell.set(addItem(Circuit_Chip_Stemcell.ID, "Stemcells", "Raw inteligence", o)); - ItemList.Circuit_Parts_RawCrystalParts - .set(addItem(Circuit_Parts_RawCrystalParts.ID, "Raw Crystal Chip Parts", "Raw Crystal Processor Parts", o)); - ItemList.Circuit_Chip_Biocell.set(addItem(Circuit_Chip_Biocell.ID, "Biocells", "Mutated Raw inteligence", o)); - ItemList.Circuit_Chip_BioCPU.set(addItem(Circuit_Chip_BioCPU.ID, "Bio Processing Unit", "Bio CPU", o)); - ItemList.Circuit_Chip_Optical - .set(addItem(Circuit_Chip_Optical.ID, "Raw Exposed Optical Chip", "Raw Optical Chip", o)); - - // Nand Chip - ItemList.NandChip.set( - addItem( - NandChip.ID, - "NAND Chip", - "A very simple Circuit", - OrePrefixes.circuit.get(Materials.ULV), - SubTag.NO_UNIFICATION)); - - // Vacuum Tube Item01 - // Basic Circuit IC2 - // Good Circuit Item01 - - // Integrated Logic Circuit Item01 - ItemList.Circuit_Integrated_Good.set( - addItem( - Circuit_Integrated_Good.ID, - "Good Integrated Circuit", - "Good Circuit", - OrePrefixes.circuit.get(Materials.MV), - SubTag.NO_UNIFICATION)); - - // Good Integrated Circuit Item01 - // Advanced Circuit IC2 - - ItemList.Circuit_Microprocessor.set( - addItem( - Circuit_Microprocessor.ID, - "Microprocessor", - "A Basic Circuit", - OrePrefixes.circuit.get(Materials.LV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Processor.set( - addItem( - Circuit_Processor.ID, - "Integrated Processor", - "A Good Circuit", - OrePrefixes.circuit.get(Materials.MV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Nanoprocessor.set( - addItem( - Circuit_Nanoprocessor.ID, - "Nanoprocessor", - "An Advanced Circuit", - OrePrefixes.circuit.get(Materials.HV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Nanocomputer.set( - addItem( - Circuit_Nanocomputer.ID, - "Nanoprocessor Assembly", - "An Extreme Circuit", - OrePrefixes.circuit.get(Materials.EV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Elitenanocomputer.set( - addItem( - Circuit_Elitenanocomputer.ID, - "Elite Nanocomputer", - "An Elite Circuit", - OrePrefixes.circuit.get(Materials.IV), - SubTag.NO_UNIFICATION)); - - // Quantum circuits - ItemList.Circuit_Quantumprocessor.set( - addItem( - Circuit_Quantumprocessor.ID, - "Quantumprocessor", - "An Extreme Circuit", - OrePrefixes.circuit.get(Materials.EV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Quantumcomputer.set( - addItem( - Circuit_Quantumcomputer.ID, - "Quantumprocessor Assembly", - "An Elite Circuit", - OrePrefixes.circuit.get(Materials.IV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Masterquantumcomputer.set( - addItem( - Circuit_Masterquantumcomputer.ID, - "Master Quantumcomputer", - "A Master Circuit", - OrePrefixes.circuit.get(Materials.LuV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Quantummainframe.set( - addItem( - Circuit_Quantummainframe.ID, - "Quantumprocessor Mainframe", - "An Ultimate Circuit", - OrePrefixes.circuit.get(Materials.ZPM), - SubTag.NO_UNIFICATION)); - - // Crystal circuits - ItemList.Circuit_Crystalprocessor.set( - addItem( - Circuit_Crystalprocessor.ID, - "Crystalprocessor", - "An Elite Circuit", - OrePrefixes.circuit.get(Materials.IV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Crystalcomputer.set( - addItem( - Circuit_Crystalcomputer.ID, - "Crystalprocessor Assembly", - "A Master Circuit", - OrePrefixes.circuit.get(Materials.LuV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Ultimatecrystalcomputer.set( - addItem( - Circuit_Ultimatecrystalcomputer.ID, - "Ultimate Crystalcomputer", - "An Ultimate Circuit", - OrePrefixes.circuit.get(Materials.ZPM), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Crystalmainframe.set( - addItem( - Circuit_Crystalmainframe.ID, - "Crystalprocessor Mainframe", - "A Super Circuit", - OrePrefixes.circuit.get(Materials.UV), - SubTag.NO_UNIFICATION)); - - // ???? Scared to remove. - ItemList.Circuit_Ultimate.set(ItemList.Circuit_Ultimatecrystalcomputer.get(1L)); // maybe should be removed - - // Wetware circuits - ItemList.Circuit_Neuroprocessor.set( - addItem( - Circuit_Neuroprocessor.ID, - "Wetwareprocessor", - "A Master Circuit", - OrePrefixes.circuit.get(Materials.LuV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Wetwarecomputer.set( - addItem( - Circuit_Wetwarecomputer.ID, - "Wetwareprocessor Assembly", - "An Ultimate Circuit", - OrePrefixes.circuit.get(Materials.ZPM), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Wetwaresupercomputer.set( - addItem( - Circuit_Wetwaresupercomputer.ID, - "Wetware Supercomputer", - "A Super Circuit", - OrePrefixes.circuit.get(Materials.UV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Wetwaremainframe.set( - addItem( - Circuit_Wetwaremainframe.ID, - "Wetware Mainframe", - "An Infinite Circuit", - OrePrefixes.circuit.get(Materials.UHV), - SubTag.NO_UNIFICATION)); - - // Bioware circuits. - ItemList.Circuit_Bioprocessor.set( - addItem( - Circuit_Bioprocessor.ID, - "Bioprocessor", - "An Ultimate Circuit", - OrePrefixes.circuit.get(Materials.ZPM), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Biowarecomputer.set( - addItem( - Circuit_Biowarecomputer.ID, - "Biowareprocessor Assembly", - "A Super Circuit", - OrePrefixes.circuit.get(Materials.UV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Biowaresupercomputer.set( - addItem( - Circuit_Biowaresupercomputer.ID, - "Bioware Supercomputer", - "An Infinite Circuit", - OrePrefixes.circuit.get(Materials.UHV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Biomainframe.set( - addItem( - Circuit_Biomainframe.ID, - "Bio Mainframe", - "A Bio Circuit", - OrePrefixes.circuit.get(Materials.UEV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_Board_Coated_Basic - .set(addItem(Circuit_Board_Coated_Basic.ID, "Circuit Board", "A basic Circuit Board", o)); - ItemList.Circuit_Board_Phenolic_Good - .set(addItem(Circuit_Board_Phenolic_Good.ID, "Good Circuit Board", "A good Circuit Board", o)); - ItemList.Circuit_Board_Epoxy_Advanced - .set(addItem(Circuit_Board_Epoxy_Advanced.ID, "Advanced Circuit Board", "A advanced Circuit Board", o)); - ItemList.Circuit_Board_Fiberglass_Advanced.set( - addItem( - Circuit_Board_Fiberglass_Advanced.ID, - "More Advanced Circuit Board", - "A more advanced Circuit Board", - o)); - ItemList.Circuit_Board_Multifiberglass_Elite - .set(addItem(Circuit_Board_Multifiberglass_Elite.ID, "Elite Circuit Board", "A elite Circuit Board", o)); - ItemList.Circuit_Board_Wetware_Extreme.set( - addItem( - Circuit_Board_Wetware_Extreme.ID, - "Extreme Wetware Lifesupport Circuit Board", - "The Board that keeps life", - o)); - ItemList.Circuit_Board_Plastic_Advanced - .set(addItem(Circuit_Board_Plastic_Advanced.ID, "Plastic Circuit Board", "A good Board", o)); - ItemList.Circuit_Board_Bio_Ultra.set( - addItem(Circuit_Board_Bio_Ultra.ID, "Ultra Bio Mutated Circuit Board", "Bio genetic mutated Board", o)); - ItemList.Circuit_Board_Optical - .set(addItem(Circuit_Board_Optical.ID, "Optical Circuit Board", "Optically Infused Board", o)); - - // Optical circuits - ItemList.Circuit_OpticalProcessor.set( - addItem( - Circuit_OpticalProcessor.ID, - "Optical Processor", - "An Optical Circuit", - OrePrefixes.circuit.get(Materials.UV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_OpticalAssembly.set( - addItem( - Circuit_OpticalAssembly.ID, - "Optical Assembly", - "An Optical Circuit", - OrePrefixes.circuit.get(Materials.UHV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_OpticalComputer.set( - addItem( - Circuit_OpticalComputer.ID, - "Optical Computer", - "An Optical Circuit", - OrePrefixes.circuit.get(Materials.UEV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_OpticalMainframe.set( - addItem( - Circuit_OpticalMainframe.ID, - "Optical Mainframe", - "An Optical Circuit", - OrePrefixes.circuit.get(Materials.UIV), - SubTag.NO_UNIFICATION)); - - // Exotic circuits - ItemList.Circuit_ExoticProcessor.set( - addItem( - Circuit_ExoticProcessor.ID, - "Exotic Processor", - "An Exotic Circuit", - OrePrefixes.circuit.get(Materials.UHV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_ExoticAssembly.set( - addItem( - Circuit_ExoticAssembly.ID, - "Exotic Assembly", - "An Exotic Circuit", - OrePrefixes.circuit.get(Materials.UEV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_ExoticComputer.set( - addItem( - Circuit_ExoticComputer.ID, - "Exotic Computer", - "An Exotic Circuit", - OrePrefixes.circuit.get(Materials.UIV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_ExoticMainframe.set( - addItem( - Circuit_ExoticMainframe.ID, - "Exotic Mainframe", - "An Exotic Circuit", - OrePrefixes.circuit.get(Materials.UMV), - SubTag.NO_UNIFICATION)); - - // Cosmic circuits - ItemList.Circuit_CosmicProcessor.set( - addItem( - Circuit_CosmicProcessor.ID, - "Cosmic Processor", - "A Cosmic Circuit", - OrePrefixes.circuit.get(Materials.UEV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_CosmicAssembly.set( - addItem( - Circuit_CosmicAssembly.ID, - "Cosmic Assembly", - "A Cosmic Circuit", - OrePrefixes.circuit.get(Materials.UIV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_CosmicComputer.set( - addItem( - Circuit_CosmicComputer.ID, - "Cosmic Computer", - "A Cosmic Circuit", - OrePrefixes.circuit.get(Materials.UMV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_CosmicMainframe.set( - addItem( - Circuit_CosmicMainframe.ID, - "Cosmic Mainframe", - "A Cosmic Circuit", - OrePrefixes.circuit.get(Materials.UXV), - SubTag.NO_UNIFICATION)); - - // Transcendent circuits - ItemList.Circuit_TranscendentProcessor.set( - addItem( - Circuit_TranscendentProcessor.ID, - "Temporally Transcendent Processor", - "A circuit operating outside of known spacetime", - OrePrefixes.circuit.get(Materials.UIV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_TranscendentAssembly.set( - addItem( - Circuit_TranscendentAssembly.ID, - "Temporally Transcendent Assembly", - "A circuit operating outside of known spacetime", - OrePrefixes.circuit.get(Materials.UMV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_TranscendentComputer.set( - addItem( - Circuit_TranscendentComputer.ID, - "Temporally Transcendent Computer", - "A circuit operating outside of known spacetime", - OrePrefixes.circuit.get(Materials.UXV), - SubTag.NO_UNIFICATION)); - - ItemList.Circuit_TranscendentMainframe.set( - addItem( - Circuit_TranscendentMainframe.ID, - "Temporally Transcendent Mainframe", - "A circuit operating outside of known spacetime", - OrePrefixes.circuit.get(Materials.MAX), - SubTag.NO_UNIFICATION)); - - ItemList.Tube_Wires.set(addItem(Tube_Wires.ID, "Tube Wires", "For the Vacuum Tubes", o)); - - ItemList.Cover_SolarPanel_UHV.set( - addItem( - Cover_SolarPanel_UHV.ID, - "Solar Panel (UHV)", - "Ultimate High Voltage Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 128L))); - ItemList.Cover_SolarPanel_UEV.set( - addItem( - Cover_SolarPanel_UEV.ID, - "Solar Panel (UEV)", - "Ultimate Extreme Voltage Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 256L))); - ItemList.Cover_SolarPanel_UIV.set( - addItem( - Cover_SolarPanel_UIV.ID, - "Solar Panel (UIV)", - "Ultimate Insane Voltage Solar Panel (Needs cleaning with right click)", - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 512L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 512L))); - - ItemList.ULV_Coil.set(addItem(ULV_Coil.ID, "Ultra Low Voltage Coil", "Primitive Coil", o)); - ItemList.LV_Coil.set(addItem(LV_Coil.ID, "Low Voltage Coil", "Basic Coil", o)); - ItemList.MV_Coil.set(addItem(MV_Coil.ID, "Medium Voltage Coil", "Good Coil", o)); - ItemList.HV_Coil.set(addItem(HV_Coil.ID, "High Voltage Coil", "Advanced Coil", o)); - ItemList.EV_Coil.set(addItem(EV_Coil.ID, "Extreme Voltage Coil", "Extreme Coil", o)); - ItemList.IV_Coil.set(addItem(IV_Coil.ID, "Insane Voltage Coil", "Elite Coil", o)); - ItemList.LuV_Coil.set(addItem(LuV_Coil.ID, "Ludicrous Voltage Coil", "Master Coil", o)); - ItemList.ZPM_Coil.set(addItem(ZPM_Coil.ID, "ZPM Voltage Coil", "Ultimate Coil", o)); - ItemList.UV_Coil.set(addItem(UV_Coil.ID, "Ultimate Voltage Coil", "Super Coil", o)); - ItemList.UHV_Coil.set(addItem(UHV_Coil.ID, "Highly Ultimate Voltage Coil", "Infinite Coil", o)); - - ItemList.GalliumArsenideCrystal - .set(addItem(GalliumArsenideCrystal.ID, "Gallium Arsenide Crystal", "For making boules", o)); - ItemList.GalliumArsenideCrystalSmallPart - .set(addItem(GalliumArsenideCrystalSmallPart.ID, "Small Gallium Arsenide Crystal", "For making boules", o)); - ItemList.KevlarFiber.set(addItem(KevlarFiber.ID, "Kevlar Fiber", "For making Kevlar Plates", o)); - ItemList.WovenKevlar.set(addItem(WovenKevlar.ID, "Woven Kevlar", "For making Kevlar Plates", o)); - ItemList.Spinneret.set(addItem(Spinneret.ID, "Spinneret", "For making Kevlar Fiber", o)); - - ItemList.IndustrialApiary_Upgrade_Frame - .set(addItem(IndustrialApiary_Upgrade_Frame.ID, "Upgrade Frame", "Crafting component", o)); - - ItemList.IndustrialApiary_Upgrade_Acceleration_1.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_1.ID, - "Acceleration Upgrade x2", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 2x acceleration level/n * Energy Consumption +1 AMP LV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_2.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_2.ID, - "Acceleration Upgrade x4", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 4x acceleration level/n * Energy Consumption +1 AMP MV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_3.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_3.ID, - "Acceleration Upgrade x8", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 8x acceleration level/n * Energy Consumption +1 AMP HV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_4.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_4.ID, - "Acceleration Upgrade x16", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 16x acceleration level/n * Energy Consumption +1 AMP EV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_5.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_5.ID, - "Acceleration Upgrade x32", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 32x acceleration level/n * Energy Consumption +1 AMP IV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_6.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_6.ID, - "Acceleration Upgrade x64", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 64x acceleration level/n * Energy Consumption +1 AMP LuV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_7.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_7.ID, - "Acceleration Upgrade x128", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 128x acceleration level/n * Energy Consumption +1 AMP ZPM", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_8.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_8.ID, - "Acceleration Upgrade x256", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 256x acceleration level/n * Energy Consumption +1 AMP UV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_Acceleration_8_Upgraded.set( - addItem( - IndustrialApiary_Upgrade_Acceleration_8_Upgraded.ID, - "Upgraded Acceleration Upgrade x256", - "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 256x acceleration level/n * Will also grant 8x production upgrade/n * Energy Consumption +1 AMP UV", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_PRODUCTION.set( - addItem( - IndustrialApiary_Upgrade_PRODUCTION.ID, - "Production Upgrade", - "Production upgrade for Industrial Apiary/n Maximum Installed: 8/n Increases production modifier by 0.25/n Energy Consumption +40%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_PLAINS.set( - addItem( - IndustrialApiary_Upgrade_PLAINS.ID, - "Plains Emulation Upgrade", - "Plains emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Plains/n * Energy Consumption +40%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_LIGHT.set( - addItem( - IndustrialApiary_Upgrade_LIGHT.ID, - "Light Upgrade", - "Light upgrade for Industrial Apiary/n Maximum Installed: 1/n * Internal Lighting/n * Energy Consumption +5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_FLOWERING.set( - addItem( - IndustrialApiary_Upgrade_FLOWERING.ID, - "Flowering Upgrade", - "Flowering upgrade for Industrial Apiary/n Maximum Installed: 8/n * Flowering and Pollination +20%/n * Energy Consumption +10%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_WINTER.set( - addItem( - IndustrialApiary_Upgrade_WINTER.ID, - "Winter Emulation Upgrade", - "Winter emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Taiga/n * Energy Consumption +50%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_DRYER.set( - addItem( - IndustrialApiary_Upgrade_DRYER.ID, - "Dryer Upgrade", - "Dryer upgrade for Industrial Apiary/n Maximum Installed: 16/n * Humidity -12.5%/n * Energy Consumption +2.5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_AUTOMATION.set( - addItem( - IndustrialApiary_Upgrade_AUTOMATION.ID, - "Automation Upgrade", - "Automation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Automation/n * Energy Consumption +10%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.set( - addItem( - IndustrialApiary_Upgrade_HUMIDIFIER.ID, - "Humidifier Upgrade", - "Humidifier upgrade for Industrial Apiary/n Maximum Installed: 16/n * Humidity +12.5%/n * Energy Consumption +2.5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_HELL.set( - addItem( - IndustrialApiary_Upgrade_HELL.ID, - "HELL Emulation Upgrade", - "HELL emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: HELL/n * Energy Consumption +50%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_POLLEN.set( - addItem( - IndustrialApiary_Upgrade_POLLEN.ID, - "Pollen Scrubber Upgrade", - "Pollen scrubber upgrade for Industrial Apiary/n Maximum Installed: 1/n * Flowering and Pollination -100%/n * Energy Consumption +30%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_DESERT.set( - addItem( - IndustrialApiary_Upgrade_DESERT.ID, - "Desert Emulation Upgrade", - "Desert emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Desert/n * Energy Consumption +20%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_COOLER.set( - addItem( - IndustrialApiary_Upgrade_COOLER.ID, - "Cooler Upgrade", - "Cooler upgrade for Industrial Apiary/n Maximum Installed: 16/n * Temperature -12.5%/n * Energy Consumption +2.5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_LIFESPAN.set( - addItem( - IndustrialApiary_Upgrade_LIFESPAN.ID, - "Lifespan Upgrade", - "Lifespan upgrade for Industrial Apiary/n Maximum Installed: 4/n * Lifespan -33%/n * Energy Consumption +5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_SEAL.set( - addItem( - IndustrialApiary_Upgrade_SEAL.ID, - "Seal Upgrade", - "Seal upgrade for Industrial Apiary/n Maximum Installed: 1/n * Rain Protection/n * Energy Consumption +5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_STABILIZER.set( - addItem( - IndustrialApiary_Upgrade_STABILIZER.ID, - "Genetic Stabilizer Upgrade", - "Genetic stabilizer upgrade for Industrial Apiary/n Maximum Installed: 1/n * Genetic Decay -100%/n * Energy Consumption +150%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_JUNGLE.set( - addItem( - IndustrialApiary_Upgrade_JUNGLE.ID, - "Jungle Emulation Upgrade", - "Jungle emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Jungle/n * Energy Consumption +20%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_TERRITORY.set( - addItem( - IndustrialApiary_Upgrade_TERRITORY.ID, - "Territory Upgrade", - "Territory upgrade for Industrial Apiary/n Maximum Installed: 4/n * Territory +50%/n * Energy Consumption +5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_OCEAN.set( - addItem( - IndustrialApiary_Upgrade_OCEAN.ID, - "Ocean Emulation Upgrade", - "Ocean emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Ocean/n * Energy Consumption +20%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_SKY.set( - addItem( - IndustrialApiary_Upgrade_SKY.ID, - "Open Sky Upgrade", - "Open sky upgrade for Industrial Apiary/n Maximum Installed: 1/n * Open Sky Simulation/n * Energy Consumption +5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_HEATER.set( - addItem( - IndustrialApiary_Upgrade_HEATER.ID, - "Heater Upgrade", - "Heater upgrade for Industrial Apiary/n Maximum Installed: 16/n * Temperature +12.5%/n * Energy Consumption +2.5%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_SIEVE.set( - addItem( - IndustrialApiary_Upgrade_SIEVE.ID, - "Sieve Upgrade", - "Sieve upgrade for Industrial Apiary/n Maximum Installed: 1/n * Pollen Collection/n * Energy Consumption +25%", - OrePrefixes.apiaryUpgrade.name())); - ItemList.IndustrialApiary_Upgrade_UNLIGHT.set( - addItem( - IndustrialApiary_Upgrade_UNLIGHT.ID, - "Night Upgrade", - "Night upgrade for Industrial Apiary/n Maximum Installed: 1/n * Internal Darkness/n * Energy Consumption +5%", - OrePrefixes.apiaryUpgrade.name())); - - ItemList.NuclearStar.set( - addItem( - NuclearStar.ID, - "Nuclear Star", - "By the powers of Greg, I command this star to be really hot.", - SubTag.NO_UNIFICATION)); - - ItemList.Cover_Metrics_Transmitter.set( - addItem( - Cover_Metrics_Transmitter.ID, - "Metrics Transmitter Cover", - String.join( - "/n ", - "Taking Information Panels to the next level!", - "Creates a GregTech Advanced Sensor Card when attached", - "Works across dimensions or if machine is dismantled", - "Removing this cover will destroy the linked card", - GT_Values.AuthorQuerns))); - - ItemList.ActivatedCarbonFilterMesh.set( - addItem( - Activated_Carbon_Filter_Mesh.ID, - "Activated Carbon Filter Mesh", - "The most granular filter you could possibly make.", - SubTag.NO_UNIFICATION)); - - ItemList.Quark_Catalyst_Housing.set( - addItem( - Quark_Catalyst_Housing.ID, - "Empty Quark Release Catalyst Housing", - "Capable of holding Quark Release Catalysts", - SubTag.NO_UNIFICATION)); - ItemList.Quark_Creation_Catalyst_Up.set( - addItem( - Quark_Creation_Catalyst_Up.ID, - "Up-Quark Releasing Catalyst", - "Can release up-quarks into environment to reshape matter", - SubTag.NO_UNIFICATION)); - ItemList.Quark_Creation_Catalyst_Down.set( - addItem( - Quark_Creation_Catalyst_Down.ID, - "Down-Quark Releasing Catalyst", - "Can release down-quarks into environment to reshape matter", - SubTag.NO_UNIFICATION)); - ItemList.Quark_Creation_Catalyst_Strange.set( - addItem( - Quark_Creation_Catalyst_Strange.ID, - "Strange-Quark Releasing Catalyst", - "Can release strange-quarks into environment to reshape matter", - SubTag.NO_UNIFICATION)); - ItemList.Quark_Creation_Catalyst_Charm.set( - addItem( - Quark_Creation_Catalyst_Charm.ID, - "Charm-Quark Releasing Catalyst", - "Can release charm-quarks into environment to reshape matter", - SubTag.NO_UNIFICATION)); - ItemList.Quark_Creation_Catalyst_Bottom.set( - addItem( - Quark_Creation_Catalyst_Bottom.ID, - "Bottom-Quark Releasing Catalyst", - "Can release top-quarks into environment to reshape matter", - SubTag.NO_UNIFICATION)); - ItemList.Quark_Creation_Catalyst_Top.set( - addItem( - Quark_Creation_Catalyst_Top.ID, - "Top-Quark Releasing Catalyst", - "Can release bottom-quarks into environment to reshape matter", - SubTag.NO_UNIFICATION)); - ItemList.Quark_Creation_Catalyst_Unaligned.set( - addItem( - Quark_Creation_Catalyst_Unaligned.ID, - "Unaligned Quark Releasing Catalyst", - "Needs to be realigned before use", - SubTag.NO_UNIFICATION)); - - ItemList.Optical_Cpu_Containment_Housing - .set(addItem(Optical_Cpu_Containment_Housing.ID, "Optical CPU Containment Housing", "CPU Housing", o)); - ItemList.Optically_Perfected_CPU - .set(addItem(Optically_Perfected_CPU.ID, "Optically Perfected CPU", "Perfected CPU!", o)); - ItemList.Optically_Compatible_Memory - .set(addItem(Optically_Compatible_Memory.ID, "Optically Compatible Memory", "Its in the name!", o)); - - ItemList.Timepiece.set(addItem(Timepiece.ID, "Timepiece", "Beware of the kid with the hat", o)); - ItemList.Transdimensional_Alignment_Matrix.set( - addItem( - Transdimensional_Alignment_Matrix.ID, - "Transdimensional Alignment Matrix", - String.join( - "/n ", - "Device supporting the alignment of transdimensional spaces.", - "Enables Dimensional Convergence on the DTPF."), - o)); - - ItemList.Thermal_Superconductor - .set(addItem(Thermal_Superconductor.ID, "Thermal Superconductor", "With the power of second sound!", o)); - ItemList.Relativistic_Heat_Capacitor - .set(addItem(Relativistic_Heat_Capacitor.ID, "Relativistic Heat Capacitor", "Thermal Resonance?", o)); - ItemList.Phononic_Seed_Crystal - .set(addItem(Phononic_Seed_Crystal.ID, "Phononic Seed Crystal", "Perfect Thermal Conductance", o)); - - ItemList.White_Dwarf_Shape_Extruder_Plate.set( - addItem( - White_Dwarf_Shape_Extruder_Plate.ID, - "White Dwarf Extruder Shape (Plate)", - "Ultra Strong Stellar Shape for making Plates")); - ItemList.White_Dwarf_Shape_Extruder_Rod.set( - addItem( - White_Dwarf_Shape_Extruder_Rod.ID, - "White Dwarf Extruder Shape (Rod)", - "Ultra Strong Stellar Shape for making Rods")); - ItemList.White_Dwarf_Shape_Extruder_Bolt.set( - addItem( - White_Dwarf_Shape_Extruder_Bolt.ID, - "White Dwarf Extruder Shape (Bolt)", - "Ultra Strong Stellar Shape for making Bolts")); - ItemList.White_Dwarf_Shape_Extruder_Ring.set( - addItem( - White_Dwarf_Shape_Extruder_Ring.ID, - "White Dwarf Extruder Shape (Ring)", - "Ultra Strong Stellar Shape for making Rings")); - ItemList.White_Dwarf_Shape_Extruder_Cell.set( - addItem( - White_Dwarf_Shape_Extruder_Cell.ID, - "White Dwarf Extruder Shape (Cell)", - "Ultra Strong Stellar Shape for making Cells")); - ItemList.White_Dwarf_Shape_Extruder_Ingot.set( - addItem( - White_Dwarf_Shape_Extruder_Ingot.ID, - "White Dwarf Extruder Shape (Ingot)", - "Ultra Strong Stellar Shape for, wait, can't we just use a Furnace?")); - ItemList.White_Dwarf_Shape_Extruder_Wire.set( - addItem( - White_Dwarf_Shape_Extruder_Wire.ID, - "White Dwarf Extruder Shape (Wire)", - "Ultra Strong Stellar Shape for making Wires")); - ItemList.White_Dwarf_Shape_Extruder_Casing.set( - addItem( - White_Dwarf_Shape_Extruder_Casing.ID, - "White Dwarf Extruder Shape (Casing)", - "Ultra Strong Stellar Shape for making Item Casings")); - ItemList.White_Dwarf_Shape_Extruder_Pipe_Tiny.set( - addItem( - White_Dwarf_Shape_Extruder_Pipe_Tiny.ID, - "White Dwarf Extruder Shape (Tiny Pipe)", - "Ultra Strong Stellar Shape for making tiny Pipes")); - ItemList.White_Dwarf_Shape_Extruder_Pipe_Small.set( - addItem( - White_Dwarf_Shape_Extruder_Pipe_Small.ID, - "White Dwarf Extruder Shape (Small Pipe)", - "Ultra Strong Stellar Shape for making small Pipes")); - ItemList.White_Dwarf_Shape_Extruder_Pipe_Medium.set( - addItem( - White_Dwarf_Shape_Extruder_Pipe_Medium.ID, - "White Dwarf Extruder Shape (Normal Pipe)", - "Ultra Strong Stellar Shape for making Pipes")); - ItemList.White_Dwarf_Shape_Extruder_Pipe_Large.set( - addItem( - White_Dwarf_Shape_Extruder_Pipe_Large.ID, - "White Dwarf Extruder Shape (Large Pipe)", - "Ultra Strong Stellar Shape for making large Pipes")); - ItemList.White_Dwarf_Shape_Extruder_Pipe_Huge.set( - addItem( - White_Dwarf_Shape_Extruder_Pipe_Huge.ID, - "White Dwarf Extruder Shape (Huge Pipe)", - "Ultra Strong Stellar Shape for making full Block Pipes")); - ItemList.White_Dwarf_Shape_Extruder_Block.set( - addItem( - White_Dwarf_Shape_Extruder_Block.ID, - "White Dwarf Extruder Shape (Block)", - "Ultra Strong Stellar Shape for making Blocks")); - ItemList.White_Dwarf_Shape_Extruder_Sword.set( - addItem( - White_Dwarf_Shape_Extruder_Sword.ID, - "White Dwarf Extruder Shape (Sword Blade)", - "Ultra Strong Stellar Shape for making Swords")); - ItemList.White_Dwarf_Shape_Extruder_Pickaxe.set( - addItem( - White_Dwarf_Shape_Extruder_Pickaxe.ID, - "White Dwarf Extruder Shape (Pickaxe Head)", - "Ultra Strong Stellar Shape for making Pickaxes")); - ItemList.White_Dwarf_Shape_Extruder_Shovel.set( - addItem( - White_Dwarf_Shape_Extruder_Shovel.ID, - "White Dwarf Extruder Shape (Shovel Head)", - "Ultra Strong Stellar Shape for making Shovels")); - ItemList.White_Dwarf_Shape_Extruder_Axe.set( - addItem( - White_Dwarf_Shape_Extruder_Axe.ID, - "White Dwarf Extruder Shape (Axe Head)", - "Ultra Strong Stellar Shape for making Axes")); - ItemList.White_Dwarf_Shape_Extruder_Hoe.set( - addItem( - White_Dwarf_Shape_Extruder_Hoe.ID, - "White Dwarf Extruder Shape (Hoe Head)", - "Ultra Strong Stellar Shape for making Hoes")); - ItemList.White_Dwarf_Shape_Extruder_Hammer.set( - addItem( - White_Dwarf_Shape_Extruder_Hammer.ID, - "White Dwarf Extruder Shape (Hammer Head)", - "Ultra Strong Stellar Shape for making Hammers")); - ItemList.White_Dwarf_Shape_Extruder_File.set( - addItem( - White_Dwarf_Shape_Extruder_File.ID, - "White Dwarf Extruder Shape (File Head)", - "Ultra Strong Stellar Shape for making Files")); - ItemList.White_Dwarf_Shape_Extruder_Saw.set( - addItem( - White_Dwarf_Shape_Extruder_Saw.ID, - "White Dwarf Extruder Shape (Saw Blade)", - "Ultra Strong Stellar Shape for making Saws")); - ItemList.White_Dwarf_Shape_Extruder_Gear.set( - addItem( - White_Dwarf_Shape_Extruder_Gear.ID, - "White Dwarf Extruder Shape (Gear)", - "Ultra Strong Stellar Shape for making Gears")); - ItemList.White_Dwarf_Shape_Extruder_Bottle.set( - addItem( - White_Dwarf_Shape_Extruder_Bottle.ID, - "White Dwarf Extruder Shape (Bottle)", - "Ultra Strong Stellar Shape for making Bottles")); - ItemList.White_Dwarf_Shape_Extruder_Rotor.set( - addItem( - White_Dwarf_Shape_Extruder_Rotor.ID, - "White Dwarf Extruder Shape (Rotor)", - "Ultra Strong Stellar Shape for a Rotor")); - ItemList.White_Dwarf_Shape_Extruder_Small_Gear.set( - addItem( - White_Dwarf_Shape_Extruder_Small_Gear.ID, - "White Dwarf Extruder Shape (Small Gear)", - "Ultra Strong Stellar Shape for a Small Gear")); - ItemList.White_Dwarf_Shape_Extruder_Turbine_Blade.set( - addItem( - White_Dwarf_Shape_Extruder_Turbine_Blade.ID, - "White Dwarf Extruder Shape (Turbine Blade)", - "Ultra Strong Stellar Extruder Shape for a Turbine Blade")); - ItemList.White_Dwarf_Shape_Extruder_ToolHeadDrill.set( - addItem( - White_Dwarf_Shape_Extruder_ToolHeadDrill.ID, - "White Dwarf Extruder Shape (Drill Head)", - "White Dwarf Extruder Shape for a Drill Head")); - registerAllTieredTooltips(); - registerAllAnimatedTooltips(); - initOrePrefixes(); - initOreDictUnificatorEntries(); - registerCovers(); - } - - private void registerAllTieredTooltips() { - registerTieredTooltip(ItemList.NandChip.get(1), ULV); - registerTieredTooltip(ItemList.Circuit_Integrated_Good.get(1), MV); - registerTieredTooltip(ItemList.Circuit_Microprocessor.get(1), LV); - registerTieredTooltip(ItemList.Circuit_Processor.get(1), MV); - registerTieredTooltip(ItemList.Circuit_Nanoprocessor.get(1), HV); - registerTieredTooltip(ItemList.Circuit_Nanocomputer.get(1), EV); - registerTieredTooltip(ItemList.Circuit_Elitenanocomputer.get(1), IV); - registerTieredTooltip(ItemList.Circuit_Quantumprocessor.get(1), EV); - registerTieredTooltip(ItemList.Circuit_Quantumcomputer.get(1), IV); - registerTieredTooltip(ItemList.Circuit_Masterquantumcomputer.get(1), LuV); - registerTieredTooltip(ItemList.Circuit_Quantummainframe.get(1), ZPM); - registerTieredTooltip(ItemList.Circuit_Crystalprocessor.get(1), IV); - registerTieredTooltip(ItemList.Circuit_Crystalcomputer.get(1), LuV); - registerTieredTooltip(ItemList.Circuit_Ultimatecrystalcomputer.get(1), ZPM); - registerTieredTooltip(ItemList.Circuit_Crystalmainframe.get(1), UV); - registerTieredTooltip(ItemList.Circuit_Neuroprocessor.get(1), LuV); - registerTieredTooltip(ItemList.Circuit_Wetwarecomputer.get(1), ZPM); - registerTieredTooltip(ItemList.Circuit_Wetwaresupercomputer.get(1), UV); - registerTieredTooltip(ItemList.Circuit_Wetwaremainframe.get(1), UHV); - registerTieredTooltip(ItemList.Circuit_Bioprocessor.get(1), ZPM); - registerTieredTooltip(ItemList.Circuit_Biowarecomputer.get(1), UV); - registerTieredTooltip(ItemList.Circuit_Biowaresupercomputer.get(1), UHV); - registerTieredTooltip(ItemList.Circuit_Biomainframe.get(1), UEV); - registerTieredTooltip(ItemList.Circuit_OpticalProcessor.get(1), UV); - registerTieredTooltip(ItemList.Circuit_OpticalAssembly.get(1), UHV); - registerTieredTooltip(ItemList.Circuit_OpticalComputer.get(1), UEV); - registerTieredTooltip(ItemList.Circuit_OpticalMainframe.get(1), UIV); - registerTieredTooltip(ItemList.Circuit_ExoticProcessor.get(1), UHV); - registerTieredTooltip(ItemList.Circuit_ExoticAssembly.get(1), UEV); - registerTieredTooltip(ItemList.Circuit_ExoticComputer.get(1), UIV); - registerTieredTooltip(ItemList.Circuit_ExoticMainframe.get(1), UMV); - registerTieredTooltip(ItemList.Circuit_CosmicProcessor.get(1), UEV); - registerTieredTooltip(ItemList.Circuit_CosmicAssembly.get(1), UIV); - registerTieredTooltip(ItemList.Circuit_CosmicComputer.get(1), UMV); - registerTieredTooltip(ItemList.Circuit_CosmicMainframe.get(1), UXV); - registerTieredTooltip(ItemList.Circuit_TranscendentProcessor.get(1), UIV); - registerTieredTooltip(ItemList.Circuit_TranscendentAssembly.get(1), UMV); - registerTieredTooltip(ItemList.Circuit_TranscendentComputer.get(1), UXV); - registerTieredTooltip(ItemList.Circuit_TranscendentMainframe.get(1), MAX); - } - - private void registerAllAnimatedTooltips() { - addItemTooltip(ItemList.Transdimensional_Alignment_Matrix.get(1), GT_Values.AuthorCloud); - } - - private void initOreDictUnificatorEntries() { - GT_OreDictUnificator - .set(OrePrefixes.componentCircuit, Materials.Resistor, ItemList.Circuit_Parts_Resistor.get(1L)); - GT_OreDictUnificator.set(OrePrefixes.componentCircuit, Materials.Diode, ItemList.Circuit_Parts_Diode.get(1L)); - GT_OreDictUnificator - .set(OrePrefixes.componentCircuit, Materials.Transistor, ItemList.Circuit_Parts_Transistor.get(1L)); - GT_OreDictUnificator.set(OrePrefixes.componentCircuit, Materials.Inductor, ItemList.Circuit_Parts_Coil.get(1L)); - GT_OreDictUnificator - .set(OrePrefixes.componentCircuit, Materials.Capacitor, ItemList.Circuit_Parts_Capacitor.get(1L)); - - GT_OreDictUnificator.addAssociation( - OrePrefixes.componentCircuit, - Materials.Resistor, - ItemList.Circuit_Parts_ResistorSMD.get(1L), - true); - GT_OreDictUnificator.addAssociation( - OrePrefixes.componentCircuit, - Materials.Diode, - ItemList.Circuit_Parts_DiodeSMD.get(1L), - true); - GT_OreDictUnificator.addAssociation( - OrePrefixes.componentCircuit, - Materials.Transistor, - ItemList.Circuit_Parts_TransistorSMD.get(1L), - true); - GT_OreDictUnificator.addAssociation( - OrePrefixes.componentCircuit, - Materials.Capacitor, - ItemList.Circuit_Parts_CapacitorSMD.get(1L), - true); - GT_OreDictUnificator.addAssociation( - OrePrefixes.componentCircuit, - Materials.Inductor, - ItemList.Circuit_Parts_InductorSMD.get(1L), - true); - - } - - private void initOrePrefixes() { - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_1.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_2.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_3.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_4.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_5.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_6.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_7.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_8.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_8_Upgraded.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_PRODUCTION.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_PLAINS.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_LIGHT.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_FLOWERING.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_WINTER.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_DRYER.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_AUTOMATION.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HELL.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_POLLEN.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_DESERT.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_COOLER.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_LIFESPAN.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SEAL.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_STABILIZER.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_JUNGLE.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_TERRITORY.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_OCEAN.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SKY.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HEATER.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SIEVE.get(1L)); - OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_UNLIGHT.get(1L)); - } - - private void registerCovers() { - GregTech_API.registerCover( - ItemList.Cover_Metrics_Transmitter.get(1L), - TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_METRICS_TRANSMITTER)), - new GT_Cover_Metrics_Transmitter(TextureFactory.of(OVERLAY_METRICS_TRANSMITTER))); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_UHV.get(1L), - TextureFactory.of(SOLARPANEL_UHV), - new GT_Cover_SolarPanel(2097152)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_UEV.get(1L), - TextureFactory.of(SOLARPANEL_UEV), - new GT_Cover_SolarPanel(8388608)); - GregTech_API.registerCover( - ItemList.Cover_SolarPanel_UIV.get(1L), - TextureFactory.of(SOLARPANEL_UIV), - new GT_Cover_SolarPanel(33554432)); - } - - @Override - public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { - return aDoShowAllItems || (aPrefix.toString() - .toLowerCase() - .contains("nanite")) - || (aPrefix.toString() - .toLowerCase() - .contains("rawore")); - } -} diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java deleted file mode 100644 index 0dab2af2cf..0000000000 --- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java +++ /dev/null @@ -1,352 +0,0 @@ -package gregtech.common.items; - -import java.util.Arrays; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import javax.annotation.Nullable; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidContainerRegistry; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Item; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; - -/** This class holds cells for non-GT fluids. */ -public class GT_MetaGenerated_Item_98 extends GT_MetaGenerated_Item { - - public static GT_MetaGenerated_Item_98 INSTANCE; - - /** - * Registered fluids. - * - *

- * When adding a fluid, don't forget to make sure that GregTech loads after the mod that adds that fluid! - * - *

- * In order to avoid breaking existing worlds, fluids must not have their IDs changed! The only safe modification - * that can be made to this enum is adding new fluids, or removing existing fluids. When removing fluids, maybe - * leave a comment mentioning the old ID, so that we don't re-use it for a new fluid. - */ - public enum FluidCell { - // Next unused ID: 32 - - // GregTech - DRILLING_FLUID(5, "liquid_drillingfluid", CellType.REGULAR), - SQUID_INK(6, "squidink", CellType.SMALL), - BLUE_VITRIOL(22, "solution.bluevitriol", CellType.REGULAR), - NICKEL_SULFATE(23, "solution.nickelsulfate", CellType.REGULAR), - GREEN_VITRIOL(24, "solution.greenvitriol", CellType.REGULAR), - INDIUM_CONCENTRATE(25, "indiumconcentrate", CellType.REGULAR), - LEAD_ZINC_SOLUTION(26, "leadzincsolution", CellType.REGULAR), - - // New Horizons Core Mod - UNKNOWN_NUTRIENT_AGAR(7, "unknownnutrientagar", CellType.REGULAR), - SEAWEED_BROTH(8, "seaweedbroth", CellType.REGULAR), - SUPER_HEAVY_RADOX(28, "superheavyradox", CellType.REGULAR), - HEAVY_RADOX(29, "heavyradox", CellType.REGULAR), - CRACKED_RADOX(30, "crackedradox", CellType.REGULAR), - LIGHT_RADOX(31, "lightradox", CellType.REGULAR), - SUPER_LIGHT_RADOX(9, "superlightradox", CellType.REGULAR), - SODIUM_POTASSIUM(18, "sodiumpotassium", CellType.REGULAR), - ENRICHED_BACTERIAL_SLUDGE(19, "enrichedbacterialsludge", CellType.REGULAR), - FERMENTED_BACTERIAL_SLUDGE(20, "fermentedbacterialsludge", CellType.REGULAR), - POLLUTION(21, "pollution", CellType.REGULAR), - XENOXENE(27, "xenoxene", CellType.REGULAR), - - // BartWorks - ENZYME_SOLUTION(10, "enzymessollution", CellType.REGULAR), - ESCHERICHIA_COLI_FLUID(11, "escherichiakolifluid", CellType.REGULAR), - PENICILLIN(12, "penicillin", CellType.REGULAR), - FLUORESCENT_DNA(13, "fluorecentddna", CellType.REGULAR), - POLYMERASE(17, "polymerase", CellType.REGULAR), - - // Good Generator - COMBUSTION_PROMOTER(14, "combustionpromotor", CellType.REGULAR), - - // Galacticraft - BACTERIAL_SLUDGE(1, "bacterialsludge", CellType.REGULAR), - - // Railcraft - STEAM(0, "steam", CellType.REGULAR), - - // Gendustry - BACTERIA(15, "binnie.bacteria", CellType.REGULAR), - MUTAGEN(2, "mutagen", CellType.REGULAR), - LIQUID_DNA(16, "liquiddna", CellType.REGULAR), - - // Tinker's Construct - LIQUID_ENDER(3, "ender", CellType.REGULAR), - - // Hardcore Ender Expansion - ENDER_GOO(4, "endergoo", CellType.REGULAR),; - - private final int mId; - /** This is the Forge internal fluid name. */ - private final String mfluidName; - - private final CellType mType; - - @Nullable - private ItemStack mStack; - - FluidCell(int aId, String aFluidName, CellType aType) { - mId = aId; - mfluidName = aFluidName; - mType = aType; - } - - public int getId() { - return mId; - } - - public String getFluidName() { - return mfluidName; - } - - public CellType getDisplayType() { - return mType; - } - - /** - * Get a copy of this stack with stack size 1. - *

- * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid. - */ - public ItemStack get() { - trySetStack(); - return GT_Utility.copy(mStack); - } - - /** - * Get a copy of this cell WITHOUT copy. - *

- * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid. - *

- * Use with caution. - */ - public ItemStack getNoCopy() { - trySetStack(); - return mStack; - } - - /** - * Get a copy of this cell with specified stack size. - *

- * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid. - */ - public ItemStack get(int aStackSize) { - trySetStack(); - return GT_Utility.copyAmount(aStackSize, mStack); - } - - private void trySetStack() { - if (mStack == null) { - mStack = new ItemStack(GT_MetaGenerated_Item_98.INSTANCE, 1, mId); - } - } - } - - /** Cell type specifies the cell capacity, appearance, and item name format. */ - private enum CellType { - - REGULAR(1_000, OrePrefixes.cell), - SMALL(144, OrePrefixes.cell), - MOLTEN(144, OrePrefixes.cellMolten), - PLASMA(1_000, OrePrefixes.cellPlasma); - - private final int capacity; - private final OrePrefixes prefix; - - CellType(int capacity, OrePrefixes prefix) { - this.capacity = capacity; - this.prefix = prefix; - } - } - - /** Struct class holding data that we need to properly handle a registered fluid cell item. */ - private static class RegisteredFluidData { - - private final short[] rgba; - private final IIconContainer iconContainer; - - private RegisteredFluidData(short[] rgba, IIconContainer iconContainer) { - this.rgba = rgba; - this.iconContainer = iconContainer; - } - } - - /** - * Map of ID to registered fluid data. - * - *

- * Only contains IDs that were successfully registered. - */ - private final Map registeredFluidDataMap; - - private final EnumMap iconContainerMap; - - private GT_MetaGenerated_Item_98() { - // For some reason, fluid cells will be rendered only if the metadata ID is less than the - // offset. So we will specify maximum offset here. - // See: GT_MetaGenerated_Item_Renderer.java - super("metaitem.98", (short) 32766, (short) 0); - - registeredFluidDataMap = new HashMap<>(); - iconContainerMap = new EnumMap<>(CellType.class); - } - - /** - * Loading needs to happen after the fluids we need have been registered, which means during post-load. However, - * cell icons seem to be deleted some time between load and post-load, so we must pre-cache them. - */ - public static synchronized void preInit() { - if (INSTANCE == null) INSTANCE = new GT_MetaGenerated_Item_98(); - - // We'll just steal the icons from Water. They are all the same anyway (except _NULL is broken for cells). - for (CellType cellType : CellType.values()) { - IIconContainer iconContainer = Materials.Water.mIconSet.mTextures[cellType.prefix.mTextureIndex]; - INSTANCE.iconContainerMap.put(cellType, iconContainer); - } - } - - public static synchronized void init() { - INSTANCE.createAllItems(); - INSTANCE.registerOreDict(); - } - - private void createAllItems() { - for (FluidCell tCell : FluidCell.values()) { - tryToInitialize(tCell); - } - - // We're not going to use these BitSets, so clear them to save memory. - mEnabledItems.clear(); - mVisibleItems.clear(); - } - - private void tryToInitialize(FluidCell aCell) { - final boolean isStackAlreadySet = aCell.mStack != null; - - int id = aCell.getId(); - String fluidName = aCell.getFluidName(); - CellType cellType = aCell.getDisplayType(); - - // We'll check for ID uniqueness. Better to throw an exception than silently overwrite some - // fluid cells with other fluids due to ID collision. - if (registeredFluidDataMap.containsKey(id)) { - throw new IllegalStateException("Got ID collision for ID: " + id); - } - - aCell.trySetStack(); - - Fluid fluid = FluidRegistry.getFluid(fluidName); - if (fluid == null) { - // The fluid is not guaranteed to exist. - // These fluids are non-GT fluids, so the mod may not be present. - if (isStackAlreadySet) { - throw new RuntimeException( - "Cell item for fluid " + fluidName - + " has already been created, but the fluid doesn't exist during postload"); - } else { - // fluid doesn't exist and this item has not been referenced - return; - } - } - - FluidStack fluidStack = new FluidStack(fluid, cellType.capacity); - - ItemStack emptyCell = ItemList.Cell_Empty.get(1L); - FluidContainerRegistry - .registerFluidContainer(new FluidContainerRegistry.FluidContainerData(fluidStack, aCell.mStack, emptyCell)); - - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(aCell.mStack) + ".name", - cellType.prefix.mLocalizedMaterialPre + fluid.getLocalizedName(fluidStack) - + cellType.prefix.mLocalizedMaterialPost); - - int color = fluid.getColor(); - short[] rgba = GT_Util.getRGBaArray(color); - - registeredFluidDataMap.put(id, new RegisteredFluidData(rgba, iconContainerMap.get(cellType))); - } - - private void registerOreDict() { - // The GregTech ore dictionary requires an entry in the Materials enum, and since the whole - // point of this class is to add cell items for non-GregTech fluids, the vast majority of - // cell items won't have an associated material. So only a rare few cell items will need to - // be registered. - - // Register IC2 steam cell and Railcraft steam cell as synonyms. - // There is no steam material, so we'll use Water.cellMolten instead. - GT_OreDictUnificator.add(OrePrefixes.cellMolten, Materials.Water, GT_ModHandler.getIC2Item("steamCell", 1L)); - GT_OreDictUnificator.add(OrePrefixes.cellMolten, Materials.Water, FluidCell.STEAM.getNoCopy()); - } - - @Override - public short[] getRGBa(ItemStack aStack) { - RegisteredFluidData fluidData = registeredFluidDataMap.get(aStack.getItemDamage()); - if (fluidData == null) { - return Materials._NULL.mRGBa; - } - - return fluidData.rgba; - } - - @Override - public ItemStack getContainerItem(ItemStack aStack) { - return ItemList.Cell_Empty.get(1L); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { - Arrays.stream(FluidCell.values()) - .filter(fluid -> FluidRegistry.getFluid(fluid.getFluidName()) != null) - .map(FluidCell::get) - .filter(Objects::nonNull) - .forEach(aList::add); - } - - @Override - public final IIcon getIconFromDamage(int aMetaData) { - IIconContainer iconContainer = getIconContainer(aMetaData); - if (iconContainer != null) { - return iconContainer.getIcon(); - } - return null; - } - - @Override - public IIconContainer getIconContainer(int aMetaData) { - RegisteredFluidData fluidData = registeredFluidDataMap.get(aMetaData); - if (fluidData == null) { - return null; - } - return fluidData.iconContainer; - } - - @Override - public int getItemStackLimit(ItemStack aStack) { - return 64; - } -} diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java deleted file mode 100644 index 08d6f23164..0000000000 --- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java +++ /dev/null @@ -1,214 +0,0 @@ -package gregtech.common.items; - -import static gregtech.api.enums.GT_Values.M; -import static gregtech.api.enums.OrePrefixes.cellMolten; - -import java.util.BitSet; -import java.util.List; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import com.google.common.collect.ImmutableList; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SubTag; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Item; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_OreDictUnificator; - -public class GT_MetaGenerated_Item_99 extends GT_MetaGenerated_Item { - - public static GT_MetaGenerated_Item_99 INSTANCE; - - /** - * Ore prefixes appear in this list in the order in which they will be assigned ID blocks. - * - *

- * In order to avoid breaking existing worlds, the entries in this list must not be re-ordered! The only safe - * modification that can be made to this list is adding new entries to the end. - */ - private static final ImmutableList CRACKED_CELL_TYPES = ImmutableList.of( - OrePrefixes.cellHydroCracked1, - OrePrefixes.cellHydroCracked2, - OrePrefixes.cellHydroCracked3, - OrePrefixes.cellSteamCracked1, - OrePrefixes.cellSteamCracked2, - OrePrefixes.cellSteamCracked3); - - private static final int NUM_CRACKED_CELL_TYPES = CRACKED_CELL_TYPES.size(); - - /** - * Assignment of metadata IDs: 0 - 999: Molten cells 10_000 - 15_999: Cracked fluid cells (# IDs used is - * NUM_CRACKED_CELL_TYPES * 1_000; update this if you add any) - */ - private final BitSet enabled = new BitSet(); - - public GT_MetaGenerated_Item_99() { - super("metaitem.99", (short) (10_000 + NUM_CRACKED_CELL_TYPES * 1_000), (short) 0); - - INSTANCE = this; - - for (Materials tMaterial : GregTech_API.sGeneratedMaterials) { - if (tMaterial == null || tMaterial.mMetaItemSubID < 0 || tMaterial.mMetaItemSubID >= 1_000) { - continue; - } - - if ((tMaterial.contains(SubTag.SMELTING_TO_FLUID)) && (!tMaterial.contains(SubTag.NO_SMELTING)) - && !tMaterial.contains(SubTag.SMELTING_TO_GEM)) { - registerMolten(tMaterial, tMaterial.mMetaItemSubID); - if (tMaterial.mSmeltInto != tMaterial && tMaterial.mSmeltInto.mMetaItemSubID >= 0 - && tMaterial.mSmeltInto.mMetaItemSubID < 1_000) { - registerMolten(tMaterial.mSmeltInto, tMaterial.mSmeltInto.mMetaItemSubID); - } - } - - if (tMaterial.canBeCracked()) { - registerCracked(tMaterial, tMaterial.mMetaItemSubID); - } - } - - // We're not going to use these BitSets, so clear them to save memory. - mEnabledItems.clear(); - mVisibleItems.clear(); - } - - private void registerMolten(Materials tMaterial, int i) { - ItemStack tStack = new ItemStack(this, 1, i); - enabled.set(i); - - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".name", - cellMolten.getDefaultLocalNameFormatForItem(tMaterial)); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".tooltip", - tMaterial.getToolTip(cellMolten.mMaterialAmount / M)); - - if (cellMolten.mIsUnificatable) { - GT_OreDictUnificator.set(cellMolten, tMaterial, tStack); - } else { - GT_OreDictUnificator.registerOre(cellMolten.get(tMaterial), tStack); - } - } - - private void registerCracked(Materials tMaterial, int i) { - int offset = 10_000; - for (OrePrefixes prefix : CRACKED_CELL_TYPES) { - ItemStack tStack = new ItemStack(this, 1, offset + i); - enabled.set(offset + i); - - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".name", - prefix.getDefaultLocalNameFormatForItem(tMaterial)); - GT_LanguageManager.addStringLocalization( - getUnlocalizedName(tStack) + ".tooltip", - tMaterial.getToolTip(prefix.mMaterialAmount / M)); - - if (prefix.mIsUnificatable) { - GT_OreDictUnificator.set(prefix, tMaterial, tStack); - } else { - GT_OreDictUnificator.registerOre(prefix.get(tMaterial), tStack); - } - - offset += 1_000; - } - } - - /** Returns null for item damage out of bounds. */ - private Materials getMaterial(int damage) { - if (damage < 0) { - return null; - } - return GregTech_API.sGeneratedMaterials[damage % 1_000]; - } - - /** Returns null for item damage out of bounds. */ - private OrePrefixes getOrePrefix(int damage) { - if (damage < 0) { - return null; - } else if (damage < 1_000) { - return cellMolten; - } else if (damage >= 10_000 && damage < 10_000 + (NUM_CRACKED_CELL_TYPES * 1_000)) { - return CRACKED_CELL_TYPES.get((damage / 1_000) - 10); - } - return null; - } - - @Override - public short[] getRGBa(ItemStack aStack) { - OrePrefixes prefix = getOrePrefix(aStack.getItemDamage()); - Materials material = getMaterial(aStack.getItemDamage()); - if (material == null) { - material = Materials._NULL; - } - - if (prefix == cellMolten) { - return material.mMoltenRGBa; - } else { - return material.mRGBa; - } - } - - @Override - public String getItemStackDisplayName(ItemStack aStack) { - String aName = super.getItemStackDisplayName(aStack); - Materials material = getMaterial(aStack.getItemDamage()); - if (material != null) { - return material.getLocalizedNameForItem(aName); - } - return aName; - } - - @Override - public ItemStack getContainerItem(ItemStack aStack) { - OrePrefixes prefix = getOrePrefix(aStack.getItemDamage()); - if (prefix != null) { - return prefix.mContainerItem; - } - return null; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { - enabled.stream() - .mapToObj(i -> new ItemStack(this, 1, i)) - .forEach(aList::add); - } - - @Override - public final IIcon getIconFromDamage(int aMetaData) { - IIconContainer iconContainer = getIconContainer(aMetaData); - if (iconContainer != null) { - return iconContainer.getIcon(); - } - return null; - } - - @Override - public IIconContainer getIconContainer(int aMetaData) { - Materials material = getMaterial(aMetaData); - OrePrefixes prefix = getOrePrefix(aMetaData); - if (material != null && prefix != null) { - return material.mIconSet.mTextures[prefix.mTextureIndex]; - } - return null; - } - - @Override - public int getItemStackLimit(ItemStack aStack) { - OrePrefixes prefix = getOrePrefix(aStack.getItemDamage()); - if (prefix != null) { - return prefix.mDefaultStackSize; - } else { - return 64; - } - } -} diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java deleted file mode 100644 index f8777dcf58..0000000000 --- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java +++ /dev/null @@ -1,746 +0,0 @@ -package gregtech.common.items; - -import static gregtech.common.items.ID_MetaTool_01.AXE; -import static gregtech.common.items.ID_MetaTool_01.BRANCHCUTTER; -import static gregtech.common.items.ID_MetaTool_01.BUTCHERYKNIFE; -import static gregtech.common.items.ID_MetaTool_01.BUZZSAW_HV; -import static gregtech.common.items.ID_MetaTool_01.BUZZSAW_LV; -import static gregtech.common.items.ID_MetaTool_01.BUZZSAW_MV; -import static gregtech.common.items.ID_MetaTool_01.CHAINSAW_HV; -import static gregtech.common.items.ID_MetaTool_01.CHAINSAW_LV; -import static gregtech.common.items.ID_MetaTool_01.CHAINSAW_MV; -import static gregtech.common.items.ID_MetaTool_01.CROWBAR; -import static gregtech.common.items.ID_MetaTool_01.DRILL_HV; -import static gregtech.common.items.ID_MetaTool_01.DRILL_LV; -import static gregtech.common.items.ID_MetaTool_01.DRILL_MV; -import static gregtech.common.items.ID_MetaTool_01.FILE; -import static gregtech.common.items.ID_MetaTool_01.HARDHAMMER; -import static gregtech.common.items.ID_MetaTool_01.HOE; -import static gregtech.common.items.ID_MetaTool_01.JACKHAMMER; -import static gregtech.common.items.ID_MetaTool_01.KNIFE; -import static gregtech.common.items.ID_MetaTool_01.MORTAR; -import static gregtech.common.items.ID_MetaTool_01.PICKAXE; -import static gregtech.common.items.ID_MetaTool_01.PLOW; -import static gregtech.common.items.ID_MetaTool_01.PLUNGER; -import static gregtech.common.items.ID_MetaTool_01.POCKET_BRANCHCUTTER; -import static gregtech.common.items.ID_MetaTool_01.POCKET_FILE; -import static gregtech.common.items.ID_MetaTool_01.POCKET_KNIFE; -import static gregtech.common.items.ID_MetaTool_01.POCKET_MULTITOOL; -import static gregtech.common.items.ID_MetaTool_01.POCKET_SAW; -import static gregtech.common.items.ID_MetaTool_01.POCKET_SCREWDRIVER; -import static gregtech.common.items.ID_MetaTool_01.POCKET_WIRECUTTER; -import static gregtech.common.items.ID_MetaTool_01.ROLLING_PIN; -import static gregtech.common.items.ID_MetaTool_01.SAW; -import static gregtech.common.items.ID_MetaTool_01.SCOOP; -import static gregtech.common.items.ID_MetaTool_01.SCREWDRIVER; -import static gregtech.common.items.ID_MetaTool_01.SCREWDRIVER_HV; -import static gregtech.common.items.ID_MetaTool_01.SCREWDRIVER_LV; -import static gregtech.common.items.ID_MetaTool_01.SCREWDRIVER_MV; -import static gregtech.common.items.ID_MetaTool_01.SENSE; -import static gregtech.common.items.ID_MetaTool_01.SHOVEL; -import static gregtech.common.items.ID_MetaTool_01.SOFTMALLET; -import static gregtech.common.items.ID_MetaTool_01.SOLDERING_IRON_HV; -import static gregtech.common.items.ID_MetaTool_01.SOLDERING_IRON_LV; -import static gregtech.common.items.ID_MetaTool_01.SOLDERING_IRON_MV; -import static gregtech.common.items.ID_MetaTool_01.SWORD; -import static gregtech.common.items.ID_MetaTool_01.TURBINE; -import static gregtech.common.items.ID_MetaTool_01.TURBINE_HUGE; -import static gregtech.common.items.ID_MetaTool_01.TURBINE_LARGE; -import static gregtech.common.items.ID_MetaTool_01.TURBINE_SMALL; -import static gregtech.common.items.ID_MetaTool_01.UNIVERSALSPADE; -import static gregtech.common.items.ID_MetaTool_01.WIRECUTTER; -import static gregtech.common.items.ID_MetaTool_01.WRENCH; -import static gregtech.common.items.ID_MetaTool_01.WRENCH_HV; -import static gregtech.common.items.ID_MetaTool_01.WRENCH_LV; -import static gregtech.common.items.ID_MetaTool_01.WRENCH_MV; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.TC_Aspects; -import gregtech.api.enums.ToolDictNames; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.common.tools.GT_Tool_Axe; -import gregtech.common.tools.GT_Tool_BranchCutter; -import gregtech.common.tools.GT_Tool_ButcheryKnife; -import gregtech.common.tools.GT_Tool_BuzzSaw; -import gregtech.common.tools.GT_Tool_Chainsaw_HV; -import gregtech.common.tools.GT_Tool_Chainsaw_LV; -import gregtech.common.tools.GT_Tool_Chainsaw_MV; -import gregtech.common.tools.GT_Tool_Crowbar; -import gregtech.common.tools.GT_Tool_Drill_HV; -import gregtech.common.tools.GT_Tool_Drill_LV; -import gregtech.common.tools.GT_Tool_Drill_MV; -import gregtech.common.tools.GT_Tool_File; -import gregtech.common.tools.GT_Tool_HardHammer; -import gregtech.common.tools.GT_Tool_Hoe; -import gregtech.common.tools.GT_Tool_JackHammer; -import gregtech.common.tools.GT_Tool_Knife; -import gregtech.common.tools.GT_Tool_Mortar; -import gregtech.common.tools.GT_Tool_Pickaxe; -import gregtech.common.tools.GT_Tool_Plow; -import gregtech.common.tools.GT_Tool_Plunger; -import gregtech.common.tools.GT_Tool_RollingPin; -import gregtech.common.tools.GT_Tool_Saw; -import gregtech.common.tools.GT_Tool_Scoop; -import gregtech.common.tools.GT_Tool_Screwdriver; -import gregtech.common.tools.GT_Tool_Screwdriver_LV; -import gregtech.common.tools.GT_Tool_Sense; -import gregtech.common.tools.GT_Tool_Shovel; -import gregtech.common.tools.GT_Tool_SoftHammer; -import gregtech.common.tools.GT_Tool_Soldering_Iron; -import gregtech.common.tools.GT_Tool_Sword; -import gregtech.common.tools.GT_Tool_Turbine_Huge; -import gregtech.common.tools.GT_Tool_Turbine_Large; -import gregtech.common.tools.GT_Tool_Turbine_Normal; -import gregtech.common.tools.GT_Tool_Turbine_Small; -import gregtech.common.tools.GT_Tool_UniversalSpade; -import gregtech.common.tools.GT_Tool_WireCutter; -import gregtech.common.tools.GT_Tool_Wrench; -import gregtech.common.tools.GT_Tool_Wrench_HV; -import gregtech.common.tools.GT_Tool_Wrench_LV; -import gregtech.common.tools.GT_Tool_Wrench_MV; -import gregtech.common.tools.pocket.GT_Tool_Pocket_BranchCutter; -import gregtech.common.tools.pocket.GT_Tool_Pocket_File; -import gregtech.common.tools.pocket.GT_Tool_Pocket_Knife; -import gregtech.common.tools.pocket.GT_Tool_Pocket_Multitool; -import gregtech.common.tools.pocket.GT_Tool_Pocket_Saw; -import gregtech.common.tools.pocket.GT_Tool_Pocket_Screwdriver; -import gregtech.common.tools.pocket.GT_Tool_Pocket_WireCutter; - -public class GT_MetaGenerated_Tool_01 extends GT_MetaGenerated_Tool { - - public static GT_MetaGenerated_Tool_01 INSTANCE; - - public GT_MetaGenerated_Tool_01() { - super("metatool.01"); - INSTANCE = this; - addTool( - SWORD.ID, - "Sword", - "", - new GT_Tool_Sword(), - ToolDictNames.craftingToolSword, - ToolDictNames.craftingToolBlade, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 4L)); - addTool( - PICKAXE.ID, - "Pickaxe", - "", - new GT_Tool_Pickaxe(), - ToolDictNames.craftingToolPickaxe, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L)); - addTool( - SHOVEL.ID, - "Shovel", - "", - new GT_Tool_Shovel(), - ToolDictNames.craftingToolShovel, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L)); - addTool( - AXE.ID, - "Axe", - "", - new GT_Tool_Axe(), - ToolDictNames.craftingToolAxe, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - addTool( - HOE.ID, - "Hoe", - "", - new GT_Tool_Hoe(), - ToolDictNames.craftingToolHoe, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 4L)); - addTool( - SAW.ID, - "Saw", - "Can also harvest Ice", - new GT_Tool_Saw(), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - GregTech_API.registerTool( - addTool( - HARDHAMMER.ID, - "Hammer", - "Crushes Ores instead of harvesting them", - new GT_Tool_HardHammer(), - ToolDictNames.craftingToolHardHammer, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sHardHammerList); - GregTech_API.registerTool( - addTool( - SOFTMALLET.ID, - "Soft Mallet", - "", - new GT_Tool_SoftHammer(), - ToolDictNames.craftingToolSoftHammer, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 4L)), - GregTech_API.sSoftHammerList); - GregTech_API.registerTool( - addTool( - WRENCH.ID, - "Wrench", - "Hold Leftclick to dismantle Machines", - new GT_Tool_Wrench(), - ToolDictNames.craftingToolWrench, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sWrenchList); - addTool( - FILE.ID, - "File", - "", - new GT_Tool_File(), - ToolDictNames.craftingToolFile, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)); - GregTech_API.registerTool( - addTool( - CROWBAR.ID, - "Crowbar", - "Dismounts Covers and Rotates Rails", - new GT_Tool_Crowbar(), - ToolDictNames.craftingToolCrowbar, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 2L)), - GregTech_API.sCrowbarList); - GregTech_API.registerTool( - addTool( - SCREWDRIVER.ID, - "Screwdriver", - "Adjusts Covers and Machines", - new GT_Tool_Screwdriver(), - ToolDictNames.craftingToolScrewdriver, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sScrewdriverList); - addTool( - MORTAR.ID, - "Mortar", - "", - new GT_Tool_Mortar(), - ToolDictNames.craftingToolMortar, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L)); - GregTech_API.registerTool( - addTool( - WIRECUTTER.ID, - "Wire Cutter", - "", - new GT_Tool_WireCutter(), - ToolDictNames.craftingToolWireCutter, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sWireCutterList); - addTool( - SCOOP.ID, - "Scoop", - "", - new GT_Tool_Scoop(), - ToolDictNames.craftingToolScoop, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.BESTIA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PANNUS, 2L)); - addTool( - BRANCHCUTTER.ID, - "Branch Cutter", - "", - new GT_Tool_BranchCutter(), - ToolDictNames.craftingToolBranchCutter, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L)); - GregTech_API.registerTool( - addTool( - UNIVERSALSPADE.ID, - "Universal Spade", - "", - new GT_Tool_UniversalSpade(), - ToolDictNames.craftingToolBlade, - ToolDictNames.craftingToolShovel, - ToolDictNames.craftingToolCrowbar, - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L)), - GregTech_API.sCrowbarList); - addTool( - KNIFE.ID, - "Knife", - "", - new GT_Tool_Knife(), - ToolDictNames.craftingToolBlade, - ToolDictNames.craftingToolKnife, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 2L)); - addTool( - BUTCHERYKNIFE.ID, - "Butchery Knife", - "Has a slow Attack Rate", - new GT_Tool_ButcheryKnife(), - ToolDictNames.craftingToolBlade, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 4L)); - - addTool( - SENSE.ID, - "Sense", - "Because a Scythe doesn't make Sense", - new GT_Tool_Sense(), - ToolDictNames.craftingToolBlade, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MORTUUS, 2L)); - addTool( - PLOW.ID, - "Plow", - "Used to get rid of Snow", - new GT_Tool_Plow(), - ToolDictNames.craftingToolPlow, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 2L)); - addTool( - PLUNGER.ID, - "Plunger", - "", - new GT_Tool_Plunger(), - ToolDictNames.craftingToolPlunger, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L)); - addTool( - ROLLING_PIN.ID, - "Rolling Pin", - "", - new GT_Tool_RollingPin(), - ToolDictNames.craftingToolRollingPin, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 4L)); - - addTool( - DRILL_LV.ID, - "Drill (LV)", - "", - new GT_Tool_Drill_LV(), - ToolDictNames.craftingToolMiningDrill, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L)); - addTool( - DRILL_MV.ID, - "Drill (MV)", - "", - new GT_Tool_Drill_MV(), - ToolDictNames.craftingToolMiningDrill, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L)); - addTool( - DRILL_HV.ID, - "Drill (HV)", - "", - new GT_Tool_Drill_HV(), - ToolDictNames.craftingToolMiningDrill, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L)); - addTool( - CHAINSAW_LV.ID, - "Chainsaw (LV)", - "Can also harvest Ice", - new GT_Tool_Chainsaw_LV(), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - addTool( - CHAINSAW_MV.ID, - "Chainsaw (MV)", - "Can also harvest Ice", - new GT_Tool_Chainsaw_MV(), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - addTool( - CHAINSAW_HV.ID, - "Chainsaw (HV)", - "Can also harvest Ice", - new GT_Tool_Chainsaw_HV(), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - GregTech_API.registerTool( - addTool( - WRENCH_LV.ID, - "Wrench (LV)", - "Hold Left Button to dismantle Machines", - new GT_Tool_Wrench_LV(), - ToolDictNames.craftingToolWrench, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sWrenchList); - GregTech_API.registerTool( - addTool( - WRENCH_MV.ID, - "Wrench (MV)", - "Hold Left Button to dismantle Machines", - new GT_Tool_Wrench_MV(), - ToolDictNames.craftingToolWrench, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sWrenchList); - GregTech_API.registerTool( - addTool( - WRENCH_HV.ID, - "Wrench (HV)", - "Hold Left Button to dismantle Machines", - new GT_Tool_Wrench_HV(), - ToolDictNames.craftingToolWrench, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sWrenchList); - GregTech_API.registerTool( - addTool( - JACKHAMMER.ID, - "JackHammer (HV)", - "Breaks Rocks into pieces", - new GT_Tool_JackHammer(), - ToolDictNames.craftingToolJackHammer, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L)), - GregTech_API.sJackhammerList); - addTool( - BUZZSAW_LV.ID, - "Buzzsaw (LV)", - "Not suitable for harvesting Blocks", - new GT_Tool_BuzzSaw(), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - addTool( - BUZZSAW_MV.ID, - "Buzzsaw (MV)", - "Not suitable for harvesting Blocks", - new GT_Tool_BuzzSaw(), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - addTool( - BUZZSAW_HV.ID, - "Buzzsaw (HV)", - "Not suitable for harvesting Blocks", - new GT_Tool_BuzzSaw(), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L)); - GregTech_API.registerTool( - addTool( - SCREWDRIVER_LV.ID, - "Screwdriver (LV)", - "Adjusts Covers and Machines", - new GT_Tool_Screwdriver_LV(), - ToolDictNames.craftingToolScrewdriver, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sScrewdriverList); - GregTech_API.registerTool( - addTool( - SCREWDRIVER_MV.ID, - "Screwdriver (MV)", - "Adjusts Covers and Machines", - new GT_Tool_Screwdriver_LV(), - ToolDictNames.craftingToolScrewdriver, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sScrewdriverList); - GregTech_API.registerTool( - addTool( - SCREWDRIVER_HV.ID, - "Screwdriver (HV)", - "Adjusts Covers and Machines", - new GT_Tool_Screwdriver_LV(), - ToolDictNames.craftingToolScrewdriver, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sScrewdriverList); - GregTech_API.registerTool( - addTool( - SOLDERING_IRON_LV.ID, - "Soldering Iron (LV)", - "Fixes burned out Circuits. Needs soldering materials in inventory.", - new GT_Tool_Soldering_Iron(), - ToolDictNames.craftingToolSolderingIron, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sSolderingToolList); - GregTech_API.registerTool( - addTool( - SOLDERING_IRON_MV.ID, - "Soldering Iron (MV)", - "Fixes burned out Circuits. Needs soldering materials in inventory.", - new GT_Tool_Soldering_Iron(), - ToolDictNames.craftingToolSolderingIron, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sSolderingToolList); - GregTech_API.registerTool( - addTool( - SOLDERING_IRON_HV.ID, - "Soldering Iron (HV)", - "Fixes burned out Circuits. Needs soldering materials in inventory.", - new GT_Tool_Soldering_Iron(), - ToolDictNames.craftingToolSolderingIron, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), - GregTech_API.sSolderingToolList); - - addTool( - TURBINE_SMALL.ID, - "Small Turbine", - "Turbine Rotors for your power station", - new GT_Tool_Turbine_Small()); - addTool(TURBINE.ID, "Turbine", "Turbine Rotors for your power station", new GT_Tool_Turbine_Normal()); - addTool( - TURBINE_LARGE.ID, - "Large Turbine", - "Turbine Rotors for your power station", - new GT_Tool_Turbine_Large()); - addTool(TURBINE_HUGE.ID, "Huge Turbine", "Turbine Rotors for your power station", new GT_Tool_Turbine_Huge()); - - addTool( - POCKET_MULTITOOL.ID, - "Pocket Multitool", - "6 useful Tools in one!", - new GT_Tool_Pocket_Multitool(POCKET_KNIFE.ID), - null, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)); - addTool( - POCKET_KNIFE.ID, - "Pocket Multitool (Knife)", - "", - new GT_Tool_Pocket_Knife(POCKET_SAW.ID), - ToolDictNames.craftingToolKnife, - ToolDictNames.craftingToolBlade, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)); - addTool( - POCKET_SAW.ID, - "Pocket Multitool (Saw)", - "Can also harvest Ice", - new GT_Tool_Pocket_Saw(POCKET_FILE.ID), - ToolDictNames.craftingToolSaw, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)); - addTool( - POCKET_FILE.ID, - "Pocket Multitool (File)", - "", - new GT_Tool_Pocket_File(POCKET_SCREWDRIVER.ID), - ToolDictNames.craftingToolFile, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)); - GregTech_API.registerTool( - addTool( - POCKET_SCREWDRIVER.ID, - "Pocket Multitool (Screwdriver)", - "Adjusts Covers and Machines", - new GT_Tool_Pocket_Screwdriver(POCKET_WIRECUTTER.ID), - ToolDictNames.craftingToolScrewdriver, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)), - GregTech_API.sScrewdriverList); - GregTech_API.registerTool( - addTool( - POCKET_WIRECUTTER.ID, - "Pocket Multitool (Wire Cutter)", - "", - new GT_Tool_Pocket_WireCutter(POCKET_BRANCHCUTTER.ID), - ToolDictNames.craftingToolWireCutter, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)), - GregTech_API.sWireCutterList); - addTool( - POCKET_BRANCHCUTTER.ID, - "Pocket Multitool (Branch Cutter)", - "", - new GT_Tool_Pocket_BranchCutter(POCKET_MULTITOOL.ID), - ToolDictNames.craftingToolBranchCutter, - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6), - new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)); - initCraftingShapedRecipes(); - initCraftingShapelessRecipes(); - } - - private void initCraftingShapelessRecipes() { - GT_ModHandler.addShapelessCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.coal, 1) }); - GT_ModHandler.addShapelessCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Blocks.clay, 1) }); - GT_ModHandler.addShapelessCraftingRecipe( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.wheat, 1) }); - GT_ModHandler.addShapelessCraftingRecipe( - new ItemStack(Items.flint, 1), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Blocks.gravel, 1) }); - GT_ModHandler.addShapelessCraftingRecipe( - new ItemStack(Items.blaze_powder, 2), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.blaze_rod, 1) }); - } - - private void initCraftingShapedRecipes() { - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Flint, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', new ItemStack(Items.flint, 1), 'S', OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Bronze, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Bronze), 'S', OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Iron, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Iron), 'S', OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Steel, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Steel), 'S', OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.WroughtIron, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.WroughtIron), 'S', - OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.RedSteel, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.RedSteel), 'S', - OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.BlueSteel, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlueSteel), 'S', - OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.BlackSteel, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlackSteel), 'S', - OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.DamascusSteel, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.DamascusSteel), 'S', - OrePrefixes.stone }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Thaumium, Materials.Stone, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Thaumium), 'S', - OrePrefixes.stone }); - - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.Wood, Materials.Wood, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " S", " I ", "S f", 'I', OrePrefixes.plank.get(Materials.Wood), 'S', - OrePrefixes.stick.get(Materials.Wood) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.Plastic, Materials.Plastic, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Plastic), 'S', - OrePrefixes.stick.get(Materials.Plastic) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.Aluminium, Materials.Aluminium, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Aluminium), 'S', - OrePrefixes.stick.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.StainlessSteel, Materials.StainlessSteel, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.StainlessSteel), 'S', - OrePrefixes.stick.get(Materials.StainlessSteel) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.IronWood, Materials.IronWood, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.IronWood), 'S', - OrePrefixes.stick.get(Materials.IronWood) }); - - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(SWORD.ID, 1, Materials.Flint, Materials.Wood, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "F", "F", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', - new ItemStack(Items.flint, 1) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(PICKAXE.ID, 1, Materials.Flint, Materials.Wood, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "FFF", " S ", " S ", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', - new ItemStack(Items.flint, 1) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(SHOVEL.ID, 1, Materials.Flint, Materials.Wood, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "F", "S", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', - new ItemStack(Items.flint, 1) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(AXE.ID, 1, Materials.Flint, Materials.Wood, null), - GT_ModHandler.RecipeBits.MIRRORED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "FF", "FS", " S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', - new ItemStack(Items.flint, 1) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(HOE.ID, 1, Materials.Flint, Materials.Wood, null), - GT_ModHandler.RecipeBits.MIRRORED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "FF", " S", " S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', - new ItemStack(Items.flint, 1) }); - GT_ModHandler.addCraftingRecipe( - INSTANCE.getToolWithStats(KNIFE.ID, 1, Materials.Flint, Materials.Wood, null), - GT_ModHandler.RecipeBits.NOT_REMOVABLE, - new Object[] { "F", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', new ItemStack(Items.flint, 1) }); - } -} diff --git a/src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java b/src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java deleted file mode 100644 index b2fd104917..0000000000 --- a/src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java +++ /dev/null @@ -1,54 +0,0 @@ -package gregtech.common.items; - -import net.minecraft.item.ItemStack; - -import gregtech.api.items.GT_Generic_Item; -import ic2.api.reactor.IReactor; -import ic2.api.reactor.IReactorComponent; - -public class GT_NeutronReflector_Item extends GT_Generic_Item implements IReactorComponent { - - public GT_NeutronReflector_Item(String aUnlocalized, String aEnglish, int aMaxDamage) { - super(aUnlocalized, aEnglish, "Undestructable"); - this.setMaxStackSize(64); - this.setMaxDamage(aMaxDamage); - } - - @Override - public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, - int pulseX, int pulseY, boolean heatrun) { - if (!heatrun) { - ((IReactorComponent) pulsingStack.getItem()) - .acceptUraniumPulse(reactor, pulsingStack, yourStack, pulseX, pulseY, youX, youY, heatrun); - } - return true; - } - - @Override - public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) { - return false; - } - - @Override - public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) { - return 0; - } - - @Override - public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) { - return 0; - } - - @Override - public float influenceExplosion(IReactor aReactor, ItemStack aStack) { - return -1.0F; - } - - @Override - public int alterHeat(IReactor aReactor, ItemStack aStack, int x, int y, int aHeat) { - return aHeat; - } - - @Override - public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {} -} diff --git a/src/main/java/gregtech/common/items/GT_SensorCard_Item.java b/src/main/java/gregtech/common/items/GT_SensorCard_Item.java deleted file mode 100644 index 67e5b24a70..0000000000 --- a/src/main/java/gregtech/common/items/GT_SensorCard_Item.java +++ /dev/null @@ -1,111 +0,0 @@ -package gregtech.common.items; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.util.GT_LanguageManager; -import shedar.mods.ic2.nuclearcontrol.api.CardState; -import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper; -import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource; -import shedar.mods.ic2.nuclearcontrol.api.IRemoteSensor; -import shedar.mods.ic2.nuclearcontrol.api.PanelSetting; -import shedar.mods.ic2.nuclearcontrol.api.PanelString; - -public class GT_SensorCard_Item extends GT_Generic_Item implements IRemoteSensor, IPanelDataSource { - - private static final UUID CARD_TYPE = new UUID(0L, 41L); - - private int strCount; - - public GT_SensorCard_Item(String aUnlocalized, String aEnglish) { - super(aUnlocalized, aEnglish, "Insert into Display Panel"); - setMaxStackSize(1); - } - - @Override - public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { - super.addAdditionalToolTips(aList, aStack, aPlayer); - if (aStack != null) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - aList.add(transItem("014", "Missing Coordinates!")); - } else { - aList.add(transItem("015", "Device at:")); - aList.add( - String.format( - "x: %d, y: %d, z: %d", - tNBT.getInteger("x"), - tNBT.getInteger("y"), - tNBT.getInteger("z"))); - } - } - } - - @Override - public CardState update(TileEntity aPanel, ICardWrapper aCard, int aMaxRange) { - return update(aPanel.getWorldObj(), aCard, aMaxRange); - } - - @Override - public CardState update(World world, ICardWrapper aCard, int aMaxRange) { - ChunkCoordinates target = aCard.getTarget(); - - TileEntity tTileEntity = world.getTileEntity(target.posX, target.posY, target.posZ); - if (((tTileEntity instanceof IGregTechDeviceInformation)) - && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) { - String[] tInfoData = ((IGregTechDeviceInformation) tTileEntity).getInfoData(); - for (int i = 0; i < tInfoData.length; i++) { - aCard.setString("mString" + i, tInfoData[i]); - } - aCard.setInt("mString", strCount = tInfoData.length); - return CardState.OK; - } - return CardState.NO_TARGET; - } - - @Override - public List getStringData(int aSettings, ICardWrapper aCard, boolean aLabels) { - List rList = new LinkedList<>(); - for (int i = 0; i < (strCount = aCard.getInt("mString")); i++) { - if ((aSettings & 1 << i) != 0) { - PanelString line = new PanelString(); - line.textLeft = GT_LanguageManager.getTranslation(aCard.getString("mString" + i), "\\\\"); - rList.add(line); - } - } - return rList; - } - - @Override - public List getSettingsList() { - List rList = new ArrayList<>(); - for (int i = 0; i < strCount; i++) { - rList.add(new PanelSetting(String.valueOf((i + 1)), 1 << i, getCardType())); - } - return rList; - } - - @Override - public UUID getCardType() { - return CARD_TYPE; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aOutputSubItems) {} -} diff --git a/src/main/java/gregtech/common/items/GT_TierDrone.java b/src/main/java/gregtech/common/items/GT_TierDrone.java deleted file mode 100644 index 58da852d0e..0000000000 --- a/src/main/java/gregtech/common/items/GT_TierDrone.java +++ /dev/null @@ -1,18 +0,0 @@ -package gregtech.common.items; - -import gregtech.api.items.GT_Generic_Item; - -public class GT_TierDrone extends GT_Generic_Item { - - private final int level; - - public GT_TierDrone(String aUnlocalized, String aEnglish, String aEnglishTooltip, int level) { - super(aUnlocalized, aEnglish, aEnglishTooltip); - this.level = level; - this.setMaxStackSize(64); - } - - public int getLevel() { - return level; - } -} diff --git a/src/main/java/gregtech/common/items/GT_VolumetricFlask.java b/src/main/java/gregtech/common/items/GT_VolumetricFlask.java deleted file mode 100644 index 5578214e65..0000000000 --- a/src/main/java/gregtech/common/items/GT_VolumetricFlask.java +++ /dev/null @@ -1,360 +0,0 @@ -package gregtech.common.items; - -import static gregtech.api.enums.Mods.GregTech; -import static gregtech.api.util.GT_Utility.formatNumbers; -import static ic2.core.util.LiquidUtil.drainContainerStack; -import static ic2.core.util.LiquidUtil.fillContainerStack; -import static ic2.core.util.LiquidUtil.placeFluid; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.MovingObjectPosition.MovingObjectType; -import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fluids.IFluidContainerItem; -import net.minecraftforge.fluids.IFluidHandler; - -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.api.screen.IItemWithModularUI; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.VanillaButtonWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.util.GT_Utility; -import ic2.core.util.LiquidUtil; - -public class GT_VolumetricFlask extends GT_Generic_Item implements IFluidContainerItem, IItemWithModularUI { - - private final int maxCapacity; - private final String unlocalFlaskName; - - @SideOnly(Side.CLIENT) - public IIcon iconWindow; - - public GT_VolumetricFlask(String unlocalized, String english, int maxCapacity) { - super(unlocalized, english, null); - this.maxCapacity = maxCapacity; - unlocalFlaskName = unlocalized; - setMaxStackSize(64); - setNoRepair(); - } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - if (!world.isRemote && isEmpty(stack) && getMovingObjectPositionFromPlayer(world, player, true) == null) - GT_UIInfos.openPlayerHeldItemUI(player); - return super.onItemRightClick(stack, world, player); - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int ordinalSide, - float xOffset, float yOffset, float zOffset) { - if (player instanceof FakePlayer) { - return false; - } - if (world.isRemote) return false; - if (interactWithTank(stack, player, world, x, y, z, ordinalSide)) { - return true; - } - MovingObjectPosition mop = getMovingObjectPositionFromPlayer(world, player, true); - if (mop == null) { - return false; - } - if (mop.typeOfHit == MovingObjectType.BLOCK) { - x = mop.blockX; - y = mop.blockY; - z = mop.blockZ; - if (!world.canMineBlock(player, x, y, z) || !player.canPlayerEdit(x, y, z, mop.sideHit, stack)) { - return false; - } - if (collectFluidBlock(stack, player, world, x, y, z)) { - return true; - } - ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[mop.sideHit]; - FluidStack fluidStack = drainContainerStack(stack, player, 1000, true); - if (placeFluid(fluidStack, world, x, y, z) - || (player.canPlayerEdit(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, mop.sideHit, stack) - && placeFluid(fluidStack, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))) { - if (!player.capabilities.isCreativeMode) drainContainerStack(stack, player, 1000, false); - return true; - } - } - return false; - } - - public boolean isEmpty(ItemStack stack) { - return getFluid(stack) == null; - } - - public int getFreeSpace(ItemStack stack) { - int capacity = getCapacity(stack); - if (capacity > 0) { - FluidStack fluidStack = getFluid(stack); - return fluidStack == null ? capacity : capacity - fluidStack.amount; - } - return 0; - } - - public int getMaxCapacity() { - return this.maxCapacity; - } - - @Override - public int getCapacity(ItemStack stack) { - int capacity = 1000; - if (stack.hasTagCompound()) { - NBTTagCompound nbt = stack.getTagCompound(); - if (nbt.hasKey("Capacity", 3)) capacity = nbt.getInteger("Capacity"); - } - return Math.min(getMaxCapacity(), capacity); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister aIconRegister) { - super.registerIcons(aIconRegister); - iconWindow = aIconRegister.registerIcon(GregTech.getResourcePath("gt." + unlocalFlaskName + ".window")); - } - - public void setCapacity(ItemStack stack, int capacity) { - capacity = Math.min(capacity, getMaxCapacity()); - NBTTagCompound nbt = stack.getTagCompound(); - if (nbt == null) { - stack.setTagCompound(nbt = new NBTTagCompound()); - } - nbt.setInteger("Capacity", capacity); - } - - @Override - public FluidStack getFluid(ItemStack stack) { - if (stack.hasTagCompound()) { - NBTTagCompound nbt = stack.getTagCompound(); - if (nbt.hasKey("Fluid", 10)) return FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag("Fluid")); - } - return null; - } - - public void setFluid(ItemStack stack, FluidStack fluidStack) { - boolean removeFluid = (fluidStack == null) || (fluidStack.amount <= 0); - NBTTagCompound nbt = stack.getTagCompound(); - if (nbt == null) { - if (removeFluid) return; - stack.setTagCompound(nbt = new NBTTagCompound()); - } - if (removeFluid) { - nbt.removeTag("Fluid"); - if (nbt.hasNoTags()) { - stack.setTagCompound(null); - } - } else { - nbt.setTag("Fluid", fluidStack.writeToNBT(new NBTTagCompound())); - } - } - - @Override - public int fill(ItemStack stack, FluidStack resource, boolean doFill) { - if (stack.stackSize != 1) return 0; - if ((resource == null) || (resource.amount <= 0)) { - return 0; - } - FluidStack fluidStack = getFluid(stack); - if (fluidStack == null) { - fluidStack = new FluidStack(resource, 0); - } else if (!fluidStack.isFluidEqual(resource)) { - return 0; - } - int amount = Math.min(getCapacity(stack) - fluidStack.amount, resource.amount); - if ((doFill) && (amount > 0)) { - fluidStack.amount += amount; - setFluid(stack, fluidStack); - } - return amount; - } - - @Override - public FluidStack drain(ItemStack stack, int maxDrain, boolean doDrain) { - if (stack.stackSize != 1) return null; - FluidStack fluidStack = getFluid(stack); - if (fluidStack == null) return null; - maxDrain = Math.min(fluidStack.amount, maxDrain); - if (doDrain) { - fluidStack.amount -= maxDrain; - setFluid(stack, fluidStack); - } - return new FluidStack(fluidStack, maxDrain); - } - - @Override - protected void addAdditionalToolTips(List info, ItemStack stack, EntityPlayer aPlayer) { - FluidStack fs = getFluid(stack); - if (fs != null) { - info.add(String.format("< %s, %s mB >", GT_Utility.getFluidName(fs, true), formatNumbers(fs.amount))); - } else { - info.add(String.format("< Empty, %s mB >", formatNumbers(getCapacity(stack)))); - } - info.add("Rightclick on air to set volume (only while empty)"); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs creativeTabs, List itemList) { - itemList.add(new ItemStack(this)); - for (Fluid fluid : FluidRegistry.getRegisteredFluids() - .values()) { - if (fluid != null) { - ItemStack stack = new ItemStack(this); - setCapacity(stack, getMaxCapacity()); - fill(stack, new FluidStack(fluid, Integer.MAX_VALUE), true); - itemList.add(stack); - } - } - } - - private boolean interactWithTank(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, - int ordinalSide) { - if (world.isRemote) { - return false; - } - TileEntity te = world.getTileEntity(x, y, z); - if (!(te instanceof IFluidHandler handler)) { - return false; - } - ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide); - FluidStack fs = this.getFluid(stack); - int capacity = getCapacity(stack); - if (fs != null && (!player.isSneaking() || fs.amount >= capacity)) { - int amount = handler.fill(dir, fs, false); - if (amount > 0) { - fs = LiquidUtil.drainContainerStack(stack, player, amount, false); - if (fs != null && fs.amount > 0) { - handler.fill(dir, fs, true); - } - } - } else { - int amount = fs == null ? capacity : capacity - fs.amount; - FluidStack input = handler.drain(dir, amount, false); - if (input != null && input.amount > 0) { - amount = LiquidUtil.fillContainerStack(stack, player, input, false); - if (amount > 0) { - handler.drain(dir, amount, true); - } - } - } - return true; - } - - private boolean collectFluidBlock(ItemStack stack, EntityPlayer player, World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - if (block instanceof IFluidBlock liquid) { - if (liquid.canDrain(world, x, y, z)) { - FluidStack fluid = liquid.drain(world, x, y, z, false); - int amount = fillContainerStack(stack, player, fluid, true); - if (amount == fluid.amount) { - fillContainerStack(stack, player, fluid, false); - liquid.drain(world, x, y, z, true); - return true; - } - } - } else if (world.getBlockMetadata(x, y, z) == 0) { - FluidStack fluid = null; - if (block != Blocks.water && block != Blocks.flowing_water) { - if (block == Blocks.lava || block == Blocks.flowing_lava) { - fluid = new FluidStack(FluidRegistry.LAVA, 1000); - } - } else { - fluid = new FluidStack(FluidRegistry.WATER, 1000); - } - - if (fluid != null) { - int amount = fillContainerStack(stack, player, fluid, true); - if (amount == fluid.amount) { - fillContainerStack(stack, player, fluid, false); - world.setBlockToAir(x, y, z); - return true; - } - } - } - return false; - } - - @Override - public ModularWindow createWindow(UIBuildContext buildContext, ItemStack stack) { - if (!(stack.getItem() instanceof GT_VolumetricFlask)) return null; - return new VolumetricFlaskUIFactory(buildContext, stack).createWindow(); - } - - private class VolumetricFlaskUIFactory { - - private final UIBuildContext buildContext; - private int capacity; - private final int maxCapacity; - - public VolumetricFlaskUIFactory(UIBuildContext buildContext, ItemStack flask) { - this.buildContext = buildContext; - GT_VolumetricFlask flaskItem = (GT_VolumetricFlask) flask.getItem(); - this.capacity = flaskItem.getCapacity(flask); - this.maxCapacity = flaskItem.getMaxCapacity(); - } - - public ModularWindow createWindow() { - ModularWindow.Builder builder = ModularWindow.builder(150, 54); - builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); - - NumericWidget capacityWidget = new NumericWidget(); - builder.widget( - capacityWidget.setGetter(() -> capacity) - .setSetter(value -> setCapacity(getCurrentItem(), capacity = (int) value)) - .setBounds(1, maxCapacity) - .setScrollValues(1, 144, 1000) - .setDefaultValue(capacity) - .setTextColor(Color.WHITE.dark(1)) - .setTextAlignment(Alignment.CenterLeft) - .setFocusOnGuiOpen(true) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) - .setPos(8, 8) - .setSize(77, 12)) - .widget(new TextWidget("Capacity").setPos(88, 10)) - .widget( - new VanillaButtonWidget().setDisplayString("Confirm") - .setOnClick((clickData, widget) -> { - capacityWidget.onRemoveFocus(); - widget.getWindow() - .tryClose(); - }) - .setSynced(false, false) - .setPos(8, 26) - .setSize(48, 20)); - - return builder.build(); - } - - private ItemStack getCurrentItem() { - return buildContext.getPlayer().inventory.getCurrentItem(); - } - } -} diff --git a/src/main/java/gregtech/common/items/GT_WirelessHeadphones.java b/src/main/java/gregtech/common/items/GT_WirelessHeadphones.java deleted file mode 100644 index 98a6eddb2c..0000000000 --- a/src/main/java/gregtech/common/items/GT_WirelessHeadphones.java +++ /dev/null @@ -1,118 +0,0 @@ -package gregtech.common.items; - -import java.util.List; -import java.util.UUID; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; - -import baubles.api.BaubleType; -import baubles.api.IBauble; -import gregtech.api.enums.ItemList; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_BetterJukebox; - -public class GT_WirelessHeadphones extends GT_Generic_Item implements IBauble { - - public static final String NBTKEY_JUKEBOX_COORDINATES = "jukeboxCoords"; - - public GT_WirelessHeadphones() { - super("WirelessHeadphones", "Wireless Headphones", null); - setMaxStackSize(1); - - ItemList.WirelessHeadphones.set(this); - } - - @Override - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - if (aStack == null) { - return; - } - final NBTTagCompound tag = aStack.getTagCompound(); - if (tag == null || !tag.hasKey(NBTKEY_JUKEBOX_COORDINATES, Constants.NBT.TAG_STRING)) { - aList.add(StatCollector.translateToLocal("GT5U.machines.betterjukebox.headphonesunbound")); - } else { - aList.add(StatCollector.translateToLocal("GT5U.machines.betterjukebox.headphonesbound")); - aList.add(tag.getString(NBTKEY_JUKEBOX_COORDINATES)); - } - } - - @Override - public boolean doesSneakBypassUse(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) { - return false; - } - - @Override - public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, - float hitX, float hitY, float hitZ) { - final TileEntity pointedTe = world.getTileEntity(x, y, z); - if (!(pointedTe instanceof BaseMetaTileEntity mte)) { - return false; - } - if (!(mte.getMetaTileEntity() instanceof GT_MetaTileEntity_BetterJukebox jukebox)) { - return false; - } - final UUID uuid = jukebox.jukeboxUuid; - if (uuid == GT_MetaTileEntity_BetterJukebox.UNSET_UUID) { - return false; - } - if (!world.isRemote) { - final NBTTagCompound tag = (stack.getTagCompound() == null) ? new NBTTagCompound() : stack.getTagCompound(); - tag.setLong(GT_MetaTileEntity_BetterJukebox.NBTKEY_UUID_LOW, uuid.getLeastSignificantBits()); - tag.setLong(GT_MetaTileEntity_BetterJukebox.NBTKEY_UUID_HIGH, uuid.getMostSignificantBits()); - tag.setString( - NBTKEY_JUKEBOX_COORDINATES, - String.format("(%d, %d, %d) @ %d", x, y, z, world.provider.dimensionId)); - stack.setTagCompound(tag); - - player.addChatMessage(new ChatComponentTranslation("GT5U.machines.betterjukebox.headphonesbound")); - } - return true; - } - - public static UUID getBoundJukeboxUUID(ItemStack stack) { - if (stack == null || stack.getTagCompound() == null) { - return null; - } - final NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(GT_MetaTileEntity_BetterJukebox.NBTKEY_UUID_LOW, Constants.NBT.TAG_ANY_NUMERIC) - || !tag.hasKey(GT_MetaTileEntity_BetterJukebox.NBTKEY_UUID_HIGH, Constants.NBT.TAG_ANY_NUMERIC)) { - return null; - } - final long idLow = tag.getLong(GT_MetaTileEntity_BetterJukebox.NBTKEY_UUID_LOW); - final long idHigh = tag.getLong(GT_MetaTileEntity_BetterJukebox.NBTKEY_UUID_HIGH); - return new UUID(idHigh, idLow); - } - - @Override - public BaubleType getBaubleType(ItemStack itemStack) { - return BaubleType.UNIVERSAL; - } - - @Override - public void onWornTick(ItemStack itemStack, EntityLivingBase entityLivingBase) {} - - @Override - public void onEquipped(ItemStack itemStack, EntityLivingBase entityLivingBase) {} - - @Override - public void onUnequipped(ItemStack itemStack, EntityLivingBase entityLivingBase) {} - - @Override - public boolean canEquip(ItemStack itemStack, EntityLivingBase entityLivingBase) { - return true; - } - - @Override - public boolean canUnequip(ItemStack itemStack, EntityLivingBase entityLivingBase) { - return true; - } -} diff --git a/src/main/java/gregtech/common/items/IDMetaItem01.java b/src/main/java/gregtech/common/items/IDMetaItem01.java new file mode 100644 index 0000000000..47f34ab4b8 --- /dev/null +++ b/src/main/java/gregtech/common/items/IDMetaItem01.java @@ -0,0 +1,433 @@ +package gregtech.common.items; + +public enum IDMetaItem01 { + // Please pretty please, add your entries while conserving the order + + Credit_Greg_Copper(0), + Credit_Greg_Cupronickel(1), + Credit_Greg_Silver(2), + Credit_Greg_Gold(3), + Credit_Greg_Platinum(4), + Credit_Greg_Osmium(5), + Credit_Greg_Naquadah(6), + Credit_Greg_Neutronium(7), + Coin_Gold_Ancient(8), + Coin_Doge(9), + Coin_Chocolate(10), + Credit_Copper(11), + Credit_Silver(13), + Credit_Gold(14), + Credit_Platinum(15), + Credit_Osmium(16), + Electric_Motor_UIV(17), + Electric_Motor_UMV(18), + Electric_Motor_UXV(19), + Electric_Motor_MAX(20), + Electric_Piston_UIV(21), + Electric_Piston_UMV(22), + Electric_Piston_UXV(23), + Electric_Piston_MAX(24), + Electric_Pump_UIV(25), + Electric_Pump_UMV(26), + Electric_Pump_UXV(27), + Electric_Pump_MAX(28), + Conveyor_Module_UIV(29), + Conveyor_Module_UMV(30), + Conveyor_Module_UXV(31), + Conveyor_Module_MAX(32), + Robot_Arm_UIV(33), + Robot_Arm_UMV(34), + Robot_Arm_UXV(35), + Robot_Arm_MAX(36), + Emitter_UIV(37), + Emitter_UMV(38), + Emitter_UXV(39), + Emitter_MAX(40), + Sensor_UIV(41), + Sensor_UMV(42), + Sensor_UXV(43), + Sensor_MAX(44), + Field_Generator_UIV(45), + Field_Generator_UMV(46), + Field_Generator_UXV(47), + Field_Generator_MAX(48), + Component_Minecraft_Wheels_Iron(100), + Component_Minecraft_Wheels_Steel(101), + Compressed_Fireclay(110), + Firebrick(111), + ZPM5(145), + ZPM6(146), + ItemFilter_Export(270), + ItemFilter_Import(271), + Cover_FluidLimiter(272), + Shape_Empty(300), + Shape_Mold_Plate(301), + Shape_Mold_Casing(302), + Shape_Mold_Gear(303), + Shape_Mold_Credit(304), + Shape_Mold_Bottle(305), + Shape_Mold_Ingot(306), + Shape_Mold_Ball(307), + Shape_Mold_Block(308), + Shape_Mold_Nugget(309), + Shape_Mold_Bun(310), + Shape_Mold_Bread(311), + Shape_Mold_Baguette(312), + Shape_Mold_Cylinder(313), + Shape_Mold_Anvil(314), + Shape_Mold_Name(315), + Shape_Mold_Arrow(316), + Shape_Mold_Gear_Small(317), + Shape_Mold_Rod(318), + Shape_Mold_Bolt(319), + Shape_Mold_Round(320), + Shape_Mold_Screw(321), + Shape_Mold_Ring(322), + Shape_Mold_Rod_Long(323), + Shape_Mold_Rotor(324), + Shape_Mold_Turbine_Blade(325), + Shape_Mold_Pipe_Tiny(326), + Shape_Mold_Pipe_Small(327), + Shape_Mold_Pipe_Medium(328), + Shape_Mold_Pipe_Large(329), + Shape_Mold_Pipe_Huge(330), + Shape_Mold_Tool_Head_Drill(331), + Steam_Regulator_LV(332), + Steam_Regulator_MV(333), + Steam_Regulator_HV(334), + Steam_Regulator_EV(335), + Steam_Regulator_IV(336), + Electromagnet_Iron(345), + Electromagnet_Steel(346), + Electromagnet_Neodymium(347), + Electromagnet_Samarium(348), + Electromagnet_Tengam(349), + Shape_Extruder_Plate(350), + Shape_Extruder_Rod(351), + Shape_Extruder_Bolt(352), + Shape_Extruder_Ring(353), + Shape_Extruder_Cell(354), + Shape_Extruder_Ingot(355), + Shape_Extruder_Wire(356), + Shape_Extruder_Casing(357), + Shape_Extruder_Pipe_Tiny(358), + Shape_Extruder_Pipe_Small(359), + Shape_Extruder_Pipe_Medium(360), + Shape_Extruder_Pipe_Large(361), + Shape_Extruder_Pipe_Huge(362), + Shape_Extruder_Block(363), + Shape_Extruder_Sword(364), + Shape_Extruder_Pickaxe(365), + Shape_Extruder_Shovel(366), + Shape_Extruder_Axe(367), + Shape_Extruder_Hoe(368), + Shape_Extruder_Hammer(369), + Shape_Extruder_File(370), + Shape_Extruder_Saw(371), + Shape_Extruder_Gear(372), + Shape_Extruder_Bottle(373), + Shape_Extruder_Rotor(374), + Shape_Extruder_Small_Gear(375), + Shape_Extruder_Turbine_Blade(376), + Shape_Extruder_Tool_Head_Drill(377), + Cover_Chest_Basic(380), + Cover_Chest_Good(381), + Cover_Chest_Advanced(382), + Shape_Slicer_Flat(398), + Shape_Slicer_Stripes(399), + Fuel_Can_Plastic_Empty(400), + Fuel_Can_Plastic_Filled(401), + Spray_Empty(402), + Crate_Empty(403), + Thermos_Can_Empty(404), + Large_Fluid_Cell_Steel(405), + Large_Fluid_Cell_TungstenSteel(406), + Large_Fluid_Cell_Aluminium(407), + Large_Fluid_Cell_StainlessSteel(408), + Large_Fluid_Cell_Titanium(409), + Large_Fluid_Cell_Chrome(410), + Large_Fluid_Cell_Iridium(411), + Large_Fluid_Cell_Osmium(412), + Large_Fluid_Cell_Neutronium(413), + Tesseract(415), + GigaChad(416), + EnergisedTesseract(417), + Black_Hole_Opener(418), + Black_Hole_Closer(419), + StableAdhesive(427), + SuperconductorComposite(428), + NaquadriaSupersolid(429), + Spray_Color_0(430), + Spray_Color_Used_0(431), + Spray_Color_1(432), + Spray_Color_Used_1(433), + Spray_Color_2(434), + Spray_Color_Used_2(435), + Spray_Color_3(436), + Spray_Color_Used_3(437), + Spray_Color_4(438), + Spray_Color_Used_4(439), + Spray_Color_5(440), + Spray_Color_Used_5(441), + Spray_Color_6(442), + Spray_Color_Used_6(443), + Spray_Color_7(444), + Spray_Color_Used_7(445), + Spray_Color_8(446), + Spray_Color_Used_8(447), + Spray_Color_9(448), + Spray_Color_Used_9(449), + Spray_Color_10(450), + Spray_Color_Used_10(451), + Spray_Color_11(452), + Spray_Color_Used_11(453), + Spray_Color_12(454), + Spray_Color_Used_12(455), + Spray_Color_13(456), + Spray_Color_Used_13(457), + Spray_Color_14(458), + Spray_Color_Used_14(459), + Spray_Color_15(460), + Spray_Color_Used_15(461), + Ingot_Heavy1(462), + Ingot_Heavy2(463), + Ingot_Heavy3(464), + Spray_Color_Remover(465), + Spray_Color_Used_Remover(466), + Spray_Color_Remover_Empty(467), + Tool_Matches(471), + Tool_MatchBox_Used(472), + Tool_MatchBox_Full(473), + Tool_Lighter_Invar_Empty(474), + Tool_Lighter_Invar_Used(475), + Tool_Lighter_Invar_Full(476), + Tool_Lighter_Platinum_Empty(477), + Tool_Lighter_Platinum_Used(478), + Tool_Lighter_Platinum_Full(479), + Ingot_Iridium_Alloy(480), + Paper_Printed_Pages(481), + Paper_Magic_Empty(482), + Paper_Magic_Page(483), + Paper_Magic_Pages(484), + Paper_Punch_Card_Empty(485), + Paper_Punch_Card_Encoded(486), + Book_Written_01(487), + Book_Written_02(488), + Book_Written_03(489), + Schematic(490), + Schematic_Crafting(491), + Schematic_1by1(495), + Schematic_2by2(496), + Schematic_3by3(497), + Schematic_Dust(498), + Battery_RE_ULV_Tantalum(499), + Battery_Hull_LV(500), + Battery_Hull_MV(501), + Battery_Hull_HV(502), + BatteryHull_EV(503), + BatteryHull_IV(504), + BatteryHull_LuV(505), + BatteryHull_ZPM(506), + BatteryHull_UV(507), + Battery_SU_LV_Sulfuric_Acid(510), + Battery_SU_LV_Mercury(511), + Battery_RE_LV_Cadmium(517), + Battery_RE_LV_Lithium(518), + Battery_RE_LV_Sodium(519), + Battery_SU_MV_Sulfuric_Acid(520), + Battery_SU_MV_Mercury(521), + Battery_RE_MV_Cadmium(527), + Battery_RE_MV_Lithium(528), + Battery_RE_MV_Sodium(529), + Battery_SU_HV_Sulfuric_Acid(530), + Battery_SU_HV_Mercury(531), + Battery_RE_HV_Cadmium(537), + Battery_RE_HV_Lithium(538), + Battery_RE_HV_Sodium(539), + BatteryHull_EV_Full(540), + BatteryHull_IV_Full(545), + BatteryHull_LuV_Full(550), + BatteryHull_ZPM_Full(555), + BatteryHull_UV_Full(560), + BatteryHull_UHV(561), + BatteryHull_UEV(562), + BatteryHull_UIV(563), + BatteryHull_UMV(564), + BatteryHull_UxV(565), + BatteryHull_UHV_Full(570), + BatteryHull_UEV_Full(575), + Cover_FLuidStorageMonitor(577), + BatteryHull_UIV_Full(580), + BatteryHull_UMV_Full(585), + BatteryHull_UxV_Full(590), + ZPM4(594), + Electric_Motor_UEV(595), + Electric_Motor_UHV(596), + Energy_Lapotronic_Orb(597), + ZPM(598), + Energy_Lapotronic_orb_2(599), + Electric_Motor_LV(600), + Electric_Motor_MV(601), + Electric_Motor_HV(602), + Electric_Motor_EV(603), + Electric_Motor_IV(604), + ZPM2(605), + Electric_Motor_LuV(606), + Electric_Motor_ZPM(607), + Electric_Motor_UV(608), + ZPM3(609), + Electric_Pump_LV(610), + Electric_Pump_MV(611), + Electric_Pump_HV(612), + Electric_Pump_EV(613), + Electric_Pump_IV(614), + Electric_Pump_LuV(615), + Electric_Pump_ZPM(616), + Electric_Pump_UV(617), + Electric_Pump_UHV(618), + Electric_Pump_UEV(619), + Steam_Valve_LV(620), + Steam_Valve_MV(621), + Steam_Valve_HV(622), + Steam_Valve_EV(623), + Steam_Valve_IV(624), + Conveyor_Module_LV(630), + Conveyor_Module_MV(631), + Conveyor_Module_HV(632), + Conveyor_Module_EV(633), + Conveyor_Module_IV(634), + Conveyor_Module_LuV(635), + Conveyor_Module_ZPM(636), + Conveyor_Module_UV(637), + Conveyor_Module_UHV(638), + Conveyor_Module_UEV(639), + Electric_Piston_LV(640), + Electric_Piston_MV(641), + Electric_Piston_HV(642), + Electric_Piston_EV(643), + Electric_Piston_IV(644), + Electric_Piston_LuV(645), + Electric_Piston_ZPM(646), + Electric_Piston_UV(647), + Electric_Piston_UHV(648), + Electric_Piston_UEV(649), + Robot_Arm_LV(650), + Robot_Arm_MV(651), + Robot_Arm_HV(652), + Robot_Arm_EV(653), + Robot_Arm_IV(654), + Robot_Arm_LuV(655), + Robot_Arm_ZPM(656), + Robot_Arm_UV(657), + Robot_Arm_UHV(658), + Robot_Arm_UEV(659), + FluidRegulator_LV(660), + FluidRegulator_MV(661), + FluidRegulator_HV(662), + FluidRegulator_EV(663), + FluidRegulator_IV(664), + FluidRegulator_LuV(665), + FluidRegulator_ZPM(666), + FluidRegulator_UV(667), + Circuit_Parts_Crystal_Chip_Wetware(668), + FluidFilter(669), + Field_Generator_LV(670), + Field_Generator_MV(671), + Field_Generator_HV(672), + Field_Generator_EV(673), + Field_Generator_IV(674), + Field_Generator_LuV(675), + Field_Generator_ZPM(676), + Field_Generator_UV(677), + Field_Generator_UHV(678), + Field_Generator_UEV(679), + Emitter_LV(680), + Emitter_MV(681), + Emitter_HV(682), + Emitter_EV(683), + Emitter_IV(684), + Emitter_LuV(685), + Emitter_ZPM(686), + Emitter_UV(687), + Emitter_UHV(688), + Emitter_UEV(689), + Sensor_LV(690), + Sensor_MV(691), + Sensor_HV(692), + Sensor_EV(693), + Sensor_IV(694), + Sensor_LuV(695), + Sensor_ZPM(696), + Sensor_UV(697), + Sensor_UHV(698), + Sensor_UEV(699), + Circuit_Primitive(700), + Circuit_Basic(701), + Circuit_Good(702), + Circuit_Advanced(703), + Circuit_Data(704), + Circuit_Elite(705), + Circuit_Master(706), + Tool_DataOrb(707), + Tool_DataStick(708), + Tool_Cover_Copy_Paste(709), + Circuit_Board_Basic(710), + Circuit_Board_Advanced(711), + Circuit_Board_Elite(712), + Circuit_Parts_Crystal_Chip_Elite(713), + Circuit_Parts_Crystal_Chip_Master(714), + Circuit_Parts_Advanced(715), + Circuit_Parts_Wiring_Basic(716), + Circuit_Parts_Wiring_Advanced(717), + Circuit_Parts_Wiring_Elite(718), + Empty_Board_Basic(719), + Empty_Board_Elite(720), + Component_Sawblade_Diamond(721), + Component_Grinder_Diamond(722), + Component_Grinder_Tungsten(723), + QuantumEye(724), + QuantumStar(725), + Gravistar(726), + Upgrade_Muffler(727), + Upgrade_Lock(728), + Component_Filter(729), + Cover_Controller(730), + Cover_ActivityDetector(731), + Cover_FluidDetector(732), + Cover_ItemDetector(733), + Cover_EnergyDetector(734), + Cover_PlayerDetector(735), + Energy_Module(736), + Energy_Cluster(737), + Cover_Screen(740), + Cover_RedstoneTransmitterExternal(741), + Cover_RedstoneTransmitterInternal(742), + Cover_Crafting(744), + Cover_Drain(745), + Cover_RedstoneReceiverExternal(746), + Cover_RedstoneReceiverInternal(747), + Cover_NeedsMaintenance(748), + Cover_Shutter(749), + Cover_SolarPanel(750), + Cover_SolarPanel_8V(751), + Cover_SolarPanel_LV(752), + Cover_SolarPanel_MV(753), + Cover_SolarPanel_HV(754), + Cover_SolarPanel_EV(755), + Cover_SolarPanel_IV(756), + Cover_SolarPanel_LuV(757), + Cover_SolarPanel_ZPM(758), + Cover_SolarPanel_UV(759), + Tool_Sonictron(760), + Tool_Cheat(761), + Tool_Scanner(762), + NC_SensorKit(763), + Duct_Tape(764), + McGuffium_239(765); + + public final int ID; + + IDMetaItem01(int ID) { + this.ID = ID; + } +} diff --git a/src/main/java/gregtech/common/items/IDMetaItem02.java b/src/main/java/gregtech/common/items/IDMetaItem02.java new file mode 100644 index 0000000000..a67e22545c --- /dev/null +++ b/src/main/java/gregtech/common/items/IDMetaItem02.java @@ -0,0 +1,208 @@ +package gregtech.common.items; + +public enum IDMetaItem02 { + + // Please pretty please, add your entries while conserving the order + ThermosCan_Dark_Coffee(0), + ThermosCan_Dark_Cafe_au_lait(1), + ThermosCan_Coffee(2), + ThermosCan_Cafe_au_lait(3), + ThermosCan_Lait_au_cafe(4), + ThermosCan_Dark_Chocolate_Milk(5), + ThermosCan_Chocolate_Milk(6), + ThermosCan_Tea(7), + ThermosCan_Sweet_Tea(8), + ThermosCan_Ice_Tea(9), + GelledToluene(10), + Bottle_Purple_Drink(100), + Bottle_Grape_Juice(101), + Bottle_Wine(102), + Bottle_Vinegar(103), + Bottle_Potato_Juice(104), + Bottle_Vodka(105), + Bottle_Leninade(106), + Bottle_Mineral_Water(107), + Bottle_Salty_Water(108), + Bottle_Reed_Water(109), + Bottle_Rum(110), + Bottle_Pirate_Brew(111), + Bottle_Hops_Juice(112), + Bottle_Dark_Beer(113), + Bottle_Dragon_Blood(114), + Bottle_Wheaty_Juice(115), + Bottle_Scotch(116), + Bottle_Glen_McKenner(117), + Bottle_Wheaty_Hops_Juice(118), + Bottle_Beer(119), + Bottle_Chilly_Sauce(120), + Bottle_Hot_Sauce(121), + Bottle_Diabolo_Sauce(122), + Bottle_Diablo_Sauce(123), + Bottle_Snitches_Glitch_Sauce(124), + Bottle_Apple_Juice(125), + Bottle_Cider(126), + Bottle_Golden_Apple_Juice(127), + Bottle_Golden_Cider(128), + Bottle_Iduns_Apple_Juice(129), + Bottle_Notches_Brew(130), + Bottle_Lemon_Juice(131), + Bottle_Limoncello(132), + Bottle_Lemonade(133), + Bottle_Alcopops(134), + Bottle_Cave_Johnsons_Grenade_Juice(135), + Bottle_Milk(136), + Bottle_Holy_Water(137), + Food_Potato_On_Stick(200), + Food_Potato_On_Stick_Roasted(201), + Food_Raw_Fries(202), + Food_Fries(203), + Food_Packaged_Fries(204), + Food_Raw_PotatoChips(205), + Food_PotatoChips(206), + Food_ChiliChips(207), + Food_Packaged_PotatoChips(208), + Food_Packaged_ChiliChips(209), + Food_Chum(210), + Food_Chum_On_Stick(211), + Food_Dough_Sugar(212), + Food_Dough_Chocolate(213), + Food_Raw_Cookie(214), + Food_Sliced_Buns(220), + Food_Burger_Veggie(221), + Food_Burger_Cheese(222), + Food_Burger_Meat(223), + Food_Burger_Chum(224), + Food_Sliced_Breads(230), + Food_Sandwich_Veggie(231), + Food_Sandwich_Cheese(232), + Food_Sandwich_Bacon(233), + Food_Sandwich_Steak(234), + Food_Sliced_Baguettes(240), + Food_Large_Sandwich_Veggie(241), + Food_Large_Sandwich_Cheese(242), + Food_Large_Sandwich_Bacon(243), + Food_Large_Sandwich_Steak(244), + Food_Raw_Pizza_Veggie(250), + Food_Raw_Pizza_Cheese(251), + Food_Raw_Pizza_Meat(252), + Food_Baked_Pizza_Veggie(260), + Food_Baked_Pizza_Cheese(261), + Food_Baked_Pizza_Meat(262), + SFMixture(270), + MSFMixture(271), + Dye_Indigo(410), + Dye_Color_00(414), + Dye_Color_01(415), + Dye_Color_02(416), + Dye_Color_03(417), + Dye_Color_04(418), + Dye_Color_05(419), + Dye_Color_06(420), + Dye_Color_07(421), + Dye_Color_08(422), + Dye_Color_09(423), + Dye_Color_10(424), + Dye_Color_11(425), + Dye_Color_12(426), + Dye_Color_13(427), + Dye_Color_14(428), + Dye_Color_15(429), + Plank_Oak(470), + Plank_Spruce(471), + Plank_Birch(472), + Plank_Jungle(473), + Plank_Acacia(474), + Plank_DarkOak(475), + Plank_Larch(476), + Plank_Teak(477), + Plank_Acacia_Green(478), + Plank_Lime(479), + Plank_Chestnut(480), + Plank_Wenge(481), + Plank_Baobab(482), + Plank_Sequoia(483), + Plank_Kapok(484), + Plank_Ebony(485), + Plank_Mahagony(486), + Plank_Balsa(487), + Plank_Willow(488), + Plank_Walnut(489), + Plank_Greenheart(490), + Plank_Cherry(491), + Plank_Mahoe(492), + Plank_Poplar(493), + Plank_Palm(494), + Plank_Papaya(495), + Plank_Pine(496), + Plank_Plum(497), + Plank_Maple(498), + Plank_Citrus(499), + Crop_Drop_Plumbilia(500), + Crop_Drop_Argentia(501), + Crop_Drop_Indigo(502), + Crop_Drop_Ferru(503), + Crop_Drop_Aurelia(504), + Crop_Drop_TeaLeaf(505), + Crop_Drop_OilBerry(510), + Crop_Drop_BobsYerUncleRanks(511), + Crop_Drop_UUMBerry(512), + Crop_Drop_UUABerry(513), + Crop_Drop_MilkWart(520), + Crop_Drop_Bauxite(521), + Crop_Drop_Ilmenite(522), + Crop_Drop_Pitchblende(523), + Crop_Drop_Uraninite(524), + Crop_Drop_Thorium(526), + Crop_Drop_Nickel(527), + Crop_Drop_Zinc(528), + Crop_Drop_Manganese(529), + Crop_Drop_Coppon(530), + Crop_Drop_Scheelite(531), + Crop_Drop_Platinum(532), + Crop_Drop_Iridium(533), + Crop_Drop_Osmium(534), + Crop_Drop_Naquadah(535), + Crop_Drop_Mica(538), + Crop_Drop_Tine(540), + Crop_Drop_Chilly(550), + Crop_Drop_Lemon(551), + Crop_Drop_Tomato(552), + Crop_Drop_MTomato(553), + Crop_Drop_Grapes(554), + Crop_Drop_Onion(555), + Crop_Drop_Cucumber(556), + Crop_Drop_Rape(557), + Food_Cheese(558), + Food_Dough(559), + Food_Flat_Dough(560), + Food_Raw_Bread(561), + Food_Raw_Bun(562), + Food_Raw_Baguette(563), + Food_Baked_Bun(564), + Food_Baked_Baguette(565), + Food_Sliced_Bread(566), + Food_Sliced_Bun(567), + Food_Sliced_Baguette(568), + Food_Raw_Cake(569), + Food_Baked_Cake(570), + Food_Sliced_Lemon(571), + Food_Sliced_Tomato(572), + Food_Sliced_Onion(573), + Food_Sliced_Cucumber(574), + Food_Sliced_Cheese(576), + Cover_AdvancedRedstoneTransmitterExternal(577), + Cover_AdvancedRedstoneTransmitterInternal(578), + Cover_AdvancedRedstoneReceiverExternal(579), + Cover_AdvancedRedstoneReceiverInternal(580), + Cover_WirelessFluidDetector(581), + Cover_WirelessItemDetector(582), + Cover_WirelessNeedsMaintainance(583), + Cover_WirelessActivityDetector(584), + Display_ITS_FREE(765); + + public final int ID; + + IDMetaItem02(int ID) { + this.ID = ID; + } +} diff --git a/src/main/java/gregtech/common/items/IDMetaItem03.java b/src/main/java/gregtech/common/items/IDMetaItem03.java new file mode 100644 index 0000000000..b0e4f35943 --- /dev/null +++ b/src/main/java/gregtech/common/items/IDMetaItem03.java @@ -0,0 +1,242 @@ +package gregtech.common.items; + +public enum IDMetaItem03 { + + // Please pretty please, add your entries while conserving the order + Circuit_Board_Wetware(6), + Circuit_Board_Plastic(7), + Circuit_Board_Bio(8), + Circuit_Parts_ResistorSMD(11), + Circuit_Parts_Glass_Tube(12), + Circuit_Parts_Coil(14), + Circuit_Parts_DiodeSMD(16), + Circuit_Parts_TransistorSMD(18), + Circuit_Parts_CapacitorSMD(20), + Circuit_Parts_GlassFiber(21), + Circuit_Parts_PetriDish(22), + Circuit_Parts_Reinforced_Glass_Tube(23), + Circuit_Parts_ResistorASMD(24), + Circuit_Parts_DiodeASMD(25), + Circuit_Parts_TransistorASMD(26), + Circuit_Parts_CapacitorASMD(27), + Circuit_Silicon_Ingot(30), + Circuit_Silicon_Ingot2(31), + Circuit_Silicon_Ingot3(32), + Circuit_Silicon_Wafer(33), + Circuit_Silicon_Wafer2(34), + Circuit_Silicon_Wafer3(35), + Circuit_Wafer_ILC(36), + Circuit_Chip_ILC(37), + Circuit_Wafer_Ram(38), + Circuit_Chip_Ram(39), + Circuit_Wafer_NAND(40), + Circuit_Chip_NAND(41), + Circuit_Wafer_NOR(42), + Circuit_Chip_NOR(43), + Circuit_Wafer_CPU(44), + Circuit_Chip_CPU(45), + Circuit_Wafer_SoC(46), + Circuit_Chip_SoC(47), + Circuit_Wafer_SoC2(48), + Circuit_Chip_SoC2(49), + Circuit_Wafer_PIC(50), + Circuit_Chip_PIC(51), + Circuit_Wafer_HPIC(52), + Circuit_Chip_HPIC(53), + Circuit_Wafer_NanoCPU(54), + Circuit_Chip_NanoCPU(55), + Circuit_Wafer_QuantumCPU(56), + Circuit_Chip_QuantumCPU(57), + Circuit_Wafer_UHPIC(58), + Circuit_Chip_UHPIC(59), + Circuit_Wafer_Simple_SoC(60), + Circuit_Chip_Simple_SoC(61), + Circuit_Wafer_ULPIC(62), + Circuit_Chip_ULPIC(63), + Circuit_Wafer_LPIC(64), + Circuit_Chip_LPIC(65), + Circuit_Chip_CrystalSoC2(68), + Circuit_Parts_RawCrystalChip(69), + Circuit_Chip_CrystalCPU(70), + Circuit_Chip_CrystalSoC(71), + Circuit_Chip_NeuroCPU(72), + Circuit_Chip_Stemcell(73), + Circuit_Parts_RawCrystalParts(74), + NandChip(75), + Circuit_Chip_Biocell(76), + Circuit_Chip_BioCPU(77), + Circuit_Microprocessor(78), + Circuit_Integrated_Good(79), + Circuit_Processor(80), + Circuit_Nanoprocessor(82), + Circuit_Nanocomputer(83), + Circuit_Elitenanocomputer(84), + Circuit_Quantumprocessor(85), + Circuit_Quantumcomputer(86), + Circuit_Masterquantumcomputer(87), + Circuit_Quantummainframe(88), + Circuit_Crystalprocessor(89), + Circuit_Ultimatecrystalcomputer(90), + Circuit_Crystalmainframe(91), + Circuit_Neuroprocessor(92), + Circuit_Wetwarecomputer(93), + Circuit_Wetwaresupercomputer(94), + Circuit_Wetwaremainframe(95), + Circuit_Crystalcomputer(96), + Circuit_Bioprocessor(97), + Circuit_Biowarecomputer(98), + Circuit_Biowaresupercomputer(99), + Circuit_Board_Coated_Basic(100), + Circuit_Board_Phenolic_Good(101), + Circuit_Board_Epoxy_Advanced(102), + Circuit_Board_Fiberglass_Advanced(103), + Circuit_Board_Multifiberglass_Elite(104), + Circuit_Board_Wetware_Extreme(105), + Circuit_Board_Plastic_Advanced(106), + Circuit_Board_Bio_Ultra(107), + Tube_Wires(110), + Circuit_Biomainframe(120), + Cover_SolarPanel_UHV(130), + Cover_SolarPanel_UEV(131), + Cover_SolarPanel_UIV(132), + ULV_Coil(140), + LV_Coil(141), + MV_Coil(142), + HV_Coil(143), + EV_Coil(144), + IV_Coil(145), + LuV_Coil(146), + ZPM_Coil(147), + UV_Coil(148), + UHV_Coil(149), + Circuit_Silicon_Ingot4(150), + Circuit_Silicon_Wafer4(151), + Circuit_Silicon_Ingot5(152), + Circuit_Silicon_Wafer5(153), + Circuit_OpticalProcessor(154), + Circuit_OpticalAssembly(155), + Circuit_OpticalComputer(156), + Circuit_OpticalMainframe(157), + Circuit_Wafer_NPIC(160), + Circuit_Chip_NPIC(161), + Circuit_Wafer_PPIC(162), + Circuit_Chip_PPIC(163), + Circuit_Wafer_QPIC(164), + Circuit_Chip_QPIC(165), + Circuit_ExoticProcessor(166), + Circuit_ExoticAssembly(167), + Circuit_ExoticComputer(168), + Circuit_ExoticMainframe(169), + Circuit_CosmicProcessor(170), + Circuit_CosmicAssembly(171), + Circuit_CosmicComputer(172), + Circuit_CosmicMainframe(173), + Circuit_TranscendentProcessor(174), + Circuit_TranscendentAssembly(175), + Circuit_TranscendentComputer(176), + Circuit_TranscendentMainframe(177), + Circuit_Parts_ResistorXSMD(178), + Circuit_Parts_DiodeXSMD(179), + Circuit_Parts_TransistorXSMD(180), + Circuit_Parts_CapacitorXSMD(181), + Circuit_Parts_InductorSMD(182), + Circuit_Parts_InductorASMD(183), + Circuit_Parts_InductorXSMD(184), + Circuit_Wafer_Bioware(188), + Circuit_Parts_Chip_Bioware(189), + GalliumArsenideCrystal(190), + GalliumArsenideCrystalSmallPart(191), + KevlarFiber(192), + WovenKevlar(193), + Spinneret(194), + IndustrialApiary_Upgrade_Frame(199), + IndustrialApiary_Upgrade_Acceleration_1(200), + IndustrialApiary_Upgrade_Acceleration_2(201), + IndustrialApiary_Upgrade_Acceleration_3(202), + IndustrialApiary_Upgrade_Acceleration_4(203), + IndustrialApiary_Upgrade_Acceleration_5(204), + IndustrialApiary_Upgrade_Acceleration_6(205), + IndustrialApiary_Upgrade_Acceleration_7(206), + IndustrialApiary_Upgrade_Acceleration_8(207), + IndustrialApiary_Upgrade_Acceleration_8_Upgraded(208), + IndustrialApiary_Upgrade_PRODUCTION(209), + IndustrialApiary_Upgrade_PLAINS(210), + IndustrialApiary_Upgrade_LIGHT(211), + IndustrialApiary_Upgrade_FLOWERING(212), + IndustrialApiary_Upgrade_WINTER(213), + IndustrialApiary_Upgrade_DRYER(214), + IndustrialApiary_Upgrade_AUTOMATION(215), + IndustrialApiary_Upgrade_HUMIDIFIER(216), + IndustrialApiary_Upgrade_HELL(217), + IndustrialApiary_Upgrade_POLLEN(218), + IndustrialApiary_Upgrade_DESERT(219), + IndustrialApiary_Upgrade_COOLER(220), + IndustrialApiary_Upgrade_LIFESPAN(221), + IndustrialApiary_Upgrade_SEAL(222), + IndustrialApiary_Upgrade_STABILIZER(223), + IndustrialApiary_Upgrade_JUNGLE(224), + IndustrialApiary_Upgrade_TERRITORY(225), + IndustrialApiary_Upgrade_OCEAN(226), + IndustrialApiary_Upgrade_SKY(227), + IndustrialApiary_Upgrade_HEATER(228), + IndustrialApiary_Upgrade_SIEVE(229), + NuclearStar(230), + IndustrialApiary_Upgrade_UNLIGHT(231), + Cover_Metrics_Transmitter(232), + Activated_Carbon_Filter_Mesh(233), + Quark_Catalyst_Housing(234), + Quark_Creation_Catalyst_Up(235), + Quark_Creation_Catalyst_Down(236), + Quark_Creation_Catalyst_Strange(237), + Quark_Creation_Catalyst_Charm(238), + Quark_Creation_Catalyst_Bottom(239), + Quark_Creation_Catalyst_Top(240), + Quark_Creation_Catalyst_Unaligned(241), + Circuit_Silicon_Ingot6(721), + Circuit_Silicon_Wafer6(722), + Circuit_Silicon_Wafer7(723), + Circuit_Chip_Optical(724), + Optically_Compatible_Memory(725), + Optically_Perfected_CPU(726), + Optical_Cpu_Containment_Housing(727), + Circuit_Board_Optical(728), + White_Dwarf_Shape_Extruder_Plate(729), + White_Dwarf_Shape_Extruder_Rod(730), + White_Dwarf_Shape_Extruder_Bolt(731), + White_Dwarf_Shape_Extruder_Ring(732), + White_Dwarf_Shape_Extruder_Cell(733), + White_Dwarf_Shape_Extruder_Ingot(734), + White_Dwarf_Shape_Extruder_Wire(735), + White_Dwarf_Shape_Extruder_Casing(736), + White_Dwarf_Shape_Extruder_Pipe_Tiny(737), + White_Dwarf_Shape_Extruder_Pipe_Small(738), + White_Dwarf_Shape_Extruder_Pipe_Medium(739), + White_Dwarf_Shape_Extruder_Pipe_Large(740), + White_Dwarf_Shape_Extruder_Pipe_Huge(741), + White_Dwarf_Shape_Extruder_Block(742), + White_Dwarf_Shape_Extruder_Sword(743), + White_Dwarf_Shape_Extruder_Pickaxe(744), + White_Dwarf_Shape_Extruder_Shovel(745), + White_Dwarf_Shape_Extruder_Axe(746), + White_Dwarf_Shape_Extruder_Hoe(747), + White_Dwarf_Shape_Extruder_Hammer(748), + White_Dwarf_Shape_Extruder_File(749), + White_Dwarf_Shape_Extruder_Saw(750), + White_Dwarf_Shape_Extruder_Gear(751), + White_Dwarf_Shape_Extruder_Bottle(752), + White_Dwarf_Shape_Extruder_Rotor(753), + White_Dwarf_Shape_Extruder_Small_Gear(754), + White_Dwarf_Shape_Extruder_Turbine_Blade(755), + White_Dwarf_Shape_Extruder_ToolHeadDrill(756), + Timepiece(757), + Transdimensional_Alignment_Matrix(758), + Thermal_Superconductor(759), + Relativistic_Heat_Capacitor(760), + Phononic_Seed_Crystal(761); + + public final int ID; + + IDMetaItem03(int ID) { + this.ID = ID; + } +} diff --git a/src/main/java/gregtech/common/items/IDMetaTool01.java b/src/main/java/gregtech/common/items/IDMetaTool01.java new file mode 100644 index 0000000000..684636100b --- /dev/null +++ b/src/main/java/gregtech/common/items/IDMetaTool01.java @@ -0,0 +1,73 @@ +package gregtech.common.items; + +public enum IDMetaTool01 { + + // Please pretty please, add your entries while conserving the order + SWORD(0), + PICKAXE(2), + SHOVEL(4), + AXE(6), + HOE(8), + SAW(10), + HARDHAMMER(12), + SOFTMALLET(14), + @Deprecated + SOFTHAMMER(14), + WRENCH(16), + FILE(18), + CROWBAR(20), + SCREWDRIVER(22), + MORTAR(24), + WIRECUTTER(26), + SCOOP(28), + BRANCHCUTTER(30), + UNIVERSALSPADE(32), + KNIFE(34), + BUTCHERYKNIFE(36), + @Deprecated + SICKLE(38), + SENSE(40), + PLOW(42), + PLUNGER(44), + ROLLING_PIN(46), + DRILL_LV(100), + DRILL_MV(102), + DRILL_HV(104), + CHAINSAW_LV(110), + CHAINSAW_MV(112), + CHAINSAW_HV(114), + WRENCH_LV(120), + WRENCH_MV(122), + WRENCH_HV(124), + JACKHAMMER(130), + BUZZSAW_LV(140), + @Deprecated + BUZZSAW(140), + BUZZSAW_MV(142), + BUZZSAW_HV(144), + SCREWDRIVER_LV(150), + SCREWDRIVER_MV(152), + SCREWDRIVER_HV(154), + SOLDERING_IRON_LV(160), + SOLDERING_IRON_MV(162), + SOLDERING_IRON_HV(164), + TURBINE_SMALL(170), + TURBINE(172), + TURBINE_LARGE(174), + TURBINE_HUGE(176), + @Deprecated + TURBINE_BLADE(178), + POCKET_MULTITOOL(180), + POCKET_BRANCHCUTTER(182), + POCKET_FILE(184), + POCKET_KNIFE(186), + POCKET_SAW(188), + POCKET_SCREWDRIVER(190), + POCKET_WIRECUTTER(192); + + public final int ID; + + IDMetaTool01(int ID) { + this.ID = ID; + } +} diff --git a/src/main/java/gregtech/common/items/ID_MetaItem_01.java b/src/main/java/gregtech/common/items/ID_MetaItem_01.java deleted file mode 100644 index 5748442f86..0000000000 --- a/src/main/java/gregtech/common/items/ID_MetaItem_01.java +++ /dev/null @@ -1,433 +0,0 @@ -package gregtech.common.items; - -public enum ID_MetaItem_01 { - // Please pretty please, add your entries while conserving the order - - Credit_Greg_Copper(0), - Credit_Greg_Cupronickel(1), - Credit_Greg_Silver(2), - Credit_Greg_Gold(3), - Credit_Greg_Platinum(4), - Credit_Greg_Osmium(5), - Credit_Greg_Naquadah(6), - Credit_Greg_Neutronium(7), - Coin_Gold_Ancient(8), - Coin_Doge(9), - Coin_Chocolate(10), - Credit_Copper(11), - Credit_Silver(13), - Credit_Gold(14), - Credit_Platinum(15), - Credit_Osmium(16), - Electric_Motor_UIV(17), - Electric_Motor_UMV(18), - Electric_Motor_UXV(19), - Electric_Motor_MAX(20), - Electric_Piston_UIV(21), - Electric_Piston_UMV(22), - Electric_Piston_UXV(23), - Electric_Piston_MAX(24), - Electric_Pump_UIV(25), - Electric_Pump_UMV(26), - Electric_Pump_UXV(27), - Electric_Pump_MAX(28), - Conveyor_Module_UIV(29), - Conveyor_Module_UMV(30), - Conveyor_Module_UXV(31), - Conveyor_Module_MAX(32), - Robot_Arm_UIV(33), - Robot_Arm_UMV(34), - Robot_Arm_UXV(35), - Robot_Arm_MAX(36), - Emitter_UIV(37), - Emitter_UMV(38), - Emitter_UXV(39), - Emitter_MAX(40), - Sensor_UIV(41), - Sensor_UMV(42), - Sensor_UXV(43), - Sensor_MAX(44), - Field_Generator_UIV(45), - Field_Generator_UMV(46), - Field_Generator_UXV(47), - Field_Generator_MAX(48), - Component_Minecraft_Wheels_Iron(100), - Component_Minecraft_Wheels_Steel(101), - Compressed_Fireclay(110), - Firebrick(111), - ZPM5(145), - ZPM6(146), - ItemFilter_Export(270), - ItemFilter_Import(271), - Cover_FluidLimiter(272), - Shape_Empty(300), - Shape_Mold_Plate(301), - Shape_Mold_Casing(302), - Shape_Mold_Gear(303), - Shape_Mold_Credit(304), - Shape_Mold_Bottle(305), - Shape_Mold_Ingot(306), - Shape_Mold_Ball(307), - Shape_Mold_Block(308), - Shape_Mold_Nugget(309), - Shape_Mold_Bun(310), - Shape_Mold_Bread(311), - Shape_Mold_Baguette(312), - Shape_Mold_Cylinder(313), - Shape_Mold_Anvil(314), - Shape_Mold_Name(315), - Shape_Mold_Arrow(316), - Shape_Mold_Gear_Small(317), - Shape_Mold_Rod(318), - Shape_Mold_Bolt(319), - Shape_Mold_Round(320), - Shape_Mold_Screw(321), - Shape_Mold_Ring(322), - Shape_Mold_Rod_Long(323), - Shape_Mold_Rotor(324), - Shape_Mold_Turbine_Blade(325), - Shape_Mold_Pipe_Tiny(326), - Shape_Mold_Pipe_Small(327), - Shape_Mold_Pipe_Medium(328), - Shape_Mold_Pipe_Large(329), - Shape_Mold_Pipe_Huge(330), - Shape_Mold_Tool_Head_Drill(331), - Steam_Regulator_LV(332), - Steam_Regulator_MV(333), - Steam_Regulator_HV(334), - Steam_Regulator_EV(335), - Steam_Regulator_IV(336), - Electromagnet_Iron(345), - Electromagnet_Steel(346), - Electromagnet_Neodymium(347), - Electromagnet_Samarium(348), - Electromagnet_Tengam(349), - Shape_Extruder_Plate(350), - Shape_Extruder_Rod(351), - Shape_Extruder_Bolt(352), - Shape_Extruder_Ring(353), - Shape_Extruder_Cell(354), - Shape_Extruder_Ingot(355), - Shape_Extruder_Wire(356), - Shape_Extruder_Casing(357), - Shape_Extruder_Pipe_Tiny(358), - Shape_Extruder_Pipe_Small(359), - Shape_Extruder_Pipe_Medium(360), - Shape_Extruder_Pipe_Large(361), - Shape_Extruder_Pipe_Huge(362), - Shape_Extruder_Block(363), - Shape_Extruder_Sword(364), - Shape_Extruder_Pickaxe(365), - Shape_Extruder_Shovel(366), - Shape_Extruder_Axe(367), - Shape_Extruder_Hoe(368), - Shape_Extruder_Hammer(369), - Shape_Extruder_File(370), - Shape_Extruder_Saw(371), - Shape_Extruder_Gear(372), - Shape_Extruder_Bottle(373), - Shape_Extruder_Rotor(374), - Shape_Extruder_Small_Gear(375), - Shape_Extruder_Turbine_Blade(376), - Shape_Extruder_Tool_Head_Drill(377), - Cover_Chest_Basic(380), - Cover_Chest_Good(381), - Cover_Chest_Advanced(382), - Shape_Slicer_Flat(398), - Shape_Slicer_Stripes(399), - Fuel_Can_Plastic_Empty(400), - Fuel_Can_Plastic_Filled(401), - Spray_Empty(402), - Crate_Empty(403), - Thermos_Can_Empty(404), - Large_Fluid_Cell_Steel(405), - Large_Fluid_Cell_TungstenSteel(406), - Large_Fluid_Cell_Aluminium(407), - Large_Fluid_Cell_StainlessSteel(408), - Large_Fluid_Cell_Titanium(409), - Large_Fluid_Cell_Chrome(410), - Large_Fluid_Cell_Iridium(411), - Large_Fluid_Cell_Osmium(412), - Large_Fluid_Cell_Neutronium(413), - Tesseract(415), - GigaChad(416), - EnergisedTesseract(417), - Black_Hole_Opener(418), - Black_Hole_Closer(419), - StableAdhesive(427), - SuperconductorComposite(428), - NaquadriaSupersolid(429), - Spray_Color_0(430), - Spray_Color_Used_0(431), - Spray_Color_1(432), - Spray_Color_Used_1(433), - Spray_Color_2(434), - Spray_Color_Used_2(435), - Spray_Color_3(436), - Spray_Color_Used_3(437), - Spray_Color_4(438), - Spray_Color_Used_4(439), - Spray_Color_5(440), - Spray_Color_Used_5(441), - Spray_Color_6(442), - Spray_Color_Used_6(443), - Spray_Color_7(444), - Spray_Color_Used_7(445), - Spray_Color_8(446), - Spray_Color_Used_8(447), - Spray_Color_9(448), - Spray_Color_Used_9(449), - Spray_Color_10(450), - Spray_Color_Used_10(451), - Spray_Color_11(452), - Spray_Color_Used_11(453), - Spray_Color_12(454), - Spray_Color_Used_12(455), - Spray_Color_13(456), - Spray_Color_Used_13(457), - Spray_Color_14(458), - Spray_Color_Used_14(459), - Spray_Color_15(460), - Spray_Color_Used_15(461), - Ingot_Heavy1(462), - Ingot_Heavy2(463), - Ingot_Heavy3(464), - Spray_Color_Remover(465), - Spray_Color_Used_Remover(466), - Spray_Color_Remover_Empty(467), - Tool_Matches(471), - Tool_MatchBox_Used(472), - Tool_MatchBox_Full(473), - Tool_Lighter_Invar_Empty(474), - Tool_Lighter_Invar_Used(475), - Tool_Lighter_Invar_Full(476), - Tool_Lighter_Platinum_Empty(477), - Tool_Lighter_Platinum_Used(478), - Tool_Lighter_Platinum_Full(479), - Ingot_Iridium_Alloy(480), - Paper_Printed_Pages(481), - Paper_Magic_Empty(482), - Paper_Magic_Page(483), - Paper_Magic_Pages(484), - Paper_Punch_Card_Empty(485), - Paper_Punch_Card_Encoded(486), - Book_Written_01(487), - Book_Written_02(488), - Book_Written_03(489), - Schematic(490), - Schematic_Crafting(491), - Schematic_1by1(495), - Schematic_2by2(496), - Schematic_3by3(497), - Schematic_Dust(498), - Battery_RE_ULV_Tantalum(499), - Battery_Hull_LV(500), - Battery_Hull_MV(501), - Battery_Hull_HV(502), - BatteryHull_EV(503), - BatteryHull_IV(504), - BatteryHull_LuV(505), - BatteryHull_ZPM(506), - BatteryHull_UV(507), - Battery_SU_LV_Sulfuric_Acid(510), - Battery_SU_LV_Mercury(511), - Battery_RE_LV_Cadmium(517), - Battery_RE_LV_Lithium(518), - Battery_RE_LV_Sodium(519), - Battery_SU_MV_Sulfuric_Acid(520), - Battery_SU_MV_Mercury(521), - Battery_RE_MV_Cadmium(527), - Battery_RE_MV_Lithium(528), - Battery_RE_MV_Sodium(529), - Battery_SU_HV_Sulfuric_Acid(530), - Battery_SU_HV_Mercury(531), - Battery_RE_HV_Cadmium(537), - Battery_RE_HV_Lithium(538), - Battery_RE_HV_Sodium(539), - BatteryHull_EV_Full(540), - BatteryHull_IV_Full(545), - BatteryHull_LuV_Full(550), - BatteryHull_ZPM_Full(555), - BatteryHull_UV_Full(560), - BatteryHull_UHV(561), - BatteryHull_UEV(562), - BatteryHull_UIV(563), - BatteryHull_UMV(564), - BatteryHull_UxV(565), - BatteryHull_UHV_Full(570), - BatteryHull_UEV_Full(575), - Cover_FLuidStorageMonitor(577), - BatteryHull_UIV_Full(580), - BatteryHull_UMV_Full(585), - BatteryHull_UxV_Full(590), - ZPM4(594), - Electric_Motor_UEV(595), - Electric_Motor_UHV(596), - Energy_Lapotronic_Orb(597), - ZPM(598), - Energy_Lapotronic_orb_2(599), - Electric_Motor_LV(600), - Electric_Motor_MV(601), - Electric_Motor_HV(602), - Electric_Motor_EV(603), - Electric_Motor_IV(604), - ZPM2(605), - Electric_Motor_LuV(606), - Electric_Motor_ZPM(607), - Electric_Motor_UV(608), - ZPM3(609), - Electric_Pump_LV(610), - Electric_Pump_MV(611), - Electric_Pump_HV(612), - Electric_Pump_EV(613), - Electric_Pump_IV(614), - Electric_Pump_LuV(615), - Electric_Pump_ZPM(616), - Electric_Pump_UV(617), - Electric_Pump_UHV(618), - Electric_Pump_UEV(619), - Steam_Valve_LV(620), - Steam_Valve_MV(621), - Steam_Valve_HV(622), - Steam_Valve_EV(623), - Steam_Valve_IV(624), - Conveyor_Module_LV(630), - Conveyor_Module_MV(631), - Conveyor_Module_HV(632), - Conveyor_Module_EV(633), - Conveyor_Module_IV(634), - Conveyor_Module_LuV(635), - Conveyor_Module_ZPM(636), - Conveyor_Module_UV(637), - Conveyor_Module_UHV(638), - Conveyor_Module_UEV(639), - Electric_Piston_LV(640), - Electric_Piston_MV(641), - Electric_Piston_HV(642), - Electric_Piston_EV(643), - Electric_Piston_IV(644), - Electric_Piston_LuV(645), - Electric_Piston_ZPM(646), - Electric_Piston_UV(647), - Electric_Piston_UHV(648), - Electric_Piston_UEV(649), - Robot_Arm_LV(650), - Robot_Arm_MV(651), - Robot_Arm_HV(652), - Robot_Arm_EV(653), - Robot_Arm_IV(654), - Robot_Arm_LuV(655), - Robot_Arm_ZPM(656), - Robot_Arm_UV(657), - Robot_Arm_UHV(658), - Robot_Arm_UEV(659), - FluidRegulator_LV(660), - FluidRegulator_MV(661), - FluidRegulator_HV(662), - FluidRegulator_EV(663), - FluidRegulator_IV(664), - FluidRegulator_LuV(665), - FluidRegulator_ZPM(666), - FluidRegulator_UV(667), - Circuit_Parts_Crystal_Chip_Wetware(668), - FluidFilter(669), - Field_Generator_LV(670), - Field_Generator_MV(671), - Field_Generator_HV(672), - Field_Generator_EV(673), - Field_Generator_IV(674), - Field_Generator_LuV(675), - Field_Generator_ZPM(676), - Field_Generator_UV(677), - Field_Generator_UHV(678), - Field_Generator_UEV(679), - Emitter_LV(680), - Emitter_MV(681), - Emitter_HV(682), - Emitter_EV(683), - Emitter_IV(684), - Emitter_LuV(685), - Emitter_ZPM(686), - Emitter_UV(687), - Emitter_UHV(688), - Emitter_UEV(689), - Sensor_LV(690), - Sensor_MV(691), - Sensor_HV(692), - Sensor_EV(693), - Sensor_IV(694), - Sensor_LuV(695), - Sensor_ZPM(696), - Sensor_UV(697), - Sensor_UHV(698), - Sensor_UEV(699), - Circuit_Primitive(700), - Circuit_Basic(701), - Circuit_Good(702), - Circuit_Advanced(703), - Circuit_Data(704), - Circuit_Elite(705), - Circuit_Master(706), - Tool_DataOrb(707), - Tool_DataStick(708), - Tool_Cover_Copy_Paste(709), - Circuit_Board_Basic(710), - Circuit_Board_Advanced(711), - Circuit_Board_Elite(712), - Circuit_Parts_Crystal_Chip_Elite(713), - Circuit_Parts_Crystal_Chip_Master(714), - Circuit_Parts_Advanced(715), - Circuit_Parts_Wiring_Basic(716), - Circuit_Parts_Wiring_Advanced(717), - Circuit_Parts_Wiring_Elite(718), - Empty_Board_Basic(719), - Empty_Board_Elite(720), - Component_Sawblade_Diamond(721), - Component_Grinder_Diamond(722), - Component_Grinder_Tungsten(723), - QuantumEye(724), - QuantumStar(725), - Gravistar(726), - Upgrade_Muffler(727), - Upgrade_Lock(728), - Component_Filter(729), - Cover_Controller(730), - Cover_ActivityDetector(731), - Cover_FluidDetector(732), - Cover_ItemDetector(733), - Cover_EnergyDetector(734), - Cover_PlayerDetector(735), - Energy_Module(736), - Energy_Cluster(737), - Cover_Screen(740), - Cover_RedstoneTransmitterExternal(741), - Cover_RedstoneTransmitterInternal(742), - Cover_Crafting(744), - Cover_Drain(745), - Cover_RedstoneReceiverExternal(746), - Cover_RedstoneReceiverInternal(747), - Cover_NeedsMaintenance(748), - Cover_Shutter(749), - Cover_SolarPanel(750), - Cover_SolarPanel_8V(751), - Cover_SolarPanel_LV(752), - Cover_SolarPanel_MV(753), - Cover_SolarPanel_HV(754), - Cover_SolarPanel_EV(755), - Cover_SolarPanel_IV(756), - Cover_SolarPanel_LuV(757), - Cover_SolarPanel_ZPM(758), - Cover_SolarPanel_UV(759), - Tool_Sonictron(760), - Tool_Cheat(761), - Tool_Scanner(762), - NC_SensorKit(763), - Duct_Tape(764), - McGuffium_239(765); - - public final int ID; - - ID_MetaItem_01(int ID) { - this.ID = ID; - } -} diff --git a/src/main/java/gregtech/common/items/ID_MetaItem_02.java b/src/main/java/gregtech/common/items/ID_MetaItem_02.java deleted file mode 100644 index a13b858bd7..0000000000 --- a/src/main/java/gregtech/common/items/ID_MetaItem_02.java +++ /dev/null @@ -1,208 +0,0 @@ -package gregtech.common.items; - -public enum ID_MetaItem_02 { - - // Please pretty please, add your entries while conserving the order - ThermosCan_Dark_Coffee(0), - ThermosCan_Dark_Cafe_au_lait(1), - ThermosCan_Coffee(2), - ThermosCan_Cafe_au_lait(3), - ThermosCan_Lait_au_cafe(4), - ThermosCan_Dark_Chocolate_Milk(5), - ThermosCan_Chocolate_Milk(6), - ThermosCan_Tea(7), - ThermosCan_Sweet_Tea(8), - ThermosCan_Ice_Tea(9), - GelledToluene(10), - Bottle_Purple_Drink(100), - Bottle_Grape_Juice(101), - Bottle_Wine(102), - Bottle_Vinegar(103), - Bottle_Potato_Juice(104), - Bottle_Vodka(105), - Bottle_Leninade(106), - Bottle_Mineral_Water(107), - Bottle_Salty_Water(108), - Bottle_Reed_Water(109), - Bottle_Rum(110), - Bottle_Pirate_Brew(111), - Bottle_Hops_Juice(112), - Bottle_Dark_Beer(113), - Bottle_Dragon_Blood(114), - Bottle_Wheaty_Juice(115), - Bottle_Scotch(116), - Bottle_Glen_McKenner(117), - Bottle_Wheaty_Hops_Juice(118), - Bottle_Beer(119), - Bottle_Chilly_Sauce(120), - Bottle_Hot_Sauce(121), - Bottle_Diabolo_Sauce(122), - Bottle_Diablo_Sauce(123), - Bottle_Snitches_Glitch_Sauce(124), - Bottle_Apple_Juice(125), - Bottle_Cider(126), - Bottle_Golden_Apple_Juice(127), - Bottle_Golden_Cider(128), - Bottle_Iduns_Apple_Juice(129), - Bottle_Notches_Brew(130), - Bottle_Lemon_Juice(131), - Bottle_Limoncello(132), - Bottle_Lemonade(133), - Bottle_Alcopops(134), - Bottle_Cave_Johnsons_Grenade_Juice(135), - Bottle_Milk(136), - Bottle_Holy_Water(137), - Food_Potato_On_Stick(200), - Food_Potato_On_Stick_Roasted(201), - Food_Raw_Fries(202), - Food_Fries(203), - Food_Packaged_Fries(204), - Food_Raw_PotatoChips(205), - Food_PotatoChips(206), - Food_ChiliChips(207), - Food_Packaged_PotatoChips(208), - Food_Packaged_ChiliChips(209), - Food_Chum(210), - Food_Chum_On_Stick(211), - Food_Dough_Sugar(212), - Food_Dough_Chocolate(213), - Food_Raw_Cookie(214), - Food_Sliced_Buns(220), - Food_Burger_Veggie(221), - Food_Burger_Cheese(222), - Food_Burger_Meat(223), - Food_Burger_Chum(224), - Food_Sliced_Breads(230), - Food_Sandwich_Veggie(231), - Food_Sandwich_Cheese(232), - Food_Sandwich_Bacon(233), - Food_Sandwich_Steak(234), - Food_Sliced_Baguettes(240), - Food_Large_Sandwich_Veggie(241), - Food_Large_Sandwich_Cheese(242), - Food_Large_Sandwich_Bacon(243), - Food_Large_Sandwich_Steak(244), - Food_Raw_Pizza_Veggie(250), - Food_Raw_Pizza_Cheese(251), - Food_Raw_Pizza_Meat(252), - Food_Baked_Pizza_Veggie(260), - Food_Baked_Pizza_Cheese(261), - Food_Baked_Pizza_Meat(262), - SFMixture(270), - MSFMixture(271), - Dye_Indigo(410), - Dye_Color_00(414), - Dye_Color_01(415), - Dye_Color_02(416), - Dye_Color_03(417), - Dye_Color_04(418), - Dye_Color_05(419), - Dye_Color_06(420), - Dye_Color_07(421), - Dye_Color_08(422), - Dye_Color_09(423), - Dye_Color_10(424), - Dye_Color_11(425), - Dye_Color_12(426), - Dye_Color_13(427), - Dye_Color_14(428), - Dye_Color_15(429), - Plank_Oak(470), - Plank_Spruce(471), - Plank_Birch(472), - Plank_Jungle(473), - Plank_Acacia(474), - Plank_DarkOak(475), - Plank_Larch(476), - Plank_Teak(477), - Plank_Acacia_Green(478), - Plank_Lime(479), - Plank_Chestnut(480), - Plank_Wenge(481), - Plank_Baobab(482), - Plank_Sequoia(483), - Plank_Kapok(484), - Plank_Ebony(485), - Plank_Mahagony(486), - Plank_Balsa(487), - Plank_Willow(488), - Plank_Walnut(489), - Plank_Greenheart(490), - Plank_Cherry(491), - Plank_Mahoe(492), - Plank_Poplar(493), - Plank_Palm(494), - Plank_Papaya(495), - Plank_Pine(496), - Plank_Plum(497), - Plank_Maple(498), - Plank_Citrus(499), - Crop_Drop_Plumbilia(500), - Crop_Drop_Argentia(501), - Crop_Drop_Indigo(502), - Crop_Drop_Ferru(503), - Crop_Drop_Aurelia(504), - Crop_Drop_TeaLeaf(505), - Crop_Drop_OilBerry(510), - Crop_Drop_BobsYerUncleRanks(511), - Crop_Drop_UUMBerry(512), - Crop_Drop_UUABerry(513), - Crop_Drop_MilkWart(520), - Crop_Drop_Bauxite(521), - Crop_Drop_Ilmenite(522), - Crop_Drop_Pitchblende(523), - Crop_Drop_Uraninite(524), - Crop_Drop_Thorium(526), - Crop_Drop_Nickel(527), - Crop_Drop_Zinc(528), - Crop_Drop_Manganese(529), - Crop_Drop_Coppon(530), - Crop_Drop_Scheelite(531), - Crop_Drop_Platinum(532), - Crop_Drop_Iridium(533), - Crop_Drop_Osmium(534), - Crop_Drop_Naquadah(535), - Crop_Drop_Mica(538), - Crop_Drop_Tine(540), - Crop_Drop_Chilly(550), - Crop_Drop_Lemon(551), - Crop_Drop_Tomato(552), - Crop_Drop_MTomato(553), - Crop_Drop_Grapes(554), - Crop_Drop_Onion(555), - Crop_Drop_Cucumber(556), - Crop_Drop_Rape(557), - Food_Cheese(558), - Food_Dough(559), - Food_Flat_Dough(560), - Food_Raw_Bread(561), - Food_Raw_Bun(562), - Food_Raw_Baguette(563), - Food_Baked_Bun(564), - Food_Baked_Baguette(565), - Food_Sliced_Bread(566), - Food_Sliced_Bun(567), - Food_Sliced_Baguette(568), - Food_Raw_Cake(569), - Food_Baked_Cake(570), - Food_Sliced_Lemon(571), - Food_Sliced_Tomato(572), - Food_Sliced_Onion(573), - Food_Sliced_Cucumber(574), - Food_Sliced_Cheese(576), - Cover_AdvancedRedstoneTransmitterExternal(577), - Cover_AdvancedRedstoneTransmitterInternal(578), - Cover_AdvancedRedstoneReceiverExternal(579), - Cover_AdvancedRedstoneReceiverInternal(580), - Cover_WirelessFluidDetector(581), - Cover_WirelessItemDetector(582), - Cover_WirelessNeedsMaintainance(583), - Cover_WirelessActivityDetector(584), - Display_ITS_FREE(765); - - public final int ID; - - ID_MetaItem_02(int ID) { - this.ID = ID; - } -} diff --git a/src/main/java/gregtech/common/items/ID_MetaItem_03.java b/src/main/java/gregtech/common/items/ID_MetaItem_03.java deleted file mode 100644 index 64b3f07249..0000000000 --- a/src/main/java/gregtech/common/items/ID_MetaItem_03.java +++ /dev/null @@ -1,242 +0,0 @@ -package gregtech.common.items; - -public enum ID_MetaItem_03 { - - // Please pretty please, add your entries while conserving the order - Circuit_Board_Wetware(6), - Circuit_Board_Plastic(7), - Circuit_Board_Bio(8), - Circuit_Parts_ResistorSMD(11), - Circuit_Parts_Glass_Tube(12), - Circuit_Parts_Coil(14), - Circuit_Parts_DiodeSMD(16), - Circuit_Parts_TransistorSMD(18), - Circuit_Parts_CapacitorSMD(20), - Circuit_Parts_GlassFiber(21), - Circuit_Parts_PetriDish(22), - Circuit_Parts_Reinforced_Glass_Tube(23), - Circuit_Parts_ResistorASMD(24), - Circuit_Parts_DiodeASMD(25), - Circuit_Parts_TransistorASMD(26), - Circuit_Parts_CapacitorASMD(27), - Circuit_Silicon_Ingot(30), - Circuit_Silicon_Ingot2(31), - Circuit_Silicon_Ingot3(32), - Circuit_Silicon_Wafer(33), - Circuit_Silicon_Wafer2(34), - Circuit_Silicon_Wafer3(35), - Circuit_Wafer_ILC(36), - Circuit_Chip_ILC(37), - Circuit_Wafer_Ram(38), - Circuit_Chip_Ram(39), - Circuit_Wafer_NAND(40), - Circuit_Chip_NAND(41), - Circuit_Wafer_NOR(42), - Circuit_Chip_NOR(43), - Circuit_Wafer_CPU(44), - Circuit_Chip_CPU(45), - Circuit_Wafer_SoC(46), - Circuit_Chip_SoC(47), - Circuit_Wafer_SoC2(48), - Circuit_Chip_SoC2(49), - Circuit_Wafer_PIC(50), - Circuit_Chip_PIC(51), - Circuit_Wafer_HPIC(52), - Circuit_Chip_HPIC(53), - Circuit_Wafer_NanoCPU(54), - Circuit_Chip_NanoCPU(55), - Circuit_Wafer_QuantumCPU(56), - Circuit_Chip_QuantumCPU(57), - Circuit_Wafer_UHPIC(58), - Circuit_Chip_UHPIC(59), - Circuit_Wafer_Simple_SoC(60), - Circuit_Chip_Simple_SoC(61), - Circuit_Wafer_ULPIC(62), - Circuit_Chip_ULPIC(63), - Circuit_Wafer_LPIC(64), - Circuit_Chip_LPIC(65), - Circuit_Chip_CrystalSoC2(68), - Circuit_Parts_RawCrystalChip(69), - Circuit_Chip_CrystalCPU(70), - Circuit_Chip_CrystalSoC(71), - Circuit_Chip_NeuroCPU(72), - Circuit_Chip_Stemcell(73), - Circuit_Parts_RawCrystalParts(74), - NandChip(75), - Circuit_Chip_Biocell(76), - Circuit_Chip_BioCPU(77), - Circuit_Microprocessor(78), - Circuit_Integrated_Good(79), - Circuit_Processor(80), - Circuit_Nanoprocessor(82), - Circuit_Nanocomputer(83), - Circuit_Elitenanocomputer(84), - Circuit_Quantumprocessor(85), - Circuit_Quantumcomputer(86), - Circuit_Masterquantumcomputer(87), - Circuit_Quantummainframe(88), - Circuit_Crystalprocessor(89), - Circuit_Ultimatecrystalcomputer(90), - Circuit_Crystalmainframe(91), - Circuit_Neuroprocessor(92), - Circuit_Wetwarecomputer(93), - Circuit_Wetwaresupercomputer(94), - Circuit_Wetwaremainframe(95), - Circuit_Crystalcomputer(96), - Circuit_Bioprocessor(97), - Circuit_Biowarecomputer(98), - Circuit_Biowaresupercomputer(99), - Circuit_Board_Coated_Basic(100), - Circuit_Board_Phenolic_Good(101), - Circuit_Board_Epoxy_Advanced(102), - Circuit_Board_Fiberglass_Advanced(103), - Circuit_Board_Multifiberglass_Elite(104), - Circuit_Board_Wetware_Extreme(105), - Circuit_Board_Plastic_Advanced(106), - Circuit_Board_Bio_Ultra(107), - Tube_Wires(110), - Circuit_Biomainframe(120), - Cover_SolarPanel_UHV(130), - Cover_SolarPanel_UEV(131), - Cover_SolarPanel_UIV(132), - ULV_Coil(140), - LV_Coil(141), - MV_Coil(142), - HV_Coil(143), - EV_Coil(144), - IV_Coil(145), - LuV_Coil(146), - ZPM_Coil(147), - UV_Coil(148), - UHV_Coil(149), - Circuit_Silicon_Ingot4(150), - Circuit_Silicon_Wafer4(151), - Circuit_Silicon_Ingot5(152), - Circuit_Silicon_Wafer5(153), - Circuit_OpticalProcessor(154), - Circuit_OpticalAssembly(155), - Circuit_OpticalComputer(156), - Circuit_OpticalMainframe(157), - Circuit_Wafer_NPIC(160), - Circuit_Chip_NPIC(161), - Circuit_Wafer_PPIC(162), - Circuit_Chip_PPIC(163), - Circuit_Wafer_QPIC(164), - Circuit_Chip_QPIC(165), - Circuit_ExoticProcessor(166), - Circuit_ExoticAssembly(167), - Circuit_ExoticComputer(168), - Circuit_ExoticMainframe(169), - Circuit_CosmicProcessor(170), - Circuit_CosmicAssembly(171), - Circuit_CosmicComputer(172), - Circuit_CosmicMainframe(173), - Circuit_TranscendentProcessor(174), - Circuit_TranscendentAssembly(175), - Circuit_TranscendentComputer(176), - Circuit_TranscendentMainframe(177), - Circuit_Parts_ResistorXSMD(178), - Circuit_Parts_DiodeXSMD(179), - Circuit_Parts_TransistorXSMD(180), - Circuit_Parts_CapacitorXSMD(181), - Circuit_Parts_InductorSMD(182), - Circuit_Parts_InductorASMD(183), - Circuit_Parts_InductorXSMD(184), - Circuit_Wafer_Bioware(188), - Circuit_Parts_Chip_Bioware(189), - GalliumArsenideCrystal(190), - GalliumArsenideCrystalSmallPart(191), - KevlarFiber(192), - WovenKevlar(193), - Spinneret(194), - IndustrialApiary_Upgrade_Frame(199), - IndustrialApiary_Upgrade_Acceleration_1(200), - IndustrialApiary_Upgrade_Acceleration_2(201), - IndustrialApiary_Upgrade_Acceleration_3(202), - IndustrialApiary_Upgrade_Acceleration_4(203), - IndustrialApiary_Upgrade_Acceleration_5(204), - IndustrialApiary_Upgrade_Acceleration_6(205), - IndustrialApiary_Upgrade_Acceleration_7(206), - IndustrialApiary_Upgrade_Acceleration_8(207), - IndustrialApiary_Upgrade_Acceleration_8_Upgraded(208), - IndustrialApiary_Upgrade_PRODUCTION(209), - IndustrialApiary_Upgrade_PLAINS(210), - IndustrialApiary_Upgrade_LIGHT(211), - IndustrialApiary_Upgrade_FLOWERING(212), - IndustrialApiary_Upgrade_WINTER(213), - IndustrialApiary_Upgrade_DRYER(214), - IndustrialApiary_Upgrade_AUTOMATION(215), - IndustrialApiary_Upgrade_HUMIDIFIER(216), - IndustrialApiary_Upgrade_HELL(217), - IndustrialApiary_Upgrade_POLLEN(218), - IndustrialApiary_Upgrade_DESERT(219), - IndustrialApiary_Upgrade_COOLER(220), - IndustrialApiary_Upgrade_LIFESPAN(221), - IndustrialApiary_Upgrade_SEAL(222), - IndustrialApiary_Upgrade_STABILIZER(223), - IndustrialApiary_Upgrade_JUNGLE(224), - IndustrialApiary_Upgrade_TERRITORY(225), - IndustrialApiary_Upgrade_OCEAN(226), - IndustrialApiary_Upgrade_SKY(227), - IndustrialApiary_Upgrade_HEATER(228), - IndustrialApiary_Upgrade_SIEVE(229), - NuclearStar(230), - IndustrialApiary_Upgrade_UNLIGHT(231), - Cover_Metrics_Transmitter(232), - Activated_Carbon_Filter_Mesh(233), - Quark_Catalyst_Housing(234), - Quark_Creation_Catalyst_Up(235), - Quark_Creation_Catalyst_Down(236), - Quark_Creation_Catalyst_Strange(237), - Quark_Creation_Catalyst_Charm(238), - Quark_Creation_Catalyst_Bottom(239), - Quark_Creation_Catalyst_Top(240), - Quark_Creation_Catalyst_Unaligned(241), - Circuit_Silicon_Ingot6(721), - Circuit_Silicon_Wafer6(722), - Circuit_Silicon_Wafer7(723), - Circuit_Chip_Optical(724), - Optically_Compatible_Memory(725), - Optically_Perfected_CPU(726), - Optical_Cpu_Containment_Housing(727), - Circuit_Board_Optical(728), - White_Dwarf_Shape_Extruder_Plate(729), - White_Dwarf_Shape_Extruder_Rod(730), - White_Dwarf_Shape_Extruder_Bolt(731), - White_Dwarf_Shape_Extruder_Ring(732), - White_Dwarf_Shape_Extruder_Cell(733), - White_Dwarf_Shape_Extruder_Ingot(734), - White_Dwarf_Shape_Extruder_Wire(735), - White_Dwarf_Shape_Extruder_Casing(736), - White_Dwarf_Shape_Extruder_Pipe_Tiny(737), - White_Dwarf_Shape_Extruder_Pipe_Small(738), - White_Dwarf_Shape_Extruder_Pipe_Medium(739), - White_Dwarf_Shape_Extruder_Pipe_Large(740), - White_Dwarf_Shape_Extruder_Pipe_Huge(741), - White_Dwarf_Shape_Extruder_Block(742), - White_Dwarf_Shape_Extruder_Sword(743), - White_Dwarf_Shape_Extruder_Pickaxe(744), - White_Dwarf_Shape_Extruder_Shovel(745), - White_Dwarf_Shape_Extruder_Axe(746), - White_Dwarf_Shape_Extruder_Hoe(747), - White_Dwarf_Shape_Extruder_Hammer(748), - White_Dwarf_Shape_Extruder_File(749), - White_Dwarf_Shape_Extruder_Saw(750), - White_Dwarf_Shape_Extruder_Gear(751), - White_Dwarf_Shape_Extruder_Bottle(752), - White_Dwarf_Shape_Extruder_Rotor(753), - White_Dwarf_Shape_Extruder_Small_Gear(754), - White_Dwarf_Shape_Extruder_Turbine_Blade(755), - White_Dwarf_Shape_Extruder_ToolHeadDrill(756), - Timepiece(757), - Transdimensional_Alignment_Matrix(758), - Thermal_Superconductor(759), - Relativistic_Heat_Capacitor(760), - Phononic_Seed_Crystal(761); - - public final int ID; - - ID_MetaItem_03(int ID) { - this.ID = ID; - } -} diff --git a/src/main/java/gregtech/common/items/ID_MetaTool_01.java b/src/main/java/gregtech/common/items/ID_MetaTool_01.java deleted file mode 100644 index 195bd1aef8..0000000000 --- a/src/main/java/gregtech/common/items/ID_MetaTool_01.java +++ /dev/null @@ -1,73 +0,0 @@ -package gregtech.common.items; - -public enum ID_MetaTool_01 { - - // Please pretty please, add your entries while conserving the order - SWORD(0), - PICKAXE(2), - SHOVEL(4), - AXE(6), - HOE(8), - SAW(10), - HARDHAMMER(12), - SOFTMALLET(14), - @Deprecated - SOFTHAMMER(14), - WRENCH(16), - FILE(18), - CROWBAR(20), - SCREWDRIVER(22), - MORTAR(24), - WIRECUTTER(26), - SCOOP(28), - BRANCHCUTTER(30), - UNIVERSALSPADE(32), - KNIFE(34), - BUTCHERYKNIFE(36), - @Deprecated - SICKLE(38), - SENSE(40), - PLOW(42), - PLUNGER(44), - ROLLING_PIN(46), - DRILL_LV(100), - DRILL_MV(102), - DRILL_HV(104), - CHAINSAW_LV(110), - CHAINSAW_MV(112), - CHAINSAW_HV(114), - WRENCH_LV(120), - WRENCH_MV(122), - WRENCH_HV(124), - JACKHAMMER(130), - BUZZSAW_LV(140), - @Deprecated - BUZZSAW(140), - BUZZSAW_MV(142), - BUZZSAW_HV(144), - SCREWDRIVER_LV(150), - SCREWDRIVER_MV(152), - SCREWDRIVER_HV(154), - SOLDERING_IRON_LV(160), - SOLDERING_IRON_MV(162), - SOLDERING_IRON_HV(164), - TURBINE_SMALL(170), - TURBINE(172), - TURBINE_LARGE(174), - TURBINE_HUGE(176), - @Deprecated - TURBINE_BLADE(178), - POCKET_MULTITOOL(180), - POCKET_BRANCHCUTTER(182), - POCKET_FILE(184), - POCKET_KNIFE(186), - POCKET_SAW(188), - POCKET_SCREWDRIVER(190), - POCKET_WIRECUTTER(192); - - public final int ID; - - ID_MetaTool_01(int ID) { - this.ID = ID; - } -} diff --git a/src/main/java/gregtech/common/items/ItemAdvancedSensorCard.java b/src/main/java/gregtech/common/items/ItemAdvancedSensorCard.java new file mode 100644 index 0000000000..8c68951bb7 --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemAdvancedSensorCard.java @@ -0,0 +1,330 @@ +package gregtech.common.items; + +import static gregtech.api.enums.Mods.GregTech; +import static gregtech.common.covers.CoverMetricsTransmitter.CARD_STATE_KEY; +import static gregtech.common.covers.CoverMetricsTransmitter.FREQUENCY_LSB_KEY; +import static gregtech.common.covers.CoverMetricsTransmitter.FREQUENCY_MSB_KEY; +import static gregtech.common.covers.CoverMetricsTransmitter.MACHINE_KEY; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Predicate; +import java.util.stream.IntStream; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.common.misc.GlobalMetricsCoverDatabase; +import gregtech.common.misc.GlobalMetricsCoverDatabase.State; +import shedar.mods.ic2.nuclearcontrol.api.CardState; +import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper; +import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource; +import shedar.mods.ic2.nuclearcontrol.api.PanelSetting; +import shedar.mods.ic2.nuclearcontrol.api.PanelString; + +@SuppressWarnings("unused") +public class ItemAdvancedSensorCard extends Item implements IPanelDataSource { + + public static final UUID CARD_TYPE_ID = UUID.fromString("ff952e84-7608-4c4a-85af-dd6e1aa27fc7"); + + // This has obfuscated formatting, so no need to localize it. + private static final String SELF_DESTRUCTED_OUTPUT = EnumChatFormatting.OBFUSCATED + "critical error" + + EnumChatFormatting.RESET; + + private static final ImmutableList DECONSTRUCTED_OUTPUT = ImmutableList.of( + StatCollector.translateToLocal("gt.item.adv_sensor_card.error.deconstructed.1"), + StatCollector.translateToLocal("gt.item.adv_sensor_card.error.deconstructed.2")); + + private static final String NO_DATA_FOUND = StatCollector.translateToLocal("gt.item.adv_sensor_card.error.no_data"); + + private static final String MACHINE_NAME_KEY = "client_machine_name"; + private static final String OUTPUT_ENTRY_KEY = "client_entry_%d"; + private static final String OUTPUT_ENTRY_LENGTH_KEY = "client_entry_length"; + + private int payloadSize = 0; + + @SideOnly(Side.CLIENT) + private IIcon normalIcon; + @SideOnly(Side.CLIENT) + private IIcon selfDestructedIcon; + + @SuppressWarnings("unused") + public ItemAdvancedSensorCard() { + super(); + + GameRegistry.registerItem(this, "gt.advancedsensorcard", GregTech.ID); + setUnlocalizedName("gt.advancedsensorcard"); + setMaxStackSize(1); + setNoRepair(); + } + + @Override + public void addInformation(final ItemStack itemStack, final EntityPlayer player, final List tooltip, + final boolean p_77624_4_) { + super.addInformation(itemStack, player, tooltip, p_77624_4_); + + final Optional cardState = getCardState(itemStack); + if (cardState.isPresent()) { + final State state = cardState.get(); + + if (state == State.SELF_DESTRUCTED) { + tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.1")); + tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.2")); + tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.3")); + } else { + getMachineName(itemStack).ifPresent( + machineName -> tooltip.add( + StatCollector + .translateToLocalFormatted("gt.item.adv_sensor_card.tooltip.machine", machineName))); + getUUID(itemStack).ifPresent( + uuid -> tooltip.add( + StatCollector + .translateToLocalFormatted("gt.item.adv_sensor_card.tooltip.frequency", uuid.toString()))); + } + } else { + tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.recipe_hint")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aOutputSubItems) {} + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister aIconRegister) { + super.registerIcons(aIconRegister); + itemIcon = aIconRegister.registerIcon(GregTech.ID + ":gt.advancedsensorcard"); + normalIcon = itemIcon; + selfDestructedIcon = aIconRegister.registerIcon(GregTech.ID + ":gt.advancedsensorcardburned"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(final ItemStack stack, final int renderPass) { + return getIconIndex(stack); + } + + @Override + public IIcon getIconIndex(final ItemStack itemStack) { + return getCardState(itemStack).filter(Predicate.isEqual(State.SELF_DESTRUCTED)) + .map(ignored -> selfDestructedIcon) + .orElse(normalIcon); + } + + @Override + public CardState update(TileEntity tileEntity, ICardWrapper card, int maxRange) { + return update(tileEntity.getWorldObj(), card, maxRange); + } + + @Override + public CardState update(World world, ICardWrapper card, int maxRange) { + final Optional optionalData = getDataFromDatabase(card); + + optionalData.ifPresent(data -> { + final State machineState = data.getState(); + reconcileSelfDestructedCard(card.getItemStack(), machineState); + card.setInt(CARD_STATE_KEY, machineState.getType()); + + getMachineName(card.getItemStack()) + .ifPresent(name -> card.setString(MACHINE_NAME_KEY, machineState == State.SELF_DESTRUCTED ? "" : name)); + + final ImmutableList.Builder builder = ImmutableList.builder(); + switch (machineState) { + case SELF_DESTRUCTED -> builder.add(SELF_DESTRUCTED_OUTPUT); + case HOST_DECONSTRUCTED -> builder.addAll(DECONSTRUCTED_OUTPUT); + case OPERATIONAL -> { + data.getCoordinates() + .ifPresent( + coordinates -> builder.add( + StatCollector.translateToLocalFormatted( + "gt.item.adv_sensor_card.dimension", + coordinates.getDimension()), + StatCollector.translateToLocalFormatted( + "gt.item.adv_sensor_card.coords", + coordinates.getLocalizedCoordinates()))); + + data.getPayload() + .ifPresent(builder::addAll); + } + default -> builder.add(NO_DATA_FOUND); + } + + final List payload = builder.build(); + card.setInt(OUTPUT_ENTRY_LENGTH_KEY, payload.size()); + for (int i = 0; i < payload.size(); i++) { + final String payloadItem = payload.get(i); + if (!payloadItem.isEmpty()) { + card.setString(String.format(OUTPUT_ENTRY_KEY, i), payloadItem); + } + } + }); + + return CardState.OK; + } + + @Override + public List getStringData(final int displaySettings, final ICardWrapper card, + final boolean showLabels) { + final List returned = new ArrayList<>(); + final String machineName = card.getString(MACHINE_NAME_KEY); + final int bitmaskOffset; + + payloadSize = card.getInt(OUTPUT_ENTRY_LENGTH_KEY); + + if (!machineName.isEmpty() && (displaySettings & 1) != 0) { + returned.add(panelString(machineName, true)); + payloadSize += 1; + bitmaskOffset = 1; + } else { + bitmaskOffset = 0; + } + + // Not reusing payloadSize here because it can be conditionally mutated. + IntStream.range(0, card.getInt(OUTPUT_ENTRY_LENGTH_KEY)) + .forEach(i -> { + if ((displaySettings & 1 << (i + bitmaskOffset)) != 0) { + returned.add(panelString(card.getString(String.format(OUTPUT_ENTRY_KEY, i)))); + } + }); + + return returned; + } + + @Override + public List getSettingsList() { + return payloadSize == 0 ? ImmutableList.of() + : ImmutableList.copyOf( + IntStream.range(0, Math.min(payloadSize, 31)) + .mapToObj(i -> new PanelSetting(String.valueOf(i + 1), 1 << i, getCardType())) + .iterator()); + } + + @Override + public UUID getCardType() { + return CARD_TYPE_ID; + } + + @Override + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int slot, boolean isHeld) { + super.onUpdate(stack, worldIn, entityIn, slot, isHeld); + // At the time of this comment's writing, there are 52 matches of the regex: + // /% \d+0 \)?\s*== 0/ in the code base, indicating an over-reliance on events happening on either the 10th or + // 20th tick. Let's tick on something slightly off of that. A prime number will do nicely. + if ((worldIn.getWorldTime() % 20) == 13) { + getDataFromDatabase(stack).ifPresent(data -> { + reconcileSelfDestructedCard(stack, data.getState()); + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + stack.getTagCompound() + .setInteger( + CARD_STATE_KEY, + data.getState() + .getType()); + }); + } + } + + private void reconcileSelfDestructedCard(ItemStack stack, State newState) { + getUUID(stack).ifPresent(uuid -> getCardState(stack).ifPresent(oldState -> { + if (newState == State.SELF_DESTRUCTED && oldState != State.SELF_DESTRUCTED) { + GlobalMetricsCoverDatabase.clearSelfDestructedFrequency(uuid); + } + })); + + } + + @NotNull + private Optional getCardState(ICardWrapper card) { + return getCardState(card.getItemStack()); + } + + @NotNull + private Optional getCardState(ItemStack itemStack) { + if (itemStack.hasTagCompound() && itemStack.getTagCompound() + .hasKey(CARD_STATE_KEY)) { + return State.find( + itemStack.getTagCompound() + .getInteger(CARD_STATE_KEY)); + } + + return Optional.empty(); + } + + @NotNull + private Optional getUUID(ItemStack stack) { + if (stack.hasTagCompound()) { + NBTTagCompound nbt = stack.getTagCompound(); + if (nbt.hasKey(FREQUENCY_LSB_KEY) && nbt.hasKey(FREQUENCY_MSB_KEY)) { + return Optional.of(new UUID(nbt.getLong(FREQUENCY_MSB_KEY), nbt.getLong(FREQUENCY_LSB_KEY))); + } + } + + return Optional.empty(); + } + + @NotNull + private Optional getMachineName(ItemStack stack) { + if (stack.hasTagCompound() && stack.getTagCompound() + .hasKey(MACHINE_KEY)) { + try { + final ItemStack machine = ItemStack.loadItemStackFromNBT( + stack.getTagCompound() + .getCompoundTag(MACHINE_KEY)); + if (machine != null) { + return Optional.of(machine.getDisplayName()); + } + } catch (Exception ignored) {} + } + + return Optional.empty(); + } + + @NotNull + private Optional getDataFromDatabase(ICardWrapper card) { + return getDataFromDatabase(card.getItemStack()); + } + + @NotNull + private Optional getDataFromDatabase(ItemStack stack) { + return getUUID(stack).flatMap(GlobalMetricsCoverDatabase::getData); + } + + @NotNull + private static PanelString panelString(String info) { + return panelString(info, false); + } + + @NotNull + private static PanelString panelString(String info, boolean center) { + final PanelString panelString = new PanelString(); + if (center) { + panelString.textCenter = info; + } else { + panelString.textLeft = info; + } + return panelString; + + } +} diff --git a/src/main/java/gregtech/common/items/ItemComb.java b/src/main/java/gregtech/common/items/ItemComb.java index eaecd19f73..68cd902d86 100644 --- a/src/main/java/gregtech/common/items/ItemComb.java +++ b/src/main/java/gregtech/common/items/ItemComb.java @@ -1,9 +1,9 @@ package gregtech.common.items; -import static gregtech.api.enums.GT_Values.L; -import static gregtech.api.enums.GT_Values.NF; -import static gregtech.api.enums.GT_Values.NI; -import static gregtech.api.enums.GT_Values.V; +import static gregtech.api.enums.GTValues.L; +import static gregtech.api.enums.GTValues.NF; +import static gregtech.api.enums.GTValues.NI; +import static gregtech.api.enums.GTValues.V; import static gregtech.api.enums.Mods.AE2FluidCraft; import static gregtech.api.enums.Mods.ExtraBees; import static gregtech.api.enums.Mods.ExtraUtilities; @@ -17,9 +17,9 @@ import static gregtech.api.enums.Mods.ThaumicBases; import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes; import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes; import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; -import static gregtech.api.util.GT_RecipeConstants.CLEANROOM; -import static gregtech.api.util.GT_RecipeConstants.UniversalChemical; +import static gregtech.api.util.GTRecipeBuilder.TICKS; +import static gregtech.api.util.GTRecipeConstants.CLEANROOM; +import static gregtech.api.util.GTRecipeConstants.UniversalChemical; import java.util.Arrays; import java.util.List; @@ -43,17 +43,17 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import forestry.api.core.Tabs; import forestry.api.recipes.RecipeManagers; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.ItemList; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.items.GT_GeneratedMaterial_Renderer; -import gregtech.loaders.misc.GT_Bees; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTUtility; +import gregtech.common.render.items.GeneratedMaterialRenderer; +import gregtech.loaders.misc.GTBees; public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { @@ -113,7 +113,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack stack, int pass) { CombType type = CombType.valueOf(stack.getItemDamage()); - return type.getColours()[GT_Utility.clamp(pass, 0, 1)]; + return type.getColours()[GTUtility.clamp(pass, 0, 1)]; } @Override @@ -133,7 +133,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { } @Override - public GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData) { + public GeneratedMaterialRenderer getMaterialRenderer(int aMetaData) { return CombType.valueOf(aMetaData).material.renderer; } @@ -191,17 +191,17 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { addCentrifugeToItemStack( CombType.LIGNIE, - new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 1), ItemList.FR_Wax.get(1) }, + new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 1), ItemList.FR_Wax.get(1) }, new int[] { 90 * 100, 50 * 100 }, Voltage.ULV); addCentrifugeToItemStack( CombType.COAL, - new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1), ItemList.FR_Wax.get(1) }, + new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1), ItemList.FR_Wax.get(1) }, new int[] { 5 * 100, 50 * 100 }, Voltage.ULV); addCentrifugeToItemStack( CombType.OIL, - new ItemStack[] { ItemList.Crop_Drop_OilBerry.get(6), GT_Bees.drop.getStackForType(DropType.OIL), + new ItemStack[] { ItemList.Crop_Drop_OilBerry.get(6), GTBees.drop.getStackForType(DropType.OIL), ItemList.FR_Wax.get(1) }, new int[] { 100 * 100, 100 * 100, 50 * 100 }, Voltage.ULV); @@ -209,22 +209,22 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { // ic2 addCentrifugeToItemStack( CombType.COOLANT, - new ItemStack[] { GT_Bees.drop.getStackForType(DropType.COOLANT), ItemList.FR_Wax.get(1) }, + new ItemStack[] { GTBees.drop.getStackForType(DropType.COOLANT), ItemList.FR_Wax.get(1) }, new int[] { 100 * 100, 100 * 100 }, Voltage.HV, 196); addCentrifugeToItemStack( CombType.ENERGY, - new ItemStack[] { GT_Bees.drop.getStackForType(DropType.HOT_COOLANT), ItemList.IC2_Energium_Dust.get(1L), + new ItemStack[] { GTBees.drop.getStackForType(DropType.HOT_COOLANT), ItemList.IC2_Energium_Dust.get(1L), ItemList.FR_RefractoryWax.get(1) }, new int[] { 20 * 100, 20 * 100, 50 * 100 }, Voltage.HV, 196); addCentrifugeToItemStack( CombType.LAPOTRON, - new ItemStack[] { GT_Bees.drop.getStackForType(DropType.LAPIS), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LapotronDust", 1, 0), - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 2) }, + new ItemStack[] { GTBees.drop.getStackForType(DropType.LAPIS), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LapotronDust", 1, 0), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 2) }, new int[] { 20 * 100, 100 * 100, 40 * 100 }, Voltage.HV, 240); @@ -260,8 +260,8 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { addCentrifugeToItemStack( CombType.ENDERIUM, new ItemStack[] { ItemList.FR_RefractoryWax.get(1), - GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.EnderiumBase, 1), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Enderium, 1) }, + GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.EnderiumBase, 1), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Enderium, 1) }, new int[] { 50 * 100, 30 * 100, 50 * 100 }, Voltage.HV); @@ -350,31 +350,31 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { addProcessGT(CombType.THAUMIUMDUST, new Materials[] { Materials.Thaumium }, Voltage.MV); addCentrifugeToItemStack( CombType.THAUMIUMSHARD, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 1), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 2), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 3), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 4), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 5), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 6), - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "propolis", 1, 1), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1, 2), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1, 3), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1, 4), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1, 5), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1, 6), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, new int[] { 20 * 100, 20 * 100, 20 * 100, 20 * 100, 20 * 100, 20 * 100, 50 * 100 }, Voltage.ULV); addProcessGT(CombType.AMBER, new Materials[] { Materials.Amber }, Voltage.LV); addProcessGT(CombType.QUICKSILVER, new Materials[] { Materials.Cinnabar }, Voltage.LV); addCentrifugeToItemStack( CombType.SALISMUNDUS, - new ItemStack[] { GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 14), - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, + new ItemStack[] { GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 14), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, new int[] { 100 * 100, 50 * 100 }, Voltage.MV); addCentrifugeToItemStack( CombType.TAINTED, - new ItemStack[] { GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 11), - GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 12), - GT_ModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 0), - GT_ModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 1), - GT_ModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 2), - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, + new ItemStack[] { GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 11), + GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 12), + GTModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 0), + GTModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 1), + GTModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 2), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, new int[] { 15 * 100, 15 * 100, 15 * 100, 15 * 100, 15 * 100, 50 * 100 }, Voltage.ULV); addProcessGT(CombType.MITHRIL, new Materials[] { Materials.Mithril }, Voltage.HV); @@ -385,13 +385,13 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { new int[] { 20 * 100, 10 * 100 }, new int[] {}, Voltage.HV, - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0), 50 * 100); addCentrifugeToItemStack( CombType.THAUMINITE, - new ItemStack[] { GT_ModHandler.getModItem(ThaumicBases.ID, "resource", 1, 0), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Thaumium, 1), - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, + new ItemStack[] { GTModHandler.getModItem(ThaumicBases.ID, "resource", 1, 0), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Thaumium, 1), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0) }, new int[] { 20 * 100, 10 * 100, 50 * 100 }, Voltage.HV); addProcessGT(CombType.SHADOWMETAL, new Materials[] { Materials.Shadow }, Voltage.HV); @@ -401,23 +401,23 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { new int[] { 20 * 100, 10 * 100 }, new int[] {}, Voltage.HV, - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0), 50 * 100); addProcessGT(CombType.DIVIDED, new Materials[] { Materials.Diamond }, Voltage.HV); addCentrifugeToItemStack( CombType.DIVIDED, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0), - GT_ModHandler.getModItem(ExtraUtilities.ID, "unstableingot", 1, 1), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Iron, 1), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Diamond, 1) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0), + GTModHandler.getModItem(ExtraUtilities.ID, "unstableingot", 1, 1), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Iron, 1), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Diamond, 1) }, new int[] { 50 * 100, 20 * 100, 10 * 100, 5 * 100 }, Voltage.HV); addProcessGT(CombType.SPARKLING, new Materials[] { Materials.NetherStar }, Voltage.EV); addCentrifugeToItemStack( CombType.SPARKLING, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0), - GT_ModHandler.getModItem(MagicBees.ID, "miscResources", 2, 5), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NetherStar, 1) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0), + GTModHandler.getModItem(MagicBees.ID, "miscResources", 2, 5), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.NetherStar, 1) }, new int[] { 50 * 100, 10 * 100, 10 * 100 }, Voltage.EV); @@ -427,12 +427,12 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { new int[] { 100 * 100 }, new int[] {}, Voltage.MV, - GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0), + GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0), 50 * 100); addCentrifugeToItemStack( CombType.QUICKSILVER, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0), - GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1, 5) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1, 0), + GTModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1, 5) }, new int[] { 50 * 100, 100 * 100 }, Voltage.ULV); @@ -591,9 +591,9 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { addCentrifugeToItemStack( CombType.SALT, - new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 6), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RockSalt, 6), ItemList.FR_Wax.get(1), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 6) }, + new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 6), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.RockSalt, 6), ItemList.FR_Wax.get(1), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 6) }, new int[] { 100 * 100, 100 * 100, 50 * 100, 25 * 100 }, Voltage.MV, 160); @@ -612,141 +612,141 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { // Twilight addCentrifugeToItemStack( CombType.NAGA, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 4), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NagaScaleChip", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NagaScaleFragment", 1L, 0), + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 4), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NagaScaleChip", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NagaScaleFragment", 1L, 0), ItemList.FR_Wax.get(1) }, new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 }, Voltage.MV); addCentrifugeToItemStack( CombType.LICH, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 5), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LichBoneChip", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LichBoneFragment", 1L, 0), + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 5), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LichBoneChip", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LichBoneFragment", 1L, 0), ItemList.FR_Wax.get(1) }, new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 }, Voltage.HV); addCentrifugeToItemStack( CombType.HYDRA, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 1), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.FieryBloodDrop", 1L, 0), - GT_Bees.drop.getStackForType(DropType.HYDRA), ItemList.FR_Wax.get(1) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 1), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.FieryBloodDrop", 1L, 0), + GTBees.drop.getStackForType(DropType.HYDRA), ItemList.FR_Wax.get(1) }, new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 }, Voltage.HV); addCentrifugeToItemStack( CombType.URGHAST, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CarminiteChip", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CarminiteFragment", 1L, 0), + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CarminiteChip", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CarminiteFragment", 1L, 0), ItemList.FR_Wax.get(1) }, new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 }, Voltage.EV); addCentrifugeToItemStack( CombType.SNOWQUEEN, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SnowQueenBloodDrop", 1L, 0), - GT_Bees.drop.getStackForType(DropType.SNOW_QUEEN), ItemList.FR_Wax.get(1) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SnowQueenBloodDrop", 1L, 0), + GTBees.drop.getStackForType(DropType.SNOW_QUEEN), ItemList.FR_Wax.get(1) }, new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 }, Voltage.EV); // HEE addCentrifugeToItemStack( CombType.ENDDUST, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.End), GT_Bees.drop.getStackForType(DropType.ENDERGOO), + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.End), GTBees.drop.getStackForType(DropType.ENDERGOO), Materials.Endstone.getBlocks(4) }, new int[] { 20 * 100, 15 * 100, 10 * 100, 100 * 100 }, Voltage.HV); addCentrifugeToItemStack( CombType.STARDUST, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.Stardust), - GT_Bees.drop.getStackForType(DropType.ENDERGOO) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.Stardust), + GTBees.drop.getStackForType(DropType.ENDERGOO) }, new int[] { 20 * 100, 15 * 100, 10 * 100 }, Voltage.HV); addCentrifugeToItemStack( CombType.ECTOPLASMA, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.Ectoplasma), - GT_Bees.drop.getStackForType(DropType.ENDERGOO) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.Ectoplasma), + GTBees.drop.getStackForType(DropType.ENDERGOO) }, new int[] { 25 * 100, 10 * 100, 15 * 100 }, Voltage.EV); addCentrifugeToItemStack( CombType.ARCANESHARD, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.Arcaneshard), - GT_Bees.drop.getStackForType(DropType.ENDERGOO) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.Arcaneshard), + GTBees.drop.getStackForType(DropType.ENDERGOO) }, new int[] { 25 * 100, 10 * 100, 15 * 100 }, Voltage.EV); addCentrifugeToItemStack( CombType.DRAGONESSENCE, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.Dragonessence), - GT_Bees.drop.getStackForType(DropType.ENDERGOO) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.Dragonessence), + GTBees.drop.getStackForType(DropType.ENDERGOO) }, new int[] { 30 * 100, (int) (7.5 * 100), 20 * 100 }, Voltage.IV); addCentrifugeToItemStack( CombType.ENDERMAN, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.Enderman), - GT_Bees.drop.getStackForType(DropType.ENDERGOO) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.Enderman), + GTBees.drop.getStackForType(DropType.ENDERGOO) }, new int[] { 3000, 750, 2000 }, Voltage.IV); addCentrifugeToItemStack( CombType.SILVERFISH, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.Silverfish), - GT_Bees.drop.getStackForType(DropType.ENDERGOO), new ItemStack(Items.spawn_egg, 1, 60) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.Silverfish), + GTBees.drop.getStackForType(DropType.ENDERGOO), new ItemStack(Items.spawn_egg, 1, 60) }, new int[] { 25 * 100, 10 * 100, 20 * 100, 15 * 100 }, Voltage.EV); addProcessGT(CombType.ENDIUM, new Materials[] { Materials.HeeEndium }, Voltage.HV); addCentrifugeToItemStack( CombType.RUNEI, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfPowerFragment", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfAgilityFragment", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfVigorFragment", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfDefenseFragment", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfMagicFragment", 1L, 0) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfPowerFragment", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfAgilityFragment", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfVigorFragment", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfDefenseFragment", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfMagicFragment", 1L, 0) }, new int[] { 25 * 100, 5 * 100, 5 * 100, 5 * 100, 5 * 100, 5 * 100 }, Voltage.IV); addCentrifugeToItemStack( CombType.RUNEII, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfVoidFragment", 1L, 0) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfVoidFragment", 1L, 0) }, new int[] { 50 * 100, (int) (2.5 * 100) }, Voltage.IV); addCentrifugeToItemStack( CombType.FIREESSENSE, - new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), - GT_Bees.propolis.getStackForType(PropolisType.Fireessence), - GT_Bees.drop.getStackForType(DropType.ENDERGOO) }, + new ItemStack[] { GTModHandler.getModItem(MagicBees.ID, "wax", 1L, 0), + GTBees.propolis.getStackForType(PropolisType.Fireessence), + GTBees.drop.getStackForType(DropType.ENDERGOO) }, new int[] { 30 * 100, (int) (7.5 * 100), 20 * 100 }, Voltage.IV); // Walrus Recipe if (AE2FluidCraft.isModLoaded()) { addCentrifugeToItemStack( CombType.WALRUS, - new ItemStack[] { GT_ModHandler.getModItem(AE2FluidCraft.ID, "walrus", 1L, 0) }, + new ItemStack[] { GTModHandler.getModItem(AE2FluidCraft.ID, "walrus", 1L, 0) }, new int[] { 100 * 100 }, Voltage.LV); } addCentrifugeToItemStack( CombType.MACHINIST, - new ItemStack[] { GT_ModHandler.getModItem(Forestry.ID, "royalJelly", 1L, 0), - GT_ModHandler.getModItem(Forestry.ID, "pollen", 1L, 0), - GT_ModHandler.getModItem(Forestry.ID, "honeyDrop", 1L, 0), - GT_ModHandler.getModItem(ExtraBees.ID, "honeyDrop", 1L, 6), - GT_ModHandler.getModItem(Forestry.ID, "beeswax", 1L, 0), ItemList.ElectronicsLump.get(1) }, + new ItemStack[] { GTModHandler.getModItem(Forestry.ID, "royalJelly", 1L, 0), + GTModHandler.getModItem(Forestry.ID, "pollen", 1L, 0), + GTModHandler.getModItem(Forestry.ID, "honeyDrop", 1L, 0), + GTModHandler.getModItem(ExtraBees.ID, "honeyDrop", 1L, 6), + GTModHandler.getModItem(Forestry.ID, "beeswax", 1L, 0), ItemList.ElectronicsLump.get(1) }, new int[] { 10 * 100, 10 * 100, 20 * 100, 10 * 100, 20 * 100, 5 * 100 }, Voltage.ULV); // Space Line addCentrifugeToItemStack( CombType.SPACE, new ItemStack[] { ItemList.FR_Wax.get(1L), ItemList.FR_RefractoryWax.get(1L), - GT_Bees.drop.getStackForType(DropType.OXYGEN), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CoinSpace", 1L, 0) }, + GTBees.drop.getStackForType(DropType.OXYGEN), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CoinSpace", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 15 * 100, 5 * 100 }, Voltage.HV); addProcessGT(CombType.METEORICIRON, new Materials[] { Materials.MeteoricIron }, Voltage.HV); @@ -783,116 +783,116 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { addCentrifugeToItemStack( CombType.MOON, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100 }, Voltage.MV, 300); addCentrifugeToItemStack( CombType.MARS, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100 }, Voltage.HV, 300); addCentrifugeToItemStack( CombType.JUPITER, - new ItemStack[] { GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1L, 0), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.CallistoIce, 1L), ItemList.FR_Wax.get(1L) }, + new ItemStack[] { GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1L, 0), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.CallistoIce, 1L), ItemList.FR_Wax.get(1L) }, new int[] { 30 * 100, 30 * 100, 30 * 100, 30 * 100, 30 * 100, 5 * 100, 50 * 100 }, Voltage.HV, 300); addCentrifugeToItemStack( CombType.MERCURY, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MercuryCoreDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MercuryStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MercuryCoreDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MercuryStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 30 * 100 }, Voltage.EV, 300); addCentrifugeToItemStack( CombType.VENUS, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VenusStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VenusStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100 }, Voltage.EV, 300); addCentrifugeToItemStack( CombType.SATURN, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 30 * 100 }, Voltage.IV, 300); addCentrifugeToItemStack( CombType.URANUS, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 30 * 100 }, Voltage.IV, 300); addCentrifugeToItemStack( CombType.NEPTUNE, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 30 * 100 }, Voltage.IV, 300); addCentrifugeToItemStack( CombType.PLUTO, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoIceDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoIceDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 30 * 100 }, Voltage.LuV, 300); addCentrifugeToItemStack( CombType.HAUMEA, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100 }, Voltage.LuV, 300); addCentrifugeToItemStack( CombType.MAKEMAKE, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100 }, Voltage.LuV, 300); addCentrifugeToItemStack( CombType.CENTAURI, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriAStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriAStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 30 * 100 }, Voltage.ZPM, 300); addCentrifugeToItemStack( CombType.TCETI, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100 }, Voltage.ZPM, 300); addCentrifugeToItemStack( CombType.BARNARDA, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1L, 0), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100, 30 * 100 }, Voltage.ZPM, 300); addCentrifugeToItemStack( CombType.VEGA, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1L, 0) }, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1L, 0) }, new int[] { 50 * 100, 30 * 100 }, Voltage.ZPM, 300); @@ -900,7 +900,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { addCentrifugeToItemStack( CombType.SEAWEED, new ItemStack[] { ItemList.FR_Wax.get(1L), - GT_ModHandler.getModItem(GalaxySpace.ID, "tcetiedandelions", 1L, 0) }, + GTModHandler.getModItem(GalaxySpace.ID, "tcetiedandelions", 1L, 0) }, new int[] { 50 * 100, 100 * 100 }, Voltage.UV, 100); @@ -940,13 +940,13 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { * **/ public void addAutoclaveProcess(CombType comb, Materials aMaterial, Voltage volt, int circuitNumber) { - if (GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4) == NI) { + if (GTOreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4) == NI) { return; } - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); recipeBuilder - .itemInputs(GT_Utility.copyAmount(9, getStackForType(comb)), GT_Utility.getIntegratedCircuit(circuitNumber)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4)) + .itemInputs(GTUtility.copyAmount(9, getStackForType(comb)), GTUtility.getIntegratedCircuit(circuitNumber)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4)) .fluidInputs(Materials.UUMatter.getFluid(Math.max(1, ((aMaterial.getMass() + volt.getUUAmplifier()) / 10)))) .duration(((int) (aMaterial.getMass() * 128)) * TICKS) .eut(volt.getAutoClaveEnergy()); @@ -968,8 +968,8 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { : 128); int eut = volt.getSimpleEnergy() / 2; - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.copyAmount(1, getStackForType(comb))) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.copyAmount(1, getStackForType(comb))) .fluidOutputs(fluid) .duration(duration) .eut(eut) @@ -988,7 +988,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { public void addProcessGT(CombType comb, Materials[] aMaterial, Voltage volt) { ItemStack tComb = getStackForType(comb); for (Materials materials : aMaterial) { - if (GT_OreDictUnificator.get(OrePrefixes.crushedPurified, materials, 4) != null) { + if (GTOreDictUnificator.get(OrePrefixes.crushedPurified, materials, 4) != null) { ItemStack combInput; ItemStack combOutput; FluidStack fluidInput; @@ -998,7 +998,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { boolean requiresCleanroom; switch (comb) { case NEUTRONIUM -> { - combInput = GT_Utility.copyAmount(4, tComb); + combInput = GTUtility.copyAmount(4, tComb); combOutput = Materials.Neutronium.getNuggets(1); fluidInput = volt.getFluidAccordingToCombTier(); fluidOutput = Materials.Neutronium.getMolten(576); @@ -1007,7 +1007,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { requiresCleanroom = volt.compareTo(Voltage.IV) > 0; } case OSMIUM -> { - combInput = GT_Utility.copyAmount(4, tComb); + combInput = GTUtility.copyAmount(4, tComb); combOutput = Materials.Osmium.getNuggets(1); fluidInput = volt.getFluidAccordingToCombTier(); fluidOutput = Materials.Osmium.getMolten(288); @@ -1016,7 +1016,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { requiresCleanroom = volt.compareTo(Voltage.IV) > 0; } case PLATINUM -> { - combInput = GT_Utility.copyAmount(4, tComb); + combInput = GTUtility.copyAmount(4, tComb); combOutput = Materials.Platinum.getNuggets(1); fluidInput = volt.getFluidAccordingToCombTier(); fluidOutput = Materials.Platinum.getMolten(288); @@ -1025,7 +1025,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { requiresCleanroom = volt.compareTo(Voltage.HV) > 0; } case IRIDIUM -> { - combInput = GT_Utility.copyAmount(4, tComb); + combInput = GTUtility.copyAmount(4, tComb); combOutput = Materials.Iridium.getNuggets(1); fluidInput = volt.getFluidAccordingToCombTier(); fluidOutput = Materials.Iridium.getMolten(288); @@ -1034,8 +1034,8 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { requiresCleanroom = volt.compareTo(Voltage.EV) > 0; } default -> { - combInput = GT_Utility.copyAmount(4, tComb); - combOutput = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, materials, 4); + combInput = GTUtility.copyAmount(4, tComb); + combOutput = GTOreDictUnificator.get(OrePrefixes.crushedPurified, materials, 4); fluidInput = volt.getFluidAccordingToCombTier(); fluidOutput = null; durationTicks = volt.getComplexTime(); @@ -1043,7 +1043,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { requiresCleanroom = volt.compareTo(Voltage.IV) > 0; } } - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); recipeBuilder.itemInputs(combInput) .itemOutputs(combOutput) .fluidInputs(fluidInput); @@ -1092,11 +1092,11 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { continue; } if (Math.max(1, stackSize[i]) % 9 == 0) { - aOutPut[i] = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial[i], (Math.max(1, stackSize[i]) / 9)); + aOutPut[i] = GTOreDictUnificator.get(OrePrefixes.dust, aMaterial[i], (Math.max(1, stackSize[i]) / 9)); } else if (Math.max(1, stackSize[i]) % 4 == 0) { - aOutPut[i] = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial[i], (Math.max(1, stackSize[i]) / 4)); + aOutPut[i] = GTOreDictUnificator.get(OrePrefixes.dust, aMaterial[i], (Math.max(1, stackSize[i]) / 4)); } else { - aOutPut[i] = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial[i], Math.max(1, stackSize[i])); + aOutPut[i] = GTOreDictUnificator.get(OrePrefixes.dust, aMaterial[i], Math.max(1, stackSize[i])); } } if (beeWax != NI) { @@ -1130,7 +1130,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { RecipeManagers.centrifugeManager.addRecipe(40, tComb, Product.build()); } - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(tComb) .itemOutputs(aItem) .outputChances(chance) @@ -1142,9 +1142,9 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { public void registerOreDict() { for (CombType comb : CombType.values()) { ItemStack tComb = getStackForType(comb); - GT_OreDictUnificator.registerOre(OrePrefixes.beeComb.name(), tComb); + GTOreDictUnificator.registerOre(OrePrefixes.beeComb.name(), tComb); OrePrefixes.beeComb.add(tComb); - if (comb.voltage != null) GT_OreDictUnificator.registerOre("comb" + comb.voltage.name(), tComb); + if (comb.voltage != null) GTOreDictUnificator.registerOre("comb" + comb.voltage.name(), tComb); } } @@ -1189,7 +1189,7 @@ public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer { if (this.compareTo(Voltage.MV) < 0) { return Materials.HydrofluoricAcid.getFluid((this.compareTo(Voltage.ULV) > 0) ? 1000 : 500); } else if (this.compareTo(Voltage.HV) < 0) { - return GT_ModHandler.getDistilledWater(1000L); + return GTModHandler.getDistilledWater(1000L); } else if (this.compareTo(Voltage.LuV) < 0) { return Materials.HydrofluoricAcid.getFluid((long) (Math.pow(2, this.compareTo(Voltage.HV)) * L)); } else if (this.compareTo(Voltage.UHV) < 0) { diff --git a/src/main/java/gregtech/common/items/ItemDepletedCell.java b/src/main/java/gregtech/common/items/ItemDepletedCell.java new file mode 100644 index 0000000000..094dd76dbb --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemDepletedCell.java @@ -0,0 +1,49 @@ +package gregtech.common.items; + +import net.minecraft.item.ItemStack; + +import gregtech.api.items.ItemRadioactiveCellIC; +import ic2.api.reactor.IReactor; + +public class ItemDepletedCell extends ItemRadioactiveCellIC { + + public ItemDepletedCell(String aUnlocalized, String aEnglish, int aRadiation) { + super(aUnlocalized, aEnglish, 1, 1, 0, aRadiation, 0, null, false); + } + + @Override + public void processChamber(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2, + boolean paramBoolean) {} + + @Override + public boolean acceptUraniumPulse(IReactor paramIReactor, ItemStack paramItemStack1, ItemStack paramItemStack2, + int paramInt1, int paramInt2, int paramInt3, int paramInt4, boolean paramBoolean) { + return false; + } + + @Override + public boolean canStoreHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) { + return false; + } + + @Override + public int getMaxHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) { + return 0; + } + + @Override + public int getCurrentHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) { + return 0; + } + + @Override + public int alterHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2, + int paramInt3) { + return 0; + } + + @Override + public float influenceExplosion(IReactor paramIReactor, ItemStack paramItemStack) { + return 0.0F; + } +} diff --git a/src/main/java/gregtech/common/items/ItemDrop.java b/src/main/java/gregtech/common/items/ItemDrop.java index 5aab9dff48..1f56b79242 100644 --- a/src/main/java/gregtech/common/items/ItemDrop.java +++ b/src/main/java/gregtech/common/items/ItemDrop.java @@ -7,8 +7,8 @@ import static gregtech.api.enums.Mods.HardcoreEnderExpansion; import static gregtech.api.enums.Mods.MagicBees; import static gregtech.api.enums.Mods.NewHorizonsCoreMod; import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; import java.util.List; @@ -25,11 +25,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import forestry.api.core.Tabs; import forestry.api.recipes.RecipeManagers; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.enums.Materials; import gregtech.api.enums.TierEU; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_RecipeBuilder; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipeBuilder; public class ItemDrop extends Item { @@ -110,53 +110,53 @@ public class ItemDrop extends Item { addProcessLV( tDrop, Materials.OilHeavy.getFluid(100L), - GT_ModHandler.getModItem(Forestry.ID, "propolis", 1L, 0), + GTModHandler.getModItem(Forestry.ID, "propolis", 1L, 0), 3000, 8); RecipeManagers.squeezerManager.addRecipe( 40, new ItemStack[] { tDrop }, Materials.OilHeavy.getFluid(100L), - GT_ModHandler.getModItem(Forestry.ID, "propolis", 1L, 0), + GTModHandler.getModItem(Forestry.ID, "propolis", 1L, 0), 30); tDrop = getStackForType(DropType.COOLANT); addProcessLV( tDrop, new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 0), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 0), 3000, 8); RecipeManagers.squeezerManager.addRecipe( 40, new ItemStack[] { tDrop }, new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 0), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 0), 30); tDrop = getStackForType(DropType.HOT_COOLANT); addProcessLV( tDrop, new FluidStack(FluidRegistry.getFluid("ic2hotcoolant"), 100), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), 3000, 8); RecipeManagers.squeezerManager.addRecipe( 40, new ItemStack[] { tDrop }, new FluidStack(FluidRegistry.getFluid("ic2hotcoolant"), 100), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), 30); tDrop = getStackForType(DropType.SNOW_QUEEN); addProcessMV( tDrop, Materials.FierySteel.getFluid(200L), - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SnowQueenBloodDrop", 1L, 0), + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SnowQueenBloodDrop", 1L, 0), 1500, 48); tDrop = getStackForType(DropType.LAPIS); addProcessLV( tDrop, new FluidStack(FluidRegistry.getFluid("ic2coolant"), 200), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3), 5000, 1200, 2); @@ -164,20 +164,20 @@ public class ItemDrop extends Item { 400, new ItemStack[] { tDrop }, new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3), 30); tDrop = getStackForType(DropType.HYDRA); addProcessMV( tDrop, Materials.FierySteel.getFluid(50L), - GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), + GTModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2), 3000, 8); tDrop = getStackForType(DropType.OXYGEN); addProcessLV( tDrop, new FluidStack(FluidRegistry.getFluid("liquidoxygen"), 100), - GT_ModHandler.getModItem(ExtraBees.ID, "propolis", 1L, 2), + GTModHandler.getModItem(ExtraBees.ID, "propolis", 1L, 2), 250, 1200, 8); @@ -185,15 +185,15 @@ public class ItemDrop extends Item { 400, new ItemStack[] { tDrop }, new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100), - GT_ModHandler.getModItem(ExtraBees.ID, "propolis", 1L, 2), + GTModHandler.getModItem(ExtraBees.ID, "propolis", 1L, 2), 30); tDrop = getStackForType(DropType.ENDERGOO); if (HardcoreEnderExpansion.isModLoaded()) - addProcessHV(tDrop, new FluidStack(FluidRegistry.getFluid("endergoo"), 500), GT_Values.NI, 1000); + addProcessHV(tDrop, new FluidStack(FluidRegistry.getFluid("endergoo"), 500), GTValues.NI, 1000); } public void addProcessLV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance, int aEUt) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(tDrop) .itemOutputs(aOutput2) .outputChances(aChance) @@ -205,7 +205,7 @@ public class ItemDrop extends Item { public void addProcessLV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance, int aDuration, int aEUt) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(tDrop) .itemOutputs(aOutput2) .outputChances(aChance) @@ -216,7 +216,7 @@ public class ItemDrop extends Item { } public void addProcessMV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance, int aEUt) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(tDrop) .itemOutputs(aOutput2) .outputChances(aChance) @@ -227,9 +227,9 @@ public class ItemDrop extends Item { } public void addProcessHV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance) { - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); recipeBuilder.itemInputs(tDrop); - if (aOutput2 != GT_Values.NI) { + if (aOutput2 != GTValues.NI) { recipeBuilder.itemOutputs(aOutput2) .outputChances(aChance); } diff --git a/src/main/java/gregtech/common/items/ItemFluidDisplay.java b/src/main/java/gregtech/common/items/ItemFluidDisplay.java new file mode 100644 index 0000000000..7063a7e1f3 --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemFluidDisplay.java @@ -0,0 +1,181 @@ +package gregtech.common.items; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Stream; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.items.GTGenericItem; +import gregtech.api.util.GTUtility; + +public class ItemFluidDisplay extends GTGenericItem { + + private static final Map sFluidTooltips = new HashMap<>(); + + public ItemFluidDisplay() { + super("GregTech_FluidDisplay", "Fluid Display", null); + ItemList.Display_Fluid.set(this); + } + + @Override + protected void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + if (FluidRegistry.getFluid(aStack.getItemDamage()) != null) { + String tChemicalFormula = getChemicalFormula( + new FluidStack(FluidRegistry.getFluid(aStack.getItemDamage()), 1)); + if (!tChemicalFormula.isEmpty()) + aList.add(EnumChatFormatting.YELLOW + tChemicalFormula + EnumChatFormatting.RESET); + } + NBTTagCompound aNBT = aStack.getTagCompound(); + if (GTValues.D1 || Minecraft.getMinecraft().gameSettings.advancedItemTooltips) { + Fluid tFluid = FluidRegistry.getFluid(aStack.getItemDamage()); + if (tFluid != null) { + aList.add("Registry: " + tFluid.getName()); + } + } + if (aNBT != null) { + long tToolTipAmount = aNBT.getLong("mFluidDisplayAmount"); + if (tToolTipAmount > 0L) { + aList.add( + EnumChatFormatting.BLUE + "Amount: " + + GTUtility.formatNumbers(tToolTipAmount) + + " L" + + EnumChatFormatting.GRAY); + } + aList.add( + EnumChatFormatting.RED + "Temperature: " + + GTUtility.formatNumbers(aNBT.getLong("mFluidDisplayHeat")) + + " K" + + EnumChatFormatting.GRAY); + aList.add( + EnumChatFormatting.GREEN + + String.format(transItem("018", "State: %s"), aNBT.getBoolean("mFluidState") ? "Gas" : "Liquid") + + EnumChatFormatting.GRAY); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aIconRegister) {} + + @Override + public IIcon getIconFromDamage(int aMetaData) { + return Stream.of(FluidRegistry.getFluid(aMetaData), FluidRegistry.WATER) + .filter(Objects::nonNull) + .map(Fluid::getStillIcon) + .filter(Objects::nonNull) + .findFirst() + .orElseThrow(IllegalStateException::new); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack aStack, int aRenderPass) { + Fluid tFluid = FluidRegistry.getFluid(aStack.getItemDamage()); + return tFluid == null ? 16777215 : tFluid.getColor(); + } + + @Override + public int getSpriteNumber() { + return 0; + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + if (aStack != null) { + return GTUtility.getFluidName(FluidRegistry.getFluid(aStack.getItemDamage()), false); + } + return ""; + } + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + if (aStack != null) { + return GTUtility.getFluidName(FluidRegistry.getFluid(aStack.getItemDamage()), true); + } + return ""; + } + + @SideOnly(Side.CLIENT) + public static String getChemicalFormula(FluidStack aRealFluid) { + return sFluidTooltips.computeIfAbsent(aRealFluid.getFluid(), fluid -> { + for (ItemStack tContainer : GTUtility.getContainersFromFluid(aRealFluid)) { + if (isCell(tContainer)) { + Materials tMaterial = getMaterialFromCell(tContainer); + if (!tMaterial.equals(Materials._NULL)) { + if (tMaterial.mChemicalFormula.equals("?")) { + return ""; + } else { + return tMaterial.mChemicalFormula; + } + } else { + // For GT++ Fluid Display + // GT++ didn't register a Material in GT, so I have too find the Chemical Formula in its cell's + // tooltip + List tTooltip = tContainer.getTooltip(null, true); + for (String tInfo : tTooltip) { + if (!tInfo.contains(" ") && !tInfo.contains(":") && tTooltip.indexOf(tInfo) != 0) { + return tInfo; + } + } + } + } + } + return ""; + }); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item aItem, CreativeTabs aTab, List aList) { + if (GTValues.D1) { + int i = 0; + for (int j = FluidRegistry.getMaxID(); i < j; i++) { + ItemStack tStack = GTUtility.getFluidDisplayStack(FluidRegistry.getFluid(i)); + if (tStack != null) { + aList.add(tStack); + } + } + } + } + + public static boolean isCell(ItemStack tItemStack) { + for (int tOreDict : OreDictionary.getOreIDs(tItemStack)) { + String tOreDictName = OreDictionary.getOreName(tOreDict); + if (tOreDictName.startsWith("cell")) return true; + } + return false; + } + + public static Materials getMaterialFromCell(ItemStack tItemStack) { + for (int tOreDict : OreDictionary.getOreIDs(tItemStack)) { + String tOreDictName = OreDictionary.getOreName(tOreDict); + if (tOreDictName.startsWith("cell")) { + return Materials.getRealMaterial( + tOreDictName.replace("cell", "") + .replace("Molten", "") + .replace("Plasma", "")); + } + } + return Materials._NULL; + } +} diff --git a/src/main/java/gregtech/common/items/ItemIntegratedCircuit.java b/src/main/java/gregtech/common/items/ItemIntegratedCircuit.java new file mode 100644 index 0000000000..b6dfa079a2 --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemIntegratedCircuit.java @@ -0,0 +1,327 @@ +package gregtech.common.items; + +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.Mods.GregTech; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Predicate; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.FakePlayer; + +import org.apache.commons.lang3.tuple.Pair; + +import com.gtnewhorizons.modularui.api.UIInfos; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.INetworkUpdatableItem; +import gregtech.api.items.GTGenericItem; +import gregtech.api.net.GTPacketUpdateItem; +import gregtech.api.objects.XSTR; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory; + +public class ItemIntegratedCircuit extends GTGenericItem implements INetworkUpdatableItem { + + private static final String aTextEmptyRow = " "; + private static final List ALL_VARIANTS = new ArrayList<>(); + protected final IIcon[] mIconDamage = new IIcon[25]; + + public ItemIntegratedCircuit() { + super("integrated_circuit", "Programmed Circuit", ""); + setHasSubtypes(true); + setMaxDamage(0); + + ItemList.Circuit_Integrated.set(this); + + ALL_VARIANTS.add(new ItemStack(this, 0, 0)); + for (int i = 1; i <= 24; i++) { + ItemStack aStack = new ItemStack(this, 0, i); + GregTechAPI.registerConfigurationCircuit(aStack, 1); + ALL_VARIANTS.add(aStack); + } + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 0L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { OrePrefixes.circuit.get(Materials.LV) }); + long bits = GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE; + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 1L), + bits, + new Object[] { "d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 2L), + bits, + new Object[] { " d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 3L), + bits, + new Object[] { " d", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 4L), + bits, + new Object[] { aTextEmptyRow, " Pd", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 5L), + bits, + new Object[] { aTextEmptyRow, " P ", " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 6L), + bits, + new Object[] { aTextEmptyRow, " P ", " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 7L), + bits, + new Object[] { aTextEmptyRow, " P ", "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 8L), + bits, + new Object[] { aTextEmptyRow, "dP ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 9L), + bits, + new Object[] { "P d", aTextEmptyRow, aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 10L), + bits, + new Object[] { "P ", " d", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 11L), + bits, + new Object[] { "P ", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 12L), + bits, + new Object[] { "P ", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 13L), + bits, + new Object[] { " P", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 14L), + bits, + new Object[] { " P", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 15L), + bits, + new Object[] { " P", aTextEmptyRow, "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 16L), + bits, + new Object[] { " P", "d ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 17L), + bits, + new Object[] { aTextEmptyRow, aTextEmptyRow, "d P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 18L), + bits, + new Object[] { aTextEmptyRow, "d ", " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 19L), + bits, + new Object[] { "d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 20L), + bits, + new Object[] { " d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 21L), + bits, + new Object[] { "d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 22L), + bits, + new Object[] { " d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 23L), + bits, + new Object[] { " d", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + GTModHandler.addCraftingRecipe( + ItemList.Circuit_Integrated.getWithDamage(1L, 24L), + bits, + new Object[] { aTextEmptyRow, " d", "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) }); + } + + private static String getModeString(int aMetaData) { + return switch ((byte) (aMetaData >>> 8)) { + case 0 -> "=="; + case 1 -> "<="; + case 2 -> ">="; + case 3 -> "<"; + case 4 -> ">"; + default -> ""; + }; + } + + private static String getConfigurationString(int aMetaData) { + return getModeString(aMetaData) + " " + (byte) (aMetaData & 0xFF); + } + + @Override + public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + super.addAdditionalToolTips(aList, aStack, aPlayer); + aList.add( + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".configuration", "Configuration: ") + + getConfigurationString(getDamage(aStack))); + aList.add( + GTLanguageManager.addStringLocalization(getUnlocalizedName() + ".tooltip.0", "Right click to reconfigure")); + aList.add( + GTLanguageManager.addStringLocalization( + getUnlocalizedName() + ".tooltip.1", + "Needs a screwdriver or circuit programming tool")); + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return getUnlocalizedName(); + } + + @Override + @SideOnly(Side.CLIENT) + public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { + aList.add(new ItemStack(this, 1, 0)); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aIconRegister) { + super.registerIcons(aIconRegister); + for (int i = 0; i < mIconDamage.length; i++) { + mIconDamage[i] = aIconRegister + .registerIcon(GregTech.getResourcePath(GTConfig.troll ? "troll" : getUnlocalizedName() + "/" + i)); + } + if (GregTechAPI.sPostloadFinished) { + GTLog.out.println("GTMod: Starting Item Icon Load Phase"); + GT_FML_LOGGER.info("GTMod: Starting Item Icon Load Phase"); + GregTechAPI.sItemIcons = aIconRegister; + try { + for (Runnable tRunnable : GregTechAPI.sGTItemIconload) { + tRunnable.run(); + } + } catch (Throwable e) { + e.printStackTrace(GTLog.err); + } + GTLog.out.println("GTMod: Finished Item Icon Load Phase"); + GT_FML_LOGGER.info("GTMod: Finished Item Icon Load Phase"); + } + } + + @Override + public IIcon getIconFromDamage(int aMetaData) { + byte circuitMode = ((byte) (aMetaData & 0xFF)); // Mask out the MSB Comparison Mode Bits. See: getModeString + return mIconDamage[circuitMode < mIconDamage.length ? circuitMode : 0]; + } + + @Override + public boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag) { + int meta = tag.hasKey("meta", Constants.NBT.TAG_BYTE) ? tag.getByte("meta") : -1; + if (meta < 0 || meta > 24) return true; + + if (!player.capabilities.isCreativeMode) { + Pair> 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 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, + ItemIntegratedCircuit::onConfigured, + ALL_VARIANTS, + meta, + true).createWindow(buildContext)); + } + + private static void onConfigured(ItemStack stack) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("meta", (byte) stack.getItemDamage()); + GTValues.NW.sendToServer(new GTPacketUpdateItem(tag)); + } + + private static Pair> findConfiguratorInInv( + EntityPlayer player) { + ItemStack[] mainInventory = player.inventory.mainInventory; + for (int j = 0, mainInventoryLength = mainInventory.length; j < mainInventoryLength; j++) { + ItemStack toolStack = mainInventory[j]; + + if (!GTUtility.isStackValid(toolStack)) continue; + + for (Map.Entry, BiFunction> p : GregTechAPI.sCircuitProgrammerList + .entrySet()) + if (p.getKey() + .test(toolStack)) return Pair.of(j, p.getValue()); + } + return null; + } +} diff --git a/src/main/java/gregtech/common/items/ItemNeutronReflector.java b/src/main/java/gregtech/common/items/ItemNeutronReflector.java new file mode 100644 index 0000000000..215bc19c59 --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemNeutronReflector.java @@ -0,0 +1,54 @@ +package gregtech.common.items; + +import net.minecraft.item.ItemStack; + +import gregtech.api.items.GTGenericItem; +import ic2.api.reactor.IReactor; +import ic2.api.reactor.IReactorComponent; + +public class ItemNeutronReflector extends GTGenericItem implements IReactorComponent { + + public ItemNeutronReflector(String aUnlocalized, String aEnglish, int aMaxDamage) { + super(aUnlocalized, aEnglish, "Undestructable"); + this.setMaxStackSize(64); + this.setMaxDamage(aMaxDamage); + } + + @Override + public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, + int pulseX, int pulseY, boolean heatrun) { + if (!heatrun) { + ((IReactorComponent) pulsingStack.getItem()) + .acceptUraniumPulse(reactor, pulsingStack, yourStack, pulseX, pulseY, youX, youY, heatrun); + } + return true; + } + + @Override + public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) { + return false; + } + + @Override + public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) { + return 0; + } + + @Override + public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) { + return 0; + } + + @Override + public float influenceExplosion(IReactor aReactor, ItemStack aStack) { + return -1.0F; + } + + @Override + public int alterHeat(IReactor aReactor, ItemStack aStack, int x, int y, int aHeat) { + return aHeat; + } + + @Override + public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {} +} diff --git a/src/main/java/gregtech/common/items/ItemPropolis.java b/src/main/java/gregtech/common/items/ItemPropolis.java index 1c0d727bda..2b4f3c3905 100644 --- a/src/main/java/gregtech/common/items/ItemPropolis.java +++ b/src/main/java/gregtech/common/items/ItemPropolis.java @@ -4,8 +4,8 @@ import static gregtech.api.enums.Mods.GregTech; import static gregtech.api.enums.Mods.HardcoreEnderExpansion; import static gregtech.api.enums.Mods.NewHorizonsCoreMod; import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; import java.util.List; @@ -20,12 +20,12 @@ 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.GTValues; 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.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; public class ItemPropolis extends Item { @@ -85,29 +85,29 @@ public class ItemPropolis extends Item { ItemStack tPropolis; tPropolis = getStackForType(PropolisType.End); - addProcessHV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "end_powder", 1, 0)); + addProcessHV(tPropolis, GTModHandler.getModItem(HardcoreEnderExpansion.ID, "end_powder", 1, 0)); tPropolis = getStackForType(PropolisType.Stardust); - addProcessHV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "stardust", 1, 0)); + addProcessHV(tPropolis, GTModHandler.getModItem(HardcoreEnderExpansion.ID, "stardust", 1, 0)); tPropolis = getStackForType(PropolisType.Ectoplasma); - addProcessEV(tPropolis, GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EctoplasmaChip", 1, 0)); + addProcessEV(tPropolis, GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EctoplasmaChip", 1, 0)); tPropolis = getStackForType(PropolisType.Arcaneshard); - addProcessEV(tPropolis, GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ArcaneShardChip", 1, 0)); + addProcessEV(tPropolis, GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ArcaneShardChip", 1, 0)); tPropolis = getStackForType(PropolisType.Dragonessence); - addProcessIV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "essence", 16, 0)); + addProcessIV(tPropolis, GTModHandler.getModItem(HardcoreEnderExpansion.ID, "essence", 16, 0)); tPropolis = getStackForType(PropolisType.Enderman); - addProcessIV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "enderman_head", 1, 0)); + addProcessIV(tPropolis, GTModHandler.getModItem(HardcoreEnderExpansion.ID, "enderman_head", 1, 0)); tPropolis = getStackForType(PropolisType.Silverfish); - addProcessEV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "silverfish_blood", 1, 0)); + addProcessEV(tPropolis, GTModHandler.getModItem(HardcoreEnderExpansion.ID, "silverfish_blood", 1, 0)); tPropolis = getStackForType(PropolisType.Endium); - addProcessHV(tPropolis, GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.HeeEndium, 1)); + addProcessHV(tPropolis, GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.HeeEndium, 1)); tPropolis = getStackForType(PropolisType.Fireessence); - addProcessIV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "essence", 16, 1)); + addProcessIV(tPropolis, GTModHandler.getModItem(HardcoreEnderExpansion.ID, "essence", 16, 1)); // addRecipe(tDrop, aOutput, aOutput2, aChance, aDuration, aEUt); } public void addProcessHV(ItemStack tPropolis, ItemStack aOutput2) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(tPropolis) .itemOutputs(aOutput2) .outputChances(5000) @@ -118,7 +118,7 @@ public class ItemPropolis extends Item { } public void addProcessEV(ItemStack tPropolis, ItemStack aOutput2) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(tPropolis) .itemOutputs(aOutput2) .outputChances(2500) @@ -129,7 +129,7 @@ public class ItemPropolis extends Item { } public void addProcessIV(ItemStack tPropolis, ItemStack aOutput2) { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(tPropolis) .itemOutputs(aOutput2) .outputChances(1500) diff --git a/src/main/java/gregtech/common/items/ItemSensorCard.java b/src/main/java/gregtech/common/items/ItemSensorCard.java new file mode 100644 index 0000000000..39e3d48081 --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemSensorCard.java @@ -0,0 +1,111 @@ +package gregtech.common.items; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; +import gregtech.api.items.GTGenericItem; +import gregtech.api.util.GTLanguageManager; +import shedar.mods.ic2.nuclearcontrol.api.CardState; +import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper; +import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource; +import shedar.mods.ic2.nuclearcontrol.api.IRemoteSensor; +import shedar.mods.ic2.nuclearcontrol.api.PanelSetting; +import shedar.mods.ic2.nuclearcontrol.api.PanelString; + +public class ItemSensorCard extends GTGenericItem implements IRemoteSensor, IPanelDataSource { + + private static final UUID CARD_TYPE = new UUID(0L, 41L); + + private int strCount; + + public ItemSensorCard(String aUnlocalized, String aEnglish) { + super(aUnlocalized, aEnglish, "Insert into Display Panel"); + setMaxStackSize(1); + } + + @Override + public void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + super.addAdditionalToolTips(aList, aStack, aPlayer); + if (aStack != null) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + aList.add(transItem("014", "Missing Coordinates!")); + } else { + aList.add(transItem("015", "Device at:")); + aList.add( + String.format( + "x: %d, y: %d, z: %d", + tNBT.getInteger("x"), + tNBT.getInteger("y"), + tNBT.getInteger("z"))); + } + } + } + + @Override + public CardState update(TileEntity aPanel, ICardWrapper aCard, int aMaxRange) { + return update(aPanel.getWorldObj(), aCard, aMaxRange); + } + + @Override + public CardState update(World world, ICardWrapper aCard, int aMaxRange) { + ChunkCoordinates target = aCard.getTarget(); + + TileEntity tTileEntity = world.getTileEntity(target.posX, target.posY, target.posZ); + if (((tTileEntity instanceof IGregTechDeviceInformation)) + && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) { + String[] tInfoData = ((IGregTechDeviceInformation) tTileEntity).getInfoData(); + for (int i = 0; i < tInfoData.length; i++) { + aCard.setString("mString" + i, tInfoData[i]); + } + aCard.setInt("mString", strCount = tInfoData.length); + return CardState.OK; + } + return CardState.NO_TARGET; + } + + @Override + public List getStringData(int aSettings, ICardWrapper aCard, boolean aLabels) { + List rList = new LinkedList<>(); + for (int i = 0; i < (strCount = aCard.getInt("mString")); i++) { + if ((aSettings & 1 << i) != 0) { + PanelString line = new PanelString(); + line.textLeft = GTLanguageManager.getTranslation(aCard.getString("mString" + i), "\\\\"); + rList.add(line); + } + } + return rList; + } + + @Override + public List getSettingsList() { + List rList = new ArrayList<>(); + for (int i = 0; i < strCount; i++) { + rList.add(new PanelSetting(String.valueOf((i + 1)), 1 << i, getCardType())); + } + return rList; + } + + @Override + public UUID getCardType() { + return CARD_TYPE; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aOutputSubItems) {} +} diff --git a/src/main/java/gregtech/common/items/ItemTierDrone.java b/src/main/java/gregtech/common/items/ItemTierDrone.java new file mode 100644 index 0000000000..1df4f0024d --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemTierDrone.java @@ -0,0 +1,18 @@ +package gregtech.common.items; + +import gregtech.api.items.GTGenericItem; + +public class ItemTierDrone extends GTGenericItem { + + private final int level; + + public ItemTierDrone(String aUnlocalized, String aEnglish, String aEnglishTooltip, int level) { + super(aUnlocalized, aEnglish, aEnglishTooltip); + this.level = level; + this.setMaxStackSize(64); + } + + public int getLevel() { + return level; + } +} diff --git a/src/main/java/gregtech/common/items/ItemVolumetricFlask.java b/src/main/java/gregtech/common/items/ItemVolumetricFlask.java new file mode 100644 index 0000000000..a48dce38e0 --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemVolumetricFlask.java @@ -0,0 +1,360 @@ +package gregtech.common.items; + +import static gregtech.api.enums.Mods.GregTech; +import static gregtech.api.util.GTUtility.formatNumbers; +import static ic2.core.util.LiquidUtil.drainContainerStack; +import static ic2.core.util.LiquidUtil.fillContainerStack; +import static ic2.core.util.LiquidUtil.placeFluid; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; + +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.IItemWithModularUI; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.VanillaButtonWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.items.GTGenericItem; +import gregtech.api.util.GTUtility; +import ic2.core.util.LiquidUtil; + +public class ItemVolumetricFlask extends GTGenericItem implements IFluidContainerItem, IItemWithModularUI { + + private final int maxCapacity; + private final String unlocalFlaskName; + + @SideOnly(Side.CLIENT) + public IIcon iconWindow; + + public ItemVolumetricFlask(String unlocalized, String english, int maxCapacity) { + super(unlocalized, english, null); + this.maxCapacity = maxCapacity; + unlocalFlaskName = unlocalized; + setMaxStackSize(64); + setNoRepair(); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if (!world.isRemote && isEmpty(stack) && getMovingObjectPositionFromPlayer(world, player, true) == null) + GTUIInfos.openPlayerHeldItemUI(player); + return super.onItemRightClick(stack, world, player); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int ordinalSide, + float xOffset, float yOffset, float zOffset) { + if (player instanceof FakePlayer) { + return false; + } + if (world.isRemote) return false; + if (interactWithTank(stack, player, world, x, y, z, ordinalSide)) { + return true; + } + MovingObjectPosition mop = getMovingObjectPositionFromPlayer(world, player, true); + if (mop == null) { + return false; + } + if (mop.typeOfHit == MovingObjectType.BLOCK) { + x = mop.blockX; + y = mop.blockY; + z = mop.blockZ; + if (!world.canMineBlock(player, x, y, z) || !player.canPlayerEdit(x, y, z, mop.sideHit, stack)) { + return false; + } + if (collectFluidBlock(stack, player, world, x, y, z)) { + return true; + } + ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[mop.sideHit]; + FluidStack fluidStack = drainContainerStack(stack, player, 1000, true); + if (placeFluid(fluidStack, world, x, y, z) + || (player.canPlayerEdit(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, mop.sideHit, stack) + && placeFluid(fluidStack, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))) { + if (!player.capabilities.isCreativeMode) drainContainerStack(stack, player, 1000, false); + return true; + } + } + return false; + } + + public boolean isEmpty(ItemStack stack) { + return getFluid(stack) == null; + } + + public int getFreeSpace(ItemStack stack) { + int capacity = getCapacity(stack); + if (capacity > 0) { + FluidStack fluidStack = getFluid(stack); + return fluidStack == null ? capacity : capacity - fluidStack.amount; + } + return 0; + } + + public int getMaxCapacity() { + return this.maxCapacity; + } + + @Override + public int getCapacity(ItemStack stack) { + int capacity = 1000; + if (stack.hasTagCompound()) { + NBTTagCompound nbt = stack.getTagCompound(); + if (nbt.hasKey("Capacity", 3)) capacity = nbt.getInteger("Capacity"); + } + return Math.min(getMaxCapacity(), capacity); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aIconRegister) { + super.registerIcons(aIconRegister); + iconWindow = aIconRegister.registerIcon(GregTech.getResourcePath("gt." + unlocalFlaskName + ".window")); + } + + public void setCapacity(ItemStack stack, int capacity) { + capacity = Math.min(capacity, getMaxCapacity()); + NBTTagCompound nbt = stack.getTagCompound(); + if (nbt == null) { + stack.setTagCompound(nbt = new NBTTagCompound()); + } + nbt.setInteger("Capacity", capacity); + } + + @Override + public FluidStack getFluid(ItemStack stack) { + if (stack.hasTagCompound()) { + NBTTagCompound nbt = stack.getTagCompound(); + if (nbt.hasKey("Fluid", 10)) return FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag("Fluid")); + } + return null; + } + + public void setFluid(ItemStack stack, FluidStack fluidStack) { + boolean removeFluid = (fluidStack == null) || (fluidStack.amount <= 0); + NBTTagCompound nbt = stack.getTagCompound(); + if (nbt == null) { + if (removeFluid) return; + stack.setTagCompound(nbt = new NBTTagCompound()); + } + if (removeFluid) { + nbt.removeTag("Fluid"); + if (nbt.hasNoTags()) { + stack.setTagCompound(null); + } + } else { + nbt.setTag("Fluid", fluidStack.writeToNBT(new NBTTagCompound())); + } + } + + @Override + public int fill(ItemStack stack, FluidStack resource, boolean doFill) { + if (stack.stackSize != 1) return 0; + if ((resource == null) || (resource.amount <= 0)) { + return 0; + } + FluidStack fluidStack = getFluid(stack); + if (fluidStack == null) { + fluidStack = new FluidStack(resource, 0); + } else if (!fluidStack.isFluidEqual(resource)) { + return 0; + } + int amount = Math.min(getCapacity(stack) - fluidStack.amount, resource.amount); + if ((doFill) && (amount > 0)) { + fluidStack.amount += amount; + setFluid(stack, fluidStack); + } + return amount; + } + + @Override + public FluidStack drain(ItemStack stack, int maxDrain, boolean doDrain) { + if (stack.stackSize != 1) return null; + FluidStack fluidStack = getFluid(stack); + if (fluidStack == null) return null; + maxDrain = Math.min(fluidStack.amount, maxDrain); + if (doDrain) { + fluidStack.amount -= maxDrain; + setFluid(stack, fluidStack); + } + return new FluidStack(fluidStack, maxDrain); + } + + @Override + protected void addAdditionalToolTips(List info, ItemStack stack, EntityPlayer aPlayer) { + FluidStack fs = getFluid(stack); + if (fs != null) { + info.add(String.format("< %s, %s mB >", GTUtility.getFluidName(fs, true), formatNumbers(fs.amount))); + } else { + info.add(String.format("< Empty, %s mB >", formatNumbers(getCapacity(stack)))); + } + info.add("Rightclick on air to set volume (only while empty)"); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs creativeTabs, List itemList) { + itemList.add(new ItemStack(this)); + for (Fluid fluid : FluidRegistry.getRegisteredFluids() + .values()) { + if (fluid != null) { + ItemStack stack = new ItemStack(this); + setCapacity(stack, getMaxCapacity()); + fill(stack, new FluidStack(fluid, Integer.MAX_VALUE), true); + itemList.add(stack); + } + } + } + + private boolean interactWithTank(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, + int ordinalSide) { + if (world.isRemote) { + return false; + } + TileEntity te = world.getTileEntity(x, y, z); + if (!(te instanceof IFluidHandler handler)) { + return false; + } + ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide); + FluidStack fs = this.getFluid(stack); + int capacity = getCapacity(stack); + if (fs != null && (!player.isSneaking() || fs.amount >= capacity)) { + int amount = handler.fill(dir, fs, false); + if (amount > 0) { + fs = LiquidUtil.drainContainerStack(stack, player, amount, false); + if (fs != null && fs.amount > 0) { + handler.fill(dir, fs, true); + } + } + } else { + int amount = fs == null ? capacity : capacity - fs.amount; + FluidStack input = handler.drain(dir, amount, false); + if (input != null && input.amount > 0) { + amount = LiquidUtil.fillContainerStack(stack, player, input, false); + if (amount > 0) { + handler.drain(dir, amount, true); + } + } + } + return true; + } + + private boolean collectFluidBlock(ItemStack stack, EntityPlayer player, World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + if (block instanceof IFluidBlock liquid) { + if (liquid.canDrain(world, x, y, z)) { + FluidStack fluid = liquid.drain(world, x, y, z, false); + int amount = fillContainerStack(stack, player, fluid, true); + if (amount == fluid.amount) { + fillContainerStack(stack, player, fluid, false); + liquid.drain(world, x, y, z, true); + return true; + } + } + } else if (world.getBlockMetadata(x, y, z) == 0) { + FluidStack fluid = null; + if (block != Blocks.water && block != Blocks.flowing_water) { + if (block == Blocks.lava || block == Blocks.flowing_lava) { + fluid = new FluidStack(FluidRegistry.LAVA, 1000); + } + } else { + fluid = new FluidStack(FluidRegistry.WATER, 1000); + } + + if (fluid != null) { + int amount = fillContainerStack(stack, player, fluid, true); + if (amount == fluid.amount) { + fillContainerStack(stack, player, fluid, false); + world.setBlockToAir(x, y, z); + return true; + } + } + } + return false; + } + + @Override + public ModularWindow createWindow(UIBuildContext buildContext, ItemStack stack) { + if (!(stack.getItem() instanceof ItemVolumetricFlask)) return null; + return new VolumetricFlaskUIFactory(buildContext, stack).createWindow(); + } + + private class VolumetricFlaskUIFactory { + + private final UIBuildContext buildContext; + private int capacity; + private final int maxCapacity; + + public VolumetricFlaskUIFactory(UIBuildContext buildContext, ItemStack flask) { + this.buildContext = buildContext; + ItemVolumetricFlask flaskItem = (ItemVolumetricFlask) flask.getItem(); + this.capacity = flaskItem.getCapacity(flask); + this.maxCapacity = flaskItem.getMaxCapacity(); + } + + public ModularWindow createWindow() { + ModularWindow.Builder builder = ModularWindow.builder(150, 54); + builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); + + NumericWidget capacityWidget = new NumericWidget(); + builder.widget( + capacityWidget.setGetter(() -> capacity) + .setSetter(value -> setCapacity(getCurrentItem(), capacity = (int) value)) + .setBounds(1, maxCapacity) + .setScrollValues(1, 144, 1000) + .setDefaultValue(capacity) + .setTextColor(Color.WHITE.dark(1)) + .setTextAlignment(Alignment.CenterLeft) + .setFocusOnGuiOpen(true) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) + .setPos(8, 8) + .setSize(77, 12)) + .widget(new TextWidget("Capacity").setPos(88, 10)) + .widget( + new VanillaButtonWidget().setDisplayString("Confirm") + .setOnClick((clickData, widget) -> { + capacityWidget.onRemoveFocus(); + widget.getWindow() + .tryClose(); + }) + .setSynced(false, false) + .setPos(8, 26) + .setSize(48, 20)); + + return builder.build(); + } + + private ItemStack getCurrentItem() { + return buildContext.getPlayer().inventory.getCurrentItem(); + } + } +} diff --git a/src/main/java/gregtech/common/items/ItemWirelessHeadphones.java b/src/main/java/gregtech/common/items/ItemWirelessHeadphones.java new file mode 100644 index 0000000000..4852b0804d --- /dev/null +++ b/src/main/java/gregtech/common/items/ItemWirelessHeadphones.java @@ -0,0 +1,118 @@ +package gregtech.common.items; + +import java.util.List; +import java.util.UUID; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; + +import baubles.api.BaubleType; +import baubles.api.IBauble; +import gregtech.api.enums.ItemList; +import gregtech.api.items.GTGenericItem; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.common.tileentities.machines.basic.MTEBetterJukebox; + +public class ItemWirelessHeadphones extends GTGenericItem implements IBauble { + + public static final String NBTKEY_JUKEBOX_COORDINATES = "jukeboxCoords"; + + public ItemWirelessHeadphones() { + super("WirelessHeadphones", "Wireless Headphones", null); + setMaxStackSize(1); + + ItemList.WirelessHeadphones.set(this); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + if (aStack == null) { + return; + } + final NBTTagCompound tag = aStack.getTagCompound(); + if (tag == null || !tag.hasKey(NBTKEY_JUKEBOX_COORDINATES, Constants.NBT.TAG_STRING)) { + aList.add(StatCollector.translateToLocal("GT5U.machines.betterjukebox.headphonesunbound")); + } else { + aList.add(StatCollector.translateToLocal("GT5U.machines.betterjukebox.headphonesbound")); + aList.add(tag.getString(NBTKEY_JUKEBOX_COORDINATES)); + } + } + + @Override + public boolean doesSneakBypassUse(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) { + return false; + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + final TileEntity pointedTe = world.getTileEntity(x, y, z); + if (!(pointedTe instanceof BaseMetaTileEntity mte)) { + return false; + } + if (!(mte.getMetaTileEntity() instanceof MTEBetterJukebox jukebox)) { + return false; + } + final UUID uuid = jukebox.jukeboxUuid; + if (uuid == MTEBetterJukebox.UNSET_UUID) { + return false; + } + if (!world.isRemote) { + final NBTTagCompound tag = (stack.getTagCompound() == null) ? new NBTTagCompound() : stack.getTagCompound(); + tag.setLong(MTEBetterJukebox.NBTKEY_UUID_LOW, uuid.getLeastSignificantBits()); + tag.setLong(MTEBetterJukebox.NBTKEY_UUID_HIGH, uuid.getMostSignificantBits()); + tag.setString( + NBTKEY_JUKEBOX_COORDINATES, + String.format("(%d, %d, %d) @ %d", x, y, z, world.provider.dimensionId)); + stack.setTagCompound(tag); + + player.addChatMessage(new ChatComponentTranslation("GT5U.machines.betterjukebox.headphonesbound")); + } + return true; + } + + public static UUID getBoundJukeboxUUID(ItemStack stack) { + if (stack == null || stack.getTagCompound() == null) { + return null; + } + final NBTTagCompound tag = stack.getTagCompound(); + if (!tag.hasKey(MTEBetterJukebox.NBTKEY_UUID_LOW, Constants.NBT.TAG_ANY_NUMERIC) + || !tag.hasKey(MTEBetterJukebox.NBTKEY_UUID_HIGH, Constants.NBT.TAG_ANY_NUMERIC)) { + return null; + } + final long idLow = tag.getLong(MTEBetterJukebox.NBTKEY_UUID_LOW); + final long idHigh = tag.getLong(MTEBetterJukebox.NBTKEY_UUID_HIGH); + return new UUID(idHigh, idLow); + } + + @Override + public BaubleType getBaubleType(ItemStack itemStack) { + return BaubleType.UNIVERSAL; + } + + @Override + public void onWornTick(ItemStack itemStack, EntityLivingBase entityLivingBase) {} + + @Override + public void onEquipped(ItemStack itemStack, EntityLivingBase entityLivingBase) {} + + @Override + public void onUnequipped(ItemStack itemStack, EntityLivingBase entityLivingBase) {} + + @Override + public boolean canEquip(ItemStack itemStack, EntityLivingBase entityLivingBase) { + return true; + } + + @Override + public boolean canUnequip(ItemStack itemStack, EntityLivingBase entityLivingBase) { + return true; + } +} diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java new file mode 100644 index 0000000000..ab9917435c --- /dev/null +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java @@ -0,0 +1,4624 @@ +package gregtech.common.items; + +import static gregtech.api.enums.Textures.BlockIcons.COVER_WOOD_PLATE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ACTIVITYDETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ACTIVITYDETECTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ARM; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CONTROLLER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CONVEYOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CRAFTING; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DRAIN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGYDETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUIDDETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR0; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ITEMDETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MAINTENANCE_DETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PUMP; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_REDSTONE_RECEIVER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_REDSTONE_TRANSMITTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCREEN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCREEN_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SHUTTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_VALVE; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_8V; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_EV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_HV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_IV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_LV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_LuV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_MV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_ZPM; +import static gregtech.client.GTTooltipHandler.Tier.ERV; +import static gregtech.client.GTTooltipHandler.Tier.EV; +import static gregtech.client.GTTooltipHandler.Tier.HV; +import static gregtech.client.GTTooltipHandler.Tier.IV; +import static gregtech.client.GTTooltipHandler.Tier.LV; +import static gregtech.client.GTTooltipHandler.Tier.LuV; +import static gregtech.client.GTTooltipHandler.Tier.MAX; +import static gregtech.client.GTTooltipHandler.Tier.MV; +import static gregtech.client.GTTooltipHandler.Tier.UEV; +import static gregtech.client.GTTooltipHandler.Tier.UHV; +import static gregtech.client.GTTooltipHandler.Tier.UIV; +import static gregtech.client.GTTooltipHandler.Tier.ULV; +import static gregtech.client.GTTooltipHandler.Tier.UMV; +import static gregtech.client.GTTooltipHandler.Tier.UV; +import static gregtech.client.GTTooltipHandler.Tier.UXV; +import static gregtech.client.GTTooltipHandler.Tier.ZPM; +import static gregtech.client.GTTooltipHandler.registerTieredTooltip; +import static gregtech.common.items.IDMetaItem01.BatteryHull_EV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_EV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_IV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_IV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_LuV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_LuV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UEV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UEV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UHV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UHV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UIV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UIV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UMV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UMV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UxV; +import static gregtech.common.items.IDMetaItem01.BatteryHull_UxV_Full; +import static gregtech.common.items.IDMetaItem01.BatteryHull_ZPM; +import static gregtech.common.items.IDMetaItem01.BatteryHull_ZPM_Full; +import static gregtech.common.items.IDMetaItem01.Battery_Hull_HV; +import static gregtech.common.items.IDMetaItem01.Battery_Hull_LV; +import static gregtech.common.items.IDMetaItem01.Battery_Hull_MV; +import static gregtech.common.items.IDMetaItem01.Battery_RE_HV_Cadmium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_HV_Lithium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_HV_Sodium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_LV_Cadmium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_LV_Lithium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_LV_Sodium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_MV_Cadmium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_MV_Lithium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_MV_Sodium; +import static gregtech.common.items.IDMetaItem01.Battery_RE_ULV_Tantalum; +import static gregtech.common.items.IDMetaItem01.Battery_SU_HV_Mercury; +import static gregtech.common.items.IDMetaItem01.Battery_SU_HV_Sulfuric_Acid; +import static gregtech.common.items.IDMetaItem01.Battery_SU_LV_Mercury; +import static gregtech.common.items.IDMetaItem01.Battery_SU_LV_Sulfuric_Acid; +import static gregtech.common.items.IDMetaItem01.Battery_SU_MV_Mercury; +import static gregtech.common.items.IDMetaItem01.Battery_SU_MV_Sulfuric_Acid; +import static gregtech.common.items.IDMetaItem01.Black_Hole_Closer; +import static gregtech.common.items.IDMetaItem01.Black_Hole_Opener; +import static gregtech.common.items.IDMetaItem01.Book_Written_01; +import static gregtech.common.items.IDMetaItem01.Book_Written_02; +import static gregtech.common.items.IDMetaItem01.Book_Written_03; +import static gregtech.common.items.IDMetaItem01.Circuit_Advanced; +import static gregtech.common.items.IDMetaItem01.Circuit_Basic; +import static gregtech.common.items.IDMetaItem01.Circuit_Board_Advanced; +import static gregtech.common.items.IDMetaItem01.Circuit_Board_Basic; +import static gregtech.common.items.IDMetaItem01.Circuit_Board_Elite; +import static gregtech.common.items.IDMetaItem01.Circuit_Data; +import static gregtech.common.items.IDMetaItem01.Circuit_Elite; +import static gregtech.common.items.IDMetaItem01.Circuit_Good; +import static gregtech.common.items.IDMetaItem01.Circuit_Master; +import static gregtech.common.items.IDMetaItem01.Circuit_Parts_Advanced; +import static gregtech.common.items.IDMetaItem01.Circuit_Parts_Crystal_Chip_Elite; +import static gregtech.common.items.IDMetaItem01.Circuit_Parts_Crystal_Chip_Master; +import static gregtech.common.items.IDMetaItem01.Circuit_Parts_Crystal_Chip_Wetware; +import static gregtech.common.items.IDMetaItem01.Circuit_Parts_Wiring_Advanced; +import static gregtech.common.items.IDMetaItem01.Circuit_Parts_Wiring_Basic; +import static gregtech.common.items.IDMetaItem01.Circuit_Parts_Wiring_Elite; +import static gregtech.common.items.IDMetaItem01.Circuit_Primitive; +import static gregtech.common.items.IDMetaItem01.Component_Filter; +import static gregtech.common.items.IDMetaItem01.Component_Grinder_Diamond; +import static gregtech.common.items.IDMetaItem01.Component_Grinder_Tungsten; +import static gregtech.common.items.IDMetaItem01.Component_Minecraft_Wheels_Iron; +import static gregtech.common.items.IDMetaItem01.Component_Minecraft_Wheels_Steel; +import static gregtech.common.items.IDMetaItem01.Component_Sawblade_Diamond; +import static gregtech.common.items.IDMetaItem01.Compressed_Fireclay; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_EV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_HV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_IV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_LV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_LuV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_MAX; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_MV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_UEV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_UHV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_UIV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_UMV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_UV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_UXV; +import static gregtech.common.items.IDMetaItem01.Conveyor_Module_ZPM; +import static gregtech.common.items.IDMetaItem01.Cover_ActivityDetector; +import static gregtech.common.items.IDMetaItem01.Cover_Chest_Advanced; +import static gregtech.common.items.IDMetaItem01.Cover_Chest_Basic; +import static gregtech.common.items.IDMetaItem01.Cover_Chest_Good; +import static gregtech.common.items.IDMetaItem01.Cover_Controller; +import static gregtech.common.items.IDMetaItem01.Cover_Crafting; +import static gregtech.common.items.IDMetaItem01.Cover_Drain; +import static gregtech.common.items.IDMetaItem01.Cover_EnergyDetector; +import static gregtech.common.items.IDMetaItem01.Cover_FLuidStorageMonitor; +import static gregtech.common.items.IDMetaItem01.Cover_FluidDetector; +import static gregtech.common.items.IDMetaItem01.Cover_FluidLimiter; +import static gregtech.common.items.IDMetaItem01.Cover_ItemDetector; +import static gregtech.common.items.IDMetaItem01.Cover_NeedsMaintenance; +import static gregtech.common.items.IDMetaItem01.Cover_PlayerDetector; +import static gregtech.common.items.IDMetaItem01.Cover_RedstoneReceiverExternal; +import static gregtech.common.items.IDMetaItem01.Cover_RedstoneReceiverInternal; +import static gregtech.common.items.IDMetaItem01.Cover_RedstoneTransmitterExternal; +import static gregtech.common.items.IDMetaItem01.Cover_RedstoneTransmitterInternal; +import static gregtech.common.items.IDMetaItem01.Cover_Screen; +import static gregtech.common.items.IDMetaItem01.Cover_Shutter; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_8V; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_EV; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_HV; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_IV; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_LV; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_LuV; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_MV; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_UV; +import static gregtech.common.items.IDMetaItem01.Cover_SolarPanel_ZPM; +import static gregtech.common.items.IDMetaItem01.Crate_Empty; +import static gregtech.common.items.IDMetaItem01.Duct_Tape; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_EV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_HV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_IV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_LV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_LuV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_MAX; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_MV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_UEV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_UHV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_UIV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_UMV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_UV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_UXV; +import static gregtech.common.items.IDMetaItem01.Electric_Motor_ZPM; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_EV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_HV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_IV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_LV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_LuV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_MAX; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_MV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_UEV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_UHV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_UIV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_UMV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_UV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_UXV; +import static gregtech.common.items.IDMetaItem01.Electric_Piston_ZPM; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_EV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_HV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_IV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_LV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_LuV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_MAX; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_MV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_UEV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_UHV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_UIV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_UMV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_UV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_UXV; +import static gregtech.common.items.IDMetaItem01.Electric_Pump_ZPM; +import static gregtech.common.items.IDMetaItem01.Electromagnet_Iron; +import static gregtech.common.items.IDMetaItem01.Electromagnet_Neodymium; +import static gregtech.common.items.IDMetaItem01.Electromagnet_Samarium; +import static gregtech.common.items.IDMetaItem01.Electromagnet_Steel; +import static gregtech.common.items.IDMetaItem01.Electromagnet_Tengam; +import static gregtech.common.items.IDMetaItem01.Emitter_EV; +import static gregtech.common.items.IDMetaItem01.Emitter_HV; +import static gregtech.common.items.IDMetaItem01.Emitter_IV; +import static gregtech.common.items.IDMetaItem01.Emitter_LV; +import static gregtech.common.items.IDMetaItem01.Emitter_LuV; +import static gregtech.common.items.IDMetaItem01.Emitter_MAX; +import static gregtech.common.items.IDMetaItem01.Emitter_MV; +import static gregtech.common.items.IDMetaItem01.Emitter_UEV; +import static gregtech.common.items.IDMetaItem01.Emitter_UHV; +import static gregtech.common.items.IDMetaItem01.Emitter_UIV; +import static gregtech.common.items.IDMetaItem01.Emitter_UMV; +import static gregtech.common.items.IDMetaItem01.Emitter_UV; +import static gregtech.common.items.IDMetaItem01.Emitter_UXV; +import static gregtech.common.items.IDMetaItem01.Emitter_ZPM; +import static gregtech.common.items.IDMetaItem01.Empty_Board_Basic; +import static gregtech.common.items.IDMetaItem01.Empty_Board_Elite; +import static gregtech.common.items.IDMetaItem01.EnergisedTesseract; +import static gregtech.common.items.IDMetaItem01.Energy_Cluster; +import static gregtech.common.items.IDMetaItem01.Energy_Lapotronic_Orb; +import static gregtech.common.items.IDMetaItem01.Energy_Lapotronic_orb_2; +import static gregtech.common.items.IDMetaItem01.Energy_Module; +import static gregtech.common.items.IDMetaItem01.Field_Generator_EV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_HV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_IV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_LV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_LuV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_MAX; +import static gregtech.common.items.IDMetaItem01.Field_Generator_MV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_UEV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_UHV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_UIV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_UMV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_UV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_UXV; +import static gregtech.common.items.IDMetaItem01.Field_Generator_ZPM; +import static gregtech.common.items.IDMetaItem01.Firebrick; +import static gregtech.common.items.IDMetaItem01.FluidFilter; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_EV; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_HV; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_IV; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_LV; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_LuV; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_MV; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_UV; +import static gregtech.common.items.IDMetaItem01.FluidRegulator_ZPM; +import static gregtech.common.items.IDMetaItem01.Fuel_Can_Plastic_Empty; +import static gregtech.common.items.IDMetaItem01.Fuel_Can_Plastic_Filled; +import static gregtech.common.items.IDMetaItem01.GigaChad; +import static gregtech.common.items.IDMetaItem01.Gravistar; +import static gregtech.common.items.IDMetaItem01.Ingot_Heavy1; +import static gregtech.common.items.IDMetaItem01.Ingot_Heavy2; +import static gregtech.common.items.IDMetaItem01.Ingot_Heavy3; +import static gregtech.common.items.IDMetaItem01.Ingot_Iridium_Alloy; +import static gregtech.common.items.IDMetaItem01.ItemFilter_Export; +import static gregtech.common.items.IDMetaItem01.ItemFilter_Import; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_Aluminium; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_Chrome; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_Iridium; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_Neutronium; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_Osmium; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_StainlessSteel; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_Steel; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_Titanium; +import static gregtech.common.items.IDMetaItem01.Large_Fluid_Cell_TungstenSteel; +import static gregtech.common.items.IDMetaItem01.McGuffium_239; +import static gregtech.common.items.IDMetaItem01.NC_SensorKit; +import static gregtech.common.items.IDMetaItem01.NaquadriaSupersolid; +import static gregtech.common.items.IDMetaItem01.Paper_Magic_Empty; +import static gregtech.common.items.IDMetaItem01.Paper_Magic_Page; +import static gregtech.common.items.IDMetaItem01.Paper_Magic_Pages; +import static gregtech.common.items.IDMetaItem01.Paper_Printed_Pages; +import static gregtech.common.items.IDMetaItem01.Paper_Punch_Card_Empty; +import static gregtech.common.items.IDMetaItem01.Paper_Punch_Card_Encoded; +import static gregtech.common.items.IDMetaItem01.QuantumEye; +import static gregtech.common.items.IDMetaItem01.QuantumStar; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_EV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_HV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_IV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_LV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_LuV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_MAX; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_MV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_UEV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_UHV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_UIV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_UMV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_UV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_UXV; +import static gregtech.common.items.IDMetaItem01.Robot_Arm_ZPM; +import static gregtech.common.items.IDMetaItem01.Schematic; +import static gregtech.common.items.IDMetaItem01.Schematic_1by1; +import static gregtech.common.items.IDMetaItem01.Schematic_2by2; +import static gregtech.common.items.IDMetaItem01.Schematic_3by3; +import static gregtech.common.items.IDMetaItem01.Schematic_Crafting; +import static gregtech.common.items.IDMetaItem01.Schematic_Dust; +import static gregtech.common.items.IDMetaItem01.Sensor_EV; +import static gregtech.common.items.IDMetaItem01.Sensor_HV; +import static gregtech.common.items.IDMetaItem01.Sensor_IV; +import static gregtech.common.items.IDMetaItem01.Sensor_LV; +import static gregtech.common.items.IDMetaItem01.Sensor_LuV; +import static gregtech.common.items.IDMetaItem01.Sensor_MAX; +import static gregtech.common.items.IDMetaItem01.Sensor_MV; +import static gregtech.common.items.IDMetaItem01.Sensor_UEV; +import static gregtech.common.items.IDMetaItem01.Sensor_UHV; +import static gregtech.common.items.IDMetaItem01.Sensor_UIV; +import static gregtech.common.items.IDMetaItem01.Sensor_UMV; +import static gregtech.common.items.IDMetaItem01.Sensor_UV; +import static gregtech.common.items.IDMetaItem01.Sensor_UXV; +import static gregtech.common.items.IDMetaItem01.Sensor_ZPM; +import static gregtech.common.items.IDMetaItem01.Shape_Empty; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Axe; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Block; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Bolt; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Bottle; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Casing; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Cell; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_File; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Gear; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Hammer; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Hoe; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Ingot; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Pickaxe; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Pipe_Huge; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Pipe_Large; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Pipe_Medium; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Pipe_Small; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Pipe_Tiny; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Plate; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Ring; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Rod; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Rotor; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Saw; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Shovel; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Small_Gear; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Sword; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Tool_Head_Drill; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Turbine_Blade; +import static gregtech.common.items.IDMetaItem01.Shape_Extruder_Wire; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Anvil; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Arrow; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Baguette; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Ball; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Block; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Bolt; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Bottle; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Bread; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Bun; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Casing; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Credit; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Cylinder; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Gear; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Gear_Small; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Ingot; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Name; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Nugget; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Pipe_Huge; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Pipe_Large; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Pipe_Medium; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Pipe_Small; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Pipe_Tiny; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Plate; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Ring; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Rod; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Rod_Long; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Rotor; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Round; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Screw; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Tool_Head_Drill; +import static gregtech.common.items.IDMetaItem01.Shape_Mold_Turbine_Blade; +import static gregtech.common.items.IDMetaItem01.Shape_Slicer_Flat; +import static gregtech.common.items.IDMetaItem01.Shape_Slicer_Stripes; +import static gregtech.common.items.IDMetaItem01.Spray_Color_0; +import static gregtech.common.items.IDMetaItem01.Spray_Color_1; +import static gregtech.common.items.IDMetaItem01.Spray_Color_10; +import static gregtech.common.items.IDMetaItem01.Spray_Color_11; +import static gregtech.common.items.IDMetaItem01.Spray_Color_12; +import static gregtech.common.items.IDMetaItem01.Spray_Color_13; +import static gregtech.common.items.IDMetaItem01.Spray_Color_14; +import static gregtech.common.items.IDMetaItem01.Spray_Color_15; +import static gregtech.common.items.IDMetaItem01.Spray_Color_2; +import static gregtech.common.items.IDMetaItem01.Spray_Color_3; +import static gregtech.common.items.IDMetaItem01.Spray_Color_4; +import static gregtech.common.items.IDMetaItem01.Spray_Color_5; +import static gregtech.common.items.IDMetaItem01.Spray_Color_6; +import static gregtech.common.items.IDMetaItem01.Spray_Color_7; +import static gregtech.common.items.IDMetaItem01.Spray_Color_8; +import static gregtech.common.items.IDMetaItem01.Spray_Color_9; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Remover; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Remover_Empty; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_0; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_1; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_10; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_11; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_12; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_13; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_14; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_15; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_2; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_3; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_4; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_5; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_6; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_7; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_8; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_9; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_Remover; +import static gregtech.common.items.IDMetaItem01.Spray_Empty; +import static gregtech.common.items.IDMetaItem01.StableAdhesive; +import static gregtech.common.items.IDMetaItem01.Steam_Regulator_EV; +import static gregtech.common.items.IDMetaItem01.Steam_Regulator_HV; +import static gregtech.common.items.IDMetaItem01.Steam_Regulator_IV; +import static gregtech.common.items.IDMetaItem01.Steam_Regulator_LV; +import static gregtech.common.items.IDMetaItem01.Steam_Regulator_MV; +import static gregtech.common.items.IDMetaItem01.Steam_Valve_EV; +import static gregtech.common.items.IDMetaItem01.Steam_Valve_HV; +import static gregtech.common.items.IDMetaItem01.Steam_Valve_IV; +import static gregtech.common.items.IDMetaItem01.Steam_Valve_LV; +import static gregtech.common.items.IDMetaItem01.Steam_Valve_MV; +import static gregtech.common.items.IDMetaItem01.SuperconductorComposite; +import static gregtech.common.items.IDMetaItem01.Tesseract; +import static gregtech.common.items.IDMetaItem01.Thermos_Can_Empty; +import static gregtech.common.items.IDMetaItem01.Tool_Cheat; +import static gregtech.common.items.IDMetaItem01.Tool_Cover_Copy_Paste; +import static gregtech.common.items.IDMetaItem01.Tool_DataOrb; +import static gregtech.common.items.IDMetaItem01.Tool_DataStick; +import static gregtech.common.items.IDMetaItem01.Tool_Lighter_Invar_Empty; +import static gregtech.common.items.IDMetaItem01.Tool_Lighter_Invar_Full; +import static gregtech.common.items.IDMetaItem01.Tool_Lighter_Invar_Used; +import static gregtech.common.items.IDMetaItem01.Tool_Lighter_Platinum_Empty; +import static gregtech.common.items.IDMetaItem01.Tool_Lighter_Platinum_Full; +import static gregtech.common.items.IDMetaItem01.Tool_Lighter_Platinum_Used; +import static gregtech.common.items.IDMetaItem01.Tool_MatchBox_Full; +import static gregtech.common.items.IDMetaItem01.Tool_MatchBox_Used; +import static gregtech.common.items.IDMetaItem01.Tool_Matches; +import static gregtech.common.items.IDMetaItem01.Tool_Scanner; +import static gregtech.common.items.IDMetaItem01.Tool_Sonictron; +import static gregtech.common.items.IDMetaItem01.Upgrade_Lock; +import static gregtech.common.items.IDMetaItem01.Upgrade_Muffler; +import static gregtech.common.items.IDMetaItem01.ZPM2; +import static gregtech.common.items.IDMetaItem01.ZPM3; +import static gregtech.common.items.IDMetaItem01.ZPM4; +import static gregtech.common.items.IDMetaItem01.ZPM5; +import static gregtech.common.items.IDMetaItem01.ZPM6; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TCAspects; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.interfaces.ITexture; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedItemX32; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.MaterialStack; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTFoodStat; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.common.config.other.ConfigGeneral; +import gregtech.common.covers.CoverArm; +import gregtech.common.covers.CoverChest; +import gregtech.common.covers.CoverControlsWork; +import gregtech.common.covers.CoverConveyor; +import gregtech.common.covers.CoverCrafting; +import gregtech.common.covers.CoverDoesWork; +import gregtech.common.covers.CoverDrain; +import gregtech.common.covers.CoverEUMeter; +import gregtech.common.covers.CoverFluidLimiter; +import gregtech.common.covers.CoverFluidRegulator; +import gregtech.common.covers.CoverFluidStorageMonitor; +import gregtech.common.covers.CoverFluidfilter; +import gregtech.common.covers.CoverItemFilter; +import gregtech.common.covers.CoverItemMeter; +import gregtech.common.covers.CoverLiquidMeter; +import gregtech.common.covers.CoverNeedMaintainance; +import gregtech.common.covers.CoverPlayerDetector; +import gregtech.common.covers.CoverPump; +import gregtech.common.covers.CoverRedstoneReceiverExternal; +import gregtech.common.covers.CoverRedstoneReceiverInternal; +import gregtech.common.covers.CoverRedstoneTransmitterExternal; +import gregtech.common.covers.CoverRedstoneTransmitterInternal; +import gregtech.common.covers.CoverScreen; +import gregtech.common.covers.CoverShutter; +import gregtech.common.covers.CoverSolarPanel; +import gregtech.common.covers.CoverSteamRegulator; +import gregtech.common.covers.CoverSteamValve; +import gregtech.common.items.behaviors.BehaviourCoverTool; +import gregtech.common.items.behaviors.BehaviourDataOrb; +import gregtech.common.items.behaviors.BehaviourDataStick; +import gregtech.common.items.behaviors.BehaviourLighter; +import gregtech.common.items.behaviors.BehaviourPrintedPages; +import gregtech.common.items.behaviors.BehaviourScanner; +import gregtech.common.items.behaviors.BehaviourSensorKit; +import gregtech.common.items.behaviors.BehaviourSonictron; +import gregtech.common.items.behaviors.BehaviourSprayColor; +import gregtech.common.items.behaviors.BehaviourSprayColorRemover; +import gregtech.common.items.behaviors.BehaviourWrittenBook; +import gregtech.common.tileentities.machines.multi.MTEIndustrialElectromagneticSeparator.MagnetTiers; + +public class MetaGeneratedItem01 extends MetaGeneratedItemX32 { + + public static MetaGeneratedItem01 INSTANCE; + private final String mToolTipPurify = GTLanguageManager + .addStringLocalization("metaitem.01.tooltip.purify", "Throw into Cauldron to get clean Dust"); + private static final String aTextEmptyRow = " "; + private static final String aTextShape = " P "; + private static final String PartCoverText = " L/t ("; + private static final String PartCoverText2 = " L/s) as Cover"; + private static final String PartNotCoverText = "Cannot be used as a Cover"; + private static final String RAText = "Grabs from and inserts into specific slots"; + private static final String FRText1 = "Configurable up to "; + private static final String FRText2 = " L/sec (as Cover)/n Rightclick/Screwdriver-rightclick/Shift-screwdriver-rightclick/n to adjust the pump speed by 1/16/256 L/sec per click"; + + private static final int[] Spray_Colors = new int[] { Spray_Color_0.ID, Spray_Color_1.ID, Spray_Color_2.ID, + Spray_Color_3.ID, Spray_Color_4.ID, Spray_Color_5.ID, Spray_Color_6.ID, Spray_Color_7.ID, Spray_Color_8.ID, + Spray_Color_9.ID, Spray_Color_10.ID, Spray_Color_11.ID, Spray_Color_12.ID, Spray_Color_13.ID, Spray_Color_14.ID, + Spray_Color_15.ID }; + private static final int[] Spray_Colors_Used = new int[] { Spray_Color_Used_0.ID, Spray_Color_Used_1.ID, + Spray_Color_Used_2.ID, Spray_Color_Used_3.ID, Spray_Color_Used_4.ID, Spray_Color_Used_5.ID, + Spray_Color_Used_6.ID, Spray_Color_Used_7.ID, Spray_Color_Used_8.ID, Spray_Color_Used_9.ID, + Spray_Color_Used_10.ID, Spray_Color_Used_11.ID, Spray_Color_Used_12.ID, Spray_Color_Used_13.ID, + Spray_Color_Used_14.ID, Spray_Color_Used_15.ID }; + + public MetaGeneratedItem01() { + super( + "metaitem.01", + OrePrefixes.dustTiny, + OrePrefixes.dustSmall, + OrePrefixes.dust, + OrePrefixes.dustImpure, + OrePrefixes.dustPure, + OrePrefixes.crushed, + OrePrefixes.crushedPurified, + OrePrefixes.crushedCentrifuged, + OrePrefixes.gem, + OrePrefixes.nugget, + null, + OrePrefixes.ingot, + OrePrefixes.ingotHot, + OrePrefixes.ingotDouble, + OrePrefixes.ingotTriple, + OrePrefixes.ingotQuadruple, + OrePrefixes.ingotQuintuple, + OrePrefixes.plate, + OrePrefixes.plateDouble, + OrePrefixes.plateTriple, + OrePrefixes.plateQuadruple, + OrePrefixes.plateQuintuple, + OrePrefixes.plateDense, + OrePrefixes.stick, + OrePrefixes.lens, + OrePrefixes.round, + OrePrefixes.bolt, + OrePrefixes.screw, + OrePrefixes.ring, + OrePrefixes.foil, + OrePrefixes.cell, + OrePrefixes.cellPlasma); + INSTANCE = this; + + ItemList.Credit_Greg_Copper + .set(addItem(IDMetaItem01.Credit_Greg_Copper.ID, "Copper GT Credit", "0.125 Credits")); + ItemList.Credit_Greg_Cupronickel.set( + addItem( + IDMetaItem01.Credit_Greg_Cupronickel.ID, + "Cupronickel GT Credit", + "1 Credit", + new ItemData(Materials.Cupronickel, 907200L))); + ItemList.Credit_Greg_Silver.set( + addItem( + IDMetaItem01.Credit_Greg_Silver.ID, + "Silver GT Credit", + "8 Credits", + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + ItemList.Credit_Greg_Gold.set(addItem(IDMetaItem01.Credit_Greg_Gold.ID, "Gold GT Credit", "64 Credits")); + ItemList.Credit_Greg_Platinum + .set(addItem(IDMetaItem01.Credit_Greg_Platinum.ID, "Platinum GT Credit", "512 Credits")); + ItemList.Credit_Greg_Osmium + .set(addItem(IDMetaItem01.Credit_Greg_Osmium.ID, "Osmium GT Credit", "4,096 Credits")); + ItemList.Credit_Greg_Naquadah + .set(addItem(IDMetaItem01.Credit_Greg_Naquadah.ID, "Naquadah GT Credit", "32,768 Credits")); + ItemList.Credit_Greg_Neutronium + .set(addItem(IDMetaItem01.Credit_Greg_Neutronium.ID, "Neutronium GT Credit", "262,144 Credits")); + ItemList.Coin_Gold_Ancient.set( + addItem( + IDMetaItem01.Coin_Gold_Ancient.ID, + "Ancient Gold Coin", + "Found in ancient Ruins", + new ItemData(Materials.Gold, 907200L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 8L))); + ItemList.Coin_Doge.set( + addItem( + IDMetaItem01.Coin_Doge.ID, + "Doge Coin", + "wow much coin how money so crypto plz mine v rich very currency wow", + new ItemData(Materials.Brass, 907200L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + ItemList.Coin_Chocolate.set( + addItem( + IDMetaItem01.Coin_Chocolate.ID, + "Chocolate Coin", + "Wrapped in Gold", + new ItemData(Materials.Gold, OrePrefixes.foil.mMaterialAmount), + new GTFoodStat( + 1, + 0.1F, + EnumAction.eat, + GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gold, 1L), + true, + false, + false, + Potion.moveSpeed.id, + 200, + 1, + 100))); + ItemList.Credit_Copper.set(addItem(IDMetaItem01.Credit_Copper.ID, "Industrial Copper Credit", "0.125 Credits")); + + ItemList.Credit_Silver.set( + addItem( + IDMetaItem01.Credit_Silver.ID, + "Industrial Silver Credit", + "8 Credits", + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + ItemList.Credit_Gold.set(addItem(IDMetaItem01.Credit_Gold.ID, "Industrial Gold Credit", "64 Credits")); + ItemList.Credit_Platinum + .set(addItem(IDMetaItem01.Credit_Platinum.ID, "Industrial Platinum Credit", "512 Credits")); + ItemList.Credit_Osmium.set(addItem(IDMetaItem01.Credit_Osmium.ID, "Industrial Osmium Credit", "4096 Credits")); + + ItemList.Component_Minecart_Wheels_Iron.set( + addItem( + Component_Minecraft_Wheels_Iron.ID, + "Iron Minecart Wheels", + "To get things rolling", + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L))); + ItemList.Component_Minecart_Wheels_Steel.set( + addItem( + Component_Minecraft_Wheels_Steel.ID, + "Steel Minecart Wheels", + "To get things rolling", + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L))); + + GTModHandler.addCraftingRecipe( + ItemList.Component_Minecart_Wheels_Iron.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { " h ", "RSR", " w ", 'R', OrePrefixes.ring.get(Materials.AnyIron), 'S', + OrePrefixes.stick.get(Materials.AnyIron) }); + GTModHandler.addCraftingRecipe( + ItemList.Component_Minecart_Wheels_Steel.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { " h ", "RSR", " w ", 'R', OrePrefixes.ring.get(Materials.Steel), 'S', + OrePrefixes.stick.get(Materials.Steel) }); + + ItemList.CompressedFireclay.set(addItem(Compressed_Fireclay.ID, "Compressed Fireclay", "Brick-shaped")); + GTOreDictUnificator.addItemDataFromInputs(ItemList.CompressedFireclay.get(1), Materials.Fireclay.getDust(1)); + + ItemList.Firebrick.set(addItem(Firebrick.ID, "Firebrick", "Heat resistant")); + GTOreDictUnificator.addItemDataFromInputs(ItemList.Firebrick.get(1), Materials.Fireclay.getDust(1)); + + ItemList.Shape_Empty.set( + addItem( + Shape_Empty.ID, + "Empty Shape Plate", + "Raw Plate to make Molds and Extruder Shapes", + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L))); + + ItemList.Shape_Mold_Plate.set(addItem(Shape_Mold_Plate.ID, "Mold (Plate)", "Mold for making Plates")); + ItemList.Shape_Mold_Casing.set(addItem(Shape_Mold_Casing.ID, "Mold (Casing)", "Mold for making Item Casings")); + ItemList.Shape_Mold_Gear.set(addItem(Shape_Mold_Gear.ID, "Mold (Gear)", "Mold for making Gears")); + ItemList.Shape_Mold_Credit + .set(addItem(Shape_Mold_Credit.ID, "Mold (Coinage)", "Secure Mold for making Coins (Don't lose it!)")); + ItemList.Shape_Mold_Bottle.set(addItem(Shape_Mold_Bottle.ID, "Mold (Bottle)", "Mold for making Bottles")); + ItemList.Shape_Mold_Ingot.set(addItem(Shape_Mold_Ingot.ID, "Mold (Ingot)", "Mold for making Ingots")); + ItemList.Shape_Mold_Ball.set(addItem(Shape_Mold_Ball.ID, "Mold (Ball)", "Mold for making Balls")); + ItemList.Shape_Mold_Block.set(addItem(Shape_Mold_Block.ID, "Mold (Block)", "Mold for making Blocks")); + ItemList.Shape_Mold_Nugget.set(addItem(Shape_Mold_Nugget.ID, "Mold (Nuggets)", "Mold for making Nuggets")); + ItemList.Shape_Mold_Bun.set(addItem(Shape_Mold_Bun.ID, "Mold (Buns)", "Mold for shaping Buns")); + ItemList.Shape_Mold_Bread.set(addItem(Shape_Mold_Bread.ID, "Mold (Bread)", "Mold for shaping Breads")); + ItemList.Shape_Mold_Baguette + .set(addItem(Shape_Mold_Baguette.ID, "Mold (Baguette)", "Mold for shaping Baguettes")); + ItemList.Shape_Mold_Cylinder + .set(addItem(Shape_Mold_Cylinder.ID, "Mold (Cylinder)", "Mold for shaping Cylinders")); + ItemList.Shape_Mold_Anvil.set(addItem(Shape_Mold_Anvil.ID, "Mold (Anvil)", "Mold for shaping Anvils")); + ItemList.Shape_Mold_Name + .set(addItem(Shape_Mold_Name.ID, "Mold (Name)", "Mold for naming Items (rename Mold with Anvil)")); + ItemList.Shape_Mold_Arrow.set(addItem(Shape_Mold_Arrow.ID, "Mold (Arrow Head)", "Mold for making Arrow Heads")); + ItemList.Shape_Mold_Gear_Small + .set(addItem(Shape_Mold_Gear_Small.ID, "Mold (Small Gear)", "Mold for making small Gears")); + ItemList.Shape_Mold_Rod.set(addItem(Shape_Mold_Rod.ID, "Mold (Rod)", "Mold for making Rods")); + ItemList.Shape_Mold_Bolt.set(addItem(Shape_Mold_Bolt.ID, "Mold (Bolt)", "Mold for making Bolts")); + ItemList.Shape_Mold_Round.set(addItem(Shape_Mold_Round.ID, "Mold (Round)", "Mold for making Rounds")); + ItemList.Shape_Mold_Screw.set(addItem(Shape_Mold_Screw.ID, "Mold (Screw)", "Mold for making Screws")); + ItemList.Shape_Mold_Ring.set(addItem(Shape_Mold_Ring.ID, "Mold (Ring)", "Mold for making Rings")); + ItemList.Shape_Mold_Rod_Long + .set(addItem(Shape_Mold_Rod_Long.ID, "Mold (Long Rod)", "Mold for making Long Rods")); + ItemList.Shape_Mold_Rotor.set(addItem(Shape_Mold_Rotor.ID, "Mold (Rotor)", "Mold for making a Rotor")); + ItemList.Shape_Mold_Turbine_Blade + .set(addItem(Shape_Mold_Turbine_Blade.ID, "Mold (Turbine Blade)", "Mold for making a Turbine Blade")); + ItemList.Shape_Mold_Pipe_Tiny + .set(addItem(Shape_Mold_Pipe_Tiny.ID, "Mold (Tiny Pipe)", "Mold for making tiny Pipes")); + ItemList.Shape_Mold_Pipe_Small + .set(addItem(Shape_Mold_Pipe_Small.ID, "Mold (Small Pipe)", "Mold for making small Pipes")); + ItemList.Shape_Mold_Pipe_Medium + .set(addItem(Shape_Mold_Pipe_Medium.ID, "Mold (Normal Pipe)", "Mold for making Pipes")); + ItemList.Shape_Mold_Pipe_Large + .set(addItem(Shape_Mold_Pipe_Large.ID, "Mold (Large Pipe)", "Mold for making large Pipes")); + ItemList.Shape_Mold_Pipe_Huge + .set(addItem(Shape_Mold_Pipe_Huge.ID, "Mold (Huge Pipe)", "Mold for making full Block Pipes")); + ItemList.Shape_Mold_ToolHeadDrill + .set(addItem(Shape_Mold_Tool_Head_Drill.ID, "Mold (Drill Head)", "Mold for making Drill Heads")); + + ItemList.Shape_Extruder_Plate + .set(addItem(Shape_Extruder_Plate.ID, "Extruder Shape (Plate)", "Extruder Shape for making Plates")); + ItemList.Shape_Extruder_Rod + .set(addItem(Shape_Extruder_Rod.ID, "Extruder Shape (Rod)", "Extruder Shape for making Rods")); + ItemList.Shape_Extruder_Bolt + .set(addItem(Shape_Extruder_Bolt.ID, "Extruder Shape (Bolt)", "Extruder Shape for making Bolts")); + ItemList.Shape_Extruder_Ring + .set(addItem(Shape_Extruder_Ring.ID, "Extruder Shape (Ring)", "Extruder Shape for making Rings")); + ItemList.Shape_Extruder_Cell + .set(addItem(Shape_Extruder_Cell.ID, "Extruder Shape (Cell)", "Extruder Shape for making Cells")); + ItemList.Shape_Extruder_Ingot.set( + addItem( + Shape_Extruder_Ingot.ID, + "Extruder Shape (Ingot)", + "Extruder Shape for, wait, can't we just use a Furnace?")); + ItemList.Shape_Extruder_Wire + .set(addItem(Shape_Extruder_Wire.ID, "Extruder Shape (Wire)", "Extruder Shape for making Wires")); + ItemList.Shape_Extruder_Casing.set( + addItem(Shape_Extruder_Casing.ID, "Extruder Shape (Casing)", "Extruder Shape for making Item Casings")); + ItemList.Shape_Extruder_Pipe_Tiny.set( + addItem(Shape_Extruder_Pipe_Tiny.ID, "Extruder Shape (Tiny Pipe)", "Extruder Shape for making tiny Pipes")); + ItemList.Shape_Extruder_Pipe_Small.set( + addItem( + Shape_Extruder_Pipe_Small.ID, + "Extruder Shape (Small Pipe)", + "Extruder Shape for making small Pipes")); + ItemList.Shape_Extruder_Pipe_Medium.set( + addItem(Shape_Extruder_Pipe_Medium.ID, "Extruder Shape (Normal Pipe)", "Extruder Shape for making Pipes")); + ItemList.Shape_Extruder_Pipe_Large.set( + addItem( + Shape_Extruder_Pipe_Large.ID, + "Extruder Shape (Large Pipe)", + "Extruder Shape for making large Pipes")); + ItemList.Shape_Extruder_Pipe_Huge.set( + addItem( + Shape_Extruder_Pipe_Huge.ID, + "Extruder Shape (Huge Pipe)", + "Extruder Shape for making full Block Pipes")); + ItemList.Shape_Extruder_Block + .set(addItem(Shape_Extruder_Block.ID, "Extruder Shape (Block)", "Extruder Shape for making Blocks")); + ItemList.Shape_Extruder_Sword + .set(addItem(Shape_Extruder_Sword.ID, "Extruder Shape (Sword Blade)", "Extruder Shape for making Swords")); + ItemList.Shape_Extruder_Pickaxe.set( + addItem(Shape_Extruder_Pickaxe.ID, "Extruder Shape (Pickaxe Head)", "Extruder Shape for making Pickaxes")); + ItemList.Shape_Extruder_Shovel.set( + addItem(Shape_Extruder_Shovel.ID, "Extruder Shape (Shovel Head)", "Extruder Shape for making Shovels")); + ItemList.Shape_Extruder_Axe + .set(addItem(Shape_Extruder_Axe.ID, "Extruder Shape (Axe Head)", "Extruder Shape for making Axes")); + ItemList.Shape_Extruder_Hoe + .set(addItem(Shape_Extruder_Hoe.ID, "Extruder Shape (Hoe Head)", "Extruder Shape for making Hoes")); + ItemList.Shape_Extruder_Hammer.set( + addItem(Shape_Extruder_Hammer.ID, "Extruder Shape (Hammer Head)", "Extruder Shape for making Hammers")); + ItemList.Shape_Extruder_File + .set(addItem(Shape_Extruder_File.ID, "Extruder Shape (File Head)", "Extruder Shape for making Files")); + ItemList.Shape_Extruder_Saw + .set(addItem(Shape_Extruder_Saw.ID, "Extruder Shape (Saw Blade)", "Extruder Shape for making Saws")); + ItemList.Shape_Extruder_Gear + .set(addItem(Shape_Extruder_Gear.ID, "Extruder Shape (Gear)", "Extruder Shape for making Gears")); + ItemList.Shape_Extruder_Bottle + .set(addItem(Shape_Extruder_Bottle.ID, "Extruder Shape (Bottle)", "Extruder Shape for making Bottles")); + ItemList.Shape_Extruder_Rotor + .set(addItem(Shape_Extruder_Rotor.ID, "Extruder Shape (Rotor)", "Extruder Shape for a Rotor")); + ItemList.Shape_Extruder_Small_Gear.set( + addItem(Shape_Extruder_Small_Gear.ID, "Extruder Shape (Small Gear)", "Extruder Shape for a Small Gear")); + ItemList.Shape_Extruder_Turbine_Blade.set( + addItem( + Shape_Extruder_Turbine_Blade.ID, + "Extruder Shape (Turbine Blade)", + "Extruder Shape for a Turbine Blade")); + ItemList.Shape_Extruder_ToolHeadDrill.set( + addItem( + Shape_Extruder_Tool_Head_Drill.ID, + "Extruder Shape (Drill Head)", + "Extruder Shape for a Drill Head")); + + ItemList.Shape_Slicer_Flat + .set(addItem(Shape_Slicer_Flat.ID, "Slicer Blade (Flat)", "Slicer Blade for cutting Flat")); + ItemList.Shape_Slicer_Stripes + .set(addItem(Shape_Slicer_Stripes.ID, "Slicer Blade (Stripes)", "Slicer Blade for cutting Stripes")); + + ItemList.Fuel_Can_Plastic_Empty.set( + addItem( + Fuel_Can_Plastic_Empty.ID, + "Empty Plastic Fuel Can", + "Used to store Fuels", + new ItemData(Materials.Plastic, OrePrefixes.plate.mMaterialAmount * 1L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L))); + ItemList.Fuel_Can_Plastic_Filled.set( + addItem( + Fuel_Can_Plastic_Filled.ID, + "Plastic Fuel Can", + "Burns well in Diesel Generators", + new ItemData(Materials.Plastic, OrePrefixes.plate.mMaterialAmount * 1L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L))); + + ItemList.Spray_Empty.set( + addItem( + Spray_Empty.ID, + "Empty Spray Can", + "Used for making Sprays", + new ItemData( + Materials.Tin, + OrePrefixes.plate.mMaterialAmount * 2L, + Materials.Redstone, + OrePrefixes.dust.mMaterialAmount), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + + ItemList.Crate_Empty.set( + addItem( + Crate_Empty.ID, + "Empty Crate", + "To Package lots of Material", + new ItemData(Materials.Wood, 3628800L, Materials.Iron, OrePrefixes.screw.mMaterialAmount), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 2L))); + + ItemList.ThermosCan_Empty.set( + addItem( + Thermos_Can_Empty.ID, + "Empty Thermos Can", + "Keeping hot things hot and cold things cold", + new ItemData( + Materials.Aluminium, + OrePrefixes.plateDouble.mMaterialAmount * 1L + 2L * OrePrefixes.ring.mMaterialAmount), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L))); + + ItemList.Large_Fluid_Cell_Steel.set( + addItem( + Large_Fluid_Cell_Steel.ID, + "Large Steel Fluid Cell", + "", + new ItemData( + Materials.Steel, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.Bronze, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 4L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + + ItemList.Large_Fluid_Cell_TungstenSteel.set( + addItem( + Large_Fluid_Cell_TungstenSteel.ID, + "Large Tungstensteel Fluid Cell", + "", + new ItemData( + Materials.TungstenSteel, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.Platinum, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 9L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 7L))); + + ItemList.Large_Fluid_Cell_Aluminium.set( + addItem( + Large_Fluid_Cell_Aluminium.ID, + "Large Aluminium Fluid Cell", + "", + new ItemData( + Materials.Aluminium, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.Silver, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 5L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 3L))); + + ItemList.Large_Fluid_Cell_StainlessSteel.set( + addItem( + Large_Fluid_Cell_StainlessSteel.ID, + "Large Stainless Steel Fluid Cell", + "", + new ItemData( + Materials.StainlessSteel, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.Electrum, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 6L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))); + + ItemList.Large_Fluid_Cell_Titanium.set( + addItem( + Large_Fluid_Cell_Titanium.ID, + "Large Titanium Fluid Cell", + "", + new ItemData( + Materials.Titanium, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.RoseGold, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 7L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 5L))); + + ItemList.Large_Fluid_Cell_Chrome.set( + addItem( + Large_Fluid_Cell_Chrome.ID, + "Large Chrome Fluid Cell", + "", + new ItemData( + Materials.Chrome, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.Palladium, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 8L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 6L))); + + ItemList.Large_Fluid_Cell_Iridium.set( + addItem( + Large_Fluid_Cell_Iridium.ID, + "Large Iridium Fluid Cell", + "", + new ItemData( + Materials.Iridium, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.Naquadah, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 10L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 8L))); + + ItemList.Large_Fluid_Cell_Osmium.set( + addItem( + Large_Fluid_Cell_Osmium.ID, + "Large Osmium Fluid Cell", + "", + new ItemData( + Materials.Osmium, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.ElectrumFlux, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 11L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 9L))); + + ItemList.Large_Fluid_Cell_Neutronium.set( + addItem( + Large_Fluid_Cell_Neutronium.ID, + "Large Neutronium Fluid Cell", + "", + new ItemData( + Materials.Neutronium, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + new MaterialStack(Materials.Draconium, OrePrefixes.ring.mMaterialAmount * 4L)), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 12L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 10L))); + + for (byte i = 0; i < 16; i = (byte) (i + 1)) { + ItemList.SPRAY_CAN_DYES[i].set( + addItem( + Spray_Colors[i], + "Spray Can (" + Dyes.get(i).mName + ")", + "Full", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 4L))); + ItemList.SPRAY_CAN_DYES_USED[i].set( + addItem( + Spray_Colors_Used[i], + "Spray Can (" + Dyes.get(i).mName + ")", + "Used", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 3L), + SubTag.INVISIBLE)); + } + + ItemList.Spray_Color_Remover.set( + addItem( + Spray_Color_Remover.ID, + "Spray Can Solvent", + "Full", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 4L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 8L))); + ItemList.Spray_Color_Used_Remover.set( + addItem( + Spray_Color_Used_Remover.ID, + "Spray Can Solvent", + "Used", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 3L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 6L), + SubTag.INVISIBLE)); + + ItemList.Spray_Color_Remover_Empty.set( + addItem( + Spray_Color_Remover_Empty.ID, + "Empty Spray Can Solvent Cannister", + "Used for making Spray Can Solvent", + new ItemData( + Materials.Aluminium, + OrePrefixes.plateDouble.mMaterialAmount * 4L, + Materials.Redstone, + OrePrefixes.dust.mMaterialAmount), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + + ItemList.Tool_Matches.set( + addItem( + Tool_Matches.ID, + "Match", + "", + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L))); + + ItemList.Tool_MatchBox_Used.set( + addItem( + Tool_MatchBox_Used.ID, + "Match Box", + "This is not a Car", + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L), + SubTag.INVISIBLE)); + + ItemList.Tool_MatchBox_Full.set( + addItem( + Tool_MatchBox_Full.ID, + "Match Box (Full)", + "This is not a Car", + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + ItemList.Tool_Lighter_Invar_Empty.set( + addItem( + Tool_Lighter_Invar_Empty.ID, + "Lighter (Empty)", + "", + new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L))); + ItemList.Tool_Lighter_Invar_Used.set( + addItem( + Tool_Lighter_Invar_Used.ID, + "Lighter", + "", + new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L), + SubTag.INVISIBLE)); + ItemList.Tool_Lighter_Invar_Full.set( + addItem( + Tool_Lighter_Invar_Full.ID, + "Lighter (Full)", + "", + new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + ItemList.Tool_Lighter_Platinum_Empty.set( + addItem( + Tool_Lighter_Platinum_Empty.ID, + "Platinum Lighter (Empty)", + "A known Prank Master is engraved on it", + new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L))); + ItemList.Tool_Lighter_Platinum_Used.set( + addItem( + Tool_Lighter_Platinum_Used.ID, + "Platinum Lighter", + "A known Prank Master is engraved on it", + new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2L), + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L), + SubTag.INVISIBLE)); + ItemList.Tool_Lighter_Platinum_Full.set( + addItem( + Tool_Lighter_Platinum_Full.ID, + "Platinum Lighter (Full)", + "A known Prank Master is engraved on it", + new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + ItemList.Ingot_Heavy1 + .set(addItem(Ingot_Heavy1.ID, "Heavy Duty Alloy Ingot T1", "Used to make Heavy Duty Plates T1")); + ItemList.Ingot_Heavy2 + .set(addItem(Ingot_Heavy2.ID, "Heavy Duty Alloy Ingot T2", "Used to make Heavy Duty Plates T2")); + ItemList.Ingot_Heavy3 + .set(addItem(Ingot_Heavy3.ID, "Heavy Duty Alloy Ingot T3", "Used to make Heavy Duty Plates T3")); + + ItemList.Ingot_IridiumAlloy.set( + addItem( + Ingot_Iridium_Alloy.ID, + "Iridium Alloy Ingot", + "Used to make Iridium Plates", + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L))); + + ItemList.Paper_Printed_Pages.set( + addItem( + Paper_Printed_Pages.ID, + "Printed Pages", + "Used to make written Books", + new ItemData(Materials.Paper, 10886400L), + new BehaviourPrintedPages(), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L))); + ItemList.Paper_Magic_Empty.set( + addItem( + Paper_Magic_Empty.ID, + "Magic Paper", + "", + SubTag.INVISIBLE, + new ItemData(Materials.Paper, 3628800L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1L))); + ItemList.Paper_Magic_Page.set( + addItem( + Paper_Magic_Page.ID, + "Enchanted Page", + "", + SubTag.INVISIBLE, + new ItemData(Materials.Paper, 3628800L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 2L))); + ItemList.Paper_Magic_Pages.set( + addItem( + Paper_Magic_Pages.ID, + "Enchanted Pages", + "", + SubTag.INVISIBLE, + new ItemData(Materials.Paper, 10886400L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L), + new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 4L))); + ItemList.Paper_Punch_Card_Empty.set( + addItem( + Paper_Punch_Card_Empty.ID, + "Punch Card", + "", + SubTag.INVISIBLE, + new ItemData(Materials.Paper, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L))); + ItemList.Paper_Punch_Card_Encoded.set( + addItem( + Paper_Punch_Card_Encoded.ID, + "Punched Card", + "", + SubTag.INVISIBLE, + new ItemData(Materials.Paper, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L))); + ItemList.Book_Written_01.set( + addItem( + Book_Written_01.ID, + "Book", + "", + new ItemData(Materials.Paper, 10886400L), + "bookWritten", + OreDictNames.craftingBook, + new BehaviourWrittenBook(), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L))); + ItemList.Book_Written_02.set( + addItem( + Book_Written_02.ID, + "Book", + "", + new ItemData(Materials.Paper, 10886400L), + "bookWritten", + OreDictNames.craftingBook, + new BehaviourWrittenBook(), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L))); + ItemList.Book_Written_03.set( + addItem( + Book_Written_03.ID, + "Book", + "", + new ItemData(Materials.Paper, 10886400L), + "bookWritten", + OreDictNames.craftingBook, + new BehaviourWrittenBook(), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L))); + + ItemList.Schematic.set( + addItem( + Schematic.ID, + "Schematic", + "EMPTY", + new ItemData(Materials.Steel, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 1L))); + ItemList.Schematic_Crafting.set( + addItem( + Schematic_Crafting.ID, + "Schematic (Crafting)", + "Crafts the Programmed Recipe", + new ItemData(Materials.Steel, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 1L))); + ItemList.Schematic_1by1.set( + addItem( + Schematic_1by1.ID, + "Schematic (1x1)", + "Crafts 1 Items as 1x1 (use in Packager)", + new ItemData(Materials.Steel, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 1L))); + ItemList.Schematic_2by2.set( + addItem( + Schematic_2by2.ID, + "Schematic (2x2)", + "Crafts 4 Items as 2x2 (use in Packager)", + new ItemData(Materials.Steel, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 1L))); + ItemList.Schematic_3by3.set( + addItem( + Schematic_3by3.ID, + "Schematic (3x3)", + "Crafts 9 Items as 3x3 (use in Packager)", + new ItemData(Materials.Steel, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 1L))); + ItemList.Schematic_Dust.set( + addItem( + Schematic_Dust.ID, + "Schematic (Dusts)", + "Combines Dusts (use in Packager)", + new ItemData(Materials.Steel, 7257600L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 1L))); + + ItemList.Battery_Hull_LV.set( + addItem( + Battery_Hull_LV.ID, + "Small Battery Hull", + "An empty LV Battery Hull", + new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 1L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L))); + ItemList.Battery_Hull_MV.set( + addItem( + Battery_Hull_MV.ID, + "Medium Battery Hull", + "An empty MV Battery Hull", + new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 3L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L))); + ItemList.Battery_Hull_HV.set( + addItem( + Battery_Hull_HV.ID, + "Large Battery Hull", + "An empty HV Battery Hull", + new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 9L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L))); + + // ULV Batteries + ItemList.Battery_RE_ULV_Tantalum.set( + addItem( + Battery_RE_ULV_Tantalum.ID, + "Tantalum Capacitor", + "Reusable", + "batteryULV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L))); + + // LV Batteries + ItemList.Battery_SU_LV_SulfuricAcid.set( + addItem( + Battery_SU_LV_Sulfuric_Acid.ID, + "Small Acid Battery", + "Single Use", + "batteryLV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + ItemList.Battery_SU_LV_Mercury.set( + addItem( + Battery_SU_LV_Mercury.ID, + "Small Mercury Battery", + "Single Use", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + ItemList.Battery_RE_LV_Cadmium.set( + addItem( + Battery_RE_LV_Cadmium.ID, + "Small Cadmium Battery", + "Reusable", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L), + "batteryLV")); + + ItemList.Battery_RE_LV_Lithium.set( + addItem( + Battery_RE_LV_Lithium.ID, + "Small Lithium Battery", + "Reusable", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L), + "batteryLV")); + + ItemList.Battery_RE_LV_Sodium.set( + addItem( + Battery_RE_LV_Sodium.ID, + "Small Sodium Battery", + "Reusable", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L), + "batteryLV")); + + // MV Batteries + ItemList.Battery_SU_MV_SulfuricAcid.set( + addItem( + Battery_SU_MV_Sulfuric_Acid.ID, + "Medium Acid Battery", + "Single Use", + "batteryMV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 4L))); + + ItemList.Battery_SU_MV_Mercury.set( + addItem( + Battery_SU_MV_Mercury.ID, + "Medium Mercury Battery", + "Single Use", + "batteryMV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 4L))); + + ItemList.Battery_RE_MV_Cadmium.set( + addItem( + Battery_RE_MV_Cadmium.ID, + "Medium Cadmium Battery", + "Reusable", + "batteryMV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + ItemList.Battery_RE_MV_Lithium.set( + addItem( + Battery_RE_MV_Lithium.ID, + "Medium Lithium Battery", + "Reusable", + "batteryMV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + ItemList.Battery_RE_MV_Sodium.set( + addItem( + Battery_RE_MV_Sodium.ID, + "Medium Sodium Battery", + "Reusable", + "batteryMV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + + // HV Batteries + ItemList.Battery_SU_HV_SulfuricAcid.set( + addItem( + Battery_SU_HV_Sulfuric_Acid.ID, + "Large Acid Battery", + "Single Use", + "batteryHV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 8L))); + + ItemList.Battery_SU_HV_Mercury.set( + addItem( + Battery_SU_HV_Mercury.ID, + "Large Mercury Battery", + "Single Use", + "batteryHV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 8L))); + + ItemList.Battery_RE_HV_Cadmium.set( + addItem( + Battery_RE_HV_Cadmium.ID, + "Large Cadmium Battery", + "Reusable", + "batteryHV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 4L))); + + ItemList.Battery_RE_HV_Lithium.set( + addItem( + Battery_RE_HV_Lithium.ID, + "Large Lithium Battery", + "Reusable", + "batteryHV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 4L))); + + ItemList.Battery_RE_HV_Sodium.set( + addItem( + Battery_RE_HV_Sodium.ID, + "Large Sodium Battery", + "Reusable", + "batteryHV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 4L))); + + // IV Battery + ItemList.Energy_LapotronicOrb.set( + addItem( + Energy_Lapotronic_Orb.ID, + "Lapotronic Energy Orb", + "Reusable battery", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 16L), + OrePrefixes.battery.get(Materials.IV))); + + // ZPM Module + ItemList.ZPM.set( + addItem( + IDMetaItem01.ZPM.ID, + "Zero Point Module", + "Single use battery", + "batteryZPM", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L))); + + // LuV Lapotron orb cluster battery + ItemList.Energy_LapotronicOrb2.set( + addItem( + Energy_Lapotronic_orb_2.ID, + "Lapotronic Energy Orb Cluster", + "Reusable battery", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 16L), + OrePrefixes.battery.get(Materials.LuV))); + + // UV Battery + ItemList.ZPM2.set( + addItem( + ZPM2.ID, + "Ultimate Battery", + "Fill this to win minecraft", + "batteryUV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L))); + + // UMV Battery + ItemList.ZPM3.set( + addItem( + ZPM3.ID, + "Really Ultimate Battery", + "Fill this to be way older", + "batteryUMV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L))); + + // UXV Battery + ItemList.ZPM4.set( + addItem( + ZPM4.ID, + "Extremely Ultimate Battery", + "Fill this to be older", + "batteryUXV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L))); + + // MAX Battery + ItemList.ZPM5.set( + addItem( + ZPM5.ID, + "Insanely Ultimate Battery", + "Fill this for fun", + "batteryMAX", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L))); + + // ERROR Battery + ItemList.ZPM6.set( + addItem( + ZPM6.ID, + "Mega Ultimate Battery", + "Fill the capacitor to reach enlightenment", + "batteryERV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L))); + + // ZPM Cluster + ItemList.Energy_Module.set( + addItem( + Energy_Module.ID, + "Energy Module", + "Reusable battery", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 16L), + OrePrefixes.battery.get(Materials.ZPM))); + + // UV Cluster + ItemList.Energy_Cluster.set( + addItem( + Energy_Cluster.ID, + "Energy Cluster", + "Reusable battery", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L), + OrePrefixes.battery.get(Materials.UV))); + + // UIV, UMV, UXV and MAX component textures backported from gregicality. + ItemList.Electric_Motor_LV.set( + addItem( + Electric_Motor_LV.ID, + "Electric Motor (LV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + ItemList.Electric_Motor_MV.set( + addItem( + Electric_Motor_MV.ID, + "Electric Motor (MV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2L))); + ItemList.Electric_Motor_HV.set( + addItem( + Electric_Motor_HV.ID, + "Electric Motor (HV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 4L))); + ItemList.Electric_Motor_EV.set( + addItem( + Electric_Motor_EV.ID, + "Electric Motor (EV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 8L))); + ItemList.Electric_Motor_IV.set( + addItem( + Electric_Motor_IV.ID, + "Electric Motor (IV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 16L))); + ItemList.Electric_Motor_LuV.set( + addItem( + Electric_Motor_LuV.ID, + "Electric Motor (LuV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 32L))); + ItemList.Electric_Motor_ZPM.set( + addItem( + Electric_Motor_ZPM.ID, + "Electric Motor (ZPM)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 64L))); + ItemList.Electric_Motor_UV.set( + addItem( + Electric_Motor_UV.ID, + "Electric Motor (UV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 128L))); + ItemList.Electric_Motor_UHV.set( + addItem( + Electric_Motor_UHV.ID, + "Electric Motor (UHV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 256L))); + ItemList.Electric_Motor_UEV.set( + addItem( + Electric_Motor_UEV.ID, + "Electric Motor (UEV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Motor_UIV.set( + addItem( + Electric_Motor_UIV.ID, + "Electric Motor (UIV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Motor_UMV.set( + addItem( + Electric_Motor_UMV.ID, + "Electric Motor (UMV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Motor_UXV.set( + addItem( + Electric_Motor_UXV.ID, + "Electric Motor (UXV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Motor_MAX.set( + addItem( + Electric_Motor_MAX.ID, + "Electric Motor (MAX)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.IronMagnetic), 'R', + OrePrefixes.stick.get(Materials.AnyIron), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', + OrePrefixes.stick.get(Materials.Steel), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', + OrePrefixes.stick.get(Materials.Aluminium), 'W', OrePrefixes.wireGt02.get(Materials.Cupronickel), 'C', + OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', + OrePrefixes.stick.get(Materials.StainlessSteel), 'W', OrePrefixes.wireGt04.get(Materials.Electrum), 'C', + OrePrefixes.cableGt02.get(Materials.Silver) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', + OrePrefixes.stick.get(Materials.Titanium), 'W', OrePrefixes.wireGt04.get(Materials.BlackSteel), 'C', + OrePrefixes.cableGt02.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', + OrePrefixes.stick.get(Materials.TungstenSteel), 'W', OrePrefixes.wireGt04.get(Materials.Graphene), 'C', + OrePrefixes.cableGt02.get(Materials.Tungsten) }); + + ItemList.ElectronicsLump.set( + addItem( + 414, + "Lump of Electronics", + "How did they even produce this?", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + + ItemList.Tesseract.set( + addItem( + Tesseract.ID, + "Raw Tesseract", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + ItemList.GigaChad.set( + addItem( + GigaChad.ID, + "Giga Chad Token", + "You are worthy", + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1000L))); + ItemList.EnergisedTesseract.set( + addItem( + EnergisedTesseract.ID, + "Energised Tesseract", + "Higher dimensional engineering", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 10L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + + ItemList.Electric_Piston_LV.set( + addItem( + Electric_Piston_LV.ID, + "Electric Piston (LV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + ItemList.Electric_Piston_MV.set( + addItem( + Electric_Piston_MV.ID, + "Electric Piston (MV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2L))); + ItemList.Electric_Piston_HV.set( + addItem( + Electric_Piston_HV.ID, + "Electric Piston (HV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 4L))); + ItemList.Electric_Piston_EV.set( + addItem( + Electric_Piston_EV.ID, + "Electric Piston (EV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 8L))); + ItemList.Electric_Piston_IV.set( + addItem( + Electric_Piston_IV.ID, + "Electric Piston (IV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 16L))); + ItemList.Electric_Piston_LuV.set( + addItem( + Electric_Piston_LuV.ID, + "Electric Piston (LuV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 32L))); + ItemList.Electric_Piston_ZPM.set( + addItem( + Electric_Piston_ZPM.ID, + "Electric Piston (ZPM)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 64L))); + ItemList.Electric_Piston_UV.set( + addItem( + Electric_Piston_UV.ID, + "Electric Piston (UV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 128L))); + ItemList.Electric_Piston_UHV.set( + addItem( + Electric_Piston_UHV.ID, + "Electric Piston (UHV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 256L))); + ItemList.Electric_Piston_UEV.set( + addItem( + Electric_Piston_UEV.ID, + "Electric Piston (UEV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Piston_UIV.set( + addItem( + Electric_Piston_UIV.ID, + "Electric Piston (UIV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Piston_UMV.set( + addItem( + Electric_Piston_UMV.ID, + "Electric Piston (UMV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Piston_UXV.set( + addItem( + Electric_Piston_UXV.ID, + "Electric Piston (UXV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + ItemList.Electric_Piston_MAX.set( + addItem( + Electric_Piston_MAX.ID, + "Electric Piston (MAX)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L))); + + ItemList.Electric_Pump_LV.set( + addItem( + Electric_Pump_LV.ID, + "Electric Pump (LV)", + GTUtility.formatNumbers(32) + PartCoverText + GTUtility.formatNumbers(32 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L))); + ItemList.Electric_Pump_MV.set( + addItem( + Electric_Pump_MV.ID, + "Electric Pump (MV)", + GTUtility.formatNumbers(128) + PartCoverText + GTUtility.formatNumbers(128 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + ItemList.Electric_Pump_HV.set( + addItem( + Electric_Pump_HV.ID, + "Electric Pump (HV)", + GTUtility.formatNumbers(512) + PartCoverText + GTUtility.formatNumbers(512 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 4L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))); + ItemList.Electric_Pump_EV.set( + addItem( + Electric_Pump_EV.ID, + "Electric Pump (EV)", + GTUtility.formatNumbers(2048) + PartCoverText + GTUtility.formatNumbers(2048 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 8L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 8L))); + ItemList.Electric_Pump_IV.set( + addItem( + Electric_Pump_IV.ID, + "Electric Pump (IV)", + GTUtility.formatNumbers(8192) + PartCoverText + GTUtility.formatNumbers(8192 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 16L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 16L))); + ItemList.Electric_Pump_LuV.set( + addItem( + Electric_Pump_LuV.ID, + "Electric Pump (LuV)", + GTUtility.formatNumbers(32768) + PartCoverText + GTUtility.formatNumbers(32768 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 32L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 32L))); + ItemList.Electric_Pump_ZPM.set( + addItem( + Electric_Pump_ZPM.ID, + "Electric Pump (ZPM)", + GTUtility.formatNumbers(131072) + PartCoverText + GTUtility.formatNumbers(131072 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 64L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 64L))); + ItemList.Electric_Pump_UV.set( + addItem( + Electric_Pump_UV.ID, + "Electric Pump (UV)", + GTUtility.formatNumbers(524288) + PartCoverText + GTUtility.formatNumbers(524288 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 128L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 128L))); + ItemList.Electric_Pump_UHV.set( + addItem( + Electric_Pump_UHV.ID, + "Electric Pump (UHV)", + GTUtility.formatNumbers(1048576) + PartCoverText + + GTUtility.formatNumbers(1048576 * 20) + + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 256L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 256L))); + ItemList.Electric_Pump_UEV.set( + addItem( + Electric_Pump_UEV.ID, + "Electric Pump (UEV)", + GTUtility.formatNumbers(2097152) + PartCoverText + + GTUtility.formatNumbers(2097152 * 20) + + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 512L))); + ItemList.Electric_Pump_UIV.set( + addItem( + Electric_Pump_UIV.ID, + "Electric Pump (UIV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 512L))); + ItemList.Electric_Pump_UMV.set( + addItem( + Electric_Pump_UMV.ID, + "Electric Pump (UMV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 512L))); + ItemList.Electric_Pump_UXV.set( + addItem( + Electric_Pump_UXV.ID, + "Electric Pump (UXV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 512L))); + ItemList.Electric_Pump_MAX.set( + addItem( + Electric_Pump_MAX.ID, + "Electric Pump (MAX)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 512L))); + + ItemList.Steam_Valve_LV.set( + addItem( + Steam_Valve_LV.ID, + "Steam Valve (LV)", + GTUtility.formatNumbers(1024) + PartCoverText + GTUtility.formatNumbers(1024 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L))); + ItemList.Steam_Valve_MV.set( + addItem( + Steam_Valve_MV.ID, + "Steam Valve (MV)", + GTUtility.formatNumbers(2048) + PartCoverText + GTUtility.formatNumbers(2048 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + ItemList.Steam_Valve_HV.set( + addItem( + Steam_Valve_HV.ID, + "Steam Valve (HV)", + GTUtility.formatNumbers(4096) + PartCoverText + GTUtility.formatNumbers(4096 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 4L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))); + ItemList.Steam_Valve_EV.set( + addItem( + Steam_Valve_EV.ID, + "Steam Valve (EV)", + GTUtility.formatNumbers(8192) + PartCoverText + GTUtility.formatNumbers(8192 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 8L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 8L))); + ItemList.Steam_Valve_IV.set( + addItem( + Steam_Valve_IV.ID, + "Steam Valve (IV)", + GTUtility.formatNumbers(16384) + PartCoverText + GTUtility.formatNumbers(16384 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 16L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 16L))); + + ItemList.FluidRegulator_LV.set( + addItem(FluidRegulator_LV.ID, "Fluid Regulator (LV)", FRText1 + GTUtility.formatNumbers(640) + FRText2)); + ItemList.FluidRegulator_MV.set( + addItem(FluidRegulator_MV.ID, "Fluid Regulator (MV)", FRText1 + GTUtility.formatNumbers(2560) + FRText2)); + ItemList.FluidRegulator_HV.set( + addItem(FluidRegulator_HV.ID, "Fluid Regulator (HV)", FRText1 + GTUtility.formatNumbers(10240) + FRText2)); + ItemList.FluidRegulator_EV.set( + addItem(FluidRegulator_EV.ID, "Fluid Regulator (EV)", FRText1 + GTUtility.formatNumbers(40960) + FRText2)); + ItemList.FluidRegulator_IV.set( + addItem(FluidRegulator_IV.ID, "Fluid Regulator (IV)", FRText1 + GTUtility.formatNumbers(163840) + FRText2)); + ItemList.FluidRegulator_LuV.set( + addItem( + FluidRegulator_LuV.ID, + "Fluid Regulator (LuV)", + FRText1 + GTUtility.formatNumbers(655360) + FRText2)); + ItemList.FluidRegulator_ZPM.set( + addItem( + FluidRegulator_ZPM.ID, + "Fluid Regulator (ZPM)", + FRText1 + GTUtility.formatNumbers(2621440) + FRText2)); + ItemList.FluidRegulator_UV.set( + addItem( + FluidRegulator_UV.ID, + "Fluid Regulator (UV)", + FRText1 + GTUtility.formatNumbers(10485760) + FRText2)); + + ItemList.FluidFilter.set( + addItem(FluidFilter.ID, "Fluid Filter Cover", "Set with Fluid Container to only accept one Fluid Type")); + + ItemList.ItemFilter_Export.set( + addItem( + ItemFilter_Export.ID, + "Filtered Conveyor Cover (Export)", + "Right click with an item to set filter (Only supports Export Mode)")); + + ItemList.ItemFilter_Import.set( + addItem( + ItemFilter_Import.ID, + "Filtered Conveyor Cover (Import)", + "Right click with an item to set filter (Only supports Import Mode)")); + + ItemList.Cover_FluidLimiter + .set(addItem(Cover_FluidLimiter.ID, "Fluid Limiter Cover", "Limits fluid input depending on fill level")); + + ItemList.Conveyor_Module_LV.set( + addItem( + Conveyor_Module_LV.ID, + "Conveyor Module (LV)", + "1 stack every 20 secs (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L))); + ItemList.Conveyor_Module_MV.set( + addItem( + Conveyor_Module_MV.ID, + "Conveyor Module (MV)", + "1 stack every 5 secs (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 2L))); + ItemList.Conveyor_Module_HV.set( + addItem( + Conveyor_Module_HV.ID, + "Conveyor Module (HV)", + "1 stack every 1 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 4L))); + ItemList.Conveyor_Module_EV.set( + addItem( + Conveyor_Module_EV.ID, + "Conveyor Module (EV)", + "1 stack every 1/5 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 8L))); + ItemList.Conveyor_Module_IV.set( + addItem( + Conveyor_Module_IV.ID, + "Conveyor Module (IV)", + "1 stack every 1/20 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 16L))); + ItemList.Conveyor_Module_LuV.set( + addItem( + Conveyor_Module_LuV.ID, + "Conveyor Module (LuV)", + "2 stacks every 1/20 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 32L))); + ItemList.Conveyor_Module_ZPM.set( + addItem( + Conveyor_Module_ZPM.ID, + "Conveyor Module (ZPM)", + "4 stacks every 1/20 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 64L))); + ItemList.Conveyor_Module_UV.set( + addItem( + Conveyor_Module_UV.ID, + "Conveyor Module (UV)", + "8 stacks every 1/20 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 128L))); + ItemList.Conveyor_Module_UHV.set( + addItem( + Conveyor_Module_UHV.ID, + "Conveyor Module (UHV)", + "16 stacks every 1/20 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 256L))); + ItemList.Conveyor_Module_UEV.set( + addItem( + Conveyor_Module_UEV.ID, + "Conveyor Module (UEV)", + "32 stacks every 1/20 sec (as Cover)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L))); + ItemList.Conveyor_Module_UIV.set( + addItem( + Conveyor_Module_UIV.ID, + "Conveyor Module (UIV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L))); + ItemList.Conveyor_Module_UMV.set( + addItem( + Conveyor_Module_UMV.ID, + "Conveyor Module (UMV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L))); + ItemList.Conveyor_Module_UXV.set( + addItem( + Conveyor_Module_UXV.ID, + "Conveyor Module (UXV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L))); + ItemList.Conveyor_Module_MAX.set( + addItem( + Conveyor_Module_MAX.ID, + "Conveyor Module (MAX)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 512L))); + + ItemList.Robot_Arm_LV.set( + addItem( + Robot_Arm_LV.ID, + "Robot Arm (LV)", + "1 stack every 20 secs (as Cover)/n " + RAText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L))); + ItemList.Robot_Arm_MV.set( + addItem( + Robot_Arm_MV.ID, + "Robot Arm (MV)", + "1 stack every 5 secs (as Cover)/n " + RAText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L))); + ItemList.Robot_Arm_HV.set( + addItem( + Robot_Arm_HV.ID, + "Robot Arm (HV)", + "1 stack every 1 sec (as Cover)/n " + RAText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 4L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 4L))); + ItemList.Robot_Arm_EV.set( + addItem( + Robot_Arm_EV.ID, + "Robot Arm (EV)", + "1 stack every 1/5 sec (as Cover)/n " + RAText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 8L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 8L))); + ItemList.Robot_Arm_IV.set( + addItem( + Robot_Arm_IV.ID, + "Robot Arm (IV)", + "1 stack every 1/20 sec (as Cover)/n " + RAText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 16L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 16L))); + ItemList.Robot_Arm_LuV.set( + addItem( + Robot_Arm_LuV.ID, + "Robot Arm (LuV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 32L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 32L))); + ItemList.Robot_Arm_ZPM.set( + addItem( + Robot_Arm_ZPM.ID, + "Robot Arm (ZPM)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 64L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 64L))); + ItemList.Robot_Arm_UV.set( + addItem( + Robot_Arm_UV.ID, + "Robot Arm (UV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 128L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 128L))); + ItemList.Robot_Arm_UHV.set( + addItem( + Robot_Arm_UHV.ID, + "Robot Arm (UHV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 256L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 256L))); + ItemList.Robot_Arm_UEV.set( + addItem( + Robot_Arm_UEV.ID, + "Robot Arm (UEV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 512L))); + ItemList.Robot_Arm_UIV.set( + addItem( + Robot_Arm_UIV.ID, + "Robot Arm (UIV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 512L))); + ItemList.Robot_Arm_UMV.set( + addItem( + Robot_Arm_UMV.ID, + "Robot Arm (UMV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 512L))); + ItemList.Robot_Arm_UXV.set( + addItem( + Robot_Arm_UXV.ID, + "Robot Arm (UXV)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 512L))); + ItemList.Robot_Arm_MAX.set( + addItem( + Robot_Arm_MAX.ID, + "Robot Arm (MAX)", + PartNotCoverText, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 512L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 512L))); + + ItemList.QuantumEye.set(addItem(QuantumEye.ID, "Quantum Eye", "Improved Ender Eye")); + ItemList.QuantumStar.set(addItem(QuantumStar.ID, "Quantum Star", "Improved Nether Star")); + ItemList.Gravistar.set(addItem(Gravistar.ID, "Gravi Star", "Ultimate Nether Star")); + + ItemList.Emitter_LV.set( + addItem( + Emitter_LV.ID, + "Emitter (LV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 1L))); + ItemList.Emitter_MV.set( + addItem( + Emitter_MV.ID, + "Emitter (MV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 2L))); + ItemList.Emitter_HV.set( + addItem( + Emitter_HV.ID, + "Emitter (HV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 4L))); + ItemList.Emitter_EV.set( + addItem( + Emitter_EV.ID, + "Emitter (EV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 8L))); + ItemList.Emitter_IV.set( + addItem( + Emitter_IV.ID, + "Emitter (IV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 16L))); + ItemList.Emitter_LuV.set( + addItem( + Emitter_LuV.ID, + "Emitter (LuV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 32L))); + ItemList.Emitter_ZPM.set( + addItem( + Emitter_ZPM.ID, + "Emitter (ZPM)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 64L))); + ItemList.Emitter_UV.set( + addItem( + Emitter_UV.ID, + "Emitter (UV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 128L))); + ItemList.Emitter_UHV.set( + addItem( + Emitter_UHV.ID, + "Emitter (UHV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 256L))); + ItemList.Emitter_UEV.set( + addItem( + Emitter_UEV.ID, + "Emitter (UEV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 512L))); + ItemList.Emitter_UIV.set( + addItem( + Emitter_UIV.ID, + "Emitter (UIV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 512L))); + ItemList.Emitter_UMV.set( + addItem( + Emitter_UMV.ID, + "Emitter (UMV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 512L))); + ItemList.Emitter_UXV.set( + addItem( + Emitter_UXV.ID, + "Emitter (UXV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 512L))); + ItemList.Emitter_MAX.set( + addItem( + Emitter_MAX.ID, + "Emitter (MAX)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 512L))); + + ItemList.Sensor_LV.set( + addItem( + Sensor_LV.ID, + "Sensor (LV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1L))); + + ItemList.Sensor_MV.set( + addItem( + Sensor_MV.ID, + "Sensor (MV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L))); + ItemList.Sensor_HV.set( + addItem( + Sensor_HV.ID, + "Sensor (HV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 4L))); + ItemList.Sensor_EV.set( + addItem( + Sensor_EV.ID, + "Sensor (EV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 8L))); + ItemList.Sensor_IV.set( + addItem( + Sensor_IV.ID, + "Sensor (IV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 16L))); + ItemList.Sensor_LuV.set( + addItem( + Sensor_LuV.ID, + "Sensor (LuV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 32L))); + ItemList.Sensor_ZPM.set( + addItem( + Sensor_ZPM.ID, + "Sensor (ZPM)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 64L))); + ItemList.Sensor_UV.set( + addItem( + Sensor_UV.ID, + "Sensor (UV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 128L))); + ItemList.Sensor_UHV.set( + addItem( + Sensor_UHV.ID, + "Sensor (UHV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 256L))); + ItemList.Sensor_UEV.set( + addItem( + Sensor_UEV.ID, + "Sensor (UEV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 512L))); + ItemList.Sensor_UIV.set( + addItem( + Sensor_UIV.ID, + "Sensor (UIV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 512L))); + ItemList.Sensor_UMV.set( + addItem( + Sensor_UMV.ID, + "Sensor (UMV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 512L))); + ItemList.Sensor_UXV.set( + addItem( + Sensor_UXV.ID, + "Sensor (UXV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 512L))); + ItemList.Sensor_MAX.set( + addItem( + Sensor_MAX.ID, + "Sensor (MAX)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 512L))); + + ItemList.Field_Generator_LV.set( + addItem( + Field_Generator_LV.ID, + "Field Generator (LV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1L))); + ItemList.Field_Generator_MV.set( + addItem( + Field_Generator_MV.ID, + "Field Generator (MV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 2L))); + ItemList.Field_Generator_HV.set( + addItem( + Field_Generator_HV.ID, + "Field Generator (HV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 4L))); + ItemList.Field_Generator_EV.set( + addItem( + Field_Generator_EV.ID, + "Field Generator (EV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 8L))); + ItemList.Field_Generator_IV.set( + addItem( + Field_Generator_IV.ID, + "Field Generator (IV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 16L))); + ItemList.Field_Generator_LuV.set( + addItem( + Field_Generator_LuV.ID, + "Field Generator (LuV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 32L))); + ItemList.Field_Generator_ZPM.set( + addItem( + Field_Generator_ZPM.ID, + "Field Generator (ZPM)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 64L))); + ItemList.Field_Generator_UV.set( + addItem( + Field_Generator_UV.ID, + "Field Generator (UV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 128L))); + ItemList.Field_Generator_UHV.set( + addItem( + Field_Generator_UHV.ID, + "Field Generator (UHV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 256L))); + ItemList.Field_Generator_UEV.set( + addItem( + Field_Generator_UEV.ID, + "Field Generator (UEV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 512L))); + ItemList.Field_Generator_UIV.set( + addItem( + Field_Generator_UIV.ID, + "Field Generator (UIV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 512L))); + ItemList.Field_Generator_UMV.set( + addItem( + Field_Generator_UMV.ID, + "Field Generator (UMV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 512L))); + ItemList.Field_Generator_UXV.set( + addItem( + Field_Generator_UXV.ID, + "Field Generator (UXV)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 512L))); + ItemList.Field_Generator_MAX.set( + addItem( + Field_Generator_MAX.ID, + "Field Generator (MAX)", + "", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1024L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 512L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 512L))); + + ItemList.StableAdhesive.set( + addItem( + StableAdhesive.ID, + "Hyper-Stable Self-Healing Adhesive", + "Complete and selective adhesion, even when torn or damaged", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 30L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 20L), + new TCAspects.TC_AspectStack(TCAspects.LIMUS, 10L), + new TCAspects.TC_AspectStack(TCAspects.VINCULUM, 5L))); + ItemList.SuperconductorComposite.set( + addItem( + SuperconductorComposite.ID, + "Superconductor Rare-Earth Composite", + "Zero resistance to electrical and quantum flow, regardless of temperature", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 50L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 25L), + new TCAspects.TC_AspectStack(TCAspects.TERRA, 15L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 10L))); + ItemList.NaquadriaSupersolid.set( + addItem( + NaquadriaSupersolid.ID, + "Black Body Naquadria Supersolid", + "Flows like a fluid and reflects nothing, perfect absorption and transfer", + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 100L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 60L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 40L), + new TCAspects.TC_AspectStack(TCAspects.RADIO, 20L), + new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 10L))); + + // Circuits ULV - LuV. + ItemList.Circuit_Primitive.set( + addItem( + Circuit_Primitive.ID, + "Vacuum Tube", + "A very simple Circuit", + OrePrefixes.circuit.get(Materials.ULV), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Basic.set( + addItem( + Circuit_Basic.ID, + "Integrated Logic Circuit", + "A Basic Circuit", + OrePrefixes.circuit.get(Materials.LV), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Good.set( + addItem( + Circuit_Good.ID, + "Good Electronic Circuit", + "A Good Circuit", + OrePrefixes.circuit.get(Materials.MV), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Advanced.set( + addItem( + Circuit_Advanced.ID, + "Processor Assembly", + "An Advanced Circuit", + OrePrefixes.circuit.get(Materials.HV), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Data.set( + addItem( + Circuit_Data.ID, + "Workstation", + "An Extreme Circuit", + OrePrefixes.circuit.get(Materials.EV), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Elite.set( + addItem( + Circuit_Elite.ID, + "Mainframe", + "An Elite Circuit", + OrePrefixes.circuit.get(Materials.IV), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Master.set( + addItem( + Circuit_Master.ID, + "Nanoprocessor Mainframe", + "A Master Circuit", + OrePrefixes.circuit.get(Materials.LuV), + SubTag.NO_UNIFICATION)); + + // Backwards compatibility. + ItemList.Circuit_Parts_Vacuum_Tube.set(ItemList.Circuit_Primitive.get(1)); + ItemList.Circuit_Computer.set(ItemList.Circuit_Advanced.get(1)); + + ItemList.Tool_DataOrb.set( + addItem( + Tool_DataOrb.ID, + "Data Orb", + "A High Capacity Data Storage", + SubTag.NO_UNIFICATION, + new BehaviourDataOrb())); + + ItemList.Tool_DataStick.set( + addItem( + Tool_DataStick.ID, + "Data Stick", + "A Low Capacity Data Storage", + SubTag.NO_UNIFICATION, + new BehaviourDataStick())); + + ItemList.Tool_Cover_Copy_Paste.set( + addItem( + Tool_Cover_Copy_Paste.ID, + "Cover Copy/Paste tool", + "Set Cover Massively.", + BehaviourCoverTool.INSTANCE, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 6L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 6L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 6L))); + + ItemList.Circuit_Board_Basic.set(addItem(Circuit_Board_Basic.ID, "Coated Circuit Board", "A Basic Board")); + ItemList.Circuit_Board_Coated.set(ItemList.Circuit_Board_Basic.get(1)); + ItemList.Circuit_Board_Advanced + .set(addItem(Circuit_Board_Advanced.ID, "Epoxy Circuit Board", "An Advanced Board")); + ItemList.Circuit_Board_Epoxy.set(ItemList.Circuit_Board_Advanced.get(1)); + ItemList.Circuit_Board_Elite + .set(addItem(Circuit_Board_Elite.ID, "Multilayer Fiber-Reinforced Circuit Board", "An Elite Board")); + ItemList.Circuit_Board_Multifiberglass.set(ItemList.Circuit_Board_Elite.get(1)); + ItemList.Circuit_Parts_Crystal_Chip_Elite + .set(addItem(Circuit_Parts_Crystal_Chip_Elite.ID, "Engraved Crystal Chip", "Needed for Circuits")); + ItemList.Circuit_Parts_Crystal_Chip_Master + .set(addItem(Circuit_Parts_Crystal_Chip_Master.ID, "Engraved Lapotron Chip", "Needed for Circuits")); + ItemList.Circuit_Parts_Crystal_Chip_Wetware + .set(addItem(Circuit_Parts_Crystal_Chip_Wetware.ID, "Living Crystal Chip", "Needed for Circuits")); + ItemList.Circuit_Parts_Advanced.set(addItem(Circuit_Parts_Advanced.ID, "Diode", "Basic Electronic Component")); + ItemList.Circuit_Parts_Diode.set(ItemList.Circuit_Parts_Advanced.get(1)); + ItemList.Circuit_Parts_Wiring_Basic + .set(addItem(Circuit_Parts_Wiring_Basic.ID, "Resistor", "Basic Electronic Component")); + ItemList.Circuit_Parts_Resistor.set(ItemList.Circuit_Parts_Wiring_Basic.get(1)); + ItemList.Circuit_Parts_Wiring_Advanced + .set(addItem(Circuit_Parts_Wiring_Advanced.ID, "Transistor", "Basic Electronic Component")); + ItemList.Circuit_Parts_Transistor.set(ItemList.Circuit_Parts_Wiring_Advanced.get(1)); + ItemList.Circuit_Parts_Wiring_Elite + .set(addItem(Circuit_Parts_Wiring_Elite.ID, "Capacitor", "Electronic Component")); + ItemList.Circuit_Parts_Capacitor.set(ItemList.Circuit_Parts_Wiring_Elite.get(1)); + ItemList.Empty_Board_Basic.set(addItem(Empty_Board_Basic.ID, "Phenolic Circuit Board", "A Good Board")); + ItemList.Circuit_Board_Phenolic.set(ItemList.Empty_Board_Basic.get(1)); + ItemList.Empty_Board_Elite + .set(addItem(Empty_Board_Elite.ID, "Fiber-Reinforced Circuit Board", "An Extreme Board")); + ItemList.Circuit_Board_Fiberglass.set(ItemList.Empty_Board_Elite.get(1)); + + ItemList.Component_Sawblade_Diamond.set( + addItem( + Component_Sawblade_Diamond.ID, + "Diamond Sawblade", + "", + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 2L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L), + OreDictNames.craftingDiamondBlade)); + ItemList.Component_Grinder_Diamond.set( + addItem( + Component_Grinder_Diamond.ID, + "Diamond Grinding Head", + "", + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 2L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 6L), + OreDictNames.craftingGrinder)); + ItemList.Component_Grinder_Tungsten.set( + addItem( + Component_Grinder_Tungsten.ID, + "Tungsten Grinding Head", + "", + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 2L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 6L), + OreDictNames.craftingGrinder)); + + ItemList.Upgrade_Muffler.set( + addItem( + Upgrade_Muffler.ID, + "Muffler Upgrade", + "Makes Machines silent", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2L))); + ItemList.Upgrade_Lock.set( + addItem( + Upgrade_Lock.ID, + "Lock Upgrade", + "Protects your Machines", + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 4L))); + + ItemList.Component_Filter.set( + addItem( + Component_Filter.ID, + "Item Filter", + "", + new ItemData(Materials.Zinc, OrePrefixes.foil.mMaterialAmount * 16L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L), + OreDictNames.craftingFilter)); + + ItemList.Cover_Controller.set( + addItem( + Cover_Controller.ID, + "Machine Controller Cover", + "Turns Machines ON/OFF", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + ItemList.Cover_ActivityDetector.set( + addItem( + Cover_ActivityDetector.ID, + "Activity Detector Cover", + "Gives out Activity as Redstone", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + ItemList.Cover_FluidDetector.set( + addItem( + Cover_FluidDetector.ID, + "Fluid Detector Cover", + "Gives out Fluid Amount as Redstone", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L))); + ItemList.Cover_ItemDetector.set( + addItem( + Cover_ItemDetector.ID, + "Item Detector Cover", + "Gives out Item Amount as Redstone", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1L))); + ItemList.Cover_EnergyDetector.set( + addItem( + Cover_EnergyDetector.ID, + "Energy Detector Cover", + "Gives out Energy Amount as Redstone", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L))); + ItemList.Cover_PlayerDetector.set( + addItem( + Cover_PlayerDetector.ID, + "Player Detector Cover", + "Gives out close Players as Redstone", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + ItemList.Cover_FluidStorageMonitor.set( + addItem( + Cover_FLuidStorageMonitor.ID, + "Fluid Storage Monitor Cover", + "Displays the fluid stored in the Tank", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L))); + ItemList.Cover_Chest_Basic.set( + addItem( + Cover_Chest_Basic.ID, + "Basic Item Holder", + "Hold a few item for use within machine GUI", + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2L))); + ItemList.Cover_Chest_Good.set( + addItem( + Cover_Chest_Good.ID, + "Good Item Holder", + "Hold a few item for use within machine GUI", + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2L))); + ItemList.Cover_Chest_Advanced.set( + addItem( + Cover_Chest_Advanced.ID, + "Advanced Item Holder", + "Hold a few item for use within machine GUI", + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2L))); + + ItemList.Cover_Screen.set( + addItem( + Cover_Screen.ID, + "Computer Monitor Cover", + "Displays Data and GUI", + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 2L), + new TCAspects.TC_AspectStack(TCAspects.LUX, 2L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L))); + ItemList.Cover_Crafting.set( + addItem( + Cover_Crafting.ID, + "Crafting Table Cover", + "Better than a wooden Workbench", + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 4L))); + ItemList.Cover_Drain.set( + addItem( + Cover_Drain.ID, + "Drain Module Cover", + "Absorbs Fluids and collects Rain", + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + + ItemList.Cover_Shutter.set( + addItem( + Cover_Shutter.ID, + "Shutter Module Cover", + "Blocks Inventory/Tank Side. Use together with Machine Controller.", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L))); + + ItemList.Cover_SolarPanel.set( + addItem( + Cover_SolarPanel.ID, + "Solar Panel", + "May the Sun be with you (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 1L))); + ItemList.Cover_SolarPanel_8V.set( + addItem( + Cover_SolarPanel_8V.ID, + "Solar Panel (8V)", + "8 Volt Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 2L))); + ItemList.Cover_SolarPanel_LV.set( + addItem( + Cover_SolarPanel_LV.ID, + "Solar Panel (LV)", + "Low Voltage Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 4L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 4L))); + ItemList.Cover_SolarPanel_MV.set( + addItem( + Cover_SolarPanel_MV.ID, + "Solar Panel (MV)", + "Medium Voltage Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 8L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 8L))); + ItemList.Cover_SolarPanel_HV.set( + addItem( + Cover_SolarPanel_HV.ID, + "Solar Panel (HV)", + "High Voltage Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 16L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 16L))); + ItemList.Cover_SolarPanel_EV.set( + addItem( + Cover_SolarPanel_EV.ID, + "Solar Panel (EV)", + "Extreme Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 32L))); + ItemList.Cover_SolarPanel_IV.set( + addItem( + Cover_SolarPanel_IV.ID, + "Solar Panel (IV)", + "Insane Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 64L))); + ItemList.Cover_SolarPanel_LuV.set( + addItem( + Cover_SolarPanel_LuV.ID, + "Solar Panel (LuV)", + "Ludicrous Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 64L))); + ItemList.Cover_SolarPanel_ZPM.set( + addItem( + Cover_SolarPanel_ZPM.ID, + "Solar Panel (ZPM)", + "ZPM Voltage Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 64L))); + ItemList.Cover_SolarPanel_UV.set( + addItem( + Cover_SolarPanel_UV.ID, + "Solar Panel (UV)", + "Ultimate Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 64L))); + + ItemList.Tool_Sonictron.set( + addItem( + Tool_Sonictron.ID, + "Sonictron", + "Bring your Music with you", + BehaviourSonictron.INSTANCE, + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 4L))); + ItemList.Tool_Cheat.set( + addItem( + Tool_Cheat.ID, + "Debug Scanner", + "Also an Infinite Energy Source", + BehaviourScanner.INSTANCE, + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 64L))); + ItemList.Tool_Scanner.set( + addItem( + Tool_Scanner.ID, + "Portable Scanner", + "Tricorder", + BehaviourScanner.INSTANCE, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 6L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 6L))); + + ItemList.NC_SensorKit.set(addItem(NC_SensorKit.ID, "GregTech Sensor Kit", "", new BehaviourSensorKit())); + ItemList.Duct_Tape.set( + addItem( + Duct_Tape.ID, + "BrainTech Aerospace Advanced Reinforced Duct Tape FAL-84", + "If you can't fix it with this, use more of it!", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + OreDictNames.craftingDuctTape)); + ItemList.McGuffium_239.set( + addItem( + McGuffium_239.ID, + "Mc Guffium 239", + "42% better than Phlebotnium", + new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 8L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 8L), + new TCAspects.TC_AspectStack(TCAspects.SPIRITUS, 8L), + new TCAspects.TC_AspectStack(TCAspects.AURAM, 8L), + new TCAspects.TC_AspectStack(TCAspects.VITIUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.RADIO, 8L), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 8L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 8L))); + + ItemList.Cover_RedstoneTransmitterExternal.set( + addItem( + Cover_RedstoneTransmitterExternal.ID, + "Redstone Transmitter (External)", + "Transfers Redstone signals wireless", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + ItemList.Cover_RedstoneTransmitterInternal.set( + addItem( + Cover_RedstoneTransmitterInternal.ID, + "Redstone Transmitter (Internal)", + "Transfers Redstone signals wireless", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + ItemList.Cover_RedstoneReceiverExternal.set( + addItem( + Cover_RedstoneReceiverExternal.ID, + "Redstone Receiver (External)", + "Transfers Redstone signals wireless", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + ItemList.Cover_RedstoneReceiverInternal.set( + addItem( + Cover_RedstoneReceiverInternal.ID, + "Redstone Receiver (Internal)", + "Transfers Redstone signals wireless", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + + ItemList.Cover_NeedsMaintainance.set( + addItem( + Cover_NeedsMaintenance.ID, + "Needs Maintenance Cover", + "Attach to Multiblock Controller. Emits Redstone Signal if needs Maintenance", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L))); + + ItemList.Steam_Regulator_LV.set( + addItem( + Steam_Regulator_LV.ID, + "Steam Regulator (LV)", + GTUtility.formatNumbers(1024) + PartCoverText + GTUtility.formatNumbers(1024 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L))); + ItemList.Steam_Regulator_MV.set( + addItem( + Steam_Regulator_MV.ID, + "Steam Regulator (MV)", + GTUtility.formatNumbers(2048) + PartCoverText + GTUtility.formatNumbers(2048 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + ItemList.Steam_Regulator_HV.set( + addItem( + Steam_Regulator_HV.ID, + "Steam Regulator (HV)", + GTUtility.formatNumbers(4096) + PartCoverText + GTUtility.formatNumbers(4096 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 4L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))); + ItemList.Steam_Regulator_EV.set( + addItem( + Steam_Regulator_EV.ID, + "Steam Regulator (EV)", + GTUtility.formatNumbers(8192) + PartCoverText + GTUtility.formatNumbers(8192 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 8L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 8L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 8L))); + ItemList.Steam_Regulator_IV.set( + addItem( + Steam_Regulator_IV.ID, + "Steam Regulator (IV)", + GTUtility.formatNumbers(16384) + PartCoverText + GTUtility.formatNumbers(16384 * 20) + PartCoverText2, + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 16L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 16L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 16L))); + ItemList.Electromagnet_Iron.set( + addItem( + Electromagnet_Iron.ID, + "Iron Electromagnet", + MagnetTiers.buildMagnetTooltip(MagnetTiers.Iron), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 8))); + ItemList.Electromagnet_Steel.set( + addItem( + Electromagnet_Steel.ID, + "Steel Electromagnet", + MagnetTiers.buildMagnetTooltip(MagnetTiers.Steel), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 16))); + ItemList.Electromagnet_Neodymium.set( + addItem( + Electromagnet_Neodymium.ID, + "Neodymium Electromagnet", + MagnetTiers.buildMagnetTooltip(MagnetTiers.Neodymium), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 24))); + ItemList.Electromagnet_Samarium.set( + addItem( + Electromagnet_Samarium.ID, + EnumChatFormatting.YELLOW + "Samarium Electromagnet", + MagnetTiers.buildMagnetTooltip(MagnetTiers.Samarium), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 32))); + ItemList.Electromagnet_Tengam.set( + addItem( + Electromagnet_Tengam.ID, + EnumChatFormatting.GREEN + "Tengam Electromagnet", + MagnetTiers.buildMagnetTooltip(MagnetTiers.Tengam), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 40))); + ItemList.Black_Hole_Opener.set( + addItem( + Black_Hole_Opener.ID, + "Black Hole Activation Catalyst", + "Opens a semi-stable black hole", + new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 32), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 64))); + ItemList.Black_Hole_Closer.set( + addItem( + Black_Hole_Closer.ID, + "Black Hole Deactivation Catalyst", + "Safely closes a semi-stable black hole", + new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 32), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 64))); + + // Empty battery hulls + ItemList.BatteryHull_EV.set( + addItem( + BatteryHull_EV.ID, + "Small Sunnarium Battery (Empty)", + "An empty EV Battery Container", + new ItemData(Materials.BlueSteel, OrePrefixes.plate.mMaterialAmount * 2L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 8L))); + ItemList.BatteryHull_IV.set( + addItem( + BatteryHull_IV.ID, + "Medium Sunnarium Battery (Empty)", + "An empty IV Battery Container", + new ItemData(Materials.RoseGold, OrePrefixes.plate.mMaterialAmount * 6L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 16L))); + ItemList.BatteryHull_LuV.set( + addItem( + BatteryHull_LuV.ID, + "Large Sunnarium Battery (Empty)", + "An empty LuV Battery Container", + new ItemData(Materials.RedSteel, OrePrefixes.plate.mMaterialAmount * 18L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 32L))); + ItemList.BatteryHull_ZPM.set( + addItem( + BatteryHull_ZPM.ID, + "Medium Naquadria Battery (Empty)", + "An empty ZPM Energy Storage", + new ItemData(Materials.Europium, OrePrefixes.plate.mMaterialAmount * 6L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 64L))); + ItemList.BatteryHull_UV.set( + addItem( + BatteryHull_UV.ID, + "Large Naquadria Battery (Empty)", + "An empty UV Energy Storage", + new ItemData(Materials.Americium, OrePrefixes.plate.mMaterialAmount * 18L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 128L))); + ItemList.BatteryHull_UHV.set( + addItem( + BatteryHull_UHV.ID, + "Small Neutronium Battery (Empty)", + "An empty UHV Energy Storage", + new ItemData(Materials.Naquadah, OrePrefixes.plate.mMaterialAmount * 24L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 256L))); + ItemList.BatteryHull_UEV.set( + addItem( + BatteryHull_UEV.ID, + "Medium Neutronium Battery (Empty)", + "An empty UEV Energy Storage", + new ItemData(Materials.NaquadahEnriched, OrePrefixes.plate.mMaterialAmount * 36L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 512L))); + ItemList.BatteryHull_UIV.set( + addItem( + BatteryHull_UIV.ID, + "Large Neutronium Battery (Empty)", + "An empty UIV Energy Storage", + new ItemData(Materials.NaquadahAlloy, OrePrefixes.plate.mMaterialAmount * 48L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1024L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1024L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1024L))); + ItemList.BatteryHull_UMV.set( + addItem( + BatteryHull_UMV.ID, + "Medium Plasma Battery (Empty)", + "An empty UMV Energy Storage", + new ItemData(Materials.Neutronium, OrePrefixes.plate.mMaterialAmount * 56L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2048L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2048L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2048L))); + ItemList.BatteryHull_UxV.set( + addItem( + BatteryHull_UxV.ID, + "Large Plasma Battery (Empty)", + "An empty UXV Energy Storage", + new ItemData(Materials.DraconiumAwakened, OrePrefixes.plate.mMaterialAmount * 64L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4096L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4096L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 4096L))); + + ItemList.BatteryHull_EV_Full.set( + addItem( + BatteryHull_EV_Full.ID, + "Small Sunnarium Battery", + "Reusable", + "batteryEV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_IV_Full.set( + addItem( + BatteryHull_IV_Full.ID, + "Medium Sunnarium Battery", + "Reusable", + "batteryIV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_LuV_Full.set( + addItem( + BatteryHull_LuV_Full.ID, + "Large Sunnarium Battery", + "Reusable", + "batteryLuV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_ZPM_Full.set( + addItem( + BatteryHull_ZPM_Full.ID, + "Medium Naquadria Battery", + "Reusable", + "batteryZPM", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_UV_Full.set( + addItem( + BatteryHull_UV_Full.ID, + "Large Naquadria Battery", + "Reusable", + "batteryUV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_UHV_Full.set( + addItem( + BatteryHull_UHV_Full.ID, + "Small Neutronium Battery", + "Reusable", + "batteryUHV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_UEV_Full.set( + addItem( + BatteryHull_UEV_Full.ID, + "Medium Neutronium Battery", + "Reusable", + "batteryUEV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_UIV_Full.set( + addItem( + BatteryHull_UIV_Full.ID, + "Large Neutronium Battery", + "Reusable", + "batteryUIV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_UMV_Full.set( + addItem( + BatteryHull_UMV_Full.ID, + "Medium Infinity Battery", + "Reusable", + "batteryUMV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + ItemList.BatteryHull_UxV_Full.set( + addItem( + BatteryHull_UxV_Full.ID, + "Large Infinity Battery", + "Reusable", + "batteryUXV", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L))); + + removeRecipes(); + setBurnValues(); + oredictBlacklistEntries(); + registerCovers(); + registerBehaviors(); + setAllFluidContainerStats(); + setAllElectricStats(); + registerTieredTooltips(); + + craftingShapedRecipes(); + craftingShapelessRecipes(); + } + + private static final Map cauldronRemap = new HashMap<>(); + + public static void registerCauldronCleaningFor(Materials in, Materials out) { + cauldronRemap.put(in, out); + } + + @Override + public boolean onEntityItemUpdate(EntityItem aItemEntity) { + int aDamage = aItemEntity.getEntityItem() + .getItemDamage(); + if ((aDamage < 32000) && (aDamage >= 0) && (!aItemEntity.worldObj.isRemote)) { + Materials aMaterial = GregTechAPI.sGeneratedMaterials[(aDamage % 1000)]; + if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) { + int tX = MathHelper.floor_double(aItemEntity.posX); + int tY = MathHelper.floor_double(aItemEntity.posY); + int tZ = MathHelper.floor_double(aItemEntity.posZ); + OrePrefixes aPrefix = this.mGeneratedPrefixList[(aDamage / 1000)]; + if ((aPrefix == OrePrefixes.dustImpure) || (aPrefix == OrePrefixes.dustPure)) { + Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ); + byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ); + if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) { + + aMaterial = cauldronRemap.getOrDefault(aMaterial, aMaterial); + + aItemEntity.setEntityItemStack( + GTOreDictUnificator + .get(OrePrefixes.dust, aMaterial, aItemEntity.getEntityItem().stackSize)); + aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3); + return true; + } + } else if (aPrefix == OrePrefixes.crushed) { + Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ); + byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ); + if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) { + aItemEntity.setEntityItemStack( + GTOreDictUnificator + .get(OrePrefixes.crushedPurified, aMaterial, aItemEntity.getEntityItem().stackSize)); + aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3); + return true; + } + } else if (aPrefix == OrePrefixes.dust && aMaterial == Materials.Wheat) { + Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ); + byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ); + if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) { + aItemEntity.setEntityItemStack(ItemList.Food_Dough.get(aItemEntity.getEntityItem().stackSize)); + aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3); + return true; + } + } + } + } + return false; + } + + @Override + protected void addAdditionalToolTips(List aList, ItemStack aStack, EntityPlayer aPlayer) { + super.addAdditionalToolTips(aList, aStack, aPlayer); + int aDamage = aStack.getItemDamage(); + if ((aDamage < 32000) && (aDamage >= 0)) { + Materials aMaterial = GregTechAPI.sGeneratedMaterials[(aDamage % 1000)]; + if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) { + OrePrefixes aPrefix = this.mGeneratedPrefixList[(aDamage / 1000)]; + if ((aPrefix == OrePrefixes.dustImpure) || (aPrefix == OrePrefixes.dustPure)) { + aList.add(this.mToolTipPurify); + } + } + } + } + + public boolean isPlasmaCellUsed(OrePrefixes aPrefix, Materials aMaterial) { + Collection fusionRecipes = RecipeMaps.fusionRecipes.getAllRecipes(); + if (aPrefix == OrePrefixes.cellPlasma && aMaterial.getPlasma(1L) != null) { // Materials has a plasma fluid + for (GTRecipe recipe : fusionRecipes) { // Loop through fusion recipes + if (recipe.getFluidOutput(0) != null) { // Make sure fluid output can't be null (not sure if possible) + if (recipe.getFluidOutput(0) + .isFluidEqual(aMaterial.getPlasma(1L))) return true; // Fusion recipe + // output matches + // current plasma + // cell fluid + } + } + } + return false; + } + + @Override + public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { + return (aDoShowAllItems) || (((aPrefix != OrePrefixes.gem) || (!aMaterial.mName.startsWith("Infused"))) + && (aPrefix != OrePrefixes.dustTiny) + && (aPrefix != OrePrefixes.dustSmall) + && (aPrefix != OrePrefixes.dustImpure) + && (aPrefix != OrePrefixes.dustPure) + && (aPrefix != OrePrefixes.crushed) + && (aPrefix != OrePrefixes.crushedPurified) + && (aPrefix != OrePrefixes.crushedCentrifuged) + && (aPrefix != OrePrefixes.ingotHot) + && !(aPrefix == OrePrefixes.cellPlasma && !isPlasmaCellUsed(aPrefix, aMaterial))); + } + + @Override + public ItemStack getContainerItem(ItemStack aStack) { + int aDamage = aStack.getItemDamage(); + if (((aDamage >= 32430) && (aDamage <= 32461)) || (aDamage == 32465 || aDamage == 32466)) { + return ItemList.Spray_Empty.get(1L); + } + if ((aDamage == 32479) || (aDamage == 32476)) { + return new ItemStack(this, 1, aDamage - 2); + } + if (aDamage == 32401) { + return new ItemStack(this, 1, aDamage - 1); + } + return super.getContainerItem(aStack); + } + + @Override + public boolean doesMaterialAllowGeneration(OrePrefixes aPrefix, Materials aMaterial) { + return (super.doesMaterialAllowGeneration(aPrefix, aMaterial)); + } + + private void setBurnValues() { + setBurnValue(17000 + Materials.Wood.mMetaItemSubID, 1600); + } + + private void setAllFluidContainerStats() { + setFluidContainerStats(32000 + Large_Fluid_Cell_Steel.ID, 8_000L, 64L); + setFluidContainerStats(32000 + Large_Fluid_Cell_TungstenSteel.ID, 512_000L, 32L); + setFluidContainerStats(32000 + Large_Fluid_Cell_Aluminium.ID, 32_000L, 64L); + setFluidContainerStats(32000 + Large_Fluid_Cell_StainlessSteel.ID, 64_000L, 64L); + setFluidContainerStats(32000 + Large_Fluid_Cell_Titanium.ID, 128_000L, 64L); + setFluidContainerStats(32000 + Large_Fluid_Cell_Chrome.ID, 2_048_000L, 8L); + setFluidContainerStats(32000 + Large_Fluid_Cell_Iridium.ID, 8_192_000L, 2L); + setFluidContainerStats(32000 + Large_Fluid_Cell_Osmium.ID, 32_768_000L, 1L); + setFluidContainerStats(32000 + Large_Fluid_Cell_Neutronium.ID, 131_072_000L, 1L); + setFluidContainerStats(32000 + Electromagnet_Iron.ID, 0L, 1L); + setFluidContainerStats(32000 + Electromagnet_Steel.ID, 0L, 1L); + setFluidContainerStats(32000 + Electromagnet_Neodymium.ID, 0L, 1L); + setFluidContainerStats(32000 + Electromagnet_Samarium.ID, 0L, 1L); + setFluidContainerStats(32000 + Electromagnet_Tengam.ID, 0L, 1L); + } + + private void oredictBlacklistEntries() { + GTOreDictUnificator.addToBlacklist(new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID)); + } + + private void registerCovers() { + final ITexture doesWorkCoverTexture = TextureFactory.of( + TextureFactory.of(OVERLAY_ACTIVITYDETECTOR), + TextureFactory.builder() + .addIcon(OVERLAY_ACTIVITYDETECTOR_GLOW) + .glow() + .build()); + + final ITexture playerDectectorCoverTexture = TextureFactory.of( + TextureFactory.of(OVERLAY_ACTIVITYDETECTOR), + TextureFactory.builder() + .addIcon(OVERLAY_ACTIVITYDETECTOR_GLOW) + .glow() + .build()); + final ITexture screenCoverTexture = TextureFactory.of( + TextureFactory.of(OVERLAY_SCREEN), + TextureFactory.builder() + .addIcon(OVERLAY_SCREEN_GLOW) + .glow() + .build()); + + GregTechAPI.registerCover( + new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID), + TextureFactory.of(COVER_WOOD_PLATE), + null); + + GregTechAPI.registerCover( + ItemList.Electric_Pump_LV.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(32, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_MV.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(128, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_HV.get(1L), + TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(512, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_EV.get(1L), + TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(2048, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_IV.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(8192, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_LuV.get(1L), + TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(32768, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_ZPM.get(1L), + TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(131072, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_UV.get(1L), + TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(524288, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_UHV.get(1L), + TextureFactory.of(MACHINE_CASINGS[9][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(1048576, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.Electric_Pump_UEV.get(1L), + TextureFactory.of(MACHINE_CASINGS[10][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverPump(2097152, TextureFactory.of(OVERLAY_PUMP))); + + GregTechAPI.registerCover( + ItemList.Steam_Valve_LV.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamValve(1024, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Valve_MV.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamValve(2048, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Valve_HV.get(1L), + TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamValve(4096, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Valve_EV.get(1L), + TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamValve(8192, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Valve_IV.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamValve(16384, TextureFactory.of(OVERLAY_VALVE))); + + GregTechAPI.registerCover( + ItemList.FluidRegulator_LV.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(32, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.FluidRegulator_MV.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(128, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.FluidRegulator_HV.get(1L), + TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(512, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.FluidRegulator_EV.get(1L), + TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(2048, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.FluidRegulator_IV.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(8192, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.FluidRegulator_LuV.get(1L), + TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(32768, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.FluidRegulator_ZPM.get(1L), + TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(131072, TextureFactory.of(OVERLAY_PUMP))); + GregTechAPI.registerCover( + ItemList.FluidRegulator_UV.get(1L), + TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_PUMP)), + new CoverFluidRegulator(524288, TextureFactory.of(OVERLAY_PUMP))); + + GregTechAPI.registerCover( + ItemList.FluidFilter.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)), + new CoverFluidfilter(TextureFactory.of(OVERLAY_SHUTTER))); + + GregTechAPI.registerCover( + ItemList.ItemFilter_Export.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverItemFilter(true, TextureFactory.of(OVERLAY_CONVEYOR))); + + GregTechAPI.registerCover( + ItemList.ItemFilter_Import.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverItemFilter(false, TextureFactory.of(OVERLAY_CONVEYOR))); + + GregTechAPI.registerCover( + ItemList.Cover_FluidLimiter.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)), + new CoverFluidLimiter(TextureFactory.of(OVERLAY_SHUTTER))); + + GregTechAPI.registerCover( + ItemList.Conveyor_Module_LV.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(400, 1, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_MV.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(100, 1, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_HV.get(1L), + TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(20, 1, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_EV.get(1L), + TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(4, 1, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_IV.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(1, 1, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_LuV.get(1L), + TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(1, 2, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_ZPM.get(1L), + TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(1, 4, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_UV.get(1L), + TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(1, 8, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_UHV.get(1L), + TextureFactory.of(MACHINE_CASINGS[9][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(1, 16, TextureFactory.of(OVERLAY_CONVEYOR))); + GregTechAPI.registerCover( + ItemList.Conveyor_Module_UEV.get(1L), + TextureFactory.of(MACHINE_CASINGS[10][0], TextureFactory.of(OVERLAY_CONVEYOR)), + new CoverConveyor(1, 32, TextureFactory.of(OVERLAY_CONVEYOR))); + + GregTechAPI.registerCover( + ItemList.Robot_Arm_LV.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_ARM)), + new CoverArm(400, TextureFactory.of(OVERLAY_ARM))); + GregTechAPI.registerCover( + ItemList.Robot_Arm_MV.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ARM)), + new CoverArm(100, TextureFactory.of(OVERLAY_ARM))); + GregTechAPI.registerCover( + ItemList.Robot_Arm_HV.get(1L), + TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_ARM)), + new CoverArm(20, TextureFactory.of(OVERLAY_ARM))); + GregTechAPI.registerCover( + ItemList.Robot_Arm_EV.get(1L), + TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_ARM)), + new CoverArm(4, TextureFactory.of(OVERLAY_ARM))); + GregTechAPI.registerCover( + ItemList.Robot_Arm_IV.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_ARM)), + new CoverArm(1, TextureFactory.of(OVERLAY_ARM))); + + GregTechAPI.registerCover( + ItemList.Cover_Controller.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_CONTROLLER)), + new CoverControlsWork(TextureFactory.of(OVERLAY_CONTROLLER))); + + GregTechAPI.registerCover( + ItemList.Cover_Chest_Basic.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_1)), + new CoverChest(9, TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_1))); + GregTechAPI.registerCover( + ItemList.Cover_Chest_Good.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_2)), + new CoverChest(12, TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_2))); + GregTechAPI.registerCover( + ItemList.Cover_Chest_Advanced.get(1L), + TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_3)), + new CoverChest(15, TextureFactory.of(Textures.BlockIcons.OVERLAY_COVER_CHEST_3))); + GregTechAPI.registerCover( + ItemList.Cover_ActivityDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], doesWorkCoverTexture), + new CoverDoesWork(doesWorkCoverTexture)); + GregTechAPI.registerCover( + ItemList.Cover_FluidDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_FLUIDDETECTOR)), + new CoverLiquidMeter(TextureFactory.of(OVERLAY_FLUIDDETECTOR))); + GregTechAPI.registerCover( + ItemList.Cover_ItemDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ITEMDETECTOR)), + new CoverItemMeter(TextureFactory.of(OVERLAY_ITEMDETECTOR))); + GregTechAPI.registerCover( + ItemList.Cover_EnergyDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ENERGYDETECTOR)), + new CoverEUMeter(TextureFactory.of(OVERLAY_ENERGYDETECTOR))); + + GregTechAPI.registerCover( + ItemList.Cover_PlayerDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], playerDectectorCoverTexture), + new CoverPlayerDetector(playerDectectorCoverTexture)); + GregTechAPI.registerCover( + ItemList.Cover_FluidStorageMonitor.get(1L), + TextureFactory.of(OVERLAY_FLUID_STORAGE_MONITOR0), + new CoverFluidStorageMonitor()); + + GregTechAPI.registerCover( + ItemList.Cover_Screen.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], screenCoverTexture), + new CoverScreen(screenCoverTexture)); + GregTechAPI.registerCover( + ItemList.Cover_Crafting.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_CRAFTING)), + new CoverCrafting(TextureFactory.of(OVERLAY_CRAFTING))); + GregTechAPI.registerCover( + ItemList.Cover_Drain.get(1L), + TextureFactory.of(MACHINE_CASINGS[0][0], TextureFactory.of(OVERLAY_DRAIN)), + new CoverDrain(TextureFactory.of(OVERLAY_DRAIN))); + GregTechAPI.registerCover( + ItemList.Cover_Shutter.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)), + new CoverShutter(TextureFactory.of(OVERLAY_SHUTTER))); + + GregTechAPI + .registerCover(ItemList.Cover_SolarPanel.get(1L), TextureFactory.of(SOLARPANEL), new CoverSolarPanel(1)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_8V.get(1L), + TextureFactory.of(SOLARPANEL_8V), + new CoverSolarPanel(8)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_LV.get(1L), + TextureFactory.of(SOLARPANEL_LV), + new CoverSolarPanel(32)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_MV.get(1L), + TextureFactory.of(SOLARPANEL_MV), + new CoverSolarPanel(128)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_HV.get(1L), + TextureFactory.of(SOLARPANEL_HV), + new CoverSolarPanel(512)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_EV.get(1L), + TextureFactory.of(SOLARPANEL_EV), + new CoverSolarPanel(2048)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_IV.get(1L), + TextureFactory.of(SOLARPANEL_IV), + new CoverSolarPanel(8192)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_LuV.get(1L), + TextureFactory.of(SOLARPANEL_LuV), + new CoverSolarPanel(32768)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_ZPM.get(1L), + TextureFactory.of(SOLARPANEL_ZPM), + new CoverSolarPanel(131072)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_UV.get(1L), + TextureFactory.of(SOLARPANEL_UV), + new CoverSolarPanel(524288)); + + GregTechAPI.registerCover( + ItemList.Cover_RedstoneTransmitterExternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)), + new CoverRedstoneTransmitterExternal(TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER))); + GregTechAPI.registerCover( + ItemList.Cover_RedstoneTransmitterInternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)), + new CoverRedstoneTransmitterInternal(TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER))); + GregTechAPI.registerCover( + ItemList.Cover_RedstoneReceiverExternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)), + new CoverRedstoneReceiverExternal(TextureFactory.of(OVERLAY_REDSTONE_RECEIVER))); + GregTechAPI.registerCover( + ItemList.Cover_RedstoneReceiverInternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)), + new CoverRedstoneReceiverInternal(TextureFactory.of(OVERLAY_REDSTONE_RECEIVER))); + + GregTechAPI.registerCover( + ItemList.Steam_Regulator_LV.get(1L), + TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamRegulator(1024, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Regulator_MV.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamRegulator(2048, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Regulator_HV.get(1L), + TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamRegulator(4096, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Regulator_EV.get(1L), + TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamRegulator(8192, TextureFactory.of(OVERLAY_VALVE))); + GregTechAPI.registerCover( + ItemList.Steam_Regulator_IV.get(1L), + TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_VALVE)), + new CoverSteamRegulator(16384, TextureFactory.of(OVERLAY_VALVE))); + + GregTechAPI.registerCover( + ItemList.Cover_NeedsMaintainance.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_MAINTENANCE_DETECTOR)), + new CoverNeedMaintainance(TextureFactory.of(OVERLAY_MAINTENANCE_DETECTOR))); + + } + + private void removeRecipes() { + GTModHandler.removeRecipe( + new ItemStack(Blocks.glass), + null, + new ItemStack(Blocks.glass), + null, + new ItemStack(Blocks.glass)); + } + + private void craftingShapedRecipes() { + ItemStack tStack = new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID); + tStack.setStackDisplayName("The holy Planks of Sengir"); + GTUtility.ItemNBT.addEnchantment(tStack, Enchantment.smite, 10); + GTModHandler.addCraftingRecipe( + tStack, + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "XXX", "XDX", "XXX", 'X', OrePrefixes.gem.get(Materials.NetherStar), 'D', + new ItemStack(Blocks.dragon_egg, 1, 32767) }); + + GTModHandler.addCraftingRecipe( + ItemList.Shape_Slicer_Flat.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "hXS", aTextShape, "fXd", 'P', ItemList.Shape_Extruder_Block, 'X', + OrePrefixes.plate.get(Materials.StainlessSteel), 'S', + OrePrefixes.screw.get(Materials.StainlessSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Shape_Slicer_Stripes.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "hXS", "XPX", "fXd", 'P', ItemList.Shape_Extruder_Block, 'X', + OrePrefixes.plate.get(Materials.StainlessSteel), 'S', + OrePrefixes.screw.get(Materials.StainlessSteel) }); + + GTModHandler.addCraftingRecipe( + ItemList.Fuel_Can_Plastic_Empty.get(7L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " PP", "P P", "PPP", 'P', OrePrefixes.plate.get(Materials.Plastic) }); + + GTModHandler.addCraftingRecipe( + ItemList.Crate_Empty.get(4L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "SWS", "WdW", "SWS", 'W', OrePrefixes.plank.get(Materials.Wood), 'S', + OrePrefixes.screw.get(Materials.AnyIron) }); + GTModHandler.addCraftingRecipe( + ItemList.Crate_Empty.get(4L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "SWS", "WdW", "SWS", 'W', OrePrefixes.plank.get(Materials.Wood), 'S', + OrePrefixes.screw.get(Materials.Steel) }); + + GTModHandler.addCraftingRecipe( + ItemList.Schematic_1by1.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "d ", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic }); + GTModHandler.addCraftingRecipe( + ItemList.Schematic_2by2.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " d ", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic }); + GTModHandler.addCraftingRecipe( + ItemList.Schematic_3by3.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " d", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic }); + GTModHandler.addCraftingRecipe( + ItemList.Schematic_Dust.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { aTextEmptyRow, aTextShape, " d", 'P', ItemList.Schematic }); + + GTModHandler.addCraftingRecipe( + ItemList.Battery_Hull_LV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "Cf ", "Ph ", "Ps ", 'P', OrePrefixes.plate.get(Materials.BatteryAlloy), 'C', + OreDictNames.craftingWireTin }); + + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.IronMagnetic), 'R', + OrePrefixes.stick.get(Materials.AnyIron), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', + OrePrefixes.stick.get(Materials.Steel), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', + OrePrefixes.stick.get(Materials.Aluminium), 'W', OrePrefixes.wireGt02.get(Materials.Cupronickel), 'C', + OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R', + OrePrefixes.stick.get(Materials.StainlessSteel), 'W', OrePrefixes.wireGt04.get(Materials.Electrum), 'C', + OrePrefixes.cableGt02.get(Materials.Silver) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', + OrePrefixes.stick.get(Materials.Titanium), 'W', OrePrefixes.wireGt04.get(Materials.BlackSteel), 'C', + OrePrefixes.cableGt02.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Motor_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R', + OrePrefixes.stick.get(Materials.TungstenSteel), 'W', OrePrefixes.wireGt04.get(Materials.Graphene), 'C', + OrePrefixes.cableGt02.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Electric_Piston_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Steel), 'S', + OrePrefixes.stick.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'M', + ItemList.Electric_Motor_LV, 'C', OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Piston_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'S', + OrePrefixes.stick.get(Materials.Aluminium), 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'M', + ItemList.Electric_Motor_MV, 'C', OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Piston_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'S', + OrePrefixes.stick.get(Materials.StainlessSteel), 'G', + OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'M', ItemList.Electric_Motor_HV, 'C', + OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Piston_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Titanium), 'S', + OrePrefixes.stick.get(Materials.Titanium), 'G', OrePrefixes.gearGtSmall.get(Materials.Titanium), 'M', + ItemList.Electric_Motor_EV, 'C', OrePrefixes.cableGt01.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Piston_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'S', + OrePrefixes.stick.get(Materials.TungstenSteel), 'G', + OrePrefixes.gearGtSmall.get(Materials.TungstenSteel), 'M', ItemList.Electric_Motor_IV, 'C', + OrePrefixes.cableGt01.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Electric_Pump_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_LV, 'O', + OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Tin), 'S', + OrePrefixes.screw.get(Materials.Tin), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'P', + OrePrefixes.pipeMedium.get(Materials.Bronze) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Pump_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_MV, 'O', + OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Bronze), 'S', + OrePrefixes.screw.get(Materials.Bronze), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'P', + OrePrefixes.pipeMedium.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Pump_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_HV, 'O', + OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Steel), 'S', + OrePrefixes.screw.get(Materials.Steel), 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'P', + OrePrefixes.pipeMedium.get(Materials.StainlessSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Pump_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_EV, 'O', + OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.StainlessSteel), 'S', + OrePrefixes.screw.get(Materials.StainlessSteel), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium), + 'P', OrePrefixes.pipeMedium.get(Materials.Titanium) }); + GTModHandler.addCraftingRecipe( + ItemList.Electric_Pump_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_IV, 'O', + OrePrefixes.ring.get(Materials.AnySyntheticRubber), 'X', OrePrefixes.rotor.get(Materials.TungstenSteel), + 'S', OrePrefixes.screw.get(Materials.TungstenSteel), 'W', OrePrefixes.cableGt01.get(Materials.Tungsten), + 'P', OrePrefixes.pipeMedium.get(Materials.TungstenSteel) }); + + GTModHandler.addCraftingRecipe( + ItemList.Conveyor_Module_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_LV, 'C', + OrePrefixes.cableGt01.get(Materials.Tin), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); + GTModHandler.addCraftingRecipe( + ItemList.Conveyor_Module_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_MV, 'C', + OrePrefixes.cableGt01.get(Materials.AnyCopper), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); + GTModHandler.addCraftingRecipe( + ItemList.Conveyor_Module_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_HV, 'C', + OrePrefixes.cableGt01.get(Materials.Gold), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); + GTModHandler.addCraftingRecipe( + ItemList.Conveyor_Module_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_EV, 'C', + OrePrefixes.cableGt01.get(Materials.Aluminium), 'R', OrePrefixes.plate.get(Materials.AnyRubber) }); + GTModHandler.addCraftingRecipe( + ItemList.Conveyor_Module_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_IV, 'C', + OrePrefixes.cableGt01.get(Materials.Tungsten), 'R', + OrePrefixes.plate.get(Materials.AnySyntheticRubber) }); + + GTModHandler.addCraftingRecipe( + ItemList.Robot_Arm_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Steel), 'M', + ItemList.Electric_Motor_LV, 'P', ItemList.Electric_Piston_LV, 'E', + OrePrefixes.circuit.get(Materials.LV), 'C', OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Robot_Arm_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Aluminium), 'M', + ItemList.Electric_Motor_MV, 'P', ItemList.Electric_Piston_MV, 'E', + OrePrefixes.circuit.get(Materials.MV), 'C', OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Robot_Arm_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.StainlessSteel), 'M', + ItemList.Electric_Motor_HV, 'P', ItemList.Electric_Piston_HV, 'E', + OrePrefixes.circuit.get(Materials.HV), 'C', OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Robot_Arm_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Titanium), 'M', + ItemList.Electric_Motor_EV, 'P', ItemList.Electric_Piston_EV, 'E', + OrePrefixes.circuit.get(Materials.EV), 'C', OrePrefixes.cableGt01.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Robot_Arm_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.TungstenSteel), 'M', + ItemList.Electric_Motor_IV, 'P', ItemList.Electric_Piston_IV, 'E', + OrePrefixes.circuit.get(Materials.IV), 'C', OrePrefixes.cableGt01.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Emitter_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.CertusQuartz), 'S', + OrePrefixes.stick.get(Materials.Brass), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Emitter_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.EnderPearl), 'S', + OrePrefixes.stick.get(Materials.Electrum), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Emitter_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.EnderEye), 'S', + OrePrefixes.stick.get(Materials.Chrome), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Emitter_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SSC", "WQS", "CWS", 'Q', ItemList.QuantumEye, 'S', + OrePrefixes.stick.get(Materials.Platinum), 'C', OrePrefixes.circuit.get(Materials.EV), 'W', + OrePrefixes.cableGt01.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Emitter_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "SSC", "WQS", "CWS", 'Q', ItemList.QuantumStar, 'S', + OrePrefixes.stick.get(Materials.Iridium), 'C', OrePrefixes.circuit.get(Materials.IV), 'W', + OrePrefixes.cableGt01.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Sensor_LV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gem.get(Materials.CertusQuartz), 'S', + OrePrefixes.stick.get(Materials.Brass), 'P', OrePrefixes.plate.get(Materials.Steel), 'C', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Sensor_MV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gemFlawless.get(Materials.Emerald), 'S', + OrePrefixes.stick.get(Materials.Electrum), 'P', OrePrefixes.plate.get(Materials.Aluminium), 'C', + OrePrefixes.circuit.get(Materials.MV) }); + GTModHandler.addCraftingRecipe( + ItemList.Sensor_HV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gem.get(Materials.EnderEye), 'S', + OrePrefixes.stick.get(Materials.Chrome), 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'C', + OrePrefixes.circuit.get(Materials.HV) }); + GTModHandler.addCraftingRecipe( + ItemList.Sensor_EV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "P Q", "PS ", "CPP", 'Q', ItemList.QuantumEye, 'S', + OrePrefixes.stick.get(Materials.Platinum), 'P', OrePrefixes.plate.get(Materials.Titanium), 'C', + OrePrefixes.circuit.get(Materials.EV) }); + GTModHandler.addCraftingRecipe( + ItemList.Sensor_IV.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "P Q", "PS ", "CPP", 'Q', ItemList.QuantumStar, 'S', + OrePrefixes.stick.get(Materials.Iridium), 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'C', + OrePrefixes.circuit.get(Materials.IV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Component_Sawblade_Diamond.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { " D ", "DGD", " D ", 'D', OrePrefixes.dustSmall.get(Materials.Diamond), 'G', + OrePrefixes.gearGt.get(Materials.CobaltBrass) }); + GTModHandler.addCraftingRecipe( + ItemList.Component_Grinder_Diamond.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "DSD", "SIS", "DSD", 'I', OrePrefixes.gem.get(Materials.Diamond), 'D', + OrePrefixes.dust.get(Materials.Diamond), 'S', OrePrefixes.plateDouble.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Component_Grinder_Tungsten.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "TST", "SIS", "TST", 'I', OreDictNames.craftingIndustrialDiamond, 'T', + OrePrefixes.plate.get(Materials.Tungsten), 'S', OrePrefixes.plateDouble.get(Materials.Steel) }); + + GTModHandler.addCraftingRecipe( + ItemList.Cover_Screen.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "AGA", "RPB", "ALA", 'A', OrePrefixes.plate.get(Materials.Aluminium), 'L', + OrePrefixes.dust.get(Materials.Glowstone), 'R', Dyes.dyeRed, 'G', Dyes.dyeLime, 'B', Dyes.dyeBlue, 'P', + OrePrefixes.plate.get(Materials.Glass) }); + + GTModHandler.addCraftingRecipe( + ItemList.Tool_Scanner.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "EPR", "CSC", "PBP", 'C', OrePrefixes.circuit.get(Materials.HV), 'P', + OrePrefixes.plate.get(Materials.Aluminium), 'E', ItemList.Emitter_MV, 'R', ItemList.Sensor_MV, 'S', + ItemList.Cover_Screen, 'B', ItemList.Battery_RE_MV_Lithium }); + + GTModHandler.addCraftingRecipe( + ItemList.ItemFilter_Export.get(1L), + new Object[] { "SPS", "dIC", "SPS", 'P', OrePrefixes.plate.get(Materials.Tin), 'S', + OrePrefixes.screw.get(Materials.Iron), 'I', ItemList.Component_Filter, 'C', + ItemList.Conveyor_Module_LV }); + GTModHandler.addCraftingRecipe( + ItemList.ItemFilter_Import.get(1L), + new Object[] { "SPS", "CId", "SPS", 'P', OrePrefixes.plate.get(Materials.Tin), 'S', + OrePrefixes.screw.get(Materials.Iron), 'I', ItemList.Component_Filter, 'C', + ItemList.Conveyor_Module_LV }); + + GTModHandler.addCraftingRecipe( + ItemList.Tool_Cover_Copy_Paste.get(1L), + GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "PSP", "PCP", "PBP", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'S', + ItemList.Tool_DataStick.get(1L), 'C', ItemList.Cover_Screen.get(1L), 'B', + ItemList.Battery_RE_MV_Lithium.get(1L) }); + } + + private void craftingShapelessRecipes() { + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Coin_Chocolate.get(1L), + new Object[] { OrePrefixes.dust.get(Materials.Cocoa), OrePrefixes.dust.get(Materials.Milk), + OrePrefixes.dust.get(Materials.Sugar), OrePrefixes.foil.get(Materials.Gold) }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Copper.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Iron }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Iron.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Silver }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Silver.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Gold }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Gold.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Platinum }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Platinum.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Osmium }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Iron.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper, + ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper, + ItemList.Credit_Copper }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Silver.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, + ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Gold.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver, + ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver, + ItemList.Credit_Silver }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Platinum.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, + ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Osmium.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum, + ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum, + ItemList.Credit_Platinum }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Copper.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Cupronickel }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Cupronickel.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Silver }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Silver.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Gold }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Gold.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Platinum }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Platinum.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Osmium }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Osmium.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Naquadah }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Naquadah.get(8L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Neutronium }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Cupronickel.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, + ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, + ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Silver.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, + ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, + ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Gold.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, + ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, + ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Platinum.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, + ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, + ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Osmium.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, + ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, + ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Naquadah.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, + ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, + ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Credit_Greg_Neutronium.get(1L), + GTModHandler.RecipeBits.KEEPNBT | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, + ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, + ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Schematic.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Schematic_Crafting }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Schematic.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Schematic_1by1 }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Schematic.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Schematic_2by2 }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Schematic.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Schematic_3by3 }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Schematic.get(1L), + GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Schematic_Dust }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Tool_DataOrb.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Tool_DataOrb.get(1L) }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Tool_DataStick.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ItemList.Tool_DataStick.get(1L) }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_RedstoneTransmitterInternal.get(1L), + new Object[] { ItemList.Cover_RedstoneTransmitterExternal.get(1L) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_RedstoneReceiverInternal.get(1L), + new Object[] { ItemList.Cover_RedstoneReceiverExternal.get(1L) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_RedstoneTransmitterExternal.get(1L), + new Object[] { ItemList.Cover_RedstoneTransmitterInternal.get(1L) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_RedstoneReceiverExternal.get(1L), + new Object[] { ItemList.Cover_RedstoneReceiverInternal.get(1L) }); + + GTModHandler.addShapelessCraftingRecipe( + ItemList.ItemFilter_Export.get(1L), + new Object[] { ItemList.ItemFilter_Import.get(1L) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.ItemFilter_Import.get(1L), + new Object[] { ItemList.ItemFilter_Export.get(1L) }); + + } + + private void registerBehaviors() { + IItemBehaviour behaviourSprayColorRemover = new BehaviourSprayColorRemover( + ItemList.Spray_Empty.get(1L), + ItemList.Spray_Color_Used_Remover.get(1L), + ItemList.Spray_Color_Remover.get(1L), + 1024L); + addItemBehavior(32000 + Spray_Color_Remover.ID, behaviourSprayColorRemover); + addItemBehavior(32000 + Spray_Color_Used_Remover.ID, behaviourSprayColorRemover); + + IItemBehaviour behaviourMatches = new BehaviourLighter( + null, + ItemList.Tool_Matches.get(1L), + ItemList.Tool_Matches.get(1L), + 1L); + addItemBehavior(32000 + Tool_Matches.ID, behaviourMatches); + IItemBehaviour behaviourMatchBox = new BehaviourLighter( + null, + ItemList.Tool_MatchBox_Used.get(1L), + ItemList.Tool_MatchBox_Full.get(1L), + 16L); + addItemBehavior(32000 + Tool_MatchBox_Used.ID, behaviourMatchBox); + addItemBehavior(32000 + Tool_MatchBox_Full.ID, behaviourMatchBox); + + IItemBehaviour behaviourLighterInvar = new BehaviourLighter( + ItemList.Tool_Lighter_Invar_Empty.get(1L), + ItemList.Tool_Lighter_Invar_Used.get(1L), + ItemList.Tool_Lighter_Invar_Full.get(1L), + 100L); + addItemBehavior(32000 + Tool_Lighter_Invar_Used.ID, behaviourLighterInvar); + addItemBehavior(32000 + Tool_Lighter_Invar_Full.ID, behaviourLighterInvar); + + IItemBehaviour behaviourLighterPlatinum = new BehaviourLighter( + ItemList.Tool_Lighter_Platinum_Empty.get(1L), + ItemList.Tool_Lighter_Platinum_Used.get(1L), + ItemList.Tool_Lighter_Platinum_Full.get(1L), + 1000L); + addItemBehavior(32000 + Tool_Lighter_Platinum_Used.ID, behaviourLighterPlatinum); + addItemBehavior(32000 + Tool_Lighter_Platinum_Full.ID, behaviourLighterPlatinum); + + for (int i = 0; i < 16; i++) { + IItemBehaviour behaviourSprayColor = new BehaviourSprayColor( + ItemList.Spray_Empty.get(1L), + ItemList.SPRAY_CAN_DYES_USED[i].get(1L), + ItemList.SPRAY_CAN_DYES[i].get(1L), + ConfigGeneral.sprayCanUses, + i); + addItemBehavior(32000 + Spray_Colors[i], behaviourSprayColor); + addItemBehavior(32000 + Spray_Colors_Used[i], behaviourSprayColor); + } + } + + private void setAllElectricStats() { + setElectricStats(32000 + Battery_RE_ULV_Tantalum.ID, 1000L, GTValues.V[0], 0L, -3L, false); + setElectricStats(32000 + Battery_SU_LV_Sulfuric_Acid.ID, 18000L, GTValues.V[1], 1L, -2L, true); + setElectricStats(32000 + Battery_SU_LV_Mercury.ID, 32000L, GTValues.V[1], 1L, -2L, true); + setElectricStats(32000 + Battery_RE_LV_Cadmium.ID, 75000L, GTValues.V[1], 1L, -3L, true); + setElectricStats(32000 + Battery_RE_LV_Lithium.ID, 100000L, GTValues.V[1], 1L, -3L, true); + setElectricStats(32000 + Battery_RE_LV_Sodium.ID, 50000L, GTValues.V[1], 1L, -3L, true); + setElectricStats(32000 + Battery_SU_MV_Sulfuric_Acid.ID, 72000L, GTValues.V[2], 2L, -2L, true); + setElectricStats(32000 + Battery_SU_MV_Mercury.ID, 128000L, GTValues.V[2], 2L, -2L, true); + setElectricStats(32000 + Battery_RE_MV_Cadmium.ID, 300000L, GTValues.V[2], 2L, -3L, true); + setElectricStats(32000 + Battery_RE_MV_Lithium.ID, 400000L, GTValues.V[2], 2L, -3L, true); + setElectricStats(32000 + Battery_RE_MV_Sodium.ID, 200000L, GTValues.V[2], 2L, -3L, true); + setElectricStats(32000 + Battery_SU_HV_Sulfuric_Acid.ID, 288000L, GTValues.V[3], 3L, -2L, true); + setElectricStats(32000 + Battery_SU_HV_Mercury.ID, 512000L, GTValues.V[3], 3L, -2L, true); + setElectricStats(32000 + Battery_RE_HV_Cadmium.ID, 1200000L, GTValues.V[3], 3L, -3L, true); + setElectricStats(32000 + Battery_RE_HV_Lithium.ID, 1600000L, GTValues.V[3], 3L, -3L, true); + setElectricStats(32000 + Battery_RE_HV_Sodium.ID, 800000L, GTValues.V[3], 3L, -3L, true); + setElectricStats(32000 + Energy_Lapotronic_Orb.ID, 100000000L, GTValues.V[5], 5L, -3L, true); + setElectricStats(32000 + IDMetaItem01.ZPM.ID, 2000000000000L, GTValues.V[7], 7L, -2L, true); + setElectricStats(32000 + Energy_Lapotronic_orb_2.ID, 1000000000L, GTValues.V[6], 6L, -3L, true); + setElectricStats(32000 + ZPM2.ID, Long.MAX_VALUE, GTValues.V[8], 8L, -3L, true); + setElectricStats(32000 + ZPM3.ID, Long.MAX_VALUE, GTValues.V[12], 12L, -3L, true); + setElectricStats(32000 + ZPM4.ID, Long.MAX_VALUE, GTValues.V[13], 13L, -3L, true); + setElectricStats(32000 + ZPM5.ID, Long.MAX_VALUE, GTValues.V[14], 14L, -3L, true); + setElectricStats(32000 + ZPM6.ID, Long.MAX_VALUE, GTValues.V[15], 15L, -3L, true); + setElectricStats(32000 + Energy_Module.ID, 10000000000L, GTValues.V[7], 7L, -3L, true); + setElectricStats(32000 + Energy_Cluster.ID, 100000000000L, GTValues.V[8], 8L, -3L, true); + setElectricStats(32000 + Tool_Cover_Copy_Paste.ID, 400000L, GTValues.V[2], 2L, -1L, false); + setElectricStats(32000 + Tool_Cheat.ID, -2000000000L, 1000000000L, -1L, -3L, false); + setElectricStats(32000 + Tool_Scanner.ID, 400000L, GTValues.V[2], 2L, -1L, false); + setElectricStats(32000 + BatteryHull_EV_Full.ID, 6400000L, GTValues.V[4], 4L, -3L, true); + setElectricStats(32000 + BatteryHull_IV_Full.ID, 25600000L, GTValues.V[5], 5L, -3L, true); + setElectricStats(32000 + BatteryHull_LuV_Full.ID, 102400000L, GTValues.V[6], 6L, -3L, true); + setElectricStats(32000 + BatteryHull_ZPM_Full.ID, 409600000L, GTValues.V[7], 7L, -3L, true); + setElectricStats(32000 + BatteryHull_UV_Full.ID, 1638400000L, GTValues.V[8], 8L, -3L, true); + setElectricStats(32000 + BatteryHull_UHV_Full.ID, 6553600000L, GTValues.V[9], 9L, -3L, true); + setElectricStats(32000 + BatteryHull_UEV_Full.ID, 26214400000L, GTValues.V[10], 10L, -3L, true); + setElectricStats(32000 + BatteryHull_UIV_Full.ID, 104857600000L, GTValues.V[11], 11L, -3L, true); + setElectricStats(32000 + BatteryHull_UMV_Full.ID, 419430400000L, GTValues.V[12], 12L, -3L, true); + setElectricStats(32000 + BatteryHull_UxV_Full.ID, 1677721600000L, GTValues.V[13], 13L, -3L, true); + } + + private void registerTieredTooltips() { + registerTieredTooltip(ItemList.Battery_RE_ULV_Tantalum.get(1), ULV); + registerTieredTooltip(ItemList.Battery_SU_LV_SulfuricAcid.get(1), LV); + registerTieredTooltip(ItemList.Battery_SU_LV_Mercury.get(1), LV); + registerTieredTooltip(ItemList.Battery_RE_LV_Cadmium.get(1), LV); + registerTieredTooltip(ItemList.Battery_RE_LV_Lithium.get(1), LV); + registerTieredTooltip(ItemList.Battery_RE_LV_Sodium.get(1), LV); + registerTieredTooltip(ItemList.Battery_SU_MV_SulfuricAcid.get(1), MV); + registerTieredTooltip(ItemList.Battery_SU_MV_Mercury.get(1), MV); + registerTieredTooltip(ItemList.Battery_RE_MV_Cadmium.get(1), MV); + registerTieredTooltip(ItemList.Battery_RE_MV_Lithium.get(1), MV); + registerTieredTooltip(ItemList.Battery_RE_MV_Sodium.get(1), MV); + registerTieredTooltip(ItemList.Battery_SU_HV_SulfuricAcid.get(1), HV); + registerTieredTooltip(ItemList.Battery_SU_HV_Mercury.get(1), HV); + registerTieredTooltip(ItemList.Battery_RE_HV_Cadmium.get(1), HV); + registerTieredTooltip(ItemList.Battery_RE_HV_Lithium.get(1), HV); + registerTieredTooltip(ItemList.Battery_RE_HV_Sodium.get(1), HV); + registerTieredTooltip(ItemList.Energy_LapotronicOrb.get(1), IV); + registerTieredTooltip(ItemList.ZPM.get(1), ZPM); + registerTieredTooltip(ItemList.Energy_LapotronicOrb2.get(1), LuV); + registerTieredTooltip(ItemList.ZPM2.get(1), UV); + registerTieredTooltip(ItemList.ZPM3.get(1), UMV); + registerTieredTooltip(ItemList.ZPM4.get(1), UXV); + registerTieredTooltip(ItemList.ZPM5.get(1), MAX); + registerTieredTooltip(ItemList.ZPM6.get(1), ERV); + registerTieredTooltip(ItemList.Energy_Module.get(1), ZPM); + registerTieredTooltip(ItemList.Energy_Cluster.get(1), UV); + registerTieredTooltip(ItemList.Circuit_Primitive.get(1), ULV); + registerTieredTooltip(ItemList.Circuit_Basic.get(1), LV); + registerTieredTooltip(ItemList.Circuit_Good.get(1), MV); + registerTieredTooltip(ItemList.Circuit_Advanced.get(1), HV); + registerTieredTooltip(ItemList.Circuit_Data.get(1), EV); + registerTieredTooltip(ItemList.Circuit_Elite.get(1), IV); + registerTieredTooltip(ItemList.Circuit_Master.get(1), LuV); + registerTieredTooltip(ItemList.BatteryHull_EV_Full.get(1), EV); + registerTieredTooltip(ItemList.BatteryHull_IV_Full.get(1), IV); + registerTieredTooltip(ItemList.BatteryHull_LuV_Full.get(1), LuV); + registerTieredTooltip(ItemList.BatteryHull_ZPM_Full.get(1), ZPM); + registerTieredTooltip(ItemList.BatteryHull_UV_Full.get(1), UV); + registerTieredTooltip(ItemList.BatteryHull_UHV_Full.get(1), UHV); + registerTieredTooltip(ItemList.BatteryHull_UEV_Full.get(1), UEV); + registerTieredTooltip(ItemList.BatteryHull_UIV_Full.get(1), UIV); + registerTieredTooltip(ItemList.BatteryHull_UMV_Full.get(1), UMV); + registerTieredTooltip(ItemList.BatteryHull_UxV_Full.get(1), UXV); + + } +} diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem02.java b/src/main/java/gregtech/common/items/MetaGeneratedItem02.java new file mode 100644 index 0000000000..45404e36cd --- /dev/null +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem02.java @@ -0,0 +1,3107 @@ +package gregtech.common.items; + +import static gregtech.api.enums.GTValues.RA; +import static gregtech.api.enums.Mods.Forestry; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ADVANCED_REDSTONE_RECEIVER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ADVANCED_REDSTONE_TRANSMITTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_ACTIVITYDETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_FLUID_DETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_ITEM_DETECTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_MAINTENANCE_DETECTOR; +import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; +import static gregtech.api.recipe.RecipeMaps.compressorRecipes; +import static gregtech.api.recipe.RecipeMaps.extractorRecipes; +import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; +import static gregtech.api.util.GTRecipeBuilder.MINUTES; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.WILDCARD; +import static gregtech.common.items.IDMetaItem02.Bottle_Alcopops; +import static gregtech.common.items.IDMetaItem02.Bottle_Apple_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Beer; +import static gregtech.common.items.IDMetaItem02.Bottle_Cave_Johnsons_Grenade_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Chilly_Sauce; +import static gregtech.common.items.IDMetaItem02.Bottle_Cider; +import static gregtech.common.items.IDMetaItem02.Bottle_Dark_Beer; +import static gregtech.common.items.IDMetaItem02.Bottle_Diablo_Sauce; +import static gregtech.common.items.IDMetaItem02.Bottle_Diabolo_Sauce; +import static gregtech.common.items.IDMetaItem02.Bottle_Dragon_Blood; +import static gregtech.common.items.IDMetaItem02.Bottle_Glen_McKenner; +import static gregtech.common.items.IDMetaItem02.Bottle_Golden_Apple_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Golden_Cider; +import static gregtech.common.items.IDMetaItem02.Bottle_Grape_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Holy_Water; +import static gregtech.common.items.IDMetaItem02.Bottle_Hops_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Hot_Sauce; +import static gregtech.common.items.IDMetaItem02.Bottle_Iduns_Apple_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Lemon_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Lemonade; +import static gregtech.common.items.IDMetaItem02.Bottle_Leninade; +import static gregtech.common.items.IDMetaItem02.Bottle_Limoncello; +import static gregtech.common.items.IDMetaItem02.Bottle_Milk; +import static gregtech.common.items.IDMetaItem02.Bottle_Mineral_Water; +import static gregtech.common.items.IDMetaItem02.Bottle_Notches_Brew; +import static gregtech.common.items.IDMetaItem02.Bottle_Pirate_Brew; +import static gregtech.common.items.IDMetaItem02.Bottle_Potato_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Purple_Drink; +import static gregtech.common.items.IDMetaItem02.Bottle_Reed_Water; +import static gregtech.common.items.IDMetaItem02.Bottle_Rum; +import static gregtech.common.items.IDMetaItem02.Bottle_Salty_Water; +import static gregtech.common.items.IDMetaItem02.Bottle_Scotch; +import static gregtech.common.items.IDMetaItem02.Bottle_Snitches_Glitch_Sauce; +import static gregtech.common.items.IDMetaItem02.Bottle_Vinegar; +import static gregtech.common.items.IDMetaItem02.Bottle_Vodka; +import static gregtech.common.items.IDMetaItem02.Bottle_Wheaty_Hops_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Wheaty_Juice; +import static gregtech.common.items.IDMetaItem02.Bottle_Wine; +import static gregtech.common.items.IDMetaItem02.Cover_AdvancedRedstoneReceiverExternal; +import static gregtech.common.items.IDMetaItem02.Cover_AdvancedRedstoneReceiverInternal; +import static gregtech.common.items.IDMetaItem02.Cover_AdvancedRedstoneTransmitterExternal; +import static gregtech.common.items.IDMetaItem02.Cover_AdvancedRedstoneTransmitterInternal; +import static gregtech.common.items.IDMetaItem02.Cover_WirelessActivityDetector; +import static gregtech.common.items.IDMetaItem02.Cover_WirelessFluidDetector; +import static gregtech.common.items.IDMetaItem02.Cover_WirelessItemDetector; +import static gregtech.common.items.IDMetaItem02.Cover_WirelessNeedsMaintainance; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Argentia; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Aurelia; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Bauxite; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_BobsYerUncleRanks; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Chilly; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Coppon; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Cucumber; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Ferru; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Grapes; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Ilmenite; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Indigo; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Iridium; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Lemon; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_MTomato; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Manganese; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Mica; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_MilkWart; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Naquadah; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Nickel; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_OilBerry; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Onion; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Osmium; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Pitchblende; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Platinum; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Plumbilia; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Rape; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Scheelite; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_TeaLeaf; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Thorium; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Tine; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Tomato; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_UUABerry; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_UUMBerry; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Uraninite; +import static gregtech.common.items.IDMetaItem02.Crop_Drop_Zinc; +import static gregtech.common.items.IDMetaItem02.Display_ITS_FREE; +import static gregtech.common.items.IDMetaItem02.Dye_Color_00; +import static gregtech.common.items.IDMetaItem02.Dye_Color_01; +import static gregtech.common.items.IDMetaItem02.Dye_Color_02; +import static gregtech.common.items.IDMetaItem02.Dye_Color_03; +import static gregtech.common.items.IDMetaItem02.Dye_Color_04; +import static gregtech.common.items.IDMetaItem02.Dye_Color_05; +import static gregtech.common.items.IDMetaItem02.Dye_Color_06; +import static gregtech.common.items.IDMetaItem02.Dye_Color_07; +import static gregtech.common.items.IDMetaItem02.Dye_Color_08; +import static gregtech.common.items.IDMetaItem02.Dye_Color_09; +import static gregtech.common.items.IDMetaItem02.Dye_Color_10; +import static gregtech.common.items.IDMetaItem02.Dye_Color_11; +import static gregtech.common.items.IDMetaItem02.Dye_Color_12; +import static gregtech.common.items.IDMetaItem02.Dye_Color_13; +import static gregtech.common.items.IDMetaItem02.Dye_Color_14; +import static gregtech.common.items.IDMetaItem02.Dye_Color_15; +import static gregtech.common.items.IDMetaItem02.Dye_Indigo; +import static gregtech.common.items.IDMetaItem02.Food_Baked_Baguette; +import static gregtech.common.items.IDMetaItem02.Food_Baked_Bun; +import static gregtech.common.items.IDMetaItem02.Food_Baked_Cake; +import static gregtech.common.items.IDMetaItem02.Food_Baked_Pizza_Cheese; +import static gregtech.common.items.IDMetaItem02.Food_Baked_Pizza_Meat; +import static gregtech.common.items.IDMetaItem02.Food_Baked_Pizza_Veggie; +import static gregtech.common.items.IDMetaItem02.Food_Burger_Cheese; +import static gregtech.common.items.IDMetaItem02.Food_Burger_Chum; +import static gregtech.common.items.IDMetaItem02.Food_Burger_Meat; +import static gregtech.common.items.IDMetaItem02.Food_Burger_Veggie; +import static gregtech.common.items.IDMetaItem02.Food_Cheese; +import static gregtech.common.items.IDMetaItem02.Food_ChiliChips; +import static gregtech.common.items.IDMetaItem02.Food_Chum; +import static gregtech.common.items.IDMetaItem02.Food_Chum_On_Stick; +import static gregtech.common.items.IDMetaItem02.Food_Dough; +import static gregtech.common.items.IDMetaItem02.Food_Dough_Chocolate; +import static gregtech.common.items.IDMetaItem02.Food_Dough_Sugar; +import static gregtech.common.items.IDMetaItem02.Food_Flat_Dough; +import static gregtech.common.items.IDMetaItem02.Food_Fries; +import static gregtech.common.items.IDMetaItem02.Food_Large_Sandwich_Bacon; +import static gregtech.common.items.IDMetaItem02.Food_Large_Sandwich_Cheese; +import static gregtech.common.items.IDMetaItem02.Food_Large_Sandwich_Steak; +import static gregtech.common.items.IDMetaItem02.Food_Large_Sandwich_Veggie; +import static gregtech.common.items.IDMetaItem02.Food_Packaged_ChiliChips; +import static gregtech.common.items.IDMetaItem02.Food_Packaged_Fries; +import static gregtech.common.items.IDMetaItem02.Food_Packaged_PotatoChips; +import static gregtech.common.items.IDMetaItem02.Food_PotatoChips; +import static gregtech.common.items.IDMetaItem02.Food_Potato_On_Stick; +import static gregtech.common.items.IDMetaItem02.Food_Potato_On_Stick_Roasted; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Baguette; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Bread; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Bun; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Cake; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Cookie; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Fries; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Pizza_Cheese; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Pizza_Meat; +import static gregtech.common.items.IDMetaItem02.Food_Raw_Pizza_Veggie; +import static gregtech.common.items.IDMetaItem02.Food_Raw_PotatoChips; +import static gregtech.common.items.IDMetaItem02.Food_Sandwich_Bacon; +import static gregtech.common.items.IDMetaItem02.Food_Sandwich_Cheese; +import static gregtech.common.items.IDMetaItem02.Food_Sandwich_Steak; +import static gregtech.common.items.IDMetaItem02.Food_Sandwich_Veggie; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Baguette; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Baguettes; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Bread; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Breads; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Bun; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Buns; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Cheese; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Cucumber; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Lemon; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Onion; +import static gregtech.common.items.IDMetaItem02.Food_Sliced_Tomato; +import static gregtech.common.items.IDMetaItem02.GelledToluene; +import static gregtech.common.items.IDMetaItem02.MSFMixture; +import static gregtech.common.items.IDMetaItem02.Plank_Acacia; +import static gregtech.common.items.IDMetaItem02.Plank_Acacia_Green; +import static gregtech.common.items.IDMetaItem02.Plank_Balsa; +import static gregtech.common.items.IDMetaItem02.Plank_Baobab; +import static gregtech.common.items.IDMetaItem02.Plank_Birch; +import static gregtech.common.items.IDMetaItem02.Plank_Cherry; +import static gregtech.common.items.IDMetaItem02.Plank_Chestnut; +import static gregtech.common.items.IDMetaItem02.Plank_Citrus; +import static gregtech.common.items.IDMetaItem02.Plank_DarkOak; +import static gregtech.common.items.IDMetaItem02.Plank_Ebony; +import static gregtech.common.items.IDMetaItem02.Plank_Greenheart; +import static gregtech.common.items.IDMetaItem02.Plank_Jungle; +import static gregtech.common.items.IDMetaItem02.Plank_Kapok; +import static gregtech.common.items.IDMetaItem02.Plank_Larch; +import static gregtech.common.items.IDMetaItem02.Plank_Lime; +import static gregtech.common.items.IDMetaItem02.Plank_Mahagony; +import static gregtech.common.items.IDMetaItem02.Plank_Mahoe; +import static gregtech.common.items.IDMetaItem02.Plank_Maple; +import static gregtech.common.items.IDMetaItem02.Plank_Oak; +import static gregtech.common.items.IDMetaItem02.Plank_Palm; +import static gregtech.common.items.IDMetaItem02.Plank_Papaya; +import static gregtech.common.items.IDMetaItem02.Plank_Pine; +import static gregtech.common.items.IDMetaItem02.Plank_Plum; +import static gregtech.common.items.IDMetaItem02.Plank_Poplar; +import static gregtech.common.items.IDMetaItem02.Plank_Sequoia; +import static gregtech.common.items.IDMetaItem02.Plank_Spruce; +import static gregtech.common.items.IDMetaItem02.Plank_Teak; +import static gregtech.common.items.IDMetaItem02.Plank_Walnut; +import static gregtech.common.items.IDMetaItem02.Plank_Wenge; +import static gregtech.common.items.IDMetaItem02.Plank_Willow; +import static gregtech.common.items.IDMetaItem02.SFMixture; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Cafe_au_lait; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Chocolate_Milk; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Coffee; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Dark_Cafe_au_lait; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Dark_Chocolate_Milk; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Dark_Coffee; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Ice_Tea; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Lait_au_cafe; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Sweet_Tea; +import static gregtech.common.items.IDMetaItem02.ThermosCan_Tea; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnumEnchantmentType; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TCAspects; +import gregtech.api.enums.TierEU; +import gregtech.api.items.MetaGeneratedItemX32; +import gregtech.api.objects.ItemData; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTFoodStat; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.covers.redstone.CoverAdvancedRedstoneReceiverExternal; +import gregtech.common.covers.redstone.CoverAdvancedRedstoneReceiverInternal; +import gregtech.common.covers.redstone.CoverAdvancedRedstoneTransmitterExternal; +import gregtech.common.covers.redstone.CoverAdvancedRedstoneTransmitterInternal; +import gregtech.common.covers.redstone.CoverWirelessDoesWorkDetector; +import gregtech.common.covers.redstone.CoverWirelessFluidDetector; +import gregtech.common.covers.redstone.CoverWirelessItemDetector; +import gregtech.common.covers.redstone.CoverWirelessMaintenanceDetector; +import ic2.api.crops.CropCard; +import ic2.api.crops.Crops; + +public class MetaGeneratedItem02 extends MetaGeneratedItemX32 { + + public static MetaGeneratedItem02 INSTANCE; + private static final String aTextCover = "Usable as Cover"; + + public MetaGeneratedItem02() { + super( + "metaitem.02", + OrePrefixes.toolHeadSword, + OrePrefixes.toolHeadPickaxe, + OrePrefixes.toolHeadShovel, + OrePrefixes.toolHeadAxe, + OrePrefixes.toolHeadHoe, + OrePrefixes.toolHeadHammer, + OrePrefixes.toolHeadFile, + OrePrefixes.toolHeadSaw, + OrePrefixes.toolHeadDrill, + OrePrefixes.toolHeadChainsaw, + OrePrefixes.toolHeadWrench, + OrePrefixes.toolHeadUniversalSpade, + OrePrefixes.toolHeadSense, + OrePrefixes.toolHeadPlow, + OrePrefixes.___placeholder___, + OrePrefixes.toolHeadBuzzSaw, + OrePrefixes.turbineBlade, + null, + OrePrefixes.itemCasing, + OrePrefixes.wireFine, + OrePrefixes.gearGtSmall, + OrePrefixes.rotor, + OrePrefixes.stickLong, + OrePrefixes.springSmall, + OrePrefixes.spring, + OrePrefixes.___placeholder___, + OrePrefixes.___placeholder___, + OrePrefixes.gemChipped, + OrePrefixes.gemFlawed, + OrePrefixes.gemFlawless, + OrePrefixes.gemExquisite, + OrePrefixes.gearGt); + INSTANCE = this; + + ItemList.ThermosCan_Dark_Coffee.set( + addItem( + ThermosCan_Dark_Coffee.ID, + "Dark Coffee", + "Coffee, dark, without anything else", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSpeed.id, + 400, + 1, + 70, + Potion.digSpeed.id, + 400, + 1, + 70), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2L))); + ItemList.ThermosCan_Dark_Cafe_au_lait.set( + addItem( + ThermosCan_Dark_Cafe_au_lait.ID, + "Dark Coffee au lait", + "Keeping you awake the whole night", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSpeed.id, + 400, + 2, + 90, + Potion.digSpeed.id, + 400, + 2, + 90), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 3L))); + ItemList.ThermosCan_Coffee.set( + addItem( + ThermosCan_Coffee.ID, + "Coffee", + "Just the regular morning Coffee", + new GTFoodStat( + 3, + 0.4F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSpeed.id, + 400, + 0, + 50, + Potion.digSpeed.id, + 400, + 0, + 50), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + ItemList.ThermosCan_Cafe_au_lait.set( + addItem( + ThermosCan_Cafe_au_lait.ID, + "Cafe au lait", + "Sweet Coffee", + new GTFoodStat( + 3, + 0.4F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSpeed.id, + 400, + 1, + 70, + Potion.digSpeed.id, + 400, + 1, + 70), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2L))); + ItemList.ThermosCan_Lait_au_cafe.set( + addItem( + ThermosCan_Lait_au_cafe.ID, + "Lait au cafe", + "You want Coffee to your Sugar?", + new GTFoodStat( + 3, + 0.4F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSpeed.id, + 400, + 2, + 90, + Potion.digSpeed.id, + 400, + 2, + 90), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MOTUS, 3L))); + ItemList.ThermosCan_Dark_Chocolate_Milk.set( + addItem( + ThermosCan_Dark_Chocolate_Milk.ID, + "Dark Chocolate Milk", + "A bit bitter, better add a bit Sugar", + new GTFoodStat( + 3, + 0.4F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.regeneration.id, + 50, + 1, + 60), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + ItemList.ThermosCan_Chocolate_Milk.set( + addItem( + ThermosCan_Chocolate_Milk.ID, + "Chocolate Milk", + "Sweet Goodness", + new GTFoodStat( + 3, + 0.4F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.regeneration.id, + 50, + 1, + 90), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 2L))); + ItemList.ThermosCan_Tea.set( + addItem( + ThermosCan_Tea.ID, + "Tea", + "Keep calm and carry on", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSlowdown.id, + 300, + 0, + 50), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + ItemList.ThermosCan_Sweet_Tea.set( + addItem( + ThermosCan_Sweet_Tea.ID, + "Sweet Tea", + "How about a Tea Party? In Boston?", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + ItemList.ThermosCan_Ice_Tea.set( + addItem( + ThermosCan_Ice_Tea.ID, + "Ice Tea", + "Better than this purple Junk Drink from failed Potions", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.ThermosCan_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSlowdown.id, + 300, + 0, + 50), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L))); + + ItemList.GelledToluene.set(addItem(GelledToluene.ID, "Gelled Toluene", "Raw Explosive")); + + ItemList.Bottle_Purple_Drink.set( + addItem( + Bottle_Purple_Drink.ID, + "Purple Drink", + "How about Lemonade. Or some Ice Tea? I got Purple Drink!", + new GTFoodStat( + 8, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.moveSlowdown.id, + 400, + 1, + 90), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.VINCULUM, 1L))); + ItemList.Bottle_Grape_Juice.set( + addItem( + Bottle_Grape_Juice.ID, + "Grape Juice", + "This has a cleaning effect on your internals.", + new GTFoodStat( + 4, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.hunger.id, + 400, + 1, + 60), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + ItemList.Bottle_Wine.set( + addItem( + Bottle_Wine.ID, + "Wine", + "Ordinary", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 400, + 1, + 60, + Potion.heal.id, + 0, + 0, + 60, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + ItemList.Bottle_Vinegar.set( + addItem( + Bottle_Vinegar.ID, + "Vinegar", + "Exquisite", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 400, + 1, + 90, + Potion.heal.id, + 0, + 1, + 90, + Potion.poison.id, + 200, + 2, + 10, + Potion.harm.id, + 0, + 2, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + ItemList.Bottle_Potato_Juice.set( + addItem( + Bottle_Potato_Juice.ID, + "Potato Juice", + "Ever seen Potato Juice in stores? No? That has a reason.", + new GTFoodStat( + 3, + 0.3F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L))); + ItemList.Bottle_Vodka.set( + addItem( + Bottle_Vodka.ID, + "Vodka", + "Not to confuse with Water", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 500, + 0, + 60, + Potion.damageBoost.id, + 500, + 1, + 60, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.TELUM, 1L))); + ItemList.Bottle_Leninade.set( + addItem( + Bottle_Leninade.ID, + "Leninade", + "Let the Communism flow through you!", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 500, + 1, + 90, + Potion.damageBoost.id, + 500, + 2, + 90, + Potion.poison.id, + 200, + 2, + 10, + Potion.harm.id, + 0, + 2, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.TELUM, 2L))); + ItemList.Bottle_Mineral_Water.set( + addItem( + Bottle_Mineral_Water.ID, + "Mineral Water", + "The best Stuff you can drink to stay healthy", + new GTFoodStat( + 1, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.regeneration.id, + 100, + 1, + 10), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 2L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + ItemList.Bottle_Salty_Water.set( + addItem( + Bottle_Salty_Water.ID, + "Salty Water", + "Like Sea Water but less dirty", + SubTag.INVISIBLE, + new GTFoodStat( + 1, + 0.0F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.hunger.id, + 400, + 2, + 95), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.TEMPESTAS, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Bottle_Reed_Water.set( + addItem( + Bottle_Reed_Water.ID, + "Reed Water", + "I guess this tastes better when fermented", + new GTFoodStat( + 1, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + ItemList.Bottle_Rum.set( + addItem( + Bottle_Rum.ID, + "Rum", + "A buddle o' rum", + new GTFoodStat( + 4, + 0.4F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 300, + 0, + 60, + Potion.damageBoost.id, + 300, + 1, + 60, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + ItemList.Bottle_Pirate_Brew.set( + addItem( + Bottle_Pirate_Brew.ID, + "Pirate Brew", + "Set the Sails, we are going to Torrentuga!", + new GTFoodStat( + 4, + 0.4F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 300, + 1, + 90, + Potion.damageBoost.id, + 300, + 2, + 90, + Potion.poison.id, + 200, + 2, + 10, + Potion.harm.id, + 0, + 2, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 2L))); + ItemList.Bottle_Hops_Juice.set( + addItem( + Bottle_Hops_Juice.ID, + "Hops Juice", + "Every Beer has a start", + new GTFoodStat( + 1, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L))); + ItemList.Bottle_Dark_Beer.set( + addItem( + Bottle_Dark_Beer.ID, + "Dark Beer", + "Dark Beer, for the real Men", + new GTFoodStat( + 4, + 0.4F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 300, + 1, + 60, + Potion.damageBoost.id, + 300, + 1, + 60, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L))); + ItemList.Bottle_Dragon_Blood.set( + addItem( + Bottle_Dragon_Blood.ID, + "Dragon Blood", + "FUS RO DAH!", + new GTFoodStat( + 4, + 0.4F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 300, + 2, + 90, + Potion.damageBoost.id, + 300, + 2, + 90, + Potion.poison.id, + 200, + 2, + 10, + Potion.harm.id, + 0, + 2, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2L))); + ItemList.Bottle_Wheaty_Juice.set( + addItem( + Bottle_Wheaty_Juice.ID, + "Wheaty Juice", + "Is this liquefied Bread or what?", + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L))); + ItemList.Bottle_Scotch.set( + addItem( + Bottle_Scotch.ID, + "Scotch", + "Technically this is just a Whisky", + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 400, + 0, + 60, + Potion.resistance.id, + 400, + 1, + 60, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1L))); + ItemList.Bottle_Glen_McKenner.set( + addItem( + Bottle_Glen_McKenner.ID, + "Glen McKenner", + "Don't hand to easily surprised people, they will shatter it.", + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 400, + 1, + 90, + Potion.resistance.id, + 400, + 2, + 90, + Potion.poison.id, + 200, + 2, + 10, + Potion.harm.id, + 0, + 2, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 2L))); + ItemList.Bottle_Wheaty_Hops_Juice.set( + addItem( + Bottle_Wheaty_Hops_Juice.ID, + "Wheaty Hops Juice", + "Also known as 'Duff-Lite'", + new GTFoodStat( + 1, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 2L))); + ItemList.Bottle_Beer.set( + addItem( + Bottle_Beer.ID, + "Beer", + "Good old Beer", + new GTFoodStat( + 6, + 0.4F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 400, + 0, + 60, + Potion.digSpeed.id, + 400, + 2, + 60, + Potion.poison.id, + 100, + 0, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 1L))); + ItemList.Bottle_Chilly_Sauce.set( + addItem( + Bottle_Chilly_Sauce.ID, + "Chilly Sauce", + "Spicy", + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 1000, + 0, + 10, + Potion.fireResistance.id, + 1000, + 0, + 60), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Bottle_Hot_Sauce.set( + addItem( + Bottle_Hot_Sauce.ID, + "Hot Sauce", + "Very Spicy, I guess?", + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 2000, + 0, + 30, + Potion.fireResistance.id, + 2000, + 0, + 70), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2L))); + ItemList.Bottle_Diabolo_Sauce.set( + addItem( + Bottle_Diabolo_Sauce.ID, + "Diabolo Sauce", + "As if the Devil made this Sauce", + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 3000, + 1, + 50, + Potion.fireResistance.id, + 3000, + 0, + 80), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 3L))); + ItemList.Bottle_Diablo_Sauce.set( + addItem( + Bottle_Diablo_Sauce.ID, + "Diablo Sauce", + "Diablo always comes back!", + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 4000, + 1, + 70, + Potion.fireResistance.id, + 4000, + 0, + 90), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 4L))); + ItemList.Bottle_Snitches_Glitch_Sauce.set( + addItem( + Bottle_Snitches_Glitch_Sauce.ID, + "Old Man Snitches glitched Diablo Sauce", + "[Missing No]", + SubTag.INVISIBLE, + new GTFoodStat( + 2, + 0.1F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 9999, + 2, + 999, + Potion.fireResistance.id, + 9999, + 9, + 999), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 3L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 5L))); + ItemList.Bottle_Apple_Juice.set( + addItem( + Bottle_Apple_Juice.ID, + "Apple Juice", + "Made of the Apples from our best Oak Farms", + new GTFoodStat( + 4, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.hunger.id, + 400, + 0, + 20), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + ItemList.Bottle_Cider.set( + addItem( + Bottle_Cider.ID, + "Cider", + "If you have nothing better to do with your Apples", + new GTFoodStat( + 4, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 400, + 0, + 60, + Potion.resistance.id, + 400, + 1, + 60, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1L))); + ItemList.Bottle_Golden_Apple_Juice.set( + addItem( + Bottle_Golden_Apple_Juice.ID, + "Golden Apple Juice", + "A golden Apple in liquid form", + new GTFoodStat( + 4, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.hunger.id, + 400, + 0, + 20, + Potion.field_76444_x.id, + 2400, + 0, + 100, + Potion.regeneration.id, + 100, + 1, + 100), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + ItemList.Bottle_Golden_Cider.set( + addItem( + Bottle_Golden_Cider.ID, + "Golden Cider", + "More Resistance, less Regeneration", + new GTFoodStat( + 4, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.confusion.id, + 400, + 0, + 60, + Potion.field_76444_x.id, + 2400, + 1, + 95, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1L))); + ItemList.Bottle_Iduns_Apple_Juice.set( + addItem( + Bottle_Iduns_Apple_Juice.ID, + "Idun's Apple Juice", + "So you got the Idea of using Notch Apples for a drink?", + new GTFoodStat( + 4, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.regeneration.id, + 600, + 4, + 100, + Potion.field_76444_x.id, + 2400, + 0, + 100, + Potion.resistance.id, + 6000, + 0, + 100, + Potion.fireResistance.id, + 6000, + 0, + 100), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 9L))); + ItemList.Bottle_Notches_Brew.set( + addItem( + Bottle_Notches_Brew.ID, + "Notches Brew", + "This is just overpowered", + new GTFoodStat( + 4, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.regeneration.id, + 700, + 4, + 95, + Potion.field_76444_x.id, + 3000, + 1, + 95, + Potion.resistance.id, + 7000, + 1, + 95, + Potion.fireResistance.id, + 7000, + 0, + 95, + Potion.harm.id, + 0, + 2, + 20), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 9L))); + ItemList.Bottle_Lemon_Juice.set( + addItem( + Bottle_Lemon_Juice.ID, + "Lemon Juice", + "Maybe adding Sugar will make it less sour", + new GTFoodStat( + 2, + 0.4F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.digSpeed.id, + 1200, + 0, + 60), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 1L))); + ItemList.Bottle_Limoncello.set( + addItem( + Bottle_Limoncello.ID, + "Limoncello", + "An alcoholic Drink which tastes like Lemons", + new GTFoodStat( + 2, + 0.4F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.digSpeed.id, + 1200, + 0, + 90, + Potion.poison.id, + 200, + 1, + 5), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 1L))); + ItemList.Bottle_Lemonade.set( + addItem( + Bottle_Lemonade.ID, + "Lemonade", + "Cold and refreshing Lemonade", + new GTFoodStat( + 4, + 0.3F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.digSpeed.id, + 900, + 1, + 90), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 1L))); + ItemList.Bottle_Alcopops.set( + addItem( + Bottle_Alcopops.ID, + "Alcopops", + "Don't let your Children drink this junk!", + new GTFoodStat( + 2, + 0.2F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.digSpeed.id, + 900, + 1, + 90, + Potion.poison.id, + 300, + 2, + 20), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.VINCULUM, 1L))); + ItemList.Bottle_Cave_Johnsons_Grenade_Juice.set( + addItem( + Bottle_Cave_Johnsons_Grenade_Juice.ID, + "Cave Johnson's Grenade Juice", + "When life gives you Lemons, make Life take them Lemons back!", + new GTFoodStat( + 0, + 0.0F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false).setExplosive(), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.MORTUUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 1L))); + ItemList.Bottle_Milk.set( + addItem( + Bottle_Milk.ID, + "Milk", + "Got Milk?", + OrePrefixes.bottle.get(Materials.Milk), + new GTFoodStat( + 0, + 0.0F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false).setMilk(), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + ItemList.Bottle_Holy_Water.set( + addItem( + Bottle_Holy_Water.ID, + "Holy Water", + "May the holy Planks be with you", + OrePrefixes.bottle.get(Materials.HolyWater), + new GTFoodStat( + 0, + 0.0F, + EnumAction.drink, + ItemList.Bottle_Empty.get(1L), + GregTechAPI.sDrinksAlwaysDrinkable, + false, + false, + Potion.poison.id, + 100, + 1, + 100).setMilk(), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.AURAM, 1L))); + + ItemList.Food_Potato_On_Stick.set( + addItem( + Food_Potato_On_Stick.ID, + "Potato on a Stick", + "Totally looks like a Crab Claw", + new GTFoodStat(1, 0.3F, EnumAction.eat, new ItemStack(Items.stick, 1), false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Food_Potato_On_Stick_Roasted.set( + addItem( + Food_Potato_On_Stick_Roasted.ID, + "Roasted Potato on a Stick", + "Still looks like a Crab Claw", + new GTFoodStat(6, 0.6F, EnumAction.eat, new ItemStack(Items.stick, 1), false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Raw_Fries.set( + addItem( + Food_Raw_Fries.ID, + "Potato Strips", + "It's Potato in Stripe Form", + new GTFoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + ItemList.Food_Fries.set( + addItem( + Food_Fries.ID, + "Fries", + "Not to confuse with Fry the Delivery Boy", + new GTFoodStat(7, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Packaged_Fries.set( + addItem( + Food_Packaged_Fries.ID, + "Fries", + "Ketchup not included", + new GTFoodStat( + 7, + 0.5F, + EnumAction.eat, + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 1L), + false, + true, + false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Raw_PotatoChips.set( + addItem( + Food_Raw_PotatoChips.ID, + "Potato Chips (Raw)", + "Just like a Potato", + new GTFoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + ItemList.Food_PotatoChips.set( + addItem( + Food_PotatoChips.ID, + "Potato Chips", + "Crunchy", + new GTFoodStat(7, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_ChiliChips.set( + addItem( + Food_ChiliChips.ID, + "Chili Chips", + "Spicy", + new GTFoodStat(7, 0.6F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Packaged_PotatoChips.set( + addItem( + Food_Packaged_PotatoChips.ID, + "Bag of Potato Chips", + "Full of delicious Air", + new GTFoodStat( + 7, + 0.5F, + EnumAction.eat, + GTOreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1L), + false, + true, + false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Packaged_ChiliChips.set( + addItem( + Food_Packaged_ChiliChips.ID, + "Bag of Chili Chips", + "Stop making noises Baj!", + new GTFoodStat( + 7, + 0.6F, + EnumAction.eat, + GTOreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1L), + false, + true, + false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Chum.set( + addItem( + Food_Chum.ID, + "Chum", + "Chum is Fum!", + new GTFoodStat( + 5, + 0.2F, + EnumAction.eat, + null, + true, + false, + true, + Potion.hunger.id, + 1000, + 4, + 100, + Potion.confusion.id, + 300, + 1, + 80), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Chum_On_Stick.set( + addItem( + Food_Chum_On_Stick.ID, + "Chum on a Stick", + "Don't forget to try our Chum-balaya", + new GTFoodStat( + 5, + 0.2F, + EnumAction.eat, + new ItemStack(Items.stick, 1), + true, + false, + true, + Potion.hunger.id, + 1000, + 4, + 100, + Potion.confusion.id, + 300, + 1, + 80), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Dough_Sugar.set( + addItem( + Food_Dough_Sugar.ID, + "Sugary Dough", + "Don't eat the Dough before it is baken", + new GTFoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Dough_Chocolate.set( + addItem( + Food_Dough_Chocolate.ID, + "Chocolate Dough", + "I said don't eat the Dough!", + new GTFoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Raw_Cookie.set( + addItem( + Food_Raw_Cookie.ID, + "Cookie shaped Dough", + "For baking Cookies", + new GTFoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + + ItemList.Food_Sliced_Buns.set( + addItem( + Food_Sliced_Buns.ID, + "Buns", + "Pre Sliced", + new GTFoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Burger_Veggie.set( + addItem( + Food_Burger_Veggie.ID, + "Veggieburger", + "No matter how you call this, this is NOT a Burger!", + new GTFoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Burger_Cheese.set( + addItem( + Food_Burger_Cheese.ID, + "Cheeseburger", + "Cheesy!", + new GTFoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new ItemData(Materials.Cheese, 907200L))); + ItemList.Food_Burger_Meat.set( + addItem( + Food_Burger_Meat.ID, + "Hamburger", + "The Mc Burger Queen Burger", + new GTFoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Burger_Chum.set( + addItem( + Food_Burger_Chum.ID, + "Chumburger", + "Fum is Chum!", + new GTFoodStat( + 5, + 0.2F, + EnumAction.eat, + null, + true, + false, + true, + Potion.hunger.id, + 1000, + 4, + 100, + Potion.confusion.id, + 300, + 1, + 80), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + + ItemList.Food_Sliced_Breads.set( + addItem( + Food_Sliced_Breads.ID, + "Breads", + "Pre Sliced", + new GTFoodStat(5, 0.6F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sandwich_Veggie.set( + addItem( + Food_Sandwich_Veggie.ID, + "Veggie Sandwich", + "Meatless", + new GTFoodStat(7, 0.6F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sandwich_Cheese.set( + addItem( + Food_Sandwich_Cheese.ID, + "Cheese Sandwich", + "Say Cheese!", + new GTFoodStat(7, 0.6F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sandwich_Bacon.set( + addItem( + Food_Sandwich_Bacon.ID, + "Bacon Sandwich", + "The best Sandwich ever!", + new GTFoodStat(10, 0.8F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sandwich_Steak.set( + addItem( + Food_Sandwich_Steak.ID, + "Steak Sandwich", + "Not a 'Steam Sandwich'", + new GTFoodStat(10, 0.8F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sliced_Baguettes.set( + addItem( + Food_Sliced_Baguettes.ID, + "Baguettes", + "Pre Sliced", + new GTFoodStat(8, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Large_Sandwich_Veggie.set( + addItem( + Food_Large_Sandwich_Veggie.ID, + "Large Veggie Sandwich", + "Just not worth it", + new GTFoodStat(15, 0.8F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 3L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Large_Sandwich_Cheese.set( + addItem( + Food_Large_Sandwich_Cheese.ID, + "Large Cheese Sandwich", + "I need another cheesy tooltip for this", + new GTFoodStat(15, 0.8F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 3L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Large_Sandwich_Bacon.set( + addItem( + Food_Large_Sandwich_Bacon.ID, + "Large Bacon Sandwich", + "For Men! (and manly Women)", + new GTFoodStat(20, 1.0F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Large_Sandwich_Steak.set( + addItem( + Food_Large_Sandwich_Steak.ID, + "Large Steak Sandwich", + "Yes, I once accidentially called it 'Steam Sandwich'", + new GTFoodStat(20, 1.0F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Raw_Pizza_Veggie.set( + addItem( + Food_Raw_Pizza_Veggie.ID, + "Raw Veggie Pizza", + "Into the Oven with it!", + new GTFoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Raw_Pizza_Cheese.set( + addItem( + Food_Raw_Pizza_Cheese.ID, + "Raw Cheese Pizza", + "Into the Oven with it!", + new GTFoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Raw_Pizza_Meat.set( + addItem( + Food_Raw_Pizza_Meat.ID, + "Raw Mince Meat Pizza", + "Into the Oven with it!", + new GTFoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + + ItemList.Food_Baked_Pizza_Veggie.set( + addItem( + Food_Baked_Pizza_Veggie.ID, + "Veggie Pizza", + "The next they want is Gluten Free Pizzas...", + new GTFoodStat(3, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Baked_Pizza_Cheese.set( + addItem( + Food_Baked_Pizza_Cheese.ID, + "Cheese Pizza", + "Pizza Magarita", + new GTFoodStat(4, 0.4F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Baked_Pizza_Meat.set( + addItem( + Food_Baked_Pizza_Meat.ID, + "Mince Meat Pizza", + "Emo Pizza, it cuts itself!", + new GTFoodStat(5, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + + ItemList.Dye_Indigo.set( + addItem( + Dye_Indigo.ID, + "Indigo Dye", + "Blue Dye", + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1L), + Dyes.dyeBlue)); + + int[] Dye_Colors = new int[] { Dye_Color_00.ID, Dye_Color_01.ID, Dye_Color_02.ID, Dye_Color_03.ID, + Dye_Color_04.ID, Dye_Color_05.ID, Dye_Color_06.ID, Dye_Color_07.ID, Dye_Color_08.ID, Dye_Color_09.ID, + Dye_Color_10.ID, Dye_Color_11.ID, Dye_Color_12.ID, Dye_Color_13.ID, Dye_Color_14.ID, Dye_Color_15.ID }; + for (int i = 0; i < 16; i = i + 1) { + ItemList.DYE_ONLY_ITEMS[i].set( + addItem( + Dye_Colors[i], + Dyes.get(i).mName + " Dye", + "", + Dyes.get(i) + .name(), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1L))); + } + + ItemList.Plank_Oak + .set(addItem(Plank_Oak.ID, "Oak Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Spruce.set( + addItem(Plank_Spruce.ID, "Spruce Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Birch + .set(addItem(Plank_Birch.ID, "Birch Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Jungle.set( + addItem(Plank_Jungle.ID, "Jungle Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Acacia.set( + addItem(Plank_Acacia.ID, "Acacia Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_DarkOak.set( + addItem(Plank_DarkOak.ID, "Dark Oak Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Larch + .set(addItem(Plank_Larch.ID, "Larch Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Teak + .set(addItem(Plank_Teak.ID, "Teak Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Acacia_Green.set( + addItem( + Plank_Acacia_Green.ID, + "Green Acacia Plank", + aTextCover, + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Lime + .set(addItem(Plank_Lime.ID, "Lime Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Chestnut.set( + addItem( + Plank_Chestnut.ID, + "Chestnut Plank", + aTextCover, + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Wenge + .set(addItem(Plank_Wenge.ID, "Wenge Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Baobab.set( + addItem(Plank_Baobab.ID, "Baobab Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Sequoia.set( + addItem(Plank_Sequoia.ID, "Sequoia Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Kapok + .set(addItem(Plank_Kapok.ID, "Kapok Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Ebony + .set(addItem(Plank_Ebony.ID, "Ebony Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Mahagony.set( + addItem( + Plank_Mahagony.ID, + "Mahagony Plank", + aTextCover, + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Balsa + .set(addItem(Plank_Balsa.ID, "Balsa Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Willow.set( + addItem(Plank_Willow.ID, "Willow Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Walnut.set( + addItem(Plank_Walnut.ID, "Walnut Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Greenheart.set( + addItem( + Plank_Greenheart.ID, + "Greenheart Plank", + aTextCover, + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Cherry.set( + addItem(Plank_Cherry.ID, "Cherry Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Mahoe + .set(addItem(Plank_Mahoe.ID, "Mahoe Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Poplar.set( + addItem(Plank_Poplar.ID, "Poplar Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Palm + .set(addItem(Plank_Palm.ID, "Palm Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Papaya.set( + addItem(Plank_Papaya.ID, "Papaya Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Pine + .set(addItem(Plank_Pine.ID, "Pine Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Plum + .set(addItem(Plank_Plum.ID, "Plum Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Maple + .set(addItem(Plank_Maple.ID, "Maple Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.Plank_Citrus.set( + addItem(Plank_Citrus.ID, "Citrus Plank", aTextCover, new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + ItemList.SFMixture.set(addItem(SFMixture.ID, "Super Fuel Binder", "Raw Material")); + ItemList.MSFMixture.set(addItem(MSFMixture.ID, "Magic Super Fuel Binder", "Raw Material")); + + ItemList.Crop_Drop_Plumbilia.set( + addItem( + Crop_Drop_Plumbilia.ID, + "Plumbilia Leaf", + "Source of Lead", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 1L))); + ItemList.Crop_Drop_Argentia.set( + addItem( + Crop_Drop_Argentia.ID, + "Argentia Leaf", + "Source of Silver", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + ItemList.Crop_Drop_Indigo.set( + addItem( + Crop_Drop_Indigo.ID, + "Indigo Blossom", + "Used for making Blue Dye", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1L))); + ItemList.Crop_Drop_Ferru.set( + addItem( + Crop_Drop_Ferru.ID, + "Ferru Leaf", + "Source of Iron", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L))); + ItemList.Crop_Drop_Aurelia.set( + addItem( + Crop_Drop_Aurelia.ID, + "Aurelia Leaf", + "Source of Gold", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + ItemList.Crop_Drop_TeaLeaf.set( + addItem( + Crop_Drop_TeaLeaf.ID, + "Tea Leaf", + "Source of Tea", + "cropTea", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + + ItemList.Crop_Drop_OilBerry.set( + addItem( + Crop_Drop_OilBerry.ID, + "Oil Berry", + "Oil in Berry form", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L))); + ItemList.Crop_Drop_BobsYerUncleRanks.set( + addItem( + Crop_Drop_BobsYerUncleRanks.ID, + "Bobs-Yer-Uncle-Berry", + "Source of Emeralds", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + ItemList.Crop_Drop_UUMBerry.set( + addItem( + Crop_Drop_UUMBerry.ID, + "UUM Berry", + "UUM in Berry form", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L))); + ItemList.Crop_Drop_UUABerry.set( + addItem( + Crop_Drop_UUABerry.ID, + "UUA Berry", + "UUA in Berry form", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L))); + + ItemList.Crop_Drop_MilkWart.set( + addItem( + Crop_Drop_MilkWart.ID, + "Milk Wart", + "Source of Milk", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))); + + ItemList.Crop_Drop_Coppon.set( + addItem( + Crop_Drop_Coppon.ID, + "Coppon Fiber", + "ORANGE WOOOOOOOL!!!", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 1L))); + + ItemList.Crop_Drop_Tine.set( + addItem( + Crop_Drop_Tine.ID, + "Tine Twig", + "Source of Tin", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + + ItemList.Crop_Drop_Mica.set( + addItem( + Crop_Drop_Mica.ID, + "Micadia Twig", + "Source of Mica", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 1L))); + + ItemList.Crop_Drop_Bauxite.set(addItem(Crop_Drop_Bauxite.ID, "Bauxia Leaf", "Source of Aluminium")); + ItemList.Crop_Drop_Ilmenite.set(addItem(Crop_Drop_Ilmenite.ID, "Titania Leaf", "Source of Titanium")); + ItemList.Crop_Drop_Pitchblende.set(addItem(Crop_Drop_Pitchblende.ID, "Reactoria Leaf", "Source of Uranium")); + ItemList.Crop_Drop_Uraninite.set(addItem(Crop_Drop_Uraninite.ID, "Uranium Leaf", "Source of Uranite")); + ItemList.Crop_Drop_Thorium.set(addItem(Crop_Drop_Thorium.ID, "Thunder Leaf", "Source of Thorium")); + ItemList.Crop_Drop_Nickel.set(addItem(Crop_Drop_Nickel.ID, "Nickelback Leaf", "Source of Nickel")); + ItemList.Crop_Drop_Zinc.set(addItem(Crop_Drop_Zinc.ID, "Galvania Leaf", "Source of Zinc")); + ItemList.Crop_Drop_Manganese.set(addItem(Crop_Drop_Manganese.ID, "Pyrolusium Leaf", "Source of Manganese")); + ItemList.Crop_Drop_Scheelite.set(addItem(Crop_Drop_Scheelite.ID, "Scheelinium Leaf", "Source of Tungsten")); + ItemList.Crop_Drop_Platinum.set(addItem(Crop_Drop_Platinum.ID, "Platina Leaf", "Source of Platinum")); + ItemList.Crop_Drop_Iridium.set(addItem(Crop_Drop_Iridium.ID, "Quantaria Leaf", "Source of Iridium")); + ItemList.Crop_Drop_Osmium.set(addItem(Crop_Drop_Osmium.ID, "Quantaria Leaf", "Source of Osmium")); + ItemList.Crop_Drop_Naquadah.set(addItem(Crop_Drop_Naquadah.ID, "Stargatium Leaf", "Source of Naquadah")); + + ItemList.Crop_Drop_Chilly.set( + addItem( + Crop_Drop_Chilly.ID, + "Chilly Pepper", + "It is red and hot", + "cropChilipepper", + new GTFoodStat(1, 0.3F, EnumAction.eat, null, false, true, false, Potion.confusion.id, 200, 1, 40), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Crop_Drop_Lemon.set( + addItem( + Crop_Drop_Lemon.ID, + "Lemon", + "Don't make Lemonade", + "cropLemon", + new GTFoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Crop_Drop_Tomato.set( + addItem( + Crop_Drop_Tomato.ID, + "Tomato", + "Solid Ketchup", + "cropTomato", + new GTFoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Crop_Drop_MTomato.set( + addItem( + Crop_Drop_MTomato.ID, + "Max Tomato", + "Full Health in one Tomato", + "cropTomato", + new GTFoodStat( + 9, + 1.0F, + EnumAction.eat, + null, + false, + true, + false, + Potion.regeneration.id, + 100, + 100, + 100), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 3L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Crop_Drop_Grapes.set( + addItem( + Crop_Drop_Grapes.ID, + "Grapes", + "Source of Wine", + "cropGrape", + new GTFoodStat(2, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Crop_Drop_Onion.set( + addItem( + Crop_Drop_Onion.ID, + "Onion", + "Taking over the whole Taste", + "cropOnion", + new GTFoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Crop_Drop_Cucumber.set( + addItem( + Crop_Drop_Cucumber.ID, + "Cucumber", + "Not a Sea Cucumber!", + "cropCucumber", + new GTFoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Crop_Drop_Rape.set( + addItem( + Crop_Drop_Rape.ID, + "Rape", + "Also known as Canola.", + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 1L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1L))); + + ItemList.Food_Cheese.set( + addItem( + Food_Cheese.ID, + "Cheese", + "Click the Cheese", + "foodCheese", + new GTFoodStat(3, 0.6F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 2L))); + ItemList.Food_Dough.set( + addItem( + Food_Dough.ID, + "Dough", + "For making Breads", + "foodDough", + new GTFoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Flat_Dough.set( + addItem( + Food_Flat_Dough.ID, + "Flattened Dough", + "For making Pizza", + new GTFoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Raw_Bread.set( + addItem( + Food_Raw_Bread.ID, + "Dough", + "In Bread Shape", + new GTFoodStat(1, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Raw_Bun.set( + addItem( + Food_Raw_Bun.ID, + "Dough", + "In Bun Shape", + new GTFoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Raw_Baguette.set( + addItem( + Food_Raw_Baguette.ID, + "Dough", + "In Baguette Shape", + new GTFoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Baked_Bun.set( + addItem( + Food_Baked_Bun.ID, + "Bun", + "Do not teleport Bread!", + new GTFoodStat(3, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Baked_Baguette.set( + addItem( + Food_Baked_Baguette.ID, + "Baguette", + "I teleported nothing BUT Bread!!!", + new GTFoodStat(8, 0.5F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sliced_Bread.set( + addItem( + Food_Sliced_Bread.ID, + "Sliced Bread", + "Just half a Bread", + new GTFoodStat(2, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sliced_Bun.set( + addItem( + Food_Sliced_Bun.ID, + "Sliced Bun", + "Just half a Bun", + new GTFoodStat(1, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Sliced_Baguette.set( + addItem( + Food_Sliced_Baguette.ID, + "Sliced Baguette", + "Just half a Baguette", + new GTFoodStat(4, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))); + ItemList.Food_Raw_Cake.set( + addItem( + Food_Raw_Cake.ID, + "Cake Bottom", + "For making Cake", + new GTFoodStat(2, 0.2F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Baked_Cake.set( + addItem( + Food_Baked_Cake.ID, + "Baked Cake Bottom", + "I know I promised you an actual Cake, but well...", + new GTFoodStat(3, 0.3F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + ItemList.Food_Sliced_Lemon.set( + addItem( + Food_Sliced_Lemon.ID, + "Lemon Slice", + "Ideal to put on your Drink", + new GTFoodStat(1, 0.075F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + ItemList.Food_Sliced_Tomato.set( + addItem( + Food_Sliced_Tomato.ID, + "Tomato Slice", + "Solid Ketchup", + new GTFoodStat(1, 0.05F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + ItemList.Food_Sliced_Onion.set( + addItem( + Food_Sliced_Onion.ID, + "Onion Slice", + "ONIONS, UNITE!", + new GTFoodStat(1, 0.05F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + ItemList.Food_Sliced_Cucumber.set( + addItem( + Food_Sliced_Cucumber.ID, + "Cucumber Slice", + "QUEWWW-CUMMM-BERRR!!!", + new GTFoodStat(1, 0.05F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 1L))); + + ItemList.Food_Sliced_Cheese.set( + addItem( + Food_Sliced_Cheese.ID, + "Cheese Slice", + "ALIEN ATTACK!!!, throw the CHEEEEESE!!!", + new GTFoodStat(1, 0.1F, EnumAction.eat, null, false, true, false), + new TCAspects.TC_AspectStack(TCAspects.FAMES, 1L))); + + ItemList.Cover_AdvancedRedstoneTransmitterExternal.set( + addItem( + Cover_AdvancedRedstoneTransmitterExternal.ID, + "Advanced Redstone Transmitter (External)", + "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L))); + ItemList.Cover_AdvancedRedstoneTransmitterInternal.set( + addItem( + Cover_AdvancedRedstoneTransmitterInternal.ID, + "Advanced Redstone Transmitter (Internal)", + "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L))); + ItemList.Cover_AdvancedRedstoneReceiverExternal.set( + addItem( + Cover_AdvancedRedstoneReceiverExternal.ID, + "Advanced Redstone Receiver (External)", + "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L))); + ItemList.Cover_AdvancedRedstoneReceiverInternal.set( + addItem( + Cover_AdvancedRedstoneReceiverInternal.ID, + "Advanced Redstone Receiver (Internal)", + "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L))); + + ItemList.Cover_WirelessFluidDetector.set( + addItem( + Cover_WirelessFluidDetector.ID, + "Wireless Fluid Detector Cover", + "Transfers Fluid Amount as Redstone wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L))); + ItemList.Cover_WirelessItemDetector.set( + addItem( + Cover_WirelessItemDetector.ID, + "Wireless Item Detector Cover", + "Transfers Item Amount as Redstone wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1L))); + + ItemList.Cover_WirelessNeedsMaintainance.set( + addItem( + Cover_WirelessNeedsMaintainance.ID, + "Wireless Needs Maintenance Cover", + "Transfers Maintenance Issues as Redstone wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 4L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 3L))); + + ItemList.Cover_WirelessActivityDetector.set( + addItem( + Cover_WirelessActivityDetector.ID, + "Wireless Activity Detector Cover", + "Transfers Activity as Redstone wirelessly/n Can only connect with advanced wireless covers", + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 2L), + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1L))); + + ItemList.Display_ITS_FREE.set( + addItem( + Display_ITS_FREE.ID, + "ITS FREE", + "(or at least almost free)", + SubTag.INVISIBLE, + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))); + + try { + CropCard tCrop; + GTUtility.getField(tCrop = Crops.instance.getCropList()[13], "mDrop") + .set(tCrop, ItemList.Crop_Drop_Ferru.get(1L)); + GTUtility.getField(tCrop = Crops.instance.getCropList()[14], "mDrop") + .set(tCrop, ItemList.Crop_Drop_Aurelia.get(1L)); + } catch (Throwable e) { + if (GTValues.D1) { + e.printStackTrace(GTLog.err); + } + } + + setAllFluidContainerStats(); + setBurnValues(); + registerCovers(); + initCraftingShapedRecipes(); + initCraftingShapelessRecipes(); + initAssemblerRecipes(); + initExtractorRecipes(); + initMaceratorRecipes(); + initCompressorRecipes(); + } + + @Override + public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + super.onLeftClickEntity(aStack, aPlayer, aEntity); + return false; + } + + @Override + public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) { + int aDamage = aStack.getItemDamage(); + return ((aDamage >= 25000) && (aDamage < 27000)) || (super.hasProjectile(aProjectileType, aStack)); + } + + @Override + public boolean isItemStackUsable(ItemStack aStack) { + int aDamage = aStack.getItemDamage(); + Materials aMaterial = GregTechAPI.sGeneratedMaterials[(aDamage % 1000)]; + if ((aDamage >= 25000) && (aDamage < 27000) && (aMaterial != null) && (aMaterial.mEnchantmentTools != null)) { + Enchantment tEnchant = aMaterial.mEnchantmentTools == Enchantment.fortune ? Enchantment.looting + : aMaterial.mEnchantmentTools; + if (tEnchant.type == EnumEnchantmentType.weapon) { + NBTTagCompound tNBT = GTUtility.ItemNBT.getNBT(aStack); + if (!tNBT.getBoolean("GT.HasBeenUpdated")) { + tNBT.setBoolean("GT.HasBeenUpdated", true); + GTUtility.ItemNBT.setNBT(aStack, tNBT); + GTUtility.ItemNBT.addEnchantment(aStack, tEnchant, aMaterial.mEnchantmentToolsLevel); + } + } + } + return super.isItemStackUsable(aStack); + } + + private void setAllFluidContainerStats() { + setFluidContainerStats(32000 + Food_Raw_Fries.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_Fries.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_Raw_PotatoChips.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_PotatoChips.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_ChiliChips.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_Sandwich_Veggie.ID, 0L, 32L); + setFluidContainerStats(32000 + Food_Sandwich_Cheese.ID, 0L, 32L); + setFluidContainerStats(32000 + Food_Sandwich_Bacon.ID, 0L, 32L); + setFluidContainerStats(32000 + Food_Sandwich_Steak.ID, 0L, 32L); + setFluidContainerStats(32000 + Food_Large_Sandwich_Veggie.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_Large_Sandwich_Cheese.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_Large_Sandwich_Bacon.ID, 0L, 16L); + setFluidContainerStats(32000 + Food_Large_Sandwich_Steak.ID, 0L, 16L); + } + + private void setBurnValues() { + setBurnValue(32000 + Plank_Oak.ID, 75); + setBurnValue(32000 + Plank_Spruce.ID, 75); + setBurnValue(32000 + Plank_Birch.ID, 75); + setBurnValue(32000 + Plank_Jungle.ID, 75); + setBurnValue(32000 + Plank_Acacia.ID, 75); + setBurnValue(32000 + Plank_DarkOak.ID, 75); + setBurnValue(32000 + Plank_Larch.ID, 75); + setBurnValue(32000 + Plank_Teak.ID, 75); + setBurnValue(32000 + Plank_Acacia_Green.ID, 75); + setBurnValue(32000 + Plank_Lime.ID, 75); + setBurnValue(32000 + Plank_Chestnut.ID, 75); + setBurnValue(32000 + Plank_Wenge.ID, 75); + setBurnValue(32000 + Plank_Baobab.ID, 75); + setBurnValue(32000 + Plank_Sequoia.ID, 75); + setBurnValue(32000 + Plank_Kapok.ID, 75); + setBurnValue(32000 + Plank_Ebony.ID, 75); + setBurnValue(32000 + Plank_Mahagony.ID, 75); + setBurnValue(32000 + Plank_Balsa.ID, 75); + setBurnValue(32000 + Plank_Willow.ID, 75); + setBurnValue(32000 + Plank_Walnut.ID, 75); + setBurnValue(32000 + Plank_Greenheart.ID, 75); + setBurnValue(32000 + Plank_Cherry.ID, 75); + setBurnValue(32000 + Plank_Mahoe.ID, 75); + setBurnValue(32000 + Plank_Poplar.ID, 75); + setBurnValue(32000 + Plank_Palm.ID, 75); + setBurnValue(32000 + Plank_Papaya.ID, 75); + setBurnValue(32000 + Plank_Pine.ID, 75); + setBurnValue(32000 + Plank_Plum.ID, 75); + setBurnValue(32000 + Plank_Maple.ID, 75); + setBurnValue(32000 + Plank_Citrus.ID, 75); + setBurnValue(32000 + Crop_Drop_Tine.ID, 100); + setBurnValue(32000 + Crop_Drop_Mica.ID, 240); + } + + public void initCraftingShapedRecipes() { + GTModHandler.addCraftingRecipe( + ItemList.Plank_Oak.get(2L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 0) }); + GTModHandler.addCraftingRecipe( + ItemList.Plank_Spruce.get(2L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Plank_Birch.get(2L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 2) }); + GTModHandler.addCraftingRecipe( + ItemList.Plank_Jungle.get(2L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 3) }); + GTModHandler.addCraftingRecipe( + ItemList.Plank_Acacia.get(2L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 4) }); + GTModHandler.addCraftingRecipe( + ItemList.Plank_DarkOak.get(2L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE, + new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 5) }); + } + + public void initAssemblerRecipes() { + RA.stdBuilder() + .itemInputs( + ItemList.Cover_RedstoneTransmitterExternal.get(1L), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), + GTUtility.getIntegratedCircuit(1)) + .itemOutputs(ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L)) + .duration(2 * MINUTES + 40 * SECONDS) + .eut(TierEU.RECIPE_MV) + .addTo(assemblerRecipes); + RA.stdBuilder() + .itemInputs( + ItemList.Cover_RedstoneReceiverExternal.get(1L), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), + GTUtility.getIntegratedCircuit(1)) + .itemOutputs(ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L)) + .duration(2 * MINUTES + 40 * SECONDS) + .eut(TierEU.RECIPE_MV) + .addTo(assemblerRecipes); + RA.stdBuilder() + .itemInputs( + ItemList.Cover_FluidDetector.get(1L), + ItemList.Emitter_EV.get(1L), + GTUtility.getIntegratedCircuit(1)) + .itemOutputs(ItemList.Cover_WirelessFluidDetector.get(1L)) + .duration(2 * MINUTES + 40 * SECONDS) + .eut(TierEU.RECIPE_MV) + .addTo(assemblerRecipes); + RA.stdBuilder() + .itemInputs( + ItemList.Cover_ItemDetector.get(1L), + ItemList.Emitter_EV.get(1L), + GTUtility.getIntegratedCircuit(1)) + .itemOutputs(ItemList.Cover_WirelessItemDetector.get(1L)) + .duration(2 * MINUTES + 40 * SECONDS) + .eut(TierEU.RECIPE_MV) + .addTo(assemblerRecipes); + RA.stdBuilder() + .itemInputs( + ItemList.Cover_NeedsMaintainance.get(1L), + ItemList.Emitter_EV.get(1L), + GTUtility.getIntegratedCircuit(1)) + .itemOutputs(ItemList.Cover_WirelessNeedsMaintainance.get(1L)) + .duration(2 * MINUTES + 40 * SECONDS) + .eut(TierEU.RECIPE_MV) + .addTo(assemblerRecipes); + RA.stdBuilder() + .itemInputs( + ItemList.Cover_ActivityDetector.get(1L), + ItemList.Emitter_EV.get(1L), + GTUtility.getIntegratedCircuit(1)) + .itemOutputs(ItemList.Cover_WirelessActivityDetector.get(1L)) + .duration(2 * MINUTES + 40 * SECONDS) + .eut(TierEU.RECIPE_MV) + .addTo(assemblerRecipes); + } + + public void initCraftingShapelessRecipes() { + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L), + new Object[] { ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L), + new Object[] { ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L), + new Object[] { ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L), + new Object[] { ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L) }); + } + + public void initExtractorRecipes() { + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 0)) + .itemOutputs(new ItemStack(Items.dye, 2, 1)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 1)) + .itemOutputs(new ItemStack(Items.dye, 2, 12)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 2)) + .itemOutputs(new ItemStack(Items.dye, 2, 13)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 3)) + .itemOutputs(new ItemStack(Items.dye, 2, 7)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 4)) + .itemOutputs(new ItemStack(Items.dye, 2, 1)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 5)) + .itemOutputs(new ItemStack(Items.dye, 2, 14)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 6)) + .itemOutputs(new ItemStack(Items.dye, 2, 7)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 7)) + .itemOutputs(new ItemStack(Items.dye, 2, 9)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 1, 8)) + .itemOutputs(new ItemStack(Items.dye, 2, 7)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.yellow_flower, 1, 0)) + .itemOutputs(new ItemStack(Items.dye, 2, 11)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.double_plant, 1, 0)) + .itemOutputs(new ItemStack(Items.dye, 3, 11)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.double_plant, 1, 1)) + .itemOutputs(new ItemStack(Items.dye, 3, 13)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.double_plant, 1, 4)) + .itemOutputs(new ItemStack(Items.dye, 3, 1)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.double_plant, 1, 5)) + .itemOutputs(new ItemStack(Items.dye, 3, 9)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Plumbilia.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lead, 1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Argentia.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Silver, 1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Indigo.get(1L)) + .itemOutputs(ItemList.Dye_Indigo.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_MilkWart.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Coppon.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Copper, 1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Tine.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tin, 1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(extractorRecipes); + + } + + public void initCompressorRecipes() { + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Coppon.get(4L)) + .itemOutputs(new ItemStack(Blocks.wool, 1, 1)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Plumbilia.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Argentia.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Indigo.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Ferru.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Aurelia.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_OilBerry.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_BobsYerUncleRanks.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Tine.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Rape.get(4L)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.red_flower, 8, 32767)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.yellow_flower, 8, 32767)) + .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L)) + .duration(15 * SECONDS) + .eut(2) + .addTo(compressorRecipes); + } + + public void initMaceratorRecipes() { + RA.stdBuilder() + .itemInputs(ItemList.Food_Sliced_Cheese.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Cheese, 1L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Dye_Cocoa.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Crop_Drop_Tine.get(1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.pumpkin, 1, 0)) + .itemOutputs(new ItemStack(Items.pumpkin_seeds, 4, 0)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(new ItemStack(Items.melon, 1, 0)) + .itemOutputs(new ItemStack(Items.melon_seeds, 1, 0)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("crop", 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(new ItemStack(Items.stick, 1)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.wool, 1, WILDCARD)) + .itemOutputs(new ItemStack(Items.string, 2), new ItemStack(Items.string, 1)) + .outputChances(10000, 5000) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + RA.stdBuilder() + .itemInputs(ItemList.Tesseract.get(1)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, MaterialsUEVplus.TranscendentMetal, 8L)) + .duration(5 * SECONDS) + .eut(TierEU.RECIPE_UIV) + .addTo(maceratorRecipes); + } + + public void registerCovers() { + GregTechAPI.registerCover(ItemList.Plank_Oak.get(1L), TextureFactory.of(Blocks.planks, 0), null); + GregTechAPI.registerCover(ItemList.Plank_Spruce.get(1L), TextureFactory.of(Blocks.planks, 1), null); + GregTechAPI.registerCover(ItemList.Plank_Birch.get(1L), TextureFactory.of(Blocks.planks, 2), null); + GregTechAPI.registerCover(ItemList.Plank_Jungle.get(1L), TextureFactory.of(Blocks.planks, 3), null); + GregTechAPI.registerCover(ItemList.Plank_Acacia.get(1L), TextureFactory.of(Blocks.planks, 4), null); + GregTechAPI.registerCover(ItemList.Plank_DarkOak.get(1L), TextureFactory.of(Blocks.planks, 5), null); + GregTechAPI.registerCover( + ItemList.Plank_Larch.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 0, new ItemStack(Blocks.planks, 1, 0))), + 0), + null); + GregTechAPI.registerCover( + ItemList.Plank_Teak.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 1, new ItemStack(Blocks.planks, 1, 0))), + 1), + null); + GregTechAPI.registerCover( + ItemList.Plank_Acacia_Green.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 2, new ItemStack(Blocks.planks, 1, 0))), + 2), + null); + GregTechAPI.registerCover( + ItemList.Plank_Lime.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 3, new ItemStack(Blocks.planks, 1, 0))), + 3), + null); + GregTechAPI.registerCover( + ItemList.Plank_Chestnut.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 4, new ItemStack(Blocks.planks, 1, 0))), + 4), + null); + GregTechAPI.registerCover( + ItemList.Plank_Wenge.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 5, new ItemStack(Blocks.planks, 1, 0))), + 5), + null); + GregTechAPI.registerCover( + ItemList.Plank_Baobab.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 6, new ItemStack(Blocks.planks, 1, 0))), + 6), + null); + GregTechAPI.registerCover( + ItemList.Plank_Sequoia.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 7, new ItemStack(Blocks.planks, 1, 0))), + 7), + null); + GregTechAPI.registerCover( + ItemList.Plank_Kapok.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 8, new ItemStack(Blocks.planks, 1, 0))), + 8), + null); + GregTechAPI.registerCover( + ItemList.Plank_Ebony.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 9, new ItemStack(Blocks.planks, 1, 0))), + 9), + null); + GregTechAPI.registerCover( + ItemList.Plank_Mahagony.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 10, new ItemStack(Blocks.planks, 1, 0))), + 10), + null); + GregTechAPI.registerCover( + ItemList.Plank_Balsa.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 11, new ItemStack(Blocks.planks, 1, 0))), + 11), + null); + GregTechAPI.registerCover( + ItemList.Plank_Willow.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 12, new ItemStack(Blocks.planks, 1, 0))), + 12), + null); + GregTechAPI.registerCover( + ItemList.Plank_Walnut.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 13, new ItemStack(Blocks.planks, 1, 0))), + 13), + null); + GregTechAPI.registerCover( + ItemList.Plank_Greenheart.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 14, new ItemStack(Blocks.planks, 1, 0))), + 14), + null); + GregTechAPI.registerCover( + ItemList.Plank_Cherry.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 15, new ItemStack(Blocks.planks, 1, 0))), + 15), + null); + GregTechAPI.registerCover( + ItemList.Plank_Mahoe.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 16, new ItemStack(Blocks.planks, 1, 0))), + 0), + null); + GregTechAPI.registerCover( + ItemList.Plank_Poplar.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 17, new ItemStack(Blocks.planks, 1, 0))), + 1), + null); + GregTechAPI.registerCover( + ItemList.Plank_Palm.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 18, new ItemStack(Blocks.planks, 1, 0))), + 2), + null); + GregTechAPI.registerCover( + ItemList.Plank_Papaya.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 19, new ItemStack(Blocks.planks, 1, 0))), + 3), + null); + GregTechAPI.registerCover( + ItemList.Plank_Pine.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 20, new ItemStack(Blocks.planks, 1, 0))), + 4), + null); + GregTechAPI.registerCover( + ItemList.Plank_Plum.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 21, new ItemStack(Blocks.planks, 1, 0))), + 5), + null); + GregTechAPI.registerCover( + ItemList.Plank_Maple.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 22, new ItemStack(Blocks.planks, 1, 0))), + 6), + null); + GregTechAPI.registerCover( + ItemList.Plank_Citrus.get(1L), + TextureFactory.of( + GTUtility.getBlockFromStack( + GTModHandler.getModItem(Forestry.ID, "planks", 1L, 23, new ItemStack(Blocks.planks, 1, 0))), + 7), + null); + + GregTechAPI.registerCover( + ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)), + new CoverAdvancedRedstoneTransmitterExternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER))); + + GregTechAPI.registerCover( + ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)), + new CoverAdvancedRedstoneTransmitterInternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER))); + + GregTechAPI.registerCover( + ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)), + new CoverAdvancedRedstoneReceiverExternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER))); + + GregTechAPI.registerCover( + ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)), + new CoverAdvancedRedstoneReceiverInternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER))); + + GregTechAPI.registerCover( + ItemList.Cover_WirelessFluidDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_FLUID_DETECTOR)), + new CoverWirelessFluidDetector(TextureFactory.of(OVERLAY_WIRELESS_FLUID_DETECTOR))); + + GregTechAPI.registerCover( + ItemList.Cover_WirelessItemDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_ITEM_DETECTOR)), + new CoverWirelessItemDetector(TextureFactory.of(OVERLAY_WIRELESS_ITEM_DETECTOR))); + + GregTechAPI.registerCover( + ItemList.Cover_WirelessActivityDetector.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_ACTIVITYDETECTOR)), + new CoverWirelessDoesWorkDetector(TextureFactory.of(OVERLAY_WIRELESS_ACTIVITYDETECTOR))); + + GregTechAPI.registerCover( + ItemList.Cover_WirelessNeedsMaintainance.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_MAINTENANCE_DETECTOR)), + new CoverWirelessMaintenanceDetector(TextureFactory.of(OVERLAY_WIRELESS_MAINTENANCE_DETECTOR))); + } + + @Override + public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { + return (aDoShowAllItems) || (!aPrefix.name() + .startsWith("toolHead")); + } + + @Override + public final ItemStack getContainerItem(ItemStack aStack) { + int aDamage = aStack.getItemDamage(); + if (aDamage < 32000) { + return null; + } + if (aDamage < 32100) { + return ItemList.ThermosCan_Empty.get(1L); + } + if (aDamage < 32200) { + return ItemList.Bottle_Empty.get(1L); + } + return null; + } +} diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem03.java b/src/main/java/gregtech/common/items/MetaGeneratedItem03.java new file mode 100644 index 0000000000..f06448d175 --- /dev/null +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem03.java @@ -0,0 +1,1492 @@ +package gregtech.common.items; + +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.addItemTooltip; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_METRICS_TRANSMITTER; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UEV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UHV; +import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UIV; +import static gregtech.client.GTTooltipHandler.Tier.EV; +import static gregtech.client.GTTooltipHandler.Tier.HV; +import static gregtech.client.GTTooltipHandler.Tier.IV; +import static gregtech.client.GTTooltipHandler.Tier.LV; +import static gregtech.client.GTTooltipHandler.Tier.LuV; +import static gregtech.client.GTTooltipHandler.Tier.MAX; +import static gregtech.client.GTTooltipHandler.Tier.MV; +import static gregtech.client.GTTooltipHandler.Tier.UEV; +import static gregtech.client.GTTooltipHandler.Tier.UHV; +import static gregtech.client.GTTooltipHandler.Tier.UIV; +import static gregtech.client.GTTooltipHandler.Tier.ULV; +import static gregtech.client.GTTooltipHandler.Tier.UMV; +import static gregtech.client.GTTooltipHandler.Tier.UV; +import static gregtech.client.GTTooltipHandler.Tier.UXV; +import static gregtech.client.GTTooltipHandler.Tier.ZPM; +import static gregtech.client.GTTooltipHandler.registerTieredTooltip; +import static gregtech.common.items.IDMetaItem03.Activated_Carbon_Filter_Mesh; +import static gregtech.common.items.IDMetaItem03.Circuit_Biomainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_Bioprocessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Biowarecomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Biowaresupercomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Bio; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Bio_Ultra; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Coated_Basic; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Epoxy_Advanced; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Fiberglass_Advanced; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Multifiberglass_Elite; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Optical; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Phenolic_Good; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Plastic; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Plastic_Advanced; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Wetware; +import static gregtech.common.items.IDMetaItem03.Circuit_Board_Wetware_Extreme; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_BioCPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_Biocell; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_CPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_CrystalCPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_CrystalSoC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_CrystalSoC2; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_HPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_ILC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_LPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_NAND; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_NOR; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_NPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_NanoCPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_NeuroCPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_Optical; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_PIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_PPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_QPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_QuantumCPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_Ram; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_Simple_SoC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_SoC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_SoC2; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_Stemcell; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_UHPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Chip_ULPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_CosmicAssembly; +import static gregtech.common.items.IDMetaItem03.Circuit_CosmicComputer; +import static gregtech.common.items.IDMetaItem03.Circuit_CosmicMainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_CosmicProcessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Crystalcomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Crystalmainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_Crystalprocessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Elitenanocomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_ExoticAssembly; +import static gregtech.common.items.IDMetaItem03.Circuit_ExoticComputer; +import static gregtech.common.items.IDMetaItem03.Circuit_ExoticMainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_ExoticProcessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Integrated_Good; +import static gregtech.common.items.IDMetaItem03.Circuit_Masterquantumcomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Microprocessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Nanocomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Nanoprocessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Neuroprocessor; +import static gregtech.common.items.IDMetaItem03.Circuit_OpticalAssembly; +import static gregtech.common.items.IDMetaItem03.Circuit_OpticalComputer; +import static gregtech.common.items.IDMetaItem03.Circuit_OpticalMainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_OpticalProcessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_CapacitorASMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_CapacitorSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_CapacitorXSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_Chip_Bioware; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_Coil; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_DiodeASMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_DiodeSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_DiodeXSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_GlassFiber; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_Glass_Tube; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_InductorASMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_InductorSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_InductorXSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_PetriDish; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_RawCrystalChip; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_RawCrystalParts; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_Reinforced_Glass_Tube; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_ResistorASMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_ResistorSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_ResistorXSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_TransistorASMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_TransistorSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Parts_TransistorXSMD; +import static gregtech.common.items.IDMetaItem03.Circuit_Processor; +import static gregtech.common.items.IDMetaItem03.Circuit_Quantumcomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Quantummainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_Quantumprocessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Ingot; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Ingot2; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Ingot3; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Ingot4; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Ingot5; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Ingot6; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Wafer; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Wafer2; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Wafer3; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Wafer4; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Wafer5; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Wafer6; +import static gregtech.common.items.IDMetaItem03.Circuit_Silicon_Wafer7; +import static gregtech.common.items.IDMetaItem03.Circuit_TranscendentAssembly; +import static gregtech.common.items.IDMetaItem03.Circuit_TranscendentComputer; +import static gregtech.common.items.IDMetaItem03.Circuit_TranscendentMainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_TranscendentProcessor; +import static gregtech.common.items.IDMetaItem03.Circuit_Ultimatecrystalcomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_Bioware; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_CPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_HPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_ILC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_LPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_NAND; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_NOR; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_NPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_NanoCPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_PIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_PPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_QPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_QuantumCPU; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_Ram; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_Simple_SoC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_SoC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_SoC2; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_UHPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wafer_ULPIC; +import static gregtech.common.items.IDMetaItem03.Circuit_Wetwarecomputer; +import static gregtech.common.items.IDMetaItem03.Circuit_Wetwaremainframe; +import static gregtech.common.items.IDMetaItem03.Circuit_Wetwaresupercomputer; +import static gregtech.common.items.IDMetaItem03.Cover_Metrics_Transmitter; +import static gregtech.common.items.IDMetaItem03.Cover_SolarPanel_UEV; +import static gregtech.common.items.IDMetaItem03.Cover_SolarPanel_UHV; +import static gregtech.common.items.IDMetaItem03.Cover_SolarPanel_UIV; +import static gregtech.common.items.IDMetaItem03.EV_Coil; +import static gregtech.common.items.IDMetaItem03.GalliumArsenideCrystal; +import static gregtech.common.items.IDMetaItem03.GalliumArsenideCrystalSmallPart; +import static gregtech.common.items.IDMetaItem03.HV_Coil; +import static gregtech.common.items.IDMetaItem03.IV_Coil; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_AUTOMATION; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_1; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_2; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_3; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_4; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_5; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_6; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_7; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_8; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Acceleration_8_Upgraded; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_COOLER; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_DESERT; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_DRYER; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_FLOWERING; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_Frame; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_HEATER; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_HELL; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_HUMIDIFIER; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_JUNGLE; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_LIFESPAN; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_LIGHT; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_OCEAN; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_PLAINS; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_POLLEN; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_PRODUCTION; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_SEAL; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_SIEVE; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_SKY; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_STABILIZER; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_TERRITORY; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_UNLIGHT; +import static gregtech.common.items.IDMetaItem03.IndustrialApiary_Upgrade_WINTER; +import static gregtech.common.items.IDMetaItem03.KevlarFiber; +import static gregtech.common.items.IDMetaItem03.LV_Coil; +import static gregtech.common.items.IDMetaItem03.LuV_Coil; +import static gregtech.common.items.IDMetaItem03.MV_Coil; +import static gregtech.common.items.IDMetaItem03.NandChip; +import static gregtech.common.items.IDMetaItem03.NuclearStar; +import static gregtech.common.items.IDMetaItem03.Optical_Cpu_Containment_Housing; +import static gregtech.common.items.IDMetaItem03.Optically_Compatible_Memory; +import static gregtech.common.items.IDMetaItem03.Optically_Perfected_CPU; +import static gregtech.common.items.IDMetaItem03.Phononic_Seed_Crystal; +import static gregtech.common.items.IDMetaItem03.Quark_Catalyst_Housing; +import static gregtech.common.items.IDMetaItem03.Quark_Creation_Catalyst_Bottom; +import static gregtech.common.items.IDMetaItem03.Quark_Creation_Catalyst_Charm; +import static gregtech.common.items.IDMetaItem03.Quark_Creation_Catalyst_Down; +import static gregtech.common.items.IDMetaItem03.Quark_Creation_Catalyst_Strange; +import static gregtech.common.items.IDMetaItem03.Quark_Creation_Catalyst_Top; +import static gregtech.common.items.IDMetaItem03.Quark_Creation_Catalyst_Unaligned; +import static gregtech.common.items.IDMetaItem03.Quark_Creation_Catalyst_Up; +import static gregtech.common.items.IDMetaItem03.Relativistic_Heat_Capacitor; +import static gregtech.common.items.IDMetaItem03.Spinneret; +import static gregtech.common.items.IDMetaItem03.Thermal_Superconductor; +import static gregtech.common.items.IDMetaItem03.Timepiece; +import static gregtech.common.items.IDMetaItem03.Transdimensional_Alignment_Matrix; +import static gregtech.common.items.IDMetaItem03.Tube_Wires; +import static gregtech.common.items.IDMetaItem03.UHV_Coil; +import static gregtech.common.items.IDMetaItem03.ULV_Coil; +import static gregtech.common.items.IDMetaItem03.UV_Coil; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Axe; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Block; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Bolt; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Bottle; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Casing; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Cell; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_File; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Gear; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Hammer; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Hoe; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Ingot; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Pickaxe; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Pipe_Huge; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Pipe_Large; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Pipe_Medium; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Pipe_Small; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Pipe_Tiny; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Plate; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Ring; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Rod; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Rotor; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Saw; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Shovel; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Small_Gear; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Sword; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_ToolHeadDrill; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Turbine_Blade; +import static gregtech.common.items.IDMetaItem03.White_Dwarf_Shape_Extruder_Wire; +import static gregtech.common.items.IDMetaItem03.WovenKevlar; +import static gregtech.common.items.IDMetaItem03.ZPM_Coil; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TCAspects; +import gregtech.api.items.MetaGeneratedItemX32; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.common.covers.CoverMetricsTransmitter; +import gregtech.common.covers.CoverSolarPanel; + +public class MetaGeneratedItem03 extends MetaGeneratedItemX32 { + + public static MetaGeneratedItem03 INSTANCE; + + public MetaGeneratedItem03() { + super( + "metaitem.03", + OrePrefixes.___placeholder___, + OrePrefixes.___placeholder___, + OrePrefixes.___placeholder___, + OrePrefixes.___placeholder___, + OrePrefixes.nanite, + OrePrefixes.rawOre); + INSTANCE = this; + Object[] o = new Object[0]; + + /* + * circuit boards tier 1-7: coated circuit board / wood plate + resin Plastic Circuit Board / Plastic + Copper + * Foil + Sulfuric Acid phenolic circuit board /carton+glue+chemical bath epoxy circuit board /epoxy plate + + * copper foil + sulfuric acid fiberglass circuit board (simple + multilayer) / glass + plastic + electrum foil + * + sulfuric acid wetware lifesupport board / fiberglass CB + teflon + + */ + ItemList.Circuit_Board_Wetware.set( + addItem(Circuit_Board_Wetware.ID, "Wetware Lifesupport Circuit Board", "The Board that keeps life", o)); + ItemList.Circuit_Board_Plastic + .set(addItem(Circuit_Board_Plastic.ID, "Plastic Circuit Board", "A Good Board", o)); + ItemList.Circuit_Board_Bio + .set(addItem(Circuit_Board_Bio.ID, "Bio Circuit Board", "Bio genetic mutated Board", o)); + + /* + * electronic components: vacuum tube (glass tube + red alloy cables) basic electronic circuits normal+smd coils + * diodes normal+smd transistors normal+smd capacitors normal+smd Glass Fibers + */ + ItemList.Circuit_Parts_ResistorSMD.set( + addItem( + Circuit_Parts_ResistorSMD.ID, + "SMD Resistor", + "Electronic Component", + OrePrefixes.componentCircuit.get(Materials.Resistor), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Parts_Glass_Tube.set(addItem(Circuit_Parts_Glass_Tube.ID, "Glass Tube", "", o)); + ItemList.Circuit_Parts_Coil.set(addItem(Circuit_Parts_Coil.ID, "Small Coil", "Basic Electronic Component", o)); + ItemList.Circuit_Parts_DiodeSMD.set( + addItem( + Circuit_Parts_DiodeSMD.ID, + "SMD Diode", + "Electronic Component", + OrePrefixes.componentCircuit.get(Materials.Diode), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Parts_TransistorSMD.set( + addItem( + Circuit_Parts_TransistorSMD.ID, + "SMD Transistor", + "Electronic Component", + OrePrefixes.componentCircuit.get(Materials.Transistor), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Parts_CapacitorSMD.set( + addItem( + Circuit_Parts_CapacitorSMD.ID, + "SMD Capacitor", + "Electronic Component", + OrePrefixes.componentCircuit.get(Materials.Capacitor), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Parts_GlassFiber + .set(addItem(Circuit_Parts_GlassFiber.ID, "Glass Fiber", Materials.BorosilicateGlass.mChemicalFormula, o)); + ItemList.Circuit_Parts_PetriDish + .set(addItem(Circuit_Parts_PetriDish.ID, "Petri Dish", "For cultivating cells", o)); + ItemList.Circuit_Parts_Reinforced_Glass_Tube + .set(addItem(Circuit_Parts_Reinforced_Glass_Tube.ID, "Reinforced Glass Tube", "", o)); + + ItemList.Circuit_Parts_ResistorASMD + .set(addItem(Circuit_Parts_ResistorASMD.ID, "Advanced SMD Resistor", "Advanced Electronic Component", o)); + ItemList.Circuit_Parts_DiodeASMD + .set(addItem(Circuit_Parts_DiodeASMD.ID, "Advanced SMD Diode", "Advanced Electronic Component", o)); + ItemList.Circuit_Parts_TransistorASMD.set( + addItem(Circuit_Parts_TransistorASMD.ID, "Advanced SMD Transistor", "Advanced Electronic Component", o)); + ItemList.Circuit_Parts_CapacitorASMD + .set(addItem(Circuit_Parts_CapacitorASMD.ID, "Advanced SMD Capacitor", "Advanced Electronic Component", o)); + + ItemList.Circuit_Parts_ResistorXSMD.set( + addItem(Circuit_Parts_ResistorXSMD.ID, "Optical SMD Resistor", "Highly Advanced Electronic Component", o)); + ItemList.Circuit_Parts_DiodeXSMD + .set(addItem(Circuit_Parts_DiodeXSMD.ID, "Optical SMD Diode", "Highly Advanced Electronic Component", o)); + ItemList.Circuit_Parts_TransistorXSMD.set( + addItem( + Circuit_Parts_TransistorXSMD.ID, + "Optical SMD Transistor", + "Highly Advanced Electronic Component", + o)); + ItemList.Circuit_Parts_CapacitorXSMD.set( + addItem( + Circuit_Parts_CapacitorXSMD.ID, + "Optical SMD Capacitor", + "Highly Advanced Electronic Component", + o)); + + ItemList.Circuit_Parts_InductorSMD.set( + addItem( + Circuit_Parts_InductorSMD.ID, + "SMD Inductor", + "Electronic Component", + OrePrefixes.componentCircuit.get(Materials.Inductor), + SubTag.NO_UNIFICATION)); + ItemList.Circuit_Parts_InductorASMD + .set(addItem(Circuit_Parts_InductorASMD.ID, "Advanced SMD Inductor", "Advanced Electronic Component", o)); + ItemList.Circuit_Parts_InductorXSMD.set( + addItem(Circuit_Parts_InductorXSMD.ID, "Optical SMD Inductor", "Highly Advanced Electronic Component", o)); + + /* + * ICs Lenses made from perfect crystals first instead of plates Monocrystalline silicon ingot + * (normal+glowstone+naquadah) EBF, normal silicon no EBF need anymore wafer(normal+glowstone+naquadah) cut mono + * silicon ingot in cutting machine + * Integrated Logic Circuit(8bit DIP) RAM NAND Memory NOR Memory CPU (4 sizes) SoCs(2 sizes, high tier cheap low + * tech component) Power IC/High Power IC/Ultra High power + * nanotube interconnected circuit (H-IC + nanotubes) + * quantum chips + */ + ItemList.Circuit_Silicon_Ingot + .set(addItem(Circuit_Silicon_Ingot.ID, "Monocrystalline Silicon Boule", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Ingot2.set( + addItem(Circuit_Silicon_Ingot2.ID, "Phosphorus doped Monocrystalline Silicon Boule", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Ingot3 + .set(addItem(Circuit_Silicon_Ingot3.ID, "Naquadah doped Monocrystalline Silicon Boule", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Ingot4 + .set(addItem(Circuit_Silicon_Ingot4.ID, "Europium doped Monocrystalline Silicon Boule", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Ingot5 + .set(addItem(Circuit_Silicon_Ingot5.ID, "Americium doped Monocrystalline Silicon Boule", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Ingot6 + .set(addItem(Circuit_Silicon_Ingot6.ID, "Optically Enriched Crystalline Boule", "Raw Circuit", o)); + + ItemList.Circuit_Silicon_Wafer.set(addItem(Circuit_Silicon_Wafer.ID, "Wafer", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Wafer2 + .set(addItem(Circuit_Silicon_Wafer2.ID, "Phosphorus doped Wafer", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Wafer3 + .set(addItem(Circuit_Silicon_Wafer3.ID, "Naquadah doped Wafer", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Wafer4 + .set(addItem(Circuit_Silicon_Wafer4.ID, "Europium doped Wafer", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Wafer5 + .set(addItem(Circuit_Silicon_Wafer5.ID, "Americium doped Wafer", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Wafer6 + .set(addItem(Circuit_Silicon_Wafer6.ID, "Photonically Prepared Wafer", "Raw Circuit", o)); + ItemList.Circuit_Silicon_Wafer7 + .set(addItem(Circuit_Silicon_Wafer7.ID, "Photonically Enhanced Wafer", "Raw Circuit", o)); + + ItemList.Circuit_Wafer_ILC + .set(addItem(Circuit_Wafer_ILC.ID, "Integrated Logic Circuit (Wafer)", "Raw Circuit", o)); + ItemList.Circuit_Chip_ILC + .set(addItem(Circuit_Chip_ILC.ID, "Integrated Logic Circuit", "Integrated Circuit", o)); + + ItemList.Circuit_Wafer_Ram + .set(addItem(Circuit_Wafer_Ram.ID, "Random Access Memory Chip (Wafer)", "Raw Circuit", o)); + ItemList.Circuit_Chip_Ram + .set(addItem(Circuit_Chip_Ram.ID, "Random Access Memory Chip", "Integrated Circuit", o)); + + ItemList.Circuit_Wafer_NAND.set(addItem(Circuit_Wafer_NAND.ID, "NAND Memory Chip (Wafer)", "Raw Circuit", o)); + ItemList.Circuit_Chip_NAND.set(addItem(Circuit_Chip_NAND.ID, "NAND Memory Chip", "Integrated Circuit", o)); + + ItemList.Circuit_Wafer_NOR.set(addItem(Circuit_Wafer_NOR.ID, "NOR Memory Chip (Wafer)", "Raw Circuit", o)); + ItemList.Circuit_Chip_NOR.set(addItem(Circuit_Chip_NOR.ID, "NOR Memory Chip", "Integrated Circuit", o)); + + ItemList.Circuit_Wafer_CPU + .set(addItem(Circuit_Wafer_CPU.ID, "Central Processing Unit (Wafer)", "Raw Circuit", o)); + ItemList.Circuit_Chip_CPU.set(addItem(Circuit_Chip_CPU.ID, "Central Processing Unit", "Integrated Circuit", o)); + + ItemList.Circuit_Wafer_SoC.set(addItem(Circuit_Wafer_SoC.ID, "SoC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_SoC.set(addItem(Circuit_Chip_SoC.ID, "SoC", "System on a Chip", o)); + + ItemList.Circuit_Wafer_SoC2.set(addItem(Circuit_Wafer_SoC2.ID, "ASoC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_SoC2.set(addItem(Circuit_Chip_SoC2.ID, "ASoC", "Advanced System on a Chip", o)); + + ItemList.Circuit_Wafer_PIC.set(addItem(Circuit_Wafer_PIC.ID, "PIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_PIC.set(addItem(Circuit_Chip_PIC.ID, "Power IC", "Power Circuit", o)); + + ItemList.Circuit_Wafer_HPIC.set(addItem(Circuit_Wafer_HPIC.ID, "HPIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_HPIC.set(addItem(Circuit_Chip_HPIC.ID, "High Power IC", "High Power Circuit", o)); + + ItemList.Circuit_Wafer_NanoCPU.set(addItem(Circuit_Wafer_NanoCPU.ID, "NanoCPU Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_NanoCPU + .set(addItem(Circuit_Chip_NanoCPU.ID, "Nanocomponent Central Processing Unit", "Power Circuit", o)); + + ItemList.Circuit_Wafer_QuantumCPU.set(addItem(Circuit_Wafer_QuantumCPU.ID, "QBit Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_QuantumCPU + .set(addItem(Circuit_Chip_QuantumCPU.ID, "QBit Processing Unit", "Quantum CPU", o)); + + ItemList.Circuit_Wafer_UHPIC.set(addItem(Circuit_Wafer_UHPIC.ID, "UHPIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_UHPIC + .set(addItem(Circuit_Chip_UHPIC.ID, "Ultra High Power IC", "Ultra High Power Circuit", o)); + + ItemList.Circuit_Wafer_Simple_SoC + .set(addItem(Circuit_Wafer_Simple_SoC.ID, "Simple SoC Wafer", "Raw Primitive Circuit", o)); + ItemList.Circuit_Chip_Simple_SoC + .set(addItem(Circuit_Chip_Simple_SoC.ID, "Simple SoC", "Simple System on a Chip", o)); + + ItemList.Circuit_Wafer_ULPIC.set(addItem(Circuit_Wafer_ULPIC.ID, "ULPIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_ULPIC + .set(addItem(Circuit_Chip_ULPIC.ID, "Ultra Low Power IC", "Ultra Low Power Circuit", o)); + + ItemList.Circuit_Wafer_LPIC.set(addItem(Circuit_Wafer_LPIC.ID, "LPIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_LPIC.set(addItem(Circuit_Chip_LPIC.ID, "Low Power IC", "Low Power Circuit", o)); + + ItemList.Circuit_Wafer_NPIC.set(addItem(Circuit_Wafer_NPIC.ID, "NPIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_NPIC.set(addItem(Circuit_Chip_NPIC.ID, "Nano Power IC", "Nano Power Circuit", o)); + + ItemList.Circuit_Wafer_PPIC.set(addItem(Circuit_Wafer_PPIC.ID, "PPIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_PPIC.set(addItem(Circuit_Chip_PPIC.ID, "Piko Power IC", "Piko Power Circuit", o)); + + ItemList.Circuit_Wafer_QPIC.set(addItem(Circuit_Wafer_QPIC.ID, "QPIC Wafer", "Raw Circuit", o)); + ItemList.Circuit_Chip_QPIC.set(addItem(Circuit_Chip_QPIC.ID, "Quantum Power IC", "Quantum Power Circuit", o)); + + ItemList.Circuit_Wafer_Bioware.set(addItem(Circuit_Wafer_Bioware.ID, "Living Bio Wafer", "Raw Circuit", o)); + ItemList.Circuit_Parts_Chip_Bioware + .set(addItem(Circuit_Parts_Chip_Bioware.ID, "Living Bio Chip", "Needed for Circuits", o)); + /* + * Engraved Crystal Chip Engraved Lapotron Chip Crystal CPU SoCrystal stem cells (disassemble eggs) + */ + ItemList.Circuit_Chip_CrystalSoC2.set( + addItem(Circuit_Chip_CrystalSoC2.ID, "Raw Advanced Crystal Chip", "Raw Advanced Crystal Processor", o)); + ItemList.Circuit_Parts_RawCrystalChip + .set(addItem(Circuit_Parts_RawCrystalChip.ID, "Raw Crystal Chip", "Raw Crystal Processor", o)); + ItemList.Circuit_Chip_CrystalCPU + .set(addItem(Circuit_Chip_CrystalCPU.ID, "Crystal Processing Unit", "Crystal CPU", o)); // Crystal + // chip + // elite + // part + ItemList.Circuit_Chip_CrystalSoC + .set(addItem(Circuit_Chip_CrystalSoC.ID, "Crystal SoC", "Crystal System on a Chip", o)); + ItemList.Circuit_Chip_NeuroCPU.set(addItem(Circuit_Chip_NeuroCPU.ID, "Neuro Processing Unit", "Neuro CPU", o)); + ItemList.Circuit_Chip_Stemcell.set(addItem(Circuit_Chip_Stemcell.ID, "Stemcells", "Raw inteligence", o)); + ItemList.Circuit_Parts_RawCrystalParts + .set(addItem(Circuit_Parts_RawCrystalParts.ID, "Raw Crystal Chip Parts", "Raw Crystal Processor Parts", o)); + ItemList.Circuit_Chip_Biocell.set(addItem(Circuit_Chip_Biocell.ID, "Biocells", "Mutated Raw inteligence", o)); + ItemList.Circuit_Chip_BioCPU.set(addItem(Circuit_Chip_BioCPU.ID, "Bio Processing Unit", "Bio CPU", o)); + ItemList.Circuit_Chip_Optical + .set(addItem(Circuit_Chip_Optical.ID, "Raw Exposed Optical Chip", "Raw Optical Chip", o)); + + // Nand Chip + ItemList.NandChip.set( + addItem( + NandChip.ID, + "NAND Chip", + "A very simple Circuit", + OrePrefixes.circuit.get(Materials.ULV), + SubTag.NO_UNIFICATION)); + + // Vacuum Tube Item01 + // Basic Circuit IC2 + // Good Circuit Item01 + + // Integrated Logic Circuit Item01 + ItemList.Circuit_Integrated_Good.set( + addItem( + Circuit_Integrated_Good.ID, + "Good Integrated Circuit", + "Good Circuit", + OrePrefixes.circuit.get(Materials.MV), + SubTag.NO_UNIFICATION)); + + // Good Integrated Circuit Item01 + // Advanced Circuit IC2 + + ItemList.Circuit_Microprocessor.set( + addItem( + Circuit_Microprocessor.ID, + "Microprocessor", + "A Basic Circuit", + OrePrefixes.circuit.get(Materials.LV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Processor.set( + addItem( + Circuit_Processor.ID, + "Integrated Processor", + "A Good Circuit", + OrePrefixes.circuit.get(Materials.MV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Nanoprocessor.set( + addItem( + Circuit_Nanoprocessor.ID, + "Nanoprocessor", + "An Advanced Circuit", + OrePrefixes.circuit.get(Materials.HV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Nanocomputer.set( + addItem( + Circuit_Nanocomputer.ID, + "Nanoprocessor Assembly", + "An Extreme Circuit", + OrePrefixes.circuit.get(Materials.EV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Elitenanocomputer.set( + addItem( + Circuit_Elitenanocomputer.ID, + "Elite Nanocomputer", + "An Elite Circuit", + OrePrefixes.circuit.get(Materials.IV), + SubTag.NO_UNIFICATION)); + + // Quantum circuits + ItemList.Circuit_Quantumprocessor.set( + addItem( + Circuit_Quantumprocessor.ID, + "Quantumprocessor", + "An Extreme Circuit", + OrePrefixes.circuit.get(Materials.EV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Quantumcomputer.set( + addItem( + Circuit_Quantumcomputer.ID, + "Quantumprocessor Assembly", + "An Elite Circuit", + OrePrefixes.circuit.get(Materials.IV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Masterquantumcomputer.set( + addItem( + Circuit_Masterquantumcomputer.ID, + "Master Quantumcomputer", + "A Master Circuit", + OrePrefixes.circuit.get(Materials.LuV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Quantummainframe.set( + addItem( + Circuit_Quantummainframe.ID, + "Quantumprocessor Mainframe", + "An Ultimate Circuit", + OrePrefixes.circuit.get(Materials.ZPM), + SubTag.NO_UNIFICATION)); + + // Crystal circuits + ItemList.Circuit_Crystalprocessor.set( + addItem( + Circuit_Crystalprocessor.ID, + "Crystalprocessor", + "An Elite Circuit", + OrePrefixes.circuit.get(Materials.IV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Crystalcomputer.set( + addItem( + Circuit_Crystalcomputer.ID, + "Crystalprocessor Assembly", + "A Master Circuit", + OrePrefixes.circuit.get(Materials.LuV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Ultimatecrystalcomputer.set( + addItem( + Circuit_Ultimatecrystalcomputer.ID, + "Ultimate Crystalcomputer", + "An Ultimate Circuit", + OrePrefixes.circuit.get(Materials.ZPM), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Crystalmainframe.set( + addItem( + Circuit_Crystalmainframe.ID, + "Crystalprocessor Mainframe", + "A Super Circuit", + OrePrefixes.circuit.get(Materials.UV), + SubTag.NO_UNIFICATION)); + + // ???? Scared to remove. + ItemList.Circuit_Ultimate.set(ItemList.Circuit_Ultimatecrystalcomputer.get(1L)); // maybe should be removed + + // Wetware circuits + ItemList.Circuit_Neuroprocessor.set( + addItem( + Circuit_Neuroprocessor.ID, + "Wetwareprocessor", + "A Master Circuit", + OrePrefixes.circuit.get(Materials.LuV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Wetwarecomputer.set( + addItem( + Circuit_Wetwarecomputer.ID, + "Wetwareprocessor Assembly", + "An Ultimate Circuit", + OrePrefixes.circuit.get(Materials.ZPM), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Wetwaresupercomputer.set( + addItem( + Circuit_Wetwaresupercomputer.ID, + "Wetware Supercomputer", + "A Super Circuit", + OrePrefixes.circuit.get(Materials.UV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Wetwaremainframe.set( + addItem( + Circuit_Wetwaremainframe.ID, + "Wetware Mainframe", + "An Infinite Circuit", + OrePrefixes.circuit.get(Materials.UHV), + SubTag.NO_UNIFICATION)); + + // Bioware circuits. + ItemList.Circuit_Bioprocessor.set( + addItem( + Circuit_Bioprocessor.ID, + "Bioprocessor", + "An Ultimate Circuit", + OrePrefixes.circuit.get(Materials.ZPM), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Biowarecomputer.set( + addItem( + Circuit_Biowarecomputer.ID, + "Biowareprocessor Assembly", + "A Super Circuit", + OrePrefixes.circuit.get(Materials.UV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Biowaresupercomputer.set( + addItem( + Circuit_Biowaresupercomputer.ID, + "Bioware Supercomputer", + "An Infinite Circuit", + OrePrefixes.circuit.get(Materials.UHV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Biomainframe.set( + addItem( + Circuit_Biomainframe.ID, + "Bio Mainframe", + "A Bio Circuit", + OrePrefixes.circuit.get(Materials.UEV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_Board_Coated_Basic + .set(addItem(Circuit_Board_Coated_Basic.ID, "Circuit Board", "A basic Circuit Board", o)); + ItemList.Circuit_Board_Phenolic_Good + .set(addItem(Circuit_Board_Phenolic_Good.ID, "Good Circuit Board", "A good Circuit Board", o)); + ItemList.Circuit_Board_Epoxy_Advanced + .set(addItem(Circuit_Board_Epoxy_Advanced.ID, "Advanced Circuit Board", "A advanced Circuit Board", o)); + ItemList.Circuit_Board_Fiberglass_Advanced.set( + addItem( + Circuit_Board_Fiberglass_Advanced.ID, + "More Advanced Circuit Board", + "A more advanced Circuit Board", + o)); + ItemList.Circuit_Board_Multifiberglass_Elite + .set(addItem(Circuit_Board_Multifiberglass_Elite.ID, "Elite Circuit Board", "A elite Circuit Board", o)); + ItemList.Circuit_Board_Wetware_Extreme.set( + addItem( + Circuit_Board_Wetware_Extreme.ID, + "Extreme Wetware Lifesupport Circuit Board", + "The Board that keeps life", + o)); + ItemList.Circuit_Board_Plastic_Advanced + .set(addItem(Circuit_Board_Plastic_Advanced.ID, "Plastic Circuit Board", "A good Board", o)); + ItemList.Circuit_Board_Bio_Ultra.set( + addItem(Circuit_Board_Bio_Ultra.ID, "Ultra Bio Mutated Circuit Board", "Bio genetic mutated Board", o)); + ItemList.Circuit_Board_Optical + .set(addItem(Circuit_Board_Optical.ID, "Optical Circuit Board", "Optically Infused Board", o)); + + // Optical circuits + ItemList.Circuit_OpticalProcessor.set( + addItem( + Circuit_OpticalProcessor.ID, + "Optical Processor", + "An Optical Circuit", + OrePrefixes.circuit.get(Materials.UV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_OpticalAssembly.set( + addItem( + Circuit_OpticalAssembly.ID, + "Optical Assembly", + "An Optical Circuit", + OrePrefixes.circuit.get(Materials.UHV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_OpticalComputer.set( + addItem( + Circuit_OpticalComputer.ID, + "Optical Computer", + "An Optical Circuit", + OrePrefixes.circuit.get(Materials.UEV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_OpticalMainframe.set( + addItem( + Circuit_OpticalMainframe.ID, + "Optical Mainframe", + "An Optical Circuit", + OrePrefixes.circuit.get(Materials.UIV), + SubTag.NO_UNIFICATION)); + + // Exotic circuits + ItemList.Circuit_ExoticProcessor.set( + addItem( + Circuit_ExoticProcessor.ID, + "Exotic Processor", + "An Exotic Circuit", + OrePrefixes.circuit.get(Materials.UHV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_ExoticAssembly.set( + addItem( + Circuit_ExoticAssembly.ID, + "Exotic Assembly", + "An Exotic Circuit", + OrePrefixes.circuit.get(Materials.UEV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_ExoticComputer.set( + addItem( + Circuit_ExoticComputer.ID, + "Exotic Computer", + "An Exotic Circuit", + OrePrefixes.circuit.get(Materials.UIV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_ExoticMainframe.set( + addItem( + Circuit_ExoticMainframe.ID, + "Exotic Mainframe", + "An Exotic Circuit", + OrePrefixes.circuit.get(Materials.UMV), + SubTag.NO_UNIFICATION)); + + // Cosmic circuits + ItemList.Circuit_CosmicProcessor.set( + addItem( + Circuit_CosmicProcessor.ID, + "Cosmic Processor", + "A Cosmic Circuit", + OrePrefixes.circuit.get(Materials.UEV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_CosmicAssembly.set( + addItem( + Circuit_CosmicAssembly.ID, + "Cosmic Assembly", + "A Cosmic Circuit", + OrePrefixes.circuit.get(Materials.UIV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_CosmicComputer.set( + addItem( + Circuit_CosmicComputer.ID, + "Cosmic Computer", + "A Cosmic Circuit", + OrePrefixes.circuit.get(Materials.UMV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_CosmicMainframe.set( + addItem( + Circuit_CosmicMainframe.ID, + "Cosmic Mainframe", + "A Cosmic Circuit", + OrePrefixes.circuit.get(Materials.UXV), + SubTag.NO_UNIFICATION)); + + // Transcendent circuits + ItemList.Circuit_TranscendentProcessor.set( + addItem( + Circuit_TranscendentProcessor.ID, + "Temporally Transcendent Processor", + "A circuit operating outside of known spacetime", + OrePrefixes.circuit.get(Materials.UIV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_TranscendentAssembly.set( + addItem( + Circuit_TranscendentAssembly.ID, + "Temporally Transcendent Assembly", + "A circuit operating outside of known spacetime", + OrePrefixes.circuit.get(Materials.UMV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_TranscendentComputer.set( + addItem( + Circuit_TranscendentComputer.ID, + "Temporally Transcendent Computer", + "A circuit operating outside of known spacetime", + OrePrefixes.circuit.get(Materials.UXV), + SubTag.NO_UNIFICATION)); + + ItemList.Circuit_TranscendentMainframe.set( + addItem( + Circuit_TranscendentMainframe.ID, + "Temporally Transcendent Mainframe", + "A circuit operating outside of known spacetime", + OrePrefixes.circuit.get(Materials.MAX), + SubTag.NO_UNIFICATION)); + + ItemList.Tube_Wires.set(addItem(Tube_Wires.ID, "Tube Wires", "For the Vacuum Tubes", o)); + + ItemList.Cover_SolarPanel_UHV.set( + addItem( + Cover_SolarPanel_UHV.ID, + "Solar Panel (UHV)", + "Ultimate High Voltage Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 128L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 128L))); + ItemList.Cover_SolarPanel_UEV.set( + addItem( + Cover_SolarPanel_UEV.ID, + "Solar Panel (UEV)", + "Ultimate Extreme Voltage Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 256L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 256L))); + ItemList.Cover_SolarPanel_UIV.set( + addItem( + Cover_SolarPanel_UIV.ID, + "Solar Panel (UIV)", + "Ultimate Insane Voltage Solar Panel (Needs cleaning with right click)", + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 512L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 512L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 512L))); + + ItemList.ULV_Coil.set(addItem(ULV_Coil.ID, "Ultra Low Voltage Coil", "Primitive Coil", o)); + ItemList.LV_Coil.set(addItem(LV_Coil.ID, "Low Voltage Coil", "Basic Coil", o)); + ItemList.MV_Coil.set(addItem(MV_Coil.ID, "Medium Voltage Coil", "Good Coil", o)); + ItemList.HV_Coil.set(addItem(HV_Coil.ID, "High Voltage Coil", "Advanced Coil", o)); + ItemList.EV_Coil.set(addItem(EV_Coil.ID, "Extreme Voltage Coil", "Extreme Coil", o)); + ItemList.IV_Coil.set(addItem(IV_Coil.ID, "Insane Voltage Coil", "Elite Coil", o)); + ItemList.LuV_Coil.set(addItem(LuV_Coil.ID, "Ludicrous Voltage Coil", "Master Coil", o)); + ItemList.ZPM_Coil.set(addItem(ZPM_Coil.ID, "ZPM Voltage Coil", "Ultimate Coil", o)); + ItemList.UV_Coil.set(addItem(UV_Coil.ID, "Ultimate Voltage Coil", "Super Coil", o)); + ItemList.UHV_Coil.set(addItem(UHV_Coil.ID, "Highly Ultimate Voltage Coil", "Infinite Coil", o)); + + ItemList.GalliumArsenideCrystal + .set(addItem(GalliumArsenideCrystal.ID, "Gallium Arsenide Crystal", "For making boules", o)); + ItemList.GalliumArsenideCrystalSmallPart + .set(addItem(GalliumArsenideCrystalSmallPart.ID, "Small Gallium Arsenide Crystal", "For making boules", o)); + ItemList.KevlarFiber.set(addItem(KevlarFiber.ID, "Kevlar Fiber", "For making Kevlar Plates", o)); + ItemList.WovenKevlar.set(addItem(WovenKevlar.ID, "Woven Kevlar", "For making Kevlar Plates", o)); + ItemList.Spinneret.set(addItem(Spinneret.ID, "Spinneret", "For making Kevlar Fiber", o)); + + ItemList.IndustrialApiary_Upgrade_Frame + .set(addItem(IndustrialApiary_Upgrade_Frame.ID, "Upgrade Frame", "Crafting component", o)); + + ItemList.IndustrialApiary_Upgrade_Acceleration_1.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_1.ID, + "Acceleration Upgrade x2", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 2x acceleration level/n * Energy Consumption +1 AMP LV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_2.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_2.ID, + "Acceleration Upgrade x4", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 4x acceleration level/n * Energy Consumption +1 AMP MV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_3.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_3.ID, + "Acceleration Upgrade x8", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 8x acceleration level/n * Energy Consumption +1 AMP HV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_4.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_4.ID, + "Acceleration Upgrade x16", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 16x acceleration level/n * Energy Consumption +1 AMP EV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_5.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_5.ID, + "Acceleration Upgrade x32", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 32x acceleration level/n * Energy Consumption +1 AMP IV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_6.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_6.ID, + "Acceleration Upgrade x64", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 64x acceleration level/n * Energy Consumption +1 AMP LuV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_7.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_7.ID, + "Acceleration Upgrade x128", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 128x acceleration level/n * Energy Consumption +1 AMP ZPM", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_8.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_8.ID, + "Acceleration Upgrade x256", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 256x acceleration level/n * Energy Consumption +1 AMP UV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_Acceleration_8_Upgraded.set( + addItem( + IndustrialApiary_Upgrade_Acceleration_8_Upgraded.ID, + "Upgraded Acceleration Upgrade x256", + "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 256x acceleration level/n * Will also grant 8x production upgrade/n * Energy Consumption +1 AMP UV", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_PRODUCTION.set( + addItem( + IndustrialApiary_Upgrade_PRODUCTION.ID, + "Production Upgrade", + "Production upgrade for Industrial Apiary/n Maximum Installed: 8/n Increases production modifier by 0.25/n Energy Consumption +40%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_PLAINS.set( + addItem( + IndustrialApiary_Upgrade_PLAINS.ID, + "Plains Emulation Upgrade", + "Plains emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Plains/n * Energy Consumption +40%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_LIGHT.set( + addItem( + IndustrialApiary_Upgrade_LIGHT.ID, + "Light Upgrade", + "Light upgrade for Industrial Apiary/n Maximum Installed: 1/n * Internal Lighting/n * Energy Consumption +5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_FLOWERING.set( + addItem( + IndustrialApiary_Upgrade_FLOWERING.ID, + "Flowering Upgrade", + "Flowering upgrade for Industrial Apiary/n Maximum Installed: 8/n * Flowering and Pollination +20%/n * Energy Consumption +10%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_WINTER.set( + addItem( + IndustrialApiary_Upgrade_WINTER.ID, + "Winter Emulation Upgrade", + "Winter emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Taiga/n * Energy Consumption +50%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_DRYER.set( + addItem( + IndustrialApiary_Upgrade_DRYER.ID, + "Dryer Upgrade", + "Dryer upgrade for Industrial Apiary/n Maximum Installed: 16/n * Humidity -12.5%/n * Energy Consumption +2.5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_AUTOMATION.set( + addItem( + IndustrialApiary_Upgrade_AUTOMATION.ID, + "Automation Upgrade", + "Automation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Automation/n * Energy Consumption +10%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.set( + addItem( + IndustrialApiary_Upgrade_HUMIDIFIER.ID, + "Humidifier Upgrade", + "Humidifier upgrade for Industrial Apiary/n Maximum Installed: 16/n * Humidity +12.5%/n * Energy Consumption +2.5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_HELL.set( + addItem( + IndustrialApiary_Upgrade_HELL.ID, + "HELL Emulation Upgrade", + "HELL emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: HELL/n * Energy Consumption +50%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_POLLEN.set( + addItem( + IndustrialApiary_Upgrade_POLLEN.ID, + "Pollen Scrubber Upgrade", + "Pollen scrubber upgrade for Industrial Apiary/n Maximum Installed: 1/n * Flowering and Pollination -100%/n * Energy Consumption +30%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_DESERT.set( + addItem( + IndustrialApiary_Upgrade_DESERT.ID, + "Desert Emulation Upgrade", + "Desert emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Desert/n * Energy Consumption +20%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_COOLER.set( + addItem( + IndustrialApiary_Upgrade_COOLER.ID, + "Cooler Upgrade", + "Cooler upgrade for Industrial Apiary/n Maximum Installed: 16/n * Temperature -12.5%/n * Energy Consumption +2.5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_LIFESPAN.set( + addItem( + IndustrialApiary_Upgrade_LIFESPAN.ID, + "Lifespan Upgrade", + "Lifespan upgrade for Industrial Apiary/n Maximum Installed: 4/n * Lifespan -33%/n * Energy Consumption +5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_SEAL.set( + addItem( + IndustrialApiary_Upgrade_SEAL.ID, + "Seal Upgrade", + "Seal upgrade for Industrial Apiary/n Maximum Installed: 1/n * Rain Protection/n * Energy Consumption +5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_STABILIZER.set( + addItem( + IndustrialApiary_Upgrade_STABILIZER.ID, + "Genetic Stabilizer Upgrade", + "Genetic stabilizer upgrade for Industrial Apiary/n Maximum Installed: 1/n * Genetic Decay -100%/n * Energy Consumption +150%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_JUNGLE.set( + addItem( + IndustrialApiary_Upgrade_JUNGLE.ID, + "Jungle Emulation Upgrade", + "Jungle emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Jungle/n * Energy Consumption +20%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_TERRITORY.set( + addItem( + IndustrialApiary_Upgrade_TERRITORY.ID, + "Territory Upgrade", + "Territory upgrade for Industrial Apiary/n Maximum Installed: 4/n * Territory +50%/n * Energy Consumption +5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_OCEAN.set( + addItem( + IndustrialApiary_Upgrade_OCEAN.ID, + "Ocean Emulation Upgrade", + "Ocean emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Ocean/n * Energy Consumption +20%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_SKY.set( + addItem( + IndustrialApiary_Upgrade_SKY.ID, + "Open Sky Upgrade", + "Open sky upgrade for Industrial Apiary/n Maximum Installed: 1/n * Open Sky Simulation/n * Energy Consumption +5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_HEATER.set( + addItem( + IndustrialApiary_Upgrade_HEATER.ID, + "Heater Upgrade", + "Heater upgrade for Industrial Apiary/n Maximum Installed: 16/n * Temperature +12.5%/n * Energy Consumption +2.5%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_SIEVE.set( + addItem( + IndustrialApiary_Upgrade_SIEVE.ID, + "Sieve Upgrade", + "Sieve upgrade for Industrial Apiary/n Maximum Installed: 1/n * Pollen Collection/n * Energy Consumption +25%", + OrePrefixes.apiaryUpgrade.name())); + ItemList.IndustrialApiary_Upgrade_UNLIGHT.set( + addItem( + IndustrialApiary_Upgrade_UNLIGHT.ID, + "Night Upgrade", + "Night upgrade for Industrial Apiary/n Maximum Installed: 1/n * Internal Darkness/n * Energy Consumption +5%", + OrePrefixes.apiaryUpgrade.name())); + + ItemList.NuclearStar.set( + addItem( + NuclearStar.ID, + "Nuclear Star", + "By the powers of Greg, I command this star to be really hot.", + SubTag.NO_UNIFICATION)); + + ItemList.Cover_Metrics_Transmitter.set( + addItem( + Cover_Metrics_Transmitter.ID, + "Metrics Transmitter Cover", + String.join( + "/n ", + "Taking Information Panels to the next level!", + "Creates a GregTech Advanced Sensor Card when attached", + "Works across dimensions or if machine is dismantled", + "Removing this cover will destroy the linked card", + GTValues.AuthorQuerns))); + + ItemList.ActivatedCarbonFilterMesh.set( + addItem( + Activated_Carbon_Filter_Mesh.ID, + "Activated Carbon Filter Mesh", + "The most granular filter you could possibly make.", + SubTag.NO_UNIFICATION)); + + ItemList.Quark_Catalyst_Housing.set( + addItem( + Quark_Catalyst_Housing.ID, + "Empty Quark Release Catalyst Housing", + "Capable of holding Quark Release Catalysts", + SubTag.NO_UNIFICATION)); + ItemList.Quark_Creation_Catalyst_Up.set( + addItem( + Quark_Creation_Catalyst_Up.ID, + "Up-Quark Releasing Catalyst", + "Can release up-quarks into environment to reshape matter", + SubTag.NO_UNIFICATION)); + ItemList.Quark_Creation_Catalyst_Down.set( + addItem( + Quark_Creation_Catalyst_Down.ID, + "Down-Quark Releasing Catalyst", + "Can release down-quarks into environment to reshape matter", + SubTag.NO_UNIFICATION)); + ItemList.Quark_Creation_Catalyst_Strange.set( + addItem( + Quark_Creation_Catalyst_Strange.ID, + "Strange-Quark Releasing Catalyst", + "Can release strange-quarks into environment to reshape matter", + SubTag.NO_UNIFICATION)); + ItemList.Quark_Creation_Catalyst_Charm.set( + addItem( + Quark_Creation_Catalyst_Charm.ID, + "Charm-Quark Releasing Catalyst", + "Can release charm-quarks into environment to reshape matter", + SubTag.NO_UNIFICATION)); + ItemList.Quark_Creation_Catalyst_Bottom.set( + addItem( + Quark_Creation_Catalyst_Bottom.ID, + "Bottom-Quark Releasing Catalyst", + "Can release top-quarks into environment to reshape matter", + SubTag.NO_UNIFICATION)); + ItemList.Quark_Creation_Catalyst_Top.set( + addItem( + Quark_Creation_Catalyst_Top.ID, + "Top-Quark Releasing Catalyst", + "Can release bottom-quarks into environment to reshape matter", + SubTag.NO_UNIFICATION)); + ItemList.Quark_Creation_Catalyst_Unaligned.set( + addItem( + Quark_Creation_Catalyst_Unaligned.ID, + "Unaligned Quark Releasing Catalyst", + "Needs to be realigned before use", + SubTag.NO_UNIFICATION)); + + ItemList.Optical_Cpu_Containment_Housing + .set(addItem(Optical_Cpu_Containment_Housing.ID, "Optical CPU Containment Housing", "CPU Housing", o)); + ItemList.Optically_Perfected_CPU + .set(addItem(Optically_Perfected_CPU.ID, "Optically Perfected CPU", "Perfected CPU!", o)); + ItemList.Optically_Compatible_Memory + .set(addItem(Optically_Compatible_Memory.ID, "Optically Compatible Memory", "Its in the name!", o)); + + ItemList.Timepiece.set(addItem(Timepiece.ID, "Timepiece", "Beware of the kid with the hat", o)); + ItemList.Transdimensional_Alignment_Matrix.set( + addItem( + Transdimensional_Alignment_Matrix.ID, + "Transdimensional Alignment Matrix", + String.join( + "/n ", + "Device supporting the alignment of transdimensional spaces.", + "Enables Dimensional Convergence on the DTPF."), + o)); + + ItemList.Thermal_Superconductor + .set(addItem(Thermal_Superconductor.ID, "Thermal Superconductor", "With the power of second sound!", o)); + ItemList.Relativistic_Heat_Capacitor + .set(addItem(Relativistic_Heat_Capacitor.ID, "Relativistic Heat Capacitor", "Thermal Resonance?", o)); + ItemList.Phononic_Seed_Crystal + .set(addItem(Phononic_Seed_Crystal.ID, "Phononic Seed Crystal", "Perfect Thermal Conductance", o)); + + ItemList.White_Dwarf_Shape_Extruder_Plate.set( + addItem( + White_Dwarf_Shape_Extruder_Plate.ID, + "White Dwarf Extruder Shape (Plate)", + "Ultra Strong Stellar Shape for making Plates")); + ItemList.White_Dwarf_Shape_Extruder_Rod.set( + addItem( + White_Dwarf_Shape_Extruder_Rod.ID, + "White Dwarf Extruder Shape (Rod)", + "Ultra Strong Stellar Shape for making Rods")); + ItemList.White_Dwarf_Shape_Extruder_Bolt.set( + addItem( + White_Dwarf_Shape_Extruder_Bolt.ID, + "White Dwarf Extruder Shape (Bolt)", + "Ultra Strong Stellar Shape for making Bolts")); + ItemList.White_Dwarf_Shape_Extruder_Ring.set( + addItem( + White_Dwarf_Shape_Extruder_Ring.ID, + "White Dwarf Extruder Shape (Ring)", + "Ultra Strong Stellar Shape for making Rings")); + ItemList.White_Dwarf_Shape_Extruder_Cell.set( + addItem( + White_Dwarf_Shape_Extruder_Cell.ID, + "White Dwarf Extruder Shape (Cell)", + "Ultra Strong Stellar Shape for making Cells")); + ItemList.White_Dwarf_Shape_Extruder_Ingot.set( + addItem( + White_Dwarf_Shape_Extruder_Ingot.ID, + "White Dwarf Extruder Shape (Ingot)", + "Ultra Strong Stellar Shape for, wait, can't we just use a Furnace?")); + ItemList.White_Dwarf_Shape_Extruder_Wire.set( + addItem( + White_Dwarf_Shape_Extruder_Wire.ID, + "White Dwarf Extruder Shape (Wire)", + "Ultra Strong Stellar Shape for making Wires")); + ItemList.White_Dwarf_Shape_Extruder_Casing.set( + addItem( + White_Dwarf_Shape_Extruder_Casing.ID, + "White Dwarf Extruder Shape (Casing)", + "Ultra Strong Stellar Shape for making Item Casings")); + ItemList.White_Dwarf_Shape_Extruder_Pipe_Tiny.set( + addItem( + White_Dwarf_Shape_Extruder_Pipe_Tiny.ID, + "White Dwarf Extruder Shape (Tiny Pipe)", + "Ultra Strong Stellar Shape for making tiny Pipes")); + ItemList.White_Dwarf_Shape_Extruder_Pipe_Small.set( + addItem( + White_Dwarf_Shape_Extruder_Pipe_Small.ID, + "White Dwarf Extruder Shape (Small Pipe)", + "Ultra Strong Stellar Shape for making small Pipes")); + ItemList.White_Dwarf_Shape_Extruder_Pipe_Medium.set( + addItem( + White_Dwarf_Shape_Extruder_Pipe_Medium.ID, + "White Dwarf Extruder Shape (Normal Pipe)", + "Ultra Strong Stellar Shape for making Pipes")); + ItemList.White_Dwarf_Shape_Extruder_Pipe_Large.set( + addItem( + White_Dwarf_Shape_Extruder_Pipe_Large.ID, + "White Dwarf Extruder Shape (Large Pipe)", + "Ultra Strong Stellar Shape for making large Pipes")); + ItemList.White_Dwarf_Shape_Extruder_Pipe_Huge.set( + addItem( + White_Dwarf_Shape_Extruder_Pipe_Huge.ID, + "White Dwarf Extruder Shape (Huge Pipe)", + "Ultra Strong Stellar Shape for making full Block Pipes")); + ItemList.White_Dwarf_Shape_Extruder_Block.set( + addItem( + White_Dwarf_Shape_Extruder_Block.ID, + "White Dwarf Extruder Shape (Block)", + "Ultra Strong Stellar Shape for making Blocks")); + ItemList.White_Dwarf_Shape_Extruder_Sword.set( + addItem( + White_Dwarf_Shape_Extruder_Sword.ID, + "White Dwarf Extruder Shape (Sword Blade)", + "Ultra Strong Stellar Shape for making Swords")); + ItemList.White_Dwarf_Shape_Extruder_Pickaxe.set( + addItem( + White_Dwarf_Shape_Extruder_Pickaxe.ID, + "White Dwarf Extruder Shape (Pickaxe Head)", + "Ultra Strong Stellar Shape for making Pickaxes")); + ItemList.White_Dwarf_Shape_Extruder_Shovel.set( + addItem( + White_Dwarf_Shape_Extruder_Shovel.ID, + "White Dwarf Extruder Shape (Shovel Head)", + "Ultra Strong Stellar Shape for making Shovels")); + ItemList.White_Dwarf_Shape_Extruder_Axe.set( + addItem( + White_Dwarf_Shape_Extruder_Axe.ID, + "White Dwarf Extruder Shape (Axe Head)", + "Ultra Strong Stellar Shape for making Axes")); + ItemList.White_Dwarf_Shape_Extruder_Hoe.set( + addItem( + White_Dwarf_Shape_Extruder_Hoe.ID, + "White Dwarf Extruder Shape (Hoe Head)", + "Ultra Strong Stellar Shape for making Hoes")); + ItemList.White_Dwarf_Shape_Extruder_Hammer.set( + addItem( + White_Dwarf_Shape_Extruder_Hammer.ID, + "White Dwarf Extruder Shape (Hammer Head)", + "Ultra Strong Stellar Shape for making Hammers")); + ItemList.White_Dwarf_Shape_Extruder_File.set( + addItem( + White_Dwarf_Shape_Extruder_File.ID, + "White Dwarf Extruder Shape (File Head)", + "Ultra Strong Stellar Shape for making Files")); + ItemList.White_Dwarf_Shape_Extruder_Saw.set( + addItem( + White_Dwarf_Shape_Extruder_Saw.ID, + "White Dwarf Extruder Shape (Saw Blade)", + "Ultra Strong Stellar Shape for making Saws")); + ItemList.White_Dwarf_Shape_Extruder_Gear.set( + addItem( + White_Dwarf_Shape_Extruder_Gear.ID, + "White Dwarf Extruder Shape (Gear)", + "Ultra Strong Stellar Shape for making Gears")); + ItemList.White_Dwarf_Shape_Extruder_Bottle.set( + addItem( + White_Dwarf_Shape_Extruder_Bottle.ID, + "White Dwarf Extruder Shape (Bottle)", + "Ultra Strong Stellar Shape for making Bottles")); + ItemList.White_Dwarf_Shape_Extruder_Rotor.set( + addItem( + White_Dwarf_Shape_Extruder_Rotor.ID, + "White Dwarf Extruder Shape (Rotor)", + "Ultra Strong Stellar Shape for a Rotor")); + ItemList.White_Dwarf_Shape_Extruder_Small_Gear.set( + addItem( + White_Dwarf_Shape_Extruder_Small_Gear.ID, + "White Dwarf Extruder Shape (Small Gear)", + "Ultra Strong Stellar Shape for a Small Gear")); + ItemList.White_Dwarf_Shape_Extruder_Turbine_Blade.set( + addItem( + White_Dwarf_Shape_Extruder_Turbine_Blade.ID, + "White Dwarf Extruder Shape (Turbine Blade)", + "Ultra Strong Stellar Extruder Shape for a Turbine Blade")); + ItemList.White_Dwarf_Shape_Extruder_ToolHeadDrill.set( + addItem( + White_Dwarf_Shape_Extruder_ToolHeadDrill.ID, + "White Dwarf Extruder Shape (Drill Head)", + "White Dwarf Extruder Shape for a Drill Head")); + registerAllTieredTooltips(); + registerAllAnimatedTooltips(); + initOrePrefixes(); + initOreDictUnificatorEntries(); + registerCovers(); + } + + private void registerAllTieredTooltips() { + registerTieredTooltip(ItemList.NandChip.get(1), ULV); + registerTieredTooltip(ItemList.Circuit_Integrated_Good.get(1), MV); + registerTieredTooltip(ItemList.Circuit_Microprocessor.get(1), LV); + registerTieredTooltip(ItemList.Circuit_Processor.get(1), MV); + registerTieredTooltip(ItemList.Circuit_Nanoprocessor.get(1), HV); + registerTieredTooltip(ItemList.Circuit_Nanocomputer.get(1), EV); + registerTieredTooltip(ItemList.Circuit_Elitenanocomputer.get(1), IV); + registerTieredTooltip(ItemList.Circuit_Quantumprocessor.get(1), EV); + registerTieredTooltip(ItemList.Circuit_Quantumcomputer.get(1), IV); + registerTieredTooltip(ItemList.Circuit_Masterquantumcomputer.get(1), LuV); + registerTieredTooltip(ItemList.Circuit_Quantummainframe.get(1), ZPM); + registerTieredTooltip(ItemList.Circuit_Crystalprocessor.get(1), IV); + registerTieredTooltip(ItemList.Circuit_Crystalcomputer.get(1), LuV); + registerTieredTooltip(ItemList.Circuit_Ultimatecrystalcomputer.get(1), ZPM); + registerTieredTooltip(ItemList.Circuit_Crystalmainframe.get(1), UV); + registerTieredTooltip(ItemList.Circuit_Neuroprocessor.get(1), LuV); + registerTieredTooltip(ItemList.Circuit_Wetwarecomputer.get(1), ZPM); + registerTieredTooltip(ItemList.Circuit_Wetwaresupercomputer.get(1), UV); + registerTieredTooltip(ItemList.Circuit_Wetwaremainframe.get(1), UHV); + registerTieredTooltip(ItemList.Circuit_Bioprocessor.get(1), ZPM); + registerTieredTooltip(ItemList.Circuit_Biowarecomputer.get(1), UV); + registerTieredTooltip(ItemList.Circuit_Biowaresupercomputer.get(1), UHV); + registerTieredTooltip(ItemList.Circuit_Biomainframe.get(1), UEV); + registerTieredTooltip(ItemList.Circuit_OpticalProcessor.get(1), UV); + registerTieredTooltip(ItemList.Circuit_OpticalAssembly.get(1), UHV); + registerTieredTooltip(ItemList.Circuit_OpticalComputer.get(1), UEV); + registerTieredTooltip(ItemList.Circuit_OpticalMainframe.get(1), UIV); + registerTieredTooltip(ItemList.Circuit_ExoticProcessor.get(1), UHV); + registerTieredTooltip(ItemList.Circuit_ExoticAssembly.get(1), UEV); + registerTieredTooltip(ItemList.Circuit_ExoticComputer.get(1), UIV); + registerTieredTooltip(ItemList.Circuit_ExoticMainframe.get(1), UMV); + registerTieredTooltip(ItemList.Circuit_CosmicProcessor.get(1), UEV); + registerTieredTooltip(ItemList.Circuit_CosmicAssembly.get(1), UIV); + registerTieredTooltip(ItemList.Circuit_CosmicComputer.get(1), UMV); + registerTieredTooltip(ItemList.Circuit_CosmicMainframe.get(1), UXV); + registerTieredTooltip(ItemList.Circuit_TranscendentProcessor.get(1), UIV); + registerTieredTooltip(ItemList.Circuit_TranscendentAssembly.get(1), UMV); + registerTieredTooltip(ItemList.Circuit_TranscendentComputer.get(1), UXV); + registerTieredTooltip(ItemList.Circuit_TranscendentMainframe.get(1), MAX); + } + + private void registerAllAnimatedTooltips() { + addItemTooltip(ItemList.Transdimensional_Alignment_Matrix.get(1), GTValues.AuthorCloud); + } + + private void initOreDictUnificatorEntries() { + GTOreDictUnificator + .set(OrePrefixes.componentCircuit, Materials.Resistor, ItemList.Circuit_Parts_Resistor.get(1L)); + GTOreDictUnificator.set(OrePrefixes.componentCircuit, Materials.Diode, ItemList.Circuit_Parts_Diode.get(1L)); + GTOreDictUnificator + .set(OrePrefixes.componentCircuit, Materials.Transistor, ItemList.Circuit_Parts_Transistor.get(1L)); + GTOreDictUnificator.set(OrePrefixes.componentCircuit, Materials.Inductor, ItemList.Circuit_Parts_Coil.get(1L)); + GTOreDictUnificator + .set(OrePrefixes.componentCircuit, Materials.Capacitor, ItemList.Circuit_Parts_Capacitor.get(1L)); + + GTOreDictUnificator.addAssociation( + OrePrefixes.componentCircuit, + Materials.Resistor, + ItemList.Circuit_Parts_ResistorSMD.get(1L), + true); + GTOreDictUnificator.addAssociation( + OrePrefixes.componentCircuit, + Materials.Diode, + ItemList.Circuit_Parts_DiodeSMD.get(1L), + true); + GTOreDictUnificator.addAssociation( + OrePrefixes.componentCircuit, + Materials.Transistor, + ItemList.Circuit_Parts_TransistorSMD.get(1L), + true); + GTOreDictUnificator.addAssociation( + OrePrefixes.componentCircuit, + Materials.Capacitor, + ItemList.Circuit_Parts_CapacitorSMD.get(1L), + true); + GTOreDictUnificator.addAssociation( + OrePrefixes.componentCircuit, + Materials.Inductor, + ItemList.Circuit_Parts_InductorSMD.get(1L), + true); + + } + + private void initOrePrefixes() { + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_1.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_2.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_3.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_4.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_5.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_6.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_7.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_8.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_8_Upgraded.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_PRODUCTION.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_PLAINS.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_LIGHT.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_FLOWERING.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_WINTER.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_DRYER.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_AUTOMATION.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HELL.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_POLLEN.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_DESERT.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_COOLER.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_LIFESPAN.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SEAL.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_STABILIZER.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_JUNGLE.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_TERRITORY.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_OCEAN.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SKY.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HEATER.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SIEVE.get(1L)); + OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_UNLIGHT.get(1L)); + } + + private void registerCovers() { + GregTechAPI.registerCover( + ItemList.Cover_Metrics_Transmitter.get(1L), + TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_METRICS_TRANSMITTER)), + new CoverMetricsTransmitter(TextureFactory.of(OVERLAY_METRICS_TRANSMITTER))); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_UHV.get(1L), + TextureFactory.of(SOLARPANEL_UHV), + new CoverSolarPanel(2097152)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_UEV.get(1L), + TextureFactory.of(SOLARPANEL_UEV), + new CoverSolarPanel(8388608)); + GregTechAPI.registerCover( + ItemList.Cover_SolarPanel_UIV.get(1L), + TextureFactory.of(SOLARPANEL_UIV), + new CoverSolarPanel(33554432)); + } + + @Override + public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) { + return aDoShowAllItems || (aPrefix.toString() + .toLowerCase() + .contains("nanite")) + || (aPrefix.toString() + .toLowerCase() + .contains("rawore")); + } +} diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem98.java b/src/main/java/gregtech/common/items/MetaGeneratedItem98.java new file mode 100644 index 0000000000..875b7f7b5a --- /dev/null +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem98.java @@ -0,0 +1,352 @@ +package gregtech.common.items; + +import java.util.Arrays; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.annotation.Nullable; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; + +/** This class holds cells for non-GT fluids. */ +public class MetaGeneratedItem98 extends MetaGeneratedItem { + + public static MetaGeneratedItem98 INSTANCE; + + /** + * Registered fluids. + * + *

+ * When adding a fluid, don't forget to make sure that GregTech loads after the mod that adds that fluid! + * + *

+ * In order to avoid breaking existing worlds, fluids must not have their IDs changed! The only safe modification + * that can be made to this enum is adding new fluids, or removing existing fluids. When removing fluids, maybe + * leave a comment mentioning the old ID, so that we don't re-use it for a new fluid. + */ + public enum FluidCell { + // Next unused ID: 32 + + // GregTech + DRILLING_FLUID(5, "liquid_drillingfluid", CellType.REGULAR), + SQUID_INK(6, "squidink", CellType.SMALL), + BLUE_VITRIOL(22, "solution.bluevitriol", CellType.REGULAR), + NICKEL_SULFATE(23, "solution.nickelsulfate", CellType.REGULAR), + GREEN_VITRIOL(24, "solution.greenvitriol", CellType.REGULAR), + INDIUM_CONCENTRATE(25, "indiumconcentrate", CellType.REGULAR), + LEAD_ZINC_SOLUTION(26, "leadzincsolution", CellType.REGULAR), + + // New Horizons Core Mod + UNKNOWN_NUTRIENT_AGAR(7, "unknownnutrientagar", CellType.REGULAR), + SEAWEED_BROTH(8, "seaweedbroth", CellType.REGULAR), + SUPER_HEAVY_RADOX(28, "superheavyradox", CellType.REGULAR), + HEAVY_RADOX(29, "heavyradox", CellType.REGULAR), + CRACKED_RADOX(30, "crackedradox", CellType.REGULAR), + LIGHT_RADOX(31, "lightradox", CellType.REGULAR), + SUPER_LIGHT_RADOX(9, "superlightradox", CellType.REGULAR), + SODIUM_POTASSIUM(18, "sodiumpotassium", CellType.REGULAR), + ENRICHED_BACTERIAL_SLUDGE(19, "enrichedbacterialsludge", CellType.REGULAR), + FERMENTED_BACTERIAL_SLUDGE(20, "fermentedbacterialsludge", CellType.REGULAR), + POLLUTION(21, "pollution", CellType.REGULAR), + XENOXENE(27, "xenoxene", CellType.REGULAR), + + // BartWorks + ENZYME_SOLUTION(10, "enzymessollution", CellType.REGULAR), + ESCHERICHIA_COLI_FLUID(11, "escherichiakolifluid", CellType.REGULAR), + PENICILLIN(12, "penicillin", CellType.REGULAR), + FLUORESCENT_DNA(13, "fluorecentddna", CellType.REGULAR), + POLYMERASE(17, "polymerase", CellType.REGULAR), + + // Good Generator + COMBUSTION_PROMOTER(14, "combustionpromotor", CellType.REGULAR), + + // Galacticraft + BACTERIAL_SLUDGE(1, "bacterialsludge", CellType.REGULAR), + + // Railcraft + STEAM(0, "steam", CellType.REGULAR), + + // Gendustry + BACTERIA(15, "binnie.bacteria", CellType.REGULAR), + MUTAGEN(2, "mutagen", CellType.REGULAR), + LIQUID_DNA(16, "liquiddna", CellType.REGULAR), + + // Tinker's Construct + LIQUID_ENDER(3, "ender", CellType.REGULAR), + + // Hardcore Ender Expansion + ENDER_GOO(4, "endergoo", CellType.REGULAR),; + + private final int mId; + /** This is the Forge internal fluid name. */ + private final String mfluidName; + + private final CellType mType; + + @Nullable + private ItemStack mStack; + + FluidCell(int aId, String aFluidName, CellType aType) { + mId = aId; + mfluidName = aFluidName; + mType = aType; + } + + public int getId() { + return mId; + } + + public String getFluidName() { + return mfluidName; + } + + public CellType getDisplayType() { + return mType; + } + + /** + * Get a copy of this stack with stack size 1. + *

+ * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid. + */ + public ItemStack get() { + trySetStack(); + return GTUtility.copy(mStack); + } + + /** + * Get a copy of this cell WITHOUT copy. + *

+ * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid. + *

+ * Use with caution. + */ + public ItemStack getNoCopy() { + trySetStack(); + return mStack; + } + + /** + * Get a copy of this cell with specified stack size. + *

+ * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid. + */ + public ItemStack get(int aStackSize) { + trySetStack(); + return GTUtility.copyAmount(aStackSize, mStack); + } + + private void trySetStack() { + if (mStack == null) { + mStack = new ItemStack(MetaGeneratedItem98.INSTANCE, 1, mId); + } + } + } + + /** Cell type specifies the cell capacity, appearance, and item name format. */ + private enum CellType { + + REGULAR(1_000, OrePrefixes.cell), + SMALL(144, OrePrefixes.cell), + MOLTEN(144, OrePrefixes.cellMolten), + PLASMA(1_000, OrePrefixes.cellPlasma); + + private final int capacity; + private final OrePrefixes prefix; + + CellType(int capacity, OrePrefixes prefix) { + this.capacity = capacity; + this.prefix = prefix; + } + } + + /** Struct class holding data that we need to properly handle a registered fluid cell item. */ + private static class RegisteredFluidData { + + private final short[] rgba; + private final IIconContainer iconContainer; + + private RegisteredFluidData(short[] rgba, IIconContainer iconContainer) { + this.rgba = rgba; + this.iconContainer = iconContainer; + } + } + + /** + * Map of ID to registered fluid data. + * + *

+ * Only contains IDs that were successfully registered. + */ + private final Map registeredFluidDataMap; + + private final EnumMap iconContainerMap; + + private MetaGeneratedItem98() { + // For some reason, fluid cells will be rendered only if the metadata ID is less than the + // offset. So we will specify maximum offset here. + // See: GT_MetaGenerated_Item_Renderer.java + super("metaitem.98", (short) 32766, (short) 0); + + registeredFluidDataMap = new HashMap<>(); + iconContainerMap = new EnumMap<>(CellType.class); + } + + /** + * Loading needs to happen after the fluids we need have been registered, which means during post-load. However, + * cell icons seem to be deleted some time between load and post-load, so we must pre-cache them. + */ + public static synchronized void preInit() { + if (INSTANCE == null) INSTANCE = new MetaGeneratedItem98(); + + // We'll just steal the icons from Water. They are all the same anyway (except _NULL is broken for cells). + for (CellType cellType : CellType.values()) { + IIconContainer iconContainer = Materials.Water.mIconSet.mTextures[cellType.prefix.mTextureIndex]; + INSTANCE.iconContainerMap.put(cellType, iconContainer); + } + } + + public static synchronized void init() { + INSTANCE.createAllItems(); + INSTANCE.registerOreDict(); + } + + private void createAllItems() { + for (FluidCell tCell : FluidCell.values()) { + tryToInitialize(tCell); + } + + // We're not going to use these BitSets, so clear them to save memory. + mEnabledItems.clear(); + mVisibleItems.clear(); + } + + private void tryToInitialize(FluidCell aCell) { + final boolean isStackAlreadySet = aCell.mStack != null; + + int id = aCell.getId(); + String fluidName = aCell.getFluidName(); + CellType cellType = aCell.getDisplayType(); + + // We'll check for ID uniqueness. Better to throw an exception than silently overwrite some + // fluid cells with other fluids due to ID collision. + if (registeredFluidDataMap.containsKey(id)) { + throw new IllegalStateException("Got ID collision for ID: " + id); + } + + aCell.trySetStack(); + + Fluid fluid = FluidRegistry.getFluid(fluidName); + if (fluid == null) { + // The fluid is not guaranteed to exist. + // These fluids are non-GT fluids, so the mod may not be present. + if (isStackAlreadySet) { + throw new RuntimeException( + "Cell item for fluid " + fluidName + + " has already been created, but the fluid doesn't exist during postload"); + } else { + // fluid doesn't exist and this item has not been referenced + return; + } + } + + FluidStack fluidStack = new FluidStack(fluid, cellType.capacity); + + ItemStack emptyCell = ItemList.Cell_Empty.get(1L); + FluidContainerRegistry + .registerFluidContainer(new FluidContainerRegistry.FluidContainerData(fluidStack, aCell.mStack, emptyCell)); + + GTLanguageManager.addStringLocalization( + getUnlocalizedName(aCell.mStack) + ".name", + cellType.prefix.mLocalizedMaterialPre + fluid.getLocalizedName(fluidStack) + + cellType.prefix.mLocalizedMaterialPost); + + int color = fluid.getColor(); + short[] rgba = GTUtil.getRGBaArray(color); + + registeredFluidDataMap.put(id, new RegisteredFluidData(rgba, iconContainerMap.get(cellType))); + } + + private void registerOreDict() { + // The GregTech ore dictionary requires an entry in the Materials enum, and since the whole + // point of this class is to add cell items for non-GregTech fluids, the vast majority of + // cell items won't have an associated material. So only a rare few cell items will need to + // be registered. + + // Register IC2 steam cell and Railcraft steam cell as synonyms. + // There is no steam material, so we'll use Water.cellMolten instead. + GTOreDictUnificator.add(OrePrefixes.cellMolten, Materials.Water, GTModHandler.getIC2Item("steamCell", 1L)); + GTOreDictUnificator.add(OrePrefixes.cellMolten, Materials.Water, FluidCell.STEAM.getNoCopy()); + } + + @Override + public short[] getRGBa(ItemStack aStack) { + RegisteredFluidData fluidData = registeredFluidDataMap.get(aStack.getItemDamage()); + if (fluidData == null) { + return Materials._NULL.mRGBa; + } + + return fluidData.rgba; + } + + @Override + public ItemStack getContainerItem(ItemStack aStack) { + return ItemList.Cell_Empty.get(1L); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { + Arrays.stream(FluidCell.values()) + .filter(fluid -> FluidRegistry.getFluid(fluid.getFluidName()) != null) + .map(FluidCell::get) + .filter(Objects::nonNull) + .forEach(aList::add); + } + + @Override + public final IIcon getIconFromDamage(int aMetaData) { + IIconContainer iconContainer = getIconContainer(aMetaData); + if (iconContainer != null) { + return iconContainer.getIcon(); + } + return null; + } + + @Override + public IIconContainer getIconContainer(int aMetaData) { + RegisteredFluidData fluidData = registeredFluidDataMap.get(aMetaData); + if (fluidData == null) { + return null; + } + return fluidData.iconContainer; + } + + @Override + public int getItemStackLimit(ItemStack aStack) { + return 64; + } +} diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem99.java b/src/main/java/gregtech/common/items/MetaGeneratedItem99.java new file mode 100644 index 0000000000..e776a5eb26 --- /dev/null +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem99.java @@ -0,0 +1,214 @@ +package gregtech.common.items; + +import static gregtech.api.enums.GTValues.M; +import static gregtech.api.enums.OrePrefixes.cellMolten; + +import java.util.BitSet; +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import com.google.common.collect.ImmutableList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTOreDictUnificator; + +public class MetaGeneratedItem99 extends MetaGeneratedItem { + + public static MetaGeneratedItem99 INSTANCE; + + /** + * Ore prefixes appear in this list in the order in which they will be assigned ID blocks. + * + *

+ * In order to avoid breaking existing worlds, the entries in this list must not be re-ordered! The only safe + * modification that can be made to this list is adding new entries to the end. + */ + private static final ImmutableList CRACKED_CELL_TYPES = ImmutableList.of( + OrePrefixes.cellHydroCracked1, + OrePrefixes.cellHydroCracked2, + OrePrefixes.cellHydroCracked3, + OrePrefixes.cellSteamCracked1, + OrePrefixes.cellSteamCracked2, + OrePrefixes.cellSteamCracked3); + + private static final int NUM_CRACKED_CELL_TYPES = CRACKED_CELL_TYPES.size(); + + /** + * Assignment of metadata IDs: 0 - 999: Molten cells 10_000 - 15_999: Cracked fluid cells (# IDs used is + * NUM_CRACKED_CELL_TYPES * 1_000; update this if you add any) + */ + private final BitSet enabled = new BitSet(); + + public MetaGeneratedItem99() { + super("metaitem.99", (short) (10_000 + NUM_CRACKED_CELL_TYPES * 1_000), (short) 0); + + INSTANCE = this; + + for (Materials tMaterial : GregTechAPI.sGeneratedMaterials) { + if (tMaterial == null || tMaterial.mMetaItemSubID < 0 || tMaterial.mMetaItemSubID >= 1_000) { + continue; + } + + if ((tMaterial.contains(SubTag.SMELTING_TO_FLUID)) && (!tMaterial.contains(SubTag.NO_SMELTING)) + && !tMaterial.contains(SubTag.SMELTING_TO_GEM)) { + registerMolten(tMaterial, tMaterial.mMetaItemSubID); + if (tMaterial.mSmeltInto != tMaterial && tMaterial.mSmeltInto.mMetaItemSubID >= 0 + && tMaterial.mSmeltInto.mMetaItemSubID < 1_000) { + registerMolten(tMaterial.mSmeltInto, tMaterial.mSmeltInto.mMetaItemSubID); + } + } + + if (tMaterial.canBeCracked()) { + registerCracked(tMaterial, tMaterial.mMetaItemSubID); + } + } + + // We're not going to use these BitSets, so clear them to save memory. + mEnabledItems.clear(); + mVisibleItems.clear(); + } + + private void registerMolten(Materials tMaterial, int i) { + ItemStack tStack = new ItemStack(this, 1, i); + enabled.set(i); + + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".name", + cellMolten.getDefaultLocalNameFormatForItem(tMaterial)); + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".tooltip", + tMaterial.getToolTip(cellMolten.mMaterialAmount / M)); + + if (cellMolten.mIsUnificatable) { + GTOreDictUnificator.set(cellMolten, tMaterial, tStack); + } else { + GTOreDictUnificator.registerOre(cellMolten.get(tMaterial), tStack); + } + } + + private void registerCracked(Materials tMaterial, int i) { + int offset = 10_000; + for (OrePrefixes prefix : CRACKED_CELL_TYPES) { + ItemStack tStack = new ItemStack(this, 1, offset + i); + enabled.set(offset + i); + + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".name", + prefix.getDefaultLocalNameFormatForItem(tMaterial)); + GTLanguageManager.addStringLocalization( + getUnlocalizedName(tStack) + ".tooltip", + tMaterial.getToolTip(prefix.mMaterialAmount / M)); + + if (prefix.mIsUnificatable) { + GTOreDictUnificator.set(prefix, tMaterial, tStack); + } else { + GTOreDictUnificator.registerOre(prefix.get(tMaterial), tStack); + } + + offset += 1_000; + } + } + + /** Returns null for item damage out of bounds. */ + private Materials getMaterial(int damage) { + if (damage < 0) { + return null; + } + return GregTechAPI.sGeneratedMaterials[damage % 1_000]; + } + + /** Returns null for item damage out of bounds. */ + private OrePrefixes getOrePrefix(int damage) { + if (damage < 0) { + return null; + } else if (damage < 1_000) { + return cellMolten; + } else if (damage >= 10_000 && damage < 10_000 + (NUM_CRACKED_CELL_TYPES * 1_000)) { + return CRACKED_CELL_TYPES.get((damage / 1_000) - 10); + } + return null; + } + + @Override + public short[] getRGBa(ItemStack aStack) { + OrePrefixes prefix = getOrePrefix(aStack.getItemDamage()); + Materials material = getMaterial(aStack.getItemDamage()); + if (material == null) { + material = Materials._NULL; + } + + if (prefix == cellMolten) { + return material.mMoltenRGBa; + } else { + return material.mRGBa; + } + } + + @Override + public String getItemStackDisplayName(ItemStack aStack) { + String aName = super.getItemStackDisplayName(aStack); + Materials material = getMaterial(aStack.getItemDamage()); + if (material != null) { + return material.getLocalizedNameForItem(aName); + } + return aName; + } + + @Override + public ItemStack getContainerItem(ItemStack aStack) { + OrePrefixes prefix = getOrePrefix(aStack.getItemDamage()); + if (prefix != null) { + return prefix.mContainerItem; + } + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) { + enabled.stream() + .mapToObj(i -> new ItemStack(this, 1, i)) + .forEach(aList::add); + } + + @Override + public final IIcon getIconFromDamage(int aMetaData) { + IIconContainer iconContainer = getIconContainer(aMetaData); + if (iconContainer != null) { + return iconContainer.getIcon(); + } + return null; + } + + @Override + public IIconContainer getIconContainer(int aMetaData) { + Materials material = getMaterial(aMetaData); + OrePrefixes prefix = getOrePrefix(aMetaData); + if (material != null && prefix != null) { + return material.mIconSet.mTextures[prefix.mTextureIndex]; + } + return null; + } + + @Override + public int getItemStackLimit(ItemStack aStack) { + OrePrefixes prefix = getOrePrefix(aStack.getItemDamage()); + if (prefix != null) { + return prefix.mDefaultStackSize; + } else { + return 64; + } + } +} diff --git a/src/main/java/gregtech/common/items/MetaGeneratedTool01.java b/src/main/java/gregtech/common/items/MetaGeneratedTool01.java new file mode 100644 index 0000000000..11c3fa104e --- /dev/null +++ b/src/main/java/gregtech/common/items/MetaGeneratedTool01.java @@ -0,0 +1,738 @@ +package gregtech.common.items; + +import static gregtech.common.items.IDMetaTool01.AXE; +import static gregtech.common.items.IDMetaTool01.BRANCHCUTTER; +import static gregtech.common.items.IDMetaTool01.BUTCHERYKNIFE; +import static gregtech.common.items.IDMetaTool01.BUZZSAW_HV; +import static gregtech.common.items.IDMetaTool01.BUZZSAW_LV; +import static gregtech.common.items.IDMetaTool01.BUZZSAW_MV; +import static gregtech.common.items.IDMetaTool01.CHAINSAW_HV; +import static gregtech.common.items.IDMetaTool01.CHAINSAW_LV; +import static gregtech.common.items.IDMetaTool01.CHAINSAW_MV; +import static gregtech.common.items.IDMetaTool01.CROWBAR; +import static gregtech.common.items.IDMetaTool01.DRILL_HV; +import static gregtech.common.items.IDMetaTool01.DRILL_LV; +import static gregtech.common.items.IDMetaTool01.DRILL_MV; +import static gregtech.common.items.IDMetaTool01.FILE; +import static gregtech.common.items.IDMetaTool01.HARDHAMMER; +import static gregtech.common.items.IDMetaTool01.HOE; +import static gregtech.common.items.IDMetaTool01.JACKHAMMER; +import static gregtech.common.items.IDMetaTool01.KNIFE; +import static gregtech.common.items.IDMetaTool01.MORTAR; +import static gregtech.common.items.IDMetaTool01.PICKAXE; +import static gregtech.common.items.IDMetaTool01.PLOW; +import static gregtech.common.items.IDMetaTool01.PLUNGER; +import static gregtech.common.items.IDMetaTool01.POCKET_BRANCHCUTTER; +import static gregtech.common.items.IDMetaTool01.POCKET_FILE; +import static gregtech.common.items.IDMetaTool01.POCKET_KNIFE; +import static gregtech.common.items.IDMetaTool01.POCKET_MULTITOOL; +import static gregtech.common.items.IDMetaTool01.POCKET_SAW; +import static gregtech.common.items.IDMetaTool01.POCKET_SCREWDRIVER; +import static gregtech.common.items.IDMetaTool01.POCKET_WIRECUTTER; +import static gregtech.common.items.IDMetaTool01.ROLLING_PIN; +import static gregtech.common.items.IDMetaTool01.SAW; +import static gregtech.common.items.IDMetaTool01.SCOOP; +import static gregtech.common.items.IDMetaTool01.SCREWDRIVER; +import static gregtech.common.items.IDMetaTool01.SCREWDRIVER_HV; +import static gregtech.common.items.IDMetaTool01.SCREWDRIVER_LV; +import static gregtech.common.items.IDMetaTool01.SCREWDRIVER_MV; +import static gregtech.common.items.IDMetaTool01.SENSE; +import static gregtech.common.items.IDMetaTool01.SHOVEL; +import static gregtech.common.items.IDMetaTool01.SOFTMALLET; +import static gregtech.common.items.IDMetaTool01.SOLDERING_IRON_HV; +import static gregtech.common.items.IDMetaTool01.SOLDERING_IRON_LV; +import static gregtech.common.items.IDMetaTool01.SOLDERING_IRON_MV; +import static gregtech.common.items.IDMetaTool01.SWORD; +import static gregtech.common.items.IDMetaTool01.TURBINE; +import static gregtech.common.items.IDMetaTool01.TURBINE_HUGE; +import static gregtech.common.items.IDMetaTool01.TURBINE_LARGE; +import static gregtech.common.items.IDMetaTool01.TURBINE_SMALL; +import static gregtech.common.items.IDMetaTool01.UNIVERSALSPADE; +import static gregtech.common.items.IDMetaTool01.WIRECUTTER; +import static gregtech.common.items.IDMetaTool01.WRENCH; +import static gregtech.common.items.IDMetaTool01.WRENCH_HV; +import static gregtech.common.items.IDMetaTool01.WRENCH_LV; +import static gregtech.common.items.IDMetaTool01.WRENCH_MV; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.TCAspects; +import gregtech.api.enums.ToolDictNames; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.common.tools.ToolAxe; +import gregtech.common.tools.ToolBranchCutter; +import gregtech.common.tools.ToolButcheryKnife; +import gregtech.common.tools.ToolBuzzSaw; +import gregtech.common.tools.ToolChainsawHV; +import gregtech.common.tools.ToolChainsawLV; +import gregtech.common.tools.ToolChainsawMV; +import gregtech.common.tools.ToolCrowbar; +import gregtech.common.tools.ToolDrillHV; +import gregtech.common.tools.ToolDrillLV; +import gregtech.common.tools.ToolDrillMV; +import gregtech.common.tools.ToolFile; +import gregtech.common.tools.ToolHardHammer; +import gregtech.common.tools.ToolHoe; +import gregtech.common.tools.ToolJackHammer; +import gregtech.common.tools.ToolKnife; +import gregtech.common.tools.ToolMortar; +import gregtech.common.tools.ToolPickaxe; +import gregtech.common.tools.ToolPlow; +import gregtech.common.tools.ToolPlunger; +import gregtech.common.tools.ToolRollingPin; +import gregtech.common.tools.ToolSaw; +import gregtech.common.tools.ToolScoop; +import gregtech.common.tools.ToolScrewdriver; +import gregtech.common.tools.ToolScrewdriverLV; +import gregtech.common.tools.ToolSense; +import gregtech.common.tools.ToolShovel; +import gregtech.common.tools.ToolSoftHammer; +import gregtech.common.tools.ToolSolderingIron; +import gregtech.common.tools.ToolSword; +import gregtech.common.tools.ToolTurbineHuge; +import gregtech.common.tools.ToolTurbineLarge; +import gregtech.common.tools.ToolTurbineNormal; +import gregtech.common.tools.ToolTurbineSmall; +import gregtech.common.tools.ToolUniversalSpade; +import gregtech.common.tools.ToolWireCutter; +import gregtech.common.tools.ToolWrench; +import gregtech.common.tools.ToolWrenchHV; +import gregtech.common.tools.ToolWrenchLV; +import gregtech.common.tools.ToolWrenchMV; +import gregtech.common.tools.pocket.ToolPocketBranchCutter; +import gregtech.common.tools.pocket.ToolPocketFile; +import gregtech.common.tools.pocket.ToolPocketKnife; +import gregtech.common.tools.pocket.ToolPocketMultitool; +import gregtech.common.tools.pocket.ToolPocketSaw; +import gregtech.common.tools.pocket.ToolPocketScrewdriver; +import gregtech.common.tools.pocket.ToolPocketWireCutter; + +public class MetaGeneratedTool01 extends MetaGeneratedTool { + + public static MetaGeneratedTool01 INSTANCE; + + public MetaGeneratedTool01() { + super("metatool.01"); + INSTANCE = this; + addTool( + SWORD.ID, + "Sword", + "", + new ToolSword(), + ToolDictNames.craftingToolSword, + ToolDictNames.craftingToolBlade, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.TELUM, 4L)); + addTool( + PICKAXE.ID, + "Pickaxe", + "", + new ToolPickaxe(), + ToolDictNames.craftingToolPickaxe, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 4L)); + addTool( + SHOVEL.ID, + "Shovel", + "", + new ToolShovel(), + ToolDictNames.craftingToolShovel, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 4L)); + addTool( + AXE.ID, + "Axe", + "", + new ToolAxe(), + ToolDictNames.craftingToolAxe, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + addTool( + HOE.ID, + "Hoe", + "", + new ToolHoe(), + ToolDictNames.craftingToolHoe, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MESSIS, 4L)); + addTool( + SAW.ID, + "Saw", + "Can also harvest Ice", + new ToolSaw(), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + GregTechAPI.registerTool( + addTool( + HARDHAMMER.ID, + "Hammer", + "Crushes Ores instead of harvesting them", + new ToolHardHammer(), + ToolDictNames.craftingToolHardHammer, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sHardHammerList); + GregTechAPI.registerTool( + addTool( + SOFTMALLET.ID, + "Soft Mallet", + "", + new ToolSoftHammer(), + ToolDictNames.craftingToolSoftHammer, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.LIMUS, 4L)), + GregTechAPI.sSoftHammerList); + GregTechAPI.registerTool( + addTool( + WRENCH.ID, + "Wrench", + "Hold Leftclick to dismantle Machines", + new ToolWrench(), + ToolDictNames.craftingToolWrench, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sWrenchList); + addTool( + FILE.ID, + "File", + "", + new ToolFile(), + ToolDictNames.craftingToolFile, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)); + GregTechAPI.registerTool( + addTool( + CROWBAR.ID, + "Crowbar", + "Dismounts Covers and Rotates Rails", + new ToolCrowbar(), + ToolDictNames.craftingToolCrowbar, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.TELUM, 2L)), + GregTechAPI.sCrowbarList); + GregTechAPI.registerTool( + addTool( + SCREWDRIVER.ID, + "Screwdriver", + "Adjusts Covers and Machines", + new ToolScrewdriver(), + ToolDictNames.craftingToolScrewdriver, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sScrewdriverList); + addTool( + MORTAR.ID, + "Mortar", + "", + new ToolMortar(), + ToolDictNames.craftingToolMortar, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 2L)); + GregTechAPI.registerTool( + addTool( + WIRECUTTER.ID, + "Wire Cutter", + "", + new ToolWireCutter(), + ToolDictNames.craftingToolWireCutter, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sWireCutterList); + addTool( + SCOOP.ID, + "Scoop", + "", + new ToolScoop(), + ToolDictNames.craftingToolScoop, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.BESTIA, 2L), + new TCAspects.TC_AspectStack(TCAspects.PANNUS, 2L)); + addTool( + BRANCHCUTTER.ID, + "Branch Cutter", + "", + new ToolBranchCutter(), + ToolDictNames.craftingToolBranchCutter, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 2L)); + GregTechAPI.registerTool( + addTool( + UNIVERSALSPADE.ID, + "Universal Spade", + "", + new ToolUniversalSpade(), + ToolDictNames.craftingToolBlade, + ToolDictNames.craftingToolShovel, + ToolDictNames.craftingToolCrowbar, + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.TELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.METO, 1L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 1L)), + GregTechAPI.sCrowbarList); + addTool( + KNIFE.ID, + "Knife", + "", + new ToolKnife(), + ToolDictNames.craftingToolBlade, + ToolDictNames.craftingToolKnife, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.TELUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 2L)); + addTool( + BUTCHERYKNIFE.ID, + "Butchery Knife", + "Has a slow Attack Rate", + new ToolButcheryKnife(), + ToolDictNames.craftingToolBlade, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.CORPUS, 4L)); + + addTool( + SENSE.ID, + "Sense", + "Because a Scythe doesn't make Sense", + new ToolSense(), + ToolDictNames.craftingToolBlade, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.HERBA, 2L), + new TCAspects.TC_AspectStack(TCAspects.MORTUUS, 2L)); + addTool( + PLOW.ID, + "Plow", + "Used to get rid of Snow", + new ToolPlow(), + ToolDictNames.craftingToolPlow, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 2L)); + addTool( + PLUNGER.ID, + "Plunger", + "", + new ToolPlunger(), + ToolDictNames.craftingToolPlunger, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2L), + new TCAspects.TC_AspectStack(TCAspects.ITER, 2L)); + addTool( + ROLLING_PIN.ID, + "Rolling Pin", + "", + new ToolRollingPin(), + ToolDictNames.craftingToolRollingPin, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.LIMUS, 4L)); + + addTool( + DRILL_LV.ID, + "Drill (LV)", + "", + new ToolDrillLV(), + ToolDictNames.craftingToolMiningDrill, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 4L)); + addTool( + DRILL_MV.ID, + "Drill (MV)", + "", + new ToolDrillMV(), + ToolDictNames.craftingToolMiningDrill, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 4L)); + addTool( + DRILL_HV.ID, + "Drill (HV)", + "", + new ToolDrillHV(), + ToolDictNames.craftingToolMiningDrill, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 4L)); + addTool( + CHAINSAW_LV.ID, + "Chainsaw (LV)", + "Can also harvest Ice", + new ToolChainsawLV(), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + addTool( + CHAINSAW_MV.ID, + "Chainsaw (MV)", + "Can also harvest Ice", + new ToolChainsawMV(), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + addTool( + CHAINSAW_HV.ID, + "Chainsaw (HV)", + "Can also harvest Ice", + new ToolChainsawHV(), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.METO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + GregTechAPI.registerTool( + addTool( + WRENCH_LV.ID, + "Wrench (LV)", + "Hold Left Button to dismantle Machines", + new ToolWrenchLV(), + ToolDictNames.craftingToolWrench, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sWrenchList); + GregTechAPI.registerTool( + addTool( + WRENCH_MV.ID, + "Wrench (MV)", + "Hold Left Button to dismantle Machines", + new ToolWrenchMV(), + ToolDictNames.craftingToolWrench, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sWrenchList); + GregTechAPI.registerTool( + addTool( + WRENCH_HV.ID, + "Wrench (HV)", + "Hold Left Button to dismantle Machines", + new ToolWrenchHV(), + ToolDictNames.craftingToolWrench, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 4L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sWrenchList); + GregTechAPI.registerTool( + addTool( + JACKHAMMER.ID, + "JackHammer (HV)", + "Breaks Rocks into pieces", + new ToolJackHammer(), + ToolDictNames.craftingToolJackHammer, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 2L)), + GregTechAPI.sJackhammerList); + addTool( + BUZZSAW_LV.ID, + "Buzzsaw (LV)", + "Not suitable for harvesting Blocks", + new ToolBuzzSaw(), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + addTool( + BUZZSAW_MV.ID, + "Buzzsaw (MV)", + "Not suitable for harvesting Blocks", + new ToolBuzzSaw(), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + addTool( + BUZZSAW_HV.ID, + "Buzzsaw (HV)", + "Not suitable for harvesting Blocks", + new ToolBuzzSaw(), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2L)); + GregTechAPI.registerTool( + addTool( + SCREWDRIVER_LV.ID, + "Screwdriver (LV)", + "Adjusts Covers and Machines", + new ToolScrewdriverLV(), + ToolDictNames.craftingToolScrewdriver, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sScrewdriverList); + GregTechAPI.registerTool( + addTool( + SCREWDRIVER_MV.ID, + "Screwdriver (MV)", + "Adjusts Covers and Machines", + new ToolScrewdriverLV(), + ToolDictNames.craftingToolScrewdriver, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sScrewdriverList); + GregTechAPI.registerTool( + addTool( + SCREWDRIVER_HV.ID, + "Screwdriver (HV)", + "Adjusts Covers and Machines", + new ToolScrewdriverLV(), + ToolDictNames.craftingToolScrewdriver, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sScrewdriverList); + GregTechAPI.registerTool( + addTool( + SOLDERING_IRON_LV.ID, + "Soldering Iron (LV)", + "Fixes burned out Circuits. Needs soldering materials in inventory.", + new ToolSolderingIron(), + ToolDictNames.craftingToolSolderingIron, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sSolderingToolList); + GregTechAPI.registerTool( + addTool( + SOLDERING_IRON_MV.ID, + "Soldering Iron (MV)", + "Fixes burned out Circuits. Needs soldering materials in inventory.", + new ToolSolderingIron(), + ToolDictNames.craftingToolSolderingIron, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sSolderingToolList); + GregTechAPI.registerTool( + addTool( + SOLDERING_IRON_HV.ID, + "Soldering Iron (HV)", + "Fixes burned out Circuits. Needs soldering materials in inventory.", + new ToolSolderingIron(), + ToolDictNames.craftingToolSolderingIron, + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 2L), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 2L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 2L)), + GregTechAPI.sSolderingToolList); + + addTool(TURBINE_SMALL.ID, "Small Turbine", "Turbine Rotors for your power station", new ToolTurbineSmall()); + addTool(TURBINE.ID, "Turbine", "Turbine Rotors for your power station", new ToolTurbineNormal()); + addTool(TURBINE_LARGE.ID, "Large Turbine", "Turbine Rotors for your power station", new ToolTurbineLarge()); + addTool(TURBINE_HUGE.ID, "Huge Turbine", "Turbine Rotors for your power station", new ToolTurbineHuge()); + + addTool( + POCKET_MULTITOOL.ID, + "Pocket Multitool", + "6 useful Tools in one!", + new ToolPocketMultitool(POCKET_KNIFE.ID), + null, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 6), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 3), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3)); + addTool( + POCKET_KNIFE.ID, + "Pocket Multitool (Knife)", + "", + new ToolPocketKnife(POCKET_SAW.ID), + ToolDictNames.craftingToolKnife, + ToolDictNames.craftingToolBlade, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 6), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 3), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3)); + addTool( + POCKET_SAW.ID, + "Pocket Multitool (Saw)", + "Can also harvest Ice", + new ToolPocketSaw(POCKET_FILE.ID), + ToolDictNames.craftingToolSaw, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 6), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 3), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3)); + addTool( + POCKET_FILE.ID, + "Pocket Multitool (File)", + "", + new ToolPocketFile(POCKET_SCREWDRIVER.ID), + ToolDictNames.craftingToolFile, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 6), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 3), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3)); + GregTechAPI.registerTool( + addTool( + POCKET_SCREWDRIVER.ID, + "Pocket Multitool (Screwdriver)", + "Adjusts Covers and Machines", + new ToolPocketScrewdriver(POCKET_WIRECUTTER.ID), + ToolDictNames.craftingToolScrewdriver, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 6), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 3), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3)), + GregTechAPI.sScrewdriverList); + GregTechAPI.registerTool( + addTool( + POCKET_WIRECUTTER.ID, + "Pocket Multitool (Wire Cutter)", + "", + new ToolPocketWireCutter(POCKET_BRANCHCUTTER.ID), + ToolDictNames.craftingToolWireCutter, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 6), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 3), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3)), + GregTechAPI.sWireCutterList); + addTool( + POCKET_BRANCHCUTTER.ID, + "Pocket Multitool (Branch Cutter)", + "", + new ToolPocketBranchCutter(POCKET_MULTITOOL.ID), + ToolDictNames.craftingToolBranchCutter, + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 6), + new TCAspects.TC_AspectStack(TCAspects.FABRICO, 3), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3)); + initCraftingShapedRecipes(); + initCraftingShapelessRecipes(); + } + + private void initCraftingShapelessRecipes() { + GTModHandler.addShapelessCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.coal, 1) }); + GTModHandler.addShapelessCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Blocks.clay, 1) }); + GTModHandler.addShapelessCraftingRecipe( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.wheat, 1) }); + GTModHandler.addShapelessCraftingRecipe( + new ItemStack(Items.flint, 1), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Blocks.gravel, 1) }); + GTModHandler.addShapelessCraftingRecipe( + new ItemStack(Items.blaze_powder, 2), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.blaze_rod, 1) }); + } + + private void initCraftingShapedRecipes() { + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Flint, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', new ItemStack(Items.flint, 1), 'S', OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Bronze, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Bronze), 'S', OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Iron, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Iron), 'S', OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Steel, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Steel), 'S', OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.WroughtIron, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.WroughtIron), 'S', + OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.RedSteel, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.RedSteel), 'S', + OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.BlueSteel, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlueSteel), 'S', + OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.BlackSteel, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlackSteel), 'S', + OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.DamascusSteel, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.DamascusSteel), 'S', + OrePrefixes.stone }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(MORTAR.ID, 1, Materials.Thaumium, Materials.Stone, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Thaumium), 'S', + OrePrefixes.stone }); + + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.Wood, Materials.Wood, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " S", " I ", "S f", 'I', OrePrefixes.plank.get(Materials.Wood), 'S', + OrePrefixes.stick.get(Materials.Wood) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.Plastic, Materials.Plastic, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Plastic), 'S', + OrePrefixes.stick.get(Materials.Plastic) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.Aluminium, Materials.Aluminium, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Aluminium), 'S', + OrePrefixes.stick.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.StainlessSteel, Materials.StainlessSteel, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.StainlessSteel), 'S', + OrePrefixes.stick.get(Materials.StainlessSteel) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(ROLLING_PIN.ID, 1, Materials.IronWood, Materials.IronWood, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.IronWood), 'S', + OrePrefixes.stick.get(Materials.IronWood) }); + + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(SWORD.ID, 1, Materials.Flint, Materials.Wood, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "F", "F", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', + new ItemStack(Items.flint, 1) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(PICKAXE.ID, 1, Materials.Flint, Materials.Wood, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "FFF", " S ", " S ", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', + new ItemStack(Items.flint, 1) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(SHOVEL.ID, 1, Materials.Flint, Materials.Wood, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "F", "S", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', + new ItemStack(Items.flint, 1) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(AXE.ID, 1, Materials.Flint, Materials.Wood, null), + GTModHandler.RecipeBits.MIRRORED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "FF", "FS", " S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', + new ItemStack(Items.flint, 1) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(HOE.ID, 1, Materials.Flint, Materials.Wood, null), + GTModHandler.RecipeBits.MIRRORED | GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "FF", " S", " S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', + new ItemStack(Items.flint, 1) }); + GTModHandler.addCraftingRecipe( + INSTANCE.getToolWithStats(KNIFE.ID, 1, Materials.Flint, Materials.Wood, null), + GTModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "F", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F', new ItemStack(Items.flint, 1) }); + } +} diff --git a/src/main/java/gregtech/common/items/PollenType.java b/src/main/java/gregtech/common/items/PollenType.java index 3cd9484b69..85b87b54c4 100644 --- a/src/main/java/gregtech/common/items/PollenType.java +++ b/src/main/java/gregtech/common/items/PollenType.java @@ -1,7 +1,7 @@ package gregtech.common.items; import gregtech.api.enums.Materials; -import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GTLanguageManager; public enum PollenType { @@ -23,7 +23,7 @@ public enum PollenType { } public String getName() { - return GT_LanguageManager.addStringLocalization( + return GTLanguageManager.addStringLocalization( "pollen." + this.name, this.name.substring(0, 1) .toUpperCase() + this.name.substring(1) + " Pollen"); diff --git a/src/main/java/gregtech/common/items/PropolisType.java b/src/main/java/gregtech/common/items/PropolisType.java index e6f08b0cfa..746f2d0916 100644 --- a/src/main/java/gregtech/common/items/PropolisType.java +++ b/src/main/java/gregtech/common/items/PropolisType.java @@ -1,7 +1,7 @@ package gregtech.common.items; import gregtech.api.enums.Materials; -import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GTLanguageManager; public enum PropolisType { @@ -34,7 +34,7 @@ public enum PropolisType { public String getName() { // return "gt.comb."+this.name; - return GT_LanguageManager.addStringLocalization( + return GTLanguageManager.addStringLocalization( "propolis." + this.name, this.name.substring(0, 1) .toUpperCase() + this.name.substring(1) + " Propolis"); diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java b/src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java new file mode 100644 index 0000000000..b39135fed2 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java @@ -0,0 +1,193 @@ +package gregtech.common.items.behaviors; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; + +public class BehaviourCoverTool extends BehaviourNone { + + public static final IItemBehaviour INSTANCE = new BehaviourCoverTool(); + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.cover_copy_paste", "Can copy/paste cover data."); + + private ISerializableObject mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + private int mCoverType; + private int mTickRateAddition = 0; + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + final NBTTagCompound tNBT = aStack.getTagCompound(); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + final boolean isCopyMode = aPlayer.isSneaking(); + initDataFromNBT(tNBT); + if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 100.0D))) { + if (isCopyMode) { + ArrayList tList = new ArrayList<>(); + doCopy(tTileEntity, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ, tList); + aItem.discharge(aStack, 100.0D, Integer.MAX_VALUE, true, false, false); + writeListToNBT(tList, tNBT, aPlayer); + saveDataToNBT(tNBT); + } else { + doPaste(tTileEntity, side, hitX, hitY, hitZ, aPlayer); + aItem.discharge(aStack, 25.0D, Integer.MAX_VALUE, true, false, false); + } + } + GTUtility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ); + return aPlayer instanceof EntityPlayerMP; + } + + private void initDataFromNBT(NBTTagCompound aNBT) { + if (aNBT != null) { + mCoverType = aNBT.getInteger("mCoverType"); + CoverBehaviorBase tBehavior = GregTechAPI.getCoverBehaviorNew(mCoverType); + NBTBase tData = aNBT.getTag("mCoverData"); + if (tData != null) mStoredData = tBehavior.createDataObject(tData); + else mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mTickRateAddition = aNBT.hasKey("mTickRateAddition") ? aNBT.getInteger("mTickRateAddition") : 0; + } + } + + private void saveDataToNBT(NBTTagCompound aNBT) { + aNBT.setInteger("mCoverType", mCoverType); + if (mStoredData == null) mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + aNBT.setTag("mCoverData", mStoredData.saveDataToNBT()); + aNBT.setInteger("mTickRateAddition", mTickRateAddition); + } + + @SuppressWarnings("rawtypes") + private void writeListToNBT(List aList, NBTTagCompound aNBT, EntityPlayer aPlayer) { + if (aList != null && aNBT != null) { + int tSize = aList.size(); + aNBT.setInteger("dataLinesCount", tSize); + for (int i = 0; i < tSize; i++) { + aNBT.setString("dataLines" + i, (String) aList.get(i)); + GTUtility.sendChatToPlayer(aPlayer, (String) aList.get(i)); + } + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private void doCopy(TileEntity aTileEntity, World aWorld, int aX, int aY, int aZ, ForgeDirection side, float hitX, + float hitY, float hitZ, List aList) { + aList.add( + "----- X: " + EnumChatFormatting.AQUA + + GTUtility.formatNumbers(aX) + + EnumChatFormatting.RESET + + " Y: " + + EnumChatFormatting.AQUA + + GTUtility.formatNumbers(aY) + + EnumChatFormatting.RESET + + " Z: " + + EnumChatFormatting.AQUA + + GTUtility.formatNumbers(aZ) + + EnumChatFormatting.RESET + + " D: " + + EnumChatFormatting.AQUA + + aWorld.provider.dimensionId + + EnumChatFormatting.RESET + + " -----"); + if (aTileEntity instanceof ICoverable tCoverable) { + final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side + : tCoverable.getCoverItemAtSide(GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null + ? GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ) + : ForgeDirection.UNKNOWN; + if (tSide != ForgeDirection.UNKNOWN) { + if (tCoverable.getCoverBehaviorAtSideNew(tSide) + .allowsCopyPasteTool()) { + mStoredData = tCoverable.getComplexCoverDataAtSide(tSide); + mCoverType = tCoverable.getCoverIDAtSide(tSide); + mTickRateAddition = tCoverable.getCoverInfoAtSide(tSide) + .getTickRateAddition(); + + aList.add("Block Side: " + EnumChatFormatting.AQUA + tSide.name() + EnumChatFormatting.RESET); + aList.add( + "Cover Type: " + EnumChatFormatting.GREEN + + tCoverable.getCoverItemAtSide(tSide) + .getDisplayName() + + EnumChatFormatting.RESET); + } else { + mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mCoverType = 0; + mTickRateAddition = 0; + aList.add("Copy unavailable for this cover type"); + } + } else { + mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mCoverType = 0; + mTickRateAddition = 0; + aList.add("No Cover Found"); + } + } else { + mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mCoverType = 0; + mTickRateAddition = 0; + aList.add("No Cover Found"); + } + } + + private void doPaste(TileEntity aTileEntity, ForgeDirection side, float hitX, float hitY, float hitZ, + EntityPlayer aPlayer) { + if (aTileEntity instanceof ICoverable tCoverable) { + if (mCoverType == 0 || mStoredData == null) { + GTUtility.sendChatToPlayer(aPlayer, "Please Copy a Valid Cover First."); + return; + } + final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side + : tCoverable.getCoverItemAtSide(GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null + ? GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ) + : ForgeDirection.UNKNOWN; + if (tSide != ForgeDirection.UNKNOWN) { + int tCoverID = tCoverable.getCoverIDAtSide(tSide); + if (tCoverID == mCoverType) { + tCoverable.setCoverDataAtSide(tSide, mStoredData); + tCoverable.getCoverInfoAtSide(tSide) + .setTickRateAddition(mTickRateAddition); + GTUtility.sendChatToPlayer(aPlayer, "Cover Data Pasted."); + } else { + GTUtility.sendChatToPlayer(aPlayer, "Not Matched Cover."); + } + } else { + GTUtility.sendChatToPlayer(aPlayer, "No Cover Found."); + } + } + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + try { + final NBTTagCompound tNBT = aStack.getTagCompound(); + final int tSize = tNBT.getInteger("dataLinesCount"); + if (tSize < 1) throw new Exception(); + aList.add(EnumChatFormatting.BLUE + "Stored Cover Data:"); + for (int i = 0; i < tSize; i++) { + aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i)); + } + } catch (Exception e) { + aList.add(this.mTooltip); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java b/src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java new file mode 100644 index 0000000000..76c215bfd0 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java @@ -0,0 +1,61 @@ +package gregtech.common.items.behaviors; + +import static gregtech.api.enums.Mods.Railcraft; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class BehaviourCrowbar extends BehaviourNone { + + private final int mVanillaCosts; + private final int mEUCosts; + + public BehaviourCrowbar(int aVanillaCosts, int aEUCosts) { + this.mVanillaCosts = aVanillaCosts; + this.mEUCosts = aEUCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + if (GTModHandler.getModItem(Railcraft.ID, "fluid.creosote.bucket", 1L) != null) { + return false; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock == null) { + return false; + } + byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); + if (aBlock == Blocks.rail) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 1) % 10, 0); + aWorld.isRemote = false; + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if ((aBlock == Blocks.detector_rail) || (aBlock == Blocks.activator_rail) || (aBlock == Blocks.golden_rail)) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, aBlock, aMeta / 8 * 8 + (aMeta % 8 + 1) % 6, 0); + aWorld.isRemote = false; + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + return false; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java b/src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java new file mode 100644 index 0000000000..c5d045ecd0 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java @@ -0,0 +1,105 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourDataOrb extends BehaviourNone { + + public static void copyInventory(ItemStack[] aInventory, ItemStack[] aNewContent, int aIndexlength) { + for (int i = 0; i < aIndexlength; i++) { + if (aNewContent[i] == null) { + aInventory[i] = null; + } else { + aInventory[i] = GTUtility.copyOrNull(aNewContent[i]); + } + } + } + + public static String getDataName(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("mDataName"); + } + + public static String getDataTitle(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("mDataTitle"); + } + + public static NBTTagCompound setDataName(ItemStack aStack, String aDataName) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + tNBT.setString("mDataName", aDataName); + aStack.setTagCompound(tNBT); + return tNBT; + } + + public static NBTTagCompound setDataTitle(ItemStack aStack, String aDataTitle) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + tNBT.setString("mDataTitle", aDataTitle); + aStack.setTagCompound(tNBT); + return tNBT; + } + + public static ItemStack[] getNBTInventory(ItemStack aStack) { + ItemStack[] tInventory = new ItemStack[256]; + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return tInventory; + } + NBTTagList tNBT_ItemList = tNBT.getTagList("Inventory", 10); + for (int i = 0; i < tNBT_ItemList.tagCount(); i++) { + NBTTagCompound tag = tNBT_ItemList.getCompoundTagAt(i); + byte slot = tag.getByte("Slot"); + if (slot >= 0) { + tInventory[slot] = GTUtility.loadItem(tag); + } + } + return tInventory; + } + + public static NBTTagCompound setNBTInventory(ItemStack aStack, ItemStack[] aInventory) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + NBTTagList tNBT_ItemList = new NBTTagList(); + for (int i = 0; i < aInventory.length; i++) { + ItemStack stack = aInventory[i]; + if (stack != null) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + stack.writeToNBT(tag); + tNBT_ItemList.appendTag(tag); + } + } + tNBT.setTag("Inventory", tNBT_ItemList); + aStack.setTagCompound(tNBT); + return tNBT; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + if (!(getDataTitle(aStack).length() == 0)) { + aList.add(getDataTitle(aStack)); + aList.add(getDataName(aStack)); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java b/src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java new file mode 100644 index 0000000000..63462b8d9b --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java @@ -0,0 +1,52 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourDataStick extends BehaviourNone { + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + String tString = GTUtility.ItemNBT.getBookTitle(aStack); + if (GTUtility.isStringValid(tString)) { + aList.add(tString); + } + tString = GTUtility.ItemNBT.getBookAuthor(aStack); + if (GTUtility.isStringValid(tString)) { + aList.add("by " + tString); + } + short tMapID = GTUtility.ItemNBT.getMapID(aStack); + if (tMapID >= 0) { + aList.add("Map ID: " + tMapID); + } + tString = GTUtility.ItemNBT.getPunchCardData(aStack); + if (GTUtility.isStringValid(tString)) { + aList.add("Punch Card Data"); + int i = 0; + int j = tString.length(); + for (; i < j; i += 64) { + aList.add(tString.substring(i, Math.min(i + 64, j))); + } + } + short sTier = GTUtility.ItemNBT.getNBT(aStack) + .getShort("rocket_tier"); + if (sTier > 0 && sTier < 100) { + aList.add("Rocket Schematic Tier: " + sTier); + } else if (sTier >= 100) { + switch (sTier) { + case 100 -> aList.add("Moonbuggy Schematic"); + case 101 -> aList.add("Cargo-Rocket Schematic"); + case 102 -> aList.add("Astro-Miner Schematic"); + } + } + long lastUpdate = GTUtility.ItemNBT.getNBT(aStack) + .getLong("lastUpdate"); + if (lastUpdate != 0) aList.add(String.format("Last update at: %tc", lastUpdate)); + + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java b/src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java new file mode 100644 index 0000000000..ca9166b581 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java @@ -0,0 +1,72 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.UseHoeEvent; + +import cpw.mods.fml.common.eventhandler.Event; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder; + +public class BehaviourHoe extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager.addStringLocalization("gt.behaviour.hoe", "Can till Dirt"); + + public BehaviourHoe(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUse(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, + int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { + if (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) { + return false; + } + UseHoeEvent event = new UseHoeEvent(aPlayer, aStack, aWorld, aX, aY, aZ); + if (MinecraftForge.EVENT_BUS.post(event)) { + return false; + } + if (event.getResult() == Event.Result.ALLOW) { + if (!aPlayer.capabilities.isCreativeMode) { + ((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts); + } + return true; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if ((ordinalSide != 0) && (GTUtility.isBlockAir(aWorld, aX, aY + 1, aZ)) + && ((aBlock == Blocks.grass) || (aBlock == Blocks.dirt))) { + new WorldSpawnedEventBuilder.SoundEventBuilder() + .setVolume((Blocks.farmland.stepSound.getVolume() + 1.0F) / 2.0F) + .setPitch(Blocks.farmland.stepSound.getPitch() * 0.8F) + .setIdentifier(Blocks.farmland.stepSound.getStepResourcePath()) + .setPosition(aX + 0.5F, aY + 0.5F, aZ + 0.5F) + .setWorld(aWorld) + .run(); + if (aWorld.isRemote) { + return true; + } + aWorld.setBlock(aX, aY, aZ, Blocks.farmland); + if (!aPlayer.capabilities.isCreativeMode) { + ((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts); + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java b/src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java new file mode 100644 index 0000000000..9c9c8ab9f0 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java @@ -0,0 +1,139 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.math.MathHelper; +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourLighter extends BehaviourNone { + + private final ItemStack mEmptyLighter; + private final ItemStack mUsedLighter; + private final ItemStack mFullLighter; + private final long mFuelAmount; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.lighter.tooltip", "Can light things on Fire"); + private final String mTooltipUses = GTLanguageManager + .addStringLocalization("gt.behaviour.lighter.uses", "Remaining Uses:"); + private final String mTooltipUnstackable = GTLanguageManager + .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!"); + + public BehaviourLighter(ItemStack aEmptyLighter, ItemStack aUsedLighter, ItemStack aFullLighter, long aFuelAmount) { + this.mFullLighter = aFullLighter; + this.mUsedLighter = aUsedLighter; + this.mEmptyLighter = aEmptyLighter; + this.mFuelAmount = aFuelAmount; + } + + @Override + public boolean onLeftClickEntity(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + if ((aPlayer.worldObj.isRemote) || (aStack.stackSize != 1)) { + return false; + } + boolean rOutput = false; + if ((aEntity instanceof EntityCreeper)) { + prepare(aStack); + long tFuelAmount = GTUtility.ItemNBT.getLighterFuel(aStack); + if (GTUtility.areStacksEqual(aStack, this.mUsedLighter, true)) { + GTUtility.sendSoundToPlayers( + aPlayer.worldObj, + SoundResource.FIRE_IGNITE, + 1.0F, + 1.0F, + MathHelper.floor_double(aEntity.posX), + MathHelper.floor_double(aEntity.posY), + MathHelper.floor_double(aEntity.posZ)); + ((EntityCreeper) aEntity).func_146079_cb(); + if (!aPlayer.capabilities.isCreativeMode) { + tFuelAmount -= 1L; + } + rOutput = true; + } + GTUtility.ItemNBT.setLighterFuel(aStack, tFuelAmount); + if (tFuelAmount <= 0L) { + useUp(aStack); + } + } + return rOutput; + } + + @Override + public boolean onItemUse(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, + int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if ((aWorld.isRemote) || (aStack.stackSize != 1)) { + return false; + } + boolean rOutput = false; + + aX += side.offsetX; + aY += side.offsetY; + aZ += side.offsetZ; + if ((!GTUtility.isBlockAir(aWorld, aX, aY, aZ)) + || (!aPlayer.canPlayerEdit(aX, aY, aZ, side.ordinal(), aStack))) { + return false; + } + prepare(aStack); + long tFuelAmount = GTUtility.ItemNBT.getLighterFuel(aStack); + if (GTUtility.areStacksEqual(aStack, this.mUsedLighter, true)) { + GTUtility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ); + aWorld.setBlock(aX, aY, aZ, Blocks.fire); + if (!aPlayer.capabilities.isCreativeMode) { + tFuelAmount -= 1L; + } + rOutput = true; + } + GTUtility.ItemNBT.setLighterFuel(aStack, tFuelAmount); + if (tFuelAmount <= 0L) { + useUp(aStack); + } + return rOutput; + } + + private void prepare(ItemStack aStack) { + if (GTUtility.areStacksEqual(aStack, this.mFullLighter, true)) { + aStack.func_150996_a(this.mUsedLighter.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsedLighter)); + GTUtility.ItemNBT.setLighterFuel(aStack, this.mFuelAmount); + } + } + + private void useUp(ItemStack aStack) { + if (this.mEmptyLighter == null) { + aStack.stackSize -= 1; + } else { + aStack.func_150996_a(this.mEmptyLighter.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmptyLighter)); + } + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + NBTTagCompound tNBT = aStack.getTagCompound(); + long tFuelAmount = tNBT == null ? this.mFuelAmount + : GTUtility.areStacksEqual(aStack, this.mFullLighter, true) ? this.mFuelAmount + : tNBT.getLong("GT.LighterFuel"); + aList.add(this.mTooltipUses + " " + tFuelAmount); + aList.add(this.mTooltipUnstackable); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourNone.java b/src/main/java/gregtech/common/items/behaviors/BehaviourNone.java new file mode 100644 index 0000000000..f8b5f74b72 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourNone.java @@ -0,0 +1,90 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SubTag; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.items.MetaBaseItem; + +public class BehaviourNone implements IItemBehaviour { + + @Override + public boolean onLeftClickEntity(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + return false; + } + + @Override + public boolean onItemUse(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, + int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public ItemStack onItemRightClick(MetaBaseItem aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + return aStack; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + return aList; + } + + @Override + public void onUpdate(MetaBaseItem aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, + boolean aIsInHand) {} + + @Override + public boolean isItemStackUsable(MetaBaseItem aItem, ItemStack aStack) { + return true; + } + + @Override + public boolean canDispense(MetaBaseItem aItem, IBlockSource aSource, ItemStack aStack) { + return false; + } + + @Override + public ItemStack onDispense(MetaBaseItem aItem, IBlockSource aSource, ItemStack aStack) { + EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata()); + IPosition iposition = BlockDispenser.func_149939_a(aSource); + ItemStack itemstack1 = aStack.splitStack(1); + BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition); + return aStack; + } + + @Override + public boolean hasProjectile(MetaBaseItem aItem, SubTag aProjectileType, ItemStack aStack) { + return false; + } + + @Override + public EntityArrow getProjectile(MetaBaseItem aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, + double aX, double aY, double aZ) { + return null; + } + + @Override + public EntityArrow getProjectile(MetaBaseItem aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, + EntityLivingBase aEntity, float aSpeed) { + return null; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java new file mode 100644 index 0000000000..910ea2d2d4 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java @@ -0,0 +1,54 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import thaumcraft.api.aspects.IEssentiaTransport; + +public class BehaviourPlungerEssentia extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.plunger.essentia", "Clears Essentia from Containers and Tubes"); + + public BehaviourPlungerEssentia(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (((aTileEntity instanceof IEssentiaTransport)) + && ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts)))) { + GTUtility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) { + ((IEssentiaTransport) aTileEntity).takeEssentia( + ((IEssentiaTransport) aTileEntity).getEssentiaType(tDirection), + ((IEssentiaTransport) aTileEntity).getEssentiaAmount(tDirection), + tDirection); + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java new file mode 100644 index 0000000000..b406b27b15 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java @@ -0,0 +1,75 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.implementations.MTEBasicTank; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourPlungerFluid extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.plunger.fluid", "Clears 1000 Liters of Fluid from Tanks"); + + public BehaviourPlungerFluid(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((aTileEntity instanceof IFluidHandler)) { + for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) { + if (((IFluidHandler) aTileEntity).drain(tDirection, 1000, false) != null) { + if ((aPlayer.capabilities.isCreativeMode) + || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + ((IFluidHandler) aTileEntity).drain(tDirection, 1000, true); + GTUtility.sendSoundToPlayers( + aWorld, + SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, + 1.0F, + -1.0F, + aX, + aY, + aZ); + return true; + } + } + } + } + if (aTileEntity instanceof IGregTechTileEntity tTileEntity) { + IMetaTileEntity mTileEntity = tTileEntity.getMetaTileEntity(); + if (mTileEntity instanceof MTEBasicTank machine) { + if (machine.mFluid != null && machine.mFluid.amount > 0) + machine.mFluid.amount = machine.mFluid.amount - Math.min(machine.mFluid.amount, 1000); + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + return true; + } + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java new file mode 100644 index 0000000000..c0db5c76b4 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java @@ -0,0 +1,88 @@ +package gregtech.common.items.behaviors; + +import java.util.HashMap; +import java.util.List; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.metatileentity.IMetaTileEntityItemPipe; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourPlungerItem extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.plunger.item", "Clears Items from Pipes"); + + public BehaviourPlungerItem(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (aTileEntity instanceof IGregTechTileEntity gtTE) { + IMetaTileEntity tMetaTileEntity = gtTE.getMetaTileEntity(); + if ((tMetaTileEntity instanceof IMetaTileEntityItemPipe)) { + for (IMetaTileEntityItemPipe tTileEntity : GTUtility + .sortMapByValuesAcending( + IMetaTileEntityItemPipe.Util + .scanPipes((IMetaTileEntityItemPipe) tMetaTileEntity, new HashMap<>(), 0L, false, true)) + .keySet()) { + int i = 0; + for (int j = tTileEntity.getSizeInventory(); i < j; i++) { + if (tTileEntity.isValidSlot(i)) { + if ((tTileEntity.getStackInSlot(i) != null) && ((aPlayer.capabilities.isCreativeMode) + || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts)))) { + final ItemStack tStack = tTileEntity.decrStackSize(i, 64); + if (tStack != null) { + final EntityItem tEntity = new EntityItem( + aWorld, + gtTE.getOffsetX(side, 1) + 0.5D, + gtTE.getOffsetY(side, 1) + 0.5D, + gtTE.getOffsetZ(side, 1) + 0.5D, + tStack); + tEntity.motionX = 0.0D; + tEntity.motionY = 0.0D; + tEntity.motionZ = 0.0D; + aWorld.spawnEntityInWorld(tEntity); + GTUtility.sendSoundToPlayers( + aWorld, + SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, + 1.0F, + -1.0F, + aX, + aY, + aZ); + } + return true; + } + } + } + } + } + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java new file mode 100644 index 0000000000..0716ffae7e --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java @@ -0,0 +1,39 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourPrintedPages extends BehaviourNone { + + public static String getTitle(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("title"); + } + + public static String getAuthor(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("author"); + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + if (GTUtility.isStringValid(getTitle(aStack))) { + aList.add(getTitle(aStack)); + } + if (GTUtility.isStringValid(getAuthor(aStack))) { + aList.add("by " + getAuthor(aStack)); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java b/src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java new file mode 100644 index 0000000000..98aed597f9 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java @@ -0,0 +1,158 @@ +package gregtech.common.items.behaviors; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidBlock; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.XSTR; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; + +public class BehaviourProspecting extends BehaviourNone { + + private final int mVanillaCosts; + private final int mEUCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.prospecting", "Usable for Prospecting"); + + public BehaviourProspecting(int aVanillaCosts, int aEUCosts) { + this.mVanillaCosts = aVanillaCosts; + this.mEUCosts = aEUCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock == null) { + return false; + } + byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); + + ItemData tAssociation = GTOreDictUnificator.getAssociation(new ItemStack(aBlock, 1, aMeta)); + if (tAssociation != null && tAssociation.mPrefix != null + && tAssociation.mMaterial != null + && tAssociation.mPrefix.toString() + .startsWith("ore")) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("100", "This is ") + tAssociation.mMaterial.mMaterial.mDefaultLocalName + + GTUtility.trans("101", " Ore.")); + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ); + return true; + } + + if (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTechAPI.sBlockStones) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTechAPI.sBlockGranites) + || aBlock == GregTechAPI.sBlockOresUb1 + || aBlock == GregTechAPI.sBlockOresUb2 + || aBlock == GregTechAPI.sBlockOresUb3 + || aBlock == GregTechAPI.sBlockOres1) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ); + int tMetaID; + int tQuality = aItem instanceof MetaGeneratedTool ? aItem.getHarvestLevel(aStack, "") : 0; + int tX = aX, tY = aY, tZ = aZ; + Block tBlock; + for (int i = 0, j = 6 + tQuality; i < j; i++) { + tX -= side.offsetX; + tY -= side.offsetY; + tZ -= side.offsetZ; + + tBlock = aWorld.getBlock(tX, tY, tZ); + if (tBlock == Blocks.lava || tBlock == Blocks.flowing_lava) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("102", "There is Lava behind this Rock.")); + break; + } + if (tBlock instanceof BlockLiquid || tBlock instanceof IFluidBlock) { + GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("103", "There is a Liquid behind this Rock.")); + break; + } + if (tBlock == Blocks.monster_egg || !GTUtility.hasBlockHitBox(aWorld, tX, tY, tZ)) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("104", "There is an Air Pocket behind this Rock.")); + break; + } + if (tBlock != aBlock) { + if (i < 4) GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("105", "Material is changing behind this Rock.")); + break; + } + } + + final Random tRandom = new XSTR(aX ^ aY ^ aZ ^ side.ordinal()); + for (int i = 0, j = 9 + 2 * tQuality; i < j; i++) { + tX = aX - 4 - tQuality + tRandom.nextInt(j); + tY = aY - 4 - tQuality + tRandom.nextInt(j); + tZ = aZ - 4 - tQuality + tRandom.nextInt(j); + tBlock = aWorld.getBlock(tX, tY, tZ); + if (tBlock instanceof BlockOresAbstract) { + final TileEntity tTileEntity = aWorld.getTileEntity(tX, tY, tZ); + if (tTileEntity instanceof TileEntityOres) { + final Materials tMaterial = GregTechAPI.sGeneratedMaterials[((TileEntityOres) tTileEntity).mMetaData + % 1000]; + if (tMaterial != null && tMaterial != Materials._NULL) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("106", "Found traces of ") + tMaterial.mDefaultLocalName + + GTUtility.trans("101", " Ore.")); + return true; + } + } + } else { + tMetaID = aWorld.getBlockMetadata(tX, tY, tZ); + tAssociation = GTOreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID)); + if (tAssociation != null && tAssociation.mPrefix != null + && tAssociation.mMaterial != null + && tAssociation.mPrefix.toString() + .startsWith("ore")) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("106", "Found traces of ") + + tAssociation.mMaterial.mMaterial.mDefaultLocalName + + GTUtility.trans("101", " Ore.")); + return true; + } + } + } + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("107", "No Ores found.")); + return true; + } + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java b/src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java new file mode 100644 index 0000000000..75e702a3a7 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java @@ -0,0 +1,65 @@ +package gregtech.common.items.behaviors; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourScanner extends BehaviourNone { + + public static final IItemBehaviour INSTANCE = new BehaviourScanner(); + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.scanning", "Can scan Blocks in World"); + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + final NBTTagCompound tNBT = aStack.getTagCompound(); + if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 20000.0D))) { + final ArrayList tList = new ArrayList<>(); + if (aItem.use( + aStack, + GTUtility.getCoordinateScan(tList, aPlayer, aWorld, 1, aX, aY, aZ, side, hitX, hitY, hitZ), + aPlayer)) { + final int tList_sS = tList.size(); + tNBT.setInteger("dataLinesCount", tList_sS); + for (int i = 0; i < tList_sS; i++) { + tNBT.setString("dataLines" + i, tList.get(i)); + GTUtility.sendChatToPlayer(aPlayer, tList.get(i)); + } + } + return true; + } + GTUtility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ); + // doGuiAtClient() + return aPlayer instanceof EntityPlayerMP; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + try { + NBTTagCompound tNBT = aStack.getTagCompound(); + int lines = tNBT.getInteger("dataLinesCount"); + if (lines < 1) throw new Exception(); + aList.add(EnumChatFormatting.BLUE + "Block scan data result:"); + for (int i = 0; i < lines; i++) { + aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i)); + } + } catch (Exception e) { + aList.add(this.mTooltip); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java b/src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java new file mode 100644 index 0000000000..9f727dd8cc --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java @@ -0,0 +1,62 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import forestry.api.lepidopterology.EnumFlutterType; +import forestry.api.lepidopterology.IButterfly; +import forestry.api.lepidopterology.IEntityButterfly; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; + +public class BehaviourScoop extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.scoop", "Catches Butterflies on Leftclick"); + + public BehaviourScoop(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onLeftClickEntity(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + if ((aEntity instanceof IEntityButterfly)) { + if (aPlayer.worldObj.isRemote) { + return true; + } + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + IButterfly tButterfly = ((IEntityButterfly) aEntity).getButterfly(); + tButterfly.getGenome() + .getPrimary() + .getRoot() + .getBreedingTracker(aEntity.worldObj, aPlayer.getGameProfile()) + .registerCatch(tButterfly); + aPlayer.worldObj.spawnEntityInWorld( + new EntityItem( + aPlayer.worldObj, + aEntity.posX, + aEntity.posY, + aEntity.posZ, + tButterfly.getGenome() + .getPrimary() + .getRoot() + .getMemberStack(tButterfly.copy(), EnumFlutterType.BUTTERFLY.ordinal()))); + aEntity.setDead(); + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourScrewdriver.java b/src/main/java/gregtech/common/items/behaviors/BehaviourScrewdriver.java new file mode 100644 index 0000000000..599398349f --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourScrewdriver.java @@ -0,0 +1,52 @@ +package gregtech.common.items.behaviors; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class BehaviourScrewdriver extends BehaviourNone { + + private final int mVanillaCosts; + private final int mEUCosts; + + public BehaviourScrewdriver(int aVanillaCosts, int aEUCosts) { + this.mVanillaCosts = aVanillaCosts; + this.mEUCosts = aEUCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock == null) { + return false; + } + byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); + if ((aBlock == Blocks.unpowered_repeater) || (aBlock == Blocks.powered_repeater)) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, aMeta / 4 * 4 + (aMeta % 4 + 1) % 4, 3); + GTUtility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if ((aBlock == Blocks.unpowered_comparator) || (aBlock == Blocks.powered_comparator)) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, aMeta / 4 * 4 + (aMeta % 4 + 1) % 4, 3); + GTUtility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + return false; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSense.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSense.java new file mode 100644 index 0000000000..eb55802207 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSense.java @@ -0,0 +1,56 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import ic2.api.crops.ICropTile; + +public class BehaviourSense extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.sense", "Rightclick to harvest Crop Sticks"); + + public BehaviourSense(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((tTileEntity instanceof ICropTile)) { + for (int i = -2; i < 3; i++) { + for (int j = -2; j < 3; j++) { + for (int k = -2; k < 3; k++) { + if ((aStack.stackSize > 0) + && (((tTileEntity = aWorld.getTileEntity(aX + i, aY + j, aZ + k)) instanceof ICropTile)) + && (((ICropTile) tTileEntity).harvest(true)) + && (!aPlayer.capabilities.isCreativeMode)) { + ((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts / 20); + } + } + } + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSensorKit.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSensorKit.java new file mode 100644 index 0000000000..70ec04551e --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSensorKit.java @@ -0,0 +1,56 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.ItemList; +import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourSensorKit extends BehaviourNone { + + private final String mTooltip = GTLanguageManager.addStringLocalization( + "gt.behaviour.sensorkit.tooltip", + "Used to display Information using the Mod Nuclear Control"); + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if ((aPlayer instanceof EntityPlayerMP)) { + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (((tTileEntity instanceof IInventory)) && (!((IInventory) tTileEntity).isUseableByPlayer(aPlayer))) { + return false; + } + if (((tTileEntity instanceof IGregTechDeviceInformation)) + && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) { + GTUtility.setStack(aStack, ItemList.NC_SensorCard.get(aStack.stackSize)); + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + tNBT.setInteger("x", aX); + tNBT.setInteger("y", aY); + tNBT.setInteger("z", aZ); + aStack.setTagCompound(tNBT); + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSoftHammer.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSoftHammer.java new file mode 100644 index 0000000000..83e458276d --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSoftHammer.java @@ -0,0 +1,123 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourSoftHammer extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.softhammer", "Activates and Deactivates Machines"); + + public BehaviourSoftHammer(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock == null) { + return false; + } + byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); + if (aBlock == Blocks.lit_redstone_lamp) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, Blocks.redstone_lamp, 0, 0); + aWorld.isRemote = false; + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if (aBlock == Blocks.redstone_lamp) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, Blocks.lit_redstone_lamp, 0, 0); + aWorld.isRemote = false; + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if (aBlock == Blocks.golden_rail) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 8) % 16, 0); + aWorld.isRemote = false; + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if (aBlock == Blocks.activator_rail) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 8) % 16, 0); + aWorld.isRemote = false; + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if ((aBlock == Blocks.log) || (aBlock == Blocks.log2) || (aBlock == Blocks.hay_block)) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 4) % 12, 3); + } + return true; + } + if ((aBlock == Blocks.piston) || (aBlock == Blocks.sticky_piston) + || (aBlock == Blocks.dispenser) + || (aBlock == Blocks.dropper)) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 1) % 6, 3); + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if ((aBlock == Blocks.pumpkin) || (aBlock == Blocks.lit_pumpkin) + || (aBlock == Blocks.furnace) + || (aBlock == Blocks.lit_furnace) + || (aBlock == Blocks.chest) + || (aBlock == Blocks.trapped_chest)) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta - 1) % 4 + 2, 3); + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if (aBlock == Blocks.hopper) { + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 1) % 6 != 1 ? (aMeta + 1) % 6 : 2, 3); + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSonictron.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSonictron.java new file mode 100644 index 0000000000..f362f7b3f4 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSonictron.java @@ -0,0 +1,135 @@ +package gregtech.common.items.behaviors; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourSonictron extends BehaviourNone { + + public static final IItemBehaviour INSTANCE = new BehaviourSonictron(); + + public static int getCurrentIndex(ItemStack aStack) { + NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); + if (tNBTTagCompound == null) { + tNBTTagCompound = new NBTTagCompound(); + } + return tNBTTagCompound.getInteger("mCurrentIndex"); + } + + public static int getTickTimer(ItemStack aStack) { + NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); + if (tNBTTagCompound == null) { + tNBTTagCompound = new NBTTagCompound(); + } + return tNBTTagCompound.getInteger("mTickTimer"); + } + + public static NBTTagCompound setCurrentIndex(ItemStack aStack, int aIndex) { + NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); + if (tNBTTagCompound == null) { + tNBTTagCompound = new NBTTagCompound(); + } + tNBTTagCompound.setInteger("mCurrentIndex", aIndex); + return tNBTTagCompound; + } + + public static NBTTagCompound setTickTimer(ItemStack aStack, int aTime) { + NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); + if (tNBTTagCompound == null) { + tNBTTagCompound = new NBTTagCompound(); + } + tNBTTagCompound.setInteger("mTickTimer", aTime); + return tNBTTagCompound; + } + + public static ItemStack[] getNBTInventory(ItemStack aStack) { + ItemStack[] tInventory = new ItemStack[64]; + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return tInventory; + } + NBTTagList tNBT_ItemList = tNBT.getTagList("Inventory", 10); + for (int i = 0; i < tNBT_ItemList.tagCount(); i++) { + NBTTagCompound tag = tNBT_ItemList.getCompoundTagAt(i); + byte slot = tag.getByte("Slot"); + if ((slot >= 0) && (slot < tInventory.length)) { + tInventory[slot] = GTUtility.loadItem(tag); + } + } + return tInventory; + } + + public static NBTTagCompound setNBTInventory(ItemStack aStack, ItemStack[] aInventory) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + NBTTagList tNBT_ItemList = new NBTTagList(); + for (int i = 0; i < aInventory.length; i++) { + ItemStack stack = aInventory[i]; + if (stack != null) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + stack.writeToNBT(tag); + tNBT_ItemList.appendTag(tag); + } + } + tNBT.setTag("Inventory", tNBT_ItemList); + aStack.setTagCompound(tNBT); + return tNBT; + } + + public static void copyInventory(ItemStack[] aInventory, ItemStack[] aNewContent, int aIndexlength) { + for (int i = 0; i < aIndexlength; i++) { + if (aNewContent[i] == null) { + aInventory[i] = null; + } else { + aInventory[i] = GTUtility.copyOrNull(aNewContent[i]); + } + } + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + setCurrentIndex(aStack, -1); + return false; + } + + @Override + public ItemStack onItemRightClick(MetaBaseItem aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + setCurrentIndex(aStack, 0); + return aStack; + } + + @Override + public void onUpdate(MetaBaseItem aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, + boolean aIsInHand) { + int tTickTimer = getTickTimer(aStack); + int tCurrentIndex = getCurrentIndex(aStack); + if ((tTickTimer++ % 2 == 0) && (tCurrentIndex > -1)) { + ItemStack[] tInventory = getNBTInventory(aStack); + GTValues.GT.doSonictronSound( + tInventory[tCurrentIndex], + aPlayer.worldObj, + aPlayer.posX, + aPlayer.posY, + aPlayer.posZ); + tCurrentIndex++; + if (tCurrentIndex > 63) { + tCurrentIndex = -1; + } + } + setTickTimer(aStack, tTickTimer); + setCurrentIndex(aStack, tCurrentIndex); + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java new file mode 100644 index 0000000000..e79f8e0939 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java @@ -0,0 +1,218 @@ +package gregtech.common.items.behaviors; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockColored; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.implementations.tiles.IColorableTile; +import appeng.api.util.AEColor; +import appeng.block.networking.BlockCableBus; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.common.config.other.ConfigGeneral; + +public class BehaviourSprayColor extends BehaviourNone { + + private final ItemStack mEmpty; + private final ItemStack mUsed; + private final ItemStack mFull; + private final long mUses; + private final byte mColor; + private final Collection mAllowedVanillaBlocks = Arrays.asList( + Blocks.glass, + Blocks.glass_pane, + Blocks.stained_glass, + Blocks.stained_glass_pane, + Blocks.carpet, + Blocks.hardened_clay); + protected String mTooltip; + private final String mTooltipUses = GTLanguageManager + .addStringLocalization("gt.behaviour.paintspray.uses", "Remaining Uses:"); + private final String mTooltipUnstackable = GTLanguageManager + .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!"); + private final String mTooltipChain = GTLanguageManager.addStringLocalization( + "gt.behaviour.paintspray.chain", + "If used while sneaking it will spray a chain of blocks"); + + private final String mTooltipChainAmount = GTLanguageManager.addStringLocalization( + "gt.behaviour.paintspray.chain", + "Sprays up to %d blocks, in the direction you're looking at"); + + public BehaviourSprayColor(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses, int aColor) { + this.mEmpty = aEmpty; + this.mUsed = aUsed; + this.mFull = aFull; + this.mUses = aUses; + this.mColor = ((byte) aColor); + this.mTooltip = GTLanguageManager.addStringLocalization( + "gt.behaviour.paintspray." + this.mColor + ".tooltip", + "Can Color things in " + Dyes.get(this.mColor).mName); + } + + public BehaviourSprayColor(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses) { + this.mEmpty = aEmpty; + this.mUsed = aUsed; + this.mFull = aFull; + this.mUses = aUses; + this.mColor = 0; + mTooltip = ""; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if ((aWorld.isRemote) || (aStack.stackSize != 1)) { + return false; + } + boolean rOutput = false; + if (!aPlayer.canPlayerEdit(aX, aY, aZ, side.ordinal(), aStack)) { + return false; + } + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + long tUses = tNBT.getLong("GT.RemainingPaint"); + if (GTUtility.areStacksEqual(aStack, this.mFull, true)) { + aStack.func_150996_a(this.mUsed.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsed)); + tUses = this.mUses; + } + int painted = 0; + int maxPainted = ConfigGeneral.sprayCanChainRange; + ForgeDirection lookSide; + Vec3 look = aPlayer.getLookVec(); + double absX = Math.abs(look.xCoord); + double absY = Math.abs(look.yCoord); + double absZ = Math.abs(look.zCoord); + if (absX > absY && absX > absZ) { + lookSide = look.xCoord > 0 ? ForgeDirection.EAST : ForgeDirection.WEST; + } else if (absY > absX && absY > absZ) { + lookSide = look.yCoord > 0 ? ForgeDirection.UP : ForgeDirection.DOWN; + } else { + lookSide = look.zCoord > 0 ? ForgeDirection.SOUTH : ForgeDirection.NORTH; + } + Block initialBlock = aWorld.getBlock(aX, aY, aZ); + int initialBlockMeta = aWorld.getBlockMetadata(aX, aY, aZ); + TileEntity initialTE = aWorld.getTileEntity(aX, aY, aZ); + while ((GTUtility.areStacksEqual(aStack, this.mUsed, true)) && (colorize(aWorld, aX, aY, aZ, side, aPlayer))) { + GTUtility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_PAINTER, 1.0F, 1.0F, aX, aY, aZ); + if (!aPlayer.capabilities.isCreativeMode) { + tUses -= 1L; + } + rOutput = true; + painted++; + if (painted >= maxPainted && maxPainted != -1) break; + if (!aPlayer.isSneaking() || tUses <= 0) break; + switch (lookSide) { + case UP -> aY += 1; + case DOWN -> aY -= 1; + case NORTH -> aZ -= 1; + case SOUTH -> aZ += 1; + case WEST -> aX -= 1; + case EAST -> aX += 1; + default -> throw new IllegalArgumentException("Unexpected value: " + lookSide); + } + + if (aWorld.getBlock(aX, aY, aZ) != initialBlock) break; + if (aWorld.getBlockMetadata(aX, aY, aZ) != initialBlockMeta) break; + + /* + * Check if the initial block had a TE and if the next one does, check if its the same kind. + * else one does and the other doesnt, thus stop checking. + */ + TileEntity targetTE = aWorld.getTileEntity(aX, aY, aZ); + if (initialTE == null ^ targetTE == null) break; + if (initialTE != null && targetTE != null) { + if (!initialTE.getClass() + .isInstance(targetTE)) break; + + if (initialTE instanceof IGregTechTileEntity currentGTTile + && targetTE instanceof IGregTechTileEntity targetGTTile) { + if (currentGTTile.getMetaTileID() != targetGTTile.getMetaTileID()) break; + } + } + } + tNBT.removeTag("GT.RemainingPaint"); + if (tUses > 0L) { + tNBT.setLong("GT.RemainingPaint", tUses); + } + if (tNBT.hasNoTags()) { + aStack.setTagCompound(null); + } else { + aStack.setTagCompound(tNBT); + } + if (tUses <= 0L) { + if (this.mEmpty == null) { + aStack.stackSize -= 1; + } else { + aStack.func_150996_a(this.mEmpty.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmpty)); + } + } + return rOutput; + } + + protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { + final Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock != Blocks.air) { + if (this.mAllowedVanillaBlocks.contains(aBlock) || aBlock instanceof BlockColored) { + if (aBlock == Blocks.hardened_clay) { + aWorld.setBlock(aX, aY, aZ, Blocks.stained_hardened_clay, (~this.mColor) & 0xF, 3); + return true; + } + if (aBlock == Blocks.glass_pane) { + aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass_pane, (~this.mColor) & 0xF, 3); + return true; + } + if (aBlock == Blocks.glass) { + aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass, (~this.mColor) & 0xF, 3); + return true; + } + if (aWorld.getBlockMetadata(aX, aY, aZ) == ((~this.mColor) & 0xF)) { + return false; + } + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (~this.mColor) & 0xF, 3); + return true; + } + + if (aBlock instanceof IColorableTile) { + return ((IColorableTile) aBlock).recolourBlock(side, AEColor.values()[(~this.mColor) & 0xF], player); + } + + if (aBlock instanceof BlockCableBus) { + return ((BlockCableBus) aBlock).recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF, player); + } + } + return aBlock.recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF); + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + aList.add(this.mTooltipChain); + aList.add(String.format(this.mTooltipChainAmount, ConfigGeneral.sprayCanChainRange)); + NBTTagCompound tNBT = aStack.getTagCompound(); + long tRemainingPaint = tNBT == null ? this.mUses + : GTUtility.areStacksEqual(aStack, this.mFull, true) ? this.mUses : tNBT.getLong("GT.RemainingPaint"); + aList.add(this.mTooltipUses + " " + tRemainingPaint); + aList.add(this.mTooltipUnstackable); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java new file mode 100644 index 0000000000..cdf35161e3 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java @@ -0,0 +1,48 @@ +package gregtech.common.items.behaviors; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.implementations.tiles.IColorableTile; +import appeng.api.util.AEColor; +import appeng.block.networking.BlockCableBus; +import gregtech.api.interfaces.tileentity.IColoredTileEntity; +import gregtech.api.util.GTLanguageManager; + +public class BehaviourSprayColorRemover extends BehaviourSprayColor { + + public BehaviourSprayColorRemover(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses) { + super(aEmpty, aUsed, aFull, aUses); + this.mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.paintspray.solvent.tooltip", "Can remove paint from things"); + } + + @Override + protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { + final Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock != Blocks.air) { + if (aBlock instanceof IColorableTile) { + return ((IColorableTile) aBlock).recolourBlock(side, AEColor.Transparent, player); + } + + if (aBlock instanceof BlockCableBus) { + return ((BlockCableBus) aBlock) + .recolourBlock(aWorld, aX, aY, aZ, side, AEColor.Transparent.ordinal(), player); + } + + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IColoredTileEntity gte) { + if (gte.getColorization() >= 0) { + gte.setColorization((byte) -1); + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMetadata.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMetadata.java new file mode 100644 index 0000000000..0d195660c2 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMetadata.java @@ -0,0 +1,67 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.items.GTGenericBlock; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; + +public class BehaviourSwitchMetadata extends BehaviourNone { + + public final int mSwitchIndex; + public final boolean mCheckTarget, mShowModeSwitchTooltip; + + public BehaviourSwitchMetadata(int aSwitchIndex) { + this(aSwitchIndex, false); + } + + public BehaviourSwitchMetadata(int aSwitchIndex, boolean aCheckTarget) { + this(aSwitchIndex, aCheckTarget, false); + } + + public BehaviourSwitchMetadata(int aSwitchIndex, boolean aCheckTarget, boolean aShowModeSwitchTooltip) { + mSwitchIndex = aSwitchIndex; + mCheckTarget = aCheckTarget; + mShowModeSwitchTooltip = aShowModeSwitchTooltip; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + if (mShowModeSwitchTooltip) aList.add(GTUtility.trans("330", "Sneak Rightclick to switch Mode")); + return aList; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float aHitX, float aHitY, float aHitZ) { + if (aStack != null && (aPlayer == null || aPlayer.isSneaking()) && !aWorld.isRemote) { + if (mCheckTarget) { + Block aBlock = aWorld.blockExists(aX, aY, aZ) ? aWorld.getBlock(aX, aY, aZ) : Blocks.air; + if (aBlock instanceof GTGenericBlock) { + Items.feather.setDamage(aStack, (short) mSwitchIndex); + GTUtility.updateItemStack(aStack); + return true; + } + if (GTUtil.getTileEntity(aWorld, aX, aY, aZ, true) == null) { + Items.feather.setDamage(aStack, (short) mSwitchIndex); + GTUtility.updateItemStack(aStack); + return true; + } + return false; + } + Items.feather.setDamage(aStack, (short) mSwitchIndex); + GTUtility.updateItemStack(aStack); + return true; + } + return false; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMode.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMode.java new file mode 100644 index 0000000000..ba1730f805 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMode.java @@ -0,0 +1,53 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import gregtech.api.enums.GTValues; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.net.GTPacketToolSwitchMode; +import gregtech.api.util.GTUtility; + +public class BehaviourSwitchMode extends BehaviourNone { + + public BehaviourSwitchMode() {} + + @Override + public ItemStack onItemRightClick(MetaBaseItem aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + if (aStack != null && (aPlayer == null || aPlayer.isSneaking()) && aWorld.isRemote) { + + MetaGeneratedTool itemTool = (MetaGeneratedTool) aItem; + final byte maxMode = itemTool.getToolMaxMode(aStack); + if (maxMode == 1) { + return aStack; + } + + MovingObjectPosition mop = GTUtility.getPlayerLookingTarget(aPlayer); + if (mop == null) { + GTValues.NW.sendToServer(new GTPacketToolSwitchMode()); + } + return aStack; + } + return aStack; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + super.getAdditionalToolTips(aItem, aList, aStack); + if ((aItem instanceof MetaGeneratedTool)) { + MetaGeneratedTool itemTool = (MetaGeneratedTool) aItem; + final int maxMode = itemTool.getToolMaxMode(aStack); + if (maxMode > 1) { + aList.add("Shift+Rclick to change mode"); + } + } + + return aList; + } + +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourWrench.java b/src/main/java/gregtech/common/items/behaviors/BehaviourWrench.java new file mode 100644 index 0000000000..6155a6c739 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourWrench.java @@ -0,0 +1,278 @@ +package gregtech.common.items.behaviors; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BooleanSupplier; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; + +import appeng.api.parts.IPartHost; +import appeng.api.util.IOrientable; +import appeng.tile.misc.TileInterface; +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import ic2.api.tile.IWrenchable; + +public class BehaviourWrench extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.wrench", "Rotates Blocks on Rightclick"); + + public BehaviourWrench(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + final Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock == null) { + return false; + } + final int aMeta = aWorld.getBlockMetadata(aX, aY, aZ); + final short targetSideOrdinal = (short) GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ) + .ordinal(); + final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); + + final WrenchHandler handler = new WrenchHandler( + aBlock, + aMeta, + targetSideOrdinal, + aTileEntity, + aPlayer, + aWorld, + aX, + aY, + aZ, + aStack, + (MetaGeneratedTool) aItem, + mCosts); + + try { + return handler.handle() && !aWorld.isRemote; + } catch (Throwable ignored) {} + return false; + } + + /** + *

+ * A class to simplify wrenching operation, + * stopping "checking creative", "trying to damage tool", + * "doing the logic" and "playing sound" again and again. + * This should have been a record, but it's not available in Java 8. + *

+ *

+ * {@link WrenchHandler#handle()} is the entry point of main logic. + *

+ */ + private static class WrenchHandler { + + boolean handle() { + ForgeDirection direction = ForgeDirection.getOrientation(targetSideOrdinal); + + // AE2 logic + // default to change the up facing + // sneak to change the forward facing + if (tileEntity instanceof IOrientable orientable) { + if (!orientable.canBeRotated()) return false; + ForgeDirection front = orientable.getForward(); + ForgeDirection up = orientable.getUp(); + + // mainly for me-interfaces, whose initial orientation is UNKNOWN + if (front == ForgeDirection.UNKNOWN) { + if (direction == ForgeDirection.UP || direction == ForgeDirection.DOWN) + front = ForgeDirection.NORTH; + else front = ForgeDirection.UP; + } + + ForgeDirection back = front.getOpposite(); + ForgeDirection down = up.getOpposite(); + + if (tileEntity instanceof TileInterface) { + if (player.isSneaking()) return false; + if (direction == down) { + return doWrenchOperation(costs, () -> { + orientable.setOrientation(ForgeDirection.UNKNOWN, ForgeDirection.UNKNOWN); + return true; + }); + } + // interface's up-side is opposite to the arrow on texture + // make it intuitive by rotating it to the opposite side. + direction = direction.getOpposite(); + up = up.getOpposite(); + } else if (direction == up || direction == front) { + // rotate around the direction axis + final var tempFront = front; + final var tempUp = up; + if (!player.isSneaking() && direction == up) return doWrenchOperation(costs, () -> { + orientable.setOrientation(tempFront.getRotation(tempUp), tempUp); + return true; + }); + if (player.isSneaking() && direction == front) return doWrenchOperation(costs, () -> { + orientable.setOrientation( + tempFront, + tempUp.getRotation(tempFront) + .getRotation(tempFront)); + return true; + }); + } + + if (player.isSneaking()) { + if (direction == up || direction == down) { + orientable.setOrientation(direction, down.getRotation(front.getRotation(direction))); + } else orientable.setOrientation(direction, up); + } else { + if (direction == front || direction == back) { + orientable.setOrientation(back.getRotation(up.getRotation(direction)), direction); + } else orientable.setOrientation(front, direction); + } + + return damageWrench(costs); + } + if (world.isRemote) return false; + // IC2 Wrenchable + if (tileEntity instanceof IWrenchable wrenchable) { + if (wrenchable.wrenchCanSetFacing(player, targetSideOrdinal)) { + return doWrenchOperation(costs, () -> { + wrenchable.setFacing(targetSideOrdinal); + return true; + }); + } + return false; + } + + if (block == Blocks.powered_repeater || block == Blocks.unpowered_repeater + || block == Blocks.powered_comparator + || block == Blocks.unpowered_comparator) return setBlockMeta(costs, meta / 4 * 4 + (meta % 4 + 1) % 4); + + // hopper cannot face sky + if (block == Blocks.hopper && targetSideOrdinal != 1) return setBlockMeta(costs, targetSideOrdinal); + + if (isVanillaAllSideRotatable(block)) if (meta < 6) return setBlockMeta(costs, targetSideOrdinal); + + // blocks like chests and furnaces have only four directions + if (isVanillaCantFaceAxisY(block)) { + if (targetSideOrdinal > 1) return setBlockMeta(costs, targetSideOrdinal); + else return false; + } + if (tileEntity instanceof IPartHost) return false; + + final int logWoodId = OreDictionary.getOreID("logWood"); + if (Arrays.stream(OreDictionary.getOreIDs(new ItemStack(block))) + .anyMatch(id -> id == logWoodId)) { + // The meta just work + return setBlockMeta(costs, (meta + 4) % 12); + } + + // vanilla block rotate logic + if ((Arrays.asList(block.getValidRotations(world, x, y, z)) + .contains(direction))) return rotateBlock(costs, direction); + return false; + + // GT blocks' rotations are done by blocks themselves after this returning false + } + + private final Block block; + private final short targetSideOrdinal; + private final TileEntity tileEntity; + private final EntityPlayer player; + private final World world; + private final int x, y, z, meta; + private final ItemStack stack; + + private final MetaGeneratedTool item; + private final int costs; + + public WrenchHandler(Block block, int meta, short targetSideOrdinal, TileEntity tileEntity, EntityPlayer player, + World world, int x, int y, int z, ItemStack stack, MetaGeneratedTool item, int costs) { + this.block = block; + this.meta = meta; + this.targetSideOrdinal = targetSideOrdinal; + this.tileEntity = tileEntity; + this.player = player; + this.world = world; + this.x = x; + this.y = y; + this.z = z; + this.stack = stack; + this.item = item; + this.costs = costs; + } + + /** + * this will run the operation, damage the tool and play the sound if possible (creative mode or + * {@link MetaGeneratedTool#canWrench(EntityPlayer, int, int, int)}) + * + * @param damage damage to be applied to the wrench + * @param operation the real operation of the click + * @return true if the operation was successful + * @see #setBlockMeta(int, int) + * @see #rotateBlock(int, ForgeDirection) + * @see #rotateBlock(int, ForgeDirection) + */ + boolean doWrenchOperation(int damage, BooleanSupplier operation) { + if (player.capabilities.isCreativeMode || item.canWrench(player, x, y, z)) { + if (operation.getAsBoolean()) { + item.doDamage(stack, damage); + GTUtility.sendSoundToPlayers(world, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, x, y, z); + return true; + } + } + return false; + } + + boolean setBlockMeta(int damage, int newMeta) { + return doWrenchOperation(damage, () -> setBlockMetadataWithNotify(newMeta)); + } + + boolean rotateBlock(int damage, ForgeDirection direction) { + return doWrenchOperation(damage, () -> block.rotateBlock(world, x, y, z, direction)); + } + + boolean damageWrench(int damage) { + return doWrenchOperation(damage, () -> true); + } + + private boolean setBlockMetadataWithNotify(int newMeta) { + return world.setBlockMetadataWithNotify(x, y, z, newMeta, 3); + } + + } + + public static boolean isVanillaRotatable(Block block) { + return isVanillaCantFaceAxisY(block) || isVanillaAllSideRotatable(block) || block == Blocks.hopper; + } + + public static boolean isVanillaCantFaceAxisY(Block block) { + return GTUtility.arrayContains( + block, + Blocks.pumpkin, + Blocks.lit_pumpkin, + Blocks.furnace, + Blocks.lit_furnace, + Blocks.chest, + Blocks.trapped_chest, + Blocks.ender_chest); + } + + public static boolean isVanillaAllSideRotatable(Block block) { + return GTUtility.arrayContains(block, Blocks.piston, Blocks.sticky_piston, Blocks.dispenser, Blocks.dropper); + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourWrittenBook.java b/src/main/java/gregtech/common/items/behaviors/BehaviourWrittenBook.java new file mode 100644 index 0000000000..54aa3d8b0d --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourWrittenBook.java @@ -0,0 +1,40 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.GuiScreenBook; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourWrittenBook extends BehaviourNone { + + @Override + @SideOnly(Side.CLIENT) + public boolean onItemUse(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, + int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { + if ((GTUtility.isStringValid(GTUtility.ItemNBT.getBookTitle(aStack))) + && ((aPlayer instanceof EntityPlayerSP))) { + Minecraft.getMinecraft() + .displayGuiScreen(new GuiScreenBook(aPlayer, aStack, false)); + } + return true; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + String tTitle = GTUtility.ItemNBT.getBookTitle(aStack); + if (GTUtility.isStringValid(tTitle)) { + aList.add(tTitle); + aList.add("by " + GTUtility.ItemNBT.getBookAuthor(aStack)); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java deleted file mode 100644 index 4241e07e4b..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java +++ /dev/null @@ -1,193 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; - -public class Behaviour_Cover_Tool extends Behaviour_None { - - public static final IItemBehaviour INSTANCE = new Behaviour_Cover_Tool(); - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.cover_copy_paste", "Can copy/paste cover data."); - - private ISerializableObject mStoredData = GregTech_API.sNoBehavior.createDataObject(); - private int mCoverType; - private int mTickRateAddition = 0; - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - final NBTTagCompound tNBT = aStack.getTagCompound(); - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - final boolean isCopyMode = aPlayer.isSneaking(); - initDataFromNBT(tNBT); - if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 100.0D))) { - if (isCopyMode) { - ArrayList tList = new ArrayList<>(); - doCopy(tTileEntity, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ, tList); - aItem.discharge(aStack, 100.0D, Integer.MAX_VALUE, true, false, false); - writeListToNBT(tList, tNBT, aPlayer); - saveDataToNBT(tNBT); - } else { - doPaste(tTileEntity, side, hitX, hitY, hitZ, aPlayer); - aItem.discharge(aStack, 25.0D, Integer.MAX_VALUE, true, false, false); - } - } - GT_Utility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ); - return aPlayer instanceof EntityPlayerMP; - } - - private void initDataFromNBT(NBTTagCompound aNBT) { - if (aNBT != null) { - mCoverType = aNBT.getInteger("mCoverType"); - GT_CoverBehaviorBase tBehavior = GregTech_API.getCoverBehaviorNew(mCoverType); - NBTBase tData = aNBT.getTag("mCoverData"); - if (tData != null) mStoredData = tBehavior.createDataObject(tData); - else mStoredData = GregTech_API.sNoBehavior.createDataObject(); - mTickRateAddition = aNBT.hasKey("mTickRateAddition") ? aNBT.getInteger("mTickRateAddition") : 0; - } - } - - private void saveDataToNBT(NBTTagCompound aNBT) { - aNBT.setInteger("mCoverType", mCoverType); - if (mStoredData == null) mStoredData = GregTech_API.sNoBehavior.createDataObject(); - aNBT.setTag("mCoverData", mStoredData.saveDataToNBT()); - aNBT.setInteger("mTickRateAddition", mTickRateAddition); - } - - @SuppressWarnings("rawtypes") - private void writeListToNBT(List aList, NBTTagCompound aNBT, EntityPlayer aPlayer) { - if (aList != null && aNBT != null) { - int tSize = aList.size(); - aNBT.setInteger("dataLinesCount", tSize); - for (int i = 0; i < tSize; i++) { - aNBT.setString("dataLines" + i, (String) aList.get(i)); - GT_Utility.sendChatToPlayer(aPlayer, (String) aList.get(i)); - } - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private void doCopy(TileEntity aTileEntity, World aWorld, int aX, int aY, int aZ, ForgeDirection side, float hitX, - float hitY, float hitZ, List aList) { - aList.add( - "----- X: " + EnumChatFormatting.AQUA - + GT_Utility.formatNumbers(aX) - + EnumChatFormatting.RESET - + " Y: " - + EnumChatFormatting.AQUA - + GT_Utility.formatNumbers(aY) - + EnumChatFormatting.RESET - + " Z: " - + EnumChatFormatting.AQUA - + GT_Utility.formatNumbers(aZ) - + EnumChatFormatting.RESET - + " D: " - + EnumChatFormatting.AQUA - + aWorld.provider.dimensionId - + EnumChatFormatting.RESET - + " -----"); - if (aTileEntity instanceof ICoverable tCoverable) { - final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side - : tCoverable.getCoverItemAtSide(GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null - ? GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ) - : ForgeDirection.UNKNOWN; - if (tSide != ForgeDirection.UNKNOWN) { - if (tCoverable.getCoverBehaviorAtSideNew(tSide) - .allowsCopyPasteTool()) { - mStoredData = tCoverable.getComplexCoverDataAtSide(tSide); - mCoverType = tCoverable.getCoverIDAtSide(tSide); - mTickRateAddition = tCoverable.getCoverInfoAtSide(tSide) - .getTickRateAddition(); - - aList.add("Block Side: " + EnumChatFormatting.AQUA + tSide.name() + EnumChatFormatting.RESET); - aList.add( - "Cover Type: " + EnumChatFormatting.GREEN - + tCoverable.getCoverItemAtSide(tSide) - .getDisplayName() - + EnumChatFormatting.RESET); - } else { - mStoredData = GregTech_API.sNoBehavior.createDataObject(); - mCoverType = 0; - mTickRateAddition = 0; - aList.add("Copy unavailable for this cover type"); - } - } else { - mStoredData = GregTech_API.sNoBehavior.createDataObject(); - mCoverType = 0; - mTickRateAddition = 0; - aList.add("No Cover Found"); - } - } else { - mStoredData = GregTech_API.sNoBehavior.createDataObject(); - mCoverType = 0; - mTickRateAddition = 0; - aList.add("No Cover Found"); - } - } - - private void doPaste(TileEntity aTileEntity, ForgeDirection side, float hitX, float hitY, float hitZ, - EntityPlayer aPlayer) { - if (aTileEntity instanceof ICoverable tCoverable) { - if (mCoverType == 0 || mStoredData == null) { - GT_Utility.sendChatToPlayer(aPlayer, "Please Copy a Valid Cover First."); - return; - } - final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side - : tCoverable.getCoverItemAtSide(GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null - ? GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ) - : ForgeDirection.UNKNOWN; - if (tSide != ForgeDirection.UNKNOWN) { - int tCoverID = tCoverable.getCoverIDAtSide(tSide); - if (tCoverID == mCoverType) { - tCoverable.setCoverDataAtSide(tSide, mStoredData); - tCoverable.getCoverInfoAtSide(tSide) - .setTickRateAddition(mTickRateAddition); - GT_Utility.sendChatToPlayer(aPlayer, "Cover Data Pasted."); - } else { - GT_Utility.sendChatToPlayer(aPlayer, "Not Matched Cover."); - } - } else { - GT_Utility.sendChatToPlayer(aPlayer, "No Cover Found."); - } - } - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - try { - final NBTTagCompound tNBT = aStack.getTagCompound(); - final int tSize = tNBT.getInteger("dataLinesCount"); - if (tSize < 1) throw new Exception(); - aList.add(EnumChatFormatting.BLUE + "Stored Cover Data:"); - for (int i = 0; i < tSize; i++) { - aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i)); - } - } catch (Exception e) { - aList.add(this.mTooltip); - } - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java deleted file mode 100644 index 97d3da4ca3..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java +++ /dev/null @@ -1,61 +0,0 @@ -package gregtech.common.items.behaviors; - -import static gregtech.api.enums.Mods.Railcraft; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Crowbar extends Behaviour_None { - - private final int mVanillaCosts; - private final int mEUCosts; - - public Behaviour_Crowbar(int aVanillaCosts, int aEUCosts) { - this.mVanillaCosts = aVanillaCosts; - this.mEUCosts = aEUCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - if (GT_ModHandler.getModItem(Railcraft.ID, "fluid.creosote.bucket", 1L) != null) { - return false; - } - Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock == null) { - return false; - } - byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); - if (aBlock == Blocks.rail) { - if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { - aWorld.isRemote = true; - aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 1) % 10, 0); - aWorld.isRemote = false; - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if ((aBlock == Blocks.detector_rail) || (aBlock == Blocks.activator_rail) || (aBlock == Blocks.golden_rail)) { - if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { - aWorld.isRemote = true; - aWorld.setBlock(aX, aY, aZ, aBlock, aMeta / 8 * 8 + (aMeta % 8 + 1) % 6, 0); - aWorld.isRemote = false; - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - return false; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java deleted file mode 100644 index ae0627446c..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java +++ /dev/null @@ -1,105 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; - -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_Utility; - -public class Behaviour_DataOrb extends Behaviour_None { - - public static void copyInventory(ItemStack[] aInventory, ItemStack[] aNewContent, int aIndexlength) { - for (int i = 0; i < aIndexlength; i++) { - if (aNewContent[i] == null) { - aInventory[i] = null; - } else { - aInventory[i] = GT_Utility.copyOrNull(aNewContent[i]); - } - } - } - - public static String getDataName(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - return ""; - } - return tNBT.getString("mDataName"); - } - - public static String getDataTitle(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - return ""; - } - return tNBT.getString("mDataTitle"); - } - - public static NBTTagCompound setDataName(ItemStack aStack, String aDataName) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - tNBT.setString("mDataName", aDataName); - aStack.setTagCompound(tNBT); - return tNBT; - } - - public static NBTTagCompound setDataTitle(ItemStack aStack, String aDataTitle) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - tNBT.setString("mDataTitle", aDataTitle); - aStack.setTagCompound(tNBT); - return tNBT; - } - - public static ItemStack[] getNBTInventory(ItemStack aStack) { - ItemStack[] tInventory = new ItemStack[256]; - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - return tInventory; - } - NBTTagList tNBT_ItemList = tNBT.getTagList("Inventory", 10); - for (int i = 0; i < tNBT_ItemList.tagCount(); i++) { - NBTTagCompound tag = tNBT_ItemList.getCompoundTagAt(i); - byte slot = tag.getByte("Slot"); - if (slot >= 0) { - tInventory[slot] = GT_Utility.loadItem(tag); - } - } - return tInventory; - } - - public static NBTTagCompound setNBTInventory(ItemStack aStack, ItemStack[] aInventory) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - NBTTagList tNBT_ItemList = new NBTTagList(); - for (int i = 0; i < aInventory.length; i++) { - ItemStack stack = aInventory[i]; - if (stack != null) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setByte("Slot", (byte) i); - stack.writeToNBT(tag); - tNBT_ItemList.appendTag(tag); - } - } - tNBT.setTag("Inventory", tNBT_ItemList); - aStack.setTagCompound(tNBT); - return tNBT; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - if (!(getDataTitle(aStack).length() == 0)) { - aList.add(getDataTitle(aStack)); - aList.add(getDataName(aStack)); - } - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java deleted file mode 100644 index e9db3195c2..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java +++ /dev/null @@ -1,52 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.item.ItemStack; - -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_Utility; - -public class Behaviour_DataStick extends Behaviour_None { - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - String tString = GT_Utility.ItemNBT.getBookTitle(aStack); - if (GT_Utility.isStringValid(tString)) { - aList.add(tString); - } - tString = GT_Utility.ItemNBT.getBookAuthor(aStack); - if (GT_Utility.isStringValid(tString)) { - aList.add("by " + tString); - } - short tMapID = GT_Utility.ItemNBT.getMapID(aStack); - if (tMapID >= 0) { - aList.add("Map ID: " + tMapID); - } - tString = GT_Utility.ItemNBT.getPunchCardData(aStack); - if (GT_Utility.isStringValid(tString)) { - aList.add("Punch Card Data"); - int i = 0; - int j = tString.length(); - for (; i < j; i += 64) { - aList.add(tString.substring(i, Math.min(i + 64, j))); - } - } - short sTier = GT_Utility.ItemNBT.getNBT(aStack) - .getShort("rocket_tier"); - if (sTier > 0 && sTier < 100) { - aList.add("Rocket Schematic Tier: " + sTier); - } else if (sTier >= 100) { - switch (sTier) { - case 100 -> aList.add("Moonbuggy Schematic"); - case 101 -> aList.add("Cargo-Rocket Schematic"); - case 102 -> aList.add("Astro-Miner Schematic"); - } - } - long lastUpdate = GT_Utility.ItemNBT.getNBT(aStack) - .getLong("lastUpdate"); - if (lastUpdate != 0) aList.add(String.format("Last update at: %tc", lastUpdate)); - - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java deleted file mode 100644 index 167eccdf49..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java +++ /dev/null @@ -1,72 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.UseHoeEvent; - -import cpw.mods.fml.common.eventhandler.Event; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder; - -public class Behaviour_Hoe extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager.addStringLocalization("gt.behaviour.hoe", "Can till Dirt"); - - public Behaviour_Hoe(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { - if (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) { - return false; - } - UseHoeEvent event = new UseHoeEvent(aPlayer, aStack, aWorld, aX, aY, aZ); - if (MinecraftForge.EVENT_BUS.post(event)) { - return false; - } - if (event.getResult() == Event.Result.ALLOW) { - if (!aPlayer.capabilities.isCreativeMode) { - ((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts); - } - return true; - } - Block aBlock = aWorld.getBlock(aX, aY, aZ); - if ((ordinalSide != 0) && (GT_Utility.isBlockAir(aWorld, aX, aY + 1, aZ)) - && ((aBlock == Blocks.grass) || (aBlock == Blocks.dirt))) { - new WorldSpawnedEventBuilder.SoundEventBuilder() - .setVolume((Blocks.farmland.stepSound.getVolume() + 1.0F) / 2.0F) - .setPitch(Blocks.farmland.stepSound.getPitch() * 0.8F) - .setIdentifier(Blocks.farmland.stepSound.getStepResourcePath()) - .setPosition(aX + 0.5F, aY + 0.5F, aZ + 0.5F) - .setWorld(aWorld) - .run(); - if (aWorld.isRemote) { - return true; - } - aWorld.setBlock(aX, aY, aZ, Blocks.farmland); - if (!aPlayer.capabilities.isCreativeMode) { - ((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts); - } - return true; - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java deleted file mode 100644 index a4c26e2254..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java +++ /dev/null @@ -1,140 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import codechicken.lib.math.MathHelper; -import gregtech.api.enums.SoundResource; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Lighter extends Behaviour_None { - - private final ItemStack mEmptyLighter; - private final ItemStack mUsedLighter; - private final ItemStack mFullLighter; - private final long mFuelAmount; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.lighter.tooltip", "Can light things on Fire"); - private final String mTooltipUses = GT_LanguageManager - .addStringLocalization("gt.behaviour.lighter.uses", "Remaining Uses:"); - private final String mTooltipUnstackable = GT_LanguageManager - .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!"); - - public Behaviour_Lighter(ItemStack aEmptyLighter, ItemStack aUsedLighter, ItemStack aFullLighter, - long aFuelAmount) { - this.mFullLighter = aFullLighter; - this.mUsedLighter = aUsedLighter; - this.mEmptyLighter = aEmptyLighter; - this.mFuelAmount = aFuelAmount; - } - - @Override - public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { - if ((aPlayer.worldObj.isRemote) || (aStack.stackSize != 1)) { - return false; - } - boolean rOutput = false; - if ((aEntity instanceof EntityCreeper)) { - prepare(aStack); - long tFuelAmount = GT_Utility.ItemNBT.getLighterFuel(aStack); - if (GT_Utility.areStacksEqual(aStack, this.mUsedLighter, true)) { - GT_Utility.sendSoundToPlayers( - aPlayer.worldObj, - SoundResource.FIRE_IGNITE, - 1.0F, - 1.0F, - MathHelper.floor_double(aEntity.posX), - MathHelper.floor_double(aEntity.posY), - MathHelper.floor_double(aEntity.posZ)); - ((EntityCreeper) aEntity).func_146079_cb(); - if (!aPlayer.capabilities.isCreativeMode) { - tFuelAmount -= 1L; - } - rOutput = true; - } - GT_Utility.ItemNBT.setLighterFuel(aStack, tFuelAmount); - if (tFuelAmount <= 0L) { - useUp(aStack); - } - } - return rOutput; - } - - @Override - public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { - return false; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if ((aWorld.isRemote) || (aStack.stackSize != 1)) { - return false; - } - boolean rOutput = false; - - aX += side.offsetX; - aY += side.offsetY; - aZ += side.offsetZ; - if ((!GT_Utility.isBlockAir(aWorld, aX, aY, aZ)) - || (!aPlayer.canPlayerEdit(aX, aY, aZ, side.ordinal(), aStack))) { - return false; - } - prepare(aStack); - long tFuelAmount = GT_Utility.ItemNBT.getLighterFuel(aStack); - if (GT_Utility.areStacksEqual(aStack, this.mUsedLighter, true)) { - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ); - aWorld.setBlock(aX, aY, aZ, Blocks.fire); - if (!aPlayer.capabilities.isCreativeMode) { - tFuelAmount -= 1L; - } - rOutput = true; - } - GT_Utility.ItemNBT.setLighterFuel(aStack, tFuelAmount); - if (tFuelAmount <= 0L) { - useUp(aStack); - } - return rOutput; - } - - private void prepare(ItemStack aStack) { - if (GT_Utility.areStacksEqual(aStack, this.mFullLighter, true)) { - aStack.func_150996_a(this.mUsedLighter.getItem()); - Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsedLighter)); - GT_Utility.ItemNBT.setLighterFuel(aStack, this.mFuelAmount); - } - } - - private void useUp(ItemStack aStack) { - if (this.mEmptyLighter == null) { - aStack.stackSize -= 1; - } else { - aStack.func_150996_a(this.mEmptyLighter.getItem()); - Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmptyLighter)); - } - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - NBTTagCompound tNBT = aStack.getTagCompound(); - long tFuelAmount = tNBT == null ? this.mFuelAmount - : GT_Utility.areStacksEqual(aStack, this.mFullLighter, true) ? this.mFuelAmount - : tNBT.getLong("GT.LighterFuel"); - aList.add(this.mTooltipUses + " " + tFuelAmount); - aList.add(this.mTooltipUnstackable); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_None.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_None.java deleted file mode 100644 index c31ddc723d..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_None.java +++ /dev/null @@ -1,90 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.block.BlockDispenser; -import net.minecraft.dispenser.BehaviorDefaultDispenseItem; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.dispenser.IPosition; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SubTag; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.items.GT_MetaBase_Item; - -public class Behaviour_None implements IItemBehaviour { - - @Override - public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { - return false; - } - - @Override - public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { - return false; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - return false; - } - - @Override - public ItemStack onItemRightClick(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - return aStack; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - return aList; - } - - @Override - public void onUpdate(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, - boolean aIsInHand) {} - - @Override - public boolean isItemStackUsable(GT_MetaBase_Item aItem, ItemStack aStack) { - return true; - } - - @Override - public boolean canDispense(GT_MetaBase_Item aItem, IBlockSource aSource, ItemStack aStack) { - return false; - } - - @Override - public ItemStack onDispense(GT_MetaBase_Item aItem, IBlockSource aSource, ItemStack aStack) { - EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata()); - IPosition iposition = BlockDispenser.func_149939_a(aSource); - ItemStack itemstack1 = aStack.splitStack(1); - BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition); - return aStack; - } - - @Override - public boolean hasProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack) { - return false; - } - - @Override - public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, - double aX, double aY, double aZ) { - return null; - } - - @Override - public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, - EntityLivingBase aEntity, float aSpeed) { - return null; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java deleted file mode 100644 index 867eb25103..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java +++ /dev/null @@ -1,54 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import thaumcraft.api.aspects.IEssentiaTransport; - -public class Behaviour_Plunger_Essentia extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.plunger.essentia", "Clears Essentia from Containers and Tubes"); - - public Behaviour_Plunger_Essentia(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (((aTileEntity instanceof IEssentiaTransport)) && ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts)))) { - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) { - ((IEssentiaTransport) aTileEntity).takeEssentia( - ((IEssentiaTransport) aTileEntity).getEssentiaType(tDirection), - ((IEssentiaTransport) aTileEntity).getEssentiaAmount(tDirection), - tDirection); - } - return true; - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java deleted file mode 100644 index c62cb5c4e5..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java +++ /dev/null @@ -1,75 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.IFluidHandler; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Plunger_Fluid extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.plunger.fluid", "Clears 1000 Liters of Fluid from Tanks"); - - public Behaviour_Plunger_Fluid(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((aTileEntity instanceof IFluidHandler)) { - for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) { - if (((IFluidHandler) aTileEntity).drain(tDirection, 1000, false) != null) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - ((IFluidHandler) aTileEntity).drain(tDirection, 1000, true); - GT_Utility.sendSoundToPlayers( - aWorld, - SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, - 1.0F, - -1.0F, - aX, - aY, - aZ); - return true; - } - } - } - } - if (aTileEntity instanceof IGregTechTileEntity tTileEntity) { - IMetaTileEntity mTileEntity = tTileEntity.getMetaTileEntity(); - if (mTileEntity instanceof GT_MetaTileEntity_BasicTank machine) { - if (machine.mFluid != null && machine.mFluid.amount > 0) - machine.mFluid.amount = machine.mFluid.amount - Math.min(machine.mFluid.amount, 1000); - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - return true; - } - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java deleted file mode 100644 index a5fa868a00..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java +++ /dev/null @@ -1,88 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.HashMap; -import java.util.List; - -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.metatileentity.IMetaTileEntityItemPipe; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Plunger_Item extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.plunger.item", "Clears Items from Pipes"); - - public Behaviour_Plunger_Item(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (aTileEntity instanceof IGregTechTileEntity gtTE) { - IMetaTileEntity tMetaTileEntity = gtTE.getMetaTileEntity(); - if ((tMetaTileEntity instanceof IMetaTileEntityItemPipe)) { - for (IMetaTileEntityItemPipe tTileEntity : GT_Utility - .sortMapByValuesAcending( - IMetaTileEntityItemPipe.Util - .scanPipes((IMetaTileEntityItemPipe) tMetaTileEntity, new HashMap<>(), 0L, false, true)) - .keySet()) { - int i = 0; - for (int j = tTileEntity.getSizeInventory(); i < j; i++) { - if (tTileEntity.isValidSlot(i)) { - if ((tTileEntity.getStackInSlot(i) != null) && ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts)))) { - final ItemStack tStack = tTileEntity.decrStackSize(i, 64); - if (tStack != null) { - final EntityItem tEntity = new EntityItem( - aWorld, - gtTE.getOffsetX(side, 1) + 0.5D, - gtTE.getOffsetY(side, 1) + 0.5D, - gtTE.getOffsetZ(side, 1) + 0.5D, - tStack); - tEntity.motionX = 0.0D; - tEntity.motionY = 0.0D; - tEntity.motionZ = 0.0D; - aWorld.spawnEntityInWorld(tEntity); - GT_Utility.sendSoundToPlayers( - aWorld, - SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, - 1.0F, - -1.0F, - aX, - aY, - aZ); - } - return true; - } - } - } - } - } - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java deleted file mode 100644 index e3c4d58525..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_Utility; - -public class Behaviour_PrintedPages extends Behaviour_None { - - public static String getTitle(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - return ""; - } - return tNBT.getString("title"); - } - - public static String getAuthor(ItemStack aStack) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - return ""; - } - return tNBT.getString("author"); - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - if (GT_Utility.isStringValid(getTitle(aStack))) { - aList.add(getTitle(aStack)); - } - if (GT_Utility.isStringValid(getAuthor(aStack))) { - aList.add("by " + getAuthor(aStack)); - } - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java deleted file mode 100644 index e64722fb87..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java +++ /dev/null @@ -1,159 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockLiquid; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.IFluidBlock; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.objects.ItemData; -import gregtech.api.objects.XSTR; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import gregtech.common.blocks.GT_TileEntity_Ores; - -public class Behaviour_Prospecting extends Behaviour_None { - - private final int mVanillaCosts; - private final int mEUCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.prospecting", "Usable for Prospecting"); - - public Behaviour_Prospecting(int aVanillaCosts, int aEUCosts) { - this.mVanillaCosts = aVanillaCosts; - this.mEUCosts = aEUCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock == null) { - return false; - } - byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); - - ItemData tAssociation = GT_OreDictUnificator.getAssociation(new ItemStack(aBlock, 1, aMeta)); - if (tAssociation != null && tAssociation.mPrefix != null - && tAssociation.mMaterial != null - && tAssociation.mPrefix.toString() - .startsWith("ore")) { - GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("100", "This is ") + tAssociation.mMaterial.mMaterial.mDefaultLocalName - + GT_Utility.trans("101", " Ore.")); - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ); - return true; - } - - if (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone) - || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack) - || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone) - || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockStones) - || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites) - || aBlock == GregTech_API.sBlockOresUb1 - || aBlock == GregTech_API.sBlockOresUb2 - || aBlock == GregTech_API.sBlockOresUb3 - || aBlock == GregTech_API.sBlockOres1) { - if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ); - int tMetaID; - int tQuality = aItem instanceof GT_MetaGenerated_Tool ? aItem.getHarvestLevel(aStack, "") : 0; - int tX = aX, tY = aY, tZ = aZ; - Block tBlock; - for (int i = 0, j = 6 + tQuality; i < j; i++) { - tX -= side.offsetX; - tY -= side.offsetY; - tZ -= side.offsetZ; - - tBlock = aWorld.getBlock(tX, tY, tZ); - if (tBlock == Blocks.lava || tBlock == Blocks.flowing_lava) { - GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("102", "There is Lava behind this Rock.")); - break; - } - if (tBlock instanceof BlockLiquid || tBlock instanceof IFluidBlock) { - GT_Utility - .sendChatToPlayer(aPlayer, GT_Utility.trans("103", "There is a Liquid behind this Rock.")); - break; - } - if (tBlock == Blocks.monster_egg || !GT_Utility.hasBlockHitBox(aWorld, tX, tY, tZ)) { - GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("104", "There is an Air Pocket behind this Rock.")); - break; - } - if (tBlock != aBlock) { - if (i < 4) GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("105", "Material is changing behind this Rock.")); - break; - } - } - - final Random tRandom = new XSTR(aX ^ aY ^ aZ ^ side.ordinal()); - for (int i = 0, j = 9 + 2 * tQuality; i < j; i++) { - tX = aX - 4 - tQuality + tRandom.nextInt(j); - tY = aY - 4 - tQuality + tRandom.nextInt(j); - tZ = aZ - 4 - tQuality + tRandom.nextInt(j); - tBlock = aWorld.getBlock(tX, tY, tZ); - if (tBlock instanceof GT_Block_Ores_Abstract) { - final TileEntity tTileEntity = aWorld.getTileEntity(tX, tY, tZ); - if (tTileEntity instanceof GT_TileEntity_Ores) { - final Materials tMaterial = GregTech_API.sGeneratedMaterials[((GT_TileEntity_Ores) tTileEntity).mMetaData - % 1000]; - if (tMaterial != null && tMaterial != Materials._NULL) { - GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("106", "Found traces of ") + tMaterial.mDefaultLocalName - + GT_Utility.trans("101", " Ore.")); - return true; - } - } - } else { - tMetaID = aWorld.getBlockMetadata(tX, tY, tZ); - tAssociation = GT_OreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID)); - if (tAssociation != null && tAssociation.mPrefix != null - && tAssociation.mMaterial != null - && tAssociation.mPrefix.toString() - .startsWith("ore")) { - GT_Utility.sendChatToPlayer( - aPlayer, - GT_Utility.trans("106", "Found traces of ") - + tAssociation.mMaterial.mMaterial.mDefaultLocalName - + GT_Utility.trans("101", " Ore.")); - return true; - } - } - } - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("107", "No Ores found.")); - return true; - } - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java deleted file mode 100644 index 22b708e384..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java +++ /dev/null @@ -1,65 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Scanner extends Behaviour_None { - - public static final IItemBehaviour INSTANCE = new Behaviour_Scanner(); - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.scanning", "Can scan Blocks in World"); - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - final NBTTagCompound tNBT = aStack.getTagCompound(); - if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 20000.0D))) { - final ArrayList tList = new ArrayList<>(); - if (aItem.use( - aStack, - GT_Utility.getCoordinateScan(tList, aPlayer, aWorld, 1, aX, aY, aZ, side, hitX, hitY, hitZ), - aPlayer)) { - final int tList_sS = tList.size(); - tNBT.setInteger("dataLinesCount", tList_sS); - for (int i = 0; i < tList_sS; i++) { - tNBT.setString("dataLines" + i, tList.get(i)); - GT_Utility.sendChatToPlayer(aPlayer, tList.get(i)); - } - } - return true; - } - GT_Utility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ); - // doGuiAtClient() - return aPlayer instanceof EntityPlayerMP; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - try { - NBTTagCompound tNBT = aStack.getTagCompound(); - int lines = tNBT.getInteger("dataLinesCount"); - if (lines < 1) throw new Exception(); - aList.add(EnumChatFormatting.BLUE + "Block scan data result:"); - for (int i = 0; i < lines; i++) { - aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i)); - } - } catch (Exception e) { - aList.add(this.mTooltip); - } - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java deleted file mode 100644 index 65be65a96d..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java +++ /dev/null @@ -1,63 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import forestry.api.lepidopterology.EnumFlutterType; -import forestry.api.lepidopterology.IButterfly; -import forestry.api.lepidopterology.IEntityButterfly; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_LanguageManager; - -public class Behaviour_Scoop extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.scoop", "Catches Butterflies on Leftclick"); - - public Behaviour_Scoop(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { - if ((aEntity instanceof IEntityButterfly)) { - if (aPlayer.worldObj.isRemote) { - return true; - } - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - IButterfly tButterfly = ((IEntityButterfly) aEntity).getButterfly(); - tButterfly.getGenome() - .getPrimary() - .getRoot() - .getBreedingTracker(aEntity.worldObj, aPlayer.getGameProfile()) - .registerCatch(tButterfly); - aPlayer.worldObj.spawnEntityInWorld( - new EntityItem( - aPlayer.worldObj, - aEntity.posX, - aEntity.posY, - aEntity.posZ, - tButterfly.getGenome() - .getPrimary() - .getRoot() - .getMemberStack(tButterfly.copy(), EnumFlutterType.BUTTERFLY.ordinal()))); - aEntity.setDead(); - } - return true; - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java deleted file mode 100644 index d940226b84..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java +++ /dev/null @@ -1,52 +0,0 @@ -package gregtech.common.items.behaviors; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Screwdriver extends Behaviour_None { - - private final int mVanillaCosts; - private final int mEUCosts; - - public Behaviour_Screwdriver(int aVanillaCosts, int aEUCosts) { - this.mVanillaCosts = aVanillaCosts; - this.mEUCosts = aEUCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock == null) { - return false; - } - byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); - if ((aBlock == Blocks.unpowered_repeater) || (aBlock == Blocks.powered_repeater)) { - if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, aMeta / 4 * 4 + (aMeta % 4 + 1) % 4, 3); - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if ((aBlock == Blocks.unpowered_comparator) || (aBlock == Blocks.powered_comparator)) { - if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, aMeta / 4 * 4 + (aMeta % 4 + 1) % 4, 3); - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - return false; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java deleted file mode 100644 index b2ab0031ad..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java +++ /dev/null @@ -1,56 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_LanguageManager; -import ic2.api.crops.ICropTile; - -public class Behaviour_Sense extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.sense", "Rightclick to harvest Crop Sticks"); - - public Behaviour_Sense(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof ICropTile)) { - for (int i = -2; i < 3; i++) { - for (int j = -2; j < 3; j++) { - for (int k = -2; k < 3; k++) { - if ((aStack.stackSize > 0) - && (((tTileEntity = aWorld.getTileEntity(aX + i, aY + j, aZ + k)) instanceof ICropTile)) - && (((ICropTile) tTileEntity).harvest(true)) - && (!aPlayer.capabilities.isCreativeMode)) { - ((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts / 20); - } - } - } - } - return true; - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java deleted file mode 100644 index b12159d058..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java +++ /dev/null @@ -1,56 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.ItemList; -import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class Behaviour_SensorKit extends Behaviour_None { - - private final String mTooltip = GT_LanguageManager.addStringLocalization( - "gt.behaviour.sensorkit.tooltip", - "Used to display Information using the Mod Nuclear Control"); - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if ((aPlayer instanceof EntityPlayerMP)) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (((tTileEntity instanceof IInventory)) && (!((IInventory) tTileEntity).isUseableByPlayer(aPlayer))) { - return false; - } - if (((tTileEntity instanceof IGregTechDeviceInformation)) - && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) { - GT_Utility.setStack(aStack, ItemList.NC_SensorCard.get(aStack.stackSize)); - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - tNBT.setInteger("x", aX); - tNBT.setInteger("y", aY); - tNBT.setInteger("z", aZ); - aStack.setTagCompound(tNBT); - } - return true; - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java deleted file mode 100644 index 159a0c4b27..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java +++ /dev/null @@ -1,131 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; - -public class Behaviour_SoftHammer extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.softhammer", "Activates and Deactivates Machines"); - - public Behaviour_SoftHammer(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if (aWorld.isRemote) { - return false; - } - Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock == null) { - return false; - } - byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); - if (aBlock == Blocks.lit_redstone_lamp) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.isRemote = true; - aWorld.setBlock(aX, aY, aZ, Blocks.redstone_lamp, 0, 0); - aWorld.isRemote = false; - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if (aBlock == Blocks.redstone_lamp) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.isRemote = true; - aWorld.setBlock(aX, aY, aZ, Blocks.lit_redstone_lamp, 0, 0); - aWorld.isRemote = false; - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if (aBlock == Blocks.golden_rail) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.isRemote = true; - aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 8) % 16, 0); - aWorld.isRemote = false; - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if (aBlock == Blocks.activator_rail) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.isRemote = true; - aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 8) % 16, 0); - aWorld.isRemote = false; - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if ((aBlock == Blocks.log) || (aBlock == Blocks.log2) || (aBlock == Blocks.hay_block)) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 4) % 12, 3); - } - return true; - } - if ((aBlock == Blocks.piston) || (aBlock == Blocks.sticky_piston) - || (aBlock == Blocks.dispenser) - || (aBlock == Blocks.dropper)) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 1) % 6, 3); - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if ((aBlock == Blocks.pumpkin) || (aBlock == Blocks.lit_pumpkin) - || (aBlock == Blocks.furnace) - || (aBlock == Blocks.lit_furnace) - || (aBlock == Blocks.chest) - || (aBlock == Blocks.trapped_chest)) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta - 1) % 4 + 2, 3); - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - if (aBlock == Blocks.hopper) { - if ((aPlayer.capabilities.isCreativeMode) - || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) { - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 1) % 6 != 1 ? (aMeta + 1) % 6 : 2, 3); - GT_Utility - .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); - } - return true; - } - return false; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java deleted file mode 100644 index dbab764507..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java +++ /dev/null @@ -1,135 +0,0 @@ -package gregtech.common.items.behaviors; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Sonictron extends Behaviour_None { - - public static final IItemBehaviour INSTANCE = new Behaviour_Sonictron(); - - public static int getCurrentIndex(ItemStack aStack) { - NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); - if (tNBTTagCompound == null) { - tNBTTagCompound = new NBTTagCompound(); - } - return tNBTTagCompound.getInteger("mCurrentIndex"); - } - - public static int getTickTimer(ItemStack aStack) { - NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); - if (tNBTTagCompound == null) { - tNBTTagCompound = new NBTTagCompound(); - } - return tNBTTagCompound.getInteger("mTickTimer"); - } - - public static NBTTagCompound setCurrentIndex(ItemStack aStack, int aIndex) { - NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); - if (tNBTTagCompound == null) { - tNBTTagCompound = new NBTTagCompound(); - } - tNBTTagCompound.setInteger("mCurrentIndex", aIndex); - return tNBTTagCompound; - } - - public static NBTTagCompound setTickTimer(ItemStack aStack, int aTime) { - NBTTagCompound tNBTTagCompound = aStack.getTagCompound(); - if (tNBTTagCompound == null) { - tNBTTagCompound = new NBTTagCompound(); - } - tNBTTagCompound.setInteger("mTickTimer", aTime); - return tNBTTagCompound; - } - - public static ItemStack[] getNBTInventory(ItemStack aStack) { - ItemStack[] tInventory = new ItemStack[64]; - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - return tInventory; - } - NBTTagList tNBT_ItemList = tNBT.getTagList("Inventory", 10); - for (int i = 0; i < tNBT_ItemList.tagCount(); i++) { - NBTTagCompound tag = tNBT_ItemList.getCompoundTagAt(i); - byte slot = tag.getByte("Slot"); - if ((slot >= 0) && (slot < tInventory.length)) { - tInventory[slot] = GT_Utility.loadItem(tag); - } - } - return tInventory; - } - - public static NBTTagCompound setNBTInventory(ItemStack aStack, ItemStack[] aInventory) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - NBTTagList tNBT_ItemList = new NBTTagList(); - for (int i = 0; i < aInventory.length; i++) { - ItemStack stack = aInventory[i]; - if (stack != null) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setByte("Slot", (byte) i); - stack.writeToNBT(tag); - tNBT_ItemList.appendTag(tag); - } - } - tNBT.setTag("Inventory", tNBT_ItemList); - aStack.setTagCompound(tNBT); - return tNBT; - } - - public static void copyInventory(ItemStack[] aInventory, ItemStack[] aNewContent, int aIndexlength) { - for (int i = 0; i < aIndexlength; i++) { - if (aNewContent[i] == null) { - aInventory[i] = null; - } else { - aInventory[i] = GT_Utility.copyOrNull(aNewContent[i]); - } - } - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - setCurrentIndex(aStack, -1); - return false; - } - - @Override - public ItemStack onItemRightClick(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - setCurrentIndex(aStack, 0); - return aStack; - } - - @Override - public void onUpdate(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, - boolean aIsInHand) { - int tTickTimer = getTickTimer(aStack); - int tCurrentIndex = getCurrentIndex(aStack); - if ((tTickTimer++ % 2 == 0) && (tCurrentIndex > -1)) { - ItemStack[] tInventory = getNBTInventory(aStack); - GT_Values.GT.doSonictronSound( - tInventory[tCurrentIndex], - aPlayer.worldObj, - aPlayer.posX, - aPlayer.posY, - aPlayer.posZ); - tCurrentIndex++; - if (tCurrentIndex > 63) { - tCurrentIndex = -1; - } - } - setTickTimer(aStack, tTickTimer); - setCurrentIndex(aStack, tCurrentIndex); - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java deleted file mode 100644 index 216eb4d745..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java +++ /dev/null @@ -1,218 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockColored; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import appeng.api.implementations.tiles.IColorableTile; -import appeng.api.util.AEColor; -import appeng.block.networking.BlockCableBus; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import gregtech.common.config.other.ConfigGeneral; - -public class Behaviour_Spray_Color extends Behaviour_None { - - private final ItemStack mEmpty; - private final ItemStack mUsed; - private final ItemStack mFull; - private final long mUses; - private final byte mColor; - private final Collection mAllowedVanillaBlocks = Arrays.asList( - Blocks.glass, - Blocks.glass_pane, - Blocks.stained_glass, - Blocks.stained_glass_pane, - Blocks.carpet, - Blocks.hardened_clay); - protected String mTooltip; - private final String mTooltipUses = GT_LanguageManager - .addStringLocalization("gt.behaviour.paintspray.uses", "Remaining Uses:"); - private final String mTooltipUnstackable = GT_LanguageManager - .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!"); - private final String mTooltipChain = GT_LanguageManager.addStringLocalization( - "gt.behaviour.paintspray.chain", - "If used while sneaking it will spray a chain of blocks"); - - private final String mTooltipChainAmount = GT_LanguageManager.addStringLocalization( - "gt.behaviour.paintspray.chain", - "Sprays up to %d blocks, in the direction you're looking at"); - - public Behaviour_Spray_Color(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses, int aColor) { - this.mEmpty = aEmpty; - this.mUsed = aUsed; - this.mFull = aFull; - this.mUses = aUses; - this.mColor = ((byte) aColor); - this.mTooltip = GT_LanguageManager.addStringLocalization( - "gt.behaviour.paintspray." + this.mColor + ".tooltip", - "Can Color things in " + Dyes.get(this.mColor).mName); - } - - public Behaviour_Spray_Color(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses) { - this.mEmpty = aEmpty; - this.mUsed = aUsed; - this.mFull = aFull; - this.mUses = aUses; - this.mColor = 0; - mTooltip = ""; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if ((aWorld.isRemote) || (aStack.stackSize != 1)) { - return false; - } - boolean rOutput = false; - if (!aPlayer.canPlayerEdit(aX, aY, aZ, side.ordinal(), aStack)) { - return false; - } - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - long tUses = tNBT.getLong("GT.RemainingPaint"); - if (GT_Utility.areStacksEqual(aStack, this.mFull, true)) { - aStack.func_150996_a(this.mUsed.getItem()); - Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsed)); - tUses = this.mUses; - } - int painted = 0; - int maxPainted = ConfigGeneral.sprayCanChainRange; - ForgeDirection lookSide; - Vec3 look = aPlayer.getLookVec(); - double absX = Math.abs(look.xCoord); - double absY = Math.abs(look.yCoord); - double absZ = Math.abs(look.zCoord); - if (absX > absY && absX > absZ) { - lookSide = look.xCoord > 0 ? ForgeDirection.EAST : ForgeDirection.WEST; - } else if (absY > absX && absY > absZ) { - lookSide = look.yCoord > 0 ? ForgeDirection.UP : ForgeDirection.DOWN; - } else { - lookSide = look.zCoord > 0 ? ForgeDirection.SOUTH : ForgeDirection.NORTH; - } - Block initialBlock = aWorld.getBlock(aX, aY, aZ); - int initialBlockMeta = aWorld.getBlockMetadata(aX, aY, aZ); - TileEntity initialTE = aWorld.getTileEntity(aX, aY, aZ); - while ((GT_Utility.areStacksEqual(aStack, this.mUsed, true)) && (colorize(aWorld, aX, aY, aZ, side, aPlayer))) { - GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_PAINTER, 1.0F, 1.0F, aX, aY, aZ); - if (!aPlayer.capabilities.isCreativeMode) { - tUses -= 1L; - } - rOutput = true; - painted++; - if (painted >= maxPainted && maxPainted != -1) break; - if (!aPlayer.isSneaking() || tUses <= 0) break; - switch (lookSide) { - case UP -> aY += 1; - case DOWN -> aY -= 1; - case NORTH -> aZ -= 1; - case SOUTH -> aZ += 1; - case WEST -> aX -= 1; - case EAST -> aX += 1; - default -> throw new IllegalArgumentException("Unexpected value: " + lookSide); - } - - if (aWorld.getBlock(aX, aY, aZ) != initialBlock) break; - if (aWorld.getBlockMetadata(aX, aY, aZ) != initialBlockMeta) break; - - /* - * Check if the initial block had a TE and if the next one does, check if its the same kind. - * else one does and the other doesnt, thus stop checking. - */ - TileEntity targetTE = aWorld.getTileEntity(aX, aY, aZ); - if (initialTE == null ^ targetTE == null) break; - if (initialTE != null && targetTE != null) { - if (!initialTE.getClass() - .isInstance(targetTE)) break; - - if (initialTE instanceof IGregTechTileEntity currentGTTile - && targetTE instanceof IGregTechTileEntity targetGTTile) { - if (currentGTTile.getMetaTileID() != targetGTTile.getMetaTileID()) break; - } - } - } - tNBT.removeTag("GT.RemainingPaint"); - if (tUses > 0L) { - tNBT.setLong("GT.RemainingPaint", tUses); - } - if (tNBT.hasNoTags()) { - aStack.setTagCompound(null); - } else { - aStack.setTagCompound(tNBT); - } - if (tUses <= 0L) { - if (this.mEmpty == null) { - aStack.stackSize -= 1; - } else { - aStack.func_150996_a(this.mEmpty.getItem()); - Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmpty)); - } - } - return rOutput; - } - - protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { - final Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock != Blocks.air) { - if (this.mAllowedVanillaBlocks.contains(aBlock) || aBlock instanceof BlockColored) { - if (aBlock == Blocks.hardened_clay) { - aWorld.setBlock(aX, aY, aZ, Blocks.stained_hardened_clay, (~this.mColor) & 0xF, 3); - return true; - } - if (aBlock == Blocks.glass_pane) { - aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass_pane, (~this.mColor) & 0xF, 3); - return true; - } - if (aBlock == Blocks.glass) { - aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass, (~this.mColor) & 0xF, 3); - return true; - } - if (aWorld.getBlockMetadata(aX, aY, aZ) == ((~this.mColor) & 0xF)) { - return false; - } - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (~this.mColor) & 0xF, 3); - return true; - } - - if (aBlock instanceof IColorableTile) { - return ((IColorableTile) aBlock).recolourBlock(side, AEColor.values()[(~this.mColor) & 0xF], player); - } - - if (aBlock instanceof BlockCableBus) { - return ((BlockCableBus) aBlock).recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF, player); - } - } - return aBlock.recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF); - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - aList.add(this.mTooltipChain); - aList.add(String.format(this.mTooltipChainAmount, ConfigGeneral.sprayCanChainRange)); - NBTTagCompound tNBT = aStack.getTagCompound(); - long tRemainingPaint = tNBT == null ? this.mUses - : GT_Utility.areStacksEqual(aStack, this.mFull, true) ? this.mUses : tNBT.getLong("GT.RemainingPaint"); - aList.add(this.mTooltipUses + " " + tRemainingPaint); - aList.add(this.mTooltipUnstackable); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java deleted file mode 100644 index 0b73b4f7fc..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java +++ /dev/null @@ -1,48 +0,0 @@ -package gregtech.common.items.behaviors; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import appeng.api.implementations.tiles.IColorableTile; -import appeng.api.util.AEColor; -import appeng.block.networking.BlockCableBus; -import gregtech.api.interfaces.tileentity.IColoredTileEntity; -import gregtech.api.util.GT_LanguageManager; - -public class Behaviour_Spray_Color_Remover extends Behaviour_Spray_Color { - - public Behaviour_Spray_Color_Remover(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses) { - super(aEmpty, aUsed, aFull, aUses); - this.mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.paintspray.solvent.tooltip", "Can remove paint from things"); - } - - @Override - protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { - final Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock != Blocks.air) { - if (aBlock instanceof IColorableTile) { - return ((IColorableTile) aBlock).recolourBlock(side, AEColor.Transparent, player); - } - - if (aBlock instanceof BlockCableBus) { - return ((BlockCableBus) aBlock) - .recolourBlock(aWorld, aX, aY, aZ, side, AEColor.Transparent.ordinal(), player); - } - - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IColoredTileEntity gte) { - if (gte.getColorization() >= 0) { - gte.setColorization((byte) -1); - return true; - } - } - } - return false; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java deleted file mode 100644 index 03cf29b9dd..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java +++ /dev/null @@ -1,67 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.items.GT_Generic_Block; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Switch_Metadata extends Behaviour_None { - - public final int mSwitchIndex; - public final boolean mCheckTarget, mShowModeSwitchTooltip; - - public Behaviour_Switch_Metadata(int aSwitchIndex) { - this(aSwitchIndex, false); - } - - public Behaviour_Switch_Metadata(int aSwitchIndex, boolean aCheckTarget) { - this(aSwitchIndex, aCheckTarget, false); - } - - public Behaviour_Switch_Metadata(int aSwitchIndex, boolean aCheckTarget, boolean aShowModeSwitchTooltip) { - mSwitchIndex = aSwitchIndex; - mCheckTarget = aCheckTarget; - mShowModeSwitchTooltip = aShowModeSwitchTooltip; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - if (mShowModeSwitchTooltip) aList.add(GT_Utility.trans("330", "Sneak Rightclick to switch Mode")); - return aList; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float aHitX, float aHitY, float aHitZ) { - if (aStack != null && (aPlayer == null || aPlayer.isSneaking()) && !aWorld.isRemote) { - if (mCheckTarget) { - Block aBlock = aWorld.blockExists(aX, aY, aZ) ? aWorld.getBlock(aX, aY, aZ) : Blocks.air; - if (aBlock instanceof GT_Generic_Block) { - Items.feather.setDamage(aStack, (short) mSwitchIndex); - GT_Utility.updateItemStack(aStack); - return true; - } - if (GT_Util.getTileEntity(aWorld, aX, aY, aZ, true) == null) { - Items.feather.setDamage(aStack, (short) mSwitchIndex); - GT_Utility.updateItemStack(aStack); - return true; - } - return false; - } - Items.feather.setDamage(aStack, (short) mSwitchIndex); - GT_Utility.updateItemStack(aStack); - return true; - } - return false; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java deleted file mode 100644 index 4054377568..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - -import gregtech.api.enums.GT_Values; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.net.GT_Packet_ToolSwitchMode; -import gregtech.api.util.GT_Utility; - -public class Behaviour_Switch_Mode extends Behaviour_None { - - public Behaviour_Switch_Mode() {} - - @Override - public ItemStack onItemRightClick(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - if (aStack != null && (aPlayer == null || aPlayer.isSneaking()) && aWorld.isRemote) { - - GT_MetaGenerated_Tool itemTool = (GT_MetaGenerated_Tool) aItem; - final byte maxMode = itemTool.getToolMaxMode(aStack); - if (maxMode == 1) { - return aStack; - } - - MovingObjectPosition mop = GT_Utility.getPlayerLookingTarget(aPlayer); - if (mop == null) { - GT_Values.NW.sendToServer(new GT_Packet_ToolSwitchMode()); - } - return aStack; - } - return aStack; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - super.getAdditionalToolTips(aItem, aList, aStack); - if ((aItem instanceof GT_MetaGenerated_Tool)) { - GT_MetaGenerated_Tool itemTool = (GT_MetaGenerated_Tool) aItem; - final int maxMode = itemTool.getToolMaxMode(aStack); - if (maxMode > 1) { - aList.add("Shift+Rclick to change mode"); - } - } - - return aList; - } - -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java deleted file mode 100644 index 16c5c3f948..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java +++ /dev/null @@ -1,278 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.Arrays; -import java.util.List; -import java.util.function.BooleanSupplier; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; - -import appeng.api.parts.IPartHost; -import appeng.api.util.IOrientable; -import appeng.tile.misc.TileInterface; -import gregtech.api.enums.SoundResource; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import ic2.api.tile.IWrenchable; - -public class Behaviour_Wrench extends Behaviour_None { - - private final int mCosts; - private final String mTooltip = GT_LanguageManager - .addStringLocalization("gt.behaviour.wrench", "Rotates Blocks on Rightclick"); - - public Behaviour_Wrench(int aCosts) { - this.mCosts = aCosts; - } - - @Override - public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - final Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock == null) { - return false; - } - final int aMeta = aWorld.getBlockMetadata(aX, aY, aZ); - final short targetSideOrdinal = (short) GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ) - .ordinal(); - final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); - - final WrenchHandler handler = new WrenchHandler( - aBlock, - aMeta, - targetSideOrdinal, - aTileEntity, - aPlayer, - aWorld, - aX, - aY, - aZ, - aStack, - (GT_MetaGenerated_Tool) aItem, - mCosts); - - try { - return handler.handle() && !aWorld.isRemote; - } catch (Throwable ignored) {} - return false; - } - - /** - *

- * A class to simplify wrenching operation, - * stopping "checking creative", "trying to damage tool", - * "doing the logic" and "playing sound" again and again. - * This should have been a record, but it's not available in Java 8. - *

- *

- * {@link WrenchHandler#handle()} is the entry point of main logic. - *

- */ - private static class WrenchHandler { - - boolean handle() { - ForgeDirection direction = ForgeDirection.getOrientation(targetSideOrdinal); - - // AE2 logic - // default to change the up facing - // sneak to change the forward facing - if (tileEntity instanceof IOrientable orientable) { - if (!orientable.canBeRotated()) return false; - ForgeDirection front = orientable.getForward(); - ForgeDirection up = orientable.getUp(); - - // mainly for me-interfaces, whose initial orientation is UNKNOWN - if (front == ForgeDirection.UNKNOWN) { - if (direction == ForgeDirection.UP || direction == ForgeDirection.DOWN) - front = ForgeDirection.NORTH; - else front = ForgeDirection.UP; - } - - ForgeDirection back = front.getOpposite(); - ForgeDirection down = up.getOpposite(); - - if (tileEntity instanceof TileInterface) { - if (player.isSneaking()) return false; - if (direction == down) { - return doWrenchOperation(costs, () -> { - orientable.setOrientation(ForgeDirection.UNKNOWN, ForgeDirection.UNKNOWN); - return true; - }); - } - // interface's up-side is opposite to the arrow on texture - // make it intuitive by rotating it to the opposite side. - direction = direction.getOpposite(); - up = up.getOpposite(); - } else if (direction == up || direction == front) { - // rotate around the direction axis - final var tempFront = front; - final var tempUp = up; - if (!player.isSneaking() && direction == up) return doWrenchOperation(costs, () -> { - orientable.setOrientation(tempFront.getRotation(tempUp), tempUp); - return true; - }); - if (player.isSneaking() && direction == front) return doWrenchOperation(costs, () -> { - orientable.setOrientation( - tempFront, - tempUp.getRotation(tempFront) - .getRotation(tempFront)); - return true; - }); - } - - if (player.isSneaking()) { - if (direction == up || direction == down) { - orientable.setOrientation(direction, down.getRotation(front.getRotation(direction))); - } else orientable.setOrientation(direction, up); - } else { - if (direction == front || direction == back) { - orientable.setOrientation(back.getRotation(up.getRotation(direction)), direction); - } else orientable.setOrientation(front, direction); - } - - return damageWrench(costs); - } - if (world.isRemote) return false; - // IC2 Wrenchable - if (tileEntity instanceof IWrenchable wrenchable) { - if (wrenchable.wrenchCanSetFacing(player, targetSideOrdinal)) { - return doWrenchOperation(costs, () -> { - wrenchable.setFacing(targetSideOrdinal); - return true; - }); - } - return false; - } - - if (block == Blocks.powered_repeater || block == Blocks.unpowered_repeater - || block == Blocks.powered_comparator - || block == Blocks.unpowered_comparator) return setBlockMeta(costs, meta / 4 * 4 + (meta % 4 + 1) % 4); - - // hopper cannot face sky - if (block == Blocks.hopper && targetSideOrdinal != 1) return setBlockMeta(costs, targetSideOrdinal); - - if (isVanillaAllSideRotatable(block)) if (meta < 6) return setBlockMeta(costs, targetSideOrdinal); - - // blocks like chests and furnaces have only four directions - if (isVanillaCantFaceAxisY(block)) { - if (targetSideOrdinal > 1) return setBlockMeta(costs, targetSideOrdinal); - else return false; - } - if (tileEntity instanceof IPartHost) return false; - - final int logWoodId = OreDictionary.getOreID("logWood"); - if (Arrays.stream(OreDictionary.getOreIDs(new ItemStack(block))) - .anyMatch(id -> id == logWoodId)) { - // The meta just work - return setBlockMeta(costs, (meta + 4) % 12); - } - - // vanilla block rotate logic - if ((Arrays.asList(block.getValidRotations(world, x, y, z)) - .contains(direction))) return rotateBlock(costs, direction); - return false; - - // GT blocks' rotations are done by blocks themselves after this returning false - } - - private final Block block; - private final short targetSideOrdinal; - private final TileEntity tileEntity; - private final EntityPlayer player; - private final World world; - private final int x, y, z, meta; - private final ItemStack stack; - - private final GT_MetaGenerated_Tool item; - private final int costs; - - public WrenchHandler(Block block, int meta, short targetSideOrdinal, TileEntity tileEntity, EntityPlayer player, - World world, int x, int y, int z, ItemStack stack, GT_MetaGenerated_Tool item, int costs) { - this.block = block; - this.meta = meta; - this.targetSideOrdinal = targetSideOrdinal; - this.tileEntity = tileEntity; - this.player = player; - this.world = world; - this.x = x; - this.y = y; - this.z = z; - this.stack = stack; - this.item = item; - this.costs = costs; - } - - /** - * this will run the operation, damage the tool and play the sound if possible (creative mode or - * {@link GT_MetaGenerated_Tool#canWrench(EntityPlayer, int, int, int)}) - * - * @param damage damage to be applied to the wrench - * @param operation the real operation of the click - * @return true if the operation was successful - * @see #setBlockMeta(int, int) - * @see #rotateBlock(int, ForgeDirection) - * @see #rotateBlock(int, ForgeDirection) - */ - boolean doWrenchOperation(int damage, BooleanSupplier operation) { - if (player.capabilities.isCreativeMode || item.canWrench(player, x, y, z)) { - if (operation.getAsBoolean()) { - item.doDamage(stack, damage); - GT_Utility.sendSoundToPlayers(world, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, x, y, z); - return true; - } - } - return false; - } - - boolean setBlockMeta(int damage, int newMeta) { - return doWrenchOperation(damage, () -> setBlockMetadataWithNotify(newMeta)); - } - - boolean rotateBlock(int damage, ForgeDirection direction) { - return doWrenchOperation(damage, () -> block.rotateBlock(world, x, y, z, direction)); - } - - boolean damageWrench(int damage) { - return doWrenchOperation(damage, () -> true); - } - - private boolean setBlockMetadataWithNotify(int newMeta) { - return world.setBlockMetadataWithNotify(x, y, z, newMeta, 3); - } - - } - - public static boolean isVanillaRotatable(Block block) { - return isVanillaCantFaceAxisY(block) || isVanillaAllSideRotatable(block) || block == Blocks.hopper; - } - - public static boolean isVanillaCantFaceAxisY(Block block) { - return GT_Utility.arrayContains( - block, - Blocks.pumpkin, - Blocks.lit_pumpkin, - Blocks.furnace, - Blocks.lit_furnace, - Blocks.chest, - Blocks.trapped_chest, - Blocks.ender_chest); - } - - public static boolean isVanillaAllSideRotatable(Block block) { - return GT_Utility.arrayContains(block, Blocks.piston, Blocks.sticky_piston, Blocks.dispenser, Blocks.dropper); - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - aList.add(this.mTooltip); - return aList; - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java deleted file mode 100644 index 0f645a93a9..0000000000 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java +++ /dev/null @@ -1,40 +0,0 @@ -package gregtech.common.items.behaviors; - -import java.util.List; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.GuiScreenBook; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.util.GT_Utility; - -public class Behaviour_WrittenBook extends Behaviour_None { - - @Override - @SideOnly(Side.CLIENT) - public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, - int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { - if ((GT_Utility.isStringValid(GT_Utility.ItemNBT.getBookTitle(aStack))) - && ((aPlayer instanceof EntityPlayerSP))) { - Minecraft.getMinecraft() - .displayGuiScreen(new GuiScreenBook(aPlayer, aStack, false)); - } - return true; - } - - @Override - public List getAdditionalToolTips(GT_MetaBase_Item aItem, List aList, ItemStack aStack) { - String tTitle = GT_Utility.ItemNBT.getBookTitle(aStack); - if (GT_Utility.isStringValid(tTitle)) { - aList.add(tTitle); - aList.add("by " + GT_Utility.ItemNBT.getBookAuthor(aStack)); - } - return aList; - } -} diff --git a/src/main/java/gregtech/common/misc/DrillingLogicDelegate.java b/src/main/java/gregtech/common/misc/DrillingLogicDelegate.java new file mode 100644 index 0000000000..c52141f9bc --- /dev/null +++ b/src/main/java/gregtech/common/misc/DrillingLogicDelegate.java @@ -0,0 +1,266 @@ +package gregtech.common.misc; + +import static gregtech.api.enums.GTValues.debugBlockMiner; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.FakePlayer; + +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.TileEntityOres; + +/** @author Relvl on 27.01.2022 */ +@SuppressWarnings("ObjectEquality") +public class DrillingLogicDelegate { + + public static final ItemStack MINING_PIPE_STACK = GTModHandler.getIC2Item("miningPipe", 0); + public static final Block MINING_PIPE_BLOCK = GTUtility.getBlockFromStack(MINING_PIPE_STACK); + public static final Block MINING_PIPE_TIP_BLOCK = GTUtility + .getBlockFromStack(GTModHandler.getIC2Item("miningPipeTip", 0)); + + /** The owner machine pointer */ + private final IDrillingLogicDelegateOwner owner; + + /** Is pipe retracting process done and halts? */ + private boolean isRetractDone; + /** Is machine ran out of mining pipes in its inventory and halts? */ + private boolean isWaitingForPipeItem; + /** Pipe tip depth (relative to machine Y position, NEGATIVE). */ + private int tipDepth; + /** Cached fake player */ + private FakePlayer mFakePlayer; + + public DrillingLogicDelegate(IDrillingLogicDelegateOwner owner) { + this.owner = owner; + } + + /** Descents a pipe tip one plock deeper. */ + public boolean descent(IGregTechTileEntity te) { + if (!te.isAllowedToWork()) { + return false; + } + + int xCoord = te.getXCoord(); + int zCoord = te.getZCoord(); + int yCoord = te.getYCoord(); + int checkY = yCoord + tipDepth - 1; + boolean isHitsTheVoid = checkY < 0; + boolean isHitsBedrock = GTUtility.getBlockHardnessAt(te.getWorld(), xCoord, checkY, zCoord) < 0; + boolean isFakePlayerAllowed = canFakePlayerInteract(te, xCoord, checkY, zCoord); + + if (isHitsTheVoid || isHitsBedrock || !isFakePlayerAllowed) { + // Disable and start retracting process. + te.disableWorking(); + if (debugBlockMiner) { + if (isHitsTheVoid) { + GTLog.out.println("MINER: Hit bottom"); + } + if (isHitsBedrock) { + GTLog.out.println("MINER: Hit block with -1 hardness"); + } + if (!isFakePlayerAllowed) { + GTLog.out.println("MINER: Unable to set mining pipe tip"); + } + } + return false; + } + + // Replace the tip onto pipe + if (te.getBlockOffset(0, tipDepth, 0) == MINING_PIPE_TIP_BLOCK) { + te.getWorld() + .setBlock(xCoord, yCoord + tipDepth, zCoord, MINING_PIPE_BLOCK); + } + // Get and decrease pipe from the machine + boolean pipeTaken = owner.pullInputs(MINING_PIPE_STACK.getItem(), 1, false); + if (!pipeTaken) { + // If there was nothing - waiting for the pipes (just for prevent unnecessary checks) + isWaitingForPipeItem = true; + return false; + } + + // If there is something - mine it + Block block = te.getBlockOffset(0, tipDepth - 1, 0); + if (!block.isAir(te.getWorld(), xCoord, yCoord, zCoord)) { + mineBlock(te, block, xCoord, yCoord + tipDepth - 1, zCoord); + } + + // Descent the pipe tip + te.getWorld() + .setBlock(xCoord, yCoord + tipDepth - 1, zCoord, MINING_PIPE_TIP_BLOCK); + tipDepth--; + return true; + } + + public void onOwnerPostTick(IGregTechTileEntity te, long tick) { + // If the machine was disabled - try to retract pipe + if (!te.isAllowedToWork()) { + onPostTickRetract(te, tick); + return; + } + // If the machine was re-enabled - we should reset the retracting process + isRetractDone = false; + } + + /** If the machine are disabled - tried to retract pipe. */ + private void onPostTickRetract(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (isRetractDone) { + return; + } + // If retracting process just touch the miner + if (tipDepth == 0) { + isRetractDone = true; + return; + } + // Once per N ticks (depends on tier) + if ((aTick % (owner.getMachineSpeed() / 5)) != 0) { + return; + } + + // Check we can push pipe back to machine (inputs allowed for this case!) + boolean canPush = owner.pushOutputs(MINING_PIPE_STACK, 1, true, true); + if (!canPush) { + return; + } + + // Inspect target block - it should be a pipe tip, else something went wrong. + Block targetBlock = aBaseMetaTileEntity.getBlockOffset(0, tipDepth, 0); + if (targetBlock != MINING_PIPE_TIP_BLOCK && targetBlock != MINING_PIPE_BLOCK) { + return; + } + + // Retract the pipe/tip + int xCoord = aBaseMetaTileEntity.getXCoord(); + int yCoord = aBaseMetaTileEntity.getYCoord(); + int zCoord = aBaseMetaTileEntity.getZCoord(); + int actualDrillY = yCoord + tipDepth; + // Move the pipe tip position + if (actualDrillY < yCoord - 1) { + owner.getBaseMetaTileEntity() + .getWorld() + .setBlock(xCoord, actualDrillY + 1, zCoord, MINING_PIPE_TIP_BLOCK); + } + // Remove the old pipe tip + aBaseMetaTileEntity.getWorld() + .setBlock(xCoord, actualDrillY, zCoord, Blocks.air, 0, /* send to client without neighbour updates */ 2); + + // Return the pipe back to the machine (inputs allowed for this case!) + owner.pushOutputs(MINING_PIPE_STACK, 1, false, true); + + tipDepth++; + } + + /** Minings the block if it is possible. */ + public void mineBlock(IGregTechTileEntity te, Block block, int x, int y, int z) { + if (!GTUtility.eraseBlockByFakePlayer(getFakePlayer(te), x, y, z, true)) { + return; + } + + List drops = getBlockDrops(block, x, y, z); + + boolean canFitDrops = true; + for (ItemStack drop : drops) { + canFitDrops &= owner.pushOutputs(drop, drop.stackSize, true, false); + } + if (!canFitDrops) { + return; + } + for (ItemStack drop : drops) { + owner.pushOutputs(drop, drop.stackSize, false, false); + } + + short metaData = 0; + TileEntity tTileEntity = owner.getBaseMetaTileEntity() + .getTileEntity(x, y, z); + if (tTileEntity instanceof TileEntityOres) { + metaData = ((TileEntityOres) tTileEntity).mMetaData; + } + + ItemStack cobble = GTUtility.getCobbleForOre(block, metaData); + te.getWorld() + .setBlock( + x, + y, + z, + Block.getBlockFromItem(cobble.getItem()), + cobble.getItemDamage(), /* cause updates(1) + send to client(2) */ + 3); + } + + /** + * Returns NEGATIVE (eg -5) depth of current drilling Y world level. RELATIVELY TO MINER ENTITY! This means '(miner + * world Y) + depth = (actual world Y)'. + */ + public int getTipDepth() { + return tipDepth; + } + + /** Looking for the lowest continuous pipe. */ + public void findTipDepth() { + IGregTechTileEntity ownerTe = owner.getBaseMetaTileEntity(); + if (!ownerTe.isServerSide()) { + return; + } + while (true) { + Block block = ownerTe.getBlockOffset(0, tipDepth - 1, 0); + if (block != MINING_PIPE_BLOCK && block != MINING_PIPE_TIP_BLOCK) { + return; + } + tipDepth--; + } + } + + /** + * Creates and provides the Fake Player for owners. todo maybe will provide player owner uuid? im sure some servers + * not allow to fakers, in griefing reasons. + */ + public FakePlayer getFakePlayer(IGregTechTileEntity te) { + if (mFakePlayer == null) { + mFakePlayer = GTUtility.getFakePlayer(te); + } + if (mFakePlayer != null) { + mFakePlayer.setWorld(te.getWorld()); + mFakePlayer.setPosition(te.getXCoord(), te.getYCoord(), te.getZCoord()); + } + return mFakePlayer; + } + + public boolean canFakePlayerInteract(IGregTechTileEntity te, int xCoord, int yCoord, int zCoord) { + return GTUtility + .setBlockByFakePlayer(getFakePlayer(te), xCoord, yCoord, zCoord, MINING_PIPE_TIP_BLOCK, 0, true); + } + + /** Get target block drops. We need to encapsulate everyting of mining in this class. */ + private List getBlockDrops(final Block oreBlock, int posX, int posY, int posZ) { + return oreBlock.getDrops( + owner.getBaseMetaTileEntity() + .getWorld(), + posX, + posY, + posZ, + owner.getBaseMetaTileEntity() + .getMetaID(posX, posY, posZ), + owner.getMachineTier()); + } + + /** Can the owner continue doing its work? If we await new pipes - it cannot. */ + public boolean canContinueDrilling(long tick) { + if (isWaitingForPipeItem) { + if (tick % 5 != 0) { + return false; + } + boolean hasPipe = owner.pullInputs(MINING_PIPE_STACK.getItem(), 1, true); + if (hasPipe) { + isWaitingForPipeItem = false; + } + return hasPipe; + } + return true; + } +} diff --git a/src/main/java/gregtech/common/misc/GTClientPollutionMap.java b/src/main/java/gregtech/common/misc/GTClientPollutionMap.java new file mode 100644 index 0000000000..546f8e8d12 --- /dev/null +++ b/src/main/java/gregtech/common/misc/GTClientPollutionMap.java @@ -0,0 +1,140 @@ +package gregtech.common.misc; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.util.MathHelper; + +public class GTClientPollutionMap { + + private static final byte RADIUS = 24; + private static final byte DISTANCE_RELOAD_MAP = 5; // When player moved x chunks, shift the map to new center. + private static final byte SIZE = RADIUS * 2 + 1; // Area to keep stored. + + private int x0, z0; + private int dim; + + private boolean initialized = false; + + private static short[][] chunkMatrix; // short because reasons. + + public GTClientPollutionMap() {} + + public void reset() { + initialized = false; + } + + private void initialize(int playerChunkX, int playerChunkZ, int dimension) { + initialized = true; + chunkMatrix = new short[SIZE][SIZE]; + x0 = playerChunkX; + z0 = playerChunkZ; + dim = dimension; + } + + public void addChunkPollution(int chunkX, int chunkZ, int pollution) { + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + if (player == null || player.worldObj == null) return; + + int playerXChunk = MathHelper.floor_double(player.posX) >> 4; + int playerZChunk = MathHelper.floor_double(player.posZ) >> 4; // posX/Z seems to be always loaded, + + if (!initialized) { + initialize(playerXChunk, playerZChunk, player.dimension); + } + + if (dim != player.dimension) { + initialize(playerXChunk, playerZChunk, player.dimension); + } + + if (Math.abs(x0 - playerXChunk) > DISTANCE_RELOAD_MAP || Math.abs(z0 - playerZChunk) > DISTANCE_RELOAD_MAP) + shiftCenter(playerXChunk, playerZChunk); + + int relX = chunkX - x0 + RADIUS; + if (relX >= SIZE || relX < 0) // out of bounds + return; + int relZ = chunkZ - z0 + RADIUS; + if (relZ >= SIZE || relZ < 0) // out of bounds + return; + + pollution = pollution / 225; + if (pollution > Short.MAX_VALUE) // Sanity + chunkMatrix[relX][relZ] = Short.MAX_VALUE; // Max pollution = 7,3mill + else if (pollution < 0) chunkMatrix[relX][relZ] = 0; + else chunkMatrix[relX][relZ] = (short) (pollution); + } + + // xy interpolation, between 4 chunks as corners, unknown treated as 0. + public int getPollution(double fx, double fz) { + if (!initialized) return 0; + int x = MathHelper.floor_double(fx); + int z = MathHelper.floor_double(fz); + int xDiff = ((x - 8) >> 4) - x0; + int zDiff = ((z - 8) >> 4) - z0; + + if (xDiff < -RADIUS || zDiff < -RADIUS || xDiff >= RADIUS || zDiff >= RADIUS) return 0; + + // coordinates in shifted chunk. + x = (x - 8) % 16; + z = (z - 8) % 16; + if (x < 0) x = 16 + x; + if (z < 0) z = 16 + z; + + int xi = 15 - x; + int zi = 15 - z; + + // read pollution in 4 corner chunks + int offsetX = RADIUS + xDiff; + int offsetZ = RADIUS + zDiff; + + int c00 = chunkMatrix[offsetX][offsetZ]; + int c10 = chunkMatrix[offsetX + 1][offsetZ]; + int c01 = chunkMatrix[offsetX][offsetZ + 1]; + int c11 = chunkMatrix[offsetX + 1][offsetZ + 1]; + + // Is divided by 15*15 but is handled when storing chunk data. + return c00 * xi * zi + c10 * x * zi + c01 * xi * z + c11 * x * z; + } + + // shift the matrix to fit new center + private void shiftCenter(int chunkX, int chunkZ) { + int xDiff = chunkX - x0; + int zDiff = chunkZ - z0; + boolean[] allEmpty = new boolean[SIZE]; // skip check z row if its empty. + if (xDiff > 0) for (byte x = 0; x < SIZE; x++) { + int xOff = x + xDiff; + if (xOff < SIZE) { + chunkMatrix[x] = chunkMatrix[xOff].clone(); + } else { + chunkMatrix[x] = new short[SIZE]; + allEmpty[x] = true; + } + } + else if (xDiff < 0) for (byte x = SIZE - 1; x >= 0; x--) { + int xOff = x + xDiff; + if (xOff > 0) { + chunkMatrix[x] = chunkMatrix[xOff].clone(); + } else { + chunkMatrix[x] = new short[SIZE]; + allEmpty[x] = true; + } + } + + if (zDiff > 0) for (byte x = 0; x < SIZE; x++) { + if (allEmpty[x]) continue; + for (int z = 0; z < SIZE; z++) { + int zOff = z + zDiff; + chunkMatrix[x][z] = (zOff < SIZE) ? chunkMatrix[x][zOff] : 0; + } + } + else if (zDiff < 0) for (byte x = 0; x < SIZE; x++) { + if (allEmpty[x]) continue; + for (int z = SIZE - 1; z >= 0; z--) { + int zOff = z + zDiff; + chunkMatrix[x][z] = (zOff > 0) ? chunkMatrix[x][zOff] : 0; + } + } + + x0 = chunkX; + z0 = chunkZ; + } +} diff --git a/src/main/java/gregtech/common/misc/GTCommand.java b/src/main/java/gregtech/common/misc/GTCommand.java new file mode 100644 index 0000000000..f1590ec792 --- /dev/null +++ b/src/main/java/gregtech/common/misc/GTCommand.java @@ -0,0 +1,354 @@ +package gregtech.common.misc; + +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.getUserEU; +import static gregtech.common.misc.WirelessNetworkManager.setUserEU; + +import java.lang.reflect.Field; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.EnumChatFormatting; + +import com.gtnewhorizon.structurelib.StructureLib; + +import cpw.mods.fml.relauncher.FMLLaunchHandler; +import gregtech.GTMod; +import gregtech.api.enums.GTValues; +import gregtech.api.objects.GTChunkManager; +import gregtech.api.util.GTMusicSystem; +import gregtech.api.util.GTUtility; +import gregtech.common.Pollution; +import gregtech.common.misc.spaceprojects.SpaceProjectManager; + +public final class GTCommand extends CommandBase { + + @Override + public String getCommandName() { + return "gt"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "Usage: gt . Valid subcommands are: toggle, chunks, pollution, global_energy_add, global_energy_set, global_energy_join, dump_music_durations."; + } + + private void printHelp(ICommandSender sender) { + sender.addChatMessage( + new ChatComponentText( + "Usage: gt ")); + sender.addChatMessage(new ChatComponentText("\"toggle D1\" - toggles general.Debug (D1)")); + sender.addChatMessage(new ChatComponentText("\"toggle D2\" - toggles general.Debug2 (D2)")); + sender.addChatMessage(new ChatComponentText("\"toggle debugCleanroom\" - toggles cleanroom debug log")); + sender.addChatMessage(new ChatComponentText("\"toggle debugDriller\" - toggles oil drill debug log")); + sender.addChatMessage(new ChatComponentText("\"toggle debugBlockPump\" - Possible issues with pumps")); + sender.addChatMessage(new ChatComponentText("\"toggle debugBlockMiner\" - Possible issues with miners")); + sender.addChatMessage( + new ChatComponentText("\"toggle debugEntityCramming\" - How long it takes and how many entities it finds")); + sender.addChatMessage(new ChatComponentText("\"toggle debugWorldGen\" - toggles generic worldgen debug")); + sender.addChatMessage(new ChatComponentText("\"toggle debugOrevein\" - toggles worldgen ore vein debug")); + sender.addChatMessage(new ChatComponentText("\"toggle debugSmallOres\" - toggles worldgen small vein debug")); + sender.addChatMessage(new ChatComponentText("\"toggle debugStones\" - toggles worldgen stones debug")); + sender.addChatMessage(new ChatComponentText("\"toggle debugChunkloaders\" - toggles chunkloaders debug")); + sender.addChatMessage(new ChatComponentText("\"toggle debugMulti\" - toggles structurelib debug")); + sender.addChatMessage(new ChatComponentText("\"chunks\" - print a list of the force loaded chunks")); + sender.addChatMessage( + new ChatComponentText( + "\"pollution \" - adds the of the pollution to the current chunk, " + + "\n if isnt specified, will add" + + GTMod.gregtechproxy.mPollutionSmogLimit + + "gibbl.")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + " --- Global wireless EU controls ---")); + sender.addChatMessage(new ChatComponentText("Allows you to set the amount of EU in a users wireless network.")); + sender.addChatMessage( + new ChatComponentText( + "Usage:" + EnumChatFormatting.RED + + " global_energy_set " + + EnumChatFormatting.BLUE + + "[Name] " + + EnumChatFormatting.LIGHT_PURPLE + + "[EU]")); + sender.addChatMessage( + new ChatComponentText("Allows you to add EU to a users wireless network. Also accepts negative numbers.")); + sender.addChatMessage( + new ChatComponentText( + "Usage:" + EnumChatFormatting.RED + + " global_energy_add " + + EnumChatFormatting.BLUE + + "[Name] " + + EnumChatFormatting.LIGHT_PURPLE + + "[EU]")); + sender.addChatMessage( + new ChatComponentText( + "Allows you to join two users together into one network. Can be undone by writing the users name twice.")); + sender.addChatMessage( + new ChatComponentText( + "Usage:" + EnumChatFormatting.RED + + " global_energy_join " + + EnumChatFormatting.BLUE + + "[User joining] [User to join]")); + sender.addChatMessage(new ChatComponentText("Shows the amount of EU in a users energy network.")); + sender.addChatMessage( + new ChatComponentText( + "Usage:" + EnumChatFormatting.RED + " global_energy_display " + EnumChatFormatting.BLUE + "[Name]")); + sender.addChatMessage( + new ChatComponentText( + "\"dump_music_durations\" - dumps soundmeta/durations.json for all registered records in the game to the log. Client-only")); + } + + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] ss) { + List l = new ArrayList<>(); + String test = ss.length == 0 ? "" : ss[0].trim(); + if (ss.length == 0 || ss.length == 1 && (test.isEmpty() || Stream + .of( + "toggle", + "chunks", + "pollution", + "global_energy_add", + "global_energy_set", + "global_energy_join", + "global_energy_display", + "dump_music_durations") + .anyMatch(s -> s.startsWith(test)))) { + Stream + .of( + "toggle", + "chunks", + "pollution", + "global_energy_add", + "global_energy_set", + "global_energy_join", + "global_energy_display", + "dump_music_durations") + .filter(s -> test.isEmpty() || s.startsWith(test)) + .forEach(l::add); + } else if (test.equals("toggle")) { + String test1 = ss[1].trim(); + Stream + .of( + "D1", + "D2", + "debugCleanroom", + "debugDriller", + "debugBlockPump", + "debugBlockMiner", + "debugWorldGen", + "debugEntityCramming", + "debugOrevein", + "debugSmallOres", + "debugStones", + "debugChunkloaders", + "debugMulti", + "debugWorldData") + .filter(s -> test1.isEmpty() || s.startsWith(test1)) + .forEach(l::add); + } + return l; + } + + @Override + public void processCommand(ICommandSender sender, String[] strings) { + if (strings.length < 1) { + printHelp(sender); + return; + } + switch (strings[0]) { + case "toggle" -> { + if (strings.length < 2) { + printHelp(sender); + return; + } + if ("debugMulti".equals(strings[1])) { + StructureLib.DEBUG_MODE = !StructureLib.DEBUG_MODE; + sender.addChatMessage( + new ChatComponentText(strings[1] + " = " + (StructureLib.DEBUG_MODE ? "true" : "false"))); + return; + } + try { + Field field = GTValues.class.getDeclaredField(strings[1]); + if (field.getType() != boolean.class) { + sender.addChatMessage(new ChatComponentText("Wrong variable: " + strings[1])); + return; + } + boolean b = !field.getBoolean(null); + field.setBoolean(null, b); + sender.addChatMessage(new ChatComponentText(strings[1] + " = " + (b ? "true" : "false"))); + } catch (Exception e) { + sender.addChatMessage(new ChatComponentText("No such variable: " + strings[0])); + } + } + case "chunks" -> { + GTChunkManager.printTickets(); + sender.addChatMessage(new ChatComponentText("Forced chunks logged to GregTech.log")); + } + case "pollution" -> { + ChunkCoordinates coordinates = sender.getPlayerCoordinates(); + int amount = (strings.length < 2) ? GTMod.gregtechproxy.mPollutionSmogLimit + : Integer.parseInt(strings[1]); + Pollution.addPollution( + sender.getEntityWorld() + .getChunkFromBlockCoords(coordinates.posX, coordinates.posZ), + amount); + } + case "global_energy_add" -> { + String username = strings[1]; + String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET; + UUID uuid = SpaceProjectManager.getPlayerUUIDFromName(username); + + String EU_String = strings[2]; + + // Usage is /gt global_energy_add username EU + + String EU_string_formatted = EnumChatFormatting.RED + GTUtility.formatNumbers(new BigInteger(EU_String)) + + EnumChatFormatting.RESET; + + if (addEUToGlobalEnergyMap(uuid, new BigInteger(EU_String))) sender.addChatMessage( + new ChatComponentText( + "Successfully added " + EU_string_formatted + + "EU to the global energy network of " + + formatted_username + + ".")); + else sender.addChatMessage( + new ChatComponentText( + "Failed to add " + EU_string_formatted + + "EU to the global energy map of " + + formatted_username + + ". Insufficient energy in network. ")); + + sender.addChatMessage( + new ChatComponentText( + formatted_username + " currently has " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(new BigInteger(getUserEU(uuid).toString())) + + EnumChatFormatting.RESET + + "EU in their network.")); + + } + case "global_energy_set" -> { + + // Usage is /gt global_energy_set username EU + + String username = strings[1]; + String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET; + UUID uuid = SpaceProjectManager.getPlayerUUIDFromName(username); + + String EU_String_0 = strings[2]; + + if ((new BigInteger(EU_String_0).compareTo(BigInteger.ZERO)) < 0) { + sender.addChatMessage( + new ChatComponentText("Cannot set a users energy network to a negative value.")); + break; + } + + setUserEU(uuid, new BigInteger(EU_String_0)); + + sender.addChatMessage( + new ChatComponentText( + "Successfully set " + formatted_username + + "'s global energy network to " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(new BigInteger(EU_String_0)) + + EnumChatFormatting.RESET + + "EU.")); + + } + case "global_energy_join" -> { + + // Usage is /gt global_energy_join username_of_you username_to_join + + String usernameSubject = strings[1]; + String usernameTeam = strings[2]; + + String formattedUsernameSubject = EnumChatFormatting.BLUE + usernameSubject + EnumChatFormatting.RESET; + String formattedUsernameTeam = EnumChatFormatting.BLUE + usernameTeam + EnumChatFormatting.RESET; + + UUID uuidSubject = SpaceProjectManager.getPlayerUUIDFromName(usernameSubject); + UUID uuidTeam = SpaceProjectManager.getLeader(SpaceProjectManager.getPlayerUUIDFromName(usernameTeam)); + + if (uuidSubject.equals(uuidTeam)) { + // leave team + SpaceProjectManager.putInTeam(uuidSubject, uuidSubject); + sender.addChatMessage( + new ChatComponentText( + "User " + formattedUsernameSubject + " has rejoined their own global energy network.")); + break; + } + + // join other's team + + if (uuidSubject.equals(uuidTeam)) { + sender.addChatMessage(new ChatComponentText("They are already in the same network!")); + break; + } + + SpaceProjectManager.putInTeam(uuidSubject, uuidTeam); + + sender.addChatMessage( + new ChatComponentText( + "Success! " + formattedUsernameSubject + " has joined " + formattedUsernameTeam + ".")); + sender.addChatMessage( + new ChatComponentText( + "To undo this simply join your own network again with /gt global_energy_join " + + formattedUsernameSubject + + " " + + formattedUsernameSubject + + ".")); + + } + case "global_energy_display" -> { + + // Usage is /gt global_energy_display username. + + String username = strings[1]; + String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET; + UUID userUUID = SpaceProjectManager.getPlayerUUIDFromName(username); + + if (!SpaceProjectManager.isInTeam(userUUID)) { + sender.addChatMessage( + new ChatComponentText("User " + formatted_username + " has no global energy network.")); + break; + } + UUID teamUUID = SpaceProjectManager.getLeader(userUUID); + + sender.addChatMessage( + new ChatComponentText( + "User " + formatted_username + + " has " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(getUserEU(userUUID)) + + EnumChatFormatting.RESET + + "EU in their network.")); + if (!userUUID.equals(teamUUID)) sender.addChatMessage( + new ChatComponentText( + "User " + formatted_username + + " is currently in network of " + + EnumChatFormatting.BLUE + + SpaceProjectManager.getPlayerNameFromUUID(teamUUID) + + EnumChatFormatting.RESET + + ".")); + + } + case "dump_music_durations" -> { + if (!FMLLaunchHandler.side() + .isClient()) { + sender + .addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "This command is client-only.")); + } + GTMusicSystem.ClientSystem.dumpAllRecordDurations(); + } + default -> { + sender + .addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Invalid command/syntax detected.")); + printHelp(sender); + } + } + } +} diff --git a/src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java b/src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java deleted file mode 100644 index 6e40e5860c..0000000000 --- a/src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java +++ /dev/null @@ -1,140 +0,0 @@ -package gregtech.common.misc; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityClientPlayerMP; -import net.minecraft.util.MathHelper; - -public class GT_ClientPollutionMap { - - private static final byte RADIUS = 24; - private static final byte DISTANCE_RELOAD_MAP = 5; // When player moved x chunks, shift the map to new center. - private static final byte SIZE = RADIUS * 2 + 1; // Area to keep stored. - - private int x0, z0; - private int dim; - - private boolean initialized = false; - - private static short[][] chunkMatrix; // short because reasons. - - public GT_ClientPollutionMap() {} - - public void reset() { - initialized = false; - } - - private void initialize(int playerChunkX, int playerChunkZ, int dimension) { - initialized = true; - chunkMatrix = new short[SIZE][SIZE]; - x0 = playerChunkX; - z0 = playerChunkZ; - dim = dimension; - } - - public void addChunkPollution(int chunkX, int chunkZ, int pollution) { - EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; - if (player == null || player.worldObj == null) return; - - int playerXChunk = MathHelper.floor_double(player.posX) >> 4; - int playerZChunk = MathHelper.floor_double(player.posZ) >> 4; // posX/Z seems to be always loaded, - - if (!initialized) { - initialize(playerXChunk, playerZChunk, player.dimension); - } - - if (dim != player.dimension) { - initialize(playerXChunk, playerZChunk, player.dimension); - } - - if (Math.abs(x0 - playerXChunk) > DISTANCE_RELOAD_MAP || Math.abs(z0 - playerZChunk) > DISTANCE_RELOAD_MAP) - shiftCenter(playerXChunk, playerZChunk); - - int relX = chunkX - x0 + RADIUS; - if (relX >= SIZE || relX < 0) // out of bounds - return; - int relZ = chunkZ - z0 + RADIUS; - if (relZ >= SIZE || relZ < 0) // out of bounds - return; - - pollution = pollution / 225; - if (pollution > Short.MAX_VALUE) // Sanity - chunkMatrix[relX][relZ] = Short.MAX_VALUE; // Max pollution = 7,3mill - else if (pollution < 0) chunkMatrix[relX][relZ] = 0; - else chunkMatrix[relX][relZ] = (short) (pollution); - } - - // xy interpolation, between 4 chunks as corners, unknown treated as 0. - public int getPollution(double fx, double fz) { - if (!initialized) return 0; - int x = MathHelper.floor_double(fx); - int z = MathHelper.floor_double(fz); - int xDiff = ((x - 8) >> 4) - x0; - int zDiff = ((z - 8) >> 4) - z0; - - if (xDiff < -RADIUS || zDiff < -RADIUS || xDiff >= RADIUS || zDiff >= RADIUS) return 0; - - // coordinates in shifted chunk. - x = (x - 8) % 16; - z = (z - 8) % 16; - if (x < 0) x = 16 + x; - if (z < 0) z = 16 + z; - - int xi = 15 - x; - int zi = 15 - z; - - // read pollution in 4 corner chunks - int offsetX = RADIUS + xDiff; - int offsetZ = RADIUS + zDiff; - - int c00 = chunkMatrix[offsetX][offsetZ]; - int c10 = chunkMatrix[offsetX + 1][offsetZ]; - int c01 = chunkMatrix[offsetX][offsetZ + 1]; - int c11 = chunkMatrix[offsetX + 1][offsetZ + 1]; - - // Is divided by 15*15 but is handled when storing chunk data. - return c00 * xi * zi + c10 * x * zi + c01 * xi * z + c11 * x * z; - } - - // shift the matrix to fit new center - private void shiftCenter(int chunkX, int chunkZ) { - int xDiff = chunkX - x0; - int zDiff = chunkZ - z0; - boolean[] allEmpty = new boolean[SIZE]; // skip check z row if its empty. - if (xDiff > 0) for (byte x = 0; x < SIZE; x++) { - int xOff = x + xDiff; - if (xOff < SIZE) { - chunkMatrix[x] = chunkMatrix[xOff].clone(); - } else { - chunkMatrix[x] = new short[SIZE]; - allEmpty[x] = true; - } - } - else if (xDiff < 0) for (byte x = SIZE - 1; x >= 0; x--) { - int xOff = x + xDiff; - if (xOff > 0) { - chunkMatrix[x] = chunkMatrix[xOff].clone(); - } else { - chunkMatrix[x] = new short[SIZE]; - allEmpty[x] = true; - } - } - - if (zDiff > 0) for (byte x = 0; x < SIZE; x++) { - if (allEmpty[x]) continue; - for (int z = 0; z < SIZE; z++) { - int zOff = z + zDiff; - chunkMatrix[x][z] = (zOff < SIZE) ? chunkMatrix[x][zOff] : 0; - } - } - else if (zDiff < 0) for (byte x = 0; x < SIZE; x++) { - if (allEmpty[x]) continue; - for (int z = SIZE - 1; z >= 0; z--) { - int zOff = z + zDiff; - chunkMatrix[x][z] = (zOff > 0) ? chunkMatrix[x][zOff] : 0; - } - } - - x0 = chunkX; - z0 = chunkZ; - } -} diff --git a/src/main/java/gregtech/common/misc/GT_Command.java b/src/main/java/gregtech/common/misc/GT_Command.java deleted file mode 100644 index 8e342aa928..0000000000 --- a/src/main/java/gregtech/common/misc/GT_Command.java +++ /dev/null @@ -1,355 +0,0 @@ -package gregtech.common.misc; - -import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; -import static gregtech.common.misc.WirelessNetworkManager.getUserEU; -import static gregtech.common.misc.WirelessNetworkManager.setUserEU; - -import java.lang.reflect.Field; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import java.util.stream.Stream; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommandSender; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.EnumChatFormatting; - -import com.gtnewhorizon.structurelib.StructureLib; - -import cpw.mods.fml.relauncher.FMLLaunchHandler; -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; -import gregtech.api.objects.GT_ChunkManager; -import gregtech.api.util.GT_MusicSystem; -import gregtech.api.util.GT_Utility; -import gregtech.common.GT_Pollution; -import gregtech.common.misc.spaceprojects.SpaceProjectManager; - -public final class GT_Command extends CommandBase { - - @Override - public String getCommandName() { - return "gt"; - } - - @Override - public String getCommandUsage(ICommandSender sender) { - return "Usage: gt . Valid subcommands are: toggle, chunks, pollution, global_energy_add, global_energy_set, global_energy_join, dump_music_durations."; - } - - private void printHelp(ICommandSender sender) { - sender.addChatMessage( - new ChatComponentText( - "Usage: gt ")); - sender.addChatMessage(new ChatComponentText("\"toggle D1\" - toggles general.Debug (D1)")); - sender.addChatMessage(new ChatComponentText("\"toggle D2\" - toggles general.Debug2 (D2)")); - sender.addChatMessage(new ChatComponentText("\"toggle debugCleanroom\" - toggles cleanroom debug log")); - sender.addChatMessage(new ChatComponentText("\"toggle debugDriller\" - toggles oil drill debug log")); - sender.addChatMessage(new ChatComponentText("\"toggle debugBlockPump\" - Possible issues with pumps")); - sender.addChatMessage(new ChatComponentText("\"toggle debugBlockMiner\" - Possible issues with miners")); - sender.addChatMessage( - new ChatComponentText("\"toggle debugEntityCramming\" - How long it takes and how many entities it finds")); - sender.addChatMessage(new ChatComponentText("\"toggle debugWorldGen\" - toggles generic worldgen debug")); - sender.addChatMessage(new ChatComponentText("\"toggle debugOrevein\" - toggles worldgen ore vein debug")); - sender.addChatMessage(new ChatComponentText("\"toggle debugSmallOres\" - toggles worldgen small vein debug")); - sender.addChatMessage(new ChatComponentText("\"toggle debugStones\" - toggles worldgen stones debug")); - sender.addChatMessage(new ChatComponentText("\"toggle debugChunkloaders\" - toggles chunkloaders debug")); - sender.addChatMessage(new ChatComponentText("\"toggle debugMulti\" - toggles structurelib debug")); - sender.addChatMessage(new ChatComponentText("\"chunks\" - print a list of the force loaded chunks")); - sender.addChatMessage( - new ChatComponentText( - "\"pollution \" - adds the of the pollution to the current chunk, " - + "\n if isnt specified, will add" - + GT_Mod.gregtechproxy.mPollutionSmogLimit - + "gibbl.")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + " --- Global wireless EU controls ---")); - sender.addChatMessage(new ChatComponentText("Allows you to set the amount of EU in a users wireless network.")); - sender.addChatMessage( - new ChatComponentText( - "Usage:" + EnumChatFormatting.RED - + " global_energy_set " - + EnumChatFormatting.BLUE - + "[Name] " - + EnumChatFormatting.LIGHT_PURPLE - + "[EU]")); - sender.addChatMessage( - new ChatComponentText("Allows you to add EU to a users wireless network. Also accepts negative numbers.")); - sender.addChatMessage( - new ChatComponentText( - "Usage:" + EnumChatFormatting.RED - + " global_energy_add " - + EnumChatFormatting.BLUE - + "[Name] " - + EnumChatFormatting.LIGHT_PURPLE - + "[EU]")); - sender.addChatMessage( - new ChatComponentText( - "Allows you to join two users together into one network. Can be undone by writing the users name twice.")); - sender.addChatMessage( - new ChatComponentText( - "Usage:" + EnumChatFormatting.RED - + " global_energy_join " - + EnumChatFormatting.BLUE - + "[User joining] [User to join]")); - sender.addChatMessage(new ChatComponentText("Shows the amount of EU in a users energy network.")); - sender.addChatMessage( - new ChatComponentText( - "Usage:" + EnumChatFormatting.RED + " global_energy_display " + EnumChatFormatting.BLUE + "[Name]")); - sender.addChatMessage( - new ChatComponentText( - "\"dump_music_durations\" - dumps soundmeta/durations.json for all registered records in the game to the log. Client-only")); - } - - @Override - public List addTabCompletionOptions(ICommandSender sender, String[] ss) { - List l = new ArrayList<>(); - String test = ss.length == 0 ? "" : ss[0].trim(); - if (ss.length == 0 || ss.length == 1 && (test.isEmpty() || Stream - .of( - "toggle", - "chunks", - "pollution", - "global_energy_add", - "global_energy_set", - "global_energy_join", - "global_energy_display", - "dump_music_durations") - .anyMatch(s -> s.startsWith(test)))) { - Stream - .of( - "toggle", - "chunks", - "pollution", - "global_energy_add", - "global_energy_set", - "global_energy_join", - "global_energy_display", - "dump_music_durations") - .filter(s -> test.isEmpty() || s.startsWith(test)) - .forEach(l::add); - } else if (test.equals("toggle")) { - String test1 = ss[1].trim(); - Stream - .of( - "D1", - "D2", - "debugCleanroom", - "debugDriller", - "debugBlockPump", - "debugBlockMiner", - "debugWorldGen", - "debugEntityCramming", - "debugOrevein", - "debugSmallOres", - "debugStones", - "debugChunkloaders", - "debugMulti", - "debugWorldData") - .filter(s -> test1.isEmpty() || s.startsWith(test1)) - .forEach(l::add); - } - return l; - } - - @Override - public void processCommand(ICommandSender sender, String[] strings) { - if (strings.length < 1) { - printHelp(sender); - return; - } - switch (strings[0]) { - case "toggle" -> { - if (strings.length < 2) { - printHelp(sender); - return; - } - if ("debugMulti".equals(strings[1])) { - StructureLib.DEBUG_MODE = !StructureLib.DEBUG_MODE; - sender.addChatMessage( - new ChatComponentText(strings[1] + " = " + (StructureLib.DEBUG_MODE ? "true" : "false"))); - return; - } - try { - Field field = GT_Values.class.getDeclaredField(strings[1]); - if (field.getType() != boolean.class) { - sender.addChatMessage(new ChatComponentText("Wrong variable: " + strings[1])); - return; - } - boolean b = !field.getBoolean(null); - field.setBoolean(null, b); - sender.addChatMessage(new ChatComponentText(strings[1] + " = " + (b ? "true" : "false"))); - } catch (Exception e) { - sender.addChatMessage(new ChatComponentText("No such variable: " + strings[0])); - } - } - case "chunks" -> { - GT_ChunkManager.printTickets(); - sender.addChatMessage(new ChatComponentText("Forced chunks logged to GregTech.log")); - } - case "pollution" -> { - ChunkCoordinates coordinates = sender.getPlayerCoordinates(); - int amount = (strings.length < 2) ? GT_Mod.gregtechproxy.mPollutionSmogLimit - : Integer.parseInt(strings[1]); - GT_Pollution.addPollution( - sender.getEntityWorld() - .getChunkFromBlockCoords(coordinates.posX, coordinates.posZ), - amount); - } - case "global_energy_add" -> { - String username = strings[1]; - String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET; - UUID uuid = SpaceProjectManager.getPlayerUUIDFromName(username); - - String EU_String = strings[2]; - - // Usage is /gt global_energy_add username EU - - String EU_string_formatted = EnumChatFormatting.RED - + GT_Utility.formatNumbers(new BigInteger(EU_String)) - + EnumChatFormatting.RESET; - - if (addEUToGlobalEnergyMap(uuid, new BigInteger(EU_String))) sender.addChatMessage( - new ChatComponentText( - "Successfully added " + EU_string_formatted - + "EU to the global energy network of " - + formatted_username - + ".")); - else sender.addChatMessage( - new ChatComponentText( - "Failed to add " + EU_string_formatted - + "EU to the global energy map of " - + formatted_username - + ". Insufficient energy in network. ")); - - sender.addChatMessage( - new ChatComponentText( - formatted_username + " currently has " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(new BigInteger(getUserEU(uuid).toString())) - + EnumChatFormatting.RESET - + "EU in their network.")); - - } - case "global_energy_set" -> { - - // Usage is /gt global_energy_set username EU - - String username = strings[1]; - String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET; - UUID uuid = SpaceProjectManager.getPlayerUUIDFromName(username); - - String EU_String_0 = strings[2]; - - if ((new BigInteger(EU_String_0).compareTo(BigInteger.ZERO)) < 0) { - sender.addChatMessage( - new ChatComponentText("Cannot set a users energy network to a negative value.")); - break; - } - - setUserEU(uuid, new BigInteger(EU_String_0)); - - sender.addChatMessage( - new ChatComponentText( - "Successfully set " + formatted_username - + "'s global energy network to " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(new BigInteger(EU_String_0)) - + EnumChatFormatting.RESET - + "EU.")); - - } - case "global_energy_join" -> { - - // Usage is /gt global_energy_join username_of_you username_to_join - - String usernameSubject = strings[1]; - String usernameTeam = strings[2]; - - String formattedUsernameSubject = EnumChatFormatting.BLUE + usernameSubject + EnumChatFormatting.RESET; - String formattedUsernameTeam = EnumChatFormatting.BLUE + usernameTeam + EnumChatFormatting.RESET; - - UUID uuidSubject = SpaceProjectManager.getPlayerUUIDFromName(usernameSubject); - UUID uuidTeam = SpaceProjectManager.getLeader(SpaceProjectManager.getPlayerUUIDFromName(usernameTeam)); - - if (uuidSubject.equals(uuidTeam)) { - // leave team - SpaceProjectManager.putInTeam(uuidSubject, uuidSubject); - sender.addChatMessage( - new ChatComponentText( - "User " + formattedUsernameSubject + " has rejoined their own global energy network.")); - break; - } - - // join other's team - - if (uuidSubject.equals(uuidTeam)) { - sender.addChatMessage(new ChatComponentText("They are already in the same network!")); - break; - } - - SpaceProjectManager.putInTeam(uuidSubject, uuidTeam); - - sender.addChatMessage( - new ChatComponentText( - "Success! " + formattedUsernameSubject + " has joined " + formattedUsernameTeam + ".")); - sender.addChatMessage( - new ChatComponentText( - "To undo this simply join your own network again with /gt global_energy_join " - + formattedUsernameSubject - + " " - + formattedUsernameSubject - + ".")); - - } - case "global_energy_display" -> { - - // Usage is /gt global_energy_display username. - - String username = strings[1]; - String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET; - UUID userUUID = SpaceProjectManager.getPlayerUUIDFromName(username); - - if (!SpaceProjectManager.isInTeam(userUUID)) { - sender.addChatMessage( - new ChatComponentText("User " + formatted_username + " has no global energy network.")); - break; - } - UUID teamUUID = SpaceProjectManager.getLeader(userUUID); - - sender.addChatMessage( - new ChatComponentText( - "User " + formatted_username - + " has " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(getUserEU(userUUID)) - + EnumChatFormatting.RESET - + "EU in their network.")); - if (!userUUID.equals(teamUUID)) sender.addChatMessage( - new ChatComponentText( - "User " + formatted_username - + " is currently in network of " - + EnumChatFormatting.BLUE - + SpaceProjectManager.getPlayerNameFromUUID(teamUUID) - + EnumChatFormatting.RESET - + ".")); - - } - case "dump_music_durations" -> { - if (!FMLLaunchHandler.side() - .isClient()) { - sender - .addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "This command is client-only.")); - } - GT_MusicSystem.ClientSystem.dumpAllRecordDurations(); - } - default -> { - sender - .addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Invalid command/syntax detected.")); - printHelp(sender); - } - } - } -} diff --git a/src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java b/src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java deleted file mode 100644 index 9cf7fd7cf8..0000000000 --- a/src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java +++ /dev/null @@ -1,266 +0,0 @@ -package gregtech.common.misc; - -import static gregtech.api.enums.GT_Values.debugBlockMiner; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.FakePlayer; - -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_TileEntity_Ores; - -/** @author Relvl on 27.01.2022 */ -@SuppressWarnings("ObjectEquality") -public class GT_DrillingLogicDelegate { - - public static final ItemStack MINING_PIPE_STACK = GT_ModHandler.getIC2Item("miningPipe", 0); - public static final Block MINING_PIPE_BLOCK = GT_Utility.getBlockFromStack(MINING_PIPE_STACK); - public static final Block MINING_PIPE_TIP_BLOCK = GT_Utility - .getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 0)); - - /** The owner machine pointer */ - private final GT_IDrillingLogicDelegateOwner owner; - - /** Is pipe retracting process done and halts? */ - private boolean isRetractDone; - /** Is machine ran out of mining pipes in its inventory and halts? */ - private boolean isWaitingForPipeItem; - /** Pipe tip depth (relative to machine Y position, NEGATIVE). */ - private int tipDepth; - /** Cached fake player */ - private FakePlayer mFakePlayer; - - public GT_DrillingLogicDelegate(GT_IDrillingLogicDelegateOwner owner) { - this.owner = owner; - } - - /** Descents a pipe tip one plock deeper. */ - public boolean descent(IGregTechTileEntity te) { - if (!te.isAllowedToWork()) { - return false; - } - - int xCoord = te.getXCoord(); - int zCoord = te.getZCoord(); - int yCoord = te.getYCoord(); - int checkY = yCoord + tipDepth - 1; - boolean isHitsTheVoid = checkY < 0; - boolean isHitsBedrock = GT_Utility.getBlockHardnessAt(te.getWorld(), xCoord, checkY, zCoord) < 0; - boolean isFakePlayerAllowed = canFakePlayerInteract(te, xCoord, checkY, zCoord); - - if (isHitsTheVoid || isHitsBedrock || !isFakePlayerAllowed) { - // Disable and start retracting process. - te.disableWorking(); - if (debugBlockMiner) { - if (isHitsTheVoid) { - GT_Log.out.println("MINER: Hit bottom"); - } - if (isHitsBedrock) { - GT_Log.out.println("MINER: Hit block with -1 hardness"); - } - if (!isFakePlayerAllowed) { - GT_Log.out.println("MINER: Unable to set mining pipe tip"); - } - } - return false; - } - - // Replace the tip onto pipe - if (te.getBlockOffset(0, tipDepth, 0) == MINING_PIPE_TIP_BLOCK) { - te.getWorld() - .setBlock(xCoord, yCoord + tipDepth, zCoord, MINING_PIPE_BLOCK); - } - // Get and decrease pipe from the machine - boolean pipeTaken = owner.pullInputs(MINING_PIPE_STACK.getItem(), 1, false); - if (!pipeTaken) { - // If there was nothing - waiting for the pipes (just for prevent unnecessary checks) - isWaitingForPipeItem = true; - return false; - } - - // If there is something - mine it - Block block = te.getBlockOffset(0, tipDepth - 1, 0); - if (!block.isAir(te.getWorld(), xCoord, yCoord, zCoord)) { - mineBlock(te, block, xCoord, yCoord + tipDepth - 1, zCoord); - } - - // Descent the pipe tip - te.getWorld() - .setBlock(xCoord, yCoord + tipDepth - 1, zCoord, MINING_PIPE_TIP_BLOCK); - tipDepth--; - return true; - } - - public void onOwnerPostTick(IGregTechTileEntity te, long tick) { - // If the machine was disabled - try to retract pipe - if (!te.isAllowedToWork()) { - onPostTickRetract(te, tick); - return; - } - // If the machine was re-enabled - we should reset the retracting process - isRetractDone = false; - } - - /** If the machine are disabled - tried to retract pipe. */ - private void onPostTickRetract(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (isRetractDone) { - return; - } - // If retracting process just touch the miner - if (tipDepth == 0) { - isRetractDone = true; - return; - } - // Once per N ticks (depends on tier) - if ((aTick % (owner.getMachineSpeed() / 5)) != 0) { - return; - } - - // Check we can push pipe back to machine (inputs allowed for this case!) - boolean canPush = owner.pushOutputs(MINING_PIPE_STACK, 1, true, true); - if (!canPush) { - return; - } - - // Inspect target block - it should be a pipe tip, else something went wrong. - Block targetBlock = aBaseMetaTileEntity.getBlockOffset(0, tipDepth, 0); - if (targetBlock != MINING_PIPE_TIP_BLOCK && targetBlock != MINING_PIPE_BLOCK) { - return; - } - - // Retract the pipe/tip - int xCoord = aBaseMetaTileEntity.getXCoord(); - int yCoord = aBaseMetaTileEntity.getYCoord(); - int zCoord = aBaseMetaTileEntity.getZCoord(); - int actualDrillY = yCoord + tipDepth; - // Move the pipe tip position - if (actualDrillY < yCoord - 1) { - owner.getBaseMetaTileEntity() - .getWorld() - .setBlock(xCoord, actualDrillY + 1, zCoord, MINING_PIPE_TIP_BLOCK); - } - // Remove the old pipe tip - aBaseMetaTileEntity.getWorld() - .setBlock(xCoord, actualDrillY, zCoord, Blocks.air, 0, /* send to client without neighbour updates */ 2); - - // Return the pipe back to the machine (inputs allowed for this case!) - owner.pushOutputs(MINING_PIPE_STACK, 1, false, true); - - tipDepth++; - } - - /** Minings the block if it is possible. */ - public void mineBlock(IGregTechTileEntity te, Block block, int x, int y, int z) { - if (!GT_Utility.eraseBlockByFakePlayer(getFakePlayer(te), x, y, z, true)) { - return; - } - - List drops = getBlockDrops(block, x, y, z); - - boolean canFitDrops = true; - for (ItemStack drop : drops) { - canFitDrops &= owner.pushOutputs(drop, drop.stackSize, true, false); - } - if (!canFitDrops) { - return; - } - for (ItemStack drop : drops) { - owner.pushOutputs(drop, drop.stackSize, false, false); - } - - short metaData = 0; - TileEntity tTileEntity = owner.getBaseMetaTileEntity() - .getTileEntity(x, y, z); - if (tTileEntity instanceof GT_TileEntity_Ores) { - metaData = ((GT_TileEntity_Ores) tTileEntity).mMetaData; - } - - ItemStack cobble = GT_Utility.getCobbleForOre(block, metaData); - te.getWorld() - .setBlock( - x, - y, - z, - Block.getBlockFromItem(cobble.getItem()), - cobble.getItemDamage(), /* cause updates(1) + send to client(2) */ - 3); - } - - /** - * Returns NEGATIVE (eg -5) depth of current drilling Y world level. RELATIVELY TO MINER ENTITY! This means '(miner - * world Y) + depth = (actual world Y)'. - */ - public int getTipDepth() { - return tipDepth; - } - - /** Looking for the lowest continuous pipe. */ - public void findTipDepth() { - IGregTechTileEntity ownerTe = owner.getBaseMetaTileEntity(); - if (!ownerTe.isServerSide()) { - return; - } - while (true) { - Block block = ownerTe.getBlockOffset(0, tipDepth - 1, 0); - if (block != MINING_PIPE_BLOCK && block != MINING_PIPE_TIP_BLOCK) { - return; - } - tipDepth--; - } - } - - /** - * Creates and provides the Fake Player for owners. todo maybe will provide player owner uuid? im sure some servers - * not allow to fakers, in griefing reasons. - */ - public FakePlayer getFakePlayer(IGregTechTileEntity te) { - if (mFakePlayer == null) { - mFakePlayer = GT_Utility.getFakePlayer(te); - } - if (mFakePlayer != null) { - mFakePlayer.setWorld(te.getWorld()); - mFakePlayer.setPosition(te.getXCoord(), te.getYCoord(), te.getZCoord()); - } - return mFakePlayer; - } - - public boolean canFakePlayerInteract(IGregTechTileEntity te, int xCoord, int yCoord, int zCoord) { - return GT_Utility - .setBlockByFakePlayer(getFakePlayer(te), xCoord, yCoord, zCoord, MINING_PIPE_TIP_BLOCK, 0, true); - } - - /** Get target block drops. We need to encapsulate everyting of mining in this class. */ - private List getBlockDrops(final Block oreBlock, int posX, int posY, int posZ) { - return oreBlock.getDrops( - owner.getBaseMetaTileEntity() - .getWorld(), - posX, - posY, - posZ, - owner.getBaseMetaTileEntity() - .getMetaID(posX, posY, posZ), - owner.getMachineTier()); - } - - /** Can the owner continue doing its work? If we await new pipes - it cannot. */ - public boolean canContinueDrilling(long tick) { - if (isWaitingForPipeItem) { - if (tick % 5 != 0) { - return false; - } - boolean hasPipe = owner.pullInputs(MINING_PIPE_STACK.getItem(), 1, true); - if (hasPipe) { - isWaitingForPipeItem = false; - } - return hasPipe; - } - return true; - } -} diff --git a/src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java b/src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java deleted file mode 100644 index 9b10b6fcf0..0000000000 --- a/src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java +++ /dev/null @@ -1,22 +0,0 @@ -package gregtech.common.misc; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; - -/** @author Relvl on 27.01.2022 */ -public interface GT_IDrillingLogicDelegateOwner extends IMetaTileEntity { - - /** Returns the machine actual tier. */ - int getMachineTier(); - - /** Returns the machine current processing speed. */ - int getMachineSpeed(); - - /** Pulls (or check can pull) items from an input slots. */ - boolean pullInputs(Item item, int count, boolean simulate); - - /** Pushes (or check can push) item to output slots. */ - boolean pushOutputs(ItemStack stack, int count, boolean simulate, boolean allowInputSlots); -} diff --git a/src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java b/src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java index 33e8198bd6..f3efceafeb 100644 --- a/src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java +++ b/src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java @@ -37,10 +37,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import gregtech.api.enums.GT_Values; -import gregtech.api.util.GT_Utility; +import gregtech.api.enums.GTValues; +import gregtech.api.util.GTUtility; import gregtech.common.covers.CoverInfo; -import gregtech.common.covers.GT_Cover_Metrics_Transmitter; +import gregtech.common.covers.CoverMetricsTransmitter; import gregtech.common.events.MetricsCoverDataEvent; import gregtech.common.events.MetricsCoverHostDeconstructedEvent; import gregtech.common.events.MetricsCoverSelfDestructEvent; @@ -302,15 +302,15 @@ public class GlobalMetricsCoverDatabase extends WorldSavedData { private static Stream getCoverUUIDsFromItemStack(final ItemStack stack) { if (stack.hasTagCompound() && stack.getTagCompound() - .hasKey(GT_Values.NBT.COVERS, TAG_COMPOUND)) { + .hasKey(GTValues.NBT.COVERS, TAG_COMPOUND)) { final NBTTagList tagList = stack.getTagCompound() - .getTagList(GT_Values.NBT.COVERS, TAG_COMPOUND); + .getTagList(GTValues.NBT.COVERS, TAG_COMPOUND); return IntStream.range(0, tagList.tagCount()) .mapToObj(tagList::getCompoundTagAt) .map(nbt -> new CoverInfo(null, nbt).getCoverData()) .filter( - serializableObject -> serializableObject instanceof GT_Cover_Metrics_Transmitter.MetricsTransmitterData) - .map(data -> ((GT_Cover_Metrics_Transmitter.MetricsTransmitterData) data).getFrequency()); + serializableObject -> serializableObject instanceof CoverMetricsTransmitter.MetricsTransmitterData) + .map(data -> ((CoverMetricsTransmitter.MetricsTransmitterData) data).getFrequency()); } return Stream.empty(); } @@ -433,9 +433,9 @@ public class GlobalMetricsCoverDatabase extends WorldSavedData { public String getLocalizedCoordinates() { return StatCollector.translateToLocalFormatted( "gt.db.metrics_cover.coords", - GT_Utility.formatNumbers(x), - GT_Utility.formatNumbers(y), - GT_Utility.formatNumbers(z)); + GTUtility.formatNumbers(x), + GTUtility.formatNumbers(y), + GTUtility.formatNumbers(z)); } @Override diff --git a/src/main/java/gregtech/common/misc/IDrillingLogicDelegateOwner.java b/src/main/java/gregtech/common/misc/IDrillingLogicDelegateOwner.java new file mode 100644 index 0000000000..cd9a5f1621 --- /dev/null +++ b/src/main/java/gregtech/common/misc/IDrillingLogicDelegateOwner.java @@ -0,0 +1,22 @@ +package gregtech.common.misc; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; + +/** @author Relvl on 27.01.2022 */ +public interface IDrillingLogicDelegateOwner extends IMetaTileEntity { + + /** Returns the machine actual tier. */ + int getMachineTier(); + + /** Returns the machine current processing speed. */ + int getMachineSpeed(); + + /** Pulls (or check can pull) items from an input slots. */ + boolean pullInputs(Item item, int count, boolean simulate); + + /** Pushes (or check can push) item to output slots. */ + boolean pushOutputs(ItemStack stack, int count, boolean simulate, boolean allowInputSlots); +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java b/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java index 323b22e20a..a076a05c9a 100644 --- a/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java +++ b/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java @@ -12,7 +12,7 @@ import net.minecraftforge.fluids.FluidStack; import org.apache.commons.lang3.tuple.Pair; import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.common.misc.spaceprojects.interfaces.ISpaceBody; import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; @@ -187,7 +187,7 @@ public class SpaceProjectManager { // #region Project Helper methods - public static class FakeSpaceProjectRecipe extends GT_Recipe { + public static class FakeSpaceProjectRecipe extends GTRecipe { public final String projectName; diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SPRequirements.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SPRequirements.java new file mode 100644 index 0000000000..dc92d8bebf --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SPRequirements.java @@ -0,0 +1,74 @@ +package gregtech.common.misc.spaceprojects.base; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import gregtech.common.misc.spaceprojects.enums.SpaceBodyType; +import gregtech.common.misc.spaceprojects.enums.StarType; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Requirements; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade; + +/** + * @author BlueWeabo + */ +public class SPRequirements implements ISP_Requirements { + + // #region Variables + + protected SpaceBodyType spaceBody = SpaceBodyType.NONE; + protected StarType star = StarType.NotAStar; + protected List spaceProjects = new ArrayList<>(); + protected List upgrades = new ArrayList<>(); + + // #endregion + + // #region Getters + + @Override + public SpaceBodyType getBodyType() { + return spaceBody; + } + + @Override + public StarType getStarType() { + return star; + } + + @Override + public List getProjects() { + return spaceProjects; + } + + @Override + public List getUpgrades() { + return upgrades; + } + + // #endregion + + // #region Setters/Builder + + public SPRequirements setSpaceBodyType(SpaceBodyType spaceBodyType) { + spaceBody = spaceBodyType; + return this; + } + + public SPRequirements setStarType(StarType starType) { + star = starType; + return this; + } + + public SPRequirements setUpgrades(ISP_Upgrade... requirementUpgrades) { + upgrades.addAll(Arrays.asList(requirementUpgrades)); + return this; + } + + public SPRequirements setSpaceProjects(ISpaceProject... requirementProjects) { + spaceProjects.addAll(Arrays.asList(requirementProjects)); + return this; + } + + // #endregion +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SPUpgrade.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SPUpgrade.java new file mode 100644 index 0000000000..b07ff7905a --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SPUpgrade.java @@ -0,0 +1,362 @@ +package gregtech.common.misc.spaceprojects.base; + +import java.util.UUID; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.common.misc.spaceprojects.SpaceProjectManager; +import gregtech.common.misc.spaceprojects.enums.SpaceBodyType; +import gregtech.common.misc.spaceprojects.enums.UpgradeStatus; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade; + +/** + * @author BlueWeabo + */ +public class SPUpgrade implements ISP_Upgrade { + + // #region Variables + + protected String name; + protected String unlocalizedName; + protected ItemStack[] itemsCost; + protected FluidStack[] fluidsCost; + protected int totalStages; + protected int currentStage; + protected int buildTime; + protected long voltage; + protected SPRequirements requirements; + protected ISpaceProject projectBelongingTo; + + // #endregion + + // #region Getters + + @Override + public String getUpgradeName() { + return name; + } + + @Override + public String getUnlocalizedName() { + return unlocalizedName; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(unlocalizedName); + } + + @Override + public ItemStack[] getItemsCostPerStage() { + return itemsCost; + } + + @Override + public ItemStack getItemCostPerStage(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length) { + return null; + } + + return itemsCost[index]; + } + + @Override + public ItemStack[] getCurrentItemsProgress() { + ItemStack[] currentItemsProgress = new ItemStack[itemsCost.length]; + int index = 0; + for (ItemStack item : itemsCost) { + ItemStack copy = item.copy(); + copy.stackSize *= getCurrentStage(); + currentItemsProgress[index++] = copy; + } + + return currentItemsProgress; + } + + @Override + public ItemStack getCurrentItemProgress(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { + return null; + } + + ItemStack item = itemsCost[index].copy(); + item.stackSize *= getCurrentStage(); + return item; + } + + @Override + public ItemStack[] getTotalItemsCost() { + ItemStack[] totalItemsCost = new ItemStack[itemsCost.length]; + int index = 0; + for (ItemStack item : itemsCost) { + ItemStack copy = item.copy(); + copy.stackSize *= getTotalStages(); + totalItemsCost[index++] = copy; + } + + return totalItemsCost; + } + + @Override + public ItemStack getTotalItemCost(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { + return null; + } + + ItemStack item = itemsCost[index].copy(); + item.stackSize *= getTotalStages(); + return item; + } + + @Override + public FluidStack[] getFluidsCostPerStage() { + return fluidsCost; + } + + @Override + public FluidStack getFluidCostPerStage(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length) { + return null; + } + + return fluidsCost[index]; + } + + @Override + public FluidStack[] getCurrentFluidsProgress() { + if (fluidsCost == null) { + return null; + } + + FluidStack[] currentFluidsProgress = new FluidStack[fluidsCost.length]; + int index = 0; + for (FluidStack fluid : fluidsCost) { + FluidStack copy = fluid.copy(); + copy.amount *= getCurrentStage(); + currentFluidsProgress[index++] = copy; + } + + return currentFluidsProgress; + } + + @Override + public FluidStack getCurrentFluidProgress(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { + return null; + } + + FluidStack fluid = fluidsCost[index].copy(); + fluid.amount *= getCurrentStage(); + return fluid; + } + + @Override + public FluidStack[] getTotalFluidsCost() { + if (fluidsCost == null) { + return null; + } + + FluidStack[] totalFluidsCost = new FluidStack[fluidsCost.length]; + int index = 0; + for (FluidStack fluid : fluidsCost) { + FluidStack copy = fluid.copy(); + copy.amount *= getTotalStages(); + totalFluidsCost[index++] = copy; + } + + return totalFluidsCost; + } + + @Override + public FluidStack getTotalFluidCost(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { + return null; + } + + FluidStack fluid = fluidsCost[index].copy(); + fluid.amount *= getTotalStages(); + return fluid; + } + + @Override + public int getTotalStages() { + return totalStages; + } + + @Override + public int getUpgradeBuildTime() { + return buildTime; + } + + @Override + public int getCurrentStage() { + return currentStage; + } + + @Override + public float getCurrentProgress() { + return currentStage / totalStages * 100.0f; + } + + @Override + public long getVoltage() { + return voltage; + } + + @Override + public UpgradeStatus getStatus() { + if (requirements == null) { + return UpgradeStatus.Unlocked; + } + + if (isFinished()) { + return UpgradeStatus.Finished; + } + return UpgradeStatus.Locked; + } + + @Override + public SPRequirements getUpgradeRequirements() { + return requirements; + } + + @Override + public ISpaceProject getParentProject() { + return projectBelongingTo; + } + + // #endregion + + // #region Setter/Builder + + public SPUpgrade() {} + + public SPUpgrade setUpgradeName(String upgradeName) { + name = upgradeName; + return this; + } + + public SPUpgrade setUpgradeUnlocalizedName(String upgradeUnlocalizedName) { + unlocalizedName = upgradeUnlocalizedName; + return this; + } + + public SPUpgrade setUpgradeItemsCost(ItemStack... upgradeItemsCost) { + itemsCost = upgradeItemsCost; + return this; + } + + public SPUpgrade setUpgradeFluidsCost(FluidStack... upgradeFluidsCost) { + fluidsCost = upgradeFluidsCost; + return this; + } + + public SPUpgrade setUpgradeRequirements(SPRequirements upgradeRequirements) { + requirements = upgradeRequirements; + return this; + } + + public SPUpgrade setUpgradeTotalStages(int upgradeTotalStages) { + totalStages = upgradeTotalStages; + return this; + } + + public SPUpgrade setUpgradeBuildTime(int upgradeBuildTime) { + buildTime = upgradeBuildTime; + return this; + } + + public SPUpgrade setUpgradeVoltage(long upgradeVoltage) { + voltage = upgradeVoltage; + return this; + } + + @Override + public void setUpgradeProject(ISpaceProject project) { + projectBelongingTo = project; + } + + @Override + public void setUpgradeCurrentStage(int stage) { + currentStage = stage; + } + + // #endregion + + // #region Other + + @Override + public boolean meetsRequirements(UUID aTeam) { + if (requirements == null) { + return true; + } + + if (requirements.getBodyType() != null && !requirements.getBodyType() + .equals(SpaceBodyType.NONE)) { + if (!requirements.getBodyType() + .equals( + projectBelongingTo.getProjectLocation() + .getType())) { + return false; + } + } + + if (requirements.getStarType() != null) { + if (!requirements.getStarType() + .equals( + projectBelongingTo.getProjectLocation() + .getStarType())) { + return false; + } + } + + if (requirements.getProjects() != null) { + for (ISpaceProject tProject : requirements.getProjects()) { + if (!SpaceProjectManager.teamHasProject(aTeam, tProject)) { + return false; + } + } + } + + if (requirements.getUpgrades() != null) { + for (ISP_Upgrade upgrade : requirements.getUpgrades()) { + if (!projectBelongingTo.hasUpgrade(upgrade.getUpgradeName())) { + return false; + } + } + } + + return true; + } + + @Override + public SPUpgrade copy() { + return new SPUpgrade().setUpgradeName(name) + .setUpgradeUnlocalizedName(unlocalizedName) + .setUpgradeBuildTime(buildTime) + .setUpgradeFluidsCost(fluidsCost) + .setUpgradeItemsCost(itemsCost) + .setUpgradeRequirements(requirements) + .setUpgradeTotalStages(totalStages) + .setUpgradeVoltage(voltage); + } + + @Override + public void goToNextStage() { + currentStage++; + if (isFinished()) { + projectBelongingTo.setBuiltUpgrade(this); + } + } + + @Override + public boolean isFinished() { + return currentStage == totalStages; + } + + // #endregion + +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java deleted file mode 100644 index b910b5e344..0000000000 --- a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java +++ /dev/null @@ -1,74 +0,0 @@ -package gregtech.common.misc.spaceprojects.base; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import gregtech.common.misc.spaceprojects.enums.SpaceBodyType; -import gregtech.common.misc.spaceprojects.enums.StarType; -import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; -import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Requirements; -import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade; - -/** - * @author BlueWeabo - */ -public class SP_Requirements implements ISP_Requirements { - - // #region Variables - - protected SpaceBodyType spaceBody = SpaceBodyType.NONE; - protected StarType star = StarType.NotAStar; - protected List spaceProjects = new ArrayList<>(); - protected List upgrades = new ArrayList<>(); - - // #endregion - - // #region Getters - - @Override - public SpaceBodyType getBodyType() { - return spaceBody; - } - - @Override - public StarType getStarType() { - return star; - } - - @Override - public List getProjects() { - return spaceProjects; - } - - @Override - public List getUpgrades() { - return upgrades; - } - - // #endregion - - // #region Setters/Builder - - public SP_Requirements setSpaceBodyType(SpaceBodyType spaceBodyType) { - spaceBody = spaceBodyType; - return this; - } - - public SP_Requirements setStarType(StarType starType) { - star = starType; - return this; - } - - public SP_Requirements setUpgrades(ISP_Upgrade... requirementUpgrades) { - upgrades.addAll(Arrays.asList(requirementUpgrades)); - return this; - } - - public SP_Requirements setSpaceProjects(ISpaceProject... requirementProjects) { - spaceProjects.addAll(Arrays.asList(requirementProjects)); - return this; - } - - // #endregion -} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java deleted file mode 100644 index 835a57f277..0000000000 --- a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java +++ /dev/null @@ -1,362 +0,0 @@ -package gregtech.common.misc.spaceprojects.base; - -import java.util.UUID; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.common.misc.spaceprojects.SpaceProjectManager; -import gregtech.common.misc.spaceprojects.enums.SpaceBodyType; -import gregtech.common.misc.spaceprojects.enums.UpgradeStatus; -import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; -import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade; - -/** - * @author BlueWeabo - */ -public class SP_Upgrade implements ISP_Upgrade { - - // #region Variables - - protected String name; - protected String unlocalizedName; - protected ItemStack[] itemsCost; - protected FluidStack[] fluidsCost; - protected int totalStages; - protected int currentStage; - protected int buildTime; - protected long voltage; - protected SP_Requirements requirements; - protected ISpaceProject projectBelongingTo; - - // #endregion - - // #region Getters - - @Override - public String getUpgradeName() { - return name; - } - - @Override - public String getUnlocalizedName() { - return unlocalizedName; - } - - @Override - public String getLocalizedName() { - return StatCollector.translateToLocal(unlocalizedName); - } - - @Override - public ItemStack[] getItemsCostPerStage() { - return itemsCost; - } - - @Override - public ItemStack getItemCostPerStage(int index) { - if (itemsCost == null || index < 0 || index >= itemsCost.length) { - return null; - } - - return itemsCost[index]; - } - - @Override - public ItemStack[] getCurrentItemsProgress() { - ItemStack[] currentItemsProgress = new ItemStack[itemsCost.length]; - int index = 0; - for (ItemStack item : itemsCost) { - ItemStack copy = item.copy(); - copy.stackSize *= getCurrentStage(); - currentItemsProgress[index++] = copy; - } - - return currentItemsProgress; - } - - @Override - public ItemStack getCurrentItemProgress(int index) { - if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { - return null; - } - - ItemStack item = itemsCost[index].copy(); - item.stackSize *= getCurrentStage(); - return item; - } - - @Override - public ItemStack[] getTotalItemsCost() { - ItemStack[] totalItemsCost = new ItemStack[itemsCost.length]; - int index = 0; - for (ItemStack item : itemsCost) { - ItemStack copy = item.copy(); - copy.stackSize *= getTotalStages(); - totalItemsCost[index++] = copy; - } - - return totalItemsCost; - } - - @Override - public ItemStack getTotalItemCost(int index) { - if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { - return null; - } - - ItemStack item = itemsCost[index].copy(); - item.stackSize *= getTotalStages(); - return item; - } - - @Override - public FluidStack[] getFluidsCostPerStage() { - return fluidsCost; - } - - @Override - public FluidStack getFluidCostPerStage(int index) { - if (fluidsCost == null || index < 0 || index >= fluidsCost.length) { - return null; - } - - return fluidsCost[index]; - } - - @Override - public FluidStack[] getCurrentFluidsProgress() { - if (fluidsCost == null) { - return null; - } - - FluidStack[] currentFluidsProgress = new FluidStack[fluidsCost.length]; - int index = 0; - for (FluidStack fluid : fluidsCost) { - FluidStack copy = fluid.copy(); - copy.amount *= getCurrentStage(); - currentFluidsProgress[index++] = copy; - } - - return currentFluidsProgress; - } - - @Override - public FluidStack getCurrentFluidProgress(int index) { - if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { - return null; - } - - FluidStack fluid = fluidsCost[index].copy(); - fluid.amount *= getCurrentStage(); - return fluid; - } - - @Override - public FluidStack[] getTotalFluidsCost() { - if (fluidsCost == null) { - return null; - } - - FluidStack[] totalFluidsCost = new FluidStack[fluidsCost.length]; - int index = 0; - for (FluidStack fluid : fluidsCost) { - FluidStack copy = fluid.copy(); - copy.amount *= getTotalStages(); - totalFluidsCost[index++] = copy; - } - - return totalFluidsCost; - } - - @Override - public FluidStack getTotalFluidCost(int index) { - if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { - return null; - } - - FluidStack fluid = fluidsCost[index].copy(); - fluid.amount *= getTotalStages(); - return fluid; - } - - @Override - public int getTotalStages() { - return totalStages; - } - - @Override - public int getUpgradeBuildTime() { - return buildTime; - } - - @Override - public int getCurrentStage() { - return currentStage; - } - - @Override - public float getCurrentProgress() { - return currentStage / totalStages * 100.0f; - } - - @Override - public long getVoltage() { - return voltage; - } - - @Override - public UpgradeStatus getStatus() { - if (requirements == null) { - return UpgradeStatus.Unlocked; - } - - if (isFinished()) { - return UpgradeStatus.Finished; - } - return UpgradeStatus.Locked; - } - - @Override - public SP_Requirements getUpgradeRequirements() { - return requirements; - } - - @Override - public ISpaceProject getParentProject() { - return projectBelongingTo; - } - - // #endregion - - // #region Setter/Builder - - public SP_Upgrade() {} - - public SP_Upgrade setUpgradeName(String upgradeName) { - name = upgradeName; - return this; - } - - public SP_Upgrade setUpgradeUnlocalizedName(String upgradeUnlocalizedName) { - unlocalizedName = upgradeUnlocalizedName; - return this; - } - - public SP_Upgrade setUpgradeItemsCost(ItemStack... upgradeItemsCost) { - itemsCost = upgradeItemsCost; - return this; - } - - public SP_Upgrade setUpgradeFluidsCost(FluidStack... upgradeFluidsCost) { - fluidsCost = upgradeFluidsCost; - return this; - } - - public SP_Upgrade setUpgradeRequirements(SP_Requirements upgradeRequirements) { - requirements = upgradeRequirements; - return this; - } - - public SP_Upgrade setUpgradeTotalStages(int upgradeTotalStages) { - totalStages = upgradeTotalStages; - return this; - } - - public SP_Upgrade setUpgradeBuildTime(int upgradeBuildTime) { - buildTime = upgradeBuildTime; - return this; - } - - public SP_Upgrade setUpgradeVoltage(long upgradeVoltage) { - voltage = upgradeVoltage; - return this; - } - - @Override - public void setUpgradeProject(ISpaceProject project) { - projectBelongingTo = project; - } - - @Override - public void setUpgradeCurrentStage(int stage) { - currentStage = stage; - } - - // #endregion - - // #region Other - - @Override - public boolean meetsRequirements(UUID aTeam) { - if (requirements == null) { - return true; - } - - if (requirements.getBodyType() != null && !requirements.getBodyType() - .equals(SpaceBodyType.NONE)) { - if (!requirements.getBodyType() - .equals( - projectBelongingTo.getProjectLocation() - .getType())) { - return false; - } - } - - if (requirements.getStarType() != null) { - if (!requirements.getStarType() - .equals( - projectBelongingTo.getProjectLocation() - .getStarType())) { - return false; - } - } - - if (requirements.getProjects() != null) { - for (ISpaceProject tProject : requirements.getProjects()) { - if (!SpaceProjectManager.teamHasProject(aTeam, tProject)) { - return false; - } - } - } - - if (requirements.getUpgrades() != null) { - for (ISP_Upgrade upgrade : requirements.getUpgrades()) { - if (!projectBelongingTo.hasUpgrade(upgrade.getUpgradeName())) { - return false; - } - } - } - - return true; - } - - @Override - public SP_Upgrade copy() { - return new SP_Upgrade().setUpgradeName(name) - .setUpgradeUnlocalizedName(unlocalizedName) - .setUpgradeBuildTime(buildTime) - .setUpgradeFluidsCost(fluidsCost) - .setUpgradeItemsCost(itemsCost) - .setUpgradeRequirements(requirements) - .setUpgradeTotalStages(totalStages) - .setUpgradeVoltage(voltage); - } - - @Override - public void goToNextStage() { - currentStage++; - if (isFinished()) { - projectBelongingTo.setBuiltUpgrade(this); - } - } - - @Override - public boolean isFinished() { - return currentStage == totalStages; - } - - // #endregion - -} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java index 201b7c27a9..d682dd6c01 100644 --- a/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java +++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java @@ -378,7 +378,7 @@ public class SpaceProject implements ISpaceProject { .setProjectTexture(texture) .setProjectRequirements(requirements); if (upgradesAvailable != null) { - ISP_Upgrade[] upgrades = new SP_Upgrade[upgradesAvailable.size()]; + ISP_Upgrade[] upgrades = new SPUpgrade[upgradesAvailable.size()]; int index = 0; for (ISP_Upgrade upgrade : upgradesAvailable.values()) { upgrades[index++] = upgrade.copy(); diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SPCommand.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SPCommand.java new file mode 100644 index 0000000000..39332818fe --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/commands/SPCommand.java @@ -0,0 +1,166 @@ +package gregtech.common.misc.spaceprojects.commands; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.WeakHashMap; +import java.util.stream.Collectors; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.EnumChatFormatting; + +import org.apache.commons.lang3.tuple.Pair; + +import gregtech.api.util.GTUtility; +import gregtech.common.misc.spaceprojects.SpaceProjectManager; + +/** + * @author BlueWeabo + */ +public class SPCommand extends CommandBase { + + private static final Set> invite = Collections + .newSetFromMap(new WeakHashMap<>()); + private static final Set confirm = Collections.newSetFromMap(new WeakHashMap<>()); + + private static final String INVITE = "invite"; + private static final String ACCEPT = "accept"; + private static final String LEAVE = "leave"; + private static final String CONFIRM = "confirm"; + + @Override + public String getCommandName() { + return "sp"; + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/" + getCommandName() + " [PlayerName]"; + } + + @Override + public void processCommand(ICommandSender sender, String[] arguments) { + if (arguments.length < 1) { + return; + } + switch (arguments[0]) { + case INVITE -> { + if (arguments.length < 2) { + return; + } + processInvite(sender, arguments[1]); + } + case ACCEPT -> { + if (arguments.length < 2) { + return; + } + processAccept(sender, arguments[1]); + } + case LEAVE -> processLeave(sender); + case CONFIRM -> processConfirm(sender); + } + } + + private void processInvite(ICommandSender sender, String playerInvited) { + EntityPlayerMP teamLeader = getCommandSenderAsPlayer(sender); + EntityPlayerMP teamMember = getPlayer(sender, playerInvited); + invite.add(Pair.of(teamMember, teamLeader)); + String message = EnumChatFormatting.GOLD + teamLeader.getCommandSenderName() + + EnumChatFormatting.RESET + + " has sent you an invite to join their team. Accept it with" + + EnumChatFormatting.GOLD + + " /sp accept " + + teamLeader.getCommandSenderName(); + GTUtility.sendChatToPlayer(teamMember, message); + } + + private void processAccept(ICommandSender sender, String playerInviter) { + EntityPlayerMP teamMember = getCommandSenderAsPlayer(sender); + EntityPlayerMP teamLeader = getPlayer(sender, playerInviter); + if (invite.contains(Pair.of(teamMember, teamLeader))) { + String message = EnumChatFormatting.GOLD + teamMember.getCommandSenderName() + + EnumChatFormatting.RESET + + " has accepted the invite."; + SpaceProjectManager.putInTeam(teamMember.getUniqueID(), teamLeader.getUniqueID()); + GTUtility.sendChatToPlayer(teamLeader, message); + invite.remove(Pair.of(teamMember, teamLeader)); + } + } + + private void processLeave(ICommandSender sender) { + EntityPlayerMP player = getCommandSenderAsPlayer(sender); + String message = "Are you sure you want to leave the team. You will lose all progress. Use " + + EnumChatFormatting.GOLD + + "/sp confirm" + + EnumChatFormatting.RESET + + " to confirm this. This does nothing if you are the team leader."; + GTUtility.sendChatToPlayer(player, message); + confirm.add(player); + } + + private void processConfirm(ICommandSender sender) { + EntityPlayerMP player = getCommandSenderAsPlayer(sender); + if (confirm.contains(player)) { + String message = "Successfully left the team."; + SpaceProjectManager.putInTeam(player.getUniqueID(), player.getUniqueID()); + GTUtility.sendChatToPlayer(player, message); + confirm.remove(player); + } + } + + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] arguments) { + List autoComplete = new ArrayList<>(); + String filter = arguments.length == 0 ? "" : arguments[0].trim(); + switch (arguments.length) { + case 1 -> autoComplete.addAll(Arrays.asList(getSubCommands())); + case 2 -> { + filter = arguments[1].trim(); + if (arguments[0].equals(INVITE)) { + autoComplete.addAll(Arrays.asList(getPlayers())); + break; + } + + if (arguments[0].equals(CONFIRM)) { + Optional> pairOpt = invite.stream() + .filter( + (e) -> e.getKey() + .getUniqueID() == getCommandSenderAsPlayer(sender).getUniqueID()) + .findFirst(); + if (pairOpt.isPresent()) { + autoComplete.add( + SpaceProjectManager.getPlayerNameFromUUID( + pairOpt.get() + .getRight() + .getUniqueID())); + } + } + } + } + String finalFilter = filter; + return autoComplete.stream() + .filter(s -> finalFilter.isEmpty() || s.startsWith(finalFilter)) + .collect(Collectors.toList()); + } + + private String[] getPlayers() { + return MinecraftServer.getServer() + .getAllUsernames(); + } + + private String[] getSubCommands() { + return new String[] { INVITE, ACCEPT, LEAVE, CONFIRM }; + } + +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SPMCommand.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SPMCommand.java new file mode 100644 index 0000000000..8379162f84 --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/commands/SPMCommand.java @@ -0,0 +1,288 @@ +package gregtech.common.misc.spaceprojects.commands; + +import static gregtech.common.misc.spaceprojects.SpaceProjectManager.getLocation; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ChatComponentText; + +import gregtech.common.misc.spaceprojects.SpaceProjectManager; +import gregtech.common.misc.spaceprojects.SpaceProjectWorldSavedData; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; + +/** + * @author BlueWeabo + */ +public class SPMCommand extends CommandBase { + + private static final String RESET = "reset"; + private static final String UNLOCK = "unlock"; + private static final String UNLOCK_UPGRADE = "unlock_upgrade"; + private static final String LOCK = "lock"; + private static final String LIST = "list"; + private static final String ALL = "-all"; + private static final String AVAILABLE = "-available"; + private static final String UNLOCKED = "-unlocked"; + private static final String COPY = "copy"; + + @Override + public String getCommandName() { + return "spm"; + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/" + this.getCommandName() + " . Available subCommands: reset, unlock, lock, list, copy"; + } + + @Override + public void processCommand(ICommandSender sender, String[] arguments) { + if (arguments.length < 1) { + printHelp(sender); + return; + } + switch (arguments[0]) { + case RESET: + if (!sender.canCommandSenderUseCommand(4, getCommandName())) { + sender.addChatMessage( + new ChatComponentText("You don't have the permissions to execute this command")); + return; + } + processReset(sender, arguments.length >= 2 ? arguments[1] : sender.getCommandSenderName()); + break; + case UNLOCK: + if (!sender.canCommandSenderUseCommand(4, getCommandName())) { + sender.addChatMessage( + new ChatComponentText("You don't have the permissions to execute this command")); + return; + } + if (arguments.length < 3) { + sender.addChatMessage( + new ChatComponentText("Not enough arguments. Needs to mention a project and a location")); + return; + } + processUnlock( + sender, + arguments[1], + arguments[2], + arguments.length >= 4 ? arguments[3] : sender.getCommandSenderName()); + break; + case UNLOCK_UPGRADE: + if (!sender.canCommandSenderUseCommand(4, getCommandName())) { + sender.addChatMessage( + new ChatComponentText("You don't have the permissions to execute this command")); + return; + } + if (arguments.length < 4) { + sender.addChatMessage( + new ChatComponentText( + "Not enough arguments. Needs to mention a project a location and an upgrade name")); + return; + } + processUnlock( + sender, + arguments[1], + arguments[2], + arguments[3], + arguments.length >= 5 ? arguments[4] : sender.getCommandSenderName()); + break; + case LOCK: + if (!sender.canCommandSenderUseCommand(4, getCommandName())) { + sender.addChatMessage( + new ChatComponentText("You don't have the permissions to execute this command")); + return; + } + if (arguments.length < 3) { + sender.addChatMessage( + new ChatComponentText("Not enough arguments. Needs to mention a project and a location")); + return; + } + processLock( + sender, + arguments[1], + arguments[2], + arguments.length >= 4 ? arguments[3] : sender.getCommandSenderName()); + case LIST: + if (arguments.length < 2) { + sender.addChatMessage( + new ChatComponentText( + "No Argument for list subCommand. Usage /spm list -all, -available or -unlocked")); + return; + } + processList(sender, arguments[1], arguments.length >= 3 ? arguments[2] : sender.getCommandSenderName()); + break; + case COPY: + if (!sender.canCommandSenderUseCommand(4, getCommandName())) { + sender.addChatMessage( + new ChatComponentText("You don't have the permissions to execute this command")); + return; + } + if (arguments.length < 3) { + sender.addChatMessage(new ChatComponentText("Not enough arguments. Needs to mention 2 players")); + return; + } + processCopy(sender, arguments[1], arguments[2]); + break; + } + } + + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] arguments) { + List autoComplete = new ArrayList<>(); + String filter = arguments.length == 0 ? "" : arguments[0].trim(); + switch (arguments.length) { + case 1 -> autoComplete.addAll(Arrays.asList(getSubCommands())); + case 2 -> { + filter = arguments[1].trim(); + if (arguments[0].equals(LIST)) { + autoComplete.addAll(Arrays.asList(getListArguments())); + } else if (arguments[0].equals(COPY) || arguments[0].equals(RESET)) { + autoComplete.addAll(Arrays.asList(getPlayers())); + } else { + autoComplete.addAll(Arrays.asList(getProjects())); + } + } + case 3 -> { + filter = arguments[2].trim(); + if (arguments[1].equals(ALL)) {} else if (arguments[0].equals(LIST)) { + autoComplete.addAll(Arrays.asList(getPlayers())); + } else { + autoComplete.addAll(Arrays.asList(getLocations())); + } + } + case 4 -> { + filter = arguments[3].trim(); + if (arguments[0].equals(UNLOCK_UPGRADE)) { + ISpaceProject project = SpaceProjectManager.getProject(arguments[2]); + if (project != null) { + autoComplete.addAll( + project.getAllUpgrades() + .stream() + .map(ISpaceProject.ISP_Upgrade::getUnlocalizedName) + .collect(Collectors.toList())); + } + } else { + autoComplete.addAll(Arrays.asList(getPlayers())); + } + } + } + String finalFilter = filter; + return autoComplete.stream() + .filter(s -> finalFilter.isEmpty() || s.startsWith(finalFilter)) + .collect(Collectors.toList()); + } + + private String[] getPlayers() { + return MinecraftServer.getServer() + .getAllUsernames(); + } + + private String[] getLocations() { + return SpaceProjectManager.getLocationNames() + .toArray(new String[0]); + } + + private String[] getProjects() { + return SpaceProjectManager.getProjectsMap() + .keySet() + .toArray(new String[0]); + } + + private String[] getSubCommands() { + return new String[] { RESET, COPY, UNLOCK, UNLOCK_UPGRADE, LOCK, LIST }; + } + + private String[] getListArguments() { + return new String[] { ALL, AVAILABLE, UNLOCKED }; + } + + private void processReset(ICommandSender sender, String playerName) { + UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); + SpaceProjectManager.spaceTeamProjects.put(tID, null); + SpaceProjectWorldSavedData.INSTANCE.markDirty(); + sender.addChatMessage(new ChatComponentText("Cleared away map")); + } + + private void processLock(ICommandSender sender, String projectName, String location, String playerName) { + UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); + SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, null); + sender.addChatMessage(new ChatComponentText("Project locked")); + } + + private void processUnlock(ICommandSender sender, String projectName, String location, String playerName) { + UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); + ISpaceProject tProject = SpaceProjectManager.getTeamProjectOrCopy(tID, projectName, getLocation(location)); + if (tProject != null) { + tProject.setProjectCurrentStage(tProject.getTotalStages()); + SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, tProject); + sender.addChatMessage(new ChatComponentText("Project unlocked")); + } else { + sender.addChatMessage(new ChatComponentText("Incorrect internal project name. Try again")); + } + } + + private void processUnlock(ICommandSender sender, String projectName, String location, String upgradeName, + String playerName) { + UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); + ISpaceProject tProject = SpaceProjectManager.getTeamProjectOrCopy(tID, projectName, getLocation(location)); + if (tProject != null) { + ISpaceProject.ISP_Upgrade upgrade = tProject.getUpgrade(upgradeName); + if (upgrade == null) { + sender.addChatMessage(new ChatComponentText("Incorrect internal project upgrade name. Try again")); + return; + } + if (!tProject.isFinished()) { + tProject.setProjectCurrentStage(tProject.getTotalStages()); + SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, tProject); + } + tProject.setBuiltUpgrade(upgrade); + sender.addChatMessage(new ChatComponentText("Project Upgrade unlocked")); + } else { + sender.addChatMessage(new ChatComponentText("Incorrect internal project name. Try again")); + } + } + + private void processList(ICommandSender sender, String argument, String playerName) { + UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); + switch (argument) { + case ALL -> { + for (String project : SpaceProjectManager.getProjectsMap() + .keySet()) { + sender.addChatMessage(new ChatComponentText(project)); + } + } + case AVAILABLE -> { + for (ISpaceProject project : SpaceProjectManager.getAllProjects()) { + if (project.meetsRequirements(tID, false)) { + sender.addChatMessage(new ChatComponentText(project.getProjectName())); + } + } + } + case UNLOCKED -> { + for (ISpaceProject project : SpaceProjectManager.getTeamSpaceProjects(tID)) { + sender.addChatMessage(new ChatComponentText(project.getProjectName())); + } + } + } + } + + private void processCopy(ICommandSender sender, String playerToCopyFrom, String playerCopyingTo) { + // This will take a while + } + + private void printHelp(ICommandSender sender) { + + } +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java deleted file mode 100644 index 896c7e1052..0000000000 --- a/src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java +++ /dev/null @@ -1,288 +0,0 @@ -package gregtech.common.misc.spaceprojects.commands; - -import static gregtech.common.misc.spaceprojects.SpaceProjectManager.getLocation; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.ChatComponentText; - -import gregtech.common.misc.spaceprojects.SpaceProjectManager; -import gregtech.common.misc.spaceprojects.SpaceProjectWorldSavedData; -import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; - -/** - * @author BlueWeabo - */ -public class SPM_Command extends CommandBase { - - private static final String RESET = "reset"; - private static final String UNLOCK = "unlock"; - private static final String UNLOCK_UPGRADE = "unlock_upgrade"; - private static final String LOCK = "lock"; - private static final String LIST = "list"; - private static final String ALL = "-all"; - private static final String AVAILABLE = "-available"; - private static final String UNLOCKED = "-unlocked"; - private static final String COPY = "copy"; - - @Override - public String getCommandName() { - return "spm"; - } - - @Override - public int getRequiredPermissionLevel() { - return 0; - } - - @Override - public String getCommandUsage(ICommandSender sender) { - return "/" + this.getCommandName() + " . Available subCommands: reset, unlock, lock, list, copy"; - } - - @Override - public void processCommand(ICommandSender sender, String[] arguments) { - if (arguments.length < 1) { - printHelp(sender); - return; - } - switch (arguments[0]) { - case RESET: - if (!sender.canCommandSenderUseCommand(4, getCommandName())) { - sender.addChatMessage( - new ChatComponentText("You don't have the permissions to execute this command")); - return; - } - processReset(sender, arguments.length >= 2 ? arguments[1] : sender.getCommandSenderName()); - break; - case UNLOCK: - if (!sender.canCommandSenderUseCommand(4, getCommandName())) { - sender.addChatMessage( - new ChatComponentText("You don't have the permissions to execute this command")); - return; - } - if (arguments.length < 3) { - sender.addChatMessage( - new ChatComponentText("Not enough arguments. Needs to mention a project and a location")); - return; - } - processUnlock( - sender, - arguments[1], - arguments[2], - arguments.length >= 4 ? arguments[3] : sender.getCommandSenderName()); - break; - case UNLOCK_UPGRADE: - if (!sender.canCommandSenderUseCommand(4, getCommandName())) { - sender.addChatMessage( - new ChatComponentText("You don't have the permissions to execute this command")); - return; - } - if (arguments.length < 4) { - sender.addChatMessage( - new ChatComponentText( - "Not enough arguments. Needs to mention a project a location and an upgrade name")); - return; - } - processUnlock( - sender, - arguments[1], - arguments[2], - arguments[3], - arguments.length >= 5 ? arguments[4] : sender.getCommandSenderName()); - break; - case LOCK: - if (!sender.canCommandSenderUseCommand(4, getCommandName())) { - sender.addChatMessage( - new ChatComponentText("You don't have the permissions to execute this command")); - return; - } - if (arguments.length < 3) { - sender.addChatMessage( - new ChatComponentText("Not enough arguments. Needs to mention a project and a location")); - return; - } - processLock( - sender, - arguments[1], - arguments[2], - arguments.length >= 4 ? arguments[3] : sender.getCommandSenderName()); - case LIST: - if (arguments.length < 2) { - sender.addChatMessage( - new ChatComponentText( - "No Argument for list subCommand. Usage /spm list -all, -available or -unlocked")); - return; - } - processList(sender, arguments[1], arguments.length >= 3 ? arguments[2] : sender.getCommandSenderName()); - break; - case COPY: - if (!sender.canCommandSenderUseCommand(4, getCommandName())) { - sender.addChatMessage( - new ChatComponentText("You don't have the permissions to execute this command")); - return; - } - if (arguments.length < 3) { - sender.addChatMessage(new ChatComponentText("Not enough arguments. Needs to mention 2 players")); - return; - } - processCopy(sender, arguments[1], arguments[2]); - break; - } - } - - @Override - public List addTabCompletionOptions(ICommandSender sender, String[] arguments) { - List autoComplete = new ArrayList<>(); - String filter = arguments.length == 0 ? "" : arguments[0].trim(); - switch (arguments.length) { - case 1 -> autoComplete.addAll(Arrays.asList(getSubCommands())); - case 2 -> { - filter = arguments[1].trim(); - if (arguments[0].equals(LIST)) { - autoComplete.addAll(Arrays.asList(getListArguments())); - } else if (arguments[0].equals(COPY) || arguments[0].equals(RESET)) { - autoComplete.addAll(Arrays.asList(getPlayers())); - } else { - autoComplete.addAll(Arrays.asList(getProjects())); - } - } - case 3 -> { - filter = arguments[2].trim(); - if (arguments[1].equals(ALL)) {} else if (arguments[0].equals(LIST)) { - autoComplete.addAll(Arrays.asList(getPlayers())); - } else { - autoComplete.addAll(Arrays.asList(getLocations())); - } - } - case 4 -> { - filter = arguments[3].trim(); - if (arguments[0].equals(UNLOCK_UPGRADE)) { - ISpaceProject project = SpaceProjectManager.getProject(arguments[2]); - if (project != null) { - autoComplete.addAll( - project.getAllUpgrades() - .stream() - .map(ISpaceProject.ISP_Upgrade::getUnlocalizedName) - .collect(Collectors.toList())); - } - } else { - autoComplete.addAll(Arrays.asList(getPlayers())); - } - } - } - String finalFilter = filter; - return autoComplete.stream() - .filter(s -> finalFilter.isEmpty() || s.startsWith(finalFilter)) - .collect(Collectors.toList()); - } - - private String[] getPlayers() { - return MinecraftServer.getServer() - .getAllUsernames(); - } - - private String[] getLocations() { - return SpaceProjectManager.getLocationNames() - .toArray(new String[0]); - } - - private String[] getProjects() { - return SpaceProjectManager.getProjectsMap() - .keySet() - .toArray(new String[0]); - } - - private String[] getSubCommands() { - return new String[] { RESET, COPY, UNLOCK, UNLOCK_UPGRADE, LOCK, LIST }; - } - - private String[] getListArguments() { - return new String[] { ALL, AVAILABLE, UNLOCKED }; - } - - private void processReset(ICommandSender sender, String playerName) { - UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); - SpaceProjectManager.spaceTeamProjects.put(tID, null); - SpaceProjectWorldSavedData.INSTANCE.markDirty(); - sender.addChatMessage(new ChatComponentText("Cleared away map")); - } - - private void processLock(ICommandSender sender, String projectName, String location, String playerName) { - UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); - SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, null); - sender.addChatMessage(new ChatComponentText("Project locked")); - } - - private void processUnlock(ICommandSender sender, String projectName, String location, String playerName) { - UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); - ISpaceProject tProject = SpaceProjectManager.getTeamProjectOrCopy(tID, projectName, getLocation(location)); - if (tProject != null) { - tProject.setProjectCurrentStage(tProject.getTotalStages()); - SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, tProject); - sender.addChatMessage(new ChatComponentText("Project unlocked")); - } else { - sender.addChatMessage(new ChatComponentText("Incorrect internal project name. Try again")); - } - } - - private void processUnlock(ICommandSender sender, String projectName, String location, String upgradeName, - String playerName) { - UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); - ISpaceProject tProject = SpaceProjectManager.getTeamProjectOrCopy(tID, projectName, getLocation(location)); - if (tProject != null) { - ISpaceProject.ISP_Upgrade upgrade = tProject.getUpgrade(upgradeName); - if (upgrade == null) { - sender.addChatMessage(new ChatComponentText("Incorrect internal project upgrade name. Try again")); - return; - } - if (!tProject.isFinished()) { - tProject.setProjectCurrentStage(tProject.getTotalStages()); - SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, tProject); - } - tProject.setBuiltUpgrade(upgrade); - sender.addChatMessage(new ChatComponentText("Project Upgrade unlocked")); - } else { - sender.addChatMessage(new ChatComponentText("Incorrect internal project name. Try again")); - } - } - - private void processList(ICommandSender sender, String argument, String playerName) { - UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName); - switch (argument) { - case ALL -> { - for (String project : SpaceProjectManager.getProjectsMap() - .keySet()) { - sender.addChatMessage(new ChatComponentText(project)); - } - } - case AVAILABLE -> { - for (ISpaceProject project : SpaceProjectManager.getAllProjects()) { - if (project.meetsRequirements(tID, false)) { - sender.addChatMessage(new ChatComponentText(project.getProjectName())); - } - } - } - case UNLOCKED -> { - for (ISpaceProject project : SpaceProjectManager.getTeamSpaceProjects(tID)) { - sender.addChatMessage(new ChatComponentText(project.getProjectName())); - } - } - } - } - - private void processCopy(ICommandSender sender, String playerToCopyFrom, String playerCopyingTo) { - // This will take a while - } - - private void printHelp(ICommandSender sender) { - - } -} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java deleted file mode 100644 index 3c4ad00932..0000000000 --- a/src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java +++ /dev/null @@ -1,166 +0,0 @@ -package gregtech.common.misc.spaceprojects.commands; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.WeakHashMap; -import java.util.stream.Collectors; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.EnumChatFormatting; - -import org.apache.commons.lang3.tuple.Pair; - -import gregtech.api.util.GT_Utility; -import gregtech.common.misc.spaceprojects.SpaceProjectManager; - -/** - * @author BlueWeabo - */ -public class SP_Command extends CommandBase { - - private static final Set> invite = Collections - .newSetFromMap(new WeakHashMap<>()); - private static final Set confirm = Collections.newSetFromMap(new WeakHashMap<>()); - - private static final String INVITE = "invite"; - private static final String ACCEPT = "accept"; - private static final String LEAVE = "leave"; - private static final String CONFIRM = "confirm"; - - @Override - public String getCommandName() { - return "sp"; - } - - @Override - public int getRequiredPermissionLevel() { - return 0; - } - - @Override - public String getCommandUsage(ICommandSender sender) { - return "/" + getCommandName() + " [PlayerName]"; - } - - @Override - public void processCommand(ICommandSender sender, String[] arguments) { - if (arguments.length < 1) { - return; - } - switch (arguments[0]) { - case INVITE -> { - if (arguments.length < 2) { - return; - } - processInvite(sender, arguments[1]); - } - case ACCEPT -> { - if (arguments.length < 2) { - return; - } - processAccept(sender, arguments[1]); - } - case LEAVE -> processLeave(sender); - case CONFIRM -> processConfirm(sender); - } - } - - private void processInvite(ICommandSender sender, String playerInvited) { - EntityPlayerMP teamLeader = getCommandSenderAsPlayer(sender); - EntityPlayerMP teamMember = getPlayer(sender, playerInvited); - invite.add(Pair.of(teamMember, teamLeader)); - String message = EnumChatFormatting.GOLD + teamLeader.getCommandSenderName() - + EnumChatFormatting.RESET - + " has sent you an invite to join their team. Accept it with" - + EnumChatFormatting.GOLD - + " /sp accept " - + teamLeader.getCommandSenderName(); - GT_Utility.sendChatToPlayer(teamMember, message); - } - - private void processAccept(ICommandSender sender, String playerInviter) { - EntityPlayerMP teamMember = getCommandSenderAsPlayer(sender); - EntityPlayerMP teamLeader = getPlayer(sender, playerInviter); - if (invite.contains(Pair.of(teamMember, teamLeader))) { - String message = EnumChatFormatting.GOLD + teamMember.getCommandSenderName() - + EnumChatFormatting.RESET - + " has accepted the invite."; - SpaceProjectManager.putInTeam(teamMember.getUniqueID(), teamLeader.getUniqueID()); - GT_Utility.sendChatToPlayer(teamLeader, message); - invite.remove(Pair.of(teamMember, teamLeader)); - } - } - - private void processLeave(ICommandSender sender) { - EntityPlayerMP player = getCommandSenderAsPlayer(sender); - String message = "Are you sure you want to leave the team. You will lose all progress. Use " - + EnumChatFormatting.GOLD - + "/sp confirm" - + EnumChatFormatting.RESET - + " to confirm this. This does nothing if you are the team leader."; - GT_Utility.sendChatToPlayer(player, message); - confirm.add(player); - } - - private void processConfirm(ICommandSender sender) { - EntityPlayerMP player = getCommandSenderAsPlayer(sender); - if (confirm.contains(player)) { - String message = "Successfully left the team."; - SpaceProjectManager.putInTeam(player.getUniqueID(), player.getUniqueID()); - GT_Utility.sendChatToPlayer(player, message); - confirm.remove(player); - } - } - - @Override - public List addTabCompletionOptions(ICommandSender sender, String[] arguments) { - List autoComplete = new ArrayList<>(); - String filter = arguments.length == 0 ? "" : arguments[0].trim(); - switch (arguments.length) { - case 1 -> autoComplete.addAll(Arrays.asList(getSubCommands())); - case 2 -> { - filter = arguments[1].trim(); - if (arguments[0].equals(INVITE)) { - autoComplete.addAll(Arrays.asList(getPlayers())); - break; - } - - if (arguments[0].equals(CONFIRM)) { - Optional> pairOpt = invite.stream() - .filter( - (e) -> e.getKey() - .getUniqueID() == getCommandSenderAsPlayer(sender).getUniqueID()) - .findFirst(); - if (pairOpt.isPresent()) { - autoComplete.add( - SpaceProjectManager.getPlayerNameFromUUID( - pairOpt.get() - .getRight() - .getUniqueID())); - } - } - } - } - String finalFilter = filter; - return autoComplete.stream() - .filter(s -> finalFilter.isEmpty() || s.startsWith(finalFilter)) - .collect(Collectors.toList()); - } - - private String[] getPlayers() { - return MinecraftServer.getServer() - .getAllUsernames(); - } - - private String[] getSubCommands() { - return new String[] { INVITE, ACCEPT, LEAVE, CONFIRM }; - } - -} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProjectCommand.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProjectCommand.java new file mode 100644 index 0000000000..bd1408d80e --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProjectCommand.java @@ -0,0 +1,9 @@ +package gregtech.common.misc.spaceprojects.commands; + +public class SpaceProjectCommand extends SPCommand { + + @Override + public String getCommandName() { + return "spaceproject"; + } +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProject_Command.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProject_Command.java deleted file mode 100644 index 2f36175069..0000000000 --- a/src/main/java/gregtech/common/misc/spaceprojects/commands/SpaceProject_Command.java +++ /dev/null @@ -1,9 +0,0 @@ -package gregtech.common.misc.spaceprojects.commands; - -public class SpaceProject_Command extends SP_Command { - - @Override - public String getCommandName() { - return "spaceproject"; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitBasicLogic.java b/src/main/java/gregtech/common/redstonecircuits/CircuitBasicLogic.java new file mode 100644 index 0000000000..ce430f9b7e --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitBasicLogic.java @@ -0,0 +1,137 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitBasicLogic extends CircuitryBehavior { + + public CircuitBasicLogic(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 0; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 0) { + aCircuitData[0] = 0; + } + if (aCircuitData[0] > 13) { + aCircuitData[0] = 13; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 2) { + aRedstoneCircuitBlock.setRedstone( + (byte) (aCircuitData[0] % 2 == (getAnyRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0), + aRedstoneCircuitBlock.getOutputFacing()); + } else if (aCircuitData[0] < 4) { + aRedstoneCircuitBlock.setRedstone( + (byte) (aCircuitData[0] % 2 == (getOneRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0), + aRedstoneCircuitBlock.getOutputFacing()); + } else if (aCircuitData[0] < 6) { + aRedstoneCircuitBlock.setRedstone( + (byte) (aCircuitData[0] % 2 == (getAllRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0), + aRedstoneCircuitBlock.getOutputFacing()); + } else if (aCircuitData[0] < 7) { + aRedstoneCircuitBlock.setRedstone( + (byte) (15 - getStrongestRedstone(aRedstoneCircuitBlock)), + aRedstoneCircuitBlock.getOutputFacing()); + } else if (aCircuitData[0] < 9) { + aRedstoneCircuitBlock.setRedstone( + (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) + ^ (getStrongestRedstone(aRedstoneCircuitBlock) | getWeakestRedstone(aRedstoneCircuitBlock))), + aRedstoneCircuitBlock.getOutputFacing()); + } else if (aCircuitData[0] < 11) { + aRedstoneCircuitBlock.setRedstone( + (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) ^ getStrongestRedstone(aRedstoneCircuitBlock) + ^ getWeakestRedstone(aRedstoneCircuitBlock)), + aRedstoneCircuitBlock.getOutputFacing()); + } else if (aCircuitData[0] < 13) { + aRedstoneCircuitBlock.setRedstone( + (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) + ^ getStrongestRedstone(aRedstoneCircuitBlock) & getWeakestRedstone(aRedstoneCircuitBlock)), + aRedstoneCircuitBlock.getOutputFacing()); + } else if (aCircuitData[0] < 14) { + aRedstoneCircuitBlock.setRedstone( + (byte) (getStrongestRedstone(aRedstoneCircuitBlock) ^ 0xF), + aRedstoneCircuitBlock.getOutputFacing()); + } + } + + @Override + public String getName() { + return "Basic Logic"; + } + + @Override + public String getDescription() { + return "Regular Logic Gates"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex == 0) { + switch (aCircuitData[0]) { + case 0 -> { + return "OR"; + } + case 1 -> { + return "NOR"; + } + case 2 -> { + return "XOR"; + } + case 3 -> { + return "XNOR"; + } + case 4 -> { + return "AND"; + } + case 5 -> { + return "NAND"; + } + case 6 -> { + return "INVERT"; + } + case 7 -> { + return "BIT_OR"; + } + case 8 -> { + return "BIT_NOR"; + } + case 9 -> { + return "BIT_XOR"; + } + case 10 -> { + return "BIT_XNOR"; + } + case 11 -> { + return "BIT_AND"; + } + case 12 -> { + return "BIT_NAND"; + } + case 13 -> { + return "BIT_INVERT"; + } + } + } + return ""; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + return ""; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitBitAnd.java b/src/main/java/gregtech/common/redstonecircuits/CircuitBitAnd.java new file mode 100644 index 0000000000..fbdf5b1ee9 --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitBitAnd.java @@ -0,0 +1,81 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitBitAnd extends CircuitryBehavior { + + public CircuitBitAnd(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 0; + aCircuitData[1] = 0; + aCircuitData[2] = 0; + aCircuitData[3] = 0; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 0) { + aCircuitData[0] = 0; + } + if (aCircuitData[1] < 0) { + aCircuitData[1] = 0; + } + if (aCircuitData[2] < 0) { + aCircuitData[2] = 0; + } + if (aCircuitData[3] < 0) { + aCircuitData[3] = 0; + } + if (aCircuitData[0] > 1) { + aCircuitData[0] = 1; + } + if (aCircuitData[1] > 1) { + aCircuitData[1] = 1; + } + if (aCircuitData[2] > 1) { + aCircuitData[2] = 1; + } + if (aCircuitData[3] > 1) { + aCircuitData[3] = 1; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aRedstoneCircuitBlock.setRedstone( + (byte) ((getStrongestRedstone(aRedstoneCircuitBlock) + & (aCircuitData[0] | aCircuitData[1] << 1 | aCircuitData[2] << 2 | aCircuitData[3] << 3)) != 0 ? 15 + : 0), + aRedstoneCircuitBlock.getOutputFacing()); + } + + @Override + public String getName() { + return "Hardcode Bit-AND"; + } + + @Override + public String getDescription() { + return "( signal & this ) != 0"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + return "Bit " + aCircuitDataIndex + ":"; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + return aCircuitData[aCircuitDataIndex] == 0 ? "OFF" : "ON"; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitCombinationLock.java b/src/main/java/gregtech/common/redstonecircuits/CircuitCombinationLock.java new file mode 100644 index 0000000000..8058d2b398 --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitCombinationLock.java @@ -0,0 +1,109 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitCombinationLock extends CircuitryBehavior { + + public CircuitCombinationLock(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 1; + aCircuitData[1] = 0; + aCircuitData[2] = 0; + aCircuitData[3] = 0; + aCircuitData[4] = 0; + aCircuitData[5] = 0; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 1) { + aCircuitData[0] = 1; + } + if (aCircuitData[1] < 0) { + aCircuitData[1] = 0; + } + if (aCircuitData[2] < 0) { + aCircuitData[2] = 0; + } + if (aCircuitData[3] < 0) { + aCircuitData[3] = 0; + } + if (aCircuitData[0] > 15) { + aCircuitData[0] = 15; + } + if (aCircuitData[1] > 15) { + aCircuitData[1] = 15; + } + if (aCircuitData[2] > 15) { + aCircuitData[2] = 15; + } + if (aCircuitData[3] > 15) { + aCircuitData[3] = 15; + } + if (aCircuitData[4] < 0) { + aCircuitData[4] = 0; + } + if (aCircuitData[4] > 3) { + aCircuitData[4] = 3; + } + if (aCircuitData[5] < 0) { + aCircuitData[5] = 0; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + while ((aCircuitData[aCircuitData[4]] == 0) && (aCircuitData[4] < 4)) { + aCircuitData[4] += 1; + } + if (aCircuitData[4] < 4) { + int tRedstone = getStrongestRedstone(aRedstoneCircuitBlock); + if (tRedstone > 0) { + if (aCircuitData[5] == 0) { + if (tRedstone == aCircuitData[aCircuitData[4]]) { + aCircuitData[4] += 1; + } else { + aCircuitData[4] = 0; + } + } + aCircuitData[5] = 1; + } else { + aCircuitData[5] = 0; + } + aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); + } else { + aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); + aCircuitData[4] = 0; + } + } + + @Override + public String getName() { + return "Combination Lock"; + } + + @Override + public String getDescription() { + return "Checks Combinations"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + return "Power " + aCircuitDataIndex; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + return null; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitEquals.java b/src/main/java/gregtech/common/redstonecircuits/CircuitEquals.java new file mode 100644 index 0000000000..19fb9089bc --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitEquals.java @@ -0,0 +1,73 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitEquals extends CircuitryBehavior { + + public CircuitEquals(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 0; + aCircuitData[1] = 0; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 0) { + aCircuitData[0] = 0; + } + if (aCircuitData[0] > 15) { + aCircuitData[0] = 15; + } + if (aCircuitData[1] < 0) { + aCircuitData[3] = 0; + } + if (aCircuitData[1] > 1) { + aCircuitData[3] = 1; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aRedstoneCircuitBlock.setRedstone( + ((byte) (((aCircuitData[1] != 0) == (getStrongestRedstone(aRedstoneCircuitBlock) == aCircuitData[0])) ? 0 + : 15)), + aRedstoneCircuitBlock.getOutputFacing()); + } + + @Override + public String getName() { + return "Equals"; + } + + @Override + public String getDescription() { + return "signal == this"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + return switch (aCircuitDataIndex) { + case 0 -> "Signal"; + case 1 -> aCircuitData[1] == 0 ? "Equal" : "Unequal"; + default -> ""; + }; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex > 0) { + return ""; + } + return null; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitPulser.java b/src/main/java/gregtech/common/redstonecircuits/CircuitPulser.java new file mode 100644 index 0000000000..9d1bb1684e --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitPulser.java @@ -0,0 +1,92 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitPulser extends CircuitryBehavior { + + public CircuitPulser(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 1; + aCircuitData[1] = 16; + aCircuitData[4] = 0; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 1) { + aCircuitData[0] = 1; + } + if (aCircuitData[1] < 0) { + aCircuitData[1] = 0; + } + if (aCircuitData[1] > 16) { + aCircuitData[1] = 16; + } + if (aCircuitData[4] < 0) { + aCircuitData[4] = 0; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + byte redstoneSignal = aCircuitData[1] == 0 ? getWeakestNonZeroRedstone(aRedstoneCircuitBlock) + : getStrongestRedstone(aRedstoneCircuitBlock); + if (aCircuitData[4] == 0) { + aCircuitData[5] = redstoneSignal; + } + if ((redstoneSignal > 0) || (aCircuitData[4] > 0)) { + int index = 4; + int tmp42_41 = aCircuitData[index]; + aCircuitData[index] = (tmp42_41 + 1); + if ((tmp42_41 >= aCircuitData[0]) && (redstoneSignal <= 0)) { + aCircuitData[4] = 0; + } + } + aRedstoneCircuitBlock.setRedstone( + (aCircuitData[4] > 0) && (aCircuitData[4] <= aCircuitData[0]) ? (byte) aCircuitData[1] + : (aCircuitData[1] <= 0) || (aCircuitData[1] > 15) ? (byte) aCircuitData[5] : 0, + aRedstoneCircuitBlock.getOutputFacing()); + } + + @Override + public String getName() { + return "Pulser"; + } + + @Override + public String getDescription() { + return "Limits&Enlengths"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + return switch (aCircuitDataIndex) { + case 0 -> "Length"; + case 1 -> "RS Out"; + default -> ""; + }; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex == 1) { + if (aCircuitData[aCircuitDataIndex] == 16) { + return "HIGHEST"; + } + if (aCircuitData[aCircuitDataIndex] == 0) { + return "LOWEST"; + } + } + return aCircuitDataIndex > 1 ? "" : null; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitRandomizer.java b/src/main/java/gregtech/common/redstonecircuits/CircuitRandomizer.java new file mode 100644 index 0000000000..986a6e858e --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitRandomizer.java @@ -0,0 +1,86 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitRandomizer extends CircuitryBehavior { + + public CircuitRandomizer(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 1; + aCircuitData[4] = 0; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 1) { + aCircuitData[0] = 1; + } + if (aCircuitData[3] < 0) { + aCircuitData[3] = 0; + } + if (aCircuitData[3] > 1) { + aCircuitData[3] = 1; + } + if (aCircuitData[4] < 0) { + aCircuitData[4] = 0; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[3] == 1) { + if (getAnyRedstone(aRedstoneCircuitBlock)) { + aCircuitData[4] += 1; + } else { + aCircuitData[4] = 0; + } + } else if (getAnyRedstone(aRedstoneCircuitBlock)) { + aCircuitData[4] = 0; + } else { + aCircuitData[4] += 1; + } + if (aCircuitData[4] >= aCircuitData[0]) { + aCircuitData[4] = 0; + aRedstoneCircuitBlock + .setRedstone((byte) aRedstoneCircuitBlock.getRandom(16), aRedstoneCircuitBlock.getOutputFacing()); + } + } + + @Override + public String getName() { + return "Randomizer"; + } + + @Override + public String getDescription() { + return "Randomizes Redstone"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + return switch (aCircuitDataIndex) { + case 0 -> "Delay"; + case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF"; + case 4 -> "Status"; + default -> ""; + }; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex != 0) { + return ""; + } + return null; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitRedstoneMeter.java b/src/main/java/gregtech/common/redstonecircuits/CircuitRedstoneMeter.java new file mode 100644 index 0000000000..2a0172c85a --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitRedstoneMeter.java @@ -0,0 +1,94 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitRedstoneMeter extends CircuitryBehavior { + + public CircuitRedstoneMeter(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 1; + aCircuitData[1] = 15; + aCircuitData[2] = 0; + aCircuitData[3] = 15; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 0) { + aCircuitData[0] = 0; + } + if (aCircuitData[0] > 15) { + aCircuitData[0] = 15; + } + if (aCircuitData[1] < 0) { + aCircuitData[1] = 0; + } + if (aCircuitData[1] > 15) { + aCircuitData[1] = 15; + } + if (aCircuitData[1] < aCircuitData[0]) { + aCircuitData[1] = aCircuitData[0]; + } + if (aCircuitData[2] < 0) { + aCircuitData[2] = 0; + } + if (aCircuitData[2] > 1) { + aCircuitData[2] = 1; + } + if (aCircuitData[3] < 0) { + aCircuitData[3] = 0; + } + if (aCircuitData[3] > 15) { + aCircuitData[3] = 15; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + byte tRedstone = getStrongestRedstone(aRedstoneCircuitBlock); + aRedstoneCircuitBlock + .setRedstone( + ((tRedstone >= aCircuitData[0]) && (tRedstone <= aCircuitData[1]) ? 1 : 0) + != (aCircuitData[2] != 0 ? 1 : 0) ? (byte) aCircuitData[3] : 0, + aRedstoneCircuitBlock.getOutputFacing()); + } + + @Override + public String getName() { + return "Redstone Meter"; + } + + @Override + public String getDescription() { + return "Checks Boundaries"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + return switch (aCircuitDataIndex) { + case 0 -> "Lower"; + case 1 -> "Upper"; + case 2 -> "Invert:"; + case 3 -> "RS Out:"; + default -> ""; + }; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex == 2) { + return aCircuitData[2] == 0 ? "OFF" : "ON"; + } + return null; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitRepeater.java b/src/main/java/gregtech/common/redstonecircuits/CircuitRepeater.java new file mode 100644 index 0000000000..b7b28d0371 --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitRepeater.java @@ -0,0 +1,86 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitRepeater extends CircuitryBehavior { + + public CircuitRepeater(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 1; + aCircuitData[4] = 0; + aCircuitData[5] = -1; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 1) { + aCircuitData[0] = 1; + } + if (aCircuitData[4] < 0) { + aCircuitData[4] = 0; + } + if (aCircuitData[5] < -1) { + aCircuitData[5] = -1; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (getAnyRedstone(aRedstoneCircuitBlock)) { + aCircuitData[4] += 1; + if (aCircuitData[5] < 0) { + aCircuitData[5] = 0; + } + } + if ((aCircuitData[5] >= 0) && (aCircuitData[5] < aCircuitData[0])) { + aCircuitData[5] += 1; + } + if (aCircuitData[4] > 0) { + if (aCircuitData[5] >= aCircuitData[0]) { + aCircuitData[4] -= 1; + aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); + } else { + aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); + } + } else { + aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); + aCircuitData[5] = -1; + } + } + + @Override + public String getName() { + return "Repeater"; + } + + @Override + public String getDescription() { + return "Delays RS-Signal"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex == 0) { + return "Delay"; + } + return ""; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex > 0) { + return ""; + } + return null; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/CircuitTimer.java b/src/main/java/gregtech/common/redstonecircuits/CircuitTimer.java new file mode 100644 index 0000000000..ae96d35069 --- /dev/null +++ b/src/main/java/gregtech/common/redstonecircuits/CircuitTimer.java @@ -0,0 +1,108 @@ +package gregtech.common.redstonecircuits; + +import gregtech.api.interfaces.IRedstoneCircuitBlock; +import gregtech.api.util.CircuitryBehavior; + +public class CircuitTimer extends CircuitryBehavior { + + public CircuitTimer(int aIndex) { + super(aIndex); + } + + @Override + public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + aCircuitData[0] = 2; + aCircuitData[1] = 1; + aCircuitData[2] = 2; + aCircuitData[4] = 0; + } + + @Override + public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[0] < 2) { + aCircuitData[0] = 2; + } + if (aCircuitData[1] < 1) { + aCircuitData[1] = 1; + } + if (aCircuitData[2] < 2) { + aCircuitData[2] = 2; + } + if (aCircuitData[3] < 0) { + aCircuitData[3] = 0; + } + if (aCircuitData[3] > 1) { + aCircuitData[3] = 1; + } + if (aCircuitData[4] < 0) { + aCircuitData[4] = 0; + } + } + + @Override + public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (aCircuitData[3] == 1) { + if (getAnyRedstone(aRedstoneCircuitBlock)) { + aCircuitData[4] += 1; + } else { + aCircuitData[4] = 0; + } + } else if (getAnyRedstone(aRedstoneCircuitBlock)) { + aCircuitData[4] = 0; + } else { + aCircuitData[4] += 1; + } + if (aCircuitData[4] >= aCircuitData[0]) { + if (aCircuitData[1] > 1) { + if (aCircuitData[4] >= aCircuitData[0] + (aCircuitData[1] - 1) * aCircuitData[2]) { + aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); + aCircuitData[4] = 0; + } else { + aRedstoneCircuitBlock.setRedstone( + (byte) ((aCircuitData[4] - aCircuitData[0]) % aCircuitData[2] == 0 ? 15 : 0), + aRedstoneCircuitBlock.getOutputFacing()); + } + } else { + aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); + aCircuitData[4] = 0; + } + } else { + aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); + } + } + + @Override + public String getName() { + return "Timer"; + } + + @Override + public String getDescription() { + return "Pulses Redstone"; + } + + @Override + public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { + return switch (aCircuitDataIndex) { + case 0 -> "Delay"; + case 1 -> "Pulses"; + case 2 -> "Length"; + case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF"; + case 4 -> "Time"; + default -> ""; + }; + } + + @Override + public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { + return false; + } + + @Override + public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { + if (aCircuitDataIndex == 3) { + return ""; + } + return null; + } +} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java deleted file mode 100644 index 34093a95de..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java +++ /dev/null @@ -1,137 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_BasicLogic extends GT_CircuitryBehavior { - - public GT_Circuit_BasicLogic(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 0; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 0) { - aCircuitData[0] = 0; - } - if (aCircuitData[0] > 13) { - aCircuitData[0] = 13; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 2) { - aRedstoneCircuitBlock.setRedstone( - (byte) (aCircuitData[0] % 2 == (getAnyRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0), - aRedstoneCircuitBlock.getOutputFacing()); - } else if (aCircuitData[0] < 4) { - aRedstoneCircuitBlock.setRedstone( - (byte) (aCircuitData[0] % 2 == (getOneRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0), - aRedstoneCircuitBlock.getOutputFacing()); - } else if (aCircuitData[0] < 6) { - aRedstoneCircuitBlock.setRedstone( - (byte) (aCircuitData[0] % 2 == (getAllRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0), - aRedstoneCircuitBlock.getOutputFacing()); - } else if (aCircuitData[0] < 7) { - aRedstoneCircuitBlock.setRedstone( - (byte) (15 - getStrongestRedstone(aRedstoneCircuitBlock)), - aRedstoneCircuitBlock.getOutputFacing()); - } else if (aCircuitData[0] < 9) { - aRedstoneCircuitBlock.setRedstone( - (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) - ^ (getStrongestRedstone(aRedstoneCircuitBlock) | getWeakestRedstone(aRedstoneCircuitBlock))), - aRedstoneCircuitBlock.getOutputFacing()); - } else if (aCircuitData[0] < 11) { - aRedstoneCircuitBlock.setRedstone( - (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) ^ getStrongestRedstone(aRedstoneCircuitBlock) - ^ getWeakestRedstone(aRedstoneCircuitBlock)), - aRedstoneCircuitBlock.getOutputFacing()); - } else if (aCircuitData[0] < 13) { - aRedstoneCircuitBlock.setRedstone( - (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) - ^ getStrongestRedstone(aRedstoneCircuitBlock) & getWeakestRedstone(aRedstoneCircuitBlock)), - aRedstoneCircuitBlock.getOutputFacing()); - } else if (aCircuitData[0] < 14) { - aRedstoneCircuitBlock.setRedstone( - (byte) (getStrongestRedstone(aRedstoneCircuitBlock) ^ 0xF), - aRedstoneCircuitBlock.getOutputFacing()); - } - } - - @Override - public String getName() { - return "Basic Logic"; - } - - @Override - public String getDescription() { - return "Regular Logic Gates"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex == 0) { - switch (aCircuitData[0]) { - case 0 -> { - return "OR"; - } - case 1 -> { - return "NOR"; - } - case 2 -> { - return "XOR"; - } - case 3 -> { - return "XNOR"; - } - case 4 -> { - return "AND"; - } - case 5 -> { - return "NAND"; - } - case 6 -> { - return "INVERT"; - } - case 7 -> { - return "BIT_OR"; - } - case 8 -> { - return "BIT_NOR"; - } - case 9 -> { - return "BIT_XOR"; - } - case 10 -> { - return "BIT_XNOR"; - } - case 11 -> { - return "BIT_AND"; - } - case 12 -> { - return "BIT_NAND"; - } - case 13 -> { - return "BIT_INVERT"; - } - } - } - return ""; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - return ""; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java deleted file mode 100644 index f5f83a7e10..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java +++ /dev/null @@ -1,81 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_BitAnd extends GT_CircuitryBehavior { - - public GT_Circuit_BitAnd(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 0; - aCircuitData[1] = 0; - aCircuitData[2] = 0; - aCircuitData[3] = 0; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 0) { - aCircuitData[0] = 0; - } - if (aCircuitData[1] < 0) { - aCircuitData[1] = 0; - } - if (aCircuitData[2] < 0) { - aCircuitData[2] = 0; - } - if (aCircuitData[3] < 0) { - aCircuitData[3] = 0; - } - if (aCircuitData[0] > 1) { - aCircuitData[0] = 1; - } - if (aCircuitData[1] > 1) { - aCircuitData[1] = 1; - } - if (aCircuitData[2] > 1) { - aCircuitData[2] = 1; - } - if (aCircuitData[3] > 1) { - aCircuitData[3] = 1; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aRedstoneCircuitBlock.setRedstone( - (byte) ((getStrongestRedstone(aRedstoneCircuitBlock) - & (aCircuitData[0] | aCircuitData[1] << 1 | aCircuitData[2] << 2 | aCircuitData[3] << 3)) != 0 ? 15 - : 0), - aRedstoneCircuitBlock.getOutputFacing()); - } - - @Override - public String getName() { - return "Hardcode Bit-AND"; - } - - @Override - public String getDescription() { - return "( signal & this ) != 0"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - return "Bit " + aCircuitDataIndex + ":"; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - return aCircuitData[aCircuitDataIndex] == 0 ? "OFF" : "ON"; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java deleted file mode 100644 index 67d8527606..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java +++ /dev/null @@ -1,109 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_CombinationLock extends GT_CircuitryBehavior { - - public GT_Circuit_CombinationLock(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 1; - aCircuitData[1] = 0; - aCircuitData[2] = 0; - aCircuitData[3] = 0; - aCircuitData[4] = 0; - aCircuitData[5] = 0; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 1) { - aCircuitData[0] = 1; - } - if (aCircuitData[1] < 0) { - aCircuitData[1] = 0; - } - if (aCircuitData[2] < 0) { - aCircuitData[2] = 0; - } - if (aCircuitData[3] < 0) { - aCircuitData[3] = 0; - } - if (aCircuitData[0] > 15) { - aCircuitData[0] = 15; - } - if (aCircuitData[1] > 15) { - aCircuitData[1] = 15; - } - if (aCircuitData[2] > 15) { - aCircuitData[2] = 15; - } - if (aCircuitData[3] > 15) { - aCircuitData[3] = 15; - } - if (aCircuitData[4] < 0) { - aCircuitData[4] = 0; - } - if (aCircuitData[4] > 3) { - aCircuitData[4] = 3; - } - if (aCircuitData[5] < 0) { - aCircuitData[5] = 0; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - while ((aCircuitData[aCircuitData[4]] == 0) && (aCircuitData[4] < 4)) { - aCircuitData[4] += 1; - } - if (aCircuitData[4] < 4) { - int tRedstone = getStrongestRedstone(aRedstoneCircuitBlock); - if (tRedstone > 0) { - if (aCircuitData[5] == 0) { - if (tRedstone == aCircuitData[aCircuitData[4]]) { - aCircuitData[4] += 1; - } else { - aCircuitData[4] = 0; - } - } - aCircuitData[5] = 1; - } else { - aCircuitData[5] = 0; - } - aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); - } else { - aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); - aCircuitData[4] = 0; - } - } - - @Override - public String getName() { - return "Combination Lock"; - } - - @Override - public String getDescription() { - return "Checks Combinations"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - return "Power " + aCircuitDataIndex; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - return null; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java deleted file mode 100644 index 9e9af183e8..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java +++ /dev/null @@ -1,73 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_Equals extends GT_CircuitryBehavior { - - public GT_Circuit_Equals(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 0; - aCircuitData[1] = 0; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 0) { - aCircuitData[0] = 0; - } - if (aCircuitData[0] > 15) { - aCircuitData[0] = 15; - } - if (aCircuitData[1] < 0) { - aCircuitData[3] = 0; - } - if (aCircuitData[1] > 1) { - aCircuitData[3] = 1; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aRedstoneCircuitBlock.setRedstone( - ((byte) (((aCircuitData[1] != 0) == (getStrongestRedstone(aRedstoneCircuitBlock) == aCircuitData[0])) ? 0 - : 15)), - aRedstoneCircuitBlock.getOutputFacing()); - } - - @Override - public String getName() { - return "Equals"; - } - - @Override - public String getDescription() { - return "signal == this"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - return switch (aCircuitDataIndex) { - case 0 -> "Signal"; - case 1 -> aCircuitData[1] == 0 ? "Equal" : "Unequal"; - default -> ""; - }; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex > 0) { - return ""; - } - return null; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java deleted file mode 100644 index c54d0be060..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java +++ /dev/null @@ -1,92 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_Pulser extends GT_CircuitryBehavior { - - public GT_Circuit_Pulser(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 1; - aCircuitData[1] = 16; - aCircuitData[4] = 0; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 1) { - aCircuitData[0] = 1; - } - if (aCircuitData[1] < 0) { - aCircuitData[1] = 0; - } - if (aCircuitData[1] > 16) { - aCircuitData[1] = 16; - } - if (aCircuitData[4] < 0) { - aCircuitData[4] = 0; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - byte redstoneSignal = aCircuitData[1] == 0 ? getWeakestNonZeroRedstone(aRedstoneCircuitBlock) - : getStrongestRedstone(aRedstoneCircuitBlock); - if (aCircuitData[4] == 0) { - aCircuitData[5] = redstoneSignal; - } - if ((redstoneSignal > 0) || (aCircuitData[4] > 0)) { - int index = 4; - int tmp42_41 = aCircuitData[index]; - aCircuitData[index] = (tmp42_41 + 1); - if ((tmp42_41 >= aCircuitData[0]) && (redstoneSignal <= 0)) { - aCircuitData[4] = 0; - } - } - aRedstoneCircuitBlock.setRedstone( - (aCircuitData[4] > 0) && (aCircuitData[4] <= aCircuitData[0]) ? (byte) aCircuitData[1] - : (aCircuitData[1] <= 0) || (aCircuitData[1] > 15) ? (byte) aCircuitData[5] : 0, - aRedstoneCircuitBlock.getOutputFacing()); - } - - @Override - public String getName() { - return "Pulser"; - } - - @Override - public String getDescription() { - return "Limits&Enlengths"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - return switch (aCircuitDataIndex) { - case 0 -> "Length"; - case 1 -> "RS Out"; - default -> ""; - }; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex == 1) { - if (aCircuitData[aCircuitDataIndex] == 16) { - return "HIGHEST"; - } - if (aCircuitData[aCircuitDataIndex] == 0) { - return "LOWEST"; - } - } - return aCircuitDataIndex > 1 ? "" : null; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java deleted file mode 100644 index 336bf9928d..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java +++ /dev/null @@ -1,86 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_Randomizer extends GT_CircuitryBehavior { - - public GT_Circuit_Randomizer(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 1; - aCircuitData[4] = 0; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 1) { - aCircuitData[0] = 1; - } - if (aCircuitData[3] < 0) { - aCircuitData[3] = 0; - } - if (aCircuitData[3] > 1) { - aCircuitData[3] = 1; - } - if (aCircuitData[4] < 0) { - aCircuitData[4] = 0; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[3] == 1) { - if (getAnyRedstone(aRedstoneCircuitBlock)) { - aCircuitData[4] += 1; - } else { - aCircuitData[4] = 0; - } - } else if (getAnyRedstone(aRedstoneCircuitBlock)) { - aCircuitData[4] = 0; - } else { - aCircuitData[4] += 1; - } - if (aCircuitData[4] >= aCircuitData[0]) { - aCircuitData[4] = 0; - aRedstoneCircuitBlock - .setRedstone((byte) aRedstoneCircuitBlock.getRandom(16), aRedstoneCircuitBlock.getOutputFacing()); - } - } - - @Override - public String getName() { - return "Randomizer"; - } - - @Override - public String getDescription() { - return "Randomizes Redstone"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - return switch (aCircuitDataIndex) { - case 0 -> "Delay"; - case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF"; - case 4 -> "Status"; - default -> ""; - }; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex != 0) { - return ""; - } - return null; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java deleted file mode 100644 index 4db261fcf0..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java +++ /dev/null @@ -1,94 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_RedstoneMeter extends GT_CircuitryBehavior { - - public GT_Circuit_RedstoneMeter(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 1; - aCircuitData[1] = 15; - aCircuitData[2] = 0; - aCircuitData[3] = 15; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 0) { - aCircuitData[0] = 0; - } - if (aCircuitData[0] > 15) { - aCircuitData[0] = 15; - } - if (aCircuitData[1] < 0) { - aCircuitData[1] = 0; - } - if (aCircuitData[1] > 15) { - aCircuitData[1] = 15; - } - if (aCircuitData[1] < aCircuitData[0]) { - aCircuitData[1] = aCircuitData[0]; - } - if (aCircuitData[2] < 0) { - aCircuitData[2] = 0; - } - if (aCircuitData[2] > 1) { - aCircuitData[2] = 1; - } - if (aCircuitData[3] < 0) { - aCircuitData[3] = 0; - } - if (aCircuitData[3] > 15) { - aCircuitData[3] = 15; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - byte tRedstone = getStrongestRedstone(aRedstoneCircuitBlock); - aRedstoneCircuitBlock - .setRedstone( - ((tRedstone >= aCircuitData[0]) && (tRedstone <= aCircuitData[1]) ? 1 : 0) - != (aCircuitData[2] != 0 ? 1 : 0) ? (byte) aCircuitData[3] : 0, - aRedstoneCircuitBlock.getOutputFacing()); - } - - @Override - public String getName() { - return "Redstone Meter"; - } - - @Override - public String getDescription() { - return "Checks Boundaries"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - return switch (aCircuitDataIndex) { - case 0 -> "Lower"; - case 1 -> "Upper"; - case 2 -> "Invert:"; - case 3 -> "RS Out:"; - default -> ""; - }; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex == 2) { - return aCircuitData[2] == 0 ? "OFF" : "ON"; - } - return null; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java deleted file mode 100644 index b96762d73b..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java +++ /dev/null @@ -1,86 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_Repeater extends GT_CircuitryBehavior { - - public GT_Circuit_Repeater(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 1; - aCircuitData[4] = 0; - aCircuitData[5] = -1; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 1) { - aCircuitData[0] = 1; - } - if (aCircuitData[4] < 0) { - aCircuitData[4] = 0; - } - if (aCircuitData[5] < -1) { - aCircuitData[5] = -1; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (getAnyRedstone(aRedstoneCircuitBlock)) { - aCircuitData[4] += 1; - if (aCircuitData[5] < 0) { - aCircuitData[5] = 0; - } - } - if ((aCircuitData[5] >= 0) && (aCircuitData[5] < aCircuitData[0])) { - aCircuitData[5] += 1; - } - if (aCircuitData[4] > 0) { - if (aCircuitData[5] >= aCircuitData[0]) { - aCircuitData[4] -= 1; - aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); - } else { - aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); - } - } else { - aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); - aCircuitData[5] = -1; - } - } - - @Override - public String getName() { - return "Repeater"; - } - - @Override - public String getDescription() { - return "Delays RS-Signal"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex == 0) { - return "Delay"; - } - return ""; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex > 0) { - return ""; - } - return null; - } -} diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java deleted file mode 100644 index 026c83dfbc..0000000000 --- a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java +++ /dev/null @@ -1,108 +0,0 @@ -package gregtech.common.redstonecircuits; - -import gregtech.api.interfaces.IRedstoneCircuitBlock; -import gregtech.api.util.GT_CircuitryBehavior; - -public class GT_Circuit_Timer extends GT_CircuitryBehavior { - - public GT_Circuit_Timer(int aIndex) { - super(aIndex); - } - - @Override - public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - aCircuitData[0] = 2; - aCircuitData[1] = 1; - aCircuitData[2] = 2; - aCircuitData[4] = 0; - } - - @Override - public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[0] < 2) { - aCircuitData[0] = 2; - } - if (aCircuitData[1] < 1) { - aCircuitData[1] = 1; - } - if (aCircuitData[2] < 2) { - aCircuitData[2] = 2; - } - if (aCircuitData[3] < 0) { - aCircuitData[3] = 0; - } - if (aCircuitData[3] > 1) { - aCircuitData[3] = 1; - } - if (aCircuitData[4] < 0) { - aCircuitData[4] = 0; - } - } - - @Override - public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) { - if (aCircuitData[3] == 1) { - if (getAnyRedstone(aRedstoneCircuitBlock)) { - aCircuitData[4] += 1; - } else { - aCircuitData[4] = 0; - } - } else if (getAnyRedstone(aRedstoneCircuitBlock)) { - aCircuitData[4] = 0; - } else { - aCircuitData[4] += 1; - } - if (aCircuitData[4] >= aCircuitData[0]) { - if (aCircuitData[1] > 1) { - if (aCircuitData[4] >= aCircuitData[0] + (aCircuitData[1] - 1) * aCircuitData[2]) { - aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); - aCircuitData[4] = 0; - } else { - aRedstoneCircuitBlock.setRedstone( - (byte) ((aCircuitData[4] - aCircuitData[0]) % aCircuitData[2] == 0 ? 15 : 0), - aRedstoneCircuitBlock.getOutputFacing()); - } - } else { - aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing()); - aCircuitData[4] = 0; - } - } else { - aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing()); - } - } - - @Override - public String getName() { - return "Timer"; - } - - @Override - public String getDescription() { - return "Pulses Redstone"; - } - - @Override - public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) { - return switch (aCircuitDataIndex) { - case 0 -> "Delay"; - case 1 -> "Pulses"; - case 2 -> "Length"; - case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF"; - case 4 -> "Time"; - default -> ""; - }; - } - - @Override - public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) { - return false; - } - - @Override - public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) { - if (aCircuitDataIndex == 3) { - return ""; - } - return null; - } -} diff --git a/src/main/java/gregtech/common/render/DroneRender.java b/src/main/java/gregtech/common/render/DroneRender.java new file mode 100644 index 0000000000..02445b6dc6 --- /dev/null +++ b/src/main/java/gregtech/common/render/DroneRender.java @@ -0,0 +1,93 @@ +package gregtech.common.render; + +import static gregtech.api.enums.Mods.GregTech; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.common.tileentities.render.TileEntityDrone; + +@SideOnly(Side.CLIENT) +public class DroneRender extends TileEntitySpecialRenderer { + + private static final ResourceLocation DroneTexture = new ResourceLocation(GregTech.ID, "textures/model/drone.png"); + private static final IModelCustom Drone = AdvancedModelLoader + .loadModel(new ResourceLocation(GregTech.ID, "textures/model/drone.obj")); + + public DroneRender() { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDrone.class, this); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { + if (!(tile instanceof TileEntityDrone drone)) return; + final float size = 1.0f; + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + renderDrone(size); + renderBlade(drone, size); + GL11.glPopMatrix(); + } + + private void renderDrone(double size) { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + this.bindTexture(DroneTexture); + GL11.glScaled(size, size, size); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); + Drone.renderOnly("drone", "box", "main"); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + private void renderBlade(TileEntityDrone drone, double size) { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + this.bindTexture(DroneTexture); + GL11.glScaled(size, size, size); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); + GL11.glPushMatrix(); + GL11.glTranslated(-0.7d * size, -1 * size, -0.7 * size); + GL11.glRotated(drone.rotation, 0, 1, 0); + GL11.glTranslated(0.7d * size, 1 * size, 0.7 * size); + Drone.renderOnly("blade2"); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glTranslated(-0.7d * size, -1 * size, 0.7 * size); + GL11.glRotated(drone.rotation, 0, 1, 0); + GL11.glTranslated(0.7d * size, 1 * size, -0.7 * size); + Drone.renderOnly("blade3"); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glTranslated(0.7d * size, -1 * size, -0.7 * size); + GL11.glRotated(drone.rotation, 0, 1, 0); + GL11.glTranslated(-0.7d * size, 1 * size, 0.7 * size); + Drone.renderOnly("blade1"); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glTranslated(0.7d * size, -1 * size, 0.7 * size); + GL11.glRotated(drone.rotation, 0, 1, 0); + GL11.glTranslated(-0.7d * size, 1 * size, -0.7 * size); + Drone.renderOnly("blade4"); + GL11.glPopMatrix(); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } +} diff --git a/src/main/java/gregtech/common/render/FlaskRenderer.java b/src/main/java/gregtech/common/render/FlaskRenderer.java new file mode 100644 index 0000000000..f7d2e96ca1 --- /dev/null +++ b/src/main/java/gregtech/common/render/FlaskRenderer.java @@ -0,0 +1,71 @@ +package gregtech.common.render; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.common.items.ItemVolumetricFlask; + +@SideOnly(Side.CLIENT) +public final class FlaskRenderer implements IItemRenderer { + + public FlaskRenderer() { + MinecraftForgeClient.registerItemRenderer(ItemList.VOLUMETRIC_FLASK.getItem(), this); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type != ItemRenderType.FIRST_PERSON_MAP; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING + || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + ItemVolumetricFlask cell = (ItemVolumetricFlask) item.getItem(); + IIcon icon = item.getIconIndex(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GTRenderUtil.applyStandardItemTransform(type); + + FluidStack fs = cell != null ? cell.getFluid(item) : null; + if (fs != null) { + IIcon iconWindow = cell.iconWindow; + Fluid fluid = fs.getFluid(); + IIcon fluidIcon = fluid.getIcon(fs); + int fluidColor = fluid.getColor(fs); + + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); + GL11.glBlendFunc(GL11.GL_ZERO, GL11.GL_ONE); + GTRenderUtil.renderItem(type, iconWindow); + + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor); + GTRenderUtil.renderItem(type, fluidIcon); + GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GTRenderUtil.renderItem(type, icon); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_BLEND); + } +} diff --git a/src/main/java/gregtech/common/render/FluidDisplayStackRenderer.java b/src/main/java/gregtech/common/render/FluidDisplayStackRenderer.java new file mode 100644 index 0000000000..80e2cbe6a6 --- /dev/null +++ b/src/main/java/gregtech/common/render/FluidDisplayStackRenderer.java @@ -0,0 +1,98 @@ +package gregtech.common.render; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; + +import org.lwjgl.opengl.GL11; + +import appeng.util.ReadableNumberConverter; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.common.items.ItemFluidDisplay; + +@SideOnly(Side.CLIENT) +public class FluidDisplayStackRenderer implements IItemRenderer { + + public FluidDisplayStackRenderer() { + MinecraftForgeClient.registerItemRenderer(ItemList.Display_Fluid.getItem(), this); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + if (!item.hasTagCompound()) return false; + return type == ItemRenderType.INVENTORY; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + // not sure what this does. + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + if (item == null || item.getItem() == null || !(item.getItem() instanceof ItemFluidDisplay)) return; + + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + Materials associatedFluidMaterial = Materials.get(item.stackTagCompound.getString("mFluidMaterialName")); + if (associatedFluidMaterial.renderer == null + || !associatedFluidMaterial.renderer.renderFluidDisplayItem(type, item, data)) { + IIcon icon = item.getItem() + .getIconFromDamage(item.getItemDamage()); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + // draw a simple rectangle for the inventory icon + final float x_min = icon.getMinU(); + final float x_max = icon.getMaxU(); + final float y_min = icon.getMinV(); + final float y_max = icon.getMaxV(); + tess.addVertexWithUV(0, 16, 0, x_min, y_max); + tess.addVertexWithUV(16, 16, 0, x_max, y_max); + tess.addVertexWithUV(16, 0, 0, x_max, y_min); + tess.addVertexWithUV(0, 0, 0, x_min, y_min); + tess.draw(); + } + + if (item.getTagCompound() == null) { + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + return; + } + + // Render Fluid amount text + long fluidAmount = item.getTagCompound() + .getLong("mFluidDisplayAmount"); + if (fluidAmount > 0L && !item.getTagCompound() + .getBoolean("mHideStackSize")) { + String amountString; + + if (fluidAmount < 10_000) { + amountString = "" + fluidAmount + "L"; + } else { + amountString = ReadableNumberConverter.INSTANCE.toWideReadableForm(fluidAmount) + "L"; + } + + FontRenderer fontRender = Minecraft.getMinecraft().fontRenderer; + float smallTextScale = fontRender.getUnicodeFlag() ? 3F / 4F : 1F / 2F; + GL11.glDisable(GL11.GL_BLEND); + GL11.glPushMatrix(); + GL11.glScalef(smallTextScale, smallTextScale, 1.0f); + + fontRender + .drawString(amountString, 0, (int) (16 / smallTextScale) - fontRender.FONT_HEIGHT + 1, 0xFFFFFF, true); + GL11.glPopMatrix(); + GL11.glDisable(GL11.GL_ALPHA_TEST); + } + } +} diff --git a/src/main/java/gregtech/common/render/GTCapeRenderer.java b/src/main/java/gregtech/common/render/GTCapeRenderer.java new file mode 100644 index 0000000000..ea8e0a37cd --- /dev/null +++ b/src/main/java/gregtech/common/render/GTCapeRenderer.java @@ -0,0 +1,148 @@ +package gregtech.common.render; + +import java.util.Collection; + +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderPlayerEvent; + +import org.lwjgl.opengl.GL11; + +import gregtech.api.enums.GTValues; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; + +public class GTCapeRenderer extends RenderPlayer { + + private final ResourceLocation[] mCapes = { new ResourceLocation("gregtech:textures/BrainTechCape.png"), + new ResourceLocation("gregtech:textures/GregTechCape.png"), + new ResourceLocation("gregtech:textures/MrBrainCape.png"), + new ResourceLocation("gregtech:textures/GregoriusCape.png"), + new ResourceLocation("gregtech:textures/DonorCape.png"), new ResourceLocation("gregtech:textures/DevCape.png"), + new ResourceLocation("gregtech:textures/Steam.png"), new ResourceLocation("gregtech:textures/Titanium.png"), + new ResourceLocation("gregtech:textures/Neutronium.png"), + new ResourceLocation("gregtech:textures/Stargate.png") }; + private final Collection mCapeList; + + public GTCapeRenderer(Collection aCapeList) { + this.mCapeList = aCapeList; + setRenderManager(RenderManager.instance); + } + + public void receiveRenderSpecialsEvent(RenderPlayerEvent.Specials.Pre aEvent) { + AbstractClientPlayer aPlayer = (AbstractClientPlayer) aEvent.entityPlayer; + if (GTUtility.getFullInvisibility(aPlayer)) { + aEvent.setCanceled(true); + return; + } + float aPartialTicks = aEvent.partialRenderTick; + if (aPlayer.isInvisible()) { + return; + } + if (GTUtility.getPotion(aPlayer, Potion.invisibility.id)) { + return; + } + try { + ResourceLocation tResource = aPlayer.getLocationCape(); + if (aPlayer.getDisplayName() + .equalsIgnoreCase("Friedi4321")) { + tResource = this.mCapes[0]; + } + if (this.mCapeList.contains( + aPlayer.getDisplayName() + .toLowerCase())) { + tResource = this.mCapes[1]; + } + if (aPlayer.getDisplayName() + .equalsIgnoreCase("Mr_Brain")) { + tResource = this.mCapes[2]; + } + if (aPlayer.getDisplayName() + .equalsIgnoreCase("GregoriusT")) { + tResource = this.mCapes[3]; + } + if (this.mCapeList.contains( + aPlayer.getDisplayName() + .toLowerCase() + ":capedonor")) { + tResource = this.mCapes[4]; + } + if (this.mCapeList.contains( + aPlayer.getDisplayName() + .toLowerCase() + ":capedev")) { + tResource = this.mCapes[5]; + } + if (this.mCapeList.contains( + aPlayer.getDisplayName() + .toLowerCase() + ":cape_steam")) { + tResource = this.mCapes[6]; + } + if (this.mCapeList.contains( + aPlayer.getDisplayName() + .toLowerCase() + ":cape_titanium")) { + tResource = this.mCapes[7]; + } + if (this.mCapeList.contains( + aPlayer.getDisplayName() + .toLowerCase() + ":cape_neutronium")) { + tResource = this.mCapes[8]; + } + if (this.mCapeList.contains( + aPlayer.getDisplayName() + .toLowerCase() + ":cape_stargate")) { + tResource = this.mCapes[9]; + } + + if ((tResource != null) && (!aPlayer.getHideCape())) { + bindTexture(tResource); + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 0.0F, 0.125F); + double d0 = aPlayer.field_71091_bM + (aPlayer.field_71094_bP - aPlayer.field_71091_bM) * aPartialTicks + - (aPlayer.prevPosX + (aPlayer.posX - aPlayer.prevPosX) * aPartialTicks); + double d1 = aPlayer.field_71096_bN + (aPlayer.field_71095_bQ - aPlayer.field_71096_bN) * aPartialTicks + - (aPlayer.prevPosY + (aPlayer.posY - aPlayer.prevPosY) * aPartialTicks); + double d2 = aPlayer.field_71097_bO + (aPlayer.field_71085_bR - aPlayer.field_71097_bO) * aPartialTicks + - (aPlayer.prevPosZ + (aPlayer.posZ - aPlayer.prevPosZ) * aPartialTicks); + float f6 = aPlayer.prevRenderYawOffset + + (aPlayer.renderYawOffset - aPlayer.prevRenderYawOffset) * aPartialTicks; + double d3 = MathHelper.sin(f6 * (float) Math.PI / 180.0F); + double d4 = -MathHelper.cos(f6 * (float) Math.PI / 180.0F); + float f7 = (float) d1 * 10.0F; + float f8 = (float) (d0 * d3 + d2 * d4) * 100.0F; + float f9 = (float) (d0 * d4 - d2 * d3) * 100.0F; + if (f7 < -6.0F) { + f7 = -6.0F; + } + if (f7 > 32.0F) { + f7 = 32.0F; + } + if (f8 < 0.0F) { + f8 = 0.0F; + } + float f10 = aPlayer.prevCameraYaw + (aPlayer.cameraYaw - aPlayer.prevCameraYaw) * aPartialTicks; + f7 += MathHelper.sin( + (aPlayer.prevDistanceWalkedModified + + (aPlayer.distanceWalkedModified - aPlayer.prevDistanceWalkedModified) * aPartialTicks) * 6.0F) + * 32.0F + * f10; + if (aPlayer.isSneaking()) { + f7 += 25.0F; + } + GL11.glRotatef(6.0F + f8 / 2.0F + f7, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(f9 / 2.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-f9 / 2.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + ((ModelBiped) this.mainModel).renderCloak(0.0625F); + GL11.glPopMatrix(); + } + } catch (Throwable e) { + if (GTValues.D1) { + e.printStackTrace(GTLog.err); + } + } + } +} diff --git a/src/main/java/gregtech/common/render/GTCopiedBlockTextureRender.java b/src/main/java/gregtech/common/render/GTCopiedBlockTextureRender.java new file mode 100644 index 0000000000..ab4282c7ba --- /dev/null +++ b/src/main/java/gregtech/common/render/GTCopiedBlockTextureRender.java @@ -0,0 +1,112 @@ +package gregtech.common.render; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.util.IIcon; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.IBlockContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.util.LightingHelper; + +public class GTCopiedBlockTextureRender extends GTTextureBase implements ITexture, IBlockContainer { + + private final Block mBlock; + private final byte mSide, mMeta; + + protected GTCopiedBlockTextureRender(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean allowAlpha) { + if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_CopiedBlockTexture"); + mBlock = aBlock; + mSide = (byte) ordinalSide; + mMeta = (byte) aMeta; + } + + @Override + public boolean isOldTexture() { + return false; + } + + private IIcon getIcon(int ordinalSide) { + if (mSide == 6) return mBlock.getIcon(ordinalSide, mMeta); + return mBlock.getIcon(mSide, mMeta); + } + + @Override + public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + final IIcon aIcon = getIcon(ForgeDirection.EAST.ordinal()); + aRenderer.field_152631_f = true; + startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f); + new LightingHelper(aRenderer).setupLightingXPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.EAST, 0xffffff); + aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + aRenderer.field_152631_f = false; + } + + @Override + public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f); + final IIcon aIcon = getIcon(ForgeDirection.WEST.ordinal()); + new LightingHelper(aRenderer).setupLightingXNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.WEST, 0xffffff); + aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f); + final IIcon aIcon = getIcon(ForgeDirection.UP.ordinal()); + new LightingHelper(aRenderer).setupLightingYPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.UP, 0xffffff); + aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f); + final IIcon aIcon = getIcon(ForgeDirection.DOWN.ordinal()); + new LightingHelper(aRenderer).setupLightingYNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.DOWN, 0xffffff); + aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f); + final IIcon aIcon = getIcon(ForgeDirection.SOUTH.ordinal()); + new LightingHelper(aRenderer).setupLightingZPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.SOUTH, 0xffffff); + aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f); + final IIcon aIcon = getIcon(ForgeDirection.NORTH.ordinal()); + aRenderer.field_152631_f = true; + new LightingHelper(aRenderer).setupLightingZNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.NORTH, 0xffffff); + aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + aRenderer.field_152631_f = false; + } + + @Override + public boolean isValidTexture() { + return mBlock != null; + } + + @Override + public Block getBlock() { + return mBlock; + } + + @Override + public byte getMeta() { + return mMeta; + } +} diff --git a/src/main/java/gregtech/common/render/GTCopiedCTMBlockTexture.java b/src/main/java/gregtech/common/render/GTCopiedCTMBlockTexture.java new file mode 100644 index 0000000000..d3f6292435 --- /dev/null +++ b/src/main/java/gregtech/common/render/GTCopiedCTMBlockTexture.java @@ -0,0 +1,118 @@ +package gregtech.common.render; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.util.IIcon; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.IBlockContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.util.GTRenderingWorld; +import gregtech.api.util.LightingHelper; + +class GTCopiedCTMBlockTexture extends GTTextureBase implements ITexture, IBlockContainer { + + private final Block mBlock; + private final byte mSide, mMeta; + + GTCopiedCTMBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean allowAlpha) { + if (aRGBa.length != 4) + throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_CopiedCTMBlockTexture"); + mBlock = aBlock; + mSide = (byte) ordinalSide; + mMeta = (byte) aMeta; + } + + @Override + public boolean isOldTexture() { + return false; + } + + private IIcon getIcon(int ordinalSide, int aX, int aY, int aZ, RenderBlocks aRenderer) { + final int tSide = mSide == 6 ? ordinalSide : mSide; + return mBlock.getIcon(getBlockAccess(aRenderer), aX, aY, aZ, tSide); + } + + private GTRenderingWorld getBlockAccess(RenderBlocks aRenderer) { + return GTRenderingWorld.getInstance(aRenderer.blockAccess); + } + + @Override + public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + final IIcon aIcon = getIcon(ForgeDirection.EAST.ordinal(), aX, aY, aZ, aRenderer); + aRenderer.field_152631_f = true; + startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f); + new LightingHelper(aRenderer).setupLightingXPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.EAST, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); + aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + aRenderer.field_152631_f = false; + } + + @Override + public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f); + final IIcon aIcon = getIcon(ForgeDirection.WEST.ordinal(), aX, aY, aZ, aRenderer); + new LightingHelper(aRenderer).setupLightingXNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.WEST, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); + aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f); + final IIcon aIcon = getIcon(ForgeDirection.UP.ordinal(), aX, aY, aZ, aRenderer); + new LightingHelper(aRenderer).setupLightingYPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.UP, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); + aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f); + final IIcon aIcon = getIcon(ForgeDirection.DOWN.ordinal(), aX, aY, aZ, aRenderer); + new LightingHelper(aRenderer).setupLightingYNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.DOWN, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); + aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f); + final IIcon aIcon = getIcon(ForgeDirection.SOUTH.ordinal(), aX, aY, aZ, aRenderer); + new LightingHelper(aRenderer).setupLightingZPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.SOUTH, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); + aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + } + + @Override + public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f); + final IIcon aIcon = getIcon(ForgeDirection.NORTH.ordinal(), aX, aY, aZ, aRenderer); + aRenderer.field_152631_f = true; + new LightingHelper(aRenderer).setupLightingZNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.NORTH, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); + aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon); + draw(aRenderer); + aRenderer.field_152631_f = false; + } + + @Override + public boolean isValidTexture() { + return mBlock != null; + } + + @Override + public Block getBlock() { + return mBlock; + } + + @Override + public byte getMeta() { + return mMeta; + } +} diff --git a/src/main/java/gregtech/common/render/GTIconFlipped.java b/src/main/java/gregtech/common/render/GTIconFlipped.java new file mode 100644 index 0000000000..261e5e63b2 --- /dev/null +++ b/src/main/java/gregtech/common/render/GTIconFlipped.java @@ -0,0 +1,91 @@ +package gregtech.common.render; + +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GTIconFlipped implements IIcon { + + private final IIcon baseIcon; + private final boolean flipU; + private final boolean flipV; + + public GTIconFlipped(IIcon baseIcon, boolean flipU, boolean flipV) { + this.baseIcon = baseIcon; + this.flipU = flipU; + this.flipV = flipV; + } + + /** + * Returns the width of the icon, in pixels. + */ + @Override + public int getIconWidth() { + return this.baseIcon.getIconWidth(); + } + + /** + * Returns the height of the icon, in pixels. + */ + @Override + public int getIconHeight() { + return this.baseIcon.getIconHeight(); + } + + /** + * Returns the minimum U coordinate to use when rendering with this icon. + */ + @Override + public float getMinU() { + return this.flipU ? this.baseIcon.getMaxU() : this.baseIcon.getMinU(); + } + + /** + * Returns the maximum U coordinate to use when rendering with this icon. + */ + @Override + public float getMaxU() { + return this.flipU ? this.baseIcon.getMinU() : this.baseIcon.getMaxU(); + } + + /** + * Gets a U coordinate on the icon. 0 returns uMin and 16 returns uMax. Other arguments return in-between values. + */ + @Override + public float getInterpolatedU(double p_94214_1_) { + final float f = this.getMaxU() - this.getMinU(); + return this.getMinU() + f * ((float) p_94214_1_ / 16.0F); + } + + /** + * Returns the minimum V coordinate to use when rendering with this icon. + */ + @Override + public float getMinV() { + return this.flipV ? this.baseIcon.getMaxV() : this.baseIcon.getMinV(); + } + + /** + * Returns the maximum V coordinate to use when rendering with this icon. + */ + @Override + public float getMaxV() { + return this.flipV ? this.baseIcon.getMinV() : this.baseIcon.getMaxV(); + } + + /** + * Gets a V coordinate on the icon. 0 returns vMin and 16 returns vMax. Other arguments return in-between values. + */ + @Override + public float getInterpolatedV(double p_94207_1_) { + final float f = this.getMaxV() - this.getMinV(); + return this.getMinV() + f * ((float) p_94207_1_ / 16.0F); + } + + @Override + public String getIconName() { + return this.baseIcon.getIconName(); + } +} diff --git a/src/main/java/gregtech/common/render/GTMultiTextureRender.java b/src/main/java/gregtech/common/render/GTMultiTextureRender.java new file mode 100644 index 0000000000..1eaf4c69e3 --- /dev/null +++ b/src/main/java/gregtech/common/render/GTMultiTextureRender.java @@ -0,0 +1,69 @@ +package gregtech.common.render; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; + +import gregtech.GTMod; +import gregtech.api.interfaces.ITexture; + +/** + *

+ * Lets Multiple ITextures Render overlay over each other.< + *

+ *

+ * I should have done this much earlier... + *

+ */ +public class GTMultiTextureRender extends GTTextureBase implements ITexture { + + protected final ITexture[] mTextures; + + public static GTMultiTextureRender get(ITexture... aTextures) { + return GTMod.instance.isClientSide() ? new GTMultiTextureRender(aTextures) : null; + } + + protected GTMultiTextureRender(ITexture... aTextures) { + mTextures = aTextures; + } + + @Override + public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + for (ITexture tTexture : mTextures) + if (tTexture != null && tTexture.isValidTexture()) tTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + for (ITexture tTexture : mTextures) + if (tTexture != null && tTexture.isValidTexture()) tTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + for (ITexture tTexture : mTextures) + if (tTexture != null && tTexture.isValidTexture()) tTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + for (ITexture tTexture : mTextures) + if (tTexture != null && tTexture.isValidTexture()) tTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + for (ITexture tTexture : mTextures) + if (tTexture != null && tTexture.isValidTexture()) tTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + for (ITexture tTexture : mTextures) + if (tTexture != null && tTexture.isValidTexture()) tTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public boolean isValidTexture() { + return true; + } +} diff --git a/src/main/java/gregtech/common/render/GTRenderUtil.java b/src/main/java/gregtech/common/render/GTRenderUtil.java new file mode 100644 index 0000000000..650d827cff --- /dev/null +++ b/src/main/java/gregtech/common/render/GTRenderUtil.java @@ -0,0 +1,141 @@ +package gregtech.common.render; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; + +public class GTRenderUtil { + + public static void colorGTItem(ItemStack aStack) { + if (aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem) { + + short[] tModulation = aItem.getRGBa(aStack); + GL11.glColor4f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F, 255.0f); + } else { + System.out.println("WARNING: " + aStack.getDisplayName() + " does not have an associated GT colour."); + } + } + + public static void renderBlockIcon(RenderBlocks aRenderer, Block aBlock, double aX, double aY, double aZ, + IIcon aIcon, ForgeDirection side) { + switch (side) { + case DOWN -> aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon); + case UP -> aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon); + case NORTH -> aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon); + case SOUTH -> aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon); + case WEST -> aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon); + case EAST -> aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon); + } + } + + public static void renderItemIcon(IIcon icon, double size, double z, float nx, float ny, float nz) { + renderItemIcon(icon, 0.0D, 0.0D, size, size, z, nx, ny, nz); + } + + public static void renderItemIcon(IIcon icon, double xStart, double yStart, double xEnd, double yEnd, double z, + float nx, float ny, float nz) { + if (icon == null) { + return; + } + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(nx, ny, nz); + if (nz > 0.0F) { + Tessellator.instance.addVertexWithUV(xStart, yStart, z, icon.getMinU(), icon.getMinV()); + Tessellator.instance.addVertexWithUV(xEnd, yStart, z, icon.getMaxU(), icon.getMinV()); + Tessellator.instance.addVertexWithUV(xEnd, yEnd, z, icon.getMaxU(), icon.getMaxV()); + Tessellator.instance.addVertexWithUV(xStart, yEnd, z, icon.getMinU(), icon.getMaxV()); + } else { + Tessellator.instance.addVertexWithUV(xStart, yEnd, z, icon.getMinU(), icon.getMaxV()); + Tessellator.instance.addVertexWithUV(xEnd, yEnd, z, icon.getMaxU(), icon.getMaxV()); + Tessellator.instance.addVertexWithUV(xEnd, yStart, z, icon.getMaxU(), icon.getMinV()); + Tessellator.instance.addVertexWithUV(xStart, yStart, z, icon.getMinU(), icon.getMinV()); + } + Tessellator.instance.draw(); + } + + @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock") + public static void renderItem(IItemRenderer.ItemRenderType type, IIcon icon) { + Tessellator tessellator = Tessellator.instance; + float maxU = icon.getMaxU(); + float minV = icon.getMinV(); + float minU = icon.getMinU(); + float maxV = icon.getMaxV(); + + switch (type) { + case ENTITY -> { + if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + ItemRenderer.renderItemIn2D( + tessellator, + maxU, + minV, + minU, + maxV, + icon.getIconWidth(), + icon.getIconHeight(), + 0.0625F); + } else { + GL11.glPushMatrix(); + + if (!RenderItem.renderInFrame) { + GL11.glRotatef(180.0F - RenderManager.instance.playerViewY, 0.0F, 1.0F, 0.0F); + } + + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + tessellator.addVertexWithUV(0.0F - 0.5F, 0.0F - 0.25F, 0.0D, minU, maxV); + tessellator.addVertexWithUV(1.0F - 0.5F, 0.0F - 0.25F, 0.0D, maxU, maxV); + tessellator.addVertexWithUV(1.0F - 0.5F, 1.0F - 0.25F, 0.0D, maxU, minV); + tessellator.addVertexWithUV(0.0F - 0.5F, 1.0F - 0.25F, 0.0D, minU, minV); + tessellator.draw(); + + GL11.glPopMatrix(); + } + } + case EQUIPPED, EQUIPPED_FIRST_PERSON -> { + ItemRenderer.renderItemIn2D( + tessellator, + maxU, + minV, + minU, + maxV, + icon.getIconWidth(), + icon.getIconHeight(), + 0.0625F); + } + case INVENTORY -> { + renderItemIcon(icon, 16.0D, 0.001, 0.0F, 0.0F, -1.0F); + } + default -> {} + } + } + + public static void applyStandardItemTransform(IItemRenderer.ItemRenderType type) { + if (type == IItemRenderer.ItemRenderType.ENTITY) { + if (RenderItem.renderInFrame) { + // Magic numbers calculated from vanilla code + GL11.glScalef(1.025641F, 1.025641F, 1.025641F); + GL11.glTranslatef(0.0F, -0.05F, 0.0F); + } + + if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + if (RenderItem.renderInFrame) { + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + } + // Magic numbers calculated from vanilla code + GL11.glTranslatef(-0.5F, -0.25F, 0.0421875F); + } + } + } +} diff --git a/src/main/java/gregtech/common/render/GTRenderedTexture.java b/src/main/java/gregtech/common/render/GTRenderedTexture.java new file mode 100644 index 0000000000..3bd4e6d864 --- /dev/null +++ b/src/main/java/gregtech/common/render/GTRenderedTexture.java @@ -0,0 +1,395 @@ +package gregtech.common.render; + +import static gregtech.api.util.LightingHelper.MAX_BRIGHTNESS; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.alignment.IAlignment; +import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; +import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; + +import gregtech.GTMod; +import gregtech.api.interfaces.IColorModulationContainer; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.LightingHelper; + +public class GTRenderedTexture extends GTTextureBase implements ITexture, IColorModulationContainer { + + protected final IIconContainer mIconContainer; + private final short[] mRGBa; + private final boolean glow; + private final boolean stdOrient; + private final boolean useExtFacing; + + protected GTRenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean allowAlpha, boolean glow, + boolean stdOrient, boolean extFacing) { + if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture"); + mIconContainer = aIcon; + mRGBa = aRGBa; + this.glow = glow; + this.stdOrient = stdOrient; + this.useExtFacing = extFacing; + } + + @Override + public boolean isOldTexture() { + return false; + } + + @Override + public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f); + final boolean enableAO = aRenderer.enableAO; + final LightingHelper lighting = new LightingHelper(aRenderer); + if (glow) { + if (!GTMod.gregtechproxy.mRenderGlowTextures) { + draw(aRenderer); + return; + } + aRenderer.enableAO = false; + lighting.setLightnessOverride(1.0F); + if (enableAO) lighting.setBrightnessOverride(MAX_BRIGHTNESS); + } + lighting.setupLightingXPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.EAST, mRGBa); + final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); + renderFaceXPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); + if (mIconContainer.getOverlayIcon() != null) { + lighting.setupColor(ForgeDirection.EAST, 0xffffff); + renderFaceXPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); + } + aRenderer.enableAO = enableAO; + draw(aRenderer); + } + + @Override + public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f); + final boolean enableAO = aRenderer.enableAO; + final LightingHelper lighting = new LightingHelper(aRenderer); + if (glow) { + if (!GTMod.gregtechproxy.mRenderGlowTextures) { + draw(aRenderer); + return; + } + aRenderer.enableAO = false; + lighting.setLightnessOverride(1.0F); + lighting.setBrightnessOverride(MAX_BRIGHTNESS); + } + lighting.setupLightingXNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.WEST, mRGBa); + final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); + renderFaceXNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); + if (mIconContainer.getOverlayIcon() != null) { + lighting.setupColor(ForgeDirection.WEST, 0xffffff); + renderFaceXNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); + } + aRenderer.enableAO = enableAO; + draw(aRenderer); + } + + @Override + public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f); + final boolean enableAO = aRenderer.enableAO; + final LightingHelper lighting = new LightingHelper(aRenderer); + if (glow) { + if (!GTMod.gregtechproxy.mRenderGlowTextures) { + draw(aRenderer); + return; + } + aRenderer.enableAO = false; + lighting.setLightnessOverride(1.0F); + lighting.setBrightnessOverride(MAX_BRIGHTNESS); + } + lighting.setupLightingYPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.UP, mRGBa); + final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); + renderFaceYPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); + if (mIconContainer.getOverlayIcon() != null) { + lighting.setupColor(ForgeDirection.UP, 0xffffff); + renderFaceYPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); + } + aRenderer.enableAO = enableAO; + draw(aRenderer); + } + + @Override + public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f); + final boolean enableAO = aRenderer.enableAO; + final LightingHelper lighting = new LightingHelper(aRenderer); + if (glow) { + if (!GTMod.gregtechproxy.mRenderGlowTextures) { + draw(aRenderer); + return; + } + aRenderer.enableAO = false; + lighting.setLightnessOverride(1.0F); + lighting.setBrightnessOverride(MAX_BRIGHTNESS); + } + lighting.setupLightingYNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.DOWN, mRGBa); + final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); + renderFaceYNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); + if (mIconContainer.getOverlayIcon() != null) { + Tessellator.instance.setColorRGBA(255, 255, 255, 255); + renderFaceYNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); + } + aRenderer.enableAO = enableAO; + draw(aRenderer); + } + + @Override + public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f); + final boolean enableAO = aRenderer.enableAO; + final LightingHelper lighting = new LightingHelper(aRenderer); + if (glow) { + if (!GTMod.gregtechproxy.mRenderGlowTextures) { + draw(aRenderer); + return; + } + aRenderer.enableAO = false; + lighting.setLightnessOverride(1.0F); + lighting.setBrightnessOverride(MAX_BRIGHTNESS); + } + lighting.setupLightingZPos(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.SOUTH, mRGBa); + final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); + renderFaceZPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); + if (mIconContainer.getOverlayIcon() != null) { + lighting.setupColor(ForgeDirection.SOUTH, 0xffffff); + renderFaceZPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); + } + aRenderer.enableAO = enableAO; + draw(aRenderer); + } + + @Override + public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f); + final boolean enableAO = aRenderer.enableAO; + final LightingHelper lighting = new LightingHelper(aRenderer); + if (glow) { + if (!GTMod.gregtechproxy.mRenderGlowTextures) { + draw(aRenderer); + return; + } + aRenderer.enableAO = false; + lighting.setLightnessOverride(1.0F); + lighting.setBrightnessOverride(MAX_BRIGHTNESS); + } + lighting.setupLightingZNeg(aBlock, aX, aY, aZ) + .setupColor(ForgeDirection.NORTH, mRGBa); + final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); + renderFaceZNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); + if (mIconContainer.getOverlayIcon() != null) { + lighting.setupColor(ForgeDirection.NORTH, 0xffffff); + renderFaceZNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); + } + aRenderer.enableAO = enableAO; + draw(aRenderer); + } + + @Override + public short[] getRGBA() { + return mRGBa; + } + + @Override + public boolean isValidTexture() { + return mIconContainer != null; + } + + /** + * Renders the given texture to the bottom face of the block. Args: block, x, y, z, texture + */ + protected void renderFaceYNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, + ExtendedFacing extendedFacing) { + + switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { + case COUNTER_CLOCKWISE -> aRenderer.uvRotateBottom = 2; + case CLOCKWISE -> aRenderer.uvRotateBottom = 1; + case UPSIDE_DOWN -> aRenderer.uvRotateBottom = 3; + default -> aRenderer.uvRotateBottom = 0; + } + + final Flip aFlip = extendedFacing.getFlip(); + aRenderer.renderFaceYNeg( + Blocks.air, + x, + y, + z, + useExtFacing && GTMod.gregtechproxy.mRenderFlippedMachinesFlipped + ? new GTIconFlipped(icon, aFlip.isHorizontallyFlipped() ^ !stdOrient, aFlip.isVerticallyFliped()) + : new GTIconFlipped(icon, !stdOrient, false)); + aRenderer.uvRotateBottom = 0; + } + + /** + * Renders the given texture to the top face of the block. Args: block, x, y, z, texture + */ + protected void renderFaceYPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, + ExtendedFacing extendedFacing) { + + switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { + case COUNTER_CLOCKWISE -> aRenderer.uvRotateTop = 2; + case CLOCKWISE -> aRenderer.uvRotateTop = 1; + case UPSIDE_DOWN -> aRenderer.uvRotateTop = 3; + default -> aRenderer.uvRotateTop = 0; + } + + final Flip aFlip = extendedFacing.getFlip(); + aRenderer.renderFaceYPos( + Blocks.air, + x, + y, + z, + useExtFacing && GTMod.gregtechproxy.mRenderFlippedMachinesFlipped + ? new GTIconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) + : icon); + aRenderer.uvRotateTop = 0; + } + + /** + * Renders the given texture to the north (z-negative) face of the block. Args: block, x, y, z, texture + */ + protected void renderFaceZNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, + ExtendedFacing extendedFacing) { + aRenderer.field_152631_f = true; + // **NOT A BUG**: aRenderer.uvRotateEast REALLY CONTROLS THE ROTATION OF THE NORTH SIDE + switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { + case COUNTER_CLOCKWISE -> aRenderer.uvRotateEast = 2; + case CLOCKWISE -> aRenderer.uvRotateEast = 1; + case UPSIDE_DOWN -> aRenderer.uvRotateEast = 3; + default -> aRenderer.uvRotateEast = 0; + } + + final Flip aFlip = extendedFacing.getFlip(); + aRenderer.renderFaceZNeg( + Blocks.air, + x, + y, + z, + useExtFacing && GTMod.gregtechproxy.mRenderFlippedMachinesFlipped + ? new GTIconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) + : icon); + aRenderer.uvRotateEast = 0; + aRenderer.field_152631_f = false; + } + + /** + * Renders the given texture to the south (z-positive) face of the block. Args: block, x, y, z, texture + */ + protected void renderFaceZPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, + ExtendedFacing extendedFacing) { + // **NOT A BUG**: aRenderer.uvRotateWest REALLY CONTROLS THE ROTATION OF THE SOUTH SIDE + switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { + case COUNTER_CLOCKWISE -> aRenderer.uvRotateWest = 2; + case CLOCKWISE -> aRenderer.uvRotateWest = 1; + case UPSIDE_DOWN -> aRenderer.uvRotateWest = 3; + default -> aRenderer.uvRotateWest = 0; + } + + final Flip aFlip = extendedFacing.getFlip(); + aRenderer.renderFaceZPos( + Blocks.air, + x, + y, + z, + useExtFacing && GTMod.gregtechproxy.mRenderFlippedMachinesFlipped + ? new GTIconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) + : icon); + aRenderer.uvRotateWest = 0; + } + + /** + * Renders the given texture to the west (x-negative) face of the block. Args: block, x, y, z, texture + */ + protected void renderFaceXNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, + ExtendedFacing extendedFacing) { + // **NOT A BUG**: aRenderer.uvRotateNorth REALLY CONTROLS THE ROTATION OF THE WEST SIDE + switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { + case COUNTER_CLOCKWISE -> aRenderer.uvRotateNorth = 2; + case CLOCKWISE -> aRenderer.uvRotateNorth = 1; + case UPSIDE_DOWN -> aRenderer.uvRotateNorth = 3; + default -> aRenderer.uvRotateNorth = 0; + } + + final Flip aFlip = extendedFacing.getFlip(); + aRenderer.renderFaceXNeg( + Blocks.air, + x, + y, + z, + useExtFacing && GTMod.gregtechproxy.mRenderFlippedMachinesFlipped + ? new GTIconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) + : icon); + aRenderer.uvRotateNorth = 0; + } + + /** + * Renders the given texture to the east (x-positive) face of the block. Args: block, x, y, z, texture + */ + protected void renderFaceXPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, + ExtendedFacing extendedFacing) { + aRenderer.field_152631_f = true; + // **NOT A BUG**: aRenderer.uvRotateSouth REALLY CONTROLS THE ROTATION OF THE EAST SIDE + switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { + case COUNTER_CLOCKWISE -> aRenderer.uvRotateSouth = 2; + case CLOCKWISE -> aRenderer.uvRotateSouth = 1; + case UPSIDE_DOWN -> aRenderer.uvRotateSouth = 3; + default -> aRenderer.uvRotateSouth = 0; + } + + final Flip aFlip = extendedFacing.getFlip(); + aRenderer.renderFaceXPos( + Blocks.air, + x, + y, + z, + useExtFacing && GTMod.gregtechproxy.mRenderFlippedMachinesFlipped + ? new GTIconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) + : icon); + aRenderer.uvRotateSouth = 0; + aRenderer.field_152631_f = false; + } + + private ExtendedFacing getExtendedFacing(int x, int y, int z) { + if (stdOrient) return ExtendedFacing.DEFAULT; + final EntityPlayer player = GTMod.gregtechproxy.getThePlayer(); + if (player == null) return ExtendedFacing.DEFAULT; + final World w = player.getEntityWorld(); + if (w == null) return ExtendedFacing.DEFAULT; + final TileEntity te = w.getTileEntity(x, y, z); + IAlignment alignment = null; + if (te instanceof IGregTechTileEntity) { + final IMetaTileEntity meta = ((IGregTechTileEntity) te).getMetaTileEntity(); + if (meta instanceof IAlignmentProvider) { + alignment = ((IAlignmentProvider) meta).getAlignment(); + } else if (meta != null) { + return ExtendedFacing.of( + meta.getBaseMetaTileEntity() + .getFrontFacing()); + } + } else if (te instanceof IAlignmentProvider) { + alignment = ((IAlignmentProvider) te).getAlignment(); + } + if (alignment != null) return alignment.getExtendedFacing(); + return ExtendedFacing.DEFAULT; + } +} diff --git a/src/main/java/gregtech/common/render/GTRendererBlock.java b/src/main/java/gregtech/common/render/GTRendererBlock.java new file mode 100644 index 0000000000..1c8e2da29d --- /dev/null +++ b/src/main/java/gregtech/common/render/GTRendererBlock.java @@ -0,0 +1,779 @@ +package gregtech.common.render; + +import static gregtech.api.enums.GTValues.SIDE_DOWN; +import static gregtech.api.enums.GTValues.SIDE_EAST; +import static gregtech.api.enums.GTValues.SIDE_NORTH; +import static gregtech.api.enums.GTValues.SIDE_SOUTH; +import static gregtech.api.enums.GTValues.SIDE_UP; +import static gregtech.api.enums.GTValues.SIDE_WEST; +import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_DOWN; +import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_EAST; +import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_NORTH; +import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_SOUTH; +import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_UP; +import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_WEST; +import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_FRESHFOAM; +import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_HARDENEDFOAM; +import static gregtech.api.interfaces.metatileentity.IConnectable.NO_CONNECTION; +import static net.minecraftforge.common.util.ForgeDirection.DOWN; +import static net.minecraftforge.common.util.ForgeDirection.EAST; +import static net.minecraftforge.common.util.ForgeDirection.NORTH; +import static net.minecraftforge.common.util.ForgeDirection.SOUTH; +import static net.minecraftforge.common.util.ForgeDirection.UP; +import static net.minecraftforge.common.util.ForgeDirection.VALID_DIRECTIONS; +import static net.minecraftforge.common.util.ForgeDirection.WEST; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.client.particle.EntityDiggingFX; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity; +import gregtech.api.interfaces.tileentity.ITexturedTileEntity; +import gregtech.api.metatileentity.MetaPipeEntity; +import gregtech.api.objects.XSTR; +import gregtech.common.blocks.BlockFrameBox; +import gregtech.common.blocks.BlockMachines; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; + +@ThreadSafeISBRH(perThread = true) +public class GTRendererBlock implements ISimpleBlockRenderingHandler { + + public static final float blockMin = 0.0F; + public static final float blockMax = 1.0F; + private static final float coverThickness = blockMax / 8.0F; + private static final float coverInnerMin = blockMin + coverThickness; + private static final float coverInnerMax = blockMax - coverThickness; + + @Deprecated + public static GTRendererBlock INSTANCE; + public static int mRenderID; + + public static void register() { + mRenderID = RenderingRegistry.getNextAvailableRenderId(); + INSTANCE = new GTRendererBlock(); + RenderingRegistry.registerBlockHandler(INSTANCE); + } + + private final ITexture[][] textureArray = new ITexture[6][]; + + public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, + RenderBlocks aRenderer) { + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity instanceof IPipeRenderedTileEntity pipeRenderedTileEntity) { + textureArray[0] = pipeRenderedTileEntity.getTextureCovered(DOWN); + textureArray[1] = pipeRenderedTileEntity.getTextureCovered(UP); + textureArray[2] = pipeRenderedTileEntity.getTextureCovered(NORTH); + textureArray[3] = pipeRenderedTileEntity.getTextureCovered(SOUTH); + textureArray[4] = pipeRenderedTileEntity.getTextureCovered(WEST); + textureArray[5] = pipeRenderedTileEntity.getTextureCovered(EAST); + return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); + } + if (tTileEntity instanceof IAllSidedTexturedTileEntity allSidedTexturedTileEntity) { + ITexture[] texture = allSidedTexturedTileEntity.getTexture(aBlock); + textureArray[0] = texture; + textureArray[1] = texture; + textureArray[2] = texture; + textureArray[3] = texture; + textureArray[4] = texture; + textureArray[5] = texture; + return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); + } + if (tTileEntity instanceof ITexturedTileEntity texturedTileEntity) { + textureArray[0] = texturedTileEntity.getTexture(aBlock, DOWN); + textureArray[1] = texturedTileEntity.getTexture(aBlock, UP); + textureArray[2] = texturedTileEntity.getTexture(aBlock, NORTH); + textureArray[3] = texturedTileEntity.getTexture(aBlock, SOUTH); + textureArray[4] = texturedTileEntity.getTexture(aBlock, WEST); + textureArray[5] = texturedTileEntity.getTexture(aBlock, EAST); + return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); + } + + return false; + } + + public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, + RenderBlocks aRenderer, ITexture[][] aTextures) { + aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_DOWN], true); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_UP], true); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_NORTH], true); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_SOUTH], true); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_WEST], true); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_EAST], true); + return true; + } + + final ITexture[][] tIcons = new ITexture[VALID_DIRECTIONS.length][]; + final ITexture[][] tCovers = new ITexture[VALID_DIRECTIONS.length][]; + final boolean[] tIsCovered = new boolean[VALID_DIRECTIONS.length]; + + public boolean renderPipeBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, + IPipeRenderedTileEntity aTileEntity, RenderBlocks aRenderer) { + final byte aConnections = aTileEntity.getConnections(); + if ((aConnections & (HAS_FRESHFOAM | HAS_HARDENEDFOAM)) != 0) { + return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer); + } + final float thickness = aTileEntity.getThickNess(); + if (thickness >= 0.99F) { + return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer); + } + // Range of block occupied by pipe + final float pipeMin = (blockMax - thickness) / 2.0F; + final float pipeMax = blockMax - pipeMin; + + for (int i = 0; i < VALID_DIRECTIONS.length; i++) { + final ForgeDirection iSide = VALID_DIRECTIONS[i]; + tIsCovered[i] = (aTileEntity.getCoverIDAtSide(iSide) != 0); + tCovers[i] = aTileEntity.getTexture(aBlock, iSide); + tIcons[i] = aTileEntity.getTextureUncovered(iSide); + + } + + switch (aConnections) { + case NO_CONNECTION -> { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + } + case CONNECTED_EAST | CONNECTED_WEST -> { + // EAST - WEST Pipe Sides + aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, blockMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + + // EAST - WEST Pipe Ends + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + } + case CONNECTED_DOWN | CONNECTED_UP -> { + // UP - DOWN Pipe Sides + aBlock.setBlockBounds(pipeMin, blockMin, pipeMin, pipeMax, blockMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + + // UP - DOWN Pipe Ends + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + } + case CONNECTED_NORTH | CONNECTED_SOUTH -> { + // NORTH - SOUTH Pipe Sides + aBlock.setBlockBounds(pipeMin, pipeMin, blockMin, pipeMax, pipeMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + + // NORTH - SOUTH Pipe Ends + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + } + default -> { + if ((aConnections & CONNECTED_WEST) == 0) { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, pipeMin, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + } + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + if ((aConnections & CONNECTED_EAST) == 0) { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + aBlock.setBlockBounds(pipeMax, pipeMin, pipeMin, blockMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + } + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + if ((aConnections & CONNECTED_DOWN) == 0) { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + aBlock.setBlockBounds(pipeMin, blockMin, pipeMin, pipeMax, pipeMin, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + } + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + if ((aConnections & CONNECTED_UP) == 0) { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + aBlock.setBlockBounds(pipeMin, pipeMax, pipeMin, pipeMax, blockMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + } + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + if ((aConnections & CONNECTED_NORTH) == 0) { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + aBlock.setBlockBounds(pipeMin, pipeMin, blockMin, pipeMax, pipeMax, pipeMin); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + } + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); + if ((aConnections & CONNECTED_SOUTH) == 0) { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + aBlock.setBlockBounds(pipeMin, pipeMin, pipeMax, pipeMax, pipeMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); + } + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); + } + } + + // Render covers on pipes + if (tIsCovered[SIDE_DOWN]) { + aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, coverInnerMin, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + if (!tIsCovered[SIDE_NORTH]) { + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + } + if (!tIsCovered[SIDE_SOUTH]) { + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + } + if (!tIsCovered[SIDE_WEST]) { + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + } + if (!tIsCovered[SIDE_EAST]) { + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + } + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + if ((aConnections & CONNECTED_DOWN) != 0) { + // Split outer face to leave hole for pipe + // Lower panel + aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMax, blockMin, pipeMin); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + // Upper panel + aRenderer.setRenderBounds(blockMin, blockMin, pipeMax, blockMax, blockMin, blockMax); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + // Middle left panel + aRenderer.setRenderBounds(blockMin, blockMin, pipeMin, pipeMin, blockMin, pipeMax); + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + // Middle right panel + aRenderer.setRenderBounds(pipeMax, blockMin, pipeMin, blockMax, blockMin, pipeMax); + } + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); + } + + if (tIsCovered[SIDE_UP]) { + aBlock.setBlockBounds(blockMin, coverInnerMax, blockMin, blockMax, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + if (!tIsCovered[SIDE_NORTH]) { + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + } + if (!tIsCovered[SIDE_SOUTH]) { + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + } + if (!tIsCovered[SIDE_WEST]) { + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + } + if (!tIsCovered[SIDE_EAST]) { + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + } + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + if ((aConnections & CONNECTED_UP) != 0) { + // Split outer face to leave hole for pipe + // Lower panel + aRenderer.setRenderBounds(blockMin, blockMax, blockMin, blockMax, blockMax, pipeMin); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + // Upper panel + aRenderer.setRenderBounds(blockMin, blockMax, pipeMax, blockMax, blockMax, blockMax); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + // Middle left panel + aRenderer.setRenderBounds(blockMin, blockMax, pipeMin, pipeMin, blockMax, pipeMax); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + // Middle right panel + aRenderer.setRenderBounds(pipeMax, blockMax, pipeMin, blockMax, blockMax, pipeMax); + } + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); + } + + if (tIsCovered[SIDE_NORTH]) { + aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, coverInnerMin); + aRenderer.setRenderBoundsFromBlock(aBlock); + if (!tIsCovered[SIDE_DOWN]) { + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + } + if (!tIsCovered[SIDE_UP]) { + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + } + if (!tIsCovered[SIDE_WEST]) { + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + } + if (!tIsCovered[SIDE_EAST]) { + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + } + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + if ((aConnections & CONNECTED_NORTH) != 0) { + // Split outer face to leave hole for pipe + // Lower panel + aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMax, pipeMin, blockMin); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + // Upper panel + aRenderer.setRenderBounds(blockMin, pipeMax, blockMin, blockMax, blockMax, blockMin); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + // Middle left panel + aRenderer.setRenderBounds(blockMin, pipeMin, blockMin, pipeMin, pipeMax, blockMin); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + // Middle right panel + aRenderer.setRenderBounds(pipeMax, pipeMin, blockMin, blockMax, pipeMax, blockMin); + } + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); + } + + if (tIsCovered[SIDE_SOUTH]) { + aBlock.setBlockBounds(blockMin, blockMin, coverInnerMax, blockMax, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + if (!tIsCovered[SIDE_DOWN]) { + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + } + if (!tIsCovered[SIDE_UP]) { + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + } + if (!tIsCovered[SIDE_WEST]) { + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + } + if (!tIsCovered[SIDE_EAST]) { + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + } + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + if ((aConnections & CONNECTED_SOUTH) != 0) { + // Split outer face to leave hole for pipe + // Lower panel + aRenderer.setRenderBounds(blockMin, blockMin, blockMax, blockMax, pipeMin, blockMax); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + // Upper panel + aRenderer.setRenderBounds(blockMin, pipeMax, blockMax, blockMax, blockMax, blockMax); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + // Middle left panel + aRenderer.setRenderBounds(blockMin, pipeMin, blockMax, pipeMin, pipeMax, blockMax); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + // Middle right panel + aRenderer.setRenderBounds(pipeMax, pipeMin, blockMax, blockMax, pipeMax, blockMax); + } + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); + } + + if (tIsCovered[SIDE_WEST]) { + aBlock.setBlockBounds(blockMin, blockMin, blockMin, coverInnerMin, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + if (!tIsCovered[SIDE_DOWN]) { + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + } + if (!tIsCovered[SIDE_UP]) { + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + } + if (!tIsCovered[SIDE_NORTH]) { + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + } + if (!tIsCovered[SIDE_SOUTH]) { + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + } + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + if ((aConnections & CONNECTED_WEST) != 0) { + // Split outer face to leave hole for pipe + // Lower panel + aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMin, pipeMin, blockMax); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + // Upper panel + aRenderer.setRenderBounds(blockMin, pipeMax, blockMin, blockMin, blockMax, blockMax); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + // Middle left panel + aRenderer.setRenderBounds(blockMin, pipeMin, blockMin, blockMin, pipeMax, pipeMin); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + // Middle right panel + aRenderer.setRenderBounds(blockMin, pipeMin, pipeMax, blockMin, pipeMax, blockMax); + } + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); + } + + if (tIsCovered[SIDE_EAST]) { + aBlock.setBlockBounds(coverInnerMax, blockMin, blockMin, blockMax, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + if (!tIsCovered[SIDE_DOWN]) { + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + } + if (!tIsCovered[SIDE_UP]) { + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + } + if (!tIsCovered[SIDE_NORTH]) { + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + } + if (!tIsCovered[SIDE_SOUTH]) { + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + } + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + + if ((aConnections & CONNECTED_EAST) != 0) { + // Split outer face to leave hole for pipe + // Lower panel + aRenderer.setRenderBounds(blockMax, blockMin, blockMin, blockMax, pipeMin, blockMax); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + // Upper panel + aRenderer.setRenderBounds(blockMax, pipeMax, blockMin, blockMax, blockMax, blockMax); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + // Middle left panel + aRenderer.setRenderBounds(blockMax, pipeMin, blockMin, blockMax, pipeMax, pipeMin); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + // Middle right panel + aRenderer.setRenderBounds(blockMax, pipeMin, pipeMax, blockMax, pipeMax, blockMax); + } + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); + } + aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + + return true; + } + + @SideOnly(Side.CLIENT) + public static void addHitEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z, + int ordinalSide) { + double rX = x + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; + double rY = y + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; + double rZ = z + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; + if (ordinalSide == 0) { + rY = y - 0.1; + } else if (ordinalSide == 1) { + rY = y + 1.1; + } else if (ordinalSide == 2) { + rZ = z - 0.1; + } else if (ordinalSide == 3) { + rZ = z + 1.1; + } else if (ordinalSide == 4) { + rX = x - 0.1; + } else if (ordinalSide == 5) { + rX = x + 1.1; + } + effectRenderer.addEffect( + (new EntityDiggingFX( + world, + rX, + rY, + rZ, + 0.0, + 0.0, + 0.0, + block, + block.getDamageValue(world, x, y, z), + ordinalSide)).applyColourMultiplier(x, y, z) + .multiplyVelocity(0.2F) + .multipleParticleScaleBy(0.6F)); + } + + @SideOnly(Side.CLIENT) + public static void addDestroyEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z) { + for (int iX = 0; iX < 4; ++iX) { + for (int iY = 0; iY < 4; ++iY) { + for (int iZ = 0; iZ < 4; ++iZ) { + final double bX = x + (iX + 0.5) / 4.0; + final double bY = y + (iY + 0.5) / 4.0; + final double bZ = z + (iZ + 0.5) / 4.0; + effectRenderer.addEffect( + (new EntityDiggingFX( + world, + bX, + bY, + bZ, + bX - x - 0.5, + bY - y - 0.5, + bZ - z - 0.5, + block, + block.getDamageValue(world, x, y, z))).applyColourMultiplier(x, y, z)); + } + } + } + } + + final TileEntityOres tTileEntity = new TileEntityOres(); + + @Override + public void renderInventoryBlock(Block aBlock, int aMeta, int aModelID, RenderBlocks aRenderer) { + aRenderer.enableAO = false; + aRenderer.useInventoryTint = true; + + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + if (aBlock instanceof BlockOresAbstract) { + tTileEntity.mMetaData = ((short) aMeta); + + aBlock.setBlockBoundsForItemRender(); + aRenderer.setRenderBoundsFromBlock(aBlock); + // spotless:off + ITexture[] texture = tTileEntity.getTexture(aBlock); + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + // spotless:on + } else if (aMeta > 0 && (aMeta < GregTechAPI.METATILEENTITIES.length) + && aBlock instanceof BlockMachines + && (GregTechAPI.METATILEENTITIES[aMeta] != null) + && (!GregTechAPI.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer))) { + renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer); + } else if (aBlock instanceof BlockFrameBox) { + ITexture[] texture = ((BlockFrameBox) aBlock).getTexture(aMeta); + aBlock.setBlockBoundsForItemRender(); + aRenderer.setRenderBoundsFromBlock(aBlock); + // spotless:off + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + // spotless:on + } + aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); + + aRenderer.setRenderBoundsFromBlock(aBlock); + + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + aRenderer.useInventoryTint = false; + } + + private static void renderNormalInventoryMetaTileEntity(Block aBlock, int aMeta, RenderBlocks aRenderer) { + if ((aMeta <= 0) || (aMeta >= GregTechAPI.METATILEENTITIES.length)) { + return; + } + final IMetaTileEntity tMetaTileEntity = GregTechAPI.METATILEENTITIES[aMeta]; + if (tMetaTileEntity == null) { + return; + } + aBlock.setBlockBoundsForItemRender(); + aRenderer.setRenderBoundsFromBlock(aBlock); + + final IGregTechTileEntity iGregTechTileEntity = tMetaTileEntity.getBaseMetaTileEntity(); + + // spotless:off + if ((iGregTechTileEntity instanceof IPipeRenderedTileEntity renderedPipe) + && (tMetaTileEntity instanceof MetaPipeEntity pipeEntity)) { + final float tThickness = renderedPipe.getThickNess(); + final float pipeMin = (blockMax - tThickness) / 2.0F; + final float pipeMax = blockMax - pipeMin; + + aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, blockMax, pipeMax, pipeMax); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, DOWN, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, UP, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, NORTH, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, SOUTH, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, WEST, (CONNECTED_WEST | CONNECTED_EAST), -1, true, false), true); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, EAST, (CONNECTED_WEST | CONNECTED_EAST), -1, true, false), true); + } else { + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, DOWN, WEST, -1, true, false), true); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, UP, WEST, -1, true, false), true); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, NORTH, WEST, -1, true, false), true); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, SOUTH, WEST, -1, true, false), true); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, WEST, WEST, -1, true, false), true); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, EAST, WEST, -1, true, false), true); + } + // spotless:on + } + + public static void renderNegativeYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, + int aZ, ITexture[] aIcon, boolean aFullBlock) { + if (aWorld != null) { + if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY - 1, aZ, 0))) return; + Tessellator.instance + .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY - 1 : aY, aZ)); + } + if (aIcon == null) return; + for (final ITexture iTexture : aIcon) { + if (iTexture != null) { + iTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ); + } + } + } + + public static void renderPositiveYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, + int aZ, ITexture[] aIcon, boolean aFullBlock) { + if (aWorld != null) { + if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY + 1, aZ, 1))) return; + Tessellator.instance + .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY + 1 : aY, aZ)); + } + if (aIcon == null) return; + for (final ITexture iTexture : aIcon) { + if (iTexture != null) { + iTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ); + } + } + } + + public static void renderNegativeZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, + int aZ, ITexture[] aIcon, boolean aFullBlock) { + if (aWorld != null) { + if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ - 1, 2))) return; + Tessellator.instance + .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ - 1 : aZ)); + } + if (aIcon == null) return; + for (final ITexture iTexture : aIcon) { + if (iTexture != null) { + iTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ); + } + } + } + + public static void renderPositiveZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, + int aZ, ITexture[] aIcon, boolean aFullBlock) { + if (aWorld != null) { + if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ + 1, 3))) return; + Tessellator.instance + .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ + 1 : aZ)); + } + if (aIcon == null) return; + for (final ITexture iTexture : aIcon) { + if (iTexture != null) { + iTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ); + } + } + } + + public static void renderNegativeXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, + int aZ, ITexture[] aIcon, boolean aFullBlock) { + if (aWorld != null) { + if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX - 1, aY, aZ, 4))) return; + Tessellator.instance + .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX - 1 : aX, aY, aZ)); + } + if (aIcon == null) return; + for (final ITexture iTexture : aIcon) { + if (iTexture != null) { + iTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ); + } + } + } + + public static void renderPositiveXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, + int aZ, ITexture[] aIcon, boolean aFullBlock) { + if (aWorld != null) { + if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX + 1, aY, aZ, 5))) return; + Tessellator.instance + .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX + 1 : aX, aY, aZ)); + } + if (aIcon == null) return; + for (final ITexture iTexture : aIcon) { + if (iTexture != null) { + iTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ); + } + } + } + + @Override + public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID, + RenderBlocks aRenderer) { + aRenderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GTMod.gregtechproxy.mRenderTileAmbientOcclusion; + aRenderer.useInventoryTint = false; + + final TileEntity tileEntity = aWorld.getTileEntity(aX, aY, aZ); + + // If this block does not have a TE, render it as a normal block. + // Otherwise, render the TE instead. + if (tileEntity == null && aBlock instanceof BlockFrameBox frameBlock) { + int meta = aWorld.getBlockMetadata(aX, aY, aZ); + ITexture[] texture = frameBlock.getTexture(meta); + if (texture == null) return false; + textureArray[0] = texture; + textureArray[1] = texture; + textureArray[2] = texture; + textureArray[3] = texture; + textureArray[4] = texture; + textureArray[5] = texture; + renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); + return true; + } + + if (tileEntity == null) return false; + + if (tileEntity instanceof IGregTechTileEntity) { + final IMetaTileEntity metaTileEntity; + if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null + && metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) { + aRenderer.enableAO = false; + return true; + } + } + if (tileEntity instanceof IPipeRenderedTileEntity + && renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) { + aRenderer.enableAO = false; + return true; + } + if (renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer)) { + aRenderer.enableAO = false; + return true; + } + return false; + } + + @Override + public boolean shouldRender3DInInventory(int aModel) { + return true; + } + + @Override + public int getRenderId() { + return this.mRenderID; + } +} diff --git a/src/main/java/gregtech/common/render/GTSidedTextureRender.java b/src/main/java/gregtech/common/render/GTSidedTextureRender.java new file mode 100644 index 0000000000..15885f10ce --- /dev/null +++ b/src/main/java/gregtech/common/render/GTSidedTextureRender.java @@ -0,0 +1,78 @@ +package gregtech.common.render; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; + +import gregtech.api.interfaces.IColorModulationContainer; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.render.TextureFactory; + +public class GTSidedTextureRender extends GTTextureBase implements ITexture, IColorModulationContainer { + + protected final ITexture[] mTextures; + /** + * DO NOT MANIPULATE THE VALUES INSIDE THIS ARRAY!!! + *

+ * Just set this variable to another different Array instead. Otherwise some colored things will get Problems. + */ + private final short[] mRGBa; + + protected GTSidedTextureRender(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, + IIconContainer aIcon3, IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa, boolean aAllowAlpha) { + if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture"); + mTextures = new ITexture[] { TextureFactory.of(aIcon0, aRGBa, aAllowAlpha), + TextureFactory.of(aIcon1, aRGBa, aAllowAlpha), TextureFactory.of(aIcon2, aRGBa, aAllowAlpha), + TextureFactory.of(aIcon3, aRGBa, aAllowAlpha), TextureFactory.of(aIcon4, aRGBa, aAllowAlpha), + TextureFactory.of(aIcon5, aRGBa, aAllowAlpha) }; + mRGBa = aRGBa; + } + + @Override + public boolean isOldTexture() { + return false; + } + + @Override + public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + mTextures[5].renderXPos(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + mTextures[4].renderXNeg(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + mTextures[1].renderYPos(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + mTextures[0].renderYNeg(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + mTextures[3].renderZPos(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { + mTextures[2].renderZNeg(aRenderer, aBlock, aX, aY, aZ); + } + + @Override + public short[] getRGBA() { + return mRGBa; + } + + @Override + public boolean isValidTexture() { + for (ITexture renderedTexture : mTextures) { + if (!renderedTexture.isValidTexture()) return false; + } + return true; + } +} diff --git a/src/main/java/gregtech/common/render/GTTextureBase.java b/src/main/java/gregtech/common/render/GTTextureBase.java new file mode 100644 index 0000000000..08dedf1d6a --- /dev/null +++ b/src/main/java/gregtech/common/render/GTTextureBase.java @@ -0,0 +1,31 @@ +package gregtech.common.render; + +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.util.GTUtilityClient; + +public abstract class GTTextureBase implements ITexture { + + protected boolean isDrawing = false; + + @Override + public void startDrawingQuads(RenderBlocks aRenderer, float aNormalX, float aNormalY, float aNormalZ) { + if (aRenderer.useInventoryTint && (!isOldTexture() || !GTUtilityClient.isDrawing(Tessellator.instance))) { + // Draw if we're not an old texture OR we are an old texture AND we're not already drawing + isDrawing = true; + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(aNormalX, aNormalY, aNormalZ); + } + } + + @Override + public void draw(RenderBlocks aRenderer) { + if (aRenderer.useInventoryTint && (!isOldTexture() || isDrawing)) { + // Draw if we're not an old texture OR we initiated the drawing + isDrawing = false; + Tessellator.instance.draw(); + } + } +} diff --git a/src/main/java/gregtech/common/render/GTTextureBuilder.java b/src/main/java/gregtech/common/render/GTTextureBuilder.java new file mode 100644 index 0000000000..aad734b828 --- /dev/null +++ b/src/main/java/gregtech/common/render/GTTextureBuilder.java @@ -0,0 +1,150 @@ +package gregtech.common.render; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.GTMod; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.ITextureBuilder; + +@SuppressWarnings({ "unused", "ClassWithTooManyFields" }) +public class GTTextureBuilder implements ITextureBuilder { + + private final List iconContainerList; + private final List textureLayers; + private Block fromBlock; + private int fromMeta; + private ForgeDirection fromSide; + private short[] rgba; + private boolean allowAlpha; + private boolean stdOrient; + private boolean extFacing; + private boolean glow; + private Boolean worldCoord = null; + + public GTTextureBuilder() { + textureLayers = new ArrayList<>(); + iconContainerList = new ArrayList<>(); + rgba = Dyes._NULL.mRGBa; + allowAlpha = true; + stdOrient = false; + glow = false; + } + + @Override + public ITextureBuilder setFromBlock(final Block block, final int meta) { + this.fromBlock = block; + this.fromMeta = meta; + this.fromSide = ForgeDirection.UNKNOWN; + return this; + } + + @Override + public ITextureBuilder setFromSide(final ForgeDirection side) { + this.fromSide = side; + return this; + } + + @Override + public ITextureBuilder addIcon(final IIconContainer... iconContainers) { + this.iconContainerList.addAll(Arrays.asList(iconContainers)); + return this; + } + + @Override + public ITextureBuilder setRGBA(final short[] rgba) { + this.rgba = rgba; + return this; + } + + @Override + public ITextureBuilder addLayer(final ITexture... iTextures) { + this.textureLayers.addAll(Arrays.asList(iTextures)); + return this; + } + + @Override + public ITextureBuilder setAllowAlpha(final boolean allowAlpha) { + this.allowAlpha = allowAlpha; + return this; + } + + @Override + public ITextureBuilder stdOrient() { + this.stdOrient = true; + return this; + } + + @Override + public ITextureBuilder useWorldCoord() { + this.worldCoord = true; + return this; + } + + @Override + public ITextureBuilder noWorldCoord() { + this.worldCoord = false; + return this; + } + + @Override + public ITextureBuilder extFacing() { + this.extFacing = true; + return this; + } + + @Override + public ITextureBuilder glow() { + glow = true; + return this; + } + + /** + * @inheritDoc + */ + @Override + public ITexture build() { + if (fromBlock != null) { + if (worldCoord == Boolean.TRUE || worldCoord == null && isCTMBlock(fromBlock, fromMeta)) + return new GTCopiedCTMBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha); + else return new GTCopiedBlockTextureRender(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha); + } + if (worldCoord != null) throw new IllegalStateException("worldCoord without from block"); + if (!textureLayers.isEmpty()) return new GTMultiTextureRender(textureLayers.toArray(new ITexture[0])); + return switch (iconContainerList.size()) { + case 1 -> new GTRenderedTexture(iconContainerList.get(0), rgba, allowAlpha, glow, stdOrient, extFacing); + case 6 -> new GTSidedTextureRender( + iconContainerList.get(ForgeDirection.DOWN.ordinal()), + iconContainerList.get(ForgeDirection.UP.ordinal()), + iconContainerList.get(ForgeDirection.NORTH.ordinal()), + iconContainerList.get(ForgeDirection.SOUTH.ordinal()), + iconContainerList.get(ForgeDirection.WEST.ordinal()), + iconContainerList.get(ForgeDirection.EAST.ordinal()), + rgba, + allowAlpha); + default -> throw new IllegalStateException("Invalid sideIconContainer count"); + }; + } + + private boolean isCTMBlock(Block fromBlock, int fromMeta) { + return GTMod.gregtechproxy.mCTMBlockCache.computeIfAbsent(fromBlock, (byte) fromMeta, GTTextureBuilder::apply); + } + + private static Boolean apply(Block b, Byte m) { + Class clazz = b.getClass(); + while (clazz != Block.class) { + final String className = clazz.getName(); + if (GTValues.mCTMDisabledBlock.contains(className)) return false; + if (GTValues.mCTMEnabledBlock.contains(className)) return true; + clazz = clazz.getSuperclass(); + } + return false; + } +} diff --git a/src/main/java/gregtech/common/render/GT_CapeRenderer.java b/src/main/java/gregtech/common/render/GT_CapeRenderer.java deleted file mode 100644 index ec9ef2880c..0000000000 --- a/src/main/java/gregtech/common/render/GT_CapeRenderer.java +++ /dev/null @@ -1,148 +0,0 @@ -package gregtech.common.render; - -import java.util.Collection; - -import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.potion.Potion; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.RenderPlayerEvent; - -import org.lwjgl.opengl.GL11; - -import gregtech.api.enums.GT_Values; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; - -public class GT_CapeRenderer extends RenderPlayer { - - private final ResourceLocation[] mCapes = { new ResourceLocation("gregtech:textures/BrainTechCape.png"), - new ResourceLocation("gregtech:textures/GregTechCape.png"), - new ResourceLocation("gregtech:textures/MrBrainCape.png"), - new ResourceLocation("gregtech:textures/GregoriusCape.png"), - new ResourceLocation("gregtech:textures/DonorCape.png"), new ResourceLocation("gregtech:textures/DevCape.png"), - new ResourceLocation("gregtech:textures/Steam.png"), new ResourceLocation("gregtech:textures/Titanium.png"), - new ResourceLocation("gregtech:textures/Neutronium.png"), - new ResourceLocation("gregtech:textures/Stargate.png") }; - private final Collection mCapeList; - - public GT_CapeRenderer(Collection aCapeList) { - this.mCapeList = aCapeList; - setRenderManager(RenderManager.instance); - } - - public void receiveRenderSpecialsEvent(RenderPlayerEvent.Specials.Pre aEvent) { - AbstractClientPlayer aPlayer = (AbstractClientPlayer) aEvent.entityPlayer; - if (GT_Utility.getFullInvisibility(aPlayer)) { - aEvent.setCanceled(true); - return; - } - float aPartialTicks = aEvent.partialRenderTick; - if (aPlayer.isInvisible()) { - return; - } - if (GT_Utility.getPotion(aPlayer, Potion.invisibility.id)) { - return; - } - try { - ResourceLocation tResource = aPlayer.getLocationCape(); - if (aPlayer.getDisplayName() - .equalsIgnoreCase("Friedi4321")) { - tResource = this.mCapes[0]; - } - if (this.mCapeList.contains( - aPlayer.getDisplayName() - .toLowerCase())) { - tResource = this.mCapes[1]; - } - if (aPlayer.getDisplayName() - .equalsIgnoreCase("Mr_Brain")) { - tResource = this.mCapes[2]; - } - if (aPlayer.getDisplayName() - .equalsIgnoreCase("GregoriusT")) { - tResource = this.mCapes[3]; - } - if (this.mCapeList.contains( - aPlayer.getDisplayName() - .toLowerCase() + ":capedonor")) { - tResource = this.mCapes[4]; - } - if (this.mCapeList.contains( - aPlayer.getDisplayName() - .toLowerCase() + ":capedev")) { - tResource = this.mCapes[5]; - } - if (this.mCapeList.contains( - aPlayer.getDisplayName() - .toLowerCase() + ":cape_steam")) { - tResource = this.mCapes[6]; - } - if (this.mCapeList.contains( - aPlayer.getDisplayName() - .toLowerCase() + ":cape_titanium")) { - tResource = this.mCapes[7]; - } - if (this.mCapeList.contains( - aPlayer.getDisplayName() - .toLowerCase() + ":cape_neutronium")) { - tResource = this.mCapes[8]; - } - if (this.mCapeList.contains( - aPlayer.getDisplayName() - .toLowerCase() + ":cape_stargate")) { - tResource = this.mCapes[9]; - } - - if ((tResource != null) && (!aPlayer.getHideCape())) { - bindTexture(tResource); - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, 0.0F, 0.125F); - double d0 = aPlayer.field_71091_bM + (aPlayer.field_71094_bP - aPlayer.field_71091_bM) * aPartialTicks - - (aPlayer.prevPosX + (aPlayer.posX - aPlayer.prevPosX) * aPartialTicks); - double d1 = aPlayer.field_71096_bN + (aPlayer.field_71095_bQ - aPlayer.field_71096_bN) * aPartialTicks - - (aPlayer.prevPosY + (aPlayer.posY - aPlayer.prevPosY) * aPartialTicks); - double d2 = aPlayer.field_71097_bO + (aPlayer.field_71085_bR - aPlayer.field_71097_bO) * aPartialTicks - - (aPlayer.prevPosZ + (aPlayer.posZ - aPlayer.prevPosZ) * aPartialTicks); - float f6 = aPlayer.prevRenderYawOffset - + (aPlayer.renderYawOffset - aPlayer.prevRenderYawOffset) * aPartialTicks; - double d3 = MathHelper.sin(f6 * (float) Math.PI / 180.0F); - double d4 = -MathHelper.cos(f6 * (float) Math.PI / 180.0F); - float f7 = (float) d1 * 10.0F; - float f8 = (float) (d0 * d3 + d2 * d4) * 100.0F; - float f9 = (float) (d0 * d4 - d2 * d3) * 100.0F; - if (f7 < -6.0F) { - f7 = -6.0F; - } - if (f7 > 32.0F) { - f7 = 32.0F; - } - if (f8 < 0.0F) { - f8 = 0.0F; - } - float f10 = aPlayer.prevCameraYaw + (aPlayer.cameraYaw - aPlayer.prevCameraYaw) * aPartialTicks; - f7 += MathHelper.sin( - (aPlayer.prevDistanceWalkedModified - + (aPlayer.distanceWalkedModified - aPlayer.prevDistanceWalkedModified) * aPartialTicks) * 6.0F) - * 32.0F - * f10; - if (aPlayer.isSneaking()) { - f7 += 25.0F; - } - GL11.glRotatef(6.0F + f8 / 2.0F + f7, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(f9 / 2.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-f9 / 2.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - ((ModelBiped) this.mainModel).renderCloak(0.0625F); - GL11.glPopMatrix(); - } - } catch (Throwable e) { - if (GT_Values.D1) { - e.printStackTrace(GT_Log.err); - } - } - } -} diff --git a/src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java b/src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java deleted file mode 100644 index 937c1a994f..0000000000 --- a/src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java +++ /dev/null @@ -1,112 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.util.IIcon; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.IBlockContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.util.LightingHelper; - -public class GT_CopiedBlockTexture extends GT_TextureBase implements ITexture, IBlockContainer { - - private final Block mBlock; - private final byte mSide, mMeta; - - protected GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean allowAlpha) { - if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_CopiedBlockTexture"); - mBlock = aBlock; - mSide = (byte) ordinalSide; - mMeta = (byte) aMeta; - } - - @Override - public boolean isOldTexture() { - return false; - } - - private IIcon getIcon(int ordinalSide) { - if (mSide == 6) return mBlock.getIcon(ordinalSide, mMeta); - return mBlock.getIcon(mSide, mMeta); - } - - @Override - public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - final IIcon aIcon = getIcon(ForgeDirection.EAST.ordinal()); - aRenderer.field_152631_f = true; - startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f); - new LightingHelper(aRenderer).setupLightingXPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.EAST, 0xffffff); - aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - aRenderer.field_152631_f = false; - } - - @Override - public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f); - final IIcon aIcon = getIcon(ForgeDirection.WEST.ordinal()); - new LightingHelper(aRenderer).setupLightingXNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.WEST, 0xffffff); - aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f); - final IIcon aIcon = getIcon(ForgeDirection.UP.ordinal()); - new LightingHelper(aRenderer).setupLightingYPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.UP, 0xffffff); - aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f); - final IIcon aIcon = getIcon(ForgeDirection.DOWN.ordinal()); - new LightingHelper(aRenderer).setupLightingYNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.DOWN, 0xffffff); - aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f); - final IIcon aIcon = getIcon(ForgeDirection.SOUTH.ordinal()); - new LightingHelper(aRenderer).setupLightingZPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.SOUTH, 0xffffff); - aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f); - final IIcon aIcon = getIcon(ForgeDirection.NORTH.ordinal()); - aRenderer.field_152631_f = true; - new LightingHelper(aRenderer).setupLightingZNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.NORTH, 0xffffff); - aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - aRenderer.field_152631_f = false; - } - - @Override - public boolean isValidTexture() { - return mBlock != null; - } - - @Override - public Block getBlock() { - return mBlock; - } - - @Override - public byte getMeta() { - return mMeta; - } -} diff --git a/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java b/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java deleted file mode 100644 index 17fa9ac8ff..0000000000 --- a/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java +++ /dev/null @@ -1,118 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.util.IIcon; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.IBlockContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.util.GT_RenderingWorld; -import gregtech.api.util.LightingHelper; - -class GT_CopiedCTMBlockTexture extends GT_TextureBase implements ITexture, IBlockContainer { - - private final Block mBlock; - private final byte mSide, mMeta; - - GT_CopiedCTMBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean allowAlpha) { - if (aRGBa.length != 4) - throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_CopiedCTMBlockTexture"); - mBlock = aBlock; - mSide = (byte) ordinalSide; - mMeta = (byte) aMeta; - } - - @Override - public boolean isOldTexture() { - return false; - } - - private IIcon getIcon(int ordinalSide, int aX, int aY, int aZ, RenderBlocks aRenderer) { - final int tSide = mSide == 6 ? ordinalSide : mSide; - return mBlock.getIcon(getBlockAccess(aRenderer), aX, aY, aZ, tSide); - } - - private GT_RenderingWorld getBlockAccess(RenderBlocks aRenderer) { - return GT_RenderingWorld.getInstance(aRenderer.blockAccess); - } - - @Override - public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - final IIcon aIcon = getIcon(ForgeDirection.EAST.ordinal(), aX, aY, aZ, aRenderer); - aRenderer.field_152631_f = true; - startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f); - new LightingHelper(aRenderer).setupLightingXPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.EAST, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); - aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - aRenderer.field_152631_f = false; - } - - @Override - public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f); - final IIcon aIcon = getIcon(ForgeDirection.WEST.ordinal(), aX, aY, aZ, aRenderer); - new LightingHelper(aRenderer).setupLightingXNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.WEST, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); - aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f); - final IIcon aIcon = getIcon(ForgeDirection.UP.ordinal(), aX, aY, aZ, aRenderer); - new LightingHelper(aRenderer).setupLightingYPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.UP, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); - aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f); - final IIcon aIcon = getIcon(ForgeDirection.DOWN.ordinal(), aX, aY, aZ, aRenderer); - new LightingHelper(aRenderer).setupLightingYNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.DOWN, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); - aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f); - final IIcon aIcon = getIcon(ForgeDirection.SOUTH.ordinal(), aX, aY, aZ, aRenderer); - new LightingHelper(aRenderer).setupLightingZPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.SOUTH, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); - aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - } - - @Override - public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f); - final IIcon aIcon = getIcon(ForgeDirection.NORTH.ordinal(), aX, aY, aZ, aRenderer); - aRenderer.field_152631_f = true; - new LightingHelper(aRenderer).setupLightingZNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.NORTH, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ)); - aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon); - draw(aRenderer); - aRenderer.field_152631_f = false; - } - - @Override - public boolean isValidTexture() { - return mBlock != null; - } - - @Override - public Block getBlock() { - return mBlock; - } - - @Override - public byte getMeta() { - return mMeta; - } -} diff --git a/src/main/java/gregtech/common/render/GT_FlaskRenderer.java b/src/main/java/gregtech/common/render/GT_FlaskRenderer.java deleted file mode 100644 index addcb1cf70..0000000000 --- a/src/main/java/gregtech/common/render/GT_FlaskRenderer.java +++ /dev/null @@ -1,71 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.client.IItemRenderer; -import net.minecraftforge.client.MinecraftForgeClient; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.common.items.GT_VolumetricFlask; - -@SideOnly(Side.CLIENT) -public final class GT_FlaskRenderer implements IItemRenderer { - - public GT_FlaskRenderer() { - MinecraftForgeClient.registerItemRenderer(ItemList.VOLUMETRIC_FLASK.getItem(), this); - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type != ItemRenderType.FIRST_PERSON_MAP; - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING - || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - GT_VolumetricFlask cell = (GT_VolumetricFlask) item.getItem(); - IIcon icon = item.getIconIndex(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GT_RenderUtil.applyStandardItemTransform(type); - - FluidStack fs = cell != null ? cell.getFluid(item) : null; - if (fs != null) { - IIcon iconWindow = cell.iconWindow; - Fluid fluid = fs.getFluid(); - IIcon fluidIcon = fluid.getIcon(fs); - int fluidColor = fluid.getColor(fs); - - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); - GL11.glBlendFunc(GL11.GL_ZERO, GL11.GL_ONE); - GT_RenderUtil.renderItem(type, iconWindow); - - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor); - GT_RenderUtil.renderItem(type, fluidIcon); - GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GT_RenderUtil.renderItem(type, icon); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glDisable(GL11.GL_BLEND); - } -} diff --git a/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java b/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java deleted file mode 100644 index 9a35f6bc57..0000000000 --- a/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java +++ /dev/null @@ -1,98 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.client.IItemRenderer; -import net.minecraftforge.client.MinecraftForgeClient; - -import org.lwjgl.opengl.GL11; - -import appeng.util.ReadableNumberConverter; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.common.items.GT_FluidDisplayItem; - -@SideOnly(Side.CLIENT) -public class GT_FluidDisplayStackRenderer implements IItemRenderer { - - public GT_FluidDisplayStackRenderer() { - MinecraftForgeClient.registerItemRenderer(ItemList.Display_Fluid.getItem(), this); - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - if (!item.hasTagCompound()) return false; - return type == ItemRenderType.INVENTORY; - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - // not sure what this does. - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - if (item == null || item.getItem() == null || !(item.getItem() instanceof GT_FluidDisplayItem)) return; - - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glEnable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - - Materials associatedFluidMaterial = Materials.get(item.stackTagCompound.getString("mFluidMaterialName")); - if (associatedFluidMaterial.renderer == null - || !associatedFluidMaterial.renderer.renderFluidDisplayItem(type, item, data)) { - IIcon icon = item.getItem() - .getIconFromDamage(item.getItemDamage()); - Tessellator tess = Tessellator.instance; - tess.startDrawingQuads(); - // draw a simple rectangle for the inventory icon - final float x_min = icon.getMinU(); - final float x_max = icon.getMaxU(); - final float y_min = icon.getMinV(); - final float y_max = icon.getMaxV(); - tess.addVertexWithUV(0, 16, 0, x_min, y_max); - tess.addVertexWithUV(16, 16, 0, x_max, y_max); - tess.addVertexWithUV(16, 0, 0, x_max, y_min); - tess.addVertexWithUV(0, 0, 0, x_min, y_min); - tess.draw(); - } - - if (item.getTagCompound() == null) { - GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_ALPHA_TEST); - return; - } - - // Render Fluid amount text - long fluidAmount = item.getTagCompound() - .getLong("mFluidDisplayAmount"); - if (fluidAmount > 0L && !item.getTagCompound() - .getBoolean("mHideStackSize")) { - String amountString; - - if (fluidAmount < 10_000) { - amountString = "" + fluidAmount + "L"; - } else { - amountString = ReadableNumberConverter.INSTANCE.toWideReadableForm(fluidAmount) + "L"; - } - - FontRenderer fontRender = Minecraft.getMinecraft().fontRenderer; - float smallTextScale = fontRender.getUnicodeFlag() ? 3F / 4F : 1F / 2F; - GL11.glDisable(GL11.GL_BLEND); - GL11.glPushMatrix(); - GL11.glScalef(smallTextScale, smallTextScale, 1.0f); - - fontRender - .drawString(amountString, 0, (int) (16 / smallTextScale) - fontRender.FONT_HEIGHT + 1, 0xFFFFFF, true); - GL11.glPopMatrix(); - GL11.glDisable(GL11.GL_ALPHA_TEST); - } - } -} diff --git a/src/main/java/gregtech/common/render/GT_IconFlipped.java b/src/main/java/gregtech/common/render/GT_IconFlipped.java deleted file mode 100644 index 8258e74ffa..0000000000 --- a/src/main/java/gregtech/common/render/GT_IconFlipped.java +++ /dev/null @@ -1,91 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.util.IIcon; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class GT_IconFlipped implements IIcon { - - private final IIcon baseIcon; - private final boolean flipU; - private final boolean flipV; - - public GT_IconFlipped(IIcon baseIcon, boolean flipU, boolean flipV) { - this.baseIcon = baseIcon; - this.flipU = flipU; - this.flipV = flipV; - } - - /** - * Returns the width of the icon, in pixels. - */ - @Override - public int getIconWidth() { - return this.baseIcon.getIconWidth(); - } - - /** - * Returns the height of the icon, in pixels. - */ - @Override - public int getIconHeight() { - return this.baseIcon.getIconHeight(); - } - - /** - * Returns the minimum U coordinate to use when rendering with this icon. - */ - @Override - public float getMinU() { - return this.flipU ? this.baseIcon.getMaxU() : this.baseIcon.getMinU(); - } - - /** - * Returns the maximum U coordinate to use when rendering with this icon. - */ - @Override - public float getMaxU() { - return this.flipU ? this.baseIcon.getMinU() : this.baseIcon.getMaxU(); - } - - /** - * Gets a U coordinate on the icon. 0 returns uMin and 16 returns uMax. Other arguments return in-between values. - */ - @Override - public float getInterpolatedU(double p_94214_1_) { - final float f = this.getMaxU() - this.getMinU(); - return this.getMinU() + f * ((float) p_94214_1_ / 16.0F); - } - - /** - * Returns the minimum V coordinate to use when rendering with this icon. - */ - @Override - public float getMinV() { - return this.flipV ? this.baseIcon.getMaxV() : this.baseIcon.getMinV(); - } - - /** - * Returns the maximum V coordinate to use when rendering with this icon. - */ - @Override - public float getMaxV() { - return this.flipV ? this.baseIcon.getMinV() : this.baseIcon.getMaxV(); - } - - /** - * Gets a V coordinate on the icon. 0 returns vMin and 16 returns vMax. Other arguments return in-between values. - */ - @Override - public float getInterpolatedV(double p_94207_1_) { - final float f = this.getMaxV() - this.getMinV(); - return this.getMinV() + f * ((float) p_94207_1_ / 16.0F); - } - - @Override - public String getIconName() { - return this.baseIcon.getIconName(); - } -} diff --git a/src/main/java/gregtech/common/render/GT_LaserRenderer.java b/src/main/java/gregtech/common/render/GT_LaserRenderer.java deleted file mode 100644 index 1c54a5d58b..0000000000 --- a/src/main/java/gregtech/common/render/GT_LaserRenderer.java +++ /dev/null @@ -1,90 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ClientRegistry; -import gregtech.common.tileentities.render.TileLaser; - -public class GT_LaserRenderer extends TileEntitySpecialRenderer { - - private double zOffset = 0.0; - private double xOffset = 0.0; - - // Relative to block size - final private double lineRadius = 0.03; - - final private float lineOpacity = 0.7F; - - final private float laserSpeed = 0.8F; - - public GT_LaserRenderer() { - ClientRegistry.bindTileEntitySpecialRenderer(TileLaser.class, this); - } - - private void maths(float counter) { - float tc = (0.05F * counter); - zOffset = 0.5 + 0.45 * Math.sin(2 * Math.PI * tc); - xOffset = 0.5 + 0.45 * Math.sin(0.5 * Math.PI * tc); - } - - private void renderFakeLine(TileLaser laser, double x1, double y1, double z1, double x2, double y2, double z2) { - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.setColorRGBA_F(laser.getRed(), laser.getGreen(), laser.getBlue(), lineOpacity); - tessellator.addVertex(x1 - lineRadius, y1, z1); - tessellator.addVertex(x1 + lineRadius, y1, z1); - tessellator.addVertex(x2 + lineRadius, y2, z2); - tessellator.addVertex(x2 - lineRadius, y2, z2); - - tessellator.addVertex(x1, y1, z1 - lineRadius); - tessellator.addVertex(x1, y1, z1 + lineRadius); - tessellator.addVertex(x2, y2, z2 + lineRadius); - tessellator.addVertex(x2, y2, z2 - lineRadius); - tessellator.draw(); - } - - @Override - public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { - final TileLaser ltile = (TileLaser) tile; - - if (ltile.getShouldRender()) { - // Push GL state - GL11.glPushMatrix(); - GL11.glPushAttrib(GL11.GL_ENABLE_BIT); - - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glEnable(GL11.GL_BLEND); - - // Full brightness on this thing (Emits glow with shaders) - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.f, 240.f); - - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - GL11.glRotated(ltile.rotationAngle, ltile.rotAxisX, ltile.rotAxisY, ltile.rotAxisZ); - GL11.glTranslated(-x - 0.5, -y - 0.5, -z - 0.5); - - if (ltile.realism) { - renderFakeLine(ltile, x + xOffset, y + 4.0, z + zOffset, x + xOffset, y + 0.5, z + zOffset); - } else { - renderFakeLine(ltile, x + 0.5, y + 4.0, z + 0.5, x + xOffset, y + 0.5, z + zOffset); - } - - // Pop GL state - GL11.glPopAttrib(); - GL11.glPopMatrix(); - - // Movement calculations - maths(ltile.counter); - ltile.counter += laserSpeed; - if (ltile.counter >= 80) { - ltile.counter = 0; - } - } - } -} diff --git a/src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java b/src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java deleted file mode 100644 index 96285a3fc1..0000000000 --- a/src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java +++ /dev/null @@ -1,130 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.client.IItemRenderer; -import net.minecraftforge.client.MinecraftForgeClient; - -import org.lwjgl.opengl.GL11; - -import gregtech.GT_Mod; -import gregtech.api.enums.Materials; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.IToolStats; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_MetaGenerated_Tool_Renderer implements IItemRenderer { - - public GT_MetaGenerated_Tool_Renderer() { - for (GT_MetaGenerated_Tool tItem : GT_MetaGenerated_Tool.sInstances.values()) { - if (tItem != null) { - MinecraftForgeClient.registerItemRenderer(tItem, this); - } - } - } - - @Override - public boolean handleRenderType(ItemStack stack, ItemRenderType type) { - return (type == ItemRenderType.EQUIPPED_FIRST_PERSON) || (type == ItemRenderType.INVENTORY) - || (type == ItemRenderType.EQUIPPED) - || (type == ItemRenderType.ENTITY); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack stack, ItemRendererHelper helper) { - return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING - || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); - } - - @Override - public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { - GT_MetaGenerated_Tool item = (GT_MetaGenerated_Tool) stack.getItem(); - GL11.glEnable(GL11.GL_BLEND); - GT_RenderUtil.applyStandardItemTransform(type); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - - IToolStats toolStats = item != null ? item.getToolStats(stack) : null; - if (toolStats != null) { - renderToolPart(type, stack, toolStats, false); - renderToolPart(type, stack, toolStats, true); - - if ((type == ItemRenderType.INVENTORY) - && (GT_MetaGenerated_Tool.getPrimaryMaterial(stack) != Materials._NULL)) { - if (GT_Mod.gregtechproxy.mRenderItemDurabilityBar) { - IIconContainer iconContainer; - long damage = GT_MetaGenerated_Tool.getToolDamage(stack); - long maxDamage = GT_MetaGenerated_Tool.getToolMaxDamage(stack); - if (damage <= 0L) { - iconContainer = Textures.ItemIcons.DURABILITY_BAR[8]; - } else if (damage >= maxDamage) { - iconContainer = Textures.ItemIcons.DURABILITY_BAR[0]; - } else { - iconContainer = Textures.ItemIcons.DURABILITY_BAR[((int) Math - .max(0L, Math.min(7L, (maxDamage - damage) * 8L / maxDamage)))]; - } - renderIcon(iconContainer); - } - - if (GT_Mod.gregtechproxy.mRenderItemChargeBar) { - IIconContainer iconContainer; - Long[] stats = item.getElectricStats(stack); - if ((stats != null) && (stats[3] < 0L)) { - long tCharge = item.getRealCharge(stack); - if (tCharge <= 0L) { - iconContainer = Textures.ItemIcons.ENERGY_BAR[0]; - } else if (tCharge >= stats[0]) { - iconContainer = Textures.ItemIcons.ENERGY_BAR[8]; - } else { - iconContainer = Textures.ItemIcons.ENERGY_BAR[(7 - - (int) Math.max(0L, Math.min(6L, (stats[0] - tCharge) * 7L / stats[0])))]; - } - } else { - iconContainer = null; - } - renderIcon(iconContainer); - } - } - } - GL11.glDisable(GL11.GL_BLEND); - } - - private void renderIcon(IIconContainer iconContainer) { - if (iconContainer != null) { - IIcon icon = iconContainer.getIcon(); - IIcon overlay = iconContainer.getOverlayIcon(); - if (icon != null) { - Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GT_RenderUtil.renderItemIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); - } - if (overlay != null) { - Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GT_RenderUtil.renderItemIcon(overlay, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); - } - } - } - - private static void renderToolPart(ItemRenderType type, ItemStack stack, IToolStats toolStats, boolean isToolHead) { - IIconContainer iconContainer = toolStats.getIcon(isToolHead, stack); - if (iconContainer != null) { - IIcon icon = iconContainer.getIcon(); - IIcon overlay = iconContainer.getOverlayIcon(); - if (icon != null) { - Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - short[] modulation = toolStats.getRGBa(isToolHead, stack); - GL11.glColor3f(modulation[0] / 255.0F, modulation[1] / 255.0F, modulation[2] / 255.0F); - GT_RenderUtil.renderItem(type, icon); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - } - if (overlay != null) { - Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GT_RenderUtil.renderItem(type, overlay); - } - } - } -} diff --git a/src/main/java/gregtech/common/render/GT_MultiTexture.java b/src/main/java/gregtech/common/render/GT_MultiTexture.java deleted file mode 100644 index d3cff271cb..0000000000 --- a/src/main/java/gregtech/common/render/GT_MultiTexture.java +++ /dev/null @@ -1,69 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; - -import gregtech.GT_Mod; -import gregtech.api.interfaces.ITexture; - -/** - *

- * Lets Multiple ITextures Render overlay over each other.< - *

- *

- * I should have done this much earlier... - *

- */ -public class GT_MultiTexture extends GT_TextureBase implements ITexture { - - protected final ITexture[] mTextures; - - public static GT_MultiTexture get(ITexture... aTextures) { - return GT_Mod.instance.isClientSide() ? new GT_MultiTexture(aTextures) : null; - } - - protected GT_MultiTexture(ITexture... aTextures) { - mTextures = aTextures; - } - - @Override - public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - for (ITexture tTexture : mTextures) - if (tTexture != null && tTexture.isValidTexture()) tTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - for (ITexture tTexture : mTextures) - if (tTexture != null && tTexture.isValidTexture()) tTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - for (ITexture tTexture : mTextures) - if (tTexture != null && tTexture.isValidTexture()) tTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - for (ITexture tTexture : mTextures) - if (tTexture != null && tTexture.isValidTexture()) tTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - for (ITexture tTexture : mTextures) - if (tTexture != null && tTexture.isValidTexture()) tTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - for (ITexture tTexture : mTextures) - if (tTexture != null && tTexture.isValidTexture()) tTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public boolean isValidTexture() { - return true; - } -} diff --git a/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java b/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java deleted file mode 100644 index c8c1d832b0..0000000000 --- a/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java +++ /dev/null @@ -1,179 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.util.ForgeDirection; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; -import cpw.mods.fml.client.registry.RenderingRegistry; -import gregtech.GT_Mod; -import gregtech.api.interfaces.ITexture; -import gregtech.api.logic.ModelRenderLogic; -import gregtech.api.logic.interfaces.ModelRenderLogicHost; -import gregtech.api.multitileentity.MultiTileEntityBlock; -import gregtech.api.multitileentity.MultiTileEntityClassContainer; -import gregtech.api.multitileentity.MultiTileEntityRegistry; -import gregtech.api.multitileentity.interfaces.IMultiBlockController; -import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; - -public class GT_MultiTile_Renderer implements ISimpleBlockRenderingHandler { - - private final int renderID; - public static GT_MultiTile_Renderer INSTANCE; - - public GT_MultiTile_Renderer() { - this.renderID = RenderingRegistry.getNextAvailableRenderId(); - INSTANCE = this; - RenderingRegistry.registerBlockHandler(this); - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { - if (!(block instanceof MultiTileEntityBlock muteBlock)) { - return; - } - - GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - - final MultiTileEntityRegistry registry = muteBlock.getRegistry(); - if (registry == null) return; - final MultiTileEntityClassContainer classContainer = registry.getClassContainer(metadata); - if (classContainer == null) return; - renderer.setRenderBoundsFromBlock(muteBlock); - - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - final ITexture texture = classContainer.getReferenceTileEntity() - .getTexture(side); - if (texture == null) continue; - switch (side) { - case DOWN -> renderYNegative(null, renderer, 0, 0, 0, block, texture, side); - case UP -> renderYPositive(null, renderer, 0, 0, 0, block, texture, side); - case WEST -> renderXNegative(null, renderer, 0, 0, 0, block, texture, side); - case EAST -> renderXPositive(null, renderer, 0, 0, 0, block, texture, side); - case NORTH -> renderZNegative(null, renderer, 0, 0, 0, block, texture, side); - case SOUTH -> renderZPositive(null, renderer, 0, 0, 0, block, texture, side); - default -> { - // Do nothing - } - } - } - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - final TileEntity entity = world.getTileEntity(x, y, z); - if (entity == null) { - return false; - } - - renderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion; - renderer.useInventoryTint = false; - - if (entity instanceof ModelRenderLogicHost modelEntity && modelEntity.shouldRenderModel()) { - ModelRenderLogic renderLogic = modelEntity.getRenderLogic(); - return true; - } - - if (!(entity instanceof MultiTileBasicRender renderedEntity)) { - return false; - } - - if (entity instanceof MultiBlockPart) { - final IMultiBlockController controller = ((MultiBlockPart) entity).getTarget(false); - if (controller instanceof ModelRenderLogicHost && ((ModelRenderLogicHost) controller).shouldRenderModel()) { - return false; - } - } - - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - final ITexture texture = renderedEntity.getTexture(side); - if (texture == null) continue; - switch (side) { - case DOWN -> renderYNegative(world, renderer, x, y, z, block, texture, side); - case UP -> renderYPositive(world, renderer, x, y, z, block, texture, side); - case WEST -> renderXNegative(world, renderer, x, y, z, block, texture, side); - case EAST -> renderXPositive(world, renderer, x, y, z, block, texture, side); - case NORTH -> renderZNegative(world, renderer, x, y, z, block, texture, side); - case SOUTH -> renderZPositive(world, renderer, x, y, z, block, texture, side); - default -> { - // Do nothing - } - } - } - return true; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return renderID; - } - - private static void renderYNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, - ITexture texture, ForgeDirection side) { - if (world != null) { - if (!block.shouldSideBeRendered(world, x, y - 1, z, side.ordinal())) return; - Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y - 1, z)); - } - texture.renderYNeg(renderer, block, x, y, z); - } - - private static void renderZNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, - ITexture texture, ForgeDirection side) { - if (world != null) { - if (!block.shouldSideBeRendered(world, x, y, z - 1, side.ordinal())) return; - Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z - 1)); - } - texture.renderZNeg(renderer, block, x, y, z); - } - - private static void renderXNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, - ITexture texture, ForgeDirection side) { - if (world != null) { - if (!block.shouldSideBeRendered(world, x - 1, y, z, side.ordinal())) return; - Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x - 1, y, z)); - } - texture.renderXNeg(renderer, block, x, y, z); - } - - private static void renderYPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, - ITexture texture, ForgeDirection side) { - if (world != null) { - if (!block.shouldSideBeRendered(world, x, y + 1, z, side.ordinal())) return; - Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y + 1, z)); - } - texture.renderYPos(renderer, block, x, y, z); - } - - private static void renderXPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, - ITexture texture, ForgeDirection side) { - if (world != null) { - if (!block.shouldSideBeRendered(world, x + 1, y, z, side.ordinal())) return; - Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x + 1, y, z)); - } - texture.renderXPos(renderer, block, x, y, z); - } - - private static void renderZPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, - ITexture texture, ForgeDirection side) { - if (world != null) { - if (!block.shouldSideBeRendered(world, x, y, z + 1, side.ordinal())) return; - Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z + 1)); - } - texture.renderZPos(renderer, block, x, y, z); - } -} diff --git a/src/main/java/gregtech/common/render/GT_PollutionRenderer.java b/src/main/java/gregtech/common/render/GT_PollutionRenderer.java deleted file mode 100644 index 476305f1b3..0000000000 --- a/src/main/java/gregtech/common/render/GT_PollutionRenderer.java +++ /dev/null @@ -1,251 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityClientPlayerMP; -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.potion.Potion; -import net.minecraft.util.MathHelper; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraftforge.client.event.EntityViewRenderEvent; -import net.minecraftforge.event.world.WorldEvent; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.EventPriority; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.common.entities.GT_EntityFXPollution; -import gregtech.common.misc.GT_ClientPollutionMap; - -@SideOnly(Side.CLIENT) -public class GT_PollutionRenderer { - - private static GT_ClientPollutionMap pollutionMap; - private static int playerPollution = 0; - - private static final boolean DEBUG = false; - - // PARTICLES_POLLUTION_START + PARTICLES_POLLUTION_END -> Max Particles - private static final int PARTICLES_MAX_NUM = 100; - private static final int PARTICLES_POLLUTION_START = 400000; - private static final int PARTICLES_POLLUTION_END = 3500000; - - private static final int FOG_START_AT_POLLUTION = 400000; - private static final int FOG_MAX_AT_POLLUTION = 7000000; - // jump from linear to exponential fog. x*FOG_MAX_AT_POLLUTION+FOG_START_AT_POLLUTION - private static final double FOG_START_EXP_RATIO = 0.02D; - - private static final float[] fogColor = { 0.3f, 0.25f, 0.1f }; - private static final short[] grassColor = { 230, 180, 40 }; - private static final short[] leavesColor = { 160, 80, 15 }; - private static final short[] liquidColor = { 160, 200, 10 }; - private static final short[] foliageColor = { 160, 80, 15 }; - - // TODO need to soft update some blocks, grass and leaves does more often than liquid it looks like. - - public GT_PollutionRenderer() { - pollutionMap = new GT_ClientPollutionMap(); - } - - public void preLoad() { - net.minecraftforge.common.MinecraftForge.EVENT_BUS.register(this); - FMLCommonHandler.instance() - .bus() - .register(this); - } - - public void processPacket(ChunkCoordIntPair chunk, int pollution) { - pollutionMap.addChunkPollution(chunk.chunkXPos, chunk.chunkZPos, pollution); - } - - @SubscribeEvent(priority = EventPriority.HIGH) - public void enteredWorld(WorldEvent.Load event) { - EntityClientPlayerMP p = Minecraft.getMinecraft().thePlayer; - if (!event.world.isRemote || p == null) return; - pollutionMap.reset(); - } - - private static int color(int color, int pollution, int low, float high, short[] colors) { - if (pollution < low) return color; - - int r = (color >> 16) & 0xFF; - int g = (color >> 8) & 0xFF; - int b = color & 0xFF; - float p = (pollution - low) / high; - if (p > 1) p = 1; - float pi = 1 - p; - - r = ((int) (r * pi + p * colors[0])) & 0xFF; - g = ((int) (g * pi + p * colors[1])) & 0xFF; - b = ((int) (b * pi + p * colors[2])) & 0xFF; - - return (r & 0xFF) << 16 | (g & 0xFF) << 8 | b & 0xFF; - } - - // Methods for hodgepodge to color grass / foliage blocks etc. - public static int colorGrass(int oColor, int x, int z) { - return color(oColor, pollutionMap.getPollution(x, z) / 1000, 350, 600, grassColor); - } - - public static int colorLeaves(int oColor, int x, int z) { - return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, leavesColor); - } - - public static int colorLiquid(int oColor, int x, int z) { - return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, liquidColor); - } - - public static int colorFoliage(int oColor, int x, int z) { - return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, foliageColor); - } - - public static int getKnownPollution(int x, int z) { - return pollutionMap.getPollution(x, z); - } - - @SubscribeEvent(priority = EventPriority.LOW) - public void manipulateColor(EntityViewRenderEvent.FogColors event) { - if (!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) return; - - if (event.block.getMaterial() == Material.water || event.block.getMaterial() == Material.lava) return; - - float x = fogIntensityLastTick > 1 ? 1F : (float) fogIntensityLastTick; - float xi = 1 - x; - - event.red = xi * event.red + x * fogColor[0]; - event.green = xi * event.green + x * fogColor[1]; - event.blue = xi * event.blue + x * fogColor[2]; - } - - private static final int END_MAX_DISTANCE = 192 - 1; - private static double fogIntensityLastTick = 0; - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void renderGTPollutionFog(EntityViewRenderEvent.RenderFogEvent event) { - if (!GT_Mod.gregtechproxy.mRenderPollutionFog) return; - - if ((!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) - || (fogIntensityLastTick < FOG_START_EXP_RATIO)) return; - - if (event.fogMode == 0) { - double v = 1 - fogIntensityLastTick / FOG_START_EXP_RATIO; - // trying to smooth out jump from linear to exponential - GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); - GL11.glFogf(GL11.GL_FOG_START, (float) ((END_MAX_DISTANCE - 20) * 0.75F * v + 20)); - GL11.glFogf(GL11.GL_FOG_END, (float) (END_MAX_DISTANCE * (0.75F + v * 0.25F))); - } - // else if ( event.fogMode < 0) { } - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void renderGTPollutionFog(EntityViewRenderEvent.FogDensity event) { - if (!GT_Mod.gregtechproxy.mRenderPollutionFog) return; - - if (!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) return; - - if (event.entity.isPotionActive(Potion.blindness) || (fogIntensityLastTick < FOG_START_EXP_RATIO) - || event.block.getMaterial() == Material.water - || event.block.getMaterial() == Material.lava) return; - - GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP2); - event.density = (float) Math.pow(fogIntensityLastTick - FOG_START_EXP_RATIO, .75F) / 5 + 0.01F; - event.setCanceled(true); - } - - private double lastUpdate = 0; - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onRenderTick(TickEvent.RenderTickEvent event) { - Minecraft mc = Minecraft.getMinecraft(); - if (mc == null) return; - EntityClientPlayerMP player = mc.thePlayer; - if (player == null) return; - - if (event.phase == TickEvent.Phase.START) { - if (event.renderTickTime < lastUpdate) lastUpdate = lastUpdate - 1; - float step = (float) ((event.renderTickTime - lastUpdate) / 50); - lastUpdate = event.renderTickTime; - - float fogIntensity = (playerPollution - FOG_START_AT_POLLUTION) / (float) FOG_MAX_AT_POLLUTION; - if (fogIntensity > 1) fogIntensity = 1; - else if (fogIntensity < 0) fogIntensity = 0; - - double e = fogIntensity - fogIntensityLastTick; - if (e != 0) { - if (e > 0.2) e = 0.2D; - else if (e < -0.5) e = -0.5D; - - if (e > 0.001D || e < -0.001D) fogIntensityLastTick += step * e; - else fogIntensityLastTick = fogIntensity; - } - } else if (DEBUG) { - drawPollution("Intensity: " + (fogIntensityLastTick * 10000), 0); - drawPollution( - "Pollution: " + pollutionMap.getPollution( - Minecraft.getMinecraft().thePlayer.lastTickPosX, - Minecraft.getMinecraft().thePlayer.lastTickPosZ), - 20); - drawPollution( - "Density: " - + ((float) (Math.pow(fogIntensityLastTick - FOG_START_EXP_RATIO, .75F) / 5 + 0.01F) * 10000), - 40); - } - } - - // Adding dirt particles in the air - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onClientTick(TickEvent.ClientTickEvent event) { - if (!GT_Mod.gregtechproxy.mRenderDirtParticles) return; - Minecraft mc = Minecraft.getMinecraft(); - if (mc == null) return; - EntityClientPlayerMP player = mc.thePlayer; - if (player == null || (player.capabilities.isCreativeMode && !DEBUG)) return; - - World w = player.worldObj; - playerPollution = pollutionMap.getPollution(player.lastTickPosX, player.lastTickPosZ); - - float intensity = ((float) playerPollution - PARTICLES_POLLUTION_START) / PARTICLES_POLLUTION_END; - if (intensity < 0) return; - else if (intensity > 1) intensity = 1; - else intensity *= intensity; - - int x = MathHelper.floor_double(player.posX); - int y = MathHelper.floor_double(player.posY); - int z = MathHelper.floor_double(player.posZ); - - int numParticles = Math.round(intensity * PARTICLES_MAX_NUM); - - for (int l = 0; l < numParticles; ++l) { - int i1 = x + w.rand.nextInt(16) - w.rand.nextInt(16); - int j1 = y + w.rand.nextInt(16) - w.rand.nextInt(16); - int k1 = z + w.rand.nextInt(16) - w.rand.nextInt(16); - Block block = w.getBlock(i1, j1, k1); - - if (block.getMaterial() == Material.air) { - EntityFX fx = new GT_EntityFXPollution( - w, - (float) i1 + w.rand.nextFloat(), - (float) j1 + w.rand.nextFloat(), - (float) k1 + w.rand.nextFloat()); - mc.effectRenderer.addEffect(fx); - } - } - } - - private void drawPollution(String text, int off) { - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(text, 0, off, 0xFFFFFFFF); - GL11.glDisable(GL11.GL_BLEND); - GL11.glPopMatrix(); - } -} diff --git a/src/main/java/gregtech/common/render/GT_RenderDrone.java b/src/main/java/gregtech/common/render/GT_RenderDrone.java deleted file mode 100644 index af1336a219..0000000000 --- a/src/main/java/gregtech/common/render/GT_RenderDrone.java +++ /dev/null @@ -1,93 +0,0 @@ -package gregtech.common.render; - -import static gregtech.api.enums.Mods.GregTech; - -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.AdvancedModelLoader; -import net.minecraftforge.client.model.IModelCustom; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ClientRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.common.tileentities.render.TileDrone; - -@SideOnly(Side.CLIENT) -public class GT_RenderDrone extends TileEntitySpecialRenderer { - - private static final ResourceLocation DroneTexture = new ResourceLocation(GregTech.ID, "textures/model/drone.png"); - private static final IModelCustom Drone = AdvancedModelLoader - .loadModel(new ResourceLocation(GregTech.ID, "textures/model/drone.obj")); - - public GT_RenderDrone() { - ClientRegistry.bindTileEntitySpecialRenderer(TileDrone.class, this); - } - - @Override - public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { - if (!(tile instanceof TileDrone drone)) return; - final float size = 1.0f; - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - renderDrone(size); - renderBlade(drone, size); - GL11.glPopMatrix(); - } - - private void renderDrone(double size) { - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - this.bindTexture(DroneTexture); - GL11.glScaled(size, size, size); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); - Drone.renderOnly("drone", "box", "main"); - GL11.glDisable(GL11.GL_BLEND); - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glEnable(GL11.GL_LIGHTING); - } - - private void renderBlade(TileDrone drone, double size) { - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - this.bindTexture(DroneTexture); - GL11.glScaled(size, size, size); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); - GL11.glPushMatrix(); - GL11.glTranslated(-0.7d * size, -1 * size, -0.7 * size); - GL11.glRotated(drone.rotation, 0, 1, 0); - GL11.glTranslated(0.7d * size, 1 * size, 0.7 * size); - Drone.renderOnly("blade2"); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glTranslated(-0.7d * size, -1 * size, 0.7 * size); - GL11.glRotated(drone.rotation, 0, 1, 0); - GL11.glTranslated(0.7d * size, 1 * size, -0.7 * size); - Drone.renderOnly("blade3"); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glTranslated(0.7d * size, -1 * size, -0.7 * size); - GL11.glRotated(drone.rotation, 0, 1, 0); - GL11.glTranslated(-0.7d * size, 1 * size, 0.7 * size); - Drone.renderOnly("blade1"); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glTranslated(0.7d * size, -1 * size, 0.7 * size); - GL11.glRotated(drone.rotation, 0, 1, 0); - GL11.glTranslated(-0.7d * size, 1 * size, -0.7 * size); - Drone.renderOnly("blade4"); - GL11.glPopMatrix(); - GL11.glDisable(GL11.GL_BLEND); - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glEnable(GL11.GL_LIGHTING); - } -} diff --git a/src/main/java/gregtech/common/render/GT_RenderUtil.java b/src/main/java/gregtech/common/render/GT_RenderUtil.java deleted file mode 100644 index 68195513fe..0000000000 --- a/src/main/java/gregtech/common/render/GT_RenderUtil.java +++ /dev/null @@ -1,141 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.client.IItemRenderer; -import net.minecraftforge.common.util.ForgeDirection; - -import org.lwjgl.opengl.GL11; - -import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; - -public class GT_RenderUtil { - - public static void colorGTItem(ItemStack aStack) { - if (aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem) { - - short[] tModulation = aItem.getRGBa(aStack); - GL11.glColor4f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F, 255.0f); - } else { - System.out.println("WARNING: " + aStack.getDisplayName() + " does not have an associated GT colour."); - } - } - - public static void renderBlockIcon(RenderBlocks aRenderer, Block aBlock, double aX, double aY, double aZ, - IIcon aIcon, ForgeDirection side) { - switch (side) { - case DOWN -> aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon); - case UP -> aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon); - case NORTH -> aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon); - case SOUTH -> aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon); - case WEST -> aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon); - case EAST -> aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon); - } - } - - public static void renderItemIcon(IIcon icon, double size, double z, float nx, float ny, float nz) { - renderItemIcon(icon, 0.0D, 0.0D, size, size, z, nx, ny, nz); - } - - public static void renderItemIcon(IIcon icon, double xStart, double yStart, double xEnd, double yEnd, double z, - float nx, float ny, float nz) { - if (icon == null) { - return; - } - Tessellator.instance.startDrawingQuads(); - Tessellator.instance.setNormal(nx, ny, nz); - if (nz > 0.0F) { - Tessellator.instance.addVertexWithUV(xStart, yStart, z, icon.getMinU(), icon.getMinV()); - Tessellator.instance.addVertexWithUV(xEnd, yStart, z, icon.getMaxU(), icon.getMinV()); - Tessellator.instance.addVertexWithUV(xEnd, yEnd, z, icon.getMaxU(), icon.getMaxV()); - Tessellator.instance.addVertexWithUV(xStart, yEnd, z, icon.getMinU(), icon.getMaxV()); - } else { - Tessellator.instance.addVertexWithUV(xStart, yEnd, z, icon.getMinU(), icon.getMaxV()); - Tessellator.instance.addVertexWithUV(xEnd, yEnd, z, icon.getMaxU(), icon.getMaxV()); - Tessellator.instance.addVertexWithUV(xEnd, yStart, z, icon.getMaxU(), icon.getMinV()); - Tessellator.instance.addVertexWithUV(xStart, yStart, z, icon.getMinU(), icon.getMinV()); - } - Tessellator.instance.draw(); - } - - @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock") - public static void renderItem(IItemRenderer.ItemRenderType type, IIcon icon) { - Tessellator tessellator = Tessellator.instance; - float maxU = icon.getMaxU(); - float minV = icon.getMinV(); - float minU = icon.getMinU(); - float maxV = icon.getMaxV(); - - switch (type) { - case ENTITY -> { - if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { - ItemRenderer.renderItemIn2D( - tessellator, - maxU, - minV, - minU, - maxV, - icon.getIconWidth(), - icon.getIconHeight(), - 0.0625F); - } else { - GL11.glPushMatrix(); - - if (!RenderItem.renderInFrame) { - GL11.glRotatef(180.0F - RenderManager.instance.playerViewY, 0.0F, 1.0F, 0.0F); - } - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - tessellator.addVertexWithUV(0.0F - 0.5F, 0.0F - 0.25F, 0.0D, minU, maxV); - tessellator.addVertexWithUV(1.0F - 0.5F, 0.0F - 0.25F, 0.0D, maxU, maxV); - tessellator.addVertexWithUV(1.0F - 0.5F, 1.0F - 0.25F, 0.0D, maxU, minV); - tessellator.addVertexWithUV(0.0F - 0.5F, 1.0F - 0.25F, 0.0D, minU, minV); - tessellator.draw(); - - GL11.glPopMatrix(); - } - } - case EQUIPPED, EQUIPPED_FIRST_PERSON -> { - ItemRenderer.renderItemIn2D( - tessellator, - maxU, - minV, - minU, - maxV, - icon.getIconWidth(), - icon.getIconHeight(), - 0.0625F); - } - case INVENTORY -> { - renderItemIcon(icon, 16.0D, 0.001, 0.0F, 0.0F, -1.0F); - } - default -> {} - } - } - - public static void applyStandardItemTransform(IItemRenderer.ItemRenderType type) { - if (type == IItemRenderer.ItemRenderType.ENTITY) { - if (RenderItem.renderInFrame) { - // Magic numbers calculated from vanilla code - GL11.glScalef(1.025641F, 1.025641F, 1.025641F); - GL11.glTranslatef(0.0F, -0.05F, 0.0F); - } - - if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { - if (RenderItem.renderInFrame) { - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - } - // Magic numbers calculated from vanilla code - GL11.glTranslatef(-0.5F, -0.25F, 0.0421875F); - } - } - } -} diff --git a/src/main/java/gregtech/common/render/GT_RenderedTexture.java b/src/main/java/gregtech/common/render/GT_RenderedTexture.java deleted file mode 100644 index afaf3b290c..0000000000 --- a/src/main/java/gregtech/common/render/GT_RenderedTexture.java +++ /dev/null @@ -1,395 +0,0 @@ -package gregtech.common.render; - -import static gregtech.api.util.LightingHelper.MAX_BRIGHTNESS; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.alignment.IAlignment; -import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; -import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; -import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; - -import gregtech.GT_Mod; -import gregtech.api.interfaces.IColorModulationContainer; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.LightingHelper; - -public class GT_RenderedTexture extends GT_TextureBase implements ITexture, IColorModulationContainer { - - protected final IIconContainer mIconContainer; - private final short[] mRGBa; - private final boolean glow; - private final boolean stdOrient; - private final boolean useExtFacing; - - protected GT_RenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean allowAlpha, boolean glow, - boolean stdOrient, boolean extFacing) { - if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture"); - mIconContainer = aIcon; - mRGBa = aRGBa; - this.glow = glow; - this.stdOrient = stdOrient; - this.useExtFacing = extFacing; - } - - @Override - public boolean isOldTexture() { - return false; - } - - @Override - public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f); - final boolean enableAO = aRenderer.enableAO; - final LightingHelper lighting = new LightingHelper(aRenderer); - if (glow) { - if (!GT_Mod.gregtechproxy.mRenderGlowTextures) { - draw(aRenderer); - return; - } - aRenderer.enableAO = false; - lighting.setLightnessOverride(1.0F); - if (enableAO) lighting.setBrightnessOverride(MAX_BRIGHTNESS); - } - lighting.setupLightingXPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.EAST, mRGBa); - final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); - renderFaceXPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); - if (mIconContainer.getOverlayIcon() != null) { - lighting.setupColor(ForgeDirection.EAST, 0xffffff); - renderFaceXPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); - } - aRenderer.enableAO = enableAO; - draw(aRenderer); - } - - @Override - public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f); - final boolean enableAO = aRenderer.enableAO; - final LightingHelper lighting = new LightingHelper(aRenderer); - if (glow) { - if (!GT_Mod.gregtechproxy.mRenderGlowTextures) { - draw(aRenderer); - return; - } - aRenderer.enableAO = false; - lighting.setLightnessOverride(1.0F); - lighting.setBrightnessOverride(MAX_BRIGHTNESS); - } - lighting.setupLightingXNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.WEST, mRGBa); - final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); - renderFaceXNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); - if (mIconContainer.getOverlayIcon() != null) { - lighting.setupColor(ForgeDirection.WEST, 0xffffff); - renderFaceXNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); - } - aRenderer.enableAO = enableAO; - draw(aRenderer); - } - - @Override - public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f); - final boolean enableAO = aRenderer.enableAO; - final LightingHelper lighting = new LightingHelper(aRenderer); - if (glow) { - if (!GT_Mod.gregtechproxy.mRenderGlowTextures) { - draw(aRenderer); - return; - } - aRenderer.enableAO = false; - lighting.setLightnessOverride(1.0F); - lighting.setBrightnessOverride(MAX_BRIGHTNESS); - } - lighting.setupLightingYPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.UP, mRGBa); - final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); - renderFaceYPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); - if (mIconContainer.getOverlayIcon() != null) { - lighting.setupColor(ForgeDirection.UP, 0xffffff); - renderFaceYPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); - } - aRenderer.enableAO = enableAO; - draw(aRenderer); - } - - @Override - public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f); - final boolean enableAO = aRenderer.enableAO; - final LightingHelper lighting = new LightingHelper(aRenderer); - if (glow) { - if (!GT_Mod.gregtechproxy.mRenderGlowTextures) { - draw(aRenderer); - return; - } - aRenderer.enableAO = false; - lighting.setLightnessOverride(1.0F); - lighting.setBrightnessOverride(MAX_BRIGHTNESS); - } - lighting.setupLightingYNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.DOWN, mRGBa); - final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); - renderFaceYNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); - if (mIconContainer.getOverlayIcon() != null) { - Tessellator.instance.setColorRGBA(255, 255, 255, 255); - renderFaceYNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); - } - aRenderer.enableAO = enableAO; - draw(aRenderer); - } - - @Override - public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f); - final boolean enableAO = aRenderer.enableAO; - final LightingHelper lighting = new LightingHelper(aRenderer); - if (glow) { - if (!GT_Mod.gregtechproxy.mRenderGlowTextures) { - draw(aRenderer); - return; - } - aRenderer.enableAO = false; - lighting.setLightnessOverride(1.0F); - lighting.setBrightnessOverride(MAX_BRIGHTNESS); - } - lighting.setupLightingZPos(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.SOUTH, mRGBa); - final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); - renderFaceZPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); - if (mIconContainer.getOverlayIcon() != null) { - lighting.setupColor(ForgeDirection.SOUTH, 0xffffff); - renderFaceZPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); - } - aRenderer.enableAO = enableAO; - draw(aRenderer); - } - - @Override - public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f); - final boolean enableAO = aRenderer.enableAO; - final LightingHelper lighting = new LightingHelper(aRenderer); - if (glow) { - if (!GT_Mod.gregtechproxy.mRenderGlowTextures) { - draw(aRenderer); - return; - } - aRenderer.enableAO = false; - lighting.setLightnessOverride(1.0F); - lighting.setBrightnessOverride(MAX_BRIGHTNESS); - } - lighting.setupLightingZNeg(aBlock, aX, aY, aZ) - .setupColor(ForgeDirection.NORTH, mRGBa); - final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ); - renderFaceZNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation); - if (mIconContainer.getOverlayIcon() != null) { - lighting.setupColor(ForgeDirection.NORTH, 0xffffff); - renderFaceZNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation); - } - aRenderer.enableAO = enableAO; - draw(aRenderer); - } - - @Override - public short[] getRGBA() { - return mRGBa; - } - - @Override - public boolean isValidTexture() { - return mIconContainer != null; - } - - /** - * Renders the given texture to the bottom face of the block. Args: block, x, y, z, texture - */ - protected void renderFaceYNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, - ExtendedFacing extendedFacing) { - - switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { - case COUNTER_CLOCKWISE -> aRenderer.uvRotateBottom = 2; - case CLOCKWISE -> aRenderer.uvRotateBottom = 1; - case UPSIDE_DOWN -> aRenderer.uvRotateBottom = 3; - default -> aRenderer.uvRotateBottom = 0; - } - - final Flip aFlip = extendedFacing.getFlip(); - aRenderer.renderFaceYNeg( - Blocks.air, - x, - y, - z, - useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped - ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped() ^ !stdOrient, aFlip.isVerticallyFliped()) - : new GT_IconFlipped(icon, !stdOrient, false)); - aRenderer.uvRotateBottom = 0; - } - - /** - * Renders the given texture to the top face of the block. Args: block, x, y, z, texture - */ - protected void renderFaceYPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, - ExtendedFacing extendedFacing) { - - switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { - case COUNTER_CLOCKWISE -> aRenderer.uvRotateTop = 2; - case CLOCKWISE -> aRenderer.uvRotateTop = 1; - case UPSIDE_DOWN -> aRenderer.uvRotateTop = 3; - default -> aRenderer.uvRotateTop = 0; - } - - final Flip aFlip = extendedFacing.getFlip(); - aRenderer.renderFaceYPos( - Blocks.air, - x, - y, - z, - useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped - ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) - : icon); - aRenderer.uvRotateTop = 0; - } - - /** - * Renders the given texture to the north (z-negative) face of the block. Args: block, x, y, z, texture - */ - protected void renderFaceZNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, - ExtendedFacing extendedFacing) { - aRenderer.field_152631_f = true; - // **NOT A BUG**: aRenderer.uvRotateEast REALLY CONTROLS THE ROTATION OF THE NORTH SIDE - switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { - case COUNTER_CLOCKWISE -> aRenderer.uvRotateEast = 2; - case CLOCKWISE -> aRenderer.uvRotateEast = 1; - case UPSIDE_DOWN -> aRenderer.uvRotateEast = 3; - default -> aRenderer.uvRotateEast = 0; - } - - final Flip aFlip = extendedFacing.getFlip(); - aRenderer.renderFaceZNeg( - Blocks.air, - x, - y, - z, - useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped - ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) - : icon); - aRenderer.uvRotateEast = 0; - aRenderer.field_152631_f = false; - } - - /** - * Renders the given texture to the south (z-positive) face of the block. Args: block, x, y, z, texture - */ - protected void renderFaceZPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, - ExtendedFacing extendedFacing) { - // **NOT A BUG**: aRenderer.uvRotateWest REALLY CONTROLS THE ROTATION OF THE SOUTH SIDE - switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { - case COUNTER_CLOCKWISE -> aRenderer.uvRotateWest = 2; - case CLOCKWISE -> aRenderer.uvRotateWest = 1; - case UPSIDE_DOWN -> aRenderer.uvRotateWest = 3; - default -> aRenderer.uvRotateWest = 0; - } - - final Flip aFlip = extendedFacing.getFlip(); - aRenderer.renderFaceZPos( - Blocks.air, - x, - y, - z, - useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped - ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) - : icon); - aRenderer.uvRotateWest = 0; - } - - /** - * Renders the given texture to the west (x-negative) face of the block. Args: block, x, y, z, texture - */ - protected void renderFaceXNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, - ExtendedFacing extendedFacing) { - // **NOT A BUG**: aRenderer.uvRotateNorth REALLY CONTROLS THE ROTATION OF THE WEST SIDE - switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { - case COUNTER_CLOCKWISE -> aRenderer.uvRotateNorth = 2; - case CLOCKWISE -> aRenderer.uvRotateNorth = 1; - case UPSIDE_DOWN -> aRenderer.uvRotateNorth = 3; - default -> aRenderer.uvRotateNorth = 0; - } - - final Flip aFlip = extendedFacing.getFlip(); - aRenderer.renderFaceXNeg( - Blocks.air, - x, - y, - z, - useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped - ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) - : icon); - aRenderer.uvRotateNorth = 0; - } - - /** - * Renders the given texture to the east (x-positive) face of the block. Args: block, x, y, z, texture - */ - protected void renderFaceXPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon, - ExtendedFacing extendedFacing) { - aRenderer.field_152631_f = true; - // **NOT A BUG**: aRenderer.uvRotateSouth REALLY CONTROLS THE ROTATION OF THE EAST SIDE - switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) { - case COUNTER_CLOCKWISE -> aRenderer.uvRotateSouth = 2; - case CLOCKWISE -> aRenderer.uvRotateSouth = 1; - case UPSIDE_DOWN -> aRenderer.uvRotateSouth = 3; - default -> aRenderer.uvRotateSouth = 0; - } - - final Flip aFlip = extendedFacing.getFlip(); - aRenderer.renderFaceXPos( - Blocks.air, - x, - y, - z, - useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped - ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped()) - : icon); - aRenderer.uvRotateSouth = 0; - aRenderer.field_152631_f = false; - } - - private ExtendedFacing getExtendedFacing(int x, int y, int z) { - if (stdOrient) return ExtendedFacing.DEFAULT; - final EntityPlayer player = GT_Mod.gregtechproxy.getThePlayer(); - if (player == null) return ExtendedFacing.DEFAULT; - final World w = player.getEntityWorld(); - if (w == null) return ExtendedFacing.DEFAULT; - final TileEntity te = w.getTileEntity(x, y, z); - IAlignment alignment = null; - if (te instanceof IGregTechTileEntity) { - final IMetaTileEntity meta = ((IGregTechTileEntity) te).getMetaTileEntity(); - if (meta instanceof IAlignmentProvider) { - alignment = ((IAlignmentProvider) meta).getAlignment(); - } else if (meta != null) { - return ExtendedFacing.of( - meta.getBaseMetaTileEntity() - .getFrontFacing()); - } - } else if (te instanceof IAlignmentProvider) { - alignment = ((IAlignmentProvider) te).getAlignment(); - } - if (alignment != null) return alignment.getExtendedFacing(); - return ExtendedFacing.DEFAULT; - } -} diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Block.java b/src/main/java/gregtech/common/render/GT_Renderer_Block.java deleted file mode 100644 index aa61cc125e..0000000000 --- a/src/main/java/gregtech/common/render/GT_Renderer_Block.java +++ /dev/null @@ -1,779 +0,0 @@ -package gregtech.common.render; - -import static gregtech.api.enums.GT_Values.SIDE_DOWN; -import static gregtech.api.enums.GT_Values.SIDE_EAST; -import static gregtech.api.enums.GT_Values.SIDE_NORTH; -import static gregtech.api.enums.GT_Values.SIDE_SOUTH; -import static gregtech.api.enums.GT_Values.SIDE_UP; -import static gregtech.api.enums.GT_Values.SIDE_WEST; -import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_DOWN; -import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_EAST; -import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_NORTH; -import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_SOUTH; -import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_UP; -import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_WEST; -import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_FRESHFOAM; -import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_HARDENEDFOAM; -import static gregtech.api.interfaces.metatileentity.IConnectable.NO_CONNECTION; -import static net.minecraftforge.common.util.ForgeDirection.DOWN; -import static net.minecraftforge.common.util.ForgeDirection.EAST; -import static net.minecraftforge.common.util.ForgeDirection.NORTH; -import static net.minecraftforge.common.util.ForgeDirection.SOUTH; -import static net.minecraftforge.common.util.ForgeDirection.UP; -import static net.minecraftforge.common.util.ForgeDirection.VALID_DIRECTIONS; -import static net.minecraftforge.common.util.ForgeDirection.WEST; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.particle.EffectRenderer; -import net.minecraft.client.particle.EntityDiggingFX; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import org.lwjgl.opengl.GL11; - -import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity; -import gregtech.api.interfaces.tileentity.ITexturedTileEntity; -import gregtech.api.metatileentity.MetaPipeEntity; -import gregtech.api.objects.XSTR; -import gregtech.common.blocks.GT_Block_FrameBox; -import gregtech.common.blocks.GT_Block_Machines; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import gregtech.common.blocks.GT_TileEntity_Ores; - -@ThreadSafeISBRH(perThread = true) -public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { - - public static final float blockMin = 0.0F; - public static final float blockMax = 1.0F; - private static final float coverThickness = blockMax / 8.0F; - private static final float coverInnerMin = blockMin + coverThickness; - private static final float coverInnerMax = blockMax - coverThickness; - - @Deprecated - public static GT_Renderer_Block INSTANCE; - public static int mRenderID; - - public static void register() { - mRenderID = RenderingRegistry.getNextAvailableRenderId(); - INSTANCE = new GT_Renderer_Block(); - RenderingRegistry.registerBlockHandler(INSTANCE); - } - - private final ITexture[][] textureArray = new ITexture[6][]; - - public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, - RenderBlocks aRenderer) { - final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IPipeRenderedTileEntity pipeRenderedTileEntity) { - textureArray[0] = pipeRenderedTileEntity.getTextureCovered(DOWN); - textureArray[1] = pipeRenderedTileEntity.getTextureCovered(UP); - textureArray[2] = pipeRenderedTileEntity.getTextureCovered(NORTH); - textureArray[3] = pipeRenderedTileEntity.getTextureCovered(SOUTH); - textureArray[4] = pipeRenderedTileEntity.getTextureCovered(WEST); - textureArray[5] = pipeRenderedTileEntity.getTextureCovered(EAST); - return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); - } - if (tTileEntity instanceof IAllSidedTexturedTileEntity allSidedTexturedTileEntity) { - ITexture[] texture = allSidedTexturedTileEntity.getTexture(aBlock); - textureArray[0] = texture; - textureArray[1] = texture; - textureArray[2] = texture; - textureArray[3] = texture; - textureArray[4] = texture; - textureArray[5] = texture; - return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); - } - if (tTileEntity instanceof ITexturedTileEntity texturedTileEntity) { - textureArray[0] = texturedTileEntity.getTexture(aBlock, DOWN); - textureArray[1] = texturedTileEntity.getTexture(aBlock, UP); - textureArray[2] = texturedTileEntity.getTexture(aBlock, NORTH); - textureArray[3] = texturedTileEntity.getTexture(aBlock, SOUTH); - textureArray[4] = texturedTileEntity.getTexture(aBlock, WEST); - textureArray[5] = texturedTileEntity.getTexture(aBlock, EAST); - return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); - } - - return false; - } - - public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, - RenderBlocks aRenderer, ITexture[][] aTextures) { - aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_DOWN], true); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_UP], true); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_NORTH], true); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_SOUTH], true); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_WEST], true); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_EAST], true); - return true; - } - - final ITexture[][] tIcons = new ITexture[VALID_DIRECTIONS.length][]; - final ITexture[][] tCovers = new ITexture[VALID_DIRECTIONS.length][]; - final boolean[] tIsCovered = new boolean[VALID_DIRECTIONS.length]; - - public boolean renderPipeBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, - IPipeRenderedTileEntity aTileEntity, RenderBlocks aRenderer) { - final byte aConnections = aTileEntity.getConnections(); - if ((aConnections & (HAS_FRESHFOAM | HAS_HARDENEDFOAM)) != 0) { - return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer); - } - final float thickness = aTileEntity.getThickNess(); - if (thickness >= 0.99F) { - return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer); - } - // Range of block occupied by pipe - final float pipeMin = (blockMax - thickness) / 2.0F; - final float pipeMax = blockMax - pipeMin; - - for (int i = 0; i < VALID_DIRECTIONS.length; i++) { - final ForgeDirection iSide = VALID_DIRECTIONS[i]; - tIsCovered[i] = (aTileEntity.getCoverIDAtSide(iSide) != 0); - tCovers[i] = aTileEntity.getTexture(aBlock, iSide); - tIcons[i] = aTileEntity.getTextureUncovered(iSide); - - } - - switch (aConnections) { - case NO_CONNECTION -> { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - } - case CONNECTED_EAST | CONNECTED_WEST -> { - // EAST - WEST Pipe Sides - aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, blockMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - - // EAST - WEST Pipe Ends - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - } - case CONNECTED_DOWN | CONNECTED_UP -> { - // UP - DOWN Pipe Sides - aBlock.setBlockBounds(pipeMin, blockMin, pipeMin, pipeMax, blockMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - - // UP - DOWN Pipe Ends - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - } - case CONNECTED_NORTH | CONNECTED_SOUTH -> { - // NORTH - SOUTH Pipe Sides - aBlock.setBlockBounds(pipeMin, pipeMin, blockMin, pipeMax, pipeMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - - // NORTH - SOUTH Pipe Ends - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - } - default -> { - if ((aConnections & CONNECTED_WEST) == 0) { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - } else { - aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, pipeMin, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - } - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - if ((aConnections & CONNECTED_EAST) == 0) { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - } else { - aBlock.setBlockBounds(pipeMax, pipeMin, pipeMin, blockMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - } - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - if ((aConnections & CONNECTED_DOWN) == 0) { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - } else { - aBlock.setBlockBounds(pipeMin, blockMin, pipeMin, pipeMax, pipeMin, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - } - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - if ((aConnections & CONNECTED_UP) == 0) { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - } else { - aBlock.setBlockBounds(pipeMin, pipeMax, pipeMin, pipeMax, blockMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - } - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - if ((aConnections & CONNECTED_NORTH) == 0) { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - } else { - aBlock.setBlockBounds(pipeMin, pipeMin, blockMin, pipeMax, pipeMax, pipeMin); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - } - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false); - if ((aConnections & CONNECTED_SOUTH) == 0) { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - } else { - aBlock.setBlockBounds(pipeMin, pipeMin, pipeMax, pipeMax, pipeMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false); - } - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false); - } - } - - // Render covers on pipes - if (tIsCovered[SIDE_DOWN]) { - aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, coverInnerMin, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - if (!tIsCovered[SIDE_NORTH]) { - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - } - if (!tIsCovered[SIDE_SOUTH]) { - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - } - if (!tIsCovered[SIDE_WEST]) { - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - } - if (!tIsCovered[SIDE_EAST]) { - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - } - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - if ((aConnections & CONNECTED_DOWN) != 0) { - // Split outer face to leave hole for pipe - // Lower panel - aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMax, blockMin, pipeMin); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - // Upper panel - aRenderer.setRenderBounds(blockMin, blockMin, pipeMax, blockMax, blockMin, blockMax); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - // Middle left panel - aRenderer.setRenderBounds(blockMin, blockMin, pipeMin, pipeMin, blockMin, pipeMax); - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - // Middle right panel - aRenderer.setRenderBounds(pipeMax, blockMin, pipeMin, blockMax, blockMin, pipeMax); - } - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false); - } - - if (tIsCovered[SIDE_UP]) { - aBlock.setBlockBounds(blockMin, coverInnerMax, blockMin, blockMax, blockMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - if (!tIsCovered[SIDE_NORTH]) { - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - } - if (!tIsCovered[SIDE_SOUTH]) { - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - } - if (!tIsCovered[SIDE_WEST]) { - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - } - if (!tIsCovered[SIDE_EAST]) { - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - } - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - if ((aConnections & CONNECTED_UP) != 0) { - // Split outer face to leave hole for pipe - // Lower panel - aRenderer.setRenderBounds(blockMin, blockMax, blockMin, blockMax, blockMax, pipeMin); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - // Upper panel - aRenderer.setRenderBounds(blockMin, blockMax, pipeMax, blockMax, blockMax, blockMax); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - // Middle left panel - aRenderer.setRenderBounds(blockMin, blockMax, pipeMin, pipeMin, blockMax, pipeMax); - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - // Middle right panel - aRenderer.setRenderBounds(pipeMax, blockMax, pipeMin, blockMax, blockMax, pipeMax); - } - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false); - } - - if (tIsCovered[SIDE_NORTH]) { - aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, coverInnerMin); - aRenderer.setRenderBoundsFromBlock(aBlock); - if (!tIsCovered[SIDE_DOWN]) { - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - } - if (!tIsCovered[SIDE_UP]) { - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - } - if (!tIsCovered[SIDE_WEST]) { - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - } - if (!tIsCovered[SIDE_EAST]) { - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - } - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - if ((aConnections & CONNECTED_NORTH) != 0) { - // Split outer face to leave hole for pipe - // Lower panel - aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMax, pipeMin, blockMin); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - // Upper panel - aRenderer.setRenderBounds(blockMin, pipeMax, blockMin, blockMax, blockMax, blockMin); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - // Middle left panel - aRenderer.setRenderBounds(blockMin, pipeMin, blockMin, pipeMin, pipeMax, blockMin); - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - // Middle right panel - aRenderer.setRenderBounds(pipeMax, pipeMin, blockMin, blockMax, pipeMax, blockMin); - } - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false); - } - - if (tIsCovered[SIDE_SOUTH]) { - aBlock.setBlockBounds(blockMin, blockMin, coverInnerMax, blockMax, blockMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - if (!tIsCovered[SIDE_DOWN]) { - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - } - if (!tIsCovered[SIDE_UP]) { - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - } - if (!tIsCovered[SIDE_WEST]) { - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - } - if (!tIsCovered[SIDE_EAST]) { - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - } - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - if ((aConnections & CONNECTED_SOUTH) != 0) { - // Split outer face to leave hole for pipe - // Lower panel - aRenderer.setRenderBounds(blockMin, blockMin, blockMax, blockMax, pipeMin, blockMax); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - // Upper panel - aRenderer.setRenderBounds(blockMin, pipeMax, blockMax, blockMax, blockMax, blockMax); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - // Middle left panel - aRenderer.setRenderBounds(blockMin, pipeMin, blockMax, pipeMin, pipeMax, blockMax); - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - // Middle right panel - aRenderer.setRenderBounds(pipeMax, pipeMin, blockMax, blockMax, pipeMax, blockMax); - } - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false); - } - - if (tIsCovered[SIDE_WEST]) { - aBlock.setBlockBounds(blockMin, blockMin, blockMin, coverInnerMin, blockMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - if (!tIsCovered[SIDE_DOWN]) { - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - } - if (!tIsCovered[SIDE_UP]) { - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - } - if (!tIsCovered[SIDE_NORTH]) { - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - } - if (!tIsCovered[SIDE_SOUTH]) { - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - } - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - if ((aConnections & CONNECTED_WEST) != 0) { - // Split outer face to leave hole for pipe - // Lower panel - aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMin, pipeMin, blockMax); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - // Upper panel - aRenderer.setRenderBounds(blockMin, pipeMax, blockMin, blockMin, blockMax, blockMax); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - // Middle left panel - aRenderer.setRenderBounds(blockMin, pipeMin, blockMin, blockMin, pipeMax, pipeMin); - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - // Middle right panel - aRenderer.setRenderBounds(blockMin, pipeMin, pipeMax, blockMin, pipeMax, blockMax); - } - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false); - } - - if (tIsCovered[SIDE_EAST]) { - aBlock.setBlockBounds(coverInnerMax, blockMin, blockMin, blockMax, blockMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - if (!tIsCovered[SIDE_DOWN]) { - renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - } - if (!tIsCovered[SIDE_UP]) { - renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - } - if (!tIsCovered[SIDE_NORTH]) { - renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - } - if (!tIsCovered[SIDE_SOUTH]) { - renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - } - renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - - if ((aConnections & CONNECTED_EAST) != 0) { - // Split outer face to leave hole for pipe - // Lower panel - aRenderer.setRenderBounds(blockMax, blockMin, blockMin, blockMax, pipeMin, blockMax); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - // Upper panel - aRenderer.setRenderBounds(blockMax, pipeMax, blockMin, blockMax, blockMax, blockMax); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - // Middle left panel - aRenderer.setRenderBounds(blockMax, pipeMin, blockMin, blockMax, pipeMax, pipeMin); - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - // Middle right panel - aRenderer.setRenderBounds(blockMax, pipeMin, pipeMax, blockMax, pipeMax, blockMax); - } - renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false); - } - aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - - return true; - } - - @SideOnly(Side.CLIENT) - public static void addHitEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z, - int ordinalSide) { - double rX = x + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; - double rY = y + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; - double rZ = z + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; - if (ordinalSide == 0) { - rY = y - 0.1; - } else if (ordinalSide == 1) { - rY = y + 1.1; - } else if (ordinalSide == 2) { - rZ = z - 0.1; - } else if (ordinalSide == 3) { - rZ = z + 1.1; - } else if (ordinalSide == 4) { - rX = x - 0.1; - } else if (ordinalSide == 5) { - rX = x + 1.1; - } - effectRenderer.addEffect( - (new EntityDiggingFX( - world, - rX, - rY, - rZ, - 0.0, - 0.0, - 0.0, - block, - block.getDamageValue(world, x, y, z), - ordinalSide)).applyColourMultiplier(x, y, z) - .multiplyVelocity(0.2F) - .multipleParticleScaleBy(0.6F)); - } - - @SideOnly(Side.CLIENT) - public static void addDestroyEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z) { - for (int iX = 0; iX < 4; ++iX) { - for (int iY = 0; iY < 4; ++iY) { - for (int iZ = 0; iZ < 4; ++iZ) { - final double bX = x + (iX + 0.5) / 4.0; - final double bY = y + (iY + 0.5) / 4.0; - final double bZ = z + (iZ + 0.5) / 4.0; - effectRenderer.addEffect( - (new EntityDiggingFX( - world, - bX, - bY, - bZ, - bX - x - 0.5, - bY - y - 0.5, - bZ - z - 0.5, - block, - block.getDamageValue(world, x, y, z))).applyColourMultiplier(x, y, z)); - } - } - } - } - - final GT_TileEntity_Ores tTileEntity = new GT_TileEntity_Ores(); - - @Override - public void renderInventoryBlock(Block aBlock, int aMeta, int aModelID, RenderBlocks aRenderer) { - aRenderer.enableAO = false; - aRenderer.useInventoryTint = true; - - GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - if (aBlock instanceof GT_Block_Ores_Abstract) { - tTileEntity.mMetaData = ((short) aMeta); - - aBlock.setBlockBoundsForItemRender(); - aRenderer.setRenderBoundsFromBlock(aBlock); - // spotless:off - ITexture[] texture = tTileEntity.getTexture(aBlock); - renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - // spotless:on - } else if (aMeta > 0 && (aMeta < GregTech_API.METATILEENTITIES.length) - && aBlock instanceof GT_Block_Machines - && (GregTech_API.METATILEENTITIES[aMeta] != null) - && (!GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer))) { - renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer); - } else if (aBlock instanceof GT_Block_FrameBox) { - ITexture[] texture = ((GT_Block_FrameBox) aBlock).getTexture(aMeta); - aBlock.setBlockBoundsForItemRender(); - aRenderer.setRenderBoundsFromBlock(aBlock); - // spotless:off - renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); - // spotless:on - } - aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); - - aRenderer.setRenderBoundsFromBlock(aBlock); - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - aRenderer.useInventoryTint = false; - } - - private static void renderNormalInventoryMetaTileEntity(Block aBlock, int aMeta, RenderBlocks aRenderer) { - if ((aMeta <= 0) || (aMeta >= GregTech_API.METATILEENTITIES.length)) { - return; - } - final IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta]; - if (tMetaTileEntity == null) { - return; - } - aBlock.setBlockBoundsForItemRender(); - aRenderer.setRenderBoundsFromBlock(aBlock); - - final IGregTechTileEntity iGregTechTileEntity = tMetaTileEntity.getBaseMetaTileEntity(); - - // spotless:off - if ((iGregTechTileEntity instanceof IPipeRenderedTileEntity renderedPipe) - && (tMetaTileEntity instanceof MetaPipeEntity pipeEntity)) { - final float tThickness = renderedPipe.getThickNess(); - final float pipeMin = (blockMax - tThickness) / 2.0F; - final float pipeMax = blockMax - pipeMin; - - aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, blockMax, pipeMax, pipeMax); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, DOWN, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); - renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, UP, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); - renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, NORTH, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); - renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, SOUTH, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true); - renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, WEST, (CONNECTED_WEST | CONNECTED_EAST), -1, true, false), true); - renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, EAST, (CONNECTED_WEST | CONNECTED_EAST), -1, true, false), true); - } else { - renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, DOWN, WEST, -1, true, false), true); - renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, UP, WEST, -1, true, false), true); - renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, NORTH, WEST, -1, true, false), true); - renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, SOUTH, WEST, -1, true, false), true); - renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, WEST, WEST, -1, true, false), true); - renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, EAST, WEST, -1, true, false), true); - } - // spotless:on - } - - public static void renderNegativeYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, - int aZ, ITexture[] aIcon, boolean aFullBlock) { - if (aWorld != null) { - if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY - 1, aZ, 0))) return; - Tessellator.instance - .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY - 1 : aY, aZ)); - } - if (aIcon == null) return; - for (final ITexture iTexture : aIcon) { - if (iTexture != null) { - iTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ); - } - } - } - - public static void renderPositiveYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, - int aZ, ITexture[] aIcon, boolean aFullBlock) { - if (aWorld != null) { - if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY + 1, aZ, 1))) return; - Tessellator.instance - .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY + 1 : aY, aZ)); - } - if (aIcon == null) return; - for (final ITexture iTexture : aIcon) { - if (iTexture != null) { - iTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ); - } - } - } - - public static void renderNegativeZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, - int aZ, ITexture[] aIcon, boolean aFullBlock) { - if (aWorld != null) { - if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ - 1, 2))) return; - Tessellator.instance - .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ - 1 : aZ)); - } - if (aIcon == null) return; - for (final ITexture iTexture : aIcon) { - if (iTexture != null) { - iTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ); - } - } - } - - public static void renderPositiveZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, - int aZ, ITexture[] aIcon, boolean aFullBlock) { - if (aWorld != null) { - if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ + 1, 3))) return; - Tessellator.instance - .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ + 1 : aZ)); - } - if (aIcon == null) return; - for (final ITexture iTexture : aIcon) { - if (iTexture != null) { - iTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ); - } - } - } - - public static void renderNegativeXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, - int aZ, ITexture[] aIcon, boolean aFullBlock) { - if (aWorld != null) { - if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX - 1, aY, aZ, 4))) return; - Tessellator.instance - .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX - 1 : aX, aY, aZ)); - } - if (aIcon == null) return; - for (final ITexture iTexture : aIcon) { - if (iTexture != null) { - iTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ); - } - } - } - - public static void renderPositiveXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, - int aZ, ITexture[] aIcon, boolean aFullBlock) { - if (aWorld != null) { - if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX + 1, aY, aZ, 5))) return; - Tessellator.instance - .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX + 1 : aX, aY, aZ)); - } - if (aIcon == null) return; - for (final ITexture iTexture : aIcon) { - if (iTexture != null) { - iTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ); - } - } - } - - @Override - public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID, - RenderBlocks aRenderer) { - aRenderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion; - aRenderer.useInventoryTint = false; - - final TileEntity tileEntity = aWorld.getTileEntity(aX, aY, aZ); - - // If this block does not have a TE, render it as a normal block. - // Otherwise, render the TE instead. - if (tileEntity == null && aBlock instanceof GT_Block_FrameBox frameBlock) { - int meta = aWorld.getBlockMetadata(aX, aY, aZ); - ITexture[] texture = frameBlock.getTexture(meta); - if (texture == null) return false; - textureArray[0] = texture; - textureArray[1] = texture; - textureArray[2] = texture; - textureArray[3] = texture; - textureArray[4] = texture; - textureArray[5] = texture; - renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); - return true; - } - - if (tileEntity == null) return false; - - if (tileEntity instanceof IGregTechTileEntity) { - final IMetaTileEntity metaTileEntity; - if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null - && metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) { - aRenderer.enableAO = false; - return true; - } - } - if (tileEntity instanceof IPipeRenderedTileEntity - && renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) { - aRenderer.enableAO = false; - return true; - } - if (renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer)) { - aRenderer.enableAO = false; - return true; - } - return false; - } - - @Override - public boolean shouldRender3DInInventory(int aModel) { - return true; - } - - @Override - public int getRenderId() { - return this.mRenderID; - } -} diff --git a/src/main/java/gregtech/common/render/GT_SidedTexture.java b/src/main/java/gregtech/common/render/GT_SidedTexture.java deleted file mode 100644 index 7a851fd1e7..0000000000 --- a/src/main/java/gregtech/common/render/GT_SidedTexture.java +++ /dev/null @@ -1,78 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; - -import gregtech.api.interfaces.IColorModulationContainer; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.render.TextureFactory; - -public class GT_SidedTexture extends GT_TextureBase implements ITexture, IColorModulationContainer { - - protected final ITexture[] mTextures; - /** - * DO NOT MANIPULATE THE VALUES INSIDE THIS ARRAY!!! - *

- * Just set this variable to another different Array instead. Otherwise some colored things will get Problems. - */ - private final short[] mRGBa; - - protected GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, - IIconContainer aIcon3, IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa, boolean aAllowAlpha) { - if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture"); - mTextures = new ITexture[] { TextureFactory.of(aIcon0, aRGBa, aAllowAlpha), - TextureFactory.of(aIcon1, aRGBa, aAllowAlpha), TextureFactory.of(aIcon2, aRGBa, aAllowAlpha), - TextureFactory.of(aIcon3, aRGBa, aAllowAlpha), TextureFactory.of(aIcon4, aRGBa, aAllowAlpha), - TextureFactory.of(aIcon5, aRGBa, aAllowAlpha) }; - mRGBa = aRGBa; - } - - @Override - public boolean isOldTexture() { - return false; - } - - @Override - public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - mTextures[5].renderXPos(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - mTextures[4].renderXNeg(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - mTextures[1].renderYPos(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - mTextures[0].renderYNeg(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - mTextures[3].renderZPos(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) { - mTextures[2].renderZNeg(aRenderer, aBlock, aX, aY, aZ); - } - - @Override - public short[] getRGBA() { - return mRGBa; - } - - @Override - public boolean isValidTexture() { - for (ITexture renderedTexture : mTextures) { - if (!renderedTexture.isValidTexture()) return false; - } - return true; - } -} diff --git a/src/main/java/gregtech/common/render/GT_TextureBase.java b/src/main/java/gregtech/common/render/GT_TextureBase.java deleted file mode 100644 index 20188e2e01..0000000000 --- a/src/main/java/gregtech/common/render/GT_TextureBase.java +++ /dev/null @@ -1,31 +0,0 @@ -package gregtech.common.render; - -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.util.GT_UtilityClient; - -public abstract class GT_TextureBase implements ITexture { - - protected boolean isDrawing = false; - - @Override - public void startDrawingQuads(RenderBlocks aRenderer, float aNormalX, float aNormalY, float aNormalZ) { - if (aRenderer.useInventoryTint && (!isOldTexture() || !GT_UtilityClient.isDrawing(Tessellator.instance))) { - // Draw if we're not an old texture OR we are an old texture AND we're not already drawing - isDrawing = true; - Tessellator.instance.startDrawingQuads(); - Tessellator.instance.setNormal(aNormalX, aNormalY, aNormalZ); - } - } - - @Override - public void draw(RenderBlocks aRenderer) { - if (aRenderer.useInventoryTint && (!isOldTexture() || isDrawing)) { - // Draw if we're not an old texture OR we initiated the drawing - isDrawing = false; - Tessellator.instance.draw(); - } - } -} diff --git a/src/main/java/gregtech/common/render/GT_TextureBuilder.java b/src/main/java/gregtech/common/render/GT_TextureBuilder.java deleted file mode 100644 index af8a590fc1..0000000000 --- a/src/main/java/gregtech/common/render/GT_TextureBuilder.java +++ /dev/null @@ -1,151 +0,0 @@ -package gregtech.common.render; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.GT_Mod; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.ITextureBuilder; - -@SuppressWarnings({ "unused", "ClassWithTooManyFields" }) -public class GT_TextureBuilder implements ITextureBuilder { - - private final List iconContainerList; - private final List textureLayers; - private Block fromBlock; - private int fromMeta; - private ForgeDirection fromSide; - private short[] rgba; - private boolean allowAlpha; - private boolean stdOrient; - private boolean extFacing; - private boolean glow; - private Boolean worldCoord = null; - - public GT_TextureBuilder() { - textureLayers = new ArrayList<>(); - iconContainerList = new ArrayList<>(); - rgba = Dyes._NULL.mRGBa; - allowAlpha = true; - stdOrient = false; - glow = false; - } - - @Override - public ITextureBuilder setFromBlock(final Block block, final int meta) { - this.fromBlock = block; - this.fromMeta = meta; - this.fromSide = ForgeDirection.UNKNOWN; - return this; - } - - @Override - public ITextureBuilder setFromSide(final ForgeDirection side) { - this.fromSide = side; - return this; - } - - @Override - public ITextureBuilder addIcon(final IIconContainer... iconContainers) { - this.iconContainerList.addAll(Arrays.asList(iconContainers)); - return this; - } - - @Override - public ITextureBuilder setRGBA(final short[] rgba) { - this.rgba = rgba; - return this; - } - - @Override - public ITextureBuilder addLayer(final ITexture... iTextures) { - this.textureLayers.addAll(Arrays.asList(iTextures)); - return this; - } - - @Override - public ITextureBuilder setAllowAlpha(final boolean allowAlpha) { - this.allowAlpha = allowAlpha; - return this; - } - - @Override - public ITextureBuilder stdOrient() { - this.stdOrient = true; - return this; - } - - @Override - public ITextureBuilder useWorldCoord() { - this.worldCoord = true; - return this; - } - - @Override - public ITextureBuilder noWorldCoord() { - this.worldCoord = false; - return this; - } - - @Override - public ITextureBuilder extFacing() { - this.extFacing = true; - return this; - } - - @Override - public ITextureBuilder glow() { - glow = true; - return this; - } - - /** - * @inheritDoc - */ - @Override - public ITexture build() { - if (fromBlock != null) { - if (worldCoord == Boolean.TRUE || worldCoord == null && isCTMBlock(fromBlock, fromMeta)) - return new GT_CopiedCTMBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha); - else return new GT_CopiedBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha); - } - if (worldCoord != null) throw new IllegalStateException("worldCoord without from block"); - if (!textureLayers.isEmpty()) return new GT_MultiTexture(textureLayers.toArray(new ITexture[0])); - return switch (iconContainerList.size()) { - case 1 -> new GT_RenderedTexture(iconContainerList.get(0), rgba, allowAlpha, glow, stdOrient, extFacing); - case 6 -> new GT_SidedTexture( - iconContainerList.get(ForgeDirection.DOWN.ordinal()), - iconContainerList.get(ForgeDirection.UP.ordinal()), - iconContainerList.get(ForgeDirection.NORTH.ordinal()), - iconContainerList.get(ForgeDirection.SOUTH.ordinal()), - iconContainerList.get(ForgeDirection.WEST.ordinal()), - iconContainerList.get(ForgeDirection.EAST.ordinal()), - rgba, - allowAlpha); - default -> throw new IllegalStateException("Invalid sideIconContainer count"); - }; - } - - private boolean isCTMBlock(Block fromBlock, int fromMeta) { - return GT_Mod.gregtechproxy.mCTMBlockCache - .computeIfAbsent(fromBlock, (byte) fromMeta, GT_TextureBuilder::apply); - } - - private static Boolean apply(Block b, Byte m) { - Class clazz = b.getClass(); - while (clazz != Block.class) { - final String className = clazz.getName(); - if (GT_Values.mCTMDisabledBlock.contains(className)) return false; - if (GT_Values.mCTMEnabledBlock.contains(className)) return true; - clazz = clazz.getSuperclass(); - } - return false; - } -} diff --git a/src/main/java/gregtech/common/render/GT_WormholeRenderer.java b/src/main/java/gregtech/common/render/GT_WormholeRenderer.java deleted file mode 100644 index 43385eb861..0000000000 --- a/src/main/java/gregtech/common/render/GT_WormholeRenderer.java +++ /dev/null @@ -1,79 +0,0 @@ -package gregtech.common.render; - -import static com.github.technus.tectech.rendering.EOH.EOH_RenderingUtils.addRenderedBlockInWorld; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntity; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ClientRegistry; -import gregtech.common.tileentities.render.TileWormhole; - -public class GT_WormholeRenderer extends TileEntitySpecialRenderer { - - public GT_WormholeRenderer() { - ClientRegistry.bindTileEntitySpecialRenderer(TileWormhole.class, this); - } - - private static final double trimPercentage = .95; - private static final double corePercentage = trimPercentage / Math.sqrt(3); - - private static void render(Block coreBlock, double rotation) { - - GL11.glPushMatrix(); - GL11.glRotated(rotation, 2, 1, 0); - GL11.glScaled(-1, -1, -1); - - Tessellator.instance.startDrawingQuads(); - Tessellator.instance.setColorOpaque_F(1f, 1f, 1f); - addRenderedBlockInWorld(Blocks.quartz_block, 0, 0, 0, 0); - Tessellator.instance.draw(); - - GL11.glScaled(trimPercentage, trimPercentage, trimPercentage); - - Tessellator.instance.startDrawingQuads(); - Tessellator.instance.setColorOpaque_F(0.1f, 0.1f, 0.1f); - addRenderedBlockInWorld(Blocks.coal_block, 0, 0, 0, 0); - Tessellator.instance.draw(); - GL11.glPopMatrix(); - - if (coreBlock != null) { - GL11.glPushMatrix(); - GL11.glScaled(corePercentage, corePercentage, corePercentage); - GL11.glRotated(rotation, 0, -2, .1); - Tessellator.instance.startDrawingQuads(); - Tessellator.instance.setColorOpaque_F(1f, 1f, 1f); - addRenderedBlockInWorld(coreBlock, 0, 0, 0, 0); - Tessellator.instance.draw(); - GL11.glPopMatrix(); - } - - } - - @Override - public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { - - if (tile instanceof TileWormhole wTile) { - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - GL11.glScaled(wTile.targetRadius, wTile.targetRadius, wTile.targetRadius); - GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GL11.glDisable(GL11.GL_LIGHTING); - - double rotationTimer = wTile.getWorldObj() - .getWorldInfo() - .getWorldTotalTime() + timeSinceLastTick; - - this.bindTexture(TextureMap.locationBlocksTexture); - render(wTile.getBlock(), rotationTimer); - - GL11.glPopAttrib(); - GL11.glPopMatrix(); - } - } -} diff --git a/src/main/java/gregtech/common/render/IRenderedBlock.java b/src/main/java/gregtech/common/render/IRenderedBlock.java index 16268de750..9b55388770 100644 --- a/src/main/java/gregtech/common/render/IRenderedBlock.java +++ b/src/main/java/gregtech/common/render/IRenderedBlock.java @@ -102,12 +102,12 @@ public interface IRenderedBlock { @Override public boolean renderBlock(Block aBlock, RenderBlocks aRenderer, IBlockAccess aWorld, int aX, int aY, int aZ) { aBlock.setBlockBounds(-0.25F, -0.25F, -0.25F, 1.25F, 1.25F, 1.25F); - GT_Renderer_Block.renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); - GT_Renderer_Block.renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); - GT_Renderer_Block.renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); - GT_Renderer_Block.renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); - GT_Renderer_Block.renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); - GT_Renderer_Block.renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GTRendererBlock.renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GTRendererBlock.renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GTRendererBlock.renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GTRendererBlock.renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GTRendererBlock.renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GTRendererBlock.renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); return true; } } diff --git a/src/main/java/gregtech/common/render/LaserRenderer.java b/src/main/java/gregtech/common/render/LaserRenderer.java new file mode 100644 index 0000000000..4afdbcf5ca --- /dev/null +++ b/src/main/java/gregtech/common/render/LaserRenderer.java @@ -0,0 +1,91 @@ +package gregtech.common.render; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ClientRegistry; +import gregtech.common.tileentities.render.TileEntityLaser; + +public class LaserRenderer extends TileEntitySpecialRenderer { + + private double zOffset = 0.0; + private double xOffset = 0.0; + + // Relative to block size + final private double lineRadius = 0.03; + + final private float lineOpacity = 0.7F; + + final private float laserSpeed = 0.8F; + + public LaserRenderer() { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaser.class, this); + } + + private void maths(float counter) { + float tc = (0.05F * counter); + zOffset = 0.5 + 0.45 * Math.sin(2 * Math.PI * tc); + xOffset = 0.5 + 0.45 * Math.sin(0.5 * Math.PI * tc); + } + + private void renderFakeLine(TileEntityLaser laser, double x1, double y1, double z1, double x2, double y2, + double z2) { + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(laser.getRed(), laser.getGreen(), laser.getBlue(), lineOpacity); + tessellator.addVertex(x1 - lineRadius, y1, z1); + tessellator.addVertex(x1 + lineRadius, y1, z1); + tessellator.addVertex(x2 + lineRadius, y2, z2); + tessellator.addVertex(x2 - lineRadius, y2, z2); + + tessellator.addVertex(x1, y1, z1 - lineRadius); + tessellator.addVertex(x1, y1, z1 + lineRadius); + tessellator.addVertex(x2, y2, z2 + lineRadius); + tessellator.addVertex(x2, y2, z2 - lineRadius); + tessellator.draw(); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { + final TileEntityLaser ltile = (TileEntityLaser) tile; + + if (ltile.getShouldRender()) { + // Push GL state + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + + // Full brightness on this thing (Emits glow with shaders) + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.f, 240.f); + + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + GL11.glRotated(ltile.rotationAngle, ltile.rotAxisX, ltile.rotAxisY, ltile.rotAxisZ); + GL11.glTranslated(-x - 0.5, -y - 0.5, -z - 0.5); + + if (ltile.realism) { + renderFakeLine(ltile, x + xOffset, y + 4.0, z + zOffset, x + xOffset, y + 0.5, z + zOffset); + } else { + renderFakeLine(ltile, x + 0.5, y + 4.0, z + 0.5, x + xOffset, y + 0.5, z + zOffset); + } + + // Pop GL state + GL11.glPopAttrib(); + GL11.glPopMatrix(); + + // Movement calculations + maths(ltile.counter); + ltile.counter += laserSpeed; + if (ltile.counter >= 80) { + ltile.counter = 0; + } + } + } +} diff --git a/src/main/java/gregtech/common/render/MetaGeneratedToolRenderer.java b/src/main/java/gregtech/common/render/MetaGeneratedToolRenderer.java new file mode 100644 index 0000000000..0e9650401b --- /dev/null +++ b/src/main/java/gregtech/common/render/MetaGeneratedToolRenderer.java @@ -0,0 +1,130 @@ +package gregtech.common.render; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; + +import org.lwjgl.opengl.GL11; + +import gregtech.GTMod; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.IToolStats; +import gregtech.api.items.MetaGeneratedTool; + +public class MetaGeneratedToolRenderer implements IItemRenderer { + + public MetaGeneratedToolRenderer() { + for (MetaGeneratedTool tItem : MetaGeneratedTool.sInstances.values()) { + if (tItem != null) { + MinecraftForgeClient.registerItemRenderer(tItem, this); + } + } + } + + @Override + public boolean handleRenderType(ItemStack stack, ItemRenderType type) { + return (type == ItemRenderType.EQUIPPED_FIRST_PERSON) || (type == ItemRenderType.INVENTORY) + || (type == ItemRenderType.EQUIPPED) + || (type == ItemRenderType.ENTITY); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack stack, ItemRendererHelper helper) { + return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING + || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { + MetaGeneratedTool item = (MetaGeneratedTool) stack.getItem(); + GL11.glEnable(GL11.GL_BLEND); + GTRenderUtil.applyStandardItemTransform(type); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + IToolStats toolStats = item != null ? item.getToolStats(stack) : null; + if (toolStats != null) { + renderToolPart(type, stack, toolStats, false); + renderToolPart(type, stack, toolStats, true); + + if ((type == ItemRenderType.INVENTORY) + && (MetaGeneratedTool.getPrimaryMaterial(stack) != Materials._NULL)) { + if (GTMod.gregtechproxy.mRenderItemDurabilityBar) { + IIconContainer iconContainer; + long damage = MetaGeneratedTool.getToolDamage(stack); + long maxDamage = MetaGeneratedTool.getToolMaxDamage(stack); + if (damage <= 0L) { + iconContainer = Textures.ItemIcons.DURABILITY_BAR[8]; + } else if (damage >= maxDamage) { + iconContainer = Textures.ItemIcons.DURABILITY_BAR[0]; + } else { + iconContainer = Textures.ItemIcons.DURABILITY_BAR[((int) Math + .max(0L, Math.min(7L, (maxDamage - damage) * 8L / maxDamage)))]; + } + renderIcon(iconContainer); + } + + if (GTMod.gregtechproxy.mRenderItemChargeBar) { + IIconContainer iconContainer; + Long[] stats = item.getElectricStats(stack); + if ((stats != null) && (stats[3] < 0L)) { + long tCharge = item.getRealCharge(stack); + if (tCharge <= 0L) { + iconContainer = Textures.ItemIcons.ENERGY_BAR[0]; + } else if (tCharge >= stats[0]) { + iconContainer = Textures.ItemIcons.ENERGY_BAR[8]; + } else { + iconContainer = Textures.ItemIcons.ENERGY_BAR[(7 + - (int) Math.max(0L, Math.min(6L, (stats[0] - tCharge) * 7L / stats[0])))]; + } + } else { + iconContainer = null; + } + renderIcon(iconContainer); + } + } + } + GL11.glDisable(GL11.GL_BLEND); + } + + private void renderIcon(IIconContainer iconContainer) { + if (iconContainer != null) { + IIcon icon = iconContainer.getIcon(); + IIcon overlay = iconContainer.getOverlayIcon(); + if (icon != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GTRenderUtil.renderItemIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); + } + if (overlay != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GTRenderUtil.renderItemIcon(overlay, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); + } + } + } + + private static void renderToolPart(ItemRenderType type, ItemStack stack, IToolStats toolStats, boolean isToolHead) { + IIconContainer iconContainer = toolStats.getIcon(isToolHead, stack); + if (iconContainer != null) { + IIcon icon = iconContainer.getIcon(); + IIcon overlay = iconContainer.getOverlayIcon(); + if (icon != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + short[] modulation = toolStats.getRGBa(isToolHead, stack); + GL11.glColor3f(modulation[0] / 255.0F, modulation[1] / 255.0F, modulation[2] / 255.0F); + GTRenderUtil.renderItem(type, icon); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + } + if (overlay != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile()); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GTRenderUtil.renderItem(type, overlay); + } + } + } +} diff --git a/src/main/java/gregtech/common/render/MultiTileRenderer.java b/src/main/java/gregtech/common/render/MultiTileRenderer.java new file mode 100644 index 0000000000..8dca8c3c33 --- /dev/null +++ b/src/main/java/gregtech/common/render/MultiTileRenderer.java @@ -0,0 +1,179 @@ +package gregtech.common.render; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import gregtech.GTMod; +import gregtech.api.interfaces.ITexture; +import gregtech.api.logic.ModelRenderLogic; +import gregtech.api.logic.interfaces.ModelRenderLogicHost; +import gregtech.api.multitileentity.MultiTileEntityBlock; +import gregtech.api.multitileentity.MultiTileEntityClassContainer; +import gregtech.api.multitileentity.MultiTileEntityRegistry; +import gregtech.api.multitileentity.interfaces.IMultiBlockController; +import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; + +public class MultiTileRenderer implements ISimpleBlockRenderingHandler { + + private final int renderID; + public static MultiTileRenderer INSTANCE; + + public MultiTileRenderer() { + this.renderID = RenderingRegistry.getNextAvailableRenderId(); + INSTANCE = this; + RenderingRegistry.registerBlockHandler(this); + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + if (!(block instanceof MultiTileEntityBlock muteBlock)) { + return; + } + + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + final MultiTileEntityRegistry registry = muteBlock.getRegistry(); + if (registry == null) return; + final MultiTileEntityClassContainer classContainer = registry.getClassContainer(metadata); + if (classContainer == null) return; + renderer.setRenderBoundsFromBlock(muteBlock); + + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + final ITexture texture = classContainer.getReferenceTileEntity() + .getTexture(side); + if (texture == null) continue; + switch (side) { + case DOWN -> renderYNegative(null, renderer, 0, 0, 0, block, texture, side); + case UP -> renderYPositive(null, renderer, 0, 0, 0, block, texture, side); + case WEST -> renderXNegative(null, renderer, 0, 0, 0, block, texture, side); + case EAST -> renderXPositive(null, renderer, 0, 0, 0, block, texture, side); + case NORTH -> renderZNegative(null, renderer, 0, 0, 0, block, texture, side); + case SOUTH -> renderZPositive(null, renderer, 0, 0, 0, block, texture, side); + default -> { + // Do nothing + } + } + } + + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + final TileEntity entity = world.getTileEntity(x, y, z); + if (entity == null) { + return false; + } + + renderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GTMod.gregtechproxy.mRenderTileAmbientOcclusion; + renderer.useInventoryTint = false; + + if (entity instanceof ModelRenderLogicHost modelEntity && modelEntity.shouldRenderModel()) { + ModelRenderLogic renderLogic = modelEntity.getRenderLogic(); + return true; + } + + if (!(entity instanceof MultiTileBasicRender renderedEntity)) { + return false; + } + + if (entity instanceof MultiBlockPart) { + final IMultiBlockController controller = ((MultiBlockPart) entity).getTarget(false); + if (controller instanceof ModelRenderLogicHost && ((ModelRenderLogicHost) controller).shouldRenderModel()) { + return false; + } + } + + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + final ITexture texture = renderedEntity.getTexture(side); + if (texture == null) continue; + switch (side) { + case DOWN -> renderYNegative(world, renderer, x, y, z, block, texture, side); + case UP -> renderYPositive(world, renderer, x, y, z, block, texture, side); + case WEST -> renderXNegative(world, renderer, x, y, z, block, texture, side); + case EAST -> renderXPositive(world, renderer, x, y, z, block, texture, side); + case NORTH -> renderZNegative(world, renderer, x, y, z, block, texture, side); + case SOUTH -> renderZPositive(world, renderer, x, y, z, block, texture, side); + default -> { + // Do nothing + } + } + } + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return renderID; + } + + private static void renderYNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, + ITexture texture, ForgeDirection side) { + if (world != null) { + if (!block.shouldSideBeRendered(world, x, y - 1, z, side.ordinal())) return; + Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y - 1, z)); + } + texture.renderYNeg(renderer, block, x, y, z); + } + + private static void renderZNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, + ITexture texture, ForgeDirection side) { + if (world != null) { + if (!block.shouldSideBeRendered(world, x, y, z - 1, side.ordinal())) return; + Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z - 1)); + } + texture.renderZNeg(renderer, block, x, y, z); + } + + private static void renderXNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, + ITexture texture, ForgeDirection side) { + if (world != null) { + if (!block.shouldSideBeRendered(world, x - 1, y, z, side.ordinal())) return; + Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x - 1, y, z)); + } + texture.renderXNeg(renderer, block, x, y, z); + } + + private static void renderYPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, + ITexture texture, ForgeDirection side) { + if (world != null) { + if (!block.shouldSideBeRendered(world, x, y + 1, z, side.ordinal())) return; + Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y + 1, z)); + } + texture.renderYPos(renderer, block, x, y, z); + } + + private static void renderXPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, + ITexture texture, ForgeDirection side) { + if (world != null) { + if (!block.shouldSideBeRendered(world, x + 1, y, z, side.ordinal())) return; + Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x + 1, y, z)); + } + texture.renderXPos(renderer, block, x, y, z); + } + + private static void renderZPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block, + ITexture texture, ForgeDirection side) { + if (world != null) { + if (!block.shouldSideBeRendered(world, x, y, z + 1, side.ordinal())) return; + Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z + 1)); + } + texture.renderZPos(renderer, block, x, y, z); + } +} diff --git a/src/main/java/gregtech/common/render/PollutionRenderer.java b/src/main/java/gregtech/common/render/PollutionRenderer.java new file mode 100644 index 0000000000..3b97fc820f --- /dev/null +++ b/src/main/java/gregtech/common/render/PollutionRenderer.java @@ -0,0 +1,251 @@ +package gregtech.common.render; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.potion.Potion; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.event.world.WorldEvent; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.common.entities.EntityFXPollution; +import gregtech.common.misc.GTClientPollutionMap; + +@SideOnly(Side.CLIENT) +public class PollutionRenderer { + + private static GTClientPollutionMap pollutionMap; + private static int playerPollution = 0; + + private static final boolean DEBUG = false; + + // PARTICLES_POLLUTION_START + PARTICLES_POLLUTION_END -> Max Particles + private static final int PARTICLES_MAX_NUM = 100; + private static final int PARTICLES_POLLUTION_START = 400000; + private static final int PARTICLES_POLLUTION_END = 3500000; + + private static final int FOG_START_AT_POLLUTION = 400000; + private static final int FOG_MAX_AT_POLLUTION = 7000000; + // jump from linear to exponential fog. x*FOG_MAX_AT_POLLUTION+FOG_START_AT_POLLUTION + private static final double FOG_START_EXP_RATIO = 0.02D; + + private static final float[] fogColor = { 0.3f, 0.25f, 0.1f }; + private static final short[] grassColor = { 230, 180, 40 }; + private static final short[] leavesColor = { 160, 80, 15 }; + private static final short[] liquidColor = { 160, 200, 10 }; + private static final short[] foliageColor = { 160, 80, 15 }; + + // TODO need to soft update some blocks, grass and leaves does more often than liquid it looks like. + + public PollutionRenderer() { + pollutionMap = new GTClientPollutionMap(); + } + + public void preLoad() { + net.minecraftforge.common.MinecraftForge.EVENT_BUS.register(this); + FMLCommonHandler.instance() + .bus() + .register(this); + } + + public void processPacket(ChunkCoordIntPair chunk, int pollution) { + pollutionMap.addChunkPollution(chunk.chunkXPos, chunk.chunkZPos, pollution); + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public void enteredWorld(WorldEvent.Load event) { + EntityClientPlayerMP p = Minecraft.getMinecraft().thePlayer; + if (!event.world.isRemote || p == null) return; + pollutionMap.reset(); + } + + private static int color(int color, int pollution, int low, float high, short[] colors) { + if (pollution < low) return color; + + int r = (color >> 16) & 0xFF; + int g = (color >> 8) & 0xFF; + int b = color & 0xFF; + float p = (pollution - low) / high; + if (p > 1) p = 1; + float pi = 1 - p; + + r = ((int) (r * pi + p * colors[0])) & 0xFF; + g = ((int) (g * pi + p * colors[1])) & 0xFF; + b = ((int) (b * pi + p * colors[2])) & 0xFF; + + return (r & 0xFF) << 16 | (g & 0xFF) << 8 | b & 0xFF; + } + + // Methods for hodgepodge to color grass / foliage blocks etc. + public static int colorGrass(int oColor, int x, int z) { + return color(oColor, pollutionMap.getPollution(x, z) / 1000, 350, 600, grassColor); + } + + public static int colorLeaves(int oColor, int x, int z) { + return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, leavesColor); + } + + public static int colorLiquid(int oColor, int x, int z) { + return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, liquidColor); + } + + public static int colorFoliage(int oColor, int x, int z) { + return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, foliageColor); + } + + public static int getKnownPollution(int x, int z) { + return pollutionMap.getPollution(x, z); + } + + @SubscribeEvent(priority = EventPriority.LOW) + public void manipulateColor(EntityViewRenderEvent.FogColors event) { + if (!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) return; + + if (event.block.getMaterial() == Material.water || event.block.getMaterial() == Material.lava) return; + + float x = fogIntensityLastTick > 1 ? 1F : (float) fogIntensityLastTick; + float xi = 1 - x; + + event.red = xi * event.red + x * fogColor[0]; + event.green = xi * event.green + x * fogColor[1]; + event.blue = xi * event.blue + x * fogColor[2]; + } + + private static final int END_MAX_DISTANCE = 192 - 1; + private static double fogIntensityLastTick = 0; + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void renderGTPollutionFog(EntityViewRenderEvent.RenderFogEvent event) { + if (!GTMod.gregtechproxy.mRenderPollutionFog) return; + + if ((!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) + || (fogIntensityLastTick < FOG_START_EXP_RATIO)) return; + + if (event.fogMode == 0) { + double v = 1 - fogIntensityLastTick / FOG_START_EXP_RATIO; + // trying to smooth out jump from linear to exponential + GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GL11.glFogf(GL11.GL_FOG_START, (float) ((END_MAX_DISTANCE - 20) * 0.75F * v + 20)); + GL11.glFogf(GL11.GL_FOG_END, (float) (END_MAX_DISTANCE * (0.75F + v * 0.25F))); + } + // else if ( event.fogMode < 0) { } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void renderGTPollutionFog(EntityViewRenderEvent.FogDensity event) { + if (!GTMod.gregtechproxy.mRenderPollutionFog) return; + + if (!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) return; + + if (event.entity.isPotionActive(Potion.blindness) || (fogIntensityLastTick < FOG_START_EXP_RATIO) + || event.block.getMaterial() == Material.water + || event.block.getMaterial() == Material.lava) return; + + GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP2); + event.density = (float) Math.pow(fogIntensityLastTick - FOG_START_EXP_RATIO, .75F) / 5 + 0.01F; + event.setCanceled(true); + } + + private double lastUpdate = 0; + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onRenderTick(TickEvent.RenderTickEvent event) { + Minecraft mc = Minecraft.getMinecraft(); + if (mc == null) return; + EntityClientPlayerMP player = mc.thePlayer; + if (player == null) return; + + if (event.phase == TickEvent.Phase.START) { + if (event.renderTickTime < lastUpdate) lastUpdate = lastUpdate - 1; + float step = (float) ((event.renderTickTime - lastUpdate) / 50); + lastUpdate = event.renderTickTime; + + float fogIntensity = (playerPollution - FOG_START_AT_POLLUTION) / (float) FOG_MAX_AT_POLLUTION; + if (fogIntensity > 1) fogIntensity = 1; + else if (fogIntensity < 0) fogIntensity = 0; + + double e = fogIntensity - fogIntensityLastTick; + if (e != 0) { + if (e > 0.2) e = 0.2D; + else if (e < -0.5) e = -0.5D; + + if (e > 0.001D || e < -0.001D) fogIntensityLastTick += step * e; + else fogIntensityLastTick = fogIntensity; + } + } else if (DEBUG) { + drawPollution("Intensity: " + (fogIntensityLastTick * 10000), 0); + drawPollution( + "Pollution: " + pollutionMap.getPollution( + Minecraft.getMinecraft().thePlayer.lastTickPosX, + Minecraft.getMinecraft().thePlayer.lastTickPosZ), + 20); + drawPollution( + "Density: " + + ((float) (Math.pow(fogIntensityLastTick - FOG_START_EXP_RATIO, .75F) / 5 + 0.01F) * 10000), + 40); + } + } + + // Adding dirt particles in the air + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onClientTick(TickEvent.ClientTickEvent event) { + if (!GTMod.gregtechproxy.mRenderDirtParticles) return; + Minecraft mc = Minecraft.getMinecraft(); + if (mc == null) return; + EntityClientPlayerMP player = mc.thePlayer; + if (player == null || (player.capabilities.isCreativeMode && !DEBUG)) return; + + World w = player.worldObj; + playerPollution = pollutionMap.getPollution(player.lastTickPosX, player.lastTickPosZ); + + float intensity = ((float) playerPollution - PARTICLES_POLLUTION_START) / PARTICLES_POLLUTION_END; + if (intensity < 0) return; + else if (intensity > 1) intensity = 1; + else intensity *= intensity; + + int x = MathHelper.floor_double(player.posX); + int y = MathHelper.floor_double(player.posY); + int z = MathHelper.floor_double(player.posZ); + + int numParticles = Math.round(intensity * PARTICLES_MAX_NUM); + + for (int l = 0; l < numParticles; ++l) { + int i1 = x + w.rand.nextInt(16) - w.rand.nextInt(16); + int j1 = y + w.rand.nextInt(16) - w.rand.nextInt(16); + int k1 = z + w.rand.nextInt(16) - w.rand.nextInt(16); + Block block = w.getBlock(i1, j1, k1); + + if (block.getMaterial() == Material.air) { + EntityFX fx = new EntityFXPollution( + w, + (float) i1 + w.rand.nextFloat(), + (float) j1 + w.rand.nextFloat(), + (float) k1 + w.rand.nextFloat()); + mc.effectRenderer.addEffect(fx); + } + } + } + + private void drawPollution(String text, int off) { + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(text, 0, off, 0xFFFFFFFF); + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/gregtech/common/render/WormholeRenderer.java b/src/main/java/gregtech/common/render/WormholeRenderer.java new file mode 100644 index 0000000000..c9e2b61fe5 --- /dev/null +++ b/src/main/java/gregtech/common/render/WormholeRenderer.java @@ -0,0 +1,79 @@ +package gregtech.common.render; + +import static tectech.rendering.EOH.EOHRenderingUtils.addRenderedBlockInWorld; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ClientRegistry; +import gregtech.common.tileentities.render.TileEntityWormhole; + +public class WormholeRenderer extends TileEntitySpecialRenderer { + + public WormholeRenderer() { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityWormhole.class, this); + } + + private static final double trimPercentage = .95; + private static final double corePercentage = trimPercentage / Math.sqrt(3); + + private static void render(Block coreBlock, double rotation) { + + GL11.glPushMatrix(); + GL11.glRotated(rotation, 2, 1, 0); + GL11.glScaled(-1, -1, -1); + + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setColorOpaque_F(1f, 1f, 1f); + addRenderedBlockInWorld(Blocks.quartz_block, 0, 0, 0, 0); + Tessellator.instance.draw(); + + GL11.glScaled(trimPercentage, trimPercentage, trimPercentage); + + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setColorOpaque_F(0.1f, 0.1f, 0.1f); + addRenderedBlockInWorld(Blocks.coal_block, 0, 0, 0, 0); + Tessellator.instance.draw(); + GL11.glPopMatrix(); + + if (coreBlock != null) { + GL11.glPushMatrix(); + GL11.glScaled(corePercentage, corePercentage, corePercentage); + GL11.glRotated(rotation, 0, -2, .1); + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setColorOpaque_F(1f, 1f, 1f); + addRenderedBlockInWorld(coreBlock, 0, 0, 0, 0); + Tessellator.instance.draw(); + GL11.glPopMatrix(); + } + + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { + + if (tile instanceof TileEntityWormhole wTile) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + GL11.glScaled(wTile.targetRadius, wTile.targetRadius, wTile.targetRadius); + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GL11.glDisable(GL11.GL_LIGHTING); + + double rotationTimer = wTile.getWorldObj() + .getWorldInfo() + .getWorldTotalTime() + timeSinceLastTick; + + this.bindTexture(TextureMap.locationBlocksTexture); + render(wTile.getBlock(), rotationTimer); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + } +} diff --git a/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java b/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java index acb830de58..eac929d047 100644 --- a/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java +++ b/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java @@ -1,6 +1,6 @@ package gregtech.common.render.items; -import static gregtech.common.render.GT_RenderUtil.colorGTItem; +import static gregtech.common.render.GTRenderUtil.colorGTItem; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; @@ -14,9 +14,9 @@ import org.lwjgl.opengl.GL12; import com.gtnewhorizons.modularui.api.math.Pos2d; import gregtech.api.enums.Textures; -import gregtech.common.render.GT_RenderUtil; +import gregtech.common.render.GTRenderUtil; -public class CosmicNeutroniumRenderer extends GT_GeneratedMaterial_Renderer { +public class CosmicNeutroniumRenderer extends GeneratedMaterialRenderer { // spotless:off private static final Pos2d point0 = new Pos2d(0 - 10, 0 - 10); @@ -90,10 +90,10 @@ public class CosmicNeutroniumRenderer extends GT_GeneratedMaterial_Renderer { colorGTItem(item); if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) { - GT_RenderUtil.renderItemIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); + GTRenderUtil.renderItemIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); } else { GL11.glEnable(GL11.GL_DEPTH_TEST); - GT_RenderUtil.renderItem(type, icon); + GTRenderUtil.renderItem(type, icon); } GL11.glPopMatrix(); } diff --git a/src/main/java/gregtech/common/render/items/DataStickRenderer.java b/src/main/java/gregtech/common/render/items/DataStickRenderer.java new file mode 100644 index 0000000000..3411c24c83 --- /dev/null +++ b/src/main/java/gregtech/common/render/items/DataStickRenderer.java @@ -0,0 +1,42 @@ +package gregtech.common.render.items; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import gregtech.api.util.AssemblyLineUtils; + +// borrow form ae2 + +public class DataStickRenderer implements IItemRenderer { + + private final RenderItem ri = new RenderItem(); + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + final boolean isShiftHeld = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); + return type == ItemRenderType.INVENTORY && isShiftHeld; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + final ItemStack is = AssemblyLineUtils.getDataStickOutput(item); + final Minecraft mc = Minecraft.getMinecraft(); + + GL11.glPushAttrib(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT); + RenderHelper.enableGUIStandardItemLighting(); + this.ri.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), is, 0, 0); + RenderHelper.disableStandardItemLighting(); + GL11.glPopAttrib(); + } +} diff --git a/src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java b/src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java deleted file mode 100644 index 668b1daa6c..0000000000 --- a/src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java +++ /dev/null @@ -1,42 +0,0 @@ -package gregtech.common.render.items; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.item.ItemStack; -import net.minecraftforge.client.IItemRenderer; - -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; - -import gregtech.api.util.GT_AssemblyLineUtils; - -// borrow form ae2 - -public class GT_DataStick_Renderer implements IItemRenderer { - - private final RenderItem ri = new RenderItem(); - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - final boolean isShiftHeld = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); - return type == ItemRenderType.INVENTORY && isShiftHeld; - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - final ItemStack is = GT_AssemblyLineUtils.getDataStickOutput(item); - final Minecraft mc = Minecraft.getMinecraft(); - - GL11.glPushAttrib(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT); - RenderHelper.enableGUIStandardItemLighting(); - this.ri.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), is, 0, 0); - RenderHelper.disableStandardItemLighting(); - GL11.glPopAttrib(); - } -} diff --git a/src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java b/src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java deleted file mode 100644 index 84045446c2..0000000000 --- a/src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java +++ /dev/null @@ -1,166 +0,0 @@ -package gregtech.common.render.items; - -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Aluminium; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Chrome; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Iridium; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Neutronium; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Osmium; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_StainlessSteel; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Steel; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Titanium; -import static gregtech.api.enums.ItemList.Large_Fluid_Cell_TungstenSteel; -import static gregtech.api.enums.Mods.HodgePodge; - -import javax.annotation.Nullable; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.client.IItemRenderer; -import net.minecraftforge.fluids.FluidStack; - -import org.lwjgl.opengl.GL11; - -import com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.items.GT_MetaGenerated_Item; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.GT_RenderUtil; -import gregtech.loaders.ExtraIcons; - -public class GT_GeneratedItem_Renderer implements IItemRenderer { - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON - || type == ItemRenderType.INVENTORY - || type == ItemRenderType.ENTITY; - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING - || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); - } - - @Override - public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { - short aMetaData = (short) aStack.getItemDamage(); - if (!(aStack.getItem() instanceof GT_MetaGenerated_Item aItem)) return; - - GL11.glEnable(GL11.GL_BLEND); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - IIcon tIcon; - if (aItem.mIconList[(aMetaData - aItem.mOffset)].length > 1) { - Long[] tStats = aItem.mElectricStats.get(aMetaData); - - if ((tStats != null) && (tStats[3] < 0L)) { - long tCharge = aItem.getRealCharge(aStack); - - if (tCharge <= 0L) { - tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][1]; - } else { - - if (tCharge >= tStats[0]) { - tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][8]; - } else { - tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][(7 - - (int) Math.max(0L, Math.min(5L, (tStats[0] - tCharge) * 6L / tStats[0])))]; - } - } - } else { - tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0]; - } - } else { - tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0]; - } - - if (tIcon == null) tIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon(); - - markNeedsAnimationUpdate(tIcon); - - ItemList largeFluidCell = getLargeFluidCell(aStack); - if (largeFluidCell != null) { - renderLargeFluidCellExtraParts(type, largeFluidCell, aStack); - } - - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GT_RenderUtil.renderItem(type, tIcon); - GL11.glDisable(GL11.GL_BLEND); - } - - @Nullable - private static ItemList getLargeFluidCell(ItemStack stack) { - if (isSame(Large_Fluid_Cell_Steel, stack)) return Large_Fluid_Cell_Steel; - if (isSame(Large_Fluid_Cell_Aluminium, stack)) return Large_Fluid_Cell_Aluminium; - if (isSame(Large_Fluid_Cell_TungstenSteel, stack)) return Large_Fluid_Cell_TungstenSteel; - if (isSame(Large_Fluid_Cell_StainlessSteel, stack)) return Large_Fluid_Cell_StainlessSteel; - if (isSame(Large_Fluid_Cell_Titanium, stack)) return Large_Fluid_Cell_Titanium; - if (isSame(Large_Fluid_Cell_Chrome, stack)) return Large_Fluid_Cell_Chrome; - if (isSame(Large_Fluid_Cell_Iridium, stack)) return Large_Fluid_Cell_Iridium; - if (isSame(Large_Fluid_Cell_Osmium, stack)) return Large_Fluid_Cell_Osmium; - if (isSame(Large_Fluid_Cell_Neutronium, stack)) return Large_Fluid_Cell_Neutronium; - - return null; - } - - private void renderLargeFluidCellExtraParts(IItemRenderer.ItemRenderType type, ItemList item, ItemStack stack) { - - IIcon inner = switch (item) { - case Large_Fluid_Cell_Steel -> ExtraIcons.steelLargeCellInner; - case Large_Fluid_Cell_Aluminium -> ExtraIcons.aluminiumLargeCellInner; - case Large_Fluid_Cell_StainlessSteel -> ExtraIcons.stainlesssteelLargeCellInner; - case Large_Fluid_Cell_Titanium -> ExtraIcons.titaniumLargeCellInner; - case Large_Fluid_Cell_TungstenSteel -> ExtraIcons.tungstensteelLargeCellInner; - case Large_Fluid_Cell_Iridium -> ExtraIcons.iridiumLargeCellInner; - case Large_Fluid_Cell_Osmium -> ExtraIcons.osmiumLargeCellInner; - case Large_Fluid_Cell_Chrome -> ExtraIcons.chromiumLargeCellInner; - case Large_Fluid_Cell_Neutronium -> ExtraIcons.neutroniumLargeCellInner; - default -> Textures.ItemIcons.RENDERING_ERROR.getIcon(); - }; - - // Empty inner side - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); - markNeedsAnimationUpdate(inner); - GT_RenderUtil.renderItem(type, inner); - - FluidStack fluidStack = GT_Utility.getFluidForFilledItem(stack, true); - - if (fluidStack != null && fluidStack.getFluid() != null) { - IIcon fluidIcon = fluidStack.getFluid() - .getIcon(fluidStack); - if (fluidIcon == null) { - fluidIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon(); - } - int fluidColor = fluidStack.getFluid() - .getColor(fluidStack); - - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); - markNeedsAnimationUpdate(fluidIcon); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor); - GT_RenderUtil.renderItem(type, fluidIcon); - - GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - } - - private static boolean isSame(ItemList item, ItemStack stack) { - ItemStack internal = item.getInternalStack_unsafe(); - if (GT_Utility.isStackInvalid(internal)) return false; - - return internal.getItem() == stack.getItem() && internal.getItemDamage() == stack.getItemDamage(); - } - - protected void markNeedsAnimationUpdate(IIcon icon) { - if (HodgePodge.isModLoaded() && icon instanceof IPatchedTextureAtlasSprite) { - ((IPatchedTextureAtlasSprite) icon).markNeedsAnimationUpdate(); - } - } -} diff --git a/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java b/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java deleted file mode 100644 index a67d5512ed..0000000000 --- a/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java +++ /dev/null @@ -1,130 +0,0 @@ -package gregtech.common.render.items; - -import static gregtech.api.enums.Mods.HodgePodge; - -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.client.IItemRenderer; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.lwjgl.opengl.GL11; - -import com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite; - -import codechicken.lib.render.TextureUtils; -import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.GT_RenderUtil; - -public class GT_GeneratedMaterial_Renderer implements IItemRenderer { - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON - || type == ItemRenderType.INVENTORY - || type == ItemRenderType.ENTITY; - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING - || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); - } - - /** - * Handle special fluid display rendering. Return false if does not need such kind of handling. Note: annotations - * should not be rendered here. Only render the fluid texture. Parameters are values passed from - * {@link IItemRenderer#renderItem(ItemRenderType, ItemStack, Object...)} verbatim. Do not modify the argument. - *

- * While this is called, BLEND and ALPHA_TEST is on. It is expected that these remain enabled while exit. - * - * @return true if did special fluid display rendering. false otherwise. - */ - public boolean renderFluidDisplayItem(ItemRenderType type, ItemStack aStack, Object... data) { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { - short aMetaData = (short) aStack.getItemDamage(); - if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return; - - int passes = 1; - if (aItem.requiresMultipleRenderPasses()) { - passes = aItem.getRenderPasses(aMetaData); - } - - for (int pass = 0; pass < passes; pass++) { - IIcon tIcon = aItem.getIcon(aMetaData, pass); - IIcon tOverlay = aItem.getOverlayIcon(aMetaData, pass); - FluidStack aFluid = GT_Utility.getFluidForFilledItem(aStack, true); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glEnable(GL11.GL_ALPHA_TEST); - - if (tIcon != null) { - markNeedsAnimationUpdate(tIcon); - renderRegularItem(type, aStack, tIcon, aFluid == null, pass, data); - } - - if (tOverlay != null && aFluid != null && aFluid.getFluid() != null) { - IIcon fluidIcon = aFluid.getFluid() - .getIcon(aFluid); - if (fluidIcon != null) { - markNeedsAnimationUpdate(fluidIcon); - // Adds colour to a cells fluid. Does not colour full fluid icons as shown in NEI etc. - renderContainedFluid(type, aFluid, fluidIcon); - } - } - - if (tOverlay != null) { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - TextureUtils.bindAtlas(aItem.getSpriteNumber()); - markNeedsAnimationUpdate(tOverlay); - renderItemOverlay(type, tOverlay); - } - - GL11.glDisable(GL11.GL_BLEND); - } - } - - protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor, - int pass, Object... data) { - renderRegularItem(type, aStack, icon, shouldModulateColor); - } - - protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor) { - if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return; - - if (shouldModulateColor) { - short[] tModulation = aItem.getRGBa(aStack); - GL11.glColor3f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F); - } - - GT_RenderUtil.renderItem(type, icon); - } - - protected void renderContainedFluid(ItemRenderType type, FluidStack aFluidStack, IIcon fluidIcon) { - Fluid aFluid = aFluidStack.getFluid(); - int tColor = aFluid.getColor(aFluidStack); - GL11.glColor3f((tColor >> 16 & 0xFF) / 255.0F, (tColor >> 8 & 0xFF) / 255.0F, (tColor & 0xFF) / 255.0F); - TextureUtils.bindAtlas(aFluid.getSpriteNumber()); - - GL11.glDepthFunc(GL11.GL_EQUAL); - GT_RenderUtil.renderItem(type, fluidIcon); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - protected void renderItemOverlay(ItemRenderType type, IIcon overlay) { - GT_RenderUtil.renderItem(type, overlay); - } - - protected void markNeedsAnimationUpdate(IIcon icon) { - if (HodgePodge.isModLoaded() && icon instanceof IPatchedTextureAtlasSprite) { - ((IPatchedTextureAtlasSprite) icon).markNeedsAnimationUpdate(); - } - } -} diff --git a/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java b/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java deleted file mode 100644 index d7425c2fcb..0000000000 --- a/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java +++ /dev/null @@ -1,85 +0,0 @@ -package gregtech.common.render.items; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.client.IItemRenderer; -import net.minecraftforge.client.MinecraftForgeClient; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.api.objects.ItemData; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.GT_RenderUtil; - -public class GT_MetaGenerated_Item_Renderer implements IItemRenderer { - - private final IItemRenderer mItemRenderer = new GT_GeneratedItem_Renderer(); - private final IItemRenderer mMaterialRenderer = new GT_GeneratedMaterial_Renderer(); - - private final IItemRenderer mDataStickRenderer = new GT_DataStick_Renderer(); - - public GT_MetaGenerated_Item_Renderer() {} - - public void registerItem(T item) { - MinecraftForgeClient.registerItemRenderer(item, this); - } - - @Override - public boolean handleRenderType(ItemStack aStack, ItemRenderType aType) { - if ((GT_Utility.isStackInvalid(aStack)) || (aStack.getItemDamage() < 0) - || !(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer) - || !((IGT_ItemWithMaterialRenderer) aStack.getItem()).shouldUseCustomRenderer(aStack.getItemDamage())) { - return false; - } - return getRendererForItemStack(aStack).handleRenderType(aStack, aType); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType aType, ItemStack aStack, ItemRendererHelper aHelper) { - if (GT_Utility.isStackInvalid(aStack)) { - return false; - } - return getRendererForItemStack(aStack).shouldUseRenderHelper(aType, aStack, aHelper); - } - - @Override - public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { - GT_RenderUtil.applyStandardItemTransform(type); - - IItemRenderer itemRenderer = getRendererForItemStack(aStack); - itemRenderer.renderItem(type, aStack, data); - } - - private IItemRenderer getRendererForItemStack(ItemStack aStack) { - short aMetaData = (short) aStack.getItemDamage(); - IGT_ItemWithMaterialRenderer aItem = (IGT_ItemWithMaterialRenderer) aStack.getItem(); - - if (aItem != null && aItem.allowMaterialRenderer(aMetaData)) { - IItemRenderer aMaterialRenderer = aItem.getMaterialRenderer(aMetaData); - - // Handle fluid rendering. - if (aMaterialRenderer == null) { - ItemData itemData = GT_OreDictUnificator.getAssociation(aStack); - if (itemData != null) { - Materials material = itemData.mMaterial.mMaterial; - if (material.renderer != null) { - aMaterialRenderer = material.renderer; - } - } - } - - return aMaterialRenderer != null ? aMaterialRenderer : mMaterialRenderer; - } - - // handle data stick - if (aStack.getItem() == ItemList.Tool_DataStick.getItem() && aStack.hasTagCompound() - && aStack.getTagCompound() - .hasKey("output")) { - return mDataStickRenderer; - } - - return mItemRenderer; - } -} diff --git a/src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java b/src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java index 08663adf4d..9de4afbef0 100644 --- a/src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java +++ b/src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java @@ -7,21 +7,21 @@ import net.minecraft.util.IIcon; import org.lwjgl.opengl.GL11; -import gregtech.GT_Mod; -import gregtech.common.render.GT_RenderUtil; +import gregtech.GTMod; +import gregtech.common.render.GTRenderUtil; -public class GaiaSpiritRenderer extends GT_GeneratedMaterial_Renderer { +public class GaiaSpiritRenderer extends GeneratedMaterialRenderer { @Override protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor) { - long animationTicks = GT_Mod.gregtechproxy.getAnimationTicks(); - float partialTicks = GT_Mod.gregtechproxy.getPartialRenderTicks(); + long animationTicks = GTMod.gregtechproxy.getAnimationTicks(); + float partialTicks = GTMod.gregtechproxy.getPartialRenderTicks(); if (shouldModulateColor) { Color color = Color.getHSBColor((animationTicks % 360 + partialTicks) % 180 / 180f, 0.4f, 0.9f); GL11.glColor3f(color.getRed() / 255.0F, color.getGreen() / 255.0F, color.getBlue() / 255.0F); } - GT_RenderUtil.renderItem(type, icon); + GTRenderUtil.renderItem(type, icon); } } diff --git a/src/main/java/gregtech/common/render/items/GeneratedItemRenderer.java b/src/main/java/gregtech/common/render/items/GeneratedItemRenderer.java new file mode 100644 index 0000000000..880e4b11c9 --- /dev/null +++ b/src/main/java/gregtech/common/render/items/GeneratedItemRenderer.java @@ -0,0 +1,166 @@ +package gregtech.common.render.items; + +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Aluminium; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Chrome; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Iridium; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Neutronium; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Osmium; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_StainlessSteel; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Steel; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Titanium; +import static gregtech.api.enums.ItemList.Large_Fluid_Cell_TungstenSteel; +import static gregtech.api.enums.Mods.HodgePodge; + +import javax.annotation.Nullable; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.fluids.FluidStack; + +import org.lwjgl.opengl.GL11; + +import com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.items.MetaGeneratedItem; +import gregtech.api.util.GTUtility; +import gregtech.common.render.GTRenderUtil; +import gregtech.loaders.ExtraIcons; + +public class GeneratedItemRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON + || type == ItemRenderType.INVENTORY + || type == ItemRenderType.ENTITY; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING + || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { + short aMetaData = (short) aStack.getItemDamage(); + if (!(aStack.getItem() instanceof MetaGeneratedItem aItem)) return; + + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + IIcon tIcon; + if (aItem.mIconList[(aMetaData - aItem.mOffset)].length > 1) { + Long[] tStats = aItem.mElectricStats.get(aMetaData); + + if ((tStats != null) && (tStats[3] < 0L)) { + long tCharge = aItem.getRealCharge(aStack); + + if (tCharge <= 0L) { + tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][1]; + } else { + + if (tCharge >= tStats[0]) { + tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][8]; + } else { + tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][(7 + - (int) Math.max(0L, Math.min(5L, (tStats[0] - tCharge) * 6L / tStats[0])))]; + } + } + } else { + tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0]; + } + } else { + tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0]; + } + + if (tIcon == null) tIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon(); + + markNeedsAnimationUpdate(tIcon); + + ItemList largeFluidCell = getLargeFluidCell(aStack); + if (largeFluidCell != null) { + renderLargeFluidCellExtraParts(type, largeFluidCell, aStack); + } + + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GTRenderUtil.renderItem(type, tIcon); + GL11.glDisable(GL11.GL_BLEND); + } + + @Nullable + private static ItemList getLargeFluidCell(ItemStack stack) { + if (isSame(Large_Fluid_Cell_Steel, stack)) return Large_Fluid_Cell_Steel; + if (isSame(Large_Fluid_Cell_Aluminium, stack)) return Large_Fluid_Cell_Aluminium; + if (isSame(Large_Fluid_Cell_TungstenSteel, stack)) return Large_Fluid_Cell_TungstenSteel; + if (isSame(Large_Fluid_Cell_StainlessSteel, stack)) return Large_Fluid_Cell_StainlessSteel; + if (isSame(Large_Fluid_Cell_Titanium, stack)) return Large_Fluid_Cell_Titanium; + if (isSame(Large_Fluid_Cell_Chrome, stack)) return Large_Fluid_Cell_Chrome; + if (isSame(Large_Fluid_Cell_Iridium, stack)) return Large_Fluid_Cell_Iridium; + if (isSame(Large_Fluid_Cell_Osmium, stack)) return Large_Fluid_Cell_Osmium; + if (isSame(Large_Fluid_Cell_Neutronium, stack)) return Large_Fluid_Cell_Neutronium; + + return null; + } + + private void renderLargeFluidCellExtraParts(IItemRenderer.ItemRenderType type, ItemList item, ItemStack stack) { + + IIcon inner = switch (item) { + case Large_Fluid_Cell_Steel -> ExtraIcons.steelLargeCellInner; + case Large_Fluid_Cell_Aluminium -> ExtraIcons.aluminiumLargeCellInner; + case Large_Fluid_Cell_StainlessSteel -> ExtraIcons.stainlesssteelLargeCellInner; + case Large_Fluid_Cell_Titanium -> ExtraIcons.titaniumLargeCellInner; + case Large_Fluid_Cell_TungstenSteel -> ExtraIcons.tungstensteelLargeCellInner; + case Large_Fluid_Cell_Iridium -> ExtraIcons.iridiumLargeCellInner; + case Large_Fluid_Cell_Osmium -> ExtraIcons.osmiumLargeCellInner; + case Large_Fluid_Cell_Chrome -> ExtraIcons.chromiumLargeCellInner; + case Large_Fluid_Cell_Neutronium -> ExtraIcons.neutroniumLargeCellInner; + default -> Textures.ItemIcons.RENDERING_ERROR.getIcon(); + }; + + // Empty inner side + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); + markNeedsAnimationUpdate(inner); + GTRenderUtil.renderItem(type, inner); + + FluidStack fluidStack = GTUtility.getFluidForFilledItem(stack, true); + + if (fluidStack != null && fluidStack.getFluid() != null) { + IIcon fluidIcon = fluidStack.getFluid() + .getIcon(fluidStack); + if (fluidIcon == null) { + fluidIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon(); + } + int fluidColor = fluidStack.getFluid() + .getColor(fluidStack); + + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); + markNeedsAnimationUpdate(fluidIcon); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor); + GTRenderUtil.renderItem(type, fluidIcon); + + GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + } + + private static boolean isSame(ItemList item, ItemStack stack) { + ItemStack internal = item.getInternalStack_unsafe(); + if (GTUtility.isStackInvalid(internal)) return false; + + return internal.getItem() == stack.getItem() && internal.getItemDamage() == stack.getItemDamage(); + } + + protected void markNeedsAnimationUpdate(IIcon icon) { + if (HodgePodge.isModLoaded() && icon instanceof IPatchedTextureAtlasSprite) { + ((IPatchedTextureAtlasSprite) icon).markNeedsAnimationUpdate(); + } + } +} diff --git a/src/main/java/gregtech/common/render/items/GeneratedMaterialRenderer.java b/src/main/java/gregtech/common/render/items/GeneratedMaterialRenderer.java new file mode 100644 index 0000000000..8d7b05981f --- /dev/null +++ b/src/main/java/gregtech/common/render/items/GeneratedMaterialRenderer.java @@ -0,0 +1,130 @@ +package gregtech.common.render.items; + +import static gregtech.api.enums.Mods.HodgePodge; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.lwjgl.opengl.GL11; + +import com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite; + +import codechicken.lib.render.TextureUtils; +import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; +import gregtech.api.util.GTUtility; +import gregtech.common.render.GTRenderUtil; + +public class GeneratedMaterialRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON + || type == ItemRenderType.INVENTORY + || type == ItemRenderType.ENTITY; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING + || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); + } + + /** + * Handle special fluid display rendering. Return false if does not need such kind of handling. Note: annotations + * should not be rendered here. Only render the fluid texture. Parameters are values passed from + * {@link IItemRenderer#renderItem(ItemRenderType, ItemStack, Object...)} verbatim. Do not modify the argument. + *

+ * While this is called, BLEND and ALPHA_TEST is on. It is expected that these remain enabled while exit. + * + * @return true if did special fluid display rendering. false otherwise. + */ + public boolean renderFluidDisplayItem(ItemRenderType type, ItemStack aStack, Object... data) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { + short aMetaData = (short) aStack.getItemDamage(); + if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return; + + int passes = 1; + if (aItem.requiresMultipleRenderPasses()) { + passes = aItem.getRenderPasses(aMetaData); + } + + for (int pass = 0; pass < passes; pass++) { + IIcon tIcon = aItem.getIcon(aMetaData, pass); + IIcon tOverlay = aItem.getOverlayIcon(aMetaData, pass); + FluidStack aFluid = GTUtility.getFluidForFilledItem(aStack, true); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + if (tIcon != null) { + markNeedsAnimationUpdate(tIcon); + renderRegularItem(type, aStack, tIcon, aFluid == null, pass, data); + } + + if (tOverlay != null && aFluid != null && aFluid.getFluid() != null) { + IIcon fluidIcon = aFluid.getFluid() + .getIcon(aFluid); + if (fluidIcon != null) { + markNeedsAnimationUpdate(fluidIcon); + // Adds colour to a cells fluid. Does not colour full fluid icons as shown in NEI etc. + renderContainedFluid(type, aFluid, fluidIcon); + } + } + + if (tOverlay != null) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + TextureUtils.bindAtlas(aItem.getSpriteNumber()); + markNeedsAnimationUpdate(tOverlay); + renderItemOverlay(type, tOverlay); + } + + GL11.glDisable(GL11.GL_BLEND); + } + } + + protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor, + int pass, Object... data) { + renderRegularItem(type, aStack, icon, shouldModulateColor); + } + + protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor) { + if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return; + + if (shouldModulateColor) { + short[] tModulation = aItem.getRGBa(aStack); + GL11.glColor3f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F); + } + + GTRenderUtil.renderItem(type, icon); + } + + protected void renderContainedFluid(ItemRenderType type, FluidStack aFluidStack, IIcon fluidIcon) { + Fluid aFluid = aFluidStack.getFluid(); + int tColor = aFluid.getColor(aFluidStack); + GL11.glColor3f((tColor >> 16 & 0xFF) / 255.0F, (tColor >> 8 & 0xFF) / 255.0F, (tColor & 0xFF) / 255.0F); + TextureUtils.bindAtlas(aFluid.getSpriteNumber()); + + GL11.glDepthFunc(GL11.GL_EQUAL); + GTRenderUtil.renderItem(type, fluidIcon); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + protected void renderItemOverlay(ItemRenderType type, IIcon overlay) { + GTRenderUtil.renderItem(type, overlay); + } + + protected void markNeedsAnimationUpdate(IIcon icon) { + if (HodgePodge.isModLoaded() && icon instanceof IPatchedTextureAtlasSprite) { + ((IPatchedTextureAtlasSprite) icon).markNeedsAnimationUpdate(); + } + } +} diff --git a/src/main/java/gregtech/common/render/items/GlitchEffectRenderer.java b/src/main/java/gregtech/common/render/items/GlitchEffectRenderer.java index f7e4413c97..b73a75f354 100644 --- a/src/main/java/gregtech/common/render/items/GlitchEffectRenderer.java +++ b/src/main/java/gregtech/common/render/items/GlitchEffectRenderer.java @@ -12,9 +12,9 @@ import org.lwjgl.opengl.GL11; import codechicken.lib.render.TextureUtils; import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; -public class GlitchEffectRenderer extends GT_GeneratedMaterial_Renderer { +public class GlitchEffectRenderer extends GeneratedMaterialRenderer { public Random rand = new Random(); int[] red = new int[] { 255, 50, 50, 192 }; @@ -73,7 +73,7 @@ public class GlitchEffectRenderer extends GT_GeneratedMaterial_Renderer { IIcon itemIcon = itemRenderer.getIcon(metaData, pass); IIcon overlay = itemRenderer.getOverlayIcon(metaData, pass); - FluidStack aFluid = GT_Utility.getFluidForFilledItem(item, true); + FluidStack aFluid = GTUtility.getFluidForFilledItem(item, true); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/main/java/gregtech/common/render/items/InfinityRenderer.java b/src/main/java/gregtech/common/render/items/InfinityRenderer.java index 3a98898b8a..c083024dd3 100644 --- a/src/main/java/gregtech/common/render/items/InfinityRenderer.java +++ b/src/main/java/gregtech/common/render/items/InfinityRenderer.java @@ -12,11 +12,11 @@ import org.lwjgl.opengl.GL11; import codechicken.lib.render.TextureUtils; import gregtech.api.enums.Textures; import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; // TODO: Render effects outside inventory. -public class InfinityRenderer extends GT_GeneratedMaterial_Renderer { +public class InfinityRenderer extends GeneratedMaterialRenderer { public Random rand = new Random(); @@ -33,7 +33,7 @@ public class InfinityRenderer extends GT_GeneratedMaterial_Renderer { for (int pass = 0; pass < passes; pass++) { IIcon tIcon = aItem.getIcon(aMetaData, pass); IIcon tOverlay = aItem.getOverlayIcon(aMetaData, pass); - FluidStack aFluid = GT_Utility.getFluidForFilledItem(aStack, true); + FluidStack aFluid = GTUtility.getFluidForFilledItem(aStack, true); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/main/java/gregtech/common/render/items/MetaGeneratedItemRenderer.java b/src/main/java/gregtech/common/render/items/MetaGeneratedItemRenderer.java new file mode 100644 index 0000000000..14d9b65e7f --- /dev/null +++ b/src/main/java/gregtech/common/render/items/MetaGeneratedItemRenderer.java @@ -0,0 +1,85 @@ +package gregtech.common.render.items; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; +import gregtech.api.objects.ItemData; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.render.GTRenderUtil; + +public class MetaGeneratedItemRenderer implements IItemRenderer { + + private final IItemRenderer mItemRenderer = new GeneratedItemRenderer(); + private final IItemRenderer mMaterialRenderer = new GeneratedMaterialRenderer(); + + private final IItemRenderer mDataStickRenderer = new DataStickRenderer(); + + public MetaGeneratedItemRenderer() {} + + public void registerItem(T item) { + MinecraftForgeClient.registerItemRenderer(item, this); + } + + @Override + public boolean handleRenderType(ItemStack aStack, ItemRenderType aType) { + if ((GTUtility.isStackInvalid(aStack)) || (aStack.getItemDamage() < 0) + || !(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer) + || !((IGT_ItemWithMaterialRenderer) aStack.getItem()).shouldUseCustomRenderer(aStack.getItemDamage())) { + return false; + } + return getRendererForItemStack(aStack).handleRenderType(aStack, aType); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType aType, ItemStack aStack, ItemRendererHelper aHelper) { + if (GTUtility.isStackInvalid(aStack)) { + return false; + } + return getRendererForItemStack(aStack).shouldUseRenderHelper(aType, aStack, aHelper); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { + GTRenderUtil.applyStandardItemTransform(type); + + IItemRenderer itemRenderer = getRendererForItemStack(aStack); + itemRenderer.renderItem(type, aStack, data); + } + + private IItemRenderer getRendererForItemStack(ItemStack aStack) { + short aMetaData = (short) aStack.getItemDamage(); + IGT_ItemWithMaterialRenderer aItem = (IGT_ItemWithMaterialRenderer) aStack.getItem(); + + if (aItem != null && aItem.allowMaterialRenderer(aMetaData)) { + IItemRenderer aMaterialRenderer = aItem.getMaterialRenderer(aMetaData); + + // Handle fluid rendering. + if (aMaterialRenderer == null) { + ItemData itemData = GTOreDictUnificator.getAssociation(aStack); + if (itemData != null) { + Materials material = itemData.mMaterial.mMaterial; + if (material.renderer != null) { + aMaterialRenderer = material.renderer; + } + } + } + + return aMaterialRenderer != null ? aMaterialRenderer : mMaterialRenderer; + } + + // handle data stick + if (aStack.getItem() == ItemList.Tool_DataStick.getItem() && aStack.hasTagCompound() + && aStack.getTagCompound() + .hasKey("output")) { + return mDataStickRenderer; + } + + return mItemRenderer; + } +} diff --git a/src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java b/src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java index 8583033e0f..7f619f2df5 100644 --- a/src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java +++ b/src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java @@ -13,11 +13,11 @@ import net.minecraftforge.fluids.FluidStack; import org.lwjgl.opengl.GL11; import codechicken.lib.render.TextureUtils; -import gregtech.GT_Mod; +import gregtech.GTMod; import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.api.util.GT_Util; +import gregtech.api.util.GTUtil; -public class TranscendentMetalRenderer extends GT_GeneratedMaterial_Renderer { +public class TranscendentMetalRenderer extends GeneratedMaterialRenderer { @Override public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { @@ -69,7 +69,7 @@ public class TranscendentMetalRenderer extends GT_GeneratedMaterial_Renderer { GL11.glPushMatrix(); Fluid fluid = fluidStack.getFluid(); - applyEffect(type, GT_Util.getRGBaArray(fluid.getColor()), true); + applyEffect(type, GTUtil.getRGBaArray(fluid.getColor()), true); TextureUtils.bindAtlas(fluid.getSpriteNumber()); GL11.glDepthFunc(GL11.GL_EQUAL); @@ -124,7 +124,7 @@ public class TranscendentMetalRenderer extends GT_GeneratedMaterial_Renderer { GL11.glTranslatef(0.5f, 0.5f, 0.0f); } - GL11.glRotatef((GT_Mod.gregtechproxy.getAnimationTicks() * 3.5f) % 360, 0.3f, 0.5f, 0.2f); + GL11.glRotatef((GTMod.gregtechproxy.getAnimationTicks() * 3.5f) % 360, 0.3f, 0.5f, 0.2f); GL11.glRotatef(180, 0.5f, 0.0f, 0.0f); if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) { diff --git a/src/main/java/gregtech/common/render/items/UniversiumRenderer.java b/src/main/java/gregtech/common/render/items/UniversiumRenderer.java index 92b86071cf..ecea6956de 100644 --- a/src/main/java/gregtech/common/render/items/UniversiumRenderer.java +++ b/src/main/java/gregtech/common/render/items/UniversiumRenderer.java @@ -22,10 +22,10 @@ import codechicken.lib.render.TextureUtils; import fox.spiteful.avaritia.render.CosmicRenderShenanigans; import gregtech.api.enums.ItemList; import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer; -import gregtech.common.render.GT_RenderUtil; +import gregtech.common.render.GTRenderUtil; @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock") -public class UniversiumRenderer extends GT_GeneratedMaterial_Renderer { +public class UniversiumRenderer extends GeneratedMaterialRenderer { private static final float cosmicOpacity = 2.5f; @@ -112,7 +112,7 @@ public class UniversiumRenderer extends GT_GeneratedMaterial_Renderer { mc.getTextureManager() .bindTexture(resourcelocation); } else { - GT_RenderUtil.renderItem(type, tIcon); + GTRenderUtil.renderItem(type, tIcon); } GL11.glEnable(GL11.GL_BLEND); @@ -133,7 +133,7 @@ public class UniversiumRenderer extends GT_GeneratedMaterial_Renderer { GL11.glColor4d(1, 1, 1, 1); // Draw cosmic overlay - GT_RenderUtil.renderItem(type, tIcon); + GTRenderUtil.renderItem(type, tIcon); CosmicRenderShenanigans.releaseShader(); CosmicRenderShenanigans.inventoryRender = false; @@ -141,7 +141,7 @@ public class UniversiumRenderer extends GT_GeneratedMaterial_Renderer { GL11.glEnable(GL12.GL_RESCALE_NORMAL); } else { // RENDER ITEM - GT_RenderUtil.renderItem(type, tIcon); + GTRenderUtil.renderItem(type, tIcon); int program = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); @@ -151,7 +151,7 @@ public class UniversiumRenderer extends GT_GeneratedMaterial_Renderer { CosmicRenderShenanigans.useShader(); // RENDER COSMIC OVERLAY - GT_RenderUtil.renderItem(type, tIcon); + GTRenderUtil.renderItem(type, tIcon); CosmicRenderShenanigans.releaseShader(); GL11.glDepthFunc(GL11.GL_LEQUAL); diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java deleted file mode 100644 index 67c38fad9e..0000000000 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java +++ /dev/null @@ -1,137 +0,0 @@ -package gregtech.common.tileentities.automation; - -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_CHESTBUFFER; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_CHESTBUFFER_GLOW; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Buffer; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_ChestBuffer extends GT_MetaTileEntity_Buffer { - - private static final int[] tickRate = { 400, 200, 100, 20, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; - private static final int[] maxStacks = { 1, 1, 1, 1, 1, 1, 2, 4, 8, 16, 32, 64, 128 }; - - public GT_MetaTileEntity_ChestBuffer(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 28, - new String[] { "Buffers up to 27 Item Stacks", "Use Screwdriver to regulate output stack size", - getTickRateDesc(aTier) }); - } - - public GT_MetaTileEntity_ChestBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); - } - - public GT_MetaTileEntity_ChestBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String[] aDescription) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); - } - - public GT_MetaTileEntity_ChestBuffer(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_ChestBuffer(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ChestBuffer( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture getOverlayIcon() { - return TextureFactory.of( - TextureFactory.of(AUTOMATION_CHESTBUFFER), - TextureFactory.builder() - .addIcon(AUTOMATION_CHESTBUFFER_GLOW) - .glow() - .build()); - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex < this.mInventory.length - 1; - } - - @Override - protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - if (aTimer % tickRate[mTier] > 0) return; - - // mSuccess will be negative if the call is caused by the %200 aTimer, always try to push. Otherwise it will be - // positive. - // For the first 6 ticks after a successful move (49->44), push every tick. Then go to every 5 ticks. - if ((mSuccess <= 0) || (mSuccess > 43) || ((mSuccess % 5) == 0)) { - super.moveItems(aBaseMetaTileEntity, aTimer, Math.min(MAX, maxStacks[mTier])); - } - - if (mSuccess < 0) { - mSuccess = 0; - } - } - - protected static String getTickRateDesc(int tier) { - int tickRate = getTickRate(tier); - String timeStr = ""; - String numStr = ""; - if (maxStacks[tier] > 1) { - numStr = maxStacks[tier] + " items"; - } else { - numStr = "1 item"; - } - if (tickRate < 20) timeStr = "1/" + 20 / tickRate + " "; - else if (tickRate > 20) { - timeStr = (tickRate / 20) + "th "; - } - return "Moves " + numStr + " every " + timeStr + "second"; - } - - protected static int getTickRate(int tier) { - if (tier > 9) return 1; - return tickRate[tier]; - } - - protected static int getMaxStacks(int tier) { - // Included higher tiers on the off chance they actually work without blowing things up lmao - return tier > 9 ? MAX : Math.min(maxStacks[tier], MAX); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - addSortStacksButton(builder); - addEmitRedstoneIfFullButton(builder); - addInvertRedstoneButton(builder); - addStockingModeButton(builder); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_22_RED.apply(69, true)) - .setPos(98, 60) - .setSize(51, 22)); - addMainUI(builder); - } - - protected void addMainUI(ModularWindow.Builder builder) { - addInventorySlots(builder); - } -} diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java deleted file mode 100644 index b6f1d53604..0000000000 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java +++ /dev/null @@ -1,144 +0,0 @@ -package gregtech.common.tileentities.automation; - -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_FILTER; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_FILTER_GLOW; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_FilterBase; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Filter extends GT_MetaTileEntity_FilterBase { - - private static final int NUM_FILTER_SLOTS = 9; - private static final String IGNORE_NBT_TOOLTIP = "GT5U.machines.ignore_nbt.tooltip"; - private boolean ignoreNbt = false; - - public GT_MetaTileEntity_Filter(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 19, - new String[] { "Filters up to 9 different Items", "Use Screwdriver to regulate output stack size" }); - } - - public GT_MetaTileEntity_Filter(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Filter(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Filter( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture getOverlayIcon() { - return TextureFactory.of( - TextureFactory.of(AUTOMATION_FILTER), - TextureFactory.builder() - .addIcon(AUTOMATION_FILTER_GLOW) - .glow() - .build()); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("bIgnoreNBT", this.ignoreNbt); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.ignoreNbt = aNBT.getBoolean("bIgnoreNBT"); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (!super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) { - return false; - } - if (this.invertFilter) { - for (int i = 0; i < NUM_FILTER_SLOTS; i++) { - if (GT_Utility.areStacksEqual(this.mInventory[FILTER_SLOT_INDEX + i], aStack, this.ignoreNbt)) { - return false; - } - } - return true; - } - return GT_Utility.areStacksEqual(this.mInventory[(FILTER_SLOT_INDEX + aIndex)], aStack, this.ignoreNbt); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - addAllowNbtButton(builder); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_WHITE.apply(9, false)) - .setPos(6, 19) - .setSize(9, 24)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_BLUE.apply(24, true)) - .setPos(71, 19) - .setSize(24, 24)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_RED.apply(19, true)) - .setPos(152, 19) - .setSize(19, 24)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3) - .setPos(16, 4) - .setSize(54, 54)) - .widget( - SlotGroup.ofItemHandler(inventoryHandler, 3) - .startFromSlot(FILTER_SLOT_INDEX) - .endAtSlot(FILTER_SLOT_INDEX + NUM_FILTER_SLOTS - 1) - .phantom(true) - .applyForWidget( - widget -> widget.disableShiftInsert() - .setBackground(GT_UITextures.TRANSPARENT)) - .build() - .setPos(16, 4)) - .widget( - SlotGroup.ofItemHandler(inventoryHandler, 3) - .startFromSlot(0) - .endAtSlot(NUM_INVENTORY_SLOTS - 1) - .build() - .setPos(97, 4)); - } - - private void addAllowNbtButton(ModularWindow.Builder builder) { - builder.widget( - createToggleButton( - () -> ignoreNbt, - val -> ignoreNbt = val, - GT_UITextures.OVERLAY_BUTTON_NBT, - () -> mTooltipCache.getData(IGNORE_NBT_TOOLTIP))); - } -} diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java deleted file mode 100644 index 58b7fa57df..0000000000 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java +++ /dev/null @@ -1,204 +0,0 @@ -package gregtech.common.tileentities.automation; - -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_ITEMDISTRIBUTOR; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_ITEMDISTRIBUTOR_GLOW; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; - -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Buffer; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_ItemDistributor extends GT_MetaTileEntity_Buffer { - - private byte[] itemsPerSide = new byte[6]; - private ForgeDirection currentSide = ForgeDirection.DOWN; - private byte currentSideItemCount = 0; - - public GT_MetaTileEntity_ItemDistributor(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 28, - new String[] { "Distributes Items between different Machine Sides", "Default Items per Machine Side: 0", - "Use Screwdriver to increase/decrease Items per Side" }); - } - - public GT_MetaTileEntity_ItemDistributor(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); - } - - public GT_MetaTileEntity_ItemDistributor(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_ItemDistributor(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ItemDistributor( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture getOverlayIcon() { - return TextureFactory.of( - TextureFactory.of(AUTOMATION_ITEMDISTRIBUTOR), - TextureFactory.builder() - .addIcon(AUTOMATION_ITEMDISTRIBUTOR_GLOW) - .glow() - .build()); - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return side == aBaseMetaTileEntity.getFrontFacing(); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - return mTextures[0][colorIndex + 1]; - } else { - return mTextures[1][colorIndex + 1]; - } - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] returnTextures = new ITexture[2][17][]; - ITexture baseIcon = getOverlayIcon(), pipeIcon = TextureFactory.of(Textures.BlockIcons.OVERLAY_PIPE_OUT); - for (int i = 0; i < 17; i++) { - returnTextures[0][i] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i], baseIcon }; - returnTextures[1][i] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i], pipeIcon, baseIcon }; - } - return returnTextures; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return getBaseMetaTileEntity().getFrontFacing() == side || itemsPerSide[side.ordinal()] == 0; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return getBaseMetaTileEntity().getFrontFacing() != side && itemsPerSide[side.ordinal()] > 0; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex < this.mInventory.length - 1; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - itemsPerSide = aNBT.getByteArray("mItemsPerSide"); - if (itemsPerSide.length != 6) { - itemsPerSide = new byte[6]; - } - currentSide = ForgeDirection.getOrientation(aNBT.getByte("mCurrentSide")); - currentSideItemCount = aNBT.getByte("mCurrentSideItemCount"); - } - - @Override - protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - int currentSideOrdinal = currentSide.ordinal(); - fillStacksIntoFirstSlots(); - int movedItems; - TileEntity adjacentTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(currentSide); - int inspectedSides = 0; - while (itemsPerSide[currentSideOrdinal] == 0) { - currentSideOrdinal = ((currentSideOrdinal + 1) % 6); - currentSide = ForgeDirection.getOrientation(currentSideOrdinal); - currentSideItemCount = 0; - adjacentTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(currentSide); - inspectedSides += 1; - if (inspectedSides == 6) { - return; - } - } - movedItems = GT_Utility.moveOneItemStack( - aBaseMetaTileEntity, - adjacentTileEntity, - currentSide, - currentSide.getOpposite(), - null, - false, - (byte) 64, - (byte) 1, - (byte) (itemsPerSide[currentSideOrdinal] - currentSideItemCount), - (byte) 1); - currentSideItemCount += movedItems; - if (currentSideItemCount >= itemsPerSide[currentSideOrdinal]) { - currentSideOrdinal = ((currentSideOrdinal + 1) % 6); - currentSide = ForgeDirection.getOrientation(currentSideOrdinal); - currentSideItemCount = 0; - } - if (movedItems > 0 || aBaseMetaTileEntity.hasInventoryBeenModified()) { - mSuccess = 50; - } - fillStacksIntoFirstSlots(); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - final int ordinalSide = side.ordinal(); - // Adjust items per side by 1 or -1, constrained to the cyclic interval [0, 127] - itemsPerSide[ordinalSide] += aPlayer.isSneaking() ? -1 : 1; - itemsPerSide[ordinalSide] = (byte) ((itemsPerSide[ordinalSide] + 128) % 128); - GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("211", "Items per side: ") + itemsPerSide[ordinalSide]); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setByteArray("mItemsPerSide", itemsPerSide); - aNBT.setByte("mCurrentSide", (byte) currentSide.ordinal()); - aNBT.setByte("mCurrentSideItemCount", currentSideItemCount); - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - super.setItemNBT(aNBT); - aNBT.setByteArray("mItemsPerSide", itemsPerSide); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - addEmitRedstoneIfFullButton(builder); - addInvertRedstoneButton(builder); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_22_RED.apply(87, true)) - .setPos(62, 60) - .setSize(87, 22)); - addInventorySlots(builder); - } -} diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java deleted file mode 100644 index d446009ac7..0000000000 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java +++ /dev/null @@ -1,326 +0,0 @@ -package gregtech.common.tileentities.automation; - -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_RECIPEFILTER; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_RECIPEFILTER_GLOW; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Collectors; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.Constants; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizons.modularui.api.drawable.Text; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import codechicken.nei.recipe.RecipeCatalysts; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.RecipeMapWorkable; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SpecialFilter; -import gregtech.api.multitileentity.MultiTileEntityItem; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Item_Machines; -import gregtech.loaders.preload.GT_Loader_MultiTileEntities; - -public class GT_MetaTileEntity_RecipeFilter extends GT_MetaTileEntity_SpecialFilter { - - private static final String TT_machineType = "GT5U.MBTT.MachineType"; - private static final String REPRESENTATION_SLOT_TOOLTIP = "GT5U.recipe_filter.representation_slot.tooltip"; - private static final String EMPTY_REPRESENTATION_SLOT_TOOLTIP = "GT5U.recipe_filter.empty_representation_slot.tooltip"; - public RecipeMap mRecipeMap; - private List filteredMachines = new ArrayList<>(); - public int mRotationIndex = 0; - - public GT_MetaTileEntity_RecipeFilter(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - new String[] { "Filters 1 Recipe Type", "Use Screwdriver to regulate output stack size" }); - } - - public GT_MetaTileEntity_RecipeFilter(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_RecipeFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - private static RecipeMap getItemStackMachineRecipeMap(ItemStack stack) { - if (stack != null) { - IMetaTileEntity metaTileEntity = GT_Item_Machines.getMetaTileEntity(stack); - if (metaTileEntity != null) { - return getMetaTileEntityRecipeMap(metaTileEntity); - } else if (stack.getItem() instanceof MultiTileEntityItem) { - return getMuTeRecipeMap(stack); - } - } - return null; - } - - private static RecipeMap getMetaTileEntityRecipeMap(IMetaTileEntity metaTileEntity) { - if (metaTileEntity instanceof RecipeMapWorkable recipeMapWorkable) { - return recipeMapWorkable.getRecipeMap(); - } - return null; - } - - private static RecipeMap getMuTeRecipeMap(@NotNull ItemStack stack) { - final TileEntity tileEntity = GT_Loader_MultiTileEntities.MACHINE_REGISTRY.getReferenceTileEntity(stack); - if (tileEntity instanceof RecipeMapWorkable recipeMapWorkable) { - return recipeMapWorkable.getRecipeMap(); - } - return null; - } - - private static List getFilteredMachines(RecipeMap recipeMap) { - return RecipeCatalysts.getRecipeCatalysts( - recipeMap.getFrontend() - .getUIProperties().neiTransferRectId) - .stream() - .map(positionedStack -> positionedStack.item) - .collect(Collectors.toList()); - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPreTick(aBaseMetaTileEntity, aTick); - if ((!getBaseMetaTileEntity().isServerSide()) || ((aTick % 8L != 0L) && mRotationIndex != -1)) return; - if (this.filteredMachines.isEmpty()) { - return; - } - this.mInventory[FILTER_SLOT_INDEX] = GT_Utility.copyAmount( - 1, - this.filteredMachines.get(this.mRotationIndex = (this.mRotationIndex + 1) % this.filteredMachines.size())); - if (this.mInventory[FILTER_SLOT_INDEX] == null) return; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_RecipeFilter( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture getOverlayIcon() { - return TextureFactory.of( - TextureFactory.of(AUTOMATION_RECIPEFILTER), - TextureFactory.builder() - .addIcon(AUTOMATION_RECIPEFILTER_GLOW) - .glow() - .build()); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (mRecipeMap != null) { - aNBT.setString("mRecipeMap", this.mRecipeMap.unlocalizedName); - } - NBTTagList tagList = new NBTTagList(); - for (ItemStack filteredMachine : filteredMachines) { - tagList.appendTag(filteredMachine.writeToNBT(new NBTTagCompound())); - } - aNBT.setTag("filteredMachines", tagList); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("mRecipeMap")); - filteredMachines.clear(); - NBTTagList tagList = aNBT.getTagList("filteredMachines", Constants.NBT.TAG_COMPOUND); - for (int i = 0; i < tagList.tagCount(); i++) { - ItemStack readStack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i)); - if (readStack != null) { - filteredMachines.add(readStack); - } - } - } - - @Override - protected boolean isStackAllowed(ItemStack aStack) { - return mRecipeMap != null && mRecipeMap.containsInput(aStack); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - builder.widget( - new FakeSyncWidget.StringSyncer( - () -> this.mRecipeMap == null ? "" : this.mRecipeMap.unlocalizedName, - id -> this.mRecipeMap = RecipeMap.ALL_RECIPE_MAPS.get(id))); - } - - @Override - protected List getEmptySlotTooltip() { - return Collections.singletonList(Text.localised(EMPTY_REPRESENTATION_SLOT_TOOLTIP)); - } - - @Override - public Function, List> getItemStackReplacementTooltip() { - if (mRecipeMap != null) { - List tooltip = assembleItemStackReplacementTooltip(mRecipeMap); - return list -> tooltip; - } - return super.getItemStackReplacementTooltip(); - } - - @NotNull - private List assembleItemStackReplacementTooltip(RecipeMap recipeMap) { - List tooltip = new ArrayList<>(); - tooltip.add( - StatCollector.translateToLocal(TT_machineType) + ": " - + EnumChatFormatting.YELLOW - + StatCollector.translateToLocal(recipeMap.unlocalizedName) - + EnumChatFormatting.RESET); - int recipeSize = recipeMap.getAllRecipes() - .size(); - if (recipeSize > 0) { - tooltip.add("Filter size: §e" + recipeSize + "§r"); - } - tooltip.addAll(mTooltipCache.getData(REPRESENTATION_SLOT_TOOLTIP).text); - return tooltip; - } - - @Override - protected SlotWidget createFilterIconSlot(BaseSlot slot) { - return new RecipeFilterIconSlotWidget(slot); - } - - private class RecipeFilterIconSlotWidget extends FilterIconSlotWidget { - - private static final int SYNC_RECIPEMAP_C2S = 98; - private static final int REQUEST_FILTERED_MACHINES_S2C = 99; - - public RecipeFilterIconSlotWidget(BaseSlot slot) { - super(slot); - } - - @Override - protected void phantomClick(ClickData clickData, ItemStack cursorStack) {} - - // region client - - @Override - public ClickResult onClick(int buttonId, boolean doubleClick) { - updateAndSendRecipeMapToServer( - getContext().getCursor() - .getItemStack()); - return ClickResult.SUCCESS; - } - - @Override - public boolean handleDragAndDrop(ItemStack draggedStack, int button) { - updateAndSendRecipeMapToServer(draggedStack); - draggedStack.stackSize = 0; - return true; - } - - private void updateAndSendRecipeMapToServer(ItemStack stack) { - mRecipeMap = getItemStackMachineRecipeMap(stack); - updateAndSendRecipeMapToServer(mRecipeMap); - } - - private void updateAndSendRecipeMapToServer(RecipeMap recipeMap) { - if (recipeMap != null) { - filteredMachines = getFilteredMachines(recipeMap); - } else { - filteredMachines = new ArrayList<>(); - mInventory[FILTER_SLOT_INDEX] = null; - } - mRotationIndex = -1; - syncToServer(SYNC_RECIPEMAP_C2S, buffer -> { - NetworkUtils.writeStringSafe(buffer, recipeMap != null ? recipeMap.unlocalizedName : null); - buffer.writeVarIntToBuffer(filteredMachines.size()); - for (ItemStack filteredMachine : filteredMachines) { - NetworkUtils.writeItemStack(buffer, filteredMachine); - } - }); - } - - @Override - public void readOnClient(int id, PacketBuffer buf) { - if (id != REQUEST_FILTERED_MACHINES_S2C) { - super.readOnClient(id, buf); - return; - } - - String recipeMapName = NetworkUtils.readStringSafe(buf); - mRecipeMap = recipeMapName != null ? RecipeMap.ALL_RECIPE_MAPS.get(recipeMapName) : null; - if (mRecipeMap != null) { - updateAndSendRecipeMapToServer(mRecipeMap); - } - } - - // endregion - - // region server - - @Override - public void readOnServer(int id, PacketBuffer buf) throws IOException { - if (id != SYNC_RECIPEMAP_C2S) { - super.readOnServer(id, buf); - return; - } - - String recipeMapName = NetworkUtils.readStringSafe(buf); - mRecipeMap = recipeMapName != null ? RecipeMap.getFromOldIdentifier(recipeMapName) : null; - mRotationIndex = -1; - mInventory[FILTER_SLOT_INDEX] = null; - filteredMachines.clear(); - - if (mRecipeMap != null) { - int filteredMachineSize = buf.readVarIntFromBuffer(); - filteredMachineSize = Math.min(filteredMachineSize, 256); // Prevent storing too many items - for (int i = 0; i < filteredMachineSize; i++) { - ItemStack stack = NetworkUtils.readItemStack(buf); - if (stack != null) { - filteredMachines.add(stack); - } - } - } - } - - @Override - public void detectAndSendChanges(boolean init) { - super.detectAndSendChanges(init); - if (init && mRecipeMap != null && filteredMachines.isEmpty()) { - // backward compatibility: This machine used to store only mRecipeMap, not filteredMachines - syncToClient( - REQUEST_FILTERED_MACHINES_S2C, - buffer -> NetworkUtils.writeStringSafe(buffer, mRecipeMap.unlocalizedName)); - } - } - - // endregion - } -} diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java deleted file mode 100644 index 08d3d32512..0000000000 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java +++ /dev/null @@ -1,228 +0,0 @@ -package gregtech.common.tileentities.automation; - -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_REGULATOR; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_REGULATOR_GLOW; - -import java.util.Collections; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Buffer; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Regulator extends GT_MetaTileEntity_Buffer { - - public int[] mTargetSlots = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - private boolean charge = false, decharge = false; - - public GT_MetaTileEntity_Regulator(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 20, - new String[] { "Filters up to 9 different Items", "Allows Item-specific output stack size", - "Allows Item-specific output slot" }); - } - - public GT_MetaTileEntity_Regulator(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_Regulator(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Regulator( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture getOverlayIcon() { - return TextureFactory.of( - TextureFactory.of(AUTOMATION_REGULATOR), - TextureFactory.builder() - .addIcon(AUTOMATION_REGULATOR_GLOW) - .glow() - .build()); - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex < 9 || aIndex == rechargerSlotStartIndex(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("mTargetSlot1", this.mTargetSlots[0]); - aNBT.setInteger("mTargetSlot2", this.mTargetSlots[1]); - aNBT.setInteger("mTargetSlot3", this.mTargetSlots[2]); - aNBT.setInteger("mTargetSlot4", this.mTargetSlots[3]); - aNBT.setInteger("mTargetSlot5", this.mTargetSlots[4]); - aNBT.setInteger("mTargetSlot6", this.mTargetSlots[5]); - aNBT.setInteger("mTargetSlot7", this.mTargetSlots[6]); - aNBT.setInteger("mTargetSlot8", this.mTargetSlots[7]); - aNBT.setInteger("mTargetSlot9", this.mTargetSlots[8]); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.mTargetSlots[0] = aNBT.getInteger("mTargetSlot1"); - this.mTargetSlots[1] = aNBT.getInteger("mTargetSlot2"); - this.mTargetSlots[2] = aNBT.getInteger("mTargetSlot3"); - this.mTargetSlots[3] = aNBT.getInteger("mTargetSlot4"); - this.mTargetSlots[4] = aNBT.getInteger("mTargetSlot5"); - this.mTargetSlots[5] = aNBT.getInteger("mTargetSlot6"); - this.mTargetSlots[6] = aNBT.getInteger("mTargetSlot7"); - this.mTargetSlots[7] = aNBT.getInteger("mTargetSlot8"); - this.mTargetSlots[8] = aNBT.getInteger("mTargetSlot9"); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - // Regulation per Screwdriver is overridden by GUI regulation. - } - - @Override - public void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - for (int i = 0, tCosts; i < 9; i++) { - if (this.mInventory[(i + 9)] != null) { - tCosts = GT_Utility.moveOneItemStackIntoSlot( - getBaseMetaTileEntity(), - getBaseMetaTileEntity().getTileEntityAtSide(getBaseMetaTileEntity().getBackFacing()), - getBaseMetaTileEntity().getBackFacing(), - this.mTargetSlots[i], - Collections.singletonList(this.mInventory[(i + 9)]), - false, - (byte) this.mInventory[(i + 9)].stackSize, - (byte) this.mInventory[(i + 9)].stackSize, - (byte) 64, - (byte) 1) * 3; - if (tCosts > 0) { - this.mSuccess = 50; - break; - } - } - } - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && aIndex >= 0 - && aIndex <= 8 - && GT_Utility.areStacksEqual(aStack, this.mInventory[(aIndex + 9)]); - } - - @Override - public int rechargerSlotStartIndex() { - return 19; - } - - @Override - public int dechargerSlotStartIndex() { - return 19; - } - - @Override - public int rechargerSlotCount() { - return charge ? 1 : 0; - } - - @Override - public int dechargerSlotCount() { - return decharge ? 1 : 0; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide()) { - charge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; - decharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; - } - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - builder.widget(createChargerSlot(43, 62)); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_22_RED.apply(84, true)) - .setPos(65, 60) - .setSize(84, 22)) - .widget( - SlotGroup.ofItemHandler(inventoryHandler, 3) - .startFromSlot(0) - .endAtSlot(8) - .build() - .setPos(7, 5)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3) - .setPos(62, 5) - .setSize(54, 54)) - .widget( - SlotGroup.ofItemHandler(inventoryHandler, 3) - .phantom(true) - .startFromSlot(9) - .endAtSlot(17) - .applyForWidget( - widget -> widget.setControlsAmount(true) - .setBackground(GT_UITextures.TRANSPARENT)) - .build() - .setPos(62, 5)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3) - .setPos(117, 5) - .setSize(54, 54)); - - int xBase = 117, yBase = 5; - for (int i = 0; i < mTargetSlots.length; i++) { - final int index = i; - int xPos = xBase + (i % 3) * 18, yPos = yBase + (i / 3) * 18; - builder.widget(new SlotWidget(BaseSlot.empty()) { - - @Override - protected void phantomClick(ClickData clickData, ItemStack cursorStack) { - mTargetSlots[index] = Math.min( - 99, - Math.max( - 0, - mTargetSlots[index] + (clickData.mouseButton == 0 ? -1 : 1) * (clickData.shift ? 16 : 1))); - } - }.setBackground(GT_UITextures.TRANSPARENT) - .setPos(xPos, yPos)) - .widget( - TextWidget.dynamicString(() -> String.valueOf(mTargetSlots[index])) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(xPos + 2 + (i % 3 == 0 ? 1 : 0), yPos + 3 + (i / 3 == 0 ? 1 : 0))); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java deleted file mode 100644 index 9a1d2d7dcf..0000000000 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java +++ /dev/null @@ -1,105 +0,0 @@ -package gregtech.common.tileentities.automation; - -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_SUPERBUFFER; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_SUPERBUFFER_GLOW; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.item.ItemStack; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; - -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_SuperBuffer extends GT_MetaTileEntity_ChestBuffer { - - public GT_MetaTileEntity_SuperBuffer(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 257, - new String[] { "Buffers up to 256 Item Stacks", "Use Screwdriver to regulate output stack size", - getTickRateDesc(aTier) }); - } - - public GT_MetaTileEntity_SuperBuffer(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_SuperBuffer(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_SuperBuffer( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture getOverlayIcon() { - return TextureFactory.of( - TextureFactory.of(AUTOMATION_SUPERBUFFER), - TextureFactory.builder() - .addIcon(AUTOMATION_SUPERBUFFER_GLOW) - .glow() - .build()); - } - - @Override - protected void fillStacksIntoFirstSlots() { - // no order, this is super buffer - HashMap slots = new HashMap<>(mInventory.length); - HashMap stacks = new HashMap<>(mInventory.length); - List validSlots = new ArrayList<>(mInventory.length); - // List order = new ArrayList<>(mInventory.length); - for (int i = 0; i < mInventory.length - 1; i++) { - if (!isValidSlot(i)) continue; - validSlots.add(i); - ItemStack s = mInventory[i]; - if (s == null) continue; - GT_Utility.ItemId sID = GT_Utility.ItemId.createNoCopy(s); - slots.merge(sID, s.stackSize, Integer::sum); - if (!stacks.containsKey(sID)) stacks.put(sID, s); - // order.add(sID); - mInventory[i] = null; - } - int i = 0; - for (Map.Entry entry : slots.entrySet()) { - do { - int slot = validSlots.get(i); - mInventory[slot] = stacks.get(entry.getKey()) - .copy(); - int toSet = Math.min(entry.getValue(), mInventory[slot].getMaxStackSize()); - mInventory[slot].stackSize = toSet; - entry.setValue(entry.getValue() - toSet); - i++; - } while (entry.getValue() > 0); - } - } - - @Override - protected void addMainUI(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SUPER_BUFFER) - .setPos(61, 4) - .setSize(54, 54)); - } -} diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java deleted file mode 100644 index be4a2226a1..0000000000 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java +++ /dev/null @@ -1,213 +0,0 @@ -package gregtech.common.tileentities.automation; - -import static gregtech.api.enums.GT_Values.W; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_TYPEFILTER; -import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_TYPEFILTER_GLOW; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SpecialFilter; -import gregtech.api.objects.ItemData; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_TypeFilter extends GT_MetaTileEntity_SpecialFilter { - - private static final String REPRESENTATION_SLOT_TOOLTIP = "GT5U.type_filter.representation_slot.tooltip"; - public int mRotationIndex = 0; - public OrePrefixes mPrefix = OrePrefixes.ore; - - public static ImmutableList OREBLOCK_PREFIXES = ImmutableList.of( - OrePrefixes.oreBlackgranite, - OrePrefixes.oreDense, - OrePrefixes.oreEnd, - OrePrefixes.oreEndstone, - OrePrefixes.oreNether, - OrePrefixes.oreNetherrack, - OrePrefixes.oreNormal, - OrePrefixes.orePoor, - OrePrefixes.oreRedgranite, - OrePrefixes.oreRich, - OrePrefixes.oreSmall, - OrePrefixes.oreBasalt, - OrePrefixes.oreMarble); - - public GT_MetaTileEntity_TypeFilter(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - new String[] { "Filters 1 Item Type", "Use Screwdriver to regulate output stack size" }); - } - - public GT_MetaTileEntity_TypeFilter(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_TypeFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_TypeFilter( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture getOverlayIcon() { - return TextureFactory.of( - TextureFactory.of(AUTOMATION_TYPEFILTER), - TextureFactory.builder() - .addIcon(AUTOMATION_TYPEFILTER_GLOW) - .glow() - .build()); - } - - public void clickTypeIcon(boolean aRightClick, ItemStack aHandStack) { - if (getBaseMetaTileEntity().isServerSide()) { - if (aHandStack != null) { - copyHeldItemPrefix(aHandStack); - } else { - cyclePrefix(aRightClick); - } - } - } - - private void copyHeldItemPrefix(ItemStack handStack) { - ItemData data = GT_OreDictUnificator.getAssociation(handStack); - if (data != null && data.hasValidPrefixData()) { - this.mPrefix = data.mPrefix; - this.mRotationIndex = -1; - } - } - - private void cyclePrefix(boolean aRightClick) { - for (int i = 0; i < OrePrefixes.values().length; i++) { - if (this.mPrefix == OrePrefixes.values()[i]) { - for (this.mPrefix = null; this.mPrefix == null; this.mPrefix = OrePrefixes.values()[i]) { - if (aRightClick) { - do { - i--; - if (i < 0) { - i = OrePrefixes.values().length - 1; - } - } while (OrePrefixes.values()[i].mPrefixedItems.isEmpty()); - } else { - do { - i++; - if (i >= OrePrefixes.values().length) { - i = 0; - } - } while (OrePrefixes.values()[i].mPrefixedItems.isEmpty()); - } - if (!OrePrefixes.values()[i].mPrefixedItems.isEmpty() - && OrePrefixes.values()[i].mPrefixInto == OrePrefixes.values()[i]) - mPrefix = OrePrefixes.values()[i]; - } - } - this.mRotationIndex = -1; - } - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPreTick(aBaseMetaTileEntity, aTick); - if ((!getBaseMetaTileEntity().isServerSide()) || ((aTick % 8L != 0L) && mRotationIndex != -1)) return; - if (this.mPrefix.mPrefixedItems.isEmpty()) { - this.mInventory[FILTER_SLOT_INDEX] = null; - return; - } - this.mInventory[FILTER_SLOT_INDEX] = GT_Utility.copyAmount( - 1, - this.mPrefix.mPrefixedItems - .get(this.mRotationIndex = (this.mRotationIndex + 1) % this.mPrefix.mPrefixedItems.size())); - if (this.mInventory[FILTER_SLOT_INDEX] == null) return; - if (this.mInventory[FILTER_SLOT_INDEX].getItemDamage() == W) this.mInventory[9].setItemDamage(0); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setString("mPrefix", this.mPrefix.toString()); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.mPrefix = OrePrefixes.getPrefix(aNBT.getString("mPrefix"), this.mPrefix); - } - - @Override - protected boolean isStackAllowed(ItemStack aStack) { - if (this.mPrefix == OrePrefixes.ore) { - ItemData data = GT_OreDictUnificator.getItemData(aStack); - if (data != null && data.mPrefix != null && OREBLOCK_PREFIXES.contains(data.mPrefix)) { - return true; - } - } - return this.mPrefix.contains(aStack); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - builder.widget( - new FakeSyncWidget.StringSyncer( - () -> this.mPrefix.toString(), - (prefix) -> this.mPrefix = OrePrefixes.getPrefix(prefix, this.mPrefix))); - } - - @Override - protected Function, List> getItemStackReplacementTooltip() { - return (itemTooltip) -> { - List replacementTooltip = new ArrayList<>(); - replacementTooltip.add("Filter set to " + mPrefix.mRegularLocalName); - replacementTooltip.add("Ore prefix: §e" + mPrefix + "§r"); - replacementTooltip.add("Filter size: §e" + mPrefix.mPrefixedItems.size() + "§r"); - replacementTooltip.addAll(mTooltipCache.getData(REPRESENTATION_SLOT_TOOLTIP).text); - return replacementTooltip; - }; - } - - @Override - protected SlotWidget createFilterIconSlot(BaseSlot slot) { - return new TypeFilterIconSlotWidget(slot); - } - - private class TypeFilterIconSlotWidget extends FilterIconSlotWidget { - - public TypeFilterIconSlotWidget(BaseSlot slot) { - super(slot); - } - - @Override - protected void phantomClick(ClickData clickData, ItemStack cursorStack) { - clickTypeIcon(clickData.mouseButton != 0, cursorStack); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/automation/MTEChestBuffer.java b/src/main/java/gregtech/common/tileentities/automation/MTEChestBuffer.java new file mode 100644 index 0000000000..27bc56dd62 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/automation/MTEChestBuffer.java @@ -0,0 +1,135 @@ +package gregtech.common.tileentities.automation; + +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_CHESTBUFFER; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_CHESTBUFFER_GLOW; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBuffer; +import gregtech.api.render.TextureFactory; + +public class MTEChestBuffer extends MTEBuffer { + + private static final int[] tickRate = { 400, 200, 100, 20, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; + private static final int[] maxStacks = { 1, 1, 1, 1, 1, 1, 2, 4, 8, 16, 32, 64, 128 }; + + public MTEChestBuffer(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 28, + new String[] { "Buffers up to 27 Item Stacks", "Use Screwdriver to regulate output stack size", + getTickRateDesc(aTier) }); + } + + public MTEChestBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public MTEChestBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String[] aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public MTEChestBuffer(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEChestBuffer(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEChestBuffer( + this.mName, + this.mTier, + this.mInventory.length, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public ITexture getOverlayIcon() { + return TextureFactory.of( + TextureFactory.of(AUTOMATION_CHESTBUFFER), + TextureFactory.builder() + .addIcon(AUTOMATION_CHESTBUFFER_GLOW) + .glow() + .build()); + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex < this.mInventory.length - 1; + } + + @Override + protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + if (aTimer % tickRate[mTier] > 0) return; + + // mSuccess will be negative if the call is caused by the %200 aTimer, always try to push. Otherwise it will be + // positive. + // For the first 6 ticks after a successful move (49->44), push every tick. Then go to every 5 ticks. + if ((mSuccess <= 0) || (mSuccess > 43) || ((mSuccess % 5) == 0)) { + super.moveItems(aBaseMetaTileEntity, aTimer, Math.min(MAX, maxStacks[mTier])); + } + + if (mSuccess < 0) { + mSuccess = 0; + } + } + + protected static String getTickRateDesc(int tier) { + int tickRate = getTickRate(tier); + String timeStr = ""; + String numStr = ""; + if (maxStacks[tier] > 1) { + numStr = maxStacks[tier] + " items"; + } else { + numStr = "1 item"; + } + if (tickRate < 20) timeStr = "1/" + 20 / tickRate + " "; + else if (tickRate > 20) { + timeStr = (tickRate / 20) + "th "; + } + return "Moves " + numStr + " every " + timeStr + "second"; + } + + protected static int getTickRate(int tier) { + if (tier > 9) return 1; + return tickRate[tier]; + } + + protected static int getMaxStacks(int tier) { + // Included higher tiers on the off chance they actually work without blowing things up lmao + return tier > 9 ? MAX : Math.min(maxStacks[tier], MAX); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + addSortStacksButton(builder); + addEmitRedstoneIfFullButton(builder); + addInvertRedstoneButton(builder); + addStockingModeButton(builder); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_22_RED.apply(69, true)) + .setPos(98, 60) + .setSize(51, 22)); + addMainUI(builder); + } + + protected void addMainUI(ModularWindow.Builder builder) { + addInventorySlots(builder); + } +} diff --git a/src/main/java/gregtech/common/tileentities/automation/MTEFilter.java b/src/main/java/gregtech/common/tileentities/automation/MTEFilter.java new file mode 100644 index 0000000000..f731b5f915 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/automation/MTEFilter.java @@ -0,0 +1,137 @@ +package gregtech.common.tileentities.automation; + +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_FILTER; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_FILTER_GLOW; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEFilterBase; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTEFilter extends MTEFilterBase { + + private static final int NUM_FILTER_SLOTS = 9; + private static final String IGNORE_NBT_TOOLTIP = "GT5U.machines.ignore_nbt.tooltip"; + private boolean ignoreNbt = false; + + public MTEFilter(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 19, + new String[] { "Filters up to 9 different Items", "Use Screwdriver to regulate output stack size" }); + } + + public MTEFilter(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEFilter(this.mName, this.mTier, this.mInventory.length, this.mDescriptionArray, this.mTextures); + } + + @Override + public ITexture getOverlayIcon() { + return TextureFactory.of( + TextureFactory.of(AUTOMATION_FILTER), + TextureFactory.builder() + .addIcon(AUTOMATION_FILTER_GLOW) + .glow() + .build()); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("bIgnoreNBT", this.ignoreNbt); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.ignoreNbt = aNBT.getBoolean("bIgnoreNBT"); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (!super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) { + return false; + } + if (this.invertFilter) { + for (int i = 0; i < NUM_FILTER_SLOTS; i++) { + if (GTUtility.areStacksEqual(this.mInventory[FILTER_SLOT_INDEX + i], aStack, this.ignoreNbt)) { + return false; + } + } + return true; + } + return GTUtility.areStacksEqual(this.mInventory[(FILTER_SLOT_INDEX + aIndex)], aStack, this.ignoreNbt); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + addAllowNbtButton(builder); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_24_WHITE.apply(9, false)) + .setPos(6, 19) + .setSize(9, 24)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_24_BLUE.apply(24, true)) + .setPos(71, 19) + .setSize(24, 24)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_24_RED.apply(19, true)) + .setPos(152, 19) + .setSize(19, 24)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SLOTS_HOLO_3BY3) + .setPos(16, 4) + .setSize(54, 54)) + .widget( + SlotGroup.ofItemHandler(inventoryHandler, 3) + .startFromSlot(FILTER_SLOT_INDEX) + .endAtSlot(FILTER_SLOT_INDEX + NUM_FILTER_SLOTS - 1) + .phantom(true) + .applyForWidget( + widget -> widget.disableShiftInsert() + .setBackground(GTUITextures.TRANSPARENT)) + .build() + .setPos(16, 4)) + .widget( + SlotGroup.ofItemHandler(inventoryHandler, 3) + .startFromSlot(0) + .endAtSlot(NUM_INVENTORY_SLOTS - 1) + .build() + .setPos(97, 4)); + } + + private void addAllowNbtButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> ignoreNbt, + val -> ignoreNbt = val, + GTUITextures.OVERLAY_BUTTON_NBT, + () -> mTooltipCache.getData(IGNORE_NBT_TOOLTIP))); + } +} diff --git a/src/main/java/gregtech/common/tileentities/automation/MTEItemDistributor.java b/src/main/java/gregtech/common/tileentities/automation/MTEItemDistributor.java new file mode 100644 index 0000000000..36f1e1be58 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/automation/MTEItemDistributor.java @@ -0,0 +1,204 @@ +package gregtech.common.tileentities.automation; + +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_ITEMDISTRIBUTOR; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_ITEMDISTRIBUTOR_GLOW; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; + +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBuffer; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTEItemDistributor extends MTEBuffer { + + private byte[] itemsPerSide = new byte[6]; + private ForgeDirection currentSide = ForgeDirection.DOWN; + private byte currentSideItemCount = 0; + + public MTEItemDistributor(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 28, + new String[] { "Distributes Items between different Machine Sides", "Default Items per Machine Side: 0", + "Use Screwdriver to increase/decrease Items per Side" }); + } + + public MTEItemDistributor(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public MTEItemDistributor(String aName, int aTier, int aInvSlotCount, String aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEItemDistributor(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEItemDistributor( + this.mName, + this.mTier, + this.mInventory.length, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public ITexture getOverlayIcon() { + return TextureFactory.of( + TextureFactory.of(AUTOMATION_ITEMDISTRIBUTOR), + TextureFactory.builder() + .addIcon(AUTOMATION_ITEMDISTRIBUTOR_GLOW) + .glow() + .build()); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + return mTextures[0][colorIndex + 1]; + } else { + return mTextures[1][colorIndex + 1]; + } + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] returnTextures = new ITexture[2][17][]; + ITexture baseIcon = getOverlayIcon(), pipeIcon = TextureFactory.of(Textures.BlockIcons.OVERLAY_PIPE_OUT); + for (int i = 0; i < 17; i++) { + returnTextures[0][i] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i], baseIcon }; + returnTextures[1][i] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i], pipeIcon, baseIcon }; + } + return returnTextures; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return getBaseMetaTileEntity().getFrontFacing() == side || itemsPerSide[side.ordinal()] == 0; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return getBaseMetaTileEntity().getFrontFacing() != side && itemsPerSide[side.ordinal()] > 0; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex < this.mInventory.length - 1; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + itemsPerSide = aNBT.getByteArray("mItemsPerSide"); + if (itemsPerSide.length != 6) { + itemsPerSide = new byte[6]; + } + currentSide = ForgeDirection.getOrientation(aNBT.getByte("mCurrentSide")); + currentSideItemCount = aNBT.getByte("mCurrentSideItemCount"); + } + + @Override + protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + int currentSideOrdinal = currentSide.ordinal(); + fillStacksIntoFirstSlots(); + int movedItems; + TileEntity adjacentTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(currentSide); + int inspectedSides = 0; + while (itemsPerSide[currentSideOrdinal] == 0) { + currentSideOrdinal = ((currentSideOrdinal + 1) % 6); + currentSide = ForgeDirection.getOrientation(currentSideOrdinal); + currentSideItemCount = 0; + adjacentTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(currentSide); + inspectedSides += 1; + if (inspectedSides == 6) { + return; + } + } + movedItems = GTUtility.moveOneItemStack( + aBaseMetaTileEntity, + adjacentTileEntity, + currentSide, + currentSide.getOpposite(), + null, + false, + (byte) 64, + (byte) 1, + (byte) (itemsPerSide[currentSideOrdinal] - currentSideItemCount), + (byte) 1); + currentSideItemCount += movedItems; + if (currentSideItemCount >= itemsPerSide[currentSideOrdinal]) { + currentSideOrdinal = ((currentSideOrdinal + 1) % 6); + currentSide = ForgeDirection.getOrientation(currentSideOrdinal); + currentSideItemCount = 0; + } + if (movedItems > 0 || aBaseMetaTileEntity.hasInventoryBeenModified()) { + mSuccess = 50; + } + fillStacksIntoFirstSlots(); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + final int ordinalSide = side.ordinal(); + // Adjust items per side by 1 or -1, constrained to the cyclic interval [0, 127] + itemsPerSide[ordinalSide] += aPlayer.isSneaking() ? -1 : 1; + itemsPerSide[ordinalSide] = (byte) ((itemsPerSide[ordinalSide] + 128) % 128); + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("211", "Items per side: ") + itemsPerSide[ordinalSide]); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByteArray("mItemsPerSide", itemsPerSide); + aNBT.setByte("mCurrentSide", (byte) currentSide.ordinal()); + aNBT.setByte("mCurrentSideItemCount", currentSideItemCount); + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + super.setItemNBT(aNBT); + aNBT.setByteArray("mItemsPerSide", itemsPerSide); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + addEmitRedstoneIfFullButton(builder); + addInvertRedstoneButton(builder); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_22_RED.apply(87, true)) + .setPos(62, 60) + .setSize(87, 22)); + addInventorySlots(builder); + } +} diff --git a/src/main/java/gregtech/common/tileentities/automation/MTERecipeFilter.java b/src/main/java/gregtech/common/tileentities/automation/MTERecipeFilter.java new file mode 100644 index 0000000000..24b57153af --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/automation/MTERecipeFilter.java @@ -0,0 +1,325 @@ +package gregtech.common.tileentities.automation; + +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_RECIPEFILTER; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_RECIPEFILTER_GLOW; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.Constants; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import codechicken.nei.recipe.RecipeCatalysts; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.RecipeMapWorkable; +import gregtech.api.metatileentity.implementations.MTESpecialFilter; +import gregtech.api.multitileentity.MultiTileEntityItem; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.ItemMachines; +import gregtech.loaders.preload.GT_Loader_MultiTileEntities; + +public class MTERecipeFilter extends MTESpecialFilter { + + private static final String TT_machineType = "GT5U.MBTT.MachineType"; + private static final String REPRESENTATION_SLOT_TOOLTIP = "GT5U.recipe_filter.representation_slot.tooltip"; + private static final String EMPTY_REPRESENTATION_SLOT_TOOLTIP = "GT5U.recipe_filter.empty_representation_slot.tooltip"; + public RecipeMap mRecipeMap; + private List filteredMachines = new ArrayList<>(); + public int mRotationIndex = 0; + + public MTERecipeFilter(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { "Filters 1 Recipe Type", "Use Screwdriver to regulate output stack size" }); + } + + public MTERecipeFilter(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTERecipeFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + private static RecipeMap getItemStackMachineRecipeMap(ItemStack stack) { + if (stack != null) { + IMetaTileEntity metaTileEntity = ItemMachines.getMetaTileEntity(stack); + if (metaTileEntity != null) { + return getMetaTileEntityRecipeMap(metaTileEntity); + } else if (stack.getItem() instanceof MultiTileEntityItem) { + return getMuTeRecipeMap(stack); + } + } + return null; + } + + private static RecipeMap getMetaTileEntityRecipeMap(IMetaTileEntity metaTileEntity) { + if (metaTileEntity instanceof RecipeMapWorkable recipeMapWorkable) { + return recipeMapWorkable.getRecipeMap(); + } + return null; + } + + private static RecipeMap getMuTeRecipeMap(@NotNull ItemStack stack) { + final TileEntity tileEntity = GT_Loader_MultiTileEntities.MACHINE_REGISTRY.getReferenceTileEntity(stack); + if (tileEntity instanceof RecipeMapWorkable recipeMapWorkable) { + return recipeMapWorkable.getRecipeMap(); + } + return null; + } + + private static List getFilteredMachines(RecipeMap recipeMap) { + return RecipeCatalysts.getRecipeCatalysts( + recipeMap.getFrontend() + .getUIProperties().neiTransferRectId) + .stream() + .map(positionedStack -> positionedStack.item) + .collect(Collectors.toList()); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + if ((!getBaseMetaTileEntity().isServerSide()) || ((aTick % 8L != 0L) && mRotationIndex != -1)) return; + if (this.filteredMachines.isEmpty()) { + return; + } + this.mInventory[FILTER_SLOT_INDEX] = GTUtility.copyAmount( + 1, + this.filteredMachines.get(this.mRotationIndex = (this.mRotationIndex + 1) % this.filteredMachines.size())); + if (this.mInventory[FILTER_SLOT_INDEX] == null) return; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTERecipeFilter( + this.mName, + this.mTier, + this.mInventory.length, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public ITexture getOverlayIcon() { + return TextureFactory.of( + TextureFactory.of(AUTOMATION_RECIPEFILTER), + TextureFactory.builder() + .addIcon(AUTOMATION_RECIPEFILTER_GLOW) + .glow() + .build()); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (mRecipeMap != null) { + aNBT.setString("mRecipeMap", this.mRecipeMap.unlocalizedName); + } + NBTTagList tagList = new NBTTagList(); + for (ItemStack filteredMachine : filteredMachines) { + tagList.appendTag(filteredMachine.writeToNBT(new NBTTagCompound())); + } + aNBT.setTag("filteredMachines", tagList); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("mRecipeMap")); + filteredMachines.clear(); + NBTTagList tagList = aNBT.getTagList("filteredMachines", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < tagList.tagCount(); i++) { + ItemStack readStack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i)); + if (readStack != null) { + filteredMachines.add(readStack); + } + } + } + + @Override + protected boolean isStackAllowed(ItemStack aStack) { + return mRecipeMap != null && mRecipeMap.containsInput(aStack); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + builder.widget( + new FakeSyncWidget.StringSyncer( + () -> this.mRecipeMap == null ? "" : this.mRecipeMap.unlocalizedName, + id -> this.mRecipeMap = RecipeMap.ALL_RECIPE_MAPS.get(id))); + } + + @Override + protected List getEmptySlotTooltip() { + return Collections.singletonList(Text.localised(EMPTY_REPRESENTATION_SLOT_TOOLTIP)); + } + + @Override + public Function, List> getItemStackReplacementTooltip() { + if (mRecipeMap != null) { + List tooltip = assembleItemStackReplacementTooltip(mRecipeMap); + return list -> tooltip; + } + return super.getItemStackReplacementTooltip(); + } + + @NotNull + private List assembleItemStackReplacementTooltip(RecipeMap recipeMap) { + List tooltip = new ArrayList<>(); + tooltip.add( + StatCollector.translateToLocal(TT_machineType) + ": " + + EnumChatFormatting.YELLOW + + StatCollector.translateToLocal(recipeMap.unlocalizedName) + + EnumChatFormatting.RESET); + int recipeSize = recipeMap.getAllRecipes() + .size(); + if (recipeSize > 0) { + tooltip.add("Filter size: §e" + recipeSize + "§r"); + } + tooltip.addAll(mTooltipCache.getData(REPRESENTATION_SLOT_TOOLTIP).text); + return tooltip; + } + + @Override + protected SlotWidget createFilterIconSlot(BaseSlot slot) { + return new RecipeFilterIconSlotWidget(slot); + } + + private class RecipeFilterIconSlotWidget extends FilterIconSlotWidget { + + private static final int SYNC_RECIPEMAP_C2S = 98; + private static final int REQUEST_FILTERED_MACHINES_S2C = 99; + + public RecipeFilterIconSlotWidget(BaseSlot slot) { + super(slot); + } + + @Override + protected void phantomClick(ClickData clickData, ItemStack cursorStack) {} + + // region client + + @Override + public ClickResult onClick(int buttonId, boolean doubleClick) { + updateAndSendRecipeMapToServer( + getContext().getCursor() + .getItemStack()); + return ClickResult.SUCCESS; + } + + @Override + public boolean handleDragAndDrop(ItemStack draggedStack, int button) { + updateAndSendRecipeMapToServer(draggedStack); + draggedStack.stackSize = 0; + return true; + } + + private void updateAndSendRecipeMapToServer(ItemStack stack) { + mRecipeMap = getItemStackMachineRecipeMap(stack); + updateAndSendRecipeMapToServer(mRecipeMap); + } + + private void updateAndSendRecipeMapToServer(RecipeMap recipeMap) { + if (recipeMap != null) { + filteredMachines = getFilteredMachines(recipeMap); + } else { + filteredMachines = new ArrayList<>(); + mInventory[FILTER_SLOT_INDEX] = null; + } + mRotationIndex = -1; + syncToServer(SYNC_RECIPEMAP_C2S, buffer -> { + NetworkUtils.writeStringSafe(buffer, recipeMap != null ? recipeMap.unlocalizedName : null); + buffer.writeVarIntToBuffer(filteredMachines.size()); + for (ItemStack filteredMachine : filteredMachines) { + NetworkUtils.writeItemStack(buffer, filteredMachine); + } + }); + } + + @Override + public void readOnClient(int id, PacketBuffer buf) { + if (id != REQUEST_FILTERED_MACHINES_S2C) { + super.readOnClient(id, buf); + return; + } + + String recipeMapName = NetworkUtils.readStringSafe(buf); + mRecipeMap = recipeMapName != null ? RecipeMap.ALL_RECIPE_MAPS.get(recipeMapName) : null; + if (mRecipeMap != null) { + updateAndSendRecipeMapToServer(mRecipeMap); + } + } + + // endregion + + // region server + + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException { + if (id != SYNC_RECIPEMAP_C2S) { + super.readOnServer(id, buf); + return; + } + + String recipeMapName = NetworkUtils.readStringSafe(buf); + mRecipeMap = recipeMapName != null ? RecipeMap.getFromOldIdentifier(recipeMapName) : null; + mRotationIndex = -1; + mInventory[FILTER_SLOT_INDEX] = null; + filteredMachines.clear(); + + if (mRecipeMap != null) { + int filteredMachineSize = buf.readVarIntFromBuffer(); + filteredMachineSize = Math.min(filteredMachineSize, 256); // Prevent storing too many items + for (int i = 0; i < filteredMachineSize; i++) { + ItemStack stack = NetworkUtils.readItemStack(buf); + if (stack != null) { + filteredMachines.add(stack); + } + } + } + } + + @Override + public void detectAndSendChanges(boolean init) { + super.detectAndSendChanges(init); + if (init && mRecipeMap != null && filteredMachines.isEmpty()) { + // backward compatibility: This machine used to store only mRecipeMap, not filteredMachines + syncToClient( + REQUEST_FILTERED_MACHINES_S2C, + buffer -> NetworkUtils.writeStringSafe(buffer, mRecipeMap.unlocalizedName)); + } + } + + // endregion + } +} diff --git a/src/main/java/gregtech/common/tileentities/automation/MTERegulator.java b/src/main/java/gregtech/common/tileentities/automation/MTERegulator.java new file mode 100644 index 0000000000..4205af7e08 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/automation/MTERegulator.java @@ -0,0 +1,221 @@ +package gregtech.common.tileentities.automation; + +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_REGULATOR; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_REGULATOR_GLOW; + +import java.util.Collections; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBuffer; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTERegulator extends MTEBuffer { + + public int[] mTargetSlots = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + private boolean charge = false, decharge = false; + + public MTERegulator(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 20, + new String[] { "Filters up to 9 different Items", "Allows Item-specific output stack size", + "Allows Item-specific output slot" }); + } + + public MTERegulator(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTERegulator(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTERegulator(this.mName, this.mTier, this.mInventory.length, this.mDescriptionArray, this.mTextures); + } + + @Override + public ITexture getOverlayIcon() { + return TextureFactory.of( + TextureFactory.of(AUTOMATION_REGULATOR), + TextureFactory.builder() + .addIcon(AUTOMATION_REGULATOR_GLOW) + .glow() + .build()); + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex < 9 || aIndex == rechargerSlotStartIndex(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("mTargetSlot1", this.mTargetSlots[0]); + aNBT.setInteger("mTargetSlot2", this.mTargetSlots[1]); + aNBT.setInteger("mTargetSlot3", this.mTargetSlots[2]); + aNBT.setInteger("mTargetSlot4", this.mTargetSlots[3]); + aNBT.setInteger("mTargetSlot5", this.mTargetSlots[4]); + aNBT.setInteger("mTargetSlot6", this.mTargetSlots[5]); + aNBT.setInteger("mTargetSlot7", this.mTargetSlots[6]); + aNBT.setInteger("mTargetSlot8", this.mTargetSlots[7]); + aNBT.setInteger("mTargetSlot9", this.mTargetSlots[8]); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.mTargetSlots[0] = aNBT.getInteger("mTargetSlot1"); + this.mTargetSlots[1] = aNBT.getInteger("mTargetSlot2"); + this.mTargetSlots[2] = aNBT.getInteger("mTargetSlot3"); + this.mTargetSlots[3] = aNBT.getInteger("mTargetSlot4"); + this.mTargetSlots[4] = aNBT.getInteger("mTargetSlot5"); + this.mTargetSlots[5] = aNBT.getInteger("mTargetSlot6"); + this.mTargetSlots[6] = aNBT.getInteger("mTargetSlot7"); + this.mTargetSlots[7] = aNBT.getInteger("mTargetSlot8"); + this.mTargetSlots[8] = aNBT.getInteger("mTargetSlot9"); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + // Regulation per Screwdriver is overridden by GUI regulation. + } + + @Override + public void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + for (int i = 0, tCosts; i < 9; i++) { + if (this.mInventory[(i + 9)] != null) { + tCosts = GTUtility.moveOneItemStackIntoSlot( + getBaseMetaTileEntity(), + getBaseMetaTileEntity().getTileEntityAtSide(getBaseMetaTileEntity().getBackFacing()), + getBaseMetaTileEntity().getBackFacing(), + this.mTargetSlots[i], + Collections.singletonList(this.mInventory[(i + 9)]), + false, + (byte) this.mInventory[(i + 9)].stackSize, + (byte) this.mInventory[(i + 9)].stackSize, + (byte) 64, + (byte) 1) * 3; + if (tCosts > 0) { + this.mSuccess = 50; + break; + } + } + } + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && aIndex >= 0 + && aIndex <= 8 + && GTUtility.areStacksEqual(aStack, this.mInventory[(aIndex + 9)]); + } + + @Override + public int rechargerSlotStartIndex() { + return 19; + } + + @Override + public int dechargerSlotStartIndex() { + return 19; + } + + @Override + public int rechargerSlotCount() { + return charge ? 1 : 0; + } + + @Override + public int dechargerSlotCount() { + return decharge ? 1 : 0; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide()) { + charge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; + decharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; + } + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + builder.widget(createChargerSlot(43, 62)); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_22_RED.apply(84, true)) + .setPos(65, 60) + .setSize(84, 22)) + .widget( + SlotGroup.ofItemHandler(inventoryHandler, 3) + .startFromSlot(0) + .endAtSlot(8) + .build() + .setPos(7, 5)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SLOTS_HOLO_3BY3) + .setPos(62, 5) + .setSize(54, 54)) + .widget( + SlotGroup.ofItemHandler(inventoryHandler, 3) + .phantom(true) + .startFromSlot(9) + .endAtSlot(17) + .applyForWidget( + widget -> widget.setControlsAmount(true) + .setBackground(GTUITextures.TRANSPARENT)) + .build() + .setPos(62, 5)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SLOTS_HOLO_3BY3) + .setPos(117, 5) + .setSize(54, 54)); + + int xBase = 117, yBase = 5; + for (int i = 0; i < mTargetSlots.length; i++) { + final int index = i; + int xPos = xBase + (i % 3) * 18, yPos = yBase + (i / 3) * 18; + builder.widget(new SlotWidget(BaseSlot.empty()) { + + @Override + protected void phantomClick(ClickData clickData, ItemStack cursorStack) { + mTargetSlots[index] = Math.min( + 99, + Math.max( + 0, + mTargetSlots[index] + (clickData.mouseButton == 0 ? -1 : 1) * (clickData.shift ? 16 : 1))); + } + }.setBackground(GTUITextures.TRANSPARENT) + .setPos(xPos, yPos)) + .widget( + TextWidget.dynamicString(() -> String.valueOf(mTargetSlots[index])) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(xPos + 2 + (i % 3 == 0 ? 1 : 0), yPos + 3 + (i / 3 == 0 ? 1 : 0))); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/automation/MTESuperBuffer.java b/src/main/java/gregtech/common/tileentities/automation/MTESuperBuffer.java new file mode 100644 index 0000000000..fa1bdd60b9 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/automation/MTESuperBuffer.java @@ -0,0 +1,103 @@ +package gregtech.common.tileentities.automation; + +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_SUPERBUFFER; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_SUPERBUFFER_GLOW; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.item.ItemStack; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; + +import gregtech.api.gui.modularui.GTUITextures; +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.GTUtility; + +public class MTESuperBuffer extends MTEChestBuffer { + + public MTESuperBuffer(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 257, + new String[] { "Buffers up to 256 Item Stacks", "Use Screwdriver to regulate output stack size", + getTickRateDesc(aTier) }); + } + + public MTESuperBuffer(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTESuperBuffer(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESuperBuffer( + this.mName, + this.mTier, + this.mInventory.length, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public ITexture getOverlayIcon() { + return TextureFactory.of( + TextureFactory.of(AUTOMATION_SUPERBUFFER), + TextureFactory.builder() + .addIcon(AUTOMATION_SUPERBUFFER_GLOW) + .glow() + .build()); + } + + @Override + protected void fillStacksIntoFirstSlots() { + // no order, this is super buffer + HashMap slots = new HashMap<>(mInventory.length); + HashMap stacks = new HashMap<>(mInventory.length); + List validSlots = new ArrayList<>(mInventory.length); + // List order = new ArrayList<>(mInventory.length); + for (int i = 0; i < mInventory.length - 1; i++) { + if (!isValidSlot(i)) continue; + validSlots.add(i); + ItemStack s = mInventory[i]; + if (s == null) continue; + GTUtility.ItemId sID = GTUtility.ItemId.createNoCopy(s); + slots.merge(sID, s.stackSize, Integer::sum); + if (!stacks.containsKey(sID)) stacks.put(sID, s); + // order.add(sID); + mInventory[i] = null; + } + int i = 0; + for (Map.Entry entry : slots.entrySet()) { + do { + int slot = validSlots.get(i); + mInventory[slot] = stacks.get(entry.getKey()) + .copy(); + int toSet = Math.min(entry.getValue(), mInventory[slot].getMaxStackSize()); + mInventory[slot].stackSize = toSet; + entry.setValue(entry.getValue() - toSet); + i++; + } while (entry.getValue() > 0); + } + } + + @Override + protected void addMainUI(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SUPER_BUFFER) + .setPos(61, 4) + .setSize(54, 54)); + } +} diff --git a/src/main/java/gregtech/common/tileentities/automation/MTETypeFilter.java b/src/main/java/gregtech/common/tileentities/automation/MTETypeFilter.java new file mode 100644 index 0000000000..3b8cd3482e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/automation/MTETypeFilter.java @@ -0,0 +1,211 @@ +package gregtech.common.tileentities.automation; + +import static gregtech.api.enums.GTValues.W; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_TYPEFILTER; +import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_TYPEFILTER_GLOW; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTESpecialFilter; +import gregtech.api.objects.ItemData; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; + +public class MTETypeFilter extends MTESpecialFilter { + + private static final String REPRESENTATION_SLOT_TOOLTIP = "GT5U.type_filter.representation_slot.tooltip"; + public int mRotationIndex = 0; + public OrePrefixes mPrefix = OrePrefixes.ore; + + public static ImmutableList OREBLOCK_PREFIXES = ImmutableList.of( + OrePrefixes.oreBlackgranite, + OrePrefixes.oreDense, + OrePrefixes.oreEnd, + OrePrefixes.oreEndstone, + OrePrefixes.oreNether, + OrePrefixes.oreNetherrack, + OrePrefixes.oreNormal, + OrePrefixes.orePoor, + OrePrefixes.oreRedgranite, + OrePrefixes.oreRich, + OrePrefixes.oreSmall, + OrePrefixes.oreBasalt, + OrePrefixes.oreMarble); + + public MTETypeFilter(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { "Filters 1 Item Type", "Use Screwdriver to regulate output stack size" }); + } + + public MTETypeFilter(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTETypeFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTETypeFilter( + this.mName, + this.mTier, + this.mInventory.length, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public ITexture getOverlayIcon() { + return TextureFactory.of( + TextureFactory.of(AUTOMATION_TYPEFILTER), + TextureFactory.builder() + .addIcon(AUTOMATION_TYPEFILTER_GLOW) + .glow() + .build()); + } + + public void clickTypeIcon(boolean aRightClick, ItemStack aHandStack) { + if (getBaseMetaTileEntity().isServerSide()) { + if (aHandStack != null) { + copyHeldItemPrefix(aHandStack); + } else { + cyclePrefix(aRightClick); + } + } + } + + private void copyHeldItemPrefix(ItemStack handStack) { + ItemData data = GTOreDictUnificator.getAssociation(handStack); + if (data != null && data.hasValidPrefixData()) { + this.mPrefix = data.mPrefix; + this.mRotationIndex = -1; + } + } + + private void cyclePrefix(boolean aRightClick) { + for (int i = 0; i < OrePrefixes.values().length; i++) { + if (this.mPrefix == OrePrefixes.values()[i]) { + for (this.mPrefix = null; this.mPrefix == null; this.mPrefix = OrePrefixes.values()[i]) { + if (aRightClick) { + do { + i--; + if (i < 0) { + i = OrePrefixes.values().length - 1; + } + } while (OrePrefixes.values()[i].mPrefixedItems.isEmpty()); + } else { + do { + i++; + if (i >= OrePrefixes.values().length) { + i = 0; + } + } while (OrePrefixes.values()[i].mPrefixedItems.isEmpty()); + } + if (!OrePrefixes.values()[i].mPrefixedItems.isEmpty() + && OrePrefixes.values()[i].mPrefixInto == OrePrefixes.values()[i]) + mPrefix = OrePrefixes.values()[i]; + } + } + this.mRotationIndex = -1; + } + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + if ((!getBaseMetaTileEntity().isServerSide()) || ((aTick % 8L != 0L) && mRotationIndex != -1)) return; + if (this.mPrefix.mPrefixedItems.isEmpty()) { + this.mInventory[FILTER_SLOT_INDEX] = null; + return; + } + this.mInventory[FILTER_SLOT_INDEX] = GTUtility.copyAmount( + 1, + this.mPrefix.mPrefixedItems + .get(this.mRotationIndex = (this.mRotationIndex + 1) % this.mPrefix.mPrefixedItems.size())); + if (this.mInventory[FILTER_SLOT_INDEX] == null) return; + if (this.mInventory[FILTER_SLOT_INDEX].getItemDamage() == W) this.mInventory[9].setItemDamage(0); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setString("mPrefix", this.mPrefix.toString()); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.mPrefix = OrePrefixes.getPrefix(aNBT.getString("mPrefix"), this.mPrefix); + } + + @Override + protected boolean isStackAllowed(ItemStack aStack) { + if (this.mPrefix == OrePrefixes.ore) { + ItemData data = GTOreDictUnificator.getItemData(aStack); + if (data != null && data.mPrefix != null && OREBLOCK_PREFIXES.contains(data.mPrefix)) { + return true; + } + } + return this.mPrefix.contains(aStack); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + builder.widget( + new FakeSyncWidget.StringSyncer( + () -> this.mPrefix.toString(), + (prefix) -> this.mPrefix = OrePrefixes.getPrefix(prefix, this.mPrefix))); + } + + @Override + protected Function, List> getItemStackReplacementTooltip() { + return (itemTooltip) -> { + List replacementTooltip = new ArrayList<>(); + replacementTooltip.add("Filter set to " + mPrefix.mRegularLocalName); + replacementTooltip.add("Ore prefix: §e" + mPrefix + "§r"); + replacementTooltip.add("Filter size: §e" + mPrefix.mPrefixedItems.size() + "§r"); + replacementTooltip.addAll(mTooltipCache.getData(REPRESENTATION_SLOT_TOOLTIP).text); + return replacementTooltip; + }; + } + + @Override + protected SlotWidget createFilterIconSlot(BaseSlot slot) { + return new TypeFilterIconSlotWidget(slot); + } + + private class TypeFilterIconSlotWidget extends FilterIconSlotWidget { + + public TypeFilterIconSlotWidget(BaseSlot slot) { + super(slot); + } + + @Override + protected void phantomClick(ClickData clickData, ItemStack cursorStack) { + clickTypeIcon(clickData.mouseButton != 0, cursorStack); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java deleted file mode 100644 index 6964b13165..0000000000 --- a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java +++ /dev/null @@ -1,530 +0,0 @@ -package gregtech.common.tileentities.boilers; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; - -import org.jetbrains.annotations.NotNull; - -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.Widget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.ProgressBar; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.SteamVariant; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.modularui.IGetTitleColor; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; -import gregtech.common.GT_Pollution; - -public abstract class GT_MetaTileEntity_Boiler extends GT_MetaTileEntity_BasicTank - implements IGetTitleColor, IAddUIWidgets { - - public static final byte SOUND_EVENT_LET_OFF_EXCESS_STEAM = 1; - public int mTemperature = 20; - public int mProcessingEnergy = 0; - public int mLossTimer = 0; - public FluidStack mSteam = null; - public boolean mHadNoWater = false; - private int mExcessWater = 0; - - public GT_MetaTileEntity_Boiler(int aID, String aName, String aNameRegional, String aDescription, - ITexture... aTextures) { - super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures); - } - - public GT_MetaTileEntity_Boiler(int aID, String aName, String aNameRegional, String[] aDescription, - ITexture... aTextures) { - super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures); - } - - public GT_MetaTileEntity_Boiler(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 4, aDescription, aTextures); - } - - public GT_MetaTileEntity_Boiler(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 4, aDescription, aTextures); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - ITexture[] tmp; - if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { // Horizontal - if (sideDirection != facingDirection) tmp = mTextures[2][colorIndex + 1]; - else tmp = mTextures[(byte) (active ? 4 : 3)][colorIndex + 1]; - } else { - tmp = mTextures[sideDirection.ordinal()][colorIndex + 1]; - } - if (sideDirection != facingDirection && tmp.length == 2) { - tmp = new ITexture[] { tmp[0] }; - } - return tmp; - } - - @Override - public boolean isElectric() { - return false; - } - - @Override - public boolean isFacingValid(ForgeDirection facingDirection) { - return (facingDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public int getProgresstime() { - return this.mTemperature; - } - - @Override - public int maxProgresstime() { - return 500; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isClientSide()) { - return true; - } - if (aPlayer != null) { - if (GT_Utility.areStacksEqual(aPlayer.getCurrentEquippedItem(), new ItemStack(Items.water_bucket, 1))) { - fill(Materials.Water.getFluid(1000L * (long) aPlayer.getCurrentEquippedItem().stackSize), true); - - if (!aPlayer.capabilities.isCreativeMode) { - aPlayer.getCurrentEquippedItem() - .func_150996_a(Items.bucket); - } - } else { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - } - } - return true; - } - - @Override - public boolean doesFillContainers() { - return true; - } - - @Override - public boolean doesEmptyContainers() { - return true; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return false; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return GT_ModHandler.isWater(aFluid); - } - - @Override - public FluidStack getDrainableStack() { - return this.mSteam; - } - - @Override - public FluidStack setDrainableStack(FluidStack aFluid) { - this.mSteam = aFluid; - return this.mSteam; - } - - @Override - public boolean isDrainableStackSeparate() { - return true; - } - - @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) { - return GregTech_API.getCoverBehaviorNew(aCover.toStack()) - .isSimpleCover(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("mLossTimer", this.mLossTimer); - aNBT.setInteger("mTemperature", this.mTemperature); - aNBT.setInteger("mProcessingEnergy", this.mProcessingEnergy); - aNBT.setInteger("mExcessWater", this.mExcessWater); - if (this.mSteam == null) { - return; - } - try { - aNBT.setTag("mSteam", this.mSteam.writeToNBT(new NBTTagCompound())); - } catch (Throwable ignored) {} - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.mLossTimer = aNBT.getInteger("mLossTimer"); - this.mTemperature = aNBT.getInteger("mTemperature"); - this.mProcessingEnergy = aNBT.getInteger("mProcessingEnergy"); - this.mExcessWater = aNBT.getInteger("mExcessWater"); - this.mSteam = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mSteam")); - } - - /** - * Produce some steam. Assume water is present. - */ - protected void produceSteam(int aAmount) { - mExcessWater -= aAmount; - if (mExcessWater < 0) { - int tWaterToConsume = -mExcessWater / GT_Values.STEAM_PER_WATER; - mFluid.amount -= tWaterToConsume; - mExcessWater += GT_Values.STEAM_PER_WATER * tWaterToConsume; - } - if (GT_ModHandler.isSteam(this.mSteam)) { - this.mSteam.amount += aAmount; - } else { - this.mSteam = GT_ModHandler.getSteam(aAmount); - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - pollute(aTick); - - if (isNotAllowedToWork(aBaseMetaTileEntity, aTick)) return; - - calculateCooldown(); - pushSteamToInventories(aBaseMetaTileEntity); - - if (canNotCreateSteam(aBaseMetaTileEntity, aTick)) { - pollute(aTick); - return; - } - - ventSteamIfTankIsFull(); - updateFuelTimed(aBaseMetaTileEntity, aTick); - calculateHeatUp(aBaseMetaTileEntity, aTick); - } - - private boolean isNotAllowedToWork(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - return (!aBaseMetaTileEntity.isServerSide()) || (aTick <= 20L); - } - - private void pollute(long aTick) { - if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) { - GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution()); - } - } - - private void calculateHeatUp(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if ((this.mTemperature < getMaxTemperature()) && (this.mProcessingEnergy > 0) - && (aTick % getHeatUpRate() == 0L)) { - this.mProcessingEnergy -= getEnergyConsumption(); - this.mTemperature += getHeatUpAmount(); - } - aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0); - } - - private void updateFuelTimed(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork())) - updateFuel(aBaseMetaTileEntity, aTick); - } - - protected void ventSteamIfTankIsFull() { - if ((this.mSteam != null) && (this.mSteam.amount > getSteamCapacity())) { - sendSound(SOUND_EVENT_LET_OFF_EXCESS_STEAM); - this.mSteam.amount = getSteamCapacity() * 3 / 4; - } - } - - private boolean canNotCreateSteam(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aTick % 10L != 0L) { - return false; - } - - if (this.mTemperature > 100) { - if ((!GT_ModHandler.isWater(this.mFluid)) || (this.mFluid.amount <= 0)) { - this.mHadNoWater = true; - } else { - if (this.mHadNoWater) { - GT_Log.exp.println("Boiler " + this.mName + " had no Water!"); - onDangerousWaterLack(aBaseMetaTileEntity, aTick); - return true; - } - produceSteam(getProductionPerSecond() / 2); - } - } else { - this.mHadNoWater = false; - } - return false; - } - - protected void onDangerousWaterLack(IGregTechTileEntity tile, long ignoredTicks) { - tile.doExplosion(2048L); - } - - /** - * Pushes Steam to a Side of this Boiler - * - * @param aBaseMetaTileEntity The tile-entity instance of this Boiler - * @param side The direction of the side to push Steam to - */ - protected final void pushSteamToSide(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side) { - if (mSteam == null || mSteam.amount == 0) return; - final IFluidHandler tTileEntity = aBaseMetaTileEntity.getITankContainerAtSide(side); - if (tTileEntity == null) return; - GT_Utility.moveFluid(aBaseMetaTileEntity, tTileEntity, side, Math.max(1, this.mSteam.amount / 2), null); - } - - /** - * Pushes steam to Fluid inventories at all sides except Front and Bottom. - * - * @param aBaseMetaTileEntity The tile-entity instance of this Boiler - */ - protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) { - if (mSteam == null || mSteam.amount == 0) return; - for (final ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { - if (direction == aBaseMetaTileEntity.getFrontFacing() || direction == ForgeDirection.DOWN) continue; - if (this.mSteam == null) break; - pushSteamToSide(aBaseMetaTileEntity, direction); - } - } - - private void calculateCooldown() { - if (this.mTemperature <= 20) { - this.mTemperature = 20; - this.mLossTimer = 0; - } else if (++this.mLossTimer > getCooldownInterval()) { - // only loss temperature if hot - this.mTemperature -= 1; - this.mLossTimer = 0; - } - } - - protected boolean isAutomatable() { - return GT_Mod.gregtechproxy.mAllowSmallBoilerAutomation; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return isAutomatable() && aIndex == 1 || aIndex == 3; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return isAutomatable() && (aIndex == 0 && isItemValidFluidFilledItem(aStack)) - || (aIndex == 2 && isItemValidFuel(aStack)); - } - - @Override - public void doSound(byte aIndex, double aX, double aY, double aZ) { - if (aIndex == GT_MetaTileEntity_Boiler.SOUND_EVENT_LET_OFF_EXCESS_STEAM) { - GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 2, 1.0F, aX, aY, aZ); - - new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) - .setWorld(getBaseMetaTileEntity().getWorld()) - .setMotion(0D, 0D, 0D) - .times( - 8, - x -> x.setPosition(aX - 0.5D + XSTR_INSTANCE.nextFloat(), aY, aZ - 0.5D + XSTR_INSTANCE.nextFloat()) - .run()); - } - } - - @Override - public int getTankPressure() { - return 100; - } - - protected abstract int getPollution(); - - @Override - public int getCapacity() { - return 16000; - } - - protected int getSteamCapacity() { - return getCapacity(); - } - - protected abstract int getProductionPerSecond(); - - protected abstract int getMaxTemperature(); - - protected abstract int getEnergyConsumption(); - - protected abstract int getCooldownInterval(); - - protected int getHeatUpRate() { - return 12; - } - - protected int getHeatUpAmount() { - return 1; - } - - protected abstract void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick); - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.BRONZE; - } - - protected IDrawable[] getFuelSlotBackground() { - return new IDrawable[] { getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_COAL_STEAM.get(getSteamVariant()) }; - } - - protected IDrawable[] getAshSlotBackground() { - return new IDrawable[] { getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant()) }; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new SlotWidget(inventoryHandler, 0).setFilter(this::isItemValidFluidFilledItem) - .setPos(43, 25) - .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotIn())) - .widget( - new SlotWidget(inventoryHandler, 1).setAccess(true, false) - .setPos(43, 61) - .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotOut())) - .widget(createFuelSlot()) - .widget(createAshSlot()) - .widget( - new ProgressBar().setProgress(() -> mSteam == null ? 0 : (float) mSteam.amount / getSteamCapacity()) - .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_STEAM, 10) - .setDirection(ProgressBar.Direction.UP) - .setPos(70, 25) - .setSize(10, 54)) - .widget( - new ProgressBar().setProgress(() -> mFluid == null ? 0 : (float) mFluid.amount / getCapacity()) - .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_WATER, 10) - .setDirection(ProgressBar.Direction.UP) - .setPos(83, 25) - .setSize(10, 54)) - .widget( - new ProgressBar().setProgress(() -> (float) mTemperature / maxProgresstime()) - .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_HEAT, 10) - .setDirection(ProgressBar.Direction.UP) - .setPos(96, 25) - .setSize(10, 54)) - .widget( - new ProgressBar() - // cap minimum so that one can easily see there's fuel remaining - .setProgress(() -> mProcessingEnergy > 0 ? Math.max((float) mProcessingEnergy / 1000, 1f / 5) : 0) - .setTexture(getProgressbarFuel(), 14) - .setDirection(ProgressBar.Direction.UP) - .setPos(116, 45) - .setSize(14, 14)) - .widget( - new DrawableWidget().setDrawable(getOverlaySlotCanister()) - .setPos(43, 43) - .setSize(18, 18)); - } - - private boolean isItemValidFluidFilledItem(@NotNull ItemStack stack) { - return isFluidInputAllowed(GT_Utility.getFluidForFilledItem(stack, true)); - } - - protected Widget createFuelSlot() { - return new SlotWidget(inventoryHandler, 2).setFilter(this::isItemValidFuel) - .setPos(115, 61) - .setBackground(getFuelSlotBackground()); - } - - protected boolean isItemValidFuel(@NotNull ItemStack stack) { - return true; - } - - protected SlotWidget createAshSlot() { - return (SlotWidget) new SlotWidget(inventoryHandler, 3).setAccess(true, false) - .setPos(115, 25) - .setBackground(getAshSlotBackground()); - } - - @Override - public GUITextureSet getGUITextureSet() { - return GUITextureSet.STEAM.apply(getSteamVariant()); - } - - @Override - public int getTitleColor() { - return getSteamVariant() == SteamVariant.BRONZE ? COLOR_TITLE.get() : COLOR_TITLE_WHITE.get(); - } - - // for GT++ - - protected IDrawable getOverlaySlotIn() { - return GT_UITextures.OVERLAY_SLOT_IN_STEAM.get(getSteamVariant()); - } - - protected IDrawable getOverlaySlotOut() { - return GT_UITextures.OVERLAY_SLOT_OUT_STEAM.get(getSteamVariant()); - } - - protected IDrawable getOverlaySlotCanister() { - return GT_UITextures.OVERLAY_SLOT_CANISTER_STEAM.get(getSteamVariant()); - } - - protected UITexture getProgressbarEmpty() { - return GT_UITextures.PROGRESSBAR_BOILER_EMPTY_STEAM.get(getSteamVariant()); - } - - protected UITexture getProgressbarFuel() { - return GT_UITextures.PROGRESSBAR_FUEL_STEAM.get(getSteamVariant()); - } -} diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java deleted file mode 100644 index 3450d55290..0000000000 --- a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java +++ /dev/null @@ -1,260 +0,0 @@ -package gregtech.common.tileentities.boilers; - -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import java.util.Optional; -import java.util.stream.Stream; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidContainerRegistry; - -import org.jetbrains.annotations.NotNull; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.ParticleFX; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.objects.XSTR; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; -import gregtech.common.GT_Pollution; - -public class GT_MetaTileEntity_Boiler_Bronze extends GT_MetaTileEntity_Boiler { - - public GT_MetaTileEntity_Boiler_Bronze(int aID, String aName, String aNameRegional) { - super( - aID, - aName, - aNameRegional, - new String[] { "An early way to get Steam Power", "Produces 120L of Steam per second", - "Causes " + GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond + " Pollution per second" }); - } - - public GT_MetaTileEntity_Boiler_Bronze(int aID, String aName, String aNameRegional, String[] aDescription) { - super(aID, aName, aNameRegional, aDescription); - } - - public GT_MetaTileEntity_Boiler_Bronze(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_Boiler_Bronze(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[5][17][]; - final ITexture[] texBottom = { TextureFactory.of(MACHINE_BRONZEBRICKS_BOTTOM) }, - texTop = { TextureFactory.of(MACHINE_BRONZEBRICKS_TOP), TextureFactory.of(OVERLAY_PIPE) }, - texSide = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(OVERLAY_PIPE) }, - texFront = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(BOILER_FRONT), - TextureFactory.builder() - .addIcon(BOILER_FRONT_GLOW) - .glow() - .build() }, - texFrontActive = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(BOILER_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(BOILER_FRONT_ACTIVE_GLOW) - .glow() - .build() }; - for (int i = 0; i < 17; i++) { - rTextures[0][i] = texBottom; - rTextures[1][i] = texTop; - rTextures[2][i] = texSide; - rTextures[3][i] = texFront; - rTextures[4][i] = texFrontActive; - } - return rTextures; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Boiler_Bronze(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - /** - * Draws random flames and smoke particles in front of active boiler - * - * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - if (aBaseMetaTileEntity.isActive()) { - - final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing(); - - if ((frontFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 - && aBaseMetaTileEntity.getCoverIDAtSide(frontFacing) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(frontFacing)) { - - final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 8D / 16D; - final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1); - final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 8D / 16D; - final double offset = -0.48D; - final double horizontal = XSTR_INSTANCE.nextFloat() * 10D / 16D - 5D / 16D; - - final double x, y, z; - - y = oY + XSTR_INSTANCE.nextFloat() * 6D / 16D; - - if (frontFacing == ForgeDirection.WEST) { - x = oX - offset; - z = oZ + horizontal; - } else if (frontFacing == ForgeDirection.EAST) { - x = oX + offset; - z = oZ + horizontal; - } else if (frontFacing == ForgeDirection.NORTH) { - x = oX + horizontal; - z = oZ - offset; - } else // if (frontFacing == ForgeDirection.SOUTH) - { - x = oX + horizontal; - z = oZ + offset; - } - - ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D) - .setPosition(x, y, z) - .setWorld(getBaseMetaTileEntity().getWorld()); - particleEventBuilder.setIdentifier(ParticleFX.SMOKE) - .run(); - particleEventBuilder.setIdentifier(ParticleFX.FLAME) - .run(); - } - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if ((aBaseMetaTileEntity.isServerSide()) && (aTick > 20L) - && this.mProcessingEnergy > 0 - && (aTick % 20L == 0L)) { - GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution()); - } - } - - @Override - protected int getPollution() { - return GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond; - } - - @Override - protected int getProductionPerSecond() { - return 120; - } - - @Override - protected int getMaxTemperature() { - return 500; - } - - @Override - protected int getEnergyConsumption() { - return 1; - } - - @Override - protected int getCooldownInterval() { - return 45; - } - - @Override - protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - ItemStack fuel = mInventory[2]; - int burnTime = TileEntityFurnace.getItemBurnTime(fuel); - getCombustionPotential(fuel, burnTime).ifPresent(ashMaterial -> { - aBaseMetaTileEntity.decrStackSize(2, 1); - this.mProcessingEnergy += burnTime / 10; - boolean isABlock = !Block.getBlockFromItem(fuel.getItem()) - .equals(Blocks.air); - combustFuel(burnTime, isABlock).map(dustSize -> GT_OreDictUnificator.get(dustSize, ashMaterial, 1L)) - .ifPresent(ashes -> aBaseMetaTileEntity.addStackToSlot(3, ashes)); - }); - } - - private static Optional getCombustionPotential(ItemStack fuel, int burnTime) { - if (burnTime / 10 <= 0 || FluidContainerRegistry.isFilledContainer(fuel)) { - return Optional.empty(); - } - String lowerCaseBlockName = Block.getBlockFromItem(fuel.getItem()) - .getUnlocalizedName() - .toLowerCase(); - if (couldProduceDarkAshes(fuel, lowerCaseBlockName)) { - return Optional.of(Materials.DarkAsh); - } - if (couldProduceRegularAshes(fuel, lowerCaseBlockName, burnTime)) { - return Optional.of(Materials.Ash); - } - return Optional.empty(); - } - - private static boolean couldProduceDarkAshes(ItemStack fuel, String lowerCaseBlockName) { - return GT_Utility.isPartOfMaterials(fuel, Materials.Coal) - || GT_Utility.isPartOfMaterials(fuel, Materials.Lignite) - || lowerCaseBlockName.matches("tile\\..+compressedcoal"); - } - - private static boolean couldProduceRegularAshes(ItemStack fuel, String lowerCaseBlockName, int burnTime) { - return GT_Utility.isPartOfMaterials(fuel, Materials.Charcoal) - || GT_Utility.isPartOfMaterials(fuel, Materials.Diamond) - || (Stream.of("^tile\\..+charcoal", "^tile\\..+coke", "^tile\\..+railcraft.cube") - .anyMatch(lowerCaseBlockName::matches)) - || Stream.of("fuelCoke", "fuelCactusCharcoal", "fuelCactusCoke", "fuelSugarCharcoal", "fuelSugarCoke") - .anyMatch(name -> GT_OreDictUnificator.isItemStackInstanceOf(fuel, name)) - || burnTime >= 2000; - } - - private static Optional combustFuel(int burnTime, boolean isABlock) { - if (isABlock) { - return Optional.of(OrePrefixes.dust); - } else if (XSTR.XSTR_INSTANCE.nextInt(getAshChanceBound(burnTime)) == 0) { - if (burnTime > 100000) { - return Optional.of(OrePrefixes.dust); - } else if (burnTime > 10000) { - return Optional.of(OrePrefixes.dustSmall); - } else { - return Optional.of(OrePrefixes.dustTiny); - } - } - return Optional.empty(); - } - - /** - * The upper bound for the chance to get ash from combustion - *
- * Ash chance scales based on burn time from 14% at 0 up to 50% at 2000 - * - * @param burnTime number assumed to be positive - * @return an upper bound between 7 and 2. - */ - private static int getAshChanceBound(int burnTime) { - return (5 - (Math.min(burnTime, 2000) / 400)) + 2; - } - - @Override - protected boolean isItemValidFuel(@NotNull ItemStack stack) { - return getCombustionPotential(stack, TileEntityFurnace.getItemBurnTime(stack)).isPresent(); - } - -} diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java deleted file mode 100644 index d0dfe74b64..0000000000 --- a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java +++ /dev/null @@ -1,474 +0,0 @@ -package gregtech.common.tileentities.boilers; - -import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN; -import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DRAIN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.block.Block; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidContainerItem; -import net.minecraftforge.fluids.IFluidHandler; -import net.minecraftforge.fluids.IFluidTank; - -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.SteamVariant; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; - -public class GT_MetaTileEntity_Boiler_Lava extends GT_MetaTileEntity_Boiler { - - public static final int COOLDOWN_INTERVAL = 20; - public static final int ENERGY_PER_LAVA = 1; - public static final int CONSUMPTION_PER_HEATUP = 3; - public static final int PRODUCTION_PER_SECOND = 600; - private final FluidTank lavaTank = new LavaTank(null, getCapacity()); - private int mCooledLava = 0; - - public GT_MetaTileEntity_Boiler_Lava(int aID, String aName, String aNameRegional) { - super( - aID, - aName, - aNameRegional, - new String[] { "A Boiler running off Lava", "Produces " + PRODUCTION_PER_SECOND + "L of Steam per second", - "Causes " + GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond + " Pollution per second", - "Consumes " + ((double) CONSUMPTION_PER_HEATUP / ENERGY_PER_LAVA) - + "L of Lava every " - + COOLDOWN_INTERVAL - + " ticks when fully heat up" }); - } - - public GT_MetaTileEntity_Boiler_Lava(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_Boiler_Lava(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - final ForgeDirection rearDirection = facingDirection.getOpposite(); - final ITexture[] tmp; - if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { - if (sideDirection == facingDirection) { - if (active) tmp = mTextures[4][colorIndex + 1]; - else tmp = mTextures[3][colorIndex + 1]; - } else if (sideDirection == rearDirection) { - tmp = mTextures[5][colorIndex + 1]; - } else { - tmp = mTextures[2][colorIndex + 1]; - } - } else tmp = mTextures[sideDirection.ordinal()][colorIndex + 1]; - if (sideDirection != facingDirection && tmp.length == 2) { - return new ITexture[] { tmp[0] }; - } - return tmp; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[6][17][]; - for (byte color = -1; color < 16; color++) { - int i = color + 1; - short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa); - rTextures[0][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_BOTTOM, colorModulation) }; - rTextures[1][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_TOP, colorModulation), - TextureFactory.of(OVERLAY_DRAIN), TextureFactory.of(FLUID_IN_SIGN) }; - rTextures[2][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), - TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_IN_SIGN) }; - rTextures[3][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), - TextureFactory.of(BOILER_LAVA_FRONT, colorModulation), TextureFactory.of(BOILER_LAVA_FRONT_GLOW) }; - rTextures[4][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), - TextureFactory.of(BOILER_LAVA_FRONT_ACTIVE), TextureFactory.builder() - .addIcon(BOILER_LAVA_FRONT_ACTIVE_GLOW) - .glow() - .build() }; - rTextures[5][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), - TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) }; - } - return rTextures; - } - - @Override - public int maxProgresstime() { - return 1000; - } - - @Override - public int getCapacity() { - return 32000; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Boiler_Lava(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - protected int getPollution() { - return GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond; - } - - @Override - protected int getProductionPerSecond() { - return PRODUCTION_PER_SECOND; - } - - @Override - protected int getMaxTemperature() { - return 1000; - } - - @Override - protected int getEnergyConsumption() { - this.mCooledLava += CONSUMPTION_PER_HEATUP; - return CONSUMPTION_PER_HEATUP; - } - - @Override - protected int getCooldownInterval() { - return COOLDOWN_INTERVAL; - } - - /** - * Attempts to fill an {@link IFluidTank} from the {@link FluidStack} content of an {@link ItemStack} - * - * @param destinationIFluidTank The destination {@link IFluidTank} to fill - * @param SourceItemStack The source {@link ItemStack} containing the Fluid - * @return The {@link ItemStack} of the Empty version of the source {@link ItemStack} or {@code null} if none - */ - public static ItemStack fillIFluidTankFromItemStack(IFluidTank destinationIFluidTank, ItemStack SourceItemStack) { - if (destinationIFluidTank == null || SourceItemStack == null) return null; - - final FluidStack containedFluidStack = GT_Utility.getFluidForFilledItem(SourceItemStack, true); - if (containedFluidStack == null || containedFluidStack.amount == 0) return null; - - final int fillableAmount = destinationIFluidTank.fill(containedFluidStack, false); - if (fillableAmount <= 0) return null; - - final Item containerItem = SourceItemStack.getItem(); - if (containerItem instanceof IFluidContainerItem equippedIFluidContainerItem) { - destinationIFluidTank.fill(equippedIFluidContainerItem.drain(SourceItemStack, fillableAmount, true), true); - return null; - } else { - final ItemStack emptyContainerItemStack = GT_Utility.getContainerForFilledItem(SourceItemStack, false); - destinationIFluidTank.fill(containedFluidStack, true); - return emptyContainerItemStack; - } - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isClientSide() || aPlayer == null) return true; - - final ItemStack equippedItemStack = aPlayer.getCurrentEquippedItem(); - final FluidStack equippedContainerFluidStack = GT_Utility.getFluidForFilledItem(equippedItemStack, true); - final ItemStack returnedItemStack; - final IFluidTank tank; - - if (GT_ModHandler.isWater(equippedContainerFluidStack)) { - tank = this; - } else if (GT_ModHandler.isLava(equippedContainerFluidStack)) { - tank = lavaTank; - } else { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - returnedItemStack = fillIFluidTankFromItemStack(tank, equippedItemStack); - if (returnedItemStack != null && !aPlayer.capabilities.isCreativeMode) { - if (equippedItemStack.stackSize > 1) { - if (!aPlayer.inventory.addItemStackToInventory(returnedItemStack)) { - aBaseMetaTileEntity.getWorld() - .spawnEntityInWorld( - new EntityItem( - aBaseMetaTileEntity.getWorld(), - (double) aBaseMetaTileEntity.getXCoord() + 0.5D, - (double) aBaseMetaTileEntity.getYCoord() + 1.5D, - (double) aBaseMetaTileEntity.getZCoord() + 0.5D, - equippedItemStack)); - } else if (aPlayer instanceof EntityPlayerMP) { - ((EntityPlayerMP) aPlayer).sendContainerToPlayer(aPlayer.inventoryContainer); - } - aPlayer.inventory.decrStackSize(aPlayer.inventory.currentItem, 1); - } else { - aPlayer.inventory.setInventorySlotContents(aPlayer.inventory.currentItem, returnedItemStack); - } - } - return true; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (lavaTank.getFluid() != null) aNBT.setTag( - "mLava", - lavaTank.getFluid() - .writeToNBT(new NBTTagCompound())); - aNBT.setInteger("mCooledLava", this.mCooledLava); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - lavaTank.setFluid(FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mLava"))); - this.mCooledLava = aNBT.getInteger("mCooledLava"); - } - - /** - * Pushes steam to Fluid inventory at the rear. - * - * @param aBaseMetaTileEntity The tile-entity instance of this Lava Boiler - */ - @Override - protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) { - if (mSteam == null || mSteam.amount == 0) return; - pushSteamToSide( - aBaseMetaTileEntity, - aBaseMetaTileEntity.getFrontFacing() - .getOpposite()); - } - - /** - * Drains Lava from Fluid inventory on top - * - * @param aBaseMetaTileEntity The tile-entity instance of this Lava Boiler - */ - protected void drainLava(IGregTechTileEntity aBaseMetaTileEntity) { - final IFluidHandler upTank = aBaseMetaTileEntity.getITankContainerAtSide(ForgeDirection.UP); - if (upTank == null) return; - // Simulates drain of maximum lava amount up to 1000L that can fit the internal tank - final FluidStack drainableLavaStack = upTank.drain( - ForgeDirection.DOWN, - FluidRegistry.getFluidStack( - "lava", - Math.min( - this.lavaTank.getCapacity() - - (this.lavaTank.getFluid() != null ? this.lavaTank.getFluid().amount : 0), - 1000)), - false); - if (!GT_ModHandler.isLava(drainableLavaStack) || drainableLavaStack.amount <= 0) return; - // Performs actual drain up and fill internal tank - this.lavaTank.fill(upTank.drain(ForgeDirection.DOWN, drainableLavaStack, true), true); - } - - /** - * Processes cooled Lava into Obsidian - * - * @return success | failure when cannot output - */ - private boolean lavaToObsidian() { - if (this.mCooledLava >= 1000) { - if (getBaseMetaTileEntity().addStackToSlot(3, new ItemStack(Blocks.obsidian, 1))) { - this.mCooledLava -= 1000; - } else { - return false; - } - } - return true; - } - - /** - * Draws random flames and smoke particles in front of this Lava Boiler when it is active - * - * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - if (aBaseMetaTileEntity.isActive()) { - - final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing(); - - if ((frontFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 - && aBaseMetaTileEntity.getCoverIDAtSide(frontFacing) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(frontFacing)) { - - final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 8D / 16D; - final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1); - final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 8D / 16D; - final double offset = -0.48D; - final double horizontal = XSTR_INSTANCE.nextFloat() * 10D / 16D - 5D / 16D; - - final double x, y, z; - - y = oY + XSTR_INSTANCE.nextFloat() * 6D / 16D; - - switch (frontFacing) { - case WEST -> { - x = oX - offset; - z = oZ + horizontal; - } - case EAST -> { - x = oX + offset; - z = oZ + horizontal; - } - case NORTH -> { - x = oX + horizontal; - z = oZ - offset; - } - default -> { // case SOUTH: - x = oX + horizontal; - z = oZ + offset; - } - } - - ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D) - .setPosition(x, y, z) - .setWorld(getBaseMetaTileEntity().getWorld()); - particleEventBuilder.setIdentifier(ParticleFX.SMOKE) - .run(); - particleEventBuilder.setIdentifier(ParticleFX.FLAME) - .run(); - } - } - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return GT_ModHandler.isWater(aFluid) || GT_ModHandler.isLava(aFluid); - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (!aBaseMetaTileEntity.isServerSide()) return; - final FluidStack containedFluidStack = GT_Utility.getFluidForFilledItem(mInventory[getInputSlot()], true); - if (GT_ModHandler.isWater(containedFluidStack)) super.onPreTick(aBaseMetaTileEntity, aTick); - if (GT_ModHandler.isLava(containedFluidStack) - && lavaTank.fill(containedFluidStack, false) == containedFluidStack.amount - && aBaseMetaTileEntity.addStackToSlot( - getOutputSlot(), - GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true), - 1)) { - lavaTank.fill(containedFluidStack, true); - aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aTick % 20 == 0) drainLava(aBaseMetaTileEntity); - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - protected boolean isAutomatable() { - return true; - } - - @Override - public void doSound(byte aIndex, double aX, double aY, double aZ) { - if (aIndex != GT_MetaTileEntity_Boiler.SOUND_EVENT_LET_OFF_EXCESS_STEAM) return; - - final ForgeDirection rearDirection = getBaseMetaTileEntity().getFrontFacing() - .getOpposite(); - GT_Utility.doSoundAtClient( - SoundResource.RANDOM_FIZZ, - 2, - 1.0F, - // Sound emitted from center of rear face (Steam Output) - aX + 0.5 * rearDirection.offsetX, - aY, - aZ + 0.5 * rearDirection.offsetZ); - - new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) - .setWorld(getBaseMetaTileEntity().getWorld()) - // Particles emitted with a 1 block/s velocity toward rear - .setMotion(rearDirection.offsetX / 20D, 0D, rearDirection.offsetZ / 20D) - .times( - 8, - // Particles emitted from center of rear face (Steam Output) - x -> x.setPosition(aX + rearDirection.offsetX / 2D, aY, aZ + rearDirection.offsetZ / 2D) - .run()); - } - - @Override - protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (!lavaToObsidian()) return; - if (lavaTank.getFluid() == null || lavaTank.getFluid().amount <= 0) return; - final int amountToDrain = Math.min(lavaTank.getFluid().amount, 1000); - final FluidStack drainedLava = lavaTank.drain(amountToDrain, false); - if (drainedLava == null || drainedLava.amount == 0) return; - lavaTank.drain(amountToDrain, true); - this.mProcessingEnergy += drainedLava.amount * ENERGY_PER_LAVA; - } - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.STEEL; - } - - @Override - public int fill(FluidStack aFluid, boolean doFill) { - if (GT_ModHandler.isWater(aFluid)) return super.fill(aFluid, doFill); - if (GT_ModHandler.isLava(aFluid)) return lavaTank.fill(aFluid, doFill); - return 0; - } - - @Override - public FluidTankInfo[] getTankInfo(ForgeDirection side) { - return new FluidTankInfo[] { super.getTankInfo(side)[0], - new FluidTankInfo(this.lavaTank.getFluid(), this.lavaTank.getCapacity()), - new FluidTankInfo(getDrainableStack(), getSteamCapacity()) }; - } - - @Override - protected IDrawable[] getAshSlotBackground() { - return new IDrawable[] { getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_BLOCK_STEAM.get(getSteamVariant()) }; - } - - @Override - protected Widget createFuelSlot() { - return new FluidSlotWidget(lavaTank).setBackground(getGUITextureSet().getFluidSlot(), getOverlaySlotIn()) - .setPos(115, 61); - } - - static class LavaTank extends FluidTank { - - public LavaTank(FluidStack stack, int capacity) { - super(stack, capacity); - } - - @Override - public int fill(FluidStack resource, boolean doFill) { - return GT_ModHandler.isLava(resource) ? super.fill(resource, doFill) : 0; - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java deleted file mode 100644 index b10b44228d..0000000000 --- a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java +++ /dev/null @@ -1,311 +0,0 @@ -package gregtech.common.tileentities.boilers; - -import static mcp.mobius.waila.api.SpecialChars.GOLD; -import static mcp.mobius.waila.api.SpecialChars.RESET; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.SteamVariant; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.common.config.machinestats.ConfigBronzeSolarBoiler; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_Boiler_Solar extends GT_MetaTileEntity_Boiler { - - public static final String LPS_FMT = "%s L/s"; - private static final String localizedDescFormat = GT_LanguageManager.addStringLocalization( - "gt.blockmachines.boiler.solar.desc.format", - "Steam Power by the Sun%n" + "Produces %sL of Steam per second%n" - + "Calcifies over time, reducing Steam output to %sL/s%n" - + "Break and replace to descale"); - protected int calcificationTicks = ConfigBronzeSolarBoiler.calcificationTicks; - protected int cooldownTicks = ConfigBronzeSolarBoiler.cooldownTicks; - protected int maxOutputPerSecond = ConfigBronzeSolarBoiler.maxOutputPerSecond; - protected int minOutputPerSecond = ConfigBronzeSolarBoiler.minOutputPerSecond; - - protected final int basicTemperatureMod = 5; // Base Celsius gain or loss - private int mRunTimeTicks = 0; - - public GT_MetaTileEntity_Boiler_Solar(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, new String[0]); - } - - public GT_MetaTileEntity_Boiler_Solar(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_Boiler_Solar(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public int getMaxOutputPerSecond() { - return maxOutputPerSecond; - } - - @Override - public String[] getDescription() { - return String - .format( - localizedDescFormat, - GT_Utility.formatNumbers(getMaxOutputPerSecond()), - GT_Utility.formatNumbers(getMinOutputPerSecond())) - .split("\\R"); - } - - public int getMinOutputPerSecond() { - return minOutputPerSecond; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[4][17][]; - for (int color = -1; color < 16; color++) { - int i = color + 1; - short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa); - rTextures[0][i] = new ITexture[] { - TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM, colorModulation) }; - rTextures[1][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_TOP, colorModulation), - TextureFactory.of(BlockIcons.BOILER_SOLAR) }; - rTextures[2][i] = new ITexture[] { - TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_SIDE, colorModulation) }; - rTextures[3][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_SIDE, colorModulation), - TextureFactory.of(BlockIcons.OVERLAY_PIPE) }; - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - final int i = colorIndex + 1; - if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { // Horizontal - if (sideDirection != facingDirection) return mTextures[2][i]; - return mTextures[3][i]; - } - return mTextures[sideDirection.ordinal()][i]; - } - - @Override - public int maxProgresstime() { - return 500; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("mRunTime", mRunTimeTicks); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mRunTimeTicks = aNBT.getInteger("mRunTime"); - } - - @Override - protected void produceSteam(int aAmount) { - super.produceSteam(aAmount); - // Disable calcification when using distilled water - if (mFluid.isFluidEqual(GT_ModHandler.getWater(1))) { - // produceSteam is getting called every 10 ticks - if (mRunTimeTicks >= 0 && mRunTimeTicks < (Integer.MAX_VALUE - 10)) mRunTimeTicks += 10; - else mRunTimeTicks = Integer.MAX_VALUE; // Prevent Integer overflow wrap - } - } - - @Override - protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) { - if (mSteam == null || mSteam.amount == 0) return; - pushSteamToSide(aBaseMetaTileEntity, aBaseMetaTileEntity.getFrontFacing()); - } - - @Override - protected int getPollution() { - return 0; - } - - @Override - public int getProductionPerSecond() { - if (mTemperature < 100) { - return 0; - } - if (mRunTimeTicks > getMaxRuntimeTicks()) { - return getMinOutputPerSecond(); - } else if (mRunTimeTicks > getCalcificationTicks()) { - /* - * When reaching calcification ticks; discount the proportion of run-time spent on calcification from the - * maximum output per second, and return this or the minimum output per second - */ - return getMaxOutputPerSecond() - - getMaxOutputPerSecond() * (mRunTimeTicks - getCalcificationTicks()) / getCalcificationTicks(); - } else { - return getMaxOutputPerSecond(); - } - } - - protected int getCalcificationTicks() { - return calcificationTicks; - } - - protected int getCooldownTicks() { - return cooldownTicks; - } - - protected int getMaxRuntimeTicks() { - // After which min output is reached. - return (getMaxOutputPerSecond() - getMinOutputPerSecond()) * getCalcificationTicks() / getMaxOutputPerSecond() - + getCalcificationTicks(); - } - - @Override - protected int getMaxTemperature() { - return 500; - } - - @Override - protected int getEnergyConsumption() { - return basicTemperatureMod; - } - - @Override - protected int getCooldownInterval() { - return getCooldownTicks() / basicTemperatureMod; - } - - @Override - protected int getHeatUpAmount() { - return basicTemperatureMod; - } - - @Override - protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - World world = aBaseMetaTileEntity.getWorld(); - // Heat-up every 12s (240 ticks), has to be multiple of 20 ticks - if ((aTick % 240L != 0L) || (world.isThundering())) { - return; - } - if (!aBaseMetaTileEntity.getSkyAtSide(ForgeDirection.UP)) { - return; - } - boolean weatherClear = !world.isRaining() || aBaseMetaTileEntity.getBiome().rainfall == 0.0F; - if (!weatherClear && world.skylightSubtracted >= 4) { - return; - } - if (weatherClear) { - if (world.isDaytime()) { - mProcessingEnergy += 8 * basicTemperatureMod; - } else { - mProcessingEnergy += basicTemperatureMod; - } - } else { - mProcessingEnergy += basicTemperatureMod; - } - } - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.BRONZE; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - return String - .format( - "Heat Capacity: " + EnumChatFormatting.GREEN - + "%s %%" - + EnumChatFormatting.RESET - + " Hot time: " - + EnumChatFormatting.RED - + "%s s" - + EnumChatFormatting.RESET - + "%n" - + "Min output: " - + EnumChatFormatting.RED - + LPS_FMT - + EnumChatFormatting.RESET - + " Max output: " - + EnumChatFormatting.RED - + LPS_FMT - + EnumChatFormatting.RESET - + "%n" - + "Current Output: " - + EnumChatFormatting.YELLOW - + LPS_FMT - + EnumChatFormatting.RESET, - GT_Utility.formatNumbers(getHeatCapacityPercent()), - GT_Utility.formatNumbers(getHotTimeSeconds()), - GT_Utility.formatNumbers(getMinOutputPerSecond()), - GT_Utility.formatNumbers(getMaxOutputPerSecond()), - GT_Utility.formatNumbers(getProductionPerSecond())) - .split("\\R"); - } - - public int getHeatCapacityPercent() { - return mTemperature * 100 / maxProgresstime(); - } - - public int getHotTimeSeconds() { - return mRunTimeTicks / 20; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Boiler_Solar(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - protected Widget createFuelSlot() { - return null; - } - - @Override - protected SlotWidget createAshSlot() { - return null; - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - final NBTTagCompound tag = accessor.getNBTData(); - currentTip.add( - String.format( - (GOLD + "Solar Boiler Output: " + RESET + "%d/%d L/s"), - tag.getInteger("calcificationOutput"), - tag.getInteger("maxCalcificationOutput"))); - - super.getWailaBody(itemStack, currentTip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setInteger("calcificationOutput", (getProductionPerSecond())); - tag.setInteger("maxCalcificationOutput", (getMaxOutputPerSecond())); - } -} diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java deleted file mode 100644 index c537e388d1..0000000000 --- a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java +++ /dev/null @@ -1,71 +0,0 @@ -package gregtech.common.tileentities.boilers; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.SteamVariant; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.common.config.machinestats.ConfigSteelSolarBoiler; - -public class GT_MetaTileEntity_Boiler_Solar_Steel extends GT_MetaTileEntity_Boiler_Solar { - - public GT_MetaTileEntity_Boiler_Solar_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - initBoilerStats(); - } - - public GT_MetaTileEntity_Boiler_Solar_Steel(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - initBoilerStats(); - } - - public GT_MetaTileEntity_Boiler_Solar_Steel(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - initBoilerStats(); - } - - protected void initBoilerStats() { - calcificationTicks = ConfigSteelSolarBoiler.calcificationTicks; - cooldownTicks = ConfigSteelSolarBoiler.cooldownTicks; - maxOutputPerSecond = ConfigSteelSolarBoiler.maxOutputPerSecond; - minOutputPerSecond = ConfigSteelSolarBoiler.minOutputPerSecond; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - - ITexture[][][] rTextures = new ITexture[4][17][]; - for (int color = -1; color < 16; color++) { - int i = color + 1; - short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa); - rTextures[0][i] = new ITexture[] { - TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_BOTTOM, colorModulation) }; - rTextures[1][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_TOP, colorModulation), - TextureFactory.of(BlockIcons.BOILER_SOLAR) }; - rTextures[2][i] = new ITexture[] { - TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_SIDE, colorModulation) }; - rTextures[3][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_SIDE, colorModulation), - TextureFactory.of(BlockIcons.OVERLAY_PIPE) }; - } - return rTextures; - } - - @Override - public int getCapacity() { - return 32000; - } - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.STEEL; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Boiler_Solar_Steel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } -} diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java deleted file mode 100644 index 12374c3313..0000000000 --- a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java +++ /dev/null @@ -1,108 +0,0 @@ -package gregtech.common.tileentities.boilers; - -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE; - -import gregtech.GT_Mod; -import gregtech.api.enums.SteamVariant; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_Boiler_Steel extends GT_MetaTileEntity_Boiler_Bronze { - - public GT_MetaTileEntity_Boiler_Steel(int aID, String aName, String aNameRegional) { - super( - aID, - aName, - aNameRegional, - new String[] { "Faster than the Bronze Boiler", "Produces 300L of Steam per second", - "Causes " + GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond + " Pollution per second" }); - } - - public GT_MetaTileEntity_Boiler_Steel(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_Boiler_Steel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[5][17][]; - final ITexture[] texBottom = { TextureFactory.of(MACHINE_STEELBRICKS_BOTTOM) }, - texTop = { TextureFactory.of(MACHINE_STEELBRICKS_TOP), TextureFactory.of(OVERLAY_PIPE) }, - texSide = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(OVERLAY_PIPE) }, - texFront = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(BOILER_FRONT), - TextureFactory.builder() - .addIcon(BOILER_FRONT_GLOW) - .glow() - .build() }, - texFrontActive = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(BOILER_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(BOILER_FRONT_ACTIVE_GLOW) - .glow() - .build() }; - for (int i = 0; i < 17; i++) { - rTextures[0][i] = texBottom; - rTextures[1][i] = texTop; - rTextures[2][i] = texSide; - rTextures[3][i] = texFront; - rTextures[4][i] = texFrontActive; - } - return rTextures; - } - - @Override - public int maxProgresstime() { - return 1000; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Boiler_Steel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - protected int getPollution() { - return GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond; - } - - @Override - public int getCapacity() { - return 32000; - } - - @Override - protected int getProductionPerSecond() { - return 300; - } - - @Override - protected int getMaxTemperature() { - return 1000; - } - - @Override - protected int getEnergyConsumption() { - return 2; - } - - @Override - protected int getCooldownInterval() { - return 40; - } - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.STEEL; - } -} diff --git a/src/main/java/gregtech/common/tileentities/boilers/MTEBoiler.java b/src/main/java/gregtech/common/tileentities/boilers/MTEBoiler.java new file mode 100644 index 0000000000..b49da44e97 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/boilers/MTEBoiler.java @@ -0,0 +1,527 @@ +package gregtech.common.tileentities.boilers; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import org.jetbrains.annotations.NotNull; + +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.Widget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.SteamVariant; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.modularui.IGetTitleColor; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicTank; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; +import gregtech.common.Pollution; + +public abstract class MTEBoiler extends MTEBasicTank implements IGetTitleColor, IAddUIWidgets { + + public static final byte SOUND_EVENT_LET_OFF_EXCESS_STEAM = 1; + public int mTemperature = 20; + public int mProcessingEnergy = 0; + public int mLossTimer = 0; + public FluidStack mSteam = null; + public boolean mHadNoWater = false; + private int mExcessWater = 0; + + public MTEBoiler(int aID, String aName, String aNameRegional, String aDescription, ITexture... aTextures) { + super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures); + } + + public MTEBoiler(int aID, String aName, String aNameRegional, String[] aDescription, ITexture... aTextures) { + super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures); + } + + public MTEBoiler(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures); + } + + public MTEBoiler(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + ITexture[] tmp; + if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { // Horizontal + if (sideDirection != facingDirection) tmp = mTextures[2][colorIndex + 1]; + else tmp = mTextures[(byte) (active ? 4 : 3)][colorIndex + 1]; + } else { + tmp = mTextures[sideDirection.ordinal()][colorIndex + 1]; + } + if (sideDirection != facingDirection && tmp.length == 2) { + tmp = new ITexture[] { tmp[0] }; + } + return tmp; + } + + @Override + public boolean isElectric() { + return false; + } + + @Override + public boolean isFacingValid(ForgeDirection facingDirection) { + return (facingDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public int getProgresstime() { + return this.mTemperature; + } + + @Override + public int maxProgresstime() { + return 500; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + if (aPlayer != null) { + if (GTUtility.areStacksEqual(aPlayer.getCurrentEquippedItem(), new ItemStack(Items.water_bucket, 1))) { + fill(Materials.Water.getFluid(1000L * (long) aPlayer.getCurrentEquippedItem().stackSize), true); + + if (!aPlayer.capabilities.isCreativeMode) { + aPlayer.getCurrentEquippedItem() + .func_150996_a(Items.bucket); + } + } else { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + } + } + return true; + } + + @Override + public boolean doesFillContainers() { + return true; + } + + @Override + public boolean doesEmptyContainers() { + return true; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return false; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return GTModHandler.isWater(aFluid); + } + + @Override + public FluidStack getDrainableStack() { + return this.mSteam; + } + + @Override + public FluidStack setDrainableStack(FluidStack aFluid) { + this.mSteam = aFluid; + return this.mSteam; + } + + @Override + public boolean isDrainableStackSeparate() { + return true; + } + + @Override + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCover) { + return GregTechAPI.getCoverBehaviorNew(aCover.toStack()) + .isSimpleCover(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("mLossTimer", this.mLossTimer); + aNBT.setInteger("mTemperature", this.mTemperature); + aNBT.setInteger("mProcessingEnergy", this.mProcessingEnergy); + aNBT.setInteger("mExcessWater", this.mExcessWater); + if (this.mSteam == null) { + return; + } + try { + aNBT.setTag("mSteam", this.mSteam.writeToNBT(new NBTTagCompound())); + } catch (Throwable ignored) {} + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.mLossTimer = aNBT.getInteger("mLossTimer"); + this.mTemperature = aNBT.getInteger("mTemperature"); + this.mProcessingEnergy = aNBT.getInteger("mProcessingEnergy"); + this.mExcessWater = aNBT.getInteger("mExcessWater"); + this.mSteam = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mSteam")); + } + + /** + * Produce some steam. Assume water is present. + */ + protected void produceSteam(int aAmount) { + mExcessWater -= aAmount; + if (mExcessWater < 0) { + int tWaterToConsume = -mExcessWater / GTValues.STEAM_PER_WATER; + mFluid.amount -= tWaterToConsume; + mExcessWater += GTValues.STEAM_PER_WATER * tWaterToConsume; + } + if (GTModHandler.isSteam(this.mSteam)) { + this.mSteam.amount += aAmount; + } else { + this.mSteam = GTModHandler.getSteam(aAmount); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + pollute(aTick); + + if (isNotAllowedToWork(aBaseMetaTileEntity, aTick)) return; + + calculateCooldown(); + pushSteamToInventories(aBaseMetaTileEntity); + + if (canNotCreateSteam(aBaseMetaTileEntity, aTick)) { + pollute(aTick); + return; + } + + ventSteamIfTankIsFull(); + updateFuelTimed(aBaseMetaTileEntity, aTick); + calculateHeatUp(aBaseMetaTileEntity, aTick); + } + + private boolean isNotAllowedToWork(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + return (!aBaseMetaTileEntity.isServerSide()) || (aTick <= 20L); + } + + private void pollute(long aTick) { + if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) { + Pollution.addPollution(getBaseMetaTileEntity(), getPollution()); + } + } + + private void calculateHeatUp(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if ((this.mTemperature < getMaxTemperature()) && (this.mProcessingEnergy > 0) + && (aTick % getHeatUpRate() == 0L)) { + this.mProcessingEnergy -= getEnergyConsumption(); + this.mTemperature += getHeatUpAmount(); + } + aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0); + } + + private void updateFuelTimed(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork())) + updateFuel(aBaseMetaTileEntity, aTick); + } + + protected void ventSteamIfTankIsFull() { + if ((this.mSteam != null) && (this.mSteam.amount > getSteamCapacity())) { + sendSound(SOUND_EVENT_LET_OFF_EXCESS_STEAM); + this.mSteam.amount = getSteamCapacity() * 3 / 4; + } + } + + private boolean canNotCreateSteam(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aTick % 10L != 0L) { + return false; + } + + if (this.mTemperature > 100) { + if ((!GTModHandler.isWater(this.mFluid)) || (this.mFluid.amount <= 0)) { + this.mHadNoWater = true; + } else { + if (this.mHadNoWater) { + GTLog.exp.println("Boiler " + this.mName + " had no Water!"); + onDangerousWaterLack(aBaseMetaTileEntity, aTick); + return true; + } + produceSteam(getProductionPerSecond() / 2); + } + } else { + this.mHadNoWater = false; + } + return false; + } + + protected void onDangerousWaterLack(IGregTechTileEntity tile, long ignoredTicks) { + tile.doExplosion(2048L); + } + + /** + * Pushes Steam to a Side of this Boiler + * + * @param aBaseMetaTileEntity The tile-entity instance of this Boiler + * @param side The direction of the side to push Steam to + */ + protected final void pushSteamToSide(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side) { + if (mSteam == null || mSteam.amount == 0) return; + final IFluidHandler tTileEntity = aBaseMetaTileEntity.getITankContainerAtSide(side); + if (tTileEntity == null) return; + GTUtility.moveFluid(aBaseMetaTileEntity, tTileEntity, side, Math.max(1, this.mSteam.amount / 2), null); + } + + /** + * Pushes steam to Fluid inventories at all sides except Front and Bottom. + * + * @param aBaseMetaTileEntity The tile-entity instance of this Boiler + */ + protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) { + if (mSteam == null || mSteam.amount == 0) return; + for (final ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { + if (direction == aBaseMetaTileEntity.getFrontFacing() || direction == ForgeDirection.DOWN) continue; + if (this.mSteam == null) break; + pushSteamToSide(aBaseMetaTileEntity, direction); + } + } + + private void calculateCooldown() { + if (this.mTemperature <= 20) { + this.mTemperature = 20; + this.mLossTimer = 0; + } else if (++this.mLossTimer > getCooldownInterval()) { + // only loss temperature if hot + this.mTemperature -= 1; + this.mLossTimer = 0; + } + } + + protected boolean isAutomatable() { + return GTMod.gregtechproxy.mAllowSmallBoilerAutomation; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return isAutomatable() && aIndex == 1 || aIndex == 3; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return isAutomatable() && (aIndex == 0 && isItemValidFluidFilledItem(aStack)) + || (aIndex == 2 && isItemValidFuel(aStack)); + } + + @Override + public void doSound(byte aIndex, double aX, double aY, double aZ) { + if (aIndex == MTEBoiler.SOUND_EVENT_LET_OFF_EXCESS_STEAM) { + GTUtility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 2, 1.0F, aX, aY, aZ); + + new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) + .setWorld(getBaseMetaTileEntity().getWorld()) + .setMotion(0D, 0D, 0D) + .times( + 8, + x -> x.setPosition(aX - 0.5D + XSTR_INSTANCE.nextFloat(), aY, aZ - 0.5D + XSTR_INSTANCE.nextFloat()) + .run()); + } + } + + @Override + public int getTankPressure() { + return 100; + } + + protected abstract int getPollution(); + + @Override + public int getCapacity() { + return 16000; + } + + protected int getSteamCapacity() { + return getCapacity(); + } + + protected abstract int getProductionPerSecond(); + + protected abstract int getMaxTemperature(); + + protected abstract int getEnergyConsumption(); + + protected abstract int getCooldownInterval(); + + protected int getHeatUpRate() { + return 12; + } + + protected int getHeatUpAmount() { + return 1; + } + + protected abstract void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick); + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.BRONZE; + } + + protected IDrawable[] getFuelSlotBackground() { + return new IDrawable[] { getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_COAL_STEAM.get(getSteamVariant()) }; + } + + protected IDrawable[] getAshSlotBackground() { + return new IDrawable[] { getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant()) }; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new SlotWidget(inventoryHandler, 0).setFilter(this::isItemValidFluidFilledItem) + .setPos(43, 25) + .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotIn())) + .widget( + new SlotWidget(inventoryHandler, 1).setAccess(true, false) + .setPos(43, 61) + .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotOut())) + .widget(createFuelSlot()) + .widget(createAshSlot()) + .widget( + new ProgressBar().setProgress(() -> mSteam == null ? 0 : (float) mSteam.amount / getSteamCapacity()) + .setTexture(getProgressbarEmpty(), GTUITextures.PROGRESSBAR_BOILER_STEAM, 10) + .setDirection(ProgressBar.Direction.UP) + .setPos(70, 25) + .setSize(10, 54)) + .widget( + new ProgressBar().setProgress(() -> mFluid == null ? 0 : (float) mFluid.amount / getCapacity()) + .setTexture(getProgressbarEmpty(), GTUITextures.PROGRESSBAR_BOILER_WATER, 10) + .setDirection(ProgressBar.Direction.UP) + .setPos(83, 25) + .setSize(10, 54)) + .widget( + new ProgressBar().setProgress(() -> (float) mTemperature / maxProgresstime()) + .setTexture(getProgressbarEmpty(), GTUITextures.PROGRESSBAR_BOILER_HEAT, 10) + .setDirection(ProgressBar.Direction.UP) + .setPos(96, 25) + .setSize(10, 54)) + .widget( + new ProgressBar() + // cap minimum so that one can easily see there's fuel remaining + .setProgress(() -> mProcessingEnergy > 0 ? Math.max((float) mProcessingEnergy / 1000, 1f / 5) : 0) + .setTexture(getProgressbarFuel(), 14) + .setDirection(ProgressBar.Direction.UP) + .setPos(116, 45) + .setSize(14, 14)) + .widget( + new DrawableWidget().setDrawable(getOverlaySlotCanister()) + .setPos(43, 43) + .setSize(18, 18)); + } + + private boolean isItemValidFluidFilledItem(@NotNull ItemStack stack) { + return isFluidInputAllowed(GTUtility.getFluidForFilledItem(stack, true)); + } + + protected Widget createFuelSlot() { + return new SlotWidget(inventoryHandler, 2).setFilter(this::isItemValidFuel) + .setPos(115, 61) + .setBackground(getFuelSlotBackground()); + } + + protected boolean isItemValidFuel(@NotNull ItemStack stack) { + return true; + } + + protected SlotWidget createAshSlot() { + return (SlotWidget) new SlotWidget(inventoryHandler, 3).setAccess(true, false) + .setPos(115, 25) + .setBackground(getAshSlotBackground()); + } + + @Override + public GUITextureSet getGUITextureSet() { + return GUITextureSet.STEAM.apply(getSteamVariant()); + } + + @Override + public int getTitleColor() { + return getSteamVariant() == SteamVariant.BRONZE ? COLOR_TITLE.get() : COLOR_TITLE_WHITE.get(); + } + + // for GT++ + + protected IDrawable getOverlaySlotIn() { + return GTUITextures.OVERLAY_SLOT_IN_STEAM.get(getSteamVariant()); + } + + protected IDrawable getOverlaySlotOut() { + return GTUITextures.OVERLAY_SLOT_OUT_STEAM.get(getSteamVariant()); + } + + protected IDrawable getOverlaySlotCanister() { + return GTUITextures.OVERLAY_SLOT_CANISTER_STEAM.get(getSteamVariant()); + } + + protected UITexture getProgressbarEmpty() { + return GTUITextures.PROGRESSBAR_BOILER_EMPTY_STEAM.get(getSteamVariant()); + } + + protected UITexture getProgressbarFuel() { + return GTUITextures.PROGRESSBAR_FUEL_STEAM.get(getSteamVariant()); + } +} diff --git a/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerBronze.java b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerBronze.java new file mode 100644 index 0000000000..e951656d23 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerBronze.java @@ -0,0 +1,259 @@ +package gregtech.common.tileentities.boilers; + +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import java.util.Optional; +import java.util.stream.Stream; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; + +import org.jetbrains.annotations.NotNull; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.ParticleFX; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.objects.XSTR; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; +import gregtech.common.Pollution; + +public class MTEBoilerBronze extends MTEBoiler { + + public MTEBoilerBronze(int aID, String aName, String aNameRegional) { + super( + aID, + aName, + aNameRegional, + new String[] { "An early way to get Steam Power", "Produces 120L of Steam per second", + "Causes " + GTMod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond + " Pollution per second" }); + } + + public MTEBoilerBronze(int aID, String aName, String aNameRegional, String[] aDescription) { + super(aID, aName, aNameRegional, aDescription); + } + + public MTEBoilerBronze(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBoilerBronze(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[5][17][]; + final ITexture[] texBottom = { TextureFactory.of(MACHINE_BRONZEBRICKS_BOTTOM) }, + texTop = { TextureFactory.of(MACHINE_BRONZEBRICKS_TOP), TextureFactory.of(OVERLAY_PIPE) }, + texSide = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(OVERLAY_PIPE) }, + texFront = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(BOILER_FRONT), + TextureFactory.builder() + .addIcon(BOILER_FRONT_GLOW) + .glow() + .build() }, + texFrontActive = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(BOILER_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(BOILER_FRONT_ACTIVE_GLOW) + .glow() + .build() }; + for (int i = 0; i < 17; i++) { + rTextures[0][i] = texBottom; + rTextures[1][i] = texTop; + rTextures[2][i] = texSide; + rTextures[3][i] = texFront; + rTextures[4][i] = texFrontActive; + } + return rTextures; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBoilerBronze(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + /** + * Draws random flames and smoke particles in front of active boiler + * + * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isActive()) { + + final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing(); + + if ((frontFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 + && aBaseMetaTileEntity.getCoverIDAtSide(frontFacing) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(frontFacing)) { + + final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 8D / 16D; + final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1); + final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 8D / 16D; + final double offset = -0.48D; + final double horizontal = XSTR_INSTANCE.nextFloat() * 10D / 16D - 5D / 16D; + + final double x, y, z; + + y = oY + XSTR_INSTANCE.nextFloat() * 6D / 16D; + + if (frontFacing == ForgeDirection.WEST) { + x = oX - offset; + z = oZ + horizontal; + } else if (frontFacing == ForgeDirection.EAST) { + x = oX + offset; + z = oZ + horizontal; + } else if (frontFacing == ForgeDirection.NORTH) { + x = oX + horizontal; + z = oZ - offset; + } else // if (frontFacing == ForgeDirection.SOUTH) + { + x = oX + horizontal; + z = oZ + offset; + } + + ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D) + .setPosition(x, y, z) + .setWorld(getBaseMetaTileEntity().getWorld()); + particleEventBuilder.setIdentifier(ParticleFX.SMOKE) + .run(); + particleEventBuilder.setIdentifier(ParticleFX.FLAME) + .run(); + } + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if ((aBaseMetaTileEntity.isServerSide()) && (aTick > 20L) + && this.mProcessingEnergy > 0 + && (aTick % 20L == 0L)) { + Pollution.addPollution(getBaseMetaTileEntity(), getPollution()); + } + } + + @Override + protected int getPollution() { + return GTMod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond; + } + + @Override + protected int getProductionPerSecond() { + return 120; + } + + @Override + protected int getMaxTemperature() { + return 500; + } + + @Override + protected int getEnergyConsumption() { + return 1; + } + + @Override + protected int getCooldownInterval() { + return 45; + } + + @Override + protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + ItemStack fuel = mInventory[2]; + int burnTime = TileEntityFurnace.getItemBurnTime(fuel); + getCombustionPotential(fuel, burnTime).ifPresent(ashMaterial -> { + aBaseMetaTileEntity.decrStackSize(2, 1); + this.mProcessingEnergy += burnTime / 10; + boolean isABlock = !Block.getBlockFromItem(fuel.getItem()) + .equals(Blocks.air); + combustFuel(burnTime, isABlock).map(dustSize -> GTOreDictUnificator.get(dustSize, ashMaterial, 1L)) + .ifPresent(ashes -> aBaseMetaTileEntity.addStackToSlot(3, ashes)); + }); + } + + private static Optional getCombustionPotential(ItemStack fuel, int burnTime) { + if (burnTime / 10 <= 0 || FluidContainerRegistry.isFilledContainer(fuel)) { + return Optional.empty(); + } + String lowerCaseBlockName = Block.getBlockFromItem(fuel.getItem()) + .getUnlocalizedName() + .toLowerCase(); + if (couldProduceDarkAshes(fuel, lowerCaseBlockName)) { + return Optional.of(Materials.DarkAsh); + } + if (couldProduceRegularAshes(fuel, lowerCaseBlockName, burnTime)) { + return Optional.of(Materials.Ash); + } + return Optional.empty(); + } + + private static boolean couldProduceDarkAshes(ItemStack fuel, String lowerCaseBlockName) { + return GTUtility.isPartOfMaterials(fuel, Materials.Coal) || GTUtility.isPartOfMaterials(fuel, Materials.Lignite) + || lowerCaseBlockName.matches("tile\\..+compressedcoal"); + } + + private static boolean couldProduceRegularAshes(ItemStack fuel, String lowerCaseBlockName, int burnTime) { + return GTUtility.isPartOfMaterials(fuel, Materials.Charcoal) + || GTUtility.isPartOfMaterials(fuel, Materials.Diamond) + || (Stream.of("^tile\\..+charcoal", "^tile\\..+coke", "^tile\\..+railcraft.cube") + .anyMatch(lowerCaseBlockName::matches)) + || Stream.of("fuelCoke", "fuelCactusCharcoal", "fuelCactusCoke", "fuelSugarCharcoal", "fuelSugarCoke") + .anyMatch(name -> GTOreDictUnificator.isItemStackInstanceOf(fuel, name)) + || burnTime >= 2000; + } + + private static Optional combustFuel(int burnTime, boolean isABlock) { + if (isABlock) { + return Optional.of(OrePrefixes.dust); + } else if (XSTR.XSTR_INSTANCE.nextInt(getAshChanceBound(burnTime)) == 0) { + if (burnTime > 100000) { + return Optional.of(OrePrefixes.dust); + } else if (burnTime > 10000) { + return Optional.of(OrePrefixes.dustSmall); + } else { + return Optional.of(OrePrefixes.dustTiny); + } + } + return Optional.empty(); + } + + /** + * The upper bound for the chance to get ash from combustion + *
+ * Ash chance scales based on burn time from 14% at 0 up to 50% at 2000 + * + * @param burnTime number assumed to be positive + * @return an upper bound between 7 and 2. + */ + private static int getAshChanceBound(int burnTime) { + return (5 - (Math.min(burnTime, 2000) / 400)) + 2; + } + + @Override + protected boolean isItemValidFuel(@NotNull ItemStack stack) { + return getCombustionPotential(stack, TileEntityFurnace.getItemBurnTime(stack)).isPresent(); + } + +} diff --git a/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerLava.java b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerLava.java new file mode 100644 index 0000000000..ad79f07b0f --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerLava.java @@ -0,0 +1,474 @@ +package gregtech.common.tileentities.boilers; + +import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN; +import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DRAIN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.IFluidTank; + +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.SteamVariant; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; + +public class MTEBoilerLava extends MTEBoiler { + + public static final int COOLDOWN_INTERVAL = 20; + public static final int ENERGY_PER_LAVA = 1; + public static final int CONSUMPTION_PER_HEATUP = 3; + public static final int PRODUCTION_PER_SECOND = 600; + private final FluidTank lavaTank = new LavaTank(null, getCapacity()); + private int mCooledLava = 0; + + public MTEBoilerLava(int aID, String aName, String aNameRegional) { + super( + aID, + aName, + aNameRegional, + new String[] { "A Boiler running off Lava", "Produces " + PRODUCTION_PER_SECOND + "L of Steam per second", + "Causes " + GTMod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond + " Pollution per second", + "Consumes " + ((double) CONSUMPTION_PER_HEATUP / ENERGY_PER_LAVA) + + "L of Lava every " + + COOLDOWN_INTERVAL + + " ticks when fully heat up" }); + } + + public MTEBoilerLava(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBoilerLava(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + final ForgeDirection rearDirection = facingDirection.getOpposite(); + final ITexture[] tmp; + if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { + if (sideDirection == facingDirection) { + if (active) tmp = mTextures[4][colorIndex + 1]; + else tmp = mTextures[3][colorIndex + 1]; + } else if (sideDirection == rearDirection) { + tmp = mTextures[5][colorIndex + 1]; + } else { + tmp = mTextures[2][colorIndex + 1]; + } + } else tmp = mTextures[sideDirection.ordinal()][colorIndex + 1]; + if (sideDirection != facingDirection && tmp.length == 2) { + return new ITexture[] { tmp[0] }; + } + return tmp; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[6][17][]; + for (byte color = -1; color < 16; color++) { + int i = color + 1; + short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa); + rTextures[0][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_BOTTOM, colorModulation) }; + rTextures[1][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_TOP, colorModulation), + TextureFactory.of(OVERLAY_DRAIN), TextureFactory.of(FLUID_IN_SIGN) }; + rTextures[2][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), + TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_IN_SIGN) }; + rTextures[3][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), + TextureFactory.of(BOILER_LAVA_FRONT, colorModulation), TextureFactory.of(BOILER_LAVA_FRONT_GLOW) }; + rTextures[4][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), + TextureFactory.of(BOILER_LAVA_FRONT_ACTIVE), TextureFactory.builder() + .addIcon(BOILER_LAVA_FRONT_ACTIVE_GLOW) + .glow() + .build() }; + rTextures[5][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation), + TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) }; + } + return rTextures; + } + + @Override + public int maxProgresstime() { + return 1000; + } + + @Override + public int getCapacity() { + return 32000; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBoilerLava(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + protected int getPollution() { + return GTMod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond; + } + + @Override + protected int getProductionPerSecond() { + return PRODUCTION_PER_SECOND; + } + + @Override + protected int getMaxTemperature() { + return 1000; + } + + @Override + protected int getEnergyConsumption() { + this.mCooledLava += CONSUMPTION_PER_HEATUP; + return CONSUMPTION_PER_HEATUP; + } + + @Override + protected int getCooldownInterval() { + return COOLDOWN_INTERVAL; + } + + /** + * Attempts to fill an {@link IFluidTank} from the {@link FluidStack} content of an {@link ItemStack} + * + * @param destinationIFluidTank The destination {@link IFluidTank} to fill + * @param SourceItemStack The source {@link ItemStack} containing the Fluid + * @return The {@link ItemStack} of the Empty version of the source {@link ItemStack} or {@code null} if none + */ + public static ItemStack fillIFluidTankFromItemStack(IFluidTank destinationIFluidTank, ItemStack SourceItemStack) { + if (destinationIFluidTank == null || SourceItemStack == null) return null; + + final FluidStack containedFluidStack = GTUtility.getFluidForFilledItem(SourceItemStack, true); + if (containedFluidStack == null || containedFluidStack.amount == 0) return null; + + final int fillableAmount = destinationIFluidTank.fill(containedFluidStack, false); + if (fillableAmount <= 0) return null; + + final Item containerItem = SourceItemStack.getItem(); + if (containerItem instanceof IFluidContainerItem equippedIFluidContainerItem) { + destinationIFluidTank.fill(equippedIFluidContainerItem.drain(SourceItemStack, fillableAmount, true), true); + return null; + } else { + final ItemStack emptyContainerItemStack = GTUtility.getContainerForFilledItem(SourceItemStack, false); + destinationIFluidTank.fill(containedFluidStack, true); + return emptyContainerItemStack; + } + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide() || aPlayer == null) return true; + + final ItemStack equippedItemStack = aPlayer.getCurrentEquippedItem(); + final FluidStack equippedContainerFluidStack = GTUtility.getFluidForFilledItem(equippedItemStack, true); + final ItemStack returnedItemStack; + final IFluidTank tank; + + if (GTModHandler.isWater(equippedContainerFluidStack)) { + tank = this; + } else if (GTModHandler.isLava(equippedContainerFluidStack)) { + tank = lavaTank; + } else { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + returnedItemStack = fillIFluidTankFromItemStack(tank, equippedItemStack); + if (returnedItemStack != null && !aPlayer.capabilities.isCreativeMode) { + if (equippedItemStack.stackSize > 1) { + if (!aPlayer.inventory.addItemStackToInventory(returnedItemStack)) { + aBaseMetaTileEntity.getWorld() + .spawnEntityInWorld( + new EntityItem( + aBaseMetaTileEntity.getWorld(), + (double) aBaseMetaTileEntity.getXCoord() + 0.5D, + (double) aBaseMetaTileEntity.getYCoord() + 1.5D, + (double) aBaseMetaTileEntity.getZCoord() + 0.5D, + equippedItemStack)); + } else if (aPlayer instanceof EntityPlayerMP) { + ((EntityPlayerMP) aPlayer).sendContainerToPlayer(aPlayer.inventoryContainer); + } + aPlayer.inventory.decrStackSize(aPlayer.inventory.currentItem, 1); + } else { + aPlayer.inventory.setInventorySlotContents(aPlayer.inventory.currentItem, returnedItemStack); + } + } + return true; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (lavaTank.getFluid() != null) aNBT.setTag( + "mLava", + lavaTank.getFluid() + .writeToNBT(new NBTTagCompound())); + aNBT.setInteger("mCooledLava", this.mCooledLava); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + lavaTank.setFluid(FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mLava"))); + this.mCooledLava = aNBT.getInteger("mCooledLava"); + } + + /** + * Pushes steam to Fluid inventory at the rear. + * + * @param aBaseMetaTileEntity The tile-entity instance of this Lava Boiler + */ + @Override + protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) { + if (mSteam == null || mSteam.amount == 0) return; + pushSteamToSide( + aBaseMetaTileEntity, + aBaseMetaTileEntity.getFrontFacing() + .getOpposite()); + } + + /** + * Drains Lava from Fluid inventory on top + * + * @param aBaseMetaTileEntity The tile-entity instance of this Lava Boiler + */ + protected void drainLava(IGregTechTileEntity aBaseMetaTileEntity) { + final IFluidHandler upTank = aBaseMetaTileEntity.getITankContainerAtSide(ForgeDirection.UP); + if (upTank == null) return; + // Simulates drain of maximum lava amount up to 1000L that can fit the internal tank + final FluidStack drainableLavaStack = upTank.drain( + ForgeDirection.DOWN, + FluidRegistry.getFluidStack( + "lava", + Math.min( + this.lavaTank.getCapacity() + - (this.lavaTank.getFluid() != null ? this.lavaTank.getFluid().amount : 0), + 1000)), + false); + if (!GTModHandler.isLava(drainableLavaStack) || drainableLavaStack.amount <= 0) return; + // Performs actual drain up and fill internal tank + this.lavaTank.fill(upTank.drain(ForgeDirection.DOWN, drainableLavaStack, true), true); + } + + /** + * Processes cooled Lava into Obsidian + * + * @return success | failure when cannot output + */ + private boolean lavaToObsidian() { + if (this.mCooledLava >= 1000) { + if (getBaseMetaTileEntity().addStackToSlot(3, new ItemStack(Blocks.obsidian, 1))) { + this.mCooledLava -= 1000; + } else { + return false; + } + } + return true; + } + + /** + * Draws random flames and smoke particles in front of this Lava Boiler when it is active + * + * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isActive()) { + + final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing(); + + if ((frontFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 + && aBaseMetaTileEntity.getCoverIDAtSide(frontFacing) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(frontFacing)) { + + final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 8D / 16D; + final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1); + final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 8D / 16D; + final double offset = -0.48D; + final double horizontal = XSTR_INSTANCE.nextFloat() * 10D / 16D - 5D / 16D; + + final double x, y, z; + + y = oY + XSTR_INSTANCE.nextFloat() * 6D / 16D; + + switch (frontFacing) { + case WEST -> { + x = oX - offset; + z = oZ + horizontal; + } + case EAST -> { + x = oX + offset; + z = oZ + horizontal; + } + case NORTH -> { + x = oX + horizontal; + z = oZ - offset; + } + default -> { // case SOUTH: + x = oX + horizontal; + z = oZ + offset; + } + } + + ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D) + .setPosition(x, y, z) + .setWorld(getBaseMetaTileEntity().getWorld()); + particleEventBuilder.setIdentifier(ParticleFX.SMOKE) + .run(); + particleEventBuilder.setIdentifier(ParticleFX.FLAME) + .run(); + } + } + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return GTModHandler.isWater(aFluid) || GTModHandler.isLava(aFluid); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (!aBaseMetaTileEntity.isServerSide()) return; + final FluidStack containedFluidStack = GTUtility.getFluidForFilledItem(mInventory[getInputSlot()], true); + if (GTModHandler.isWater(containedFluidStack)) super.onPreTick(aBaseMetaTileEntity, aTick); + if (GTModHandler.isLava(containedFluidStack) + && lavaTank.fill(containedFluidStack, false) == containedFluidStack.amount + && aBaseMetaTileEntity.addStackToSlot( + getOutputSlot(), + GTUtility.getContainerForFilledItem(mInventory[getInputSlot()], true), + 1)) { + lavaTank.fill(containedFluidStack, true); + aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aTick % 20 == 0) drainLava(aBaseMetaTileEntity); + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + protected boolean isAutomatable() { + return true; + } + + @Override + public void doSound(byte aIndex, double aX, double aY, double aZ) { + if (aIndex != MTEBoiler.SOUND_EVENT_LET_OFF_EXCESS_STEAM) return; + + final ForgeDirection rearDirection = getBaseMetaTileEntity().getFrontFacing() + .getOpposite(); + GTUtility.doSoundAtClient( + SoundResource.RANDOM_FIZZ, + 2, + 1.0F, + // Sound emitted from center of rear face (Steam Output) + aX + 0.5 * rearDirection.offsetX, + aY, + aZ + 0.5 * rearDirection.offsetZ); + + new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD) + .setWorld(getBaseMetaTileEntity().getWorld()) + // Particles emitted with a 1 block/s velocity toward rear + .setMotion(rearDirection.offsetX / 20D, 0D, rearDirection.offsetZ / 20D) + .times( + 8, + // Particles emitted from center of rear face (Steam Output) + x -> x.setPosition(aX + rearDirection.offsetX / 2D, aY, aZ + rearDirection.offsetZ / 2D) + .run()); + } + + @Override + protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (!lavaToObsidian()) return; + if (lavaTank.getFluid() == null || lavaTank.getFluid().amount <= 0) return; + final int amountToDrain = Math.min(lavaTank.getFluid().amount, 1000); + final FluidStack drainedLava = lavaTank.drain(amountToDrain, false); + if (drainedLava == null || drainedLava.amount == 0) return; + lavaTank.drain(amountToDrain, true); + this.mProcessingEnergy += drainedLava.amount * ENERGY_PER_LAVA; + } + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.STEEL; + } + + @Override + public int fill(FluidStack aFluid, boolean doFill) { + if (GTModHandler.isWater(aFluid)) return super.fill(aFluid, doFill); + if (GTModHandler.isLava(aFluid)) return lavaTank.fill(aFluid, doFill); + return 0; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection side) { + return new FluidTankInfo[] { super.getTankInfo(side)[0], + new FluidTankInfo(this.lavaTank.getFluid(), this.lavaTank.getCapacity()), + new FluidTankInfo(getDrainableStack(), getSteamCapacity()) }; + } + + @Override + protected IDrawable[] getAshSlotBackground() { + return new IDrawable[] { getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_BLOCK_STEAM.get(getSteamVariant()) }; + } + + @Override + protected Widget createFuelSlot() { + return new FluidSlotWidget(lavaTank).setBackground(getGUITextureSet().getFluidSlot(), getOverlaySlotIn()) + .setPos(115, 61); + } + + static class LavaTank extends FluidTank { + + public LavaTank(FluidStack stack, int capacity) { + super(stack, capacity); + } + + @Override + public int fill(FluidStack resource, boolean doFill) { + return GTModHandler.isLava(resource) ? super.fill(resource, doFill) : 0; + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolar.java b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolar.java new file mode 100644 index 0000000000..0fc23f59cf --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolar.java @@ -0,0 +1,311 @@ +package gregtech.common.tileentities.boilers; + +import static mcp.mobius.waila.api.SpecialChars.GOLD; +import static mcp.mobius.waila.api.SpecialChars.RESET; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.SteamVariant; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.common.config.machinestats.ConfigBronzeSolarBoiler; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEBoilerSolar extends MTEBoiler { + + public static final String LPS_FMT = "%s L/s"; + private static final String localizedDescFormat = GTLanguageManager.addStringLocalization( + "gt.blockmachines.boiler.solar.desc.format", + "Steam Power by the Sun%n" + "Produces %sL of Steam per second%n" + + "Calcifies over time, reducing Steam output to %sL/s%n" + + "Break and replace to descale"); + protected int calcificationTicks = ConfigBronzeSolarBoiler.calcificationTicks; + protected int cooldownTicks = ConfigBronzeSolarBoiler.cooldownTicks; + protected int maxOutputPerSecond = ConfigBronzeSolarBoiler.maxOutputPerSecond; + protected int minOutputPerSecond = ConfigBronzeSolarBoiler.minOutputPerSecond; + + protected final int basicTemperatureMod = 5; // Base Celsius gain or loss + private int mRunTimeTicks = 0; + + public MTEBoilerSolar(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, new String[0]); + } + + public MTEBoilerSolar(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBoilerSolar(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public int getMaxOutputPerSecond() { + return maxOutputPerSecond; + } + + @Override + public String[] getDescription() { + return String + .format( + localizedDescFormat, + GTUtility.formatNumbers(getMaxOutputPerSecond()), + GTUtility.formatNumbers(getMinOutputPerSecond())) + .split("\\R"); + } + + public int getMinOutputPerSecond() { + return minOutputPerSecond; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[4][17][]; + for (int color = -1; color < 16; color++) { + int i = color + 1; + short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa); + rTextures[0][i] = new ITexture[] { + TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM, colorModulation) }; + rTextures[1][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_TOP, colorModulation), + TextureFactory.of(BlockIcons.BOILER_SOLAR) }; + rTextures[2][i] = new ITexture[] { + TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_SIDE, colorModulation) }; + rTextures[3][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_SIDE, colorModulation), + TextureFactory.of(BlockIcons.OVERLAY_PIPE) }; + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + final int i = colorIndex + 1; + if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { // Horizontal + if (sideDirection != facingDirection) return mTextures[2][i]; + return mTextures[3][i]; + } + return mTextures[sideDirection.ordinal()][i]; + } + + @Override + public int maxProgresstime() { + return 500; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("mRunTime", mRunTimeTicks); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mRunTimeTicks = aNBT.getInteger("mRunTime"); + } + + @Override + protected void produceSteam(int aAmount) { + super.produceSteam(aAmount); + // Disable calcification when using distilled water + if (mFluid.isFluidEqual(GTModHandler.getWater(1))) { + // produceSteam is getting called every 10 ticks + if (mRunTimeTicks >= 0 && mRunTimeTicks < (Integer.MAX_VALUE - 10)) mRunTimeTicks += 10; + else mRunTimeTicks = Integer.MAX_VALUE; // Prevent Integer overflow wrap + } + } + + @Override + protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) { + if (mSteam == null || mSteam.amount == 0) return; + pushSteamToSide(aBaseMetaTileEntity, aBaseMetaTileEntity.getFrontFacing()); + } + + @Override + protected int getPollution() { + return 0; + } + + @Override + public int getProductionPerSecond() { + if (mTemperature < 100) { + return 0; + } + if (mRunTimeTicks > getMaxRuntimeTicks()) { + return getMinOutputPerSecond(); + } else if (mRunTimeTicks > getCalcificationTicks()) { + /* + * When reaching calcification ticks; discount the proportion of run-time spent on calcification from the + * maximum output per second, and return this or the minimum output per second + */ + return getMaxOutputPerSecond() + - getMaxOutputPerSecond() * (mRunTimeTicks - getCalcificationTicks()) / getCalcificationTicks(); + } else { + return getMaxOutputPerSecond(); + } + } + + protected int getCalcificationTicks() { + return calcificationTicks; + } + + protected int getCooldownTicks() { + return cooldownTicks; + } + + protected int getMaxRuntimeTicks() { + // After which min output is reached. + return (getMaxOutputPerSecond() - getMinOutputPerSecond()) * getCalcificationTicks() / getMaxOutputPerSecond() + + getCalcificationTicks(); + } + + @Override + protected int getMaxTemperature() { + return 500; + } + + @Override + protected int getEnergyConsumption() { + return basicTemperatureMod; + } + + @Override + protected int getCooldownInterval() { + return getCooldownTicks() / basicTemperatureMod; + } + + @Override + protected int getHeatUpAmount() { + return basicTemperatureMod; + } + + @Override + protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + World world = aBaseMetaTileEntity.getWorld(); + // Heat-up every 12s (240 ticks), has to be multiple of 20 ticks + if ((aTick % 240L != 0L) || (world.isThundering())) { + return; + } + if (!aBaseMetaTileEntity.getSkyAtSide(ForgeDirection.UP)) { + return; + } + boolean weatherClear = !world.isRaining() || aBaseMetaTileEntity.getBiome().rainfall == 0.0F; + if (!weatherClear && world.skylightSubtracted >= 4) { + return; + } + if (weatherClear) { + if (world.isDaytime()) { + mProcessingEnergy += 8 * basicTemperatureMod; + } else { + mProcessingEnergy += basicTemperatureMod; + } + } else { + mProcessingEnergy += basicTemperatureMod; + } + } + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.BRONZE; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return String + .format( + "Heat Capacity: " + EnumChatFormatting.GREEN + + "%s %%" + + EnumChatFormatting.RESET + + " Hot time: " + + EnumChatFormatting.RED + + "%s s" + + EnumChatFormatting.RESET + + "%n" + + "Min output: " + + EnumChatFormatting.RED + + LPS_FMT + + EnumChatFormatting.RESET + + " Max output: " + + EnumChatFormatting.RED + + LPS_FMT + + EnumChatFormatting.RESET + + "%n" + + "Current Output: " + + EnumChatFormatting.YELLOW + + LPS_FMT + + EnumChatFormatting.RESET, + GTUtility.formatNumbers(getHeatCapacityPercent()), + GTUtility.formatNumbers(getHotTimeSeconds()), + GTUtility.formatNumbers(getMinOutputPerSecond()), + GTUtility.formatNumbers(getMaxOutputPerSecond()), + GTUtility.formatNumbers(getProductionPerSecond())) + .split("\\R"); + } + + public int getHeatCapacityPercent() { + return mTemperature * 100 / maxProgresstime(); + } + + public int getHotTimeSeconds() { + return mRunTimeTicks / 20; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBoilerSolar(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + protected Widget createFuelSlot() { + return null; + } + + @Override + protected SlotWidget createAshSlot() { + return null; + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + final NBTTagCompound tag = accessor.getNBTData(); + currentTip.add( + String.format( + (GOLD + "Solar Boiler Output: " + RESET + "%d/%d L/s"), + tag.getInteger("calcificationOutput"), + tag.getInteger("maxCalcificationOutput"))); + + super.getWailaBody(itemStack, currentTip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + tag.setInteger("calcificationOutput", (getProductionPerSecond())); + tag.setInteger("maxCalcificationOutput", (getMaxOutputPerSecond())); + } +} diff --git a/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolarSteel.java b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolarSteel.java new file mode 100644 index 0000000000..b46beca108 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSolarSteel.java @@ -0,0 +1,69 @@ +package gregtech.common.tileentities.boilers; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.SteamVariant; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.common.config.machinestats.ConfigSteelSolarBoiler; + +public class MTEBoilerSolarSteel extends MTEBoilerSolar { + + public MTEBoilerSolarSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + initBoilerStats(); + } + + public MTEBoilerSolarSteel(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + initBoilerStats(); + } + + public MTEBoilerSolarSteel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + initBoilerStats(); + } + + protected void initBoilerStats() { + calcificationTicks = ConfigSteelSolarBoiler.calcificationTicks; + cooldownTicks = ConfigSteelSolarBoiler.cooldownTicks; + maxOutputPerSecond = ConfigSteelSolarBoiler.maxOutputPerSecond; + minOutputPerSecond = ConfigSteelSolarBoiler.minOutputPerSecond; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + + ITexture[][][] rTextures = new ITexture[4][17][]; + for (int color = -1; color < 16; color++) { + int i = color + 1; + short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa); + rTextures[0][i] = new ITexture[] { + TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_BOTTOM, colorModulation) }; + rTextures[1][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_TOP, colorModulation), + TextureFactory.of(BlockIcons.BOILER_SOLAR) }; + rTextures[2][i] = new ITexture[] { + TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_SIDE, colorModulation) }; + rTextures[3][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_SIDE, colorModulation), + TextureFactory.of(BlockIcons.OVERLAY_PIPE) }; + } + return rTextures; + } + + @Override + public int getCapacity() { + return 32000; + } + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.STEEL; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBoilerSolarSteel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } +} diff --git a/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSteel.java b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSteel.java new file mode 100644 index 0000000000..a557a03d16 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/boilers/MTEBoilerSteel.java @@ -0,0 +1,108 @@ +package gregtech.common.tileentities.boilers; + +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE; + +import gregtech.GTMod; +import gregtech.api.enums.SteamVariant; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; + +public class MTEBoilerSteel extends MTEBoilerBronze { + + public MTEBoilerSteel(int aID, String aName, String aNameRegional) { + super( + aID, + aName, + aNameRegional, + new String[] { "Faster than the Bronze Boiler", "Produces 300L of Steam per second", + "Causes " + GTMod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond + " Pollution per second" }); + } + + public MTEBoilerSteel(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBoilerSteel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[5][17][]; + final ITexture[] texBottom = { TextureFactory.of(MACHINE_STEELBRICKS_BOTTOM) }, + texTop = { TextureFactory.of(MACHINE_STEELBRICKS_TOP), TextureFactory.of(OVERLAY_PIPE) }, + texSide = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(OVERLAY_PIPE) }, + texFront = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(BOILER_FRONT), + TextureFactory.builder() + .addIcon(BOILER_FRONT_GLOW) + .glow() + .build() }, + texFrontActive = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(BOILER_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(BOILER_FRONT_ACTIVE_GLOW) + .glow() + .build() }; + for (int i = 0; i < 17; i++) { + rTextures[0][i] = texBottom; + rTextures[1][i] = texTop; + rTextures[2][i] = texSide; + rTextures[3][i] = texFront; + rTextures[4][i] = texFrontActive; + } + return rTextures; + } + + @Override + public int maxProgresstime() { + return 1000; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBoilerSteel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + protected int getPollution() { + return GTMod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond; + } + + @Override + public int getCapacity() { + return 32000; + } + + @Override + protected int getProductionPerSecond() { + return 300; + } + + @Override + protected int getMaxTemperature() { + return 1000; + } + + @Override + protected int getEnergyConsumption() { + return 2; + } + + @Override + protected int getCooldownInterval() { + return 40; + } + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.STEEL; + } +} diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java index b0f6afdc3a..9d05d1cd6f 100644 --- a/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java +++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java @@ -5,10 +5,10 @@ import java.util.List; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.multitileentity.interfaces.IMultiBlockController; import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class Ampere extends UpgradeCasing { @@ -22,7 +22,7 @@ public class Ampere extends UpgradeCasing { @Override public void readMultiTileNBT(NBTTagCompound aNBT) { super.readMultiTileNBT(aNBT); - amperage = aNBT.getInteger(GT_Values.NBT.UPGRADE_AMPERAGE); + amperage = aNBT.getInteger(GTValues.NBT.UPGRADE_AMPERAGE); } @Override @@ -42,6 +42,6 @@ public class Ampere extends UpgradeCasing { @Override public void addToolTips(List list, ItemStack stack, boolean f3_h) { super.addToolTips(list, stack, f3_h); - list.add("Increases allowed amperage to " + GT_Utility.formatNumbers(amperage)); + list.add("Increases allowed amperage to " + GTUtility.formatNumbers(amperage)); } } diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java index 7e51b3441d..43cc20f983 100644 --- a/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java +++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java @@ -11,7 +11,7 @@ import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; -import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.enums.GTValues.NBT; import gregtech.api.enums.InventoryType; import gregtech.api.multitileentity.interfaces.IMultiBlockController; import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java index ebc84be38a..a7ace14de5 100644 --- a/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java +++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java @@ -6,10 +6,10 @@ import java.util.UUID; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; import gregtech.api.multitileentity.interfaces.IMultiBlockController; import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; public class Tank extends UpgradeCasing { @@ -47,8 +47,8 @@ public class Tank extends UpgradeCasing { @Override public void readMultiTileNBT(NBTTagCompound aNBT) { super.readMultiTileNBT(aNBT); - tankCount = aNBT.getInteger(GT_Values.NBT.UPGRADE_TANK_COUNT); - tankCapacity = aNBT.getInteger(GT_Values.NBT.UPGRADE_TANK_CAPACITY); + tankCount = aNBT.getInteger(GTValues.NBT.UPGRADE_TANK_COUNT); + tankCapacity = aNBT.getInteger(GTValues.NBT.UPGRADE_TANK_CAPACITY); } @Override @@ -56,6 +56,6 @@ public class Tank extends UpgradeCasing { super.addToolTips(list, stack, f3_h); list.add("Adds another tank inventory"); list.add("Number of tanks: " + tankCount); - list.add("Tank capacity: " + GT_Utility.formatNumbers(tankCapacity) + " L"); + list.add("Tank capacity: " + GTUtility.formatNumbers(tankCapacity) + " L"); } } diff --git a/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java b/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java deleted file mode 100644 index e61ae456f0..0000000000 --- a/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java +++ /dev/null @@ -1,437 +0,0 @@ -package gregtech.common.tileentities.debug; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static net.minecraft.util.StatCollector.translateToLocal; - -import java.util.HashMap; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.ForgeDirection; - -import org.lwjgl.opengl.GL11; - -import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import com.gtnewhorizon.structurelib.structure.StructureUtility; -import com.gtnewhorizon.structurelib.util.Vec3Impl; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_AdvDebugStructureWriter extends GT_MetaTileEntity_TieredMachineBlock - implements IAddGregtechLogo, IAddUIWidgets { - - private static final HashMap bondingBoxes = new HashMap<>( - 1); - private final BoundHighlighter boundingBox = new BoundHighlighter(); - private final short[] numbers = new short[6]; - private boolean transpose = false; - private boolean showHighlightBox = true; - private String[] result = new String[] { "Undefined" }; - - public GT_MetaTileEntity_AdvDebugStructureWriter(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 0, ""); - } - - public GT_MetaTileEntity_AdvDebugStructureWriter(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_AdvDebugStructureWriter(mName, mTier, "", mTextures); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - return new ITexture[] { - Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], sideDirection != facingDirection - ? TextureFactory.of( - TextureFactory.builder() - .addIcon(Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE) - .glow() - .build()) - : TextureFactory.of( - TextureFactory.builder() - .addIcon(Textures.BlockIcons.STRUCTURE_MARK) - .glow() - .build()) }; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return null; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b, - ItemStack itemStack) { - return false; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b, - ItemStack itemStack) { - return false; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - for (int i = 0; i < numbers.length; i++) { - aNBT.setShort("eData" + i, numbers[i]); - } - aNBT.setBoolean("Transpose", transpose); - aNBT.setBoolean("HighlightBox", showHighlightBox); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - for (int i = 0; i < numbers.length; i++) { - numbers[i] = aNBT.getShort("eData" + i); - } - transpose = aNBT.getBoolean("Transpose"); - showHighlightBox = aNBT.getBoolean("HighlightBox"); - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - bondingBoxes.put(this, boundingBox); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - ExtendedFacing writerFacing = ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()); - double[] abc = new double[3]; - double[] xyz = new double[3]; - boundingBox.dim = aBaseMetaTileEntity.getWorld().provider.dimensionId; - boundingBox.showHighlightBox = showHighlightBox; - abc[0] = -numbers[0] - 0.5; - abc[1] = -numbers[1] - 0.5; - abc[2] = -numbers[2] - 0.5; - writerFacing.getWorldOffset(abc, xyz); - boundingBox.pos1 = new Vec3Impl( - aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5), - aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5), - aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5)); - abc[0] = -numbers[0] + numbers[3] - 0.5; - abc[1] = -numbers[1] + numbers[4] - 0.5; - abc[2] = -numbers[2] + numbers[5] - 0.5; - writerFacing.getWorldOffset(abc, xyz); - boundingBox.pos2 = new Vec3Impl( - aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5), - aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5), - aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5)); - } - } - - @Override - public void onRemoval() { - bondingBoxes.remove(this); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity(); - printStructure(aPlayer); - aBaseMetaTileEntity.disableWorking(); - } - - public void printStructure(EntityPlayer aPlayer) { - IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity(); - String pseudoJavaCode = StructureUtility.getPseudoJavaCode( - aBaseMetaTileEntity.getWorld(), - ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()), - aBaseMetaTileEntity.getXCoord(), - aBaseMetaTileEntity.getYCoord(), - aBaseMetaTileEntity.getZCoord(), - numbers[0], - numbers[1], - numbers[2], - te -> te.getClass() - .getCanonicalName(), - numbers[3], - numbers[4], - numbers[5], - transpose); - GT_FML_LOGGER.info(pseudoJavaCode); - result = pseudoJavaCode.split("\\n"); - aPlayer.addChatMessage( - new ChatComponentTranslation(translateToLocal("GT5U.machines.advdebugstructurewriter.printed"))); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isElectric() { - return false; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public String[] getDescription() { - return new String[] { translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip"), // Scans Blocks Around - translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.1"), // Prints Multiblock NonTE - // structure check code - translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.2") // ABC axes aligned to machine front - }; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - return result; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setSize(90, 112) - .setPos(43, 4)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (getBaseMetaTileEntity().isServerSide()) { - printStructure( - widget.getContext() - .getPlayer()); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_PRINT) - .setSize(18, 18) - .setPos(11, 128) - .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.print.tooltip"))) - .widget( - new CycleButtonWidget().setToggle(() -> transpose, aBoolean -> transpose = aBoolean) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_TRANSPOSE) - .setSize(18, 18) - .setPos(32, 128) - .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.transpose.tooltip"))) - .widget( - new CycleButtonWidget().setToggle(() -> showHighlightBox, aBoolean -> showHighlightBox = aBoolean) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BOUNDING_BOX) - .setSize(18, 18) - .setPos(53, 128) - .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.highlight.tooltip"))) - .widget( - new MultiChildWidget() - .addChild( - new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.origin")) - .setDefaultColor(0xf0f0ff) - .setPos(0, 0)) - .addChild( - TextWidget.dynamicString(() -> "A: " + numbers[0]) - .setDefaultColor(0xf0f0ff) - .setPos(0, 10)) - .addChild( - TextWidget.dynamicString(() -> "B: " + numbers[1]) - .setDefaultColor(0xf0f0ff) - .setPos(0, 18)) - .addChild( - TextWidget.dynamicString(() -> "C: " + numbers[2]) - .setDefaultColor(0xf0f0ff) - .setPos(0, 26)) - .addChild( - new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.size")) - .setDefaultColor(0xf0f0ff) - .setPos(0, 52)) - .addChild( - TextWidget.dynamicString(() -> "A: " + numbers[3]) - .setDefaultColor(0xf0f0ff) - .setPos(0, 62)) - .addChild( - TextWidget.dynamicString(() -> "B: " + numbers[4]) - .setDefaultColor(0xf0f0ff) - .setPos(0, 70)) - .addChild( - TextWidget.dynamicString(() -> "C: " + numbers[5]) - .setDefaultColor(0xf0f0ff) - .setPos(0, 78)) - .setPos(46, 8)); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151); - } - - private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift, - int addNumber, int xPos) { - int[] yPos = new int[] { 4, 22, 40, 62, 80, 98 }; - for (int i = 0; i < yPos.length; i++) { - final int index = i; // needed for lambda - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - numbers[index] += clickData.shift ? addNumberShift : addNumber; - if (index >= 3) { - numbers[index] = (short) Math.max(numbers[index], 0); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) - .setSize(18, 18) - .setPos(xPos, yPos[index])); - } - } - - @Override - public GUITextureSet getGUITextureSet() { - return new GUITextureSet().setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY); - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(113, 96)); - } - - @Override - public boolean doesBindPlayerInventory() { - return false; - } - - public static class ForgeEventHandler { - - public ForgeEventHandler() { - MinecraftForge.EVENT_BUS.register(this); - } - - @SuppressWarnings("unused") - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onRenderWorldLast(RenderWorldLastEvent e) { - for (BoundHighlighter boundingBox : bondingBoxes.values()) { - boundingBox.renderHighlightedBlock(e); - } - } - } - - private static class BoundHighlighter { - - public Vec3Impl pos1; - public Vec3Impl pos2; - public boolean showHighlightBox; - public int dim; - - @SideOnly(Side.CLIENT) - private void renderHighlightedBlock(RenderWorldLastEvent event) { - if (pos1 == null || pos2 == null || !showHighlightBox) { - return; - } - Minecraft mc = Minecraft.getMinecraft(); - int dimension = mc.theWorld.provider.dimensionId; - - if (dimension != dim) { - pos1 = null; - pos2 = null; - return; - } - - EntityPlayerSP p = mc.thePlayer; - double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * event.partialTicks; - double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * event.partialTicks; - double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * event.partialTicks; - - GL11.glPushMatrix(); - GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GL11.glLineWidth(3); - GL11.glTranslated(-doubleX, -doubleY, -doubleZ); - - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - GL11.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); - renderHighLightedArenaOutline(pos1.get0(), pos1.get1(), pos1.get2(), pos2.get0(), pos2.get1(), pos2.get2()); - - GL11.glPopAttrib(); - GL11.glPopMatrix(); - } - - @SideOnly(Side.CLIENT) - static void renderHighLightedArenaOutline(double x1, double y1, double z1, double x2, double y2, double z2) { - GL11.glBegin(GL11.GL_LINE_STRIP); - - GL11.glVertex3d(x1, y1, z1); - GL11.glVertex3d(x1, y2, z1); - GL11.glVertex3d(x1, y2, z2); - GL11.glVertex3d(x1, y1, z2); - GL11.glVertex3d(x1, y1, z1); - - GL11.glVertex3d(x2, y1, z1); - GL11.glVertex3d(x2, y2, z1); - GL11.glVertex3d(x2, y2, z2); - GL11.glVertex3d(x2, y1, z2); - GL11.glVertex3d(x2, y1, z1); - - GL11.glVertex3d(x1, y1, z1); - GL11.glVertex3d(x2, y1, z1); - GL11.glVertex3d(x2, y1, z2); - GL11.glVertex3d(x1, y1, z2); - GL11.glVertex3d(x1, y2, z2); - GL11.glVertex3d(x2, y2, z2); - GL11.glVertex3d(x2, y2, z1); - GL11.glVertex3d(x2, y1, z1); - GL11.glVertex3d(x1, y1, z1); - GL11.glVertex3d(x2, y1, z1); - GL11.glVertex3d(x2, y2, z1); - GL11.glVertex3d(x1, y2, z1); - GL11.glVertex3d(x1, y2, z2); - GL11.glVertex3d(x2, y2, z2); - GL11.glVertex3d(x2, y1, z2); - GL11.glVertex3d(x1, y1, z2); - - GL11.glEnd(); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/debug/MTEAdvDebugStructureWriter.java b/src/main/java/gregtech/common/tileentities/debug/MTEAdvDebugStructureWriter.java new file mode 100644 index 0000000000..82e4c21653 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/debug/MTEAdvDebugStructureWriter.java @@ -0,0 +1,434 @@ +package gregtech.common.tileentities.debug; + +import static gregtech.GTMod.GT_FML_LOGGER; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.HashMap; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.structure.StructureUtility; +import com.gtnewhorizon.structurelib.util.Vec3Impl; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; +import gregtech.api.render.TextureFactory; + +public class MTEAdvDebugStructureWriter extends MTETieredMachineBlock implements IAddGregtechLogo, IAddUIWidgets { + + private static final HashMap bondingBoxes = new HashMap<>(1); + private final BoundHighlighter boundingBox = new BoundHighlighter(); + private final short[] numbers = new short[6]; + private boolean transpose = false; + private boolean showHighlightBox = true; + private String[] result = new String[] { "Undefined" }; + + public MTEAdvDebugStructureWriter(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, ""); + } + + public MTEAdvDebugStructureWriter(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEAdvDebugStructureWriter(mName, mTier, "", mTextures); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + return new ITexture[] { + Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], sideDirection != facingDirection + ? TextureFactory.of( + TextureFactory.builder() + .addIcon(Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE) + .glow() + .build()) + : TextureFactory.of( + TextureFactory.builder() + .addIcon(Textures.BlockIcons.STRUCTURE_MARK) + .glow() + .build()) }; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b, + ItemStack itemStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + for (int i = 0; i < numbers.length; i++) { + aNBT.setShort("eData" + i, numbers[i]); + } + aNBT.setBoolean("Transpose", transpose); + aNBT.setBoolean("HighlightBox", showHighlightBox); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + for (int i = 0; i < numbers.length; i++) { + numbers[i] = aNBT.getShort("eData" + i); + } + transpose = aNBT.getBoolean("Transpose"); + showHighlightBox = aNBT.getBoolean("HighlightBox"); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + bondingBoxes.put(this, boundingBox); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + ExtendedFacing writerFacing = ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()); + double[] abc = new double[3]; + double[] xyz = new double[3]; + boundingBox.dim = aBaseMetaTileEntity.getWorld().provider.dimensionId; + boundingBox.showHighlightBox = showHighlightBox; + abc[0] = -numbers[0] - 0.5; + abc[1] = -numbers[1] - 0.5; + abc[2] = -numbers[2] - 0.5; + writerFacing.getWorldOffset(abc, xyz); + boundingBox.pos1 = new Vec3Impl( + aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5), + aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5), + aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5)); + abc[0] = -numbers[0] + numbers[3] - 0.5; + abc[1] = -numbers[1] + numbers[4] - 0.5; + abc[2] = -numbers[2] + numbers[5] - 0.5; + writerFacing.getWorldOffset(abc, xyz); + boundingBox.pos2 = new Vec3Impl( + aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5), + aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5), + aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5)); + } + } + + @Override + public void onRemoval() { + bondingBoxes.remove(this); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity(); + printStructure(aPlayer); + aBaseMetaTileEntity.disableWorking(); + } + + public void printStructure(EntityPlayer aPlayer) { + IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity(); + String pseudoJavaCode = StructureUtility.getPseudoJavaCode( + aBaseMetaTileEntity.getWorld(), + ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()), + aBaseMetaTileEntity.getXCoord(), + aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), + numbers[0], + numbers[1], + numbers[2], + te -> te.getClass() + .getCanonicalName(), + numbers[3], + numbers[4], + numbers[5], + transpose); + GT_FML_LOGGER.info(pseudoJavaCode); + result = pseudoJavaCode.split("\\n"); + aPlayer.addChatMessage( + new ChatComponentTranslation(translateToLocal("GT5U.machines.advdebugstructurewriter.printed"))); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isElectric() { + return false; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public String[] getDescription() { + return new String[] { translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip"), // Scans Blocks Around + translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.1"), // Prints Multiblock NonTE + // structure check code + translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.2") // ABC axes aligned to machine front + }; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return result; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setSize(90, 112) + .setPos(43, 4)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (getBaseMetaTileEntity().isServerSide()) { + printStructure( + widget.getContext() + .getPlayer()); + } + }) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_PRINT) + .setSize(18, 18) + .setPos(11, 128) + .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.print.tooltip"))) + .widget( + new CycleButtonWidget().setToggle(() -> transpose, aBoolean -> transpose = aBoolean) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_TRANSPOSE) + .setSize(18, 18) + .setPos(32, 128) + .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.transpose.tooltip"))) + .widget( + new CycleButtonWidget().setToggle(() -> showHighlightBox, aBoolean -> showHighlightBox = aBoolean) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_BOUNDING_BOX) + .setSize(18, 18) + .setPos(53, 128) + .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.highlight.tooltip"))) + .widget( + new MultiChildWidget() + .addChild( + new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.origin")) + .setDefaultColor(0xf0f0ff) + .setPos(0, 0)) + .addChild( + TextWidget.dynamicString(() -> "A: " + numbers[0]) + .setDefaultColor(0xf0f0ff) + .setPos(0, 10)) + .addChild( + TextWidget.dynamicString(() -> "B: " + numbers[1]) + .setDefaultColor(0xf0f0ff) + .setPos(0, 18)) + .addChild( + TextWidget.dynamicString(() -> "C: " + numbers[2]) + .setDefaultColor(0xf0f0ff) + .setPos(0, 26)) + .addChild( + new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.size")) + .setDefaultColor(0xf0f0ff) + .setPos(0, 52)) + .addChild( + TextWidget.dynamicString(() -> "A: " + numbers[3]) + .setDefaultColor(0xf0f0ff) + .setPos(0, 62)) + .addChild( + TextWidget.dynamicString(() -> "B: " + numbers[4]) + .setDefaultColor(0xf0f0ff) + .setPos(0, 70)) + .addChild( + TextWidget.dynamicString(() -> "C: " + numbers[5]) + .setDefaultColor(0xf0f0ff) + .setPos(0, 78)) + .setPos(46, 8)); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151); + } + + private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift, + int addNumber, int xPos) { + int[] yPos = new int[] { 4, 22, 40, 62, 80, 98 }; + for (int i = 0; i < yPos.length; i++) { + final int index = i; // needed for lambda + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + numbers[index] += clickData.shift ? addNumberShift : addNumber; + if (index >= 3) { + numbers[index] = (short) Math.max(numbers[index], 0); + } + }) + .setBackground(GTUITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, yPos[index])); + } + } + + @Override + public GUITextureSet getGUITextureSet() { + return new GUITextureSet().setGregTechLogo(GTUITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(113, 96)); + } + + @Override + public boolean doesBindPlayerInventory() { + return false; + } + + public static class ForgeEventHandler { + + public ForgeEventHandler() { + MinecraftForge.EVENT_BUS.register(this); + } + + @SuppressWarnings("unused") + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onRenderWorldLast(RenderWorldLastEvent e) { + for (BoundHighlighter boundingBox : bondingBoxes.values()) { + boundingBox.renderHighlightedBlock(e); + } + } + } + + private static class BoundHighlighter { + + public Vec3Impl pos1; + public Vec3Impl pos2; + public boolean showHighlightBox; + public int dim; + + @SideOnly(Side.CLIENT) + private void renderHighlightedBlock(RenderWorldLastEvent event) { + if (pos1 == null || pos2 == null || !showHighlightBox) { + return; + } + Minecraft mc = Minecraft.getMinecraft(); + int dimension = mc.theWorld.provider.dimensionId; + + if (dimension != dim) { + pos1 = null; + pos2 = null; + return; + } + + EntityPlayerSP p = mc.thePlayer; + double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * event.partialTicks; + double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * event.partialTicks; + double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * event.partialTicks; + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GL11.glLineWidth(3); + GL11.glTranslated(-doubleX, -doubleY, -doubleZ); + + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + GL11.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); + renderHighLightedArenaOutline(pos1.get0(), pos1.get1(), pos1.get2(), pos2.get0(), pos2.get1(), pos2.get2()); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + + @SideOnly(Side.CLIENT) + static void renderHighLightedArenaOutline(double x1, double y1, double z1, double x2, double y2, double z2) { + GL11.glBegin(GL11.GL_LINE_STRIP); + + GL11.glVertex3d(x1, y1, z1); + GL11.glVertex3d(x1, y2, z1); + GL11.glVertex3d(x1, y2, z2); + GL11.glVertex3d(x1, y1, z2); + GL11.glVertex3d(x1, y1, z1); + + GL11.glVertex3d(x2, y1, z1); + GL11.glVertex3d(x2, y2, z1); + GL11.glVertex3d(x2, y2, z2); + GL11.glVertex3d(x2, y1, z2); + GL11.glVertex3d(x2, y1, z1); + + GL11.glVertex3d(x1, y1, z1); + GL11.glVertex3d(x2, y1, z1); + GL11.glVertex3d(x2, y1, z2); + GL11.glVertex3d(x1, y1, z2); + GL11.glVertex3d(x1, y2, z2); + GL11.glVertex3d(x2, y2, z2); + GL11.glVertex3d(x2, y2, z1); + GL11.glVertex3d(x2, y1, z1); + GL11.glVertex3d(x1, y1, z1); + GL11.glVertex3d(x2, y1, z1); + GL11.glVertex3d(x2, y2, z1); + GL11.glVertex3d(x1, y2, z1); + GL11.glVertex3d(x1, y2, z2); + GL11.glVertex3d(x2, y2, z2); + GL11.glVertex3d(x2, y1, z2); + GL11.glVertex3d(x1, y1, z2); + + GL11.glEnd(); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java deleted file mode 100644 index 10138bdfc2..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java +++ /dev/null @@ -1,278 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.ParticleFX; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; - -public class GT_MetaTileEntity_DieselGenerator extends GT_MetaTileEntity_BasicGenerator { - - public int mEfficiency; - - public GT_MetaTileEntity_DieselGenerator(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - new String[] { "Requires liquid Fuel", - "Causes " - + (int) (GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond - * GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier[aTier]) - + " Pollution per second" }); - onConfigLoad(); - } - - public GT_MetaTileEntity_DieselGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - onConfigLoad(); - } - - public GT_MetaTileEntity_DieselGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - onConfigLoad(); - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_DieselGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.dieselFuels; - } - - @Override - public int getCapacity() { - return 16000; - } - - public void onConfigLoad() { - this.mEfficiency = (100 - this.mTier * 5); - } - - @Override - public int getEfficiency() { - return this.mEfficiency; - } - - @Override - public int getFuelValue(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack) || getRecipeMap() == null) return 0; - long rValue = super.getFuelValue(aStack); - if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) { - rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3L); - } - if (rValue > Integer.MAX_VALUE) { - throw new ArithmeticException("Integer LOOPBACK!"); - } - return (int) rValue; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aTick % 100 == 0 && mFluid != null && mFluid.amount > this.getCapacity()) { - GT_Log.err.println( - "Dupe Abuse: " + aBaseMetaTileEntity.getOwnerName() - + " Coords: " - + aBaseMetaTileEntity.getXCoord() - + " " - + aBaseMetaTileEntity.getYCoord() - + " " - + aBaseMetaTileEntity.getZCoord()); - aBaseMetaTileEntity.setToFire(); - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - /** - * Draws random smoke particles on top when active - * - * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - if (aBaseMetaTileEntity.isActive()) { - - if (aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) { - - final double x = aBaseMetaTileEntity.getOffsetX(ForgeDirection.UP, 1) + 2D / 16D - + XSTR_INSTANCE.nextFloat() * 14D / 16D; - final double y = aBaseMetaTileEntity.getOffsetY(ForgeDirection.UP, 1) + 1D / 32D; - final double z = aBaseMetaTileEntity.getOffsetZ(ForgeDirection.UP, 1) + 2D / 16D - + XSTR_INSTANCE.nextFloat() * 14D / 16D; - - new ParticleEventBuilder().setMotion(0D, 0D, 0D) - .setPosition(x, y, z) - .setWorld(getBaseMetaTileEntity().getWorld()) - .setIdentifier(ParticleFX.SMOKE) - .run(); - } - } - } - - @Override - public ITexture[] getFront(byte aColor) { - return new ITexture[] { super.getFront(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_FRONT), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_FRONT_GLOW) - .glow() - .build()), - OVERLAYS_ENERGY_OUT[this.mTier] }; - } - - @Override - public ITexture[] getBack(byte aColor) { - return new ITexture[] { super.getBack(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_BACK), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_BACK_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { super.getBottom(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_BOTTOM), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_BOTTOM_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getTop(byte aColor) { - return new ITexture[] { super.getTop(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_TOP), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_TOP_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getSides(byte aColor) { - return new ITexture[] { super.getSides(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_SIDE), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_SIDE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getFrontActive(byte aColor) { - return new ITexture[] { super.getFrontActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_FRONT_ACTIVE_GLOW) - .glow() - .build()), - OVERLAYS_ENERGY_OUT[this.mTier] }; - } - - @Override - public ITexture[] getBackActive(byte aColor) { - return new ITexture[] { super.getBackActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_BACK_ACTIVE), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_BACK_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBottomActive(byte aColor) { - return new ITexture[] { super.getBottomActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_BOTTOM_ACTIVE), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getTopActive(byte aColor) { - return new ITexture[] { super.getTopActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_TOP_ACTIVE), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_TOP_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getSidesActive(byte aColor) { - return new ITexture[] { super.getSidesActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(DIESEL_GENERATOR_SIDE_ACTIVE), - TextureFactory.builder() - .addIcon(DIESEL_GENERATOR_SIDE_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public int getPollution() { - return (int) (GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond - * GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier[mTier]); - } -} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java deleted file mode 100644 index ca0a5d6958..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java +++ /dev/null @@ -1,207 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.GT_Mod; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_GasTurbine extends GT_MetaTileEntity_BasicGenerator { - - public int mEfficiency; - - public GT_MetaTileEntity_GasTurbine(int aID, String aName, String aNameRegional, int aTier, int mEfficiency) { - super( - aID, - aName, - aNameRegional, - aTier, - new String[] { "Requires flammable Gasses", - "Causes " - + (int) (GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond - * GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier[aTier]) - + " Pollution per second" }); - this.mEfficiency = mEfficiency; - } - - public GT_MetaTileEntity_GasTurbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, - int mEfficiency) { - super(aName, aTier, aDescription, aTextures); - this.mEfficiency = mEfficiency; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_GasTurbine( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mTextures, - this.mEfficiency); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.gasTurbineFuels; - } - - @Override - public int getCapacity() { - return 16000; - } - - @Override - public int getEfficiency() { - return this.mEfficiency; - } - - @Override - public ITexture[] getFront(byte aColor) { - return new ITexture[] { super.getFront(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_FRONT), - TextureFactory.builder() - .addIcon(GAS_TURBINE_FRONT_GLOW) - .glow() - .build()), - OVERLAYS_ENERGY_OUT[this.mTier] }; - } - - @Override - public ITexture[] getBack(byte aColor) { - return new ITexture[] { super.getBack(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_BACK), - TextureFactory.builder() - .addIcon(GAS_TURBINE_BACK_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { super.getBottom(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_BOTTOM), - TextureFactory.builder() - .addIcon(GAS_TURBINE_BOTTOM_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getTop(byte aColor) { - return new ITexture[] { super.getTop(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_TOP), - TextureFactory.builder() - .addIcon(GAS_TURBINE_TOP_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getSides(byte aColor) { - return new ITexture[] { super.getSides(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_SIDE), - TextureFactory.builder() - .addIcon(GAS_TURBINE_SIDE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getFrontActive(byte aColor) { - return new ITexture[] { super.getFrontActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(GAS_TURBINE_FRONT_ACTIVE_GLOW) - .glow() - .build()), - OVERLAYS_ENERGY_OUT[this.mTier] }; - } - - @Override - public ITexture[] getBackActive(byte aColor) { - return new ITexture[] { super.getBackActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_BACK_ACTIVE), - TextureFactory.builder() - .addIcon(GAS_TURBINE_BACK_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBottomActive(byte aColor) { - return new ITexture[] { super.getBottomActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_BOTTOM_ACTIVE), - TextureFactory.builder() - .addIcon(GAS_TURBINE_BOTTOM_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getTopActive(byte aColor) { - return new ITexture[] { super.getTopActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_TOP_ACTIVE), - TextureFactory.builder() - .addIcon(GAS_TURBINE_TOP_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getSidesActive(byte aColor) { - return new ITexture[] { super.getSidesActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(GAS_TURBINE_SIDE_ACTIVE), - TextureFactory.builder() - .addIcon(GAS_TURBINE_SIDE_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public int getPollution() { - return (int) (GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond - * GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier[mTier]); - } -} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java deleted file mode 100644 index 9809dba278..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java +++ /dev/null @@ -1,169 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_LightningRod extends GT_MetaTileEntity_TieredMachineBlock { - - public GT_MetaTileEntity_LightningRod(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 0, "Generates EU From Lightning Bolts"); - } - - public GT_MetaTileEntity_LightningRod(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_LightningRod(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection != ForgeDirection.UP) { - return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], - BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier] }; - } - if (!active) return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], - TextureFactory.of(BlockIcons.MACHINE_CASING_FUSION_GLASS) }; - return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], - TextureFactory.of(BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW), TextureFactory.builder() - .addIcon(BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return null; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LightningRod( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - World aWorld = aBaseMetaTileEntity.getWorld(); - if (!aWorld.isRemote) { - if (aBaseMetaTileEntity.getStoredEU() > 0) { - aBaseMetaTileEntity.setActive(true); - aBaseMetaTileEntity.decreaseStoredEnergyUnits(aBaseMetaTileEntity.getStoredEU() / 100 + 1, false); - } else { - aBaseMetaTileEntity.setActive(false); - } - - if (aTick % 256 == 0 && (aWorld.isThundering() || (aWorld.isRaining() && XSTR_INSTANCE.nextInt(10) == 0))) { - int aRodValue = 0; - boolean isRodValid = true; - int aX = aBaseMetaTileEntity.getXCoord(); - int aY = aBaseMetaTileEntity.getYCoord(); - int aZ = aBaseMetaTileEntity.getZCoord(); - - for (int i = aBaseMetaTileEntity.getYCoord() + 1; i < aWorld.getHeight() - 1; i++) { - if (isRodValid && aBaseMetaTileEntity.getBlock(aX, i, aZ) - .getUnlocalizedName() - .equals("blockFenceIron")) { - aRodValue++; - } else { - isRodValid = false; - if (aBaseMetaTileEntity.getBlock(aX, i, aZ) != Blocks.air) { - aRodValue = 0; - break; - } - } - } - if (!aWorld.isThundering() && ((aY + aRodValue) < 128)) aRodValue = 0; - if (XSTR_INSTANCE.nextInt(4 * aWorld.getHeight()) < (aRodValue * (aY + aRodValue))) { - aBaseMetaTileEntity - .increaseStoredEnergyUnits(maxEUStore() - aBaseMetaTileEntity.getStoredEU(), false); - aWorld.addWeatherEffect(new EntityLightningBolt(aWorld, aX, aY + aRodValue, aZ)); - // randomly break a rod - if (aWorld.isThundering()) { - aWorld.setBlockToAir(aX, aY + XSTR_INSTANCE.nextInt(aRodValue) + 1, aZ); - } - } - } - } - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return facing == ForgeDirection.UP; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return true; - } - - @Override - public boolean isEnetOutput() { - return true; - } - - @Override - public boolean isEnetInput() { - return false; - } - - @Override - public long maxEUStore() { - return 50000000; - } - - @Override - public long maxEUOutput() { - return GT_Values.V[mTier]; - } - - @Override - public long maxAmperesOut() { - return 512; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) {} - - @Override - public void loadNBTData(NBTTagCompound aNBT) {} -} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java deleted file mode 100644 index 647aa504e5..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java +++ /dev/null @@ -1,173 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_MagicEnergyConverter extends GT_MetaTileEntity_BasicGenerator { - - public int mEfficiency; - - public GT_MetaTileEntity_MagicEnergyConverter(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, "Put your strange stuff in here"); - onConfigLoad(); - } - - public GT_MetaTileEntity_MagicEnergyConverter(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - onConfigLoad(); - } - - public GT_MetaTileEntity_MagicEnergyConverter(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - onConfigLoad(); - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MagicEnergyConverter( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.magicFuels; - } - - @Override - public int getCapacity() { - return 16000; - } - - public void onConfigLoad() { - this.mEfficiency = 100 - this.mTier * 5; - } - - @Override - public int getEfficiency() { - return this.mEfficiency; - } - - @Override - public ITexture[] getFront(byte aColor) { - return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_GLOW) - .glow() - .build(), - OVERLAYS_ENERGY_OUT[mTier] }; - } - - @Override - public ITexture[] getBack(byte aColor) { - return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_FRONT_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTop(byte aColor) { - return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSides(byte aColor) { - return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontActive(byte aColor) { - return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) - .glow() - .build(), - OVERLAYS_ENERGY_OUT[mTier] }; - } - - @Override - public ITexture[] getBackActive(byte aColor) { - return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomActive(byte aColor) { - return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopActive(byte aColor) { - return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSidesActive(byte aColor) { - return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public int getPollution() { - return 0; - } -} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java deleted file mode 100644 index 3245607ac2..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java +++ /dev/null @@ -1,805 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Mods.Thaumcraft; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_DRAGONEGG; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_DRAGONEGG_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; -import static net.minecraft.util.EnumChatFormatting.GRAY; -import static net.minecraft.util.EnumChatFormatting.GREEN; -import static net.minecraft.util.EnumChatFormatting.LIGHT_PURPLE; -import static net.minecraft.util.EnumChatFormatting.RESET; -import static net.minecraft.util.EnumChatFormatting.UNDERLINE; -import static net.minecraft.util.EnumChatFormatting.YELLOW; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockDragonEgg; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.item.EntityEnderCrystal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemEnchantedBook; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.base.Enums; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.TC_Aspects; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; -import gregtech.common.config.machinestats.ConfigMachines; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.aspects.AspectSourceHelper; -import thaumcraft.api.aspects.IAspectContainer; -import thaumcraft.api.visnet.VisNetHandler; - -interface MagicalEnergyBBListener { - - void onMagicalEnergyBBUpdate(); -} - -public class GT_MetaTileEntity_MagicalEnergyAbsorber extends GT_MetaTileEntity_BasicGenerator - implements MagicalEnergyBBListener { - - private static final ConcurrentHashMap sSubscribedCrystals = new ConcurrentHashMap<>( - 4); - private static final List sPrimalAspects = (Thaumcraft.isModLoaded()) ? Aspect.getPrimalAspects() - : new ArrayList<>(); - private static final Map sAspectsEnergy = new HashMap<>(); - private static boolean sAllowMultipleEggs = false; - private static GT_MetaTileEntity_MagicalEnergyAbsorber sActiveSiphon = null; - private static int sEnergyPerEndercrystal = 512; - private static int sEnergyFromVis = 20; - private static int sEnergyPerEssentia = 320; - private static int sDragonEggEnergyPerTick = 2048; - private static int sCreeperEggEnergyPerTick = 512; - private final MagicalEnergyBB mMagicalEnergyBB = new MagicalEnergyBB(this, mTier, mTier + 2); - private int mEfficiency; - private int mMaxVisPerDrain; - private long mNextGenerateTickRate = 1; - private int mNoGenerationTicks = 0; - private boolean mUsingEssentia = true; - - public GT_MetaTileEntity_MagicalEnergyAbsorber(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, "Feasts on magic close to it:"); - onConfigLoad(); - } - - private GT_MetaTileEntity_MagicalEnergyAbsorber(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - onConfigLoad(); - } - - /** - * Populates static variables dependant on config settings - */ - private static void sharedConfigLoad() { - sAllowMultipleEggs = ConfigMachines.allowMultipleEggs; - if (Thaumcraft.isModLoaded()) { - for (Aspect tAspect : Aspect.aspects.values()) { - // noinspection UnstableApiUsage - sAspectsEnergy.put( - tAspect, - Enums.getIfPresent( - TC_Aspects.class, - tAspect.getTag() - .toUpperCase(Locale.ENGLISH)) - .or(TC_Aspects.AER).mValue * sEnergyPerEssentia); - } - } - } - - private static void setActiveSiphon(GT_MetaTileEntity_MagicalEnergyAbsorber aSiphon) { - sActiveSiphon = aSiphon; - } - - public void onConfigLoad() { - sharedConfigLoad(); - mEfficiency = 100 - mTier * 10; - mMaxVisPerDrain = (int) Math.round(Math.sqrt((double) (V[mTier] * 10000) / (sEnergyFromVis * getEfficiency()))); - if (Math.pow(mMaxVisPerDrain, 2) * sEnergyFromVis * getEfficiency() < V[mTier]) { - mMaxVisPerDrain += 1; - } - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aPlayer.isSneaking()) mMagicalEnergyBB.decreaseTier(); - else mMagicalEnergyBB.increaseTier(); - GT_Utility.sendChatToPlayer( - aPlayer, - String.format( - GT_LanguageManager.addStringLocalization( - "Interaction_DESCRIPTION_MagicalEnergyAbsorber_Screwdriver", - "Absorption range: %s blocks"), - mMagicalEnergyBB.getRange(), - true)); - mMagicalEnergyBB.update(); - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - if (!aBaseMetaTileEntity.isServerSide()) return; - mMagicalEnergyBB.update(); - } - - @Override - public void onRemoval() { - super.onRemoval(); - releaseEgg(); - unsubscribeCrystals(); - } - - private void releaseEgg() { - if (sActiveSiphon == this) { - setActiveSiphon(null); - } - } - - private void unsubscribeCrystals() { - for (UUID tCrystalID : sSubscribedCrystals.keySet()) { - sSubscribedCrystals.remove(tCrystalID, this); - } - } - - /** - * Call-back from the Bounding Box when its content is updated - */ - @Override - public void onMagicalEnergyBBUpdate() { - List tCrystalIDsInRange = mMagicalEnergyBB.getLivingCrystalIDs(); - // Release unreachable Crystals subscriptions - for (UUID tSubscribedCrystalID : sSubscribedCrystals.keySet()) { - if (!tCrystalIDsInRange.contains(tSubscribedCrystalID)) { - sSubscribedCrystals.remove(tSubscribedCrystalID, this); - } - } - // Subscribe to available and not already subscribed Crystals - for (UUID tCrystalID : tCrystalIDsInRange) { - sSubscribedCrystals.putIfAbsent(tCrystalID, this); - } - } - - @Override - public String[] getDescription() { - final String LI = "- %%%"; - final String EU_PER = "%%%EU per "; - List description = new ArrayList<>(); - description - .add(UNDERLINE + "Feasts on " + LIGHT_PURPLE + UNDERLINE + "magic" + GRAY + UNDERLINE + " close to it:"); - description.add( - LI + (sAllowMultipleEggs ? "A " : "An " + YELLOW + UNDERLINE + "EXCLUSIVE" + RESET) - + GRAY - + " " - + LIGHT_PURPLE - + "Dragon Egg" - + GRAY - + " atop"); - if (sEnergyPerEndercrystal > 0) { - description.add(LI + sEnergyPerEndercrystal + EU_PER + LIGHT_PURPLE + "Ender Crystal" + GRAY + " in range"); - } - if (Thaumcraft.isModLoaded()) { - description.add(LI + mMaxVisPerDrain + "%%%CV/t from an " + LIGHT_PURPLE + "Energised Node" + GRAY); - description.add( - LI + (sEnergyPerEssentia * getEfficiency()) / 100 - + EU_PER - + LIGHT_PURPLE - + "Essentia" - + GRAY - + " Aspect-Value from containers in range"); - } - description.add(" "); - description.add(UNDERLINE + "Lookup range (Use Screwdriver to change):"); - description.add("Default: %%%" + GREEN + mMagicalEnergyBB.getDefaultRange()); - description.add("Max: %%%" + GREEN + mMagicalEnergyBB.getMaxRange()); - description.add(" "); - description - .add(UNDERLINE + "Fuels on " + LIGHT_PURPLE + UNDERLINE + "enchantments" + GRAY + UNDERLINE + " input:"); - description.add( - "- Item: %%%" + (10000 * getEfficiency()) / 100 - + EU_PER - + LIGHT_PURPLE - + "enchant" - + GRAY - + " weight × level / max"); - description.add("- Book: %%%" + 10000 + EU_PER + LIGHT_PURPLE + "enchant" + GRAY + " weight × level / max"); - description.add(" "); - description.add("Efficiency: %%%" + GREEN + getEfficiency() + "%"); - return description.toArray(new String[0]); - } - - @Override - public ITexture[] getFront(byte aColor) { - return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_GLOW) - .glow() - .build(), - OVERLAYS_ENERGY_OUT[mTier] }; - } - - @Override - public ITexture[] getBack(byte aColor) { - return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_FRONT_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTop(byte aColor) { - return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_DRAGONEGG) }; - } - - @Override - public ITexture[] getSides(byte aColor) { - return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontActive(byte aColor) { - return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) - .glow() - .build(), - OVERLAYS_ENERGY_OUT[mTier] }; - } - - @Override - public ITexture[] getBackActive(byte aColor) { - return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomActive(byte aColor) { - return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopActive(byte aColor) { - return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_DRAGONEGG), - TextureFactory.builder() - .addIcon(MACHINE_CASING_DRAGONEGG_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSidesActive(byte aColor) { - return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), - TextureFactory.builder() - .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public long maxEUStore() { - return Math.max(getEUVar(), V[mTier] * 16000 + getMinimumStoredEU()); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (!aBaseMetaTileEntity.isServerSide()) return; - if (!aBaseMetaTileEntity.isAllowedToWork()) return; - if ((aBaseMetaTileEntity.getUniversalEnergyStored() >= aBaseMetaTileEntity.getEUCapacity())) return; - - long tGeneratedEU; - - if (aTick % 100 == 0 && mUsingEssentia) mMagicalEnergyBB.update(); - - // Adaptive EU Generation Ticking - if (aTick % mNextGenerateTickRate == 0) { - tGeneratedEU = generateEU(); - if (tGeneratedEU > 0) { - mNoGenerationTicks = 0; - if (tGeneratedEU >= 2 * V[mTier]) - mNextGenerateTickRate = (long) (1.0D / ((2.0D * (double) (V[mTier])) / (double) tGeneratedEU)); - else mNextGenerateTickRate = 1; - mInventory[getStackDisplaySlot()] = new ItemStack(Blocks.fire, 1); - mInventory[getStackDisplaySlot()].setStackDisplayName("Generating: " + tGeneratedEU + " EU"); - } else { - mInventory[getStackDisplaySlot()] = null; - mNoGenerationTicks += 1; - } - if (mNoGenerationTicks > 20) { - mNoGenerationTicks = 0; - mNextGenerateTickRate = 20; - } - aBaseMetaTileEntity.increaseStoredEnergyUnits(tGeneratedEU, true); - aBaseMetaTileEntity.setActive( - aBaseMetaTileEntity.isAllowedToWork() - && aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU()); - } - } - - /** - * Draws random portal particles on top when active with an egg on top - * - * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - - if (aBaseMetaTileEntity.isActive()) { - - if (isEgg(aBaseMetaTileEntity.getBlockAtSide(ForgeDirection.UP))) { - - final double oX = aBaseMetaTileEntity.getXCoord() + 8D / 16D; - final double oY = aBaseMetaTileEntity.getYCoord() + 17D / 32D; - final double oZ = aBaseMetaTileEntity.getZCoord() + 8D / 16D; - - final ParticleEventBuilder particleEventBuilder = new ParticleEventBuilder() - .setWorld(getBaseMetaTileEntity().getWorld()) - .setIdentifier(ParticleFX.PORTAL); - - for (int i = 0; i < 9; i++) { - final double dX = (XSTR_INSTANCE.nextFloat() - 0.5D) / 2D; - final double dY = XSTR_INSTANCE.nextFloat() * 1.5; - final double dZ = (XSTR_INSTANCE.nextFloat() - 0.5D) / 2D; - - final double x = oX + dX; - final double y = oY + dY; - final double z = oZ + dZ; - - final double mX = dX * 4D; - final double dXZ = Math.sqrt(dX * dX + dZ * dZ); - final double mY = -(dXZ * dY) / 4D; - final double mZ = dZ * 4D; - - particleEventBuilder.setMotion(mX, mY, mZ) - .setPosition(x, y, z) - .run(); - } - } - } - } - - @Override - public int getPollution() { - return 0; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.magicFuels; - } - - @Override - public int getEfficiency() { - return mEfficiency; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - // Restrict input to disenchantable items or enchanted books - return (isDisenchantableItem(aStack) || isEnchantedBook(aStack)); - } - - @Override - public int getCapacity() { - return 16000; - } - - private boolean isDisenchantableItem(ItemStack aStack) { - return ((aStack.isItemEnchanted()) && (aStack.getItem() - .getItemEnchantability() > 0)); - } - - private boolean isEnchantedBook(ItemStack aStack) { - return (aStack.getItem() instanceof ItemEnchantedBook); - } - - private long generateEU() { - long tEU; - - mUsingEssentia = false; - if ((tEU = absorbFromEgg()) > 0) return tEU; - if ((tEU = absorbFromEnderCrystals()) > 0) return tEU; - if ((tEU = absorbFromEnchantedItems()) > 0) return tEU; - if ((tEU = absorbFromVisNet()) > 0) return tEU; - mUsingEssentia = true; - if ((tEU = absorbFromEssentiaContainers()) > 0) return tEU; - return 0; - } - - private long absorbFromEnchantedItems() { - ItemStack tStack = getBaseMetaTileEntity().getStackInSlot(getInputSlot()); - if (tStack == null) return 0; - if (tStack.stackSize == 0) return 0; - if (!(isDisenchantableItem(tStack) || isEnchantedBook(tStack))) return 0; - long tEU = 0; - // Convert enchantments to their EU Value - Map tMap = EnchantmentHelper.getEnchantments(tStack); - for (Map.Entry e : tMap.entrySet()) { - if ((Integer) e.getKey() < Enchantment.enchantmentsList.length) { - Enchantment tEnchantment = Enchantment.enchantmentsList[(Integer) e.getKey()]; - Integer tLevel = (Integer) e.getValue(); - tEU += 1000000L * tLevel / tEnchantment.getMaxLevel() / tEnchantment.getWeight(); - } - } - - ItemStack tOutputStack = GT_Utility.copyAmount(1, tStack); - if (tOutputStack != null) { - if (isDisenchantableItem(tOutputStack)) { - tEU = tEU * getEfficiency() / 100; - EnchantmentHelper.setEnchantments(new HashMap<>(), tOutputStack); - } else if (isEnchantedBook(tOutputStack)) { - tOutputStack = new ItemStack(Items.book, 1); - } - } - - // Only consume input when it can store EU and push output - if ((getBaseMetaTileEntity().getStoredEU() + tEU) < getBaseMetaTileEntity().getEUCapacity() - && getBaseMetaTileEntity().addStackToSlot(getOutputSlot(), tOutputStack)) { - decrStackSize(getInputSlot(), 1); - } else { - tEU = 0; - } - return tEU; - } - - private boolean hasEgg() { - Block above = getBaseMetaTileEntity().getBlockOffset(0, 1, 0); - return isEgg(above); - } - - private long absorbFromEgg() { - if (!hasEgg()) return 0; - if (!sAllowMultipleEggs) { - if (sActiveSiphon != null && sActiveSiphon != this - && sActiveSiphon.getBaseMetaTileEntity() != null - && !sActiveSiphon.getBaseMetaTileEntity() - .isInvalidTileEntity() - && sActiveSiphon.isChunkLoaded() - && sActiveSiphon.hasEgg()) { - getBaseMetaTileEntity().doExplosion(Integer.MAX_VALUE); - } else { - setActiveSiphon(this); - } - } - Block egg = getBaseMetaTileEntity().getBlockOffset(0, 1, 0); - if (egg == Blocks.dragon_egg) { - return sDragonEggEnergyPerTick; - } else if (egg.getUnlocalizedName() - .contains("creeperEgg")) { - return sCreeperEggEnergyPerTick; - } - return 0; - } - - private long absorbFromEnderCrystals() { - if (sEnergyPerEndercrystal <= 0) return 0; - long tEU = 0; - for (GT_MetaTileEntity_MagicalEnergyAbsorber tSubscriber : sSubscribedCrystals.values()) { - if (tSubscriber == this) { // This Crystal is for me - tEU += sEnergyPerEndercrystal; - } - } - return tEU; - } - - private long absorbFromVisNet() { - if (!Thaumcraft.isModLoaded()) return 0; - - long tEU; - IGregTechTileEntity tBaseMetaTileEntity = getBaseMetaTileEntity(); - World tWorld = tBaseMetaTileEntity.getWorld(); - int tX = tBaseMetaTileEntity.getXCoord(); - int tY = tBaseMetaTileEntity.getYCoord(); - int tZ = tBaseMetaTileEntity.getZCoord(); - - // Attempt to drain as much Vis as needed for max EU/t, from all primal aspects. - int toDrain = mMaxVisPerDrain; - - for (int i = sPrimalAspects.size() - 1; i >= 0 && toDrain > 0; i--) { - toDrain -= VisNetHandler.drainVis(tWorld, tX, tY, tZ, sPrimalAspects.get(i), toDrain); - } - - int drained = mMaxVisPerDrain - toDrain; - tEU = (long) Math.min(maxEUOutput(), (Math.pow(drained, 2) * sEnergyFromVis * getEfficiency() / 10000)); - - return tEU; - } - - private long absorbFromEssentiaContainers() { - if (!Thaumcraft.isModLoaded()) return 0; - - long tEU = 0; - - long tEUtoGen = getBaseMetaTileEntity().getEUCapacity() - getBaseMetaTileEntity().getUniversalEnergyStored(); - List mAvailableEssentiaAspects = mMagicalEnergyBB.getAvailableAspects(); - - // try to drain 1 of whatever aspect available in containers within RANGE - for (int i = mAvailableEssentiaAspects.size() - 1; i >= 0 && tEUtoGen > 0; i--) { - Aspect aspect = mAvailableEssentiaAspects.get(i); - long tAspectEU = ((long) sAspectsEnergy.get(aspect) * getEfficiency()) / 100; - if (tAspectEU <= tEUtoGen && AspectSourceHelper.drainEssentia( - (TileEntity) getBaseMetaTileEntity(), - aspect, - ForgeDirection.UNKNOWN, - mMagicalEnergyBB.getRange())) { - tEUtoGen -= tAspectEU; - tEU += tAspectEU; - } - } - return tEU; - } - - private boolean isEgg(Block aBlock) { - if (aBlock == null) return false; - if (aBlock == Blocks.air) return false; - if (aBlock == Blocks.dragon_egg) return true; - if (aBlock instanceof BlockDragonEgg) return true; - return (aBlock.getUnlocalizedName() - .equals("tile.dragonEgg")); - } - - private boolean isChunkLoaded() { - IGregTechTileEntity tBaseMetaTileEntity = getBaseMetaTileEntity(); - int tX = tBaseMetaTileEntity.getXCoord(); - int tY = tBaseMetaTileEntity.getYCoord(); - World tWorld = tBaseMetaTileEntity.getWorld(); - Chunk tChunk = tWorld.getChunkFromBlockCoords(tX, tY); - return tChunk.isChunkLoaded; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MagicalEnergyAbsorber(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("mMagicalEnergyBBTier", mMagicalEnergyBB.getTier()); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mMagicalEnergyBB.setTier(aNBT.getInteger("mMagicalEnergyBBTier")); - } - - /** - * Handles Bounding Box ranged operations for Magic sources - */ - static class MagicalEnergyBB { - - private final GT_MetaTileEntity_MagicalEnergyAbsorber mAbsorber; - private final MagicalEnergyBBListener mListener; - private final int mDefaultTier; - private int mTier; - private final int mMaxTier; - private final List mLivingCrystalIDs = new ArrayList<>(); - private List mAvailableAspects; - - /** - * @param aAbsorber user and subscriber for updated BB content - * @param aDefaultTier Initial tier value - * @param aMaxTier Maximum allowed tier - */ - MagicalEnergyBB(GT_MetaTileEntity_MagicalEnergyAbsorber aAbsorber, int aDefaultTier, int aMaxTier) { - mAbsorber = aAbsorber; - mListener = aAbsorber; - mMaxTier = Math.max(Math.max(aMaxTier, 0), Math.max(aDefaultTier, 0)); - mDefaultTier = Math.min(aDefaultTier, mMaxTier); - mTier = mDefaultTier; - if (Thaumcraft.isModLoaded()) mAvailableAspects = new ArrayList<>(Aspect.aspects.size()); - } - - int getTier() { - return mTier; - } - - /** - * Set Bounding Box Tier within allowed bounds - * - * @param aTier new tier value - * @return effective new tier - */ - int setTier(int aTier) { - if (aTier >= 0) { - mTier = Math.min(aTier, mMaxTier); - } else { - mTier = 0; - } - return mTier; - } - - int getRange() { - return getRange(mTier); - } - - int getRange(int aTier) { - return 1 << aTier; - } - - int getDefaultTier() { - return mDefaultTier; - } - - int getDefaultRange() { - return getRange(getDefaultTier()); - } - - int getMaxTier() { - return mMaxTier; - } - - int getMaxRange() { - return getRange(getMaxTier()); - } - - private AxisAlignedBB getAxisAlignedBB() { - double tRange = getRange(); - IGregTechTileEntity tBaseMetaTileEntity = mAbsorber.getBaseMetaTileEntity(); - double tX = tBaseMetaTileEntity.getXCoord(); - double tY = tBaseMetaTileEntity.getYCoord(); - double tZ = tBaseMetaTileEntity.getZCoord(); - return AxisAlignedBB - .getBoundingBox(tX - tRange, tY - tRange, tZ - tRange, tX + tRange, tY + tRange, tZ + tRange); - } - - private void scanLivingCrystals() { - World tWorld = mAbsorber.getBaseMetaTileEntity() - .getWorld(); - mLivingCrystalIDs.clear(); - for (EntityEnderCrystal o : tWorld.getEntitiesWithinAABB(EntityEnderCrystal.class, getAxisAlignedBB())) { - if (o.isEntityAlive()) { - mLivingCrystalIDs.add(o.getPersistentID()); - } - } - } - - private void scanAvailableAspects() { - if (!Thaumcraft.isModLoaded()) return; - IGregTechTileEntity tBaseMetaTileEntity = mAbsorber.getBaseMetaTileEntity(); - if (tBaseMetaTileEntity.isInvalidTileEntity()) return; - int tRange = getRange(); - int tY = tBaseMetaTileEntity.getYCoord(); - int tMaxY = tBaseMetaTileEntity.getWorld() - .getHeight() - 1; - // Make sure relative Y range stays between 0 and world max Y - int rYMin = (tY - tRange >= 0) ? -tRange : -(tY); - int rYMax = (((tY + tRange) <= tMaxY) ? tRange : tMaxY - tY); - mAvailableAspects.clear(); - for (int rX = -tRange; rX <= tRange; rX++) { - for (int rZ = -tRange; rZ <= tRange; rZ++) { - // rY < rYMax is not a bug. See: thaumcraft.common.lib.events.EssentiaHandler.getSources() - for (int rY = rYMin; rY < rYMax; rY++) { - TileEntity tTile = tBaseMetaTileEntity.getTileEntityOffset(rX, rY, rZ); - if (tTile instanceof IAspectContainer) { - AspectList tAspectList = ((IAspectContainer) tTile).getAspects(); - if (tAspectList == null || tAspectList.aspects.isEmpty()) continue; - Set tAspects = tAspectList.aspects.keySet(); - mAvailableAspects.addAll(tAspects); - } - } - } - } - } - - /** - * @return List of Living Ender Crystal Entity IDs in range - */ - List getLivingCrystalIDs() { - return mLivingCrystalIDs; - } - - /** - * @return List of drainable Essentia Aspects from containers in range - */ - List getAvailableAspects() { - return mAvailableAspects; - } - - /** - * Scan range for magic sources - */ - void update() { - if (mAbsorber == null) return; - if (mAbsorber.getBaseMetaTileEntity() == null) return; - if (mAbsorber.getBaseMetaTileEntity() - .isInvalidTileEntity()) return; - if (mAbsorber.getBaseMetaTileEntity() - .getWorld() == null) return; - scanLivingCrystals(); - scanAvailableAspects(); - if (mListener != null) { - mListener.onMagicalEnergyBBUpdate(); - } - } - - void increaseTier() { - offsetTier(1); - } - - void decreaseTier() { - offsetTier(-1); - } - - /** - * Change the Bounding Box tier relatively to offset with wrapping at tier limits - * - * @param aOffset relative tier change - */ - void offsetTier(int aOffset) { - int tNumTiers = mMaxTier + 1; - int tTier = (mTier + aOffset + tNumTiers) % tNumTiers; - int tTrueTier = setTier(tTier); - if (tTier != tTrueTier) { - GT_Log.out.format("Absorber's BB Tier set to %d was capped to %d", tTier, tTrueTier); - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java deleted file mode 100644 index 1dd378e746..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java +++ /dev/null @@ -1,201 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_GLOW; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_NaquadahReactor extends GT_MetaTileEntity_BasicGenerator { - - private int mEfficiency; - - public GT_MetaTileEntity_NaquadahReactor(int aID, String aName, String[] aDescription, String aNameRegional, - int aTier) { - super(aID, aName, aNameRegional, aTier, aDescription); - if (aTier > 8 || aTier < 4) { - new Exception("Tier without Recipe Map!").printStackTrace(); - } - mEfficiency = getBaseEff(); - } - - public GT_MetaTileEntity_NaquadahReactor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - if (aTier > 8 || aTier < 4) { - new Exception("Tier without Recipe Map!").printStackTrace(); - } - mEfficiency = getBaseEff(); - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - if (side == ForgeDirection.UNKNOWN) return false; - return ((side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) - && (side != getBaseMetaTileEntity().getFrontFacing()) - && (side != getBaseMetaTileEntity().getBackFacing()); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_NaquadahReactor(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - RecipeMap ret; - switch (mTier) { - case 4 -> ret = RecipeMaps.smallNaquadahReactorFuels; - case 5 -> ret = RecipeMaps.largeNaquadahReactorFuels; - case 6 -> ret = RecipeMaps.hugeNaquadahReactorFuels; - case 7 -> ret = RecipeMaps.extremeNaquadahReactorFuels; - case 8 -> ret = RecipeMaps.ultraHugeNaquadahReactorFuels; - default -> ret = null; - } - return ret; - } - - @Override - public int getCapacity() { - return getRecipeMap() != null ? getRecipeMap().getBackend() - .getProperties().minFluidInputs > 0 ? 8000 * (mTier + 1) : 0 : 0; - } - - @Override - public int getEfficiency() { - return mEfficiency; - } - - private int getBaseEff() { - return mTier == 4 ? 80 : 100 + (50 * (mTier - 5)); - } - - @Override - public ITexture[] getFront(byte aColor) { - return new ITexture[] { super.getFront(aColor)[0], - TextureFactory.of( - TextureFactory.of(NAQUADAH_REACTOR_SOLID_FRONT), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_FRONT_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBack(byte aColor) { - return new ITexture[] { super.getBack(aColor)[0], - TextureFactory.of( - TextureFactory.of(NAQUADAH_REACTOR_SOLID_BACK), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_BACK_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { super.getBottom(aColor)[0], - TextureFactory.of( - TextureFactory.of(NAQUADAH_REACTOR_SOLID_BOTTOM), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getTop(byte aColor) { - return new ITexture[] { super.getTop(aColor)[0], - TextureFactory.of( - TextureFactory.of(NAQUADAH_REACTOR_SOLID_TOP), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_TOP_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getSides(byte aColor) { - return new ITexture[] { super.getSides(aColor)[0], - TextureFactory.of( - TextureFactory.of(NAQUADAH_REACTOR_SOLID_SIDE), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_SIDE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getFrontActive(byte aColor) { - return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBackActive(byte aColor) { - return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_BACK_ACTIVE), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomActive(byte aColor) { - return new ITexture[] { super.getBottomActive(aColor)[0], - TextureFactory.of(NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE), TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopActive(byte aColor) { - return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_TOP_ACTIVE), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSidesActive(byte aColor) { - return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE), - TextureFactory.builder() - .addIcon(NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public int getPollution() { - return 0; - } -} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java deleted file mode 100644 index fa980ce480..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java +++ /dev/null @@ -1,142 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; - -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_PlasmaGenerator extends GT_MetaTileEntity_BasicGenerator { - - public int mEfficiency; - - public GT_MetaTileEntity_PlasmaGenerator(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, "Plasma into energy"); - setEfficiency(); - } - - public GT_MetaTileEntity_PlasmaGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - setEfficiency(); - } - - public GT_MetaTileEntity_PlasmaGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - setEfficiency(); - } - - @Override - public ITexture[] getFront(byte aColor) { - return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS), - OVERLAYS_ENERGY_OUT[mTier] }; - } - - @Override - public ITexture[] getBack(byte aColor) { - return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; - } - - @Override - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; - } - - @Override - public ITexture[] getTop(byte aColor) { - return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; - } - - @Override - public ITexture[] getSides(byte aColor) { - return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; - } - - @Override - public ITexture[] getFrontActive(byte aColor) { - return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), - TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) - .glow() - .build(), - OVERLAYS_ENERGY_OUT[mTier] }; - } - - @Override - public ITexture[] getBackActive(byte aColor) { - return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), - TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomActive(byte aColor) { - return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), - TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopActive(byte aColor) { - return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), - TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSidesActive(byte aColor) { - return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), - TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) - .glow() - .build() }; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.plasmaFuels; - } - - @Override - public int getEfficiency() { - return this.mEfficiency; - } - - @Override - public int getCapacity() { - return 16000; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PlasmaGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - public void setEfficiency() { - this.mEfficiency = Math.max(10, 10 + Math.min(90, this.mTier * 10)); - } - - @Override - public int getPollution() { - return 0; - } -} diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java deleted file mode 100644 index 9c1b8db562..0000000000 --- a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java +++ /dev/null @@ -1,238 +0,0 @@ -package gregtech.common.tileentities.generators; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_GLOW; - -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; - -public class GT_MetaTileEntity_SteamTurbine extends GT_MetaTileEntity_BasicGenerator { - - public int mEfficiency; - - public GT_MetaTileEntity_SteamTurbine(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - new String[] { "Converts Steam into EU", "Base rate: 2L of Steam -> 1 EU" }); - this.mEfficiency = 6 + this.mTier; - } - - public GT_MetaTileEntity_SteamTurbine(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - this.mEfficiency = 6 + this.mTier; - } - - public GT_MetaTileEntity_SteamTurbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - this.mEfficiency = 6 + this.mTier; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_SteamTurbine(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return null; - } - - @Override - public String[] getDescription() { - String[] desc = new String[mDescriptionArray.length + 2]; - System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); - desc[mDescriptionArray.length] = "Fuel Efficiency: " + (600 / getEfficiency()) + "%"; - desc[mDescriptionArray.length + 1] = String.format( - "Consumes up to %sL of Steam per second", - (int) (4000 * (8 * Math.pow(4, mTier) + Math.pow(2, Math.max(mTier - 1, 0))) / (600 / getEfficiency()))); - return desc; - } - - @Override - public int getCapacity() { - return 24000 * this.mTier; - } - - @Override - public int getEfficiency() { - return this.mEfficiency; - } - - @Override - public long getFuelValue(FluidStack aLiquid, boolean aLong) { - return getFuelValue(aLiquid); - } - - @Override - public int getFuelValue(FluidStack aLiquid) { - if (aLiquid == null) return 0; - return GT_ModHandler.isAnySteam(aLiquid) ? 3 : 0; - } - - @Override - public int consumedFluidPerOperation(FluidStack aLiquid) { - return this.mEfficiency; - } - - @Override - public ITexture[] getFront(byte aColor) { - return new ITexture[] { super.getFront(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_FRONT), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_FRONT_GLOW) - .glow() - .build()), - OVERLAYS_ENERGY_OUT[this.mTier] }; - } - - @Override - public ITexture[] getBack(byte aColor) { - return new ITexture[] { super.getBack(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_BACK), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_BACK_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBottom(byte aColor) { - return new ITexture[] { super.getBottom(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_BOTTOM), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_BOTTOM_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getTop(byte aColor) { - return new ITexture[] { super.getTop(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_TOP), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_TOP_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getSides(byte aColor) { - return new ITexture[] { super.getSides(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_SIDE), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_SIDE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getFrontActive(byte aColor) { - return new ITexture[] { super.getFrontActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_FRONT_ACTIVE), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_FRONT_ACTIVE_GLOW) - .glow() - .build()), - OVERLAYS_ENERGY_OUT[this.mTier] }; - } - - @Override - public ITexture[] getBackActive(byte aColor) { - return new ITexture[] { super.getBackActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_BACK_ACTIVE), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_BACK_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getBottomActive(byte aColor) { - return new ITexture[] { super.getBottomActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_BOTTOM_ACTIVE), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_BOTTOM_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getTopActive(byte aColor) { - return new ITexture[] { super.getTopActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_TOP_ACTIVE), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_TOP_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public ITexture[] getSidesActive(byte aColor) { - return new ITexture[] { super.getSidesActive(aColor)[0], - TextureFactory.of( - TextureFactory.of(STEAM_TURBINE_SIDE_ACTIVE), - TextureFactory.builder() - .addIcon(STEAM_TURBINE_SIDE_ACTIVE_GLOW) - .glow() - .build()) }; - } - - @Override - public int getPollution() { - return 0; - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - if (GT_ModHandler.isSuperHeatedSteam(aFluid)) { - aFluid.amount = 0; - aFluid = null; - return false; - } - return super.isFluidInputAllowed(aFluid); - } -} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTEDieselGenerator.java b/src/main/java/gregtech/common/tileentities/generators/MTEDieselGenerator.java new file mode 100644 index 0000000000..b09e2c5e1d --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTEDieselGenerator.java @@ -0,0 +1,278 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.ParticleFX; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicGenerator; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; + +public class MTEDieselGenerator extends MTEBasicGenerator { + + public int mEfficiency; + + public MTEDieselGenerator(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { "Requires liquid Fuel", + "Causes " + + (int) (GTMod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond + * GTMod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier[aTier]) + + " Pollution per second" }); + onConfigLoad(); + } + + public MTEDieselGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + onConfigLoad(); + } + + public MTEDieselGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + onConfigLoad(); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEDieselGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.dieselFuels; + } + + @Override + public int getCapacity() { + return 16000; + } + + public void onConfigLoad() { + this.mEfficiency = (100 - this.mTier * 5); + } + + @Override + public int getEfficiency() { + return this.mEfficiency; + } + + @Override + public int getFuelValue(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack) || getRecipeMap() == null) return 0; + long rValue = super.getFuelValue(aStack); + if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) { + rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3L); + } + if (rValue > Integer.MAX_VALUE) { + throw new ArithmeticException("Integer LOOPBACK!"); + } + return (int) rValue; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aTick % 100 == 0 && mFluid != null && mFluid.amount > this.getCapacity()) { + GTLog.err.println( + "Dupe Abuse: " + aBaseMetaTileEntity.getOwnerName() + + " Coords: " + + aBaseMetaTileEntity.getXCoord() + + " " + + aBaseMetaTileEntity.getYCoord() + + " " + + aBaseMetaTileEntity.getZCoord()); + aBaseMetaTileEntity.setToFire(); + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + /** + * Draws random smoke particles on top when active + * + * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isActive()) { + + if (aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) { + + final double x = aBaseMetaTileEntity.getOffsetX(ForgeDirection.UP, 1) + 2D / 16D + + XSTR_INSTANCE.nextFloat() * 14D / 16D; + final double y = aBaseMetaTileEntity.getOffsetY(ForgeDirection.UP, 1) + 1D / 32D; + final double z = aBaseMetaTileEntity.getOffsetZ(ForgeDirection.UP, 1) + 2D / 16D + + XSTR_INSTANCE.nextFloat() * 14D / 16D; + + new ParticleEventBuilder().setMotion(0D, 0D, 0D) + .setPosition(x, y, z) + .setWorld(getBaseMetaTileEntity().getWorld()) + .setIdentifier(ParticleFX.SMOKE) + .run(); + } + } + } + + @Override + public ITexture[] getFront(byte aColor) { + return new ITexture[] { super.getFront(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_FRONT), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_FRONT_GLOW) + .glow() + .build()), + OVERLAYS_ENERGY_OUT[this.mTier] }; + } + + @Override + public ITexture[] getBack(byte aColor) { + return new ITexture[] { super.getBack(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_BACK), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_BACK_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { super.getBottom(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_BOTTOM), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_BOTTOM_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getTop(byte aColor) { + return new ITexture[] { super.getTop(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_TOP), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_TOP_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getSides(byte aColor) { + return new ITexture[] { super.getSides(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_SIDE), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_SIDE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getFrontActive(byte aColor) { + return new ITexture[] { super.getFrontActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_FRONT_ACTIVE_GLOW) + .glow() + .build()), + OVERLAYS_ENERGY_OUT[this.mTier] }; + } + + @Override + public ITexture[] getBackActive(byte aColor) { + return new ITexture[] { super.getBackActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_BACK_ACTIVE), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_BACK_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBottomActive(byte aColor) { + return new ITexture[] { super.getBottomActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_BOTTOM_ACTIVE), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getTopActive(byte aColor) { + return new ITexture[] { super.getTopActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_TOP_ACTIVE), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_TOP_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getSidesActive(byte aColor) { + return new ITexture[] { super.getSidesActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(DIESEL_GENERATOR_SIDE_ACTIVE), + TextureFactory.builder() + .addIcon(DIESEL_GENERATOR_SIDE_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public int getPollution() { + return (int) (GTMod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond + * GTMod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier[mTier]); + } +} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTEGasTurbine.java b/src/main/java/gregtech/common/tileentities/generators/MTEGasTurbine.java new file mode 100644 index 0000000000..47976da987 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTEGasTurbine.java @@ -0,0 +1,201 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.GTMod; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicGenerator; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; + +public class MTEGasTurbine extends MTEBasicGenerator { + + public int mEfficiency; + + public MTEGasTurbine(int aID, String aName, String aNameRegional, int aTier, int mEfficiency) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { "Requires flammable Gasses", + "Causes " + + (int) (GTMod.gregtechproxy.mPollutionBaseGasTurbinePerSecond + * GTMod.gregtechproxy.mPollutionGasTurbineReleasedByTier[aTier]) + + " Pollution per second" }); + this.mEfficiency = mEfficiency; + } + + public MTEGasTurbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, int mEfficiency) { + super(aName, aTier, aDescription, aTextures); + this.mEfficiency = mEfficiency; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEGasTurbine(this.mName, this.mTier, this.mDescriptionArray, this.mTextures, this.mEfficiency); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.gasTurbineFuels; + } + + @Override + public int getCapacity() { + return 16000; + } + + @Override + public int getEfficiency() { + return this.mEfficiency; + } + + @Override + public ITexture[] getFront(byte aColor) { + return new ITexture[] { super.getFront(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_FRONT), + TextureFactory.builder() + .addIcon(GAS_TURBINE_FRONT_GLOW) + .glow() + .build()), + OVERLAYS_ENERGY_OUT[this.mTier] }; + } + + @Override + public ITexture[] getBack(byte aColor) { + return new ITexture[] { super.getBack(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_BACK), + TextureFactory.builder() + .addIcon(GAS_TURBINE_BACK_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { super.getBottom(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_BOTTOM), + TextureFactory.builder() + .addIcon(GAS_TURBINE_BOTTOM_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getTop(byte aColor) { + return new ITexture[] { super.getTop(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_TOP), + TextureFactory.builder() + .addIcon(GAS_TURBINE_TOP_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getSides(byte aColor) { + return new ITexture[] { super.getSides(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_SIDE), + TextureFactory.builder() + .addIcon(GAS_TURBINE_SIDE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getFrontActive(byte aColor) { + return new ITexture[] { super.getFrontActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(GAS_TURBINE_FRONT_ACTIVE_GLOW) + .glow() + .build()), + OVERLAYS_ENERGY_OUT[this.mTier] }; + } + + @Override + public ITexture[] getBackActive(byte aColor) { + return new ITexture[] { super.getBackActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_BACK_ACTIVE), + TextureFactory.builder() + .addIcon(GAS_TURBINE_BACK_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBottomActive(byte aColor) { + return new ITexture[] { super.getBottomActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_BOTTOM_ACTIVE), + TextureFactory.builder() + .addIcon(GAS_TURBINE_BOTTOM_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getTopActive(byte aColor) { + return new ITexture[] { super.getTopActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_TOP_ACTIVE), + TextureFactory.builder() + .addIcon(GAS_TURBINE_TOP_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getSidesActive(byte aColor) { + return new ITexture[] { super.getSidesActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(GAS_TURBINE_SIDE_ACTIVE), + TextureFactory.builder() + .addIcon(GAS_TURBINE_SIDE_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public int getPollution() { + return (int) (GTMod.gregtechproxy.mPollutionBaseGasTurbinePerSecond + * GTMod.gregtechproxy.mPollutionGasTurbineReleasedByTier[mTier]); + } +} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTELightningRod.java b/src/main/java/gregtech/common/tileentities/generators/MTELightningRod.java new file mode 100644 index 0000000000..ef04bf9d0b --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTELightningRod.java @@ -0,0 +1,168 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; +import gregtech.api.render.TextureFactory; + +public class MTELightningRod extends MTETieredMachineBlock { + + public MTELightningRod(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, "Generates EU From Lightning Bolts"); + } + + public MTELightningRod(String aName, int aTier, int aInvSlotCount, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTELightningRod(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection != ForgeDirection.UP) { + return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], + BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier] }; + } + if (!active) return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], + TextureFactory.of(BlockIcons.MACHINE_CASING_FUSION_GLASS) }; + return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], + TextureFactory.of(BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW), TextureFactory.builder() + .addIcon(BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELightningRod( + this.mName, + this.mTier, + this.mInventory.length, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + World aWorld = aBaseMetaTileEntity.getWorld(); + if (!aWorld.isRemote) { + if (aBaseMetaTileEntity.getStoredEU() > 0) { + aBaseMetaTileEntity.setActive(true); + aBaseMetaTileEntity.decreaseStoredEnergyUnits(aBaseMetaTileEntity.getStoredEU() / 100 + 1, false); + } else { + aBaseMetaTileEntity.setActive(false); + } + + if (aTick % 256 == 0 && (aWorld.isThundering() || (aWorld.isRaining() && XSTR_INSTANCE.nextInt(10) == 0))) { + int aRodValue = 0; + boolean isRodValid = true; + int aX = aBaseMetaTileEntity.getXCoord(); + int aY = aBaseMetaTileEntity.getYCoord(); + int aZ = aBaseMetaTileEntity.getZCoord(); + + for (int i = aBaseMetaTileEntity.getYCoord() + 1; i < aWorld.getHeight() - 1; i++) { + if (isRodValid && aBaseMetaTileEntity.getBlock(aX, i, aZ) + .getUnlocalizedName() + .equals("blockFenceIron")) { + aRodValue++; + } else { + isRodValid = false; + if (aBaseMetaTileEntity.getBlock(aX, i, aZ) != Blocks.air) { + aRodValue = 0; + break; + } + } + } + if (!aWorld.isThundering() && ((aY + aRodValue) < 128)) aRodValue = 0; + if (XSTR_INSTANCE.nextInt(4 * aWorld.getHeight()) < (aRodValue * (aY + aRodValue))) { + aBaseMetaTileEntity + .increaseStoredEnergyUnits(maxEUStore() - aBaseMetaTileEntity.getStoredEU(), false); + aWorld.addWeatherEffect(new EntityLightningBolt(aWorld, aX, aY + aRodValue, aZ)); + // randomly break a rod + if (aWorld.isThundering()) { + aWorld.setBlockToAir(aX, aY + XSTR_INSTANCE.nextInt(aRodValue) + 1, aZ); + } + } + } + } + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return facing == ForgeDirection.UP; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public long maxEUStore() { + return 50000000; + } + + @Override + public long maxEUOutput() { + return GTValues.V[mTier]; + } + + @Override + public long maxAmperesOut() { + return 512; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) {} + + @Override + public void loadNBTData(NBTTagCompound aNBT) {} +} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTEMagicEnergyConverter.java b/src/main/java/gregtech/common/tileentities/generators/MTEMagicEnergyConverter.java new file mode 100644 index 0000000000..c741cc4457 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTEMagicEnergyConverter.java @@ -0,0 +1,167 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicGenerator; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; + +public class MTEMagicEnergyConverter extends MTEBasicGenerator { + + public int mEfficiency; + + public MTEMagicEnergyConverter(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, "Put your strange stuff in here"); + onConfigLoad(); + } + + public MTEMagicEnergyConverter(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + onConfigLoad(); + } + + public MTEMagicEnergyConverter(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + onConfigLoad(); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMagicEnergyConverter(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.magicFuels; + } + + @Override + public int getCapacity() { + return 16000; + } + + public void onConfigLoad() { + this.mEfficiency = 100 - this.mTier * 5; + } + + @Override + public int getEfficiency() { + return this.mEfficiency; + } + + @Override + public ITexture[] getFront(byte aColor) { + return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_GLOW) + .glow() + .build(), + OVERLAYS_ENERGY_OUT[mTier] }; + } + + @Override + public ITexture[] getBack(byte aColor) { + return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_FRONT_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTop(byte aColor) { + return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSides(byte aColor) { + return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontActive(byte aColor) { + return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) + .glow() + .build(), + OVERLAYS_ENERGY_OUT[mTier] }; + } + + @Override + public ITexture[] getBackActive(byte aColor) { + return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomActive(byte aColor) { + return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopActive(byte aColor) { + return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSidesActive(byte aColor) { + return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public int getPollution() { + return 0; + } +} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTEMagicalEnergyAbsorber.java b/src/main/java/gregtech/common/tileentities/generators/MTEMagicalEnergyAbsorber.java new file mode 100644 index 0000000000..c49102ad61 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTEMagicalEnergyAbsorber.java @@ -0,0 +1,803 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_DRAGONEGG; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_DRAGONEGG_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; +import static net.minecraft.util.EnumChatFormatting.GRAY; +import static net.minecraft.util.EnumChatFormatting.GREEN; +import static net.minecraft.util.EnumChatFormatting.LIGHT_PURPLE; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.UNDERLINE; +import static net.minecraft.util.EnumChatFormatting.YELLOW; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockDragonEgg; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.item.EntityEnderCrystal; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemEnchantedBook; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.base.Enums; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.TCAspects; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicGenerator; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; +import gregtech.common.config.machinestats.ConfigMachines; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.aspects.AspectSourceHelper; +import thaumcraft.api.aspects.IAspectContainer; +import thaumcraft.api.visnet.VisNetHandler; + +interface MagicalEnergyBBListener { + + void onMagicalEnergyBBUpdate(); +} + +public class MTEMagicalEnergyAbsorber extends MTEBasicGenerator implements MagicalEnergyBBListener { + + private static final ConcurrentHashMap sSubscribedCrystals = new ConcurrentHashMap<>( + 4); + private static final List sPrimalAspects = (Thaumcraft.isModLoaded()) ? Aspect.getPrimalAspects() + : new ArrayList<>(); + private static final Map sAspectsEnergy = new HashMap<>(); + private static boolean sAllowMultipleEggs = false; + private static MTEMagicalEnergyAbsorber sActiveSiphon = null; + private static int sEnergyPerEndercrystal = 512; + private static int sEnergyFromVis = 20; + private static int sEnergyPerEssentia = 320; + private static int sDragonEggEnergyPerTick = 2048; + private static int sCreeperEggEnergyPerTick = 512; + private final MagicalEnergyBB mMagicalEnergyBB = new MagicalEnergyBB(this, mTier, mTier + 2); + private int mEfficiency; + private int mMaxVisPerDrain; + private long mNextGenerateTickRate = 1; + private int mNoGenerationTicks = 0; + private boolean mUsingEssentia = true; + + public MTEMagicalEnergyAbsorber(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, "Feasts on magic close to it:"); + onConfigLoad(); + } + + private MTEMagicalEnergyAbsorber(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + onConfigLoad(); + } + + /** + * Populates static variables dependant on config settings + */ + private static void sharedConfigLoad() { + sAllowMultipleEggs = ConfigMachines.allowMultipleEggs; + if (Thaumcraft.isModLoaded()) { + for (Aspect tAspect : Aspect.aspects.values()) { + // noinspection UnstableApiUsage + sAspectsEnergy.put( + tAspect, + Enums.getIfPresent( + TCAspects.class, + tAspect.getTag() + .toUpperCase(Locale.ENGLISH)) + .or(TCAspects.AER).mValue * sEnergyPerEssentia); + } + } + } + + private static void setActiveSiphon(MTEMagicalEnergyAbsorber aSiphon) { + sActiveSiphon = aSiphon; + } + + public void onConfigLoad() { + sharedConfigLoad(); + mEfficiency = 100 - mTier * 10; + mMaxVisPerDrain = (int) Math.round(Math.sqrt((double) (V[mTier] * 10000) / (sEnergyFromVis * getEfficiency()))); + if (Math.pow(mMaxVisPerDrain, 2) * sEnergyFromVis * getEfficiency() < V[mTier]) { + mMaxVisPerDrain += 1; + } + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) mMagicalEnergyBB.decreaseTier(); + else mMagicalEnergyBB.increaseTier(); + GTUtility.sendChatToPlayer( + aPlayer, + String.format( + GTLanguageManager.addStringLocalization( + "Interaction_DESCRIPTION_MagicalEnergyAbsorber_Screwdriver", + "Absorption range: %s blocks"), + mMagicalEnergyBB.getRange(), + true)); + mMagicalEnergyBB.update(); + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (!aBaseMetaTileEntity.isServerSide()) return; + mMagicalEnergyBB.update(); + } + + @Override + public void onRemoval() { + super.onRemoval(); + releaseEgg(); + unsubscribeCrystals(); + } + + private void releaseEgg() { + if (sActiveSiphon == this) { + setActiveSiphon(null); + } + } + + private void unsubscribeCrystals() { + for (UUID tCrystalID : sSubscribedCrystals.keySet()) { + sSubscribedCrystals.remove(tCrystalID, this); + } + } + + /** + * Call-back from the Bounding Box when its content is updated + */ + @Override + public void onMagicalEnergyBBUpdate() { + List tCrystalIDsInRange = mMagicalEnergyBB.getLivingCrystalIDs(); + // Release unreachable Crystals subscriptions + for (UUID tSubscribedCrystalID : sSubscribedCrystals.keySet()) { + if (!tCrystalIDsInRange.contains(tSubscribedCrystalID)) { + sSubscribedCrystals.remove(tSubscribedCrystalID, this); + } + } + // Subscribe to available and not already subscribed Crystals + for (UUID tCrystalID : tCrystalIDsInRange) { + sSubscribedCrystals.putIfAbsent(tCrystalID, this); + } + } + + @Override + public String[] getDescription() { + final String LI = "- %%%"; + final String EU_PER = "%%%EU per "; + List description = new ArrayList<>(); + description + .add(UNDERLINE + "Feasts on " + LIGHT_PURPLE + UNDERLINE + "magic" + GRAY + UNDERLINE + " close to it:"); + description.add( + LI + (sAllowMultipleEggs ? "A " : "An " + YELLOW + UNDERLINE + "EXCLUSIVE" + RESET) + + GRAY + + " " + + LIGHT_PURPLE + + "Dragon Egg" + + GRAY + + " atop"); + if (sEnergyPerEndercrystal > 0) { + description.add(LI + sEnergyPerEndercrystal + EU_PER + LIGHT_PURPLE + "Ender Crystal" + GRAY + " in range"); + } + if (Thaumcraft.isModLoaded()) { + description.add(LI + mMaxVisPerDrain + "%%%CV/t from an " + LIGHT_PURPLE + "Energised Node" + GRAY); + description.add( + LI + (sEnergyPerEssentia * getEfficiency()) / 100 + + EU_PER + + LIGHT_PURPLE + + "Essentia" + + GRAY + + " Aspect-Value from containers in range"); + } + description.add(" "); + description.add(UNDERLINE + "Lookup range (Use Screwdriver to change):"); + description.add("Default: %%%" + GREEN + mMagicalEnergyBB.getDefaultRange()); + description.add("Max: %%%" + GREEN + mMagicalEnergyBB.getMaxRange()); + description.add(" "); + description + .add(UNDERLINE + "Fuels on " + LIGHT_PURPLE + UNDERLINE + "enchantments" + GRAY + UNDERLINE + " input:"); + description.add( + "- Item: %%%" + (10000 * getEfficiency()) / 100 + + EU_PER + + LIGHT_PURPLE + + "enchant" + + GRAY + + " weight × level / max"); + description.add("- Book: %%%" + 10000 + EU_PER + LIGHT_PURPLE + "enchant" + GRAY + " weight × level / max"); + description.add(" "); + description.add("Efficiency: %%%" + GREEN + getEfficiency() + "%"); + return description.toArray(new String[0]); + } + + @Override + public ITexture[] getFront(byte aColor) { + return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_GLOW) + .glow() + .build(), + OVERLAYS_ENERGY_OUT[mTier] }; + } + + @Override + public ITexture[] getBack(byte aColor) { + return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_FRONT_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTop(byte aColor) { + return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_DRAGONEGG) }; + } + + @Override + public ITexture[] getSides(byte aColor) { + return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontActive(byte aColor) { + return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) + .glow() + .build(), + OVERLAYS_ENERGY_OUT[mTier] }; + } + + @Override + public ITexture[] getBackActive(byte aColor) { + return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomActive(byte aColor) { + return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopActive(byte aColor) { + return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_DRAGONEGG), + TextureFactory.builder() + .addIcon(MACHINE_CASING_DRAGONEGG_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSidesActive(byte aColor) { + return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE), + TextureFactory.builder() + .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public long maxEUStore() { + return Math.max(getEUVar(), V[mTier] * 16000 + getMinimumStoredEU()); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (!aBaseMetaTileEntity.isServerSide()) return; + if (!aBaseMetaTileEntity.isAllowedToWork()) return; + if ((aBaseMetaTileEntity.getUniversalEnergyStored() >= aBaseMetaTileEntity.getEUCapacity())) return; + + long tGeneratedEU; + + if (aTick % 100 == 0 && mUsingEssentia) mMagicalEnergyBB.update(); + + // Adaptive EU Generation Ticking + if (aTick % mNextGenerateTickRate == 0) { + tGeneratedEU = generateEU(); + if (tGeneratedEU > 0) { + mNoGenerationTicks = 0; + if (tGeneratedEU >= 2 * V[mTier]) + mNextGenerateTickRate = (long) (1.0D / ((2.0D * (double) (V[mTier])) / (double) tGeneratedEU)); + else mNextGenerateTickRate = 1; + mInventory[getStackDisplaySlot()] = new ItemStack(Blocks.fire, 1); + mInventory[getStackDisplaySlot()].setStackDisplayName("Generating: " + tGeneratedEU + " EU"); + } else { + mInventory[getStackDisplaySlot()] = null; + mNoGenerationTicks += 1; + } + if (mNoGenerationTicks > 20) { + mNoGenerationTicks = 0; + mNextGenerateTickRate = 20; + } + aBaseMetaTileEntity.increaseStoredEnergyUnits(tGeneratedEU, true); + aBaseMetaTileEntity.setActive( + aBaseMetaTileEntity.isAllowedToWork() + && aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU()); + } + } + + /** + * Draws random portal particles on top when active with an egg on top + * + * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + + if (aBaseMetaTileEntity.isActive()) { + + if (isEgg(aBaseMetaTileEntity.getBlockAtSide(ForgeDirection.UP))) { + + final double oX = aBaseMetaTileEntity.getXCoord() + 8D / 16D; + final double oY = aBaseMetaTileEntity.getYCoord() + 17D / 32D; + final double oZ = aBaseMetaTileEntity.getZCoord() + 8D / 16D; + + final ParticleEventBuilder particleEventBuilder = new ParticleEventBuilder() + .setWorld(getBaseMetaTileEntity().getWorld()) + .setIdentifier(ParticleFX.PORTAL); + + for (int i = 0; i < 9; i++) { + final double dX = (XSTR_INSTANCE.nextFloat() - 0.5D) / 2D; + final double dY = XSTR_INSTANCE.nextFloat() * 1.5; + final double dZ = (XSTR_INSTANCE.nextFloat() - 0.5D) / 2D; + + final double x = oX + dX; + final double y = oY + dY; + final double z = oZ + dZ; + + final double mX = dX * 4D; + final double dXZ = Math.sqrt(dX * dX + dZ * dZ); + final double mY = -(dXZ * dY) / 4D; + final double mZ = dZ * 4D; + + particleEventBuilder.setMotion(mX, mY, mZ) + .setPosition(x, y, z) + .run(); + } + } + } + } + + @Override + public int getPollution() { + return 0; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.magicFuels; + } + + @Override + public int getEfficiency() { + return mEfficiency; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + // Restrict input to disenchantable items or enchanted books + return (isDisenchantableItem(aStack) || isEnchantedBook(aStack)); + } + + @Override + public int getCapacity() { + return 16000; + } + + private boolean isDisenchantableItem(ItemStack aStack) { + return ((aStack.isItemEnchanted()) && (aStack.getItem() + .getItemEnchantability() > 0)); + } + + private boolean isEnchantedBook(ItemStack aStack) { + return (aStack.getItem() instanceof ItemEnchantedBook); + } + + private long generateEU() { + long tEU; + + mUsingEssentia = false; + if ((tEU = absorbFromEgg()) > 0) return tEU; + if ((tEU = absorbFromEnderCrystals()) > 0) return tEU; + if ((tEU = absorbFromEnchantedItems()) > 0) return tEU; + if ((tEU = absorbFromVisNet()) > 0) return tEU; + mUsingEssentia = true; + if ((tEU = absorbFromEssentiaContainers()) > 0) return tEU; + return 0; + } + + private long absorbFromEnchantedItems() { + ItemStack tStack = getBaseMetaTileEntity().getStackInSlot(getInputSlot()); + if (tStack == null) return 0; + if (tStack.stackSize == 0) return 0; + if (!(isDisenchantableItem(tStack) || isEnchantedBook(tStack))) return 0; + long tEU = 0; + // Convert enchantments to their EU Value + Map tMap = EnchantmentHelper.getEnchantments(tStack); + for (Map.Entry e : tMap.entrySet()) { + if ((Integer) e.getKey() < Enchantment.enchantmentsList.length) { + Enchantment tEnchantment = Enchantment.enchantmentsList[(Integer) e.getKey()]; + Integer tLevel = (Integer) e.getValue(); + tEU += 1000000L * tLevel / tEnchantment.getMaxLevel() / tEnchantment.getWeight(); + } + } + + ItemStack tOutputStack = GTUtility.copyAmount(1, tStack); + if (tOutputStack != null) { + if (isDisenchantableItem(tOutputStack)) { + tEU = tEU * getEfficiency() / 100; + EnchantmentHelper.setEnchantments(new HashMap<>(), tOutputStack); + } else if (isEnchantedBook(tOutputStack)) { + tOutputStack = new ItemStack(Items.book, 1); + } + } + + // Only consume input when it can store EU and push output + if ((getBaseMetaTileEntity().getStoredEU() + tEU) < getBaseMetaTileEntity().getEUCapacity() + && getBaseMetaTileEntity().addStackToSlot(getOutputSlot(), tOutputStack)) { + decrStackSize(getInputSlot(), 1); + } else { + tEU = 0; + } + return tEU; + } + + private boolean hasEgg() { + Block above = getBaseMetaTileEntity().getBlockOffset(0, 1, 0); + return isEgg(above); + } + + private long absorbFromEgg() { + if (!hasEgg()) return 0; + if (!sAllowMultipleEggs) { + if (sActiveSiphon != null && sActiveSiphon != this + && sActiveSiphon.getBaseMetaTileEntity() != null + && !sActiveSiphon.getBaseMetaTileEntity() + .isInvalidTileEntity() + && sActiveSiphon.isChunkLoaded() + && sActiveSiphon.hasEgg()) { + getBaseMetaTileEntity().doExplosion(Integer.MAX_VALUE); + } else { + setActiveSiphon(this); + } + } + Block egg = getBaseMetaTileEntity().getBlockOffset(0, 1, 0); + if (egg == Blocks.dragon_egg) { + return sDragonEggEnergyPerTick; + } else if (egg.getUnlocalizedName() + .contains("creeperEgg")) { + return sCreeperEggEnergyPerTick; + } + return 0; + } + + private long absorbFromEnderCrystals() { + if (sEnergyPerEndercrystal <= 0) return 0; + long tEU = 0; + for (MTEMagicalEnergyAbsorber tSubscriber : sSubscribedCrystals.values()) { + if (tSubscriber == this) { // This Crystal is for me + tEU += sEnergyPerEndercrystal; + } + } + return tEU; + } + + private long absorbFromVisNet() { + if (!Thaumcraft.isModLoaded()) return 0; + + long tEU; + IGregTechTileEntity tBaseMetaTileEntity = getBaseMetaTileEntity(); + World tWorld = tBaseMetaTileEntity.getWorld(); + int tX = tBaseMetaTileEntity.getXCoord(); + int tY = tBaseMetaTileEntity.getYCoord(); + int tZ = tBaseMetaTileEntity.getZCoord(); + + // Attempt to drain as much Vis as needed for max EU/t, from all primal aspects. + int toDrain = mMaxVisPerDrain; + + for (int i = sPrimalAspects.size() - 1; i >= 0 && toDrain > 0; i--) { + toDrain -= VisNetHandler.drainVis(tWorld, tX, tY, tZ, sPrimalAspects.get(i), toDrain); + } + + int drained = mMaxVisPerDrain - toDrain; + tEU = (long) Math.min(maxEUOutput(), (Math.pow(drained, 2) * sEnergyFromVis * getEfficiency() / 10000)); + + return tEU; + } + + private long absorbFromEssentiaContainers() { + if (!Thaumcraft.isModLoaded()) return 0; + + long tEU = 0; + + long tEUtoGen = getBaseMetaTileEntity().getEUCapacity() - getBaseMetaTileEntity().getUniversalEnergyStored(); + List mAvailableEssentiaAspects = mMagicalEnergyBB.getAvailableAspects(); + + // try to drain 1 of whatever aspect available in containers within RANGE + for (int i = mAvailableEssentiaAspects.size() - 1; i >= 0 && tEUtoGen > 0; i--) { + Aspect aspect = mAvailableEssentiaAspects.get(i); + long tAspectEU = ((long) sAspectsEnergy.get(aspect) * getEfficiency()) / 100; + if (tAspectEU <= tEUtoGen && AspectSourceHelper.drainEssentia( + (TileEntity) getBaseMetaTileEntity(), + aspect, + ForgeDirection.UNKNOWN, + mMagicalEnergyBB.getRange())) { + tEUtoGen -= tAspectEU; + tEU += tAspectEU; + } + } + return tEU; + } + + private boolean isEgg(Block aBlock) { + if (aBlock == null) return false; + if (aBlock == Blocks.air) return false; + if (aBlock == Blocks.dragon_egg) return true; + if (aBlock instanceof BlockDragonEgg) return true; + return (aBlock.getUnlocalizedName() + .equals("tile.dragonEgg")); + } + + private boolean isChunkLoaded() { + IGregTechTileEntity tBaseMetaTileEntity = getBaseMetaTileEntity(); + int tX = tBaseMetaTileEntity.getXCoord(); + int tY = tBaseMetaTileEntity.getYCoord(); + World tWorld = tBaseMetaTileEntity.getWorld(); + Chunk tChunk = tWorld.getChunkFromBlockCoords(tX, tY); + return tChunk.isChunkLoaded; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMagicalEnergyAbsorber(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("mMagicalEnergyBBTier", mMagicalEnergyBB.getTier()); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mMagicalEnergyBB.setTier(aNBT.getInteger("mMagicalEnergyBBTier")); + } + + /** + * Handles Bounding Box ranged operations for Magic sources + */ + static class MagicalEnergyBB { + + private final MTEMagicalEnergyAbsorber mAbsorber; + private final MagicalEnergyBBListener mListener; + private final int mDefaultTier; + private int mTier; + private final int mMaxTier; + private final List mLivingCrystalIDs = new ArrayList<>(); + private List mAvailableAspects; + + /** + * @param aAbsorber user and subscriber for updated BB content + * @param aDefaultTier Initial tier value + * @param aMaxTier Maximum allowed tier + */ + MagicalEnergyBB(MTEMagicalEnergyAbsorber aAbsorber, int aDefaultTier, int aMaxTier) { + mAbsorber = aAbsorber; + mListener = aAbsorber; + mMaxTier = Math.max(Math.max(aMaxTier, 0), Math.max(aDefaultTier, 0)); + mDefaultTier = Math.min(aDefaultTier, mMaxTier); + mTier = mDefaultTier; + if (Thaumcraft.isModLoaded()) mAvailableAspects = new ArrayList<>(Aspect.aspects.size()); + } + + int getTier() { + return mTier; + } + + /** + * Set Bounding Box Tier within allowed bounds + * + * @param aTier new tier value + * @return effective new tier + */ + int setTier(int aTier) { + if (aTier >= 0) { + mTier = Math.min(aTier, mMaxTier); + } else { + mTier = 0; + } + return mTier; + } + + int getRange() { + return getRange(mTier); + } + + int getRange(int aTier) { + return 1 << aTier; + } + + int getDefaultTier() { + return mDefaultTier; + } + + int getDefaultRange() { + return getRange(getDefaultTier()); + } + + int getMaxTier() { + return mMaxTier; + } + + int getMaxRange() { + return getRange(getMaxTier()); + } + + private AxisAlignedBB getAxisAlignedBB() { + double tRange = getRange(); + IGregTechTileEntity tBaseMetaTileEntity = mAbsorber.getBaseMetaTileEntity(); + double tX = tBaseMetaTileEntity.getXCoord(); + double tY = tBaseMetaTileEntity.getYCoord(); + double tZ = tBaseMetaTileEntity.getZCoord(); + return AxisAlignedBB + .getBoundingBox(tX - tRange, tY - tRange, tZ - tRange, tX + tRange, tY + tRange, tZ + tRange); + } + + private void scanLivingCrystals() { + World tWorld = mAbsorber.getBaseMetaTileEntity() + .getWorld(); + mLivingCrystalIDs.clear(); + for (EntityEnderCrystal o : tWorld.getEntitiesWithinAABB(EntityEnderCrystal.class, getAxisAlignedBB())) { + if (o.isEntityAlive()) { + mLivingCrystalIDs.add(o.getPersistentID()); + } + } + } + + private void scanAvailableAspects() { + if (!Thaumcraft.isModLoaded()) return; + IGregTechTileEntity tBaseMetaTileEntity = mAbsorber.getBaseMetaTileEntity(); + if (tBaseMetaTileEntity.isInvalidTileEntity()) return; + int tRange = getRange(); + int tY = tBaseMetaTileEntity.getYCoord(); + int tMaxY = tBaseMetaTileEntity.getWorld() + .getHeight() - 1; + // Make sure relative Y range stays between 0 and world max Y + int rYMin = (tY - tRange >= 0) ? -tRange : -(tY); + int rYMax = (((tY + tRange) <= tMaxY) ? tRange : tMaxY - tY); + mAvailableAspects.clear(); + for (int rX = -tRange; rX <= tRange; rX++) { + for (int rZ = -tRange; rZ <= tRange; rZ++) { + // rY < rYMax is not a bug. See: thaumcraft.common.lib.events.EssentiaHandler.getSources() + for (int rY = rYMin; rY < rYMax; rY++) { + TileEntity tTile = tBaseMetaTileEntity.getTileEntityOffset(rX, rY, rZ); + if (tTile instanceof IAspectContainer) { + AspectList tAspectList = ((IAspectContainer) tTile).getAspects(); + if (tAspectList == null || tAspectList.aspects.isEmpty()) continue; + Set tAspects = tAspectList.aspects.keySet(); + mAvailableAspects.addAll(tAspects); + } + } + } + } + } + + /** + * @return List of Living Ender Crystal Entity IDs in range + */ + List getLivingCrystalIDs() { + return mLivingCrystalIDs; + } + + /** + * @return List of drainable Essentia Aspects from containers in range + */ + List getAvailableAspects() { + return mAvailableAspects; + } + + /** + * Scan range for magic sources + */ + void update() { + if (mAbsorber == null) return; + if (mAbsorber.getBaseMetaTileEntity() == null) return; + if (mAbsorber.getBaseMetaTileEntity() + .isInvalidTileEntity()) return; + if (mAbsorber.getBaseMetaTileEntity() + .getWorld() == null) return; + scanLivingCrystals(); + scanAvailableAspects(); + if (mListener != null) { + mListener.onMagicalEnergyBBUpdate(); + } + } + + void increaseTier() { + offsetTier(1); + } + + void decreaseTier() { + offsetTier(-1); + } + + /** + * Change the Bounding Box tier relatively to offset with wrapping at tier limits + * + * @param aOffset relative tier change + */ + void offsetTier(int aOffset) { + int tNumTiers = mMaxTier + 1; + int tTier = (mTier + aOffset + tNumTiers) % tNumTiers; + int tTrueTier = setTier(tTier); + if (tTier != tTrueTier) { + GTLog.out.format("Absorber's BB Tier set to %d was capped to %d", tTier, tTrueTier); + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTENaquadahReactor.java b/src/main/java/gregtech/common/tileentities/generators/MTENaquadahReactor.java new file mode 100644 index 0000000000..276fdff07c --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTENaquadahReactor.java @@ -0,0 +1,200 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_GLOW; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicGenerator; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; + +public class MTENaquadahReactor extends MTEBasicGenerator { + + private int mEfficiency; + + public MTENaquadahReactor(int aID, String aName, String[] aDescription, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, aDescription); + if (aTier > 8 || aTier < 4) { + new Exception("Tier without Recipe Map!").printStackTrace(); + } + mEfficiency = getBaseEff(); + } + + public MTENaquadahReactor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + if (aTier > 8 || aTier < 4) { + new Exception("Tier without Recipe Map!").printStackTrace(); + } + mEfficiency = getBaseEff(); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + if (side == ForgeDirection.UNKNOWN) return false; + return ((side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) + && (side != getBaseMetaTileEntity().getFrontFacing()) + && (side != getBaseMetaTileEntity().getBackFacing()); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTENaquadahReactor(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + RecipeMap ret; + switch (mTier) { + case 4 -> ret = RecipeMaps.smallNaquadahReactorFuels; + case 5 -> ret = RecipeMaps.largeNaquadahReactorFuels; + case 6 -> ret = RecipeMaps.hugeNaquadahReactorFuels; + case 7 -> ret = RecipeMaps.extremeNaquadahReactorFuels; + case 8 -> ret = RecipeMaps.ultraHugeNaquadahReactorFuels; + default -> ret = null; + } + return ret; + } + + @Override + public int getCapacity() { + return getRecipeMap() != null ? getRecipeMap().getBackend() + .getProperties().minFluidInputs > 0 ? 8000 * (mTier + 1) : 0 : 0; + } + + @Override + public int getEfficiency() { + return mEfficiency; + } + + private int getBaseEff() { + return mTier == 4 ? 80 : 100 + (50 * (mTier - 5)); + } + + @Override + public ITexture[] getFront(byte aColor) { + return new ITexture[] { super.getFront(aColor)[0], + TextureFactory.of( + TextureFactory.of(NAQUADAH_REACTOR_SOLID_FRONT), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_FRONT_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBack(byte aColor) { + return new ITexture[] { super.getBack(aColor)[0], + TextureFactory.of( + TextureFactory.of(NAQUADAH_REACTOR_SOLID_BACK), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_BACK_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { super.getBottom(aColor)[0], + TextureFactory.of( + TextureFactory.of(NAQUADAH_REACTOR_SOLID_BOTTOM), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getTop(byte aColor) { + return new ITexture[] { super.getTop(aColor)[0], + TextureFactory.of( + TextureFactory.of(NAQUADAH_REACTOR_SOLID_TOP), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_TOP_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getSides(byte aColor) { + return new ITexture[] { super.getSides(aColor)[0], + TextureFactory.of( + TextureFactory.of(NAQUADAH_REACTOR_SOLID_SIDE), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_SIDE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getFrontActive(byte aColor) { + return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBackActive(byte aColor) { + return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_BACK_ACTIVE), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomActive(byte aColor) { + return new ITexture[] { super.getBottomActive(aColor)[0], + TextureFactory.of(NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE), TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopActive(byte aColor) { + return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_TOP_ACTIVE), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSidesActive(byte aColor) { + return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE), + TextureFactory.builder() + .addIcon(NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public int getPollution() { + return 0; + } +} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTEPlasmaGenerator.java b/src/main/java/gregtech/common/tileentities/generators/MTEPlasmaGenerator.java new file mode 100644 index 0000000000..2b8dafcbdf --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTEPlasmaGenerator.java @@ -0,0 +1,142 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; + +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicGenerator; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; + +public class MTEPlasmaGenerator extends MTEBasicGenerator { + + public int mEfficiency; + + public MTEPlasmaGenerator(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, "Plasma into energy"); + setEfficiency(); + } + + public MTEPlasmaGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + setEfficiency(); + } + + public MTEPlasmaGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + setEfficiency(); + } + + @Override + public ITexture[] getFront(byte aColor) { + return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS), + OVERLAYS_ENERGY_OUT[mTier] }; + } + + @Override + public ITexture[] getBack(byte aColor) { + return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; + } + + @Override + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; + } + + @Override + public ITexture[] getTop(byte aColor) { + return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; + } + + @Override + public ITexture[] getSides(byte aColor) { + return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) }; + } + + @Override + public ITexture[] getFrontActive(byte aColor) { + return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), + TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) + .glow() + .build(), + OVERLAYS_ENERGY_OUT[mTier] }; + } + + @Override + public ITexture[] getBackActive(byte aColor) { + return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), + TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomActive(byte aColor) { + return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), + TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopActive(byte aColor) { + return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), + TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSidesActive(byte aColor) { + return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW), + TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) + .glow() + .build() }; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.plasmaFuels; + } + + @Override + public int getEfficiency() { + return this.mEfficiency; + } + + @Override + public int getCapacity() { + return 16000; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPlasmaGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + public void setEfficiency() { + this.mEfficiency = Math.max(10, 10 + Math.min(90, this.mTier * 10)); + } + + @Override + public int getPollution() { + return 0; + } +} diff --git a/src/main/java/gregtech/common/tileentities/generators/MTESteamTurbine.java b/src/main/java/gregtech/common/tileentities/generators/MTESteamTurbine.java new file mode 100644 index 0000000000..bb6138d35a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/generators/MTESteamTurbine.java @@ -0,0 +1,238 @@ +package gregtech.common.tileentities.generators; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_GLOW; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicGenerator; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; + +public class MTESteamTurbine extends MTEBasicGenerator { + + public int mEfficiency; + + public MTESteamTurbine(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { "Converts Steam into EU", "Base rate: 2L of Steam -> 1 EU" }); + this.mEfficiency = 6 + this.mTier; + } + + public MTESteamTurbine(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + this.mEfficiency = 6 + this.mTier; + } + + public MTESteamTurbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + this.mEfficiency = 6 + this.mTier; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamTurbine(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return null; + } + + @Override + public String[] getDescription() { + String[] desc = new String[mDescriptionArray.length + 2]; + System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); + desc[mDescriptionArray.length] = "Fuel Efficiency: " + (600 / getEfficiency()) + "%"; + desc[mDescriptionArray.length + 1] = String.format( + "Consumes up to %sL of Steam per second", + (int) (4000 * (8 * Math.pow(4, mTier) + Math.pow(2, Math.max(mTier - 1, 0))) / (600 / getEfficiency()))); + return desc; + } + + @Override + public int getCapacity() { + return 24000 * this.mTier; + } + + @Override + public int getEfficiency() { + return this.mEfficiency; + } + + @Override + public long getFuelValue(FluidStack aLiquid, boolean aLong) { + return getFuelValue(aLiquid); + } + + @Override + public int getFuelValue(FluidStack aLiquid) { + if (aLiquid == null) return 0; + return GTModHandler.isAnySteam(aLiquid) ? 3 : 0; + } + + @Override + public int consumedFluidPerOperation(FluidStack aLiquid) { + return this.mEfficiency; + } + + @Override + public ITexture[] getFront(byte aColor) { + return new ITexture[] { super.getFront(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_FRONT), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_FRONT_GLOW) + .glow() + .build()), + OVERLAYS_ENERGY_OUT[this.mTier] }; + } + + @Override + public ITexture[] getBack(byte aColor) { + return new ITexture[] { super.getBack(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_BACK), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_BACK_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBottom(byte aColor) { + return new ITexture[] { super.getBottom(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_BOTTOM), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_BOTTOM_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getTop(byte aColor) { + return new ITexture[] { super.getTop(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_TOP), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_TOP_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getSides(byte aColor) { + return new ITexture[] { super.getSides(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_SIDE), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_SIDE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getFrontActive(byte aColor) { + return new ITexture[] { super.getFrontActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_FRONT_ACTIVE), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_FRONT_ACTIVE_GLOW) + .glow() + .build()), + OVERLAYS_ENERGY_OUT[this.mTier] }; + } + + @Override + public ITexture[] getBackActive(byte aColor) { + return new ITexture[] { super.getBackActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_BACK_ACTIVE), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_BACK_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getBottomActive(byte aColor) { + return new ITexture[] { super.getBottomActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_BOTTOM_ACTIVE), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_BOTTOM_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getTopActive(byte aColor) { + return new ITexture[] { super.getTopActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_TOP_ACTIVE), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_TOP_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public ITexture[] getSidesActive(byte aColor) { + return new ITexture[] { super.getSidesActive(aColor)[0], + TextureFactory.of( + TextureFactory.of(STEAM_TURBINE_SIDE_ACTIVE), + TextureFactory.builder() + .addIcon(STEAM_TURBINE_SIDE_ACTIVE_GLOW) + .glow() + .build()) }; + } + + @Override + public int getPollution() { + return 0; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + if (GTModHandler.isSuperHeatedSteam(aFluid)) { + aFluid.amount = 0; + aFluid = null; + return false; + } + return super.isFluidInputAllowed(aFluid); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java deleted file mode 100644 index 252cc6a5b8..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java +++ /dev/null @@ -1,45 +0,0 @@ -package gregtech.common.tileentities.machines; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_BasicHull_Bronze extends GT_MetaTileEntity_BasicHull_NonElectric { - - public GT_MetaTileEntity_BasicHull_Bronze(int aID, String aName, String aNameRegional, int aTier, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aDescription); - } - - public GT_MetaTileEntity_BasicHull_Bronze(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull_Bronze(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BasicHull_Bronze(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[3][17][]; - for (byte i = -1; i < 16; i = (byte) (i + 1)) { - rTextures[0][(i + 1)] = new ITexture[] { - TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[1][(i + 1)] = new ITexture[] { - TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[2][(i + 1)] = new ITexture[] { - TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - } - return rTextures; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java deleted file mode 100644 index ee788ba8c0..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.common.tileentities.machines; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_BasicHull_BronzeBricks extends GT_MetaTileEntity_BasicHull_NonElectric { - - public GT_MetaTileEntity_BasicHull_BronzeBricks(int aID, String aName, String aNameRegional, int aTier, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aDescription); - } - - public GT_MetaTileEntity_BasicHull_BronzeBricks(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull_BronzeBricks(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BasicHull_BronzeBricks( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[3][17][]; - for (byte i = -1; i < 16; i = (byte) (i + 1)) { - ITexture[] tmp0 = { TextureFactory - .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[0][(i + 1)] = tmp0; - ITexture[] tmp1 = { TextureFactory - .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[1][(i + 1)] = tmp1; - ITexture[] tmp2 = { TextureFactory - .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[2][(i + 1)] = tmp2; - } - return rTextures; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java deleted file mode 100644 index 85e461bf47..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java +++ /dev/null @@ -1,47 +0,0 @@ -package gregtech.common.tileentities.machines; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_BasicHull_Steel extends GT_MetaTileEntity_BasicHull_NonElectric { - - public GT_MetaTileEntity_BasicHull_Steel(int aID, String aName, String aNameRegional, int aTier, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aDescription); - } - - public GT_MetaTileEntity_BasicHull_Steel(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull_Steel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BasicHull_Steel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[3][17][]; - for (byte i = -1; i < 16; i = (byte) (i + 1)) { - ITexture[] tmp0 = { - TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[0][(i + 1)] = tmp0; - ITexture[] tmp1 = { - TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[1][(i + 1)] = tmp1; - ITexture[] tmp2 = { - TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[2][(i + 1)] = tmp2; - } - return rTextures; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java deleted file mode 100644 index cd5f547d22..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.common.tileentities.machines; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_BasicHull_SteelBricks extends GT_MetaTileEntity_BasicHull_NonElectric { - - public GT_MetaTileEntity_BasicHull_SteelBricks(int aID, String aName, String aNameRegional, int aTier, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aDescription); - } - - public GT_MetaTileEntity_BasicHull_SteelBricks(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_BasicHull_SteelBricks(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BasicHull_SteelBricks( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[3][17][]; - for (byte i = -1; i < 16; i = (byte) (i + 1)) { - ITexture[] tmp0 = { TextureFactory - .of(Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[0][(i + 1)] = tmp0; - ITexture[] tmp1 = { TextureFactory - .of(Textures.BlockIcons.MACHINE_STEELBRICKS_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[1][(i + 1)] = tmp1; - ITexture[] tmp2 = { TextureFactory - .of(Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; - rTextures[2][(i + 1)] = tmp2; - } - return rTextures; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java deleted file mode 100644 index 09f12904d7..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java +++ /dev/null @@ -1,1040 +0,0 @@ -package gregtech.common.tileentities.machines; - -import static gregtech.api.enums.GT_Values.TIER_COLORS; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_BUFFER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_BUS; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.apache.commons.lang3.ArrayUtils; -import org.jetbrains.annotations.NotNull; - -import com.glodblock.github.common.item.ItemFluidPacket; -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Size; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import appeng.api.AEApi; -import appeng.api.implementations.ICraftingPatternItem; -import appeng.api.implementations.IPowerChannelState; -import appeng.api.networking.GridFlags; -import appeng.api.networking.IGridNode; -import appeng.api.networking.crafting.ICraftingPatternDetails; -import appeng.api.networking.crafting.ICraftingProvider; -import appeng.api.networking.crafting.ICraftingProviderHelper; -import appeng.api.networking.events.MENetworkCraftingPatternChange; -import appeng.api.networking.security.BaseActionSource; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.MachineSource; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.util.AECableType; -import appeng.api.util.DimensionalCoord; -import appeng.api.util.IInterfaceViewable; -import appeng.core.AppEng; -import appeng.core.sync.GuiBridge; -import appeng.helpers.ICustomNameObject; -import appeng.items.misc.ItemEncodedPattern; -import appeng.items.tools.quartz.ToolQuartzCuttingKnife; -import appeng.me.GridAccessException; -import appeng.me.helpers.AENetworkProxy; -import appeng.me.helpers.IGridProxyable; -import appeng.util.IWideReadableNumberConverter; -import appeng.util.Platform; -import appeng.util.ReadableNumberConverter; -import gregtech.GT_Mod; -import gregtech.api.enums.ItemList; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IConfigurationCircuitSupport; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.extensions.ArrayExt; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_Hatch_CraftingInput_ME extends GT_MetaTileEntity_Hatch_InputBus - implements IConfigurationCircuitSupport, IAddGregtechLogo, IAddUIWidgets, IPowerChannelState, ICraftingProvider, - IGridProxyable, IDualInputHatch, ICustomNameObject, IInterfaceViewable { - - // Each pattern slot in the crafting input hatch has its own internal inventory - public static class PatternSlot implements IDualInputInventory { - - public interface SharedItemGetter { - - ItemStack[] getSharedItem(); - } - - private final ItemStack pattern; - private final ICraftingPatternDetails patternDetails; - private final List itemInventory; - private final List fluidInventory; - private final SharedItemGetter sharedItemGetter; - - public PatternSlot(ItemStack pattern, World world, SharedItemGetter getter) { - this.pattern = pattern; - this.patternDetails = ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem())) - .getPatternForItem(pattern, world); - this.itemInventory = new ArrayList<>(); - this.fluidInventory = new ArrayList<>(); - this.sharedItemGetter = getter; - } - - public PatternSlot(ItemStack pattern, NBTTagCompound nbt, World world, SharedItemGetter getter) { - this.pattern = pattern; - this.patternDetails = ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem())) - .getPatternForItem(pattern, world); - this.itemInventory = new ArrayList<>(); - this.fluidInventory = new ArrayList<>(); - this.sharedItemGetter = getter; - NBTTagList inv = nbt.getTagList("inventory", Constants.NBT.TAG_COMPOUND); - for (int i = 0; i < inv.tagCount(); i++) { - NBTTagCompound tagItemStack = inv.getCompoundTagAt(i); - ItemStack item = GT_Utility.loadItem(tagItemStack); - if (item != null) { - if (item.stackSize > 0) { - itemInventory.add(item); - } - } else { - GT_Mod.GT_FML_LOGGER.warn( - "An error occurred while loading contents of ME Crafting Input Bus. This item has been voided: " - + tagItemStack); - } - } - NBTTagList fluidInv = nbt.getTagList("fluidInventory", Constants.NBT.TAG_COMPOUND); - for (int i = 0; i < fluidInv.tagCount(); i++) { - NBTTagCompound tagFluidStack = fluidInv.getCompoundTagAt(i); - FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagFluidStack); - if (fluid != null) { - if (fluid.amount > 0) { - fluidInventory.add(fluid); - } - } else { - GT_Mod.GT_FML_LOGGER.warn( - "An error occurred while loading contents of ME Crafting Input Bus. This fluid has been voided: " - + tagFluidStack); - } - } - } - - public boolean hasChanged(ItemStack newPattern, World world) { - return newPattern == null - || (!ItemStack.areItemStacksEqual(pattern, newPattern) && !this.patternDetails.equals( - ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem())) - .getPatternForItem(newPattern, world))); - } - - public void updateSlotItems() { - for (int i = itemInventory.size() - 1; i >= 0; i--) { - ItemStack itemStack = itemInventory.get(i); - if (itemStack == null || itemStack.stackSize <= 0) { - itemInventory.remove(i); - } - } - } - - public void updateSlotFluids() { - for (int i = fluidInventory.size() - 1; i >= 0; i--) { - FluidStack fluidStack = fluidInventory.get(i); - if (fluidStack == null || fluidStack.amount <= 0) { - fluidInventory.remove(i); - } - } - } - - public boolean isItemEmpty() { - updateSlotItems(); - return itemInventory.isEmpty() && sharedItemGetter.getSharedItem().length == 0; - } - - public boolean isFluidEmpty() { - updateSlotFluids(); - return fluidInventory.isEmpty(); - } - - public boolean isEmpty() { - return isItemEmpty() && isFluidEmpty(); - } - - @Override - public ItemStack[] getItemInputs() { - if (isItemEmpty()) return new ItemStack[0]; - return ArrayUtils.addAll(itemInventory.toArray(new ItemStack[0]), sharedItemGetter.getSharedItem()); - } - - @Override - public FluidStack[] getFluidInputs() { - if (isFluidEmpty()) return new FluidStack[0]; - return fluidInventory.toArray(new FluidStack[0]); - } - - public ICraftingPatternDetails getPatternDetails() { - return patternDetails; - } - - public void refund(AENetworkProxy proxy, BaseActionSource src) throws GridAccessException { - IMEMonitor sg = proxy.getStorage() - .getItemInventory(); - for (ItemStack itemStack : itemInventory) { - if (itemStack == null || itemStack.stackSize == 0) continue; - IAEItemStack rest = Platform.poweredInsert( - proxy.getEnergy(), - sg, - AEApi.instance() - .storage() - .createItemStack(itemStack), - src); - itemStack.stackSize = rest != null && rest.getStackSize() > 0 ? (int) rest.getStackSize() : 0; - } - IMEMonitor fsg = proxy.getStorage() - .getFluidInventory(); - for (FluidStack fluidStack : fluidInventory) { - if (fluidStack == null || fluidStack.amount == 0) continue; - IAEFluidStack rest = Platform.poweredInsert( - proxy.getEnergy(), - fsg, - AEApi.instance() - .storage() - .createFluidStack(fluidStack), - src); - fluidStack.amount = rest != null && rest.getStackSize() > 0 ? (int) rest.getStackSize() : 0; - } - } - - private void insertItem(ItemStack inserted) { - for (ItemStack itemStack : itemInventory) { - if (GT_Utility.areStacksEqual(inserted, itemStack)) { - if (itemStack.stackSize > Integer.MAX_VALUE - inserted.stackSize) { - inserted.stackSize -= Integer.MAX_VALUE - itemStack.stackSize; - itemStack.stackSize = Integer.MAX_VALUE; - } else { - itemStack.stackSize += inserted.stackSize; - return; - } - } - } - if (inserted.stackSize > 0) { - itemInventory.add(inserted); - } - } - - private void insertFluid(FluidStack inserted) { - for (FluidStack fluidStack : fluidInventory) { - if (GT_Utility.areFluidsEqual(inserted, fluidStack)) { - if (fluidStack.amount > Integer.MAX_VALUE - inserted.amount) { - inserted.amount -= Integer.MAX_VALUE - fluidStack.amount; - fluidStack.amount = Integer.MAX_VALUE; - } else { - fluidStack.amount += inserted.amount; - return; - } - } - } - if (inserted.amount > 0) { - fluidInventory.add(inserted); - } - } - - public boolean insertItemsAndFluids(InventoryCrafting inventoryCrafting) { - for (int i = 0; i < inventoryCrafting.getSizeInventory(); ++i) { - ItemStack itemStack = inventoryCrafting.getStackInSlot(i); - if (itemStack == null) continue; - - if (itemStack.getItem() instanceof ItemFluidPacket) { // insert fluid - FluidStack fluidStack = ItemFluidPacket.getFluidStack(itemStack); - if (fluidStack != null) insertFluid(fluidStack); - } else { // insert item - insertItem(itemStack); - } - } - return true; - } - - public NBTTagCompound writeToNBT(NBTTagCompound nbt) { - nbt.setTag("pattern", pattern.writeToNBT(new NBTTagCompound())); - - NBTTagList itemInventoryNbt = new NBTTagList(); - for (ItemStack itemStack : this.itemInventory) { - itemInventoryNbt.appendTag(GT_Utility.saveItem(itemStack)); - } - nbt.setTag("inventory", itemInventoryNbt); - - NBTTagList fluidInventoryNbt = new NBTTagList(); - for (FluidStack fluidStack : fluidInventory) { - fluidInventoryNbt.appendTag(fluidStack.writeToNBT(new NBTTagCompound())); - } - nbt.setTag("fluidInventory", fluidInventoryNbt); - - return nbt; - } - } - - // mInventory is used for storing patterns, circuit and manual slot (typically NC items) - private static final int MAX_PATTERN_COUNT = 4 * 9; - private static final int SLOT_MANUAL_SIZE = 9; - private static final int MAX_INV_COUNT = MAX_PATTERN_COUNT + SLOT_MANUAL_SIZE + 1; - private static final int SLOT_CIRCUIT = MAX_PATTERN_COUNT; - private static final int SLOT_MANUAL_START = SLOT_CIRCUIT + 1; - private static final int MANUAL_SLOT_WINDOW = 10; - private BaseActionSource requestSource = null; - private @Nullable AENetworkProxy gridProxy = null; - - // holds all internal inventories - private PatternSlot[] internalInventory = new PatternSlot[MAX_PATTERN_COUNT]; - - // a hash map for faster lookup of pattern slots, not necessarily all valid. - private Map patternDetailsPatternSlotMap = new HashMap<>(MAX_PATTERN_COUNT); - - private boolean needPatternSync = true; - private boolean justHadNewItems = false; - - private String customName = null; - private boolean supportFluids; - private boolean additionalConnection = false; - - public GT_MetaTileEntity_Hatch_CraftingInput_ME(int aID, String aName, String aNameRegional, - boolean supportFluids) { - super( - aID, - aName, - aNameRegional, - supportFluids ? 11 : 6, - MAX_INV_COUNT, - new String[] { "Advanced item input for Multiblocks", - "Hatch Tier: " + TIER_COLORS[supportFluids ? 11 : 6] + VN[supportFluids ? 11 : 6], - "Processes patterns directly from ME", - supportFluids ? "It supports patterns including fluids" - : "It does not support patterns including fluids", - "Change ME connection behavior by right-clicking with wire cutter" }); - disableSort = true; - this.supportFluids = supportFluids; - } - - public GT_MetaTileEntity_Hatch_CraftingInput_ME(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures, boolean supportFluids) { - super(aName, aTier, MAX_INV_COUNT, aDescription, aTextures); - this.supportFluids = supportFluids; - disableSort = true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_CraftingInput_ME(mName, mTier, mDescriptionArray, mTextures, supportFluids); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return getTexturesInactive(aBaseTexture); - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, - TextureFactory.of(supportFluids ? OVERLAY_ME_CRAFTING_INPUT_BUFFER : OVERLAY_ME_CRAFTING_INPUT_BUS) }; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - super.onPostTick(aBaseMetaTileEntity, aTimer); - - if (getBaseMetaTileEntity().isServerSide()) { - if (needPatternSync && aTimer % 10 == 0) { - needPatternSync = !postMEPatternChange(); - } - if (aTimer % 20 == 0) { - getBaseMetaTileEntity().setActive(isActive()); - } - } - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - getProxy().onReady(); - } - - @Override - public IGridNode getGridNode(ForgeDirection dir) { - return getProxy().getNode(); - } - - @Override - public AECableType getCableConnectionType(ForgeDirection forgeDirection) { - return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; - } - - private void updateValidGridProxySides() { - if (additionalConnection) { - getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); - } else { - getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); - } - } - - @Override - public void onFacingChange() { - updateValidGridProxySides(); - } - - @Override - public void securityBreak() {} - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - additionalConnection = !additionalConnection; - updateValidGridProxySides(); - aPlayer.addChatComponentMessage( - new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); - return true; - } - - @Override - public AENetworkProxy getProxy() { - if (gridProxy == null) { - gridProxy = new AENetworkProxy(this, "proxy", ItemList.Hatch_CraftingInput_Bus_ME.get(1), true); - gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); - updateValidGridProxySides(); - if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( - getBaseMetaTileEntity().getWorld() - .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); - } - - return this.gridProxy; - } - - @Override - public DimensionalCoord getLocation() { - return new DimensionalCoord( - getBaseMetaTileEntity().getWorld(), - getBaseMetaTileEntity().getXCoord(), - getBaseMetaTileEntity().getYCoord(), - getBaseMetaTileEntity().getZCoord()); - } - - @Override - public int rows() { - return 4; - } - - @Override - public int rowSize() { - return 9; - } - - @Override - public IInventory getPatterns() { - return this; - } - - @Override - public String getName() { - if (hasCustomName()) { - return getCustomName(); - } - StringBuilder name = new StringBuilder(); - if (getCrafterIcon() != null) { - name.append(getCrafterIcon().getDisplayName()); - } else { - name.append(getLocalName()); - } - - if (mInventory[SLOT_CIRCUIT] != null) { - name.append(" - "); - name.append(mInventory[SLOT_CIRCUIT].getItemDamage()); - } - if (mInventory[SLOT_MANUAL_START] != null) { - name.append(" - "); - name.append(mInventory[SLOT_MANUAL_START].getDisplayName()); - } - return name.toString(); - } - - @Override - public TileEntity getTileEntity() { - return (TileEntity) getBaseMetaTileEntity(); - } - - @Override - public boolean shouldDisplay() { - return true; - } - - @Override - public void gridChanged() { - needPatternSync = true; - } - - @Override - public boolean isPowered() { - return getProxy() != null && getProxy().isPowered(); - } - - @Override - public boolean isActive() { - return getProxy() != null && getProxy().isActive(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - - // save internalInventory - NBTTagList internalInventoryNBT = new NBTTagList(); - for (int i = 0; i < internalInventory.length; i++) { - if (internalInventory[i] != null) { - NBTTagCompound internalInventorySlotNBT = new NBTTagCompound(); - internalInventorySlotNBT.setInteger("patternSlot", i); - internalInventorySlotNBT - .setTag("patternSlotNBT", internalInventory[i].writeToNBT(new NBTTagCompound())); - internalInventoryNBT.appendTag(internalInventorySlotNBT); - } - } - aNBT.setTag("internalInventory", internalInventoryNBT); - if (customName != null) aNBT.setString("customName", customName); - aNBT.setBoolean("additionalConnection", additionalConnection); - getProxy().writeToNBT(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - // load internalInventory - NBTTagList internalInventoryNBT = aNBT.getTagList("internalInventory", Constants.NBT.TAG_COMPOUND); - for (int i = 0; i < internalInventoryNBT.tagCount(); i++) { - NBTTagCompound internalInventorySlotNBT = internalInventoryNBT.getCompoundTagAt(i); - int patternSlot = internalInventorySlotNBT.getInteger("patternSlot"); - NBTTagCompound patternSlotNBT = internalInventorySlotNBT.getCompoundTag("patternSlotNBT"); - ItemStack pattern = ItemStack.loadItemStackFromNBT(patternSlotNBT.getCompoundTag("pattern")); - if (pattern != null) { - internalInventory[patternSlot] = new PatternSlot( - pattern, - patternSlotNBT, - getBaseMetaTileEntity().getWorld(), - this::getSharedItems); - } else { - GT_Mod.GT_FML_LOGGER.warn( - "An error occurred while loading contents of ME Crafting Input Bus. This pattern has been voided: " - + patternSlotNBT); - } - } - - // Migrate from 4x8 to 4x9 pattern inventory - int oldPatternCount = 4 * 8; - int oldSlotManual = oldPatternCount + 1; - int oldSlotCircuit = oldPatternCount; - - if (internalInventory[oldSlotManual] == null && mInventory[oldSlotManual] != null) { - mInventory[SLOT_MANUAL_START] = mInventory[oldSlotManual]; - mInventory[oldSlotManual] = null; - } - if (internalInventory[oldSlotCircuit] == null && mInventory[oldSlotCircuit] != null) { - mInventory[SLOT_CIRCUIT] = mInventory[oldSlotCircuit]; - mInventory[oldSlotCircuit] = null; - } - - // reconstruct patternDetailsPatternSlotMap - patternDetailsPatternSlotMap.clear(); - for (PatternSlot patternSlot : internalInventory) { - if (patternSlot != null) { - patternDetailsPatternSlotMap.put(patternSlot.getPatternDetails(), patternSlot); - } - } - - if (aNBT.hasKey("customName")) customName = aNBT.getString("customName"); - additionalConnection = aNBT.getBoolean("additionalConnection"); - - getProxy().readFromNBT(aNBT); - } - - @Override - public boolean isGivingInformation() { - return true; - } - - private String describePattern(ICraftingPatternDetails patternDetails) { - return Arrays.stream(patternDetails.getCondensedOutputs()) - .map( - aeItemStack -> aeItemStack.getItem() - .getItemStackDisplayName(aeItemStack.getItemStack())) - .collect(Collectors.joining(", ")); - } - - @Override - public String[] getInfoData() { - List ret = new ArrayList<>(); - ret.add( - "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" - : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET); - ret.add("Internal Inventory: "); - int i = 0; - for (PatternSlot slot : internalInventory) { - if (slot == null) continue; - IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE; - - i += 1; - ret.add( - "Slot " + i - + " " - + EnumChatFormatting.BLUE - + describePattern(slot.patternDetails) - + EnumChatFormatting.RESET); - Map itemMap = GT_Utility.convertItemListToMap(slot.itemInventory); - for (Map.Entry entry : itemMap.entrySet()) { - ItemStack item = entry.getKey() - .getItemStack(); - long amount = entry.getValue(); - ret.add( - item.getItem() - .getItemStackDisplayName(item) + ": " - + EnumChatFormatting.GOLD - + nc.toWideReadableForm(amount) - + EnumChatFormatting.RESET); - } - Map fluidMap = GT_Utility.convertFluidListToMap(slot.fluidInventory); - for (Map.Entry entry : fluidMap.entrySet()) { - FluidStack fluid = new FluidStack(entry.getKey(), 1); - long amount = entry.getValue(); - ret.add( - fluid.getLocalizedName() + ": " - + EnumChatFormatting.AQUA - + nc.toWideReadableForm(amount) - + EnumChatFormatting.RESET); - } - } - return ret.toArray(new String[0]); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public int getCircuitSlot() { - return SLOT_CIRCUIT; - } - - @Override - public int getCircuitSlotX() { - return 170; - } - - @Override - public int getCircuitSlotY() { - return 64; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public int getGUIWidth() { - return super.getGUIWidth() + 16; - } - - @Override - public void addUIWidgets(ModularWindow.@NotNull Builder builder, UIBuildContext buildContext) { - buildContext.addSyncedWindow(MANUAL_SLOT_WINDOW, this::createSlotManualWindow); - builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 9) - .startFromSlot(0) - .endAtSlot(MAX_PATTERN_COUNT - 1) - .phantom(false) - .background(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_PATTERN_ME) - .widgetCreator(slot -> new SlotWidget(slot) { - - @Override - protected ItemStack getItemStackForRendering(Slot slotIn) { - ItemStack stack = slot.getStack(); - if (stack == null || !(stack.getItem() instanceof ItemEncodedPattern patternItem)) { - return stack; - } - ItemStack output = patternItem.getOutput(stack); - return output != null ? output : stack; - } - }.setFilter(itemStack -> itemStack.getItem() instanceof ICraftingPatternItem) - .setChangeListener(() -> onPatternChange(slot.getSlotIndex(), slot.getStack()))) - .build() - .setPos(7, 9)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (clickData.mouseButton == 0) { - widget.getContext() - .openSyncedWindow(MANUAL_SLOT_WINDOW); - } - }) - .setPlayClickSound(true) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE) - .addTooltips(ImmutableList.of("Place manual items")) - .setSize(16, 16) - .setPos(170, 45)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (clickData.mouseButton == 0) { - refundAll(); - } - }) - .setPlayClickSound(true) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_EXPORT) - .addTooltips(ImmutableList.of("Return all internally stored items back to AE")) - .setSize(16, 16) - .setPos(170, 28)); - } - - @Override - public void updateSlots() { - for (int slotId = SLOT_MANUAL_START; slotId < SLOT_MANUAL_START + SLOT_MANUAL_SIZE; ++slotId) { - if (mInventory[slotId] != null && mInventory[slotId].stackSize <= 0) mInventory[slotId] = null; - } - } - - private BaseActionSource getRequest() { - if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); - return requestSource; - } - - private void onPatternChange(int index, ItemStack newItem) { - if (!getBaseMetaTileEntity().isServerSide()) return; - - World world = getBaseMetaTileEntity().getWorld(); - - // remove old if applicable - PatternSlot originalPattern = internalInventory[index]; - if (originalPattern != null) { - if (originalPattern.hasChanged(newItem, world)) { - try { - originalPattern.refund(getProxy(), getRequest()); - } catch (GridAccessException ignored) {} - internalInventory[index] = null; - needPatternSync = true; - } else { - return; // nothing has changed - } - } - - // original does not exist or has changed - if (newItem == null || !(newItem.getItem() instanceof ICraftingPatternItem)) return; - - PatternSlot patternSlot = new PatternSlot(newItem, world, this::getSharedItems); - internalInventory[index] = patternSlot; - patternDetailsPatternSlotMap.put(patternSlot.getPatternDetails(), patternSlot); - - needPatternSync = true; - } - - public ItemStack[] getSharedItems() { - ItemStack[] sharedItems = new ItemStack[SLOT_MANUAL_SIZE + 1]; - sharedItems[0] = mInventory[SLOT_CIRCUIT]; - System.arraycopy(mInventory, SLOT_MANUAL_START, sharedItems, 1, SLOT_MANUAL_SIZE); - return ArrayExt.withoutNulls(sharedItems, ItemStack[]::new); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - NBTTagCompound tag = accessor.getNBTData(); - if (tag.hasKey("name")) - currenttip.add(EnumChatFormatting.AQUA + tag.getString("name") + EnumChatFormatting.RESET); - if (tag.hasKey("inventory")) { - NBTTagList inventory = tag.getTagList("inventory", Constants.NBT.TAG_COMPOUND); - for (int i = 0; i < inventory.tagCount(); ++i) { - NBTTagCompound item = inventory.getCompoundTagAt(i); - String name = item.getString("name"); - long amount = item.getLong("amount"); - currenttip.add( - name + ": " - + EnumChatFormatting.GOLD - + ReadableNumberConverter.INSTANCE.toWideReadableForm(amount) - + EnumChatFormatting.RESET); - } - } - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - - NBTTagList inventory = new NBTTagList(); - HashMap nameToAmount = new HashMap<>(); - for (Iterator it = inventories(); it.hasNext();) { - PatternSlot i = it.next(); - for (ItemStack item : i.itemInventory) { - if (item != null && item.stackSize > 0) { - String name = item.getDisplayName(); - nameToAmount.merge(name, (long) item.stackSize, Long::sum); - } - } - for (FluidStack fluid : i.fluidInventory) { - if (fluid != null && fluid.amount > 0) { - String name = fluid.getLocalizedName(); - nameToAmount.merge(name, (long) fluid.amount, Long::sum); - } - } - } - for (Map.Entry entry : nameToAmount.entrySet()) { - NBTTagCompound item = new NBTTagCompound(); - item.setString("name", entry.getKey()); - item.setLong("amount", entry.getValue()); - inventory.appendTag(item); - } - - tag.setTag("inventory", inventory); - if (!Objects.equals(getName(), getLocalName())) { - tag.setString("name", getName()); - } - super.getWailaNBTData(player, tile, tag, world, x, y, z); - } - - @Override - public void provideCrafting(ICraftingProviderHelper craftingTracker) { - if (!isActive()) return; - - for (PatternSlot slot : internalInventory) { - if (slot == null) continue; - ICraftingPatternDetails details = slot.getPatternDetails(); - if (details == null) { - GT_Mod.GT_FML_LOGGER.warn( - "Found an invalid pattern at " + getBaseMetaTileEntity().getCoords() - + " in dim " - + getBaseMetaTileEntity().getWorld().provider.dimensionId); - continue; - } - craftingTracker.addCraftingOption(this, details); - } - } - - @Override - public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table) { - if (!isActive()) return false; - - if (!supportFluids) { - for (int i = 0; i < table.getSizeInventory(); ++i) { - ItemStack itemStack = table.getStackInSlot(i); - if (itemStack == null) continue; - if (itemStack.getItem() instanceof ItemFluidPacket) return false; - } - } - if (!patternDetailsPatternSlotMap.get(patternDetails) - .insertItemsAndFluids(table)) { - return false; - } - justHadNewItems = true; - return true; - } - - @Override - public boolean isBusy() { - return false; - } - - @Override - public Iterator inventories() { - return Arrays.stream(internalInventory) - .filter(Objects::nonNull) - .iterator(); - } - - @Override - public void onBlockDestroyed() { - refundAll(); - super.onBlockDestroyed(); - } - - private void refundAll() { - for (PatternSlot slot : internalInventory) { - if (slot == null) continue; - try { - slot.refund(getProxy(), getRequest()); - } catch (GridAccessException ignored) {} - } - } - - @Override - public boolean justUpdated() { - boolean ret = justHadNewItems; - justHadNewItems = false; - return ret; - } - - @Override - public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!(aPlayer instanceof EntityPlayerMP)) return; - - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; - - NBTTagCompound tag = new NBTTagCompound(); - tag.setString("type", "CraftingInputBuffer"); - tag.setInteger("x", aBaseMetaTileEntity.getXCoord()); - tag.setInteger("y", aBaseMetaTileEntity.getYCoord()); - tag.setInteger("z", aBaseMetaTileEntity.getZCoord()); - - dataStick.stackTagCompound = tag; - dataStick.setStackDisplayName( - "Crafting Input Buffer Link Data Stick (" + aBaseMetaTileEntity - .getXCoord() + ", " + aBaseMetaTileEntity.getYCoord() + ", " + aBaseMetaTileEntity.getZCoord() + ")"); - aPlayer.addChatMessage(new ChatComponentText("Saved Link Data to Data Stick")); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - final ItemStack is = aPlayer.inventory.getCurrentItem(); - if (is != null && is.getItem() instanceof ToolQuartzCuttingKnife) { - if (ForgeEventFactory.onItemUseStart(aPlayer, is, 1) <= 0) return false; - IGregTechTileEntity te = getBaseMetaTileEntity(); - aPlayer.openGui( - AppEng.instance(), - GuiBridge.GUI_RENAMER.ordinal() << 5 | (side.ordinal()), - te.getWorld(), - te.getXCoord(), - te.getYCoord(), - te.getZCoord()); - return true; - } - return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); - } - - @Override - public ItemStack getCrafterIcon() { - return getMachineCraftingIcon(); - } - - private boolean postMEPatternChange() { - // don't post until it's active - if (!getProxy().isActive()) return false; - try { - getProxy().getGrid() - .postEvent(new MENetworkCraftingPatternChange(this, getProxy().getNode())); - } catch (GridAccessException ignored) { - return false; - } - return true; - } - - protected ModularWindow createSlotManualWindow(final EntityPlayer player) { - final int WIDTH = 68; - final int HEIGHT = 68; - final int PARENT_WIDTH = getGUIWidth(); - final int PARENT_HEIGHT = getGUIHeight(); - ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.setGuiTint(getGUIColorization()); - builder.setDraggable(true); - // make sure the manual window is within the parent window - // otherwise picking up manual items would toss them - // See GuiContainer.java flag1 - builder.setPos( - (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) - .add(Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)))); - builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 3) - .startFromSlot(SLOT_MANUAL_START) - .endAtSlot(SLOT_MANUAL_START + SLOT_MANUAL_SIZE - 1) - .phantom(false) - .background(getGUITextureSet().getItemSlot()) - .build() - .setPos(7, 7)); - return builder.build(); - } - - @Override - public void setInventorySlotContents(int aIndex, ItemStack aStack) { - super.setInventorySlotContents(aIndex, aStack); - if (aIndex >= MAX_PATTERN_COUNT) return; - onPatternChange(aIndex, aStack); - needPatternSync = true; - } - - @Override - public String getCustomName() { - return customName; - } - - @Override - public boolean hasCustomName() { - return customName != null; - } - - @Override - public void setCustomName(String name) { - customName = name; - } - - @Override - public Optional getFirstNonEmptyInventory() { - for (PatternSlot slot : internalInventory) { - if (slot != null && !slot.isEmpty()) return Optional.of(slot); - } - return Optional.empty(); - } - - @Override - public boolean supportsFluids() { - return this.supportFluids; - } - - @Override - public List getItemsForHoloGlasses() { - List list = new ArrayList<>(); - for (PatternSlot slot : internalInventory) { - if (slot == null) continue; - - IAEItemStack[] outputs = slot.getPatternDetails() - .getCondensedOutputs(); - list.add(outputs[0].getItemStack()); - } - return list; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java deleted file mode 100644 index 6dede1bea5..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java +++ /dev/null @@ -1,262 +0,0 @@ -package gregtech.common.tileentities.machines; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_SLAVE; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.ItemList; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.api.render.TextureFactory; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_Hatch_CraftingInput_Slave extends GT_MetaTileEntity_Hatch_InputBus - implements IDualInputHatch { - - private GT_MetaTileEntity_Hatch_CraftingInput_ME master; // use getMaster() to access - private int masterX, masterY, masterZ; - private boolean masterSet = false; // indicate if values of masterX, masterY, masterZ are valid - - public GT_MetaTileEntity_Hatch_CraftingInput_Slave(int aID, String aName, String aNameRegional) { - super( - aID, - aName, - aNameRegional, - 6, - 0, - new String[] { "Proxy for Crafting Input Buffer/Bus", - "Link with Crafting Input Buffer/Bus using Data Stick to share inventory", - "Left click on the Crafting Input Buffer/Bus, then right click on this block to link them", }); - disableSort = true; - } - - public GT_MetaTileEntity_Hatch_CraftingInput_Slave(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - disableSort = true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_CraftingInput_Slave(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return getTexturesInactive(aBaseTexture); - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_CRAFTING_INPUT_SLAVE) }; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - super.onPostTick(aBaseMetaTileEntity, aTimer); - if (aTimer % 100 == 0 && masterSet && getMaster() == null) { - trySetMasterFromCoord(masterX, masterY, masterZ); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - - if (aNBT.hasKey("master")) { - NBTTagCompound masterNBT = aNBT.getCompoundTag("master"); - masterX = masterNBT.getInteger("x"); - masterY = masterNBT.getInteger("y"); - masterZ = masterNBT.getInteger("z"); - masterSet = true; - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (masterSet) { - NBTTagCompound masterNBT = new NBTTagCompound(); - masterNBT.setInteger("x", masterX); - masterNBT.setInteger("y", masterY); - masterNBT.setInteger("z", masterZ); - aNBT.setTag("master", masterNBT); - } - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - var ret = new ArrayList(); - if (getMaster() != null) { - ret.add( - "This bus is linked to the Crafting Input Buffer at " + masterX - + ", " - + masterY - + ", " - + masterZ - + "."); - ret.addAll(Arrays.asList(getMaster().getInfoData())); - } else ret.add("This bus is not linked to any Crafting Input Buffer."); - return ret.toArray(new String[0]); - } - - public GT_MetaTileEntity_Hatch_CraftingInput_ME getMaster() { - if (master == null) return null; - if (master.getBaseMetaTileEntity() == null) { // master disappeared - master = null; - } - return master; - } - - @Override - public byte getTierForStructure() { - return getMaster() == null ? super.getTierForStructure() : getMaster().getTierForStructure(); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public Iterator inventories() { - return getMaster() != null ? getMaster().inventories() : Collections.emptyIterator(); - } - - @Override - public Optional getFirstNonEmptyInventory() { - return getMaster() != null ? getMaster().getFirstNonEmptyInventory() : Optional.empty(); - } - - @Override - public boolean supportsFluids() { - return getMaster() != null && getMaster().supportsFluids(); - } - - @Override - public boolean justUpdated() { - return getMaster() != null && getMaster().justUpdated(); - } - - public GT_MetaTileEntity_Hatch_CraftingInput_ME trySetMasterFromCoord(int x, int y, int z) { - var tileEntity = getBaseMetaTileEntity().getWorld() - .getTileEntity(x, y, z); - if (tileEntity == null) return null; - if (!(tileEntity instanceof IGregTechTileEntity gtTileEntity)) return null; - var metaTileEntity = gtTileEntity.getMetaTileEntity(); - if (!(metaTileEntity instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME)) return null; - masterX = x; - masterY = y; - masterZ = z; - masterSet = true; - master = (GT_MetaTileEntity_Hatch_CraftingInput_ME) metaTileEntity; - return master; - } - - private boolean tryLinkDataStick(EntityPlayer aPlayer) { - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { - return false; - } - if (!dataStick.hasTagCompound() || !dataStick.stackTagCompound.getString("type") - .equals("CraftingInputBuffer")) { - return false; - } - - NBTTagCompound nbt = dataStick.stackTagCompound; - int x = nbt.getInteger("x"); - int y = nbt.getInteger("y"); - int z = nbt.getInteger("z"); - if (trySetMasterFromCoord(x, y, z) != null) { - aPlayer.addChatMessage(new ChatComponentText("Link successful")); - return true; - } - aPlayer.addChatMessage(new ChatComponentText("Link failed")); - return true; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!(aPlayer instanceof EntityPlayerMP)) { - return false; - } - if (tryLinkDataStick(aPlayer)) { - return true; - } - var master = getMaster(); - if (master != null) { - return master.onRightclick(master.getBaseMetaTileEntity(), aPlayer); - } - return false; - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - NBTTagCompound tag = accessor.getNBTData(); - currenttip.add((tag.getBoolean("linked") ? "Linked" : "Not linked")); - - if (tag.hasKey("masterX")) { - currenttip.add( - "Bound to " + tag - .getInteger("masterX") + ", " + tag.getInteger("masterY") + ", " + tag.getInteger("masterZ")); - } - - if (tag.hasKey("masterName")) { - currenttip.add(EnumChatFormatting.GOLD + tag.getString("masterName") + EnumChatFormatting.RESET); - } - - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - - tag.setBoolean("linked", getMaster() != null); - if (masterSet) { - tag.setInteger("masterX", masterX); - tag.setInteger("masterY", masterY); - tag.setInteger("masterZ", masterZ); - } - if (getMaster() != null) tag.setString("masterName", getMaster().getName()); - - super.getWailaNBTData(player, tile, tag, world, x, y, z); - } - - @Override - public List getItemsForHoloGlasses() { - return getMaster() != null ? getMaster().getItemsForHoloGlasses() : null; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java deleted file mode 100644 index 36b20acc55..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java +++ /dev/null @@ -1,887 +0,0 @@ -package gregtech.common.tileentities.machines; - -import static gregtech.api.enums.GT_Values.TIER_COLORS; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH_ACTIVE; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.Iterator; -import java.util.List; - -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.api.math.Size; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import appeng.api.config.Actionable; -import appeng.api.config.PowerMultiplier; -import appeng.api.implementations.IPowerChannelState; -import appeng.api.networking.GridFlags; -import appeng.api.networking.security.BaseActionSource; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.MachineSource; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.util.AECableType; -import appeng.core.localization.WailaText; -import appeng.me.GridAccessException; -import appeng.me.helpers.AENetworkProxy; -import appeng.me.helpers.IGridProxyable; -import appeng.util.item.AEItemStack; -import gregtech.api.enums.ItemList; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IConfigurationCircuitSupport; -import gregtech.api.interfaces.IDataCopyable; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.gui.modularui.widget.AESlotWidget; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch_InputBus - implements IConfigurationCircuitSupport, IRecipeProcessingAwareHatch, IAddGregtechLogo, IAddUIWidgets, - IPowerChannelState, ISmartInputHatch, IDataCopyable { - - private static final int SLOT_COUNT = 16; - public static final String COPIED_DATA_IDENTIFIER = "stockingBus"; - private BaseActionSource requestSource = null; - private @Nullable AENetworkProxy gridProxy = null; - private final ItemStack[] shadowInventory = new ItemStack[SLOT_COUNT]; - private final int[] savedStackSizes = new int[SLOT_COUNT]; - private boolean processingRecipe = false; - private final boolean autoPullAvailable; - private boolean autoPullItemList = false; - private int minAutoPullStackSize = 1; - private int autoPullRefreshTime = 100; - private static final int CONFIG_WINDOW_ID = 10; - private boolean additionalConnection = false; - private boolean justHadNewItems = false; - private boolean expediteRecipeCheck = false; - - public GT_MetaTileEntity_Hatch_InputBus_ME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) { - super( - aID, - aName, - aNameRegional, - autoPullAvailable ? 6 : 3, - SLOT_COUNT * 2 + 2, - getDescriptionArray(autoPullAvailable)); - this.autoPullAvailable = autoPullAvailable; - disableSort = true; - } - - public GT_MetaTileEntity_Hatch_InputBus_ME(String aName, boolean autoPullAvailable, int aTier, - String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, SLOT_COUNT * 2 + 2, aDescription, aTextures); - this.autoPullAvailable = autoPullAvailable; - disableSort = true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_InputBus_ME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_HATCH_ACTIVE) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_HATCH) }; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - if (getBaseMetaTileEntity().isServerSide()) { - if (aTimer % autoPullRefreshTime == 0 && autoPullItemList) { - refreshItemList(); - } - if (aTimer % 20 == 0) { - getBaseMetaTileEntity().setActive(isActive()); - } - } - super.onPostTick(aBaseMetaTileEntity, aTimer); - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - getProxy().onReady(); - } - - @Override - public AECableType getCableConnectionType(ForgeDirection forgeDirection) { - return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; - } - - private void updateValidGridProxySides() { - if (additionalConnection) { - getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); - } else { - getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); - } - } - - @Override - public void onFacingChange() { - updateValidGridProxySides(); - } - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - additionalConnection = !additionalConnection; - updateValidGridProxySides(); - aPlayer.addChatComponentMessage( - new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); - return true; - } - - @Override - public AENetworkProxy getProxy() { - if (gridProxy == null) { - if (getBaseMetaTileEntity() instanceof IGridProxyable) { - gridProxy = new AENetworkProxy( - (IGridProxyable) getBaseMetaTileEntity(), - "proxy", - autoPullAvailable ? ItemList.Hatch_Input_Bus_ME_Advanced.get(1) - : ItemList.Hatch_Input_Bus_ME.get(1), - true); - gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); - updateValidGridProxySides(); - if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( - getBaseMetaTileEntity().getWorld() - .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); - } - } - return this.gridProxy; - } - - @Override - public boolean isPowered() { - return getProxy() != null && getProxy().isPowered(); - } - - @Override - public boolean isActive() { - return getProxy() != null && getProxy().isActive(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - int[] sizes = new int[16]; - for (int i = 0; i < 16; ++i) sizes[i] = mInventory[i + 16] == null ? 0 : mInventory[i + 16].stackSize; - aNBT.setIntArray("sizes", sizes); - aNBT.setBoolean("autoStock", autoPullItemList); - aNBT.setInteger("minAutoPullStackSize", minAutoPullStackSize); - aNBT.setBoolean("additionalConnection", additionalConnection); - aNBT.setBoolean("expediteRecipeCheck", expediteRecipeCheck); - aNBT.setInteger("refreshTime", autoPullRefreshTime); - getProxy().writeToNBT(aNBT); - } - - private void setAutoPullItemList(boolean pullItemList) { - if (!autoPullAvailable) { - return; - } - - autoPullItemList = pullItemList; - if (!autoPullItemList) { - for (int i = 0; i < SLOT_COUNT; i++) { - mInventory[i] = null; - } - } else { - refreshItemList(); - } - updateAllInformationSlots(); - } - - public boolean doFastRecipeCheck() { - return expediteRecipeCheck; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("sizes")) { - int[] sizes = aNBT.getIntArray("sizes"); - if (sizes.length == 16) { - for (int i = 0; i < 16; ++i) { - if (sizes[i] != 0 && mInventory[i] != null) { - ItemStack s = mInventory[i].copy(); - s.stackSize = sizes[i]; - mInventory[i + 16] = s; - } - } - } - } - autoPullItemList = aNBT.getBoolean("autoStock"); - minAutoPullStackSize = aNBT.getInteger("minAutoPullStackSize"); - additionalConnection = aNBT.getBoolean("additionalConnection"); - expediteRecipeCheck = aNBT.getBoolean("expediteRecipeCheck"); - if (aNBT.hasKey("refreshTime")) { - autoPullRefreshTime = aNBT.getInteger("refreshTime"); - } - getProxy().readFromNBT(aNBT); - - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - return new String[] { - "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" - : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET }; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!autoPullAvailable) { - return; - } - - setAutoPullItemList(!autoPullItemList); - aPlayer.addChatMessage( - new ChatComponentTranslation( - "GT5U.machines.stocking_bus.auto_pull_toggle." + (autoPullItemList ? "enabled" : "disabled"))); - } - - @Override - public void updateSlots() { - if (mInventory[getManualSlot()] != null && mInventory[getManualSlot()].stackSize <= 0) - mInventory[getManualSlot()] = null; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - if (!(aPlayer instanceof EntityPlayerMP)) - return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) - return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); - - if (!pasteCopiedData(aPlayer, dataStick.stackTagCompound)) return false; - - updateValidGridProxySides(); - aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.loaded")); - return true; - } - - @Override - public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!(aPlayer instanceof EntityPlayerMP)) return; - - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; - - dataStick.stackTagCompound = getCopiedData(aPlayer); - dataStick.setStackDisplayName("Stocking Input Bus Configuration"); - aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.saved")); - } - - @Override - public String getCopiedDataIdentifier(EntityPlayer player) { - return COPIED_DATA_IDENTIFIER; - } - - @Override - public boolean pasteCopiedData(EntityPlayer player, NBTTagCompound nbt) { - if (nbt == null || !COPIED_DATA_IDENTIFIER.equals(nbt.getString("type"))) return false; - ItemStack circuit = GT_Utility.loadItem(nbt, "circuit"); - if (GT_Utility.isStackInvalid(circuit)) circuit = null; - - if (autoPullAvailable) { - setAutoPullItemList(nbt.getBoolean("autoPull")); - minAutoPullStackSize = nbt.getInteger("minStackSize"); - // Data sticks created before refreshTime was implemented should not cause stocking buses to - // spam divide by zero errors - if (nbt.hasKey("refreshTime")) { - autoPullRefreshTime = nbt.getInteger("refreshTime"); - } - } - - additionalConnection = nbt.getBoolean("additionalConnection"); - if (!autoPullItemList) { - NBTTagList stockingItems = nbt.getTagList("itemsToStock", 10); - for (int i = 0; i < stockingItems.tagCount(); i++) { - this.mInventory[i] = GT_Utility.loadItem(stockingItems.getCompoundTagAt(i)); - } - } - setInventorySlotContents(getCircuitSlot(), circuit); - return true; - } - - @Override - public NBTTagCompound getCopiedData(EntityPlayer player) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setString("type", COPIED_DATA_IDENTIFIER); - tag.setBoolean("autoPull", autoPullItemList); - tag.setInteger("minStackSize", minAutoPullStackSize); - tag.setInteger("refreshTime", autoPullRefreshTime); - tag.setBoolean("additionalConnection", additionalConnection); - tag.setTag("circuit", GT_Utility.saveItem(getStackInSlot(getCircuitSlot()))); - - NBTTagList stockingItems = new NBTTagList(); - - if (!autoPullItemList) { - for (int index = 0; index < SLOT_COUNT; index++) { - stockingItems.appendTag(GT_Utility.saveItem(mInventory[index])); - } - tag.setTag("itemsToStock", stockingItems); - } - return tag; - } - - private int getManualSlot() { - return SLOT_COUNT * 2 + 1; - } - - @Override - public int getCircuitSlot() { - return SLOT_COUNT * 2; - } - - @Override - public int getCircuitSlotX() { - return 80; - } - - @Override - public int getCircuitSlotY() { - return 64; - } - - @Override - public boolean setStackToZeroInsteadOfNull(int aIndex) { - return aIndex != getManualSlot(); - } - - @Override - public boolean justUpdated() { - if (expediteRecipeCheck) { - boolean ret = justHadNewItems; - justHadNewItems = false; - return ret; - } - return false; - } - - public void setRecipeCheck(boolean value) { - expediteRecipeCheck = value; - } - - @Override - public void setInventorySlotContents(int aIndex, ItemStack aStack) { - if (expediteRecipeCheck && aStack != null) { - justHadNewItems = true; - } - super.setInventorySlotContents(aIndex, aStack); - } - - @Override - public ItemStack getStackInSlot(int aIndex) { - if (!processingRecipe) return super.getStackInSlot(aIndex); - if (aIndex < 0 || aIndex > mInventory.length) return null; - if (aIndex >= SLOT_COUNT && aIndex < SLOT_COUNT * 2) - // Display slots - return null; - if (aIndex == getCircuitSlot() || aIndex == getManualSlot()) return mInventory[aIndex]; - if (mInventory[aIndex] != null) { - AENetworkProxy proxy = getProxy(); - if (proxy == null || !proxy.isActive()) { - return null; - } - try { - IMEMonitor sg = proxy.getStorage() - .getItemInventory(); - IAEItemStack request = AEItemStack.create(mInventory[aIndex]); - request.setStackSize(Integer.MAX_VALUE); - IAEItemStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource()); - if (result != null) { - this.shadowInventory[aIndex] = result.getItemStack(); - this.savedStackSizes[aIndex] = this.shadowInventory[aIndex].stackSize; - this.setInventorySlotContents(aIndex + SLOT_COUNT, this.shadowInventory[aIndex]); - return this.shadowInventory[aIndex]; - } else { - // Request failed - this.setInventorySlotContents(aIndex + SLOT_COUNT, null); - return null; - } - } catch (final GridAccessException ignored) {} - return null; - } else { - // AE available but no items requested - this.setInventorySlotContents(aIndex + SLOT_COUNT, null); - } - return mInventory[aIndex]; - } - - private BaseActionSource getRequestSource() { - if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); - return requestSource; - } - - @Override - public void onExplosion() { - for (int i = 0; i < SLOT_COUNT; i++) { - mInventory[i] = null; - } - } - - @Override - public void startRecipeProcessing() { - processingRecipe = true; - updateAllInformationSlots(); - } - - private void refreshItemList() { - AENetworkProxy proxy = getProxy(); - try { - IMEMonitor sg = proxy.getStorage() - .getItemInventory(); - Iterator iterator = sg.getStorageList() - .iterator(); - int index = 0; - while (iterator.hasNext() && index < SLOT_COUNT) { - IAEItemStack currItem = iterator.next(); - if (currItem.getStackSize() >= minAutoPullStackSize) { - ItemStack itemstack = GT_Utility.copyAmount(1, currItem.getItemStack()); - if (expediteRecipeCheck) { - ItemStack previous = this.mInventory[index]; - if (itemstack != null) { - justHadNewItems = !ItemStack.areItemStacksEqual(itemstack, previous); - } - } - this.mInventory[index] = itemstack; - index++; - } - } - for (int i = index; i < SLOT_COUNT; i++) { - mInventory[i] = null; - } - - } catch (final GridAccessException ignored) {} - } - - private void updateAllInformationSlots() { - for (int index = 0; index < SLOT_COUNT; index++) { - updateInformationSlot(index, mInventory[index]); - } - } - - @Override - public CheckRecipeResult endRecipeProcessing(GT_MetaTileEntity_MultiBlockBase controller) { - CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.SUCCESSFUL; - for (int i = 0; i < SLOT_COUNT; ++i) { - if (savedStackSizes[i] != 0) { - ItemStack oldStack = shadowInventory[i]; - if (oldStack == null || oldStack.stackSize < savedStackSizes[i]) { - AENetworkProxy proxy = getProxy(); - try { - IMEMonitor sg = proxy.getStorage() - .getItemInventory(); - IAEItemStack request = AEItemStack.create(mInventory[i]); - int toExtract = savedStackSizes[i] - (oldStack == null ? 0 : oldStack.stackSize); - request.setStackSize(toExtract); - IAEItemStack result = sg.extractItems(request, Actionable.MODULATE, getRequestSource()); - proxy.getEnergy() - .extractAEPower(request.getStackSize(), Actionable.MODULATE, PowerMultiplier.CONFIG); - setInventorySlotContents(i + SLOT_COUNT, oldStack); - if (result == null || result.getStackSize() != toExtract) { - controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); - checkRecipeResult = SimpleCheckRecipeResult - .ofFailurePersistOnShutdown("stocking_bus_fail_extraction"); - } - } catch (final GridAccessException ignored) { - controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); - checkRecipeResult = SimpleCheckRecipeResult - .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction"); - } - } - savedStackSizes[i] = 0; - shadowInventory[i] = null; - if (mInventory[i + SLOT_COUNT] != null && mInventory[i + SLOT_COUNT].stackSize <= 0) { - mInventory[i + SLOT_COUNT] = null; - } - } - } - processingRecipe = false; - return checkRecipeResult; - } - - /** - * Update the right side of the GUI, which shows the amounts of items set on the left side - */ - public ItemStack updateInformationSlot(int aIndex, ItemStack aStack) { - if (aIndex >= 0 && aIndex < SLOT_COUNT) { - if (aStack == null) { - super.setInventorySlotContents(aIndex + SLOT_COUNT, null); - } else { - AENetworkProxy proxy = getProxy(); - if (!proxy.isActive()) { - super.setInventorySlotContents(aIndex + SLOT_COUNT, null); - return null; - } - try { - IMEMonitor sg = proxy.getStorage() - .getItemInventory(); - IAEItemStack request = AEItemStack.create(mInventory[aIndex]); - request.setStackSize(Integer.MAX_VALUE); - IAEItemStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource()); - ItemStack s = (result != null) ? result.getItemStack() : null; - // We want to track changes in any ItemStack to notify any connected controllers to make a recipe - // check early - if (expediteRecipeCheck) { - ItemStack previous = getStackInSlot(aIndex + SLOT_COUNT); - if (s != null) { - justHadNewItems = !ItemStack.areItemStacksEqual(s, previous); - } - } - setInventorySlotContents(aIndex + SLOT_COUNT, s); - return s; - } catch (final GridAccessException ignored) {} - } - } - return null; - } - - /** - * Used to avoid slot update. - */ - public ItemStack getShadowItemStack(int index) { - if (index < 0 || index >= shadowInventory.length) { - return null; - } - return shadowInventory[index]; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex == getManualSlot(); - } - - @Override - public int getGUIHeight() { - return 179; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - final SlotWidget[] aeSlotWidgets = new SlotWidget[16]; - - if (autoPullAvailable) { - buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow); - } - - builder.widget( - SlotGroup.ofItemHandler(inventoryHandler, 4) - .startFromSlot(0) - .endAtSlot(15) - .phantom(true) - .slotCreator(index -> new BaseSlot(inventoryHandler, index, true) { - - @Override - public boolean isEnabled() { - return !autoPullItemList && super.isEnabled(); - } - }) - .widgetCreator(slot -> (SlotWidget) new SlotWidget(slot) { - - @Override - protected void phantomClick(ClickData clickData, ItemStack cursorStack) { - if (clickData.mouseButton != 0 || !getMcSlot().isEnabled()) return; - final int aSlotIndex = getMcSlot().getSlotIndex(); - if (cursorStack == null) { - getMcSlot().putStack(null); - } else { - if (containsSuchStack(cursorStack)) return; - getMcSlot().putStack(GT_Utility.copyAmount(1, cursorStack)); - } - if (getBaseMetaTileEntity().isServerSide()) { - final ItemStack newInfo = updateInformationSlot(aSlotIndex, cursorStack); - aeSlotWidgets[getMcSlot().getSlotIndex()].getMcSlot() - .putStack(newInfo); - } - } - - @Override - public IDrawable[] getBackground() { - IDrawable slot; - if (autoPullItemList) { - slot = GT_UITextures.SLOT_DARK_GRAY; - } else { - slot = ModularUITextures.ITEM_SLOT; - } - return new IDrawable[] { slot, GT_UITextures.OVERLAY_SLOT_ARROW_ME }; - } - - @Override - public List getExtraTooltip() { - if (autoPullItemList) { - return Collections.singletonList( - StatCollector.translateToLocal("GT5U.machines.stocking_bus.cannot_set_slot")); - } else { - return Collections - .singletonList(StatCollector.translateToLocal("modularui.phantom.single.clear")); - } - } - - private boolean containsSuchStack(ItemStack tStack) { - for (int i = 0; i < 16; ++i) { - if (GT_Utility.areStacksEqual(mInventory[i], tStack, false)) return true; - } - return false; - } - }.dynamicTooltip(() -> { - if (autoPullItemList) { - return Collections.singletonList( - StatCollector.translateToLocal("GT5U.machines.stocking_bus.cannot_set_slot")); - } else { - return Collections.emptyList(); - } - }) - .setUpdateTooltipEveryTick(true)) - .build() - .setPos(7, 9)) - .widget( - SlotGroup.ofItemHandler(inventoryHandler, 4) - .startFromSlot(16) - .endAtSlot(31) - .phantom(true) - .background(GT_UITextures.SLOT_DARK_GRAY) - .widgetCreator( - slot -> aeSlotWidgets[slot.getSlotIndex() - 16] = new AESlotWidget(slot).disableInteraction()) - .build() - .setPos(97, 9)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_DOUBLE) - .setPos(82, 30) - .setSize(12, 12)); - - if (autoPullAvailable) { - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (clickData.mouseButton == 0) { - setAutoPullItemList(!autoPullItemList); - } else if (clickData.mouseButton == 1 && !widget.isClient()) { - widget.getContext() - .openSyncedWindow(CONFIG_WINDOW_ID); - } - }) - .setBackground(() -> { - if (autoPullItemList) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME }; - } else { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME_DISABLED }; - } - }) - .addTooltips( - Arrays.asList( - StatCollector.translateToLocal("GT5U.machines.stocking_bus.auto_pull.tooltip.1"), - StatCollector.translateToLocal("GT5U.machines.stocking_bus.auto_pull.tooltip.2"))) - .setSize(16, 16) - .setPos(80, 10)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullItemList, this::setAutoPullItemList)); - } - - builder.widget(TextWidget.dynamicString(() -> { - boolean isActive = isActive(); - boolean isPowered = isPowered(); - boolean isBooting = isBooting(); - EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN : EnumChatFormatting.DARK_RED; - return color + WailaText.getPowerState(isActive, isPowered, isBooting); - }) - .setTextAlignment(Alignment.Center) - .setSize(90, 9) - .setPos(43, 84)) - .widget( - new SlotWidget(inventoryHandler, getManualSlot()) - // ghost slots are prioritized over manual slot - .setShiftClickPriority(11) - .setPos(79, 45)); - } - - protected ModularWindow createStackSizeConfigurationWindow(final EntityPlayer player) { - final int WIDTH = 78; - final int HEIGHT = 115; - final int PARENT_WIDTH = getGUIWidth(); - final int PARENT_HEIGHT = getGUIHeight(); - ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.setGuiTint(getGUIColorization()); - builder.setDraggable(true); - builder.setPos( - (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) - .add( - Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) - .add(WIDTH - 3, 0))); - builder.widget( - TextWidget.localised("GT5U.machines.stocking_bus.min_stack_size") - .setPos(3, 2) - .setSize(74, 14)) - .widget( - new NumericWidget().setSetter(val -> minAutoPullStackSize = (int) val) - .setGetter(() -> minAutoPullStackSize) - .setBounds(1, Integer.MAX_VALUE) - .setScrollValues(1, 4, 64) - .setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal) - .setSize(70, 18) - .setPos(3, 18) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)); - builder.widget( - TextWidget.localised("GT5U.machines.stocking_bus.refresh_time") - .setPos(3, 42) - .setSize(74, 14)) - .widget( - new NumericWidget().setSetter(val -> autoPullRefreshTime = (int) val) - .setGetter(() -> autoPullRefreshTime) - .setBounds(1, Integer.MAX_VALUE) - .setScrollValues(1, 4, 64) - .setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal) - .setSize(70, 18) - .setPos(3, 58) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)); - builder.widget( - TextWidget.localised("GT5U.machines.stocking_bus.force_check") - .setPos(3, 88) - .setSize(50, 14)) - .widget( - new CycleButtonWidget().setToggle(() -> expediteRecipeCheck, val -> setRecipeCheck(val)) - .setTextureGetter( - state -> expediteRecipeCheck ? GT_UITextures.OVERLAY_BUTTON_CHECKMARK - : GT_UITextures.OVERLAY_BUTTON_CROSS) - .setBackground(GT_UITextures.BUTTON_STANDARD) - .setPos(53, 87) - .setSize(16, 16) - .addTooltip(StatCollector.translateToLocal("GT5U.machines.stocking_bus.hatch_warning"))); - return builder.build(); - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(80, 63)); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - if (!autoPullAvailable) { - super.getWailaBody(itemStack, currenttip, accessor, config); - return; - } - - NBTTagCompound tag = accessor.getNBTData(); - boolean autopull = tag.getBoolean("autoPull"); - int minSize = tag.getInteger("minStackSize"); - currenttip.add( - StatCollector.translateToLocal("GT5U.waila.stocking_bus.auto_pull." + (autopull ? "enabled" : "disabled"))); - if (autopull) { - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.stocking_bus.min_stack_size", - GT_Utility.formatNumbers(minSize))); - } - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - if (!autoPullAvailable) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - return; - } - - tag.setBoolean("autoPull", autoPullItemList); - tag.setInteger("minStackSize", minAutoPullStackSize); - super.getWailaNBTData(player, tile, tag, world, x, y, z); - } - - private static String[] getDescriptionArray(boolean autoPullAvailable) { - List strings = new ArrayList<>(8); - strings.add("Advanced item input for Multiblocks"); - strings.add("Hatch Tier: " + TIER_COLORS[autoPullAvailable ? 6 : 3] + VN[autoPullAvailable ? 6 : 3]); - strings.add("Retrieves directly from ME"); - strings.add("Keeps 16 item types in stock"); - - if (autoPullAvailable) { - strings.add( - "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds."); - strings.add("Toggle by right-clicking with screwdriver, or use the GUI."); - strings.add( - "Use the GUI to limit the minimum stack size for Auto-Pulling, adjust the slot refresh timer and enable fast recipe checks."); - strings.add("WARNING: Fast recipe checks can be laggy. Use with caution."); - } - - strings.add("Change ME connection behavior by right-clicking with wire cutter."); - strings.add("Configuration data can be copy+pasted using a data stick."); - return strings.toArray(new String[0]); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java deleted file mode 100644 index d59dbb9ce8..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java +++ /dev/null @@ -1,949 +0,0 @@ -package gregtech.common.tileentities.machines; - -import static gregtech.api.enums.GT_Values.TIER_COLORS; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.drawable.Text; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.math.Size; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.api.widget.Interactable; -import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import appeng.api.config.Actionable; -import appeng.api.config.PowerMultiplier; -import appeng.api.implementations.IPowerChannelState; -import appeng.api.networking.GridFlags; -import appeng.api.networking.security.BaseActionSource; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.MachineSource; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.util.AECableType; -import appeng.core.localization.WailaText; -import appeng.me.GridAccessException; -import appeng.me.helpers.AENetworkProxy; -import appeng.me.helpers.IGridProxyable; -import appeng.util.item.AEFluidStack; -import gregtech.api.enums.ItemList; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IDataCopyable; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_Input implements IPowerChannelState, - IAddGregtechLogo, IAddUIWidgets, IRecipeProcessingAwareHatch, ISmartInputHatch, IDataCopyable { - - private static final int SLOT_COUNT = 16; - public static final String COPIED_DATA_IDENTIFIER = "stockingHatch"; - - protected final FluidStack[] storedFluids = new FluidStack[SLOT_COUNT]; - protected final FluidStack[] storedInformationFluids = new FluidStack[SLOT_COUNT]; - - // these two fields should ALWAYS be mutated simultaneously - // in most cases, you should call setSavedFluid() instead of trying to write to the array directly - // a desync of these two fields can lead to catastrophe - protected final FluidStack[] shadowStoredFluids = new FluidStack[SLOT_COUNT]; - private final int[] savedStackSizes = new int[SLOT_COUNT]; - - private boolean additionalConnection = false; - - protected BaseActionSource requestSource = null; - - @Nullable - protected AENetworkProxy gridProxy = null; - - private final boolean autoPullAvailable; - protected boolean autoPullFluidList = false; - protected int minAutoPullAmount = 1; - private int autoPullRefreshTime = 100; - protected boolean processingRecipe = false; - private boolean justHadNewFluids = false; - private boolean expediteRecipeCheck = false; - - protected static final int CONFIG_WINDOW_ID = 10; - - protected static final FluidStack[] EMPTY_FLUID_STACK = new FluidStack[0]; - - public GT_MetaTileEntity_Hatch_Input_ME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, autoPullAvailable ? 10 : 8, 1, getDescriptionArray(autoPullAvailable)); - this.autoPullAvailable = autoPullAvailable; - } - - public GT_MetaTileEntity_Hatch_Input_ME(String aName, boolean autoPullAvailable, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, 1, aTier, aDescription, aTextures); - this.autoPullAvailable = autoPullAvailable; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_Input_ME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH) }; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - if (getBaseMetaTileEntity().isServerSide()) { - if (aTimer % autoPullRefreshTime == 0 && autoPullFluidList) { - refreshFluidList(); - } - if (aTimer % 20 == 0) { - getBaseMetaTileEntity().setActive(isActive()); - } - } - super.onPostTick(aBaseMetaTileEntity, aTimer); - } - - private void refreshFluidList() { - AENetworkProxy proxy = getProxy(); - if (proxy == null || !proxy.isActive()) { - return; - } - - try { - IMEMonitor sg = proxy.getStorage() - .getFluidInventory(); - Iterator iterator = sg.getStorageList() - .iterator(); - - int index = 0; - while (iterator.hasNext() && index < SLOT_COUNT) { - IAEFluidStack currItem = iterator.next(); - if (currItem.getStackSize() >= minAutoPullAmount) { - FluidStack fluidStack = GT_Utility.copyAmount(1, currItem.getFluidStack()); - if (expediteRecipeCheck) { - FluidStack previous = storedFluids[index]; - if (fluidStack != null && previous != null) { - justHadNewFluids = !fluidStack.isFluidEqual(previous); - } - } - storedFluids[index] = fluidStack; - index++; - } - } - - for (int i = index; i < SLOT_COUNT; i++) { - storedFluids[i] = null; - } - } catch (final GridAccessException ignored) {} - } - - @Override - public boolean displaysStackSize() { - return true; - } - - protected void setSavedFluid(int i, FluidStack stack) { - shadowStoredFluids[i] = stack; - savedStackSizes[i] = stack == null ? 0 : stack.amount; - } - - public FluidStack[] getStoredFluids() { - if (!processingRecipe) { - return EMPTY_FLUID_STACK; - } - - AENetworkProxy proxy = getProxy(); - if (proxy == null || !proxy.isActive()) { - return EMPTY_FLUID_STACK; - } - - updateAllInformationSlots(); - - for (int i = 0; i < SLOT_COUNT; i++) { - if (storedFluids[i] == null) { - setSavedFluid(i, null); - continue; - } - - FluidStack fluidStackWithAmount = storedInformationFluids[i]; - - setSavedFluid(i, fluidStackWithAmount); - } - - return shadowStoredFluids; - } - - @Override - public boolean justUpdated() { - if (expediteRecipeCheck) { - boolean ret = justHadNewFluids; - justHadNewFluids = false; - return ret; - } - return false; - } - - public void setRecipeCheck(boolean value) { - expediteRecipeCheck = value; - } - - @Override - public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) { - // this is an ME input hatch. allowing draining via logistics would be very wrong (and against - // canTankBeEmptied()) but we do need to support draining from controller, which uses the UNKNOWN direction. - if (side != ForgeDirection.UNKNOWN) return null; - FluidStack stored = getMatchingFluidStack(aFluid); - if (stored == null) return null; - FluidStack drained = GT_Utility.copyAmount(Math.min(stored.amount, aFluid.amount), stored); - if (doDrain) { - stored.amount -= drained.amount; - } - return drained; - } - - @Override - public void startRecipeProcessing() { - processingRecipe = true; - updateAllInformationSlots(); - } - - @Override - public CheckRecipeResult endRecipeProcessing(GT_MetaTileEntity_MultiBlockBase controller) { - CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.SUCCESSFUL; - AENetworkProxy proxy = getProxy(); - - for (int i = 0; i < SLOT_COUNT; ++i) { - FluidStack oldStack = shadowStoredFluids[i]; - int toExtract = savedStackSizes[i] - (oldStack != null ? oldStack.amount : 0); - if (toExtract <= 0) continue; - - try { - IMEMonitor sg = proxy.getStorage() - .getFluidInventory(); - - IAEFluidStack request = AEFluidStack.create(storedFluids[i]); - request.setStackSize(toExtract); - IAEFluidStack extractionResult = sg.extractItems(request, Actionable.MODULATE, getRequestSource()); - proxy.getEnergy() - .extractAEPower(toExtract, Actionable.MODULATE, PowerMultiplier.CONFIG); - - if (extractionResult == null || extractionResult.getStackSize() != toExtract) { - controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); - checkRecipeResult = SimpleCheckRecipeResult - .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction"); - } - } catch (GridAccessException ignored) { - controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); - checkRecipeResult = SimpleCheckRecipeResult - .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction"); - } - setSavedFluid(i, null); - if (storedInformationFluids[i] != null && storedInformationFluids[i].amount <= 0) { - storedInformationFluids[i] = null; - } - } - - processingRecipe = false; - return checkRecipeResult; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - getProxy().onReady(); - } - - @Override - public AECableType getCableConnectionType(ForgeDirection forgeDirection) { - return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; - } - - private void updateValidGridProxySides() { - if (additionalConnection) { - getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); - } else { - getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); - } - } - - @Override - public void onFacingChange() { - updateValidGridProxySides(); - } - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - additionalConnection = !additionalConnection; - updateValidGridProxySides(); - aPlayer.addChatComponentMessage( - new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); - return true; - } - - @Override - public AENetworkProxy getProxy() { - if (gridProxy == null) { - if (getBaseMetaTileEntity() instanceof IGridProxyable) { - gridProxy = new AENetworkProxy( - (IGridProxyable) getBaseMetaTileEntity(), - "proxy", - autoPullAvailable ? ItemList.Hatch_Input_ME_Advanced.get(1) : ItemList.Hatch_Input_ME.get(1), - true); - gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); - updateValidGridProxySides(); - if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( - getBaseMetaTileEntity().getWorld() - .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); - } - } - return this.gridProxy; - } - - @Override - public boolean isPowered() { - return getProxy() != null && getProxy().isPowered(); - } - - @Override - public boolean isActive() { - return getProxy() != null && getProxy().isActive(); - } - - private void setAutoPullFluidList(boolean pullFluidList) { - if (!autoPullAvailable) { - return; - } - - autoPullFluidList = pullFluidList; - if (!autoPullFluidList) { - Arrays.fill(storedFluids, null); - } else { - refreshFluidList(); - } - updateAllInformationSlots(); - } - - public boolean doFastRecipeCheck() { - return expediteRecipeCheck; - } - - private void updateAllInformationSlots() { - for (int index = 0; index < SLOT_COUNT; index++) { - updateInformationSlot(index); - } - } - - public void updateInformationSlot(int index) { - if (index < 0 || index >= SLOT_COUNT) { - return; - } - - FluidStack fluidStack = storedFluids[index]; - if (fluidStack == null) { - storedInformationFluids[index] = null; - return; - } - - AENetworkProxy proxy = getProxy(); - if (proxy == null || !proxy.isActive()) { - storedInformationFluids[index] = null; - return; - } - - try { - IMEMonitor sg = proxy.getStorage() - .getFluidInventory(); - IAEFluidStack request = AEFluidStack.create(fluidStack); - request.setStackSize(Integer.MAX_VALUE); - IAEFluidStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource()); - FluidStack resultFluid = (result != null) ? result.getFluidStack() : null; - // We want to track if any FluidStack is modified to notify any connected controllers to make a recipe check - // early - if (expediteRecipeCheck) { - FluidStack previous = storedInformationFluids[index]; - if (resultFluid != null) { - justHadNewFluids = !resultFluid.isFluidEqual(previous); - } - } - storedInformationFluids[index] = resultFluid; - } catch (final GridAccessException ignored) {} - } - - private BaseActionSource getRequestSource() { - if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); - return requestSource; - } - - public FluidStack getMatchingFluidStack(FluidStack fluidStack) { - if (fluidStack == null) return null; - - AENetworkProxy proxy = getProxy(); - if (proxy == null || !proxy.isActive()) { - return null; - } - - for (int i = 0; i < storedFluids.length; i++) { - if (storedFluids[i] == null) { - continue; - } - - if (GT_Utility.areFluidsEqual(fluidStack, storedFluids[i], false)) { - updateInformationSlot(i); - if (storedInformationFluids[i] != null) { - setSavedFluid(i, storedInformationFluids[i]); - return shadowStoredFluids[i]; - } - - setSavedFluid(i, null); - return null; - } - } - return null; - } - - /** - * Used to avoid slot update. - */ - public FluidStack getShadowFluidStack(int index) { - if (index < 0 || index >= storedFluids.length) { - return null; - } - - return shadowStoredFluids[index]; - } - - public int getFluidSlot(FluidStack fluidStack) { - if (fluidStack == null) return -1; - - for (int i = 0; i < storedFluids.length; i++) { - if (storedFluids[i] == null) { - continue; - } - - if (GT_Utility.areFluidsEqual(fluidStack, storedFluids[i], false)) { - return i; - } - } - - return -1; - } - - @Override - public boolean canTankBeEmptied() { - return false; - } - - @Override - public boolean canTankBeFilled() { - return false; - } - - @Override - public boolean doesEmptyContainers() { - return false; - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - - NBTTagList nbtTagList = new NBTTagList(); - for (int i = 0; i < SLOT_COUNT; i++) { - FluidStack fluidStack = storedFluids[i]; - if (fluidStack == null) { - continue; - } - NBTTagCompound fluidTag = fluidStack.writeToNBT(new NBTTagCompound()); - if (storedInformationFluids[i] != null) - fluidTag.setInteger("informationAmount", storedInformationFluids[i].amount); - nbtTagList.appendTag(fluidTag); - } - - aNBT.setTag("storedFluids", nbtTagList); - aNBT.setBoolean("autoPull", autoPullFluidList); - aNBT.setInteger("minAmount", minAutoPullAmount); - aNBT.setBoolean("additionalConnection", additionalConnection); - aNBT.setBoolean("expediteRecipeCheck", expediteRecipeCheck); - aNBT.setInteger("refreshTime", autoPullRefreshTime); - getProxy().writeToNBT(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("storedFluids")) { - NBTTagList nbtTagList = aNBT.getTagList("storedFluids", 10); - int c = Math.min(nbtTagList.tagCount(), SLOT_COUNT); - for (int i = 0; i < c; i++) { - NBTTagCompound nbtTagCompound = nbtTagList.getCompoundTagAt(i); - FluidStack fluidStack = GT_Utility.loadFluid(nbtTagCompound); - storedFluids[i] = fluidStack; - - if (nbtTagCompound.hasKey("informationAmount")) { - int informationAmount = nbtTagCompound.getInteger("informationAmount"); - storedInformationFluids[i] = GT_Utility.copyAmount(informationAmount, fluidStack); - } - } - } - - minAutoPullAmount = aNBT.getInteger("minAmount"); - autoPullFluidList = aNBT.getBoolean("autoPull"); - additionalConnection = aNBT.getBoolean("additionalConnection"); - expediteRecipeCheck = aNBT.getBoolean("expediteRecipeCheck"); - if (aNBT.hasKey("refreshTime")) { - autoPullRefreshTime = aNBT.getInteger("refreshTime"); - } - getProxy().readFromNBT(aNBT); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!autoPullAvailable) { - return; - } - - setAutoPullFluidList(!autoPullFluidList); - aPlayer.addChatMessage( - new ChatComponentTranslation( - "GT5U.machines.stocking_hatch.auto_pull_toggle." + (autoPullFluidList ? "enabled" : "disabled"))); - } - - @Override - public String getCopiedDataIdentifier(EntityPlayer player) { - return COPIED_DATA_IDENTIFIER; - } - - @Override - public boolean pasteCopiedData(EntityPlayer player, NBTTagCompound nbt) { - if (nbt == null || !COPIED_DATA_IDENTIFIER.equals(nbt.getString("type"))) return false; - - if (autoPullAvailable) { - setAutoPullFluidList(nbt.getBoolean("autoPull")); - minAutoPullAmount = nbt.getInteger("minAmount"); - autoPullRefreshTime = nbt.getInteger("refreshTime"); - } - additionalConnection = nbt.getBoolean("additionalConnection"); - - if (!autoPullFluidList) { - NBTTagList stockingFluids = nbt.getTagList("fluidsToStock", 10); - for (int i = 0; i < stockingFluids.tagCount(); i++) { - storedFluids[i] = GT_Utility.loadFluid(stockingFluids.getCompoundTagAt(i)); - } - } - return true; - } - - @Override - public NBTTagCompound getCopiedData(EntityPlayer player) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setString("type", COPIED_DATA_IDENTIFIER); - tag.setBoolean("autoPull", autoPullFluidList); - tag.setInteger("minAmount", minAutoPullAmount); - tag.setBoolean("additionalConnection", additionalConnection); - tag.setInteger("refreshTime", autoPullRefreshTime); - - NBTTagList stockingFluids = new NBTTagList(); - if (!autoPullFluidList) { - for (int index = 0; index < SLOT_COUNT; index++) { - FluidStack fluidStack = storedFluids[index]; - if (fluidStack == null) { - continue; - } - stockingFluids.appendTag(fluidStack.writeToNBT(new NBTTagCompound())); - } - tag.setTag("fluidsToStock", stockingFluids); - } - return tag; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - if (!(aPlayer instanceof EntityPlayerMP)) - return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) - return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); - - if (!pasteCopiedData(aPlayer, dataStick.stackTagCompound)) return false; - - updateValidGridProxySides(); - aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.loaded")); - return true; - } - - @Override - public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!(aPlayer instanceof EntityPlayerMP)) return; - - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; - - dataStick.stackTagCompound = getCopiedData(aPlayer); - dataStick.setStackDisplayName("Stocking Input Hatch Configuration"); - aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.saved")); - } - - @Override - public void onExplosion() { - for (int i = 0; i < SLOT_COUNT; i++) { - mInventory[i] = null; - } - } - - public boolean containsSuchStack(FluidStack tStack) { - for (int i = 0; i < 16; ++i) { - if (GT_Utility.areFluidsEqual(storedFluids[i], tStack, false)) { - return true; - } - } - return false; - } - - @Override - public int getGUIHeight() { - return 179; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - if (autoPullAvailable) { - buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow); - } - - builder.widget( - SlotGroup.ofFluidTanks( - IntStream.range(0, SLOT_COUNT) - .mapToObj(index -> createTankForFluidStack(storedFluids, index, 1)) - .collect(Collectors.toList()), - 4) - .phantom(true) - .widgetCreator((slotIndex, h) -> (FluidSlotWidget) new FluidSlotWidget(h) { - - @Override - protected void tryClickPhantom(ClickData clickData, ItemStack cursorStack) { - if (clickData.mouseButton != 0 || autoPullFluidList) return; - - FluidStack heldFluid = getFluidForPhantomItem(cursorStack); - if (cursorStack == null) { - storedFluids[slotIndex] = null; - } else { - if (containsSuchStack(heldFluid)) return; - storedFluids[slotIndex] = heldFluid; - } - if (getBaseMetaTileEntity().isServerSide()) { - updateInformationSlot(slotIndex); - detectAndSendChanges(false); - } - } - - @Override - protected void tryScrollPhantom(int direction) {} - - @Override - public IDrawable[] getBackground() { - IDrawable slot; - if (autoPullFluidList) { - slot = GT_UITextures.SLOT_DARK_GRAY; - } else { - slot = ModularUITextures.FLUID_SLOT; - } - return new IDrawable[] { slot, GT_UITextures.OVERLAY_SLOT_ARROW_ME }; - } - - @Override - public void buildTooltip(List tooltip) { - FluidStack fluid = getContent(); - if (fluid != null) { - addFluidNameInfo(tooltip, fluid); - - if (!autoPullFluidList) { - tooltip.add(Text.localised("modularui.phantom.single.clear")); - } - } else { - tooltip.add( - Text.localised("modularui.fluid.empty") - .format(EnumChatFormatting.WHITE)); - } - - if (autoPullFluidList) { - tooltip.add(Text.localised("GT5U.machines.stocking_bus.cannot_set_slot")); - } - } - }.setUpdateTooltipEveryTick(true)) - .build() - .setPos(new Pos2d(7, 9))); - - builder.widget( - SlotGroup.ofFluidTanks( - IntStream.range(0, SLOT_COUNT) - .mapToObj(index -> createTankForFluidStack(storedInformationFluids, index, Integer.MAX_VALUE)) - .collect(Collectors.toList()), - 4) - .phantom(true) - .widgetCreator((slotIndex, h) -> (FluidSlotWidget) new FluidSlotWidget(h) { - - @Override - protected void tryClickPhantom(ClickData clickData, ItemStack cursorStack) {} - - @Override - protected void tryScrollPhantom(int direction) {} - - @Override - public void buildTooltip(List tooltip) { - FluidStack fluid = getContent(); - if (fluid != null) { - addFluidNameInfo(tooltip, fluid); - tooltip.add(Text.localised("modularui.fluid.phantom.amount", fluid.amount)); - addAdditionalFluidInfo(tooltip, fluid); - if (!Interactable.hasShiftDown()) { - tooltip.add(Text.EMPTY); - tooltip.add(Text.localised("modularui.tooltip.shift")); - } - } else { - tooltip.add( - Text.localised("modularui.fluid.empty") - .format(EnumChatFormatting.WHITE)); - } - } - }.setUpdateTooltipEveryTick(true)) - .background(GT_UITextures.SLOT_DARK_GRAY) - .controlsAmount(true) - .build() - .setPos(new Pos2d(97, 9))); - - if (autoPullAvailable) { - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (clickData.mouseButton == 0) { - setAutoPullFluidList(!autoPullFluidList); - } else if (clickData.mouseButton == 1 && !widget.isClient()) { - widget.getContext() - .openSyncedWindow(CONFIG_WINDOW_ID); - } - }) - .setPlayClickSound(true) - .setBackground(() -> { - if (autoPullFluidList) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME }; - } else { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME_DISABLED }; - } - }) - .addTooltips( - Arrays.asList( - StatCollector.translateToLocal("GT5U.machines.stocking_hatch.auto_pull.tooltip.1"), - StatCollector.translateToLocal("GT5U.machines.stocking_hatch.auto_pull.tooltip.2"))) - .setSize(16, 16) - .setPos(80, 10)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullFluidList, this::setAutoPullFluidList)); - } - - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_DOUBLE) - .setPos(82, 30) - .setSize(12, 12)) - .widget(TextWidget.dynamicString(() -> { - boolean isActive = isActive(); - boolean isPowered = isPowered(); - boolean isBooting = isBooting(); - EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN - : EnumChatFormatting.DARK_RED; - return color + WailaText.getPowerState(isActive, isPowered, isBooting); - }) - .setTextAlignment(Alignment.Center) - .setSize(90, 9) - .setPos(43, 84)); - } - - private FluidStackTank createTankForFluidStack(FluidStack[] fluidStacks, int slotIndex, int capacity) { - return new FluidStackTank(() -> fluidStacks[slotIndex], (stack) -> { - if (getBaseMetaTileEntity().isServerSide()) { - return; - } - - fluidStacks[slotIndex] = stack; - }, capacity); - } - - protected ModularWindow createStackSizeConfigurationWindow(final EntityPlayer player) { - final int WIDTH = 78; - final int HEIGHT = 115; - final int PARENT_WIDTH = getGUIWidth(); - final int PARENT_HEIGHT = getGUIHeight(); - ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.setGuiTint(getGUIColorization()); - builder.setDraggable(true); - builder.setPos( - (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) - .add( - Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) - .add(WIDTH - 3, 0))); - builder.widget( - TextWidget.localised("GT5U.machines.stocking_hatch.min_amount") - .setPos(3, 2) - .setSize(74, 14)) - .widget( - new NumericWidget().setSetter(val -> minAutoPullAmount = (int) val) - .setGetter(() -> minAutoPullAmount) - .setBounds(1, Integer.MAX_VALUE) - .setScrollValues(1, 4, 64) - .setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal) - .setSize(70, 18) - .setPos(3, 18) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)); - builder.widget( - TextWidget.localised("GT5U.machines.stocking_bus.refresh_time") - .setPos(3, 42) - .setSize(74, 14)) - .widget( - new NumericWidget().setSetter(val -> autoPullRefreshTime = (int) val) - .setGetter(() -> autoPullRefreshTime) - .setBounds(1, Integer.MAX_VALUE) - .setScrollValues(1, 4, 64) - .setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal) - .setSize(70, 18) - .setPos(3, 58) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)); - builder.widget( - TextWidget.localised("GT5U.machines.stocking_bus.force_check") - .setPos(3, 88) - .setSize(50, 14)) - .widget( - new CycleButtonWidget().setToggle(() -> expediteRecipeCheck, val -> setRecipeCheck(val)) - .setTextureGetter( - state -> expediteRecipeCheck ? GT_UITextures.OVERLAY_BUTTON_CHECKMARK - : GT_UITextures.OVERLAY_BUTTON_CROSS) - .setBackground(GT_UITextures.BUTTON_STANDARD) - .setPos(53, 87) - .setSize(16, 16) - .addTooltip(StatCollector.translateToLocal("GT5U.machines.stocking_bus.hatch_warning"))); - return builder.build(); - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(80, 63)); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - if (!autoPullAvailable) { - super.getWailaBody(itemStack, currenttip, accessor, config); - return; - } - - NBTTagCompound tag = accessor.getNBTData(); - boolean autopull = tag.getBoolean("autoPull"); - int minSize = tag.getInteger("minAmount"); - currenttip.add( - StatCollector.translateToLocal("GT5U.waila.stocking_bus.auto_pull." + (autopull ? "enabled" : "disabled"))); - if (autopull) { - currenttip.add( - StatCollector.translateToLocalFormatted( - "GT5U.waila.stocking_hatch.min_amount", - GT_Utility.formatNumbers(minSize))); - } - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - if (!autoPullAvailable) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - return; - } - - tag.setBoolean("autoPull", autoPullFluidList); - tag.setInteger("minAmount", minAutoPullAmount); - super.getWailaNBTData(player, tile, tag, world, x, y, z); - } - - private static String[] getDescriptionArray(boolean autoPullAvailable) { - List strings = new ArrayList<>(8); - strings.add("Advanced fluid input for Multiblocks"); - strings.add("Hatch Tier: " + TIER_COLORS[autoPullAvailable ? 10 : 8] + VN[autoPullAvailable ? 10 : 8]); - strings.add("Retrieves directly from ME"); - strings.add("Keeps 16 fluid types in stock"); - - if (autoPullAvailable) { - strings.add( - "Auto-Pull from ME mode will automatically stock the first 16 fluid in the ME system, updated every 5 seconds."); - strings.add("Toggle by right-clicking with screwdriver, or use the GUI."); - strings.add( - "Use the GUI to limit the minimum stack size for Auto-Pulling, adjust the slot refresh timer and enable fast recipe checks."); - strings.add("WARNING: Fast recipe checks can be laggy. Use with caution."); - } - - strings.add("Change ME connection behavior by right-clicking with wire cutter."); - strings.add("Configuration data can be copy+pasted using a data stick."); - return strings.toArray(new String[0]); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java deleted file mode 100644 index f4d78ec9b3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java +++ /dev/null @@ -1,380 +0,0 @@ -package gregtech.common.tileentities.machines; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_HATCH; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_HATCH_ACTIVE; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; - -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; - -import appeng.api.AEApi; -import appeng.api.implementations.IPowerChannelState; -import appeng.api.networking.GridFlags; -import appeng.api.networking.security.BaseActionSource; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.MachineSource; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.storage.data.IItemList; -import appeng.api.util.AECableType; -import appeng.items.storage.ItemBasicStorageCell; -import appeng.me.GridAccessException; -import appeng.me.helpers.AENetworkProxy; -import appeng.me.helpers.IGridProxyable; -import appeng.util.IWideReadableNumberConverter; -import appeng.util.Platform; -import appeng.util.ReadableNumberConverter; -import gregtech.GT_Mod; -import gregtech.api.enums.ItemList; -import gregtech.api.gui.modularui.GT_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_OutputBus; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Hatch_OutputBus_ME extends GT_MetaTileEntity_Hatch_OutputBus - implements IPowerChannelState { - - private long baseCapacity = 1_600; - - private BaseActionSource requestSource = null; - private @Nullable AENetworkProxy gridProxy = null; - final IItemList itemCache = AEApi.instance() - .storage() - .createItemList(); - long lastOutputTick = 0; - long lastInputTick = 0; - long tickCounter = 0; - boolean additionalConnection = false; - - public GT_MetaTileEntity_Hatch_OutputBus_ME(int aID, String aName, String aNameRegional) { - super( - aID, - aName, - aNameRegional, - 3, - new String[] { "Item Output for Multiblocks", "Stores directly into ME", "Can cache 1600 items by default", - "Change cache size by inserting a storage cell", - "Change ME connection behavior by right-clicking with wire cutter" }, - 1); - } - - public GT_MetaTileEntity_Hatch_OutputBus_ME(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_OutputBus_ME(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_HATCH_ACTIVE) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_HATCH) }; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - getProxy().onReady(); - } - - @Override - public boolean storeAll(ItemStack aStack) { - aStack.stackSize = store(aStack); - return aStack.stackSize == 0; - } - - private long getCachedAmount() { - long itemAmount = 0; - for (IAEItemStack item : itemCache) { - itemAmount += item.getStackSize(); - } - return itemAmount; - } - - private long getCacheCapacity() { - ItemStack upgradeItemStack = mInventory[0]; - if (upgradeItemStack != null && upgradeItemStack.getItem() instanceof ItemBasicStorageCell) { - return ((ItemBasicStorageCell) upgradeItemStack.getItem()).getBytesLong(upgradeItemStack) * 8; - } - return baseCapacity; - } - - /** - * Check if the internal cache can still fit more items in it - */ - public boolean canAcceptItem() { - if (getCachedAmount() < getCacheCapacity()) { - return true; - } - return false; - } - - /** - * Attempt to store items in connected ME network. Returns how many items did not fit (if the network was down e.g.) - * - * @param stack input stack - * @return amount of items left over - */ - public int store(final ItemStack stack) { - // Always allow insertion on the same tick so we can output the entire recipe - if (canAcceptItem() || (lastInputTick == tickCounter)) { - itemCache.add( - AEApi.instance() - .storage() - .createItemStack(stack)); - lastInputTick = tickCounter; - return 0; - } - return stack.stackSize; - } - - private BaseActionSource getRequest() { - if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); - return requestSource; - } - - @Override - public AECableType getCableConnectionType(ForgeDirection forgeDirection) { - return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; - } - - private void updateValidGridProxySides() { - if (additionalConnection) { - getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); - } else { - getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); - } - } - - @Override - public void onFacingChange() { - updateValidGridProxySides(); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) - .isGUIClickable()) return; - } - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - additionalConnection = !additionalConnection; - updateValidGridProxySides(); - aPlayer.addChatComponentMessage( - new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); - return true; - } - - @Override - public AENetworkProxy getProxy() { - if (gridProxy == null) { - if (getBaseMetaTileEntity() instanceof IGridProxyable) { - gridProxy = new AENetworkProxy( - (IGridProxyable) getBaseMetaTileEntity(), - "proxy", - ItemList.Hatch_Output_Bus_ME.get(1), - true); - gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); - updateValidGridProxySides(); - if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( - getBaseMetaTileEntity().getWorld() - .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); - } - } - return this.gridProxy; - } - - private void flushCachedStack() { - AENetworkProxy proxy = getProxy(); - if (proxy == null) { - return; - } - try { - IMEMonitor sg = proxy.getStorage() - .getItemInventory(); - for (IAEItemStack s : itemCache) { - if (s.getStackSize() == 0) continue; - IAEItemStack rest = Platform.poweredInsert(proxy.getEnergy(), sg, s, getRequest()); - if (rest != null && rest.getStackSize() > 0) { - s.setStackSize(rest.getStackSize()); - break; - } - s.setStackSize(0); - } - } catch (final GridAccessException ignored) { - - } - lastOutputTick = tickCounter; - } - - @Override - public boolean isPowered() { - return getProxy() != null && getProxy().isPowered(); - } - - @Override - public boolean isActive() { - return getProxy() != null && getProxy().isActive(); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (getBaseMetaTileEntity().isServerSide()) { - tickCounter = aTick; - if (tickCounter > (lastOutputTick + 40)) flushCachedStack(); - if (tickCounter % 20 == 0) getBaseMetaTileEntity().setActive(isActive()); - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { - - if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("baseCapacity")) { - tooltip.add( - "Current cache capacity: " + EnumChatFormatting.YELLOW - + ReadableNumberConverter.INSTANCE - .toWideReadableForm(stack.stackTagCompound.getLong("baseCapacity"))); - } - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - super.setItemNBT(aNBT); - aNBT.setLong("baseCapacity", baseCapacity); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - - NBTTagList items = new NBTTagList(); - for (IAEItemStack s : itemCache) { - if (s.getStackSize() == 0) continue; - NBTTagCompound tag = new NBTTagCompound(); - tag.setTag("itemStack", GT_Utility.saveItem(s.getItemStack())); - tag.setLong("size", s.getStackSize()); - items.appendTag(tag); - } - aNBT.setBoolean("additionalConnection", additionalConnection); - aNBT.setTag("cachedItems", items); - aNBT.setLong("baseCapacity", baseCapacity); - getProxy().writeToNBT(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - - NBTBase t = aNBT.getTag("cachedStack"); // legacy - if (t instanceof NBTTagCompound) itemCache.add( - AEApi.instance() - .storage() - .createItemStack(GT_Utility.loadItem((NBTTagCompound) t))); - t = aNBT.getTag("cachedItems"); - if (t instanceof NBTTagList l) { - for (int i = 0; i < l.tagCount(); ++i) { - NBTTagCompound tag = l.getCompoundTagAt(i); - if (!tag.hasKey("itemStack")) { // legacy #868 - itemCache.add( - AEApi.instance() - .storage() - .createItemStack(GT_Utility.loadItem(l.getCompoundTagAt(i)))); - continue; - } - NBTTagCompound tagItemStack = tag.getCompoundTag("itemStack"); - final IAEItemStack s = AEApi.instance() - .storage() - .createItemStack(GT_Utility.loadItem(tagItemStack)); - if (s != null) { - s.setStackSize(tag.getLong("size")); - itemCache.add(s); - } else { - GT_Mod.GT_FML_LOGGER.warn( - "An error occurred while loading contents of ME Output Bus. This item has been voided: " - + tagItemStack); - } - } - } - additionalConnection = aNBT.getBoolean("additionalConnection"); - baseCapacity = aNBT.getLong("baseCapacity"); - // Set the base capacity of existing hatches to be infinite - if (baseCapacity == 0) { - baseCapacity = Long.MAX_VALUE; - } - getProxy().readFromNBT(aNBT); - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - List ss = new ArrayList<>(); - ss.add( - "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" - : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET); - IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE; - ss.add("Item cache capacity: " + nc.toWideReadableForm(getCacheCapacity())); - if (itemCache.isEmpty()) { - ss.add("The bus has no cached items"); - } else { - ss.add(String.format("The bus contains %d cached stacks: ", itemCache.size())); - int counter = 0; - for (IAEItemStack s : itemCache) { - ss.add( - s.getItem() - .getItemStackDisplayName(s.getItemStack()) + ": " - + EnumChatFormatting.GOLD - + nc.toWideReadableForm(s.getStackSize()) - + EnumChatFormatting.RESET); - if (++counter > 100) break; - } - } - return ss.toArray(new String[itemCache.size() + 2]); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - getBaseMetaTileEntity().add1by1Slot(builder); - } - - @Override - public boolean acceptsItemLock() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java deleted file mode 100644 index b173987aa2..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java +++ /dev/null @@ -1,443 +0,0 @@ -package gregtech.common.tileentities.machines; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_FLUID_HATCH; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_FLUID_HATCH_ACTIVE; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; - -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import com.glodblock.github.common.item.FCBaseItemCell; -import com.glodblock.github.common.storage.IStorageFluidCell; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; - -import appeng.api.AEApi; -import appeng.api.config.Actionable; -import appeng.api.config.PowerMultiplier; -import appeng.api.implementations.IPowerChannelState; -import appeng.api.networking.GridFlags; -import appeng.api.networking.energy.IEnergySource; -import appeng.api.networking.security.BaseActionSource; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.MachineSource; -import appeng.api.networking.security.PlayerSource; -import appeng.api.storage.IMEInventory; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IItemList; -import appeng.api.util.AECableType; -import appeng.core.stats.Stats; -import appeng.me.GridAccessException; -import appeng.me.helpers.AENetworkProxy; -import appeng.me.helpers.IGridProxyable; -import appeng.util.IWideReadableNumberConverter; -import appeng.util.ReadableNumberConverter; -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.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_Output; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Hatch_Output_ME extends GT_MetaTileEntity_Hatch_Output implements IPowerChannelState { - - private long baseCapacity = 128_000; - - private BaseActionSource requestSource = null; - private @Nullable AENetworkProxy gridProxy = null; - final IItemList fluidCache = AEApi.instance() - .storage() - .createFluidList(); - long lastOutputTick = 0; - long lastInputTick = 0; - long tickCounter = 0; - boolean additionalConnection = false; - - public GT_MetaTileEntity_Hatch_Output_ME(int aID, String aName, String aNameRegional) { - super( - aID, - aName, - aNameRegional, - 3, - new String[] { "Fluid Output for Multiblocks", "Stores directly into ME", - "Can cache up to 128kL of fluids by default", "Change cache size by inserting a fluid storage cell", - "Change ME connection behavior by right-clicking with wire cutter" }, - 1); - } - - public GT_MetaTileEntity_Hatch_Output_ME(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_Output_ME(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_FLUID_HATCH_ACTIVE) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_FLUID_HATCH) }; - } - - @Override - public byte getTierForStructure() { - return (byte) (GT_Values.V.length - 2); - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - getProxy().onReady(); - } - - @Override - public int fill(FluidStack aFluid, boolean doFill) { - if (doFill) { - return tryFillAE(aFluid); - } else { - if (aFluid == null) return 0; - return aFluid.amount; - } - } - - @Override - public int getCapacity() { - return 0; - } - - private long getCachedAmount() { - long fluidAmount = 0; - for (IAEFluidStack fluid : fluidCache) { - fluidAmount += fluid.getStackSize(); - } - return fluidAmount; - } - - private long getCacheCapacity() { - ItemStack upgradeItemStack = mInventory[0]; - if (upgradeItemStack != null && upgradeItemStack.getItem() instanceof IStorageFluidCell) { - return ((FCBaseItemCell) upgradeItemStack.getItem()).getBytes(upgradeItemStack) * 2048; - } - return baseCapacity; - } - - /** - * Check if the internal cache can still fit more fluids in it - */ - public boolean canAcceptFluid() { - if (getCachedAmount() < getCacheCapacity()) { - return true; - } - return false; - } - - /** - * Attempt to store fluid in connected ME network. Returns how much fluid is accepted (if the network was down e.g.) - * - * @param aFluid input fluid - * @return amount of fluid filled - */ - public int tryFillAE(final FluidStack aFluid) { - if (aFluid == null) return 0; - // Always allow insertion on the same tick so we can output the entire recipe - if (canAcceptFluid() || (lastInputTick == tickCounter)) { - fluidCache.add( - AEApi.instance() - .storage() - .createFluidStack(aFluid)); - lastInputTick = tickCounter; - return aFluid.amount; - } - return 0; - } - - private BaseActionSource getRequest() { - if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); - return requestSource; - } - - @Override - public AECableType getCableConnectionType(ForgeDirection side) { - return isOutputFacing(side) ? AECableType.SMART : AECableType.NONE; - } - - private void updateValidGridProxySides() { - if (additionalConnection) { - getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); - } else { - getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); - } - } - - @Override - public void onFacingChange() { - updateValidGridProxySides(); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public boolean doesFillContainers() { - return false; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - // Don't allow to lock fluid in me fluid hatch - if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) - .isGUIClickable()) return; - } - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - additionalConnection = !additionalConnection; - updateValidGridProxySides(); - aPlayer.addChatComponentMessage( - new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); - return true; - } - - @Override - public AENetworkProxy getProxy() { - if (gridProxy == null) { - if (getBaseMetaTileEntity() instanceof IGridProxyable) { - gridProxy = new AENetworkProxy( - (IGridProxyable) getBaseMetaTileEntity(), - "proxy", - ItemList.Hatch_Output_ME.get(1), - true); - gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); - updateValidGridProxySides(); - if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( - getBaseMetaTileEntity().getWorld() - .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); - } - } - return this.gridProxy; - } - - private void flushCachedStack() { - if (fluidCache.isEmpty()) return; - AENetworkProxy proxy = getProxy(); - if (proxy == null) { - return; - } - try { - IMEMonitor sg = proxy.getStorage() - .getFluidInventory(); - for (IAEFluidStack s : fluidCache) { - if (s.getStackSize() == 0) continue; - IAEFluidStack rest = fluidAEInsert(proxy.getEnergy(), sg, s, getRequest()); - if (rest != null && rest.getStackSize() > 0) { - s.setStackSize(rest.getStackSize()); - continue; - } - s.setStackSize(0); - } - } catch (final GridAccessException ignored) {} - lastOutputTick = tickCounter; - } - - @Override - public boolean isPowered() { - return getProxy() != null && getProxy().isPowered(); - } - - @Override - public boolean isActive() { - return getProxy() != null && getProxy().isActive(); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (getBaseMetaTileEntity().isServerSide()) { - tickCounter = aTick; - if (tickCounter > (lastOutputTick + 40)) flushCachedStack(); - if (tickCounter % 20 == 0) getBaseMetaTileEntity().setActive(isActive()); - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { - - if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("baseCapacity")) { - tooltip.add( - "Current cache capacity: " + EnumChatFormatting.YELLOW - + ReadableNumberConverter.INSTANCE - .toWideReadableForm(stack.stackTagCompound.getLong("baseCapacity")) - + "L"); - } - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - super.setItemNBT(aNBT); - aNBT.setLong("baseCapacity", baseCapacity); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - NBTTagList fluids = new NBTTagList(); - for (IAEFluidStack s : fluidCache) { - if (s.getStackSize() == 0) continue; - NBTTagCompound tag = new NBTTagCompound(); - NBTTagCompound tagFluidStack = new NBTTagCompound(); - s.getFluidStack() - .writeToNBT(tagFluidStack); - tag.setTag("fluidStack", tagFluidStack); - tag.setLong("size", s.getStackSize()); - fluids.appendTag(tag); - } - aNBT.setTag("cachedFluids", fluids); - aNBT.setBoolean("additionalConnection", additionalConnection); - aNBT.setLong("baseCapacity", baseCapacity); - getProxy().writeToNBT(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - NBTBase t = aNBT.getTag("cachedFluids"); - if (t instanceof NBTTagList l) { - for (int i = 0; i < l.tagCount(); ++i) { - NBTTagCompound tag = l.getCompoundTagAt(i); - NBTTagCompound tagFluidStack = tag.getCompoundTag("fluidStack"); - final IAEFluidStack s = AEApi.instance() - .storage() - .createFluidStack(GT_Utility.loadFluid(tagFluidStack)); - if (s != null) { - s.setStackSize(tag.getLong("size")); - fluidCache.add(s); - } else { - GT_Mod.GT_FML_LOGGER.warn( - "An error occurred while loading contents of ME Output Hatch. This fluid has been voided: " - + tagFluidStack); - } - } - } - additionalConnection = aNBT.getBoolean("additionalConnection"); - baseCapacity = aNBT.getLong("baseCapacity"); - // Set the base capacity of existing hatches to be infinite - if (baseCapacity == 0) { - baseCapacity = Long.MAX_VALUE; - } - getProxy().readFromNBT(aNBT); - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - List ss = new ArrayList<>(); - ss.add( - "The hatch is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" - : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET); - IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE; - ss.add("Fluid cache capacity: " + nc.toWideReadableForm(getCacheCapacity()) + " mB"); - if (fluidCache.isEmpty()) { - ss.add("The bus has no cached fluids"); - } else { - ss.add(String.format("The hatch contains %d cached fluids: ", fluidCache.size())); - int counter = 0; - for (IAEFluidStack s : fluidCache) { - ss.add( - s.getFluidStack() - .getLocalizedName() + ": " - + EnumChatFormatting.GOLD - + nc.toWideReadableForm(s.getStackSize()) - + " mB" - + EnumChatFormatting.RESET); - if (++counter > 100) break; - } - } - return ss.toArray(new String[fluidCache.size() + 2]); - } - - public static IAEFluidStack fluidAEInsert(final IEnergySource energy, final IMEInventory cell, - final IAEFluidStack input, final BaseActionSource src) { - final IAEFluidStack possible = cell.injectItems(input.copy(), Actionable.SIMULATE, src); - - long stored = input.getStackSize(); - if (possible != null) { - stored -= possible.getStackSize(); - } - // 1000 mb fluid will be considered as 1 item - long power = Math.max(1, stored / 1000); - - final double availablePower = energy.extractAEPower(power, Actionable.SIMULATE, PowerMultiplier.CONFIG); - - final long itemToAdd = Math.min((long) (availablePower + 0.9) * 1000, stored); - - if (itemToAdd > 0) { - energy.extractAEPower(power, Actionable.MODULATE, PowerMultiplier.CONFIG); - - if (itemToAdd < input.getStackSize()) { - final long original = input.getStackSize(); - final IAEFluidStack split = input.copy(); - split.decStackSize(itemToAdd); - input.setStackSize(itemToAdd); - split.add(cell.injectItems(input, Actionable.MODULATE, src)); - - if (src.isPlayer()) { - final long diff = original - split.getStackSize(); - Stats.ItemsInserted.addToPlayer(((PlayerSource) src).player, (int) diff); - } - - return split; - } - - final IAEFluidStack ret = cell.injectItems(input, Actionable.MODULATE, src); - - if (src.isPlayer()) { - final long diff = ret == null ? input.getStackSize() : input.getStackSize() - ret.getStackSize(); - Stats.ItemsInserted.addToPlayer(((PlayerSource) src).player, (int) diff); - } - - return ret; - } - - return input; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - getBaseMetaTileEntity().add1by1Slot(builder); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java b/src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java index c7a97ce969..eaceb1a247 100644 --- a/src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java +++ b/src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java @@ -1,10 +1,11 @@ package gregtech.common.tileentities.machines; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; import gregtech.api.recipe.check.CheckRecipeResult; /** - * Implement this interface for {@link gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch} + * Implement this interface for {@link MTEHatch} * if it does special stuff while multiblock controller is processing recipe. */ public interface IRecipeProcessingAwareHatch { @@ -22,5 +23,5 @@ public interface IRecipeProcessingAwareHatch { * @return Result of the process of this method. {@code !wasSuccessful()} means the returned result should * overwrite the result calculated on multiblock whatever the reason is. */ - CheckRecipeResult endRecipeProcessing(GT_MetaTileEntity_MultiBlockBase controller); + CheckRecipeResult endRecipeProcessing(MTEMultiBlockBase controller); } diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronze.java b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronze.java new file mode 100644 index 0000000000..a9c34c5abc --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronze.java @@ -0,0 +1,43 @@ +package gregtech.common.tileentities.machines; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicHullNonElectric; +import gregtech.api.render.TextureFactory; + +public class MTEBasicHullBronze extends MTEBasicHullNonElectric { + + public MTEBasicHullBronze(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, aDescription); + } + + public MTEBasicHullBronze(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBasicHullBronze(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBasicHullBronze(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[3][17][]; + for (byte i = -1; i < 16; i = (byte) (i + 1)) { + rTextures[0][(i + 1)] = new ITexture[] { + TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[1][(i + 1)] = new ITexture[] { + TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[2][(i + 1)] = new ITexture[] { + TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + } + return rTextures; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronzeBricks.java b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronzeBricks.java new file mode 100644 index 0000000000..e09c84e095 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullBronzeBricks.java @@ -0,0 +1,46 @@ +package gregtech.common.tileentities.machines; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicHullNonElectric; +import gregtech.api.render.TextureFactory; + +public class MTEBasicHullBronzeBricks extends MTEBasicHullNonElectric { + + public MTEBasicHullBronzeBricks(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, aDescription); + } + + public MTEBasicHullBronzeBricks(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBasicHullBronzeBricks(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBasicHullBronzeBricks(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[3][17][]; + for (byte i = -1; i < 16; i = (byte) (i + 1)) { + ITexture[] tmp0 = { TextureFactory + .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[0][(i + 1)] = tmp0; + ITexture[] tmp1 = { TextureFactory + .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[1][(i + 1)] = tmp1; + ITexture[] tmp2 = { TextureFactory + .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[2][(i + 1)] = tmp2; + } + return rTextures; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteel.java b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteel.java new file mode 100644 index 0000000000..6e5e6ad5e8 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteel.java @@ -0,0 +1,46 @@ +package gregtech.common.tileentities.machines; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicHullNonElectric; +import gregtech.api.render.TextureFactory; + +public class MTEBasicHullSteel extends MTEBasicHullNonElectric { + + public MTEBasicHullSteel(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, aDescription); + } + + public MTEBasicHullSteel(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBasicHullSteel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBasicHullSteel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[3][17][]; + for (byte i = -1; i < 16; i = (byte) (i + 1)) { + ITexture[] tmp0 = { + TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[0][(i + 1)] = tmp0; + ITexture[] tmp1 = { + TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[1][(i + 1)] = tmp1; + ITexture[] tmp2 = { + TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[2][(i + 1)] = tmp2; + } + return rTextures; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteelBricks.java b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteelBricks.java new file mode 100644 index 0000000000..7fc8276be1 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEBasicHullSteelBricks.java @@ -0,0 +1,46 @@ +package gregtech.common.tileentities.machines; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicHullNonElectric; +import gregtech.api.render.TextureFactory; + +public class MTEBasicHullSteelBricks extends MTEBasicHullNonElectric { + + public MTEBasicHullSteelBricks(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, aDescription); + } + + public MTEBasicHullSteelBricks(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEBasicHullSteelBricks(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBasicHullSteelBricks(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[3][17][]; + for (byte i = -1; i < 16; i = (byte) (i + 1)) { + ITexture[] tmp0 = { TextureFactory + .of(Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[0][(i + 1)] = tmp0; + ITexture[] tmp1 = { TextureFactory + .of(Textures.BlockIcons.MACHINE_STEELBRICKS_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[1][(i + 1)] = tmp1; + ITexture[] tmp2 = { TextureFactory + .of(Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) }; + rTextures[2][(i + 1)] = tmp2; + } + return rTextures; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputME.java b/src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputME.java new file mode 100644 index 0000000000..e5dfd72c68 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputME.java @@ -0,0 +1,1039 @@ +package gregtech.common.tileentities.machines; + +import static gregtech.api.enums.GTValues.TIER_COLORS; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_BUFFER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_BUS; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.NotNull; + +import com.glodblock.github.common.item.ItemFluidPacket; +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import appeng.api.AEApi; +import appeng.api.implementations.ICraftingPatternItem; +import appeng.api.implementations.IPowerChannelState; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.networking.crafting.ICraftingProviderHelper; +import appeng.api.networking.events.MENetworkCraftingPatternChange; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.MachineSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AECableType; +import appeng.api.util.DimensionalCoord; +import appeng.api.util.IInterfaceViewable; +import appeng.core.AppEng; +import appeng.core.sync.GuiBridge; +import appeng.helpers.ICustomNameObject; +import appeng.items.misc.ItemEncodedPattern; +import appeng.items.tools.quartz.ToolQuartzCuttingKnife; +import appeng.me.GridAccessException; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.IGridProxyable; +import appeng.util.IWideReadableNumberConverter; +import appeng.util.Platform; +import appeng.util.ReadableNumberConverter; +import gregtech.GTMod; +import gregtech.api.enums.ItemList; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.IConfigurationCircuitSupport; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.extensions.ArrayExt; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEHatchCraftingInputME extends MTEHatchInputBus + implements IConfigurationCircuitSupport, IAddGregtechLogo, IAddUIWidgets, IPowerChannelState, ICraftingProvider, + IGridProxyable, IDualInputHatch, ICustomNameObject, IInterfaceViewable { + + // Each pattern slot in the crafting input hatch has its own internal inventory + public static class PatternSlot implements IDualInputInventory { + + public interface SharedItemGetter { + + ItemStack[] getSharedItem(); + } + + private final ItemStack pattern; + private final ICraftingPatternDetails patternDetails; + private final List itemInventory; + private final List fluidInventory; + private final SharedItemGetter sharedItemGetter; + + public PatternSlot(ItemStack pattern, World world, SharedItemGetter getter) { + this.pattern = pattern; + this.patternDetails = ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem())) + .getPatternForItem(pattern, world); + this.itemInventory = new ArrayList<>(); + this.fluidInventory = new ArrayList<>(); + this.sharedItemGetter = getter; + } + + public PatternSlot(ItemStack pattern, NBTTagCompound nbt, World world, SharedItemGetter getter) { + this.pattern = pattern; + this.patternDetails = ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem())) + .getPatternForItem(pattern, world); + this.itemInventory = new ArrayList<>(); + this.fluidInventory = new ArrayList<>(); + this.sharedItemGetter = getter; + NBTTagList inv = nbt.getTagList("inventory", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < inv.tagCount(); i++) { + NBTTagCompound tagItemStack = inv.getCompoundTagAt(i); + ItemStack item = GTUtility.loadItem(tagItemStack); + if (item != null) { + if (item.stackSize > 0) { + itemInventory.add(item); + } + } else { + GTMod.GT_FML_LOGGER.warn( + "An error occurred while loading contents of ME Crafting Input Bus. This item has been voided: " + + tagItemStack); + } + } + NBTTagList fluidInv = nbt.getTagList("fluidInventory", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < fluidInv.tagCount(); i++) { + NBTTagCompound tagFluidStack = fluidInv.getCompoundTagAt(i); + FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagFluidStack); + if (fluid != null) { + if (fluid.amount > 0) { + fluidInventory.add(fluid); + } + } else { + GTMod.GT_FML_LOGGER.warn( + "An error occurred while loading contents of ME Crafting Input Bus. This fluid has been voided: " + + tagFluidStack); + } + } + } + + public boolean hasChanged(ItemStack newPattern, World world) { + return newPattern == null + || (!ItemStack.areItemStacksEqual(pattern, newPattern) && !this.patternDetails.equals( + ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem())) + .getPatternForItem(newPattern, world))); + } + + public void updateSlotItems() { + for (int i = itemInventory.size() - 1; i >= 0; i--) { + ItemStack itemStack = itemInventory.get(i); + if (itemStack == null || itemStack.stackSize <= 0) { + itemInventory.remove(i); + } + } + } + + public void updateSlotFluids() { + for (int i = fluidInventory.size() - 1; i >= 0; i--) { + FluidStack fluidStack = fluidInventory.get(i); + if (fluidStack == null || fluidStack.amount <= 0) { + fluidInventory.remove(i); + } + } + } + + public boolean isItemEmpty() { + updateSlotItems(); + return itemInventory.isEmpty() && sharedItemGetter.getSharedItem().length == 0; + } + + public boolean isFluidEmpty() { + updateSlotFluids(); + return fluidInventory.isEmpty(); + } + + public boolean isEmpty() { + return isItemEmpty() && isFluidEmpty(); + } + + @Override + public ItemStack[] getItemInputs() { + if (isItemEmpty()) return new ItemStack[0]; + return ArrayUtils.addAll(itemInventory.toArray(new ItemStack[0]), sharedItemGetter.getSharedItem()); + } + + @Override + public FluidStack[] getFluidInputs() { + if (isFluidEmpty()) return new FluidStack[0]; + return fluidInventory.toArray(new FluidStack[0]); + } + + public ICraftingPatternDetails getPatternDetails() { + return patternDetails; + } + + public void refund(AENetworkProxy proxy, BaseActionSource src) throws GridAccessException { + IMEMonitor sg = proxy.getStorage() + .getItemInventory(); + for (ItemStack itemStack : itemInventory) { + if (itemStack == null || itemStack.stackSize == 0) continue; + IAEItemStack rest = Platform.poweredInsert( + proxy.getEnergy(), + sg, + AEApi.instance() + .storage() + .createItemStack(itemStack), + src); + itemStack.stackSize = rest != null && rest.getStackSize() > 0 ? (int) rest.getStackSize() : 0; + } + IMEMonitor fsg = proxy.getStorage() + .getFluidInventory(); + for (FluidStack fluidStack : fluidInventory) { + if (fluidStack == null || fluidStack.amount == 0) continue; + IAEFluidStack rest = Platform.poweredInsert( + proxy.getEnergy(), + fsg, + AEApi.instance() + .storage() + .createFluidStack(fluidStack), + src); + fluidStack.amount = rest != null && rest.getStackSize() > 0 ? (int) rest.getStackSize() : 0; + } + } + + private void insertItem(ItemStack inserted) { + for (ItemStack itemStack : itemInventory) { + if (GTUtility.areStacksEqual(inserted, itemStack)) { + if (itemStack.stackSize > Integer.MAX_VALUE - inserted.stackSize) { + inserted.stackSize -= Integer.MAX_VALUE - itemStack.stackSize; + itemStack.stackSize = Integer.MAX_VALUE; + } else { + itemStack.stackSize += inserted.stackSize; + return; + } + } + } + if (inserted.stackSize > 0) { + itemInventory.add(inserted); + } + } + + private void insertFluid(FluidStack inserted) { + for (FluidStack fluidStack : fluidInventory) { + if (GTUtility.areFluidsEqual(inserted, fluidStack)) { + if (fluidStack.amount > Integer.MAX_VALUE - inserted.amount) { + inserted.amount -= Integer.MAX_VALUE - fluidStack.amount; + fluidStack.amount = Integer.MAX_VALUE; + } else { + fluidStack.amount += inserted.amount; + return; + } + } + } + if (inserted.amount > 0) { + fluidInventory.add(inserted); + } + } + + public boolean insertItemsAndFluids(InventoryCrafting inventoryCrafting) { + for (int i = 0; i < inventoryCrafting.getSizeInventory(); ++i) { + ItemStack itemStack = inventoryCrafting.getStackInSlot(i); + if (itemStack == null) continue; + + if (itemStack.getItem() instanceof ItemFluidPacket) { // insert fluid + FluidStack fluidStack = ItemFluidPacket.getFluidStack(itemStack); + if (fluidStack != null) insertFluid(fluidStack); + } else { // insert item + insertItem(itemStack); + } + } + return true; + } + + public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + nbt.setTag("pattern", pattern.writeToNBT(new NBTTagCompound())); + + NBTTagList itemInventoryNbt = new NBTTagList(); + for (ItemStack itemStack : this.itemInventory) { + itemInventoryNbt.appendTag(GTUtility.saveItem(itemStack)); + } + nbt.setTag("inventory", itemInventoryNbt); + + NBTTagList fluidInventoryNbt = new NBTTagList(); + for (FluidStack fluidStack : fluidInventory) { + fluidInventoryNbt.appendTag(fluidStack.writeToNBT(new NBTTagCompound())); + } + nbt.setTag("fluidInventory", fluidInventoryNbt); + + return nbt; + } + } + + // mInventory is used for storing patterns, circuit and manual slot (typically NC items) + private static final int MAX_PATTERN_COUNT = 4 * 9; + private static final int SLOT_MANUAL_SIZE = 9; + private static final int MAX_INV_COUNT = MAX_PATTERN_COUNT + SLOT_MANUAL_SIZE + 1; + private static final int SLOT_CIRCUIT = MAX_PATTERN_COUNT; + private static final int SLOT_MANUAL_START = SLOT_CIRCUIT + 1; + private static final int MANUAL_SLOT_WINDOW = 10; + private BaseActionSource requestSource = null; + private @Nullable AENetworkProxy gridProxy = null; + + // holds all internal inventories + private PatternSlot[] internalInventory = new PatternSlot[MAX_PATTERN_COUNT]; + + // a hash map for faster lookup of pattern slots, not necessarily all valid. + private Map patternDetailsPatternSlotMap = new HashMap<>(MAX_PATTERN_COUNT); + + private boolean needPatternSync = true; + private boolean justHadNewItems = false; + + private String customName = null; + private boolean supportFluids; + private boolean additionalConnection = false; + + public MTEHatchCraftingInputME(int aID, String aName, String aNameRegional, boolean supportFluids) { + super( + aID, + aName, + aNameRegional, + supportFluids ? 11 : 6, + MAX_INV_COUNT, + new String[] { "Advanced item input for Multiblocks", + "Hatch Tier: " + TIER_COLORS[supportFluids ? 11 : 6] + VN[supportFluids ? 11 : 6], + "Processes patterns directly from ME", + supportFluids ? "It supports patterns including fluids" + : "It does not support patterns including fluids", + "Change ME connection behavior by right-clicking with wire cutter" }); + disableSort = true; + this.supportFluids = supportFluids; + } + + public MTEHatchCraftingInputME(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, + boolean supportFluids) { + super(aName, aTier, MAX_INV_COUNT, aDescription, aTextures); + this.supportFluids = supportFluids; + disableSort = true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchCraftingInputME(mName, mTier, mDescriptionArray, mTextures, supportFluids); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return getTexturesInactive(aBaseTexture); + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, + TextureFactory.of(supportFluids ? OVERLAY_ME_CRAFTING_INPUT_BUFFER : OVERLAY_ME_CRAFTING_INPUT_BUS) }; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + super.onPostTick(aBaseMetaTileEntity, aTimer); + + if (getBaseMetaTileEntity().isServerSide()) { + if (needPatternSync && aTimer % 10 == 0) { + needPatternSync = !postMEPatternChange(); + } + if (aTimer % 20 == 0) { + getBaseMetaTileEntity().setActive(isActive()); + } + } + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + getProxy().onReady(); + } + + @Override + public IGridNode getGridNode(ForgeDirection dir) { + return getProxy().getNode(); + } + + @Override + public AECableType getCableConnectionType(ForgeDirection forgeDirection) { + return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; + } + + private void updateValidGridProxySides() { + if (additionalConnection) { + getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); + } else { + getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); + } + } + + @Override + public void onFacingChange() { + updateValidGridProxySides(); + } + + @Override + public void securityBreak() {} + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + additionalConnection = !additionalConnection; + updateValidGridProxySides(); + aPlayer.addChatComponentMessage( + new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); + return true; + } + + @Override + public AENetworkProxy getProxy() { + if (gridProxy == null) { + gridProxy = new AENetworkProxy(this, "proxy", ItemList.Hatch_CraftingInput_Bus_ME.get(1), true); + gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); + updateValidGridProxySides(); + if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( + getBaseMetaTileEntity().getWorld() + .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); + } + + return this.gridProxy; + } + + @Override + public DimensionalCoord getLocation() { + return new DimensionalCoord( + getBaseMetaTileEntity().getWorld(), + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord()); + } + + @Override + public int rows() { + return 4; + } + + @Override + public int rowSize() { + return 9; + } + + @Override + public IInventory getPatterns() { + return this; + } + + @Override + public String getName() { + if (hasCustomName()) { + return getCustomName(); + } + StringBuilder name = new StringBuilder(); + if (getCrafterIcon() != null) { + name.append(getCrafterIcon().getDisplayName()); + } else { + name.append(getLocalName()); + } + + if (mInventory[SLOT_CIRCUIT] != null) { + name.append(" - "); + name.append(mInventory[SLOT_CIRCUIT].getItemDamage()); + } + if (mInventory[SLOT_MANUAL_START] != null) { + name.append(" - "); + name.append(mInventory[SLOT_MANUAL_START].getDisplayName()); + } + return name.toString(); + } + + @Override + public TileEntity getTileEntity() { + return (TileEntity) getBaseMetaTileEntity(); + } + + @Override + public boolean shouldDisplay() { + return true; + } + + @Override + public void gridChanged() { + needPatternSync = true; + } + + @Override + public boolean isPowered() { + return getProxy() != null && getProxy().isPowered(); + } + + @Override + public boolean isActive() { + return getProxy() != null && getProxy().isActive(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + + // save internalInventory + NBTTagList internalInventoryNBT = new NBTTagList(); + for (int i = 0; i < internalInventory.length; i++) { + if (internalInventory[i] != null) { + NBTTagCompound internalInventorySlotNBT = new NBTTagCompound(); + internalInventorySlotNBT.setInteger("patternSlot", i); + internalInventorySlotNBT + .setTag("patternSlotNBT", internalInventory[i].writeToNBT(new NBTTagCompound())); + internalInventoryNBT.appendTag(internalInventorySlotNBT); + } + } + aNBT.setTag("internalInventory", internalInventoryNBT); + if (customName != null) aNBT.setString("customName", customName); + aNBT.setBoolean("additionalConnection", additionalConnection); + getProxy().writeToNBT(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + // load internalInventory + NBTTagList internalInventoryNBT = aNBT.getTagList("internalInventory", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < internalInventoryNBT.tagCount(); i++) { + NBTTagCompound internalInventorySlotNBT = internalInventoryNBT.getCompoundTagAt(i); + int patternSlot = internalInventorySlotNBT.getInteger("patternSlot"); + NBTTagCompound patternSlotNBT = internalInventorySlotNBT.getCompoundTag("patternSlotNBT"); + ItemStack pattern = ItemStack.loadItemStackFromNBT(patternSlotNBT.getCompoundTag("pattern")); + if (pattern != null) { + internalInventory[patternSlot] = new PatternSlot( + pattern, + patternSlotNBT, + getBaseMetaTileEntity().getWorld(), + this::getSharedItems); + } else { + GTMod.GT_FML_LOGGER.warn( + "An error occurred while loading contents of ME Crafting Input Bus. This pattern has been voided: " + + patternSlotNBT); + } + } + + // Migrate from 4x8 to 4x9 pattern inventory + int oldPatternCount = 4 * 8; + int oldSlotManual = oldPatternCount + 1; + int oldSlotCircuit = oldPatternCount; + + if (internalInventory[oldSlotManual] == null && mInventory[oldSlotManual] != null) { + mInventory[SLOT_MANUAL_START] = mInventory[oldSlotManual]; + mInventory[oldSlotManual] = null; + } + if (internalInventory[oldSlotCircuit] == null && mInventory[oldSlotCircuit] != null) { + mInventory[SLOT_CIRCUIT] = mInventory[oldSlotCircuit]; + mInventory[oldSlotCircuit] = null; + } + + // reconstruct patternDetailsPatternSlotMap + patternDetailsPatternSlotMap.clear(); + for (PatternSlot patternSlot : internalInventory) { + if (patternSlot != null) { + patternDetailsPatternSlotMap.put(patternSlot.getPatternDetails(), patternSlot); + } + } + + if (aNBT.hasKey("customName")) customName = aNBT.getString("customName"); + additionalConnection = aNBT.getBoolean("additionalConnection"); + + getProxy().readFromNBT(aNBT); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + private String describePattern(ICraftingPatternDetails patternDetails) { + return Arrays.stream(patternDetails.getCondensedOutputs()) + .map( + aeItemStack -> aeItemStack.getItem() + .getItemStackDisplayName(aeItemStack.getItemStack())) + .collect(Collectors.joining(", ")); + } + + @Override + public String[] getInfoData() { + List ret = new ArrayList<>(); + ret.add( + "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" + : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET); + ret.add("Internal Inventory: "); + int i = 0; + for (PatternSlot slot : internalInventory) { + if (slot == null) continue; + IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE; + + i += 1; + ret.add( + "Slot " + i + + " " + + EnumChatFormatting.BLUE + + describePattern(slot.patternDetails) + + EnumChatFormatting.RESET); + Map itemMap = GTUtility.convertItemListToMap(slot.itemInventory); + for (Map.Entry entry : itemMap.entrySet()) { + ItemStack item = entry.getKey() + .getItemStack(); + long amount = entry.getValue(); + ret.add( + item.getItem() + .getItemStackDisplayName(item) + ": " + + EnumChatFormatting.GOLD + + nc.toWideReadableForm(amount) + + EnumChatFormatting.RESET); + } + Map fluidMap = GTUtility.convertFluidListToMap(slot.fluidInventory); + for (Map.Entry entry : fluidMap.entrySet()) { + FluidStack fluid = new FluidStack(entry.getKey(), 1); + long amount = entry.getValue(); + ret.add( + fluid.getLocalizedName() + ": " + + EnumChatFormatting.AQUA + + nc.toWideReadableForm(amount) + + EnumChatFormatting.RESET); + } + } + return ret.toArray(new String[0]); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public int getCircuitSlot() { + return SLOT_CIRCUIT; + } + + @Override + public int getCircuitSlotX() { + return 170; + } + + @Override + public int getCircuitSlotY() { + return 64; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public int getGUIWidth() { + return super.getGUIWidth() + 16; + } + + @Override + public void addUIWidgets(ModularWindow.@NotNull Builder builder, UIBuildContext buildContext) { + buildContext.addSyncedWindow(MANUAL_SLOT_WINDOW, this::createSlotManualWindow); + builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 9) + .startFromSlot(0) + .endAtSlot(MAX_PATTERN_COUNT - 1) + .phantom(false) + .background(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_PATTERN_ME) + .widgetCreator(slot -> new SlotWidget(slot) { + + @Override + protected ItemStack getItemStackForRendering(Slot slotIn) { + ItemStack stack = slot.getStack(); + if (stack == null || !(stack.getItem() instanceof ItemEncodedPattern patternItem)) { + return stack; + } + ItemStack output = patternItem.getOutput(stack); + return output != null ? output : stack; + } + }.setFilter(itemStack -> itemStack.getItem() instanceof ICraftingPatternItem) + .setChangeListener(() -> onPatternChange(slot.getSlotIndex(), slot.getStack()))) + .build() + .setPos(7, 9)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (clickData.mouseButton == 0) { + widget.getContext() + .openSyncedWindow(MANUAL_SLOT_WINDOW); + } + }) + .setPlayClickSound(true) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_PLUS_LARGE) + .addTooltips(ImmutableList.of("Place manual items")) + .setSize(16, 16) + .setPos(170, 45)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (clickData.mouseButton == 0) { + refundAll(); + } + }) + .setPlayClickSound(true) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_EXPORT) + .addTooltips(ImmutableList.of("Return all internally stored items back to AE")) + .setSize(16, 16) + .setPos(170, 28)); + } + + @Override + public void updateSlots() { + for (int slotId = SLOT_MANUAL_START; slotId < SLOT_MANUAL_START + SLOT_MANUAL_SIZE; ++slotId) { + if (mInventory[slotId] != null && mInventory[slotId].stackSize <= 0) mInventory[slotId] = null; + } + } + + private BaseActionSource getRequest() { + if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); + return requestSource; + } + + private void onPatternChange(int index, ItemStack newItem) { + if (!getBaseMetaTileEntity().isServerSide()) return; + + World world = getBaseMetaTileEntity().getWorld(); + + // remove old if applicable + PatternSlot originalPattern = internalInventory[index]; + if (originalPattern != null) { + if (originalPattern.hasChanged(newItem, world)) { + try { + originalPattern.refund(getProxy(), getRequest()); + } catch (GridAccessException ignored) {} + internalInventory[index] = null; + needPatternSync = true; + } else { + return; // nothing has changed + } + } + + // original does not exist or has changed + if (newItem == null || !(newItem.getItem() instanceof ICraftingPatternItem)) return; + + PatternSlot patternSlot = new PatternSlot(newItem, world, this::getSharedItems); + internalInventory[index] = patternSlot; + patternDetailsPatternSlotMap.put(patternSlot.getPatternDetails(), patternSlot); + + needPatternSync = true; + } + + public ItemStack[] getSharedItems() { + ItemStack[] sharedItems = new ItemStack[SLOT_MANUAL_SIZE + 1]; + sharedItems[0] = mInventory[SLOT_CIRCUIT]; + System.arraycopy(mInventory, SLOT_MANUAL_START, sharedItems, 1, SLOT_MANUAL_SIZE); + return ArrayExt.withoutNulls(sharedItems, ItemStack[]::new); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + NBTTagCompound tag = accessor.getNBTData(); + if (tag.hasKey("name")) + currenttip.add(EnumChatFormatting.AQUA + tag.getString("name") + EnumChatFormatting.RESET); + if (tag.hasKey("inventory")) { + NBTTagList inventory = tag.getTagList("inventory", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < inventory.tagCount(); ++i) { + NBTTagCompound item = inventory.getCompoundTagAt(i); + String name = item.getString("name"); + long amount = item.getLong("amount"); + currenttip.add( + name + ": " + + EnumChatFormatting.GOLD + + ReadableNumberConverter.INSTANCE.toWideReadableForm(amount) + + EnumChatFormatting.RESET); + } + } + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + + NBTTagList inventory = new NBTTagList(); + HashMap nameToAmount = new HashMap<>(); + for (Iterator it = inventories(); it.hasNext();) { + PatternSlot i = it.next(); + for (ItemStack item : i.itemInventory) { + if (item != null && item.stackSize > 0) { + String name = item.getDisplayName(); + nameToAmount.merge(name, (long) item.stackSize, Long::sum); + } + } + for (FluidStack fluid : i.fluidInventory) { + if (fluid != null && fluid.amount > 0) { + String name = fluid.getLocalizedName(); + nameToAmount.merge(name, (long) fluid.amount, Long::sum); + } + } + } + for (Map.Entry entry : nameToAmount.entrySet()) { + NBTTagCompound item = new NBTTagCompound(); + item.setString("name", entry.getKey()); + item.setLong("amount", entry.getValue()); + inventory.appendTag(item); + } + + tag.setTag("inventory", inventory); + if (!Objects.equals(getName(), getLocalName())) { + tag.setString("name", getName()); + } + super.getWailaNBTData(player, tile, tag, world, x, y, z); + } + + @Override + public void provideCrafting(ICraftingProviderHelper craftingTracker) { + if (!isActive()) return; + + for (PatternSlot slot : internalInventory) { + if (slot == null) continue; + ICraftingPatternDetails details = slot.getPatternDetails(); + if (details == null) { + GTMod.GT_FML_LOGGER.warn( + "Found an invalid pattern at " + getBaseMetaTileEntity().getCoords() + + " in dim " + + getBaseMetaTileEntity().getWorld().provider.dimensionId); + continue; + } + craftingTracker.addCraftingOption(this, details); + } + } + + @Override + public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table) { + if (!isActive()) return false; + + if (!supportFluids) { + for (int i = 0; i < table.getSizeInventory(); ++i) { + ItemStack itemStack = table.getStackInSlot(i); + if (itemStack == null) continue; + if (itemStack.getItem() instanceof ItemFluidPacket) return false; + } + } + if (!patternDetailsPatternSlotMap.get(patternDetails) + .insertItemsAndFluids(table)) { + return false; + } + justHadNewItems = true; + return true; + } + + @Override + public boolean isBusy() { + return false; + } + + @Override + public Iterator inventories() { + return Arrays.stream(internalInventory) + .filter(Objects::nonNull) + .iterator(); + } + + @Override + public void onBlockDestroyed() { + refundAll(); + super.onBlockDestroyed(); + } + + private void refundAll() { + for (PatternSlot slot : internalInventory) { + if (slot == null) continue; + try { + slot.refund(getProxy(), getRequest()); + } catch (GridAccessException ignored) {} + } + } + + @Override + public boolean justUpdated() { + boolean ret = justHadNewItems; + justHadNewItems = false; + return ret; + } + + @Override + public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!(aPlayer instanceof EntityPlayerMP)) return; + + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; + + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("type", "CraftingInputBuffer"); + tag.setInteger("x", aBaseMetaTileEntity.getXCoord()); + tag.setInteger("y", aBaseMetaTileEntity.getYCoord()); + tag.setInteger("z", aBaseMetaTileEntity.getZCoord()); + + dataStick.stackTagCompound = tag; + dataStick.setStackDisplayName( + "Crafting Input Buffer Link Data Stick (" + aBaseMetaTileEntity + .getXCoord() + ", " + aBaseMetaTileEntity.getYCoord() + ", " + aBaseMetaTileEntity.getZCoord() + ")"); + aPlayer.addChatMessage(new ChatComponentText("Saved Link Data to Data Stick")); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + final ItemStack is = aPlayer.inventory.getCurrentItem(); + if (is != null && is.getItem() instanceof ToolQuartzCuttingKnife) { + if (ForgeEventFactory.onItemUseStart(aPlayer, is, 1) <= 0) return false; + IGregTechTileEntity te = getBaseMetaTileEntity(); + aPlayer.openGui( + AppEng.instance(), + GuiBridge.GUI_RENAMER.ordinal() << 5 | (side.ordinal()), + te.getWorld(), + te.getXCoord(), + te.getYCoord(), + te.getZCoord()); + return true; + } + return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); + } + + @Override + public ItemStack getCrafterIcon() { + return getMachineCraftingIcon(); + } + + private boolean postMEPatternChange() { + // don't post until it's active + if (!getProxy().isActive()) return false; + try { + getProxy().getGrid() + .postEvent(new MENetworkCraftingPatternChange(this, getProxy().getNode())); + } catch (GridAccessException ignored) { + return false; + } + return true; + } + + protected ModularWindow createSlotManualWindow(final EntityPlayer player) { + final int WIDTH = 68; + final int HEIGHT = 68; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + // make sure the manual window is within the parent window + // otherwise picking up manual items would toss them + // See GuiContainer.java flag1 + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add(Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)))); + builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 3) + .startFromSlot(SLOT_MANUAL_START) + .endAtSlot(SLOT_MANUAL_START + SLOT_MANUAL_SIZE - 1) + .phantom(false) + .background(getGUITextureSet().getItemSlot()) + .build() + .setPos(7, 7)); + return builder.build(); + } + + @Override + public void setInventorySlotContents(int aIndex, ItemStack aStack) { + super.setInventorySlotContents(aIndex, aStack); + if (aIndex >= MAX_PATTERN_COUNT) return; + onPatternChange(aIndex, aStack); + needPatternSync = true; + } + + @Override + public String getCustomName() { + return customName; + } + + @Override + public boolean hasCustomName() { + return customName != null; + } + + @Override + public void setCustomName(String name) { + customName = name; + } + + @Override + public Optional getFirstNonEmptyInventory() { + for (PatternSlot slot : internalInventory) { + if (slot != null && !slot.isEmpty()) return Optional.of(slot); + } + return Optional.empty(); + } + + @Override + public boolean supportsFluids() { + return this.supportFluids; + } + + @Override + public List getItemsForHoloGlasses() { + List list = new ArrayList<>(); + for (PatternSlot slot : internalInventory) { + if (slot == null) continue; + + IAEItemStack[] outputs = slot.getPatternDetails() + .getCondensedOutputs(); + list.add(outputs[0].getItemStack()); + } + return list; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputSlave.java b/src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputSlave.java new file mode 100644 index 0000000000..92cbb0d6e8 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEHatchCraftingInputSlave.java @@ -0,0 +1,260 @@ +package gregtech.common.tileentities.machines; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_SLAVE; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.ItemList; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.render.TextureFactory; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEHatchCraftingInputSlave extends MTEHatchInputBus implements IDualInputHatch { + + private MTEHatchCraftingInputME master; // use getMaster() to access + private int masterX, masterY, masterZ; + private boolean masterSet = false; // indicate if values of masterX, masterY, masterZ are valid + + public MTEHatchCraftingInputSlave(int aID, String aName, String aNameRegional) { + super( + aID, + aName, + aNameRegional, + 6, + 0, + new String[] { "Proxy for Crafting Input Buffer/Bus", + "Link with Crafting Input Buffer/Bus using Data Stick to share inventory", + "Left click on the Crafting Input Buffer/Bus, then right click on this block to link them", }); + disableSort = true; + } + + public MTEHatchCraftingInputSlave(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + disableSort = true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchCraftingInputSlave(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return getTexturesInactive(aBaseTexture); + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_CRAFTING_INPUT_SLAVE) }; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + super.onPostTick(aBaseMetaTileEntity, aTimer); + if (aTimer % 100 == 0 && masterSet && getMaster() == null) { + trySetMasterFromCoord(masterX, masterY, masterZ); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + + if (aNBT.hasKey("master")) { + NBTTagCompound masterNBT = aNBT.getCompoundTag("master"); + masterX = masterNBT.getInteger("x"); + masterY = masterNBT.getInteger("y"); + masterZ = masterNBT.getInteger("z"); + masterSet = true; + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (masterSet) { + NBTTagCompound masterNBT = new NBTTagCompound(); + masterNBT.setInteger("x", masterX); + masterNBT.setInteger("y", masterY); + masterNBT.setInteger("z", masterZ); + aNBT.setTag("master", masterNBT); + } + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + var ret = new ArrayList(); + if (getMaster() != null) { + ret.add( + "This bus is linked to the Crafting Input Buffer at " + masterX + + ", " + + masterY + + ", " + + masterZ + + "."); + ret.addAll(Arrays.asList(getMaster().getInfoData())); + } else ret.add("This bus is not linked to any Crafting Input Buffer."); + return ret.toArray(new String[0]); + } + + public MTEHatchCraftingInputME getMaster() { + if (master == null) return null; + if (master.getBaseMetaTileEntity() == null) { // master disappeared + master = null; + } + return master; + } + + @Override + public byte getTierForStructure() { + return getMaster() == null ? super.getTierForStructure() : getMaster().getTierForStructure(); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public Iterator inventories() { + return getMaster() != null ? getMaster().inventories() : Collections.emptyIterator(); + } + + @Override + public Optional getFirstNonEmptyInventory() { + return getMaster() != null ? getMaster().getFirstNonEmptyInventory() : Optional.empty(); + } + + @Override + public boolean supportsFluids() { + return getMaster() != null && getMaster().supportsFluids(); + } + + @Override + public boolean justUpdated() { + return getMaster() != null && getMaster().justUpdated(); + } + + public MTEHatchCraftingInputME trySetMasterFromCoord(int x, int y, int z) { + var tileEntity = getBaseMetaTileEntity().getWorld() + .getTileEntity(x, y, z); + if (tileEntity == null) return null; + if (!(tileEntity instanceof IGregTechTileEntity gtTileEntity)) return null; + var metaTileEntity = gtTileEntity.getMetaTileEntity(); + if (!(metaTileEntity instanceof MTEHatchCraftingInputME)) return null; + masterX = x; + masterY = y; + masterZ = z; + masterSet = true; + master = (MTEHatchCraftingInputME) metaTileEntity; + return master; + } + + private boolean tryLinkDataStick(EntityPlayer aPlayer) { + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { + return false; + } + if (!dataStick.hasTagCompound() || !dataStick.stackTagCompound.getString("type") + .equals("CraftingInputBuffer")) { + return false; + } + + NBTTagCompound nbt = dataStick.stackTagCompound; + int x = nbt.getInteger("x"); + int y = nbt.getInteger("y"); + int z = nbt.getInteger("z"); + if (trySetMasterFromCoord(x, y, z) != null) { + aPlayer.addChatMessage(new ChatComponentText("Link successful")); + return true; + } + aPlayer.addChatMessage(new ChatComponentText("Link failed")); + return true; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!(aPlayer instanceof EntityPlayerMP)) { + return false; + } + if (tryLinkDataStick(aPlayer)) { + return true; + } + var master = getMaster(); + if (master != null) { + return master.onRightclick(master.getBaseMetaTileEntity(), aPlayer); + } + return false; + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + NBTTagCompound tag = accessor.getNBTData(); + currenttip.add((tag.getBoolean("linked") ? "Linked" : "Not linked")); + + if (tag.hasKey("masterX")) { + currenttip.add( + "Bound to " + tag + .getInteger("masterX") + ", " + tag.getInteger("masterY") + ", " + tag.getInteger("masterZ")); + } + + if (tag.hasKey("masterName")) { + currenttip.add(EnumChatFormatting.GOLD + tag.getString("masterName") + EnumChatFormatting.RESET); + } + + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + + tag.setBoolean("linked", getMaster() != null); + if (masterSet) { + tag.setInteger("masterX", masterX); + tag.setInteger("masterY", masterY); + tag.setInteger("masterZ", masterZ); + } + if (getMaster() != null) tag.setString("masterName", getMaster().getName()); + + super.getWailaNBTData(player, tile, tag, world, x, y, z); + } + + @Override + public List getItemsForHoloGlasses() { + return getMaster() != null ? getMaster().getItemsForHoloGlasses() : null; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEHatchInputBusME.java b/src/main/java/gregtech/common/tileentities/machines/MTEHatchInputBusME.java new file mode 100644 index 0000000000..cbfc18ab0b --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEHatchInputBusME.java @@ -0,0 +1,886 @@ +package gregtech.common.tileentities.machines; + +import static gregtech.api.enums.GTValues.TIER_COLORS; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH_ACTIVE; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.implementations.IPowerChannelState; +import appeng.api.networking.GridFlags; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.MachineSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AECableType; +import appeng.core.localization.WailaText; +import appeng.me.GridAccessException; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.IGridProxyable; +import appeng.util.item.AEItemStack; +import gregtech.api.enums.ItemList; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.IConfigurationCircuitSupport; +import gregtech.api.interfaces.IDataCopyable; +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.MTEHatchInputBus; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +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.GTUtility; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.gui.modularui.widget.AESlotWidget; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEHatchInputBusME extends MTEHatchInputBus implements IConfigurationCircuitSupport, + IRecipeProcessingAwareHatch, IAddGregtechLogo, IAddUIWidgets, IPowerChannelState, ISmartInputHatch, IDataCopyable { + + private static final int SLOT_COUNT = 16; + public static final String COPIED_DATA_IDENTIFIER = "stockingBus"; + private BaseActionSource requestSource = null; + private @Nullable AENetworkProxy gridProxy = null; + private final ItemStack[] shadowInventory = new ItemStack[SLOT_COUNT]; + private final int[] savedStackSizes = new int[SLOT_COUNT]; + private boolean processingRecipe = false; + private final boolean autoPullAvailable; + private boolean autoPullItemList = false; + private int minAutoPullStackSize = 1; + private int autoPullRefreshTime = 100; + private static final int CONFIG_WINDOW_ID = 10; + private boolean additionalConnection = false; + private boolean justHadNewItems = false; + private boolean expediteRecipeCheck = false; + + public MTEHatchInputBusME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) { + super( + aID, + aName, + aNameRegional, + autoPullAvailable ? 6 : 3, + SLOT_COUNT * 2 + 2, + getDescriptionArray(autoPullAvailable)); + this.autoPullAvailable = autoPullAvailable; + disableSort = true; + } + + public MTEHatchInputBusME(String aName, boolean autoPullAvailable, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, SLOT_COUNT * 2 + 2, aDescription, aTextures); + this.autoPullAvailable = autoPullAvailable; + disableSort = true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchInputBusME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_HATCH_ACTIVE) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_HATCH) }; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + if (getBaseMetaTileEntity().isServerSide()) { + if (aTimer % autoPullRefreshTime == 0 && autoPullItemList) { + refreshItemList(); + } + if (aTimer % 20 == 0) { + getBaseMetaTileEntity().setActive(isActive()); + } + } + super.onPostTick(aBaseMetaTileEntity, aTimer); + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + getProxy().onReady(); + } + + @Override + public AECableType getCableConnectionType(ForgeDirection forgeDirection) { + return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; + } + + private void updateValidGridProxySides() { + if (additionalConnection) { + getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); + } else { + getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); + } + } + + @Override + public void onFacingChange() { + updateValidGridProxySides(); + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + additionalConnection = !additionalConnection; + updateValidGridProxySides(); + aPlayer.addChatComponentMessage( + new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); + return true; + } + + @Override + public AENetworkProxy getProxy() { + if (gridProxy == null) { + if (getBaseMetaTileEntity() instanceof IGridProxyable) { + gridProxy = new AENetworkProxy( + (IGridProxyable) getBaseMetaTileEntity(), + "proxy", + autoPullAvailable ? ItemList.Hatch_Input_Bus_ME_Advanced.get(1) + : ItemList.Hatch_Input_Bus_ME.get(1), + true); + gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); + updateValidGridProxySides(); + if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( + getBaseMetaTileEntity().getWorld() + .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); + } + } + return this.gridProxy; + } + + @Override + public boolean isPowered() { + return getProxy() != null && getProxy().isPowered(); + } + + @Override + public boolean isActive() { + return getProxy() != null && getProxy().isActive(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + int[] sizes = new int[16]; + for (int i = 0; i < 16; ++i) sizes[i] = mInventory[i + 16] == null ? 0 : mInventory[i + 16].stackSize; + aNBT.setIntArray("sizes", sizes); + aNBT.setBoolean("autoStock", autoPullItemList); + aNBT.setInteger("minAutoPullStackSize", minAutoPullStackSize); + aNBT.setBoolean("additionalConnection", additionalConnection); + aNBT.setBoolean("expediteRecipeCheck", expediteRecipeCheck); + aNBT.setInteger("refreshTime", autoPullRefreshTime); + getProxy().writeToNBT(aNBT); + } + + private void setAutoPullItemList(boolean pullItemList) { + if (!autoPullAvailable) { + return; + } + + autoPullItemList = pullItemList; + if (!autoPullItemList) { + for (int i = 0; i < SLOT_COUNT; i++) { + mInventory[i] = null; + } + } else { + refreshItemList(); + } + updateAllInformationSlots(); + } + + public boolean doFastRecipeCheck() { + return expediteRecipeCheck; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("sizes")) { + int[] sizes = aNBT.getIntArray("sizes"); + if (sizes.length == 16) { + for (int i = 0; i < 16; ++i) { + if (sizes[i] != 0 && mInventory[i] != null) { + ItemStack s = mInventory[i].copy(); + s.stackSize = sizes[i]; + mInventory[i + 16] = s; + } + } + } + } + autoPullItemList = aNBT.getBoolean("autoStock"); + minAutoPullStackSize = aNBT.getInteger("minAutoPullStackSize"); + additionalConnection = aNBT.getBoolean("additionalConnection"); + expediteRecipeCheck = aNBT.getBoolean("expediteRecipeCheck"); + if (aNBT.hasKey("refreshTime")) { + autoPullRefreshTime = aNBT.getInteger("refreshTime"); + } + getProxy().readFromNBT(aNBT); + + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { + "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" + : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET }; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (!autoPullAvailable) { + return; + } + + setAutoPullItemList(!autoPullItemList); + aPlayer.addChatMessage( + new ChatComponentTranslation( + "GT5U.machines.stocking_bus.auto_pull_toggle." + (autoPullItemList ? "enabled" : "disabled"))); + } + + @Override + public void updateSlots() { + if (mInventory[getManualSlot()] != null && mInventory[getManualSlot()].stackSize <= 0) + mInventory[getManualSlot()] = null; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + if (!(aPlayer instanceof EntityPlayerMP)) + return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) + return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); + + if (!pasteCopiedData(aPlayer, dataStick.stackTagCompound)) return false; + + updateValidGridProxySides(); + aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.loaded")); + return true; + } + + @Override + public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!(aPlayer instanceof EntityPlayerMP)) return; + + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; + + dataStick.stackTagCompound = getCopiedData(aPlayer); + dataStick.setStackDisplayName("Stocking Input Bus Configuration"); + aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.saved")); + } + + @Override + public String getCopiedDataIdentifier(EntityPlayer player) { + return COPIED_DATA_IDENTIFIER; + } + + @Override + public boolean pasteCopiedData(EntityPlayer player, NBTTagCompound nbt) { + if (nbt == null || !COPIED_DATA_IDENTIFIER.equals(nbt.getString("type"))) return false; + ItemStack circuit = GTUtility.loadItem(nbt, "circuit"); + if (GTUtility.isStackInvalid(circuit)) circuit = null; + + if (autoPullAvailable) { + setAutoPullItemList(nbt.getBoolean("autoPull")); + minAutoPullStackSize = nbt.getInteger("minStackSize"); + // Data sticks created before refreshTime was implemented should not cause stocking buses to + // spam divide by zero errors + if (nbt.hasKey("refreshTime")) { + autoPullRefreshTime = nbt.getInteger("refreshTime"); + } + } + + additionalConnection = nbt.getBoolean("additionalConnection"); + if (!autoPullItemList) { + NBTTagList stockingItems = nbt.getTagList("itemsToStock", 10); + for (int i = 0; i < stockingItems.tagCount(); i++) { + this.mInventory[i] = GTUtility.loadItem(stockingItems.getCompoundTagAt(i)); + } + } + setInventorySlotContents(getCircuitSlot(), circuit); + return true; + } + + @Override + public NBTTagCompound getCopiedData(EntityPlayer player) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("type", COPIED_DATA_IDENTIFIER); + tag.setBoolean("autoPull", autoPullItemList); + tag.setInteger("minStackSize", minAutoPullStackSize); + tag.setInteger("refreshTime", autoPullRefreshTime); + tag.setBoolean("additionalConnection", additionalConnection); + tag.setTag("circuit", GTUtility.saveItem(getStackInSlot(getCircuitSlot()))); + + NBTTagList stockingItems = new NBTTagList(); + + if (!autoPullItemList) { + for (int index = 0; index < SLOT_COUNT; index++) { + stockingItems.appendTag(GTUtility.saveItem(mInventory[index])); + } + tag.setTag("itemsToStock", stockingItems); + } + return tag; + } + + private int getManualSlot() { + return SLOT_COUNT * 2 + 1; + } + + @Override + public int getCircuitSlot() { + return SLOT_COUNT * 2; + } + + @Override + public int getCircuitSlotX() { + return 80; + } + + @Override + public int getCircuitSlotY() { + return 64; + } + + @Override + public boolean setStackToZeroInsteadOfNull(int aIndex) { + return aIndex != getManualSlot(); + } + + @Override + public boolean justUpdated() { + if (expediteRecipeCheck) { + boolean ret = justHadNewItems; + justHadNewItems = false; + return ret; + } + return false; + } + + public void setRecipeCheck(boolean value) { + expediteRecipeCheck = value; + } + + @Override + public void setInventorySlotContents(int aIndex, ItemStack aStack) { + if (expediteRecipeCheck && aStack != null) { + justHadNewItems = true; + } + super.setInventorySlotContents(aIndex, aStack); + } + + @Override + public ItemStack getStackInSlot(int aIndex) { + if (!processingRecipe) return super.getStackInSlot(aIndex); + if (aIndex < 0 || aIndex > mInventory.length) return null; + if (aIndex >= SLOT_COUNT && aIndex < SLOT_COUNT * 2) + // Display slots + return null; + if (aIndex == getCircuitSlot() || aIndex == getManualSlot()) return mInventory[aIndex]; + if (mInventory[aIndex] != null) { + AENetworkProxy proxy = getProxy(); + if (proxy == null || !proxy.isActive()) { + return null; + } + try { + IMEMonitor sg = proxy.getStorage() + .getItemInventory(); + IAEItemStack request = AEItemStack.create(mInventory[aIndex]); + request.setStackSize(Integer.MAX_VALUE); + IAEItemStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource()); + if (result != null) { + this.shadowInventory[aIndex] = result.getItemStack(); + this.savedStackSizes[aIndex] = this.shadowInventory[aIndex].stackSize; + this.setInventorySlotContents(aIndex + SLOT_COUNT, this.shadowInventory[aIndex]); + return this.shadowInventory[aIndex]; + } else { + // Request failed + this.setInventorySlotContents(aIndex + SLOT_COUNT, null); + return null; + } + } catch (final GridAccessException ignored) {} + return null; + } else { + // AE available but no items requested + this.setInventorySlotContents(aIndex + SLOT_COUNT, null); + } + return mInventory[aIndex]; + } + + private BaseActionSource getRequestSource() { + if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); + return requestSource; + } + + @Override + public void onExplosion() { + for (int i = 0; i < SLOT_COUNT; i++) { + mInventory[i] = null; + } + } + + @Override + public void startRecipeProcessing() { + processingRecipe = true; + updateAllInformationSlots(); + } + + private void refreshItemList() { + AENetworkProxy proxy = getProxy(); + try { + IMEMonitor sg = proxy.getStorage() + .getItemInventory(); + Iterator iterator = sg.getStorageList() + .iterator(); + int index = 0; + while (iterator.hasNext() && index < SLOT_COUNT) { + IAEItemStack currItem = iterator.next(); + if (currItem.getStackSize() >= minAutoPullStackSize) { + ItemStack itemstack = GTUtility.copyAmount(1, currItem.getItemStack()); + if (expediteRecipeCheck) { + ItemStack previous = this.mInventory[index]; + if (itemstack != null) { + justHadNewItems = !ItemStack.areItemStacksEqual(itemstack, previous); + } + } + this.mInventory[index] = itemstack; + index++; + } + } + for (int i = index; i < SLOT_COUNT; i++) { + mInventory[i] = null; + } + + } catch (final GridAccessException ignored) {} + } + + private void updateAllInformationSlots() { + for (int index = 0; index < SLOT_COUNT; index++) { + updateInformationSlot(index, mInventory[index]); + } + } + + @Override + public CheckRecipeResult endRecipeProcessing(MTEMultiBlockBase controller) { + CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.SUCCESSFUL; + for (int i = 0; i < SLOT_COUNT; ++i) { + if (savedStackSizes[i] != 0) { + ItemStack oldStack = shadowInventory[i]; + if (oldStack == null || oldStack.stackSize < savedStackSizes[i]) { + AENetworkProxy proxy = getProxy(); + try { + IMEMonitor sg = proxy.getStorage() + .getItemInventory(); + IAEItemStack request = AEItemStack.create(mInventory[i]); + int toExtract = savedStackSizes[i] - (oldStack == null ? 0 : oldStack.stackSize); + request.setStackSize(toExtract); + IAEItemStack result = sg.extractItems(request, Actionable.MODULATE, getRequestSource()); + proxy.getEnergy() + .extractAEPower(request.getStackSize(), Actionable.MODULATE, PowerMultiplier.CONFIG); + setInventorySlotContents(i + SLOT_COUNT, oldStack); + if (result == null || result.getStackSize() != toExtract) { + controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); + checkRecipeResult = SimpleCheckRecipeResult + .ofFailurePersistOnShutdown("stocking_bus_fail_extraction"); + } + } catch (final GridAccessException ignored) { + controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); + checkRecipeResult = SimpleCheckRecipeResult + .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction"); + } + } + savedStackSizes[i] = 0; + shadowInventory[i] = null; + if (mInventory[i + SLOT_COUNT] != null && mInventory[i + SLOT_COUNT].stackSize <= 0) { + mInventory[i + SLOT_COUNT] = null; + } + } + } + processingRecipe = false; + return checkRecipeResult; + } + + /** + * Update the right side of the GUI, which shows the amounts of items set on the left side + */ + public ItemStack updateInformationSlot(int aIndex, ItemStack aStack) { + if (aIndex >= 0 && aIndex < SLOT_COUNT) { + if (aStack == null) { + super.setInventorySlotContents(aIndex + SLOT_COUNT, null); + } else { + AENetworkProxy proxy = getProxy(); + if (!proxy.isActive()) { + super.setInventorySlotContents(aIndex + SLOT_COUNT, null); + return null; + } + try { + IMEMonitor sg = proxy.getStorage() + .getItemInventory(); + IAEItemStack request = AEItemStack.create(mInventory[aIndex]); + request.setStackSize(Integer.MAX_VALUE); + IAEItemStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource()); + ItemStack s = (result != null) ? result.getItemStack() : null; + // We want to track changes in any ItemStack to notify any connected controllers to make a recipe + // check early + if (expediteRecipeCheck) { + ItemStack previous = getStackInSlot(aIndex + SLOT_COUNT); + if (s != null) { + justHadNewItems = !ItemStack.areItemStacksEqual(s, previous); + } + } + setInventorySlotContents(aIndex + SLOT_COUNT, s); + return s; + } catch (final GridAccessException ignored) {} + } + } + return null; + } + + /** + * Used to avoid slot update. + */ + public ItemStack getShadowItemStack(int index) { + if (index < 0 || index >= shadowInventory.length) { + return null; + } + return shadowInventory[index]; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex == getManualSlot(); + } + + @Override + public int getGUIHeight() { + return 179; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + final SlotWidget[] aeSlotWidgets = new SlotWidget[16]; + + if (autoPullAvailable) { + buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow); + } + + builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 4) + .startFromSlot(0) + .endAtSlot(15) + .phantom(true) + .slotCreator(index -> new BaseSlot(inventoryHandler, index, true) { + + @Override + public boolean isEnabled() { + return !autoPullItemList && super.isEnabled(); + } + }) + .widgetCreator(slot -> (SlotWidget) new SlotWidget(slot) { + + @Override + protected void phantomClick(ClickData clickData, ItemStack cursorStack) { + if (clickData.mouseButton != 0 || !getMcSlot().isEnabled()) return; + final int aSlotIndex = getMcSlot().getSlotIndex(); + if (cursorStack == null) { + getMcSlot().putStack(null); + } else { + if (containsSuchStack(cursorStack)) return; + getMcSlot().putStack(GTUtility.copyAmount(1, cursorStack)); + } + if (getBaseMetaTileEntity().isServerSide()) { + final ItemStack newInfo = updateInformationSlot(aSlotIndex, cursorStack); + aeSlotWidgets[getMcSlot().getSlotIndex()].getMcSlot() + .putStack(newInfo); + } + } + + @Override + public IDrawable[] getBackground() { + IDrawable slot; + if (autoPullItemList) { + slot = GTUITextures.SLOT_DARK_GRAY; + } else { + slot = ModularUITextures.ITEM_SLOT; + } + return new IDrawable[] { slot, GTUITextures.OVERLAY_SLOT_ARROW_ME }; + } + + @Override + public List getExtraTooltip() { + if (autoPullItemList) { + return Collections.singletonList( + StatCollector.translateToLocal("GT5U.machines.stocking_bus.cannot_set_slot")); + } else { + return Collections + .singletonList(StatCollector.translateToLocal("modularui.phantom.single.clear")); + } + } + + private boolean containsSuchStack(ItemStack tStack) { + for (int i = 0; i < 16; ++i) { + if (GTUtility.areStacksEqual(mInventory[i], tStack, false)) return true; + } + return false; + } + }.dynamicTooltip(() -> { + if (autoPullItemList) { + return Collections.singletonList( + StatCollector.translateToLocal("GT5U.machines.stocking_bus.cannot_set_slot")); + } else { + return Collections.emptyList(); + } + }) + .setUpdateTooltipEveryTick(true)) + .build() + .setPos(7, 9)) + .widget( + SlotGroup.ofItemHandler(inventoryHandler, 4) + .startFromSlot(16) + .endAtSlot(31) + .phantom(true) + .background(GTUITextures.SLOT_DARK_GRAY) + .widgetCreator( + slot -> aeSlotWidgets[slot.getSlotIndex() - 16] = new AESlotWidget(slot).disableInteraction()) + .build() + .setPos(97, 9)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_DOUBLE) + .setPos(82, 30) + .setSize(12, 12)); + + if (autoPullAvailable) { + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (clickData.mouseButton == 0) { + setAutoPullItemList(!autoPullItemList); + } else if (clickData.mouseButton == 1 && !widget.isClient()) { + widget.getContext() + .openSyncedWindow(CONFIG_WINDOW_ID); + } + }) + .setBackground(() -> { + if (autoPullItemList) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_AUTOPULL_ME }; + } else { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_AUTOPULL_ME_DISABLED }; + } + }) + .addTooltips( + Arrays.asList( + StatCollector.translateToLocal("GT5U.machines.stocking_bus.auto_pull.tooltip.1"), + StatCollector.translateToLocal("GT5U.machines.stocking_bus.auto_pull.tooltip.2"))) + .setSize(16, 16) + .setPos(80, 10)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullItemList, this::setAutoPullItemList)); + } + + builder.widget(TextWidget.dynamicString(() -> { + boolean isActive = isActive(); + boolean isPowered = isPowered(); + boolean isBooting = isBooting(); + EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN : EnumChatFormatting.DARK_RED; + return color + WailaText.getPowerState(isActive, isPowered, isBooting); + }) + .setTextAlignment(Alignment.Center) + .setSize(90, 9) + .setPos(43, 84)) + .widget( + new SlotWidget(inventoryHandler, getManualSlot()) + // ghost slots are prioritized over manual slot + .setShiftClickPriority(11) + .setPos(79, 45)); + } + + protected ModularWindow createStackSizeConfigurationWindow(final EntityPlayer player) { + final int WIDTH = 78; + final int HEIGHT = 115; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add( + Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) + .add(WIDTH - 3, 0))); + builder.widget( + TextWidget.localised("GT5U.machines.stocking_bus.min_stack_size") + .setPos(3, 2) + .setSize(74, 14)) + .widget( + new NumericWidget().setSetter(val -> minAutoPullStackSize = (int) val) + .setGetter(() -> minAutoPullStackSize) + .setBounds(1, Integer.MAX_VALUE) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(70, 18) + .setPos(3, 18) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)); + builder.widget( + TextWidget.localised("GT5U.machines.stocking_bus.refresh_time") + .setPos(3, 42) + .setSize(74, 14)) + .widget( + new NumericWidget().setSetter(val -> autoPullRefreshTime = (int) val) + .setGetter(() -> autoPullRefreshTime) + .setBounds(1, Integer.MAX_VALUE) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(70, 18) + .setPos(3, 58) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)); + builder.widget( + TextWidget.localised("GT5U.machines.stocking_bus.force_check") + .setPos(3, 88) + .setSize(50, 14)) + .widget( + new CycleButtonWidget().setToggle(() -> expediteRecipeCheck, val -> setRecipeCheck(val)) + .setTextureGetter( + state -> expediteRecipeCheck ? GTUITextures.OVERLAY_BUTTON_CHECKMARK + : GTUITextures.OVERLAY_BUTTON_CROSS) + .setBackground(GTUITextures.BUTTON_STANDARD) + .setPos(53, 87) + .setSize(16, 16) + .addTooltip(StatCollector.translateToLocal("GT5U.machines.stocking_bus.hatch_warning"))); + return builder.build(); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(80, 63)); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + if (!autoPullAvailable) { + super.getWailaBody(itemStack, currenttip, accessor, config); + return; + } + + NBTTagCompound tag = accessor.getNBTData(); + boolean autopull = tag.getBoolean("autoPull"); + int minSize = tag.getInteger("minStackSize"); + currenttip.add( + StatCollector.translateToLocal("GT5U.waila.stocking_bus.auto_pull." + (autopull ? "enabled" : "disabled"))); + if (autopull) { + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.stocking_bus.min_stack_size", + GTUtility.formatNumbers(minSize))); + } + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + if (!autoPullAvailable) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + return; + } + + tag.setBoolean("autoPull", autoPullItemList); + tag.setInteger("minStackSize", minAutoPullStackSize); + super.getWailaNBTData(player, tile, tag, world, x, y, z); + } + + private static String[] getDescriptionArray(boolean autoPullAvailable) { + List strings = new ArrayList<>(8); + strings.add("Advanced item input for Multiblocks"); + strings.add("Hatch Tier: " + TIER_COLORS[autoPullAvailable ? 6 : 3] + VN[autoPullAvailable ? 6 : 3]); + strings.add("Retrieves directly from ME"); + strings.add("Keeps 16 item types in stock"); + + if (autoPullAvailable) { + strings.add( + "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds."); + strings.add("Toggle by right-clicking with screwdriver, or use the GUI."); + strings.add( + "Use the GUI to limit the minimum stack size for Auto-Pulling, adjust the slot refresh timer and enable fast recipe checks."); + strings.add("WARNING: Fast recipe checks can be laggy. Use with caution."); + } + + strings.add("Change ME connection behavior by right-clicking with wire cutter."); + strings.add("Configuration data can be copy+pasted using a data stick."); + return strings.toArray(new String[0]); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEHatchInputME.java b/src/main/java/gregtech/common/tileentities/machines/MTEHatchInputME.java new file mode 100644 index 0000000000..251023125a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEHatchInputME.java @@ -0,0 +1,949 @@ +package gregtech.common.tileentities.machines; + +import static gregtech.api.enums.GTValues.TIER_COLORS; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Interactable; +import com.gtnewhorizons.modularui.common.fluid.FluidStackTank; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.implementations.IPowerChannelState; +import appeng.api.networking.GridFlags; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.MachineSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.util.AECableType; +import appeng.core.localization.WailaText; +import appeng.me.GridAccessException; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.IGridProxyable; +import appeng.util.item.AEFluidStack; +import gregtech.api.enums.ItemList; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.IDataCopyable; +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.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +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.GTUtility; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEHatchInputME extends MTEHatchInput implements IPowerChannelState, IAddGregtechLogo, IAddUIWidgets, + IRecipeProcessingAwareHatch, ISmartInputHatch, IDataCopyable { + + private static final int SLOT_COUNT = 16; + public static final String COPIED_DATA_IDENTIFIER = "stockingHatch"; + + protected final FluidStack[] storedFluids = new FluidStack[SLOT_COUNT]; + protected final FluidStack[] storedInformationFluids = new FluidStack[SLOT_COUNT]; + + // these two fields should ALWAYS be mutated simultaneously + // in most cases, you should call setSavedFluid() instead of trying to write to the array directly + // a desync of these two fields can lead to catastrophe + protected final FluidStack[] shadowStoredFluids = new FluidStack[SLOT_COUNT]; + private final int[] savedStackSizes = new int[SLOT_COUNT]; + + private boolean additionalConnection = false; + + protected BaseActionSource requestSource = null; + + @Nullable + protected AENetworkProxy gridProxy = null; + + private final boolean autoPullAvailable; + protected boolean autoPullFluidList = false; + protected int minAutoPullAmount = 1; + private int autoPullRefreshTime = 100; + protected boolean processingRecipe = false; + private boolean justHadNewFluids = false; + private boolean expediteRecipeCheck = false; + + protected static final int CONFIG_WINDOW_ID = 10; + + protected static final FluidStack[] EMPTY_FLUID_STACK = new FluidStack[0]; + + public MTEHatchInputME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, autoPullAvailable ? 10 : 8, 1, getDescriptionArray(autoPullAvailable)); + this.autoPullAvailable = autoPullAvailable; + } + + public MTEHatchInputME(String aName, boolean autoPullAvailable, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, 1, aTier, aDescription, aTextures); + this.autoPullAvailable = autoPullAvailable; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchInputME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH) }; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + if (getBaseMetaTileEntity().isServerSide()) { + if (aTimer % autoPullRefreshTime == 0 && autoPullFluidList) { + refreshFluidList(); + } + if (aTimer % 20 == 0) { + getBaseMetaTileEntity().setActive(isActive()); + } + } + super.onPostTick(aBaseMetaTileEntity, aTimer); + } + + private void refreshFluidList() { + AENetworkProxy proxy = getProxy(); + if (proxy == null || !proxy.isActive()) { + return; + } + + try { + IMEMonitor sg = proxy.getStorage() + .getFluidInventory(); + Iterator iterator = sg.getStorageList() + .iterator(); + + int index = 0; + while (iterator.hasNext() && index < SLOT_COUNT) { + IAEFluidStack currItem = iterator.next(); + if (currItem.getStackSize() >= minAutoPullAmount) { + FluidStack fluidStack = GTUtility.copyAmount(1, currItem.getFluidStack()); + if (expediteRecipeCheck) { + FluidStack previous = storedFluids[index]; + if (fluidStack != null && previous != null) { + justHadNewFluids = !fluidStack.isFluidEqual(previous); + } + } + storedFluids[index] = fluidStack; + index++; + } + } + + for (int i = index; i < SLOT_COUNT; i++) { + storedFluids[i] = null; + } + } catch (final GridAccessException ignored) {} + } + + @Override + public boolean displaysStackSize() { + return true; + } + + protected void setSavedFluid(int i, FluidStack stack) { + shadowStoredFluids[i] = stack; + savedStackSizes[i] = stack == null ? 0 : stack.amount; + } + + public FluidStack[] getStoredFluids() { + if (!processingRecipe) { + return EMPTY_FLUID_STACK; + } + + AENetworkProxy proxy = getProxy(); + if (proxy == null || !proxy.isActive()) { + return EMPTY_FLUID_STACK; + } + + updateAllInformationSlots(); + + for (int i = 0; i < SLOT_COUNT; i++) { + if (storedFluids[i] == null) { + setSavedFluid(i, null); + continue; + } + + FluidStack fluidStackWithAmount = storedInformationFluids[i]; + + setSavedFluid(i, fluidStackWithAmount); + } + + return shadowStoredFluids; + } + + @Override + public boolean justUpdated() { + if (expediteRecipeCheck) { + boolean ret = justHadNewFluids; + justHadNewFluids = false; + return ret; + } + return false; + } + + public void setRecipeCheck(boolean value) { + expediteRecipeCheck = value; + } + + @Override + public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) { + // this is an ME input hatch. allowing draining via logistics would be very wrong (and against + // canTankBeEmptied()) but we do need to support draining from controller, which uses the UNKNOWN direction. + if (side != ForgeDirection.UNKNOWN) return null; + FluidStack stored = getMatchingFluidStack(aFluid); + if (stored == null) return null; + FluidStack drained = GTUtility.copyAmount(Math.min(stored.amount, aFluid.amount), stored); + if (doDrain) { + stored.amount -= drained.amount; + } + return drained; + } + + @Override + public void startRecipeProcessing() { + processingRecipe = true; + updateAllInformationSlots(); + } + + @Override + public CheckRecipeResult endRecipeProcessing(MTEMultiBlockBase controller) { + CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.SUCCESSFUL; + AENetworkProxy proxy = getProxy(); + + for (int i = 0; i < SLOT_COUNT; ++i) { + FluidStack oldStack = shadowStoredFluids[i]; + int toExtract = savedStackSizes[i] - (oldStack != null ? oldStack.amount : 0); + if (toExtract <= 0) continue; + + try { + IMEMonitor sg = proxy.getStorage() + .getFluidInventory(); + + IAEFluidStack request = AEFluidStack.create(storedFluids[i]); + request.setStackSize(toExtract); + IAEFluidStack extractionResult = sg.extractItems(request, Actionable.MODULATE, getRequestSource()); + proxy.getEnergy() + .extractAEPower(toExtract, Actionable.MODULATE, PowerMultiplier.CONFIG); + + if (extractionResult == null || extractionResult.getStackSize() != toExtract) { + controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); + checkRecipeResult = SimpleCheckRecipeResult + .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction"); + } + } catch (GridAccessException ignored) { + controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); + checkRecipeResult = SimpleCheckRecipeResult + .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction"); + } + setSavedFluid(i, null); + if (storedInformationFluids[i] != null && storedInformationFluids[i].amount <= 0) { + storedInformationFluids[i] = null; + } + } + + processingRecipe = false; + return checkRecipeResult; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + getProxy().onReady(); + } + + @Override + public AECableType getCableConnectionType(ForgeDirection forgeDirection) { + return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; + } + + private void updateValidGridProxySides() { + if (additionalConnection) { + getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); + } else { + getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); + } + } + + @Override + public void onFacingChange() { + updateValidGridProxySides(); + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + additionalConnection = !additionalConnection; + updateValidGridProxySides(); + aPlayer.addChatComponentMessage( + new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); + return true; + } + + @Override + public AENetworkProxy getProxy() { + if (gridProxy == null) { + if (getBaseMetaTileEntity() instanceof IGridProxyable) { + gridProxy = new AENetworkProxy( + (IGridProxyable) getBaseMetaTileEntity(), + "proxy", + autoPullAvailable ? ItemList.Hatch_Input_ME_Advanced.get(1) : ItemList.Hatch_Input_ME.get(1), + true); + gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); + updateValidGridProxySides(); + if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( + getBaseMetaTileEntity().getWorld() + .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); + } + } + return this.gridProxy; + } + + @Override + public boolean isPowered() { + return getProxy() != null && getProxy().isPowered(); + } + + @Override + public boolean isActive() { + return getProxy() != null && getProxy().isActive(); + } + + private void setAutoPullFluidList(boolean pullFluidList) { + if (!autoPullAvailable) { + return; + } + + autoPullFluidList = pullFluidList; + if (!autoPullFluidList) { + Arrays.fill(storedFluids, null); + } else { + refreshFluidList(); + } + updateAllInformationSlots(); + } + + public boolean doFastRecipeCheck() { + return expediteRecipeCheck; + } + + private void updateAllInformationSlots() { + for (int index = 0; index < SLOT_COUNT; index++) { + updateInformationSlot(index); + } + } + + public void updateInformationSlot(int index) { + if (index < 0 || index >= SLOT_COUNT) { + return; + } + + FluidStack fluidStack = storedFluids[index]; + if (fluidStack == null) { + storedInformationFluids[index] = null; + return; + } + + AENetworkProxy proxy = getProxy(); + if (proxy == null || !proxy.isActive()) { + storedInformationFluids[index] = null; + return; + } + + try { + IMEMonitor sg = proxy.getStorage() + .getFluidInventory(); + IAEFluidStack request = AEFluidStack.create(fluidStack); + request.setStackSize(Integer.MAX_VALUE); + IAEFluidStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource()); + FluidStack resultFluid = (result != null) ? result.getFluidStack() : null; + // We want to track if any FluidStack is modified to notify any connected controllers to make a recipe check + // early + if (expediteRecipeCheck) { + FluidStack previous = storedInformationFluids[index]; + if (resultFluid != null) { + justHadNewFluids = !resultFluid.isFluidEqual(previous); + } + } + storedInformationFluids[index] = resultFluid; + } catch (final GridAccessException ignored) {} + } + + private BaseActionSource getRequestSource() { + if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); + return requestSource; + } + + public FluidStack getMatchingFluidStack(FluidStack fluidStack) { + if (fluidStack == null) return null; + + AENetworkProxy proxy = getProxy(); + if (proxy == null || !proxy.isActive()) { + return null; + } + + for (int i = 0; i < storedFluids.length; i++) { + if (storedFluids[i] == null) { + continue; + } + + if (GTUtility.areFluidsEqual(fluidStack, storedFluids[i], false)) { + updateInformationSlot(i); + if (storedInformationFluids[i] != null) { + setSavedFluid(i, storedInformationFluids[i]); + return shadowStoredFluids[i]; + } + + setSavedFluid(i, null); + return null; + } + } + return null; + } + + /** + * Used to avoid slot update. + */ + public FluidStack getShadowFluidStack(int index) { + if (index < 0 || index >= storedFluids.length) { + return null; + } + + return shadowStoredFluids[index]; + } + + public int getFluidSlot(FluidStack fluidStack) { + if (fluidStack == null) return -1; + + for (int i = 0; i < storedFluids.length; i++) { + if (storedFluids[i] == null) { + continue; + } + + if (GTUtility.areFluidsEqual(fluidStack, storedFluids[i], false)) { + return i; + } + } + + return -1; + } + + @Override + public boolean canTankBeEmptied() { + return false; + } + + @Override + public boolean canTankBeFilled() { + return false; + } + + @Override + public boolean doesEmptyContainers() { + return false; + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + + NBTTagList nbtTagList = new NBTTagList(); + for (int i = 0; i < SLOT_COUNT; i++) { + FluidStack fluidStack = storedFluids[i]; + if (fluidStack == null) { + continue; + } + NBTTagCompound fluidTag = fluidStack.writeToNBT(new NBTTagCompound()); + if (storedInformationFluids[i] != null) + fluidTag.setInteger("informationAmount", storedInformationFluids[i].amount); + nbtTagList.appendTag(fluidTag); + } + + aNBT.setTag("storedFluids", nbtTagList); + aNBT.setBoolean("autoPull", autoPullFluidList); + aNBT.setInteger("minAmount", minAutoPullAmount); + aNBT.setBoolean("additionalConnection", additionalConnection); + aNBT.setBoolean("expediteRecipeCheck", expediteRecipeCheck); + aNBT.setInteger("refreshTime", autoPullRefreshTime); + getProxy().writeToNBT(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("storedFluids")) { + NBTTagList nbtTagList = aNBT.getTagList("storedFluids", 10); + int c = Math.min(nbtTagList.tagCount(), SLOT_COUNT); + for (int i = 0; i < c; i++) { + NBTTagCompound nbtTagCompound = nbtTagList.getCompoundTagAt(i); + FluidStack fluidStack = GTUtility.loadFluid(nbtTagCompound); + storedFluids[i] = fluidStack; + + if (nbtTagCompound.hasKey("informationAmount")) { + int informationAmount = nbtTagCompound.getInteger("informationAmount"); + storedInformationFluids[i] = GTUtility.copyAmount(informationAmount, fluidStack); + } + } + } + + minAutoPullAmount = aNBT.getInteger("minAmount"); + autoPullFluidList = aNBT.getBoolean("autoPull"); + additionalConnection = aNBT.getBoolean("additionalConnection"); + expediteRecipeCheck = aNBT.getBoolean("expediteRecipeCheck"); + if (aNBT.hasKey("refreshTime")) { + autoPullRefreshTime = aNBT.getInteger("refreshTime"); + } + getProxy().readFromNBT(aNBT); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (!autoPullAvailable) { + return; + } + + setAutoPullFluidList(!autoPullFluidList); + aPlayer.addChatMessage( + new ChatComponentTranslation( + "GT5U.machines.stocking_hatch.auto_pull_toggle." + (autoPullFluidList ? "enabled" : "disabled"))); + } + + @Override + public String getCopiedDataIdentifier(EntityPlayer player) { + return COPIED_DATA_IDENTIFIER; + } + + @Override + public boolean pasteCopiedData(EntityPlayer player, NBTTagCompound nbt) { + if (nbt == null || !COPIED_DATA_IDENTIFIER.equals(nbt.getString("type"))) return false; + + if (autoPullAvailable) { + setAutoPullFluidList(nbt.getBoolean("autoPull")); + minAutoPullAmount = nbt.getInteger("minAmount"); + autoPullRefreshTime = nbt.getInteger("refreshTime"); + } + additionalConnection = nbt.getBoolean("additionalConnection"); + + if (!autoPullFluidList) { + NBTTagList stockingFluids = nbt.getTagList("fluidsToStock", 10); + for (int i = 0; i < stockingFluids.tagCount(); i++) { + storedFluids[i] = GTUtility.loadFluid(stockingFluids.getCompoundTagAt(i)); + } + } + return true; + } + + @Override + public NBTTagCompound getCopiedData(EntityPlayer player) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("type", COPIED_DATA_IDENTIFIER); + tag.setBoolean("autoPull", autoPullFluidList); + tag.setInteger("minAmount", minAutoPullAmount); + tag.setBoolean("additionalConnection", additionalConnection); + tag.setInteger("refreshTime", autoPullRefreshTime); + + NBTTagList stockingFluids = new NBTTagList(); + if (!autoPullFluidList) { + for (int index = 0; index < SLOT_COUNT; index++) { + FluidStack fluidStack = storedFluids[index]; + if (fluidStack == null) { + continue; + } + stockingFluids.appendTag(fluidStack.writeToNBT(new NBTTagCompound())); + } + tag.setTag("fluidsToStock", stockingFluids); + } + return tag; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + if (!(aPlayer instanceof EntityPlayerMP)) + return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) + return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ); + + if (!pasteCopiedData(aPlayer, dataStick.stackTagCompound)) return false; + + updateValidGridProxySides(); + aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.loaded")); + return true; + } + + @Override + public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!(aPlayer instanceof EntityPlayerMP)) return; + + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; + + dataStick.stackTagCompound = getCopiedData(aPlayer); + dataStick.setStackDisplayName("Stocking Input Hatch Configuration"); + aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.saved")); + } + + @Override + public void onExplosion() { + for (int i = 0; i < SLOT_COUNT; i++) { + mInventory[i] = null; + } + } + + public boolean containsSuchStack(FluidStack tStack) { + for (int i = 0; i < 16; ++i) { + if (GTUtility.areFluidsEqual(storedFluids[i], tStack, false)) { + return true; + } + } + return false; + } + + @Override + public int getGUIHeight() { + return 179; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + if (autoPullAvailable) { + buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow); + } + + builder.widget( + SlotGroup.ofFluidTanks( + IntStream.range(0, SLOT_COUNT) + .mapToObj(index -> createTankForFluidStack(storedFluids, index, 1)) + .collect(Collectors.toList()), + 4) + .phantom(true) + .widgetCreator((slotIndex, h) -> (FluidSlotWidget) new FluidSlotWidget(h) { + + @Override + protected void tryClickPhantom(ClickData clickData, ItemStack cursorStack) { + if (clickData.mouseButton != 0 || autoPullFluidList) return; + + FluidStack heldFluid = getFluidForPhantomItem(cursorStack); + if (cursorStack == null) { + storedFluids[slotIndex] = null; + } else { + if (containsSuchStack(heldFluid)) return; + storedFluids[slotIndex] = heldFluid; + } + if (getBaseMetaTileEntity().isServerSide()) { + updateInformationSlot(slotIndex); + detectAndSendChanges(false); + } + } + + @Override + protected void tryScrollPhantom(int direction) {} + + @Override + public IDrawable[] getBackground() { + IDrawable slot; + if (autoPullFluidList) { + slot = GTUITextures.SLOT_DARK_GRAY; + } else { + slot = ModularUITextures.FLUID_SLOT; + } + return new IDrawable[] { slot, GTUITextures.OVERLAY_SLOT_ARROW_ME }; + } + + @Override + public void buildTooltip(List tooltip) { + FluidStack fluid = getContent(); + if (fluid != null) { + addFluidNameInfo(tooltip, fluid); + + if (!autoPullFluidList) { + tooltip.add(Text.localised("modularui.phantom.single.clear")); + } + } else { + tooltip.add( + Text.localised("modularui.fluid.empty") + .format(EnumChatFormatting.WHITE)); + } + + if (autoPullFluidList) { + tooltip.add(Text.localised("GT5U.machines.stocking_bus.cannot_set_slot")); + } + } + }.setUpdateTooltipEveryTick(true)) + .build() + .setPos(new Pos2d(7, 9))); + + builder.widget( + SlotGroup.ofFluidTanks( + IntStream.range(0, SLOT_COUNT) + .mapToObj(index -> createTankForFluidStack(storedInformationFluids, index, Integer.MAX_VALUE)) + .collect(Collectors.toList()), + 4) + .phantom(true) + .widgetCreator((slotIndex, h) -> (FluidSlotWidget) new FluidSlotWidget(h) { + + @Override + protected void tryClickPhantom(ClickData clickData, ItemStack cursorStack) {} + + @Override + protected void tryScrollPhantom(int direction) {} + + @Override + public void buildTooltip(List tooltip) { + FluidStack fluid = getContent(); + if (fluid != null) { + addFluidNameInfo(tooltip, fluid); + tooltip.add(Text.localised("modularui.fluid.phantom.amount", fluid.amount)); + addAdditionalFluidInfo(tooltip, fluid); + if (!Interactable.hasShiftDown()) { + tooltip.add(Text.EMPTY); + tooltip.add(Text.localised("modularui.tooltip.shift")); + } + } else { + tooltip.add( + Text.localised("modularui.fluid.empty") + .format(EnumChatFormatting.WHITE)); + } + } + }.setUpdateTooltipEveryTick(true)) + .background(GTUITextures.SLOT_DARK_GRAY) + .controlsAmount(true) + .build() + .setPos(new Pos2d(97, 9))); + + if (autoPullAvailable) { + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (clickData.mouseButton == 0) { + setAutoPullFluidList(!autoPullFluidList); + } else if (clickData.mouseButton == 1 && !widget.isClient()) { + widget.getContext() + .openSyncedWindow(CONFIG_WINDOW_ID); + } + }) + .setPlayClickSound(true) + .setBackground(() -> { + if (autoPullFluidList) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_AUTOPULL_ME }; + } else { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_AUTOPULL_ME_DISABLED }; + } + }) + .addTooltips( + Arrays.asList( + StatCollector.translateToLocal("GT5U.machines.stocking_hatch.auto_pull.tooltip.1"), + StatCollector.translateToLocal("GT5U.machines.stocking_hatch.auto_pull.tooltip.2"))) + .setSize(16, 16) + .setPos(80, 10)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullFluidList, this::setAutoPullFluidList)); + } + + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_ARROW_DOUBLE) + .setPos(82, 30) + .setSize(12, 12)) + .widget(TextWidget.dynamicString(() -> { + boolean isActive = isActive(); + boolean isPowered = isPowered(); + boolean isBooting = isBooting(); + EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN + : EnumChatFormatting.DARK_RED; + return color + WailaText.getPowerState(isActive, isPowered, isBooting); + }) + .setTextAlignment(Alignment.Center) + .setSize(90, 9) + .setPos(43, 84)); + } + + private FluidStackTank createTankForFluidStack(FluidStack[] fluidStacks, int slotIndex, int capacity) { + return new FluidStackTank(() -> fluidStacks[slotIndex], (stack) -> { + if (getBaseMetaTileEntity().isServerSide()) { + return; + } + + fluidStacks[slotIndex] = stack; + }, capacity); + } + + protected ModularWindow createStackSizeConfigurationWindow(final EntityPlayer player) { + final int WIDTH = 78; + final int HEIGHT = 115; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add( + Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) + .add(WIDTH - 3, 0))); + builder.widget( + TextWidget.localised("GT5U.machines.stocking_hatch.min_amount") + .setPos(3, 2) + .setSize(74, 14)) + .widget( + new NumericWidget().setSetter(val -> minAutoPullAmount = (int) val) + .setGetter(() -> minAutoPullAmount) + .setBounds(1, Integer.MAX_VALUE) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(70, 18) + .setPos(3, 18) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)); + builder.widget( + TextWidget.localised("GT5U.machines.stocking_bus.refresh_time") + .setPos(3, 42) + .setSize(74, 14)) + .widget( + new NumericWidget().setSetter(val -> autoPullRefreshTime = (int) val) + .setGetter(() -> autoPullRefreshTime) + .setBounds(1, Integer.MAX_VALUE) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(70, 18) + .setPos(3, 58) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)); + builder.widget( + TextWidget.localised("GT5U.machines.stocking_bus.force_check") + .setPos(3, 88) + .setSize(50, 14)) + .widget( + new CycleButtonWidget().setToggle(() -> expediteRecipeCheck, val -> setRecipeCheck(val)) + .setTextureGetter( + state -> expediteRecipeCheck ? GTUITextures.OVERLAY_BUTTON_CHECKMARK + : GTUITextures.OVERLAY_BUTTON_CROSS) + .setBackground(GTUITextures.BUTTON_STANDARD) + .setPos(53, 87) + .setSize(16, 16) + .addTooltip(StatCollector.translateToLocal("GT5U.machines.stocking_bus.hatch_warning"))); + return builder.build(); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(80, 63)); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + if (!autoPullAvailable) { + super.getWailaBody(itemStack, currenttip, accessor, config); + return; + } + + NBTTagCompound tag = accessor.getNBTData(); + boolean autopull = tag.getBoolean("autoPull"); + int minSize = tag.getInteger("minAmount"); + currenttip.add( + StatCollector.translateToLocal("GT5U.waila.stocking_bus.auto_pull." + (autopull ? "enabled" : "disabled"))); + if (autopull) { + currenttip.add( + StatCollector.translateToLocalFormatted( + "GT5U.waila.stocking_hatch.min_amount", + GTUtility.formatNumbers(minSize))); + } + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + if (!autoPullAvailable) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + return; + } + + tag.setBoolean("autoPull", autoPullFluidList); + tag.setInteger("minAmount", minAutoPullAmount); + super.getWailaNBTData(player, tile, tag, world, x, y, z); + } + + private static String[] getDescriptionArray(boolean autoPullAvailable) { + List strings = new ArrayList<>(8); + strings.add("Advanced fluid input for Multiblocks"); + strings.add("Hatch Tier: " + TIER_COLORS[autoPullAvailable ? 10 : 8] + VN[autoPullAvailable ? 10 : 8]); + strings.add("Retrieves directly from ME"); + strings.add("Keeps 16 fluid types in stock"); + + if (autoPullAvailable) { + strings.add( + "Auto-Pull from ME mode will automatically stock the first 16 fluid in the ME system, updated every 5 seconds."); + strings.add("Toggle by right-clicking with screwdriver, or use the GUI."); + strings.add( + "Use the GUI to limit the minimum stack size for Auto-Pulling, adjust the slot refresh timer and enable fast recipe checks."); + strings.add("WARNING: Fast recipe checks can be laggy. Use with caution."); + } + + strings.add("Change ME connection behavior by right-clicking with wire cutter."); + strings.add("Configuration data can be copy+pasted using a data stick."); + return strings.toArray(new String[0]); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputBusME.java b/src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputBusME.java new file mode 100644 index 0000000000..969d9c6c05 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputBusME.java @@ -0,0 +1,378 @@ +package gregtech.common.tileentities.machines; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_HATCH; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_HATCH_ACTIVE; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import appeng.api.AEApi; +import appeng.api.implementations.IPowerChannelState; +import appeng.api.networking.GridFlags; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.MachineSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import appeng.api.util.AECableType; +import appeng.items.storage.ItemBasicStorageCell; +import appeng.me.GridAccessException; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.IGridProxyable; +import appeng.util.IWideReadableNumberConverter; +import appeng.util.Platform; +import appeng.util.ReadableNumberConverter; +import gregtech.GTMod; +import gregtech.api.enums.ItemList; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchOutputBus; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTEHatchOutputBusME extends MTEHatchOutputBus implements IPowerChannelState { + + private long baseCapacity = 1_600; + + private BaseActionSource requestSource = null; + private @Nullable AENetworkProxy gridProxy = null; + final IItemList itemCache = AEApi.instance() + .storage() + .createItemList(); + long lastOutputTick = 0; + long lastInputTick = 0; + long tickCounter = 0; + boolean additionalConnection = false; + + public MTEHatchOutputBusME(int aID, String aName, String aNameRegional) { + super( + aID, + aName, + aNameRegional, + 3, + new String[] { "Item Output for Multiblocks", "Stores directly into ME", "Can cache 1600 items by default", + "Change cache size by inserting a storage cell", + "Change ME connection behavior by right-clicking with wire cutter" }, + 1); + } + + public MTEHatchOutputBusME(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchOutputBusME(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_HATCH_ACTIVE) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_HATCH) }; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + getProxy().onReady(); + } + + @Override + public boolean storeAll(ItemStack aStack) { + aStack.stackSize = store(aStack); + return aStack.stackSize == 0; + } + + private long getCachedAmount() { + long itemAmount = 0; + for (IAEItemStack item : itemCache) { + itemAmount += item.getStackSize(); + } + return itemAmount; + } + + private long getCacheCapacity() { + ItemStack upgradeItemStack = mInventory[0]; + if (upgradeItemStack != null && upgradeItemStack.getItem() instanceof ItemBasicStorageCell) { + return ((ItemBasicStorageCell) upgradeItemStack.getItem()).getBytesLong(upgradeItemStack) * 8; + } + return baseCapacity; + } + + /** + * Check if the internal cache can still fit more items in it + */ + public boolean canAcceptItem() { + if (getCachedAmount() < getCacheCapacity()) { + return true; + } + return false; + } + + /** + * Attempt to store items in connected ME network. Returns how many items did not fit (if the network was down e.g.) + * + * @param stack input stack + * @return amount of items left over + */ + public int store(final ItemStack stack) { + // Always allow insertion on the same tick so we can output the entire recipe + if (canAcceptItem() || (lastInputTick == tickCounter)) { + itemCache.add( + AEApi.instance() + .storage() + .createItemStack(stack)); + lastInputTick = tickCounter; + return 0; + } + return stack.stackSize; + } + + private BaseActionSource getRequest() { + if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); + return requestSource; + } + + @Override + public AECableType getCableConnectionType(ForgeDirection forgeDirection) { + return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE; + } + + private void updateValidGridProxySides() { + if (additionalConnection) { + getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); + } else { + getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); + } + } + + @Override + public void onFacingChange() { + updateValidGridProxySides(); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) + .isGUIClickable()) return; + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + additionalConnection = !additionalConnection; + updateValidGridProxySides(); + aPlayer.addChatComponentMessage( + new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); + return true; + } + + @Override + public AENetworkProxy getProxy() { + if (gridProxy == null) { + if (getBaseMetaTileEntity() instanceof IGridProxyable) { + gridProxy = new AENetworkProxy( + (IGridProxyable) getBaseMetaTileEntity(), + "proxy", + ItemList.Hatch_Output_Bus_ME.get(1), + true); + gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); + updateValidGridProxySides(); + if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( + getBaseMetaTileEntity().getWorld() + .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); + } + } + return this.gridProxy; + } + + private void flushCachedStack() { + AENetworkProxy proxy = getProxy(); + if (proxy == null) { + return; + } + try { + IMEMonitor sg = proxy.getStorage() + .getItemInventory(); + for (IAEItemStack s : itemCache) { + if (s.getStackSize() == 0) continue; + IAEItemStack rest = Platform.poweredInsert(proxy.getEnergy(), sg, s, getRequest()); + if (rest != null && rest.getStackSize() > 0) { + s.setStackSize(rest.getStackSize()); + break; + } + s.setStackSize(0); + } + } catch (final GridAccessException ignored) { + + } + lastOutputTick = tickCounter; + } + + @Override + public boolean isPowered() { + return getProxy() != null && getProxy().isPowered(); + } + + @Override + public boolean isActive() { + return getProxy() != null && getProxy().isActive(); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (getBaseMetaTileEntity().isServerSide()) { + tickCounter = aTick; + if (tickCounter > (lastOutputTick + 40)) flushCachedStack(); + if (tickCounter % 20 == 0) getBaseMetaTileEntity().setActive(isActive()); + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { + + if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("baseCapacity")) { + tooltip.add( + "Current cache capacity: " + EnumChatFormatting.YELLOW + + ReadableNumberConverter.INSTANCE + .toWideReadableForm(stack.stackTagCompound.getLong("baseCapacity"))); + } + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + super.setItemNBT(aNBT); + aNBT.setLong("baseCapacity", baseCapacity); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + + NBTTagList items = new NBTTagList(); + for (IAEItemStack s : itemCache) { + if (s.getStackSize() == 0) continue; + NBTTagCompound tag = new NBTTagCompound(); + tag.setTag("itemStack", GTUtility.saveItem(s.getItemStack())); + tag.setLong("size", s.getStackSize()); + items.appendTag(tag); + } + aNBT.setBoolean("additionalConnection", additionalConnection); + aNBT.setTag("cachedItems", items); + aNBT.setLong("baseCapacity", baseCapacity); + getProxy().writeToNBT(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + + NBTBase t = aNBT.getTag("cachedStack"); // legacy + if (t instanceof NBTTagCompound) itemCache.add( + AEApi.instance() + .storage() + .createItemStack(GTUtility.loadItem((NBTTagCompound) t))); + t = aNBT.getTag("cachedItems"); + if (t instanceof NBTTagList l) { + for (int i = 0; i < l.tagCount(); ++i) { + NBTTagCompound tag = l.getCompoundTagAt(i); + if (!tag.hasKey("itemStack")) { // legacy #868 + itemCache.add( + AEApi.instance() + .storage() + .createItemStack(GTUtility.loadItem(l.getCompoundTagAt(i)))); + continue; + } + NBTTagCompound tagItemStack = tag.getCompoundTag("itemStack"); + final IAEItemStack s = AEApi.instance() + .storage() + .createItemStack(GTUtility.loadItem(tagItemStack)); + if (s != null) { + s.setStackSize(tag.getLong("size")); + itemCache.add(s); + } else { + GTMod.GT_FML_LOGGER.warn( + "An error occurred while loading contents of ME Output Bus. This item has been voided: " + + tagItemStack); + } + } + } + additionalConnection = aNBT.getBoolean("additionalConnection"); + baseCapacity = aNBT.getLong("baseCapacity"); + // Set the base capacity of existing hatches to be infinite + if (baseCapacity == 0) { + baseCapacity = Long.MAX_VALUE; + } + getProxy().readFromNBT(aNBT); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + List ss = new ArrayList<>(); + ss.add( + "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" + : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET); + IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE; + ss.add("Item cache capacity: " + nc.toWideReadableForm(getCacheCapacity())); + if (itemCache.isEmpty()) { + ss.add("The bus has no cached items"); + } else { + ss.add(String.format("The bus contains %d cached stacks: ", itemCache.size())); + int counter = 0; + for (IAEItemStack s : itemCache) { + ss.add( + s.getItem() + .getItemStackDisplayName(s.getItemStack()) + ": " + + EnumChatFormatting.GOLD + + nc.toWideReadableForm(s.getStackSize()) + + EnumChatFormatting.RESET); + if (++counter > 100) break; + } + } + return ss.toArray(new String[itemCache.size() + 2]); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + getBaseMetaTileEntity().add1by1Slot(builder); + } + + @Override + public boolean acceptsItemLock() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputME.java b/src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputME.java new file mode 100644 index 0000000000..5983a2d32a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/MTEHatchOutputME.java @@ -0,0 +1,443 @@ +package gregtech.common.tileentities.machines; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_FLUID_HATCH; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_FLUID_HATCH_ACTIVE; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import com.glodblock.github.common.item.FCBaseItemCell; +import com.glodblock.github.common.storage.IStorageFluidCell; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.implementations.IPowerChannelState; +import appeng.api.networking.GridFlags; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.MachineSource; +import appeng.api.networking.security.PlayerSource; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IItemList; +import appeng.api.util.AECableType; +import appeng.core.stats.Stats; +import appeng.me.GridAccessException; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.IGridProxyable; +import appeng.util.IWideReadableNumberConverter; +import appeng.util.ReadableNumberConverter; +import gregtech.GTMod; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTEHatchOutputME extends MTEHatchOutput implements IPowerChannelState { + + private long baseCapacity = 128_000; + + private BaseActionSource requestSource = null; + private @Nullable AENetworkProxy gridProxy = null; + final IItemList fluidCache = AEApi.instance() + .storage() + .createFluidList(); + long lastOutputTick = 0; + long lastInputTick = 0; + long tickCounter = 0; + boolean additionalConnection = false; + + public MTEHatchOutputME(int aID, String aName, String aNameRegional) { + super( + aID, + aName, + aNameRegional, + 3, + new String[] { "Fluid Output for Multiblocks", "Stores directly into ME", + "Can cache up to 128kL of fluids by default", "Change cache size by inserting a fluid storage cell", + "Change ME connection behavior by right-clicking with wire cutter" }, + 1); + } + + public MTEHatchOutputME(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchOutputME(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_FLUID_HATCH_ACTIVE) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_FLUID_HATCH) }; + } + + @Override + public byte getTierForStructure() { + return (byte) (GTValues.V.length - 2); + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + getProxy().onReady(); + } + + @Override + public int fill(FluidStack aFluid, boolean doFill) { + if (doFill) { + return tryFillAE(aFluid); + } else { + if (aFluid == null) return 0; + return aFluid.amount; + } + } + + @Override + public int getCapacity() { + return 0; + } + + private long getCachedAmount() { + long fluidAmount = 0; + for (IAEFluidStack fluid : fluidCache) { + fluidAmount += fluid.getStackSize(); + } + return fluidAmount; + } + + private long getCacheCapacity() { + ItemStack upgradeItemStack = mInventory[0]; + if (upgradeItemStack != null && upgradeItemStack.getItem() instanceof IStorageFluidCell) { + return ((FCBaseItemCell) upgradeItemStack.getItem()).getBytes(upgradeItemStack) * 2048; + } + return baseCapacity; + } + + /** + * Check if the internal cache can still fit more fluids in it + */ + public boolean canAcceptFluid() { + if (getCachedAmount() < getCacheCapacity()) { + return true; + } + return false; + } + + /** + * Attempt to store fluid in connected ME network. Returns how much fluid is accepted (if the network was down e.g.) + * + * @param aFluid input fluid + * @return amount of fluid filled + */ + public int tryFillAE(final FluidStack aFluid) { + if (aFluid == null) return 0; + // Always allow insertion on the same tick so we can output the entire recipe + if (canAcceptFluid() || (lastInputTick == tickCounter)) { + fluidCache.add( + AEApi.instance() + .storage() + .createFluidStack(aFluid)); + lastInputTick = tickCounter; + return aFluid.amount; + } + return 0; + } + + private BaseActionSource getRequest() { + if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity()); + return requestSource; + } + + @Override + public AECableType getCableConnectionType(ForgeDirection side) { + return isOutputFacing(side) ? AECableType.SMART : AECableType.NONE; + } + + private void updateValidGridProxySides() { + if (additionalConnection) { + getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); + } else { + getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing())); + } + } + + @Override + public void onFacingChange() { + updateValidGridProxySides(); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public boolean doesFillContainers() { + return false; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + // Don't allow to lock fluid in me fluid hatch + if (!getBaseMetaTileEntity().getCoverInfoAtSide(side) + .isGUIClickable()) return; + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + additionalConnection = !additionalConnection; + updateValidGridProxySides(); + aPlayer.addChatComponentMessage( + new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection)); + return true; + } + + @Override + public AENetworkProxy getProxy() { + if (gridProxy == null) { + if (getBaseMetaTileEntity() instanceof IGridProxyable) { + gridProxy = new AENetworkProxy( + (IGridProxyable) getBaseMetaTileEntity(), + "proxy", + ItemList.Hatch_Output_ME.get(1), + true); + gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); + updateValidGridProxySides(); + if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner( + getBaseMetaTileEntity().getWorld() + .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName())); + } + } + return this.gridProxy; + } + + private void flushCachedStack() { + if (fluidCache.isEmpty()) return; + AENetworkProxy proxy = getProxy(); + if (proxy == null) { + return; + } + try { + IMEMonitor sg = proxy.getStorage() + .getFluidInventory(); + for (IAEFluidStack s : fluidCache) { + if (s.getStackSize() == 0) continue; + IAEFluidStack rest = fluidAEInsert(proxy.getEnergy(), sg, s, getRequest()); + if (rest != null && rest.getStackSize() > 0) { + s.setStackSize(rest.getStackSize()); + continue; + } + s.setStackSize(0); + } + } catch (final GridAccessException ignored) {} + lastOutputTick = tickCounter; + } + + @Override + public boolean isPowered() { + return getProxy() != null && getProxy().isPowered(); + } + + @Override + public boolean isActive() { + return getProxy() != null && getProxy().isActive(); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (getBaseMetaTileEntity().isServerSide()) { + tickCounter = aTick; + if (tickCounter > (lastOutputTick + 40)) flushCachedStack(); + if (tickCounter % 20 == 0) getBaseMetaTileEntity().setActive(isActive()); + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { + + if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("baseCapacity")) { + tooltip.add( + "Current cache capacity: " + EnumChatFormatting.YELLOW + + ReadableNumberConverter.INSTANCE + .toWideReadableForm(stack.stackTagCompound.getLong("baseCapacity")) + + "L"); + } + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + super.setItemNBT(aNBT); + aNBT.setLong("baseCapacity", baseCapacity); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + NBTTagList fluids = new NBTTagList(); + for (IAEFluidStack s : fluidCache) { + if (s.getStackSize() == 0) continue; + NBTTagCompound tag = new NBTTagCompound(); + NBTTagCompound tagFluidStack = new NBTTagCompound(); + s.getFluidStack() + .writeToNBT(tagFluidStack); + tag.setTag("fluidStack", tagFluidStack); + tag.setLong("size", s.getStackSize()); + fluids.appendTag(tag); + } + aNBT.setTag("cachedFluids", fluids); + aNBT.setBoolean("additionalConnection", additionalConnection); + aNBT.setLong("baseCapacity", baseCapacity); + getProxy().writeToNBT(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + NBTBase t = aNBT.getTag("cachedFluids"); + if (t instanceof NBTTagList l) { + for (int i = 0; i < l.tagCount(); ++i) { + NBTTagCompound tag = l.getCompoundTagAt(i); + NBTTagCompound tagFluidStack = tag.getCompoundTag("fluidStack"); + final IAEFluidStack s = AEApi.instance() + .storage() + .createFluidStack(GTUtility.loadFluid(tagFluidStack)); + if (s != null) { + s.setStackSize(tag.getLong("size")); + fluidCache.add(s); + } else { + GTMod.GT_FML_LOGGER.warn( + "An error occurred while loading contents of ME Output Hatch. This fluid has been voided: " + + tagFluidStack); + } + } + } + additionalConnection = aNBT.getBoolean("additionalConnection"); + baseCapacity = aNBT.getLong("baseCapacity"); + // Set the base capacity of existing hatches to be infinite + if (baseCapacity == 0) { + baseCapacity = Long.MAX_VALUE; + } + getProxy().readFromNBT(aNBT); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + List ss = new ArrayList<>(); + ss.add( + "The hatch is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online" + : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET); + IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE; + ss.add("Fluid cache capacity: " + nc.toWideReadableForm(getCacheCapacity()) + " mB"); + if (fluidCache.isEmpty()) { + ss.add("The bus has no cached fluids"); + } else { + ss.add(String.format("The hatch contains %d cached fluids: ", fluidCache.size())); + int counter = 0; + for (IAEFluidStack s : fluidCache) { + ss.add( + s.getFluidStack() + .getLocalizedName() + ": " + + EnumChatFormatting.GOLD + + nc.toWideReadableForm(s.getStackSize()) + + " mB" + + EnumChatFormatting.RESET); + if (++counter > 100) break; + } + } + return ss.toArray(new String[fluidCache.size() + 2]); + } + + public static IAEFluidStack fluidAEInsert(final IEnergySource energy, final IMEInventory cell, + final IAEFluidStack input, final BaseActionSource src) { + final IAEFluidStack possible = cell.injectItems(input.copy(), Actionable.SIMULATE, src); + + long stored = input.getStackSize(); + if (possible != null) { + stored -= possible.getStackSize(); + } + // 1000 mb fluid will be considered as 1 item + long power = Math.max(1, stored / 1000); + + final double availablePower = energy.extractAEPower(power, Actionable.SIMULATE, PowerMultiplier.CONFIG); + + final long itemToAdd = Math.min((long) (availablePower + 0.9) * 1000, stored); + + if (itemToAdd > 0) { + energy.extractAEPower(power, Actionable.MODULATE, PowerMultiplier.CONFIG); + + if (itemToAdd < input.getStackSize()) { + final long original = input.getStackSize(); + final IAEFluidStack split = input.copy(); + split.decStackSize(itemToAdd); + input.setStackSize(itemToAdd); + split.add(cell.injectItems(input, Actionable.MODULATE, src)); + + if (src.isPlayer()) { + final long diff = original - split.getStackSize(); + Stats.ItemsInserted.addToPlayer(((PlayerSource) src).player, (int) diff); + } + + return split; + } + + final IAEFluidStack ret = cell.injectItems(input, Actionable.MODULATE, src); + + if (src.isPlayer()) { + final long diff = ret == null ? input.getStackSize() : input.getStackSize() - ret.getStackSize(); + Stats.ItemsInserted.addToPlayer(((PlayerSource) src).player, (int) diff); + } + + return ret; + } + + return input; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + getBaseMetaTileEntity().add1by1Slot(builder); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java deleted file mode 100644 index 78ed9982fc..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java +++ /dev/null @@ -1,309 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_GLOW; -import static gregtech.common.GT_UndergroundOil.undergroundOilReadInformation; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.objects.ItemData; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import gregtech.common.blocks.GT_TileEntity_Ores; -import ic2.core.Ic2Items; - -public class GT_MetaTileEntity_AdvSeismicProspector extends GT_MetaTileEntity_BasicMachine { - - boolean ready = false; - final int radius; - final int step; - int cX; - int cZ; - - public GT_MetaTileEntity_AdvSeismicProspector(int aID, String aName, String aNameRegional, int aTier, int aRadius, - int aStep) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, // amperage - "", - 1, // input slot count - 1, // output slot count - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_ROCK_BREAKER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_ROCK_BREAKER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_GLOW) - .glow() - .build())); - radius = aRadius; - step = aStep; - } - - @Override - public String[] getDescription() { - return new String[] { "Place, activate with explosives", - "2 Powderbarrels, " + "4 Glyceryl Trinitrate, " + "16 TNT, or " + "8 ITNT", - "Use Data Stick, Scan Data Stick, Print Data Stick, Bind Pages into Book", - "Ore prospecting area = " + radius * 2 + "x" + radius * 2 + " ONLY blocks below prospector", - "Oil prospecting area 3x3 oilfields, each is 8x8 chunks" }; - } - - protected GT_MetaTileEntity_AdvSeismicProspector(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures, int aRadius, int aStep) { - super(aName, aTier, 1, aDescription, aTextures, 1, 1); - radius = aRadius; - step = aStep; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_AdvSeismicProspector( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mTextures, - this.radius, - this.step); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isServerSide()) { - ItemStack aStack = aPlayer.getCurrentEquippedItem(); - - if (!ready && (GT_Utility.consumeItems(aPlayer, aStack, Item.getItemFromBlock(Blocks.tnt), 16) - || GT_Utility.consumeItems(aPlayer, aStack, Ic2Items.industrialTnt.getItem(), 8) - || GT_Utility.consumeItems(aPlayer, aStack, Materials.Glyceryl, 4) - || GT_Utility.consumeItems(aPlayer, aStack, ItemList.Block_Powderbarrel.getItem(), 2))) { - - this.ready = true; - this.mMaxProgresstime = (aPlayer.capabilities.isCreativeMode ? 20 : 800); - - } else if (ready && mMaxProgresstime == 0 - && aStack != null - && aStack.stackSize == 1 - && aStack.getItem() == ItemList.Tool_DataStick.getItem()) { - this.ready = false; - - // prospecting ores - HashMap tOres = new HashMap<>(36); - - prospectOres(tOres); - - // prospecting oils - ArrayList tOils = new ArrayList<>(); - prospectOils(tOils); - - GT_Utility.ItemNBT.setAdvancedProspectionData( - mTier, - aStack, - this.getBaseMetaTileEntity() - .getXCoord(), - this.getBaseMetaTileEntity() - .getYCoord(), - this.getBaseMetaTileEntity() - .getZCoord(), - this.getBaseMetaTileEntity() - .getWorld().provider.dimensionId, - tOils, - GT_Utility.sortByValueToList(tOres), - radius); - } - } - - return true; - } - - private void prospectOils(ArrayList aOils) { - - int xChunk = (getBaseMetaTileEntity().getXCoord() >> 7) << 3; // oil field aligned chunk coords - int zChunk = (getBaseMetaTileEntity().getZCoord() >> 7) << 3; - - LinkedHashMap tFluids = new LinkedHashMap<>(); - int oilFieldCount = 0; - - try { - final int oilfieldSize = 8; - for (int z = -1; z <= 1; ++z) { - for (int x = -1; x <= 1; ++x) { - ChunkCoordIntPair cInts = new ChunkCoordIntPair(x, z); - int min = Integer.MAX_VALUE; - int max = Integer.MIN_VALUE; - - for (int i = 0; i < oilfieldSize; i++) { - for (int j = 0; j < oilfieldSize; j++) { - Chunk tChunk = getBaseMetaTileEntity().getWorld() - .getChunkFromChunkCoords(xChunk + i + x * oilfieldSize, zChunk + j + z * oilfieldSize); - FluidStack tFluid = undergroundOilReadInformation(tChunk); - if (tFluid != null) { - if (tFluid.amount > max) max = tFluid.amount; - if (tFluid.amount < min) min = tFluid.amount; - if (!tFluids.containsKey(cInts)) { - tFluids.put(cInts, tFluid); - } - } - } - } - - aOils.add( - ++oilFieldCount + "," - + min - + "-" - + max - + "," - + tFluids.get(cInts) - .getLocalizedName()); - } - } - } catch (Exception ignored) {} - } - - private void prospectOres(Map aOres) { - int tLeftXBound = this.getBaseMetaTileEntity() - .getXCoord() - radius; - int tRightXBound = tLeftXBound + 2 * radius; - - int tLeftZBound = this.getBaseMetaTileEntity() - .getZCoord() - radius; - int tRightZBound = tLeftZBound + 2 * radius; - - for (int i = tLeftXBound; i <= tRightXBound; i += step) { - if (Math.abs(i >> 4) % 3 != 1) continue; - for (int k = tLeftZBound; k <= tRightZBound; k += step) { - if (Math.abs(k >> 4) % 3 != 1) continue; - - cX = (i >> 4) << 4; - cZ = (k >> 4) << 4; - - String separator = (cX + 8) + "," + (cZ + 8) + " --------"; - aOres.put(separator, 1); - prospectHole(i, k, aOres); - } - } - } - - private void prospectHole(int i, int k, Map aOres) { - String tFoundOre; - for (int j = this.getBaseMetaTileEntity() - .getYCoord(); j > 0; j--) { - tFoundOre = checkForOre(i, j, k); - if (tFoundOre != null) countOre(aOres, tFoundOre, cX, cZ); - } - } - - private String checkForOre(int x, int y, int z) { - Block tBlock = this.getBaseMetaTileEntity() - .getBlock(x, y, z); - - if (tBlock instanceof GT_Block_Ores_Abstract) { - TileEntity tTileEntity = getBaseMetaTileEntity().getWorld() - .getTileEntity(x, y, z); - - if ((tTileEntity instanceof GT_TileEntity_Ores) && (((GT_TileEntity_Ores) tTileEntity).mMetaData < 16000)) { // Filtering - // small - // ores - Materials tMaterial = GregTech_API.sGeneratedMaterials[((GT_TileEntity_Ores) tTileEntity).mMetaData - % 1000]; - - if ((tMaterial != null) && (tMaterial != Materials._NULL)) return tMaterial.mDefaultLocalName; - } - } else { - int tMetaID = getBaseMetaTileEntity().getWorld() - .getBlockMetadata(x, y, z); - ItemStack is = new ItemStack(tBlock, 1, tMetaID); - ItemData association = GT_OreDictUnificator.getAssociation(is); - if ((association != null) && (association.mPrefix.toString() - .startsWith("ore"))) return association.mMaterial.mMaterial.mDefaultLocalName; - else if (GT_Utility.isOre(tBlock, tMetaID)) return tBlock.getLocalizedName(); - } - return null; - } - - private static void countOre(Map map, String ore, int cCX, int cCZ) { - ore = (cCX + 8) + "," + (cCZ + 8) + " has " + ore; - Integer oldCount = map.get(ore); - oldCount = (oldCount == null) ? 0 : oldCount; - - map.put(ore, oldCount + 1); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_BetterJukebox.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_BetterJukebox.java deleted file mode 100644 index f9a9fba8f4..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_BetterJukebox.java +++ /dev/null @@ -1,702 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_JUKEBOX; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_JUKEBOX; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.EnumMap; -import java.util.List; -import java.util.Random; -import java.util.UUID; - -import net.minecraft.item.ItemRecord; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.ForgeDirection; - -import org.joml.Vector4i; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; -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.CycleButtonWidget; -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.SliderWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import appeng.api.implementations.tiles.ISoundP2PHandler; -import appeng.me.GridAccessException; -import appeng.me.cache.helpers.TunnelCollection; -import appeng.me.helpers.AENetworkProxy; -import appeng.parts.p2p.PartP2PSound; -import gregtech.api.enums.GTVoltageIndex; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.recipe.BasicUIProperties; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_MusicSystem; -import gregtech.common.gui.modularui.UIHelper; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -public class GT_MetaTileEntity_BetterJukebox extends GT_MetaTileEntity_BasicMachine - implements IAddUIWidgets, ISoundP2PHandler { - - // Stored state - public UUID jukeboxUuid = UNSET_UUID; - public boolean loopMode = true; - public boolean shuffleMode = false; - public int playbackSlot = 0; - public float playbackVolume = BalanceMath.VANILLA_JUKEBOX_RANGE; - public float p2pVolume = BalanceMath.VANILLA_JUKEBOX_RANGE; - public long discProgressMs = 0; - /** Makes all music discs play for 4 seconds */ - public boolean superFastDebugMode = false; - // Computed state - private final Vector4i interdimPositionCache = new Vector4i(); // XYZ, Dimension ID - private GT_MusicSystem.MusicSource musicSource = null; - private boolean powered = false; - private long discStartMs = 0; - public long discDurationMs = 1; - private ItemRecord currentlyPlaying = null; - - // Constants - public static final UUID UNSET_UUID = UUID.nameUUIDFromBytes(new byte[] { 0 }); - public static final int INPUT_SLOTS = 21; - private static final Random SHUFFLER = new Random(); - - public enum HeadphoneLimit { - - BLOCK_RANGE, - INSIDE_DIMENSION, - BETWEEN_DIMENSIONS; - - public static final ImmutableList ENTRIES = ImmutableList.copyOf(values()); - } - - public static final class BalanceMath { - - public static int MAX_TIER = GTVoltageIndex.IV; - public static float VANILLA_JUKEBOX_RANGE = 4.0f; // 64 blocks - - private static final float[] LISTENING_VOLUME = new float[] { // - VANILLA_JUKEBOX_RANGE, // ULV (unpowered fallback) - VANILLA_JUKEBOX_RANGE + 1.0f, // LV, 80 blocks - VANILLA_JUKEBOX_RANGE + 2.0f, // MV, 96 blocks - VANILLA_JUKEBOX_RANGE + 4.0f, // HV, 118 blocks - VANILLA_JUKEBOX_RANGE + 5.0f, // EV, 144 blocks - VANILLA_JUKEBOX_RANGE + 6.0f, // IV, 160 blocks, equivalent to default load distance of 10 chunks - }; - - private static final int[] HEADPHONE_BLOCK_RANGE = new int[] { // - 64, // ULV (unpowered fallback) - 128, // LV - 160, // MV - 320, // HV - 9001, // EV, alreadu unlimited here - this value is ignored - 9002, // IV, already unlimited here - this value is ignored - }; - - public static float listeningVolume(int tier) { - tier = MathHelper.clamp_int(tier, 0, MAX_TIER); - return LISTENING_VOLUME[tier]; - } - - public static int headphoneBlockRange(int tier) { - tier = MathHelper.clamp_int(tier, 0, MAX_TIER); - return HEADPHONE_BLOCK_RANGE[tier]; - } - - public static HeadphoneLimit headphoneLimit(int tier) { - if (tier <= GTVoltageIndex.HV) { - return HeadphoneLimit.BLOCK_RANGE; - } else if (tier == GTVoltageIndex.EV) { - return HeadphoneLimit.INSIDE_DIMENSION; - } else { - return HeadphoneLimit.BETWEEN_DIMENSIONS; - } - } - - public static float volumeToAttenuationDistance(float range) { - // SoundManager.playSound logic - return 16.0f * range; - } - - public static float attenuationDistanceToVolume(float blockRange) { - return blockRange / 16.0f; - } - - public static long eutUsage(int tier) { - tier = MathHelper.clamp_int(tier, 0, MAX_TIER); - return V[tier] / 16; - } - } - - private static String[] buildDescription(int aTier) { - ArrayList strings = new ArrayList<>(4); - strings.add("Plays music better than your average vanilla jukebox."); - if (BalanceMath.headphoneLimit(aTier) != HeadphoneLimit.BLOCK_RANGE) { - strings.add(EnumChatFormatting.BLUE + "The raw power of Hatsune Miku in your ears"); - } - strings.add( - String.format( - "Range: %s%.1f blocks", - EnumChatFormatting.WHITE, - BalanceMath.volumeToAttenuationDistance(BalanceMath.listeningVolume(aTier)))); - strings.add(switch (BalanceMath.headphoneLimit(aTier)) { - case BLOCK_RANGE -> String.format( - "Headphone signal range: %s%d blocks", - EnumChatFormatting.WHITE, - BalanceMath.headphoneBlockRange(aTier)); - case INSIDE_DIMENSION -> String - .format("Headphones work anywhere in %sthe same dimension", EnumChatFormatting.WHITE); - case BETWEEN_DIMENSIONS -> String - .format("Headphones work anywhere, in %sany dimension", EnumChatFormatting.WHITE); - }); - strings.add(String.format("Cost: %s%d EU/t", EnumChatFormatting.WHITE, BalanceMath.eutUsage(aTier))); - strings.add(GT_Values.AuthorEigenRaven); - return strings.toArray(new String[0]); - } - - public GT_MetaTileEntity_BetterJukebox(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 1, buildDescription(aTier), INPUT_SLOTS, 1); - playbackVolume = BalanceMath.listeningVolume(aTier); - } - - public GT_MetaTileEntity_BetterJukebox(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, INPUT_SLOTS, 1); - playbackVolume = BalanceMath.listeningVolume(aTier); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BetterJukebox(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == baseMetaTileEntity.getFrontFacing()) { - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; - } - if (sideDirection != ForgeDirection.UP) { - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_SIDE_JUKEBOX) }; - } - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.builder() - .addIcon(OVERLAY_TOP_JUKEBOX) - .extFacing() - .build() }; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - if (aBaseMetaTileEntity.isClientSide()) { - return; - } - final Vector4i interdimPosition = interdimPositionCache; - interdimPosition.x = aBaseMetaTileEntity.getXCoord(); - interdimPosition.y = aBaseMetaTileEntity.getYCoord(); - interdimPosition.z = aBaseMetaTileEntity.getZCoord(); - interdimPosition.w = aBaseMetaTileEntity.getWorld().provider.dimensionId; - if (jukeboxUuid == UNSET_UUID) { - jukeboxUuid = UUID.randomUUID(); - markDirty(); - } - if (musicSource == null) { - musicSource = GT_MusicSystem.ServerSystem.registerOrGetMusicSource(jukeboxUuid); - musicSource.originPosition.set(interdimPosition); - musicSource.headphoneLimit = BalanceMath.headphoneLimit(mTier); - musicSource.headphoneBlockRange = BalanceMath.headphoneBlockRange(mTier); - musicSource.startedPlayingAtMs = System.currentTimeMillis(); - updateEmitterList(); - } - if (doesSlotContainValidRecord(playbackSlot) - && mInventory[playbackSlot].getItem() instanceof ItemRecord record) { - final ResourceLocation resource = record.getRecordResource(record.recordName); - currentlyPlaying = record; - // Assume a safe disc duration of 500 seconds if not known in the registry - discDurationMs = GT_MusicSystem.getMusicRecordDurations() - .getOrDefault(resource, 500_000); - discStartMs = System.currentTimeMillis() - discProgressMs; - musicSource.setRecord( - new ResourceLocation(resource.getResourceDomain(), "records." + resource.getResourcePath()), - discProgressMs); - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - try { - if (aBaseMetaTileEntity.isClientSide() || !aBaseMetaTileEntity.isAllowedToWork() || musicSource == null) { - if (currentlyPlaying != null) { - stopCurrentSong(System.currentTimeMillis()); - } - return; - } - final Vector4i interdimPosition = interdimPositionCache; - interdimPosition.x = aBaseMetaTileEntity.getXCoord(); - interdimPosition.y = aBaseMetaTileEntity.getYCoord(); - interdimPosition.z = aBaseMetaTileEntity.getZCoord(); - interdimPosition.w = aBaseMetaTileEntity.getWorld().provider.dimensionId; - final long now = System.currentTimeMillis(); - - if (superFastDebugMode && discDurationMs > 4000) { - discDurationMs = 4000; - } - - // power check - final boolean hasMinimumEU = aBaseMetaTileEntity.isUniversalEnergyStored(getMinimumStoredEU()); - if (currentlyPlaying != null && hasMinimumEU - && aBaseMetaTileEntity.decreaseStoredEnergyUnits(BalanceMath.eutUsage(mTier), false)) { - if (!powered) { // just got power again - powered = true; - musicSource.modified = true; - musicSource.headphoneLimit = BalanceMath.headphoneLimit(mTier); - musicSource.headphoneBlockRange = BalanceMath.headphoneBlockRange(mTier); - updateEmitterList(); - } - } else if ((!hasMinimumEU || currentlyPlaying != null) && powered) { // was powered, but no longer is - powered = false; - musicSource.modified = true; - musicSource.headphoneLimit = HeadphoneLimit.BLOCK_RANGE; - musicSource.headphoneBlockRange = BalanceMath.headphoneBlockRange(0); - updateEmitterList(); - } - - // check if current disc finished - if (currentlyPlaying != null) { - discProgressMs = now - discStartMs; - final boolean hasValidRecord = doesSlotContainValidRecord(playbackSlot); - final boolean wasDiscSwapped = hasValidRecord - && mInventory[getInputSlot() + playbackSlot].getItem() != currentlyPlaying; - if (discProgressMs >= discDurationMs || !hasValidRecord || wasDiscSwapped) { - stopCurrentSong(now); - if (!loopMode) { - // should be empty, but swap just in case it's not - final ItemStack oldOut = mInventory[getOutputSlot()]; - mInventory[getOutputSlot()] = mInventory[getInputSlot() + playbackSlot]; - mInventory[getInputSlot() + playbackSlot] = oldOut; - markDirty(); - } - if (!(hasValidRecord && wasDiscSwapped)) { - // don't switch slots if someone just put a new disc in the active slot - pickNextSlot(); - } - } else { - // keep on playing - return; - } - } - - if (playbackSlot < 0 || playbackSlot >= INPUT_SLOTS - || ((aTimer % 10) == 0 && !doesSlotContainValidRecord(playbackSlot))) { - pickNextSlot(); - } - - final boolean hasValidRecord = doesSlotContainValidRecord(playbackSlot); - final boolean canStartPlaying = loopMode || isOutputEmpty(); - if (!hasValidRecord) { - stopCurrentSong(now); - } else if (canStartPlaying - && mInventory[getInputSlot() + playbackSlot].getItem() instanceof ItemRecord record) { - final ResourceLocation resource = record.getRecordResource(record.recordName); - currentlyPlaying = record; - musicSource.setRecord( - new ResourceLocation(resource.getResourceDomain(), "records." + resource.getResourcePath())); - // Assume a safe disc duration of 500 seconds if not known in the registry - discDurationMs = GT_MusicSystem.getMusicRecordDurations() - .getOrDefault(resource, 500_000); - discProgressMs = 0; - discStartMs = now; - } - } finally { - super.onPostTick(aBaseMetaTileEntity, aTimer); - } - } - - private void stopCurrentSong(long nowMs) { - if (currentlyPlaying == null) { - return; - } - musicSource.setRecord(null); - currentlyPlaying = null; - discDurationMs = 1; - discProgressMs = 0; - discStartMs = nowMs; - markDirty(); - } - - private void pickNextSlot() { - playbackSlot = MathHelper.clamp_int(playbackSlot, 0, INPUT_SLOTS); - if (shuffleMode) { - final int[] validSlots = new int[INPUT_SLOTS]; - int validSlotCount = 0; - for (int i = 0; i < INPUT_SLOTS; i++) { - if (i != playbackSlot && doesSlotContainValidRecord(i)) { - validSlots[validSlotCount++] = i; - } - } - switch (validSlotCount) { - case 0 -> {} - case 1 -> { - playbackSlot = validSlots[0]; - } - default -> { - playbackSlot = validSlots[SHUFFLER.nextInt(validSlotCount)]; - } - } - } else { - int attempt = 0; - int nextSlot = playbackSlot; - do { - attempt++; - nextSlot = (nextSlot + 1) % INPUT_SLOTS; - } while (!doesSlotContainValidRecord(nextSlot) && attempt <= INPUT_SLOTS); - if (attempt <= INPUT_SLOTS) { - playbackSlot = nextSlot; - } - } - } - - public boolean doesSlotContainValidRecord(int slot) { - return mInventory[getInputSlot() + slot] != null - && mInventory[getInputSlot() + slot].getItem() instanceof ItemRecord; - } - - @Override - public void onRemoval() { - final IGregTechTileEntity baseTE = getBaseMetaTileEntity(); - if (baseTE == null) { - return; - } - if (!baseTE.isServerSide()) { - return; - } - if (jukeboxUuid == UNSET_UUID) { - return; - } - GT_MusicSystem.ServerSystem.removeMusicSource(jukeboxUuid); - } - - @Override - public long getMinimumStoredEU() { - return BalanceMath.eutUsage(mTier) * 20; - } - - @Override - public long maxEUStore() { - return 512L + BalanceMath.eutUsage(mTier) * 50; - } - - @Override - public long maxAmperesIn() { - return 1; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return null; - } - - public static final String NBTKEY_UUID_LOW = "jukeboxUUIDLow"; - public static final String NBTKEY_UUID_HIGH = "jukeboxUUIDHigh"; - public static final String NBTKEY_LOOP_MODE = "loopMode"; - public static final String NBTKEY_SHUFFLE_MODE = "shuffleMode"; - public static final String NBTKEY_PLAYBACK_SLOT = "playbackSlot"; - public static final String NBTKEY_VOLUME_PLAY = "playbackVolume"; - public static final String NBTKEY_VOLUME_P2P = "p2pVolume"; - public static final String NBTKEY_DISC_PROGRESS_MS = "discProgressMs"; - - @Override - public String[] getInfoData() { - return new String[] { "Jukebox UUID: " + ((jukeboxUuid == UNSET_UUID) ? "unset" : jukeboxUuid), - "Loop mode: " + loopMode, "Shuffle mode: " + shuffleMode, "Played the disc for [ms]: " + discProgressMs, - "Current disc duration [ms]: " + discDurationMs, - "Playback range [blocks]: " + BalanceMath.volumeToAttenuationDistance(playbackVolume), - "P2P range [blocks]: " + BalanceMath.volumeToAttenuationDistance(playbackVolume), - "Raw playback strength: " + playbackVolume, "Raw p2p strength: " + p2pVolume }; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (jukeboxUuid != UNSET_UUID) { - aNBT.setLong(NBTKEY_UUID_LOW, jukeboxUuid.getLeastSignificantBits()); - aNBT.setLong(NBTKEY_UUID_HIGH, jukeboxUuid.getMostSignificantBits()); - aNBT.setBoolean(NBTKEY_LOOP_MODE, loopMode); - aNBT.setBoolean(NBTKEY_SHUFFLE_MODE, shuffleMode); - aNBT.setInteger(NBTKEY_PLAYBACK_SLOT, playbackSlot); - aNBT.setFloat(NBTKEY_VOLUME_PLAY, playbackVolume); - aNBT.setFloat(NBTKEY_VOLUME_P2P, p2pVolume); - aNBT.setLong(NBTKEY_DISC_PROGRESS_MS, discProgressMs); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey(NBTKEY_UUID_LOW, Constants.NBT.TAG_ANY_NUMERIC) - && aNBT.hasKey(NBTKEY_UUID_HIGH, Constants.NBT.TAG_ANY_NUMERIC)) { - jukeboxUuid = new UUID(aNBT.getLong(NBTKEY_UUID_HIGH), aNBT.getLong(NBTKEY_UUID_LOW)); - } - if (aNBT.hasKey(NBTKEY_LOOP_MODE, Constants.NBT.TAG_ANY_NUMERIC)) { - loopMode = aNBT.getBoolean(NBTKEY_LOOP_MODE); - } - if (aNBT.hasKey(NBTKEY_SHUFFLE_MODE, Constants.NBT.TAG_ANY_NUMERIC)) { - shuffleMode = aNBT.getBoolean(NBTKEY_SHUFFLE_MODE); - } - if (aNBT.hasKey(NBTKEY_PLAYBACK_SLOT, Constants.NBT.TAG_ANY_NUMERIC)) { - playbackSlot = aNBT.getInteger(NBTKEY_PLAYBACK_SLOT); - } - if (aNBT.hasKey(NBTKEY_VOLUME_PLAY, Constants.NBT.TAG_ANY_NUMERIC)) { - playbackVolume = aNBT.getFloat(NBTKEY_VOLUME_PLAY); - } - if (aNBT.hasKey(NBTKEY_VOLUME_P2P, Constants.NBT.TAG_ANY_NUMERIC)) { - p2pVolume = aNBT.getFloat(NBTKEY_VOLUME_P2P); - } - if (aNBT.hasKey(NBTKEY_DISC_PROGRESS_MS, Constants.NBT.TAG_ANY_NUMERIC)) { - discProgressMs = aNBT.getLong(NBTKEY_DISC_PROGRESS_MS); - } - - final float maxVolume = BalanceMath.listeningVolume(mTier); - playbackVolume = MathHelper.clamp_float(playbackVolume, 0.0f, maxVolume); - p2pVolume = MathHelper.clamp_float(p2pVolume, 0.0f, maxVolume); - } - - @Override - protected BasicUIProperties getUIProperties() { - return super.getUIProperties().toBuilder() - .itemInputPositionsGetter(count -> UIHelper.getGridPositions(count, 7, 6, 7, 3)) - .itemOutputPositionsGetter(count -> UIHelper.getGridPositions(count, 153, 24, 1)) - .specialItemPositionGetter(() -> new Pos2d(115, 62)) - .progressBarPos(Pos2d.cartesian(133, 24)) - .progressBarTexture(new FallbackableUITexture(GT_UITextures.PROGRESSBAR_ARROW)) - .build(); - } - - @Override - protected void addProgressBar(ModularWindow.Builder builder, BasicUIProperties uiProperties) { - builder.widget( - setNEITransferRect( - new ProgressBar().setProgress(() -> discProgressMs / (float) Math.max(1, discDurationMs)) - .setTexture(uiProperties.progressBarTexture.get(), uiProperties.progressBarImageSize) - .setDirection(uiProperties.progressBarDirection) - .setPos(uiProperties.progressBarPos) - .setSize(uiProperties.progressBarSize) - .setUpdateTooltipEveryTick(true) - .attachSyncer( - new FakeSyncWidget.LongSyncer(() -> this.discProgressMs, val -> this.discProgressMs = val), - builder) - .attachSyncer( - new FakeSyncWidget.LongSyncer(() -> this.discDurationMs, val -> this.discDurationMs = val), - builder) - .dynamicTooltip( - () -> Collections.singletonList( - String.format("%,.2f / %,.2f", discProgressMs / 1000.0f, discDurationMs / 1000.0f))), - uiProperties.neiTransferRectId)); - addProgressBarSpecialTextures(builder, uiProperties); - } - - @Override - protected SlotWidget createChargerSlot(int x, int y) { - return super.createChargerSlot(97, 62); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - final BasicUIProperties props = getUIProperties(); - final List inputSlots = props.itemInputPositionsGetter.apply(mInputSlotCount); - // Loop - builder.widget( - new CycleButtonWidget().setToggle(() -> loopMode, val -> loopMode = val) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CYCLIC) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.betterjukebox.loop.tooltip")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(153, 6) - .setSize(18, 18)); - // Shuffle - builder.widget(new CycleButtonWidget().setToggle(() -> shuffleMode, val -> { - shuffleMode = val; - if (shuffleMode) { - playbackSlot = -1; - } else { - playbackSlot = 0; - } - }) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_SHUFFLE) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.betterjukebox.shuffle.tooltip")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(153, 42) - .setSize(18, 18)); - // Currently playing slot highlight using the hotbar active texture - final DrawableWidget slotHighlight = new DrawableWidget(); - builder.widget( - slotHighlight - .setDrawable( - new UITexture( - new ResourceLocation("minecraft", "textures/gui/widgets.png"), - 0.0f, - 22.0f / 256.0f, - 24.0f / 256.0f, - 46.0f / 256.0f)) - .setSize(24, 24) - .attachSyncer(new FakeSyncWidget.IntegerSyncer(() -> this.playbackSlot, val -> { - this.playbackSlot = val; - slotHighlight.checkNeedsRebuild(); - }), builder) - .setPosProvider( - (screenSize, window, parent) -> inputSlots.get(MathHelper.clamp_int(playbackSlot, 0, INPUT_SLOTS)) - .add(-3, -3))); - // Attenuation distance (controls internal "volume") - // Caching tooltip data caches the formatted p2p range value, so we have to use the uncached variant here. - builder.widget( - new SliderWidget() - .setBounds(0.0f, BalanceMath.volumeToAttenuationDistance(BalanceMath.listeningVolume(mTier))) - .setGetter(this::getPlaybackBlockRange) - .setSetter(this::setPlaybackBlockRange) - .dynamicTooltip( - () -> mTooltipCache.getUncachedTooltipData( - "GT5U.machines.betterjukebox.attenuationDistance.tooltip", - (int) getPlaybackBlockRange()).text) - .setUpdateTooltipEveryTick(true) - .setPos(44, 63) - .setSize(52, 8)); - builder.widget( - new SliderWidget() - .setBounds(0.0f, BalanceMath.volumeToAttenuationDistance(BalanceMath.listeningVolume(mTier))) - .setGetter(this::getP2PBlockRange) - .setSetter(this::setP2PBlockRange) - .dynamicTooltip( - () -> mTooltipCache.getUncachedTooltipData( - "GT5U.machines.betterjukebox.p2pAttenuationDistance.tooltip", - (int) getP2PBlockRange()).text) - .setUpdateTooltipEveryTick(true) - .setPos(44, 71) - .setSize(52, 8)); - } - - private float getPlaybackBlockRange() { - return BalanceMath.volumeToAttenuationDistance(playbackVolume); - } - - private float getP2PBlockRange() { - return BalanceMath.volumeToAttenuationDistance(p2pVolume); - } - - private void setPlaybackBlockRange(float blockRange) { - float volume = BalanceMath.attenuationDistanceToVolume(blockRange); - volume = MathHelper.clamp_float(volume, 0.0f, BalanceMath.listeningVolume(mTier)); - if (volume != playbackVolume) { - playbackVolume = volume; - if (getBaseMetaTileEntity().isServerSide()) { - updateEmitterList(); - } - } - } - - private void setP2PBlockRange(float blockRange) { - float volume = BalanceMath.attenuationDistanceToVolume(blockRange); - volume = MathHelper.clamp_float(volume, 0.0f, BalanceMath.listeningVolume(mTier)); - if (volume != p2pVolume) { - p2pVolume = volume; - if (getBaseMetaTileEntity().isServerSide()) { - updateEmitterList(); - } - } - } - - private final EnumMap attachedSoundP2P = new EnumMap<>(ForgeDirection.class); - private final ObjectArrayList combinedOutputsListCache = new ObjectArrayList<>(new PartP2PSound[0]); - - private void updateEmitterList() { - final GT_MusicSystem.MusicSource target = musicSource; - if (target == null) { - return; - } - final ObjectArrayList emitters = combinedOutputsListCache; - emitters.clear(); - - attachedSoundP2P.forEach((ignored, p2p) -> { - if (p2p != null) { - try { - p2p.getOutputs() - .forEach(emitters::add); - } catch (GridAccessException e) { - // skip - } - } - }); - - IGregTechTileEntity te = getBaseMetaTileEntity(); - if (te == null) { - return; - } - final Vector4i position = new Vector4i(); - target.resizeEmitterArray(1 + emitters.size()); - position.set(te.getXCoord(), te.getYCoord(), te.getZCoord(), te.getWorld().provider.dimensionId); - final float actualVolume = MathHelper - .clamp_float(playbackVolume, 0.0f, BalanceMath.listeningVolume(powered ? mTier : 0)); - target.setEmitter(0, position, actualVolume); - final float actualP2PVolume = MathHelper - .clamp_float(p2pVolume, 0.0f, powered ? BalanceMath.listeningVolume(mTier) : 0.0f); - for (int i = 0; i < emitters.size(); i++) { - final PartP2PSound p2p = emitters.get(i); - final AENetworkProxy proxy = p2p.getProxy(); - final TileEntity emitterTe = p2p.getTile(); - final ForgeDirection dir = p2p.getSide(); - position.set( - emitterTe.xCoord + dir.offsetX, - emitterTe.yCoord + dir.offsetY, - emitterTe.zCoord + dir.offsetZ, - emitterTe.getWorldObj().provider.dimensionId); - final boolean active = proxy.isActive(); - target.setEmitter(1 + i, position, active ? actualP2PVolume : 0); - } - } - - @Override - public boolean allowSoundProxying(PartP2PSound p2p) { - return false; // the jukebox proxies sounds by itself - } - - @Override - public void onSoundP2PAttach(PartP2PSound p2p) { - attachedSoundP2P.put(p2p.getSide(), p2p); - updateEmitterList(); - } - - @Override - public void onSoundP2PDetach(PartP2PSound p2p) { - attachedSoundP2P.put(p2p.getSide(), null); - updateEmitterList(); - } - - @Override - public void onSoundP2POutputUpdate(PartP2PSound p2p, TunnelCollection outputs) { - updateEmitterList(); - } - -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java deleted file mode 100644 index 8d2e0959e1..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java +++ /dev/null @@ -1,229 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.MachineType; -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_BasicMachine; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Boxinator extends GT_MetaTileEntity_BasicMachine { - - ItemStack aInputCache; - ItemStack aOutputCache; - int aTypeCache = 0; - - public GT_MetaTileEntity_Boxinator(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, - MachineType.PACKAGER.tooltipDescription(), - 2, - 1, - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR_GLOW")) - .glow() - .build())); - } - - public GT_MetaTileEntity_Boxinator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, 2, 1); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Boxinator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.packagerRecipes; - } - - private boolean hasValidCache(ItemStack mItem, int mType, boolean mClearOnFailure) { - if (aInputCache != null && aOutputCache != null - && aTypeCache == mType - && aInputCache.isItemEqual(mItem) - && ItemStack.areItemStackTagsEqual(mItem, aInputCache)) return true; - // clear cache if it was invalid - if (mClearOnFailure) { - aInputCache = null; - aOutputCache = null; - aTypeCache = 0; - } - return false; - } - - private void cacheItem(ItemStack mInputItem, ItemStack mOutputItem, int mType) { - aTypeCache = mType; - aOutputCache = mOutputItem.copy(); - aInputCache = mInputItem.copy(); - } - - @Override - public int checkRecipe() { - int tCheck = super.checkRecipe(); - if (tCheck != DID_NOT_FIND_RECIPE) { - return tCheck; - } - ItemStack tSlot0 = getInputAt(0); - ItemStack tSlot1 = getInputAt(1); - if ((GT_Utility.isStackValid(tSlot0)) && (GT_Utility.isStackValid(tSlot1)) - && (GT_Utility.getContainerItem(tSlot0, true) == null)) { - if ((ItemList.Schematic_1by1.isStackEqual(tSlot1)) && (tSlot0.stackSize >= 1)) { - boolean tIsCached = hasValidCache(tSlot0, 1, true); - this.mOutputItems[0] = tIsCached ? aOutputCache.copy() : GT_ModHandler.getRecipeOutput(tSlot0); - if (this.mOutputItems[0] != null) { - if (canOutput(this.mOutputItems[0])) { - tSlot0.stackSize -= 1; - calculateOverclockedNess(30, 16); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 1); - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - } - return DID_NOT_FIND_RECIPE; - } - if ((ItemList.Schematic_2by2.isStackEqual(tSlot1)) && (getInputAt(0).stackSize >= 4)) { - boolean tIsCached = hasValidCache(tSlot0, 2, true); - this.mOutputItems[0] = tIsCached ? aOutputCache.copy() - : GT_ModHandler.getRecipeOutput(tSlot0, tSlot0, null, tSlot0, tSlot0); - if (this.mOutputItems[0] != null) { - if (canOutput(this.mOutputItems[0])) { - getInputAt(0).stackSize -= 4; - calculateOverclockedNess(30, 32); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 2); - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - } - return DID_NOT_FIND_RECIPE; - } - if ((ItemList.Schematic_3by3.isStackEqual(tSlot1)) && (getInputAt(0).stackSize >= 9)) { - boolean tIsCached = hasValidCache(tSlot0, 3, true); - this.mOutputItems[0] = tIsCached ? aOutputCache.copy() - : GT_ModHandler - .getRecipeOutput(tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0); - if (this.mOutputItems[0] != null) { - if (canOutput(this.mOutputItems[0])) { - getInputAt(0).stackSize -= 9; - calculateOverclockedNess(30, 64); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 3); - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - } - return DID_NOT_FIND_RECIPE; - } - } - return DID_NOT_FIND_RECIPE; - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (!super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)) { - return false; - } - ItemStack tInput1 = getInputAt(1); - if ((ItemList.Schematic_1by1.isStackEqual(tInput1)) || (ItemList.Schematic_2by2.isStackEqual(tInput1)) - || (ItemList.Schematic_3by3.isStackEqual(tInput1))) { - if (hasValidCache(aStack, aTypeCache, false)) return true; - if (RecipeMaps.packagerRecipes.findRecipe( - getBaseMetaTileEntity(), - true, - gregtech.api.enums.GT_Values.V[mTier], - null, - GT_Utility.copyAmount(64, aStack), - tInput1) != null) { - return true; - } - if (ItemList.Schematic_1by1.isStackEqual(getInputAt(1)) && GT_ModHandler.getRecipeOutput(aStack) != null) - return true; - if (ItemList.Schematic_2by2.isStackEqual(getInputAt(1)) - && GT_ModHandler.getRecipeOutput(aStack, aStack, null, aStack, aStack) != null) { - return true; - } - return ItemList.Schematic_3by3.isStackEqual(getInputAt(1)) && (GT_ModHandler - .getRecipeOutput(aStack, aStack, aStack, aStack, aStack, aStack, aStack, aStack, aStack) != null); - } else { - return RecipeMaps.packagerRecipes.containsInput(aStack); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java deleted file mode 100644 index de43fd715e..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java +++ /dev/null @@ -1,110 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Charger extends GT_MetaTileEntity_BasicBatteryBuffer { - - public GT_MetaTileEntity_Charger(int aID, String aName, String aNameRegional, int aTier, String aDescription, - int aSlotCount) { - super(aID, aName, aNameRegional, aTier, aDescription, aSlotCount); - } - - public GT_MetaTileEntity_Charger(String aName, int aTier, String aDescription, ITexture[][][] aTextures, - int aSlotCount) { - super(aName, aTier, aDescription, aTextures, aSlotCount); - } - - public GT_MetaTileEntity_Charger(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, - int aSlotCount) { - super(aName, aTier, aDescription, aTextures, aSlotCount); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Charger(mName, mTier, mDescriptionArray, mTextures, mInventory.length); - } - - @Override - public long getMinimumStoredEU() { - return V[mTier] * 64L * mInventory.length; - } - - @Override - public long maxEUStore() { - return V[mTier] * 256L * mInventory.length; - } - - @Override - public long maxAmperesIn() { - return Math.max(mChargeableCount * 8L, 4L); - } - - @Override - public long maxAmperesOut() { - return Math.max(mBatteryCount * 4L, 2L); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (this.getBaseMetaTileEntity() instanceof BaseMetaTileEntity) { - BaseMetaTileEntity mBaseMetaTileEntity = (BaseMetaTileEntity) getBaseMetaTileEntity(); - if (mBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity mMetaTileEntity) { - // for (int t = 0; t < 6; t++) { - if (mMetaTileEntity.dechargerSlotCount() > 0 - && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { - for (int i = mMetaTileEntity.dechargerSlotStartIndex(), - k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) { - if (mMetaTileEntity.mInventory[i] != null - && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { - mBaseMetaTileEntity.increaseStoredEnergyUnits( - GT_ModHandler.dischargeElectricItem( - mMetaTileEntity.mInventory[i], - GT_Utility.safeInt( - Math.min( - V[mTier] * 15, - mBaseMetaTileEntity.getEUCapacity() - - mBaseMetaTileEntity.getStoredEU())), - (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()), - true, - false, - false), - true); - if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null; - } - } - } - if (mMetaTileEntity.rechargerSlotCount() > 0 && mBaseMetaTileEntity.getStoredEU() > 0) { - for (int i = mMetaTileEntity.rechargerSlotStartIndex(), - k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) { - if (mBaseMetaTileEntity.getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) { - mBaseMetaTileEntity - .decreaseStoredEU( - GT_ModHandler.chargeElectricItem( - mMetaTileEntity.mInventory[i], - GT_Utility - .safeInt(Math.min(V[mTier] * 15, mBaseMetaTileEntity.getStoredEU())), - (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getOutputTier()), - true, - false), - true); - if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null; - } - } - // } - } - } - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java deleted file mode 100644 index 9249673c7c..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java +++ /dev/null @@ -1,1555 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.AuthorKuba; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW; -import static gregtech.api.metatileentity.BaseTileEntity.STALLED_STUTTERING_TOOLTIP; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.collect.ImmutableSet; -import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.screen.ModularUIContext; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.builder.UIInfo; -import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotGroup; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.mojang.authlib.GameProfile; - -import forestry.api.apiculture.BeeManager; -import forestry.api.apiculture.EnumBeeChromosome; -import forestry.api.apiculture.EnumBeeType; -import forestry.api.apiculture.FlowerManager; -import forestry.api.apiculture.IAlleleBeeAcceleratableEffect; -import forestry.api.apiculture.IAlleleBeeEffect; -import forestry.api.apiculture.IAlleleBeeSpecies; -import forestry.api.apiculture.IApiaristTracker; -import forestry.api.apiculture.IBee; -import forestry.api.apiculture.IBeeGenome; -import forestry.api.apiculture.IBeeHousing; -import forestry.api.apiculture.IBeeHousingInventory; -import forestry.api.apiculture.IBeeListener; -import forestry.api.apiculture.IBeeModifier; -import forestry.api.apiculture.IBeeRoot; -import forestry.api.apiculture.IBeekeepingLogic; -import forestry.api.apiculture.IBeekeepingMode; -import forestry.api.arboriculture.EnumGermlingType; -import forestry.api.core.BiomeHelper; -import forestry.api.core.EnumHumidity; -import forestry.api.core.EnumTemperature; -import forestry.api.core.ForestryAPI; -import forestry.api.core.IErrorLogic; -import forestry.api.core.IErrorState; -import forestry.api.genetics.AlleleManager; -import forestry.api.genetics.IEffectData; -import forestry.api.genetics.IIndividual; -import forestry.apiculture.genetics.Bee; -import forestry.apiculture.genetics.alleles.AlleleEffectThrottled; -import forestry.core.errors.EnumErrorCode; -import forestry.plugins.PluginApiculture; -import gregtech.GT_Mod; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.recipe.BasicUIProperties; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ApiaryModifier; -import gregtech.api.util.GT_ApiaryUpgrade; -import gregtech.api.util.GT_Utility; -import gregtech.common.GT_Client; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicMachine - implements IBeeHousing, IBeeHousingInventory, IErrorLogic, IBeeModifier, IBeeListener, IAddUIWidgets { - - public static final int beeCycleLength = 550; - public static final int baseEUtUsage = 37; - private static final int queen = 5; - private static final int drone = 6; - private static final int upgradeSlot = drone + 1; - private static final int upgradeSlotCount = 4; - private static Field AlleleBeeEffectThrottledField; - - final IBeeRoot beeRoot = (IBeeRoot) AlleleManager.alleleRegistry.getSpeciesRoot("rootBees"); - - public int mSpeed = 0; - public boolean mLockedSpeed = true; - public boolean mAutoQueen = true; - - private ItemStack usedQueen = null; - private IBee usedQueenBee = null; - private IEffectData[] effectData = new IEffectData[2]; - - public GT_MetaTileEntity_IndustrialApiary(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 4, - new String[] { "BEES GOES BRRRR", EnumChatFormatting.GRAY + AuthorKuba, - "Effective production chance as a percent is", "2.8 * b^0.52 * (p + t)^0.52 * s^0.37", - "where b is the base production chance as a percent,", - "p is the production modifier (2 w/o upgrades, or 4 * 1.2^n with n production upgrades),", - "t is 8 for the industrial apiary, and", "s is the speed value for the bee", - "Outputs are generated at the end of every bee tick (...)", - "Primary outputs are rolled once with base chance, once with half base" }, - 6, - 9, - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_INDUSTRIAL_APIARY), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_INDUSTRIAL_APIARY), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_INDUSTRIAL_APIARY), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_INDUSTRIAL_APIARY), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW) - .glow() - .build())); - } - - public GT_MetaTileEntity_IndustrialApiary(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 4, aDescription, aTextures, 6, 9); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_IndustrialApiary(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isClientSide()) return true; - if (!GT_Mod.gregtechproxy.mForceFreeFace) { - openGUI(aBaseMetaTileEntity, aPlayer); - return true; - } - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (aBaseMetaTileEntity.getAirAtSide(side)) { - openGUI(aBaseMetaTileEntity, aPlayer); - return true; - } - } - GT_Utility.sendChatToPlayer(aPlayer, "No free Side!"); - return true; - } - - private void openGUI(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - IndustrialApiaryUI.open( - aPlayer, - aBaseMetaTileEntity.getWorld(), - aBaseMetaTileEntity.getXCoord(), - aBaseMetaTileEntity.getYCoord(), - aBaseMetaTileEntity.getZCoord()); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("mSpeed", mSpeed); - aNBT.setBoolean("mLockedSpeed", mLockedSpeed); - aNBT.setBoolean("mAutoQueen", mAutoQueen); - if (usedQueen != null) aNBT.setTag("usedQueen", usedQueen.writeToNBT(new NBTTagCompound())); - aNBT.setBoolean("retrievingPollenInThisOperation", retrievingPollenInThisOperation); - aNBT.setInteger("pollinationDelay", pollinationDelay); - aNBT.setFloat("usedBeeLife", usedBeeLife); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mSpeed = aNBT.getInteger("mSpeed"); - mLockedSpeed = aNBT.getBoolean("mLockedSpeed"); - if (aNBT.hasKey("mAutoQueen")) mAutoQueen = aNBT.getBoolean("mAutoQueen"); - if (aNBT.hasKey("usedQueen")) usedQueen = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("usedQueen")); - retrievingPollenInThisOperation = aNBT.getBoolean("retrievingPollenInThisOperation"); - pollinationDelay = aNBT.getInteger("pollinationDelay"); - usedBeeLife = aNBT.getFloat("usedBeeLife"); - } - - boolean retrievingPollenInThisOperation = false; - IIndividual retrievedpollen = null; - int pollinationDelay = 100; - float usedBeeLife = 0f; - - @Override - public int checkRecipe() { - updateModifiers(); - if (canWork()) { - - final ItemStack queen = getQueen(); - usedQueen = queen.copy(); - if (beeRoot.getType(queen) == EnumBeeType.QUEEN) { - final IBee bee = beeRoot.getMember(queen); - usedQueenBee = bee; - - // LIFE CYCLES - - float mod = this.getLifespanModifier(null, null, 1.f); - final IBeekeepingMode mode = beeRoot.getBeekeepingMode(this.getWorld()); - final IBeeModifier beemodifier = mode.getBeeModifier(); - mod *= beemodifier.getLifespanModifier(null, null, 1.f); - final int h = bee.getHealth(); - mod = 1.f / mod; - final float cycles = h / mod; - - // PRODUCTS - - final HashMap pollen = new HashMap<>(); - - if (isRetrievingPollen && floweringMod > 0f) { - final int icycles = (int) cycles - + (getWorld().rand.nextFloat() < (cycles - (float) ((int) cycles)) ? 1 : 0); - for (int z = 0; z < icycles; z++) { - final IIndividual p = bee.retrievePollen(this); - if (p != null) { - final ItemStack s = p.getGenome() - .getSpeciesRoot() - .getMemberStack(p, EnumGermlingType.POLLEN.ordinal()); - if (s != null) { - final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(s); - pollen.computeIfAbsent(id, k -> { - final ItemStack ns = s.copy(); - ns.stackSize = 0; - return ns; - }); - pollen.get(id).stackSize += s.stackSize; - } - } - } - } - - retrievedpollen = null; - retrievingPollenInThisOperation = isRetrievingPollen; - - final IBeeGenome genome = bee.getGenome(); - final IAlleleBeeSpecies primary = genome.getPrimary(); - final IAlleleBeeSpecies secondary = genome.getSecondary(); - - final float speed = genome.getSpeed(); - final float prodMod = getProductionModifier(null, 0f) + beemodifier.getProductionModifier(null, 0f); - - final HashMap drops = new HashMap<>(); - final HashMap dropstacks = new HashMap<>(); - - for (Map.Entry entry : primary.getProductChances() - .entrySet()) { - final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); - drops.merge( - id, - Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f) * (float) entry.getKey().stackSize - * cycles, - Float::sum); - dropstacks.computeIfAbsent(id, k -> entry.getKey()); - } - for (Map.Entry entry : secondary.getProductChances() - .entrySet()) { - final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); - drops.merge( - id, - Bee.getFinalChance(entry.getValue() / 2f, speed, prodMod, 8f) * (float) entry.getKey().stackSize - * cycles, - Float::sum); - dropstacks.computeIfAbsent(id, k -> entry.getKey()); - } - if (primary.isJubilant(genome, this) && secondary.isJubilant(genome, this)) - for (Map.Entry entry : primary.getSpecialtyChances() - .entrySet()) { - final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); - drops.merge( - id, - Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f) - * (float) entry.getKey().stackSize - * cycles, - Float::sum); - dropstacks.computeIfAbsent(id, k -> entry.getKey()); - } - - int i = 0; - final int imax = mOutputItems.length; - - final IApiaristTracker breedingTracker = beeRoot.getBreedingTracker(getWorld(), getOwner()); - - if (!bee.canSpawn()) { - final ItemStack convert = new ItemStack(PluginApiculture.items.beePrincessGE); - final NBTTagCompound nbttagcompound = new NBTTagCompound(); - queen.writeToNBT(nbttagcompound); - convert.setTagCompound(nbttagcompound); - this.mOutputItems[i++] = convert; - } else { - final IBee b = bee.spawnPrincess(this); - if (b != null) { - final ItemStack princess = beeRoot.getMemberStack(b, EnumBeeType.PRINCESS.ordinal()); - breedingTracker.registerPrincess(b); - this.mOutputItems[i++] = princess; - } - final IBee[] d = bee.spawnDrones(this); - if (d != null && d.length > 0) { - final HashMap drones = new HashMap<>(d.length); - for (IBee dr : d) { - final ItemStack drone = beeRoot.getMemberStack(dr, EnumBeeType.DRONE.ordinal()); - breedingTracker.registerDrone(dr); - final GT_Utility.ItemId drid = GT_Utility.ItemId.createNoCopy(drone); - if (drones.containsKey(drid)) drones.get(drid).stackSize += drone.stackSize; - else { - this.mOutputItems[i++] = drone; - drones.put(drid, drone); - } - } - } - } - - final int imin = i; - - setQueen(null); - - for (Map.Entry entry : drops.entrySet()) { - final ItemStack s = dropstacks.get(entry.getKey()) - .copy(); - s.stackSize = entry.getValue() - .intValue() - + (getWorld().rand.nextFloat() < (entry.getValue() - (float) entry.getValue() - .intValue()) ? 1 : 0); - if (s.stackSize > 0 && i < imax) while (true) { - if (s.stackSize <= s.getMaxStackSize()) { - this.mOutputItems[i++] = s; - break; - } else this.mOutputItems[i++] = s.splitStack(s.getMaxStackSize()); - if (i >= imax) break; - } - } - - for (ItemStack s : pollen.values()) if (i < imax) this.mOutputItems[i++] = s; - else break; - - // Overclock - - usedBeeLife = cycles * (float) beeCycleLength; - this.mMaxProgresstime = (int) usedBeeLife; - final int timemaxdivider = this.mMaxProgresstime / 100; - final int useddivider = 1 << this.mSpeed; - int actualdivider = useddivider; - this.mMaxProgresstime /= Math.min(actualdivider, timemaxdivider); - actualdivider /= Math.min(actualdivider, timemaxdivider); - for (i--; i >= imin; i--) this.mOutputItems[i].stackSize *= actualdivider; - - pollinationDelay = Math.max((int) (this.mMaxProgresstime / cycles), 20); // don't run too often - - this.mProgresstime = 0; - this.mEUt = (int) ((float) baseEUtUsage * this.energyMod * useddivider); - if (useddivider == 2) this.mEUt += 32; - else if (useddivider > 2) this.mEUt += (32 * (useddivider << (this.mSpeed - 2))); - } else { - // Breeding time - - retrievingPollenInThisOperation = true; // Don't pollinate when breeding - - this.mMaxProgresstime = 100; - this.mProgresstime = 0; - final int useddivider = Math.min(100, 1 << this.mSpeed); - this.mMaxProgresstime /= useddivider; - this.mEUt = (int) ((float) baseEUtUsage * this.energyMod * useddivider); - if (useddivider == 2) this.mEUt += 32; - else if (useddivider > 2) this.mEUt += (32 * (useddivider << (this.mSpeed - 2))); - - final IBee princess = beeRoot.getMember(getQueen()); - usedQueenBee = princess; - final IBee drone = beeRoot.getMember(getDrone()); - princess.mate(drone); - final NBTTagCompound nbttagcompound = new NBTTagCompound(); - princess.writeToNBT(nbttagcompound); - this.mOutputItems[0] = new ItemStack(PluginApiculture.items.beeQueenGE); - this.mOutputItems[0].setTagCompound(nbttagcompound); - beeRoot.getBreedingTracker(getWorld(), getOwner()) - .registerQueen(princess); - - setQueen(null); - getDrone().stackSize -= 1; - if (getDrone().stackSize == 0) setDrone(null); - } - - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - - return DID_NOT_FIND_RECIPE; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - updateModifiers(); - } - - @Override - protected boolean hasEnoughEnergyToCheckRecipe() { - return getBaseMetaTileEntity().isUniversalEnergyStored(V[mSpeed] * 8L); - } - - @Override - public long maxAmperesIn() { - return 4L; - } - - private void doEffect() { - final IBeeGenome genome = usedQueenBee.getGenome(); - final IAlleleBeeEffect effect = genome.getEffect(); - if (!(effect instanceof IAlleleBeeAcceleratableEffect)) { - effectData[0] = effect.validateStorage(effectData[0]); - effect.doEffect(genome, effectData[0], this); - } - - if (!effect.isCombinable()) return; - - final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); - if (!secondary.isCombinable()) return; - - if (!(secondary instanceof IAlleleBeeAcceleratableEffect)) { - effectData[1] = secondary.validateStorage(effectData[1]); - secondary.doEffect(genome, effectData[1], this); - } - } - - private void doAcceleratedEffects() { - final IBeeGenome genome = usedQueenBee.getGenome(); - final IAlleleBeeEffect effect = genome.getEffect(); - try { - if (AlleleBeeEffectThrottledField == null) { - AlleleBeeEffectThrottledField = AlleleEffectThrottled.class.getDeclaredField("throttle"); - AlleleBeeEffectThrottledField.setAccessible(true); - } - if (effect instanceof IAlleleBeeAcceleratableEffect) { - effectData[0] = effect.validateStorage(effectData[0]); - effectData[0] = ((IAlleleBeeAcceleratableEffect) effect).doEffectAccelerated( - genome, - effectData[0], - this, - usedBeeLife / (effect instanceof AlleleEffectThrottled - ? (float) AlleleBeeEffectThrottledField.getInt(effect) - : 1f)); - } - - if (!effect.isCombinable()) return; - - final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); - if (!secondary.isCombinable()) return; - - if (secondary instanceof IAlleleBeeAcceleratableEffect) { - effectData[1] = secondary.validateStorage(effectData[1]); - effectData[1] = ((IAlleleBeeAcceleratableEffect) secondary).doEffectAccelerated( - genome, - effectData[0], - this, - usedBeeLife / (secondary instanceof AlleleEffectThrottled - ? (float) AlleleBeeEffectThrottledField.getInt(secondary) - : 1f)); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isClientSide()) { - if (GT_Client.changeDetected == 4) { - /* - * Client tick counter that is set to 5 on hiding pipes and covers. It triggers a texture update next - * client tick when reaching 4, with provision for 3 more update tasks, spreading client change - * detection related work and network traffic on different ticks, until it reaches 0. - */ - aBaseMetaTileEntity.issueTextureUpdate(); - } - if (aBaseMetaTileEntity.isActive()) { - if (usedQueen != null) { - if (aTick % 2 == 0) { - // FX on client, effect on server - final IBee bee = beeRoot.getMember(usedQueen); - effectData = bee.doFX(effectData, this); - } - } - } - } - if (aBaseMetaTileEntity.isServerSide()) { - - mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; - mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; - - doDisplayThings(); - - if (!aBaseMetaTileEntity.isActive()) { - if (aBaseMetaTileEntity.isAllowedToWork() - && (aBaseMetaTileEntity.hasInventoryBeenModified() || aTick % 600 == 0 - || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) - && hasEnoughEnergyToCheckRecipe()) { - final int check = checkRecipe(); - if (check == FOUND_AND_SUCCESSFULLY_USED_RECIPE) { - aBaseMetaTileEntity.setActive(true); - } - } - } else { - - if (this.mProgresstime < 0) { - this.mProgresstime++; - return; - } - if (this.mStuttering) { - if (!aBaseMetaTileEntity.isAllowedToWork()) return; - if (aTick % 100 == 0) this.mStuttering = false; - return; - } - if (this.hasErrors()) { - if (!aBaseMetaTileEntity.isAllowedToWork()) return; - if (aTick % 100 == 0) if (!canWork(usedQueen)) this.stutterProcess(); - return; - } - - if (!drainEnergyForProcess(this.mEUt)) { - this.mStuttering = true; - this.stutterProcess(); - return; - } - this.mProgresstime++; - if (usedQueen != null) { - if (usedQueenBee == null) usedQueenBee = beeRoot.getMember(usedQueen); - doEffect(); - if (!retrievingPollenInThisOperation && floweringMod > 0f - && this.mProgresstime % pollinationDelay == 0) { - if (retrievedpollen == null) retrievedpollen = usedQueenBee.retrievePollen(this); - if (retrievedpollen != null && (usedQueenBee.pollinateRandom(this, retrievedpollen) - || this.mProgresstime % (pollinationDelay * 5) == 0)) retrievedpollen = null; - } - } - - if (this.mProgresstime % 100 == 0) { - if (!canWork(usedQueen)) { - this.stutterProcess(); - return; - } - } - - if (this.mProgresstime >= this.mMaxProgresstime) { - if (usedQueenBee != null) doAcceleratedEffects(); - updateModifiers(); - for (int i = 0; i < mOutputItems.length; i++) - if (mOutputItems[i] != null) for (int j = 0; j < mOutputItems.length; j++) { - if (j == 0 && isAutomated) { - if (beeRoot.isMember(mOutputItems[i], EnumBeeType.QUEEN.ordinal()) - || beeRoot.isMember(mOutputItems[i], EnumBeeType.PRINCESS.ordinal())) { - if (aBaseMetaTileEntity.addStackToSlot(queen, mOutputItems[i])) break; - } else if (beeRoot.isMember(mOutputItems[i], EnumBeeType.DRONE.ordinal())) - if (aBaseMetaTileEntity.addStackToSlot(drone, mOutputItems[i])) break; - } else if (mAutoQueen && i == 0 - && j == 0 - && beeRoot.isMember(mOutputItems[0], EnumBeeType.QUEEN.ordinal()) - && aBaseMetaTileEntity.addStackToSlot(queen, mOutputItems[0])) break; - if (aBaseMetaTileEntity - .addStackToSlot(getOutputSlot() + ((j + i) % mOutputItems.length), mOutputItems[i])) - break; - } - Arrays.fill(mOutputItems, null); - mEUt = 0; - mProgresstime = 0; - mMaxProgresstime = 0; - mStuttering = false; - aBaseMetaTileEntity.setActive(false); - - if (doesAutoOutput() && !isOutputEmpty() && aBaseMetaTileEntity.getFrontFacing() != mMainFacing) { - final TileEntity tTileEntity2 = aBaseMetaTileEntity - .getTileEntityAtSide(aBaseMetaTileEntity.getFrontFacing()); - final long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored(); - int tMaxStacks = (int) (tStoredEnergy / 64L); - if (tMaxStacks > mOutputItems.length) tMaxStacks = mOutputItems.length; - - moveMultipleItemStacks( - aBaseMetaTileEntity, - tTileEntity2, - aBaseMetaTileEntity.getFrontFacing(), - aBaseMetaTileEntity.getBackFacing(), - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1, - tMaxStacks); - } - - if (aBaseMetaTileEntity.isAllowedToWork() && checkRecipe() == FOUND_AND_SUCCESSFULLY_USED_RECIPE) - aBaseMetaTileEntity.setActive(true); - } - } - } - } - - public void cancelProcess() { - if (this.getBaseMetaTileEntity() - .isActive() - && this.getBaseMetaTileEntity() - .isServerSide() - && usedQueen != null - && beeRoot.isMember(usedQueen, EnumBeeType.QUEEN.ordinal())) { - Arrays.fill(mOutputItems, null); - mEUt = 0; - mProgresstime = 0; - mMaxProgresstime = 0; - mStuttering = false; - this.getBaseMetaTileEntity() - .setActive(false); - setQueen(usedQueen); - this.getBaseMetaTileEntity() - .disableWorking(); - } - } - - @Override - public boolean isItemValidForSlot(int aIndex, ItemStack aStack) { - if (aStack == null) return false; - if (aIndex < getInputSlot()) return true; - if (aIndex == queen) return beeRoot.isMember(aStack, EnumBeeType.QUEEN.ordinal()) - || beeRoot.isMember(aStack, EnumBeeType.PRINCESS.ordinal()); - else if (aIndex == drone) return beeRoot.isMember(aStack, EnumBeeType.DRONE.ordinal()); - else if (aIndex < getOutputSlot()) { - if (!GT_ApiaryUpgrade.isUpgrade(aStack)) return false; - for (int i = upgradeSlot; i < upgradeSlot + upgradeSlotCount; i++) { - if (aIndex == i) continue; - final ItemStack s = getStackInSlot(i); - if (s == null) continue; - if (GT_Utility.areStacksEqual(getStackInSlot(i), aStack)) return false; - if (GT_ApiaryUpgrade.isUpgrade(aStack)) { - if (!GT_ApiaryUpgrade.getUpgrade(aStack) - .isAllowedToWorkWith(getStackInSlot(i))) return false; - } else if (GT_ApiaryUpgrade.isUpgrade(s)) { - if (!GT_ApiaryUpgrade.getUpgrade(s) - .isAllowedToWorkWith(aStack)) return false; - } - } - return true; - } else return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (!super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) return false; - return isItemValidForSlot(aIndex, aStack); - } - - @Override - public void setInventorySlotContents(int aIndex, ItemStack aStack) { - if (aIndex == queen && aStack != null && getBaseMetaTileEntity().isClientSide()) usedQueen = aStack.copy(); - super.setInventorySlotContents(aIndex, aStack); - } - - // Gets called on slot click // - public void onInventoryUpdate(int aIndex) { - if (aIndex > drone && aIndex < getOutputSlot()) updateModifiers(); - } - - public ItemStack getUsedQueen() { - return usedQueen; - } - - // region IBeeHousing - - @Override - public Iterable getBeeModifiers() { - return Collections.singletonList(this); - } - - @Override - public Iterable getBeeListeners() { - return Collections.singletonList(this); - } - - @Override - public IBeeHousingInventory getBeeInventory() { - return this; - } - - @Override - public IBeekeepingLogic getBeekeepingLogic() { - return dummylogic; - } - - @Override - public int getBlockLightValue() { - return this.getBaseMetaTileEntity() - .getLightLevelAtSide(ForgeDirection.UP); - } - - @Override - public boolean canBlockSeeTheSky() { - return this.getBaseMetaTileEntity() - .getSkyAtSide(ForgeDirection.UP); - } - - @Override - public World getWorld() { - return this.getBaseMetaTileEntity() - .getWorld(); - } - - GameProfile owner = null; - - @Override - public GameProfile getOwner() { - if (owner == null) owner = new GameProfile( - this.getBaseMetaTileEntity() - .getOwnerUuid(), - this.getBaseMetaTileEntity() - .getOwnerName()); - return owner; - } - - @Override - public Vec3 getBeeFXCoordinates() { - return Vec3.createVectorHelper( - getBaseMetaTileEntity().getXCoord() + 0.5, - getBaseMetaTileEntity().getYCoord() + 0.5, - getBaseMetaTileEntity().getZCoord() + 0.5); - } - - @Override - public BiomeGenBase getBiome() { - if (biomeOverride == null) return this.getBaseMetaTileEntity() - .getBiome(); - return biomeOverride; - } - - @Override - public EnumTemperature getTemperature() { - if (BiomeHelper.isBiomeHellish(getBiome())) return EnumTemperature.HELLISH; - return EnumTemperature.getFromValue(getBiome().temperature + temperatureMod); - } - - @Override - public EnumHumidity getHumidity() { - return EnumHumidity.getFromValue(getBiome().rainfall + humidityMod); - } - - @Override - public IErrorLogic getErrorLogic() { - return this; - } - - @Override - public ChunkCoordinates getCoordinates() { - return this.getBaseMetaTileEntity() - .getCoords(); - } - - // endregion - - // region IBeeHousingInventory - @Override - public ItemStack getQueen() { - return getStackInSlot(queen); - } - - @Override - public ItemStack getDrone() { - return getStackInSlot(drone); - } - - @Override - public void setQueen(ItemStack itemStack) { - setInventorySlotContents(queen, itemStack); - } - - @Override - public void setDrone(ItemStack itemStack) { - setInventorySlotContents(drone, itemStack); - } - - @Override - public boolean addProduct(ItemStack itemStack, boolean b) { - throw new RuntimeException("Should not happen :F"); - } - // endregion - - // region IErrorLogic - - public HashSet mErrorStates = new HashSet<>(); - - @Override - public boolean setCondition(boolean b, IErrorState iErrorState) { - if (b) mErrorStates.add(iErrorState); - else mErrorStates.remove(iErrorState); - return b; - } - - @Override - public boolean contains(IErrorState iErrorState) { - return mErrorStates.contains(iErrorState); - } - - @Override - public boolean hasErrors() { - return !mErrorStates.isEmpty(); - } - - @Override - public void clearErrors() { - mErrorStates.clear(); - } - - @Override - public void writeData(DataOutputStream dataOutputStream) throws IOException { - dataOutputStream.write(mErrorStates.size()); - for (IErrorState s : mErrorStates) dataOutputStream.writeUTF(s.getUniqueName()); - } - - @Override - public void readData(DataInputStream dataInputStream) throws IOException { - for (int i = dataInputStream.readInt(); i > 0; i--) - mErrorStates.add(ForestryAPI.errorStateRegistry.getErrorState(dataInputStream.readUTF())); - } - - @Override - public ImmutableSet getErrorStates() { - return ImmutableSet.copyOf(mErrorStates); - } - - private String flowerType = ""; - private ChunkCoordinates flowercoords = null; - private Block flowerBlock; - private int flowerBlockMeta; - - private boolean checkFlower(IBee bee) { - final String flowerType = bee.getGenome() - .getFlowerProvider() - .getFlowerType(); - if (!this.flowerType.equals(flowerType)) flowercoords = null; - if (flowercoords != null) { - if (getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ) != flowerBlock - || getWorld().getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ) - != flowerBlockMeta) - if (!FlowerManager.flowerRegistry - .isAcceptedFlower(flowerType, getWorld(), flowercoords.posX, flowercoords.posY, flowercoords.posZ)) - flowercoords = null; - else { - flowerBlock = getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ); - flowerBlockMeta = getWorld() - .getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ); - } - } - if (flowercoords == null) { - flowercoords = FlowerManager.flowerRegistry.getAcceptedFlowerCoordinates(this, bee, flowerType); - if (flowercoords != null) { - flowerBlock = getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ); - flowerBlockMeta = getWorld().getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ); - this.flowerType = flowerType; - } - } - return flowercoords != null; - } - - private boolean canWork(ItemStack queen) { - clearErrors(); - if (queen == null) return true; // Reloaded the chunk ? - if (beeRoot.isMember(queen, EnumBeeType.PRINCESS.ordinal())) return true; - final IBee bee = beeRoot.getMember(queen); - for (IErrorState err : bee.getCanWork(this)) setCondition(true, err); - setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER); - return !hasErrors(); - } - - private boolean canWork() { - clearErrors(); - final EnumBeeType beeType = beeRoot.getType(getQueen()); - if (beeType == EnumBeeType.PRINCESS) { - setCondition(!beeRoot.isDrone(getDrone()), EnumErrorCode.NO_DRONE); - return !hasErrors(); - } - if (beeType == EnumBeeType.QUEEN) { - final IBee bee = beeRoot.getMember(getQueen()); - for (IErrorState err : bee.getCanWork(this)) setCondition(true, err); - setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER); - return !hasErrors(); - } else { - setCondition(true, EnumErrorCode.NO_QUEEN); - return false; - } - } - - // endregion - - // region IBeeModifier - - private float terrorityMod = 1f; - private float mutationMod = 1f; - private float lifespanMod = 1f; - private float productionMod = 2f; - private float floweringMod = 1f; - private float geneticDecayMod = 1f; - private float energyMod = 1f; - private boolean sealedMod = false; - private boolean selfLightedMod = false; - private boolean selfUnlightedMod = false; - private boolean sunlightSimulatedMod = false; - private BiomeGenBase biomeOverride = null; - private float humidityMod = 0f; - private float temperatureMod = 0f; - private boolean isAutomated = false; - private boolean isRetrievingPollen = false; - private int maxspeed = 0; - - public void updateModifiers() { - final GT_ApiaryModifier mods = new GT_ApiaryModifier(); - for (int i = 0; i < upgradeSlotCount; i++) { - final ItemStack s = getStackInSlot(upgradeSlot + i); - if (s == null) continue; - if (GT_ApiaryUpgrade.isUpgrade(s)) { - final GT_ApiaryUpgrade upgrade = GT_ApiaryUpgrade.getUpgrade(s); - upgrade.applyModifiers(mods, s); - } - } - - terrorityMod = mods.territory; - mutationMod = mods.mutation; - lifespanMod = mods.lifespan; - productionMod = mods.production; - floweringMod = mods.flowering; - geneticDecayMod = mods.geneticDecay; - energyMod = mods.energy; - sealedMod = mods.isSealed; - selfLightedMod = mods.isSelfLighted; - selfUnlightedMod = mods.isSelfUnlighted; - sunlightSimulatedMod = mods.isSunlightSimulated; - biomeOverride = mods.biomeOverride; - humidityMod = mods.humidity; - temperatureMod = mods.temperature; - isAutomated = mods.isAutomated; - isRetrievingPollen = mods.isCollectingPollen; - maxspeed = mods.maxSpeed; - - if (mLockedSpeed) mSpeed = maxspeed; - else mSpeed = Math.min(mSpeed, maxspeed); - } - - /** Tries to move as much of [stack] into a possible upgrade slot */ - public void addUpgrade(ItemStack stack) { - if (stack == null || !GT_ApiaryUpgrade.isUpgrade(stack)) return; - - int amount = stack.stackSize; - for (int i = upgradeSlot; i < upgradeSlot + upgradeSlotCount; i++) { - if (!isItemValidForSlot(i, stack)) continue; - - int maxStackSize = GT_ApiaryUpgrade.getUpgrade(stack) - .getMaxNumber(); - ItemStack stackInSlot = getStackInSlot(i); - - // Push into empty slot - if (stackInSlot == null) { - amount = Math.min(amount, maxStackSize); - setInventorySlotContents(i, stack.splitStack(amount)); - return; - } - - if (!GT_Utility.areStacksEqual(stack, stackInSlot)) continue; - amount = Math.max(Math.min(amount, maxStackSize - stackInSlot.stackSize), 0); - if (amount == 0) return; - stackInSlot.stackSize += amount; - stack.stackSize -= amount; - return; - } - } - - /** Returns installed upgrade in slot 0 <= [index] < getMaxUpgradeCount() */ - public ItemStack getUpgrade(int index) { - if (index < 0 || index >= upgradeSlotCount) return null; - return getStackInSlot(upgradeSlot + index); - } - - /** Tries to remove [amount] or less of the upgrade installed in slot [index]. Returns the removed ItemStack */ - public ItemStack removeUpgrade(int index, int amount) { - if (index < 0 || index >= upgradeSlotCount || amount <= 0) return null; - - ItemStack stackInSlot = getUpgrade(index); - if (stackInSlot == null) return null; - - amount = Math.min(amount, stackInSlot.stackSize); - ItemStack result = stackInSlot.splitStack(amount); - if (stackInSlot.stackSize <= 0) setInventorySlotContents(upgradeSlot + index, null); - return result; - } - - public static int getMaxUpgradeCount() { - return upgradeSlotCount; - } - - @Override - public float getTerritoryModifier(IBeeGenome iBeeGenome, float v) { - return Math.min(5, terrorityMod); - } - - @Override - public float getMutationModifier(IBeeGenome iBeeGenome, IBeeGenome iBeeGenome1, float v) { - return mutationMod; - } - - @Override - public float getLifespanModifier(IBeeGenome iBeeGenome, IBeeGenome iBeeGenome1, float v) { - return lifespanMod; - } - - @Override - public float getProductionModifier(IBeeGenome iBeeGenome, float v) { - return productionMod; - } - - @Override - public float getFloweringModifier(IBeeGenome iBeeGenome, float v) { - return floweringMod; - } - - @Override - public float getGeneticDecay(IBeeGenome iBeeGenome, float v) { - return geneticDecayMod; - } - - public float getEnergyModifier() { - return energyMod; - } - - @Override - public boolean isSealed() { - return sealedMod; - } - - @Override - public boolean isSelfLighted() { - return selfLightedMod; - } - - @Override - public boolean isSelfUnlighted() { - return selfUnlightedMod; - } - - @Override - public boolean isSunlightSimulated() { - return sunlightSimulatedMod; - } - - @Override - public boolean isHellish() { - return getBiome() == BiomeGenBase.hell; - } - - public int getMaxSpeed() { - return maxspeed; - } - - // endregion - - // region IBeeListener - - @Override - public void wearOutEquipment(int i) {} - - @Override - public void onQueenDeath() {} - - @Override - public boolean onPollenRetrieved(IIndividual iIndividual) { - return false; - } - - // endregion - - static final IBeekeepingLogic dummylogic = new IBeekeepingLogic() { - - @Override - public boolean canWork() { - return true; - } - - @Override - public void doWork() {} - - @Override - public void syncToClient() {} - - @Override - public void syncToClient(EntityPlayerMP entityPlayerMP) {} - - @Override - public int getBeeProgressPercent() { - return 0; - } - - @Override - public boolean canDoBeeFX() { - return false; - } - - @Override - public void doBeeFX() {} - - @Override - public void readFromNBT(NBTTagCompound nbtTagCompound) {} - - @Override - public void writeToNBT(NBTTagCompound nbtTagCompound) {} - }; - - private static final String POWER_SOURCE_POWER = "GT5U.machines.powersource.power", - CANCEL_PROCESS_TOOLTIP = "GT5U.machines.industrialapiary.cancel.tooltip", - SPEED_TOOLTIP = "GT5U.machines.industrialapiary.speed.tooltip", - SPEED_LOCKED_TOOLTIP = "GT5U.machines.industrialapiary.speedlocked.tooltip", - INFO_TOOLTIP = "GT5U.machines.industrialapiary.info.tooltip", - INFO_WITH_BEE_TOOLTIP = "GT5U.machines.industrialapiary.infoextended.tooltip", - UPGRADE_TOOLTIP = "GT5U.machines.industrialapiary.upgradeslot.tooltip", - AUTOQUEEN_TOOLTIP = "GT5U.machines.industrialapiary.autoqueen.tooltip"; - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder - .widget( - new SlotWidget(new ApiarySlot(inventoryHandler, queen)) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_BEE_QUEEN) - .setPos(36, 21)) - .widget( - new SlotWidget(new ApiarySlot(inventoryHandler, drone)) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_BEE_DRONE) - .setPos(36, 41)) - .widget( - SlotGroup.ofItemHandler(inventoryHandler, 2) - .startFromSlot(7) - .endAtSlot(10) - .slotCreator(i -> new ApiarySlot(inventoryHandler, i)) - .applyForWidget( - widget -> widget.setGTTooltip(() -> mTooltipCache.getData(UPGRADE_TOOLTIP)) - .setTooltipShowUpDelay(TOOLTIP_DELAY)) - .build() - .setPos(61, 23)); - - super.addUIWidgets(builder, buildContext); - - builder.widget( - new ButtonWidget().setOnClick((clickData, widget) -> cancelProcess()) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_CROSS) - .setGTTooltip(() -> mTooltipCache.getData(CANCEL_PROCESS_TOOLTIP)) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(7, 26) - .setSize(18, 18)) - .widget( - new CycleButtonWidget().setToggle(() -> mAutoQueen, x -> mAutoQueen = x) - .setTextureGetter( - i -> i == 0 ? GT_UITextures.OVERLAY_BUTTON_CROSS : GT_UITextures.OVERLAY_BUTTON_CHECKMARK) - .setGTTooltip(() -> mTooltipCache.getData(AUTOQUEEN_TOOLTIP)) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(7, 44) - .setSize(18, 18) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_SLOT_BEE_QUEEN)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_INFORMATION) - .setGTTooltip(() -> { - final String energyreq = GT_Utility.formatNumbers( - (int) ((float) GT_MetaTileEntity_IndustrialApiary.baseEUtUsage * getEnergyModifier() - * getAcceleration()) + getAdditionalEnergyUsage()); - final String Temp = StatCollector.translateToLocal(getTemperature().getName()); - final String Hum = StatCollector.translateToLocal(getHumidity().getName()); - if (getUsedQueen() != null - && BeeManager.beeRoot.isMember(getUsedQueen(), EnumBeeType.QUEEN.ordinal())) { - final IBee bee = BeeManager.beeRoot.getMember(getUsedQueen()); - if (bee.isAnalyzed()) { - final IBeeGenome genome = bee.getGenome(); - final IBeeModifier mod = BeeManager.beeRoot.getBeekeepingMode(getWorld()) - .getBeeModifier(); - final float tmod = getTerritoryModifier(null, 1f) * mod.getTerritoryModifier(null, 1f); - final int[] t = Arrays.stream(genome.getTerritory()) - .map(i -> (int) ((float) i * tmod)) - .toArray(); - return mTooltipCache.getUncachedTooltipData( - INFO_WITH_BEE_TOOLTIP, - energyreq, - Temp, - Hum, - genome.getSpeed(), - getProductionModifier(null, 0f) + mod.getProductionModifier(null, 0f), - Math.round( - getFloweringModifier(null, 1f) * genome.getFlowering() - * mod.getFloweringModifier(null, 1f)), - Math.round( - getLifespanModifier(null, null, 1f) * genome.getLifespan() - * mod.getLifespanModifier(null, null, 1f)), - t[0], - t[1], - t[2]); - } - } - return mTooltipCache.getUncachedTooltipData(INFO_TOOLTIP, energyreq, Temp, Hum); - }) - .attachSyncer( - new FakeSyncWidget.ItemStackSyncer(() -> usedQueen, val -> usedQueen = val), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .setPos(163, 5) - .setSize(7, 18)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (clickData.mouseButton == 0) { - if (mLockedSpeed) return; - if (!clickData.shift) { - mSpeed++; - if (mSpeed > getMaxSpeed()) mSpeed = 0; - } else { - mSpeed--; - if (mSpeed < 0) mSpeed = getMaxSpeed(); - } - } else if (clickData.mouseButton == 1) { - mLockedSpeed = !mLockedSpeed; - if (mLockedSpeed) mSpeed = getMaxSpeed(); - } - }) - .setGTTooltip( - () -> mTooltipCache.getUncachedTooltipData( - mLockedSpeed ? SPEED_LOCKED_TOOLTIP : SPEED_TOOLTIP, - getAcceleration(), - GT_Utility.formatNumbers(getAdditionalEnergyUsage()))) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer(() -> mSpeed, val -> mSpeed = val), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer(() -> mLockedSpeed, val -> mLockedSpeed = val), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setBackground(GT_UITextures.PICTURE_SQUARE_LIGHT_GRAY) - .setPos(25, 62) - .setSize(18, 18)) - .widget( - new TextWidget("x").setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(30, 63)) - .widget( - TextWidget.dynamicString(() -> String.valueOf(1 << mSpeed)) - // mSpeed is already synced - .setSynced(false) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setPos(26, 72)); - } - - private static final FallbackableUITexture progressBarTexture = GT_UITextures - .fallbackableProgressbar("iapiary", GT_UITextures.PROGRESSBAR_ARROW); - - @Override - protected BasicUIProperties getUIProperties() { - return super.getUIProperties().toBuilder() - .progressBarTexture(progressBarTexture) - .progressBarPos(new Pos2d(70, 3)) - .build(); - } - - @Override - protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) { - // we have custom input slots - return null; - } - - @Override - protected CycleButtonWidget createItemAutoOutputButton() { - return (CycleButtonWidget) super.createItemAutoOutputButton().setPos(7, 62); - } - - @Override - protected CycleButtonWidget createFluidAutoOutputButton() { - return null; - } - - @Override - protected SlotWidget createChargerSlot(int x, int y, String tooltipKey, Object[] tooltipArgs) { - return (SlotWidget) super.createChargerSlot(x, y, tooltipKey, tooltipArgs).setPos(79, 62); - } - - @Override - protected DrawableWidget createErrorStatusArea(ModularWindow.Builder builder, IDrawable picture) { - return (DrawableWidget) super.createErrorStatusArea(builder, picture).setPos(100, 62) - .attachSyncer( - new FakeSyncWidget.ListSyncer<>(() -> Arrays.asList(mErrorStates.toArray(new IErrorState[0])), val -> { - mErrorStates.clear(); - mErrorStates.addAll(new HashSet<>(val)); - }, - (buffer, val) -> buffer.writeShort(val.getID()), - buffer -> ForestryAPI.errorStateRegistry.getErrorState(buffer.readShort())), - builder, - (widget, val) -> widget.notifyTooltipChange()); - } - - @Override - protected List getErrorDescriptions() { - if (!mErrorStates.isEmpty()) { - return mErrorStates.stream() - .map(state -> EnumChatFormatting.RED + StatCollector.translateToLocal("for." + state.getDescription())) - .collect(Collectors.toList()); - } else if (mStuttering) { - return mTooltipCache - .getData(STALLED_STUTTERING_TOOLTIP, StatCollector.translateToLocal(POWER_SOURCE_POWER)).text; - } else { - return Collections.emptyList(); - } - } - - @Override - protected List getErrorDescriptionsShift() { - // Don't show shift tooltip of "Progress was lost" - // as this machine does not lose progress - return getErrorDescriptions(); - } - - private int getAcceleration() { - return 1 << mSpeed; - } - - private int getAdditionalEnergyUsage() { - final int accelerated = getAcceleration(); - int energyusage = 0; - if (accelerated == 2) energyusage = 32; - else if (accelerated > 2) energyusage = 32 * accelerated << (mSpeed - 2); - return energyusage; - } - - private class ApiarySlot extends BaseSlot { - - public ApiarySlot(IItemHandlerModifiable inventory, int index) { - super(inventory, index); - } - - @Override - public boolean isItemValidPhantom(ItemStack stack) { - return super.isItemValidPhantom(stack) && getBaseMetaTileEntity().isItemValidForSlot(getSlotIndex(), stack); - } - - @Override - public void onSlotChanged() { - super.onSlotChanged(); - onInventoryUpdate(getSlotIndex()); - } - } - - private static final UIInfo IndustrialApiaryUI = GT_UIInfos.GTTileEntityUIFactory - .apply(GT_ModularUIContainer_IndustrialApiary::new); - - private static class GT_ModularUIContainer_IndustrialApiary extends ModularUIContainer { - - public GT_ModularUIContainer_IndustrialApiary(ModularUIContext context, ModularWindow mainWindow) { - super(context, mainWindow); - } - - private final int playerInventorySlot = 36; - - @Override - public ItemStack slotClick(int aSlotNumber, int aMouseclick, int aShifthold, EntityPlayer aPlayer) { - if (!(aSlotNumber >= playerInventorySlot + 2 && aSlotNumber < playerInventorySlot + 2 + 4)) - return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - if (aShifthold == 5) return null; - if (aShifthold != 0) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - if (aMouseclick > 1) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - final ItemStack s = aPlayer.inventory.getItemStack(); - if (s == null) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - final Slot slot = getSlot(aSlotNumber); - final ItemStack slotStack = slot.getStack(); - if (slotStack != null && !GT_Utility.areStacksEqual(slotStack, s)) return null; // super would replace item - if (slotStack == null && !slot.isItemValid(s)) - return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - if (!GT_ApiaryUpgrade.isUpgrade(s)) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - int max = GT_ApiaryUpgrade.getUpgrade(s) - .getMaxNumber(); - if (slotStack != null) max = Math.max(0, max - slotStack.stackSize); - max = Math.min(max, s.stackSize); - if (max == 0) return null; - if (aMouseclick == 1) max = 1; - if (max == s.stackSize) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - final ItemStack newStack = s.splitStack(s.stackSize - max); - final ItemStack result = super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - aPlayer.inventory.setItemStack(newStack); - return result; - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer aPlayer, int aSlotIndex) { - final Slot s = getSlot(aSlotIndex); - if (s == null) return super.transferStackInSlot(aPlayer, aSlotIndex); - if (aSlotIndex >= playerInventorySlot) return super.transferStackInSlot(aPlayer, aSlotIndex); - final ItemStack aStack = s.getStack(); - if (aStack == null) return super.transferStackInSlot(aPlayer, aSlotIndex); - if (!GT_ApiaryUpgrade.isUpgrade(aStack)) return super.transferStackInSlot(aPlayer, aSlotIndex); - for (int i = playerInventorySlot + 2; i < playerInventorySlot + 2 + 4; i++) { - final Slot iSlot = getSlot(i); - final ItemStack iStack = iSlot.getStack(); - if (iStack == null) { - if (!iSlot.isItemValid(aStack)) continue; - } else { - if (!GT_Utility.areStacksEqual(aStack, iStack)) continue; - } - int max = GT_ApiaryUpgrade.getUpgrade(aStack) - .getMaxNumber(); - if (iStack == null) { - max = Math.min(max, aStack.stackSize); - final ItemStack newstack = aStack.splitStack(max); - iSlot.putStack(newstack); - } else { - max = Math.max(0, max - iStack.stackSize); - max = Math.min(max, aStack.stackSize); - iStack.stackSize += max; - aStack.stackSize -= max; - iSlot.onSlotChanged(); - } - if (aStack.stackSize == 0) s.putStack(null); - else s.onSlotChanged(); - break; - } - return null; - } - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currenttip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - if (tag.hasKey("queen")) { - currenttip.add( - "Current Queen: " + EnumChatFormatting.GREEN + StatCollector.translateToLocal(tag.getString("queen"))); - } - if (tag.hasKey("dummyProduction")) { - currenttip.add( - "Effective Production: " + EnumChatFormatting.AQUA - + String.format("b^0.52 * %.2f", tag.getFloat("dummyProduction"))); - } - if (tag.hasKey("errors")) { - NBTTagCompound errorNbt = tag.getCompoundTag("errors"); - for (int i = 0; i < errorNbt.getInteger("size"); i++) { - currenttip.add( - "Error: " + EnumChatFormatting.RED - + StatCollector.translateToLocal("for." + errorNbt.getString("e" + i))); - } - } - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - if (usedQueen != null) { - IBeeGenome genome = beeRoot.getMember(usedQueen) - .getGenome(); - tag.setString( - "queen", - genome.getPrimary() - .getUnlocalizedName()); - float prodModifier = getProductionModifier(genome, 0f); - prodModifier += beeRoot.getBeekeepingMode(world) - .getBeeModifier() - .getProductionModifier(genome, prodModifier); - float dummyProduction = 100f * Bee.getFinalChance(0.01f, genome.getSpeed(), prodModifier, 8f); - tag.setFloat("dummyProduction", dummyProduction); - } - if (hasErrors()) { - NBTTagCompound errorNbt = new NBTTagCompound(); - int errorCounter = 0; - for (IErrorState error : mErrorStates) { - errorNbt.setString("e" + errorCounter++, error.getDescription()); - } - errorNbt.setInteger("size", errorCounter); - tag.setTag("errors", errorNbt); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java deleted file mode 100644 index 7eaa8122c1..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java +++ /dev/null @@ -1,241 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_GLOW; - -import java.util.Arrays; - -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraftforge.fluids.FluidStack; - -import com.google.common.primitives.Ints; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.MachineType; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.objects.overclockdescriber.EUOverclockDescriber; -import gregtech.api.objects.overclockdescriber.OverclockDescriber; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.MethodsReturnNonnullByDefault; -import gregtech.common.config.machinestats.ConfigMassFabricator; - -public class GT_MetaTileEntity_Massfabricator extends GT_MetaTileEntity_BasicMachine { - - public static int sUUAperUUM = 1; - public static int sUUASpeedBonus = 4; - public static int sDurationMultiplier = 3215; - public static boolean sRequiresUUA = false; - public static int BASE_EUT = 256; - public static GT_Recipe nonUUARecipe; - public static GT_Recipe uuaRecipe; - - public GT_MetaTileEntity_Massfabricator(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 8, - MachineType.MATTER_FABRICATOR.tooltipDescription(), - 1, - 1, - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_MASSFAB_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_MASSFAB), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_MASSFAB_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_MASSFAB_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_MASSFAB), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MASSFAB_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_MASSFAB_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_MASSFAB_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_MASSFAB), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_MASSFAB_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_MASSFAB_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_MASSFAB), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_MASSFAB_GLOW) - .glow() - .build())); - } - - public GT_MetaTileEntity_Massfabricator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 8, aDescription, aTextures, 1, 1); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Massfabricator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public boolean allowSelectCircuit() { - return true; - } - - @Override - protected OverclockDescriber createOverclockDescriber() { - return new MassfabricatorOverclockDescriber(mTier, mAmperage); - } - - @Override - public void onConfigLoad() { - super.onConfigLoad(); - sDurationMultiplier = ConfigMassFabricator.durationMultiplier; - sUUAperUUM = ConfigMassFabricator.UUAPerUUM; - sUUASpeedBonus = ConfigMassFabricator.UUASpeedBonus; - sRequiresUUA = ConfigMassFabricator.requiresUUA; - Materials.UUAmplifier.mChemicalFormula = ("Mass Fabricator Eff/Speed Bonus: x" + sUUASpeedBonus); - } - - @Override - public long maxAmperesIn() { - return 10; - } - - @Override - public long maxEUStore() { - return V[mTier] * 512L; - } - - @Override - public int checkRecipe() { - FluidStack tFluid = getDrainableStack(); - if ((tFluid == null) || (tFluid.amount < getCapacity())) { - this.mOutputFluid = Materials.UUMatter.getFluid(1L); - calculateCustomOverclock(containsUUA(getFillableStack()) ? uuaRecipe : nonUUARecipe); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - if (containsUUA(tFluid = getFillableStack())) { - tFluid.amount -= sUUAperUUM; - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - return sRequiresUUA || Arrays.stream(getAllInputs()) - .anyMatch(s -> ItemList.Circuit_Integrated.isStackEqual(s, true, true)) - ? FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS - : FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - return DID_NOT_FIND_RECIPE; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.massFabFakeRecipes; - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return aFluid.isFluidEqual(Materials.UUAmplifier.getFluid(1L)); - } - - @Override - public int getCapacity() { - return Math.max(sUUAperUUM, 1000); - } - - private boolean containsUUA(FluidStack aFluid) { - return aFluid != null && aFluid.amount >= sUUAperUUM && aFluid.isFluidEqual(Materials.UUAmplifier.getFluid(1L)); - } - - @ParametersAreNonnullByDefault - @MethodsReturnNonnullByDefault - protected class MassfabricatorOverclockDescriber extends EUOverclockDescriber { - - protected MassfabricatorOverclockDescriber(byte tier, int amperage) { - super(tier, amperage); - } - - @Override - public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) { - return super.createCalculator(template, recipe).setEUt(Ints.saturatedCast(V[tier] * amperage)) - .setEUtIncreasePerOC(2.0) - .limitOverclockCount(tier - 1) - .setOneTickDiscount(false); - } - - @Override - protected boolean shouldShowAmperage(GT_OverclockCalculator calculator) { - return true; - } - - @Override - protected String getVoltageString(GT_OverclockCalculator calculator) { - // standard amperage calculation doesn't work here - return decorateWithOverclockLabel(GT_Utility.formatNumbers(V[mTier]) + " EU/t", calculator) - + GT_Utility.getTierNameWithParentheses(V[mTier]); - } - - @Override - protected String getAmperageString(GT_OverclockCalculator calculator) { - int amperage = this.amperage; - int denominator = 1; - for (int i = 1; i < mTier; i++) { - amperage >>= 1; - if (amperage == 0) { - denominator <<= 1; - } - } - if (amperage > 0) { - return GT_Utility.formatNumbers(amperage); - } else { - return "1/" + denominator; - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java deleted file mode 100644 index 575e98c5c6..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java +++ /dev/null @@ -1,495 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW; - -import java.util.function.Consumer; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IEnergyConnected; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.common.config.machinestats.ConfigMicrowaveEnergyTransmitter; -import gregtech.common.config.machinestats.ConfigTeleporter; - -public class GT_MetaTileEntity_MicrowaveEnergyTransmitter extends GT_MetaTileEntity_BasicTank - implements IAddGregtechLogo, IAddUIWidgets { - - private static boolean sInterDimensionalTeleportAllowed = true; - private static int mMaxLoss = 50; - private static int mMaxLossDistance = 10000; - private static boolean mPassiveEnergyUse = true; - public int mTargetX = 0; - public int mTargetY = 0; - public int mTargetZ = 0; - public int mTargetD = 0; - public boolean mDebug = false; - public boolean hasBlock = false; - public int tTargetX = 0; - public int tTargetY = 0; - public int tTargetZ = 0; - public int tTargetD = 0; - public TileEntity tTile = null; - - public GT_MetaTileEntity_MicrowaveEnergyTransmitter(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 3, - new String[] { "Transmits Energy Wirelessly", "Use Nitrogen Plasma", "for Inter-dimensional transmission", - "0.004EU Loss per 100 Blocks" }); - } - - public GT_MetaTileEntity_MicrowaveEnergyTransmitter(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_MicrowaveEnergyTransmitter(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isClientSide()) return true; - this.hasBlock = checkForBlock(); - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MicrowaveEnergyTransmitter( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public String[] getInfoData() { - return new String[] { "Coordinates:", - "X: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetX) + EnumChatFormatting.RESET, - "Y: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetY) + EnumChatFormatting.RESET, - "Z: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetZ) + EnumChatFormatting.RESET, - "Dimension: " + EnumChatFormatting.GREEN + this.mTargetD + EnumChatFormatting.RESET, - "Dimension Valid: " + (GT_Utility.isRealDimension(this.mTargetD) - ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET - : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET), - "Dimension Registered: " + (DimensionManager.isDimensionRegistered(this.mTargetD) - ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET - : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET) }; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == ForgeDirection.DOWN) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; - if (aActive) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], - TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW) - .glow() - .build() }; - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER), - TextureFactory.builder() - .addIcon(OVERLAY_TELEPORTER_GLOW) - .glow() - .build() }; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); - aNBT.setInteger("mTargetX", this.mTargetX); - aNBT.setInteger("mTargetY", this.mTargetY); - aNBT.setInteger("mTargetZ", this.mTargetZ); - aNBT.setInteger("mTargetD", this.mTargetD); - aNBT.setBoolean("mDebug", this.mDebug); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid")); - this.mTargetX = aNBT.getInteger("mTargetX"); - this.mTargetY = aNBT.getInteger("mTargetY"); - this.mTargetZ = aNBT.getInteger("mTargetZ"); - this.mTargetD = aNBT.getInteger("mTargetD"); - this.mDebug = aNBT.getBoolean("mDebug"); - } - - @Override - public void onConfigLoad() { - sInterDimensionalTeleportAllowed = ConfigTeleporter.interDimensionalTPAllowed; - mMaxLoss = Math.max(ConfigMicrowaveEnergyTransmitter.maxLoss, 11); - mMaxLossDistance = ConfigMicrowaveEnergyTransmitter.maxLossDistance; - mPassiveEnergyUse = ConfigMicrowaveEnergyTransmitter.passiveEnergyUse; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - if (aBaseMetaTileEntity.isServerSide()) { - if ((this.mTargetX == 0) && (this.mTargetY == 0) && (this.mTargetZ == 0) && (this.mTargetD == 0)) { - this.mTargetX = aBaseMetaTileEntity.getXCoord(); - this.mTargetY = aBaseMetaTileEntity.getYCoord(); - this.mTargetZ = aBaseMetaTileEntity.getZCoord(); - this.mTargetD = aBaseMetaTileEntity.getWorld().provider.dimensionId; - } - this.hasBlock = checkForBlock(); - } - } - - public boolean checkForBlock() { - for (byte i = -5; i <= 5; i = (byte) (i + 1)) { - for (byte j = -5; j <= 5; j = (byte) (j + 1)) { - for (byte k = -5; k <= 5; k = (byte) (k + 1)) { - if (getBaseMetaTileEntity().getBlockOffset(i, j, k) == GregTech_API.sBlockMetal5 - && getBaseMetaTileEntity().getMetaIDOffset(i, j, k) == 8) { // require osmiridium block - return true; - } - } - } - } - return false; - } - - public boolean hasDimensionalTeleportCapability() { - return this.mDebug || (sInterDimensionalTeleportAllowed && (this.hasBlock - || mFluid != null && mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1)) && mFluid.amount >= 1000)); - } - - public boolean isDimensionalTeleportAvailable() { - return this.mDebug || (hasDimensionalTeleportCapability() && GT_Utility.isRealDimension(this.mTargetD) - && GT_Utility.isRealDimension(getBaseMetaTileEntity().getWorld().provider.dimensionId)); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (mFluid == null) { - mFluid = Materials.Nitrogen.getPlasma(0); - } - super.onPostTick(aBaseMetaTileEntity, aTick); - if (getBaseMetaTileEntity().isServerSide()) { - if (getBaseMetaTileEntity().getTimer() % 100L == 50L) { - this.hasBlock = checkForBlock(); - } - if ((getBaseMetaTileEntity().isAllowedToWork()) && (getBaseMetaTileEntity().getRedstone())) { - if (getBaseMetaTileEntity().getStoredEU() > (V[mTier] * 16)) { - if (mPassiveEnergyUse) { - getBaseMetaTileEntity().decreaseStoredEnergyUnits(2L << (mTier - 1), false); - } - if (hasDimensionalTeleportCapability() - && this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId - && mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1))) { - mFluid.amount--; - if (mFluid.amount < 1) { - mFluid = null; - } - } - if (tTargetD != mTargetD || tTargetX != mTargetX || tTargetY != mTargetY || tTargetZ != mTargetZ) { - tTargetD = mTargetD; - tTargetX = mTargetX; - tTargetY = mTargetY; - tTargetZ = mTargetZ; - if (this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) { - tTile = getBaseMetaTileEntity().getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); - } else { - World tWorld = DimensionManager.getWorld(this.mTargetD); - if (tWorld != null) { - tTile = tWorld.getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); - } - } - } - int tDistance = distanceCalculation(); - if (tTile != null) { - if (tTile instanceof IEnergyConnected) { - long packetSize = V[mTier]; - if (tTile instanceof IGregTechTileEntity) { - IMetaTileEntity mte = ((IGregTechTileEntity) tTile).getMetaTileEntity(); - if (mte instanceof BaseMetaTileEntity) { - packetSize = ((BaseMetaTileEntity) mte).getMaxSafeInput(); - } - } - long energyUse = 10; - if (mMaxLossDistance != 0) { - energyUse = GT_Utility - .safeInt(10L + (tDistance * Math.max(mMaxLoss - 10L, 0) / mMaxLossDistance)); - } - energyUse = packetSize + ((V[mTier] * energyUse) / 100); - if (getBaseMetaTileEntity().isUniversalEnergyStored(energyUse)) { - if (((IEnergyConnected) tTile).injectEnergyUnits(ForgeDirection.UNKNOWN, packetSize, 1) - > 0) { - getBaseMetaTileEntity().decreaseStoredEnergyUnits(energyUse, false); - } - } - } - } - } - getBaseMetaTileEntity().setActive(true); - } else { - getBaseMetaTileEntity().setActive(false); - } - } - } - - private int distanceCalculation() { - return Math.abs( - ((this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId) - && (isDimensionalTeleportAvailable()) ? 100 : 1) - * (int) Math.sqrt( - Math.pow(getBaseMetaTileEntity().getXCoord() - this.mTargetX, 2.0D) - + Math.pow(getBaseMetaTileEntity().getYCoord() - this.mTargetY, 2.0D) - + Math.pow(getBaseMetaTileEntity().getZCoord() - this.mTargetZ, 2.0D))); - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isOverclockerUpgradable() { - return false; - } - - @Override - public boolean isTransformerUpgradable() { - return false; - } - - @Override - public boolean isElectric() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return true; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return false; - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long getMinimumStoredEU() { - return V[mTier] * 16; - } - - @Override - public long maxEUStore() { - return V[mTier] * 256; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxSteamStore() { - return maxEUStore(); - } - - @Override - public long maxAmperesIn() { - return 3; - } - - @Override - public int getStackDisplaySlot() { - return 2; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public int getInputSlot() { - return 0; - } - - @Override - public int getOutputSlot() { - return 0; - } - - @Override - public int getCapacity() { - return 64000; - } - - @Override - public boolean doesFillContainers() { - return false; - } - - @Override - public boolean doesEmptyContainers() { - return false; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return false; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return null; - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setSize(90, 72) - .setPos(43, 4)) - .widget( - new TextWidget().setStringSupplier(() -> "X: " + numberFormat.format(mTargetX)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 8)) - .widget( - new TextWidget().setStringSupplier(() -> "Y: " + numberFormat.format(mTargetY)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 16)) - .widget( - new TextWidget().setStringSupplier(() -> "Z: " + numberFormat.format(mTargetZ)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 24)) - .widget( - new TextWidget().setStringSupplier(() -> "Dim: " + numberFormat.format(mTargetD)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 32)) - .widget( - TextWidget.dynamicString(() -> "Dim Valid: " + (GT_Utility.isRealDimension(mTargetD) ? "Yes" : "No")) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> hasDimensionalTeleportCapability()) - .setPos(46, 40)) - .widget(new FakeSyncWidget.FluidStackSyncer(() -> mFluid, val -> mFluid = val)); - - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151); - - addChangeNumberButton( - builder, - GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, - val -> mTargetD += val, - -16, - -8, - 7, - 58); - addChangeNumberButton( - builder, - GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, - val -> mTargetD += val, - -4, - -1, - 25, - 58); - addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> mTargetD += val, 4, 1, 133, 58); - addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> mTargetD += val, 16, 8, 151, 58); - } - - private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift, - int addNumber, int xPos) { - addChangeNumberButton(builder, overlay, val -> mTargetX += val, addNumberShift, addNumber, xPos, 4); - addChangeNumberButton(builder, overlay, val -> mTargetY += val, addNumberShift, addNumber, xPos, 22); - addChangeNumberButton(builder, overlay, val -> mTargetZ += val, addNumberShift, addNumber, xPos, 40); - } - - private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer setter, - int addNumberShift, int addNumber, int xPos, int yPos) { - builder.widget( - new ButtonWidget() - .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? addNumberShift : addNumber)) - .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) - .setSize(18, 18) - .setPos(xPos, yPos)); - } - - @Override - public GUITextureSet getGUITextureSet() { - return new GUITextureSet().setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY); - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(113, 56)); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java deleted file mode 100644 index b1ce994fb3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java +++ /dev/null @@ -1,407 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.GT_Values.debugBlockMiner; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.ChunkPosition; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; - -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.recipe.BasicUIProperties; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import gregtech.common.blocks.GT_TileEntity_Ores; -import gregtech.common.misc.GT_DrillingLogicDelegate; -import gregtech.common.misc.GT_IDrillingLogicDelegateOwner; - -public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine - implements GT_IDrillingLogicDelegateOwner, IAddUIWidgets { - - static final int[] RADIUS = { 8, 8, 16, 24, 32 }; // Miner radius per tier - static final int[] SPEED = { 160, 160, 80, 40, 20 }; // Miner cycle time per tier - static final int[] ENERGY = { 8, 8, 32, 128, 512 }; // Miner energy consumption per tier - - /** Miner configured radius */ - private int radiusConfig; - /** Found ore blocks cache of current drill depth */ - private final ArrayList oreBlockPositions = new ArrayList<>(); - - /** General pipe accessor */ - private final GT_DrillingLogicDelegate pipe = new GT_DrillingLogicDelegate(this); - - private final int mSpeed; - - public GT_MetaTileEntity_Miner(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, - new String[] { "Digging ore instead of you", "Use Screwdriver to regulate work area", - "Use Soft Mallet to disable and retract the pipe", - String.format("%d EU/t, %d sec per block, no stuttering", ENERGY[aTier], SPEED[aTier] / 20), - String.format("Maximum work area %dx%d", (RADIUS[aTier] * 2 + 1), (RADIUS[aTier] * 2 + 1)), - String.format("Fortune bonus of %d", aTier) }, - 2, - 2, - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_GLOW")) - .glow() - .build())); - mSpeed = SPEED[aTier]; - radiusConfig = RADIUS[mTier]; - } - - public GT_MetaTileEntity_Miner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, 2, 2); - mSpeed = SPEED[aTier]; - radiusConfig = RADIUS[mTier]; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Miner(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - pipe.findTipDepth(); - fillOreList(aBaseMetaTileEntity); - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) // - && aStack.getItem() == GT_DrillingLogicDelegate.MINING_PIPE_STACK.getItem(); - } - - /** Both output slots must be free to work */ - public boolean hasFreeSpace() { - for (int i = getOutputSlot(); i < getOutputSlot() + 2; i++) { - if (mInventory[i] != null) { - return false; - } - } - return true; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); - if (side != getBaseMetaTileEntity().getFrontFacing() && side != mMainFacing) { - if (aPlayer.isSneaking()) { - if (radiusConfig >= 0) { - radiusConfig--; - } - if (radiusConfig < 0) { - radiusConfig = RADIUS[mTier]; - } - } else { - if (radiusConfig <= RADIUS[mTier]) { - radiusConfig++; - } - if (radiusConfig > RADIUS[mTier]) { - radiusConfig = 0; - } - } - - GT_Utility.sendChatToPlayer( - aPlayer, - String.format( - "%s %dx%d", - StatCollector.translateToLocal("GT5U.machines.workareaset"), - (radiusConfig * 2 + 1), - (radiusConfig * 2 + 1))); - - // Rebuild ore cache after change config - fillOreList(getBaseMetaTileEntity()); - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - - if (!aBaseMetaTileEntity.isServerSide()) { - return; - } - - // Pipe workaround - pipe.onOwnerPostTick(aBaseMetaTileEntity, aTick); - - if (!aBaseMetaTileEntity.isAllowedToWork()) { - mMaxProgresstime = 0; - if (debugBlockMiner) { - GT_Log.out.println("MINER: Disabled"); - } - return; - } - - if (!hasFreeSpace()) { - mMaxProgresstime = 0; - if (debugBlockMiner) { - GT_Log.out.println("MINER: No free space"); - } - return; - } - - if (!aBaseMetaTileEntity.isUniversalEnergyStored((long) ENERGY[mTier] * (mSpeed - mProgresstime))) { - mMaxProgresstime = 0; - if (debugBlockMiner) { - GT_Log.out.println( - "MINER: Not enough energy yet, want " + (ENERGY[mTier] * mSpeed) - + " have " - + aBaseMetaTileEntity.getUniversalEnergyStored()); - } - return; - } - - /* Checks if machine are waiting new mining pipe item */ - if (!pipe.canContinueDrilling(aTick)) { - mMaxProgresstime = 0; - return; - } - - mMaxProgresstime = mSpeed; - - aBaseMetaTileEntity.decreaseStoredEnergyUnits(ENERGY[mTier], true); - - // Real working only when progress done. TODO some legacy code... refactorings needed - if (mProgresstime == mSpeed - 1) { - if (pipe.getTipDepth() == 0 || oreBlockPositions.isEmpty()) { - boolean descends = pipe.descent(aBaseMetaTileEntity); - if (descends) { - fillOreList(aBaseMetaTileEntity); - } - } else { - int x; - int y; - int z; - Block oreBlock; - boolean isOre; - do { - ChunkPosition oreBlockPos = oreBlockPositions.remove(0); - oreBlock = aBaseMetaTileEntity - .getBlockOffset(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ); - x = aBaseMetaTileEntity.getXCoord() + oreBlockPos.chunkPosX; - y = aBaseMetaTileEntity.getYCoord() + oreBlockPos.chunkPosY; - z = aBaseMetaTileEntity.getZCoord() + oreBlockPos.chunkPosZ; - isOre = GT_Utility.isOre( - oreBlock, - aBaseMetaTileEntity.getWorld() - .getBlockMetadata(x, y, z)); - } // someone else might have removed the block - while (!isOre && !oreBlockPositions.isEmpty()); - - if (isOre) { - pipe.mineBlock(aBaseMetaTileEntity, oreBlock, x, y, z); - } - } - } - } - - /** Finds the ores in current drill Y level */ - private void fillOreList(IGregTechTileEntity aBaseMetaTileEntity) { - if (pipe.getTipDepth() == 0) { - return; - } - oreBlockPositions.clear(); - for (int z = -radiusConfig; z <= radiusConfig; ++z) { - for (int x = -radiusConfig; x <= radiusConfig; ++x) { - Block block = aBaseMetaTileEntity.getBlockOffset(x, pipe.getTipDepth(), z); - int blockMeta = aBaseMetaTileEntity.getMetaIDOffset(x, pipe.getTipDepth(), z); - - // todo some weird checks. refactorings needed - if (block instanceof GT_Block_Ores_Abstract) { - TileEntity oreEntity = aBaseMetaTileEntity.getTileEntityOffset(x, pipe.getTipDepth(), z); - if (oreEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) oreEntity).mNatural) { - oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z)); - } - } else if (GT_Utility.isOre(block, blockMeta)) { - oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z)); - } - } - } - } - - /** Pulls (or check can pull) items from an input slots. */ - @Override - public boolean pullInputs(Item item, int count, boolean simulate) { - for (int i = 0; i < mInputSlotCount; i++) { - ItemStack stack = getInputAt(i); - if (stack != null && stack.getItem() == item && stack.stackSize >= count) { - if (simulate) { - return true; - } - stack.stackSize -= count; - if (stack.stackSize == 0) { - mInventory[getInputSlot() + i] = null; - } - return true; - } - } - return false; - } - - /** Pushes (or check can push) item to output slots. */ - @Override - public boolean pushOutputs(ItemStack stack, int count, boolean simulate, boolean allowInputSlots) { - return allowInputSlots && pushOutput(getInputSlot(), getInputSlot() + mInputSlotCount, stack, count, simulate) - || pushOutput(getOutputSlot(), getOutputSlot() + mOutputItems.length, stack, count, simulate); - } - - private boolean pushOutput(int startIndex, int endIndex, ItemStack stack, int count, boolean simulate) { - for (int i = startIndex; i < endIndex; i++) { - ItemStack slot = mInventory[i]; - if (slot == null || slot.stackSize == 0) { - if (!simulate) { - ItemStack copy = stack.copy(); - copy.stackSize = count; - mInventory[i] = copy; - } - return true; - } else if (GT_Utility.areStacksEqual(slot, stack) && slot.stackSize <= slot.getMaxStackSize() - count) { - if (!simulate) { - slot.stackSize += count; - } - return true; - } - } - return false; - } - - @Override - public long maxEUStore() { - return Math.max(V[mTier] * 64, 4096); - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - super.setItemNBT(aNBT); - aNBT.setInteger("radiusConfig", radiusConfig); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("radiusConfig", radiusConfig); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("radiusConfig")) { - int newRadius = aNBT.getInteger("radiusConfig"); - if (RADIUS[mTier] <= newRadius && newRadius > 0) { - radiusConfig = newRadius; - } - } - } - - @Override - public String[] getInfoData() { - return new String[] { - String.format( - "%s%s%s", - EnumChatFormatting.BLUE, - StatCollector.translateToLocal("GT5U.machines.miner"), - EnumChatFormatting.RESET), - String.format( - "%s: %s%d%s %s", - StatCollector.translateToLocal("GT5U.machines.workarea"), - EnumChatFormatting.GREEN, - (radiusConfig * 2 + 1), - EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.machines.blocks")) }; - } - - @Override - public int getMachineTier() { - return mTier; - } - - @Override - public int getMachineSpeed() { - return mSpeed; - } - - public GT_DrillingLogicDelegate getPipe() { - return pipe; - } - - private static final FallbackableUITexture progressBarTexture = GT_UITextures - .fallbackableProgressbar("miner", GT_UITextures.PROGRESSBAR_CANNER); - - @Override - protected BasicUIProperties getUIProperties() { - return super.getUIProperties().toBuilder() - .progressBarTexture(progressBarTexture) - .build(); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java deleted file mode 100644 index fde78cfa2e..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java +++ /dev/null @@ -1,182 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW; - -import java.util.Arrays; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_SpawnEventHandler; - -public class GT_MetaTileEntity_MonsterRepellent extends GT_MetaTileEntity_TieredMachineBlock { - - public int mRange = 16; - - public GT_MetaTileEntity_MonsterRepellent(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 0, - "Repels nasty Creatures. Range: " + (4 + (12 * aTier)) - + " unpowered / " - + (16 + (48 * aTier)) - + " powered. Costs " - + (1L << (aTier * 2)) - + " EU/t"); - } - - public GT_MetaTileEntity_MonsterRepellent(String aName, int aTier, int aInvSlotCount, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - public GT_MetaTileEntity_MonsterRepellent(String aName, int aTier, int aInvSlotCount, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aInvSlotCount, aDescription, aTextures); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MonsterRepellent( - this.mName, - this.mTier, - this.mInventory.length, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection != ForgeDirection.UP) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; - if (active) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], - TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW) - .glow() - .build() }; - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER), - TextureFactory.builder() - .addIcon(OVERLAY_TELEPORTER_GLOW) - .glow() - .build() }; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - if (aBaseMetaTileEntity.isAllowedToWork() && aBaseMetaTileEntity.isServerSide()) { - int[] tCoords = { aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(), - aBaseMetaTileEntity.getZCoord(), aBaseMetaTileEntity.getWorld().provider.dimensionId }; - if ((aTimer % 600 == 0) && !GT_SpawnEventHandler.mobReps.contains(tCoords)) { - GT_SpawnEventHandler.mobReps.add(tCoords); - } - if (aBaseMetaTileEntity.isUniversalEnergyStored(getMinimumStoredEU()) - && aBaseMetaTileEntity.decreaseStoredEnergyUnits(1L << (this.mTier * 2), false)) { - mRange = GT_SpawnEventHandler.getPoweredRepellentRange(mTier); - } else { - mRange = GT_SpawnEventHandler.getUnpoweredRepellentRange(mTier); - } - } - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - int[] tCoords = { aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(), - aBaseMetaTileEntity.getZCoord(), aBaseMetaTileEntity.getWorld().provider.dimensionId }; - GT_SpawnEventHandler.mobReps.add(tCoords); - } - - @Override - public void onRemoval() { - int[] tCoords = { this.getBaseMetaTileEntity() - .getXCoord(), - this.getBaseMetaTileEntity() - .getYCoord(), - this.getBaseMetaTileEntity() - .getZCoord(), - this.getBaseMetaTileEntity() - .getWorld().provider.dimensionId }; - GT_SpawnEventHandler.mobReps.removeIf(coords -> Arrays.equals(coords, tCoords)); - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return true; - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 512L; - } - - @Override - public long maxEUStore() { - return 512L + V[mTier] * 50; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxAmperesIn() { - return 2; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return null; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) {} - - @Override - public void loadNBTData(NBTTagCompound aNBT) {} -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java deleted file mode 100644 index 8254c6440d..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java +++ /dev/null @@ -1,225 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.enums.MachineType; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.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_BasicMachine; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_PotionBrewer extends GT_MetaTileEntity_BasicMachine { - - public GT_MetaTileEntity_PotionBrewer(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, - MachineType.BREWERY.tooltipDescription(), - 1, - 0, - TextureFactory.of( - TextureFactory.of( - new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of( - new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of( - new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of( - new Textures.BlockIcons.CustomIcon( - "basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER_GLOW")) - .glow() - .build())); - } - - public GT_MetaTileEntity_PotionBrewer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, 1, 0); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PotionBrewer(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.brewingRecipes; - } - - @Override - public int checkRecipe() { - int tCheck = super.checkRecipe(); - if (tCheck != DID_NOT_FIND_RECIPE) { - return tCheck; - } - - calculateOverclockedNess(4, 128); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - - FluidStack aFluid = getFillableStack(); - if ((getDrainableStack() == null) && (aFluid != null) && (getInputAt(0) != null)) { - String tInputName = aFluid.getFluid() - .getName(); - if (tInputName.startsWith("potion.")) { - tInputName = tInputName.replaceFirst("potion.", ""); - int tFirstDot = tInputName.indexOf('.') + 1; - String tModifier = tFirstDot <= 0 ? "" : tInputName.substring(tFirstDot); - if (!tModifier.isEmpty()) { - tInputName = tInputName.replaceFirst("." + tModifier, ""); - } - if (GT_Utility.areStacksEqual(new ItemStack(Items.fermented_spider_eye, 1, 0), getInputAt(0))) { - return switch (tInputName) { - case "poison", "health", "waterbreathing" -> setOutput("potion.damage" + tModifier); - case "nightvision" -> setOutput("potion.invisibility" + tModifier); - case "fireresistance", "speed" -> setOutput("potion.slowness" + tModifier); - case "strength" -> setOutput("potion.weakness" + tModifier); - case "regen" -> setOutput("potion.poison" + tModifier); - default -> setOutput("potion.weakness"); - }; - } - if (GT_Utility.areStacksEqual( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L), - getInputAt(0))) { - if (!tModifier.startsWith("strong")) { - return setOutput( - "potion." + tInputName + ".strong" + (tModifier.isEmpty() ? "" : "." + tModifier)); - } - if (tModifier.startsWith("long")) { - return setOutput("potion." + tInputName + tModifier.replaceFirst("long", "")); - } - return setOutput("potion.thick"); - } - if (GT_Utility.areStacksEqual( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L), - getInputAt(0))) { - if (!tModifier.startsWith("long")) { - return setOutput( - "potion." + tInputName + ".long" + (tModifier.isEmpty() ? "" : "." + tModifier)); - } - if (tModifier.startsWith("strong")) { - return setOutput("potion." + tInputName + tModifier.replaceFirst("strong", "")); - } - return setOutput("potion.mundane"); - } - if (GT_Utility.areStacksEqual( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L), - getInputAt(0))) { - if (!tInputName.endsWith(".splash")) { - return setOutput("potion." + tInputName + ".splash"); - } - return setOutput("potion.mundane"); - } - } - } - return 0; - } - - private int setOutput(String aFluidName) { - if (getFillableStack().amount < 750) { - return 0; - } - - this.mOutputFluid = FluidRegistry.getFluidStack(aFluidName, 750); - if (this.mOutputFluid == null) { - this.mOutputFluid = FluidRegistry.getFluidStack("potion.mundane", getFillableStack().amount); - } - - getInputAt(0).stackSize -= 1; - getFillableStack().amount -= 750; - return 2; - } - - @Override - public boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && getRecipeMap().containsInput(aStack); - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return (aFluid.getFluid() - .getName() - .startsWith("potion.")) || (super.isFluidInputAllowed(aFluid)); - } - - @Override - public int getCapacity() { - return getCapacityForTier(mTier); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java deleted file mode 100644 index eff998d405..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java +++ /dev/null @@ -1,846 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.debugBlockPump; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.ChunkPosition; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.IFluidBlock; - -import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; - -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.BaseTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.recipe.BasicUIProperties; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.common.misc.GT_DrillingLogicDelegate; - -public class GT_MetaTileEntity_Pump extends GT_MetaTileEntity_BasicMachine { - - private static final ItemStack MINING_PIPE = GT_ModHandler.getIC2Item("miningPipe", 0); - - private static final ItemStack MINING_PIPE_ONE = GT_ModHandler.getIC2Item("miningPipe", 1); - private static final Block MINING_PIPE_BLOCK = GT_Utility.getBlockFromStack(MINING_PIPE); - private static final Block MINING_PIPE_TIP_BLOCK = GT_Utility - .getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 0)); - - public static int getMaxDistanceForTier(int aTier) { - return (10 * ((int) Math.pow(1.6D, aTier))); - } - - public static long getEuUsagePerTier(int aTier) { - return (16 * ((long) Math.pow(4, aTier))); - } - - public ArrayDeque mPumpList = new ArrayDeque<>(); - public boolean wasPumping = false; - public int mPumpTimer = 0; - public int mPumpCountBelow = 0; - public Block mPrimaryPumpedBlock = null; - public Block mSecondaryPumpedBlock = null; - - private int radiusConfig; // Pump configured radius - private boolean mRetractDone = false; - - private boolean mDisallowRetract = true; - - public GT_MetaTileEntity_Pump(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, - new String[] { "The best way to empty Oceans!", - getEuUsagePerTier(aTier) + " EU/operation, " - + GT_Utility.safeInt(160 / 20 / (long) Math.pow(2, aTier)) - + " sec per bucket, no stuttering", - "Maximum pumping area: " + (getMaxDistanceForTier(aTier) * 2 + 1) - + "x" - + (getMaxDistanceForTier(aTier) * 2 + 1), - "Use Screwdriver to regulate pumping area", "Use Soft Mallet to disable and retract the pipe", - "Disable the bottom pump to retract the pipe!", - "Use Soldering Iron to auto retract the pipe when hitting a rock", }, - 2, - 2, - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_ACTIVE")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_GLOW")) - .glow() - .build())); - - radiusConfig = getMaxDistanceForTier(mTier); - } - - public GT_MetaTileEntity_Pump(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, 2, 2); - radiusConfig = getMaxDistanceForTier(mTier); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Pump(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - private static final FallbackableUITexture progressBarTexture = GT_UITextures - .fallbackableProgressbar("pump", GT_UITextures.PROGRESSBAR_CANNER); - - @Override - protected BasicUIProperties getUIProperties() { - return BasicUIProperties.builder() - .maxItemInputs(2) - .maxItemOutputs(2) - .slotOverlays((index, isFluid, isOutput, isSpecial) -> { - if (!isFluid && !isOutput && !isSpecial) { - return GT_UITextures.OVERLAY_SLOT_MINING_PIPE; - } else { - return null; - } - }) - .maxFluidInputs(0) - .maxFluidOutputs(1) - .progressBarTexture(progressBarTexture) - .build(); - } - - @Override - public int getCapacity() { - return getCapacityForTier(mTier); - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && aStack.getItem() == GT_DrillingLogicDelegate.MINING_PIPE_STACK.getItem(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - boolean wasPumping = this.wasPumping || !this.mPumpList.isEmpty(); - if (debugBlockPump) { - GT_Log.out.println( - "PUMP: NBT:Save - WasPumping - " + wasPumping - + " blocks (" - + this.mPrimaryPumpedBlock - + ", " - + this.mSecondaryPumpedBlock - + ")"); - } - super.saveNBTData(aNBT); - aNBT.setString( - "mPumpedBlock1", - this.mPrimaryPumpedBlock == null ? "" : Block.blockRegistry.getNameForObject(this.mPrimaryPumpedBlock)); - aNBT.setString( - "mPumpedBlock2", - this.mSecondaryPumpedBlock == null ? "" : Block.blockRegistry.getNameForObject(this.mSecondaryPumpedBlock)); - aNBT.setBoolean("wasPumping", wasPumping); - aNBT.setInteger("radiusConfig", radiusConfig); - aNBT.setBoolean("mRetractDone", mRetractDone); - aNBT.setBoolean("mDisallowRetract", mDisallowRetract); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.wasPumping = aNBT.getBoolean("wasPumping"); - if (aNBT.hasKey("radiusConfig")) this.radiusConfig = aNBT.getInteger("radiusConfig"); - this.mPrimaryPumpedBlock = Block.getBlockFromName(aNBT.getString("mPumpedBlock1")); - this.mSecondaryPumpedBlock = Block.getBlockFromName(aNBT.getString("mPumpedBlock2")); - this.mRetractDone = aNBT.getBoolean("mRetractDone"); - this.mDisallowRetract = aNBT.getBoolean("mDisallowRetract"); - - // Transition from old TE which was derived from GT_MetaTileEntity_Hatch - if (!aNBT.hasKey("mEUt")) { - // Output of old pump always faces up. - getBaseMetaTileEntity().setFrontFacing(ForgeDirection.UP); - - // Automatic output on. - mFluidTransfer = true; - - // Fluid was stored in the hatch, now needs to go to the output. - if (mFluid != null && mFluid.amount > 0) { - fluidOutputTank.fill(mFluid, true); - mFluid = null; - } - - // Move pipes (or other things) from old slots to new ones. - if (mInventory[1] != null && mInventory[1].stackSize > 0) { - mInventory[getInputSlot() + 1] = mInventory[1]; - mInventory[1] = null; - } - - if (mInventory[0] != null && mInventory[0].stackSize > 0) { - mInventory[getInputSlot()] = mInventory[0]; - mInventory[0] = null; - } - } - - if (debugBlockPump) { - GT_Log.out.println( - "PUMP: NBT:Load - WasPumping - " + this.wasPumping - + "(" - + aNBT.getString("mPumpedBlock1") - + ") " - + this.mPrimaryPumpedBlock); - } - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - super.setItemNBT(aNBT); - aNBT.setInteger("radiusConfig", radiusConfig); - aNBT.setBoolean("mDisallowRetract", mDisallowRetract); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); - - if (side == getBaseMetaTileEntity().getFrontFacing() || side == mMainFacing) { - // Configuring "input from output side allowed". - return; - } - - int max = getMaxPumpableDistance(); - if (aPlayer.isSneaking()) { - if (radiusConfig >= 0) { - radiusConfig--; - } - if (radiusConfig < 0) radiusConfig = max; - } else { - if (radiusConfig <= max) { - radiusConfig++; - } - if (radiusConfig > max) radiusConfig = 0; - } - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.machines.workareaset") + " " - + (radiusConfig * 2 + 1) - + "x" - + (radiusConfig * 2 + 1)); // TODO Add translation support - - clearQueue(false); - } - - @Override - public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, - EntityPlayer entityPlayer, float aX, float aY, float aZ) { - if (super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ)) return true; - mDisallowRetract = !mDisallowRetract; - GT_Utility.sendChatToPlayer( - entityPlayer, - StatCollector.translateToLocal( - mDisallowRetract ? "GT5U.machines.autoretract.disabled" : "GT5U.machines.autoretract.enabled")); - return true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - - if (getBaseMetaTileEntity().isServerSide()) { - this.mPumpTimer -= 1; - if ((getBaseMetaTileEntity() instanceof BaseTileEntity)) { - ((BaseTileEntity) getBaseMetaTileEntity()).ignoreUnloadedChunks = false; - } - this.doTickProfilingInThisTick = true; - this.mPumpCountBelow = 0; - - IGregTechTileEntity tTileEntity; - for (int i = 1; (i < 21) - && ((tTileEntity = getBaseMetaTileEntity() - .getIGregTechTileEntityAtSideAndDistance(ForgeDirection.DOWN, i)) != null) - && ((tTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Pump)); i++) { - // Apparently someone might stack 21 pumps on top of each other, so let's check for that - getBaseMetaTileEntity().setActive(tTileEntity.isActive()); - this.mPumpCountBelow += 1; - // The more pumps we have stacked, the faster the ones below go - ((GT_MetaTileEntity_Pump) tTileEntity.getMetaTileEntity()).mPumpTimer -= 1; - ((GT_MetaTileEntity_Pump) tTileEntity.getMetaTileEntity()).mProgresstime += 1; - } - if (debugBlockPump && (this.mPumpCountBelow != 0)) { - GT_Log.out.println("PUMP: Detected " + this.mPumpCountBelow + " pumps below this pump."); - } - if (this.mPumpCountBelow <= 0) { - // Only the bottom most pump does anything - if (getBaseMetaTileEntity().isAllowedToWork()) { - mRetractDone = false; - if ((getBaseMetaTileEntity().isUniversalEnergyStored(this.getEuUsagePerAction())) - && (fluidOutputTank.getFluidAmount() + 1000 <= fluidOutputTank.getCapacity())) { - boolean tMovedOneDown = false; - if ((this.mPumpList.isEmpty()) && (getBaseMetaTileEntity().getTimer() % 100L == 0L)) { - if (!this.wasPumping) { - tMovedOneDown = moveOneDown(); - if (!tMovedOneDown) { - if (canMoveDown( - getBaseMetaTileEntity().getXCoord(), - Math.max(getYOfPumpHead() - 1, 1), - getBaseMetaTileEntity().getZCoord())) { - if (debugBlockPump) { - GT_Log.out.println("PUMP: No pipe left. Idle for a little longer."); - } - this.mPumpTimer = 160; - } else { - getBaseMetaTileEntity().disableWorking(); - if (debugBlockPump) { - GT_Log.out.println("PUMP: Can't move. Retracting in next few ticks"); - } - } - } else if (debugBlockPump) { - GT_Log.out.println("PUMP: Moved down"); - } - } else if (debugBlockPump) { - GT_Log.out.println("PUMP: Was pumping, didn't move down"); - } - } - int x = getBaseMetaTileEntity().getXCoord(), z = getBaseMetaTileEntity().getZCoord(); - - if (!this.hasValidFluid()) { - // We don't have a valid block, let's try to find one - int y = getYOfPumpHead(); - - if (debugBlockPump && this.mPrimaryPumpedBlock != null) { - GT_Log.out.println( - "PUMP: Had an invalid pump block. Trying to find a fluid at Y: " + y - + " Previous blocks 1: " - + this.mPrimaryPumpedBlock - + " 2: " - + this.mSecondaryPumpedBlock); - } - // First look down - checkForFluidToPump(x, y - 1, z); - - // Then look all around - checkForFluidToPump(x, y, z + 1); - checkForFluidToPump(x, y, z - 1); - checkForFluidToPump(x + 1, y, z); - checkForFluidToPump(x - 1, y, z); - this.clearQueue(false); - - if (this.hasValidFluid()) { - // Don't move down and rebuild the queue if we now have a valid fluid - this.wasPumping = true; - } - - } else if (getYOfPumpHead() < getBaseMetaTileEntity().getYCoord()) { - // We didn't just look for a block, and the pump head is below the pump - if ((tMovedOneDown) || this.wasPumping - || ((this.mPumpList.isEmpty()) && (getBaseMetaTileEntity().getTimer() % 200L == 100L)) - || (getBaseMetaTileEntity().getTimer() % 72000L == 100L)) { - // Rebuild the list to pump if any of the following conditions are true: - // 1) We just moved down - // 2) We were previously pumping (and possibly just reloaded) - // 3) We have an empty queue and enough time has passed - // 4) A long while has passed - if (debugBlockPump) { - GT_Log.out.println( - "PUMP: Rebuilding pump list - Size " + this.mPumpList.size() - + " WasPumping: " - + this.wasPumping - + " Timer " - + getBaseMetaTileEntity().getTimer()); - } - int yPump = getBaseMetaTileEntity().getYCoord() - 1, yHead = getYOfPumpHead(); - - this.rebuildPumpQueue(x, yPump, z, yHead); - - if (debugBlockPump) { - GT_Log.out.println("PUMP: Rebuilt pump list - Size " + this.mPumpList.size()); - } - } - if ((!tMovedOneDown) && (this.mPumpTimer <= 0)) { - while ((!this.mPumpList.isEmpty())) { - ChunkPosition pos = this.mPumpList.pollLast(); - if (consumeFluid(pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ)) { - // Keep trying until we consume something, or the list is empty - break; - } - } - this.mPumpTimer = GT_Utility.safeInt(160 / (long) Math.pow(2, this.mTier)); - this.mPumpTimer = mPumpTimer == 0 ? 1 : mPumpTimer; - - mMaxProgresstime = mPumpTimer; - mProgresstime = 0; - } - } else { - // We somehow have a valid fluid, but the head of the pump isn't below the pump. Perhaps - // someone broke some pipes - // -- Clear the queue and we should try to move down until we can find a valid fluid - this.clearQueue(false); - } - } else if (debugBlockPump) { - GT_Log.out.println("PUMP: Not enough energy? Free space?"); - } - } else { - mMaxProgresstime = 0; - - if (!mRetractDone && ((aTick % 5) == 0) && canOutput(MINING_PIPE_ONE)) { - // try retract if all of these conditions are met - // 1. not retracted yet - // 2. once per 5 tick - // 3. can hold retracted pipe in inventory - int tHeadY = getYOfPumpHead(); - if (tHeadY < this.getBaseMetaTileEntity() - .getYCoord()) { - final int tXCoord = this.getBaseMetaTileEntity() - .getXCoord(); - final int tZCoord = this.getBaseMetaTileEntity() - .getZCoord(); - this.getBaseMetaTileEntity() - .getWorld() - .setBlockToAir(tXCoord, tHeadY, tZCoord); - if (tHeadY < this.getBaseMetaTileEntity() - .getYCoord() - 1) { - getBaseMetaTileEntity().getWorld() - .setBlock(tXCoord, tHeadY + 1, tZCoord, MINING_PIPE_TIP_BLOCK); - } - - for (int i = 0; i < mOutputItems.length; ++i) { - if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot() + i, MINING_PIPE_ONE.copy())) { - break; - } - } - - if (debugBlockPump) { - GT_Log.out.println("PUMP: Retracted one pipe"); - } - } else { - mRetractDone = true; - if (debugBlockPump) { - GT_Log.out.println("PUMP: Retract done"); - } - } - } - } - if (!mDisallowRetract) getBaseMetaTileEntity().setActive(!this.mPumpList.isEmpty()); - } - } - } - - private int getMaxPumpableDistance() { - return getMaxDistanceForTier(this.mTier); - } - - private long getEuUsagePerAction() { - return getEuUsagePerTier(this.mTier); - } - - private boolean hasValidFluid() { - return mPrimaryPumpedBlock != null && mSecondaryPumpedBlock != null; - } - - private boolean moveOneDown() { - boolean foundPipe = false; - - for (int i = 0; i < mInputSlotCount; i++) { - ItemStack stack = getInputAt(i); - if (stack != null && GT_Utility.areStacksEqual(stack, MINING_PIPE) && stack.stackSize > 0) { - foundPipe = true; - break; - } - } - - if (!foundPipe) { - // No mining pipes - if (debugBlockPump) { - GT_Log.out.println("PUMP: No mining pipes"); - } - return false; - } - - int yHead = getYOfPumpHead(); - if (yHead <= 1) { - // Let's not punch through bedrock - if (debugBlockPump) { - GT_Log.out.println("PUMP: At bottom"); - } - return false; - } - - int x = getBaseMetaTileEntity().getXCoord(), z = getBaseMetaTileEntity().getZCoord(); - - Block aBlock = getBaseMetaTileEntity().getBlock(x, yHead - 1, z); - boolean canReplaceBlock = aBlock.isReplaceable(getBaseMetaTileEntity().getWorld(), x, yHead - 1, z); - - // We specifically allow replacing water even if we can't consume it - // (e.g. pump holds a different fluid) to help avoid getting stuck on random water pockets. - if (!canReplaceBlock || (isFluid(aBlock) && !consumeFluid(x, yHead - 1, z) && !isWater(aBlock))) { - // Either we didn't consume a fluid, or it's a non-replaceable block, or it's water. - if (debugBlockPump) { - GT_Log.out.println("PUMP: Did not consume fluid, or non-replaceable block found"); - } - return false; - } - // Try to set the block below us to a tip - if (!GT_Utility.setBlockByFakePlayer( - getFakePlayer(getBaseMetaTileEntity()), - x, - yHead - 1, - z, - MINING_PIPE_TIP_BLOCK, - 0, - false)) { - if (debugBlockPump) { - GT_Log.out.println("PUMP: Could not set block below to new tip"); - } - return false; - } - // And change the previous block to a pipe -- as long as it isn't the pump itself! - if (yHead != getBaseMetaTileEntity().getYCoord()) { - getBaseMetaTileEntity().getWorld() - .setBlock(x, yHead, z, MINING_PIPE_BLOCK); - } - - // Remove pipe from inputs. - foundPipe = false; - - for (int i = 0; i < mInputSlotCount; i++) { - ItemStack stack = getInputAt(i); - if (stack != null && GT_Utility.areStacksEqual(stack, MINING_PIPE) && stack.stackSize > 0) { - foundPipe = true; - stack.stackSize -= 1; - if (stack.stackSize == 0) { - mInventory[getInputSlot() + i] = null; - } - break; - } - } - - if (debugBlockPump) { - if (foundPipe) { - GT_Log.out.println("PUMP: Using 1 pipe"); - } else { - GT_Log.err.println("PUMP: Lowered pipe but could not find pipe in input"); - } - } - - return true; - } - - private int getYOfPumpHead() { - // Let's play find the pump head! - - // TODO: Handle pipe|pipe|head|pipe|pipe - int y = getBaseMetaTileEntity().getYCoord() - 1, x = getBaseMetaTileEntity().getXCoord(), - z = getBaseMetaTileEntity().getZCoord(); - - while (y > 0) { - Block curBlock = getBaseMetaTileEntity().getBlock(x, y, z); - if (curBlock == MINING_PIPE_BLOCK) { - y--; - } else if (curBlock == MINING_PIPE_TIP_BLOCK) { - Block nextBlock = getBaseMetaTileEntity().getBlock(x, y - 1, z); - if (nextBlock == MINING_PIPE_BLOCK || nextBlock == MINING_PIPE_TIP_BLOCK) { - // We're running into an existing set of pipes -- Turn this block into a pipe and keep going - this.clearQueue(true); - getBaseMetaTileEntity().getWorld() - .setBlock(x, y, z, MINING_PIPE_BLOCK); - if (debugBlockPump) { - GT_Log.out.println("PUMP: Hit pipes already in place, trying to merge"); - } - } - y--; - - } else { - break; - } - } - - if (getBaseMetaTileEntity().getBlock(x, y, z) != MINING_PIPE_TIP_BLOCK) { - if (y != getBaseMetaTileEntity().getYCoord() - 1 - && getBaseMetaTileEntity().getBlock(x, y + 1, z) == MINING_PIPE_BLOCK) { - // We're below the pump at the bottom of the pipes, we haven't found a tip; make the previous pipe a - // tip! - this.clearQueue(true); - getBaseMetaTileEntity().getWorld() - .setBlock(x, y + 1, z, MINING_PIPE_TIP_BLOCK); - if (debugBlockPump) { - GT_Log.out.println("PUMP: Did not find a tip at bottom, setting last pipe as tip"); - } - } - return y + 1; - } - return y; - } - - private void clearQueue(boolean checkPumping) { - if (checkPumping) { - this.wasPumping = !this.mPumpList.isEmpty(); - } else { - this.wasPumping = false; - } - this.mPumpList.clear(); - } - - private void rebuildPumpQueue(int aX, int yStart, int aZ, int yEnd) { - int mDist = this.radiusConfig; - doTickProfilingInThisTick = false; - ArrayDeque fluidsToSearch = new ArrayDeque<>(); - ArrayDeque fluidsFound = new ArrayDeque<>(); - Set checked = new HashSet<>(); - this.clearQueue(false); - - for (int aY = yStart; this.mPumpList.isEmpty() && aY >= yEnd; aY--) { - // Start at the top (presumably the block below the pump), and work our way down to the end (presumably the - // location of the pump Head) - // and build up a queue of fluids to pump - fluidsToSearch.add(new ChunkPosition(aX, aY, aZ)); - - while (!fluidsToSearch.isEmpty()) { - for (ChunkPosition tPos : fluidsToSearch) { - // Look all around - if (tPos.chunkPosX < aX + mDist) - queueFluid(tPos.chunkPosX + 1, tPos.chunkPosY, tPos.chunkPosZ, fluidsFound, checked); - if (tPos.chunkPosX > aX - mDist) - queueFluid(tPos.chunkPosX - 1, tPos.chunkPosY, tPos.chunkPosZ, fluidsFound, checked); - if (tPos.chunkPosZ < aZ + mDist) - queueFluid(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ + 1, fluidsFound, checked); - if (tPos.chunkPosZ > aZ - mDist) - queueFluid(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ - 1, fluidsFound, checked); - - // And then look up - queueFluid(tPos.chunkPosX, tPos.chunkPosY + 1, tPos.chunkPosZ, this.mPumpList, checked); - } - this.mPumpList.addAll(fluidsFound); - fluidsToSearch = fluidsFound; - fluidsFound = new ArrayDeque<>(); - } - - // Make sure we don't have the pipe location in the queue - this.mPumpList.remove(new ChunkPosition(aX, aY, aZ)); - } - } - - private boolean queueFluid(int aX, int aY, int aZ, ArrayDeque fluidsFound, - Set checked) { - // If we haven't already looked at this coordinate set, and it's not already in the list of fluids found, see if - // there is - // a valid fluid and add it to the fluids found - ChunkPosition tCoordinate = new ChunkPosition(aX, aY, aZ); - if (checked.add(tCoordinate) && !fluidsFound.contains(tCoordinate)) { - Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); - if ((this.mPrimaryPumpedBlock == aBlock) || (this.mSecondaryPumpedBlock == aBlock)) { - fluidsFound.addFirst(tCoordinate); - return true; - } - } - return false; - } - - private void checkForFluidToPump(int aX, int aY, int aZ) { - // If we don't currently have a valid fluid to pump, try pumping the fluid at the given coordinates - if (this.hasValidFluid()) return; - - Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); - if (aBlock != null) { - if (isWater(aBlock)) { - this.mPrimaryPumpedBlock = Blocks.water; - this.mSecondaryPumpedBlock = Blocks.flowing_water; - return; - } - if (isLava(aBlock)) { - this.mPrimaryPumpedBlock = Blocks.lava; - this.mSecondaryPumpedBlock = Blocks.flowing_lava; - return; - } - if ((aBlock instanceof IFluidBlock)) { - this.mPrimaryPumpedBlock = aBlock; - this.mSecondaryPumpedBlock = aBlock; - return; - } - } - this.mPrimaryPumpedBlock = null; - this.mSecondaryPumpedBlock = null; - } - - /** only check if block below can be replaced with pipe tip. pipe stockpile condition is ignored */ - private boolean canMoveDown(int aX, int aY, int aZ) { - if (!GT_Utility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), aX, aY, aZ, true)) return false; - - Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); - - return aBlock != null && aBlock.isReplaceable(getBaseMetaTileEntity().getWorld(), aX, aY, aZ); - } - - private boolean consumeFluid(int aX, int aY, int aZ) { - // Try to consume a fluid at a location - // Returns true if something was consumed, otherwise false - if (!GT_Utility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), aX, aY, aZ, true)) return false; - - Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); - if (!isFluid(aBlock)) { - return false; - } - - if (aBlock != null && ((this.mPrimaryPumpedBlock == aBlock) || (this.mSecondaryPumpedBlock == aBlock))) { - boolean isWaterOrLava = ((this.mPrimaryPumpedBlock == Blocks.water - || this.mPrimaryPumpedBlock == Blocks.lava)); - - if (isWaterOrLava && getBaseMetaTileEntity().getMetaID(aX, aY, aZ) != 0) { - // Water/Lava that isn't a source block - do nothing here, but set the block to air and consume energy - // below - if (debugBlockPump) { - GT_Log.out.println("PUMP: Water/Lava - Not a source block"); - } - - } else if (getDrainableStack() == null) { - // The pump has no internal fluid - if (this.mPrimaryPumpedBlock == Blocks.water) setDrainableStack(GT_ModHandler.getWater(1000L)); - else if (this.mPrimaryPumpedBlock == Blocks.lava) setDrainableStack(GT_ModHandler.getLava(1000L)); - else { - // Not water or lava; try to drain and set to air - setDrainableStack( - ((IFluidBlock) aBlock).drain(getBaseMetaTileEntity().getWorld(), aX, aY, aZ, true)); - } - - } else if (GT_ModHandler.isWater(getDrainableStack()) || GT_ModHandler.isLava(getDrainableStack()) - || getDrainableStack().isFluidEqual( - ((IFluidBlock) aBlock).drain(getBaseMetaTileEntity().getWorld(), aX, aY, aZ, false))) { - if (!isWaterOrLava) { - // Only set Block to Air for non lava/water fluids - this.getBaseMetaTileEntity() - .getWorld() - .setBlockToAir(aX, aY, aZ); - } - getDrainableStack().amount += 1000; - - } else { - if (debugBlockPump) { - GT_Log.out.println("PUMP: Couldn't consume " + aBlock); - } - // We didn't do anything - return false; - } - - getBaseMetaTileEntity().decreaseStoredEnergyUnits(this.getEuUsagePerAction(), true); - getBaseMetaTileEntity().getWorld() - .setBlock(aX, aY, aZ, Blocks.air, 0, 2); - return true; - } - return false; - } - - private static boolean isWater(Block aBlock) { - return aBlock == Blocks.water || aBlock == Blocks.flowing_water; - } - - private static boolean isLava(Block aBlock) { - return aBlock == Blocks.lava || aBlock == Blocks.flowing_lava; - } - - private static boolean isFluid(Block aBlock) { - return isWater(aBlock) || isLava(aBlock) || aBlock instanceof IFluidBlock; - } - - @Override - public ArrayList getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, - int aLogLevel, ArrayList aList) { - aList.addAll( - Arrays.asList( - EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.pump") - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.machines.workarea") + ": " - + EnumChatFormatting.GREEN - + (radiusConfig * 2 + 1) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.machines.blocks"), - "Primary pumping fluid: " - + (this.mPrimaryPumpedBlock != null ? this.mPrimaryPumpedBlock.getLocalizedName() : "None"), - "Secondary pumping fluid: " - + (this.mSecondaryPumpedBlock != null ? this.mSecondaryPumpedBlock.getLocalizedName() : "None"), - "Pumps below: " + mPumpCountBelow, - "Queue size: " + mPumpList.size(), - "Pump head at Y: " + getYOfPumpHead(), - "Pump timer: " + mPumpTimer, - "Meta Entity Timer: " + getBaseMetaTileEntity().getTimer())); - return aList; - } - - private FakePlayer mFakePlayer = null; - - protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) { - if (mFakePlayer == null) mFakePlayer = GT_Utility.getFakePlayer(aBaseTile); - mFakePlayer.setWorld(aBaseTile.getWorld()); - mFakePlayer.setPosition(aBaseTile.getXCoord(), aBaseTile.getYCoord(), aBaseTile.getZCoord()); - return mFakePlayer; - } - - @Override - public String[] getInfoData() { - return new String[] { - EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.pump") + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.machines.workarea") + ": " - + EnumChatFormatting.GREEN - + (radiusConfig * 2 + 1) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.machines.blocks") }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java deleted file mode 100644 index e9f3d98dd5..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java +++ /dev/null @@ -1,130 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.MachineType; -import gregtech.api.enums.Materials; -import gregtech.api.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_BasicMachine; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_Replicator extends GT_MetaTileEntity_BasicMachine { - - public GT_MetaTileEntity_Replicator(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, - MachineType.REPLICATOR.tooltipDescription(), - 1, - 1, - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_SIDE_REPLICATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/replicator/OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_SIDE_REPLICATOR")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_SIDE_REPLICATOR_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_FRONT_REPLICATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/replicator/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_FRONT_REPLICATOR")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_FRONT_REPLICATOR_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_TOP_REPLICATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/replicator/OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_TOP_REPLICATOR")), - TextureFactory.builder() - .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_TOP_REPLICATOR_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of( - new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR_ACTIVE")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon( - "basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW")) - .glow() - .build()), - TextureFactory.of( - TextureFactory - .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR")), - TextureFactory.builder() - .addIcon( - new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR_GLOW")) - .glow() - .build())); - } - - public GT_MetaTileEntity_Replicator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, 1, 1); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Replicator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.replicatorRecipes; - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && ItemList.Cell_Empty.isStackEqual(aStack); - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return aFluid.isFluidEqual(Materials.UUMatter.getFluid(1L)); - } - - @Override - public int getCapacity() { - return 3000; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java deleted file mode 100644 index e632f4eeda..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java +++ /dev/null @@ -1,169 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_GLOW; - -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.MachineType; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_RockBreaker extends GT_MetaTileEntity_BasicMachine { - - public GT_MetaTileEntity_RockBreaker(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, - MachineType.ROCKBREAKER.tooltipDescription(), - 1, - 1, - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_ROCK_BREAKER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_ROCK_BREAKER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_GLOW) - .glow() - .build())); - } - - public GT_MetaTileEntity_RockBreaker(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, 1, 1); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_RockBreaker(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.rockBreakerFakeRecipes; - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && getRecipeMap().containsInput(aStack); - } - - @Override - public boolean allowSelectCircuit() { - return true; - } - - @Override - public int checkRecipe() { - IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity(); - if ((aBaseMetaTileEntity.getBlockOffset(0, 0, 1) == Blocks.water) - || (aBaseMetaTileEntity.getBlockOffset(0, 0, -1) == Blocks.water) - || (aBaseMetaTileEntity.getBlockOffset(-1, 0, 0) == Blocks.water) - || (aBaseMetaTileEntity.getBlockOffset(1, 0, 0) == Blocks.water)) { - ItemStack tOutput = null; - if (aBaseMetaTileEntity.getBlockOffset(0, 1, 0) == Blocks.lava) { - tOutput = new ItemStack(Blocks.stone, 1); - } else if ((aBaseMetaTileEntity.getBlockOffset(0, 0, 1) == Blocks.lava) - || (aBaseMetaTileEntity.getBlockOffset(0, 0, -1) == Blocks.lava) - || (aBaseMetaTileEntity.getBlockOffset(-1, 0, 0) == Blocks.lava) - || (aBaseMetaTileEntity.getBlockOffset(1, 0, 0) == Blocks.lava)) { - tOutput = new ItemStack(Blocks.cobblestone, 1); - } - if (tOutput != null) { - if (GT_Utility.areStacksEqual(getStackInSlot(getCircuitSlot()), GT_Utility.getIntegratedCircuit(1))) { - if (GT_Utility.areStacksEqual( - getInputAt(0), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))) { - tOutput = new ItemStack(Blocks.obsidian, 1); - if (canOutput(tOutput)) { - getInputAt(0).stackSize -= 1; - calculateOverclockedNess(30, 128); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - this.mOutputItems[0] = tOutput; - return 2; - } - } - } else if (canOutput(tOutput)) { - calculateOverclockedNess(30, 16); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - this.mOutputItems[0] = tOutput; - return 2; - } - } - } - return 0; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java deleted file mode 100644 index ba00be67f8..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java +++ /dev/null @@ -1,425 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.D1; -import static gregtech.api.enums.Mods.GalacticraftCore; -import static gregtech.api.enums.Mods.GalacticraftMars; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_GLOW; -import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes; - -import java.util.Objects; - -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import forestry.api.genetics.AlleleManager; -import forestry.api.genetics.IIndividual; -import gregtech.GT_Mod; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.MachineType; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_AssemblyLineUtils; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.items.behaviors.Behaviour_DataOrb; - -public class GT_MetaTileEntity_Scanner extends GT_MetaTileEntity_BasicMachine { - - public GT_MetaTileEntity_Scanner(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 1, - MachineType.SCANNER.tooltipDescription(), - 1, - 1, - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_SCANNER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_SCANNER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_SIDE_SCANNER), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_SCANNER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_SCANNER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_SCANNER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_FRONT_SCANNER), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_SCANNER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_SCANNER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_SCANNER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_SCANNER), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_SCANNER_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_SCANNER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW) - .glow() - .build()), - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_SCANNER), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_SCANNER_GLOW) - .glow() - .build())); - } - - public GT_MetaTileEntity_Scanner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 1, aDescription, aTextures, 1, 1); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Scanner(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public int checkRecipe() { - ItemStack aStack = getInputAt(0); - if (getOutputAt(0) != null) { - this.mOutputBlocked += 1; - } else if ((GT_Utility.isStackValid(aStack)) && (aStack.stackSize > 0)) { - if ((getFillableStack() != null) && (getFillableStack().containsFluid(Materials.Honey.getFluid(100L)))) { - try { - IIndividual tIndividual = AlleleManager.alleleRegistry.getIndividual(aStack); - if (tIndividual != null) { - if (tIndividual.analyze()) { - getFillableStack().amount -= 100; - this.mOutputItems[0] = GT_Utility.copyOrNull(aStack); - aStack.stackSize = 0; - NBTTagCompound tNBT = new NBTTagCompound(); - tIndividual.writeToNBT(tNBT); - this.mOutputItems[0].setTagCompound(tNBT); - calculateOverclockedNess(2, 500); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - this.mOutputItems[0] = GT_Utility.copyOrNull(aStack); - aStack.stackSize = 0; - this.mMaxProgresstime = 1; - this.mEUt = 1; - return 2; - } - } catch (Throwable e) { - if (D1) { - e.printStackTrace(GT_Log.err); - } - } - } - if (ItemList.IC2_Crop_Seeds.isStackEqual(aStack, true, true)) { - NBTTagCompound tNBT = aStack.getTagCompound(); - if (tNBT == null) { - tNBT = new NBTTagCompound(); - } - if (tNBT.getByte("scan") < 4) { - tNBT.setByte("scan", (byte) 4); - calculateOverclockedNess(8, 160); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - } else { - this.mMaxProgresstime = 1; - this.mEUt = 1; - } - aStack.stackSize -= 1; - this.mOutputItems[0] = GT_Utility.copyAmount(1, aStack); - assert this.mOutputItems[0] != null; - this.mOutputItems[0].setTagCompound(tNBT); - return 2; - } - if (ItemList.Tool_DataOrb.isStackEqual(getSpecialSlot(), false, true)) { - if (ItemList.Tool_DataOrb.isStackEqual(aStack, false, true)) { - aStack.stackSize -= 1; - this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot()); - calculateOverclockedNess(30, 512); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - ItemData tData = GT_OreDictUnificator.getAssociation(aStack); - if ((tData != null) && ((tData.mPrefix == OrePrefixes.dust) || (tData.mPrefix == OrePrefixes.cell)) - && (tData.mMaterial.mMaterial.mElement != null) - && (!tData.mMaterial.mMaterial.mElement.mIsIsotope) - && (tData.mMaterial.mMaterial != Materials.Magic) - && (tData.mMaterial.mMaterial.getMass() > 0L)) { - getSpecialSlot().stackSize -= 1; - aStack.stackSize -= 1; - - this.mOutputItems[0] = ItemList.Tool_DataOrb.get(1L); - Behaviour_DataOrb.setDataTitle(this.mOutputItems[0], "Elemental-Scan"); - Behaviour_DataOrb.setDataName(this.mOutputItems[0], tData.mMaterial.mMaterial.mElement.name()); - calculateOverclockedNess(30, GT_Utility.safeInt(tData.mMaterial.mMaterial.getMass() * 8192L)); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - } - if (ItemList.Tool_DataStick.isStackEqual(getSpecialSlot(), false, true)) { - if (ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) { - aStack.stackSize -= 1; - this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot()); - calculateOverclockedNess(30, 128); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - if (aStack.getItem() == Items.written_book) { - getSpecialSlot().stackSize -= 1; - aStack.stackSize -= 1; - - this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot()); - assert this.mOutputItems[0] != null; - this.mOutputItems[0].setTagCompound(aStack.getTagCompound()); - calculateOverclockedNess(30, 128); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - if (aStack.getItem() == Items.filled_map) { - getSpecialSlot().stackSize -= 1; - aStack.stackSize -= 1; - - this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot()); - assert this.mOutputItems[0] != null; - this.mOutputItems[0].setTagCompound( - GT_Utility - .getNBTContainingShort(new NBTTagCompound(), "map_id", (short) aStack.getItemDamage())); - calculateOverclockedNess(30, 128); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - - if ((aStack.getItem() - .getUnlocalizedName() - .contains("Schematic") - || aStack.getItem() - .getUnlocalizedName() - .contains("schematic")) - && !aStack.getItem() - .getUnlocalizedName() - .contains("Schematics")) { - if (mTier < 3) return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - String sTier = ""; - - int stackItemID = Item.getIdFromItem(aStack.getItem()); - int stackItemDamage = aStack.getItemDamage(); - if (stackItemID == Item.getIdFromItem( - Objects.requireNonNull(GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 0)) - .getItem())) { - if (stackItemDamage == 0 && aStack.toString() - .equals( - Objects - .requireNonNull( - GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 0)) - .copy() - .toString())) - sTier = "100"; - else if (stackItemDamage == 1 && aStack.toString() - .equals( - Objects - .requireNonNull( - GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 1)) - .copy() - .toString())) - sTier = "2"; - } else { - if (stackItemID == Item.getIdFromItem( - Objects - .requireNonNull(GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 0)) - .getItem())) { - if (stackItemDamage == 0 && aStack.toString() - .equals( - Objects - .requireNonNull( - GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 0)) - .copy() - .toString())) - sTier = "3"; - else if (stackItemDamage == 1 && aStack.toString() - .equals( - Objects - .requireNonNull( - GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 1)) - .copy() - .toString())) - sTier = "101"; - else if (stackItemDamage == 2 && aStack.toString() - .equals( - Objects - .requireNonNull( - GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 2)) - .copy() - .toString())) - sTier = "102"; - } else if (aStack.getUnlocalizedName() - .matches(".*\\d+.*")) - sTier = aStack.getUnlocalizedName() - .split("(?<=\\D)(?=\\d)")[1].substring(0, 1); - else sTier = "1"; - } - - getSpecialSlot().stackSize -= 1; - aStack.stackSize -= 1; - - this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot()); - assert this.mOutputItems[0] != null; - this.mOutputItems[0].setTagCompound( - GT_Utility.getNBTContainingShort(new NBTTagCompound(), "rocket_tier", Short.parseShort(sTier))); - - calculateOverclockedNess(480, 36000); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - } - if (getSpecialSlot() == null && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) { - if (GT_Utility.ItemNBT.getBookTitle(aStack) - .equals("Raw Prospection Data")) { - GT_Utility.ItemNBT.setBookTitle(aStack, "Analyzed Prospection Data"); - GT_Utility.ItemNBT.convertProspectionData(aStack); - aStack.stackSize -= 1; - - this.mOutputItems[0] = GT_Utility.copyAmount(1, aStack); - calculateOverclockedNess(30, 1000); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - return 2; - } - } - if (ItemList.Tool_DataStick.isStackEqual(getSpecialSlot(), false, true)) { - for (GT_Recipe.GT_Recipe_AssemblyLine tRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) { - if (GT_Utility.areStacksEqual(tRecipe.mResearchItem, aStack, true)) { - boolean failScanner = true; - for (GT_Recipe scannerRecipe : scannerFakeRecipes.getAllRecipes()) { - if (GT_Utility.areStacksEqual(scannerRecipe.mInputs[0], aStack, true)) { - failScanner = false; - break; - } - } - if (failScanner) { - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - } - - this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot()); - - // Use Assline Utils - if (GT_AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(this.mOutputItems[0], tRecipe)) { - aStack.stackSize -= 1; - calculateOverclockedNess(30, tRecipe.mResearchTime); - // In case recipe is too OP for that machine - if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - getSpecialSlot().stackSize -= 1; - return 2; - } - } - } - } - } - return 0; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (mProgresstime >= (mMaxProgresstime - 1)) { - if ((this.mOutputItems[0] != null) && (this.mOutputItems[0].getUnlocalizedName() - .equals("gt.metaitem.01.32707"))) { - GT_Mod.achievements.issueAchievement( - aBaseMetaTileEntity.getWorld() - .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), - "scanning"); - } - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public RecipeMap getRecipeMap() { - return scannerFakeRecipes; - } - - @Override - public int getCapacity() { - return 1000; - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && getRecipeMap().containsInput(aStack); - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java deleted file mode 100644 index 9de00b4a0e..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java +++ /dev/null @@ -1,601 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_SIDES; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_SIDES_GLOW; - -import java.util.List; -import java.util.function.Consumer; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityHanging; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.effect.EntityWeatherEffect; -import net.minecraft.entity.item.EntityBoat; -import net.minecraft.entity.item.EntityEnderCrystal; -import net.minecraft.entity.item.EntityEnderEye; -import net.minecraft.entity.item.EntityFireworkRocket; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.item.EntityMinecart; -import net.minecraft.entity.item.EntityTNTPrimed; -import net.minecraft.entity.item.EntityXPOrb; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.entity.projectile.EntityFireball; -import net.minecraft.entity.projectile.EntityFishHook; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.inventory.IInventory; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.common.config.machinestats.ConfigTeleporter; - -public class GT_MetaTileEntity_Teleporter extends GT_MetaTileEntity_BasicTank - implements IAddGregtechLogo, IAddUIWidgets { - - private static boolean sInterDimensionalTeleportAllowed = true; - private static int sPassiveEnergyDrain = 2048; - private static int sPowerMultiplyer = 100; - private static double sFPowerMultiplyer = 1.0; - public int mTargetX = 0; - public int mTargetY = 0; - public int mTargetZ = 0; - public int mTargetD = Integer.MIN_VALUE; - public boolean mDebug = false; - - public GT_MetaTileEntity_Teleporter(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 3, - new String[] { "Teleport long distances with this little device.", "Use a Dragon Egg or Nitrogen Plasma", - "for Inter-dimensional transmission" }); - } - - public GT_MetaTileEntity_Teleporter(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_Teleporter(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - private static float calculateWeight(Entity aEntity) { - if ((aEntity instanceof EntityFishHook)) { - return -1.0F; - } - if ((aEntity instanceof EntityDragonPart)) { - return -1.0F; - } - if ((aEntity instanceof EntityWeatherEffect)) { - return -1.0F; - } - if ((aEntity instanceof EntityPlayer tPlayer)) { - int tCount = 64; - for (int i = 0; i < 36; i++) { - if (tPlayer.inventory.getStackInSlot(i) != null) { - tCount += (tPlayer.inventory.getStackInSlot(i) - .getMaxStackSize() > 1 ? tPlayer.inventory.getStackInSlot(i).stackSize : 64); - } - } - for (int i = 0; i < 4; i++) { - if (tPlayer.inventory.armorInventory[i] != null) { - tCount += 256; - } - } - return Math.min(5.0F, tCount / 666.6F); - } - if (GT_Utility.getClassName(aEntity) - .equals("EntityItnt")) { - return 5.0F; - } - if (GT_Utility.getClassName(aEntity) - .equals("EntityNuke")) { - return 50.0F; - } - if ((aEntity instanceof EntityArrow)) { - return 0.001F; - } - if ((aEntity instanceof EntityBoat)) { - return 0.1F; - } - if ((aEntity instanceof EntityEnderCrystal)) { - return 2.0F; - } - if ((aEntity instanceof EntityEnderEye)) { - return 0.001F; - } - if ((aEntity instanceof EntityFireball)) { - return 0.001F; - } - if ((aEntity instanceof EntityFireworkRocket)) { - return 0.001F; - } - if ((aEntity instanceof EntityHanging)) { - return 0.005F; - } - if ((aEntity instanceof EntityItem)) { - return 0.001F; - } - if ((aEntity instanceof EntityLiving)) { - return 0.5F; - } - if ((aEntity instanceof EntityMinecart)) { - return 0.1F; - } - if ((aEntity instanceof EntityThrowable)) { - return 0.001F; - } - if ((aEntity instanceof EntityTNTPrimed)) { - return 5.0F; - } - if ((aEntity instanceof EntityXPOrb)) { - return 0.001F; - } - return -1.0F; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isClientSide()) return true; - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Teleporter(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - return new String[] { "Coordinates:", - "X: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetX) + EnumChatFormatting.RESET, - "Y: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetY) + EnumChatFormatting.RESET, - "Z: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetZ) + EnumChatFormatting.RESET, - "Dimension: " + EnumChatFormatting.GREEN + this.mTargetD + EnumChatFormatting.RESET, - "Dimension Valid: " + (GT_Utility.isRealDimension(this.mTargetD) - ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET - : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET), - "Dimension Registered: " + (DimensionManager.isDimensionRegistered(this.mTargetD) - ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET - : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET) }; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side != this.getBaseMetaTileEntity() - .getFrontFacing()) - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER_SIDES), - TextureFactory.builder() - .addIcon(OVERLAY_TELEPORTER_SIDES_GLOW) - .glow() - .build() }; - if (aActive) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], - TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW) - .glow() - .build() }; - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER), - TextureFactory.builder() - .addIcon(OVERLAY_TELEPORTER_GLOW) - .glow() - .build() }; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); - aNBT.setInteger("mTargetX", this.mTargetX); - aNBT.setInteger("mTargetY", this.mTargetY); - aNBT.setInteger("mTargetZ", this.mTargetZ); - aNBT.setInteger("mTargetD", this.mTargetD); - aNBT.setBoolean("mDebug", this.mDebug); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid")); - this.mTargetX = aNBT.getInteger("mTargetX"); - this.mTargetY = aNBT.getInteger("mTargetY"); - this.mTargetZ = aNBT.getInteger("mTargetZ"); - this.mTargetD = aNBT.getInteger("mTargetD"); - this.mDebug = aNBT.getBoolean("mDebug"); - } - - @Override - public void onConfigLoad() { - sInterDimensionalTeleportAllowed = ConfigTeleporter.interDimensionalTPAllowed; - sPassiveEnergyDrain = ConfigTeleporter.passiveEnergyDrain; - sPowerMultiplyer = ConfigTeleporter.powerMultiplier; - sFPowerMultiplyer = sPowerMultiplyer / 100.0; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - if (getBaseMetaTileEntity().isServerSide()) { - if ((this.mTargetX == 0) && (this.mTargetY == 0) - && (this.mTargetZ == 0) - && (this.mTargetD == Integer.MIN_VALUE)) { - this.mTargetX = aBaseMetaTileEntity.getXCoord(); - this.mTargetY = aBaseMetaTileEntity.getYCoord(); - this.mTargetZ = aBaseMetaTileEntity.getZCoord(); - this.mTargetD = aBaseMetaTileEntity.getWorld().provider.dimensionId; - } - } - } - - public boolean hasDimensionalTeleportCapability() { - return this.mDebug || sInterDimensionalTeleportAllowed; - } - - public boolean isDimensionalTeleportAvailable() { - return this.mDebug || (hasDimensionalTeleportCapability() && GT_Utility.isRealDimension(this.mTargetD) - && GT_Utility.isRealDimension(getBaseMetaTileEntity().getWorld().provider.dimensionId)); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - - if (mFluid != null) { // Was if null -> Materials.Nitrogen.getPlasma(0); - mFluid = null; - } - super.onPostTick(aBaseMetaTileEntity, aTick); - if (getBaseMetaTileEntity().isServerSide()) { - if ((getBaseMetaTileEntity().isAllowedToWork()) && (getBaseMetaTileEntity().getRedstone())) { - if (getBaseMetaTileEntity().decreaseStoredEnergyUnits(sPassiveEnergyDrain, false)) { - int tDistance = distanceCalculation(); - if (mInventory[0] != null) { - TileEntity tTile = null; - if (this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) { - tTile = getBaseMetaTileEntity().getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); - } else { - World tWorld = DimensionManager.getWorld(this.mTargetD); - if (tWorld != null) { - tTile = tWorld.getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); - } - } - if (tTile instanceof IInventory) { - int tStacksize = mInventory[0].stackSize; - GT_Utility.moveOneItemStack( - this, - tTile, - ForgeDirection.DOWN, - ForgeDirection.DOWN, - null, - false, - (byte) 64, - (byte) 1, - (byte) 64, - (byte) 1); - if (mInventory[0] == null || mInventory[0].stackSize < tStacksize) { - getBaseMetaTileEntity().decreaseStoredEnergyUnits( - (long) (Math.pow(tDistance, 1.5) * tDistance - * (tStacksize - (mInventory[0] == null ? 0 : mInventory[0].stackSize)) - * sFPowerMultiplyer), - false); - } - } - } - List entities_in_box = getBaseMetaTileEntity().getWorld() - .getEntitiesWithinAABB( - Entity.class, - AxisAlignedBB.getBoundingBox( - getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 2) - 1, - getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 2) - 1, - getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 2) - 1, - getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 2) + 2, - getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 2) + 2, - getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 2) + 2)); - - for (Object tObject : entities_in_box) { - if (((tObject instanceof Entity tEntity)) && (!((Entity) tObject).isDead)) { - if (getBaseMetaTileEntity().decreaseStoredEnergyUnits( - (long) (Math.pow(tDistance, 1.5) * calculateWeight(tEntity) * sFPowerMultiplyer), - false)) { - - if (tEntity.ridingEntity != null) { - tEntity.mountEntity(null); - } - if (tEntity.riddenByEntity != null) { - tEntity.riddenByEntity.mountEntity(null); - } - if ((this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) - || (!isDimensionalTeleportAvailable()) - || (!GT_Utility.moveEntityToDimensionAtCoords( - tEntity, - this.mTargetD, - this.mTargetX + 0.5D, - this.mTargetY + 0.5D, - this.mTargetZ + 0.5D))) { - if ((tEntity instanceof EntityLivingBase)) { - ((EntityLivingBase) tEntity).setPositionAndUpdate( - this.mTargetX + 0.5D, - this.mTargetY + 0.5D, - this.mTargetZ + 0.5D); - } else { - tEntity.setPosition( - this.mTargetX + 0.5D, - this.mTargetY + 0.5D, - this.mTargetZ + 0.5D); - } - } - } - } - } - } - getBaseMetaTileEntity().setActive(true); - } else { - getBaseMetaTileEntity().setActive(false); - } - } - } - - private int distanceCalculation() { - return Math.abs( - ((this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId) - && (isDimensionalTeleportAvailable()) - ? 4000 - : (int) Math.sqrt( - Math.pow(getBaseMetaTileEntity().getXCoord() - this.mTargetX, 2.0D) - + Math.pow(getBaseMetaTileEntity().getYCoord() - this.mTargetY, 2.0D) - + Math.pow(getBaseMetaTileEntity().getZCoord() - this.mTargetZ, 2.0D)))); - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isOverclockerUpgradable() { - return false; - } - - @Override - public boolean isTransformerUpgradable() { - return false; - } - - @Override - public boolean isElectric() { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return true; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return false; - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long getMinimumStoredEU() { - return V[mTier] * 16; - } - - @Override - public long maxEUStore() { - return 100000000; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxSteamStore() { - return maxEUStore(); - } - - @Override - public long maxAmperesIn() { - return 2; - } - - @Override - public int getStackDisplaySlot() { - return 2; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public int getInputSlot() { - return 0; - } - - @Override - public int getOutputSlot() { - return 0; - } - - @Override - public int getCapacity() { - return 64000; - } - - @Override - public boolean doesFillContainers() { - return false; - } - - @Override - public boolean doesEmptyContainers() { - return false; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return false; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return null; - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setSize(90, 72) - .setPos(43, 4)) - .widget( - new TextWidget().setStringSupplier(() -> "X: " + numberFormat.format(mTargetX)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 8)) - .widget( - new TextWidget().setStringSupplier(() -> "Y: " + numberFormat.format(mTargetY)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 16)) - .widget( - new TextWidget().setStringSupplier(() -> "Z: " + numberFormat.format(mTargetZ)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 24)) - .widget( - new TextWidget().setStringSupplier(() -> "Dim: " + numberFormat.format(mTargetD)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(46, 32)) - .widget( - TextWidget.dynamicString(() -> "Dim Valid: " + (GT_Utility.isRealDimension(mTargetD) ? "Yes" : "No")) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> hasDimensionalTeleportCapability()) - .setPos(46, 40)) - .widget(new FakeSyncWidget.FluidStackSyncer(() -> mFluid, val -> mFluid = val)); - - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133); - addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151); - - addChangeNumberButton( - builder, - GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, - val -> mTargetD += val, - -16, - -8, - 7, - 58); - addChangeNumberButton( - builder, - GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, - val -> mTargetD += val, - -4, - -1, - 25, - 58); - addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> mTargetD += val, 4, 1, 133, 58); - addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> mTargetD += val, 16, 8, 151, 58); - } - - private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift, - int addNumber, int xPos) { - addChangeNumberButton(builder, overlay, val -> mTargetX += val, addNumberShift, addNumber, xPos, 4); - addChangeNumberButton(builder, overlay, val -> mTargetY += val, addNumberShift, addNumber, xPos, 22); - addChangeNumberButton(builder, overlay, val -> mTargetZ += val, addNumberShift, addNumber, xPos, 40); - } - - private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer setter, - int addNumberShift, int addNumber, int xPos, int yPos) { - builder.widget( - new ButtonWidget() - .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? addNumberShift : addNumber)) - .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) - .setSize(18, 18) - .setPos(xPos, yPos)); - } - - @Override - public GUITextureSet getGUITextureSet() { - return new GUITextureSet().setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY); - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(113, 56)); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_TurboCharger.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_TurboCharger.java deleted file mode 100644 index a098e635f0..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_TurboCharger.java +++ /dev/null @@ -1,146 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; - -import net.minecraft.item.ItemStack; - -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.metatileentity.MetaTileEntity; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -/** - * Created by danie_000 on 15.10.2016. - */ -public class GT_MetaTileEntity_TurboCharger extends GT_MetaTileEntity_Charger { - - public GT_MetaTileEntity_TurboCharger(int aID, String aName, String aNameRegional, int aTier, String aDescription, - int aSlotCount) { - super(aID, aName, aNameRegional, aTier, aDescription, aSlotCount); - } - - public GT_MetaTileEntity_TurboCharger(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, - int aSlotCount) { - super(aName, aTier, aDescription, aTextures, aSlotCount); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_TurboCharger(mName, mTier, mDescriptionArray, mTextures, mInventory.length); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[2][17][]; - for (byte b = -1; b < 16; b++) { - rTextures[0][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1] }; - rTextures[1][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], - Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier] }; - } - return rTextures; - } - - @Override - public long getMinimumStoredEU() { - return V[mTier] * 1536L * mInventory.length; - } - - @Override - public long maxEUStore() { - return V[mTier] * 6144L * mInventory.length; - } - - @Override - public long maxAmperesIn() { - return 16L * mInventory.length; - } - - @Override - public long maxAmperesOut() { - return 4L * mInventory.length; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - - mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3 - || !aBaseMetaTileEntity.isAllowedToWork(); - mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3 - && aBaseMetaTileEntity.isAllowedToWork(); - mBatteryCount = 0; - mChargeableCount = 0; - for (ItemStack tStack : mInventory) { - if (GT_ModHandler.isElectricItem(tStack, mTier)) { - if (GT_ModHandler.isChargerItem(tStack)) { - mBatteryCount++; - } - mChargeableCount++; - } - } - - if (getBaseMetaTileEntity() instanceof BaseMetaTileEntity) { - BaseMetaTileEntity mBaseMetaTileEntity = (BaseMetaTileEntity) getBaseMetaTileEntity(); - if (mBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity) { - MetaTileEntity mMetaTileEntity = (MetaTileEntity) mBaseMetaTileEntity.getMetaTileEntity(); - if (mMetaTileEntity.dechargerSlotCount() > 0 - && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { - for (int i = mMetaTileEntity.dechargerSlotStartIndex(), - k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) { - if (mMetaTileEntity.mInventory[i] != null - && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { - // CODE - mBaseMetaTileEntity.increaseStoredEnergyUnits( - GT_ModHandler.dischargeElectricItem( - mMetaTileEntity.mInventory[i], - GT_Utility.safeInt( - Math.min( - V[mTier] * 120, - mBaseMetaTileEntity.getEUCapacity() - - mBaseMetaTileEntity.getStoredEU())), - (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()), - true, - false, - false), - true); - if (mMetaTileEntity.mInventory[i].stackSize <= 0) { - mMetaTileEntity.mInventory[i] = null; - } - } - } - } - if (mMetaTileEntity.rechargerSlotCount() > 0 && mBaseMetaTileEntity.getStoredEU() > 0) { - for (int i = mMetaTileEntity.rechargerSlotStartIndex(), - k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) { - if (mBaseMetaTileEntity.getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) { - // CODE - mBaseMetaTileEntity - .decreaseStoredEU( - GT_ModHandler.chargeElectricItem( - mMetaTileEntity.mInventory[i], - GT_Utility - .safeInt(Math.min(V[mTier] * 120, mBaseMetaTileEntity.getStoredEU())), - (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getOutputTier()), - true, - false), - true); - if (mMetaTileEntity.mInventory[i].stackSize <= 0) { - mMetaTileEntity.mInventory[i] = null; - } - } - } - } - } - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_WorldAccelerator.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_WorldAccelerator.java deleted file mode 100644 index 1b0048f2ec..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_WorldAccelerator.java +++ /dev/null @@ -1,470 +0,0 @@ -package gregtech.common.tileentities.machines.basic; - -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.Mods.GregTech; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -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.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import eu.usrv.yamcore.auxiliary.PlayerChatHelper; -import gregtech.api.enums.GT_Values; -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_Log; - -public class GT_MetaTileEntity_WorldAccelerator extends GT_MetaTileEntity_TieredMachineBlock { - - // simple name is rather expensive to compute and it's not cached - // see https://stackoverflow.com/q/17369304 - private static final ClassValue simpleNameCache = new ClassValue() { - - @Override - protected String computeValue(Class type) { - return type.getSimpleName(); - } - }; - private static final HashSet> _mBlacklistedTiles = new HashSet<>(); - - public static boolean addTileToBlacklist(Class clazz) { - return _mBlacklistedTiles.add(clazz); - } - - public static boolean addTileToBlacklist(TileEntity tileEntity) { - return _mBlacklistedTiles.add(tileEntity.getClass()); - } - - public static HashSet> get_mBlacklistedTiles() { - return _mBlacklistedTiles; - } - - private int _mRadiusTierOverride = -1; - private int _mSpeedTierOverride = -1; - - private int getRadiusTierOverride() { - if (_mRadiusTierOverride == -1) _mRadiusTierOverride = mTier; - return _mRadiusTierOverride; - } - - private int getSpeedTierOverride() { - if (_mSpeedTierOverride == -1) _mSpeedTierOverride = mTier; - return _mSpeedTierOverride; - } - - private int incSpeedTierOverride() { - _mSpeedTierOverride = getSpeedTierOverride() + 1; - if (_mSpeedTierOverride > mTier) _mSpeedTierOverride = 1; - - return _mSpeedTierOverride; - } - - private int incRadiusTierOverride() { - // Make sure we get the Override value first, as we check it for initial -1 - _mRadiusTierOverride = getRadiusTierOverride() + 1; - if (_mRadiusTierOverride > mTier) _mRadiusTierOverride = 1; - - return _mRadiusTierOverride; - } - - private byte mMode = 0; // 0: RandomTicks around 1: TileEntities with range 1 - private static Textures.BlockIcons.CustomIcon _mGTIco_Norm_Idle; - private static Textures.BlockIcons.CustomIcon _mGTIco_Norm_Active; - private static Textures.BlockIcons.CustomIcon _mGTIco_TE_Idle; - private static Textures.BlockIcons.CustomIcon _mGTIco_TE_Active; - private static int[] mAccelerateStatic = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 512, 512, 512, 512, 512, 512 }; - private static final int AMPERAGE_NORMAL = 3; - private static final int AMPERAGE_TE = 6; - - @Override - public void registerIcons(IIconRegister aBlockIconRegister) { - super.registerIcons(aBlockIconRegister); - _mGTIco_Norm_Idle = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR"); - _mGTIco_Norm_Active = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR_ACTIVE"); - _mGTIco_TE_Idle = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR_TE"); - _mGTIco_TE_Active = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR_TE_ACTIVE"); - } - - @SideOnly(Side.CLIENT) - @Override - public void onValueUpdate(byte aValue) { - mMode = aValue; - } - - @Override - public byte getUpdateData() { - return mMode; - } - - public GT_MetaTileEntity_WorldAccelerator(int pID, String pName, String pNameRegional, int pTier) { - super(pID, pName, pNameRegional, pTier, 0, ""); - } - - @Override - public String[] getDescription() { - return new String[] { - String - .format("Accelerating things (Max Radius: %d | Max Speed Bonus: x%d)", mTier, mAccelerateStatic[mTier]), - "Use a screwdriver to change mode, sneak to change Radius", "Use a wrench to change speed", - "To accelerate TileEntities, this machine has to be adjacent to it", - String.format("Normal mode consumes up to %s amperage, depending on radius", AMPERAGE_NORMAL), - String.format("TE mode consumes %s amperage", AMPERAGE_TE) }; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - List tInfoDisplay = new ArrayList<>(); - - tInfoDisplay.add(String.format("Accelerator running in %s mode", mModeStr[mMode])); - tInfoDisplay.add( - String.format( - "Speed setting: [%d / %d]", - mAccelerateStatic[getSpeedTierOverride()], - mAccelerateStatic[mTier])); - tInfoDisplay.add( - String.format( - "Consuming %d EU/t", - getEnergyDemand(getSpeedTierOverride(), getRadiusTierOverride(), mMode == 1))); - - // Don't show radius setting if in TE Mode - if (mMode == 0) tInfoDisplay.add(String.format("Radius setting: [%d / %d]", getRadiusTierOverride(), mTier)); - - return tInfoDisplay.toArray(new String[0]); - } - - public GT_MetaTileEntity_WorldAccelerator(String pName, int pTier, int pInvSlotCount, String[] pDescription, - ITexture[][][] pTextures) { - super(pName, pTier, pInvSlotCount, pDescription, pTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity pTileEntity) { - return new GT_MetaTileEntity_WorldAccelerator(mName, mTier, mInventory.length, mDescriptionArray, mTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] pTextures) { - return null; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity pBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean pActive, boolean pRedstone) { - if (mMode == 0) { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], side.offsetY != 0 ? null - : pActive ? new GT_RenderedTexture(_mGTIco_Norm_Active) : new GT_RenderedTexture(_mGTIco_Norm_Idle) }; - } else { - return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], side.offsetY != 0 ? null - : pActive ? new GT_RenderedTexture(_mGTIco_TE_Active) : new GT_RenderedTexture(_mGTIco_TE_Idle) }; - } - } - - @Override - public boolean allowPullStack(IGregTechTileEntity pBaseMetaTileEntity, int pIndex, ForgeDirection side, - ItemStack pStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity pBaseMetaTileEntity, int pIndex, ForgeDirection side, - ItemStack pStack) { - return false; - } - - @Override - public void saveNBTData(NBTTagCompound pNBT) { - pNBT.setByte("mAccelMode", mMode); - - // SpeedOverride can never be larger than mTier; Which will never exceed 255, so it's safe to cast here - pNBT.setByte("mSpeed", (byte) getSpeedTierOverride()); - pNBT.setByte("mRadius", (byte) getRadiusTierOverride()); - } - - public long getEnergyDemand(int pSpeedTier, int pRangeTier, boolean pIsAcceleratingTEs) { - // TE mode does not need to consider range setting - if (pIsAcceleratingTEs) return V[pSpeedTier] * AMPERAGE_TE; - - // Include range setting into power calculation - float multiplier = 100.0F / (float) mTier * (float) pRangeTier / 100.0F; - long demand = V[pSpeedTier] * AMPERAGE_NORMAL; - - float tDemand = demand * multiplier; - - return (int) tDemand; - } - - @Override - public void loadNBTData(NBTTagCompound pNBT) { - mMode = pNBT.getByte("mAccelMode"); - - // Make sure we're not crashing with old Accelerator Machines - if (pNBT.hasKey("mSpeed")) _mSpeedTierOverride = pNBT.getByte("mSpeed"); - if (pNBT.hasKey("mRadius")) _mRadiusTierOverride = pNBT.getByte("mRadius"); - } - - @Override - public boolean isAccessAllowed(EntityPlayer pPlayer) { - return true; - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return true; - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long getMinimumStoredEU() { - return 512; - } - - @Override - public long maxEUStore() { - return 512 + V[mTier] * 50; - } - - @Override - public long maxEUInput() { - return V[mTier]; - } - - @Override - public long maxAmperesIn() { - return 8; - } - - private static String[] mModeStr = { "Blocks", "TileEntities" }; - - // This uses the Wrench as second tool to cycle speeds - @Override - public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer pPlayer, float aX, - float aY, float aZ) { - incSpeedTierOverride(); - - markDirty(); - PlayerChatHelper.SendInfo( - pPlayer, - String.format("Machine acceleration changed to x%d", mAccelerateStatic[getSpeedTierOverride()])); - - return true; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer pPlayer, float pX, float pY, float pZ) { - if (pPlayer.isSneaking()) { - if (mMode == 0) { - incRadiusTierOverride(); - - markDirty(); - PlayerChatHelper - .SendInfo(pPlayer, String.format("Machine radius changed to %d Blocks", getRadiusTierOverride())); - } else PlayerChatHelper - .SendError(pPlayer, String.format("Can't change radius; Machine is in TileEntity Mode!")); - } else { - mMode = (byte) (mMode == 0x00 ? 0x01 : 0x00); - markDirty(); - PlayerChatHelper.SendInfo(pPlayer, String.format("Switched mode to: %s", mModeStr[mMode])); - } - } - - @Override - public void onPostTick(IGregTechTileEntity pBaseMetaTileEntity, long pTick) { - try { - if (!pBaseMetaTileEntity.isServerSide()) { - return; - } - - long tEnergyDemand = getEnergyDemand(getSpeedTierOverride(), getRadiusTierOverride(), mMode == 1); - - // Do we have enough energy to run? Or are we not allowed to run? - if (pBaseMetaTileEntity.getStoredEU() < tEnergyDemand || !pBaseMetaTileEntity.isAllowedToWork()) { - // Check if machine was active before - if (pBaseMetaTileEntity.isActive()) { - pBaseMetaTileEntity.setActive(false); // Then disable it now - } - } else { - // Continue to drain power - if (pBaseMetaTileEntity.decreaseStoredEnergyUnits(tEnergyDemand, false)) { - World tWorld = pBaseMetaTileEntity.getWorld(); - // Limit the random ticks to once per second - if (mMode == 0) { - if (pTick % 20 == 0) { - doAccelerateNormalBlocks(pBaseMetaTileEntity, tWorld); - } - } else { - doAccelerateTileEntities(pBaseMetaTileEntity, tWorld); - } - - } else { - // Energy drain failed. Disable machine - if (pBaseMetaTileEntity.isActive()) { - pBaseMetaTileEntity.setActive(false); // Then disable it now - } - } - } - } catch (Exception e) { - GT_Log.err.println("GT_MetaTileEntity_WorldAccelerator.onPostTick.crash\n" + e.getMessage()); - } - } - - private void doAccelerateTileEntities(IGregTechTileEntity pBaseMetaTileEntity, World pWorld) { - try { - if (!pBaseMetaTileEntity.isActive()) { - getBaseMetaTileEntity().setActive(true); - } - - for (ForgeDirection tDir : ForgeDirection.VALID_DIRECTIONS) { - TileEntity tTile = pBaseMetaTileEntity.getTileEntityAtSide(tDir); - if (isTEBlackListed(tTile)) { - continue; - } - - long tMaxTime = System.nanoTime() + 1000000; - for (int j = 0; j < mAccelerateStatic[getSpeedTierOverride()]; j++) { - tTile.updateEntity(); - if (System.nanoTime() > tMaxTime) { - break; - } - } - } - } catch (Exception e) { - GT_Log.err.println("GT_MetaTileEntity_WorldAccelerator.doAccelerateTileEntities.crash\n" + e.getMessage()); - } - } - - // Inspired by ChromatiCraft's TileAccelerator - private boolean isTEBlackListed(TileEntity pTile) { - if (pTile == null) { - return true; // Obvious - } - if (!pTile.canUpdate()) { - return true; // Skip if TE can't update at all - } - if (pTile.isInvalid()) { - return true; // Obvious - } - - String tSimpleClassName = simpleNameCache.get(pTile.getClass()); - String tCanonicalName = pTile.getClass() - .getCanonicalName() - .toLowerCase(); - if (tSimpleClassName.contains("conduit") || tSimpleClassName.contains("wire") - || tSimpleClassName.contains("cable")) { - return true; - } - if (tCanonicalName.contains("appeng") || tCanonicalName.contains(GregTech.ID)) // Don't accelerate ANY gregtech - // machines - { - return true; - } - if (tSimpleClassName.contains("solar") || tCanonicalName.contains("solar")) // Don't accelerate ANY solars - { - return true; - } - - for (String tS : GT_Values.blacklistedTileEntiyClassNamesForWA) { - if (tCanonicalName.equalsIgnoreCase(tS)) { - return true; - } - } - - return GT_MetaTileEntity_WorldAccelerator._mBlacklistedTiles.stream() - .map(Class::getCanonicalName) - .map(String::toLowerCase) - .anyMatch(tCanonicalName::equalsIgnoreCase); - } - - /** - * Accelerate normal blocks. Eats some power and adds randomTicks to every block within its working area - * (Tier-Number = radius) This does only affect blocks that implement the "RandomTick" method; Which is mostly used - * for grass growth and plants. - * - * @param pBaseMetaTileEntity - */ - private void doAccelerateNormalBlocks(IGregTechTileEntity pBaseMetaTileEntity, World pWorld) { - if (!pBaseMetaTileEntity.isActive()) { - getBaseMetaTileEntity().setActive(true); - } - - Random rnd = new Random(); - int tX = pBaseMetaTileEntity.getXCoord(); - int tY = pBaseMetaTileEntity.getYCoord(); - int tZ = pBaseMetaTileEntity.getZCoord(); - - int tX1 = tX - getRadiusTierOverride(); - int tX2 = tX + getRadiusTierOverride(); - int tY1 = Math.max(tY - getRadiusTierOverride(), 0); // Limit to bedrock - int tY2 = Math.min(tY + getRadiusTierOverride(), 255); // Limit to build height - int tZ1 = tZ - getRadiusTierOverride(); - int tZ2 = tZ + getRadiusTierOverride(); - - for (int xi = tX1; xi <= tX2; xi++) { - for (int yi = tY1; yi <= tY2; yi++) { - for (int zi = tZ1; zi <= tZ2; zi++) { - tryTickBlock(pWorld, xi, yi, zi, rnd); - } - } - } - } - - /** - * Send a tick to the target block - * - * @param pWorld - * @param pX - * @param pY - * @param pZ - * @param pRnd - */ - private void tryTickBlock(World pWorld, int pX, int pY, int pZ, Random pRnd) { - try { - for (int j = 0; j < getSpeedTierOverride(); j++) { - Block tBlock = pWorld.getBlock(pX, pY, pZ); - if (tBlock.getTickRandomly()) { - tBlock.updateTick(pWorld, pX, pY, pZ, pRnd); - } - } - } catch (Exception e) { - GT_Log.err.println("GT_MetaTileEntity_WorldAccelerator.tryTickBlock.crash\n" + e.getMessage()); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEAdvSeismicProspector.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEAdvSeismicProspector.java new file mode 100644 index 0000000000..fc4aefcf14 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEAdvSeismicProspector.java @@ -0,0 +1,307 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_GLOW; +import static gregtech.common.UndergroundOil.undergroundOilReadInformation; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.objects.ItemData; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; +import ic2.core.Ic2Items; + +public class MTEAdvSeismicProspector extends MTEBasicMachine { + + boolean ready = false; + final int radius; + final int step; + int cX; + int cZ; + + public MTEAdvSeismicProspector(int aID, String aName, String aNameRegional, int aTier, int aRadius, int aStep) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, // amperage + "", + 1, // input slot count + 1, // output slot count + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_ROCK_BREAKER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_ROCK_BREAKER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_GLOW) + .glow() + .build())); + radius = aRadius; + step = aStep; + } + + @Override + public String[] getDescription() { + return new String[] { "Place, activate with explosives", + "2 Powderbarrels, " + "4 Glyceryl Trinitrate, " + "16 TNT, or " + "8 ITNT", + "Use Data Stick, Scan Data Stick, Print Data Stick, Bind Pages into Book", + "Ore prospecting area = " + radius * 2 + "x" + radius * 2 + " ONLY blocks below prospector", + "Oil prospecting area 3x3 oilfields, each is 8x8 chunks" }; + } + + protected MTEAdvSeismicProspector(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, + int aRadius, int aStep) { + super(aName, aTier, 1, aDescription, aTextures, 1, 1); + radius = aRadius; + step = aStep; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEAdvSeismicProspector( + this.mName, + this.mTier, + this.mDescriptionArray, + this.mTextures, + this.radius, + this.step); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isServerSide()) { + ItemStack aStack = aPlayer.getCurrentEquippedItem(); + + if (!ready && (GTUtility.consumeItems(aPlayer, aStack, Item.getItemFromBlock(Blocks.tnt), 16) + || GTUtility.consumeItems(aPlayer, aStack, Ic2Items.industrialTnt.getItem(), 8) + || GTUtility.consumeItems(aPlayer, aStack, Materials.Glyceryl, 4) + || GTUtility.consumeItems(aPlayer, aStack, ItemList.Block_Powderbarrel.getItem(), 2))) { + + this.ready = true; + this.mMaxProgresstime = (aPlayer.capabilities.isCreativeMode ? 20 : 800); + + } else if (ready && mMaxProgresstime == 0 + && aStack != null + && aStack.stackSize == 1 + && aStack.getItem() == ItemList.Tool_DataStick.getItem()) { + this.ready = false; + + // prospecting ores + HashMap tOres = new HashMap<>(36); + + prospectOres(tOres); + + // prospecting oils + ArrayList tOils = new ArrayList<>(); + prospectOils(tOils); + + GTUtility.ItemNBT.setAdvancedProspectionData( + mTier, + aStack, + this.getBaseMetaTileEntity() + .getXCoord(), + this.getBaseMetaTileEntity() + .getYCoord(), + this.getBaseMetaTileEntity() + .getZCoord(), + this.getBaseMetaTileEntity() + .getWorld().provider.dimensionId, + tOils, + GTUtility.sortByValueToList(tOres), + radius); + } + } + + return true; + } + + private void prospectOils(ArrayList aOils) { + + int xChunk = (getBaseMetaTileEntity().getXCoord() >> 7) << 3; // oil field aligned chunk coords + int zChunk = (getBaseMetaTileEntity().getZCoord() >> 7) << 3; + + LinkedHashMap tFluids = new LinkedHashMap<>(); + int oilFieldCount = 0; + + try { + final int oilfieldSize = 8; + for (int z = -1; z <= 1; ++z) { + for (int x = -1; x <= 1; ++x) { + ChunkCoordIntPair cInts = new ChunkCoordIntPair(x, z); + int min = Integer.MAX_VALUE; + int max = Integer.MIN_VALUE; + + for (int i = 0; i < oilfieldSize; i++) { + for (int j = 0; j < oilfieldSize; j++) { + Chunk tChunk = getBaseMetaTileEntity().getWorld() + .getChunkFromChunkCoords(xChunk + i + x * oilfieldSize, zChunk + j + z * oilfieldSize); + FluidStack tFluid = undergroundOilReadInformation(tChunk); + if (tFluid != null) { + if (tFluid.amount > max) max = tFluid.amount; + if (tFluid.amount < min) min = tFluid.amount; + if (!tFluids.containsKey(cInts)) { + tFluids.put(cInts, tFluid); + } + } + } + } + + aOils.add( + ++oilFieldCount + "," + + min + + "-" + + max + + "," + + tFluids.get(cInts) + .getLocalizedName()); + } + } + } catch (Exception ignored) {} + } + + private void prospectOres(Map aOres) { + int tLeftXBound = this.getBaseMetaTileEntity() + .getXCoord() - radius; + int tRightXBound = tLeftXBound + 2 * radius; + + int tLeftZBound = this.getBaseMetaTileEntity() + .getZCoord() - radius; + int tRightZBound = tLeftZBound + 2 * radius; + + for (int i = tLeftXBound; i <= tRightXBound; i += step) { + if (Math.abs(i >> 4) % 3 != 1) continue; + for (int k = tLeftZBound; k <= tRightZBound; k += step) { + if (Math.abs(k >> 4) % 3 != 1) continue; + + cX = (i >> 4) << 4; + cZ = (k >> 4) << 4; + + String separator = (cX + 8) + "," + (cZ + 8) + " --------"; + aOres.put(separator, 1); + prospectHole(i, k, aOres); + } + } + } + + private void prospectHole(int i, int k, Map aOres) { + String tFoundOre; + for (int j = this.getBaseMetaTileEntity() + .getYCoord(); j > 0; j--) { + tFoundOre = checkForOre(i, j, k); + if (tFoundOre != null) countOre(aOres, tFoundOre, cX, cZ); + } + } + + private String checkForOre(int x, int y, int z) { + Block tBlock = this.getBaseMetaTileEntity() + .getBlock(x, y, z); + + if (tBlock instanceof BlockOresAbstract) { + TileEntity tTileEntity = getBaseMetaTileEntity().getWorld() + .getTileEntity(x, y, z); + + if ((tTileEntity instanceof TileEntityOres) && (((TileEntityOres) tTileEntity).mMetaData < 16000)) { // Filtering + // small + // ores + Materials tMaterial = GregTechAPI.sGeneratedMaterials[((TileEntityOres) tTileEntity).mMetaData % 1000]; + + if ((tMaterial != null) && (tMaterial != Materials._NULL)) return tMaterial.mDefaultLocalName; + } + } else { + int tMetaID = getBaseMetaTileEntity().getWorld() + .getBlockMetadata(x, y, z); + ItemStack is = new ItemStack(tBlock, 1, tMetaID); + ItemData association = GTOreDictUnificator.getAssociation(is); + if ((association != null) && (association.mPrefix.toString() + .startsWith("ore"))) return association.mMaterial.mMaterial.mDefaultLocalName; + else if (GTUtility.isOre(tBlock, tMetaID)) return tBlock.getLocalizedName(); + } + return null; + } + + private static void countOre(Map map, String ore, int cCX, int cCZ) { + ore = (cCX + 8) + "," + (cCZ + 8) + " has " + ore; + Integer oldCount = map.get(ore); + oldCount = (oldCount == null) ? 0 : oldCount; + + map.put(ore, oldCount + 1); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEBetterJukebox.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEBetterJukebox.java new file mode 100644 index 0000000000..8f1db317a2 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEBetterJukebox.java @@ -0,0 +1,701 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_JUKEBOX; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_JUKEBOX; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +import net.minecraft.item.ItemRecord; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; + +import org.joml.Vector4i; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; +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.CycleButtonWidget; +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.SliderWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import appeng.api.implementations.tiles.ISoundP2PHandler; +import appeng.me.GridAccessException; +import appeng.me.cache.helpers.TunnelCollection; +import appeng.me.helpers.AENetworkProxy; +import appeng.parts.p2p.PartP2PSound; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.VoltageIndex; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.recipe.BasicUIProperties; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTMusicSystem; +import gregtech.common.gui.modularui.UIHelper; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; + +public class MTEBetterJukebox extends MTEBasicMachine implements IAddUIWidgets, ISoundP2PHandler { + + // Stored state + public UUID jukeboxUuid = UNSET_UUID; + public boolean loopMode = true; + public boolean shuffleMode = false; + public int playbackSlot = 0; + public float playbackVolume = BalanceMath.VANILLA_JUKEBOX_RANGE; + public float p2pVolume = BalanceMath.VANILLA_JUKEBOX_RANGE; + public long discProgressMs = 0; + /** Makes all music discs play for 4 seconds */ + public boolean superFastDebugMode = false; + // Computed state + private final Vector4i interdimPositionCache = new Vector4i(); // XYZ, Dimension ID + private GTMusicSystem.MusicSource musicSource = null; + private boolean powered = false; + private long discStartMs = 0; + public long discDurationMs = 1; + private ItemRecord currentlyPlaying = null; + + // Constants + public static final UUID UNSET_UUID = UUID.nameUUIDFromBytes(new byte[] { 0 }); + public static final int INPUT_SLOTS = 21; + private static final Random SHUFFLER = new Random(); + + public enum HeadphoneLimit { + + BLOCK_RANGE, + INSIDE_DIMENSION, + BETWEEN_DIMENSIONS; + + public static final ImmutableList ENTRIES = ImmutableList.copyOf(values()); + } + + public static final class BalanceMath { + + public static int MAX_TIER = VoltageIndex.IV; + public static float VANILLA_JUKEBOX_RANGE = 4.0f; // 64 blocks + + private static final float[] LISTENING_VOLUME = new float[] { // + VANILLA_JUKEBOX_RANGE, // ULV (unpowered fallback) + VANILLA_JUKEBOX_RANGE + 1.0f, // LV, 80 blocks + VANILLA_JUKEBOX_RANGE + 2.0f, // MV, 96 blocks + VANILLA_JUKEBOX_RANGE + 4.0f, // HV, 118 blocks + VANILLA_JUKEBOX_RANGE + 5.0f, // EV, 144 blocks + VANILLA_JUKEBOX_RANGE + 6.0f, // IV, 160 blocks, equivalent to default load distance of 10 chunks + }; + + private static final int[] HEADPHONE_BLOCK_RANGE = new int[] { // + 64, // ULV (unpowered fallback) + 128, // LV + 160, // MV + 320, // HV + 9001, // EV, alreadu unlimited here - this value is ignored + 9002, // IV, already unlimited here - this value is ignored + }; + + public static float listeningVolume(int tier) { + tier = MathHelper.clamp_int(tier, 0, MAX_TIER); + return LISTENING_VOLUME[tier]; + } + + public static int headphoneBlockRange(int tier) { + tier = MathHelper.clamp_int(tier, 0, MAX_TIER); + return HEADPHONE_BLOCK_RANGE[tier]; + } + + public static HeadphoneLimit headphoneLimit(int tier) { + if (tier <= VoltageIndex.HV) { + return HeadphoneLimit.BLOCK_RANGE; + } else if (tier == VoltageIndex.EV) { + return HeadphoneLimit.INSIDE_DIMENSION; + } else { + return HeadphoneLimit.BETWEEN_DIMENSIONS; + } + } + + public static float volumeToAttenuationDistance(float range) { + // SoundManager.playSound logic + return 16.0f * range; + } + + public static float attenuationDistanceToVolume(float blockRange) { + return blockRange / 16.0f; + } + + public static long eutUsage(int tier) { + tier = MathHelper.clamp_int(tier, 0, MAX_TIER); + return V[tier] / 16; + } + } + + private static String[] buildDescription(int aTier) { + ArrayList strings = new ArrayList<>(4); + strings.add("Plays music better than your average vanilla jukebox."); + if (BalanceMath.headphoneLimit(aTier) != HeadphoneLimit.BLOCK_RANGE) { + strings.add(EnumChatFormatting.BLUE + "The raw power of Hatsune Miku in your ears"); + } + strings.add( + String.format( + "Range: %s%.1f blocks", + EnumChatFormatting.WHITE, + BalanceMath.volumeToAttenuationDistance(BalanceMath.listeningVolume(aTier)))); + strings.add(switch (BalanceMath.headphoneLimit(aTier)) { + case BLOCK_RANGE -> String.format( + "Headphone signal range: %s%d blocks", + EnumChatFormatting.WHITE, + BalanceMath.headphoneBlockRange(aTier)); + case INSIDE_DIMENSION -> String + .format("Headphones work anywhere in %sthe same dimension", EnumChatFormatting.WHITE); + case BETWEEN_DIMENSIONS -> String + .format("Headphones work anywhere, in %sany dimension", EnumChatFormatting.WHITE); + }); + strings.add(String.format("Cost: %s%d EU/t", EnumChatFormatting.WHITE, BalanceMath.eutUsage(aTier))); + strings.add(GTValues.AuthorEigenRaven); + return strings.toArray(new String[0]); + } + + public MTEBetterJukebox(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 1, buildDescription(aTier), INPUT_SLOTS, 1); + playbackVolume = BalanceMath.listeningVolume(aTier); + } + + public MTEBetterJukebox(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, INPUT_SLOTS, 1); + playbackVolume = BalanceMath.listeningVolume(aTier); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBetterJukebox(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == baseMetaTileEntity.getFrontFacing()) { + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_PIPE_OUT) }; + } + if (sideDirection != ForgeDirection.UP) { + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_SIDE_JUKEBOX) }; + } + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.builder() + .addIcon(OVERLAY_TOP_JUKEBOX) + .extFacing() + .build() }; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + if (aBaseMetaTileEntity.isClientSide()) { + return; + } + final Vector4i interdimPosition = interdimPositionCache; + interdimPosition.x = aBaseMetaTileEntity.getXCoord(); + interdimPosition.y = aBaseMetaTileEntity.getYCoord(); + interdimPosition.z = aBaseMetaTileEntity.getZCoord(); + interdimPosition.w = aBaseMetaTileEntity.getWorld().provider.dimensionId; + if (jukeboxUuid == UNSET_UUID) { + jukeboxUuid = UUID.randomUUID(); + markDirty(); + } + if (musicSource == null) { + musicSource = GTMusicSystem.ServerSystem.registerOrGetMusicSource(jukeboxUuid); + musicSource.originPosition.set(interdimPosition); + musicSource.headphoneLimit = BalanceMath.headphoneLimit(mTier); + musicSource.headphoneBlockRange = BalanceMath.headphoneBlockRange(mTier); + musicSource.startedPlayingAtMs = System.currentTimeMillis(); + updateEmitterList(); + } + if (doesSlotContainValidRecord(playbackSlot) + && mInventory[playbackSlot].getItem() instanceof ItemRecord record) { + final ResourceLocation resource = record.getRecordResource(record.recordName); + currentlyPlaying = record; + // Assume a safe disc duration of 500 seconds if not known in the registry + discDurationMs = GTMusicSystem.getMusicRecordDurations() + .getOrDefault(resource, 500_000); + discStartMs = System.currentTimeMillis() - discProgressMs; + musicSource.setRecord( + new ResourceLocation(resource.getResourceDomain(), "records." + resource.getResourcePath()), + discProgressMs); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + try { + if (aBaseMetaTileEntity.isClientSide() || !aBaseMetaTileEntity.isAllowedToWork() || musicSource == null) { + if (currentlyPlaying != null) { + stopCurrentSong(System.currentTimeMillis()); + } + return; + } + final Vector4i interdimPosition = interdimPositionCache; + interdimPosition.x = aBaseMetaTileEntity.getXCoord(); + interdimPosition.y = aBaseMetaTileEntity.getYCoord(); + interdimPosition.z = aBaseMetaTileEntity.getZCoord(); + interdimPosition.w = aBaseMetaTileEntity.getWorld().provider.dimensionId; + final long now = System.currentTimeMillis(); + + if (superFastDebugMode && discDurationMs > 4000) { + discDurationMs = 4000; + } + + // power check + final boolean hasMinimumEU = aBaseMetaTileEntity.isUniversalEnergyStored(getMinimumStoredEU()); + if (currentlyPlaying != null && hasMinimumEU + && aBaseMetaTileEntity.decreaseStoredEnergyUnits(BalanceMath.eutUsage(mTier), false)) { + if (!powered) { // just got power again + powered = true; + musicSource.modified = true; + musicSource.headphoneLimit = BalanceMath.headphoneLimit(mTier); + musicSource.headphoneBlockRange = BalanceMath.headphoneBlockRange(mTier); + updateEmitterList(); + } + } else if ((!hasMinimumEU || currentlyPlaying != null) && powered) { // was powered, but no longer is + powered = false; + musicSource.modified = true; + musicSource.headphoneLimit = HeadphoneLimit.BLOCK_RANGE; + musicSource.headphoneBlockRange = BalanceMath.headphoneBlockRange(0); + updateEmitterList(); + } + + // check if current disc finished + if (currentlyPlaying != null) { + discProgressMs = now - discStartMs; + final boolean hasValidRecord = doesSlotContainValidRecord(playbackSlot); + final boolean wasDiscSwapped = hasValidRecord + && mInventory[getInputSlot() + playbackSlot].getItem() != currentlyPlaying; + if (discProgressMs >= discDurationMs || !hasValidRecord || wasDiscSwapped) { + stopCurrentSong(now); + if (!loopMode) { + // should be empty, but swap just in case it's not + final ItemStack oldOut = mInventory[getOutputSlot()]; + mInventory[getOutputSlot()] = mInventory[getInputSlot() + playbackSlot]; + mInventory[getInputSlot() + playbackSlot] = oldOut; + markDirty(); + } + if (!(hasValidRecord && wasDiscSwapped)) { + // don't switch slots if someone just put a new disc in the active slot + pickNextSlot(); + } + } else { + // keep on playing + return; + } + } + + if (playbackSlot < 0 || playbackSlot >= INPUT_SLOTS + || ((aTimer % 10) == 0 && !doesSlotContainValidRecord(playbackSlot))) { + pickNextSlot(); + } + + final boolean hasValidRecord = doesSlotContainValidRecord(playbackSlot); + final boolean canStartPlaying = loopMode || isOutputEmpty(); + if (!hasValidRecord) { + stopCurrentSong(now); + } else if (canStartPlaying + && mInventory[getInputSlot() + playbackSlot].getItem() instanceof ItemRecord record) { + final ResourceLocation resource = record.getRecordResource(record.recordName); + currentlyPlaying = record; + musicSource.setRecord( + new ResourceLocation(resource.getResourceDomain(), "records." + resource.getResourcePath())); + // Assume a safe disc duration of 500 seconds if not known in the registry + discDurationMs = GTMusicSystem.getMusicRecordDurations() + .getOrDefault(resource, 500_000); + discProgressMs = 0; + discStartMs = now; + } + } finally { + super.onPostTick(aBaseMetaTileEntity, aTimer); + } + } + + private void stopCurrentSong(long nowMs) { + if (currentlyPlaying == null) { + return; + } + musicSource.setRecord(null); + currentlyPlaying = null; + discDurationMs = 1; + discProgressMs = 0; + discStartMs = nowMs; + markDirty(); + } + + private void pickNextSlot() { + playbackSlot = MathHelper.clamp_int(playbackSlot, 0, INPUT_SLOTS); + if (shuffleMode) { + final int[] validSlots = new int[INPUT_SLOTS]; + int validSlotCount = 0; + for (int i = 0; i < INPUT_SLOTS; i++) { + if (i != playbackSlot && doesSlotContainValidRecord(i)) { + validSlots[validSlotCount++] = i; + } + } + switch (validSlotCount) { + case 0 -> {} + case 1 -> { + playbackSlot = validSlots[0]; + } + default -> { + playbackSlot = validSlots[SHUFFLER.nextInt(validSlotCount)]; + } + } + } else { + int attempt = 0; + int nextSlot = playbackSlot; + do { + attempt++; + nextSlot = (nextSlot + 1) % INPUT_SLOTS; + } while (!doesSlotContainValidRecord(nextSlot) && attempt <= INPUT_SLOTS); + if (attempt <= INPUT_SLOTS) { + playbackSlot = nextSlot; + } + } + } + + public boolean doesSlotContainValidRecord(int slot) { + return mInventory[getInputSlot() + slot] != null + && mInventory[getInputSlot() + slot].getItem() instanceof ItemRecord; + } + + @Override + public void onRemoval() { + final IGregTechTileEntity baseTE = getBaseMetaTileEntity(); + if (baseTE == null) { + return; + } + if (!baseTE.isServerSide()) { + return; + } + if (jukeboxUuid == UNSET_UUID) { + return; + } + GTMusicSystem.ServerSystem.removeMusicSource(jukeboxUuid); + } + + @Override + public long getMinimumStoredEU() { + return BalanceMath.eutUsage(mTier) * 20; + } + + @Override + public long maxEUStore() { + return 512L + BalanceMath.eutUsage(mTier) * 50; + } + + @Override + public long maxAmperesIn() { + return 1; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + public static final String NBTKEY_UUID_LOW = "jukeboxUUIDLow"; + public static final String NBTKEY_UUID_HIGH = "jukeboxUUIDHigh"; + public static final String NBTKEY_LOOP_MODE = "loopMode"; + public static final String NBTKEY_SHUFFLE_MODE = "shuffleMode"; + public static final String NBTKEY_PLAYBACK_SLOT = "playbackSlot"; + public static final String NBTKEY_VOLUME_PLAY = "playbackVolume"; + public static final String NBTKEY_VOLUME_P2P = "p2pVolume"; + public static final String NBTKEY_DISC_PROGRESS_MS = "discProgressMs"; + + @Override + public String[] getInfoData() { + return new String[] { "Jukebox UUID: " + ((jukeboxUuid == UNSET_UUID) ? "unset" : jukeboxUuid), + "Loop mode: " + loopMode, "Shuffle mode: " + shuffleMode, "Played the disc for [ms]: " + discProgressMs, + "Current disc duration [ms]: " + discDurationMs, + "Playback range [blocks]: " + BalanceMath.volumeToAttenuationDistance(playbackVolume), + "P2P range [blocks]: " + BalanceMath.volumeToAttenuationDistance(playbackVolume), + "Raw playback strength: " + playbackVolume, "Raw p2p strength: " + p2pVolume }; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (jukeboxUuid != UNSET_UUID) { + aNBT.setLong(NBTKEY_UUID_LOW, jukeboxUuid.getLeastSignificantBits()); + aNBT.setLong(NBTKEY_UUID_HIGH, jukeboxUuid.getMostSignificantBits()); + aNBT.setBoolean(NBTKEY_LOOP_MODE, loopMode); + aNBT.setBoolean(NBTKEY_SHUFFLE_MODE, shuffleMode); + aNBT.setInteger(NBTKEY_PLAYBACK_SLOT, playbackSlot); + aNBT.setFloat(NBTKEY_VOLUME_PLAY, playbackVolume); + aNBT.setFloat(NBTKEY_VOLUME_P2P, p2pVolume); + aNBT.setLong(NBTKEY_DISC_PROGRESS_MS, discProgressMs); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey(NBTKEY_UUID_LOW, Constants.NBT.TAG_ANY_NUMERIC) + && aNBT.hasKey(NBTKEY_UUID_HIGH, Constants.NBT.TAG_ANY_NUMERIC)) { + jukeboxUuid = new UUID(aNBT.getLong(NBTKEY_UUID_HIGH), aNBT.getLong(NBTKEY_UUID_LOW)); + } + if (aNBT.hasKey(NBTKEY_LOOP_MODE, Constants.NBT.TAG_ANY_NUMERIC)) { + loopMode = aNBT.getBoolean(NBTKEY_LOOP_MODE); + } + if (aNBT.hasKey(NBTKEY_SHUFFLE_MODE, Constants.NBT.TAG_ANY_NUMERIC)) { + shuffleMode = aNBT.getBoolean(NBTKEY_SHUFFLE_MODE); + } + if (aNBT.hasKey(NBTKEY_PLAYBACK_SLOT, Constants.NBT.TAG_ANY_NUMERIC)) { + playbackSlot = aNBT.getInteger(NBTKEY_PLAYBACK_SLOT); + } + if (aNBT.hasKey(NBTKEY_VOLUME_PLAY, Constants.NBT.TAG_ANY_NUMERIC)) { + playbackVolume = aNBT.getFloat(NBTKEY_VOLUME_PLAY); + } + if (aNBT.hasKey(NBTKEY_VOLUME_P2P, Constants.NBT.TAG_ANY_NUMERIC)) { + p2pVolume = aNBT.getFloat(NBTKEY_VOLUME_P2P); + } + if (aNBT.hasKey(NBTKEY_DISC_PROGRESS_MS, Constants.NBT.TAG_ANY_NUMERIC)) { + discProgressMs = aNBT.getLong(NBTKEY_DISC_PROGRESS_MS); + } + + final float maxVolume = BalanceMath.listeningVolume(mTier); + playbackVolume = MathHelper.clamp_float(playbackVolume, 0.0f, maxVolume); + p2pVolume = MathHelper.clamp_float(p2pVolume, 0.0f, maxVolume); + } + + @Override + protected BasicUIProperties getUIProperties() { + return super.getUIProperties().toBuilder() + .itemInputPositionsGetter(count -> UIHelper.getGridPositions(count, 7, 6, 7, 3)) + .itemOutputPositionsGetter(count -> UIHelper.getGridPositions(count, 153, 24, 1)) + .specialItemPositionGetter(() -> new Pos2d(115, 62)) + .progressBarPos(Pos2d.cartesian(133, 24)) + .progressBarTexture(new FallbackableUITexture(GTUITextures.PROGRESSBAR_ARROW)) + .build(); + } + + @Override + protected void addProgressBar(ModularWindow.Builder builder, BasicUIProperties uiProperties) { + builder.widget( + setNEITransferRect( + new ProgressBar().setProgress(() -> discProgressMs / (float) Math.max(1, discDurationMs)) + .setTexture(uiProperties.progressBarTexture.get(), uiProperties.progressBarImageSize) + .setDirection(uiProperties.progressBarDirection) + .setPos(uiProperties.progressBarPos) + .setSize(uiProperties.progressBarSize) + .setUpdateTooltipEveryTick(true) + .attachSyncer( + new FakeSyncWidget.LongSyncer(() -> this.discProgressMs, val -> this.discProgressMs = val), + builder) + .attachSyncer( + new FakeSyncWidget.LongSyncer(() -> this.discDurationMs, val -> this.discDurationMs = val), + builder) + .dynamicTooltip( + () -> Collections.singletonList( + String.format("%,.2f / %,.2f", discProgressMs / 1000.0f, discDurationMs / 1000.0f))), + uiProperties.neiTransferRectId)); + addProgressBarSpecialTextures(builder, uiProperties); + } + + @Override + protected SlotWidget createChargerSlot(int x, int y) { + return super.createChargerSlot(97, 62); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + final BasicUIProperties props = getUIProperties(); + final List inputSlots = props.itemInputPositionsGetter.apply(mInputSlotCount); + // Loop + builder.widget( + new CycleButtonWidget().setToggle(() -> loopMode, val -> loopMode = val) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_CYCLIC) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.betterjukebox.loop.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(153, 6) + .setSize(18, 18)); + // Shuffle + builder.widget(new CycleButtonWidget().setToggle(() -> shuffleMode, val -> { + shuffleMode = val; + if (shuffleMode) { + playbackSlot = -1; + } else { + playbackSlot = 0; + } + }) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_SHUFFLE) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.betterjukebox.shuffle.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(153, 42) + .setSize(18, 18)); + // Currently playing slot highlight using the hotbar active texture + final DrawableWidget slotHighlight = new DrawableWidget(); + builder.widget( + slotHighlight + .setDrawable( + new UITexture( + new ResourceLocation("minecraft", "textures/gui/widgets.png"), + 0.0f, + 22.0f / 256.0f, + 24.0f / 256.0f, + 46.0f / 256.0f)) + .setSize(24, 24) + .attachSyncer(new FakeSyncWidget.IntegerSyncer(() -> this.playbackSlot, val -> { + this.playbackSlot = val; + slotHighlight.checkNeedsRebuild(); + }), builder) + .setPosProvider( + (screenSize, window, parent) -> inputSlots.get(MathHelper.clamp_int(playbackSlot, 0, INPUT_SLOTS)) + .add(-3, -3))); + // Attenuation distance (controls internal "volume") + // Caching tooltip data caches the formatted p2p range value, so we have to use the uncached variant here. + builder.widget( + new SliderWidget() + .setBounds(0.0f, BalanceMath.volumeToAttenuationDistance(BalanceMath.listeningVolume(mTier))) + .setGetter(this::getPlaybackBlockRange) + .setSetter(this::setPlaybackBlockRange) + .dynamicTooltip( + () -> mTooltipCache.getUncachedTooltipData( + "GT5U.machines.betterjukebox.attenuationDistance.tooltip", + (int) getPlaybackBlockRange()).text) + .setUpdateTooltipEveryTick(true) + .setPos(44, 63) + .setSize(52, 8)); + builder.widget( + new SliderWidget() + .setBounds(0.0f, BalanceMath.volumeToAttenuationDistance(BalanceMath.listeningVolume(mTier))) + .setGetter(this::getP2PBlockRange) + .setSetter(this::setP2PBlockRange) + .dynamicTooltip( + () -> mTooltipCache.getUncachedTooltipData( + "GT5U.machines.betterjukebox.p2pAttenuationDistance.tooltip", + (int) getP2PBlockRange()).text) + .setUpdateTooltipEveryTick(true) + .setPos(44, 71) + .setSize(52, 8)); + } + + private float getPlaybackBlockRange() { + return BalanceMath.volumeToAttenuationDistance(playbackVolume); + } + + private float getP2PBlockRange() { + return BalanceMath.volumeToAttenuationDistance(p2pVolume); + } + + private void setPlaybackBlockRange(float blockRange) { + float volume = BalanceMath.attenuationDistanceToVolume(blockRange); + volume = MathHelper.clamp_float(volume, 0.0f, BalanceMath.listeningVolume(mTier)); + if (volume != playbackVolume) { + playbackVolume = volume; + if (getBaseMetaTileEntity().isServerSide()) { + updateEmitterList(); + } + } + } + + private void setP2PBlockRange(float blockRange) { + float volume = BalanceMath.attenuationDistanceToVolume(blockRange); + volume = MathHelper.clamp_float(volume, 0.0f, BalanceMath.listeningVolume(mTier)); + if (volume != p2pVolume) { + p2pVolume = volume; + if (getBaseMetaTileEntity().isServerSide()) { + updateEmitterList(); + } + } + } + + private final EnumMap attachedSoundP2P = new EnumMap<>(ForgeDirection.class); + private final ObjectArrayList combinedOutputsListCache = new ObjectArrayList<>(new PartP2PSound[0]); + + private void updateEmitterList() { + final GTMusicSystem.MusicSource target = musicSource; + if (target == null) { + return; + } + final ObjectArrayList emitters = combinedOutputsListCache; + emitters.clear(); + + attachedSoundP2P.forEach((ignored, p2p) -> { + if (p2p != null) { + try { + p2p.getOutputs() + .forEach(emitters::add); + } catch (GridAccessException e) { + // skip + } + } + }); + + IGregTechTileEntity te = getBaseMetaTileEntity(); + if (te == null) { + return; + } + final Vector4i position = new Vector4i(); + target.resizeEmitterArray(1 + emitters.size()); + position.set(te.getXCoord(), te.getYCoord(), te.getZCoord(), te.getWorld().provider.dimensionId); + final float actualVolume = MathHelper + .clamp_float(playbackVolume, 0.0f, BalanceMath.listeningVolume(powered ? mTier : 0)); + target.setEmitter(0, position, actualVolume); + final float actualP2PVolume = MathHelper + .clamp_float(p2pVolume, 0.0f, powered ? BalanceMath.listeningVolume(mTier) : 0.0f); + for (int i = 0; i < emitters.size(); i++) { + final PartP2PSound p2p = emitters.get(i); + final AENetworkProxy proxy = p2p.getProxy(); + final TileEntity emitterTe = p2p.getTile(); + final ForgeDirection dir = p2p.getSide(); + position.set( + emitterTe.xCoord + dir.offsetX, + emitterTe.yCoord + dir.offsetY, + emitterTe.zCoord + dir.offsetZ, + emitterTe.getWorldObj().provider.dimensionId); + final boolean active = proxy.isActive(); + target.setEmitter(1 + i, position, active ? actualP2PVolume : 0); + } + } + + @Override + public boolean allowSoundProxying(PartP2PSound p2p) { + return false; // the jukebox proxies sounds by itself + } + + @Override + public void onSoundP2PAttach(PartP2PSound p2p) { + attachedSoundP2P.put(p2p.getSide(), p2p); + updateEmitterList(); + } + + @Override + public void onSoundP2PDetach(PartP2PSound p2p) { + attachedSoundP2P.put(p2p.getSide(), null); + updateEmitterList(); + } + + @Override + public void onSoundP2POutputUpdate(PartP2PSound p2p, TunnelCollection outputs) { + updateEmitterList(); + } + +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEBoxinator.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEBoxinator.java new file mode 100644 index 0000000000..43d2d6b295 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEBoxinator.java @@ -0,0 +1,231 @@ +package gregtech.common.tileentities.machines.basic; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.MachineType; +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.MTEBasicMachine; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class MTEBoxinator extends MTEBasicMachine { + + ItemStack aInputCache; + ItemStack aOutputCache; + int aTypeCache = 0; + + public MTEBoxinator(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + MachineType.PACKAGER.tooltipDescription(), + 2, + 1, + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_SIDE_BOXINATOR_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_FRONT_BOXINATOR_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_TOP_BOXINATOR_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon("basicmachines/boxinator/OVERLAY_BOTTOM_BOXINATOR_GLOW")) + .glow() + .build())); + } + + public MTEBoxinator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, 2, 1); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBoxinator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.packagerRecipes; + } + + private boolean hasValidCache(ItemStack mItem, int mType, boolean mClearOnFailure) { + if (aInputCache != null && aOutputCache != null + && aTypeCache == mType + && aInputCache.isItemEqual(mItem) + && ItemStack.areItemStackTagsEqual(mItem, aInputCache)) return true; + // clear cache if it was invalid + if (mClearOnFailure) { + aInputCache = null; + aOutputCache = null; + aTypeCache = 0; + } + return false; + } + + private void cacheItem(ItemStack mInputItem, ItemStack mOutputItem, int mType) { + aTypeCache = mType; + aOutputCache = mOutputItem.copy(); + aInputCache = mInputItem.copy(); + } + + @Override + public int checkRecipe() { + int tCheck = super.checkRecipe(); + if (tCheck != DID_NOT_FIND_RECIPE) { + return tCheck; + } + ItemStack tSlot0 = getInputAt(0); + ItemStack tSlot1 = getInputAt(1); + if ((GTUtility.isStackValid(tSlot0)) && (GTUtility.isStackValid(tSlot1)) + && (GTUtility.getContainerItem(tSlot0, true) == null)) { + if ((ItemList.Schematic_1by1.isStackEqual(tSlot1)) && (tSlot0.stackSize >= 1)) { + boolean tIsCached = hasValidCache(tSlot0, 1, true); + this.mOutputItems[0] = tIsCached ? aOutputCache.copy() : GTModHandler.getRecipeOutput(tSlot0); + if (this.mOutputItems[0] != null) { + if (canOutput(this.mOutputItems[0])) { + tSlot0.stackSize -= 1; + calculateOverclockedNess(30, 16); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 1); + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + } + return DID_NOT_FIND_RECIPE; + } + if ((ItemList.Schematic_2by2.isStackEqual(tSlot1)) && (getInputAt(0).stackSize >= 4)) { + boolean tIsCached = hasValidCache(tSlot0, 2, true); + this.mOutputItems[0] = tIsCached ? aOutputCache.copy() + : GTModHandler.getRecipeOutput(tSlot0, tSlot0, null, tSlot0, tSlot0); + if (this.mOutputItems[0] != null) { + if (canOutput(this.mOutputItems[0])) { + getInputAt(0).stackSize -= 4; + calculateOverclockedNess(30, 32); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 2); + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + } + return DID_NOT_FIND_RECIPE; + } + if ((ItemList.Schematic_3by3.isStackEqual(tSlot1)) && (getInputAt(0).stackSize >= 9)) { + boolean tIsCached = hasValidCache(tSlot0, 3, true); + this.mOutputItems[0] = tIsCached ? aOutputCache.copy() + : GTModHandler + .getRecipeOutput(tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0); + if (this.mOutputItems[0] != null) { + if (canOutput(this.mOutputItems[0])) { + getInputAt(0).stackSize -= 9; + calculateOverclockedNess(30, 64); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 3); + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + } + return DID_NOT_FIND_RECIPE; + } + } + return DID_NOT_FIND_RECIPE; + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (!super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)) { + return false; + } + ItemStack tInput1 = getInputAt(1); + if ((ItemList.Schematic_1by1.isStackEqual(tInput1)) || (ItemList.Schematic_2by2.isStackEqual(tInput1)) + || (ItemList.Schematic_3by3.isStackEqual(tInput1))) { + if (hasValidCache(aStack, aTypeCache, false)) return true; + if (RecipeMaps.packagerRecipes.findRecipe( + getBaseMetaTileEntity(), + true, + GTValues.V[mTier], + null, + GTUtility.copyAmount(64, aStack), + tInput1) != null) { + return true; + } + if (ItemList.Schematic_1by1.isStackEqual(getInputAt(1)) && GTModHandler.getRecipeOutput(aStack) != null) + return true; + if (ItemList.Schematic_2by2.isStackEqual(getInputAt(1)) + && GTModHandler.getRecipeOutput(aStack, aStack, null, aStack, aStack) != null) { + return true; + } + return ItemList.Schematic_3by3.isStackEqual(getInputAt(1)) + && (GTModHandler.getRecipeOutput(aStack, aStack, aStack, aStack, aStack, aStack, aStack, aStack, aStack) + != null); + } else { + return RecipeMaps.packagerRecipes.containsInput(aStack); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTECharger.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTECharger.java new file mode 100644 index 0000000000..52c15cc6df --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTECharger.java @@ -0,0 +1,107 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicBatteryBuffer; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class MTECharger extends MTEBasicBatteryBuffer { + + public MTECharger(int aID, String aName, String aNameRegional, int aTier, String aDescription, int aSlotCount) { + super(aID, aName, aNameRegional, aTier, aDescription, aSlotCount); + } + + public MTECharger(String aName, int aTier, String aDescription, ITexture[][][] aTextures, int aSlotCount) { + super(aName, aTier, aDescription, aTextures, aSlotCount); + } + + public MTECharger(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, int aSlotCount) { + super(aName, aTier, aDescription, aTextures, aSlotCount); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTECharger(mName, mTier, mDescriptionArray, mTextures, mInventory.length); + } + + @Override + public long getMinimumStoredEU() { + return V[mTier] * 64L * mInventory.length; + } + + @Override + public long maxEUStore() { + return V[mTier] * 256L * mInventory.length; + } + + @Override + public long maxAmperesIn() { + return Math.max(mChargeableCount * 8L, 4L); + } + + @Override + public long maxAmperesOut() { + return Math.max(mBatteryCount * 4L, 2L); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (this.getBaseMetaTileEntity() instanceof BaseMetaTileEntity) { + BaseMetaTileEntity mBaseMetaTileEntity = (BaseMetaTileEntity) getBaseMetaTileEntity(); + if (mBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity mMetaTileEntity) { + // for (int t = 0; t < 6; t++) { + if (mMetaTileEntity.dechargerSlotCount() > 0 + && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { + for (int i = mMetaTileEntity.dechargerSlotStartIndex(), + k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) { + if (mMetaTileEntity.mInventory[i] != null + && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { + mBaseMetaTileEntity.increaseStoredEnergyUnits( + GTModHandler.dischargeElectricItem( + mMetaTileEntity.mInventory[i], + GTUtility.safeInt( + Math.min( + V[mTier] * 15, + mBaseMetaTileEntity.getEUCapacity() + - mBaseMetaTileEntity.getStoredEU())), + (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()), + true, + false, + false), + true); + if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null; + } + } + } + if (mMetaTileEntity.rechargerSlotCount() > 0 && mBaseMetaTileEntity.getStoredEU() > 0) { + for (int i = mMetaTileEntity.rechargerSlotStartIndex(), + k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) { + if (mBaseMetaTileEntity.getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) { + mBaseMetaTileEntity + .decreaseStoredEU( + GTModHandler.chargeElectricItem( + mMetaTileEntity.mInventory[i], + GTUtility + .safeInt(Math.min(V[mTier] * 15, mBaseMetaTileEntity.getStoredEU())), + (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getOutputTier()), + true, + false), + true); + if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null; + } + } + // } + } + } + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEIndustrialApiary.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEIndustrialApiary.java new file mode 100644 index 0000000000..f43c8d0a5e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEIndustrialApiary.java @@ -0,0 +1,1554 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.AuthorKuba; +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW; +import static gregtech.api.metatileentity.BaseTileEntity.STALLED_STUTTERING_TOOLTIP; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GTUtility.moveMultipleItemStacks; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.collect.ImmutableSet; +import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularUIContext; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.builder.UIInfo; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.mojang.authlib.GameProfile; + +import forestry.api.apiculture.BeeManager; +import forestry.api.apiculture.EnumBeeChromosome; +import forestry.api.apiculture.EnumBeeType; +import forestry.api.apiculture.FlowerManager; +import forestry.api.apiculture.IAlleleBeeAcceleratableEffect; +import forestry.api.apiculture.IAlleleBeeEffect; +import forestry.api.apiculture.IAlleleBeeSpecies; +import forestry.api.apiculture.IApiaristTracker; +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IBeeGenome; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeeHousingInventory; +import forestry.api.apiculture.IBeeListener; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.IBeeRoot; +import forestry.api.apiculture.IBeekeepingLogic; +import forestry.api.apiculture.IBeekeepingMode; +import forestry.api.arboriculture.EnumGermlingType; +import forestry.api.core.BiomeHelper; +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; +import forestry.api.core.ForestryAPI; +import forestry.api.core.IErrorLogic; +import forestry.api.core.IErrorState; +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IEffectData; +import forestry.api.genetics.IIndividual; +import forestry.apiculture.genetics.Bee; +import forestry.apiculture.genetics.alleles.AlleleEffectThrottled; +import forestry.core.errors.EnumErrorCode; +import forestry.plugins.PluginApiculture; +import gregtech.GTMod; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEBasicMachine; +import gregtech.api.recipe.BasicUIProperties; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTApiaryModifier; +import gregtech.api.util.GTApiaryUpgrade; +import gregtech.api.util.GTUtility; +import gregtech.common.GTClient; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEIndustrialApiary extends MTEBasicMachine + implements IBeeHousing, IBeeHousingInventory, IErrorLogic, IBeeModifier, IBeeListener, IAddUIWidgets { + + public static final int beeCycleLength = 550; + public static final int baseEUtUsage = 37; + private static final int queen = 5; + private static final int drone = 6; + private static final int upgradeSlot = drone + 1; + private static final int upgradeSlotCount = 4; + private static Field AlleleBeeEffectThrottledField; + + final IBeeRoot beeRoot = (IBeeRoot) AlleleManager.alleleRegistry.getSpeciesRoot("rootBees"); + + public int mSpeed = 0; + public boolean mLockedSpeed = true; + public boolean mAutoQueen = true; + + private ItemStack usedQueen = null; + private IBee usedQueenBee = null; + private IEffectData[] effectData = new IEffectData[2]; + + public MTEIndustrialApiary(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 4, + new String[] { "BEES GOES BRRRR", EnumChatFormatting.GRAY + AuthorKuba, + "Effective production chance as a percent is", "2.8 * b^0.52 * (p + t)^0.52 * s^0.37", + "where b is the base production chance as a percent,", + "p is the production modifier (2 w/o upgrades, or 4 * 1.2^n with n production upgrades),", + "t is 8 for the industrial apiary, and", "s is the speed value for the bee", + "Outputs are generated at the end of every bee tick (...)", + "Primary outputs are rolled once with base chance, once with half base" }, + 6, + 9, + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_INDUSTRIAL_APIARY), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_INDUSTRIAL_APIARY), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_INDUSTRIAL_APIARY), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_INDUSTRIAL_APIARY), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW) + .glow() + .build())); + } + + public MTEIndustrialApiary(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures, 6, 9); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEIndustrialApiary(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) return true; + if (!GTMod.gregtechproxy.mForceFreeFace) { + openGUI(aBaseMetaTileEntity, aPlayer); + return true; + } + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (aBaseMetaTileEntity.getAirAtSide(side)) { + openGUI(aBaseMetaTileEntity, aPlayer); + return true; + } + } + GTUtility.sendChatToPlayer(aPlayer, "No free Side!"); + return true; + } + + private void openGUI(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + IndustrialApiaryUI.open( + aPlayer, + aBaseMetaTileEntity.getWorld(), + aBaseMetaTileEntity.getXCoord(), + aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord()); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("mSpeed", mSpeed); + aNBT.setBoolean("mLockedSpeed", mLockedSpeed); + aNBT.setBoolean("mAutoQueen", mAutoQueen); + if (usedQueen != null) aNBT.setTag("usedQueen", usedQueen.writeToNBT(new NBTTagCompound())); + aNBT.setBoolean("retrievingPollenInThisOperation", retrievingPollenInThisOperation); + aNBT.setInteger("pollinationDelay", pollinationDelay); + aNBT.setFloat("usedBeeLife", usedBeeLife); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mSpeed = aNBT.getInteger("mSpeed"); + mLockedSpeed = aNBT.getBoolean("mLockedSpeed"); + if (aNBT.hasKey("mAutoQueen")) mAutoQueen = aNBT.getBoolean("mAutoQueen"); + if (aNBT.hasKey("usedQueen")) usedQueen = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("usedQueen")); + retrievingPollenInThisOperation = aNBT.getBoolean("retrievingPollenInThisOperation"); + pollinationDelay = aNBT.getInteger("pollinationDelay"); + usedBeeLife = aNBT.getFloat("usedBeeLife"); + } + + boolean retrievingPollenInThisOperation = false; + IIndividual retrievedpollen = null; + int pollinationDelay = 100; + float usedBeeLife = 0f; + + @Override + public int checkRecipe() { + updateModifiers(); + if (canWork()) { + + final ItemStack queen = getQueen(); + usedQueen = queen.copy(); + if (beeRoot.getType(queen) == EnumBeeType.QUEEN) { + final IBee bee = beeRoot.getMember(queen); + usedQueenBee = bee; + + // LIFE CYCLES + + float mod = this.getLifespanModifier(null, null, 1.f); + final IBeekeepingMode mode = beeRoot.getBeekeepingMode(this.getWorld()); + final IBeeModifier beemodifier = mode.getBeeModifier(); + mod *= beemodifier.getLifespanModifier(null, null, 1.f); + final int h = bee.getHealth(); + mod = 1.f / mod; + final float cycles = h / mod; + + // PRODUCTS + + final HashMap pollen = new HashMap<>(); + + if (isRetrievingPollen && floweringMod > 0f) { + final int icycles = (int) cycles + + (getWorld().rand.nextFloat() < (cycles - (float) ((int) cycles)) ? 1 : 0); + for (int z = 0; z < icycles; z++) { + final IIndividual p = bee.retrievePollen(this); + if (p != null) { + final ItemStack s = p.getGenome() + .getSpeciesRoot() + .getMemberStack(p, EnumGermlingType.POLLEN.ordinal()); + if (s != null) { + final GTUtility.ItemId id = GTUtility.ItemId.createNoCopy(s); + pollen.computeIfAbsent(id, k -> { + final ItemStack ns = s.copy(); + ns.stackSize = 0; + return ns; + }); + pollen.get(id).stackSize += s.stackSize; + } + } + } + } + + retrievedpollen = null; + retrievingPollenInThisOperation = isRetrievingPollen; + + final IBeeGenome genome = bee.getGenome(); + final IAlleleBeeSpecies primary = genome.getPrimary(); + final IAlleleBeeSpecies secondary = genome.getSecondary(); + + final float speed = genome.getSpeed(); + final float prodMod = getProductionModifier(null, 0f) + beemodifier.getProductionModifier(null, 0f); + + final HashMap drops = new HashMap<>(); + final HashMap dropstacks = new HashMap<>(); + + for (Map.Entry entry : primary.getProductChances() + .entrySet()) { + final GTUtility.ItemId id = GTUtility.ItemId.createNoCopy(entry.getKey()); + drops.merge( + id, + Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f) * (float) entry.getKey().stackSize + * cycles, + Float::sum); + dropstacks.computeIfAbsent(id, k -> entry.getKey()); + } + for (Map.Entry entry : secondary.getProductChances() + .entrySet()) { + final GTUtility.ItemId id = GTUtility.ItemId.createNoCopy(entry.getKey()); + drops.merge( + id, + Bee.getFinalChance(entry.getValue() / 2f, speed, prodMod, 8f) * (float) entry.getKey().stackSize + * cycles, + Float::sum); + dropstacks.computeIfAbsent(id, k -> entry.getKey()); + } + if (primary.isJubilant(genome, this) && secondary.isJubilant(genome, this)) + for (Map.Entry entry : primary.getSpecialtyChances() + .entrySet()) { + final GTUtility.ItemId id = GTUtility.ItemId.createNoCopy(entry.getKey()); + drops.merge( + id, + Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f) + * (float) entry.getKey().stackSize + * cycles, + Float::sum); + dropstacks.computeIfAbsent(id, k -> entry.getKey()); + } + + int i = 0; + final int imax = mOutputItems.length; + + final IApiaristTracker breedingTracker = beeRoot.getBreedingTracker(getWorld(), getOwner()); + + if (!bee.canSpawn()) { + final ItemStack convert = new ItemStack(PluginApiculture.items.beePrincessGE); + final NBTTagCompound nbttagcompound = new NBTTagCompound(); + queen.writeToNBT(nbttagcompound); + convert.setTagCompound(nbttagcompound); + this.mOutputItems[i++] = convert; + } else { + final IBee b = bee.spawnPrincess(this); + if (b != null) { + final ItemStack princess = beeRoot.getMemberStack(b, EnumBeeType.PRINCESS.ordinal()); + breedingTracker.registerPrincess(b); + this.mOutputItems[i++] = princess; + } + final IBee[] d = bee.spawnDrones(this); + if (d != null && d.length > 0) { + final HashMap drones = new HashMap<>(d.length); + for (IBee dr : d) { + final ItemStack drone = beeRoot.getMemberStack(dr, EnumBeeType.DRONE.ordinal()); + breedingTracker.registerDrone(dr); + final GTUtility.ItemId drid = GTUtility.ItemId.createNoCopy(drone); + if (drones.containsKey(drid)) drones.get(drid).stackSize += drone.stackSize; + else { + this.mOutputItems[i++] = drone; + drones.put(drid, drone); + } + } + } + } + + final int imin = i; + + setQueen(null); + + for (Map.Entry entry : drops.entrySet()) { + final ItemStack s = dropstacks.get(entry.getKey()) + .copy(); + s.stackSize = entry.getValue() + .intValue() + + (getWorld().rand.nextFloat() < (entry.getValue() - (float) entry.getValue() + .intValue()) ? 1 : 0); + if (s.stackSize > 0 && i < imax) while (true) { + if (s.stackSize <= s.getMaxStackSize()) { + this.mOutputItems[i++] = s; + break; + } else this.mOutputItems[i++] = s.splitStack(s.getMaxStackSize()); + if (i >= imax) break; + } + } + + for (ItemStack s : pollen.values()) if (i < imax) this.mOutputItems[i++] = s; + else break; + + // Overclock + + usedBeeLife = cycles * (float) beeCycleLength; + this.mMaxProgresstime = (int) usedBeeLife; + final int timemaxdivider = this.mMaxProgresstime / 100; + final int useddivider = 1 << this.mSpeed; + int actualdivider = useddivider; + this.mMaxProgresstime /= Math.min(actualdivider, timemaxdivider); + actualdivider /= Math.min(actualdivider, timemaxdivider); + for (i--; i >= imin; i--) this.mOutputItems[i].stackSize *= actualdivider; + + pollinationDelay = Math.max((int) (this.mMaxProgresstime / cycles), 20); // don't run too often + + this.mProgresstime = 0; + this.mEUt = (int) ((float) baseEUtUsage * this.energyMod * useddivider); + if (useddivider == 2) this.mEUt += 32; + else if (useddivider > 2) this.mEUt += (32 * (useddivider << (this.mSpeed - 2))); + } else { + // Breeding time + + retrievingPollenInThisOperation = true; // Don't pollinate when breeding + + this.mMaxProgresstime = 100; + this.mProgresstime = 0; + final int useddivider = Math.min(100, 1 << this.mSpeed); + this.mMaxProgresstime /= useddivider; + this.mEUt = (int) ((float) baseEUtUsage * this.energyMod * useddivider); + if (useddivider == 2) this.mEUt += 32; + else if (useddivider > 2) this.mEUt += (32 * (useddivider << (this.mSpeed - 2))); + + final IBee princess = beeRoot.getMember(getQueen()); + usedQueenBee = princess; + final IBee drone = beeRoot.getMember(getDrone()); + princess.mate(drone); + final NBTTagCompound nbttagcompound = new NBTTagCompound(); + princess.writeToNBT(nbttagcompound); + this.mOutputItems[0] = new ItemStack(PluginApiculture.items.beeQueenGE); + this.mOutputItems[0].setTagCompound(nbttagcompound); + beeRoot.getBreedingTracker(getWorld(), getOwner()) + .registerQueen(princess); + + setQueen(null); + getDrone().stackSize -= 1; + if (getDrone().stackSize == 0) setDrone(null); + } + + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + + return DID_NOT_FIND_RECIPE; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + updateModifiers(); + } + + @Override + protected boolean hasEnoughEnergyToCheckRecipe() { + return getBaseMetaTileEntity().isUniversalEnergyStored(V[mSpeed] * 8L); + } + + @Override + public long maxAmperesIn() { + return 4L; + } + + private void doEffect() { + final IBeeGenome genome = usedQueenBee.getGenome(); + final IAlleleBeeEffect effect = genome.getEffect(); + if (!(effect instanceof IAlleleBeeAcceleratableEffect)) { + effectData[0] = effect.validateStorage(effectData[0]); + effect.doEffect(genome, effectData[0], this); + } + + if (!effect.isCombinable()) return; + + final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); + if (!secondary.isCombinable()) return; + + if (!(secondary instanceof IAlleleBeeAcceleratableEffect)) { + effectData[1] = secondary.validateStorage(effectData[1]); + secondary.doEffect(genome, effectData[1], this); + } + } + + private void doAcceleratedEffects() { + final IBeeGenome genome = usedQueenBee.getGenome(); + final IAlleleBeeEffect effect = genome.getEffect(); + try { + if (AlleleBeeEffectThrottledField == null) { + AlleleBeeEffectThrottledField = AlleleEffectThrottled.class.getDeclaredField("throttle"); + AlleleBeeEffectThrottledField.setAccessible(true); + } + if (effect instanceof IAlleleBeeAcceleratableEffect) { + effectData[0] = effect.validateStorage(effectData[0]); + effectData[0] = ((IAlleleBeeAcceleratableEffect) effect).doEffectAccelerated( + genome, + effectData[0], + this, + usedBeeLife / (effect instanceof AlleleEffectThrottled + ? (float) AlleleBeeEffectThrottledField.getInt(effect) + : 1f)); + } + + if (!effect.isCombinable()) return; + + final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); + if (!secondary.isCombinable()) return; + + if (secondary instanceof IAlleleBeeAcceleratableEffect) { + effectData[1] = secondary.validateStorage(effectData[1]); + effectData[1] = ((IAlleleBeeAcceleratableEffect) secondary).doEffectAccelerated( + genome, + effectData[0], + this, + usedBeeLife / (secondary instanceof AlleleEffectThrottled + ? (float) AlleleBeeEffectThrottledField.getInt(secondary) + : 1f)); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isClientSide()) { + if (GTClient.changeDetected == 4) { + /* + * Client tick counter that is set to 5 on hiding pipes and covers. It triggers a texture update next + * client tick when reaching 4, with provision for 3 more update tasks, spreading client change + * detection related work and network traffic on different ticks, until it reaches 0. + */ + aBaseMetaTileEntity.issueTextureUpdate(); + } + if (aBaseMetaTileEntity.isActive()) { + if (usedQueen != null) { + if (aTick % 2 == 0) { + // FX on client, effect on server + final IBee bee = beeRoot.getMember(usedQueen); + effectData = bee.doFX(effectData, this); + } + } + } + } + if (aBaseMetaTileEntity.isServerSide()) { + + mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3; + mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3; + + doDisplayThings(); + + if (!aBaseMetaTileEntity.isActive()) { + if (aBaseMetaTileEntity.isAllowedToWork() + && (aBaseMetaTileEntity.hasInventoryBeenModified() || aTick % 600 == 0 + || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) + && hasEnoughEnergyToCheckRecipe()) { + final int check = checkRecipe(); + if (check == FOUND_AND_SUCCESSFULLY_USED_RECIPE) { + aBaseMetaTileEntity.setActive(true); + } + } + } else { + + if (this.mProgresstime < 0) { + this.mProgresstime++; + return; + } + if (this.mStuttering) { + if (!aBaseMetaTileEntity.isAllowedToWork()) return; + if (aTick % 100 == 0) this.mStuttering = false; + return; + } + if (this.hasErrors()) { + if (!aBaseMetaTileEntity.isAllowedToWork()) return; + if (aTick % 100 == 0) if (!canWork(usedQueen)) this.stutterProcess(); + return; + } + + if (!drainEnergyForProcess(this.mEUt)) { + this.mStuttering = true; + this.stutterProcess(); + return; + } + this.mProgresstime++; + if (usedQueen != null) { + if (usedQueenBee == null) usedQueenBee = beeRoot.getMember(usedQueen); + doEffect(); + if (!retrievingPollenInThisOperation && floweringMod > 0f + && this.mProgresstime % pollinationDelay == 0) { + if (retrievedpollen == null) retrievedpollen = usedQueenBee.retrievePollen(this); + if (retrievedpollen != null && (usedQueenBee.pollinateRandom(this, retrievedpollen) + || this.mProgresstime % (pollinationDelay * 5) == 0)) retrievedpollen = null; + } + } + + if (this.mProgresstime % 100 == 0) { + if (!canWork(usedQueen)) { + this.stutterProcess(); + return; + } + } + + if (this.mProgresstime >= this.mMaxProgresstime) { + if (usedQueenBee != null) doAcceleratedEffects(); + updateModifiers(); + for (int i = 0; i < mOutputItems.length; i++) + if (mOutputItems[i] != null) for (int j = 0; j < mOutputItems.length; j++) { + if (j == 0 && isAutomated) { + if (beeRoot.isMember(mOutputItems[i], EnumBeeType.QUEEN.ordinal()) + || beeRoot.isMember(mOutputItems[i], EnumBeeType.PRINCESS.ordinal())) { + if (aBaseMetaTileEntity.addStackToSlot(queen, mOutputItems[i])) break; + } else if (beeRoot.isMember(mOutputItems[i], EnumBeeType.DRONE.ordinal())) + if (aBaseMetaTileEntity.addStackToSlot(drone, mOutputItems[i])) break; + } else if (mAutoQueen && i == 0 + && j == 0 + && beeRoot.isMember(mOutputItems[0], EnumBeeType.QUEEN.ordinal()) + && aBaseMetaTileEntity.addStackToSlot(queen, mOutputItems[0])) break; + if (aBaseMetaTileEntity + .addStackToSlot(getOutputSlot() + ((j + i) % mOutputItems.length), mOutputItems[i])) + break; + } + Arrays.fill(mOutputItems, null); + mEUt = 0; + mProgresstime = 0; + mMaxProgresstime = 0; + mStuttering = false; + aBaseMetaTileEntity.setActive(false); + + if (doesAutoOutput() && !isOutputEmpty() && aBaseMetaTileEntity.getFrontFacing() != mMainFacing) { + final TileEntity tTileEntity2 = aBaseMetaTileEntity + .getTileEntityAtSide(aBaseMetaTileEntity.getFrontFacing()); + final long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored(); + int tMaxStacks = (int) (tStoredEnergy / 64L); + if (tMaxStacks > mOutputItems.length) tMaxStacks = mOutputItems.length; + + moveMultipleItemStacks( + aBaseMetaTileEntity, + tTileEntity2, + aBaseMetaTileEntity.getFrontFacing(), + aBaseMetaTileEntity.getBackFacing(), + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1, + tMaxStacks); + } + + if (aBaseMetaTileEntity.isAllowedToWork() && checkRecipe() == FOUND_AND_SUCCESSFULLY_USED_RECIPE) + aBaseMetaTileEntity.setActive(true); + } + } + } + } + + public void cancelProcess() { + if (this.getBaseMetaTileEntity() + .isActive() + && this.getBaseMetaTileEntity() + .isServerSide() + && usedQueen != null + && beeRoot.isMember(usedQueen, EnumBeeType.QUEEN.ordinal())) { + Arrays.fill(mOutputItems, null); + mEUt = 0; + mProgresstime = 0; + mMaxProgresstime = 0; + mStuttering = false; + this.getBaseMetaTileEntity() + .setActive(false); + setQueen(usedQueen); + this.getBaseMetaTileEntity() + .disableWorking(); + } + } + + @Override + public boolean isItemValidForSlot(int aIndex, ItemStack aStack) { + if (aStack == null) return false; + if (aIndex < getInputSlot()) return true; + if (aIndex == queen) return beeRoot.isMember(aStack, EnumBeeType.QUEEN.ordinal()) + || beeRoot.isMember(aStack, EnumBeeType.PRINCESS.ordinal()); + else if (aIndex == drone) return beeRoot.isMember(aStack, EnumBeeType.DRONE.ordinal()); + else if (aIndex < getOutputSlot()) { + if (!GTApiaryUpgrade.isUpgrade(aStack)) return false; + for (int i = upgradeSlot; i < upgradeSlot + upgradeSlotCount; i++) { + if (aIndex == i) continue; + final ItemStack s = getStackInSlot(i); + if (s == null) continue; + if (GTUtility.areStacksEqual(getStackInSlot(i), aStack)) return false; + if (GTApiaryUpgrade.isUpgrade(aStack)) { + if (!GTApiaryUpgrade.getUpgrade(aStack) + .isAllowedToWorkWith(getStackInSlot(i))) return false; + } else if (GTApiaryUpgrade.isUpgrade(s)) { + if (!GTApiaryUpgrade.getUpgrade(s) + .isAllowedToWorkWith(aStack)) return false; + } + } + return true; + } else return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (!super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) return false; + return isItemValidForSlot(aIndex, aStack); + } + + @Override + public void setInventorySlotContents(int aIndex, ItemStack aStack) { + if (aIndex == queen && aStack != null && getBaseMetaTileEntity().isClientSide()) usedQueen = aStack.copy(); + super.setInventorySlotContents(aIndex, aStack); + } + + // Gets called on slot click // + public void onInventoryUpdate(int aIndex) { + if (aIndex > drone && aIndex < getOutputSlot()) updateModifiers(); + } + + public ItemStack getUsedQueen() { + return usedQueen; + } + + // region IBeeHousing + + @Override + public Iterable getBeeModifiers() { + return Collections.singletonList(this); + } + + @Override + public Iterable getBeeListeners() { + return Collections.singletonList(this); + } + + @Override + public IBeeHousingInventory getBeeInventory() { + return this; + } + + @Override + public IBeekeepingLogic getBeekeepingLogic() { + return dummylogic; + } + + @Override + public int getBlockLightValue() { + return this.getBaseMetaTileEntity() + .getLightLevelAtSide(ForgeDirection.UP); + } + + @Override + public boolean canBlockSeeTheSky() { + return this.getBaseMetaTileEntity() + .getSkyAtSide(ForgeDirection.UP); + } + + @Override + public World getWorld() { + return this.getBaseMetaTileEntity() + .getWorld(); + } + + GameProfile owner = null; + + @Override + public GameProfile getOwner() { + if (owner == null) owner = new GameProfile( + this.getBaseMetaTileEntity() + .getOwnerUuid(), + this.getBaseMetaTileEntity() + .getOwnerName()); + return owner; + } + + @Override + public Vec3 getBeeFXCoordinates() { + return Vec3.createVectorHelper( + getBaseMetaTileEntity().getXCoord() + 0.5, + getBaseMetaTileEntity().getYCoord() + 0.5, + getBaseMetaTileEntity().getZCoord() + 0.5); + } + + @Override + public BiomeGenBase getBiome() { + if (biomeOverride == null) return this.getBaseMetaTileEntity() + .getBiome(); + return biomeOverride; + } + + @Override + public EnumTemperature getTemperature() { + if (BiomeHelper.isBiomeHellish(getBiome())) return EnumTemperature.HELLISH; + return EnumTemperature.getFromValue(getBiome().temperature + temperatureMod); + } + + @Override + public EnumHumidity getHumidity() { + return EnumHumidity.getFromValue(getBiome().rainfall + humidityMod); + } + + @Override + public IErrorLogic getErrorLogic() { + return this; + } + + @Override + public ChunkCoordinates getCoordinates() { + return this.getBaseMetaTileEntity() + .getCoords(); + } + + // endregion + + // region IBeeHousingInventory + @Override + public ItemStack getQueen() { + return getStackInSlot(queen); + } + + @Override + public ItemStack getDrone() { + return getStackInSlot(drone); + } + + @Override + public void setQueen(ItemStack itemStack) { + setInventorySlotContents(queen, itemStack); + } + + @Override + public void setDrone(ItemStack itemStack) { + setInventorySlotContents(drone, itemStack); + } + + @Override + public boolean addProduct(ItemStack itemStack, boolean b) { + throw new RuntimeException("Should not happen :F"); + } + // endregion + + // region IErrorLogic + + public HashSet mErrorStates = new HashSet<>(); + + @Override + public boolean setCondition(boolean b, IErrorState iErrorState) { + if (b) mErrorStates.add(iErrorState); + else mErrorStates.remove(iErrorState); + return b; + } + + @Override + public boolean contains(IErrorState iErrorState) { + return mErrorStates.contains(iErrorState); + } + + @Override + public boolean hasErrors() { + return !mErrorStates.isEmpty(); + } + + @Override + public void clearErrors() { + mErrorStates.clear(); + } + + @Override + public void writeData(DataOutputStream dataOutputStream) throws IOException { + dataOutputStream.write(mErrorStates.size()); + for (IErrorState s : mErrorStates) dataOutputStream.writeUTF(s.getUniqueName()); + } + + @Override + public void readData(DataInputStream dataInputStream) throws IOException { + for (int i = dataInputStream.readInt(); i > 0; i--) + mErrorStates.add(ForestryAPI.errorStateRegistry.getErrorState(dataInputStream.readUTF())); + } + + @Override + public ImmutableSet getErrorStates() { + return ImmutableSet.copyOf(mErrorStates); + } + + private String flowerType = ""; + private ChunkCoordinates flowercoords = null; + private Block flowerBlock; + private int flowerBlockMeta; + + private boolean checkFlower(IBee bee) { + final String flowerType = bee.getGenome() + .getFlowerProvider() + .getFlowerType(); + if (!this.flowerType.equals(flowerType)) flowercoords = null; + if (flowercoords != null) { + if (getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ) != flowerBlock + || getWorld().getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ) + != flowerBlockMeta) + if (!FlowerManager.flowerRegistry + .isAcceptedFlower(flowerType, getWorld(), flowercoords.posX, flowercoords.posY, flowercoords.posZ)) + flowercoords = null; + else { + flowerBlock = getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ); + flowerBlockMeta = getWorld() + .getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ); + } + } + if (flowercoords == null) { + flowercoords = FlowerManager.flowerRegistry.getAcceptedFlowerCoordinates(this, bee, flowerType); + if (flowercoords != null) { + flowerBlock = getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ); + flowerBlockMeta = getWorld().getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ); + this.flowerType = flowerType; + } + } + return flowercoords != null; + } + + private boolean canWork(ItemStack queen) { + clearErrors(); + if (queen == null) return true; // Reloaded the chunk ? + if (beeRoot.isMember(queen, EnumBeeType.PRINCESS.ordinal())) return true; + final IBee bee = beeRoot.getMember(queen); + for (IErrorState err : bee.getCanWork(this)) setCondition(true, err); + setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER); + return !hasErrors(); + } + + private boolean canWork() { + clearErrors(); + final EnumBeeType beeType = beeRoot.getType(getQueen()); + if (beeType == EnumBeeType.PRINCESS) { + setCondition(!beeRoot.isDrone(getDrone()), EnumErrorCode.NO_DRONE); + return !hasErrors(); + } + if (beeType == EnumBeeType.QUEEN) { + final IBee bee = beeRoot.getMember(getQueen()); + for (IErrorState err : bee.getCanWork(this)) setCondition(true, err); + setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER); + return !hasErrors(); + } else { + setCondition(true, EnumErrorCode.NO_QUEEN); + return false; + } + } + + // endregion + + // region IBeeModifier + + private float terrorityMod = 1f; + private float mutationMod = 1f; + private float lifespanMod = 1f; + private float productionMod = 2f; + private float floweringMod = 1f; + private float geneticDecayMod = 1f; + private float energyMod = 1f; + private boolean sealedMod = false; + private boolean selfLightedMod = false; + private boolean selfUnlightedMod = false; + private boolean sunlightSimulatedMod = false; + private BiomeGenBase biomeOverride = null; + private float humidityMod = 0f; + private float temperatureMod = 0f; + private boolean isAutomated = false; + private boolean isRetrievingPollen = false; + private int maxspeed = 0; + + public void updateModifiers() { + final GTApiaryModifier mods = new GTApiaryModifier(); + for (int i = 0; i < upgradeSlotCount; i++) { + final ItemStack s = getStackInSlot(upgradeSlot + i); + if (s == null) continue; + if (GTApiaryUpgrade.isUpgrade(s)) { + final GTApiaryUpgrade upgrade = GTApiaryUpgrade.getUpgrade(s); + upgrade.applyModifiers(mods, s); + } + } + + terrorityMod = mods.territory; + mutationMod = mods.mutation; + lifespanMod = mods.lifespan; + productionMod = mods.production; + floweringMod = mods.flowering; + geneticDecayMod = mods.geneticDecay; + energyMod = mods.energy; + sealedMod = mods.isSealed; + selfLightedMod = mods.isSelfLighted; + selfUnlightedMod = mods.isSelfUnlighted; + sunlightSimulatedMod = mods.isSunlightSimulated; + biomeOverride = mods.biomeOverride; + humidityMod = mods.humidity; + temperatureMod = mods.temperature; + isAutomated = mods.isAutomated; + isRetrievingPollen = mods.isCollectingPollen; + maxspeed = mods.maxSpeed; + + if (mLockedSpeed) mSpeed = maxspeed; + else mSpeed = Math.min(mSpeed, maxspeed); + } + + /** Tries to move as much of [stack] into a possible upgrade slot */ + public void addUpgrade(ItemStack stack) { + if (stack == null || !GTApiaryUpgrade.isUpgrade(stack)) return; + + int amount = stack.stackSize; + for (int i = upgradeSlot; i < upgradeSlot + upgradeSlotCount; i++) { + if (!isItemValidForSlot(i, stack)) continue; + + int maxStackSize = GTApiaryUpgrade.getUpgrade(stack) + .getMaxNumber(); + ItemStack stackInSlot = getStackInSlot(i); + + // Push into empty slot + if (stackInSlot == null) { + amount = Math.min(amount, maxStackSize); + setInventorySlotContents(i, stack.splitStack(amount)); + return; + } + + if (!GTUtility.areStacksEqual(stack, stackInSlot)) continue; + amount = Math.max(Math.min(amount, maxStackSize - stackInSlot.stackSize), 0); + if (amount == 0) return; + stackInSlot.stackSize += amount; + stack.stackSize -= amount; + return; + } + } + + /** Returns installed upgrade in slot 0 <= [index] < getMaxUpgradeCount() */ + public ItemStack getUpgrade(int index) { + if (index < 0 || index >= upgradeSlotCount) return null; + return getStackInSlot(upgradeSlot + index); + } + + /** Tries to remove [amount] or less of the upgrade installed in slot [index]. Returns the removed ItemStack */ + public ItemStack removeUpgrade(int index, int amount) { + if (index < 0 || index >= upgradeSlotCount || amount <= 0) return null; + + ItemStack stackInSlot = getUpgrade(index); + if (stackInSlot == null) return null; + + amount = Math.min(amount, stackInSlot.stackSize); + ItemStack result = stackInSlot.splitStack(amount); + if (stackInSlot.stackSize <= 0) setInventorySlotContents(upgradeSlot + index, null); + return result; + } + + public static int getMaxUpgradeCount() { + return upgradeSlotCount; + } + + @Override + public float getTerritoryModifier(IBeeGenome iBeeGenome, float v) { + return Math.min(5, terrorityMod); + } + + @Override + public float getMutationModifier(IBeeGenome iBeeGenome, IBeeGenome iBeeGenome1, float v) { + return mutationMod; + } + + @Override + public float getLifespanModifier(IBeeGenome iBeeGenome, IBeeGenome iBeeGenome1, float v) { + return lifespanMod; + } + + @Override + public float getProductionModifier(IBeeGenome iBeeGenome, float v) { + return productionMod; + } + + @Override + public float getFloweringModifier(IBeeGenome iBeeGenome, float v) { + return floweringMod; + } + + @Override + public float getGeneticDecay(IBeeGenome iBeeGenome, float v) { + return geneticDecayMod; + } + + public float getEnergyModifier() { + return energyMod; + } + + @Override + public boolean isSealed() { + return sealedMod; + } + + @Override + public boolean isSelfLighted() { + return selfLightedMod; + } + + @Override + public boolean isSelfUnlighted() { + return selfUnlightedMod; + } + + @Override + public boolean isSunlightSimulated() { + return sunlightSimulatedMod; + } + + @Override + public boolean isHellish() { + return getBiome() == BiomeGenBase.hell; + } + + public int getMaxSpeed() { + return maxspeed; + } + + // endregion + + // region IBeeListener + + @Override + public void wearOutEquipment(int i) {} + + @Override + public void onQueenDeath() {} + + @Override + public boolean onPollenRetrieved(IIndividual iIndividual) { + return false; + } + + // endregion + + static final IBeekeepingLogic dummylogic = new IBeekeepingLogic() { + + @Override + public boolean canWork() { + return true; + } + + @Override + public void doWork() {} + + @Override + public void syncToClient() {} + + @Override + public void syncToClient(EntityPlayerMP entityPlayerMP) {} + + @Override + public int getBeeProgressPercent() { + return 0; + } + + @Override + public boolean canDoBeeFX() { + return false; + } + + @Override + public void doBeeFX() {} + + @Override + public void readFromNBT(NBTTagCompound nbtTagCompound) {} + + @Override + public void writeToNBT(NBTTagCompound nbtTagCompound) {} + }; + + private static final String POWER_SOURCE_POWER = "GT5U.machines.powersource.power", + CANCEL_PROCESS_TOOLTIP = "GT5U.machines.industrialapiary.cancel.tooltip", + SPEED_TOOLTIP = "GT5U.machines.industrialapiary.speed.tooltip", + SPEED_LOCKED_TOOLTIP = "GT5U.machines.industrialapiary.speedlocked.tooltip", + INFO_TOOLTIP = "GT5U.machines.industrialapiary.info.tooltip", + INFO_WITH_BEE_TOOLTIP = "GT5U.machines.industrialapiary.infoextended.tooltip", + UPGRADE_TOOLTIP = "GT5U.machines.industrialapiary.upgradeslot.tooltip", + AUTOQUEEN_TOOLTIP = "GT5U.machines.industrialapiary.autoqueen.tooltip"; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder + .widget( + new SlotWidget(new ApiarySlot(inventoryHandler, queen)) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_BEE_QUEEN) + .setPos(36, 21)) + .widget( + new SlotWidget(new ApiarySlot(inventoryHandler, drone)) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_BEE_DRONE) + .setPos(36, 41)) + .widget( + SlotGroup.ofItemHandler(inventoryHandler, 2) + .startFromSlot(7) + .endAtSlot(10) + .slotCreator(i -> new ApiarySlot(inventoryHandler, i)) + .applyForWidget( + widget -> widget.setGTTooltip(() -> mTooltipCache.getData(UPGRADE_TOOLTIP)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .build() + .setPos(61, 23)); + + super.addUIWidgets(builder, buildContext); + + builder.widget( + new ButtonWidget().setOnClick((clickData, widget) -> cancelProcess()) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_CROSS) + .setGTTooltip(() -> mTooltipCache.getData(CANCEL_PROCESS_TOOLTIP)) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7, 26) + .setSize(18, 18)) + .widget( + new CycleButtonWidget().setToggle(() -> mAutoQueen, x -> mAutoQueen = x) + .setTextureGetter( + i -> i == 0 ? GTUITextures.OVERLAY_BUTTON_CROSS : GTUITextures.OVERLAY_BUTTON_CHECKMARK) + .setGTTooltip(() -> mTooltipCache.getData(AUTOQUEEN_TOOLTIP)) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7, 44) + .setSize(18, 18) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_SLOT_BEE_QUEEN)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_INFORMATION) + .setGTTooltip(() -> { + final String energyreq = GTUtility.formatNumbers( + (int) ((float) MTEIndustrialApiary.baseEUtUsage * getEnergyModifier() * getAcceleration()) + + getAdditionalEnergyUsage()); + final String Temp = StatCollector.translateToLocal(getTemperature().getName()); + final String Hum = StatCollector.translateToLocal(getHumidity().getName()); + if (getUsedQueen() != null + && BeeManager.beeRoot.isMember(getUsedQueen(), EnumBeeType.QUEEN.ordinal())) { + final IBee bee = BeeManager.beeRoot.getMember(getUsedQueen()); + if (bee.isAnalyzed()) { + final IBeeGenome genome = bee.getGenome(); + final IBeeModifier mod = BeeManager.beeRoot.getBeekeepingMode(getWorld()) + .getBeeModifier(); + final float tmod = getTerritoryModifier(null, 1f) * mod.getTerritoryModifier(null, 1f); + final int[] t = Arrays.stream(genome.getTerritory()) + .map(i -> (int) ((float) i * tmod)) + .toArray(); + return mTooltipCache.getUncachedTooltipData( + INFO_WITH_BEE_TOOLTIP, + energyreq, + Temp, + Hum, + genome.getSpeed(), + getProductionModifier(null, 0f) + mod.getProductionModifier(null, 0f), + Math.round( + getFloweringModifier(null, 1f) * genome.getFlowering() + * mod.getFloweringModifier(null, 1f)), + Math.round( + getLifespanModifier(null, null, 1f) * genome.getLifespan() + * mod.getLifespanModifier(null, null, 1f)), + t[0], + t[1], + t[2]); + } + } + return mTooltipCache.getUncachedTooltipData(INFO_TOOLTIP, energyreq, Temp, Hum); + }) + .attachSyncer( + new FakeSyncWidget.ItemStackSyncer(() -> usedQueen, val -> usedQueen = val), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .setPos(163, 5) + .setSize(7, 18)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (clickData.mouseButton == 0) { + if (mLockedSpeed) return; + if (!clickData.shift) { + mSpeed++; + if (mSpeed > getMaxSpeed()) mSpeed = 0; + } else { + mSpeed--; + if (mSpeed < 0) mSpeed = getMaxSpeed(); + } + } else if (clickData.mouseButton == 1) { + mLockedSpeed = !mLockedSpeed; + if (mLockedSpeed) mSpeed = getMaxSpeed(); + } + }) + .setGTTooltip( + () -> mTooltipCache.getUncachedTooltipData( + mLockedSpeed ? SPEED_LOCKED_TOOLTIP : SPEED_TOOLTIP, + getAcceleration(), + GTUtility.formatNumbers(getAdditionalEnergyUsage()))) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> mSpeed, val -> mSpeed = val), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> mLockedSpeed, val -> mLockedSpeed = val), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.PICTURE_SQUARE_LIGHT_GRAY) + .setPos(25, 62) + .setSize(18, 18)) + .widget( + new TextWidget("x").setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(30, 63)) + .widget( + TextWidget.dynamicString(() -> String.valueOf(1 << mSpeed)) + // mSpeed is already synced + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(26, 72)); + } + + private static final FallbackableUITexture progressBarTexture = GTUITextures + .fallbackableProgressbar("iapiary", GTUITextures.PROGRESSBAR_ARROW); + + @Override + protected BasicUIProperties getUIProperties() { + return super.getUIProperties().toBuilder() + .progressBarTexture(progressBarTexture) + .progressBarPos(new Pos2d(70, 3)) + .build(); + } + + @Override + protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) { + // we have custom input slots + return null; + } + + @Override + protected CycleButtonWidget createItemAutoOutputButton() { + return (CycleButtonWidget) super.createItemAutoOutputButton().setPos(7, 62); + } + + @Override + protected CycleButtonWidget createFluidAutoOutputButton() { + return null; + } + + @Override + protected SlotWidget createChargerSlot(int x, int y, String tooltipKey, Object[] tooltipArgs) { + return (SlotWidget) super.createChargerSlot(x, y, tooltipKey, tooltipArgs).setPos(79, 62); + } + + @Override + protected DrawableWidget createErrorStatusArea(ModularWindow.Builder builder, IDrawable picture) { + return (DrawableWidget) super.createErrorStatusArea(builder, picture).setPos(100, 62) + .attachSyncer( + new FakeSyncWidget.ListSyncer<>(() -> Arrays.asList(mErrorStates.toArray(new IErrorState[0])), val -> { + mErrorStates.clear(); + mErrorStates.addAll(new HashSet<>(val)); + }, + (buffer, val) -> buffer.writeShort(val.getID()), + buffer -> ForestryAPI.errorStateRegistry.getErrorState(buffer.readShort())), + builder, + (widget, val) -> widget.notifyTooltipChange()); + } + + @Override + protected List getErrorDescriptions() { + if (!mErrorStates.isEmpty()) { + return mErrorStates.stream() + .map(state -> EnumChatFormatting.RED + StatCollector.translateToLocal("for." + state.getDescription())) + .collect(Collectors.toList()); + } else if (mStuttering) { + return mTooltipCache + .getData(STALLED_STUTTERING_TOOLTIP, StatCollector.translateToLocal(POWER_SOURCE_POWER)).text; + } else { + return Collections.emptyList(); + } + } + + @Override + protected List getErrorDescriptionsShift() { + // Don't show shift tooltip of "Progress was lost" + // as this machine does not lose progress + return getErrorDescriptions(); + } + + private int getAcceleration() { + return 1 << mSpeed; + } + + private int getAdditionalEnergyUsage() { + final int accelerated = getAcceleration(); + int energyusage = 0; + if (accelerated == 2) energyusage = 32; + else if (accelerated > 2) energyusage = 32 * accelerated << (mSpeed - 2); + return energyusage; + } + + private class ApiarySlot extends BaseSlot { + + public ApiarySlot(IItemHandlerModifiable inventory, int index) { + super(inventory, index); + } + + @Override + public boolean isItemValidPhantom(ItemStack stack) { + return super.isItemValidPhantom(stack) && getBaseMetaTileEntity().isItemValidForSlot(getSlotIndex(), stack); + } + + @Override + public void onSlotChanged() { + super.onSlotChanged(); + onInventoryUpdate(getSlotIndex()); + } + } + + private static final UIInfo IndustrialApiaryUI = GTUIInfos.GTTileEntityUIFactory + .apply(GTModularUIContainer_IndustrialApiary::new); + + private static class GTModularUIContainer_IndustrialApiary extends ModularUIContainer { + + public GTModularUIContainer_IndustrialApiary(ModularUIContext context, ModularWindow mainWindow) { + super(context, mainWindow); + } + + private final int playerInventorySlot = 36; + + @Override + public ItemStack slotClick(int aSlotNumber, int aMouseclick, int aShifthold, EntityPlayer aPlayer) { + if (!(aSlotNumber >= playerInventorySlot + 2 && aSlotNumber < playerInventorySlot + 2 + 4)) + return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + if (aShifthold == 5) return null; + if (aShifthold != 0) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + if (aMouseclick > 1) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + final ItemStack s = aPlayer.inventory.getItemStack(); + if (s == null) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + final Slot slot = getSlot(aSlotNumber); + final ItemStack slotStack = slot.getStack(); + if (slotStack != null && !GTUtility.areStacksEqual(slotStack, s)) return null; // super would replace item + if (slotStack == null && !slot.isItemValid(s)) + return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + if (!GTApiaryUpgrade.isUpgrade(s)) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + int max = GTApiaryUpgrade.getUpgrade(s) + .getMaxNumber(); + if (slotStack != null) max = Math.max(0, max - slotStack.stackSize); + max = Math.min(max, s.stackSize); + if (max == 0) return null; + if (aMouseclick == 1) max = 1; + if (max == s.stackSize) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + final ItemStack newStack = s.splitStack(s.stackSize - max); + final ItemStack result = super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + aPlayer.inventory.setItemStack(newStack); + return result; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer aPlayer, int aSlotIndex) { + final Slot s = getSlot(aSlotIndex); + if (s == null) return super.transferStackInSlot(aPlayer, aSlotIndex); + if (aSlotIndex >= playerInventorySlot) return super.transferStackInSlot(aPlayer, aSlotIndex); + final ItemStack aStack = s.getStack(); + if (aStack == null) return super.transferStackInSlot(aPlayer, aSlotIndex); + if (!GTApiaryUpgrade.isUpgrade(aStack)) return super.transferStackInSlot(aPlayer, aSlotIndex); + for (int i = playerInventorySlot + 2; i < playerInventorySlot + 2 + 4; i++) { + final Slot iSlot = getSlot(i); + final ItemStack iStack = iSlot.getStack(); + if (iStack == null) { + if (!iSlot.isItemValid(aStack)) continue; + } else { + if (!GTUtility.areStacksEqual(aStack, iStack)) continue; + } + int max = GTApiaryUpgrade.getUpgrade(aStack) + .getMaxNumber(); + if (iStack == null) { + max = Math.min(max, aStack.stackSize); + final ItemStack newstack = aStack.splitStack(max); + iSlot.putStack(newstack); + } else { + max = Math.max(0, max - iStack.stackSize); + max = Math.min(max, aStack.stackSize); + iStack.stackSize += max; + aStack.stackSize -= max; + iSlot.onSlotChanged(); + } + if (aStack.stackSize == 0) s.putStack(null); + else s.onSlotChanged(); + break; + } + return null; + } + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currenttip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + if (tag.hasKey("queen")) { + currenttip.add( + "Current Queen: " + EnumChatFormatting.GREEN + StatCollector.translateToLocal(tag.getString("queen"))); + } + if (tag.hasKey("dummyProduction")) { + currenttip.add( + "Effective Production: " + EnumChatFormatting.AQUA + + String.format("b^0.52 * %.2f", tag.getFloat("dummyProduction"))); + } + if (tag.hasKey("errors")) { + NBTTagCompound errorNbt = tag.getCompoundTag("errors"); + for (int i = 0; i < errorNbt.getInteger("size"); i++) { + currenttip.add( + "Error: " + EnumChatFormatting.RED + + StatCollector.translateToLocal("for." + errorNbt.getString("e" + i))); + } + } + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + if (usedQueen != null) { + IBeeGenome genome = beeRoot.getMember(usedQueen) + .getGenome(); + tag.setString( + "queen", + genome.getPrimary() + .getUnlocalizedName()); + float prodModifier = getProductionModifier(genome, 0f); + prodModifier += beeRoot.getBeekeepingMode(world) + .getBeeModifier() + .getProductionModifier(genome, prodModifier); + float dummyProduction = 100f * Bee.getFinalChance(0.01f, genome.getSpeed(), prodModifier, 8f); + tag.setFloat("dummyProduction", dummyProduction); + } + if (hasErrors()) { + NBTTagCompound errorNbt = new NBTTagCompound(); + int errorCounter = 0; + for (IErrorState error : mErrorStates) { + errorNbt.setString("e" + errorCounter++, error.getDescription()); + } + errorNbt.setInteger("size", errorCounter); + tag.setTag("errors", errorNbt); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEMassfabricator.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMassfabricator.java new file mode 100644 index 0000000000..195d2317de --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMassfabricator.java @@ -0,0 +1,241 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_GLOW; + +import java.util.Arrays; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraftforge.fluids.FluidStack; + +import com.google.common.primitives.Ints; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.MachineType; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.objects.overclockdescriber.EUOverclockDescriber; +import gregtech.api.objects.overclockdescriber.OverclockDescriber; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.api.util.OverclockCalculator; +import gregtech.common.config.machinestats.ConfigMassFabricator; + +public class MTEMassfabricator extends MTEBasicMachine { + + public static int sUUAperUUM = 1; + public static int sUUASpeedBonus = 4; + public static int sDurationMultiplier = 3215; + public static boolean sRequiresUUA = false; + public static int BASE_EUT = 256; + public static GTRecipe nonUUARecipe; + public static GTRecipe uuaRecipe; + + public MTEMassfabricator(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 8, + MachineType.MATTER_FABRICATOR.tooltipDescription(), + 1, + 1, + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_MASSFAB_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_MASSFAB), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_MASSFAB_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_MASSFAB_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_MASSFAB), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MASSFAB_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_MASSFAB_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_MASSFAB_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_MASSFAB), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_MASSFAB_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_MASSFAB_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_MASSFAB), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_MASSFAB_GLOW) + .glow() + .build())); + } + + public MTEMassfabricator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 8, aDescription, aTextures, 1, 1); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMassfabricator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public boolean allowSelectCircuit() { + return true; + } + + @Override + protected OverclockDescriber createOverclockDescriber() { + return new MassfabricatorOverclockDescriber(mTier, mAmperage); + } + + @Override + public void onConfigLoad() { + super.onConfigLoad(); + sDurationMultiplier = ConfigMassFabricator.durationMultiplier; + sUUAperUUM = ConfigMassFabricator.UUAPerUUM; + sUUASpeedBonus = ConfigMassFabricator.UUASpeedBonus; + sRequiresUUA = ConfigMassFabricator.requiresUUA; + Materials.UUAmplifier.mChemicalFormula = ("Mass Fabricator Eff/Speed Bonus: x" + sUUASpeedBonus); + } + + @Override + public long maxAmperesIn() { + return 10; + } + + @Override + public long maxEUStore() { + return V[mTier] * 512L; + } + + @Override + public int checkRecipe() { + FluidStack tFluid = getDrainableStack(); + if ((tFluid == null) || (tFluid.amount < getCapacity())) { + this.mOutputFluid = Materials.UUMatter.getFluid(1L); + calculateCustomOverclock(containsUUA(getFillableStack()) ? uuaRecipe : nonUUARecipe); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + if (containsUUA(tFluid = getFillableStack())) { + tFluid.amount -= sUUAperUUM; + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + return sRequiresUUA || Arrays.stream(getAllInputs()) + .anyMatch(s -> ItemList.Circuit_Integrated.isStackEqual(s, true, true)) + ? FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS + : FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + return DID_NOT_FIND_RECIPE; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.massFabFakeRecipes; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return aFluid.isFluidEqual(Materials.UUAmplifier.getFluid(1L)); + } + + @Override + public int getCapacity() { + return Math.max(sUUAperUUM, 1000); + } + + private boolean containsUUA(FluidStack aFluid) { + return aFluid != null && aFluid.amount >= sUUAperUUM && aFluid.isFluidEqual(Materials.UUAmplifier.getFluid(1L)); + } + + @ParametersAreNonnullByDefault + @MethodsReturnNonnullByDefault + protected class MassfabricatorOverclockDescriber extends EUOverclockDescriber { + + protected MassfabricatorOverclockDescriber(byte tier, int amperage) { + super(tier, amperage); + } + + @Override + public OverclockCalculator createCalculator(OverclockCalculator template, GTRecipe recipe) { + return super.createCalculator(template, recipe).setEUt(Ints.saturatedCast(V[tier] * amperage)) + .setEUtIncreasePerOC(2.0) + .limitOverclockCount(tier - 1) + .setOneTickDiscount(false); + } + + @Override + protected boolean shouldShowAmperage(OverclockCalculator calculator) { + return true; + } + + @Override + protected String getVoltageString(OverclockCalculator calculator) { + // standard amperage calculation doesn't work here + return decorateWithOverclockLabel(GTUtility.formatNumbers(V[mTier]) + " EU/t", calculator) + + GTUtility.getTierNameWithParentheses(V[mTier]); + } + + @Override + protected String getAmperageString(OverclockCalculator calculator) { + int amperage = this.amperage; + int denominator = 1; + for (int i = 1; i < mTier; i++) { + amperage >>= 1; + if (amperage == 0) { + denominator <<= 1; + } + } + if (amperage > 0) { + return GTUtility.formatNumbers(amperage); + } else { + return "1/" + denominator; + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEMicrowaveEnergyTransmitter.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMicrowaveEnergyTransmitter.java new file mode 100644 index 0000000000..52d38beba0 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMicrowaveEnergyTransmitter.java @@ -0,0 +1,474 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW; + +import java.util.function.Consumer; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IEnergyConnected; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicTank; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.common.config.machinestats.ConfigMicrowaveEnergyTransmitter; +import gregtech.common.config.machinestats.ConfigTeleporter; + +public class MTEMicrowaveEnergyTransmitter extends MTEBasicTank implements IAddGregtechLogo, IAddUIWidgets { + + private static boolean sInterDimensionalTeleportAllowed = true; + private static int mMaxLoss = 50; + private static int mMaxLossDistance = 10000; + private static boolean mPassiveEnergyUse = true; + public int mTargetX = 0; + public int mTargetY = 0; + public int mTargetZ = 0; + public int mTargetD = 0; + public boolean mDebug = false; + public boolean hasBlock = false; + public int tTargetX = 0; + public int tTargetY = 0; + public int tTargetZ = 0; + public int tTargetD = 0; + public TileEntity tTile = null; + + public MTEMicrowaveEnergyTransmitter(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 3, + new String[] { "Transmits Energy Wirelessly", "Use Nitrogen Plasma", "for Inter-dimensional transmission", + "0.004EU Loss per 100 Blocks" }); + } + + public MTEMicrowaveEnergyTransmitter(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + public MTEMicrowaveEnergyTransmitter(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) return true; + this.hasBlock = checkForBlock(); + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMicrowaveEnergyTransmitter(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public String[] getInfoData() { + return new String[] { "Coordinates:", + "X: " + EnumChatFormatting.GREEN + GTUtility.formatNumbers(this.mTargetX) + EnumChatFormatting.RESET, + "Y: " + EnumChatFormatting.GREEN + GTUtility.formatNumbers(this.mTargetY) + EnumChatFormatting.RESET, + "Z: " + EnumChatFormatting.GREEN + GTUtility.formatNumbers(this.mTargetZ) + EnumChatFormatting.RESET, + "Dimension: " + EnumChatFormatting.GREEN + this.mTargetD + EnumChatFormatting.RESET, + "Dimension Valid: " + (GTUtility.isRealDimension(this.mTargetD) + ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET + : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET), + "Dimension Registered: " + (DimensionManager.isDimensionRegistered(this.mTargetD) + ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET + : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET) }; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == ForgeDirection.DOWN) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; + if (aActive) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], + TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW) + .glow() + .build() }; + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER), + TextureFactory.builder() + .addIcon(OVERLAY_TELEPORTER_GLOW) + .glow() + .build() }; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); + aNBT.setInteger("mTargetX", this.mTargetX); + aNBT.setInteger("mTargetY", this.mTargetY); + aNBT.setInteger("mTargetZ", this.mTargetZ); + aNBT.setInteger("mTargetD", this.mTargetD); + aNBT.setBoolean("mDebug", this.mDebug); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid")); + this.mTargetX = aNBT.getInteger("mTargetX"); + this.mTargetY = aNBT.getInteger("mTargetY"); + this.mTargetZ = aNBT.getInteger("mTargetZ"); + this.mTargetD = aNBT.getInteger("mTargetD"); + this.mDebug = aNBT.getBoolean("mDebug"); + } + + @Override + public void onConfigLoad() { + sInterDimensionalTeleportAllowed = ConfigTeleporter.interDimensionalTPAllowed; + mMaxLoss = Math.max(ConfigMicrowaveEnergyTransmitter.maxLoss, 11); + mMaxLossDistance = ConfigMicrowaveEnergyTransmitter.maxLossDistance; + mPassiveEnergyUse = ConfigMicrowaveEnergyTransmitter.passiveEnergyUse; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isServerSide()) { + if ((this.mTargetX == 0) && (this.mTargetY == 0) && (this.mTargetZ == 0) && (this.mTargetD == 0)) { + this.mTargetX = aBaseMetaTileEntity.getXCoord(); + this.mTargetY = aBaseMetaTileEntity.getYCoord(); + this.mTargetZ = aBaseMetaTileEntity.getZCoord(); + this.mTargetD = aBaseMetaTileEntity.getWorld().provider.dimensionId; + } + this.hasBlock = checkForBlock(); + } + } + + public boolean checkForBlock() { + for (byte i = -5; i <= 5; i = (byte) (i + 1)) { + for (byte j = -5; j <= 5; j = (byte) (j + 1)) { + for (byte k = -5; k <= 5; k = (byte) (k + 1)) { + if (getBaseMetaTileEntity().getBlockOffset(i, j, k) == GregTechAPI.sBlockMetal5 + && getBaseMetaTileEntity().getMetaIDOffset(i, j, k) == 8) { // require osmiridium block + return true; + } + } + } + } + return false; + } + + public boolean hasDimensionalTeleportCapability() { + return this.mDebug || (sInterDimensionalTeleportAllowed && (this.hasBlock + || mFluid != null && mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1)) && mFluid.amount >= 1000)); + } + + public boolean isDimensionalTeleportAvailable() { + return this.mDebug || (hasDimensionalTeleportCapability() && GTUtility.isRealDimension(this.mTargetD) + && GTUtility.isRealDimension(getBaseMetaTileEntity().getWorld().provider.dimensionId)); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (mFluid == null) { + mFluid = Materials.Nitrogen.getPlasma(0); + } + super.onPostTick(aBaseMetaTileEntity, aTick); + if (getBaseMetaTileEntity().isServerSide()) { + if (getBaseMetaTileEntity().getTimer() % 100L == 50L) { + this.hasBlock = checkForBlock(); + } + if ((getBaseMetaTileEntity().isAllowedToWork()) && (getBaseMetaTileEntity().getRedstone())) { + if (getBaseMetaTileEntity().getStoredEU() > (V[mTier] * 16)) { + if (mPassiveEnergyUse) { + getBaseMetaTileEntity().decreaseStoredEnergyUnits(2L << (mTier - 1), false); + } + if (hasDimensionalTeleportCapability() + && this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId + && mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1))) { + mFluid.amount--; + if (mFluid.amount < 1) { + mFluid = null; + } + } + if (tTargetD != mTargetD || tTargetX != mTargetX || tTargetY != mTargetY || tTargetZ != mTargetZ) { + tTargetD = mTargetD; + tTargetX = mTargetX; + tTargetY = mTargetY; + tTargetZ = mTargetZ; + if (this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) { + tTile = getBaseMetaTileEntity().getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); + } else { + World tWorld = DimensionManager.getWorld(this.mTargetD); + if (tWorld != null) { + tTile = tWorld.getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); + } + } + } + int tDistance = distanceCalculation(); + if (tTile != null) { + if (tTile instanceof IEnergyConnected) { + long packetSize = V[mTier]; + if (tTile instanceof IGregTechTileEntity) { + IMetaTileEntity mte = ((IGregTechTileEntity) tTile).getMetaTileEntity(); + if (mte instanceof BaseMetaTileEntity) { + packetSize = ((BaseMetaTileEntity) mte).getMaxSafeInput(); + } + } + long energyUse = 10; + if (mMaxLossDistance != 0) { + energyUse = GTUtility + .safeInt(10L + (tDistance * Math.max(mMaxLoss - 10L, 0) / mMaxLossDistance)); + } + energyUse = packetSize + ((V[mTier] * energyUse) / 100); + if (getBaseMetaTileEntity().isUniversalEnergyStored(energyUse)) { + if (((IEnergyConnected) tTile).injectEnergyUnits(ForgeDirection.UNKNOWN, packetSize, 1) + > 0) { + getBaseMetaTileEntity().decreaseStoredEnergyUnits(energyUse, false); + } + } + } + } + } + getBaseMetaTileEntity().setActive(true); + } else { + getBaseMetaTileEntity().setActive(false); + } + } + } + + private int distanceCalculation() { + return Math.abs( + ((this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId) + && (isDimensionalTeleportAvailable()) ? 100 : 1) + * (int) Math.sqrt( + Math.pow(getBaseMetaTileEntity().getXCoord() - this.mTargetX, 2.0D) + + Math.pow(getBaseMetaTileEntity().getYCoord() - this.mTargetY, 2.0D) + + Math.pow(getBaseMetaTileEntity().getZCoord() - this.mTargetZ, 2.0D))); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isOverclockerUpgradable() { + return false; + } + + @Override + public boolean isTransformerUpgradable() { + return false; + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return true; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier] * 16; + } + + @Override + public long maxEUStore() { + return V[mTier] * 256; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxSteamStore() { + return maxEUStore(); + } + + @Override + public long maxAmperesIn() { + return 3; + } + + @Override + public int getStackDisplaySlot() { + return 2; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public int getInputSlot() { + return 0; + } + + @Override + public int getOutputSlot() { + return 0; + } + + @Override + public int getCapacity() { + return 64000; + } + + @Override + public boolean doesFillContainers() { + return false; + } + + @Override + public boolean doesEmptyContainers() { + return false; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return false; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setSize(90, 72) + .setPos(43, 4)) + .widget( + new TextWidget().setStringSupplier(() -> "X: " + numberFormat.format(mTargetX)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 8)) + .widget( + new TextWidget().setStringSupplier(() -> "Y: " + numberFormat.format(mTargetY)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 16)) + .widget( + new TextWidget().setStringSupplier(() -> "Z: " + numberFormat.format(mTargetZ)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 24)) + .widget( + new TextWidget().setStringSupplier(() -> "Dim: " + numberFormat.format(mTargetD)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 32)) + .widget( + TextWidget.dynamicString(() -> "Dim Valid: " + (GTUtility.isRealDimension(mTargetD) ? "Yes" : "No")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> hasDimensionalTeleportCapability()) + .setPos(46, 40)) + .widget(new FakeSyncWidget.FluidStackSyncer(() -> mFluid, val -> mFluid = val)); + + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151); + + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> mTargetD += val, -16, -8, 7, 58); + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> mTargetD += val, -4, -1, 25, 58); + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> mTargetD += val, 4, 1, 133, 58); + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> mTargetD += val, 16, 8, 151, 58); + } + + private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift, + int addNumber, int xPos) { + addChangeNumberButton(builder, overlay, val -> mTargetX += val, addNumberShift, addNumber, xPos, 4); + addChangeNumberButton(builder, overlay, val -> mTargetY += val, addNumberShift, addNumber, xPos, 22); + addChangeNumberButton(builder, overlay, val -> mTargetZ += val, addNumberShift, addNumber, xPos, 40); + } + + private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer setter, + int addNumberShift, int addNumber, int xPos, int yPos) { + builder.widget( + new ButtonWidget() + .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? addNumberShift : addNumber)) + .setBackground(GTUITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, yPos)); + } + + @Override + public GUITextureSet getGUITextureSet() { + return new GUITextureSet().setGregTechLogo(GTUITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(113, 56)); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEMiner.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMiner.java new file mode 100644 index 0000000000..7707564b93 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMiner.java @@ -0,0 +1,406 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.GTValues.debugBlockMiner; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.ChunkPosition; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; + +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.recipe.BasicUIProperties; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; +import gregtech.common.misc.DrillingLogicDelegate; +import gregtech.common.misc.IDrillingLogicDelegateOwner; + +public class MTEMiner extends MTEBasicMachine implements IDrillingLogicDelegateOwner, IAddUIWidgets { + + static final int[] RADIUS = { 8, 8, 16, 24, 32 }; // Miner radius per tier + static final int[] SPEED = { 160, 160, 80, 40, 20 }; // Miner cycle time per tier + static final int[] ENERGY = { 8, 8, 32, 128, 512 }; // Miner energy consumption per tier + + /** Miner configured radius */ + private int radiusConfig; + /** Found ore blocks cache of current drill depth */ + private final ArrayList oreBlockPositions = new ArrayList<>(); + + /** General pipe accessor */ + private final DrillingLogicDelegate pipe = new DrillingLogicDelegate(this); + + private final int mSpeed; + + public MTEMiner(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + new String[] { "Digging ore instead of you", "Use Screwdriver to regulate work area", + "Use Soft Mallet to disable and retract the pipe", + String.format("%d EU/t, %d sec per block, no stuttering", ENERGY[aTier], SPEED[aTier] / 20), + String.format("Maximum work area %dx%d", (RADIUS[aTier] * 2 + 1), (RADIUS[aTier] * 2 + 1)), + String.format("Fortune bonus of %d", aTier) }, + 2, + 2, + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_GLOW")) + .glow() + .build())); + mSpeed = SPEED[aTier]; + radiusConfig = RADIUS[mTier]; + } + + public MTEMiner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, 2, 2); + mSpeed = SPEED[aTier]; + radiusConfig = RADIUS[mTier]; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMiner(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + pipe.findTipDepth(); + fillOreList(aBaseMetaTileEntity); + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) // + && aStack.getItem() == DrillingLogicDelegate.MINING_PIPE_STACK.getItem(); + } + + /** Both output slots must be free to work */ + public boolean hasFreeSpace() { + for (int i = getOutputSlot(); i < getOutputSlot() + 2; i++) { + if (mInventory[i] != null) { + return false; + } + } + return true; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); + if (side != getBaseMetaTileEntity().getFrontFacing() && side != mMainFacing) { + if (aPlayer.isSneaking()) { + if (radiusConfig >= 0) { + radiusConfig--; + } + if (radiusConfig < 0) { + radiusConfig = RADIUS[mTier]; + } + } else { + if (radiusConfig <= RADIUS[mTier]) { + radiusConfig++; + } + if (radiusConfig > RADIUS[mTier]) { + radiusConfig = 0; + } + } + + GTUtility.sendChatToPlayer( + aPlayer, + String.format( + "%s %dx%d", + StatCollector.translateToLocal("GT5U.machines.workareaset"), + (radiusConfig * 2 + 1), + (radiusConfig * 2 + 1))); + + // Rebuild ore cache after change config + fillOreList(getBaseMetaTileEntity()); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + + if (!aBaseMetaTileEntity.isServerSide()) { + return; + } + + // Pipe workaround + pipe.onOwnerPostTick(aBaseMetaTileEntity, aTick); + + if (!aBaseMetaTileEntity.isAllowedToWork()) { + mMaxProgresstime = 0; + if (debugBlockMiner) { + GTLog.out.println("MINER: Disabled"); + } + return; + } + + if (!hasFreeSpace()) { + mMaxProgresstime = 0; + if (debugBlockMiner) { + GTLog.out.println("MINER: No free space"); + } + return; + } + + if (!aBaseMetaTileEntity.isUniversalEnergyStored((long) ENERGY[mTier] * (mSpeed - mProgresstime))) { + mMaxProgresstime = 0; + if (debugBlockMiner) { + GTLog.out.println( + "MINER: Not enough energy yet, want " + (ENERGY[mTier] * mSpeed) + + " have " + + aBaseMetaTileEntity.getUniversalEnergyStored()); + } + return; + } + + /* Checks if machine are waiting new mining pipe item */ + if (!pipe.canContinueDrilling(aTick)) { + mMaxProgresstime = 0; + return; + } + + mMaxProgresstime = mSpeed; + + aBaseMetaTileEntity.decreaseStoredEnergyUnits(ENERGY[mTier], true); + + // Real working only when progress done. TODO some legacy code... refactorings needed + if (mProgresstime == mSpeed - 1) { + if (pipe.getTipDepth() == 0 || oreBlockPositions.isEmpty()) { + boolean descends = pipe.descent(aBaseMetaTileEntity); + if (descends) { + fillOreList(aBaseMetaTileEntity); + } + } else { + int x; + int y; + int z; + Block oreBlock; + boolean isOre; + do { + ChunkPosition oreBlockPos = oreBlockPositions.remove(0); + oreBlock = aBaseMetaTileEntity + .getBlockOffset(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ); + x = aBaseMetaTileEntity.getXCoord() + oreBlockPos.chunkPosX; + y = aBaseMetaTileEntity.getYCoord() + oreBlockPos.chunkPosY; + z = aBaseMetaTileEntity.getZCoord() + oreBlockPos.chunkPosZ; + isOre = GTUtility.isOre( + oreBlock, + aBaseMetaTileEntity.getWorld() + .getBlockMetadata(x, y, z)); + } // someone else might have removed the block + while (!isOre && !oreBlockPositions.isEmpty()); + + if (isOre) { + pipe.mineBlock(aBaseMetaTileEntity, oreBlock, x, y, z); + } + } + } + } + + /** Finds the ores in current drill Y level */ + private void fillOreList(IGregTechTileEntity aBaseMetaTileEntity) { + if (pipe.getTipDepth() == 0) { + return; + } + oreBlockPositions.clear(); + for (int z = -radiusConfig; z <= radiusConfig; ++z) { + for (int x = -radiusConfig; x <= radiusConfig; ++x) { + Block block = aBaseMetaTileEntity.getBlockOffset(x, pipe.getTipDepth(), z); + int blockMeta = aBaseMetaTileEntity.getMetaIDOffset(x, pipe.getTipDepth(), z); + + // todo some weird checks. refactorings needed + if (block instanceof BlockOresAbstract) { + TileEntity oreEntity = aBaseMetaTileEntity.getTileEntityOffset(x, pipe.getTipDepth(), z); + if (oreEntity instanceof TileEntityOres && ((TileEntityOres) oreEntity).mNatural) { + oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z)); + } + } else if (GTUtility.isOre(block, blockMeta)) { + oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z)); + } + } + } + } + + /** Pulls (or check can pull) items from an input slots. */ + @Override + public boolean pullInputs(Item item, int count, boolean simulate) { + for (int i = 0; i < mInputSlotCount; i++) { + ItemStack stack = getInputAt(i); + if (stack != null && stack.getItem() == item && stack.stackSize >= count) { + if (simulate) { + return true; + } + stack.stackSize -= count; + if (stack.stackSize == 0) { + mInventory[getInputSlot() + i] = null; + } + return true; + } + } + return false; + } + + /** Pushes (or check can push) item to output slots. */ + @Override + public boolean pushOutputs(ItemStack stack, int count, boolean simulate, boolean allowInputSlots) { + return allowInputSlots && pushOutput(getInputSlot(), getInputSlot() + mInputSlotCount, stack, count, simulate) + || pushOutput(getOutputSlot(), getOutputSlot() + mOutputItems.length, stack, count, simulate); + } + + private boolean pushOutput(int startIndex, int endIndex, ItemStack stack, int count, boolean simulate) { + for (int i = startIndex; i < endIndex; i++) { + ItemStack slot = mInventory[i]; + if (slot == null || slot.stackSize == 0) { + if (!simulate) { + ItemStack copy = stack.copy(); + copy.stackSize = count; + mInventory[i] = copy; + } + return true; + } else if (GTUtility.areStacksEqual(slot, stack) && slot.stackSize <= slot.getMaxStackSize() - count) { + if (!simulate) { + slot.stackSize += count; + } + return true; + } + } + return false; + } + + @Override + public long maxEUStore() { + return Math.max(V[mTier] * 64, 4096); + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + super.setItemNBT(aNBT); + aNBT.setInteger("radiusConfig", radiusConfig); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("radiusConfig", radiusConfig); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("radiusConfig")) { + int newRadius = aNBT.getInteger("radiusConfig"); + if (RADIUS[mTier] <= newRadius && newRadius > 0) { + radiusConfig = newRadius; + } + } + } + + @Override + public String[] getInfoData() { + return new String[] { + String.format( + "%s%s%s", + EnumChatFormatting.BLUE, + StatCollector.translateToLocal("GT5U.machines.miner"), + EnumChatFormatting.RESET), + String.format( + "%s: %s%d%s %s", + StatCollector.translateToLocal("GT5U.machines.workarea"), + EnumChatFormatting.GREEN, + (radiusConfig * 2 + 1), + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.machines.blocks")) }; + } + + @Override + public int getMachineTier() { + return mTier; + } + + @Override + public int getMachineSpeed() { + return mSpeed; + } + + public DrillingLogicDelegate getPipe() { + return pipe; + } + + private static final FallbackableUITexture progressBarTexture = GTUITextures + .fallbackableProgressbar("miner", GTUITextures.PROGRESSBAR_CANNER); + + @Override + protected BasicUIProperties getUIProperties() { + return super.getUIProperties().toBuilder() + .progressBarTexture(progressBarTexture) + .build(); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEMonsterRepellent.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMonsterRepellent.java new file mode 100644 index 0000000000..fc9c40856e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEMonsterRepellent.java @@ -0,0 +1,182 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW; + +import java.util.Arrays; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTSpawnEventHandler; + +public class MTEMonsterRepellent extends MTETieredMachineBlock { + + public int mRange = 16; + + public MTEMonsterRepellent(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + "Repels nasty Creatures. Range: " + (4 + (12 * aTier)) + + " unpowered / " + + (16 + (48 * aTier)) + + " powered. Costs " + + (1L << (aTier * 2)) + + " EU/t"); + } + + public MTEMonsterRepellent(String aName, int aTier, int aInvSlotCount, String aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public MTEMonsterRepellent(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMonsterRepellent( + this.mName, + this.mTier, + this.mInventory.length, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection != ForgeDirection.UP) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; + if (active) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], + TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW) + .glow() + .build() }; + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER), + TextureFactory.builder() + .addIcon(OVERLAY_TELEPORTER_GLOW) + .glow() + .build() }; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + if (aBaseMetaTileEntity.isAllowedToWork() && aBaseMetaTileEntity.isServerSide()) { + int[] tCoords = { aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), aBaseMetaTileEntity.getWorld().provider.dimensionId }; + if ((aTimer % 600 == 0) && !GTSpawnEventHandler.mobReps.contains(tCoords)) { + GTSpawnEventHandler.mobReps.add(tCoords); + } + if (aBaseMetaTileEntity.isUniversalEnergyStored(getMinimumStoredEU()) + && aBaseMetaTileEntity.decreaseStoredEnergyUnits(1L << (this.mTier * 2), false)) { + mRange = GTSpawnEventHandler.getPoweredRepellentRange(mTier); + } else { + mRange = GTSpawnEventHandler.getUnpoweredRepellentRange(mTier); + } + } + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + int[] tCoords = { aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), aBaseMetaTileEntity.getWorld().provider.dimensionId }; + GTSpawnEventHandler.mobReps.add(tCoords); + } + + @Override + public void onRemoval() { + int[] tCoords = { this.getBaseMetaTileEntity() + .getXCoord(), + this.getBaseMetaTileEntity() + .getYCoord(), + this.getBaseMetaTileEntity() + .getZCoord(), + this.getBaseMetaTileEntity() + .getWorld().provider.dimensionId }; + GTSpawnEventHandler.mobReps.removeIf(coords -> Arrays.equals(coords, tCoords)); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return true; + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 512L; + } + + @Override + public long maxEUStore() { + return 512L + V[mTier] * 50; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxAmperesIn() { + return 2; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) {} + + @Override + public void loadNBTData(NBTTagCompound aNBT) {} +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEPotionBrewer.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEPotionBrewer.java new file mode 100644 index 0000000000..d889ca0d40 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEPotionBrewer.java @@ -0,0 +1,224 @@ +package gregtech.common.tileentities.machines.basic; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.enums.MachineType; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; + +public class MTEPotionBrewer extends MTEBasicMachine { + + public MTEPotionBrewer(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + MachineType.BREWERY.tooltipDescription(), + 1, + 0, + TextureFactory.of( + TextureFactory.of( + new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_SIDE_POTIONBREWER_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of( + new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/potionbrewer/OVERLAY_FRONT_POTIONBREWER_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of( + new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_TOP_POTIONBREWER_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of( + new Textures.BlockIcons.CustomIcon( + "basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/potionbrewer/OVERLAY_BOTTOM_POTIONBREWER_GLOW")) + .glow() + .build())); + } + + public MTEPotionBrewer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, 1, 0); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPotionBrewer(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.brewingRecipes; + } + + @Override + public int checkRecipe() { + int tCheck = super.checkRecipe(); + if (tCheck != DID_NOT_FIND_RECIPE) { + return tCheck; + } + + calculateOverclockedNess(4, 128); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + + FluidStack aFluid = getFillableStack(); + if ((getDrainableStack() == null) && (aFluid != null) && (getInputAt(0) != null)) { + String tInputName = aFluid.getFluid() + .getName(); + if (tInputName.startsWith("potion.")) { + tInputName = tInputName.replaceFirst("potion.", ""); + int tFirstDot = tInputName.indexOf('.') + 1; + String tModifier = tFirstDot <= 0 ? "" : tInputName.substring(tFirstDot); + if (!tModifier.isEmpty()) { + tInputName = tInputName.replaceFirst("." + tModifier, ""); + } + if (GTUtility.areStacksEqual(new ItemStack(Items.fermented_spider_eye, 1, 0), getInputAt(0))) { + return switch (tInputName) { + case "poison", "health", "waterbreathing" -> setOutput("potion.damage" + tModifier); + case "nightvision" -> setOutput("potion.invisibility" + tModifier); + case "fireresistance", "speed" -> setOutput("potion.slowness" + tModifier); + case "strength" -> setOutput("potion.weakness" + tModifier); + case "regen" -> setOutput("potion.poison" + tModifier); + default -> setOutput("potion.weakness"); + }; + } + if (GTUtility.areStacksEqual( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L), + getInputAt(0))) { + if (!tModifier.startsWith("strong")) { + return setOutput( + "potion." + tInputName + ".strong" + (tModifier.isEmpty() ? "" : "." + tModifier)); + } + if (tModifier.startsWith("long")) { + return setOutput("potion." + tInputName + tModifier.replaceFirst("long", "")); + } + return setOutput("potion.thick"); + } + if (GTUtility + .areStacksEqual(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L), getInputAt(0))) { + if (!tModifier.startsWith("long")) { + return setOutput( + "potion." + tInputName + ".long" + (tModifier.isEmpty() ? "" : "." + tModifier)); + } + if (tModifier.startsWith("strong")) { + return setOutput("potion." + tInputName + tModifier.replaceFirst("strong", "")); + } + return setOutput("potion.mundane"); + } + if (GTUtility.areStacksEqual( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L), + getInputAt(0))) { + if (!tInputName.endsWith(".splash")) { + return setOutput("potion." + tInputName + ".splash"); + } + return setOutput("potion.mundane"); + } + } + } + return 0; + } + + private int setOutput(String aFluidName) { + if (getFillableStack().amount < 750) { + return 0; + } + + this.mOutputFluid = FluidRegistry.getFluidStack(aFluidName, 750); + if (this.mOutputFluid == null) { + this.mOutputFluid = FluidRegistry.getFluidStack("potion.mundane", getFillableStack().amount); + } + + getInputAt(0).stackSize -= 1; + getFillableStack().amount -= 750; + return 2; + } + + @Override + public boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && getRecipeMap().containsInput(aStack); + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return (aFluid.getFluid() + .getName() + .startsWith("potion.")) || (super.isFluidInputAllowed(aFluid)); + } + + @Override + public int getCapacity() { + return getCapacityForTier(mTier); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEPump.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEPump.java new file mode 100644 index 0000000000..a6a99a58fa --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEPump.java @@ -0,0 +1,846 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.debugBlockPump; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.ChunkPosition; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidBlock; + +import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; + +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.recipe.BasicUIProperties; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.common.misc.DrillingLogicDelegate; + +public class MTEPump extends MTEBasicMachine { + + private static final ItemStack MINING_PIPE = GTModHandler.getIC2Item("miningPipe", 0); + + private static final ItemStack MINING_PIPE_ONE = GTModHandler.getIC2Item("miningPipe", 1); + private static final Block MINING_PIPE_BLOCK = GTUtility.getBlockFromStack(MINING_PIPE); + private static final Block MINING_PIPE_TIP_BLOCK = GTUtility + .getBlockFromStack(GTModHandler.getIC2Item("miningPipeTip", 0)); + + public static int getMaxDistanceForTier(int aTier) { + return (10 * ((int) Math.pow(1.6D, aTier))); + } + + public static long getEuUsagePerTier(int aTier) { + return (16 * ((long) Math.pow(4, aTier))); + } + + public ArrayDeque mPumpList = new ArrayDeque<>(); + public boolean wasPumping = false; + public int mPumpTimer = 0; + public int mPumpCountBelow = 0; + public Block mPrimaryPumpedBlock = null; + public Block mSecondaryPumpedBlock = null; + + private int radiusConfig; // Pump configured radius + private boolean mRetractDone = false; + + private boolean mDisallowRetract = true; + + public MTEPump(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + new String[] { "The best way to empty Oceans!", + getEuUsagePerTier(aTier) + " EU/operation, " + + GTUtility.safeInt(160 / 20 / (long) Math.pow(2, aTier)) + + " sec per bucket, no stuttering", + "Maximum pumping area: " + (getMaxDistanceForTier(aTier) * 2 + 1) + + "x" + + (getMaxDistanceForTier(aTier) * 2 + 1), + "Use Screwdriver to regulate pumping area", "Use Soft Mallet to disable and retract the pipe", + "Disable the bottom pump to retract the pipe!", + "Use Soldering Iron to auto retract the pipe when hitting a rock", }, + 2, + 2, + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_ACTIVE")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_GLOW")) + .glow() + .build())); + + radiusConfig = getMaxDistanceForTier(mTier); + } + + public MTEPump(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, 2, 2); + radiusConfig = getMaxDistanceForTier(mTier); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPump(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + private static final FallbackableUITexture progressBarTexture = GTUITextures + .fallbackableProgressbar("pump", GTUITextures.PROGRESSBAR_CANNER); + + @Override + protected BasicUIProperties getUIProperties() { + return BasicUIProperties.builder() + .maxItemInputs(2) + .maxItemOutputs(2) + .slotOverlays((index, isFluid, isOutput, isSpecial) -> { + if (!isFluid && !isOutput && !isSpecial) { + return GTUITextures.OVERLAY_SLOT_MINING_PIPE; + } else { + return null; + } + }) + .maxFluidInputs(0) + .maxFluidOutputs(1) + .progressBarTexture(progressBarTexture) + .build(); + } + + @Override + public int getCapacity() { + return getCapacityForTier(mTier); + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && aStack.getItem() == DrillingLogicDelegate.MINING_PIPE_STACK.getItem(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + boolean wasPumping = this.wasPumping || !this.mPumpList.isEmpty(); + if (debugBlockPump) { + GTLog.out.println( + "PUMP: NBT:Save - WasPumping - " + wasPumping + + " blocks (" + + this.mPrimaryPumpedBlock + + ", " + + this.mSecondaryPumpedBlock + + ")"); + } + super.saveNBTData(aNBT); + aNBT.setString( + "mPumpedBlock1", + this.mPrimaryPumpedBlock == null ? "" : Block.blockRegistry.getNameForObject(this.mPrimaryPumpedBlock)); + aNBT.setString( + "mPumpedBlock2", + this.mSecondaryPumpedBlock == null ? "" : Block.blockRegistry.getNameForObject(this.mSecondaryPumpedBlock)); + aNBT.setBoolean("wasPumping", wasPumping); + aNBT.setInteger("radiusConfig", radiusConfig); + aNBT.setBoolean("mRetractDone", mRetractDone); + aNBT.setBoolean("mDisallowRetract", mDisallowRetract); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.wasPumping = aNBT.getBoolean("wasPumping"); + if (aNBT.hasKey("radiusConfig")) this.radiusConfig = aNBT.getInteger("radiusConfig"); + this.mPrimaryPumpedBlock = Block.getBlockFromName(aNBT.getString("mPumpedBlock1")); + this.mSecondaryPumpedBlock = Block.getBlockFromName(aNBT.getString("mPumpedBlock2")); + this.mRetractDone = aNBT.getBoolean("mRetractDone"); + this.mDisallowRetract = aNBT.getBoolean("mDisallowRetract"); + + // Transition from old TE which was derived from GT_MetaTileEntity_Hatch + if (!aNBT.hasKey("mEUt")) { + // Output of old pump always faces up. + getBaseMetaTileEntity().setFrontFacing(ForgeDirection.UP); + + // Automatic output on. + mFluidTransfer = true; + + // Fluid was stored in the hatch, now needs to go to the output. + if (mFluid != null && mFluid.amount > 0) { + fluidOutputTank.fill(mFluid, true); + mFluid = null; + } + + // Move pipes (or other things) from old slots to new ones. + if (mInventory[1] != null && mInventory[1].stackSize > 0) { + mInventory[getInputSlot() + 1] = mInventory[1]; + mInventory[1] = null; + } + + if (mInventory[0] != null && mInventory[0].stackSize > 0) { + mInventory[getInputSlot()] = mInventory[0]; + mInventory[0] = null; + } + } + + if (debugBlockPump) { + GTLog.out.println( + "PUMP: NBT:Load - WasPumping - " + this.wasPumping + + "(" + + aNBT.getString("mPumpedBlock1") + + ") " + + this.mPrimaryPumpedBlock); + } + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + super.setItemNBT(aNBT); + aNBT.setInteger("radiusConfig", radiusConfig); + aNBT.setBoolean("mDisallowRetract", mDisallowRetract); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); + + if (side == getBaseMetaTileEntity().getFrontFacing() || side == mMainFacing) { + // Configuring "input from output side allowed". + return; + } + + int max = getMaxPumpableDistance(); + if (aPlayer.isSneaking()) { + if (radiusConfig >= 0) { + radiusConfig--; + } + if (radiusConfig < 0) radiusConfig = max; + } else { + if (radiusConfig <= max) { + radiusConfig++; + } + if (radiusConfig > max) radiusConfig = 0; + } + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.workareaset") + " " + + (radiusConfig * 2 + 1) + + "x" + + (radiusConfig * 2 + 1)); // TODO Add translation support + + clearQueue(false); + } + + @Override + public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, + EntityPlayer entityPlayer, float aX, float aY, float aZ) { + if (super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ)) return true; + mDisallowRetract = !mDisallowRetract; + GTUtility.sendChatToPlayer( + entityPlayer, + StatCollector.translateToLocal( + mDisallowRetract ? "GT5U.machines.autoretract.disabled" : "GT5U.machines.autoretract.enabled")); + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + + if (getBaseMetaTileEntity().isServerSide()) { + this.mPumpTimer -= 1; + if ((getBaseMetaTileEntity() instanceof BaseTileEntity)) { + ((BaseTileEntity) getBaseMetaTileEntity()).ignoreUnloadedChunks = false; + } + this.doTickProfilingInThisTick = true; + this.mPumpCountBelow = 0; + + IGregTechTileEntity tTileEntity; + for (int i = 1; (i < 21) + && ((tTileEntity = getBaseMetaTileEntity() + .getIGregTechTileEntityAtSideAndDistance(ForgeDirection.DOWN, i)) != null) + && ((tTileEntity.getMetaTileEntity() instanceof MTEPump)); i++) { + // Apparently someone might stack 21 pumps on top of each other, so let's check for that + getBaseMetaTileEntity().setActive(tTileEntity.isActive()); + this.mPumpCountBelow += 1; + // The more pumps we have stacked, the faster the ones below go + ((MTEPump) tTileEntity.getMetaTileEntity()).mPumpTimer -= 1; + ((MTEPump) tTileEntity.getMetaTileEntity()).mProgresstime += 1; + } + if (debugBlockPump && (this.mPumpCountBelow != 0)) { + GTLog.out.println("PUMP: Detected " + this.mPumpCountBelow + " pumps below this pump."); + } + if (this.mPumpCountBelow <= 0) { + // Only the bottom most pump does anything + if (getBaseMetaTileEntity().isAllowedToWork()) { + mRetractDone = false; + if ((getBaseMetaTileEntity().isUniversalEnergyStored(this.getEuUsagePerAction())) + && (fluidOutputTank.getFluidAmount() + 1000 <= fluidOutputTank.getCapacity())) { + boolean tMovedOneDown = false; + if ((this.mPumpList.isEmpty()) && (getBaseMetaTileEntity().getTimer() % 100L == 0L)) { + if (!this.wasPumping) { + tMovedOneDown = moveOneDown(); + if (!tMovedOneDown) { + if (canMoveDown( + getBaseMetaTileEntity().getXCoord(), + Math.max(getYOfPumpHead() - 1, 1), + getBaseMetaTileEntity().getZCoord())) { + if (debugBlockPump) { + GTLog.out.println("PUMP: No pipe left. Idle for a little longer."); + } + this.mPumpTimer = 160; + } else { + getBaseMetaTileEntity().disableWorking(); + if (debugBlockPump) { + GTLog.out.println("PUMP: Can't move. Retracting in next few ticks"); + } + } + } else if (debugBlockPump) { + GTLog.out.println("PUMP: Moved down"); + } + } else if (debugBlockPump) { + GTLog.out.println("PUMP: Was pumping, didn't move down"); + } + } + int x = getBaseMetaTileEntity().getXCoord(), z = getBaseMetaTileEntity().getZCoord(); + + if (!this.hasValidFluid()) { + // We don't have a valid block, let's try to find one + int y = getYOfPumpHead(); + + if (debugBlockPump && this.mPrimaryPumpedBlock != null) { + GTLog.out.println( + "PUMP: Had an invalid pump block. Trying to find a fluid at Y: " + y + + " Previous blocks 1: " + + this.mPrimaryPumpedBlock + + " 2: " + + this.mSecondaryPumpedBlock); + } + // First look down + checkForFluidToPump(x, y - 1, z); + + // Then look all around + checkForFluidToPump(x, y, z + 1); + checkForFluidToPump(x, y, z - 1); + checkForFluidToPump(x + 1, y, z); + checkForFluidToPump(x - 1, y, z); + this.clearQueue(false); + + if (this.hasValidFluid()) { + // Don't move down and rebuild the queue if we now have a valid fluid + this.wasPumping = true; + } + + } else if (getYOfPumpHead() < getBaseMetaTileEntity().getYCoord()) { + // We didn't just look for a block, and the pump head is below the pump + if ((tMovedOneDown) || this.wasPumping + || ((this.mPumpList.isEmpty()) && (getBaseMetaTileEntity().getTimer() % 200L == 100L)) + || (getBaseMetaTileEntity().getTimer() % 72000L == 100L)) { + // Rebuild the list to pump if any of the following conditions are true: + // 1) We just moved down + // 2) We were previously pumping (and possibly just reloaded) + // 3) We have an empty queue and enough time has passed + // 4) A long while has passed + if (debugBlockPump) { + GTLog.out.println( + "PUMP: Rebuilding pump list - Size " + this.mPumpList.size() + + " WasPumping: " + + this.wasPumping + + " Timer " + + getBaseMetaTileEntity().getTimer()); + } + int yPump = getBaseMetaTileEntity().getYCoord() - 1, yHead = getYOfPumpHead(); + + this.rebuildPumpQueue(x, yPump, z, yHead); + + if (debugBlockPump) { + GTLog.out.println("PUMP: Rebuilt pump list - Size " + this.mPumpList.size()); + } + } + if ((!tMovedOneDown) && (this.mPumpTimer <= 0)) { + while ((!this.mPumpList.isEmpty())) { + ChunkPosition pos = this.mPumpList.pollLast(); + if (consumeFluid(pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ)) { + // Keep trying until we consume something, or the list is empty + break; + } + } + this.mPumpTimer = GTUtility.safeInt(160 / (long) Math.pow(2, this.mTier)); + this.mPumpTimer = mPumpTimer == 0 ? 1 : mPumpTimer; + + mMaxProgresstime = mPumpTimer; + mProgresstime = 0; + } + } else { + // We somehow have a valid fluid, but the head of the pump isn't below the pump. Perhaps + // someone broke some pipes + // -- Clear the queue and we should try to move down until we can find a valid fluid + this.clearQueue(false); + } + } else if (debugBlockPump) { + GTLog.out.println("PUMP: Not enough energy? Free space?"); + } + } else { + mMaxProgresstime = 0; + + if (!mRetractDone && ((aTick % 5) == 0) && canOutput(MINING_PIPE_ONE)) { + // try retract if all of these conditions are met + // 1. not retracted yet + // 2. once per 5 tick + // 3. can hold retracted pipe in inventory + int tHeadY = getYOfPumpHead(); + if (tHeadY < this.getBaseMetaTileEntity() + .getYCoord()) { + final int tXCoord = this.getBaseMetaTileEntity() + .getXCoord(); + final int tZCoord = this.getBaseMetaTileEntity() + .getZCoord(); + this.getBaseMetaTileEntity() + .getWorld() + .setBlockToAir(tXCoord, tHeadY, tZCoord); + if (tHeadY < this.getBaseMetaTileEntity() + .getYCoord() - 1) { + getBaseMetaTileEntity().getWorld() + .setBlock(tXCoord, tHeadY + 1, tZCoord, MINING_PIPE_TIP_BLOCK); + } + + for (int i = 0; i < mOutputItems.length; ++i) { + if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot() + i, MINING_PIPE_ONE.copy())) { + break; + } + } + + if (debugBlockPump) { + GTLog.out.println("PUMP: Retracted one pipe"); + } + } else { + mRetractDone = true; + if (debugBlockPump) { + GTLog.out.println("PUMP: Retract done"); + } + } + } + } + if (!mDisallowRetract) getBaseMetaTileEntity().setActive(!this.mPumpList.isEmpty()); + } + } + } + + private int getMaxPumpableDistance() { + return getMaxDistanceForTier(this.mTier); + } + + private long getEuUsagePerAction() { + return getEuUsagePerTier(this.mTier); + } + + private boolean hasValidFluid() { + return mPrimaryPumpedBlock != null && mSecondaryPumpedBlock != null; + } + + private boolean moveOneDown() { + boolean foundPipe = false; + + for (int i = 0; i < mInputSlotCount; i++) { + ItemStack stack = getInputAt(i); + if (stack != null && GTUtility.areStacksEqual(stack, MINING_PIPE) && stack.stackSize > 0) { + foundPipe = true; + break; + } + } + + if (!foundPipe) { + // No mining pipes + if (debugBlockPump) { + GTLog.out.println("PUMP: No mining pipes"); + } + return false; + } + + int yHead = getYOfPumpHead(); + if (yHead <= 1) { + // Let's not punch through bedrock + if (debugBlockPump) { + GTLog.out.println("PUMP: At bottom"); + } + return false; + } + + int x = getBaseMetaTileEntity().getXCoord(), z = getBaseMetaTileEntity().getZCoord(); + + Block aBlock = getBaseMetaTileEntity().getBlock(x, yHead - 1, z); + boolean canReplaceBlock = aBlock.isReplaceable(getBaseMetaTileEntity().getWorld(), x, yHead - 1, z); + + // We specifically allow replacing water even if we can't consume it + // (e.g. pump holds a different fluid) to help avoid getting stuck on random water pockets. + if (!canReplaceBlock || (isFluid(aBlock) && !consumeFluid(x, yHead - 1, z) && !isWater(aBlock))) { + // Either we didn't consume a fluid, or it's a non-replaceable block, or it's water. + if (debugBlockPump) { + GTLog.out.println("PUMP: Did not consume fluid, or non-replaceable block found"); + } + return false; + } + // Try to set the block below us to a tip + if (!GTUtility.setBlockByFakePlayer( + getFakePlayer(getBaseMetaTileEntity()), + x, + yHead - 1, + z, + MINING_PIPE_TIP_BLOCK, + 0, + false)) { + if (debugBlockPump) { + GTLog.out.println("PUMP: Could not set block below to new tip"); + } + return false; + } + // And change the previous block to a pipe -- as long as it isn't the pump itself! + if (yHead != getBaseMetaTileEntity().getYCoord()) { + getBaseMetaTileEntity().getWorld() + .setBlock(x, yHead, z, MINING_PIPE_BLOCK); + } + + // Remove pipe from inputs. + foundPipe = false; + + for (int i = 0; i < mInputSlotCount; i++) { + ItemStack stack = getInputAt(i); + if (stack != null && GTUtility.areStacksEqual(stack, MINING_PIPE) && stack.stackSize > 0) { + foundPipe = true; + stack.stackSize -= 1; + if (stack.stackSize == 0) { + mInventory[getInputSlot() + i] = null; + } + break; + } + } + + if (debugBlockPump) { + if (foundPipe) { + GTLog.out.println("PUMP: Using 1 pipe"); + } else { + GTLog.err.println("PUMP: Lowered pipe but could not find pipe in input"); + } + } + + return true; + } + + private int getYOfPumpHead() { + // Let's play find the pump head! + + // TODO: Handle pipe|pipe|head|pipe|pipe + int y = getBaseMetaTileEntity().getYCoord() - 1, x = getBaseMetaTileEntity().getXCoord(), + z = getBaseMetaTileEntity().getZCoord(); + + while (y > 0) { + Block curBlock = getBaseMetaTileEntity().getBlock(x, y, z); + if (curBlock == MINING_PIPE_BLOCK) { + y--; + } else if (curBlock == MINING_PIPE_TIP_BLOCK) { + Block nextBlock = getBaseMetaTileEntity().getBlock(x, y - 1, z); + if (nextBlock == MINING_PIPE_BLOCK || nextBlock == MINING_PIPE_TIP_BLOCK) { + // We're running into an existing set of pipes -- Turn this block into a pipe and keep going + this.clearQueue(true); + getBaseMetaTileEntity().getWorld() + .setBlock(x, y, z, MINING_PIPE_BLOCK); + if (debugBlockPump) { + GTLog.out.println("PUMP: Hit pipes already in place, trying to merge"); + } + } + y--; + + } else { + break; + } + } + + if (getBaseMetaTileEntity().getBlock(x, y, z) != MINING_PIPE_TIP_BLOCK) { + if (y != getBaseMetaTileEntity().getYCoord() - 1 + && getBaseMetaTileEntity().getBlock(x, y + 1, z) == MINING_PIPE_BLOCK) { + // We're below the pump at the bottom of the pipes, we haven't found a tip; make the previous pipe a + // tip! + this.clearQueue(true); + getBaseMetaTileEntity().getWorld() + .setBlock(x, y + 1, z, MINING_PIPE_TIP_BLOCK); + if (debugBlockPump) { + GTLog.out.println("PUMP: Did not find a tip at bottom, setting last pipe as tip"); + } + } + return y + 1; + } + return y; + } + + private void clearQueue(boolean checkPumping) { + if (checkPumping) { + this.wasPumping = !this.mPumpList.isEmpty(); + } else { + this.wasPumping = false; + } + this.mPumpList.clear(); + } + + private void rebuildPumpQueue(int aX, int yStart, int aZ, int yEnd) { + int mDist = this.radiusConfig; + doTickProfilingInThisTick = false; + ArrayDeque fluidsToSearch = new ArrayDeque<>(); + ArrayDeque fluidsFound = new ArrayDeque<>(); + Set checked = new HashSet<>(); + this.clearQueue(false); + + for (int aY = yStart; this.mPumpList.isEmpty() && aY >= yEnd; aY--) { + // Start at the top (presumably the block below the pump), and work our way down to the end (presumably the + // location of the pump Head) + // and build up a queue of fluids to pump + fluidsToSearch.add(new ChunkPosition(aX, aY, aZ)); + + while (!fluidsToSearch.isEmpty()) { + for (ChunkPosition tPos : fluidsToSearch) { + // Look all around + if (tPos.chunkPosX < aX + mDist) + queueFluid(tPos.chunkPosX + 1, tPos.chunkPosY, tPos.chunkPosZ, fluidsFound, checked); + if (tPos.chunkPosX > aX - mDist) + queueFluid(tPos.chunkPosX - 1, tPos.chunkPosY, tPos.chunkPosZ, fluidsFound, checked); + if (tPos.chunkPosZ < aZ + mDist) + queueFluid(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ + 1, fluidsFound, checked); + if (tPos.chunkPosZ > aZ - mDist) + queueFluid(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ - 1, fluidsFound, checked); + + // And then look up + queueFluid(tPos.chunkPosX, tPos.chunkPosY + 1, tPos.chunkPosZ, this.mPumpList, checked); + } + this.mPumpList.addAll(fluidsFound); + fluidsToSearch = fluidsFound; + fluidsFound = new ArrayDeque<>(); + } + + // Make sure we don't have the pipe location in the queue + this.mPumpList.remove(new ChunkPosition(aX, aY, aZ)); + } + } + + private boolean queueFluid(int aX, int aY, int aZ, ArrayDeque fluidsFound, + Set checked) { + // If we haven't already looked at this coordinate set, and it's not already in the list of fluids found, see if + // there is + // a valid fluid and add it to the fluids found + ChunkPosition tCoordinate = new ChunkPosition(aX, aY, aZ); + if (checked.add(tCoordinate) && !fluidsFound.contains(tCoordinate)) { + Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); + if ((this.mPrimaryPumpedBlock == aBlock) || (this.mSecondaryPumpedBlock == aBlock)) { + fluidsFound.addFirst(tCoordinate); + return true; + } + } + return false; + } + + private void checkForFluidToPump(int aX, int aY, int aZ) { + // If we don't currently have a valid fluid to pump, try pumping the fluid at the given coordinates + if (this.hasValidFluid()) return; + + Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); + if (aBlock != null) { + if (isWater(aBlock)) { + this.mPrimaryPumpedBlock = Blocks.water; + this.mSecondaryPumpedBlock = Blocks.flowing_water; + return; + } + if (isLava(aBlock)) { + this.mPrimaryPumpedBlock = Blocks.lava; + this.mSecondaryPumpedBlock = Blocks.flowing_lava; + return; + } + if ((aBlock instanceof IFluidBlock)) { + this.mPrimaryPumpedBlock = aBlock; + this.mSecondaryPumpedBlock = aBlock; + return; + } + } + this.mPrimaryPumpedBlock = null; + this.mSecondaryPumpedBlock = null; + } + + /** only check if block below can be replaced with pipe tip. pipe stockpile condition is ignored */ + private boolean canMoveDown(int aX, int aY, int aZ) { + if (!GTUtility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), aX, aY, aZ, true)) return false; + + Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); + + return aBlock != null && aBlock.isReplaceable(getBaseMetaTileEntity().getWorld(), aX, aY, aZ); + } + + private boolean consumeFluid(int aX, int aY, int aZ) { + // Try to consume a fluid at a location + // Returns true if something was consumed, otherwise false + if (!GTUtility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), aX, aY, aZ, true)) return false; + + Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ); + if (!isFluid(aBlock)) { + return false; + } + + if (aBlock != null && ((this.mPrimaryPumpedBlock == aBlock) || (this.mSecondaryPumpedBlock == aBlock))) { + boolean isWaterOrLava = ((this.mPrimaryPumpedBlock == Blocks.water + || this.mPrimaryPumpedBlock == Blocks.lava)); + + if (isWaterOrLava && getBaseMetaTileEntity().getMetaID(aX, aY, aZ) != 0) { + // Water/Lava that isn't a source block - do nothing here, but set the block to air and consume energy + // below + if (debugBlockPump) { + GTLog.out.println("PUMP: Water/Lava - Not a source block"); + } + + } else if (getDrainableStack() == null) { + // The pump has no internal fluid + if (this.mPrimaryPumpedBlock == Blocks.water) setDrainableStack(GTModHandler.getWater(1000L)); + else if (this.mPrimaryPumpedBlock == Blocks.lava) setDrainableStack(GTModHandler.getLava(1000L)); + else { + // Not water or lava; try to drain and set to air + setDrainableStack( + ((IFluidBlock) aBlock).drain(getBaseMetaTileEntity().getWorld(), aX, aY, aZ, true)); + } + + } else if (GTModHandler.isWater(getDrainableStack()) || GTModHandler.isLava(getDrainableStack()) + || getDrainableStack().isFluidEqual( + ((IFluidBlock) aBlock).drain(getBaseMetaTileEntity().getWorld(), aX, aY, aZ, false))) { + if (!isWaterOrLava) { + // Only set Block to Air for non lava/water fluids + this.getBaseMetaTileEntity() + .getWorld() + .setBlockToAir(aX, aY, aZ); + } + getDrainableStack().amount += 1000; + + } else { + if (debugBlockPump) { + GTLog.out.println("PUMP: Couldn't consume " + aBlock); + } + // We didn't do anything + return false; + } + + getBaseMetaTileEntity().decreaseStoredEnergyUnits(this.getEuUsagePerAction(), true); + getBaseMetaTileEntity().getWorld() + .setBlock(aX, aY, aZ, Blocks.air, 0, 2); + return true; + } + return false; + } + + private static boolean isWater(Block aBlock) { + return aBlock == Blocks.water || aBlock == Blocks.flowing_water; + } + + private static boolean isLava(Block aBlock) { + return aBlock == Blocks.lava || aBlock == Blocks.flowing_lava; + } + + private static boolean isFluid(Block aBlock) { + return isWater(aBlock) || isLava(aBlock) || aBlock instanceof IFluidBlock; + } + + @Override + public ArrayList getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, + int aLogLevel, ArrayList aList) { + aList.addAll( + Arrays.asList( + EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.pump") + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.machines.workarea") + ": " + + EnumChatFormatting.GREEN + + (radiusConfig * 2 + 1) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.machines.blocks"), + "Primary pumping fluid: " + + (this.mPrimaryPumpedBlock != null ? this.mPrimaryPumpedBlock.getLocalizedName() : "None"), + "Secondary pumping fluid: " + + (this.mSecondaryPumpedBlock != null ? this.mSecondaryPumpedBlock.getLocalizedName() : "None"), + "Pumps below: " + mPumpCountBelow, + "Queue size: " + mPumpList.size(), + "Pump head at Y: " + getYOfPumpHead(), + "Pump timer: " + mPumpTimer, + "Meta Entity Timer: " + getBaseMetaTileEntity().getTimer())); + return aList; + } + + private FakePlayer mFakePlayer = null; + + protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) { + if (mFakePlayer == null) mFakePlayer = GTUtility.getFakePlayer(aBaseTile); + mFakePlayer.setWorld(aBaseTile.getWorld()); + mFakePlayer.setPosition(aBaseTile.getXCoord(), aBaseTile.getYCoord(), aBaseTile.getZCoord()); + return mFakePlayer; + } + + @Override + public String[] getInfoData() { + return new String[] { + EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.pump") + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.machines.workarea") + ": " + + EnumChatFormatting.GREEN + + (radiusConfig * 2 + 1) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.machines.blocks") }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEReplicator.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEReplicator.java new file mode 100644 index 0000000000..6140fde577 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEReplicator.java @@ -0,0 +1,130 @@ +package gregtech.common.tileentities.machines.basic; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.MachineType; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; + +public class MTEReplicator extends MTEBasicMachine { + + public MTEReplicator(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + MachineType.REPLICATOR.tooltipDescription(), + 1, + 1, + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_SIDE_REPLICATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/replicator/OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_SIDE_REPLICATOR")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_SIDE_REPLICATOR_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_FRONT_REPLICATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/replicator/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_FRONT_REPLICATOR")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_FRONT_REPLICATOR_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_TOP_REPLICATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/replicator/OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_TOP_REPLICATOR")), + TextureFactory.builder() + .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_TOP_REPLICATOR_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of( + new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR_ACTIVE")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon( + "basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW")) + .glow() + .build()), + TextureFactory.of( + TextureFactory + .of(new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR")), + TextureFactory.builder() + .addIcon( + new Textures.BlockIcons.CustomIcon("basicmachines/replicator/OVERLAY_BOTTOM_REPLICATOR_GLOW")) + .glow() + .build())); + } + + public MTEReplicator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, 1, 1); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEReplicator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.replicatorRecipes; + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && ItemList.Cell_Empty.isStackEqual(aStack); + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return aFluid.isFluidEqual(Materials.UUMatter.getFluid(1L)); + } + + @Override + public int getCapacity() { + return 3000; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTERockBreaker.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTERockBreaker.java new file mode 100644 index 0000000000..68dc225793 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTERockBreaker.java @@ -0,0 +1,169 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_GLOW; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.MachineType; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; + +public class MTERockBreaker extends MTEBasicMachine { + + public MTERockBreaker(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + MachineType.ROCKBREAKER.tooltipDescription(), + 1, + 1, + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_ROCK_BREAKER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_ROCK_BREAKER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_GLOW) + .glow() + .build())); + } + + public MTERockBreaker(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, 1, 1); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTERockBreaker(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.rockBreakerFakeRecipes; + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && getRecipeMap().containsInput(aStack); + } + + @Override + public boolean allowSelectCircuit() { + return true; + } + + @Override + public int checkRecipe() { + IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity(); + if ((aBaseMetaTileEntity.getBlockOffset(0, 0, 1) == Blocks.water) + || (aBaseMetaTileEntity.getBlockOffset(0, 0, -1) == Blocks.water) + || (aBaseMetaTileEntity.getBlockOffset(-1, 0, 0) == Blocks.water) + || (aBaseMetaTileEntity.getBlockOffset(1, 0, 0) == Blocks.water)) { + ItemStack tOutput = null; + if (aBaseMetaTileEntity.getBlockOffset(0, 1, 0) == Blocks.lava) { + tOutput = new ItemStack(Blocks.stone, 1); + } else if ((aBaseMetaTileEntity.getBlockOffset(0, 0, 1) == Blocks.lava) + || (aBaseMetaTileEntity.getBlockOffset(0, 0, -1) == Blocks.lava) + || (aBaseMetaTileEntity.getBlockOffset(-1, 0, 0) == Blocks.lava) + || (aBaseMetaTileEntity.getBlockOffset(1, 0, 0) == Blocks.lava)) { + tOutput = new ItemStack(Blocks.cobblestone, 1); + } + if (tOutput != null) { + if (GTUtility.areStacksEqual(getStackInSlot(getCircuitSlot()), GTUtility.getIntegratedCircuit(1))) { + if (GTUtility.areStacksEqual( + getInputAt(0), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))) { + tOutput = new ItemStack(Blocks.obsidian, 1); + if (canOutput(tOutput)) { + getInputAt(0).stackSize -= 1; + calculateOverclockedNess(30, 128); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + this.mOutputItems[0] = tOutput; + return 2; + } + } + } else if (canOutput(tOutput)) { + calculateOverclockedNess(30, 16); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + this.mOutputItems[0] = tOutput; + return 2; + } + } + } + return 0; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEScanner.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEScanner.java new file mode 100644 index 0000000000..742a6a0e84 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEScanner.java @@ -0,0 +1,425 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.D1; +import static gregtech.api.enums.Mods.GalacticraftCore; +import static gregtech.api.enums.Mods.GalacticraftMars; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_GLOW; +import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes; + +import java.util.Objects; + +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IIndividual; +import gregtech.GTMod; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.MachineType; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachine; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.AssemblyLineUtils; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.common.items.behaviors.BehaviourDataOrb; + +public class MTEScanner extends MTEBasicMachine { + + public MTEScanner(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + MachineType.SCANNER.tooltipDescription(), + 1, + 1, + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_SCANNER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_SCANNER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_SIDE_SCANNER), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_SCANNER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_SCANNER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_SCANNER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_FRONT_SCANNER), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_SCANNER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_SCANNER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_SCANNER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_SCANNER), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_SCANNER_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_SCANNER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW) + .glow() + .build()), + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_SCANNER), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_SCANNER_GLOW) + .glow() + .build())); + } + + public MTEScanner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures, 1, 1); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEScanner(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public int checkRecipe() { + ItemStack aStack = getInputAt(0); + if (getOutputAt(0) != null) { + this.mOutputBlocked += 1; + } else if ((GTUtility.isStackValid(aStack)) && (aStack.stackSize > 0)) { + if ((getFillableStack() != null) && (getFillableStack().containsFluid(Materials.Honey.getFluid(100L)))) { + try { + IIndividual tIndividual = AlleleManager.alleleRegistry.getIndividual(aStack); + if (tIndividual != null) { + if (tIndividual.analyze()) { + getFillableStack().amount -= 100; + this.mOutputItems[0] = GTUtility.copyOrNull(aStack); + aStack.stackSize = 0; + NBTTagCompound tNBT = new NBTTagCompound(); + tIndividual.writeToNBT(tNBT); + this.mOutputItems[0].setTagCompound(tNBT); + calculateOverclockedNess(2, 500); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + this.mOutputItems[0] = GTUtility.copyOrNull(aStack); + aStack.stackSize = 0; + this.mMaxProgresstime = 1; + this.mEUt = 1; + return 2; + } + } catch (Throwable e) { + if (D1) { + e.printStackTrace(GTLog.err); + } + } + } + if (ItemList.IC2_Crop_Seeds.isStackEqual(aStack, true, true)) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + if (tNBT.getByte("scan") < 4) { + tNBT.setByte("scan", (byte) 4); + calculateOverclockedNess(8, 160); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + } else { + this.mMaxProgresstime = 1; + this.mEUt = 1; + } + aStack.stackSize -= 1; + this.mOutputItems[0] = GTUtility.copyAmount(1, aStack); + assert this.mOutputItems[0] != null; + this.mOutputItems[0].setTagCompound(tNBT); + return 2; + } + if (ItemList.Tool_DataOrb.isStackEqual(getSpecialSlot(), false, true)) { + if (ItemList.Tool_DataOrb.isStackEqual(aStack, false, true)) { + aStack.stackSize -= 1; + this.mOutputItems[0] = GTUtility.copyAmount(1, getSpecialSlot()); + calculateOverclockedNess(30, 512); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + ItemData tData = GTOreDictUnificator.getAssociation(aStack); + if ((tData != null) && ((tData.mPrefix == OrePrefixes.dust) || (tData.mPrefix == OrePrefixes.cell)) + && (tData.mMaterial.mMaterial.mElement != null) + && (!tData.mMaterial.mMaterial.mElement.mIsIsotope) + && (tData.mMaterial.mMaterial != Materials.Magic) + && (tData.mMaterial.mMaterial.getMass() > 0L)) { + getSpecialSlot().stackSize -= 1; + aStack.stackSize -= 1; + + this.mOutputItems[0] = ItemList.Tool_DataOrb.get(1L); + BehaviourDataOrb.setDataTitle(this.mOutputItems[0], "Elemental-Scan"); + BehaviourDataOrb.setDataName(this.mOutputItems[0], tData.mMaterial.mMaterial.mElement.name()); + calculateOverclockedNess(30, GTUtility.safeInt(tData.mMaterial.mMaterial.getMass() * 8192L)); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + } + if (ItemList.Tool_DataStick.isStackEqual(getSpecialSlot(), false, true)) { + if (ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) { + aStack.stackSize -= 1; + this.mOutputItems[0] = GTUtility.copyAmount(1, getSpecialSlot()); + calculateOverclockedNess(30, 128); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + if (aStack.getItem() == Items.written_book) { + getSpecialSlot().stackSize -= 1; + aStack.stackSize -= 1; + + this.mOutputItems[0] = GTUtility.copyAmount(1, getSpecialSlot()); + assert this.mOutputItems[0] != null; + this.mOutputItems[0].setTagCompound(aStack.getTagCompound()); + calculateOverclockedNess(30, 128); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + if (aStack.getItem() == Items.filled_map) { + getSpecialSlot().stackSize -= 1; + aStack.stackSize -= 1; + + this.mOutputItems[0] = GTUtility.copyAmount(1, getSpecialSlot()); + assert this.mOutputItems[0] != null; + this.mOutputItems[0].setTagCompound( + GTUtility + .getNBTContainingShort(new NBTTagCompound(), "map_id", (short) aStack.getItemDamage())); + calculateOverclockedNess(30, 128); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + + if ((aStack.getItem() + .getUnlocalizedName() + .contains("Schematic") + || aStack.getItem() + .getUnlocalizedName() + .contains("schematic")) + && !aStack.getItem() + .getUnlocalizedName() + .contains("Schematics")) { + if (mTier < 3) return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + String sTier = ""; + + int stackItemID = Item.getIdFromItem(aStack.getItem()); + int stackItemDamage = aStack.getItemDamage(); + if (stackItemID == Item.getIdFromItem( + Objects.requireNonNull(GTModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 0)) + .getItem())) { + if (stackItemDamage == 0 && aStack.toString() + .equals( + Objects + .requireNonNull( + GTModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 0)) + .copy() + .toString())) + sTier = "100"; + else if (stackItemDamage == 1 && aStack.toString() + .equals( + Objects + .requireNonNull( + GTModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 1)) + .copy() + .toString())) + sTier = "2"; + } else { + if (stackItemID == Item.getIdFromItem( + Objects + .requireNonNull(GTModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 0)) + .getItem())) { + if (stackItemDamage == 0 && aStack.toString() + .equals( + Objects + .requireNonNull( + GTModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 0)) + .copy() + .toString())) + sTier = "3"; + else if (stackItemDamage == 1 && aStack.toString() + .equals( + Objects + .requireNonNull( + GTModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 1)) + .copy() + .toString())) + sTier = "101"; + else if (stackItemDamage == 2 && aStack.toString() + .equals( + Objects + .requireNonNull( + GTModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 2)) + .copy() + .toString())) + sTier = "102"; + } else if (aStack.getUnlocalizedName() + .matches(".*\\d+.*")) + sTier = aStack.getUnlocalizedName() + .split("(?<=\\D)(?=\\d)")[1].substring(0, 1); + else sTier = "1"; + } + + getSpecialSlot().stackSize -= 1; + aStack.stackSize -= 1; + + this.mOutputItems[0] = GTUtility.copyAmount(1, getSpecialSlot()); + assert this.mOutputItems[0] != null; + this.mOutputItems[0].setTagCompound( + GTUtility.getNBTContainingShort(new NBTTagCompound(), "rocket_tier", Short.parseShort(sTier))); + + calculateOverclockedNess(480, 36000); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + } + if (getSpecialSlot() == null && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) { + if (GTUtility.ItemNBT.getBookTitle(aStack) + .equals("Raw Prospection Data")) { + GTUtility.ItemNBT.setBookTitle(aStack, "Analyzed Prospection Data"); + GTUtility.ItemNBT.convertProspectionData(aStack); + aStack.stackSize -= 1; + + this.mOutputItems[0] = GTUtility.copyAmount(1, aStack); + calculateOverclockedNess(30, 1000); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + return 2; + } + } + if (ItemList.Tool_DataStick.isStackEqual(getSpecialSlot(), false, true)) { + for (GTRecipe.RecipeAssemblyLine tRecipe : GTRecipe.RecipeAssemblyLine.sAssemblylineRecipes) { + if (GTUtility.areStacksEqual(tRecipe.mResearchItem, aStack, true)) { + boolean failScanner = true; + for (GTRecipe scannerRecipe : scannerFakeRecipes.getAllRecipes()) { + if (GTUtility.areStacksEqual(scannerRecipe.mInputs[0], aStack, true)) { + failScanner = false; + break; + } + } + if (failScanner) { + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + } + + this.mOutputItems[0] = GTUtility.copyAmount(1, getSpecialSlot()); + + // Use Assline Utils + if (AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(this.mOutputItems[0], tRecipe)) { + aStack.stackSize -= 1; + calculateOverclockedNess(30, tRecipe.mResearchTime); + // In case recipe is too OP for that machine + if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + getSpecialSlot().stackSize -= 1; + return 2; + } + } + } + } + } + return 0; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (mProgresstime >= (mMaxProgresstime - 1)) { + if ((this.mOutputItems[0] != null) && (this.mOutputItems[0].getUnlocalizedName() + .equals("gt.metaitem.01.32707"))) { + GTMod.achievements.issueAchievement( + aBaseMetaTileEntity.getWorld() + .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), + "scanning"); + } + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public RecipeMap getRecipeMap() { + return scannerFakeRecipes; + } + + @Override + public int getCapacity() { + return 1000; + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && getRecipeMap().containsInput(aStack); + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTETeleporter.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTETeleporter.java new file mode 100644 index 0000000000..cb7d6d6d71 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTETeleporter.java @@ -0,0 +1,586 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_SIDES; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_SIDES_GLOW; + +import java.util.List; +import java.util.function.Consumer; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityHanging; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.boss.EntityDragonPart; +import net.minecraft.entity.effect.EntityWeatherEffect; +import net.minecraft.entity.item.EntityBoat; +import net.minecraft.entity.item.EntityEnderCrystal; +import net.minecraft.entity.item.EntityEnderEye; +import net.minecraft.entity.item.EntityFireworkRocket; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityMinecart; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.item.EntityXPOrb; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.entity.projectile.EntityFireball; +import net.minecraft.entity.projectile.EntityFishHook; +import net.minecraft.entity.projectile.EntityThrowable; +import net.minecraft.inventory.IInventory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicTank; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.common.config.machinestats.ConfigTeleporter; + +public class MTETeleporter extends MTEBasicTank implements IAddGregtechLogo, IAddUIWidgets { + + private static boolean sInterDimensionalTeleportAllowed = true; + private static int sPassiveEnergyDrain = 2048; + private static int sPowerMultiplyer = 100; + private static double sFPowerMultiplyer = 1.0; + public int mTargetX = 0; + public int mTargetY = 0; + public int mTargetZ = 0; + public int mTargetD = Integer.MIN_VALUE; + public boolean mDebug = false; + + public MTETeleporter(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 3, + new String[] { "Teleport long distances with this little device.", "Use a Dragon Egg or Nitrogen Plasma", + "for Inter-dimensional transmission" }); + } + + public MTETeleporter(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + public MTETeleporter(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + private static float calculateWeight(Entity aEntity) { + if ((aEntity instanceof EntityFishHook)) { + return -1.0F; + } + if ((aEntity instanceof EntityDragonPart)) { + return -1.0F; + } + if ((aEntity instanceof EntityWeatherEffect)) { + return -1.0F; + } + if ((aEntity instanceof EntityPlayer tPlayer)) { + int tCount = 64; + for (int i = 0; i < 36; i++) { + if (tPlayer.inventory.getStackInSlot(i) != null) { + tCount += (tPlayer.inventory.getStackInSlot(i) + .getMaxStackSize() > 1 ? tPlayer.inventory.getStackInSlot(i).stackSize : 64); + } + } + for (int i = 0; i < 4; i++) { + if (tPlayer.inventory.armorInventory[i] != null) { + tCount += 256; + } + } + return Math.min(5.0F, tCount / 666.6F); + } + if (GTUtility.getClassName(aEntity) + .equals("EntityItnt")) { + return 5.0F; + } + if (GTUtility.getClassName(aEntity) + .equals("EntityNuke")) { + return 50.0F; + } + if ((aEntity instanceof EntityArrow)) { + return 0.001F; + } + if ((aEntity instanceof EntityBoat)) { + return 0.1F; + } + if ((aEntity instanceof EntityEnderCrystal)) { + return 2.0F; + } + if ((aEntity instanceof EntityEnderEye)) { + return 0.001F; + } + if ((aEntity instanceof EntityFireball)) { + return 0.001F; + } + if ((aEntity instanceof EntityFireworkRocket)) { + return 0.001F; + } + if ((aEntity instanceof EntityHanging)) { + return 0.005F; + } + if ((aEntity instanceof EntityItem)) { + return 0.001F; + } + if ((aEntity instanceof EntityLiving)) { + return 0.5F; + } + if ((aEntity instanceof EntityMinecart)) { + return 0.1F; + } + if ((aEntity instanceof EntityThrowable)) { + return 0.001F; + } + if ((aEntity instanceof EntityTNTPrimed)) { + return 5.0F; + } + if ((aEntity instanceof EntityXPOrb)) { + return 0.001F; + } + return -1.0F; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) return true; + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTETeleporter(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { "Coordinates:", + "X: " + EnumChatFormatting.GREEN + GTUtility.formatNumbers(this.mTargetX) + EnumChatFormatting.RESET, + "Y: " + EnumChatFormatting.GREEN + GTUtility.formatNumbers(this.mTargetY) + EnumChatFormatting.RESET, + "Z: " + EnumChatFormatting.GREEN + GTUtility.formatNumbers(this.mTargetZ) + EnumChatFormatting.RESET, + "Dimension: " + EnumChatFormatting.GREEN + this.mTargetD + EnumChatFormatting.RESET, + "Dimension Valid: " + (GTUtility.isRealDimension(this.mTargetD) + ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET + : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET), + "Dimension Registered: " + (DimensionManager.isDimensionRegistered(this.mTargetD) + ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET + : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET) }; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side != this.getBaseMetaTileEntity() + .getFrontFacing()) + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER_SIDES), + TextureFactory.builder() + .addIcon(OVERLAY_TELEPORTER_SIDES_GLOW) + .glow() + .build() }; + if (aActive) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], + TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW) + .glow() + .build() }; + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER), + TextureFactory.builder() + .addIcon(OVERLAY_TELEPORTER_GLOW) + .glow() + .build() }; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); + aNBT.setInteger("mTargetX", this.mTargetX); + aNBT.setInteger("mTargetY", this.mTargetY); + aNBT.setInteger("mTargetZ", this.mTargetZ); + aNBT.setInteger("mTargetD", this.mTargetD); + aNBT.setBoolean("mDebug", this.mDebug); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid")); + this.mTargetX = aNBT.getInteger("mTargetX"); + this.mTargetY = aNBT.getInteger("mTargetY"); + this.mTargetZ = aNBT.getInteger("mTargetZ"); + this.mTargetD = aNBT.getInteger("mTargetD"); + this.mDebug = aNBT.getBoolean("mDebug"); + } + + @Override + public void onConfigLoad() { + sInterDimensionalTeleportAllowed = ConfigTeleporter.interDimensionalTPAllowed; + sPassiveEnergyDrain = ConfigTeleporter.passiveEnergyDrain; + sPowerMultiplyer = ConfigTeleporter.powerMultiplier; + sFPowerMultiplyer = sPowerMultiplyer / 100.0; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (getBaseMetaTileEntity().isServerSide()) { + if ((this.mTargetX == 0) && (this.mTargetY == 0) + && (this.mTargetZ == 0) + && (this.mTargetD == Integer.MIN_VALUE)) { + this.mTargetX = aBaseMetaTileEntity.getXCoord(); + this.mTargetY = aBaseMetaTileEntity.getYCoord(); + this.mTargetZ = aBaseMetaTileEntity.getZCoord(); + this.mTargetD = aBaseMetaTileEntity.getWorld().provider.dimensionId; + } + } + } + + public boolean hasDimensionalTeleportCapability() { + return this.mDebug || sInterDimensionalTeleportAllowed; + } + + public boolean isDimensionalTeleportAvailable() { + return this.mDebug || (hasDimensionalTeleportCapability() && GTUtility.isRealDimension(this.mTargetD) + && GTUtility.isRealDimension(getBaseMetaTileEntity().getWorld().provider.dimensionId)); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + + if (mFluid != null) { // Was if null -> Materials.Nitrogen.getPlasma(0); + mFluid = null; + } + super.onPostTick(aBaseMetaTileEntity, aTick); + if (getBaseMetaTileEntity().isServerSide()) { + if ((getBaseMetaTileEntity().isAllowedToWork()) && (getBaseMetaTileEntity().getRedstone())) { + if (getBaseMetaTileEntity().decreaseStoredEnergyUnits(sPassiveEnergyDrain, false)) { + int tDistance = distanceCalculation(); + if (mInventory[0] != null) { + TileEntity tTile = null; + if (this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) { + tTile = getBaseMetaTileEntity().getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); + } else { + World tWorld = DimensionManager.getWorld(this.mTargetD); + if (tWorld != null) { + tTile = tWorld.getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ); + } + } + if (tTile instanceof IInventory) { + int tStacksize = mInventory[0].stackSize; + GTUtility.moveOneItemStack( + this, + tTile, + ForgeDirection.DOWN, + ForgeDirection.DOWN, + null, + false, + (byte) 64, + (byte) 1, + (byte) 64, + (byte) 1); + if (mInventory[0] == null || mInventory[0].stackSize < tStacksize) { + getBaseMetaTileEntity().decreaseStoredEnergyUnits( + (long) (Math.pow(tDistance, 1.5) * tDistance + * (tStacksize - (mInventory[0] == null ? 0 : mInventory[0].stackSize)) + * sFPowerMultiplyer), + false); + } + } + } + List entities_in_box = getBaseMetaTileEntity().getWorld() + .getEntitiesWithinAABB( + Entity.class, + AxisAlignedBB.getBoundingBox( + getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 2) - 1, + getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 2) - 1, + getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 2) - 1, + getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 2) + 2, + getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 2) + 2, + getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 2) + 2)); + + for (Object tObject : entities_in_box) { + if (((tObject instanceof Entity tEntity)) && (!((Entity) tObject).isDead)) { + if (getBaseMetaTileEntity().decreaseStoredEnergyUnits( + (long) (Math.pow(tDistance, 1.5) * calculateWeight(tEntity) * sFPowerMultiplyer), + false)) { + + if (tEntity.ridingEntity != null) { + tEntity.mountEntity(null); + } + if (tEntity.riddenByEntity != null) { + tEntity.riddenByEntity.mountEntity(null); + } + if ((this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) + || (!isDimensionalTeleportAvailable()) + || (!GTUtility.moveEntityToDimensionAtCoords( + tEntity, + this.mTargetD, + this.mTargetX + 0.5D, + this.mTargetY + 0.5D, + this.mTargetZ + 0.5D))) { + if ((tEntity instanceof EntityLivingBase)) { + ((EntityLivingBase) tEntity).setPositionAndUpdate( + this.mTargetX + 0.5D, + this.mTargetY + 0.5D, + this.mTargetZ + 0.5D); + } else { + tEntity.setPosition( + this.mTargetX + 0.5D, + this.mTargetY + 0.5D, + this.mTargetZ + 0.5D); + } + } + } + } + } + } + getBaseMetaTileEntity().setActive(true); + } else { + getBaseMetaTileEntity().setActive(false); + } + } + } + + private int distanceCalculation() { + return Math.abs( + ((this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId) + && (isDimensionalTeleportAvailable()) + ? 4000 + : (int) Math.sqrt( + Math.pow(getBaseMetaTileEntity().getXCoord() - this.mTargetX, 2.0D) + + Math.pow(getBaseMetaTileEntity().getYCoord() - this.mTargetY, 2.0D) + + Math.pow(getBaseMetaTileEntity().getZCoord() - this.mTargetZ, 2.0D)))); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isOverclockerUpgradable() { + return false; + } + + @Override + public boolean isTransformerUpgradable() { + return false; + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return true; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier] * 16; + } + + @Override + public long maxEUStore() { + return 100000000; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxSteamStore() { + return maxEUStore(); + } + + @Override + public long maxAmperesIn() { + return 2; + } + + @Override + public int getStackDisplaySlot() { + return 2; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public int getInputSlot() { + return 0; + } + + @Override + public int getOutputSlot() { + return 0; + } + + @Override + public int getCapacity() { + return 64000; + } + + @Override + public boolean doesFillContainers() { + return false; + } + + @Override + public boolean doesEmptyContainers() { + return false; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return false; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setSize(90, 72) + .setPos(43, 4)) + .widget( + new TextWidget().setStringSupplier(() -> "X: " + numberFormat.format(mTargetX)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 8)) + .widget( + new TextWidget().setStringSupplier(() -> "Y: " + numberFormat.format(mTargetY)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 16)) + .widget( + new TextWidget().setStringSupplier(() -> "Z: " + numberFormat.format(mTargetZ)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 24)) + .widget( + new TextWidget().setStringSupplier(() -> "Dim: " + numberFormat.format(mTargetD)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 32)) + .widget( + TextWidget.dynamicString(() -> "Dim Valid: " + (GTUtility.isRealDimension(mTargetD) ? "Yes" : "No")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> hasDimensionalTeleportCapability()) + .setPos(46, 40)) + .widget(new FakeSyncWidget.FluidStackSyncer(() -> mFluid, val -> mFluid = val)); + + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133); + addChangeNumberButtons(builder, GTUITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151); + + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> mTargetD += val, -16, -8, 7, 58); + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> mTargetD += val, -4, -1, 25, 58); + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> mTargetD += val, 4, 1, 133, 58); + addChangeNumberButton(builder, GTUITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> mTargetD += val, 16, 8, 151, 58); + } + + private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift, + int addNumber, int xPos) { + addChangeNumberButton(builder, overlay, val -> mTargetX += val, addNumberShift, addNumber, xPos, 4); + addChangeNumberButton(builder, overlay, val -> mTargetY += val, addNumberShift, addNumber, xPos, 22); + addChangeNumberButton(builder, overlay, val -> mTargetZ += val, addNumberShift, addNumber, xPos, 40); + } + + private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer setter, + int addNumberShift, int addNumber, int xPos, int yPos) { + builder.widget( + new ButtonWidget() + .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? addNumberShift : addNumber)) + .setBackground(GTUITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, yPos)); + } + + @Override + public GUITextureSet getGUITextureSet() { + return new GUITextureSet().setGregTechLogo(GTUITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(113, 56)); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTETurboCharger.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTETurboCharger.java new file mode 100644 index 0000000000..3e1ebd298e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTETurboCharger.java @@ -0,0 +1,145 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; + +import net.minecraft.item.ItemStack; + +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.metatileentity.MetaTileEntity; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +/** + * Created by danie_000 on 15.10.2016. + */ +public class MTETurboCharger extends MTECharger { + + public MTETurboCharger(int aID, String aName, String aNameRegional, int aTier, String aDescription, + int aSlotCount) { + super(aID, aName, aNameRegional, aTier, aDescription, aSlotCount); + } + + public MTETurboCharger(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, int aSlotCount) { + super(aName, aTier, aDescription, aTextures, aSlotCount); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTETurboCharger(mName, mTier, mDescriptionArray, mTextures, mInventory.length); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[2][17][]; + for (byte b = -1; b < 16; b++) { + rTextures[0][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1] }; + rTextures[1][b + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][b + 1], + Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier] }; + } + return rTextures; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier] * 1536L * mInventory.length; + } + + @Override + public long maxEUStore() { + return V[mTier] * 6144L * mInventory.length; + } + + @Override + public long maxAmperesIn() { + return 16L * mInventory.length; + } + + @Override + public long maxAmperesOut() { + return 4L * mInventory.length; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + + mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3 + || !aBaseMetaTileEntity.isAllowedToWork(); + mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3 + && aBaseMetaTileEntity.isAllowedToWork(); + mBatteryCount = 0; + mChargeableCount = 0; + for (ItemStack tStack : mInventory) { + if (GTModHandler.isElectricItem(tStack, mTier)) { + if (GTModHandler.isChargerItem(tStack)) { + mBatteryCount++; + } + mChargeableCount++; + } + } + + if (getBaseMetaTileEntity() instanceof BaseMetaTileEntity) { + BaseMetaTileEntity mBaseMetaTileEntity = (BaseMetaTileEntity) getBaseMetaTileEntity(); + if (mBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity) { + MetaTileEntity mMetaTileEntity = (MetaTileEntity) mBaseMetaTileEntity.getMetaTileEntity(); + if (mMetaTileEntity.dechargerSlotCount() > 0 + && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { + for (int i = mMetaTileEntity.dechargerSlotStartIndex(), + k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) { + if (mMetaTileEntity.mInventory[i] != null + && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) { + // CODE + mBaseMetaTileEntity.increaseStoredEnergyUnits( + GTModHandler.dischargeElectricItem( + mMetaTileEntity.mInventory[i], + GTUtility.safeInt( + Math.min( + V[mTier] * 120, + mBaseMetaTileEntity.getEUCapacity() + - mBaseMetaTileEntity.getStoredEU())), + (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()), + true, + false, + false), + true); + if (mMetaTileEntity.mInventory[i].stackSize <= 0) { + mMetaTileEntity.mInventory[i] = null; + } + } + } + } + if (mMetaTileEntity.rechargerSlotCount() > 0 && mBaseMetaTileEntity.getStoredEU() > 0) { + for (int i = mMetaTileEntity.rechargerSlotStartIndex(), + k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) { + if (mBaseMetaTileEntity.getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) { + // CODE + mBaseMetaTileEntity + .decreaseStoredEU( + GTModHandler.chargeElectricItem( + mMetaTileEntity.mInventory[i], + GTUtility + .safeInt(Math.min(V[mTier] * 120, mBaseMetaTileEntity.getStoredEU())), + (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getOutputTier()), + true, + false), + true); + if (mMetaTileEntity.mInventory[i].stackSize <= 0) { + mMetaTileEntity.mInventory[i] = null; + } + } + } + } + } + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/MTEWorldAccelerator.java b/src/main/java/gregtech/common/tileentities/machines/basic/MTEWorldAccelerator.java new file mode 100644 index 0000000000..a89064ba35 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/MTEWorldAccelerator.java @@ -0,0 +1,470 @@ +package gregtech.common.tileentities.machines.basic; + +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.Mods.GregTech; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +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.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import eu.usrv.yamcore.auxiliary.PlayerChatHelper; +import gregtech.api.enums.GTValues; +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.MTETieredMachineBlock; +import gregtech.api.objects.GTRenderedTexture; +import gregtech.api.util.GTLog; + +public class MTEWorldAccelerator extends MTETieredMachineBlock { + + // simple name is rather expensive to compute and it's not cached + // see https://stackoverflow.com/q/17369304 + private static final ClassValue simpleNameCache = new ClassValue() { + + @Override + protected String computeValue(Class type) { + return type.getSimpleName(); + } + }; + private static final HashSet> _mBlacklistedTiles = new HashSet<>(); + + public static boolean addTileToBlacklist(Class clazz) { + return _mBlacklistedTiles.add(clazz); + } + + public static boolean addTileToBlacklist(TileEntity tileEntity) { + return _mBlacklistedTiles.add(tileEntity.getClass()); + } + + public static HashSet> get_mBlacklistedTiles() { + return _mBlacklistedTiles; + } + + private int _mRadiusTierOverride = -1; + private int _mSpeedTierOverride = -1; + + private int getRadiusTierOverride() { + if (_mRadiusTierOverride == -1) _mRadiusTierOverride = mTier; + return _mRadiusTierOverride; + } + + private int getSpeedTierOverride() { + if (_mSpeedTierOverride == -1) _mSpeedTierOverride = mTier; + return _mSpeedTierOverride; + } + + private int incSpeedTierOverride() { + _mSpeedTierOverride = getSpeedTierOverride() + 1; + if (_mSpeedTierOverride > mTier) _mSpeedTierOverride = 1; + + return _mSpeedTierOverride; + } + + private int incRadiusTierOverride() { + // Make sure we get the Override value first, as we check it for initial -1 + _mRadiusTierOverride = getRadiusTierOverride() + 1; + if (_mRadiusTierOverride > mTier) _mRadiusTierOverride = 1; + + return _mRadiusTierOverride; + } + + private byte mMode = 0; // 0: RandomTicks around 1: TileEntities with range 1 + private static Textures.BlockIcons.CustomIcon _mGTIco_Norm_Idle; + private static Textures.BlockIcons.CustomIcon _mGTIco_Norm_Active; + private static Textures.BlockIcons.CustomIcon _mGTIco_TE_Idle; + private static Textures.BlockIcons.CustomIcon _mGTIco_TE_Active; + private static int[] mAccelerateStatic = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 512, 512, 512, 512, 512, 512 }; + private static final int AMPERAGE_NORMAL = 3; + private static final int AMPERAGE_TE = 6; + + @Override + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + _mGTIco_Norm_Idle = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR"); + _mGTIco_Norm_Active = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR_ACTIVE"); + _mGTIco_TE_Idle = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR_TE"); + _mGTIco_TE_Active = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_ACCELERATOR_TE_ACTIVE"); + } + + @SideOnly(Side.CLIENT) + @Override + public void onValueUpdate(byte aValue) { + mMode = aValue; + } + + @Override + public byte getUpdateData() { + return mMode; + } + + public MTEWorldAccelerator(int pID, String pName, String pNameRegional, int pTier) { + super(pID, pName, pNameRegional, pTier, 0, ""); + } + + @Override + public String[] getDescription() { + return new String[] { + String + .format("Accelerating things (Max Radius: %d | Max Speed Bonus: x%d)", mTier, mAccelerateStatic[mTier]), + "Use a screwdriver to change mode, sneak to change Radius", "Use a wrench to change speed", + "To accelerate TileEntities, this machine has to be adjacent to it", + String.format("Normal mode consumes up to %s amperage, depending on radius", AMPERAGE_NORMAL), + String.format("TE mode consumes %s amperage", AMPERAGE_TE) }; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + List tInfoDisplay = new ArrayList<>(); + + tInfoDisplay.add(String.format("Accelerator running in %s mode", mModeStr[mMode])); + tInfoDisplay.add( + String.format( + "Speed setting: [%d / %d]", + mAccelerateStatic[getSpeedTierOverride()], + mAccelerateStatic[mTier])); + tInfoDisplay.add( + String.format( + "Consuming %d EU/t", + getEnergyDemand(getSpeedTierOverride(), getRadiusTierOverride(), mMode == 1))); + + // Don't show radius setting if in TE Mode + if (mMode == 0) tInfoDisplay.add(String.format("Radius setting: [%d / %d]", getRadiusTierOverride(), mTier)); + + return tInfoDisplay.toArray(new String[0]); + } + + public MTEWorldAccelerator(String pName, int pTier, int pInvSlotCount, String[] pDescription, + ITexture[][][] pTextures) { + super(pName, pTier, pInvSlotCount, pDescription, pTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity pTileEntity) { + return new MTEWorldAccelerator(mName, mTier, mInventory.length, mDescriptionArray, mTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] pTextures) { + return null; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity pBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean pActive, boolean pRedstone) { + if (mMode == 0) { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], side.offsetY != 0 ? null + : pActive ? new GTRenderedTexture(_mGTIco_Norm_Active) : new GTRenderedTexture(_mGTIco_Norm_Idle) }; + } else { + return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], side.offsetY != 0 ? null + : pActive ? new GTRenderedTexture(_mGTIco_TE_Active) : new GTRenderedTexture(_mGTIco_TE_Idle) }; + } + } + + @Override + public boolean allowPullStack(IGregTechTileEntity pBaseMetaTileEntity, int pIndex, ForgeDirection side, + ItemStack pStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity pBaseMetaTileEntity, int pIndex, ForgeDirection side, + ItemStack pStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound pNBT) { + pNBT.setByte("mAccelMode", mMode); + + // SpeedOverride can never be larger than mTier; Which will never exceed 255, so it's safe to cast here + pNBT.setByte("mSpeed", (byte) getSpeedTierOverride()); + pNBT.setByte("mRadius", (byte) getRadiusTierOverride()); + } + + public long getEnergyDemand(int pSpeedTier, int pRangeTier, boolean pIsAcceleratingTEs) { + // TE mode does not need to consider range setting + if (pIsAcceleratingTEs) return V[pSpeedTier] * AMPERAGE_TE; + + // Include range setting into power calculation + float multiplier = 100.0F / (float) mTier * (float) pRangeTier / 100.0F; + long demand = V[pSpeedTier] * AMPERAGE_NORMAL; + + float tDemand = demand * multiplier; + + return (int) tDemand; + } + + @Override + public void loadNBTData(NBTTagCompound pNBT) { + mMode = pNBT.getByte("mAccelMode"); + + // Make sure we're not crashing with old Accelerator Machines + if (pNBT.hasKey("mSpeed")) _mSpeedTierOverride = pNBT.getByte("mSpeed"); + if (pNBT.hasKey("mRadius")) _mRadiusTierOverride = pNBT.getByte("mRadius"); + } + + @Override + public boolean isAccessAllowed(EntityPlayer pPlayer) { + return true; + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return true; + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 512; + } + + @Override + public long maxEUStore() { + return 512 + V[mTier] * 50; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxAmperesIn() { + return 8; + } + + private static String[] mModeStr = { "Blocks", "TileEntities" }; + + // This uses the Wrench as second tool to cycle speeds + @Override + public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer pPlayer, float aX, + float aY, float aZ) { + incSpeedTierOverride(); + + markDirty(); + PlayerChatHelper.SendInfo( + pPlayer, + String.format("Machine acceleration changed to x%d", mAccelerateStatic[getSpeedTierOverride()])); + + return true; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer pPlayer, float pX, float pY, float pZ) { + if (pPlayer.isSneaking()) { + if (mMode == 0) { + incRadiusTierOverride(); + + markDirty(); + PlayerChatHelper + .SendInfo(pPlayer, String.format("Machine radius changed to %d Blocks", getRadiusTierOverride())); + } else PlayerChatHelper + .SendError(pPlayer, String.format("Can't change radius; Machine is in TileEntity Mode!")); + } else { + mMode = (byte) (mMode == 0x00 ? 0x01 : 0x00); + markDirty(); + PlayerChatHelper.SendInfo(pPlayer, String.format("Switched mode to: %s", mModeStr[mMode])); + } + } + + @Override + public void onPostTick(IGregTechTileEntity pBaseMetaTileEntity, long pTick) { + try { + if (!pBaseMetaTileEntity.isServerSide()) { + return; + } + + long tEnergyDemand = getEnergyDemand(getSpeedTierOverride(), getRadiusTierOverride(), mMode == 1); + + // Do we have enough energy to run? Or are we not allowed to run? + if (pBaseMetaTileEntity.getStoredEU() < tEnergyDemand || !pBaseMetaTileEntity.isAllowedToWork()) { + // Check if machine was active before + if (pBaseMetaTileEntity.isActive()) { + pBaseMetaTileEntity.setActive(false); // Then disable it now + } + } else { + // Continue to drain power + if (pBaseMetaTileEntity.decreaseStoredEnergyUnits(tEnergyDemand, false)) { + World tWorld = pBaseMetaTileEntity.getWorld(); + // Limit the random ticks to once per second + if (mMode == 0) { + if (pTick % 20 == 0) { + doAccelerateNormalBlocks(pBaseMetaTileEntity, tWorld); + } + } else { + doAccelerateTileEntities(pBaseMetaTileEntity, tWorld); + } + + } else { + // Energy drain failed. Disable machine + if (pBaseMetaTileEntity.isActive()) { + pBaseMetaTileEntity.setActive(false); // Then disable it now + } + } + } + } catch (Exception e) { + GTLog.err.println("GT_MetaTileEntity_WorldAccelerator.onPostTick.crash\n" + e.getMessage()); + } + } + + private void doAccelerateTileEntities(IGregTechTileEntity pBaseMetaTileEntity, World pWorld) { + try { + if (!pBaseMetaTileEntity.isActive()) { + getBaseMetaTileEntity().setActive(true); + } + + for (ForgeDirection tDir : ForgeDirection.VALID_DIRECTIONS) { + TileEntity tTile = pBaseMetaTileEntity.getTileEntityAtSide(tDir); + if (isTEBlackListed(tTile)) { + continue; + } + + long tMaxTime = System.nanoTime() + 1000000; + for (int j = 0; j < mAccelerateStatic[getSpeedTierOverride()]; j++) { + tTile.updateEntity(); + if (System.nanoTime() > tMaxTime) { + break; + } + } + } + } catch (Exception e) { + GTLog.err.println("GT_MetaTileEntity_WorldAccelerator.doAccelerateTileEntities.crash\n" + e.getMessage()); + } + } + + // Inspired by ChromatiCraft's TileAccelerator + private boolean isTEBlackListed(TileEntity pTile) { + if (pTile == null) { + return true; // Obvious + } + if (!pTile.canUpdate()) { + return true; // Skip if TE can't update at all + } + if (pTile.isInvalid()) { + return true; // Obvious + } + + String tSimpleClassName = simpleNameCache.get(pTile.getClass()); + String tCanonicalName = pTile.getClass() + .getCanonicalName() + .toLowerCase(); + if (tSimpleClassName.contains("conduit") || tSimpleClassName.contains("wire") + || tSimpleClassName.contains("cable")) { + return true; + } + if (tCanonicalName.contains("appeng") || tCanonicalName.contains(GregTech.ID)) // Don't accelerate ANY gregtech + // machines + { + return true; + } + if (tSimpleClassName.contains("solar") || tCanonicalName.contains("solar")) // Don't accelerate ANY solars + { + return true; + } + + for (String tS : GTValues.blacklistedTileEntiyClassNamesForWA) { + if (tCanonicalName.equalsIgnoreCase(tS)) { + return true; + } + } + + return MTEWorldAccelerator._mBlacklistedTiles.stream() + .map(Class::getCanonicalName) + .map(String::toLowerCase) + .anyMatch(tCanonicalName::equalsIgnoreCase); + } + + /** + * Accelerate normal blocks. Eats some power and adds randomTicks to every block within its working area + * (Tier-Number = radius) This does only affect blocks that implement the "RandomTick" method; Which is mostly used + * for grass growth and plants. + * + * @param pBaseMetaTileEntity + */ + private void doAccelerateNormalBlocks(IGregTechTileEntity pBaseMetaTileEntity, World pWorld) { + if (!pBaseMetaTileEntity.isActive()) { + getBaseMetaTileEntity().setActive(true); + } + + Random rnd = new Random(); + int tX = pBaseMetaTileEntity.getXCoord(); + int tY = pBaseMetaTileEntity.getYCoord(); + int tZ = pBaseMetaTileEntity.getZCoord(); + + int tX1 = tX - getRadiusTierOverride(); + int tX2 = tX + getRadiusTierOverride(); + int tY1 = Math.max(tY - getRadiusTierOverride(), 0); // Limit to bedrock + int tY2 = Math.min(tY + getRadiusTierOverride(), 255); // Limit to build height + int tZ1 = tZ - getRadiusTierOverride(); + int tZ2 = tZ + getRadiusTierOverride(); + + for (int xi = tX1; xi <= tX2; xi++) { + for (int yi = tY1; yi <= tY2; yi++) { + for (int zi = tZ1; zi <= tZ2; zi++) { + tryTickBlock(pWorld, xi, yi, zi, rnd); + } + } + } + } + + /** + * Send a tick to the target block + * + * @param pWorld + * @param pX + * @param pY + * @param pZ + * @param pRnd + */ + private void tryTickBlock(World pWorld, int pX, int pY, int pZ, Random pRnd) { + try { + for (int j = 0; j < getSpeedTierOverride(); j++) { + Block tBlock = pWorld.getBlock(pX, pY, pZ); + if (tBlock.getTickRandomly()) { + tBlock.updateTick(pWorld, pX, pY, pZ, pRnd); + } + } + } catch (Exception e) { + GTLog.err.println("GT_MetaTileEntity_WorldAccelerator.tryTickBlock.crash\n" + e.getMessage()); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java deleted file mode 100644 index ff3048f4b2..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java +++ /dev/null @@ -1,415 +0,0 @@ -/** - * - * Inspired/ported from GregTech 6 under the LGPL license - * - * Copyright (c) 2020 GregTech-6 Team - * - * This file is part of GregTech. - * - * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later - * version. - * - * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see - * . - */ -package gregtech.common.tileentities.machines.long_distance; - -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static mcp.mobius.waila.api.SpecialChars.BLUE; -import static mcp.mobius.waila.api.SpecialChars.GOLD; -import static mcp.mobius.waila.api.SpecialChars.GREEN; -import static mcp.mobius.waila.api.SpecialChars.RED; -import static mcp.mobius.waila.api.SpecialChars.RESET; -import static mcp.mobius.waila.api.SpecialChars.YELLOW; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_Block_LongDistancePipe; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric; -import gregtech.api.util.GT_Utility; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public abstract class GT_MetaTileEntity_LongDistancePipelineBase extends GT_MetaTileEntity_BasicHull_NonElectric { - - protected static final int INPUT_INDEX = 0; - protected static final int OUTPUT_INDEX = 1; - protected static final int SIDE_UP_DOWN_INDEX = 2; - protected static final int SIDE_LEFT_RIGHT_INDEX = 3; - - public static int minimalDistancePoints = 64; - - protected GT_MetaTileEntity_LongDistancePipelineBase mTarget = null; - // these two are updated by machine block update thread, so must be volatile - protected volatile GT_MetaTileEntity_LongDistancePipelineBase mSender = null; - protected volatile ChunkCoordinates mTargetPos = null; - protected GT_MetaTileEntity_LongDistancePipelineBase mTooCloseTarget = null, mTooCloseSender = null; - - public GT_MetaTileEntity_LongDistancePipelineBase(int aID, String aName, String aNameRegional, int aTier, - String aDescription) { - super(aID, aName, aNameRegional, aTier, aDescription); - } - - public GT_MetaTileEntity_LongDistancePipelineBase(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public String[] getDescription() { - return new String[] { "Only one Input and Output are allowed per pipeline", - "Only Input and Output have to be chunkloaded", "Transfer rate is solely limited by input rate", - "Minimum distance: " + minimalDistancePoints + " blocks" }; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (mTargetPos != null && mTarget != this) { - aNBT.setBoolean("target", true); - aNBT.setInteger("target.x", mTargetPos.posX); - aNBT.setInteger("target.y", mTargetPos.posY); - aNBT.setInteger("target.z", mTargetPos.posZ); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("target")) { - mTargetPos = new ChunkCoordinates( - aNBT.getInteger("target.x"), - aNBT.getInteger("target.y"), - aNBT.getInteger("target.z")); - if (getDistanceToSelf(mTargetPos) < minimalDistancePoints) mTargetPos = null; - } - } - - public boolean isSameClass(GT_MetaTileEntity_LongDistancePipelineBase other) { - return false; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (aBaseMetaTileEntity.isClientSide()) return true; - ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); - if (tCurrentItem != null) { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) { - scanPipes(); - return true; - } - } - return false; - } - - public boolean isDead() { - return getBaseMetaTileEntity() == null || getBaseMetaTileEntity().isDead(); - } - - public boolean checkTarget() { - final IGregTechTileEntity gt_tile = getBaseMetaTileEntity(); - if (gt_tile == null || !gt_tile.isAllowedToWork() || gt_tile.isClientSide()) return false; - World world = gt_tile.getWorld(); - if (world == null) return false; - - if (mTargetPos == null) { - // We don't have a target position, scan the pipes - scanPipes(); - } else if (mTarget == null || mTarget.isDead()) { - // We don't have a target, or it's dead. Try checking the target position - mTarget = null; - if (world.blockExists(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ)) { - // Only check if the target position is loaded - TileEntity te = world.getTileEntity(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ); - final IMetaTileEntity tMeta; - if (te instanceof BaseMetaTileEntity - && ((tMeta = ((BaseMetaTileEntity) te) - .getMetaTileEntity()) instanceof GT_MetaTileEntity_LongDistancePipelineBase) - && isSameClass((GT_MetaTileEntity_LongDistancePipelineBase) tMeta)) { - // It's the right type! - mTarget = (GT_MetaTileEntity_LongDistancePipelineBase) tMeta; - } else if (te != null) { - // It isn't the right type, kill the target position - mTargetPos = null; - } - } - } - if (mTooCloseTarget != null && mTooCloseTarget.mSender == null) mTooCloseTarget.mTooCloseSender = this; - if (mTooCloseSender != null && (mTooCloseSender.isDead() || mTooCloseSender.mTarget != null)) - mTooCloseSender = null; - if (mTarget == null || mTarget == this) return false; - if (mTarget.mSender == null || mTarget.mSender.isDead() - || mTarget.mSender.mTarget == null - || mTarget.mSender.mTarget.isDead()) { - mTarget.mSender = this; - mTarget.mTooCloseSender = null; - } - - return mTarget.mSender == this; - } - - @Override - public ArrayList getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, - int aLogLevel, ArrayList aList) { - if (mSender != null && !mSender.isDead() && mSender.mTarget == this) { - final ChunkCoordinates coords = mSender.getCoords(); - aList.addAll( - Arrays.asList( - "Is Pipeline Output", - "Pipeline Input is at: X: " + coords.posX + " Y: " + coords.posY + " Z: " + coords.posZ)); - } else { - aList.addAll( - Arrays.asList( - checkTarget() ? "Is connected to Pipeline Output" : "Pipeline Output is not connected/chunkloaded", - "Pipeline Output should be around: X: " + mTargetPos.posX - + " Y: " - + mTargetPos.posY - + " Z: " - + mTargetPos.posZ)); - } - - return aList; - } - - // What meta should the pipes for this pipeline have - public abstract int getPipeMeta(); - - protected void scanPipes() { - if (mSender != null && !mSender.isDead() && mSender.mTarget == this) return; - - // Check if we need to scan anything - final IGregTechTileEntity gtTile = getBaseMetaTileEntity(); - if (gtTile == null) return; - - final World world = gtTile.getWorld(); - if (world == null) return; - - mTargetPos = getCoords(); - mTarget = this; - mSender = null; - - // Start scanning from the output side - Block aBlock = gtTile.getBlockAtSide(gtTile.getBackFacing()); - - if (aBlock instanceof GT_Block_LongDistancePipe) { - byte aMetaData = gtTile.getMetaIDAtSide(gtTile.getBackFacing()); - if (aMetaData != getPipeMeta()) return; - - HashSet tVisited = new HashSet<>(Collections.singletonList(getCoords())), - tWires = new HashSet<>(); - Queue tQueue = new LinkedList<>( - Collections.singletonList(getFacingOffset(gtTile, gtTile.getBackFacing()))); - - while (!tQueue.isEmpty()) { - final ChunkCoordinates aCoords = tQueue.poll(); - - if (world.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ) == aBlock - && world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ) == aMetaData) { - // We've got another pipe/wire block - // TODO: Make sure it's the right type of pipe/wire via meta - ChunkCoordinates tCoords; - tWires.add(aCoords); - - // For each direction, if we haven't already visited that coordinate, add it to the end of the - // queue - if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX + 1, aCoords.posY, aCoords.posZ))) - tQueue.add(tCoords); - if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX - 1, aCoords.posY, aCoords.posZ))) - tQueue.add(tCoords); - if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY + 1, aCoords.posZ))) - tQueue.add(tCoords); - if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY - 1, aCoords.posZ))) - tQueue.add(tCoords); - if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ + 1))) - tQueue.add(tCoords); - if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ - 1))) - tQueue.add(tCoords); - } else { - // It's not a block - let's see if it's a tile entity - TileEntity tTileEntity = world.getTileEntity(aCoords.posX, aCoords.posY, aCoords.posZ); - if (tTileEntity != gtTile && tTileEntity instanceof BaseMetaTileEntity - && ((BaseMetaTileEntity) tTileEntity) - .getMetaTileEntity() instanceof GT_MetaTileEntity_LongDistancePipelineBase tGtTile) { - if (isSameClass(tGtTile) && tWires.contains( - tGtTile.getFacingOffset( - (BaseMetaTileEntity) tTileEntity, - ((BaseMetaTileEntity) tTileEntity).getFrontFacing()))) { - // If it's the same class, and we've scanned a wire in front of it (the input side), we've - // found our target - // still need to check if it's distant enough - int distance = getDistanceToSelf(aCoords); - if (distance > minimalDistancePoints) { - mTarget = tGtTile; - mTargetPos = tGtTile.getCoords(); - mTooCloseTarget = null; - return; - } else { - if (mTooCloseTarget == null) { - mTooCloseTarget = tGtTile; - } - } - } - - // Remove this block from the visited because we might end up back here from another wire that - // IS connected to the - // input side - tVisited.remove(aCoords); - } - } - } - } - } - - protected int getDistanceToSelf(ChunkCoordinates aCoords) { - return Math.abs(getBaseMetaTileEntity().getXCoord() - aCoords.posX) - + Math.abs(getBaseMetaTileEntity().getYCoord() - aCoords.posY) / 2 - + Math.abs(getBaseMetaTileEntity().getZCoord() - aCoords.posZ); - } - - public ChunkCoordinates getFacingOffset(IGregTechTileEntity gt_tile, ForgeDirection side) { - return new ChunkCoordinates( - gt_tile.getOffsetX(side, 1), - gt_tile.getOffsetY(side, 1), - gt_tile.getOffsetZ(side, 1)); - } - - public ChunkCoordinates getCoords() { - final IGregTechTileEntity gt_tile = getBaseMetaTileEntity(); - return new ChunkCoordinates(gt_tile.getXCoord(), gt_tile.getYCoord(), gt_tile.getZCoord()); - } - - @Override - public void onMachineBlockUpdate() { - mTargetPos = null; - mSender = null; - } - - @Override - public boolean shouldTriggerBlockUpdate() { - return true; - } - - abstract public ITexture[] getTextureOverlays(); - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[4][17][]; - ITexture[] overlays = getTextureOverlays(); - for (int i = 0; i < rTextures[0].length; i++) { - rTextures[INPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], overlays[INPUT_INDEX] }; - rTextures[OUTPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], overlays[OUTPUT_INDEX] }; - rTextures[SIDE_UP_DOWN_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], - overlays[SIDE_UP_DOWN_INDEX] }; - rTextures[SIDE_LEFT_RIGHT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], - overlays[SIDE_LEFT_RIGHT_INDEX] }; - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - colorIndex += 1; - if (sideDirection == facingDirection) return mTextures[INPUT_INDEX][colorIndex]; - else if (sideDirection == facingDirection.getOpposite()) return mTextures[OUTPUT_INDEX][colorIndex]; - else { - switch (facingDirection) { - case UP, DOWN -> { - return mTextures[SIDE_UP_DOWN_INDEX][colorIndex]; - } - case NORTH -> { - switch (sideDirection) { - case DOWN, UP -> { - return mTextures[SIDE_UP_DOWN_INDEX][colorIndex]; - } - case EAST, WEST -> { - return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex]; - } - default -> {} - } - } - case SOUTH -> { - switch (sideDirection) { - case DOWN, UP -> { - return mTextures[SIDE_UP_DOWN_INDEX][colorIndex]; - } - case EAST, WEST -> { - return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex]; - } - default -> {} - } - } - case EAST, WEST -> { - return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex]; - } - default -> {} - } - } - return mTextures[INPUT_INDEX][colorIndex]; // dummy - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - final ForgeDirection facing = getBaseMetaTileEntity().getFrontFacing(); - final ForgeDirection side = accessor.getSide(); - - final NBTTagCompound tag = accessor.getNBTData(); - final boolean hasInput = tag.getBoolean("hasInput"); - final boolean hasInputTooClose = tag.getBoolean("hasInputTooClose"); - final boolean hasOutput = tag.getBoolean("hasOutput"); - final boolean hasOutputTooClose = tag.getBoolean("hasOutputTooClose"); - - if (side == facing) currentTip.add(GOLD + "Pipeline Input" + RESET); - else if (side == facing.getOpposite()) currentTip.add(BLUE + "Pipeline Output" + RESET); - else currentTip.add("Pipeline Side"); - - if (!hasInput && !hasInputTooClose && !hasOutput && !hasOutputTooClose) { - currentTip.add(YELLOW + "Not connected" + RESET); - } - - if (hasInput) currentTip.add(GREEN + "Connected to " + GOLD + "Input" + RESET); - else if (hasInputTooClose) currentTip.add(RED + "Connected Input too close" + RESET); - else if (hasOutput) currentTip.add(GREEN + "Connected to " + BLUE + "Output" + RESET); - else if (hasOutputTooClose) currentTip.add(RED + "Connected Output too close" + RESET); - - super.getWailaBody(itemStack, currentTip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - - tag.setBoolean("hasInput", mSender != null); - tag.setBoolean("hasInputTooClose", mTooCloseSender != null); - tag.setBoolean("hasOutput", mTarget != null && mTarget != this); - tag.setBoolean("hasOutputTooClose", mTooCloseTarget != null); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java deleted file mode 100644 index 70e295f3ad..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * - * Inspired/ported from GregTech 6 under the LGPL license - * - * Copyright (c) 2020 GregTech-6 Team - * - * This file is part of GregTech. - * - * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later - * version. - * - * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see - * . - */ -package gregtech.common.tileentities.machines.long_distance; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_BACK; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW; - -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidHandler; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_LongDistancePipelineFluid extends GT_MetaTileEntity_LongDistancePipelineBase { - - static final FluidTankInfo[] emptyTank = { new FluidTankInfo(null, Integer.MAX_VALUE) }; - - public GT_MetaTileEntity_LongDistancePipelineFluid(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, "Sends fluids over long distances"); - } - - public GT_MetaTileEntity_LongDistancePipelineFluid(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public boolean isSameClass(GT_MetaTileEntity_LongDistancePipelineBase other) { - return other instanceof GT_MetaTileEntity_LongDistancePipelineFluid; - } - - @Override - public int getPipeMeta() { - return 0; - } - - public IFluidHandler getTank() { - final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); - TileEntity tankTile = tTile.getTileEntityAtSide(tTile.getBackFacing()); - if (tankTile instanceof IFluidHandler) return (IFluidHandler) tankTile; - else return null; - } - - @Override - public FluidTankInfo[] getTankInfo(ForgeDirection side) { - if (checkTarget()) { - final IFluidHandler tankTile = getTank(); - if (tankTile != null) return tankTile.getTankInfo(side); - } - - return emptyTank; - } - - @Override - public int fill(ForgeDirection side, FluidStack aFluid, boolean aDoFill) { - if (checkTarget()) { - final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); - final IFluidHandler tankTile = getTank(); - if (tankTile != null) return tankTile.fill(tTile.getFrontFacing(), aFluid, aDoFill); - } - return 0; - } - - @Override - public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean aDoDrain) { - return null; - } - - @Override - public FluidStack drain(ForgeDirection side, int aMaxDrain, boolean aDoDrain) { - return null; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LongDistancePipelineFluid(mName, mTier, getDescription()[0], mTextures); - } - - @Override - public ITexture[] getTextureOverlays() { - ITexture[] overlays = new ITexture[4]; - overlays[INPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_FLUID_FRONT); - overlays[OUTPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_FLUID_BACK); - overlays[SIDE_UP_DOWN_INDEX] = TextureFactory.of( - TextureFactory.of(OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN), - TextureFactory.builder() - .addIcon(OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW) - .glow() - .build()); - overlays[SIDE_LEFT_RIGHT_INDEX] = TextureFactory.of( - TextureFactory.of(OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT), - TextureFactory.builder() - .addIcon(OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW) - .glow() - .build()); - - return overlays; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java deleted file mode 100644 index e1510f4d3d..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java +++ /dev/null @@ -1,214 +0,0 @@ -/** - * - * Inspired/ported from GregTech 6 under the LGPL license - * - * Copyright (c) 2020 GregTech-6 Team - * - * This file is part of GregTech. - * - * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later - * version. - * - * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see - * . - */ -package gregtech.common.tileentities.machines.long_distance; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_BACK; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_FRONT; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW; - -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; - -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_LongDistancePipelineItem extends GT_MetaTileEntity_LongDistancePipelineBase { - - public GT_MetaTileEntity_LongDistancePipelineItem(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, "Sends Items over long distances"); - } - - public GT_MetaTileEntity_LongDistancePipelineItem(String aName, int aTier, String aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public boolean isSameClass(GT_MetaTileEntity_LongDistancePipelineBase other) { - return other instanceof GT_MetaTileEntity_LongDistancePipelineItem; - } - - @Override - public int getPipeMeta() { - return 1; - } - - public IInventory getInventory() { - final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); - TileEntity invTile = tTile.getTileEntityAtSide(tTile.getBackFacing()); - if (invTile instanceof IInventory) return (IInventory) invTile; - else return null; - } - - @Override - public ItemStack decrStackSize(int aSlot, int aDecrement) { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.decrStackSize(aSlot, aDecrement); - } - return null; - } - - @Override - public ItemStack getStackInSlotOnClosing(int aSlot) { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.getStackInSlotOnClosing(aSlot); - } - return null; - } - - @Override - public ItemStack getStackInSlot(int aSlot) { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.getStackInSlot(aSlot); - } - return null; - } - - @Override - public String getInventoryName() { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.getInventoryName(); - } - return super.getInventoryName(); - } - - @Override - public int getSizeInventory() { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.getSizeInventory(); - } - return 0; - } - - @Override - public int getInventoryStackLimit() { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.getInventoryStackLimit(); - } - return 0; - } - - @Override - public void setInventorySlotContents(int aSlot, ItemStack aStack) { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) iInventory.setInventorySlotContents(aSlot, aStack); - } - } - - @Override - public boolean hasCustomInventoryName() { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.hasCustomInventoryName(); - } - return false; - } - - @Override - public boolean isItemValidForSlot(int aSlot, ItemStack aStack) { - if (checkTarget()) { - IInventory iInventory = getInventory(); - if (iInventory != null) return iInventory.isItemValidForSlot(aSlot, aStack); - } - return false; - } - - // // Relay Sided Inventories - // - - @Override - public int[] getAccessibleSlotsFromSide(int ordinalSide) { - if (checkTarget()) { - final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); - final IInventory iInventory = getInventory(); - if (iInventory instanceof ISidedInventory inv) return inv.getAccessibleSlotsFromSide( - tTile.getFrontFacing() - .ordinal()); - if (iInventory != null) { - final int[] tReturn = new int[iInventory.getSizeInventory()]; - for (int i = 0; i < tReturn.length; i++) tReturn[i] = i; - return tReturn; - } - } - - return GT_Values.emptyIntArray; - } - - @Override - public boolean canInsertItem(int aSlot, ItemStack aStack, int ordinalSide) { - if (checkTarget()) { - final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); - IInventory iInventory = getInventory(); - if (iInventory instanceof ISidedInventory iSidedInventory) return iSidedInventory.canInsertItem( - aSlot, - aStack, - tTile.getFrontFacing() - .ordinal()); - return iInventory != null; - } - return false; - } - - @Override - public boolean canExtractItem(int aSlot, ItemStack aStack, int ordinalSide) { - return false; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LongDistancePipelineItem(mName, mTier, getDescription()[0], mTextures); - } - - @Override - public ITexture[] getTextureOverlays() { - ITexture[] overlays = new ITexture[4]; - overlays[INPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_ITEM_FRONT); - overlays[OUTPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_ITEM_BACK); - overlays[SIDE_UP_DOWN_INDEX] = TextureFactory.of( - TextureFactory.of(OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN), - TextureFactory.builder() - .addIcon(OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW) - .glow() - .build()); - overlays[SIDE_LEFT_RIGHT_INDEX] = TextureFactory.of( - TextureFactory.of(OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT), - TextureFactory.builder() - .addIcon(OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW) - .glow() - .build()); - - return overlays; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineBase.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineBase.java new file mode 100644 index 0000000000..6f6f01f3ba --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineBase.java @@ -0,0 +1,412 @@ +/** + * + * Inspired/ported from GregTech 6 under the LGPL license + * + * Copyright (c) 2020 GregTech-6 Team + * + * This file is part of GregTech. + * + * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see + * . + */ +package gregtech.common.tileentities.machines.long_distance; + +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static mcp.mobius.waila.api.SpecialChars.BLUE; +import static mcp.mobius.waila.api.SpecialChars.GOLD; +import static mcp.mobius.waila.api.SpecialChars.GREEN; +import static mcp.mobius.waila.api.SpecialChars.RED; +import static mcp.mobius.waila.api.SpecialChars.RESET; +import static mcp.mobius.waila.api.SpecialChars.YELLOW; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.BlockLongDistancePipe; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicHullNonElectric; +import gregtech.api.util.GTUtility; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public abstract class MTELongDistancePipelineBase extends MTEBasicHullNonElectric { + + protected static final int INPUT_INDEX = 0; + protected static final int OUTPUT_INDEX = 1; + protected static final int SIDE_UP_DOWN_INDEX = 2; + protected static final int SIDE_LEFT_RIGHT_INDEX = 3; + + public static int minimalDistancePoints = 64; + + protected MTELongDistancePipelineBase mTarget = null; + // these two are updated by machine block update thread, so must be volatile + protected volatile MTELongDistancePipelineBase mSender = null; + protected volatile ChunkCoordinates mTargetPos = null; + protected MTELongDistancePipelineBase mTooCloseTarget = null, mTooCloseSender = null; + + public MTELongDistancePipelineBase(int aID, String aName, String aNameRegional, int aTier, String aDescription) { + super(aID, aName, aNameRegional, aTier, aDescription); + } + + public MTELongDistancePipelineBase(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public String[] getDescription() { + return new String[] { "Only one Input and Output are allowed per pipeline", + "Only Input and Output have to be chunkloaded", "Transfer rate is solely limited by input rate", + "Minimum distance: " + minimalDistancePoints + " blocks" }; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (mTargetPos != null && mTarget != this) { + aNBT.setBoolean("target", true); + aNBT.setInteger("target.x", mTargetPos.posX); + aNBT.setInteger("target.y", mTargetPos.posY); + aNBT.setInteger("target.z", mTargetPos.posZ); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("target")) { + mTargetPos = new ChunkCoordinates( + aNBT.getInteger("target.x"), + aNBT.getInteger("target.y"), + aNBT.getInteger("target.z")); + if (getDistanceToSelf(mTargetPos) < minimalDistancePoints) mTargetPos = null; + } + } + + public boolean isSameClass(MTELongDistancePipelineBase other) { + return false; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) return true; + ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); + if (tCurrentItem != null) { + if (GTUtility.isStackInList(tCurrentItem, GregTechAPI.sSoftHammerList)) { + scanPipes(); + return true; + } + } + return false; + } + + public boolean isDead() { + return getBaseMetaTileEntity() == null || getBaseMetaTileEntity().isDead(); + } + + public boolean checkTarget() { + final IGregTechTileEntity gt_tile = getBaseMetaTileEntity(); + if (gt_tile == null || !gt_tile.isAllowedToWork() || gt_tile.isClientSide()) return false; + World world = gt_tile.getWorld(); + if (world == null) return false; + + if (mTargetPos == null) { + // We don't have a target position, scan the pipes + scanPipes(); + } else if (mTarget == null || mTarget.isDead()) { + // We don't have a target, or it's dead. Try checking the target position + mTarget = null; + if (world.blockExists(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ)) { + // Only check if the target position is loaded + TileEntity te = world.getTileEntity(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ); + final IMetaTileEntity tMeta; + if (te instanceof BaseMetaTileEntity + && ((tMeta = ((BaseMetaTileEntity) te).getMetaTileEntity()) instanceof MTELongDistancePipelineBase) + && isSameClass((MTELongDistancePipelineBase) tMeta)) { + // It's the right type! + mTarget = (MTELongDistancePipelineBase) tMeta; + } else if (te != null) { + // It isn't the right type, kill the target position + mTargetPos = null; + } + } + } + if (mTooCloseTarget != null && mTooCloseTarget.mSender == null) mTooCloseTarget.mTooCloseSender = this; + if (mTooCloseSender != null && (mTooCloseSender.isDead() || mTooCloseSender.mTarget != null)) + mTooCloseSender = null; + if (mTarget == null || mTarget == this) return false; + if (mTarget.mSender == null || mTarget.mSender.isDead() + || mTarget.mSender.mTarget == null + || mTarget.mSender.mTarget.isDead()) { + mTarget.mSender = this; + mTarget.mTooCloseSender = null; + } + + return mTarget.mSender == this; + } + + @Override + public ArrayList getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, + int aLogLevel, ArrayList aList) { + if (mSender != null && !mSender.isDead() && mSender.mTarget == this) { + final ChunkCoordinates coords = mSender.getCoords(); + aList.addAll( + Arrays.asList( + "Is Pipeline Output", + "Pipeline Input is at: X: " + coords.posX + " Y: " + coords.posY + " Z: " + coords.posZ)); + } else { + aList.addAll( + Arrays.asList( + checkTarget() ? "Is connected to Pipeline Output" : "Pipeline Output is not connected/chunkloaded", + "Pipeline Output should be around: X: " + mTargetPos.posX + + " Y: " + + mTargetPos.posY + + " Z: " + + mTargetPos.posZ)); + } + + return aList; + } + + // What meta should the pipes for this pipeline have + public abstract int getPipeMeta(); + + protected void scanPipes() { + if (mSender != null && !mSender.isDead() && mSender.mTarget == this) return; + + // Check if we need to scan anything + final IGregTechTileEntity gtTile = getBaseMetaTileEntity(); + if (gtTile == null) return; + + final World world = gtTile.getWorld(); + if (world == null) return; + + mTargetPos = getCoords(); + mTarget = this; + mSender = null; + + // Start scanning from the output side + Block aBlock = gtTile.getBlockAtSide(gtTile.getBackFacing()); + + if (aBlock instanceof BlockLongDistancePipe) { + byte aMetaData = gtTile.getMetaIDAtSide(gtTile.getBackFacing()); + if (aMetaData != getPipeMeta()) return; + + HashSet tVisited = new HashSet<>(Collections.singletonList(getCoords())), + tWires = new HashSet<>(); + Queue tQueue = new LinkedList<>( + Collections.singletonList(getFacingOffset(gtTile, gtTile.getBackFacing()))); + + while (!tQueue.isEmpty()) { + final ChunkCoordinates aCoords = tQueue.poll(); + + if (world.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ) == aBlock + && world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ) == aMetaData) { + // We've got another pipe/wire block + // TODO: Make sure it's the right type of pipe/wire via meta + ChunkCoordinates tCoords; + tWires.add(aCoords); + + // For each direction, if we haven't already visited that coordinate, add it to the end of the + // queue + if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX + 1, aCoords.posY, aCoords.posZ))) + tQueue.add(tCoords); + if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX - 1, aCoords.posY, aCoords.posZ))) + tQueue.add(tCoords); + if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY + 1, aCoords.posZ))) + tQueue.add(tCoords); + if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY - 1, aCoords.posZ))) + tQueue.add(tCoords); + if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ + 1))) + tQueue.add(tCoords); + if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ - 1))) + tQueue.add(tCoords); + } else { + // It's not a block - let's see if it's a tile entity + TileEntity tTileEntity = world.getTileEntity(aCoords.posX, aCoords.posY, aCoords.posZ); + if (tTileEntity != gtTile && tTileEntity instanceof BaseMetaTileEntity + && ((BaseMetaTileEntity) tTileEntity) + .getMetaTileEntity() instanceof MTELongDistancePipelineBase tGtTile) { + if (isSameClass(tGtTile) && tWires.contains( + tGtTile.getFacingOffset( + (BaseMetaTileEntity) tTileEntity, + ((BaseMetaTileEntity) tTileEntity).getFrontFacing()))) { + // If it's the same class, and we've scanned a wire in front of it (the input side), we've + // found our target + // still need to check if it's distant enough + int distance = getDistanceToSelf(aCoords); + if (distance > minimalDistancePoints) { + mTarget = tGtTile; + mTargetPos = tGtTile.getCoords(); + mTooCloseTarget = null; + return; + } else { + if (mTooCloseTarget == null) { + mTooCloseTarget = tGtTile; + } + } + } + + // Remove this block from the visited because we might end up back here from another wire that + // IS connected to the + // input side + tVisited.remove(aCoords); + } + } + } + } + } + + protected int getDistanceToSelf(ChunkCoordinates aCoords) { + return Math.abs(getBaseMetaTileEntity().getXCoord() - aCoords.posX) + + Math.abs(getBaseMetaTileEntity().getYCoord() - aCoords.posY) / 2 + + Math.abs(getBaseMetaTileEntity().getZCoord() - aCoords.posZ); + } + + public ChunkCoordinates getFacingOffset(IGregTechTileEntity gt_tile, ForgeDirection side) { + return new ChunkCoordinates( + gt_tile.getOffsetX(side, 1), + gt_tile.getOffsetY(side, 1), + gt_tile.getOffsetZ(side, 1)); + } + + public ChunkCoordinates getCoords() { + final IGregTechTileEntity gt_tile = getBaseMetaTileEntity(); + return new ChunkCoordinates(gt_tile.getXCoord(), gt_tile.getYCoord(), gt_tile.getZCoord()); + } + + @Override + public void onMachineBlockUpdate() { + mTargetPos = null; + mSender = null; + } + + @Override + public boolean shouldTriggerBlockUpdate() { + return true; + } + + abstract public ITexture[] getTextureOverlays(); + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[4][17][]; + ITexture[] overlays = getTextureOverlays(); + for (int i = 0; i < rTextures[0].length; i++) { + rTextures[INPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], overlays[INPUT_INDEX] }; + rTextures[OUTPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], overlays[OUTPUT_INDEX] }; + rTextures[SIDE_UP_DOWN_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], + overlays[SIDE_UP_DOWN_INDEX] }; + rTextures[SIDE_LEFT_RIGHT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], + overlays[SIDE_LEFT_RIGHT_INDEX] }; + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + colorIndex += 1; + if (sideDirection == facingDirection) return mTextures[INPUT_INDEX][colorIndex]; + else if (sideDirection == facingDirection.getOpposite()) return mTextures[OUTPUT_INDEX][colorIndex]; + else { + switch (facingDirection) { + case UP, DOWN -> { + return mTextures[SIDE_UP_DOWN_INDEX][colorIndex]; + } + case NORTH -> { + switch (sideDirection) { + case DOWN, UP -> { + return mTextures[SIDE_UP_DOWN_INDEX][colorIndex]; + } + case EAST, WEST -> { + return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex]; + } + default -> {} + } + } + case SOUTH -> { + switch (sideDirection) { + case DOWN, UP -> { + return mTextures[SIDE_UP_DOWN_INDEX][colorIndex]; + } + case EAST, WEST -> { + return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex]; + } + default -> {} + } + } + case EAST, WEST -> { + return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex]; + } + default -> {} + } + } + return mTextures[INPUT_INDEX][colorIndex]; // dummy + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + final ForgeDirection facing = getBaseMetaTileEntity().getFrontFacing(); + final ForgeDirection side = accessor.getSide(); + + final NBTTagCompound tag = accessor.getNBTData(); + final boolean hasInput = tag.getBoolean("hasInput"); + final boolean hasInputTooClose = tag.getBoolean("hasInputTooClose"); + final boolean hasOutput = tag.getBoolean("hasOutput"); + final boolean hasOutputTooClose = tag.getBoolean("hasOutputTooClose"); + + if (side == facing) currentTip.add(GOLD + "Pipeline Input" + RESET); + else if (side == facing.getOpposite()) currentTip.add(BLUE + "Pipeline Output" + RESET); + else currentTip.add("Pipeline Side"); + + if (!hasInput && !hasInputTooClose && !hasOutput && !hasOutputTooClose) { + currentTip.add(YELLOW + "Not connected" + RESET); + } + + if (hasInput) currentTip.add(GREEN + "Connected to " + GOLD + "Input" + RESET); + else if (hasInputTooClose) currentTip.add(RED + "Connected Input too close" + RESET); + else if (hasOutput) currentTip.add(GREEN + "Connected to " + BLUE + "Output" + RESET); + else if (hasOutputTooClose) currentTip.add(RED + "Connected Output too close" + RESET); + + super.getWailaBody(itemStack, currentTip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + + tag.setBoolean("hasInput", mSender != null); + tag.setBoolean("hasInputTooClose", mTooCloseSender != null); + tag.setBoolean("hasOutput", mTarget != null && mTarget != this); + tag.setBoolean("hasOutputTooClose", mTooCloseTarget != null); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineFluid.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineFluid.java new file mode 100644 index 0000000000..e3886360c6 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineFluid.java @@ -0,0 +1,124 @@ +/** + * + * Inspired/ported from GregTech 6 under the LGPL license + * + * Copyright (c) 2020 GregTech-6 Team + * + * This file is part of GregTech. + * + * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see + * . + */ +package gregtech.common.tileentities.machines.long_distance; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_BACK; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.render.TextureFactory; + +public class MTELongDistancePipelineFluid extends MTELongDistancePipelineBase { + + static final FluidTankInfo[] emptyTank = { new FluidTankInfo(null, Integer.MAX_VALUE) }; + + public MTELongDistancePipelineFluid(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, "Sends fluids over long distances"); + } + + public MTELongDistancePipelineFluid(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public boolean isSameClass(MTELongDistancePipelineBase other) { + return other instanceof MTELongDistancePipelineFluid; + } + + @Override + public int getPipeMeta() { + return 0; + } + + public IFluidHandler getTank() { + final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); + TileEntity tankTile = tTile.getTileEntityAtSide(tTile.getBackFacing()); + if (tankTile instanceof IFluidHandler) return (IFluidHandler) tankTile; + else return null; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection side) { + if (checkTarget()) { + final IFluidHandler tankTile = getTank(); + if (tankTile != null) return tankTile.getTankInfo(side); + } + + return emptyTank; + } + + @Override + public int fill(ForgeDirection side, FluidStack aFluid, boolean aDoFill) { + if (checkTarget()) { + final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); + final IFluidHandler tankTile = getTank(); + if (tankTile != null) return tankTile.fill(tTile.getFrontFacing(), aFluid, aDoFill); + } + return 0; + } + + @Override + public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean aDoDrain) { + return null; + } + + @Override + public FluidStack drain(ForgeDirection side, int aMaxDrain, boolean aDoDrain) { + return null; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELongDistancePipelineFluid(mName, mTier, getDescription()[0], mTextures); + } + + @Override + public ITexture[] getTextureOverlays() { + ITexture[] overlays = new ITexture[4]; + overlays[INPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_FLUID_FRONT); + overlays[OUTPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_FLUID_BACK); + overlays[SIDE_UP_DOWN_INDEX] = TextureFactory.of( + TextureFactory.of(OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN), + TextureFactory.builder() + .addIcon(OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW) + .glow() + .build()); + overlays[SIDE_LEFT_RIGHT_INDEX] = TextureFactory.of( + TextureFactory.of(OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT), + TextureFactory.builder() + .addIcon(OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW) + .glow() + .build()); + + return overlays; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineItem.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineItem.java new file mode 100644 index 0000000000..f619d40329 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/long_distance/MTELongDistancePipelineItem.java @@ -0,0 +1,213 @@ +/** + * + * Inspired/ported from GregTech 6 under the LGPL license + * + * Copyright (c) 2020 GregTech-6 Team + * + * This file is part of GregTech. + * + * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see + * . + */ +package gregtech.common.tileentities.machines.long_distance; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_BACK; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_FRONT; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.render.TextureFactory; + +public class MTELongDistancePipelineItem extends MTELongDistancePipelineBase { + + public MTELongDistancePipelineItem(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, "Sends Items over long distances"); + } + + public MTELongDistancePipelineItem(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public boolean isSameClass(MTELongDistancePipelineBase other) { + return other instanceof MTELongDistancePipelineItem; + } + + @Override + public int getPipeMeta() { + return 1; + } + + public IInventory getInventory() { + final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); + TileEntity invTile = tTile.getTileEntityAtSide(tTile.getBackFacing()); + if (invTile instanceof IInventory) return (IInventory) invTile; + else return null; + } + + @Override + public ItemStack decrStackSize(int aSlot, int aDecrement) { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.decrStackSize(aSlot, aDecrement); + } + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int aSlot) { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.getStackInSlotOnClosing(aSlot); + } + return null; + } + + @Override + public ItemStack getStackInSlot(int aSlot) { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.getStackInSlot(aSlot); + } + return null; + } + + @Override + public String getInventoryName() { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.getInventoryName(); + } + return super.getInventoryName(); + } + + @Override + public int getSizeInventory() { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.getSizeInventory(); + } + return 0; + } + + @Override + public int getInventoryStackLimit() { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.getInventoryStackLimit(); + } + return 0; + } + + @Override + public void setInventorySlotContents(int aSlot, ItemStack aStack) { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) iInventory.setInventorySlotContents(aSlot, aStack); + } + } + + @Override + public boolean hasCustomInventoryName() { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.hasCustomInventoryName(); + } + return false; + } + + @Override + public boolean isItemValidForSlot(int aSlot, ItemStack aStack) { + if (checkTarget()) { + IInventory iInventory = getInventory(); + if (iInventory != null) return iInventory.isItemValidForSlot(aSlot, aStack); + } + return false; + } + + // // Relay Sided Inventories + // + + @Override + public int[] getAccessibleSlotsFromSide(int ordinalSide) { + if (checkTarget()) { + final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); + final IInventory iInventory = getInventory(); + if (iInventory instanceof ISidedInventory inv) return inv.getAccessibleSlotsFromSide( + tTile.getFrontFacing() + .ordinal()); + if (iInventory != null) { + final int[] tReturn = new int[iInventory.getSizeInventory()]; + for (int i = 0; i < tReturn.length; i++) tReturn[i] = i; + return tReturn; + } + } + + return GTValues.emptyIntArray; + } + + @Override + public boolean canInsertItem(int aSlot, ItemStack aStack, int ordinalSide) { + if (checkTarget()) { + final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity(); + IInventory iInventory = getInventory(); + if (iInventory instanceof ISidedInventory iSidedInventory) return iSidedInventory.canInsertItem( + aSlot, + aStack, + tTile.getFrontFacing() + .ordinal()); + return iInventory != null; + } + return false; + } + + @Override + public boolean canExtractItem(int aSlot, ItemStack aStack, int ordinalSide) { + return false; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELongDistancePipelineItem(mName, mTier, getDescription()[0], mTextures); + } + + @Override + public ITexture[] getTextureOverlays() { + ITexture[] overlays = new ITexture[4]; + overlays[INPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_ITEM_FRONT); + overlays[OUTPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_ITEM_BACK); + overlays[SIDE_UP_DOWN_INDEX] = TextureFactory.of( + TextureFactory.of(OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN), + TextureFactory.builder() + .addIcon(OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW) + .glow() + .build()); + overlays[SIDE_LEFT_RIGHT_INDEX] = TextureFactory.of( + TextureFactory.of(OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT), + TextureFactory.builder() + .addIcon(OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW) + .glow() + .build()); + + return overlays; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java deleted file mode 100644 index 0c91951e28..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java +++ /dev/null @@ -1,48 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; - -public abstract class GT_MetaTileEntity_AbstractMultiFurnace> - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase { - - private HeatingCoilLevel mCoilLevel; - - protected GT_MetaTileEntity_AbstractMultiFurnace(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - protected GT_MetaTileEntity_AbstractMultiFurnace(String aName) { - super(aName); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - public HeatingCoilLevel getCoilLevel() { - return mCoilLevel; - } - - public void setCoilLevel(HeatingCoilLevel aCoilLevel) { - mCoilLevel = aCoilLevel; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java deleted file mode 100644 index aa422505d7..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java +++ /dev/null @@ -1,495 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.enums.VoidingMode; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_AssemblyLineUtils; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe.GT_Recipe_AssemblyLine; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.IGT_HatchAdder; - -public class GT_MetaTileEntity_AssemblyLine extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - public ArrayList mDataAccessHatches = new ArrayList<>(); - private static final String STRUCTURE_PIECE_FIRST = "first"; - private static final String STRUCTURE_PIECE_LATER = "later"; - private static final String STRUCTURE_PIECE_LAST = "last"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_FIRST, - transpose(new String[][] { { " ", "e", " " }, { "~", "l", "G" }, { "g", "m", "g" }, { "b", "i", "b" }, })) - .addShape( - STRUCTURE_PIECE_LATER, - transpose(new String[][] { { " ", "e", " " }, { "d", "l", "d" }, { "g", "m", "g" }, { "b", "I", "b" }, })) - .addShape( - STRUCTURE_PIECE_LAST, - transpose(new String[][] { { " ", "e", " " }, { "d", "l", "d" }, { "g", "m", "g" }, { "o", "i", "b" }, })) - .addElement('G', ofBlock(GregTech_API.sBlockCasings3, 10)) // grate machine casing - .addElement('l', ofBlock(GregTech_API.sBlockCasings2, 9)) // assembler machine casing - .addElement('m', ofBlock(GregTech_API.sBlockCasings2, 5)) // assembling line casing - .addElement('g', Glasses.chainAllGlasses()) - .addElement( - 'e', - ofChain( - Energy.newAny(16, 1, ForgeDirection.UP, ForgeDirection.NORTH, ForgeDirection.SOUTH), - ofBlock(GregTech_API.sBlockCasings2, 0))) - .addElement( - 'd', - buildHatchAdder(GT_MetaTileEntity_AssemblyLine.class).atLeast(DataHatchElement.DataAccess) - .dot(2) - .casingIndex(42) - .allowOnly(ForgeDirection.NORTH) - .buildAndChain(GregTech_API.sBlockCasings3, 10)) - .addElement( - 'b', - buildHatchAdder(GT_MetaTileEntity_AssemblyLine.class) - .atLeast(InputHatch, InputHatch, InputHatch, InputHatch, Maintenance) - .casingIndex(16) - .dot(3) - .allowOnly(ForgeDirection.DOWN) - .buildAndChain( - ofBlock(GregTech_API.sBlockCasings2, 0), - ofHatchAdder(GT_MetaTileEntity_AssemblyLine::addOutputToMachineList, 16, 4))) - .addElement( - 'I', - ofChain( - // all blocks nearby use solid steel casing, so let's use the texture of that - InputBus.newAny(16, 5, ForgeDirection.DOWN), - ofHatchAdder(GT_MetaTileEntity_AssemblyLine::addOutputToMachineList, 16, 4))) - .addElement('i', InputBus.newAny(16, 5, ForgeDirection.DOWN)) - .addElement('o', OutputBus.newAny(16, 4, ForgeDirection.DOWN)) - .build(); - - public GT_MetaTileEntity_AssemblyLine(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_AssemblyLine(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_AssemblyLine(this.mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Assembling Line") - .addInfo("Controller block for the Assembling Line") - .addInfo("Used to make complex machine parts (LuV+)") - .addInfo("Does not make Assembler items") - .addInfo("Recipe tier is at most Energy Hatch tier + 1.") - .addSeparator() - .beginVariableStructureBlock(5, 16, 4, 4, 3, 3, false) // ? - .addStructureInfo("From Bottom to Top, Left to Right") - .addStructureInfo( - "Layer 1 - Solid Steel Machine Casing, Input Bus (last can be Output Bus), Solid Steel Machine Casing") - .addStructureInfo( - "Layer 2 - Borosilicate Glass(any)/Warded Glass/Reinforced Glass, Assembling Line Casing, Reinforced Glass") - .addStructureInfo("Layer 3 - Grate Machine Casing, Assembler Machine Casing, Grate Machine Casing") - .addStructureInfo("Layer 4 - Empty, Solid Steel Machine Casing, Empty") - .addStructureInfo("Up to 16 repeating slices, each one allows for 1 more item in recipes") - .addController("Either Grate on layer 3 of the first slice") - .addEnergyHatch("Any layer 4 casing", 1) - .addMaintenanceHatch("Any layer 1 casing", 3) - .addInputBus("As specified on layer 1", 4, 5) - .addInputHatch("Any layer 1 casing", 3) - .addOutputBus("Replaces Input Bus on final slice or on any solid steel casing on layer 1", 4) - .addOtherStructurePart("Data Access Hatch", "Optional, next to controller", 2) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][16] }; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.assemblylineVisualRecipes; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - if (GT_Values.D1) { - GT_FML_LOGGER.info("Start ALine recipe check"); - } - CheckRecipeResult result = CheckRecipeResultRegistry.NO_DATA_STICKS; - - ArrayList tDataStickList = getDataItems(2); - if (tDataStickList.isEmpty()) { - return result; - } - if (GT_Values.D1) { - GT_FML_LOGGER.info("Stick accepted, " + tDataStickList.size() + " Data Sticks found"); - } - - int[] tStacks = new int[0]; - FluidStack[] tFluids = new FluidStack[0]; - long averageVoltage = getAverageInputVoltage(); - long maxAmp = mEnergyHatches.size() <= 1 ? 1 : getMaxInputAmps(); - int maxParallel = 1; - Map inputsFromME = getStoredInputsFromME(); - Map fluidsFromME = getStoredFluidsFromME(); - - for (ItemStack tDataStick : tDataStickList) { - GT_AssemblyLineUtils.LookupResult tLookupResult = GT_AssemblyLineUtils - .findAssemblyLineRecipeFromDataStick(tDataStick, false); - - if (tLookupResult.getType() == GT_AssemblyLineUtils.LookupResultType.INVALID_STICK) { - result = CheckRecipeResultRegistry.NO_RECIPE; - continue; - } - - GT_Recipe_AssemblyLine tRecipe = tLookupResult.getRecipe(); - // Check if the recipe on the data stick is the current recipe for it's given output, if not we update it - // and continue to next. - if (tLookupResult.getType() != GT_AssemblyLineUtils.LookupResultType.VALID_STACK_AND_VALID_HASH) { - tRecipe = GT_AssemblyLineUtils.processDataStick(tDataStick); - if (tRecipe == null) { - result = CheckRecipeResultRegistry.NO_RECIPE; - continue; - } - } - - // Void protection check. - if (!canOutputAll(new ItemStack[] { tRecipe.mOutput })) { - result = CheckRecipeResultRegistry.ITEM_OUTPUT_FULL; - continue; - } - - // So here we check against the recipe found on the data stick. - // If we run into missing buses/hatches or bad inputs, we go to the next data stick. - // This check only happens if we have a valid up-to-date data stick. - - // first validate we have enough input busses and input hatches for this recipe - if (mInputBusses.size() < tRecipe.mInputs.length || mInputHatches.size() < tRecipe.mFluidInputs.length) { - if (GT_Values.D1) { - GT_FML_LOGGER.info( - "Not enough sources: Need ({}, {}), has ({}, {})", - mInputBusses.size(), - tRecipe.mInputs.length, - mInputHatches.size(), - tRecipe.mFluidInputs.length); - } - result = CheckRecipeResultRegistry.NO_RECIPE; - continue; - } - - // Check Inputs allign - int[] itemConsumptions = GT_Recipe_AssemblyLine.getItemConsumptionAmountArray(mInputBusses, tRecipe); - if (itemConsumptions == null || itemConsumptions.length == 0) { - result = CheckRecipeResultRegistry.NO_RECIPE; - continue; - } - maxParallel = (int) GT_Recipe_AssemblyLine - .maxParallelCalculatedByInputItems(mInputBusses, maxParallel, itemConsumptions, inputsFromME); - if (maxParallel <= 0) { - result = CheckRecipeResultRegistry.NO_RECIPE; - continue; - } - tStacks = itemConsumptions; - - if (GT_Values.D1) { - GT_FML_LOGGER.info("All Items accepted"); - } - - // Check Fluid Inputs allign - if (tRecipe.mFluidInputs.length > 0) { - maxParallel = (int) GT_Recipe_AssemblyLine - .maxParallelCalculatedByInputFluids(mInputHatches, maxParallel, tRecipe.mFluidInputs, fluidsFromME); - if (maxParallel <= 0) { - result = CheckRecipeResultRegistry.NO_RECIPE; - continue; - } - tFluids = tRecipe.mFluidInputs; - } - - if (GT_Values.D1) { - GT_FML_LOGGER.info("All fluids accepted"); - } - - if (GT_Values.D1) { - GT_FML_LOGGER.info("Check overclock"); - } - - // Recipe tier is limited to hatch tier + 1. - if (tRecipe.mEUt > averageVoltage * 4) { - result = CheckRecipeResultRegistry.insufficientPower(tRecipe.mEUt); - continue; - } - - // Insufficient power check. - if (tRecipe.mEUt > maxAmp * averageVoltage) { - result = CheckRecipeResultRegistry.insufficientPower(tRecipe.mEUt); - continue; - } - - calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, (int) maxAmp, averageVoltage, false); - // In case recipe is too OP for that machine - if (lEUt == Long.MAX_VALUE) { - if (GT_Values.D1) { - GT_FML_LOGGER.info("Recipe too OP"); - } - result = CheckRecipeResultRegistry.POWER_OVERFLOW; - continue; - } - - if (mMaxProgresstime == Integer.MAX_VALUE) { - if (GT_Values.D1) { - GT_FML_LOGGER.info("Recipe too OP"); - } - result = CheckRecipeResultRegistry.DURATION_OVERFLOW; - continue; - } - - if (GT_Values.D1) { - GT_FML_LOGGER.info("Find available recipe"); - } - result = CheckRecipeResultRegistry.SUCCESSFUL; - mOutputItems = new ItemStack[] { tRecipe.mOutput }; - break; - } - - if (!result.wasSuccessful()) { - return result; - } - - // Must be something wrong here... - if (tStacks.length == 0 || maxParallel <= 0) { - return CheckRecipeResultRegistry.INTERNAL_ERROR; - } - - if (GT_Values.D1) { - GT_FML_LOGGER.info("All checked start consuming inputs"); - } - - GT_Recipe_AssemblyLine.consumeInputItems(mInputBusses, maxParallel, tStacks, inputsFromME); - GT_Recipe_AssemblyLine.consumeInputFluids(mInputHatches, maxParallel, tFluids, fluidsFromME); - - if (this.lEUt > 0) { - this.lEUt = -this.lEUt; - } - this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); - this.mEfficiencyIncrease = 10000; - updateSlots(); - if (GT_Values.D1) { - GT_FML_LOGGER.info("Recipe successful"); - } - return result; - } - - @Override - public boolean onRunningTick(ItemStack aStack) { - for (GT_MetaTileEntity_Hatch_DataAccess hatch_dataAccess : mDataAccessHatches) { - hatch_dataAccess.setActive(true); - } - return super.onRunningTick(aStack); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mDataAccessHatches.clear(); - if (!checkPiece(STRUCTURE_PIECE_FIRST, 0, 1, 0)) return false; - return checkMachine(true) || checkMachine(false); - } - - private boolean checkMachine(boolean leftToRight) { - for (int i = 1; i < 16; i++) { - if (!checkPiece(STRUCTURE_PIECE_LATER, leftToRight ? -i : i, 1, 0)) return false; - if (!mOutputBusses.isEmpty()) - return !mEnergyHatches.isEmpty() && mMaintenanceHatches.size() == 1 && mDataAccessHatches.size() <= 1; - } - return false; - } - - /** - * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb - */ - private static boolean isCorrectDataItem(ItemStack aStack, int state) { - if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true; - if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true; - return (state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true); - } - - /** - * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb - */ - public ArrayList getDataItems(int state) { - ArrayList rList = new ArrayList<>(); - if (GT_Utility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) { - rList.add(mInventory[1]); - } - for (GT_MetaTileEntity_Hatch_DataAccess tHatch : filterValidMTEs(mDataAccessHatches)) { - rList.addAll(tHatch.getInventoryItems(stack -> isCorrectDataItem(stack, state))); - } - return rList; - } - - public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - return mDataAccessHatches.add((GT_MetaTileEntity_Hatch_DataAccess) aMetaTileEntity); - } - return false; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_FIRST, stackSize, hintsOnly, 0, 1, 0); - int tLength = Math.min(stackSize.stackSize + 1, 16); - for (int i = 1; i < tLength; i++) { - buildPiece(STRUCTURE_PIECE_LATER, stackSize, hintsOnly, -i, 1, 0); - } - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - int build = survivialBuildPiece(STRUCTURE_PIECE_FIRST, stackSize, 0, 1, 0, elementBudget, env, false, true); - if (build >= 0) return build; - int tLength = Math.min(stackSize.stackSize + 1, 16); - for (int i = 1; i < tLength - 1; i++) { - build = survivialBuildPiece(STRUCTURE_PIECE_LATER, stackSize, -i, 1, 0, elementBudget, env, false, true); - if (build >= 0) return build; - } - return survivialBuildPiece(STRUCTURE_PIECE_LAST, stackSize, 1 - tLength, 1, 0, elementBudget, env, false, true); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public Set getAllowedVoidingModes() { - return VoidingMode.ITEM_ONLY_MODES; - } - - private enum DataHatchElement implements IHatchElement { - - DataAccess; - - @Override - public List> mteClasses() { - return Collections.singletonList(GT_MetaTileEntity_Hatch_DataAccess.class); - } - - @Override - public IGT_HatchAdder adder() { - return GT_MetaTileEntity_AssemblyLine::addDataAccessToMachineList; - } - - @Override - public long count(GT_MetaTileEntity_AssemblyLine t) { - return t.mDataAccessHatches.size(); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java deleted file mode 100644 index a9cb7708cf..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java +++ /dev/null @@ -1,155 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.util.GT_Waila.getMachineProgressString; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import org.lwjgl.input.Keyboard; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.SteamVariant; -import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ISecondaryDescribable; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_BrickedBlastFurnace extends GT_MetaTileEntity_PrimitiveBlastFurnace - implements ISecondaryDescribable { - - private static final ITexture[] FACING_SIDE = { TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_DENSEBRICKS) }; - private static final ITexture[] FACING_FRONT = { - TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE) }; - private static final ITexture[] FACING_ACTIVE = { - TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE), TextureFactory.builder() - .addIcon(BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW) - .glow() - .build() }; - private GT_Multiblock_Tooltip_Builder tooltipBuilder; - - public GT_MetaTileEntity_BrickedBlastFurnace(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_BrickedBlastFurnace(String aName) { - super(aName); - } - - @Override - public String[] getDescription() { - return getCurrentDescription(); - } - - @Override - public boolean isDisplaySecondaryDescription() { - return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); - } - - public String[] getPrimaryDescription() { - return getTooltip().getInformation(); - } - - public String[] getSecondaryDescription() { - return getTooltip().getStructureInformation(); - } - - protected GT_Multiblock_Tooltip_Builder getTooltip() { - if (tooltipBuilder == null) { - tooltipBuilder = new GT_Multiblock_Tooltip_Builder(); - tooltipBuilder.addMachineType("Blast Furnace") - .addInfo("Controller Block for the Bricked Blast Furnace") - .addInfo("Usable for Steel and general Pyrometallurgy") - .addInfo("Has a useful interface, unlike other gregtech multis") - .addPollutionAmount(GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond) - .addSeparator() - .beginStructureBlock(3, 4, 3, true) - .addController("Front center") - .addOtherStructurePart("Firebricks", "Everything except the controller") - .addStructureInfo("The top block is also empty") - .addStructureInfo("You can share the walls of GT multis, so") - .addStructureInfo("each additional one costs less, up to 4") - .toolTipFinisher("Gregtech"); - } - return tooltipBuilder; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - return aActive ? FACING_ACTIVE : FACING_FRONT; - } - return FACING_SIDE; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BrickedBlastFurnace(this.mName); - } - - @Override - protected Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - protected int getCasingMetaID() { - return 15; - } - - @Override - public String getName() { - return "Bricked Blast Furnace"; - } - - @Override - public SteamVariant getSteamVariant() { - return SteamVariant.PRIMITIVE; - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currenttip, accessor, config); - if (!this.getBaseMetaTileEntity() - .isInvalidTileEntity()) { - NBTTagCompound nbt = accessor.getNBTData(); - currenttip.add( - getMachineProgressString( - this.getBaseMetaTileEntity() - .isActive(), - nbt.getInteger("mMaxProgressTime"), - nbt.getInteger("mProgressTime"))); - } - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - if (!this.getBaseMetaTileEntity() - .isInvalidTileEntity()) { - tag.setInteger("mProgressTime", this.getProgresstime()); - tag.setInteger("mMaxProgressTime", this.maxProgresstime()); - } - } - - @Override - public String[] getStructureDescription(ItemStack stackSize) { - return getTooltip().getStructureHint(); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java deleted file mode 100644 index 3a22c4ee99..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java +++ /dev/null @@ -1,312 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import java.util.ArrayList; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.world.ChunkPosition; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.ParticleFX; -import gregtech.api.interfaces.ISecondaryDescribable; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TooltipMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.WorldSpawnedEventBuilder; -import gregtech.common.GT_Pollution; - -public class GT_MetaTileEntity_Charcoal_Pit extends GT_MetaTileEntity_TooltipMultiBlockBase - implements ISecondaryDescribable { - - private boolean running = false; - - public GT_MetaTileEntity_Charcoal_Pit(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_Charcoal_Pit(String aName) { - super(aName); - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - // No GUI, do not capture right-click so it does not interfere when placing logs - return false; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Nonnull - @Override - public CheckRecipeResult checkProcessing() { - if (!checkRecursiveBlocks()) { - mEfficiency = 0; - mEfficiencyIncrease = 0; - mMaxProgresstime = 0; - running = false; - return CheckRecipeResultRegistry.NO_RECIPE; - } - - if (mEfficiency == 0) { - mEfficiency = 10000; - mEfficiencyIncrease = 10000; - mMaxProgresstime = Math.max(1, mMaxProgresstime); - - // adds all the pollution at once when the recipe starts - GT_Pollution.addPollution(getBaseMetaTileEntity(), mMaxProgresstime * getPollutionPerTick(null)); - return CheckRecipeResultRegistry.SUCCESSFUL; - } else { - mEfficiency = 0; - mEfficiencyIncrease = 0; - mMaxProgresstime = 0; - return CheckRecipeResultRegistry.NO_RECIPE; - } - } - - private boolean checkRecursiveBlocks() { - ArrayList tList1 = new ArrayList<>(); - ArrayList tList2 = new ArrayList<>(); - - Block tBlock = getBaseMetaTileEntity().getBlockOffset(0, -1, 0); - if (isWoodLog(tBlock, getBaseMetaTileEntity().getMetaIDOffset(0, -1, 0))) { - tList2.add(new ChunkPosition(0, -1, 0)); - } else return false; - while (!tList2.isEmpty()) { - ChunkPosition tPos = tList2.get(0); - tList2.remove(0); - if (!checkAllBlockSides(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ, tList1, tList2)) { - return false; - } - } - if (running) { - for (ChunkPosition tPos : tList1) { - if (isWoodLog( - getBaseMetaTileEntity().getBlockOffset(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ), - getBaseMetaTileEntity().getMetaIDOffset(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ))) - getBaseMetaTileEntity().getWorld() - .setBlock( - getBaseMetaTileEntity().getXCoord() + tPos.chunkPosX, - getBaseMetaTileEntity().getYCoord() + tPos.chunkPosY, - getBaseMetaTileEntity().getZCoord() + tPos.chunkPosZ, - GregTech_API.sBlockReinforced, - 4, - 3); - } - running = false; - return false; - } else { - mMaxProgresstime = (int) Math.sqrt(tList1.size() * 240000); - } - running = true; - return true; - } - - private boolean isWoodLog(Block log, int meta) { - for (int id : OreDictionary.getOreIDs(new ItemStack(log, 1, meta))) { - if (OreDictionary.getOreName(id) - .equals("logWood")) return true; - } - String tTool = log.getHarvestTool(meta); - return OrePrefixes.log.contains(new ItemStack(log, 1, meta)) && ("axe".equals(tTool)) - && (log.getMaterial() == Material.wood); - } - - private boolean checkAllBlockSides(int aX, int aY, int aZ, ArrayList aList1, - ArrayList aList2) { - boolean expandToChunkXPos = false; - boolean expandToChunkXNeg = false; - boolean expandToChunkYPos = false; - boolean expandToChunkYNeg = false; - boolean expandToChunkZPos = false; - boolean expandToChunkZNeg = false; - - Block blockXPos = getBaseMetaTileEntity().getBlockOffset(aX + 1, aY, aZ); - if (aX + 1 < 6 && (isWoodLog(blockXPos, getBaseMetaTileEntity().getMetaIDOffset(aX + 1, aY, aZ)))) { - if (!aList1.contains(new ChunkPosition(aX + 1, aY, aZ)) - && (!aList2.contains(new ChunkPosition(aX + 1, aY, aZ)))) expandToChunkXPos = true; - } else if (!(blockXPos == Blocks.dirt || blockXPos == Blocks.grass)) { - return false; - } - - Block blockXNeg = getBaseMetaTileEntity().getBlockOffset(aX - 1, aY, aZ); - if (aX - 1 > -6 && (isWoodLog(blockXNeg, getBaseMetaTileEntity().getMetaIDOffset(aX - 1, aY, aZ)))) { - if (!aList1.contains(new ChunkPosition(aX - 1, aY, aZ)) - && (!aList2.contains(new ChunkPosition(aX - 1, aY, aZ)))) expandToChunkXNeg = true; - } else if (!(blockXNeg == Blocks.dirt || blockXNeg == Blocks.grass)) { - return false; - } - - Block blockYPos = getBaseMetaTileEntity().getBlockOffset(aX, aY + 1, aZ); - if (aY + 1 < 1 && (isWoodLog(blockYPos, getBaseMetaTileEntity().getMetaIDOffset(aX, aY + 1, aZ)))) { - if (!aList1.contains(new ChunkPosition(aX, aY + 1, aZ)) - && (!aList2.contains(new ChunkPosition(aX, aY + 1, aZ)))) expandToChunkYPos = true; - } else if (!(blockYPos == Blocks.dirt || blockYPos == Blocks.grass - || (aX == 0 && aY == -1 && aZ == 0 && blockYPos == GregTech_API.sBlockMachines))) { - return false; - } - - Block blockYNeg = getBaseMetaTileEntity().getBlockOffset(aX, aY - 1, aZ); - if (aY - 1 > -6 && (isWoodLog(blockYNeg, getBaseMetaTileEntity().getMetaIDOffset(aX, aY - 1, aZ)))) { - if (!aList1.contains(new ChunkPosition(aX, aY - 1, aZ)) - && (!aList2.contains(new ChunkPosition(aX, aY - 1, aZ)))) expandToChunkYNeg = true; - } else if (blockYNeg != Blocks.brick_block) { - return false; - } - - Block blockZPos = getBaseMetaTileEntity().getBlockOffset(aX, aY, aZ + 1); - if (aZ + 1 < 6 && (isWoodLog(blockZPos, getBaseMetaTileEntity().getMetaIDOffset(aX, aY, aZ + 1)))) { - if (!aList1.contains(new ChunkPosition(aX, aY, aZ + 1)) - && (!aList2.contains(new ChunkPosition(aX, aY, aZ + 1)))) expandToChunkZPos = true; - } else if (!(blockZPos == Blocks.dirt || blockZPos == Blocks.grass)) { - return false; - } - - Block blockZNeg = getBaseMetaTileEntity().getBlockOffset(aX, aY, aZ - 1); - if (aZ - 1 > -6 && (isWoodLog(blockZNeg, getBaseMetaTileEntity().getMetaIDOffset(aX, aY, aZ - 1)))) { - if (!aList1.contains(new ChunkPosition(aX, aY, aZ - 1)) - && (!aList2.contains(new ChunkPosition(aX, aY, aZ - 1)))) expandToChunkZNeg = true; - } else if (!(blockZNeg == Blocks.dirt || blockZNeg == Blocks.grass)) { - return false; - } - aList1.add(new ChunkPosition(aX, aY, aZ)); - if (expandToChunkXPos) aList2.add(new ChunkPosition(aX + 1, aY, aZ)); - if (expandToChunkXNeg) aList2.add(new ChunkPosition(aX - 1, aY, aZ)); - if (expandToChunkYPos) aList2.add(new ChunkPosition(aX, aY + 1, aZ)); - if (expandToChunkYNeg) aList2.add(new ChunkPosition(aX, aY - 1, aZ)); - if (expandToChunkZPos) aList2.add(new ChunkPosition(aX, aY, aZ + 1)); - if (expandToChunkZNeg) aList2.add(new ChunkPosition(aX, aY, aZ - 1)); - return true; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionCharcoalPitPerSecond; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public RecipeMap getRecipeMap() { - return null; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Charcoal_Pit(mName); - } - - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Charcoal Pile Igniter") - .addInfo("Controller for the Charcoal Pit") - .addInfo("Converts Logs into Brittle Charcoal blocks") - .addInfo("Will automatically start when valid") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginVariableStructureBlock(3, 13, 3, 7, 3, 13, false) - .addStructureInfo("Can be up to 13x7x13 in size, including the dirt; shape doesn't matter") - .addOtherStructurePart("Controller", "Top layer, directly touching a wood log") - .addOtherStructurePart("Dirt/Grass", "Top and middle layers, covering wood logs") - .addOtherStructurePart("Bricks", "Bottom layer, under all wood logs") - .addOtherStructurePart("Wood Logs", "Up to 5 layers, inside the previously mentioned blocks") - .addStructureInfo("No air between logs allowed.") - .addStructureInfo( - "All logs must be within 6 x/z of the controller, so it must be dead-center for a full 11x11 square of wood.") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == ForgeDirection.UP) { - if (aActive) return new ITexture[] { casingTexturePages[0][10], - TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW) - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][10], TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW) - .glow() - .build(), }; - } - return new ITexture[] { casingTexturePages[0][10] }; - } - - @Override - public boolean polluteEnvironment(int aPollutionLevel) { - // Do nothing and don't choke on pollution. This is fine because we add - // all the pollution at once when the recipe starts - return true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - super.onPostTick(aBaseMetaTileEntity, aTimer); - if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) { - - new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0D, 0.3D, 0D) - .setIdentifier(ParticleFX.LARGE_SMOKE) - .setPosition( - aBaseMetaTileEntity.getOffsetX(ForgeDirection.UP, 1) + XSTR_INSTANCE.nextFloat(), - aBaseMetaTileEntity.getOffsetY(ForgeDirection.UP, 1), - aBaseMetaTileEntity.getOffsetZ(ForgeDirection.UP, 1) + XSTR_INSTANCE.nextFloat()) - .setWorld(getBaseMetaTileEntity().getWorld()) - .run(); - } - } - - @Override - public boolean getDefaultHasMaintenanceChecks() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java deleted file mode 100644 index 93f6db2044..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java +++ /dev/null @@ -1,527 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.GT_Values.debugCleanroom; -import static gregtech.api.enums.Textures.BlockIcons.BLOCK_PLASCRETE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_GLOW; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.config.ConfigCategory; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.TierEU; -import gregtech.api.interfaces.ICleanroom; -import gregtech.api.interfaces.ICleanroomReceiver; -import gregtech.api.interfaces.ISecondaryDescribable; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TooltipMultiBlockBase; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiBlockBase - implements IConstructable, ISecondaryDescribable, ICleanroom { - - private final Set cleanroomReceivers = new HashSet<>(); - private int mHeight = -1; - - public GT_MetaTileEntity_Cleanroom(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_Cleanroom(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Cleanroom(mName); - } - - @Override - public int getCleanness() { - return mEfficiency; - } - - @Override - public boolean isValidCleanroom() { - return isValid() && mMachine; - } - - @Override - public void pollute() { - mEfficiency = 0; - mWrench = false; - mScrewdriver = false; - mSoftHammer = false; - mHardHammer = false; - mSolderingTool = false; - mCrowbar = false; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Cleanroom") - .addInfo("Controller block for the Cleanroom") - .addInfo("Consumes 40 EU/t when first turned on") - .addInfo("and 4 EU/t once at 100% efficiency") - .addInfo("If you use an LV energy hatch, it will actually accept 2A instead of just 1A.") - .addInfo( - "MV+ energy hatches just accept 1A as usual. For HV+ the cleanroom will overclock and gain efficiency faster.") - .addInfo("Time required to reach full efficiency is proportional to") - .addInfo("the height of empty space within") - .addInfo("Machines that cause pollution aren't allowed to be put in.") - .addSeparator() - .beginVariableStructureBlock(3, 15, 4, 15, 3, 15, true) - .addController("Top center") - .addCasingInfoRange("Plascrete", 20, 1007, false) - .addStructureInfo( - GT_Values.cleanroomGlass - + "% of the Plascrete can be replaced with Reinforced Glass (not counting the top layer)") - .addStructureInfo( - "Other material can be used in place of Plascrete, even in higher percentages. See config for detail") - .addOtherStructurePart("Filter Machine Casing", "Top besides controller and edges") - .addEnergyHatch("Any casing except top layer. Exactly one.") - .addMaintenanceHatch("Any casing except top layer") - .addStructureInfo("0-2x Reinforced Door (keep closed or efficiency will reduce)") - .addStructureInfo("Up to 1 Elevator, Rotating Elevator, and Travel Anchor each") - .addStructureInfo("Up to 10 Machine Hulls for Item & Energy transfer through walls") - .addStructureInfo("You can also use Diodes for more power") - .addStructureInfo("Diodes also count towards 10 Machine Hulls count limit") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public String[] getStructureDescription(ItemStack itemStack) { - return new String[] { "The base can be rectangular." }; - } - - @Nonnull - @Override - public CheckRecipeResult checkProcessing() { - mEfficiencyIncrease = 100; - final long inputVoltage = getMaxInputVoltage(); - - // only allow LV+ energy hatches - if (inputVoltage < TierEU.LV) { - return CheckRecipeResultRegistry.insufficientPower(40); - } - - // use the standard overclock mechanism to determine duration and estimate a maximum consumption - // if the cleanroom is powered by an LV energy hatch, it will actually accept 2A instead of just 1A. - calculateOverclockedNessMultiInternal( - 40, - 45 * Math.max(1, mHeight - 1), - inputVoltage == TierEU.LV ? 2 : 1, - inputVoltage, - false); - // negate it to trigger the special energy consumption function. divide by 10 to get the actual final - // consumption. - mEUt /= -10; - return SimpleCheckRecipeResult.ofSuccess("cleanroom_running"); - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - int x = 1; - int z = 1; - int y = 1; - int mDoorCount = 0; - int mHullCount = 0; - int mPlascreteCount = 0; - final HashMap otherBlocks = new HashMap<>(); - boolean doorState = false; - this.mUpdate = 100; - cleanroomReceivers.forEach(r -> r.setCleanroom(null)); - cleanroomReceivers.clear(); - - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Checking machine"); - } - for (int i = 1; i < 8; i++) { - final Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, 0); - final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, 0); - if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) { - if (tBlock == GregTech_API.sBlockReinforced || tMeta == 2) { - x = i; - break; - } else { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Unable to detect room X edge?"); - } - return false; - } - } - } - for (int i = 1; i < 8; i++) { - final Block tBlock = aBaseMetaTileEntity.getBlockOffset(0, 0, i); - final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(0, 0, i); - if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) { - if (tBlock == GregTech_API.sBlockReinforced || tMeta == 2) { - z = i; - break; - } else { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Unable to detect room Z edge?"); - } - return false; - } - } - } - // detect rectangular area of filters - for (int i = -x + 1; i < x; i++) { - for (int j = -z + 1; j < z; j++) { - if (i == 0 && j == 0) continue; - final Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, j); - final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, j); - if (tBlock != GregTech_API.sBlockCasings3 && tMeta != 11) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: This is not a filter."); - } - return false; - } - } - } - - for (int i = -1; i > -16; i--) { - final Block tBlock = aBaseMetaTileEntity.getBlockOffset(x, i, z); - final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(x, i, z); - if (tBlock != GregTech_API.sBlockReinforced || tMeta != 2) { - y = i + 1; - break; - } - } - if (y > -2) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Room not tall enough?"); - } - return false; - } - for (int dX = -x; dX <= x; dX++) { - for (int dZ = -z; dZ <= z; dZ++) { - for (int dY = 0; dY >= y; dY--) { - if (dX == -x || dX == x || dY == 0 || dY == y || dZ == -z || dZ == z) { - Block tBlock = aBaseMetaTileEntity.getBlockOffset(dX, dY, dZ); - int tMeta = aBaseMetaTileEntity.getMetaIDOffset(dX, dY, dZ); - if (dY == 0) { // TOP - if (dX == -x || dX == x || dZ == -z || dZ == z) { // Top Border - if (tBlock != GregTech_API.sBlockReinforced || tMeta != 2) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Non reinforced block on top edge? tMeta != 2"); - } - return false; - } - mPlascreteCount++; - } else if (dX != 0 || dZ != 0) { // Top Inner exclude center - if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) { - if (debugCleanroom) { - GT_Log.out.println( - "Cleanroom: Non reinforced block on top face interior? tMeta != 11"); - } - return false; - } - } - } else if (tBlock == GregTech_API.sBlockReinforced && tMeta == 2) { - mPlascreteCount++; - } else { - final IGregTechTileEntity tTileEntity = aBaseMetaTileEntity - .getIGregTechTileEntityOffset(dX, dY, dZ); - if ((!this.addMaintenanceToMachineList(tTileEntity, 210)) - && (!this.addEnergyInputToMachineList(tTileEntity, 210))) { - if (tBlock instanceof ic2.core.block.BlockIC2Door) { - if ((tMeta & 8) == 0) { - // let's not fiddle with bits anymore. - if (Math.abs(dZ) < z) // on side parallel to z axis - doorState = tMeta == 1 || tMeta == 3 || tMeta == 4 || tMeta == 6; - else if (Math.abs(dX) < x) // on side parallel to x axis - doorState = tMeta == 0 || tMeta == 2 || tMeta == 5 || tMeta == 7; - // corners ignored - } - mDoorCount++; - } else { - if (tTileEntity != null) { - final IMetaTileEntity aMetaTileEntity = tTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Missing block? Not a aMetaTileEntity"); - } - return false; - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_BasicHull) { - mHullCount++; - } else { - if (debugCleanroom) { - GT_Log.out.println( - "Cleanroom: Incorrect GT block? " + tBlock.getUnlocalizedName()); - } - return false; - } - } else { - String key = tBlock.getUnlocalizedName() + ":" + tMeta; - if (config.containsKey(key)) { // check with meta first - otherBlocks.compute(key, (k, v) -> v == null ? 1 : v + 1); - } else { - key = tBlock.getUnlocalizedName(); - if (config.containsKey(key)) { - otherBlocks.compute(key, (k, v) -> v == null ? 1 : v + 1); - } else { - if (debugCleanroom) { - GT_Log.out.println( - "Cleanroom: not allowed block " + tBlock.getUnlocalizedName()); - } - return false; - } - } - } - } - } - } - } - } - } - } - if (this.mMaintenanceHatches.size() != 1 || this.mEnergyHatches.size() != 1 - || mDoorCount > 4 - || mHullCount > 10) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Incorrect number of doors, hulls, or hatches."); - } - return false; - } - if (mPlascreteCount < 20) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Could not find 20 Plascrete."); - } - return false; - } - int otherBlockCount = 0; - for (int v : otherBlocks.values()) { - otherBlockCount += v; - } - int maxAllowedRatio = 0; - for (Map.Entry e : otherBlocks.entrySet()) { - final ConfigEntry ce = config.get(e.getKey()); - maxAllowedRatio += Math.max(maxAllowedRatio, ce.percentage); - if (ce.allowedCount > 0) { // count has priority - if (e.getValue() > ce.allowedCount) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Absolute count too high for a block."); - } - return false; - } - } else if ((e.getValue() * 100) / (mPlascreteCount + otherBlockCount) > ce.percentage) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Relative count too high for a block."); - } - return false; - } - } - if ((otherBlockCount * 100) / (mPlascreteCount + otherBlockCount) > maxAllowedRatio) { - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Relative count of all non-plascrete blocks too high."); - } - return false; - } - - setCleanroomReceivers(x, y, z, aBaseMetaTileEntity); - - if (doorState) { - this.mEfficiency = Math.max(0, this.mEfficiency - 200); - } - for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { - final byte t = (byte) Math.max(1, (byte) (15 / (10000f / this.mEfficiency))); - aBaseMetaTileEntity.setInternalOutputRedstoneSignal(tSide, t); - } - this.mHeight = -y; - if (debugCleanroom) { - GT_Log.out.println("Cleanroom: Check successful."); - } - return true; - } - - private void setCleanroomReceivers(int x, int y, int z, IGregTechTileEntity aBaseMetaTileEntity) { - for (int dX = -x + 1; dX <= x - 1; dX++) { - for (int dZ = -z + 1; dZ <= z - 1; dZ++) for (int dY = -1; dY >= y + 1; dY--) { - TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityOffset(dX, dY, dZ); - if (tTileEntity instanceof ICleanroomReceiver receiver) { - receiver.setCleanroom(this); - cleanroomReceivers.add(receiver); - } - } - } - } - - @Override - public boolean allowGeneralRedstoneOutput() { - return true; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0) { - return new ITexture[] { TextureFactory.of(BLOCK_PLASCRETE), active - ? TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_CLEANROOM_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW) - .glow() - .build()) - : TextureFactory.of( - TextureFactory.of(OVERLAY_TOP_CLEANROOM), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_CLEANROOM_GLOW) - .glow() - .build()) }; - } - return new ITexture[] { TextureFactory.of(BLOCK_PLASCRETE) }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public void construct(ItemStack itemStack, boolean b) { - int i = Math.min(itemStack.stackSize, 7); - IGregTechTileEntity baseEntity = this.getBaseMetaTileEntity(); - World world = baseEntity.getWorld(); - int x = baseEntity.getXCoord(); - int y = baseEntity.getYCoord(); - int z = baseEntity.getZCoord(); - int yoff = Math.max(i * 2, 3); - for (int X = x - i; X <= x + i; X++) for (int Y = y; Y >= y - yoff; Y--) for (int Z = z - i; Z <= z + i; Z++) { - if (X == x && Y == y && Z == z) continue; - if (X == x - i || X == x + i || Z == z - i || Z == z + i || Y == y - yoff) { - if (b) StructureLibAPI.hintParticle(world, X, Y, Z, GregTech_API.sBlockReinforced, 2); - else world.setBlock(X, Y, Z, GregTech_API.sBlockReinforced, 2, 2); - } else if (Y == y) { - if (b) StructureLibAPI.hintParticle(world, X, Y, Z, GregTech_API.sBlockCasings3, 11); - else world.setBlock(X, Y, Z, GregTech_API.sBlockCasings3, 11, 2); - } - } - } - - private static class ConfigEntry { - - final int percentage; - final int allowedCount; - - ConfigEntry(int percentage, int count) { - this.percentage = percentage; - this.allowedCount = count; - } - } - - private static final HashMap config = new HashMap<>(); - private static final String category = "cleanroom_allowed_blocks"; - - private static void setDefaultConfigValues(Configuration cfg) { - cfg.get("cleanroom_allowed_blocks.manaGlass", "Name", "tile.manaGlass"); - cfg.get("cleanroom_allowed_blocks.manaGlass", "Percentage", 50); - cfg.get("cleanroom_allowed_blocks.elfGlass", "Name", "tile.elfGlass"); - cfg.get("cleanroom_allowed_blocks.elfGlass", "Percentage", 50); - cfg.get("cleanroom_allowed_blocks.reinforced_glass", "Name", "blockAlloyGlass"); - cfg.get("cleanroom_allowed_blocks.reinforced_glass", "Percentage", 5); - cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Name", "BW_GlasBlocks"); - cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Percentage", 50); - cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Meta", 0); - cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass", "Name", "BW_GlasBlocks"); - cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass", "Percentage", 100); - cfg.get("cleanroom_allowed_blocks.elevator", "Name", "tile.openblocks.elevator"); - cfg.get("cleanroom_allowed_blocks.elevator", "Count", 1); - cfg.get("cleanroom_allowed_blocks.travel_anchor", "Name", "tile.blockTravelAnchor"); - cfg.get("cleanroom_allowed_blocks.travel_anchor", "Count", 1); - cfg.get("cleanroom_allowed_blocks.warded_glass", "Name", "tile.blockCosmeticOpaque"); - cfg.get("cleanroom_allowed_blocks.warded_glass", "Meta", 2); - cfg.get("cleanroom_allowed_blocks.warded_glass", "Percentage", 50); - cfg.save(); - } - - public static void loadConfig(Configuration cfg) { - if (!cfg.hasCategory(category)) setDefaultConfigValues(cfg); - for (ConfigCategory cc : cfg.getCategory(category) - .getChildren()) { - final String name = cc.get("Name") - .getString(); - if (cc.containsKey("Count")) { - if (cc.containsKey("Meta")) config.put( - name + ":" - + cc.get("Meta") - .getInt(), - new ConfigEntry( - 0, - cc.get("Count") - .getInt())); - else config.put( - name, - new ConfigEntry( - 0, - cc.get("Count") - .getInt())); - } else if (cc.containsKey("Percentage")) { - if (cc.containsKey("Meta")) config.put( - name + ":" - + cc.get("Meta") - .getInt(), - new ConfigEntry( - cc.get("Percentage") - .getInt(), - 0)); - else config.put( - name, - new ConfigEntry( - cc.get("Percentage") - .getInt(), - 0)); - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java deleted file mode 100644 index e61cfc0feb..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_ConcreteBackfiller1 extends GT_MetaTileEntity_ConcreteBackfillerBase { - - public GT_MetaTileEntity_ConcreteBackfiller1(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ConcreteBackfiller1(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("Concrete Backfiller"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ConcreteBackfiller1(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_SolidSteel; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Steel; - } - - @Override - protected int getCasingTextureIndex() { - return 16; - } - - @Override - protected int getRadius() { - return 16; - } - - @Override - protected int getMinTier() { - return 2; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java deleted file mode 100644 index c175d73cb1..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java +++ /dev/null @@ -1,54 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_ConcreteBackfiller2 extends GT_MetaTileEntity_ConcreteBackfillerBase { - - public GT_MetaTileEntity_ConcreteBackfiller2(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ConcreteBackfiller2(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("Advanced Concrete Backfiller"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ConcreteBackfiller2(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_StableTitanium; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Titanium; - } - - @Override - protected int getCasingTextureIndex() { - return 50; - } - - @Override - protected int getRadius() { - int tConfig = getTotalConfigValue() * 2; - return tConfig >= 128 ? 128 : tConfig <= 0 ? 64 : tConfig; - } - - @Override - protected int getMinTier() { - return 4; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java deleted file mode 100644 index 3ad37f4c37..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java +++ /dev/null @@ -1,265 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.StatCollector; -import net.minecraftforge.fluids.IFluidBlock; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.widgets.GT_LockedWhileActiveButton; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; - -public abstract class GT_MetaTileEntity_ConcreteBackfillerBase extends GT_MetaTileEntity_DrillerBase { - - private int mLastXOff = 0, mLastZOff = 0; - - /** Used to drive the readout in the GUI for the backfiller's current y-level. */ - private int clientYHead; - - protected boolean mLiquidEnabled = true; - - private static boolean isWater(Block aBlock) { - return aBlock == Blocks.water || aBlock == Blocks.flowing_water; - } - - private static boolean isLava(Block aBlock) { - return aBlock == Blocks.lava || aBlock == Blocks.flowing_lava; - } - - private static boolean isFluid(Block aBlock) { - return isWater(aBlock) || isLava(aBlock) || aBlock instanceof IFluidBlock; - } - - public GT_MetaTileEntity_ConcreteBackfillerBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - initRecipeResults(); - } - - public GT_MetaTileEntity_ConcreteBackfillerBase(String aName) { - super(aName); - initRecipeResults(); - } - - private void initRecipeResults() { - addResultMessage(STATE_UPWARD, true, "backfiller_working"); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("liquidenabled", mLiquidEnabled); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("liquidenabled")) mLiquidEnabled = aNBT.getBoolean("liquidenabled"); - } - - protected GT_Multiblock_Tooltip_Builder createTooltip(String aStructureName) { - String casings = getCasingBlockItem().get(0) - .getDisplayName(); - - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Concrete Backfiller") - .addInfo("Controller Block for the " + aStructureName) - .addInfo("Will fill in areas below it with light concrete. This goes through walls") - .addInfo("Use it to remove any spawning locations beneath your base to reduce lag") - .addInfo("Will pull back the pipes after it finishes that layer") - .addInfo("Radius is " + getRadius() + " blocks") - .addSeparator() - .beginStructureBlock(3, 7, 3, false) - .addController("Front bottom") - .addOtherStructurePart(casings, "form the 3x1x3 Base") - .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") - .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") - .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1) - .addMaintenanceHatch("Any base casing", 1) - .addInputBus("Mining Pipes, optional, any base casing", 1) - .addInputHatch("GT Concrete, any base casing", 1) - .addOutputBus("Mining Pipes, optional, any base casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - protected abstract int getRadius(); - - @Override - protected boolean checkHatches() { - return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() && mEnergyHatches.size() == 1; - } - - @Override - protected List> getAllowedHatches() { - return ImmutableList.of(InputHatch, InputBus, Maintenance, Energy); - } - - @Override - protected void setElectricityStats() { - this.mEfficiency = getCurrentEfficiency(null); - this.mEfficiencyIncrease = 10000; - int tier = Math.max(1, GT_Utility.getTier(getMaxInputVoltage())); - this.mEUt = -6 * (1 << (tier << 1)); - this.mMaxProgresstime = (workState == STATE_UPWARD ? 240 : 80) / (1 << tier); - this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime); - } - - @Override - protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - if (isRefillableBlock(xPipe, yHead - 1, zPipe)) return tryRefillBlock(xPipe, yHead - 1, zPipe); - int radius = getRadius(); - if (mLastXOff == 0 && mLastZOff == 0) { - mLastXOff = -radius; - mLastZOff = -radius; - } - if (yHead != yDrill) { - for (int i = mLastXOff; i <= radius; i++) { - for (int j = (i == mLastXOff ? mLastZOff : -radius); j <= radius; j++) { - if (isRefillableBlock(xPipe + i, yHead, zPipe + j)) { - mLastXOff = i; - mLastZOff = j; - return tryRefillBlock(xPipe + i, yHead, zPipe + j); - } - } - } - } - - if (tryPickPipe()) { - mLastXOff = 0; - mLastZOff = 0; - return true; - } else { - workState = STATE_DOWNWARD; - stopMachine(ShutDownReasonRegistry.NONE); - setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.backfiller_finished")); - return false; - } - } - - private boolean isRefillableBlock(int aX, int aY, int aZ) { - IGregTechTileEntity aBaseTile = getBaseMetaTileEntity(); - Block aBlock = aBaseTile.getBlock(aX, aY, aZ); - if (!aBlock.isAir(aBaseTile.getWorld(), aX, aY, aZ)) { - if (mLiquidEnabled) { - if (!isFluid(aBlock)) { - return false; - } - } else { - return false; - } - } - if (aBlock.getMaterial() - .isSolid()) { - return false; - } - return GT_Utility - .setBlockByFakePlayer(getFakePlayer(aBaseTile), aX, aY, aZ, GregTech_API.sBlockConcretes, 8, true); - } - - private boolean tryRefillBlock(int aX, int aY, int aZ) { - if (!tryConsumeFluid()) { - setRuntimeFailureReason(CheckRecipeResultRegistry.BACKFILLER_NO_CONCRETE); - return false; - } - getBaseMetaTileEntity().getWorld() - .setBlock(aX, aY, aZ, GregTech_API.sBlockConcretes, 8, 3); - return true; - } - - private boolean tryConsumeFluid() { - if (!depleteInput(Materials.Concrete.getMolten(144L))) { - mMaxProgresstime = 0; - return false; - } - return true; - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - @Override - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - super.drawTexts(screenElements, inventorySlot); - screenElements - .widget( - TextWidget - .dynamicString( - () -> StatCollector.translateToLocalFormatted( - "GT5U.gui.text.backfiller_current_area", - numberFormat.format(clientYHead))) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_UPWARD)) - .widget(new FakeSyncWidget.IntegerSyncer(this::getYHead, newInt -> clientYHead = newInt)) - .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, newInt -> workState = newInt)); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - final int BUTTON_Y_LEVEL = 91; - - builder.widget( - new GT_LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) - .setOnClick((clickData, widget) -> mLiquidEnabled = !mLiquidEnabled) - .setPlayClickSound(true) - .setBackground(() -> { - if (mLiquidEnabled) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_LIQUIDMODE }; - } - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_LIQUIDMODE_OFF }; - }) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer(() -> mLiquidEnabled, newBoolean -> mLiquidEnabled = newBoolean), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .dynamicTooltip( - () -> ImmutableList.of( - StatCollector.translateToLocal( - mLiquidEnabled ? "GT5U.gui.button.liquid_filling_ON" - : "GT5U.gui.button.liquid_filling_OFF"))) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(new Pos2d(100, BUTTON_Y_LEVEL)) - .setSize(16, 16)); - int left = 98; - for (ButtonWidget button : getAdditionalButtons(builder, buildContext)) { - button.setPos(new Pos2d(left, BUTTON_Y_LEVEL)) - .setSize(16, 16); - builder.widget(button); - left += 18; - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java deleted file mode 100644 index 6c77dc7f0d..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java +++ /dev/null @@ -1,416 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Dynamo; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.recipe.maps.FuelBackend; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_DieselEngine - extends GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { - - @Override - protected IStructureDefinition computeValue(Class type) { - return StructureDefinition.builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { "---", "iii", "chc", "chc", "ccc", }, { "---", "i~i", "hgh", "hgh", "cdc", }, - { "---", "iii", "chc", "chc", "ccc", }, })) - .addElement('i', lazy(t -> ofBlock(t.getIntakeBlock(), t.getIntakeMeta()))) - .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta()))) - .addElement('g', lazy(t -> ofBlock(t.getGearboxBlock(), t.getGearboxMeta()))) - .addElement('d', lazy(t -> Dynamo.newAny(t.getCasingTextureIndex(), 2))) - .addElement( - 'h', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_DieselEngine.class) - .atLeast(InputHatch, InputHatch, InputHatch, Muffler, Maintenance) - .casingIndex(t.getCasingTextureIndex()) - .dot(1) - .buildAndChain(t.getCasingBlock(), t.getCasingMeta()))) - .build(); - } - }; - protected int fuelConsumption = 0; - protected int fuelValue = 0; - protected int fuelRemaining = 0; - protected boolean boostEu = false; - - public GT_MetaTileEntity_DieselEngine(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_DieselEngine(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Combustion Generator") - .addInfo("Controller block for the Large Combustion Engine") - .addInfo("Supply Diesel Fuels and 1000L of Lubricant per hour to run") - .addInfo("Supply 40L/s of Oxygen to boost output (optional)") - .addInfo("Default: Produces 2048EU/t at 100% fuel efficiency") - .addInfo("Boosted: Produces 6144EU/t at 150% fuel efficiency") - .addInfo("You need to wait for it to reach 300% to output full power") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 3, 4, false) - .addController("Front center") - .addCasingInfoRange("Stable Titanium Machine Casing", 16, 22, false) - .addOtherStructurePart("Titanium Gear Box Machine Casing", "Inner 2 blocks") - .addOtherStructurePart("Engine Intake Machine Casing", "8x, ring around controller") - .addStructureInfo("Engine Intake Casings must not be obstructed in front (only air blocks)") - .addDynamoHatch("Back center", 2) - .addMaintenanceHatch("One of the casings next to a Gear Box", 1) - .addMufflerHatch("Top middle back, above the rear Gear Box", 1) - .addInputHatch("Diesel Fuel, next to a Gear Box", 1) - .addInputHatch("Lubricant, next to a Gear Box", 1) - .addInputHatch("Oxygen, optional, next to a Gear Box", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { casingTexturePages[0][50], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][50], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DIESEL_ENGINE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { casingTexturePages[0][50] }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return getMaxEfficiency(aStack) > 0; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.dieselFuels; - } - - @Override - protected boolean filtersFluid() { - return false; - } - - /** - * The nominal energy output This can be further multiplied by {@link #getMaxEfficiency(ItemStack)} when boosted - */ - protected int getNominalOutput() { - return 2048; - } - - protected Materials getBooster() { - return Materials.Oxygen; - } - - /** - * x times fuel will be consumed when boosted This will however NOT increase power output Go tweak - * {@link #getMaxEfficiency(ItemStack)} and {@link #getNominalOutput()} instead - */ - protected int getBoostFactor() { - return 2; - } - - /** - * x times of additive will be consumed when boosted - */ - protected int getAdditiveFactor() { - return 1; - } - - /** - * Efficiency will increase by this amount every tick - */ - protected int getEfficiencyIncrease() { - return 15; - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - ArrayList tFluids = getStoredFluids(); - - // fast track lookup - if (!tFluids.isEmpty()) { - double boostedFuelValue = 0; - double boostedOutput = 0; - double extraFuelFraction = 0; - for (FluidStack tFluid : tFluids) { - GT_Recipe tRecipe = getRecipeMap().getBackend() - .findFuel(tFluid); - if (tRecipe == null) continue; - fuelValue = tRecipe.mSpecialValue; - - FluidStack tLiquid = tFluid.copy(); - if (boostEu) { - boostedFuelValue = GT_Utility.safeInt((long) (fuelValue * 1.5)); - boostedOutput = getNominalOutput() * 3; - - fuelConsumption = tLiquid.amount = getBoostFactor() * getNominalOutput() / fuelValue; - - // HOG consumption rate is normally 1 L/t, when it's supposed to be around 1.64 L/t - // This code increases fuel consumption by 1 at random, but with a weighted chance - if (boostedFuelValue * 2 > boostedOutput) { - extraFuelFraction = boostedOutput / boostedFuelValue; - extraFuelFraction = extraFuelFraction - (int) extraFuelFraction; - double rand = Math.random(); - if (rand < extraFuelFraction) { - tLiquid.amount += 1; - } - } - - } else { - fuelConsumption = tLiquid.amount = getNominalOutput() / fuelValue; - } - - // Deplete that amount - if (!depleteInput(tLiquid)) return CheckRecipeResultRegistry.NO_FUEL_FOUND; - boostEu = depleteInput(getBooster().getGas(2L * getAdditiveFactor())); - - // Check to prevent burning HOG without consuming it, if not boosted - if (!boostEu && fuelValue > getNominalOutput()) { - return SimpleCheckRecipeResult.ofFailure("fuel_quality_too_high"); - } - - // Deplete Lubricant. 1000L should = 1 hour of runtime (if baseEU = 2048) - if ((mRuntime % 72 == 0 || mRuntime == 0) - && !depleteInput(Materials.Lubricant.getFluid((boostEu ? 2L : 1L) * getAdditiveFactor()))) - return SimpleCheckRecipeResult.ofFailure("no_lubricant"); - - fuelRemaining = tFluid.amount; // Record available fuel - this.mEUt = mEfficiency < 2000 ? 0 : getNominalOutput(); // Output 0 if startup is less than 20% - this.mProgresstime = 1; - this.mMaxProgresstime = 1; - this.mEfficiencyIncrease = getEfficiencyIncrease(); - return CheckRecipeResultRegistry.GENERATING; - } - } - this.mEUt = 0; - this.mEfficiency = 0; - return CheckRecipeResultRegistry.NO_FUEL_FOUND; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION.get(getClass()); - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 1) && !mMufflerHatches.isEmpty() - && mMaintenanceHatches.size() == 1; - } - - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - public byte getCasingMeta() { - return 2; - } - - public Block getIntakeBlock() { - return GregTech_API.sBlockCasings4; - } - - public byte getIntakeMeta() { - return 13; - } - - public Block getGearboxBlock() { - return GregTech_API.sBlockCasings2; - } - - public byte getGearboxMeta() { - return 4; - } - - public byte getCasingTextureIndex() { - return 50; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_DieselEngine(this.mName); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 1; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return boostEu ? 30000 : 10000; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return true; - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - - return new String[] { EnumChatFormatting.BLUE + "Diesel Engine" + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - getIdealStatus() == getRepairStatus() - ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") - + EnumChatFormatting.RESET - : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.engine.output") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(((long) mEUt * mEfficiency / 10000)) - + EnumChatFormatting.RESET - + " EU/t", - StatCollector.translateToLocal("GT5U.engine.consumption") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(fuelConsumption) - + EnumChatFormatting.RESET - + " L/t", - StatCollector.translateToLocal("GT5U.engine.value") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(fuelValue) - + EnumChatFormatting.RESET - + " EU/L", - StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " - + EnumChatFormatting.GOLD - + GT_Utility.formatNumbers(fuelRemaining) - + EnumChatFormatting.RESET - + " L", - StatCollector.translateToLocal("GT5U.engine.efficiency") + ": " - + EnumChatFormatting.YELLOW - + (mEfficiency / 100F) - + EnumChatFormatting.YELLOW - + " %", - StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" }; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 1, 1); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 1, elementBudget, env, false, true); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java deleted file mode 100644 index 1f5fec10f3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java +++ /dev/null @@ -1,369 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.fluid.IFluidStore; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME; - -public class GT_MetaTileEntity_DistillationTower extends - GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - protected static final int CASING_INDEX = 49; - protected static final String STRUCTURE_PIECE_BASE = "base"; - protected static final String STRUCTURE_PIECE_LAYER = "layer"; - protected static final String STRUCTURE_PIECE_LAYER_HINT = "layerHint"; - protected static final String STRUCTURE_PIECE_TOP_HINT = "topHint"; - private static final IStructureDefinition STRUCTURE_DEFINITION; - - static { - IHatchElement layeredOutputHatch = OutputHatch - .withCount(GT_MetaTileEntity_DistillationTower::getCurrentLayerOutputHatchCount) - .withAdder(GT_MetaTileEntity_DistillationTower::addLayerOutputHatch); - STRUCTURE_DEFINITION = StructureDefinition.builder() - .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" }, })) - .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "lll", "lcl", "lll" }, })) - .addShape(STRUCTURE_PIECE_LAYER_HINT, transpose(new String[][] { { "lll", "l-l", "lll" }, })) - .addShape(STRUCTURE_PIECE_TOP_HINT, transpose(new String[][] { { "LLL", "LLL", "LLL" }, })) - .addElement( - 'b', - ofChain( - buildHatchAdder(GT_MetaTileEntity_DistillationTower.class) - .atLeast(Energy, OutputBus, InputHatch, InputBus, Maintenance) - .casingIndex(CASING_INDEX) - .dot(1) - .build(), - onElementPass( - GT_MetaTileEntity_DistillationTower::onCasingFound, - ofBlock(GregTech_API.sBlockCasings4, 1)))) - .addElement( - 'l', - ofChain( - buildHatchAdder(GT_MetaTileEntity_DistillationTower.class).atLeast(layeredOutputHatch) - .casingIndex(CASING_INDEX) - .dot(2) - .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN) - .build(), - ofHatchAdder(GT_MetaTileEntity_DistillationTower::addEnergyInputToMachineList, CASING_INDEX, 2), - ofHatchAdder(GT_MetaTileEntity_DistillationTower::addLayerOutputHatch, CASING_INDEX, 2), - ofHatchAdder(GT_MetaTileEntity_DistillationTower::addMaintenanceToMachineList, CASING_INDEX, 2), - onElementPass( - GT_MetaTileEntity_DistillationTower::onCasingFound, - ofBlock(GregTech_API.sBlockCasings4, 1)))) - // hint element only used in top layer - .addElement( - 'L', - buildHatchAdder(GT_MetaTileEntity_DistillationTower.class).atLeast(layeredOutputHatch) - .casingIndex(CASING_INDEX) - .dot(2) - .disallowOnly(ForgeDirection.UP) - .buildAndChain(GregTech_API.sBlockCasings4, 1)) - .addElement( - 'c', - ofChain( - onElementPass( - t -> t.onTopLayerFound(false), - ofHatchAdder(GT_MetaTileEntity_DistillationTower::addOutputToMachineList, CASING_INDEX, 3)), - onElementPass( - t -> t.onTopLayerFound(false), - ofHatchAdder( - GT_MetaTileEntity_DistillationTower::addMaintenanceToMachineList, - CASING_INDEX, - 3)), - onElementPass(t -> t.onTopLayerFound(true), ofBlock(GregTech_API.sBlockCasings4, 1)), - isAir())) - .build(); - } - - protected final List> mOutputHatchesByLayer = new ArrayList<>(); - protected int mHeight; - protected int mCasing; - protected boolean mTopLayerFound; - - public GT_MetaTileEntity_DistillationTower(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_DistillationTower(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_DistillationTower(this.mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Distillery") - .addInfo("Controller block for the Distillation Tower") - .addInfo("Fluids are only put out at the correct height") - .addInfo("The correct height equals the slot number in the NEI recipe") - .addSeparator() - .beginVariableStructureBlock(3, 3, 3, 12, 3, 3, true) - .addController("Front bottom") - .addOtherStructurePart("Clean Stainless Steel Machine Casing", "7 x h - 5 (minimum)") - .addEnergyHatch("Any casing except top centre", 1, 2) - .addMaintenanceHatch("Any casing", 1, 2, 3) - .addInputHatch("Any bottom layer casing", 1) - .addOutputBus("Any bottom layer casing", 1) - .addOutputHatch("2-11x Output Hatches (At least one per layer except bottom layer)", 2, 3) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) return new ITexture[] { BlockIcons.getCasingTextureForId(CASING_INDEX), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { BlockIcons.getCasingTextureForId(CASING_INDEX), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX) }; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.distillationTowerRecipes; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic(); - } - - protected void onCasingFound() { - mCasing++; - } - - protected void onTopLayerFound(boolean aIsCasing) { - mTopLayerFound = true; - if (aIsCasing) onCasingFound(); - } - - protected int getCurrentLayerOutputHatchCount() { - return mOutputHatchesByLayer.size() < mHeight || mHeight <= 0 ? 0 - : mOutputHatchesByLayer.get(mHeight - 1) - .size(); - } - - protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null || aTileEntity.isDead() - || !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Hatch_Output tHatch)) return false; - while (mOutputHatchesByLayer.size() < mHeight) mOutputHatchesByLayer.add(new ArrayList<>()); - tHatch.updateTexture(aBaseCasingIndex); - return mOutputHatchesByLayer.get(mHeight - 1) - .add(tHatch); - } - - @Override - public List getFluidOutputSlots(FluidStack[] toOutput) { - return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer); - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - // don't rotate a freaking tower, it won't work - return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() - && !f.isVerticallyFliped(); - } - - @Override - public boolean isRotationChangeAllowed() { - return false; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - // reset - mOutputHatchesByLayer.forEach(List::clear); - mHeight = 1; - mTopLayerFound = false; - mCasing = 0; - - // check base - if (!checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0)) return false; - - // check each layer - while (mHeight < 12) { - if (!checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0)) { - return false; - } - if (mOutputHatchesByLayer.size() < mHeight || mOutputHatchesByLayer.get(mHeight - 1) - .isEmpty()) - // layer without output hatch - return false; - if (mTopLayerFound) { - break; - } - // not top - mHeight++; - } - - // validate final invariants... (actual height is mHeight+1) - return mCasing >= 7 * (mHeight + 1) - 5 && mHeight + 1 >= 3 - && mTopLayerFound - && mMaintenanceHatches.size() == 1; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - protected void addFluidOutputs(FluidStack[] mOutputFluids2) { - for (int i = 0; i < mOutputFluids2.length && i < mOutputHatchesByLayer.size(); i++) { - final FluidStack fluidStack = mOutputFluids2[i]; - if (fluidStack == null) continue; - FluidStack tStack = fluidStack.copy(); - if (!dumpFluid(mOutputHatchesByLayer.get(i), tStack, true)) - dumpFluid(mOutputHatchesByLayer.get(i), tStack, false); - } - } - - @Override - public boolean canDumpFluidToME() { - // All fluids can be dumped to ME only if each layer contains a ME Output Hatch. - return this.mOutputHatchesByLayer.stream() - .allMatch( - tLayerOutputHatches -> tLayerOutputHatches.stream() - .anyMatch( - tHatch -> (tHatch instanceof GT_MetaTileEntity_Hatch_Output_ME tMEHatch) - && (tMEHatch.canAcceptFluid()))); - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 1, 0, 0); - int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height - for (int i = 1; i < tTotalHeight - 1; i++) { - buildPiece(STRUCTURE_PIECE_LAYER_HINT, stackSize, hintsOnly, 1, i, 0); - } - buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 1, tTotalHeight - 1, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - mHeight = 0; - int built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 1, 0, 0, elementBudget, env, false, true); - if (built >= 0) return built; - int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height - for (int i = 1; i < tTotalHeight - 1; i++) { - mHeight = i; - built = survivialBuildPiece( - STRUCTURE_PIECE_LAYER_HINT, - stackSize, - 1, - i, - 0, - elementBudget, - env, - false, - true); - if (built >= 0) return built; - } - mHeight = tTotalHeight - 1; - return survivialBuildPiece( - STRUCTURE_PIECE_TOP_HINT, - stackSize, - 1, - tTotalHeight - 1, - 0, - elementBudget, - env, - false, - true); - } - - @Override - protected SoundResource getProcessStartSound() { - return SoundResource.GT_MACHINES_DISTILLERY_LOOP; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java deleted file mode 100644 index 702185c9bd..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java +++ /dev/null @@ -1,952 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.W; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.widgets.GT_LockedWhileActiveButton; -import gregtech.api.interfaces.IChunkLoader; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; -import gregtech.api.objects.GT_ChunkManager; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.IGT_HatchAdder; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; - -public abstract class GT_MetaTileEntity_DrillerBase - extends GT_MetaTileEntity_EnhancedMultiBlockBase - implements IChunkLoader, ISurvivalConstructable { - - private static final ItemStack miningPipe = GT_ModHandler.getIC2Item("miningPipe", 0); - private static final ItemStack miningPipeTip = GT_ModHandler.getIC2Item("miningPipeTip", 0); - private static final Block miningPipeBlock = GT_Utility.getBlockFromStack(miningPipe); - private static final Block miningPipeTipBlock = GT_Utility.getBlockFromStack(miningPipeTip); - protected static final String STRUCTURE_PIECE_MAIN = "main"; - protected static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { - - @Override - protected IStructureDefinition computeValue(Class type) { - return StructureDefinition.builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { " ", " f ", " " }, { " ", " f ", " " }, { " ", " f ", " " }, - { " f ", "fcf", " f " }, { " f ", "fcf", " f " }, { " f ", "fcf", " f " }, - { "b~b", "bbb", "bbb" }, })) - .addElement('f', lazy(t -> ofFrame(t.getFrameMaterial()))) - .addElement( - 'c', - lazy( - t -> ofBlock( - t.getCasingBlockItem() - .getBlock(), - t.getCasingBlockItem() - .get(0) - .getItemDamage()))) - .addElement( - 'b', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_DrillerBase.class).atLeastList(t.getAllowedHatches()) - .adder(GT_MetaTileEntity_DrillerBase::addToMachineList) - .casingIndex(t.casingTextureIndex) - .dot(1) - .buildAndChain( - t.getCasingBlockItem() - .getBlock(), - t.getCasingBlockItem() - .get(0) - .getItemDamage()))) - .build(); - } - }; - - private Block casingBlock; - private int casingMeta; - private int frameMeta; - protected int casingTextureIndex; - protected boolean isPickingPipes; - - private ForgeDirection back; - - private int xDrill, yDrill, zDrill, xPipe, zPipe, yHead; - - protected int getXDrill() { - return xDrill; - } - - protected int getZDrill() { - return zDrill; - } - - protected int getYHead() { - return yHead; - } - - protected int workState; - protected static final int STATE_DOWNWARD = 0, STATE_AT_BOTTOM = 1, STATE_UPWARD = 2, STATE_ABORT = 3; - - protected boolean mChunkLoadingEnabled = true; - protected ChunkCoordIntPair mCurrentChunk = null; - protected boolean mWorkChunkNeedsReload = true; - - /** Stores default result messages for success/failures of each work state. */ - private final Map resultRegistry = new HashMap<>(); - - /** Allows inheritors to supply custom runtime failure messages. */ - private CheckRecipeResult runtimeFailure = null; - private CheckRecipeResult lastRuntimeFailure = null; - - /** Allows inheritors to supply custom shutdown failure messages. */ - private @NotNull String shutdownReason = ""; - - /** Allows inheritors to suppress wiping the last error if the machine is forcibly turned off. */ - protected boolean suppressErrorWipe = false; - - public GT_MetaTileEntity_DrillerBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - initFields(); - } - - public GT_MetaTileEntity_DrillerBase(String aName) { - super(aName); - initFields(); - } - - private void initFields() { - casingBlock = getCasingBlockItem().getBlock(); - casingMeta = getCasingBlockItem().get(0) - .getItemDamage(); - int frameId = 4096 + getFrameMaterial().mMetaItemSubID; - frameMeta = GregTech_API.METATILEENTITIES[frameId] != null - ? GregTech_API.METATILEENTITIES[frameId].getTileEntityBaseType() - : W; - casingTextureIndex = getCasingTextureIndex(); - workState = STATE_DOWNWARD; - - // Inheritors can overwrite these to add custom operating messages. - addResultMessage(STATE_DOWNWARD, true, "deploying_pipe"); - addResultMessage(STATE_DOWNWARD, false, "extracting_pipe"); - addResultMessage(STATE_AT_BOTTOM, true, "drilling"); - addResultMessage(STATE_AT_BOTTOM, false, "no_mining_pipe"); - addResultMessage(STATE_UPWARD, true, "retracting_pipe"); - addResultMessage(STATE_UPWARD, false, "drill_generic_finished"); - addResultMessage(STATE_ABORT, true, "retracting_pipe"); - addResultMessage(STATE_ABORT, false, "drill_retract_pipes_finished"); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ORE_DRILL_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ORE_DRILL) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ORE_DRILL_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { getCasingTextureForId(casingTextureIndex) }; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("workState", workState); - aNBT.setBoolean("chunkLoadingEnabled", mChunkLoadingEnabled); - aNBT.setBoolean("isChunkloading", mCurrentChunk != null); - if (mCurrentChunk != null) { - aNBT.setInteger("loadedChunkXPos", mCurrentChunk.chunkXPos); - aNBT.setInteger("loadedChunkZPos", mCurrentChunk.chunkZPos); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - workState = aNBT.getInteger("workState"); - if (aNBT.hasKey("isPickingPipes")) - workState = aNBT.getBoolean("isPickingPipes") ? STATE_UPWARD : STATE_DOWNWARD; - if (aNBT.hasKey("chunkLoadingEnabled")) mChunkLoadingEnabled = aNBT.getBoolean("chunkLoadingEnabled"); - if (aNBT.getBoolean("isChunkloading")) { - mCurrentChunk = new ChunkCoordIntPair( - aNBT.getInteger("loadedChunkXPos"), - aNBT.getInteger("loadedChunkZPos")); - } - } - - @Override - public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, - EntityPlayer entityPlayer, float aX, float aY, float aZ) { - if (side == getBaseMetaTileEntity().getFrontFacing()) { - mChunkLoadingEnabled = !mChunkLoadingEnabled; - GT_Utility.sendChatToPlayer( - entityPlayer, - mChunkLoadingEnabled ? GT_Utility.trans("502", "Mining chunk loading enabled") - : GT_Utility.trans("503", "Mining chunk loading disabled")); - return true; - } - return super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); - } - - @Override - public void onRemoval() { - if (mChunkLoadingEnabled) GT_ChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity()); - super.onRemoval(); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide() && mCurrentChunk != null - && !mWorkChunkNeedsReload - && !aBaseMetaTileEntity.isAllowedToWork()) { - // if machine has stopped, stop chunkloading - GT_ChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity); - mWorkChunkNeedsReload = true; - } - } - - protected boolean tryPickPipe() { - if (yHead == yDrill) return isPickingPipes = false; - if (tryOutputPipe()) { - if (checkBlockAndMeta(xPipe, yHead + 1, zPipe, miningPipeBlock, W)) getBaseMetaTileEntity().getWorld() - .setBlock(xPipe, yHead + 1, zPipe, miningPipeTipBlock); - getBaseMetaTileEntity().getWorld() - .setBlockToAir(xPipe, yHead, zPipe); - return isPickingPipes = true; - } - return isPickingPipes = false; - } - - /** - * @return 0 for succeeded, 1 for invalid block, 2 for not having mining pipes, 3 for event canceled. - */ - protected int tryLowerPipeState() { - return tryLowerPipeState(false); - } - - /** - * @return 0 for succeeded, 1 for invalid block, 2 for not having mining pipes, 3 for event canceled. - */ - protected int tryLowerPipeState(boolean isSimulating) { - if (!isHasMiningPipes()) return 2; - switch (canLowerPipe()) { - case 1 -> { - return 1; - } - case 2 -> { - return 3; - } - } - - Block b = getBaseMetaTileEntity().getBlock(xPipe, yHead - 1, zPipe); - if (b != miningPipeTipBlock && !GT_Utility.setBlockByFakePlayer( - getFakePlayer(getBaseMetaTileEntity()), - xPipe, - yHead - 1, - zPipe, - miningPipeTipBlock, - 0, - isSimulating)) return 3; - if (!isSimulating) { - if (yHead != yDrill) getBaseMetaTileEntity().getWorld() - .setBlock(xPipe, yHead, zPipe, miningPipeBlock); - if (b != miningPipeBlock && b != miningPipeTipBlock) getBaseMetaTileEntity().decrStackSize(1, 1); - } - - return 0; - } - - private void putMiningPipesFromInputsInController() { - int maxPipes = miningPipe.getMaxStackSize(); - if (isHasMiningPipes(maxPipes)) return; - - ItemStack pipes = getStackInSlot(1); - if (pipes != null && !pipes.isItemEqual(miningPipe)) return; - for (ItemStack storedItem : getStoredInputs()) { - if (!storedItem.isItemEqual(miningPipe)) continue; - - if (pipes == null) { - setInventorySlotContents(1, GT_Utility.copyOrNull(miningPipe)); - pipes = getStackInSlot(1); - } - - if (pipes.stackSize == maxPipes) break; - - int needPipes = maxPipes - pipes.stackSize; - int transferPipes = Math.min(storedItem.stackSize, needPipes); - - pipes.stackSize += transferPipes; - storedItem.stackSize -= transferPipes; - } - updateSlots(); - } - - private boolean tryOutputPipe() { - if (!getBaseMetaTileEntity().addStackToSlot(1, GT_Utility.copyAmount(1, miningPipe))) - mOutputItems = new ItemStack[] { GT_Utility.copyAmount(1, miningPipe) }; - return true; - } - - /** - * @return 0 for available, 1 for invalid block, 2 for event canceled. - */ - protected int canLowerPipe() { - IGregTechTileEntity aBaseTile = getBaseMetaTileEntity(); - if (yHead > 0 && GT_Utility.getBlockHardnessAt(aBaseTile.getWorld(), xPipe, yHead - 1, zPipe) >= 0) { - return GT_Utility.eraseBlockByFakePlayer(getFakePlayer(aBaseTile), xPipe, yHead - 1, zPipe, true) ? 0 : 2; - } - return 1; - } - - protected boolean reachingVoidOrBedrock() { - return yHead <= 0 || checkBlockAndMeta(xPipe, yHead - 1, zPipe, Blocks.bedrock, W); - } - - private boolean isHasMiningPipes() { - return isHasMiningPipes(1); - } - - private boolean isHasMiningPipes(int minCount) { - ItemStack pipe = getStackInSlot(1); - return pipe != null && pipe.stackSize > minCount - 1 && pipe.isItemEqual(miningPipe); - } - - /** - * @deprecated Readded for compability - * @return if no pipes are present - */ - @Deprecated - protected boolean waitForPipes() { - return !isHasMiningPipes(); - } - - private boolean isEnergyEnough() { - long requiredEnergy = 512 + getMaxInputVoltage() * 4; - for (GT_MetaTileEntity_Hatch_Energy energyHatch : mEnergyHatches) { - requiredEnergy -= energyHatch.getEUVar(); - if (requiredEnergy <= 0) return true; - } - return false; - } - - protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - switch (tryLowerPipeState()) { - case 2 -> { - mMaxProgresstime = 0; - setRuntimeFailureReason(CheckRecipeResultRegistry.MISSING_MINING_PIPE); - return false; - } - case 3 -> { - workState = STATE_UPWARD; - return true; - } - case 1 -> { - workState = STATE_AT_BOTTOM; - return true; - } - default -> { - return true; - } - } - } - - protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - if (tryLowerPipeState(true) == 0) { - workState = STATE_DOWNWARD; - return true; - } - workState = STATE_UPWARD; - return true; - } - - protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - if (tryPickPipe()) { - return true; - } else { - workState = STATE_DOWNWARD; - stopMachine(ShutDownReasonRegistry.NONE); - return false; - } - } - - /** Called once when the abort button is clicked. Use to perform any needed cleanup (e.g. unloading chunks.) */ - protected void onAbort() {} - - protected void abortDrilling() { - if (workState != STATE_ABORT) { - workState = STATE_ABORT; - onAbort(); - setShutdownReason(""); - - if (!isAllowedToWork()) { - enableWorking(); - } - } - } - - // This is a distinct state from workingUpward, because some inheritors (like concrete backfiller) operate - // exclusively on the workingUpward phase. It also allows for more distinct status messages. - protected boolean workingToAbortOperation(@NotNull ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, - int zPipe, int yHead, int oldYHead) { - if (tryPickPipe()) { - return true; - } else { - workState = STATE_DOWNWARD; - stopMachine(ShutDownReasonRegistry.NONE); - return false; - } - } - - @Override - public void enableWorking() { - super.enableWorking(); - shutdownReason = ""; - } - - @Override - public void onDisableWorking() { - if (suppressErrorWipe) { - suppressErrorWipe = false; - } else { - super.onDisableWorking(); - } - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - ItemStack controllerStack = getControllerSlot(); - // Public pipe actions - setElectricityStats(); - int oldYHead = yHead; - if (!checkPipesAndSetYHead()) { - stopMachine(ShutDownReasonRegistry.NONE); - return SimpleCheckRecipeResult.ofFailure("no_mining_pipe"); - } else if (!isEnergyEnough()) { - stopMachine(ShutDownReasonRegistry.NONE); - return SimpleCheckRecipeResult.ofFailure("not_enough_energy"); - } - putMiningPipesFromInputsInController(); - - final boolean wasSuccessful; - switch (workState) { - case STATE_DOWNWARD -> wasSuccessful = workingDownward( - controllerStack, - xDrill, - yDrill, - zDrill, - xPipe, - zPipe, - yHead, - oldYHead); - case STATE_AT_BOTTOM -> wasSuccessful = workingAtBottom( - controllerStack, - xDrill, - yDrill, - zDrill, - xPipe, - zPipe, - yHead, - oldYHead); - case STATE_UPWARD -> wasSuccessful = workingUpward( - controllerStack, - xDrill, - yDrill, - zDrill, - xPipe, - zPipe, - yHead, - oldYHead); - case STATE_ABORT -> wasSuccessful = workingToAbortOperation( - controllerStack, - xDrill, - yDrill, - zDrill, - xPipe, - zPipe, - yHead, - oldYHead); - default -> wasSuccessful = false; - } - - if (runtimeFailure == null) { - if (wasSuccessful) { - lastRuntimeFailure = null; - } - - return resultRegistry.getOrDefault( - new ResultRegistryKey(workState, wasSuccessful), - SimpleCheckRecipeResult.ofFailure("no_mining_pipe")); - } else { - final CheckRecipeResult result; - result = lastRuntimeFailure = runtimeFailure; - runtimeFailure = null; - return result; - } - } - - /** - * Allow drills to set a specific failure reason specific to their situation. E.g.: out of drilling fluid. - * Should be used when the machine doesn't turn off due to the failure. - * - * @param newFailureReason A new failure reason - */ - protected void setRuntimeFailureReason(@NotNull CheckRecipeResult newFailureReason) { - runtimeFailure = newFailureReason; - } - - /** - * Gets a reason for why the drill turned off, for use in UIs and such. - * - * @return A reason, or empty if the machine is active or there is no message set yet. - */ - @NotNull - protected Optional getFailureReason() { - if (getBaseMetaTileEntity().isActive()) { - return Optional.empty(); - } - - if (!shutdownReason.isEmpty()) { - return Optional.of(shutdownReason); - } - - return Optional.ofNullable(lastRuntimeFailure) - .map(CheckRecipeResult::getDisplayString); - } - - /** - * Sets a line in the UI to explain why the drill shut down. E.g.: operation finished. - * Should be used when the machine has been turned off due to an operating issue or completion. - * - * @param newReason The reason for the machine shutdown - */ - protected void setShutdownReason(@NotNull String newReason) { - shutdownReason = newReason; - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() - && !f.isVerticallyFliped(); - } - - @Override - public boolean isRotationChangeAllowed() { - return false; - } - - @Override - public final IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION.get(getClass()); - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - updateCoordinates(); - return checkPiece(STRUCTURE_PIECE_MAIN, 1, 6, 0) && checkHatches() - && GT_Utility.getTier(getMaxInputVoltage()) >= getMinTier() - && mMaintenanceHatches.size() == 1; - } - - private void updateCoordinates() { - xDrill = getBaseMetaTileEntity().getXCoord(); - yDrill = getBaseMetaTileEntity().getYCoord(); - zDrill = getBaseMetaTileEntity().getZCoord(); - back = getBaseMetaTileEntity().getBackFacing(); - xPipe = xDrill + back.offsetX; - zPipe = zDrill + back.offsetZ; - } - - private boolean checkPipesAndSetYHead() { - yHead = yDrill - 1; - while (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeBlock, W)) yHead--; // skip pipes - // is pipe tip OR is controller layer - if (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeTipBlock, W) || ++yHead == yDrill) return true; - // pipe column is broken - try fix - getBaseMetaTileEntity().getWorld() - .setBlock(xPipe, yHead, zPipe, miningPipeTipBlock); - return true; - } - - private boolean checkBlockAndMeta(int x, int y, int z, Block block, int meta) { - return (meta == W || getBaseMetaTileEntity().getMetaID(x, y, z) == meta) - && getBaseMetaTileEntity().getBlock(x, y, z) == block; - } - - private FakePlayer mFakePlayer = null; - - protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) { - if (mFakePlayer == null) mFakePlayer = GT_Utility.getFakePlayer(aBaseTile); - mFakePlayer.setWorld(aBaseTile.getWorld()); - mFakePlayer.setPosition(aBaseTile.getXCoord(), aBaseTile.getYCoord(), aBaseTile.getZCoord()); - return mFakePlayer; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - protected abstract ItemList getCasingBlockItem(); - - protected abstract Materials getFrameMaterial(); - - protected abstract int getCasingTextureIndex(); - - protected abstract int getMinTier(); - - protected abstract boolean checkHatches(); - - protected abstract void setElectricityStats(); - - public int getTotalConfigValue() { - int config = 0; - ArrayList tCircuitList = getDataItems(1); - for (ItemStack tCircuit : tCircuitList) config += tCircuit.getItemDamage(); - return config; - } - - public ArrayList mDataAccessHatches = new ArrayList<>(); - - /** - * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb - */ - private boolean isCorrectDataItem(ItemStack aStack, int state) { - if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true; - if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true; - return (state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true); - } - - /** - * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb - */ - public ArrayList getDataItems(int state) { - ArrayList rList = new ArrayList<>(); - if (GT_Utility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) { - rList.add(mInventory[1]); - } - for (GT_MetaTileEntity_Hatch_DataAccess tHatch : filterValidMTEs(mDataAccessHatches)) { - for (int i = 0; i < tHatch.getBaseMetaTileEntity() - .getSizeInventory(); i++) { - if (tHatch.getBaseMetaTileEntity() - .getStackInSlot(i) != null && isCorrectDataItem( - tHatch.getBaseMetaTileEntity() - .getStackInSlot(i), - state)) - rList.add( - tHatch.getBaseMetaTileEntity() - .getStackInSlot(i)); - } - } - return rList; - } - - @Override - public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - return super.addToMachineList(aTileEntity, aBaseCasingIndex) - || addDataAccessToMachineList(aTileEntity, aBaseCasingIndex); - } - - public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture((byte) aBaseCasingIndex); - return mDataAccessHatches.add((GT_MetaTileEntity_Hatch_DataAccess) aMetaTileEntity); - } - return false; - } - - @Override - public ChunkCoordIntPair getActiveChunk() { - return mCurrentChunk; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 6, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 6, 0, elementBudget, env, false, true); - } - - @Override - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - super.drawTexts(screenElements, inventorySlot); - screenElements.widget( - TextWidget.dynamicString(() -> shutdownReason) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled(widget -> !(getBaseMetaTileEntity().isActive() || shutdownReason.isEmpty()))) - .widget(new FakeSyncWidget.StringSyncer(() -> shutdownReason, newString -> shutdownReason = newString)); - } - - @Override - protected boolean showRecipeTextInGUI() { - return false; - } - - /** - * Adds additional buttons to the main button row. You do not need to set the position. - * - * @param builder Only use to attach SyncWidgets. - * @param buildContext Context for things like the player. - */ - protected List getAdditionalButtons(ModularWindow.Builder builder, UIBuildContext buildContext) { - return ImmutableList.of(); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - final int BUTTON_Y_LEVEL = 91; - - builder.widget( - new GT_LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) - .setOnClick((clickData, widget) -> mChunkLoadingEnabled = !mChunkLoadingEnabled) - .setPlayClickSound(true) - .setBackground(() -> { - if (mChunkLoadingEnabled) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_CHUNK_LOADING }; - } - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_CHUNK_LOADING_OFF }; - }) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer( - () -> mChunkLoadingEnabled, - newBoolean -> mChunkLoadingEnabled = newBoolean), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .dynamicTooltip( - () -> ImmutableList.of( - StatCollector.translateToLocal( - mChunkLoadingEnabled ? "GT5U.gui.button.chunk_loading_on" - : "GT5U.gui.button.chunk_loading_off"))) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(new Pos2d(80, BUTTON_Y_LEVEL)) - .setSize(16, 16)) - .widget( - new ButtonWidget().setOnClick((clickData, widget) -> abortDrilling()) - .setPlayClickSound(true) - .setBackground(() -> { - if (workState == STATE_ABORT) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_RETRACT_PIPE, GT_UITextures.OVERLAY_BUTTON_LOCKED }; - } - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_RETRACT_PIPE }; - }) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer(() -> workState, (newInt) -> workState = newInt), - builder, - (widget, integer) -> widget.notifyTooltipChange()) - .dynamicTooltip( - () -> ImmutableList.of( - StatCollector.translateToLocalFormatted( - workState == STATE_ABORT ? "GT5U.gui.button.drill_retract_pipes_active" - : "GT5U.gui.button.drill_retract_pipes"))) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(new Pos2d(174, 112)) - .setSize(16, 16)); - - int left = 98; - for (ButtonWidget button : getAdditionalButtons(builder, buildContext)) { - button.setPos(new Pos2d(left, BUTTON_Y_LEVEL)) - .setSize(16, 16); - builder.widget(button); - left += 18; - } - } - - protected List> getAllowedHatches() { - return ImmutableList.of( - InputHatch, - OutputHatch, - InputBus, - OutputBus, - Muffler, - Maintenance, - Energy, - DataHatchElement.DataAccess); - } - - protected enum DataHatchElement implements IHatchElement { - - DataAccess; - - @Override - public List> mteClasses() { - return Collections.singletonList(GT_MetaTileEntity_Hatch_DataAccess.class); - } - - @Override - public IGT_HatchAdder adder() { - return GT_MetaTileEntity_DrillerBase::addDataAccessToMachineList; - } - - @Override - public long count(GT_MetaTileEntity_DrillerBase t) { - return t.mDataAccessHatches.size(); - } - } - - /** - * Sets or overrides the {@link CheckRecipeResult} for a given work state - * - * @param state A work state like {@link #STATE_DOWNWARD}. - * @param result A previously registered recipe result. - */ - protected void addResultMessage(final int state, @NotNull final CheckRecipeResult result) { - resultRegistry.put(new ResultRegistryKey(state, result.wasSuccessful()), result); - } - - /** - * Sets or overrides the {@link CheckRecipeResult} for a given work state and operation success type. - * - * @param state A work state like {@link #STATE_DOWNWARD}. - * @param wasSuccessful Whether the operation was successful. - * @param resultKey An I18N key for the message. - */ - protected void addResultMessage(final int state, final boolean wasSuccessful, @NotNull final String resultKey) { - addResultMessage( - state, - wasSuccessful ? SimpleCheckRecipeResult.ofSuccess(resultKey) - : SimpleCheckRecipeResult.ofFailure(resultKey)); - } - - @SuppressWarnings("ClassCanBeRecord") - private final static class ResultRegistryKey { - - private final int state; - private final boolean successful; - - public ResultRegistryKey(final int state, final boolean successful) { - this.state = state; - this.successful = successful; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof ResultRegistryKey other)) { - return false; - } - - return (state == other.state && successful == other.successful); - } - - @Override - public int hashCode() { - return Objects.hash(state, successful); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java deleted file mode 100644 index 49b2cc6998..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java +++ /dev/null @@ -1,401 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofCoil; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.fluid.IFluidStore; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_ElectricBlastFurnace extends - GT_MetaTileEntity_AbstractMultiFurnace implements ISurvivalConstructable { - - private int mHeatingCapacity = 0; - protected final ArrayList mPollutionOutputHatches = new ArrayList<>(); - protected final FluidStack[] pollutionFluidStacks = { Materials.CarbonDioxide.getGas(1000), - Materials.CarbonMonoxide.getGas(1000), Materials.SulfurDioxide.getGas(1000) }; - - protected static final int CASING_INDEX = 11; - protected static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { "ttt", "tmt", "ttt" }, { "CCC", "C-C", "CCC" }, { "CCC", "C-C", "CCC" }, - { "b~b", "bbb", "bbb" } })) - .addElement( - 't', - buildHatchAdder(GT_MetaTileEntity_ElectricBlastFurnace.class) - .atLeast( - OutputHatch.withAdder(GT_MetaTileEntity_ElectricBlastFurnace::addOutputHatchToTopList) - .withCount(t -> t.mPollutionOutputHatches.size())) - .casingIndex(CASING_INDEX) - .dot(1) - .buildAndChain(GregTech_API.sBlockCasings1, CASING_INDEX)) - .addElement('m', Muffler.newAny(CASING_INDEX, 2)) - .addElement( - 'C', - ofCoil( - GT_MetaTileEntity_ElectricBlastFurnace::setCoilLevel, - GT_MetaTileEntity_ElectricBlastFurnace::getCoilLevel)) - .addElement( - 'b', - buildHatchAdder(GT_MetaTileEntity_ElectricBlastFurnace.class) - .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy) - .casingIndex(CASING_INDEX) - .dot(1) - .buildAndChain(GregTech_API.sBlockCasings1, CASING_INDEX)) - .build(); - - public GT_MetaTileEntity_ElectricBlastFurnace(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ElectricBlastFurnace(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ElectricBlastFurnace(this.mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Blast Furnace") - .addInfo("Controller block for the Electric Blast Furnace") - .addInfo("You can use some fluids to reduce recipe time. Place the circuit in the Input Bus") - .addInfo("Each 900K over the min. Heat required reduces power consumption by 5% (multiplicatively)") - .addInfo("Each 1800K over the min. Heat allows for an overclock to be upgraded to a perfect overclock.") - .addInfo("That means the EBF will reduce recipe time by a factor 4 instead of 2 (giving 100% efficiency).") - .addInfo("Additionally gives +100K for every tier past MV") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 4, 3, true) - .addController("Front bottom") - .addCasingInfoRange("Heat Proof Machine Casing", 0, 15, false) - .addOtherStructurePart("Heating Coils", "Two middle Layers") - .addEnergyHatch("Any bottom layer casing", 3) - .addMaintenanceHatch("Any bottom layer casing", 3) - .addMufflerHatch("Top middle", 2) - .addInputBus("Any bottom layer casing", 3) - .addInputHatch("Any bottom layer casing", 3) - .addOutputBus("Any bottom layer casing", 3) - .addOutputHatch("Fluid outputs, Any bottom layer casing") - .addOutputHatch("Pollution gases (CO2/CO/SO2), Any top layer casing", 1) - .addStructureInfo("Pollution gas output amount scales with Muffler Hatch tier") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionEBFPerSecond; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.blastFurnaceRecipes; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @Nonnull - @Override - protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return super.createOverclockCalculator(recipe).setRecipeHeat(recipe.mSpecialValue) - .setMachineHeat(mHeatingCapacity) - .setHeatOC(true) - .setHeatDiscount(true); - } - - @Override - protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - return recipe.mSpecialValue <= mHeatingCapacity ? CheckRecipeResultRegistry.SUCCESSFUL - : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); - } - }; - } - - public boolean addOutputHatchToTopList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - return mPollutionOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity); - } - return false; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - this.mHeatingCapacity = 0; - - setCoilLevel(HeatingCoilLevel.None); - - mPollutionOutputHatches.clear(); - - if (!checkPiece(STRUCTURE_PIECE_MAIN, 1, 3, 0)) return false; - - if (getCoilLevel() == HeatingCoilLevel.None) return false; - - if (mMaintenanceHatches.size() != 1) return false; - - this.mHeatingCapacity = (int) getCoilLevel().getHeat() + 100 * (GT_Utility.getTier(getMaxInputVoltage()) - 2); - return true; - } - - @Override - public boolean addOutput(FluidStack aLiquid) { - if (aLiquid == null) return false; - FluidStack tLiquid = aLiquid.copy(); - ArrayList tOutputHatches; - if (isPollutionFluid(tLiquid)) { - tOutputHatches = this.mPollutionOutputHatches; - multiplyPollutionFluidAmount(tLiquid); - } else { - tOutputHatches = this.mOutputHatches; - } - return dumpFluid(tOutputHatches, tLiquid, true) || dumpFluid(tOutputHatches, tLiquid, false); - } - - protected boolean isPollutionFluid(@Nullable FluidStack fluidStack) { - if (fluidStack == null) return false; - for (FluidStack pollutionFluidStack : pollutionFluidStacks) { - if (!fluidStack.isFluidEqual(pollutionFluidStack)) continue; - return true; - } - return false; - } - - @Override - public List getFluidOutputSlots(FluidStack[] toOutput) { - if (Arrays.stream(toOutput) - .anyMatch(this::isPollutionFluid)) { - return filterValidMTEs(mPollutionOutputHatches); - } - return filterValidMTEs(mOutputHatches); - } - - /** - * @return 100 -> all released to air, 0 -> all dumped to hatch - */ - public int getPollutionReduction() { - int reduction = 100; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - reduction = Math.min(tHatch.calculatePollutionReduction(100), reduction); - } - return reduction; - } - - protected void multiplyPollutionFluidAmount(@Nonnull FluidStack fluid) { - fluid.amount = fluid.amount * Math.min(100 - getPollutionReduction(), 100) / 100; - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = getPollutionReduction(); - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - - return new String[] { - StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(-lEUt) - + EnumChatFormatting.RESET - + " EU/t", - StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getMaxInputVoltage()) - + EnumChatFormatting.RESET - + " EU/t(*2A) " - + StatCollector.translateToLocal("GT5U.machines.tier") - + ": " - + EnumChatFormatting.YELLOW - + VN[GT_Utility.getTier(getMaxInputVoltage())] - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " - + EnumChatFormatting.RED - + (getIdealStatus() - getRepairStatus()) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.multiblock.efficiency") - + ": " - + EnumChatFormatting.YELLOW - + mEfficiency / 100.0F - + EnumChatFormatting.RESET - + " %", - StatCollector.translateToLocal("GT5U.EBF.heat") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mHeatingCapacity) - + EnumChatFormatting.RESET - + " K", - StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 3, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 3, 0, elementBudget, env, false, true); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - inputSeparation = !inputSeparation; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); - } - - @Override - public void loadNBTData(final NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("isBussesSeparate")) { - // backward compatibility - inputSeparation = aNBT.getBoolean("isBussesSeparate"); - } - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java deleted file mode 100644 index dace58a492..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java +++ /dev/null @@ -1,237 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.maps.FuelBackend; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_ExtremeDieselEngine extends GT_MetaTileEntity_DieselEngine { - - public GT_MetaTileEntity_ExtremeDieselEngine(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ExtremeDieselEngine(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Combustion Generator") - .addInfo("Controller block for the Extreme Combustion Engine") - .addInfo("Supply high rating fuel and 8000L of Lubricant per hour to run") - .addInfo("Supply 40L/s of Liquid Oxygen to boost output (optional)") - .addInfo("Default: Produces 10900EU/t at 100% fuel efficiency") - .addInfo("Boosted: Produces 32700EU/t at 150% fuel efficiency") - .addInfo("You need to wait for it to reach 300% to output full power") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 3, 4, false) - .addController("Front center") - .addCasingInfoRange("Robust Tungstensteel Machine Casing", 16, 22, false) - .addOtherStructurePart("Titanium Gear Box Machine Casing", "Inner 2 blocks") - .addOtherStructurePart("Extreme Engine Intake Machine Casing", "8x, ring around controller") - .addStructureInfo("Extreme Engine Intake Casings must not be obstructed in front (only air blocks)") - .addDynamoHatch("Back center", 2) - .addMaintenanceHatch("One of the casings next to a Gear Box", 1) - .addMufflerHatch("Top middle back, above the rear Gear Box", 1) - .addInputHatch("HOG, next to a Gear Box", 1) - .addInputHatch("Lubricant, next to a Gear Box", 1) - .addInputHatch("Liquid Oxygen, optional, next to a Gear Box", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.extremeDieselFuels; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { casingTexturePages[0][60], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][60], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { casingTexturePages[0][60] }; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getCasingMeta() { - return 0; - } - - @Override - public Block getIntakeBlock() { - return GregTech_API.sBlockCasings8; - } - - @Override - public byte getIntakeMeta() { - return 4; - } - - @Override - public Block getGearboxBlock() { - return GregTech_API.sBlockCasings2; - } - - @Override - public byte getGearboxMeta() { - return 4; - } - - @Override - public byte getCasingTextureIndex() { - return 60; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ExtremeDieselEngine(this.mName); - } - - @Override - protected int getNominalOutput() { - return 10900; - } - - @Override - protected int getBoostFactor() { - return 2; - } - - @Override - protected Materials getBooster() { - return Materials.LiquidOxygen; - } - - @Override - protected int getAdditiveFactor() { - return 1; - } - - @Override - protected int getEfficiencyIncrease() { - return 20; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return boostEu ? 30000 : 10000; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond; - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - - return new String[] { EnumChatFormatting.BLUE + "Extreme Diesel Engine" + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - getIdealStatus() == getRepairStatus() - ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") - + EnumChatFormatting.RESET - : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.engine.output") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers((long) -mEUt * mEfficiency / 10000) - + EnumChatFormatting.RESET - + " EU/t", - StatCollector.translateToLocal("GT5U.engine.consumption") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(fuelConsumption) - + EnumChatFormatting.RESET - + " L/t", - StatCollector.translateToLocal("GT5U.engine.value") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(fuelValue) - + EnumChatFormatting.RESET - + " EU/L", - StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " - + EnumChatFormatting.GOLD - + GT_Utility.formatNumbers(fuelRemaining) - + EnumChatFormatting.RESET - + " L", - StatCollector.translateToLocal("GT5U.engine.efficiency") + ": " - + EnumChatFormatting.YELLOW - + (mEfficiency / 100F) - + EnumChatFormatting.YELLOW - + " %", - StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java deleted file mode 100644 index 9dd01c969d..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java +++ /dev/null @@ -1,676 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.filterByMTETier; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.Set; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableMap; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.ProgressBar; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.VoidingMode; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.overclockdescriber.FusionOverclockDescriber; -import gregtech.api.objects.overclockdescriber.OverclockDescriber; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_ParallelHelper; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReason; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.tileentities.machines.multi.drone.GT_MetaTileEntity_Hatch_DroneDownLink; - -public abstract class GT_MetaTileEntity_FusionComputer - extends GT_MetaTileEntity_EnhancedMultiBlockBase - implements ISurvivalConstructable, IAddUIWidgets, IOverclockDescriptionProvider { - - private final OverclockDescriber overclockDescriber; - - public static final String STRUCTURE_PIECE_MAIN = "main"; - private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { - - @Override - protected IStructureDefinition computeValue(Class type) { - return StructureDefinition.builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { - { " ", " ihi ", " hh hh ", " h h ", - " h h ", " h h ", " i i ", " h h ", - " i i ", " h h ", " h h ", " h h ", - " hh hh ", " ihi ", " ", }, - { " xhx ", " hhccchh ", " eccxdxcce ", " eceh hece ", - " hce ech ", " hch hch ", "xcx xcx", "hch hch", - "xcx xcx", " hch hch ", " hce ech ", " eceh hece ", - " eccx~xcce ", " hhccchh ", " xhx ", }, - { " ", " ihi ", " hh hh ", " h h ", - " h h ", " h h ", " i i ", " h h ", - " i i ", " h h ", " h h ", " h h ", - " hh hh ", " ihi ", " ", } })) - .addElement('c', lazy(t -> ofBlock(t.getFusionCoil(), t.getFusionCoilMeta()))) - .addElement('h', lazy(t -> ofBlock(t.getCasing(), t.getCasingMeta()))) - .addElement( - 'i', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_FusionComputer.class) - .atLeast( - ImmutableMap.of(InputHatch.withAdder(GT_MetaTileEntity_FusionComputer::addInjector), 1)) - .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE)) - .casingIndex(53) - .dot(1) - .buildAndChain(t.getCasing(), t.getCasingMeta()))) - .addElement( - 'e', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_FusionComputer.class).atLeast( - ImmutableMap.of(Energy.withAdder(GT_MetaTileEntity_FusionComputer::addEnergyInjector), 16)) - .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE)) - .casingIndex(53) - .dot(2) - .buildAndChain(t.getCasing(), t.getCasingMeta()))) - .addElement( - 'x', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_FusionComputer.class) - .atLeast(OutputHatch.withAdder(GT_MetaTileEntity_FusionComputer::addExtractor)) - .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE)) - .casingIndex(53) - .dot(3) - .buildAndChain(t.getCasing(), t.getCasingMeta()))) - .addElement( - 'd', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_FusionComputer.class) - .adder(GT_MetaTileEntity_FusionComputer::addDroneHatch) - .hatchId(9401) - .casingIndex(53) - .dot(4) - .buildAndChain(t.getCasing(), t.getCasingMeta()))) - .build(); - } - }; - public GT_Recipe mLastRecipe; - public long mEUStore; - - static { - Textures.BlockIcons.setCasingTextureForId( - 52, - TextureFactory.of( - TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) - .extFacing() - .glow() - .build())); - } - - public GT_MetaTileEntity_FusionComputer(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - this.overclockDescriber = createOverclockDescriber(); - } - - public GT_MetaTileEntity_FusionComputer(String aName) { - super(aName); - this.overclockDescriber = createOverclockDescriber(); - } - - protected OverclockDescriber createOverclockDescriber() { - return new FusionOverclockDescriber((byte) tier(), capableStartupCanonical()); - } - - @Nonnull - @Override - public OverclockDescriber getOverclockDescriber() { - return overclockDescriber; - } - - public abstract int tier(); - - @Override - public abstract long maxEUStore(); - - /** - * Unlike {@link #maxEUStore()}, this provides theoretical limit of startup EU, without considering the amount of - * hatches nor the room for extra energy. Intended for simulation. - */ - public abstract long capableStartupCanonical(); - - @Override - public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity); - - @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) { - - return side != getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (mEUt > 0) { - mEUt = -mEUt; - } - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION.get(getClass()); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addController("Fusion Reactor") - .addInfo("Some kind of fusion reactor, maybe") - .addSeparator() - .addInfo("Some kind of fusion reactor, maybe") - .addStructureInfo("Should probably be built similar to other fusions") - .addStructureInfo("See controller tooltip for details") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - return checkPiece(STRUCTURE_PIECE_MAIN, 7, 1, 12) && !mOutputHatches.isEmpty() && !mEnergyHatches.isEmpty(); - } - - private boolean addEnergyInjector(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { - IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (!(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy tHatch)) return false; - if (tHatch.mTier < tier()) return false; - tHatch.updateTexture(aBaseCasingIndex); - return mEnergyHatches.add(tHatch); - } - - private boolean addInjector(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { - IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (!(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch)) return false; - if (tHatch.getTierForStructure() < tier()) return false; - tHatch.updateTexture(aBaseCasingIndex); - tHatch.mRecipeMap = getRecipeMap(); - return mInputHatches.add(tHatch); - } - - private boolean addExtractor(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { - if (aBaseMetaTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (!(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output tHatch)) return false; - if (tHatch.getTierForStructure() < tier()) return false; - tHatch.updateTexture(aBaseCasingIndex); - return mOutputHatches.add(tHatch); - } - - private boolean addDroneHatch(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { - if (aBaseMetaTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (!(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DroneDownLink tHatch)) return false; - tHatch.updateTexture(aBaseCasingIndex); - return addToMachineList(aBaseMetaTileEntity, aBaseCasingIndex); - } - - public abstract Block getCasing(); - - public abstract int getCasingMeta(); - - public abstract Block getFusionCoil(); - - public abstract int getFusionCoilMeta(); - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) return new ITexture[] { TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS) - .extFacing() - .build(), getTextureOverlay() }; - if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(52) }; - return new ITexture[] { TextureFactory.builder() - .addIcon(MACHINE_CASING_FUSION_GLASS) - .extFacing() - .build() }; - } - - /** - * @return The list of textures overlay - */ - public abstract ITexture getTextureOverlay(); - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.fusionRecipes; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @NotNull - @Override - protected GT_ParallelHelper createParallelHelper(@NotNull GT_Recipe recipe) { - // When the fusion first loads and is still processing, it does the recipe check without consuming. - return super.createParallelHelper(recipe).setConsumption(!mRunningOnLoad); - } - - @NotNull - @Override - protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) { - return overclockDescriber.createCalculator(super.createOverclockCalculator(recipe), recipe); - } - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) { - if (!mRunningOnLoad && recipe.mSpecialValue > maxEUStore()) { - return CheckRecipeResultRegistry.insufficientStartupPower(recipe.mSpecialValue); - } - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - @NotNull - @Override - public CheckRecipeResult process() { - CheckRecipeResult result = super.process(); - if (mRunningOnLoad) mRunningOnLoad = false; - turnCasingActive(result.wasSuccessful()); - if (result.wasSuccessful()) { - mLastRecipe = lastRecipe; - } else { - mLastRecipe = null; - } - return result; - } - }; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Values.V[tier()]); - logic.setAvailableAmperage(1); - logic.setAmperageOC(false); - } - - public boolean turnCasingActive(boolean status) { - if (this.mEnergyHatches != null) { - for (GT_MetaTileEntity_Hatch_Energy hatch : this.mEnergyHatches) { - hatch.updateTexture(status ? 52 : 53); - } - } - if (this.mOutputHatches != null) { - for (GT_MetaTileEntity_Hatch_Output hatch : this.mOutputHatches) { - hatch.updateTexture(status ? 52 : 53); - } - } - if (this.mInputHatches != null) { - for (GT_MetaTileEntity_Hatch_Input hatch : this.mInputHatches) { - hatch.updateTexture(status ? 52 : 53); - } - } - return true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - mTotalRunTime++; - if (mEfficiency < 0) mEfficiency = 0; - if (mRunningOnLoad && checkMachine(aBaseMetaTileEntity, mInventory[1])) { - this.mEUStore = aBaseMetaTileEntity.getStoredEU(); - checkRecipe(); - } - if (mUpdated) { - mUpdate = 50; - mUpdated = false; - } - if (--mUpdate == 0 || --mStartUpCheck == 0) { - checkStructure(true, aBaseMetaTileEntity); - } - if (mStartUpCheck < 0) { - if (mMachine) { - this.mEUStore = aBaseMetaTileEntity.getStoredEU(); - if (this.mEnergyHatches != null) { - for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { - long energyToMove = GT_Values.V[tier()] / 16; - if (aBaseMetaTileEntity.getStoredEU() + energyToMove < maxEUStore() - && tHatch.getBaseMetaTileEntity() - .decreaseStoredEnergyUnits(energyToMove, false)) { - aBaseMetaTileEntity.increaseStoredEnergyUnits(energyToMove, true); - } - } - } - if (this.mEUStore <= 0 && mMaxProgresstime > 0) { - stopMachine(ShutDownReasonRegistry.POWER_LOSS); - } - if (mMaxProgresstime > 0) { - this.getBaseMetaTileEntity() - .decreaseStoredEnergyUnits(-mEUt, true); - if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) { - if (mOutputItems != null) - for (ItemStack tStack : mOutputItems) if (tStack != null) addOutput(tStack); - if (mOutputFluids != null) - for (FluidStack tStack : mOutputFluids) if (tStack != null) addOutput(tStack); - mEfficiency = Math - .max(0, Math.min(mEfficiency + mEfficiencyIncrease, getMaxEfficiency(mInventory[1]))); - mOutputItems = null; - mProgresstime = 0; - mMaxProgresstime = 0; - mEfficiencyIncrease = 0; - if (mOutputFluids != null && mOutputFluids.length > 0) { - try { - GT_Mod.achievements.issueAchivementHatchFluid( - aBaseMetaTileEntity.getWorld() - .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), - mOutputFluids[0]); - } catch (Exception ignored) {} - } - this.mEUStore = aBaseMetaTileEntity.getStoredEU(); - if (aBaseMetaTileEntity.isAllowedToWork()) checkRecipe(); - } - } else { - if (aTick % 100 == 0 || aBaseMetaTileEntity.hasWorkJustBeenEnabled() - || aBaseMetaTileEntity.hasInventoryBeenModified()) { - turnCasingActive(mMaxProgresstime > 0); - if (aBaseMetaTileEntity.isAllowedToWork()) { - this.mEUStore = aBaseMetaTileEntity.getStoredEU(); - if (checkRecipe()) { - if (this.mEUStore < this.mLastRecipe.mSpecialValue + this.mEUt) { - stopMachine(ShutDownReasonRegistry.POWER_LOSS); - } - aBaseMetaTileEntity - .decreaseStoredEnergyUnits(this.mLastRecipe.mSpecialValue + this.mEUt, true); - } - } - if (mMaxProgresstime <= 0) mEfficiency = Math.max(0, mEfficiency - 1000); - } - } - } else if (aBaseMetaTileEntity.isAllowedToWork()) { - this.mLastRecipe = null; - stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE); - } - } - aBaseMetaTileEntity - .setErrorDisplayID((aBaseMetaTileEntity.getErrorDisplayID() & ~127) | (mMachine ? 0 : 64)); - aBaseMetaTileEntity.setActive(mMaxProgresstime > 0); - } else { - doActivitySound(getActivitySoundLoop()); - } - } - - @Override - public boolean drainEnergyInput(long aEU) { - return false; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public void stopMachine(@NotNull ShutDownReason reason) { - super.stopMachine(reason); - turnCasingActive(false); - } - - @Override - public String[] getInfoData() { - String tier = tier() == 6 ? EnumChatFormatting.RED + "I" + EnumChatFormatting.RESET - : tier() == 7 ? EnumChatFormatting.YELLOW + "II" + EnumChatFormatting.RESET - : tier() == 8 ? EnumChatFormatting.GRAY + "III" + EnumChatFormatting.RESET : "IV"; - float plasmaOut = 0; - int powerRequired = 0; - if (this.mLastRecipe != null) { - powerRequired = this.mLastRecipe.mEUt; - if (this.mLastRecipe.getFluidOutput(0) != null) { - plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration; - } - } - - return new String[] { EnumChatFormatting.BLUE + "Fusion Reactor MK " + EnumChatFormatting.RESET + tier, - StatCollector.translateToLocal("GT5U.fusion.req") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(powerRequired) - + EnumChatFormatting.RESET - + "EU/t", - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mEUStore) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEUStore()) - + EnumChatFormatting.RESET - + " EU", - StatCollector.translateToLocal("GT5U.fusion.plasma") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(plasmaOut) - + EnumChatFormatting.RESET - + "L/t" }; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 7, 1, 12); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 1, 12, elementBudget, env, false, true); - } - - @SideOnly(Side.CLIENT) - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.GT_MACHINES_FUSION_LOOP.resourceLocation; - } - - @Override - public boolean doesBindPlayerInventory() { - return false; - } - - @Override - public void addGregTechLogo(ModularWindow.Builder builder) { - builder.widget( - new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) - .setSize(17, 17) - .setPos(155, 145)); - } - - @Override - public GUITextureSet getGUITextureSet() { - return new GUITextureSet().setMainBackground(GT_UITextures.BACKGROUND_FUSION_COMPUTER); - } - - @Override - public int getGUIWidth() { - return 176; - } - - @Override - public int getGUIHeight() { - return 166; - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - protected long clientEU; - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder - .widget( - new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> !mMachine) - .setPos(10, 8)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)) - .widget( - new TextWidget("Hit with Soft Mallet to (re-)start the Machine if it doesn't start.") - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setTextAlignment(Alignment.Center) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 - && !getBaseMetaTileEntity().isActive()) - .setPos(-getGUIWidth() / 2, 170) - .setSize(getGUIWidth() * 2, 9)) - .widget( - new FakeSyncWidget.IntegerSyncer( - () -> getBaseMetaTileEntity().getErrorDisplayID(), - val -> getBaseMetaTileEntity().setErrorDisplayID(val))) - .widget( - new FakeSyncWidget.BooleanSyncer( - () -> getBaseMetaTileEntity().isActive(), - val -> getBaseMetaTileEntity().setActive(val))) - .widget( - new TextWidget("Running perfectly.").setDefaultColor(COLOR_TEXT_WHITE.get()) - .setTextAlignment(Alignment.Center) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 - && getBaseMetaTileEntity().isActive()) - .setPos(0, 170) - .setSize(getGUIWidth(), 9)) - .widget( - new FakeSyncWidget.IntegerSyncer( - () -> getBaseMetaTileEntity().getErrorDisplayID(), - val -> getBaseMetaTileEntity().setErrorDisplayID(val))) - .widget( - new ProgressBar() - .setProgress( - () -> (float) getBaseMetaTileEntity().getStoredEU() / getBaseMetaTileEntity().getEUCapacity()) - .setDirection(ProgressBar.Direction.RIGHT) - .setTexture(GT_UITextures.PROGRESSBAR_STORED_EU, 147) - .setPos(5, 156) - .setSize(147, 5)) - .widget(new TextWidget().setStringSupplier(() -> { - if (clientEU > 160_000_000L && clientEU < 160_010_000L) { - clientEU = 160_000_000L; - } - if (clientEU > 320_000_000L && clientEU < 320_010_000L) { - clientEU = 320_000_000L; - } - if (clientEU > 640_000_000L && clientEU < 640_010_000L) { - clientEU = 640_000_000L; - } - if (clientEU > 5_120_000_000L && clientEU < 5_120_080_000L) { - clientEU = 5_120_000_000L; - } - return numberFormat.format(clientEU) + " EU"; - }) - .setDefaultColor(COLOR_TEXT_RED.get()) - .setTextAlignment(Alignment.Center) - .setScale(0.5f) - .setPos(5, 157) - .setSize(147, 5)) - .widget(new FakeSyncWidget.LongSyncer(() -> getBaseMetaTileEntity().getStoredEU(), val -> clientEU = val)) - .widget( - new ButtonWidget().setNEITransferRect( - RecipeMaps.fusionRecipes.getFrontend() - .getUIProperties().neiTransferRectId) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_NEI) - .setPos(154, 4) - .setSize(18, 18)); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public Set getAllowedVoidingModes() { - return VoidingMode.FLUID_ONLY_MODES; - } - - @Override - public boolean getDefaultHasMaintenanceChecks() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java deleted file mode 100644 index e3a2432bf9..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java +++ /dev/null @@ -1,103 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW; - -import net.minecraft.block.Block; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_FusionComputer1 extends GT_MetaTileEntity_FusionComputer { - - private static final ITexture textureOverlay = TextureFactory.of( - TextureFactory.builder() - .addIcon(OVERLAY_FUSION1) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FUSION1_GLOW) - .extFacing() - .glow() - .build()); - - public GT_MetaTileEntity_FusionComputer1(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_FusionComputer1(String aName) { - super(aName); - } - - @Override - public int tier() { - return 6; - } - - @Override - public long maxEUStore() { - return 160003000L * (Math.min(16, this.mEnergyHatches.size())) / 16L; - } - - @Override - public long capableStartupCanonical() { - return 160_000_000; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_FusionComputer1(mName); - } - - @Override - public Block getCasing() { - return GregTech_API.sBlockCasings1; - } - - @Override - public int getCasingMeta() { - return 6; - } - - @Override - public Block getFusionCoil() { - return GregTech_API.sBlockCasings1; - } - - @Override - public int getFusionCoilMeta() { - return 15; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Fusion Reactor") - .addInfo("It's over 9000!!!") - .addInfo("Controller block for the Fusion Reactor Mk I") - .addInfo("2048EU/t and 10M EU capacity per Energy Hatch") - .addInfo("If the recipe has a startup cost greater than the") - .addInfo("number of energy hatches * cap, you can't do it") - .addSeparator() - .beginStructureBlock(15, 3, 15, false) - .addController("See diagram when placed") - .addCasingInfoRange("LuV Machine Casing", 79, 123, false) - .addStructureInfo("Cover the coils with casing") - .addOtherStructurePart("Superconducting Coil Block", "Center part of the ring") - .addEnergyHatch("1-16, Specified casings", 2) - .addInputHatch("2-16, Specified casings", 1) - .addOutputHatch("1-16, Specified casings", 3) - .addStructureInfo("ALL Hatches must be LuV or better") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture getTextureOverlay() { - return textureOverlay; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java deleted file mode 100644 index 0b1f10158b..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java +++ /dev/null @@ -1,103 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION2; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION2_GLOW; - -import net.minecraft.block.Block; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_FusionComputer2 extends GT_MetaTileEntity_FusionComputer { - - private static final ITexture textureOverlay = TextureFactory.of( - TextureFactory.builder() - .addIcon(OVERLAY_FUSION2) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FUSION2_GLOW) - .extFacing() - .glow() - .build()); - - public GT_MetaTileEntity_FusionComputer2(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_FusionComputer2(String aName) { - super(aName); - } - - @Override - public int tier() { - return 7; - } - - @Override - public long maxEUStore() { - return 320006000L * (Math.min(16, this.mEnergyHatches.size())) / 16L; - } - - @Override - public long capableStartupCanonical() { - return 320_000_000; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_FusionComputer2(mName); - } - - @Override - public Block getCasing() { - return GregTech_API.sBlockCasings4; - } - - @Override - public int getCasingMeta() { - return 6; - } - - @Override - public Block getFusionCoil() { - return GregTech_API.sBlockCasings4; - } - - @Override - public int getFusionCoilMeta() { - return 7; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Fusion Reactor") - .addInfo("It's over 9000!!!") - .addInfo("Controller block for the Fusion Reactor Mk II") - .addInfo("8192EU/t and 20M EU capacity per Energy Hatch") - .addInfo("If the recipe has a startup cost greater than the") - .addInfo("number of energy hatches * cap, you can't do it") - .addSeparator() - .beginStructureBlock(15, 3, 15, false) - .addController("See diagram when placed") - .addCasingInfoRange("Fusion Machine Casing", 79, 123, false) - .addStructureInfo("Cover the coils with casing") - .addOtherStructurePart("Fusion Coil Block", "Center part of the ring") - .addEnergyHatch("1-16, Specified casings", 2) - .addInputHatch("2-16, Specified casings", 1) - .addOutputHatch("1-16, Specified casings", 3) - .addStructureInfo("ALL Hatches must be ZPM or better") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture getTextureOverlay() { - return textureOverlay; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java deleted file mode 100644 index 64d92ccc99..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java +++ /dev/null @@ -1,103 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION3; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION3_GLOW; - -import net.minecraft.block.Block; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_FusionComputer3 extends GT_MetaTileEntity_FusionComputer { - - private static final ITexture textureOverlay = TextureFactory.of( - TextureFactory.builder() - .addIcon(OVERLAY_FUSION3) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FUSION3_GLOW) - .extFacing() - .glow() - .build()); - - public GT_MetaTileEntity_FusionComputer3(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_FusionComputer3(String aName) { - super(aName); - } - - @Override - public int tier() { - return 8; - } - - @Override - public long maxEUStore() { - return 640010000L * (Math.min(16, this.mEnergyHatches.size())) / 16L; - } - - @Override - public long capableStartupCanonical() { - return 640_000_000; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_FusionComputer3(mName); - } - - @Override - public Block getCasing() { - return GregTech_API.sBlockCasings4; - } - - @Override - public int getCasingMeta() { - return 8; - } - - @Override - public Block getFusionCoil() { - return GregTech_API.sBlockCasings4; - } - - @Override - public int getFusionCoilMeta() { - return 7; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Fusion Reactor") - .addInfo("A SUN DOWN ON EARTH") - .addInfo("Controller block for the Fusion Reactor Mk III") - .addInfo("32768EU/t and 40M EU capacity per Energy Hatch") - .addInfo("If the recipe has a startup cost greater than the") - .addInfo("number of energy hatches * cap, you can't do it") - .addSeparator() - .beginStructureBlock(15, 3, 15, false) - .addController("See diagram when placed") - .addCasingInfoRange("Fusion Machine Casing Mk II", 79, 123, false) - .addStructureInfo("Cover the coils with casing") - .addOtherStructurePart("Fusion Coil Block", "Center part of the ring") - .addEnergyHatch("1-16, Specified casings", 2) - .addInputHatch("2-16, Specified casings", 1) - .addOutputHatch("1-16, Specified casings", 3) - .addStructureInfo("ALL Hatches must be UV or better") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture getTextureOverlay() { - return textureOverlay; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java deleted file mode 100644 index 46c9c712ce..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java +++ /dev/null @@ -1,400 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.registries.LHECoolantRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_HeatExchanger extends - GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - private int dryHeatCounter = 0; // Counts up to dryHeatMaximum to check for explosion conditions - private static final int dryHeatMaximum = 2000; // 2000 ticks = 100 seconds - private static final int CASING_INDEX = 50; - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { "ccc", "cCc", "ccc" }, { "ccc", "cPc", "ccc" }, { "ccc", "cPc", "ccc" }, - { "c~c", "cHc", "ccc" }, })) - .addElement('P', ofBlock(GregTech_API.sBlockCasings2, 14)) - .addElement( - 'C', - OutputHatch.withAdder(GT_MetaTileEntity_HeatExchanger::addColdFluidOutputToMachineList) - .withCount(t -> t.mOutputColdFluidHatch.isValid() ? 1 : 0) - .newAny(CASING_INDEX, 3)) - .addElement( - 'H', - InputHatch.withAdder(GT_MetaTileEntity_HeatExchanger::addHotFluidInputToMachineList) - .withCount(t -> t.mInputHotFluidHatch.isValid() ? 1 : 0) - .newAny(CASING_INDEX, 3)) - .addElement( - 'c', - buildHatchAdder(GT_MetaTileEntity_HeatExchanger.class) - .atLeast(InputBus, InputHatch, OutputBus, OutputHatch, Maintenance) - .casingIndex(CASING_INDEX) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_HeatExchanger::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings4, (byte) 2)))) - .build(); - public static float penalty_per_config = 0.015f; // penalize 1.5% efficiency per circuitry level (1-25) - - private GT_MetaTileEntity_Hatch_Input mInputHotFluidHatch; - private GT_MetaTileEntity_Hatch_Output mOutputColdFluidHatch; - private boolean superheated = false; - private int superheated_threshold = 0; - /** - * How much more steam we can make without draining real water. Unit is (1L/GT_Values.STEAM_PER_WATER) - */ - private int steamBudget; - - private int mCasingAmount; - - public GT_MetaTileEntity_HeatExchanger(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_HeatExchanger(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Heat Exchanger") - .addInfo("Controller Block for the Large Heat Exchanger") - .addInfo("More complicated than a Fusion Reactor. Seriously") - .addInfo("Inputs are Hot Coolant or Lava") - .addInfo("Outputs Coolant or Pahoehoe Lava and SH Steam/Steam") - .addInfo("Read the wiki article to understand how it works") - .addInfo("Then go to the Discord to understand the wiki") - .addSeparator() - .beginStructureBlock(3, 4, 3, false) - .addController("Front bottom") - .addCasingInfoRange("Stable Titanium Machine Casing", 20, 32, false) - .addOtherStructurePart("Titanium Pipe Casing", "Center 2 blocks") - .addMaintenanceHatch("Any casing", 1) - .addInputHatch("Hot fluid, bottom center", 2) - .addInputHatch("Distilled water, any casing", 1) - .addOutputHatch("Cold fluid, top center", 3) - .addOutputHatch("Steam/SH Steam, any casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - superheated = aNBT.getBoolean("superheated"); - steamBudget = aNBT.getInteger("steamBudget"); - super.loadNBTData(aNBT); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setBoolean("superheated", superheated); - aNBT.setInteger("steamBudget", steamBudget); - super.saveNBTData(aNBT); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped(); - } - - @Override - @Nonnull - public CheckRecipeResult checkProcessing() { - if (mInputHotFluidHatch.getFluid() == null) return CheckRecipeResultRegistry.NO_RECIPE; - - int fluidAmountToConsume = mInputHotFluidHatch.getFluidAmount(); // how much fluid is in hatch - - superheated_threshold = 4000; // default: must have 4000L per second to generate superheated steam - float efficiency = 1f; // default: operate at 100% efficiency with no integrated circuitry - int shs_reduction_per_config = 150; // reduce threshold 150L/s per circuitry level (1-25) - float steam_output_multiplier = 20f; // default: multiply output by 4 * 10 (boosted x5) - float penalty = 0.0f; // penalty to apply to output based on circuitry level (1-25). - - // Do we have an integrated circuit with a valid configuration? - if (mInventory[1] != null && mInventory[1].getUnlocalizedName() - .startsWith("gt.integrated_circuit")) { - int circuit_config = mInventory[1].getItemDamage(); - if (circuit_config >= 1 && circuit_config <= 25) { - // If so, apply the penalty and reduce the threshold. - penalty = (circuit_config - 1) * penalty_per_config; - superheated_threshold -= shs_reduction_per_config * (circuit_config - 1); - } - } - - efficiency -= penalty; - - var coolant = LHECoolantRegistry.getCoolant( - mInputHotFluidHatch.getFluid() - .getFluid()); - - if (coolant == null) { - superheated_threshold = 0; - return CheckRecipeResultRegistry.NO_RECIPE; - } else { - steam_output_multiplier *= coolant.steamMultiplier; - superheated_threshold *= coolant.superheatedThreshold; - } - - // set the internal superheated flag if we have - // enough hot fluid. Used in the onRunningTick method. - superheated = fluidAmountToConsume >= superheated_threshold; - - // Don't consume too much hot fluid per second - fluidAmountToConsume = Math.min(fluidAmountToConsume, superheated_threshold * 2); - - mInputHotFluidHatch.drain(fluidAmountToConsume, true); - mOutputColdFluidHatch.fill(coolant.getColdFluid(fluidAmountToConsume), true); - - this.mMaxProgresstime = 20; - this.mEUt = (int) (fluidAmountToConsume * steam_output_multiplier * efficiency); - this.mEfficiencyIncrease = 80; - - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - private int useWater(int steam) { - steamBudget -= steam; - int usage = -Math.min(0, Math.floorDiv(steamBudget, GT_Values.STEAM_PER_WATER)); - // still subtract, because usage will be a negative number - steamBudget += usage * GT_Values.STEAM_PER_WATER; - return usage; - } - - @Override - public boolean onRunningTick(ItemStack aStack) { - if (this.mEUt > 0) { - int tGeneratedEU = (int) (this.mEUt * 2L * this.mEfficiency / 10000L); // APPROXIMATELY how much steam to - // generate. - if (tGeneratedEU > 0) { - - if (superheated) tGeneratedEU /= 2; // We produce half as much superheated steam if necessary - - int distilledConsumed = useWater(tGeneratedEU); // how much distilled water to consume - // tGeneratedEU = distilledConsumed * 160; // EXACTLY how much steam to generate, producing a perfect - // 1:160 ratio with distilled water consumption - - FluidStack distilledStack = GT_ModHandler.getDistilledWater(distilledConsumed); - startRecipeProcessing(); - if (depleteInput(distilledStack)) // Consume the distilled water - { - if (superheated) { - addOutput(FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU)); // Generate - // superheated - // steam - } else { - addOutput(GT_ModHandler.getSteam(tGeneratedEU)); // Generate regular steam - } - dryHeatCounter = 0; - } else { - if (dryHeatCounter < dryHeatMaximum) { - dryHeatCounter += 1; - } else { - GT_Log.exp.println(this.mName + " was too hot and had no more Distilled Water!"); - explodeMultiblock(); // Generate crater - } - } - endRecipeProcessing(); - } - return true; - } - return true; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mOutputColdFluidHatch = null; - mInputHotFluidHatch = null; - mCasingAmount = 0; - return checkPiece(STRUCTURE_PIECE_MAIN, 1, 3, 0) && mCasingAmount >= 20 && mMaintenanceHatches.size() == 1; - } - - public boolean addColdFluidOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - mOutputColdFluidHatch = (GT_MetaTileEntity_Hatch_Output) aMetaTileEntity; - return true; - } - return false; - } - - public boolean addHotFluidInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = getRecipeMap(); - mInputHotFluidHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity; - return true; - } - return false; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_HeatExchanger(this.mName); - } - - @Override - public String[] getInfoData() { - return new String[] { - StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - StatCollector.translateToLocal("GT5U.multiblock.usage") + " " - + StatCollector.translateToLocal("GT5U.LHE.steam") - + ": " - + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.YELLOW) - + GT_Utility.formatNumbers(superheated ? -2L * mEUt : -mEUt) - + EnumChatFormatting.RESET - + " EU/t", - StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " - + EnumChatFormatting.RED - + (getIdealStatus() - getRepairStatus()) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.multiblock.efficiency") - + ": " - + EnumChatFormatting.YELLOW - + mEfficiency / 100.0F - + EnumChatFormatting.RESET - + " %", - StatCollector.translateToLocal("GT5U.LHE.superheated") + ": " - + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.BLUE) - + superheated - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.LHE.superheated") + " " - + StatCollector.translateToLocal("GT5U.LHE.threshold") - + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(superheated_threshold) - + EnumChatFormatting.RESET }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 3, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 3, 0, elementBudget, env, false, true); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java deleted file mode 100644 index a1968b05d4..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java +++ /dev/null @@ -1,163 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.structure.IStructureElement; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_CubicMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_ImplosionCompressor - extends GT_MetaTileEntity_CubicMultiBlockBase { - - public GT_MetaTileEntity_ImplosionCompressor(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ImplosionCompressor(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ImplosionCompressor(this.mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Implosion Compressor") - .addInfo("Explosions are fun") - .addInfo("Controller block for the Implosion Compressor") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 3, 3, true) - .addController("Front center") - .addCasingInfoRange("Solid Steel Machine Casing", 16, 24, false) - .addStructureInfo("Casings can be replaced with Explosion Warning Signs") - .addEnergyHatch("Any casing", 1) - .addMaintenanceHatch("Any casing", 1) - .addMufflerHatch("Any casing", 1) - .addInputBus("Any casing", 1) - .addOutputBus("Any casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - return super.addToMachineList(aTileEntity, aBaseCasingIndex) - || addMufflerToMachineList(aTileEntity, aBaseCasingIndex); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][16] }; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.implosionRecipes; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic(); - } - - @Override - protected int getTimeBetweenProcessSounds() { - return 10; - } - - @Override - protected SoundResource getProcessStartSound() { - return SoundResource.RANDOM_EXPLODE; - } - - @Override - protected IStructureElement> getCasingElement() { - return ofChain(ofBlock(GregTech_API.sBlockCasings2, 0), ofBlock(GregTech_API.sBlockCasings3, 4)); - } - - @Override - protected int getHatchTextureIndex() { - return 16; - } - - @Override - protected int getRequiredCasingCount() { - return 16; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionImplosionCompressorPerSecond; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialElectromagneticSeparator.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialElectromagneticSeparator.java deleted file mode 100644 index a3e65ce057..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialElectromagneticSeparator.java +++ /dev/null @@ -1,467 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.GT_HatchElement.*; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -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.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.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.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_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MagHatch; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Casings10; -import gregtech.common.items.GT_MetaGenerated_Item_01; -import gtPlusPlus.core.util.minecraft.PlayerUtils; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_IndustrialElectromagneticSeparator - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - public enum MagnetTiers { - - Iron(8, 0.8F, 1.1F, false), - Steel(24, 0.75F, 1.25F, false), - Neodymium(48, 0.7F, 1.5F, false), - Samarium(96, 0.6F, 2F, false), - Tengam(256, 0.5F, 2.5F, true); - - final int maxParallel; - final float euModifier, speedBoost; - final boolean supportsExotic; - - MagnetTiers(int maxParallel, float euModifier, float speedBoost, boolean supportsExotic) { - this.maxParallel = maxParallel; - this.euModifier = euModifier; - this.speedBoost = 1F / speedBoost; - this.supportsExotic = supportsExotic; - } - - public static String buildMagnetTooltip(MagnetTiers m) { - String tooltip = "Used in Magnetic Flux Exhibitor/n " + EnumChatFormatting.LIGHT_PURPLE - + "Speed: +" - + Math.round((1F / m.speedBoost * 100) - 100) - + "%/n " - + EnumChatFormatting.DARK_PURPLE - + "EU Usage: " - + Math.round(m.euModifier * 100) - + "%/n " - + EnumChatFormatting.AQUA - + "Parallel: " - + m.maxParallel; - - if (m.supportsExotic) tooltip = tooltip + "/n " - + EnumChatFormatting.BOLD - + EnumChatFormatting.GREEN - + "Can Use Multiamp Hatches"; - - return tooltip; - } - } - - final int MIN_CASING = 64; - private GT_MetaTileEntity_MagHatch mMagHatch = null; - private MagnetTiers magnetTier = null; - - private static final int MACHINEMODE_SEPARATOR = 0; - private static final int MACHINEMODE_POLARIZER = 1; - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - (new String[][] { { " CCC ", " ", " ", " ", " ", " B~B " }, - { " CC CC ", " ", " BBB ", " AAA ", " BEB ", " BBBBB " }, - { "CC CC", " ", " BBBBB ", " A A ", " BBBBB ", "BBBBBBB" }, - { "C C", "C C", "CBBBBBC", "CA C AC", "CBBBBBC", "BBBBBBB" }, - { "CC CC", " ", " BBBBB ", " A A ", " BBBBB ", "BBBBBBB" }, - { " CC CC ", " ", " BBB ", " AAA ", " BBB ", " BBBBB " }, - { " CCC ", " C ", " C ", " C ", " C ", " BBB " } })) - .addElement('A', Glasses.chainAllGlasses()) - .addElement( - 'B', - ofChain( - buildHatchAdder(GT_MetaTileEntity_IndustrialElectromagneticSeparator.class) - .atLeast(InputBus, OutputBus, Maintenance, Energy.or(ExoticEnergy)) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(0)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_IndustrialElectromagneticSeparator::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 0))))) - .addElement('C', ofFrame(Materials.NeodymiumMagnetic)) - .addElement( - 'E', - buildHatchAdder(GT_MetaTileEntity_IndustrialElectromagneticSeparator.class) - .adder(GT_MetaTileEntity_IndustrialElectromagneticSeparator::addMagHatch) - .hatchClass(GT_MetaTileEntity_MagHatch.class) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(0)) - .dot(2) - .build()) - .build(); - - public GT_MetaTileEntity_IndustrialElectromagneticSeparator(final int aID, final String aName, - final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_IndustrialElectromagneticSeparator(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_IndustrialElectromagneticSeparator(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 0)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EMS_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EMS_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 0)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EMS) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_EMS_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 0)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Electromagnetic Separator/Polarizer") - .addInfo("Controller Block for the Magnetic Flux Exhibitor") - .addInfo("Use screwdriver to switch mode") - .addInfo("Insert an electromagnet into the electromagnet housing to use") - .addInfo("Better electromagnets give further bonuses") - .addInfo("With Tengam electromagnet, multiamp (NOT laser) hatches are allowed") - .addInfo( - AuthorFourIsTheNumber + EnumChatFormatting.GRAY - + " & " - + EnumChatFormatting.GOLD - + "Ba" - + EnumChatFormatting.LIGHT_PURPLE - + "ps") - .addSeparator() - .beginStructureBlock(7, 6, 7, false) - .addController("Front Center") - .addCasingInfoMin("MagTech Casings", MIN_CASING, false) - .addOtherStructurePart("Any glass", "x12") - .addOtherStructurePart("Magnetic Neodymium Frame Box", "x37") - .addOtherStructurePart("Electromagnet Housing", "1 Block Above/Behind Controller", 2) - .addInputBus("Any Casing", 1) - .addOutputBus("Any Casing", 1) - .addEnergyHatch("Any Casing", 1) - .addMaintenanceHatch("Any Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 5, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 5, 0, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - mMagHatch = null; - mExoticEnergyHatches.clear(); - mEnergyHatches.clear(); - - if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 5, 0)) return false; - if (mCasingAmount < MIN_CASING) return false; - if (mMagHatch == null) return false; - - // If there are exotic hatches, ensure there is only 1, and it is not laser. Only multiamp allowed - if (!mExoticEnergyHatches.isEmpty()) { - if (!mEnergyHatches.isEmpty()) return false; - if (mExoticEnergyHatches.size() > 1) return false; - if (mExoticEnergyHatches.get(0) - .maxWorkingAmperesIn() > 64) return false; - } - - // All checks passed! - return true; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - findMagnet(); - if (magnetTier != null) { - if (!mExoticEnergyHatches.isEmpty() && !magnetTier.supportsExotic) - return SimpleCheckRecipeResult.ofFailure("electromagnet_insufficient"); - euModifier = magnetTier.euModifier; - speedBoost = magnetTier.speedBoost; - return CheckRecipeResultRegistry.SUCCESSFUL; - } - return SimpleCheckRecipeResult.ofFailure("electromagnet_missing"); - } - }.setMaxParallelSupplier(this::getMaxParallels); - } - - private int getMaxParallels() { - if (magnetTier != null) return magnetTier.maxParallel; - return 0; - } - - @Override - public RecipeMap getRecipeMap() { - return (machineMode == MACHINEMODE_POLARIZER) ? RecipeMaps.polarizerRecipes - : RecipeMaps.electroMagneticSeparatorRecipes; - } - - @Nonnull - @Override - public Collection> getAvailableRecipeMaps() { - return Arrays.asList(RecipeMaps.polarizerRecipes, RecipeMaps.electroMagneticSeparatorRecipes); - } - - @Override - public int getRecipeCatalystPriority() { - return -10; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - if (aNBT.hasKey("polarizerMode")) { - machineMode = aNBT.getBoolean("polarizerMode") ? MACHINEMODE_POLARIZER : MACHINEMODE_SEPARATOR; - aNBT.removeTag("polarizerMode"); - } - super.loadNBTData(aNBT); - } - - @Override - public boolean supportsMachineModeSwitch() { - return true; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - setMachineMode(nextMachineMode()); - PlayerUtils.messagePlayer( - aPlayer, - String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); - } - - @Override - public void setMachineModeIcons() { - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_SEPARATOR); - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_POLARIZER); - } - - @Override - public String getMachineModeName() { - return StatCollector.translateToLocal("GT5U.INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR.mode." + machineMode); - } - - @Override - public void clearHatches() { - super.clearHatches(); - mExoticEnergyHatches.clear(); - } - - @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", machineMode); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - currentTip.add( - StatCollector.translateToLocal("GT5U.machines.oreprocessor1") + " " - + EnumChatFormatting.WHITE - + StatCollector - .translateToLocal("GT5U.INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR.mode." + tag.getInteger("mode")) - + EnumChatFormatting.RESET); - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - // This fix works for normal energy hatches, preventing over-paralleling with 1 energy hatch - // However, it does not work with multiamp. MuTEs can't come soon enough. - - if (mExoticEnergyHatches.isEmpty()) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } else super.setProcessingLogicPower(logic); - } - - private void findMagnet() { - magnetTier = null; - if (mMagHatch != null) { - ItemStack aSlot = mMagHatch.getStackInSlot(0); - if (aSlot != null) { - switch (aSlot.getItemDamage()) { - case 32345 -> magnetTier = MagnetTiers.Iron; - case 32346 -> magnetTier = MagnetTiers.Steel; - case 32347 -> magnetTier = MagnetTiers.Neodymium; - case 32348 -> magnetTier = MagnetTiers.Samarium; - case 32349 -> magnetTier = MagnetTiers.Tengam; - default -> magnetTier = null; - } - } - - } - } - - public static boolean isValidElectromagnet(ItemStack aMagnet) { - return aMagnet != null && aMagnet.getItem() instanceof GT_MetaGenerated_Item_01 - && aMagnet.getItemDamage() >= 32345 - && aMagnet.getItemDamage() <= 32349; - } - - private boolean addMagHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity != null) { - final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity instanceof GT_MetaTileEntity_MagHatch) { - ((GT_MetaTileEntity_MagHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - if (mMagHatch == null) { - mMagHatch = (GT_MetaTileEntity_MagHatch) aMetaTileEntity; - return true; - } - } - } - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialExtractor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialExtractor.java deleted file mode 100644 index e10b497b6b..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialExtractor.java +++ /dev/null @@ -1,293 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.GT_HatchElement.*; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import org.apache.commons.lang3.tuple.Pair; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import 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_ExtendedPowerMultiBlockBase; -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.blocks.GT_Block_Casings4; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_IndustrialExtractor - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - (new String[][] { { " A ", " BBB ", "AB~BA", " BBB " }, { " A ", " BBB ", "AB BA", " BBB " }, - { " A ", " BBB ", "AB BA", " BBB " }, { " A ", " BBB ", "ABBBA", " BBB " }, - { " A ", " A ", "AAAAA", " " } })) - .addElement( - 'B', - buildHatchAdder(GT_MetaTileEntity_IndustrialExtractor.class) - .atLeast(InputBus, OutputBus, Maintenance, Energy) - .casingIndex(((GT_Block_Casings4) GregTech_API.sBlockCasings4).getTextureIndex(1)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_IndustrialExtractor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings4, 1)))) - .addElement( - 'A', - ofBlocksTiered( - GT_MetaTileEntity_IndustrialExtractor::getItemPipeTierFromMeta, - ImmutableList.of( - Pair.of(GregTech_API.sBlockCasings11, 0), - Pair.of(GregTech_API.sBlockCasings11, 1), - Pair.of(GregTech_API.sBlockCasings11, 2), - Pair.of(GregTech_API.sBlockCasings11, 3), - Pair.of(GregTech_API.sBlockCasings11, 4), - Pair.of(GregTech_API.sBlockCasings11, 5), - Pair.of(GregTech_API.sBlockCasings11, 6), - Pair.of(GregTech_API.sBlockCasings11, 7)), - -2, - GT_MetaTileEntity_IndustrialExtractor::setItemPipeTier, - GT_MetaTileEntity_IndustrialExtractor::getItemPipeTier)) - .build(); - - private int itemPipeTier = 0; - - private static Integer getItemPipeTierFromMeta(Block block, Integer metaID) { - if (block != GregTech_API.sBlockCasings11) return -1; - if (metaID < 0 || metaID > 7) return -1; - return metaID + 1; - } - - private void setItemPipeTier(int tier) { - itemPipeTier = tier; - } - - private int getItemPipeTier() { - return itemPipeTier; - } - - public GT_MetaTileEntity_IndustrialExtractor(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_IndustrialExtractor(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_IndustrialExtractor(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 1)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 1)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 1)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Extractor") - .addInfo("Controller Block for the Dissection Apparatus") - .addInfo("200% faster than single block machines of the same voltage") - .addInfo("Only uses 85% of the EU/t normally required") - .addInfo("Gains 8 parallels per tier of Item Pipe Casing") - .addInfo(AuthorFourIsTheNumber) - .addSeparator() - .beginStructureBlock(5, 4, 5, true) - .addController("Front Center") - .addCasingInfoMin("Stainless Steel Machine Casing", 24, false) - .addCasingInfoExactly("Item Pipe Casing", 19, true) - .addInputBus("Any Stainless Steel Casing", 1) - .addOutputBus("Any Stainless Steel Casing", 1) - .addEnergyHatch("Any Stainless Steel Casing", 1) - .addMaintenanceHatch("Any Stainless Steel Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 2, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 2, 0, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - itemPipeTier = -2; - - if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 2, 0)) return false; - return mCasingAmount >= 24; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic().setSpeedBonus(1F / 3F) - .setMaxParallelSupplier(this::getMaxParallelRecipes) - .setEuModifier(0.85F); - } - - public int getMaxParallelRecipes() { - return 8 * itemPipeTier; - } - - @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("maxParallelRecipes", getMaxParallelRecipes()); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - currentTip.add( - StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " - + EnumChatFormatting.WHITE - + tag.getInteger("maxParallelRecipes")); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.extractorRecipes; - } - - @Override - public int getRecipeCatalystPriority() { - return -10; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialLaserEngraver.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialLaserEngraver.java deleted file mode 100644 index 50c55d11a5..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IndustrialLaserEngraver.java +++ /dev/null @@ -1,615 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.GT_HatchElement.*; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.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.BorosilicateGlass; -import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoTunnel; -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.GTVoltageIndex; -import gregtech.api.enums.GT_Values; -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.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -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.api.util.LaserRenderingUtil; -import gregtech.common.blocks.GT_Block_Casings10; -import gregtech.common.tileentities.render.TileLaser; -import gtPlusPlus.core.util.minecraft.PlayerUtils; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_IndustrialLaserEngraver - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - (new String[][] { { " f ", " ", " ", " ", " a~a " }, - { " fsf ", " g ", " g ", "a g a", "aaraa" }, { "faaaf", "f f", "f f", "a a", "aaaaa" }, - { "aaaaa", "a a a", "a a a", "a a a", "aaaaa" }, { "aaaaa", "aaaaa", "aaaaa", "aaaaa", "aaaaa" } })) - .addElement( - 'a', - buildHatchAdder(GT_MetaTileEntity_IndustrialLaserEngraver.class) - .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(1)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_IndustrialLaserEngraver::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 1)))) - .addElement('f', ofFrame(Materials.TungstenSteel)) - .addElement( - 'g', - BorosilicateGlass - .ofBoroGlass((byte) 0, (byte) 1, Byte.MAX_VALUE, (te, t) -> te.glassTier = t, te -> te.glassTier)) - .addElement( - 'r', - LaserRenderingUtil.ofBlockAdder( - GT_MetaTileEntity_IndustrialLaserEngraver::laserRendererAdder, - GregTech_API.sLaserRender, - 0)) - .addElement( - 's', - buildHatchAdder(GT_MetaTileEntity_IndustrialLaserEngraver.class) - .adder(GT_MetaTileEntity_IndustrialLaserEngraver::addLaserSource) - .hatchClass(GT_MetaTileEntity_Hatch_DynamoTunnel.class) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(1)) - .dot(3) - .build()) - .build(); - - protected TileLaser renderer; - private byte glassTier = 0; - private GT_MetaTileEntity_Hatch_DynamoTunnel laserSource = null; - private int laserAmps = 0; - private int laserTier = 0; - private String tierName = "LV"; - - private boolean addLaserSource(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity != null) { - final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoTunnel) { - laserSource = (GT_MetaTileEntity_Hatch_DynamoTunnel) aMetaTileEntity; - laserSource.updateTexture(aBaseCasingIndex); - // Snap the laser source toward the plate. Player can rotate it if they want after but this will look - // nicer - switch (getRotation()) { - case NORMAL -> laserSource.getBaseMetaTileEntity() - .setFrontFacing(ForgeDirection.DOWN); - case UPSIDE_DOWN -> laserSource.getBaseMetaTileEntity() - .setFrontFacing(ForgeDirection.UP); - case CLOCKWISE -> laserSource.getBaseMetaTileEntity() - .setFrontFacing(getDirection().getRotation(ForgeDirection.UP)); - default -> laserSource.getBaseMetaTileEntity() - .setFrontFacing(getDirection().getRotation(ForgeDirection.DOWN)); - } - // Cube root the amperage to get the parallels - laserAmps = (int) Math.cbrt(laserSource.maxAmperesOut()); - laserTier = (int) laserSource.getOutputTier(); - tierName = GT_Values.VN[laserTier]; - return true; - } - } - return false; - } - - private boolean laserRendererAdder(Block block, int meta, World world, int x, int y, int z) { - if (block != GregTech_API.sLaserRender || world == null) { - return false; - } - TileEntity te = world.getTileEntity(x, y, z); - if (te instanceof TileLaser) { - renderer = (TileLaser) te; - renderer.setRotationFields(getDirection(), getRotation(), getFlip()); - return true; - } - return false; - } - - public GT_MetaTileEntity_IndustrialLaserEngraver(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_IndustrialLaserEngraver(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_IndustrialLaserEngraver(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 1)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ENGRAVER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ENGRAVER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 1)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ENGRAVER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ENGRAVER_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 1)) }; - } - return rTexture; - } - - private boolean stopAllRendering = false; - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - stopAllRendering = !stopAllRendering; - if (stopAllRendering) { - PlayerUtils.messagePlayer(aPlayer, "Rendering off"); - if (renderer != null) renderer.setShouldRender(false); - } else PlayerUtils.messagePlayer(aPlayer, "Rendering on"); - } - - @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, StatCollector.translateToLocal("misc.BatchModeTextOn")); - } else { - GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff")); - } - return true; - } else { - if (renderer != null) { - renderer.realism = !renderer.realism; - PlayerUtils.messagePlayer(aPlayer, "Toggling realism!"); - return true; - } - } - return false; - } - - @Override - public void onDisableWorking() { - if (renderer != null) renderer.setShouldRender(false); - super.onDisableWorking(); - } - - @Override - public void onBlockDestroyed() { - if (renderer != null) renderer.setShouldRender(false); - super.onBlockDestroyed(); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Laser Engraver") - .addInfo("Controller Block for the Hyper-Intensity Laser Engraver") - .addInfo("200% faster than single block machines of the same voltage") - .addInfo("Uses 80% of the EU normally required") - .addInfo("Laser source hatch determines maximum recipe tier and parallels") - .addInfo("Parallels equal to the cube root of laser source amperage input") - .addInfo("Glass tier determines maximum laser source tier") - .addInfo("Only accepts borosilicate glass (no, really)") - .addInfo("UMV glass accepts all laser source hatches") - .addInfo("Use screwdriver to disable laser rendering") - .addInfo("Use wire cutter to toggle realism mode if you hate angled lasers") - .addInfo(AuthorFourIsTheNumber) - .addSeparator() - .beginStructureBlock(5, 5, 5, false) - .addController("Front Center") - .addCasingInfoMin("Laser Containment Casing", 45, false) - .addCasingInfoExactly("Tungstensteel Frame Box", 9, false) - .addOtherStructurePart("Laser Resistant Plate", "x1") - .addOtherStructurePart("Borosilicate Glass", "x3") - .addOtherStructurePart("Laser Source Hatch", "x1", 3) - .addInputBus("Any Casing", 1) - .addInputHatch("Any Casing", 1) - .addOutputBus("Any Casing", 1) - .addOutputHatch("Any Casing", 1) - .addEnergyHatch("Any Casing", 1) - .addMaintenanceHatch("Any Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 4, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 4, 0, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - mEnergyHatches.clear(); - - if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 4, 0)) return false; - if (mCasingAmount < 45) return false; - if (laserSource == null) return false; - if (renderer == null) return false; - if (glassTier < GTVoltageIndex.UMV && laserSource.mTier > glassTier) return false; - - return true; - } - - private static String getUniqueIdentifier(ItemStack is) { - return is.getItem() - .getUnlocalizedName() + is.getItemDamage(); - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - if (laserTier < GTVoltageIndex.UXV && recipe.mEUt > GT_Values.V[laserTier]) { - return SimpleCheckRecipeResult.ofFailure("laser_insufficient"); - } - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - @NotNull - @Override - protected CheckRecipeResult onRecipeStart(@NotNull GT_Recipe recipe) { - Colors c = Colors.Red; - for (int i = 0; i < recipe.mInputs.length; i++) { - String uid = getUniqueIdentifier(recipe.mInputs[i]); - if (lensColors.containsKey(uid)) { - c = lensColors.get(uid); - } - } - if (renderer != null) { - renderer.setColors(c.r, c.g, c.b); - if (!stopAllRendering) { - renderer.setShouldRender(true); - } - } - return super.onRecipeStart(recipe); - } - - @Override - public ProcessingLogic clear() { - if (renderer != null) renderer.setShouldRender(false); - return super.clear(); - } - }.setSpeedBonus(1F / 3F) - .setEuModifier(0.8F) - .setMaxParallelSupplier(this::getMaxParallelRecipes); - } - - @Override - public boolean isRotationChangeAllowed() { - return true; - } - - private int getMaxParallelRecipes() { - return laserAmps; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.laserEngraverRecipes; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public int getRecipeCatalystPriority() { - return -10; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setBoolean("stopAllRendering", stopAllRendering); - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - if (aNBT.hasKey("stopAllRendering")) { - stopAllRendering = aNBT.getBoolean("stopAllRendering"); - } - super.loadNBTData(aNBT); - } - - @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("laserAmps", laserAmps); - tag.setString("tierName", tierName); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - currentTip.add( - StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " - + EnumChatFormatting.WHITE - + tag.getInteger("laserAmps") - + EnumChatFormatting.RESET); - currentTip.add( - StatCollector.translateToLocal("GT5U.multiblock.maxtier") + ": " - + EnumChatFormatting.WHITE - + tag.getString("tierName") - + EnumChatFormatting.RESET); - } - - private enum Colors { - - White(1, 1, 1), - Red(1, 0, 0), - Green(0, 1, 0), - Blue(0, 0, 1), - Yellow(1, 1, 0), - Purple(1, 0, 1), - Cyan(0, 1, 1), - Orange(1, 0.5F, 0), - Black(0, 0, 0), - Brown(0.647F, 0.164F, 0.164F); - - final float r, g, b; - - Colors(float r, float g, float b) { - this.r = r; - this.g = g; - this.b = b; - } - } - - private static final Map lensColors; - static { - lensColors = new HashMap<>(); - - // Black lenses - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Forcicium, 1)), Colors.Black); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Forcillium, 1)), - Colors.Black); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedEntropy, 1)), - Colors.Black); - - // White lenses - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.NetherStar, 1)), - Colors.White); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 1)), Colors.White); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Glass, 1)), Colors.White); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1)), Colors.Cyan); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedOrder, 1)), - Colors.White); - - // Green lenses - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Emerald, 1)), Colors.Green); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Olivine, 1)), Colors.Green); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.GreenSapphire, 1)), - Colors.Green); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedEarth, 1)), - Colors.Green); - - // Red lenses - lensColors.put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Ruby, 1)), Colors.Red); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Firestone, 1)), Colors.Red); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Jasper, 1)), Colors.Red); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.FoolsRuby, 1)), Colors.Red); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.GarnetRed, 1)), Colors.Red); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedFire, 1)), Colors.Red); - - // Blue lenses - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.BlueTopaz, 1)), Colors.Blue); - lensColors.put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Opal, 1)), Colors.Blue); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedWater, 1)), - Colors.Blue); - - // Yellow lenses - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.GarnetYellow, 1)), - Colors.Yellow); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Force, 1)), Colors.Yellow); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedAir, 1)), - Colors.Yellow); - - // Purple lenses - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Amethyst, 1)), Colors.Purple); - lensColors.put( - getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Tanzanite, 1)), - Colors.Purple); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Sapphire, 1)), Colors.Purple); - - // Cyan lenses - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.EnderEye, 1)), Colors.Cyan); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.EnderPearl, 1)), Colors.Cyan); - - // Orange lenses - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Topaz, 1)), Colors.Orange); - lensColors - .put(getUniqueIdentifier(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Amber, 1)), Colors.Orange); - - // Time to manually define a bunch of lenses based on id - lensColors.put("gt.bwMetaGeneratedlens1", Colors.Yellow); - lensColors.put("gt.bwMetaGeneratedlens4", Colors.White); - lensColors.put("gt.bwMetaGeneratedlens5", Colors.Black); - lensColors.put("gt.bwMetaGeneratedlens7", Colors.Green); - lensColors.put("gt.bwMetaGeneratedlens8", Colors.Green); - lensColors.put("gt.bwMetaGeneratedlens9", Colors.White); - lensColors.put("gt.bwMetaGeneratedlens19", Colors.Red); - lensColors.put("gt.bwMetaGeneratedlens20", Colors.White); - lensColors.put("gt.bwMetaGeneratedlens21", Colors.Brown); - lensColors.put("gt.bwMetaGeneratedlens22", Colors.Orange); - lensColors.put("gt.bwMetaGeneratedlens23", Colors.Black); - lensColors.put("gt.bwMetaGeneratedlens24", Colors.White); - lensColors.put("gt.bwMetaGeneratedlens25", Colors.Green); - lensColors.put("gt.bwMetaGeneratedlens35", Colors.Yellow); - lensColors.put("gt.bwMetaGeneratedlens36", Colors.Purple); - lensColors.put("gt.bwMetaGeneratedlens43", Colors.Green); - lensColors.put("gt.bwMetaGeneratedlens89", Colors.Green); - lensColors.put("gt.bwMetaGeneratedlens91", Colors.Purple); - lensColors.put("gt.bwMetaGeneratedlens10023", Colors.Red); - lensColors.put("gt.bwMetaGeneratedlens11499", Colors.Green); - lensColors.put("gt.bwMetaGeneratedlens11358", Colors.Red); - lensColors.put("MU-metaitem.0132140", Colors.Purple); - lensColors.put("MU-metaitem.0132140", Colors.Purple); - - // - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java deleted file mode 100644 index 4dd9d6485e..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java +++ /dev/null @@ -1,829 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; -import static gregtech.api.enums.TickTime.SECOND; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Random; -import java.util.stream.Collectors; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.oredict.OreDictionary; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_IntegratedOreFactory - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final int CASING_INDEX1 = 183; - private static final int CASING_INDEX2 = 49; - private static final int MAX_PARA = 1024; - private static final long RECIPE_EUT = 30; - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { - { " ", " ", " WWW ", " WWW ", " ", " " }, - { " ", " sss ", " sppps", " sppps", " sss ", " " }, - { " ", " sss ", " s s", " s s", " sss ", " " }, - { " ", " sss ", " sppps", " sppps", " sss ", " " }, - { " ", " sss ", " s s", " s s", " sss ", " " }, - { " ", " sss ", " sppps", " sppps", " sss ", " " }, - { "iiiiii ", "iIIIIiisssi", "iIIIIis s", "iIIIIis s", "iIIIIiisssi", "iiiiii " }, - { "iggggi ", "gt t isssi", "g xx sppps", "g xx sppps", "gt t isssi", "iggggi " }, - { "iggggi ", "gt t isssi", "g xx s s", "g xx s s", "gt t isssi", "iggggi " }, - { "iggggi ", "gt t is~si", "g xx spppO", "g xx spppO", "gt t isssi", "iggggi " }, - { "iggggi ", "gt t isssi", "g xx s O", "g xx s O", "gt t isssi", "iggggi " }, - { "EEEEEE ", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEE " } })) - .addElement('i', ofBlock(GregTech_API.sBlockCasings8, 7)) - .addElement('s', ofBlock(GregTech_API.sBlockCasings4, 1)) - .addElement('g', Glasses.chainAllGlasses()) - .addElement('x', ofBlock(GregTech_API.sBlockCasings2, 3)) - .addElement('p', ofBlock(GregTech_API.sBlockCasings2, 15)) - .addElement('t', ofFrame(Materials.TungstenSteel)) - .addElement( - 'E', - buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(Energy, Maintenance) - .casingIndex(CASING_INDEX1) - .dot(1) - .buildAndChain(GregTech_API.sBlockCasings8, 7)) - .addElement( - 'I', - buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(InputBus) - .casingIndex(CASING_INDEX1) - .dot(2) - .buildAndChain(GregTech_API.sBlockCasings8, 7)) - .addElement( - 'W', - buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(InputHatch, Muffler) - .casingIndex(CASING_INDEX2) - .dot(3) - .buildAndChain(GregTech_API.sBlockCasings4, 1)) - .addElement( - 'O', - buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(OutputBus, OutputHatch) - .casingIndex(CASING_INDEX2) - .dot(4) - .buildAndChain(GregTech_API.sBlockCasings4, 1)) - .build(); - - private static final HashSet isCrushedOre = new HashSet<>(); - private static final HashSet isCrushedPureOre = new HashSet<>(); - private static final HashSet isPureDust = new HashSet<>(); - private static final HashSet isImpureDust = new HashSet<>(); - private static final HashSet isThermal = new HashSet<>(); - private static final HashSet isOre = new HashSet<>(); - private static boolean isInit = false; - private ItemStack[] sMidProduct; - private int sMode = 0; - private boolean sVoidStone = false; - private int currentParallelism = 0; - - private static void initHash() { - for (String name : OreDictionary.getOreNames()) { - if (name == null || name.isEmpty()) continue; - if (name.startsWith("crushedPurified")) { - for (ItemStack stack : OreDictionary.getOres(name)) { - isCrushedPureOre.add(GT_Utility.stackToInt(stack)); - } - } else if (name.startsWith("crushedCentrifuged")) { - for (ItemStack stack : OreDictionary.getOres(name)) { - isThermal.add(GT_Utility.stackToInt(stack)); - } - } else if (name.startsWith("crushed")) { - for (ItemStack stack : OreDictionary.getOres(name)) { - isCrushedOre.add(GT_Utility.stackToInt(stack)); - } - } else if (name.startsWith("dustImpure")) { - for (ItemStack stack : OreDictionary.getOres(name)) { - isImpureDust.add(GT_Utility.stackToInt(stack)); - } - } else if (name.startsWith("dustPure")) { - for (ItemStack stack : OreDictionary.getOres(name)) { - isPureDust.add(GT_Utility.stackToInt(stack)); - } - } else if (name.startsWith("ore")) { - for (ItemStack stack : OreDictionary.getOres(name)) { - isOre.add(GT_Utility.stackToInt(stack)); - } - } else if (name.startsWith("rawOre")) { - for (ItemStack stack : OreDictionary.getOres(name)) { - isOre.add(GT_Utility.stackToInt(stack)); - } - } - } - } - - public GT_MetaTileEntity_IntegratedOreFactory(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_IntegratedOreFactory(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Ore Processor") - .addInfo("Controller Block for the Integrated Ore Factory") - .addInfo("It is OP. I mean ore processor.") - .addInfo("Do all ore processing in one step.") - .addInfo("Can process up to 1024 ores at a time.") - .addInfo("Every ore costs 30EU/t, 2L lubricant, 200L distilled water.") - .addInfo("Processing time is dependent on mode.") - .addInfo("Use a screwdriver to switch mode.") - .addInfo("Sneak click with screwdriver to void the stone dust.") - .addSeparator() - .beginStructureBlock(6, 12, 11, false) - .addController("The third layer") - .addStructureInfo("128 Advanced Iridium Plated Machine Casing") - .addStructureInfo("105 Clean Stainless Steel Machine Casing") - .addStructureInfo("48 Reinforced Glass") - .addStructureInfo("30 Tungstensteel Pipe Casing") - .addStructureInfo("16 Tungstensteel Frame Box") - .addStructureInfo("16 Steel Gear Box Casing") - .addEnergyHatch("Any bottom Casing", 1) - .addMaintenanceHatch("Any bottom Casing", 1) - .addInputBus("Input ore/crushed ore", 2) - .addInputHatch("Input lubricant/distilled water/washing chemicals", 3) - .addMufflerHatch("Output Pollution", 3) - .addOutputBus("Output products", 4) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped(); - } - - @Override - public void construct(ItemStack itemStack, boolean b) { - buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 8, 9, 1); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 8, 9, 1, elementBudget, env, false, true); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - private static int getTime(int mode) { - return switch (mode) { - case 0 -> 30 * SECOND; - case 1 -> 15 * SECOND; - case 2 -> 10 * SECOND; - case 3 -> 20 * SECOND; - case 4 -> 17 * SECOND; - default -> - // go to hell - 1000000000; - }; - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - if (!isInit) { - initHash(); - isInit = true; - } - - List tInput = getStoredInputs(); - List tInputFluid = getStoredFluids(); - long availableEUt = GT_Utility.roundUpVoltage(getMaxInputVoltage()); - if (availableEUt < RECIPE_EUT) { - return CheckRecipeResultRegistry.insufficientPower(RECIPE_EUT); - } - if (tInput.isEmpty() || tInputFluid.isEmpty()) { - return CheckRecipeResultRegistry.NO_RECIPE; - } - - int maxParallel = MAX_PARA; - int originalMaxParallel = maxParallel; - - GT_OverclockCalculator calculator = new GT_OverclockCalculator().setEUt(availableEUt) - .setRecipeEUt(RECIPE_EUT) - .setDuration(getTime(sMode)) - .setParallel(originalMaxParallel); - - double tickTimeAfterOC = calculator.calculateDurationUnderOneTick(); - - if (tickTimeAfterOC < 1) { - maxParallel = GT_Utility.safeInt((long) (maxParallel / tickTimeAfterOC), 0); - } - - int maxParallelBeforeBatchMode = maxParallel; - if (isBatchModeEnabled()) { - maxParallel = GT_Utility.safeInt((long) maxParallel * getMaxBatchSize(), 0); - } - - int currentParallel = (int) Math.min(maxParallel, availableEUt / RECIPE_EUT); - // Calculate parallel by fluids - int tLube = 0; - int tWater = 0; - for (FluidStack fluid : tInputFluid) { - if (fluid != null && fluid.equals(GT_ModHandler.getDistilledWater(1L))) { - tWater += fluid.amount; - } else if (fluid != null && fluid.equals(Materials.Lubricant.getFluid(1L))) { - tLube += fluid.amount; - } - } - currentParallel = Math.min(currentParallel, tLube / 2); - currentParallel = Math.min(currentParallel, tWater / 200); - if (currentParallel <= 0) { - return CheckRecipeResultRegistry.NO_RECIPE; - } - - // Calculate parallel by items - int itemParallel = 0; - for (ItemStack ore : tInput) { - int tID = GT_Utility.stackToInt(ore); - if (tID == 0) continue; - if (isPureDust.contains(tID) || isImpureDust.contains(tID) - || isCrushedPureOre.contains(tID) - || isThermal.contains(tID) - || isCrushedOre.contains(tID) - || isOre.contains(tID)) { - if (itemParallel + ore.stackSize <= currentParallel) { - itemParallel += ore.stackSize; - } else { - itemParallel = currentParallel; - break; - } - } - } - currentParallel = itemParallel; - int currentParallelBeforeBatchMode = Math.min(currentParallel, maxParallelBeforeBatchMode); - - calculator.setCurrentParallel(currentParallelBeforeBatchMode) - .calculate(); - - double batchMultiplierMax = 1; - // In case batch mode enabled - if (currentParallel > maxParallelBeforeBatchMode && calculator.getDuration() < getMaxBatchSize()) { - batchMultiplierMax = (double) getMaxBatchSize() / calculator.getDuration(); - batchMultiplierMax = Math.min(batchMultiplierMax, (double) currentParallel / maxParallelBeforeBatchMode); - } - - int finalParallel = (int) (batchMultiplierMax * maxParallelBeforeBatchMode); - - // for scanner - setCurrentParallelism(finalParallel); - - // Consume fluids - depleteInput(GT_ModHandler.getDistilledWater(finalParallel * 200L)); - depleteInput(Materials.Lubricant.getFluid(finalParallel * 2L)); - - // Consume items and generate outputs - List tOres = new ArrayList<>(); - int remainingCost = finalParallel; - for (ItemStack ore : tInput) { - int tID = GT_Utility.stackToInt(ore); - if (tID == 0) continue; - if (isPureDust.contains(tID) || isImpureDust.contains(tID) - || isCrushedPureOre.contains(tID) - || isThermal.contains(tID) - || isCrushedOre.contains(tID) - || isOre.contains(tID)) { - if (remainingCost >= ore.stackSize) { - tOres.add(GT_Utility.copy(ore)); - remainingCost -= ore.stackSize; - ore.stackSize = 0; - } else { - tOres.add(GT_Utility.copyAmountUnsafe(remainingCost, ore)); - ore.stackSize -= remainingCost; - break; - } - } - } - sMidProduct = tOres.toArray(new ItemStack[0]); - switch (sMode) { - case 0 -> { - doMac(isOre); - doWash(isCrushedOre); - doThermal(isCrushedPureOre, isCrushedOre); - doMac(isThermal, isOre, isCrushedOre, isCrushedPureOre); - } - case 1 -> { - doMac(isOre); - doWash(isCrushedOre); - doMac(isOre, isCrushedOre, isCrushedPureOre); - doCentrifuge(isImpureDust, isPureDust); - } - case 2 -> { - doMac(isOre); - doMac(isThermal, isOre, isCrushedOre, isCrushedPureOre); - doCentrifuge(isImpureDust, isPureDust); - } - case 3 -> { - doMac(isOre); - doWash(isCrushedOre); - doSift(isCrushedPureOre); - } - case 4 -> { - doMac(isOre); - doChemWash(isCrushedOre, isCrushedPureOre); - doMac(isCrushedOre, isCrushedPureOre); - doCentrifuge(isImpureDust, isPureDust); - } - default -> { - return CheckRecipeResultRegistry.NO_RECIPE; - } - } - - this.mEfficiency = 10000 - (getIdealStatus() - getRepairStatus()) * 1000; - this.mEfficiencyIncrease = 10000; - this.mOutputItems = sMidProduct; - this.mMaxProgresstime = (int) (calculator.getDuration() * batchMultiplierMax); - this.lEUt = calculator.getConsumption(); - if (this.lEUt > 0) { - this.lEUt = -this.lEUt; - } - this.updateSlots(); - - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - @SafeVarargs - private boolean checkTypes(int aID, HashSet... aTables) { - for (HashSet set : aTables) { - if (set.contains(aID)) { - return true; - } - } - return false; - } - - @Override - public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aPlayer.isSneaking()) { - sVoidStone = !sVoidStone; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", sVoidStone)); - return; - } - sMode = (sMode + 1) % 5; - List des = getDisplayMode(sMode); - GT_Utility.sendChatToPlayer(aPlayer, String.join("", des)); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - sMode = aNBT.getInteger("ssMode"); - sVoidStone = aNBT.getBoolean("ssStone"); - currentParallelism = aNBT.getInteger("currentParallelism"); - super.loadNBTData(aNBT); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setInteger("ssMode", sMode); - aNBT.setBoolean("ssStone", sVoidStone); - aNBT.setInteger("currentParallelism", currentParallelism); - super.saveNBTData(aNBT); - } - - @SafeVarargs - private void doMac(HashSet... aTables) { - List tProduct = new ArrayList<>(); - if (sMidProduct != null) { - for (ItemStack aStack : sMidProduct) { - int tID = GT_Utility.stackToInt(aStack); - if (checkTypes(tID, aTables)) { - GT_Recipe tRecipe = RecipeMaps.maceratorRecipes - .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack); - if (tRecipe != null) { - tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); - } else { - tProduct.add(aStack); - } - } else { - tProduct.add(aStack); - } - } - } - doCompress(tProduct); - } - - @SafeVarargs - private void doWash(HashSet... aTables) { - List tProduct = new ArrayList<>(); - if (sMidProduct != null) { - for (ItemStack aStack : sMidProduct) { - int tID = GT_Utility.stackToInt(aStack); - if (checkTypes(tID, aTables)) { - GT_Recipe tRecipe = RecipeMaps.oreWasherRecipes.findRecipe( - getBaseMetaTileEntity(), - false, - GT_Values.V[15], - new FluidStack[] { GT_ModHandler.getDistilledWater(Integer.MAX_VALUE) }, - aStack); - if (tRecipe != null) { - tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); - } else { - tProduct.add(aStack); - } - } else { - tProduct.add(aStack); - } - } - } - doCompress(tProduct); - } - - @SafeVarargs - private void doThermal(HashSet... aTables) { - List tProduct = new ArrayList<>(); - if (sMidProduct != null) { - for (ItemStack aStack : sMidProduct) { - int tID = GT_Utility.stackToInt(aStack); - if (checkTypes(tID, aTables)) { - GT_Recipe tRecipe = RecipeMaps.thermalCentrifugeRecipes - .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack); - if (tRecipe != null) { - tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); - } else { - tProduct.add(aStack); - } - } else { - tProduct.add(aStack); - } - } - } - doCompress(tProduct); - } - - @SafeVarargs - private void doCentrifuge(HashSet... aTables) { - List tProduct = new ArrayList<>(); - if (sMidProduct != null) { - for (ItemStack aStack : sMidProduct) { - int tID = GT_Utility.stackToInt(aStack); - if (checkTypes(tID, aTables)) { - GT_Recipe tRecipe = RecipeMaps.centrifugeRecipes - .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack); - if (tRecipe != null) { - tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); - } else { - tProduct.add(aStack); - } - } else { - tProduct.add(aStack); - } - } - } - doCompress(tProduct); - } - - @SafeVarargs - private void doSift(HashSet... aTables) { - List tProduct = new ArrayList<>(); - if (sMidProduct != null) { - for (ItemStack aStack : sMidProduct) { - int tID = GT_Utility.stackToInt(aStack); - if (checkTypes(tID, aTables)) { - GT_Recipe tRecipe = RecipeMaps.sifterRecipes - .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack); - if (tRecipe != null) { - tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); - } else { - tProduct.add(aStack); - } - } else { - tProduct.add(aStack); - } - } - } - doCompress(tProduct); - } - - @SafeVarargs - private void doChemWash(HashSet... aTables) { - List tProduct = new ArrayList<>(); - if (sMidProduct != null) { - for (ItemStack aStack : sMidProduct) { - int tID = GT_Utility.stackToInt(aStack); - if (checkTypes(tID, aTables)) { - GT_Recipe tRecipe = RecipeMaps.chemicalBathRecipes.findRecipe( - getBaseMetaTileEntity(), - false, - GT_Values.V[15], - getStoredFluids().toArray(new FluidStack[0]), - aStack); - if (tRecipe != null && tRecipe.getRepresentativeFluidInput(0) != null) { - FluidStack tInputFluid = tRecipe.getRepresentativeFluidInput(0) - .copy(); - int tStored = getFluidAmount(tInputFluid); - int tWashed = Math.min(tStored / tInputFluid.amount, aStack.stackSize); - depleteInput(new FluidStack(tInputFluid.getFluid(), tWashed * tInputFluid.amount)); - tProduct.addAll(getOutputStack(tRecipe, tWashed)); - if (tWashed < aStack.stackSize) { - tProduct.add(GT_Utility.copyAmountUnsafe(aStack.stackSize - tWashed, aStack)); - } - } else { - tProduct.add(aStack); - } - } else { - tProduct.add(aStack); - } - } - } - doCompress(tProduct); - } - - private int getFluidAmount(FluidStack aFluid) { - int tAmt = 0; - if (aFluid == null) return 0; - for (FluidStack fluid : getStoredFluids()) { - if (aFluid.isFluidEqual(fluid)) { - tAmt += fluid.amount; - } - } - return tAmt; - } - - private List getOutputStack(GT_Recipe aRecipe, int aTime) { - List tOutput = new ArrayList<>(); - for (int i = 0; i < aRecipe.mOutputs.length; i++) { - if (aRecipe.getOutput(i) == null) { - continue; - } - int tChance = aRecipe.getOutputChance(i); - if (tChance == 10000) { - tOutput.add(GT_Utility.copyAmountUnsafe(aTime * aRecipe.getOutput(i).stackSize, aRecipe.getOutput(i))); - } else { - // Use Normal Distribution - double u = aTime * (tChance / 10000D); - double e = aTime * (tChance / 10000D) * (1 - (tChance / 10000D)); - Random random = new Random(); - int tAmount = (int) Math.ceil(Math.sqrt(e) * random.nextGaussian() + u); - tOutput - .add(GT_Utility.copyAmountUnsafe(tAmount * aRecipe.getOutput(i).stackSize, aRecipe.getOutput(i))); - } - } - return tOutput.stream() - .filter(i -> (i != null && i.stackSize > 0)) - .collect(Collectors.toList()); - } - - private void doCompress(List aList) { - HashMap rProduct = new HashMap<>(); - for (ItemStack stack : aList) { - int tID = GT_Utility.stackToInt(stack); - if (sVoidStone) { - if (GT_Utility.areStacksEqual(Materials.Stone.getDust(1), stack)) { - continue; - } - } - if (tID != 0) { - if (rProduct.containsKey(tID)) { - rProduct.put(tID, rProduct.get(tID) + stack.stackSize); - } else { - rProduct.put(tID, stack.stackSize); - } - } - } - sMidProduct = new ItemStack[rProduct.size()]; - int cnt = 0; - for (Integer id : rProduct.keySet()) { - ItemStack stack = GT_Utility.intToStack(id); - sMidProduct[cnt] = GT_Utility.copyAmountUnsafe(rProduct.get(id), stack); - cnt++; - } - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - return checkPiece(STRUCTURE_PIECE_MAIN, 8, 9, 1) && mMaintenanceHatches.size() <= 1 - && !mMufflerHatches.isEmpty(); - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return 200; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_IntegratedOreFactory(mName); - } - - private void setCurrentParallelism(int parallelism) { - this.currentParallelism = parallelism; - } - - private int getCurrentParallelism() { - return this.currentParallelism; - } - - @Override - public String[] getInfoData() { - List informationData = new ArrayList<>(Arrays.asList(super.getInfoData())); - String parallelism = StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " - + EnumChatFormatting.BLUE - + getCurrentParallelism() - + EnumChatFormatting.RESET; - informationData.add(parallelism); - informationData.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", sVoidStone)); - informationData.addAll(getDisplayMode(sMode)); - return informationData.toArray(new String[0]); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2) }; - } - - private static List getDisplayMode(int mode) { - final EnumChatFormatting AQUA = EnumChatFormatting.AQUA; - final String CRUSH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Macerate"); - final String WASH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Ore_Washer") - .replace(" ", " " + AQUA); - final String THERMAL = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Thermal_Centrifuge") - .replace(" ", " " + AQUA); - final String CENTRIFUGE = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Centrifuge"); - final String SIFTER = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Sifter"); - final String CHEM_WASH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Chemical_Bathing") - .replace(" ", " " + AQUA); - final String ARROW = " " + AQUA + "-> "; - - List des = new ArrayList<>(); - des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor1") + " "); - - switch (mode) { - case 0 -> { - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + WASH + ARROW); - des.add(AQUA + THERMAL + ARROW); - des.add(AQUA + CRUSH + ' '); - } - case 1 -> { - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + WASH + ARROW); - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + CENTRIFUGE + ' '); - } - case 2 -> { - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + CENTRIFUGE + ' '); - } - case 3 -> { - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + WASH + ARROW); - des.add(AQUA + SIFTER + ' '); - } - case 4 -> { - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + CHEM_WASH + ARROW); - des.add(AQUA + CRUSH + ARROW); - des.add(AQUA + CENTRIFUGE + ' '); - } - default -> des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.WRONG_MODE")); - } - - des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor2", getTime(mode) / 20)); - - return des; - - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currenttip, accessor, config); - NBTTagCompound tag = accessor.getNBTData(); - - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " - + EnumChatFormatting.BLUE - + tag.getInteger("currentParallelism") - + EnumChatFormatting.RESET); - currenttip.addAll(getDisplayMode(tag.getInteger("ssMode"))); - currenttip - .add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", tag.getBoolean("ssStone"))); - - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setInteger("ssMode", sMode); - tag.setBoolean("ssStone", sVoidStone); - tag.setInteger("currentParallelism", currentParallelism); - } - - @Override - public boolean supportsBatchMode() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java deleted file mode 100644 index ae740447c8..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java +++ /dev/null @@ -1,504 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.STEAM_PER_WATER; -import static gregtech.api.enums.ItemList.Circuit_Integrated; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_Utility.formatNumbers; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.GT_Mod; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.maps.LargeBoilerFuelBackend; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; - -public abstract class GT_MetaTileEntity_LargeBoiler - extends GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { - - @Override - protected IStructureDefinition computeValue(Class type) { - return StructureDefinition.builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { "ccc", "ccc", "ccc" }, { "ccc", "cPc", "ccc" }, { "ccc", "cPc", "ccc" }, - { "ccc", "cPc", "ccc" }, { "f~f", "fff", "fff" }, })) - .addElement('P', lazy(t -> ofBlock(t.getPipeBlock(), t.getPipeMeta()))) - .addElement( - 'c', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_LargeBoiler.class).atLeast(OutputHatch) - .casingIndex(t.getCasingTextureIndex()) - .dot(2) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_LargeBoiler::onCasingAdded, - ofBlock(t.getCasingBlock(), t.getCasingMeta()))))) - .addElement( - 'f', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_LargeBoiler.class) - .atLeast(Maintenance, InputHatch, InputBus, Muffler) - .casingIndex(t.getFireboxTextureIndex()) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_LargeBoiler::onFireboxAdded, - ofBlock(t.getFireboxBlock(), t.getFireboxMeta()))))) - .build(); - } - }; - private boolean firstRun = true; - private int mSuperEfficencyIncrease = 0; - private int integratedCircuitConfig = 0; // Steam output is reduced by 1000L per config - private int excessWater = 0; // Eliminate rounding errors for water - private int excessFuel = 0; // Eliminate rounding errors for fuels that burn half items - private int excessProjectedEU = 0; // Eliminate rounding errors from throttling the boiler - private int mCasingAmount; - private int mFireboxAmount; - protected int pollutionPerSecond = 1; // placeholder for the child classes - - public GT_MetaTileEntity_LargeBoiler(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeBoiler(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - - tt.addMachineType("Boiler") - .addInfo("Controller block for the Large " + getCasingMaterial() + " Boiler"); - // Tooltip differs between the boilers that output Superheated Steam (Titanium and Tungstensteel) and the ones - // that do not (Bronze and Steel) - if (isSuperheated()) { - tt.addInfo( - "Produces " + formatNumbers((getEUt() * 40) * ((runtimeBoost(20) / (20f)) / superToNormalSteam)) - + "L of Superheated Steam with 1 Coal at " - + formatNumbers((getEUt() * 40L) / superToNormalSteam) - + "L/s") // ? - .addInfo("A programmed circuit in the main block throttles the boiler (-1000L/s per config)") - .addInfo("Only some solid fuels are allowed (check the NEI Large Boiler tab for details)") - .addInfo("If there are any disallowed fuels in the input bus, the boiler won't run!"); - } else { - tt.addInfo( - "Produces " + formatNumbers((getEUt() * 40) * (runtimeBoost(20) / 20f)) - + "L of Steam with 1 Coal at " - + formatNumbers(getEUt() * 40L) - + "L/s") // ? - .addInfo("A programmed circuit in the main block throttles the boiler (-1000L/s per config)") - .addInfo("Solid Fuels with a burn value that is too high or too low will not work"); - } - tt.addInfo( - String.format( - "Diesel fuels have 1/4 efficiency - Takes %s seconds to heat up", - formatNumbers(500.0 / getEfficiencyIncrease()))) // ? check semifluid again - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 5, 3, false) - .addController("Front bottom") - .addCasingInfoRange(getCasingMaterial() + " " + getCasingBlockType() + " Casing", 24, 31, false) // ? - .addOtherStructurePart(getCasingMaterial() + " Fire Boxes", "Bottom layer, 3 minimum") - .addOtherStructurePart(getCasingMaterial() + " Pipe Casing Blocks", "Inner 3 blocks") - .addMaintenanceHatch("Any firebox", 1) - .addMufflerHatch("Any firebox", 1) - .addInputBus("Solid fuel, Any firebox", 1) - .addInputHatch("Liquid fuel, Any firebox", 1) - .addStructureInfo("You can use either, or both") - .addInputHatch("Water, Any firebox", 1) - .addOutputHatch("Steam, any casing", 2) - .toolTipFinisher("Gregtech"); - - return tt; - } - - public abstract String getCasingMaterial(); - - public abstract Block getCasingBlock(); - - public abstract String getCasingBlockType(); - - public abstract byte getCasingMeta(); - - public abstract byte getCasingTextureIndex(); - - public abstract Block getPipeBlock(); - - public abstract byte getPipeMeta(); - - public abstract Block getFireboxBlock(); - - public abstract byte getFireboxMeta(); - - public abstract byte getFireboxTextureIndex(); - - public abstract int getEUt(); - - public abstract int getEfficiencyIncrease(); - - public int getIntegratedCircuitConfig() { - return integratedCircuitConfig; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - // allows for 0 pollution if circuit throttle is too high - return Math.max( - 0, - (int) (pollutionPerSecond - * (1 - GT_Mod.gregtechproxy.mPollutionReleasedByThrottle * getIntegratedCircuitConfig()))); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { BlockIcons.getCasingTextureForId(getCasingTextureIndex()), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_BOILER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { BlockIcons.getCasingTextureForId(getCasingTextureIndex()), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_BOILER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_BOILER_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()) }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - boolean isFuelValid() { - if (!isSuperheated()) return true; - for (ItemStack input : getStoredInputs()) { - if (!LargeBoilerFuelBackend.isAllowedSolidFuel(input) - && !Circuit_Integrated.isStackEqual(input, true, true)) { - // if any item is not in ALLOWED_SOLID_FUELS, operation cannot be allowed because it might still be - // consumed - this.mMaxProgresstime = 0; - this.mEUt = 0; - return false; - } - } - return true; - } - - @Override - public RecipeMap getRecipeMap() { - // Only for visual - return RecipeMaps.largeBoilerFakeFuels; - } - - @Override - protected boolean filtersFluid() { - return false; - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - if (!isFuelValid()) return CheckRecipeResultRegistry.NO_FUEL_FOUND; - // Do we have an integrated circuit with a valid configuration? - if (Circuit_Integrated.isStackEqual(mInventory[1], true, true)) { - int circuit_config = mInventory[1].getItemDamage(); - if (circuit_config >= 1 && circuit_config <= 25) { - // If so, overwrite the current config - this.integratedCircuitConfig = circuit_config; - } - } else { - // If not, set the config to zero - this.integratedCircuitConfig = 0; - } - - this.mSuperEfficencyIncrease = 0; - if (!isSuperheated()) { - for (GT_Recipe tRecipe : RecipeMaps.dieselFuels.getAllRecipes()) { - FluidStack tFluid = GT_Utility.getFluidForFilledItem(tRecipe.getRepresentativeInput(0), true); - if (tFluid != null && tRecipe.mSpecialValue > 1) { - tFluid.amount = 1000; - if (depleteInput(tFluid)) { - this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(tRecipe.mSpecialValue / 2)); - this.mEUt = adjustEUtForConfig(getEUt()); - this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease() * 4; - return CheckRecipeResultRegistry.SUCCESSFUL; - } - } - } - for (GT_Recipe tRecipe : RecipeMaps.denseLiquidFuels.getAllRecipes()) { - FluidStack tFluid = GT_Utility.getFluidForFilledItem(tRecipe.getRepresentativeInput(0), true); - if (tFluid != null) { - tFluid.amount = 1000; - if (depleteInput(tFluid)) { - this.mMaxProgresstime = adjustBurnTimeForConfig( - Math.max(1, runtimeBoost(tRecipe.mSpecialValue * 2))); - this.mEUt = adjustEUtForConfig(getEUt()); - this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease(); - return CheckRecipeResultRegistry.SUCCESSFUL; - } - } - } - } - - ArrayList tInputList = getStoredInputs(); - if (!tInputList.isEmpty()) { - if (isSuperheated()) { - for (ItemStack tInput : tInputList) { - if (tInput != GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Lava, 1)) { - if (GT_Utility.getFluidForFilledItem(tInput, true) == null - && (this.mMaxProgresstime = GT_ModHandler.getFuelValue(tInput) / 80) > 0) { - this.excessFuel += GT_ModHandler.getFuelValue(tInput) % 80; - this.mMaxProgresstime += this.excessFuel / 80; - this.excessFuel %= 80; - this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(this.mMaxProgresstime)); - this.mEUt = adjustEUtForConfig(getEUt()); - this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease(); - this.mOutputItems = new ItemStack[] { GT_Utility.getContainerItem(tInput, true) }; - tInput.stackSize -= 1; - updateSlots(); - if (this.mEfficiencyIncrease > 5000) { - this.mEfficiencyIncrease = 0; - this.mSuperEfficencyIncrease = 20; - } - return CheckRecipeResultRegistry.SUCCESSFUL; - } - } - } - } else { - for (ItemStack tInput : tInputList) { - if (tInput != GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Lava, 1)) { - // Solid fuels with burn values below getEUt are ignored (mostly items like sticks), and also - // those with very high fuel values that would cause an overflow error. - if (GT_Utility.getFluidForFilledItem(tInput, true) == null - && (this.mMaxProgresstime = GT_ModHandler.getFuelValue(tInput) / 80) > 0 - && (GT_ModHandler.getFuelValue(tInput) * 2 / this.getEUt()) > 1 - && GT_ModHandler.getFuelValue(tInput) < 100000000) { - this.excessFuel += GT_ModHandler.getFuelValue(tInput) % 80; - this.mMaxProgresstime += this.excessFuel / 80; - this.excessFuel %= 80; - this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(this.mMaxProgresstime)); - this.mEUt = adjustEUtForConfig(getEUt()); - this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease(); - this.mOutputItems = new ItemStack[] { GT_Utility.getContainerItem(tInput, true) }; - tInput.stackSize -= 1; - updateSlots(); - if (this.mEfficiencyIncrease > 5000) { - this.mEfficiencyIncrease = 0; - this.mSuperEfficencyIncrease = 20; - } - return CheckRecipeResultRegistry.SUCCESSFUL; - } - } - } - } - } - this.mMaxProgresstime = 0; - this.mEUt = 0; - return CheckRecipeResultRegistry.NO_FUEL_FOUND; - } - - abstract int runtimeBoost(int mTime); - - abstract boolean isSuperheated(); - - private final int superToNormalSteam = 3; - - @Override - public boolean onRunningTick(ItemStack aStack) { - if (this.mEUt > 0) { - if (this.mSuperEfficencyIncrease > 0) mEfficiency = Math.max( - 0, - Math.min( - mEfficiency + mSuperEfficencyIncrease, - getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000))); - int tGeneratedEU = (int) (this.mEUt * 2L * this.mEfficiency / 10000L); - if (tGeneratedEU > 0) { - long amount = (tGeneratedEU + STEAM_PER_WATER) / STEAM_PER_WATER; - excessWater += amount * STEAM_PER_WATER - tGeneratedEU; - amount -= excessWater / STEAM_PER_WATER; - excessWater %= STEAM_PER_WATER; - startRecipeProcessing(); - if (isSuperheated()) { - // Consumes only one third of the water if producing Superheated Steam, to maintain water in the - // chain. - if (depleteInput(Materials.Water.getFluid(amount / superToNormalSteam)) - || depleteInput(GT_ModHandler.getDistilledWater(amount / superToNormalSteam))) { - // Outputs Superheated Steam instead of Steam, at one third of the amount (equivalent in power - // output to the normal Steam amount). - addOutput( - FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU / superToNormalSteam)); - } else { - GT_Log.exp.println("Boiler " + this.mName + " had no Water!"); - explodeMultiblock(); - } - } else { - if (depleteInput(Materials.Water.getFluid(amount)) - || depleteInput(GT_ModHandler.getDistilledWater(amount))) { - addOutput(GT_ModHandler.getSteam(tGeneratedEU)); - } else { - GT_Log.exp.println("Boiler " + this.mName + " had no Water!"); - explodeMultiblock(); - } - } - endRecipeProcessing(); - } - return true; - } - return true; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("excessFuel", excessFuel); - aNBT.setInteger("excessWater", excessWater); - aNBT.setInteger("excessProjectedEU", excessProjectedEU); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - excessFuel = aNBT.getInteger("excessFuel"); - excessWater = aNBT.getInteger("excessWater"); - excessProjectedEU = aNBT.getInteger("excessProjectedEU"); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (mProgresstime > 0 && firstRun) { - firstRun = false; - GT_Mod.achievements.issueAchievement( - aBaseMetaTileEntity.getWorld() - .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), - "extremepressure"); - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION.get(getClass()); - } - - private void onCasingAdded() { - mCasingAmount++; - } - - private void onFireboxAdded() { - mFireboxAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - mFireboxAmount = 0; - return checkPiece(STRUCTURE_PIECE_MAIN, 1, 4, 0) && mCasingAmount >= 24 - && mFireboxAmount >= 3 - && mMaintenanceHatches.size() == 1 - && !mMufflerHatches.isEmpty(); - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - private int adjustEUtForConfig(int rawEUt) { - int adjustedSteamOutput = rawEUt - (isSuperheated() ? 75 : 25) * integratedCircuitConfig; - return Math.max(adjustedSteamOutput, 25); - } - - private int adjustBurnTimeForConfig(int rawBurnTime) { - if (mEfficiency < getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000)) { - return rawBurnTime; - } - int adjustedEUt = Math.max(25, getEUt() - (isSuperheated() ? 75 : 25) * integratedCircuitConfig); - int adjustedBurnTime = rawBurnTime * getEUt() / adjustedEUt; - this.excessProjectedEU += getEUt() * rawBurnTime - adjustedEUt * adjustedBurnTime; - adjustedBurnTime += this.excessProjectedEU / adjustedEUt; - this.excessProjectedEU %= adjustedEUt; - return adjustedBurnTime; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 4, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 4, 0, elementBudget, env, false, true); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java deleted file mode 100644 index 2effcf7966..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java +++ /dev/null @@ -1,96 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import net.minecraft.block.Block; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public class GT_MetaTileEntity_LargeBoiler_Bronze extends GT_MetaTileEntity_LargeBoiler { - - public GT_MetaTileEntity_LargeBoiler_Bronze(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond; - } - - public GT_MetaTileEntity_LargeBoiler_Bronze(String aName) { - super(aName); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeBoiler_Bronze(this.mName); - } - - @Override - public String getCasingMaterial() { - return "Bronze"; - } - - @Override - public String getCasingBlockType() { - return "Plated Bricks"; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings1; - } - - @Override - public byte getCasingMeta() { - return 10; - } - - @Override - public byte getCasingTextureIndex() { - return 10; - } - - @Override - public Block getPipeBlock() { - return GregTech_API.sBlockCasings2; - } - - @Override - public byte getPipeMeta() { - return 12; - } - - @Override - public Block getFireboxBlock() { - return GregTech_API.sBlockCasings3; - } - - @Override - public byte getFireboxMeta() { - return 13; - } - - @Override - public byte getFireboxTextureIndex() { - return 45; - } - - @Override - public int getEUt() { - return 400; - } - - @Override - public int getEfficiencyIncrease() { - return 16; - } - - @Override - int runtimeBoost(int mTime) { - return mTime * 2; - } - - @Override - boolean isSuperheated() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java deleted file mode 100644 index c7bd766945..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java +++ /dev/null @@ -1,96 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import net.minecraft.block.Block; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public class GT_MetaTileEntity_LargeBoiler_Steel extends GT_MetaTileEntity_LargeBoiler { - - public GT_MetaTileEntity_LargeBoiler_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond; - } - - public GT_MetaTileEntity_LargeBoiler_Steel(String aName) { - super(aName); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeBoiler_Steel(this.mName); - } - - @Override - public String getCasingMaterial() { - return "Steel"; - } - - @Override - public String getCasingBlockType() { - return "Machine Casings"; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings2; - } - - @Override - public byte getCasingMeta() { - return 0; - } - - @Override - public byte getCasingTextureIndex() { - return 16; - } - - @Override - public Block getPipeBlock() { - return GregTech_API.sBlockCasings2; - } - - @Override - public byte getPipeMeta() { - return 13; - } - - @Override - public Block getFireboxBlock() { - return GregTech_API.sBlockCasings3; - } - - @Override - public byte getFireboxMeta() { - return 14; - } - - @Override - public byte getFireboxTextureIndex() { - return 46; - } - - @Override - public int getEUt() { - return 1000; - } - - @Override - public int getEfficiencyIncrease() { - return 12; - } - - @Override - int runtimeBoost(int mTime) { - return mTime; - } - - @Override - boolean isSuperheated() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java deleted file mode 100644 index 61f2756622..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java +++ /dev/null @@ -1,96 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import net.minecraft.block.Block; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public class GT_MetaTileEntity_LargeBoiler_Titanium extends GT_MetaTileEntity_LargeBoiler { - - public GT_MetaTileEntity_LargeBoiler_Titanium(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond; - } - - public GT_MetaTileEntity_LargeBoiler_Titanium(String aName) { - super(aName); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeBoiler_Titanium(this.mName); - } - - @Override - public String getCasingMaterial() { - return "Titanium"; - } - - @Override - public String getCasingBlockType() { - return "Machine Casings"; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getCasingMeta() { - return 2; - } - - @Override - public byte getCasingTextureIndex() { - return 50; - } - - @Override - public Block getPipeBlock() { - return GregTech_API.sBlockCasings2; - } - - @Override - public byte getPipeMeta() { - return 14; - } - - @Override - public Block getFireboxBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getFireboxMeta() { - return 3; - } - - @Override - public byte getFireboxTextureIndex() { - return 51; - } - - @Override - public int getEUt() { - return 4000; - } - - @Override - public int getEfficiencyIncrease() { - return 8; - } - - @Override - int runtimeBoost(int mTime) { - return mTime * 130 / 400; - } - - @Override - boolean isSuperheated() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java deleted file mode 100644 index f00ea287b2..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java +++ /dev/null @@ -1,96 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import net.minecraft.block.Block; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - -public class GT_MetaTileEntity_LargeBoiler_TungstenSteel extends GT_MetaTileEntity_LargeBoiler { - - public GT_MetaTileEntity_LargeBoiler_TungstenSteel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond; - } - - public GT_MetaTileEntity_LargeBoiler_TungstenSteel(String aName) { - super(aName); - pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeBoiler_TungstenSteel(this.mName); - } - - @Override - public String getCasingMaterial() { - return "TungstenSteel"; - } - - @Override - public String getCasingBlockType() { - return "Machine Casings"; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getCasingMeta() { - return 0; - } - - @Override - public byte getCasingTextureIndex() { - return 48; - } - - @Override - public Block getPipeBlock() { - return GregTech_API.sBlockCasings2; - } - - @Override - public byte getPipeMeta() { - return 15; - } - - @Override - public Block getFireboxBlock() { - return GregTech_API.sBlockCasings3; - } - - @Override - public byte getFireboxMeta() { - return 15; - } - - @Override - public byte getFireboxTextureIndex() { - return 47; - } - - @Override - public int getEUt() { - return 16000; - } - - @Override - public int getEfficiencyIncrease() { - return 4; - } - - @Override - int runtimeBoost(int mTime) { - return mTime * 120 / 750; - } - - @Override - boolean isSuperheated() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java deleted file mode 100644 index 8e4b5ec650..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java +++ /dev/null @@ -1,298 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment; -import com.gtnewhorizon.structurelib.structure.IItemSource; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.IStructureElement; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizon.structurelib.structure.StructureUtility; -import com.gtnewhorizon.structurelib.util.ItemStackPredicate; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.interfaces.IHeatingCoil; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_LargeChemicalReactor extends - GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - private static final int CASING_INDEX = 176; - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose(new String[][] { { "ccc", "cxc", "ccc" }, { "c~c", "xPx", "cxc" }, { "ccc", "cxc", "ccc" }, })) - .addElement('P', ofBlock(GregTech_API.sBlockCasings8, 1)) - .addElement( - 'c', - buildHatchAdder(GT_MetaTileEntity_LargeChemicalReactor.class) - .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy) - .casingIndex(CASING_INDEX) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_LargeChemicalReactor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings8, 0)))) - .addElement( - 'x', - buildHatchAdder(GT_MetaTileEntity_LargeChemicalReactor.class) - .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy) - .casingIndex(CASING_INDEX) - .dot(1) - .buildAndChain( - CoilStructureElement.INSTANCE, - onElementPass( - GT_MetaTileEntity_LargeChemicalReactor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings8, 0)))) - .build(); - - private int mCasingAmount; - private int mCoilAmount; - - public GT_MetaTileEntity_LargeChemicalReactor(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeChemicalReactor(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeChemicalReactor(this.mName); - } - - @Override - public GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Chemical Reactor") - .addInfo("Controller block for the Large Chemical Reactor") - .addInfo("Does not lose efficiency when overclocked") - .addInfo("Accepts fluids instead of fluid cells") - .addSeparator() - .beginStructureBlock(3, 3, 3, false) - .addController("Front center") - .addCasingInfoRange("Chemically Inert Machine Casing", 8, 22, false) - .addOtherStructurePart("PTFE Pipe Machine Casing", "Center") - .addOtherStructurePart("Heating Coil", "Adjacent to the PTFE Pipe Machine Casing", 1) - .addEnergyHatch("Any casing", 1, 2) - .addMaintenanceHatch("Any casing", 1, 2) - .addInputBus("Any casing", 1, 2) - .addInputHatch("Any casing", 1, 2) - .addOutputBus("Any casing", 1, 2) - .addOutputHatch("Any casing", 1, 2) - .addStructureInfo("You can have multiple hatches/busses") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { casingTexturePages[1][48], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[1][48], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { casingTexturePages[1][48] }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.multiblockChemicalReactorRecipes; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic().enablePerfectOverclock(); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - mCoilAmount = 0; - return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= 8 - && mCoilAmount == 1 - && !mEnergyHatches.isEmpty() - && mMaintenanceHatches.size() == 1; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - mCoilAmount = 0; - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 1, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - mCoilAmount = 0; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - private enum CoilStructureElement implements IStructureElement { - - INSTANCE; - - @Override - public boolean check(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - if (block instanceof IHeatingCoil - && ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)) != HeatingCoilLevel.None) { - return t.mCoilAmount++ == 0; - } else { - return false; - } - } - - @Override - public boolean spawnHint(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, int z, - ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, GregTech_API.sBlockCasings5, 0); - return true; - } - - @Override - public boolean placeBlock(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, int z, - ItemStack trigger) { - if (t.mCoilAmount > 0) return false; - boolean b = world.setBlock(x, y, z, GregTech_API.sBlockCasings5, 0, 3); - if (b) t.mCoilAmount++; - return b; - } - - @Override - public PlaceResult survivalPlaceBlock(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, - int z, ItemStack trigger, IItemSource s, EntityPlayerMP actor, Consumer chatter) { - return survivalPlaceBlock(t, world, x, y, z, trigger, AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); - } - - @Override - public BlocksToPlace getBlocksToPlace( - GT_MetaTileEntity_LargeChemicalReactor gt_metaTileEntity_largeChemicalReactor, World world, int x, int y, - int z, ItemStack trigger, AutoPlaceEnvironment env) { - return BlocksToPlace.create( - IntStream.range(0, 8) - .mapToObj(i -> new ItemStack(GregTech_API.sBlockCasings5, 1, i)) - .collect(Collectors.toList())); - } - - @Override - public PlaceResult survivalPlaceBlock(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, - int z, ItemStack trigger, AutoPlaceEnvironment env) { - if (t.mCoilAmount > 0) return PlaceResult.SKIP; - if (check(t, world, x, y, z)) return PlaceResult.SKIP; - if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return PlaceResult.REJECT; - ItemStack result = env.getSource() - .takeOne(ItemStackPredicate.from(GregTech_API.sBlockCasings5), true); - if (result == null) return PlaceResult.REJECT; - PlaceResult ret = StructureUtility.survivalPlaceBlock( - result, - ItemStackPredicate.NBTMode.EXACT, - null, - true, - world, - x, - y, - z, - env.getSource(), - env.getActor(), - env.getChatter()); - if (ret == PlaceResult.ACCEPT) t.mCoilAmount++; - return ret; - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeFluidExtractor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeFluidExtractor.java deleted file mode 100644 index c1a5bc3458..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeFluidExtractor.java +++ /dev/null @@ -1,419 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.github.bartimaeusnek.bartworks.util.BW_Util.ofGlassTiered; -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 com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel; -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.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofCoil; -import static gregtech.api.util.GT_StructureUtility.ofFrame; -import static gregtech.api.util.GT_StructureUtility.ofSolenoidCoil; -import static net.minecraft.util.EnumChatFormatting.RESET; -import static net.minecraft.util.EnumChatFormatting.YELLOW; - -import java.util.ArrayList; -import java.util.Arrays; - -import javax.annotation.Nullable; - -import net.minecraft.item.ItemStack; -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 com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -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_ExtendedPowerMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; - -public class GT_MetaTileEntity_LargeFluidExtractor - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final int CASING_INDEX = 48; // Robust Tungstensteel Machine Casing - private static final int BASE_CASING_COUNT = 24 + 24 + 9; - private static final int MAX_HATCHES_ALLOWED = 16; - - private static final double BASE_SPEED_BONUS = 1.5; - private static final double BASE_EU_MULTIPLIER = 0.8; - - private static final double SPEED_PER_COIL = 0.1; - private static final int PARALLELS_PER_SOLENOID = 8; - private static final double HEATING_COIL_EU_MULTIPLIER = 0.9; - - // spotless:off - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { - {" ", " ccc ", " ccc ", " ccc ", " "}, - {" ", " f f ", " s ", " f f ", " "}, - {" ", " f f ", " s ", " f f ", " "}, - {" ", " f f ", " s ", " f f ", " "}, - {"ccccc", "ccccc", "ccscc", "ccccc", "ccccc"}, - {"fgggf", "ghhhg", "ghshg", "ghhhg", "fgggf"}, - {"fgggf", "ghhhg", "ghshg", "ghhhg", "fgggf"}, - {"fgggf", "ghhhg", "ghshg", "ghhhg", "fgggf"}, - {"cc~cc", "ccccc", "ccccc", "ccccc", "ccccc"}, - })) - .addElement('c', - buildHatchAdder(GT_MetaTileEntity_LargeFluidExtractor.class) - .atLeast(InputBus, OutputBus, OutputHatch, Energy, Maintenance) - .casingIndex(CASING_INDEX) // Robust Tungstensteel Machine Casing - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_LargeFluidExtractor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings4, 0))) // Robust Tungstensteel Machine Casing - ) - .addElement( - 'g', - withChannel( - "glass", - ofGlassTiered( - (byte) 1, (byte) 127, (byte) 0, - GT_MetaTileEntity_LargeFluidExtractor::setGlassTier, - GT_MetaTileEntity_LargeFluidExtractor::getGlassTier, - 2)) - ) - .addElement( - 'h', - withChannel( - "coil", - ofCoil( - GT_MetaTileEntity_LargeFluidExtractor::setCoilLevel, - GT_MetaTileEntity_LargeFluidExtractor::getCoilLevel)) - ) - .addElement( - 's', - withChannel( - "solenoid", - ofSolenoidCoil( - GT_MetaTileEntity_LargeFluidExtractor::setSolenoidLevel, - GT_MetaTileEntity_LargeFluidExtractor::getSolenoidLevel)) - ) - .addElement( - 'f', - ofFrame(Materials.BlackSteel) - ) - .build(); - // spotless:on - - private byte mGlassTier = 0; - @Nullable - private HeatingCoilLevel mCoilLevel = null; - @Nullable - private Byte mSolenoidLevel = null; - private int mCasingAmount; - private boolean mStructureBadGlassTier = false, mStructureBadCasingCount = false; - - public GT_MetaTileEntity_LargeFluidExtractor(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeFluidExtractor(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public void clearHatches() { - super.clearHatches(); - - mCasingAmount = 0; - mStructureBadGlassTier = false; - mStructureBadCasingCount = false; - mGlassTier = 0; - mCoilLevel = null; - mSolenoidLevel = null; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 8, 0)) { - return false; - } - - if (mCasingAmount < (BASE_CASING_COUNT - MAX_HATCHES_ALLOWED)) { - mStructureBadCasingCount = true; - } - - for (var energyHatch : mEnergyHatches) { - if (energyHatch.getBaseMetaTileEntity() == null) { - continue; - } - - if (mGlassTier < 10 && energyHatch.getTierForStructure() > mGlassTier) { - mStructureBadGlassTier = true; - } - } - - return !mStructureBadGlassTier && !mStructureBadCasingCount; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 8, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 8, 0, elementBudget, env, false, true); - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic(); - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - super.setProcessingLogicPower(logic); - logic.setAvailableAmperage(mEnergyHatches.size()); - logic.setEuModifier((float) (getEUMultiplier())); - logic.setMaxParallel(getParallels()); - logic.setSpeedBonus(1.0f / (float) (getSpeedBonus())); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeFluidExtractor(this.mName); - } - - private void onCasingAdded() { - mCasingAmount++; - } - - private byte getGlassTier() { - return mGlassTier; - } - - private void setGlassTier(byte tier) { - mGlassTier = tier; - } - - private HeatingCoilLevel getCoilLevel() { - return mCoilLevel; - } - - private void setCoilLevel(HeatingCoilLevel level) { - mCoilLevel = level; - } - - private Byte getSolenoidLevel() { - return mSolenoidLevel; - } - - private void setSolenoidLevel(byte level) { - mSolenoidLevel = level; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean active, boolean redstoneLevel) { - if (side == facing) { - if (active) { - return new ITexture[] { getCasingTextureForId(CASING_INDEX), TextureFactory.builder() - .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active) - .extFacing() - .build() }; - } else { - return new ITexture[] { getCasingTextureForId(CASING_INDEX), TextureFactory.builder() - .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced) - .extFacing() - .build() }; - } - } - return new ITexture[] { getCasingTextureForId(CASING_INDEX) }; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - - // spotless:off - tt.addMachineType("Fluid Extractor") - .addInfo("Controller block for the Large Fluid Extractor") - .addInfo(String.format( - "%d%% faster than single block machines of the same voltage", - (int) Math.round((BASE_SPEED_BONUS - 1) * 100) - )) - .addInfo(String.format( - "Only uses %d%% of the EU/t normally required", - (int) Math.round(BASE_EU_MULTIPLIER * 100) - )) - .addInfo(String.format( - "Every coil tier gives a +%d%% speed bonus and a %d%% EU/t discount (multiplicative)", - (int) Math.round(SPEED_PER_COIL * 100), - (int) Math.round((1 - HEATING_COIL_EU_MULTIPLIER) * 100) - )) - .addInfo(String.format( - "Every solenoid tier gives +%d parallels", - (int) PARALLELS_PER_SOLENOID - )) - .addInfo(String.format( - "The EU multiplier is %s%.2f * (%.2f ^ Heating Coil Tier)%s, prior to overclocks", - EnumChatFormatting.ITALIC, - BASE_EU_MULTIPLIER, - HEATING_COIL_EU_MULTIPLIER, - EnumChatFormatting.GRAY - )) - .addInfo("The energy hatch tier is limited by the glass tier. UEV glass unlocks all tiers.") - .addSeparator() - .beginStructureBlock(5, 9, 5, false) - .addController("Front Center (Bottom Layer)") - .addCasingInfoMin("Robust Tungstensteel Machine Casing", BASE_CASING_COUNT - MAX_HATCHES_ALLOWED, false) - .addCasingInfoExactly("Borosilicate Glass (any)", 9 * 4, true) - .addCasingInfoExactly("Solenoid Superconducting Coil (any)", 7, true) - .addCasingInfoExactly("Heating Coils (any)", 8 * 3, true) - .addCasingInfoExactly("Black Steel Frame Box", 3 * 8, false) - .addInputBus("Any Robust Tungstensteel Machine Casing", 1) - .addOutputBus("Any Robust Tungstensteel Machine Casing", 1) - .addOutputHatch("Any Robust Tungstensteel Machine Casing", 1) - .addEnergyHatch("Any Robust Tungstensteel Machine Casing", 1) - .addMaintenanceHatch("Any Robust Tungstensteel Machine Casing", 1) - .toolTipFinisher("GregTech"); - // spotless:on - - return tt; - } - - @Override - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - super.drawTexts(screenElements, inventorySlot); - - screenElements.widgets(TextWidget.dynamicString(() -> { - if (mStructureBadCasingCount) { - return String.format( - "%sNot enough casings: need %d, but\nhave %d.%s", - EnumChatFormatting.DARK_RED, - BASE_CASING_COUNT - MAX_HATCHES_ALLOWED, - mCasingAmount, - RESET); - } - - if (mStructureBadGlassTier) { - int hatchTier = 0; - - for (var hatch : mEnergyHatches) { - if (hatch.mTier > hatchTier) hatchTier = hatch.mTier; - } - - return String.format( - "%sEnergy hatch tier (%s) is too high\nfor the glass tier (%s).%s", - EnumChatFormatting.DARK_RED, - VN[hatchTier], - VN[mGlassTier], - RESET); - } - - return ""; - }) - .setTextAlignment(Alignment.CenterLeft)); - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10_000; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.fluidExtractionRecipes; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - public String[] getInfoData() { - var data = new ArrayList(); - - data.addAll(Arrays.asList(super.getInfoData())); - - data.add(String.format("Max Parallels: %s%d%s", YELLOW, getParallels(), RESET)); - data.add(String.format("Heating Coil Speed Bonus: +%s%.0f%s %%", YELLOW, getCoilSpeedBonus() * 100, RESET)); - data.add(String.format("Total Speed Multiplier: %s%.0f%s %%", YELLOW, getSpeedBonus() * 100, RESET)); - data.add(String.format("Total EU/t Multiplier: %s%.0f%s %%", YELLOW, getEUMultiplier() * 100, RESET)); - - return data.toArray(new String[data.size()]); - } - - public int getParallels() { - return Math.max(1, mSolenoidLevel == null ? 0 : (PARALLELS_PER_SOLENOID * mSolenoidLevel)); - } - - public float getCoilSpeedBonus() { - return (float) ((mCoilLevel == null ? 0 : SPEED_PER_COIL * mCoilLevel.getTier())); - } - - public float getSpeedBonus() { - return (float) (BASE_SPEED_BONUS + getCoilSpeedBonus()); - } - - public float getEUMultiplier() { - double heatingBonus = (mCoilLevel == null ? 0 : Math.pow(HEATING_COIL_EU_MULTIPLIER, mCoilLevel.getTier())); - - return (float) (BASE_EU_MULTIPLIER * heatingBonus); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java deleted file mode 100644 index 54ad5939f8..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java +++ /dev/null @@ -1,492 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Dynamo; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW; -import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW_EMPTY; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; -import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.enums.Dyes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.LightingHelper; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.items.GT_MetaGenerated_Tool_01; -import gregtech.common.render.GT_RenderUtil; - -public abstract class GT_MetaTileEntity_LargeTurbine - extends GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { - - @Override - protected IStructureDefinition computeValue(Class type) { - return StructureDefinition.builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { " ", " ", " ", " ", " ", }, - { " --- ", " ccc ", " hhh ", " hhh ", " hhh ", }, - { " --- ", " c~c ", " h-h ", " h-h ", " hdh ", }, - { " --- ", " ccc ", " hhh ", " hhh ", " hhh ", }, - { " ", " ", " ", " ", " ", }, })) - .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta()))) - .addElement('d', lazy(t -> Dynamo.newAny(t.getCasingTextureIndex(), 1))) - .addElement( - 'h', - lazy( - t -> buildHatchAdder(GT_MetaTileEntity_LargeTurbine.class) - .atLeast(Maintenance, InputHatch, OutputHatch, OutputBus, InputBus, Muffler) - .casingIndex(t.getCasingTextureIndex()) - .dot(2) - .buildAndChain(t.getCasingBlock(), t.getCasingMeta()))) - .build(); - } - }; - - protected int baseEff = 0; - protected int optFlow = 0; - protected double realOptFlow = 0; - protected int storedFluid = 0; - protected int counter = 0; - protected boolean looseFit = false; - protected int overflowMultiplier = 0; - protected final float[] flowMultipliers = new float[] { 1, 1, 1 }; - - // client side stuff - protected boolean mHasTurbine; - // mMachine got overwritten by StructureLib extended facing query response - // so we use a separate field for this - protected boolean mFormed; - - public GT_MetaTileEntity_LargeTurbine(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeTurbine(String aName) { - super(aName); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return getMaxEfficiency(aStack) > 0; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION.get(getClass()); - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - return (d, r, f) -> r.isNotRotated() && f.isNotFlipped(); - } - - @Override - protected ExtendedFacing getCorrectedAlignment(ExtendedFacing aOldFacing) { - return aOldFacing.with(Flip.NONE) - .with(Rotation.NORMAL); - } - - @Override - public boolean isFlipChangeAllowed() { - return false; - } - - @Override - public boolean isRotationChangeAllowed() { - return false; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - return checkPiece(STRUCTURE_PIECE_MAIN, 2, 2, 1) && mMaintenanceHatches.size() == 1 - && mMufflerHatches.isEmpty() == (getPollutionPerTick(null) == 0); - } - - public abstract Block getCasingBlock(); - - public abstract byte getCasingMeta(); - - public abstract int getCasingTextureIndex(); - - public boolean isNewStyleRendering() { - return false; - } - - public IIconContainer[] getTurbineTextureActive() { - return TURBINE_NEW_ACTIVE; - } - - public IIconContainer[] getTurbineTextureFull() { - return TURBINE_NEW; - } - - public IIconContainer[] getTurbineTextureEmpty() { - return TURBINE_NEW_EMPTY; - } - - @Override - public boolean renderInWorld(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer) { - if (!isNewStyleRendering() || !mFormed) return false; - int[] tABCCoord = new int[] { -1, -1, 0 }; - int[] tXYZOffset = new int[3]; - final ForgeDirection tFacing = getBaseMetaTileEntity().getFrontFacing(); - final ExtendedFacing tExtendedFacing = getExtendedFacing(); - final ForgeDirection tDirection = tExtendedFacing.getDirection(); - final LightingHelper tLighting = new LightingHelper(aRenderer); - - // for some reason +x and -z need this field set to true, but not any other sides - if (tFacing == ForgeDirection.NORTH || tFacing == ForgeDirection.EAST) aRenderer.field_152631_f = true; - final Block tBlock = getCasingBlock(); - - IIconContainer[] tTextures; - if (getBaseMetaTileEntity().isActive()) tTextures = getTurbineTextureActive(); - else if (hasTurbine()) tTextures = getTurbineTextureFull(); - else tTextures = getTurbineTextureEmpty(); - - assert tTextures != null && tTextures.length == tABCCoord.length; - - for (int i = 0; i < 9; i++) { - if (i != 4) { // do not draw ourselves again. - tExtendedFacing.getWorldOffset(tABCCoord, tXYZOffset); - // since structure check passed, we can assume it is turbine casing - int tX = tXYZOffset[0] + aX; - int tY = tXYZOffset[1] + aY; - int tZ = tXYZOffset[2] + aZ; - // we skip the occlusion test, as we always require a working turbine to have a block of air before it - // so the front face cannot be occluded whatsoever in the most cases. - Tessellator.instance.setBrightness( - tBlock.getMixedBrightnessForBlock( - aWorld, - aX + tDirection.offsetX, - tY + tDirection.offsetY, - aZ + tDirection.offsetZ)); - tLighting.setupLighting(tBlock, tX, tY, tZ, tFacing) - .setupColor(tFacing, Dyes._NULL.mRGBa); - GT_RenderUtil.renderBlockIcon( - aRenderer, - tBlock, - tX + tDirection.offsetX * 0.01, - tY + tDirection.offsetY * 0.01, - tZ + tDirection.offsetZ * 0.01, - tTextures[i].getIcon(), - tFacing); - } - if (++tABCCoord[0] == 2) { - tABCCoord[0] = -1; - tABCCoord[1]++; - } - } - - aRenderer.field_152631_f = false; - return false; - } - - @Override - public void onValueUpdate(byte aValue) { - mHasTurbine = (aValue & 0x1) != 0; - mFormed = (aValue & 0x2) != 0; - super.onValueUpdate(aValue); - } - - @Override - public byte getUpdateData() { - return (byte) ((hasTurbine() ? 1 : 0) | (mMachine ? 2 : 0)); - } - - @Override - public boolean addToMachineList(IGregTechTileEntity tTileEntity, int aBaseCasingIndex) { - return addMaintenanceToMachineList(tTileEntity, getCasingTextureIndex()) - || addInputToMachineList(tTileEntity, getCasingTextureIndex()) - || addOutputToMachineList(tTileEntity, getCasingTextureIndex()) - || addMufflerToMachineList(tTileEntity, getCasingTextureIndex()); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - ItemStack controllerSlot = getControllerSlot(); - if ((counter & 7) == 0 - && (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool) - || controllerSlot.getItemDamage() < 170 - || controllerSlot.getItemDamage() > 179)) { - stopMachine(ShutDownReasonRegistry.NO_TURBINE); - return CheckRecipeResultRegistry.NO_TURBINE_FOUND; - } - ArrayList tFluids = getStoredFluids(); - if (!tFluids.isEmpty()) { - - if (baseEff == 0 || optFlow == 0 - || counter >= 512 - || this.getBaseMetaTileEntity() - .hasWorkJustBeenEnabled() - || this.getBaseMetaTileEntity() - .hasInventoryBeenModified()) { - counter = 0; - baseEff = GT_Utility.safeInt( - (long) ((5F - + ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot)) - * 1000F)); - optFlow = GT_Utility.safeInt( - (long) Math.max( - Float.MIN_NORMAL, - ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolStats(controllerSlot) - .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mToolSpeed - * 50)); - - overflowMultiplier = getOverflowMultiplier(controllerSlot); - - flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mSteamMultiplier; - flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mGasMultiplier; - flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier; - - if (optFlow <= 0 || baseEff <= 0) { - stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed - return CheckRecipeResultRegistry.NO_FUEL_FOUND; - } - } else { - counter++; - } - } - - int newPower = fluidIntoPower(tFluids, optFlow, baseEff, overflowMultiplier, flowMultipliers); // How much the - // turbine should - // be producing - // with this flow - int difference = newPower - this.mEUt; // difference between current output and new output - - // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the difference in - // power level (per tick) - // This is how much the turbine can actually change during this tick - int maxChangeAllowed = Math.max(10, GT_Utility.safeInt((long) Math.abs(difference) / 100)); - - if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed change - int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative. - this.mEUt += change; // Apply the change - } else this.mEUt = newPower; - - if (this.mEUt <= 0) { - // stopMachine(); - this.mEUt = 0; - this.mEfficiency = 0; - return CheckRecipeResultRegistry.NO_FUEL_FOUND; - } else { - this.mMaxProgresstime = 1; - this.mEfficiencyIncrease = 10; - // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here. - return CheckRecipeResultRegistry.GENERATING; - } - } - - abstract int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, - float[] flowMultipliers); - - abstract float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier); - - // Gets the maximum output that the turbine currently can handle. Going above this will cause the turbine to explode - public long getMaximumOutput() { - long aTotal = 0; - for (GT_MetaTileEntity_Hatch_Dynamo aDynamo : filterValidMTEs(mDynamoHatches)) { - long aVoltage = aDynamo.maxEUOutput(); - aTotal = aDynamo.maxAmperesOut() * aVoltage; - } - return aTotal; - } - - public int getOverflowMultiplier(ItemStack aStack) { - int aOverflowMultiplier = 0; - int toolQualityLevel = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolQuality; - if (toolQualityLevel >= 6) { - aOverflowMultiplier = 3; - } else if (toolQualityLevel >= 3) { - aOverflowMultiplier = 2; - } else { - aOverflowMultiplier = 1; - } - return aOverflowMultiplier; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 1; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - if (GT_Utility.isStackInvalid(aStack)) { - return 0; - } - if (aStack.getItem() instanceof GT_MetaGenerated_Tool_01) { - return 10000; - } - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return true; - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - - String tRunning = mMaxProgresstime > 0 - ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true") - + EnumChatFormatting.RESET - : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false") - + EnumChatFormatting.RESET; - String tMaintainance = getIdealStatus() == getRepairStatus() - ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") - + EnumChatFormatting.RESET - : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") - + EnumChatFormatting.RESET; - int tDura = 0; - - if (mInventory[1] != null && mInventory[1].getItem() instanceof GT_MetaGenerated_Tool_01) { - tDura = GT_Utility.safeInt( - (long) (100.0f / GT_MetaGenerated_Tool.getToolMaxDamage(mInventory[1]) - * (GT_MetaGenerated_Tool.getToolDamage(mInventory[1])) + 1)); - } - - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - String[] ret = new String[] { - // 8 Lines available for information panels - tRunning + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(((long) mEUt * mEfficiency) / 10000) - + EnumChatFormatting.RESET - + " EU/t", /* 1 */ - tMaintainance, /* 2 */ - StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": " - + EnumChatFormatting.YELLOW - + (mEfficiency / 100F) - + EnumChatFormatting.RESET - + "%", /* 2 */ - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + /* 3 */ EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - StatCollector.translateToLocal("GT5U.turbine.flow") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(GT_Utility.safeInt((long) realOptFlow)) - + EnumChatFormatting.RESET - + " L/t" - + /* 4 */ EnumChatFormatting.YELLOW - + " (" - + (looseFit ? StatCollector.translateToLocal("GT5U.turbine.loose") - : StatCollector.translateToLocal("GT5U.turbine.tight")) - + ")", /* 5 */ - StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " - + EnumChatFormatting.GOLD - + GT_Utility.formatNumbers(storedFluid) - + EnumChatFormatting.RESET - + "L", /* 6 */ - StatCollector.translateToLocal( - "GT5U.turbine.dmg") + ": " + EnumChatFormatting.RED + tDura + EnumChatFormatting.RESET + "%", /* 7 */ - StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" /* 8 */ - }; - if (!this.getClass() - .getName() - .contains("Steam")) - ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.safeInt((long) realOptFlow) - + EnumChatFormatting.RESET - + " L/t"; - return ret; - } - - public boolean hasTurbine() { - return getBaseMetaTileEntity() != null && getBaseMetaTileEntity().isClientSide() ? mHasTurbine - : this.getMaxEfficiency(mInventory[1]) > 0; - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 2, 1); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 2, 1, elementBudget, env, false, true); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java deleted file mode 100644 index 71dc1c4d15..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java +++ /dev/null @@ -1,220 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_LargeTurbine_Gas extends GT_MetaTileEntity_LargeTurbine { - - public GT_MetaTileEntity_LargeTurbine_Gas(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeTurbine_Gas(String aName) { - super(aName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], - aFacing == side ? (aActive ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_ACTIVE5) - .build() - : hasTurbine() ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW5) - .build() - : TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_EMPTY5) - .build()) - : casingTexturePages[0][58] }; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Gas Turbine") - .addInfo("Controller block for the Large Gas Turbine") - .addInfo("Needs a Turbine, place inside controller") - // .addInfo("The excess fuel that gets consumed will be voided!") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 3, 4, true) - .addController("Front center") - .addCasingInfoRange("Stainless Steel Turbine Casing", 8, 30, false) - .addDynamoHatch("Back center", 1) - .addMaintenanceHatch("Side centered", 2) - .addMufflerHatch("Side centered", 2) - .addInputHatch("Gas Fuel, Side centered", 2) - .addOtherStructurePart("Air", "3x3 area in front of controller") - .toolTipFinisher("Gregtech"); - return tt; - } - - public int getFuelValue(FluidStack aLiquid) { - if (aLiquid == null) return 0; - GT_Recipe tFuel = RecipeMaps.gasTurbineFuels.getBackend() - .findFuel(aLiquid); - if (tFuel != null) return tFuel.mSpecialValue; - return 0; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeTurbine_Gas(mName); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.gasTurbineFuels; - } - - @Override - public int getRecipeCatalystPriority() { - return -1; - } - - @Override - protected boolean filtersFluid() { - return false; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getCasingMeta() { - return 10; - } - - @Override - public int getCasingTextureIndex() { - return 58; - } - - @Override - public boolean isNewStyleRendering() { - return true; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond; - } - - @Override - int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, - float[] flowMultipliers) { - if (aFluids.size() >= 1) { - int tEU = 0; - int actualOptimalFlow = 0; - - FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process. - // Doesn't matter which one. Ignore the rest! - int fuelValue = getFuelValue(firstFuelType); - - if (aOptFlow < fuelValue) { - // turbine too weak and/or fuel too powerful - // at least consume 1L - this.realOptFlow = 1; - // wastes the extra fuel and generate aOptFlow directly - depleteInput(new FluidStack(firstFuelType, 1)); - this.storedFluid += 1; - return GT_Utility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L); - } - - actualOptimalFlow = GT_Utility.safeInt((long) (aOptFlow * flowMultipliers[1] / fuelValue)); - this.realOptFlow = actualOptimalFlow; - - // Allowed to use up to 450% optimal flow rate, depending on the value of overflowMultiplier. - // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula - // used - // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow - // rate): - // - 150% if it is 1 - // - 300% if it is 2 - // - 450% if it is 3 - // Variable required outside of loop for multi-hatch scenarios. - int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier))); - int flow = 0; - int totalFlow = 0; - - storedFluid = 0; - for (FluidStack aFluid : aFluids) { - if (aFluid.isFluidEqual(firstFuelType)) { - flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above - depleteInput(new FluidStack(aFluid, flow)); // deplete that amount - this.storedFluid += aFluid.amount; - remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches - totalFlow += flow; // track total input used - } - } - if (totalFlow <= 0) return 0; - tEU = GT_Utility.safeInt((long) totalFlow * fuelValue); - - if (totalFlow != actualOptimalFlow) { - float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier); - tEU *= efficiency; - } - tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L); - - // EU/t output cap to properly tier the LGT against the Advanced LGT, will be implemented in a future dev - // update - /* - * if (tEU > 8192) { tEU = 8192; } - */ - - // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the - // turbine - // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow - // When the max fuel consumption rate was increased, turbines could explode on world load - if (tEU > getMaximumOutput()) { - tEU = GT_Utility.safeInt(getMaximumOutput()); - } - return tEU; - } - return 0; - } - - @Override - float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { - // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value - // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of - // fuel used - // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value - // Gases are the second most efficient in this regard, with plasma being the most efficient - float efficiency = 0; - - if (totalFlow > actualOptimalFlow) { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow)) - / ((float) actualOptimalFlow * ((overflowMultiplier * 3) - 1)); - } else { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); - } - - return efficiency; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java deleted file mode 100644 index 4926655476..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java +++ /dev/null @@ -1,219 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_LargeTurbine_GasAdvanced extends GT_MetaTileEntity_LargeTurbine { - - public GT_MetaTileEntity_LargeTurbine_GasAdvanced(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeTurbine_GasAdvanced(String aName) { - super(aName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], - aFacing == side ? (aActive ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_ACTIVE5) - .build() - : hasTurbine() ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW5) - .build() - : TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_EMPTY5) - .build()) - : casingTexturePages[1][57] }; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Gas Turbine") - .addInfo("Warning: This is an experimental multiblock, subject to changes ") - .addInfo("Controller block for the Large Advanced Gas Turbine") - .addInfo("Needs a Turbine, place inside controller") - .addInfo("Only accepts gases above 800k EU/bucket") - .addInfo("Has no maximum EU/t output, only depends on the Dynamo Hatch") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 3, 4, true) - .addController("Front center") - .addCasingInfoRange("Advanced Gas Turbine Casing", 8, 30, false) - .addDynamoHatch("Back center", 1) - .addMaintenanceHatch("Side centered", 2) - .addMufflerHatch("Side centered", 2) - .addInputHatch("Gas Fuel, Side centered", 2) - .toolTipFinisher("Gregtech"); - return tt; - } - - public int getFuelValue(FluidStack aLiquid) { - if (aLiquid == null) return 0; - GT_Recipe tFuel = RecipeMaps.gasTurbineFuels.getBackend() - .findFuel(aLiquid); - if (tFuel != null) return tFuel.mSpecialValue; - return 0; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeTurbine_GasAdvanced(mName); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.gasTurbineFuels; - } - - @Override - public int getRecipeCatalystPriority() { - return -2; - } - - @Override - protected boolean filtersFluid() { - return false; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings8; - } - - @Override - public byte getCasingMeta() { - return 9; - } - - @Override - public int getCasingTextureIndex() { - return 185; - } - - @Override - public boolean isNewStyleRendering() { - return true; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond; - } - - @Override - int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, - float[] flowMultipliers) { - if (aFluids.size() >= 1) { - int tEU = 0; - int actualOptimalFlow = 0; - - FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process. - // Doesn't matter which one. Ignore the rest! - int fuelValue = getFuelValue(firstFuelType); - - if (fuelValue < 100) { - return 0; - } - - if (aOptFlow < fuelValue) { - // turbine too weak and/or fuel too powerful - // at least consume 1L - this.realOptFlow = 1; - // wastes the extra fuel and generate aOptFlow directly - depleteInput(new FluidStack(firstFuelType, 1)); - this.storedFluid += 1; - return GT_Utility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L); - } - - actualOptimalFlow = GT_Utility.safeInt((long) (aOptFlow * flowMultipliers[1] / fuelValue)); - this.realOptFlow = actualOptimalFlow; - - // Allowed to use up to 450% optimal flow rate, depending on the value of overflowMultiplier. - // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula - // used - // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow - // rate): - // - 150% if it is 1 - // - 300% if it is 2 - // - 450% if it is 3 - // Variable required outside of loop for multi-hatch scenarios. - int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier))); - int flow = 0; - int totalFlow = 0; - - storedFluid = 0; - for (FluidStack aFluid : aFluids) { - if (aFluid.isFluidEqual(firstFuelType)) { - flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above - depleteInput(new FluidStack(aFluid, flow)); // deplete that amount - this.storedFluid += aFluid.amount; - remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches - totalFlow += flow; // track total input used - } - } - if (totalFlow <= 0) return 0; - tEU = GT_Utility.safeInt((long) totalFlow * fuelValue); - - if (totalFlow != actualOptimalFlow) { - float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier); - tEU *= efficiency; - } - tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L); - - // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the - // turbine - // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow - // When the max fuel consumption rate was increased, turbines could explode on world load - if (tEU > getMaximumOutput()) { - tEU = GT_Utility.safeInt(getMaximumOutput()); - } - return tEU; - } - return 0; - } - - @Override - float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { - // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value - // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of - // fuel used - // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value - // Gases are the second most efficient in this regard, with plasma being the most efficient - float efficiency = 0; - - if (totalFlow > actualOptimalFlow) { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow)) - / ((float) actualOptimalFlow * ((overflowMultiplier * 3) - 1)); - } else { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); - } - - return efficiency; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java deleted file mode 100644 index d61e75eac3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java +++ /dev/null @@ -1,232 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; -import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Steam.calculateLooseFlow; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_LargeTurbine_HPSteam extends GT_MetaTileEntity_LargeTurbine { - - public boolean achievement = false; - private boolean looseFit = false; - - public GT_MetaTileEntity_LargeTurbine_HPSteam(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeTurbine_HPSteam(String aName) { - super(aName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], - aFacing == side ? (aActive ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_ACTIVE5) - .build() - : hasTurbine() ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW5) - .build() - : TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_EMPTY5) - .build()) - : casingTexturePages[0][59] }; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Steam Turbine") - .addInfo("Controller block for the Large High Pressure Steam Turbine") - .addInfo("Needs a Turbine, place inside controller") - .addInfo("Outputs Steam as well as producing power") - .addInfo("Power output depends on turbine and fitting") - .addInfo("Use screwdriver to adjust fitting of turbine") - .addSeparator() - .beginStructureBlock(3, 3, 4, true) - .addController("Front center") - .addCasingInfoRange("Titanium Turbine Casing", 8, 31, false) - .addDynamoHatch("Back center", 1) - .addMaintenanceHatch("Side centered", 2) - .addInputHatch("Superheated Steam, Side centered", 2) - .addOutputHatch("Steam, Side centered", 2) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeTurbine_HPSteam(mName); - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getCasingMeta() { - return 11; - } - - @Override - public int getCasingTextureIndex() { - return 59; - } - - @Override - public boolean isNewStyleRendering() { - return true; - } - - @Override - int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowEfficiency, - float[] flowMultipliers) { - if (looseFit) { - float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff); - aOptFlow = GT_Utility.safeInt((long) calculatedFlow[0]); - aBaseEff = GT_Utility.safeInt((long) calculatedFlow[1]); - } - int tEU = 0; - int totalFlow = 0; // Byproducts are based on actual flow - int flow = 0; - - // Allowed to use up to 300% optimal flow rate, depending on the value of overflowMultiplier. - // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula - // used - // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow - // rate): - // - 200% if it is 1 - // - 250% if it is 2 - // - 300% if it is 3 - // Variable required outside of loop for multi-hatch scenarios. - this.realOptFlow = aOptFlow * flowMultipliers[0]; - int remainingFlow = GT_Utility.safeInt((long) (realOptFlow * (0.5f * overflowMultiplier + 1.5))); - - storedFluid = 0; - for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) { - final FluidStack aFluidStack = aFluids.get(i); - if (GT_ModHandler.isSuperHeatedSteam(aFluidStack)) { - flow = Math.min(aFluidStack.amount, remainingFlow); // try to use up to the max flow defined just above - depleteInput(new FluidStack(aFluidStack, flow)); // deplete that amount - this.storedFluid += aFluidStack.amount; - remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches - totalFlow += flow; // track total input used - if (!achievement) { - try { - GT_Mod.achievements.issueAchievement( - this.getBaseMetaTileEntity() - .getWorld() - .getPlayerEntityByName( - this.getBaseMetaTileEntity() - .getOwnerName()), - "efficientsteam"); - } catch (Exception ignored) {} - achievement = true; - } - } else if (GT_ModHandler.isAnySteam(aFluidStack)) { - depleteInput(new FluidStack(aFluidStack, aFluidStack.amount)); - } - } - if (totalFlow <= 0) return 0; - tEU = totalFlow; - addOutput(GT_ModHandler.getSteam(totalFlow)); - if (totalFlow == (GT_Utility.safeInt((long) realOptFlow))) { - tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L); - } else { - float efficiency = getOverflowEfficiency( - totalFlow, - (GT_Utility.safeInt((long) realOptFlow)), - overflowMultiplier); - tEU *= efficiency; - tEU = Math.max(1, GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L)); - } - - // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the - // turbine - // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate can - // explode turbines on world load - if (tEU > getMaximumOutput()) { - tEU = GT_Utility.safeInt(getMaximumOutput()); - } - - return tEU; - } - - @Override - float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { - // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value - // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of - // fuel used - // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value - // Superheated steam is the second least efficient out of all turbine fuels in this regard, with steam being the - // least efficient - float efficiency = 0; - - if (totalFlow > actualOptimalFlow) { - efficiency = 1.0f - - Math.abs((totalFlow - actualOptimalFlow)) / ((float) actualOptimalFlow * (overflowMultiplier + 2)); - } else { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); - } - - return efficiency; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (side == getBaseMetaTileEntity().getFrontFacing()) { - looseFit ^= true; - GT_Utility.sendChatToPlayer( - aPlayer, - looseFit ? GT_Utility.trans("500", "Fitting: Loose - More Flow") - : GT_Utility.trans("501", "Fitting: Tight - More Efficiency")); - } - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return (looseFit && XSTR_INSTANCE.nextInt(4) == 0) ? 0 : 1; - } - - @Override - public String[] getInfoData() { - super.looseFit = looseFit; - return super.getInfoData(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("turbineFitting", looseFit); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - looseFit = aNBT.getBoolean("turbineFitting"); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java deleted file mode 100644 index 2ecc79cd3b..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java +++ /dev/null @@ -1,391 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.items.GT_MetaGenerated_Tool_01; - -public class GT_MetaTileEntity_LargeTurbine_Plasma extends GT_MetaTileEntity_LargeTurbine { - - public GT_MetaTileEntity_LargeTurbine_Plasma(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeTurbine_Plasma(String aName) { - super(aName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], - aFacing == side ? (aActive ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_ACTIVE5) - .build() - : hasTurbine() ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW5) - .build() - : TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_EMPTY5) - .build()) - : casingTexturePages[0][60] }; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Plasma Turbine") - .addInfo("Controller block for the Large Plasma Generator") - .addInfo("Needs a Turbine, place inside controller") - .addInfo("Use your Fusion Reactor to produce the Plasma") - .addSeparator() - .beginStructureBlock(3, 3, 4, true) - .addController("Front center") - .addCasingInfoRange("Tungstensteel Turbine Casing", 8, 31, false) - .addDynamoHatch("Back center", 1) - .addMaintenanceHatch("Side centered", 2) - .addInputHatch("Plasma Fluid, Side centered", 2) - .addOutputHatch("Molten Fluid, optional, Side centered", 2) - .toolTipFinisher("Gregtech"); - return tt; - } - - public int getFuelValue(FluidStack aLiquid) { - if (aLiquid == null) return 0; - GT_Recipe tFuel = RecipeMaps.plasmaFuels.getBackend() - .findFuel(aLiquid); - if (tFuel != null) return tFuel.mSpecialValue; - return 0; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeTurbine_Plasma(mName); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.plasmaFuels; - } - - @Override - public int getRecipeCatalystPriority() { - return -1; - } - - @Override - protected boolean filtersFluid() { - return false; - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getCasingMeta() { - return 12; - } - - @Override - public int getCasingTextureIndex() { - return 60; - } - - @Override - public boolean isNewStyleRendering() { - return true; - } - - @Override - int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, - float[] flowMultipliers) { - if (aFluids.size() >= 1) { - aOptFlow *= 800; // CHANGED THINGS HERE, check recipe runs once per 20 ticks - int tEU = 0; - - int actualOptimalFlow = 0; - - FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process. - // Doesn't matter which one. Ignore the rest! - int fuelValue = getFuelValue(firstFuelType); - actualOptimalFlow = GT_Utility - .safeInt((long) Math.ceil((double) aOptFlow * flowMultipliers[2] / (double) fuelValue)); - this.realOptFlow = actualOptimalFlow; // For scanner info - - // Allowed to use up to 550% optimal flow rate, depending on the value of overflowMultiplier. - // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula - // used - // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow - // rate): - // - 250% if it is 1 - // - 400% if it is 2 - // - 550% if it is 3 - // Variable required outside of loop for multi-hatch scenarios. - int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier + 1))); - int flow = 0; - int totalFlow = 0; - - storedFluid = 0; - for (FluidStack aFluid : aFluids) { - if (aFluid.isFluidEqual(firstFuelType)) { - flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above - depleteInput(new FluidStack(aFluid, flow)); // deplete that amount - this.storedFluid += aFluid.amount; - remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches - totalFlow += flow; // track total input used - } - } - String fn = FluidRegistry.getFluidName(firstFuelType); - String[] nameSegments = fn.split("\\.", 2); - if (nameSegments.length == 2) { - String outputName = nameSegments[1]; - FluidStack output = FluidRegistry.getFluidStack(outputName, totalFlow); - if (output == null) { - output = FluidRegistry.getFluidStack("molten." + outputName, totalFlow); - } - if (output != null) { - addOutput(output); - } - } - if (totalFlow <= 0) return 0; - tEU = GT_Utility.safeInt((long) ((fuelValue / 20D) * (double) totalFlow)); - - // GT_FML_LOGGER.info(totalFlow+" : "+fuelValue+" : "+aOptFlow+" : "+actualOptimalFlow+" : "+tEU); - - if (totalFlow != actualOptimalFlow) { - float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier); - tEU = (int) (tEU * efficiency); - } - tEU = GT_Utility.safeInt((long) (aBaseEff / 10000D * tEU)); - - // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the - // turbine - // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate - // can explode turbines on world load - if (tEU > getMaximumOutput()) { - tEU = GT_Utility.safeInt(getMaximumOutput()); - } - - return tEU; - } - return 0; - } - - @Override - float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { - // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value - // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of - // fuel used - // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value - // Plasmas are the most efficient out of all turbine fuels in this regard - float efficiency = 0; - - if (totalFlow > actualOptimalFlow) { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow)) - / ((float) actualOptimalFlow * ((overflowMultiplier * 3) + 1)); - } else { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); - } - - return efficiency; - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - ItemStack controllerSlot = getControllerSlot(); - if ((counter & 7) == 0 - && (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool) - || controllerSlot.getItemDamage() < 170 - || controllerSlot.getItemDamage() > 179)) { - stopMachine(ShutDownReasonRegistry.NO_TURBINE); - return CheckRecipeResultRegistry.NO_TURBINE_FOUND; - } - ArrayList tFluids = getStoredFluids(); - if (!tFluids.isEmpty()) { - if (baseEff == 0 || optFlow == 0 - || counter >= 512 - || this.getBaseMetaTileEntity() - .hasWorkJustBeenEnabled() - || this.getBaseMetaTileEntity() - .hasInventoryBeenModified()) { - counter = 0; - baseEff = GT_Utility.safeInt( - (long) ((5F - + ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot)) - * 1000F)); - optFlow = GT_Utility.safeInt( - (long) Math.max( - Float.MIN_NORMAL, - ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolStats(controllerSlot) - .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mToolSpeed - * 50)); - overflowMultiplier = getOverflowMultiplier(controllerSlot); - - flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mSteamMultiplier; - flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mGasMultiplier; - flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier; - - if (optFlow <= 0 || baseEff <= 0) { - stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed - return CheckRecipeResultRegistry.NO_FUEL_FOUND; - } - } else { - counter++; - } - } - - int newPower = fluidIntoPower(tFluids, optFlow, baseEff, overflowMultiplier, flowMultipliers); // How much the - // turbine should - // be producing - // with this flow - - int difference = newPower - this.mEUt; // difference between current output and new output - - // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the difference in - // power level (per tick) - // This is how much the turbine can actually change during this tick - int maxChangeAllowed = Math.max(200, GT_Utility.safeInt((long) Math.abs(difference) / 5)); - - if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed change - int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative. - this.mEUt += change; // Apply the change - } else this.mEUt = newPower; - - if (this.mEUt <= 0) { - // stopMachine(); - this.mEUt = 0; - this.mEfficiency = 0; - return CheckRecipeResultRegistry.NO_FUEL_FOUND; - } else { - this.mMaxProgresstime = 20; - this.mEfficiencyIncrease = 200; - // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here. - - return CheckRecipeResultRegistry.GENERATING; - } - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - - String tRunning = mMaxProgresstime > 0 - ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true") - + EnumChatFormatting.RESET - : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false") - + EnumChatFormatting.RESET; - String tMaintainance = getIdealStatus() == getRepairStatus() - ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") - + EnumChatFormatting.RESET - : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") - + EnumChatFormatting.RESET; - int tDura = 0; - - if (mInventory[1] != null && mInventory[1].getItem() instanceof GT_MetaGenerated_Tool_01) { - tDura = GT_Utility.safeInt( - (long) (100.0f / GT_MetaGenerated_Tool.getToolMaxDamage(mInventory[1]) - * (GT_MetaGenerated_Tool.getToolDamage(mInventory[1])) + 1)); - } - - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - String[] ret = new String[] { - // 8 Lines available for information panels - tRunning + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(((long) mEUt * mEfficiency) / 10000) - + EnumChatFormatting.RESET - + " EU/t", /* 1 */ - tMaintainance, /* 2 */ - StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": " - + EnumChatFormatting.YELLOW - + (mEfficiency / 100F) - + EnumChatFormatting.RESET - + "%", /* 2 */ - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + /* 3 */ EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - StatCollector.translateToLocal("GT5U.turbine.flow") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(GT_Utility.safeInt((long) realOptFlow)) - + EnumChatFormatting.RESET - + " L/s" - + /* 4 */ EnumChatFormatting.YELLOW - + " (" - + (looseFit ? StatCollector.translateToLocal("GT5U.turbine.loose") - : StatCollector.translateToLocal("GT5U.turbine.tight")) - + ")", /* 5 */ - StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " - + EnumChatFormatting.GOLD - + GT_Utility.formatNumbers(storedFluid) - + EnumChatFormatting.RESET - + "L", /* 6 */ - StatCollector.translateToLocal( - "GT5U.turbine.dmg") + ": " + EnumChatFormatting.RED + tDura + EnumChatFormatting.RESET + "%", /* 7 */ - StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" /* 8 */ - }; - if (!this.getClass() - .getName() - .contains("Steam")) - ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.safeInt((long) realOptFlow) - + EnumChatFormatting.RESET - + " L/s"; - return ret; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java deleted file mode 100644 index 849d0af462..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java +++ /dev/null @@ -1,273 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.GT_Values.STEAM_PER_WATER; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; -import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_LargeTurbine_Steam extends GT_MetaTileEntity_LargeTurbine { - - private int excessWater; - private boolean achievement = false; - private boolean looseFit = false; - - public GT_MetaTileEntity_LargeTurbine_Steam(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_LargeTurbine_Steam(String aName) { - super(aName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], - aFacing == side ? (aActive ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_ACTIVE5) - .build() - : hasTurbine() ? TextureFactory.builder() - .addIcon(LARGETURBINE_NEW5) - .build() - : TextureFactory.builder() - .addIcon(LARGETURBINE_NEW_EMPTY5) - .build()) - : casingTexturePages[0][57] }; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Steam Turbine") - .addInfo("Controller block for the Large Steam Turbine") - .addInfo("Needs a Turbine, place inside controller") - .addInfo("Outputs Distilled Water as well as producing power") - .addInfo("Power output depends on turbine and fitting") - .addInfo("Use screwdriver to adjust fitting of turbine") - .addSeparator() - .beginStructureBlock(3, 3, 4, true) - .addController("Front center") - .addCasingInfoRange("Turbine Casing", 8, 31, false) - .addDynamoHatch("Back center", 1) - .addMaintenanceHatch("Side centered", 2) - .addInputHatch("Steam, Side centered", 2) - .addOutputHatch("Distilled Water, Side centered", 2) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LargeTurbine_Steam(mName); - } - - @Override - public Block getCasingBlock() { - return GregTech_API.sBlockCasings4; - } - - @Override - public byte getCasingMeta() { - return 9; - } - - @Override - public int getCasingTextureIndex() { - return 16; - } - - @Override - public boolean isNewStyleRendering() { - return true; - } - - private int condenseSteam(int steam) { - excessWater += steam; - int water = excessWater / STEAM_PER_WATER; - excessWater %= STEAM_PER_WATER; - return water; - } - - @Override - int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowEfficiency, - float[] flowMultipliers) { - if (looseFit) { - float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff); - aOptFlow = GT_Utility.safeInt((long) calculatedFlow[0]); - aBaseEff = GT_Utility.safeInt((long) calculatedFlow[1]); - } - int tEU = 0; - int totalFlow = 0; // Byproducts are based on actual flow - int flow = 0; - - // Allowed to use up to 250% optimal flow rate, depending on the value of overflowMultiplier. - // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula - // used - // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow - // rate): - // - 150% if it is 1 - // - 200% if it is 2 - // - 250% if it is 3 - // Variable required outside of loop for multi-hatch scenarios. - this.realOptFlow = aOptFlow * flowMultipliers[0]; - int remainingFlow = GT_Utility.safeInt((long) (realOptFlow * (0.5f * overflowMultiplier + 1))); - - storedFluid = 0; - for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) { // loop through each hatch; extract inputs and - // track totals. - final FluidStack aFluidStack = aFluids.get(i); - if (GT_ModHandler.isAnySteam(aFluidStack)) { - flow = Math.min(aFluidStack.amount, remainingFlow); // try to use up to the max flow defined just above - depleteInput(new FluidStack(aFluidStack, flow)); // deplete that amount - this.storedFluid += aFluidStack.amount; - remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches - totalFlow += flow; // track total input used - if (!achievement) { - GT_Mod.achievements.issueAchievement( - this.getBaseMetaTileEntity() - .getWorld() - .getPlayerEntityByName( - this.getBaseMetaTileEntity() - .getOwnerName()), - "muchsteam"); - achievement = true; - } - } else if (GT_ModHandler.isSuperHeatedSteam(aFluidStack)) { - depleteInput(new FluidStack(aFluidStack, aFluidStack.amount)); - } - } - if (totalFlow <= 0) return 0; - tEU = totalFlow; - int waterToOutput = condenseSteam(totalFlow); - addOutput(GT_ModHandler.getDistilledWater(waterToOutput)); - if (totalFlow == (GT_Utility.safeInt((long) realOptFlow))) { - tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 20000L); - } else { - float efficiency = getOverflowEfficiency( - totalFlow, - (GT_Utility.safeInt((long) realOptFlow)), - overflowMultiplier); - tEU *= efficiency; - tEU = Math.max(1, GT_Utility.safeInt((long) tEU * (long) aBaseEff / 20000L)); - } - - // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the - // turbine - // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate can - // explode turbines on world load - if (tEU > getMaximumOutput()) { - tEU = GT_Utility.safeInt(getMaximumOutput()); - } - - return tEU; - } - - @Override - float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { - // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value - // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of - // fuel used - // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value - // Steam is the least efficient out of all turbine fuels in this regard - float efficiency = 0; - - if (totalFlow > actualOptimalFlow) { - efficiency = 1.0f - - Math.abs((totalFlow - actualOptimalFlow)) / ((float) actualOptimalFlow * (overflowMultiplier + 1)); - } else { - efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); - } - - return efficiency; - } - - public static float[] calculateLooseFlow(float aOptFlow, float aBaseEff) { - aOptFlow *= 4f; - if (aBaseEff >= 26000f) { - aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 8000f) / 10000f) * 20f); - aBaseEff = aBaseEff * 0.6f; - } else if (aBaseEff > 22000f) { - aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 7000f) / 10000f) * 20f); - aBaseEff = aBaseEff * 0.65f; - } else if (aBaseEff > 18000f) { - aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 6000f) / 10000f) * 20f); - aBaseEff = aBaseEff * 0.70f; - } else if (aBaseEff > 14000f) { - aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 5000f) / 10000f) * 20f); - aBaseEff = aBaseEff * 0.75f; - } else if (aBaseEff > 10000f) { - aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 4000f) / 10000f) * 20f); - aBaseEff = aBaseEff * 0.8f; - } else if (aBaseEff > 6000f) { - aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 3000f) / 10000f) * 20f); - aBaseEff = aBaseEff * 0.85f; - } else { - aBaseEff = aBaseEff * 0.9f; - } - - if (aBaseEff % 100 != 0) { - aBaseEff -= aBaseEff % 100; - } - - float[] looseFlow = new float[2]; - looseFlow[0] = aOptFlow; - looseFlow[1] = aBaseEff; - return looseFlow; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (side == getBaseMetaTileEntity().getFrontFacing()) { - looseFit ^= true; - GT_Utility.sendChatToPlayer( - aPlayer, - looseFit ? GT_Utility.trans("500", "Fitting: Loose - More Flow") - : GT_Utility.trans("501", "Fitting: Tight - More Efficiency")); - } - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return (looseFit && XSTR_INSTANCE.nextInt(4) == 0) ? 0 : 1; - } - - @Override - public String[] getInfoData() { - super.looseFit = looseFit; - return super.getInfoData(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("turbineFitting", looseFit); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - looseFit = aNBT.getBoolean("turbineFitting"); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiAutoclave.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiAutoclave.java deleted file mode 100644 index fdb34b6d25..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiAutoclave.java +++ /dev/null @@ -1,425 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -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 com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.AuthorVolence; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofCoil; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.text.DecimalFormat; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import org.apache.commons.lang3.tuple.Pair; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.HeatingCoilLevel; -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.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Casings10; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_MultiAutoclave extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - public GT_MetaTileEntity_MultiAutoclave(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_MultiAutoclave(String aName) { - super(aName); - } - - private HeatingCoilLevel heatLevel; - - private static final String STRUCTURE_PIECE_MAIN = "main"; - - protected int itemPipeTier = 0; - protected int fluidPipeTier = 0; - - private static Integer getItemPipeTierFromMeta(Block block, Integer metaID) { - if (block != GregTech_API.sBlockCasings11) return -1; - if (metaID < 0 || metaID > 7) return -1; - return metaID + 1; - } - - private void setItemPipeTier(int tier) { - itemPipeTier = tier; - } - - private int getItemPipeTier() { - return itemPipeTier; - } - - private static Integer getFluidTierFromMeta(Block block, Integer metaID) { - if (block != GregTech_API.sBlockCasings2) return -1; - if (metaID < 12 || metaID > 15) return -1; - return metaID - 11; - } - - private void setFluidPipeTier(int tier) { - fluidPipeTier = tier; - } - - private int getFluidPipeTier() { - return fluidPipeTier; - } - - public HeatingCoilLevel getCoilLevel() { - return this.heatLevel; - } - - public void setCoilLevel(HeatingCoilLevel aCoilLevel) { - this.heatLevel = aCoilLevel; - } - - public Integer getCoilTier() { - return (int) this.getCoilLevel() - .getTier() + 1; - } - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { - { " AAA ", " AFA ", " AFA ", " AFA ", " AFA ", " AFA ", " AFA ", " AFA ", - " AAA " }, - { " ABBBA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", - " ABBBA ", }, - { "ABBBBBA", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", - "ABBBBBA", }, - { "ABBBBBA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", - "ABBBBBA", }, - { "ABBBBBA", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", - "ABBBBBA", }, - { "AABBBAA", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", - "AABBBAA", }, - { "A A~A A", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", - "A AAA A" } })) - .addElement( - 'A', - buildHatchAdder(GT_MetaTileEntity_MultiAutoclave.class) - .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Muffler, Energy) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(3)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_MultiAutoclave::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 3)))) - .addElement('B', Glasses.chainAllGlasses()) // Steel Casings - .addElement('C', ofFrame(Materials.Polytetrafluoroethylene)) // PTFE Frame - .addElement( - 'D', - ofBlocksTiered( - GT_MetaTileEntity_MultiAutoclave::getFluidTierFromMeta, - ImmutableList.of( - Pair.of(GregTech_API.sBlockCasings2, 12), - Pair.of(GregTech_API.sBlockCasings2, 13), - Pair.of(GregTech_API.sBlockCasings2, 14), - Pair.of(GregTech_API.sBlockCasings2, 15)), - -2, - GT_MetaTileEntity_MultiAutoclave::setFluidPipeTier, - GT_MetaTileEntity_MultiAutoclave::getFluidPipeTier)) - .addElement( - 'E', - ofBlocksTiered( - GT_MetaTileEntity_MultiAutoclave::getItemPipeTierFromMeta, - ImmutableList.of( - Pair.of(GregTech_API.sBlockCasings11, 0), - Pair.of(GregTech_API.sBlockCasings11, 1), - Pair.of(GregTech_API.sBlockCasings11, 2), - Pair.of(GregTech_API.sBlockCasings11, 3), - Pair.of(GregTech_API.sBlockCasings11, 4), - Pair.of(GregTech_API.sBlockCasings11, 5), - Pair.of(GregTech_API.sBlockCasings11, 6), - Pair.of(GregTech_API.sBlockCasings11, 7)), - -2, - GT_MetaTileEntity_MultiAutoclave::setItemPipeTier, - GT_MetaTileEntity_MultiAutoclave::getItemPipeTier)) - .addElement( - 'F', - withChannel( - "coil", - ofCoil(GT_MetaTileEntity_MultiAutoclave::setCoilLevel, GT_MetaTileEntity_MultiAutoclave::getCoilLevel))) - .build(); - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Autoclave") - .addInfo("Controller Block for the Industrial Autoclave.") - .addInfo("Gains 12 parallels per item pipe casing tier.") - .addInfo("Each pipe casing (bronze, steel, titanium, tungstensteel)") - .addInfo("decreases the EU usageby 1/pipe tier.") - .addInfo("Heating Coils increase speed by 1/((tier + 1) / 2).") - .addInfo("Needs a minimum of 128 Pressure Containment Casings.") - .addInfo(AuthorVolence) - .addSeparator() - .beginStructureBlock(7, 5, 5, true) - .addController("Front Center") - .addCasingInfoMin("Pressure Containment Casings", 128, false) - .addCasingInfoExactly("Item Pipe Casings", 7, true) - .addCasingInfoExactly("Pipe Casings", 14, true) - .addCasingInfoExactly("Heating Coils", 7, true) - .addCasingInfoExactly("PTFE Frame", 42, false) - .addInputBus("Any of the Pressure Containment Casings", 1) - .addOutputBus("Any of the Pressure Containment Casings", 1) - .addEnergyHatch("Any of the Pressure Containment Casings", 1) - .addMaintenanceHatch("Any of the Pressure Containment Casings", 1) - .addMufflerHatch("Any of the Pressure Containment Casings", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - fluidPipeTier = -2; - itemPipeTier = -2; - mCasingAmount = 0; - mEnergyHatches.clear(); - setCoilLevel(HeatingCoilLevel.None); - if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 6, 0)) return false; - return this.mMaintenanceHatches.size() == 1 && fluidPipeTier >= 0 - && mCasingAmount >= 128 - && itemPipeTier >= 0 - && mEnergyHatches.size() >= 1 - && mMufflerHatches.size() == 1; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 3)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 3)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 3)) }; - } - return rTexture; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 6, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - int build = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 6, 0, elementBudget, env, false, true); - return build; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MultiAutoclave(this.mName); - } - - public float euModifier(int fluidPipeTier) { - return (float) (12 - fluidPipeTier) / 12; - } - - public float speedBoost(int coilTier) { - return (float) 1 / (1 + 0.25f * coilTier); - } - - public int getMaxParallelRecipes() { - return itemPipeTier * 12; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @Override - @Nonnull - public CheckRecipeResult process() { - euModifier = euModifier(fluidPipeTier); - speedBoost = speedBoost(getCoilTier()); - return super.process(); - } - }.setMaxParallelSupplier(this::getMaxParallelRecipes); - } - - @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("fluidPipeTier", getFluidPipeTier()); - tag.setInteger("itemPipeTier", getItemPipeTier()); - tag.setInteger("coilTier", getCoilTier()); - tag.setFloat("getMaxParallelRecipes", getMaxParallelRecipes()); - } - - private static final DecimalFormat dfTwo = new DecimalFormat("0.00"); - private static final DecimalFormat dfNone = new DecimalFormat("#"); - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currenttip, accessor, config); - NBTTagCompound tag = accessor.getNBTData(); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.fluidPipeTier") + ": " - + EnumChatFormatting.WHITE - + Math.max(0, tag.getInteger("fluidPipeTier"))); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.euModifier") + ": " - + EnumChatFormatting.WHITE - + dfTwo.format(Math.max(0, euModifier(tag.getInteger("fluidPipeTier")) * 100)) - + "%"); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.itemPipeTier") + ": " - + EnumChatFormatting.WHITE - + Math.max(0, tag.getInteger("itemPipeTier"))); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " - + EnumChatFormatting.WHITE - + dfNone.format(Math.max(0, tag.getFloat("getMaxParallelRecipes")))); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.coilLevel") + ": " - + EnumChatFormatting.WHITE - + Math.max(0, tag.getInteger("coilTier"))); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.speed") + ": " - + EnumChatFormatting.WHITE - + dfNone.format(Math.max(0, 100 / speedBoost(tag.getInteger("coilTier")))) - + "%"); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.autoclaveRecipes; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiCanner.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiCanner.java deleted file mode 100644 index a622f8db2c..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiCanner.java +++ /dev/null @@ -1,314 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.GT_HatchElement.*; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -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.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.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.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_ExtendedPowerMultiBlockBase; -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.blocks.GT_Block_Casings2; -import gtPlusPlus.core.util.minecraft.PlayerUtils; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_MultiCanner extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - private static final int MACHINEMODE_CANNER = 0; - private static final int MACHINEMODE_FLUIDCANNER = 1; - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - (transpose( - new String[][] { { " AAA ", " AAAAA ", "AAAAAAA", "AAAAAAA", "AAAAAAA", " AAAAA ", " AAA " }, - { " ", " B B ", " BAAAB ", " A A ", " BAAAB ", " B B ", " " }, - { " ", " B B ", " BA~AB ", " A A ", " BAAAB ", " B B ", " " }, - { " ", " B B ", " BAAAB ", " A A ", " BAAAB ", " B B ", " " }, - { " AAA ", " AAAAA ", "AAAAAAA", "AAAAAAA", "AAAAAAA", " AAAAA ", " AAA " } }))) - .addElement( - 'A', - buildHatchAdder(GT_MetaTileEntity_MultiCanner.class) - .atLeast(InputBus, OutputBus, Maintenance, Energy, InputHatch, OutputHatch) - .casingIndex(((GT_Block_Casings2) GregTech_API.sBlockCasings2).getTextureIndex(0)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_MultiCanner::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings2, 0)))) - .addElement('B', ofBlock(GregTech_API.sBlockCasings2, 13)) - .build(); - - public GT_MetaTileEntity_MultiCanner(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_MultiCanner(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MultiCanner(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings2, 0)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_CANNER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_CANNER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings2, 0)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_CANNER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_CANNER_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings2, 0)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Canner/Fluid Canner") - .addInfo("Controller Block for the TurboCan Pro") - .addInfo("Use screwdriver to switch mode") - .addInfo("100% faster than single block machines of the same voltage") - .addInfo("Gains 8 parallels per voltage tier") - .addInfo(EnumChatFormatting.BLUE + "It's uncanny!") - .addInfo(AuthorFourIsTheNumber) - .addSeparator() - .beginStructureBlock(7, 5, 7, true) - .addController("Front Center") - .addCasingInfoMin("Solid Steel Machine Casing", 85, false) - .addCasingInfoExactly("Steel Pipe Casing", 24, false) - .addInputBus("Any Solid Steel Casing", 1) - .addOutputBus("Any Solid Steel Casing", 1) - .addInputHatch("Any Solid Steel Casing", 1) - .addOutputHatch("Any Solid Steel Casing", 1) - .addEnergyHatch("Any Solid Steel Casing", 1) - .addMaintenanceHatch("Any Solid Steel Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 2, 2); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 2, 2, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - mEnergyHatches.clear(); - - if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 2, 2)) return false; - if (mCasingAmount < 85) return false; - - // All checks passed! - return true; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic().setSpeedBonus(1F / 2F) - .setMaxParallelSupplier(this::getMaxParallelRecipes); - } - - public int getMaxParallelRecipes() { - return (8 * GT_Utility.getTier(this.getMaxInputVoltage())); - } - - @Override - public RecipeMap getRecipeMap() { - return (machineMode == MACHINEMODE_FLUIDCANNER) ? RecipeMaps.fluidCannerRecipes : RecipeMaps.cannerRecipes; - } - - @Nonnull - @Override - public Collection> getAvailableRecipeMaps() { - return Arrays.asList(RecipeMaps.fluidCannerRecipes, RecipeMaps.cannerRecipes); - } - - @Override - public int getRecipeCatalystPriority() { - return -10; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - if (aNBT.hasKey("fluidMode")) { - machineMode = aNBT.getBoolean("fluidMode") ? MACHINEMODE_FLUIDCANNER : MACHINEMODE_CANNER; - } - super.loadNBTData(aNBT); - } - - @Override - public boolean supportsMachineModeSwitch() { - return true; - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - setMachineMode(nextMachineMode()); - PlayerUtils.messagePlayer( - aPlayer, - String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); - } - - @Override - public void setMachineModeIcons() { - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_PACKAGER); - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_LPF_FLUID); - } - - @Override - public String getMachineModeName() { - return StatCollector.translateToLocal("GT5U.MULTI_CANNER.mode." + machineMode); - } - - @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", machineMode); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - currentTip.add( - StatCollector.translateToLocal("GT5U.machines.oreprocessor1") + " " - + EnumChatFormatting.WHITE - + StatCollector.translateToLocal("GT5U.MULTI_CANNER.mode." + tag.getInteger("mode")) - + EnumChatFormatting.RESET); - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java deleted file mode 100644 index 5d611b270d..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java +++ /dev/null @@ -1,377 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_MultiFurnace - extends GT_MetaTileEntity_AbstractMultiFurnace implements ISurvivalConstructable { - - private int mLevel = 0; - private int mCostDiscount = 1; - - private static final long RECIPE_EUT = 4; - private static final int RECIPE_DURATION = 512; - private static final int CASING_INDEX = 11; - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose(new String[][] { { "ccc", "cmc", "ccc" }, { "CCC", "C-C", "CCC" }, { "b~b", "bbb", "bbb" } })) - .addElement('c', ofBlock(GregTech_API.sBlockCasings1, CASING_INDEX)) - .addElement('m', Muffler.newAny(CASING_INDEX, 2)) - .addElement( - 'C', - GT_StructureUtility - .ofCoil(GT_MetaTileEntity_MultiFurnace::setCoilLevel, GT_MetaTileEntity_MultiFurnace::getCoilLevel)) - .addElement( - 'b', - ofChain( - GT_StructureUtility.buildHatchAdder() - .atLeast(Maintenance, InputBus, OutputBus, Energy) - .casingIndex(CASING_INDEX) - .dot(1) - .build(), - ofBlock(GregTech_API.sBlockCasings1, CASING_INDEX))) - .build(); - - public GT_MetaTileEntity_MultiFurnace(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_MultiFurnace(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MultiFurnace(this.mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Furnace") - .addInfo("Controller Block for the Multi Smelter") - .addInfo("Smelts up to 8-8192 items at once") - .addInfo("Items smelted increases with coil tier") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(3, 3, 3, true) - .addController("Front bottom") - .addCasingInfoRange("Heat Proof Machine Casing", 8, 14, false) - .addOtherStructurePart("Heating Coils", "Middle layer") - .addEnergyHatch("Any bottom casing", 1) - .addMaintenanceHatch("Any bottom casing", 1) - .addMufflerHatch("Top Middle", 2) - .addInputBus("Any bottom casing", 1) - .addOutputBus("Any bottom casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection != facingDirection) return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; - if (active) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_SMELTER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_SMELTER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_SMELTER_GLOW) - .extFacing() - .glow() - .build() }; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.furnaceRecipes; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionMultiSmelterPerSecond; - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - ArrayList tInputList = getAllStoredInputs(); - if (tInputList.isEmpty()) return CheckRecipeResultRegistry.NO_RECIPE; - - long inputVoltage = getMaxInputVoltage(); - - int fakeOriginalMaxParallel = 1; - GT_OverclockCalculator calculator = new GT_OverclockCalculator().setEUt(inputVoltage) - .setRecipeEUt(RECIPE_EUT) - .setDuration(RECIPE_DURATION) - .setParallel(fakeOriginalMaxParallel); - - int maxParallel = this.mLevel; - int originalMaxParallel = maxParallel; - double tickTimeAfterOC = calculator.calculateDurationUnderOneTick(); - if (tickTimeAfterOC < 1) { - maxParallel = GT_Utility.safeInt((long) (maxParallel / tickTimeAfterOC), 0); - } - - int maxParallelBeforeBatchMode = maxParallel; - if (isBatchModeEnabled()) { - maxParallel = GT_Utility.safeInt((long) maxParallel * getMaxBatchSize(), 0); - } - - // Calculate parallel - int currentParallel = 0; - for (ItemStack item : tInputList) { - ItemStack smeltedOutput = GT_ModHandler.getSmeltingOutput(item, false, null); - if (smeltedOutput != null) { - if (item.stackSize <= (maxParallel - currentParallel)) { - currentParallel += item.stackSize; - } else { - currentParallel = maxParallel; - break; - } - } - } - if (currentParallel <= 0) { - return CheckRecipeResultRegistry.NO_RECIPE; - } - int currentParallelBeforeBatchMode = Math.min(currentParallel, maxParallelBeforeBatchMode); - int fakeCurrentParallel = (int) Math.ceil((double) currentParallelBeforeBatchMode / originalMaxParallel); - - calculator.setCurrentParallel(fakeCurrentParallel) - .calculate(); - - double batchMultiplierMax = 1; - // In case batch mode enabled - if (currentParallel > maxParallelBeforeBatchMode && calculator.getDuration() < getMaxBatchSize()) { - batchMultiplierMax = (double) getMaxBatchSize() / calculator.getDuration(); - batchMultiplierMax = Math.min(batchMultiplierMax, (double) currentParallel / maxParallelBeforeBatchMode); - } - int finalParallel = (int) (batchMultiplierMax * maxParallelBeforeBatchMode); - - // Consume inputs and generate outputs - ArrayList smeltedOutputs = new ArrayList<>(); - int remainingCost = finalParallel; - for (ItemStack item : tInputList) { - ItemStack smeltedOutput = GT_ModHandler.getSmeltingOutput(item, false, null); - if (smeltedOutput != null) { - if (remainingCost >= item.stackSize) { - remainingCost -= item.stackSize; - smeltedOutput.stackSize *= item.stackSize; - item.stackSize = 0; - smeltedOutputs.add(smeltedOutput); - } else { - smeltedOutput.stackSize *= remainingCost; - item.stackSize -= remainingCost; - smeltedOutputs.add(smeltedOutput); - break; - } - } - } - this.mOutputItems = smeltedOutputs.toArray(new ItemStack[0]); - - this.mEfficiency = 10000 - (getIdealStatus() - getRepairStatus()) * 1000; - this.mEfficiencyIncrease = 10000; - this.mMaxProgresstime = (int) (calculator.getDuration() * batchMultiplierMax); - this.lEUt = calculator.getConsumption(); - - if (this.lEUt > 0) this.lEUt = -this.lEUt; - - updateSlots(); - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - this.mLevel = 0; - this.mCostDiscount = 1; - - replaceDeprecatedCoils(aBaseMetaTileEntity); - - setCoilLevel(HeatingCoilLevel.None); - - if (!checkPiece(STRUCTURE_PIECE_MAIN, 1, 2, 0)) return false; - - if (getCoilLevel() == HeatingCoilLevel.None) return false; - - if (mMaintenanceHatches.size() != 1) return false; - - if (getCoilLevel().getHeat() < 9000) { - this.mLevel = 8 * getCoilLevel().getLevel(); - } else { - this.mLevel = 1 << (getCoilLevel().getTier()); - } - this.mCostDiscount = getCoilLevel().getCostDiscount(); - return true; - } - - private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) { - final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; - final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; - final int tX = aBaseMetaTileEntity.getXCoord() + xDir; - final int tY = aBaseMetaTileEntity.getYCoord(); - final int tZ = aBaseMetaTileEntity.getZCoord() + zDir; - int tUsedMeta; - for (int xPos = tX - 1; xPos <= tX + 1; xPos++) for (int zPos = tZ - 1; zPos <= tZ + 1; zPos++) { - if ((xPos == tX) && (zPos == tZ)) continue; - tUsedMeta = aBaseMetaTileEntity.getMetaID(xPos, tY + 1, zPos); - if (tUsedMeta >= 12 && tUsedMeta <= 14 - && aBaseMetaTileEntity.getBlock(xPos, tY + 1, zPos) == GregTech_API.sBlockCasings1) - aBaseMetaTileEntity.getWorld() - .setBlock(xPos, tY + 1, zPos, GregTech_API.sBlockCasings5, tUsedMeta - 12, 3); - } - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (final GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - - long storedEnergy = 0; - long maxEnergy = 0; - for (final GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - - return new String[] { - StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(-lEUt) - + EnumChatFormatting.RESET - + " EU/t", - StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getMaxInputVoltage()) - + EnumChatFormatting.RESET - + " EU/t(*2A) " - + StatCollector.translateToLocal("GT5U.machines.tier") - + ": " - + EnumChatFormatting.YELLOW - + VN[GT_Utility.getTier(getMaxInputVoltage())] - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " - + EnumChatFormatting.RED - + (getIdealStatus() - getRepairStatus()) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.multiblock.efficiency") - + ": " - + EnumChatFormatting.YELLOW - + mEfficiency / 100.0F - + EnumChatFormatting.RESET - + " %", - StatCollector.translateToLocal("GT5U.MS.multismelting") + ": " - + EnumChatFormatting.GREEN - + mLevel - + EnumChatFormatting.RESET - + " Discount: (EU/t) / " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mCostDiscount) - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %" }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 2, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 2, 0, elementBudget, env, false, true); - } - - @Override - public boolean supportsBatchMode() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiLathe.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiLathe.java deleted file mode 100644 index dc15d89c70..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiLathe.java +++ /dev/null @@ -1,377 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -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.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_Values.AuthorVolence; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -import java.text.DecimalFormat; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import org.apache.commons.lang3.tuple.Pair; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import 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.GregTechTileClientEvents; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -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.blocks.GT_Block_Casings2; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_MultiLathe extends GT_MetaTileEntity_EnhancedMultiBlockBase - implements ISurvivalConstructable { - - public GT_MetaTileEntity_MultiLathe(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_MultiLathe(String aName) { - super(aName); - } - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final String STRUCTURE_PIECE_BODY = "body"; - private static final String STRUCTURE_PIECE_BODY_ALT = "body_alt"; - - protected int pipeTier = 0; - - public enum PipeTiers { - - Platinum(4, 1F), - Osmium(8, 1.25F), - Quantium(12, 1.5F), - FluxedElectrum(16, 2F), - BlackPlutonium(32, 2.5F); - - final int maxParallel; - final float speedBoost; - - PipeTiers(int maxParallel, float speedBoost) { - this.maxParallel = maxParallel; - this.speedBoost = speedBoost; - } - } - - private PipeTiers getPipeData() { - pipeTier = getPipeTier(); - return switch (pipeTier) { - case 2 -> PipeTiers.Osmium; - case 3 -> PipeTiers.Quantium; - case 4 -> PipeTiers.FluxedElectrum; - case 5 -> PipeTiers.BlackPlutonium; - default -> PipeTiers.Platinum; - }; - } - - // get tier from block meta - private static Integer getTierFromMeta(Block block, Integer metaID) { - if (block != GregTech_API.sBlockCasings11) return -1; - if (metaID < 3 || metaID > 7) return -1; - return (metaID - 2); - } - - private void setPipeTier(int tier) { - pipeTier = tier; - } - - private int getPipeTier() { - return pipeTier; - } - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose(new String[][] { { " " }, { " " }, { " " }, { " " }, { "AAA~AAA" } })) - .addShape( - STRUCTURE_PIECE_BODY, - (transpose( - new String[][] { { " ", "AAAAAAA", " ", " " }, - { "DBCCCCD", "DBCCCCD", "DBCCCCD", " " }, { "DBCCCCD", "DBFFFFD", "DBCCCCD", " " }, - { "DBCCCCD", "DBCCCCD", "DBCCCCD", " " }, { "AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA" } }))) - .addShape( - STRUCTURE_PIECE_BODY_ALT, - (transpose( - new String[][] { { " ", "AAAAAAA", " ", " " }, - { "DCCCCBD", "DCCCCBD", "DCCCCBD", " " }, { "DCCCCBD", "DFFFFBD", "DCCCCBD", " " }, - { "DCCCCBD", "DCCCCBD", "DCCCCBD", " " }, { "AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA" } }))) - .addElement( - 'A', - buildHatchAdder(GT_MetaTileEntity_MultiLathe.class).atLeast(Maintenance, Muffler, Energy) - .casingIndex(((GT_Block_Casings2) GregTech_API.sBlockCasings2).getTextureIndex(0)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_MultiLathe::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings2, 0)))) - .addElement('B', ofBlock(GregTech_API.sBlockCasings3, 10)) // Steel Casings - .addElement('C', Glasses.chainAllGlasses()) // Glass - .addElement( - 'D', - buildHatchAdder(GT_MetaTileEntity_MultiLathe.class) - .atLeast(InputBus, OutputBus, Maintenance, Muffler, Energy) - .casingIndex(((GT_Block_Casings2) GregTech_API.sBlockCasings2).getTextureIndex(0)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_MultiLathe::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings2, 0)))) - .addElement( - 'F', - ofBlocksTiered( - GT_MetaTileEntity_MultiLathe::getTierFromMeta, - ImmutableList.of( - Pair.of(GregTech_API.sBlockCasings11, 3), - Pair.of(GregTech_API.sBlockCasings11, 4), - Pair.of(GregTech_API.sBlockCasings11, 5), - Pair.of(GregTech_API.sBlockCasings11, 6), - Pair.of(GregTech_API.sBlockCasings11, 7)), - -2, - GT_MetaTileEntity_MultiLathe::setPipeTier, - GT_MetaTileEntity_MultiLathe::getPipeTier)) - .build(); - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_MultiLathe(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings2, 0)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_LATHE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_LATHE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings2, 0)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_LATHE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_LATHE_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings2, 0)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Lathe") - .addInfo("Controller Block for the Industrial Precision Lathe") - .addInfo("Gains 2 parallels per voltage tier,") - .addInfo("and 4 parallels per pipe casing tier (16 for Black Plutonium)") - .addInfo("Better pipe casings increase speed") - .addInfo("Only uses 80% of the recipe's required energy") - .addInfo(AuthorVolence) - .addSeparator() - .beginStructureBlock(7, 5, 5, true) - .addController("Front Center") - .addCasingInfoMin("Solid Steel Machine Casing", 36, false) - .addCasingInfoExactly("Steel Pipe Casing", 8, false) - .addInputBus("Any of the 9 Solid Steel Casing at Each End", 1) - .addOutputBus("Any of the 9 Solid Steel Casing at Each End", 1) - .addEnergyHatch("Any Solid Steel Casing", 1) - .addMaintenanceHatch("Any Solid Steel Casing", 1) - .addMufflerHatch("Any Solid Steel Casing", 1) - .addOtherStructurePart("4 Item Pipe Casings", "Center of the glass", 4) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 4, 0); - buildPiece(STRUCTURE_PIECE_BODY, stackSize, hintsOnly, 3, 4, -1); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - int build = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 4, 0, elementBudget, env, false, true); - if (build >= 0) return build; - build = survivialBuildPiece(STRUCTURE_PIECE_BODY, stackSize, 3, 4, -1, elementBudget, env, false, true); - if (build >= 0) return build; - build = survivialBuildPiece(STRUCTURE_PIECE_BODY_ALT, stackSize, 3, 4, -1, elementBudget, env, false, true); - return build; - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - pipeTier = -2; - mEnergyHatches.clear(); - if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 4, 0)) return false; - getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); - if (!checkPiece(STRUCTURE_PIECE_BODY, 3, 4, -1) && !checkPiece(STRUCTURE_PIECE_BODY_ALT, 3, 4, -1)) - return false; - return this.mMaintenanceHatches.size() == 1 && pipeTier >= -1 - && mEnergyHatches.size() >= 1 - && mInputBusses.size() >= 1 - && mMufflerHatches.size() == 1; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() - .setSpeedBonus(1F / (getPipeData().speedBoost + GT_Utility.getTier(this.getMaxInputVoltage()) / 4F)) - .setEuModifier(0.8F) - .setMaxParallelSupplier(this::getMaxParallelRecipes); - } - - public int getMaxParallelRecipes() { - return getPipeData().maxParallel + (GT_Utility.getTier(this.getMaxInputVoltage()) * 2); - } - - @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("itemPipeTier", Math.max(0, pipeTier)); - tag.setFloat( - "speedBonus", - Math.max(0, 100 / (1F / (getPipeData().speedBoost + GT_Utility.getTier(this.getMaxInputVoltage()) / 4F)))); - tag.setFloat("getMaxParallelRecipes", Math.max(0, getMaxParallelRecipes())); - } - - private static final DecimalFormat dfNone = new DecimalFormat("#"); - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currenttip, accessor, config); - NBTTagCompound tag = accessor.getNBTData(); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.itemPipeTier") + ": " - + EnumChatFormatting.WHITE - + Math.max(0, tag.getInteger("itemPipeTier"))); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " - + EnumChatFormatting.WHITE - + dfNone.format(Math.max(0, tag.getFloat("getMaxParallelRecipes")))); - currenttip.add( - StatCollector.translateToLocal("GT5U.multiblock.speed") + ": " - + EnumChatFormatting.WHITE - + dfNone.format(Math.max(0, tag.getFloat("speedBonus"))) - + "%"); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.latheRecipes; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java deleted file mode 100644 index adceabd70c..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java +++ /dev/null @@ -1,467 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.ExoticEnergy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_Values.AuthorBlueWeabo; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.MaterialsUEVplus; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Casings8; - -public class GT_MetaTileEntity_NanoForge extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final String STRUCTURE_PIECE_TIER2 = "tier2"; - private static final String STRUCTURE_PIECE_TIER3 = "tier3"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - // spotless:off - .addShape(STRUCTURE_PIECE_MAIN, transpose(new String[][] { - {" "," "," F "," C "," C "," C "," C "," F "," "," "}, - {" "," "," F "," C "," C "," C "," C "," F "," "," "}, - {" "," "," F "," C "," C "," C "," C "," F "," "," "}, - {" "," "," F "," C "," C "," C "," C "," F "," "," "}, - {" "," "," F "," C "," C "," C "," C "," F "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, - {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, - {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, - {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "}, - {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "}, - {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, - {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, - {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, - {" "," BB~BB "," BBBBBBB ","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB"," BBBBBBB "," BBBBB "," "} - })) - .addShape(STRUCTURE_PIECE_TIER2, transpose(new String[][] { - {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, - {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "}, - {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, - {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "}, - {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, - {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "} - })) - .addShape(STRUCTURE_PIECE_TIER3, transpose(new String[][] { - {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, - {" ", " ", " FFAA ", " ACCA ", " ACCA ", " AAFF ", " ", " "}, - {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "}, - {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "}, - {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, - {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, - {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, - {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, - {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "}, - {" ", " ", " CC F", " CCCC F", "F CCCC ", "F CC ", " ", " "}, - {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "}, - {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "}, - {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "}, - {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, - {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "}, - {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "}, - {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, - {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, - {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, - {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, - {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "}, - {" ", " ", " AA F", " ACCA F", "F ACCA ", "F AA ", " ", " "}, - {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "}, - {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, - {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, - {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, - {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "} - })) - //spotless:on - .addElement('F', ofFrame(Materials.StellarAlloy)) - .addElement('C', ofBlock(GregTech_API.sBlockCasings8, 10)) - .addElement('A', ofBlock(GregTech_API.sBlockCasings2, 5)) - .addElement( - 'B', - buildHatchAdder(GT_MetaTileEntity_NanoForge.class) - .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy)) - .dot(1) - .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(10)) - .buildAndChain(GregTech_API.sBlockCasings8, 10)) - .build(); - private byte mSpecialTier = 0; - - public GT_MetaTileEntity_NanoForge(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_NanoForge(String aName) { - super(aName); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.nanoForgeRecipes; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 4, 37, 1); - if (stackSize.stackSize > 1) { - buildPiece(STRUCTURE_PIECE_TIER2, stackSize, hintsOnly, -7, 14, 4); - } - if (stackSize.stackSize > 2) { - buildPiece(STRUCTURE_PIECE_TIER3, stackSize, hintsOnly, 14, 26, 4); - } - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_NanoForge(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) return new ITexture[] { - BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { - BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { - BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)) }; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @Override - protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - return recipe.mSpecialValue <= mSpecialTier ? CheckRecipeResultRegistry.SUCCESSFUL - : CheckRecipeResultRegistry.NO_RECIPE; - } - - @Nonnull - @Override - protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return super.createOverclockCalculator(recipe) - .setDurationDecreasePerOC(mSpecialTier > recipe.mSpecialValue ? 4.0 : 2.0); - } - }; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(getMaxInputEu()); - logic.setAvailableAmperage(1); - logic.setAmperageOC(false); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide()) { - // TODO: Look for proper fix - // Updates every 10 sec - if (mUpdate <= -150) mUpdate = 50; - } - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mSpecialTier = 0; - if (checkPiece(STRUCTURE_PIECE_MAIN, 4, 37, 1) && aStack != null) { - if (aStack.isItemEqual(Materials.Carbon.getNanite(1))) { - mSpecialTier = 1; - } - - if (aStack.isItemEqual(Materials.Neutronium.getNanite(1)) && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4)) { - mSpecialTier = 2; - } - - if (aStack.isItemEqual(MaterialsUEVplus.TranscendentMetal.getNanite(1)) - && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4) - && checkPiece(STRUCTURE_PIECE_TIER3, 14, 26, 4)) { - mSpecialTier = 3; - } - } - - if (mMaintenanceHatches.size() != 1) { - return false; - } - - if (!checkExoticAndNormalEnergyHatches()) { - return false; - } - - return mSpecialTier > 0; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 4, 37, 1, elementBudget, env, false, true); - if (built >= 0) return built; - if (stackSize.stackSize > 1) { - built += survivialBuildPiece(STRUCTURE_PIECE_TIER2, stackSize, -7, 14, 4, elementBudget, env, false, true); - } - if (stackSize.stackSize > 2) { - built += survivialBuildPiece(STRUCTURE_PIECE_TIER3, stackSize, 14, 26, 4, elementBudget, env, false, true); - } - return built; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setByte("mSpecialTier", mSpecialTier); - } - - @Override - public void loadNBTData(final NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("mSeparate")) { - // backward compatibility - inputSeparation = aNBT.getBoolean("mSeparate"); - } - mSpecialTier = aNBT.getByte("mSpecialTier"); - } - - @Override - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - super.drawTexts(screenElements, inventorySlot); - screenElements - .widget( - new TextWidget(StatCollector.translateToLocal("GT5U.gui.button.tier") + " " + mSpecialTier) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setEnabled(widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0)) - .widget( - new FakeSyncWidget.IntegerSyncer( - () -> (int) mSpecialTier, - val -> mSpecialTier = (byte) (val % Byte.MAX_VALUE))); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Nanite Fabricator") - .addInfo("Controller block for the Nano Forge") - .addInfo("Requires insane amounts of power to create nanites. Each tier") - .addInfo("the multi gains a new building next to it. The nanite in the") - .addInfo("controller slot controls the tier.") - .addInfo("--------------------------------------------") - .addInfo("Requires a Carbon Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 1) - .addInfo("Requires a Neutronium Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 2) - .addInfo("Requires a Transcendent Metal Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 3) - .addInfo("--------------------------------------------") - .addInfo("If a recipe's tier is lower than the tier of the Nano Forge") - .addInfo("it gains " + EnumChatFormatting.RED + "perfect overclock" + EnumChatFormatting.GRAY + ".") - .addInfo(AuthorBlueWeabo) - .addSeparator() - .beginStructureBlock(30, 38, 13, false) - .addStructureInfo("Nano Forge Structure is too complex! See schematic for details.") - .addStructureInfo("--------------------------------------------") - .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 1 + EnumChatFormatting.GRAY) - .addStructureInfo( - EnumChatFormatting.GOLD + "527" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "171" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box") - .addStructureInfo("--------------------------------------------") - .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 2 + EnumChatFormatting.GRAY) - .addStructureInfo( - EnumChatFormatting.GOLD + "148" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing") - .addStructureInfo("--------------------------------------------") - .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 3 + EnumChatFormatting.GRAY) - .addStructureInfo( - EnumChatFormatting.GOLD + "228" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "84" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box") - .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing") - .addStructureInfo("--------------------------------------------") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + "1" - + EnumChatFormatting.GRAY - + "-" - + EnumChatFormatting.GOLD - + "2" - + EnumChatFormatting.GRAY - + " energy hatches or " - + EnumChatFormatting.GOLD - + "1" - + EnumChatFormatting.GRAY - + " TT energy hatch.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + " maintenance hatch.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + 1 - + EnumChatFormatting.GRAY - + "+" - + EnumChatFormatting.GRAY - + " input hatches.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + 0 - + EnumChatFormatting.GRAY - + "+" - + EnumChatFormatting.GRAY - + " output hatches.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + 1 - + EnumChatFormatting.GRAY - + "+" - + EnumChatFormatting.GRAY - + " input busses.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + 1 - + EnumChatFormatting.GRAY - + "+" - + EnumChatFormatting.GRAY - + " output busses.") - .addStructureInfo("--------------------------------------------") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - inputSeparation = !inputSeparation; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java deleted file mode 100644 index 9ca671aa49..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java +++ /dev/null @@ -1,423 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofCoil; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_HatchElement; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.maps.OilCrackerBackend; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME; -import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch; - -public class GT_MetaTileEntity_OilCracker extends GT_MetaTileEntity_EnhancedMultiBlockBase - implements ISurvivalConstructable { - - private static final byte CASING_INDEX = 49; - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { { "lcmcr", "lcmcr", "lcmcr" }, { "lc~cr", "l---r", "lcmcr" }, - { "lcmcr", "lcmcr", "lcmcr" }, })) - .addElement('c', ofCoil(GT_MetaTileEntity_OilCracker::setCoilLevel, GT_MetaTileEntity_OilCracker::getCoilLevel)) - .addElement( - 'l', - buildHatchAdder(GT_MetaTileEntity_OilCracker.class) - .atLeast( - GT_HatchElement.InputHatch.withAdder(GT_MetaTileEntity_OilCracker::addLeftHatchToMachineList), - GT_HatchElement.Energy, - GT_HatchElement.Maintenance) - .dot(2) - .casingIndex(CASING_INDEX) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_OilCracker::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings4, 1)))) - .addElement( - 'r', - buildHatchAdder(GT_MetaTileEntity_OilCracker.class) - .atLeast( - GT_HatchElement.OutputHatch.withAdder(GT_MetaTileEntity_OilCracker::addRightHatchToMachineList), - GT_HatchElement.Energy, - GT_HatchElement.Maintenance) - .dot(3) - .casingIndex(CASING_INDEX) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_OilCracker::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings4, 1)))) - .addElement( - 'm', - buildHatchAdder(GT_MetaTileEntity_OilCracker.class) - .atLeast( - GT_HatchElement.InputHatch.withAdder(GT_MetaTileEntity_OilCracker::addMiddleInputToMachineList) - .withCount(t -> t.mMiddleInputHatches.size()), - GT_HatchElement.InputBus, - GT_HatchElement.Energy, - GT_HatchElement.Maintenance) - .dot(1) - .casingIndex(CASING_INDEX) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_OilCracker::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings4, 1)))) - .build(); - private HeatingCoilLevel heatLevel; - protected final List mMiddleInputHatches = new ArrayList<>(); - // 0 -> left, 1 -> right, any other -> not found - protected int mInputOnSide; - protected int mOutputOnSide; - protected int mCasingAmount; - - public GT_MetaTileEntity_OilCracker(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_OilCracker(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Cracker") - .addInfo("Controller block for the Oil Cracking Unit") - .addInfo("Thermally cracks heavy hydrocarbons into lighter fractions") - .addInfo("More efficient than the Chemical Reactor") - .addInfo("Gives different benefits whether it hydro or steam-cracks:") - .addInfo("Hydro - Consumes 20% less Hydrogen and outputs 25% more cracked fluid") - .addInfo("Steam - Outputs 50% more cracked fluid") - .addInfo("(Values compared to cracking in the Chemical Reactor)") - .addInfo("Place the appropriate circuit in the controller or an input bus") - .addSeparator() - .beginStructureBlock(5, 3, 3, true) - .addController("Front center") - .addCasingInfoRange("Clean Stainless Steel Machine Casing", 18, 21, false) - .addOtherStructurePart("2 Rings of 8 Coils", "Each side of the controller") - .addInfo("Gets 10% EU/t reduction per coil tier, up to a maximum of 50%") - .addEnergyHatch("Any casing", 1, 2, 3) - .addMaintenanceHatch("Any casing", 1, 2, 3) - .addInputHatch("For cracking fluid (Steam/Hydrogen/etc.) ONLY, Any middle ring casing", 1) - .addInputHatch("Any left/right side casing", 2, 3) - .addOutputHatch("Any right/left side casing", 2, 3) - .addStructureInfo("Input/Output Hatches must be on opposite sides!") - .addInputBus("Any middle ring casing, optional for programmed circuit automation") - .addStructureHint("GT5U.cracker.io_side") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_CRACKER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_CRACKER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_CRACKER_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.crackingRecipes; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @Nonnull - @Override - public CheckRecipeResult process() { - setEuModifier(1.0F - Math.min(0.1F * (heatLevel.getTier() + 1), 0.5F)); - return super.process(); - } - }; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - public HeatingCoilLevel getCoilLevel() { - return heatLevel; - } - - public void setCoilLevel(HeatingCoilLevel aCoilLevel) { - heatLevel = aCoilLevel; - } - - private boolean addMiddleInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch) { - tHatch.updateTexture(aBaseCasingIndex); - tHatch.mRecipeMap = getRecipeMap(); - return mMiddleInputHatches.add(tHatch); - } - return false; - } - - private boolean addLeftHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch) { - if (mInputOnSide == 1) return false; - mInputOnSide = 0; - mOutputOnSide = 1; - tHatch.updateTexture(aBaseCasingIndex); - tHatch.mRecipeMap = getRecipeMap(); - return mInputHatches.add(tHatch); - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output tHatch) { - if (mOutputOnSide == 1) return false; - mInputOnSide = 1; - mOutputOnSide = 0; - tHatch.updateTexture(aBaseCasingIndex); - return mOutputHatches.add(tHatch); - } - return false; - } - - private boolean addRightHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch) { - if (mInputOnSide == 0) return false; - mInputOnSide = 1; - mOutputOnSide = 0; - tHatch.updateTexture(aBaseCasingIndex); - tHatch.mRecipeMap = getRecipeMap(); - return mInputHatches.add(tHatch); - } - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output tHatch) { - if (mOutputOnSide == 0) return false; - mInputOnSide = 0; - mOutputOnSide = 1; - tHatch.updateTexture(aBaseCasingIndex); - return mOutputHatches.add(tHatch); - } - return false; - } - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - setCoilLevel(HeatingCoilLevel.None); - mCasingAmount = 0; - mMiddleInputHatches.clear(); - mInputOnSide = -1; - mOutputOnSide = -1; - replaceDeprecatedCoils(aBaseMetaTileEntity); - return checkPiece(STRUCTURE_PIECE_MAIN, 2, 1, 0) && mInputOnSide != -1 - && mOutputOnSide != -1 - && mCasingAmount >= 18 - && mMaintenanceHatches.size() == 1 - && !mMiddleInputHatches.isEmpty(); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OilCracker(this.mName); - } - - private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) { - final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; - final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; - final int tX = aBaseMetaTileEntity.getXCoord() + xDir; - final int tY = aBaseMetaTileEntity.getYCoord(); - final int tZ = aBaseMetaTileEntity.getZCoord() + zDir; - for (int xPos = tX - 1; xPos <= tX + 1; xPos += (xDir != 0 ? 1 : 2)) - for (int yPos = tY - 1; yPos <= tY + 1; yPos++) - for (int zPos = tZ - 1; zPos <= tZ + 1; zPos += (xDir != 0 ? 2 : 1)) { - if ((yPos == tY) && (xPos == tX || zPos == tZ)) continue; - final byte tUsedMeta = aBaseMetaTileEntity.getMetaID(xPos, yPos, zPos); - if (tUsedMeta < 12) continue; - if (tUsedMeta > 14) continue; - if (aBaseMetaTileEntity.getBlock(xPos, yPos, zPos) != GregTech_API.sBlockCasings1) continue; - - aBaseMetaTileEntity.getWorld() - .setBlock(xPos, yPos, zPos, GregTech_API.sBlockCasings5, tUsedMeta - 12, 3); - } - } - - @Override - public ArrayList getStoredFluids() { - final ArrayList rList = new ArrayList<>(); - Map inputsFromME = new HashMap<>(); - for (final GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) { - tHatch.mRecipeMap = getRecipeMap(); - if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) { - for (FluidStack tFluid : meHatch.getStoredFluids()) { - if (tFluid != null && !getRecipeMap().getBackend() - .isValidCatalystFluid(tFluid)) { - inputsFromME.put(tFluid.getFluid(), tFluid); - } - } - } else if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput) { - for (final FluidStack tFluid : ((GT_MetaTileEntity_Hatch_MultiInput) tHatch).getStoredFluid()) { - if (tFluid != null && !getRecipeMap().getBackend() - .isValidCatalystFluid(tFluid)) { - rList.add(tFluid); - } - } - } else { - if (tHatch.getFillableStack() != null) { - if (!getRecipeMap().getBackend() - .isValidCatalystFluid(tHatch.getFillableStack())) rList.add(tHatch.getFillableStack()); - } - } - } - for (final GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mMiddleInputHatches)) { - tHatch.mRecipeMap = getRecipeMap(); - if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) { - for (FluidStack tFluid : meHatch.getStoredFluids()) { - if (tFluid != null && getRecipeMap().getBackend() - .isValidCatalystFluid(tFluid)) { - inputsFromME.put(tFluid.getFluid(), tFluid); - } - } - } else if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput) { - for (final FluidStack tFluid : ((GT_MetaTileEntity_Hatch_MultiInput) tHatch).getStoredFluid()) { - if (tFluid != null && getRecipeMap().getBackend() - .isValidCatalystFluid(tFluid)) { - rList.add(tFluid); - } - } - } else { - if (tHatch.getFillableStack() != null) { - final FluidStack tStack = tHatch.getFillableStack(); - if (getRecipeMap().getBackend() - .isValidCatalystFluid(tStack)) { - rList.add(tStack); - } - } - } - } - if (!inputsFromME.isEmpty()) { - rList.addAll(inputsFromME.values()); - } - return rList; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 1, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 1, 0, elementBudget, env, false, true); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - protected void startRecipeProcessing() { - for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mMiddleInputHatches)) { - if (hatch instanceof IRecipeProcessingAwareHatch aware) { - aware.startRecipeProcessing(); - } - } - super.startRecipeProcessing(); - } - - @Override - protected void endRecipeProcessing() { - super.endRecipeProcessing(); - for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mMiddleInputHatches)) { - if (hatch instanceof IRecipeProcessingAwareHatch aware) { - setResultIfFailure(aware.endRecipeProcessing(this)); - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java deleted file mode 100644 index 1e37dcbac9..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_OilDrill1 extends GT_MetaTileEntity_OilDrillBase { - - public GT_MetaTileEntity_OilDrill1(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_OilDrill1(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("I"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OilDrill1(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_SolidSteel; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Steel; - } - - @Override - protected int getCasingTextureIndex() { - return 16; - } - - @Override - protected int getRangeInChunks() { - return 1; - } - - @Override - protected int getMinTier() { - return 2; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java deleted file mode 100644 index 10a64a6b1d..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java +++ /dev/null @@ -1,55 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_OilDrill2 extends GT_MetaTileEntity_OilDrillBase { - - public GT_MetaTileEntity_OilDrill2(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_OilDrill2(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("II"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OilDrill2(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_CleanStainlessSteel; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.StainlessSteel; - } - - @Override - protected int getCasingTextureIndex() { - return GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 1); - } - - @Override - protected int getRangeInChunks() { - return 2; - } - - @Override - protected int getMinTier() { - return 3; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java deleted file mode 100644 index bcbe42d794..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java +++ /dev/null @@ -1,55 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_OilDrill3 extends GT_MetaTileEntity_OilDrillBase { - - public GT_MetaTileEntity_OilDrill3(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_OilDrill3(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("III"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OilDrill3(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_StableTitanium; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Titanium; - } - - @Override - protected int getCasingTextureIndex() { - return GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2); - } - - @Override - protected int getRangeInChunks() { - return 4; - } - - @Override - protected int getMinTier() { - return 4; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java deleted file mode 100644 index 802e9f1c5c..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java +++ /dev/null @@ -1,55 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_OilDrill4 extends GT_MetaTileEntity_OilDrillBase { - - public GT_MetaTileEntity_OilDrill4(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_OilDrill4(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("IV"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OilDrill4(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_RobustTungstenSteel; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.TungstenSteel; - } - - @Override - protected int getCasingTextureIndex() { - return GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 0); - } - - @Override - protected int getRangeInChunks() { - return 8; - } - - @Override - protected int getMinTier() { - return 5; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java deleted file mode 100644 index 075b4e19a1..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java +++ /dev/null @@ -1,489 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.GT_Values.debugDriller; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; -import static gregtech.common.GT_UndergroundOil.undergroundOil; -import static gregtech.common.GT_UndergroundOil.undergroundOilReadInformation; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.annotation.Nonnegative; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetricsExporter; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.objects.GT_ChunkManager; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.ValidationResult; -import gregtech.api.util.ValidationType; - -public abstract class GT_MetaTileEntity_OilDrillBase extends GT_MetaTileEntity_DrillerBase implements IMetricsExporter { - - private final ArrayList mOilFieldChunks = new ArrayList<>(); - private int mOilId = 0; - private int mOilFlow = 0; - - private int chunkRangeConfig = getRangeInChunks(); - - public GT_MetaTileEntity_OilDrillBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_OilDrillBase(String aName) { - super(aName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_DRILL_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_DRILL) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_OIL_DRILL_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { getCasingTextureForId(casingTextureIndex) }; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("mOilId", mOilId); - aNBT.setInteger("chunkRangeConfig", chunkRangeConfig); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mOilId = aNBT.getInteger("mOilId"); - if (aNBT.hasKey("chunkRangeConfig")) chunkRangeConfig = aNBT.getInteger("chunkRangeConfig"); - } - - protected GT_Multiblock_Tooltip_Builder createTooltip(String tierSuffix) { - String casings = getCasingBlockItem().get(0) - .getDisplayName(); - - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Pump") - .addInfo("Controller Block for the Oil/Gas/Fluid Drilling Rig " + (tierSuffix != null ? tierSuffix : "")) - .addInfo("Works on " + getRangeInChunks() + "x" + getRangeInChunks() + " chunks") - .addInfo("Use a Screwdriver to configure range") - .addInfo("Use Programmed Circuits to ignore near exhausted oil field") - .addInfo("If total circuit # is greater than output amount it will halt. If it worked right.") // doesn't - // work - .addSeparator() - .beginStructureBlock(3, 7, 3, false) - .addController("Front bottom") - .addOtherStructurePart(casings, "form the 3x1x3 Base") - .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") - .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") - .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1) - .addMaintenanceHatch("Any base casing", 1) - .addInputBus("Mining Pipes or Circuits, optional, any base casing", 1) - .addOutputHatch("Any base casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - protected abstract int getRangeInChunks(); - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); - int oldChunkRange = chunkRangeConfig; - if (aPlayer.isSneaking()) { - if (chunkRangeConfig > 0) { - chunkRangeConfig--; - } - if (chunkRangeConfig == 0) chunkRangeConfig = getRangeInChunks(); - } else { - if (chunkRangeConfig <= getRangeInChunks()) { - chunkRangeConfig++; - } - if (chunkRangeConfig > getRangeInChunks()) chunkRangeConfig = 1; - } - if (oldChunkRange != chunkRangeConfig) mOilFieldChunks.clear(); - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.machines.workareaset") + " " - + chunkRangeConfig - + "x" - + chunkRangeConfig - + StatCollector.translateToLocal("GT5U.machines.chunks")); // TODO Add translation support - } - - @Override - protected boolean checkHatches() { - return !mMaintenanceHatches.isEmpty() && !mOutputHatches.isEmpty() && mEnergyHatches.size() == 1; - } - - @Override - protected List> getAllowedHatches() { - return ImmutableList.of(InputBus, OutputHatch, Maintenance, Energy); - } - - @Override - protected void setElectricityStats() { - this.mEfficiency = getCurrentEfficiency(null); - this.mEfficiencyIncrease = 10000; - int tier = Math.max(0, GT_Utility.getTier(getMaxInputVoltage())); - this.mEUt = -7 << (tier << 1); // (1/4) A of current tier when at bottom (7/8) A of current tier while mining - this.mMaxProgresstime = Math.max( - 1, - (workState == STATE_AT_BOTTOM ? (64 * (chunkRangeConfig * chunkRangeConfig)) >> (getMinTier() - 1) : 120) - >> tier); - } - - protected float computeSpeed() { - return .5F + (GT_Utility.getTier(getMaxInputVoltage()) - getMinTier()) * .25F; - } - - @Override - protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - switch (tryLowerPipeState(true)) { - case 0 -> { - workState = STATE_DOWNWARD; - setElectricityStats(); - return true; - } - case 3 -> { - workState = STATE_UPWARD; - return true; - } - } - - if (reachingVoidOrBedrock() && tryFillChunkList()) { - if (mWorkChunkNeedsReload) { - mCurrentChunk = new ChunkCoordIntPair(xDrill >> 4, zDrill >> 4); - GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), null); - mWorkChunkNeedsReload = false; - } - float speed = computeSpeed(); - ValidationResult pumpResult = tryPumpOil(speed); - if (pumpResult.getType() != ValidationType.VALID) { - mEUt = 0; - mMaxProgresstime = 0; - setRuntimeFailureReason(CheckRecipeResultRegistry.FLUID_OUTPUT_FULL); - return false; - } - FluidStack tFluid = pumpResult.getResult(); - if (tFluid != null && tFluid.amount > getTotalConfigValue()) { - this.mOutputFluids = new FluidStack[] { tFluid }; - return true; - } - } - GT_ChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity()); - workState = STATE_UPWARD; - setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.drill_exhausted")); - return true; - } - - private boolean tryFillChunkList() { - FluidStack tFluid, tOil; - if (mOilId <= 0) { - tFluid = undergroundOilReadInformation(getBaseMetaTileEntity()); - if (tFluid == null) return false; - mOilId = tFluid.getFluidID(); - } - if (debugDriller) { - GT_Log.out.println(" Driller on fluid = " + mOilId); - } - - tOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0); - - if (mOilFieldChunks.isEmpty()) { - Chunk tChunk = getBaseMetaTileEntity().getWorld() - .getChunkFromBlockCoords(getBaseMetaTileEntity().getXCoord(), getBaseMetaTileEntity().getZCoord()); - int range = chunkRangeConfig; - int xChunk = Math.floorDiv(tChunk.xPosition, range) * range; // Java was written by idiots. For negative - // values, / returns rounded towards zero. - // Fucking morons. - int zChunk = Math.floorDiv(tChunk.zPosition, range) * range; - if (debugDriller) { - GT_Log.out.println( - "tChunk.xPosition = " + tChunk.xPosition - + " tChunk.zPosition = " - + tChunk.zPosition - + " xChunk = " - + xChunk - + " zChunk = " - + zChunk); - } - for (int i = 0; i < range; i++) { - for (int j = 0; j < range; j++) { - if (debugDriller) { - GT_Log.out.println(" getChunkX = " + (xChunk + i) + " getChunkZ = " + (zChunk + j)); - } - tChunk = getBaseMetaTileEntity().getWorld() - .getChunkFromChunkCoords(xChunk + i, zChunk + j); - tFluid = undergroundOilReadInformation(tChunk); - if (debugDriller) { - GT_Log.out.println( - " Fluid in chunk = " + tFluid.getFluid() - .getID()); - } - if (tOil.isFluidEqual(tFluid) && tFluid.amount > 0) { - mOilFieldChunks.add(tChunk); - if (debugDriller) { - GT_Log.out.println(" Matching fluid, quantity = " + tFluid.amount); - } - } - } - } - } - if (debugDriller) { - GT_Log.out.println("mOilFieldChunks.size = " + mOilFieldChunks.size()); - } - return !mOilFieldChunks.isEmpty(); - } - - /** - * Tries to pump oil, accounting for output space if void protection is enabled. - *

- * If pumped fluid will not fit in output hatches, it returns a result with INVALID. - *

- * If vein is depleted, it returns a result with VALID and null fluid. - */ - protected ValidationResult tryPumpOil(float speed) { - if (mOilId <= 0) return null; - if (debugDriller) { - GT_Log.out.println(" pump speed = " + speed); - } - - // Even though it works fine without this check, - // it can save tiny amount of CPU time when void protection is disabled - if (protectsExcessFluid()) { - FluidStack simulatedOil = pumpOil(speed, true); - if (!canOutputAll(new FluidStack[] { simulatedOil })) { - return ValidationResult.of(ValidationType.INVALID, null); - } - } - - FluidStack pumpedOil = pumpOil(speed, false); - mOilFlow = pumpedOil.amount; - return ValidationResult.of(ValidationType.VALID, pumpedOil.amount == 0 ? null : pumpedOil); - } - - /** - * @param speed Speed to pump oil - * @param simulate If true, it actually does not consume vein - * @return Fluid pumped - */ - protected FluidStack pumpOil(@Nonnegative float speed, boolean simulate) { - if (speed < 0) { - throw new IllegalArgumentException("Don't pass negative speed"); - } - - ArrayList emptyChunks = new ArrayList<>(); - FluidStack returnOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0); - - for (Chunk tChunk : mOilFieldChunks) { - FluidStack pumped = undergroundOil(tChunk, simulate ? -speed : speed); - if (debugDriller) { - GT_Log.out.println( - " chunkX = " + tChunk.getChunkCoordIntPair().chunkXPos - + " chunkZ = " - + tChunk.getChunkCoordIntPair().chunkZPos); - if (pumped != null) { - GT_Log.out.println(" Fluid pumped = " + pumped.amount); - } else { - GT_Log.out.println(" No fluid pumped "); - } - } - if (pumped == null || pumped.amount < 1) { - emptyChunks.add(tChunk); - continue; - } - if (returnOil.isFluidEqual(pumped)) { - returnOil.amount += pumped.amount; - } - } - for (Chunk tChunk : emptyChunks) { - mOilFieldChunks.remove(tChunk); - } - return returnOil; - } - - @Override - protected SoundResource getProcessStartSound() { - return SoundResource.IC2_MACHINES_PUMP_OP; - } - - @Override - public String[] getInfoData() { - List l = new ArrayList<>( - Arrays.asList( - EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.oilfluidpump") - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.machines.workarea") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(chunkRangeConfig) - + " x " - + GT_Utility.formatNumbers(chunkRangeConfig) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.machines.chunks"), - "Drilling fluid: " + EnumChatFormatting.GREEN + getFluidName() + EnumChatFormatting.RESET, - "Drilling flow: " + EnumChatFormatting.GREEN - + getFlowRatePerTick() - + EnumChatFormatting.RESET - + " L/t")); - l.addAll(Arrays.asList(super.getInfoData())); - return l.toArray(new String[0]); - } - - @Override - public @NotNull List reportMetrics() { - final boolean machineIsActive = getBaseMetaTileEntity().isActive(); - final String failureReason = getFailureReason() - .map(reason -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_reason", reason)) - .orElseGet(() -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_generic")); - - if (workState == STATE_AT_BOTTOM) { - final ImmutableList.Builder builder = ImmutableList.builder(); - builder.add(StatCollector.translateToLocalFormatted("GT5U.gui.text.pump_fluid_type", getFluidName())); - - if (machineIsActive) { - builder.add( - StatCollector.translateToLocalFormatted( - "GT5U.gui.text.pump_rate.1", - EnumChatFormatting.AQUA + numberFormat.format(getFlowRatePerTick())) - + StatCollector.translateToLocal("GT5U.gui.text.pump_rate.2"), - mOilFlow + StatCollector.translateToLocal("GT5U.gui.text.pump_recovery.2")); - } else { - builder.add(failureReason); - } - - return builder.build(); - } - - if (machineIsActive) { - return switch (workState) { - case STATE_DOWNWARD -> ImmutableList.of(StatCollector.translateToLocal("GT5U.gui.text.deploying_pipe")); - case STATE_UPWARD, STATE_ABORT -> ImmutableList - .of(StatCollector.translateToLocal("GT5U.gui.text.retracting_pipe")); - default -> ImmutableList.of(); - }; - } - - return ImmutableList.of(failureReason); - } - - protected int getFlowRatePerTick() { - return this.mMaxProgresstime > 0 ? (mOilFlow / this.mMaxProgresstime) : 0; - } - - @NotNull - private String getFluidName() { - if (mOilId > 0) { - final Fluid fluid = FluidRegistry.getFluid(mOilId); - return fluid.getLocalizedName(new FluidStack(fluid, 0)); - } - return "None"; - } - - private @NotNull String clientFluidType = ""; - private int clientFlowPerTick = 0; - private int clientFlowPerOperation = 0; - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - @Override - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - super.drawTexts(screenElements, inventorySlot); - screenElements - .widget( - new TextWidget() - .setStringSupplier( - () -> EnumChatFormatting.GRAY - + StatCollector.translateToLocalFormatted("GT5U.gui.text.pump_fluid_type", clientFluidType)) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM)) - .widget( - new TextWidget() - .setStringSupplier( - () -> EnumChatFormatting.GRAY - + StatCollector.translateToLocalFormatted( - "GT5U.gui.text.pump_rate.1", - EnumChatFormatting.AQUA + numberFormat.format(clientFlowPerTick)) - + EnumChatFormatting.GRAY - + StatCollector.translateToLocal("GT5U.gui.text.pump_rate.2")) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM)) - .widget( - new TextWidget() - .setStringSupplier( - () -> EnumChatFormatting.GRAY - + StatCollector.translateToLocalFormatted( - "GT5U.gui.text.pump_recovery.1", - EnumChatFormatting.AQUA + numberFormat.format(clientFlowPerOperation)) - + EnumChatFormatting.GRAY - + StatCollector.translateToLocal("GT5U.gui.text.pump_recovery.2")) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM)) - .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, newInt -> workState = newInt)) - .widget(new FakeSyncWidget.StringSyncer(this::getFluidName, newString -> clientFluidType = newString)) - .widget(new FakeSyncWidget.IntegerSyncer(this::getFlowRatePerTick, newInt -> clientFlowPerTick = newInt)) - .widget(new FakeSyncWidget.IntegerSyncer(() -> mOilFlow, newInt -> clientFlowPerOperation = newInt)); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java deleted file mode 100644 index 056577e8e8..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java +++ /dev/null @@ -1,87 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.GT_Values.VN; - -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_OilDrillInfinite extends GT_MetaTileEntity_OilDrillBase { - - public GT_MetaTileEntity_OilDrillInfinite(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_OilDrillInfinite(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - String casings = getCasingBlockItem().get(0) - .getDisplayName(); - - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Pump") - .addInfo("Controller Block for the Infinite Oil/Gas/Fluid Drilling Rig ") - .addInfo("Works on " + getRangeInChunks() + "x" + getRangeInChunks() + " chunks") - .addSeparator() - .beginStructureBlock(3, 7, 3, false) - .addController("Front bottom") - .addOtherStructurePart(casings, "form the 3x1x3 Base") - .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") - .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") - .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1) - .addMaintenanceHatch("Any base casing", 1) - .addInputBus("Mining Pipes or Circuits, optional, any base casing", 1) - .addOutputHatch("Any base casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OilDrillInfinite(mName); - } - - @Override - protected FluidStack pumpOil(float speed, boolean simulate) { - // always simulate to not deplete vein - return super.pumpOil(speed, true); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_MiningNeutronium; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Neutronium; - } - - @Override - protected int getCasingTextureIndex() { - return 178; - } - - @Override - protected int getRangeInChunks() { - return 8; - } - - @Override - protected float computeSpeed() { - return .5F + (GT_Utility.getTier(getMaxInputVoltage()) - getMinTier() + 5) * .25F; - } - - @Override - protected int getMinTier() { - return 9; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java deleted file mode 100644 index 50edf8928a..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_OreDrillingPlant1 extends GT_MetaTileEntity_OreDrillingPlantBase { - - public GT_MetaTileEntity_OreDrillingPlant1(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - mTier = 1; - } - - public GT_MetaTileEntity_OreDrillingPlant1(String aName) { - super(aName); - mTier = 1; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("I"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OreDrillingPlant1(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_SolidSteel; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Steel; - } - - @Override - protected int getCasingTextureIndex() { - return 16; - } - - @Override - protected int getRadiusInChunks() { - return 3; - } - - @Override - protected int getMinTier() { - return 2; - } - - @Override - protected int getBaseProgressTime() { - return 960; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java deleted file mode 100644 index 6a80c96d26..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_OreDrillingPlant2 extends GT_MetaTileEntity_OreDrillingPlantBase { - - public GT_MetaTileEntity_OreDrillingPlant2(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - mTier = 2; - } - - public GT_MetaTileEntity_OreDrillingPlant2(String aName) { - super(aName); - mTier = 2; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("II"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OreDrillingPlant2(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_StableTitanium; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Titanium; - } - - @Override - protected int getCasingTextureIndex() { - return 50; - } - - @Override - protected int getRadiusInChunks() { - return 4; - } - - @Override - protected int getMinTier() { - return 3; - } - - @Override - protected int getBaseProgressTime() { - return 800; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java deleted file mode 100644 index 2bb25b2254..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_OreDrillingPlant3 extends GT_MetaTileEntity_OreDrillingPlantBase { - - public GT_MetaTileEntity_OreDrillingPlant3(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - mTier = 3; - } - - public GT_MetaTileEntity_OreDrillingPlant3(String aName) { - super(aName); - mTier = 3; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("III"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OreDrillingPlant3(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_RobustTungstenSteel; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.TungstenSteel; - } - - @Override - protected int getCasingTextureIndex() { - return 48; - } - - @Override - protected int getRadiusInChunks() { - return 6; - } - - @Override - protected int getMinTier() { - return 4; - } - - @Override - protected int getBaseProgressTime() { - return 640; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java deleted file mode 100644 index 7ba26b9500..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_OreDrillingPlant4 extends GT_MetaTileEntity_OreDrillingPlantBase { - - public GT_MetaTileEntity_OreDrillingPlant4(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - mTier = 4; - } - - public GT_MetaTileEntity_OreDrillingPlant4(String aName) { - super(aName); - mTier = 4; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - return createTooltip("IV"); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_OreDrillingPlant4(mName); - } - - @Override - protected ItemList getCasingBlockItem() { - return ItemList.Casing_MiningOsmiridium; - } - - @Override - protected Materials getFrameMaterial() { - return Materials.Osmiridium; - } - - @Override - protected int getCasingTextureIndex() { - return 62; - } - - @Override - protected int getRadiusInChunks() { - return 9; - } - - @Override - protected int getMinTier() { - return 5; - } - - @Override - protected int getBaseProgressTime() { - return 480; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java deleted file mode 100644 index b60bac4f84..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java +++ /dev/null @@ -1,794 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_Values.TIER_COLORS; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.ChunkPosition; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.widgets.GT_LockedWhileActiveButton; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.metatileentity.IMetricsExporter; -import gregtech.api.objects.GT_ChunkManager; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Ores_Abstract; -import gregtech.common.blocks.GT_TileEntity_Ores; -import gregtech.crossmod.visualprospecting.GT_VisualProspecting_Database; - -public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTileEntity_DrillerBase - implements IMetricsExporter { - - private final List oreBlockPositions = new ArrayList<>(); - protected int mTier = 1; - private int chunkRadiusConfig = getRadiusInChunks(); - private boolean replaceWithCobblestone = true; - - /** Used to drive the remaining ores count in the UI. */ - private int clientOreListSize = 0; - - /** Used to drive the current chunk number in the UI. */ - private int clientCurrentChunk = 0; - - /** Used to drive the total chunk count in the UI. */ - private int clientTotalChunks = 0; - - /** Used to drive the drill's y-level in the UI. */ - private int clientYHead = 0; - - /** Contains the name of the currently mined vein. Used for driving metrics cover output. */ - private String veinName = null; - - GT_MetaTileEntity_OreDrillingPlantBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - GT_MetaTileEntity_OreDrillingPlantBase(String aName) { - super(aName); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("chunkRadiusConfig", chunkRadiusConfig); - aNBT.setBoolean("replaceWithCobblestone", replaceWithCobblestone); - if (veinName != null) { - aNBT.setString("veinName", veinName); - } else if (aNBT.hasKey("veinName")) { - aNBT.removeTag("veinName"); - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("chunkRadiusConfig")) { - chunkRadiusConfig = aNBT.getInteger("chunkRadiusConfig"); - } - if (aNBT.hasKey("replaceWithCobblestone")) { - replaceWithCobblestone = aNBT.getBoolean("replaceWithCobblestone"); - } - if (aNBT.hasKey("veinName")) { - veinName = aNBT.getString("veinName"); - } else { - veinName = null; - } - } - - private void adjustChunkRadius(boolean increase) { - if (increase) { - if (chunkRadiusConfig <= getRadiusInChunks()) { - chunkRadiusConfig++; - } - if (chunkRadiusConfig > getRadiusInChunks()) chunkRadiusConfig = 1; - } else { - if (chunkRadiusConfig > 0) { - chunkRadiusConfig--; - } - if (chunkRadiusConfig == 0) chunkRadiusConfig = getRadiusInChunks(); - } - - if (mCurrentChunk != null && mChunkLoadingEnabled) { - GT_ChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); - } - - oreBlockPositions.clear(); - createInitialWorkingChunk(); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); - - if (getBaseMetaTileEntity().isActive()) { - GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("GT5U.machines.workarea_fail")); - } else { - adjustChunkRadius(!aPlayer.isSneaking()); - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.machines.workareaset") + " " - + GT_Utility.formatNumbers((long) chunkRadiusConfig << 4) - + " " - + StatCollector.translateToLocal("GT5U.machines.radius")); - } - } - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - replaceWithCobblestone = !replaceWithCobblestone; - GT_Utility.sendChatToPlayer(aPlayer, "Replace with cobblestone " + replaceWithCobblestone); - return true; - } - - @Override - protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - if (yHead != oldYHead) oreBlockPositions.clear(); - - if (mWorkChunkNeedsReload && mChunkLoadingEnabled) { // ask to load machine itself - GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), null); - mWorkChunkNeedsReload = false; - } - fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead); - if (oreBlockPositions.isEmpty()) { - if (veinName == null) { - updateVeinNameFromVP(getDrillCoords()); - } - - switch (tryLowerPipeState()) { - case 2 -> { - mMaxProgresstime = 0; - setRuntimeFailureReason(CheckRecipeResultRegistry.MISSING_MINING_PIPE); - return false; - } - case 3 -> { - workState = STATE_UPWARD; - return true; - } - case 1 -> { - workState = STATE_AT_BOTTOM; - return true; - } - } - // new layer - fill again - fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead); - } - return tryProcessOreList(); - } - - private boolean tryProcessOreList() { - // Even though it works fine without this check, - // it can save tiny amount of CPU time when void protection is disabled - if (protectsExcessItem()) { - boolean simulateResult = processOreList(true); - if (!simulateResult) { - mEUt = 0; - mMaxProgresstime = 0; - return false; - } - } - - boolean result = processOreList(false); - if (!result) { - mEUt = 0; - mMaxProgresstime = 0; - return false; - } - return true; - } - - private boolean processOreList(boolean simulate) { - ChunkPosition oreBlockPos = null; - List oreBlockPositions = simulate ? copyOreBlockPositions(this.oreBlockPositions) - : this.oreBlockPositions; - int x = 0, y = 0, z = 0; - Block oreBlock = null; - int oreBlockMetadata = 0; - - while ((oreBlock == null || !GT_Utility.isOre(oreBlock, oreBlockMetadata)) && !oreBlockPositions.isEmpty()) { - oreBlockPos = oreBlockPositions.remove(0); - x = oreBlockPos.chunkPosX; - y = oreBlockPos.chunkPosY; - z = oreBlockPos.chunkPosZ; - if (GT_Utility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), x, y, z, true)) - oreBlock = getBaseMetaTileEntity().getBlock(x, y, z); - oreBlockMetadata = getBaseMetaTileEntity().getWorld() - .getBlockMetadata(x, y, z); - } - - if (!tryConsumeDrillingFluid(simulate)) { - oreBlockPositions.add(0, oreBlockPos); - setRuntimeFailureReason(CheckRecipeResultRegistry.NO_DRILLING_FLUID); - return false; - } - if (oreBlock != null && GT_Utility.isOre(oreBlock, oreBlockMetadata)) { - short metaData = 0; - TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(x, y, z); - if (tTileEntity instanceof GT_TileEntity_Ores) { - metaData = ((GT_TileEntity_Ores) tTileEntity).mMetaData; - } - - Collection oreBlockDrops = getBlockDrops(oreBlock, x, y, z); - ItemStack cobble = GT_Utility.getCobbleForOre(oreBlock, metaData); - if (!simulate) { - if (replaceWithCobblestone) { - getBaseMetaTileEntity().getWorld() - .setBlock(x, y, z, Block.getBlockFromItem(cobble.getItem()), cobble.getItemDamage(), 3); - } else { - getBaseMetaTileEntity().getWorld() - .setBlockToAir(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ); - } - } - ItemStack[] toOutput = getOutputByDrops(oreBlockDrops); - if (simulate && !canOutputAll(toOutput)) { - setRuntimeFailureReason(CheckRecipeResultRegistry.ITEM_OUTPUT_FULL); - return false; - } - mOutputItems = toOutput; - } - return true; - } - - private static List copyOreBlockPositions(List oreBlockPositions) { - List ret = new ArrayList<>(); - for (ChunkPosition chunkPosition : oreBlockPositions) { - ret.add(new ChunkPosition(chunkPosition.chunkPosX, chunkPosition.chunkPosY, chunkPosition.chunkPosZ)); - } - return ret; - } - - @Override - protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - if (!mChunkLoadingEnabled) - return super.workingAtBottom(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead); - - if (mCurrentChunk == null) { - createInitialWorkingChunk(); - return true; - } - - if (mWorkChunkNeedsReload) { - GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); - mWorkChunkNeedsReload = false; - return true; - } - if (oreBlockPositions.isEmpty()) { - fillChunkMineList(yHead, yDrill); - if (oreBlockPositions.isEmpty()) { - GT_ChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); - if (!moveToNextChunk(xDrill >> 4, zDrill >> 4)) { - workState = STATE_UPWARD; - updateVeinNameFromVP(); - } - return true; - } - } - return tryProcessOreList(); - } - - private void createInitialWorkingChunk() { - mCurrentChunk = getTopLeftChunkCoords(); - updateVeinNameFromVP(); - if (mChunkLoadingEnabled) { - GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); - mWorkChunkNeedsReload = false; - } - } - - @NotNull - private ChunkCoordIntPair getTopLeftChunkCoords() { - return getCornerCoords(-1, -1); - } - - @NotNull - private ChunkCoordIntPair getBottomRightChunkCoords() { - return getCornerCoords(1, 1); - } - - @NotNull - private ChunkCoordIntPair getCornerCoords(int xMultiplier, int zMultiplier) { - final ChunkCoordIntPair drillPos = getDrillCoords(); - // use corner closest to the drill as mining area center - return new ChunkCoordIntPair( - drillPos.chunkXPos + xMultiplier * chunkRadiusConfig - + ((getXDrill() - (drillPos.chunkXPos << 4)) < 8 ? 0 : 1), - drillPos.chunkZPos + zMultiplier * chunkRadiusConfig - + ((getZDrill() - (drillPos.chunkZPos << 4)) < 8 ? 0 : 1)); - } - - @NotNull - private ChunkCoordIntPair getDrillCoords() { - return new ChunkCoordIntPair(getXDrill() >> 4, getZDrill() >> 4); - } - - private int getTotalChunkCount() { - final ChunkCoordIntPair topLeft = getTopLeftChunkCoords(); - final ChunkCoordIntPair bottomRight = getBottomRightChunkCoords(); - return (bottomRight.chunkXPos - topLeft.chunkXPos) * (bottomRight.chunkZPos - topLeft.chunkZPos); - } - - /** - * Returns a number corresponding to which chunk the drill is operating on. Only really useful for driving outputs - * in the controller UI. - * - * @return 0 if the miner is not in operation, positive integer corresponding to the chunk currently being drilled - */ - @SuppressWarnings("ExtractMethodRecommender") - private int getChunkNumber() { - if (mCurrentChunk == null) { - return 0; - } - - final ChunkCoordIntPair topLeft = getTopLeftChunkCoords(); - final ChunkCoordIntPair drillPos = getDrillCoords(); - - if (workState == STATE_DOWNWARD) { - return 1; - } else if (workState == STATE_UPWARD) { - // Technically, the miner isn't mining anything now; it's retracting the pipes in preparation to end - // operation. - return 0; - } - - int chunkNumber = (chunkRadiusConfig * 2) * (mCurrentChunk.chunkZPos - topLeft.chunkZPos) - + mCurrentChunk.chunkXPos - - topLeft.chunkXPos - + 1; - - // Drills mine the chunk they're in first, so if we're not there yet, bump the number to indicate that it - // was already mined. - if (mCurrentChunk.chunkZPos < drillPos.chunkZPos - || (mCurrentChunk.chunkZPos == drillPos.chunkZPos && mCurrentChunk.chunkXPos < drillPos.chunkXPos)) { - chunkNumber += 1; - } - return chunkNumber; - } - - @Override - protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, - int yHead, int oldYHead) { - boolean result; - if (!mChunkLoadingEnabled || oreBlockPositions.isEmpty()) { - result = super.workingUpward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead); - } else { - result = tryProcessOreList(); - if (oreBlockPositions.isEmpty()) GT_ChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity()); - } - - if (!result) { - setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.drill_exhausted")); - } - - return result; - } - - @Override - protected void onAbort() { - oreBlockPositions.clear(); - if (mCurrentChunk != null) { - GT_ChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); - } - mCurrentChunk = null; - updateVeinNameFromVP(); - } - - private boolean moveToNextChunk(int centerX, int centerZ) { - if (mCurrentChunk == null) return false; - // use corner closest to the drill as mining area center - final int left = centerX - chunkRadiusConfig + ((getXDrill() - (centerX << 4)) < 8 ? 0 : 1); - final int right = left + chunkRadiusConfig * 2; - final int bottom = centerZ + chunkRadiusConfig + ((getZDrill() - (centerZ << 4)) < 8 ? 0 : 1); - - int nextChunkX = mCurrentChunk.chunkXPos + 1; - int nextChunkZ = mCurrentChunk.chunkZPos; - - // step to the next chunk - if (nextChunkX >= right) { - nextChunkX = left; - ++nextChunkZ; - } - // skip center chunk - dug in workingDownward() - if (nextChunkX == centerX && nextChunkZ == centerZ) { - ++nextChunkX; - - if (nextChunkX >= right) { - nextChunkX = left; - ++nextChunkZ; - } - } - - if (nextChunkZ >= bottom) { - mCurrentChunk = null; - return false; - } - - mCurrentChunk = new ChunkCoordIntPair(nextChunkX, nextChunkZ); - updateVeinNameFromVP(); - - GT_ChunkManager - .requestChunkLoad((TileEntity) getBaseMetaTileEntity(), new ChunkCoordIntPair(nextChunkX, nextChunkZ)); - return true; - } - - private void updateVeinNameFromVP() { - updateVeinNameFromVP(mCurrentChunk); - } - - private void updateVeinNameFromVP(@NotNull ChunkCoordIntPair coords) { - veinName = GT_VisualProspecting_Database - .getVeinName(getBaseMetaTileEntity().getWorld().provider.dimensionId, coords) - .orElse(null); - } - - @Override - protected boolean checkHatches() { - return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() - && !mOutputBusses.isEmpty() - && !mEnergyHatches.isEmpty(); - } - - @Override - protected List> getAllowedHatches() { - return ImmutableList.of(InputHatch, InputBus, OutputBus, Maintenance, Energy); - } - - @Override - protected void setElectricityStats() { - this.mEfficiency = getCurrentEfficiency(null); - this.mEfficiencyIncrease = 10000; - int tier = Math.max(1, GT_Utility.getTier(getMaxInputVoltage())); - this.mEUt = -3 * (1 << (tier << 1)); - this.mMaxProgresstime = calculateMaxProgressTime(tier); - } - - private int calculateMaxProgressTime(int tier) { - return Math.max( - 1, - ((workState == STATE_DOWNWARD || workState == STATE_AT_BOTTOM) ? getBaseProgressTime() : 80) / (1 << tier)); - } - - private ItemStack[] getOutputByDrops(Collection oreBlockDrops) { - long voltage = getMaxInputVoltage(); - Collection outputItems = new HashSet<>(); - oreBlockDrops.forEach(currentItem -> { - if (!doUseMaceratorRecipe(currentItem)) { - outputItems.add(multiplyStackSize(currentItem)); - return; - } - GT_Recipe tRecipe = RecipeMaps.maceratorRecipes - .findRecipe(getBaseMetaTileEntity(), false, voltage, null, currentItem); - if (tRecipe == null) { - outputItems.add(currentItem); - return; - } - for (int i = 0; i < tRecipe.mOutputs.length; i++) { - ItemStack recipeOutput = tRecipe.mOutputs[i].copy(); - if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i)) - multiplyStackSize(recipeOutput); - outputItems.add(recipeOutput); - } - }); - return outputItems.toArray(new ItemStack[0]); - } - - private boolean doUseMaceratorRecipe(ItemStack currentItem) { - ItemData itemData = GT_OreDictUnificator.getItemData(currentItem); - return itemData == null || itemData.mPrefix != OrePrefixes.crushed && itemData.mPrefix != OrePrefixes.dustImpure - && itemData.mPrefix != OrePrefixes.dust - && itemData.mPrefix != OrePrefixes.gem - && itemData.mPrefix != OrePrefixes.gemChipped - && itemData.mPrefix != OrePrefixes.gemExquisite - && itemData.mPrefix != OrePrefixes.gemFlawed - && itemData.mPrefix != OrePrefixes.gemFlawless - && itemData.mMaterial.mMaterial != Materials.Oilsands; - } - - private ItemStack multiplyStackSize(ItemStack itemStack) { - itemStack.stackSize *= getBaseMetaTileEntity().getRandomNumber(4) + 1; - return itemStack; - } - - private Collection getBlockDrops(final Block oreBlock, int posX, int posY, int posZ) { - final int blockMeta = getBaseMetaTileEntity().getMetaID(posX, posY, posZ); - if (oreBlock.canSilkHarvest(getBaseMetaTileEntity().getWorld(), null, posX, posY, posZ, blockMeta)) { - return Collections.singleton(new ItemStack(oreBlock, 1, blockMeta)); - } - if (oreBlock instanceof GT_Block_Ores_Abstract) { - TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(posX, posY, posZ); - if (tTileEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) tTileEntity).mMetaData >= 16000) { - // GT_Log.out.println("Running Small Ore"); - return oreBlock.getDrops(getBaseMetaTileEntity().getWorld(), posX, posY, posZ, blockMeta, mTier + 3); - } - } - // GT_Log.out.println("Running Normal Ore"); - return oreBlock.getDrops(getBaseMetaTileEntity().getWorld(), posX, posY, posZ, blockMeta, 0); - } - - private boolean tryConsumeDrillingFluid(boolean simulate) { - return depleteInput(new FluidStack(ItemList.sDrillingFluid, 2000), simulate); - } - - private void fillChunkMineList(int yHead, int yDrill) { - if (mCurrentChunk == null || !oreBlockPositions.isEmpty()) return; - final int minX = mCurrentChunk.chunkXPos << 4; - final int maxX = minX + 16; - final int minZ = mCurrentChunk.chunkZPos << 4; - final int maxZ = minZ + 16; - for (int x = minX; x < maxX; ++x) - for (int z = minZ; z < maxZ; ++z) for (int y = yHead; y < yDrill; ++y) tryAddOreBlockToMineList(x, y, z); - } - - private void fillMineListIfEmpty(int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead) { - if (!oreBlockPositions.isEmpty()) return; - - tryAddOreBlockToMineList(xPipe, yHead - 1, zPipe); - if (yHead == yDrill) return; // skip controller block layer - - if (mChunkLoadingEnabled) { - int startX = (xDrill >> 4) << 4; - int startZ = (zDrill >> 4) << 4; - for (int x = startX; x < (startX + 16); ++x) - for (int z = startZ; z < (startZ + 16); ++z) tryAddOreBlockToMineList(x, yHead, z); - } else { - int radius = chunkRadiusConfig << 4; - for (int xOff = -radius; xOff <= radius; xOff++) for (int zOff = -radius; zOff <= radius; zOff++) - tryAddOreBlockToMineList(xDrill + xOff, yHead, zDrill + zOff); - } - } - - private void tryAddOreBlockToMineList(int x, int y, int z) { - Block block = getBaseMetaTileEntity().getBlock(x, y, z); - int blockMeta = getBaseMetaTileEntity().getMetaID(x, y, z); - ChunkPosition blockPos = new ChunkPosition(x, y, z); - if (!oreBlockPositions.contains(blockPos)) { - if (block instanceof GT_Block_Ores_Abstract) { - TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(x, y, z); - if (tTileEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) tTileEntity).mNatural) - oreBlockPositions.add(blockPos); - } else if (GT_Utility.isOre(block, blockMeta)) oreBlockPositions.add(blockPos); - } - } - - protected abstract int getRadiusInChunks(); - - protected abstract int getBaseProgressTime(); - - protected GT_Multiblock_Tooltip_Builder createTooltip(String tierSuffix) { - String casings = getCasingBlockItem().get(0) - .getDisplayName(); - - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - final int baseCycleTime = calculateMaxProgressTime(getMinTier()); - tt.addMachineType("Miner") - .addInfo("Controller Block for the Ore Drilling Plant " + (tierSuffix != null ? tierSuffix : "")) - .addInfo("Use a Screwdriver to configure block radius") - .addInfo("Maximum radius is " + GT_Utility.formatNumbers((long) getRadiusInChunks() << 4) + " blocks") - .addInfo("Use Soldering iron to turn off chunk mode") - .addInfo("Use Wire Cutter to toggle replacing mined blocks with cobblestone") - .addInfo("In chunk mode, working area center is the chunk corner nearest to the drill") - .addInfo("Gives ~3x as much crushed ore vs normal processing") - .addInfo("Fortune bonus of " + GT_Utility.formatNumbers(mTier + 3) + ". Only works on small ores") - .addInfo("Minimum energy hatch tier: " + TIER_COLORS[getMinTier()] + VN[getMinTier()]) - .addInfo( - "Base cycle time: " + (baseCycleTime < 20 ? GT_Utility.formatNumbers(baseCycleTime) + " ticks" - : GT_Utility.formatNumbers(baseCycleTime / 20) + " seconds")) - .addSeparator() - .beginStructureBlock(3, 7, 3, false) - .addController("Front bottom") - .addOtherStructurePart(casings, "form the 3x1x3 Base") - .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") - .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") - .addEnergyHatch(VN[getMinTier()] + "+, Any base casing", 1) - .addMaintenanceHatch("Any base casing", 1) - .addInputBus("Mining Pipes, optional, any base casing", 1) - .addInputHatch("Drilling Fluid, any base casing", 1) - .addOutputBus("Any base casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - @Override - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - super.drawTexts(screenElements, inventorySlot); - screenElements - .widget( - new TextWidget() - .setStringSupplier( - () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted( - "GT5U.gui.text.drill_ores_left_chunk", - numberFormat.format(clientOreListSize))) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> getBaseMetaTileEntity().isActive() && clientOreListSize > 0 - && workState == STATE_AT_BOTTOM)) - .widget( - new TextWidget() - .setStringSupplier( - () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted( - "GT5U.gui.text.drill_ores_left_layer", - numberFormat.format(clientYHead), - numberFormat.format(clientOreListSize))) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> getBaseMetaTileEntity().isActive() && clientYHead > 0 && workState == STATE_DOWNWARD)) - .widget( - new TextWidget() - .setStringSupplier( - () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted( - "GT5U.gui.text.drill_chunks_left", - numberFormat.format(clientCurrentChunk), - numberFormat.format(clientTotalChunks))) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> getBaseMetaTileEntity().isActive() && clientCurrentChunk > 0 - && workState == STATE_AT_BOTTOM)) - .widget( - new TextWidget() - .setStringSupplier( - () -> EnumChatFormatting.GRAY - + StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_current_vein", veinName)) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> veinName != null && (workState == STATE_AT_BOTTOM || workState == STATE_DOWNWARD))) - .widget(new FakeSyncWidget.IntegerSyncer(oreBlockPositions::size, (newInt) -> clientOreListSize = newInt)) - .widget(new FakeSyncWidget.IntegerSyncer(this::getTotalChunkCount, (newInt) -> clientTotalChunks = newInt)) - .widget(new FakeSyncWidget.IntegerSyncer(this::getChunkNumber, (newInt) -> clientCurrentChunk = newInt)) - .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, (newInt) -> workState = newInt)) - .widget(new FakeSyncWidget.IntegerSyncer(this::getYHead, (newInt) -> clientYHead = newInt)) - .widget(new FakeSyncWidget.StringSyncer(() -> veinName, (newString) -> veinName = newString)); - } - - @Override - protected List getAdditionalButtons(ModularWindow.Builder builder, UIBuildContext buildContext) { - return ImmutableList.of( - (ButtonWidget) new GT_LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) - .setOnClick((clickData, widget) -> adjustChunkRadius(clickData.mouseButton == 0)) - .setPlayClickSound(true) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WORK_AREA) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer(() -> chunkRadiusConfig, (val) -> chunkRadiusConfig = val), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .dynamicTooltip( - () -> ImmutableList.of( - StatCollector.translateToLocalFormatted( - "GT5U.gui.button.ore_drill_radius_1", - GT_Utility.formatNumbers((long) chunkRadiusConfig << 4)), - StatCollector.translateToLocal("GT5U.gui.button.ore_drill_radius_2"))) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setSize(16, 16), - (ButtonWidget) new GT_LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) - .setOnClick((clickData, widget) -> replaceWithCobblestone = !replaceWithCobblestone) - .setPlayClickSound(true) - .setBackground(() -> { - if (replaceWithCobblestone) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_REPLACE_COBBLE_ON }; - } - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_REPLACE_COBBLE_OFF }; - }) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer( - () -> replaceWithCobblestone, - (val) -> replaceWithCobblestone = val), - builder, - (widget, val) -> widget.notifyTooltipChange()) - .dynamicTooltip( - () -> ImmutableList.of( - StatCollector.translateToLocal( - replaceWithCobblestone ? "GT5U.gui.button.ore_drill_cobblestone_on" - : "GT5U.gui.button.ore_drill_cobblestone_off"))) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setSize(16, 16)); - } - - @Override - protected SoundResource getProcessStartSound() { - return SoundResource.IC2_MACHINES_MINER_OP; - } - - @Override - public String[] getInfoData() { - final String diameter = GT_Utility.formatNumbers(chunkRadiusConfig * 2L); - return new String[] { - EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.minermulti") - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.machines.workarea") + ": " - + EnumChatFormatting.GREEN - + diameter - + "x" - + diameter - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.machines.chunks") }; - } - - @Override - public @NotNull List reportMetrics() { - if (getBaseMetaTileEntity().isActive()) { - return switch (workState) { - case STATE_AT_BOTTOM -> ImmutableList.of( - StatCollector.translateToLocalFormatted( - "GT5U.gui.text.drill_ores_left_chunk", - GT_Utility.formatNumbers(oreBlockPositions.size())), - StatCollector.translateToLocalFormatted( - "GT5U.gui.text.drill_chunks_left", - GT_Utility.formatNumbers(getChunkNumber()), - GT_Utility.formatNumbers(getTotalChunkCount())), - veinName == null ? "" - : StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_current_vein", veinName)); - case STATE_DOWNWARD -> ImmutableList.of( - StatCollector.translateToLocalFormatted( - "GT5U.gui.text.drill_ores_left_layer", - getYHead(), - GT_Utility.formatNumbers(oreBlockPositions.size())), - veinName == null ? "" - : StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_current_vein", veinName)); - case STATE_UPWARD, STATE_ABORT -> ImmutableList - .of(StatCollector.translateToLocal("GT5U.gui.text.retracting_pipe")); - - default -> ImmutableList.of(); - }; - } - - return ImmutableList.of( - getFailureReason() - .map(reason -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_reason", reason)) - .orElseGet(() -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_generic"))); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java deleted file mode 100644 index d07ad238a2..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java +++ /dev/null @@ -1,1290 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.ExoticEnergy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_Values.AuthorBlueWeabo; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; -import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.drawable.Text; -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.api.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.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow; -import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import blockrenderer6343.client.world.ClientFakePlayer; -import cpw.mods.fml.common.Loader; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.GregTechTileClientEvents; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.objects.ItemData; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.recipe.metadata.PCBFactoryTierKey; -import gregtech.api.recipe.metadata.PCBFactoryUpgrade; -import gregtech.api.recipe.metadata.PCBFactoryUpgradeKey; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_ParallelHelper; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.blocks.GT_Block_Casings8; - -@SuppressWarnings("SpellCheckingInspection") -public class GT_MetaTileEntity_PCBFactory extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - private static final String tier1 = "tier1"; - private static final String tier2 = "tier2"; - private static final String tier3 = "tier3"; - private static final String bioUpgrade = "bioUpgrade"; - private static final String ocTier1Upgrade = "ocTier1Upgrade"; - private static final String ocTier2Upgrade = "ocTier2Upgrade"; - private float mRoughnessMultiplier = 1; - private int mTier = 1, mSetTier = 1, mUpgradesInstalled = 0, mCurrentParallel = 0, mMaxParallel = 0; - private boolean mBioUpgrade = false, mBioRotate = false, mOCTier1 = false, mOCTier2 = false; - private final int[] mBioOffsets = new int[] { -5, -1 }; - private final int[] mOCTier1Offsets = new int[] { 2, -11 }; - private final int[] mOCTier2Offsets = new int[] { 2, -11 }; - private GT_MetaTileEntity_Hatch_Input mCoolantInputHatch; - private static final int mBioRotateBitMap = 0b1000000; - private static final int mOCTier2BitMap = 0b100000; - private static final int mOCTier1BitMap = 0b10000; - private static final int mBioBitMap = 0b1000; - private static final int mTier3BitMap = 0b100; - private static final int mTier2BitMap = 0b10; - private static final int mTier1BitMap = 0b1; - private static final int COOLANT_CONSUMED_PER_SEC = 10; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - tier1, - transpose( - new String[][] { - // spotless:off - {" ","E E","E E","EEEEEEE","E E","E E"," "}, - {"EEEEEEE","CAAAAAC","CAAAAAC","CCCCCCC","CCCCCCC","CCCCCCC","E E"}, - {"EAAAAAE","C-----C","C-----C","C-----C","C-----C","C-----C","ECCCCCE"}, - {"EAAAAAE","C-----C","B-----B","B-----B","B-----B","C-----C","ECCCCCE"}, - {"EAAAAAE","C-----C","B-FFF-B","B-FFF-B","B-FFF-B","C-----C","EPPPPPE"}, - {"ECC~CCE","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","EPPPPPE"} - //spotless:on - })) - .addShape( - tier2, - transpose( - new String[][] { - // spotless:off - {" "," "," ","HGGH","HGGH","HGGH","HGGH","HGGH"," "," "," "}, - {" "," ","HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"," "," "}, - {" ","HGGH","GGGG","G G","G G","G G","G G","G G","GGGG","HGGH"," "}, - {" ","HGGH","G G","G G","G G","G G","G G","G G","G G","HGGH"," "}, - {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"}, - {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"}, - {"HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"} - //spotless:on - })) - .addShape( - tier3, - transpose( - new String[][] { - // spotless:off - {" "," "," "," "," I "," I "," "," "," "," "}, - {" "," "," "," I "," I "," I "," I "," "," "," "}, - {" "," "," KKK "," KIK "," K K "," K K "," I "," "," "," "}, - {" "," "," KKK "," K K "," K K "," K K "," I "," "," "," "}, - {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "}, - {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "}, - {" "," III "," I I "," I I "," I I "," K K "," KIK "," "," "," "}, - {" "," I I "," I K I "," I I "," I I "," K K "," KIK "," "," "," "}, - {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "}, - {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "}, - {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, - {" "," III "," I I "," K K "," K K "," K K "," K K "," I I "," III "," "}, - {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, - {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "}, - {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "}, - {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "}, - {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, - {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, - {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, - {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, - {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, - {" II~II ","IIJJJII","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IIJJJII"," IIIII "} - //spotless:on - })) - .addShape( - bioUpgrade, - transpose( - new String[][] { - // spotless:off - {" "," "," LLLLLL "," "," "}, - {" "," "," L L "," "," "}, - {"E E E E"," LLL LLL "," LLL LLL "," LLL LLL ","E E E E"}, - {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"}, - {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"}, - {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"}, - {"ELLLE ELLLE","LLLLL LLLLL","LLLLL LLLLL","LLLLL LLLLL","ELLLE ELLLE"} - //spotless:on - })) - .addShape( - ocTier1Upgrade, - transpose( - new String[][] { - // spotless:off - {"EKKKE","K K","K K","K K","EKKKE"}, - {"E E"," KKK "," K K "," KKK ","E E"}, - {"E E"," NNN "," N N "," NNN ","E E"}, - {"E E"," KKK "," K K "," KKK ","E E"}, - {"E E"," KKK "," K K "," KKK ","E E"}, - {"EOOOE","OKKKO","OK KO","OKKKO","EOOOE"}, - {"E E"," KKK "," K K "," KKK ","E E"}, - {"E E"," KKK "," K K "," KKK ","E E"}, - {"ENNNE","NKKKN","NK KN","NKKKN","ENNNE"}, - {"EGGGE","GGGGG","GGMGG","GGGGG","EGGGE"} - //spotless:on - })) - .addShape( - ocTier2Upgrade, - transpose( - new String[][] { - // spotless:off - {"RGGGR","G G","G G","G G","RGGGR"}, - {"R R"," GGG "," GTG "," GGG ","R R"}, - {"R R"," NNN "," NTN "," NNN ","R R"}, - {"R R"," QQQ "," QTQ "," QQQ ","R R"}, - {"R R"," QQQ "," QTQ "," QQQ ","R R"}, - {"R R"," QQQ "," QTQ "," QQQ ","R R"}, - {"R R"," QQQ "," QTQ "," QQQ ","R R"}, - {"R R"," QQQ "," QTQ "," QQQ ","R R"}, - {"RNNNR","NQQQN","NQTQN","NQQQN","RNNNR"}, - {"RGGGR","GGGGG","GGSGG","GGGGG","RGGGR"} - //spotless:on - })) - .addElement('E', ofFrame(Materials.DamascusSteel)) - .addElement('C', ofBlock(GregTech_API.sBlockCasings8, 11)) - .addElement('D', ofBlock(GregTech_API.sBlockReinforced, 2)) - .addElement('A', Glasses.chainAllGlasses()) - .addElement('B', ofBlock(GregTech_API.sBlockCasings3, 10)) - .addElement('F', ofFrame(Materials.VibrantAlloy)) - .addElement( - 'P', - buildHatchAdder(GT_MetaTileEntity_PCBFactory.class) - .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy)) - .dot(1) - .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(11)) - .buildAndChain(GregTech_API.sBlockCasings8, 11)) - .addElement('H', ofFrame(Materials.Duranium)) - .addElement('G', ofBlock(GregTech_API.sBlockCasings8, 12)) - .addElement('I', ofBlock(GregTech_API.sBlockCasings8, 13)) - .addElement('K', ofBlock(GregTech_API.sBlockCasings8, 10)) - .addElement( - 'J', - buildHatchAdder(GT_MetaTileEntity_PCBFactory.class) - .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy)) - .dot(1) - .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(13)) - .buildAndChain(GregTech_API.sBlockCasings8, 13)) - .addElement('L', ofBlock(GregTech_API.sBlockCasings4, 1)) - .addElement( - 'M', - buildHatchAdder(GT_MetaTileEntity_PCBFactory.class).hatchClass(GT_MetaTileEntity_Hatch_Input.class) - .adder(GT_MetaTileEntity_PCBFactory::addCoolantInputToMachineList) - .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 12)) - .dot(2) - .buildAndChain(GregTech_API.sBlockCasings8, 12)) - .addElement('N', ofBlock(GregTech_API.sBlockCasings2, 15)) - .addElement('O', ofBlock(GregTech_API.sBlockCasings8, 4)) - .addElement( - 'S', - buildHatchAdder(GT_MetaTileEntity_PCBFactory.class).hatchClass(GT_MetaTileEntity_Hatch_Input.class) - .adder(GT_MetaTileEntity_PCBFactory::addCoolantInputToMachineList) - .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 12)) - .dot(2) - .buildAndChain(GregTech_API.sBlockCasings8, 12)) - .addElement('R', ofFrame(Materials.Americium)) - .addElement('Q', ofBlock(GregTech_API.sBlockCasings8, 14)) - .addElement('T', ofBlock(GregTech_API.sBlockCasings1, 15)) - .build(); - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - if (mSetTier < 3) { - buildPiece(tier1, stackSize, hintsOnly, 3, 5, 0); - if (mSetTier == 2) { - buildPiece(tier2, stackSize, hintsOnly, 7, 6, 2); - } - } else { - buildPiece(tier3, stackSize, hintsOnly, 3, 21, 0); - } - - if (mBioUpgrade) { - if (mBioRotate) { - final IGregTechTileEntity tTile = getBaseMetaTileEntity(); - getStructureDefinition().buildOrHints( - this, - stackSize, - bioUpgrade, - tTile.getWorld(), - transformFacing(getExtendedFacing()), - tTile.getXCoord(), - tTile.getYCoord(), - tTile.getZCoord(), - mBioOffsets[1], - 6, - mBioOffsets[0], - hintsOnly); - } else { - buildPiece(bioUpgrade, stackSize, hintsOnly, mBioOffsets[0], 6, mBioOffsets[1]); - } - } - - if (mOCTier1 && !mOCTier2) { - buildPiece(ocTier1Upgrade, stackSize, hintsOnly, mOCTier1Offsets[0], 9, mOCTier1Offsets[1]); - } - - if (!mOCTier1 && mOCTier2) { - buildPiece(ocTier2Upgrade, stackSize, hintsOnly, mOCTier2Offsets[0], 9, mOCTier2Offsets[1]); - } - } - - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - int built = 0; - if (Loader.isModLoaded("blockrenderer6343") && env.getActor() instanceof ClientFakePlayer) { - if (stackSize.stackSize < 3) { - built += survivialBuildPiece(tier1, stackSize, 3, 5, 0, elementBudget, env, false, false); - if (stackSize.stackSize == 2) { - built += survivialBuildPiece(tier2, stackSize, 7, 6, 2, elementBudget, env, false, false); - } - } else { - built += survivialBuildPiece(tier3, stackSize, 3, 21, 0, elementBudget, env, false, false); - } - return built; - } - if (mSetTier < 3) { - built += survivialBuildPiece(tier1, stackSize, 3, 5, 0, elementBudget, env, false, true); - if (mSetTier == 2) { - built += survivialBuildPiece(tier2, stackSize, 7, 6, 2, elementBudget, env, false, true); - } - } else { - built += survivialBuildPiece(tier3, stackSize, 3, 21, 0, elementBudget, env, false, true); - } - - if (mBioUpgrade) { - if (mBioRotate) { - final IGregTechTileEntity tTile = getBaseMetaTileEntity(); - getStructureDefinition().survivalBuild( - this, - stackSize, - bioUpgrade, - tTile.getWorld(), - transformFacing(getExtendedFacing()), - tTile.getXCoord(), - tTile.getYCoord(), - tTile.getZCoord(), - mBioOffsets[1], - 6, - mBioOffsets[0], - elementBudget, - env, - false); - } else { - built += survivialBuildPiece( - bioUpgrade, - stackSize, - mBioOffsets[0], - 6, - mBioOffsets[1], - elementBudget, - env, - false, - true); - } - } - - if (mOCTier1 && !mOCTier2) { - built += survivialBuildPiece( - ocTier1Upgrade, - stackSize, - mOCTier1Offsets[0], - 9, - mOCTier1Offsets[1], - elementBudget, - env, - false, - true); - } - if (!mOCTier1 && mOCTier2) { - built += survivialBuildPiece( - ocTier2Upgrade, - stackSize, - mOCTier2Offsets[0], - 9, - mOCTier2Offsets[1], - elementBudget, - env, - false, - true); - } - - return built; - } - - public GT_MetaTileEntity_PCBFactory(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PCBFactory(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PCBFactory(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) - return new ITexture[] { - BlockIcons.getCasingTextureForId( - getTier() < 3 ? GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11) - : GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 13)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { - BlockIcons.getCasingTextureForId( - getTier() < 3 ? GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11) - : GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 13)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { BlockIcons.getCasingTextureForId( - mSetTier < 3 ? ((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(11) - : ((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(13)) }; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mTier = 0; - mUpgradesInstalled = 0; - mCoolantInputHatch = null; - if (mSetTier < 3) { - if (!checkPiece(tier1, 3, 5, 0)) { - return false; - } - if (mSetTier == 2) { - if (!checkPiece(tier2, 7, 6, 2)) { - return false; - } - mTier = 2; - } else { - mTier = 1; - } - } else { - if (!checkPiece(tier3, 3, 21, 0)) { - return false; - } - mTier = 3; - } - - if (mBioUpgrade) { - if (mBioRotate) { - final IGregTechTileEntity tTile = getBaseMetaTileEntity(); - if (!getStructureDefinition().check( - this, - bioUpgrade, - tTile.getWorld(), - transformFacing(getExtendedFacing()), - tTile.getXCoord(), - tTile.getYCoord(), - tTile.getZCoord(), - mBioOffsets[1], - 6, - mBioOffsets[0], - !mMachine)) { - return false; - } - } else { - if (!checkPiece(bioUpgrade, mBioOffsets[0], 6, mBioOffsets[1])) { - return false; - } - } - mUpgradesInstalled++; - } - - if (mOCTier1 && !mOCTier2) { - if (!checkPiece(ocTier1Upgrade, mOCTier1Offsets[0], 9, mOCTier1Offsets[1])) { - return false; - } - if (mCoolantInputHatch == null) { - return false; - } - mUpgradesInstalled++; - } - - if (mOCTier2 && !mOCTier1) { - if (!checkPiece(ocTier2Upgrade, mOCTier2Offsets[0], 9, mOCTier2Offsets[1])) { - return false; - } - if (mCoolantInputHatch == null) { - return false; - } - mUpgradesInstalled++; - } - - getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); - - if (mMaintenanceHatches.size() != 1) { - return false; - } - - if (!checkExoticAndNormalEnergyHatches()) { - return false; - } - - return mTier > 0; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.pcbFactoryRecipes; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - // Here we check the dynamic parallels, which depend on the recipe - int numberOfNanites = 0; - ItemStack aNanite = recipe.getRepresentativeInput(1); - ItemData naniteData = GT_OreDictUnificator.getAssociation(aNanite); - if (naniteData != null && naniteData.mPrefix != null && naniteData.mPrefix.equals(OrePrefixes.nanite)) { - for (ItemStack aItem : inputItems) { - if (aItem != null && aItem.isItemEqual(aNanite)) { - numberOfNanites += aItem.stackSize; - } - } - } - maxParallel = (int) Math.max(Math.ceil(Math.log(numberOfNanites) / Math.log(2) + 0.00001), 1); - mMaxParallel = maxParallel; - - PCBFactoryUpgrade requiredUpgrade = recipe.getMetadata(PCBFactoryUpgradeKey.INSTANCE); - if (requiredUpgrade == PCBFactoryUpgrade.BIO && !mBioUpgrade) - return SimpleCheckRecipeResult.ofFailure("bio_upgrade_missing"); - - int requiredPCBTier = recipe.getMetadataOrDefault(PCBFactoryTierKey.INSTANCE, 1); - if (requiredPCBTier > mTier) return CheckRecipeResultRegistry.insufficientMachineTier(requiredPCBTier); - - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - @Nonnull - @Override - protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return super.createOverclockCalculator(recipe).setNoOverclock(isNoOC()) - .setEUtDiscount((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled)) - .setSpeedBoost(getDurationMultiplierFromRoughness()) - .setDurationDecreasePerOC(mOCTier2 ? 4.0 : 2.0); - } - - @Nonnull - @Override - protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) { - return super.createParallelHelper(recipe) - .setEUtModifier((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled)) - .setChanceMultiplier(mRoughnessMultiplier); - } - }; - } - - private boolean isNoOC() { - return !mOCTier1 && !mOCTier2; - } - - private float getDurationMultiplierFromRoughness() { - return (float) Math.pow(mRoughnessMultiplier, 2); - } - - private int ticker = 0; - - @Override - public boolean onRunningTick(ItemStack aStack) { - if (!super.onRunningTick(aStack)) { - return false; - } - - if (ticker % 20 == 0) { - if (!isNoOC()) { - FluidStack tFluid = mOCTier1 ? GT_ModHandler.getDistilledWater(COOLANT_CONSUMED_PER_SEC) - : Materials.SuperCoolant.getFluid(COOLANT_CONSUMED_PER_SEC); - if (!drain(mCoolantInputHatch, tFluid, true)) { - stopMachine(ShutDownReasonRegistry.outOfFluid(tFluid)); - return false; - } - } - ticker = 0; - } - - ticker++; - - return true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide()) { - // TODO: Look for proper fix - // Updates every 10 sec - if (mUpdate <= -150) mUpdate = 50; - } - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return (int) (10000f * mRoughnessMultiplier); - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - private int getTier() { - return mSetTier; - } - - @Override - public void receiveClientEvent(byte aEventID, byte aValue) { - if (aEventID == 1) { - if ((aValue & mTier1BitMap) == mTier1BitMap) { - mSetTier = 1; - } - - if ((aValue & mTier2BitMap) == mTier2BitMap) { - mSetTier = 2; - } - - if ((aValue & mTier3BitMap) == mTier3BitMap) { - mSetTier = 3; - } - - if ((aValue & mBioBitMap) == mBioBitMap) { - mBioUpgrade = true; - } - - if ((aValue & mBioRotateBitMap) == mBioRotateBitMap) { - mBioRotate = true; - } - - if ((aValue & mOCTier1BitMap) == mOCTier1BitMap) { - mOCTier1 = true; - } - - if ((aValue & mOCTier2BitMap) == mOCTier2BitMap) { - mOCTier2 = true; - } - } - } - - private ExtendedFacing transformFacing(ExtendedFacing facing) { - ForgeDirection curDirection = facing.getDirection(); - Rotation curRotation = facing.getRotation(); - Flip curFlip = facing.getFlip(); - ForgeDirection newDirection = curDirection; - Rotation newRotation = curRotation; - Flip newFlip = curFlip; - - if (curDirection == ForgeDirection.UP || curDirection == ForgeDirection.DOWN) { - switch (curRotation) { - case CLOCKWISE, COUNTER_CLOCKWISE -> { - newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE; - newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.NORTH : ForgeDirection.SOUTH; - } - case NORMAL -> { - newRotation = curDirection == ForgeDirection.UP ? Rotation.CLOCKWISE : Rotation.COUNTER_CLOCKWISE; - newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST; - newFlip = Flip.NONE; - } - case UPSIDE_DOWN -> { - newRotation = curDirection == ForgeDirection.UP ? Rotation.COUNTER_CLOCKWISE : Rotation.CLOCKWISE; - newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST; - newFlip = Flip.NONE; - } - } - } else if (curRotation == Rotation.CLOCKWISE || curRotation == Rotation.COUNTER_CLOCKWISE) { - newFlip = curRotation == Rotation.CLOCKWISE ? curFlip == Flip.NONE ? Flip.NONE : Flip.HORIZONTAL - : curFlip != Flip.NONE ? Flip.NONE : Flip.HORIZONTAL; - newDirection = curRotation == Rotation.CLOCKWISE ? ForgeDirection.UP : ForgeDirection.DOWN; - } else { - newDirection = switch (curDirection) { - case EAST -> ForgeDirection.SOUTH; - case NORTH -> ForgeDirection.EAST; - case WEST -> ForgeDirection.NORTH; - case SOUTH -> ForgeDirection.WEST; - default -> curDirection; - }; - } - - if (curRotation == Rotation.UPSIDE_DOWN) { - if (curDirection != ForgeDirection.UP && curDirection != ForgeDirection.DOWN) { - newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE; - } - } - - return ExtendedFacing.of(newDirection, newRotation, newFlip); - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - public boolean addCoolantInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null; - mCoolantInputHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity; - return true; - } - return false; - } - - @Override - protected long getActualEnergyUsage() { - return (-this.lEUt * 10000) / Math.min(Math.max(1000, mEfficiency), 10000); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - inputSeparation = !inputSeparation; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); - } - - @Override - public String[] getInfoData() { - int mPollutionReduction = 0; - for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch tHatch : getExoticAndNormalEnergyHatchList()) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - long voltage = getAverageInputVoltage(); - long amps = getMaxInputAmps(); - - return new String[] { - /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(getActualEnergyUsage()) - + EnumChatFormatting.RESET - + " EU/t", - /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(voltage) - + EnumChatFormatting.RESET - + " EU/t(*" - + amps - + " A)" - + StatCollector.translateToLocal("GT5U.machines.tier") - + ": " - + EnumChatFormatting.YELLOW - + VN[GT_Utility.getTier(voltage)] - + EnumChatFormatting.RESET, - /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " - + EnumChatFormatting.RED - + (getIdealStatus() - getRepairStatus()) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.multiblock.efficiency") - + ": " - + EnumChatFormatting.YELLOW - + mEfficiency / 100.0F - + EnumChatFormatting.RESET - + " %", - /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " - + EnumChatFormatting.GREEN - + mPollutionReduction - + EnumChatFormatting.RESET - + " %", - /* 7 */ StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " - + EnumChatFormatting.GREEN - + mMaxParallel, - /* 8 */ StatCollector.translateToLocal("GT5U.multiblock.curparallelism") + ": " - + EnumChatFormatting.GREEN - + mCurrentParallel }; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Circuit Board Fabricator") - .addInfo("Controller for the PCB Factory") - .addInfo( - EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD - + "IMPORTANT!" - + " Check the configuration menu before building.") - .addInfo("Tier of the machine determines the available recipes.") - .addInfo("Machine tier (1-3) is set in the controller GUI.") - .addInfo("The configuration menu can be used to add upgrades.") - .addInfo("Each tier and upgrade requires additional structures.") - .addInfo("Power consumption is multiplied by Sqrt(structures).") - .addInfo("Tier 2 and 3 allow parallel by using extra nanites.") - .addInfo("Every doubling of nanites adds one parallel.") - .addInfo("1x->1, 2x->2, 4x->3, 8x->4 with no limit.") - .addInfo("Recipes require a cooling upgrade to be overclocked.") - .addInfo("Liquid Cooling uses 10 L/s of distilled water and enables default overclocks.") - .addInfo("Thermosink uses 10 L/s of Super Coolant and enables perfect overclocks.") - .addInfo("Trace size can be changed to modify the material usage and machine speed.") - .addInfo(AuthorBlueWeabo) - .beginStructureBlock(30, 38, 13, false) - .addSeparator() - .addMaintenanceHatch(EnumChatFormatting.GOLD + "1", 1) - .addEnergyHatch( - EnumChatFormatting.GOLD + "1" - + EnumChatFormatting.GRAY - + "-" - + EnumChatFormatting.GOLD - + "2" - + EnumChatFormatting.GRAY - + " or " - + EnumChatFormatting.GOLD - + "1" - + EnumChatFormatting.GRAY - + " TT energy hatch.", - 1) - .addInputBus(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1) - .addOutputBus(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1) - .addInputHatch(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1) - .addStructureInfo( - "Coolant Hatch (Input Hatch): " + EnumChatFormatting.GOLD - + "1" - + EnumChatFormatting.GRAY - + " Center of the Liquid Cooling/Thermosink") - .addStructureInfo( - EnumChatFormatting.BLUE + "Base Multi (Tier " - + EnumChatFormatting.DARK_PURPLE - + 1 - + EnumChatFormatting.BLUE - + "):") - .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box") - .addStructureInfo(EnumChatFormatting.GOLD + "9" + EnumChatFormatting.GRAY + " Vibrant Alloy Frame Box") - .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Reinforced Glass") - .addStructureInfo( - EnumChatFormatting.GOLD + "77" + EnumChatFormatting.GRAY + " Basic Photolithography Framework Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Grate Machine Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Plascrete Block") - .addStructureInfo( - EnumChatFormatting.BLUE + "Tier " - + EnumChatFormatting.DARK_PURPLE - + 2 - + EnumChatFormatting.BLUE - + " (Adds to Tier " - + EnumChatFormatting.DARK_PURPLE - + 1 - + EnumChatFormatting.BLUE - + "):") - .addStructureInfo(EnumChatFormatting.GOLD + "34" + EnumChatFormatting.GRAY + " Duranium Frame Box") - .addStructureInfo( - EnumChatFormatting.GOLD + "158" - + EnumChatFormatting.GRAY - + " Reinforced Photolithography Framework Casing") - .addStructureInfo( - EnumChatFormatting.BLUE + "Tier " + EnumChatFormatting.DARK_PURPLE + 3 + EnumChatFormatting.BLUE + ":") - .addStructureInfo( - EnumChatFormatting.GOLD + "292" - + EnumChatFormatting.GRAY - + " Radiation Proof Photolithography Framework Casing") - .addStructureInfo( - EnumChatFormatting.GOLD + "76" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") - .addStructureInfo(EnumChatFormatting.BLUE + "Biochamber Upgrade") - .addStructureInfo( - EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY + " Clean Stainless Steel Machine Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box") - .addStructureInfo(EnumChatFormatting.GOLD + "72" + EnumChatFormatting.GRAY + " Reinforced Glass") - .addStructureInfo( - EnumChatFormatting.BLUE + "Liquid Cooling Tower (Tier " - + EnumChatFormatting.DARK_PURPLE - + 1 - + EnumChatFormatting.BLUE - + "):") - .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box") - .addStructureInfo( - EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") - .addStructureInfo( - EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Extreme Engine Intake Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing") - .addStructureInfo( - EnumChatFormatting.GOLD + "21" - + EnumChatFormatting.GRAY - + " Reinforced Photolithography Framework Casing") - .addStructureInfo( - EnumChatFormatting.BLUE + "Thermosink Radiator(Tier " - + EnumChatFormatting.DARK_PURPLE - + 2 - + EnumChatFormatting.BLUE - + "):") - .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Americium Frame Box") - .addStructureInfo( - EnumChatFormatting.GOLD + "41" - + EnumChatFormatting.GRAY - + " Reinforced Photolithography Framework Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "8" + EnumChatFormatting.GRAY + " Superconducting Coil Block") - .addStructureInfo(EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing") - .addStructureInfo(EnumChatFormatting.GOLD + "48" + EnumChatFormatting.GRAY + " Infinity Cooled Casing") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("mBioUpgrade", mBioUpgrade); - aNBT.setBoolean("mBioRotate", mBioRotate); - aNBT.setInteger("mBioOffsetX", mBioOffsets[0]); - aNBT.setInteger("mBioOffsetZ", mBioOffsets[1]); - aNBT.setBoolean("mOCTier1Upgrade", mOCTier1); - aNBT.setInteger("mOCTier1OffsetX", mOCTier1Offsets[0]); - aNBT.setInteger("mOCTier1OffsetZ", mOCTier1Offsets[1]); - aNBT.setBoolean("mOCTier2Upgrade", mOCTier2); - aNBT.setInteger("mOCTier2OffsetX", mOCTier2Offsets[0]); - aNBT.setInteger("mOCTier2OffsetZ", mOCTier2Offsets[1]); - aNBT.setFloat("mRoughnessMultiplier", mRoughnessMultiplier); - aNBT.setInteger("mSetTier", mSetTier); - } - - @Override - public void loadNBTData(final NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("mSeparate")) { - // backward compatibility - inputSeparation = aNBT.getBoolean("mSeparate"); - } - mBioUpgrade = aNBT.getBoolean("mBioUpgrade"); - mBioRotate = aNBT.getBoolean("mBioRotate"); - mBioOffsets[0] = aNBT.getInteger("mBioOffsetX"); - mBioOffsets[1] = aNBT.getInteger("mBioOffsetZ"); - mOCTier1 = aNBT.getBoolean("mOCTier1Upgrade"); - mOCTier1Offsets[0] = aNBT.getInteger("mOCTier1OffsetX"); - mOCTier1Offsets[1] = aNBT.getInteger("mOCTier1OffsetZ"); - mOCTier2 = aNBT.getBoolean("mOCTier2Upgrade"); - mOCTier2Offsets[0] = aNBT.getInteger("mOCTier2OffsetX"); - mOCTier2Offsets[1] = aNBT.getInteger("mOCTier2OffsetZ"); - mRoughnessMultiplier = aNBT.getFloat("mRoughnessMultiplier"); - mSetTier = aNBT.getInteger("mSetTier"); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - protected SoundResource getProcessStartSound() { - return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP; - } - - @Override - public byte getUpdateData() { - byte data = 0; - if (mSetTier == 1) { - data += mTier1BitMap; - } else if (mSetTier == 2) { - data += mTier2BitMap; - } else { - data += mTier3BitMap; - } - - if (mBioUpgrade) { - data += mBioBitMap; - } - - if (mBioRotate) { - data += mBioRotateBitMap; - } - - if (mOCTier1) { - data += mOCTier1BitMap; - } - - if (mOCTier2) { - data += mOCTier2BitMap; - } - - return data; - } - - @Override - public Pos2d getStructureUpdateButtonPos() { - return new Pos2d(80, 91); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - buildContext.addSyncedWindow(10, this::createConfigurationWindow); - builder.widget( - new ButtonWidget().setOnClick( - (clickData, widget) -> { - if (!widget.isClient()) widget.getContext() - .openSyncedWindow(10); - }) - .setSize(16, 16) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(GT_UITextures.BUTTON_STANDARD); - ret.add(GT_UITextures.OVERLAY_BUTTON_CYCLIC); - return ret.toArray(new IDrawable[0]); - }) - .addTooltip("Configuration Menu") - .setPos(174, 130)) - .widget( - new TextWidget(new Text("Tier")).setTextAlignment(Alignment.Center) - .setScale(0.91f) - .setSize(20, 16) - .setPos(173, 98)) - .widget( - new NumericWidget().setGetter(() -> mSetTier) - .setSetter(val -> mSetTier = (int) val) - .setBounds(1, 3) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip("PCB Factory Tier") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(18, 18) - .setPos(173, 110)); - } - - protected ModularWindow createConfigurationWindow(final EntityPlayer player) { - ModularWindow.Builder builder = ModularWindow.builder(200, 160); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.setGuiTint(getGUIColorization()); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC) - .setPos(5, 5) - .setSize(16, 16)) - .widget(new TextWidget("Configuration Menu").setPos(25, 9)) - .widget( - ButtonWidget.closeWindowButton(true) - .setPos(185, 3)) - .widget( - new DynamicPositionedColumn().setSynced(false) - .widget( - new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mBioUpgrade, val -> { - mBioUpgrade = val; - if (!mBioUpgrade) { - GT_Utility - .sendChatToPlayer(player, GT_Utility.trans("339.1", "Biochamber Upgrade Disabled")); - } else { - GT_Utility - .sendChatToPlayer(player, GT_Utility.trans("339", "Biochamber Upgrade Enabled")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setSize(90, 18) - .addTooltip( - "Enables nanites to construct organic circuitry. Required for Bioware and Wetware boards.")) - .addChild( - new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC) - .setSize(18, 18)) - .addChild( - new TextWidget("Biochamber").setTextAlignment(Alignment.Center) - .setPos(23, 5)) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mBioRotate, val -> { - mBioRotate = val; - if (!mBioRotate) { - GT_Utility - .sendChatToPlayer(player, GT_Utility.trans("340.1", "Rotated biochamber disabled")); - } else { - GT_Utility.sendChatToPlayer(player, GT_Utility.trans("340", "Rotated biochamber enabled")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setSize(90, 18) - .addTooltip("Rotates the biochamber by 90 degrees.")) - .addChild( - new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC) - .setSize(18, 18)) - .addChild( - new TextWidget("Bio Rotation").setTextAlignment(Alignment.Center) - .setPos(23, 5)) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mOCTier1, val -> { - mOCTier1 = val; - mOCTier2 = false; - if (!mOCTier1) { - GT_Utility.sendChatToPlayer(player, GT_Utility.trans("341.1", "Tier 1 cooling disabled")); - } else { - GT_Utility.sendChatToPlayer(player, GT_Utility.trans("341", "Tier 1 cooling enabled")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setSize(90, 18) - .addTooltip( - "Allows for overclocking. Requires 10 L/s of distilled water. Cooling upgrades are mutually exclusive.")) - .addChild( - new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC) - .setSize(18, 18)) - .addChild( - new TextWidget("Liquid Cooling").setTextAlignment(Alignment.Center) - .setPos(20, 5)) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mOCTier2, val -> { - mOCTier2 = val; - mOCTier1 = false; - if (!mOCTier2) { - GT_Utility.sendChatToPlayer(player, GT_Utility.trans("342.1", "Tier 2 cooling disabled")); - } else { - GT_Utility.sendChatToPlayer(player, GT_Utility.trans("342", "Tier 2 cooling enabled")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setSize(90, 18) - .addTooltip( - "Enables perfect overclocking by allowing nanites to work with extreme speed and efficiency. Uses 10 L/s of Super Coolant.")) - .addChild( - new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC) - .setSize(18, 18)) - .addChild( - new TextWidget("Thermosink").setTextAlignment(Alignment.Center) - .setPos(20, 5)) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget( - new TextWidget(new Text("Trace Size")).setSize(90, 18) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive()) - .setPos(0, 4)) - .widget( - new NumericWidget().setGetter(() -> (int) ((1f / mRoughnessMultiplier) * 100f)) - .setSetter(val -> mRoughnessMultiplier = 100f / (int) val) - .setBounds(50, 200) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip( - "Set the trace size. Smaller traces allow material savings but take longer to fabricate. Larger traces waste material but are fast. 50-200 μm.") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(90, 16)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CROSS) - .setSize(18, 18) - .addTooltip(new Text("Can't change configuration when running !").color(Color.RED.dark(3))) - .setEnabled(widget -> getBaseMetaTileEntity().isActive())) - .setPos(10, 25)) - .widget( - new DynamicPositionedColumn().setSynced(false) - .widget( - new TextWidget(new Text("Bio Upgrade Offsets")).setSize(72, 18) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget( - new DynamicPositionedRow().setSynced(false) - .widget( - new NumericWidget().setGetter(() -> mBioOffsets[0]) - .setSetter(val -> mBioOffsets[0] = (int) val) - .setBounds(-16, 16) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip("X Offset") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(36, 18)) - .widget( - new NumericWidget().setGetter(() -> mBioOffsets[1]) - .setSetter(val -> mBioOffsets[1] = (int) val) - .setBounds(-16, 16) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip("Z Offset") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(36, 18)) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget( - new TextWidget(new Text("Cooler Tier 1 Offsets")).setSize(72, 18) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget( - new DynamicPositionedRow().setSynced(false) - .widget( - new NumericWidget().setGetter(() -> mOCTier1Offsets[0]) - .setSetter(val -> mOCTier1Offsets[0] = (int) val) - .setBounds(-16, 16) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip("X Offset") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(36, 18)) - .widget( - new NumericWidget().setGetter(() -> mOCTier1Offsets[1]) - .setSetter(val -> mOCTier1Offsets[1] = (int) val) - .setBounds(-16, 16) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip("Z Offset") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(36, 18)) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget( - new TextWidget(new Text("Cooler Tier 2 Offsets")).setSize(72, 18) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .widget( - new DynamicPositionedRow().setSynced(false) - .widget( - new NumericWidget().setGetter(() -> mOCTier2Offsets[0]) - .setSetter(val -> mOCTier2Offsets[0] = (int) val) - .setBounds(-16, 16) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip("X Offset") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(36, 18)) - .widget( - new NumericWidget().setGetter(() -> mOCTier2Offsets[1]) - .setSetter(val -> mOCTier2Offsets[1] = (int) val) - .setBounds(-16, 16) - .setTextColor(Color.WHITE.normal) - .setTextAlignment(Alignment.Center) - .addTooltip("Z Offset") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .setSize(36, 18)) - .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) - .setPos(110, 25)); - return builder.build(); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java deleted file mode 100644 index d23ea912bb..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java +++ /dev/null @@ -1,1263 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.ExoticEnergy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.AuthorColen; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_OFF; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_ON; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_RAINBOWSCREEN_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -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 static net.minecraft.util.StatCollector.translateToLocal; - -import java.util.ArrayList; -import java.util.HashMap; -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.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.NotNull; - -import com.github.technus.tectech.thing.gui.TecTechUITextures; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.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.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -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.HeatingCoilLevel; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.MaterialsUEVplus; -import gregtech.api.enums.SoundResource; -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.logic.ProcessingLogic; -import gregtech.api.metatileentity.GregTechTileClientEvents; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; -import gregtech.api.objects.GT_ChunkManager; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_ParallelHelper; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_PlasmaForge extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - // 3600 seconds in an hour, 8 hours, 20 ticks in a second. - private static final double max_efficiency_time_in_ticks = 3600d * 8d * 20d; - // Multiplier for the efficiency decay rate - private static final double efficiency_decay_rate = 100; - private static final double maximum_discount = 0.5d; - private static final int CONVERGENCE_BITMAP = 0b1; - private static final int DISCOUNT_BITMAP = 0b10; - - // Valid fuels which the discount will get applied to. - private static final FluidStack[] valid_fuels = { MaterialsUEVplus.ExcitedDTCC.getFluid(1L), - MaterialsUEVplus.ExcitedDTPC.getFluid(1L), MaterialsUEVplus.ExcitedDTRC.getFluid(1L), - MaterialsUEVplus.ExcitedDTEC.getFluid(1L), MaterialsUEVplus.ExcitedDTSC.getFluid(1L) }; - - private static final HashMap> FUEL_ENERGY_VALUES = new HashMap<>() { - - { - put( - MaterialsUEVplus.ExcitedDTCC.getFluid(1L) - .getFluid(), - Pair.of(14_514_983L, 1 / 8f)); - put( - MaterialsUEVplus.ExcitedDTPC.getFluid(1L) - .getFluid(), - Pair.of(66_768_460L, 1 / 4f)); - put( - MaterialsUEVplus.ExcitedDTRC.getFluid(1L) - .getFluid(), - Pair.of(269_326_451L, 1 / 2f)); - put( - MaterialsUEVplus.ExcitedDTEC.getFluid(1L) - .getFluid(), - Pair.of(1_073_007_393L, 1f)); - put( - MaterialsUEVplus.ExcitedDTSC.getFluid(1L) - .getFluid(), - Pair.of(4_276_767_521L, 2f)); - } - }; - - private static final int min_input_hatch = 0; - private static final int max_input_hatch = 7; - private static final int min_output_hatch = 0; - private static final int max_output_hatch = 2; - private static final int min_input_bus = 0; - private static final int max_input_bus = 6; - private static final int min_output_bus = 0; - private static final int max_output_bus = 1; - - // Current discount rate. 1 = 0%, 0 = 100%. - private double discount = 1; - private int mHeatingCapacity = 0; - private long running_time = 0; - private boolean convergence = false; - private HeatingCoilLevel mCoilLevel; - private GT_OverclockCalculator overclockCalculator; - - @SuppressWarnings("SpellCheckingInspection") - private static final String[][] structure_string = new String[][] { { " ", - " N N N N ", " N N N N ", " N N N N ", - " ", " ", " ", - " N N N N ", " N N N N ", " NNN NNN N N NNN NNN ", - " ", " ", " ", - " NNN NNN NNN NNN ", " ", " ", - " ", " ", " ", - " NNN NNN NNN NNN ", " ", " ", - " ", " NNN NNN NNN NNN " }, - { " N N N N ", " bCCCb bCCCb ", " bCCCb bCCCb ", - " bCCCb bCCCb ", " N N N N ", - " ", " N N N N ", - " bCCCb bCCCb ", " bCCCb bCCCb ", - "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CCC CCC N N CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN NbbbN NbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN N N NbbbN NbbbN", }, - { " N N N N ", " bCCCb bCCCb ", " NNNbbbbbNNsNNbbbbbNNN ", - " ss bCCCb bCCCb ss ", " s N N N N s ", - " s s ", " N N N N N N ", - " N bCCCb bCCCb N ", " N sbbbbbNNsNNbbbbbs N ", - "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", - " NNN NNN NNN NNN ", " s s s s ", - " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", - "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, - { " N N N N ", " bCCCb bCCCb ", " ss bCCCb bCCCb ss ", - " bCCCb bCCCb ", " s NCCCN NCCCN s ", - " s NCCCN NCCCN s ", " NCCCN NCCCN ", - " bCCCb bCCCb ", " bCCCb bCCCb ", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbN NbbbNNNbbbN", }, - { " ", " N N N N ", " s N N N N s ", - " s NCCCN NCCCN s ", " ", - " ", " ", - " NCCCN NCCCN ", " N N N N ", - " NNN NN N N NN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " ", " ", - " NNN NNN NNN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NbN NNN NNN ", }, - { " ", " ", " s s ", - " s NCCCN NCCCN s ", " ", - " ", " ", - " NCCCN NCCCN ", " ", - " N N N N ", " C C C C ", - " C C C C ", " C C C C ", - " N N N N ", " ", - " ", " ", - " ", " ", - " N N N N ", " C C C C ", - " C C C C ", " C C C C ", - " N N NbN N N ", }, - { " ", " N N N N ", " N N N N N N ", - " NCCCN NCCCN ", " ", - " ", " ", - " NCCCN NCCCN ", " N N N N ", - " NNN NN N N NN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " ", " ", - " NNN NNN NNN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NbN NNN NNN ", }, - { " N N N N ", " bCCCb bCCCb ", " N bCCCb bCCCb N ", - " bCCCb bCCCb ", " NCCCN NCCCN ", - " NCCCN NCCCN ", " NCCCN NCCCN ", - " bCCCb bCCCb ", " bCCCb bCCCb ", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbN NbbbNNNbbbN", }, - { " N N N N ", " bCCCb bCCCb ", " N sbbbbbNNsNNbbbbbs N ", - " bCCCb bCCCb ", " N N N N ", - " ", " N N N N ", - " bCCCb bCCCb ", " s sbbbbbNNsNNbbbbbs s ", - "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", - " NNN NNN NNN NNN ", " s s s s ", - " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", - "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, - { " NNN NNN N N NNN NNN ", "NbbbN NbbNCCCb bCCCNbbN NbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " NNN NNN N N NNN NNN ", - " N N N N ", " NNN NNN N N NNN NNN ", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", - "NNNN NNNCCCb bCCCNNN NNNN", " CCC CCC N N CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN NbbbN NbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN NbN NbbbN NbbbN", }, - { " ", " CCC CCC N N CCC CCC ", " CbC CbC N N CbC CbC ", - " CCCCCCCCC N N CCCCCCCCC ", " C C C C ", - " C C C C ", " C C C C ", - " CCCCCCCCC N N CCCCCCCCC ", " CbC CbC N N CbC CbC ", - " CCC CCC N N CCC CCC ", " ", - " ", " ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " ", " ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " NNN NNN NbN NNN NNN ", }, - { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", - " CCCCCCCCC CCCCCCCCC ", " C C C C ", - " C C C C ", " C C C C ", - " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", - " CCC CCC CCC CCC ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NbN N N ", }, - { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", - " CCCCCCCCC CCCCCCCCC ", " C C C C ", - " C C C C ", " C C C C ", - " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", - " CCC CCC CCC CCC ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NbN N N ", }, - { " NNN NNN NNN NNN ", "NbbbN NbbbN NbbbN NbbbN", "NbbbN NbbbN NbbbN NbbbN", - "NbbbNNNbbbN NbbbNNNbbbN", " NNN NNN NNN NNN ", - " N N N N ", " NNN NNN NNN NNN ", - "NbbbNNNbbbN NbbbNNNbbbN", "NbbbN NbbbN NbbbN NbbbN", - "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NsNsN N N ", }, - { " ", " ", " N N N N ", - " ", " ", - " ", " ", - " ", " N N N N ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NbbbbbN N N ", }, - { " ", " ", " N N N N ", - " ", " ", - " ", " ", - " ", " N N N N ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " N ", - " NsNNNNNsNNNNsbbbbbsNNNNsNNNNNsN ", }, - { " ", " ", " s s s s ", - " ", " ", - " ", " ", - " ", " s s s s ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ~ ", " NNN ", - " NbbbbbNbbbbNbbbbbNbbbbNbbbbbN ", }, - { " ", " ", " N N N N ", - " ", " ", - " ", " ", - " ", " N N N N ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " N ", - " NsNNNNNsNNNNsbbbbbsNNNNsNNNNNsN ", }, - { " ", " ", " N N N N ", - " ", " ", - " ", " ", - " ", " N N N N ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NbbbbbN N N ", }, - { " NNN NNN NNN NNN ", "NbbbN NbbbN NbbbN NbbbN", "NbbbN NbbbN NbbbN NbbbN", - "NbbbNNNbbbN NbbbNNNbbbN", " NNN NNN NNN NNN ", - " N N N N ", " NNN NNN NNN NNN ", - "NbbbNNNbbbN NbbbNNNbbbN", "NbbbN NbbbN NbbbN NbbbN", - "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NsNsN N N ", }, - { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", - " CCCCCCCCC CCCCCCCCC ", " C C C C ", - " C C C C ", " C C C C ", - " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", - " CCC CCC CCC CCC ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NbN N N ", }, - { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", - " CCCCCCCCC CCCCCCCCC ", " C C C C ", - " C C C C ", " C C C C ", - " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", - " CCC CCC CCC CCC ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " ", " ", - " N N NbN N N ", }, - { " ", " CCC CCC N N CCC CCC ", " CbC CbC N N CbC CbC ", - " CCCCCCCCC N N CCCCCCCCC ", " C C C C ", - " C C C C ", " C C C C ", - " CCCCCCCCC N N CCCCCCCCC ", " CbC CbC N N CbC CbC ", - " CCC CCC N N CCC CCC ", " ", - " ", " ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " ", " ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " NNN NNN NbN NNN NNN ", }, - { " NNN NNN N N NNN NNN ", "NbbbN NbbNCCCb bCCCNbbN NbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " NNN NNN N N NNN NNN ", - " N N N N ", " NNN NNN N N NNN NNN ", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", - "NNNN NNNCCCb bCCCNNN NNNN", " CCC CCC N N CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN NbbbN NbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN NbN NbbbN NbbbN", }, - { " N N N N ", " bCCCb bCCCb ", " N sbbbbbNNsNNbbbbbs N ", - " bCCCb bCCCb ", " N N N N ", - " ", " N N N N ", - " bCCCb bCCCb ", " s sbbbbbNNsNNbbbbbs s ", - "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", - " NNN NNN NNN NNN ", " s s s s ", - " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", - "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, - { " N N N N ", " bCCCb bCCCb ", " N bCCCb bCCCb N ", - " bCCCb bCCCb ", " NCCCN NCCCN ", - " NCCCN NCCCN ", " NCCCN NCCCN ", - " bCCCb bCCCb ", " bCCCb bCCCb ", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbN NbbbNNNbbbN", }, - { " ", " N N N N ", " N N N N N N ", - " NCCCN NCCCN ", " ", - " ", " ", - " NCCCN NCCCN ", " N N N N ", - " NNN NN N N NN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " ", " ", - " NNN NNN NNN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NbN NNN NNN ", }, - { " ", " ", " s s ", - " s NCCCN NCCCN s ", " ", - " ", " ", - " NCCCN NCCCN ", " ", - " N N N N ", " C C C C ", - " C C C C ", " C C C C ", - " N N N N ", " ", - " ", " ", - " ", " ", - " N N N N ", " C C C C ", - " C C C C ", " C C C C ", - " N N NbN N N ", }, - { " ", " N N N N ", " s N N N N s ", - " s NCCCN NCCCN s ", " ", - " ", " ", - " NCCCN NCCCN ", " N N N N ", - " NNN NN N N NN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " ", " ", - " NNN NNN NNN NNN ", " C C C C ", - " C C C C ", " C C C C ", - " NNN NNN NbN NNN NNN ", }, - { " N N N N ", " bCCCb bCCCb ", " ss bCCCb bCCCb ss ", - " bCCCb bCCCb ", " s NCCCN NCCCN s ", - " s NCCCN NCCCN s ", " NCCCN NCCCN ", - " bCCCb bCCCb ", " bCCCb bCCCb ", - "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", - "NbbbNNNbbbN NbN NbbbNNNbbbN", }, - { " N N N N ", " bCCCb bCCCb ", " NNNbbbbbNNsNNbbbbbNNN ", - " ss bCCCb bCCCb ss ", " s N N N N s ", - " s s ", " N N N N N N ", - " N bCCCb bCCCb N ", " N sbbbbbNNsNNbbbbbs N ", - "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", - " NNN NNN NNN NNN ", " s s s s ", - " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", - "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", - " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", - "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, - { " N N N N ", " bCCCb bCCCb ", " bCCCb bCCCb ", - " bCCCb bCCCb ", " N N N N ", - " ", " N N N N ", - " bCCCb bCCCb ", " bCCCb bCCCb ", - "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CCC CCC N N CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN NbbbN NbbbN", " N N N N ", - " N N N N ", " ", - " N N N N ", " N N N N ", - "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", - " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", - "NbbbN NbbbN N N NbbbN NbbbN", }, - { " ", " N N N N ", " N N N N ", - " N N N N ", " ", - " ", " ", - " N N N N ", " N N N N ", - " NNN NNN N N NNN NNN ", " ", - " ", " ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " ", " ", - " NNN NNN NNN NNN ", " ", - " ", " ", - " NNN NNN NNN NNN ", } }; - - protected static final int DIM_TRANS_CASING = 12; - protected static final int DIM_INJECTION_CASING = 13; - protected static final int DIM_BRIDGE_CASING = 14; - - private boolean isMultiChunkloaded = true; - - protected static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure_string) - .addElement( - 'C', - ofCoil(GT_MetaTileEntity_PlasmaForge::setCoilLevel, GT_MetaTileEntity_PlasmaForge::getCoilLevel)) - .addElement( - 'b', - buildHatchAdder(GT_MetaTileEntity_PlasmaForge.class) - .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Energy, ExoticEnergy, Maintenance) - .casingIndex(DIM_INJECTION_CASING) - .dot(3) - .buildAndChain(GregTech_API.sBlockCasings1, DIM_INJECTION_CASING)) - .addElement('N', ofBlock(GregTech_API.sBlockCasings1, DIM_TRANS_CASING)) - .addElement('s', ofBlock(GregTech_API.sBlockCasings1, DIM_BRIDGE_CASING)) - .build(); - - public GT_MetaTileEntity_PlasmaForge(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PlasmaForge(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PlasmaForge(mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Plasma Forge, DTPF") - .addInfo("Transcending Dimensional Boundaries.") - .addInfo( - "Takes " + EnumChatFormatting.RED - + GT_Utility.formatNumbers(max_efficiency_time_in_ticks / (3600 * 20)) - + EnumChatFormatting.GRAY - + " hours of continuous run time to fully breach dimensional") - .addInfo( - "boundaries and achieve maximum efficiency, reducing fuel consumption by up to " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(100 * maximum_discount) - + "%" - + EnumChatFormatting.GRAY - + ".") - .addInfo("Multidimensional spaces can be perfectly aligned and synchronized in this state, ") - .addInfo( - "allowing " + EnumChatFormatting.GOLD - + "Dimensional Convergence " - + EnumChatFormatting.GRAY - + "to occur. To reach the required stability threshold,") - .addInfo( - "a " + EnumChatFormatting.AQUA - + "Transdimensional Alignment Matrix " - + EnumChatFormatting.GRAY - + "must be placed in the controller.") - .addInfo( - "When " + EnumChatFormatting.GOLD - + "Convergence " - + EnumChatFormatting.GRAY - + "is active, it allows the forge to perform " - + EnumChatFormatting.RED - + "Perfect Overclocks" - + EnumChatFormatting.GRAY - + ",") - .addInfo("but the extra power cost is instead added in form of increased catalyst amounts.") - .addInfo( - "When no recipe is running, fuel discount decays x" + EnumChatFormatting.RED - + GT_Utility.formatNumbers(efficiency_decay_rate) - + EnumChatFormatting.GRAY - + " as fast as it builds up.") - .addInfo(AuthorColen) - .addSeparator() - .beginStructureBlock(33, 24, 33, false) - .addStructureInfo("DTPF Structure is too complex! See schematic for details.") - .addStructureInfo(EnumChatFormatting.GOLD + "2,112" + EnumChatFormatting.GRAY + " Heating coils required.") - .addStructureInfo( - EnumChatFormatting.GOLD + "120" + EnumChatFormatting.GRAY + " Dimensional bridge blocks required.") - .addStructureInfo( - EnumChatFormatting.GOLD + "1,270" - + EnumChatFormatting.GRAY - + " Dimensional injection casings required.") - .addStructureInfo( - EnumChatFormatting.GOLD + "2,121" - + EnumChatFormatting.GRAY - + " Dimensionally transcendent casings required.") - .addStructureInfo("--------------------------------------------") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + "1" - + EnumChatFormatting.GRAY - + "-" - + EnumChatFormatting.GOLD - + "2" - + EnumChatFormatting.GRAY - + " energy hatches or " - + EnumChatFormatting.GOLD - + "1" - + EnumChatFormatting.GRAY - + " TT energy hatch.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + min_input_hatch - + EnumChatFormatting.GRAY - + "-" - + EnumChatFormatting.GOLD - + max_input_hatch - + EnumChatFormatting.GRAY - + " input hatches.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + min_output_hatch - + EnumChatFormatting.GRAY - + "-" - + EnumChatFormatting.GOLD - + max_output_hatch - + EnumChatFormatting.GRAY - + " output hatches.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + min_input_bus - + EnumChatFormatting.GRAY - + "-" - + EnumChatFormatting.GOLD - + max_input_bus - + EnumChatFormatting.GRAY - + " input busses.") - .addStructureInfo( - "Requires " + EnumChatFormatting.GOLD - + min_output_bus - + EnumChatFormatting.GRAY - + "-" - + EnumChatFormatting.GOLD - + max_input_bus - + EnumChatFormatting.GRAY - + " output busses.") - .addStructureInfo("--------------------------------------------") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - boolean exotic = addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex); - return super.addToMachineList(aTileEntity, aBaseCasingIndex) || exotic; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - IIconContainer glow = OVERLAY_FUSION1_GLOW; - if (convergence && discount == maximum_discount) { - glow = OVERLAY_RAINBOWSCREEN_GLOW; - } - if (side == aFacing) { - if (aActive) return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING], TextureFactory.builder() - .addIcon(OVERLAY_DTPF_ON) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(glow) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING], TextureFactory.builder() - .addIcon(OVERLAY_DTPF_OFF) - .extFacing() - .build() }; - } - return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING] }; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return 0; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.plasmaForgeRecipes; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - CheckRecipeResult recipe_process = super.checkProcessing(); - if (recipe_process.wasSuccessful()) { - running_time = running_time + mMaxProgresstime; - } - return recipe_process; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @Nonnull - @Override - protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - overclockCalculator = super.createOverclockCalculator(recipe).setRecipeHeat(recipe.mSpecialValue) - .setMachineHeat(mHeatingCapacity); - if (discount == maximum_discount && convergence) { - overclockCalculator = overclockCalculator.enablePerfectOC(); - } - return overclockCalculator; - } - - @NotNull - @Override - protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) { - return super.createParallelHelper(recipeAfterAdjustments(recipe)); - } - - @Override - protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - return recipe.mSpecialValue <= mHeatingCapacity ? CheckRecipeResultRegistry.SUCCESSFUL - : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); - } - }; - } - - @Nonnull - protected GT_Recipe recipeAfterAdjustments(@Nonnull GT_Recipe recipe) { - GT_Recipe tRecipe = recipe.copy(); - boolean adjusted = false; - outside: for (int i = 0; i < recipe.mFluidInputs.length; i++) { - for (FluidStack fuel : valid_fuels) { - if (tRecipe.mFluidInputs[i].isFluidEqual(fuel)) { - recalculateDiscount(); - if (discount == maximum_discount && convergence - && overclockCalculator != null - && overclockCalculator.getCalculationStatus()) { - calculateCatalystIncrease(tRecipe, i, false); - getBaseMetaTileEntity() - .sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); - } - tRecipe.mFluidInputs[i].amount = (int) Math.round(tRecipe.mFluidInputs[i].amount * discount); - adjusted = true; - break outside; - } - } - } - // Convergence adjusts the recipe even if it has no catalyst input - if (!adjusted && discount == maximum_discount - && convergence - && overclockCalculator != null - && overclockCalculator.getCalculationStatus()) { - recalculateDiscount(); - calculateCatalystIncrease(tRecipe, 0, true); - getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); - } - return tRecipe; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - - // Reset heating capacity. - mHeatingCapacity = 0; - - // Get heating capacity from coils in structure. - setCoilLevel(HeatingCoilLevel.None); - - // Check the main structure - if (!checkPiece(STRUCTURE_PIECE_MAIN, 16, 21, 16)) return false; - - if (getCoilLevel() == HeatingCoilLevel.None) return false; - - // Item input bus check. - if (mInputBusses.size() > max_input_bus) return false; - - // Item output bus check. - if (mOutputBusses.size() > max_output_bus) return false; - - // Fluid input hatch check. - if (mInputHatches.size() > max_input_hatch) return false; - - // Fluid output hatch check. - if (mOutputHatches.size() > max_output_hatch) return false; - - // If there is more than 1 TT energy hatch, the structure check will fail. - // If there is a TT hatch and a normal hatch, the structure check will fail. - if (mExoticEnergyHatches.size() > 0) { - if (mEnergyHatches.size() > 0) return false; - if (mExoticEnergyHatches.size() > 1) return false; - } - - // If there is 0 or more than 2 energy hatches structure check will fail. - if (mEnergyHatches.size() > 0) { - if (mEnergyHatches.size() > 2) return false; - - // Check will also fail if energy hatches are not of the same tier. - byte tier_of_hatch = mEnergyHatches.get(0).mTier; - for (GT_MetaTileEntity_Hatch_Energy energyHatch : mEnergyHatches) { - if (energyHatch.mTier != tier_of_hatch) { - return false; - } - } - } - - // If there are no energy hatches or TT energy hatches, structure will fail to form. - if ((mEnergyHatches.size() == 0) && (mExoticEnergyHatches.size() == 0)) return false; - - // Maintenance hatch not required but left for compatibility. - // Don't allow more than 1, no free casing spam! - if (mMaintenanceHatches.size() > 1) return false; - - // Heat capacity of coils used on multi. No free heat from extra EU! - mHeatingCapacity = (int) getCoilLevel().getHeat(); - - // All structure checks passed, return true. - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public void clearHatches() { - super.clearHatches(); - mExoticEnergyHatches.clear(); - } - - @Override - public boolean addOutput(FluidStack aLiquid) { - if (aLiquid == null) return false; - FluidStack tLiquid = aLiquid.copy(); - - return dumpFluid(mOutputHatches, tLiquid, true) || dumpFluid(mOutputHatches, tLiquid, false); - } - - @Override - public String[] getInfoData() { - - long storedEnergy = 0; - long maxEnergy = 0; - - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mExoticEnergyHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - long voltage = getAverageInputVoltage(); - long amps = getMaxInputAmps(); - - // Calculate discount to make sure it is shown properly even when machine is off but decaying - recalculateDiscount(); - - return new String[] { "------------ Critical Information ------------", - StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mProgresstime) - + EnumChatFormatting.RESET - + "t / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime) - + EnumChatFormatting.RESET - + "t", - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(getActualEnergyUsage()) - + EnumChatFormatting.RESET - + " EU/t", - StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(voltage) - + EnumChatFormatting.RESET - + " EU/t(*" - + EnumChatFormatting.YELLOW - + amps - + EnumChatFormatting.RESET - + "A) " - + StatCollector.translateToLocal("GT5U.machines.tier") - + ": " - + EnumChatFormatting.YELLOW - + VN[GT_Utility.getTier(voltage)] - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.EBF.heat") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mHeatingCapacity) - + EnumChatFormatting.RESET - + " K", - "Ticks run: " + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(running_time) - + EnumChatFormatting.RESET - + ", Fuel Discount: " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(100 * (1 - discount)) - + EnumChatFormatting.RESET - + "%", - "Convergence: " + (convergence ? EnumChatFormatting.GREEN + "Active" : EnumChatFormatting.RED + "Inactive"), - "-----------------------------------------" }; - } - - private void recalculateDiscount() { - double time_percentage = running_time / max_efficiency_time_in_ticks; - time_percentage = Math.min(time_percentage, 1.0d); - // Multiplied by 0.5 because that is the maximum achievable discount - discount = 1 - time_percentage * 0.5; - discount = Math.max(maximum_discount, discount); - } - - private int catalystTypeForRecipesWithoutCatalyst = 1; - - private void calculateCatalystIncrease(GT_Recipe recipe, int index, boolean withoutCatalyst) { - long machineConsumption = overclockCalculator.getConsumption(); - int numberOfOverclocks = (int) Math.ceil(calculateTier(machineConsumption) - GT_Utility.getTier(recipe.mEUt)); - double recipeDuration = recipe.mDuration / Math.pow(4, numberOfOverclocks); - // Power difference between regular and perfect OCs for this recipe duration - long extraPowerNeeded = (long) ((Math.pow(2, numberOfOverclocks) - 1) * machineConsumption * recipeDuration); - int inputFluids = recipe.mFluidInputs.length; - int outputFluids = recipe.mFluidOutputs.length; - int extraCatalystNeeded; - Fluid validFuel; - if (!withoutCatalyst) { - validFuel = recipe.mFluidInputs[index].getFluid(); - extraCatalystNeeded = (int) (extraPowerNeeded / FUEL_ENERGY_VALUES.get(validFuel) - .getLeft()); - recipe.mFluidInputs[index].amount += extraCatalystNeeded; - // Increase present catalyst and residue by calculated amount - for (int j = 0; j < outputFluids; j++) { - if (recipe.mFluidOutputs[j] - .isFluidEqual(MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1))) { - recipe.mFluidOutputs[j].amount += (int) (extraCatalystNeeded * FUEL_ENERGY_VALUES.get(validFuel) - .getRight()); - } - } - } else { - // Add chosen catalyst as recipe input - validFuel = valid_fuels[catalystTypeForRecipesWithoutCatalyst - 1].getFluid(); - extraCatalystNeeded = (int) (extraPowerNeeded / FUEL_ENERGY_VALUES.get(validFuel) - .getLeft()); - FluidStack[] newInputFluids = new FluidStack[inputFluids + 1]; - for (int i = 0; i < inputFluids; i++) { - newInputFluids[i] = recipe.mFluidInputs[i].copy(); - } - newInputFluids[inputFluids] = new FluidStack(validFuel, extraCatalystNeeded / 2); - recipe.mFluidInputs = newInputFluids; - // Add residue as recipe output - FluidStack[] newOutputFluids = new FluidStack[outputFluids + 1]; - for (int i = 0; i < outputFluids; i++) { - newOutputFluids[i] = recipe.mFluidOutputs[i].copy(); - } - newOutputFluids[outputFluids] = new FluidStack( - MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1), - (int) (extraCatalystNeeded * FUEL_ENERGY_VALUES.get(validFuel) - .getRight())); - recipe.mFluidOutputs = newOutputFluids; - } - } - - private static final double LN2 = Math.log(2); - - private double calculateTier(long voltage) { - return (1 + Math.max(0, (Math.log(voltage) / LN2) - 5) / 2); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide() && !aBaseMetaTileEntity.isAllowedToWork()) { - // If machine has stopped, stop chunkloading. - GT_ChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity); - isMultiChunkloaded = false; - } else if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && !isMultiChunkloaded) { - // Load a 3x3 area centered on controller when machine is running. - GT_ChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity); - - int ControllerXCoordinate = ((TileEntity) aBaseMetaTileEntity).xCoord; - int ControllerZCoordinate = ((TileEntity) aBaseMetaTileEntity).zCoord; - - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate + 16)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate - 16)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate + 16)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate - 16)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate + 16)); - GT_ChunkManager.requestChunkLoad( - (TileEntity) aBaseMetaTileEntity, - new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate - 16)); - - isMultiChunkloaded = true; - } - - super.onPostTick(aBaseMetaTileEntity, aTick); - - if (aBaseMetaTileEntity.isServerSide()) { - if (mMaxProgresstime == 0) { - running_time = Math.max(0, running_time - (long) efficiency_decay_rate); - } - if (aTick % 100 == 0) { - ItemStack controllerStack = this.getControllerSlot(); - if (convergence && (controllerStack == null - || !controllerStack.isItemEqual(ItemList.Transdimensional_Alignment_Matrix.get(1)))) { - convergence = false; - getBaseMetaTileEntity() - .sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); - } - } - } - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 16, 21, 16); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 16, 21, 16, realBudget, env, false, true); - } - - @SideOnly(Side.CLIENT) - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.GT_MACHINES_PLASMAFORGE_LOOP.resourceLocation; - } - - @Override - public byte getUpdateData() { - byte data = 0; - if (discount == maximum_discount) { - data += DISCOUNT_BITMAP; - } - if (convergence) { - data += CONVERGENCE_BITMAP; - } - return data; - } - - @Override - public void receiveClientEvent(byte aEventID, byte aValue) { - if (aEventID == GregTechTileClientEvents.CHANGE_CUSTOM_DATA) { - convergence = (aValue & CONVERGENCE_BITMAP) == CONVERGENCE_BITMAP; - if ((aValue & DISCOUNT_BITMAP) == DISCOUNT_BITMAP) { - discount = maximum_discount; - } - } - } - - private static final int CATALYST_WINDOW_ID = 10; - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - buildContext.addSyncedWindow(CATALYST_WINDOW_ID, this::createCatalystWindow); - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - ItemStack controllerStack = this.getControllerSlot(); - if (clickData.mouseButton == 0) { - if (controllerStack != null - && controllerStack.isItemEqual(ItemList.Transdimensional_Alignment_Matrix.get(1))) { - convergence = !convergence; - } - } else if (clickData.mouseButton == 1 && !widget.isClient()) { - widget.getContext() - .openSyncedWindow(CATALYST_WINDOW_ID); - } - }) - .setPlayClickSound(true) - .setBackground(() -> { - List ret = new ArrayList<>(); - if (convergence) { - ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); - ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_ON); - } else { - ret.add(GT_UITextures.BUTTON_STANDARD); - ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_OFF); - } - return ret.toArray(new IDrawable[0]); - }) - .addTooltip(translateToLocal("GT5U.DTPF.convergencebutton")) - .addTooltip(EnumChatFormatting.GRAY + translateToLocal("GT5U.DTPF.convergencebuttontooltip.0")) - .addTooltip(EnumChatFormatting.GRAY + translateToLocal("GT5U.DTPF.convergencebuttontooltip.1")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(174, 112) - .setSize(16, 16) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(() -> convergence, (val) -> convergence = val), builder)); - super.addUIWidgets(builder, buildContext); - } - - protected ModularWindow createCatalystWindow(final EntityPlayer player) { - final int WIDTH = 58; - 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("GT5U.DTPF.catalysttier") - .setPos(3, 4) - .setSize(50, 20)) - .widget( - new NumericWidget().setSetter(val -> catalystTypeForRecipesWithoutCatalyst = (int) val) - .setGetter(() -> catalystTypeForRecipesWithoutCatalyst) - .setBounds(1, 5) - .setDefaultValue(1) - .setScrollValues(1, 4, 64) - .setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal) - .setSize(50, 18) - .setPos(4, 25) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) - .addTooltip(translateToLocal("GT5U.DTPF.catalystinfotooltip")) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer( - () -> catalystTypeForRecipesWithoutCatalyst, - (val) -> catalystTypeForRecipesWithoutCatalyst = val), - builder)); - return builder.build(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setLong("eRunningTime", running_time); - aNBT.setDouble("eLongDiscountValue", discount); - aNBT.setInteger("catalystType", catalystTypeForRecipesWithoutCatalyst); - aNBT.setBoolean("convergence", convergence); - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(final NBTTagCompound aNBT) { - running_time = aNBT.getLong("eRunningTime"); - discount = aNBT.getDouble("eLongDiscountValue"); - catalystTypeForRecipesWithoutCatalyst = aNBT.getInteger("catalystType"); - convergence = aNBT.getBoolean("convergence"); - super.loadNBTData(aNBT); - } - - public HeatingCoilLevel getCoilLevel() { - return mCoilLevel; - } - - public void setCoilLevel(HeatingCoilLevel aCoilLevel) { - mCoilLevel = aCoilLevel; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean getDefaultHasMaintenanceChecks() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java deleted file mode 100644 index d28aae81ce..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java +++ /dev/null @@ -1,521 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.alignment.IAlignment; -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ProgressBar; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SteamVariant; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.gui.modularui.GUITextureSet; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.modularui.IGetTitleColor; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.RecipeMapWorkable; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; -import gregtech.common.GT_Pollution; - -public abstract class GT_MetaTileEntity_PrimitiveBlastFurnace extends MetaTileEntity - implements IAlignment, ISurvivalConstructable, RecipeMapWorkable, IAddUIWidgets, IGetTitleColor { - - public static final int INPUT_SLOTS = 3, OUTPUT_SLOTS = 3; - private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { - - @Override - protected IStructureDefinition computeValue(Class type) { - return IStructureDefinition.builder() - .addShape( - "main", - transpose( - new String[][] { { "ccc", "c-c", "ccc" }, { "ccc", "clc", "ccc" }, { "c~c", "clc", "ccc" }, - { "ccc", "ccc", "ccc" }, })) - .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMetaID()))) - .addElement( - 'l', - ofChain(isAir(), ofBlockAnyMeta(Blocks.lava, 1), ofBlockAnyMeta(Blocks.flowing_lava, 1))) - .build(); - } - }; - - public int mMaxProgresstime = 0; - private volatile boolean mUpdated; - public int mUpdate = 5; - public int mProgresstime = 0; - public boolean mMachine = false; - - public ItemStack[] mOutputItems = new ItemStack[OUTPUT_SLOTS]; - - public GT_MetaTileEntity_PrimitiveBlastFurnace(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, INPUT_SLOTS + OUTPUT_SLOTS); - } - - public GT_MetaTileEntity_PrimitiveBlastFurnace(String aName) { - super(aName, INPUT_SLOTS + OUTPUT_SLOTS); - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public int getProgresstime() { - return this.mProgresstime; - } - - @Override - public int maxProgresstime() { - return this.mMaxProgresstime; - } - - @Override - public int increaseProgress(int aProgress) { - this.mProgresstime += aProgress; - return this.mMaxProgresstime - this.mProgresstime; - } - - @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) { - return (GregTech_API.getCoverBehaviorNew(aCoverID.toStack()) - .isSimpleCover()) && (super.allowCoverOnSide(side, aCoverID)); - } - - @Override - public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity); - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setInteger("mProgresstime", this.mProgresstime); - aNBT.setInteger("mMaxProgresstime", this.mMaxProgresstime); - if (this.mOutputItems != null) { - for (int i = 0; i < mOutputItems.length; i++) { - if (this.mOutputItems[i] != null) { - NBTTagCompound tNBT = new NBTTagCompound(); - this.mOutputItems[i].writeToNBT(tNBT); - aNBT.setTag("mOutputItem" + i, tNBT); - } - } - } - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - this.mUpdate = 5; - this.mProgresstime = aNBT.getInteger("mProgresstime"); - this.mMaxProgresstime = aNBT.getInteger("mMaxProgresstime"); - this.mOutputItems = new ItemStack[OUTPUT_SLOTS]; - for (int i = 0; i < OUTPUT_SLOTS; i++) { - this.mOutputItems[i] = GT_Utility.loadItem(aNBT, "mOutputItem" + i); - } - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public ExtendedFacing getExtendedFacing() { - return ExtendedFacing.of(getBaseMetaTileEntity().getFrontFacing()); - } - - @Override - public void setExtendedFacing(ExtendedFacing alignment) { - getBaseMetaTileEntity().setFrontFacing(alignment.getDirection()); - } - - @Override - public IAlignmentLimits getAlignmentLimits() { - return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() - && f.isNotFlipped(); - } - - private boolean checkMachine() { - return STRUCTURE_DEFINITION.get(this.getClass()) - .check( - this, - "main", - getBaseMetaTileEntity().getWorld(), - getExtendedFacing(), - getBaseMetaTileEntity().getXCoord(), - getBaseMetaTileEntity().getYCoord(), - getBaseMetaTileEntity().getZCoord(), - 1, - 2, - 0, - !mMachine); - } - - protected abstract Block getCasingBlock(); - - protected abstract int getCasingMetaID(); - - @Override - public void onMachineBlockUpdate() { - mUpdated = true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - final int lavaX = aBaseMetaTileEntity.getOffsetX(aBaseMetaTileEntity.getBackFacing(), 1); - final int lavaZ = aBaseMetaTileEntity.getOffsetZ(aBaseMetaTileEntity.getBackFacing(), 1); - if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) { - - new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0D, 0.3D, 0D) - .setIdentifier(ParticleFX.LARGE_SMOKE) - .setPosition( - lavaX + XSTR_INSTANCE.nextFloat(), - aBaseMetaTileEntity.getOffsetY(aBaseMetaTileEntity.getBackFacing(), 1), - lavaZ + XSTR_INSTANCE.nextFloat()) - .setWorld(getBaseMetaTileEntity().getWorld()) - .run(); - } - if (aBaseMetaTileEntity.isServerSide()) { - if (mUpdated) { - // duct tape fix for too many updates on an overloaded server, causing the structure check to not run - if (mUpdate < 0) mUpdate = 5; - mUpdated = false; - } - if (this.mUpdate-- == 0) { - this.mMachine = checkMachine(); - } - if (this.mMachine) { - if (this.mMaxProgresstime > 0) { - if (++this.mProgresstime >= this.mMaxProgresstime) { - addOutputProducts(); - this.mOutputItems = null; - this.mProgresstime = 0; - this.mMaxProgresstime = 0; - GT_Mod.achievements.issueAchievement( - aBaseMetaTileEntity.getWorld() - .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), - "steel"); - } - } else if (aBaseMetaTileEntity.isAllowedToWork()) { - checkRecipe(); - } - } - if (this.mMaxProgresstime > 0 && (aTimer % 20L == 0L)) { - GT_Pollution.addPollution( - this.getBaseMetaTileEntity(), - GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond); - } - - aBaseMetaTileEntity.setActive((this.mMaxProgresstime > 0) && (this.mMachine)); - final short lavaY = aBaseMetaTileEntity.getYCoord(); - if (aBaseMetaTileEntity.isActive()) { - if (aBaseMetaTileEntity.getAir(lavaX, lavaY, lavaZ)) { - aBaseMetaTileEntity.getWorld() - .setBlock(lavaX, lavaY, lavaZ, Blocks.lava, 1, 2); - this.mUpdate = 1; - } - if (aBaseMetaTileEntity.getAir(lavaX, lavaY + 1, lavaZ)) { - aBaseMetaTileEntity.getWorld() - .setBlock(lavaX, lavaY + 1, lavaZ, Blocks.lava, 1, 2); - this.mUpdate = 1; - } - } else { - Block lowerLava = aBaseMetaTileEntity.getBlock(lavaX, lavaY, lavaZ); - Block upperLava = aBaseMetaTileEntity.getBlock(lavaX, lavaY + 1, lavaZ); - if (lowerLava == Blocks.lava) { - aBaseMetaTileEntity.getWorld() - .setBlock(lavaX, lavaY, lavaZ, Blocks.air, 0, 2); - this.mUpdate = 1; - } - if (upperLava == Blocks.lava) { - aBaseMetaTileEntity.getWorld() - .setBlock(lavaX, lavaY + 1, lavaZ, Blocks.air, 0, 2); - this.mUpdate = 1; - } - } - } - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - if (aBaseMetaTileEntity.isClientSide()) - StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity); - } - - /** - * Draws random flames and smoke particles in front of Primitive Blast Furnace when active - * - * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - if (aBaseMetaTileEntity.isActive()) { - - final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing(); - - final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 0.5D; - final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1); - final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 0.5D; - final double offset = -0.48D; - final double horizontal = XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; - - final double x, y, z; - - y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; - - if (frontFacing == ForgeDirection.WEST) { - x = oX - offset; - z = oZ + horizontal; - } else if (frontFacing == ForgeDirection.EAST) { - x = oX + offset; - z = oZ + horizontal; - } else if (frontFacing == ForgeDirection.NORTH) { - x = oX + horizontal; - z = oZ - offset; - } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) - { - x = oX + horizontal; - z = oZ + offset; - } - - ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D) - .setPosition(x, y, z) - .setWorld(getBaseMetaTileEntity().getWorld()); - particleEventBuilder.setIdentifier(ParticleFX.SMOKE) - .run(); - particleEventBuilder.setIdentifier(ParticleFX.FLAME) - .run(); - } - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.primitiveBlastRecipes; - } - - private void addOutputProducts() { - if (this.mOutputItems == null) { - return; - } - int limit = Math.min(mOutputItems.length, OUTPUT_SLOTS); - for (int i = 0; i < limit; i++) { - int absi = INPUT_SLOTS + i; - if (this.mInventory[absi] == null) { - this.mInventory[absi] = GT_Utility.copyOrNull(this.mOutputItems[i]); - } else if (GT_Utility.areStacksEqual(this.mInventory[absi], this.mOutputItems[i])) { - this.mInventory[absi].stackSize = Math.min( - this.mInventory[absi].getMaxStackSize(), - this.mInventory[absi].stackSize + this.mOutputItems[i].stackSize); - } - } - } - - private boolean spaceForOutput(ItemStack outputStack, int relativeOutputSlot) { - int absoluteSlot = relativeOutputSlot + INPUT_SLOTS; - if (this.mInventory[absoluteSlot] == null || outputStack == null) { - return true; - } - return ((this.mInventory[absoluteSlot].stackSize + outputStack.stackSize - <= this.mInventory[absoluteSlot].getMaxStackSize()) - && (GT_Utility.areStacksEqual(this.mInventory[absoluteSlot], outputStack))); - } - - private boolean checkRecipe() { - if (!this.mMachine) { - return false; - } - ItemStack[] inputs = new ItemStack[INPUT_SLOTS]; - System.arraycopy(mInventory, 0, inputs, 0, INPUT_SLOTS); - GT_Recipe recipe = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, 0, null, inputs); - if (recipe == null) { - this.mOutputItems = null; - return false; - } - for (int i = 0; i < OUTPUT_SLOTS; i++) { - if (!spaceForOutput(recipe.getOutput(i), i)) { - this.mOutputItems = null; - return false; - } - } - - if (!recipe.isRecipeInputEqual(true, null, inputs)) { - this.mOutputItems = null; - return false; - } - for (int i = 0; i < INPUT_SLOTS; i++) { - if (mInventory[i] != null && mInventory[i].stackSize == 0) { - mInventory[i] = null; - } - } - - this.mMaxProgresstime = recipe.mDuration; - this.mOutputItems = recipe.mOutputs; - return true; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return aIndex > INPUT_SLOTS; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return !GT_Utility.areStacksEqual(aStack, this.mInventory[0]); - } - - @Override - public byte getTileEntityBaseType() { - return 0; - } - - public abstract String getName(); - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return STRUCTURE_DEFINITION.get(getClass()) - .survivalBuild( - this, - stackSize, - "main", - getBaseMetaTileEntity().getWorld(), - getExtendedFacing(), - getBaseMetaTileEntity().getXCoord(), - getBaseMetaTileEntity().getYCoord(), - getBaseMetaTileEntity().getZCoord(), - 1, - 2, - 0, - elementBudget, - env, - false); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION.get(getClass()); - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - STRUCTURE_DEFINITION.get(getClass()) - .buildOrHints( - this, - stackSize, - "main", - getBaseMetaTileEntity().getWorld(), - getExtendedFacing(), - getBaseMetaTileEntity().getXCoord(), - getBaseMetaTileEntity().getYCoord(), - getBaseMetaTileEntity().getZCoord(), - 1, - 2, - 0, - hintsOnly); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder - .widget( - new SlotWidget(inventoryHandler, 0) - .setBackground( - getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_INGOT_STEAM.get(getSteamVariant())) - .setPos(33, 15)) - .widget( - new SlotWidget(inventoryHandler, 1) - .setBackground( - getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant())) - .setPos(33, 33)) - .widget( - new SlotWidget(inventoryHandler, 2) - .setBackground( - getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_FURNACE_STEAM.get(getSteamVariant())) - .setPos(33, 51)) - .widget( - new SlotWidget(inventoryHandler, 3).setAccess(true, false) - .setBackground( - getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_INGOT_STEAM.get(getSteamVariant())) - .setPos(85, 24)) - .widget( - new SlotWidget(inventoryHandler, 4).setAccess(true, false) - .setBackground( - getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant())) - .setPos(103, 24)) - .widget( - new SlotWidget(inventoryHandler, 5).setAccess(true, false) - .setBackground( - getGUITextureSet().getItemSlot(), - GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant())) - .setPos(121, 24)) - .widget( - new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ARROW_2_STEAM.get(getSteamVariant()), 20) - .setProgress(() -> (float) mProgresstime / mMaxProgresstime) - .setNEITransferRect( - getRecipeMap().getFrontend() - .getUIProperties().neiTransferRectId) - .setPos(58, 24) - .setSize(20, 18)); - } - - @Override - public GUITextureSet getGUITextureSet() { - return GUITextureSet.STEAM.apply(getSteamVariant()); - } - - @Override - public int getTitleColor() { - return getSteamVariant() == SteamVariant.BRONZE ? COLOR_TITLE.get() : COLOR_TITLE_WHITE.get(); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java deleted file mode 100644 index abb0605df7..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java +++ /dev/null @@ -1,550 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.ExoticEnergy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine.isValidForLowGravity; -import static gregtech.api.util.GT_Utility.filterValidMTEs; - -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ExoticEnergyInputHelper; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_ProcessingArray_Manager; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Item_Machines; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -@Deprecated -public class GT_MetaTileEntity_ProcessingArray extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose(new String[][] { { "hhh", "hhh", "hhh" }, { "h~h", "h-h", "hhh" }, { "hhh", "hhh", "hhh" }, })) - .addElement( - 'h', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(t.getAllowedHatches()) - .casingIndex(48) - .dot(1) - .build()), - onElementPass(t -> t.mCasingAmount++, ofBlock(GregTech_API.sBlockCasings4, 0)))) - .build(); - - private int mCasingAmount = 0; - - private RecipeMap mLastRecipeMap; - private ItemStack lastControllerStack; - private int tTier = 0; - private int mMult = 0; - private boolean downtierUEV = true; - - public GT_MetaTileEntity_ProcessingArray(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ProcessingArray(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ProcessingArray(this.mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Processing Array") - .addInfo("Runs supplied machines as if placed in the world") - .addInfo("Place up to 64 singleblock GT machines into the controller") - .addInfo("Note that you still need to supply power to them all") - .addInfo("Use a screwdriver to enable separate input busses") - .addInfo("Use a wire cutter to disable UEV+ downtiering") - .addInfo("Doesn't work on certain machines, deal with it") - .addInfo("Use it if you hate GT++, or want even more speed later on") - .addInfo( - EnumChatFormatting.GOLD - + "On the way to be slowly removed. Use it strictly if you have no alternative.") - .addSeparator() - .beginStructureBlock(3, 3, 3, true) - .addController("Front center") - .addCasingInfoRange("Robust Tungstensteel Machine Casing", 14, 24, false) - .addEnergyHatch("Any casing", 1) - .addMaintenanceHatch("Any casing", 1) - .addInputBus("Any casing", 1) - .addInputHatch("Any casing", 1) - .addOutputBus("Any casing", 1) - .addOutputHatch("Any casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - return super.addToMachineList(aTileEntity, aBaseCasingIndex) - || addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { BlockIcons.casingTexturePages[0][48], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { BlockIcons.casingTexturePages[0][48], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][48] }; - } - - private RecipeMap fetchRecipeMap() { - if (isCorrectMachinePart(getControllerSlot())) { - // Gets the recipe map for the given machine through its unlocalized name - return GT_ProcessingArray_Manager - .giveRecipeMap(GT_ProcessingArray_Manager.getMachineName(getControllerSlot())); - } - return null; - } - - @Override - public RecipeMap getRecipeMap() { - return mLastRecipeMap; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return aStack != null && aStack.getUnlocalizedName() - .startsWith("gt.blockmachines."); - } - - @Override - protected void sendStartMultiBlockSoundLoop() { - SoundResource sound = GT_ProcessingArray_Manager - .getSoundResource(GT_ProcessingArray_Manager.getMachineName(getControllerSlot())); - if (sound != null) { - sendLoopStart((byte) sound.id); - } - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - SoundResource sound = SoundResource.get(aIndex < 0 ? aIndex + 256 : 0); - if (sound != null) { - GT_Utility.doSoundAtClient(sound, getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); - } - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - if (!GT_Utility.areStacksEqual(lastControllerStack, getControllerSlot())) { - // controller slot has changed - lastControllerStack = getControllerSlot(); - mLastRecipeMap = fetchRecipeMap(); - setTierAndMult(); - } - if (mLastRecipeMap == null) return SimpleCheckRecipeResult.ofFailure("no_machine"); - if (mLockedToSingleRecipe && mSingleRecipeCheck != null) { - if (mSingleRecipeCheck.getRecipeMap() != mLastRecipeMap) { - return SimpleCheckRecipeResult.ofFailure("machine_mismatch"); - } - } - - return super.checkProcessing(); - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @Nonnull - @Override - protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - if (GT_Mod.gregtechproxy.mLowGravProcessing && recipe.mSpecialValue == -100 - && !isValidForLowGravity(recipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) { - return SimpleCheckRecipeResult.ofFailure("high_gravity"); - } - if (recipe.mEUt > availableVoltage) return CheckRecipeResultRegistry.insufficientPower(recipe.mEUt); - return CheckRecipeResultRegistry.SUCCESSFUL; - } - }.setMaxParallelSupplier(this::getMaxParallel); - } - - @Override - protected boolean canUseControllerSlotForRecipe() { - return false; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Values.V[tTier] * (mLastRecipeMap != null ? mLastRecipeMap.getAmperage() : 1)); - logic.setAvailableAmperage(getMaxParallel()); - logic.setAmperageOC(false); - } - - private void setTierAndMult() { - IMetaTileEntity aMachine = GT_Item_Machines.getMetaTileEntity(getControllerSlot()); - if (aMachine instanceof GT_MetaTileEntity_TieredMachineBlock) { - tTier = ((GT_MetaTileEntity_TieredMachineBlock) aMachine).mTier; - } else { - tTier = 0; - } - mMult = 0; - if (downtierUEV && tTier > 9) { - tTier--; // Lowers down the tier by 1 to allow for bigger parallel - mMult = 2; // Multiplies Parallels by 4x, keeping the energy cost - } - } - - private int getMaxParallel() { - if (getControllerSlot() == null) { - return 0; - } - return getControllerSlot().stackSize << mMult; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (mMachine && aTick % 20 == 0) { - for (GT_MetaTileEntity_Hatch_InputBus tInputBus : mInputBusses) { - tInputBus.mRecipeMap = mLastRecipeMap; - } - for (GT_MetaTileEntity_Hatch_Input tInputHatch : mInputHatches) { - tInputHatch.mRecipeMap = mLastRecipeMap; - } - } - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public void construct(ItemStack aStack, boolean aHintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 1, 1, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true); - } - - private boolean checkHatches() { - return mMaintenanceHatches.size() == 1; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("downtierUEV", downtierUEV); - } - - @Override - public void loadNBTData(final NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - if (aNBT.hasKey("mSeparate")) { - // backward compatibility - inputSeparation = aNBT.getBoolean("mSeparate"); - } - if (aNBT.hasKey("mUseMultiparallelMode")) { - // backward compatibility - batchMode = aNBT.getBoolean("mUseMultiparallelMode"); - } - downtierUEV = aNBT.getBoolean("downtierUEV"); - } - - @Override - public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (aPlayer.isSneaking()) { - // Lock to single recipe - super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); - } else { - inputSeparation = !inputSeparation; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); - } - } - - @Override - public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - if (aPlayer.isSneaking()) { - batchMode = !batchMode; - if (batchMode) { - GT_Utility.sendChatToPlayer(aPlayer, "Batch recipes"); - } else { - GT_Utility.sendChatToPlayer(aPlayer, "Don't batch recipes"); - } - } else { - downtierUEV = !downtierUEV; - GT_Utility.sendChatToPlayer(aPlayer, "Treat UEV+ machines as multiple UHV " + downtierUEV); - } - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - private List> getAllowedHatches() { - return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy, ExoticEnergy); - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mExoticEnergyHatches.clear(); - mCasingAmount = 0; - return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= 14 && checkHatches(); - } - - @Override - public String[] getInfoData() { - long storedEnergy = 0; - long maxEnergy = 0; - for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mExoticEnergyHatches)) { - storedEnergy += tHatch.getBaseMetaTileEntity() - .getStoredEU(); - maxEnergy += tHatch.getBaseMetaTileEntity() - .getEUCapacity(); - } - - return new String[] { - StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(storedEnergy) - + EnumChatFormatting.RESET - + " EU / " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(maxEnergy) - + EnumChatFormatting.RESET - + " EU", - StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + GT_Utility.formatNumbers(-lEUt) - + EnumChatFormatting.RESET - + " EU/t", - StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers( - GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList())) - + EnumChatFormatting.RESET - + " EU/t(*" - + GT_Utility - .formatNumbers(GT_ExoticEnergyInputHelper.getMaxInputAmpsMulti(getExoticAndNormalEnergyHatchList())) - + "A) " - + StatCollector.translateToLocal("GT5U.machines.tier") - + ": " - + EnumChatFormatting.YELLOW - + VN[GT_Utility - .getTier(GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList()))] - + EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " - + EnumChatFormatting.RED - + (getIdealStatus() - getRepairStatus()) - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.multiblock.efficiency") - + ": " - + EnumChatFormatting.YELLOW - + mEfficiency / 100.0F - + EnumChatFormatting.RESET - + " %", - StatCollector.translateToLocal("GT5U.PA.machinetier") + ": " - + EnumChatFormatting.GREEN - + tTier - + EnumChatFormatting.RESET - + " " - + StatCollector.translateToLocal("GT5U.PA.discount") - + ": " - + EnumChatFormatting.GREEN - + 1 - + EnumChatFormatting.RESET - + " x", - StatCollector.translateToLocal("GT5U.PA.parallel") + ": " - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(getMaxParallel()) - + EnumChatFormatting.RESET }; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - protected boolean supportsSlotAutomation(int aSlot) { - return aSlot == getControllerSlotIndex(); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - downtierUEV = !downtierUEV; - setTierAndMult(); - }) - .setPlayClickSound(true) - .setBackground(() -> { - if (downtierUEV) { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_ON }; - } else { - return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_OFF }; - } - }) - .setPos(80, 91) - .setSize(16, 16) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.down_tier")) - .setTooltipShowUpDelay(TOOLTIP_DELAY)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> downtierUEV, val -> downtierUEV = val)); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - if (mLastRecipeMap != null && getControllerSlot() != null) { - tag.setString("type", getControllerSlot().getDisplayName()); - } - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - if (tag.hasKey("type")) { - currentTip.add("Machine: " + EnumChatFormatting.YELLOW + tag.getString("type")); - } else { - currentTip.add("Machine: " + EnumChatFormatting.YELLOW + "None"); - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java deleted file mode 100644 index ff84a69b44..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java +++ /dev/null @@ -1,263 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockUnlocalizedName; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.Muffler; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Mods.NewHorizonsCoreMod; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofCoil; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.IStructureElement; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_PyrolyseOven - extends GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - private HeatingCoilLevel coilHeat; - private static final int CASING_INDEX = 1090; - private static final IStructureDefinition STRUCTURE_DEFINITION = createStructureDefinition(); - - private static IStructureDefinition createStructureDefinition() { - IStructureElement tCasingElement = NewHorizonsCoreMod.isModLoaded() - ? ofBlockUnlocalizedName(NewHorizonsCoreMod.ID, "gt.blockcasingsNH", 2) - : ofBlock(GregTech_API.sBlockCasings1, 0); - - return StructureDefinition.builder() - .addShape( - "main", - transpose( - new String[][] { { "ccccc", "ctttc", "ctttc", "ctttc", "ccccc" }, - { "ccccc", "c---c", "c---c", "c---c", "ccccc" }, - { "ccccc", "c---c", "c---c", "c---c", "ccccc" }, - { "bb~bb", "bCCCb", "bCCCb", "bCCCb", "bbbbb" }, })) - .addElement('c', onElementPass(GT_MetaTileEntity_PyrolyseOven::onCasingAdded, tCasingElement)) - .addElement( - 'C', - ofCoil(GT_MetaTileEntity_PyrolyseOven::setCoilLevel, GT_MetaTileEntity_PyrolyseOven::getCoilLevel)) - .addElement( - 'b', - buildHatchAdder(GT_MetaTileEntity_PyrolyseOven.class) - .atLeast(OutputBus, OutputHatch, Energy, Maintenance) - .casingIndex(CASING_INDEX) - .dot(1) - .buildAndChain(onElementPass(GT_MetaTileEntity_PyrolyseOven::onCasingAdded, tCasingElement))) - .addElement( - 't', - buildHatchAdder(GT_MetaTileEntity_PyrolyseOven.class).atLeast(InputBus, InputHatch, Muffler) - .casingIndex(CASING_INDEX) - .dot(1) - .buildAndChain(onElementPass(GT_MetaTileEntity_PyrolyseOven::onCasingAdded, tCasingElement))) - .build(); - } - - private int mCasingAmount; - - public GT_MetaTileEntity_PyrolyseOven(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PyrolyseOven(String aName) { - super(aName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Coke Oven") - .addInfo("Controller block for the Pyrolyse Oven") - .addInfo("Industrial Charcoal producer") - .addInfo("Processing speed scales linearly with Coil tier:") - .addInfo("CuNi: 50%, FeAlCr: 100%, Ni4Cr: 150%, TPV: 200%, etc.") - .addInfo("EU/t is not affected by Coil tier") - .addPollutionAmount(getPollutionPerSecond(null)) - .addSeparator() - .beginStructureBlock(5, 4, 5, true) - .addController("Front center") - .addCasingInfoRange("Pyrolyse Oven Casing", 60, 80, false) - .addOtherStructurePart("Heating Coils", "Center 3x1x3 of the bottom layer") - .addEnergyHatch("Any bottom layer casing", 1) - .addMaintenanceHatch("Any bottom layer casing", 1) - .addMufflerHatch("Center 3x1x3 area in top layer", 2) - .addInputBus("Center 3x1x3 area in top layer", 2) - .addInputHatch("Center 3x1x3 area in top layer", 2) - .addOutputBus("Any bottom layer casing", 1) - .addOutputHatch("Any bottom layer casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) return new ITexture[] { BlockIcons.casingTexturePages[8][66], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { BlockIcons.casingTexturePages[8][66], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.casingTexturePages[8][66] }; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.pyrolyseRecipes; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @NotNull - @Override - public CheckRecipeResult process() { - setSpeedBonus(2f / (1 + coilHeat.getTier())); - return super.process(); - } - }; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - private void onCasingAdded() { - mCasingAmount++; - } - - public HeatingCoilLevel getCoilLevel() { - return coilHeat; - } - - private void setCoilLevel(HeatingCoilLevel aCoilLevel) { - coilHeat = aCoilLevel; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - coilHeat = HeatingCoilLevel.None; - mCasingAmount = 0; - replaceDeprecatedCoils(aBaseMetaTileEntity); - return checkPiece("main", 2, 3, 0) && mCasingAmount >= 60 - && mMaintenanceHatches.size() == 1 - && !mMufflerHatches.isEmpty(); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getPollutionPerSecond(ItemStack aStack) { - return GT_Mod.gregtechproxy.mPollutionPyrolyseOvenPerSecond; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PyrolyseOven(this.mName); - } - - private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) { - final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; - final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; - final int tX = aBaseMetaTileEntity.getXCoord() + xDir * 2; - final int tY = aBaseMetaTileEntity.getYCoord(); - final int tZ = aBaseMetaTileEntity.getZCoord() + zDir * 2; - for (int xPos = tX - 1; xPos <= tX + 1; xPos++) { - for (int zPos = tZ - 1; zPos <= tZ + 1; zPos++) { - if (aBaseMetaTileEntity.getBlock(xPos, tY, zPos) == GregTech_API.sBlockCasings1 - && aBaseMetaTileEntity.getMetaID(xPos, tY, zPos) == 13) { - aBaseMetaTileEntity.getWorld() - .setBlock(xPos, tY, zPos, GregTech_API.sBlockCasings5, 1, 3); - } - } - } - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece("main", stackSize, hintsOnly, 2, 3, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece("main", stackSize, 2, 3, 0, elementBudget, env, false, true); - } - - @Override - public boolean supportsVoidProtection() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java deleted file mode 100644 index 749a94df57..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java +++ /dev/null @@ -1,389 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.AuthorColen; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_OFF; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_ON; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_Utility.formatNumbers; -import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; -import static gregtech.common.misc.WirelessNetworkManager.getUserEU; -import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings; -import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_BRIDGE_CASING; -import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_INJECTION_CASING; -import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_TRANS_CASING; -import static net.minecraft.util.EnumChatFormatting.GOLD; -import static net.minecraft.util.EnumChatFormatting.GRAY; -import static net.minecraft.util.StatCollector.translateToLocal; -import static util.Util.toStandardForm; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.api.drawable.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.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.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import gregtech.api.GregTech_API; -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.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; - -public class GT_MetaTileEntity_TranscendentPlasmaMixer - extends GT_MetaTileEntity_EnhancedMultiBlockBase - implements ISurvivalConstructable { - - private static final String[][] structure = new String[][] { - { " CAC ", " ABA ", " ABA ", " A~A ", " ABA ", " ABA ", " CAC " }, - { "CBBBC", "A A", "A A", "A A", "A A", "A A", "CBBBC" }, - { "ABBBA", "B B", "B B", "B B", "B B", "B B", "ABBBA" }, - { "CBBBC", "A A", "A A", "A A", "A A", "A A", "CBBBC" }, - { " CAC ", " ABA ", " ABA ", " ABA ", " ABA ", " ABA ", " CAC " } }; - - private static final String STRUCTURE_PIECE_MAIN = "MAIN"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - .addElement( - 'B', - buildHatchAdder(GT_MetaTileEntity_TranscendentPlasmaMixer.class) - .atLeast(InputHatch, OutputHatch, InputBus, Maintenance) - .casingIndex(DIM_INJECTION_CASING) - .dot(1) - .buildAndChain(GregTech_API.sBlockCasings1, DIM_INJECTION_CASING)) - .addElement('A', ofBlock(GregTech_API.sBlockCasings1, DIM_TRANS_CASING)) - .addElement('C', ofBlock(GregTech_API.sBlockCasings1, DIM_BRIDGE_CASING)) - .build(); - - private UUID ownerUUID; - - public GT_MetaTileEntity_TranscendentPlasmaMixer(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_TranscendentPlasmaMixer(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Transcendent Mixer") - .addInfo("Assisting in all your DTPF needs.") - .addInfo("This multiblock will run in parallel according to the amount set") - .addInfo("in the parallel menu. All inputs will scale, except time.") - .addInfo("All EU is deducted from wireless EU networks only.") - .addInfo(AuthorColen) - .addSeparator() - .beginStructureBlock(5, 7, 5, false) - .addStructureInfo(GOLD + "1+ " + GRAY + "Input Hatch") - .addStructureInfo(GOLD + "1+ " + GRAY + "Output Hatch") - .addStructureInfo(GOLD + "1+ " + GRAY + "Input Bus") - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_TranscendentPlasmaMixer(mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING], TextureFactory.builder() - .addIcon(OVERLAY_DTPF_ON) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FUSION1_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING], TextureFactory.builder() - .addIcon(OVERLAY_DTPF_OFF) - .extFacing() - .build() }; - } - - return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING] }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - int multiplier = 1; - BigInteger finalConsumption = BigInteger.ZERO; - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.transcendentPlasmaMixerRecipes; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - BigInteger recipeEU; - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { - BigInteger availableEU = getUserEU(ownerUUID); - recipeEU = BigInteger.valueOf(10L * recipe.mEUt * recipe.mDuration); - if (availableEU.compareTo(recipeEU) < 0) { - finalConsumption = BigInteger.ZERO; - return CheckRecipeResultRegistry.insufficientStartupPower(recipeEU); - } - maxParallel = availableEU.divide(recipeEU) - .min(BigInteger.valueOf(maxParallel)) - .intValue(); - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - @NotNull - @Override - protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { - finalConsumption = recipeEU.multiply(BigInteger.valueOf(-calculatedParallels)); - // This will void the inputs if wireless energy has dropped - // below the required amount between validateRecipe and here. - if (!addEUToGlobalEnergyMap(ownerUUID, finalConsumption)) { - return CheckRecipeResultRegistry.insufficientStartupPower(finalConsumption); - } - // Energy consumed all at once from wireless net. - setCalculatedEut(0); - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - @Nonnull - @Override - protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return GT_OverclockCalculator.ofNoOverclock(recipe); - } - }.setMaxParallelSupplier(() -> multiplier); - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - // The voltage is only used for recipe finding - logic.setAvailableVoltage(Long.MAX_VALUE); - logic.setAvailableAmperage(1); - logic.setAmperageOC(false); - } - - private static final int HORIZONTAL_OFFSET = 2; - private static final int VERTICAL_OFFSET = 3; - private static final int DEPTH_OFFSET = 0; - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, HORIZONTAL_OFFSET, VERTICAL_OFFSET, DEPTH_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - return survivialBuildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - HORIZONTAL_OFFSET, - VERTICAL_OFFSET, - DEPTH_OFFSET, - elementBudget, - env, - false, - true); - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - - // Check the main structure - if (!checkPiece(STRUCTURE_PIECE_MAIN, HORIZONTAL_OFFSET, VERTICAL_OFFSET, DEPTH_OFFSET)) { - return false; - } - - // Maintenance hatch not required but left for compatibility. - // Don't allow more than 1, no free casing spam! - return (mMaintenanceHatches.size() <= 1); - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 0; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - - super.onPreTick(aBaseMetaTileEntity, aTick); - - if (aBaseMetaTileEntity.isServerSide() && (aTick == 1)) { - // Adds player to the wireless network if they do not already exist on it. - ownerUUID = processInitialSettings(aBaseMetaTileEntity); - } - } - - private static final int PARALLEL_WINDOW_ID = 10; - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - buildContext.addSyncedWindow(PARALLEL_WINDOW_ID, this::createParallelWindow); - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (!widget.isClient()) { - widget.getContext() - .openSyncedWindow(PARALLEL_WINDOW_ID); - } - }) - .setPlayClickSound(true) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(GT_UITextures.BUTTON_STANDARD); - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON); - return ret.toArray(new IDrawable[0]); - }) - .addTooltip(translateToLocal("GT5U.tpm.parallelwindow")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(174, 112) - .setSize(16, 16)); - super.addUIWidgets(builder, buildContext); - } - - protected ModularWindow createParallelWindow(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("GTPP.CC.parallel") - .setPos(3, 4) - .setSize(150, 20)) - .widget( - new NumericWidget().setSetter(val -> multiplier = (int) val) - .setGetter(() -> multiplier) - .setBounds(1, Integer.MAX_VALUE) - .setDefaultValue(1) - .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.IntegerSyncer(() -> multiplier, (val) -> multiplier = val), - builder)); - return builder.build(); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setInteger("eMultiplier", multiplier); - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(final NBTTagCompound aNBT) { - multiplier = aNBT.getInteger("eMultiplier"); - super.loadNBTData(aNBT); - } - - @Override - public String[] getInfoData() { - return new String[] { - StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " - + EnumChatFormatting.GREEN - + formatNumbers(mProgresstime / 20) - + EnumChatFormatting.RESET - + " s / " - + EnumChatFormatting.YELLOW - + formatNumbers(mMaxProgresstime / 20) - + EnumChatFormatting.RESET - + " s", - StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " - + EnumChatFormatting.RED - + (mMaxProgresstime == 0 ? "0" - : toStandardForm(finalConsumption.divide(BigInteger.valueOf(-mMaxProgresstime)))) - + EnumChatFormatting.RESET - + " EU/t" }; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean getDefaultHasMaintenanceChecks() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java deleted file mode 100644 index 499da54bc3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java +++ /dev/null @@ -1,163 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; - -import java.util.List; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.structure.IStructureElement; -import com.gtnewhorizon.structurelib.structure.StructureUtility; - -import gregtech.api.GregTech_API; -import gregtech.api.interfaces.IHatchElement; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_CubicMultiBlockBase; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; - -public class GT_MetaTileEntity_VacuumFreezer - extends GT_MetaTileEntity_CubicMultiBlockBase { - - public GT_MetaTileEntity_VacuumFreezer(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_VacuumFreezer(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_VacuumFreezer(this.mName); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Vacuum Freezer") - .addInfo("Controller Block for the Vacuum Freezer") - .addInfo("Cools hot ingots and cells") - .addSeparator() - .beginStructureBlock(3, 3, 3, true) - .addController("Front center") - .addCasingInfoRange("Frost Proof Machine Casing", 16, 24, false) - .addEnergyHatch("Any casing", 1) - .addMaintenanceHatch("Any casing", 1) - .addInputHatch("Any casing", 1) - .addOutputHatch("Any casing", 1) - .addInputBus("Any casing", 1) - .addOutputBus("Any casing", 1) - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { casingTexturePages[0][17], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { casingTexturePages[0][17], TextureFactory.builder() - .addIcon(OVERLAY_FRONT_VACUUM_FREEZER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { casingTexturePages[0][17] }; - } - return rTexture; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.vacuumFreezerRecipes; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic(); - } - - @Override - protected IStructureElement> getCasingElement() { - return StructureUtility.ofBlock(GregTech_API.sBlockCasings2, 1); - } - - @Override - protected List>> getAllowedHatches() { - return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy); - } - - @Override - protected int getHatchTextureIndex() { - return 17; - } - - @Override - protected int getRequiredCasingCount() { - return 16; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_WormholeGenerator.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_WormholeGenerator.java deleted file mode 100644 index eeb5770800..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_WormholeGenerator.java +++ /dev/null @@ -1,1119 +0,0 @@ -package gregtech.common.tileentities.machines.multi; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel; -import static goodgenerator.util.DescTextLocalization.BLUE_PRINT_INFO; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_Values.V; -import static gregtech.api.enums.GT_Values.VN; -import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.init.Blocks; -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.github.bartimaeusnek.bartworks.API.BorosilicateGlass; -import com.github.technus.tectech.thing.casing.GT_Block_CasingsTT; -import com.github.technus.tectech.thing.casing.TT_Container_Casings; -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.google.common.collect.MapMaker; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import appeng.api.AEApi; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.TierEU; -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.interfaces.tileentity.IHasWorldObjectAndCoords; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.ResultMissingItem; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.IGT_HatchAdder; -import gregtech.common.tileentities.render.TileWormhole; -import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; - -public class GT_MetaTileEntity_WormholeGenerator extends - GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { - - /** - * Number of seconds to average the wormhole energy over. - */ - public static int WH_ENERGY_AVG_WINDOW = 90; - - /** - * The amount of EU received per EU sent. - */ - public static double TRANSFER_EFFICIENCY = (1.0 - 0.00_0004 * 64); - - /** - * The amount of EU to lose every second the wormhole decays. - */ - public static double DECAY_RATE = 0.25; - - /** - * The amount of EU that the wormhole collapses at. - */ - public static double COLLAPSE_THRESHOLD = 32; - - /** - * The wormhole render radius percent of the max size when specified wormhole power is reached (purely aesthetical) - */ - public static double RENDER_PERCENT_TARGET = .1; - - /** - * Wormhole energy to specify reach the specified size percentage (purely aesthetical) - */ - public static double RENDER_TARGET_ENERGY = TierEU.IV * 256; - - /** - * Maximum wormhole radius (purely aesthetical) - */ - public static double RENDER_MAX_RADIUS = 2.999 / Math.sqrt(3); - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final byte GLASS_TIER_UNSET = -2; - - private static final int TT_CASING_INDEX = GT_Block_CasingsTT.textureOffset; - - private static final int TOP_HATCH = 0, BOTTOM_HATCH = 1, LEFT_HATCH = 2, RIGHT_HATCH = 3, BACK_HATCH = 4, - FRONT_HATCH = 5, MAX_HATCHES = 6; - - private static final int[] OPPOSITES = { BOTTOM_HATCH, TOP_HATCH, RIGHT_HATCH, LEFT_HATCH, FRONT_HATCH, - BACK_HATCH, }; - - private static final String[] HATCH_NAMES = { "Top", "Bottom", "Left", "Right", "Back", "Front" }; - private static final boolean[] HATCH_MASK = { true, true, true, true, false, false }; - - private byte mGlassTier = -2; - private boolean mStructureBadGlassTier = false; - - private final GT_MetaTileEntity_Hatch_EnergyMulti[] mSendHatches = new GT_MetaTileEntity_Hatch_EnergyMulti[MAX_HATCHES]; - private final GT_MetaTileEntity_Hatch_DynamoMulti[] mReceiveHatches = new GT_MetaTileEntity_Hatch_DynamoMulti[MAX_HATCHES]; - - private final ItemStack singularity = AEApi.instance() - .definitions() - .materials() - .singularity() - .maybeStack(1) - .get(); - private final ItemStack qeSingularity = AEApi.instance() - .definitions() - .materials() - .qESingularity() - .maybeStack(1) - .get(); - - private WormholeLink mLink; - private final WeakReference mSelfReference = new WeakReference<>(this); - - private double mWormholeEnergy_UI = 0; - - private boolean mIsUnloading = false; - - public GT_MetaTileEntity_WormholeGenerator(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_WormholeGenerator(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_WormholeGenerator(mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean active, boolean redstoneLevel) { - if (side == facing) { - if (active) { - return new ITexture[] { getCasingTextureForId(TT_CASING_INDEX), TextureFactory.builder() - .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active) - .extFacing() - .build() }; - } else { - return new ITexture[] { getCasingTextureForId(TT_CASING_INDEX), TextureFactory.builder() - .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced) - .extFacing() - .build() }; - } - } - return new ITexture[] { getCasingTextureForId(TT_CASING_INDEX) }; - } - - // #region Structure - - // spotless:off - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][]{ - {" "," F "," EEE "," FEtEF "," EEE "," F "," "}, - {" F "," AADAA "," A B A ","FDBBBDF"," A B A "," AADAA "," F "}, - {" EEE "," A B A ","E E","EB BE","E E"," A B A "," EEE "}, - {" FE~EF ","FA B AF","E E","lB Br","E E","FA B AF"," FEEEF "}, - {" EEE "," A B A ","E E","EB BE","E E"," A B A "," EEE "}, - {" F "," AADAA "," A B A ","FDBBBDF"," A B A "," AADAA "," F "}, - {" "," F "," EEE "," FEbEF "," EEE "," F "," "} - })) - .addElement('E', - buildHatchAdder(GT_MetaTileEntity_WormholeGenerator.class) - .atLeast(Maintenance, InputBus) - .casingIndex(TT_CASING_INDEX) // High Power Casing - .dot(1) - .buildAndChain(lazy(() -> ofBlock(TT_Container_Casings.sBlockCasingsTT, 0))) // High Power Casing - ) - .addElement( - 'A', - withChannel( - "glass", - BorosilicateGlass.ofBoroGlass(GLASS_TIER_UNSET, (te, t) -> te.mGlassTier = t, te -> te.mGlassTier)) - ) - .addElement('D', ofBlock(GregTech_API.sBlockCasings8, 5)) // Europium Reinforced Radiation Proof Machine Casing - .addElement('B', ofBlock(GregTech_API.sBlockCasings4, 7)) // Fusion Coil Block - .addElement('F', lazy(() -> ofBlock(TT_Container_Casings.sBlockCasingsTT, 4))) // Molecular Casing - .addElement('t', - buildHatchAdder(GT_MetaTileEntity_WormholeGenerator.class) - .anyOf(new TransferHatch(TOP_HATCH)) - .casingIndex(TT_CASING_INDEX) // High Power Casing - .dot(2) - .buildAndChain(lazy(() -> ofBlock(TT_Container_Casings.sBlockCasingsTT, 0))) // High Power Casing - ) - .addElement('b', - buildHatchAdder(GT_MetaTileEntity_WormholeGenerator.class) - .anyOf(new TransferHatch(BOTTOM_HATCH)) - .casingIndex(TT_CASING_INDEX) // High Power Casing - .dot(2) - .buildAndChain(lazy(() -> ofBlock(TT_Container_Casings.sBlockCasingsTT, 0))) // High Power Casing - ) - .addElement('l', - buildHatchAdder(GT_MetaTileEntity_WormholeGenerator.class) - .anyOf(new TransferHatch(LEFT_HATCH)) - .casingIndex(TT_CASING_INDEX) // High Power Casing - .dot(2) - .buildAndChain(lazy(() -> ofBlock(TT_Container_Casings.sBlockCasingsTT, 0))) // High Power Casing - ) - .addElement('r', - buildHatchAdder(GT_MetaTileEntity_WormholeGenerator.class) - .anyOf(new TransferHatch(RIGHT_HATCH)) - .casingIndex(TT_CASING_INDEX) // High Power Casing - .dot(2) - .buildAndChain(lazy(() -> ofBlock(TT_Container_Casings.sBlockCasingsTT, 0))) // High Power Casing - ) - .build(); - // spotless:on - - private static class TransferHatch implements IHatchElement { - - public final int mIndex; - - public TransferHatch(int index) { - this.mIndex = index; - } - - @Override - public List> mteClasses() { - return Arrays.asList(GT_MetaTileEntity_Hatch_EnergyMulti.class, GT_MetaTileEntity_Hatch_DynamoMulti.class); - } - - @Override - public IGT_HatchAdder adder() { - return (tile, aTileEntity, aBaseCasingIndex) -> { - if (aTileEntity == null) return false; - - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - - if (aMetaTileEntity == null) return false; - - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti input) { - input.updateTexture(aBaseCasingIndex); - input.updateCraftingIcon(tile.getMachineCraftingIcon()); - tile.mSendHatches[mIndex] = input; - return true; - } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti output) { - output.updateTexture(aBaseCasingIndex); - output.updateCraftingIcon(tile.getMachineCraftingIcon()); - tile.mReceiveHatches[mIndex] = output; - return true; - } - - return false; - }; - } - - @Override - public String name() { - return "TransferHatch"; - } - - @Override - public long count(GT_MetaTileEntity_WormholeGenerator t) { - return t.mExoticEnergyHatches.size(); - } - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - protected SoundResource getProcessStartSound() { - return SoundResource.GT_MACHINES_FUSION_LOOP; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 3, 0)) return false; - - mStructureBadGlassTier = false; - - for (var energyHatch : mExoticEnergyHatches) { - if (energyHatch.getBaseMetaTileEntity() == null) { - continue; - } - - if (energyHatch.getTierForStructure() > mGlassTier) { - mStructureBadGlassTier = true; - } - } - - return !mStructureBadGlassTier; - } - - @Override - public void clearHatches() { - super.clearHatches(); - - Arrays.fill(mSendHatches, null); - Arrays.fill(mReceiveHatches, null); - } - - @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 int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - // #endregion - @Override - public void onBlockDestroyed() { - super.onBlockDestroyed(); - destroyRenderBlock(); - } - - @Override - public void onDisableWorking() { - super.onDisableWorking(); - // destroyRenderBlock(); - } - - @Override - public void onStructureChange() { - super.onStructureChange(); - if (!checkStructure(false, this.getBaseMetaTileEntity())) { - destroyRenderBlock(); - } - } - - private void destroyRenderBlock() { - IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); - if (gregTechTileEntity.getWorld() == null) { - return; - } - - int x = gregTechTileEntity.getXCoord(); - int y = gregTechTileEntity.getYCoord(); - int z = gregTechTileEntity.getZCoord(); - - int xOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX; - int yOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetY; - int zOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - - int xTarget = x + xOffset; - int yTarget = y + yOffset; - int zTarget = z + zOffset; - - Optional.of(gregTechTileEntity) - .map(IHasWorldObjectAndCoords::getWorld) - .ifPresent(w -> w.setBlock(xTarget, yTarget, zTarget, Blocks.air)); - } - - @Nullable - private TileWormhole createRenderBlock() { - - IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); - World world = gregTechTileEntity.getWorld(); - - if (world == null) { - return null; - } - - int x = gregTechTileEntity.getXCoord(); - int y = gregTechTileEntity.getYCoord(); - int z = gregTechTileEntity.getZCoord(); - - int xOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX; - int yOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetY; - int zOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - - int xTarget = x + xOffset; - int yTarget = y + yOffset; - int zTarget = z + zOffset; - - world.setBlock(xTarget, yTarget, zTarget, Blocks.air); - world.setBlock(xTarget, yTarget, zTarget, GregTech_API.sWormholeRender); - - TileWormhole wormhole = (TileWormhole) world.getTileEntity(xTarget, yTarget, zTarget); - - if (wormhole == null) { - return null; - } - return wormhole; - } - - @Nullable - private TileWormhole getRenderBlock() { - IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); - - int x = gregTechTileEntity.getXCoord(); - int y = gregTechTileEntity.getYCoord(); - int z = gregTechTileEntity.getZCoord(); - - double xOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX; - double zOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - double yOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetY; - - int wX = (int) (x + xOffset); - int wY = (int) (y + yOffset); - int wZ = (int) (z + zOffset); - - TileEntity tile = Optional.ofNullable(gregTechTileEntity.getWorld()) - .map(w -> w.getTileEntity(wX, wY, wZ)) - .orElse(null); - if (tile instanceof TileWormhole wormhole) return wormhole; - return null; - - } - - public void updateRenderDim() { - TileWormhole temp = getRenderBlock(); - - World target = Optional.ofNullable(mLink) - .map(link -> link.getDest(mSelfReference)) - .map(MetaTileEntity::getBaseMetaTileEntity) - .map(IHasWorldObjectAndCoords::getWorld) - .orElse(null); - - TileWormhole hole = getRenderBlock(); - if (hole == null) hole = createRenderBlock(); - - if (hole != null) { - hole.setDimFromWorld(target); - } - } - - public void updateRenderRadius(double radius) { - TileWormhole hole = getRenderBlock(); - if (hole == null) hole = createRenderBlock(); - - if (hole != null) { - hole.setRadius(radius); - } - } - - private static double wormholeRadiusCalc(double energy) { - if (energy < COLLAPSE_THRESHOLD) return 0; - - double offset = RENDER_TARGET_ENERGY + (COLLAPSE_THRESHOLD - RENDER_TARGET_ENERGY) / (RENDER_PERCENT_TARGET); - return RENDER_MAX_RADIUS * (COLLAPSE_THRESHOLD - energy) / (offset - energy); - } - - // #region Logic - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public void onUnload() { - super.onUnload(); - mIsUnloading = true; - if (mLink != null) { - mLink.disconnect(mSelfReference); - } - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - checkFrequency(); - - mMaxProgresstime = 20; - mEfficiency = Math.max(0, getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000)); - - if (doRandomMaintenanceDamage()) { - if (onRunningTick(mInventory[1])) { - markDirty(); - - if (++mProgresstime >= mMaxProgresstime) { - mProgresstime = 0; - - if (mLink != null) { - mLink.update(mSelfReference); - } - checkRecipe(); - } - } - } - } - - @Override - @Nonnull - public CheckRecipeResult checkProcessing() { - if (mLink == null || !mLink.isConnected(mSelfReference) - || getBaseMetaTileEntity() == null - || !getBaseMetaTileEntity().isAllowedToWork()) { - return SimpleCheckRecipeResult.ofFailure("none"); - } - - if (mLink.isActive()) { - for (int i = 0; i < MAX_HATCHES; i++) { - if (!HATCH_MASK[i]) continue; - long optimal = mLink.mWormholeEnergy > Long.MAX_VALUE ? Long.MAX_VALUE : ((long) mLink.mWormholeEnergy); - if (getTransferable(i) > 0) { - if (mLink.mWormholeEnergy <= 0) { - var singularityStack = singularity.copy(); - - if (!depleteInput(singularityStack)) { - return new ResultMissingItem(singularityStack); - } - mLink.mWormholeEnergy = 1; - optimal = 1; - } - transferPower(optimal, i); - } - } - } - - if (mLink.mWormholeEnergy > 0) { - return SimpleCheckRecipeResult.ofSuccess("none"); - } - return SimpleCheckRecipeResult.ofFailure("none"); - } - - private void checkFrequency() { - if (mIsUnloading) { - return; - } - - ItemStack link = null; - - for (var slot : mInventory) { - if (slot != null && qeSingularity.getItem() == slot.getItem() - && qeSingularity.getItemDamage() == slot.getItemDamage()) { - link = slot; - break; - } - } - - Long freq = link != null && link.getTagCompound() != null - && link.getTagCompound() - .hasKey("freq", 4 /* Long */) ? link.getTagCompound() - .getLong("freq") : null; - - if (!Objects.equals(freq, mLink == null ? null : mLink.mFrequency)) { - if (mLink != null) { - mLink.disconnect(mSelfReference); - mLink = null; - } - - if (freq != null) { - mLink = WormholeLink.get(freq); - mLink.connect(mSelfReference); - } - } - } - - private long getTransferable(int index) { - var dest = mLink.getDest(mSelfReference); - - if (dest == null || mMaxProgresstime == 0 || dest.mMaxProgresstime == 0) { - return 0; - } - - var inputHatch = mSendHatches[index]; - var outputHatch = dest.mReceiveHatches[OPPOSITES[index]]; - - if (inputHatch == null || outputHatch == null) { - return 0; - } - - long available = inputHatch.getEUVar(); - long empty = outputHatch.maxEUStore() - outputHatch.getEUVar(); - - return Math.min(available, empty); - } - - private void transferPower(long optimal, int index) { - var dest = mLink.getDest(mSelfReference); - if (dest == null) { - return; - } - - var inputHatch = mSendHatches[index]; - var outputHatch = dest.mReceiveHatches[OPPOSITES[index]]; - - if (inputHatch == null || outputHatch == null) { - return; - } - - long available = inputHatch.getEUVar(); - long empty = outputHatch.maxEUStore() - outputHatch.getEUVar(); - long maxSend = inputHatch.maxAmperesIn() * V[inputHatch.mTier] * 20; - long maxReceive = outputHatch.maxAmperesOut() * V[outputHatch.mTier] * 20; - - // spotless:off - long toSend = (long)(Math.min(Math.min(Math.min(available, empty), maxSend), maxReceive) * (1.0 - (getIdealStatus() - getRepairStatus()) * 0.1)); - - double overclocks = Math.max(Math.log((double)toSend / (double)optimal) / Math.log(4.0), 0.0); - - long toReceive = (long) ( - toSend * - (1.0 / Math.pow(4.0, overclocks)) * - Math.pow(2.0, overclocks) * - (1.0 - (dest.getIdealStatus() - dest.getRepairStatus()) * 0.1) * - TRANSFER_EFFICIENCY - ); - // spotless:on - - inputHatch.setEUVar(inputHatch.getEUVar() - toSend); - outputHatch.setEUVar(outputHatch.getEUVar() + toReceive); - - double size = wormholeRadiusCalc((double) optimal / 20); - this.updateRenderRadius(size); - dest.updateRenderRadius(size); - - mLink.onEnergyTransferred(toSend); - mLink.mSendAmounts[index] += toSend; - mLink.mReceiveAmounts[OPPOSITES[index]] += toReceive; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - - try { - if (mLink != null) { - mLink.tryPromote(); - - NBTTagCompound link = new NBTTagCompound(); - - link.setLong("mFrequency", mLink.mFrequency); - link.setDouble("mWormholeEnergy", mLink.mWormholeEnergy); - - if (mLink.isMaster(mSelfReference)) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); - - dos.writeInt(mLink.mReceiveAmounts.length); - for (var x : mLink.mReceiveAmounts) { - dos.writeLong(x); - } - - dos.writeInt(mLink.mSendAmounts.length); - for (var x : mLink.mSendAmounts) { - dos.writeLong(x); - } - - link.setByteArray("data", baos.toByteArray()); - } - - aNBT.setTag("mLink", link); - } - } catch (Throwable t) { - GT_Mod.GT_FML_LOGGER.error("Could not save GT_MetaTileEntity_WormholeGenerator", t); - } - - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - - checkFrequency(); - - if (aNBT.hasKey("mLink") && mLink != null) { - NBTTagCompound link = aNBT.getCompoundTag("mLink"); - - long freq = link.getLong("mFrequency"); - - try { - if (freq == mLink.mFrequency && mLink.isMaster(mSelfReference)) { - mLink.mWormholeEnergy = link.getDouble("mWormholeEnergy"); - - ByteArrayInputStream bais = new ByteArrayInputStream(link.getByteArray("data")); - DataInputStream dis = new DataInputStream(bais); - - long[] recv_amounts = new long[dis.readInt()]; - for (int i = 0; i < recv_amounts.length; i++) { - recv_amounts[i] = dis.readLong(); - } - - System.arraycopy( - recv_amounts, - 0, - mLink.mReceiveAmounts, - 0, - Math.min(recv_amounts.length, mLink.mReceiveAmounts.length)); - - long[] send_amounts = new long[dis.readInt()]; - for (int i = 0; i < send_amounts.length; i++) { - send_amounts[i] = dis.readLong(); - } - - System.arraycopy( - send_amounts, - 0, - mLink.mSendAmounts, - 0, - Math.min(send_amounts.length, mLink.mSendAmounts.length)); - } - } catch (Throwable t) { - GT_Mod.GT_FML_LOGGER.error("Could not load GT_MetaTileEntity_WormholeGenerator", t); - } - } - } - - private static class WormholeLink { - - private final static Map WORMHOLE_GENERATORS = new MapMaker().weakValues() - .makeMap(); - - public final long mFrequency; - - public WeakReference mMaster, mSlave; - - public final long[] mSendAmounts = new long[MAX_HATCHES]; - public final long[] mReceiveAmounts = new long[MAX_HATCHES]; - - public double mWormholeEnergy; - private double mPendingEnergy; - - private WormholeLink(long frequency) { - mFrequency = frequency; - } - - public static WormholeLink get(long frequency) { - return WORMHOLE_GENERATORS.computeIfAbsent(frequency, WormholeLink::new); - } - - public void update(WeakReference updater) { - tryPromote(); - - if (isMaster(updater)) { - if (isActive() && mPendingEnergy > 0) { - var delta = mPendingEnergy / WH_ENERGY_AVG_WINDOW; - - if (mPendingEnergy < mWormholeEnergy) { - // if the wormhole is shrinking and the next tick would take it below the pending energy, just - // use the pending energy - if (mWormholeEnergy - delta < mPendingEnergy) { - mWormholeEnergy = mPendingEnergy; - } else { - mWormholeEnergy -= delta; - } - } else if (mPendingEnergy > mWormholeEnergy) { - // if the wormhole is growing and the next tick would take it above the pending energy, just use - // the pending energy - if (mWormholeEnergy + delta > mPendingEnergy) { - mWormholeEnergy = mPendingEnergy; - } else { - mWormholeEnergy += delta; - } - } - - mPendingEnergy = 0; - } else { - mWormholeEnergy *= (1.0 - DECAY_RATE); - - if (mWormholeEnergy < COLLAPSE_THRESHOLD) { - mWormholeEnergy = 0; - - } - } - Arrays.fill(mSendAmounts, 0); - Arrays.fill(mReceiveAmounts, 0); - } - } - - public void onEnergyTransferred(long amount) { - mPendingEnergy += amount; - } - - public boolean isMaster(WeakReference tile) { - return mMaster == tile; - } - - public boolean isConnected(WeakReference tile) { - return mMaster == tile || mSlave == tile; - } - - public boolean isFormed() { - return mMaster != null && mSlave != null; - } - - public boolean connect(WeakReference tile) { - tryPromote(); - - if (mMaster == null) { - mMaster = tile; - Optional.ofNullable(mMaster) - .map(Reference::get) - .ifPresent(GT_MetaTileEntity_WormholeGenerator::updateRenderDim); - - Optional.ofNullable(mSlave) - .map(Reference::get) - .ifPresent(GT_MetaTileEntity_WormholeGenerator::updateRenderDim); - return true; - } - if (mSlave == null) { - mSlave = tile; - - Optional.of(mMaster) - .map(Reference::get) - .ifPresent(GT_MetaTileEntity_WormholeGenerator::updateRenderDim); - - Optional.ofNullable(mSlave) - .map(Reference::get) - .ifPresent(GT_MetaTileEntity_WormholeGenerator::updateRenderDim); - - return true; - } - - return false; - } - - public void disconnect(WeakReference tile) { - Objects.requireNonNull(tile.get()) - .destroyRenderBlock(); - - if (tile == mMaster) mMaster = null; - if (tile == mSlave) mSlave = null; - - tryPromote(); - - if (mMaster == null && mSlave == null) { - WORMHOLE_GENERATORS.remove(mFrequency, this); - } - } - - public void tryPromote() { - mMaster = tryClean(mMaster); - mSlave = tryClean(mSlave); - - if (mMaster == null && mSlave != null) { - mMaster = mSlave; - mSlave = null; - } - } - - private static WeakReference tryClean( - WeakReference tileReference) { - if (tileReference != null) { - var tile = tileReference.get(); - - if (tile == null) { - return null; - } else { - var base = tile.getBaseMetaTileEntity(); - - if (base == null || base.isDead()) { - return null; - } - } - } - - return tileReference; - } - - public GT_MetaTileEntity_WormholeGenerator getDest(WeakReference tile) { - if (tile == mMaster) { - return mSlave != null ? mSlave.get() : null; - } - - if (tile == mSlave) { - return mMaster != null ? mMaster.get() : null; - } - - return null; - } - - public boolean isActive() { - boolean masterCanWork = Optional.ofNullable(mMaster) - .map(WeakReference::get) - .map(GT_MetaTileEntity_WormholeGenerator::getBaseMetaTileEntity) - .map(IGregTechTileEntity::isAllowedToWork) - .orElse(false); - - boolean slaveCanWork = Optional.ofNullable(mSlave) - .map(WeakReference::get) - .map(GT_MetaTileEntity_WormholeGenerator::getBaseMetaTileEntity) - .map(IGregTechTileEntity::isAllowedToWork) - .orElse(false); - - return masterCanWork && slaveCanWork; - } - } - - // #endregion - - // #region UI - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - - // spotless:off - tt.addMachineType("Wormhole Generator") - .addInfo("Controller for the Miniature Wormhole Generator.") - .addInfo("Transfers EU between two wormhole generators.") - .addInfo("Wormholes are linked by placing an AE2 Entangled Singularity in each controller slot.") - .addInfo("The transfer rate is limited by the wormhole size, and the wormhole size is governed by the transfer rate.") - .addInfo("If the transfer rate is completely stable, the transfer efficiency is " + String.format("%.3f", TRANSFER_EFFICIENCY * 100.0) + "%.") - .addInfo("EU will only be transferred if there is space in the laser source hatch.") - .addInfo("Each laser target must have a laser source on the §oother§7 controller, on the §oopposite§7 side.") - .addInfo("Consumes an AE2 Singularity from an input bus each time the wormhole is kick-started.") - .addInfo("The structure is too complex!") - .addInfo(BLUE_PRINT_INFO) - .beginStructureBlock(7, 9, 7, false) - .addSeparator() - .addCasingInfoExactly("Molecular Casing", 2 * 12, false) - .addCasingInfoExactly("Europium Reinforced Radiation Proof Machine Casing", 4, false) - .addCasingInfoExactly("Fusion Coil Block", 3 * 4 + 5 * 2, false) - .addCasingInfoRange("High Power Casing", 8 * 6 + 1, 8 * 6 + 1 + 4, false) - .addCasingInfoExactly("Borosilicate Glass (any)", 9 * 4, true) - .addMaintenanceHatch("§61§r (dot 1)") - .addInputBus("§61§r (dot 1)") - .addDynamoHatch("§60§r - §64§r (laser only, dot 2)") - .addEnergyHatch("§60§r - §64§r (laser only, dot 2)") - .addStructureInfo("§rThe glass tier limits the hatch tier.") - .addSubChannelUsage("glass", "Borosilicate Glass Tier") - .toolTipFinisher("Gregtech"); - // spotless:on - - return tt; - } - - @Override - public String[] getInfoData() { - List data = new ArrayList<>(); - - data.addAll(Arrays.asList(super.getInfoData())); - - data.add("-----------------------"); - data.add("Wormhole Generator Info"); - - if (mStructureBadGlassTier) { - data.add(String.format("§cStructure errors:§r")); - - if (mStructureBadGlassTier) { - data.add(String.format("§cGlass tier must be greater than or equal to the energy hatch tiers.§r")); - } - } - - if (mLink == null) { - data.add("An entangled singularity must be present in the controller slot"); - } else { - if (!mLink.isFormed()) { - data.add("Wormhole status: §cNo destination§f"); - } else { - if (mLink.mWormholeEnergy > 0) { - if (mLink.isActive()) { - data.add("Wormhole status: §bActive§f"); - } else { - data.add("Wormhole status: §6Decaying§f"); - } - } else { - boolean anyTransferable = false; - - for (int i = 0; i < MAX_HATCHES; i++) { - if (!HATCH_MASK[i]) continue; - - if (getTransferable(i) > 0) { - anyTransferable = true; - break; - } - } - - if (anyTransferable) { - data.add("Wormhole status: §7Inactive§f"); - } else { - data.add("Wormhole status: §7No energy in input hatches§f"); - } - } - - double radius = Math.sqrt(mLink.mWormholeEnergy / 20.0 / 32.0); - data.add(String.format("Wormhole diameter: §b%,d§r ångström", (long) (radius * 2))); - - data.add(String.format("Optimal transfer speed: §b%,.0f§r EU/t", mLink.mWormholeEnergy / 20)); - } - } - - for (int i = 0; i < MAX_HATCHES; i++) { - if (!HATCH_MASK[i]) continue; - - var inputHatch = mSendHatches[i]; - var outputHatch = mReceiveHatches[i]; - - // spotless:off - if(inputHatch != null) { - data.add(String.format( - "%s hatch (%,dA/t %s) transferred §b%,d§f EU (equivalent to %,dA/t) with an efficiency of %.3f%% in the last second", - HATCH_NAMES[i], - inputHatch.Amperes, - VN[inputHatch.mTier], - mLink != null ? mLink.mSendAmounts[i] : 0, - mLink != null ? mLink.mSendAmounts[i] / 20 / V[inputHatch.mTier] : 0, - mLink != null && mLink.mSendAmounts[i] > 0 ? ((double)mLink.mReceiveAmounts[OPPOSITES[i]]) / ((double)mLink.mSendAmounts[i]) * 100 : 0 - )); - } else if(outputHatch != null) { - data.add(String.format( - "%s hatch (%,dA/t %s) received §b%,d§f EU (equivalent to %,dA/t) with an efficiency of %.3f%% in the last second", - HATCH_NAMES[i], - outputHatch.Amperes, - VN[outputHatch.mTier], - mLink != null ? mLink.mReceiveAmounts[i] : 0, - mLink != null ? mLink.mReceiveAmounts[i] / 20 / V[outputHatch.mTier] : 0, - mLink != null && mLink.mSendAmounts[OPPOSITES[i]] > 0 ? ((double)mLink.mReceiveAmounts[i]) / ((double)mLink.mSendAmounts[OPPOSITES[i]]) * 100 : 0 - )); - } else { - data.add(String.format("%s hatch is not present", HATCH_NAMES[i])); - } - // spotless:on - } - - data.add("-----------------------"); - - return data.toArray(new String[data.size()]); - } - - @Override - protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { - super.drawTexts(screenElements, inventorySlot); - - screenElements.widgets(TextWidget.dynamicString(() -> { - if (mLink == null) { - return String.format("§7Missing Entangled Singularity§f"); - } - - if (!mLink.isFormed()) { - return String.format("§7Wormhole status: §cNo destination§f"); - } - - if (mLink.mWormholeEnergy > 0 && !mLink.isActive()) { - return String.format("§7Wormhole status: §6Decaying§f"); - } - - if (mLink.mWormholeEnergy > 0) { - return String.format("§7Wormhole status: §bActive§f"); - } - - return String.format("§7Wormhole status: Inactive§f"); - }), - - TextWidget.dynamicString(() -> { - if (mLink == null) { - return ""; - } - - // LV power = 1 angstrom in diameter - double radius = Math.sqrt(mLink.mWormholeEnergy / 20.0 / 32.0); - - return String.format("§7Wormhole diameter: §b%,d§7 ŧf", (long) (radius * 2)); - }) - .setEnabled(w -> mWormholeEnergy_UI > 0), - - TextWidget.dynamicString(() -> { - if (mLink == null) { - return ""; - } - - if (mLink.mWormholeEnergy >= 1e10) { - return String.format("§7Max I/O per hatch: §b%3.3e§7 EU/t§f", mLink.mWormholeEnergy / 20); - } else { - return String.format("§7Max I/O per hatch: §b%,d§7 EU/t§f", (long) (mLink.mWormholeEnergy / 20)); - } - }) - .setEnabled(w -> mWormholeEnergy_UI > 0), - - new FakeSyncWidget.DoubleSyncer( - () -> mLink != null ? mLink.mWormholeEnergy : 0, - val -> mWormholeEnergy_UI = val)); - } - - // #endregion - -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEAbstractMultiFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEAbstractMultiFurnace.java new file mode 100644 index 0000000000..f81f7e1d96 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEAbstractMultiFurnace.java @@ -0,0 +1,48 @@ +package gregtech.common.tileentities.machines.multi; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; + +public abstract class MTEAbstractMultiFurnace> + extends MTEExtendedPowerMultiBlockBase { + + private HeatingCoilLevel mCoilLevel; + + protected MTEAbstractMultiFurnace(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + protected MTEAbstractMultiFurnace(String aName) { + super(aName); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + public HeatingCoilLevel getCoilLevel() { + return mCoilLevel; + } + + public void setCoilLevel(HeatingCoilLevel aCoilLevel) { + mCoilLevel = aCoilLevel; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEAssemblyLine.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEAssemblyLine.java new file mode 100644 index 0000000000..31456825ba --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEAssemblyLine.java @@ -0,0 +1,494 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofHatchAdder; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.enums.VoidingMode; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchDataAccess; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.AssemblyLineUtils; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTRecipe.RecipeAssemblyLine; +import gregtech.api.util.GTUtility; +import gregtech.api.util.IGTHatchAdder; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEAssemblyLine extends MTEExtendedPowerMultiBlockBase implements ISurvivalConstructable { + + public ArrayList mDataAccessHatches = new ArrayList<>(); + private static final String STRUCTURE_PIECE_FIRST = "first"; + private static final String STRUCTURE_PIECE_LATER = "later"; + private static final String STRUCTURE_PIECE_LAST = "last"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_FIRST, + transpose(new String[][] { { " ", "e", " " }, { "~", "l", "G" }, { "g", "m", "g" }, { "b", "i", "b" }, })) + .addShape( + STRUCTURE_PIECE_LATER, + transpose(new String[][] { { " ", "e", " " }, { "d", "l", "d" }, { "g", "m", "g" }, { "b", "I", "b" }, })) + .addShape( + STRUCTURE_PIECE_LAST, + transpose(new String[][] { { " ", "e", " " }, { "d", "l", "d" }, { "g", "m", "g" }, { "o", "i", "b" }, })) + .addElement('G', ofBlock(GregTechAPI.sBlockCasings3, 10)) // grate machine casing + .addElement('l', ofBlock(GregTechAPI.sBlockCasings2, 9)) // assembler machine casing + .addElement('m', ofBlock(GregTechAPI.sBlockCasings2, 5)) // assembling line casing + .addElement('g', Glasses.chainAllGlasses()) + .addElement( + 'e', + ofChain( + Energy.newAny(16, 1, ForgeDirection.UP, ForgeDirection.NORTH, ForgeDirection.SOUTH), + ofBlock(GregTechAPI.sBlockCasings2, 0))) + .addElement( + 'd', + buildHatchAdder(MTEAssemblyLine.class).atLeast(DataHatchElement.DataAccess) + .dot(2) + .casingIndex(42) + .allowOnly(ForgeDirection.NORTH) + .buildAndChain(GregTechAPI.sBlockCasings3, 10)) + .addElement( + 'b', + buildHatchAdder(MTEAssemblyLine.class).atLeast(InputHatch, InputHatch, InputHatch, InputHatch, Maintenance) + .casingIndex(16) + .dot(3) + .allowOnly(ForgeDirection.DOWN) + .buildAndChain( + ofBlock(GregTechAPI.sBlockCasings2, 0), + ofHatchAdder(MTEAssemblyLine::addOutputToMachineList, 16, 4))) + .addElement( + 'I', + ofChain( + // all blocks nearby use solid steel casing, so let's use the texture of that + InputBus.newAny(16, 5, ForgeDirection.DOWN), + ofHatchAdder(MTEAssemblyLine::addOutputToMachineList, 16, 4))) + .addElement('i', InputBus.newAny(16, 5, ForgeDirection.DOWN)) + .addElement('o', OutputBus.newAny(16, 4, ForgeDirection.DOWN)) + .build(); + + public MTEAssemblyLine(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEAssemblyLine(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEAssemblyLine(this.mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Assembling Line") + .addInfo("Controller block for the Assembling Line") + .addInfo("Used to make complex machine parts (LuV+)") + .addInfo("Does not make Assembler items") + .addInfo("Recipe tier is at most Energy Hatch tier + 1.") + .addSeparator() + .beginVariableStructureBlock(5, 16, 4, 4, 3, 3, false) // ? + .addStructureInfo("From Bottom to Top, Left to Right") + .addStructureInfo( + "Layer 1 - Solid Steel Machine Casing, Input Bus (last can be Output Bus), Solid Steel Machine Casing") + .addStructureInfo( + "Layer 2 - Borosilicate Glass(any)/Warded Glass/Reinforced Glass, Assembling Line Casing, Reinforced Glass") + .addStructureInfo("Layer 3 - Grate Machine Casing, Assembler Machine Casing, Grate Machine Casing") + .addStructureInfo("Layer 4 - Empty, Solid Steel Machine Casing, Empty") + .addStructureInfo("Up to 16 repeating slices, each one allows for 1 more item in recipes") + .addController("Either Grate on layer 3 of the first slice") + .addEnergyHatch("Any layer 4 casing", 1) + .addMaintenanceHatch("Any layer 1 casing", 3) + .addInputBus("As specified on layer 1", 4, 5) + .addInputHatch("Any layer 1 casing", 3) + .addOutputBus("Replaces Input Bus on final slice or on any solid steel casing on layer 1", 4) + .addOtherStructurePart("Data Access Hatch", "Optional, next to controller", 2) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][16] }; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.assemblylineVisualRecipes; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + if (GTValues.D1) { + GT_FML_LOGGER.info("Start ALine recipe check"); + } + CheckRecipeResult result = CheckRecipeResultRegistry.NO_DATA_STICKS; + + ArrayList tDataStickList = getDataItems(2); + if (tDataStickList.isEmpty()) { + return result; + } + if (GTValues.D1) { + GT_FML_LOGGER.info("Stick accepted, " + tDataStickList.size() + " Data Sticks found"); + } + + int[] tStacks = new int[0]; + FluidStack[] tFluids = new FluidStack[0]; + long averageVoltage = getAverageInputVoltage(); + long maxAmp = mEnergyHatches.size() <= 1 ? 1 : getMaxInputAmps(); + int maxParallel = 1; + Map inputsFromME = getStoredInputsFromME(); + Map fluidsFromME = getStoredFluidsFromME(); + + for (ItemStack tDataStick : tDataStickList) { + AssemblyLineUtils.LookupResult tLookupResult = AssemblyLineUtils + .findAssemblyLineRecipeFromDataStick(tDataStick, false); + + if (tLookupResult.getType() == AssemblyLineUtils.LookupResultType.INVALID_STICK) { + result = CheckRecipeResultRegistry.NO_RECIPE; + continue; + } + + GTRecipe.RecipeAssemblyLine tRecipe = tLookupResult.getRecipe(); + // Check if the recipe on the data stick is the current recipe for it's given output, if not we update it + // and continue to next. + if (tLookupResult.getType() != AssemblyLineUtils.LookupResultType.VALID_STACK_AND_VALID_HASH) { + tRecipe = AssemblyLineUtils.processDataStick(tDataStick); + if (tRecipe == null) { + result = CheckRecipeResultRegistry.NO_RECIPE; + continue; + } + } + + // Void protection check. + if (!canOutputAll(new ItemStack[] { tRecipe.mOutput })) { + result = CheckRecipeResultRegistry.ITEM_OUTPUT_FULL; + continue; + } + + // So here we check against the recipe found on the data stick. + // If we run into missing buses/hatches or bad inputs, we go to the next data stick. + // This check only happens if we have a valid up-to-date data stick. + + // first validate we have enough input busses and input hatches for this recipe + if (mInputBusses.size() < tRecipe.mInputs.length || mInputHatches.size() < tRecipe.mFluidInputs.length) { + if (GTValues.D1) { + GT_FML_LOGGER.info( + "Not enough sources: Need ({}, {}), has ({}, {})", + mInputBusses.size(), + tRecipe.mInputs.length, + mInputHatches.size(), + tRecipe.mFluidInputs.length); + } + result = CheckRecipeResultRegistry.NO_RECIPE; + continue; + } + + // Check Inputs allign + int[] itemConsumptions = GTRecipe.RecipeAssemblyLine.getItemConsumptionAmountArray(mInputBusses, tRecipe); + if (itemConsumptions == null || itemConsumptions.length == 0) { + result = CheckRecipeResultRegistry.NO_RECIPE; + continue; + } + maxParallel = (int) GTRecipe.RecipeAssemblyLine + .maxParallelCalculatedByInputItems(mInputBusses, maxParallel, itemConsumptions, inputsFromME); + if (maxParallel <= 0) { + result = CheckRecipeResultRegistry.NO_RECIPE; + continue; + } + tStacks = itemConsumptions; + + if (GTValues.D1) { + GT_FML_LOGGER.info("All Items accepted"); + } + + // Check Fluid Inputs allign + if (tRecipe.mFluidInputs.length > 0) { + maxParallel = (int) RecipeAssemblyLine + .maxParallelCalculatedByInputFluids(mInputHatches, maxParallel, tRecipe.mFluidInputs, fluidsFromME); + if (maxParallel <= 0) { + result = CheckRecipeResultRegistry.NO_RECIPE; + continue; + } + tFluids = tRecipe.mFluidInputs; + } + + if (GTValues.D1) { + GT_FML_LOGGER.info("All fluids accepted"); + } + + if (GTValues.D1) { + GT_FML_LOGGER.info("Check overclock"); + } + + // Recipe tier is limited to hatch tier + 1. + if (tRecipe.mEUt > averageVoltage * 4) { + result = CheckRecipeResultRegistry.insufficientPower(tRecipe.mEUt); + continue; + } + + // Insufficient power check. + if (tRecipe.mEUt > maxAmp * averageVoltage) { + result = CheckRecipeResultRegistry.insufficientPower(tRecipe.mEUt); + continue; + } + + calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, (int) maxAmp, averageVoltage, false); + // In case recipe is too OP for that machine + if (lEUt == Long.MAX_VALUE) { + if (GTValues.D1) { + GT_FML_LOGGER.info("Recipe too OP"); + } + result = CheckRecipeResultRegistry.POWER_OVERFLOW; + continue; + } + + if (mMaxProgresstime == Integer.MAX_VALUE) { + if (GTValues.D1) { + GT_FML_LOGGER.info("Recipe too OP"); + } + result = CheckRecipeResultRegistry.DURATION_OVERFLOW; + continue; + } + + if (GTValues.D1) { + GT_FML_LOGGER.info("Find available recipe"); + } + result = CheckRecipeResultRegistry.SUCCESSFUL; + mOutputItems = new ItemStack[] { tRecipe.mOutput }; + break; + } + + if (!result.wasSuccessful()) { + return result; + } + + // Must be something wrong here... + if (tStacks.length == 0 || maxParallel <= 0) { + return CheckRecipeResultRegistry.INTERNAL_ERROR; + } + + if (GTValues.D1) { + GT_FML_LOGGER.info("All checked start consuming inputs"); + } + + GTRecipe.RecipeAssemblyLine.consumeInputItems(mInputBusses, maxParallel, tStacks, inputsFromME); + GTRecipe.RecipeAssemblyLine.consumeInputFluids(mInputHatches, maxParallel, tFluids, fluidsFromME); + + if (this.lEUt > 0) { + this.lEUt = -this.lEUt; + } + this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); + this.mEfficiencyIncrease = 10000; + updateSlots(); + if (GTValues.D1) { + GT_FML_LOGGER.info("Recipe successful"); + } + return result; + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + for (MTEHatchDataAccess hatch_dataAccess : mDataAccessHatches) { + hatch_dataAccess.setActive(true); + } + return super.onRunningTick(aStack); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mDataAccessHatches.clear(); + if (!checkPiece(STRUCTURE_PIECE_FIRST, 0, 1, 0)) return false; + return checkMachine(true) || checkMachine(false); + } + + private boolean checkMachine(boolean leftToRight) { + for (int i = 1; i < 16; i++) { + if (!checkPiece(STRUCTURE_PIECE_LATER, leftToRight ? -i : i, 1, 0)) return false; + if (!mOutputBusses.isEmpty()) + return !mEnergyHatches.isEmpty() && mMaintenanceHatches.size() == 1 && mDataAccessHatches.size() <= 1; + } + return false; + } + + /** + * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb + */ + private static boolean isCorrectDataItem(ItemStack aStack, int state) { + if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true; + if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true; + return (state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true); + } + + /** + * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb + */ + public ArrayList getDataItems(int state) { + ArrayList rList = new ArrayList<>(); + if (GTUtility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) { + rList.add(mInventory[1]); + } + for (MTEHatchDataAccess tHatch : filterValidMTEs(mDataAccessHatches)) { + rList.addAll(tHatch.getInventoryItems(stack -> isCorrectDataItem(stack, state))); + } + return rList; + } + + public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchDataAccess) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mDataAccessHatches.add((MTEHatchDataAccess) aMetaTileEntity); + } + return false; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_FIRST, stackSize, hintsOnly, 0, 1, 0); + int tLength = Math.min(stackSize.stackSize + 1, 16); + for (int i = 1; i < tLength; i++) { + buildPiece(STRUCTURE_PIECE_LATER, stackSize, hintsOnly, -i, 1, 0); + } + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + int build = survivialBuildPiece(STRUCTURE_PIECE_FIRST, stackSize, 0, 1, 0, elementBudget, env, false, true); + if (build >= 0) return build; + int tLength = Math.min(stackSize.stackSize + 1, 16); + for (int i = 1; i < tLength - 1; i++) { + build = survivialBuildPiece(STRUCTURE_PIECE_LATER, stackSize, -i, 1, 0, elementBudget, env, false, true); + if (build >= 0) return build; + } + return survivialBuildPiece(STRUCTURE_PIECE_LAST, stackSize, 1 - tLength, 1, 0, elementBudget, env, false, true); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public Set getAllowedVoidingModes() { + return VoidingMode.ITEM_ONLY_MODES; + } + + private enum DataHatchElement implements IHatchElement { + + DataAccess; + + @Override + public List> mteClasses() { + return Collections.singletonList(MTEHatchDataAccess.class); + } + + @Override + public IGTHatchAdder adder() { + return MTEAssemblyLine::addDataAccessToMachineList; + } + + @Override + public long count(MTEAssemblyLine t) { + return t.mDataAccessHatches.size(); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEBrickedBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEBrickedBlastFurnace.java new file mode 100644 index 0000000000..f37b5e3e81 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEBrickedBlastFurnace.java @@ -0,0 +1,154 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.util.GTWaila.getMachineProgressString; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.input.Keyboard; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SteamVariant; +import gregtech.api.enums.Textures; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ISecondaryDescribable; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEBrickedBlastFurnace extends MTEPrimitiveBlastFurnace implements ISecondaryDescribable { + + private static final ITexture[] FACING_SIDE = { TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_DENSEBRICKS) }; + private static final ITexture[] FACING_FRONT = { + TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE) }; + private static final ITexture[] FACING_ACTIVE = { + TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE), TextureFactory.builder() + .addIcon(BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW) + .glow() + .build() }; + private MultiblockTooltipBuilder tooltipBuilder; + + public MTEBrickedBlastFurnace(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEBrickedBlastFurnace(String aName) { + super(aName); + } + + @Override + public String[] getDescription() { + return getCurrentDescription(); + } + + @Override + public boolean isDisplaySecondaryDescription() { + return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); + } + + public String[] getPrimaryDescription() { + return getTooltip().getInformation(); + } + + public String[] getSecondaryDescription() { + return getTooltip().getStructureInformation(); + } + + protected MultiblockTooltipBuilder getTooltip() { + if (tooltipBuilder == null) { + tooltipBuilder = new MultiblockTooltipBuilder(); + tooltipBuilder.addMachineType("Blast Furnace") + .addInfo("Controller Block for the Bricked Blast Furnace") + .addInfo("Usable for Steel and general Pyrometallurgy") + .addInfo("Has a useful interface, unlike other gregtech multis") + .addPollutionAmount(GTMod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond) + .addSeparator() + .beginStructureBlock(3, 4, 3, true) + .addController("Front center") + .addOtherStructurePart("Firebricks", "Everything except the controller") + .addStructureInfo("The top block is also empty") + .addStructureInfo("You can share the walls of GT multis, so") + .addStructureInfo("each additional one costs less, up to 4") + .toolTipFinisher("Gregtech"); + } + return tooltipBuilder; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + return aActive ? FACING_ACTIVE : FACING_FRONT; + } + return FACING_SIDE; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBrickedBlastFurnace(this.mName); + } + + @Override + protected Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + protected int getCasingMetaID() { + return 15; + } + + @Override + public String getName() { + return "Bricked Blast Furnace"; + } + + @Override + public SteamVariant getSteamVariant() { + return SteamVariant.PRIMITIVE; + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currenttip, accessor, config); + if (!this.getBaseMetaTileEntity() + .isInvalidTileEntity()) { + NBTTagCompound nbt = accessor.getNBTData(); + currenttip.add( + getMachineProgressString( + this.getBaseMetaTileEntity() + .isActive(), + nbt.getInteger("mMaxProgressTime"), + nbt.getInteger("mProgressTime"))); + } + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + if (!this.getBaseMetaTileEntity() + .isInvalidTileEntity()) { + tag.setInteger("mProgressTime", this.getProgresstime()); + tag.setInteger("mMaxProgressTime", this.maxProgresstime()); + } + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return getTooltip().getStructureHint(); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTECharcoalPit.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTECharcoalPit.java new file mode 100644 index 0000000000..268ef069a7 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTECharcoalPit.java @@ -0,0 +1,311 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import java.util.ArrayList; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.ChunkPosition; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.ParticleFX; +import gregtech.api.interfaces.ISecondaryDescribable; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTETooltipMultiBlockBase; +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.MultiblockTooltipBuilder; +import gregtech.api.util.WorldSpawnedEventBuilder; +import gregtech.common.Pollution; + +public class MTECharcoalPit extends MTETooltipMultiBlockBase implements ISecondaryDescribable { + + private boolean running = false; + + public MTECharcoalPit(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTECharcoalPit(String aName) { + super(aName); + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + // No GUI, do not capture right-click so it does not interfere when placing logs + return false; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Nonnull + @Override + public CheckRecipeResult checkProcessing() { + if (!checkRecursiveBlocks()) { + mEfficiency = 0; + mEfficiencyIncrease = 0; + mMaxProgresstime = 0; + running = false; + return CheckRecipeResultRegistry.NO_RECIPE; + } + + if (mEfficiency == 0) { + mEfficiency = 10000; + mEfficiencyIncrease = 10000; + mMaxProgresstime = Math.max(1, mMaxProgresstime); + + // adds all the pollution at once when the recipe starts + Pollution.addPollution(getBaseMetaTileEntity(), mMaxProgresstime * getPollutionPerTick(null)); + return CheckRecipeResultRegistry.SUCCESSFUL; + } else { + mEfficiency = 0; + mEfficiencyIncrease = 0; + mMaxProgresstime = 0; + return CheckRecipeResultRegistry.NO_RECIPE; + } + } + + private boolean checkRecursiveBlocks() { + ArrayList tList1 = new ArrayList<>(); + ArrayList tList2 = new ArrayList<>(); + + Block tBlock = getBaseMetaTileEntity().getBlockOffset(0, -1, 0); + if (isWoodLog(tBlock, getBaseMetaTileEntity().getMetaIDOffset(0, -1, 0))) { + tList2.add(new ChunkPosition(0, -1, 0)); + } else return false; + while (!tList2.isEmpty()) { + ChunkPosition tPos = tList2.get(0); + tList2.remove(0); + if (!checkAllBlockSides(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ, tList1, tList2)) { + return false; + } + } + if (running) { + for (ChunkPosition tPos : tList1) { + if (isWoodLog( + getBaseMetaTileEntity().getBlockOffset(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ), + getBaseMetaTileEntity().getMetaIDOffset(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ))) + getBaseMetaTileEntity().getWorld() + .setBlock( + getBaseMetaTileEntity().getXCoord() + tPos.chunkPosX, + getBaseMetaTileEntity().getYCoord() + tPos.chunkPosY, + getBaseMetaTileEntity().getZCoord() + tPos.chunkPosZ, + GregTechAPI.sBlockReinforced, + 4, + 3); + } + running = false; + return false; + } else { + mMaxProgresstime = (int) Math.sqrt(tList1.size() * 240000); + } + running = true; + return true; + } + + private boolean isWoodLog(Block log, int meta) { + for (int id : OreDictionary.getOreIDs(new ItemStack(log, 1, meta))) { + if (OreDictionary.getOreName(id) + .equals("logWood")) return true; + } + String tTool = log.getHarvestTool(meta); + return OrePrefixes.log.contains(new ItemStack(log, 1, meta)) && ("axe".equals(tTool)) + && (log.getMaterial() == Material.wood); + } + + private boolean checkAllBlockSides(int aX, int aY, int aZ, ArrayList aList1, + ArrayList aList2) { + boolean expandToChunkXPos = false; + boolean expandToChunkXNeg = false; + boolean expandToChunkYPos = false; + boolean expandToChunkYNeg = false; + boolean expandToChunkZPos = false; + boolean expandToChunkZNeg = false; + + Block blockXPos = getBaseMetaTileEntity().getBlockOffset(aX + 1, aY, aZ); + if (aX + 1 < 6 && (isWoodLog(blockXPos, getBaseMetaTileEntity().getMetaIDOffset(aX + 1, aY, aZ)))) { + if (!aList1.contains(new ChunkPosition(aX + 1, aY, aZ)) + && (!aList2.contains(new ChunkPosition(aX + 1, aY, aZ)))) expandToChunkXPos = true; + } else if (!(blockXPos == Blocks.dirt || blockXPos == Blocks.grass)) { + return false; + } + + Block blockXNeg = getBaseMetaTileEntity().getBlockOffset(aX - 1, aY, aZ); + if (aX - 1 > -6 && (isWoodLog(blockXNeg, getBaseMetaTileEntity().getMetaIDOffset(aX - 1, aY, aZ)))) { + if (!aList1.contains(new ChunkPosition(aX - 1, aY, aZ)) + && (!aList2.contains(new ChunkPosition(aX - 1, aY, aZ)))) expandToChunkXNeg = true; + } else if (!(blockXNeg == Blocks.dirt || blockXNeg == Blocks.grass)) { + return false; + } + + Block blockYPos = getBaseMetaTileEntity().getBlockOffset(aX, aY + 1, aZ); + if (aY + 1 < 1 && (isWoodLog(blockYPos, getBaseMetaTileEntity().getMetaIDOffset(aX, aY + 1, aZ)))) { + if (!aList1.contains(new ChunkPosition(aX, aY + 1, aZ)) + && (!aList2.contains(new ChunkPosition(aX, aY + 1, aZ)))) expandToChunkYPos = true; + } else if (!(blockYPos == Blocks.dirt || blockYPos == Blocks.grass + || (aX == 0 && aY == -1 && aZ == 0 && blockYPos == GregTechAPI.sBlockMachines))) { + return false; + } + + Block blockYNeg = getBaseMetaTileEntity().getBlockOffset(aX, aY - 1, aZ); + if (aY - 1 > -6 && (isWoodLog(blockYNeg, getBaseMetaTileEntity().getMetaIDOffset(aX, aY - 1, aZ)))) { + if (!aList1.contains(new ChunkPosition(aX, aY - 1, aZ)) + && (!aList2.contains(new ChunkPosition(aX, aY - 1, aZ)))) expandToChunkYNeg = true; + } else if (blockYNeg != Blocks.brick_block) { + return false; + } + + Block blockZPos = getBaseMetaTileEntity().getBlockOffset(aX, aY, aZ + 1); + if (aZ + 1 < 6 && (isWoodLog(blockZPos, getBaseMetaTileEntity().getMetaIDOffset(aX, aY, aZ + 1)))) { + if (!aList1.contains(new ChunkPosition(aX, aY, aZ + 1)) + && (!aList2.contains(new ChunkPosition(aX, aY, aZ + 1)))) expandToChunkZPos = true; + } else if (!(blockZPos == Blocks.dirt || blockZPos == Blocks.grass)) { + return false; + } + + Block blockZNeg = getBaseMetaTileEntity().getBlockOffset(aX, aY, aZ - 1); + if (aZ - 1 > -6 && (isWoodLog(blockZNeg, getBaseMetaTileEntity().getMetaIDOffset(aX, aY, aZ - 1)))) { + if (!aList1.contains(new ChunkPosition(aX, aY, aZ - 1)) + && (!aList2.contains(new ChunkPosition(aX, aY, aZ - 1)))) expandToChunkZNeg = true; + } else if (!(blockZNeg == Blocks.dirt || blockZNeg == Blocks.grass)) { + return false; + } + aList1.add(new ChunkPosition(aX, aY, aZ)); + if (expandToChunkXPos) aList2.add(new ChunkPosition(aX + 1, aY, aZ)); + if (expandToChunkXNeg) aList2.add(new ChunkPosition(aX - 1, aY, aZ)); + if (expandToChunkYPos) aList2.add(new ChunkPosition(aX, aY + 1, aZ)); + if (expandToChunkYNeg) aList2.add(new ChunkPosition(aX, aY - 1, aZ)); + if (expandToChunkZPos) aList2.add(new ChunkPosition(aX, aY, aZ + 1)); + if (expandToChunkZNeg) aList2.add(new ChunkPosition(aX, aY, aZ - 1)); + return true; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionCharcoalPitPerSecond; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public RecipeMap getRecipeMap() { + return null; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTECharcoalPit(mName); + } + + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Charcoal Pile Igniter") + .addInfo("Controller for the Charcoal Pit") + .addInfo("Converts Logs into Brittle Charcoal blocks") + .addInfo("Will automatically start when valid") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginVariableStructureBlock(3, 13, 3, 7, 3, 13, false) + .addStructureInfo("Can be up to 13x7x13 in size, including the dirt; shape doesn't matter") + .addOtherStructurePart("Controller", "Top layer, directly touching a wood log") + .addOtherStructurePart("Dirt/Grass", "Top and middle layers, covering wood logs") + .addOtherStructurePart("Bricks", "Bottom layer, under all wood logs") + .addOtherStructurePart("Wood Logs", "Up to 5 layers, inside the previously mentioned blocks") + .addStructureInfo("No air between logs allowed.") + .addStructureInfo( + "All logs must be within 6 x/z of the controller, so it must be dead-center for a full 11x11 square of wood.") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == ForgeDirection.UP) { + if (aActive) return new ITexture[] { casingTexturePages[0][10], + TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW) + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][10], TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW) + .glow() + .build(), }; + } + return new ITexture[] { casingTexturePages[0][10] }; + } + + @Override + public boolean polluteEnvironment(int aPollutionLevel) { + // Do nothing and don't choke on pollution. This is fine because we add + // all the pollution at once when the recipe starts + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + super.onPostTick(aBaseMetaTileEntity, aTimer); + if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) { + + new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0D, 0.3D, 0D) + .setIdentifier(ParticleFX.LARGE_SMOKE) + .setPosition( + aBaseMetaTileEntity.getOffsetX(ForgeDirection.UP, 1) + XSTR_INSTANCE.nextFloat(), + aBaseMetaTileEntity.getOffsetY(ForgeDirection.UP, 1), + aBaseMetaTileEntity.getOffsetZ(ForgeDirection.UP, 1) + XSTR_INSTANCE.nextFloat()) + .setWorld(getBaseMetaTileEntity().getWorld()) + .run(); + } + } + + @Override + public boolean getDefaultHasMaintenanceChecks() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTECleanroom.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTECleanroom.java new file mode 100644 index 0000000000..99a256e3f8 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTECleanroom.java @@ -0,0 +1,527 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.GTValues.debugCleanroom; +import static gregtech.api.enums.Textures.BlockIcons.BLOCK_PLASCRETE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_GLOW; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.TierEU; +import gregtech.api.interfaces.ICleanroom; +import gregtech.api.interfaces.ICleanroomReceiver; +import gregtech.api.interfaces.ISecondaryDescribable; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicHull; +import gregtech.api.metatileentity.implementations.MTETooltipMultiBlockBase; +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.GTLog; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTECleanroom extends MTETooltipMultiBlockBase + implements IConstructable, ISecondaryDescribable, ICleanroom { + + private final Set cleanroomReceivers = new HashSet<>(); + private int mHeight = -1; + + public MTECleanroom(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTECleanroom(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTECleanroom(mName); + } + + @Override + public int getCleanness() { + return mEfficiency; + } + + @Override + public boolean isValidCleanroom() { + return isValid() && mMachine; + } + + @Override + public void pollute() { + mEfficiency = 0; + mWrench = false; + mScrewdriver = false; + mSoftHammer = false; + mHardHammer = false; + mSolderingTool = false; + mCrowbar = false; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Cleanroom") + .addInfo("Controller block for the Cleanroom") + .addInfo("Consumes 40 EU/t when first turned on") + .addInfo("and 4 EU/t once at 100% efficiency") + .addInfo("If you use an LV energy hatch, it will actually accept 2A instead of just 1A.") + .addInfo( + "MV+ energy hatches just accept 1A as usual. For HV+ the cleanroom will overclock and gain efficiency faster.") + .addInfo("Time required to reach full efficiency is proportional to") + .addInfo("the height of empty space within") + .addInfo("Machines that cause pollution aren't allowed to be put in.") + .addSeparator() + .beginVariableStructureBlock(3, 15, 4, 15, 3, 15, true) + .addController("Top center") + .addCasingInfoRange("Plascrete", 20, 1007, false) + .addStructureInfo( + GTValues.cleanroomGlass + + "% of the Plascrete can be replaced with Reinforced Glass (not counting the top layer)") + .addStructureInfo( + "Other material can be used in place of Plascrete, even in higher percentages. See config for detail") + .addOtherStructurePart("Filter Machine Casing", "Top besides controller and edges") + .addEnergyHatch("Any casing except top layer. Exactly one.") + .addMaintenanceHatch("Any casing except top layer") + .addStructureInfo("0-2x Reinforced Door (keep closed or efficiency will reduce)") + .addStructureInfo("Up to 1 Elevator, Rotating Elevator, and Travel Anchor each") + .addStructureInfo("Up to 10 Machine Hulls for Item & Energy transfer through walls") + .addStructureInfo("You can also use Diodes for more power") + .addStructureInfo("Diodes also count towards 10 Machine Hulls count limit") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public String[] getStructureDescription(ItemStack itemStack) { + return new String[] { "The base can be rectangular." }; + } + + @Nonnull + @Override + public CheckRecipeResult checkProcessing() { + mEfficiencyIncrease = 100; + final long inputVoltage = getMaxInputVoltage(); + + // only allow LV+ energy hatches + if (inputVoltage < TierEU.LV) { + return CheckRecipeResultRegistry.insufficientPower(40); + } + + // use the standard overclock mechanism to determine duration and estimate a maximum consumption + // if the cleanroom is powered by an LV energy hatch, it will actually accept 2A instead of just 1A. + calculateOverclockedNessMultiInternal( + 40, + 45 * Math.max(1, mHeight - 1), + inputVoltage == TierEU.LV ? 2 : 1, + inputVoltage, + false); + // negate it to trigger the special energy consumption function. divide by 10 to get the actual final + // consumption. + mEUt /= -10; + return SimpleCheckRecipeResult.ofSuccess("cleanroom_running"); + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + int x = 1; + int z = 1; + int y = 1; + int mDoorCount = 0; + int mHullCount = 0; + int mPlascreteCount = 0; + final HashMap otherBlocks = new HashMap<>(); + boolean doorState = false; + this.mUpdate = 100; + cleanroomReceivers.forEach(r -> r.setCleanroom(null)); + cleanroomReceivers.clear(); + + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Checking machine"); + } + for (int i = 1; i < 8; i++) { + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, 0); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, 0); + if (tBlock != GregTechAPI.sBlockCasings3 || tMeta != 11) { + if (tBlock == GregTechAPI.sBlockReinforced || tMeta == 2) { + x = i; + break; + } else { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Unable to detect room X edge?"); + } + return false; + } + } + } + for (int i = 1; i < 8; i++) { + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(0, 0, i); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(0, 0, i); + if (tBlock != GregTechAPI.sBlockCasings3 || tMeta != 11) { + if (tBlock == GregTechAPI.sBlockReinforced || tMeta == 2) { + z = i; + break; + } else { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Unable to detect room Z edge?"); + } + return false; + } + } + } + // detect rectangular area of filters + for (int i = -x + 1; i < x; i++) { + for (int j = -z + 1; j < z; j++) { + if (i == 0 && j == 0) continue; + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, j); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, j); + if (tBlock != GregTechAPI.sBlockCasings3 && tMeta != 11) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: This is not a filter."); + } + return false; + } + } + } + + for (int i = -1; i > -16; i--) { + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(x, i, z); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(x, i, z); + if (tBlock != GregTechAPI.sBlockReinforced || tMeta != 2) { + y = i + 1; + break; + } + } + if (y > -2) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Room not tall enough?"); + } + return false; + } + for (int dX = -x; dX <= x; dX++) { + for (int dZ = -z; dZ <= z; dZ++) { + for (int dY = 0; dY >= y; dY--) { + if (dX == -x || dX == x || dY == 0 || dY == y || dZ == -z || dZ == z) { + Block tBlock = aBaseMetaTileEntity.getBlockOffset(dX, dY, dZ); + int tMeta = aBaseMetaTileEntity.getMetaIDOffset(dX, dY, dZ); + if (dY == 0) { // TOP + if (dX == -x || dX == x || dZ == -z || dZ == z) { // Top Border + if (tBlock != GregTechAPI.sBlockReinforced || tMeta != 2) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Non reinforced block on top edge? tMeta != 2"); + } + return false; + } + mPlascreteCount++; + } else if (dX != 0 || dZ != 0) { // Top Inner exclude center + if (tBlock != GregTechAPI.sBlockCasings3 || tMeta != 11) { + if (debugCleanroom) { + GTLog.out.println( + "Cleanroom: Non reinforced block on top face interior? tMeta != 11"); + } + return false; + } + } + } else if (tBlock == GregTechAPI.sBlockReinforced && tMeta == 2) { + mPlascreteCount++; + } else { + final IGregTechTileEntity tTileEntity = aBaseMetaTileEntity + .getIGregTechTileEntityOffset(dX, dY, dZ); + if ((!this.addMaintenanceToMachineList(tTileEntity, 210)) + && (!this.addEnergyInputToMachineList(tTileEntity, 210))) { + if (tBlock instanceof ic2.core.block.BlockIC2Door) { + if ((tMeta & 8) == 0) { + // let's not fiddle with bits anymore. + if (Math.abs(dZ) < z) // on side parallel to z axis + doorState = tMeta == 1 || tMeta == 3 || tMeta == 4 || tMeta == 6; + else if (Math.abs(dX) < x) // on side parallel to x axis + doorState = tMeta == 0 || tMeta == 2 || tMeta == 5 || tMeta == 7; + // corners ignored + } + mDoorCount++; + } else { + if (tTileEntity != null) { + final IMetaTileEntity aMetaTileEntity = tTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Missing block? Not a aMetaTileEntity"); + } + return false; + } + if (aMetaTileEntity instanceof MTEBasicHull) { + mHullCount++; + } else { + if (debugCleanroom) { + GTLog.out.println( + "Cleanroom: Incorrect GT block? " + tBlock.getUnlocalizedName()); + } + return false; + } + } else { + String key = tBlock.getUnlocalizedName() + ":" + tMeta; + if (config.containsKey(key)) { // check with meta first + otherBlocks.compute(key, (k, v) -> v == null ? 1 : v + 1); + } else { + key = tBlock.getUnlocalizedName(); + if (config.containsKey(key)) { + otherBlocks.compute(key, (k, v) -> v == null ? 1 : v + 1); + } else { + if (debugCleanroom) { + GTLog.out.println( + "Cleanroom: not allowed block " + tBlock.getUnlocalizedName()); + } + return false; + } + } + } + } + } + } + } + } + } + } + if (this.mMaintenanceHatches.size() != 1 || this.mEnergyHatches.size() != 1 + || mDoorCount > 4 + || mHullCount > 10) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Incorrect number of doors, hulls, or hatches."); + } + return false; + } + if (mPlascreteCount < 20) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Could not find 20 Plascrete."); + } + return false; + } + int otherBlockCount = 0; + for (int v : otherBlocks.values()) { + otherBlockCount += v; + } + int maxAllowedRatio = 0; + for (Map.Entry e : otherBlocks.entrySet()) { + final ConfigEntry ce = config.get(e.getKey()); + maxAllowedRatio += Math.max(maxAllowedRatio, ce.percentage); + if (ce.allowedCount > 0) { // count has priority + if (e.getValue() > ce.allowedCount) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Absolute count too high for a block."); + } + return false; + } + } else if ((e.getValue() * 100) / (mPlascreteCount + otherBlockCount) > ce.percentage) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Relative count too high for a block."); + } + return false; + } + } + if ((otherBlockCount * 100) / (mPlascreteCount + otherBlockCount) > maxAllowedRatio) { + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Relative count of all non-plascrete blocks too high."); + } + return false; + } + + setCleanroomReceivers(x, y, z, aBaseMetaTileEntity); + + if (doorState) { + this.mEfficiency = Math.max(0, this.mEfficiency - 200); + } + for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) { + final byte t = (byte) Math.max(1, (byte) (15 / (10000f / this.mEfficiency))); + aBaseMetaTileEntity.setInternalOutputRedstoneSignal(tSide, t); + } + this.mHeight = -y; + if (debugCleanroom) { + GTLog.out.println("Cleanroom: Check successful."); + } + return true; + } + + private void setCleanroomReceivers(int x, int y, int z, IGregTechTileEntity aBaseMetaTileEntity) { + for (int dX = -x + 1; dX <= x - 1; dX++) { + for (int dZ = -z + 1; dZ <= z - 1; dZ++) for (int dY = -1; dY >= y + 1; dY--) { + TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityOffset(dX, dY, dZ); + if (tTileEntity instanceof ICleanroomReceiver receiver) { + receiver.setCleanroom(this); + cleanroomReceivers.add(receiver); + } + } + } + } + + @Override + public boolean allowGeneralRedstoneOutput() { + return true; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0) { + return new ITexture[] { TextureFactory.of(BLOCK_PLASCRETE), active + ? TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_CLEANROOM_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW) + .glow() + .build()) + : TextureFactory.of( + TextureFactory.of(OVERLAY_TOP_CLEANROOM), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_CLEANROOM_GLOW) + .glow() + .build()) }; + } + return new ITexture[] { TextureFactory.of(BLOCK_PLASCRETE) }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public void construct(ItemStack itemStack, boolean b) { + int i = Math.min(itemStack.stackSize, 7); + IGregTechTileEntity baseEntity = this.getBaseMetaTileEntity(); + World world = baseEntity.getWorld(); + int x = baseEntity.getXCoord(); + int y = baseEntity.getYCoord(); + int z = baseEntity.getZCoord(); + int yoff = Math.max(i * 2, 3); + for (int X = x - i; X <= x + i; X++) for (int Y = y; Y >= y - yoff; Y--) for (int Z = z - i; Z <= z + i; Z++) { + if (X == x && Y == y && Z == z) continue; + if (X == x - i || X == x + i || Z == z - i || Z == z + i || Y == y - yoff) { + if (b) StructureLibAPI.hintParticle(world, X, Y, Z, GregTechAPI.sBlockReinforced, 2); + else world.setBlock(X, Y, Z, GregTechAPI.sBlockReinforced, 2, 2); + } else if (Y == y) { + if (b) StructureLibAPI.hintParticle(world, X, Y, Z, GregTechAPI.sBlockCasings3, 11); + else world.setBlock(X, Y, Z, GregTechAPI.sBlockCasings3, 11, 2); + } + } + } + + private static class ConfigEntry { + + final int percentage; + final int allowedCount; + + ConfigEntry(int percentage, int count) { + this.percentage = percentage; + this.allowedCount = count; + } + } + + private static final HashMap config = new HashMap<>(); + private static final String category = "cleanroom_allowed_blocks"; + + private static void setDefaultConfigValues(Configuration cfg) { + cfg.get("cleanroom_allowed_blocks.manaGlass", "Name", "tile.manaGlass"); + cfg.get("cleanroom_allowed_blocks.manaGlass", "Percentage", 50); + cfg.get("cleanroom_allowed_blocks.elfGlass", "Name", "tile.elfGlass"); + cfg.get("cleanroom_allowed_blocks.elfGlass", "Percentage", 50); + cfg.get("cleanroom_allowed_blocks.reinforced_glass", "Name", "blockAlloyGlass"); + cfg.get("cleanroom_allowed_blocks.reinforced_glass", "Percentage", 5); + cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Name", "BW_GlasBlocks"); + cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Percentage", 50); + cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Meta", 0); + cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass", "Name", "BW_GlasBlocks"); + cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass", "Percentage", 100); + cfg.get("cleanroom_allowed_blocks.elevator", "Name", "tile.openblocks.elevator"); + cfg.get("cleanroom_allowed_blocks.elevator", "Count", 1); + cfg.get("cleanroom_allowed_blocks.travel_anchor", "Name", "tile.blockTravelAnchor"); + cfg.get("cleanroom_allowed_blocks.travel_anchor", "Count", 1); + cfg.get("cleanroom_allowed_blocks.warded_glass", "Name", "tile.blockCosmeticOpaque"); + cfg.get("cleanroom_allowed_blocks.warded_glass", "Meta", 2); + cfg.get("cleanroom_allowed_blocks.warded_glass", "Percentage", 50); + cfg.save(); + } + + public static void loadConfig(Configuration cfg) { + if (!cfg.hasCategory(category)) setDefaultConfigValues(cfg); + for (ConfigCategory cc : cfg.getCategory(category) + .getChildren()) { + final String name = cc.get("Name") + .getString(); + if (cc.containsKey("Count")) { + if (cc.containsKey("Meta")) config.put( + name + ":" + + cc.get("Meta") + .getInt(), + new ConfigEntry( + 0, + cc.get("Count") + .getInt())); + else config.put( + name, + new ConfigEntry( + 0, + cc.get("Count") + .getInt())); + } else if (cc.containsKey("Percentage")) { + if (cc.containsKey("Meta")) config.put( + name + ":" + + cc.get("Meta") + .getInt(), + new ConfigEntry( + cc.get("Percentage") + .getInt(), + 0)); + else config.put( + name, + new ConfigEntry( + cc.get("Percentage") + .getInt(), + 0)); + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller1.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller1.java new file mode 100644 index 0000000000..080c4b3c40 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller1.java @@ -0,0 +1,53 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEConcreteBackfiller1 extends MTEConcreteBackfillerBase { + + public MTEConcreteBackfiller1(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEConcreteBackfiller1(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("Concrete Backfiller"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEConcreteBackfiller1(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_SolidSteel; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Steel; + } + + @Override + protected int getCasingTextureIndex() { + return 16; + } + + @Override + protected int getRadius() { + return 16; + } + + @Override + protected int getMinTier() { + return 2; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller2.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller2.java new file mode 100644 index 0000000000..2d5fd17c82 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfiller2.java @@ -0,0 +1,54 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEConcreteBackfiller2 extends MTEConcreteBackfillerBase { + + public MTEConcreteBackfiller2(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEConcreteBackfiller2(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("Advanced Concrete Backfiller"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEConcreteBackfiller2(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_StableTitanium; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Titanium; + } + + @Override + protected int getCasingTextureIndex() { + return 50; + } + + @Override + protected int getRadius() { + int tConfig = getTotalConfigValue() * 2; + return tConfig >= 128 ? 128 : tConfig <= 0 ? 64 : tConfig; + } + + @Override + protected int getMinTier() { + return 4; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java new file mode 100644 index 0000000000..2671db1e8c --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java @@ -0,0 +1,264 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.IFluidBlock; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.widgets.LockedWhileActiveButton; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; + +public abstract class MTEConcreteBackfillerBase extends MTEDrillerBase { + + private int mLastXOff = 0, mLastZOff = 0; + + /** Used to drive the readout in the GUI for the backfiller's current y-level. */ + private int clientYHead; + + protected boolean mLiquidEnabled = true; + + private static boolean isWater(Block aBlock) { + return aBlock == Blocks.water || aBlock == Blocks.flowing_water; + } + + private static boolean isLava(Block aBlock) { + return aBlock == Blocks.lava || aBlock == Blocks.flowing_lava; + } + + private static boolean isFluid(Block aBlock) { + return isWater(aBlock) || isLava(aBlock) || aBlock instanceof IFluidBlock; + } + + public MTEConcreteBackfillerBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + initRecipeResults(); + } + + public MTEConcreteBackfillerBase(String aName) { + super(aName); + initRecipeResults(); + } + + private void initRecipeResults() { + addResultMessage(STATE_UPWARD, true, "backfiller_working"); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("liquidenabled", mLiquidEnabled); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("liquidenabled")) mLiquidEnabled = aNBT.getBoolean("liquidenabled"); + } + + protected MultiblockTooltipBuilder createTooltip(String aStructureName) { + String casings = getCasingBlockItem().get(0) + .getDisplayName(); + + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Concrete Backfiller") + .addInfo("Controller Block for the " + aStructureName) + .addInfo("Will fill in areas below it with light concrete. This goes through walls") + .addInfo("Use it to remove any spawning locations beneath your base to reduce lag") + .addInfo("Will pull back the pipes after it finishes that layer") + .addInfo("Radius is " + getRadius() + " blocks") + .addSeparator() + .beginStructureBlock(3, 7, 3, false) + .addController("Front bottom") + .addOtherStructurePart(casings, "form the 3x1x3 Base") + .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") + .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") + .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1) + .addMaintenanceHatch("Any base casing", 1) + .addInputBus("Mining Pipes, optional, any base casing", 1) + .addInputHatch("GT Concrete, any base casing", 1) + .addOutputBus("Mining Pipes, optional, any base casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + protected abstract int getRadius(); + + @Override + protected boolean checkHatches() { + return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() && mEnergyHatches.size() == 1; + } + + @Override + protected List> getAllowedHatches() { + return ImmutableList.of(InputHatch, InputBus, Maintenance, Energy); + } + + @Override + protected void setElectricityStats() { + this.mEfficiency = getCurrentEfficiency(null); + this.mEfficiencyIncrease = 10000; + int tier = Math.max(1, GTUtility.getTier(getMaxInputVoltage())); + this.mEUt = -6 * (1 << (tier << 1)); + this.mMaxProgresstime = (workState == STATE_UPWARD ? 240 : 80) / (1 << tier); + this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime); + } + + @Override + protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + if (isRefillableBlock(xPipe, yHead - 1, zPipe)) return tryRefillBlock(xPipe, yHead - 1, zPipe); + int radius = getRadius(); + if (mLastXOff == 0 && mLastZOff == 0) { + mLastXOff = -radius; + mLastZOff = -radius; + } + if (yHead != yDrill) { + for (int i = mLastXOff; i <= radius; i++) { + for (int j = (i == mLastXOff ? mLastZOff : -radius); j <= radius; j++) { + if (isRefillableBlock(xPipe + i, yHead, zPipe + j)) { + mLastXOff = i; + mLastZOff = j; + return tryRefillBlock(xPipe + i, yHead, zPipe + j); + } + } + } + } + + if (tryPickPipe()) { + mLastXOff = 0; + mLastZOff = 0; + return true; + } else { + workState = STATE_DOWNWARD; + stopMachine(ShutDownReasonRegistry.NONE); + setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.backfiller_finished")); + return false; + } + } + + private boolean isRefillableBlock(int aX, int aY, int aZ) { + IGregTechTileEntity aBaseTile = getBaseMetaTileEntity(); + Block aBlock = aBaseTile.getBlock(aX, aY, aZ); + if (!aBlock.isAir(aBaseTile.getWorld(), aX, aY, aZ)) { + if (mLiquidEnabled) { + if (!isFluid(aBlock)) { + return false; + } + } else { + return false; + } + } + if (aBlock.getMaterial() + .isSolid()) { + return false; + } + return GTUtility + .setBlockByFakePlayer(getFakePlayer(aBaseTile), aX, aY, aZ, GregTechAPI.sBlockConcretes, 8, true); + } + + private boolean tryRefillBlock(int aX, int aY, int aZ) { + if (!tryConsumeFluid()) { + setRuntimeFailureReason(CheckRecipeResultRegistry.BACKFILLER_NO_CONCRETE); + return false; + } + getBaseMetaTileEntity().getWorld() + .setBlock(aX, aY, aZ, GregTechAPI.sBlockConcretes, 8, 3); + return true; + } + + private boolean tryConsumeFluid() { + if (!depleteInput(Materials.Concrete.getMolten(144L))) { + mMaxProgresstime = 0; + return false; + } + return true; + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + super.drawTexts(screenElements, inventorySlot); + screenElements + .widget( + TextWidget + .dynamicString( + () -> StatCollector.translateToLocalFormatted( + "GT5U.gui.text.backfiller_current_area", + numberFormat.format(clientYHead))) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_UPWARD)) + .widget(new FakeSyncWidget.IntegerSyncer(this::getYHead, newInt -> clientYHead = newInt)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, newInt -> workState = newInt)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + final int BUTTON_Y_LEVEL = 91; + + builder.widget( + new LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) + .setOnClick((clickData, widget) -> mLiquidEnabled = !mLiquidEnabled) + .setPlayClickSound(true) + .setBackground(() -> { + if (mLiquidEnabled) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_LIQUIDMODE }; + } + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_LIQUIDMODE_OFF }; + }) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> mLiquidEnabled, newBoolean -> mLiquidEnabled = newBoolean), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .dynamicTooltip( + () -> ImmutableList.of( + StatCollector.translateToLocal( + mLiquidEnabled ? "GT5U.gui.button.liquid_filling_ON" + : "GT5U.gui.button.liquid_filling_OFF"))) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(new Pos2d(100, BUTTON_Y_LEVEL)) + .setSize(16, 16)); + int left = 98; + for (ButtonWidget button : getAdditionalButtons(builder, buildContext)) { + button.setPos(new Pos2d(left, BUTTON_Y_LEVEL)) + .setSize(16, 16); + builder.widget(button); + left += 18; + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEDieselEngine.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDieselEngine.java new file mode 100644 index 0000000000..1465e6ba31 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDieselEngine.java @@ -0,0 +1,415 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Dynamo; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchDynamo; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.recipe.maps.FuelBackend; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEDieselEngine extends MTEEnhancedMultiBlockBase implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { + + @Override + protected IStructureDefinition computeValue(Class type) { + return StructureDefinition.builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { "---", "iii", "chc", "chc", "ccc", }, { "---", "i~i", "hgh", "hgh", "cdc", }, + { "---", "iii", "chc", "chc", "ccc", }, })) + .addElement('i', lazy(t -> ofBlock(t.getIntakeBlock(), t.getIntakeMeta()))) + .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta()))) + .addElement('g', lazy(t -> ofBlock(t.getGearboxBlock(), t.getGearboxMeta()))) + .addElement('d', lazy(t -> Dynamo.newAny(t.getCasingTextureIndex(), 2))) + .addElement( + 'h', + lazy( + t -> buildHatchAdder(MTEDieselEngine.class) + .atLeast(InputHatch, InputHatch, InputHatch, Muffler, Maintenance) + .casingIndex(t.getCasingTextureIndex()) + .dot(1) + .buildAndChain(t.getCasingBlock(), t.getCasingMeta()))) + .build(); + } + }; + protected int fuelConsumption = 0; + protected int fuelValue = 0; + protected int fuelRemaining = 0; + protected boolean boostEu = false; + + public MTEDieselEngine(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEDieselEngine(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Combustion Generator") + .addInfo("Controller block for the Large Combustion Engine") + .addInfo("Supply Diesel Fuels and 1000L of Lubricant per hour to run") + .addInfo("Supply 40L/s of Oxygen to boost output (optional)") + .addInfo("Default: Produces 2048EU/t at 100% fuel efficiency") + .addInfo("Boosted: Produces 6144EU/t at 150% fuel efficiency") + .addInfo("You need to wait for it to reach 300% to output full power") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 3, 4, false) + .addController("Front center") + .addCasingInfoRange("Stable Titanium Machine Casing", 16, 22, false) + .addOtherStructurePart("Titanium Gear Box Machine Casing", "Inner 2 blocks") + .addOtherStructurePart("Engine Intake Machine Casing", "8x, ring around controller") + .addStructureInfo("Engine Intake Casings must not be obstructed in front (only air blocks)") + .addDynamoHatch("Back center", 2) + .addMaintenanceHatch("One of the casings next to a Gear Box", 1) + .addMufflerHatch("Top middle back, above the rear Gear Box", 1) + .addInputHatch("Diesel Fuel, next to a Gear Box", 1) + .addInputHatch("Lubricant, next to a Gear Box", 1) + .addInputHatch("Oxygen, optional, next to a Gear Box", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { casingTexturePages[0][50], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][50], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DIESEL_ENGINE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { casingTexturePages[0][50] }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return getMaxEfficiency(aStack) > 0; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.dieselFuels; + } + + @Override + protected boolean filtersFluid() { + return false; + } + + /** + * The nominal energy output This can be further multiplied by {@link #getMaxEfficiency(ItemStack)} when boosted + */ + protected int getNominalOutput() { + return 2048; + } + + protected Materials getBooster() { + return Materials.Oxygen; + } + + /** + * x times fuel will be consumed when boosted This will however NOT increase power output Go tweak + * {@link #getMaxEfficiency(ItemStack)} and {@link #getNominalOutput()} instead + */ + protected int getBoostFactor() { + return 2; + } + + /** + * x times of additive will be consumed when boosted + */ + protected int getAdditiveFactor() { + return 1; + } + + /** + * Efficiency will increase by this amount every tick + */ + protected int getEfficiencyIncrease() { + return 15; + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + ArrayList tFluids = getStoredFluids(); + + // fast track lookup + if (!tFluids.isEmpty()) { + double boostedFuelValue = 0; + double boostedOutput = 0; + double extraFuelFraction = 0; + for (FluidStack tFluid : tFluids) { + GTRecipe tRecipe = getRecipeMap().getBackend() + .findFuel(tFluid); + if (tRecipe == null) continue; + fuelValue = tRecipe.mSpecialValue; + + FluidStack tLiquid = tFluid.copy(); + if (boostEu) { + boostedFuelValue = GTUtility.safeInt((long) (fuelValue * 1.5)); + boostedOutput = getNominalOutput() * 3; + + fuelConsumption = tLiquid.amount = getBoostFactor() * getNominalOutput() / fuelValue; + + // HOG consumption rate is normally 1 L/t, when it's supposed to be around 1.64 L/t + // This code increases fuel consumption by 1 at random, but with a weighted chance + if (boostedFuelValue * 2 > boostedOutput) { + extraFuelFraction = boostedOutput / boostedFuelValue; + extraFuelFraction = extraFuelFraction - (int) extraFuelFraction; + double rand = Math.random(); + if (rand < extraFuelFraction) { + tLiquid.amount += 1; + } + } + + } else { + fuelConsumption = tLiquid.amount = getNominalOutput() / fuelValue; + } + + // Deplete that amount + if (!depleteInput(tLiquid)) return CheckRecipeResultRegistry.NO_FUEL_FOUND; + boostEu = depleteInput(getBooster().getGas(2L * getAdditiveFactor())); + + // Check to prevent burning HOG without consuming it, if not boosted + if (!boostEu && fuelValue > getNominalOutput()) { + return SimpleCheckRecipeResult.ofFailure("fuel_quality_too_high"); + } + + // Deplete Lubricant. 1000L should = 1 hour of runtime (if baseEU = 2048) + if ((mRuntime % 72 == 0 || mRuntime == 0) + && !depleteInput(Materials.Lubricant.getFluid((boostEu ? 2L : 1L) * getAdditiveFactor()))) + return SimpleCheckRecipeResult.ofFailure("no_lubricant"); + + fuelRemaining = tFluid.amount; // Record available fuel + this.mEUt = mEfficiency < 2000 ? 0 : getNominalOutput(); // Output 0 if startup is less than 20% + this.mProgresstime = 1; + this.mMaxProgresstime = 1; + this.mEfficiencyIncrease = getEfficiencyIncrease(); + return CheckRecipeResultRegistry.GENERATING; + } + } + this.mEUt = 0; + this.mEfficiency = 0; + return CheckRecipeResultRegistry.NO_FUEL_FOUND; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION.get(getClass()); + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 1) && !mMufflerHatches.isEmpty() + && mMaintenanceHatches.size() == 1; + } + + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + public byte getCasingMeta() { + return 2; + } + + public Block getIntakeBlock() { + return GregTechAPI.sBlockCasings4; + } + + public byte getIntakeMeta() { + return 13; + } + + public Block getGearboxBlock() { + return GregTechAPI.sBlockCasings2; + } + + public byte getGearboxMeta() { + return 4; + } + + public byte getCasingTextureIndex() { + return 50; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEDieselEngine(this.mName); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 1; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return boostEu ? 30000 : 10000; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return true; + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + } + + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatchDynamo tHatch : filterValidMTEs(mDynamoHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { EnumChatFormatting.BLUE + "Diesel Engine" + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + getIdealStatus() == getRepairStatus() + ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") + + EnumChatFormatting.RESET + : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.engine.output") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(((long) mEUt * mEfficiency / 10000)) + + EnumChatFormatting.RESET + + " EU/t", + StatCollector.translateToLocal("GT5U.engine.consumption") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(fuelConsumption) + + EnumChatFormatting.RESET + + " L/t", + StatCollector.translateToLocal("GT5U.engine.value") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(fuelValue) + + EnumChatFormatting.RESET + + " EU/L", + StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " + + EnumChatFormatting.GOLD + + GTUtility.formatNumbers(fuelRemaining) + + EnumChatFormatting.RESET + + " L", + StatCollector.translateToLocal("GT5U.engine.efficiency") + ": " + + EnumChatFormatting.YELLOW + + (mEfficiency / 100F) + + EnumChatFormatting.YELLOW + + " %", + StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" }; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 1, 1); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 1, elementBudget, env, false, true); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEDistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDistillationTower.java new file mode 100644 index 0000000000..9e89ad1a22 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDistillationTower.java @@ -0,0 +1,360 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofHatchAdder; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.fluid.IFluidStore; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.tileentities.machines.MTEHatchOutputME; + +public class MTEDistillationTower extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable { + + protected static final int CASING_INDEX = 49; + protected static final String STRUCTURE_PIECE_BASE = "base"; + protected static final String STRUCTURE_PIECE_LAYER = "layer"; + protected static final String STRUCTURE_PIECE_LAYER_HINT = "layerHint"; + protected static final String STRUCTURE_PIECE_TOP_HINT = "topHint"; + private static final IStructureDefinition STRUCTURE_DEFINITION; + + static { + IHatchElement layeredOutputHatch = OutputHatch + .withCount(MTEDistillationTower::getCurrentLayerOutputHatchCount) + .withAdder(MTEDistillationTower::addLayerOutputHatch); + STRUCTURE_DEFINITION = StructureDefinition.builder() + .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" }, })) + .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "lll", "lcl", "lll" }, })) + .addShape(STRUCTURE_PIECE_LAYER_HINT, transpose(new String[][] { { "lll", "l-l", "lll" }, })) + .addShape(STRUCTURE_PIECE_TOP_HINT, transpose(new String[][] { { "LLL", "LLL", "LLL" }, })) + .addElement( + 'b', + ofChain( + buildHatchAdder(MTEDistillationTower.class) + .atLeast(Energy, OutputBus, InputHatch, InputBus, Maintenance) + .casingIndex(CASING_INDEX) + .dot(1) + .build(), + onElementPass(MTEDistillationTower::onCasingFound, ofBlock(GregTechAPI.sBlockCasings4, 1)))) + .addElement( + 'l', + ofChain( + buildHatchAdder(MTEDistillationTower.class).atLeast(layeredOutputHatch) + .casingIndex(CASING_INDEX) + .dot(2) + .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN) + .build(), + ofHatchAdder(MTEDistillationTower::addEnergyInputToMachineList, CASING_INDEX, 2), + ofHatchAdder(MTEDistillationTower::addLayerOutputHatch, CASING_INDEX, 2), + ofHatchAdder(MTEDistillationTower::addMaintenanceToMachineList, CASING_INDEX, 2), + onElementPass(MTEDistillationTower::onCasingFound, ofBlock(GregTechAPI.sBlockCasings4, 1)))) + // hint element only used in top layer + .addElement( + 'L', + buildHatchAdder(MTEDistillationTower.class).atLeast(layeredOutputHatch) + .casingIndex(CASING_INDEX) + .dot(2) + .disallowOnly(ForgeDirection.UP) + .buildAndChain(GregTechAPI.sBlockCasings4, 1)) + .addElement( + 'c', + ofChain( + onElementPass( + t -> t.onTopLayerFound(false), + ofHatchAdder(MTEDistillationTower::addOutputToMachineList, CASING_INDEX, 3)), + onElementPass( + t -> t.onTopLayerFound(false), + ofHatchAdder(MTEDistillationTower::addMaintenanceToMachineList, CASING_INDEX, 3)), + onElementPass(t -> t.onTopLayerFound(true), ofBlock(GregTechAPI.sBlockCasings4, 1)), + isAir())) + .build(); + } + + protected final List> mOutputHatchesByLayer = new ArrayList<>(); + protected int mHeight; + protected int mCasing; + protected boolean mTopLayerFound; + + public MTEDistillationTower(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEDistillationTower(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEDistillationTower(this.mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Distillery") + .addInfo("Controller block for the Distillation Tower") + .addInfo("Fluids are only put out at the correct height") + .addInfo("The correct height equals the slot number in the NEI recipe") + .addSeparator() + .beginVariableStructureBlock(3, 3, 3, 12, 3, 3, true) + .addController("Front bottom") + .addOtherStructurePart("Clean Stainless Steel Machine Casing", "7 x h - 5 (minimum)") + .addEnergyHatch("Any casing except top centre", 1, 2) + .addMaintenanceHatch("Any casing", 1, 2, 3) + .addInputHatch("Any bottom layer casing", 1) + .addOutputBus("Any bottom layer casing", 1) + .addOutputHatch("2-11x Output Hatches (At least one per layer except bottom layer)", 2, 3) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { BlockIcons.getCasingTextureForId(CASING_INDEX), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { BlockIcons.getCasingTextureForId(CASING_INDEX), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX) }; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.distillationTowerRecipes; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic(); + } + + protected void onCasingFound() { + mCasing++; + } + + protected void onTopLayerFound(boolean aIsCasing) { + mTopLayerFound = true; + if (aIsCasing) onCasingFound(); + } + + protected int getCurrentLayerOutputHatchCount() { + return mOutputHatchesByLayer.size() < mHeight || mHeight <= 0 ? 0 + : mOutputHatchesByLayer.get(mHeight - 1) + .size(); + } + + protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null || aTileEntity.isDead() + || !(aTileEntity.getMetaTileEntity() instanceof MTEHatchOutput tHatch)) return false; + while (mOutputHatchesByLayer.size() < mHeight) mOutputHatchesByLayer.add(new ArrayList<>()); + tHatch.updateTexture(aBaseCasingIndex); + return mOutputHatchesByLayer.get(mHeight - 1) + .add(tHatch); + } + + @Override + public List getFluidOutputSlots(FluidStack[] toOutput) { + return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer); + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + // don't rotate a freaking tower, it won't work + return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() + && !f.isVerticallyFliped(); + } + + @Override + public boolean isRotationChangeAllowed() { + return false; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + // reset + mOutputHatchesByLayer.forEach(List::clear); + mHeight = 1; + mTopLayerFound = false; + mCasing = 0; + + // check base + if (!checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0)) return false; + + // check each layer + while (mHeight < 12) { + if (!checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0)) { + return false; + } + if (mOutputHatchesByLayer.size() < mHeight || mOutputHatchesByLayer.get(mHeight - 1) + .isEmpty()) + // layer without output hatch + return false; + if (mTopLayerFound) { + break; + } + // not top + mHeight++; + } + + // validate final invariants... (actual height is mHeight+1) + return mCasing >= 7 * (mHeight + 1) - 5 && mHeight + 1 >= 3 + && mTopLayerFound + && mMaintenanceHatches.size() == 1; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + protected void addFluidOutputs(FluidStack[] mOutputFluids2) { + for (int i = 0; i < mOutputFluids2.length && i < mOutputHatchesByLayer.size(); i++) { + final FluidStack fluidStack = mOutputFluids2[i]; + if (fluidStack == null) continue; + FluidStack tStack = fluidStack.copy(); + if (!dumpFluid(mOutputHatchesByLayer.get(i), tStack, true)) + dumpFluid(mOutputHatchesByLayer.get(i), tStack, false); + } + } + + @Override + public boolean canDumpFluidToME() { + // All fluids can be dumped to ME only if each layer contains a ME Output Hatch. + return this.mOutputHatchesByLayer.stream() + .allMatch( + tLayerOutputHatches -> tLayerOutputHatches.stream() + .anyMatch(tHatch -> (tHatch instanceof MTEHatchOutputME tMEHatch) && (tMEHatch.canAcceptFluid()))); + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 1, 0, 0); + int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height + for (int i = 1; i < tTotalHeight - 1; i++) { + buildPiece(STRUCTURE_PIECE_LAYER_HINT, stackSize, hintsOnly, 1, i, 0); + } + buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 1, tTotalHeight - 1, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + mHeight = 0; + int built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 1, 0, 0, elementBudget, env, false, true); + if (built >= 0) return built; + int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height + for (int i = 1; i < tTotalHeight - 1; i++) { + mHeight = i; + built = survivialBuildPiece( + STRUCTURE_PIECE_LAYER_HINT, + stackSize, + 1, + i, + 0, + elementBudget, + env, + false, + true); + if (built >= 0) return built; + } + mHeight = tTotalHeight - 1; + return survivialBuildPiece( + STRUCTURE_PIECE_TOP_HINT, + stackSize, + 1, + tTotalHeight - 1, + 0, + elementBudget, + env, + false, + true); + } + + @Override + protected SoundResource getProcessStartSound() { + return SoundResource.GT_MACHINES_DISTILLERY_LOOP; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java new file mode 100644 index 0000000000..131a1a3166 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java @@ -0,0 +1,951 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.W; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.widgets.LockedWhileActiveButton; +import gregtech.api.interfaces.IChunkLoader; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchDataAccess; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; +import gregtech.api.objects.GTChunkManager; +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.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.IGTHatchAdder; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; + +public abstract class MTEDrillerBase extends MTEEnhancedMultiBlockBase + implements IChunkLoader, ISurvivalConstructable { + + private static final ItemStack miningPipe = GTModHandler.getIC2Item("miningPipe", 0); + private static final ItemStack miningPipeTip = GTModHandler.getIC2Item("miningPipeTip", 0); + private static final Block miningPipeBlock = GTUtility.getBlockFromStack(miningPipe); + private static final Block miningPipeTipBlock = GTUtility.getBlockFromStack(miningPipeTip); + protected static final String STRUCTURE_PIECE_MAIN = "main"; + protected static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { + + @Override + protected IStructureDefinition computeValue(Class type) { + return StructureDefinition.builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { " ", " f ", " " }, { " ", " f ", " " }, { " ", " f ", " " }, + { " f ", "fcf", " f " }, { " f ", "fcf", " f " }, { " f ", "fcf", " f " }, + { "b~b", "bbb", "bbb" }, })) + .addElement('f', lazy(t -> ofFrame(t.getFrameMaterial()))) + .addElement( + 'c', + lazy( + t -> ofBlock( + t.getCasingBlockItem() + .getBlock(), + t.getCasingBlockItem() + .get(0) + .getItemDamage()))) + .addElement( + 'b', + lazy( + t -> buildHatchAdder(MTEDrillerBase.class).atLeastList(t.getAllowedHatches()) + .adder(MTEDrillerBase::addToMachineList) + .casingIndex(t.casingTextureIndex) + .dot(1) + .buildAndChain( + t.getCasingBlockItem() + .getBlock(), + t.getCasingBlockItem() + .get(0) + .getItemDamage()))) + .build(); + } + }; + + private Block casingBlock; + private int casingMeta; + private int frameMeta; + protected int casingTextureIndex; + protected boolean isPickingPipes; + + private ForgeDirection back; + + private int xDrill, yDrill, zDrill, xPipe, zPipe, yHead; + + protected int getXDrill() { + return xDrill; + } + + protected int getZDrill() { + return zDrill; + } + + protected int getYHead() { + return yHead; + } + + protected int workState; + protected static final int STATE_DOWNWARD = 0, STATE_AT_BOTTOM = 1, STATE_UPWARD = 2, STATE_ABORT = 3; + + protected boolean mChunkLoadingEnabled = true; + protected ChunkCoordIntPair mCurrentChunk = null; + protected boolean mWorkChunkNeedsReload = true; + + /** Stores default result messages for success/failures of each work state. */ + private final Map resultRegistry = new HashMap<>(); + + /** Allows inheritors to supply custom runtime failure messages. */ + private CheckRecipeResult runtimeFailure = null; + private CheckRecipeResult lastRuntimeFailure = null; + + /** Allows inheritors to supply custom shutdown failure messages. */ + private @NotNull String shutdownReason = ""; + + /** Allows inheritors to suppress wiping the last error if the machine is forcibly turned off. */ + protected boolean suppressErrorWipe = false; + + public MTEDrillerBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + initFields(); + } + + public MTEDrillerBase(String aName) { + super(aName); + initFields(); + } + + private void initFields() { + casingBlock = getCasingBlockItem().getBlock(); + casingMeta = getCasingBlockItem().get(0) + .getItemDamage(); + int frameId = 4096 + getFrameMaterial().mMetaItemSubID; + frameMeta = GregTechAPI.METATILEENTITIES[frameId] != null + ? GregTechAPI.METATILEENTITIES[frameId].getTileEntityBaseType() + : W; + casingTextureIndex = getCasingTextureIndex(); + workState = STATE_DOWNWARD; + + // Inheritors can overwrite these to add custom operating messages. + addResultMessage(STATE_DOWNWARD, true, "deploying_pipe"); + addResultMessage(STATE_DOWNWARD, false, "extracting_pipe"); + addResultMessage(STATE_AT_BOTTOM, true, "drilling"); + addResultMessage(STATE_AT_BOTTOM, false, "no_mining_pipe"); + addResultMessage(STATE_UPWARD, true, "retracting_pipe"); + addResultMessage(STATE_UPWARD, false, "drill_generic_finished"); + addResultMessage(STATE_ABORT, true, "retracting_pipe"); + addResultMessage(STATE_ABORT, false, "drill_retract_pipes_finished"); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ORE_DRILL_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ORE_DRILL) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ORE_DRILL_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { getCasingTextureForId(casingTextureIndex) }; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("workState", workState); + aNBT.setBoolean("chunkLoadingEnabled", mChunkLoadingEnabled); + aNBT.setBoolean("isChunkloading", mCurrentChunk != null); + if (mCurrentChunk != null) { + aNBT.setInteger("loadedChunkXPos", mCurrentChunk.chunkXPos); + aNBT.setInteger("loadedChunkZPos", mCurrentChunk.chunkZPos); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + workState = aNBT.getInteger("workState"); + if (aNBT.hasKey("isPickingPipes")) + workState = aNBT.getBoolean("isPickingPipes") ? STATE_UPWARD : STATE_DOWNWARD; + if (aNBT.hasKey("chunkLoadingEnabled")) mChunkLoadingEnabled = aNBT.getBoolean("chunkLoadingEnabled"); + if (aNBT.getBoolean("isChunkloading")) { + mCurrentChunk = new ChunkCoordIntPair( + aNBT.getInteger("loadedChunkXPos"), + aNBT.getInteger("loadedChunkZPos")); + } + } + + @Override + public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, + EntityPlayer entityPlayer, float aX, float aY, float aZ) { + if (side == getBaseMetaTileEntity().getFrontFacing()) { + mChunkLoadingEnabled = !mChunkLoadingEnabled; + GTUtility.sendChatToPlayer( + entityPlayer, + mChunkLoadingEnabled ? GTUtility.trans("502", "Mining chunk loading enabled") + : GTUtility.trans("503", "Mining chunk loading disabled")); + return true; + } + return super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ); + } + + @Override + public void onRemoval() { + if (mChunkLoadingEnabled) GTChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity()); + super.onRemoval(); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide() && mCurrentChunk != null + && !mWorkChunkNeedsReload + && !aBaseMetaTileEntity.isAllowedToWork()) { + // if machine has stopped, stop chunkloading + GTChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity); + mWorkChunkNeedsReload = true; + } + } + + protected boolean tryPickPipe() { + if (yHead == yDrill) return isPickingPipes = false; + if (tryOutputPipe()) { + if (checkBlockAndMeta(xPipe, yHead + 1, zPipe, miningPipeBlock, W)) getBaseMetaTileEntity().getWorld() + .setBlock(xPipe, yHead + 1, zPipe, miningPipeTipBlock); + getBaseMetaTileEntity().getWorld() + .setBlockToAir(xPipe, yHead, zPipe); + return isPickingPipes = true; + } + return isPickingPipes = false; + } + + /** + * @return 0 for succeeded, 1 for invalid block, 2 for not having mining pipes, 3 for event canceled. + */ + protected int tryLowerPipeState() { + return tryLowerPipeState(false); + } + + /** + * @return 0 for succeeded, 1 for invalid block, 2 for not having mining pipes, 3 for event canceled. + */ + protected int tryLowerPipeState(boolean isSimulating) { + if (!isHasMiningPipes()) return 2; + switch (canLowerPipe()) { + case 1 -> { + return 1; + } + case 2 -> { + return 3; + } + } + + Block b = getBaseMetaTileEntity().getBlock(xPipe, yHead - 1, zPipe); + if (b != miningPipeTipBlock && !GTUtility.setBlockByFakePlayer( + getFakePlayer(getBaseMetaTileEntity()), + xPipe, + yHead - 1, + zPipe, + miningPipeTipBlock, + 0, + isSimulating)) return 3; + if (!isSimulating) { + if (yHead != yDrill) getBaseMetaTileEntity().getWorld() + .setBlock(xPipe, yHead, zPipe, miningPipeBlock); + if (b != miningPipeBlock && b != miningPipeTipBlock) getBaseMetaTileEntity().decrStackSize(1, 1); + } + + return 0; + } + + private void putMiningPipesFromInputsInController() { + int maxPipes = miningPipe.getMaxStackSize(); + if (isHasMiningPipes(maxPipes)) return; + + ItemStack pipes = getStackInSlot(1); + if (pipes != null && !pipes.isItemEqual(miningPipe)) return; + for (ItemStack storedItem : getStoredInputs()) { + if (!storedItem.isItemEqual(miningPipe)) continue; + + if (pipes == null) { + setInventorySlotContents(1, GTUtility.copyOrNull(miningPipe)); + pipes = getStackInSlot(1); + } + + if (pipes.stackSize == maxPipes) break; + + int needPipes = maxPipes - pipes.stackSize; + int transferPipes = Math.min(storedItem.stackSize, needPipes); + + pipes.stackSize += transferPipes; + storedItem.stackSize -= transferPipes; + } + updateSlots(); + } + + private boolean tryOutputPipe() { + if (!getBaseMetaTileEntity().addStackToSlot(1, GTUtility.copyAmount(1, miningPipe))) + mOutputItems = new ItemStack[] { GTUtility.copyAmount(1, miningPipe) }; + return true; + } + + /** + * @return 0 for available, 1 for invalid block, 2 for event canceled. + */ + protected int canLowerPipe() { + IGregTechTileEntity aBaseTile = getBaseMetaTileEntity(); + if (yHead > 0 && GTUtility.getBlockHardnessAt(aBaseTile.getWorld(), xPipe, yHead - 1, zPipe) >= 0) { + return GTUtility.eraseBlockByFakePlayer(getFakePlayer(aBaseTile), xPipe, yHead - 1, zPipe, true) ? 0 : 2; + } + return 1; + } + + protected boolean reachingVoidOrBedrock() { + return yHead <= 0 || checkBlockAndMeta(xPipe, yHead - 1, zPipe, Blocks.bedrock, W); + } + + private boolean isHasMiningPipes() { + return isHasMiningPipes(1); + } + + private boolean isHasMiningPipes(int minCount) { + ItemStack pipe = getStackInSlot(1); + return pipe != null && pipe.stackSize > minCount - 1 && pipe.isItemEqual(miningPipe); + } + + /** + * @deprecated Readded for compability + * @return if no pipes are present + */ + @Deprecated + protected boolean waitForPipes() { + return !isHasMiningPipes(); + } + + private boolean isEnergyEnough() { + long requiredEnergy = 512 + getMaxInputVoltage() * 4; + for (MTEHatchEnergy energyHatch : mEnergyHatches) { + requiredEnergy -= energyHatch.getEUVar(); + if (requiredEnergy <= 0) return true; + } + return false; + } + + protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + switch (tryLowerPipeState()) { + case 2 -> { + mMaxProgresstime = 0; + setRuntimeFailureReason(CheckRecipeResultRegistry.MISSING_MINING_PIPE); + return false; + } + case 3 -> { + workState = STATE_UPWARD; + return true; + } + case 1 -> { + workState = STATE_AT_BOTTOM; + return true; + } + default -> { + return true; + } + } + } + + protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + if (tryLowerPipeState(true) == 0) { + workState = STATE_DOWNWARD; + return true; + } + workState = STATE_UPWARD; + return true; + } + + protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + if (tryPickPipe()) { + return true; + } else { + workState = STATE_DOWNWARD; + stopMachine(ShutDownReasonRegistry.NONE); + return false; + } + } + + /** Called once when the abort button is clicked. Use to perform any needed cleanup (e.g. unloading chunks.) */ + protected void onAbort() {} + + protected void abortDrilling() { + if (workState != STATE_ABORT) { + workState = STATE_ABORT; + onAbort(); + setShutdownReason(""); + + if (!isAllowedToWork()) { + enableWorking(); + } + } + } + + // This is a distinct state from workingUpward, because some inheritors (like concrete backfiller) operate + // exclusively on the workingUpward phase. It also allows for more distinct status messages. + protected boolean workingToAbortOperation(@NotNull ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, + int zPipe, int yHead, int oldYHead) { + if (tryPickPipe()) { + return true; + } else { + workState = STATE_DOWNWARD; + stopMachine(ShutDownReasonRegistry.NONE); + return false; + } + } + + @Override + public void enableWorking() { + super.enableWorking(); + shutdownReason = ""; + } + + @Override + public void onDisableWorking() { + if (suppressErrorWipe) { + suppressErrorWipe = false; + } else { + super.onDisableWorking(); + } + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + ItemStack controllerStack = getControllerSlot(); + // Public pipe actions + setElectricityStats(); + int oldYHead = yHead; + if (!checkPipesAndSetYHead()) { + stopMachine(ShutDownReasonRegistry.NONE); + return SimpleCheckRecipeResult.ofFailure("no_mining_pipe"); + } else if (!isEnergyEnough()) { + stopMachine(ShutDownReasonRegistry.NONE); + return SimpleCheckRecipeResult.ofFailure("not_enough_energy"); + } + putMiningPipesFromInputsInController(); + + final boolean wasSuccessful; + switch (workState) { + case STATE_DOWNWARD -> wasSuccessful = workingDownward( + controllerStack, + xDrill, + yDrill, + zDrill, + xPipe, + zPipe, + yHead, + oldYHead); + case STATE_AT_BOTTOM -> wasSuccessful = workingAtBottom( + controllerStack, + xDrill, + yDrill, + zDrill, + xPipe, + zPipe, + yHead, + oldYHead); + case STATE_UPWARD -> wasSuccessful = workingUpward( + controllerStack, + xDrill, + yDrill, + zDrill, + xPipe, + zPipe, + yHead, + oldYHead); + case STATE_ABORT -> wasSuccessful = workingToAbortOperation( + controllerStack, + xDrill, + yDrill, + zDrill, + xPipe, + zPipe, + yHead, + oldYHead); + default -> wasSuccessful = false; + } + + if (runtimeFailure == null) { + if (wasSuccessful) { + lastRuntimeFailure = null; + } + + return resultRegistry.getOrDefault( + new ResultRegistryKey(workState, wasSuccessful), + SimpleCheckRecipeResult.ofFailure("no_mining_pipe")); + } else { + final CheckRecipeResult result; + result = lastRuntimeFailure = runtimeFailure; + runtimeFailure = null; + return result; + } + } + + /** + * Allow drills to set a specific failure reason specific to their situation. E.g.: out of drilling fluid. + * Should be used when the machine doesn't turn off due to the failure. + * + * @param newFailureReason A new failure reason + */ + protected void setRuntimeFailureReason(@NotNull CheckRecipeResult newFailureReason) { + runtimeFailure = newFailureReason; + } + + /** + * Gets a reason for why the drill turned off, for use in UIs and such. + * + * @return A reason, or empty if the machine is active or there is no message set yet. + */ + @NotNull + protected Optional getFailureReason() { + if (getBaseMetaTileEntity().isActive()) { + return Optional.empty(); + } + + if (!shutdownReason.isEmpty()) { + return Optional.of(shutdownReason); + } + + return Optional.ofNullable(lastRuntimeFailure) + .map(CheckRecipeResult::getDisplayString); + } + + /** + * Sets a line in the UI to explain why the drill shut down. E.g.: operation finished. + * Should be used when the machine has been turned off due to an operating issue or completion. + * + * @param newReason The reason for the machine shutdown + */ + protected void setShutdownReason(@NotNull String newReason) { + shutdownReason = newReason; + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() + && !f.isVerticallyFliped(); + } + + @Override + public boolean isRotationChangeAllowed() { + return false; + } + + @Override + public final IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION.get(getClass()); + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + updateCoordinates(); + return checkPiece(STRUCTURE_PIECE_MAIN, 1, 6, 0) && checkHatches() + && GTUtility.getTier(getMaxInputVoltage()) >= getMinTier() + && mMaintenanceHatches.size() == 1; + } + + private void updateCoordinates() { + xDrill = getBaseMetaTileEntity().getXCoord(); + yDrill = getBaseMetaTileEntity().getYCoord(); + zDrill = getBaseMetaTileEntity().getZCoord(); + back = getBaseMetaTileEntity().getBackFacing(); + xPipe = xDrill + back.offsetX; + zPipe = zDrill + back.offsetZ; + } + + private boolean checkPipesAndSetYHead() { + yHead = yDrill - 1; + while (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeBlock, W)) yHead--; // skip pipes + // is pipe tip OR is controller layer + if (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeTipBlock, W) || ++yHead == yDrill) return true; + // pipe column is broken - try fix + getBaseMetaTileEntity().getWorld() + .setBlock(xPipe, yHead, zPipe, miningPipeTipBlock); + return true; + } + + private boolean checkBlockAndMeta(int x, int y, int z, Block block, int meta) { + return (meta == W || getBaseMetaTileEntity().getMetaID(x, y, z) == meta) + && getBaseMetaTileEntity().getBlock(x, y, z) == block; + } + + private FakePlayer mFakePlayer = null; + + protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) { + if (mFakePlayer == null) mFakePlayer = GTUtility.getFakePlayer(aBaseTile); + mFakePlayer.setWorld(aBaseTile.getWorld()); + mFakePlayer.setPosition(aBaseTile.getXCoord(), aBaseTile.getYCoord(), aBaseTile.getZCoord()); + return mFakePlayer; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + protected abstract ItemList getCasingBlockItem(); + + protected abstract Materials getFrameMaterial(); + + protected abstract int getCasingTextureIndex(); + + protected abstract int getMinTier(); + + protected abstract boolean checkHatches(); + + protected abstract void setElectricityStats(); + + public int getTotalConfigValue() { + int config = 0; + ArrayList tCircuitList = getDataItems(1); + for (ItemStack tCircuit : tCircuitList) config += tCircuit.getItemDamage(); + return config; + } + + public ArrayList mDataAccessHatches = new ArrayList<>(); + + /** + * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb + */ + private boolean isCorrectDataItem(ItemStack aStack, int state) { + if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true; + if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true; + return (state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true); + } + + /** + * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb + */ + public ArrayList getDataItems(int state) { + ArrayList rList = new ArrayList<>(); + if (GTUtility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) { + rList.add(mInventory[1]); + } + for (MTEHatchDataAccess tHatch : filterValidMTEs(mDataAccessHatches)) { + for (int i = 0; i < tHatch.getBaseMetaTileEntity() + .getSizeInventory(); i++) { + if (tHatch.getBaseMetaTileEntity() + .getStackInSlot(i) != null && isCorrectDataItem( + tHatch.getBaseMetaTileEntity() + .getStackInSlot(i), + state)) + rList.add( + tHatch.getBaseMetaTileEntity() + .getStackInSlot(i)); + } + } + return rList; + } + + @Override + public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + return super.addToMachineList(aTileEntity, aBaseCasingIndex) + || addDataAccessToMachineList(aTileEntity, aBaseCasingIndex); + } + + public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchDataAccess) { + ((MTEHatch) aMetaTileEntity).updateTexture((byte) aBaseCasingIndex); + return mDataAccessHatches.add((MTEHatchDataAccess) aMetaTileEntity); + } + return false; + } + + @Override + public ChunkCoordIntPair getActiveChunk() { + return mCurrentChunk; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 6, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 6, 0, elementBudget, env, false, true); + } + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + super.drawTexts(screenElements, inventorySlot); + screenElements.widget( + TextWidget.dynamicString(() -> shutdownReason) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled(widget -> !(getBaseMetaTileEntity().isActive() || shutdownReason.isEmpty()))) + .widget(new FakeSyncWidget.StringSyncer(() -> shutdownReason, newString -> shutdownReason = newString)); + } + + @Override + protected boolean showRecipeTextInGUI() { + return false; + } + + /** + * Adds additional buttons to the main button row. You do not need to set the position. + * + * @param builder Only use to attach SyncWidgets. + * @param buildContext Context for things like the player. + */ + protected List getAdditionalButtons(ModularWindow.Builder builder, UIBuildContext buildContext) { + return ImmutableList.of(); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + final int BUTTON_Y_LEVEL = 91; + + builder.widget( + new LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) + .setOnClick((clickData, widget) -> mChunkLoadingEnabled = !mChunkLoadingEnabled) + .setPlayClickSound(true) + .setBackground(() -> { + if (mChunkLoadingEnabled) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_CHUNK_LOADING }; + } + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_CHUNK_LOADING_OFF }; + }) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer( + () -> mChunkLoadingEnabled, + newBoolean -> mChunkLoadingEnabled = newBoolean), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .dynamicTooltip( + () -> ImmutableList.of( + StatCollector.translateToLocal( + mChunkLoadingEnabled ? "GT5U.gui.button.chunk_loading_on" + : "GT5U.gui.button.chunk_loading_off"))) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(new Pos2d(80, BUTTON_Y_LEVEL)) + .setSize(16, 16)) + .widget( + new ButtonWidget().setOnClick((clickData, widget) -> abortDrilling()) + .setPlayClickSound(true) + .setBackground(() -> { + if (workState == STATE_ABORT) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_RETRACT_PIPE, GTUITextures.OVERLAY_BUTTON_LOCKED }; + } + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_RETRACT_PIPE }; + }) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> workState, (newInt) -> workState = newInt), + builder, + (widget, integer) -> widget.notifyTooltipChange()) + .dynamicTooltip( + () -> ImmutableList.of( + StatCollector.translateToLocalFormatted( + workState == STATE_ABORT ? "GT5U.gui.button.drill_retract_pipes_active" + : "GT5U.gui.button.drill_retract_pipes"))) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(new Pos2d(174, 112)) + .setSize(16, 16)); + + int left = 98; + for (ButtonWidget button : getAdditionalButtons(builder, buildContext)) { + button.setPos(new Pos2d(left, BUTTON_Y_LEVEL)) + .setSize(16, 16); + builder.widget(button); + left += 18; + } + } + + protected List> getAllowedHatches() { + return ImmutableList.of( + InputHatch, + OutputHatch, + InputBus, + OutputBus, + Muffler, + Maintenance, + Energy, + DataHatchElement.DataAccess); + } + + protected enum DataHatchElement implements IHatchElement { + + DataAccess; + + @Override + public List> mteClasses() { + return Collections.singletonList(MTEHatchDataAccess.class); + } + + @Override + public IGTHatchAdder adder() { + return MTEDrillerBase::addDataAccessToMachineList; + } + + @Override + public long count(MTEDrillerBase t) { + return t.mDataAccessHatches.size(); + } + } + + /** + * Sets or overrides the {@link CheckRecipeResult} for a given work state + * + * @param state A work state like {@link #STATE_DOWNWARD}. + * @param result A previously registered recipe result. + */ + protected void addResultMessage(final int state, @NotNull final CheckRecipeResult result) { + resultRegistry.put(new ResultRegistryKey(state, result.wasSuccessful()), result); + } + + /** + * Sets or overrides the {@link CheckRecipeResult} for a given work state and operation success type. + * + * @param state A work state like {@link #STATE_DOWNWARD}. + * @param wasSuccessful Whether the operation was successful. + * @param resultKey An I18N key for the message. + */ + protected void addResultMessage(final int state, final boolean wasSuccessful, @NotNull final String resultKey) { + addResultMessage( + state, + wasSuccessful ? SimpleCheckRecipeResult.ofSuccess(resultKey) + : SimpleCheckRecipeResult.ofFailure(resultKey)); + } + + @SuppressWarnings("ClassCanBeRecord") + private final static class ResultRegistryKey { + + private final int state; + private final boolean successful; + + public ResultRegistryKey(final int state, final boolean successful) { + this.state = state; + this.successful = successful; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof ResultRegistryKey other)) { + return false; + } + + return (state == other.state && successful == other.successful); + } + + @Override + public int hashCode() { + return Objects.hash(state, successful); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEElectricBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEElectricBlastFurnace.java new file mode 100644 index 0000000000..844c6408df --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEElectricBlastFurnace.java @@ -0,0 +1,397 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +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.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofCoil; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.fluid.IFluidStore; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +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.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; + +public class MTEElectricBlastFurnace extends MTEAbstractMultiFurnace + implements ISurvivalConstructable { + + private int mHeatingCapacity = 0; + protected final ArrayList mPollutionOutputHatches = new ArrayList<>(); + protected final FluidStack[] pollutionFluidStacks = { Materials.CarbonDioxide.getGas(1000), + Materials.CarbonMonoxide.getGas(1000), Materials.SulfurDioxide.getGas(1000) }; + + protected static final int CASING_INDEX = 11; + protected static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { "ttt", "tmt", "ttt" }, { "CCC", "C-C", "CCC" }, { "CCC", "C-C", "CCC" }, + { "b~b", "bbb", "bbb" } })) + .addElement( + 't', + buildHatchAdder(MTEElectricBlastFurnace.class) + .atLeast( + OutputHatch.withAdder(MTEElectricBlastFurnace::addOutputHatchToTopList) + .withCount(t -> t.mPollutionOutputHatches.size())) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain(GregTechAPI.sBlockCasings1, CASING_INDEX)) + .addElement('m', Muffler.newAny(CASING_INDEX, 2)) + .addElement('C', ofCoil(MTEElectricBlastFurnace::setCoilLevel, MTEElectricBlastFurnace::getCoilLevel)) + .addElement( + 'b', + buildHatchAdder(MTEElectricBlastFurnace.class) + .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain(GregTechAPI.sBlockCasings1, CASING_INDEX)) + .build(); + + public MTEElectricBlastFurnace(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEElectricBlastFurnace(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEElectricBlastFurnace(this.mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Blast Furnace") + .addInfo("Controller block for the Electric Blast Furnace") + .addInfo("You can use some fluids to reduce recipe time. Place the circuit in the Input Bus") + .addInfo("Each 900K over the min. Heat required reduces power consumption by 5% (multiplicatively)") + .addInfo("Each 1800K over the min. Heat allows for an overclock to be upgraded to a perfect overclock.") + .addInfo("That means the EBF will reduce recipe time by a factor 4 instead of 2 (giving 100% efficiency).") + .addInfo("Additionally gives +100K for every tier past MV") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 4, 3, true) + .addController("Front bottom") + .addCasingInfoRange("Heat Proof Machine Casing", 0, 15, false) + .addOtherStructurePart("Heating Coils", "Two middle Layers") + .addEnergyHatch("Any bottom layer casing", 3) + .addMaintenanceHatch("Any bottom layer casing", 3) + .addMufflerHatch("Top middle", 2) + .addInputBus("Any bottom layer casing", 3) + .addInputHatch("Any bottom layer casing", 3) + .addOutputBus("Any bottom layer casing", 3) + .addOutputHatch("Fluid outputs, Any bottom layer casing") + .addOutputHatch("Pollution gases (CO2/CO/SO2), Any top layer casing", 1) + .addStructureInfo("Pollution gas output amount scales with Muffler Hatch tier") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionEBFPerSecond; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.blastFurnaceRecipes; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @Nonnull + @Override + protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + return super.createOverclockCalculator(recipe).setRecipeHeat(recipe.mSpecialValue) + .setMachineHeat(mHeatingCapacity) + .setHeatOC(true) + .setHeatDiscount(true); + } + + @Override + protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + return recipe.mSpecialValue <= mHeatingCapacity ? CheckRecipeResultRegistry.SUCCESSFUL + : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); + } + }; + } + + public boolean addOutputHatchToTopList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchOutput) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mPollutionOutputHatches.add((MTEHatchOutput) aMetaTileEntity); + } + return false; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + this.mHeatingCapacity = 0; + + setCoilLevel(HeatingCoilLevel.None); + + mPollutionOutputHatches.clear(); + + if (!checkPiece(STRUCTURE_PIECE_MAIN, 1, 3, 0)) return false; + + if (getCoilLevel() == HeatingCoilLevel.None) return false; + + if (mMaintenanceHatches.size() != 1) return false; + + this.mHeatingCapacity = (int) getCoilLevel().getHeat() + 100 * (GTUtility.getTier(getMaxInputVoltage()) - 2); + return true; + } + + @Override + public boolean addOutput(FluidStack aLiquid) { + if (aLiquid == null) return false; + FluidStack tLiquid = aLiquid.copy(); + ArrayList tOutputHatches; + if (isPollutionFluid(tLiquid)) { + tOutputHatches = this.mPollutionOutputHatches; + multiplyPollutionFluidAmount(tLiquid); + } else { + tOutputHatches = this.mOutputHatches; + } + return dumpFluid(tOutputHatches, tLiquid, true) || dumpFluid(tOutputHatches, tLiquid, false); + } + + protected boolean isPollutionFluid(@Nullable FluidStack fluidStack) { + if (fluidStack == null) return false; + for (FluidStack pollutionFluidStack : pollutionFluidStacks) { + if (!fluidStack.isFluidEqual(pollutionFluidStack)) continue; + return true; + } + return false; + } + + @Override + public List getFluidOutputSlots(FluidStack[] toOutput) { + if (Arrays.stream(toOutput) + .anyMatch(this::isPollutionFluid)) { + return filterValidMTEs(mPollutionOutputHatches); + } + return filterValidMTEs(mOutputHatches); + } + + /** + * @return 100 -> all released to air, 0 -> all dumped to hatch + */ + public int getPollutionReduction() { + int reduction = 100; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + reduction = Math.min(tHatch.calculatePollutionReduction(100), reduction); + } + return reduction; + } + + protected void multiplyPollutionFluidAmount(@Nonnull FluidStack fluid) { + fluid.amount = fluid.amount * Math.min(100 - getPollutionReduction(), 100) / 100; + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = getPollutionReduction(); + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatchEnergy tHatch : filterValidMTEs(mEnergyHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { + StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(-lEUt) + + EnumChatFormatting.RESET + + " EU/t", + StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getMaxInputVoltage()) + + EnumChatFormatting.RESET + + " EU/t(*2A) " + + StatCollector.translateToLocal("GT5U.machines.tier") + + ": " + + EnumChatFormatting.YELLOW + + VN[GTUtility.getTier(getMaxInputVoltage())] + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.multiblock.efficiency") + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + StatCollector.translateToLocal("GT5U.EBF.heat") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mHeatingCapacity) + + EnumChatFormatting.RESET + + " K", + StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 3, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 3, 0, elementBudget, env, false, true); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + inputSeparation = !inputSeparation; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("isBussesSeparate")) { + // backward compatibility + inputSeparation = aNBT.getBoolean("isBussesSeparate"); + } + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEExtremeDieselEngine.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEExtremeDieselEngine.java new file mode 100644 index 0000000000..8aba224e9c --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEExtremeDieselEngine.java @@ -0,0 +1,237 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchDynamo; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.maps.FuelBackend; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEExtremeDieselEngine extends MTEDieselEngine { + + public MTEExtremeDieselEngine(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEExtremeDieselEngine(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Combustion Generator") + .addInfo("Controller block for the Extreme Combustion Engine") + .addInfo("Supply high rating fuel and 8000L of Lubricant per hour to run") + .addInfo("Supply 40L/s of Liquid Oxygen to boost output (optional)") + .addInfo("Default: Produces 10900EU/t at 100% fuel efficiency") + .addInfo("Boosted: Produces 32700EU/t at 150% fuel efficiency") + .addInfo("You need to wait for it to reach 300% to output full power") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 3, 4, false) + .addController("Front center") + .addCasingInfoRange("Robust Tungstensteel Machine Casing", 16, 22, false) + .addOtherStructurePart("Titanium Gear Box Machine Casing", "Inner 2 blocks") + .addOtherStructurePart("Extreme Engine Intake Machine Casing", "8x, ring around controller") + .addStructureInfo("Extreme Engine Intake Casings must not be obstructed in front (only air blocks)") + .addDynamoHatch("Back center", 2) + .addMaintenanceHatch("One of the casings next to a Gear Box", 1) + .addMufflerHatch("Top middle back, above the rear Gear Box", 1) + .addInputHatch("HOG, next to a Gear Box", 1) + .addInputHatch("Lubricant, next to a Gear Box", 1) + .addInputHatch("Liquid Oxygen, optional, next to a Gear Box", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.extremeDieselFuels; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { casingTexturePages[0][60], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][60], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { casingTexturePages[0][60] }; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getCasingMeta() { + return 0; + } + + @Override + public Block getIntakeBlock() { + return GregTechAPI.sBlockCasings8; + } + + @Override + public byte getIntakeMeta() { + return 4; + } + + @Override + public Block getGearboxBlock() { + return GregTechAPI.sBlockCasings2; + } + + @Override + public byte getGearboxMeta() { + return 4; + } + + @Override + public byte getCasingTextureIndex() { + return 60; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEExtremeDieselEngine(this.mName); + } + + @Override + protected int getNominalOutput() { + return 10900; + } + + @Override + protected int getBoostFactor() { + return 2; + } + + @Override + protected Materials getBooster() { + return Materials.LiquidOxygen; + } + + @Override + protected int getAdditiveFactor() { + return 1; + } + + @Override + protected int getEfficiencyIncrease() { + return 20; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return boostEu ? 30000 : 10000; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond; + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + } + + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatchDynamo tHatch : filterValidMTEs(mDynamoHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { EnumChatFormatting.BLUE + "Extreme Diesel Engine" + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + getIdealStatus() == getRepairStatus() + ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") + + EnumChatFormatting.RESET + : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.engine.output") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers((long) -mEUt * mEfficiency / 10000) + + EnumChatFormatting.RESET + + " EU/t", + StatCollector.translateToLocal("GT5U.engine.consumption") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(fuelConsumption) + + EnumChatFormatting.RESET + + " L/t", + StatCollector.translateToLocal("GT5U.engine.value") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(fuelValue) + + EnumChatFormatting.RESET + + " EU/L", + StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " + + EnumChatFormatting.GOLD + + GTUtility.formatNumbers(fuelRemaining) + + EnumChatFormatting.RESET + + " L", + StatCollector.translateToLocal("GT5U.engine.efficiency") + ": " + + EnumChatFormatting.YELLOW + + (mEfficiency / 100F) + + EnumChatFormatting.YELLOW + + " %", + StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer.java new file mode 100644 index 0000000000..4527436285 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer.java @@ -0,0 +1,673 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.filterByMTETier; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.Set; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableMap; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.VoidingMode; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +import gregtech.api.objects.GTItemStack; +import gregtech.api.objects.overclockdescriber.FusionOverclockDescriber; +import gregtech.api.objects.overclockdescriber.OverclockDescriber; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.ParallelHelper; +import gregtech.api.util.shutdown.ShutDownReason; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.tileentities.machines.multi.drone.MTEHatchDroneDownLink; + +public abstract class MTEFusionComputer extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable, IAddUIWidgets, IOverclockDescriptionProvider { + + private final OverclockDescriber overclockDescriber; + + public static final String STRUCTURE_PIECE_MAIN = "main"; + private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { + + @Override + protected IStructureDefinition computeValue(Class type) { + return StructureDefinition.builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { + { " ", " ihi ", " hh hh ", " h h ", + " h h ", " h h ", " i i ", " h h ", + " i i ", " h h ", " h h ", " h h ", + " hh hh ", " ihi ", " ", }, + { " xhx ", " hhccchh ", " eccxdxcce ", " eceh hece ", + " hce ech ", " hch hch ", "xcx xcx", "hch hch", + "xcx xcx", " hch hch ", " hce ech ", " eceh hece ", + " eccx~xcce ", " hhccchh ", " xhx ", }, + { " ", " ihi ", " hh hh ", " h h ", + " h h ", " h h ", " i i ", " h h ", + " i i ", " h h ", " h h ", " h h ", + " hh hh ", " ihi ", " ", } })) + .addElement('c', lazy(t -> ofBlock(t.getFusionCoil(), t.getFusionCoilMeta()))) + .addElement('h', lazy(t -> ofBlock(t.getCasing(), t.getCasingMeta()))) + .addElement( + 'i', + lazy( + t -> buildHatchAdder(MTEFusionComputer.class) + .atLeast(ImmutableMap.of(InputHatch.withAdder(MTEFusionComputer::addInjector), 1)) + .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE)) + .casingIndex(53) + .dot(1) + .buildAndChain(t.getCasing(), t.getCasingMeta()))) + .addElement( + 'e', + lazy( + t -> buildHatchAdder(MTEFusionComputer.class) + .atLeast(ImmutableMap.of(Energy.withAdder(MTEFusionComputer::addEnergyInjector), 16)) + .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE)) + .casingIndex(53) + .dot(2) + .buildAndChain(t.getCasing(), t.getCasingMeta()))) + .addElement( + 'x', + lazy( + t -> buildHatchAdder(MTEFusionComputer.class) + .atLeast(OutputHatch.withAdder(MTEFusionComputer::addExtractor)) + .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE)) + .casingIndex(53) + .dot(3) + .buildAndChain(t.getCasing(), t.getCasingMeta()))) + .addElement( + 'd', + lazy( + t -> buildHatchAdder(MTEFusionComputer.class).adder(MTEFusionComputer::addDroneHatch) + .hatchId(9401) + .casingIndex(53) + .dot(4) + .buildAndChain(t.getCasing(), t.getCasingMeta()))) + .build(); + } + }; + public GTRecipe mLastRecipe; + public long mEUStore; + + static { + Textures.BlockIcons.setCasingTextureForId( + 52, + TextureFactory.of( + TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW) + .extFacing() + .glow() + .build())); + } + + public MTEFusionComputer(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + this.overclockDescriber = createOverclockDescriber(); + } + + public MTEFusionComputer(String aName) { + super(aName); + this.overclockDescriber = createOverclockDescriber(); + } + + protected OverclockDescriber createOverclockDescriber() { + return new FusionOverclockDescriber((byte) tier(), capableStartupCanonical()); + } + + @Nonnull + @Override + public OverclockDescriber getOverclockDescriber() { + return overclockDescriber; + } + + public abstract int tier(); + + @Override + public abstract long maxEUStore(); + + /** + * Unlike {@link #maxEUStore()}, this provides theoretical limit of startup EU, without considering the amount of + * hatches nor the room for extra energy. Intended for simulation. + */ + public abstract long capableStartupCanonical(); + + @Override + public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity); + + @Override + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aStack) { + + return side != getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (mEUt > 0) { + mEUt = -mEUt; + } + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION.get(getClass()); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addController("Fusion Reactor") + .addInfo("Some kind of fusion reactor, maybe") + .addSeparator() + .addInfo("Some kind of fusion reactor, maybe") + .addStructureInfo("Should probably be built similar to other fusions") + .addStructureInfo("See controller tooltip for details") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + return checkPiece(STRUCTURE_PIECE_MAIN, 7, 1, 12) && !mOutputHatches.isEmpty() && !mEnergyHatches.isEmpty(); + } + + private boolean addEnergyInjector(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { + IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (!(aMetaTileEntity instanceof MTEHatchEnergy tHatch)) return false; + if (tHatch.mTier < tier()) return false; + tHatch.updateTexture(aBaseCasingIndex); + return mEnergyHatches.add(tHatch); + } + + private boolean addInjector(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { + IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (!(aMetaTileEntity instanceof MTEHatchInput tHatch)) return false; + if (tHatch.getTierForStructure() < tier()) return false; + tHatch.updateTexture(aBaseCasingIndex); + tHatch.mRecipeMap = getRecipeMap(); + return mInputHatches.add(tHatch); + } + + private boolean addExtractor(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { + if (aBaseMetaTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (!(aMetaTileEntity instanceof MTEHatchOutput tHatch)) return false; + if (tHatch.getTierForStructure() < tier()) return false; + tHatch.updateTexture(aBaseCasingIndex); + return mOutputHatches.add(tHatch); + } + + private boolean addDroneHatch(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) { + if (aBaseMetaTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (!(aMetaTileEntity instanceof MTEHatchDroneDownLink tHatch)) return false; + tHatch.updateTexture(aBaseCasingIndex); + return addToMachineList(aBaseMetaTileEntity, aBaseCasingIndex); + } + + public abstract Block getCasing(); + + public abstract int getCasingMeta(); + + public abstract Block getFusionCoil(); + + public abstract int getFusionCoilMeta(); + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) return new ITexture[] { TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS) + .extFacing() + .build(), getTextureOverlay() }; + if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(52) }; + return new ITexture[] { TextureFactory.builder() + .addIcon(MACHINE_CASING_FUSION_GLASS) + .extFacing() + .build() }; + } + + /** + * @return The list of textures overlay + */ + public abstract ITexture getTextureOverlay(); + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.fusionRecipes; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected ParallelHelper createParallelHelper(@NotNull GTRecipe recipe) { + // When the fusion first loads and is still processing, it does the recipe check without consuming. + return super.createParallelHelper(recipe).setConsumption(!mRunningOnLoad); + } + + @NotNull + @Override + protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) { + return overclockDescriber.createCalculator(super.createOverclockCalculator(recipe), recipe); + } + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { + if (!mRunningOnLoad && recipe.mSpecialValue > maxEUStore()) { + return CheckRecipeResultRegistry.insufficientStartupPower(recipe.mSpecialValue); + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @NotNull + @Override + public CheckRecipeResult process() { + CheckRecipeResult result = super.process(); + if (mRunningOnLoad) mRunningOnLoad = false; + turnCasingActive(result.wasSuccessful()); + if (result.wasSuccessful()) { + mLastRecipe = lastRecipe; + } else { + mLastRecipe = null; + } + return result; + } + }; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTValues.V[tier()]); + logic.setAvailableAmperage(1); + logic.setAmperageOC(false); + } + + public boolean turnCasingActive(boolean status) { + if (this.mEnergyHatches != null) { + for (MTEHatchEnergy hatch : this.mEnergyHatches) { + hatch.updateTexture(status ? 52 : 53); + } + } + if (this.mOutputHatches != null) { + for (MTEHatchOutput hatch : this.mOutputHatches) { + hatch.updateTexture(status ? 52 : 53); + } + } + if (this.mInputHatches != null) { + for (MTEHatchInput hatch : this.mInputHatches) { + hatch.updateTexture(status ? 52 : 53); + } + } + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + mTotalRunTime++; + if (mEfficiency < 0) mEfficiency = 0; + if (mRunningOnLoad && checkMachine(aBaseMetaTileEntity, mInventory[1])) { + this.mEUStore = aBaseMetaTileEntity.getStoredEU(); + checkRecipe(); + } + if (mUpdated) { + mUpdate = 50; + mUpdated = false; + } + if (--mUpdate == 0 || --mStartUpCheck == 0) { + checkStructure(true, aBaseMetaTileEntity); + } + if (mStartUpCheck < 0) { + if (mMachine) { + this.mEUStore = aBaseMetaTileEntity.getStoredEU(); + if (this.mEnergyHatches != null) { + for (MTEHatchEnergy tHatch : filterValidMTEs(mEnergyHatches)) { + long energyToMove = GTValues.V[tier()] / 16; + if (aBaseMetaTileEntity.getStoredEU() + energyToMove < maxEUStore() + && tHatch.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(energyToMove, false)) { + aBaseMetaTileEntity.increaseStoredEnergyUnits(energyToMove, true); + } + } + } + if (this.mEUStore <= 0 && mMaxProgresstime > 0) { + stopMachine(ShutDownReasonRegistry.POWER_LOSS); + } + if (mMaxProgresstime > 0) { + this.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(-mEUt, true); + if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) { + if (mOutputItems != null) + for (ItemStack tStack : mOutputItems) if (tStack != null) addOutput(tStack); + if (mOutputFluids != null) + for (FluidStack tStack : mOutputFluids) if (tStack != null) addOutput(tStack); + mEfficiency = Math + .max(0, Math.min(mEfficiency + mEfficiencyIncrease, getMaxEfficiency(mInventory[1]))); + mOutputItems = null; + mProgresstime = 0; + mMaxProgresstime = 0; + mEfficiencyIncrease = 0; + if (mOutputFluids != null && mOutputFluids.length > 0) { + try { + GTMod.achievements.issueAchivementHatchFluid( + aBaseMetaTileEntity.getWorld() + .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), + mOutputFluids[0]); + } catch (Exception ignored) {} + } + this.mEUStore = aBaseMetaTileEntity.getStoredEU(); + if (aBaseMetaTileEntity.isAllowedToWork()) checkRecipe(); + } + } else { + if (aTick % 100 == 0 || aBaseMetaTileEntity.hasWorkJustBeenEnabled() + || aBaseMetaTileEntity.hasInventoryBeenModified()) { + turnCasingActive(mMaxProgresstime > 0); + if (aBaseMetaTileEntity.isAllowedToWork()) { + this.mEUStore = aBaseMetaTileEntity.getStoredEU(); + if (checkRecipe()) { + if (this.mEUStore < this.mLastRecipe.mSpecialValue + this.mEUt) { + stopMachine(ShutDownReasonRegistry.POWER_LOSS); + } + aBaseMetaTileEntity + .decreaseStoredEnergyUnits(this.mLastRecipe.mSpecialValue + this.mEUt, true); + } + } + if (mMaxProgresstime <= 0) mEfficiency = Math.max(0, mEfficiency - 1000); + } + } + } else if (aBaseMetaTileEntity.isAllowedToWork()) { + this.mLastRecipe = null; + stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE); + } + } + aBaseMetaTileEntity + .setErrorDisplayID((aBaseMetaTileEntity.getErrorDisplayID() & ~127) | (mMachine ? 0 : 64)); + aBaseMetaTileEntity.setActive(mMaxProgresstime > 0); + } else { + doActivitySound(getActivitySoundLoop()); + } + } + + @Override + public boolean drainEnergyInput(long aEU) { + return false; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public void stopMachine(@NotNull ShutDownReason reason) { + super.stopMachine(reason); + turnCasingActive(false); + } + + @Override + public String[] getInfoData() { + String tier = tier() == 6 ? EnumChatFormatting.RED + "I" + EnumChatFormatting.RESET + : tier() == 7 ? EnumChatFormatting.YELLOW + "II" + EnumChatFormatting.RESET + : tier() == 8 ? EnumChatFormatting.GRAY + "III" + EnumChatFormatting.RESET : "IV"; + float plasmaOut = 0; + int powerRequired = 0; + if (this.mLastRecipe != null) { + powerRequired = this.mLastRecipe.mEUt; + if (this.mLastRecipe.getFluidOutput(0) != null) { + plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration; + } + } + + return new String[] { EnumChatFormatting.BLUE + "Fusion Reactor MK " + EnumChatFormatting.RESET + tier, + StatCollector.translateToLocal("GT5U.fusion.req") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(powerRequired) + + EnumChatFormatting.RESET + + "EU/t", + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mEUStore) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEUStore()) + + EnumChatFormatting.RESET + + " EU", + StatCollector.translateToLocal("GT5U.fusion.plasma") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(plasmaOut) + + EnumChatFormatting.RESET + + "L/t" }; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 7, 1, 12); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 1, 12, elementBudget, env, false, true); + } + + @SideOnly(Side.CLIENT) + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.GT_MACHINES_FUSION_LOOP.resourceLocation; + } + + @Override + public boolean doesBindPlayerInventory() { + return false; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(155, 145)); + } + + @Override + public GUITextureSet getGUITextureSet() { + return new GUITextureSet().setMainBackground(GTUITextures.BACKGROUND_FUSION_COMPUTER); + } + + @Override + public int getGUIWidth() { + return 176; + } + + @Override + public int getGUIHeight() { + return 166; + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + protected long clientEU; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder + .widget( + new TextWidget(GTUtility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mMachine) + .setPos(10, 8)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)) + .widget( + new TextWidget("Hit with Soft Mallet to (re-)start the Machine if it doesn't start.") + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setTextAlignment(Alignment.Center) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 + && !getBaseMetaTileEntity().isActive()) + .setPos(-getGUIWidth() / 2, 170) + .setSize(getGUIWidth() * 2, 9)) + .widget( + new FakeSyncWidget.IntegerSyncer( + () -> getBaseMetaTileEntity().getErrorDisplayID(), + val -> getBaseMetaTileEntity().setErrorDisplayID(val))) + .widget( + new FakeSyncWidget.BooleanSyncer( + () -> getBaseMetaTileEntity().isActive(), + val -> getBaseMetaTileEntity().setActive(val))) + .widget( + new TextWidget("Running perfectly.").setDefaultColor(COLOR_TEXT_WHITE.get()) + .setTextAlignment(Alignment.Center) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 + && getBaseMetaTileEntity().isActive()) + .setPos(0, 170) + .setSize(getGUIWidth(), 9)) + .widget( + new FakeSyncWidget.IntegerSyncer( + () -> getBaseMetaTileEntity().getErrorDisplayID(), + val -> getBaseMetaTileEntity().setErrorDisplayID(val))) + .widget( + new ProgressBar() + .setProgress( + () -> (float) getBaseMetaTileEntity().getStoredEU() / getBaseMetaTileEntity().getEUCapacity()) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(GTUITextures.PROGRESSBAR_STORED_EU, 147) + .setPos(5, 156) + .setSize(147, 5)) + .widget(new TextWidget().setStringSupplier(() -> { + if (clientEU > 160_000_000L && clientEU < 160_010_000L) { + clientEU = 160_000_000L; + } + if (clientEU > 320_000_000L && clientEU < 320_010_000L) { + clientEU = 320_000_000L; + } + if (clientEU > 640_000_000L && clientEU < 640_010_000L) { + clientEU = 640_000_000L; + } + if (clientEU > 5_120_000_000L && clientEU < 5_120_080_000L) { + clientEU = 5_120_000_000L; + } + return numberFormat.format(clientEU) + " EU"; + }) + .setDefaultColor(COLOR_TEXT_RED.get()) + .setTextAlignment(Alignment.Center) + .setScale(0.5f) + .setPos(5, 157) + .setSize(147, 5)) + .widget(new FakeSyncWidget.LongSyncer(() -> getBaseMetaTileEntity().getStoredEU(), val -> clientEU = val)) + .widget( + new ButtonWidget().setNEITransferRect( + RecipeMaps.fusionRecipes.getFrontend() + .getUIProperties().neiTransferRectId) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_NEI) + .setPos(154, 4) + .setSize(18, 18)); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public Set getAllowedVoidingModes() { + return VoidingMode.FLUID_ONLY_MODES; + } + + @Override + public boolean getDefaultHasMaintenanceChecks() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer1.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer1.java new file mode 100644 index 0000000000..e0976106e5 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer1.java @@ -0,0 +1,103 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW; + +import net.minecraft.block.Block; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEFusionComputer1 extends MTEFusionComputer { + + private static final ITexture textureOverlay = TextureFactory.of( + TextureFactory.builder() + .addIcon(OVERLAY_FUSION1) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FUSION1_GLOW) + .extFacing() + .glow() + .build()); + + public MTEFusionComputer1(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEFusionComputer1(String aName) { + super(aName); + } + + @Override + public int tier() { + return 6; + } + + @Override + public long maxEUStore() { + return 160003000L * (Math.min(16, this.mEnergyHatches.size())) / 16L; + } + + @Override + public long capableStartupCanonical() { + return 160_000_000; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEFusionComputer1(mName); + } + + @Override + public Block getCasing() { + return GregTechAPI.sBlockCasings1; + } + + @Override + public int getCasingMeta() { + return 6; + } + + @Override + public Block getFusionCoil() { + return GregTechAPI.sBlockCasings1; + } + + @Override + public int getFusionCoilMeta() { + return 15; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Fusion Reactor") + .addInfo("It's over 9000!!!") + .addInfo("Controller block for the Fusion Reactor Mk I") + .addInfo("2048EU/t and 10M EU capacity per Energy Hatch") + .addInfo("If the recipe has a startup cost greater than the") + .addInfo("number of energy hatches * cap, you can't do it") + .addSeparator() + .beginStructureBlock(15, 3, 15, false) + .addController("See diagram when placed") + .addCasingInfoRange("LuV Machine Casing", 79, 123, false) + .addStructureInfo("Cover the coils with casing") + .addOtherStructurePart("Superconducting Coil Block", "Center part of the ring") + .addEnergyHatch("1-16, Specified casings", 2) + .addInputHatch("2-16, Specified casings", 1) + .addOutputHatch("1-16, Specified casings", 3) + .addStructureInfo("ALL Hatches must be LuV or better") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture getTextureOverlay() { + return textureOverlay; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer2.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer2.java new file mode 100644 index 0000000000..ee67b74bf8 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer2.java @@ -0,0 +1,103 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION2; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION2_GLOW; + +import net.minecraft.block.Block; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEFusionComputer2 extends MTEFusionComputer { + + private static final ITexture textureOverlay = TextureFactory.of( + TextureFactory.builder() + .addIcon(OVERLAY_FUSION2) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FUSION2_GLOW) + .extFacing() + .glow() + .build()); + + public MTEFusionComputer2(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEFusionComputer2(String aName) { + super(aName); + } + + @Override + public int tier() { + return 7; + } + + @Override + public long maxEUStore() { + return 320006000L * (Math.min(16, this.mEnergyHatches.size())) / 16L; + } + + @Override + public long capableStartupCanonical() { + return 320_000_000; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEFusionComputer2(mName); + } + + @Override + public Block getCasing() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public int getCasingMeta() { + return 6; + } + + @Override + public Block getFusionCoil() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public int getFusionCoilMeta() { + return 7; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Fusion Reactor") + .addInfo("It's over 9000!!!") + .addInfo("Controller block for the Fusion Reactor Mk II") + .addInfo("8192EU/t and 20M EU capacity per Energy Hatch") + .addInfo("If the recipe has a startup cost greater than the") + .addInfo("number of energy hatches * cap, you can't do it") + .addSeparator() + .beginStructureBlock(15, 3, 15, false) + .addController("See diagram when placed") + .addCasingInfoRange("Fusion Machine Casing", 79, 123, false) + .addStructureInfo("Cover the coils with casing") + .addOtherStructurePart("Fusion Coil Block", "Center part of the ring") + .addEnergyHatch("1-16, Specified casings", 2) + .addInputHatch("2-16, Specified casings", 1) + .addOutputHatch("1-16, Specified casings", 3) + .addStructureInfo("ALL Hatches must be ZPM or better") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture getTextureOverlay() { + return textureOverlay; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer3.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer3.java new file mode 100644 index 0000000000..3e4f431351 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEFusionComputer3.java @@ -0,0 +1,103 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION3; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION3_GLOW; + +import net.minecraft.block.Block; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEFusionComputer3 extends MTEFusionComputer { + + private static final ITexture textureOverlay = TextureFactory.of( + TextureFactory.builder() + .addIcon(OVERLAY_FUSION3) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FUSION3_GLOW) + .extFacing() + .glow() + .build()); + + public MTEFusionComputer3(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEFusionComputer3(String aName) { + super(aName); + } + + @Override + public int tier() { + return 8; + } + + @Override + public long maxEUStore() { + return 640010000L * (Math.min(16, this.mEnergyHatches.size())) / 16L; + } + + @Override + public long capableStartupCanonical() { + return 640_000_000; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEFusionComputer3(mName); + } + + @Override + public Block getCasing() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public int getCasingMeta() { + return 8; + } + + @Override + public Block getFusionCoil() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public int getFusionCoilMeta() { + return 7; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Fusion Reactor") + .addInfo("A SUN DOWN ON EARTH") + .addInfo("Controller block for the Fusion Reactor Mk III") + .addInfo("32768EU/t and 40M EU capacity per Energy Hatch") + .addInfo("If the recipe has a startup cost greater than the") + .addInfo("number of energy hatches * cap, you can't do it") + .addSeparator() + .beginStructureBlock(15, 3, 15, false) + .addController("See diagram when placed") + .addCasingInfoRange("Fusion Machine Casing Mk II", 79, 123, false) + .addStructureInfo("Cover the coils with casing") + .addOtherStructurePart("Fusion Coil Block", "Center part of the ring") + .addEnergyHatch("1-16, Specified casings", 2) + .addInputHatch("2-16, Specified casings", 1) + .addOutputHatch("1-16, Specified casings", 3) + .addStructureInfo("ALL Hatches must be UV or better") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture getTextureOverlay() { + return textureOverlay; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEHeatExchanger.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEHeatExchanger.java new file mode 100644 index 0000000000..fb90f1acc4 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEHeatExchanger.java @@ -0,0 +1,396 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import 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.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.registries.LHECoolantRegistry; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEHeatExchanger extends MTEEnhancedMultiBlockBase implements ISurvivalConstructable { + + private int dryHeatCounter = 0; // Counts up to dryHeatMaximum to check for explosion conditions + private static final int dryHeatMaximum = 2000; // 2000 ticks = 100 seconds + private static final int CASING_INDEX = 50; + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { "ccc", "cCc", "ccc" }, { "ccc", "cPc", "ccc" }, { "ccc", "cPc", "ccc" }, + { "c~c", "cHc", "ccc" }, })) + .addElement('P', ofBlock(GregTechAPI.sBlockCasings2, 14)) + .addElement( + 'C', + OutputHatch.withAdder(MTEHeatExchanger::addColdFluidOutputToMachineList) + .withCount(t -> t.mOutputColdFluidHatch.isValid() ? 1 : 0) + .newAny(CASING_INDEX, 3)) + .addElement( + 'H', + InputHatch.withAdder(MTEHeatExchanger::addHotFluidInputToMachineList) + .withCount(t -> t.mInputHotFluidHatch.isValid() ? 1 : 0) + .newAny(CASING_INDEX, 3)) + .addElement( + 'c', + buildHatchAdder(MTEHeatExchanger.class).atLeast(InputBus, InputHatch, OutputBus, OutputHatch, Maintenance) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain( + onElementPass(MTEHeatExchanger::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings4, (byte) 2)))) + .build(); + public static float penalty_per_config = 0.015f; // penalize 1.5% efficiency per circuitry level (1-25) + + private MTEHatchInput mInputHotFluidHatch; + private MTEHatchOutput mOutputColdFluidHatch; + private boolean superheated = false; + private int superheated_threshold = 0; + /** + * How much more steam we can make without draining real water. Unit is (1L/GT_Values.STEAM_PER_WATER) + */ + private int steamBudget; + + private int mCasingAmount; + + public MTEHeatExchanger(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEHeatExchanger(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Heat Exchanger") + .addInfo("Controller Block for the Large Heat Exchanger") + .addInfo("More complicated than a Fusion Reactor. Seriously") + .addInfo("Inputs are Hot Coolant or Lava") + .addInfo("Outputs Coolant or Pahoehoe Lava and SH Steam/Steam") + .addInfo("Read the wiki article to understand how it works") + .addInfo("Then go to the Discord to understand the wiki") + .addSeparator() + .beginStructureBlock(3, 4, 3, false) + .addController("Front bottom") + .addCasingInfoRange("Stable Titanium Machine Casing", 20, 32, false) + .addOtherStructurePart("Titanium Pipe Casing", "Center 2 blocks") + .addMaintenanceHatch("Any casing", 1) + .addInputHatch("Hot fluid, bottom center", 2) + .addInputHatch("Distilled water, any casing", 1) + .addOutputHatch("Cold fluid, top center", 3) + .addOutputHatch("Steam/SH Steam, any casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + superheated = aNBT.getBoolean("superheated"); + steamBudget = aNBT.getInteger("steamBudget"); + super.loadNBTData(aNBT); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setBoolean("superheated", superheated); + aNBT.setInteger("steamBudget", steamBudget); + super.saveNBTData(aNBT); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped(); + } + + @Override + @Nonnull + public CheckRecipeResult checkProcessing() { + if (mInputHotFluidHatch.getFluid() == null) return CheckRecipeResultRegistry.NO_RECIPE; + + int fluidAmountToConsume = mInputHotFluidHatch.getFluidAmount(); // how much fluid is in hatch + + superheated_threshold = 4000; // default: must have 4000L per second to generate superheated steam + float efficiency = 1f; // default: operate at 100% efficiency with no integrated circuitry + int shs_reduction_per_config = 150; // reduce threshold 150L/s per circuitry level (1-25) + float steam_output_multiplier = 20f; // default: multiply output by 4 * 10 (boosted x5) + float penalty = 0.0f; // penalty to apply to output based on circuitry level (1-25). + + // Do we have an integrated circuit with a valid configuration? + if (mInventory[1] != null && mInventory[1].getUnlocalizedName() + .startsWith("gt.integrated_circuit")) { + int circuit_config = mInventory[1].getItemDamage(); + if (circuit_config >= 1 && circuit_config <= 25) { + // If so, apply the penalty and reduce the threshold. + penalty = (circuit_config - 1) * penalty_per_config; + superheated_threshold -= shs_reduction_per_config * (circuit_config - 1); + } + } + + efficiency -= penalty; + + var coolant = LHECoolantRegistry.getCoolant( + mInputHotFluidHatch.getFluid() + .getFluid()); + + if (coolant == null) { + superheated_threshold = 0; + return CheckRecipeResultRegistry.NO_RECIPE; + } else { + steam_output_multiplier *= coolant.steamMultiplier; + superheated_threshold *= coolant.superheatedThreshold; + } + + // set the internal superheated flag if we have + // enough hot fluid. Used in the onRunningTick method. + superheated = fluidAmountToConsume >= superheated_threshold; + + // Don't consume too much hot fluid per second + fluidAmountToConsume = Math.min(fluidAmountToConsume, superheated_threshold * 2); + + mInputHotFluidHatch.drain(fluidAmountToConsume, true); + mOutputColdFluidHatch.fill(coolant.getColdFluid(fluidAmountToConsume), true); + + this.mMaxProgresstime = 20; + this.mEUt = (int) (fluidAmountToConsume * steam_output_multiplier * efficiency); + this.mEfficiencyIncrease = 80; + + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + private int useWater(int steam) { + steamBudget -= steam; + int usage = -Math.min(0, Math.floorDiv(steamBudget, GTValues.STEAM_PER_WATER)); + // still subtract, because usage will be a negative number + steamBudget += usage * GTValues.STEAM_PER_WATER; + return usage; + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + if (this.mEUt > 0) { + int tGeneratedEU = (int) (this.mEUt * 2L * this.mEfficiency / 10000L); // APPROXIMATELY how much steam to + // generate. + if (tGeneratedEU > 0) { + + if (superheated) tGeneratedEU /= 2; // We produce half as much superheated steam if necessary + + int distilledConsumed = useWater(tGeneratedEU); // how much distilled water to consume + // tGeneratedEU = distilledConsumed * 160; // EXACTLY how much steam to generate, producing a perfect + // 1:160 ratio with distilled water consumption + + FluidStack distilledStack = GTModHandler.getDistilledWater(distilledConsumed); + startRecipeProcessing(); + if (depleteInput(distilledStack)) // Consume the distilled water + { + if (superheated) { + addOutput(FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU)); // Generate + // superheated + // steam + } else { + addOutput(GTModHandler.getSteam(tGeneratedEU)); // Generate regular steam + } + dryHeatCounter = 0; + } else { + if (dryHeatCounter < dryHeatMaximum) { + dryHeatCounter += 1; + } else { + GTLog.exp.println(this.mName + " was too hot and had no more Distilled Water!"); + explodeMultiblock(); // Generate crater + } + } + endRecipeProcessing(); + } + return true; + } + return true; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mOutputColdFluidHatch = null; + mInputHotFluidHatch = null; + mCasingAmount = 0; + return checkPiece(STRUCTURE_PIECE_MAIN, 1, 3, 0) && mCasingAmount >= 20 && mMaintenanceHatches.size() == 1; + } + + public boolean addColdFluidOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchOutput) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + mOutputColdFluidHatch = (MTEHatchOutput) 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 MTEHatchInput) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((MTEHatchInput) aMetaTileEntity).mRecipeMap = getRecipeMap(); + mInputHotFluidHatch = (MTEHatchInput) 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 MTEHeatExchanger(this.mName); + } + + @Override + public String[] getInfoData() { + return new String[] { + StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + StatCollector.translateToLocal("GT5U.multiblock.usage") + " " + + StatCollector.translateToLocal("GT5U.LHE.steam") + + ": " + + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.YELLOW) + + GTUtility.formatNumbers(superheated ? -2L * mEUt : -mEUt) + + EnumChatFormatting.RESET + + " EU/t", + StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.multiblock.efficiency") + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + StatCollector.translateToLocal("GT5U.LHE.superheated") + ": " + + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.BLUE) + + superheated + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.LHE.superheated") + " " + + StatCollector.translateToLocal("GT5U.LHE.threshold") + + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(superheated_threshold) + + EnumChatFormatting.RESET }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 3, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 3, 0, elementBudget, env, false, true); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEImplosionCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEImplosionCompressor.java new file mode 100644 index 0000000000..a9c96266da --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEImplosionCompressor.java @@ -0,0 +1,162 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.structure.IStructureElement; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTECubicMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEImplosionCompressor extends MTECubicMultiBlockBase { + + public MTEImplosionCompressor(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEImplosionCompressor(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEImplosionCompressor(this.mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Implosion Compressor") + .addInfo("Explosions are fun") + .addInfo("Controller block for the Implosion Compressor") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 3, 3, true) + .addController("Front center") + .addCasingInfoRange("Solid Steel Machine Casing", 16, 24, false) + .addStructureInfo("Casings can be replaced with Explosion Warning Signs") + .addEnergyHatch("Any casing", 1) + .addMaintenanceHatch("Any casing", 1) + .addMufflerHatch("Any casing", 1) + .addInputBus("Any casing", 1) + .addOutputBus("Any casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + return super.addToMachineList(aTileEntity, aBaseCasingIndex) + || addMufflerToMachineList(aTileEntity, aBaseCasingIndex); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][16] }; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.implosionRecipes; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic(); + } + + @Override + protected int getTimeBetweenProcessSounds() { + return 10; + } + + @Override + protected SoundResource getProcessStartSound() { + return SoundResource.RANDOM_EXPLODE; + } + + @Override + protected IStructureElement> getCasingElement() { + return ofChain(ofBlock(GregTechAPI.sBlockCasings2, 0), ofBlock(GregTechAPI.sBlockCasings3, 4)); + } + + @Override + protected int getHatchTextureIndex() { + return 16; + } + + @Override + protected int getRequiredCasingCount() { + return 16; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionImplosionCompressorPerSecond; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialElectromagneticSeparator.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialElectromagneticSeparator.java new file mode 100644 index 0000000000..20b3ce4b32 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialElectromagneticSeparator.java @@ -0,0 +1,465 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EMS_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +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.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.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.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchMagnet; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings10; +import gregtech.common.items.MetaGeneratedItem01; +import gtPlusPlus.core.util.minecraft.PlayerUtils; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEIndustrialElectromagneticSeparator + extends MTEExtendedPowerMultiBlockBase implements ISurvivalConstructable { + + public enum MagnetTiers { + + Iron(8, 0.8F, 1.1F, false), + Steel(24, 0.75F, 1.25F, false), + Neodymium(48, 0.7F, 1.5F, false), + Samarium(96, 0.6F, 2F, false), + Tengam(256, 0.5F, 2.5F, true); + + final int maxParallel; + final float euModifier, speedBoost; + final boolean supportsExotic; + + MagnetTiers(int maxParallel, float euModifier, float speedBoost, boolean supportsExotic) { + this.maxParallel = maxParallel; + this.euModifier = euModifier; + this.speedBoost = 1F / speedBoost; + this.supportsExotic = supportsExotic; + } + + public static String buildMagnetTooltip(MagnetTiers m) { + String tooltip = "Used in Magnetic Flux Exhibitor/n " + EnumChatFormatting.LIGHT_PURPLE + + "Speed: +" + + Math.round((1F / m.speedBoost * 100) - 100) + + "%/n " + + EnumChatFormatting.DARK_PURPLE + + "EU Usage: " + + Math.round(m.euModifier * 100) + + "%/n " + + EnumChatFormatting.AQUA + + "Parallel: " + + m.maxParallel; + + if (m.supportsExotic) tooltip = tooltip + "/n " + + EnumChatFormatting.BOLD + + EnumChatFormatting.GREEN + + "Can Use Multiamp Hatches"; + + return tooltip; + } + } + + final int MIN_CASING = 64; + private MTEHatchMagnet mMagHatch = null; + private MagnetTiers magnetTier = null; + + private static final int MACHINEMODE_SEPARATOR = 0; + private static final int MACHINEMODE_POLARIZER = 1; + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + (new String[][] { { " CCC ", " ", " ", " ", " ", " B~B " }, + { " CC CC ", " ", " BBB ", " AAA ", " BEB ", " BBBBB " }, + { "CC CC", " ", " BBBBB ", " A A ", " BBBBB ", "BBBBBBB" }, + { "C C", "C C", "CBBBBBC", "CA C AC", "CBBBBBC", "BBBBBBB" }, + { "CC CC", " ", " BBBBB ", " A A ", " BBBBB ", "BBBBBBB" }, + { " CC CC ", " ", " BBB ", " AAA ", " BBB ", " BBBBB " }, + { " CCC ", " C ", " C ", " C ", " C ", " BBB " } })) + .addElement('A', Glasses.chainAllGlasses()) + .addElement( + 'B', + ofChain( + buildHatchAdder(MTEIndustrialElectromagneticSeparator.class) + .atLeast(InputBus, OutputBus, Maintenance, Energy.or(ExoticEnergy)) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(0)) + .dot(1) + .buildAndChain( + onElementPass( + MTEIndustrialElectromagneticSeparator::onCasingAdded, + ofBlock(GregTechAPI.sBlockCasings10, 0))))) + .addElement('C', ofFrame(Materials.NeodymiumMagnetic)) + .addElement( + 'E', + buildHatchAdder(MTEIndustrialElectromagneticSeparator.class) + .adder(MTEIndustrialElectromagneticSeparator::addMagHatch) + .hatchClass(MTEHatchMagnet.class) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(0)) + .dot(2) + .build()) + .build(); + + public MTEIndustrialElectromagneticSeparator(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEIndustrialElectromagneticSeparator(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEIndustrialElectromagneticSeparator(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 0)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EMS_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EMS_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 0)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EMS) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_EMS_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 0)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Electromagnetic Separator/Polarizer") + .addInfo("Controller Block for the Magnetic Flux Exhibitor") + .addInfo("Use screwdriver to switch mode") + .addInfo("Insert an electromagnet into the electromagnet housing to use") + .addInfo("Better electromagnets give further bonuses") + .addInfo("With Tengam electromagnet, multiamp (NOT laser) hatches are allowed") + .addInfo( + AuthorFourIsTheNumber + EnumChatFormatting.GRAY + + " & " + + EnumChatFormatting.GOLD + + "Ba" + + EnumChatFormatting.LIGHT_PURPLE + + "ps") + .addSeparator() + .beginStructureBlock(7, 6, 7, false) + .addController("Front Center") + .addCasingInfoMin("MagTech Casings", MIN_CASING, false) + .addOtherStructurePart("Any glass", "x12") + .addOtherStructurePart("Magnetic Neodymium Frame Box", "x37") + .addOtherStructurePart("Electromagnet Housing", "1 Block Above/Behind Controller", 2) + .addInputBus("Any Casing", 1) + .addOutputBus("Any Casing", 1) + .addEnergyHatch("Any Casing", 1) + .addMaintenanceHatch("Any Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 5, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 5, 0, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + mMagHatch = null; + mExoticEnergyHatches.clear(); + mEnergyHatches.clear(); + + if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 5, 0)) return false; + if (mCasingAmount < MIN_CASING) return false; + if (mMagHatch == null) return false; + + // If there are exotic hatches, ensure there is only 1, and it is not laser. Only multiamp allowed + if (!mExoticEnergyHatches.isEmpty()) { + if (!mEnergyHatches.isEmpty()) return false; + if (mExoticEnergyHatches.size() > 1) return false; + if (mExoticEnergyHatches.get(0) + .maxWorkingAmperesIn() > 64) return false; + } + + // All checks passed! + return true; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + findMagnet(); + if (magnetTier != null) { + if (!mExoticEnergyHatches.isEmpty() && !magnetTier.supportsExotic) + return SimpleCheckRecipeResult.ofFailure("electromagnet_insufficient"); + euModifier = magnetTier.euModifier; + speedBoost = magnetTier.speedBoost; + return CheckRecipeResultRegistry.SUCCESSFUL; + } + return SimpleCheckRecipeResult.ofFailure("electromagnet_missing"); + } + }.setMaxParallelSupplier(this::getMaxParallels); + } + + private int getMaxParallels() { + if (magnetTier != null) return magnetTier.maxParallel; + return 0; + } + + @Override + public RecipeMap getRecipeMap() { + return (machineMode == MACHINEMODE_POLARIZER) ? RecipeMaps.polarizerRecipes + : RecipeMaps.electroMagneticSeparatorRecipes; + } + + @Nonnull + @Override + public Collection> getAvailableRecipeMaps() { + return Arrays.asList(RecipeMaps.polarizerRecipes, RecipeMaps.electroMagneticSeparatorRecipes); + } + + @Override + public int getRecipeCatalystPriority() { + return -10; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + if (aNBT.hasKey("polarizerMode")) { + machineMode = aNBT.getBoolean("polarizerMode") ? MACHINEMODE_POLARIZER : MACHINEMODE_SEPARATOR; + aNBT.removeTag("polarizerMode"); + } + super.loadNBTData(aNBT); + } + + @Override + public boolean supportsMachineModeSwitch() { + return true; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + setMachineMode(nextMachineMode()); + PlayerUtils.messagePlayer( + aPlayer, + String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); + } + + @Override + public void setMachineModeIcons() { + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_SEPARATOR); + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_POLARIZER); + } + + @Override + public String getMachineModeName() { + return StatCollector.translateToLocal("GT5U.INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR.mode." + machineMode); + } + + @Override + public void clearHatches() { + super.clearHatches(); + mExoticEnergyHatches.clear(); + } + + @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", machineMode); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + currentTip.add( + StatCollector.translateToLocal("GT5U.machines.oreprocessor1") + " " + + EnumChatFormatting.WHITE + + StatCollector + .translateToLocal("GT5U.INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR.mode." + tag.getInteger("mode")) + + EnumChatFormatting.RESET); + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + // This fix works for normal energy hatches, preventing over-paralleling with 1 energy hatch + // However, it does not work with multiamp. MuTEs can't come soon enough. + + if (mExoticEnergyHatches.isEmpty()) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } else super.setProcessingLogicPower(logic); + } + + private void findMagnet() { + magnetTier = null; + if (mMagHatch != null) { + ItemStack aSlot = mMagHatch.getStackInSlot(0); + if (aSlot != null) { + switch (aSlot.getItemDamage()) { + case 32345 -> magnetTier = MagnetTiers.Iron; + case 32346 -> magnetTier = MagnetTiers.Steel; + case 32347 -> magnetTier = MagnetTiers.Neodymium; + case 32348 -> magnetTier = MagnetTiers.Samarium; + case 32349 -> magnetTier = MagnetTiers.Tengam; + default -> magnetTier = null; + } + } + + } + } + + public static boolean isValidElectromagnet(ItemStack aMagnet) { + return aMagnet != null && aMagnet.getItem() instanceof MetaGeneratedItem01 + && aMagnet.getItemDamage() >= 32345 + && aMagnet.getItemDamage() <= 32349; + } + + private boolean addMagHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity != null) { + final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity instanceof MTEHatchMagnet) { + ((MTEHatchMagnet) aMetaTileEntity).updateTexture(aBaseCasingIndex); + if (mMagHatch == null) { + mMagHatch = (MTEHatchMagnet) aMetaTileEntity; + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialExtractor.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialExtractor.java new file mode 100644 index 0000000000..74d55d8e50 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialExtractor.java @@ -0,0 +1,289 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings4; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEIndustrialExtractor extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + (new String[][] { { " A ", " BBB ", "AB~BA", " BBB " }, { " A ", " BBB ", "AB BA", " BBB " }, + { " A ", " BBB ", "AB BA", " BBB " }, { " A ", " BBB ", "ABBBA", " BBB " }, + { " A ", " A ", "AAAAA", " " } })) + .addElement( + 'B', + buildHatchAdder(MTEIndustrialExtractor.class).atLeast(InputBus, OutputBus, Maintenance, Energy) + .casingIndex(((BlockCasings4) GregTechAPI.sBlockCasings4).getTextureIndex(1)) + .dot(1) + .buildAndChain( + onElementPass(MTEIndustrialExtractor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings4, 1)))) + .addElement( + 'A', + ofBlocksTiered( + MTEIndustrialExtractor::getItemPipeTierFromMeta, + ImmutableList.of( + Pair.of(GregTechAPI.sBlockCasings11, 0), + Pair.of(GregTechAPI.sBlockCasings11, 1), + Pair.of(GregTechAPI.sBlockCasings11, 2), + Pair.of(GregTechAPI.sBlockCasings11, 3), + Pair.of(GregTechAPI.sBlockCasings11, 4), + Pair.of(GregTechAPI.sBlockCasings11, 5), + Pair.of(GregTechAPI.sBlockCasings11, 6), + Pair.of(GregTechAPI.sBlockCasings11, 7)), + -2, + MTEIndustrialExtractor::setItemPipeTier, + MTEIndustrialExtractor::getItemPipeTier)) + .build(); + + private int itemPipeTier = 0; + + private static Integer getItemPipeTierFromMeta(Block block, Integer metaID) { + if (block != GregTechAPI.sBlockCasings11) return -1; + if (metaID < 0 || metaID > 7) return -1; + return metaID + 1; + } + + private void setItemPipeTier(int tier) { + itemPipeTier = tier; + } + + private int getItemPipeTier() { + return itemPipeTier; + } + + public MTEIndustrialExtractor(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEIndustrialExtractor(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEIndustrialExtractor(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings4, 1)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings4, 1)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings4, 1)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Extractor") + .addInfo("Controller Block for the Dissection Apparatus") + .addInfo("200% faster than single block machines of the same voltage") + .addInfo("Only uses 85% of the EU/t normally required") + .addInfo("Gains 8 parallels per tier of Item Pipe Casing") + .addInfo(AuthorFourIsTheNumber) + .addSeparator() + .beginStructureBlock(5, 4, 5, true) + .addController("Front Center") + .addCasingInfoMin("Stainless Steel Machine Casing", 24, false) + .addCasingInfoExactly("Item Pipe Casing", 19, true) + .addInputBus("Any Stainless Steel Casing", 1) + .addOutputBus("Any Stainless Steel Casing", 1) + .addEnergyHatch("Any Stainless Steel Casing", 1) + .addMaintenanceHatch("Any Stainless Steel Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 2, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 2, 0, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + itemPipeTier = -2; + + if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 2, 0)) return false; + return mCasingAmount >= 24; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic().setSpeedBonus(1F / 3F) + .setMaxParallelSupplier(this::getMaxParallelRecipes) + .setEuModifier(0.85F); + } + + public int getMaxParallelRecipes() { + return 8 * itemPipeTier; + } + + @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("maxParallelRecipes", getMaxParallelRecipes()); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + currentTip.add( + StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " + + EnumChatFormatting.WHITE + + tag.getInteger("maxParallelRecipes")); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.extractorRecipes; + } + + @Override + public int getRecipeCatalystPriority() { + return -10; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialLaserEngraver.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialLaserEngraver.java new file mode 100644 index 0000000000..e79244f881 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIndustrialLaserEngraver.java @@ -0,0 +1,605 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ENGRAVER_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.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.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import bartworks.API.BorosilicateGlass; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Textures; +import gregtech.api.enums.VoltageIndex; +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.MTEExtendedPowerMultiBlockBase; +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.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.LaserRenderingUtil; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings10; +import gregtech.common.tileentities.render.TileEntityLaser; +import gtPlusPlus.core.util.minecraft.PlayerUtils; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import tectech.thing.metaTileEntity.hatch.MTEHatchDynamoTunnel; + +public class MTEIndustrialLaserEngraver extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + (new String[][] { { " f ", " ", " ", " ", " a~a " }, + { " fsf ", " g ", " g ", "a g a", "aaraa" }, { "faaaf", "f f", "f f", "a a", "aaaaa" }, + { "aaaaa", "a a a", "a a a", "a a a", "aaaaa" }, { "aaaaa", "aaaaa", "aaaaa", "aaaaa", "aaaaa" } })) + .addElement( + 'a', + buildHatchAdder(MTEIndustrialLaserEngraver.class) + .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(1)) + .dot(1) + .buildAndChain( + onElementPass(MTEIndustrialLaserEngraver::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 1)))) + .addElement('f', ofFrame(Materials.TungstenSteel)) + .addElement( + 'g', + BorosilicateGlass + .ofBoroGlass((byte) 0, (byte) 1, Byte.MAX_VALUE, (te, t) -> te.glassTier = t, te -> te.glassTier)) + .addElement( + 'r', + LaserRenderingUtil + .ofBlockAdder(MTEIndustrialLaserEngraver::laserRendererAdder, GregTechAPI.sLaserRender, 0)) + .addElement( + 's', + buildHatchAdder(MTEIndustrialLaserEngraver.class).adder(MTEIndustrialLaserEngraver::addLaserSource) + .hatchClass(MTEHatchDynamoTunnel.class) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(1)) + .dot(3) + .build()) + .build(); + + protected TileEntityLaser renderer; + private byte glassTier = 0; + private MTEHatchDynamoTunnel laserSource = null; + private int laserAmps = 0; + private int laserTier = 0; + private String tierName = "LV"; + + private boolean addLaserSource(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity != null) { + final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity instanceof MTEHatchDynamoTunnel) { + laserSource = (MTEHatchDynamoTunnel) aMetaTileEntity; + laserSource.updateTexture(aBaseCasingIndex); + // Snap the laser source toward the plate. Player can rotate it if they want after but this will look + // nicer + switch (getRotation()) { + case NORMAL -> laserSource.getBaseMetaTileEntity() + .setFrontFacing(ForgeDirection.DOWN); + case UPSIDE_DOWN -> laserSource.getBaseMetaTileEntity() + .setFrontFacing(ForgeDirection.UP); + case CLOCKWISE -> laserSource.getBaseMetaTileEntity() + .setFrontFacing(getDirection().getRotation(ForgeDirection.UP)); + default -> laserSource.getBaseMetaTileEntity() + .setFrontFacing(getDirection().getRotation(ForgeDirection.DOWN)); + } + // Cube root the amperage to get the parallels + laserAmps = (int) Math.cbrt(laserSource.maxAmperesOut()); + laserTier = (int) laserSource.getOutputTier(); + tierName = GTValues.VN[laserTier]; + return true; + } + } + return false; + } + + private boolean laserRendererAdder(Block block, int meta, World world, int x, int y, int z) { + if (block != GregTechAPI.sLaserRender || world == null) { + return false; + } + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntityLaser) { + renderer = (TileEntityLaser) te; + renderer.setRotationFields(getDirection(), getRotation(), getFlip()); + return true; + } + return false; + } + + public MTEIndustrialLaserEngraver(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEIndustrialLaserEngraver(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEIndustrialLaserEngraver(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 1)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ENGRAVER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ENGRAVER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 1)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ENGRAVER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ENGRAVER_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 1)) }; + } + return rTexture; + } + + private boolean stopAllRendering = false; + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + stopAllRendering = !stopAllRendering; + if (stopAllRendering) { + PlayerUtils.messagePlayer(aPlayer, "Rendering off"); + if (renderer != null) renderer.setShouldRender(false); + } else PlayerUtils.messagePlayer(aPlayer, "Rendering on"); + } + + @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) { + GTUtility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn")); + } else { + GTUtility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff")); + } + return true; + } else { + if (renderer != null) { + renderer.realism = !renderer.realism; + PlayerUtils.messagePlayer(aPlayer, "Toggling realism!"); + return true; + } + } + return false; + } + + @Override + public void onDisableWorking() { + if (renderer != null) renderer.setShouldRender(false); + super.onDisableWorking(); + } + + @Override + public void onBlockDestroyed() { + if (renderer != null) renderer.setShouldRender(false); + super.onBlockDestroyed(); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Laser Engraver") + .addInfo("Controller Block for the Hyper-Intensity Laser Engraver") + .addInfo("200% faster than single block machines of the same voltage") + .addInfo("Uses 80% of the EU normally required") + .addInfo("Laser source hatch determines maximum recipe tier and parallels") + .addInfo("Parallels equal to the cube root of laser source amperage input") + .addInfo("Glass tier determines maximum laser source tier") + .addInfo("Only accepts borosilicate glass (no, really)") + .addInfo("UMV glass accepts all laser source hatches") + .addInfo("Use screwdriver to disable laser rendering") + .addInfo("Use wire cutter to toggle realism mode if you hate angled lasers") + .addInfo(AuthorFourIsTheNumber) + .addSeparator() + .beginStructureBlock(5, 5, 5, false) + .addController("Front Center") + .addCasingInfoMin("Laser Containment Casing", 45, false) + .addCasingInfoExactly("Tungstensteel Frame Box", 9, false) + .addOtherStructurePart("Laser Resistant Plate", "x1") + .addOtherStructurePart("Borosilicate Glass", "x3") + .addOtherStructurePart("Laser Source Hatch", "x1", 3) + .addInputBus("Any Casing", 1) + .addInputHatch("Any Casing", 1) + .addOutputBus("Any Casing", 1) + .addOutputHatch("Any Casing", 1) + .addEnergyHatch("Any Casing", 1) + .addMaintenanceHatch("Any Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 4, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 4, 0, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + mEnergyHatches.clear(); + + if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 4, 0)) return false; + if (mCasingAmount < 45) return false; + if (laserSource == null) return false; + if (renderer == null) return false; + if (glassTier < VoltageIndex.UMV && laserSource.mTier > glassTier) return false; + + return true; + } + + private static String getUniqueIdentifier(ItemStack is) { + return is.getItem() + .getUnlocalizedName() + is.getItemDamage(); + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + if (laserTier < VoltageIndex.UXV && recipe.mEUt > GTValues.V[laserTier]) { + return SimpleCheckRecipeResult.ofFailure("laser_insufficient"); + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @NotNull + @Override + protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) { + Colors c = Colors.Red; + for (int i = 0; i < recipe.mInputs.length; i++) { + String uid = getUniqueIdentifier(recipe.mInputs[i]); + if (lensColors.containsKey(uid)) { + c = lensColors.get(uid); + } + } + if (renderer != null) { + renderer.setColors(c.r, c.g, c.b); + if (!stopAllRendering) { + renderer.setShouldRender(true); + } + } + return super.onRecipeStart(recipe); + } + + @Override + public ProcessingLogic clear() { + if (renderer != null) renderer.setShouldRender(false); + return super.clear(); + } + }.setSpeedBonus(1F / 3F) + .setEuModifier(0.8F) + .setMaxParallelSupplier(this::getMaxParallelRecipes); + } + + @Override + public boolean isRotationChangeAllowed() { + return true; + } + + private int getMaxParallelRecipes() { + return laserAmps; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.laserEngraverRecipes; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public int getRecipeCatalystPriority() { + return -10; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setBoolean("stopAllRendering", stopAllRendering); + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + if (aNBT.hasKey("stopAllRendering")) { + stopAllRendering = aNBT.getBoolean("stopAllRendering"); + } + super.loadNBTData(aNBT); + } + + @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("laserAmps", laserAmps); + tag.setString("tierName", tierName); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + currentTip.add( + StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " + + EnumChatFormatting.WHITE + + tag.getInteger("laserAmps") + + EnumChatFormatting.RESET); + currentTip.add( + StatCollector.translateToLocal("GT5U.multiblock.maxtier") + ": " + + EnumChatFormatting.WHITE + + tag.getString("tierName") + + EnumChatFormatting.RESET); + } + + private enum Colors { + + White(1, 1, 1), + Red(1, 0, 0), + Green(0, 1, 0), + Blue(0, 0, 1), + Yellow(1, 1, 0), + Purple(1, 0, 1), + Cyan(0, 1, 1), + Orange(1, 0.5F, 0), + Black(0, 0, 0), + Brown(0.647F, 0.164F, 0.164F); + + final float r, g, b; + + Colors(float r, float g, float b) { + this.r = r; + this.g = g; + this.b = b; + } + } + + private static final Map lensColors; + static { + lensColors = new HashMap<>(); + + // Black lenses + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Forcicium, 1)), Colors.Black); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Forcillium, 1)), Colors.Black); + lensColors.put( + getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.InfusedEntropy, 1)), + Colors.Black); + + // White lenses + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.NetherStar, 1)), Colors.White); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 1)), Colors.White); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Glass, 1)), Colors.White); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1)), Colors.Cyan); + lensColors.put( + getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.InfusedOrder, 1)), + Colors.White); + + // Green lenses + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Emerald, 1)), Colors.Green); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Olivine, 1)), Colors.Green); + lensColors.put( + getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.GreenSapphire, 1)), + Colors.Green); + lensColors.put( + getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.InfusedEarth, 1)), + Colors.Green); + + // Red lenses + lensColors.put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Ruby, 1)), Colors.Red); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Firestone, 1)), Colors.Red); + lensColors.put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Jasper, 1)), Colors.Red); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.FoolsRuby, 1)), Colors.Red); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.GarnetRed, 1)), Colors.Red); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.InfusedFire, 1)), Colors.Red); + + // Blue lenses + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.BlueTopaz, 1)), Colors.Blue); + lensColors.put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Opal, 1)), Colors.Blue); + lensColors.put( + getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.InfusedWater, 1)), + Colors.Blue); + + // Yellow lenses + lensColors.put( + getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.GarnetYellow, 1)), + Colors.Yellow); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Force, 1)), Colors.Yellow); + lensColors.put( + getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.InfusedAir, 1)), + Colors.Yellow); + + // Purple lenses + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Amethyst, 1)), Colors.Purple); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Tanzanite, 1)), Colors.Purple); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Sapphire, 1)), Colors.Purple); + + // Cyan lenses + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.EnderEye, 1)), Colors.Cyan); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.EnderPearl, 1)), Colors.Cyan); + + // Orange lenses + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Topaz, 1)), Colors.Orange); + lensColors + .put(getUniqueIdentifier(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Amber, 1)), Colors.Orange); + + // Time to manually define a bunch of lenses based on id + lensColors.put("gt.bwMetaGeneratedlens1", Colors.Yellow); + lensColors.put("gt.bwMetaGeneratedlens4", Colors.White); + lensColors.put("gt.bwMetaGeneratedlens5", Colors.Black); + lensColors.put("gt.bwMetaGeneratedlens7", Colors.Green); + lensColors.put("gt.bwMetaGeneratedlens8", Colors.Green); + lensColors.put("gt.bwMetaGeneratedlens9", Colors.White); + lensColors.put("gt.bwMetaGeneratedlens19", Colors.Red); + lensColors.put("gt.bwMetaGeneratedlens20", Colors.White); + lensColors.put("gt.bwMetaGeneratedlens21", Colors.Brown); + lensColors.put("gt.bwMetaGeneratedlens22", Colors.Orange); + lensColors.put("gt.bwMetaGeneratedlens23", Colors.Black); + lensColors.put("gt.bwMetaGeneratedlens24", Colors.White); + lensColors.put("gt.bwMetaGeneratedlens25", Colors.Green); + lensColors.put("gt.bwMetaGeneratedlens35", Colors.Yellow); + lensColors.put("gt.bwMetaGeneratedlens36", Colors.Purple); + lensColors.put("gt.bwMetaGeneratedlens43", Colors.Green); + lensColors.put("gt.bwMetaGeneratedlens89", Colors.Green); + lensColors.put("gt.bwMetaGeneratedlens91", Colors.Purple); + lensColors.put("gt.bwMetaGeneratedlens10023", Colors.Red); + lensColors.put("gt.bwMetaGeneratedlens11499", Colors.Green); + lensColors.put("gt.bwMetaGeneratedlens11358", Colors.Red); + lensColors.put("MU-metaitem.0132140", Colors.Purple); + lensColors.put("MU-metaitem.0132140", Colors.Purple); + + // + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEIntegratedOreFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIntegratedOreFactory.java new file mode 100644 index 0000000000..25a54021fa --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEIntegratedOreFactory.java @@ -0,0 +1,827 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; +import static gregtech.api.enums.TickTime.SECOND; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEIntegratedOreFactory extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final int CASING_INDEX1 = 183; + private static final int CASING_INDEX2 = 49; + private static final int MAX_PARA = 1024; + private static final long RECIPE_EUT = 30; + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { + { " ", " ", " WWW ", " WWW ", " ", " " }, + { " ", " sss ", " sppps", " sppps", " sss ", " " }, + { " ", " sss ", " s s", " s s", " sss ", " " }, + { " ", " sss ", " sppps", " sppps", " sss ", " " }, + { " ", " sss ", " s s", " s s", " sss ", " " }, + { " ", " sss ", " sppps", " sppps", " sss ", " " }, + { "iiiiii ", "iIIIIiisssi", "iIIIIis s", "iIIIIis s", "iIIIIiisssi", "iiiiii " }, + { "iggggi ", "gt t isssi", "g xx sppps", "g xx sppps", "gt t isssi", "iggggi " }, + { "iggggi ", "gt t isssi", "g xx s s", "g xx s s", "gt t isssi", "iggggi " }, + { "iggggi ", "gt t is~si", "g xx spppO", "g xx spppO", "gt t isssi", "iggggi " }, + { "iggggi ", "gt t isssi", "g xx s O", "g xx s O", "gt t isssi", "iggggi " }, + { "EEEEEE ", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEE " } })) + .addElement('i', ofBlock(GregTechAPI.sBlockCasings8, 7)) + .addElement('s', ofBlock(GregTechAPI.sBlockCasings4, 1)) + .addElement('g', Glasses.chainAllGlasses()) + .addElement('x', ofBlock(GregTechAPI.sBlockCasings2, 3)) + .addElement('p', ofBlock(GregTechAPI.sBlockCasings2, 15)) + .addElement('t', ofFrame(Materials.TungstenSteel)) + .addElement( + 'E', + buildHatchAdder(MTEIntegratedOreFactory.class).atLeast(Energy, Maintenance) + .casingIndex(CASING_INDEX1) + .dot(1) + .buildAndChain(GregTechAPI.sBlockCasings8, 7)) + .addElement( + 'I', + buildHatchAdder(MTEIntegratedOreFactory.class).atLeast(InputBus) + .casingIndex(CASING_INDEX1) + .dot(2) + .buildAndChain(GregTechAPI.sBlockCasings8, 7)) + .addElement( + 'W', + buildHatchAdder(MTEIntegratedOreFactory.class).atLeast(InputHatch, Muffler) + .casingIndex(CASING_INDEX2) + .dot(3) + .buildAndChain(GregTechAPI.sBlockCasings4, 1)) + .addElement( + 'O', + buildHatchAdder(MTEIntegratedOreFactory.class).atLeast(OutputBus, OutputHatch) + .casingIndex(CASING_INDEX2) + .dot(4) + .buildAndChain(GregTechAPI.sBlockCasings4, 1)) + .build(); + + private static final HashSet isCrushedOre = new HashSet<>(); + private static final HashSet isCrushedPureOre = new HashSet<>(); + private static final HashSet isPureDust = new HashSet<>(); + private static final HashSet isImpureDust = new HashSet<>(); + private static final HashSet isThermal = new HashSet<>(); + private static final HashSet isOre = new HashSet<>(); + private static boolean isInit = false; + private ItemStack[] sMidProduct; + private int sMode = 0; + private boolean sVoidStone = false; + private int currentParallelism = 0; + + private static void initHash() { + for (String name : OreDictionary.getOreNames()) { + if (name == null || name.isEmpty()) continue; + if (name.startsWith("crushedPurified")) { + for (ItemStack stack : OreDictionary.getOres(name)) { + isCrushedPureOre.add(GTUtility.stackToInt(stack)); + } + } else if (name.startsWith("crushedCentrifuged")) { + for (ItemStack stack : OreDictionary.getOres(name)) { + isThermal.add(GTUtility.stackToInt(stack)); + } + } else if (name.startsWith("crushed")) { + for (ItemStack stack : OreDictionary.getOres(name)) { + isCrushedOre.add(GTUtility.stackToInt(stack)); + } + } else if (name.startsWith("dustImpure")) { + for (ItemStack stack : OreDictionary.getOres(name)) { + isImpureDust.add(GTUtility.stackToInt(stack)); + } + } else if (name.startsWith("dustPure")) { + for (ItemStack stack : OreDictionary.getOres(name)) { + isPureDust.add(GTUtility.stackToInt(stack)); + } + } else if (name.startsWith("ore")) { + for (ItemStack stack : OreDictionary.getOres(name)) { + isOre.add(GTUtility.stackToInt(stack)); + } + } else if (name.startsWith("rawOre")) { + for (ItemStack stack : OreDictionary.getOres(name)) { + isOre.add(GTUtility.stackToInt(stack)); + } + } + } + } + + public MTEIntegratedOreFactory(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEIntegratedOreFactory(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Ore Processor") + .addInfo("Controller Block for the Integrated Ore Factory") + .addInfo("It is OP. I mean ore processor.") + .addInfo("Do all ore processing in one step.") + .addInfo("Can process up to 1024 ores at a time.") + .addInfo("Every ore costs 30EU/t, 2L lubricant, 200L distilled water.") + .addInfo("Processing time is dependent on mode.") + .addInfo("Use a screwdriver to switch mode.") + .addInfo("Sneak click with screwdriver to void the stone dust.") + .addSeparator() + .beginStructureBlock(6, 12, 11, false) + .addController("The third layer") + .addStructureInfo("128 Advanced Iridium Plated Machine Casing") + .addStructureInfo("105 Clean Stainless Steel Machine Casing") + .addStructureInfo("48 Reinforced Glass") + .addStructureInfo("30 Tungstensteel Pipe Casing") + .addStructureInfo("16 Tungstensteel Frame Box") + .addStructureInfo("16 Steel Gear Box Casing") + .addEnergyHatch("Any bottom Casing", 1) + .addMaintenanceHatch("Any bottom Casing", 1) + .addInputBus("Input ore/crushed ore", 2) + .addInputHatch("Input lubricant/distilled water/washing chemicals", 3) + .addMufflerHatch("Output Pollution", 3) + .addOutputBus("Output products", 4) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped(); + } + + @Override + public void construct(ItemStack itemStack, boolean b) { + buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 8, 9, 1); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 8, 9, 1, elementBudget, env, false, true); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + private static int getTime(int mode) { + return switch (mode) { + case 0 -> 30 * SECOND; + case 1 -> 15 * SECOND; + case 2 -> 10 * SECOND; + case 3 -> 20 * SECOND; + case 4 -> 17 * SECOND; + default -> + // go to hell + 1000000000; + }; + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + if (!isInit) { + initHash(); + isInit = true; + } + + List tInput = getStoredInputs(); + List tInputFluid = getStoredFluids(); + long availableEUt = GTUtility.roundUpVoltage(getMaxInputVoltage()); + if (availableEUt < RECIPE_EUT) { + return CheckRecipeResultRegistry.insufficientPower(RECIPE_EUT); + } + if (tInput.isEmpty() || tInputFluid.isEmpty()) { + return CheckRecipeResultRegistry.NO_RECIPE; + } + + int maxParallel = MAX_PARA; + int originalMaxParallel = maxParallel; + + OverclockCalculator calculator = new OverclockCalculator().setEUt(availableEUt) + .setRecipeEUt(RECIPE_EUT) + .setDuration(getTime(sMode)) + .setParallel(originalMaxParallel); + + double tickTimeAfterOC = calculator.calculateDurationUnderOneTick(); + + if (tickTimeAfterOC < 1) { + maxParallel = GTUtility.safeInt((long) (maxParallel / tickTimeAfterOC), 0); + } + + int maxParallelBeforeBatchMode = maxParallel; + if (isBatchModeEnabled()) { + maxParallel = GTUtility.safeInt((long) maxParallel * getMaxBatchSize(), 0); + } + + int currentParallel = (int) Math.min(maxParallel, availableEUt / RECIPE_EUT); + // Calculate parallel by fluids + int tLube = 0; + int tWater = 0; + for (FluidStack fluid : tInputFluid) { + if (fluid != null && fluid.equals(GTModHandler.getDistilledWater(1L))) { + tWater += fluid.amount; + } else if (fluid != null && fluid.equals(Materials.Lubricant.getFluid(1L))) { + tLube += fluid.amount; + } + } + currentParallel = Math.min(currentParallel, tLube / 2); + currentParallel = Math.min(currentParallel, tWater / 200); + if (currentParallel <= 0) { + return CheckRecipeResultRegistry.NO_RECIPE; + } + + // Calculate parallel by items + int itemParallel = 0; + for (ItemStack ore : tInput) { + int tID = GTUtility.stackToInt(ore); + if (tID == 0) continue; + if (isPureDust.contains(tID) || isImpureDust.contains(tID) + || isCrushedPureOre.contains(tID) + || isThermal.contains(tID) + || isCrushedOre.contains(tID) + || isOre.contains(tID)) { + if (itemParallel + ore.stackSize <= currentParallel) { + itemParallel += ore.stackSize; + } else { + itemParallel = currentParallel; + break; + } + } + } + currentParallel = itemParallel; + int currentParallelBeforeBatchMode = Math.min(currentParallel, maxParallelBeforeBatchMode); + + calculator.setCurrentParallel(currentParallelBeforeBatchMode) + .calculate(); + + double batchMultiplierMax = 1; + // In case batch mode enabled + if (currentParallel > maxParallelBeforeBatchMode && calculator.getDuration() < getMaxBatchSize()) { + batchMultiplierMax = (double) getMaxBatchSize() / calculator.getDuration(); + batchMultiplierMax = Math.min(batchMultiplierMax, (double) currentParallel / maxParallelBeforeBatchMode); + } + + int finalParallel = (int) (batchMultiplierMax * maxParallelBeforeBatchMode); + + // for scanner + setCurrentParallelism(finalParallel); + + // Consume fluids + depleteInput(GTModHandler.getDistilledWater(finalParallel * 200L)); + depleteInput(Materials.Lubricant.getFluid(finalParallel * 2L)); + + // Consume items and generate outputs + List tOres = new ArrayList<>(); + int remainingCost = finalParallel; + for (ItemStack ore : tInput) { + int tID = GTUtility.stackToInt(ore); + if (tID == 0) continue; + if (isPureDust.contains(tID) || isImpureDust.contains(tID) + || isCrushedPureOre.contains(tID) + || isThermal.contains(tID) + || isCrushedOre.contains(tID) + || isOre.contains(tID)) { + if (remainingCost >= ore.stackSize) { + tOres.add(GTUtility.copy(ore)); + remainingCost -= ore.stackSize; + ore.stackSize = 0; + } else { + tOres.add(GTUtility.copyAmountUnsafe(remainingCost, ore)); + ore.stackSize -= remainingCost; + break; + } + } + } + sMidProduct = tOres.toArray(new ItemStack[0]); + switch (sMode) { + case 0 -> { + doMac(isOre); + doWash(isCrushedOre); + doThermal(isCrushedPureOre, isCrushedOre); + doMac(isThermal, isOre, isCrushedOre, isCrushedPureOre); + } + case 1 -> { + doMac(isOre); + doWash(isCrushedOre); + doMac(isOre, isCrushedOre, isCrushedPureOre); + doCentrifuge(isImpureDust, isPureDust); + } + case 2 -> { + doMac(isOre); + doMac(isThermal, isOre, isCrushedOre, isCrushedPureOre); + doCentrifuge(isImpureDust, isPureDust); + } + case 3 -> { + doMac(isOre); + doWash(isCrushedOre); + doSift(isCrushedPureOre); + } + case 4 -> { + doMac(isOre); + doChemWash(isCrushedOre, isCrushedPureOre); + doMac(isCrushedOre, isCrushedPureOre); + doCentrifuge(isImpureDust, isPureDust); + } + default -> { + return CheckRecipeResultRegistry.NO_RECIPE; + } + } + + this.mEfficiency = 10000 - (getIdealStatus() - getRepairStatus()) * 1000; + this.mEfficiencyIncrease = 10000; + this.mOutputItems = sMidProduct; + this.mMaxProgresstime = (int) (calculator.getDuration() * batchMultiplierMax); + this.lEUt = calculator.getConsumption(); + if (this.lEUt > 0) { + this.lEUt = -this.lEUt; + } + this.updateSlots(); + + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @SafeVarargs + private boolean checkTypes(int aID, HashSet... aTables) { + for (HashSet set : aTables) { + if (set.contains(aID)) { + return true; + } + } + return false; + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) { + sVoidStone = !sVoidStone; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", sVoidStone)); + return; + } + sMode = (sMode + 1) % 5; + List des = getDisplayMode(sMode); + GTUtility.sendChatToPlayer(aPlayer, String.join("", des)); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + sMode = aNBT.getInteger("ssMode"); + sVoidStone = aNBT.getBoolean("ssStone"); + currentParallelism = aNBT.getInteger("currentParallelism"); + super.loadNBTData(aNBT); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("ssMode", sMode); + aNBT.setBoolean("ssStone", sVoidStone); + aNBT.setInteger("currentParallelism", currentParallelism); + super.saveNBTData(aNBT); + } + + @SafeVarargs + private void doMac(HashSet... aTables) { + List tProduct = new ArrayList<>(); + if (sMidProduct != null) { + for (ItemStack aStack : sMidProduct) { + int tID = GTUtility.stackToInt(aStack); + if (checkTypes(tID, aTables)) { + GTRecipe tRecipe = RecipeMaps.maceratorRecipes + .findRecipe(getBaseMetaTileEntity(), false, GTValues.V[15], null, aStack); + if (tRecipe != null) { + tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); + } else { + tProduct.add(aStack); + } + } else { + tProduct.add(aStack); + } + } + } + doCompress(tProduct); + } + + @SafeVarargs + private void doWash(HashSet... aTables) { + List tProduct = new ArrayList<>(); + if (sMidProduct != null) { + for (ItemStack aStack : sMidProduct) { + int tID = GTUtility.stackToInt(aStack); + if (checkTypes(tID, aTables)) { + GTRecipe tRecipe = RecipeMaps.oreWasherRecipes.findRecipe( + getBaseMetaTileEntity(), + false, + GTValues.V[15], + new FluidStack[] { GTModHandler.getDistilledWater(Integer.MAX_VALUE) }, + aStack); + if (tRecipe != null) { + tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); + } else { + tProduct.add(aStack); + } + } else { + tProduct.add(aStack); + } + } + } + doCompress(tProduct); + } + + @SafeVarargs + private void doThermal(HashSet... aTables) { + List tProduct = new ArrayList<>(); + if (sMidProduct != null) { + for (ItemStack aStack : sMidProduct) { + int tID = GTUtility.stackToInt(aStack); + if (checkTypes(tID, aTables)) { + GTRecipe tRecipe = RecipeMaps.thermalCentrifugeRecipes + .findRecipe(getBaseMetaTileEntity(), false, GTValues.V[15], null, aStack); + if (tRecipe != null) { + tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); + } else { + tProduct.add(aStack); + } + } else { + tProduct.add(aStack); + } + } + } + doCompress(tProduct); + } + + @SafeVarargs + private void doCentrifuge(HashSet... aTables) { + List tProduct = new ArrayList<>(); + if (sMidProduct != null) { + for (ItemStack aStack : sMidProduct) { + int tID = GTUtility.stackToInt(aStack); + if (checkTypes(tID, aTables)) { + GTRecipe tRecipe = RecipeMaps.centrifugeRecipes + .findRecipe(getBaseMetaTileEntity(), false, GTValues.V[15], null, aStack); + if (tRecipe != null) { + tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); + } else { + tProduct.add(aStack); + } + } else { + tProduct.add(aStack); + } + } + } + doCompress(tProduct); + } + + @SafeVarargs + private void doSift(HashSet... aTables) { + List tProduct = new ArrayList<>(); + if (sMidProduct != null) { + for (ItemStack aStack : sMidProduct) { + int tID = GTUtility.stackToInt(aStack); + if (checkTypes(tID, aTables)) { + GTRecipe tRecipe = RecipeMaps.sifterRecipes + .findRecipe(getBaseMetaTileEntity(), false, GTValues.V[15], null, aStack); + if (tRecipe != null) { + tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize)); + } else { + tProduct.add(aStack); + } + } else { + tProduct.add(aStack); + } + } + } + doCompress(tProduct); + } + + @SafeVarargs + private void doChemWash(HashSet... aTables) { + List tProduct = new ArrayList<>(); + if (sMidProduct != null) { + for (ItemStack aStack : sMidProduct) { + int tID = GTUtility.stackToInt(aStack); + if (checkTypes(tID, aTables)) { + GTRecipe tRecipe = RecipeMaps.chemicalBathRecipes.findRecipe( + getBaseMetaTileEntity(), + false, + GTValues.V[15], + getStoredFluids().toArray(new FluidStack[0]), + aStack); + if (tRecipe != null && tRecipe.getRepresentativeFluidInput(0) != null) { + FluidStack tInputFluid = tRecipe.getRepresentativeFluidInput(0) + .copy(); + int tStored = getFluidAmount(tInputFluid); + int tWashed = Math.min(tStored / tInputFluid.amount, aStack.stackSize); + depleteInput(new FluidStack(tInputFluid.getFluid(), tWashed * tInputFluid.amount)); + tProduct.addAll(getOutputStack(tRecipe, tWashed)); + if (tWashed < aStack.stackSize) { + tProduct.add(GTUtility.copyAmountUnsafe(aStack.stackSize - tWashed, aStack)); + } + } else { + tProduct.add(aStack); + } + } else { + tProduct.add(aStack); + } + } + } + doCompress(tProduct); + } + + private int getFluidAmount(FluidStack aFluid) { + int tAmt = 0; + if (aFluid == null) return 0; + for (FluidStack fluid : getStoredFluids()) { + if (aFluid.isFluidEqual(fluid)) { + tAmt += fluid.amount; + } + } + return tAmt; + } + + private List getOutputStack(GTRecipe aRecipe, int aTime) { + List tOutput = new ArrayList<>(); + for (int i = 0; i < aRecipe.mOutputs.length; i++) { + if (aRecipe.getOutput(i) == null) { + continue; + } + int tChance = aRecipe.getOutputChance(i); + if (tChance == 10000) { + tOutput.add(GTUtility.copyAmountUnsafe(aTime * aRecipe.getOutput(i).stackSize, aRecipe.getOutput(i))); + } else { + // Use Normal Distribution + double u = aTime * (tChance / 10000D); + double e = aTime * (tChance / 10000D) * (1 - (tChance / 10000D)); + Random random = new Random(); + int tAmount = (int) Math.ceil(Math.sqrt(e) * random.nextGaussian() + u); + tOutput.add(GTUtility.copyAmountUnsafe(tAmount * aRecipe.getOutput(i).stackSize, aRecipe.getOutput(i))); + } + } + return tOutput.stream() + .filter(i -> (i != null && i.stackSize > 0)) + .collect(Collectors.toList()); + } + + private void doCompress(List aList) { + HashMap rProduct = new HashMap<>(); + for (ItemStack stack : aList) { + int tID = GTUtility.stackToInt(stack); + if (sVoidStone) { + if (GTUtility.areStacksEqual(Materials.Stone.getDust(1), stack)) { + continue; + } + } + if (tID != 0) { + if (rProduct.containsKey(tID)) { + rProduct.put(tID, rProduct.get(tID) + stack.stackSize); + } else { + rProduct.put(tID, stack.stackSize); + } + } + } + sMidProduct = new ItemStack[rProduct.size()]; + int cnt = 0; + for (Integer id : rProduct.keySet()) { + ItemStack stack = GTUtility.intToStack(id); + sMidProduct[cnt] = GTUtility.copyAmountUnsafe(rProduct.get(id), stack); + cnt++; + } + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + return checkPiece(STRUCTURE_PIECE_MAIN, 8, 9, 1) && mMaintenanceHatches.size() <= 1 + && !mMufflerHatches.isEmpty(); + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return 200; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEIntegratedOreFactory(mName); + } + + private void setCurrentParallelism(int parallelism) { + this.currentParallelism = parallelism; + } + + private int getCurrentParallelism() { + return this.currentParallelism; + } + + @Override + public String[] getInfoData() { + List informationData = new ArrayList<>(Arrays.asList(super.getInfoData())); + String parallelism = StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " + + EnumChatFormatting.BLUE + + getCurrentParallelism() + + EnumChatFormatting.RESET; + informationData.add(parallelism); + informationData.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", sVoidStone)); + informationData.addAll(getDisplayMode(sMode)); + return informationData.toArray(new String[0]); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2) }; + } + + private static List getDisplayMode(int mode) { + final EnumChatFormatting AQUA = EnumChatFormatting.AQUA; + final String CRUSH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Macerate"); + final String WASH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Ore_Washer") + .replace(" ", " " + AQUA); + final String THERMAL = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Thermal_Centrifuge") + .replace(" ", " " + AQUA); + final String CENTRIFUGE = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Centrifuge"); + final String SIFTER = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Sifter"); + final String CHEM_WASH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Chemical_Bathing") + .replace(" ", " " + AQUA); + final String ARROW = " " + AQUA + "-> "; + + List des = new ArrayList<>(); + des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor1") + " "); + + switch (mode) { + case 0 -> { + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + WASH + ARROW); + des.add(AQUA + THERMAL + ARROW); + des.add(AQUA + CRUSH + ' '); + } + case 1 -> { + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + WASH + ARROW); + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + CENTRIFUGE + ' '); + } + case 2 -> { + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + CENTRIFUGE + ' '); + } + case 3 -> { + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + WASH + ARROW); + des.add(AQUA + SIFTER + ' '); + } + case 4 -> { + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + CHEM_WASH + ARROW); + des.add(AQUA + CRUSH + ARROW); + des.add(AQUA + CENTRIFUGE + ' '); + } + default -> des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.WRONG_MODE")); + } + + des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor2", getTime(mode) / 20)); + + return des; + + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currenttip, accessor, config); + NBTTagCompound tag = accessor.getNBTData(); + + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " + + EnumChatFormatting.BLUE + + tag.getInteger("currentParallelism") + + EnumChatFormatting.RESET); + currenttip.addAll(getDisplayMode(tag.getInteger("ssMode"))); + currenttip + .add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", tag.getBoolean("ssStone"))); + + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + tag.setInteger("ssMode", sMode); + tag.setBoolean("ssStone", sVoidStone); + tag.setInteger("currentParallelism", currentParallelism); + } + + @Override + public boolean supportsBatchMode() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoiler.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoiler.java new file mode 100644 index 0000000000..4d4025d7d4 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoiler.java @@ -0,0 +1,503 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.STEAM_PER_WATER; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.ItemList.Circuit_Integrated; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTUtility.formatNumbers; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.GTMod; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Textures; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.maps.LargeBoilerFuelBackend; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public abstract class MTELargeBoiler extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { + + @Override + protected IStructureDefinition computeValue(Class type) { + return StructureDefinition.builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { "ccc", "ccc", "ccc" }, { "ccc", "cPc", "ccc" }, { "ccc", "cPc", "ccc" }, + { "ccc", "cPc", "ccc" }, { "f~f", "fff", "fff" }, })) + .addElement('P', lazy(t -> ofBlock(t.getPipeBlock(), t.getPipeMeta()))) + .addElement( + 'c', + lazy( + t -> buildHatchAdder(MTELargeBoiler.class).atLeast(OutputHatch) + .casingIndex(t.getCasingTextureIndex()) + .dot(2) + .buildAndChain( + onElementPass( + MTELargeBoiler::onCasingAdded, + ofBlock(t.getCasingBlock(), t.getCasingMeta()))))) + .addElement( + 'f', + lazy( + t -> buildHatchAdder(MTELargeBoiler.class).atLeast(Maintenance, InputHatch, InputBus, Muffler) + .casingIndex(t.getFireboxTextureIndex()) + .dot(1) + .buildAndChain( + onElementPass( + MTELargeBoiler::onFireboxAdded, + ofBlock(t.getFireboxBlock(), t.getFireboxMeta()))))) + .build(); + } + }; + private boolean firstRun = true; + private int mSuperEfficencyIncrease = 0; + private int integratedCircuitConfig = 0; // Steam output is reduced by 1000L per config + private int excessWater = 0; // Eliminate rounding errors for water + private int excessFuel = 0; // Eliminate rounding errors for fuels that burn half items + private int excessProjectedEU = 0; // Eliminate rounding errors from throttling the boiler + private int mCasingAmount; + private int mFireboxAmount; + protected int pollutionPerSecond = 1; // placeholder for the child classes + + public MTELargeBoiler(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeBoiler(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + + tt.addMachineType("Boiler") + .addInfo("Controller block for the Large " + getCasingMaterial() + " Boiler"); + // Tooltip differs between the boilers that output Superheated Steam (Titanium and Tungstensteel) and the ones + // that do not (Bronze and Steel) + if (isSuperheated()) { + tt.addInfo( + "Produces " + formatNumbers((getEUt() * 40) * ((runtimeBoost(20) / (20f)) / superToNormalSteam)) + + "L of Superheated Steam with 1 Coal at " + + formatNumbers((getEUt() * 40L) / superToNormalSteam) + + "L/s") // ? + .addInfo("A programmed circuit in the main block throttles the boiler (-1000L/s per config)") + .addInfo("Only some solid fuels are allowed (check the NEI Large Boiler tab for details)") + .addInfo("If there are any disallowed fuels in the input bus, the boiler won't run!"); + } else { + tt.addInfo( + "Produces " + formatNumbers((getEUt() * 40) * (runtimeBoost(20) / 20f)) + + "L of Steam with 1 Coal at " + + formatNumbers(getEUt() * 40L) + + "L/s") // ? + .addInfo("A programmed circuit in the main block throttles the boiler (-1000L/s per config)") + .addInfo("Solid Fuels with a burn value that is too high or too low will not work"); + } + tt.addInfo( + String.format( + "Diesel fuels have 1/4 efficiency - Takes %s seconds to heat up", + formatNumbers(500.0 / getEfficiencyIncrease()))) // ? check semifluid again + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 5, 3, false) + .addController("Front bottom") + .addCasingInfoRange(getCasingMaterial() + " " + getCasingBlockType() + " Casing", 24, 31, false) // ? + .addOtherStructurePart(getCasingMaterial() + " Fire Boxes", "Bottom layer, 3 minimum") + .addOtherStructurePart(getCasingMaterial() + " Pipe Casing Blocks", "Inner 3 blocks") + .addMaintenanceHatch("Any firebox", 1) + .addMufflerHatch("Any firebox", 1) + .addInputBus("Solid fuel, Any firebox", 1) + .addInputHatch("Liquid fuel, Any firebox", 1) + .addStructureInfo("You can use either, or both") + .addInputHatch("Water, Any firebox", 1) + .addOutputHatch("Steam, any casing", 2) + .toolTipFinisher("Gregtech"); + + return tt; + } + + public abstract String getCasingMaterial(); + + public abstract Block getCasingBlock(); + + public abstract String getCasingBlockType(); + + public abstract byte getCasingMeta(); + + public abstract byte getCasingTextureIndex(); + + public abstract Block getPipeBlock(); + + public abstract byte getPipeMeta(); + + public abstract Block getFireboxBlock(); + + public abstract byte getFireboxMeta(); + + public abstract byte getFireboxTextureIndex(); + + public abstract int getEUt(); + + public abstract int getEfficiencyIncrease(); + + public int getIntegratedCircuitConfig() { + return integratedCircuitConfig; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + // allows for 0 pollution if circuit throttle is too high + return Math.max( + 0, + (int) (pollutionPerSecond + * (1 - GTMod.gregtechproxy.mPollutionReleasedByThrottle * getIntegratedCircuitConfig()))); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { BlockIcons.getCasingTextureForId(getCasingTextureIndex()), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_BOILER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { BlockIcons.getCasingTextureForId(getCasingTextureIndex()), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_BOILER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_BOILER_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()) }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + boolean isFuelValid() { + if (!isSuperheated()) return true; + for (ItemStack input : getStoredInputs()) { + if (!LargeBoilerFuelBackend.isAllowedSolidFuel(input) + && !Circuit_Integrated.isStackEqual(input, true, true)) { + // if any item is not in ALLOWED_SOLID_FUELS, operation cannot be allowed because it might still be + // consumed + this.mMaxProgresstime = 0; + this.mEUt = 0; + return false; + } + } + return true; + } + + @Override + public RecipeMap getRecipeMap() { + // Only for visual + return RecipeMaps.largeBoilerFakeFuels; + } + + @Override + protected boolean filtersFluid() { + return false; + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + if (!isFuelValid()) return CheckRecipeResultRegistry.NO_FUEL_FOUND; + // Do we have an integrated circuit with a valid configuration? + if (Circuit_Integrated.isStackEqual(mInventory[1], true, true)) { + int circuit_config = mInventory[1].getItemDamage(); + if (circuit_config >= 1 && circuit_config <= 25) { + // If so, overwrite the current config + this.integratedCircuitConfig = circuit_config; + } + } else { + // If not, set the config to zero + this.integratedCircuitConfig = 0; + } + + this.mSuperEfficencyIncrease = 0; + if (!isSuperheated()) { + for (GTRecipe tRecipe : RecipeMaps.dieselFuels.getAllRecipes()) { + FluidStack tFluid = GTUtility.getFluidForFilledItem(tRecipe.getRepresentativeInput(0), true); + if (tFluid != null && tRecipe.mSpecialValue > 1) { + tFluid.amount = 1000; + if (depleteInput(tFluid)) { + this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(tRecipe.mSpecialValue / 2)); + this.mEUt = adjustEUtForConfig(getEUt()); + this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease() * 4; + return CheckRecipeResultRegistry.SUCCESSFUL; + } + } + } + for (GTRecipe tRecipe : RecipeMaps.denseLiquidFuels.getAllRecipes()) { + FluidStack tFluid = GTUtility.getFluidForFilledItem(tRecipe.getRepresentativeInput(0), true); + if (tFluid != null) { + tFluid.amount = 1000; + if (depleteInput(tFluid)) { + this.mMaxProgresstime = adjustBurnTimeForConfig( + Math.max(1, runtimeBoost(tRecipe.mSpecialValue * 2))); + this.mEUt = adjustEUtForConfig(getEUt()); + this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease(); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + } + } + } + + ArrayList tInputList = getStoredInputs(); + if (!tInputList.isEmpty()) { + if (isSuperheated()) { + for (ItemStack tInput : tInputList) { + if (tInput != GTOreDictUnificator.get(OrePrefixes.bucket, Materials.Lava, 1)) { + if (GTUtility.getFluidForFilledItem(tInput, true) == null + && (this.mMaxProgresstime = GTModHandler.getFuelValue(tInput) / 80) > 0) { + this.excessFuel += GTModHandler.getFuelValue(tInput) % 80; + this.mMaxProgresstime += this.excessFuel / 80; + this.excessFuel %= 80; + this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(this.mMaxProgresstime)); + this.mEUt = adjustEUtForConfig(getEUt()); + this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease(); + this.mOutputItems = new ItemStack[] { GTUtility.getContainerItem(tInput, true) }; + tInput.stackSize -= 1; + updateSlots(); + if (this.mEfficiencyIncrease > 5000) { + this.mEfficiencyIncrease = 0; + this.mSuperEfficencyIncrease = 20; + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + } + } + } else { + for (ItemStack tInput : tInputList) { + if (tInput != GTOreDictUnificator.get(OrePrefixes.bucket, Materials.Lava, 1)) { + // Solid fuels with burn values below getEUt are ignored (mostly items like sticks), and also + // those with very high fuel values that would cause an overflow error. + if (GTUtility.getFluidForFilledItem(tInput, true) == null + && (this.mMaxProgresstime = GTModHandler.getFuelValue(tInput) / 80) > 0 + && (GTModHandler.getFuelValue(tInput) * 2 / this.getEUt()) > 1 + && GTModHandler.getFuelValue(tInput) < 100000000) { + this.excessFuel += GTModHandler.getFuelValue(tInput) % 80; + this.mMaxProgresstime += this.excessFuel / 80; + this.excessFuel %= 80; + this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(this.mMaxProgresstime)); + this.mEUt = adjustEUtForConfig(getEUt()); + this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease(); + this.mOutputItems = new ItemStack[] { GTUtility.getContainerItem(tInput, true) }; + tInput.stackSize -= 1; + updateSlots(); + if (this.mEfficiencyIncrease > 5000) { + this.mEfficiencyIncrease = 0; + this.mSuperEfficencyIncrease = 20; + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + } + } + } + } + this.mMaxProgresstime = 0; + this.mEUt = 0; + return CheckRecipeResultRegistry.NO_FUEL_FOUND; + } + + abstract int runtimeBoost(int mTime); + + abstract boolean isSuperheated(); + + private final int superToNormalSteam = 3; + + @Override + public boolean onRunningTick(ItemStack aStack) { + if (this.mEUt > 0) { + if (this.mSuperEfficencyIncrease > 0) mEfficiency = Math.max( + 0, + Math.min( + mEfficiency + mSuperEfficencyIncrease, + getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000))); + int tGeneratedEU = (int) (this.mEUt * 2L * this.mEfficiency / 10000L); + if (tGeneratedEU > 0) { + long amount = (tGeneratedEU + STEAM_PER_WATER) / STEAM_PER_WATER; + excessWater += amount * STEAM_PER_WATER - tGeneratedEU; + amount -= excessWater / STEAM_PER_WATER; + excessWater %= STEAM_PER_WATER; + startRecipeProcessing(); + if (isSuperheated()) { + // Consumes only one third of the water if producing Superheated Steam, to maintain water in the + // chain. + if (depleteInput(Materials.Water.getFluid(amount / superToNormalSteam)) + || depleteInput(GTModHandler.getDistilledWater(amount / superToNormalSteam))) { + // Outputs Superheated Steam instead of Steam, at one third of the amount (equivalent in power + // output to the normal Steam amount). + addOutput( + FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU / superToNormalSteam)); + } else { + GTLog.exp.println("Boiler " + this.mName + " had no Water!"); + explodeMultiblock(); + } + } else { + if (depleteInput(Materials.Water.getFluid(amount)) + || depleteInput(GTModHandler.getDistilledWater(amount))) { + addOutput(GTModHandler.getSteam(tGeneratedEU)); + } else { + GTLog.exp.println("Boiler " + this.mName + " had no Water!"); + explodeMultiblock(); + } + } + endRecipeProcessing(); + } + return true; + } + return true; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("excessFuel", excessFuel); + aNBT.setInteger("excessWater", excessWater); + aNBT.setInteger("excessProjectedEU", excessProjectedEU); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + excessFuel = aNBT.getInteger("excessFuel"); + excessWater = aNBT.getInteger("excessWater"); + excessProjectedEU = aNBT.getInteger("excessProjectedEU"); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (mProgresstime > 0 && firstRun) { + firstRun = false; + GTMod.achievements.issueAchievement( + aBaseMetaTileEntity.getWorld() + .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), + "extremepressure"); + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION.get(getClass()); + } + + private void onCasingAdded() { + mCasingAmount++; + } + + private void onFireboxAdded() { + mFireboxAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + mFireboxAmount = 0; + return checkPiece(STRUCTURE_PIECE_MAIN, 1, 4, 0) && mCasingAmount >= 24 + && mFireboxAmount >= 3 + && mMaintenanceHatches.size() == 1 + && !mMufflerHatches.isEmpty(); + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + private int adjustEUtForConfig(int rawEUt) { + int adjustedSteamOutput = rawEUt - (isSuperheated() ? 75 : 25) * integratedCircuitConfig; + return Math.max(adjustedSteamOutput, 25); + } + + private int adjustBurnTimeForConfig(int rawBurnTime) { + if (mEfficiency < getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000)) { + return rawBurnTime; + } + int adjustedEUt = Math.max(25, getEUt() - (isSuperheated() ? 75 : 25) * integratedCircuitConfig); + int adjustedBurnTime = rawBurnTime * getEUt() / adjustedEUt; + this.excessProjectedEU += getEUt() * rawBurnTime - adjustedEUt * adjustedBurnTime; + adjustedBurnTime += this.excessProjectedEU / adjustedEUt; + this.excessProjectedEU %= adjustedEUt; + return adjustedBurnTime; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 4, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 4, 0, elementBudget, env, false, true); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerBronze.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerBronze.java new file mode 100644 index 0000000000..5d0032df6a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerBronze.java @@ -0,0 +1,96 @@ +package gregtech.common.tileentities.machines.multi; + +import net.minecraft.block.Block; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class MTELargeBoilerBronze extends MTELargeBoiler { + + public MTELargeBoilerBronze(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond; + } + + public MTELargeBoilerBronze(String aName) { + super(aName); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeBoilerBronze(this.mName); + } + + @Override + public String getCasingMaterial() { + return "Bronze"; + } + + @Override + public String getCasingBlockType() { + return "Plated Bricks"; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings1; + } + + @Override + public byte getCasingMeta() { + return 10; + } + + @Override + public byte getCasingTextureIndex() { + return 10; + } + + @Override + public Block getPipeBlock() { + return GregTechAPI.sBlockCasings2; + } + + @Override + public byte getPipeMeta() { + return 12; + } + + @Override + public Block getFireboxBlock() { + return GregTechAPI.sBlockCasings3; + } + + @Override + public byte getFireboxMeta() { + return 13; + } + + @Override + public byte getFireboxTextureIndex() { + return 45; + } + + @Override + public int getEUt() { + return 400; + } + + @Override + public int getEfficiencyIncrease() { + return 16; + } + + @Override + int runtimeBoost(int mTime) { + return mTime * 2; + } + + @Override + boolean isSuperheated() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerSteel.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerSteel.java new file mode 100644 index 0000000000..32f78c15ef --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerSteel.java @@ -0,0 +1,96 @@ +package gregtech.common.tileentities.machines.multi; + +import net.minecraft.block.Block; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class MTELargeBoilerSteel extends MTELargeBoiler { + + public MTELargeBoilerSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond; + } + + public MTELargeBoilerSteel(String aName) { + super(aName); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeBoilerSteel(this.mName); + } + + @Override + public String getCasingMaterial() { + return "Steel"; + } + + @Override + public String getCasingBlockType() { + return "Machine Casings"; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings2; + } + + @Override + public byte getCasingMeta() { + return 0; + } + + @Override + public byte getCasingTextureIndex() { + return 16; + } + + @Override + public Block getPipeBlock() { + return GregTechAPI.sBlockCasings2; + } + + @Override + public byte getPipeMeta() { + return 13; + } + + @Override + public Block getFireboxBlock() { + return GregTechAPI.sBlockCasings3; + } + + @Override + public byte getFireboxMeta() { + return 14; + } + + @Override + public byte getFireboxTextureIndex() { + return 46; + } + + @Override + public int getEUt() { + return 1000; + } + + @Override + public int getEfficiencyIncrease() { + return 12; + } + + @Override + int runtimeBoost(int mTime) { + return mTime; + } + + @Override + boolean isSuperheated() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTitanium.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTitanium.java new file mode 100644 index 0000000000..2893a72008 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTitanium.java @@ -0,0 +1,96 @@ +package gregtech.common.tileentities.machines.multi; + +import net.minecraft.block.Block; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class MTELargeBoilerTitanium extends MTELargeBoiler { + + public MTELargeBoilerTitanium(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond; + } + + public MTELargeBoilerTitanium(String aName) { + super(aName); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeBoilerTitanium(this.mName); + } + + @Override + public String getCasingMaterial() { + return "Titanium"; + } + + @Override + public String getCasingBlockType() { + return "Machine Casings"; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getCasingMeta() { + return 2; + } + + @Override + public byte getCasingTextureIndex() { + return 50; + } + + @Override + public Block getPipeBlock() { + return GregTechAPI.sBlockCasings2; + } + + @Override + public byte getPipeMeta() { + return 14; + } + + @Override + public Block getFireboxBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getFireboxMeta() { + return 3; + } + + @Override + public byte getFireboxTextureIndex() { + return 51; + } + + @Override + public int getEUt() { + return 4000; + } + + @Override + public int getEfficiencyIncrease() { + return 8; + } + + @Override + int runtimeBoost(int mTime) { + return mTime * 130 / 400; + } + + @Override + boolean isSuperheated() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTungstenSteel.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTungstenSteel.java new file mode 100644 index 0000000000..e47c74d58a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeBoilerTungstenSteel.java @@ -0,0 +1,96 @@ +package gregtech.common.tileentities.machines.multi; + +import net.minecraft.block.Block; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class MTELargeBoilerTungstenSteel extends MTELargeBoiler { + + public MTELargeBoilerTungstenSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond; + } + + public MTELargeBoilerTungstenSteel(String aName) { + super(aName); + pollutionPerSecond = GTMod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeBoilerTungstenSteel(this.mName); + } + + @Override + public String getCasingMaterial() { + return "TungstenSteel"; + } + + @Override + public String getCasingBlockType() { + return "Machine Casings"; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getCasingMeta() { + return 0; + } + + @Override + public byte getCasingTextureIndex() { + return 48; + } + + @Override + public Block getPipeBlock() { + return GregTechAPI.sBlockCasings2; + } + + @Override + public byte getPipeMeta() { + return 15; + } + + @Override + public Block getFireboxBlock() { + return GregTechAPI.sBlockCasings3; + } + + @Override + public byte getFireboxMeta() { + return 15; + } + + @Override + public byte getFireboxTextureIndex() { + return 47; + } + + @Override + public int getEUt() { + return 16000; + } + + @Override + public int getEfficiencyIncrease() { + return 4; + } + + @Override + int runtimeBoost(int mTime) { + return mTime * 120 / 750; + } + + @Override + boolean isSuperheated() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java new file mode 100644 index 0000000000..a7e94c9ea5 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java @@ -0,0 +1,291 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizon.structurelib.structure.StructureUtility; +import com.gtnewhorizon.structurelib.util.ItemStackPredicate; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.interfaces.IHeatingCoil; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTELargeChemicalReactor extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable { + + private static final int CASING_INDEX = 176; + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose(new String[][] { { "ccc", "cxc", "ccc" }, { "c~c", "xPx", "cxc" }, { "ccc", "cxc", "ccc" }, })) + .addElement('P', ofBlock(GregTechAPI.sBlockCasings8, 1)) + .addElement( + 'c', + buildHatchAdder(MTELargeChemicalReactor.class) + .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain( + onElementPass(MTELargeChemicalReactor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings8, 0)))) + .addElement( + 'x', + buildHatchAdder(MTELargeChemicalReactor.class) + .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain( + CoilStructureElement.INSTANCE, + onElementPass(MTELargeChemicalReactor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings8, 0)))) + .build(); + + private int mCasingAmount; + private int mCoilAmount; + + public MTELargeChemicalReactor(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeChemicalReactor(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeChemicalReactor(this.mName); + } + + @Override + public MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Chemical Reactor") + .addInfo("Controller block for the Large Chemical Reactor") + .addInfo("Does not lose efficiency when overclocked") + .addInfo("Accepts fluids instead of fluid cells") + .addSeparator() + .beginStructureBlock(3, 3, 3, false) + .addController("Front center") + .addCasingInfoRange("Chemically Inert Machine Casing", 8, 22, false) + .addOtherStructurePart("PTFE Pipe Machine Casing", "Center") + .addOtherStructurePart("Heating Coil", "Adjacent to the PTFE Pipe Machine Casing", 1) + .addEnergyHatch("Any casing", 1, 2) + .addMaintenanceHatch("Any casing", 1, 2) + .addInputBus("Any casing", 1, 2) + .addInputHatch("Any casing", 1, 2) + .addOutputBus("Any casing", 1, 2) + .addOutputHatch("Any casing", 1, 2) + .addStructureInfo("You can have multiple hatches/busses") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { casingTexturePages[1][48], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[1][48], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { casingTexturePages[1][48] }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.multiblockChemicalReactorRecipes; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic().enablePerfectOverclock(); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + mCoilAmount = 0; + return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= 8 + && mCoilAmount == 1 + && !mEnergyHatches.isEmpty() + && mMaintenanceHatches.size() == 1; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + mCoilAmount = 0; + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 1, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + mCoilAmount = 0; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + private enum CoilStructureElement implements IStructureElement { + + INSTANCE; + + @Override + public boolean check(MTELargeChemicalReactor t, World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + if (block instanceof IHeatingCoil + && ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)) != HeatingCoilLevel.None) { + return t.mCoilAmount++ == 0; + } else { + return false; + } + } + + @Override + public boolean spawnHint(MTELargeChemicalReactor t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, GregTechAPI.sBlockCasings5, 0); + return true; + } + + @Override + public boolean placeBlock(MTELargeChemicalReactor t, World world, int x, int y, int z, ItemStack trigger) { + if (t.mCoilAmount > 0) return false; + boolean b = world.setBlock(x, y, z, GregTechAPI.sBlockCasings5, 0, 3); + if (b) t.mCoilAmount++; + return b; + } + + @Override + public PlaceResult survivalPlaceBlock(MTELargeChemicalReactor t, World world, int x, int y, int z, + ItemStack trigger, IItemSource s, EntityPlayerMP actor, Consumer chatter) { + return survivalPlaceBlock(t, world, x, y, z, trigger, AutoPlaceEnvironment.fromLegacy(s, actor, chatter)); + } + + @Override + public BlocksToPlace getBlocksToPlace(MTELargeChemicalReactor gt_metaTileEntity_largeChemicalReactor, + World world, int x, int y, int z, ItemStack trigger, AutoPlaceEnvironment env) { + return BlocksToPlace.create( + IntStream.range(0, 8) + .mapToObj(i -> new ItemStack(GregTechAPI.sBlockCasings5, 1, i)) + .collect(Collectors.toList())); + } + + @Override + public PlaceResult survivalPlaceBlock(MTELargeChemicalReactor t, World world, int x, int y, int z, + ItemStack trigger, AutoPlaceEnvironment env) { + if (t.mCoilAmount > 0) return PlaceResult.SKIP; + if (check(t, world, x, y, z)) return PlaceResult.SKIP; + if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return PlaceResult.REJECT; + ItemStack result = env.getSource() + .takeOne(ItemStackPredicate.from(GregTechAPI.sBlockCasings5), true); + if (result == null) return PlaceResult.REJECT; + PlaceResult ret = StructureUtility.survivalPlaceBlock( + result, + ItemStackPredicate.NBTMode.EXACT, + null, + true, + world, + x, + y, + z, + env.getSource(), + env.getActor(), + env.getChatter()); + if (ret == PlaceResult.ACCEPT) t.mCoilAmount++; + return ret; + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeFluidExtractor.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeFluidExtractor.java new file mode 100644 index 0000000000..c19b8a061d --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeFluidExtractor.java @@ -0,0 +1,418 @@ +package gregtech.common.tileentities.machines.multi; + +import static bartworks.util.BWUtil.ofGlassTiered; +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 com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofCoil; +import static gregtech.api.util.GTStructureUtility.ofFrame; +import static gregtech.api.util.GTStructureUtility.ofSolenoidCoil; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.YELLOW; + +import java.util.ArrayList; +import java.util.Arrays; + +import javax.annotation.Nullable; + +import net.minecraft.item.ItemStack; +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 com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; +import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; + +public class MTELargeFluidExtractor extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int CASING_INDEX = 48; // Robust Tungstensteel Machine Casing + private static final int BASE_CASING_COUNT = 24 + 24 + 9; + private static final int MAX_HATCHES_ALLOWED = 16; + + private static final double BASE_SPEED_BONUS = 1.5; + private static final double BASE_EU_MULTIPLIER = 0.8; + + private static final double SPEED_PER_COIL = 0.1; + private static final int PARALLELS_PER_SOLENOID = 8; + private static final double HEATING_COIL_EU_MULTIPLIER = 0.9; + + // spotless:off + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { + {" ", " ccc ", " ccc ", " ccc ", " "}, + {" ", " f f ", " s ", " f f ", " "}, + {" ", " f f ", " s ", " f f ", " "}, + {" ", " f f ", " s ", " f f ", " "}, + {"ccccc", "ccccc", "ccscc", "ccccc", "ccccc"}, + {"fgggf", "ghhhg", "ghshg", "ghhhg", "fgggf"}, + {"fgggf", "ghhhg", "ghshg", "ghhhg", "fgggf"}, + {"fgggf", "ghhhg", "ghshg", "ghhhg", "fgggf"}, + {"cc~cc", "ccccc", "ccccc", "ccccc", "ccccc"}, + })) + .addElement('c', + buildHatchAdder(MTELargeFluidExtractor.class) + .atLeast(InputBus, OutputBus, OutputHatch, Energy, Maintenance) + .casingIndex(CASING_INDEX) // Robust Tungstensteel Machine Casing + .dot(1) + .buildAndChain( + onElementPass( + MTELargeFluidExtractor::onCasingAdded, + ofBlock(GregTechAPI.sBlockCasings4, 0))) // Robust Tungstensteel Machine Casing + ) + .addElement( + 'g', + withChannel( + "glass", + ofGlassTiered( + (byte) 1, (byte) 127, (byte) 0, + MTELargeFluidExtractor::setGlassTier, + MTELargeFluidExtractor::getGlassTier, + 2)) + ) + .addElement( + 'h', + withChannel( + "coil", + ofCoil( + MTELargeFluidExtractor::setCoilLevel, + MTELargeFluidExtractor::getCoilLevel)) + ) + .addElement( + 's', + withChannel( + "solenoid", + ofSolenoidCoil( + MTELargeFluidExtractor::setSolenoidLevel, + MTELargeFluidExtractor::getSolenoidLevel)) + ) + .addElement( + 'f', + ofFrame(Materials.BlackSteel) + ) + .build(); + // spotless:on + + private byte mGlassTier = 0; + @Nullable + private HeatingCoilLevel mCoilLevel = null; + @Nullable + private Byte mSolenoidLevel = null; + private int mCasingAmount; + private boolean mStructureBadGlassTier = false, mStructureBadCasingCount = false; + + public MTELargeFluidExtractor(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeFluidExtractor(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public void clearHatches() { + super.clearHatches(); + + mCasingAmount = 0; + mStructureBadGlassTier = false; + mStructureBadCasingCount = false; + mGlassTier = 0; + mCoilLevel = null; + mSolenoidLevel = null; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 8, 0)) { + return false; + } + + if (mCasingAmount < (BASE_CASING_COUNT - MAX_HATCHES_ALLOWED)) { + mStructureBadCasingCount = true; + } + + for (var energyHatch : mEnergyHatches) { + if (energyHatch.getBaseMetaTileEntity() == null) { + continue; + } + + if (mGlassTier < 10 && energyHatch.getTierForStructure() > mGlassTier) { + mStructureBadGlassTier = true; + } + } + + return !mStructureBadGlassTier && !mStructureBadCasingCount; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 8, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 8, 0, elementBudget, env, false, true); + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic(); + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + super.setProcessingLogicPower(logic); + logic.setAvailableAmperage(mEnergyHatches.size()); + logic.setEuModifier((float) (getEUMultiplier())); + logic.setMaxParallel(getParallels()); + logic.setSpeedBonus(1.0f / (float) (getSpeedBonus())); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeFluidExtractor(this.mName); + } + + private void onCasingAdded() { + mCasingAmount++; + } + + private byte getGlassTier() { + return mGlassTier; + } + + private void setGlassTier(byte tier) { + mGlassTier = tier; + } + + private HeatingCoilLevel getCoilLevel() { + return mCoilLevel; + } + + private void setCoilLevel(HeatingCoilLevel level) { + mCoilLevel = level; + } + + private Byte getSolenoidLevel() { + return mSolenoidLevel; + } + + private void setSolenoidLevel(byte level) { + mSolenoidLevel = level; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean active, boolean redstoneLevel) { + if (side == facing) { + if (active) { + return new ITexture[] { getCasingTextureForId(CASING_INDEX), TextureFactory.builder() + .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active) + .extFacing() + .build() }; + } else { + return new ITexture[] { getCasingTextureForId(CASING_INDEX), TextureFactory.builder() + .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced) + .extFacing() + .build() }; + } + } + return new ITexture[] { getCasingTextureForId(CASING_INDEX) }; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + + // spotless:off + tt.addMachineType("Fluid Extractor") + .addInfo("Controller block for the Large Fluid Extractor") + .addInfo(String.format( + "%d%% faster than single block machines of the same voltage", + (int) Math.round((BASE_SPEED_BONUS - 1) * 100) + )) + .addInfo(String.format( + "Only uses %d%% of the EU/t normally required", + (int) Math.round(BASE_EU_MULTIPLIER * 100) + )) + .addInfo(String.format( + "Every coil tier gives a +%d%% speed bonus and a %d%% EU/t discount (multiplicative)", + (int) Math.round(SPEED_PER_COIL * 100), + (int) Math.round((1 - HEATING_COIL_EU_MULTIPLIER) * 100) + )) + .addInfo(String.format( + "Every solenoid tier gives +%d parallels", + (int) PARALLELS_PER_SOLENOID + )) + .addInfo(String.format( + "The EU multiplier is %s%.2f * (%.2f ^ Heating Coil Tier)%s, prior to overclocks", + EnumChatFormatting.ITALIC, + BASE_EU_MULTIPLIER, + HEATING_COIL_EU_MULTIPLIER, + EnumChatFormatting.GRAY + )) + .addInfo("The energy hatch tier is limited by the glass tier. UEV glass unlocks all tiers.") + .addSeparator() + .beginStructureBlock(5, 9, 5, false) + .addController("Front Center (Bottom Layer)") + .addCasingInfoMin("Robust Tungstensteel Machine Casing", BASE_CASING_COUNT - MAX_HATCHES_ALLOWED, false) + .addCasingInfoExactly("Borosilicate Glass (any)", 9 * 4, true) + .addCasingInfoExactly("Solenoid Superconducting Coil (any)", 7, true) + .addCasingInfoExactly("Heating Coils (any)", 8 * 3, true) + .addCasingInfoExactly("Black Steel Frame Box", 3 * 8, false) + .addInputBus("Any Robust Tungstensteel Machine Casing", 1) + .addOutputBus("Any Robust Tungstensteel Machine Casing", 1) + .addOutputHatch("Any Robust Tungstensteel Machine Casing", 1) + .addEnergyHatch("Any Robust Tungstensteel Machine Casing", 1) + .addMaintenanceHatch("Any Robust Tungstensteel Machine Casing", 1) + .toolTipFinisher("GregTech"); + // spotless:on + + return tt; + } + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + super.drawTexts(screenElements, inventorySlot); + + screenElements.widgets(TextWidget.dynamicString(() -> { + if (mStructureBadCasingCount) { + return String.format( + "%sNot enough casings: need %d, but\nhave %d.%s", + EnumChatFormatting.DARK_RED, + BASE_CASING_COUNT - MAX_HATCHES_ALLOWED, + mCasingAmount, + RESET); + } + + if (mStructureBadGlassTier) { + int hatchTier = 0; + + for (var hatch : mEnergyHatches) { + if (hatch.mTier > hatchTier) hatchTier = hatch.mTier; + } + + return String.format( + "%sEnergy hatch tier (%s) is too high\nfor the glass tier (%s).%s", + EnumChatFormatting.DARK_RED, + VN[hatchTier], + VN[mGlassTier], + RESET); + } + + return ""; + }) + .setTextAlignment(Alignment.CenterLeft)); + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10_000; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.fluidExtractionRecipes; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + public String[] getInfoData() { + var data = new ArrayList(); + + data.addAll(Arrays.asList(super.getInfoData())); + + data.add(String.format("Max Parallels: %s%d%s", YELLOW, getParallels(), RESET)); + data.add(String.format("Heating Coil Speed Bonus: +%s%.0f%s %%", YELLOW, getCoilSpeedBonus() * 100, RESET)); + data.add(String.format("Total Speed Multiplier: %s%.0f%s %%", YELLOW, getSpeedBonus() * 100, RESET)); + data.add(String.format("Total EU/t Multiplier: %s%.0f%s %%", YELLOW, getEUMultiplier() * 100, RESET)); + + return data.toArray(new String[data.size()]); + } + + public int getParallels() { + return Math.max(1, mSolenoidLevel == null ? 0 : (PARALLELS_PER_SOLENOID * mSolenoidLevel)); + } + + public float getCoilSpeedBonus() { + return (float) ((mCoilLevel == null ? 0 : SPEED_PER_COIL * mCoilLevel.getTier())); + } + + public float getSpeedBonus() { + return (float) (BASE_SPEED_BONUS + getCoilSpeedBonus()); + } + + public float getEUMultiplier() { + double heatingBonus = (mCoilLevel == null ? 0 : Math.pow(HEATING_COIL_EU_MULTIPLIER, mCoilLevel.getTier())); + + return (float) (BASE_EU_MULTIPLIER * heatingBonus); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbine.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbine.java new file mode 100644 index 0000000000..15dc5def03 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbine.java @@ -0,0 +1,490 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Dynamo; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW; +import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW_EMPTY; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; +import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchDynamo; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.util.GTUtility; +import gregtech.api.util.LightingHelper; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.items.MetaGeneratedTool01; +import gregtech.common.render.GTRenderUtil; + +public abstract class MTELargeTurbine extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { + + @Override + protected IStructureDefinition computeValue(Class type) { + return StructureDefinition.builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { " ", " ", " ", " ", " ", }, + { " --- ", " ccc ", " hhh ", " hhh ", " hhh ", }, + { " --- ", " c~c ", " h-h ", " h-h ", " hdh ", }, + { " --- ", " ccc ", " hhh ", " hhh ", " hhh ", }, + { " ", " ", " ", " ", " ", }, })) + .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta()))) + .addElement('d', lazy(t -> Dynamo.newAny(t.getCasingTextureIndex(), 1))) + .addElement( + 'h', + lazy( + t -> buildHatchAdder(MTELargeTurbine.class) + .atLeast(Maintenance, InputHatch, OutputHatch, OutputBus, InputBus, Muffler) + .casingIndex(t.getCasingTextureIndex()) + .dot(2) + .buildAndChain(t.getCasingBlock(), t.getCasingMeta()))) + .build(); + } + }; + + protected int baseEff = 0; + protected int optFlow = 0; + protected double realOptFlow = 0; + protected int storedFluid = 0; + protected int counter = 0; + protected boolean looseFit = false; + protected int overflowMultiplier = 0; + protected final float[] flowMultipliers = new float[] { 1, 1, 1 }; + + // client side stuff + protected boolean mHasTurbine; + // mMachine got overwritten by StructureLib extended facing query response + // so we use a separate field for this + protected boolean mFormed; + + public MTELargeTurbine(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeTurbine(String aName) { + super(aName); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return getMaxEfficiency(aStack) > 0; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION.get(getClass()); + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + return (d, r, f) -> r.isNotRotated() && f.isNotFlipped(); + } + + @Override + protected ExtendedFacing getCorrectedAlignment(ExtendedFacing aOldFacing) { + return aOldFacing.with(Flip.NONE) + .with(Rotation.NORMAL); + } + + @Override + public boolean isFlipChangeAllowed() { + return false; + } + + @Override + public boolean isRotationChangeAllowed() { + return false; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + return checkPiece(STRUCTURE_PIECE_MAIN, 2, 2, 1) && mMaintenanceHatches.size() == 1 + && mMufflerHatches.isEmpty() == (getPollutionPerTick(null) == 0); + } + + public abstract Block getCasingBlock(); + + public abstract byte getCasingMeta(); + + public abstract int getCasingTextureIndex(); + + public boolean isNewStyleRendering() { + return false; + } + + public IIconContainer[] getTurbineTextureActive() { + return TURBINE_NEW_ACTIVE; + } + + public IIconContainer[] getTurbineTextureFull() { + return TURBINE_NEW; + } + + public IIconContainer[] getTurbineTextureEmpty() { + return TURBINE_NEW_EMPTY; + } + + @Override + public boolean renderInWorld(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer) { + if (!isNewStyleRendering() || !mFormed) return false; + int[] tABCCoord = new int[] { -1, -1, 0 }; + int[] tXYZOffset = new int[3]; + final ForgeDirection tFacing = getBaseMetaTileEntity().getFrontFacing(); + final ExtendedFacing tExtendedFacing = getExtendedFacing(); + final ForgeDirection tDirection = tExtendedFacing.getDirection(); + final LightingHelper tLighting = new LightingHelper(aRenderer); + + // for some reason +x and -z need this field set to true, but not any other sides + if (tFacing == ForgeDirection.NORTH || tFacing == ForgeDirection.EAST) aRenderer.field_152631_f = true; + final Block tBlock = getCasingBlock(); + + IIconContainer[] tTextures; + if (getBaseMetaTileEntity().isActive()) tTextures = getTurbineTextureActive(); + else if (hasTurbine()) tTextures = getTurbineTextureFull(); + else tTextures = getTurbineTextureEmpty(); + + assert tTextures != null && tTextures.length == tABCCoord.length; + + for (int i = 0; i < 9; i++) { + if (i != 4) { // do not draw ourselves again. + tExtendedFacing.getWorldOffset(tABCCoord, tXYZOffset); + // since structure check passed, we can assume it is turbine casing + int tX = tXYZOffset[0] + aX; + int tY = tXYZOffset[1] + aY; + int tZ = tXYZOffset[2] + aZ; + // we skip the occlusion test, as we always require a working turbine to have a block of air before it + // so the front face cannot be occluded whatsoever in the most cases. + Tessellator.instance.setBrightness( + tBlock.getMixedBrightnessForBlock( + aWorld, + aX + tDirection.offsetX, + tY + tDirection.offsetY, + aZ + tDirection.offsetZ)); + tLighting.setupLighting(tBlock, tX, tY, tZ, tFacing) + .setupColor(tFacing, Dyes._NULL.mRGBa); + GTRenderUtil.renderBlockIcon( + aRenderer, + tBlock, + tX + tDirection.offsetX * 0.01, + tY + tDirection.offsetY * 0.01, + tZ + tDirection.offsetZ * 0.01, + tTextures[i].getIcon(), + tFacing); + } + if (++tABCCoord[0] == 2) { + tABCCoord[0] = -1; + tABCCoord[1]++; + } + } + + aRenderer.field_152631_f = false; + return false; + } + + @Override + public void onValueUpdate(byte aValue) { + mHasTurbine = (aValue & 0x1) != 0; + mFormed = (aValue & 0x2) != 0; + super.onValueUpdate(aValue); + } + + @Override + public byte getUpdateData() { + return (byte) ((hasTurbine() ? 1 : 0) | (mMachine ? 2 : 0)); + } + + @Override + public boolean addToMachineList(IGregTechTileEntity tTileEntity, int aBaseCasingIndex) { + return addMaintenanceToMachineList(tTileEntity, getCasingTextureIndex()) + || addInputToMachineList(tTileEntity, getCasingTextureIndex()) + || addOutputToMachineList(tTileEntity, getCasingTextureIndex()) + || addMufflerToMachineList(tTileEntity, getCasingTextureIndex()); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + ItemStack controllerSlot = getControllerSlot(); + if ((counter & 7) == 0 && (controllerSlot == null || !(controllerSlot.getItem() instanceof MetaGeneratedTool) + || controllerSlot.getItemDamage() < 170 + || controllerSlot.getItemDamage() > 179)) { + stopMachine(ShutDownReasonRegistry.NO_TURBINE); + return CheckRecipeResultRegistry.NO_TURBINE_FOUND; + } + ArrayList tFluids = getStoredFluids(); + if (!tFluids.isEmpty()) { + + if (baseEff == 0 || optFlow == 0 + || counter >= 512 + || this.getBaseMetaTileEntity() + .hasWorkJustBeenEnabled() + || this.getBaseMetaTileEntity() + .hasInventoryBeenModified()) { + counter = 0; + baseEff = GTUtility.safeInt( + (long) ((5F + ((MetaGeneratedTool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot)) + * 1000F)); + optFlow = GTUtility.safeInt( + (long) Math.max( + Float.MIN_NORMAL, + ((MetaGeneratedTool) controllerSlot.getItem()).getToolStats(controllerSlot) + .getSpeedMultiplier() * MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mToolSpeed + * 50)); + + overflowMultiplier = getOverflowMultiplier(controllerSlot); + + flowMultipliers[0] = MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mSteamMultiplier; + flowMultipliers[1] = MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mGasMultiplier; + flowMultipliers[2] = MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier; + + if (optFlow <= 0 || baseEff <= 0) { + stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed + return CheckRecipeResultRegistry.NO_FUEL_FOUND; + } + } else { + counter++; + } + } + + int newPower = fluidIntoPower(tFluids, optFlow, baseEff, overflowMultiplier, flowMultipliers); // How much the + // turbine should + // be producing + // with this flow + int difference = newPower - this.mEUt; // difference between current output and new output + + // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the difference in + // power level (per tick) + // This is how much the turbine can actually change during this tick + int maxChangeAllowed = Math.max(10, GTUtility.safeInt((long) Math.abs(difference) / 100)); + + if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed change + int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative. + this.mEUt += change; // Apply the change + } else this.mEUt = newPower; + + if (this.mEUt <= 0) { + // stopMachine(); + this.mEUt = 0; + this.mEfficiency = 0; + return CheckRecipeResultRegistry.NO_FUEL_FOUND; + } else { + this.mMaxProgresstime = 1; + this.mEfficiencyIncrease = 10; + // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here. + return CheckRecipeResultRegistry.GENERATING; + } + } + + abstract int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, + float[] flowMultipliers); + + abstract float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier); + + // Gets the maximum output that the turbine currently can handle. Going above this will cause the turbine to explode + public long getMaximumOutput() { + long aTotal = 0; + for (MTEHatchDynamo aDynamo : filterValidMTEs(mDynamoHatches)) { + long aVoltage = aDynamo.maxEUOutput(); + aTotal = aDynamo.maxAmperesOut() * aVoltage; + } + return aTotal; + } + + public int getOverflowMultiplier(ItemStack aStack) { + int aOverflowMultiplier = 0; + int toolQualityLevel = MetaGeneratedTool.getPrimaryMaterial(aStack).mToolQuality; + if (toolQualityLevel >= 6) { + aOverflowMultiplier = 3; + } else if (toolQualityLevel >= 3) { + aOverflowMultiplier = 2; + } else { + aOverflowMultiplier = 1; + } + return aOverflowMultiplier; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 1; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + if (GTUtility.isStackInvalid(aStack)) { + return 0; + } + if (aStack.getItem() instanceof MetaGeneratedTool01) { + return 10000; + } + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return true; + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + } + + String tRunning = mMaxProgresstime > 0 + ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true") + + EnumChatFormatting.RESET + : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false") + + EnumChatFormatting.RESET; + String tMaintainance = getIdealStatus() == getRepairStatus() + ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") + + EnumChatFormatting.RESET + : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") + + EnumChatFormatting.RESET; + int tDura = 0; + + if (mInventory[1] != null && mInventory[1].getItem() instanceof MetaGeneratedTool01) { + tDura = GTUtility.safeInt( + (long) (100.0f / MetaGeneratedTool.getToolMaxDamage(mInventory[1]) + * (MetaGeneratedTool.getToolDamage(mInventory[1])) + 1)); + } + + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatchDynamo tHatch : filterValidMTEs(mDynamoHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + String[] ret = new String[] { + // 8 Lines available for information panels + tRunning + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(((long) mEUt * mEfficiency) / 10000) + + EnumChatFormatting.RESET + + " EU/t", /* 1 */ + tMaintainance, /* 2 */ + StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": " + + EnumChatFormatting.YELLOW + + (mEfficiency / 100F) + + EnumChatFormatting.RESET + + "%", /* 2 */ + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + /* 3 */ EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + StatCollector.translateToLocal("GT5U.turbine.flow") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(GTUtility.safeInt((long) realOptFlow)) + + EnumChatFormatting.RESET + + " L/t" + + /* 4 */ EnumChatFormatting.YELLOW + + " (" + + (looseFit ? StatCollector.translateToLocal("GT5U.turbine.loose") + : StatCollector.translateToLocal("GT5U.turbine.tight")) + + ")", /* 5 */ + StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " + + EnumChatFormatting.GOLD + + GTUtility.formatNumbers(storedFluid) + + EnumChatFormatting.RESET + + "L", /* 6 */ + StatCollector.translateToLocal( + "GT5U.turbine.dmg") + ": " + EnumChatFormatting.RED + tDura + EnumChatFormatting.RESET + "%", /* 7 */ + StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" /* 8 */ + }; + if (!this.getClass() + .getName() + .contains("Steam")) + ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.safeInt((long) realOptFlow) + + EnumChatFormatting.RESET + + " L/t"; + return ret; + } + + public boolean hasTurbine() { + return getBaseMetaTileEntity() != null && getBaseMetaTileEntity().isClientSide() ? mHasTurbine + : this.getMaxEfficiency(mInventory[1]) > 0; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 2, 1); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 2, 1, elementBudget, env, false, true); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGas.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGas.java new file mode 100644 index 0000000000..268bbf5da4 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGas.java @@ -0,0 +1,220 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTELargeTurbineGas extends MTELargeTurbine { + + public MTELargeTurbineGas(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeTurbineGas(String aName) { + super(aName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], + aFacing == side ? (aActive ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_ACTIVE5) + .build() + : hasTurbine() ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW5) + .build() + : TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_EMPTY5) + .build()) + : casingTexturePages[0][58] }; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Gas Turbine") + .addInfo("Controller block for the Large Gas Turbine") + .addInfo("Needs a Turbine, place inside controller") + // .addInfo("The excess fuel that gets consumed will be voided!") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 3, 4, true) + .addController("Front center") + .addCasingInfoRange("Stainless Steel Turbine Casing", 8, 30, false) + .addDynamoHatch("Back center", 1) + .addMaintenanceHatch("Side centered", 2) + .addMufflerHatch("Side centered", 2) + .addInputHatch("Gas Fuel, Side centered", 2) + .addOtherStructurePart("Air", "3x3 area in front of controller") + .toolTipFinisher("Gregtech"); + return tt; + } + + public int getFuelValue(FluidStack aLiquid) { + if (aLiquid == null) return 0; + GTRecipe tFuel = RecipeMaps.gasTurbineFuels.getBackend() + .findFuel(aLiquid); + if (tFuel != null) return tFuel.mSpecialValue; + return 0; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeTurbineGas(mName); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.gasTurbineFuels; + } + + @Override + public int getRecipeCatalystPriority() { + return -1; + } + + @Override + protected boolean filtersFluid() { + return false; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getCasingMeta() { + return 10; + } + + @Override + public int getCasingTextureIndex() { + return 58; + } + + @Override + public boolean isNewStyleRendering() { + return true; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionLargeGasTurbinePerSecond; + } + + @Override + int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, + float[] flowMultipliers) { + if (aFluids.size() >= 1) { + int tEU = 0; + int actualOptimalFlow = 0; + + FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process. + // Doesn't matter which one. Ignore the rest! + int fuelValue = getFuelValue(firstFuelType); + + if (aOptFlow < fuelValue) { + // turbine too weak and/or fuel too powerful + // at least consume 1L + this.realOptFlow = 1; + // wastes the extra fuel and generate aOptFlow directly + depleteInput(new FluidStack(firstFuelType, 1)); + this.storedFluid += 1; + return GTUtility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L); + } + + actualOptimalFlow = GTUtility.safeInt((long) (aOptFlow * flowMultipliers[1] / fuelValue)); + this.realOptFlow = actualOptimalFlow; + + // Allowed to use up to 450% optimal flow rate, depending on the value of overflowMultiplier. + // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula + // used + // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow + // rate): + // - 150% if it is 1 + // - 300% if it is 2 + // - 450% if it is 3 + // Variable required outside of loop for multi-hatch scenarios. + int remainingFlow = GTUtility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier))); + int flow = 0; + int totalFlow = 0; + + storedFluid = 0; + for (FluidStack aFluid : aFluids) { + if (aFluid.isFluidEqual(firstFuelType)) { + flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above + depleteInput(new FluidStack(aFluid, flow)); // deplete that amount + this.storedFluid += aFluid.amount; + remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches + totalFlow += flow; // track total input used + } + } + if (totalFlow <= 0) return 0; + tEU = GTUtility.safeInt((long) totalFlow * fuelValue); + + if (totalFlow != actualOptimalFlow) { + float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier); + tEU *= efficiency; + } + tEU = GTUtility.safeInt((long) tEU * (long) aBaseEff / 10000L); + + // EU/t output cap to properly tier the LGT against the Advanced LGT, will be implemented in a future dev + // update + /* + * if (tEU > 8192) { tEU = 8192; } + */ + + // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the + // turbine + // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow + // When the max fuel consumption rate was increased, turbines could explode on world load + if (tEU > getMaximumOutput()) { + tEU = GTUtility.safeInt(getMaximumOutput()); + } + return tEU; + } + return 0; + } + + @Override + float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { + // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value + // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of + // fuel used + // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value + // Gases are the second most efficient in this regard, with plasma being the most efficient + float efficiency = 0; + + if (totalFlow > actualOptimalFlow) { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow)) + / ((float) actualOptimalFlow * ((overflowMultiplier * 3) - 1)); + } else { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); + } + + return efficiency; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGasAdvanced.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGasAdvanced.java new file mode 100644 index 0000000000..5b983ddc1b --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineGasAdvanced.java @@ -0,0 +1,219 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTELargeTurbineGasAdvanced extends MTELargeTurbine { + + public MTELargeTurbineGasAdvanced(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeTurbineGasAdvanced(String aName) { + super(aName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], + aFacing == side ? (aActive ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_ACTIVE5) + .build() + : hasTurbine() ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW5) + .build() + : TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_EMPTY5) + .build()) + : casingTexturePages[1][57] }; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Gas Turbine") + .addInfo("Warning: This is an experimental multiblock, subject to changes ") + .addInfo("Controller block for the Large Advanced Gas Turbine") + .addInfo("Needs a Turbine, place inside controller") + .addInfo("Only accepts gases above 800k EU/bucket") + .addInfo("Has no maximum EU/t output, only depends on the Dynamo Hatch") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 3, 4, true) + .addController("Front center") + .addCasingInfoRange("Advanced Gas Turbine Casing", 8, 30, false) + .addDynamoHatch("Back center", 1) + .addMaintenanceHatch("Side centered", 2) + .addMufflerHatch("Side centered", 2) + .addInputHatch("Gas Fuel, Side centered", 2) + .toolTipFinisher("Gregtech"); + return tt; + } + + public int getFuelValue(FluidStack aLiquid) { + if (aLiquid == null) return 0; + GTRecipe tFuel = RecipeMaps.gasTurbineFuels.getBackend() + .findFuel(aLiquid); + if (tFuel != null) return tFuel.mSpecialValue; + return 0; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeTurbineGasAdvanced(mName); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.gasTurbineFuels; + } + + @Override + public int getRecipeCatalystPriority() { + return -2; + } + + @Override + protected boolean filtersFluid() { + return false; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings8; + } + + @Override + public byte getCasingMeta() { + return 9; + } + + @Override + public int getCasingTextureIndex() { + return 185; + } + + @Override + public boolean isNewStyleRendering() { + return true; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionLargeGasTurbinePerSecond; + } + + @Override + int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, + float[] flowMultipliers) { + if (aFluids.size() >= 1) { + int tEU = 0; + int actualOptimalFlow = 0; + + FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process. + // Doesn't matter which one. Ignore the rest! + int fuelValue = getFuelValue(firstFuelType); + + if (fuelValue < 100) { + return 0; + } + + if (aOptFlow < fuelValue) { + // turbine too weak and/or fuel too powerful + // at least consume 1L + this.realOptFlow = 1; + // wastes the extra fuel and generate aOptFlow directly + depleteInput(new FluidStack(firstFuelType, 1)); + this.storedFluid += 1; + return GTUtility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L); + } + + actualOptimalFlow = GTUtility.safeInt((long) (aOptFlow * flowMultipliers[1] / fuelValue)); + this.realOptFlow = actualOptimalFlow; + + // Allowed to use up to 450% optimal flow rate, depending on the value of overflowMultiplier. + // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula + // used + // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow + // rate): + // - 150% if it is 1 + // - 300% if it is 2 + // - 450% if it is 3 + // Variable required outside of loop for multi-hatch scenarios. + int remainingFlow = GTUtility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier))); + int flow = 0; + int totalFlow = 0; + + storedFluid = 0; + for (FluidStack aFluid : aFluids) { + if (aFluid.isFluidEqual(firstFuelType)) { + flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above + depleteInput(new FluidStack(aFluid, flow)); // deplete that amount + this.storedFluid += aFluid.amount; + remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches + totalFlow += flow; // track total input used + } + } + if (totalFlow <= 0) return 0; + tEU = GTUtility.safeInt((long) totalFlow * fuelValue); + + if (totalFlow != actualOptimalFlow) { + float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier); + tEU *= efficiency; + } + tEU = GTUtility.safeInt((long) tEU * (long) aBaseEff / 10000L); + + // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the + // turbine + // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow + // When the max fuel consumption rate was increased, turbines could explode on world load + if (tEU > getMaximumOutput()) { + tEU = GTUtility.safeInt(getMaximumOutput()); + } + return tEU; + } + return 0; + } + + @Override + float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { + // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value + // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of + // fuel used + // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value + // Gases are the second most efficient in this regard, with plasma being the most efficient + float efficiency = 0; + + if (totalFlow > actualOptimalFlow) { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow)) + / ((float) actualOptimalFlow * ((overflowMultiplier * 3) - 1)); + } else { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); + } + + return efficiency; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineHPSteam.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineHPSteam.java new file mode 100644 index 0000000000..e0f3669d39 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineHPSteam.java @@ -0,0 +1,232 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; +import static gregtech.common.tileentities.machines.multi.MTELargeTurbineSteam.calculateLooseFlow; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +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.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTELargeTurbineHPSteam extends MTELargeTurbine { + + public boolean achievement = false; + private boolean looseFit = false; + + public MTELargeTurbineHPSteam(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeTurbineHPSteam(String aName) { + super(aName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], + aFacing == side ? (aActive ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_ACTIVE5) + .build() + : hasTurbine() ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW5) + .build() + : TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_EMPTY5) + .build()) + : casingTexturePages[0][59] }; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Steam Turbine") + .addInfo("Controller block for the Large High Pressure Steam Turbine") + .addInfo("Needs a Turbine, place inside controller") + .addInfo("Outputs Steam as well as producing power") + .addInfo("Power output depends on turbine and fitting") + .addInfo("Use screwdriver to adjust fitting of turbine") + .addSeparator() + .beginStructureBlock(3, 3, 4, true) + .addController("Front center") + .addCasingInfoRange("Titanium Turbine Casing", 8, 31, false) + .addDynamoHatch("Back center", 1) + .addMaintenanceHatch("Side centered", 2) + .addInputHatch("Superheated Steam, Side centered", 2) + .addOutputHatch("Steam, Side centered", 2) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeTurbineHPSteam(mName); + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getCasingMeta() { + return 11; + } + + @Override + public int getCasingTextureIndex() { + return 59; + } + + @Override + public boolean isNewStyleRendering() { + return true; + } + + @Override + int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowEfficiency, + float[] flowMultipliers) { + if (looseFit) { + float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff); + aOptFlow = GTUtility.safeInt((long) calculatedFlow[0]); + aBaseEff = GTUtility.safeInt((long) calculatedFlow[1]); + } + int tEU = 0; + int totalFlow = 0; // Byproducts are based on actual flow + int flow = 0; + + // Allowed to use up to 300% optimal flow rate, depending on the value of overflowMultiplier. + // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula + // used + // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow + // rate): + // - 200% if it is 1 + // - 250% if it is 2 + // - 300% if it is 3 + // Variable required outside of loop for multi-hatch scenarios. + this.realOptFlow = aOptFlow * flowMultipliers[0]; + int remainingFlow = GTUtility.safeInt((long) (realOptFlow * (0.5f * overflowMultiplier + 1.5))); + + storedFluid = 0; + for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) { + final FluidStack aFluidStack = aFluids.get(i); + if (GTModHandler.isSuperHeatedSteam(aFluidStack)) { + flow = Math.min(aFluidStack.amount, remainingFlow); // try to use up to the max flow defined just above + depleteInput(new FluidStack(aFluidStack, flow)); // deplete that amount + this.storedFluid += aFluidStack.amount; + remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches + totalFlow += flow; // track total input used + if (!achievement) { + try { + GTMod.achievements.issueAchievement( + this.getBaseMetaTileEntity() + .getWorld() + .getPlayerEntityByName( + this.getBaseMetaTileEntity() + .getOwnerName()), + "efficientsteam"); + } catch (Exception ignored) {} + achievement = true; + } + } else if (GTModHandler.isAnySteam(aFluidStack)) { + depleteInput(new FluidStack(aFluidStack, aFluidStack.amount)); + } + } + if (totalFlow <= 0) return 0; + tEU = totalFlow; + addOutput(GTModHandler.getSteam(totalFlow)); + if (totalFlow == (GTUtility.safeInt((long) realOptFlow))) { + tEU = GTUtility.safeInt((long) tEU * (long) aBaseEff / 10000L); + } else { + float efficiency = getOverflowEfficiency( + totalFlow, + (GTUtility.safeInt((long) realOptFlow)), + overflowMultiplier); + tEU *= efficiency; + tEU = Math.max(1, GTUtility.safeInt((long) tEU * (long) aBaseEff / 10000L)); + } + + // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the + // turbine + // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate can + // explode turbines on world load + if (tEU > getMaximumOutput()) { + tEU = GTUtility.safeInt(getMaximumOutput()); + } + + return tEU; + } + + @Override + float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { + // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value + // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of + // fuel used + // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value + // Superheated steam is the second least efficient out of all turbine fuels in this regard, with steam being the + // least efficient + float efficiency = 0; + + if (totalFlow > actualOptimalFlow) { + efficiency = 1.0f + - Math.abs((totalFlow - actualOptimalFlow)) / ((float) actualOptimalFlow * (overflowMultiplier + 2)); + } else { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); + } + + return efficiency; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (side == getBaseMetaTileEntity().getFrontFacing()) { + looseFit ^= true; + GTUtility.sendChatToPlayer( + aPlayer, + looseFit ? GTUtility.trans("500", "Fitting: Loose - More Flow") + : GTUtility.trans("501", "Fitting: Tight - More Efficiency")); + } + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return (looseFit && XSTR_INSTANCE.nextInt(4) == 0) ? 0 : 1; + } + + @Override + public String[] getInfoData() { + super.looseFit = looseFit; + return super.getInfoData(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("turbineFitting", looseFit); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + looseFit = aNBT.getBoolean("turbineFitting"); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbinePlasma.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbinePlasma.java new file mode 100644 index 0000000000..667d52a4cd --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbinePlasma.java @@ -0,0 +1,389 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.implementations.MTEHatchDynamo; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +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.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.items.MetaGeneratedTool01; + +public class MTELargeTurbinePlasma extends MTELargeTurbine { + + public MTELargeTurbinePlasma(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeTurbinePlasma(String aName) { + super(aName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], + aFacing == side ? (aActive ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_ACTIVE5) + .build() + : hasTurbine() ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW5) + .build() + : TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_EMPTY5) + .build()) + : casingTexturePages[0][60] }; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Plasma Turbine") + .addInfo("Controller block for the Large Plasma Generator") + .addInfo("Needs a Turbine, place inside controller") + .addInfo("Use your Fusion Reactor to produce the Plasma") + .addSeparator() + .beginStructureBlock(3, 3, 4, true) + .addController("Front center") + .addCasingInfoRange("Tungstensteel Turbine Casing", 8, 31, false) + .addDynamoHatch("Back center", 1) + .addMaintenanceHatch("Side centered", 2) + .addInputHatch("Plasma Fluid, Side centered", 2) + .addOutputHatch("Molten Fluid, optional, Side centered", 2) + .toolTipFinisher("Gregtech"); + return tt; + } + + public int getFuelValue(FluidStack aLiquid) { + if (aLiquid == null) return 0; + GTRecipe tFuel = RecipeMaps.plasmaFuels.getBackend() + .findFuel(aLiquid); + if (tFuel != null) return tFuel.mSpecialValue; + return 0; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeTurbinePlasma(mName); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.plasmaFuels; + } + + @Override + public int getRecipeCatalystPriority() { + return -1; + } + + @Override + protected boolean filtersFluid() { + return false; + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getCasingMeta() { + return 12; + } + + @Override + public int getCasingTextureIndex() { + return 60; + } + + @Override + public boolean isNewStyleRendering() { + return true; + } + + @Override + int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier, + float[] flowMultipliers) { + if (aFluids.size() >= 1) { + aOptFlow *= 800; // CHANGED THINGS HERE, check recipe runs once per 20 ticks + int tEU = 0; + + int actualOptimalFlow = 0; + + FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process. + // Doesn't matter which one. Ignore the rest! + int fuelValue = getFuelValue(firstFuelType); + actualOptimalFlow = GTUtility + .safeInt((long) Math.ceil((double) aOptFlow * flowMultipliers[2] / (double) fuelValue)); + this.realOptFlow = actualOptimalFlow; // For scanner info + + // Allowed to use up to 550% optimal flow rate, depending on the value of overflowMultiplier. + // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula + // used + // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow + // rate): + // - 250% if it is 1 + // - 400% if it is 2 + // - 550% if it is 3 + // Variable required outside of loop for multi-hatch scenarios. + int remainingFlow = GTUtility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier + 1))); + int flow = 0; + int totalFlow = 0; + + storedFluid = 0; + for (FluidStack aFluid : aFluids) { + if (aFluid.isFluidEqual(firstFuelType)) { + flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above + depleteInput(new FluidStack(aFluid, flow)); // deplete that amount + this.storedFluid += aFluid.amount; + remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches + totalFlow += flow; // track total input used + } + } + String fn = FluidRegistry.getFluidName(firstFuelType); + String[] nameSegments = fn.split("\\.", 2); + if (nameSegments.length == 2) { + String outputName = nameSegments[1]; + FluidStack output = FluidRegistry.getFluidStack(outputName, totalFlow); + if (output == null) { + output = FluidRegistry.getFluidStack("molten." + outputName, totalFlow); + } + if (output != null) { + addOutput(output); + } + } + if (totalFlow <= 0) return 0; + tEU = GTUtility.safeInt((long) ((fuelValue / 20D) * (double) totalFlow)); + + // GT_FML_LOGGER.info(totalFlow+" : "+fuelValue+" : "+aOptFlow+" : "+actualOptimalFlow+" : "+tEU); + + if (totalFlow != actualOptimalFlow) { + float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier); + tEU = (int) (tEU * efficiency); + } + tEU = GTUtility.safeInt((long) (aBaseEff / 10000D * tEU)); + + // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the + // turbine + // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate + // can explode turbines on world load + if (tEU > getMaximumOutput()) { + tEU = GTUtility.safeInt(getMaximumOutput()); + } + + return tEU; + } + return 0; + } + + @Override + float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { + // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value + // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of + // fuel used + // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value + // Plasmas are the most efficient out of all turbine fuels in this regard + float efficiency = 0; + + if (totalFlow > actualOptimalFlow) { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow)) + / ((float) actualOptimalFlow * ((overflowMultiplier * 3) + 1)); + } else { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); + } + + return efficiency; + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + ItemStack controllerSlot = getControllerSlot(); + if ((counter & 7) == 0 && (controllerSlot == null || !(controllerSlot.getItem() instanceof MetaGeneratedTool) + || controllerSlot.getItemDamage() < 170 + || controllerSlot.getItemDamage() > 179)) { + stopMachine(ShutDownReasonRegistry.NO_TURBINE); + return CheckRecipeResultRegistry.NO_TURBINE_FOUND; + } + ArrayList tFluids = getStoredFluids(); + if (!tFluids.isEmpty()) { + if (baseEff == 0 || optFlow == 0 + || counter >= 512 + || this.getBaseMetaTileEntity() + .hasWorkJustBeenEnabled() + || this.getBaseMetaTileEntity() + .hasInventoryBeenModified()) { + counter = 0; + baseEff = GTUtility.safeInt( + (long) ((5F + ((MetaGeneratedTool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot)) + * 1000F)); + optFlow = GTUtility.safeInt( + (long) Math.max( + Float.MIN_NORMAL, + ((MetaGeneratedTool) controllerSlot.getItem()).getToolStats(controllerSlot) + .getSpeedMultiplier() * MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mToolSpeed + * 50)); + overflowMultiplier = getOverflowMultiplier(controllerSlot); + + flowMultipliers[0] = MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mSteamMultiplier; + flowMultipliers[1] = MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mGasMultiplier; + flowMultipliers[2] = MetaGeneratedTool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier; + + if (optFlow <= 0 || baseEff <= 0) { + stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed + return CheckRecipeResultRegistry.NO_FUEL_FOUND; + } + } else { + counter++; + } + } + + int newPower = fluidIntoPower(tFluids, optFlow, baseEff, overflowMultiplier, flowMultipliers); // How much the + // turbine should + // be producing + // with this flow + + int difference = newPower - this.mEUt; // difference between current output and new output + + // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the difference in + // power level (per tick) + // This is how much the turbine can actually change during this tick + int maxChangeAllowed = Math.max(200, GTUtility.safeInt((long) Math.abs(difference) / 5)); + + if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed change + int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative. + this.mEUt += change; // Apply the change + } else this.mEUt = newPower; + + if (this.mEUt <= 0) { + // stopMachine(); + this.mEUt = 0; + this.mEfficiency = 0; + return CheckRecipeResultRegistry.NO_FUEL_FOUND; + } else { + this.mMaxProgresstime = 20; + this.mEfficiencyIncrease = 200; + // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here. + + return CheckRecipeResultRegistry.GENERATING; + } + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + } + + String tRunning = mMaxProgresstime > 0 + ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true") + + EnumChatFormatting.RESET + : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false") + + EnumChatFormatting.RESET; + String tMaintainance = getIdealStatus() == getRepairStatus() + ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false") + + EnumChatFormatting.RESET + : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true") + + EnumChatFormatting.RESET; + int tDura = 0; + + if (mInventory[1] != null && mInventory[1].getItem() instanceof MetaGeneratedTool01) { + tDura = GTUtility.safeInt( + (long) (100.0f / MetaGeneratedTool.getToolMaxDamage(mInventory[1]) + * (MetaGeneratedTool.getToolDamage(mInventory[1])) + 1)); + } + + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatchDynamo tHatch : filterValidMTEs(mDynamoHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + String[] ret = new String[] { + // 8 Lines available for information panels + tRunning + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(((long) mEUt * mEfficiency) / 10000) + + EnumChatFormatting.RESET + + " EU/t", /* 1 */ + tMaintainance, /* 2 */ + StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": " + + EnumChatFormatting.YELLOW + + (mEfficiency / 100F) + + EnumChatFormatting.RESET + + "%", /* 2 */ + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + /* 3 */ EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + StatCollector.translateToLocal("GT5U.turbine.flow") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(GTUtility.safeInt((long) realOptFlow)) + + EnumChatFormatting.RESET + + " L/s" + + /* 4 */ EnumChatFormatting.YELLOW + + " (" + + (looseFit ? StatCollector.translateToLocal("GT5U.turbine.loose") + : StatCollector.translateToLocal("GT5U.turbine.tight")) + + ")", /* 5 */ + StatCollector.translateToLocal("GT5U.turbine.fuel") + ": " + + EnumChatFormatting.GOLD + + GTUtility.formatNumbers(storedFluid) + + EnumChatFormatting.RESET + + "L", /* 6 */ + StatCollector.translateToLocal( + "GT5U.turbine.dmg") + ": " + EnumChatFormatting.RED + tDura + EnumChatFormatting.RESET + "%", /* 7 */ + StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" /* 8 */ + }; + if (!this.getClass() + .getName() + .contains("Steam")) + ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.safeInt((long) realOptFlow) + + EnumChatFormatting.RESET + + " L/s"; + return ret; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineSteam.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineSteam.java new file mode 100644 index 0000000000..b017862fa8 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeTurbineSteam.java @@ -0,0 +1,273 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.GTValues.STEAM_PER_WATER; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5; +import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +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.GTModHandler; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTELargeTurbineSteam extends MTELargeTurbine { + + private int excessWater; + private boolean achievement = false; + private boolean looseFit = false; + + public MTELargeTurbineSteam(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTELargeTurbineSteam(String aName) { + super(aName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1], + aFacing == side ? (aActive ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_ACTIVE5) + .build() + : hasTurbine() ? TextureFactory.builder() + .addIcon(LARGETURBINE_NEW5) + .build() + : TextureFactory.builder() + .addIcon(LARGETURBINE_NEW_EMPTY5) + .build()) + : casingTexturePages[0][57] }; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Steam Turbine") + .addInfo("Controller block for the Large Steam Turbine") + .addInfo("Needs a Turbine, place inside controller") + .addInfo("Outputs Distilled Water as well as producing power") + .addInfo("Power output depends on turbine and fitting") + .addInfo("Use screwdriver to adjust fitting of turbine") + .addSeparator() + .beginStructureBlock(3, 3, 4, true) + .addController("Front center") + .addCasingInfoRange("Turbine Casing", 8, 31, false) + .addDynamoHatch("Back center", 1) + .addMaintenanceHatch("Side centered", 2) + .addInputHatch("Steam, Side centered", 2) + .addOutputHatch("Distilled Water, Side centered", 2) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELargeTurbineSteam(mName); + } + + @Override + public Block getCasingBlock() { + return GregTechAPI.sBlockCasings4; + } + + @Override + public byte getCasingMeta() { + return 9; + } + + @Override + public int getCasingTextureIndex() { + return 16; + } + + @Override + public boolean isNewStyleRendering() { + return true; + } + + private int condenseSteam(int steam) { + excessWater += steam; + int water = excessWater / STEAM_PER_WATER; + excessWater %= STEAM_PER_WATER; + return water; + } + + @Override + int fluidIntoPower(ArrayList aFluids, int aOptFlow, int aBaseEff, int overflowEfficiency, + float[] flowMultipliers) { + if (looseFit) { + float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff); + aOptFlow = GTUtility.safeInt((long) calculatedFlow[0]); + aBaseEff = GTUtility.safeInt((long) calculatedFlow[1]); + } + int tEU = 0; + int totalFlow = 0; // Byproducts are based on actual flow + int flow = 0; + + // Allowed to use up to 250% optimal flow rate, depending on the value of overflowMultiplier. + // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula + // used + // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow + // rate): + // - 150% if it is 1 + // - 200% if it is 2 + // - 250% if it is 3 + // Variable required outside of loop for multi-hatch scenarios. + this.realOptFlow = aOptFlow * flowMultipliers[0]; + int remainingFlow = GTUtility.safeInt((long) (realOptFlow * (0.5f * overflowMultiplier + 1))); + + storedFluid = 0; + for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) { // loop through each hatch; extract inputs and + // track totals. + final FluidStack aFluidStack = aFluids.get(i); + if (GTModHandler.isAnySteam(aFluidStack)) { + flow = Math.min(aFluidStack.amount, remainingFlow); // try to use up to the max flow defined just above + depleteInput(new FluidStack(aFluidStack, flow)); // deplete that amount + this.storedFluid += aFluidStack.amount; + remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches + totalFlow += flow; // track total input used + if (!achievement) { + GTMod.achievements.issueAchievement( + this.getBaseMetaTileEntity() + .getWorld() + .getPlayerEntityByName( + this.getBaseMetaTileEntity() + .getOwnerName()), + "muchsteam"); + achievement = true; + } + } else if (GTModHandler.isSuperHeatedSteam(aFluidStack)) { + depleteInput(new FluidStack(aFluidStack, aFluidStack.amount)); + } + } + if (totalFlow <= 0) return 0; + tEU = totalFlow; + int waterToOutput = condenseSteam(totalFlow); + addOutput(GTModHandler.getDistilledWater(waterToOutput)); + if (totalFlow == (GTUtility.safeInt((long) realOptFlow))) { + tEU = GTUtility.safeInt((long) tEU * (long) aBaseEff / 20000L); + } else { + float efficiency = getOverflowEfficiency( + totalFlow, + (GTUtility.safeInt((long) realOptFlow)), + overflowMultiplier); + tEU *= efficiency; + tEU = Math.max(1, GTUtility.safeInt((long) tEU * (long) aBaseEff / 20000L)); + } + + // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the + // turbine + // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate can + // explode turbines on world load + if (tEU > getMaximumOutput()) { + tEU = GTUtility.safeInt(getMaximumOutput()); + } + + return tEU; + } + + @Override + float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) { + // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value + // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of + // fuel used + // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value + // Steam is the least efficient out of all turbine fuels in this regard + float efficiency = 0; + + if (totalFlow > actualOptimalFlow) { + efficiency = 1.0f + - Math.abs((totalFlow - actualOptimalFlow)) / ((float) actualOptimalFlow * (overflowMultiplier + 1)); + } else { + efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow); + } + + return efficiency; + } + + public static float[] calculateLooseFlow(float aOptFlow, float aBaseEff) { + aOptFlow *= 4f; + if (aBaseEff >= 26000f) { + aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 8000f) / 10000f) * 20f); + aBaseEff = aBaseEff * 0.6f; + } else if (aBaseEff > 22000f) { + aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 7000f) / 10000f) * 20f); + aBaseEff = aBaseEff * 0.65f; + } else if (aBaseEff > 18000f) { + aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 6000f) / 10000f) * 20f); + aBaseEff = aBaseEff * 0.70f; + } else if (aBaseEff > 14000f) { + aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 5000f) / 10000f) * 20f); + aBaseEff = aBaseEff * 0.75f; + } else if (aBaseEff > 10000f) { + aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 4000f) / 10000f) * 20f); + aBaseEff = aBaseEff * 0.8f; + } else if (aBaseEff > 6000f) { + aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 3000f) / 10000f) * 20f); + aBaseEff = aBaseEff * 0.85f; + } else { + aBaseEff = aBaseEff * 0.9f; + } + + if (aBaseEff % 100 != 0) { + aBaseEff -= aBaseEff % 100; + } + + float[] looseFlow = new float[2]; + looseFlow[0] = aOptFlow; + looseFlow[1] = aBaseEff; + return looseFlow; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (side == getBaseMetaTileEntity().getFrontFacing()) { + looseFit ^= true; + GTUtility.sendChatToPlayer( + aPlayer, + looseFit ? GTUtility.trans("500", "Fitting: Loose - More Flow") + : GTUtility.trans("501", "Fitting: Tight - More Efficiency")); + } + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return (looseFit && XSTR_INSTANCE.nextInt(4) == 0) ? 0 : 1; + } + + @Override + public String[] getInfoData() { + super.looseFit = looseFit; + return super.getInfoData(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("turbineFitting", looseFit); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + looseFit = aNBT.getBoolean("turbineFitting"); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiAutoclave.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiAutoclave.java new file mode 100644 index 0000000000..5d10d55277 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiAutoclave.java @@ -0,0 +1,419 @@ +package gregtech.common.tileentities.machines.multi; + +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 com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel; +import static gregtech.api.enums.GTValues.AuthorVolence; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_AUTOCLAVE_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofCoil; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.text.DecimalFormat; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +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.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings10; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEMultiAutoclave extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + public MTEMultiAutoclave(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEMultiAutoclave(String aName) { + super(aName); + } + + private HeatingCoilLevel heatLevel; + + private static final String STRUCTURE_PIECE_MAIN = "main"; + + protected int itemPipeTier = 0; + protected int fluidPipeTier = 0; + + private static Integer getItemPipeTierFromMeta(Block block, Integer metaID) { + if (block != GregTechAPI.sBlockCasings11) return -1; + if (metaID < 0 || metaID > 7) return -1; + return metaID + 1; + } + + private void setItemPipeTier(int tier) { + itemPipeTier = tier; + } + + private int getItemPipeTier() { + return itemPipeTier; + } + + private static Integer getFluidTierFromMeta(Block block, Integer metaID) { + if (block != GregTechAPI.sBlockCasings2) return -1; + if (metaID < 12 || metaID > 15) return -1; + return metaID - 11; + } + + private void setFluidPipeTier(int tier) { + fluidPipeTier = tier; + } + + private int getFluidPipeTier() { + return fluidPipeTier; + } + + public HeatingCoilLevel getCoilLevel() { + return this.heatLevel; + } + + public void setCoilLevel(HeatingCoilLevel aCoilLevel) { + this.heatLevel = aCoilLevel; + } + + public Integer getCoilTier() { + return (int) this.getCoilLevel() + .getTier() + 1; + } + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { + { " AAA ", " AFA ", " AFA ", " AFA ", " AFA ", " AFA ", " AFA ", " AFA ", + " AAA " }, + { " ABBBA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", + " ABBBA ", }, + { "ABBBBBA", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", + "ABBBBBA", }, + { "ABBBBBA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", "ACDEDCA", + "ABBBBBA", }, + { "ABBBBBA", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", "A C C A", + "ABBBBBA", }, + { "AABBBAA", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", + "AABBBAA", }, + { "A A~A A", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", + "A AAA A" } })) + .addElement( + 'A', + buildHatchAdder(MTEMultiAutoclave.class) + .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Muffler, Energy) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(3)) + .dot(1) + .buildAndChain( + onElementPass(MTEMultiAutoclave::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 3)))) + .addElement('B', Glasses.chainAllGlasses()) // Steel Casings + .addElement('C', ofFrame(Materials.Polytetrafluoroethylene)) // PTFE Frame + .addElement( + 'D', + ofBlocksTiered( + MTEMultiAutoclave::getFluidTierFromMeta, + ImmutableList.of( + Pair.of(GregTechAPI.sBlockCasings2, 12), + Pair.of(GregTechAPI.sBlockCasings2, 13), + Pair.of(GregTechAPI.sBlockCasings2, 14), + Pair.of(GregTechAPI.sBlockCasings2, 15)), + -2, + MTEMultiAutoclave::setFluidPipeTier, + MTEMultiAutoclave::getFluidPipeTier)) + .addElement( + 'E', + ofBlocksTiered( + MTEMultiAutoclave::getItemPipeTierFromMeta, + ImmutableList.of( + Pair.of(GregTechAPI.sBlockCasings11, 0), + Pair.of(GregTechAPI.sBlockCasings11, 1), + Pair.of(GregTechAPI.sBlockCasings11, 2), + Pair.of(GregTechAPI.sBlockCasings11, 3), + Pair.of(GregTechAPI.sBlockCasings11, 4), + Pair.of(GregTechAPI.sBlockCasings11, 5), + Pair.of(GregTechAPI.sBlockCasings11, 6), + Pair.of(GregTechAPI.sBlockCasings11, 7)), + -2, + MTEMultiAutoclave::setItemPipeTier, + MTEMultiAutoclave::getItemPipeTier)) + .addElement('F', withChannel("coil", ofCoil(MTEMultiAutoclave::setCoilLevel, MTEMultiAutoclave::getCoilLevel))) + .build(); + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Autoclave") + .addInfo("Controller Block for the Industrial Autoclave.") + .addInfo("Gains 12 parallels per item pipe casing tier.") + .addInfo("Each pipe casing (bronze, steel, titanium, tungstensteel)") + .addInfo("decreases the EU usageby 1/pipe tier.") + .addInfo("Heating Coils increase speed by 1/((tier + 1) / 2).") + .addInfo("Needs a minimum of 128 Pressure Containment Casings.") + .addInfo(AuthorVolence) + .addSeparator() + .beginStructureBlock(7, 5, 5, true) + .addController("Front Center") + .addCasingInfoMin("Pressure Containment Casings", 128, false) + .addCasingInfoExactly("Item Pipe Casings", 7, true) + .addCasingInfoExactly("Pipe Casings", 14, true) + .addCasingInfoExactly("Heating Coils", 7, true) + .addCasingInfoExactly("PTFE Frame", 42, false) + .addInputBus("Any of the Pressure Containment Casings", 1) + .addOutputBus("Any of the Pressure Containment Casings", 1) + .addEnergyHatch("Any of the Pressure Containment Casings", 1) + .addMaintenanceHatch("Any of the Pressure Containment Casings", 1) + .addMufflerHatch("Any of the Pressure Containment Casings", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + fluidPipeTier = -2; + itemPipeTier = -2; + mCasingAmount = 0; + mEnergyHatches.clear(); + setCoilLevel(HeatingCoilLevel.None); + if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 6, 0)) return false; + return this.mMaintenanceHatches.size() == 1 && fluidPipeTier >= 0 + && mCasingAmount >= 128 + && itemPipeTier >= 0 + && mEnergyHatches.size() >= 1 + && mMufflerHatches.size() == 1; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 3)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 3)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_AUTOCLAVE_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 3)) }; + } + return rTexture; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 6, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + int build = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 6, 0, elementBudget, env, false, true); + return build; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMultiAutoclave(this.mName); + } + + public float euModifier(int fluidPipeTier) { + return (float) (12 - fluidPipeTier) / 12; + } + + public float speedBoost(int coilTier) { + return (float) 1 / (1 + 0.25f * coilTier); + } + + public int getMaxParallelRecipes() { + return itemPipeTier * 12; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @Override + @Nonnull + public CheckRecipeResult process() { + euModifier = euModifier(fluidPipeTier); + speedBoost = speedBoost(getCoilTier()); + return super.process(); + } + }.setMaxParallelSupplier(this::getMaxParallelRecipes); + } + + @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("fluidPipeTier", getFluidPipeTier()); + tag.setInteger("itemPipeTier", getItemPipeTier()); + tag.setInteger("coilTier", getCoilTier()); + tag.setFloat("getMaxParallelRecipes", getMaxParallelRecipes()); + } + + private static final DecimalFormat dfTwo = new DecimalFormat("0.00"); + private static final DecimalFormat dfNone = new DecimalFormat("#"); + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currenttip, accessor, config); + NBTTagCompound tag = accessor.getNBTData(); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.fluidPipeTier") + ": " + + EnumChatFormatting.WHITE + + Math.max(0, tag.getInteger("fluidPipeTier"))); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.euModifier") + ": " + + EnumChatFormatting.WHITE + + dfTwo.format(Math.max(0, euModifier(tag.getInteger("fluidPipeTier")) * 100)) + + "%"); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.itemPipeTier") + ": " + + EnumChatFormatting.WHITE + + Math.max(0, tag.getInteger("itemPipeTier"))); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " + + EnumChatFormatting.WHITE + + dfNone.format(Math.max(0, tag.getFloat("getMaxParallelRecipes")))); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.coilLevel") + ": " + + EnumChatFormatting.WHITE + + Math.max(0, tag.getInteger("coilTier"))); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.speed") + ": " + + EnumChatFormatting.WHITE + + dfNone.format(Math.max(0, 100 / speedBoost(tag.getInteger("coilTier")))) + + "%"); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.autoclaveRecipes; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiCanner.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiCanner.java new file mode 100644 index 0000000000..3af4b17e29 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiCanner.java @@ -0,0 +1,310 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_CANNER_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +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.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.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.GregTechAPI; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings2; +import gtPlusPlus.core.util.minecraft.PlayerUtils; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEMultiCanner extends MTEExtendedPowerMultiBlockBase implements ISurvivalConstructable { + + private static final int MACHINEMODE_CANNER = 0; + private static final int MACHINEMODE_FLUIDCANNER = 1; + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + (transpose( + new String[][] { { " AAA ", " AAAAA ", "AAAAAAA", "AAAAAAA", "AAAAAAA", " AAAAA ", " AAA " }, + { " ", " B B ", " BAAAB ", " A A ", " BAAAB ", " B B ", " " }, + { " ", " B B ", " BA~AB ", " A A ", " BAAAB ", " B B ", " " }, + { " ", " B B ", " BAAAB ", " A A ", " BAAAB ", " B B ", " " }, + { " AAA ", " AAAAA ", "AAAAAAA", "AAAAAAA", "AAAAAAA", " AAAAA ", " AAA " } }))) + .addElement( + 'A', + buildHatchAdder(MTEMultiCanner.class) + .atLeast(InputBus, OutputBus, Maintenance, Energy, InputHatch, OutputHatch) + .casingIndex(((BlockCasings2) GregTechAPI.sBlockCasings2).getTextureIndex(0)) + .dot(1) + .buildAndChain(onElementPass(MTEMultiCanner::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings2, 0)))) + .addElement('B', ofBlock(GregTechAPI.sBlockCasings2, 13)) + .build(); + + public MTEMultiCanner(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEMultiCanner(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMultiCanner(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings2, 0)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_CANNER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_CANNER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings2, 0)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_CANNER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_CANNER_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings2, 0)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Canner/Fluid Canner") + .addInfo("Controller Block for the TurboCan Pro") + .addInfo("Use screwdriver to switch mode") + .addInfo("100% faster than single block machines of the same voltage") + .addInfo("Gains 8 parallels per voltage tier") + .addInfo(EnumChatFormatting.BLUE + "It's uncanny!") + .addInfo(AuthorFourIsTheNumber) + .addSeparator() + .beginStructureBlock(7, 5, 7, true) + .addController("Front Center") + .addCasingInfoMin("Solid Steel Machine Casing", 85, false) + .addCasingInfoExactly("Steel Pipe Casing", 24, false) + .addInputBus("Any Solid Steel Casing", 1) + .addOutputBus("Any Solid Steel Casing", 1) + .addInputHatch("Any Solid Steel Casing", 1) + .addOutputHatch("Any Solid Steel Casing", 1) + .addEnergyHatch("Any Solid Steel Casing", 1) + .addMaintenanceHatch("Any Solid Steel Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 2, 2); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 2, 2, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + mEnergyHatches.clear(); + + if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 2, 2)) return false; + if (mCasingAmount < 85) return false; + + // All checks passed! + return true; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic().setSpeedBonus(1F / 2F) + .setMaxParallelSupplier(this::getMaxParallelRecipes); + } + + public int getMaxParallelRecipes() { + return (8 * GTUtility.getTier(this.getMaxInputVoltage())); + } + + @Override + public RecipeMap getRecipeMap() { + return (machineMode == MACHINEMODE_FLUIDCANNER) ? RecipeMaps.fluidCannerRecipes : RecipeMaps.cannerRecipes; + } + + @Nonnull + @Override + public Collection> getAvailableRecipeMaps() { + return Arrays.asList(RecipeMaps.fluidCannerRecipes, RecipeMaps.cannerRecipes); + } + + @Override + public int getRecipeCatalystPriority() { + return -10; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + if (aNBT.hasKey("fluidMode")) { + machineMode = aNBT.getBoolean("fluidMode") ? MACHINEMODE_FLUIDCANNER : MACHINEMODE_CANNER; + } + super.loadNBTData(aNBT); + } + + @Override + public boolean supportsMachineModeSwitch() { + return true; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + setMachineMode(nextMachineMode()); + PlayerUtils.messagePlayer( + aPlayer, + String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); + } + + @Override + public void setMachineModeIcons() { + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_PACKAGER); + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_LPF_FLUID); + } + + @Override + public String getMachineModeName() { + return StatCollector.translateToLocal("GT5U.MULTI_CANNER.mode." + machineMode); + } + + @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", machineMode); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + currentTip.add( + StatCollector.translateToLocal("GT5U.machines.oreprocessor1") + " " + + EnumChatFormatting.WHITE + + StatCollector.translateToLocal("GT5U.MULTI_CANNER.mode." + tag.getInteger("mode")) + + EnumChatFormatting.RESET); + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiFurnace.java new file mode 100644 index 0000000000..a11ef41dbd --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiFurnace.java @@ -0,0 +1,373 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +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.GTModHandler; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; + +public class MTEMultiFurnace extends MTEAbstractMultiFurnace implements ISurvivalConstructable { + + private int mLevel = 0; + private int mCostDiscount = 1; + + private static final long RECIPE_EUT = 4; + private static final int RECIPE_DURATION = 512; + private static final int CASING_INDEX = 11; + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose(new String[][] { { "ccc", "cmc", "ccc" }, { "CCC", "C-C", "CCC" }, { "b~b", "bbb", "bbb" } })) + .addElement('c', ofBlock(GregTechAPI.sBlockCasings1, CASING_INDEX)) + .addElement('m', Muffler.newAny(CASING_INDEX, 2)) + .addElement('C', GTStructureUtility.ofCoil(MTEMultiFurnace::setCoilLevel, MTEMultiFurnace::getCoilLevel)) + .addElement( + 'b', + ofChain( + GTStructureUtility.buildHatchAdder() + .atLeast(Maintenance, InputBus, OutputBus, Energy) + .casingIndex(CASING_INDEX) + .dot(1) + .build(), + ofBlock(GregTechAPI.sBlockCasings1, CASING_INDEX))) + .build(); + + public MTEMultiFurnace(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEMultiFurnace(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMultiFurnace(this.mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Furnace") + .addInfo("Controller Block for the Multi Smelter") + .addInfo("Smelts up to 8-8192 items at once") + .addInfo("Items smelted increases with coil tier") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(3, 3, 3, true) + .addController("Front bottom") + .addCasingInfoRange("Heat Proof Machine Casing", 8, 14, false) + .addOtherStructurePart("Heating Coils", "Middle layer") + .addEnergyHatch("Any bottom casing", 1) + .addMaintenanceHatch("Any bottom casing", 1) + .addMufflerHatch("Top Middle", 2) + .addInputBus("Any bottom casing", 1) + .addOutputBus("Any bottom casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection != facingDirection) return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; + if (active) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_SMELTER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_SMELTER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_SMELTER_GLOW) + .extFacing() + .glow() + .build() }; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.furnaceRecipes; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionMultiSmelterPerSecond; + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + ArrayList tInputList = getAllStoredInputs(); + if (tInputList.isEmpty()) return CheckRecipeResultRegistry.NO_RECIPE; + + long inputVoltage = getMaxInputVoltage(); + + int fakeOriginalMaxParallel = 1; + OverclockCalculator calculator = new OverclockCalculator().setEUt(inputVoltage) + .setRecipeEUt(RECIPE_EUT) + .setDuration(RECIPE_DURATION) + .setParallel(fakeOriginalMaxParallel); + + int maxParallel = this.mLevel; + int originalMaxParallel = maxParallel; + double tickTimeAfterOC = calculator.calculateDurationUnderOneTick(); + if (tickTimeAfterOC < 1) { + maxParallel = GTUtility.safeInt((long) (maxParallel / tickTimeAfterOC), 0); + } + + int maxParallelBeforeBatchMode = maxParallel; + if (isBatchModeEnabled()) { + maxParallel = GTUtility.safeInt((long) maxParallel * getMaxBatchSize(), 0); + } + + // Calculate parallel + int currentParallel = 0; + for (ItemStack item : tInputList) { + ItemStack smeltedOutput = GTModHandler.getSmeltingOutput(item, false, null); + if (smeltedOutput != null) { + if (item.stackSize <= (maxParallel - currentParallel)) { + currentParallel += item.stackSize; + } else { + currentParallel = maxParallel; + break; + } + } + } + if (currentParallel <= 0) { + return CheckRecipeResultRegistry.NO_RECIPE; + } + int currentParallelBeforeBatchMode = Math.min(currentParallel, maxParallelBeforeBatchMode); + int fakeCurrentParallel = (int) Math.ceil((double) currentParallelBeforeBatchMode / originalMaxParallel); + + calculator.setCurrentParallel(fakeCurrentParallel) + .calculate(); + + double batchMultiplierMax = 1; + // In case batch mode enabled + if (currentParallel > maxParallelBeforeBatchMode && calculator.getDuration() < getMaxBatchSize()) { + batchMultiplierMax = (double) getMaxBatchSize() / calculator.getDuration(); + batchMultiplierMax = Math.min(batchMultiplierMax, (double) currentParallel / maxParallelBeforeBatchMode); + } + int finalParallel = (int) (batchMultiplierMax * maxParallelBeforeBatchMode); + + // Consume inputs and generate outputs + ArrayList smeltedOutputs = new ArrayList<>(); + int remainingCost = finalParallel; + for (ItemStack item : tInputList) { + ItemStack smeltedOutput = GTModHandler.getSmeltingOutput(item, false, null); + if (smeltedOutput != null) { + if (remainingCost >= item.stackSize) { + remainingCost -= item.stackSize; + smeltedOutput.stackSize *= item.stackSize; + item.stackSize = 0; + smeltedOutputs.add(smeltedOutput); + } else { + smeltedOutput.stackSize *= remainingCost; + item.stackSize -= remainingCost; + smeltedOutputs.add(smeltedOutput); + break; + } + } + } + this.mOutputItems = smeltedOutputs.toArray(new ItemStack[0]); + + this.mEfficiency = 10000 - (getIdealStatus() - getRepairStatus()) * 1000; + this.mEfficiencyIncrease = 10000; + this.mMaxProgresstime = (int) (calculator.getDuration() * batchMultiplierMax); + this.lEUt = calculator.getConsumption(); + + if (this.lEUt > 0) this.lEUt = -this.lEUt; + + updateSlots(); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + this.mLevel = 0; + this.mCostDiscount = 1; + + replaceDeprecatedCoils(aBaseMetaTileEntity); + + setCoilLevel(HeatingCoilLevel.None); + + if (!checkPiece(STRUCTURE_PIECE_MAIN, 1, 2, 0)) return false; + + if (getCoilLevel() == HeatingCoilLevel.None) return false; + + if (mMaintenanceHatches.size() != 1) return false; + + if (getCoilLevel().getHeat() < 9000) { + this.mLevel = 8 * getCoilLevel().getLevel(); + } else { + this.mLevel = 1 << (getCoilLevel().getTier()); + } + this.mCostDiscount = getCoilLevel().getCostDiscount(); + return true; + } + + private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) { + final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; + final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; + final int tX = aBaseMetaTileEntity.getXCoord() + xDir; + final int tY = aBaseMetaTileEntity.getYCoord(); + final int tZ = aBaseMetaTileEntity.getZCoord() + zDir; + int tUsedMeta; + for (int xPos = tX - 1; xPos <= tX + 1; xPos++) for (int zPos = tZ - 1; zPos <= tZ + 1; zPos++) { + if ((xPos == tX) && (zPos == tZ)) continue; + tUsedMeta = aBaseMetaTileEntity.getMetaID(xPos, tY + 1, zPos); + if (tUsedMeta >= 12 && tUsedMeta <= 14 + && aBaseMetaTileEntity.getBlock(xPos, tY + 1, zPos) == GregTechAPI.sBlockCasings1) + aBaseMetaTileEntity.getWorld() + .setBlock(xPos, tY + 1, zPos, GregTechAPI.sBlockCasings5, tUsedMeta - 12, 3); + } + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (final MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + + long storedEnergy = 0; + long maxEnergy = 0; + for (final MTEHatchEnergy tHatch : filterValidMTEs(mEnergyHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { + StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(-lEUt) + + EnumChatFormatting.RESET + + " EU/t", + StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getMaxInputVoltage()) + + EnumChatFormatting.RESET + + " EU/t(*2A) " + + StatCollector.translateToLocal("GT5U.machines.tier") + + ": " + + EnumChatFormatting.YELLOW + + VN[GTUtility.getTier(getMaxInputVoltage())] + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.multiblock.efficiency") + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + StatCollector.translateToLocal("GT5U.MS.multismelting") + ": " + + EnumChatFormatting.GREEN + + mLevel + + EnumChatFormatting.RESET + + " Discount: (EU/t) / " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mCostDiscount) + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %" }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 2, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 2, 0, elementBudget, env, false, true); + } + + @Override + public boolean supportsBatchMode() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiLathe.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiLathe.java new file mode 100644 index 0000000000..e0c8e35444 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEMultiLathe.java @@ -0,0 +1,369 @@ +package gregtech.common.tileentities.machines.multi; + +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.GTValues.AuthorVolence; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_LATHE_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +import java.text.DecimalFormat; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +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.GregTechTileClientEvents; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings2; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEMultiLathe extends MTEEnhancedMultiBlockBase implements ISurvivalConstructable { + + public MTEMultiLathe(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEMultiLathe(String aName) { + super(aName); + } + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final String STRUCTURE_PIECE_BODY = "body"; + private static final String STRUCTURE_PIECE_BODY_ALT = "body_alt"; + + protected int pipeTier = 0; + + public enum PipeTiers { + + Platinum(4, 1F), + Osmium(8, 1.25F), + Quantium(12, 1.5F), + FluxedElectrum(16, 2F), + BlackPlutonium(32, 2.5F); + + final int maxParallel; + final float speedBoost; + + PipeTiers(int maxParallel, float speedBoost) { + this.maxParallel = maxParallel; + this.speedBoost = speedBoost; + } + } + + private PipeTiers getPipeData() { + pipeTier = getPipeTier(); + return switch (pipeTier) { + case 2 -> PipeTiers.Osmium; + case 3 -> PipeTiers.Quantium; + case 4 -> PipeTiers.FluxedElectrum; + case 5 -> PipeTiers.BlackPlutonium; + default -> PipeTiers.Platinum; + }; + } + + // get tier from block meta + private static Integer getTierFromMeta(Block block, Integer metaID) { + if (block != GregTechAPI.sBlockCasings11) return -1; + if (metaID < 3 || metaID > 7) return -1; + return (metaID - 2); + } + + private void setPipeTier(int tier) { + pipeTier = tier; + } + + private int getPipeTier() { + return pipeTier; + } + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose(new String[][] { { " " }, { " " }, { " " }, { " " }, { "AAA~AAA" } })) + .addShape( + STRUCTURE_PIECE_BODY, + (transpose( + new String[][] { { " ", "AAAAAAA", " ", " " }, + { "DBCCCCD", "DBCCCCD", "DBCCCCD", " " }, { "DBCCCCD", "DBFFFFD", "DBCCCCD", " " }, + { "DBCCCCD", "DBCCCCD", "DBCCCCD", " " }, { "AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA" } }))) + .addShape( + STRUCTURE_PIECE_BODY_ALT, + (transpose( + new String[][] { { " ", "AAAAAAA", " ", " " }, + { "DCCCCBD", "DCCCCBD", "DCCCCBD", " " }, { "DCCCCBD", "DFFFFBD", "DCCCCBD", " " }, + { "DCCCCBD", "DCCCCBD", "DCCCCBD", " " }, { "AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA" } }))) + .addElement( + 'A', + buildHatchAdder(MTEMultiLathe.class).atLeast(Maintenance, Muffler, Energy) + .casingIndex(((BlockCasings2) GregTechAPI.sBlockCasings2).getTextureIndex(0)) + .dot(1) + .buildAndChain(onElementPass(MTEMultiLathe::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings2, 0)))) + .addElement('B', ofBlock(GregTechAPI.sBlockCasings3, 10)) // Steel Casings + .addElement('C', Glasses.chainAllGlasses()) // Glass + .addElement( + 'D', + buildHatchAdder(MTEMultiLathe.class).atLeast(InputBus, OutputBus, Maintenance, Muffler, Energy) + .casingIndex(((BlockCasings2) GregTechAPI.sBlockCasings2).getTextureIndex(0)) + .dot(1) + .buildAndChain(onElementPass(MTEMultiLathe::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings2, 0)))) + .addElement( + 'F', + ofBlocksTiered( + MTEMultiLathe::getTierFromMeta, + ImmutableList.of( + Pair.of(GregTechAPI.sBlockCasings11, 3), + Pair.of(GregTechAPI.sBlockCasings11, 4), + Pair.of(GregTechAPI.sBlockCasings11, 5), + Pair.of(GregTechAPI.sBlockCasings11, 6), + Pair.of(GregTechAPI.sBlockCasings11, 7)), + -2, + MTEMultiLathe::setPipeTier, + MTEMultiLathe::getPipeTier)) + .build(); + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEMultiLathe(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings2, 0)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_LATHE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_LATHE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings2, 0)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_LATHE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_LATHE_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings2, 0)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Lathe") + .addInfo("Controller Block for the Industrial Precision Lathe") + .addInfo("Gains 2 parallels per voltage tier,") + .addInfo("and 4 parallels per pipe casing tier (16 for Black Plutonium)") + .addInfo("Better pipe casings increase speed") + .addInfo("Only uses 80% of the recipe's required energy") + .addInfo(AuthorVolence) + .addSeparator() + .beginStructureBlock(7, 5, 5, true) + .addController("Front Center") + .addCasingInfoMin("Solid Steel Machine Casing", 36, false) + .addCasingInfoExactly("Steel Pipe Casing", 8, false) + .addInputBus("Any of the 9 Solid Steel Casing at Each End", 1) + .addOutputBus("Any of the 9 Solid Steel Casing at Each End", 1) + .addEnergyHatch("Any Solid Steel Casing", 1) + .addMaintenanceHatch("Any Solid Steel Casing", 1) + .addMufflerHatch("Any Solid Steel Casing", 1) + .addOtherStructurePart("4 Item Pipe Casings", "Center of the glass", 4) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 4, 0); + buildPiece(STRUCTURE_PIECE_BODY, stackSize, hintsOnly, 3, 4, -1); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + int build = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 4, 0, elementBudget, env, false, true); + if (build >= 0) return build; + build = survivialBuildPiece(STRUCTURE_PIECE_BODY, stackSize, 3, 4, -1, elementBudget, env, false, true); + if (build >= 0) return build; + build = survivialBuildPiece(STRUCTURE_PIECE_BODY_ALT, stackSize, 3, 4, -1, elementBudget, env, false, true); + return build; + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + pipeTier = -2; + mEnergyHatches.clear(); + if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 4, 0)) return false; + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); + if (!checkPiece(STRUCTURE_PIECE_BODY, 3, 4, -1) && !checkPiece(STRUCTURE_PIECE_BODY_ALT, 3, 4, -1)) + return false; + return this.mMaintenanceHatches.size() == 1 && pipeTier >= -1 + && mEnergyHatches.size() >= 1 + && mInputBusses.size() >= 1 + && mMufflerHatches.size() == 1; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() + .setSpeedBonus(1F / (getPipeData().speedBoost + GTUtility.getTier(this.getMaxInputVoltage()) / 4F)) + .setEuModifier(0.8F) + .setMaxParallelSupplier(this::getMaxParallelRecipes); + } + + public int getMaxParallelRecipes() { + return getPipeData().maxParallel + (GTUtility.getTier(this.getMaxInputVoltage()) * 2); + } + + @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("itemPipeTier", Math.max(0, pipeTier)); + tag.setFloat( + "speedBonus", + Math.max(0, 100 / (1F / (getPipeData().speedBoost + GTUtility.getTier(this.getMaxInputVoltage()) / 4F)))); + tag.setFloat("getMaxParallelRecipes", Math.max(0, getMaxParallelRecipes())); + } + + private static final DecimalFormat dfNone = new DecimalFormat("#"); + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currenttip, accessor, config); + NBTTagCompound tag = accessor.getNBTData(); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.itemPipeTier") + ": " + + EnumChatFormatting.WHITE + + Math.max(0, tag.getInteger("itemPipeTier"))); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " + + EnumChatFormatting.WHITE + + dfNone.format(Math.max(0, tag.getFloat("getMaxParallelRecipes")))); + currenttip.add( + StatCollector.translateToLocal("GT5U.multiblock.speed") + ": " + + EnumChatFormatting.WHITE + + dfNone.format(Math.max(0, tag.getFloat("speedBonus"))) + + "%"); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.latheRecipes; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTENanoForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTENanoForge.java new file mode 100644 index 0000000000..b6dc31e943 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTENanoForge.java @@ -0,0 +1,466 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.AuthorBlueWeabo; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.ExoticEnergy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +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.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; +import gregtech.common.blocks.BlockCasings8; + +public class MTENanoForge extends MTEExtendedPowerMultiBlockBase implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final String STRUCTURE_PIECE_TIER2 = "tier2"; + private static final String STRUCTURE_PIECE_TIER3 = "tier3"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + // spotless:off + .addShape(STRUCTURE_PIECE_MAIN, transpose(new String[][] { + {" "," "," F "," C "," C "," C "," C "," F "," "," "}, + {" "," "," F "," C "," C "," C "," C "," F "," "," "}, + {" "," "," F "," C "," C "," C "," C "," F "," "," "}, + {" "," "," F "," C "," C "," C "," C "," F "," "," "}, + {" "," "," F "," C "," C "," C "," C "," F "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, + {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, + {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, + {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "}, + {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "}, + {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, + {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, + {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "}, + {" "," BB~BB "," BBBBBBB ","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB"," BBBBBBB "," BBBBB "," "} + })) + .addShape(STRUCTURE_PIECE_TIER2, transpose(new String[][] { + {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, + {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "}, + {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, + {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "}, + {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" ", " ", " ", " CC ", " CC ", " ", " ", " "}, + {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "} + })) + .addShape(STRUCTURE_PIECE_TIER3, transpose(new String[][] { + {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "}, + {" ", " ", " FFAA ", " ACCA ", " ACCA ", " AAFF ", " ", " "}, + {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "}, + {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "}, + {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, + {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, + {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, + {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, + {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "}, + {" ", " ", " CC F", " CCCC F", "F CCCC ", "F CC ", " ", " "}, + {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "}, + {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "}, + {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "}, + {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, + {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "}, + {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "}, + {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, + {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, + {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, + {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, + {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "}, + {" ", " ", " AA F", " ACCA F", "F ACCA ", "F AA ", " ", " "}, + {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "}, + {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, + {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "}, + {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "}, + {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "} + })) + //spotless:on + .addElement('F', ofFrame(Materials.StellarAlloy)) + .addElement('C', ofBlock(GregTechAPI.sBlockCasings8, 10)) + .addElement('A', ofBlock(GregTechAPI.sBlockCasings2, 5)) + .addElement( + 'B', + buildHatchAdder(MTENanoForge.class) + .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy)) + .dot(1) + .casingIndex(((BlockCasings8) GregTechAPI.sBlockCasings8).getTextureIndex(10)) + .buildAndChain(GregTechAPI.sBlockCasings8, 10)) + .build(); + private byte mSpecialTier = 0; + + public MTENanoForge(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTENanoForge(String aName) { + super(aName); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.nanoForgeRecipes; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 4, 37, 1); + if (stackSize.stackSize > 1) { + buildPiece(STRUCTURE_PIECE_TIER2, stackSize, hintsOnly, -7, 14, 4); + } + if (stackSize.stackSize > 2) { + buildPiece(STRUCTURE_PIECE_TIER3, stackSize, hintsOnly, 14, 26, 4); + } + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTENanoForge(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { + BlockIcons.getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 10)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { + BlockIcons.getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 10)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { + BlockIcons.getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 10)) }; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @Override + protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + return recipe.mSpecialValue <= mSpecialTier ? CheckRecipeResultRegistry.SUCCESSFUL + : CheckRecipeResultRegistry.NO_RECIPE; + } + + @Nonnull + @Override + protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + return super.createOverclockCalculator(recipe) + .setDurationDecreasePerOC(mSpecialTier > recipe.mSpecialValue ? 4.0 : 2.0); + } + }; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(getMaxInputEu()); + logic.setAvailableAmperage(1); + logic.setAmperageOC(false); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide()) { + // TODO: Look for proper fix + // Updates every 10 sec + if (mUpdate <= -150) mUpdate = 50; + } + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mSpecialTier = 0; + if (checkPiece(STRUCTURE_PIECE_MAIN, 4, 37, 1) && aStack != null) { + if (aStack.isItemEqual(Materials.Carbon.getNanite(1))) { + mSpecialTier = 1; + } + + if (aStack.isItemEqual(Materials.Neutronium.getNanite(1)) && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4)) { + mSpecialTier = 2; + } + + if (aStack.isItemEqual(MaterialsUEVplus.TranscendentMetal.getNanite(1)) + && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4) + && checkPiece(STRUCTURE_PIECE_TIER3, 14, 26, 4)) { + mSpecialTier = 3; + } + } + + if (mMaintenanceHatches.size() != 1) { + return false; + } + + if (!checkExoticAndNormalEnergyHatches()) { + return false; + } + + return mSpecialTier > 0; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 4, 37, 1, elementBudget, env, false, true); + if (built >= 0) return built; + if (stackSize.stackSize > 1) { + built += survivialBuildPiece(STRUCTURE_PIECE_TIER2, stackSize, -7, 14, 4, elementBudget, env, false, true); + } + if (stackSize.stackSize > 2) { + built += survivialBuildPiece(STRUCTURE_PIECE_TIER3, stackSize, 14, 26, 4, elementBudget, env, false, true); + } + return built; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByte("mSpecialTier", mSpecialTier); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("mSeparate")) { + // backward compatibility + inputSeparation = aNBT.getBoolean("mSeparate"); + } + mSpecialTier = aNBT.getByte("mSpecialTier"); + } + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + super.drawTexts(screenElements, inventorySlot); + screenElements + .widget( + new TextWidget(StatCollector.translateToLocal("GT5U.gui.button.tier") + " " + mSpecialTier) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0)) + .widget( + new FakeSyncWidget.IntegerSyncer( + () -> (int) mSpecialTier, + val -> mSpecialTier = (byte) (val % Byte.MAX_VALUE))); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Nanite Fabricator") + .addInfo("Controller block for the Nano Forge") + .addInfo("Requires insane amounts of power to create nanites. Each tier") + .addInfo("the multi gains a new building next to it. The nanite in the") + .addInfo("controller slot controls the tier.") + .addInfo("--------------------------------------------") + .addInfo("Requires a Carbon Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 1) + .addInfo("Requires a Neutronium Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 2) + .addInfo("Requires a Transcendent Metal Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 3) + .addInfo("--------------------------------------------") + .addInfo("If a recipe's tier is lower than the tier of the Nano Forge") + .addInfo("it gains " + EnumChatFormatting.RED + "perfect overclock" + EnumChatFormatting.GRAY + ".") + .addInfo(AuthorBlueWeabo) + .addSeparator() + .beginStructureBlock(30, 38, 13, false) + .addStructureInfo("Nano Forge Structure is too complex! See schematic for details.") + .addStructureInfo("--------------------------------------------") + .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 1 + EnumChatFormatting.GRAY) + .addStructureInfo( + EnumChatFormatting.GOLD + "527" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "171" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box") + .addStructureInfo("--------------------------------------------") + .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 2 + EnumChatFormatting.GRAY) + .addStructureInfo( + EnumChatFormatting.GOLD + "148" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing") + .addStructureInfo("--------------------------------------------") + .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 3 + EnumChatFormatting.GRAY) + .addStructureInfo( + EnumChatFormatting.GOLD + "228" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "84" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box") + .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing") + .addStructureInfo("--------------------------------------------") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + "1" + + EnumChatFormatting.GRAY + + "-" + + EnumChatFormatting.GOLD + + "2" + + EnumChatFormatting.GRAY + + " energy hatches or " + + EnumChatFormatting.GOLD + + "1" + + EnumChatFormatting.GRAY + + " TT energy hatch.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + " maintenance hatch.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + 1 + + EnumChatFormatting.GRAY + + "+" + + EnumChatFormatting.GRAY + + " input hatches.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + 0 + + EnumChatFormatting.GRAY + + "+" + + EnumChatFormatting.GRAY + + " output hatches.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + 1 + + EnumChatFormatting.GRAY + + "+" + + EnumChatFormatting.GRAY + + " input busses.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + 1 + + EnumChatFormatting.GRAY + + "+" + + EnumChatFormatting.GRAY + + " output busses.") + .addStructureInfo("--------------------------------------------") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + inputSeparation = !inputSeparation; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilCracker.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilCracker.java new file mode 100644 index 0000000000..2aac2b5a2e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilCracker.java @@ -0,0 +1,413 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofCoil; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HatchElement; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchMultiInput; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +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.MultiblockTooltipBuilder; +import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch; +import gregtech.common.tileentities.machines.MTEHatchInputME; + +public class MTEOilCracker extends MTEEnhancedMultiBlockBase implements ISurvivalConstructable { + + private static final byte CASING_INDEX = 49; + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { { "lcmcr", "lcmcr", "lcmcr" }, { "lc~cr", "l---r", "lcmcr" }, + { "lcmcr", "lcmcr", "lcmcr" }, })) + .addElement('c', ofCoil(MTEOilCracker::setCoilLevel, MTEOilCracker::getCoilLevel)) + .addElement( + 'l', + buildHatchAdder(MTEOilCracker.class) + .atLeast( + HatchElement.InputHatch.withAdder(MTEOilCracker::addLeftHatchToMachineList), + HatchElement.Energy, + HatchElement.Maintenance) + .dot(2) + .casingIndex(CASING_INDEX) + .buildAndChain(onElementPass(MTEOilCracker::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings4, 1)))) + .addElement( + 'r', + buildHatchAdder(MTEOilCracker.class) + .atLeast( + HatchElement.OutputHatch.withAdder(MTEOilCracker::addRightHatchToMachineList), + HatchElement.Energy, + HatchElement.Maintenance) + .dot(3) + .casingIndex(CASING_INDEX) + .buildAndChain(onElementPass(MTEOilCracker::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings4, 1)))) + .addElement( + 'm', + buildHatchAdder(MTEOilCracker.class) + .atLeast( + HatchElement.InputHatch.withAdder(MTEOilCracker::addMiddleInputToMachineList) + .withCount(t -> t.mMiddleInputHatches.size()), + HatchElement.InputBus, + HatchElement.Energy, + HatchElement.Maintenance) + .dot(1) + .casingIndex(CASING_INDEX) + .buildAndChain(onElementPass(MTEOilCracker::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings4, 1)))) + .build(); + private HeatingCoilLevel heatLevel; + protected final List mMiddleInputHatches = new ArrayList<>(); + // 0 -> left, 1 -> right, any other -> not found + protected int mInputOnSide; + protected int mOutputOnSide; + protected int mCasingAmount; + + public MTEOilCracker(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEOilCracker(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Cracker") + .addInfo("Controller block for the Oil Cracking Unit") + .addInfo("Thermally cracks heavy hydrocarbons into lighter fractions") + .addInfo("More efficient than the Chemical Reactor") + .addInfo("Gives different benefits whether it hydro or steam-cracks:") + .addInfo("Hydro - Consumes 20% less Hydrogen and outputs 25% more cracked fluid") + .addInfo("Steam - Outputs 50% more cracked fluid") + .addInfo("(Values compared to cracking in the Chemical Reactor)") + .addInfo("Place the appropriate circuit in the controller or an input bus") + .addSeparator() + .beginStructureBlock(5, 3, 3, true) + .addController("Front center") + .addCasingInfoRange("Clean Stainless Steel Machine Casing", 18, 21, false) + .addOtherStructurePart("2 Rings of 8 Coils", "Each side of the controller") + .addInfo("Gets 10% EU/t reduction per coil tier, up to a maximum of 50%") + .addEnergyHatch("Any casing", 1, 2, 3) + .addMaintenanceHatch("Any casing", 1, 2, 3) + .addInputHatch("For cracking fluid (Steam/Hydrogen/etc.) ONLY, Any middle ring casing", 1) + .addInputHatch("Any left/right side casing", 2, 3) + .addOutputHatch("Any right/left side casing", 2, 3) + .addStructureInfo("Input/Output Hatches must be on opposite sides!") + .addInputBus("Any middle ring casing, optional for programmed circuit automation") + .addStructureHint("GT5U.cracker.io_side") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_CRACKER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_CRACKER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_CRACKER_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { casingTexturePages[0][CASING_INDEX] }; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.crackingRecipes; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @Nonnull + @Override + public CheckRecipeResult process() { + setEuModifier(1.0F - Math.min(0.1F * (heatLevel.getTier() + 1), 0.5F)); + return super.process(); + } + }; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + public HeatingCoilLevel getCoilLevel() { + return heatLevel; + } + + public void setCoilLevel(HeatingCoilLevel aCoilLevel) { + heatLevel = aCoilLevel; + } + + private boolean addMiddleInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInput tHatch) { + tHatch.updateTexture(aBaseCasingIndex); + tHatch.mRecipeMap = getRecipeMap(); + return mMiddleInputHatches.add(tHatch); + } + return false; + } + + private boolean addLeftHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInput tHatch) { + if (mInputOnSide == 1) return false; + mInputOnSide = 0; + mOutputOnSide = 1; + tHatch.updateTexture(aBaseCasingIndex); + tHatch.mRecipeMap = getRecipeMap(); + return mInputHatches.add(tHatch); + } + if (aMetaTileEntity instanceof MTEHatchOutput tHatch) { + if (mOutputOnSide == 1) return false; + mInputOnSide = 1; + mOutputOnSide = 0; + tHatch.updateTexture(aBaseCasingIndex); + return mOutputHatches.add(tHatch); + } + return false; + } + + private boolean addRightHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInput tHatch) { + if (mInputOnSide == 0) return false; + mInputOnSide = 1; + mOutputOnSide = 0; + tHatch.updateTexture(aBaseCasingIndex); + tHatch.mRecipeMap = getRecipeMap(); + return mInputHatches.add(tHatch); + } + if (aMetaTileEntity instanceof MTEHatchOutput tHatch) { + if (mOutputOnSide == 0) return false; + mInputOnSide = 0; + mOutputOnSide = 1; + tHatch.updateTexture(aBaseCasingIndex); + return mOutputHatches.add(tHatch); + } + return false; + } + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + setCoilLevel(HeatingCoilLevel.None); + mCasingAmount = 0; + mMiddleInputHatches.clear(); + mInputOnSide = -1; + mOutputOnSide = -1; + replaceDeprecatedCoils(aBaseMetaTileEntity); + return checkPiece(STRUCTURE_PIECE_MAIN, 2, 1, 0) && mInputOnSide != -1 + && mOutputOnSide != -1 + && mCasingAmount >= 18 + && mMaintenanceHatches.size() == 1 + && !mMiddleInputHatches.isEmpty(); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOilCracker(this.mName); + } + + private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) { + final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; + final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; + final int tX = aBaseMetaTileEntity.getXCoord() + xDir; + final int tY = aBaseMetaTileEntity.getYCoord(); + final int tZ = aBaseMetaTileEntity.getZCoord() + zDir; + for (int xPos = tX - 1; xPos <= tX + 1; xPos += (xDir != 0 ? 1 : 2)) + for (int yPos = tY - 1; yPos <= tY + 1; yPos++) + for (int zPos = tZ - 1; zPos <= tZ + 1; zPos += (xDir != 0 ? 2 : 1)) { + if ((yPos == tY) && (xPos == tX || zPos == tZ)) continue; + final byte tUsedMeta = aBaseMetaTileEntity.getMetaID(xPos, yPos, zPos); + if (tUsedMeta < 12) continue; + if (tUsedMeta > 14) continue; + if (aBaseMetaTileEntity.getBlock(xPos, yPos, zPos) != GregTechAPI.sBlockCasings1) continue; + + aBaseMetaTileEntity.getWorld() + .setBlock(xPos, yPos, zPos, GregTechAPI.sBlockCasings5, tUsedMeta - 12, 3); + } + } + + @Override + public ArrayList getStoredFluids() { + final ArrayList rList = new ArrayList<>(); + Map inputsFromME = new HashMap<>(); + for (final MTEHatchInput tHatch : filterValidMTEs(mInputHatches)) { + tHatch.mRecipeMap = getRecipeMap(); + if (tHatch instanceof MTEHatchInputME meHatch) { + for (FluidStack tFluid : meHatch.getStoredFluids()) { + if (tFluid != null && !getRecipeMap().getBackend() + .isValidCatalystFluid(tFluid)) { + inputsFromME.put(tFluid.getFluid(), tFluid); + } + } + } else if (tHatch instanceof MTEHatchMultiInput) { + for (final FluidStack tFluid : ((MTEHatchMultiInput) 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 MTEHatchInput tHatch : filterValidMTEs(mMiddleInputHatches)) { + tHatch.mRecipeMap = getRecipeMap(); + if (tHatch instanceof MTEHatchInputME meHatch) { + for (FluidStack tFluid : meHatch.getStoredFluids()) { + if (tFluid != null && getRecipeMap().getBackend() + .isValidCatalystFluid(tFluid)) { + inputsFromME.put(tFluid.getFluid(), tFluid); + } + } + } else if (tHatch instanceof MTEHatchMultiInput) { + for (final FluidStack tFluid : ((MTEHatchMultiInput) tHatch).getStoredFluid()) { + if (tFluid != null && getRecipeMap().getBackend() + .isValidCatalystFluid(tFluid)) { + rList.add(tFluid); + } + } + } else { + if (tHatch.getFillableStack() != null) { + final FluidStack tStack = tHatch.getFillableStack(); + if (getRecipeMap().getBackend() + .isValidCatalystFluid(tStack)) { + rList.add(tStack); + } + } + } + } + if (!inputsFromME.isEmpty()) { + rList.addAll(inputsFromME.values()); + } + return rList; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 1, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 1, 0, elementBudget, env, false, true); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + protected void startRecipeProcessing() { + for (MTEHatchInput hatch : filterValidMTEs(mMiddleInputHatches)) { + if (hatch instanceof IRecipeProcessingAwareHatch aware) { + aware.startRecipeProcessing(); + } + } + super.startRecipeProcessing(); + } + + @Override + protected void endRecipeProcessing() { + super.endRecipeProcessing(); + for (MTEHatchInput hatch : filterValidMTEs(mMiddleInputHatches)) { + if (hatch instanceof IRecipeProcessingAwareHatch aware) { + setResultIfFailure(aware.endRecipeProcessing(this)); + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill1.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill1.java new file mode 100644 index 0000000000..7656bf16eb --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill1.java @@ -0,0 +1,53 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOilDrill1 extends MTEOilDrillBase { + + public MTEOilDrill1(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEOilDrill1(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("I"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOilDrill1(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_SolidSteel; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Steel; + } + + @Override + protected int getCasingTextureIndex() { + return 16; + } + + @Override + protected int getRangeInChunks() { + return 1; + } + + @Override + protected int getMinTier() { + return 2; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill2.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill2.java new file mode 100644 index 0000000000..96818f4af6 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill2.java @@ -0,0 +1,55 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOilDrill2 extends MTEOilDrillBase { + + public MTEOilDrill2(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEOilDrill2(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("II"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOilDrill2(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_CleanStainlessSteel; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.StainlessSteel; + } + + @Override + protected int getCasingTextureIndex() { + return GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings4, 1); + } + + @Override + protected int getRangeInChunks() { + return 2; + } + + @Override + protected int getMinTier() { + return 3; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill3.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill3.java new file mode 100644 index 0000000000..e6a08c3f73 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill3.java @@ -0,0 +1,55 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOilDrill3 extends MTEOilDrillBase { + + public MTEOilDrill3(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEOilDrill3(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("III"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOilDrill3(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_StableTitanium; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Titanium; + } + + @Override + protected int getCasingTextureIndex() { + return GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings4, 2); + } + + @Override + protected int getRangeInChunks() { + return 4; + } + + @Override + protected int getMinTier() { + return 4; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill4.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill4.java new file mode 100644 index 0000000000..b90c78d103 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrill4.java @@ -0,0 +1,55 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOilDrill4 extends MTEOilDrillBase { + + public MTEOilDrill4(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEOilDrill4(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("IV"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOilDrill4(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_RobustTungstenSteel; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.TungstenSteel; + } + + @Override + protected int getCasingTextureIndex() { + return GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings4, 0); + } + + @Override + protected int getRangeInChunks() { + return 8; + } + + @Override + protected int getMinTier() { + return 5; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillBase.java new file mode 100644 index 0000000000..b40e7e2d29 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillBase.java @@ -0,0 +1,489 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.GTValues.debugDriller; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; +import static gregtech.common.UndergroundOil.undergroundOil; +import static gregtech.common.UndergroundOil.undergroundOilReadInformation; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Nonnegative; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetricsExporter; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.objects.GTChunkManager; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.ValidationResult; +import gregtech.api.util.ValidationType; + +public abstract class MTEOilDrillBase extends MTEDrillerBase implements IMetricsExporter { + + private final ArrayList mOilFieldChunks = new ArrayList<>(); + private int mOilId = 0; + private int mOilFlow = 0; + + private int chunkRangeConfig = getRangeInChunks(); + + public MTEOilDrillBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEOilDrillBase(String aName) { + super(aName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_DRILL_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_DRILL) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_OIL_DRILL_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { getCasingTextureForId(casingTextureIndex) }; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("mOilId", mOilId); + aNBT.setInteger("chunkRangeConfig", chunkRangeConfig); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mOilId = aNBT.getInteger("mOilId"); + if (aNBT.hasKey("chunkRangeConfig")) chunkRangeConfig = aNBT.getInteger("chunkRangeConfig"); + } + + protected MultiblockTooltipBuilder createTooltip(String tierSuffix) { + String casings = getCasingBlockItem().get(0) + .getDisplayName(); + + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Pump") + .addInfo("Controller Block for the Oil/Gas/Fluid Drilling Rig " + (tierSuffix != null ? tierSuffix : "")) + .addInfo("Works on " + getRangeInChunks() + "x" + getRangeInChunks() + " chunks") + .addInfo("Use a Screwdriver to configure range") + .addInfo("Use Programmed Circuits to ignore near exhausted oil field") + .addInfo("If total circuit # is greater than output amount it will halt. If it worked right.") // doesn't + // work + .addSeparator() + .beginStructureBlock(3, 7, 3, false) + .addController("Front bottom") + .addOtherStructurePart(casings, "form the 3x1x3 Base") + .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") + .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") + .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1) + .addMaintenanceHatch("Any base casing", 1) + .addInputBus("Mining Pipes or Circuits, optional, any base casing", 1) + .addOutputHatch("Any base casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + protected abstract int getRangeInChunks(); + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); + int oldChunkRange = chunkRangeConfig; + if (aPlayer.isSneaking()) { + if (chunkRangeConfig > 0) { + chunkRangeConfig--; + } + if (chunkRangeConfig == 0) chunkRangeConfig = getRangeInChunks(); + } else { + if (chunkRangeConfig <= getRangeInChunks()) { + chunkRangeConfig++; + } + if (chunkRangeConfig > getRangeInChunks()) chunkRangeConfig = 1; + } + if (oldChunkRange != chunkRangeConfig) mOilFieldChunks.clear(); + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.workareaset") + " " + + chunkRangeConfig + + "x" + + chunkRangeConfig + + StatCollector.translateToLocal("GT5U.machines.chunks")); // TODO Add translation support + } + + @Override + protected boolean checkHatches() { + return !mMaintenanceHatches.isEmpty() && !mOutputHatches.isEmpty() && mEnergyHatches.size() == 1; + } + + @Override + protected List> getAllowedHatches() { + return ImmutableList.of(InputBus, OutputHatch, Maintenance, Energy); + } + + @Override + protected void setElectricityStats() { + this.mEfficiency = getCurrentEfficiency(null); + this.mEfficiencyIncrease = 10000; + int tier = Math.max(0, GTUtility.getTier(getMaxInputVoltage())); + this.mEUt = -7 << (tier << 1); // (1/4) A of current tier when at bottom (7/8) A of current tier while mining + this.mMaxProgresstime = Math.max( + 1, + (workState == STATE_AT_BOTTOM ? (64 * (chunkRangeConfig * chunkRangeConfig)) >> (getMinTier() - 1) : 120) + >> tier); + } + + protected float computeSpeed() { + return .5F + (GTUtility.getTier(getMaxInputVoltage()) - getMinTier()) * .25F; + } + + @Override + protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + switch (tryLowerPipeState(true)) { + case 0 -> { + workState = STATE_DOWNWARD; + setElectricityStats(); + return true; + } + case 3 -> { + workState = STATE_UPWARD; + return true; + } + } + + if (reachingVoidOrBedrock() && tryFillChunkList()) { + if (mWorkChunkNeedsReload) { + mCurrentChunk = new ChunkCoordIntPair(xDrill >> 4, zDrill >> 4); + GTChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), null); + mWorkChunkNeedsReload = false; + } + float speed = computeSpeed(); + ValidationResult pumpResult = tryPumpOil(speed); + if (pumpResult.getType() != ValidationType.VALID) { + mEUt = 0; + mMaxProgresstime = 0; + setRuntimeFailureReason(CheckRecipeResultRegistry.FLUID_OUTPUT_FULL); + return false; + } + FluidStack tFluid = pumpResult.getResult(); + if (tFluid != null && tFluid.amount > getTotalConfigValue()) { + this.mOutputFluids = new FluidStack[] { tFluid }; + return true; + } + } + GTChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity()); + workState = STATE_UPWARD; + setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.drill_exhausted")); + return true; + } + + private boolean tryFillChunkList() { + FluidStack tFluid, tOil; + if (mOilId <= 0) { + tFluid = undergroundOilReadInformation(getBaseMetaTileEntity()); + if (tFluid == null) return false; + mOilId = tFluid.getFluidID(); + } + if (debugDriller) { + GTLog.out.println(" Driller on fluid = " + mOilId); + } + + tOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0); + + if (mOilFieldChunks.isEmpty()) { + Chunk tChunk = getBaseMetaTileEntity().getWorld() + .getChunkFromBlockCoords(getBaseMetaTileEntity().getXCoord(), getBaseMetaTileEntity().getZCoord()); + int range = chunkRangeConfig; + int xChunk = Math.floorDiv(tChunk.xPosition, range) * range; // Java was written by idiots. For negative + // values, / returns rounded towards zero. + // Fucking morons. + int zChunk = Math.floorDiv(tChunk.zPosition, range) * range; + if (debugDriller) { + GTLog.out.println( + "tChunk.xPosition = " + tChunk.xPosition + + " tChunk.zPosition = " + + tChunk.zPosition + + " xChunk = " + + xChunk + + " zChunk = " + + zChunk); + } + for (int i = 0; i < range; i++) { + for (int j = 0; j < range; j++) { + if (debugDriller) { + GTLog.out.println(" getChunkX = " + (xChunk + i) + " getChunkZ = " + (zChunk + j)); + } + tChunk = getBaseMetaTileEntity().getWorld() + .getChunkFromChunkCoords(xChunk + i, zChunk + j); + tFluid = undergroundOilReadInformation(tChunk); + if (debugDriller) { + GTLog.out.println( + " Fluid in chunk = " + tFluid.getFluid() + .getID()); + } + if (tOil.isFluidEqual(tFluid) && tFluid.amount > 0) { + mOilFieldChunks.add(tChunk); + if (debugDriller) { + GTLog.out.println(" Matching fluid, quantity = " + tFluid.amount); + } + } + } + } + } + if (debugDriller) { + GTLog.out.println("mOilFieldChunks.size = " + mOilFieldChunks.size()); + } + return !mOilFieldChunks.isEmpty(); + } + + /** + * Tries to pump oil, accounting for output space if void protection is enabled. + *

+ * If pumped fluid will not fit in output hatches, it returns a result with INVALID. + *

+ * If vein is depleted, it returns a result with VALID and null fluid. + */ + protected ValidationResult tryPumpOil(float speed) { + if (mOilId <= 0) return null; + if (debugDriller) { + GTLog.out.println(" pump speed = " + speed); + } + + // Even though it works fine without this check, + // it can save tiny amount of CPU time when void protection is disabled + if (protectsExcessFluid()) { + FluidStack simulatedOil = pumpOil(speed, true); + if (!canOutputAll(new FluidStack[] { simulatedOil })) { + return ValidationResult.of(ValidationType.INVALID, null); + } + } + + FluidStack pumpedOil = pumpOil(speed, false); + mOilFlow = pumpedOil.amount; + return ValidationResult.of(ValidationType.VALID, pumpedOil.amount == 0 ? null : pumpedOil); + } + + /** + * @param speed Speed to pump oil + * @param simulate If true, it actually does not consume vein + * @return Fluid pumped + */ + protected FluidStack pumpOil(@Nonnegative float speed, boolean simulate) { + if (speed < 0) { + throw new IllegalArgumentException("Don't pass negative speed"); + } + + ArrayList emptyChunks = new ArrayList<>(); + FluidStack returnOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0); + + for (Chunk tChunk : mOilFieldChunks) { + FluidStack pumped = undergroundOil(tChunk, simulate ? -speed : speed); + if (debugDriller) { + GTLog.out.println( + " chunkX = " + tChunk.getChunkCoordIntPair().chunkXPos + + " chunkZ = " + + tChunk.getChunkCoordIntPair().chunkZPos); + if (pumped != null) { + GTLog.out.println(" Fluid pumped = " + pumped.amount); + } else { + GTLog.out.println(" No fluid pumped "); + } + } + if (pumped == null || pumped.amount < 1) { + emptyChunks.add(tChunk); + continue; + } + if (returnOil.isFluidEqual(pumped)) { + returnOil.amount += pumped.amount; + } + } + for (Chunk tChunk : emptyChunks) { + mOilFieldChunks.remove(tChunk); + } + return returnOil; + } + + @Override + protected SoundResource getProcessStartSound() { + return SoundResource.IC2_MACHINES_PUMP_OP; + } + + @Override + public String[] getInfoData() { + List l = new ArrayList<>( + Arrays.asList( + EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.oilfluidpump") + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.machines.workarea") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(chunkRangeConfig) + + " x " + + GTUtility.formatNumbers(chunkRangeConfig) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.machines.chunks"), + "Drilling fluid: " + EnumChatFormatting.GREEN + getFluidName() + EnumChatFormatting.RESET, + "Drilling flow: " + EnumChatFormatting.GREEN + + getFlowRatePerTick() + + EnumChatFormatting.RESET + + " L/t")); + l.addAll(Arrays.asList(super.getInfoData())); + return l.toArray(new String[0]); + } + + @Override + public @NotNull List reportMetrics() { + final boolean machineIsActive = getBaseMetaTileEntity().isActive(); + final String failureReason = getFailureReason() + .map(reason -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_reason", reason)) + .orElseGet(() -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_generic")); + + if (workState == STATE_AT_BOTTOM) { + final ImmutableList.Builder builder = ImmutableList.builder(); + builder.add(StatCollector.translateToLocalFormatted("GT5U.gui.text.pump_fluid_type", getFluidName())); + + if (machineIsActive) { + builder.add( + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.pump_rate.1", + EnumChatFormatting.AQUA + numberFormat.format(getFlowRatePerTick())) + + StatCollector.translateToLocal("GT5U.gui.text.pump_rate.2"), + mOilFlow + StatCollector.translateToLocal("GT5U.gui.text.pump_recovery.2")); + } else { + builder.add(failureReason); + } + + return builder.build(); + } + + if (machineIsActive) { + return switch (workState) { + case STATE_DOWNWARD -> ImmutableList.of(StatCollector.translateToLocal("GT5U.gui.text.deploying_pipe")); + case STATE_UPWARD, STATE_ABORT -> ImmutableList + .of(StatCollector.translateToLocal("GT5U.gui.text.retracting_pipe")); + default -> ImmutableList.of(); + }; + } + + return ImmutableList.of(failureReason); + } + + protected int getFlowRatePerTick() { + return this.mMaxProgresstime > 0 ? (mOilFlow / this.mMaxProgresstime) : 0; + } + + @NotNull + private String getFluidName() { + if (mOilId > 0) { + final Fluid fluid = FluidRegistry.getFluid(mOilId); + return fluid.getLocalizedName(new FluidStack(fluid, 0)); + } + return "None"; + } + + private @NotNull String clientFluidType = ""; + private int clientFlowPerTick = 0; + private int clientFlowPerOperation = 0; + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + super.drawTexts(screenElements, inventorySlot); + screenElements + .widget( + new TextWidget() + .setStringSupplier( + () -> EnumChatFormatting.GRAY + + StatCollector.translateToLocalFormatted("GT5U.gui.text.pump_fluid_type", clientFluidType)) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM)) + .widget( + new TextWidget() + .setStringSupplier( + () -> EnumChatFormatting.GRAY + + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.pump_rate.1", + EnumChatFormatting.AQUA + numberFormat.format(clientFlowPerTick)) + + EnumChatFormatting.GRAY + + StatCollector.translateToLocal("GT5U.gui.text.pump_rate.2")) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM)) + .widget( + new TextWidget() + .setStringSupplier( + () -> EnumChatFormatting.GRAY + + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.pump_recovery.1", + EnumChatFormatting.AQUA + numberFormat.format(clientFlowPerOperation)) + + EnumChatFormatting.GRAY + + StatCollector.translateToLocal("GT5U.gui.text.pump_recovery.2")) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, newInt -> workState = newInt)) + .widget(new FakeSyncWidget.StringSyncer(this::getFluidName, newString -> clientFluidType = newString)) + .widget(new FakeSyncWidget.IntegerSyncer(this::getFlowRatePerTick, newInt -> clientFlowPerTick = newInt)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> mOilFlow, newInt -> clientFlowPerOperation = newInt)); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillInfinite.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillInfinite.java new file mode 100644 index 0000000000..25870cc798 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOilDrillInfinite.java @@ -0,0 +1,87 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.GTValues.VN; + +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOilDrillInfinite extends MTEOilDrillBase { + + public MTEOilDrillInfinite(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEOilDrillInfinite(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + String casings = getCasingBlockItem().get(0) + .getDisplayName(); + + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Pump") + .addInfo("Controller Block for the Infinite Oil/Gas/Fluid Drilling Rig ") + .addInfo("Works on " + getRangeInChunks() + "x" + getRangeInChunks() + " chunks") + .addSeparator() + .beginStructureBlock(3, 7, 3, false) + .addController("Front bottom") + .addOtherStructurePart(casings, "form the 3x1x3 Base") + .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") + .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") + .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1) + .addMaintenanceHatch("Any base casing", 1) + .addInputBus("Mining Pipes or Circuits, optional, any base casing", 1) + .addOutputHatch("Any base casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOilDrillInfinite(mName); + } + + @Override + protected FluidStack pumpOil(float speed, boolean simulate) { + // always simulate to not deplete vein + return super.pumpOil(speed, true); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_MiningNeutronium; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Neutronium; + } + + @Override + protected int getCasingTextureIndex() { + return 178; + } + + @Override + protected int getRangeInChunks() { + return 8; + } + + @Override + protected float computeSpeed() { + return .5F + (GTUtility.getTier(getMaxInputVoltage()) - getMinTier() + 5) * .25F; + } + + @Override + protected int getMinTier() { + return 9; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant1.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant1.java new file mode 100644 index 0000000000..3585bce702 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant1.java @@ -0,0 +1,60 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOreDrillingPlant1 extends MTEOreDrillingPlantBase { + + public MTEOreDrillingPlant1(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + mTier = 1; + } + + public MTEOreDrillingPlant1(String aName) { + super(aName); + mTier = 1; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("I"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOreDrillingPlant1(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_SolidSteel; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Steel; + } + + @Override + protected int getCasingTextureIndex() { + return 16; + } + + @Override + protected int getRadiusInChunks() { + return 3; + } + + @Override + protected int getMinTier() { + return 2; + } + + @Override + protected int getBaseProgressTime() { + return 960; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant2.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant2.java new file mode 100644 index 0000000000..94542a4923 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant2.java @@ -0,0 +1,60 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOreDrillingPlant2 extends MTEOreDrillingPlantBase { + + public MTEOreDrillingPlant2(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + mTier = 2; + } + + public MTEOreDrillingPlant2(String aName) { + super(aName); + mTier = 2; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("II"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOreDrillingPlant2(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_StableTitanium; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Titanium; + } + + @Override + protected int getCasingTextureIndex() { + return 50; + } + + @Override + protected int getRadiusInChunks() { + return 4; + } + + @Override + protected int getMinTier() { + return 3; + } + + @Override + protected int getBaseProgressTime() { + return 800; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant3.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant3.java new file mode 100644 index 0000000000..ea89a15594 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant3.java @@ -0,0 +1,60 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOreDrillingPlant3 extends MTEOreDrillingPlantBase { + + public MTEOreDrillingPlant3(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + mTier = 3; + } + + public MTEOreDrillingPlant3(String aName) { + super(aName); + mTier = 3; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("III"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOreDrillingPlant3(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_RobustTungstenSteel; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.TungstenSteel; + } + + @Override + protected int getCasingTextureIndex() { + return 48; + } + + @Override + protected int getRadiusInChunks() { + return 6; + } + + @Override + protected int getMinTier() { + return 4; + } + + @Override + protected int getBaseProgressTime() { + return 640; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant4.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant4.java new file mode 100644 index 0000000000..44bc71519b --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlant4.java @@ -0,0 +1,60 @@ +package gregtech.common.tileentities.machines.multi; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEOreDrillingPlant4 extends MTEOreDrillingPlantBase { + + public MTEOreDrillingPlant4(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + mTier = 4; + } + + public MTEOreDrillingPlant4(String aName) { + super(aName); + mTier = 4; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + return createTooltip("IV"); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEOreDrillingPlant4(mName); + } + + @Override + protected ItemList getCasingBlockItem() { + return ItemList.Casing_MiningOsmiridium; + } + + @Override + protected Materials getFrameMaterial() { + return Materials.Osmiridium; + } + + @Override + protected int getCasingTextureIndex() { + return 62; + } + + @Override + protected int getRadiusInChunks() { + return 9; + } + + @Override + protected int getMinTier() { + return 5; + } + + @Override + protected int getBaseProgressTime() { + return 480; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlantBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlantBase.java new file mode 100644 index 0000000000..47504c574e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEOreDrillingPlantBase.java @@ -0,0 +1,793 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.GTValues.TIER_COLORS; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.ChunkPosition; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.widgets.LockedWhileActiveButton; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.metatileentity.IMetricsExporter; +import gregtech.api.objects.GTChunkManager; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; +import gregtech.crossmod.visualprospecting.VisualProspectingDatabase; + +public abstract class MTEOreDrillingPlantBase extends MTEDrillerBase implements IMetricsExporter { + + private final List oreBlockPositions = new ArrayList<>(); + protected int mTier = 1; + private int chunkRadiusConfig = getRadiusInChunks(); + private boolean replaceWithCobblestone = true; + + /** Used to drive the remaining ores count in the UI. */ + private int clientOreListSize = 0; + + /** Used to drive the current chunk number in the UI. */ + private int clientCurrentChunk = 0; + + /** Used to drive the total chunk count in the UI. */ + private int clientTotalChunks = 0; + + /** Used to drive the drill's y-level in the UI. */ + private int clientYHead = 0; + + /** Contains the name of the currently mined vein. Used for driving metrics cover output. */ + private String veinName = null; + + MTEOreDrillingPlantBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + MTEOreDrillingPlantBase(String aName) { + super(aName); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("chunkRadiusConfig", chunkRadiusConfig); + aNBT.setBoolean("replaceWithCobblestone", replaceWithCobblestone); + if (veinName != null) { + aNBT.setString("veinName", veinName); + } else if (aNBT.hasKey("veinName")) { + aNBT.removeTag("veinName"); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("chunkRadiusConfig")) { + chunkRadiusConfig = aNBT.getInteger("chunkRadiusConfig"); + } + if (aNBT.hasKey("replaceWithCobblestone")) { + replaceWithCobblestone = aNBT.getBoolean("replaceWithCobblestone"); + } + if (aNBT.hasKey("veinName")) { + veinName = aNBT.getString("veinName"); + } else { + veinName = null; + } + } + + private void adjustChunkRadius(boolean increase) { + if (increase) { + if (chunkRadiusConfig <= getRadiusInChunks()) { + chunkRadiusConfig++; + } + if (chunkRadiusConfig > getRadiusInChunks()) chunkRadiusConfig = 1; + } else { + if (chunkRadiusConfig > 0) { + chunkRadiusConfig--; + } + if (chunkRadiusConfig == 0) chunkRadiusConfig = getRadiusInChunks(); + } + + if (mCurrentChunk != null && mChunkLoadingEnabled) { + GTChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); + } + + oreBlockPositions.clear(); + createInitialWorkingChunk(); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); + + if (getBaseMetaTileEntity().isActive()) { + GTUtility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("GT5U.machines.workarea_fail")); + } else { + adjustChunkRadius(!aPlayer.isSneaking()); + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.workareaset") + " " + + GTUtility.formatNumbers((long) chunkRadiusConfig << 4) + + " " + + StatCollector.translateToLocal("GT5U.machines.radius")); + } + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + replaceWithCobblestone = !replaceWithCobblestone; + GTUtility.sendChatToPlayer(aPlayer, "Replace with cobblestone " + replaceWithCobblestone); + return true; + } + + @Override + protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + if (yHead != oldYHead) oreBlockPositions.clear(); + + if (mWorkChunkNeedsReload && mChunkLoadingEnabled) { // ask to load machine itself + GTChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), null); + mWorkChunkNeedsReload = false; + } + fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead); + if (oreBlockPositions.isEmpty()) { + if (veinName == null) { + updateVeinNameFromVP(getDrillCoords()); + } + + switch (tryLowerPipeState()) { + case 2 -> { + mMaxProgresstime = 0; + setRuntimeFailureReason(CheckRecipeResultRegistry.MISSING_MINING_PIPE); + return false; + } + case 3 -> { + workState = STATE_UPWARD; + return true; + } + case 1 -> { + workState = STATE_AT_BOTTOM; + return true; + } + } + // new layer - fill again + fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead); + } + return tryProcessOreList(); + } + + private boolean tryProcessOreList() { + // Even though it works fine without this check, + // it can save tiny amount of CPU time when void protection is disabled + if (protectsExcessItem()) { + boolean simulateResult = processOreList(true); + if (!simulateResult) { + mEUt = 0; + mMaxProgresstime = 0; + return false; + } + } + + boolean result = processOreList(false); + if (!result) { + mEUt = 0; + mMaxProgresstime = 0; + return false; + } + return true; + } + + private boolean processOreList(boolean simulate) { + ChunkPosition oreBlockPos = null; + List oreBlockPositions = simulate ? copyOreBlockPositions(this.oreBlockPositions) + : this.oreBlockPositions; + int x = 0, y = 0, z = 0; + Block oreBlock = null; + int oreBlockMetadata = 0; + + while ((oreBlock == null || !GTUtility.isOre(oreBlock, oreBlockMetadata)) && !oreBlockPositions.isEmpty()) { + oreBlockPos = oreBlockPositions.remove(0); + x = oreBlockPos.chunkPosX; + y = oreBlockPos.chunkPosY; + z = oreBlockPos.chunkPosZ; + if (GTUtility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), x, y, z, true)) + oreBlock = getBaseMetaTileEntity().getBlock(x, y, z); + oreBlockMetadata = getBaseMetaTileEntity().getWorld() + .getBlockMetadata(x, y, z); + } + + if (!tryConsumeDrillingFluid(simulate)) { + oreBlockPositions.add(0, oreBlockPos); + setRuntimeFailureReason(CheckRecipeResultRegistry.NO_DRILLING_FLUID); + return false; + } + if (oreBlock != null && GTUtility.isOre(oreBlock, oreBlockMetadata)) { + short metaData = 0; + TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(x, y, z); + if (tTileEntity instanceof TileEntityOres) { + metaData = ((TileEntityOres) tTileEntity).mMetaData; + } + + Collection oreBlockDrops = getBlockDrops(oreBlock, x, y, z); + ItemStack cobble = GTUtility.getCobbleForOre(oreBlock, metaData); + if (!simulate) { + if (replaceWithCobblestone) { + getBaseMetaTileEntity().getWorld() + .setBlock(x, y, z, Block.getBlockFromItem(cobble.getItem()), cobble.getItemDamage(), 3); + } else { + getBaseMetaTileEntity().getWorld() + .setBlockToAir(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ); + } + } + ItemStack[] toOutput = getOutputByDrops(oreBlockDrops); + if (simulate && !canOutputAll(toOutput)) { + setRuntimeFailureReason(CheckRecipeResultRegistry.ITEM_OUTPUT_FULL); + return false; + } + mOutputItems = toOutput; + } + return true; + } + + private static List copyOreBlockPositions(List oreBlockPositions) { + List ret = new ArrayList<>(); + for (ChunkPosition chunkPosition : oreBlockPositions) { + ret.add(new ChunkPosition(chunkPosition.chunkPosX, chunkPosition.chunkPosY, chunkPosition.chunkPosZ)); + } + return ret; + } + + @Override + protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + if (!mChunkLoadingEnabled) + return super.workingAtBottom(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead); + + if (mCurrentChunk == null) { + createInitialWorkingChunk(); + return true; + } + + if (mWorkChunkNeedsReload) { + GTChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); + mWorkChunkNeedsReload = false; + return true; + } + if (oreBlockPositions.isEmpty()) { + fillChunkMineList(yHead, yDrill); + if (oreBlockPositions.isEmpty()) { + GTChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); + if (!moveToNextChunk(xDrill >> 4, zDrill >> 4)) { + workState = STATE_UPWARD; + updateVeinNameFromVP(); + } + return true; + } + } + return tryProcessOreList(); + } + + private void createInitialWorkingChunk() { + mCurrentChunk = getTopLeftChunkCoords(); + updateVeinNameFromVP(); + if (mChunkLoadingEnabled) { + GTChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); + mWorkChunkNeedsReload = false; + } + } + + @NotNull + private ChunkCoordIntPair getTopLeftChunkCoords() { + return getCornerCoords(-1, -1); + } + + @NotNull + private ChunkCoordIntPair getBottomRightChunkCoords() { + return getCornerCoords(1, 1); + } + + @NotNull + private ChunkCoordIntPair getCornerCoords(int xMultiplier, int zMultiplier) { + final ChunkCoordIntPair drillPos = getDrillCoords(); + // use corner closest to the drill as mining area center + return new ChunkCoordIntPair( + drillPos.chunkXPos + xMultiplier * chunkRadiusConfig + + ((getXDrill() - (drillPos.chunkXPos << 4)) < 8 ? 0 : 1), + drillPos.chunkZPos + zMultiplier * chunkRadiusConfig + + ((getZDrill() - (drillPos.chunkZPos << 4)) < 8 ? 0 : 1)); + } + + @NotNull + private ChunkCoordIntPair getDrillCoords() { + return new ChunkCoordIntPair(getXDrill() >> 4, getZDrill() >> 4); + } + + private int getTotalChunkCount() { + final ChunkCoordIntPair topLeft = getTopLeftChunkCoords(); + final ChunkCoordIntPair bottomRight = getBottomRightChunkCoords(); + return (bottomRight.chunkXPos - topLeft.chunkXPos) * (bottomRight.chunkZPos - topLeft.chunkZPos); + } + + /** + * Returns a number corresponding to which chunk the drill is operating on. Only really useful for driving outputs + * in the controller UI. + * + * @return 0 if the miner is not in operation, positive integer corresponding to the chunk currently being drilled + */ + @SuppressWarnings("ExtractMethodRecommender") + private int getChunkNumber() { + if (mCurrentChunk == null) { + return 0; + } + + final ChunkCoordIntPair topLeft = getTopLeftChunkCoords(); + final ChunkCoordIntPair drillPos = getDrillCoords(); + + if (workState == STATE_DOWNWARD) { + return 1; + } else if (workState == STATE_UPWARD) { + // Technically, the miner isn't mining anything now; it's retracting the pipes in preparation to end + // operation. + return 0; + } + + int chunkNumber = (chunkRadiusConfig * 2) * (mCurrentChunk.chunkZPos - topLeft.chunkZPos) + + mCurrentChunk.chunkXPos + - topLeft.chunkXPos + + 1; + + // Drills mine the chunk they're in first, so if we're not there yet, bump the number to indicate that it + // was already mined. + if (mCurrentChunk.chunkZPos < drillPos.chunkZPos + || (mCurrentChunk.chunkZPos == drillPos.chunkZPos && mCurrentChunk.chunkXPos < drillPos.chunkXPos)) { + chunkNumber += 1; + } + return chunkNumber; + } + + @Override + protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, + int yHead, int oldYHead) { + boolean result; + if (!mChunkLoadingEnabled || oreBlockPositions.isEmpty()) { + result = super.workingUpward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead); + } else { + result = tryProcessOreList(); + if (oreBlockPositions.isEmpty()) GTChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity()); + } + + if (!result) { + setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.drill_exhausted")); + } + + return result; + } + + @Override + protected void onAbort() { + oreBlockPositions.clear(); + if (mCurrentChunk != null) { + GTChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk); + } + mCurrentChunk = null; + updateVeinNameFromVP(); + } + + private boolean moveToNextChunk(int centerX, int centerZ) { + if (mCurrentChunk == null) return false; + // use corner closest to the drill as mining area center + final int left = centerX - chunkRadiusConfig + ((getXDrill() - (centerX << 4)) < 8 ? 0 : 1); + final int right = left + chunkRadiusConfig * 2; + final int bottom = centerZ + chunkRadiusConfig + ((getZDrill() - (centerZ << 4)) < 8 ? 0 : 1); + + int nextChunkX = mCurrentChunk.chunkXPos + 1; + int nextChunkZ = mCurrentChunk.chunkZPos; + + // step to the next chunk + if (nextChunkX >= right) { + nextChunkX = left; + ++nextChunkZ; + } + // skip center chunk - dug in workingDownward() + if (nextChunkX == centerX && nextChunkZ == centerZ) { + ++nextChunkX; + + if (nextChunkX >= right) { + nextChunkX = left; + ++nextChunkZ; + } + } + + if (nextChunkZ >= bottom) { + mCurrentChunk = null; + return false; + } + + mCurrentChunk = new ChunkCoordIntPair(nextChunkX, nextChunkZ); + updateVeinNameFromVP(); + + GTChunkManager + .requestChunkLoad((TileEntity) getBaseMetaTileEntity(), new ChunkCoordIntPair(nextChunkX, nextChunkZ)); + return true; + } + + private void updateVeinNameFromVP() { + updateVeinNameFromVP(mCurrentChunk); + } + + private void updateVeinNameFromVP(@NotNull ChunkCoordIntPair coords) { + veinName = VisualProspectingDatabase + .getVeinName(getBaseMetaTileEntity().getWorld().provider.dimensionId, coords) + .orElse(null); + } + + @Override + protected boolean checkHatches() { + return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() + && !mOutputBusses.isEmpty() + && !mEnergyHatches.isEmpty(); + } + + @Override + protected List> getAllowedHatches() { + return ImmutableList.of(InputHatch, InputBus, OutputBus, Maintenance, Energy); + } + + @Override + protected void setElectricityStats() { + this.mEfficiency = getCurrentEfficiency(null); + this.mEfficiencyIncrease = 10000; + int tier = Math.max(1, GTUtility.getTier(getMaxInputVoltage())); + this.mEUt = -3 * (1 << (tier << 1)); + this.mMaxProgresstime = calculateMaxProgressTime(tier); + } + + private int calculateMaxProgressTime(int tier) { + return Math.max( + 1, + ((workState == STATE_DOWNWARD || workState == STATE_AT_BOTTOM) ? getBaseProgressTime() : 80) / (1 << tier)); + } + + private ItemStack[] getOutputByDrops(Collection oreBlockDrops) { + long voltage = getMaxInputVoltage(); + Collection outputItems = new HashSet<>(); + oreBlockDrops.forEach(currentItem -> { + if (!doUseMaceratorRecipe(currentItem)) { + outputItems.add(multiplyStackSize(currentItem)); + return; + } + GTRecipe tRecipe = RecipeMaps.maceratorRecipes + .findRecipe(getBaseMetaTileEntity(), false, voltage, null, currentItem); + if (tRecipe == null) { + outputItems.add(currentItem); + return; + } + for (int i = 0; i < tRecipe.mOutputs.length; i++) { + ItemStack recipeOutput = tRecipe.mOutputs[i].copy(); + if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i)) + multiplyStackSize(recipeOutput); + outputItems.add(recipeOutput); + } + }); + return outputItems.toArray(new ItemStack[0]); + } + + private boolean doUseMaceratorRecipe(ItemStack currentItem) { + ItemData itemData = GTOreDictUnificator.getItemData(currentItem); + return itemData == null || itemData.mPrefix != OrePrefixes.crushed && itemData.mPrefix != OrePrefixes.dustImpure + && itemData.mPrefix != OrePrefixes.dust + && itemData.mPrefix != OrePrefixes.gem + && itemData.mPrefix != OrePrefixes.gemChipped + && itemData.mPrefix != OrePrefixes.gemExquisite + && itemData.mPrefix != OrePrefixes.gemFlawed + && itemData.mPrefix != OrePrefixes.gemFlawless + && itemData.mMaterial.mMaterial != Materials.Oilsands; + } + + private ItemStack multiplyStackSize(ItemStack itemStack) { + itemStack.stackSize *= getBaseMetaTileEntity().getRandomNumber(4) + 1; + return itemStack; + } + + private Collection getBlockDrops(final Block oreBlock, int posX, int posY, int posZ) { + final int blockMeta = getBaseMetaTileEntity().getMetaID(posX, posY, posZ); + if (oreBlock.canSilkHarvest(getBaseMetaTileEntity().getWorld(), null, posX, posY, posZ, blockMeta)) { + return Collections.singleton(new ItemStack(oreBlock, 1, blockMeta)); + } + if (oreBlock instanceof BlockOresAbstract) { + TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(posX, posY, posZ); + if (tTileEntity instanceof TileEntityOres && ((TileEntityOres) tTileEntity).mMetaData >= 16000) { + // GTLog.out.println("Running Small Ore"); + return oreBlock.getDrops(getBaseMetaTileEntity().getWorld(), posX, posY, posZ, blockMeta, mTier + 3); + } + } + // GTLog.out.println("Running Normal Ore"); + return oreBlock.getDrops(getBaseMetaTileEntity().getWorld(), posX, posY, posZ, blockMeta, 0); + } + + private boolean tryConsumeDrillingFluid(boolean simulate) { + return depleteInput(new FluidStack(ItemList.sDrillingFluid, 2000), simulate); + } + + private void fillChunkMineList(int yHead, int yDrill) { + if (mCurrentChunk == null || !oreBlockPositions.isEmpty()) return; + final int minX = mCurrentChunk.chunkXPos << 4; + final int maxX = minX + 16; + final int minZ = mCurrentChunk.chunkZPos << 4; + final int maxZ = minZ + 16; + for (int x = minX; x < maxX; ++x) + for (int z = minZ; z < maxZ; ++z) for (int y = yHead; y < yDrill; ++y) tryAddOreBlockToMineList(x, y, z); + } + + private void fillMineListIfEmpty(int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead) { + if (!oreBlockPositions.isEmpty()) return; + + tryAddOreBlockToMineList(xPipe, yHead - 1, zPipe); + if (yHead == yDrill) return; // skip controller block layer + + if (mChunkLoadingEnabled) { + int startX = (xDrill >> 4) << 4; + int startZ = (zDrill >> 4) << 4; + for (int x = startX; x < (startX + 16); ++x) + for (int z = startZ; z < (startZ + 16); ++z) tryAddOreBlockToMineList(x, yHead, z); + } else { + int radius = chunkRadiusConfig << 4; + for (int xOff = -radius; xOff <= radius; xOff++) for (int zOff = -radius; zOff <= radius; zOff++) + tryAddOreBlockToMineList(xDrill + xOff, yHead, zDrill + zOff); + } + } + + private void tryAddOreBlockToMineList(int x, int y, int z) { + Block block = getBaseMetaTileEntity().getBlock(x, y, z); + int blockMeta = getBaseMetaTileEntity().getMetaID(x, y, z); + ChunkPosition blockPos = new ChunkPosition(x, y, z); + if (!oreBlockPositions.contains(blockPos)) { + if (block instanceof BlockOresAbstract) { + TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(x, y, z); + if (tTileEntity instanceof TileEntityOres && ((TileEntityOres) tTileEntity).mNatural) + oreBlockPositions.add(blockPos); + } else if (GTUtility.isOre(block, blockMeta)) oreBlockPositions.add(blockPos); + } + } + + protected abstract int getRadiusInChunks(); + + protected abstract int getBaseProgressTime(); + + protected MultiblockTooltipBuilder createTooltip(String tierSuffix) { + String casings = getCasingBlockItem().get(0) + .getDisplayName(); + + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + final int baseCycleTime = calculateMaxProgressTime(getMinTier()); + tt.addMachineType("Miner") + .addInfo("Controller Block for the Ore Drilling Plant " + (tierSuffix != null ? tierSuffix : "")) + .addInfo("Use a Screwdriver to configure block radius") + .addInfo("Maximum radius is " + GTUtility.formatNumbers((long) getRadiusInChunks() << 4) + " blocks") + .addInfo("Use Soldering iron to turn off chunk mode") + .addInfo("Use Wire Cutter to toggle replacing mined blocks with cobblestone") + .addInfo("In chunk mode, working area center is the chunk corner nearest to the drill") + .addInfo("Gives ~3x as much crushed ore vs normal processing") + .addInfo("Fortune bonus of " + GTUtility.formatNumbers(mTier + 3) + ". Only works on small ores") + .addInfo("Minimum energy hatch tier: " + TIER_COLORS[getMinTier()] + VN[getMinTier()]) + .addInfo( + "Base cycle time: " + (baseCycleTime < 20 ? GTUtility.formatNumbers(baseCycleTime) + " ticks" + : GTUtility.formatNumbers(baseCycleTime / 20) + " seconds")) + .addSeparator() + .beginStructureBlock(3, 7, 3, false) + .addController("Front bottom") + .addOtherStructurePart(casings, "form the 3x1x3 Base") + .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)") + .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top") + .addEnergyHatch(VN[getMinTier()] + "+, Any base casing", 1) + .addMaintenanceHatch("Any base casing", 1) + .addInputBus("Mining Pipes, optional, any base casing", 1) + .addInputHatch("Drilling Fluid, any base casing", 1) + .addOutputBus("Any base casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + super.drawTexts(screenElements, inventorySlot); + screenElements + .widget( + new TextWidget() + .setStringSupplier( + () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.drill_ores_left_chunk", + numberFormat.format(clientOreListSize))) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> getBaseMetaTileEntity().isActive() && clientOreListSize > 0 + && workState == STATE_AT_BOTTOM)) + .widget( + new TextWidget() + .setStringSupplier( + () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.drill_ores_left_layer", + numberFormat.format(clientYHead), + numberFormat.format(clientOreListSize))) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> getBaseMetaTileEntity().isActive() && clientYHead > 0 && workState == STATE_DOWNWARD)) + .widget( + new TextWidget() + .setStringSupplier( + () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.drill_chunks_left", + numberFormat.format(clientCurrentChunk), + numberFormat.format(clientTotalChunks))) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> getBaseMetaTileEntity().isActive() && clientCurrentChunk > 0 + && workState == STATE_AT_BOTTOM)) + .widget( + new TextWidget() + .setStringSupplier( + () -> EnumChatFormatting.GRAY + + StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_current_vein", veinName)) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> veinName != null && (workState == STATE_AT_BOTTOM || workState == STATE_DOWNWARD))) + .widget(new FakeSyncWidget.IntegerSyncer(oreBlockPositions::size, (newInt) -> clientOreListSize = newInt)) + .widget(new FakeSyncWidget.IntegerSyncer(this::getTotalChunkCount, (newInt) -> clientTotalChunks = newInt)) + .widget(new FakeSyncWidget.IntegerSyncer(this::getChunkNumber, (newInt) -> clientCurrentChunk = newInt)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, (newInt) -> workState = newInt)) + .widget(new FakeSyncWidget.IntegerSyncer(this::getYHead, (newInt) -> clientYHead = newInt)) + .widget(new FakeSyncWidget.StringSyncer(() -> veinName, (newString) -> veinName = newString)); + } + + @Override + protected List getAdditionalButtons(ModularWindow.Builder builder, UIBuildContext buildContext) { + return ImmutableList.of( + (ButtonWidget) new LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) + .setOnClick((clickData, widget) -> adjustChunkRadius(clickData.mouseButton == 0)) + .setPlayClickSound(true) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_WORK_AREA) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> chunkRadiusConfig, (val) -> chunkRadiusConfig = val), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .dynamicTooltip( + () -> ImmutableList.of( + StatCollector.translateToLocalFormatted( + "GT5U.gui.button.ore_drill_radius_1", + GTUtility.formatNumbers((long) chunkRadiusConfig << 4)), + StatCollector.translateToLocal("GT5U.gui.button.ore_drill_radius_2"))) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setSize(16, 16), + (ButtonWidget) new LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder) + .setOnClick((clickData, widget) -> replaceWithCobblestone = !replaceWithCobblestone) + .setPlayClickSound(true) + .setBackground(() -> { + if (replaceWithCobblestone) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_REPLACE_COBBLE_ON }; + } + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_REPLACE_COBBLE_OFF }; + }) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer( + () -> replaceWithCobblestone, + (val) -> replaceWithCobblestone = val), + builder, + (widget, val) -> widget.notifyTooltipChange()) + .dynamicTooltip( + () -> ImmutableList.of( + StatCollector.translateToLocal( + replaceWithCobblestone ? "GT5U.gui.button.ore_drill_cobblestone_on" + : "GT5U.gui.button.ore_drill_cobblestone_off"))) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setSize(16, 16)); + } + + @Override + protected SoundResource getProcessStartSound() { + return SoundResource.IC2_MACHINES_MINER_OP; + } + + @Override + public String[] getInfoData() { + final String diameter = GTUtility.formatNumbers(chunkRadiusConfig * 2L); + return new String[] { + EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.minermulti") + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.machines.workarea") + ": " + + EnumChatFormatting.GREEN + + diameter + + "x" + + diameter + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.machines.chunks") }; + } + + @Override + public @NotNull List reportMetrics() { + if (getBaseMetaTileEntity().isActive()) { + return switch (workState) { + case STATE_AT_BOTTOM -> ImmutableList.of( + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.drill_ores_left_chunk", + GTUtility.formatNumbers(oreBlockPositions.size())), + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.drill_chunks_left", + GTUtility.formatNumbers(getChunkNumber()), + GTUtility.formatNumbers(getTotalChunkCount())), + veinName == null ? "" + : StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_current_vein", veinName)); + case STATE_DOWNWARD -> ImmutableList.of( + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.drill_ores_left_layer", + getYHead(), + GTUtility.formatNumbers(oreBlockPositions.size())), + veinName == null ? "" + : StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_current_vein", veinName)); + case STATE_UPWARD, STATE_ABORT -> ImmutableList + .of(StatCollector.translateToLocal("GT5U.gui.text.retracting_pipe")); + + default -> ImmutableList.of(); + }; + } + + return ImmutableList.of( + getFailureReason() + .map(reason -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_reason", reason)) + .orElseGet(() -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_generic"))); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEPCBFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPCBFactory.java new file mode 100644 index 0000000000..b2d20b9745 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPCBFactory.java @@ -0,0 +1,1287 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.AuthorBlueWeabo; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.ExoticEnergy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; +import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.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.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow; +import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import blockrenderer6343.client.world.ClientFakePlayer; +import cpw.mods.fml.common.Loader; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.GregTechTileClientEvents; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.recipe.metadata.PCBFactoryTierKey; +import gregtech.api.recipe.metadata.PCBFactoryUpgrade; +import gregtech.api.recipe.metadata.PCBFactoryUpgradeKey; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.ParallelHelper; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.blocks.BlockCasings8; + +@SuppressWarnings("SpellCheckingInspection") +public class MTEPCBFactory extends MTEExtendedPowerMultiBlockBase implements ISurvivalConstructable { + + private static final String tier1 = "tier1"; + private static final String tier2 = "tier2"; + private static final String tier3 = "tier3"; + private static final String bioUpgrade = "bioUpgrade"; + private static final String ocTier1Upgrade = "ocTier1Upgrade"; + private static final String ocTier2Upgrade = "ocTier2Upgrade"; + private float mRoughnessMultiplier = 1; + private int mTier = 1, mSetTier = 1, mUpgradesInstalled = 0, mCurrentParallel = 0, mMaxParallel = 0; + private boolean mBioUpgrade = false, mBioRotate = false, mOCTier1 = false, mOCTier2 = false; + private final int[] mBioOffsets = new int[] { -5, -1 }; + private final int[] mOCTier1Offsets = new int[] { 2, -11 }; + private final int[] mOCTier2Offsets = new int[] { 2, -11 }; + private MTEHatchInput mCoolantInputHatch; + private static final int mBioRotateBitMap = 0b1000000; + private static final int mOCTier2BitMap = 0b100000; + private static final int mOCTier1BitMap = 0b10000; + private static final int mBioBitMap = 0b1000; + private static final int mTier3BitMap = 0b100; + private static final int mTier2BitMap = 0b10; + private static final int mTier1BitMap = 0b1; + private static final int COOLANT_CONSUMED_PER_SEC = 10; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + tier1, + transpose( + new String[][] { + // spotless:off + {" ","E E","E E","EEEEEEE","E E","E E"," "}, + {"EEEEEEE","CAAAAAC","CAAAAAC","CCCCCCC","CCCCCCC","CCCCCCC","E E"}, + {"EAAAAAE","C-----C","C-----C","C-----C","C-----C","C-----C","ECCCCCE"}, + {"EAAAAAE","C-----C","B-----B","B-----B","B-----B","C-----C","ECCCCCE"}, + {"EAAAAAE","C-----C","B-FFF-B","B-FFF-B","B-FFF-B","C-----C","EPPPPPE"}, + {"ECC~CCE","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","EPPPPPE"} + //spotless:on + })) + .addShape( + tier2, + transpose( + new String[][] { + // spotless:off + {" "," "," ","HGGH","HGGH","HGGH","HGGH","HGGH"," "," "," "}, + {" "," ","HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"," "," "}, + {" ","HGGH","GGGG","G G","G G","G G","G G","G G","GGGG","HGGH"," "}, + {" ","HGGH","G G","G G","G G","G G","G G","G G","G G","HGGH"," "}, + {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"}, + {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"}, + {"HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"} + //spotless:on + })) + .addShape( + tier3, + transpose( + new String[][] { + // spotless:off + {" "," "," "," "," I "," I "," "," "," "," "}, + {" "," "," "," I "," I "," I "," I "," "," "," "}, + {" "," "," KKK "," KIK "," K K "," K K "," I "," "," "," "}, + {" "," "," KKK "," K K "," K K "," K K "," I "," "," "," "}, + {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "}, + {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "}, + {" "," III "," I I "," I I "," I I "," K K "," KIK "," "," "," "}, + {" "," I I "," I K I "," I I "," I I "," K K "," KIK "," "," "," "}, + {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "}, + {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "}, + {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, + {" "," III "," I I "," K K "," K K "," K K "," K K "," I I "," III "," "}, + {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, + {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "}, + {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "}, + {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "}, + {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, + {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, + {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, + {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, + {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "}, + {" II~II ","IIJJJII","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IIJJJII"," IIIII "} + //spotless:on + })) + .addShape( + bioUpgrade, + transpose( + new String[][] { + // spotless:off + {" "," "," LLLLLL "," "," "}, + {" "," "," L L "," "," "}, + {"E E E E"," LLL LLL "," LLL LLL "," LLL LLL ","E E E E"}, + {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"}, + {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"}, + {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"}, + {"ELLLE ELLLE","LLLLL LLLLL","LLLLL LLLLL","LLLLL LLLLL","ELLLE ELLLE"} + //spotless:on + })) + .addShape( + ocTier1Upgrade, + transpose( + new String[][] { + // spotless:off + {"EKKKE","K K","K K","K K","EKKKE"}, + {"E E"," KKK "," K K "," KKK ","E E"}, + {"E E"," NNN "," N N "," NNN ","E E"}, + {"E E"," KKK "," K K "," KKK ","E E"}, + {"E E"," KKK "," K K "," KKK ","E E"}, + {"EOOOE","OKKKO","OK KO","OKKKO","EOOOE"}, + {"E E"," KKK "," K K "," KKK ","E E"}, + {"E E"," KKK "," K K "," KKK ","E E"}, + {"ENNNE","NKKKN","NK KN","NKKKN","ENNNE"}, + {"EGGGE","GGGGG","GGMGG","GGGGG","EGGGE"} + //spotless:on + })) + .addShape( + ocTier2Upgrade, + transpose( + new String[][] { + // spotless:off + {"RGGGR","G G","G G","G G","RGGGR"}, + {"R R"," GGG "," GTG "," GGG ","R R"}, + {"R R"," NNN "," NTN "," NNN ","R R"}, + {"R R"," QQQ "," QTQ "," QQQ ","R R"}, + {"R R"," QQQ "," QTQ "," QQQ ","R R"}, + {"R R"," QQQ "," QTQ "," QQQ ","R R"}, + {"R R"," QQQ "," QTQ "," QQQ ","R R"}, + {"R R"," QQQ "," QTQ "," QQQ ","R R"}, + {"RNNNR","NQQQN","NQTQN","NQQQN","RNNNR"}, + {"RGGGR","GGGGG","GGSGG","GGGGG","RGGGR"} + //spotless:on + })) + .addElement('E', ofFrame(Materials.DamascusSteel)) + .addElement('C', ofBlock(GregTechAPI.sBlockCasings8, 11)) + .addElement('D', ofBlock(GregTechAPI.sBlockReinforced, 2)) + .addElement('A', Glasses.chainAllGlasses()) + .addElement('B', ofBlock(GregTechAPI.sBlockCasings3, 10)) + .addElement('F', ofFrame(Materials.VibrantAlloy)) + .addElement( + 'P', + buildHatchAdder(MTEPCBFactory.class) + .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy)) + .dot(1) + .casingIndex(((BlockCasings8) GregTechAPI.sBlockCasings8).getTextureIndex(11)) + .buildAndChain(GregTechAPI.sBlockCasings8, 11)) + .addElement('H', ofFrame(Materials.Duranium)) + .addElement('G', ofBlock(GregTechAPI.sBlockCasings8, 12)) + .addElement('I', ofBlock(GregTechAPI.sBlockCasings8, 13)) + .addElement('K', ofBlock(GregTechAPI.sBlockCasings8, 10)) + .addElement( + 'J', + buildHatchAdder(MTEPCBFactory.class) + .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy)) + .dot(1) + .casingIndex(((BlockCasings8) GregTechAPI.sBlockCasings8).getTextureIndex(13)) + .buildAndChain(GregTechAPI.sBlockCasings8, 13)) + .addElement('L', ofBlock(GregTechAPI.sBlockCasings4, 1)) + .addElement( + 'M', + buildHatchAdder(MTEPCBFactory.class).hatchClass(MTEHatchInput.class) + .adder(MTEPCBFactory::addCoolantInputToMachineList) + .casingIndex(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 12)) + .dot(2) + .buildAndChain(GregTechAPI.sBlockCasings8, 12)) + .addElement('N', ofBlock(GregTechAPI.sBlockCasings2, 15)) + .addElement('O', ofBlock(GregTechAPI.sBlockCasings8, 4)) + .addElement( + 'S', + buildHatchAdder(MTEPCBFactory.class).hatchClass(MTEHatchInput.class) + .adder(MTEPCBFactory::addCoolantInputToMachineList) + .casingIndex(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 12)) + .dot(2) + .buildAndChain(GregTechAPI.sBlockCasings8, 12)) + .addElement('R', ofFrame(Materials.Americium)) + .addElement('Q', ofBlock(GregTechAPI.sBlockCasings8, 14)) + .addElement('T', ofBlock(GregTechAPI.sBlockCasings1, 15)) + .build(); + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + if (mSetTier < 3) { + buildPiece(tier1, stackSize, hintsOnly, 3, 5, 0); + if (mSetTier == 2) { + buildPiece(tier2, stackSize, hintsOnly, 7, 6, 2); + } + } else { + buildPiece(tier3, stackSize, hintsOnly, 3, 21, 0); + } + + if (mBioUpgrade) { + if (mBioRotate) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + getStructureDefinition().buildOrHints( + this, + stackSize, + bioUpgrade, + tTile.getWorld(), + transformFacing(getExtendedFacing()), + tTile.getXCoord(), + tTile.getYCoord(), + tTile.getZCoord(), + mBioOffsets[1], + 6, + mBioOffsets[0], + hintsOnly); + } else { + buildPiece(bioUpgrade, stackSize, hintsOnly, mBioOffsets[0], 6, mBioOffsets[1]); + } + } + + if (mOCTier1 && !mOCTier2) { + buildPiece(ocTier1Upgrade, stackSize, hintsOnly, mOCTier1Offsets[0], 9, mOCTier1Offsets[1]); + } + + if (!mOCTier1 && mOCTier2) { + buildPiece(ocTier2Upgrade, stackSize, hintsOnly, mOCTier2Offsets[0], 9, mOCTier2Offsets[1]); + } + } + + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + int built = 0; + if (Loader.isModLoaded("blockrenderer6343") && env.getActor() instanceof ClientFakePlayer) { + if (stackSize.stackSize < 3) { + built += survivialBuildPiece(tier1, stackSize, 3, 5, 0, elementBudget, env, false, false); + if (stackSize.stackSize == 2) { + built += survivialBuildPiece(tier2, stackSize, 7, 6, 2, elementBudget, env, false, false); + } + } else { + built += survivialBuildPiece(tier3, stackSize, 3, 21, 0, elementBudget, env, false, false); + } + return built; + } + if (mSetTier < 3) { + built += survivialBuildPiece(tier1, stackSize, 3, 5, 0, elementBudget, env, false, true); + if (mSetTier == 2) { + built += survivialBuildPiece(tier2, stackSize, 7, 6, 2, elementBudget, env, false, true); + } + } else { + built += survivialBuildPiece(tier3, stackSize, 3, 21, 0, elementBudget, env, false, true); + } + + if (mBioUpgrade) { + if (mBioRotate) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + getStructureDefinition().survivalBuild( + this, + stackSize, + bioUpgrade, + tTile.getWorld(), + transformFacing(getExtendedFacing()), + tTile.getXCoord(), + tTile.getYCoord(), + tTile.getZCoord(), + mBioOffsets[1], + 6, + mBioOffsets[0], + elementBudget, + env, + false); + } else { + built += survivialBuildPiece( + bioUpgrade, + stackSize, + mBioOffsets[0], + 6, + mBioOffsets[1], + elementBudget, + env, + false, + true); + } + } + + if (mOCTier1 && !mOCTier2) { + built += survivialBuildPiece( + ocTier1Upgrade, + stackSize, + mOCTier1Offsets[0], + 9, + mOCTier1Offsets[1], + elementBudget, + env, + false, + true); + } + if (!mOCTier1 && mOCTier2) { + built += survivialBuildPiece( + ocTier2Upgrade, + stackSize, + mOCTier2Offsets[0], + 9, + mOCTier2Offsets[1], + elementBudget, + env, + false, + true); + } + + return built; + } + + public MTEPCBFactory(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPCBFactory(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPCBFactory(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { + BlockIcons.getCasingTextureForId( + getTier() < 3 ? GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 11) + : GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 13)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { + BlockIcons.getCasingTextureForId( + getTier() < 3 ? GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 11) + : GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings8, 13)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { BlockIcons.getCasingTextureForId( + mSetTier < 3 ? ((BlockCasings8) GregTechAPI.sBlockCasings8).getTextureIndex(11) + : ((BlockCasings8) GregTechAPI.sBlockCasings8).getTextureIndex(13)) }; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mTier = 0; + mUpgradesInstalled = 0; + mCoolantInputHatch = null; + if (mSetTier < 3) { + if (!checkPiece(tier1, 3, 5, 0)) { + return false; + } + if (mSetTier == 2) { + if (!checkPiece(tier2, 7, 6, 2)) { + return false; + } + mTier = 2; + } else { + mTier = 1; + } + } else { + if (!checkPiece(tier3, 3, 21, 0)) { + return false; + } + mTier = 3; + } + + if (mBioUpgrade) { + if (mBioRotate) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + if (!getStructureDefinition().check( + this, + bioUpgrade, + tTile.getWorld(), + transformFacing(getExtendedFacing()), + tTile.getXCoord(), + tTile.getYCoord(), + tTile.getZCoord(), + mBioOffsets[1], + 6, + mBioOffsets[0], + !mMachine)) { + return false; + } + } else { + if (!checkPiece(bioUpgrade, mBioOffsets[0], 6, mBioOffsets[1])) { + return false; + } + } + mUpgradesInstalled++; + } + + if (mOCTier1 && !mOCTier2) { + if (!checkPiece(ocTier1Upgrade, mOCTier1Offsets[0], 9, mOCTier1Offsets[1])) { + return false; + } + if (mCoolantInputHatch == null) { + return false; + } + mUpgradesInstalled++; + } + + if (mOCTier2 && !mOCTier1) { + if (!checkPiece(ocTier2Upgrade, mOCTier2Offsets[0], 9, mOCTier2Offsets[1])) { + return false; + } + if (mCoolantInputHatch == null) { + return false; + } + mUpgradesInstalled++; + } + + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); + + if (mMaintenanceHatches.size() != 1) { + return false; + } + + if (!checkExoticAndNormalEnergyHatches()) { + return false; + } + + return mTier > 0; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.pcbFactoryRecipes; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + // Here we check the dynamic parallels, which depend on the recipe + int numberOfNanites = 0; + ItemStack aNanite = recipe.getRepresentativeInput(1); + ItemData naniteData = GTOreDictUnificator.getAssociation(aNanite); + if (naniteData != null && naniteData.mPrefix != null && naniteData.mPrefix.equals(OrePrefixes.nanite)) { + for (ItemStack aItem : inputItems) { + if (aItem != null && aItem.isItemEqual(aNanite)) { + numberOfNanites += aItem.stackSize; + } + } + } + maxParallel = (int) Math.max(Math.ceil(Math.log(numberOfNanites) / Math.log(2) + 0.00001), 1); + mMaxParallel = maxParallel; + + PCBFactoryUpgrade requiredUpgrade = recipe.getMetadata(PCBFactoryUpgradeKey.INSTANCE); + if (requiredUpgrade == PCBFactoryUpgrade.BIO && !mBioUpgrade) + return SimpleCheckRecipeResult.ofFailure("bio_upgrade_missing"); + + int requiredPCBTier = recipe.getMetadataOrDefault(PCBFactoryTierKey.INSTANCE, 1); + if (requiredPCBTier > mTier) return CheckRecipeResultRegistry.insufficientMachineTier(requiredPCBTier); + + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Nonnull + @Override + protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + return super.createOverclockCalculator(recipe).setNoOverclock(isNoOC()) + .setEUtDiscount((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled)) + .setSpeedBoost(getDurationMultiplierFromRoughness()) + .setDurationDecreasePerOC(mOCTier2 ? 4.0 : 2.0); + } + + @Nonnull + @Override + protected ParallelHelper createParallelHelper(@Nonnull GTRecipe recipe) { + return super.createParallelHelper(recipe) + .setEUtModifier((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled)) + .setChanceMultiplier(mRoughnessMultiplier); + } + }; + } + + private boolean isNoOC() { + return !mOCTier1 && !mOCTier2; + } + + private float getDurationMultiplierFromRoughness() { + return (float) Math.pow(mRoughnessMultiplier, 2); + } + + private int ticker = 0; + + @Override + public boolean onRunningTick(ItemStack aStack) { + if (!super.onRunningTick(aStack)) { + return false; + } + + if (ticker % 20 == 0) { + if (!isNoOC()) { + FluidStack tFluid = mOCTier1 ? GTModHandler.getDistilledWater(COOLANT_CONSUMED_PER_SEC) + : Materials.SuperCoolant.getFluid(COOLANT_CONSUMED_PER_SEC); + if (!drain(mCoolantInputHatch, tFluid, true)) { + stopMachine(ShutDownReasonRegistry.outOfFluid(tFluid)); + return false; + } + } + ticker = 0; + } + + ticker++; + + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide()) { + // TODO: Look for proper fix + // Updates every 10 sec + if (mUpdate <= -150) mUpdate = 50; + } + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return (int) (10000f * mRoughnessMultiplier); + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + private int getTier() { + return mSetTier; + } + + @Override + public void receiveClientEvent(byte aEventID, byte aValue) { + if (aEventID == 1) { + if ((aValue & mTier1BitMap) == mTier1BitMap) { + mSetTier = 1; + } + + if ((aValue & mTier2BitMap) == mTier2BitMap) { + mSetTier = 2; + } + + if ((aValue & mTier3BitMap) == mTier3BitMap) { + mSetTier = 3; + } + + if ((aValue & mBioBitMap) == mBioBitMap) { + mBioUpgrade = true; + } + + if ((aValue & mBioRotateBitMap) == mBioRotateBitMap) { + mBioRotate = true; + } + + if ((aValue & mOCTier1BitMap) == mOCTier1BitMap) { + mOCTier1 = true; + } + + if ((aValue & mOCTier2BitMap) == mOCTier2BitMap) { + mOCTier2 = true; + } + } + } + + private ExtendedFacing transformFacing(ExtendedFacing facing) { + ForgeDirection curDirection = facing.getDirection(); + Rotation curRotation = facing.getRotation(); + Flip curFlip = facing.getFlip(); + ForgeDirection newDirection = curDirection; + Rotation newRotation = curRotation; + Flip newFlip = curFlip; + + if (curDirection == ForgeDirection.UP || curDirection == ForgeDirection.DOWN) { + switch (curRotation) { + case CLOCKWISE, COUNTER_CLOCKWISE -> { + newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE; + newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.NORTH : ForgeDirection.SOUTH; + } + case NORMAL -> { + newRotation = curDirection == ForgeDirection.UP ? Rotation.CLOCKWISE : Rotation.COUNTER_CLOCKWISE; + newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST; + newFlip = Flip.NONE; + } + case UPSIDE_DOWN -> { + newRotation = curDirection == ForgeDirection.UP ? Rotation.COUNTER_CLOCKWISE : Rotation.CLOCKWISE; + newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST; + newFlip = Flip.NONE; + } + } + } else if (curRotation == Rotation.CLOCKWISE || curRotation == Rotation.COUNTER_CLOCKWISE) { + newFlip = curRotation == Rotation.CLOCKWISE ? curFlip == Flip.NONE ? Flip.NONE : Flip.HORIZONTAL + : curFlip != Flip.NONE ? Flip.NONE : Flip.HORIZONTAL; + newDirection = curRotation == Rotation.CLOCKWISE ? ForgeDirection.UP : ForgeDirection.DOWN; + } else { + newDirection = switch (curDirection) { + case EAST -> ForgeDirection.SOUTH; + case NORTH -> ForgeDirection.EAST; + case WEST -> ForgeDirection.NORTH; + case SOUTH -> ForgeDirection.WEST; + default -> curDirection; + }; + } + + if (curRotation == Rotation.UPSIDE_DOWN) { + if (curDirection != ForgeDirection.UP && curDirection != ForgeDirection.DOWN) { + newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE; + } + } + + return ExtendedFacing.of(newDirection, newRotation, newFlip); + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + public boolean addCoolantInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInput) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((MTEHatchInput) aMetaTileEntity).mRecipeMap = null; + mCoolantInputHatch = (MTEHatchInput) aMetaTileEntity; + return true; + } + return false; + } + + @Override + protected long getActualEnergyUsage() { + return (-this.lEUt * 10000) / Math.min(Math.max(1000, mEfficiency), 10000); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + inputSeparation = !inputSeparation; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); + } + + @Override + public String[] getInfoData() { + int mPollutionReduction = 0; + for (MTEHatchMuffler tHatch : filterValidMTEs(mMufflerHatches)) { + mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); + } + + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatch tHatch : getExoticAndNormalEnergyHatchList()) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + long voltage = getAverageInputVoltage(); + long amps = getMaxInputAmps(); + + return new String[] { + /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(getActualEnergyUsage()) + + EnumChatFormatting.RESET + + " EU/t", + /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(voltage) + + EnumChatFormatting.RESET + + " EU/t(*" + + amps + + " A)" + + StatCollector.translateToLocal("GT5U.machines.tier") + + ": " + + EnumChatFormatting.YELLOW + + VN[GTUtility.getTier(voltage)] + + EnumChatFormatting.RESET, + /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.multiblock.efficiency") + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + + EnumChatFormatting.GREEN + + mPollutionReduction + + EnumChatFormatting.RESET + + " %", + /* 7 */ StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": " + + EnumChatFormatting.GREEN + + mMaxParallel, + /* 8 */ StatCollector.translateToLocal("GT5U.multiblock.curparallelism") + ": " + + EnumChatFormatting.GREEN + + mCurrentParallel }; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Circuit Board Fabricator") + .addInfo("Controller for the PCB Factory") + .addInfo( + EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + + "IMPORTANT!" + + " Check the configuration menu before building.") + .addInfo("Tier of the machine determines the available recipes.") + .addInfo("Machine tier (1-3) is set in the controller GUI.") + .addInfo("The configuration menu can be used to add upgrades.") + .addInfo("Each tier and upgrade requires additional structures.") + .addInfo("Power consumption is multiplied by Sqrt(structures).") + .addInfo("Tier 2 and 3 allow parallel by using extra nanites.") + .addInfo("Every doubling of nanites adds one parallel.") + .addInfo("1x->1, 2x->2, 4x->3, 8x->4 with no limit.") + .addInfo("Recipes require a cooling upgrade to be overclocked.") + .addInfo("Liquid Cooling uses 10 L/s of distilled water and enables default overclocks.") + .addInfo("Thermosink uses 10 L/s of Super Coolant and enables perfect overclocks.") + .addInfo("Trace size can be changed to modify the material usage and machine speed.") + .addInfo(AuthorBlueWeabo) + .beginStructureBlock(30, 38, 13, false) + .addSeparator() + .addMaintenanceHatch(EnumChatFormatting.GOLD + "1", 1) + .addEnergyHatch( + EnumChatFormatting.GOLD + "1" + + EnumChatFormatting.GRAY + + "-" + + EnumChatFormatting.GOLD + + "2" + + EnumChatFormatting.GRAY + + " or " + + EnumChatFormatting.GOLD + + "1" + + EnumChatFormatting.GRAY + + " TT energy hatch.", + 1) + .addInputBus(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1) + .addOutputBus(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1) + .addInputHatch(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1) + .addStructureInfo( + "Coolant Hatch (Input Hatch): " + EnumChatFormatting.GOLD + + "1" + + EnumChatFormatting.GRAY + + " Center of the Liquid Cooling/Thermosink") + .addStructureInfo( + EnumChatFormatting.BLUE + "Base Multi (Tier " + + EnumChatFormatting.DARK_PURPLE + + 1 + + EnumChatFormatting.BLUE + + "):") + .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box") + .addStructureInfo(EnumChatFormatting.GOLD + "9" + EnumChatFormatting.GRAY + " Vibrant Alloy Frame Box") + .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Reinforced Glass") + .addStructureInfo( + EnumChatFormatting.GOLD + "77" + EnumChatFormatting.GRAY + " Basic Photolithography Framework Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Grate Machine Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Plascrete Block") + .addStructureInfo( + EnumChatFormatting.BLUE + "Tier " + + EnumChatFormatting.DARK_PURPLE + + 2 + + EnumChatFormatting.BLUE + + " (Adds to Tier " + + EnumChatFormatting.DARK_PURPLE + + 1 + + EnumChatFormatting.BLUE + + "):") + .addStructureInfo(EnumChatFormatting.GOLD + "34" + EnumChatFormatting.GRAY + " Duranium Frame Box") + .addStructureInfo( + EnumChatFormatting.GOLD + "158" + + EnumChatFormatting.GRAY + + " Reinforced Photolithography Framework Casing") + .addStructureInfo( + EnumChatFormatting.BLUE + "Tier " + EnumChatFormatting.DARK_PURPLE + 3 + EnumChatFormatting.BLUE + ":") + .addStructureInfo( + EnumChatFormatting.GOLD + "292" + + EnumChatFormatting.GRAY + + " Radiation Proof Photolithography Framework Casing") + .addStructureInfo( + EnumChatFormatting.GOLD + "76" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") + .addStructureInfo(EnumChatFormatting.BLUE + "Biochamber Upgrade") + .addStructureInfo( + EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY + " Clean Stainless Steel Machine Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box") + .addStructureInfo(EnumChatFormatting.GOLD + "72" + EnumChatFormatting.GRAY + " Reinforced Glass") + .addStructureInfo( + EnumChatFormatting.BLUE + "Liquid Cooling Tower (Tier " + + EnumChatFormatting.DARK_PURPLE + + 1 + + EnumChatFormatting.BLUE + + "):") + .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box") + .addStructureInfo( + EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing") + .addStructureInfo( + EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Extreme Engine Intake Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing") + .addStructureInfo( + EnumChatFormatting.GOLD + "21" + + EnumChatFormatting.GRAY + + " Reinforced Photolithography Framework Casing") + .addStructureInfo( + EnumChatFormatting.BLUE + "Thermosink Radiator(Tier " + + EnumChatFormatting.DARK_PURPLE + + 2 + + EnumChatFormatting.BLUE + + "):") + .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Americium Frame Box") + .addStructureInfo( + EnumChatFormatting.GOLD + "41" + + EnumChatFormatting.GRAY + + " Reinforced Photolithography Framework Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "8" + EnumChatFormatting.GRAY + " Superconducting Coil Block") + .addStructureInfo(EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing") + .addStructureInfo(EnumChatFormatting.GOLD + "48" + EnumChatFormatting.GRAY + " Infinity Cooled Casing") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("mBioUpgrade", mBioUpgrade); + aNBT.setBoolean("mBioRotate", mBioRotate); + aNBT.setInteger("mBioOffsetX", mBioOffsets[0]); + aNBT.setInteger("mBioOffsetZ", mBioOffsets[1]); + aNBT.setBoolean("mOCTier1Upgrade", mOCTier1); + aNBT.setInteger("mOCTier1OffsetX", mOCTier1Offsets[0]); + aNBT.setInteger("mOCTier1OffsetZ", mOCTier1Offsets[1]); + aNBT.setBoolean("mOCTier2Upgrade", mOCTier2); + aNBT.setInteger("mOCTier2OffsetX", mOCTier2Offsets[0]); + aNBT.setInteger("mOCTier2OffsetZ", mOCTier2Offsets[1]); + aNBT.setFloat("mRoughnessMultiplier", mRoughnessMultiplier); + aNBT.setInteger("mSetTier", mSetTier); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("mSeparate")) { + // backward compatibility + inputSeparation = aNBT.getBoolean("mSeparate"); + } + mBioUpgrade = aNBT.getBoolean("mBioUpgrade"); + mBioRotate = aNBT.getBoolean("mBioRotate"); + mBioOffsets[0] = aNBT.getInteger("mBioOffsetX"); + mBioOffsets[1] = aNBT.getInteger("mBioOffsetZ"); + mOCTier1 = aNBT.getBoolean("mOCTier1Upgrade"); + mOCTier1Offsets[0] = aNBT.getInteger("mOCTier1OffsetX"); + mOCTier1Offsets[1] = aNBT.getInteger("mOCTier1OffsetZ"); + mOCTier2 = aNBT.getBoolean("mOCTier2Upgrade"); + mOCTier2Offsets[0] = aNBT.getInteger("mOCTier2OffsetX"); + mOCTier2Offsets[1] = aNBT.getInteger("mOCTier2OffsetZ"); + mRoughnessMultiplier = aNBT.getFloat("mRoughnessMultiplier"); + mSetTier = aNBT.getInteger("mSetTier"); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected SoundResource getProcessStartSound() { + return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP; + } + + @Override + public byte getUpdateData() { + byte data = 0; + if (mSetTier == 1) { + data += mTier1BitMap; + } else if (mSetTier == 2) { + data += mTier2BitMap; + } else { + data += mTier3BitMap; + } + + if (mBioUpgrade) { + data += mBioBitMap; + } + + if (mBioRotate) { + data += mBioRotateBitMap; + } + + if (mOCTier1) { + data += mOCTier1BitMap; + } + + if (mOCTier2) { + data += mOCTier2BitMap; + } + + return data; + } + + @Override + public Pos2d getStructureUpdateButtonPos() { + return new Pos2d(80, 91); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + buildContext.addSyncedWindow(10, this::createConfigurationWindow); + builder.widget( + new ButtonWidget().setOnClick( + (clickData, widget) -> { + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(10); + }) + .setSize(16, 16) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(GTUITextures.BUTTON_STANDARD); + ret.add(GTUITextures.OVERLAY_BUTTON_CYCLIC); + return ret.toArray(new IDrawable[0]); + }) + .addTooltip("Configuration Menu") + .setPos(174, 130)) + .widget( + new TextWidget(new Text("Tier")).setTextAlignment(Alignment.Center) + .setScale(0.91f) + .setSize(20, 16) + .setPos(173, 98)) + .widget( + new NumericWidget().setGetter(() -> mSetTier) + .setSetter(val -> mSetTier = (int) val) + .setBounds(1, 3) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip("PCB Factory Tier") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(18, 18) + .setPos(173, 110)); + } + + protected ModularWindow createConfigurationWindow(final EntityPlayer player) { + ModularWindow.Builder builder = ModularWindow.builder(200, 160); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.OVERLAY_BUTTON_CYCLIC) + .setPos(5, 5) + .setSize(16, 16)) + .widget(new TextWidget("Configuration Menu").setPos(25, 9)) + .widget( + ButtonWidget.closeWindowButton(true) + .setPos(185, 3)) + .widget( + new DynamicPositionedColumn().setSynced(false) + .widget( + new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mBioUpgrade, val -> { + mBioUpgrade = val; + if (!mBioUpgrade) { + GTUtility + .sendChatToPlayer(player, GTUtility.trans("339.1", "Biochamber Upgrade Disabled")); + } else { + GTUtility + .sendChatToPlayer(player, GTUtility.trans("339", "Biochamber Upgrade Enabled")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setSize(90, 18) + .addTooltip( + "Enables nanites to construct organic circuitry. Required for Bioware and Wetware boards.")) + .addChild( + new DrawableWidget().setDrawable(GTUITextures.OVERLAY_BUTTON_CYCLIC) + .setSize(18, 18)) + .addChild( + new TextWidget("Biochamber").setTextAlignment(Alignment.Center) + .setPos(23, 5)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mBioRotate, val -> { + mBioRotate = val; + if (!mBioRotate) { + GTUtility.sendChatToPlayer(player, GTUtility.trans("340.1", "Rotated biochamber disabled")); + } else { + GTUtility.sendChatToPlayer(player, GTUtility.trans("340", "Rotated biochamber enabled")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setSize(90, 18) + .addTooltip("Rotates the biochamber by 90 degrees.")) + .addChild( + new DrawableWidget().setDrawable(GTUITextures.OVERLAY_BUTTON_CYCLIC) + .setSize(18, 18)) + .addChild( + new TextWidget("Bio Rotation").setTextAlignment(Alignment.Center) + .setPos(23, 5)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mOCTier1, val -> { + mOCTier1 = val; + mOCTier2 = false; + if (!mOCTier1) { + GTUtility.sendChatToPlayer(player, GTUtility.trans("341.1", "Tier 1 cooling disabled")); + } else { + GTUtility.sendChatToPlayer(player, GTUtility.trans("341", "Tier 1 cooling enabled")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setSize(90, 18) + .addTooltip( + "Allows for overclocking. Requires 10 L/s of distilled water. Cooling upgrades are mutually exclusive.")) + .addChild( + new DrawableWidget().setDrawable(GTUITextures.OVERLAY_BUTTON_CYCLIC) + .setSize(18, 18)) + .addChild( + new TextWidget("Liquid Cooling").setTextAlignment(Alignment.Center) + .setPos(20, 5)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mOCTier2, val -> { + mOCTier2 = val; + mOCTier1 = false; + if (!mOCTier2) { + GTUtility.sendChatToPlayer(player, GTUtility.trans("342.1", "Tier 2 cooling disabled")); + } else { + GTUtility.sendChatToPlayer(player, GTUtility.trans("342", "Tier 2 cooling enabled")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setSize(90, 18) + .addTooltip( + "Enables perfect overclocking by allowing nanites to work with extreme speed and efficiency. Uses 10 L/s of Super Coolant.")) + .addChild( + new DrawableWidget().setDrawable(GTUITextures.OVERLAY_BUTTON_CYCLIC) + .setSize(18, 18)) + .addChild( + new TextWidget("Thermosink").setTextAlignment(Alignment.Center) + .setPos(20, 5)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget( + new TextWidget(new Text("Trace Size")).setSize(90, 18) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive()) + .setPos(0, 4)) + .widget( + new NumericWidget().setGetter(() -> (int) ((1f / mRoughnessMultiplier) * 100f)) + .setSetter(val -> mRoughnessMultiplier = 100f / (int) val) + .setBounds(50, 200) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip( + "Set the trace size. Smaller traces allow material savings but take longer to fabricate. Larger traces waste material but are fast. 50-200 μm.") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(90, 16)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.OVERLAY_BUTTON_CROSS) + .setSize(18, 18) + .addTooltip(new Text("Can't change configuration when running !").color(Color.RED.dark(3))) + .setEnabled(widget -> getBaseMetaTileEntity().isActive())) + .setPos(10, 25)) + .widget( + new DynamicPositionedColumn().setSynced(false) + .widget( + new TextWidget(new Text("Bio Upgrade Offsets")).setSize(72, 18) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget( + new DynamicPositionedRow().setSynced(false) + .widget( + new NumericWidget().setGetter(() -> mBioOffsets[0]) + .setSetter(val -> mBioOffsets[0] = (int) val) + .setBounds(-16, 16) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip("X Offset") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(36, 18)) + .widget( + new NumericWidget().setGetter(() -> mBioOffsets[1]) + .setSetter(val -> mBioOffsets[1] = (int) val) + .setBounds(-16, 16) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip("Z Offset") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(36, 18)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget( + new TextWidget(new Text("Cooler Tier 1 Offsets")).setSize(72, 18) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget( + new DynamicPositionedRow().setSynced(false) + .widget( + new NumericWidget().setGetter(() -> mOCTier1Offsets[0]) + .setSetter(val -> mOCTier1Offsets[0] = (int) val) + .setBounds(-16, 16) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip("X Offset") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(36, 18)) + .widget( + new NumericWidget().setGetter(() -> mOCTier1Offsets[1]) + .setSetter(val -> mOCTier1Offsets[1] = (int) val) + .setBounds(-16, 16) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip("Z Offset") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(36, 18)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget( + new TextWidget(new Text("Cooler Tier 2 Offsets")).setSize(72, 18) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .widget( + new DynamicPositionedRow().setSynced(false) + .widget( + new NumericWidget().setGetter(() -> mOCTier2Offsets[0]) + .setSetter(val -> mOCTier2Offsets[0] = (int) val) + .setBounds(-16, 16) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip("X Offset") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(36, 18)) + .widget( + new NumericWidget().setGetter(() -> mOCTier2Offsets[1]) + .setSetter(val -> mOCTier2Offsets[1] = (int) val) + .setBounds(-16, 16) + .setTextColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .addTooltip("Z Offset") + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .setSize(36, 18)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive())) + .setPos(110, 25)); + return builder.build(); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEPlasmaForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPlasmaForge.java new file mode 100644 index 0000000000..feaead0047 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPlasmaForge.java @@ -0,0 +1,1260 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static gregtech.api.enums.GTValues.AuthorColen; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.ExoticEnergy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_OFF; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_ON; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_RAINBOWSCREEN_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofCoil; +import static gregtech.api.util.GTUtility.filterValidMTEs; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.ArrayList; +import java.util.HashMap; +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.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.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.StructureDefinition; +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.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.FakeSyncWidget; +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.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.SoundResource; +import gregtech.api.gui.modularui.GTUITextures; +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.GregTechTileClientEvents; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; +import gregtech.api.objects.GTChunkManager; +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.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; +import gregtech.api.util.ParallelHelper; +import tectech.thing.gui.TecTechUITextures; + +public class MTEPlasmaForge extends MTEExtendedPowerMultiBlockBase implements ISurvivalConstructable { + + // 3600 seconds in an hour, 8 hours, 20 ticks in a second. + private static final double max_efficiency_time_in_ticks = 3600d * 8d * 20d; + // Multiplier for the efficiency decay rate + private static final double efficiency_decay_rate = 100; + private static final double maximum_discount = 0.5d; + private static final int CONVERGENCE_BITMAP = 0b1; + private static final int DISCOUNT_BITMAP = 0b10; + + // Valid fuels which the discount will get applied to. + private static final FluidStack[] valid_fuels = { MaterialsUEVplus.ExcitedDTCC.getFluid(1L), + MaterialsUEVplus.ExcitedDTPC.getFluid(1L), MaterialsUEVplus.ExcitedDTRC.getFluid(1L), + MaterialsUEVplus.ExcitedDTEC.getFluid(1L), MaterialsUEVplus.ExcitedDTSC.getFluid(1L) }; + + private static final HashMap> FUEL_ENERGY_VALUES = new HashMap<>() { + + { + put( + MaterialsUEVplus.ExcitedDTCC.getFluid(1L) + .getFluid(), + Pair.of(14_514_983L, 1 / 8f)); + put( + MaterialsUEVplus.ExcitedDTPC.getFluid(1L) + .getFluid(), + Pair.of(66_768_460L, 1 / 4f)); + put( + MaterialsUEVplus.ExcitedDTRC.getFluid(1L) + .getFluid(), + Pair.of(269_326_451L, 1 / 2f)); + put( + MaterialsUEVplus.ExcitedDTEC.getFluid(1L) + .getFluid(), + Pair.of(1_073_007_393L, 1f)); + put( + MaterialsUEVplus.ExcitedDTSC.getFluid(1L) + .getFluid(), + Pair.of(4_276_767_521L, 2f)); + } + }; + + private static final int min_input_hatch = 0; + private static final int max_input_hatch = 7; + private static final int min_output_hatch = 0; + private static final int max_output_hatch = 2; + private static final int min_input_bus = 0; + private static final int max_input_bus = 6; + private static final int min_output_bus = 0; + private static final int max_output_bus = 1; + + // Current discount rate. 1 = 0%, 0 = 100%. + private double discount = 1; + private int mHeatingCapacity = 0; + private long running_time = 0; + private boolean convergence = false; + private HeatingCoilLevel mCoilLevel; + private OverclockCalculator overclockCalculator; + + @SuppressWarnings("SpellCheckingInspection") + private static final String[][] structure_string = new String[][] { { " ", + " N N N N ", " N N N N ", " N N N N ", + " ", " ", " ", + " N N N N ", " N N N N ", " NNN NNN N N NNN NNN ", + " ", " ", " ", + " NNN NNN NNN NNN ", " ", " ", + " ", " ", " ", + " NNN NNN NNN NNN ", " ", " ", + " ", " NNN NNN NNN NNN " }, + { " N N N N ", " bCCCb bCCCb ", " bCCCb bCCCb ", + " bCCCb bCCCb ", " N N N N ", + " ", " N N N N ", + " bCCCb bCCCb ", " bCCCb bCCCb ", + "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CCC CCC N N CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN NbbbN NbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN N N NbbbN NbbbN", }, + { " N N N N ", " bCCCb bCCCb ", " NNNbbbbbNNsNNbbbbbNNN ", + " ss bCCCb bCCCb ss ", " s N N N N s ", + " s s ", " N N N N N N ", + " N bCCCb bCCCb N ", " N sbbbbbNNsNNbbbbbs N ", + "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", + " NNN NNN NNN NNN ", " s s s s ", + " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", + "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, + { " N N N N ", " bCCCb bCCCb ", " ss bCCCb bCCCb ss ", + " bCCCb bCCCb ", " s NCCCN NCCCN s ", + " s NCCCN NCCCN s ", " NCCCN NCCCN ", + " bCCCb bCCCb ", " bCCCb bCCCb ", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbN NbbbNNNbbbN", }, + { " ", " N N N N ", " s N N N N s ", + " s NCCCN NCCCN s ", " ", + " ", " ", + " NCCCN NCCCN ", " N N N N ", + " NNN NN N N NN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " ", " ", + " NNN NNN NNN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NbN NNN NNN ", }, + { " ", " ", " s s ", + " s NCCCN NCCCN s ", " ", + " ", " ", + " NCCCN NCCCN ", " ", + " N N N N ", " C C C C ", + " C C C C ", " C C C C ", + " N N N N ", " ", + " ", " ", + " ", " ", + " N N N N ", " C C C C ", + " C C C C ", " C C C C ", + " N N NbN N N ", }, + { " ", " N N N N ", " N N N N N N ", + " NCCCN NCCCN ", " ", + " ", " ", + " NCCCN NCCCN ", " N N N N ", + " NNN NN N N NN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " ", " ", + " NNN NNN NNN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NbN NNN NNN ", }, + { " N N N N ", " bCCCb bCCCb ", " N bCCCb bCCCb N ", + " bCCCb bCCCb ", " NCCCN NCCCN ", + " NCCCN NCCCN ", " NCCCN NCCCN ", + " bCCCb bCCCb ", " bCCCb bCCCb ", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbN NbbbNNNbbbN", }, + { " N N N N ", " bCCCb bCCCb ", " N sbbbbbNNsNNbbbbbs N ", + " bCCCb bCCCb ", " N N N N ", + " ", " N N N N ", + " bCCCb bCCCb ", " s sbbbbbNNsNNbbbbbs s ", + "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", + " NNN NNN NNN NNN ", " s s s s ", + " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", + "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, + { " NNN NNN N N NNN NNN ", "NbbbN NbbNCCCb bCCCNbbN NbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " NNN NNN N N NNN NNN ", + " N N N N ", " NNN NNN N N NNN NNN ", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", + "NNNN NNNCCCb bCCCNNN NNNN", " CCC CCC N N CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN NbbbN NbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN NbN NbbbN NbbbN", }, + { " ", " CCC CCC N N CCC CCC ", " CbC CbC N N CbC CbC ", + " CCCCCCCCC N N CCCCCCCCC ", " C C C C ", + " C C C C ", " C C C C ", + " CCCCCCCCC N N CCCCCCCCC ", " CbC CbC N N CbC CbC ", + " CCC CCC N N CCC CCC ", " ", + " ", " ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " ", " ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " NNN NNN NbN NNN NNN ", }, + { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", + " CCCCCCCCC CCCCCCCCC ", " C C C C ", + " C C C C ", " C C C C ", + " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", + " CCC CCC CCC CCC ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NbN N N ", }, + { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", + " CCCCCCCCC CCCCCCCCC ", " C C C C ", + " C C C C ", " C C C C ", + " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", + " CCC CCC CCC CCC ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NbN N N ", }, + { " NNN NNN NNN NNN ", "NbbbN NbbbN NbbbN NbbbN", "NbbbN NbbbN NbbbN NbbbN", + "NbbbNNNbbbN NbbbNNNbbbN", " NNN NNN NNN NNN ", + " N N N N ", " NNN NNN NNN NNN ", + "NbbbNNNbbbN NbbbNNNbbbN", "NbbbN NbbbN NbbbN NbbbN", + "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NsNsN N N ", }, + { " ", " ", " N N N N ", + " ", " ", + " ", " ", + " ", " N N N N ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NbbbbbN N N ", }, + { " ", " ", " N N N N ", + " ", " ", + " ", " ", + " ", " N N N N ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " N ", + " NsNNNNNsNNNNsbbbbbsNNNNsNNNNNsN ", }, + { " ", " ", " s s s s ", + " ", " ", + " ", " ", + " ", " s s s s ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ~ ", " NNN ", + " NbbbbbNbbbbNbbbbbNbbbbNbbbbbN ", }, + { " ", " ", " N N N N ", + " ", " ", + " ", " ", + " ", " N N N N ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " N ", + " NsNNNNNsNNNNsbbbbbsNNNNsNNNNNsN ", }, + { " ", " ", " N N N N ", + " ", " ", + " ", " ", + " ", " N N N N ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NbbbbbN N N ", }, + { " NNN NNN NNN NNN ", "NbbbN NbbbN NbbbN NbbbN", "NbbbN NbbbN NbbbN NbbbN", + "NbbbNNNbbbN NbbbNNNbbbN", " NNN NNN NNN NNN ", + " N N N N ", " NNN NNN NNN NNN ", + "NbbbNNNbbbN NbbbNNNbbbN", "NbbbN NbbbN NbbbN NbbbN", + "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NsNsN N N ", }, + { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", + " CCCCCCCCC CCCCCCCCC ", " C C C C ", + " C C C C ", " C C C C ", + " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", + " CCC CCC CCC CCC ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NbN N N ", }, + { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ", + " CCCCCCCCC CCCCCCCCC ", " C C C C ", + " C C C C ", " C C C C ", + " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ", + " CCC CCC CCC CCC ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " N N NbN N N ", }, + { " ", " CCC CCC N N CCC CCC ", " CbC CbC N N CbC CbC ", + " CCCCCCCCC N N CCCCCCCCC ", " C C C C ", + " C C C C ", " C C C C ", + " CCCCCCCCC N N CCCCCCCCC ", " CbC CbC N N CbC CbC ", + " CCC CCC N N CCC CCC ", " ", + " ", " ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " ", " ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " NNN NNN NbN NNN NNN ", }, + { " NNN NNN N N NNN NNN ", "NbbbN NbbNCCCb bCCCNbbN NbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " NNN NNN N N NNN NNN ", + " N N N N ", " NNN NNN N N NNN NNN ", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN", + "NNNN NNNCCCb bCCCNNN NNNN", " CCC CCC N N CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN NbbbN NbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN NbN NbbbN NbbbN", }, + { " N N N N ", " bCCCb bCCCb ", " N sbbbbbNNsNNbbbbbs N ", + " bCCCb bCCCb ", " N N N N ", + " ", " N N N N ", + " bCCCb bCCCb ", " s sbbbbbNNsNNbbbbbs s ", + "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", + " NNN NNN NNN NNN ", " s s s s ", + " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", + "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, + { " N N N N ", " bCCCb bCCCb ", " N bCCCb bCCCb N ", + " bCCCb bCCCb ", " NCCCN NCCCN ", + " NCCCN NCCCN ", " NCCCN NCCCN ", + " bCCCb bCCCb ", " bCCCb bCCCb ", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbN NbbbNNNbbbN", }, + { " ", " N N N N ", " N N N N N N ", + " NCCCN NCCCN ", " ", + " ", " ", + " NCCCN NCCCN ", " N N N N ", + " NNN NN N N NN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " ", " ", + " NNN NNN NNN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NbN NNN NNN ", }, + { " ", " ", " s s ", + " s NCCCN NCCCN s ", " ", + " ", " ", + " NCCCN NCCCN ", " ", + " N N N N ", " C C C C ", + " C C C C ", " C C C C ", + " N N N N ", " ", + " ", " ", + " ", " ", + " N N N N ", " C C C C ", + " C C C C ", " C C C C ", + " N N NbN N N ", }, + { " ", " N N N N ", " s N N N N s ", + " s NCCCN NCCCN s ", " ", + " ", " ", + " NCCCN NCCCN ", " N N N N ", + " NNN NN N N NN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " ", " ", + " NNN NNN NNN NNN ", " C C C C ", + " C C C C ", " C C C C ", + " NNN NNN NbN NNN NNN ", }, + { " N N N N ", " bCCCb bCCCb ", " ss bCCCb bCCCb ss ", + " bCCCb bCCCb ", " s NCCCN NCCCN s ", + " s NCCCN NCCCN s ", " NCCCN NCCCN ", + " bCCCb bCCCb ", " bCCCb bCCCb ", + "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ", + " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", + "NbbbNNNbbbN NbN NbbbNNNbbbN", }, + { " N N N N ", " bCCCb bCCCb ", " NNNbbbbbNNsNNbbbbbNNN ", + " ss bCCCb bCCCb ss ", " s N N N N s ", + " s s ", " N N N N N N ", + " N bCCCb bCCCb N ", " N sbbbbbNNsNNbbbbbs N ", + "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ", + " NNN NNN NNN NNN ", " s s s s ", + " NNN NNN NNN NNN ", " NNN NNN NNN NNN ", + "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ", + " CbC CbC CbC CbC ", " CbC CbC CbC CbC ", + "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", }, + { " N N N N ", " bCCCb bCCCb ", " bCCCb bCCCb ", + " bCCCb bCCCb ", " N N N N ", + " ", " N N N N ", + " bCCCb bCCCb ", " bCCCb bCCCb ", + "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CCC CCC N N CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN NbbbN NbbbN", " N N N N ", + " N N N N ", " ", + " N N N N ", " N N N N ", + "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ", + " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", + "NbbbN NbbbN N N NbbbN NbbbN", }, + { " ", " N N N N ", " N N N N ", + " N N N N ", " ", + " ", " ", + " N N N N ", " N N N N ", + " NNN NNN N N NNN NNN ", " ", + " ", " ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " ", " ", + " NNN NNN NNN NNN ", " ", + " ", " ", + " NNN NNN NNN NNN ", } }; + + protected static final int DIM_TRANS_CASING = 12; + protected static final int DIM_INJECTION_CASING = 13; + protected static final int DIM_BRIDGE_CASING = 14; + + private boolean isMultiChunkloaded = true; + + protected static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure_string) + .addElement('C', ofCoil(MTEPlasmaForge::setCoilLevel, MTEPlasmaForge::getCoilLevel)) + .addElement( + 'b', + buildHatchAdder(MTEPlasmaForge.class) + .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Energy, ExoticEnergy, Maintenance) + .casingIndex(DIM_INJECTION_CASING) + .dot(3) + .buildAndChain(GregTechAPI.sBlockCasings1, DIM_INJECTION_CASING)) + .addElement('N', ofBlock(GregTechAPI.sBlockCasings1, DIM_TRANS_CASING)) + .addElement('s', ofBlock(GregTechAPI.sBlockCasings1, DIM_BRIDGE_CASING)) + .build(); + + public MTEPlasmaForge(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPlasmaForge(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPlasmaForge(mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Plasma Forge, DTPF") + .addInfo("Transcending Dimensional Boundaries.") + .addInfo( + "Takes " + EnumChatFormatting.RED + + GTUtility.formatNumbers(max_efficiency_time_in_ticks / (3600 * 20)) + + EnumChatFormatting.GRAY + + " hours of continuous run time to fully breach dimensional") + .addInfo( + "boundaries and achieve maximum efficiency, reducing fuel consumption by up to " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(100 * maximum_discount) + + "%" + + EnumChatFormatting.GRAY + + ".") + .addInfo("Multidimensional spaces can be perfectly aligned and synchronized in this state, ") + .addInfo( + "allowing " + EnumChatFormatting.GOLD + + "Dimensional Convergence " + + EnumChatFormatting.GRAY + + "to occur. To reach the required stability threshold,") + .addInfo( + "a " + EnumChatFormatting.AQUA + + "Transdimensional Alignment Matrix " + + EnumChatFormatting.GRAY + + "must be placed in the controller.") + .addInfo( + "When " + EnumChatFormatting.GOLD + + "Convergence " + + EnumChatFormatting.GRAY + + "is active, it allows the forge to perform " + + EnumChatFormatting.RED + + "Perfect Overclocks" + + EnumChatFormatting.GRAY + + ",") + .addInfo("but the extra power cost is instead added in form of increased catalyst amounts.") + .addInfo( + "When no recipe is running, fuel discount decays x" + EnumChatFormatting.RED + + GTUtility.formatNumbers(efficiency_decay_rate) + + EnumChatFormatting.GRAY + + " as fast as it builds up.") + .addInfo(AuthorColen) + .addSeparator() + .beginStructureBlock(33, 24, 33, false) + .addStructureInfo("DTPF Structure is too complex! See schematic for details.") + .addStructureInfo(EnumChatFormatting.GOLD + "2,112" + EnumChatFormatting.GRAY + " Heating coils required.") + .addStructureInfo( + EnumChatFormatting.GOLD + "120" + EnumChatFormatting.GRAY + " Dimensional bridge blocks required.") + .addStructureInfo( + EnumChatFormatting.GOLD + "1,270" + + EnumChatFormatting.GRAY + + " Dimensional injection casings required.") + .addStructureInfo( + EnumChatFormatting.GOLD + "2,121" + + EnumChatFormatting.GRAY + + " Dimensionally transcendent casings required.") + .addStructureInfo("--------------------------------------------") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + "1" + + EnumChatFormatting.GRAY + + "-" + + EnumChatFormatting.GOLD + + "2" + + EnumChatFormatting.GRAY + + " energy hatches or " + + EnumChatFormatting.GOLD + + "1" + + EnumChatFormatting.GRAY + + " TT energy hatch.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + min_input_hatch + + EnumChatFormatting.GRAY + + "-" + + EnumChatFormatting.GOLD + + max_input_hatch + + EnumChatFormatting.GRAY + + " input hatches.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + min_output_hatch + + EnumChatFormatting.GRAY + + "-" + + EnumChatFormatting.GOLD + + max_output_hatch + + EnumChatFormatting.GRAY + + " output hatches.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + min_input_bus + + EnumChatFormatting.GRAY + + "-" + + EnumChatFormatting.GOLD + + max_input_bus + + EnumChatFormatting.GRAY + + " input busses.") + .addStructureInfo( + "Requires " + EnumChatFormatting.GOLD + + min_output_bus + + EnumChatFormatting.GRAY + + "-" + + EnumChatFormatting.GOLD + + max_input_bus + + EnumChatFormatting.GRAY + + " output busses.") + .addStructureInfo("--------------------------------------------") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + boolean exotic = addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex); + return super.addToMachineList(aTileEntity, aBaseCasingIndex) || exotic; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + IIconContainer glow = OVERLAY_FUSION1_GLOW; + if (convergence && discount == maximum_discount) { + glow = OVERLAY_RAINBOWSCREEN_GLOW; + } + if (side == aFacing) { + if (aActive) return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING], TextureFactory.builder() + .addIcon(OVERLAY_DTPF_ON) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(glow) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING], TextureFactory.builder() + .addIcon(OVERLAY_DTPF_OFF) + .extFacing() + .build() }; + } + return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING] }; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return 0; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.plasmaForgeRecipes; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + CheckRecipeResult recipe_process = super.checkProcessing(); + if (recipe_process.wasSuccessful()) { + running_time = running_time + mMaxProgresstime; + } + return recipe_process; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @Nonnull + @Override + protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + overclockCalculator = super.createOverclockCalculator(recipe).setRecipeHeat(recipe.mSpecialValue) + .setMachineHeat(mHeatingCapacity); + if (discount == maximum_discount && convergence) { + overclockCalculator = overclockCalculator.enablePerfectOC(); + } + return overclockCalculator; + } + + @NotNull + @Override + protected ParallelHelper createParallelHelper(@Nonnull GTRecipe recipe) { + return super.createParallelHelper(recipeAfterAdjustments(recipe)); + } + + @Override + protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + return recipe.mSpecialValue <= mHeatingCapacity ? CheckRecipeResultRegistry.SUCCESSFUL + : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); + } + }; + } + + @Nonnull + protected GTRecipe recipeAfterAdjustments(@Nonnull GTRecipe recipe) { + GTRecipe tRecipe = recipe.copy(); + boolean adjusted = false; + outside: for (int i = 0; i < recipe.mFluidInputs.length; i++) { + for (FluidStack fuel : valid_fuels) { + if (tRecipe.mFluidInputs[i].isFluidEqual(fuel)) { + recalculateDiscount(); + if (discount == maximum_discount && convergence + && overclockCalculator != null + && overclockCalculator.getCalculationStatus()) { + calculateCatalystIncrease(tRecipe, i, false); + getBaseMetaTileEntity() + .sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); + } + tRecipe.mFluidInputs[i].amount = (int) Math.round(tRecipe.mFluidInputs[i].amount * discount); + adjusted = true; + break outside; + } + } + } + // Convergence adjusts the recipe even if it has no catalyst input + if (!adjusted && discount == maximum_discount + && convergence + && overclockCalculator != null + && overclockCalculator.getCalculationStatus()) { + recalculateDiscount(); + calculateCatalystIncrease(tRecipe, 0, true); + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); + } + return tRecipe; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + + // Reset heating capacity. + mHeatingCapacity = 0; + + // Get heating capacity from coils in structure. + setCoilLevel(HeatingCoilLevel.None); + + // Check the main structure + if (!checkPiece(STRUCTURE_PIECE_MAIN, 16, 21, 16)) return false; + + if (getCoilLevel() == HeatingCoilLevel.None) return false; + + // Item input bus check. + if (mInputBusses.size() > max_input_bus) return false; + + // Item output bus check. + if (mOutputBusses.size() > max_output_bus) return false; + + // Fluid input hatch check. + if (mInputHatches.size() > max_input_hatch) return false; + + // Fluid output hatch check. + if (mOutputHatches.size() > max_output_hatch) return false; + + // If there is more than 1 TT energy hatch, the structure check will fail. + // If there is a TT hatch and a normal hatch, the structure check will fail. + if (mExoticEnergyHatches.size() > 0) { + if (mEnergyHatches.size() > 0) return false; + if (mExoticEnergyHatches.size() > 1) return false; + } + + // If there is 0 or more than 2 energy hatches structure check will fail. + if (mEnergyHatches.size() > 0) { + if (mEnergyHatches.size() > 2) return false; + + // Check will also fail if energy hatches are not of the same tier. + byte tier_of_hatch = mEnergyHatches.get(0).mTier; + for (MTEHatchEnergy energyHatch : mEnergyHatches) { + if (energyHatch.mTier != tier_of_hatch) { + return false; + } + } + } + + // If there are no energy hatches or TT energy hatches, structure will fail to form. + if ((mEnergyHatches.size() == 0) && (mExoticEnergyHatches.size() == 0)) return false; + + // Maintenance hatch not required but left for compatibility. + // Don't allow more than 1, no free casing spam! + if (mMaintenanceHatches.size() > 1) return false; + + // Heat capacity of coils used on multi. No free heat from extra EU! + mHeatingCapacity = (int) getCoilLevel().getHeat(); + + // All structure checks passed, return true. + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public void clearHatches() { + super.clearHatches(); + mExoticEnergyHatches.clear(); + } + + @Override + public boolean addOutput(FluidStack aLiquid) { + if (aLiquid == null) return false; + FluidStack tLiquid = aLiquid.copy(); + + return dumpFluid(mOutputHatches, tLiquid, true) || dumpFluid(mOutputHatches, tLiquid, false); + } + + @Override + public String[] getInfoData() { + + long storedEnergy = 0; + long maxEnergy = 0; + + for (MTEHatch tHatch : filterValidMTEs(mExoticEnergyHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + long voltage = getAverageInputVoltage(); + long amps = getMaxInputAmps(); + + // Calculate discount to make sure it is shown properly even when machine is off but decaying + recalculateDiscount(); + + return new String[] { "------------ Critical Information ------------", + StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mProgresstime) + + EnumChatFormatting.RESET + + "t / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime) + + EnumChatFormatting.RESET + + "t", + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(getActualEnergyUsage()) + + EnumChatFormatting.RESET + + " EU/t", + StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(voltage) + + EnumChatFormatting.RESET + + " EU/t(*" + + EnumChatFormatting.YELLOW + + amps + + EnumChatFormatting.RESET + + "A) " + + StatCollector.translateToLocal("GT5U.machines.tier") + + ": " + + EnumChatFormatting.YELLOW + + VN[GTUtility.getTier(voltage)] + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.EBF.heat") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mHeatingCapacity) + + EnumChatFormatting.RESET + + " K", + "Ticks run: " + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(running_time) + + EnumChatFormatting.RESET + + ", Fuel Discount: " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(100 * (1 - discount)) + + EnumChatFormatting.RESET + + "%", + "Convergence: " + (convergence ? EnumChatFormatting.GREEN + "Active" : EnumChatFormatting.RED + "Inactive"), + "-----------------------------------------" }; + } + + private void recalculateDiscount() { + double time_percentage = running_time / max_efficiency_time_in_ticks; + time_percentage = Math.min(time_percentage, 1.0d); + // Multiplied by 0.5 because that is the maximum achievable discount + discount = 1 - time_percentage * 0.5; + discount = Math.max(maximum_discount, discount); + } + + private int catalystTypeForRecipesWithoutCatalyst = 1; + + private void calculateCatalystIncrease(GTRecipe recipe, int index, boolean withoutCatalyst) { + long machineConsumption = overclockCalculator.getConsumption(); + int numberOfOverclocks = (int) Math.ceil(calculateTier(machineConsumption) - GTUtility.getTier(recipe.mEUt)); + double recipeDuration = recipe.mDuration / Math.pow(4, numberOfOverclocks); + // Power difference between regular and perfect OCs for this recipe duration + long extraPowerNeeded = (long) ((Math.pow(2, numberOfOverclocks) - 1) * machineConsumption * recipeDuration); + int inputFluids = recipe.mFluidInputs.length; + int outputFluids = recipe.mFluidOutputs.length; + int extraCatalystNeeded; + Fluid validFuel; + if (!withoutCatalyst) { + validFuel = recipe.mFluidInputs[index].getFluid(); + extraCatalystNeeded = (int) (extraPowerNeeded / FUEL_ENERGY_VALUES.get(validFuel) + .getLeft()); + recipe.mFluidInputs[index].amount += extraCatalystNeeded; + // Increase present catalyst and residue by calculated amount + for (int j = 0; j < outputFluids; j++) { + if (recipe.mFluidOutputs[j] + .isFluidEqual(MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1))) { + recipe.mFluidOutputs[j].amount += (int) (extraCatalystNeeded * FUEL_ENERGY_VALUES.get(validFuel) + .getRight()); + } + } + } else { + // Add chosen catalyst as recipe input + validFuel = valid_fuels[catalystTypeForRecipesWithoutCatalyst - 1].getFluid(); + extraCatalystNeeded = (int) (extraPowerNeeded / FUEL_ENERGY_VALUES.get(validFuel) + .getLeft()); + FluidStack[] newInputFluids = new FluidStack[inputFluids + 1]; + for (int i = 0; i < inputFluids; i++) { + newInputFluids[i] = recipe.mFluidInputs[i].copy(); + } + newInputFluids[inputFluids] = new FluidStack(validFuel, extraCatalystNeeded / 2); + recipe.mFluidInputs = newInputFluids; + // Add residue as recipe output + FluidStack[] newOutputFluids = new FluidStack[outputFluids + 1]; + for (int i = 0; i < outputFluids; i++) { + newOutputFluids[i] = recipe.mFluidOutputs[i].copy(); + } + newOutputFluids[outputFluids] = new FluidStack( + MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1), + (int) (extraCatalystNeeded * FUEL_ENERGY_VALUES.get(validFuel) + .getRight())); + recipe.mFluidOutputs = newOutputFluids; + } + } + + private static final double LN2 = Math.log(2); + + private double calculateTier(long voltage) { + return (1 + Math.max(0, (Math.log(voltage) / LN2) - 5) / 2); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && !aBaseMetaTileEntity.isAllowedToWork()) { + // If machine has stopped, stop chunkloading. + GTChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity); + isMultiChunkloaded = false; + } else if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && !isMultiChunkloaded) { + // Load a 3x3 area centered on controller when machine is running. + GTChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity); + + int ControllerXCoordinate = ((TileEntity) aBaseMetaTileEntity).xCoord; + int ControllerZCoordinate = ((TileEntity) aBaseMetaTileEntity).zCoord; + + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate + 16)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate - 16)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate + 16)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate - 16)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate + 16)); + GTChunkManager.requestChunkLoad( + (TileEntity) aBaseMetaTileEntity, + new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate - 16)); + + isMultiChunkloaded = true; + } + + super.onPostTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide()) { + if (mMaxProgresstime == 0) { + running_time = Math.max(0, running_time - (long) efficiency_decay_rate); + } + if (aTick % 100 == 0) { + ItemStack controllerStack = this.getControllerSlot(); + if (convergence && (controllerStack == null + || !controllerStack.isItemEqual(ItemList.Transdimensional_Alignment_Matrix.get(1)))) { + convergence = false; + getBaseMetaTileEntity() + .sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData()); + } + } + } + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 16, 21, 16); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 16, 21, 16, realBudget, env, false, true); + } + + @SideOnly(Side.CLIENT) + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.GT_MACHINES_PLASMAFORGE_LOOP.resourceLocation; + } + + @Override + public byte getUpdateData() { + byte data = 0; + if (discount == maximum_discount) { + data += DISCOUNT_BITMAP; + } + if (convergence) { + data += CONVERGENCE_BITMAP; + } + return data; + } + + @Override + public void receiveClientEvent(byte aEventID, byte aValue) { + if (aEventID == GregTechTileClientEvents.CHANGE_CUSTOM_DATA) { + convergence = (aValue & CONVERGENCE_BITMAP) == CONVERGENCE_BITMAP; + if ((aValue & DISCOUNT_BITMAP) == DISCOUNT_BITMAP) { + discount = maximum_discount; + } + } + } + + private static final int CATALYST_WINDOW_ID = 10; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + buildContext.addSyncedWindow(CATALYST_WINDOW_ID, this::createCatalystWindow); + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + ItemStack controllerStack = this.getControllerSlot(); + if (clickData.mouseButton == 0) { + if (controllerStack != null + && controllerStack.isItemEqual(ItemList.Transdimensional_Alignment_Matrix.get(1))) { + convergence = !convergence; + } + } else if (clickData.mouseButton == 1 && !widget.isClient()) { + widget.getContext() + .openSyncedWindow(CATALYST_WINDOW_ID); + } + }) + .setPlayClickSound(true) + .setBackground(() -> { + List ret = new ArrayList<>(); + if (convergence) { + ret.add(GTUITextures.BUTTON_STANDARD_PRESSED); + ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_ON); + } else { + ret.add(GTUITextures.BUTTON_STANDARD); + ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_OFF); + } + return ret.toArray(new IDrawable[0]); + }) + .addTooltip(translateToLocal("GT5U.DTPF.convergencebutton")) + .addTooltip(EnumChatFormatting.GRAY + translateToLocal("GT5U.DTPF.convergencebuttontooltip.0")) + .addTooltip(EnumChatFormatting.GRAY + translateToLocal("GT5U.DTPF.convergencebuttontooltip.1")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 112) + .setSize(16, 16) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(() -> convergence, (val) -> convergence = val), builder)); + super.addUIWidgets(builder, buildContext); + } + + protected ModularWindow createCatalystWindow(final EntityPlayer player) { + final int WIDTH = 58; + final int HEIGHT = 52; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GTUITextures.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("GT5U.DTPF.catalysttier") + .setPos(3, 4) + .setSize(50, 20)) + .widget( + new NumericWidget().setSetter(val -> catalystTypeForRecipesWithoutCatalyst = (int) val) + .setGetter(() -> catalystTypeForRecipesWithoutCatalyst) + .setBounds(1, 5) + .setDefaultValue(1) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(50, 18) + .setPos(4, 25) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .addTooltip(translateToLocal("GT5U.DTPF.catalystinfotooltip")) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer( + () -> catalystTypeForRecipesWithoutCatalyst, + (val) -> catalystTypeForRecipesWithoutCatalyst = val), + builder)); + return builder.build(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setLong("eRunningTime", running_time); + aNBT.setDouble("eLongDiscountValue", discount); + aNBT.setInteger("catalystType", catalystTypeForRecipesWithoutCatalyst); + aNBT.setBoolean("convergence", convergence); + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + running_time = aNBT.getLong("eRunningTime"); + discount = aNBT.getDouble("eLongDiscountValue"); + catalystTypeForRecipesWithoutCatalyst = aNBT.getInteger("catalystType"); + convergence = aNBT.getBoolean("convergence"); + super.loadNBTData(aNBT); + } + + public HeatingCoilLevel getCoilLevel() { + return mCoilLevel; + } + + public void setCoilLevel(HeatingCoilLevel aCoilLevel) { + mCoilLevel = aCoilLevel; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean getDefaultHasMaintenanceChecks() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEPrimitiveBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPrimitiveBlastFurnace.java new file mode 100644 index 0000000000..c95abda9d7 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPrimitiveBlastFurnace.java @@ -0,0 +1,521 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.IAlignment; +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SteamVariant; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.gui.modularui.GUITextureSet; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.modularui.IGetTitleColor; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.RecipeMapWorkable; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.objects.GTItemStack; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; +import gregtech.common.Pollution; + +public abstract class MTEPrimitiveBlastFurnace extends MetaTileEntity + implements IAlignment, ISurvivalConstructable, RecipeMapWorkable, IAddUIWidgets, IGetTitleColor { + + public static final int INPUT_SLOTS = 3, OUTPUT_SLOTS = 3; + private static final ClassValue> STRUCTURE_DEFINITION = new ClassValue<>() { + + @Override + protected IStructureDefinition computeValue(Class type) { + return IStructureDefinition.builder() + .addShape( + "main", + transpose( + new String[][] { { "ccc", "c-c", "ccc" }, { "ccc", "clc", "ccc" }, { "c~c", "clc", "ccc" }, + { "ccc", "ccc", "ccc" }, })) + .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMetaID()))) + .addElement( + 'l', + ofChain(isAir(), ofBlockAnyMeta(Blocks.lava, 1), ofBlockAnyMeta(Blocks.flowing_lava, 1))) + .build(); + } + }; + + public int mMaxProgresstime = 0; + private volatile boolean mUpdated; + public int mUpdate = 5; + public int mProgresstime = 0; + public boolean mMachine = false; + + public ItemStack[] mOutputItems = new ItemStack[OUTPUT_SLOTS]; + + public MTEPrimitiveBlastFurnace(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, INPUT_SLOTS + OUTPUT_SLOTS); + } + + public MTEPrimitiveBlastFurnace(String aName) { + super(aName, INPUT_SLOTS + OUTPUT_SLOTS); + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public int getProgresstime() { + return this.mProgresstime; + } + + @Override + public int maxProgresstime() { + return this.mMaxProgresstime; + } + + @Override + public int increaseProgress(int aProgress) { + this.mProgresstime += aProgress; + return this.mMaxProgresstime - this.mProgresstime; + } + + @Override + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aCoverID) { + return (GregTechAPI.getCoverBehaviorNew(aCoverID.toStack()) + .isSimpleCover()) && (super.allowCoverOnSide(side, aCoverID)); + } + + @Override + public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity); + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("mProgresstime", this.mProgresstime); + aNBT.setInteger("mMaxProgresstime", this.mMaxProgresstime); + if (this.mOutputItems != null) { + for (int i = 0; i < mOutputItems.length; i++) { + if (this.mOutputItems[i] != null) { + NBTTagCompound tNBT = new NBTTagCompound(); + this.mOutputItems[i].writeToNBT(tNBT); + aNBT.setTag("mOutputItem" + i, tNBT); + } + } + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + this.mUpdate = 5; + this.mProgresstime = aNBT.getInteger("mProgresstime"); + this.mMaxProgresstime = aNBT.getInteger("mMaxProgresstime"); + this.mOutputItems = new ItemStack[OUTPUT_SLOTS]; + for (int i = 0; i < OUTPUT_SLOTS; i++) { + this.mOutputItems[i] = GTUtility.loadItem(aNBT, "mOutputItem" + i); + } + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public ExtendedFacing getExtendedFacing() { + return ExtendedFacing.of(getBaseMetaTileEntity().getFrontFacing()); + } + + @Override + public void setExtendedFacing(ExtendedFacing alignment) { + getBaseMetaTileEntity().setFrontFacing(alignment.getDirection()); + } + + @Override + public IAlignmentLimits getAlignmentLimits() { + return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() + && f.isNotFlipped(); + } + + private boolean checkMachine() { + return STRUCTURE_DEFINITION.get(this.getClass()) + .check( + this, + "main", + getBaseMetaTileEntity().getWorld(), + getExtendedFacing(), + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord(), + 1, + 2, + 0, + !mMachine); + } + + protected abstract Block getCasingBlock(); + + protected abstract int getCasingMetaID(); + + @Override + public void onMachineBlockUpdate() { + mUpdated = true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + final int lavaX = aBaseMetaTileEntity.getOffsetX(aBaseMetaTileEntity.getBackFacing(), 1); + final int lavaZ = aBaseMetaTileEntity.getOffsetZ(aBaseMetaTileEntity.getBackFacing(), 1); + if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) { + + new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0D, 0.3D, 0D) + .setIdentifier(ParticleFX.LARGE_SMOKE) + .setPosition( + lavaX + XSTR_INSTANCE.nextFloat(), + aBaseMetaTileEntity.getOffsetY(aBaseMetaTileEntity.getBackFacing(), 1), + lavaZ + XSTR_INSTANCE.nextFloat()) + .setWorld(getBaseMetaTileEntity().getWorld()) + .run(); + } + if (aBaseMetaTileEntity.isServerSide()) { + if (mUpdated) { + // duct tape fix for too many updates on an overloaded server, causing the structure check to not run + if (mUpdate < 0) mUpdate = 5; + mUpdated = false; + } + if (this.mUpdate-- == 0) { + this.mMachine = checkMachine(); + } + if (this.mMachine) { + if (this.mMaxProgresstime > 0) { + if (++this.mProgresstime >= this.mMaxProgresstime) { + addOutputProducts(); + this.mOutputItems = null; + this.mProgresstime = 0; + this.mMaxProgresstime = 0; + GTMod.achievements.issueAchievement( + aBaseMetaTileEntity.getWorld() + .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()), + "steel"); + } + } else if (aBaseMetaTileEntity.isAllowedToWork()) { + checkRecipe(); + } + } + if (this.mMaxProgresstime > 0 && (aTimer % 20L == 0L)) { + Pollution.addPollution( + this.getBaseMetaTileEntity(), + GTMod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond); + } + + aBaseMetaTileEntity.setActive((this.mMaxProgresstime > 0) && (this.mMachine)); + final short lavaY = aBaseMetaTileEntity.getYCoord(); + if (aBaseMetaTileEntity.isActive()) { + if (aBaseMetaTileEntity.getAir(lavaX, lavaY, lavaZ)) { + aBaseMetaTileEntity.getWorld() + .setBlock(lavaX, lavaY, lavaZ, Blocks.lava, 1, 2); + this.mUpdate = 1; + } + if (aBaseMetaTileEntity.getAir(lavaX, lavaY + 1, lavaZ)) { + aBaseMetaTileEntity.getWorld() + .setBlock(lavaX, lavaY + 1, lavaZ, Blocks.lava, 1, 2); + this.mUpdate = 1; + } + } else { + Block lowerLava = aBaseMetaTileEntity.getBlock(lavaX, lavaY, lavaZ); + Block upperLava = aBaseMetaTileEntity.getBlock(lavaX, lavaY + 1, lavaZ); + if (lowerLava == Blocks.lava) { + aBaseMetaTileEntity.getWorld() + .setBlock(lavaX, lavaY, lavaZ, Blocks.air, 0, 2); + this.mUpdate = 1; + } + if (upperLava == Blocks.lava) { + aBaseMetaTileEntity.getWorld() + .setBlock(lavaX, lavaY + 1, lavaZ, Blocks.air, 0, 2); + this.mUpdate = 1; + } + } + } + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + if (aBaseMetaTileEntity.isClientSide()) + StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity); + } + + /** + * Draws random flames and smoke particles in front of Primitive Blast Furnace when active + * + * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isActive()) { + + final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing(); + + final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 0.5D; + final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1); + final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 0.5D; + final double offset = -0.48D; + final double horizontal = XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; + + final double x, y, z; + + y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; + + if (frontFacing == ForgeDirection.WEST) { + x = oX - offset; + z = oZ + horizontal; + } else if (frontFacing == ForgeDirection.EAST) { + x = oX + offset; + z = oZ + horizontal; + } else if (frontFacing == ForgeDirection.NORTH) { + x = oX + horizontal; + z = oZ - offset; + } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) + { + x = oX + horizontal; + z = oZ + offset; + } + + ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D) + .setPosition(x, y, z) + .setWorld(getBaseMetaTileEntity().getWorld()); + particleEventBuilder.setIdentifier(ParticleFX.SMOKE) + .run(); + particleEventBuilder.setIdentifier(ParticleFX.FLAME) + .run(); + } + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.primitiveBlastRecipes; + } + + private void addOutputProducts() { + if (this.mOutputItems == null) { + return; + } + int limit = Math.min(mOutputItems.length, OUTPUT_SLOTS); + for (int i = 0; i < limit; i++) { + int absi = INPUT_SLOTS + i; + if (this.mInventory[absi] == null) { + this.mInventory[absi] = GTUtility.copyOrNull(this.mOutputItems[i]); + } else if (GTUtility.areStacksEqual(this.mInventory[absi], this.mOutputItems[i])) { + this.mInventory[absi].stackSize = Math.min( + this.mInventory[absi].getMaxStackSize(), + this.mInventory[absi].stackSize + this.mOutputItems[i].stackSize); + } + } + } + + private boolean spaceForOutput(ItemStack outputStack, int relativeOutputSlot) { + int absoluteSlot = relativeOutputSlot + INPUT_SLOTS; + if (this.mInventory[absoluteSlot] == null || outputStack == null) { + return true; + } + return ((this.mInventory[absoluteSlot].stackSize + outputStack.stackSize + <= this.mInventory[absoluteSlot].getMaxStackSize()) + && (GTUtility.areStacksEqual(this.mInventory[absoluteSlot], outputStack))); + } + + private boolean checkRecipe() { + if (!this.mMachine) { + return false; + } + ItemStack[] inputs = new ItemStack[INPUT_SLOTS]; + System.arraycopy(mInventory, 0, inputs, 0, INPUT_SLOTS); + GTRecipe recipe = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, 0, null, inputs); + if (recipe == null) { + this.mOutputItems = null; + return false; + } + for (int i = 0; i < OUTPUT_SLOTS; i++) { + if (!spaceForOutput(recipe.getOutput(i), i)) { + this.mOutputItems = null; + return false; + } + } + + if (!recipe.isRecipeInputEqual(true, null, inputs)) { + this.mOutputItems = null; + return false; + } + for (int i = 0; i < INPUT_SLOTS; i++) { + if (mInventory[i] != null && mInventory[i].stackSize == 0) { + mInventory[i] = null; + } + } + + this.mMaxProgresstime = recipe.mDuration; + this.mOutputItems = recipe.mOutputs; + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return aIndex > INPUT_SLOTS; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return !GTUtility.areStacksEqual(aStack, this.mInventory[0]); + } + + @Override + public byte getTileEntityBaseType() { + return 0; + } + + public abstract String getName(); + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return STRUCTURE_DEFINITION.get(getClass()) + .survivalBuild( + this, + stackSize, + "main", + getBaseMetaTileEntity().getWorld(), + getExtendedFacing(), + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord(), + 1, + 2, + 0, + elementBudget, + env, + false); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION.get(getClass()); + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + STRUCTURE_DEFINITION.get(getClass()) + .buildOrHints( + this, + stackSize, + "main", + getBaseMetaTileEntity().getWorld(), + getExtendedFacing(), + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord(), + 1, + 2, + 0, + hintsOnly); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder + .widget( + new SlotWidget(inventoryHandler, 0) + .setBackground( + getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_INGOT_STEAM.get(getSteamVariant())) + .setPos(33, 15)) + .widget( + new SlotWidget(inventoryHandler, 1) + .setBackground( + getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant())) + .setPos(33, 33)) + .widget( + new SlotWidget(inventoryHandler, 2) + .setBackground( + getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_FURNACE_STEAM.get(getSteamVariant())) + .setPos(33, 51)) + .widget( + new SlotWidget(inventoryHandler, 3).setAccess(true, false) + .setBackground( + getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_INGOT_STEAM.get(getSteamVariant())) + .setPos(85, 24)) + .widget( + new SlotWidget(inventoryHandler, 4).setAccess(true, false) + .setBackground( + getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant())) + .setPos(103, 24)) + .widget( + new SlotWidget(inventoryHandler, 5).setAccess(true, false) + .setBackground( + getGUITextureSet().getItemSlot(), + GTUITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant())) + .setPos(121, 24)) + .widget( + new ProgressBar().setTexture(GTUITextures.PROGRESSBAR_ARROW_2_STEAM.get(getSteamVariant()), 20) + .setProgress(() -> (float) mProgresstime / mMaxProgresstime) + .setNEITransferRect( + getRecipeMap().getFrontend() + .getUIProperties().neiTransferRectId) + .setPos(58, 24) + .setSize(20, 18)); + } + + @Override + public GUITextureSet getGUITextureSet() { + return GUITextureSet.STEAM.apply(getSteamVariant()); + } + + @Override + public int getTitleColor() { + return getSteamVariant() == SteamVariant.BRONZE ? COLOR_TITLE.get() : COLOR_TITLE_WHITE.get(); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEProcessingArray.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEProcessingArray.java new file mode 100644 index 0000000000..43f1c003a9 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEProcessingArray.java @@ -0,0 +1,549 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.ExoticEnergy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.metatileentity.implementations.MTEBasicMachine.isValidForLowGravity; +import static gregtech.api.util.GTUtility.filterValidMTEs; + +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; +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.ExoticEnergyInputHelper; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.ProcessingArrayManager; +import gregtech.common.blocks.ItemMachines; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +@Deprecated +public class MTEProcessingArray extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose(new String[][] { { "hhh", "hhh", "hhh" }, { "h~h", "h-h", "hhh" }, { "hhh", "hhh", "hhh" }, })) + .addElement( + 'h', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(t.getAllowedHatches()) + .casingIndex(48) + .dot(1) + .build()), + onElementPass(t -> t.mCasingAmount++, ofBlock(GregTechAPI.sBlockCasings4, 0)))) + .build(); + + private int mCasingAmount = 0; + + private RecipeMap mLastRecipeMap; + private ItemStack lastControllerStack; + private int tTier = 0; + private int mMult = 0; + private boolean downtierUEV = true; + + public MTEProcessingArray(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEProcessingArray(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEProcessingArray(this.mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Processing Array") + .addInfo("Runs supplied machines as if placed in the world") + .addInfo("Place up to 64 singleblock GT machines into the controller") + .addInfo("Note that you still need to supply power to them all") + .addInfo("Use a screwdriver to enable separate input busses") + .addInfo("Use a wire cutter to disable UEV+ downtiering") + .addInfo("Doesn't work on certain machines, deal with it") + .addInfo("Use it if you hate GT++, or want even more speed later on") + .addInfo( + EnumChatFormatting.GOLD + + "On the way to be slowly removed. Use it strictly if you have no alternative.") + .addSeparator() + .beginStructureBlock(3, 3, 3, true) + .addController("Front center") + .addCasingInfoRange("Robust Tungstensteel Machine Casing", 14, 24, false) + .addEnergyHatch("Any casing", 1) + .addMaintenanceHatch("Any casing", 1) + .addInputBus("Any casing", 1) + .addInputHatch("Any casing", 1) + .addOutputBus("Any casing", 1) + .addOutputHatch("Any casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + return super.addToMachineList(aTileEntity, aBaseCasingIndex) + || addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { BlockIcons.casingTexturePages[0][48], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { BlockIcons.casingTexturePages[0][48], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][48] }; + } + + private RecipeMap fetchRecipeMap() { + if (isCorrectMachinePart(getControllerSlot())) { + // Gets the recipe map for the given machine through its unlocalized name + return ProcessingArrayManager.giveRecipeMap(ProcessingArrayManager.getMachineName(getControllerSlot())); + } + return null; + } + + @Override + public RecipeMap getRecipeMap() { + return mLastRecipeMap; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return aStack != null && aStack.getUnlocalizedName() + .startsWith("gt.blockmachines."); + } + + @Override + protected void sendStartMultiBlockSoundLoop() { + SoundResource sound = ProcessingArrayManager + .getSoundResource(ProcessingArrayManager.getMachineName(getControllerSlot())); + if (sound != null) { + sendLoopStart((byte) sound.id); + } + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + SoundResource sound = SoundResource.get(aIndex < 0 ? aIndex + 256 : 0); + if (sound != null) { + GTUtility.doSoundAtClient(sound, getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ); + } + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + if (!GTUtility.areStacksEqual(lastControllerStack, getControllerSlot())) { + // controller slot has changed + lastControllerStack = getControllerSlot(); + mLastRecipeMap = fetchRecipeMap(); + setTierAndMult(); + } + if (mLastRecipeMap == null) return SimpleCheckRecipeResult.ofFailure("no_machine"); + if (mLockedToSingleRecipe && mSingleRecipeCheck != null) { + if (mSingleRecipeCheck.getRecipeMap() != mLastRecipeMap) { + return SimpleCheckRecipeResult.ofFailure("machine_mismatch"); + } + } + + return super.checkProcessing(); + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @Nonnull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + if (GTMod.gregtechproxy.mLowGravProcessing && recipe.mSpecialValue == -100 + && !isValidForLowGravity(recipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) { + return SimpleCheckRecipeResult.ofFailure("high_gravity"); + } + if (recipe.mEUt > availableVoltage) return CheckRecipeResultRegistry.insufficientPower(recipe.mEUt); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + }.setMaxParallelSupplier(this::getMaxParallel); + } + + @Override + protected boolean canUseControllerSlotForRecipe() { + return false; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTValues.V[tTier] * (mLastRecipeMap != null ? mLastRecipeMap.getAmperage() : 1)); + logic.setAvailableAmperage(getMaxParallel()); + logic.setAmperageOC(false); + } + + private void setTierAndMult() { + IMetaTileEntity aMachine = ItemMachines.getMetaTileEntity(getControllerSlot()); + if (aMachine instanceof MTETieredMachineBlock) { + tTier = ((MTETieredMachineBlock) aMachine).mTier; + } else { + tTier = 0; + } + mMult = 0; + if (downtierUEV && tTier > 9) { + tTier--; // Lowers down the tier by 1 to allow for bigger parallel + mMult = 2; // Multiplies Parallels by 4x, keeping the energy cost + } + } + + private int getMaxParallel() { + if (getControllerSlot() == null) { + return 0; + } + return getControllerSlot().stackSize << mMult; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (mMachine && aTick % 20 == 0) { + for (MTEHatchInputBus tInputBus : mInputBusses) { + tInputBus.mRecipeMap = mLastRecipeMap; + } + for (MTEHatchInput tInputHatch : mInputHatches) { + tInputHatch.mRecipeMap = mLastRecipeMap; + } + } + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public void construct(ItemStack aStack, boolean aHintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 1, 1, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true); + } + + private boolean checkHatches() { + return mMaintenanceHatches.size() == 1; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("downtierUEV", downtierUEV); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (aNBT.hasKey("mSeparate")) { + // backward compatibility + inputSeparation = aNBT.getBoolean("mSeparate"); + } + if (aNBT.hasKey("mUseMultiparallelMode")) { + // backward compatibility + batchMode = aNBT.getBoolean("mUseMultiparallelMode"); + } + downtierUEV = aNBT.getBoolean("downtierUEV"); + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) { + // Lock to single recipe + super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); + } else { + inputSeparation = !inputSeparation; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); + } + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) { + batchMode = !batchMode; + if (batchMode) { + GTUtility.sendChatToPlayer(aPlayer, "Batch recipes"); + } else { + GTUtility.sendChatToPlayer(aPlayer, "Don't batch recipes"); + } + } else { + downtierUEV = !downtierUEV; + GTUtility.sendChatToPlayer(aPlayer, "Treat UEV+ machines as multiple UHV " + downtierUEV); + } + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + private List> getAllowedHatches() { + return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy, ExoticEnergy); + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mExoticEnergyHatches.clear(); + mCasingAmount = 0; + return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= 14 && checkHatches(); + } + + @Override + public String[] getInfoData() { + long storedEnergy = 0; + long maxEnergy = 0; + for (MTEHatch tHatch : filterValidMTEs(mExoticEnergyHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { + StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + StatCollector.translateToLocal("GT5U.multiblock.energy") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + GTUtility.formatNumbers(-lEUt) + + EnumChatFormatting.RESET + + " EU/t", + StatCollector.translateToLocal("GT5U.multiblock.mei") + ": " + + EnumChatFormatting.YELLOW + + GTUtility + .formatNumbers(ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList())) + + EnumChatFormatting.RESET + + " EU/t(*" + + GTUtility + .formatNumbers(ExoticEnergyInputHelper.getMaxInputAmpsMulti(getExoticAndNormalEnergyHatchList())) + + "A) " + + StatCollector.translateToLocal("GT5U.machines.tier") + + ": " + + EnumChatFormatting.YELLOW + + VN[GTUtility + .getTier(ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList()))] + + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.multiblock.problems") + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.multiblock.efficiency") + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + StatCollector.translateToLocal("GT5U.PA.machinetier") + ": " + + EnumChatFormatting.GREEN + + tTier + + EnumChatFormatting.RESET + + " " + + StatCollector.translateToLocal("GT5U.PA.discount") + + ": " + + EnumChatFormatting.GREEN + + 1 + + EnumChatFormatting.RESET + + " x", + StatCollector.translateToLocal("GT5U.PA.parallel") + ": " + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(getMaxParallel()) + + EnumChatFormatting.RESET }; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + protected boolean supportsSlotAutomation(int aSlot) { + return aSlot == getControllerSlotIndex(); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + downtierUEV = !downtierUEV; + setTierAndMult(); + }) + .setPlayClickSound(true) + .setBackground(() -> { + if (downtierUEV) { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_DOWN_TIERING_ON }; + } else { + return new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_DOWN_TIERING_OFF }; + } + }) + .setPos(80, 91) + .setSize(16, 16) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.down_tier")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> downtierUEV, val -> downtierUEV = val)); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + if (mLastRecipeMap != null && getControllerSlot() != null) { + tag.setString("type", getControllerSlot().getDisplayName()); + } + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + if (tag.hasKey("type")) { + currentTip.add("Machine: " + EnumChatFormatting.YELLOW + tag.getString("type")); + } else { + currentTip.add("Machine: " + EnumChatFormatting.YELLOW + "None"); + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEPyrolyseOven.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPyrolyseOven.java new file mode 100644 index 0000000000..45d4c1931a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEPyrolyseOven.java @@ -0,0 +1,259 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockUnlocalizedName; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.Muffler; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofCoil; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +import gregtech.api.enums.Textures; +import gregtech.api.enums.Textures.BlockIcons; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEPyrolyseOven extends MTEEnhancedMultiBlockBase implements ISurvivalConstructable { + + private HeatingCoilLevel coilHeat; + private static final int CASING_INDEX = 1090; + private static final IStructureDefinition STRUCTURE_DEFINITION = createStructureDefinition(); + + private static IStructureDefinition createStructureDefinition() { + IStructureElement tCasingElement = NewHorizonsCoreMod.isModLoaded() + ? ofBlockUnlocalizedName(NewHorizonsCoreMod.ID, "gt.blockcasingsNH", 2) + : ofBlock(GregTechAPI.sBlockCasings1, 0); + + return StructureDefinition.builder() + .addShape( + "main", + transpose( + new String[][] { { "ccccc", "ctttc", "ctttc", "ctttc", "ccccc" }, + { "ccccc", "c---c", "c---c", "c---c", "ccccc" }, + { "ccccc", "c---c", "c---c", "c---c", "ccccc" }, + { "bb~bb", "bCCCb", "bCCCb", "bCCCb", "bbbbb" }, })) + .addElement('c', onElementPass(MTEPyrolyseOven::onCasingAdded, tCasingElement)) + .addElement('C', ofCoil(MTEPyrolyseOven::setCoilLevel, MTEPyrolyseOven::getCoilLevel)) + .addElement( + 'b', + buildHatchAdder(MTEPyrolyseOven.class).atLeast(OutputBus, OutputHatch, Energy, Maintenance) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain(onElementPass(MTEPyrolyseOven::onCasingAdded, tCasingElement))) + .addElement( + 't', + buildHatchAdder(MTEPyrolyseOven.class).atLeast(InputBus, InputHatch, Muffler) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain(onElementPass(MTEPyrolyseOven::onCasingAdded, tCasingElement))) + .build(); + } + + private int mCasingAmount; + + public MTEPyrolyseOven(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPyrolyseOven(String aName) { + super(aName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Coke Oven") + .addInfo("Controller block for the Pyrolyse Oven") + .addInfo("Industrial Charcoal producer") + .addInfo("Processing speed scales linearly with Coil tier:") + .addInfo("CuNi: 50%, FeAlCr: 100%, Ni4Cr: 150%, TPV: 200%, etc.") + .addInfo("EU/t is not affected by Coil tier") + .addPollutionAmount(getPollutionPerSecond(null)) + .addSeparator() + .beginStructureBlock(5, 4, 5, true) + .addController("Front center") + .addCasingInfoRange("Pyrolyse Oven Casing", 60, 80, false) + .addOtherStructurePart("Heating Coils", "Center 3x1x3 of the bottom layer") + .addEnergyHatch("Any bottom layer casing", 1) + .addMaintenanceHatch("Any bottom layer casing", 1) + .addMufflerHatch("Center 3x1x3 area in top layer", 2) + .addInputBus("Center 3x1x3 area in top layer", 2) + .addInputHatch("Center 3x1x3 area in top layer", 2) + .addOutputBus("Any bottom layer casing", 1) + .addOutputHatch("Any bottom layer casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { BlockIcons.casingTexturePages[8][66], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { BlockIcons.casingTexturePages[8][66], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[8][66] }; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.pyrolyseRecipes; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + public CheckRecipeResult process() { + setSpeedBonus(2f / (1 + coilHeat.getTier())); + return super.process(); + } + }; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + private void onCasingAdded() { + mCasingAmount++; + } + + public HeatingCoilLevel getCoilLevel() { + return coilHeat; + } + + private void setCoilLevel(HeatingCoilLevel aCoilLevel) { + coilHeat = aCoilLevel; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + coilHeat = HeatingCoilLevel.None; + mCasingAmount = 0; + replaceDeprecatedCoils(aBaseMetaTileEntity); + return checkPiece("main", 2, 3, 0) && mCasingAmount >= 60 + && mMaintenanceHatches.size() == 1 + && !mMufflerHatches.isEmpty(); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getPollutionPerSecond(ItemStack aStack) { + return GTMod.gregtechproxy.mPollutionPyrolyseOvenPerSecond; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPyrolyseOven(this.mName); + } + + private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) { + final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; + final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; + final int tX = aBaseMetaTileEntity.getXCoord() + xDir * 2; + final int tY = aBaseMetaTileEntity.getYCoord(); + final int tZ = aBaseMetaTileEntity.getZCoord() + zDir * 2; + for (int xPos = tX - 1; xPos <= tX + 1; xPos++) { + for (int zPos = tZ - 1; zPos <= tZ + 1; zPos++) { + if (aBaseMetaTileEntity.getBlock(xPos, tY, zPos) == GregTechAPI.sBlockCasings1 + && aBaseMetaTileEntity.getMetaID(xPos, tY, zPos) == 13) { + aBaseMetaTileEntity.getWorld() + .setBlock(xPos, tY, zPos, GregTechAPI.sBlockCasings5, 1, 3); + } + } + } + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece("main", stackSize, hintsOnly, 2, 3, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 2, 3, 0, elementBudget, env, false, true); + } + + @Override + public boolean supportsVoidProtection() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTETranscendentPlasmaMixer.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTETranscendentPlasmaMixer.java new file mode 100644 index 0000000000..c6fed966ef --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTETranscendentPlasmaMixer.java @@ -0,0 +1,387 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static gregtech.api.enums.GTValues.AuthorColen; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_OFF; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_ON; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTUtility.formatNumbers; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.getUserEU; +import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings; +import static gregtech.common.tileentities.machines.multi.MTEPlasmaForge.DIM_BRIDGE_CASING; +import static gregtech.common.tileentities.machines.multi.MTEPlasmaForge.DIM_INJECTION_CASING; +import static gregtech.common.tileentities.machines.multi.MTEPlasmaForge.DIM_TRANS_CASING; +import static kekztech.util.Util.toStandardForm; +import static net.minecraft.util.EnumChatFormatting.GOLD; +import static net.minecraft.util.EnumChatFormatting.GRAY; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.drawable.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.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.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEEnhancedMultiBlockBase; +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.GTRecipe; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; + +public class MTETranscendentPlasmaMixer extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable { + + private static final String[][] structure = new String[][] { + { " CAC ", " ABA ", " ABA ", " A~A ", " ABA ", " ABA ", " CAC " }, + { "CBBBC", "A A", "A A", "A A", "A A", "A A", "CBBBC" }, + { "ABBBA", "B B", "B B", "B B", "B B", "B B", "ABBBA" }, + { "CBBBC", "A A", "A A", "A A", "A A", "A A", "CBBBC" }, + { " CAC ", " ABA ", " ABA ", " ABA ", " ABA ", " ABA ", " CAC " } }; + + private static final String STRUCTURE_PIECE_MAIN = "MAIN"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + .addElement( + 'B', + buildHatchAdder(MTETranscendentPlasmaMixer.class).atLeast(InputHatch, OutputHatch, InputBus, Maintenance) + .casingIndex(DIM_INJECTION_CASING) + .dot(1) + .buildAndChain(GregTechAPI.sBlockCasings1, DIM_INJECTION_CASING)) + .addElement('A', ofBlock(GregTechAPI.sBlockCasings1, DIM_TRANS_CASING)) + .addElement('C', ofBlock(GregTechAPI.sBlockCasings1, DIM_BRIDGE_CASING)) + .build(); + + private UUID ownerUUID; + + public MTETranscendentPlasmaMixer(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTETranscendentPlasmaMixer(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Transcendent Mixer") + .addInfo("Assisting in all your DTPF needs.") + .addInfo("This multiblock will run in parallel according to the amount set") + .addInfo("in the parallel menu. All inputs will scale, except time.") + .addInfo("All EU is deducted from wireless EU networks only.") + .addInfo(AuthorColen) + .addSeparator() + .beginStructureBlock(5, 7, 5, false) + .addStructureInfo(GOLD + "1+ " + GRAY + "Input Hatch") + .addStructureInfo(GOLD + "1+ " + GRAY + "Output Hatch") + .addStructureInfo(GOLD + "1+ " + GRAY + "Input Bus") + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTETranscendentPlasmaMixer(mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING], TextureFactory.builder() + .addIcon(OVERLAY_DTPF_ON) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FUSION1_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING], TextureFactory.builder() + .addIcon(OVERLAY_DTPF_OFF) + .extFacing() + .build() }; + } + + return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING] }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + int multiplier = 1; + BigInteger finalConsumption = BigInteger.ZERO; + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.transcendentPlasmaMixerRecipes; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + BigInteger recipeEU; + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + BigInteger availableEU = getUserEU(ownerUUID); + recipeEU = BigInteger.valueOf(10L * recipe.mEUt * recipe.mDuration); + if (availableEU.compareTo(recipeEU) < 0) { + finalConsumption = BigInteger.ZERO; + return CheckRecipeResultRegistry.insufficientStartupPower(recipeEU); + } + maxParallel = availableEU.divide(recipeEU) + .min(BigInteger.valueOf(maxParallel)) + .intValue(); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @NotNull + @Override + protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) { + finalConsumption = recipeEU.multiply(BigInteger.valueOf(-calculatedParallels)); + // This will void the inputs if wireless energy has dropped + // below the required amount between validateRecipe and here. + if (!addEUToGlobalEnergyMap(ownerUUID, finalConsumption)) { + return CheckRecipeResultRegistry.insufficientStartupPower(finalConsumption); + } + // Energy consumed all at once from wireless net. + setCalculatedEut(0); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Nonnull + @Override + protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + return OverclockCalculator.ofNoOverclock(recipe); + } + }.setMaxParallelSupplier(() -> multiplier); + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + // The voltage is only used for recipe finding + logic.setAvailableVoltage(Long.MAX_VALUE); + logic.setAvailableAmperage(1); + logic.setAmperageOC(false); + } + + private static final int HORIZONTAL_OFFSET = 2; + private static final int VERTICAL_OFFSET = 3; + private static final int DEPTH_OFFSET = 0; + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, HORIZONTAL_OFFSET, VERTICAL_OFFSET, DEPTH_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + return survivialBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + HORIZONTAL_OFFSET, + VERTICAL_OFFSET, + DEPTH_OFFSET, + elementBudget, + env, + false, + true); + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + + // Check the main structure + if (!checkPiece(STRUCTURE_PIECE_MAIN, HORIZONTAL_OFFSET, VERTICAL_OFFSET, DEPTH_OFFSET)) { + return false; + } + + // Maintenance hatch not required but left for compatibility. + // Don't allow more than 1, no free casing spam! + return (mMaintenanceHatches.size() <= 1); + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 0; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + + super.onPreTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide() && (aTick == 1)) { + // Adds player to the wireless network if they do not already exist on it. + ownerUUID = processInitialSettings(aBaseMetaTileEntity); + } + } + + private static final int PARALLEL_WINDOW_ID = 10; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + buildContext.addSyncedWindow(PARALLEL_WINDOW_ID, this::createParallelWindow); + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(PARALLEL_WINDOW_ID); + } + }) + .setPlayClickSound(true) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(GTUITextures.BUTTON_STANDARD); + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_ON); + return ret.toArray(new IDrawable[0]); + }) + .addTooltip(translateToLocal("GT5U.tpm.parallelwindow")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 112) + .setSize(16, 16)); + super.addUIWidgets(builder, buildContext); + } + + protected ModularWindow createParallelWindow(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(GTUITextures.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("GTPP.CC.parallel") + .setPos(3, 4) + .setSize(150, 20)) + .widget( + new NumericWidget().setSetter(val -> multiplier = (int) val) + .setGetter(() -> multiplier) + .setBounds(1, Integer.MAX_VALUE) + .setDefaultValue(1) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(150, 18) + .setPos(4, 25) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> multiplier, (val) -> multiplier = val), + builder)); + return builder.build(); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("eMultiplier", multiplier); + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + multiplier = aNBT.getInteger("eMultiplier"); + super.loadNBTData(aNBT); + } + + @Override + public String[] getInfoData() { + return new String[] { + StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": " + + EnumChatFormatting.GREEN + + formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + StatCollector.translateToLocal("GT5U.multiblock.usage") + ": " + + EnumChatFormatting.RED + + (mMaxProgresstime == 0 ? "0" + : toStandardForm(finalConsumption.divide(BigInteger.valueOf(-mMaxProgresstime)))) + + EnumChatFormatting.RESET + + " EU/t" }; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean getDefaultHasMaintenanceChecks() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEVacuumFreezer.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEVacuumFreezer.java new file mode 100644 index 0000000000..c2879e0ab7 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEVacuumFreezer.java @@ -0,0 +1,162 @@ +package gregtech.common.tileentities.machines.multi; + +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.structure.StructureUtility; + +import gregtech.api.GregTechAPI; +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.MTECubicMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEVacuumFreezer extends MTECubicMultiBlockBase { + + public MTEVacuumFreezer(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEVacuumFreezer(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEVacuumFreezer(this.mName); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Vacuum Freezer") + .addInfo("Controller Block for the Vacuum Freezer") + .addInfo("Cools hot ingots and cells") + .addSeparator() + .beginStructureBlock(3, 3, 3, true) + .addController("Front center") + .addCasingInfoRange("Frost Proof Machine Casing", 16, 24, false) + .addEnergyHatch("Any casing", 1) + .addMaintenanceHatch("Any casing", 1) + .addInputHatch("Any casing", 1) + .addOutputHatch("Any casing", 1) + .addInputBus("Any casing", 1) + .addOutputBus("Any casing", 1) + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { casingTexturePages[0][17], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { casingTexturePages[0][17], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_VACUUM_FREEZER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { casingTexturePages[0][17] }; + } + return rTexture; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.vacuumFreezerRecipes; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic(); + } + + @Override + protected IStructureElement> getCasingElement() { + return StructureUtility.ofBlock(GregTechAPI.sBlockCasings2, 1); + } + + @Override + protected List>> getAllowedHatches() { + return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy); + } + + @Override + protected int getHatchTextureIndex() { + return 17; + } + + @Override + protected int getRequiredCasingCount() { + return 16; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEWormholeGenerator.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEWormholeGenerator.java new file mode 100644 index 0000000000..12153fc10e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEWormholeGenerator.java @@ -0,0 +1,1118 @@ +package gregtech.common.tileentities.machines.multi; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel; +import static goodgenerator.util.DescTextLocalization.BLUE_PRINT_INFO; +import static gregtech.api.enums.GTValues.V; +import static gregtech.api.enums.GTValues.VN; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.init.Blocks; +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.google.common.collect.MapMaker; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import appeng.api.AEApi; +import bartworks.API.BorosilicateGlass; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.TierEU; +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.interfaces.tileentity.IHasWorldObjectAndCoords; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.ResultMissingItem; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.IGTHatchAdder; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.tileentities.render.TileEntityWormhole; +import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; +import tectech.thing.casing.BlockGTCasingsTT; +import tectech.thing.casing.TTCasingsContainer; +import tectech.thing.metaTileEntity.hatch.MTEHatchDynamoMulti; +import tectech.thing.metaTileEntity.hatch.MTEHatchEnergyMulti; + +public class MTEWormholeGenerator extends MTEEnhancedMultiBlockBase + implements ISurvivalConstructable { + + /** + * Number of seconds to average the wormhole energy over. + */ + public static int WH_ENERGY_AVG_WINDOW = 90; + + /** + * The amount of EU received per EU sent. + */ + public static double TRANSFER_EFFICIENCY = (1.0 - 0.00_0004 * 64); + + /** + * The amount of EU to lose every second the wormhole decays. + */ + public static double DECAY_RATE = 0.25; + + /** + * The amount of EU that the wormhole collapses at. + */ + public static double COLLAPSE_THRESHOLD = 32; + + /** + * The wormhole render radius percent of the max size when specified wormhole power is reached (purely aesthetical) + */ + public static double RENDER_PERCENT_TARGET = .1; + + /** + * Wormhole energy to specify reach the specified size percentage (purely aesthetical) + */ + public static double RENDER_TARGET_ENERGY = TierEU.IV * 256; + + /** + * Maximum wormhole radius (purely aesthetical) + */ + public static double RENDER_MAX_RADIUS = 2.999 / Math.sqrt(3); + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final byte GLASS_TIER_UNSET = -2; + + private static final int TT_CASING_INDEX = BlockGTCasingsTT.textureOffset; + + private static final int TOP_HATCH = 0, BOTTOM_HATCH = 1, LEFT_HATCH = 2, RIGHT_HATCH = 3, BACK_HATCH = 4, + FRONT_HATCH = 5, MAX_HATCHES = 6; + + private static final int[] OPPOSITES = { BOTTOM_HATCH, TOP_HATCH, RIGHT_HATCH, LEFT_HATCH, FRONT_HATCH, + BACK_HATCH, }; + + private static final String[] HATCH_NAMES = { "Top", "Bottom", "Left", "Right", "Back", "Front" }; + private static final boolean[] HATCH_MASK = { true, true, true, true, false, false }; + + private byte mGlassTier = -2; + private boolean mStructureBadGlassTier = false; + + private final MTEHatchEnergyMulti[] mSendHatches = new MTEHatchEnergyMulti[MAX_HATCHES]; + private final MTEHatchDynamoMulti[] mReceiveHatches = new MTEHatchDynamoMulti[MAX_HATCHES]; + + private final ItemStack singularity = AEApi.instance() + .definitions() + .materials() + .singularity() + .maybeStack(1) + .get(); + private final ItemStack qeSingularity = AEApi.instance() + .definitions() + .materials() + .qESingularity() + .maybeStack(1) + .get(); + + private WormholeLink mLink; + private final WeakReference mSelfReference = new WeakReference<>(this); + + private double mWormholeEnergy_UI = 0; + + private boolean mIsUnloading = false; + + public MTEWormholeGenerator(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEWormholeGenerator(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEWormholeGenerator(mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean active, boolean redstoneLevel) { + if (side == facing) { + if (active) { + return new ITexture[] { getCasingTextureForId(TT_CASING_INDEX), TextureFactory.builder() + .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active) + .extFacing() + .build() }; + } else { + return new ITexture[] { getCasingTextureForId(TT_CASING_INDEX), TextureFactory.builder() + .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced) + .extFacing() + .build() }; + } + } + return new ITexture[] { getCasingTextureForId(TT_CASING_INDEX) }; + } + + // #region Structure + + // spotless:off + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][]{ + {" "," F "," EEE "," FEtEF "," EEE "," F "," "}, + {" F "," AADAA "," A B A ","FDBBBDF"," A B A "," AADAA "," F "}, + {" EEE "," A B A ","E E","EB BE","E E"," A B A "," EEE "}, + {" FE~EF ","FA B AF","E E","lB Br","E E","FA B AF"," FEEEF "}, + {" EEE "," A B A ","E E","EB BE","E E"," A B A "," EEE "}, + {" F "," AADAA "," A B A ","FDBBBDF"," A B A "," AADAA "," F "}, + {" "," F "," EEE "," FEbEF "," EEE "," F "," "} + })) + .addElement('E', + buildHatchAdder(MTEWormholeGenerator.class) + .atLeast(Maintenance, InputBus) + .casingIndex(TT_CASING_INDEX) // High Power Casing + .dot(1) + .buildAndChain(lazy(() -> ofBlock(TTCasingsContainer.sBlockCasingsTT, 0))) // High Power Casing + ) + .addElement( + 'A', + withChannel( + "glass", + BorosilicateGlass.ofBoroGlass(GLASS_TIER_UNSET, (te, t) -> te.mGlassTier = t, te -> te.mGlassTier)) + ) + .addElement('D', ofBlock(GregTechAPI.sBlockCasings8, 5)) // Europium Reinforced Radiation Proof Machine Casing + .addElement('B', ofBlock(GregTechAPI.sBlockCasings4, 7)) // Fusion Coil Block + .addElement('F', lazy(() -> ofBlock(TTCasingsContainer.sBlockCasingsTT, 4))) // Molecular Casing + .addElement('t', + buildHatchAdder(MTEWormholeGenerator.class) + .anyOf(new TransferHatch(TOP_HATCH)) + .casingIndex(TT_CASING_INDEX) // High Power Casing + .dot(2) + .buildAndChain(lazy(() -> ofBlock(TTCasingsContainer.sBlockCasingsTT, 0))) // High Power Casing + ) + .addElement('b', + buildHatchAdder(MTEWormholeGenerator.class) + .anyOf(new TransferHatch(BOTTOM_HATCH)) + .casingIndex(TT_CASING_INDEX) // High Power Casing + .dot(2) + .buildAndChain(lazy(() -> ofBlock(TTCasingsContainer.sBlockCasingsTT, 0))) // High Power Casing + ) + .addElement('l', + buildHatchAdder(MTEWormholeGenerator.class) + .anyOf(new TransferHatch(LEFT_HATCH)) + .casingIndex(TT_CASING_INDEX) // High Power Casing + .dot(2) + .buildAndChain(lazy(() -> ofBlock(TTCasingsContainer.sBlockCasingsTT, 0))) // High Power Casing + ) + .addElement('r', + buildHatchAdder(MTEWormholeGenerator.class) + .anyOf(new TransferHatch(RIGHT_HATCH)) + .casingIndex(TT_CASING_INDEX) // High Power Casing + .dot(2) + .buildAndChain(lazy(() -> ofBlock(TTCasingsContainer.sBlockCasingsTT, 0))) // High Power Casing + ) + .build(); + // spotless:on + + private static class TransferHatch implements IHatchElement { + + public final int mIndex; + + public TransferHatch(int index) { + this.mIndex = index; + } + + @Override + public List> mteClasses() { + return Arrays.asList(MTEHatchEnergyMulti.class, MTEHatchDynamoMulti.class); + } + + @Override + public IGTHatchAdder adder() { + return (tile, aTileEntity, aBaseCasingIndex) -> { + if (aTileEntity == null) return false; + + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + + if (aMetaTileEntity == null) return false; + + if (aMetaTileEntity instanceof MTEHatchEnergyMulti input) { + input.updateTexture(aBaseCasingIndex); + input.updateCraftingIcon(tile.getMachineCraftingIcon()); + tile.mSendHatches[mIndex] = input; + return true; + } else if (aMetaTileEntity instanceof MTEHatchDynamoMulti output) { + output.updateTexture(aBaseCasingIndex); + output.updateCraftingIcon(tile.getMachineCraftingIcon()); + tile.mReceiveHatches[mIndex] = output; + return true; + } + + return false; + }; + } + + @Override + public String name() { + return "TransferHatch"; + } + + @Override + public long count(MTEWormholeGenerator t) { + return t.mExoticEnergyHatches.size(); + } + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected SoundResource getProcessStartSound() { + return SoundResource.GT_MACHINES_FUSION_LOOP; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 3, 0)) return false; + + mStructureBadGlassTier = false; + + for (var energyHatch : mExoticEnergyHatches) { + if (energyHatch.getBaseMetaTileEntity() == null) { + continue; + } + + if (energyHatch.getTierForStructure() > mGlassTier) { + mStructureBadGlassTier = true; + } + } + + return !mStructureBadGlassTier; + } + + @Override + public void clearHatches() { + super.clearHatches(); + + Arrays.fill(mSendHatches, null); + Arrays.fill(mReceiveHatches, null); + } + + @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 int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + // #endregion + @Override + public void onBlockDestroyed() { + super.onBlockDestroyed(); + destroyRenderBlock(); + } + + @Override + public void onDisableWorking() { + super.onDisableWorking(); + // destroyRenderBlock(); + } + + @Override + public void onStructureChange() { + super.onStructureChange(); + if (!checkStructure(false, this.getBaseMetaTileEntity())) { + destroyRenderBlock(); + } + } + + private void destroyRenderBlock() { + IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); + if (gregTechTileEntity.getWorld() == null) { + return; + } + + int x = gregTechTileEntity.getXCoord(); + int y = gregTechTileEntity.getYCoord(); + int z = gregTechTileEntity.getZCoord(); + + int xOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX; + int yOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetY; + int zOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + + int xTarget = x + xOffset; + int yTarget = y + yOffset; + int zTarget = z + zOffset; + + Optional.of(gregTechTileEntity) + .map(IHasWorldObjectAndCoords::getWorld) + .ifPresent(w -> w.setBlock(xTarget, yTarget, zTarget, Blocks.air)); + } + + @Nullable + private TileEntityWormhole createRenderBlock() { + + IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); + World world = gregTechTileEntity.getWorld(); + + if (world == null) { + return null; + } + + int x = gregTechTileEntity.getXCoord(); + int y = gregTechTileEntity.getYCoord(); + int z = gregTechTileEntity.getZCoord(); + + int xOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX; + int yOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetY; + int zOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + + int xTarget = x + xOffset; + int yTarget = y + yOffset; + int zTarget = z + zOffset; + + world.setBlock(xTarget, yTarget, zTarget, Blocks.air); + world.setBlock(xTarget, yTarget, zTarget, GregTechAPI.sWormholeRender); + + TileEntityWormhole wormhole = (TileEntityWormhole) world.getTileEntity(xTarget, yTarget, zTarget); + + if (wormhole == null) { + return null; + } + return wormhole; + } + + @Nullable + private TileEntityWormhole getRenderBlock() { + IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); + + int x = gregTechTileEntity.getXCoord(); + int y = gregTechTileEntity.getYCoord(); + int z = gregTechTileEntity.getZCoord(); + + double xOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX; + double zOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + double yOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetY; + + int wX = (int) (x + xOffset); + int wY = (int) (y + yOffset); + int wZ = (int) (z + zOffset); + + TileEntity tile = Optional.ofNullable(gregTechTileEntity.getWorld()) + .map(w -> w.getTileEntity(wX, wY, wZ)) + .orElse(null); + if (tile instanceof TileEntityWormhole wormhole) return wormhole; + return null; + + } + + public void updateRenderDim() { + TileEntityWormhole temp = getRenderBlock(); + + World target = Optional.ofNullable(mLink) + .map(link -> link.getDest(mSelfReference)) + .map(MetaTileEntity::getBaseMetaTileEntity) + .map(IHasWorldObjectAndCoords::getWorld) + .orElse(null); + + TileEntityWormhole hole = getRenderBlock(); + if (hole == null) hole = createRenderBlock(); + + if (hole != null) { + hole.setDimFromWorld(target); + } + } + + public void updateRenderRadius(double radius) { + TileEntityWormhole hole = getRenderBlock(); + if (hole == null) hole = createRenderBlock(); + + if (hole != null) { + hole.setRadius(radius); + } + } + + private static double wormholeRadiusCalc(double energy) { + if (energy < COLLAPSE_THRESHOLD) return 0; + + double offset = RENDER_TARGET_ENERGY + (COLLAPSE_THRESHOLD - RENDER_TARGET_ENERGY) / (RENDER_PERCENT_TARGET); + return RENDER_MAX_RADIUS * (COLLAPSE_THRESHOLD - energy) / (offset - energy); + } + + // #region Logic + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public void onUnload() { + super.onUnload(); + mIsUnloading = true; + if (mLink != null) { + mLink.disconnect(mSelfReference); + } + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + checkFrequency(); + + mMaxProgresstime = 20; + mEfficiency = Math.max(0, getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000)); + + if (doRandomMaintenanceDamage()) { + if (onRunningTick(mInventory[1])) { + markDirty(); + + if (++mProgresstime >= mMaxProgresstime) { + mProgresstime = 0; + + if (mLink != null) { + mLink.update(mSelfReference); + } + checkRecipe(); + } + } + } + } + + @Override + @Nonnull + public CheckRecipeResult checkProcessing() { + if (mLink == null || !mLink.isConnected(mSelfReference) + || getBaseMetaTileEntity() == null + || !getBaseMetaTileEntity().isAllowedToWork()) { + return SimpleCheckRecipeResult.ofFailure("none"); + } + + if (mLink.isActive()) { + for (int i = 0; i < MAX_HATCHES; i++) { + if (!HATCH_MASK[i]) continue; + long optimal = mLink.mWormholeEnergy > Long.MAX_VALUE ? Long.MAX_VALUE : ((long) mLink.mWormholeEnergy); + if (getTransferable(i) > 0) { + if (mLink.mWormholeEnergy <= 0) { + var singularityStack = singularity.copy(); + + if (!depleteInput(singularityStack)) { + return new ResultMissingItem(singularityStack); + } + mLink.mWormholeEnergy = 1; + optimal = 1; + } + transferPower(optimal, i); + } + } + } + + if (mLink.mWormholeEnergy > 0) { + return SimpleCheckRecipeResult.ofSuccess("none"); + } + return SimpleCheckRecipeResult.ofFailure("none"); + } + + private void checkFrequency() { + if (mIsUnloading) { + return; + } + + ItemStack link = null; + + for (var slot : mInventory) { + if (slot != null && qeSingularity.getItem() == slot.getItem() + && qeSingularity.getItemDamage() == slot.getItemDamage()) { + link = slot; + break; + } + } + + Long freq = link != null && link.getTagCompound() != null + && link.getTagCompound() + .hasKey("freq", 4 /* Long */) ? link.getTagCompound() + .getLong("freq") : null; + + if (!Objects.equals(freq, mLink == null ? null : mLink.mFrequency)) { + if (mLink != null) { + mLink.disconnect(mSelfReference); + mLink = null; + } + + if (freq != null) { + mLink = WormholeLink.get(freq); + mLink.connect(mSelfReference); + } + } + } + + private long getTransferable(int index) { + var dest = mLink.getDest(mSelfReference); + + if (dest == null || mMaxProgresstime == 0 || dest.mMaxProgresstime == 0) { + return 0; + } + + var inputHatch = mSendHatches[index]; + var outputHatch = dest.mReceiveHatches[OPPOSITES[index]]; + + if (inputHatch == null || outputHatch == null) { + return 0; + } + + long available = inputHatch.getEUVar(); + long empty = outputHatch.maxEUStore() - outputHatch.getEUVar(); + + return Math.min(available, empty); + } + + private void transferPower(long optimal, int index) { + var dest = mLink.getDest(mSelfReference); + if (dest == null) { + return; + } + + var inputHatch = mSendHatches[index]; + var outputHatch = dest.mReceiveHatches[OPPOSITES[index]]; + + if (inputHatch == null || outputHatch == null) { + return; + } + + long available = inputHatch.getEUVar(); + long empty = outputHatch.maxEUStore() - outputHatch.getEUVar(); + long maxSend = inputHatch.maxAmperesIn() * V[inputHatch.mTier] * 20; + long maxReceive = outputHatch.maxAmperesOut() * V[outputHatch.mTier] * 20; + + // spotless:off + long toSend = (long)(Math.min(Math.min(Math.min(available, empty), maxSend), maxReceive) * (1.0 - (getIdealStatus() - getRepairStatus()) * 0.1)); + + double overclocks = Math.max(Math.log((double)toSend / (double)optimal) / Math.log(4.0), 0.0); + + long toReceive = (long) ( + toSend * + (1.0 / Math.pow(4.0, overclocks)) * + Math.pow(2.0, overclocks) * + (1.0 - (dest.getIdealStatus() - dest.getRepairStatus()) * 0.1) * + TRANSFER_EFFICIENCY + ); + // spotless:on + + inputHatch.setEUVar(inputHatch.getEUVar() - toSend); + outputHatch.setEUVar(outputHatch.getEUVar() + toReceive); + + double size = wormholeRadiusCalc((double) optimal / 20); + this.updateRenderRadius(size); + dest.updateRenderRadius(size); + + mLink.onEnergyTransferred(toSend); + mLink.mSendAmounts[index] += toSend; + mLink.mReceiveAmounts[OPPOSITES[index]] += toReceive; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + + try { + if (mLink != null) { + mLink.tryPromote(); + + NBTTagCompound link = new NBTTagCompound(); + + link.setLong("mFrequency", mLink.mFrequency); + link.setDouble("mWormholeEnergy", mLink.mWormholeEnergy); + + if (mLink.isMaster(mSelfReference)) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + + dos.writeInt(mLink.mReceiveAmounts.length); + for (var x : mLink.mReceiveAmounts) { + dos.writeLong(x); + } + + dos.writeInt(mLink.mSendAmounts.length); + for (var x : mLink.mSendAmounts) { + dos.writeLong(x); + } + + link.setByteArray("data", baos.toByteArray()); + } + + aNBT.setTag("mLink", link); + } + } catch (Throwable t) { + GTMod.GT_FML_LOGGER.error("Could not save GT_MetaTileEntity_WormholeGenerator", t); + } + + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + + checkFrequency(); + + if (aNBT.hasKey("mLink") && mLink != null) { + NBTTagCompound link = aNBT.getCompoundTag("mLink"); + + long freq = link.getLong("mFrequency"); + + try { + if (freq == mLink.mFrequency && mLink.isMaster(mSelfReference)) { + mLink.mWormholeEnergy = link.getDouble("mWormholeEnergy"); + + ByteArrayInputStream bais = new ByteArrayInputStream(link.getByteArray("data")); + DataInputStream dis = new DataInputStream(bais); + + long[] recv_amounts = new long[dis.readInt()]; + for (int i = 0; i < recv_amounts.length; i++) { + recv_amounts[i] = dis.readLong(); + } + + System.arraycopy( + recv_amounts, + 0, + mLink.mReceiveAmounts, + 0, + Math.min(recv_amounts.length, mLink.mReceiveAmounts.length)); + + long[] send_amounts = new long[dis.readInt()]; + for (int i = 0; i < send_amounts.length; i++) { + send_amounts[i] = dis.readLong(); + } + + System.arraycopy( + send_amounts, + 0, + mLink.mSendAmounts, + 0, + Math.min(send_amounts.length, mLink.mSendAmounts.length)); + } + } catch (Throwable t) { + GTMod.GT_FML_LOGGER.error("Could not load GT_MetaTileEntity_WormholeGenerator", t); + } + } + } + + private static class WormholeLink { + + private final static Map WORMHOLE_GENERATORS = new MapMaker().weakValues() + .makeMap(); + + public final long mFrequency; + + public WeakReference mMaster, mSlave; + + public final long[] mSendAmounts = new long[MAX_HATCHES]; + public final long[] mReceiveAmounts = new long[MAX_HATCHES]; + + public double mWormholeEnergy; + private double mPendingEnergy; + + private WormholeLink(long frequency) { + mFrequency = frequency; + } + + public static WormholeLink get(long frequency) { + return WORMHOLE_GENERATORS.computeIfAbsent(frequency, WormholeLink::new); + } + + public void update(WeakReference updater) { + tryPromote(); + + if (isMaster(updater)) { + if (isActive() && mPendingEnergy > 0) { + var delta = mPendingEnergy / WH_ENERGY_AVG_WINDOW; + + if (mPendingEnergy < mWormholeEnergy) { + // if the wormhole is shrinking and the next tick would take it below the pending energy, just + // use the pending energy + if (mWormholeEnergy - delta < mPendingEnergy) { + mWormholeEnergy = mPendingEnergy; + } else { + mWormholeEnergy -= delta; + } + } else if (mPendingEnergy > mWormholeEnergy) { + // if the wormhole is growing and the next tick would take it above the pending energy, just use + // the pending energy + if (mWormholeEnergy + delta > mPendingEnergy) { + mWormholeEnergy = mPendingEnergy; + } else { + mWormholeEnergy += delta; + } + } + + mPendingEnergy = 0; + } else { + mWormholeEnergy *= (1.0 - DECAY_RATE); + + if (mWormholeEnergy < COLLAPSE_THRESHOLD) { + mWormholeEnergy = 0; + + } + } + Arrays.fill(mSendAmounts, 0); + Arrays.fill(mReceiveAmounts, 0); + } + } + + public void onEnergyTransferred(long amount) { + mPendingEnergy += amount; + } + + public boolean isMaster(WeakReference tile) { + return mMaster == tile; + } + + public boolean isConnected(WeakReference tile) { + return mMaster == tile || mSlave == tile; + } + + public boolean isFormed() { + return mMaster != null && mSlave != null; + } + + public boolean connect(WeakReference tile) { + tryPromote(); + + if (mMaster == null) { + mMaster = tile; + Optional.ofNullable(mMaster) + .map(Reference::get) + .ifPresent(MTEWormholeGenerator::updateRenderDim); + + Optional.ofNullable(mSlave) + .map(Reference::get) + .ifPresent(MTEWormholeGenerator::updateRenderDim); + return true; + } + if (mSlave == null) { + mSlave = tile; + + Optional.of(mMaster) + .map(Reference::get) + .ifPresent(MTEWormholeGenerator::updateRenderDim); + + Optional.ofNullable(mSlave) + .map(Reference::get) + .ifPresent(MTEWormholeGenerator::updateRenderDim); + + return true; + } + + return false; + } + + public void disconnect(WeakReference tile) { + Objects.requireNonNull(tile.get()) + .destroyRenderBlock(); + + if (tile == mMaster) mMaster = null; + if (tile == mSlave) mSlave = null; + + tryPromote(); + + if (mMaster == null && mSlave == null) { + WORMHOLE_GENERATORS.remove(mFrequency, this); + } + } + + public void tryPromote() { + mMaster = tryClean(mMaster); + mSlave = tryClean(mSlave); + + if (mMaster == null && mSlave != null) { + mMaster = mSlave; + mSlave = null; + } + } + + private static WeakReference tryClean(WeakReference tileReference) { + if (tileReference != null) { + var tile = tileReference.get(); + + if (tile == null) { + return null; + } else { + var base = tile.getBaseMetaTileEntity(); + + if (base == null || base.isDead()) { + return null; + } + } + } + + return tileReference; + } + + public MTEWormholeGenerator getDest(WeakReference tile) { + if (tile == mMaster) { + return mSlave != null ? mSlave.get() : null; + } + + if (tile == mSlave) { + return mMaster != null ? mMaster.get() : null; + } + + return null; + } + + public boolean isActive() { + boolean masterCanWork = Optional.ofNullable(mMaster) + .map(WeakReference::get) + .map(MTEWormholeGenerator::getBaseMetaTileEntity) + .map(IGregTechTileEntity::isAllowedToWork) + .orElse(false); + + boolean slaveCanWork = Optional.ofNullable(mSlave) + .map(WeakReference::get) + .map(MTEWormholeGenerator::getBaseMetaTileEntity) + .map(IGregTechTileEntity::isAllowedToWork) + .orElse(false); + + return masterCanWork && slaveCanWork; + } + } + + // #endregion + + // #region UI + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + + // spotless:off + tt.addMachineType("Wormhole Generator") + .addInfo("Controller for the Miniature Wormhole Generator.") + .addInfo("Transfers EU between two wormhole generators.") + .addInfo("Wormholes are linked by placing an AE2 Entangled Singularity in each controller slot.") + .addInfo("The transfer rate is limited by the wormhole size, and the wormhole size is governed by the transfer rate.") + .addInfo("If the transfer rate is completely stable, the transfer efficiency is " + String.format("%.3f", TRANSFER_EFFICIENCY * 100.0) + "%.") + .addInfo("EU will only be transferred if there is space in the laser source hatch.") + .addInfo("Each laser target must have a laser source on the §oother§7 controller, on the §oopposite§7 side.") + .addInfo("Consumes an AE2 Singularity from an input bus each time the wormhole is kick-started.") + .addInfo("The structure is too complex!") + .addInfo(BLUE_PRINT_INFO) + .beginStructureBlock(7, 9, 7, false) + .addSeparator() + .addCasingInfoExactly("Molecular Casing", 2 * 12, false) + .addCasingInfoExactly("Europium Reinforced Radiation Proof Machine Casing", 4, false) + .addCasingInfoExactly("Fusion Coil Block", 3 * 4 + 5 * 2, false) + .addCasingInfoRange("High Power Casing", 8 * 6 + 1, 8 * 6 + 1 + 4, false) + .addCasingInfoExactly("Borosilicate Glass (any)", 9 * 4, true) + .addMaintenanceHatch("§61§r (dot 1)") + .addInputBus("§61§r (dot 1)") + .addDynamoHatch("§60§r - §64§r (laser only, dot 2)") + .addEnergyHatch("§60§r - §64§r (laser only, dot 2)") + .addStructureInfo("§rThe glass tier limits the hatch tier.") + .addSubChannelUsage("glass", "Borosilicate Glass Tier") + .toolTipFinisher("Gregtech"); + // spotless:on + + return tt; + } + + @Override + public String[] getInfoData() { + List data = new ArrayList<>(); + + data.addAll(Arrays.asList(super.getInfoData())); + + data.add("-----------------------"); + data.add("Wormhole Generator Info"); + + if (mStructureBadGlassTier) { + data.add(String.format("§cStructure errors:§r")); + + if (mStructureBadGlassTier) { + data.add(String.format("§cGlass tier must be greater than or equal to the energy hatch tiers.§r")); + } + } + + if (mLink == null) { + data.add("An entangled singularity must be present in the controller slot"); + } else { + if (!mLink.isFormed()) { + data.add("Wormhole status: §cNo destination§f"); + } else { + if (mLink.mWormholeEnergy > 0) { + if (mLink.isActive()) { + data.add("Wormhole status: §bActive§f"); + } else { + data.add("Wormhole status: §6Decaying§f"); + } + } else { + boolean anyTransferable = false; + + for (int i = 0; i < MAX_HATCHES; i++) { + if (!HATCH_MASK[i]) continue; + + if (getTransferable(i) > 0) { + anyTransferable = true; + break; + } + } + + if (anyTransferable) { + data.add("Wormhole status: §7Inactive§f"); + } else { + data.add("Wormhole status: §7No energy in input hatches§f"); + } + } + + double radius = Math.sqrt(mLink.mWormholeEnergy / 20.0 / 32.0); + data.add(String.format("Wormhole diameter: §b%,d§r ångström", (long) (radius * 2))); + + data.add(String.format("Optimal transfer speed: §b%,.0f§r EU/t", mLink.mWormholeEnergy / 20)); + } + } + + for (int i = 0; i < MAX_HATCHES; i++) { + if (!HATCH_MASK[i]) continue; + + var inputHatch = mSendHatches[i]; + var outputHatch = mReceiveHatches[i]; + + // spotless:off + if(inputHatch != null) { + data.add(String.format( + "%s hatch (%,dA/t %s) transferred §b%,d§f EU (equivalent to %,dA/t) with an efficiency of %.3f%% in the last second", + HATCH_NAMES[i], + inputHatch.Amperes, + VN[inputHatch.mTier], + mLink != null ? mLink.mSendAmounts[i] : 0, + mLink != null ? mLink.mSendAmounts[i] / 20 / V[inputHatch.mTier] : 0, + mLink != null && mLink.mSendAmounts[i] > 0 ? ((double)mLink.mReceiveAmounts[OPPOSITES[i]]) / ((double)mLink.mSendAmounts[i]) * 100 : 0 + )); + } else if(outputHatch != null) { + data.add(String.format( + "%s hatch (%,dA/t %s) received §b%,d§f EU (equivalent to %,dA/t) with an efficiency of %.3f%% in the last second", + HATCH_NAMES[i], + outputHatch.Amperes, + VN[outputHatch.mTier], + mLink != null ? mLink.mReceiveAmounts[i] : 0, + mLink != null ? mLink.mReceiveAmounts[i] / 20 / V[outputHatch.mTier] : 0, + mLink != null && mLink.mSendAmounts[OPPOSITES[i]] > 0 ? ((double)mLink.mReceiveAmounts[i]) / ((double)mLink.mSendAmounts[OPPOSITES[i]]) * 100 : 0 + )); + } else { + data.add(String.format("%s hatch is not present", HATCH_NAMES[i])); + } + // spotless:on + } + + data.add("-----------------------"); + + return data.toArray(new String[data.size()]); + } + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + super.drawTexts(screenElements, inventorySlot); + + screenElements.widgets(TextWidget.dynamicString(() -> { + if (mLink == null) { + return String.format("§7Missing Entangled Singularity§f"); + } + + if (!mLink.isFormed()) { + return String.format("§7Wormhole status: §cNo destination§f"); + } + + if (mLink.mWormholeEnergy > 0 && !mLink.isActive()) { + return String.format("§7Wormhole status: §6Decaying§f"); + } + + if (mLink.mWormholeEnergy > 0) { + return String.format("§7Wormhole status: §bActive§f"); + } + + return String.format("§7Wormhole status: Inactive§f"); + }), + + TextWidget.dynamicString(() -> { + if (mLink == null) { + return ""; + } + + // LV power = 1 angstrom in diameter + double radius = Math.sqrt(mLink.mWormholeEnergy / 20.0 / 32.0); + + return String.format("§7Wormhole diameter: §b%,d§7 ŧf", (long) (radius * 2)); + }) + .setEnabled(w -> mWormholeEnergy_UI > 0), + + TextWidget.dynamicString(() -> { + if (mLink == null) { + return ""; + } + + if (mLink.mWormholeEnergy >= 1e10) { + return String.format("§7Max I/O per hatch: §b%3.3e§7 EU/t§f", mLink.mWormholeEnergy / 20); + } else { + return String.format("§7Max I/O per hatch: §b%,d§7 EU/t§f", (long) (mLink.mWormholeEnergy / 20)); + } + }) + .setEnabled(w -> mWormholeEnergy_UI > 0), + + new FakeSyncWidget.DoubleSyncer( + () -> mLink != null ? mLink.mWormholeEnergy : 0, + val -> mWormholeEnergy_UI = val)); + } + + // #endregion + +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_BlackHoleCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_BlackHoleCompressor.java deleted file mode 100644 index 0b36d35cf8..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_BlackHoleCompressor.java +++ /dev/null @@ -1,539 +0,0 @@ -package gregtech.common.tileentities.machines.multi.compressor; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.GT_HatchElement.*; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.GT_Values.Ollie; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.stream.Stream; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -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.MaterialsUEVplus; -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_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -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.metadata.CompressionTierKey; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Casings10; -import gregtech.common.items.GT_MetaGenerated_Item_01; -import gtPlusPlus.core.util.minecraft.PlayerUtils; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_BlackHoleCompressor - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - // spotless:off - transpose(new String[][]{ - {" "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCCC CCCCC "," CCCC CCCC "," "," "," "," CCCC CCCC "," CCCCC CCCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "}, - {" "," "," "," "," "," "," "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCC CCCC "," CCCCC CCCCC "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," "," "," "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," CCCCC CCCCC "," CCCC CCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," "," "," "," "," "," "," "}, - {" "," "," "," "," "," "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCB BCCCCCCC "," CCCCCCB BBB BCCCCCC "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," CCCCCCB BBB BCCCCCC "," CCCCCCCB BCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," "," "," "," "," "," "}, - {" "," "," "," "," "," CC CC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCBCCCCCBCCCCCCB "," CCCCCCCCBCCCCCCCBCCCCCCCC "," CCCCCCCBCCCCCCCCCBCCCCCCC "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," CCCCCCCBCCCCCCCCCBCCCCCCC "," CCCCCCCCBCCCCCCCBCCCCCCCC "," BCCCCCCBCCCCCBCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CC CC "," "," "," "," "," "}, - {" "," "," "," "," CC CC "," CCDDDCC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCCCB BCCCCCCCCC "," CCCCCCCCB BCCCCCCCC "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," CCCCCCCCB BCCCCCCCC "," CCCCCCCCCB BCCCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CCDDDCC "," CC CC "," "," "," "," "}, - {" "," "," "," CC CC "," CC CC "," CC CC "," "," "," "," BB BB "," BBBB CCCCC BBBB "," BBBBCC CCBBBB "," BBC CBB "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," BBC CBB "," BBBBCC CCBBBB "," BBBB CCCCC BBBB "," BB BB "," "," "," "," CC CC "," CC CC "," CC CC "," "," "," "}, - {" "," "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," BBB CCCCC BBB "," BBCC CCBB "," BC CB "," CC C C CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC C C CC "," BC CB "," BBCC CCBB "," BBB CCCCC BBB "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "," "}, - {" "," "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," BBBCCCCCBBB "," BBC CBB "," CCC BC CB CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC BC CB CCC "," BBC CBB "," BBBCCCCCBBB "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," "," "}, - {" "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," "," "," "," BBCCCCCBB "," CC BC CB CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC BC CB CC "," BBCCCCCBB "," "," "," "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "}, - {" "," "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," BCCCCCB "," CC BC CB CC "," CC C C CC "," C C "," C C "," C C "," CC C C CC "," CC BC CB CC "," BCCCCCB "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "," "}, - {" "," CC CC "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC BBCCCBB CCC "," CCC BC CB CCC "," D C C D "," D C C D "," D C C D "," CCC BC CB CCC "," CCC BBCCCBB CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," CC CC "," "}, - {" "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BCCCB CC "," CC BC CB CC "," C C "," C C "," C C "," CC BC CB CC "," CC BCCCB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "}, - {" "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BBB CC "," CC BCCCB CC "," D BCCCCCB D "," D BCCCCCB D "," D BCCCCCB D "," CC BCCCB CC "," CC BBB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," "}, - {" "," CC CC "," CCBBBCC "," CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC BBB CC "," BC B B CB "," BC B B CB "," BC B B CB "," CC BBB CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC "," CCBBBCC "," CC CC "," "}, - {" CCDDDCC "," CC CC "," CBBBBBC "," C C "," "," "," "," "," "," "," "," "," "," ","CCC CCC","CCBC CBCC","D B B D","D B B D","D B B D","CCBC CBCC","CCC CCC"," "," "," "," "," "," "," "," "," "," "," C C "," CBBBBBC "," CC CC "," CCDDDCC "}, - {" CC CC "," CCCCCCC "," BBBBBBB "," C ABA C "," ABA "," A "," A "," "," "," "," "," "," "," ","CCBC CBCC","CCB BCC"," CBAA AABC "," CBBBAA AABBBC "," CBAA AABC ","CCB BCC","CCBC CBCC"," "," "," "," "," "," "," "," A "," A "," ABA "," C ABA C "," BBBBBBB "," CCCCCCC "," CC CC "}, - {" CC CC "," CCCECCC "," BBBBBBB "," C BBB C "," BBB "," ABA "," ABA "," B "," B "," "," "," "," "," ","CCBC CBCC","CCB BCC"," CBBBAA AABBBC "," EBBBBBBB BBBBBBBE "," CBBBAA AABBBC ","CCB BCC","CCBC CBCC"," "," "," "," "," "," B "," B "," ABA "," ABA "," BBB "," C BBB C "," BBBBBBB "," CCCECCC "," CC CC "}, - {" CC CC "," CCCCCCC "," BBBBBBB "," C ABA C "," ABA "," A "," A "," "," "," "," "," "," "," ","CCBC CBCC","CCB BCC"," CBAA AABC "," CBBBAA AABBBC "," CBAA AABC ","CCB BCC","CCBC CBCC"," "," "," "," "," "," "," "," A "," A "," ABA "," C ABA C "," BBBBBBB "," CCCCCCC "," CC CC "}, - {" CCDDDCC "," CC CC "," CBBBBBC "," C C "," "," "," "," "," "," "," "," "," "," ","CCC CCC","CCBC CBCC","D B B D","D B B D","D B B D","CCBC CBCC","CCC CCC"," "," "," "," "," "," "," "," "," "," "," C C "," CBBBBBC "," CC CC "," CCDDDCC "}, - {" "," CC CC "," CCBBBCC "," CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC BBB CC "," BC B B CB "," BC B B CB "," BC B B CB "," CC BBB CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC "," CCBBBCC "," CC CC "," "}, - {" "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BBB CC "," CC BCCCB CC "," D BCCCCCB D "," D BCCCCCB D "," D BCCCCCB D "," CC BCCCB CC "," CC BBB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," "}, - {" "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BCCCB CC "," CC BC CB CC "," C C "," C C "," C C "," CC BC CB CC "," CC BCCCB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "}, - {" "," CC CC "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC BBCCCBB CCC "," CCC BC CB CCC "," D C C D "," D C C D "," D C C D "," CCC BC CB CCC "," CCC BBCCCBB CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," CC CC "," "}, - {" "," "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," BCCCCCB "," CC BC CB CC "," CC C C CC "," C C "," C C "," C C "," CC C C CC "," CC BC CB CC "," BCCCCCB "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "," "}, - {" "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," "," "," "," BBCCCCCBB "," CC BC CB CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC BC CB CC "," BBCCCCCBB "," "," "," "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "}, - {" "," "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," BBBCCCCCBBB "," BBC CBB "," CCC BC CB CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC BC CB CCC "," BBC CBB "," BBBCCCCCBBB "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," "," "}, - {" "," "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," BBB CCCCC BBB "," BBCC CCBB "," BC CB "," CC C C CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC C C CC "," BC CB "," BBCC CCBB "," BBB CCCCC BBB "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "," "}, - {" "," "," "," CC CC "," CC CC "," CC CC "," "," "," "," BB BB "," BBBB CC~CC BBBB "," BBBBCC CCBBBB "," BBC CBB "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," BBC CBB "," BBBBCC CCBBBB "," BBBB CCCCC BBBB "," BB BB "," "," "," "," CC CC "," CC CC "," CC CC "," "," "," "}, - {" "," "," "," "," CC CC "," CCDDDCC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCCCB BCCCCCCCCC "," CCCCCCCCB BCCCCCCCC "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," CCCCCCCCB BCCCCCCCC "," CCCCCCCCCB BCCCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CCDDDCC "," CC CC "," "," "," "," "}, - {" "," "," "," "," "," CC CC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCBCCCCCBCCCCCCB "," CCCCCCCCBCCCCCCCBCCCCCCCC "," CCCCCCCBCCCCCCCCCBCCCCCCC "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," CCCCCCCBCCCCCCCCCBCCCCCCC "," CCCCCCCCBCCCCCCCBCCCCCCCC "," BCCCCCCBCCCCCBCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CC CC "," "," "," "," "," "}, - {" "," "," "," "," "," "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCB BCCCCCCC "," CCCCCCB BBB BCCCCCC "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," CCCCCCB BBB BCCCCCC "," CCCCCCCB BCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," "," "," "," "," "," "}, - {" "," "," "," "," "," "," "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCC CCCC "," CCCCC CCCCC "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," "," "," "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," CCCCC CCCCC "," CCCC CCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," "," "," "," "," "," "," "}, - {" "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCCC CCCCC "," CCCC CCCC "," "," "," "," CCCC CCCC "," CCCCC CCCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "} - })) - //spotless:on - .addElement('A', ofBlock(GregTech_API.sBlockGlass1, 4)) - .addElement( - 'B', - buildHatchAdder(GT_MetaTileEntity_BlackHoleCompressor.class).atLeast(Maintenance, Energy) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(12)) - .dot(2) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_BlackHoleCompressor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 12)))) - .addElement('C', ofBlock(GregTech_API.sBlockCasings10, 11)) - .addElement('D', ofFrame(Materials.NaquadahAlloy)) - .addElement( - 'E', - buildHatchAdder(GT_MetaTileEntity_BlackHoleCompressor.class).atLeast(InputBus, OutputBus, InputHatch) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(11)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_BlackHoleCompressor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 11)))) - - .build(); - - private boolean blackholeOn = false; - private int catalyzingCounter = 0; - private float blackHoleStability = 100; - - private final FluidStack blackholeCatalyzingCost = (MaterialsUEVplus.SpaceTime).getMolten(1); - private int catalyzingCostModifier = 1; - - public GT_MetaTileEntity_BlackHoleCompressor(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_BlackHoleCompressor(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_BlackHoleCompressor(this.mName); - } - - @Override - public boolean supportsMachineModeSwitch() { - return true; - } - - @Override - public void setMachineModeIcons() { - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_COMPRESSING); - machineModeIcons.add(GT_UITextures.OVERLAY_BUTTON_MACHINEMODE_SINGULARITY); - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - setMachineMode(nextMachineMode()); - PlayerUtils.messagePlayer( - aPlayer, - String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); - } - - @Override - public String getMachineModeName() { - return StatCollector.translateToLocal("GT5U.COMPRESSION_TIER.mode." + machineMode); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 11)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 11)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 11)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Compressor/Advanced Neutronium Compressor") - .addInfo("Controller Block for the Semi-Stable Black Hole Containment Field") - .addInfo(EnumChatFormatting.LIGHT_PURPLE + "Uses the immense power of the event horizon to compress things") - .addInfo("No longer requires heat management to perform perfect compression") - .addInfo("Can create advanced singularities!") - .addSeparator() - .addInfo( - "Insert a " + EnumChatFormatting.WHITE - + "Black Hole Activation Catalyst" - + EnumChatFormatting.GRAY - + " to open a black hole") - .addInfo( - "The black hole will begin its life at " + EnumChatFormatting.RED - + "100%" - + EnumChatFormatting.GRAY - + " stability and slowly decay") - .addSeparator() - .addInfo("Natural decay takes " + EnumChatFormatting.RED + "100" + EnumChatFormatting.GRAY + " seconds") - .addInfo("Running recipes in the machine will slow the decay by " + EnumChatFormatting.RED + "25%") - .addInfo( - "The decay can be " + EnumChatFormatting.BOLD - + "halted" - + EnumChatFormatting.RESET - + EnumChatFormatting.GRAY - + " by inserting spacetime") - .addInfo( - "Every " + EnumChatFormatting.RED - + "30" - + EnumChatFormatting.GRAY - + " seconds saved by spacetime insertion will " - + EnumChatFormatting.RED - + "double" - + EnumChatFormatting.GRAY - + " the cost per second!") - .addInfo("Once the black hole becomes unstable, it will void all inputs for recipes which require it") - .addInfo( - "Insert a " + EnumChatFormatting.WHITE - + "Black Hole Deactivation Catalyst" - + EnumChatFormatting.GRAY - + " to close the black hole") - .addSeparator() - .addInfo( - "Recipes not utilizing the black hole have their lengths " + EnumChatFormatting.RED - + "doubled" - + EnumChatFormatting.GRAY - + " if it becomes unstable") - .addInfo("400% faster than singleblock machines of the same voltage when black hole is open") - .addInfo("Only uses 70% of the EU/t normally required") - .addInfo("Gains 8 parallels per voltage tier") - .addInfo( - "Parallels are " + EnumChatFormatting.RED - + "doubled" - + EnumChatFormatting.GRAY - + " when stability is BELOW " - + EnumChatFormatting.RED - + "50%") - .addInfo( - "Parallels are " + EnumChatFormatting.RED - + "quadrupled" - + EnumChatFormatting.GRAY - + " when stability is BELOW " - + EnumChatFormatting.RED - + "20%") - .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) - .addSeparator() - .beginStructureBlock(35, 33, 35, false) - .addCasingInfoMin("Background Radiation Absorbent Casing", 985, false) - .addCasingInfoExactly("Extreme Density Space-Bending Casing", 3667, false) - .addCasingInfoExactly("Hawking Radiation Realignment Focus", 64, false) - .addCasingInfoExactly("Naquadah Alloy Frame Box", 144, false) - .addInputBus("Behind Laser", 1) - .addOutputBus("Behind Laser", 1) - .addInputHatch("Behind Laser", 1) - .addEnergyHatch("Any Radiation Absorbent Casing", 2) - .addMaintenanceHatch("Any Radiation Absorbent Casing", 2) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 17, 27, 10); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 17, 27, 10, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - mEnergyHatches.clear(); - - if (!checkPiece(STRUCTURE_PIECE_MAIN, 17, 27, 10)) return false; - if (mCasingAmount < 0) return false; - - return true; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - aNBT.setInteger("catalyzingCostModifier", catalyzingCostModifier); - aNBT.setInteger("catalyzingCounter", catalyzingCounter); - aNBT.setBoolean("blackholeOn", blackholeOn); - aNBT.setFloat("blackholeStability", blackHoleStability); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (aNBT.hasKey("catalyzingCounter")) catalyzingCostModifier = aNBT.getInteger("catalyzingCounter"); - if (aNBT.hasKey("catalyzingCostModifier")) catalyzingCostModifier = aNBT.getInteger("catalyzingCostModifier"); - if (aNBT.hasKey("blackholeOn")) blackholeOn = aNBT.getBoolean("blackholeOn"); - if (aNBT.hasKey("blackholeStability")) blackHoleStability = aNBT.getFloat("blackholeStability"); - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setBoolean("blackholeOn", blackholeOn); - tag.setFloat("blackHoleStability", blackHoleStability); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - if (tag.getBoolean("blackholeOn")) { - if (tag.getFloat("blackHoleStability") > 0) { - currentTip.add(EnumChatFormatting.DARK_PURPLE + "Black Hole Active"); - currentTip.add( - EnumChatFormatting.DARK_PURPLE + " Stability: " - + EnumChatFormatting.BOLD - + Math.round(tag.getFloat("blackHoleStability")) - + "%"); - } else { - currentTip.add(EnumChatFormatting.RED + "BLACK HOLE UNSTABLE"); - } - } else currentTip.add(EnumChatFormatting.DARK_PURPLE + "Black Hole Offline"); - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @NotNull - @Override - protected Stream findRecipeMatches(@Nullable RecipeMap map) { - - // Loop through all items and look for the Activation and Deactivation Catalysts - // Deactivation resets stability to 100 and catalyzing cost to 1 - for (ItemStack inputItem : inputItems) { - if (inputItem.getItem() instanceof GT_MetaGenerated_Item_01) { - if (inputItem.getItemDamage() == 32418 && !blackholeOn) { - inputItem.stackSize -= 1; - blackholeOn = true; - break; - } else if (inputItem.getItemDamage() == 32419 && blackholeOn) { - inputItem.stackSize -= 1; - blackholeOn = false; - blackHoleStability = 100; - catalyzingCostModifier = 1; - break; - } - } - } - return super.findRecipeMatches(map); - } - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) { - - // Default speed bonus - setSpeedBonus(1F); - - // If recipe needs a black hole and one is not open, just wait - // If the recipe doesn't require black hole, incur a 0.5x speed penalty - // If recipe doesn't require black hole but one is open, give 5x speed bonus - if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) { - if (!blackholeOn) return CheckRecipeResultRegistry.NO_BLACK_HOLE; - } else { - if (blackHoleStability <= 0) setSpeedBonus(5F); - else if (blackholeOn) setSpeedBonus(0.2F); - } - return super.validateRecipe(recipe); - } - - @Nonnull - protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { - // If recipe needs a black hole and one is active but unstable, continuously void items - if (blackHoleStability <= 0 && recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) { - return CheckRecipeResultRegistry.UNSTABLE_BLACK_HOLE; - } - return CheckRecipeResultRegistry.SUCCESSFUL; - } - }.setMaxParallelSupplier(this::getMaxParallelRecipes) - .setEuModifier(0.7F); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - - if (aTick % 20 == 0) { - if (blackholeOn && blackHoleStability >= 0) { - float stabilityDecrease = 1F; - // If the machine is running, reduce stability loss by 25% - if (this.maxProgresstime() != 0) { - stabilityDecrease = 0.75F; - } - // Search all hatches for catalyst fluid - // If found enough, drain it and reduce stability loss to 0 - // Every 30 drains, double the cost - FluidStack totalCost = new FluidStack(blackholeCatalyzingCost, catalyzingCostModifier); - for (GT_MetaTileEntity_Hatch_Input hatch : mInputHatches) { - if (drain(hatch, totalCost, false)) { - drain(hatch, totalCost, true); - catalyzingCounter += 1; - stabilityDecrease = 0; - if (catalyzingCounter >= 30) { - catalyzingCostModifier *= 2; - catalyzingCounter = 0; - } - } - } - if (blackHoleStability >= 0) blackHoleStability -= stabilityDecrease; - else blackHoleStability = 0; - } - } - } - - public int getMaxParallelRecipes() { - int parallels = (8 * GT_Utility.getTier(this.getMaxInputVoltage())); - if (blackHoleStability < 60) { - parallels *= 2; - if (blackHoleStability < 20) parallels *= 2; - } - return parallels; - } - - private static final int MACHINEMODE_COMPRESSOR = 0; - private static final int MACHINEMODE_BLACKHOLE = 1; - - @Override - public RecipeMap getRecipeMap() { - return (machineMode == MACHINEMODE_COMPRESSOR) ? RecipeMaps.compressorRecipes - : RecipeMaps.neutroniumCompressorRecipes; - } - - @Nonnull - @Override - public Collection> getAvailableRecipeMaps() { - return Arrays.asList(RecipeMaps.compressorRecipes, RecipeMaps.neutroniumCompressorRecipes); - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HIPCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HIPCompressor.java deleted file mode 100644 index bb79cf692b..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HIPCompressor.java +++ /dev/null @@ -1,525 +0,0 @@ -package gregtech.common.tileentities.machines.multi.compressor; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.GT_HatchElement.*; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.GT_Values.Ollie; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofCoil; - -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.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 org.jetbrains.annotations.NotNull; - -import com.github.bartimaeusnek.bartworks.util.MathUtils; -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.HeatingCoilLevel; -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_ExtendedPowerMultiBlockBase; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.metadata.CompressionTierKey; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.IGT_HatchAdder; -import gregtech.api.util.shutdown.SimpleShutDownReason; -import gregtech.common.blocks.GT_Block_Casings10; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_HIPCompressor extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - // spotless:off - transpose(new String[][]{ - {" "," "," "," CCCCCC DDDDDD "," "," "," "}, - {" "," "," "," C C D D "," "," "," "}, - {" "," HHH "," HHHHH "," C HHHHH D "," HHHHH "," HHH "," "}, - {" BBB "," BBBBB "," BBBBBBB "," C BBBBBBB D "," BBBBBBB "," BBBBB "," BBB "}, - {" HHH "," B B "," BF FB "," C BF FB D "," BF FB "," B B "," HHH "}, - {" HAH "," B B "," GF FG "," C GF FG D "," GF FG "," B B "," HAH "}, - {" HAH "," B B "," E GF FG E ","EEE GF FG EEE"," E GF FG E "," B B "," HAH "}, - {" HAH "," B B "," A GF FG A ","A A GF FG A A"," A GF FG A "," B B "," HAH "}, - {" HHH "," B B "," A BF FB A ","A A BF FB A A"," A BF FB A "," B B "," HHH "}, - {" B~B "," BBBBB "," E BBBBBBB E ","EEE BBBBBBB EEE"," E BBBBBBB E "," BBBBB "," BBB "} - })) - //spotless:on - .addElement('A', Glasses.chainAllGlasses()) - .addElement( - 'B', - buildHatchAdder(GT_MetaTileEntity_HIPCompressor.class) - .atLeast(Maintenance, Energy, SpecialHatchElement.HeatSensor) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(4)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_HIPCompressor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 4)))) - .addElement('C', ofBlock(GregTech_API.sBlockCasings10, 9)) - .addElement('D', ofBlock(GregTech_API.sBlockCasings10, 10)) - .addElement('E', ofBlock(GregTech_API.sBlockCasings4, 1)) - .addElement( - 'F', - ofCoil(GT_MetaTileEntity_HIPCompressor::setCoilLevel, GT_MetaTileEntity_HIPCompressor::getCoilLevel)) - .addElement( - 'G', - buildHatchAdder(GT_MetaTileEntity_HIPCompressor.class).atLeast(InputBus, OutputBus) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(5)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_HIPCompressor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 5)))) - .addElement('H', ofBlock(GregTech_API.sBlockCasings10, 5)) - .build(); - - private final ArrayList sensorHatches = new ArrayList<>(); - - private HeatingCoilLevel heatLevel; - private int coilTier = 0; - - private float heat = 0; - private boolean cooling = false; - - public GT_MetaTileEntity_HIPCompressor(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_HIPCompressor(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_HIPCompressor(this.mName); - } - - @Override - public void onValueUpdate(byte aValue) { - boolean oCooling = cooling; - cooling = (aValue & 1) == 1; - if (oCooling != cooling) getBaseMetaTileEntity().issueTextureUpdate(); - } - - @Override - public byte getUpdateData() { - return (byte) (cooling ? 1 : 0); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (cooling) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 4)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING_GLOW) - .extFacing() - .glow() - .build() }; - } else if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 4)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 4)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 4)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Compressor") - .addInfo("Controller Block for the Hot Isostatic Pressurization Unit") - .addInfo("HIP Unit heats up while running") - .addInfo( - "When it reaches maximum heat, it becomes " + EnumChatFormatting.DARK_RED - + EnumChatFormatting.BOLD - + "overheated!") - .addInfo("This is only resolved by letting the machine fully cool down") - .addInfo( - "When " + EnumChatFormatting.DARK_RED - + "overheated" - + EnumChatFormatting.GRAY - + ", recipes are slowed down drastically") - .addSeparator() - .addInfo( - "Some recipes " + EnumChatFormatting.BOLD - + "require" - + EnumChatFormatting.RESET - + EnumChatFormatting.GRAY - + " HIP") - .addInfo( - "If the machine " + EnumChatFormatting.DARK_RED - + "overheats" - + EnumChatFormatting.GRAY - + " during these recipes, recipe will be voided!") - .addInfo("Read the current heat using Heat Sensor Hatches") - .addSeparator() - .addInfo("More advanced coils allow better heat control - the unit will take longer to overheat") - .addInfo( - "Unit heats by " + EnumChatFormatting.GREEN - + "(5% x 0.90 ^ (Coil Tier - 1))" - + EnumChatFormatting.GRAY - + " every second while running") - .addInfo( - "Unit cools by " + EnumChatFormatting.GREEN - + "2%" - + EnumChatFormatting.GRAY - + " every second while not running") - .addSeparator() - .addInfo( - "250% " + EnumChatFormatting.RED - + "faster" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.BLUE - + "slower" - + EnumChatFormatting.GRAY - + " than singleblock machines of the same voltage") - .addInfo( - "Uses " + EnumChatFormatting.RED - + "75%" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.BLUE - + "110%" - + EnumChatFormatting.GRAY - + " the EU/t normally required") - .addInfo( - "Gains " + EnumChatFormatting.RED - + "4" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.BLUE - + "1" - + EnumChatFormatting.GRAY - + " parallels per voltage tier") - .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) - .addSeparator() - .beginStructureBlock(7, 5, 7, true) - .addController("Front Center") - .addCasingInfoMin("Electric Compressor Casing", 95, false) - .addCasingInfoMin("Compressor Pipe Casing", 45, false) - .addCasingInfoExactly("Coolant Duct", 12, false) - .addCasingInfoExactly("Heating Duct", 12, false) - .addCasingInfoExactly("EV+ Glass", 22, false) - .addCasingInfoExactly("Clean Stainless Steel Machine Casing", 20, false) - .addCasingInfoExactly("Coil", 30, true) - .addInputBus("Pipe Casings on Side", 2) - .addOutputBus("Pipe Casings on Side", 2) - .addEnergyHatch("Any Electric Compressor Casing", 1) - .addMaintenanceHatch("Any Electric Compressor Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 7, 9, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 9, 0, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - setCoilLevel(HeatingCoilLevel.None); - mCasingAmount = 0; - return checkPiece(STRUCTURE_PIECE_MAIN, 7, 9, 0) && mCasingAmount >= 95; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setFloat("heat", heat); - aNBT.setBoolean("cooling", cooling); - aNBT.setInteger("coilTier", coilTier); - aNBT.setBoolean("doingHIP", doingHIP); - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - if (aNBT.hasKey("heat")) heat = aNBT.getFloat("heat"); - if (aNBT.hasKey("cooling")) cooling = aNBT.getBoolean("cooling"); - if (aNBT.hasKey("coilTier")) coilTier = aNBT.getInteger("coilTier"); - if (aNBT.hasKey("doingHIP")) doingHIP = aNBT.getBoolean("doingHIP"); - super.loadNBTData(aNBT); - } - - @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("heat", Math.round(heat)); - tag.setBoolean("cooling", cooling); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - if (tag.getBoolean("cooling")) currentTip.add( - "HIP Heat: " + EnumChatFormatting.RED - + EnumChatFormatting.BOLD - + tag.getInteger("heat") - + "%" - + EnumChatFormatting.RESET); - else currentTip.add( - "HIP Heat: " + EnumChatFormatting.AQUA - + EnumChatFormatting.BOLD - + tag.getInteger("heat") - + "%" - + EnumChatFormatting.RESET); - } - - private boolean doingHIP = false; - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic() { - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) { - doingHIP = false; - setSpeedBonus(1F / 1.25F); - setEuModifier(0.75F); - - if (cooling) { - setSpeedBonus(2.5F); - setEuModifier(1.1F); - } - - if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) doingHIP = true; - return super.validateRecipe(recipe); - } - }.setMaxParallelSupplier(this::getMaxParallelRecipes); - } - - @Override - public boolean onRunningTick(ItemStack aStack) { - if (cooling && doingHIP) { - stopMachine(SimpleShutDownReason.ofCritical("overheated")); - doingHIP = false; - } - return super.onRunningTick(aStack); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - - if (aTick % 20 == 0) { - - // Default to cooling by 2% - float heatMod = -2; - - // If the machine is running, heat by 5% x 0.90 ^ (Coil Tier) - // Cupronickel is 0, so base will be 5% increase - if (this.maxProgresstime() != 0) { - heatMod = (float) (5 * Math.pow(0.9, coilTier)); - } - - heat = MathUtils.clamp(heat + heatMod, 0, 100); - - if ((cooling && heat <= 0) || (!cooling && heat >= 100)) { - cooling = !cooling; - } - } - - // Update all the sensors - for (GT_MetaTileEntity_HeatSensor hatch : sensorHatches) { - hatch.updateRedstoneOutput(heat); - } - - } - - public int getMaxParallelRecipes() { - return cooling ? GT_Utility.getTier(this.getMaxInputVoltage()) - : (4 * GT_Utility.getTier(this.getMaxInputVoltage())); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.compressorRecipes; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } - - public HeatingCoilLevel getCoilLevel() { - return heatLevel; - } - - public void setCoilLevel(HeatingCoilLevel aCoilLevel) { - heatLevel = aCoilLevel; - coilTier = aCoilLevel.getTier(); - } - - public boolean addSensorHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity instanceof GT_MetaTileEntity_HeatSensor sensor) { - sensor.updateTexture(aBaseCasingIndex); - return this.sensorHatches.add(sensor); - } - return false; - } - - private enum SpecialHatchElement implements IHatchElement { - - HeatSensor(GT_MetaTileEntity_HIPCompressor::addSensorHatchToMachineList, GT_MetaTileEntity_HeatSensor.class) { - - @Override - public long count(GT_MetaTileEntity_HIPCompressor gtMetaTileEntityHIPCompressor) { - return gtMetaTileEntityHIPCompressor.sensorHatches.size(); - } - }; - - private final List> mteClasses; - private final IGT_HatchAdder adder; - - @SafeVarargs - SpecialHatchElement(IGT_HatchAdder adder, - Class... mteClasses) { - this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); - this.adder = adder; - } - - @Override - public List> mteClasses() { - return mteClasses; - } - - public IGT_HatchAdder adder() { - return adder; - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HeatSensor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HeatSensor.java deleted file mode 100644 index e4721428fc..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_HeatSensor.java +++ /dev/null @@ -1,188 +0,0 @@ -package gregtech.common.tileentities.machines.multi.compressor; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.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.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.common.gui.modularui.widget.CoverCycleButtonWidget; - -public class GT_MetaTileEntity_HeatSensor extends GT_MetaTileEntity_Hatch { - - protected float threshold = 0; - protected boolean inverted = false; - private boolean isOn = false; - - private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_BLACKHOLE; - private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_BLACKHOLE_GLOW; - - public GT_MetaTileEntity_HeatSensor(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 0, "Reads heat from HIP Unit."); - } - - public GT_MetaTileEntity_HeatSensor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @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 allowGeneralRedstoneOutput() { - 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 initDefaultModes(NBTTagCompound aNBT) { - getBaseMetaTileEntity().setActive(true); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public String[] getDescription() { - return new String[] { "Reads heat of Hot Isostatic Pressurization Unit.", - "Right click to open the GUI and change settings." }; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - threshold = aNBT.getFloat("mThreshold"); - inverted = aNBT.getBoolean("mInverted"); - super.loadNBTData(aNBT); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setFloat("mThreshold", threshold); - aNBT.setBoolean("mInverted", inverted); - super.saveNBTData(aNBT); - } - - /** - * Updates redstone output strength based on the heat of the HIP unit. - */ - public void updateRedstoneOutput(float heat) { - isOn = (heat > threshold) ^ inverted; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (isOn) { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 15); - } - } else { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 0); - } - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_HeatSensor(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() - .addIcon(textureFont_Glow) - .glow() - .build() }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; - } - - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - final String INVERTED = GT_Utility.trans("INVERTED", "Inverted"); - final String NORMAL = GT_Utility.trans("NORMAL", "Normal"); - - builder.widget( - new CoverCycleButtonWidget().setToggle(() -> inverted, (val) -> inverted = val) - .setTextureGetter( - (state) -> state == 1 ? GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON - : GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF) - .addTooltip(0, NORMAL) - .addTooltip(1, INVERTED) - .setPos(10, 8)) - .widget( - new TextWidget().setStringSupplier(() -> inverted ? INVERTED : NORMAL) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setTextAlignment(Alignment.CenterLeft) - .setPos(28, 12)) - .widget( - new NumericWidget().setBounds(0, 100) - .setGetter(() -> (double) threshold) - .setSetter((value) -> threshold = (float) value) - .setScrollValues(0.1, 0.01, 1.0) - .setMaximumFractionDigits(2) - .setTextColor(Color.WHITE.dark(1)) - .setTextAlignment(Alignment.CenterLeft) - .setFocusOnGuiOpen(true) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) - .setPos(10, 28) - .setSize(77, 12)) - .widget( - new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.heat_sensor")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setTextAlignment(Alignment.CenterLeft) - .setPos(90, 30)); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_IndustrialCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_IndustrialCompressor.java deleted file mode 100644 index 489841c5d4..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_IndustrialCompressor.java +++ /dev/null @@ -1,244 +0,0 @@ -package gregtech.common.tileentities.machines.multi.compressor; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.GT_HatchElement.*; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.GT_Values.Ollie; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -import net.minecraft.item.ItemStack; -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.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_ExtendedPowerMultiBlockBase; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -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.blocks.GT_Block_Casings10; - -public class GT_MetaTileEntity_IndustrialCompressor - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - // spotless:off - transpose(new String[][]{ - {" "," DDD "," DDDDD "," DDDDD "," DDDDD "," DDD "," "}, - {" BBB "," BBBBB ","BBBBBBB","BBBBBBB","BBBBBBB"," BBBBB "," BBB "}, - {" DDD "," B B ","B B","B B","B B"," B B "," DDD "}, - {" DAD "," B B ","C C","C C","C C"," B B "," DAD "}, - {" DAD "," B B ","C C","C C","C C"," B B "," DAD "}, - {" DAD "," B B ","C C","C C","C C"," B B "," DAD "}, - {" DDD "," B B ","B B","B B","B B"," B B "," DDD "}, - {" B~B "," BBBBB ","BBBBBBB","BBBBBBB","BBBBBBB"," BBBBB "," BBB "} - })) - //spotless:on - .addElement( - 'C', - buildHatchAdder(GT_MetaTileEntity_IndustrialCompressor.class).atLeast(InputBus, OutputBus) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(5)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_IndustrialCompressor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 5)))) - .addElement( - 'B', - buildHatchAdder(GT_MetaTileEntity_IndustrialCompressor.class).atLeast(Maintenance, Energy) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(4)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_IndustrialCompressor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 4)))) - .addElement('A', Glasses.chainAllGlasses()) - .addElement('D', ofBlock(GregTech_API.sBlockCasings10, 5)) - .build(); - - public GT_MetaTileEntity_IndustrialCompressor(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_IndustrialCompressor(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_IndustrialCompressor(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 4)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 4)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 4)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Compressor") - .addInfo("Controller Block for the Large Electric Compressor") - .addInfo("100% faster than singleblock machines of the same voltage") - .addInfo("Only uses 90% of the EU/t normally required") - .addInfo("Gains 2 parallels per voltage tier") - .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) - .addSeparator() - .beginStructureBlock(7, 5, 7, true) - .addController("Front Center") - .addCasingInfoMin("Electric Compressor Casing", 95, false) - .addCasingInfoMin("Compressor Pipe Casing", 45, false) - .addCasingInfoExactly("EV+ Glass", 6, false) - .addInputBus("Pipe Casings on Side", 2) - .addOutputBus("Pipe Casings on Side", 2) - .addEnergyHatch("Any Electric Compressor Casing", 1) - .addMaintenanceHatch("Any Electric Compressor Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 7, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 7, 0, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - return checkPiece(STRUCTURE_PIECE_MAIN, 3, 7, 0) && mCasingAmount >= 95; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } - - @Override - protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic().setSpeedBonus(1F / 2F) - .setMaxParallelSupplier(this::getMaxParallelRecipes) - .setEuModifier(0.9F); - } - - public int getMaxParallelRecipes() { - return (2 * GT_Utility.getTier(this.getMaxInputVoltage())); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.compressorRecipes; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_NeutroniumCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_NeutroniumCompressor.java deleted file mode 100644 index 90406bcb50..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/GT_MetaTileEntity_NeutroniumCompressor.java +++ /dev/null @@ -1,261 +0,0 @@ -package gregtech.common.tileentities.machines.multi.compressor; - -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.OutputBus; -import static gregtech.api.enums.GT_Values.AuthorFourIsTheNumber; -import static gregtech.api.enums.GT_Values.Ollie; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; - -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.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.logic.ProcessingLogic; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Casings10; - -public class GT_MetaTileEntity_NeutroniumCompressor - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - // spotless:off - transpose(new String[][]{ - {" CEEEEEC "," CE EC ","CE EC","E E","E E","E E","E E","E E","CE EC"," CE EC "," CEEEEEC "}, - {" CE EC ","C BBBBB C","E BBBBBBB E"," BBCCCCCBB "," BBCBBBCBB "," BBCCCCCBB "," BBCBBBCBB "," BBCCCCCBB ","E BBBBBBB E","C BBBBB C"," CE EC "}, - {"CE EC","E BBBBBBB E"," B B "," D D "," B B "," B B "," D D "," B B "," B B ","E BDDDBDB E","CE EC"}, - {"E E"," BBAAAAABB "," B B "," D D "," B B "," D D "," D D "," B B "," B B "," BBDBBBDBB ","E E"}, - {"E E"," BBAAAAABB "," B B "," D D "," B B "," B B "," D D "," D D "," D D "," BDDBDDDDB ","E E"}, - {"E E"," BBAAAAABB "," D D "," D D "," D D "," B B "," B B "," B B "," B B "," BBDBBBBDB ","E E"}, - {"E E"," BBAAAAABB "," B B "," B B "," D D "," B B "," B B "," D D "," B B "," BBDBBDBBB ","E E"}, - {"E E"," BBAAAAABB "," B B "," D D "," D D "," B B "," D D "," D D "," D D "," BBBBBDDDB ","E E"}, - {"CE EC","E BBBBBBB E"," B B "," D D "," B B "," B B "," D D "," B B "," B B ","E BDDBBBB E","CE EC"}, - {" CE EC ","C BB~BB C","E BBBBBBB E"," BBBBBBBBB "," BBBBBBBBB "," BBBBBBBBB "," BBBBBBBBB "," BBBBBBBBB ","E BBBBBBB E","C BBBBB C"," CE EC "}, - {" CEEEEEC "," CE EC ","CE EC","E E","E E","E E","E E","E E","CE EC"," CE EC "," CEEEEEC "} - })) - //spotless:on - .addElement('A', Glasses.chainAllGlasses()) - .addElement( - 'B', - buildHatchAdder(GT_MetaTileEntity_NeutroniumCompressor.class) - .atLeast(InputBus, OutputBus, Maintenance, Energy) - .casingIndex(((GT_Block_Casings10) GregTech_API.sBlockCasings10).getTextureIndex(6)) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_NeutroniumCompressor::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings10, 6)))) - .addElement('C', ofBlock(GregTech_API.sBlockCasings10, 8)) - .addElement('D', ofBlock(GregTech_API.sBlockCasings10, 7)) - .addElement('E', ofFrame(Materials.NaquadahAlloy)) - .build(); - - public GT_MetaTileEntity_NeutroniumCompressor(final int aID, final String aName, final String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_NeutroniumCompressor(String aName) { - super(aName); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_NeutroniumCompressor(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - ITexture[] rTexture; - if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 6)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 6)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) - .extFacing() - .glow() - .build() }; - } - } else { - rTexture = new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings10, 6)) }; - } - return rTexture; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Neutronium Compressor") - .addInfo("Controller Block for the Neutronium Compressor") - .addInfo("Has a static 8 parallels") - .addInfo("Capable of compressing matter into " + EnumChatFormatting.GOLD + "singularities") - .addInfo("More advanced singularities will require even stronger compression...") - .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) - .addSeparator() - .beginStructureBlock(11, 11, 11, true) - .addController("Front Center") - .addCasingInfoMin("Neutronium Casing", 220, false) - .addCasingInfoExactly("Active Neutronium Casing", 63, false) - .addCasingInfoExactly("Any Glass", 25, false) - .addCasingInfoExactly("Naquadah Alloy Frame Box", 108, false) - .addCasingInfoExactly("Neutronium Stabilization Casing", 67, false) - .addInputBus("Any Neutronium Casing", 1) - .addOutputBus("Any Neutronium Casing", 1) - .addEnergyHatch("Any Neutronium Casing", 1) - .addMaintenanceHatch("Any Neutronium Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 5, 9, 1); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 5, 9, 1, elementBudget, env, false, true); - } - - private int mCasingAmount; - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - - return (checkPiece(STRUCTURE_PIECE_MAIN, 5, 9, 1)) && mCasingAmount >= 220; - } - - @Override - protected void setProcessingLogicPower(ProcessingLogic logic) { - logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage())); - logic.setAvailableAmperage(1L); - } - - @Override - protected ProcessingLogic createProcessingLogic() { - - return new ProcessingLogic() { - - @NotNull - @Override - protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) { - if (recipe.mSpecialValue > 0) { - return CheckRecipeResultRegistry.NO_BLACK_HOLE; - } - return super.validateRecipe(recipe); - } - }.setMaxParallel(8); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.neutroniumCompressorRecipes; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean supportsVoidProtection() { - return true; - } - - @Override - public boolean supportsBatchMode() { - return true; - } - - @Override - public boolean supportsInputSeparation() { - return true; - } - - @Override - public boolean supportsSingleRecipeLocking() { - return true; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java new file mode 100644 index 0000000000..ba893e045d --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java @@ -0,0 +1,534 @@ +package gregtech.common.tileentities.machines.multi.compressor; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.GTValues.Ollie; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Stream; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +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.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +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.metadata.CompressionTierKey; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings10; +import gregtech.common.items.MetaGeneratedItem01; +import gtPlusPlus.core.util.minecraft.PlayerUtils; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + // spotless:off + transpose(new String[][]{ + {" "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCCC CCCCC "," CCCC CCCC "," "," "," "," CCCC CCCC "," CCCCC CCCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "}, + {" "," "," "," "," "," "," "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCC CCCC "," CCCCC CCCCC "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," "," "," "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," CCCCC CCCCC "," CCCC CCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," "," "," "," "," "," "," "}, + {" "," "," "," "," "," "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCB BCCCCCCC "," CCCCCCB BBB BCCCCCC "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," CCCCCCB BBB BCCCCCC "," CCCCCCCB BCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," "," "," "," "," "," "}, + {" "," "," "," "," "," CC CC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCBCCCCCBCCCCCCB "," CCCCCCCCBCCCCCCCBCCCCCCCC "," CCCCCCCBCCCCCCCCCBCCCCCCC "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," CCCCCCCBCCCCCCCCCBCCCCCCC "," CCCCCCCCBCCCCCCCBCCCCCCCC "," BCCCCCCBCCCCCBCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CC CC "," "," "," "," "," "}, + {" "," "," "," "," CC CC "," CCDDDCC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCCCB BCCCCCCCCC "," CCCCCCCCB BCCCCCCCC "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," CCCCCCCCB BCCCCCCCC "," CCCCCCCCCB BCCCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CCDDDCC "," CC CC "," "," "," "," "}, + {" "," "," "," CC CC "," CC CC "," CC CC "," "," "," "," BB BB "," BBBB CCCCC BBBB "," BBBBCC CCBBBB "," BBC CBB "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," BBC CBB "," BBBBCC CCBBBB "," BBBB CCCCC BBBB "," BB BB "," "," "," "," CC CC "," CC CC "," CC CC "," "," "," "}, + {" "," "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," BBB CCCCC BBB "," BBCC CCBB "," BC CB "," CC C C CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC C C CC "," BC CB "," BBCC CCBB "," BBB CCCCC BBB "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "," "}, + {" "," "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," BBBCCCCCBBB "," BBC CBB "," CCC BC CB CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC BC CB CCC "," BBC CBB "," BBBCCCCCBBB "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," "," "}, + {" "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," "," "," "," BBCCCCCBB "," CC BC CB CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC BC CB CC "," BBCCCCCBB "," "," "," "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "}, + {" "," "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," BCCCCCB "," CC BC CB CC "," CC C C CC "," C C "," C C "," C C "," CC C C CC "," CC BC CB CC "," BCCCCCB "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "," "}, + {" "," CC CC "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC BBCCCBB CCC "," CCC BC CB CCC "," D C C D "," D C C D "," D C C D "," CCC BC CB CCC "," CCC BBCCCBB CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," CC CC "," "}, + {" "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BCCCB CC "," CC BC CB CC "," C C "," C C "," C C "," CC BC CB CC "," CC BCCCB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "}, + {" "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BBB CC "," CC BCCCB CC "," D BCCCCCB D "," D BCCCCCB D "," D BCCCCCB D "," CC BCCCB CC "," CC BBB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," "}, + {" "," CC CC "," CCBBBCC "," CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC BBB CC "," BC B B CB "," BC B B CB "," BC B B CB "," CC BBB CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC "," CCBBBCC "," CC CC "," "}, + {" CCDDDCC "," CC CC "," CBBBBBC "," C C "," "," "," "," "," "," "," "," "," "," ","CCC CCC","CCBC CBCC","D B B D","D B B D","D B B D","CCBC CBCC","CCC CCC"," "," "," "," "," "," "," "," "," "," "," C C "," CBBBBBC "," CC CC "," CCDDDCC "}, + {" CC CC "," CCCCCCC "," BBBBBBB "," C ABA C "," ABA "," A "," A "," "," "," "," "," "," "," ","CCBC CBCC","CCB BCC"," CBAA AABC "," CBBBAA AABBBC "," CBAA AABC ","CCB BCC","CCBC CBCC"," "," "," "," "," "," "," "," A "," A "," ABA "," C ABA C "," BBBBBBB "," CCCCCCC "," CC CC "}, + {" CC CC "," CCCECCC "," BBBBBBB "," C BBB C "," BBB "," ABA "," ABA "," B "," B "," "," "," "," "," ","CCBC CBCC","CCB BCC"," CBBBAA AABBBC "," EBBBBBBB BBBBBBBE "," CBBBAA AABBBC ","CCB BCC","CCBC CBCC"," "," "," "," "," "," B "," B "," ABA "," ABA "," BBB "," C BBB C "," BBBBBBB "," CCCECCC "," CC CC "}, + {" CC CC "," CCCCCCC "," BBBBBBB "," C ABA C "," ABA "," A "," A "," "," "," "," "," "," "," ","CCBC CBCC","CCB BCC"," CBAA AABC "," CBBBAA AABBBC "," CBAA AABC ","CCB BCC","CCBC CBCC"," "," "," "," "," "," "," "," A "," A "," ABA "," C ABA C "," BBBBBBB "," CCCCCCC "," CC CC "}, + {" CCDDDCC "," CC CC "," CBBBBBC "," C C "," "," "," "," "," "," "," "," "," "," ","CCC CCC","CCBC CBCC","D B B D","D B B D","D B B D","CCBC CBCC","CCC CCC"," "," "," "," "," "," "," "," "," "," "," C C "," CBBBBBC "," CC CC "," CCDDDCC "}, + {" "," CC CC "," CCBBBCC "," CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC BBB CC "," BC B B CB "," BC B B CB "," BC B B CB "," CC BBB CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC "," CCBBBCC "," CC CC "," "}, + {" "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BBB CC "," CC BCCCB CC "," D BCCCCCB D "," D BCCCCCB D "," D BCCCCCB D "," CC BCCCB CC "," CC BBB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," "}, + {" "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," "," "," CC BCCCB CC "," CC BC CB CC "," C C "," C C "," C C "," CC BC CB CC "," CC BCCCB CC "," "," "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "}, + {" "," CC CC "," CCDDDCC "," CC CC "," "," "," "," "," "," "," "," "," "," "," CCC BBCCCBB CCC "," CCC BC CB CCC "," D C C D "," D C C D "," D C C D "," CCC BC CB CCC "," CCC BBCCCBB CCC "," "," "," "," "," "," "," "," "," "," "," CC CC "," CCDDDCC "," CC CC "," "}, + {" "," "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "," BCCCCCB "," CC BC CB CC "," CC C C CC "," C C "," C C "," C C "," CC C C CC "," CC BC CB CC "," BCCCCCB "," "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," "," "}, + {" "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," "," "," "," BBCCCCCBB "," CC BC CB CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC BC CB CC "," BBCCCCCBB "," "," "," "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "}, + {" "," "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," BBBCCCCCBBB "," BBC CBB "," CCC BC CB CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC BC CB CCC "," BBC CBB "," BBBCCCCCBBB "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," "," "}, + {" "," "," "," CC CC "," CCDDDCC "," "," "," "," "," "," "," BBB CCCCC BBB "," BBCC CCBB "," BC CB "," CC C C CC "," CC C C CC "," D C C D "," D C C D "," D C C D "," CC C C CC "," CC C C CC "," BC CB "," BBCC CCBB "," BBB CCCCC BBB "," "," "," "," "," "," "," CCDDDCC "," CC CC "," "," "," "}, + {" "," "," "," CC CC "," CC CC "," CC CC "," "," "," "," BB BB "," BBBB CC~CC BBBB "," BBBBCC CCBBBB "," BBC CBB "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," C C "," C C "," CCC C C CCC "," CCC C C CCC "," C C "," BBC CBB "," BBBBCC CCBBBB "," BBBB CCCCC BBBB "," BB BB "," "," "," "," CC CC "," CC CC "," CC CC "," "," "," "}, + {" "," "," "," "," CC CC "," CCDDDCC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCCCB BCCCCCCCCC "," CCCCCCCCB BCCCCCCCC "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," DBCCCCCB BCCCCCBD "," CCCCCCCCB BCCCCCCCC "," CCCCCCCCCB BCCCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CCDDDCC "," CC CC "," "," "," "," "}, + {" "," "," "," "," "," CC CC "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCBCCCCCBCCCCCCB "," CCCCCCCCBCCCCCCCBCCCCCCCC "," CCCCCCCBCCCCCCCCCBCCCCCCC "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," BCCCCCBCCCCCCCCCBCCCCCB "," CCCCCCCBCCCCCCCCCBCCCCCCC "," CCCCCCCCBCCCCCCCBCCCCCCCC "," BCCCCCCBCCCCCBCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," CC CC "," "," "," "," "," "}, + {" "," "," "," "," "," "," CCBBBCC "," BBCCCCCCCBB "," BCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCB BCCCCCCB "," CCCCCCCB BCCCCCCC "," CCCCCCB BBB BCCCCCC "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," BCCCCCB B B BCCCCCB "," CCCCCCB BBB BCCCCCC "," CCCCCCCB BCCCCCCC "," BCCCCCCB BCCCCCCB "," BCCCCCCCBBBBBCCCCCCCB "," BCCCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCCCB "," BCCCCCCCCCCCCCB "," BCCCCCCCCCCCB "," BBCCCCCCCBB "," CCBBBCC "," "," "," "," "," "," "}, + {" "," "," "," "," "," "," "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCC CCCC "," CCCCC CCCCC "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," "," "," "," CCCCCC CCCCCC "," CCCCCCC CCCCCCC "," CCCCCC CCCCCC "," CCCCC CCCCC "," CCCC CCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," "," "," "," "," "," "," "}, + {" "," "," "," "," "," "," "," "," "," CC CC "," CC CC "," CC CC "," CCC CCC "," CCC CCC "," CCCCC CCCCC "," CCCC CCCC "," "," "," "," CCCC CCCC "," CCCCC CCCCC "," CCC CCC "," CCC CCC "," CC CC "," CC CC "," CC CC "," "," "," "," "," "," "," "," "," "} + })) + //spotless:on + .addElement('A', ofBlock(GregTechAPI.sBlockGlass1, 4)) + .addElement( + 'B', + buildHatchAdder(MTEBlackHoleCompressor.class).atLeast(Maintenance, Energy) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(12)) + .dot(2) + .buildAndChain( + onElementPass(MTEBlackHoleCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 12)))) + .addElement('C', ofBlock(GregTechAPI.sBlockCasings10, 11)) + .addElement('D', ofFrame(Materials.NaquadahAlloy)) + .addElement( + 'E', + buildHatchAdder(MTEBlackHoleCompressor.class).atLeast(InputBus, OutputBus, InputHatch) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(11)) + .dot(1) + .buildAndChain( + onElementPass(MTEBlackHoleCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 11)))) + + .build(); + + private boolean blackholeOn = false; + private int catalyzingCounter = 0; + private float blackHoleStability = 100; + + private final FluidStack blackholeCatalyzingCost = (MaterialsUEVplus.SpaceTime).getMolten(1); + private int catalyzingCostModifier = 1; + + public MTEBlackHoleCompressor(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEBlackHoleCompressor(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEBlackHoleCompressor(this.mName); + } + + @Override + public boolean supportsMachineModeSwitch() { + return true; + } + + @Override + public void setMachineModeIcons() { + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_COMPRESSING); + machineModeIcons.add(GTUITextures.OVERLAY_BUTTON_MACHINEMODE_SINGULARITY); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + setMachineMode(nextMachineMode()); + PlayerUtils.messagePlayer( + aPlayer, + String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); + } + + @Override + public String getMachineModeName() { + return StatCollector.translateToLocal("GT5U.COMPRESSION_TIER.mode." + machineMode); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 11)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 11)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 11)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Compressor/Advanced Neutronium Compressor") + .addInfo("Controller Block for the Semi-Stable Black Hole Containment Field") + .addInfo(EnumChatFormatting.LIGHT_PURPLE + "Uses the immense power of the event horizon to compress things") + .addInfo("No longer requires heat management to perform perfect compression") + .addInfo("Can create advanced singularities!") + .addSeparator() + .addInfo( + "Insert a " + EnumChatFormatting.WHITE + + "Black Hole Activation Catalyst" + + EnumChatFormatting.GRAY + + " to open a black hole") + .addInfo( + "The black hole will begin its life at " + EnumChatFormatting.RED + + "100%" + + EnumChatFormatting.GRAY + + " stability and slowly decay") + .addSeparator() + .addInfo("Natural decay takes " + EnumChatFormatting.RED + "100" + EnumChatFormatting.GRAY + " seconds") + .addInfo("Running recipes in the machine will slow the decay by " + EnumChatFormatting.RED + "25%") + .addInfo( + "The decay can be " + EnumChatFormatting.BOLD + + "halted" + + EnumChatFormatting.RESET + + EnumChatFormatting.GRAY + + " by inserting spacetime") + .addInfo( + "Every " + EnumChatFormatting.RED + + "30" + + EnumChatFormatting.GRAY + + " seconds saved by spacetime insertion will " + + EnumChatFormatting.RED + + "double" + + EnumChatFormatting.GRAY + + " the cost per second!") + .addInfo("Once the black hole becomes unstable, it will void all inputs for recipes which require it") + .addInfo( + "Insert a " + EnumChatFormatting.WHITE + + "Black Hole Deactivation Catalyst" + + EnumChatFormatting.GRAY + + " to close the black hole") + .addSeparator() + .addInfo( + "Recipes not utilizing the black hole have their lengths " + EnumChatFormatting.RED + + "doubled" + + EnumChatFormatting.GRAY + + " if it becomes unstable") + .addInfo("400% faster than singleblock machines of the same voltage when black hole is open") + .addInfo("Only uses 70% of the EU/t normally required") + .addInfo("Gains 8 parallels per voltage tier") + .addInfo( + "Parallels are " + EnumChatFormatting.RED + + "doubled" + + EnumChatFormatting.GRAY + + " when stability is BELOW " + + EnumChatFormatting.RED + + "50%") + .addInfo( + "Parallels are " + EnumChatFormatting.RED + + "quadrupled" + + EnumChatFormatting.GRAY + + " when stability is BELOW " + + EnumChatFormatting.RED + + "20%") + .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) + .addSeparator() + .beginStructureBlock(35, 33, 35, false) + .addCasingInfoMin("Background Radiation Absorbent Casing", 985, false) + .addCasingInfoExactly("Extreme Density Space-Bending Casing", 3667, false) + .addCasingInfoExactly("Hawking Radiation Realignment Focus", 64, false) + .addCasingInfoExactly("Naquadah Alloy Frame Box", 144, false) + .addInputBus("Behind Laser", 1) + .addOutputBus("Behind Laser", 1) + .addInputHatch("Behind Laser", 1) + .addEnergyHatch("Any Radiation Absorbent Casing", 2) + .addMaintenanceHatch("Any Radiation Absorbent Casing", 2) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 17, 27, 10); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 17, 27, 10, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + mEnergyHatches.clear(); + + if (!checkPiece(STRUCTURE_PIECE_MAIN, 17, 27, 10)) return false; + if (mCasingAmount < 0) return false; + + return true; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + aNBT.setInteger("catalyzingCostModifier", catalyzingCostModifier); + aNBT.setInteger("catalyzingCounter", catalyzingCounter); + aNBT.setBoolean("blackholeOn", blackholeOn); + aNBT.setFloat("blackholeStability", blackHoleStability); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (aNBT.hasKey("catalyzingCounter")) catalyzingCostModifier = aNBT.getInteger("catalyzingCounter"); + if (aNBT.hasKey("catalyzingCostModifier")) catalyzingCostModifier = aNBT.getInteger("catalyzingCostModifier"); + if (aNBT.hasKey("blackholeOn")) blackholeOn = aNBT.getBoolean("blackholeOn"); + if (aNBT.hasKey("blackholeStability")) blackHoleStability = aNBT.getFloat("blackholeStability"); + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + tag.setBoolean("blackholeOn", blackholeOn); + tag.setFloat("blackHoleStability", blackHoleStability); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + if (tag.getBoolean("blackholeOn")) { + if (tag.getFloat("blackHoleStability") > 0) { + currentTip.add(EnumChatFormatting.DARK_PURPLE + "Black Hole Active"); + currentTip.add( + EnumChatFormatting.DARK_PURPLE + " Stability: " + + EnumChatFormatting.BOLD + + Math.round(tag.getFloat("blackHoleStability")) + + "%"); + } else { + currentTip.add(EnumChatFormatting.RED + "BLACK HOLE UNSTABLE"); + } + } else currentTip.add(EnumChatFormatting.DARK_PURPLE + "Black Hole Offline"); + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected Stream findRecipeMatches(@Nullable RecipeMap map) { + + // Loop through all items and look for the Activation and Deactivation Catalysts + // Deactivation resets stability to 100 and catalyzing cost to 1 + for (ItemStack inputItem : inputItems) { + if (inputItem.getItem() instanceof MetaGeneratedItem01) { + if (inputItem.getItemDamage() == 32418 && !blackholeOn) { + inputItem.stackSize -= 1; + blackholeOn = true; + break; + } else if (inputItem.getItemDamage() == 32419 && blackholeOn) { + inputItem.stackSize -= 1; + blackholeOn = false; + blackHoleStability = 100; + catalyzingCostModifier = 1; + break; + } + } + } + return super.findRecipeMatches(map); + } + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { + + // Default speed bonus + setSpeedBonus(1F); + + // If recipe needs a black hole and one is not open, just wait + // If the recipe doesn't require black hole, incur a 0.5x speed penalty + // If recipe doesn't require black hole but one is open, give 5x speed bonus + if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) { + if (!blackholeOn) return CheckRecipeResultRegistry.NO_BLACK_HOLE; + } else { + if (blackHoleStability <= 0) setSpeedBonus(5F); + else if (blackholeOn) setSpeedBonus(0.2F); + } + return super.validateRecipe(recipe); + } + + @Nonnull + protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) { + // If recipe needs a black hole and one is active but unstable, continuously void items + if (blackHoleStability <= 0 && recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) { + return CheckRecipeResultRegistry.UNSTABLE_BLACK_HOLE; + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + }.setMaxParallelSupplier(this::getMaxParallelRecipes) + .setEuModifier(0.7F); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + + if (aTick % 20 == 0) { + if (blackholeOn && blackHoleStability >= 0) { + float stabilityDecrease = 1F; + // If the machine is running, reduce stability loss by 25% + if (this.maxProgresstime() != 0) { + stabilityDecrease = 0.75F; + } + // Search all hatches for catalyst fluid + // If found enough, drain it and reduce stability loss to 0 + // Every 30 drains, double the cost + FluidStack totalCost = new FluidStack(blackholeCatalyzingCost, catalyzingCostModifier); + for (MTEHatchInput hatch : mInputHatches) { + if (drain(hatch, totalCost, false)) { + drain(hatch, totalCost, true); + catalyzingCounter += 1; + stabilityDecrease = 0; + if (catalyzingCounter >= 30) { + catalyzingCostModifier *= 2; + catalyzingCounter = 0; + } + } + } + if (blackHoleStability >= 0) blackHoleStability -= stabilityDecrease; + else blackHoleStability = 0; + } + } + } + + public int getMaxParallelRecipes() { + int parallels = (8 * GTUtility.getTier(this.getMaxInputVoltage())); + if (blackHoleStability < 60) { + parallels *= 2; + if (blackHoleStability < 20) parallels *= 2; + } + return parallels; + } + + private static final int MACHINEMODE_COMPRESSOR = 0; + private static final int MACHINEMODE_BLACKHOLE = 1; + + @Override + public RecipeMap getRecipeMap() { + return (machineMode == MACHINEMODE_COMPRESSOR) ? RecipeMaps.compressorRecipes + : RecipeMaps.neutroniumCompressorRecipes; + } + + @Nonnull + @Override + public Collection> getAvailableRecipeMaps() { + return Arrays.asList(RecipeMaps.compressorRecipes, RecipeMaps.neutroniumCompressorRecipes); + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java new file mode 100644 index 0000000000..2491dcff38 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java @@ -0,0 +1,515 @@ +package gregtech.common.tileentities.machines.multi.compressor; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.GTValues.Ollie; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofCoil; + +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.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 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 bartworks.util.MathUtils; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.HeatingCoilLevel; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.metadata.CompressionTierKey; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.IGTHatchAdder; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.SimpleShutDownReason; +import gregtech.common.blocks.BlockCasings10; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEHIPCompressor extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + // spotless:off + transpose(new String[][]{ + {" "," "," "," CCCCCC DDDDDD "," "," "," "}, + {" "," "," "," C C D D "," "," "," "}, + {" "," HHH "," HHHHH "," C HHHHH D "," HHHHH "," HHH "," "}, + {" BBB "," BBBBB "," BBBBBBB "," C BBBBBBB D "," BBBBBBB "," BBBBB "," BBB "}, + {" HHH "," B B "," BF FB "," C BF FB D "," BF FB "," B B "," HHH "}, + {" HAH "," B B "," GF FG "," C GF FG D "," GF FG "," B B "," HAH "}, + {" HAH "," B B "," E GF FG E ","EEE GF FG EEE"," E GF FG E "," B B "," HAH "}, + {" HAH "," B B "," A GF FG A ","A A GF FG A A"," A GF FG A "," B B "," HAH "}, + {" HHH "," B B "," A BF FB A ","A A BF FB A A"," A BF FB A "," B B "," HHH "}, + {" B~B "," BBBBB "," E BBBBBBB E ","EEE BBBBBBB EEE"," E BBBBBBB E "," BBBBB "," BBB "} + })) + //spotless:on + .addElement('A', Glasses.chainAllGlasses()) + .addElement( + 'B', + buildHatchAdder(MTEHIPCompressor.class).atLeast(Maintenance, Energy, SpecialHatchElement.HeatSensor) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(4)) + .dot(1) + .buildAndChain(onElementPass(MTEHIPCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 4)))) + .addElement('C', ofBlock(GregTechAPI.sBlockCasings10, 9)) + .addElement('D', ofBlock(GregTechAPI.sBlockCasings10, 10)) + .addElement('E', ofBlock(GregTechAPI.sBlockCasings4, 1)) + .addElement('F', ofCoil(MTEHIPCompressor::setCoilLevel, MTEHIPCompressor::getCoilLevel)) + .addElement( + 'G', + buildHatchAdder(MTEHIPCompressor.class).atLeast(InputBus, OutputBus) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(5)) + .dot(1) + .buildAndChain(onElementPass(MTEHIPCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 5)))) + .addElement('H', ofBlock(GregTechAPI.sBlockCasings10, 5)) + .build(); + + private final ArrayList sensorHatches = new ArrayList<>(); + + private HeatingCoilLevel heatLevel; + private int coilTier = 0; + + private float heat = 0; + private boolean cooling = false; + + public MTEHIPCompressor(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEHIPCompressor(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHIPCompressor(this.mName); + } + + @Override + public void onValueUpdate(byte aValue) { + boolean oCooling = cooling; + cooling = (aValue & 1) == 1; + if (oCooling != cooling) getBaseMetaTileEntity().issueTextureUpdate(); + } + + @Override + public byte getUpdateData() { + return (byte) (cooling ? 1 : 0); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (cooling) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 4)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING_GLOW) + .extFacing() + .glow() + .build() }; + } else if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 4)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 4)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 4)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Compressor") + .addInfo("Controller Block for the Hot Isostatic Pressurization Unit") + .addInfo("HIP Unit heats up while running") + .addInfo( + "When it reaches maximum heat, it becomes " + EnumChatFormatting.DARK_RED + + EnumChatFormatting.BOLD + + "overheated!") + .addInfo("This is only resolved by letting the machine fully cool down") + .addInfo( + "When " + EnumChatFormatting.DARK_RED + + "overheated" + + EnumChatFormatting.GRAY + + ", recipes are slowed down drastically") + .addSeparator() + .addInfo( + "Some recipes " + EnumChatFormatting.BOLD + + "require" + + EnumChatFormatting.RESET + + EnumChatFormatting.GRAY + + " HIP") + .addInfo( + "If the machine " + EnumChatFormatting.DARK_RED + + "overheats" + + EnumChatFormatting.GRAY + + " during these recipes, recipe will be voided!") + .addInfo("Read the current heat using Heat Sensor Hatches") + .addSeparator() + .addInfo("More advanced coils allow better heat control - the unit will take longer to overheat") + .addInfo( + "Unit heats by " + EnumChatFormatting.GREEN + + "(5% x 0.90 ^ (Coil Tier - 1))" + + EnumChatFormatting.GRAY + + " every second while running") + .addInfo( + "Unit cools by " + EnumChatFormatting.GREEN + + "2%" + + EnumChatFormatting.GRAY + + " every second while not running") + .addSeparator() + .addInfo( + "250% " + EnumChatFormatting.RED + + "faster" + + EnumChatFormatting.GRAY + + "/" + + EnumChatFormatting.BLUE + + "slower" + + EnumChatFormatting.GRAY + + " than singleblock machines of the same voltage") + .addInfo( + "Uses " + EnumChatFormatting.RED + + "75%" + + EnumChatFormatting.GRAY + + "/" + + EnumChatFormatting.BLUE + + "110%" + + EnumChatFormatting.GRAY + + " the EU/t normally required") + .addInfo( + "Gains " + EnumChatFormatting.RED + + "4" + + EnumChatFormatting.GRAY + + "/" + + EnumChatFormatting.BLUE + + "1" + + EnumChatFormatting.GRAY + + " parallels per voltage tier") + .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) + .addSeparator() + .beginStructureBlock(7, 5, 7, true) + .addController("Front Center") + .addCasingInfoMin("Electric Compressor Casing", 95, false) + .addCasingInfoMin("Compressor Pipe Casing", 45, false) + .addCasingInfoExactly("Coolant Duct", 12, false) + .addCasingInfoExactly("Heating Duct", 12, false) + .addCasingInfoExactly("EV+ Glass", 22, false) + .addCasingInfoExactly("Clean Stainless Steel Machine Casing", 20, false) + .addCasingInfoExactly("Coil", 30, true) + .addInputBus("Pipe Casings on Side", 2) + .addOutputBus("Pipe Casings on Side", 2) + .addEnergyHatch("Any Electric Compressor Casing", 1) + .addMaintenanceHatch("Any Electric Compressor Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 7, 9, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 9, 0, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + setCoilLevel(HeatingCoilLevel.None); + mCasingAmount = 0; + return checkPiece(STRUCTURE_PIECE_MAIN, 7, 9, 0) && mCasingAmount >= 95; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setFloat("heat", heat); + aNBT.setBoolean("cooling", cooling); + aNBT.setInteger("coilTier", coilTier); + aNBT.setBoolean("doingHIP", doingHIP); + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + if (aNBT.hasKey("heat")) heat = aNBT.getFloat("heat"); + if (aNBT.hasKey("cooling")) cooling = aNBT.getBoolean("cooling"); + if (aNBT.hasKey("coilTier")) coilTier = aNBT.getInteger("coilTier"); + if (aNBT.hasKey("doingHIP")) doingHIP = aNBT.getBoolean("doingHIP"); + super.loadNBTData(aNBT); + } + + @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("heat", Math.round(heat)); + tag.setBoolean("cooling", cooling); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + if (tag.getBoolean("cooling")) currentTip.add( + "HIP Heat: " + EnumChatFormatting.RED + + EnumChatFormatting.BOLD + + tag.getInteger("heat") + + "%" + + EnumChatFormatting.RESET); + else currentTip.add( + "HIP Heat: " + EnumChatFormatting.AQUA + + EnumChatFormatting.BOLD + + tag.getInteger("heat") + + "%" + + EnumChatFormatting.RESET); + } + + private boolean doingHIP = false; + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { + doingHIP = false; + setSpeedBonus(1F / 1.25F); + setEuModifier(0.75F); + + if (cooling) { + setSpeedBonus(2.5F); + setEuModifier(1.1F); + } + + if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) doingHIP = true; + return super.validateRecipe(recipe); + } + }.setMaxParallelSupplier(this::getMaxParallelRecipes); + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + if (cooling && doingHIP) { + stopMachine(SimpleShutDownReason.ofCritical("overheated")); + doingHIP = false; + } + return super.onRunningTick(aStack); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + + if (aTick % 20 == 0) { + + // Default to cooling by 2% + float heatMod = -2; + + // If the machine is running, heat by 5% x 0.90 ^ (Coil Tier) + // Cupronickel is 0, so base will be 5% increase + if (this.maxProgresstime() != 0) { + heatMod = (float) (5 * Math.pow(0.9, coilTier)); + } + + heat = MathUtils.clamp(heat + heatMod, 0, 100); + + if ((cooling && heat <= 0) || (!cooling && heat >= 100)) { + cooling = !cooling; + } + } + + // Update all the sensors + for (MTEHeatSensor hatch : sensorHatches) { + hatch.updateRedstoneOutput(heat); + } + + } + + public int getMaxParallelRecipes() { + return cooling ? GTUtility.getTier(this.getMaxInputVoltage()) + : (4 * GTUtility.getTier(this.getMaxInputVoltage())); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.compressorRecipes; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + public HeatingCoilLevel getCoilLevel() { + return heatLevel; + } + + public void setCoilLevel(HeatingCoilLevel aCoilLevel) { + heatLevel = aCoilLevel; + coilTier = aCoilLevel.getTier(); + } + + public boolean addSensorHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity instanceof MTEHeatSensor sensor) { + sensor.updateTexture(aBaseCasingIndex); + return this.sensorHatches.add(sensor); + } + return false; + } + + private enum SpecialHatchElement implements IHatchElement { + + HeatSensor(MTEHIPCompressor::addSensorHatchToMachineList, MTEHeatSensor.class) { + + @Override + public long count(MTEHIPCompressor gtMetaTileEntityHIPCompressor) { + return gtMetaTileEntityHIPCompressor.sensorHatches.size(); + } + }; + + private final List> mteClasses; + private final IGTHatchAdder adder; + + @SafeVarargs + SpecialHatchElement(IGTHatchAdder adder, Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + public IGTHatchAdder adder() { + return adder; + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java new file mode 100644 index 0000000000..8ea57bc1cf --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java @@ -0,0 +1,188 @@ +package gregtech.common.tileentities.machines.multi.compressor; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.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.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEHatch; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.common.gui.modularui.widget.CoverCycleButtonWidget; + +public class MTEHeatSensor extends MTEHatch { + + protected float threshold = 0; + protected boolean inverted = false; + private boolean isOn = false; + + private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_BLACKHOLE; + private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_BLACKHOLE_GLOW; + + public MTEHeatSensor(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, "Reads heat from HIP Unit."); + } + + public MTEHeatSensor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @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 allowGeneralRedstoneOutput() { + 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 initDefaultModes(NBTTagCompound aNBT) { + getBaseMetaTileEntity().setActive(true); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public String[] getDescription() { + return new String[] { "Reads heat of Hot Isostatic Pressurization Unit.", + "Right click to open the GUI and change settings." }; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + threshold = aNBT.getFloat("mThreshold"); + inverted = aNBT.getBoolean("mInverted"); + super.loadNBTData(aNBT); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setFloat("mThreshold", threshold); + aNBT.setBoolean("mInverted", inverted); + super.saveNBTData(aNBT); + } + + /** + * Updates redstone output strength based on the heat of the HIP unit. + */ + public void updateRedstoneOutput(float heat) { + isOn = (heat > threshold) ^ inverted; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (isOn) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 15); + } + } else { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 0); + } + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHeatSensor(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() + .addIcon(textureFont_Glow) + .glow() + .build() }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; + } + + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + final String INVERTED = GTUtility.trans("INVERTED", "Inverted"); + final String NORMAL = GTUtility.trans("NORMAL", "Normal"); + + builder.widget( + new CoverCycleButtonWidget().setToggle(() -> inverted, (val) -> inverted = val) + .setTextureGetter( + (state) -> state == 1 ? GTUITextures.OVERLAY_BUTTON_REDSTONE_ON + : GTUITextures.OVERLAY_BUTTON_REDSTONE_OFF) + .addTooltip(0, NORMAL) + .addTooltip(1, INVERTED) + .setPos(10, 8)) + .widget( + new TextWidget().setStringSupplier(() -> inverted ? INVERTED : NORMAL) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setTextAlignment(Alignment.CenterLeft) + .setPos(28, 12)) + .widget( + new NumericWidget().setBounds(0, 100) + .setGetter(() -> (double) threshold) + .setSetter((value) -> threshold = (float) value) + .setScrollValues(0.1, 0.01, 1.0) + .setMaximumFractionDigits(2) + .setTextColor(Color.WHITE.dark(1)) + .setTextAlignment(Alignment.CenterLeft) + .setFocusOnGuiOpen(true) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) + .setPos(10, 28) + .setSize(77, 12)) + .widget( + new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.heat_sensor")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setTextAlignment(Alignment.CenterLeft) + .setPos(90, 30)); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java new file mode 100644 index 0000000000..e21da1856f --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java @@ -0,0 +1,239 @@ +package gregtech.common.tileentities.machines.multi.compressor; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.GTValues.Ollie; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +import net.minecraft.item.ItemStack; +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.GregTechAPI; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings10; + +public class MTEIndustrialCompressor extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + // spotless:off + transpose(new String[][]{ + {" "," DDD "," DDDDD "," DDDDD "," DDDDD "," DDD "," "}, + {" BBB "," BBBBB ","BBBBBBB","BBBBBBB","BBBBBBB"," BBBBB "," BBB "}, + {" DDD "," B B ","B B","B B","B B"," B B "," DDD "}, + {" DAD "," B B ","C C","C C","C C"," B B "," DAD "}, + {" DAD "," B B ","C C","C C","C C"," B B "," DAD "}, + {" DAD "," B B ","C C","C C","C C"," B B "," DAD "}, + {" DDD "," B B ","B B","B B","B B"," B B "," DDD "}, + {" B~B "," BBBBB ","BBBBBBB","BBBBBBB","BBBBBBB"," BBBBB "," BBB "} + })) + //spotless:on + .addElement( + 'C', + buildHatchAdder(MTEIndustrialCompressor.class).atLeast(InputBus, OutputBus) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(5)) + .dot(1) + .buildAndChain( + onElementPass(MTEIndustrialCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 5)))) + .addElement( + 'B', + buildHatchAdder(MTEIndustrialCompressor.class).atLeast(Maintenance, Energy) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(4)) + .dot(1) + .buildAndChain( + onElementPass(MTEIndustrialCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 4)))) + .addElement('A', Glasses.chainAllGlasses()) + .addElement('D', ofBlock(GregTechAPI.sBlockCasings10, 5)) + .build(); + + public MTEIndustrialCompressor(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEIndustrialCompressor(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEIndustrialCompressor(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 4)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 4)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 4)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Compressor") + .addInfo("Controller Block for the Large Electric Compressor") + .addInfo("100% faster than singleblock machines of the same voltage") + .addInfo("Only uses 90% of the EU/t normally required") + .addInfo("Gains 2 parallels per voltage tier") + .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) + .addSeparator() + .beginStructureBlock(7, 5, 7, true) + .addController("Front Center") + .addCasingInfoMin("Electric Compressor Casing", 95, false) + .addCasingInfoMin("Compressor Pipe Casing", 45, false) + .addCasingInfoExactly("EV+ Glass", 6, false) + .addInputBus("Pipe Casings on Side", 2) + .addOutputBus("Pipe Casings on Side", 2) + .addEnergyHatch("Any Electric Compressor Casing", 1) + .addMaintenanceHatch("Any Electric Compressor Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 7, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 7, 0, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + return checkPiece(STRUCTURE_PIECE_MAIN, 3, 7, 0) && mCasingAmount >= 95; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic().setSpeedBonus(1F / 2F) + .setMaxParallelSupplier(this::getMaxParallelRecipes) + .setEuModifier(0.9F); + } + + public int getMaxParallelRecipes() { + return (2 * GTUtility.getTier(this.getMaxInputVoltage())); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.compressorRecipes; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java new file mode 100644 index 0000000000..323e09f61b --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java @@ -0,0 +1,257 @@ +package gregtech.common.tileentities.machines.multi.compressor; + +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.GTValues.AuthorFourIsTheNumber; +import static gregtech.api.enums.GTValues.Ollie; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +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.GregTechAPI; +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.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.common.blocks.BlockCasings10; + +public class MTENeutroniumCompressor extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + // spotless:off + transpose(new String[][]{ + {" CEEEEEC "," CE EC ","CE EC","E E","E E","E E","E E","E E","CE EC"," CE EC "," CEEEEEC "}, + {" CE EC ","C BBBBB C","E BBBBBBB E"," BBCCCCCBB "," BBCBBBCBB "," BBCCCCCBB "," BBCBBBCBB "," BBCCCCCBB ","E BBBBBBB E","C BBBBB C"," CE EC "}, + {"CE EC","E BBBBBBB E"," B B "," D D "," B B "," B B "," D D "," B B "," B B ","E BDDDBDB E","CE EC"}, + {"E E"," BBAAAAABB "," B B "," D D "," B B "," D D "," D D "," B B "," B B "," BBDBBBDBB ","E E"}, + {"E E"," BBAAAAABB "," B B "," D D "," B B "," B B "," D D "," D D "," D D "," BDDBDDDDB ","E E"}, + {"E E"," BBAAAAABB "," D D "," D D "," D D "," B B "," B B "," B B "," B B "," BBDBBBBDB ","E E"}, + {"E E"," BBAAAAABB "," B B "," B B "," D D "," B B "," B B "," D D "," B B "," BBDBBDBBB ","E E"}, + {"E E"," BBAAAAABB "," B B "," D D "," D D "," B B "," D D "," D D "," D D "," BBBBBDDDB ","E E"}, + {"CE EC","E BBBBBBB E"," B B "," D D "," B B "," B B "," D D "," B B "," B B ","E BDDBBBB E","CE EC"}, + {" CE EC ","C BB~BB C","E BBBBBBB E"," BBBBBBBBB "," BBBBBBBBB "," BBBBBBBBB "," BBBBBBBBB "," BBBBBBBBB ","E BBBBBBB E","C BBBBB C"," CE EC "}, + {" CEEEEEC "," CE EC ","CE EC","E E","E E","E E","E E","E E","CE EC"," CE EC "," CEEEEEC "} + })) + //spotless:on + .addElement('A', Glasses.chainAllGlasses()) + .addElement( + 'B', + buildHatchAdder(MTENeutroniumCompressor.class).atLeast(InputBus, OutputBus, Maintenance, Energy) + .casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(6)) + .dot(1) + .buildAndChain( + onElementPass(MTENeutroniumCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 6)))) + .addElement('C', ofBlock(GregTechAPI.sBlockCasings10, 8)) + .addElement('D', ofBlock(GregTechAPI.sBlockCasings10, 7)) + .addElement('E', ofFrame(Materials.NaquadahAlloy)) + .build(); + + public MTENeutroniumCompressor(final int aID, final String aName, final String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTENeutroniumCompressor(String aName) { + super(aName); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTENeutroniumCompressor(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + ITexture[] rTexture; + if (side == aFacing) { + if (aActive) { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 6)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + } else { + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 6)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) + .extFacing() + .glow() + .build() }; + } + } else { + rTexture = new ITexture[] { Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 6)) }; + } + return rTexture; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Neutronium Compressor") + .addInfo("Controller Block for the Neutronium Compressor") + .addInfo("Has a static 8 parallels") + .addInfo("Capable of compressing matter into " + EnumChatFormatting.GOLD + "singularities") + .addInfo("More advanced singularities will require even stronger compression...") + .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) + .addSeparator() + .beginStructureBlock(11, 11, 11, true) + .addController("Front Center") + .addCasingInfoMin("Neutronium Casing", 220, false) + .addCasingInfoExactly("Active Neutronium Casing", 63, false) + .addCasingInfoExactly("Any Glass", 25, false) + .addCasingInfoExactly("Naquadah Alloy Frame Box", 108, false) + .addCasingInfoExactly("Neutronium Stabilization Casing", 67, false) + .addInputBus("Any Neutronium Casing", 1) + .addOutputBus("Any Neutronium Casing", 1) + .addEnergyHatch("Any Neutronium Casing", 1) + .addMaintenanceHatch("Any Neutronium Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 5, 9, 1); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 5, 9, 1, elementBudget, env, false, true); + } + + private int mCasingAmount; + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + + return (checkPiece(STRUCTURE_PIECE_MAIN, 5, 9, 1)) && mCasingAmount >= 220; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(GTUtility.roundUpVoltage(this.getMaxInputVoltage())); + logic.setAvailableAmperage(1L); + } + + @Override + protected ProcessingLogic createProcessingLogic() { + + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { + if (recipe.mSpecialValue > 0) { + return CheckRecipeResultRegistry.NO_BLACK_HOLE; + } + return super.validateRecipe(recipe); + } + }.setMaxParallel(8); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.neutroniumCompressorRecipes; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java index 92b1c65032..e5f3cb99ab 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java @@ -1,6 +1,6 @@ package gregtech.common.tileentities.machines.multi.drone; -import static gregtech.GT_Mod.gregtechproxy; +import static gregtech.GTMod.gregtechproxy; import java.util.Optional; @@ -13,23 +13,23 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtil; +import gregtech.api.util.GTUtility; public class DroneConnection { String customName; String unlocalizedName; - GT_MetaTileEntity_MultiBlockBase machine; + MTEMultiBlockBase machine; ItemStack machineItem; ChunkCoordinates machineCoord; - GT_MetaTileEntity_DroneCentre centre; + MTEDroneCentre centre; ChunkCoordinates centreCoord; World world; - public DroneConnection(GT_MetaTileEntity_MultiBlockBase machine, GT_MetaTileEntity_DroneCentre centre) { + public DroneConnection(MTEMultiBlockBase machine, MTEDroneCentre centre) { this.machine = machine; this.machineItem = machine.getStackForm(1); machineCoord = machine.getBaseMetaTileEntity() @@ -62,19 +62,18 @@ public class DroneConnection { centreTag.getInteger("x"), centreTag.getInteger("y"), centreTag.getInteger("z")); - this.centre = (GT_MetaTileEntity_DroneCentre) getLoadedGT_BaseMachineAt(centreCoord, world, true); + this.centre = (MTEDroneCentre) getLoadedGT_BaseMachineAt(centreCoord, world, true); this.customName = aNBT.getString("name"); this.unlocalizedName = aNBT.getString("unlocalizedName"); } - public GT_MetaTileEntity_MultiBlockBase getMachine() { + public MTEMultiBlockBase getMachine() { return machine; } public boolean reCheckConnection() { if (machine == null) this.machine = getLoadedGT_BaseMachineAt(machineCoord, world, true); - if (centre == null) - this.centre = (GT_MetaTileEntity_DroneCentre) getLoadedGT_BaseMachineAt(centreCoord, world, true); + if (centre == null) this.centre = (MTEDroneCentre) getLoadedGT_BaseMachineAt(centreCoord, world, true); if (machine != null && centre != null && !centre.getConnectionList() .contains(this)) @@ -84,7 +83,7 @@ public class DroneConnection { } public String getCustomName(boolean localized) { - if (localized) return GT_LanguageManager.getTranslation("gt.blockmachines." + unlocalizedName + ".name"); + if (localized) return GTLanguageManager.getTranslation("gt.blockmachines." + unlocalizedName + ".name"); return customName; } @@ -100,7 +99,7 @@ public class DroneConnection { return machine != null && machine.shouldDisplayShutDownReason() && !machine.getBaseMetaTileEntity() .isActive() - && GT_Utility.isStringValid( + && GTUtility.isStringValid( machine.getBaseMetaTileEntity() .getLastShutDownReason() .getDisplayString()) @@ -122,11 +121,10 @@ public class DroneConnection { return aNBT; } - public GT_MetaTileEntity_MultiBlockBase getLoadedGT_BaseMachineAt(ChunkCoordinates coords, World world, - boolean isLoaded) { - TileEntity te = GT_Util.getTileEntity(world, coords, isLoaded); + public MTEMultiBlockBase getLoadedGT_BaseMachineAt(ChunkCoordinates coords, World world, boolean isLoaded) { + TileEntity te = GTUtil.getTileEntity(world, coords, isLoaded); if (te == null) return null; - return (GT_MetaTileEntity_MultiBlockBase) ((IGregTechTileEntity) te).getMetaTileEntity(); + return (MTEMultiBlockBase) ((IGregTechTileEntity) te).getMetaTileEntity(); } private NBTTagCompound transCoordsToNBT(ChunkCoordinates coord) { diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java deleted file mode 100644 index 8d2eaa0480..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java +++ /dev/null @@ -1,917 +0,0 @@ -package gregtech.common.tileentities.machines.multi.drone; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_Values.AuthorSilverMoon; -import static gregtech.api.multitileentity.multiblock.casing.Glasses.chainAllGlasses; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; - -import java.io.IOException; -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Optional; -import java.util.stream.Collectors; - -import net.minecraft.client.Minecraft; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.HashMultimap; -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizon.structurelib.util.Vec3Impl; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.api.math.MainAxisAlignment; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.Scrollable; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; - -import appeng.api.util.DimensionalCoord; -import appeng.api.util.WorldCoord; -import appeng.client.render.BlockPosHighlighter; -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.SimpleCheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReason; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer; -import gregtech.common.items.GT_TierDrone; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_DroneCentre extends - GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { - - private static final IIconContainer ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_ACTIVE"); - private static final IIconContainer FACE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_FACE"); - private static final IIconContainer INACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_INACTIVE"); - private final int MACHINE_LIST_WINDOW_ID = 10; - private final int CUSTOM_NAME_WINDOW_ID = 11; - private static final int CASINGS_MIN = 85; - private int mCasingAmount = 0; - private Vec3Impl centreCoord; - private int droneLevel = 0; - private int buttonID; - private String searchFilter = ""; - private boolean useRender = true; - private boolean showLocalizedName = false; - private String sort = "distance"; - private List connectionList = new ArrayList<>(); - public HashMap tempNameList = new HashMap<>(); - // Save centre by dimID - private static final HashMultimap droneMap = HashMultimap.create(); - // spotless off - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape( - "main", - transpose( - new String[][] { { " ", " ", " ", " ", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, - { "CC~CC", "C C", "C C", "C C", "CAAAC", "CCCCC", "CAAAC", "C C", "CCCCC" }, - { "CCCCC", "CBBBC", "CBDBC", "CBBBC", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, - { "C C", " ", " ", " ", " ", " ", " ", " ", "C C" } })) - .addElement( - 'C', - buildHatchAdder(GT_MetaTileEntity_DroneCentre.class).atLeast(InputBus) - .casingIndex(59) - .dot(1) - .buildAndChain( - onElementPass( - GT_MetaTileEntity_DroneCentre::onCasingAdded, - ofBlock(GregTech_API.sBlockCasings4, 2)))) - .addElement('A', chainAllGlasses()) - .addElement('B', ofBlock(GregTech_API.sBlockCasings1, 11)) - .addElement('D', ofBlock(GregTech_API.sBlockCasings4, 0)) - .build(); - - // spotless on - public GT_MetaTileEntity_DroneCentre(String name) { - super(name); - } - - public GT_MetaTileEntity_DroneCentre(int ID, String Name, String NameRegional) { - super(ID, Name, NameRegional); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_DroneCentre(super.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (getBaseMetaTileEntity().isActive()) { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder() - .addIcon(ACTIVE) - .extFacing() - .build() }; - } else { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder() - .addIcon(INACTIVE) - .extFacing() - .build() }; - } - } else if (side == aFacing.getOpposite()) { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder() - .addIcon(FACE) - .extFacing() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59) }; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Drone Centre") - .addInfo("Drone Center Controller") - .addInfo(EnumChatFormatting.AQUA + "Drone #10032, cleared for takeoff!") - .addInfo("Monitors multiblock machines in range.") - .addInfo("Replace maintenance hatch on other multi with drone downlink module.") - .addInfo("Provides maintenance, power control, monitoring and etc.") - .addInfo("Range is determined by drone tier: T1-128, T2-512, T3-4096") - .addInfo("Place drones in input bus; only one needed to operate.") - .addInfo("Automatically upgrade based on the drone level in the input bus.") - .addInfo("There is a chance per second that the drone will crash.") - .addInfo("Chance is determined by drone tier: T1-1/28800, T2-1/172800, T3-0") - .addInfo("If machine is too far, remote control would not available") - .addInfo(AuthorSilverMoon) - .addSeparator() - .beginStructureBlock(5, 4, 9, false) - .addController("Front center") - .addCasingInfoRange("Stable Titanium Machine Casing", CASINGS_MIN, 91, false) - .addCasingInfoExactly("Heat Proof Machine Casing", 8, false) - .addCasingInfoExactly("Robust Tungstensteel Machine Casing", 1, false) - .addCasingInfoExactly("Any tiered glass", 6, false) - .addInputBus("Any Titanium Casing", 1) - .addStructureInfo("No maintenance hatch needed") - .addSeparator() - .toolTipFinisher("Gregtech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece("main", stackSize, hintsOnly, 2, 1, 0); - } - - @Override - public int survivalConstruct(ItemStack stack, int elementBudget, ISurvivalBuildEnvironment env) { - if (mMachine) return -1; - return survivialBuildPiece("main", stack, 2, 1, 0, elementBudget, env, false, true); - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - // I don't think a drone can take off HORIZONTALLY! - return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() - && !f.isVerticallyFliped(); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - private void onCasingAdded() { - mCasingAmount++; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mCasingAmount = 0; - return checkPiece("main", 2, 1, 0) && mCasingAmount >= CASINGS_MIN; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); - useRender = !useRender; - aPlayer.addChatComponentMessage( - new ChatComponentTranslation( - "GT5U.machines.dronecentre." + (useRender ? "enableRender" : "disableRender"))); - if (useRender) { - createRenderBlock(); - } else { - destroyRenderBlock(); - } - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return true; - } - - @Override - public void stopMachine(@NotNull ShutDownReason reason) { - destroyRenderBlock(); - super.stopMachine(reason); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - if (aTick % 20 == 0) { - if (switch (droneLevel) { - case 1 -> getBaseMetaTileEntity().getRandomNumber(28800); - case 2 -> getBaseMetaTileEntity().getRandomNumber(172800); - default -> 1; - } == 0) { - droneLevel = 0; - startRecipeProcessing(); - if (!tryConsumeDrone()) stopMachine(ShutDownReasonRegistry.outOfStuff("Any Drone", 1)); - endRecipeProcessing(); - } - } - // Clean invalid connections every 4 seconds - if (aTick % 80 == 0) connectionList.removeIf(v -> !v.isValid()); - } - if (mMaxProgresstime > 0 && mMaxProgresstime - mProgresstime == 1) destroyRenderBlock(); - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - droneLevel = aNBT.getInteger("drone"); - useRender = aNBT.getBoolean("useRender"); - sort = aNBT.getString("sort"); - NBTTagCompound nameList = aNBT.getCompoundTag("conList"); - for (String s : nameList.func_150296_c()) { - tempNameList.put(s, nameList.getString(s)); - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("drone", droneLevel); - aNBT.setBoolean("useRender", useRender); - aNBT.setString("sort", sort); - NBTTagCompound conList = new NBTTagCompound(); - for (DroneConnection con : connectionList) { - if (!con.customName.equals(con.machine.getLocalName())) - conList.setString(con.machineCoord.toString(), con.customName); - } - aNBT.setTag("conList", conList); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setInteger("connectionCount", connectionList.size()); - if (droneLevel != 0) tag.setInteger("droneLevel", droneLevel); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - NBTTagCompound tag = accessor.getNBTData(); - currenttip.add( - EnumChatFormatting.AQUA + StatCollector.translateToLocal("GT5U.waila.drone_downlink.droneLevel") - + tag.getInteger("droneLevel")); - currenttip.add( - StatCollector.translateToLocal("GT5U.waila.drone_downlink.connectionCount") - + tag.getInteger("connectionCount")); - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - @NotNull - public CheckRecipeResult checkProcessing() { - if (droneLevel == 0) { - if (!tryConsumeDrone()) return SimpleCheckRecipeResult.ofFailure("drone_noDrone"); - } - if (droneLevel == 1 || droneLevel == 2) tryUpdateDrone(); - mMaxProgresstime = 200 * droneLevel; - createRenderBlock(); - return SimpleCheckRecipeResult.ofSuccess("drone_operating"); - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - if (aBaseMetaTileEntity.isServerSide()) { - if (droneMap.containsValue(this)) return; - centreCoord = new Vec3Impl( - getBaseMetaTileEntity().getXCoord(), - getBaseMetaTileEntity().getYCoord(), - getBaseMetaTileEntity().getZCoord()); - droneMap.put(getBaseMetaTileEntity().getWorld().provider.dimensionId, this); - } - } - - @Override - public void onBlockDestroyed() { - destroyRenderBlock(); - connectionList.clear(); - if (droneLevel != 0) spawnDroneItem(); - super.onBlockDestroyed(); - } - - private void spawnDroneItem() { - ItemStack insideDrone = new ItemStack(switch (droneLevel) { - case 1: - yield ItemList.TierdDrone0.getItem(); - case 2: - yield ItemList.TierdDrone1.getItem(); - case 3: - yield ItemList.TierdDrone2.getItem(); - default: - yield null; - }, 1); - final EntityItem tItemEntity = new EntityItem( - getBaseMetaTileEntity().getWorld(), - getBaseMetaTileEntity().getXCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, - getBaseMetaTileEntity().getYCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, - getBaseMetaTileEntity().getZCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, - insideDrone); - tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D); - tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.25D); - tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D); - getBaseMetaTileEntity().getWorld() - .spawnEntityInWorld(tItemEntity); - } - - @Override - public void onRemoval() { - droneMap.remove(getBaseMetaTileEntity().getWorld().provider.dimensionId, this); - } - - @Override - public void onUnload() { - droneMap.remove(getBaseMetaTileEntity().getWorld().provider.dimensionId, this); - } - - public List getConnectionList() { - return connectionList; - } - - public int getRange() { - return switch (droneLevel) { - case 1 -> 128; - case 2 -> 512; - case 3 -> 4096; - default -> 0; - }; - } - - public Vec3Impl getCoords() { - return centreCoord; - } - - private boolean tryConsumeDrone() { - List inputs = getStoredInputs(); - if (inputs.isEmpty()) return false; - for (ItemStack item : inputs) { - if (item != null && item.getItem() instanceof GT_TierDrone drone) { - this.droneLevel = drone.getLevel(); - item.stackSize--; - updateSlots(); - return true; - } - } - return false; - } - - private void tryUpdateDrone() { - List inputs = getStoredInputs(); - if (inputs.isEmpty()) return; - for (ItemStack item : inputs) { - if (item != null && item.getItem() instanceof GT_TierDrone drone) { - if (drone.getLevel() <= this.droneLevel) continue; - this.droneLevel = drone.getLevel(); - item.stackSize--; - updateSlots(); - return; - } - } - } - - private void createRenderBlock() { - if (!useRender) return; - int x = getBaseMetaTileEntity().getXCoord(); - int y = getBaseMetaTileEntity().getYCoord(); - int z = getBaseMetaTileEntity().getZCoord(); - - double xOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetX; - double zOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - double yOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetY; - - this.getBaseMetaTileEntity() - .getWorld() - .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); - this.getBaseMetaTileEntity() - .getWorld() - .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), GregTech_API.sDroneRender); - } - - private void destroyRenderBlock() { - int x = getBaseMetaTileEntity().getXCoord(); - int y = getBaseMetaTileEntity().getYCoord(); - int z = getBaseMetaTileEntity().getZCoord(); - - double xOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetX; - double zOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - double yOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetY; - - this.getBaseMetaTileEntity() - .getWorld() - .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - super.addUIWidgets(builder, buildContext); - buildContext.addSyncedWindow(MACHINE_LIST_WINDOW_ID, this::createMachineListWindow); - buildContext.addSyncedWindow(CUSTOM_NAME_WINDOW_ID, this::createCustomNameWindow); - builder.widget(// Machine List - new ButtonWidget().setOnClick( - (clickData, widget) -> { - if (!widget.isClient()) widget.getContext() - .openSyncedWindow(MACHINE_LIST_WINDOW_ID); - }) - .setSize(16, 16) - .setBackground(() -> { - List UI = new ArrayList<>(); - UI.add(GT_UITextures.BUTTON_STANDARD); - UI.add(GT_UITextures.OVERLAY_BUTTON_WHITELIST); - return UI.toArray(new IDrawable[0]); - }) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_open_list")) - .setPos(94, 91) - .setEnabled(var -> getBaseMetaTileEntity().isActive())) - .widget(// Turn on ALL machines - new ButtonWidget().setOnClick((clickData, widget) -> { - if (!widget.isClient()) { - if (!getBaseMetaTileEntity().isActive()) { - widget.getContext() - .getPlayer() - .addChatComponentMessage( - new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown")); - return; - } - for (DroneConnection mte : connectionList) { - mte.machine.getBaseMetaTileEntity() - .enableWorking(); - } - widget.getContext() - .getPlayer() - .addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.turnon")); - widget.getContext() - .getPlayer() - .closeScreen(); - } - }) - .setSize(16, 16) - .setBackground(() -> { - List UI = new ArrayList<>(); - UI.add(GT_UITextures.BUTTON_STANDARD); - UI.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON); - return UI.toArray(new IDrawable[0]); - }) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_poweron_all")) - .setPos(146, 91) - .setEnabled(var -> getBaseMetaTileEntity().isActive())) - .widget(// Turn off ALL machines - new ButtonWidget().setOnClick((clickData, widget) -> { - if (!widget.isClient()) { - if (!getBaseMetaTileEntity().isActive()) { - widget.getContext() - .getPlayer() - .addChatComponentMessage( - new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown")); - return; - } - for (DroneConnection mte : connectionList) { - mte.machine.getBaseMetaTileEntity() - .disableWorking(); - } - widget.getContext() - .getPlayer() - .addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.turnoff")); - widget.getContext() - .getPlayer() - .closeScreen(); - } - }) - .setSize(16, 16) - .setBackground(() -> { - List UI = new ArrayList<>(); - UI.add(GT_UITextures.BUTTON_STANDARD); - UI.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF); - return UI.toArray(new IDrawable[0]); - }) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_poweroff_all")) - .setPos(120, 91) - .setEnabled(var -> getBaseMetaTileEntity().isActive())) - .widget(new FakeSyncWidget.ListSyncer<>(() -> connectionList, var1 -> { - connectionList.clear(); - connectionList.addAll(var1); - }, (buffer, j) -> { - try { - buffer.writeNBTTagCompoundToBuffer(j.transConnectionToNBT()); - } catch (IOException e) { - GT_Log.err.println(e.getCause()); - } - }, buffer -> { - try { - return new DroneConnection(buffer.readNBTTagCompoundFromBuffer()); - } catch (IOException e) { - GT_Log.err.println(e.getCause()); - } - return null; - })); - } - - protected ModularWindow createMachineListWindow(final EntityPlayer player) { - int heightCoff = getBaseMetaTileEntity().isServerSide() ? 0 - : Minecraft.getMinecraft().currentScreen.height - 40; - ModularWindow.Builder builder = ModularWindow.builder(260, heightCoff); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.setGuiTint(getGUIColorization()); - builder.widget( - ButtonWidget.closeWindowButton(true) - .setPos(245, 3)); - builder.widget( - new TextWidget(EnumChatFormatting.BOLD + StatCollector.translateToLocal("GT5U.gui.text.drone_title")) - .setScale(2) - .setTextAlignment(Alignment.Center) - .setPos(0, 10) - .setSize(260, 8)); - // SearchBar - builder.widget(new TextFieldWidget() { - - @Override - public void onRemoveFocus() { - super.onRemoveFocus(); - syncToServer(2, buffer -> {}); - } - - // Refresh - @Override - public void readOnServer(int id, PacketBuffer buf) { - switch (id) { - case 1 -> super.readOnServer(id, buf); - case 2 -> { - getContext().closeWindow(MACHINE_LIST_WINDOW_ID); - getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); - } - } - } - }.setGetter(() -> searchFilter) - .setSetter(var -> searchFilter = var) - .setTextAlignment(Alignment.CenterLeft) - .setTextColor(Color.WHITE.dark(1)) - .setFocusOnGuiOpen(false) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2)) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.text.drone_search")) - .setPos(50, 30) - .setSize(200, 16)) - // Sort button - .widget(new ButtonWidget() { - - @Override - public ClickResult onClick(int buttonId, boolean doubleClick) { - ClickResult result = super.onClick(buttonId, doubleClick); - syncToServer(2, buffer -> {}); - return result; - } - - @Override - public void readOnServer(int id, PacketBuffer buf) { - switch (id) { - case 1 -> super.readOnServer(id, buf); - case 2 -> { - getContext().closeWindow(MACHINE_LIST_WINDOW_ID); - getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); - } - } - } - }.setOnClick((clickData, widget) -> { - switch (sort) { - case "name" -> sort = "distance"; - case "distance" -> sort = "error"; - case "error" -> sort = "name"; - } - }) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_" + sort)) - .setBackground( - () -> new IDrawable[] { GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_SORTING_MODE }) - .setPos(10, 30) - .setSize(16, 16)) - .widget(new FakeSyncWidget.StringSyncer(() -> sort, var1 -> sort = var1)) - // Localized Button - .widget(new ButtonWidget() { - - @Override - public ClickResult onClick(int buttonId, boolean doubleClick) { - ClickResult result = super.onClick(buttonId, doubleClick); - syncToServer(2, buffer -> {}); - return result; - } - - @Override - public void readOnServer(int id, PacketBuffer buf) { - switch (id) { - case 1 -> super.readOnServer(id, buf); - case 2 -> { - getContext().closeWindow(MACHINE_LIST_WINDOW_ID); - getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); - } - } - } - }.setOnClick((clickData, widget) -> showLocalizedName = !showLocalizedName) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_showLocalName")) - .setBackground( - () -> new IDrawable[] { - showLocalizedName ? GT_UITextures.BUTTON_STANDARD_PRESSED : GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_CYCLIC }) - .setPos(30, 30) - .setSize(16, 16)); - // Sort first - switch (sort) { - case "name" -> connectionList = connectionList.stream() - .sorted( - (o1, o2) -> Collator.getInstance(Locale.UK) - .compare(o1.getCustomName(false), o2.getCustomName(false))) - .collect(Collectors.toList()); - case "distance" -> connectionList = connectionList.stream() - .sorted(Comparator.comparing(DroneConnection::getDistanceSquared)) - .collect(Collectors.toList()); - case "error" -> connectionList = connectionList.stream() - .sorted( - Comparator.comparing(DroneConnection::isMachineShutdown) - .reversed() - .thenComparing(DroneConnection::getDistanceSquared)) - .collect(Collectors.toList()); - } - - Scrollable MachineContainer = new Scrollable().setVerticalScroll(); - int posY = 0; - for (int i = 0; i < connectionList.size(); i++) { - DroneConnection connection = connectionList.get(i); - if (!connection.customName.toLowerCase() - .contains(searchFilter.toLowerCase())) continue; - ItemStackHandler drawitem = new ItemStackHandler(1); - drawitem.setStackInSlot(0, connection.machineItem); - DynamicPositionedRow row = new DynamicPositionedRow().setSynced(false); - GT_MetaTileEntity_MultiBlockBase coreMachine = connection.machine; - int finalI = i; - row.widget( - SlotWidget.phantom(drawitem, 0) - .disableInteraction() - .setPos(0, 0)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - buttonID = finalI; - if (!widget.isClient()) widget.getContext() - .openSyncedWindow(CUSTOM_NAME_WINDOW_ID); - }) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_setname")) - .setBackground( - () -> new IDrawable[] { GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_PRINT }) - .setSize(16, 16)); - // Client can't handle unloaded machines - row.widget( - new ButtonWidget().setOnClick( - (clickData, widget) -> Optional.ofNullable(coreMachine) - .ifPresent(machine -> { - if (!getBaseMetaTileEntity().isActive()) { - player.addChatComponentMessage( - new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown")); - return; - } - if (machine.isAllowedToWork()) { - machine.disableWorking(); - } else { - machine.enableWorking(); - } - })) - .setPlayClickSoundResource( - () -> Optional.ofNullable(coreMachine) - .filter(GT_MetaTileEntity_MultiBlockBase::isAllowedToWork) - .map(var -> SoundResource.GUI_BUTTON_UP.resourceLocation) - .orElse(SoundResource.GUI_BUTTON_DOWN.resourceLocation)) - .setBackground( - () -> Optional.ofNullable(coreMachine) - .map( - machine -> machine.isAllowedToWork() - ? new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, - GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON } - : new IDrawable[] { GT_UITextures.BUTTON_STANDARD, - GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF }) - .orElse(new IDrawable[] { GT_UITextures.OVERLAY_BUTTON_CROSS })) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer( - () -> Optional.ofNullable(coreMachine) - .map(GT_MetaTileEntity_MultiBlockBase::isAllowedToWork) - .orElse(false), - var -> Optional.ofNullable(coreMachine) - .ifPresent(machine -> { - if (var) machine.enableWorking(); - else machine.disableWorking(); - })), - builder) - .addTooltip( - coreMachine != null ? StatCollector.translateToLocal("GT5U.gui.button.power_switch") - : StatCollector.translateToLocal("GT5U.gui.button.drone_outofrange")) - .setSize(16, 16)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (widget.isClient()) { - highlightMachine(player, connection.machineCoord); - player.closeScreen(); - } - }) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_highlight")) - .setBackground( - new IDrawable[] { GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_INVERT_REDSTONE }) - .setSize(16, 16)); - // Show the reason why the machine shutdown - row.widget( - new DrawableWidget().dynamicTooltip( - () -> Collections.singletonList( - Optional.ofNullable(coreMachine) - .map( - machine -> machine.getBaseMetaTileEntity() - .getLastShutDownReason() - .getDisplayString()) - .orElse(""))) - .setBackground(GT_UITextures.PICTURE_STALLED_ELECTRICITY) - .setSize(16, 16) - .setEnabled( - var -> coreMachine != null && coreMachine.shouldDisplayShutDownReason() - && !coreMachine.getBaseMetaTileEntity() - .isActive() - && GT_Utility.isStringValid( - coreMachine.getBaseMetaTileEntity() - .getLastShutDownReason() - .getDisplayString()) - && coreMachine.getBaseMetaTileEntity() - .wasShutdown()) - .attachSyncer( - new ShutDownReasonSyncer( - () -> Optional.ofNullable(coreMachine) - .map( - var -> coreMachine.getBaseMetaTileEntity() - .getLastShutDownReason()) - .orElse(ShutDownReasonRegistry.NONE), - reason -> Optional.ofNullable(coreMachine) - .ifPresent( - machine -> coreMachine.getBaseMetaTileEntity() - .setShutDownReason(reason))), - builder) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer( - () -> Optional.ofNullable(coreMachine) - .map( - var -> coreMachine.getBaseMetaTileEntity() - .wasShutdown()) - .orElse(false), - wasShutDown -> Optional.ofNullable(coreMachine) - .ifPresent( - machine -> coreMachine.getBaseMetaTileEntity() - .setShutdownStatus(wasShutDown))), - builder)); - row.widget( - new TextWidget( - connectionList.get(i) - .getCustomName(showLocalizedName)).setTextAlignment(Alignment.CenterLeft) - .setPos(0, 4)); - MachineContainer.widget( - row.setAlignment(MainAxisAlignment.SPACE_BETWEEN) - .setSpace(4) - .setPos(0, posY)); - posY += 20; - } - return builder.widget( - MachineContainer.setPos(10, 50) - .setSize(240, heightCoff - 60)) - .setDraggable(false) - .build(); - } - - protected ModularWindow createCustomNameWindow(final EntityPlayer player) { - ModularWindow.Builder builder = ModularWindow.builder(150, 40); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.setGuiTint(getGUIColorization()); - return builder.widget( - ButtonWidget.closeWindowButton(true) - .setPos(135, 3)) - .widget( - new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.drone_custom_name")) - .setTextAlignment(Alignment.Center) - .setPos(0, 5) - .setSize(150, 8)) - .widget(new TextFieldWidget() { - - @Override - public void onDestroy() { - if (isClient()) return; - getContext().closeWindow(MACHINE_LIST_WINDOW_ID); - getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); - } - }.setGetter( - () -> connectionList.get(buttonID) - .getCustomName(false)) - .setSetter( - var -> connectionList.get(buttonID) - .setCustomName(var)) - .setTextAlignment(Alignment.CenterLeft) - .setTextColor(Color.WHITE.dark(1)) - .setFocusOnGuiOpen(true) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2)) - .setPos(10, 16) - .setSize(130, 16)) - .build(); - } - - // Just like HIGHLIGHT_INTERFACE (and exactly from it) - private void highlightMachine(EntityPlayer player, ChunkCoordinates machineCoord) { - DimensionalCoord blockPos = new DimensionalCoord( - machineCoord.posX, - machineCoord.posY, - machineCoord.posZ, - player.dimension); - WorldCoord blockPos2 = new WorldCoord((int) player.posX, (int) player.posY, (int) player.posZ); - BlockPosHighlighter.highlightBlock( - blockPos, - System.currentTimeMillis() + 500 * WorldCoord.getTaxicabDistance(blockPos, blockPos2)); - } - - public static HashMultimap getCentreMap() { - return droneMap; - } - - @Override - public boolean getDefaultHasMaintenanceChecks() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java deleted file mode 100644 index 33dad93d52..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java +++ /dev/null @@ -1,329 +0,0 @@ -package gregtech.common.tileentities.machines.multi.drone; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; -import java.util.Set; -import java.util.stream.Collectors; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.util.Vec3Impl; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.render.TextureFactory; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_Hatch_DroneDownLink extends GT_MetaTileEntity_Hatch_Maintenance { - - private Vec3Impl downlinkCoord; - private DroneConnection connection; - // This has to be existed for doing random damage. - private GT_MetaTileEntity_MultiBlockBase machine; - private static final IIconContainer moduleActive = new Textures.BlockIcons.CustomIcon( - "iconsets/OVERLAY_DRONE_MODULE_ACTIVE"); - - public GT_MetaTileEntity_Hatch_DroneDownLink(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier); - } - - public GT_MetaTileEntity_Hatch_DroneDownLink(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures, false); - } - - @Override - public String[] getDescription() { - return new String[] { "Built-in powerful navigation beacon!" }; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister aBlockIconRegister) { - super.registerIcons(aBlockIconRegister); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(moduleActive) }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(moduleActive) }; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_DroneDownLink( - this.mName, - this.mTier, - this.mDescriptionArray, - this.mTextures); - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - downlinkCoord = new Vec3Impl( - getBaseMetaTileEntity().getXCoord(), - getBaseMetaTileEntity().getYCoord(), - getBaseMetaTileEntity().getZCoord()); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - if (hasConnection()) { - if (connection.centre.getBaseMetaTileEntity() - .isActive()) { - doNormalMaintain(); - } else { - // Centre offline? ...do nothing. - // machine.causeMaintenanceIssue(); - } - } else { - // If the connection invalid, set it to null. - // Find connection every 10 second - if (aTick % 200 == 0) { - connection = null; - tryFindConnection(); - // Let's have some "surprise". Sorry, surprise party is over. - // if (this.machine != null && this.machine.isValid()) { - // machine.causeMaintenanceIssue(); - } - } - } - } - - private void doNormalMaintain() { - this.mWrench = this.mScrewdriver = this.mSoftHammer = this.mHardHammer = this.mCrowbar = this.mSolderingTool = true; - connection.machine.mWrench = connection.machine.mScrewdriver = connection.machine.mSoftHammer = connection.machine.mHardHammer = connection.machine.mCrowbar = connection.machine.mSolderingTool = true; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - if (aBaseMetaTileEntity.isClientSide()) return true; - if (side == aBaseMetaTileEntity.getFrontFacing()) { - if (aPlayer instanceof FakePlayer) return false; - if (connection == null || !connection.isValid()) { - aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.noconnection")); - return false; - } - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - return false; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public void onRemoval() { - if (hasConnection()) connection.machine = null; - } - - private boolean hasConnection() { - if (connection == null) return false; - if (connection.isValid()) return true; - return connection.reCheckConnection(); - } - - /** - * Find a drone connection. This will search for all DC in the same dimension, then find one in range. - */ - private void tryFindConnection() { - if (GT_MetaTileEntity_DroneCentre.getCentreMap() - .containsKey(getBaseMetaTileEntity().getWorld().provider.dimensionId)) { - List target = GT_MetaTileEntity_DroneCentre.getCentreMap() - .get(getBaseMetaTileEntity().getWorld().provider.dimensionId) - .stream() - .collect(Collectors.toList()); - for (GT_MetaTileEntity_DroneCentre centre : target) { - if (centre.getCoords() - .withinDistance(this.downlinkCoord, centre.getRange()) - && centre.getBaseMetaTileEntity() - .isActive()) { - GT_MetaTileEntity_MultiBlockBase machine = tryFindCoreGTMultiBlock(); - if (machine != null && machine.isValid()) { - this.machine = machine; - connection = new DroneConnection(machine, centre); - connection.centre.getConnectionList() - .add(connection); - return; - } - } - } - } - } - - // Find mainframe. Mainly from a method in GT_API——This will cause performance issue! Do not call it frequently. - private GT_MetaTileEntity_MultiBlockBase tryFindCoreGTMultiBlock() { - Queue tQueue = new LinkedList<>(); - Set visited = new HashSet<>(80); - tQueue.add( - this.getBaseMetaTileEntity() - .getCoords()); - World world = this.getBaseMetaTileEntity() - .getWorld(); - while (!tQueue.isEmpty()) { - final ChunkCoordinates aCoords = tQueue.poll(); - final TileEntity tTileEntity; - final boolean isMachineBlock; - tTileEntity = world.getTileEntity(aCoords.posX, aCoords.posY, aCoords.posZ); - Block block = world.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ); - // Plascrete block isn't registered as machineBlock, therefore we have to check it manually so that drone - // can work with cleanroom. - // Todo: loading cleanroom's config for other blocks - isMachineBlock = GregTech_API - .isMachineBlock(block, world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ)) - || (block == GregTech_API.sBlockReinforced - && world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ) == 2); - // See if the block itself is MultiBlock, also the one we need. - if (tTileEntity instanceof IGregTechTileEntity te - && te.getMetaTileEntity() instanceof GT_MetaTileEntity_MultiBlockBase mte) - if (mte.mMaintenanceHatches.contains(this)) return mte; - - // Now see if we should add the nearby blocks to the queue: - // 1) If we've visited less than 5 blocks, then yes - // 2) If the tile says we should recursively update (pipes don't, machine blocks do) - // 3) If the block at the coordinates is marked as a machine block - if (visited.size() < 5 - || (tTileEntity instanceof IMachineBlockUpdateable - && ((IMachineBlockUpdateable) tTileEntity).isMachineBlockUpdateRecursive()) - || isMachineBlock) { - ChunkCoordinates tCoords; - - if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX + 1, aCoords.posY, aCoords.posZ))) - tQueue.add(tCoords); - if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX - 1, aCoords.posY, aCoords.posZ))) - tQueue.add(tCoords); - if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY + 1, aCoords.posZ))) - tQueue.add(tCoords); - if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY - 1, aCoords.posZ))) - tQueue.add(tCoords); - if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ + 1))) - tQueue.add(tCoords); - if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ - 1))) - tQueue.add(tCoords); - } - } - return null; - } - - @Override - public boolean doesBindPlayerInventory() { - return false; - } - - @Override - public int getGUIWidth() { - return 150; - } - - @Override - public int getGUIHeight() { - return 40; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.setGuiTint(getGUIColorization()); - builder.widget( - ButtonWidget.closeWindowButton(true) - .setPos(135, 3)) - .widget( - new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.drone_custom_name")) - .setTextAlignment(Alignment.Center) - .setPos(0, 5) - .setSize(150, 8)) - .widget( - new TextFieldWidget().setGetter(() -> connection == null ? "" : connection.getCustomName(false)) - .setSetter(var -> { if (connection != null) connection.setCustomName(var); }) - .setTextAlignment(Alignment.CenterLeft) - .setTextColor(Color.WHITE.dark(1)) - .setFocusOnGuiOpen(true) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2)) - .setPos(10, 16) - .setSize(130, 16)) - .build(); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setBoolean("connection", connection == null); - if (connection != null) { - tag.setInteger("x", connection.centreCoord.posX); - tag.setInteger("y", connection.centreCoord.posY); - tag.setInteger("z", connection.centreCoord.posZ); - tag.setString("name", connection.customName); - } - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - NBTTagCompound tag = accessor.getNBTData(); - if (tag.getBoolean("connection")) { - currenttip - .add(EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.waila.drone_downlink.noConnection")); - } else { - currenttip.add( - EnumChatFormatting.AQUA + StatCollector.translateToLocal("GT5U.waila.drone_downlink.connection") - + tag.getInteger("x") - + " " - + tag.getInteger("y") - + " " - + tag.getInteger("z")); - currenttip.add(EnumChatFormatting.YELLOW + tag.getString("name")); - } - super.getWailaBody(itemStack, currenttip, accessor, config); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEDroneCentre.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEDroneCentre.java new file mode 100644 index 0000000000..cf52680d71 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEDroneCentre.java @@ -0,0 +1,913 @@ +package gregtech.common.tileentities.machines.multi.drone; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GTValues.AuthorSilverMoon; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.multitileentity.multiblock.casing.Glasses.chainAllGlasses; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; + +import java.io.IOException; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.stream.Collectors; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.HashMultimap; +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizon.structurelib.util.Vec3Impl; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.MainAxisAlignment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.Scrollable; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import appeng.api.util.DimensionalCoord; +import appeng.api.util.WorldCoord; +import appeng.client.render.BlockPosHighlighter; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.ShutDownReason; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer; +import gregtech.common.items.ItemTierDrone; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEDroneCentre extends MTEExtendedPowerMultiBlockBase implements ISurvivalConstructable { + + private static final IIconContainer ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_ACTIVE"); + private static final IIconContainer FACE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_FACE"); + private static final IIconContainer INACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_INACTIVE"); + private final int MACHINE_LIST_WINDOW_ID = 10; + private final int CUSTOM_NAME_WINDOW_ID = 11; + private static final int CASINGS_MIN = 85; + private int mCasingAmount = 0; + private Vec3Impl centreCoord; + private int droneLevel = 0; + private int buttonID; + private String searchFilter = ""; + private boolean useRender = true; + private boolean showLocalizedName = false; + private String sort = "distance"; + private List connectionList = new ArrayList<>(); + public HashMap tempNameList = new HashMap<>(); + // Save centre by dimID + private static final HashMultimap droneMap = HashMultimap.create(); + // spotless off + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + "main", + transpose( + new String[][] { { " ", " ", " ", " ", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, + { "CC~CC", "C C", "C C", "C C", "CAAAC", "CCCCC", "CAAAC", "C C", "CCCCC" }, + { "CCCCC", "CBBBC", "CBDBC", "CBBBC", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, + { "C C", " ", " ", " ", " ", " ", " ", " ", "C C" } })) + .addElement( + 'C', + buildHatchAdder(MTEDroneCentre.class).atLeast(InputBus) + .casingIndex(59) + .dot(1) + .buildAndChain(onElementPass(MTEDroneCentre::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings4, 2)))) + .addElement('A', chainAllGlasses()) + .addElement('B', ofBlock(GregTechAPI.sBlockCasings1, 11)) + .addElement('D', ofBlock(GregTechAPI.sBlockCasings4, 0)) + .build(); + + // spotless on + public MTEDroneCentre(String name) { + super(name); + } + + public MTEDroneCentre(int ID, String Name, String NameRegional) { + super(ID, Name, NameRegional); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEDroneCentre(super.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (getBaseMetaTileEntity().isActive()) { + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder() + .addIcon(ACTIVE) + .extFacing() + .build() }; + } else { + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder() + .addIcon(INACTIVE) + .extFacing() + .build() }; + } + } else if (side == aFacing.getOpposite()) { + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder() + .addIcon(FACE) + .extFacing() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59) }; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Drone Centre") + .addInfo("Drone Center Controller") + .addInfo(EnumChatFormatting.AQUA + "Drone #10032, cleared for takeoff!") + .addInfo("Monitors multiblock machines in range.") + .addInfo("Replace maintenance hatch on other multi with drone downlink module.") + .addInfo("Provides maintenance, power control, monitoring and etc.") + .addInfo("Range is determined by drone tier: T1-128, T2-512, T3-4096") + .addInfo("Place drones in input bus; only one needed to operate.") + .addInfo("Automatically upgrade based on the drone level in the input bus.") + .addInfo("There is a chance per second that the drone will crash.") + .addInfo("Chance is determined by drone tier: T1-1/28800, T2-1/172800, T3-0") + .addInfo("If machine is too far, remote control would not available") + .addInfo(AuthorSilverMoon) + .addSeparator() + .beginStructureBlock(5, 4, 9, false) + .addController("Front center") + .addCasingInfoRange("Stable Titanium Machine Casing", CASINGS_MIN, 91, false) + .addCasingInfoExactly("Heat Proof Machine Casing", 8, false) + .addCasingInfoExactly("Robust Tungstensteel Machine Casing", 1, false) + .addCasingInfoExactly("Any tiered glass", 6, false) + .addInputBus("Any Titanium Casing", 1) + .addStructureInfo("No maintenance hatch needed") + .addSeparator() + .toolTipFinisher("Gregtech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece("main", stackSize, hintsOnly, 2, 1, 0); + } + + @Override + public int survivalConstruct(ItemStack stack, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece("main", stack, 2, 1, 0, elementBudget, env, false, true); + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + // I don't think a drone can take off HORIZONTALLY! + return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated() + && !f.isVerticallyFliped(); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + private void onCasingAdded() { + mCasingAmount++; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mCasingAmount = 0; + return checkPiece("main", 2, 1, 0) && mCasingAmount >= CASINGS_MIN; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); + useRender = !useRender; + aPlayer.addChatComponentMessage( + new ChatComponentTranslation( + "GT5U.machines.dronecentre." + (useRender ? "enableRender" : "disableRender"))); + if (useRender) { + createRenderBlock(); + } else { + destroyRenderBlock(); + } + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return true; + } + + @Override + public void stopMachine(@NotNull ShutDownReason reason) { + destroyRenderBlock(); + super.stopMachine(reason); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (aTick % 20 == 0) { + if (switch (droneLevel) { + case 1 -> getBaseMetaTileEntity().getRandomNumber(28800); + case 2 -> getBaseMetaTileEntity().getRandomNumber(172800); + default -> 1; + } == 0) { + droneLevel = 0; + startRecipeProcessing(); + if (!tryConsumeDrone()) stopMachine(ShutDownReasonRegistry.outOfStuff("Any Drone", 1)); + endRecipeProcessing(); + } + } + // Clean invalid connections every 4 seconds + if (aTick % 80 == 0) connectionList.removeIf(v -> !v.isValid()); + } + if (mMaxProgresstime > 0 && mMaxProgresstime - mProgresstime == 1) destroyRenderBlock(); + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + droneLevel = aNBT.getInteger("drone"); + useRender = aNBT.getBoolean("useRender"); + sort = aNBT.getString("sort"); + NBTTagCompound nameList = aNBT.getCompoundTag("conList"); + for (String s : nameList.func_150296_c()) { + tempNameList.put(s, nameList.getString(s)); + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("drone", droneLevel); + aNBT.setBoolean("useRender", useRender); + aNBT.setString("sort", sort); + NBTTagCompound conList = new NBTTagCompound(); + for (DroneConnection con : connectionList) { + if (!con.customName.equals(con.machine.getLocalName())) + conList.setString(con.machineCoord.toString(), con.customName); + } + aNBT.setTag("conList", conList); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + tag.setInteger("connectionCount", connectionList.size()); + if (droneLevel != 0) tag.setInteger("droneLevel", droneLevel); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + NBTTagCompound tag = accessor.getNBTData(); + currenttip.add( + EnumChatFormatting.AQUA + StatCollector.translateToLocal("GT5U.waila.drone_downlink.droneLevel") + + tag.getInteger("droneLevel")); + currenttip.add( + StatCollector.translateToLocal("GT5U.waila.drone_downlink.connectionCount") + + tag.getInteger("connectionCount")); + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing() { + if (droneLevel == 0) { + if (!tryConsumeDrone()) return SimpleCheckRecipeResult.ofFailure("drone_noDrone"); + } + if (droneLevel == 1 || droneLevel == 2) tryUpdateDrone(); + mMaxProgresstime = 200 * droneLevel; + createRenderBlock(); + return SimpleCheckRecipeResult.ofSuccess("drone_operating"); + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + if (aBaseMetaTileEntity.isServerSide()) { + if (droneMap.containsValue(this)) return; + centreCoord = new Vec3Impl( + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord()); + droneMap.put(getBaseMetaTileEntity().getWorld().provider.dimensionId, this); + } + } + + @Override + public void onBlockDestroyed() { + destroyRenderBlock(); + connectionList.clear(); + if (droneLevel != 0) spawnDroneItem(); + super.onBlockDestroyed(); + } + + private void spawnDroneItem() { + ItemStack insideDrone = new ItemStack(switch (droneLevel) { + case 1: + yield ItemList.TierdDrone0.getItem(); + case 2: + yield ItemList.TierdDrone1.getItem(); + case 3: + yield ItemList.TierdDrone2.getItem(); + default: + yield null; + }, 1); + final EntityItem tItemEntity = new EntityItem( + getBaseMetaTileEntity().getWorld(), + getBaseMetaTileEntity().getXCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, + getBaseMetaTileEntity().getYCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, + getBaseMetaTileEntity().getZCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, + insideDrone); + tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D); + tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.25D); + tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D); + getBaseMetaTileEntity().getWorld() + .spawnEntityInWorld(tItemEntity); + } + + @Override + public void onRemoval() { + droneMap.remove(getBaseMetaTileEntity().getWorld().provider.dimensionId, this); + } + + @Override + public void onUnload() { + droneMap.remove(getBaseMetaTileEntity().getWorld().provider.dimensionId, this); + } + + public List getConnectionList() { + return connectionList; + } + + public int getRange() { + return switch (droneLevel) { + case 1 -> 128; + case 2 -> 512; + case 3 -> 4096; + default -> 0; + }; + } + + public Vec3Impl getCoords() { + return centreCoord; + } + + private boolean tryConsumeDrone() { + List inputs = getStoredInputs(); + if (inputs.isEmpty()) return false; + for (ItemStack item : inputs) { + if (item != null && item.getItem() instanceof ItemTierDrone drone) { + this.droneLevel = drone.getLevel(); + item.stackSize--; + updateSlots(); + return true; + } + } + return false; + } + + private void tryUpdateDrone() { + List inputs = getStoredInputs(); + if (inputs.isEmpty()) return; + for (ItemStack item : inputs) { + if (item != null && item.getItem() instanceof ItemTierDrone drone) { + if (drone.getLevel() <= this.droneLevel) continue; + this.droneLevel = drone.getLevel(); + item.stackSize--; + updateSlots(); + return; + } + } + } + + private void createRenderBlock() { + if (!useRender) return; + int x = getBaseMetaTileEntity().getXCoord(); + int y = getBaseMetaTileEntity().getYCoord(); + int z = getBaseMetaTileEntity().getZCoord(); + + double xOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetX; + double zOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + double yOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetY; + + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), GregTechAPI.sDroneRender); + } + + private void destroyRenderBlock() { + int x = getBaseMetaTileEntity().getXCoord(); + int y = getBaseMetaTileEntity().getYCoord(); + int z = getBaseMetaTileEntity().getZCoord(); + + double xOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetX; + double zOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + double yOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetY; + + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + buildContext.addSyncedWindow(MACHINE_LIST_WINDOW_ID, this::createMachineListWindow); + buildContext.addSyncedWindow(CUSTOM_NAME_WINDOW_ID, this::createCustomNameWindow); + builder.widget(// Machine List + new ButtonWidget().setOnClick( + (clickData, widget) -> { + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(MACHINE_LIST_WINDOW_ID); + }) + .setSize(16, 16) + .setBackground(() -> { + List UI = new ArrayList<>(); + UI.add(GTUITextures.BUTTON_STANDARD); + UI.add(GTUITextures.OVERLAY_BUTTON_WHITELIST); + return UI.toArray(new IDrawable[0]); + }) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_open_list")) + .setPos(94, 91) + .setEnabled(var -> getBaseMetaTileEntity().isActive())) + .widget(// Turn on ALL machines + new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + if (!getBaseMetaTileEntity().isActive()) { + widget.getContext() + .getPlayer() + .addChatComponentMessage( + new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown")); + return; + } + for (DroneConnection mte : connectionList) { + mte.machine.getBaseMetaTileEntity() + .enableWorking(); + } + widget.getContext() + .getPlayer() + .addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.turnon")); + widget.getContext() + .getPlayer() + .closeScreen(); + } + }) + .setSize(16, 16) + .setBackground(() -> { + List UI = new ArrayList<>(); + UI.add(GTUITextures.BUTTON_STANDARD); + UI.add(GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON); + return UI.toArray(new IDrawable[0]); + }) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_poweron_all")) + .setPos(146, 91) + .setEnabled(var -> getBaseMetaTileEntity().isActive())) + .widget(// Turn off ALL machines + new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + if (!getBaseMetaTileEntity().isActive()) { + widget.getContext() + .getPlayer() + .addChatComponentMessage( + new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown")); + return; + } + for (DroneConnection mte : connectionList) { + mte.machine.getBaseMetaTileEntity() + .disableWorking(); + } + widget.getContext() + .getPlayer() + .addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.turnoff")); + widget.getContext() + .getPlayer() + .closeScreen(); + } + }) + .setSize(16, 16) + .setBackground(() -> { + List UI = new ArrayList<>(); + UI.add(GTUITextures.BUTTON_STANDARD); + UI.add(GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF); + return UI.toArray(new IDrawable[0]); + }) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_poweroff_all")) + .setPos(120, 91) + .setEnabled(var -> getBaseMetaTileEntity().isActive())) + .widget(new FakeSyncWidget.ListSyncer<>(() -> connectionList, var1 -> { + connectionList.clear(); + connectionList.addAll(var1); + }, (buffer, j) -> { + try { + buffer.writeNBTTagCompoundToBuffer(j.transConnectionToNBT()); + } catch (IOException e) { + GTLog.err.println(e.getCause()); + } + }, buffer -> { + try { + return new DroneConnection(buffer.readNBTTagCompoundFromBuffer()); + } catch (IOException e) { + GTLog.err.println(e.getCause()); + } + return null; + })); + } + + protected ModularWindow createMachineListWindow(final EntityPlayer player) { + int heightCoff = getBaseMetaTileEntity().isServerSide() ? 0 + : Minecraft.getMinecraft().currentScreen.height - 40; + ModularWindow.Builder builder = ModularWindow.builder(260, heightCoff); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(245, 3)); + builder.widget( + new TextWidget(EnumChatFormatting.BOLD + StatCollector.translateToLocal("GT5U.gui.text.drone_title")) + .setScale(2) + .setTextAlignment(Alignment.Center) + .setPos(0, 10) + .setSize(260, 8)); + // SearchBar + builder.widget(new TextFieldWidget() { + + @Override + public void onRemoveFocus() { + super.onRemoveFocus(); + syncToServer(2, buffer -> {}); + } + + // Refresh + @Override + public void readOnServer(int id, PacketBuffer buf) { + switch (id) { + case 1 -> super.readOnServer(id, buf); + case 2 -> { + getContext().closeWindow(MACHINE_LIST_WINDOW_ID); + getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); + } + } + } + }.setGetter(() -> searchFilter) + .setSetter(var -> searchFilter = var) + .setTextAlignment(Alignment.CenterLeft) + .setTextColor(Color.WHITE.dark(1)) + .setFocusOnGuiOpen(false) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2)) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.text.drone_search")) + .setPos(50, 30) + .setSize(200, 16)) + // Sort button + .widget(new ButtonWidget() { + + @Override + public ClickResult onClick(int buttonId, boolean doubleClick) { + ClickResult result = super.onClick(buttonId, doubleClick); + syncToServer(2, buffer -> {}); + return result; + } + + @Override + public void readOnServer(int id, PacketBuffer buf) { + switch (id) { + case 1 -> super.readOnServer(id, buf); + case 2 -> { + getContext().closeWindow(MACHINE_LIST_WINDOW_ID); + getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); + } + } + } + }.setOnClick((clickData, widget) -> { + switch (sort) { + case "name" -> sort = "distance"; + case "distance" -> sort = "error"; + case "error" -> sort = "name"; + } + }) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_" + sort)) + .setBackground( + () -> new IDrawable[] { GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_SORTING_MODE }) + .setPos(10, 30) + .setSize(16, 16)) + .widget(new FakeSyncWidget.StringSyncer(() -> sort, var1 -> sort = var1)) + // Localized Button + .widget(new ButtonWidget() { + + @Override + public ClickResult onClick(int buttonId, boolean doubleClick) { + ClickResult result = super.onClick(buttonId, doubleClick); + syncToServer(2, buffer -> {}); + return result; + } + + @Override + public void readOnServer(int id, PacketBuffer buf) { + switch (id) { + case 1 -> super.readOnServer(id, buf); + case 2 -> { + getContext().closeWindow(MACHINE_LIST_WINDOW_ID); + getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); + } + } + } + }.setOnClick((clickData, widget) -> showLocalizedName = !showLocalizedName) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_showLocalName")) + .setBackground( + () -> new IDrawable[] { + showLocalizedName ? GTUITextures.BUTTON_STANDARD_PRESSED : GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_CYCLIC }) + .setPos(30, 30) + .setSize(16, 16)); + // Sort first + switch (sort) { + case "name" -> connectionList = connectionList.stream() + .sorted( + (o1, o2) -> Collator.getInstance(Locale.UK) + .compare(o1.getCustomName(false), o2.getCustomName(false))) + .collect(Collectors.toList()); + case "distance" -> connectionList = connectionList.stream() + .sorted(Comparator.comparing(DroneConnection::getDistanceSquared)) + .collect(Collectors.toList()); + case "error" -> connectionList = connectionList.stream() + .sorted( + Comparator.comparing(DroneConnection::isMachineShutdown) + .reversed() + .thenComparing(DroneConnection::getDistanceSquared)) + .collect(Collectors.toList()); + } + + Scrollable MachineContainer = new Scrollable().setVerticalScroll(); + int posY = 0; + for (int i = 0; i < connectionList.size(); i++) { + DroneConnection connection = connectionList.get(i); + if (!connection.customName.toLowerCase() + .contains(searchFilter.toLowerCase())) continue; + ItemStackHandler drawitem = new ItemStackHandler(1); + drawitem.setStackInSlot(0, connection.machineItem); + DynamicPositionedRow row = new DynamicPositionedRow().setSynced(false); + MTEMultiBlockBase coreMachine = connection.machine; + int finalI = i; + row.widget( + SlotWidget.phantom(drawitem, 0) + .disableInteraction() + .setPos(0, 0)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + buttonID = finalI; + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(CUSTOM_NAME_WINDOW_ID); + }) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_setname")) + .setBackground( + () -> new IDrawable[] { GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_PRINT }) + .setSize(16, 16)); + // Client can't handle unloaded machines + row.widget( + new ButtonWidget().setOnClick( + (clickData, widget) -> Optional.ofNullable(coreMachine) + .ifPresent(machine -> { + if (!getBaseMetaTileEntity().isActive()) { + player.addChatComponentMessage( + new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown")); + return; + } + if (machine.isAllowedToWork()) { + machine.disableWorking(); + } else { + machine.enableWorking(); + } + })) + .setPlayClickSoundResource( + () -> Optional.ofNullable(coreMachine) + .filter(MTEMultiBlockBase::isAllowedToWork) + .map(var -> SoundResource.GUI_BUTTON_UP.resourceLocation) + .orElse(SoundResource.GUI_BUTTON_DOWN.resourceLocation)) + .setBackground( + () -> Optional.ofNullable(coreMachine) + .map( + machine -> machine.isAllowedToWork() + ? new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED, + GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON } + : new IDrawable[] { GTUITextures.BUTTON_STANDARD, + GTUITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF }) + .orElse(new IDrawable[] { GTUITextures.OVERLAY_BUTTON_CROSS })) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer( + () -> Optional.ofNullable(coreMachine) + .map(MTEMultiBlockBase::isAllowedToWork) + .orElse(false), + var -> Optional.ofNullable(coreMachine) + .ifPresent(machine -> { + if (var) machine.enableWorking(); + else machine.disableWorking(); + })), + builder) + .addTooltip( + coreMachine != null ? StatCollector.translateToLocal("GT5U.gui.button.power_switch") + : StatCollector.translateToLocal("GT5U.gui.button.drone_outofrange")) + .setSize(16, 16)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (widget.isClient()) { + highlightMachine(player, connection.machineCoord); + player.closeScreen(); + } + }) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_highlight")) + .setBackground( + new IDrawable[] { GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_INVERT_REDSTONE }) + .setSize(16, 16)); + // Show the reason why the machine shutdown + row.widget( + new DrawableWidget().dynamicTooltip( + () -> Collections.singletonList( + Optional.ofNullable(coreMachine) + .map( + machine -> machine.getBaseMetaTileEntity() + .getLastShutDownReason() + .getDisplayString()) + .orElse(""))) + .setBackground(GTUITextures.PICTURE_STALLED_ELECTRICITY) + .setSize(16, 16) + .setEnabled( + var -> coreMachine != null && coreMachine.shouldDisplayShutDownReason() + && !coreMachine.getBaseMetaTileEntity() + .isActive() + && GTUtility.isStringValid( + coreMachine.getBaseMetaTileEntity() + .getLastShutDownReason() + .getDisplayString()) + && coreMachine.getBaseMetaTileEntity() + .wasShutdown()) + .attachSyncer( + new ShutDownReasonSyncer( + () -> Optional.ofNullable(coreMachine) + .map( + var -> coreMachine.getBaseMetaTileEntity() + .getLastShutDownReason()) + .orElse(ShutDownReasonRegistry.NONE), + reason -> Optional.ofNullable(coreMachine) + .ifPresent( + machine -> coreMachine.getBaseMetaTileEntity() + .setShutDownReason(reason))), + builder) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer( + () -> Optional.ofNullable(coreMachine) + .map( + var -> coreMachine.getBaseMetaTileEntity() + .wasShutdown()) + .orElse(false), + wasShutDown -> Optional.ofNullable(coreMachine) + .ifPresent( + machine -> coreMachine.getBaseMetaTileEntity() + .setShutdownStatus(wasShutDown))), + builder)); + row.widget( + new TextWidget( + connectionList.get(i) + .getCustomName(showLocalizedName)).setTextAlignment(Alignment.CenterLeft) + .setPos(0, 4)); + MachineContainer.widget( + row.setAlignment(MainAxisAlignment.SPACE_BETWEEN) + .setSpace(4) + .setPos(0, posY)); + posY += 20; + } + return builder.widget( + MachineContainer.setPos(10, 50) + .setSize(240, heightCoff - 60)) + .setDraggable(false) + .build(); + } + + protected ModularWindow createCustomNameWindow(final EntityPlayer player) { + ModularWindow.Builder builder = ModularWindow.builder(150, 40); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + return builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(135, 3)) + .widget( + new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.drone_custom_name")) + .setTextAlignment(Alignment.Center) + .setPos(0, 5) + .setSize(150, 8)) + .widget(new TextFieldWidget() { + + @Override + public void onDestroy() { + if (isClient()) return; + getContext().closeWindow(MACHINE_LIST_WINDOW_ID); + getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID); + } + }.setGetter( + () -> connectionList.get(buttonID) + .getCustomName(false)) + .setSetter( + var -> connectionList.get(buttonID) + .setCustomName(var)) + .setTextAlignment(Alignment.CenterLeft) + .setTextColor(Color.WHITE.dark(1)) + .setFocusOnGuiOpen(true) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2)) + .setPos(10, 16) + .setSize(130, 16)) + .build(); + } + + // Just like HIGHLIGHT_INTERFACE (and exactly from it) + private void highlightMachine(EntityPlayer player, ChunkCoordinates machineCoord) { + DimensionalCoord blockPos = new DimensionalCoord( + machineCoord.posX, + machineCoord.posY, + machineCoord.posZ, + player.dimension); + WorldCoord blockPos2 = new WorldCoord((int) player.posX, (int) player.posY, (int) player.posZ); + BlockPosHighlighter.highlightBlock( + blockPos, + System.currentTimeMillis() + 500 * WorldCoord.getTaxicabDistance(blockPos, blockPos2)); + } + + public static HashMultimap getCentreMap() { + return droneMap; + } + + @Override + public boolean getDefaultHasMaintenanceChecks() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEHatchDroneDownLink.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEHatchDroneDownLink.java new file mode 100644 index 0000000000..224f187347 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/drone/MTEHatchDroneDownLink.java @@ -0,0 +1,324 @@ +package gregtech.common.tileentities.machines.multi.drone; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Set; +import java.util.stream.Collectors; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.structurelib.util.Vec3Impl; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchMaintenance; +import gregtech.api.metatileentity.implementations.MTEMultiBlockBase; +import gregtech.api.render.TextureFactory; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTEHatchDroneDownLink extends MTEHatchMaintenance { + + private Vec3Impl downlinkCoord; + private DroneConnection connection; + // This has to be existed for doing random damage. + private MTEMultiBlockBase machine; + private static final IIconContainer moduleActive = new Textures.BlockIcons.CustomIcon( + "iconsets/OVERLAY_DRONE_MODULE_ACTIVE"); + + public MTEHatchDroneDownLink(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + } + + public MTEHatchDroneDownLink(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures, false); + } + + @Override + public String[] getDescription() { + return new String[] { "Built-in powerful navigation beacon!" }; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(moduleActive) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(moduleActive) }; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchDroneDownLink(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + downlinkCoord = new Vec3Impl( + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord()); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (hasConnection()) { + if (connection.centre.getBaseMetaTileEntity() + .isActive()) { + doNormalMaintain(); + } else { + // Centre offline? ...do nothing. + // machine.causeMaintenanceIssue(); + } + } else { + // If the connection invalid, set it to null. + // Find connection every 10 second + if (aTick % 200 == 0) { + connection = null; + tryFindConnection(); + // Let's have some "surprise". Sorry, surprise party is over. + // if (this.machine != null && this.machine.isValid()) { + // machine.causeMaintenanceIssue(); + } + } + } + } + + private void doNormalMaintain() { + this.mWrench = this.mScrewdriver = this.mSoftHammer = this.mHardHammer = this.mCrowbar = this.mSolderingTool = true; + connection.machine.mWrench = connection.machine.mScrewdriver = connection.machine.mSoftHammer = connection.machine.mHardHammer = connection.machine.mCrowbar = connection.machine.mSolderingTool = true; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + if (aBaseMetaTileEntity.isClientSide()) return true; + if (side == aBaseMetaTileEntity.getFrontFacing()) { + if (aPlayer instanceof FakePlayer) return false; + if (connection == null || !connection.isValid()) { + aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.noconnection")); + return false; + } + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void onRemoval() { + if (hasConnection()) connection.machine = null; + } + + private boolean hasConnection() { + if (connection == null) return false; + if (connection.isValid()) return true; + return connection.reCheckConnection(); + } + + /** + * Find a drone connection. This will search for all DC in the same dimension, then find one in range. + */ + private void tryFindConnection() { + if (MTEDroneCentre.getCentreMap() + .containsKey(getBaseMetaTileEntity().getWorld().provider.dimensionId)) { + List target = MTEDroneCentre.getCentreMap() + .get(getBaseMetaTileEntity().getWorld().provider.dimensionId) + .stream() + .collect(Collectors.toList()); + for (MTEDroneCentre centre : target) { + if (centre.getCoords() + .withinDistance(this.downlinkCoord, centre.getRange()) + && centre.getBaseMetaTileEntity() + .isActive()) { + MTEMultiBlockBase machine = tryFindCoreGTMultiBlock(); + if (machine != null && machine.isValid()) { + this.machine = machine; + connection = new DroneConnection(machine, centre); + connection.centre.getConnectionList() + .add(connection); + return; + } + } + } + } + } + + // Find mainframe. Mainly from a method in GT_API——This will cause performance issue! Do not call it frequently. + private MTEMultiBlockBase tryFindCoreGTMultiBlock() { + Queue tQueue = new LinkedList<>(); + Set visited = new HashSet<>(80); + tQueue.add( + this.getBaseMetaTileEntity() + .getCoords()); + World world = this.getBaseMetaTileEntity() + .getWorld(); + while (!tQueue.isEmpty()) { + final ChunkCoordinates aCoords = tQueue.poll(); + final TileEntity tTileEntity; + final boolean isMachineBlock; + tTileEntity = world.getTileEntity(aCoords.posX, aCoords.posY, aCoords.posZ); + Block block = world.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ); + // Plascrete block isn't registered as machineBlock, therefore we have to check it manually so that drone + // can work with cleanroom. + // Todo: loading cleanroom's config for other blocks + isMachineBlock = GregTechAPI + .isMachineBlock(block, world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ)) + || (block == GregTechAPI.sBlockReinforced + && world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ) == 2); + // See if the block itself is MultiBlock, also the one we need. + if (tTileEntity instanceof IGregTechTileEntity te + && te.getMetaTileEntity() instanceof MTEMultiBlockBase mte) + if (mte.mMaintenanceHatches.contains(this)) return mte; + + // Now see if we should add the nearby blocks to the queue: + // 1) If we've visited less than 5 blocks, then yes + // 2) If the tile says we should recursively update (pipes don't, machine blocks do) + // 3) If the block at the coordinates is marked as a machine block + if (visited.size() < 5 + || (tTileEntity instanceof IMachineBlockUpdateable + && ((IMachineBlockUpdateable) tTileEntity).isMachineBlockUpdateRecursive()) + || isMachineBlock) { + ChunkCoordinates tCoords; + + if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX + 1, aCoords.posY, aCoords.posZ))) + tQueue.add(tCoords); + if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX - 1, aCoords.posY, aCoords.posZ))) + tQueue.add(tCoords); + if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY + 1, aCoords.posZ))) + tQueue.add(tCoords); + if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY - 1, aCoords.posZ))) + tQueue.add(tCoords); + if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ + 1))) + tQueue.add(tCoords); + if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ - 1))) + tQueue.add(tCoords); + } + } + return null; + } + + @Override + public boolean doesBindPlayerInventory() { + return false; + } + + @Override + public int getGUIWidth() { + return 150; + } + + @Override + public int getGUIHeight() { + return 40; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(135, 3)) + .widget( + new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.drone_custom_name")) + .setTextAlignment(Alignment.Center) + .setPos(0, 5) + .setSize(150, 8)) + .widget( + new TextFieldWidget().setGetter(() -> connection == null ? "" : connection.getCustomName(false)) + .setSetter(var -> { if (connection != null) connection.setCustomName(var); }) + .setTextAlignment(Alignment.CenterLeft) + .setTextColor(Color.WHITE.dark(1)) + .setFocusOnGuiOpen(true) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2)) + .setPos(10, 16) + .setSize(130, 16)) + .build(); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + tag.setBoolean("connection", connection == null); + if (connection != null) { + tag.setInteger("x", connection.centreCoord.posX); + tag.setInteger("y", connection.centreCoord.posY); + tag.setInteger("z", connection.centreCoord.posZ); + tag.setString("name", connection.customName); + } + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + NBTTagCompound tag = accessor.getNBTData(); + if (tag.getBoolean("connection")) { + currenttip + .add(EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.waila.drone_downlink.noConnection")); + } else { + currenttip.add( + EnumChatFormatting.AQUA + StatCollector.translateToLocal("GT5U.waila.drone_downlink.connection") + + tag.getInteger("x") + + " " + + tag.getInteger("y") + + " " + + tag.getInteger("z")); + currenttip.add(EnumChatFormatting.YELLOW + tag.getString("name")); + } + super.getWailaBody(itemStack, currenttip, accessor, config); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_Hatch_DegasifierControlHatch.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_Hatch_DegasifierControlHatch.java deleted file mode 100644 index 3d49f05dca..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_Hatch_DegasifierControlHatch.java +++ /dev/null @@ -1,122 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -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.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_Hatch_DegasifierControlHatch extends GT_MetaTileEntity_Hatch { - - private byte outputStrength = 0; - - private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR; - private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR_GLOW; - - public GT_MetaTileEntity_Hatch_DegasifierControlHatch(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 0, "Outputs a control signal for the Degasser Purification Unit"); - } - - public GT_MetaTileEntity_Hatch_DegasifierControlHatch(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean allowGeneralRedstoneOutput() { - 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 boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public void initDefaultModes(NBTTagCompound aNBT) { - getBaseMetaTileEntity().setActive(true); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Hatch_DegasifierControlHatch(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public String[] getDescription() { - return new String[] { "Can be installed in the Degasser Purification Unit.", - "Outputs Redstone Signal Strength based on the current control signal." }; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - outputStrength = aNBT.getByte("mOutputStrength"); - super.loadNBTData(aNBT); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setByte("mOutputStrength", outputStrength); - super.saveNBTData(aNBT); - } - - // Pass zero signal to disable output - public void updateOutputSignal(byte signal) { - outputStrength = signal; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (outputStrength > 0) { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, outputStrength); - } - } else { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 0); - } - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() - .addIcon(textureFont_Glow) - .glow() - .build() }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensHousing.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensHousing.java deleted file mode 100644 index bd025e0e69..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensHousing.java +++ /dev/null @@ -1,52 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.client.GT_TooltipHandler; - -public class GT_MetaTileEntity_LensHousing extends GT_MetaTileEntity_Hatch_InputBus { - - public GT_MetaTileEntity_LensHousing(int id, String name, String nameRegional) { - super( - id, - name, - nameRegional, - GT_TooltipHandler.Tier.UV.ordinal(), - 1, - new String[] { "Holds a lens for UV laser focusing." }); - } - - public GT_MetaTileEntity_LensHousing(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LensHousing(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public int getSizeInventory() { - return 1; - } - - @Override - public int getCircuitSlot() { - return -1; - } - - @Override - public boolean allowSelectCircuit() { - return false; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - getBaseMetaTileEntity().add1by1Slot(builder); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensIndicator.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensIndicator.java deleted file mode 100644 index c017025d42..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_LensIndicator.java +++ /dev/null @@ -1,117 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -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.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.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.render.TextureFactory; - -public class GT_MetaTileEntity_LensIndicator extends GT_MetaTileEntity_Hatch { - - private boolean isOn = false; - - private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR; - private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR_GLOW; - - public GT_MetaTileEntity_LensIndicator(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 0, "Indicates required lens swaps."); - } - - public GT_MetaTileEntity_LensIndicator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @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 allowGeneralRedstoneOutput() { - 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 initDefaultModes(NBTTagCompound aNBT) { - getBaseMetaTileEntity().setActive(true); - } - - @Override - public String[] getDescription() { - return new String[] { "Can be installed in the UV Treatment Purification Unit.", - "Outputs Redstone Signal when a lens swap is requested." }; - } - - /** - * Updates redstone output strength based on the pH of the multiblock. - */ - public void updateRedstoneOutput(boolean enabled) { - isOn = enabled; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (isOn) { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 15); - } - } else { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 0); - } - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_LensIndicator(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() - .addIcon(textureFont_Glow) - .glow() - .build() }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationPlant.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationPlant.java deleted file mode 100644 index 42bfd06d7a..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationPlant.java +++ /dev/null @@ -1,740 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static gregtech.api.enums.GT_HatchElement.Energy; -import static gregtech.api.enums.GT_HatchElement.ExoticEnergy; -import static gregtech.api.enums.GT_HatchElement.Maintenance; -import static gregtech.api.enums.GT_Values.AuthorNotAPenguin; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_StructureUtility.ofFrame; -import static gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitBase.WATER_BOOST_BONUS_CHANCE; -import static gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitBase.WATER_BOOST_NEEDED_FLUID; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -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.minecraftforge.common.util.ForgeDirection; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizons.modularui.api.drawable.shapes.Rectangle; -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.Size; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.Scrollable; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -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_ExtendedPowerMultiBlockBase; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer; -import gregtech.common.gui.modularui.widget.TextButtonWidget; - -public class GT_MetaTileEntity_PurificationPlant - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; - - /** - * Maximum distance in each axis between the purification plant main controller and the controller blocks of the - * purification plant units. - */ - public static final int MAX_UNIT_DISTANCE = 32; - - /** - * Time in ticks for a full processing cycle to complete. - */ - public static final int CYCLE_TIME_TICKS = 120 * SECONDS; - - /** - * Stores all purification units linked to this controller. - * Normally all units in this list should be valid and unique, if not then there is a bug where they are not being - * unlinked properly on block destruction/relinking. - */ - private final List mLinkedUnits = new ArrayList<>(); - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, PurificationPlantStructureString.STRUCTURE_STRING) - // Create an identical structure for survival autobuild, with water replaced with air - .addShape( - STRUCTURE_PIECE_MAIN_SURVIVAL, - Arrays.stream(PurificationPlantStructureString.STRUCTURE_STRING) - .map( - sa -> Arrays.stream(sa) - .map(s -> s.replaceAll("F", " ")) - .toArray(String[]::new)) - .toArray(String[][]::new)) - // Superplasticizer-treated high strength concrete - .addElement('A', ofBlock(GregTech_API.sBlockCasings9, 3)) - // Sterile Water Plant Casing - .addElement('B', ofBlock(GregTech_API.sBlockCasings9, 4)) - // Reinforced Sterile Water Plant Casing - .addElement('C', ofBlock(GregTech_API.sBlockCasings9, 5)) - // Tinted Industrial Glass - .addElement('D', ofBlockAnyMeta(GregTech_API.sBlockTintedGlass, 0)) - .addElement('F', ofBlock(Blocks.water, 0)) - .addElement('G', ofFrame(Materials.Tungsten)) - // Hatch space - .addElement( - 'H', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(t.getAllowedHatches()) - .dot(1) - .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings9, 4)) - .build()), - ofBlock(GregTech_API.sBlockCasings9, 4))) - .build(); - - public GT_MetaTileEntity_PurificationPlant(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PurificationPlant(String aName) { - super(aName); - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 6, 0); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN_SURVIVAL, stackSize, 3, 6, 0, elementBudget, env, true); - if (built == -1) { - GT_Utility.sendChatToPlayer( - env.getActor(), - EnumChatFormatting.GREEN + "Auto placing done ! Now go place the water yourself !"); - return 0; - } - return built; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Plant") - .addInfo("Main controller block for the Water Purification Plant.") - .addInfo( - "Freely place " + EnumChatFormatting.YELLOW - + "Purification Units " - + EnumChatFormatting.GRAY - + "within " - + EnumChatFormatting.RED - + MAX_UNIT_DISTANCE - + EnumChatFormatting.GRAY - + " blocks along each axis.") - .addInfo("Left click this controller with a data stick, then right click a purification unit to link.") - .addInfo("Supplies power to linked purification units. This multiblock accepts TecTech energy hatches.") - .addSeparator() - .addInfo( - "Works in fixed time processing cycles of " + EnumChatFormatting.RED - + CYCLE_TIME_TICKS / SECONDS - + EnumChatFormatting.GRAY - + " seconds.") - .addInfo("All linked units follow this cycle.") - .addSeparator() - .addInfo("Every recipe has a base chance of success. Success rate can be boosted") - .addInfo("by using a portion of the target output as a secondary input.") - .addInfo( - EnumChatFormatting.RED + GT_Utility.formatNumbers(WATER_BOOST_NEEDED_FLUID * 100) - + "%" - + EnumChatFormatting.GRAY - + " of output yield will be consumed in exchange for an") - .addInfo( - "additive " + EnumChatFormatting.RED - + GT_Utility.formatNumbers(WATER_BOOST_BONUS_CHANCE * 100) - + "%" - + EnumChatFormatting.GRAY - + " increase to success.") - .addInfo( - "On recipe failure, each purification unit has a " + EnumChatFormatting.RED - + "50%" - + EnumChatFormatting.GRAY - + " chance") - .addInfo("to return water of the same quality as the input or lower.") - .addSeparator() - .addInfo("Every purification unit has a configuration window to configure maximum parallel amount.") - .addInfo( - "This will only scale purified water I/O and power usage. Other catalysts and outputs are unchanged.") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "Contaminants and ionized particles in water can cause significant imperfections in delicate") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "processes related to the cutting and engraving of silicon wafers and chips. It is crucial that") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "the water is systematically purified through a series of increasingly precise and complex") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "purification processes, and this multiblock is the heart of the operation.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(7, 9, 8, false) - .addCasingInfoExactlyColored( - "Superplasticizer-Treated High Strength Concrete", - EnumChatFormatting.GRAY, - 56, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Sterile Water Plant Casing", - EnumChatFormatting.GRAY, - 77, - EnumChatFormatting.GOLD, - false) - .addCasingInfoRangeColored( - "Reinforced Sterile Water Plant Casing", - EnumChatFormatting.GRAY, - 71, - 72, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Tungsten Frame Box", - EnumChatFormatting.GRAY, - 30, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Tinted Industrial Glass", - EnumChatFormatting.GRAY, - 6, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored("Reinforced Door", EnumChatFormatting.GRAY, 1, EnumChatFormatting.GOLD, false) - .addController("Front center") - .addEnergyHatch(EnumChatFormatting.GOLD + "1", 1) - .addMaintenanceHatch(EnumChatFormatting.GOLD + "1", 1) - .addStructureInfo("Requires water to be placed in the tank.") - .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationPlant(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean active, boolean redstoneLevel) { - if (side == facing) { - if (active) return new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings9, 4)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings9, 4)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons - .getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings9, 4)) }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - private List> getAllowedHatches() { - return ImmutableList.of(Maintenance, Energy, ExoticEnergy); - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - // Check self - if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 6, 0)) { - return false; - } - - // Check hatches - if (!checkHatches()) { - return false; - } - - // using nano forge method of detecting hatches. - if (!checkExoticAndNormalEnergyHatches()) { - return false; - } - - return true; - } - - private boolean checkHatches() { - // Exactly one maintenance hatch is required - return mMaintenanceHatches.size() == 1; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - - if (aBaseMetaTileEntity.isServerSide()) { - // Trigger structure check of linked units, but never all in the same tick, and at most once per cycle. - for (int i = 0; i < mLinkedUnits.size(); ++i) { - if (aTick % CYCLE_TIME_TICKS == i) { - LinkedPurificationUnit unit = mLinkedUnits.get(i); - boolean structure = unit.metaTileEntity() - .checkStructure(true); - // If unit was active but deformed, set as inactive - if (unit.isActive() && !structure) { - unit.setActive(false); - // Also remember to recalculate power usage, since otherwise the deformed unit will - // keep drawing power - this.lEUt = -calculateEffectivePowerUsage(); - } - } - } - } - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - updateCycleProgress(); - // Calculate efficiency based on maintenance issues - if (mMaxProgresstime > 0) { - mEfficiency = Math.max( - 0, - Math.min( - mEfficiency + mEfficiencyIncrease, - getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000))); - } - } - - private void updateCycleProgress() { - // Since the plant does not run recipes directly, we just continuously loop the base cycle - if (mMachine) { - // cycle is running, so simply advance it - if (mMaxProgresstime > 0) { - // onRunningTick is responsible for draining power - if (onRunningTick(mInventory[1])) { - markDirty(); - mProgresstime += 1; - // Update progress time for active units - for (LinkedPurificationUnit unit : this.mLinkedUnits) { - if (unit.isActive()) { - GT_MetaTileEntity_PurificationUnitBase metaTileEntity = unit.metaTileEntity(); - metaTileEntity.mProgresstime = mProgresstime; - } - } - // Cycle finished - if (mProgresstime >= mMaxProgresstime) { - this.endCycle(); - } - } else { - // Power drain failed, shut down all other units due to power loss. - // Note that we do not need to shut down self, as this is done in - // onRunningTick already - for (LinkedPurificationUnit unit : mLinkedUnits) { - if (unit.isActive()) { - unit.metaTileEntity() - .stopMachine(ShutDownReasonRegistry.POWER_LOSS); - } - } - } - } - - // No cycle running, start a new cycle if the machine is turned on - if (mMaxProgresstime == 0 && isAllowedToWork()) { - this.startCycle(); - } - } - } - - private void startCycle() { - mProgresstime = 0; - mMaxProgresstime = CYCLE_TIME_TICKS; - mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); - - // Find active units and notify them that the cycle started - for (LinkedPurificationUnit unit : this.mLinkedUnits) { - GT_MetaTileEntity_PurificationUnitBase metaTileEntity = unit.metaTileEntity(); - PurificationUnitStatus status = metaTileEntity.status(); - // Unit needs to be online to be considered active. - if (status == PurificationUnitStatus.ONLINE) { - // Perform recipe check for unit and start it if successful - if (metaTileEntity.doPurificationRecipeCheck()) { - unit.setActive(true); - metaTileEntity.startCycle(mMaxProgresstime, mProgresstime); - } - } - } - - // After activating all units, calculate power usage - lEUt = -calculateEffectivePowerUsage(); - } - - private void endCycle() { - mMaxProgresstime = 0; - - // Mark all units as inactive and reset their progress time - for (LinkedPurificationUnit unit : this.mLinkedUnits) { - GT_MetaTileEntity_PurificationUnitBase metaTileEntity = unit.metaTileEntity(); - // If this unit was active, end the cycle - if (unit.isActive()) { - metaTileEntity.endCycle(); - } - unit.setActive(false); - } - } - - /** - * Calculate power usage of all units - */ - private long calculateEffectivePowerUsage() { - long euT = 0; - for (LinkedPurificationUnit unit : mLinkedUnits) { - if (unit.isActive()) { - euT += unit.metaTileEntity() - .getActualPowerUsage(); - } - } - return euT; - } - - @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 void registerLinkedUnit(GT_MetaTileEntity_PurificationUnitBase unit) { - this.mLinkedUnits.add(new LinkedPurificationUnit(unit)); - } - - public void unregisterLinkedUnit(GT_MetaTileEntity_PurificationUnitBase unit) { - this.mLinkedUnits.removeIf(link -> link.metaTileEntity() == unit); - } - - @Override - public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!(aPlayer instanceof EntityPlayerMP)) return; - - // Save link data to data stick, very similar to Crafting Input Buffer. - - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; - - NBTTagCompound tag = new NBTTagCompound(); - tag.setString("type", "PurificationPlant"); - tag.setInteger("x", aBaseMetaTileEntity.getXCoord()); - tag.setInteger("y", aBaseMetaTileEntity.getYCoord()); - tag.setInteger("z", aBaseMetaTileEntity.getZCoord()); - - dataStick.stackTagCompound = tag; - dataStick.setStackDisplayName( - "Purification Plant Link Data Stick (" + aBaseMetaTileEntity - .getXCoord() + ", " + aBaseMetaTileEntity.getYCoord() + ", " + aBaseMetaTileEntity.getZCoord() + ")"); - aPlayer.addChatMessage(new ChatComponentText("Saved Link Data to Data Stick")); - } - - @Override - public String[] getInfoData() { - var ret = new ArrayList(); - // Show linked purification units and their status - ret.add("Linked Purification Units: "); - for (LinkedPurificationUnit unit : this.mLinkedUnits) { - String text = EnumChatFormatting.AQUA + unit.metaTileEntity() - .getLocalName() + ": "; - PurificationUnitStatus status = unit.metaTileEntity() - .status(); - switch (status) { - case ONLINE -> { - text = text + EnumChatFormatting.GREEN + "Online"; - } - case DISABLED -> { - text = text + EnumChatFormatting.YELLOW + "Disabled"; - } - case INCOMPLETE_STRUCTURE -> { - text = text + EnumChatFormatting.RED + "Incomplete Structure"; - } - } - ret.add(text); - } - return ret.toArray(new String[0]); - } - - @Override - public void onBlockDestroyed() { - // When the controller is destroyed we want to notify all currently linked units - for (LinkedPurificationUnit unit : this.mLinkedUnits) { - unit.metaTileEntity() - .unlinkController(); - } - super.onBlockDestroyed(); - } - - private void drawTopText(DynamicPositionedColumn screenElements) { - screenElements.setSynced(false) - .setSpace(0) - .setPos(10, 8); - - screenElements - .widget( - new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")).setDefaultColor(EnumChatFormatting.RED) - .setEnabled(widget -> !mMachine)) - .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)); - - screenElements.widget( - new TextWidget("Hit with Soft Mallet to start.").setDefaultColor(EnumChatFormatting.BLACK) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())) - .widget( - new FakeSyncWidget.IntegerSyncer( - () -> getBaseMetaTileEntity().getErrorDisplayID(), - val -> getBaseMetaTileEntity().setErrorDisplayID(val))) - .widget( - new FakeSyncWidget.BooleanSyncer( - () -> getBaseMetaTileEntity().isActive(), - val -> getBaseMetaTileEntity().setActive(val))); - screenElements.widget( - new TextWidget(GT_Utility.trans("142", "Running perfectly.")).setDefaultColor(EnumChatFormatting.GREEN) - .setEnabled( - widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && getBaseMetaTileEntity().isActive())); - screenElements.widget( - TextWidget.dynamicString( - () -> getBaseMetaTileEntity().getLastShutDownReason() - .getDisplayString()) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled( - widget -> shouldDisplayShutDownReason() && !getBaseMetaTileEntity().isActive() - && GT_Utility.isStringValid( - getBaseMetaTileEntity().getLastShutDownReason() - .getDisplayString()) - && getBaseMetaTileEntity().wasShutdown())) - .widget( - new ShutDownReasonSyncer( - () -> getBaseMetaTileEntity().getLastShutDownReason(), - reason -> getBaseMetaTileEntity().setShutDownReason(reason))) - .widget( - new FakeSyncWidget.BooleanSyncer( - () -> getBaseMetaTileEntity().wasShutdown(), - wasShutDown -> getBaseMetaTileEntity().setShutdownStatus(wasShutDown))); - screenElements.widget( - TextWidget.dynamicString(this::generateCurrentRecipeInfoString) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setEnabled(widget -> (mMaxProgresstime > 0))) - .widget(new FakeSyncWidget.IntegerSyncer(() -> mProgresstime, val -> mProgresstime = val)) - .widget(new FakeSyncWidget.IntegerSyncer(() -> mMaxProgresstime, val -> mMaxProgresstime = val)); - } - - private final int STATUS_WINDOW_ID = 10; - - private ModularWindow createStatusWindow(final EntityPlayer player) { - final int windowWidth = 260; - final int windowHeight = 200; - ModularWindow.Builder builder = ModularWindow.builder(windowWidth, windowHeight); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); - builder.widget( - ButtonWidget.closeWindowButton(true) - .setPos(windowWidth - 15, 3)); - - // Title widget - builder.widget( - new TextWidget(EnumChatFormatting.BOLD + "Purification Unit Status").setTextAlignment(Alignment.Center) - .setPos(5, 10) - .setSize(windowWidth, 8)); - - int currentYPosition = 20; - Scrollable mainDisp = new Scrollable().setVerticalScroll(); - - int rowHeight = 20; - for (int i = 0; i < this.mLinkedUnits.size(); i++) { - mainDisp.widget(makeUnitStatusWidget(mLinkedUnits.get(i)).setPos(0, rowHeight * (i + 1))); - } - - builder.widget( - mainDisp.setPos(5, currentYPosition) - .setSize(windowWidth - 10, windowHeight - currentYPosition - 5)); - return builder.build(); - } - - private Widget makeStatusWindowButton() { - TextButtonWidget widget = (TextButtonWidget) new TextButtonWidget("Status").setLeftMargin(4) - .setSize(40, 16) - .setPos(10, 40); - widget.button() - .setOnClick( - (clickData, w) -> { - if (!w.isClient()) w.getContext() - .openSyncedWindow(STATUS_WINDOW_ID); - }) - .setBackground(GT_UITextures.BUTTON_STANDARD); - widget.text() - .setTextAlignment(Alignment.CenterLeft) - .setDefaultColor(EnumChatFormatting.BLACK); - return widget; - } - - private Widget makeUnitStatusWidget(LinkedPurificationUnit unit) { - // Draw small machine controller icon - DynamicPositionedRow row = new DynamicPositionedRow(); - ItemStackHandler machineIcon = new ItemStackHandler(1); - machineIcon.setStackInSlot( - 0, - unit.metaTileEntity() - .getStackForm(1)); - - row.widget( - SlotWidget.phantom(machineIcon, 0) - .disableInteraction() - .setPos(0, 0)) - .setSize(20, 20); - - // Display machine name and status - String name = unit.metaTileEntity() - .getLocalName(); - - row.widget( - TextWidget.dynamicString(() -> name + " " + unit.getStatusString()) - .setSynced(false) - .setTextAlignment(Alignment.CenterLeft) - .setPos(25, 0) - .setSize(0, 20)) - .widget(new FakeSyncWidget.StringSyncer(() -> name, _name -> {})) - .widget( - unit.metaTileEntity() - .makeSyncerWidgets()) - .widget(new FakeSyncWidget.BooleanSyncer(unit::isActive, unit::setActive));; - - return row; - } - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - - buildContext.addSyncedWindow(STATUS_WINDOW_ID, this::createStatusWindow); - - // Draw basic recipe info - final DynamicPositionedColumn controlTextArea = new DynamicPositionedColumn(); - drawTopText(controlTextArea); - builder.widget(controlTextArea); - - // Draw line separator - builder.widget( - new Rectangle().setColor(Color.rgb(114, 120, 139)) - .asWidget() - .setSizeProvider((screenSize, window, parent) -> new Size(window.getSize().width - 8, 2)) - .setPos(3, 32)); - - // Add status window button - builder.widget(makeStatusWindowButton()); - - // Add parallel count number input - - builder.widget(createPowerSwitchButton(builder)); - - // Add value syncers, note that we do this here so - // everything is updated once the status gui opens - addSyncers(builder); - } - - private void addSyncers(ModularWindow.Builder builder) { - // Sync connection list to client - builder.widget(new FakeSyncWidget.ListSyncer<>(() -> mLinkedUnits, links -> { - mLinkedUnits.clear(); - mLinkedUnits.addAll(links); - }, (buffer, link) -> { - // Try to save link data to NBT, so we can reconstruct it on client - try { - buffer.writeNBTTagCompoundToBuffer(link.writeLinkDataToNBT()); - } catch (IOException e) { - GT_Log.err.println(e.getCause()); - } - }, buffer -> { - // Try to load link data from NBT compound as constructed above. - try { - return new LinkedPurificationUnit(buffer.readNBTTagCompoundFromBuffer()); - } catch (IOException e) { - GT_Log.err.println(e.getCause()); - } - return null; - })); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitBase.java deleted file mode 100644 index 075ddc74c2..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitBase.java +++ /dev/null @@ -1,805 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static net.minecraft.util.StatCollector.translateToLocal; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Stream; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; - -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.Size; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.VoidingMode; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.recipe.check.CheckRecipeResultRegistry; -import gregtech.api.recipe.metadata.PurificationPlantBaseChanceKey; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Casings_Abstract; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -/** - * Base class for purification units. This class handles all shared behaviour between units. - * When inheriting from this, make sure to call super.loadNBTData() and super.saveNBTData() - * if you override these methods, or linking will break. - */ -public abstract class GT_MetaTileEntity_PurificationUnitBase> - extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase { - - /** - * Ratio of output fluid that needs to be inserted back as input to trigger a "water boost". - * Must be in [0, 1]. - */ - public static final float WATER_BOOST_NEEDED_FLUID = 0.1f; - /** - * Additive bonus to success chance when water boost is active. - * Must be in [0, 1] - */ - public static final float WATER_BOOST_BONUS_CHANCE = 0.15f; - - /** - * Small internal enum to report back the various error cases when linking purification units to the - * purification plant. - */ - private enum LinkResult { - /** - * Link target was out of range of the main controller - */ - TOO_FAR, - /** - * No valid GT_MetaTileEntity_PurificationPlant was found at the link target position. - */ - NO_VALID_PLANT, - /** - * Link successful - */ - SUCCESS, - } - - /** - * Coordinates of the main purification plant controller. These can be used to find the controller again - * on world load. - */ - private int controllerX, controllerY, controllerZ; - - /** - * Whether a controller was previously set. - */ - private boolean controllerSet = false; - - /** - * Pointer to the main purification plant controller. - */ - private GT_MetaTileEntity_PurificationPlant controller = null; - - /** - * The current recipe being run in the purification unit. Note that purification unit recipes are a bit special, - * so input and output in the recipe might not exactly match the required inputs and produced outputs. - * For more information, always look at the purification unit tooltip and implementation. - */ - protected GT_Recipe currentRecipe = null; - - /** - * Current chance of the recipe succeeding, always in [0, 100]. A chance above 100 will be interpreted as 100. - */ - protected float currentRecipeChance = 0.0f; - - /** - * Configured parallel amount. Only water I/O and power scale. - */ - protected int maxParallel = 1; - - protected int effectiveParallel = 1; - - protected ArrayList storedFluids = null; - - protected GT_MetaTileEntity_PurificationUnitBase(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - protected GT_MetaTileEntity_PurificationUnitBase(String aName) { - super(aName); - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } - - @Override - public boolean doRandomMaintenanceDamage() { - // The individual purification unit structures cannot have maintenance issues, so do nothing. - return true; - } - - @Override - public boolean getDefaultHasMaintenanceChecks() { - return false; - } - - @Override - protected void setHatchRecipeMap(GT_MetaTileEntity_Hatch_Input hatch) { - // Do nothing, we don't want to lock hatches to recipe maps since this can cause - // them to reject our catalyst fluids - } - - /** - * Used to more easily grab a correct texture index from a block + meta. - * - * @param block Block to use as base. Must implement GT_Block_Casings_Abstract - * @param meta Metadata of the block to pick the actual block - * @return The correct index into the global texture atlas. - */ - protected static int getTextureIndex(Block block, int meta) { - return ((GT_Block_Casings_Abstract) block).getTextureIndex(meta); - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - super.onPostTick(aBaseMetaTileEntity, aTimer); - // Try to re-link to controller periodically, for example on game load. - if (aTimer % 100 == 5 && controllerSet && getController() == null) { - trySetControllerFromCoord(controllerX, controllerY, controllerZ); - } - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - // Main controller updates progress time. We can do I/O logic here. - // The logic for operating purification units is typically implemented by overriding this behaviour. - if (mMaxProgresstime > 0) { - this.markDirty(); - // Do not take maintenance into consideration, because purification units do not get - // maintenance issues. - // Technically, this entire efficiency stat is a bit useless for purification units, since - // their power draw does not actually depend on it, but it's nice to keep around for consistency with other - // multiblocks. This way, you still gradually see the efficiency go down when it powers down. - mEfficiency = Math.max(0, Math.min(mEfficiency + mEfficiencyIncrease, getMaxEfficiency(mInventory[1]))); - } - } - - protected CheckRecipeResult findRecipeForInputs(FluidStack[] fluidInputs, ItemStack... itemInputs) { - RecipeMap recipeMap = this.getRecipeMap(); - - // Grab a stream of recipes and find the one with the highest success chance - Stream recipes = recipeMap.findRecipeQuery() - .fluids(fluidInputs) - .items(itemInputs) - .findAll(); - GT_Recipe recipe = recipes - .max(Comparator.comparing(r -> r.getMetadataOrDefault(PurificationPlantBaseChanceKey.INSTANCE, 0.0f))) - .orElse(null); - - if (recipe == null) { - return CheckRecipeResultRegistry.NO_RECIPE; - } - - if (this.protectsExcessFluid() && !this.canOutputAll(recipe.mFluidOutputs)) { - return CheckRecipeResultRegistry.FLUID_OUTPUT_FULL; - } - - if (this.protectsExcessItem() && !this.canOutputAll(recipe.mOutputs)) { - return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL; - } - - this.currentRecipe = recipe; - return CheckRecipeResultRegistry.SUCCESSFUL; - } - - /** - * By default, only checks fluid input. - * - * @return - */ - @NotNull - @Override - public CheckRecipeResult checkProcessing() { - this.storedFluids = this.getStoredFluids(); - CheckRecipeResult result = overrideRecipeCheck(); - if (result == null) result = findRecipeForInputs(storedFluids.toArray(new FluidStack[] {})); - - // If we had a successful result, calculate effective parallel - if (result.wasSuccessful()) { - FluidStack waterInput = this.currentRecipe.mFluidInputs[0]; - // Count total available purified water input of the previous step - long amountAvailable = 0; - for (FluidStack fluid : this.storedFluids) { - if (fluid.isFluidEqual(waterInput)) { - amountAvailable += fluid.amount; - } - } - // Determine effective parallel - effectiveParallel = (int) Math.min(maxParallel, Math.floorDiv(amountAvailable, waterInput.amount)); - // This should not happen, throw an error - if (effectiveParallel == 0) return CheckRecipeResultRegistry.INTERNAL_ERROR; - } - - return result; - } - - public CheckRecipeResult overrideRecipeCheck() { - return null; - } - - /** - * Equivalent to checkRecipe(), but public because the purification plant needs to access it and checkRecipe() - * is protected. - * - * @return True if successfully found a recipe and/or started processing/ - */ - public boolean doPurificationRecipeCheck() { - effectiveParallel = 1; - return this.checkRecipe(); - } - - /** - * Get the success chance of the recipe, from 0 to 100. Never call this while a recipe is running, because items - * or modifiers used to boost might disappear by the time recipe check comes around, - * which would invalidate this result. - */ - public float calculateBoostedSuccessChance() { - // If this.currentRecipe is null, there is a bug, so throwing a NPE is fine. - float recipeChance = this.currentRecipe.getMetadataOrDefault(PurificationPlantBaseChanceKey.INSTANCE, 0.0f); - // Apply water boost if available. - if (isWaterBoosted(this.currentRecipe)) { - recipeChance = Math.min(recipeChance + WATER_BOOST_BONUS_CHANCE * 100.0f, 100.0f); - } - return recipeChance; - } - - /** - * By default, the final recipe success chance is simply the success chance calculated on recipe check. - * This applies water boosts when needed to the base chance. Purification units can override this to perform - * more complex success chance calculations, that even take into account what happened during the runtime of the - * recipe. - * - * @return The success chance of the recipe, at the point in time the outputs are to be produced. - */ - public float calculateFinalSuccessChance() { - return this.currentRecipeChance; - } - - /** - * Get the tier of water this unit makes. Starts at 1. - */ - public abstract int getWaterTier(); - - /** - * Get the amount of water needed to execute a water boost, in mb. - */ - public FluidStack getWaterBoostAmount(GT_Recipe recipe) { - // Recipes should always be constructed so that output water is always the first fluid output - FluidStack outputWater = recipe.mFluidOutputs[0]; - int amount = Math.round(outputWater.amount * WATER_BOOST_NEEDED_FLUID); - return new FluidStack(outputWater.getFluid(), amount); - } - - /** - * Returns true if this purification unit contains enough water to apply a water boost for the selected recipe. - * This should only be called during recipe check! Never call this while a recipe is running, because water used to - * boost might disappear by the time recipe check comes around, which would invalidate this result. - * - * @param recipe The recipe to check the water boost of - */ - public boolean isWaterBoosted(GT_Recipe recipe) { - FluidStack inputWater = getWaterBoostAmount(recipe); - // Simulate input drain to see if we can water boost - return depleteInput(inputWater, true); - } - - /** - * Consumes all fluid inputs of the current recipe. - */ - public void depleteRecipeInputs() { - for (FluidStack input : this.currentRecipe.mFluidInputs) { - FluidStack copyWithParallel = input.copy(); - copyWithParallel.amount = input.amount * effectiveParallel; - this.depleteInput(copyWithParallel); - } - } - - /** - * Called after a recipe is found and accepted. - * - * @param cycleTime Time for a full cycle to complete - * @param progressTime Current progress time - */ - public void startCycle(int cycleTime, int progressTime) { - // Important to calculate this before depleting inputs, otherwise we may get issues with boost items - // disappearing. - this.currentRecipeChance = this.calculateBoostedSuccessChance(); - - // Deplete inputs from water boost if enabled. - if (isWaterBoosted(this.currentRecipe)) { - FluidStack inputWater = this.getWaterBoostAmount(this.currentRecipe); - this.depleteInput(inputWater); - } - - // Consume inputs - this.depleteRecipeInputs(); - // Initialize recipe and progress information. - this.mMaxProgresstime = cycleTime; - this.mProgresstime = progressTime; - this.mEfficiency = 10000; - // These need to be set so the GUI code can display the produced outputs - - // Make sure to scale purified water output with parallel amount. - // Make sure to make a full copy of the array, so we don't go modifying recipes - FluidStack[] fluidOutputs = new FluidStack[this.currentRecipe.mFluidOutputs.length]; - for (int i = 0; i < this.currentRecipe.mFluidOutputs.length; ++i) { - fluidOutputs[i] = this.currentRecipe.mFluidOutputs[i].copy(); - } - fluidOutputs[0].amount *= effectiveParallel; - this.mOutputFluids = fluidOutputs; - this.mOutputItems = this.currentRecipe.mOutputs; - // Set this value, so it can be displayed in Waila. Note that the logic for the units is - // specifically overridden so setting this value does not actually drain power. - // Instead, power is drained by the main purification plant controller. - this.lEUt = -this.getActualPowerUsage(); - } - - public void addRecipeOutputs() { - ThreadLocalRandom random = ThreadLocalRandom.current(); - this.addFluidOutputs(mOutputFluids); - // If this recipe has random item outputs, roll on it and add outputs - if (this.currentRecipe.mChances != null) { - // Roll on each output individually - for (int i = 0; i < this.currentRecipe.mOutputs.length; ++i) { - // Recipes store probabilities as a value ranging from 1-10000 - int roll = random.nextInt(10000); - if (roll <= this.currentRecipe.mChances[i]) { - this.addOutput(this.currentRecipe.mOutputs[i]); - } - } - } else { - // Guaranteed item output - for (int i = 0; i < this.currentRecipe.mOutputs.length; ++i) { - this.addOutput(this.currentRecipe.mOutputs[i]); - } - } - } - - public void endCycle() { - ThreadLocalRandom random = ThreadLocalRandom.current(); - - // First see if the recipe succeeded. For some reason random.nextFloat does not compile, so we use this - // hack instead. - float successRoll = random.nextInt(0, 10000) / 100.0f; - if (successRoll <= calculateFinalSuccessChance()) { - addRecipeOutputs(); - } else { - onRecipeFail(); - } - - // Reset recipe values for next iteration - this.mMaxProgresstime = 0; - this.mProgresstime = 0; - this.lEUt = 0; - this.mEfficiency = 0; - this.currentRecipe = null; - this.currentRecipeChance = 0.0f; - this.mOutputItems = null; - this.mOutputFluids = null; - this.effectiveParallel = 1; - } - - /** - * Outputs fluid when recipe fails. - */ - private void onRecipeFail() { - // Possibly output lower quality water. - // Note that if there is no space for this, it will be voided regardless of fluid void setting! - FluidStack outputWater = getDegradedOutputWater(); - this.addOutput(outputWater); - } - - /** - * On recipe fail, water quality may degrade to the same or lower tier. This function returns the water to output - * in this case, or null if no water is produced at all. - */ - private FluidStack getDegradedOutputWater() { - ThreadLocalRandom random = ThreadLocalRandom.current(); - int roll = random.nextInt(0, 2); - // 50% chance to not output anything at all - if (roll == 0) return null; - - for (int waterTier = getWaterTier(); waterTier > 0; --waterTier) { - // 50% chance every time of degrading into the previous tier - roll = random.nextInt(0, 2); - if (roll == 1) { - // Rolled good, stop the loop and output water below current tier - int amount = mOutputFluids[0].amount; - // For tier 1, this is distilled water, so we cannot use the helper function! - if (waterTier == 1) { - return GT_ModHandler.getDistilledWater(amount); - } - Materials water = PurifiedWaterHelpers.getPurifiedWaterTier(waterTier - 1); - return water.getFluid(amount); - } - // Bad roll, keep looping and degrade quality even further - } - // Rolled bad on every iteration, no output for you - return null; - } - - /** - * Get the EU/t usage of this unit while it is running. - */ - public abstract long getBasePowerUsage(); - - public long getActualPowerUsage() { - return getBasePowerUsage() * effectiveParallel; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - // The individual purification unit structures cannot have maintenance issues, so fix them all. - this.mCrowbar = true; - this.mWrench = true; - this.mHardHammer = true; - this.mSoftHammer = true; - this.mSolderingTool = true; - this.mScrewdriver = true; - return true; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - // If a linked controller was found, load its coordinates. - // The unit will try to link to the real controller block periodically in onPostTick() - // We cannot do this linking here yet because the controller block might not be loaded yet. - // TODO: We could try though? - if (aNBT.hasKey("controller")) { - NBTTagCompound controllerNBT = aNBT.getCompoundTag("controller"); - controllerX = controllerNBT.getInteger("x"); - controllerY = controllerNBT.getInteger("y"); - controllerZ = controllerNBT.getInteger("z"); - controllerSet = true; - } - currentRecipeChance = aNBT.getFloat("currentRecipeChance"); - if (aNBT.hasKey("configuredParallel")) { - maxParallel = aNBT.getInteger("configuredParallel"); - } - if (aNBT.hasKey("effectiveParallel")) { - effectiveParallel = aNBT.getInteger("effectiveParallel"); - } - } - - public NBTTagCompound saveLinkDataToNBT() { - NBTTagCompound controllerNBT = new NBTTagCompound(); - controllerNBT.setInteger("x", controllerX); - controllerNBT.setInteger("y", controllerY); - controllerNBT.setInteger("z", controllerZ); - return controllerNBT; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - if (controllerSet) { - NBTTagCompound controllerNBT = saveLinkDataToNBT(); - aNBT.setTag("controller", controllerNBT); - } - aNBT.setFloat("currentRecipeChance", currentRecipeChance); - aNBT.setInteger("configuredParallel", maxParallel); - aNBT.setInteger("effectiveParallel", effectiveParallel); - } - - private LinkResult trySetControllerFromCoord(int x, int y, int z) { - IGregTechTileEntity ourBaseMetaTileEntity = this.getBaseMetaTileEntity(); - // First check whether the controller we try to link to is within range. The range is defined - // as a max distance in each axis. - if (Math.abs(ourBaseMetaTileEntity.getXCoord() - x) > GT_MetaTileEntity_PurificationPlant.MAX_UNIT_DISTANCE) - return LinkResult.TOO_FAR; - if (Math.abs(ourBaseMetaTileEntity.getYCoord() - y) > GT_MetaTileEntity_PurificationPlant.MAX_UNIT_DISTANCE) - return LinkResult.TOO_FAR; - if (Math.abs(ourBaseMetaTileEntity.getZCoord() - z) > GT_MetaTileEntity_PurificationPlant.MAX_UNIT_DISTANCE) - return LinkResult.TOO_FAR; - - // Find the block at the requested coordinated and check if it is a purification plant controller. - var tileEntity = getBaseMetaTileEntity().getWorld() - .getTileEntity(x, y, z); - if (tileEntity == null) return LinkResult.NO_VALID_PLANT; - if (!(tileEntity instanceof IGregTechTileEntity gtTileEntity)) return LinkResult.NO_VALID_PLANT; - var metaTileEntity = gtTileEntity.getMetaTileEntity(); - if (!(metaTileEntity instanceof GT_MetaTileEntity_PurificationPlant)) return LinkResult.NO_VALID_PLANT; - - // Before linking, unlink from current controller, so we don't end up with units linked to multiple - // controllers. - GT_MetaTileEntity_PurificationPlant oldController = getController(); - if (oldController != null) { - oldController.unregisterLinkedUnit(this); - this.unlinkController(); - } - - // Now link to new controller - controllerX = x; - controllerY = y; - controllerZ = z; - controllerSet = true; - controller = (GT_MetaTileEntity_PurificationPlant) metaTileEntity; - controller.registerLinkedUnit(this); - return LinkResult.SUCCESS; - } - - private boolean tryLinkDataStick(EntityPlayer aPlayer) { - // Make sure the held item is a data stick - ItemStack dataStick = aPlayer.inventory.getCurrentItem(); - if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { - return false; - } - - // Make sure this data stick is a proper purification plant link data stick. - if (!dataStick.hasTagCompound() || !dataStick.stackTagCompound.getString("type") - .equals("PurificationPlant")) { - return false; - } - - // Now read link coordinates from the data stick. - NBTTagCompound nbt = dataStick.stackTagCompound; - int x = nbt.getInteger("x"); - int y = nbt.getInteger("y"); - int z = nbt.getInteger("z"); - - // Try to link, and report the result back to the player. - LinkResult result = trySetControllerFromCoord(x, y, z); - if (result == LinkResult.SUCCESS) { - aPlayer.addChatMessage(new ChatComponentText("Link successful")); - } else if (result == LinkResult.TOO_FAR) { - aPlayer.addChatMessage(new ChatComponentText("Link failed: Out of range.")); - } else if (result == LinkResult.NO_VALID_PLANT) { - aPlayer.addChatMessage(new ChatComponentText("Link failed: No Purification Plant found at link location")); - } - - return true; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - if (!(aPlayer instanceof EntityPlayerMP)) { - return false; - } - - // Right-clicking could be a data stick linking action, so try this first. - if (tryLinkDataStick(aPlayer)) { - return true; - } - - return super.onRightclick(aBaseMetaTileEntity, aPlayer); - } - - public GT_MetaTileEntity_PurificationPlant getController() { - if (controller == null) return null; - // Controller disappeared - if (controller.getBaseMetaTileEntity() == null) return null; - return controller; - } - - // If the controller is broken this can be called to explicitly unlink the controller, so we don't have any - // references lingering around - public void unlinkController() { - this.controllerSet = false; - this.controller = null; - this.controllerX = 0; - this.controllerY = 0; - this.controllerZ = 0; - } - - @Override - public void onBlockDestroyed() { - // When this block is destroyed, explicitly unlink it from the controller if there is any. - GT_MetaTileEntity_PurificationPlant controller = getController(); - if (controller != null) { - controller.unregisterLinkedUnit(this); - } - super.onBlockDestroyed(); - } - - @Override - public String[] getInfoData() { - var ret = new ArrayList(); - // If this purification unit is linked to a controller, add this info to the scanner output. - if (getController() != null) { - ret.add( - "This Purification Unit is linked to the Water Purification Plant at " + controllerX - + ", " - + controllerY - + ", " - + controllerZ - + "."); - - // If recipe is running, display success chance - if (this.mMaxProgresstime != 0) { - ret.add( - "Success chance: " + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(this.calculateFinalSuccessChance()) - + "%" - + EnumChatFormatting.RESET); - } - - } else ret.add("This Purification Unit is not linked to any Water Purification Plant."); - ret.add("Current parallel: " + EnumChatFormatting.YELLOW + this.effectiveParallel); - return ret.toArray(new String[0]); - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - NBTTagCompound tag = accessor.getNBTData(); - - // Display linked controller in Waila. - if (tag.getBoolean("linked")) { - currenttip.add( - EnumChatFormatting.AQUA + "Linked to Purification Plant at " - + EnumChatFormatting.WHITE - + tag.getInteger("controllerX") - + ", " - + tag.getInteger("controllerY") - + ", " - + tag.getInteger("controllerZ") - + EnumChatFormatting.RESET); - } else { - currenttip.add(EnumChatFormatting.AQUA + "Unlinked"); - } - - super.getWailaBody(itemStack, currenttip, accessor, config); - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - - tag.setBoolean("linked", getController() != null); - if (getController() != null) { - tag.setInteger("controllerX", controllerX); - tag.setInteger("controllerY", controllerY); - tag.setInteger("controllerZ", controllerZ); - } - - super.getWailaNBTData(player, tile, tag, world, x, y, z); - } - - public PurificationUnitStatus status() { - if (!this.mMachine) { - return PurificationUnitStatus.INCOMPLETE_STRUCTURE; - } else if (!this.isAllowedToWork()) { - return PurificationUnitStatus.DISABLED; - } else { - return PurificationUnitStatus.ONLINE; - } - } - - /** - * Creates all widgets needed to sync this unit's status with the client - */ - public Widget makeSyncerWidgets() { - return new MultiChildWidget() - .addChild(new FakeSyncWidget.BooleanSyncer(() -> this.mMachine, machine -> this.mMachine = machine)) - .addChild(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, _work -> {})); - } - - private static final int PARALLEL_WINDOW_ID = 10; - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - buildContext.addSyncedWindow(PARALLEL_WINDOW_ID, this::createParallelWindow); - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (!widget.isClient()) { - widget.getContext() - .openSyncedWindow(PARALLEL_WINDOW_ID); - } - }) - .setPlayClickSound(true) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(GT_UITextures.BUTTON_STANDARD); - ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON); - return ret.toArray(new IDrawable[0]); - }) - .addTooltip(translateToLocal("GT5U.tpm.parallelwindow")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(174, 112) - .setSize(16, 16)); - super.addUIWidgets(builder, buildContext); - } - - protected ModularWindow createParallelWindow(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("GTPP.CC.parallel") - .setPos(3, 4) - .setSize(150, 20)) - .widget( - new NumericWidget().setSetter(val -> maxParallel = (int) val) - .setGetter(() -> maxParallel) - .setBounds(1, Integer.MAX_VALUE) - .setDefaultValue(1) - .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.IntegerSyncer(() -> maxParallel, (val) -> maxParallel = val), - builder)); - return builder.build(); - } - - @Override - public boolean supportsVoidProtection() { - return false; - } - - @Override - public Set getAllowedVoidingModes() { - return EnumSet.of(VoidingMode.VOID_NONE); - } - - @Override - protected boolean supportsCraftingMEBuffer() { - return false; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitClarifier.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitClarifier.java deleted file mode 100644 index 7823fa0ba7..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitClarifier.java +++ /dev/null @@ -1,333 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -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 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.AuthorNotAPenguin; -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.ofFrame; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -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 com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; -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.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_PurificationUnitClarifier - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; - - private static final int STRUCTURE_X_OFFSET = 5; - private static final int STRUCTURE_Y_OFFSET = 2; - private static final int STRUCTURE_Z_OFFSET = 1; - - // Chance that the filter is damaged every cycle. - public static final float FILTER_DAMAGE_RATE = 20.0f; - - private static final int CASING_TEXTURE_INDEX = getTextureIndex(GregTech_API.sBlockCasings9, 5); - - private static final String[][] structure = - // spotless:off - new String[][] { - { " ", " ", " ", " " }, - { " ", " AAAAA ", " AH~HA ", " AAAAA " }, - { " ", " A A ", " AWWWWWA ", " AAAAAAA " }, - { " ", " A A ", " AWWWWWWWA ", " AAAAAAAAA " }, - { " ", "A A", "AWWWCCCWWWA", "AAAAFFFAAAA" }, - { " DDD ", "A A", "HWWCWWWCWWH", "AAAFFFFFAAA" }, - { "DDDDDBD ", "A B A", "AWWCWBWCWWA", "AAAFFFFFAAA" }, - { " DDD ", "A A", "HWWCWWWCWWH", "AAAFFFFFAAA" }, - { " ", "A A", "AWWWCCCWWWA", "AAAAFFFAAAA" }, - { " ", " A A ", " AWWWWWWWA ", " AAAAAAAAA " }, - { " ", " A A ", " AWWWWWA ", " AAAAAAA " }, - { " ", " AAAAA ", " AHAHA ", " AAAAA " } }; - // spotless:on - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - .addShape( - STRUCTURE_PIECE_MAIN_SURVIVAL, - Arrays.stream(structure) - .map( - sa -> Arrays.stream(sa) - .map(s -> s.replaceAll("W", " ")) - .toArray(String[]::new)) - .toArray(String[][]::new)) - // Hatches - .addElement( - 'H', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(t.getAllowedHatches()) - .casingIndex(CASING_TEXTURE_INDEX) - .dot(1) - .build()), - // Reinforced Sterile Water Plant Casing - ofBlock(GregTech_API.sBlockCasings9, 5))) - // Reinforced Sterile Water Plant Casing - .addElement('A', ofBlock(GregTech_API.sBlockCasings9, 5)) - // PTFE pipe casing - .addElement('B', ofBlock(GregTech_API.sBlockCasings8, 1)) - .addElement('C', ofFrame(Materials.Iridium)) - .addElement('D', ofFrame(Materials.DamascusSteel)) - .addElement('W', ofChain(ofBlock(Blocks.water, 0))) - // Filter machine casing - .addElement('F', ofBlock(GregTech_API.sBlockCasings3, 11)) - .build(); - - public GT_MetaTileEntity_PurificationUnitClarifier(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PurificationUnitClarifier(String aName) { - super(aName); - } - - @Override - public int getWaterTier() { - return 1; - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_LuV; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.purificationClarifierRecipes; - } - - @NotNull - @Override - public CheckRecipeResult overrideRecipeCheck() { - // Clarifier needs to check item inputs from recipe as well to find filter item - return findRecipeForInputs( - this.storedFluids.toArray(new FluidStack[] {}), - this.getStoredInputs() - .toArray(new ItemStack[] {})); - } - - @Override - public void depleteRecipeInputs() { - super.depleteRecipeInputs(); - - // Now do random roll to determine if the filter should be destroyed - ThreadLocalRandom random = ThreadLocalRandom.current(); - int roll = random.nextInt(1, 101); - if (roll < FILTER_DAMAGE_RATE) { - this.depleteInput(this.currentRecipe.mInputs[0]); - } - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - // Rotated sifter not allowed, water will flow out. - return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped(); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the Clarifier Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo("Requires a filter made of Activated Carbon to work.") - .addInfo( - "Every cycle, has a " + EnumChatFormatting.RED - + GT_Utility.formatNumbers(FILTER_DAMAGE_RATE) - + "%" - + EnumChatFormatting.GRAY - + " chance to destroy the filter.") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "The first step to acquiring purified water is to filter out macroscopic contaminants through the") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "use of large physical filters. As more contaminants are captured, the efficacy of the filter") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "decreases so continual replacements must be supplied to maintain full function of the Clarifier.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(11, 4, 11, false) - .addSeparator() - .addCasingInfoRangeColored( - "Reinforced Sterile Water Plant Casing", - EnumChatFormatting.GRAY, - 123, - 131, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Filter Machine Casing", - EnumChatFormatting.GRAY, - 21, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Iridium Frame Box", - EnumChatFormatting.GRAY, - 21, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Damascus Steel Frame Box", - EnumChatFormatting.GRAY, - 12, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored("PTFE Pipe Casing", EnumChatFormatting.GRAY, 3, EnumChatFormatting.GOLD, false) - .addController("Front center") - .addInputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addOutputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addInputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addOutputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addStructureInfo("Requires water to be placed in the structure.") - .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - hintsOnly, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - int built = survivialBuildPiece( - STRUCTURE_PIECE_MAIN_SURVIVAL, - stackSize, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET, - elementBudget, - env, - true); - if (built == -1) { - GT_Utility.sendChatToPlayer( - env.getActor(), - EnumChatFormatting.GREEN + "Auto placing done ! Now go place the water yourself !"); - return 0; - } - return built; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitClarifier(this.mName); - } - - private List> getAllowedHatches() { - return ImmutableList.of(InputBus, InputHatch, OutputBus, OutputHatch); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection == facingDirection) { - if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_TEXTURE_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_TEXTURE_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_TEXTURE_INDEX) }; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.GT_MACHINES_PURIFICATIONPLANT_LOOP.resourceLocation; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitDegasifier.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitDegasifier.java deleted file mode 100644 index 5a8e96ea48..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitDegasifier.java +++ /dev/null @@ -1,832 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -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.InputHatch; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.AuthorNotAPenguin; -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.util.GT_StructureUtility.ofFrame; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.ThreadLocalRandom; -import java.util.function.Supplier; - -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.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader; -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.enums.TierEU; -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_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput; -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_StructureUtility; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.IGT_HatchAdder; - -public class GT_MetaTileEntity_PurificationUnitDegasifier - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - private static final int CASING_INDEX_MAIN = getTextureIndex(GregTech_API.sBlockCasings9, 11); - - private static final String STRUCTURE_PIECE_MAIN = "main"; - - // spotless:off - private static final String[][] structure = new String[][] { - { " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAA " }, - { " AAAAAAAAA ", " AAAAA ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " CCAA~AA ", " AAAAAAAAA " }, - { " AAAAAAAAAAAAA ", " CAAAAAAAAA ", " BBBBB CC ", " BBBBB ", " BBBBB ", " BBB ", " B ", " ", " C ", " ", " C ", " ", " ", " ", " ", " ", " C ", " ", " B C ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " AAAAAAAAA ", " AAAAAAAAAAAAA " }, - { " AAAAAAAAAAAAA ", " AAAAAAAAAAAC ", " C BBB BB ", " BB BB ", " B B ", " BB BB ", " BBB BBB ", " BBBBB ", " BBB ", " C C ", " ", " ", " ", " ", " ", " ", " BBB ", " C BBBBB C ", " BBB BBB ", " BB BB ", " B B ", " BB BB ", " BB BB ", " AAAAAAAAAAA ", " AAAAAAAAAAAAA " }, - { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " CB B ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " BB BB C ", " BBBBB ", " C BBB ", " ", " ", " ", " BBB ", " BBBBB ", " BB BB C ", " BB BB ", " C B B ", " B B ", " B B ", " B B ", " B B ", " AAAAAAAAAAAAAC ", " AAAAAAAAAAAAAAA " }, - { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " C BBB ", " ", " BBB ", " B B ", " B B C ", " B B ", " B B ", " B B ", " C B B ", " B B ", " B B ", " B B ", " AAAAAAAAAAAAAC ", " AAAAAAAAAAAAAAA " }, - { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " CB B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " B B ", " BBBBB ", " C BBB ", " BBBBB ", " B B C ", " B B ", " B B ", " B B ", " B B ", " B B ", " CB B ", " B B ", " B BC ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, - { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " CB B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " C BBBBB ", " BB BB ", " B B C ", " B B ", " B B ", " B B ", " B B ", " B B ", " CB B ", " B B ", " B BC ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, - { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " B B ", " CB BC ", " B B ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " BBBBB ", " C BB BB C ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " CB BC ", " B B ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, - { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " B BC ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " BBBBB C ", " BB BB ", " C B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B BC ", " B B ", " CB B ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, - { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " B BC ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B ", " BBBBB ", " BBB C ", " BBBBB ", " C B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B BC ", " B B ", " CB B ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, - { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " B B ", " B B C ", " B B ", " B B ", " B B ", " C B B ", " B B ", " B B ", " B B ", " BBB C ", " ", " BBB ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " CAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAA " }, - { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " B BC ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " C BB BB ", " BBBBB ", " BBB C ", " ", " ", " ", " BBB ", " BBBBB ", " C BB BB ", " BB BB ", " B B C ", " B B ", " B B ", " B B ", " B B ", " CAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAA " }, - { " AAAAAAAAAAAAA ", " CAAAAAAAAAAA ", " BB BB C ", " BB BB ", " B B ", " BB BB ", " BBB BBB ", " BBBBB ", " BBB ", " C C ", " ", " ", " ", " ", " ", " ", " BBB ", " C BBBBB C ", " BBB BBB ", " BB BB ", " B B ", " BB BB ", " BB BB ", " AAAAAAAAAAA ", " AAAAAAAAAAAAA " }, - { " AAAAAAAAAAAAA ", " AAAAAAAAAC ", " CC BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " B ", " ", " C ", " ", " C ", " ", " ", " ", " ", " ", " C ", " ", " C B ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " AAAAAAAAA ", " AAAAAAAAAAAAA " }, - { " AAAAAAAAA ", " AAAAA ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " AAAAACC ", " AAAAAAAAA " }, - { " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAA " } }; - // spotless:on - - private int casingCount = 0; - private static final int MIN_CASING = 780; - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - .addElement( - 'A', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(Arrays.asList(InputHatch, OutputHatch, SpecialHatchElement.ControlHatch)) - .casingIndex(CASING_INDEX_MAIN) - .dot(1) - .cacheHint(() -> "Input Hatch, Output Hatch, Control Hatch") - .build()), - onElementPass(t -> t.casingCount++, ofBlock(GregTech_API.sBlockCasings9, 11)))) - // Omni-purpose infinity fused glass - .addElement('B', ofBlock(GregTech_API.sBlockGlass1, 2)) - .addElement('C', ofFrame(Materials.Bedrockium)) - .build(); - - private static final int STRUCTURE_X_OFFSET = 8; - private static final int STRUCTURE_Y_OFFSET = 23; - private static final int STRUCTURE_Z_OFFSET = 1; - - // Supplier because werkstoff loads later than multiblock controllers... fml - private static final Supplier INERT_GASES = () -> new FluidStack[] { Materials.Helium.getGas(10000L), - WerkstoffLoader.Neon.getFluidOrGas(7500), WerkstoffLoader.Krypton.getFluidOrGas(5000), - WerkstoffLoader.Xenon.getFluidOrGas(2500) }; - - private static final class SuperconductorMaterial { - - public FluidStack fluid; - public float multiplier; - - SuperconductorMaterial(FluidStack fluid, float multiplier) { - this.fluid = fluid; - this.multiplier = multiplier; - } - } - - private static final long SUPERCON_FLUID_AMOUNT = 1440L; - - private static final Supplier SUPERCONDUCTOR_MATERIALS = () -> new SuperconductorMaterial[] { - new SuperconductorMaterial(Materials.Longasssuperconductornameforuvwire.getMolten(SUPERCON_FLUID_AMOUNT), 1.0f), - new SuperconductorMaterial( - Materials.Longasssuperconductornameforuhvwire.getMolten(SUPERCON_FLUID_AMOUNT), - 1.25f), - new SuperconductorMaterial(Materials.SuperconductorUEVBase.getMolten(SUPERCON_FLUID_AMOUNT), 1.5f), - new SuperconductorMaterial(Materials.SuperconductorUIVBase.getMolten(SUPERCON_FLUID_AMOUNT), 1.75f), - new SuperconductorMaterial(Materials.SuperconductorUMVBase.getMolten(SUPERCON_FLUID_AMOUNT), 2.0f), }; - - private static final FluidStack CATALYST_FLUID = Materials.Neutronium.getMolten(4608L); - private static final FluidStack COOLANT_FLUID = Materials.SuperCoolant.getFluid(10000L); - - private static final long CONSUME_INTERVAL = 20; - - private static class ControlSignal { - - private byte signal; - - public ControlSignal(byte sig) { - signal = sig; - } - - public void randomize() { - ThreadLocalRandom random = ThreadLocalRandom.current(); - // We want to give the final bit a lower chance at being on, since this bypasses most of the automation. - // If this bit has a 50% chance of being on, you could opt to not automate the degasser at all and never - // insert anything. This way you still get 50% output which might just be good enough. - - // To do this weighting, we simply only generate the lower 3 bits, and then with a smaller chance we add - // 8 to the result - signal = (byte) random.nextInt(0, 8); - if (random.nextInt(0, 5) == 0) { - signal += 8; - } - } - - public boolean getBit(int bit) { - if (bit < 0 || bit > 3) { - throw new IllegalArgumentException("Invalid bit index for degasser control signal"); - } - - // Shift signal so the requested bit is in the lowermost bit - // Then only keep the lowermost bit - // Then test if this bit is on. - return ((signal >> bit) & 1) == 1; - } - - public byte getSignal() { - return signal; - } - - // Get integer value representing control bits 1 and 2 - public int getControlBit12() { - return (signal >> 1) & 0b11; - } - - public boolean isZero() { - return signal == (byte) 0; - } - - @Override - public String toString() { - return Integer.toBinaryString(((int) signal) & 0b1111); - } - } - - private static class ControlBitStatus { - - public FluidStack stack; - public boolean satisfied; - - public ControlBitStatus(FluidStack stack, boolean satisfied) { - this.stack = stack; - this.satisfied = satisfied; - } - } - - private ControlSignal controlSignal = new ControlSignal((byte) 0); - - private final HashMap insertedStuffThisCycle = new HashMap<>(); - - private float outputMultiplier = 1.0f; - - private GT_MetaTileEntity_Hatch_DegasifierControlHatch controlHatch = null; - - public GT_MetaTileEntity_PurificationUnitDegasifier(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - protected GT_MetaTileEntity_PurificationUnitDegasifier(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitDegasifier(mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean active, boolean redstoneLevel) { - if (side == facing) { - if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN) }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - hintsOnly, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - return survivialBuildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET, - elementBudget, - env, - true); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the Residual Decontaminant Degasser Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo( - "At the start of the operation, the " + EnumChatFormatting.WHITE - + "Degasser Control Hatch" - + EnumChatFormatting.GRAY - + " will output a redstone signal.") - .addInfo("To succeed the recipe, you will need to successfully decode the instructions in the signal.") - .addInfo("To decode the signal, interpret the signal strength as a 4-bit number from 0-15.") - .addInfo("Denote the lowest bit as bit 1, and the highest as bit 4.") - .addSeparator() - .addInfo( - EnumChatFormatting.WHITE + "" - + EnumChatFormatting.BOLD - + "Bit 1: " - + EnumChatFormatting.BLUE - + "" - + EnumChatFormatting.BOLD - + "Ozone Sparging by Inert Gas") - .addInfo( - "If this bit is on, you must insert an " + EnumChatFormatting.WHITE - + "inert gas" - + EnumChatFormatting.GRAY - + " into the machine.") - .addInfo( - "To determine which gas to insert, interpret bits " + EnumChatFormatting.WHITE - + "2-3" - + EnumChatFormatting.GRAY - + " as a 2-bit number.") - .addInfo( - EnumChatFormatting.GRAY + "0: " - + EnumChatFormatting.RED - + "10000L " - + EnumChatFormatting.WHITE - + "Helium" - + EnumChatFormatting.GRAY - + " / " - + "1: " - + EnumChatFormatting.RED - + "7500L " - + EnumChatFormatting.WHITE - + "Neon" - + EnumChatFormatting.GRAY - + " / " - + "2: " - + EnumChatFormatting.RED - + "5000L " - + EnumChatFormatting.WHITE - + "Krypton" - + EnumChatFormatting.GRAY - + " / " - + "3: " - + EnumChatFormatting.RED - + "2500L " - + EnumChatFormatting.WHITE - + "Xenon") - .addSeparator() - .addInfo( - EnumChatFormatting.WHITE + "" - + EnumChatFormatting.BOLD - + "Bit 2: " - + EnumChatFormatting.BLUE - + "" - + EnumChatFormatting.BOLD - + "Superconductive Deionization") - .addInfo( - "If this bit is on, you must insert " + EnumChatFormatting.RED - + "1440L " - + EnumChatFormatting.WHITE - + "Molten Superconductor Base.") - .addInfo("Using higher tier superconductor provides bonus output.") - .addInfo( - "Output multiplier: " + EnumChatFormatting.DARK_GREEN - + "UV" - + EnumChatFormatting.GRAY - + ": " - + EnumChatFormatting.WHITE - + "1x" - + EnumChatFormatting.GRAY - + " / " - + EnumChatFormatting.DARK_RED - + "UHV" - + EnumChatFormatting.GRAY - + ": " - + EnumChatFormatting.WHITE - + "1.25x" - + EnumChatFormatting.GRAY - + " / " - + EnumChatFormatting.DARK_PURPLE - + "UEV" - + EnumChatFormatting.GRAY - + ": " - + EnumChatFormatting.WHITE - + "1.5x" - + EnumChatFormatting.GRAY - + " / " - + EnumChatFormatting.DARK_BLUE - + "" - + EnumChatFormatting.BOLD - + "UIV" - + EnumChatFormatting.GRAY - + ": " - + EnumChatFormatting.WHITE - + "1.75x" - + EnumChatFormatting.GRAY - + " / " - + EnumChatFormatting.RED - + "" - + EnumChatFormatting.BOLD - + "UMV" - + EnumChatFormatting.GRAY - + ": " - + EnumChatFormatting.WHITE - + "2x") - .addSeparator() - .addInfo( - EnumChatFormatting.WHITE + "" - + EnumChatFormatting.BOLD - + "Bit 3: " - + EnumChatFormatting.BLUE - + "" - + EnumChatFormatting.BOLD - + "Gravitationally-Generated Differential Vacuum Extraction") - .addInfo( - "If this bit is on, you must insert " + EnumChatFormatting.RED - + "4608L " - + EnumChatFormatting.WHITE - + "Molten Neutronium") - .addSeparator() - .addInfo( - EnumChatFormatting.WHITE + "" - + EnumChatFormatting.BOLD - + "Bit 4: " - + EnumChatFormatting.BLUE - + "" - + EnumChatFormatting.BOLD - + "Seldonian Settlement Process") - .addInfo( - "If this bit is on," + EnumChatFormatting.RED - + " DISREGARD " - + EnumChatFormatting.GRAY - + "all other bits and do not insert anything.") - .addSeparator() - .addInfo( - EnumChatFormatting.WHITE + "" - + EnumChatFormatting.BOLD - + "No bits: " - + EnumChatFormatting.BLUE - + "" - + EnumChatFormatting.BOLD - + "Machine Overload") - .addInfo("In rare cases, the machine may overload and output no control signal at all.") - .addInfo( - "To prevent machine damage, insert " + EnumChatFormatting.RED - + "10000L " - + EnumChatFormatting.WHITE - + "Super Coolant.") - .addSeparator() - .addInfo("The recipe can only succeed if the entire signal is decoded correctly.") - .addInfo("Inserting any fluid not requested by the signal will always void the recipe.") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "The penultimate stage of water purification, step seven, is an irregular series of complex") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "processes designed to remove any residual materials left by the decontaminants from the previous") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "steps such as any energetic ions, acids, clarifiers, or gasses. Depending on what the Degasser") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "detects in the water, it will request various materials to complete the processes listed above.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(17, 25, 17, false) - .addCasingInfoRangeColored( - "Heat-Resistant Trinium Plated Casing", - EnumChatFormatting.GRAY, - MIN_CASING, - 803, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Omni-Purpose Infinity Fused Glass", - EnumChatFormatting.GRAY, - 622, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Bedrockium Frame Box", - EnumChatFormatting.GRAY, - 126, - EnumChatFormatting.GOLD, - false) - .addController("Front center") - .addOutputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+, Any Trinium Casing", 1) - .addInputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+, Any Trinium Casing", 1) - .addOtherStructurePart( - "Degasser Control Hatch", - EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + ", Any Trinium Casing", - 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.purificationDegasifierRecipes; - } - - // Whether this fluid stack is accepted as a fluid in the inputs that the unit requires at runtime. - public static boolean isValidFluid(FluidStack stack) { - return stack.isFluidEqual(CATALYST_FLUID) || stack.isFluidEqual(COOLANT_FLUID) - || Arrays.stream(INERT_GASES.get()) - .anyMatch(stack::isFluidEqual) - || Arrays.stream(SUPERCONDUCTOR_MATERIALS.get()) - .anyMatch(mat -> stack.isFluidEqual(mat.fluid)); - } - - // Check if an exact match for this FluidStack was found in the map of inserted fluids - private boolean wasFluidInsertedExact(FluidStack toFind) { - FluidStack candidate = insertedStuffThisCycle.get(toFind.getFluid()); - // Fluid was inserted if found and the amount matches - return candidate != null && candidate.amount == toFind.amount; - } - - private ControlBitStatus isBit0Satisfied() { - // Check if instructions matching the first bit are satisfied. - // Instructions: - // If bit 0 is on, insert an inert gas. Bits 1-2 of the control signal determine which inert - // gas to insert. - - if (controlSignal.getBit(0)) { - // Grab the gas to insert from the control bits - int gasToInsert = controlSignal.getControlBit12(); - FluidStack gasStack = INERT_GASES.get()[gasToInsert]; - // Check if it was inserted - if (wasFluidInsertedExact(gasStack)) return new ControlBitStatus(gasStack, true); - else return new ControlBitStatus(null, false); - } - - // Bit 0 is not on, so this is always satisfied - return new ControlBitStatus(null, true); - } - - private ControlBitStatus isBit1Satisfied() { - // Check if instructions matching the second bit (bit 1) are satisfied. - // Instructions: - // If bit 1 is on, insert molten superconductor. - // Higher tier superconductor gives a better bonus. - // Only one type of superconductor may be inserted or the operation fails, - // so we don't care about the order in which we find it. - if (controlSignal.getBit(1)) { - // Find the first superconductor material in the list that was inserted with an exact match - Optional material = Arrays.stream(SUPERCONDUCTOR_MATERIALS.get()) - .filter(candidate -> wasFluidInsertedExact(candidate.fluid)) - .findFirst(); - if (material.isPresent()) { - // Get the material and set the output multiplier, then - // report success with the matching fluid. - SuperconductorMaterial scMaterial = material.get(); - this.outputMultiplier = scMaterial.multiplier; - return new ControlBitStatus(scMaterial.fluid, true); - } - // No superconductor was inserted but bit is on fail. - return new ControlBitStatus(null, false); - } - - return new ControlBitStatus(null, true); - } - - private ControlBitStatus isBit2Satisfied() { - // Check if instructions matching the third bit (bit 2) are satisfied. - // Instructions: - // If bit 2 is on, insert molten neutronium. - if (controlSignal.getBit(2)) { - // If steel was inserted, return it and report success. - if (wasFluidInsertedExact(CATALYST_FLUID)) return new ControlBitStatus(CATALYST_FLUID, true); - // Otherwise report failure. - return new ControlBitStatus(null, false); - } - - return new ControlBitStatus(null, true); - } - - private ControlBitStatus isBit3Satisfied() { - // Check if instructions matching the fourth bit (bit 3) are satisfied. - // Instructions: - // If bit 3 is on, do not insert anything. - if (controlSignal.getBit(3)) { - // Simply check if the map of inserted fluids is empty - if (insertedStuffThisCycle.isEmpty()) return new ControlBitStatus(null, true); - return new ControlBitStatus(null, false); - } - return new ControlBitStatus(null, true); - } - - private boolean areAllBitsSatisfied() { - // Check if each individual bit is satisfied. - // Additional instructions: If no bits are on, insert super coolant - - if (controlSignal.isZero()) { - return wasFluidInsertedExact(COOLANT_FLUID); - } - - ControlBitStatus bit0 = isBit0Satisfied(); - ControlBitStatus bit1 = isBit1Satisfied(); - ControlBitStatus bit2 = isBit2Satisfied(); - ControlBitStatus bit3 = isBit3Satisfied(); - - // If bit 3 is satisfied and on, all other bits are automatically satisfied, - // with no fluids being allowed to be inserted. - if (controlSignal.getBit(3) && bit3.satisfied) { - bit0 = bit1 = bit2 = new ControlBitStatus(null, true); - } - - if (bit0.satisfied && bit1.satisfied && bit2.satisfied && bit3.satisfied) { - // Check if the map contains any other stacks than the ones in the control bit statuses - for (FluidStack inserted : insertedStuffThisCycle.values()) { - // If the inserted stack is null, or any of the fluids required, this stack is fine. - if (inserted == null) continue; - if (bit0.stack != null && inserted.isFluidEqual(bit0.stack)) continue; - if (bit1.stack != null && inserted.isFluidEqual(bit1.stack)) continue; - if (bit2.stack != null && inserted.isFluidEqual(bit2.stack)) continue; - if (bit3.stack != null && inserted.isFluidEqual(bit3.stack)) continue; - // Otherwise it's a nonrequested stack and the recipe should fail. - return false; - } - return true; - } - - return false; - } - - @Override - public void startCycle(int cycleTime, int progressTime) { - super.startCycle(cycleTime, progressTime); - this.controlSignal.randomize(); - this.insertedStuffThisCycle.clear(); - this.outputMultiplier = 1.0f; - // Make sure to output the hatch control signal. - this.controlHatch.updateOutputSignal(this.controlSignal.getSignal()); - } - - private static ArrayList getDrainableFluidsFromHatch(GT_MetaTileEntity_Hatch_Input hatch) { - // Need special handling for quad input hatches, otherwise it only returns the first fluid in the hatch - if (hatch instanceof GT_MetaTileEntity_Hatch_MultiInput) { - return new ArrayList<>(Arrays.asList(((GT_MetaTileEntity_Hatch_MultiInput) hatch).getStoredFluid())); - } - return new ArrayList<>(Collections.singletonList(hatch.getFluid())); - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.runMachine(aBaseMetaTileEntity, aTick); - - // If machine is running, continuously consume all valid inputs - if (mMaxProgresstime > 0 && aTick % CONSUME_INTERVAL == 0) { - // For each hatch, check if each fluid inside is one of the valid fluids. If so, consume it all. - for (GT_MetaTileEntity_Hatch_Input hatch : mInputHatches) { - ArrayList drainableFluids = getDrainableFluidsFromHatch(hatch); - for (FluidStack fluid : drainableFluids) { - if (fluid != null && isValidFluid(fluid)) { - // Apparently this parameter is mostly ignored, but might as well get it right. - ForgeDirection front = hatch.getBaseMetaTileEntity() - .getFrontFacing(); - // Drain the fluid and save it - FluidStack drainedFluid = hatch.drain(front, fluid, true); - // If the fluid does not yet exist in the map, insert it. - // Otherwise, merge the amounts - insertedStuffThisCycle.merge( - fluid.getFluid(), - drainedFluid, - (a, b) -> new FluidStack(a.getFluid(), a.amount + b.amount)); - } - } - } - } - } - - @Override - public void addRecipeOutputs() { - super.addRecipeOutputs(); - if (outputMultiplier > 1.01f) { - FluidStack waterOutput = currentRecipe.mFluidOutputs[0]; - FluidStack bonusOutput = new FluidStack( - waterOutput.getFluid(), - (int) (waterOutput.amount * (outputMultiplier - 1.0f))); - this.addOutput(bonusOutput); - } - } - - @Override - public float calculateFinalSuccessChance() { - // Success chance is 100% when all bits are satisfied, 0% otherwise. - if (areAllBitsSatisfied()) { - return 100.0f; - } else { - return 0.0f; - } - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getWaterTier() { - return 7; - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_UHV; - } - - public boolean addControlHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DegasifierControlHatch) { - // Only allow a single control hatch, so fail structure check if there is already one - if (this.controlHatch == null) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - this.controlHatch = (GT_MetaTileEntity_Hatch_DegasifierControlHatch) aMetaTileEntity; - return true; - } - } - return false; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - this.casingCount = 0; - this.controlHatch = null; - if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; - if (casingCount < MIN_CASING) return false; - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - controlSignal = new ControlSignal(aNBT.getByte("controlSignal")); - outputMultiplier = aNBT.getFloat("outputMultiplier"); - NBTTagCompound fluidMap = aNBT.getCompoundTag("insertedFluidMap"); - for (String key : fluidMap.func_150296_c()) { - FluidStack fluid = FluidStack.loadFluidStackFromNBT(fluidMap.getCompoundTag(key)); - // Ignore if fluid failed to load, for example if the fluid ID was changed between versions - if (fluid == null) { - continue; - } - insertedStuffThisCycle.put(fluid.getFluid(), fluid); - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setByte("controlSignal", controlSignal.getSignal()); - aNBT.setFloat("outputMultiplier", outputMultiplier); - NBTTagCompound fluidMap = new NBTTagCompound(); - for (FluidStack stack : insertedStuffThisCycle.values()) { - NBTTagCompound compound = new NBTTagCompound(); - stack.writeToNBT(compound); - fluidMap.setTag( - stack.getFluid() - .getName(), - compound); - } - aNBT.setTag("insertedFluidMap", fluidMap); - } - - private static String generateInfoStringForBit(int i, ControlBitStatus status) { - String base = "Bit " + (i + 1) + " status: "; - if (status.satisfied) { - return base + EnumChatFormatting.GREEN + "OK"; - } else { - return base + EnumChatFormatting.RED + "NOT OK"; - } - } - - @Override - public String[] getInfoData() { - ArrayList info = new ArrayList<>(Arrays.asList(super.getInfoData())); - info.add("Current control signal: " + EnumChatFormatting.YELLOW + controlSignal.toString()); - info.add("Current output multiplier: " + EnumChatFormatting.YELLOW + outputMultiplier); - for (FluidStack stack : insertedStuffThisCycle.values()) { - info.add( - "Fluid inserted this cycle: " + EnumChatFormatting.YELLOW - + stack.amount - + "L " - + stack.getLocalizedName()); - } - info.add(generateInfoStringForBit(0, isBit0Satisfied())); - info.add(generateInfoStringForBit(1, isBit1Satisfied())); - info.add(generateInfoStringForBit(2, isBit2Satisfied())); - info.add(generateInfoStringForBit(3, isBit3Satisfied())); - return info.toArray(new String[] {}); - } - - private enum SpecialHatchElement implements IHatchElement { - - ControlHatch(GT_MetaTileEntity_PurificationUnitDegasifier::addControlHatchToMachineList, - GT_MetaTileEntity_Hatch_DegasifierControlHatch.class) { - - @Override - public long count(GT_MetaTileEntity_PurificationUnitDegasifier mte) { - return mte.controlHatch == null ? 0 : 1; - } - }; - - private final List> mteClasses; - private final IGT_HatchAdder adder; - - @SafeVarargs - SpecialHatchElement(IGT_HatchAdder adder, - Class... mteClasses) { - this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); - this.adder = adder; - } - - @Override - public List> mteClasses() { - return mteClasses; - } - - public IGT_HatchAdder adder() { - return adder; - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitFlocculation.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitFlocculation.java deleted file mode 100644 index 3f414d0eca..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitFlocculation.java +++ /dev/null @@ -1,489 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -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.AuthorNotAPenguin; -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.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import net.minecraft.init.Blocks; -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 com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; -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.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_StructureUtility; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; - -public class GT_MetaTileEntity_PurificationUnitFlocculation - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; - - private static final int STRUCTURE_X_OFFSET = 4; - private static final int STRUCTURE_Y_OFFSET = 3; - private static final int STRUCTURE_Z_OFFSET = 0; - - /** - * Amount of input fluid needed to boost the success chance by another level - */ - public static final long INPUT_CHEMICAL_PER_LEVEL = 100000; - /** - * Amount of waste water produced for each success chance level. This matches the amount of input fluid - * so it can be perfectly recycled into each other. - */ - private static final long WASTE_WATER_PER_LEVEL = INPUT_CHEMICAL_PER_LEVEL; - /** - * Additive boost to success chance for each level of input fluid supplied - */ - public static final float SUCCESS_PER_LEVEL = 10.0f; - /** - * Amount of ticks between each tick the unit will try to consume input fluid - */ - private static final int CONSUME_INTERVAL = 1 * SECONDS; - - /** - * Fluid that needs to be supplied to boost success chance - */ - private static final Materials INPUT_CHEMICAL = Materials.PolyAluminiumChloride; - /** - * Output fluid to be produced as waste. The intended behaviour is that this output fluid can be cycled - * semi-perfectly into the input fluid. - */ - private static final Materials OUTPUT_WASTE = Materials.FlocculationWasteLiquid; - - /** - * Total amount of input fluid consumed during this recipe cycle. - */ - private long inputFluidConsumed = 0; - - private static final String[][] structure = new String[][] - // spotless:off - { - { " ", " ", " BBBBBBB ", " BBB~BBB ", " BBBBBBB " }, - { " ", " ", " B B ", " BWWWWWB ", " BCCCCCB " }, - { " ", " ", " B B ", " GWWWWWG ", " BCAAACB " }, - { " ", " ", " B B ", " GWWWWWG ", " BCAAACB " }, - { " ", " ", " B B ", " GWWWWWG ", " BCAAACB " }, - { " ", " EE EE ", " BE EB ", " BEWWWEB ", " BCCCCCB " }, - { "D D", "DEE EED", "DBBBBBBBD", "DBBBBBBBD", "DBBBBBBBD" }, - { "DD DD", "DD DD", "DD DD", "DD DD", "DD DD" } - }; - // spotless:on - - private static final int MAIN_CASING_INDEX = getTextureIndex(GregTech_API.sBlockCasings9, 6); - - private int casingCount = 0; - private static final int MIN_CASING = 56; - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - .addShape( - STRUCTURE_PIECE_MAIN_SURVIVAL, - Arrays.stream(structure) - .map( - sa -> Arrays.stream(sa) - .map(s -> s.replaceAll("W", " ")) - .toArray(String[]::new)) - .toArray(String[][]::new)) - // Filter machine casing - .addElement('A', ofBlock(GregTech_API.sBlockCasings3, 11)) - .addElement( - 'B', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(t.getAllowedHatches()) - .casingIndex(MAIN_CASING_INDEX) - .dot(1) - .build()), - // Clean Flocculation Casing - onElementPass(t -> t.casingCount++, ofBlock(GregTech_API.sBlockCasings9, 6)))) - // Reinforced Sterile Water Plant Casing - .addElement('C', ofBlock(GregTech_API.sBlockCasings9, 5)) - // Sterile Water Plant Casing - .addElement('D', ofBlock(GregTech_API.sBlockCasings9, 4)) - .addElement('E', ofFrame(Materials.Adamantium)) - .addElement('W', ofBlock(Blocks.water, 0)) - // Tinted industrial glass - .addElement('G', ofBlockAnyMeta(GregTech_API.sBlockTintedGlass)) - .build(); - - List> getAllowedHatches() { - return ImmutableList.of(InputBus, InputHatch, OutputBus, OutputHatch); - } - - public GT_MetaTileEntity_PurificationUnitFlocculation(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PurificationUnitFlocculation(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitFlocculation(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), - 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), - 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX) }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - hintsOnly, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - int built = survivialBuildPiece( - STRUCTURE_PIECE_MAIN_SURVIVAL, - stackSize, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET, - elementBudget, - env, - true); - if (built == -1) { - GT_Utility.sendChatToPlayer( - env.getActor(), - EnumChatFormatting.GREEN + "Auto placing done ! Now go place the water yourself !"); - return 0; - } - return built; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected IAlignmentLimits getInitialAlignmentLimits() { - // Do not allow rotation when water would flow out - return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped(); - } - - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - casingCount = 0; - if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; - - // At most two input hatches allowed - if (mInputHatches.size() > 2) { - return false; - } - - // At most two output hatches allowed - if (mOutputHatches.size() > 2) { - return false; - } - - if (casingCount < MIN_CASING) return false; - - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the Flocculation Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo( - "Supply with " + EnumChatFormatting.WHITE - + INPUT_CHEMICAL.mLocalizedName - + EnumChatFormatting.GRAY - + " to operate.") - .addInfo( - "Outputs " + EnumChatFormatting.WHITE - + OUTPUT_WASTE.mLocalizedName - + EnumChatFormatting.GRAY - + " that can be recycled.") - .addSeparator() - .addInfo( - "During operation, will consume ALL " + EnumChatFormatting.WHITE - + INPUT_CHEMICAL.mLocalizedName - + EnumChatFormatting.GRAY - + " in the input hatch.") - .addInfo( - "At the end of the recipe, for every " + EnumChatFormatting.RED - + INPUT_CHEMICAL_PER_LEVEL - + "L " - + EnumChatFormatting.GRAY - + "of " - + EnumChatFormatting.WHITE - + INPUT_CHEMICAL.mLocalizedName - + EnumChatFormatting.GRAY - + " consumed") - .addInfo( - "gain an additive " + EnumChatFormatting.RED - + SUCCESS_PER_LEVEL - + "%" - + EnumChatFormatting.GRAY - + " increase to success. If total fluid supplied is not") - .addInfo( - "a multiple of " + EnumChatFormatting.RED - + INPUT_CHEMICAL_PER_LEVEL - + "L" - + EnumChatFormatting.GRAY - + ", a penalty to success is applied using the following formula:") - .addInfo(EnumChatFormatting.GREEN + "Success = Success * 2^(-10 * Overflow ratio)") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "Step three in purifying water is to remove microscopic contaminants such as dusts, microplastics and other") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "pollutants using a clarifying agent (In this case, polyaluminium chloride) to cause flocculation - the process") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "of aggregating dispersed suspended particles from a solution into larger clumps for further filtration.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(7, 4, 7, false) - .addCasingInfoRangeColored( - "Slick Sterile Flocculation Casing", - EnumChatFormatting.GRAY, - MIN_CASING, - 65, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Sterile Water Plant Casing", - EnumChatFormatting.GRAY, - 16, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Reinforced Sterile Water Plant Casing", - EnumChatFormatting.GRAY, - 30, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Tinted Industrial Glass", - EnumChatFormatting.GRAY, - 6, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Adamantium Frame Box", - EnumChatFormatting.GRAY, - 12, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Filter Machine Casing", - EnumChatFormatting.GRAY, - 9, - EnumChatFormatting.GOLD, - false) - .addController("Front center") - .addOutputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addInputHatch( - EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "-" + EnumChatFormatting.GOLD + "2", - 1) - .addOutputHatch( - EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "-" + EnumChatFormatting.GOLD + "2", - 1) - .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void startCycle(int cycleTime, int progressTime) { - super.startCycle(cycleTime, progressTime); - // Reset amount of fluid consumed in this cycle. - this.inputFluidConsumed = 0; - } - - @Override - public void endCycle() { - super.endCycle(); - // Output waste water proportional to amount of boost levels. We do this even when the recipe fails, so you can - // always fully recycle. - // NOTE: If this process ever PRODUCES excess chlorine, there is a recipe bug. - int levels = calculateBoostLevels(); - long amount = levels * WASTE_WATER_PER_LEVEL; - this.addFluidOutputs(new FluidStack[] { OUTPUT_WASTE.getFluid(amount) }); - // Make sure to reset consumed fluid (again) - this.inputFluidConsumed = 0; - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.runMachine(aBaseMetaTileEntity, aTick); - - // Consume all input fluid periodically, only when running - if (aTick % CONSUME_INTERVAL == 0 && mMaxProgresstime > 0) { - // Iterate over all fluids stored - List fluids = this.getStoredFluids(); - for (FluidStack fluid : fluids) { - // If this FluidStack is the input chemical, consume it all - if (fluid.getFluid() - .equals(INPUT_CHEMICAL.mFluid)) { - this.inputFluidConsumed += fluid.amount; - if (!this.depleteInput(fluid)) { - stopMachine(ShutDownReasonRegistry.outOfFluid(fluid)); - } - } - } - } - } - - private int calculateBoostLevels() { - return (int) Math.floor((float) this.inputFluidConsumed / (float) INPUT_CHEMICAL_PER_LEVEL); - } - - @Override - public float calculateFinalSuccessChance() { - // Amount of times the required amount of input fluid was fully inserted - int levels = calculateBoostLevels(); - // Target amount of fluid needed to reach this amount of boost levels - long targetAmount = levels * INPUT_CHEMICAL_PER_LEVEL; - // Amount of excess fluid inserted. - long overflow = inputFluidConsumed - targetAmount; - // Base boost chance, before applying overflow penalty - float boost = SUCCESS_PER_LEVEL * levels; - // If there was any overflow, apply an exponential penalty multiplier based on percentage overflow - if (overflow > 0) { - float overflowPct = (float) overflow / INPUT_CHEMICAL_PER_LEVEL; - float penaltyMultiplier = (float) Math.pow(2.0f, overflowPct * -10.0); - return Math.max(0.0f, (this.currentRecipeChance + boost) * penaltyMultiplier); - } else { - return Math.min(100.0f, this.currentRecipeChance + boost); - } - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getWaterTier() { - return 3; - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_ZPM; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.purificationFlocculationRecipes; - } - - @Override - public String[] getInfoData() { - ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); - infoData.add( - INPUT_CHEMICAL.mLocalizedName + " consumed this cycle: " - + EnumChatFormatting.RED - + inputFluidConsumed - + "L"); - return infoData.toArray(new String[] {}); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setLong("mInputFluidConsumed", inputFluidConsumed); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.inputFluidConsumed = aNBT.getLong("mInputFluidConsumed"); - } - - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.GT_MACHINES_COAGULATION_LOOP.resourceLocation; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitOzonation.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitOzonation.java deleted file mode 100644 index a539cd157e..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitOzonation.java +++ /dev/null @@ -1,299 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -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.AuthorNotAPenguin; -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.util.GT_StructureUtility.ofFrame; - -import net.minecraft.item.ItemStack; -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 com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -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.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_PurificationUnitOzonation - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; - - private static final String[][] structure = new String[][] { - // spotless:off - { " ", " ", " A ", " A ", " AAA ", " AAA ", " A A ", " A A ", " A A ", " A~A " }, - { " A ", " A ", " A A ", " A A ", "BBBBA A", "BDDBA A", "BBBBA D A", "E A D A", "E A D A", "E AAAAA" }, - { " AAA ", " A A ", " A A", " A A", "BDDBA A", "O BA A", "BBBBA A", " C A A", " CCA A", " AAAAA" }, - { " A ", " A ", " A A ", " A A ", "BBBBA A", "BDDBA A", "BBBBA A", "E A A", "E A A", "E AAAAA" }, - { " ", " ", " A ", " A ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA " } }; - // spotless:on - - private static final int MAIN_CASING_INDEX = getTextureIndex(GregTech_API.sBlockCasings9, 10); - - private static final int OFFSET_X = 6; - private static final int OFFSET_Y = 9; - private static final int OFFSET_Z = 0; - - /** - * If the player inserts more ozone gas than this amount, the multi will explode. - */ - public static final int MAX_OZONE_GAS_FOR_EXPLOSION = 1000 * (int) Math.pow(2, 10); - - private int casingCount = 0; - private static final int MIN_CASING = 96; - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - // Inert Filtration Casing - .addElement( - 'A', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(ImmutableList.of(InputHatch, OutputHatch, OutputBus)) - .casingIndex(getTextureIndex(GregTech_API.sBlockCasings9, 10)) - .dot(1) - .build()), - onElementPass(t -> t.casingCount++, ofBlock(GregTech_API.sBlockCasings9, 10)))) - // High Pressure Resistant Casing (possibly placeholder name) - .addElement('B', ofBlock(GregTech_API.sBlockCasings9, 9)) - // PTFE pipe casing - .addElement('C', ofBlock(GregTech_API.sBlockCasings8, 1)) - // Any tinted industrial glass - .addElement('D', ofBlockAnyMeta(GregTech_API.sBlockTintedGlass)) - .addElement('E', ofFrame(Materials.TungstenSteel)) - // Ozone input hatch - .addElement( - 'O', - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(InputHatch) - .casingIndex(getTextureIndex(GregTech_API.sBlockCasings9, 9)) - .dot(2) - .buildAndChain(ofBlock(GregTech_API.sBlockCasings9, 9)))) - .build(); - - public GT_MetaTileEntity_PurificationUnitOzonation(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - protected GT_MetaTileEntity_PurificationUnitOzonation(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitOzonation(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), - 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), - 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX) }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, OFFSET_X, OFFSET_Y, OFFSET_Z); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - return survivialBuildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - OFFSET_X, - OFFSET_Y, - OFFSET_Z, - elementBudget, - env, - true); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the Ozonation Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo( - "Will explode if the input hatch contains more than " + EnumChatFormatting.RED - + MAX_OZONE_GAS_FOR_EXPLOSION - + "L " - + EnumChatFormatting.WHITE - + "Ozone Gas.") - .addInfo( - "Receives a " + EnumChatFormatting.RED - + "20%" - + EnumChatFormatting.GRAY - + " bonus to success chance for every doubling of " - + EnumChatFormatting.WHITE - + "Ozone Gas.") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "The second step in water purification is ozonation, which involves injecting large quantities of small") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "bubbles of highly reactive ozone gas into the water. This removes trace element contaminants like") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "sulfur, iron and manganese, creating insoluble oxide compounds which are then filtered out.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(9, 10, 5, false) - .addCasingInfoRangeColored( - "Inert Filtration Casing", - EnumChatFormatting.GRAY, - MIN_CASING, - 102, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Reactive Gas Containment Casing", - EnumChatFormatting.GRAY, - 27, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Any Tinted Industrial Glass", - EnumChatFormatting.GRAY, - 9, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Tungstensteel Frame Box", - EnumChatFormatting.GRAY, - 6, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored("PTFE Pipe Casing", EnumChatFormatting.GRAY, 3, EnumChatFormatting.GOLD, false) - .addOutputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addInputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addOutputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) - .addOtherStructurePart("Input Hatch (Ozone)", EnumChatFormatting.GOLD + "1", 2) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.purificationOzonationRecipes; - } - - @NotNull - @Override - public CheckRecipeResult checkProcessing() { - // First do recipe checking logic - CheckRecipeResult result = super.checkProcessing(); - if (!result.wasSuccessful()) return result; - // Look for ozone, blow up if more than max allowed - for (FluidStack fluid : this.storedFluids) { - if (fluid.isFluidEqual(Materials.Ozone.getGas(1L))) { - if (fluid.amount > MAX_OZONE_GAS_FOR_EXPLOSION) { - // TODO: Fix crash in hatch - // this.explodeMultiblock(); - } - } - } - return result; - } - - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.GT_MACHINES_OZONATION_LOOP.resourceLocation; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getWaterTier() { - return 2; - } - - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - casingCount = 0; - if (!checkPiece(STRUCTURE_PIECE_MAIN, OFFSET_X, OFFSET_Y, OFFSET_Z)) return false; - if (casingCount < MIN_CASING) return false; - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_LuV; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitParticleExtractor.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitParticleExtractor.java deleted file mode 100644 index 17945f7cc9..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitParticleExtractor.java +++ /dev/null @@ -1,566 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -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.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.AuthorNotAPenguin; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.concurrent.ThreadLocalRandom; - -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.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.ItemList; -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_Hatch_Input; -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_StructureUtility; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import gregtech.common.items.GT_MetaGenerated_Item_03; -import gregtech.common.items.ID_MetaItem_03; - -public class GT_MetaTileEntity_PurificationUnitParticleExtractor - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - public static long BARYONIC_MATTER_OUTPUT = 2000L; - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final int STRUCTURE_X_OFFSET = 8; - private static final int STRUCTURE_Y_OFFSET = 8; - private static final int STRUCTURE_Z_OFFSET = 0; - - static final String[][] structure = new String[][] { - // spotless:off - { " ", " ", " ", " ", " ", " ", " AAAAA ", " AAAAA ", " AA~AA ", " AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " " }, - { " ", " E ", " E ", " E ", " E ", " E ", " AAAAA ", " AAAAA ", " EEEEEAAAAAEEEEE ", " AAAAA ", " AAAAA ", " E ", " E ", " E ", " E ", " E ", " " }, - { " ", " E ", " ", " ", " ", " ", " CCCCC ", " CDDDC ", " E CDBDC E ", " CDDDC ", " CCCCC ", " ", " ", " ", " ", " E ", " " }, - { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, - { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " "," E ", " " }, - { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, - { " AAAAA ", " AAAAA ", " CCCCC ", " ", " ", " ", "AAC AAAAA CAA", "AAC ADDDA CAA", "AAC ADBDA CAA", "AAC ADDDA CAA", "AAC AAAAA CAA", " ", " ", " ", " CCCCC ", " AAAAA ", " AAAAA " }, - { " AAAAA ", " AAAAA ", " CDDDC ", " DDD ", " DDD ", " DDD ", "AAC ADDDA CAA", "AADDDDD DDDDDAA", "AADDDDD B DDDDDAA", "AADDDDD DDDDDAA", "AAC ADDDA CAA", " DDD ", " DDD ", " DDD ", " CDDDC ", " AAAAA ", " AAAAA " }, - { " AAAAA ", " EEEEEAAAAAEEEEE ", " E CDBDC E ", " E DBD E ", " E DBD E ", " E DBD E ", "AAC ADBDA CAA", "AADDDDD B DDDDDAA", "AABBBBBBBBBBBBBAA", "AADDDDD B DDDDDAA", "AAC ADBDA CAA", " E DBD E ", " E DBD E ", " E DBD E ", " E CDBDC E ", " EEEEEAAAAAEEEEE ", " AAAAA " }, - { " AAAAA ", " AAAAA ", " CDDDC ", " DDD ", " DDD ", " DDD ", "AAC ADDDA CAA", "AADDDDD DDDDDAA", "AADDDDD B DDDDDAA", "AADDDDD DDDDDAA", "AAC ADDDA CAA", " DDD ", " DDD ", " DDD ", " CDDDC ", " AAAAA ", " AAAAA " }, - { " AAAAA ", " AAAAA ", " CCCCC ", " ", " ", " ", "AAC AAAAA CAA", "AAC ADDDA CAA", "AAC ADBDA CAA", "AAC ADDDA CAA", "AAC AAAAA CAA", " ", " ", " ", " CCCCC ", " AAAAA ", " AAAAA " }, - { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, - { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, - { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, - { " ", " E ", " ", " ", " ", " ", " CCCCC ", " CDDDC ", " E CDBDC E ", " CDDDC ", " CCCCC ", " ", " ", " ", " ", " E ", " " }, - { " ", " E ", " E ", " E ", " E ", " E ", " AAAAA ", " AAAAA ", " EEEEEAAAAAEEEEE ", " AAAAA ", " AAAAA ", " E ", " E ", " E ", " E ", " E ", " " }, - { " ", " ", " ", " ", " ", " ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " " } }; - // spotless:on - - // Dimensionally transcendent casing (placeholder) - private static final int CASING_INDEX_MAIN = getTextureIndex(GregTech_API.sBlockCasings10, 2); - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - // Quark Exclusion Casing - .addElement( - 'A', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(Arrays.asList(InputBus, OutputBus, InputHatch, OutputHatch)) - .dot(1) - .casingIndex(CASING_INDEX_MAIN) - .build()), - onElementPass(t -> t.numCasings++, ofBlock(GregTech_API.sBlockCasings10, 2)))) - // Particle Beam Guidance Pipe Casing - .addElement('B', ofBlock(GregTech_API.sBlockCasings9, 14)) - // Femtometer-Calibrated Particle Beam Casing - .addElement('C', ofBlock(GregTech_API.sBlockCasings9, 15)) - // Non-Photonic Matter Exclusion Glass - .addElement('D', ofBlock(GregTech_API.sBlockGlass1, 3)) - .addElement('E', ofFrame(Materials.Bedrockium)) - .build(); - - private static class CatalystCombination { - - public ItemStack firstCatalyst; - public ItemStack secondCatalyst; - - public static ItemList[] CATALYST_ITEMS = new ItemList[] { ItemList.Quark_Creation_Catalyst_Up, - ItemList.Quark_Creation_Catalyst_Down, ItemList.Quark_Creation_Catalyst_Bottom, - ItemList.Quark_Creation_Catalyst_Top, ItemList.Quark_Creation_Catalyst_Strange, - ItemList.Quark_Creation_Catalyst_Charm }; - - public CatalystCombination(ItemStack first, ItemStack second) { - firstCatalyst = first; - secondCatalyst = second; - } - - public boolean matches(ItemStack a, ItemStack b) { - return (a.isItemEqual(firstCatalyst) && b.isItemEqual(secondCatalyst)) - || (b.isItemEqual(firstCatalyst) && a.isItemEqual(secondCatalyst)); - } - - public NBTTagCompound saveToNBT() { - NBTTagCompound nbt = new NBTTagCompound(); - NBTTagCompound first = new NBTTagCompound(); - NBTTagCompound second = new NBTTagCompound(); - firstCatalyst.writeToNBT(first); - secondCatalyst.writeToNBT(second); - nbt.setTag("first", first); - nbt.setTag("second", second); - return nbt; - } - - public static CatalystCombination readFromNBT(NBTTagCompound nbt) { - NBTTagCompound first = nbt.getCompoundTag("first"); - NBTTagCompound second = nbt.getCompoundTag("second"); - return new CatalystCombination( - ItemStack.loadItemStackFromNBT(first), - ItemStack.loadItemStackFromNBT(second)); - } - } - - private static CatalystCombination generateNewCombination() { - ThreadLocalRandom random = ThreadLocalRandom.current(); - // Generate two unique indices into the list - int firstIndex = random.nextInt(0, CatalystCombination.CATALYST_ITEMS.length); - int secondIndex = random.nextInt(0, CatalystCombination.CATALYST_ITEMS.length); - while (secondIndex == firstIndex) { - secondIndex = random.nextInt(0, CatalystCombination.CATALYST_ITEMS.length); - } - - return new CatalystCombination( - CatalystCombination.CATALYST_ITEMS[firstIndex].get(1), - CatalystCombination.CATALYST_ITEMS[secondIndex].get(1)); - } - - private CatalystCombination currentCombination = null; - - private ArrayList insertedCatalysts = new ArrayList<>(); - - private static final long CATALYST_BASE_COST = 144L; - - private int correctStartIndex = -1; - private int numCasings = 0; - private static final int MIN_CASINGS = 300; - - public GT_MetaTileEntity_PurificationUnitParticleExtractor(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PurificationUnitParticleExtractor(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitParticleExtractor(mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean active, boolean redstoneLevel) { - if (side == facing) { - if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) - .extFacing() - .glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN) }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - hintsOnly, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - return survivialBuildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET, - elementBudget, - env, - true); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - numCasings = 0; - if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; - if (numCasings < MIN_CASINGS) return false; - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the Absolute Baryonic Perfection Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo( - "Insert " + EnumChatFormatting.WHITE - + "Quark Releasing Catalysts " - + EnumChatFormatting.GRAY - + "into the input bus while running.") - .addInfo( - "Every recipe cycle, a different combination of " + EnumChatFormatting.RED - + "2" - + EnumChatFormatting.GRAY - + " different " - + EnumChatFormatting.WHITE - + "Quark Releasing Catalysts") - .addInfo("will correctly identify the lone quark and succeed the recipe.") - .addSeparator() - .addInfo( - "Every " + EnumChatFormatting.RED - + "20" - + EnumChatFormatting.GRAY - + " ticks, consumes ALL catalysts in the input bus.") - .addInfo( - "The base cost of inserting a catalyst is " + EnumChatFormatting.RED - + CATALYST_BASE_COST - + "L" - + EnumChatFormatting.WHITE - + " Molten Infinity") - .addInfo("For every duplicate occurrence of an inserted catalyst in the sequence, this cost is doubled.") - .addSeparator() - .addInfo("Keeps track of the entire sequence of catalysts inserted this recipe.") - .addInfo( - "If the correct catalyst combination is in the sequence of inserted catalysts, immediately outputs " - + EnumChatFormatting.WHITE - + "Stabilised Baryonic Matter") - .addInfo("At the end of the recipe, all incorrectly inserted catalysts are returned in the output bus.") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "The final stage of water purification goes beyond subatomic particles and identifies the smallest") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "possible imperfections within the baryons themselves. By correctly identifying which pairs of quark") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "flavors are required, the unit will activate the catalysts, stabilizing the errant particles.") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "This ultimately creates both Stabilised Baryonic Matter and, most importantly, absolutely perfectly purified water.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(17, 17, 17, false) - .addCasingInfoMinColored( - "Quark Exclusion Casing", - EnumChatFormatting.GRAY, - MIN_CASINGS, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Femtometer-Calibrated Particle Beam Casing", - EnumChatFormatting.GRAY, - 96, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Particle Beam Guidance Pipe Casing", - EnumChatFormatting.GRAY, - 37, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Non-Photonic Matter Exclusion Glass", - EnumChatFormatting.GRAY, - 240, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Bedrockium Frame Box", - EnumChatFormatting.GRAY, - 108, - EnumChatFormatting.GOLD, - false) - .addController("Front Center") - .addInputBus("Any Quark Exclusion Casing", 1) - .addInputHatch("Any Quark Exclusion Casing", 1) - .addOutputBus("Any Quark Exclusion Casing", 1) - .addOutputHatch("Any Quark Exclusion Casing", 1) - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.purificationParticleExtractionRecipes; - } - - @Override - public void startCycle(int cycleTime, int progressTime) { - super.startCycle(cycleTime, progressTime); - this.insertedCatalysts.clear(); - this.currentCombination = generateNewCombination(); - correctStartIndex = -1; - } - - private boolean isCatalyst(ItemStack stack) { - if (stack.getItem() instanceof GT_MetaGenerated_Item_03) { - int meta = stack.getItemDamage() - 32000; // why, greg. - return meta >= ID_MetaItem_03.Quark_Creation_Catalyst_Up.ID - && meta <= ID_MetaItem_03.Quark_Creation_Catalyst_Top.ID; - } - return false; - } - - @Override - public void endCycle() { - super.endCycle(); - // Output incorrect indices unchanged, the spent ones will follow if recipe was successful from the actual - // recipe outputs - for (int i = 0; i < insertedCatalysts.size(); ++i) { - if (i == correctStartIndex || i == correctStartIndex + 1) continue; - - addOutput(insertedCatalysts.get(i)); - } - } - - @Override - public float calculateFinalSuccessChance() { - // Only succeed if correct combination was inserted - if (correctStartIndex != -1) return 100.0f; - else return 0.0f; - } - - private int calculateCatalystCost(ItemStack newCatalyst) { - // Count number of previously inserted catalysts - int count = 0; - for (ItemStack cat : this.insertedCatalysts) { - // We already assume that newCatalyst is a valid catalyst item - if (cat.getItemDamage() == newCatalyst.getItemDamage()) { - ++count; - } - } - // Cost is exponential in function of amount of duplicate catalysts - return (int) (Math.pow(2, count) * CATALYST_BASE_COST); - } - - // Returns the first index of a valid combination, or -1 if there is no valid combination in the sequence - public int checkSequence() { - // Loop over the entire sequence and check if any pair contains a valid combination - for (int i = 0; i < insertedCatalysts.size() - 1; ++i) { - ItemStack first = insertedCatalysts.get(i); - ItemStack second = insertedCatalysts.get(i + 1); - // Found a match, return its starting index - if (currentCombination.matches(first, second)) { - return i; - } - } - // No match found, return -1 - return -1; - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.runMachine(aBaseMetaTileEntity, aTick); - // Every 20 ticks, add all catalysts from the input bus to the internal inventory. - if (mMaxProgresstime > 0 && aTick % 20 == 0) { - ArrayList storedInputs = getStoredInputs(); - // For each stack in the input, check if it is a valid catalyst item and if so consume it - for (ItemStack stack : storedInputs) { - if (isCatalyst(stack)) { - // Try to deplete catalyst cost first - int cost = calculateCatalystCost(stack); - FluidStack inputCost = Materials.Infinity.getMolten(cost); - // Drain the input cost directly from a hatch since we are not inside - // recipe processing - boolean drained = false; - for (GT_MetaTileEntity_Hatch_Input hatch : this.mInputHatches) { - FluidStack drainedStack = hatch.drain(ForgeDirection.UNKNOWN, inputCost, true); - if (drainedStack != null && drainedStack.amount == inputCost.amount) { - drained = true; - break; - } - } - // If we could not drain, stop the machine - if (!drained) { - stopMachine(ShutDownReasonRegistry.outOfFluid(inputCost)); - return; - } - // Now add the catalysts to the list, one by one since there may be multiples and we want to - // keep them as single entries in the list - for (int i = 0; i < stack.stackSize; ++i) { - ItemStack singleStack = new ItemStack(stack.getItem(), 1, stack.getItemDamage()); - this.insertedCatalysts.add(singleStack); - } - // Then deplete the entire stack - this.depleteInput(stack); - } - } - - // Only do this check if we didn't find a correct combination yet - if (correctStartIndex != -1) return; - - // Now check the sequence for a correct combination - correctStartIndex = checkSequence(); - // If we found something, immediately output stable baryonic matter - if (correctStartIndex != -1) addOutput(Materials.StableBaryonicMatter.getFluid(BARYONIC_MATTER_OUTPUT)); - } - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - NBTTagCompound insertedNBT = new NBTTagCompound(); - for (int i = 0; i < insertedCatalysts.size(); ++i) { - ItemStack inserted = insertedCatalysts.get(i); - NBTTagCompound itemNBT = new NBTTagCompound(); - inserted.writeToNBT(itemNBT); - insertedNBT.setTag(Integer.toString(i), itemNBT); - } - aNBT.setTag("insertedItems", insertedNBT); - aNBT.setInteger("correctStartIndex", correctStartIndex); - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - // Generate a random combination on load - currentCombination = generateNewCombination(); - if (aNBT.hasKey("insertedItems")) { - NBTTagCompound insertedList = aNBT.getCompoundTag("insertedItems"); - // Initialize empty list with correct size - this.insertedCatalysts = new ArrayList<>( - Collections.nCopies( - insertedList.func_150296_c() - .size(), - null)); - for (String key : insertedList.func_150296_c()) { - NBTTagCompound itemCompound = insertedList.getCompoundTag(key); - int index = Integer.parseInt(key); - this.insertedCatalysts.set(index, ItemStack.loadItemStackFromNBT(itemCompound)); - } - } - if (aNBT.hasKey("correctStartIndex")) { - correctStartIndex = aNBT.getInteger("correctStartIndex"); - } - super.loadNBTData(aNBT); - } - - private String getCorrectlyDecodedString() { - if (correctStartIndex != -1) { - return EnumChatFormatting.GREEN + "Yes"; - } - return EnumChatFormatting.RED + "No"; - } - - public EnumChatFormatting getQuarkColor(ItemStack stack) { - int meta = stack.getItemDamage() - 32000; - if (meta == ID_MetaItem_03.Quark_Creation_Catalyst_Up.ID) return EnumChatFormatting.BLUE; - if (meta == ID_MetaItem_03.Quark_Creation_Catalyst_Down.ID) return EnumChatFormatting.LIGHT_PURPLE; - if (meta == ID_MetaItem_03.Quark_Creation_Catalyst_Strange.ID) return EnumChatFormatting.YELLOW; - if (meta == ID_MetaItem_03.Quark_Creation_Catalyst_Charm.ID) return EnumChatFormatting.GREEN; - if (meta == ID_MetaItem_03.Quark_Creation_Catalyst_Bottom.ID) return EnumChatFormatting.AQUA; - if (meta == ID_MetaItem_03.Quark_Creation_Catalyst_Top.ID) return EnumChatFormatting.RED; - return EnumChatFormatting.GRAY; - } - - public String[] getInfoData() { - ArrayList info = new ArrayList<>(Arrays.asList(super.getInfoData())); - info.add("Catalyst insertion history for this recipe cycle"); - for (int i = 0; i < insertedCatalysts.size(); ++i) { - ItemStack stack = insertedCatalysts.get(i); - String name = stack.getDisplayName(); - String[] split = name.split("-"); - info.add( - EnumChatFormatting.YELLOW + "" - + (i + 1) - + ": " - + getQuarkColor(stack) - + split[0] - + EnumChatFormatting.GRAY - + "-" - + split[1]); - } - info.add("Quark Combination correctly identified: " + getCorrectlyDecodedString()); - return info.toArray(new String[] {}); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getWaterTier() { - return 8; - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_UEV; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPhAdjustment.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPhAdjustment.java deleted file mode 100644 index 58b689b04d..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPhAdjustment.java +++ /dev/null @@ -1,611 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -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 gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.AuthorNotAPenguin; -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.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -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.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; -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_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -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_StructureUtility; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.IGT_HatchAdder; -import gregtech.api.util.shutdown.SimpleShutDownReason; - -public class GT_MetaTileEntity_PurificationUnitPhAdjustment - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final int STRUCTURE_X_OFFSET = 7; - private static final int STRUCTURE_Y_OFFSET = 4; - private static final int STRUCTURE_Z_OFFSET = 1; - - private static final String[][] structure = new String[][] { - // spotless:off - { "E E E E", "EAAAE EAAAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAAAE EAAAE" }, - { " AAA AAA ", "A A A A", "A A A A", "A A A A", "A ABB~BBA A", "AAAAA AAAAA" }, - { " AXA AYA ", "A A A A", "G A A H", "G ABBBBBA H", "G H", "AAAAABRBRBAAAAA" }, - { " AAA AAA ", "A A A A", "A A A A", "A A A A", "A AIIIIIA A", "AAAAA AAAAA" }, - { "E E E E", "EAAAE EAAAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAAAE EAAAE" } }; - // spotless:on - - private static final int CASING_INDEX_MIDDLE = getTextureIndex(GregTech_API.sBlockCasings9, 7); - private static final int CASING_INDEX_TOWER = getTextureIndex(GregTech_API.sBlockCasings9, 8); - - /** - * The current pH value of the water inside the multiblock - */ - private float currentpHValue = 0.0f; - - /** - * The multiblock will try to consume catalyst every CONSUME_INTERVAL ticks. - */ - private static final int CONSUME_INTERVAL = 1 * SECONDS; - - /** - * Maximum deviation the initial pH value can have away from the neutral value. - */ - private static final float INITIAL_PH_DEVIATION = 2.5f; - - /** - * pH value of entirely pH neutral water. - */ - private static final float PH_NEUTRAL_VALUE = 7.0f; - - /** - * Maximum deviation from the neutral value that is allowed for the recipe to succeed. - */ - private static final float PH_MAX_DEVIATION = 0.05f; - - /** - * Change in pH value for each piece of alkaline dust supplied. - */ - public static final float PH_PER_ALKALINE_DUST = 0.01f; - - /** - * Change in pH value for every 10L of acid supplied. - */ - public static final float PH_PER_10_ACID_LITER = -0.01f; - - /** - * Alkaline catalyst material - */ - public static final Materials ALKALINE_MATERIAL = Materials.SodiumHydroxide; - - /** - * Acidic catalyst material - */ - public static final Materials ACIDIC_MATERIAL = Materials.HydrochloricAcid; - - /** - * The input hatch for the acidic material - */ - private GT_MetaTileEntity_Hatch_Input acidInputHatch; - /** - * The input bus for the alkaline material - */ - private GT_MetaTileEntity_Hatch_InputBus alkalineInputBus; - - /** - * List of all placed sensor hatches in the multi, so we can update them with the proper pH value when it changes. - */ - private final ArrayList sensorHatches = new ArrayList<>(); - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - // Extreme Corrosion Resistant Casing - .addElement('A', ofBlock(GregTech_API.sBlockCasings9, 8)) - // Naquadah Reinforced Water Plant Casing - .addElement('B', ofBlock(GregTech_API.sBlockCasings9, 7)) - .addElement('E', ofFrame(Materials.NaquadahAlloy)) - // pH Resistant Glass - .addElement('G', ofBlock(GregTech_API.sBlockGlass1, 0)) - .addElement('H', ofBlock(GregTech_API.sBlockGlass1, 0)) - // Regular I/O hatches - .addElement( - 'I', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(t.getAllowedHatches()) - .dot(1) - .casingIndex(CASING_INDEX_MIDDLE) - .build()), - // Naquadah Reinforced Water Plant Casing - ofBlock(GregTech_API.sBlockCasings9, 7))) - .addElement( - 'R', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(SpecialHatchElement.PhSensor) - .dot(2) - .cacheHint(() -> "pH Sensor Hatch") - .casingIndex(CASING_INDEX_MIDDLE) - .build()), - // Naquadah Reinforced Water Plant Casing - ofBlock(GregTech_API.sBlockCasings9, 7))) - // Special I/O hatches - .addElement( - 'X', - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(InputBus) - .dot(3) - .adder(GT_MetaTileEntity_PurificationUnitPhAdjustment::addAlkalineBusToMachineList) - .cacheHint(() -> "Input Bus (" + ALKALINE_MATERIAL.mLocalizedName + ")") - .casingIndex(CASING_INDEX_TOWER) - .allowOnly(ForgeDirection.UP) - .build())) - .addElement( - 'Y', - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(InputHatch) - .dot(4) - .adder(GT_MetaTileEntity_PurificationUnitPhAdjustment::addAcidHatchToMachineList) - .cacheHint(() -> "Input Hatch (" + ACIDIC_MATERIAL.mLocalizedName + ")") - .casingIndex(CASING_INDEX_TOWER) - .allowOnly(ForgeDirection.UP) - .build())) - .build(); - - private List> getAllowedHatches() { - return ImmutableList.of(InputHatch, OutputHatch); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MIDDLE), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MIDDLE), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MIDDLE) }; - } - - public GT_MetaTileEntity_PurificationUnitPhAdjustment(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PurificationUnitPhAdjustment(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitPhAdjustment(this.mName); - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - hintsOnly, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - return survivialBuildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET, - elementBudget, - env, - true); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.purificationPhAdjustmentRecipes; - } - - public boolean addAcidHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null; - acidInputHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity; - return true; - } - return false; - } - - public boolean addAlkalineBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = null; - alkalineInputBus = (GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity; - return true; - } - return false; - } - - public boolean addSensorHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity instanceof GT_MetaTileEntity_pHSensor) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - return this.sensorHatches.add((GT_MetaTileEntity_pHSensor) aMetaTileEntity); - } - return false; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the pH Neutralization Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo( - "Initial pH value every cycle varies from " + EnumChatFormatting.RED - + (PH_NEUTRAL_VALUE - INITIAL_PH_DEVIATION) - + EnumChatFormatting.GRAY - + " - " - + EnumChatFormatting.RED - + (PH_NEUTRAL_VALUE + INITIAL_PH_DEVIATION) - + " pH" - + EnumChatFormatting.GRAY - + ".") - .addInfo( - "If the pH value is within " + EnumChatFormatting.RED - + PH_MAX_DEVIATION - + " pH " - + EnumChatFormatting.GRAY - + "of 7.0 pH at the end of the cycle, the recipe always succeeds.") - .addInfo("Otherwise, the recipe always fails.") - .addInfo("Use a pH Sensor Hatch to read the current pH value.") - .addInfo("For safety, the machine will shut down if the pH goes below 0 or exceeds 14.") - .addSeparator() - .addInfo( - "Every " + EnumChatFormatting.RED - + CONSUME_INTERVAL - + EnumChatFormatting.GRAY - + " ticks, consumes ALL " - + EnumChatFormatting.WHITE - + ALKALINE_MATERIAL.mLocalizedName - + EnumChatFormatting.GRAY - + " and " - + EnumChatFormatting.WHITE - + ACIDIC_MATERIAL.mLocalizedName - + EnumChatFormatting.GRAY - + " in the special hatches.") - .addInfo( - EnumChatFormatting.RED + "Raises " - + EnumChatFormatting.GRAY - + "the pH value by " - + EnumChatFormatting.RED - + PH_PER_ALKALINE_DUST - + " pH " - + EnumChatFormatting.GRAY - + "per piece of " - + EnumChatFormatting.WHITE - + ALKALINE_MATERIAL.getDust(1) - .getDisplayName() - + EnumChatFormatting.GRAY - + ".") - .addInfo( - EnumChatFormatting.RED + "Lowers " - + EnumChatFormatting.GRAY - + "the pH value by " - + EnumChatFormatting.RED - + -PH_PER_10_ACID_LITER - + " pH " - + EnumChatFormatting.GRAY - + "per " - + EnumChatFormatting.RED - + "10L " - + EnumChatFormatting.GRAY - + "of " - + EnumChatFormatting.WHITE - + ACIDIC_MATERIAL.getFluid(1L) - .getLocalizedName() - + EnumChatFormatting.GRAY - + ".") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "The fourth step of water purification is to neutralize the solution and bring its pH to exactly 7, rendering") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "the solution inert with no hydrogen ion activity beyond water’s natural amphiproticity. Acids and bases from soils") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "and geology cause natural alkalinity variations in water which can cause corrosive reactions with sensitive") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "materials. This necessitates the use of the corresponding neutralizing agents to pH balance the water.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(7, 4, 7, false) - .addCasingInfoExactlyColored( - "Stabilized Naquadah Water Plant Casing", - EnumChatFormatting.GRAY, - 15, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Chemical Grade Glass", - EnumChatFormatting.GRAY, - 18, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Naquadah Alloy Frame Box", - EnumChatFormatting.GRAY, - 48, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Inert Neutralization Water Plant Casing", - EnumChatFormatting.GRAY, - 67 * 2, - EnumChatFormatting.GOLD, - false) - .addController("Front center") - .addOtherStructurePart("Input Hatch (Water)", EnumChatFormatting.GOLD + "1+", 1) - .addOtherStructurePart("Output Hatch", EnumChatFormatting.GOLD + "1", 1) - .addOtherStructurePart("pH Sensor Hatch", EnumChatFormatting.GOLD + "2", 2) - .addOtherStructurePart("Input Bus (Sodium Hydroxide)", EnumChatFormatting.GOLD + "1", 3) - .addOtherStructurePart("Input Hatch (Hydrochloric Acid)", EnumChatFormatting.GOLD + "1", 4) - .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void startCycle(int cycleTime, int progressTime) { - super.startCycle(cycleTime, progressTime); - // Randomize initial pH value - ThreadLocalRandom random = ThreadLocalRandom.current(); - // Generate random integer in [-RNG_PRECISION, RNG_PRECISION] - final int RNG_PRECISION = 1000; - int rng = random.nextInt(-RNG_PRECISION, RNG_PRECISION); - // Remap to [-1.0, 1.0] and then to [-INITIAL_PH_DEVIATION, INITIAL_PH_DEVIATION] - float deviation = ((float) rng / RNG_PRECISION) * INITIAL_PH_DEVIATION; - // Round to 2 digits - this.currentpHValue = Math.round((PH_NEUTRAL_VALUE + deviation) * 100.0f) / 100.0f; - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.runMachine(aBaseMetaTileEntity, aTick); - // Eat all acid and alkaline material every second - if (mMaxProgresstime > 0 && aTick % CONSUME_INTERVAL == 0) { - // Important that we drain backwards, since draining stacks can auto-sort the bus - long totalAlkalineDrained = 0; - for (int i = alkalineInputBus.getSizeInventory() - 1; i >= 0; --i) { - ItemStack stack = alkalineInputBus.getStackInSlot(i); - // If this ItemStack is the alkaline material, drain it entirely and record the amount drained - if (stack != null && stack.isItemEqual(ALKALINE_MATERIAL.getDust(1))) { - totalAlkalineDrained += stack.stackSize; - alkalineInputBus.decrStackSize(i, stack.stackSize); - } - } - - // Now do fluid, this is simpler since we only need to bother with one slot - FluidStack stack = acidInputHatch.getDrainableStack(); - int numMultiples = 0; - if (stack != null && stack.isFluidEqual(ACIDIC_MATERIAL.getFluid(1))) { - int acidAvailable = stack.amount; - // We only care about multiples of 10, but we still drain all. - numMultiples = Math.floorDiv(acidAvailable, 10); - acidInputHatch.drain(acidAvailable, true); - } else { - // Little easier egg: Fluoroantimonic acid has a pH value of -31, it's an acid so strong it will - // instantly shatter the glass in the structure. - - Fluid acid = FluidRegistry.getFluid("fluoroantimonic acid"); - if (stack != null && stack.getFluid() - .equals(acid)) { - // TODO: Actually break the glass and trigger achievement lol - } - - } - - // Adjust pH with to new value - this.currentpHValue = this.currentpHValue + totalAlkalineDrained * PH_PER_ALKALINE_DUST - + numMultiples * PH_PER_10_ACID_LITER; - - // Clamp pH to sensible values - this.currentpHValue = Math.min(Math.max(this.currentpHValue, 0.0f), 14.0f); - - // Round to 2 decimals - this.currentpHValue = Math.round(this.currentpHValue * 100.0f) / 100.0f; - - // If pH is 0 or 14, stop the machine - if (Math.abs(this.currentpHValue) < 0.001 || Math.abs(this.currentpHValue - 14.0f) < 0.001) { - stopMachine(SimpleShutDownReason.ofNormal("critical_ph_value")); - } - } - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - super.onPostTick(aBaseMetaTileEntity, aTimer); - // Update sensor hatch - for (GT_MetaTileEntity_pHSensor hatch : sensorHatches) { - hatch.updateRedstoneOutput(this.currentpHValue); - } - } - - @Override - public float calculateFinalSuccessChance() { - // Success chance is 100% when inside target range, 0% otherwise - float distance = Math.abs(this.currentpHValue - PH_NEUTRAL_VALUE); - if (distance <= PH_MAX_DEVIATION) { - return 100.0f; - } else { - return 0.0f; - } - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getWaterTier() { - return 4; - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_ZPM; - } - - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; - // Do not form without positioned hatches - if (acidInputHatch == null || alkalineInputBus == null) return false; - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - @Override - public String[] getInfoData() { - ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); - infoData.add("Current pH Value: " + EnumChatFormatting.YELLOW + currentpHValue + " pH"); - return infoData.toArray(new String[] {}); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setFloat("mCurrentpH", this.currentpHValue); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - this.currentpHValue = aNBT.getFloat("mCurrentpH"); - } - - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.GT_MACHINES_PURIFICATION_PH_LOOP.resourceLocation; - } - - private enum SpecialHatchElement implements IHatchElement { - - PhSensor(GT_MetaTileEntity_PurificationUnitPhAdjustment::addSensorHatchToMachineList, - GT_MetaTileEntity_pHSensor.class) { - - @Override - public long count( - GT_MetaTileEntity_PurificationUnitPhAdjustment gtMetaTileEntityPurificationUnitPhAdjustment) { - return gtMetaTileEntityPurificationUnitPhAdjustment.sensorHatches.size(); - } - }; - - private final List> mteClasses; - private final IGT_HatchAdder adder; - - @SafeVarargs - SpecialHatchElement(IGT_HatchAdder adder, - Class... mteClasses) { - this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); - this.adder = adder; - } - - @Override - public List> mteClasses() { - return mteClasses; - } - - public IGT_HatchAdder adder() { - return adder; - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPlasmaHeater.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPlasmaHeater.java deleted file mode 100644 index 8b10cae9b7..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitPlasmaHeater.java +++ /dev/null @@ -1,566 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.AuthorNotAPenguin; -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.recipe.RecipeMaps.purificationPlasmaHeatingRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -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 com.google.common.collect.ImmutableList; -import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Materials; -import gregtech.api.enums.Mods; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; -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_Input; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_PurificationUnitPlasmaHeater - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - private static final int CASING_INDEX_HEATER = getTextureIndex(GregTech_API.sBlockCasings9, 11); - private static final int CASING_INDEX_TOWER = getTextureIndex(GregTech_API.sBlockCasings9, 5); - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final int STRUCTURE_X_OFFSET = 2; - private static final int STRUCTURE_Y_OFFSET = 14; - private static final int STRUCTURE_Z_OFFSET = 5; - - /** - * Fluid is consumed every CONSUME_INTERVAL ticks - */ - private static final long CONSUME_INTERVAL = 1 * SECONDS; - - /** - * Current internal temperature of the multiblock - */ - private long currentTemperature = 0; - /** - * Amount of successful heating cycles completed - */ - private int cyclesCompleted = 0; - /** - * Whether this recipe is ruined due to high temperature - */ - private boolean ruinedCycle = false; - - private enum CycleState { - // Was previously at 0K, currently waiting to heat to 10000K - Heating, - // Was previously at 10000K, currently waiting to cool down to 0K - Cooling - } - - private CycleState state = CycleState.Heating; - - // A cycle is 30s at shortest, a purification plant cycle is 120s. 33% chance per heating cycle - // will give you plenty of room for delay and still get to 99% chance. - public static final long SUCCESS_PER_CYCLE = 33; - - // Consumption rates in liters/second - public static final long MAX_PLASMA_PER_SEC = 10; - public static final long MAX_COOLANT_PER_SEC = 100; - // Change in temperature per consumed liter of plasma - public static final long PLASMA_TEMP_PER_LITER = 100; - // Change in temperature per consumed liter of coolant - public static final long COOLANT_TEMP_PER_LITER = -5; - // Temperature at which the batch is ruined - public static final long MAX_TEMP = 12500; - // Point at which the heating point of the cycle is reached - public static final long HEATING_POINT = 10000; - - private static final Materials plasmaMaterial = Materials.Helium; - private static final Materials coolantMaterial = Materials.SuperCoolant; - - private GT_MetaTileEntity_Hatch_Input plasmaInputHatch; - private GT_MetaTileEntity_Hatch_Input coolantInputHatch; - - private static final String[][] structure = new String[][] { - // spotless:off - { " DDDDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDKDD " }, - { " DD DD ", " DDDDDDD ", " DDDDD ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DDDDDDDDD " }, - { " D D ", " DDD DDD ", " DDDDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " DDDDDDDDDDD " }, - { " D D ", " D DD ", " DD D ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, - { " D D", " DD DD ", " DD D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, - { " D D", " D D ", " DD D ", " D D ", " D D ", "GBBBG D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D", "G G D D", "GB~BG DDDDDDDDDDDDDDD" }, - { " D D", " D D ", " DD D ", " D D ", " BBB D D ", "BBBBB D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D", " EEEBBBBD D", "BAAAB DDDDDDDDDDDDDDD" }, - { " D D", " D D ", " DD D ", " D D ", " BBB D D ", "BBBBB D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFEBBBBD D", " EFE D D", "PAAABBBBDDDDDDDDDDDDDDD" }, - { " D D", " D D ", " DD D ", " D D ", " BBB D D ", "BBBBB D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D", " EEEBBBBD D", "BAAAB DDDDDDDDDDDDDDD" }, - { " D D", " D D ", " DD D ", " D D ", " D D ", "GBBBG D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D", "G G D D", "GBBBG DDDDDDDDDDDDDDD" }, - { " D D", " D D ", " D D ", " D DD ", " D DD ", " D DD ", " D DD ", " D DD ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, - { " D DD", " D D ", " D D ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, - { " D D ", " DD DD ", " D D ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " DDDDDDDDDDD " }, - { " DD DD ", " DDDDDDD ", " DDDDD ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DDDDDDDDD " }, - { " DDDDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDDDD " } }; - // spotless:on - - private int casingCount = 0; - private static final int MIN_CASING = 50; - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - // Superconducting coil block - .addElement('A', ofBlock(GregTech_API.sBlockCasings1, 15)) - // Plasma Heating Casing - .addElement( - 'B', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(t.getAllowedHatches()) - .dot(1) - .casingIndex(CASING_INDEX_HEATER) - .build()), - onElementPass(t -> t.casingCount++, ofBlock(GregTech_API.sBlockCasings9, 11)))) - // Reinforced Sterile Water Plant Casing - .addElement('D', ofBlock(GregTech_API.sBlockCasings9, 5)) - // Any Tinted Glass - .addElement('E', ofBlockAnyMeta(GregTech_API.sBlockTintedGlass, 0)) - // Neonite, with fallback to air - .addElement('F', lazy(t -> { - if (Mods.Chisel.isModLoaded()) { - Block neonite = GameRegistry.findBlock(Mods.Chisel.ID, "neonite"); - return ofBlockAnyMeta(neonite, 7); - } else { - return ofBlockAnyMeta(Blocks.air); - } - })) - // Superconductor Base ZPM frame box - .addElement('G', ofFrame(Materials.Tetranaquadahdiindiumhexaplatiumosminid)) - // Coolant input hatch - .addElement( - 'K', - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(InputHatch) - .dot(2) - .adder(GT_MetaTileEntity_PurificationUnitPlasmaHeater::addCoolantHatchToMachineList) - .cacheHint(() -> "Input Hatch (Coolant)") - .casingIndex(CASING_INDEX_TOWER) - .buildAndChain(ofBlock(GregTech_API.sBlockCasings9, 5)))) - // Plasma input hatch - .addElement( - 'P', - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(InputHatch) - .dot(3) - .adder(GT_MetaTileEntity_PurificationUnitPlasmaHeater::addPlasmaHatchToMachineList) - .cacheHint(() -> "Input Hatch (Plasma)") - .casingIndex(CASING_INDEX_HEATER) - .buildAndChain(ofBlock(GregTech_API.sBlockCasings9, 11)))) - .build(); - - private List> getAllowedHatches() { - return ImmutableList.of(InputHatch, OutputHatch); - } - - public GT_MetaTileEntity_PurificationUnitPlasmaHeater(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PurificationUnitPlasmaHeater(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitPlasmaHeater(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean active, boolean redstoneLevel) { - if (side == facing) { - if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_HEATER), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_HEATER), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_HEATER) }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - hintsOnly, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - return survivialBuildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET, - elementBudget, - env, - true); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - public RecipeMap getRecipeMap() { - return purificationPlasmaHeatingRecipes; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the Extreme Temperature Fluctuation Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo( - "Complete heating cycles by first heating the water to " + EnumChatFormatting.RED - + HEATING_POINT - + "K" - + EnumChatFormatting.GRAY - + ",") - .addInfo( - "and then cooling it back down to " + EnumChatFormatting.RED + "0K" + EnumChatFormatting.GRAY + ".") - .addInfo( - "Initial temperature is reset to " + EnumChatFormatting.RED - + "0K" - + EnumChatFormatting.GRAY - + " on recipe start.") - .addInfo( - // TODO: Refer to heating cycles in another way to avoid confusion - "Each completed heating cycle boosts success chance by " + EnumChatFormatting.RED - + SUCCESS_PER_CYCLE - + "%.") - .addInfo( - "If the temperature ever reaches " + EnumChatFormatting.RED - + MAX_TEMP - + "K" - + EnumChatFormatting.GRAY - + " the recipe will fail and output steam.") - .addSeparator() - .addInfo( - "Consumes up to " + EnumChatFormatting.RED - + MAX_PLASMA_PER_SEC - + "L/s " - + EnumChatFormatting.WHITE - + plasmaMaterial.getPlasma(1) - .getLocalizedName() - + EnumChatFormatting.GRAY - + " and up to " - + EnumChatFormatting.RED - + MAX_COOLANT_PER_SEC - + "L/s " - + EnumChatFormatting.WHITE - + coolantMaterial.getFluid(1) - .getLocalizedName()) - .addInfo( - EnumChatFormatting.RED + "Raises " - + EnumChatFormatting.GRAY - + "the temperature by " - + EnumChatFormatting.RED - + PLASMA_TEMP_PER_LITER - + "K" - + EnumChatFormatting.GRAY - + " per liter of plasma consumed.") - .addInfo( - EnumChatFormatting.RED + "Lowers " - + EnumChatFormatting.GRAY - + "the temperature by " - + EnumChatFormatting.RED - + -COOLANT_TEMP_PER_LITER - + "K" - + EnumChatFormatting.GRAY - + " per liter of coolant consumed.") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "Step five of water purification is to evaporate complex organic polymers and extremophile organisms") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "that might be resistant to simple acids, clarifying agents, and filters. Using an ultra high") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "pressure chamber in combination with extreme temperature fluctuations allows the water to remain") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "supercritical while evaporating any remaining contaminants, ready for filtration.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(23, 15, 15, false) - .addCasingInfoExactlyColored( - "Reinforced Sterile Water Plant Casing", - EnumChatFormatting.GRAY, - 1091, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Heat-Resistant Trinium Plated Casing", - EnumChatFormatting.GRAY, - 54, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Any Tinted Industrial Glass", - EnumChatFormatting.GRAY, - 64, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Superconductor Base ZPM Frame Box", - EnumChatFormatting.GRAY, - 40, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored("Any Neonite", EnumChatFormatting.GRAY, 8, EnumChatFormatting.GOLD, false) - .addCasingInfoExactlyColored( - "Superconducting Coil Block", - EnumChatFormatting.GRAY, - 8, - EnumChatFormatting.GOLD, - false) - .addController("Front center") - .addOtherStructurePart("Input Hatch (Water)", EnumChatFormatting.GOLD + "1+", 1) - .addOtherStructurePart("Output Hatch", EnumChatFormatting.GOLD + "1", 1) - .addOtherStructurePart("Input Hatch (Coolant)", EnumChatFormatting.GOLD + "1", 2) - .addOtherStructurePart("Input Hatch (Plasma)", EnumChatFormatting.GOLD + "1", 3) - .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public void startCycle(int cycleTime, int progressTime) { - super.startCycle(cycleTime, progressTime); - // Reset internal state - this.cyclesCompleted = 0; - this.currentTemperature = 0; - this.ruinedCycle = false; - this.state = CycleState.Heating; - } - - // Drains up to maxAmount of a fluid if it is the same fluid as given, returns the amount drained - private long drainFluidLimited(GT_MetaTileEntity_Hatch_Input inputHatch, FluidStack fluid, long maxAmount) { - FluidStack hatchStack = inputHatch.getDrainableStack(); - if (hatchStack == null) return 0; - if (hatchStack.isFluidEqual(fluid)) { - long amountToDrain = Math.min(maxAmount, hatchStack.amount); - if (amountToDrain > 0) { - inputHatch.drain((int) amountToDrain, true); - } - return amountToDrain; - } else { - return 0; - } - } - - @Override - public void addRecipeOutputs() { - super.addRecipeOutputs(); - // If the cycle was ruined, output steam - if (this.ruinedCycle) { - FluidStack insertedWater = currentRecipe.mFluidInputs[0]; - // Multiply by 60 since that's the water:steam ratio in GTNH - long steamAmount = insertedWater.amount * 60L; - addOutput(GT_ModHandler.getSteam(steamAmount)); - } - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.runMachine(aBaseMetaTileEntity, aTick); - if (mMaxProgresstime > 0 && aTick % CONSUME_INTERVAL == 0) { - // Drain plasma and coolant up to limited amount per second - long plasmaDrained = drainFluidLimited(plasmaInputHatch, plasmaMaterial.getPlasma(1L), MAX_PLASMA_PER_SEC); - long coolantDrained = drainFluidLimited( - coolantInputHatch, - coolantMaterial.getFluid(1L), - MAX_COOLANT_PER_SEC); - // Calculate temperature change - long tempChance = plasmaDrained * PLASMA_TEMP_PER_LITER + coolantDrained * COOLANT_TEMP_PER_LITER; - currentTemperature = Math.max(0, currentTemperature + tempChance); - // Check if batch was ruined - if (currentTemperature > MAX_TEMP) { - ruinedCycle = true; - } - // Update cycle state. - switch (state) { - case Heating -> { - // Heating state can change to cooling when temperature exceeds 10000K - if (currentTemperature >= HEATING_POINT) { - state = CycleState.Cooling; - } - } - case Cooling -> { - if (currentTemperature == 0) { - state = CycleState.Heating; - cyclesCompleted += 1; - } - } - } - } - } - - public boolean addCoolantHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null; - coolantInputHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity; - return true; - } - return false; - } - - public boolean addPlasmaHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity == null) return false; - if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null; - plasmaInputHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity; - return true; - } - return false; - } - - @Override - public float calculateFinalSuccessChance() { - if (ruinedCycle) return 0.0f; - // Success chance directly depends on number of cycles completed. - return cyclesCompleted * SUCCESS_PER_CYCLE + currentRecipeChance; - } - - @Override - public String[] getInfoData() { - ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); - infoData.add("Current temperature: " + EnumChatFormatting.YELLOW + currentTemperature + "K"); - infoData.add("Heating cycles completed this run: " + EnumChatFormatting.YELLOW + cyclesCompleted); - return infoData.toArray(new String[] {}); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setLong("mCurrentTemperature", currentTemperature); - aNBT.setInteger("mCyclesCompleted", cyclesCompleted); - aNBT.setBoolean("mRuinedCycle", ruinedCycle); - aNBT.setString("mCycleState", state.toString()); - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - currentTemperature = aNBT.getLong("mCurrentTemperature"); - cyclesCompleted = aNBT.getInteger("mCyclesCompleted"); - ruinedCycle = aNBT.getBoolean("mRuinedCycle"); - state = CycleState.valueOf(aNBT.getString("mCycleState")); - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getWaterTier() { - return 5; - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_UV; - } - - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - casingCount = 0; - if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; - if (casingCount < MIN_CASING) return false; - // Do not form without positioned hatches - if (plasmaInputHatch == null || coolantInputHatch == null) return false; - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.GT_MACHINES_PURIFICATION_PLASMA_LOOP.resourceLocation; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitUVTreatment.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitUVTreatment.java deleted file mode 100644 index f542216617..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_PurificationUnitUVTreatment.java +++ /dev/null @@ -1,526 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -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 gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; -import static gregtech.api.enums.GT_Values.AuthorNotAPenguin; -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.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_StructureUtility.ofFrame; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -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.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.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; -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.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.recipe.check.CheckRecipeResult; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.IGT_HatchAdder; - -public class GT_MetaTileEntity_PurificationUnitUVTreatment - extends GT_MetaTileEntity_PurificationUnitBase - implements ISurvivalConstructable { - - private static final int CASING_INDEX_MAIN = getTextureIndex(GregTech_API.sBlockCasings9, 12); - - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final int STRUCTURE_X_OFFSET = 6; - private static final int STRUCTURE_Y_OFFSET = 8; - private static final int STRUCTURE_Z_OFFSET = 0; - - private GT_MetaTileEntity_LensHousing lensInputBus; - private GT_MetaTileEntity_LensIndicator lensIndicator; - - private UVTreatmentLensCycle lensCycle = null; - - /** - * Bonus chance to success for each lens swap - */ - public static final float SUCCESS_PER_LENS = 10.0f; - - /** - * Maximum amount of ticks between two lens swaps - */ - public static final int MAX_TIME_BETWEEN_SWAPS = GT_MetaTileEntity_PurificationPlant.CYCLE_TIME_TICKS / 8; - /** - * Minimum amount of time between two lens swaps - */ - public static final int MIN_TIME_BETWEEN_SWAPS = MAX_TIME_BETWEEN_SWAPS / 4; - - public static final ArrayList LENS_ITEMS = new ArrayList<>(); - - private int numSwapsPerformed = 0; - private int timeUntilNextSwap = 0; - - private boolean removedTooEarly = false; - - private static final String[][] structure = new String[][] { - // spotless:off - { " ", " DDD ", " ", " ", " ", " ", " ", " DDD ", " H~H " }, - { " AAA ", " DDAAADD ", " BBB ", " BBB ", " BBB ", " BBB ", " BBB ", " DDBBBDD ", " AAAAAAA " }, - { " AAAAAAA ", " DDAACCCAADD ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " DDBB BBDD ", " AAAAAAAAAAA " }, - { " AAAAAAAAAAA ", "DAACCCCCCCAAD", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", "DBB BBD", "HAAAAAAAAAAAH" }, - { " AAAAALAAAAA ", "DACCCCCCCCCAD", " B B ", " B B ", " B B ", " B B ", " B B ", "DB BD", "HAAAAAAAAAAAH" }, - { " AAAAAAAAAAA ", "DAACCCCCCCAAD", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", "DBB BBD", "HAAAAAAAAAAAH" }, - { " AAAAAAA ", " DDAACCCAADD ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " DDBB BBDD ", " AAAAAAAAAAA " }, - { " AIA ", " DDAAADD ", " BBB ", " BBB ", " BBB ", " BBB ", " BBB ", " DDBBBDD ", " AAAAAAA " }, - { " ", " DDD ", " ", " ", " ", " ", " ", " DDD ", " HHH " } }; - // spotless:on - - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_MAIN, structure) - // Naquadria-Reinforced Water Plant Casing - .addElement('A', ofBlock(GregTech_API.sBlockCasings9, 12)) - // Neutronium-Coated UV-Resistant Glass - .addElement('B', ofBlock(GregTech_API.sBlockGlass1, 1)) - // UV Backlight sterilizer casing - .addElement('C', ofBlock(GregTech_API.sBlockCasings9, 13)) - .addElement('D', ofFrame(Materials.StellarAlloy)) - // Lens housing bus - .addElement( - 'L', - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(SpecialHatchElement.LensHousing) - .dot(2) - .cacheHint(() -> "Lens Housing") - .casingIndex(CASING_INDEX_MAIN) - .build())) - // Lens indicator hatch - .addElement( - 'I', - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeast(SpecialHatchElement.LensIndicator) - .dot(3) - .cacheHint(() -> "Lens Indicator") - .casingIndex(CASING_INDEX_MAIN) - .build())) - // Input or output hatch - .addElement( - 'H', - ofChain( - lazy( - t -> GT_StructureUtility.buildHatchAdder() - .atLeastList(Arrays.asList(InputHatch, OutputHatch)) - .dot(1) - .cacheHint(() -> "Input Hatch, Output Hatch") - .casingIndex(CASING_INDEX_MAIN) - .build()), - // Naquadria-reinforced Water Plant Casing - ofBlock(GregTech_API.sBlockCasings9, 12))) - .build(); - - public GT_MetaTileEntity_PurificationUnitUVTreatment(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_PurificationUnitUVTreatment(String aName) { - super(aName); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_PurificationUnitUVTreatment(this.mName); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean active, boolean redstoneLevel) { - if (side == facing) { - if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), - 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN) }; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - hintsOnly, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET); - } - - @Override - public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - return survivialBuildPiece( - STRUCTURE_PIECE_MAIN, - stackSize, - STRUCTURE_X_OFFSET, - STRUCTURE_Y_OFFSET, - STRUCTURE_Z_OFFSET, - elementBudget, - env, - true); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Purification Unit"); - tt.addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.BOLD - + "Water Tier: " - + EnumChatFormatting.WHITE - + GT_Utility.formatNumbers(getWaterTier()) - + EnumChatFormatting.RESET) - .addInfo("Controller block for the High Energy Laser Purification Unit.") - .addInfo("Must be linked to a Purification Plant using a data stick to work.") - .addSeparator() - .addInfo( - "During operation, swap the lens in the " + EnumChatFormatting.WHITE - + "Lens Housing" - + EnumChatFormatting.GRAY - + ".") - .addInfo( - "The multiblock will output a signal through the " + EnumChatFormatting.WHITE + "Lens Indicator Hatch") - .addInfo("when the current lens must be swapped.") - .addInfo( - "Lens swaps will be requested in random intervals of " + EnumChatFormatting.RED - + (MIN_TIME_BETWEEN_SWAPS / SECONDS) - + " to " - + (MAX_TIME_BETWEEN_SWAPS / SECONDS) - + "s" - + EnumChatFormatting.GRAY - + ".") - .addSeparator() - .addInfo( - "Success chance is boosted by " + EnumChatFormatting.RED - + SUCCESS_PER_LENS - + "% " - + EnumChatFormatting.GRAY - + "for each successful swap performed.") - .addInfo("Removing a lens too early will fail the recipe.") - .addInfo("Find the order of lenses in the recipe in NEI,") - .addInfo("or use a portable scanner to view the currently requested lens.") - .addSeparator() - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "The sixth step of water purification involves identifying any remaining negatively charged ions within") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "the water which may cause electrical faults in future wafer manufacturing. Bombarding the water with varying") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "wavelengths of photon beams will impart energy into outer-shell electrons, causing them to detach from the") - .addInfo( - EnumChatFormatting.AQUA + "" - + EnumChatFormatting.ITALIC - + "atoms themselves and pass through the walls of the tank, ensuring the water is perfectly electrically polar.") - .addInfo(AuthorNotAPenguin) - .beginStructureBlock(13, 9, 9, true) - .addCasingInfoRangeColored( - "Naquadria-Reinforced Water Plant Casing", - EnumChatFormatting.GRAY, - 147, - 155, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Electron-Permeable Neutronium Coated Glass", - EnumChatFormatting.GRAY, - 144, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "High Energy Ultraviolet Emitter Casing", - EnumChatFormatting.GRAY, - 24, - EnumChatFormatting.GOLD, - false) - .addCasingInfoExactlyColored( - "Stellar Alloy Frame Box", - EnumChatFormatting.GRAY, - 56, - EnumChatFormatting.GOLD, - false) - .addController("Front center") - .addOtherStructurePart("Input Hatch, Output Hatch", EnumChatFormatting.GOLD + "1+", 1) - .addOtherStructurePart("Lens Housing", EnumChatFormatting.GOLD + "1", 2) - .addOtherStructurePart("Lens Indicator", EnumChatFormatting.GOLD + "1", 3) - .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") - .toolTipFinisher("GregTech"); - return tt; - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.purificationUVTreatmentRecipes; - } - - @NotNull - @Override - public CheckRecipeResult checkProcessing() { - CheckRecipeResult result = super.checkProcessing(); - if (result.wasSuccessful()) { - this.lensCycle = new UVTreatmentLensCycle(LENS_ITEMS); - } - return result; - } - - private int generateNextSwapTime() { - ThreadLocalRandom random = ThreadLocalRandom.current(); - return random.nextInt(MIN_TIME_BETWEEN_SWAPS, MAX_TIME_BETWEEN_SWAPS); - } - - @Override - public void startCycle(int cycleTime, int progressTime) { - super.startCycle(cycleTime, progressTime); - // Reset internal state - this.timeUntilNextSwap = 0; - this.numSwapsPerformed = 0; - this.lensCycle.reset(); - this.removedTooEarly = false; - } - - private ItemStack getCurrentlyInsertedLens() { - return this.lensInputBus.getStackInSlot(0); - } - - @Override - protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.runMachine(aBaseMetaTileEntity, aTick); - - // Do no processing if no recipe is running - if (mMaxProgresstime <= 0) return; - - // This can happen because the lens cycle isn't saved to NBT correctly yet, FIXME - if (this.lensCycle == null) { - // FIXME: Properly save current recipe in NBT instead of exiting early - return; - } - - ItemStack currentLens = getCurrentlyInsertedLens(); - - // If we are currently counting down to a next swap, do so - if (timeUntilNextSwap > 0) { - timeUntilNextSwap -= 1; - // Set the indicator to not output a signal for now - lensIndicator.updateRedstoneOutput(false); - - // If we are counting down to the next swap, and there is no correct lens in the bus, we removed a lens - // too early - if (currentLens == null || !currentLens.isItemEqual(lensCycle.current())) { - removedTooEarly = true; - } - - // If the time until the next swap became zero, move on to the next requested lens - if (timeUntilNextSwap == 0) { - boolean advanced = lensCycle.advance(); - if (!advanced) { - // cycle didn't advance, we arrived at the end. This mainly means we want to stop the cycle - // The easiest way to do this is by setting the time until next swap larger than the recipe time - timeUntilNextSwap = mMaxProgresstime + 1; - } - } - } - - // Time until next swap is zero, this means we are waiting for the user to output a lens. - else if (timeUntilNextSwap == 0) { - // Set the indicator to output a signal - lensIndicator.updateRedstoneOutput(true); - - // If we now have a matching lens, we can accept it and move on to the next swap - if (currentLens != null && currentLens.isItemEqual(lensCycle.current())) { - numSwapsPerformed += 1; - timeUntilNextSwap = generateNextSwapTime(); - } - } - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public int getWaterTier() { - return 6; - } - - @Override - public long getBasePowerUsage() { - return TierEU.RECIPE_UV; - } - - @Override - public float calculateFinalSuccessChance() { - if (removedTooEarly) return 0.0f; - return numSwapsPerformed * SUCCESS_PER_LENS + currentRecipeChance; - } - - @Override - public String[] getInfoData() { - ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); - if (this.lensCycle != null) { - infoData.add("Lens swaps performed this run: " + EnumChatFormatting.YELLOW + numSwapsPerformed); - infoData.add( - "Current lens requested: " + EnumChatFormatting.GREEN - + lensCycle.current() - .getDisplayName()); - if (removedTooEarly) { - infoData.add("Removed lens too early. Failing this recipe."); - } - } - return infoData.toArray(new String[] {}); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setInteger("numSwapsPerformed", numSwapsPerformed); - aNBT.setInteger("timeUntilNextSwap", timeUntilNextSwap); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - numSwapsPerformed = aNBT.getInteger("numSwapsPerformed"); - timeUntilNextSwap = aNBT.getInteger("timeUntilNextSwap"); - } - - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; - // Do not form without lens bus - if (lensInputBus == null) return false; - return super.checkMachine(aBaseMetaTileEntity, aStack); - } - - public boolean addLensHousingToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity instanceof GT_MetaTileEntity_LensHousing) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - this.lensInputBus = (GT_MetaTileEntity_LensHousing) aMetaTileEntity; - return true; - } - return false; - } - - public boolean addLensIndicatorToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { - if (aTileEntity == null) return false; - IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); - if (aMetaTileEntity instanceof GT_MetaTileEntity_LensIndicator) { - ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); - this.lensIndicator = (GT_MetaTileEntity_LensIndicator) aMetaTileEntity; - lensIndicator.updateRedstoneOutput(false); - return true; - } - return false; - } - - private enum SpecialHatchElement implements IHatchElement { - - LensHousing(GT_MetaTileEntity_PurificationUnitUVTreatment::addLensHousingToMachineList, - GT_MetaTileEntity_LensHousing.class) { - - @Override - public long count( - GT_MetaTileEntity_PurificationUnitUVTreatment gtMetaTileEntityPurificationUnitUVTreatment) { - if (gtMetaTileEntityPurificationUnitUVTreatment.lensInputBus == null) return 0; - else return 1; - } - }, - - LensIndicator(GT_MetaTileEntity_PurificationUnitUVTreatment::addLensIndicatorToMachineList, - GT_MetaTileEntity_LensHousing.class) { - - @Override - public long count( - GT_MetaTileEntity_PurificationUnitUVTreatment gtMetaTileEntityPurificationUnitUVTreatment) { - if (gtMetaTileEntityPurificationUnitUVTreatment.lensIndicator == null) return 0; - else return 1; - } - }; - - private final List> mteClasses; - private final IGT_HatchAdder adder; - - @SafeVarargs - SpecialHatchElement(IGT_HatchAdder adder, - Class... mteClasses) { - this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); - this.adder = adder; - } - - @Override - public List> mteClasses() { - return mteClasses; - } - - public IGT_HatchAdder adder() { - return adder; - } - } - - @Override - protected ResourceLocation getActivitySoundLoop() { - return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP.resourceLocation; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_pHSensor.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_pHSensor.java deleted file mode 100644 index e8e393cb3c..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/GT_MetaTileEntity_pHSensor.java +++ /dev/null @@ -1,192 +0,0 @@ -package gregtech.common.tileentities.machines.multi.purification; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.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.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.common.gui.modularui.widget.CoverCycleButtonWidget; - -public class GT_MetaTileEntity_pHSensor extends GT_MetaTileEntity_Hatch { - - // This implementation was largely copied from the neutron sensor hatch - - protected float threshold = 0; - protected boolean inverted = false; - private boolean isOn = false; - - private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR; - private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR_GLOW; - - public GT_MetaTileEntity_pHSensor(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 0, "Detects pH value."); - } - - public GT_MetaTileEntity_pHSensor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 0, aDescription, aTextures); - } - - @Override - public boolean isValidSlot(int aIndex) { - return false; - } - - @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 allowGeneralRedstoneOutput() { - 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 initDefaultModes(NBTTagCompound aNBT) { - getBaseMetaTileEntity().setActive(true); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public String[] getDescription() { - return new String[] { "Can be installed in the pH Neutralization Purification Unit.", - "Outputs Redstone Signal according to the current pH value.", - "Right click to open the GUI and change settings." }; - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - threshold = aNBT.getFloat("mThreshold"); - inverted = aNBT.getBoolean("mInverted"); - super.loadNBTData(aNBT); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setFloat("mThreshold", threshold); - aNBT.setBoolean("mInverted", inverted); - super.saveNBTData(aNBT); - } - - /** - * Updates redstone output strength based on the pH of the multiblock. - */ - public void updateRedstoneOutput(float pH) { - isOn = (pH > threshold) ^ inverted; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (isOn) { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 15); - } - } else { - for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 0); - } - } - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_pHSensor(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() - .addIcon(textureFont_Glow) - .glow() - .build() }; - } - - @Override - public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; - } - - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - final String INVERTED = GT_Utility.trans("INVERTED", "Inverted"); - final String NORMAL = GT_Utility.trans("NORMAL", "Normal"); - - builder.widget( - new CoverCycleButtonWidget().setToggle(() -> inverted, (val) -> inverted = val) - .setTextureGetter( - (state) -> state == 1 ? GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON - : GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF) - .addTooltip(0, NORMAL) - .addTooltip(1, INVERTED) - .setPos(10, 8)) - .widget( - new TextWidget().setStringSupplier(() -> inverted ? INVERTED : NORMAL) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setTextAlignment(Alignment.CenterLeft) - .setPos(28, 12)) - .widget( - new NumericWidget().setBounds(0, 14.0) - .setIntegerOnly(false) - .setGetter(() -> (double) threshold) - .setSetter((value) -> threshold = (float) Math.round(value * 100.0) / 100.0f) - .setScrollValues(0.1, 0.01, 1.0) - .setMaximumFractionDigits(2) - .setTextColor(Color.WHITE.dark(1)) - .setTextAlignment(Alignment.CenterLeft) - .setFocusOnGuiOpen(true) - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) - .setPos(10, 28) - .setSize(77, 12)) - .widget( - new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.ph_sensor")) - .setDefaultColor(COLOR_TEXT_GRAY.get()) - .setTextAlignment(Alignment.CenterLeft) - .setPos(90, 30)); - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/LinkedPurificationUnit.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/LinkedPurificationUnit.java index 104cbe300f..8be6d0ab65 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/LinkedPurificationUnit.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/LinkedPurificationUnit.java @@ -1,6 +1,6 @@ package gregtech.common.tileentities.machines.multi.purification; -import static gregtech.GT_Mod.gregtechproxy; +import static gregtech.GTMod.gregtechproxy; import net.minecraft.client.Minecraft; import net.minecraft.nbt.NBTTagCompound; @@ -10,7 +10,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Util; +import gregtech.api.util.GTUtil; /** * Small wrapper around a GT_MetaTileEntity_PurificationUnitBase, to be stored in the main purification plant @@ -25,9 +25,9 @@ public class LinkedPurificationUnit { */ private boolean mIsActive = false; - private final GT_MetaTileEntity_PurificationUnitBase mMetaTileEntity; + private final MTEPurificationUnitBase mMetaTileEntity; - public LinkedPurificationUnit(GT_MetaTileEntity_PurificationUnitBase unit) { + public LinkedPurificationUnit(MTEPurificationUnitBase unit) { this.mMetaTileEntity = unit; } @@ -52,18 +52,17 @@ public class LinkedPurificationUnit { int z = linkData.getInteger("z"); // Find a TileEntity at this location - TileEntity te = GT_Util.getTileEntity(world, x, y, z, true); + TileEntity te = GTUtil.getTileEntity(world, x, y, z, true); if (te == null) { // This is a bug, throw a fatal error. throw new NullPointerException("Unit disappeared during server sync. This is a bug."); } // Cast TileEntity to proper GT TileEntity - this.mMetaTileEntity = (GT_MetaTileEntity_PurificationUnitBase) ((IGregTechTileEntity) te) - .getMetaTileEntity(); + this.mMetaTileEntity = (MTEPurificationUnitBase) ((IGregTechTileEntity) te).getMetaTileEntity(); } - public GT_MetaTileEntity_PurificationUnitBase metaTileEntity() { + public MTEPurificationUnitBase metaTileEntity() { return mMetaTileEntity; } diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchDegasifierControl.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchDegasifierControl.java new file mode 100644 index 0000000000..53c042439c --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchDegasifierControl.java @@ -0,0 +1,121 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +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.metatileentity.implementations.MTEHatch; +import gregtech.api.render.TextureFactory; + +public class MTEHatchDegasifierControl extends MTEHatch { + + private byte outputStrength = 0; + + private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR; + private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR_GLOW; + + public MTEHatchDegasifierControl(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, "Outputs a control signal for the Degasser Purification Unit"); + } + + public MTEHatchDegasifierControl(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean allowGeneralRedstoneOutput() { + 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 boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public void initDefaultModes(NBTTagCompound aNBT) { + getBaseMetaTileEntity().setActive(true); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchDegasifierControl(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public String[] getDescription() { + return new String[] { "Can be installed in the Degasser Purification Unit.", + "Outputs Redstone Signal Strength based on the current control signal." }; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + outputStrength = aNBT.getByte("mOutputStrength"); + super.loadNBTData(aNBT); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setByte("mOutputStrength", outputStrength); + super.saveNBTData(aNBT); + } + + // Pass zero signal to disable output + public void updateOutputSignal(byte signal) { + outputStrength = signal; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (outputStrength > 0) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, outputStrength); + } + } else { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 0); + } + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() + .addIcon(textureFont_Glow) + .glow() + .build() }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensHousing.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensHousing.java new file mode 100644 index 0000000000..81dbab61cb --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensHousing.java @@ -0,0 +1,52 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.client.GTTooltipHandler; + +public class MTEHatchLensHousing extends MTEHatchInputBus { + + public MTEHatchLensHousing(int id, String name, String nameRegional) { + super( + id, + name, + nameRegional, + GTTooltipHandler.Tier.UV.ordinal(), + 1, + new String[] { "Holds a lens for UV laser focusing." }); + } + + public MTEHatchLensHousing(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchLensHousing(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public int getCircuitSlot() { + return -1; + } + + @Override + public boolean allowSelectCircuit() { + return false; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + getBaseMetaTileEntity().add1by1Slot(builder); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensIndicator.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensIndicator.java new file mode 100644 index 0000000000..5ed495f935 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchLensIndicator.java @@ -0,0 +1,117 @@ +package gregtech.common.tileentities.machines.multi.purification; + +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.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.metatileentity.implementations.MTEHatch; +import gregtech.api.render.TextureFactory; + +public class MTEHatchLensIndicator extends MTEHatch { + + private boolean isOn = false; + + private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR; + private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR_GLOW; + + public MTEHatchLensIndicator(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, "Indicates required lens swaps."); + } + + public MTEHatchLensIndicator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @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 allowGeneralRedstoneOutput() { + 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 initDefaultModes(NBTTagCompound aNBT) { + getBaseMetaTileEntity().setActive(true); + } + + @Override + public String[] getDescription() { + return new String[] { "Can be installed in the UV Treatment Purification Unit.", + "Outputs Redstone Signal when a lens swap is requested." }; + } + + /** + * Updates redstone output strength based on the pH of the multiblock. + */ + public void updateRedstoneOutput(boolean enabled) { + isOn = enabled; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (isOn) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 15); + } + } else { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 0); + } + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchLensIndicator(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() + .addIcon(textureFont_Glow) + .glow() + .build() }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchPHSensor.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchPHSensor.java new file mode 100644 index 0000000000..790b14c2f5 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEHatchPHSensor.java @@ -0,0 +1,192 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.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.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEHatch; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.common.gui.modularui.widget.CoverCycleButtonWidget; + +public class MTEHatchPHSensor extends MTEHatch { + + // This implementation was largely copied from the neutron sensor hatch + + protected float threshold = 0; + protected boolean inverted = false; + private boolean isOn = false; + + private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR; + private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_PH_SENSOR_GLOW; + + public MTEHatchPHSensor(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, "Detects pH value."); + } + + public MTEHatchPHSensor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @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 allowGeneralRedstoneOutput() { + 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 initDefaultModes(NBTTagCompound aNBT) { + getBaseMetaTileEntity().setActive(true); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public String[] getDescription() { + return new String[] { "Can be installed in the pH Neutralization Purification Unit.", + "Outputs Redstone Signal according to the current pH value.", + "Right click to open the GUI and change settings." }; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + threshold = aNBT.getFloat("mThreshold"); + inverted = aNBT.getBoolean("mInverted"); + super.loadNBTData(aNBT); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setFloat("mThreshold", threshold); + aNBT.setBoolean("mInverted", inverted); + super.saveNBTData(aNBT); + } + + /** + * Updates redstone output strength based on the pH of the multiblock. + */ + public void updateRedstoneOutput(float pH) { + isOn = (pH > threshold) ^ inverted; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (isOn) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 15); + } + } else { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, (byte) 0); + } + } + super.onPostTick(aBaseMetaTileEntity, aTick); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEHatchPHSensor(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont), TextureFactory.builder() + .addIcon(textureFont_Glow) + .glow() + .build() }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, TextureFactory.of(textureFont) }; + } + + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + final String INVERTED = GTUtility.trans("INVERTED", "Inverted"); + final String NORMAL = GTUtility.trans("NORMAL", "Normal"); + + builder.widget( + new CoverCycleButtonWidget().setToggle(() -> inverted, (val) -> inverted = val) + .setTextureGetter( + (state) -> state == 1 ? GTUITextures.OVERLAY_BUTTON_REDSTONE_ON + : GTUITextures.OVERLAY_BUTTON_REDSTONE_OFF) + .addTooltip(0, NORMAL) + .addTooltip(1, INVERTED) + .setPos(10, 8)) + .widget( + new TextWidget().setStringSupplier(() -> inverted ? INVERTED : NORMAL) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setTextAlignment(Alignment.CenterLeft) + .setPos(28, 12)) + .widget( + new NumericWidget().setBounds(0, 14.0) + .setIntegerOnly(false) + .setGetter(() -> (double) threshold) + .setSetter((value) -> threshold = (float) Math.round(value * 100.0) / 100.0f) + .setScrollValues(0.1, 0.01, 1.0) + .setMaximumFractionDigits(2) + .setTextColor(Color.WHITE.dark(1)) + .setTextAlignment(Alignment.CenterLeft) + .setFocusOnGuiOpen(true) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) + .setPos(10, 28) + .setSize(77, 12)) + .widget( + new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.ph_sensor")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setTextAlignment(Alignment.CenterLeft) + .setPos(90, 30)); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationPlant.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationPlant.java new file mode 100644 index 0000000000..86f2c2b5bd --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationPlant.java @@ -0,0 +1,739 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static gregtech.api.enums.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.Energy; +import static gregtech.api.enums.HatchElement.ExoticEnergy; +import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTStructureUtility.ofFrame; +import static gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitBase.WATER_BOOST_BONUS_CHANCE; +import static gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitBase.WATER_BOOST_NEEDED_FLUID; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +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.minecraftforge.common.util.ForgeDirection; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.drawable.shapes.Rectangle; +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.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.Scrollable; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GTUITextures; +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.MTEExtendedPowerMultiBlockBase; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer; +import gregtech.common.gui.modularui.widget.TextButtonWidget; + +public class MTEPurificationPlant extends MTEExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; + + /** + * Maximum distance in each axis between the purification plant main controller and the controller blocks of the + * purification plant units. + */ + public static final int MAX_UNIT_DISTANCE = 32; + + /** + * Time in ticks for a full processing cycle to complete. + */ + public static final int CYCLE_TIME_TICKS = 120 * SECONDS; + + /** + * Stores all purification units linked to this controller. + * Normally all units in this list should be valid and unique, if not then there is a bug where they are not being + * unlinked properly on block destruction/relinking. + */ + private final List mLinkedUnits = new ArrayList<>(); + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, PurificationPlantStructureString.STRUCTURE_STRING) + // Create an identical structure for survival autobuild, with water replaced with air + .addShape( + STRUCTURE_PIECE_MAIN_SURVIVAL, + Arrays.stream(PurificationPlantStructureString.STRUCTURE_STRING) + .map( + sa -> Arrays.stream(sa) + .map(s -> s.replaceAll("F", " ")) + .toArray(String[]::new)) + .toArray(String[][]::new)) + // Superplasticizer-treated high strength concrete + .addElement('A', ofBlock(GregTechAPI.sBlockCasings9, 3)) + // Sterile Water Plant Casing + .addElement('B', ofBlock(GregTechAPI.sBlockCasings9, 4)) + // Reinforced Sterile Water Plant Casing + .addElement('C', ofBlock(GregTechAPI.sBlockCasings9, 5)) + // Tinted Industrial Glass + .addElement('D', ofBlockAnyMeta(GregTechAPI.sBlockTintedGlass, 0)) + .addElement('F', ofBlock(Blocks.water, 0)) + .addElement('G', ofFrame(Materials.Tungsten)) + // Hatch space + .addElement( + 'H', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(t.getAllowedHatches()) + .dot(1) + .casingIndex(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings9, 4)) + .build()), + ofBlock(GregTechAPI.sBlockCasings9, 4))) + .build(); + + public MTEPurificationPlant(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPurificationPlant(String aName) { + super(aName); + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 6, 0); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN_SURVIVAL, stackSize, 3, 6, 0, elementBudget, env, true); + if (built == -1) { + GTUtility.sendChatToPlayer( + env.getActor(), + EnumChatFormatting.GREEN + "Auto placing done ! Now go place the water yourself !"); + return 0; + } + return built; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Plant") + .addInfo("Main controller block for the Water Purification Plant.") + .addInfo( + "Freely place " + EnumChatFormatting.YELLOW + + "Purification Units " + + EnumChatFormatting.GRAY + + "within " + + EnumChatFormatting.RED + + MAX_UNIT_DISTANCE + + EnumChatFormatting.GRAY + + " blocks along each axis.") + .addInfo("Left click this controller with a data stick, then right click a purification unit to link.") + .addInfo("Supplies power to linked purification units. This multiblock accepts TecTech energy hatches.") + .addSeparator() + .addInfo( + "Works in fixed time processing cycles of " + EnumChatFormatting.RED + + CYCLE_TIME_TICKS / SECONDS + + EnumChatFormatting.GRAY + + " seconds.") + .addInfo("All linked units follow this cycle.") + .addSeparator() + .addInfo("Every recipe has a base chance of success. Success rate can be boosted") + .addInfo("by using a portion of the target output as a secondary input.") + .addInfo( + EnumChatFormatting.RED + GTUtility.formatNumbers(WATER_BOOST_NEEDED_FLUID * 100) + + "%" + + EnumChatFormatting.GRAY + + " of output yield will be consumed in exchange for an") + .addInfo( + "additive " + EnumChatFormatting.RED + + GTUtility.formatNumbers(WATER_BOOST_BONUS_CHANCE * 100) + + "%" + + EnumChatFormatting.GRAY + + " increase to success.") + .addInfo( + "On recipe failure, each purification unit has a " + EnumChatFormatting.RED + + "50%" + + EnumChatFormatting.GRAY + + " chance") + .addInfo("to return water of the same quality as the input or lower.") + .addSeparator() + .addInfo("Every purification unit has a configuration window to configure maximum parallel amount.") + .addInfo( + "This will only scale purified water I/O and power usage. Other catalysts and outputs are unchanged.") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "Contaminants and ionized particles in water can cause significant imperfections in delicate") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "processes related to the cutting and engraving of silicon wafers and chips. It is crucial that") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "the water is systematically purified through a series of increasingly precise and complex") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "purification processes, and this multiblock is the heart of the operation.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(7, 9, 8, false) + .addCasingInfoExactlyColored( + "Superplasticizer-Treated High Strength Concrete", + EnumChatFormatting.GRAY, + 56, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Sterile Water Plant Casing", + EnumChatFormatting.GRAY, + 77, + EnumChatFormatting.GOLD, + false) + .addCasingInfoRangeColored( + "Reinforced Sterile Water Plant Casing", + EnumChatFormatting.GRAY, + 71, + 72, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Tungsten Frame Box", + EnumChatFormatting.GRAY, + 30, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Tinted Industrial Glass", + EnumChatFormatting.GRAY, + 6, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored("Reinforced Door", EnumChatFormatting.GRAY, 1, EnumChatFormatting.GOLD, false) + .addController("Front center") + .addEnergyHatch(EnumChatFormatting.GOLD + "1", 1) + .addMaintenanceHatch(EnumChatFormatting.GOLD + "1", 1) + .addStructureInfo("Requires water to be placed in the tank.") + .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationPlant(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean active, boolean redstoneLevel) { + if (side == facing) { + if (active) return new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings9, 4)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings9, 4)), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { + Textures.BlockIcons.getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings9, 4)) }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + private List> getAllowedHatches() { + return ImmutableList.of(Maintenance, Energy, ExoticEnergy); + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + // Check self + if (!checkPiece(STRUCTURE_PIECE_MAIN, 3, 6, 0)) { + return false; + } + + // Check hatches + if (!checkHatches()) { + return false; + } + + // using nano forge method of detecting hatches. + if (!checkExoticAndNormalEnergyHatches()) { + return false; + } + + return true; + } + + private boolean checkHatches() { + // Exactly one maintenance hatch is required + return mMaintenanceHatches.size() == 1; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide()) { + // Trigger structure check of linked units, but never all in the same tick, and at most once per cycle. + for (int i = 0; i < mLinkedUnits.size(); ++i) { + if (aTick % CYCLE_TIME_TICKS == i) { + LinkedPurificationUnit unit = mLinkedUnits.get(i); + boolean structure = unit.metaTileEntity() + .checkStructure(true); + // If unit was active but deformed, set as inactive + if (unit.isActive() && !structure) { + unit.setActive(false); + // Also remember to recalculate power usage, since otherwise the deformed unit will + // keep drawing power + this.lEUt = -calculateEffectivePowerUsage(); + } + } + } + } + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + updateCycleProgress(); + // Calculate efficiency based on maintenance issues + if (mMaxProgresstime > 0) { + mEfficiency = Math.max( + 0, + Math.min( + mEfficiency + mEfficiencyIncrease, + getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000))); + } + } + + private void updateCycleProgress() { + // Since the plant does not run recipes directly, we just continuously loop the base cycle + if (mMachine) { + // cycle is running, so simply advance it + if (mMaxProgresstime > 0) { + // onRunningTick is responsible for draining power + if (onRunningTick(mInventory[1])) { + markDirty(); + mProgresstime += 1; + // Update progress time for active units + for (LinkedPurificationUnit unit : this.mLinkedUnits) { + if (unit.isActive()) { + MTEPurificationUnitBase metaTileEntity = unit.metaTileEntity(); + metaTileEntity.mProgresstime = mProgresstime; + } + } + // Cycle finished + if (mProgresstime >= mMaxProgresstime) { + this.endCycle(); + } + } else { + // Power drain failed, shut down all other units due to power loss. + // Note that we do not need to shut down self, as this is done in + // onRunningTick already + for (LinkedPurificationUnit unit : mLinkedUnits) { + if (unit.isActive()) { + unit.metaTileEntity() + .stopMachine(ShutDownReasonRegistry.POWER_LOSS); + } + } + } + } + + // No cycle running, start a new cycle if the machine is turned on + if (mMaxProgresstime == 0 && isAllowedToWork()) { + this.startCycle(); + } + } + } + + private void startCycle() { + mProgresstime = 0; + mMaxProgresstime = CYCLE_TIME_TICKS; + mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); + + // Find active units and notify them that the cycle started + for (LinkedPurificationUnit unit : this.mLinkedUnits) { + MTEPurificationUnitBase metaTileEntity = unit.metaTileEntity(); + PurificationUnitStatus status = metaTileEntity.status(); + // Unit needs to be online to be considered active. + if (status == PurificationUnitStatus.ONLINE) { + // Perform recipe check for unit and start it if successful + if (metaTileEntity.doPurificationRecipeCheck()) { + unit.setActive(true); + metaTileEntity.startCycle(mMaxProgresstime, mProgresstime); + } + } + } + + // After activating all units, calculate power usage + lEUt = -calculateEffectivePowerUsage(); + } + + private void endCycle() { + mMaxProgresstime = 0; + + // Mark all units as inactive and reset their progress time + for (LinkedPurificationUnit unit : this.mLinkedUnits) { + MTEPurificationUnitBase metaTileEntity = unit.metaTileEntity(); + // If this unit was active, end the cycle + if (unit.isActive()) { + metaTileEntity.endCycle(); + } + unit.setActive(false); + } + } + + /** + * Calculate power usage of all units + */ + private long calculateEffectivePowerUsage() { + long euT = 0; + for (LinkedPurificationUnit unit : mLinkedUnits) { + if (unit.isActive()) { + euT += unit.metaTileEntity() + .getActualPowerUsage(); + } + } + return euT; + } + + @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 void registerLinkedUnit(MTEPurificationUnitBase unit) { + this.mLinkedUnits.add(new LinkedPurificationUnit(unit)); + } + + public void unregisterLinkedUnit(MTEPurificationUnitBase unit) { + this.mLinkedUnits.removeIf(link -> link.metaTileEntity() == unit); + } + + @Override + public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!(aPlayer instanceof EntityPlayerMP)) return; + + // Save link data to data stick, very similar to Crafting Input Buffer. + + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return; + + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("type", "PurificationPlant"); + tag.setInteger("x", aBaseMetaTileEntity.getXCoord()); + tag.setInteger("y", aBaseMetaTileEntity.getYCoord()); + tag.setInteger("z", aBaseMetaTileEntity.getZCoord()); + + dataStick.stackTagCompound = tag; + dataStick.setStackDisplayName( + "Purification Plant Link Data Stick (" + aBaseMetaTileEntity + .getXCoord() + ", " + aBaseMetaTileEntity.getYCoord() + ", " + aBaseMetaTileEntity.getZCoord() + ")"); + aPlayer.addChatMessage(new ChatComponentText("Saved Link Data to Data Stick")); + } + + @Override + public String[] getInfoData() { + var ret = new ArrayList(); + // Show linked purification units and their status + ret.add("Linked Purification Units: "); + for (LinkedPurificationUnit unit : this.mLinkedUnits) { + String text = EnumChatFormatting.AQUA + unit.metaTileEntity() + .getLocalName() + ": "; + PurificationUnitStatus status = unit.metaTileEntity() + .status(); + switch (status) { + case ONLINE -> { + text = text + EnumChatFormatting.GREEN + "Online"; + } + case DISABLED -> { + text = text + EnumChatFormatting.YELLOW + "Disabled"; + } + case INCOMPLETE_STRUCTURE -> { + text = text + EnumChatFormatting.RED + "Incomplete Structure"; + } + } + ret.add(text); + } + return ret.toArray(new String[0]); + } + + @Override + public void onBlockDestroyed() { + // When the controller is destroyed we want to notify all currently linked units + for (LinkedPurificationUnit unit : this.mLinkedUnits) { + unit.metaTileEntity() + .unlinkController(); + } + super.onBlockDestroyed(); + } + + private void drawTopText(DynamicPositionedColumn screenElements) { + screenElements.setSynced(false) + .setSpace(0) + .setPos(10, 8); + + screenElements + .widget( + new TextWidget(GTUtility.trans("138", "Incomplete Structure.")).setDefaultColor(EnumChatFormatting.RED) + .setEnabled(widget -> !mMachine)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)); + + screenElements.widget( + new TextWidget("Hit with Soft Mallet to start.").setDefaultColor(EnumChatFormatting.BLACK) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive())) + .widget( + new FakeSyncWidget.IntegerSyncer( + () -> getBaseMetaTileEntity().getErrorDisplayID(), + val -> getBaseMetaTileEntity().setErrorDisplayID(val))) + .widget( + new FakeSyncWidget.BooleanSyncer( + () -> getBaseMetaTileEntity().isActive(), + val -> getBaseMetaTileEntity().setActive(val))); + screenElements.widget( + new TextWidget(GTUtility.trans("142", "Running perfectly.")).setDefaultColor(EnumChatFormatting.GREEN) + .setEnabled( + widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && getBaseMetaTileEntity().isActive())); + screenElements.widget( + TextWidget.dynamicString( + () -> getBaseMetaTileEntity().getLastShutDownReason() + .getDisplayString()) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled( + widget -> shouldDisplayShutDownReason() && !getBaseMetaTileEntity().isActive() + && GTUtility.isStringValid( + getBaseMetaTileEntity().getLastShutDownReason() + .getDisplayString()) + && getBaseMetaTileEntity().wasShutdown())) + .widget( + new ShutDownReasonSyncer( + () -> getBaseMetaTileEntity().getLastShutDownReason(), + reason -> getBaseMetaTileEntity().setShutDownReason(reason))) + .widget( + new FakeSyncWidget.BooleanSyncer( + () -> getBaseMetaTileEntity().wasShutdown(), + wasShutDown -> getBaseMetaTileEntity().setShutdownStatus(wasShutDown))); + screenElements.widget( + TextWidget.dynamicString(this::generateCurrentRecipeInfoString) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setEnabled(widget -> (mMaxProgresstime > 0))) + .widget(new FakeSyncWidget.IntegerSyncer(() -> mProgresstime, val -> mProgresstime = val)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> mMaxProgresstime, val -> mMaxProgresstime = val)); + } + + private final int STATUS_WINDOW_ID = 10; + + private ModularWindow createStatusWindow(final EntityPlayer player) { + final int windowWidth = 260; + final int windowHeight = 200; + ModularWindow.Builder builder = ModularWindow.builder(windowWidth, windowHeight); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(windowWidth - 15, 3)); + + // Title widget + builder.widget( + new TextWidget(EnumChatFormatting.BOLD + "Purification Unit Status").setTextAlignment(Alignment.Center) + .setPos(5, 10) + .setSize(windowWidth, 8)); + + int currentYPosition = 20; + Scrollable mainDisp = new Scrollable().setVerticalScroll(); + + int rowHeight = 20; + for (int i = 0; i < this.mLinkedUnits.size(); i++) { + mainDisp.widget(makeUnitStatusWidget(mLinkedUnits.get(i)).setPos(0, rowHeight * (i + 1))); + } + + builder.widget( + mainDisp.setPos(5, currentYPosition) + .setSize(windowWidth - 10, windowHeight - currentYPosition - 5)); + return builder.build(); + } + + private Widget makeStatusWindowButton() { + TextButtonWidget widget = (TextButtonWidget) new TextButtonWidget("Status").setLeftMargin(4) + .setSize(40, 16) + .setPos(10, 40); + widget.button() + .setOnClick( + (clickData, w) -> { + if (!w.isClient()) w.getContext() + .openSyncedWindow(STATUS_WINDOW_ID); + }) + .setBackground(GTUITextures.BUTTON_STANDARD); + widget.text() + .setTextAlignment(Alignment.CenterLeft) + .setDefaultColor(EnumChatFormatting.BLACK); + return widget; + } + + private Widget makeUnitStatusWidget(LinkedPurificationUnit unit) { + // Draw small machine controller icon + DynamicPositionedRow row = new DynamicPositionedRow(); + ItemStackHandler machineIcon = new ItemStackHandler(1); + machineIcon.setStackInSlot( + 0, + unit.metaTileEntity() + .getStackForm(1)); + + row.widget( + SlotWidget.phantom(machineIcon, 0) + .disableInteraction() + .setPos(0, 0)) + .setSize(20, 20); + + // Display machine name and status + String name = unit.metaTileEntity() + .getLocalName(); + + row.widget( + TextWidget.dynamicString(() -> name + " " + unit.getStatusString()) + .setSynced(false) + .setTextAlignment(Alignment.CenterLeft) + .setPos(25, 0) + .setSize(0, 20)) + .widget(new FakeSyncWidget.StringSyncer(() -> name, _name -> {})) + .widget( + unit.metaTileEntity() + .makeSyncerWidgets()) + .widget(new FakeSyncWidget.BooleanSyncer(unit::isActive, unit::setActive));; + + return row; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + + buildContext.addSyncedWindow(STATUS_WINDOW_ID, this::createStatusWindow); + + // Draw basic recipe info + final DynamicPositionedColumn controlTextArea = new DynamicPositionedColumn(); + drawTopText(controlTextArea); + builder.widget(controlTextArea); + + // Draw line separator + builder.widget( + new Rectangle().setColor(Color.rgb(114, 120, 139)) + .asWidget() + .setSizeProvider((screenSize, window, parent) -> new Size(window.getSize().width - 8, 2)) + .setPos(3, 32)); + + // Add status window button + builder.widget(makeStatusWindowButton()); + + // Add parallel count number input + + builder.widget(createPowerSwitchButton(builder)); + + // Add value syncers, note that we do this here so + // everything is updated once the status gui opens + addSyncers(builder); + } + + private void addSyncers(ModularWindow.Builder builder) { + // Sync connection list to client + builder.widget(new FakeSyncWidget.ListSyncer<>(() -> mLinkedUnits, links -> { + mLinkedUnits.clear(); + mLinkedUnits.addAll(links); + }, (buffer, link) -> { + // Try to save link data to NBT, so we can reconstruct it on client + try { + buffer.writeNBTTagCompoundToBuffer(link.writeLinkDataToNBT()); + } catch (IOException e) { + GTLog.err.println(e.getCause()); + } + }, buffer -> { + // Try to load link data from NBT compound as constructed above. + try { + return new LinkedPurificationUnit(buffer.readNBTTagCompoundFromBuffer()); + } catch (IOException e) { + GTLog.err.println(e.getCause()); + } + return null; + })); + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBaryonicPerfection.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBaryonicPerfection.java new file mode 100644 index 0000000000..250d968945 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBaryonicPerfection.java @@ -0,0 +1,565 @@ +package gregtech.common.tileentities.machines.multi.purification; + +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.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.concurrent.ThreadLocalRandom; + +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.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.GregTechAPI; +import gregtech.api.enums.ItemList; +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.MTEHatchInput; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.items.IDMetaItem03; +import gregtech.common.items.MetaGeneratedItem03; + +public class MTEPurificationUnitBaryonicPerfection + extends MTEPurificationUnitBase implements ISurvivalConstructable { + + public static long BARYONIC_MATTER_OUTPUT = 2000L; + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int STRUCTURE_X_OFFSET = 8; + private static final int STRUCTURE_Y_OFFSET = 8; + private static final int STRUCTURE_Z_OFFSET = 0; + + static final String[][] structure = new String[][] { + // spotless:off + { " ", " ", " ", " ", " ", " ", " AAAAA ", " AAAAA ", " AA~AA ", " AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " " }, + { " ", " E ", " E ", " E ", " E ", " E ", " AAAAA ", " AAAAA ", " EEEEEAAAAAEEEEE ", " AAAAA ", " AAAAA ", " E ", " E ", " E ", " E ", " E ", " " }, + { " ", " E ", " ", " ", " ", " ", " CCCCC ", " CDDDC ", " E CDBDC E ", " CDDDC ", " CCCCC ", " ", " ", " ", " ", " E ", " " }, + { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, + { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " "," E ", " " }, + { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, + { " AAAAA ", " AAAAA ", " CCCCC ", " ", " ", " ", "AAC AAAAA CAA", "AAC ADDDA CAA", "AAC ADBDA CAA", "AAC ADDDA CAA", "AAC AAAAA CAA", " ", " ", " ", " CCCCC ", " AAAAA ", " AAAAA " }, + { " AAAAA ", " AAAAA ", " CDDDC ", " DDD ", " DDD ", " DDD ", "AAC ADDDA CAA", "AADDDDD DDDDDAA", "AADDDDD B DDDDDAA", "AADDDDD DDDDDAA", "AAC ADDDA CAA", " DDD ", " DDD ", " DDD ", " CDDDC ", " AAAAA ", " AAAAA " }, + { " AAAAA ", " EEEEEAAAAAEEEEE ", " E CDBDC E ", " E DBD E ", " E DBD E ", " E DBD E ", "AAC ADBDA CAA", "AADDDDD B DDDDDAA", "AABBBBBBBBBBBBBAA", "AADDDDD B DDDDDAA", "AAC ADBDA CAA", " E DBD E ", " E DBD E ", " E DBD E ", " E CDBDC E ", " EEEEEAAAAAEEEEE ", " AAAAA " }, + { " AAAAA ", " AAAAA ", " CDDDC ", " DDD ", " DDD ", " DDD ", "AAC ADDDA CAA", "AADDDDD DDDDDAA", "AADDDDD B DDDDDAA", "AADDDDD DDDDDAA", "AAC ADDDA CAA", " DDD ", " DDD ", " DDD ", " CDDDC ", " AAAAA ", " AAAAA " }, + { " AAAAA ", " AAAAA ", " CCCCC ", " ", " ", " ", "AAC AAAAA CAA", "AAC ADDDA CAA", "AAC ADBDA CAA", "AAC ADDDA CAA", "AAC AAAAA CAA", " ", " ", " ", " CCCCC ", " AAAAA ", " AAAAA " }, + { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, + { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, + { " ", " E ", " ", " ", " ", " ", " ", " DDD ", " E DBD E ", " DDD ", " ", " ", " ", " ", " ", " E ", " " }, + { " ", " E ", " ", " ", " ", " ", " CCCCC ", " CDDDC ", " E CDBDC E ", " CDDDC ", " CCCCC ", " ", " ", " ", " ", " E ", " " }, + { " ", " E ", " E ", " E ", " E ", " E ", " AAAAA ", " AAAAA ", " EEEEEAAAAAEEEEE ", " AAAAA ", " AAAAA ", " E ", " E ", " E ", " E ", " E ", " " }, + { " ", " ", " ", " ", " ", " ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " " } }; + // spotless:on + + // Dimensionally transcendent casing (placeholder) + private static final int CASING_INDEX_MAIN = getTextureIndex(GregTechAPI.sBlockCasings10, 2); + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + // Quark Exclusion Casing + .addElement( + 'A', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(Arrays.asList(InputBus, OutputBus, InputHatch, OutputHatch)) + .dot(1) + .casingIndex(CASING_INDEX_MAIN) + .build()), + onElementPass(t -> t.numCasings++, ofBlock(GregTechAPI.sBlockCasings10, 2)))) + // Particle Beam Guidance Pipe Casing + .addElement('B', ofBlock(GregTechAPI.sBlockCasings9, 14)) + // Femtometer-Calibrated Particle Beam Casing + .addElement('C', ofBlock(GregTechAPI.sBlockCasings9, 15)) + // Non-Photonic Matter Exclusion Glass + .addElement('D', ofBlock(GregTechAPI.sBlockGlass1, 3)) + .addElement('E', ofFrame(Materials.Bedrockium)) + .build(); + + private static class CatalystCombination { + + public ItemStack firstCatalyst; + public ItemStack secondCatalyst; + + public static ItemList[] CATALYST_ITEMS = new ItemList[] { ItemList.Quark_Creation_Catalyst_Up, + ItemList.Quark_Creation_Catalyst_Down, ItemList.Quark_Creation_Catalyst_Bottom, + ItemList.Quark_Creation_Catalyst_Top, ItemList.Quark_Creation_Catalyst_Strange, + ItemList.Quark_Creation_Catalyst_Charm }; + + public CatalystCombination(ItemStack first, ItemStack second) { + firstCatalyst = first; + secondCatalyst = second; + } + + public boolean matches(ItemStack a, ItemStack b) { + return (a.isItemEqual(firstCatalyst) && b.isItemEqual(secondCatalyst)) + || (b.isItemEqual(firstCatalyst) && a.isItemEqual(secondCatalyst)); + } + + public NBTTagCompound saveToNBT() { + NBTTagCompound nbt = new NBTTagCompound(); + NBTTagCompound first = new NBTTagCompound(); + NBTTagCompound second = new NBTTagCompound(); + firstCatalyst.writeToNBT(first); + secondCatalyst.writeToNBT(second); + nbt.setTag("first", first); + nbt.setTag("second", second); + return nbt; + } + + public static CatalystCombination readFromNBT(NBTTagCompound nbt) { + NBTTagCompound first = nbt.getCompoundTag("first"); + NBTTagCompound second = nbt.getCompoundTag("second"); + return new CatalystCombination( + ItemStack.loadItemStackFromNBT(first), + ItemStack.loadItemStackFromNBT(second)); + } + } + + private static CatalystCombination generateNewCombination() { + ThreadLocalRandom random = ThreadLocalRandom.current(); + // Generate two unique indices into the list + int firstIndex = random.nextInt(0, CatalystCombination.CATALYST_ITEMS.length); + int secondIndex = random.nextInt(0, CatalystCombination.CATALYST_ITEMS.length); + while (secondIndex == firstIndex) { + secondIndex = random.nextInt(0, CatalystCombination.CATALYST_ITEMS.length); + } + + return new CatalystCombination( + CatalystCombination.CATALYST_ITEMS[firstIndex].get(1), + CatalystCombination.CATALYST_ITEMS[secondIndex].get(1)); + } + + private CatalystCombination currentCombination = null; + + private ArrayList insertedCatalysts = new ArrayList<>(); + + private static final long CATALYST_BASE_COST = 144L; + + private int correctStartIndex = -1; + private int numCasings = 0; + private static final int MIN_CASINGS = 300; + + public MTEPurificationUnitBaryonicPerfection(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPurificationUnitBaryonicPerfection(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitBaryonicPerfection(mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean active, boolean redstoneLevel) { + if (side == facing) { + if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW) + .extFacing() + .glow() + .build() }; + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN) }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + hintsOnly, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + return survivialBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET, + elementBudget, + env, + true); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + numCasings = 0; + if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; + if (numCasings < MIN_CASINGS) return false; + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the Absolute Baryonic Perfection Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo( + "Insert " + EnumChatFormatting.WHITE + + "Quark Releasing Catalysts " + + EnumChatFormatting.GRAY + + "into the input bus while running.") + .addInfo( + "Every recipe cycle, a different combination of " + EnumChatFormatting.RED + + "2" + + EnumChatFormatting.GRAY + + " different " + + EnumChatFormatting.WHITE + + "Quark Releasing Catalysts") + .addInfo("will correctly identify the lone quark and succeed the recipe.") + .addSeparator() + .addInfo( + "Every " + EnumChatFormatting.RED + + "20" + + EnumChatFormatting.GRAY + + " ticks, consumes ALL catalysts in the input bus.") + .addInfo( + "The base cost of inserting a catalyst is " + EnumChatFormatting.RED + + CATALYST_BASE_COST + + "L" + + EnumChatFormatting.WHITE + + " Molten Infinity") + .addInfo("For every duplicate occurrence of an inserted catalyst in the sequence, this cost is doubled.") + .addSeparator() + .addInfo("Keeps track of the entire sequence of catalysts inserted this recipe.") + .addInfo( + "If the correct catalyst combination is in the sequence of inserted catalysts, immediately outputs " + + EnumChatFormatting.WHITE + + "Stabilised Baryonic Matter") + .addInfo("At the end of the recipe, all incorrectly inserted catalysts are returned in the output bus.") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "The final stage of water purification goes beyond subatomic particles and identifies the smallest") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "possible imperfections within the baryons themselves. By correctly identifying which pairs of quark") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "flavors are required, the unit will activate the catalysts, stabilizing the errant particles.") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "This ultimately creates both Stabilised Baryonic Matter and, most importantly, absolutely perfectly purified water.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(17, 17, 17, false) + .addCasingInfoMinColored( + "Quark Exclusion Casing", + EnumChatFormatting.GRAY, + MIN_CASINGS, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Femtometer-Calibrated Particle Beam Casing", + EnumChatFormatting.GRAY, + 96, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Particle Beam Guidance Pipe Casing", + EnumChatFormatting.GRAY, + 37, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Non-Photonic Matter Exclusion Glass", + EnumChatFormatting.GRAY, + 240, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Bedrockium Frame Box", + EnumChatFormatting.GRAY, + 108, + EnumChatFormatting.GOLD, + false) + .addController("Front Center") + .addInputBus("Any Quark Exclusion Casing", 1) + .addInputHatch("Any Quark Exclusion Casing", 1) + .addOutputBus("Any Quark Exclusion Casing", 1) + .addOutputHatch("Any Quark Exclusion Casing", 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.purificationParticleExtractionRecipes; + } + + @Override + public void startCycle(int cycleTime, int progressTime) { + super.startCycle(cycleTime, progressTime); + this.insertedCatalysts.clear(); + this.currentCombination = generateNewCombination(); + correctStartIndex = -1; + } + + private boolean isCatalyst(ItemStack stack) { + if (stack.getItem() instanceof MetaGeneratedItem03) { + int meta = stack.getItemDamage() - 32000; // why, greg. + return meta >= IDMetaItem03.Quark_Creation_Catalyst_Up.ID + && meta <= IDMetaItem03.Quark_Creation_Catalyst_Top.ID; + } + return false; + } + + @Override + public void endCycle() { + super.endCycle(); + // Output incorrect indices unchanged, the spent ones will follow if recipe was successful from the actual + // recipe outputs + for (int i = 0; i < insertedCatalysts.size(); ++i) { + if (i == correctStartIndex || i == correctStartIndex + 1) continue; + + addOutput(insertedCatalysts.get(i)); + } + } + + @Override + public float calculateFinalSuccessChance() { + // Only succeed if correct combination was inserted + if (correctStartIndex != -1) return 100.0f; + else return 0.0f; + } + + private int calculateCatalystCost(ItemStack newCatalyst) { + // Count number of previously inserted catalysts + int count = 0; + for (ItemStack cat : this.insertedCatalysts) { + // We already assume that newCatalyst is a valid catalyst item + if (cat.getItemDamage() == newCatalyst.getItemDamage()) { + ++count; + } + } + // Cost is exponential in function of amount of duplicate catalysts + return (int) (Math.pow(2, count) * CATALYST_BASE_COST); + } + + // Returns the first index of a valid combination, or -1 if there is no valid combination in the sequence + public int checkSequence() { + // Loop over the entire sequence and check if any pair contains a valid combination + for (int i = 0; i < insertedCatalysts.size() - 1; ++i) { + ItemStack first = insertedCatalysts.get(i); + ItemStack second = insertedCatalysts.get(i + 1); + // Found a match, return its starting index + if (currentCombination.matches(first, second)) { + return i; + } + } + // No match found, return -1 + return -1; + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.runMachine(aBaseMetaTileEntity, aTick); + // Every 20 ticks, add all catalysts from the input bus to the internal inventory. + if (mMaxProgresstime > 0 && aTick % 20 == 0) { + ArrayList storedInputs = getStoredInputs(); + // For each stack in the input, check if it is a valid catalyst item and if so consume it + for (ItemStack stack : storedInputs) { + if (isCatalyst(stack)) { + // Try to deplete catalyst cost first + int cost = calculateCatalystCost(stack); + FluidStack inputCost = Materials.Infinity.getMolten(cost); + // Drain the input cost directly from a hatch since we are not inside + // recipe processing + boolean drained = false; + for (MTEHatchInput hatch : this.mInputHatches) { + FluidStack drainedStack = hatch.drain(ForgeDirection.UNKNOWN, inputCost, true); + if (drainedStack != null && drainedStack.amount == inputCost.amount) { + drained = true; + break; + } + } + // If we could not drain, stop the machine + if (!drained) { + stopMachine(ShutDownReasonRegistry.outOfFluid(inputCost)); + return; + } + // Now add the catalysts to the list, one by one since there may be multiples and we want to + // keep them as single entries in the list + for (int i = 0; i < stack.stackSize; ++i) { + ItemStack singleStack = new ItemStack(stack.getItem(), 1, stack.getItemDamage()); + this.insertedCatalysts.add(singleStack); + } + // Then deplete the entire stack + this.depleteInput(stack); + } + } + + // Only do this check if we didn't find a correct combination yet + if (correctStartIndex != -1) return; + + // Now check the sequence for a correct combination + correctStartIndex = checkSequence(); + // If we found something, immediately output stable baryonic matter + if (correctStartIndex != -1) addOutput(Materials.StableBaryonicMatter.getFluid(BARYONIC_MATTER_OUTPUT)); + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + NBTTagCompound insertedNBT = new NBTTagCompound(); + for (int i = 0; i < insertedCatalysts.size(); ++i) { + ItemStack inserted = insertedCatalysts.get(i); + NBTTagCompound itemNBT = new NBTTagCompound(); + inserted.writeToNBT(itemNBT); + insertedNBT.setTag(Integer.toString(i), itemNBT); + } + aNBT.setTag("insertedItems", insertedNBT); + aNBT.setInteger("correctStartIndex", correctStartIndex); + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + // Generate a random combination on load + currentCombination = generateNewCombination(); + if (aNBT.hasKey("insertedItems")) { + NBTTagCompound insertedList = aNBT.getCompoundTag("insertedItems"); + // Initialize empty list with correct size + this.insertedCatalysts = new ArrayList<>( + Collections.nCopies( + insertedList.func_150296_c() + .size(), + null)); + for (String key : insertedList.func_150296_c()) { + NBTTagCompound itemCompound = insertedList.getCompoundTag(key); + int index = Integer.parseInt(key); + this.insertedCatalysts.set(index, ItemStack.loadItemStackFromNBT(itemCompound)); + } + } + if (aNBT.hasKey("correctStartIndex")) { + correctStartIndex = aNBT.getInteger("correctStartIndex"); + } + super.loadNBTData(aNBT); + } + + private String getCorrectlyDecodedString() { + if (correctStartIndex != -1) { + return EnumChatFormatting.GREEN + "Yes"; + } + return EnumChatFormatting.RED + "No"; + } + + public EnumChatFormatting getQuarkColor(ItemStack stack) { + int meta = stack.getItemDamage() - 32000; + if (meta == IDMetaItem03.Quark_Creation_Catalyst_Up.ID) return EnumChatFormatting.BLUE; + if (meta == IDMetaItem03.Quark_Creation_Catalyst_Down.ID) return EnumChatFormatting.LIGHT_PURPLE; + if (meta == IDMetaItem03.Quark_Creation_Catalyst_Strange.ID) return EnumChatFormatting.YELLOW; + if (meta == IDMetaItem03.Quark_Creation_Catalyst_Charm.ID) return EnumChatFormatting.GREEN; + if (meta == IDMetaItem03.Quark_Creation_Catalyst_Bottom.ID) return EnumChatFormatting.AQUA; + if (meta == IDMetaItem03.Quark_Creation_Catalyst_Top.ID) return EnumChatFormatting.RED; + return EnumChatFormatting.GRAY; + } + + public String[] getInfoData() { + ArrayList info = new ArrayList<>(Arrays.asList(super.getInfoData())); + info.add("Catalyst insertion history for this recipe cycle"); + for (int i = 0; i < insertedCatalysts.size(); ++i) { + ItemStack stack = insertedCatalysts.get(i); + String name = stack.getDisplayName(); + String[] split = name.split("-"); + info.add( + EnumChatFormatting.YELLOW + "" + + (i + 1) + + ": " + + getQuarkColor(stack) + + split[0] + + EnumChatFormatting.GRAY + + "-" + + split[1]); + } + info.add("Quark Combination correctly identified: " + getCorrectlyDecodedString()); + return info.toArray(new String[] {}); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getWaterTier() { + return 8; + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_UEV; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBase.java new file mode 100644 index 0000000000..e986f16940 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitBase.java @@ -0,0 +1,805 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Stream; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +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.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.VoidingMode; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.metadata.PurificationPlantBaseChanceKey; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockCasingsAbstract; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +/** + * Base class for purification units. This class handles all shared behaviour between units. + * When inheriting from this, make sure to call super.loadNBTData() and super.saveNBTData() + * if you override these methods, or linking will break. + */ +public abstract class MTEPurificationUnitBase> + extends MTEExtendedPowerMultiBlockBase { + + /** + * Ratio of output fluid that needs to be inserted back as input to trigger a "water boost". + * Must be in [0, 1]. + */ + public static final float WATER_BOOST_NEEDED_FLUID = 0.1f; + /** + * Additive bonus to success chance when water boost is active. + * Must be in [0, 1] + */ + public static final float WATER_BOOST_BONUS_CHANCE = 0.15f; + + /** + * Small internal enum to report back the various error cases when linking purification units to the + * purification plant. + */ + private enum LinkResult { + /** + * Link target was out of range of the main controller + */ + TOO_FAR, + /** + * No valid GT_MetaTileEntity_PurificationPlant was found at the link target position. + */ + NO_VALID_PLANT, + /** + * Link successful + */ + SUCCESS, + } + + /** + * Coordinates of the main purification plant controller. These can be used to find the controller again + * on world load. + */ + private int controllerX, controllerY, controllerZ; + + /** + * Whether a controller was previously set. + */ + private boolean controllerSet = false; + + /** + * Pointer to the main purification plant controller. + */ + private MTEPurificationPlant controller = null; + + /** + * The current recipe being run in the purification unit. Note that purification unit recipes are a bit special, + * so input and output in the recipe might not exactly match the required inputs and produced outputs. + * For more information, always look at the purification unit tooltip and implementation. + */ + protected GTRecipe currentRecipe = null; + + /** + * Current chance of the recipe succeeding, always in [0, 100]. A chance above 100 will be interpreted as 100. + */ + protected float currentRecipeChance = 0.0f; + + /** + * Configured parallel amount. Only water I/O and power scale. + */ + protected int maxParallel = 1; + + protected int effectiveParallel = 1; + + protected ArrayList storedFluids = null; + + protected MTEPurificationUnitBase(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + protected MTEPurificationUnitBase(String aName) { + super(aName); + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } + + @Override + public boolean doRandomMaintenanceDamage() { + // The individual purification unit structures cannot have maintenance issues, so do nothing. + return true; + } + + @Override + public boolean getDefaultHasMaintenanceChecks() { + return false; + } + + @Override + protected void setHatchRecipeMap(MTEHatchInput hatch) { + // Do nothing, we don't want to lock hatches to recipe maps since this can cause + // them to reject our catalyst fluids + } + + /** + * Used to more easily grab a correct texture index from a block + meta. + * + * @param block Block to use as base. Must implement GT_Block_Casings_Abstract + * @param meta Metadata of the block to pick the actual block + * @return The correct index into the global texture atlas. + */ + protected static int getTextureIndex(Block block, int meta) { + return ((BlockCasingsAbstract) block).getTextureIndex(meta); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + super.onPostTick(aBaseMetaTileEntity, aTimer); + // Try to re-link to controller periodically, for example on game load. + if (aTimer % 100 == 5 && controllerSet && getController() == null) { + trySetControllerFromCoord(controllerX, controllerY, controllerZ); + } + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + // Main controller updates progress time. We can do I/O logic here. + // The logic for operating purification units is typically implemented by overriding this behaviour. + if (mMaxProgresstime > 0) { + this.markDirty(); + // Do not take maintenance into consideration, because purification units do not get + // maintenance issues. + // Technically, this entire efficiency stat is a bit useless for purification units, since + // their power draw does not actually depend on it, but it's nice to keep around for consistency with other + // multiblocks. This way, you still gradually see the efficiency go down when it powers down. + mEfficiency = Math.max(0, Math.min(mEfficiency + mEfficiencyIncrease, getMaxEfficiency(mInventory[1]))); + } + } + + protected CheckRecipeResult findRecipeForInputs(FluidStack[] fluidInputs, ItemStack... itemInputs) { + RecipeMap recipeMap = this.getRecipeMap(); + + // Grab a stream of recipes and find the one with the highest success chance + Stream recipes = recipeMap.findRecipeQuery() + .fluids(fluidInputs) + .items(itemInputs) + .findAll(); + GTRecipe recipe = recipes + .max(Comparator.comparing(r -> r.getMetadataOrDefault(PurificationPlantBaseChanceKey.INSTANCE, 0.0f))) + .orElse(null); + + if (recipe == null) { + return CheckRecipeResultRegistry.NO_RECIPE; + } + + if (this.protectsExcessFluid() && !this.canOutputAll(recipe.mFluidOutputs)) { + return CheckRecipeResultRegistry.FLUID_OUTPUT_FULL; + } + + if (this.protectsExcessItem() && !this.canOutputAll(recipe.mOutputs)) { + return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL; + } + + this.currentRecipe = recipe; + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + /** + * By default, only checks fluid input. + * + * @return + */ + @NotNull + @Override + public CheckRecipeResult checkProcessing() { + this.storedFluids = this.getStoredFluids(); + CheckRecipeResult result = overrideRecipeCheck(); + if (result == null) result = findRecipeForInputs(storedFluids.toArray(new FluidStack[] {})); + + // If we had a successful result, calculate effective parallel + if (result.wasSuccessful()) { + FluidStack waterInput = this.currentRecipe.mFluidInputs[0]; + // Count total available purified water input of the previous step + long amountAvailable = 0; + for (FluidStack fluid : this.storedFluids) { + if (fluid.isFluidEqual(waterInput)) { + amountAvailable += fluid.amount; + } + } + // Determine effective parallel + effectiveParallel = (int) Math.min(maxParallel, Math.floorDiv(amountAvailable, waterInput.amount)); + // This should not happen, throw an error + if (effectiveParallel == 0) return CheckRecipeResultRegistry.INTERNAL_ERROR; + } + + return result; + } + + public CheckRecipeResult overrideRecipeCheck() { + return null; + } + + /** + * Equivalent to checkRecipe(), but public because the purification plant needs to access it and checkRecipe() + * is protected. + * + * @return True if successfully found a recipe and/or started processing/ + */ + public boolean doPurificationRecipeCheck() { + effectiveParallel = 1; + return this.checkRecipe(); + } + + /** + * Get the success chance of the recipe, from 0 to 100. Never call this while a recipe is running, because items + * or modifiers used to boost might disappear by the time recipe check comes around, + * which would invalidate this result. + */ + public float calculateBoostedSuccessChance() { + // If this.currentRecipe is null, there is a bug, so throwing a NPE is fine. + float recipeChance = this.currentRecipe.getMetadataOrDefault(PurificationPlantBaseChanceKey.INSTANCE, 0.0f); + // Apply water boost if available. + if (isWaterBoosted(this.currentRecipe)) { + recipeChance = Math.min(recipeChance + WATER_BOOST_BONUS_CHANCE * 100.0f, 100.0f); + } + return recipeChance; + } + + /** + * By default, the final recipe success chance is simply the success chance calculated on recipe check. + * This applies water boosts when needed to the base chance. Purification units can override this to perform + * more complex success chance calculations, that even take into account what happened during the runtime of the + * recipe. + * + * @return The success chance of the recipe, at the point in time the outputs are to be produced. + */ + public float calculateFinalSuccessChance() { + return this.currentRecipeChance; + } + + /** + * Get the tier of water this unit makes. Starts at 1. + */ + public abstract int getWaterTier(); + + /** + * Get the amount of water needed to execute a water boost, in mb. + */ + public FluidStack getWaterBoostAmount(GTRecipe recipe) { + // Recipes should always be constructed so that output water is always the first fluid output + FluidStack outputWater = recipe.mFluidOutputs[0]; + int amount = Math.round(outputWater.amount * WATER_BOOST_NEEDED_FLUID); + return new FluidStack(outputWater.getFluid(), amount); + } + + /** + * Returns true if this purification unit contains enough water to apply a water boost for the selected recipe. + * This should only be called during recipe check! Never call this while a recipe is running, because water used to + * boost might disappear by the time recipe check comes around, which would invalidate this result. + * + * @param recipe The recipe to check the water boost of + */ + public boolean isWaterBoosted(GTRecipe recipe) { + FluidStack inputWater = getWaterBoostAmount(recipe); + // Simulate input drain to see if we can water boost + return depleteInput(inputWater, true); + } + + /** + * Consumes all fluid inputs of the current recipe. + */ + public void depleteRecipeInputs() { + for (FluidStack input : this.currentRecipe.mFluidInputs) { + FluidStack copyWithParallel = input.copy(); + copyWithParallel.amount = input.amount * effectiveParallel; + this.depleteInput(copyWithParallel); + } + } + + /** + * Called after a recipe is found and accepted. + * + * @param cycleTime Time for a full cycle to complete + * @param progressTime Current progress time + */ + public void startCycle(int cycleTime, int progressTime) { + // Important to calculate this before depleting inputs, otherwise we may get issues with boost items + // disappearing. + this.currentRecipeChance = this.calculateBoostedSuccessChance(); + + // Deplete inputs from water boost if enabled. + if (isWaterBoosted(this.currentRecipe)) { + FluidStack inputWater = this.getWaterBoostAmount(this.currentRecipe); + this.depleteInput(inputWater); + } + + // Consume inputs + this.depleteRecipeInputs(); + // Initialize recipe and progress information. + this.mMaxProgresstime = cycleTime; + this.mProgresstime = progressTime; + this.mEfficiency = 10000; + // These need to be set so the GUI code can display the produced outputs + + // Make sure to scale purified water output with parallel amount. + // Make sure to make a full copy of the array, so we don't go modifying recipes + FluidStack[] fluidOutputs = new FluidStack[this.currentRecipe.mFluidOutputs.length]; + for (int i = 0; i < this.currentRecipe.mFluidOutputs.length; ++i) { + fluidOutputs[i] = this.currentRecipe.mFluidOutputs[i].copy(); + } + fluidOutputs[0].amount *= effectiveParallel; + this.mOutputFluids = fluidOutputs; + this.mOutputItems = this.currentRecipe.mOutputs; + // Set this value, so it can be displayed in Waila. Note that the logic for the units is + // specifically overridden so setting this value does not actually drain power. + // Instead, power is drained by the main purification plant controller. + this.lEUt = -this.getActualPowerUsage(); + } + + public void addRecipeOutputs() { + ThreadLocalRandom random = ThreadLocalRandom.current(); + this.addFluidOutputs(mOutputFluids); + // If this recipe has random item outputs, roll on it and add outputs + if (this.currentRecipe.mChances != null) { + // Roll on each output individually + for (int i = 0; i < this.currentRecipe.mOutputs.length; ++i) { + // Recipes store probabilities as a value ranging from 1-10000 + int roll = random.nextInt(10000); + if (roll <= this.currentRecipe.mChances[i]) { + this.addOutput(this.currentRecipe.mOutputs[i]); + } + } + } else { + // Guaranteed item output + for (int i = 0; i < this.currentRecipe.mOutputs.length; ++i) { + this.addOutput(this.currentRecipe.mOutputs[i]); + } + } + } + + public void endCycle() { + ThreadLocalRandom random = ThreadLocalRandom.current(); + + // First see if the recipe succeeded. For some reason random.nextFloat does not compile, so we use this + // hack instead. + float successRoll = random.nextInt(0, 10000) / 100.0f; + if (successRoll <= calculateFinalSuccessChance()) { + addRecipeOutputs(); + } else { + onRecipeFail(); + } + + // Reset recipe values for next iteration + this.mMaxProgresstime = 0; + this.mProgresstime = 0; + this.lEUt = 0; + this.mEfficiency = 0; + this.currentRecipe = null; + this.currentRecipeChance = 0.0f; + this.mOutputItems = null; + this.mOutputFluids = null; + this.effectiveParallel = 1; + } + + /** + * Outputs fluid when recipe fails. + */ + private void onRecipeFail() { + // Possibly output lower quality water. + // Note that if there is no space for this, it will be voided regardless of fluid void setting! + FluidStack outputWater = getDegradedOutputWater(); + this.addOutput(outputWater); + } + + /** + * On recipe fail, water quality may degrade to the same or lower tier. This function returns the water to output + * in this case, or null if no water is produced at all. + */ + private FluidStack getDegradedOutputWater() { + ThreadLocalRandom random = ThreadLocalRandom.current(); + int roll = random.nextInt(0, 2); + // 50% chance to not output anything at all + if (roll == 0) return null; + + for (int waterTier = getWaterTier(); waterTier > 0; --waterTier) { + // 50% chance every time of degrading into the previous tier + roll = random.nextInt(0, 2); + if (roll == 1) { + // Rolled good, stop the loop and output water below current tier + int amount = mOutputFluids[0].amount; + // For tier 1, this is distilled water, so we cannot use the helper function! + if (waterTier == 1) { + return GTModHandler.getDistilledWater(amount); + } + Materials water = PurifiedWaterHelpers.getPurifiedWaterTier(waterTier - 1); + return water.getFluid(amount); + } + // Bad roll, keep looping and degrade quality even further + } + // Rolled bad on every iteration, no output for you + return null; + } + + /** + * Get the EU/t usage of this unit while it is running. + */ + public abstract long getBasePowerUsage(); + + public long getActualPowerUsage() { + return getBasePowerUsage() * effectiveParallel; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + // The individual purification unit structures cannot have maintenance issues, so fix them all. + this.mCrowbar = true; + this.mWrench = true; + this.mHardHammer = true; + this.mSoftHammer = true; + this.mSolderingTool = true; + this.mScrewdriver = true; + return true; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + // If a linked controller was found, load its coordinates. + // The unit will try to link to the real controller block periodically in onPostTick() + // We cannot do this linking here yet because the controller block might not be loaded yet. + // TODO: We could try though? + if (aNBT.hasKey("controller")) { + NBTTagCompound controllerNBT = aNBT.getCompoundTag("controller"); + controllerX = controllerNBT.getInteger("x"); + controllerY = controllerNBT.getInteger("y"); + controllerZ = controllerNBT.getInteger("z"); + controllerSet = true; + } + currentRecipeChance = aNBT.getFloat("currentRecipeChance"); + if (aNBT.hasKey("configuredParallel")) { + maxParallel = aNBT.getInteger("configuredParallel"); + } + if (aNBT.hasKey("effectiveParallel")) { + effectiveParallel = aNBT.getInteger("effectiveParallel"); + } + } + + public NBTTagCompound saveLinkDataToNBT() { + NBTTagCompound controllerNBT = new NBTTagCompound(); + controllerNBT.setInteger("x", controllerX); + controllerNBT.setInteger("y", controllerY); + controllerNBT.setInteger("z", controllerZ); + return controllerNBT; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + if (controllerSet) { + NBTTagCompound controllerNBT = saveLinkDataToNBT(); + aNBT.setTag("controller", controllerNBT); + } + aNBT.setFloat("currentRecipeChance", currentRecipeChance); + aNBT.setInteger("configuredParallel", maxParallel); + aNBT.setInteger("effectiveParallel", effectiveParallel); + } + + private LinkResult trySetControllerFromCoord(int x, int y, int z) { + IGregTechTileEntity ourBaseMetaTileEntity = this.getBaseMetaTileEntity(); + // First check whether the controller we try to link to is within range. The range is defined + // as a max distance in each axis. + if (Math.abs(ourBaseMetaTileEntity.getXCoord() - x) > MTEPurificationPlant.MAX_UNIT_DISTANCE) + return LinkResult.TOO_FAR; + if (Math.abs(ourBaseMetaTileEntity.getYCoord() - y) > MTEPurificationPlant.MAX_UNIT_DISTANCE) + return LinkResult.TOO_FAR; + if (Math.abs(ourBaseMetaTileEntity.getZCoord() - z) > MTEPurificationPlant.MAX_UNIT_DISTANCE) + return LinkResult.TOO_FAR; + + // Find the block at the requested coordinated and check if it is a purification plant controller. + var tileEntity = getBaseMetaTileEntity().getWorld() + .getTileEntity(x, y, z); + if (tileEntity == null) return LinkResult.NO_VALID_PLANT; + if (!(tileEntity instanceof IGregTechTileEntity gtTileEntity)) return LinkResult.NO_VALID_PLANT; + var metaTileEntity = gtTileEntity.getMetaTileEntity(); + if (!(metaTileEntity instanceof MTEPurificationPlant)) return LinkResult.NO_VALID_PLANT; + + // Before linking, unlink from current controller, so we don't end up with units linked to multiple + // controllers. + MTEPurificationPlant oldController = getController(); + if (oldController != null) { + oldController.unregisterLinkedUnit(this); + this.unlinkController(); + } + + // Now link to new controller + controllerX = x; + controllerY = y; + controllerZ = z; + controllerSet = true; + controller = (MTEPurificationPlant) metaTileEntity; + controller.registerLinkedUnit(this); + return LinkResult.SUCCESS; + } + + private boolean tryLinkDataStick(EntityPlayer aPlayer) { + // Make sure the held item is a data stick + ItemStack dataStick = aPlayer.inventory.getCurrentItem(); + if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) { + return false; + } + + // Make sure this data stick is a proper purification plant link data stick. + if (!dataStick.hasTagCompound() || !dataStick.stackTagCompound.getString("type") + .equals("PurificationPlant")) { + return false; + } + + // Now read link coordinates from the data stick. + NBTTagCompound nbt = dataStick.stackTagCompound; + int x = nbt.getInteger("x"); + int y = nbt.getInteger("y"); + int z = nbt.getInteger("z"); + + // Try to link, and report the result back to the player. + LinkResult result = trySetControllerFromCoord(x, y, z); + if (result == LinkResult.SUCCESS) { + aPlayer.addChatMessage(new ChatComponentText("Link successful")); + } else if (result == LinkResult.TOO_FAR) { + aPlayer.addChatMessage(new ChatComponentText("Link failed: Out of range.")); + } else if (result == LinkResult.NO_VALID_PLANT) { + aPlayer.addChatMessage(new ChatComponentText("Link failed: No Purification Plant found at link location")); + } + + return true; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (!(aPlayer instanceof EntityPlayerMP)) { + return false; + } + + // Right-clicking could be a data stick linking action, so try this first. + if (tryLinkDataStick(aPlayer)) { + return true; + } + + return super.onRightclick(aBaseMetaTileEntity, aPlayer); + } + + public MTEPurificationPlant getController() { + if (controller == null) return null; + // Controller disappeared + if (controller.getBaseMetaTileEntity() == null) return null; + return controller; + } + + // If the controller is broken this can be called to explicitly unlink the controller, so we don't have any + // references lingering around + public void unlinkController() { + this.controllerSet = false; + this.controller = null; + this.controllerX = 0; + this.controllerY = 0; + this.controllerZ = 0; + } + + @Override + public void onBlockDestroyed() { + // When this block is destroyed, explicitly unlink it from the controller if there is any. + MTEPurificationPlant controller = getController(); + if (controller != null) { + controller.unregisterLinkedUnit(this); + } + super.onBlockDestroyed(); + } + + @Override + public String[] getInfoData() { + var ret = new ArrayList(); + // If this purification unit is linked to a controller, add this info to the scanner output. + if (getController() != null) { + ret.add( + "This Purification Unit is linked to the Water Purification Plant at " + controllerX + + ", " + + controllerY + + ", " + + controllerZ + + "."); + + // If recipe is running, display success chance + if (this.mMaxProgresstime != 0) { + ret.add( + "Success chance: " + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(this.calculateFinalSuccessChance()) + + "%" + + EnumChatFormatting.RESET); + } + + } else ret.add("This Purification Unit is not linked to any Water Purification Plant."); + ret.add("Current parallel: " + EnumChatFormatting.YELLOW + this.effectiveParallel); + return ret.toArray(new String[0]); + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + NBTTagCompound tag = accessor.getNBTData(); + + // Display linked controller in Waila. + if (tag.getBoolean("linked")) { + currenttip.add( + EnumChatFormatting.AQUA + "Linked to Purification Plant at " + + EnumChatFormatting.WHITE + + tag.getInteger("controllerX") + + ", " + + tag.getInteger("controllerY") + + ", " + + tag.getInteger("controllerZ") + + EnumChatFormatting.RESET); + } else { + currenttip.add(EnumChatFormatting.AQUA + "Unlinked"); + } + + super.getWailaBody(itemStack, currenttip, accessor, config); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + + tag.setBoolean("linked", getController() != null); + if (getController() != null) { + tag.setInteger("controllerX", controllerX); + tag.setInteger("controllerY", controllerY); + tag.setInteger("controllerZ", controllerZ); + } + + super.getWailaNBTData(player, tile, tag, world, x, y, z); + } + + public PurificationUnitStatus status() { + if (!this.mMachine) { + return PurificationUnitStatus.INCOMPLETE_STRUCTURE; + } else if (!this.isAllowedToWork()) { + return PurificationUnitStatus.DISABLED; + } else { + return PurificationUnitStatus.ONLINE; + } + } + + /** + * Creates all widgets needed to sync this unit's status with the client + */ + public Widget makeSyncerWidgets() { + return new MultiChildWidget() + .addChild(new FakeSyncWidget.BooleanSyncer(() -> this.mMachine, machine -> this.mMachine = machine)) + .addChild(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, _work -> {})); + } + + private static final int PARALLEL_WINDOW_ID = 10; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + buildContext.addSyncedWindow(PARALLEL_WINDOW_ID, this::createParallelWindow); + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(PARALLEL_WINDOW_ID); + } + }) + .setPlayClickSound(true) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(GTUITextures.BUTTON_STANDARD); + ret.add(GTUITextures.OVERLAY_BUTTON_BATCH_MODE_ON); + return ret.toArray(new IDrawable[0]); + }) + .addTooltip(translateToLocal("GT5U.tpm.parallelwindow")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 112) + .setSize(16, 16)); + super.addUIWidgets(builder, buildContext); + } + + protected ModularWindow createParallelWindow(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(GTUITextures.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("GTPP.CC.parallel") + .setPos(3, 4) + .setSize(150, 20)) + .widget( + new NumericWidget().setSetter(val -> maxParallel = (int) val) + .setGetter(() -> maxParallel) + .setBounds(1, Integer.MAX_VALUE) + .setDefaultValue(1) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(150, 18) + .setPos(4, 25) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> maxParallel, (val) -> maxParallel = val), + builder)); + return builder.build(); + } + + @Override + public boolean supportsVoidProtection() { + return false; + } + + @Override + public Set getAllowedVoidingModes() { + return EnumSet.of(VoidingMode.VOID_NONE); + } + + @Override + protected boolean supportsCraftingMEBuffer() { + return false; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitClarifier.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitClarifier.java new file mode 100644 index 0000000000..4cd654af28 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitClarifier.java @@ -0,0 +1,332 @@ +package gregtech.common.tileentities.machines.multi.purification; + +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 gregtech.api.enums.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_GLOW; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +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 com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.TierEU; +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.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEPurificationUnitClarifier extends MTEPurificationUnitBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; + + private static final int STRUCTURE_X_OFFSET = 5; + private static final int STRUCTURE_Y_OFFSET = 2; + private static final int STRUCTURE_Z_OFFSET = 1; + + // Chance that the filter is damaged every cycle. + public static final float FILTER_DAMAGE_RATE = 20.0f; + + private static final int CASING_TEXTURE_INDEX = getTextureIndex(GregTechAPI.sBlockCasings9, 5); + + private static final String[][] structure = + // spotless:off + new String[][] { + { " ", " ", " ", " " }, + { " ", " AAAAA ", " AH~HA ", " AAAAA " }, + { " ", " A A ", " AWWWWWA ", " AAAAAAA " }, + { " ", " A A ", " AWWWWWWWA ", " AAAAAAAAA " }, + { " ", "A A", "AWWWCCCWWWA", "AAAAFFFAAAA" }, + { " DDD ", "A A", "HWWCWWWCWWH", "AAAFFFFFAAA" }, + { "DDDDDBD ", "A B A", "AWWCWBWCWWA", "AAAFFFFFAAA" }, + { " DDD ", "A A", "HWWCWWWCWWH", "AAAFFFFFAAA" }, + { " ", "A A", "AWWWCCCWWWA", "AAAAFFFAAAA" }, + { " ", " A A ", " AWWWWWWWA ", " AAAAAAAAA " }, + { " ", " A A ", " AWWWWWA ", " AAAAAAA " }, + { " ", " AAAAA ", " AHAHA ", " AAAAA " } }; + // spotless:on + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + .addShape( + STRUCTURE_PIECE_MAIN_SURVIVAL, + Arrays.stream(structure) + .map( + sa -> Arrays.stream(sa) + .map(s -> s.replaceAll("W", " ")) + .toArray(String[]::new)) + .toArray(String[][]::new)) + // Hatches + .addElement( + 'H', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(t.getAllowedHatches()) + .casingIndex(CASING_TEXTURE_INDEX) + .dot(1) + .build()), + // Reinforced Sterile Water Plant Casing + ofBlock(GregTechAPI.sBlockCasings9, 5))) + // Reinforced Sterile Water Plant Casing + .addElement('A', ofBlock(GregTechAPI.sBlockCasings9, 5)) + // PTFE pipe casing + .addElement('B', ofBlock(GregTechAPI.sBlockCasings8, 1)) + .addElement('C', ofFrame(Materials.Iridium)) + .addElement('D', ofFrame(Materials.DamascusSteel)) + .addElement('W', ofChain(ofBlock(Blocks.water, 0))) + // Filter machine casing + .addElement('F', ofBlock(GregTechAPI.sBlockCasings3, 11)) + .build(); + + public MTEPurificationUnitClarifier(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPurificationUnitClarifier(String aName) { + super(aName); + } + + @Override + public int getWaterTier() { + return 1; + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_LuV; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.purificationClarifierRecipes; + } + + @NotNull + @Override + public CheckRecipeResult overrideRecipeCheck() { + // Clarifier needs to check item inputs from recipe as well to find filter item + return findRecipeForInputs( + this.storedFluids.toArray(new FluidStack[] {}), + this.getStoredInputs() + .toArray(new ItemStack[] {})); + } + + @Override + public void depleteRecipeInputs() { + super.depleteRecipeInputs(); + + // Now do random roll to determine if the filter should be destroyed + ThreadLocalRandom random = ThreadLocalRandom.current(); + int roll = random.nextInt(1, 101); + if (roll < FILTER_DAMAGE_RATE) { + this.depleteInput(this.currentRecipe.mInputs[0]); + } + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + // Rotated sifter not allowed, water will flow out. + return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped(); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the Clarifier Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo("Requires a filter made of Activated Carbon to work.") + .addInfo( + "Every cycle, has a " + EnumChatFormatting.RED + + GTUtility.formatNumbers(FILTER_DAMAGE_RATE) + + "%" + + EnumChatFormatting.GRAY + + " chance to destroy the filter.") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "The first step to acquiring purified water is to filter out macroscopic contaminants through the") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "use of large physical filters. As more contaminants are captured, the efficacy of the filter") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "decreases so continual replacements must be supplied to maintain full function of the Clarifier.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(11, 4, 11, false) + .addSeparator() + .addCasingInfoRangeColored( + "Reinforced Sterile Water Plant Casing", + EnumChatFormatting.GRAY, + 123, + 131, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Filter Machine Casing", + EnumChatFormatting.GRAY, + 21, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Iridium Frame Box", + EnumChatFormatting.GRAY, + 21, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Damascus Steel Frame Box", + EnumChatFormatting.GRAY, + 12, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored("PTFE Pipe Casing", EnumChatFormatting.GRAY, 3, EnumChatFormatting.GOLD, false) + .addController("Front center") + .addInputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addOutputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addInputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addOutputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addStructureInfo("Requires water to be placed in the structure.") + .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + hintsOnly, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + int built = survivialBuildPiece( + STRUCTURE_PIECE_MAIN_SURVIVAL, + stackSize, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET, + elementBudget, + env, + true); + if (built == -1) { + GTUtility.sendChatToPlayer( + env.getActor(), + EnumChatFormatting.GREEN + "Auto placing done ! Now go place the water yourself !"); + return 0; + } + return built; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitClarifier(this.mName); + } + + private List> getAllowedHatches() { + return ImmutableList.of(InputBus, InputHatch, OutputBus, OutputHatch); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection == facingDirection) { + if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_TEXTURE_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_TEXTURE_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_TEXTURE_INDEX) }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.GT_MACHINES_PURIFICATIONPLANT_LOOP.resourceLocation; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitDegasser.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitDegasser.java new file mode 100644 index 0000000000..b139a0f6d4 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitDegasser.java @@ -0,0 +1,830 @@ +package gregtech.common.tileentities.machines.multi.purification; + +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.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Supplier; + +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.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import bartworks.system.material.WerkstoffLoader; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Textures; +import gregtech.api.enums.TierEU; +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.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchMultiInput; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.IGTHatchAdder; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEPurificationUnitDegasser extends MTEPurificationUnitBase + implements ISurvivalConstructable { + + private static final int CASING_INDEX_MAIN = getTextureIndex(GregTechAPI.sBlockCasings9, 11); + + private static final String STRUCTURE_PIECE_MAIN = "main"; + + // spotless:off + private static final String[][] structure = new String[][] { + { " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAA " }, + { " AAAAAAAAA ", " AAAAA ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " CCAA~AA ", " AAAAAAAAA " }, + { " AAAAAAAAAAAAA ", " CAAAAAAAAA ", " BBBBB CC ", " BBBBB ", " BBBBB ", " BBB ", " B ", " ", " C ", " ", " C ", " ", " ", " ", " ", " ", " C ", " ", " B C ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " AAAAAAAAA ", " AAAAAAAAAAAAA " }, + { " AAAAAAAAAAAAA ", " AAAAAAAAAAAC ", " C BBB BB ", " BB BB ", " B B ", " BB BB ", " BBB BBB ", " BBBBB ", " BBB ", " C C ", " ", " ", " ", " ", " ", " ", " BBB ", " C BBBBB C ", " BBB BBB ", " BB BB ", " B B ", " BB BB ", " BB BB ", " AAAAAAAAAAA ", " AAAAAAAAAAAAA " }, + { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " CB B ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " BB BB C ", " BBBBB ", " C BBB ", " ", " ", " ", " BBB ", " BBBBB ", " BB BB C ", " BB BB ", " C B B ", " B B ", " B B ", " B B ", " B B ", " AAAAAAAAAAAAAC ", " AAAAAAAAAAAAAAA " }, + { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " C BBB ", " ", " BBB ", " B B ", " B B C ", " B B ", " B B ", " B B ", " C B B ", " B B ", " B B ", " B B ", " AAAAAAAAAAAAAC ", " AAAAAAAAAAAAAAA " }, + { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " CB B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " B B ", " BBBBB ", " C BBB ", " BBBBB ", " B B C ", " B B ", " B B ", " B B ", " B B ", " B B ", " CB B ", " B B ", " B BC ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " CB B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " C BBBBB ", " BB BB ", " B B C ", " B B ", " B B ", " B B ", " B B ", " B B ", " CB B ", " B B ", " B BC ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " B B ", " CB BC ", " B B ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " BBBBB ", " C BB BB C ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " CB BC ", " B B ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " B BC ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " BBBBB C ", " BB BB ", " C B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B BC ", " B B ", " CB B ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAAAA", " AAAAAAAAAAAAAAA ", " B B ", " B B ", " B BC ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B ", " BBBBB ", " BBB C ", " BBBBB ", " C B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B BC ", " B B ", " CB B ", " AAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAA" }, + { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " B B ", " B B C ", " B B ", " B B ", " B B ", " C B B ", " B B ", " B B ", " B B ", " BBB C ", " ", " BBB ", " B B ", " C B B ", " B B ", " B B ", " B B ", " B B C ", " B B ", " B B ", " B B ", " CAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAA " }, + { " AAAAAAAAAAAAAAA ", " AAAAAAAAAAAAA ", " B BC ", " B B ", " B B ", " B B ", " B B ", " BB BB ", " C BB BB ", " BBBBB ", " BBB C ", " ", " ", " ", " BBB ", " BBBBB ", " C BB BB ", " BB BB ", " B B C ", " B B ", " B B ", " B B ", " B B ", " CAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAA " }, + { " AAAAAAAAAAAAA ", " CAAAAAAAAAAA ", " BB BB C ", " BB BB ", " B B ", " BB BB ", " BBB BBB ", " BBBBB ", " BBB ", " C C ", " ", " ", " ", " ", " ", " ", " BBB ", " C BBBBB C ", " BBB BBB ", " BB BB ", " B B ", " BB BB ", " BB BB ", " AAAAAAAAAAA ", " AAAAAAAAAAAAA " }, + { " AAAAAAAAAAAAA ", " AAAAAAAAAC ", " CC BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " B ", " ", " C ", " ", " C ", " ", " ", " ", " ", " ", " C ", " ", " C B ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " AAAAAAAAA ", " AAAAAAAAAAAAA " }, + { " AAAAAAAAA ", " AAAAA ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " C ", " ", " ", " ", " C ", " CC ", " C ", " CC ", " AAAAACC ", " AAAAAAAAA " }, + { " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAA " } }; + // spotless:on + + private int casingCount = 0; + private static final int MIN_CASING = 780; + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + .addElement( + 'A', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(Arrays.asList(InputHatch, OutputHatch, SpecialHatchElement.ControlHatch)) + .casingIndex(CASING_INDEX_MAIN) + .dot(1) + .cacheHint(() -> "Input Hatch, Output Hatch, Control Hatch") + .build()), + onElementPass(t -> t.casingCount++, ofBlock(GregTechAPI.sBlockCasings9, 11)))) + // Omni-purpose infinity fused glass + .addElement('B', ofBlock(GregTechAPI.sBlockGlass1, 2)) + .addElement('C', ofFrame(Materials.Bedrockium)) + .build(); + + private static final int STRUCTURE_X_OFFSET = 8; + private static final int STRUCTURE_Y_OFFSET = 23; + private static final int STRUCTURE_Z_OFFSET = 1; + + // Supplier because werkstoff loads later than multiblock controllers... fml + private static final Supplier INERT_GASES = () -> new FluidStack[] { Materials.Helium.getGas(10000L), + WerkstoffLoader.Neon.getFluidOrGas(7500), WerkstoffLoader.Krypton.getFluidOrGas(5000), + WerkstoffLoader.Xenon.getFluidOrGas(2500) }; + + private static final class SuperconductorMaterial { + + public FluidStack fluid; + public float multiplier; + + SuperconductorMaterial(FluidStack fluid, float multiplier) { + this.fluid = fluid; + this.multiplier = multiplier; + } + } + + private static final long SUPERCON_FLUID_AMOUNT = 1440L; + + private static final Supplier SUPERCONDUCTOR_MATERIALS = () -> new SuperconductorMaterial[] { + new SuperconductorMaterial(Materials.Longasssuperconductornameforuvwire.getMolten(SUPERCON_FLUID_AMOUNT), 1.0f), + new SuperconductorMaterial( + Materials.Longasssuperconductornameforuhvwire.getMolten(SUPERCON_FLUID_AMOUNT), + 1.25f), + new SuperconductorMaterial(Materials.SuperconductorUEVBase.getMolten(SUPERCON_FLUID_AMOUNT), 1.5f), + new SuperconductorMaterial(Materials.SuperconductorUIVBase.getMolten(SUPERCON_FLUID_AMOUNT), 1.75f), + new SuperconductorMaterial(Materials.SuperconductorUMVBase.getMolten(SUPERCON_FLUID_AMOUNT), 2.0f), }; + + private static final FluidStack CATALYST_FLUID = Materials.Neutronium.getMolten(4608L); + private static final FluidStack COOLANT_FLUID = Materials.SuperCoolant.getFluid(10000L); + + private static final long CONSUME_INTERVAL = 20; + + private static class ControlSignal { + + private byte signal; + + public ControlSignal(byte sig) { + signal = sig; + } + + public void randomize() { + ThreadLocalRandom random = ThreadLocalRandom.current(); + // We want to give the final bit a lower chance at being on, since this bypasses most of the automation. + // If this bit has a 50% chance of being on, you could opt to not automate the degasser at all and never + // insert anything. This way you still get 50% output which might just be good enough. + + // To do this weighting, we simply only generate the lower 3 bits, and then with a smaller chance we add + // 8 to the result + signal = (byte) random.nextInt(0, 8); + if (random.nextInt(0, 5) == 0) { + signal += 8; + } + } + + public boolean getBit(int bit) { + if (bit < 0 || bit > 3) { + throw new IllegalArgumentException("Invalid bit index for degasser control signal"); + } + + // Shift signal so the requested bit is in the lowermost bit + // Then only keep the lowermost bit + // Then test if this bit is on. + return ((signal >> bit) & 1) == 1; + } + + public byte getSignal() { + return signal; + } + + // Get integer value representing control bits 1 and 2 + public int getControlBit12() { + return (signal >> 1) & 0b11; + } + + public boolean isZero() { + return signal == (byte) 0; + } + + @Override + public String toString() { + return Integer.toBinaryString(((int) signal) & 0b1111); + } + } + + private static class ControlBitStatus { + + public FluidStack stack; + public boolean satisfied; + + public ControlBitStatus(FluidStack stack, boolean satisfied) { + this.stack = stack; + this.satisfied = satisfied; + } + } + + private ControlSignal controlSignal = new ControlSignal((byte) 0); + + private final HashMap insertedStuffThisCycle = new HashMap<>(); + + private float outputMultiplier = 1.0f; + + private MTEHatchDegasifierControl controlHatch = null; + + public MTEPurificationUnitDegasser(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + protected MTEPurificationUnitDegasser(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitDegasser(mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean active, boolean redstoneLevel) { + if (side == facing) { + if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN) }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + hintsOnly, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + return survivialBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET, + elementBudget, + env, + true); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the Residual Decontaminant Degasser Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo( + "At the start of the operation, the " + EnumChatFormatting.WHITE + + "Degasser Control Hatch" + + EnumChatFormatting.GRAY + + " will output a redstone signal.") + .addInfo("To succeed the recipe, you will need to successfully decode the instructions in the signal.") + .addInfo("To decode the signal, interpret the signal strength as a 4-bit number from 0-15.") + .addInfo("Denote the lowest bit as bit 1, and the highest as bit 4.") + .addSeparator() + .addInfo( + EnumChatFormatting.WHITE + "" + + EnumChatFormatting.BOLD + + "Bit 1: " + + EnumChatFormatting.BLUE + + "" + + EnumChatFormatting.BOLD + + "Ozone Sparging by Inert Gas") + .addInfo( + "If this bit is on, you must insert an " + EnumChatFormatting.WHITE + + "inert gas" + + EnumChatFormatting.GRAY + + " into the machine.") + .addInfo( + "To determine which gas to insert, interpret bits " + EnumChatFormatting.WHITE + + "2-3" + + EnumChatFormatting.GRAY + + " as a 2-bit number.") + .addInfo( + EnumChatFormatting.GRAY + "0: " + + EnumChatFormatting.RED + + "10000L " + + EnumChatFormatting.WHITE + + "Helium" + + EnumChatFormatting.GRAY + + " / " + + "1: " + + EnumChatFormatting.RED + + "7500L " + + EnumChatFormatting.WHITE + + "Neon" + + EnumChatFormatting.GRAY + + " / " + + "2: " + + EnumChatFormatting.RED + + "5000L " + + EnumChatFormatting.WHITE + + "Krypton" + + EnumChatFormatting.GRAY + + " / " + + "3: " + + EnumChatFormatting.RED + + "2500L " + + EnumChatFormatting.WHITE + + "Xenon") + .addSeparator() + .addInfo( + EnumChatFormatting.WHITE + "" + + EnumChatFormatting.BOLD + + "Bit 2: " + + EnumChatFormatting.BLUE + + "" + + EnumChatFormatting.BOLD + + "Superconductive Deionization") + .addInfo( + "If this bit is on, you must insert " + EnumChatFormatting.RED + + "1440L " + + EnumChatFormatting.WHITE + + "Molten Superconductor Base.") + .addInfo("Using higher tier superconductor provides bonus output.") + .addInfo( + "Output multiplier: " + EnumChatFormatting.DARK_GREEN + + "UV" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.WHITE + + "1x" + + EnumChatFormatting.GRAY + + " / " + + EnumChatFormatting.DARK_RED + + "UHV" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.WHITE + + "1.25x" + + EnumChatFormatting.GRAY + + " / " + + EnumChatFormatting.DARK_PURPLE + + "UEV" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.WHITE + + "1.5x" + + EnumChatFormatting.GRAY + + " / " + + EnumChatFormatting.DARK_BLUE + + "" + + EnumChatFormatting.BOLD + + "UIV" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.WHITE + + "1.75x" + + EnumChatFormatting.GRAY + + " / " + + EnumChatFormatting.RED + + "" + + EnumChatFormatting.BOLD + + "UMV" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.WHITE + + "2x") + .addSeparator() + .addInfo( + EnumChatFormatting.WHITE + "" + + EnumChatFormatting.BOLD + + "Bit 3: " + + EnumChatFormatting.BLUE + + "" + + EnumChatFormatting.BOLD + + "Gravitationally-Generated Differential Vacuum Extraction") + .addInfo( + "If this bit is on, you must insert " + EnumChatFormatting.RED + + "4608L " + + EnumChatFormatting.WHITE + + "Molten Neutronium") + .addSeparator() + .addInfo( + EnumChatFormatting.WHITE + "" + + EnumChatFormatting.BOLD + + "Bit 4: " + + EnumChatFormatting.BLUE + + "" + + EnumChatFormatting.BOLD + + "Seldonian Settlement Process") + .addInfo( + "If this bit is on," + EnumChatFormatting.RED + + " DISREGARD " + + EnumChatFormatting.GRAY + + "all other bits and do not insert anything.") + .addSeparator() + .addInfo( + EnumChatFormatting.WHITE + "" + + EnumChatFormatting.BOLD + + "No bits: " + + EnumChatFormatting.BLUE + + "" + + EnumChatFormatting.BOLD + + "Machine Overload") + .addInfo("In rare cases, the machine may overload and output no control signal at all.") + .addInfo( + "To prevent machine damage, insert " + EnumChatFormatting.RED + + "10000L " + + EnumChatFormatting.WHITE + + "Super Coolant.") + .addSeparator() + .addInfo("The recipe can only succeed if the entire signal is decoded correctly.") + .addInfo("Inserting any fluid not requested by the signal will always void the recipe.") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "The penultimate stage of water purification, step seven, is an irregular series of complex") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "processes designed to remove any residual materials left by the decontaminants from the previous") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "steps such as any energetic ions, acids, clarifiers, or gasses. Depending on what the Degasser") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "detects in the water, it will request various materials to complete the processes listed above.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(17, 25, 17, false) + .addCasingInfoRangeColored( + "Heat-Resistant Trinium Plated Casing", + EnumChatFormatting.GRAY, + MIN_CASING, + 803, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Omni-Purpose Infinity Fused Glass", + EnumChatFormatting.GRAY, + 622, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Bedrockium Frame Box", + EnumChatFormatting.GRAY, + 126, + EnumChatFormatting.GOLD, + false) + .addController("Front center") + .addOutputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+, Any Trinium Casing", 1) + .addInputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+, Any Trinium Casing", 1) + .addOtherStructurePart( + "Degasser Control Hatch", + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + ", Any Trinium Casing", + 1) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.purificationDegasifierRecipes; + } + + // Whether this fluid stack is accepted as a fluid in the inputs that the unit requires at runtime. + public static boolean isValidFluid(FluidStack stack) { + return stack.isFluidEqual(CATALYST_FLUID) || stack.isFluidEqual(COOLANT_FLUID) + || Arrays.stream(INERT_GASES.get()) + .anyMatch(stack::isFluidEqual) + || Arrays.stream(SUPERCONDUCTOR_MATERIALS.get()) + .anyMatch(mat -> stack.isFluidEqual(mat.fluid)); + } + + // Check if an exact match for this FluidStack was found in the map of inserted fluids + private boolean wasFluidInsertedExact(FluidStack toFind) { + FluidStack candidate = insertedStuffThisCycle.get(toFind.getFluid()); + // Fluid was inserted if found and the amount matches + return candidate != null && candidate.amount == toFind.amount; + } + + private ControlBitStatus isBit0Satisfied() { + // Check if instructions matching the first bit are satisfied. + // Instructions: + // If bit 0 is on, insert an inert gas. Bits 1-2 of the control signal determine which inert + // gas to insert. + + if (controlSignal.getBit(0)) { + // Grab the gas to insert from the control bits + int gasToInsert = controlSignal.getControlBit12(); + FluidStack gasStack = INERT_GASES.get()[gasToInsert]; + // Check if it was inserted + if (wasFluidInsertedExact(gasStack)) return new ControlBitStatus(gasStack, true); + else return new ControlBitStatus(null, false); + } + + // Bit 0 is not on, so this is always satisfied + return new ControlBitStatus(null, true); + } + + private ControlBitStatus isBit1Satisfied() { + // Check if instructions matching the second bit (bit 1) are satisfied. + // Instructions: + // If bit 1 is on, insert molten superconductor. + // Higher tier superconductor gives a better bonus. + // Only one type of superconductor may be inserted or the operation fails, + // so we don't care about the order in which we find it. + if (controlSignal.getBit(1)) { + // Find the first superconductor material in the list that was inserted with an exact match + Optional material = Arrays.stream(SUPERCONDUCTOR_MATERIALS.get()) + .filter(candidate -> wasFluidInsertedExact(candidate.fluid)) + .findFirst(); + if (material.isPresent()) { + // Get the material and set the output multiplier, then + // report success with the matching fluid. + SuperconductorMaterial scMaterial = material.get(); + this.outputMultiplier = scMaterial.multiplier; + return new ControlBitStatus(scMaterial.fluid, true); + } + // No superconductor was inserted but bit is on fail. + return new ControlBitStatus(null, false); + } + + return new ControlBitStatus(null, true); + } + + private ControlBitStatus isBit2Satisfied() { + // Check if instructions matching the third bit (bit 2) are satisfied. + // Instructions: + // If bit 2 is on, insert molten neutronium. + if (controlSignal.getBit(2)) { + // If steel was inserted, return it and report success. + if (wasFluidInsertedExact(CATALYST_FLUID)) return new ControlBitStatus(CATALYST_FLUID, true); + // Otherwise report failure. + return new ControlBitStatus(null, false); + } + + return new ControlBitStatus(null, true); + } + + private ControlBitStatus isBit3Satisfied() { + // Check if instructions matching the fourth bit (bit 3) are satisfied. + // Instructions: + // If bit 3 is on, do not insert anything. + if (controlSignal.getBit(3)) { + // Simply check if the map of inserted fluids is empty + if (insertedStuffThisCycle.isEmpty()) return new ControlBitStatus(null, true); + return new ControlBitStatus(null, false); + } + return new ControlBitStatus(null, true); + } + + private boolean areAllBitsSatisfied() { + // Check if each individual bit is satisfied. + // Additional instructions: If no bits are on, insert super coolant + + if (controlSignal.isZero()) { + return wasFluidInsertedExact(COOLANT_FLUID); + } + + ControlBitStatus bit0 = isBit0Satisfied(); + ControlBitStatus bit1 = isBit1Satisfied(); + ControlBitStatus bit2 = isBit2Satisfied(); + ControlBitStatus bit3 = isBit3Satisfied(); + + // If bit 3 is satisfied and on, all other bits are automatically satisfied, + // with no fluids being allowed to be inserted. + if (controlSignal.getBit(3) && bit3.satisfied) { + bit0 = bit1 = bit2 = new ControlBitStatus(null, true); + } + + if (bit0.satisfied && bit1.satisfied && bit2.satisfied && bit3.satisfied) { + // Check if the map contains any other stacks than the ones in the control bit statuses + for (FluidStack inserted : insertedStuffThisCycle.values()) { + // If the inserted stack is null, or any of the fluids required, this stack is fine. + if (inserted == null) continue; + if (bit0.stack != null && inserted.isFluidEqual(bit0.stack)) continue; + if (bit1.stack != null && inserted.isFluidEqual(bit1.stack)) continue; + if (bit2.stack != null && inserted.isFluidEqual(bit2.stack)) continue; + if (bit3.stack != null && inserted.isFluidEqual(bit3.stack)) continue; + // Otherwise it's a nonrequested stack and the recipe should fail. + return false; + } + return true; + } + + return false; + } + + @Override + public void startCycle(int cycleTime, int progressTime) { + super.startCycle(cycleTime, progressTime); + this.controlSignal.randomize(); + this.insertedStuffThisCycle.clear(); + this.outputMultiplier = 1.0f; + // Make sure to output the hatch control signal. + this.controlHatch.updateOutputSignal(this.controlSignal.getSignal()); + } + + private static ArrayList getDrainableFluidsFromHatch(MTEHatchInput hatch) { + // Need special handling for quad input hatches, otherwise it only returns the first fluid in the hatch + if (hatch instanceof MTEHatchMultiInput) { + return new ArrayList<>(Arrays.asList(((MTEHatchMultiInput) hatch).getStoredFluid())); + } + return new ArrayList<>(Collections.singletonList(hatch.getFluid())); + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.runMachine(aBaseMetaTileEntity, aTick); + + // If machine is running, continuously consume all valid inputs + if (mMaxProgresstime > 0 && aTick % CONSUME_INTERVAL == 0) { + // For each hatch, check if each fluid inside is one of the valid fluids. If so, consume it all. + for (MTEHatchInput hatch : mInputHatches) { + ArrayList drainableFluids = getDrainableFluidsFromHatch(hatch); + for (FluidStack fluid : drainableFluids) { + if (fluid != null && isValidFluid(fluid)) { + // Apparently this parameter is mostly ignored, but might as well get it right. + ForgeDirection front = hatch.getBaseMetaTileEntity() + .getFrontFacing(); + // Drain the fluid and save it + FluidStack drainedFluid = hatch.drain(front, fluid, true); + // If the fluid does not yet exist in the map, insert it. + // Otherwise, merge the amounts + insertedStuffThisCycle.merge( + fluid.getFluid(), + drainedFluid, + (a, b) -> new FluidStack(a.getFluid(), a.amount + b.amount)); + } + } + } + } + } + + @Override + public void addRecipeOutputs() { + super.addRecipeOutputs(); + if (outputMultiplier > 1.01f) { + FluidStack waterOutput = currentRecipe.mFluidOutputs[0]; + FluidStack bonusOutput = new FluidStack( + waterOutput.getFluid(), + (int) (waterOutput.amount * (outputMultiplier - 1.0f))); + this.addOutput(bonusOutput); + } + } + + @Override + public float calculateFinalSuccessChance() { + // Success chance is 100% when all bits are satisfied, 0% otherwise. + if (areAllBitsSatisfied()) { + return 100.0f; + } else { + return 0.0f; + } + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getWaterTier() { + return 7; + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_UHV; + } + + public boolean addControlHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity instanceof MTEHatchDegasifierControl) { + // Only allow a single control hatch, so fail structure check if there is already one + if (this.controlHatch == null) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + this.controlHatch = (MTEHatchDegasifierControl) aMetaTileEntity; + return true; + } + } + return false; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + this.casingCount = 0; + this.controlHatch = null; + if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; + if (casingCount < MIN_CASING) return false; + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + controlSignal = new ControlSignal(aNBT.getByte("controlSignal")); + outputMultiplier = aNBT.getFloat("outputMultiplier"); + NBTTagCompound fluidMap = aNBT.getCompoundTag("insertedFluidMap"); + for (String key : fluidMap.func_150296_c()) { + FluidStack fluid = FluidStack.loadFluidStackFromNBT(fluidMap.getCompoundTag(key)); + // Ignore if fluid failed to load, for example if the fluid ID was changed between versions + if (fluid == null) { + continue; + } + insertedStuffThisCycle.put(fluid.getFluid(), fluid); + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByte("controlSignal", controlSignal.getSignal()); + aNBT.setFloat("outputMultiplier", outputMultiplier); + NBTTagCompound fluidMap = new NBTTagCompound(); + for (FluidStack stack : insertedStuffThisCycle.values()) { + NBTTagCompound compound = new NBTTagCompound(); + stack.writeToNBT(compound); + fluidMap.setTag( + stack.getFluid() + .getName(), + compound); + } + aNBT.setTag("insertedFluidMap", fluidMap); + } + + private static String generateInfoStringForBit(int i, ControlBitStatus status) { + String base = "Bit " + (i + 1) + " status: "; + if (status.satisfied) { + return base + EnumChatFormatting.GREEN + "OK"; + } else { + return base + EnumChatFormatting.RED + "NOT OK"; + } + } + + @Override + public String[] getInfoData() { + ArrayList info = new ArrayList<>(Arrays.asList(super.getInfoData())); + info.add("Current control signal: " + EnumChatFormatting.YELLOW + controlSignal.toString()); + info.add("Current output multiplier: " + EnumChatFormatting.YELLOW + outputMultiplier); + for (FluidStack stack : insertedStuffThisCycle.values()) { + info.add( + "Fluid inserted this cycle: " + EnumChatFormatting.YELLOW + + stack.amount + + "L " + + stack.getLocalizedName()); + } + info.add(generateInfoStringForBit(0, isBit0Satisfied())); + info.add(generateInfoStringForBit(1, isBit1Satisfied())); + info.add(generateInfoStringForBit(2, isBit2Satisfied())); + info.add(generateInfoStringForBit(3, isBit3Satisfied())); + return info.toArray(new String[] {}); + } + + private enum SpecialHatchElement implements IHatchElement { + + ControlHatch(MTEPurificationUnitDegasser::addControlHatchToMachineList, MTEHatchDegasifierControl.class) { + + @Override + public long count(MTEPurificationUnitDegasser mte) { + return mte.controlHatch == null ? 0 : 1; + } + }; + + private final List> mteClasses; + private final IGTHatchAdder adder; + + @SafeVarargs + SpecialHatchElement(IGTHatchAdder adder, + Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + public IGTHatchAdder adder() { + return adder; + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitFlocculation.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitFlocculation.java new file mode 100644 index 0000000000..36856fa11c --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitFlocculation.java @@ -0,0 +1,488 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static gregtech.api.enums.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.minecraft.init.Blocks; +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 com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.TierEU; +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.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; + +public class MTEPurificationUnitFlocculation extends MTEPurificationUnitBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; + + private static final int STRUCTURE_X_OFFSET = 4; + private static final int STRUCTURE_Y_OFFSET = 3; + private static final int STRUCTURE_Z_OFFSET = 0; + + /** + * Amount of input fluid needed to boost the success chance by another level + */ + public static final long INPUT_CHEMICAL_PER_LEVEL = 100000; + /** + * Amount of waste water produced for each success chance level. This matches the amount of input fluid + * so it can be perfectly recycled into each other. + */ + private static final long WASTE_WATER_PER_LEVEL = INPUT_CHEMICAL_PER_LEVEL; + /** + * Additive boost to success chance for each level of input fluid supplied + */ + public static final float SUCCESS_PER_LEVEL = 10.0f; + /** + * Amount of ticks between each tick the unit will try to consume input fluid + */ + private static final int CONSUME_INTERVAL = 1 * SECONDS; + + /** + * Fluid that needs to be supplied to boost success chance + */ + private static final Materials INPUT_CHEMICAL = Materials.PolyAluminiumChloride; + /** + * Output fluid to be produced as waste. The intended behaviour is that this output fluid can be cycled + * semi-perfectly into the input fluid. + */ + private static final Materials OUTPUT_WASTE = Materials.FlocculationWasteLiquid; + + /** + * Total amount of input fluid consumed during this recipe cycle. + */ + private long inputFluidConsumed = 0; + + private static final String[][] structure = new String[][] + // spotless:off + { + { " ", " ", " BBBBBBB ", " BBB~BBB ", " BBBBBBB " }, + { " ", " ", " B B ", " BWWWWWB ", " BCCCCCB " }, + { " ", " ", " B B ", " GWWWWWG ", " BCAAACB " }, + { " ", " ", " B B ", " GWWWWWG ", " BCAAACB " }, + { " ", " ", " B B ", " GWWWWWG ", " BCAAACB " }, + { " ", " EE EE ", " BE EB ", " BEWWWEB ", " BCCCCCB " }, + { "D D", "DEE EED", "DBBBBBBBD", "DBBBBBBBD", "DBBBBBBBD" }, + { "DD DD", "DD DD", "DD DD", "DD DD", "DD DD" } + }; + // spotless:on + + private static final int MAIN_CASING_INDEX = getTextureIndex(GregTechAPI.sBlockCasings9, 6); + + private int casingCount = 0; + private static final int MIN_CASING = 56; + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + .addShape( + STRUCTURE_PIECE_MAIN_SURVIVAL, + Arrays.stream(structure) + .map( + sa -> Arrays.stream(sa) + .map(s -> s.replaceAll("W", " ")) + .toArray(String[]::new)) + .toArray(String[][]::new)) + // Filter machine casing + .addElement('A', ofBlock(GregTechAPI.sBlockCasings3, 11)) + .addElement( + 'B', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(t.getAllowedHatches()) + .casingIndex(MAIN_CASING_INDEX) + .dot(1) + .build()), + // Clean Flocculation Casing + onElementPass(t -> t.casingCount++, ofBlock(GregTechAPI.sBlockCasings9, 6)))) + // Reinforced Sterile Water Plant Casing + .addElement('C', ofBlock(GregTechAPI.sBlockCasings9, 5)) + // Sterile Water Plant Casing + .addElement('D', ofBlock(GregTechAPI.sBlockCasings9, 4)) + .addElement('E', ofFrame(Materials.Adamantium)) + .addElement('W', ofBlock(Blocks.water, 0)) + // Tinted industrial glass + .addElement('G', ofBlockAnyMeta(GregTechAPI.sBlockTintedGlass)) + .build(); + + List> getAllowedHatches() { + return ImmutableList.of(InputBus, InputHatch, OutputBus, OutputHatch); + } + + public MTEPurificationUnitFlocculation(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPurificationUnitFlocculation(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitFlocculation(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), + 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), + 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX) }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + hintsOnly, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + int built = survivialBuildPiece( + STRUCTURE_PIECE_MAIN_SURVIVAL, + stackSize, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET, + elementBudget, + env, + true); + if (built == -1) { + GTUtility.sendChatToPlayer( + env.getActor(), + EnumChatFormatting.GREEN + "Auto placing done ! Now go place the water yourself !"); + return 0; + } + return built; + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected IAlignmentLimits getInitialAlignmentLimits() { + // Do not allow rotation when water would flow out + return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped(); + } + + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + casingCount = 0; + if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; + + // At most two input hatches allowed + if (mInputHatches.size() > 2) { + return false; + } + + // At most two output hatches allowed + if (mOutputHatches.size() > 2) { + return false; + } + + if (casingCount < MIN_CASING) return false; + + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the Flocculation Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo( + "Supply with " + EnumChatFormatting.WHITE + + INPUT_CHEMICAL.mLocalizedName + + EnumChatFormatting.GRAY + + " to operate.") + .addInfo( + "Outputs " + EnumChatFormatting.WHITE + + OUTPUT_WASTE.mLocalizedName + + EnumChatFormatting.GRAY + + " that can be recycled.") + .addSeparator() + .addInfo( + "During operation, will consume ALL " + EnumChatFormatting.WHITE + + INPUT_CHEMICAL.mLocalizedName + + EnumChatFormatting.GRAY + + " in the input hatch.") + .addInfo( + "At the end of the recipe, for every " + EnumChatFormatting.RED + + INPUT_CHEMICAL_PER_LEVEL + + "L " + + EnumChatFormatting.GRAY + + "of " + + EnumChatFormatting.WHITE + + INPUT_CHEMICAL.mLocalizedName + + EnumChatFormatting.GRAY + + " consumed") + .addInfo( + "gain an additive " + EnumChatFormatting.RED + + SUCCESS_PER_LEVEL + + "%" + + EnumChatFormatting.GRAY + + " increase to success. If total fluid supplied is not") + .addInfo( + "a multiple of " + EnumChatFormatting.RED + + INPUT_CHEMICAL_PER_LEVEL + + "L" + + EnumChatFormatting.GRAY + + ", a penalty to success is applied using the following formula:") + .addInfo(EnumChatFormatting.GREEN + "Success = Success * 2^(-10 * Overflow ratio)") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "Step three in purifying water is to remove microscopic contaminants such as dusts, microplastics and other") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "pollutants using a clarifying agent (In this case, polyaluminium chloride) to cause flocculation - the process") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "of aggregating dispersed suspended particles from a solution into larger clumps for further filtration.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(7, 4, 7, false) + .addCasingInfoRangeColored( + "Slick Sterile Flocculation Casing", + EnumChatFormatting.GRAY, + MIN_CASING, + 65, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Sterile Water Plant Casing", + EnumChatFormatting.GRAY, + 16, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Reinforced Sterile Water Plant Casing", + EnumChatFormatting.GRAY, + 30, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Tinted Industrial Glass", + EnumChatFormatting.GRAY, + 6, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Adamantium Frame Box", + EnumChatFormatting.GRAY, + 12, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Filter Machine Casing", + EnumChatFormatting.GRAY, + 9, + EnumChatFormatting.GOLD, + false) + .addController("Front center") + .addOutputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addInputHatch( + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "-" + EnumChatFormatting.GOLD + "2", + 1) + .addOutputHatch( + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "-" + EnumChatFormatting.GOLD + "2", + 1) + .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void startCycle(int cycleTime, int progressTime) { + super.startCycle(cycleTime, progressTime); + // Reset amount of fluid consumed in this cycle. + this.inputFluidConsumed = 0; + } + + @Override + public void endCycle() { + super.endCycle(); + // Output waste water proportional to amount of boost levels. We do this even when the recipe fails, so you can + // always fully recycle. + // NOTE: If this process ever PRODUCES excess chlorine, there is a recipe bug. + int levels = calculateBoostLevels(); + long amount = levels * WASTE_WATER_PER_LEVEL; + this.addFluidOutputs(new FluidStack[] { OUTPUT_WASTE.getFluid(amount) }); + // Make sure to reset consumed fluid (again) + this.inputFluidConsumed = 0; + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.runMachine(aBaseMetaTileEntity, aTick); + + // Consume all input fluid periodically, only when running + if (aTick % CONSUME_INTERVAL == 0 && mMaxProgresstime > 0) { + // Iterate over all fluids stored + List fluids = this.getStoredFluids(); + for (FluidStack fluid : fluids) { + // If this FluidStack is the input chemical, consume it all + if (fluid.getFluid() + .equals(INPUT_CHEMICAL.mFluid)) { + this.inputFluidConsumed += fluid.amount; + if (!this.depleteInput(fluid)) { + stopMachine(ShutDownReasonRegistry.outOfFluid(fluid)); + } + } + } + } + } + + private int calculateBoostLevels() { + return (int) Math.floor((float) this.inputFluidConsumed / (float) INPUT_CHEMICAL_PER_LEVEL); + } + + @Override + public float calculateFinalSuccessChance() { + // Amount of times the required amount of input fluid was fully inserted + int levels = calculateBoostLevels(); + // Target amount of fluid needed to reach this amount of boost levels + long targetAmount = levels * INPUT_CHEMICAL_PER_LEVEL; + // Amount of excess fluid inserted. + long overflow = inputFluidConsumed - targetAmount; + // Base boost chance, before applying overflow penalty + float boost = SUCCESS_PER_LEVEL * levels; + // If there was any overflow, apply an exponential penalty multiplier based on percentage overflow + if (overflow > 0) { + float overflowPct = (float) overflow / INPUT_CHEMICAL_PER_LEVEL; + float penaltyMultiplier = (float) Math.pow(2.0f, overflowPct * -10.0); + return Math.max(0.0f, (this.currentRecipeChance + boost) * penaltyMultiplier); + } else { + return Math.min(100.0f, this.currentRecipeChance + boost); + } + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getWaterTier() { + return 3; + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_ZPM; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.purificationFlocculationRecipes; + } + + @Override + public String[] getInfoData() { + ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); + infoData.add( + INPUT_CHEMICAL.mLocalizedName + " consumed this cycle: " + + EnumChatFormatting.RED + + inputFluidConsumed + + "L"); + return infoData.toArray(new String[] {}); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setLong("mInputFluidConsumed", inputFluidConsumed); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.inputFluidConsumed = aNBT.getLong("mInputFluidConsumed"); + } + + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.GT_MACHINES_COAGULATION_LOOP.resourceLocation; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitOzonation.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitOzonation.java new file mode 100644 index 0000000000..f1d3b56fe8 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitOzonation.java @@ -0,0 +1,298 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static gregtech.api.enums.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputBus; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import net.minecraft.item.ItemStack; +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 com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +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.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEPurificationUnitOzonation extends MTEPurificationUnitBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final String STRUCTURE_PIECE_MAIN_SURVIVAL = "main_survival"; + + private static final String[][] structure = new String[][] { + // spotless:off + { " ", " ", " A ", " A ", " AAA ", " AAA ", " A A ", " A A ", " A A ", " A~A " }, + { " A ", " A ", " A A ", " A A ", "BBBBA A", "BDDBA A", "BBBBA D A", "E A D A", "E A D A", "E AAAAA" }, + { " AAA ", " A A ", " A A", " A A", "BDDBA A", "O BA A", "BBBBA A", " C A A", " CCA A", " AAAAA" }, + { " A ", " A ", " A A ", " A A ", "BBBBA A", "BDDBA A", "BBBBA A", "E A A", "E A A", "E AAAAA" }, + { " ", " ", " A ", " A ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA " } }; + // spotless:on + + private static final int MAIN_CASING_INDEX = getTextureIndex(GregTechAPI.sBlockCasings9, 10); + + private static final int OFFSET_X = 6; + private static final int OFFSET_Y = 9; + private static final int OFFSET_Z = 0; + + /** + * If the player inserts more ozone gas than this amount, the multi will explode. + */ + public static final int MAX_OZONE_GAS_FOR_EXPLOSION = 1000 * (int) Math.pow(2, 10); + + private int casingCount = 0; + private static final int MIN_CASING = 96; + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + // Inert Filtration Casing + .addElement( + 'A', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(ImmutableList.of(InputHatch, OutputHatch, OutputBus)) + .casingIndex(getTextureIndex(GregTechAPI.sBlockCasings9, 10)) + .dot(1) + .build()), + onElementPass(t -> t.casingCount++, ofBlock(GregTechAPI.sBlockCasings9, 10)))) + // High Pressure Resistant Casing (possibly placeholder name) + .addElement('B', ofBlock(GregTechAPI.sBlockCasings9, 9)) + // PTFE pipe casing + .addElement('C', ofBlock(GregTechAPI.sBlockCasings8, 1)) + // Any tinted industrial glass + .addElement('D', ofBlockAnyMeta(GregTechAPI.sBlockTintedGlass)) + .addElement('E', ofFrame(Materials.TungstenSteel)) + // Ozone input hatch + .addElement( + 'O', + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(InputHatch) + .casingIndex(getTextureIndex(GregTechAPI.sBlockCasings9, 9)) + .dot(2) + .buildAndChain(ofBlock(GregTechAPI.sBlockCasings9, 9)))) + .build(); + + public MTEPurificationUnitOzonation(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + protected MTEPurificationUnitOzonation(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitOzonation(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), + 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX), + 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[] { Textures.BlockIcons.getCasingTextureForId(MAIN_CASING_INDEX) }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, OFFSET_X, OFFSET_Y, OFFSET_Z); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + return survivialBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + OFFSET_X, + OFFSET_Y, + OFFSET_Z, + elementBudget, + env, + true); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the Ozonation Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo( + "Will explode if the input hatch contains more than " + EnumChatFormatting.RED + + MAX_OZONE_GAS_FOR_EXPLOSION + + "L " + + EnumChatFormatting.WHITE + + "Ozone Gas.") + .addInfo( + "Receives a " + EnumChatFormatting.RED + + "20%" + + EnumChatFormatting.GRAY + + " bonus to success chance for every doubling of " + + EnumChatFormatting.WHITE + + "Ozone Gas.") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "The second step in water purification is ozonation, which involves injecting large quantities of small") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "bubbles of highly reactive ozone gas into the water. This removes trace element contaminants like") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "sulfur, iron and manganese, creating insoluble oxide compounds which are then filtered out.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(9, 10, 5, false) + .addCasingInfoRangeColored( + "Inert Filtration Casing", + EnumChatFormatting.GRAY, + MIN_CASING, + 102, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Reactive Gas Containment Casing", + EnumChatFormatting.GRAY, + 27, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Any Tinted Industrial Glass", + EnumChatFormatting.GRAY, + 9, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Tungstensteel Frame Box", + EnumChatFormatting.GRAY, + 6, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored("PTFE Pipe Casing", EnumChatFormatting.GRAY, 3, EnumChatFormatting.GOLD, false) + .addOutputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addInputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addOutputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1) + .addOtherStructurePart("Input Hatch (Ozone)", EnumChatFormatting.GOLD + "1", 2) + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.purificationOzonationRecipes; + } + + @NotNull + @Override + public CheckRecipeResult checkProcessing() { + // First do recipe checking logic + CheckRecipeResult result = super.checkProcessing(); + if (!result.wasSuccessful()) return result; + // Look for ozone, blow up if more than max allowed + for (FluidStack fluid : this.storedFluids) { + if (fluid.isFluidEqual(Materials.Ozone.getGas(1L))) { + if (fluid.amount > MAX_OZONE_GAS_FOR_EXPLOSION) { + // TODO: Fix crash in hatch + // this.explodeMultiblock(); + } + } + } + return result; + } + + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.GT_MACHINES_OZONATION_LOOP.resourceLocation; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getWaterTier() { + return 2; + } + + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + casingCount = 0; + if (!checkPiece(STRUCTURE_PIECE_MAIN, OFFSET_X, OFFSET_Y, OFFSET_Z)) return false; + if (casingCount < MIN_CASING) return false; + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_LuV; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPhAdjustment.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPhAdjustment.java new file mode 100644 index 0000000000..803d9b684e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPhAdjustment.java @@ -0,0 +1,608 @@ +package gregtech.common.tileentities.machines.multi.purification; + +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 gregtech.api.enums.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +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.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.TierEU; +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.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.IGTHatchAdder; +import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.shutdown.SimpleShutDownReason; + +public class MTEPurificationUnitPhAdjustment extends MTEPurificationUnitBase + implements ISurvivalConstructable { + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int STRUCTURE_X_OFFSET = 7; + private static final int STRUCTURE_Y_OFFSET = 4; + private static final int STRUCTURE_Z_OFFSET = 1; + + private static final String[][] structure = new String[][] { + // spotless:off + { "E E E E", "EAAAE EAAAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAAAE EAAAE" }, + { " AAA AAA ", "A A A A", "A A A A", "A A A A", "A ABB~BBA A", "AAAAA AAAAA" }, + { " AXA AYA ", "A A A A", "G A A H", "G ABBBBBA H", "G H", "AAAAABRBRBAAAAA" }, + { " AAA AAA ", "A A A A", "A A A A", "A A A A", "A AIIIIIA A", "AAAAA AAAAA" }, + { "E E E E", "EAAAE EAAAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAGAE EAHAE", "EAAAE EAAAE" } }; + // spotless:on + + private static final int CASING_INDEX_MIDDLE = getTextureIndex(GregTechAPI.sBlockCasings9, 7); + private static final int CASING_INDEX_TOWER = getTextureIndex(GregTechAPI.sBlockCasings9, 8); + + /** + * The current pH value of the water inside the multiblock + */ + private float currentpHValue = 0.0f; + + /** + * The multiblock will try to consume catalyst every CONSUME_INTERVAL ticks. + */ + private static final int CONSUME_INTERVAL = 1 * SECONDS; + + /** + * Maximum deviation the initial pH value can have away from the neutral value. + */ + private static final float INITIAL_PH_DEVIATION = 2.5f; + + /** + * pH value of entirely pH neutral water. + */ + private static final float PH_NEUTRAL_VALUE = 7.0f; + + /** + * Maximum deviation from the neutral value that is allowed for the recipe to succeed. + */ + private static final float PH_MAX_DEVIATION = 0.05f; + + /** + * Change in pH value for each piece of alkaline dust supplied. + */ + public static final float PH_PER_ALKALINE_DUST = 0.01f; + + /** + * Change in pH value for every 10L of acid supplied. + */ + public static final float PH_PER_10_ACID_LITER = -0.01f; + + /** + * Alkaline catalyst material + */ + public static final Materials ALKALINE_MATERIAL = Materials.SodiumHydroxide; + + /** + * Acidic catalyst material + */ + public static final Materials ACIDIC_MATERIAL = Materials.HydrochloricAcid; + + /** + * The input hatch for the acidic material + */ + private MTEHatchInput acidInputHatch; + /** + * The input bus for the alkaline material + */ + private MTEHatchInputBus alkalineInputBus; + + /** + * List of all placed sensor hatches in the multi, so we can update them with the proper pH value when it changes. + */ + private final ArrayList sensorHatches = new ArrayList<>(); + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + // Extreme Corrosion Resistant Casing + .addElement('A', ofBlock(GregTechAPI.sBlockCasings9, 8)) + // Naquadah Reinforced Water Plant Casing + .addElement('B', ofBlock(GregTechAPI.sBlockCasings9, 7)) + .addElement('E', ofFrame(Materials.NaquadahAlloy)) + // pH Resistant Glass + .addElement('G', ofBlock(GregTechAPI.sBlockGlass1, 0)) + .addElement('H', ofBlock(GregTechAPI.sBlockGlass1, 0)) + // Regular I/O hatches + .addElement( + 'I', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(t.getAllowedHatches()) + .dot(1) + .casingIndex(CASING_INDEX_MIDDLE) + .build()), + // Naquadah Reinforced Water Plant Casing + ofBlock(GregTechAPI.sBlockCasings9, 7))) + .addElement( + 'R', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(SpecialHatchElement.PhSensor) + .dot(2) + .cacheHint(() -> "pH Sensor Hatch") + .casingIndex(CASING_INDEX_MIDDLE) + .build()), + // Naquadah Reinforced Water Plant Casing + ofBlock(GregTechAPI.sBlockCasings9, 7))) + // Special I/O hatches + .addElement( + 'X', + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(InputBus) + .dot(3) + .adder(MTEPurificationUnitPhAdjustment::addAlkalineBusToMachineList) + .cacheHint(() -> "Input Bus (" + ALKALINE_MATERIAL.mLocalizedName + ")") + .casingIndex(CASING_INDEX_TOWER) + .allowOnly(ForgeDirection.UP) + .build())) + .addElement( + 'Y', + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(InputHatch) + .dot(4) + .adder(MTEPurificationUnitPhAdjustment::addAcidHatchToMachineList) + .cacheHint(() -> "Input Hatch (" + ACIDIC_MATERIAL.mLocalizedName + ")") + .casingIndex(CASING_INDEX_TOWER) + .allowOnly(ForgeDirection.UP) + .build())) + .build(); + + private List> getAllowedHatches() { + return ImmutableList.of(InputHatch, OutputHatch); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MIDDLE), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MIDDLE), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MIDDLE) }; + } + + public MTEPurificationUnitPhAdjustment(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPurificationUnitPhAdjustment(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitPhAdjustment(this.mName); + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + hintsOnly, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + return survivialBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET, + elementBudget, + env, + true); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.purificationPhAdjustmentRecipes; + } + + public boolean addAcidHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInput) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((MTEHatchInput) aMetaTileEntity).mRecipeMap = null; + acidInputHatch = (MTEHatchInput) aMetaTileEntity; + return true; + } + return false; + } + + public boolean addAlkalineBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInputBus) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((MTEHatchInputBus) aMetaTileEntity).mRecipeMap = null; + alkalineInputBus = (MTEHatchInputBus) aMetaTileEntity; + return true; + } + return false; + } + + public boolean addSensorHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity instanceof MTEHatchPHSensor) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return this.sensorHatches.add((MTEHatchPHSensor) aMetaTileEntity); + } + return false; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the pH Neutralization Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo( + "Initial pH value every cycle varies from " + EnumChatFormatting.RED + + (PH_NEUTRAL_VALUE - INITIAL_PH_DEVIATION) + + EnumChatFormatting.GRAY + + " - " + + EnumChatFormatting.RED + + (PH_NEUTRAL_VALUE + INITIAL_PH_DEVIATION) + + " pH" + + EnumChatFormatting.GRAY + + ".") + .addInfo( + "If the pH value is within " + EnumChatFormatting.RED + + PH_MAX_DEVIATION + + " pH " + + EnumChatFormatting.GRAY + + "of 7.0 pH at the end of the cycle, the recipe always succeeds.") + .addInfo("Otherwise, the recipe always fails.") + .addInfo("Use a pH Sensor Hatch to read the current pH value.") + .addInfo("For safety, the machine will shut down if the pH goes below 0 or exceeds 14.") + .addSeparator() + .addInfo( + "Every " + EnumChatFormatting.RED + + CONSUME_INTERVAL + + EnumChatFormatting.GRAY + + " ticks, consumes ALL " + + EnumChatFormatting.WHITE + + ALKALINE_MATERIAL.mLocalizedName + + EnumChatFormatting.GRAY + + " and " + + EnumChatFormatting.WHITE + + ACIDIC_MATERIAL.mLocalizedName + + EnumChatFormatting.GRAY + + " in the special hatches.") + .addInfo( + EnumChatFormatting.RED + "Raises " + + EnumChatFormatting.GRAY + + "the pH value by " + + EnumChatFormatting.RED + + PH_PER_ALKALINE_DUST + + " pH " + + EnumChatFormatting.GRAY + + "per piece of " + + EnumChatFormatting.WHITE + + ALKALINE_MATERIAL.getDust(1) + .getDisplayName() + + EnumChatFormatting.GRAY + + ".") + .addInfo( + EnumChatFormatting.RED + "Lowers " + + EnumChatFormatting.GRAY + + "the pH value by " + + EnumChatFormatting.RED + + -PH_PER_10_ACID_LITER + + " pH " + + EnumChatFormatting.GRAY + + "per " + + EnumChatFormatting.RED + + "10L " + + EnumChatFormatting.GRAY + + "of " + + EnumChatFormatting.WHITE + + ACIDIC_MATERIAL.getFluid(1L) + .getLocalizedName() + + EnumChatFormatting.GRAY + + ".") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "The fourth step of water purification is to neutralize the solution and bring its pH to exactly 7, rendering") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "the solution inert with no hydrogen ion activity beyond water’s natural amphiproticity. Acids and bases from soils") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "and geology cause natural alkalinity variations in water which can cause corrosive reactions with sensitive") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "materials. This necessitates the use of the corresponding neutralizing agents to pH balance the water.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(7, 4, 7, false) + .addCasingInfoExactlyColored( + "Stabilized Naquadah Water Plant Casing", + EnumChatFormatting.GRAY, + 15, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Chemical Grade Glass", + EnumChatFormatting.GRAY, + 18, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Naquadah Alloy Frame Box", + EnumChatFormatting.GRAY, + 48, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Inert Neutralization Water Plant Casing", + EnumChatFormatting.GRAY, + 67 * 2, + EnumChatFormatting.GOLD, + false) + .addController("Front center") + .addOtherStructurePart("Input Hatch (Water)", EnumChatFormatting.GOLD + "1+", 1) + .addOtherStructurePart("Output Hatch", EnumChatFormatting.GOLD + "1", 1) + .addOtherStructurePart("pH Sensor Hatch", EnumChatFormatting.GOLD + "2", 2) + .addOtherStructurePart("Input Bus (Sodium Hydroxide)", EnumChatFormatting.GOLD + "1", 3) + .addOtherStructurePart("Input Hatch (Hydrochloric Acid)", EnumChatFormatting.GOLD + "1", 4) + .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void startCycle(int cycleTime, int progressTime) { + super.startCycle(cycleTime, progressTime); + // Randomize initial pH value + ThreadLocalRandom random = ThreadLocalRandom.current(); + // Generate random integer in [-RNG_PRECISION, RNG_PRECISION] + final int RNG_PRECISION = 1000; + int rng = random.nextInt(-RNG_PRECISION, RNG_PRECISION); + // Remap to [-1.0, 1.0] and then to [-INITIAL_PH_DEVIATION, INITIAL_PH_DEVIATION] + float deviation = ((float) rng / RNG_PRECISION) * INITIAL_PH_DEVIATION; + // Round to 2 digits + this.currentpHValue = Math.round((PH_NEUTRAL_VALUE + deviation) * 100.0f) / 100.0f; + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.runMachine(aBaseMetaTileEntity, aTick); + // Eat all acid and alkaline material every second + if (mMaxProgresstime > 0 && aTick % CONSUME_INTERVAL == 0) { + // Important that we drain backwards, since draining stacks can auto-sort the bus + long totalAlkalineDrained = 0; + for (int i = alkalineInputBus.getSizeInventory() - 1; i >= 0; --i) { + ItemStack stack = alkalineInputBus.getStackInSlot(i); + // If this ItemStack is the alkaline material, drain it entirely and record the amount drained + if (stack != null && stack.isItemEqual(ALKALINE_MATERIAL.getDust(1))) { + totalAlkalineDrained += stack.stackSize; + alkalineInputBus.decrStackSize(i, stack.stackSize); + } + } + + // Now do fluid, this is simpler since we only need to bother with one slot + FluidStack stack = acidInputHatch.getDrainableStack(); + int numMultiples = 0; + if (stack != null && stack.isFluidEqual(ACIDIC_MATERIAL.getFluid(1))) { + int acidAvailable = stack.amount; + // We only care about multiples of 10, but we still drain all. + numMultiples = Math.floorDiv(acidAvailable, 10); + acidInputHatch.drain(acidAvailable, true); + } else { + // Little easier egg: Fluoroantimonic acid has a pH value of -31, it's an acid so strong it will + // instantly shatter the glass in the structure. + + Fluid acid = FluidRegistry.getFluid("fluoroantimonic acid"); + if (stack != null && stack.getFluid() + .equals(acid)) { + // TODO: Actually break the glass and trigger achievement lol + } + + } + + // Adjust pH with to new value + this.currentpHValue = this.currentpHValue + totalAlkalineDrained * PH_PER_ALKALINE_DUST + + numMultiples * PH_PER_10_ACID_LITER; + + // Clamp pH to sensible values + this.currentpHValue = Math.min(Math.max(this.currentpHValue, 0.0f), 14.0f); + + // Round to 2 decimals + this.currentpHValue = Math.round(this.currentpHValue * 100.0f) / 100.0f; + + // If pH is 0 or 14, stop the machine + if (Math.abs(this.currentpHValue) < 0.001 || Math.abs(this.currentpHValue - 14.0f) < 0.001) { + stopMachine(SimpleShutDownReason.ofNormal("critical_ph_value")); + } + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + super.onPostTick(aBaseMetaTileEntity, aTimer); + // Update sensor hatch + for (MTEHatchPHSensor hatch : sensorHatches) { + hatch.updateRedstoneOutput(this.currentpHValue); + } + } + + @Override + public float calculateFinalSuccessChance() { + // Success chance is 100% when inside target range, 0% otherwise + float distance = Math.abs(this.currentpHValue - PH_NEUTRAL_VALUE); + if (distance <= PH_MAX_DEVIATION) { + return 100.0f; + } else { + return 0.0f; + } + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getWaterTier() { + return 4; + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_ZPM; + } + + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; + // Do not form without positioned hatches + if (acidInputHatch == null || alkalineInputBus == null) return false; + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + @Override + public String[] getInfoData() { + ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); + infoData.add("Current pH Value: " + EnumChatFormatting.YELLOW + currentpHValue + " pH"); + return infoData.toArray(new String[] {}); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setFloat("mCurrentpH", this.currentpHValue); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.currentpHValue = aNBT.getFloat("mCurrentpH"); + } + + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.GT_MACHINES_PURIFICATION_PH_LOOP.resourceLocation; + } + + private enum SpecialHatchElement implements IHatchElement { + + PhSensor(MTEPurificationUnitPhAdjustment::addSensorHatchToMachineList, MTEHatchPHSensor.class) { + + @Override + public long count(MTEPurificationUnitPhAdjustment gtMetaTileEntityPurificationUnitPhAdjustment) { + return gtMetaTileEntityPurificationUnitPhAdjustment.sensorHatches.size(); + } + }; + + private final List> mteClasses; + private final IGTHatchAdder adder; + + @SafeVarargs + SpecialHatchElement(IGTHatchAdder adder, + Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + public IGTHatchAdder adder() { + return adder; + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPlasmaHeater.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPlasmaHeater.java new file mode 100644 index 0000000000..f59554171f --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitPlasmaHeater.java @@ -0,0 +1,565 @@ +package gregtech.common.tileentities.machines.multi.purification; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static gregtech.api.enums.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; +import static gregtech.api.recipe.RecipeMaps.purificationPlasmaHeatingRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +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 com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.Mods; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.TierEU; +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.MTEHatch; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEPurificationUnitPlasmaHeater extends MTEPurificationUnitBase + implements ISurvivalConstructable { + + private static final int CASING_INDEX_HEATER = getTextureIndex(GregTechAPI.sBlockCasings9, 11); + private static final int CASING_INDEX_TOWER = getTextureIndex(GregTechAPI.sBlockCasings9, 5); + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int STRUCTURE_X_OFFSET = 2; + private static final int STRUCTURE_Y_OFFSET = 14; + private static final int STRUCTURE_Z_OFFSET = 5; + + /** + * Fluid is consumed every CONSUME_INTERVAL ticks + */ + private static final long CONSUME_INTERVAL = 1 * SECONDS; + + /** + * Current internal temperature of the multiblock + */ + private long currentTemperature = 0; + /** + * Amount of successful heating cycles completed + */ + private int cyclesCompleted = 0; + /** + * Whether this recipe is ruined due to high temperature + */ + private boolean ruinedCycle = false; + + private enum CycleState { + // Was previously at 0K, currently waiting to heat to 10000K + Heating, + // Was previously at 10000K, currently waiting to cool down to 0K + Cooling + } + + private CycleState state = CycleState.Heating; + + // A cycle is 30s at shortest, a purification plant cycle is 120s. 33% chance per heating cycle + // will give you plenty of room for delay and still get to 99% chance. + public static final long SUCCESS_PER_CYCLE = 33; + + // Consumption rates in liters/second + public static final long MAX_PLASMA_PER_SEC = 10; + public static final long MAX_COOLANT_PER_SEC = 100; + // Change in temperature per consumed liter of plasma + public static final long PLASMA_TEMP_PER_LITER = 100; + // Change in temperature per consumed liter of coolant + public static final long COOLANT_TEMP_PER_LITER = -5; + // Temperature at which the batch is ruined + public static final long MAX_TEMP = 12500; + // Point at which the heating point of the cycle is reached + public static final long HEATING_POINT = 10000; + + private static final Materials plasmaMaterial = Materials.Helium; + private static final Materials coolantMaterial = Materials.SuperCoolant; + + private MTEHatchInput plasmaInputHatch; + private MTEHatchInput coolantInputHatch; + + private static final String[][] structure = new String[][] { + // spotless:off + { " DDDDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDKDD " }, + { " DD DD ", " DDDDDDD ", " DDDDD ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DDDDDDDDD " }, + { " D D ", " DDD DDD ", " DDDDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " DDDDDDDDDDD " }, + { " D D ", " D DD ", " DD D ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, + { " D D", " DD DD ", " DD D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, + { " D D", " D D ", " DD D ", " D D ", " D D ", "GBBBG D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D", "G G D D", "GB~BG DDDDDDDDDDDDDDD" }, + { " D D", " D D ", " DD D ", " D D ", " BBB D D ", "BBBBB D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D", " EEEBBBBD D", "BAAAB DDDDDDDDDDDDDDD" }, + { " D D", " D D ", " DD D ", " D D ", " BBB D D ", "BBBBB D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFE D D ", " EFEBBBBD D", " EFE D D", "PAAABBBBDDDDDDDDDDDDDDD" }, + { " D D", " D D ", " DD D ", " D D ", " BBB D D ", "BBBBB D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D ", " EEE D D", " EEEBBBBD D", "BAAAB DDDDDDDDDDDDDDD" }, + { " D D", " D D ", " DD D ", " D D ", " D D ", "GBBBG D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D ", "G G D D", "G G D D", "GBBBG DDDDDDDDDDDDDDD" }, + { " D D", " D D ", " D D ", " D DD ", " D DD ", " D DD ", " D DD ", " D DD ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, + { " D DD", " D D ", " D D ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDDDDDDDDDDD " }, + { " D D ", " DD DD ", " D D ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " DDDDDDDDDDD " }, + { " DD DD ", " DDDDDDD ", " DDDDD ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDDDD ", " DDDDD ", " DD DD ", " DD DD ", " DDDDDDDDD " }, + { " DDDDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " DDDDD ", " DDDDD ", " DDDDD " } }; + // spotless:on + + private int casingCount = 0; + private static final int MIN_CASING = 50; + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + // Superconducting coil block + .addElement('A', ofBlock(GregTechAPI.sBlockCasings1, 15)) + // Plasma Heating Casing + .addElement( + 'B', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(t.getAllowedHatches()) + .dot(1) + .casingIndex(CASING_INDEX_HEATER) + .build()), + onElementPass(t -> t.casingCount++, ofBlock(GregTechAPI.sBlockCasings9, 11)))) + // Reinforced Sterile Water Plant Casing + .addElement('D', ofBlock(GregTechAPI.sBlockCasings9, 5)) + // Any Tinted Glass + .addElement('E', ofBlockAnyMeta(GregTechAPI.sBlockTintedGlass, 0)) + // Neonite, with fallback to air + .addElement('F', lazy(t -> { + if (Mods.Chisel.isModLoaded()) { + Block neonite = GameRegistry.findBlock(Mods.Chisel.ID, "neonite"); + return ofBlockAnyMeta(neonite, 7); + } else { + return ofBlockAnyMeta(Blocks.air); + } + })) + // Superconductor Base ZPM frame box + .addElement('G', ofFrame(Materials.Tetranaquadahdiindiumhexaplatiumosminid)) + // Coolant input hatch + .addElement( + 'K', + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(InputHatch) + .dot(2) + .adder(MTEPurificationUnitPlasmaHeater::addCoolantHatchToMachineList) + .cacheHint(() -> "Input Hatch (Coolant)") + .casingIndex(CASING_INDEX_TOWER) + .buildAndChain(ofBlock(GregTechAPI.sBlockCasings9, 5)))) + // Plasma input hatch + .addElement( + 'P', + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(InputHatch) + .dot(3) + .adder(MTEPurificationUnitPlasmaHeater::addPlasmaHatchToMachineList) + .cacheHint(() -> "Input Hatch (Plasma)") + .casingIndex(CASING_INDEX_HEATER) + .buildAndChain(ofBlock(GregTechAPI.sBlockCasings9, 11)))) + .build(); + + private List> getAllowedHatches() { + return ImmutableList.of(InputHatch, OutputHatch); + } + + public MTEPurificationUnitPlasmaHeater(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPurificationUnitPlasmaHeater(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitPlasmaHeater(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean active, boolean redstoneLevel) { + if (side == facing) { + if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_HEATER), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_HEATER), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_HEATER) }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + hintsOnly, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + return survivialBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET, + elementBudget, + env, + true); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + public RecipeMap getRecipeMap() { + return purificationPlasmaHeatingRecipes; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the Extreme Temperature Fluctuation Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo( + "Complete heating cycles by first heating the water to " + EnumChatFormatting.RED + + HEATING_POINT + + "K" + + EnumChatFormatting.GRAY + + ",") + .addInfo( + "and then cooling it back down to " + EnumChatFormatting.RED + "0K" + EnumChatFormatting.GRAY + ".") + .addInfo( + "Initial temperature is reset to " + EnumChatFormatting.RED + + "0K" + + EnumChatFormatting.GRAY + + " on recipe start.") + .addInfo( + // TODO: Refer to heating cycles in another way to avoid confusion + "Each completed heating cycle boosts success chance by " + EnumChatFormatting.RED + + SUCCESS_PER_CYCLE + + "%.") + .addInfo( + "If the temperature ever reaches " + EnumChatFormatting.RED + + MAX_TEMP + + "K" + + EnumChatFormatting.GRAY + + " the recipe will fail and output steam.") + .addSeparator() + .addInfo( + "Consumes up to " + EnumChatFormatting.RED + + MAX_PLASMA_PER_SEC + + "L/s " + + EnumChatFormatting.WHITE + + plasmaMaterial.getPlasma(1) + .getLocalizedName() + + EnumChatFormatting.GRAY + + " and up to " + + EnumChatFormatting.RED + + MAX_COOLANT_PER_SEC + + "L/s " + + EnumChatFormatting.WHITE + + coolantMaterial.getFluid(1) + .getLocalizedName()) + .addInfo( + EnumChatFormatting.RED + "Raises " + + EnumChatFormatting.GRAY + + "the temperature by " + + EnumChatFormatting.RED + + PLASMA_TEMP_PER_LITER + + "K" + + EnumChatFormatting.GRAY + + " per liter of plasma consumed.") + .addInfo( + EnumChatFormatting.RED + "Lowers " + + EnumChatFormatting.GRAY + + "the temperature by " + + EnumChatFormatting.RED + + -COOLANT_TEMP_PER_LITER + + "K" + + EnumChatFormatting.GRAY + + " per liter of coolant consumed.") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "Step five of water purification is to evaporate complex organic polymers and extremophile organisms") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "that might be resistant to simple acids, clarifying agents, and filters. Using an ultra high") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "pressure chamber in combination with extreme temperature fluctuations allows the water to remain") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "supercritical while evaporating any remaining contaminants, ready for filtration.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(23, 15, 15, false) + .addCasingInfoExactlyColored( + "Reinforced Sterile Water Plant Casing", + EnumChatFormatting.GRAY, + 1091, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Heat-Resistant Trinium Plated Casing", + EnumChatFormatting.GRAY, + 54, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Any Tinted Industrial Glass", + EnumChatFormatting.GRAY, + 64, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Superconductor Base ZPM Frame Box", + EnumChatFormatting.GRAY, + 40, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored("Any Neonite", EnumChatFormatting.GRAY, 8, EnumChatFormatting.GOLD, false) + .addCasingInfoExactlyColored( + "Superconducting Coil Block", + EnumChatFormatting.GRAY, + 8, + EnumChatFormatting.GOLD, + false) + .addController("Front center") + .addOtherStructurePart("Input Hatch (Water)", EnumChatFormatting.GOLD + "1+", 1) + .addOtherStructurePart("Output Hatch", EnumChatFormatting.GOLD + "1", 1) + .addOtherStructurePart("Input Hatch (Coolant)", EnumChatFormatting.GOLD + "1", 2) + .addOtherStructurePart("Input Hatch (Plasma)", EnumChatFormatting.GOLD + "1", 3) + .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public void startCycle(int cycleTime, int progressTime) { + super.startCycle(cycleTime, progressTime); + // Reset internal state + this.cyclesCompleted = 0; + this.currentTemperature = 0; + this.ruinedCycle = false; + this.state = CycleState.Heating; + } + + // Drains up to maxAmount of a fluid if it is the same fluid as given, returns the amount drained + private long drainFluidLimited(MTEHatchInput inputHatch, FluidStack fluid, long maxAmount) { + FluidStack hatchStack = inputHatch.getDrainableStack(); + if (hatchStack == null) return 0; + if (hatchStack.isFluidEqual(fluid)) { + long amountToDrain = Math.min(maxAmount, hatchStack.amount); + if (amountToDrain > 0) { + inputHatch.drain((int) amountToDrain, true); + } + return amountToDrain; + } else { + return 0; + } + } + + @Override + public void addRecipeOutputs() { + super.addRecipeOutputs(); + // If the cycle was ruined, output steam + if (this.ruinedCycle) { + FluidStack insertedWater = currentRecipe.mFluidInputs[0]; + // Multiply by 60 since that's the water:steam ratio in GTNH + long steamAmount = insertedWater.amount * 60L; + addOutput(GTModHandler.getSteam(steamAmount)); + } + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.runMachine(aBaseMetaTileEntity, aTick); + if (mMaxProgresstime > 0 && aTick % CONSUME_INTERVAL == 0) { + // Drain plasma and coolant up to limited amount per second + long plasmaDrained = drainFluidLimited(plasmaInputHatch, plasmaMaterial.getPlasma(1L), MAX_PLASMA_PER_SEC); + long coolantDrained = drainFluidLimited( + coolantInputHatch, + coolantMaterial.getFluid(1L), + MAX_COOLANT_PER_SEC); + // Calculate temperature change + long tempChance = plasmaDrained * PLASMA_TEMP_PER_LITER + coolantDrained * COOLANT_TEMP_PER_LITER; + currentTemperature = Math.max(0, currentTemperature + tempChance); + // Check if batch was ruined + if (currentTemperature > MAX_TEMP) { + ruinedCycle = true; + } + // Update cycle state. + switch (state) { + case Heating -> { + // Heating state can change to cooling when temperature exceeds 10000K + if (currentTemperature >= HEATING_POINT) { + state = CycleState.Cooling; + } + } + case Cooling -> { + if (currentTemperature == 0) { + state = CycleState.Heating; + cyclesCompleted += 1; + } + } + } + } + } + + public boolean addCoolantHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInput) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((MTEHatchInput) aMetaTileEntity).mRecipeMap = null; + coolantInputHatch = (MTEHatchInput) aMetaTileEntity; + return true; + } + return false; + } + + public boolean addPlasmaHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) return false; + if (aMetaTileEntity instanceof MTEHatchInput) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((MTEHatchInput) aMetaTileEntity).mRecipeMap = null; + plasmaInputHatch = (MTEHatchInput) aMetaTileEntity; + return true; + } + return false; + } + + @Override + public float calculateFinalSuccessChance() { + if (ruinedCycle) return 0.0f; + // Success chance directly depends on number of cycles completed. + return cyclesCompleted * SUCCESS_PER_CYCLE + currentRecipeChance; + } + + @Override + public String[] getInfoData() { + ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); + infoData.add("Current temperature: " + EnumChatFormatting.YELLOW + currentTemperature + "K"); + infoData.add("Heating cycles completed this run: " + EnumChatFormatting.YELLOW + cyclesCompleted); + return infoData.toArray(new String[] {}); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setLong("mCurrentTemperature", currentTemperature); + aNBT.setInteger("mCyclesCompleted", cyclesCompleted); + aNBT.setBoolean("mRuinedCycle", ruinedCycle); + aNBT.setString("mCycleState", state.toString()); + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + currentTemperature = aNBT.getLong("mCurrentTemperature"); + cyclesCompleted = aNBT.getInteger("mCyclesCompleted"); + ruinedCycle = aNBT.getBoolean("mRuinedCycle"); + state = CycleState.valueOf(aNBT.getString("mCycleState")); + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getWaterTier() { + return 5; + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_UV; + } + + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + casingCount = 0; + if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; + if (casingCount < MIN_CASING) return false; + // Do not form without positioned hatches + if (plasmaInputHatch == null || coolantInputHatch == null) return false; + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.GT_MACHINES_PURIFICATION_PLASMA_LOOP.resourceLocation; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitUVTreatment.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitUVTreatment.java new file mode 100644 index 0000000000..1ab8122d17 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/MTEPurificationUnitUVTreatment.java @@ -0,0 +1,521 @@ +package gregtech.common.tileentities.machines.multi.purification; + +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 gregtech.api.enums.GTValues.AuthorNotAPenguin; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputHatch; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTStructureUtility.ofFrame; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +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.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.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.enums.TierEU; +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.MTEHatch; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.GTUtility; +import gregtech.api.util.IGTHatchAdder; +import gregtech.api.util.MultiblockTooltipBuilder; + +public class MTEPurificationUnitUVTreatment extends MTEPurificationUnitBase + implements ISurvivalConstructable { + + private static final int CASING_INDEX_MAIN = getTextureIndex(GregTechAPI.sBlockCasings9, 12); + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int STRUCTURE_X_OFFSET = 6; + private static final int STRUCTURE_Y_OFFSET = 8; + private static final int STRUCTURE_Z_OFFSET = 0; + + private MTEHatchLensHousing lensInputBus; + private MTEHatchLensIndicator lensIndicator; + + private UVTreatmentLensCycle lensCycle = null; + + /** + * Bonus chance to success for each lens swap + */ + public static final float SUCCESS_PER_LENS = 10.0f; + + /** + * Maximum amount of ticks between two lens swaps + */ + public static final int MAX_TIME_BETWEEN_SWAPS = MTEPurificationPlant.CYCLE_TIME_TICKS / 8; + /** + * Minimum amount of time between two lens swaps + */ + public static final int MIN_TIME_BETWEEN_SWAPS = MAX_TIME_BETWEEN_SWAPS / 4; + + public static final ArrayList LENS_ITEMS = new ArrayList<>(); + + private int numSwapsPerformed = 0; + private int timeUntilNextSwap = 0; + + private boolean removedTooEarly = false; + + private static final String[][] structure = new String[][] { + // spotless:off + { " ", " DDD ", " ", " ", " ", " ", " ", " DDD ", " H~H " }, + { " AAA ", " DDAAADD ", " BBB ", " BBB ", " BBB ", " BBB ", " BBB ", " DDBBBDD ", " AAAAAAA " }, + { " AAAAAAA ", " DDAACCCAADD ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " DDBB BBDD ", " AAAAAAAAAAA " }, + { " AAAAAAAAAAA ", "DAACCCCCCCAAD", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", "DBB BBD", "HAAAAAAAAAAAH" }, + { " AAAAALAAAAA ", "DACCCCCCCCCAD", " B B ", " B B ", " B B ", " B B ", " B B ", "DB BD", "HAAAAAAAAAAAH" }, + { " AAAAAAAAAAA ", "DAACCCCCCCAAD", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", "DBB BBD", "HAAAAAAAAAAAH" }, + { " AAAAAAA ", " DDAACCCAADD ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " BB BB ", " DDBB BBDD ", " AAAAAAAAAAA " }, + { " AIA ", " DDAAADD ", " BBB ", " BBB ", " BBB ", " BBB ", " BBB ", " DDBBBDD ", " AAAAAAA " }, + { " ", " DDD ", " ", " ", " ", " ", " ", " DDD ", " HHH " } }; + // spotless:on + + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape(STRUCTURE_PIECE_MAIN, structure) + // Naquadria-Reinforced Water Plant Casing + .addElement('A', ofBlock(GregTechAPI.sBlockCasings9, 12)) + // Neutronium-Coated UV-Resistant Glass + .addElement('B', ofBlock(GregTechAPI.sBlockGlass1, 1)) + // UV Backlight sterilizer casing + .addElement('C', ofBlock(GregTechAPI.sBlockCasings9, 13)) + .addElement('D', ofFrame(Materials.StellarAlloy)) + // Lens housing bus + .addElement( + 'L', + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(SpecialHatchElement.LensHousing) + .dot(2) + .cacheHint(() -> "Lens Housing") + .casingIndex(CASING_INDEX_MAIN) + .build())) + // Lens indicator hatch + .addElement( + 'I', + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeast(SpecialHatchElement.LensIndicator) + .dot(3) + .cacheHint(() -> "Lens Indicator") + .casingIndex(CASING_INDEX_MAIN) + .build())) + // Input or output hatch + .addElement( + 'H', + ofChain( + lazy( + t -> GTStructureUtility.buildHatchAdder() + .atLeastList(Arrays.asList(InputHatch, OutputHatch)) + .dot(1) + .cacheHint(() -> "Input Hatch, Output Hatch") + .casingIndex(CASING_INDEX_MAIN) + .build()), + // Naquadria-reinforced Water Plant Casing + ofBlock(GregTechAPI.sBlockCasings9, 12))) + .build(); + + public MTEPurificationUnitUVTreatment(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public MTEPurificationUnitUVTreatment(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEPurificationUnitUVTreatment(this.mName); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean active, boolean redstoneLevel) { + if (side == facing) { + if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN), + 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[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX_MAIN) }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + hintsOnly, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + return survivialBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + STRUCTURE_X_OFFSET, + STRUCTURE_Y_OFFSET, + STRUCTURE_Z_OFFSET, + elementBudget, + env, + true); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected MultiblockTooltipBuilder createTooltip() { + MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType("Purification Unit"); + tt.addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.BOLD + + "Water Tier: " + + EnumChatFormatting.WHITE + + GTUtility.formatNumbers(getWaterTier()) + + EnumChatFormatting.RESET) + .addInfo("Controller block for the High Energy Laser Purification Unit.") + .addInfo("Must be linked to a Purification Plant using a data stick to work.") + .addSeparator() + .addInfo( + "During operation, swap the lens in the " + EnumChatFormatting.WHITE + + "Lens Housing" + + EnumChatFormatting.GRAY + + ".") + .addInfo( + "The multiblock will output a signal through the " + EnumChatFormatting.WHITE + "Lens Indicator Hatch") + .addInfo("when the current lens must be swapped.") + .addInfo( + "Lens swaps will be requested in random intervals of " + EnumChatFormatting.RED + + (MIN_TIME_BETWEEN_SWAPS / SECONDS) + + " to " + + (MAX_TIME_BETWEEN_SWAPS / SECONDS) + + "s" + + EnumChatFormatting.GRAY + + ".") + .addSeparator() + .addInfo( + "Success chance is boosted by " + EnumChatFormatting.RED + + SUCCESS_PER_LENS + + "% " + + EnumChatFormatting.GRAY + + "for each successful swap performed.") + .addInfo("Removing a lens too early will fail the recipe.") + .addInfo("Find the order of lenses in the recipe in NEI,") + .addInfo("or use a portable scanner to view the currently requested lens.") + .addSeparator() + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "The sixth step of water purification involves identifying any remaining negatively charged ions within") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "the water which may cause electrical faults in future wafer manufacturing. Bombarding the water with varying") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "wavelengths of photon beams will impart energy into outer-shell electrons, causing them to detach from the") + .addInfo( + EnumChatFormatting.AQUA + "" + + EnumChatFormatting.ITALIC + + "atoms themselves and pass through the walls of the tank, ensuring the water is perfectly electrically polar.") + .addInfo(AuthorNotAPenguin) + .beginStructureBlock(13, 9, 9, true) + .addCasingInfoRangeColored( + "Naquadria-Reinforced Water Plant Casing", + EnumChatFormatting.GRAY, + 147, + 155, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Electron-Permeable Neutronium Coated Glass", + EnumChatFormatting.GRAY, + 144, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "High Energy Ultraviolet Emitter Casing", + EnumChatFormatting.GRAY, + 24, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Stellar Alloy Frame Box", + EnumChatFormatting.GRAY, + 56, + EnumChatFormatting.GOLD, + false) + .addController("Front center") + .addOtherStructurePart("Input Hatch, Output Hatch", EnumChatFormatting.GOLD + "1+", 1) + .addOtherStructurePart("Lens Housing", EnumChatFormatting.GOLD + "1", 2) + .addOtherStructurePart("Lens Indicator", EnumChatFormatting.GOLD + "1", 3) + .addStructureInfo("Use the StructureLib Hologram Projector to build the structure.") + .toolTipFinisher("GregTech"); + return tt; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.purificationUVTreatmentRecipes; + } + + @NotNull + @Override + public CheckRecipeResult checkProcessing() { + CheckRecipeResult result = super.checkProcessing(); + if (result.wasSuccessful()) { + this.lensCycle = new UVTreatmentLensCycle(LENS_ITEMS); + } + return result; + } + + private int generateNextSwapTime() { + ThreadLocalRandom random = ThreadLocalRandom.current(); + return random.nextInt(MIN_TIME_BETWEEN_SWAPS, MAX_TIME_BETWEEN_SWAPS); + } + + @Override + public void startCycle(int cycleTime, int progressTime) { + super.startCycle(cycleTime, progressTime); + // Reset internal state + this.timeUntilNextSwap = 0; + this.numSwapsPerformed = 0; + this.lensCycle.reset(); + this.removedTooEarly = false; + } + + private ItemStack getCurrentlyInsertedLens() { + return this.lensInputBus.getStackInSlot(0); + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.runMachine(aBaseMetaTileEntity, aTick); + + // Do no processing if no recipe is running + if (mMaxProgresstime <= 0) return; + + // This can happen because the lens cycle isn't saved to NBT correctly yet, FIXME + if (this.lensCycle == null) { + // FIXME: Properly save current recipe in NBT instead of exiting early + return; + } + + ItemStack currentLens = getCurrentlyInsertedLens(); + + // If we are currently counting down to a next swap, do so + if (timeUntilNextSwap > 0) { + timeUntilNextSwap -= 1; + // Set the indicator to not output a signal for now + lensIndicator.updateRedstoneOutput(false); + + // If we are counting down to the next swap, and there is no correct lens in the bus, we removed a lens + // too early + if (currentLens == null || !currentLens.isItemEqual(lensCycle.current())) { + removedTooEarly = true; + } + + // If the time until the next swap became zero, move on to the next requested lens + if (timeUntilNextSwap == 0) { + boolean advanced = lensCycle.advance(); + if (!advanced) { + // cycle didn't advance, we arrived at the end. This mainly means we want to stop the cycle + // The easiest way to do this is by setting the time until next swap larger than the recipe time + timeUntilNextSwap = mMaxProgresstime + 1; + } + } + } + + // Time until next swap is zero, this means we are waiting for the user to output a lens. + else if (timeUntilNextSwap == 0) { + // Set the indicator to output a signal + lensIndicator.updateRedstoneOutput(true); + + // If we now have a matching lens, we can accept it and move on to the next swap + if (currentLens != null && currentLens.isItemEqual(lensCycle.current())) { + numSwapsPerformed += 1; + timeUntilNextSwap = generateNextSwapTime(); + } + } + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + public int getWaterTier() { + return 6; + } + + @Override + public long getBasePowerUsage() { + return TierEU.RECIPE_UV; + } + + @Override + public float calculateFinalSuccessChance() { + if (removedTooEarly) return 0.0f; + return numSwapsPerformed * SUCCESS_PER_LENS + currentRecipeChance; + } + + @Override + public String[] getInfoData() { + ArrayList infoData = new ArrayList<>(Arrays.asList(super.getInfoData())); + if (this.lensCycle != null) { + infoData.add("Lens swaps performed this run: " + EnumChatFormatting.YELLOW + numSwapsPerformed); + infoData.add( + "Current lens requested: " + EnumChatFormatting.GREEN + + lensCycle.current() + .getDisplayName()); + if (removedTooEarly) { + infoData.add("Removed lens too early. Failing this recipe."); + } + } + return infoData.toArray(new String[] {}); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("numSwapsPerformed", numSwapsPerformed); + aNBT.setInteger("timeUntilNextSwap", timeUntilNextSwap); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + numSwapsPerformed = aNBT.getInteger("numSwapsPerformed"); + timeUntilNextSwap = aNBT.getInteger("timeUntilNextSwap"); + } + + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + if (!checkPiece(STRUCTURE_PIECE_MAIN, STRUCTURE_X_OFFSET, STRUCTURE_Y_OFFSET, STRUCTURE_Z_OFFSET)) return false; + // Do not form without lens bus + if (lensInputBus == null) return false; + return super.checkMachine(aBaseMetaTileEntity, aStack); + } + + public boolean addLensHousingToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity instanceof MTEHatchLensHousing) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + this.lensInputBus = (MTEHatchLensHousing) aMetaTileEntity; + return true; + } + return false; + } + + public boolean addLensIndicatorToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) return false; + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity instanceof MTEHatchLensIndicator) { + ((MTEHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + this.lensIndicator = (MTEHatchLensIndicator) aMetaTileEntity; + lensIndicator.updateRedstoneOutput(false); + return true; + } + return false; + } + + private enum SpecialHatchElement implements IHatchElement { + + LensHousing(MTEPurificationUnitUVTreatment::addLensHousingToMachineList, MTEHatchLensHousing.class) { + + @Override + public long count(MTEPurificationUnitUVTreatment gtMetaTileEntityPurificationUnitUVTreatment) { + if (gtMetaTileEntityPurificationUnitUVTreatment.lensInputBus == null) return 0; + else return 1; + } + }, + + LensIndicator(MTEPurificationUnitUVTreatment::addLensIndicatorToMachineList, MTEHatchLensHousing.class) { + + @Override + public long count(MTEPurificationUnitUVTreatment gtMetaTileEntityPurificationUnitUVTreatment) { + if (gtMetaTileEntityPurificationUnitUVTreatment.lensIndicator == null) return 0; + else return 1; + } + }; + + private final List> mteClasses; + private final IGTHatchAdder adder; + + @SafeVarargs + SpecialHatchElement(IGTHatchAdder adder, + Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + public IGTHatchAdder adder() { + return adder; + } + } + + @Override + protected ResourceLocation getActivitySoundLoop() { + return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP.resourceLocation; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/purification/PurifiedWaterHelpers.java b/src/main/java/gregtech/common/tileentities/machines/multi/purification/PurifiedWaterHelpers.java index ab397aac94..987a328f31 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/purification/PurifiedWaterHelpers.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/purification/PurifiedWaterHelpers.java @@ -3,7 +3,7 @@ package gregtech.common.tileentities.machines.multi.purification; import net.minecraftforge.fluids.FluidStack; import gregtech.api.enums.Materials; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; public class PurifiedWaterHelpers { @@ -35,7 +35,7 @@ public class PurifiedWaterHelpers { } // Used to construct NEI comparator for water tier. Returns 0 if no water is used in this recipe - public static int getWaterTierFromRecipe(GT_Recipe recipe) { + public static int getWaterTierFromRecipe(GTRecipe recipe) { if (recipe.mFluidInputs.length == 0) return 0; else return getWaterTier(recipe.mFluidInputs[0]); } diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java index 87e986f941..b553849d3a 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java @@ -40,18 +40,18 @@ import com.gtnewhorizons.modularui.common.widget.SlotGroup; import com.gtnewhorizons.modularui.common.widget.TextWidget; import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.HeatingCoilLevel; import gregtech.api.enums.Materials; -import gregtech.api.fluid.FluidTankGT; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.fluid.GTFluidTank; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.multitileentity.enums.GT_MultiTileCasing; import gregtech.api.multitileentity.multiblock.base.ComplexParallelController; import gregtech.api.multitileentity.multiblock.casing.Glasses; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; +import gregtech.api.util.GTStructureUtility; import gregtech.api.util.GT_StructureUtilityMuTE; +import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.common.tileentities.machines.multiblock.logic.AdvChemicalProcessorProcessingLogic; public class AdvChemicalProcessor @@ -89,7 +89,7 @@ public class AdvChemicalProcessor processWhitelistInventoryHandlers.add(new ItemStackHandler(ITEM_WHITELIST_SLOTS)); ArrayList processFluidTanks = new ArrayList<>(FLUID_WHITELIST_SLOTS); for (int j = 0; j < FLUID_WHITELIST_SLOTS; j++) { - processFluidTanks.add(new FluidTankGT()); + processFluidTanks.add(new GTFluidTank()); } processFluidWhiteLists.add(processFluidTanks); } @@ -102,8 +102,8 @@ public class AdvChemicalProcessor setMaxComplexParallels(nbt.getInteger("processors"), false); final NBTTagCompound processWhiteLists = nbt.getCompoundTag("whiteLists"); long capacity = 1000; - if (nbt.hasKey(GT_Values.NBT.TANK_CAPACITY)) { - capacity = saturatedCast(nbt.getLong(GT_Values.NBT.TANK_CAPACITY)); + if (nbt.hasKey(GTValues.NBT.TANK_CAPACITY)) { + capacity = saturatedCast(nbt.getLong(GTValues.NBT.TANK_CAPACITY)); } for (int i = 0; i < MAX_PROCESSES; i++) { @@ -178,8 +178,8 @@ public class AdvChemicalProcessor } @Override - public GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + public MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); tt.addMachineType("Chemical Reactor") .addInfo("Controller block for the Advanced Chemical Processor") .addInfo("Does not lose efficiency when overclocked") @@ -188,7 +188,7 @@ public class AdvChemicalProcessor .addInfo("By using the whitelist filter a recipe can push its output") .addInfo("to a different recipes input to chain them") .addInfo("Disclaimer: Still WIP - Use at your own risk") - .addInfo(GT_Values.Authorminecraft7771) + .addInfo(GTValues.Authorminecraft7771) .addSeparator() .beginStructureBlock(5, 3, 3, false) .addController("Front center") @@ -348,14 +348,14 @@ public class AdvChemicalProcessor ofMuTECasings( FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN, GT_MultiTileCasing.Chemical.getCasing())) - .addElement('P', ofBlock(GregTech_API.sBlockCasings8, 1)) + .addElement('P', ofBlock(GregTechAPI.sBlockCasings8, 1)) .addElement('T', ofMuTECasings(NOTHING, MOTOR_CASINGS)) .addElement( 'W', - GT_StructureUtility.ofCoil(AdvChemicalProcessor::setCoilTier, AdvChemicalProcessor::getCoilTier)) + GTStructureUtility.ofCoil(AdvChemicalProcessor::setCoilTier, AdvChemicalProcessor::getCoilTier)) .addElement('G', Glasses.chainAllGlasses()) - .addElement('B', ofBlock(GregTech_API.sBlockCasings4, 1)) - .addElement('F', GT_StructureUtility.ofFrame(Materials.Steel)) + .addElement('B', ofBlock(GregTechAPI.sBlockCasings4, 1)) + .addElement('F', GTStructureUtility.ofFrame(Materials.Steel)) .addElement( 'U', ofMuTECasings( @@ -384,7 +384,7 @@ public class AdvChemicalProcessor if (!widget.isClient()) widget.getContext() .openSyncedWindow(PROCESS_WINDOW_BASE_ID + processIndex); }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WHITELIST) + .setBackground(GTUITextures.BUTTON_STANDARD, GTUITextures.OVERLAY_BUTTON_WHITELIST) .setSize(18, 18) .setEnabled((widget -> processIndex < maxComplexParallels)) .setPos(20 * (i % 4) + 18, 18 + (i / 4) * 20)); @@ -396,7 +396,7 @@ public class AdvChemicalProcessor .setTextColor(Color.WHITE.normal) .setTextAlignment(Alignment.Center) .addTooltip("Tier") - .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) .setSize(18, 18) .setPos(130, 85)); return child; @@ -428,7 +428,7 @@ public class AdvChemicalProcessor builder.widget( new TextWidget("Process " + processIndex).setTextAlignment(Alignment.Center) .setPos(13, 7)); - builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); builder.widget( SlotGroup.ofItemHandler(processWhitelistInventoryHandlers.get(processIndex), 4) .startFromSlot(0) diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java index e8e31ba32c..b208e27fe3 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java @@ -23,12 +23,12 @@ import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; import com.gtnewhorizons.modularui.common.widget.DrawableWidget; import com.gtnewhorizons.modularui.common.widget.TextWidget; -import gregtech.GT_Mod; -import gregtech.api.enums.GT_Values; +import gregtech.GTMod; +import gregtech.api.enums.GTValues; import gregtech.api.multitileentity.enums.GT_MultiTileCasing; import gregtech.api.multitileentity.multiblock.base.Controller; import gregtech.api.task.tasks.PollutionTask; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.common.tileentities.machines.multiblock.logic.CokeOvenProcessingLogic; public class CokeOven extends Controller { @@ -73,14 +73,14 @@ public class CokeOven extends Controller { } @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); tt.addMachineType("Coke Oven") .addInfo("Used for charcoal") .beginStructureBlock(3, 3, 3, true) .addCasingInfoExactly("Coke Oven Bricks", 25, false) .addPollutionAmount(POLLUTION_AMOUNT) - .toolTipFinisher(GT_Values.AuthorBlueWeabo); + .toolTipFinisher(GTValues.AuthorBlueWeabo); return tt; } @@ -125,7 +125,7 @@ public class CokeOven extends Controller { final TextWidget text = new TextWidget(title).setDefaultColor(getTitleColor()) .setTextAlignment(Alignment.CenterLeft) .setMaxWidth(titleWidth); - if (GT_Mod.gregtechproxy.mTitleTabStyle == 1) { + if (GTMod.gregtechproxy.mTitleTabStyle == 1) { tab.setDrawable(getGUITextureSet().getTitleTabAngular()) .setPos(0, -(titleHeight + TAB_PADDING) + 1) .setSize(getGUIWidth(), titleHeight + TAB_PADDING * 2); diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java index 59efd46c94..d4ac6241d2 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java @@ -13,14 +13,14 @@ import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureDefinition; import com.gtnewhorizon.structurelib.util.Vec3Impl; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.HeatingCoilLevel; import gregtech.api.enums.Materials; import gregtech.api.multitileentity.enums.GT_MultiTileCasing; import gregtech.api.multitileentity.multiblock.base.StackableController; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.common.tileentities.machines.multiblock.logic.DistillationTowerProcessingLogic; public class DistillationTower extends StackableController { @@ -45,12 +45,12 @@ public class DistillationTower extends StackableController {}, (tile) -> HeatingCoilLevel.None)) + .addElement('D', GTStructureUtility.ofCoil((tile, meta) -> {}, (tile) -> HeatingCoilLevel.None)) .build(); } return STRUCTURE_DEFINITION_MEGA; diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java index d4a7283f3e..36a1271e0d 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java @@ -25,15 +25,15 @@ import com.gtnewhorizons.modularui.common.widget.ButtonWidget; import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.Materials; -import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.gui.modularui.GTUITextures; import gregtech.api.multitileentity.enums.GT_MultiTileCasing; import gregtech.api.multitileentity.multiblock.base.ComplexParallelController; import gregtech.api.recipe.RecipeMap; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_StructureUtility; +import gregtech.api.util.GTStructureUtility; +import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.common.tileentities.machines.multiblock.logic.LaserEngraverProcessingLogic; public class LaserEngraver extends ComplexParallelController { @@ -208,7 +208,7 @@ public class LaserEngraver extends ComplexParallelController processIndex < maxComplexParallels)) .setPos(20 * (i % 4) + 18, 18 + (i / 4) * 20)); @@ -256,7 +256,7 @@ public class LaserEngraver extends ComplexParallelController { @@ -75,8 +75,8 @@ public class Macerator extends StackableController { @@ -48,20 +48,20 @@ public class CokeOvenProcessingLogic extends MuTEProcessingLogic getRecipeMap() { - return RecipeMaps.alloySmelterRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_INDUCTION_LOOP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java deleted file mode 100644 index 8b96906da1..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java +++ /dev/null @@ -1,139 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_AlloySmelter_Steel extends GT_MetaTileEntity_BasicMachine_Steel { - - public GT_MetaTileEntity_AlloySmelter_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Combination Smelter", 2, 1, true); - } - - public GT_MetaTileEntity_AlloySmelter_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 2, 1, true); - } - - @Override - protected boolean isBricked() { - return true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_AlloySmelter_Steel(mName, mDescriptionArray, mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.alloySmelterRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_INDUCTION_LOOP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java deleted file mode 100644 index ef91ed5baf..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java +++ /dev/null @@ -1,134 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_GLOW; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Compressor_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze { - - public GT_MetaTileEntity_Compressor_Bronze(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Compressing Items", 1, 1, false); - } - - public GT_MetaTileEntity_Compressor_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, false); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Compressor_Bronze(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.compressorRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_COMPRESSOR_OP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java deleted file mode 100644 index c213cf04f5..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java +++ /dev/null @@ -1,134 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_GLOW; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Compressor_Steel extends GT_MetaTileEntity_BasicMachine_Steel { - - public GT_MetaTileEntity_Compressor_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Compressing Items", 1, 1, true); - } - - public GT_MetaTileEntity_Compressor_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, true); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Compressor_Steel(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.compressorRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_COMPRESSOR_OP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java deleted file mode 100644 index 6e986992f3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java +++ /dev/null @@ -1,134 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_GLOW; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Extractor_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze { - - public GT_MetaTileEntity_Extractor_Bronze(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Extracting your first Rubber", 1, 1, false); - } - - public GT_MetaTileEntity_Extractor_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, false); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Extractor_Bronze(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.extractorRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_EXTRACTOR_OP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java deleted file mode 100644 index 6a3d024e25..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java +++ /dev/null @@ -1,134 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_GLOW; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Extractor_Steel extends GT_MetaTileEntity_BasicMachine_Steel { - - public GT_MetaTileEntity_Extractor_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Extracting your first Rubber", 1, 1, true); - } - - public GT_MetaTileEntity_Extractor_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, true); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Extractor_Steel(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.extractorRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_EXTRACTOR_OP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java deleted file mode 100644 index b7d25ac172..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java +++ /dev/null @@ -1,202 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_GLOW; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.block.Block; -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; - -public class GT_MetaTileEntity_ForgeHammer_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze { - - public GT_MetaTileEntity_ForgeHammer_Bronze(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Forge Hammer", 1, 1, false); - } - - public GT_MetaTileEntity_ForgeHammer_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, false); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ForgeHammer_Bronze(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.hammerRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.RANDOM_ANVIL_USE, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - /** - * Handles {@link Block#randomDisplayTick}. Draws Random Sparkles at main face. - * - * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - - // Random Sparkles at main face - if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) { - - final ForgeDirection mainFacing = this.mMainFacing; - - if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 - && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) { - - final double oX = aBaseMetaTileEntity.getXCoord(); - final double oY = aBaseMetaTileEntity.getYCoord(); - final double oZ = aBaseMetaTileEntity.getZCoord(); - final double offset = 0.02D; - final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; - - final double x, y, z, mX, mZ; - - y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; - - if (mainFacing == ForgeDirection.WEST) { - x = oX - offset; - mX = -.05D; - z = oZ + horizontal; - mZ = 0D; - } else if (mainFacing == ForgeDirection.EAST) { - x = oX + offset; - mX = .05D; - z = oZ + horizontal; - mZ = 0D; - } else if (mainFacing == ForgeDirection.NORTH) { - x = oX + horizontal; - mX = 0D; - z = oZ - offset; - mZ = -.05D; - } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) - { - x = oX + horizontal; - mX = 0D; - z = oZ + offset; - mZ = .05D; - } - - ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ) - .setPosition(x, y, z) - .setWorld(getBaseMetaTileEntity().getWorld()); - particleEventBuilder.setIdentifier(ParticleFX.LAVA) - .run(); - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java deleted file mode 100644 index 25785f3fa3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java +++ /dev/null @@ -1,202 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_GLOW; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.block.Block; -import net.minecraftforge.common.util.ForgeDirection; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; - -public class GT_MetaTileEntity_ForgeHammer_Steel extends GT_MetaTileEntity_BasicMachine_Steel { - - public GT_MetaTileEntity_ForgeHammer_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Forge Hammer", 1, 1, true); - } - - public GT_MetaTileEntity_ForgeHammer_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, true); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ForgeHammer_Steel(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.hammerRecipes; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.RANDOM_ANVIL_USE, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER_ACTIVE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_GLOW) - .glow() - .build() }; - } - - /** - * Handles {@link Block#randomDisplayTick}. Draws Random Sparkles at main face. - * - * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick} - */ - @SideOnly(Side.CLIENT) - @Override - public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { - - // Random Sparkles at main face - if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) { - - final ForgeDirection mainFacing = this.mMainFacing; - - if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 - && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) { - - final double oX = aBaseMetaTileEntity.getXCoord(); - final double oY = aBaseMetaTileEntity.getYCoord(); - final double oZ = aBaseMetaTileEntity.getZCoord(); - final double offset = 0.02D; - final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; - - final double x, y, z, mX, mZ; - - y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; - - if (mainFacing == ForgeDirection.WEST) { - x = oX - offset; - mX = -.05D; - z = oZ + horizontal; - mZ = 0D; - } else if (mainFacing == ForgeDirection.EAST) { - x = oX + offset; - mX = .05D; - z = oZ + horizontal; - mZ = 0D; - } else if (mainFacing == ForgeDirection.NORTH) { - x = oX + horizontal; - mX = 0D; - z = oZ - offset; - mZ = -.05D; - } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) - { - x = oX + horizontal; - mX = 0D; - z = oZ + offset; - mZ = .05D; - } - - ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ) - .setPosition(x, y, z) - .setWorld(getBaseMetaTileEntity().getWorld()); - particleEventBuilder.setIdentifier(ParticleFX.LAVA) - .run(); - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java deleted file mode 100644 index 51a91874a0..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java +++ /dev/null @@ -1,161 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_GLOW; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Furnace_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze { - - public GT_MetaTileEntity_Furnace_Bronze(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Smelting things with compressed Steam", 1, 1, false); - } - - public GT_MetaTileEntity_Furnace_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, false); - } - - @Override - protected boolean isBricked() { - return true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Furnace_Bronze(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.furnaceRecipes; - } - - @Override - public int checkRecipe() { - if (null != (this.mOutputItems[0] = GT_ModHandler.getSmeltingOutput(getInputAt(0), true, getOutputAt(0)))) { - this.mEUt = 4; - this.mMaxProgresstime = 256; - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - return DID_NOT_FIND_RECIPE; - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(64, aStack), false, null) != null; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_FURNACE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_FURNACE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_FURNACE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of( - TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE), - TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_GLOW) - .glow() - .build()) }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java deleted file mode 100644 index a151c724f3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java +++ /dev/null @@ -1,159 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_GLOW; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_Furnace_Steel extends GT_MetaTileEntity_BasicMachine_Steel { - - public GT_MetaTileEntity_Furnace_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Smelting things with compressed Steam", 1, 1, true); - } - - public GT_MetaTileEntity_Furnace_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, true); - } - - @Override - protected boolean isBricked() { - return true; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Furnace_Steel(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.furnaceRecipes; - } - - @Override - public int checkRecipe() { - if (null != (this.mOutputItems[0] = GT_ModHandler.getSmeltingOutput(getInputAt(0), true, getOutputAt(0)))) { - this.mEUt = 8; - this.mMaxProgresstime = 128; - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - return DID_NOT_FIND_RECIPE; - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(64, aStack), false, null) != null; - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_FURNACE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_FURNACE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_FURNACE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java deleted file mode 100644 index cdbf9f2123..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java +++ /dev/null @@ -1,189 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_GLOW; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.TierEU; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; - -public class GT_MetaTileEntity_Macerator_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze { - - public GT_MetaTileEntity_Macerator_Bronze(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Macerating your Ores", 1, 1, false); - } - - public GT_MetaTileEntity_Macerator_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, false); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Macerator_Bronze(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPreTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) { - - if (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP - && aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) { - - new ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D) - .setIdentifier(ParticleFX.SMOKE) - .setPosition( - aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F, - aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F, - aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F) - .setWorld(getBaseMetaTileEntity().getWorld()) - .run(); - } - } - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.maceratorRecipes; - } - - @Override - public int checkRecipe() { - GT_Recipe tRecipe = getRecipeMap() - .findRecipe(getBaseMetaTileEntity(), mLastRecipe, false, TierEU.LV, null, null, getAllInputs()); - if (tRecipe == null) return DID_NOT_FIND_RECIPE; - if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe; - if (!canOutput(tRecipe)) { - mOutputBlocked++; - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - } - - if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs())) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - if (tRecipe.getOutput(0) != null) mOutputItems[0] = tRecipe.getOutput(0); - calculateCustomOverclock(tRecipe); - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - - @Override - protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && RecipeMaps.maceratorRecipes.containsInput(GT_Utility.copyAmount(64, aStack)); - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_MACERATOR_OP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java deleted file mode 100644 index 95d510ffa3..0000000000 --- a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java +++ /dev/null @@ -1,188 +0,0 @@ -package gregtech.common.tileentities.machines.steam; - -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_GLOW; -import static gregtech.api.objects.XSTR.XSTR_INSTANCE; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.enums.ParticleFX; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.TierEU; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.api.util.WorldSpawnedEventBuilder; - -public class GT_MetaTileEntity_Macerator_Steel extends GT_MetaTileEntity_BasicMachine_Steel { - - public GT_MetaTileEntity_Macerator_Steel(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional, "Macerating your Ores", 1, 1, true); - } - - public GT_MetaTileEntity_Macerator_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aDescription, aTextures, 1, 1, true); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Macerator_Steel(this.mName, this.mDescriptionArray, this.mTextures); - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPreTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) { - if (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP - && aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0 - && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) { - - new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D) - .setIdentifier(ParticleFX.SMOKE) - .setPosition( - aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F, - aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F, - aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F) - .setWorld(getBaseMetaTileEntity().getWorld()) - .run(); - } - } - } - - @Override - public RecipeMap getRecipeMap() { - return RecipeMaps.maceratorRecipes; - } - - @Override - public int checkRecipe() { - GT_Recipe tRecipe = getRecipeMap() - .findRecipe(getBaseMetaTileEntity(), mLastRecipe, false, TierEU.LV, null, null, getAllInputs()); - if (tRecipe == null) return DID_NOT_FIND_RECIPE; - if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe; - if (!canOutput(tRecipe)) { - mOutputBlocked++; - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - } - - if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs())) - return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; - if (tRecipe.getOutput(0) != null) mOutputItems[0] = tRecipe.getOutput(0); - calculateCustomOverclock(tRecipe); - return FOUND_AND_SUCCESSFULLY_USED_RECIPE; - } - - @Override - public boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) - && RecipeMaps.maceratorRecipes.containsInput(GT_Utility.copyAmount(64, aStack)); - } - - @Override - public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { - super.startSoundLoop(aIndex, aX, aY, aZ); - if (aIndex == 1) { - GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_MACERATOR_OP, 10, 1.0F, aX, aY, aZ); - } - } - - @Override - public void startProcess() { - sendLoopStart((byte) 1); - } - - @Override - public ITexture[] getSideFacingActive(byte aColor) { - return new ITexture[] { super.getSideFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getSideFacingInactive(byte aColor) { - return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR), - TextureFactory.builder() - .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingActive(byte aColor) { - return new ITexture[] { super.getFrontFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getFrontFacingInactive(byte aColor) { - return new ITexture[] { super.getFrontFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingActive(byte aColor) { - return new ITexture[] { super.getTopFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getTopFacingInactive(byte aColor) { - return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR), - TextureFactory.builder() - .addIcon(OVERLAY_TOP_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingActive(byte aColor) { - return new ITexture[] { super.getBottomFacingActive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW) - .glow() - .build() }; - } - - @Override - public ITexture[] getBottomFacingInactive(byte aColor) { - return new ITexture[] { super.getBottomFacingInactive(aColor)[0], - TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR), TextureFactory.builder() - .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW) - .glow() - .build() }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterBronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterBronze.java new file mode 100644 index 0000000000..9953a55bca --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterBronze.java @@ -0,0 +1,139 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineBronze; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTESteamAlloySmelterBronze extends MTEBasicMachineBronze { + + public MTESteamAlloySmelterBronze(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Combination Smelter", 2, 1, false); + } + + public MTESteamAlloySmelterBronze(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 2, 1, false); + } + + @Override + protected boolean isBricked() { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamAlloySmelterBronze(mName, mDescriptionArray, mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.alloySmelterRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_INDUCTION_LOOP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterSteel.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterSteel.java new file mode 100644 index 0000000000..f60de32cea --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamAlloySmelterSteel.java @@ -0,0 +1,139 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineSteel; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTESteamAlloySmelterSteel extends MTEBasicMachineSteel { + + public MTESteamAlloySmelterSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Combination Smelter", 2, 1, true); + } + + public MTESteamAlloySmelterSteel(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 2, 1, true); + } + + @Override + protected boolean isBricked() { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamAlloySmelterSteel(mName, mDescriptionArray, mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.alloySmelterRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_INDUCTION_LOOP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorBronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorBronze.java new file mode 100644 index 0000000000..2895142f7e --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorBronze.java @@ -0,0 +1,134 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_GLOW; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineBronze; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTESteamCompressorBronze extends MTEBasicMachineBronze { + + public MTESteamCompressorBronze(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Compressing Items", 1, 1, false); + } + + public MTESteamCompressorBronze(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, false); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamCompressorBronze(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.compressorRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_COMPRESSOR_OP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorSteel.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorSteel.java new file mode 100644 index 0000000000..6fa7672d83 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamCompressorSteel.java @@ -0,0 +1,134 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_GLOW; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineSteel; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTESteamCompressorSteel extends MTEBasicMachineSteel { + + public MTESteamCompressorSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Compressing Items", 1, 1, true); + } + + public MTESteamCompressorSteel(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, true); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamCompressorSteel(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.compressorRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_COMPRESSOR_OP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorBronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorBronze.java new file mode 100644 index 0000000000..a55105841d --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorBronze.java @@ -0,0 +1,134 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_GLOW; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineBronze; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTESteamExtractorBronze extends MTEBasicMachineBronze { + + public MTESteamExtractorBronze(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Extracting your first Rubber", 1, 1, false); + } + + public MTESteamExtractorBronze(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, false); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamExtractorBronze(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.extractorRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_EXTRACTOR_OP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorSteel.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorSteel.java new file mode 100644 index 0000000000..d91ff6fb98 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamExtractorSteel.java @@ -0,0 +1,134 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_GLOW; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineSteel; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; + +public class MTESteamExtractorSteel extends MTEBasicMachineSteel { + + public MTESteamExtractorSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Extracting your first Rubber", 1, 1, true); + } + + public MTESteamExtractorSteel(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, true); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamExtractorSteel(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.extractorRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_EXTRACTOR_OP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerBronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerBronze.java new file mode 100644 index 0000000000..121778e198 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerBronze.java @@ -0,0 +1,202 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_GLOW; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.block.Block; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineBronze; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; + +public class MTESteamForgeHammerBronze extends MTEBasicMachineBronze { + + public MTESteamForgeHammerBronze(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Forge Hammer", 1, 1, false); + } + + public MTESteamForgeHammerBronze(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, false); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamForgeHammerBronze(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.hammerRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.RANDOM_ANVIL_USE, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + /** + * Handles {@link Block#randomDisplayTick}. Draws Random Sparkles at main face. + * + * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + + // Random Sparkles at main face + if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) { + + final ForgeDirection mainFacing = this.mMainFacing; + + if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 + && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) { + + final double oX = aBaseMetaTileEntity.getXCoord(); + final double oY = aBaseMetaTileEntity.getYCoord(); + final double oZ = aBaseMetaTileEntity.getZCoord(); + final double offset = 0.02D; + final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; + + final double x, y, z, mX, mZ; + + y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; + + if (mainFacing == ForgeDirection.WEST) { + x = oX - offset; + mX = -.05D; + z = oZ + horizontal; + mZ = 0D; + } else if (mainFacing == ForgeDirection.EAST) { + x = oX + offset; + mX = .05D; + z = oZ + horizontal; + mZ = 0D; + } else if (mainFacing == ForgeDirection.NORTH) { + x = oX + horizontal; + mX = 0D; + z = oZ - offset; + mZ = -.05D; + } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) + { + x = oX + horizontal; + mX = 0D; + z = oZ + offset; + mZ = .05D; + } + + ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ) + .setPosition(x, y, z) + .setWorld(getBaseMetaTileEntity().getWorld()); + particleEventBuilder.setIdentifier(ParticleFX.LAVA) + .run(); + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerSteel.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerSteel.java new file mode 100644 index 0000000000..c3410232d0 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamForgeHammerSteel.java @@ -0,0 +1,202 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_GLOW; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.block.Block; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineSteel; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; + +public class MTESteamForgeHammerSteel extends MTEBasicMachineSteel { + + public MTESteamForgeHammerSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Forge Hammer", 1, 1, true); + } + + public MTESteamForgeHammerSteel(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, true); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamForgeHammerSteel(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.hammerRecipes; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.RANDOM_ANVIL_USE, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER_ACTIVE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_GLOW) + .glow() + .build() }; + } + + /** + * Handles {@link Block#randomDisplayTick}. Draws Random Sparkles at main face. + * + * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick} + */ + @SideOnly(Side.CLIENT) + @Override + public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) { + + // Random Sparkles at main face + if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) { + + final ForgeDirection mainFacing = this.mMainFacing; + + if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 + && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) { + + final double oX = aBaseMetaTileEntity.getXCoord(); + final double oY = aBaseMetaTileEntity.getYCoord(); + final double oZ = aBaseMetaTileEntity.getZCoord(); + final double offset = 0.02D; + final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D; + + final double x, y, z, mX, mZ; + + y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D; + + if (mainFacing == ForgeDirection.WEST) { + x = oX - offset; + mX = -.05D; + z = oZ + horizontal; + mZ = 0D; + } else if (mainFacing == ForgeDirection.EAST) { + x = oX + offset; + mX = .05D; + z = oZ + horizontal; + mZ = 0D; + } else if (mainFacing == ForgeDirection.NORTH) { + x = oX + horizontal; + mX = 0D; + z = oZ - offset; + mZ = -.05D; + } else // if (frontFacing == ForgeDirection.SOUTH.ordinal()) + { + x = oX + horizontal; + mX = 0D; + z = oZ + offset; + mZ = .05D; + } + + ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ) + .setPosition(x, y, z) + .setWorld(getBaseMetaTileEntity().getWorld()); + particleEventBuilder.setIdentifier(ParticleFX.LAVA) + .run(); + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceBronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceBronze.java new file mode 100644 index 0000000000..419ad9a1cd --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceBronze.java @@ -0,0 +1,161 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_GLOW; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineBronze; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class MTESteamFurnaceBronze extends MTEBasicMachineBronze { + + public MTESteamFurnaceBronze(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Smelting things with compressed Steam", 1, 1, false); + } + + public MTESteamFurnaceBronze(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, false); + } + + @Override + protected boolean isBricked() { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamFurnaceBronze(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.furnaceRecipes; + } + + @Override + public int checkRecipe() { + if (null != (this.mOutputItems[0] = GTModHandler.getSmeltingOutput(getInputAt(0), true, getOutputAt(0)))) { + this.mEUt = 4; + this.mMaxProgresstime = 256; + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + return DID_NOT_FIND_RECIPE; + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && GTModHandler.getSmeltingOutput(GTUtility.copyAmount(64, aStack), false, null) != null; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_FURNACE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_FURNACE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_FURNACE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of( + TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE), + TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_GLOW) + .glow() + .build()) }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceSteel.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceSteel.java new file mode 100644 index 0000000000..dd9dff4be4 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamFurnaceSteel.java @@ -0,0 +1,159 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_GLOW; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineSteel; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class MTESteamFurnaceSteel extends MTEBasicMachineSteel { + + public MTESteamFurnaceSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Smelting things with compressed Steam", 1, 1, true); + } + + public MTESteamFurnaceSteel(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, true); + } + + @Override + protected boolean isBricked() { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamFurnaceSteel(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.furnaceRecipes; + } + + @Override + public int checkRecipe() { + if (null != (this.mOutputItems[0] = GTModHandler.getSmeltingOutput(getInputAt(0), true, getOutputAt(0)))) { + this.mEUt = 8; + this.mMaxProgresstime = 128; + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + return DID_NOT_FIND_RECIPE; + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && GTModHandler.getSmeltingOutput(GTUtility.copyAmount(64, aStack), false, null) != null; + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_FURNACE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_FURNACE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_FURNACE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorBronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorBronze.java new file mode 100644 index 0000000000..441bf266bf --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorBronze.java @@ -0,0 +1,189 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_GLOW; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.TierEU; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineBronze; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; + +public class MTESteamMaceratorBronze extends MTEBasicMachineBronze { + + public MTESteamMaceratorBronze(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Macerating your Ores", 1, 1, false); + } + + public MTESteamMaceratorBronze(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, false); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamMaceratorBronze(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) { + + if (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP + && aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) { + + new ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D) + .setIdentifier(ParticleFX.SMOKE) + .setPosition( + aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F, + aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F, + aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F) + .setWorld(getBaseMetaTileEntity().getWorld()) + .run(); + } + } + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.maceratorRecipes; + } + + @Override + public int checkRecipe() { + GTRecipe tRecipe = getRecipeMap() + .findRecipe(getBaseMetaTileEntity(), mLastRecipe, false, TierEU.LV, null, null, getAllInputs()); + if (tRecipe == null) return DID_NOT_FIND_RECIPE; + if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe; + if (!canOutput(tRecipe)) { + mOutputBlocked++; + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + } + + if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs())) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + if (tRecipe.getOutput(0) != null) mOutputItems[0] = tRecipe.getOutput(0); + calculateCustomOverclock(tRecipe); + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + + @Override + protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && RecipeMaps.maceratorRecipes.containsInput(GTUtility.copyAmount(64, aStack)); + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_MACERATOR_OP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorSteel.java b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorSteel.java new file mode 100644 index 0000000000..226d0d387a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/steam/MTESteamMaceratorSteel.java @@ -0,0 +1,188 @@ +package gregtech.common.tileentities.machines.steam; + +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_GLOW; +import static gregtech.api.objects.XSTR.XSTR_INSTANCE; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.enums.ParticleFX; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.TierEU; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicMachineSteel; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder; + +public class MTESteamMaceratorSteel extends MTEBasicMachineSteel { + + public MTESteamMaceratorSteel(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, "Macerating your Ores", 1, 1, true); + } + + public MTESteamMaceratorSteel(String aName, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aDescription, aTextures, 1, 1, true); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESteamMaceratorSteel(this.mName, this.mDescriptionArray, this.mTextures); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) { + if (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP + && aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0 + && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) { + + new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D) + .setIdentifier(ParticleFX.SMOKE) + .setPosition( + aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F, + aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F, + aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F) + .setWorld(getBaseMetaTileEntity().getWorld()) + .run(); + } + } + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.maceratorRecipes; + } + + @Override + public int checkRecipe() { + GTRecipe tRecipe = getRecipeMap() + .findRecipe(getBaseMetaTileEntity(), mLastRecipe, false, TierEU.LV, null, null, getAllInputs()); + if (tRecipe == null) return DID_NOT_FIND_RECIPE; + if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe; + if (!canOutput(tRecipe)) { + mOutputBlocked++; + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + } + + if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs())) + return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; + if (tRecipe.getOutput(0) != null) mOutputItems[0] = tRecipe.getOutput(0); + calculateCustomOverclock(tRecipe); + return FOUND_AND_SUCCESSFULLY_USED_RECIPE; + } + + @Override + public boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) + && RecipeMaps.maceratorRecipes.containsInput(GTUtility.copyAmount(64, aStack)); + } + + @Override + public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) { + super.startSoundLoop(aIndex, aX, aY, aZ); + if (aIndex == 1) { + GTUtility.doSoundAtClient(SoundResource.IC2_MACHINES_MACERATOR_OP, 10, 1.0F, aX, aY, aZ); + } + } + + @Override + public void startProcess() { + sendLoopStart((byte) 1); + } + + @Override + public ITexture[] getSideFacingActive(byte aColor) { + return new ITexture[] { super.getSideFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getSideFacingInactive(byte aColor) { + return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR), + TextureFactory.builder() + .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingActive(byte aColor) { + return new ITexture[] { super.getFrontFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getFrontFacingInactive(byte aColor) { + return new ITexture[] { super.getFrontFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR), TextureFactory.builder() + .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingActive(byte aColor) { + return new ITexture[] { super.getTopFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getTopFacingInactive(byte aColor) { + return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR), + TextureFactory.builder() + .addIcon(OVERLAY_TOP_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingActive(byte aColor) { + return new ITexture[] { super.getBottomFacingActive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW) + .glow() + .build() }; + } + + @Override + public ITexture[] getBottomFacingInactive(byte aColor) { + return new ITexture[] { super.getBottomFacingInactive(aColor)[0], + TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR), TextureFactory.builder() + .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW) + .glow() + .build() }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/render/TileDrone.java b/src/main/java/gregtech/common/tileentities/render/TileDrone.java deleted file mode 100644 index 625157ff37..0000000000 --- a/src/main/java/gregtech/common/tileentities/render/TileDrone.java +++ /dev/null @@ -1,24 +0,0 @@ -package gregtech.common.tileentities.render; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; - -public class TileDrone extends TileEntity { - - public double rotation = 0; - - @Override - public AxisAlignedBB getRenderBoundingBox() { - return INFINITE_EXTENT_AABB; - } - - @Override - public double getMaxRenderDistanceSquared() { - return 65536; - } - - @Override - public void updateEntity() { - rotation = (rotation + 50) % 360d; - } -} diff --git a/src/main/java/gregtech/common/tileentities/render/TileEntityDrone.java b/src/main/java/gregtech/common/tileentities/render/TileEntityDrone.java new file mode 100644 index 0000000000..e6f292d895 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/render/TileEntityDrone.java @@ -0,0 +1,24 @@ +package gregtech.common.tileentities.render; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; + +public class TileEntityDrone extends TileEntity { + + public double rotation = 0; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return INFINITE_EXTENT_AABB; + } + + @Override + public double getMaxRenderDistanceSquared() { + return 65536; + } + + @Override + public void updateEntity() { + rotation = (rotation + 50) % 360d; + } +} diff --git a/src/main/java/gregtech/common/tileentities/render/TileEntityLaser.java b/src/main/java/gregtech/common/tileentities/render/TileEntityLaser.java new file mode 100644 index 0000000000..b719039fe0 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/render/TileEntityLaser.java @@ -0,0 +1,116 @@ +package gregtech.common.tileentities.render; + +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 com.gtnewhorizon.structurelib.alignment.enumerable.Flip; +import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; + +public class TileEntityLaser extends TileEntity { + + public boolean shouldRender = false; + public float red = 0, green = 0, blue = 0; + public float counter = 0F; + public boolean realism = false; + public double rotAxisX = 0, rotAxisY = 0, rotAxisZ = 0, rotationAngle = 0; + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + compound.setFloat("rgb_red", red); + compound.setFloat("rgb_green", green); + compound.setFloat("rgb_blue", blue); + compound.setBoolean("shouldRender", shouldRender); + compound.setDouble("rotAxisX", rotAxisX); + compound.setDouble("rotAxisY", rotAxisY); + compound.setDouble("rotAxisZ", rotAxisZ); + compound.setDouble("rotationAngle", rotationAngle); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + red = compound.getFloat("rgb_red"); + blue = compound.getFloat("rgb_blue"); + green = compound.getFloat("rgb_green"); + shouldRender = compound.getBoolean("shouldRender"); + rotAxisX = compound.getDouble("rotAxisX"); + rotAxisY = compound.getDouble("rotAxisY"); + rotAxisZ = compound.getDouble("rotAxisZ"); + rotationAngle = compound.getDouble("rotationAngle"); + } + + public void setColors(float red, float green, float blue) { + this.red = red; + this.green = green; + this.blue = blue; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public void setRotationFields(ForgeDirection direction, Rotation rotation, Flip flip) { + setRotationAngle(rotation, flip); + setRotationAxis(direction); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + private void setRotationAngle(Rotation rotation, Flip flip) { + int invert = (flip == Flip.HORIZONTAL || flip == Flip.VERTICAL) ? 1 : -1; + switch (rotation) { + case NORMAL -> rotationAngle = 0; + case CLOCKWISE -> rotationAngle = 90 * invert; + case COUNTER_CLOCKWISE -> rotationAngle = -90 * invert; + case UPSIDE_DOWN -> rotationAngle = 180; + } + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public void setRotationAxis(ForgeDirection direction) { + rotAxisX = direction.offsetX; + rotAxisY = direction.offsetY; + rotAxisZ = direction.offsetZ; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public void setShouldRender(boolean shouldRender) { + this.shouldRender = shouldRender; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public Boolean getShouldRender() { + return shouldRender; + } + + public float getRed() { + return red; + } + + public float getGreen() { + return green; + } + + public float getBlue() { + return blue; + } + + @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()); + worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord); + } + + @Override + public double getMaxRenderDistanceSquared() { + return 4096; + } +} diff --git a/src/main/java/gregtech/common/tileentities/render/TileEntityWormhole.java b/src/main/java/gregtech/common/tileentities/render/TileEntityWormhole.java new file mode 100644 index 0000000000..f3385b5ed6 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/render/TileEntityWormhole.java @@ -0,0 +1,87 @@ +package gregtech.common.tileentities.render; + +import java.util.Optional; + +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.world.World; +import net.minecraft.world.WorldProvider; + +import gtneioreplugin.plugin.block.ModBlocks; +import gtneioreplugin.util.DimensionHelper; + +public class TileEntityWormhole extends TileEntity { + + public int dimID = 0; + + public double targetRadius = 0; + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + compound.setInteger("dimID", dimID); + compound.setDouble("targetRadius", targetRadius); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + dimID = compound.getInteger("dimID"); + targetRadius = compound.getDouble("targetRadius"); + } + + public int getDimFromWorld(World target) { + if (target == null) return 0; + String dimName = Optional.ofNullable(target.provider) + .map(WorldProvider::getDimensionName) + .orElse(null); + if (dimName == null) return 0; + for (int i = 0; i < DimensionHelper.DimName.length; i++) { + if (dimName.equals(DimensionHelper.DimName[i])) return i; + } + return 0; + } + + public void setDimFromWorld(World target) { + int newName = getDimFromWorld(target); + if (target != null & dimID != newName) { + dimID = newName; + this.markDirty(); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + public void setRadius(double target) { + targetRadius = target; + this.markDirty(); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public Block getBlock() { + return ModBlocks.getBlock(DimensionHelper.DimNameDisplayed[dimID]); + } + + @Override + public double getMaxRenderDistanceSquared() { + return 65536; + } + + @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()); + worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord); + } + +} diff --git a/src/main/java/gregtech/common/tileentities/render/TileLaser.java b/src/main/java/gregtech/common/tileentities/render/TileLaser.java deleted file mode 100644 index 848eecdcf2..0000000000 --- a/src/main/java/gregtech/common/tileentities/render/TileLaser.java +++ /dev/null @@ -1,116 +0,0 @@ -package gregtech.common.tileentities.render; - -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 com.gtnewhorizon.structurelib.alignment.enumerable.Flip; -import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; - -public class TileLaser extends TileEntity { - - public boolean shouldRender = false; - public float red = 0, green = 0, blue = 0; - public float counter = 0F; - public boolean realism = false; - public double rotAxisX = 0, rotAxisY = 0, rotAxisZ = 0, rotationAngle = 0; - - @Override - public void writeToNBT(NBTTagCompound compound) { - super.writeToNBT(compound); - compound.setFloat("rgb_red", red); - compound.setFloat("rgb_green", green); - compound.setFloat("rgb_blue", blue); - compound.setBoolean("shouldRender", shouldRender); - compound.setDouble("rotAxisX", rotAxisX); - compound.setDouble("rotAxisY", rotAxisY); - compound.setDouble("rotAxisZ", rotAxisZ); - compound.setDouble("rotationAngle", rotationAngle); - } - - @Override - public void readFromNBT(NBTTagCompound compound) { - super.readFromNBT(compound); - red = compound.getFloat("rgb_red"); - blue = compound.getFloat("rgb_blue"); - green = compound.getFloat("rgb_green"); - shouldRender = compound.getBoolean("shouldRender"); - rotAxisX = compound.getDouble("rotAxisX"); - rotAxisY = compound.getDouble("rotAxisY"); - rotAxisZ = compound.getDouble("rotAxisZ"); - rotationAngle = compound.getDouble("rotationAngle"); - } - - public void setColors(float red, float green, float blue) { - this.red = red; - this.green = green; - this.blue = blue; - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - - public void setRotationFields(ForgeDirection direction, Rotation rotation, Flip flip) { - setRotationAngle(rotation, flip); - setRotationAxis(direction); - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - - private void setRotationAngle(Rotation rotation, Flip flip) { - int invert = (flip == Flip.HORIZONTAL || flip == Flip.VERTICAL) ? 1 : -1; - switch (rotation) { - case NORMAL -> rotationAngle = 0; - case CLOCKWISE -> rotationAngle = 90 * invert; - case COUNTER_CLOCKWISE -> rotationAngle = -90 * invert; - case UPSIDE_DOWN -> rotationAngle = 180; - } - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - - public void setRotationAxis(ForgeDirection direction) { - rotAxisX = direction.offsetX; - rotAxisY = direction.offsetY; - rotAxisZ = direction.offsetZ; - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - - public void setShouldRender(boolean shouldRender) { - this.shouldRender = shouldRender; - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - - public Boolean getShouldRender() { - return shouldRender; - } - - public float getRed() { - return red; - } - - public float getGreen() { - return green; - } - - public float getBlue() { - return blue; - } - - @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()); - worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord); - } - - @Override - public double getMaxRenderDistanceSquared() { - return 4096; - } -} diff --git a/src/main/java/gregtech/common/tileentities/render/TileWormhole.java b/src/main/java/gregtech/common/tileentities/render/TileWormhole.java deleted file mode 100644 index d482fd7ce1..0000000000 --- a/src/main/java/gregtech/common/tileentities/render/TileWormhole.java +++ /dev/null @@ -1,87 +0,0 @@ -package gregtech.common.tileentities.render; - -import java.util.Optional; - -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.world.World; -import net.minecraft.world.WorldProvider; - -import pers.gwyog.gtneioreplugin.plugin.block.ModBlocks; -import pers.gwyog.gtneioreplugin.util.DimensionHelper; - -public class TileWormhole extends TileEntity { - - public int dimID = 0; - - public double targetRadius = 0; - - @Override - public void writeToNBT(NBTTagCompound compound) { - super.writeToNBT(compound); - compound.setInteger("dimID", dimID); - compound.setDouble("targetRadius", targetRadius); - } - - @Override - public void readFromNBT(NBTTagCompound compound) { - super.readFromNBT(compound); - dimID = compound.getInteger("dimID"); - targetRadius = compound.getDouble("targetRadius"); - } - - public int getDimFromWorld(World target) { - if (target == null) return 0; - String dimName = Optional.ofNullable(target.provider) - .map(WorldProvider::getDimensionName) - .orElse(null); - if (dimName == null) return 0; - for (int i = 0; i < DimensionHelper.DimName.length; i++) { - if (dimName.equals(DimensionHelper.DimName[i])) return i; - } - return 0; - } - - public void setDimFromWorld(World target) { - int newName = getDimFromWorld(target); - if (target != null & dimID != newName) { - dimID = newName; - this.markDirty(); - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - } - - public void setRadius(double target) { - targetRadius = target; - this.markDirty(); - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - - public Block getBlock() { - return ModBlocks.getBlock(DimensionHelper.DimNameDisplayed[dimID]); - } - - @Override - public double getMaxRenderDistanceSquared() { - return 65536; - } - - @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()); - worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord); - } - -} diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java deleted file mode 100644 index 1576f61ff8..0000000000 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java +++ /dev/null @@ -1,559 +0,0 @@ -package gregtech.common.tileentities.storage; - -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCHEST; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCHEST_GLOW; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.IMEMonitorHandlerReceiver; -import appeng.api.storage.StorageChannel; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.storage.data.IItemList; -import appeng.util.item.AEItemStack; -import appeng.util.item.ItemList; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; -import gregtech.api.objects.AE2DigitalChestHandler; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public abstract class GT_MetaTileEntity_DigitalChestBase extends GT_MetaTileEntity_TieredMachineBlock - implements IMEMonitor, IAddUIWidgets { - - protected boolean mVoidOverflow = false; - protected boolean mDisableFilter; - private Map, Object> listeners = null; - - public GT_MetaTileEntity_DigitalChestBase(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 3, - new String[] { "This Chest stores " + GT_Utility.formatNumbers(commonSizeCompute(aTier)) + " Blocks", - "Use a screwdriver to enable", "voiding items on overflow", "Will keep its contents when harvested", }); - } - - protected static int commonSizeCompute(int tier) { - return switch (tier) { - case 1 -> 4000000; - case 2 -> 8000000; - case 3 -> 16000000; - case 4 -> 32000000; - case 5 -> 64000000; - case 6 -> 128000000; - case 7 -> 256000000; - case 8 -> 512000000; - case 9 -> 1024000000; - case 10 -> 2147483640; - default -> 0; - }; - } - - public GT_MetaTileEntity_DigitalChestBase(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_DigitalChestBase(String aName, int aTier, String[] aDescription, - ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - @Override - public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { - if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("mItemStack")) { - final ItemStack tContents = ItemStack - .loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("mItemStack")); - final int tSize = stack.stackTagCompound.getInteger("mItemCount"); - if (tContents != null && tSize > 0) { - tooltip.add( - GT_LanguageManager.addStringLocalization("TileEntity_CHEST_INFO", "Contains Item: ") - + EnumChatFormatting.YELLOW - + tContents.getDisplayName() - + EnumChatFormatting.GRAY); - tooltip.add( - GT_LanguageManager.addStringLocalization("TileEntity_CHEST_AMOUNT", "Item Amount: ") - + EnumChatFormatting.GREEN - + GT_Utility.formatNumbers(tSize) - + EnumChatFormatting.GRAY); - } - } - } - - public static void registerAEIntegration() { - appeng.api.AEApi.instance() - .registries() - .externalStorage() - .addExternalStorageInterface(new AE2DigitalChestHandler()); - } - - @Override - public void addListener(IMEMonitorHandlerReceiver imeMonitorHandlerReceiver, Object o) { - if (listeners == null) listeners = new HashMap<>(); - listeners.put(imeMonitorHandlerReceiver, o); - } - - @Override - public void removeListener(IMEMonitorHandlerReceiver imeMonitorHandlerReceiver) { - if (listeners == null) listeners = new HashMap<>(); - listeners.remove(imeMonitorHandlerReceiver); - } - - @Override - public appeng.api.config.AccessRestriction getAccess() { - return appeng.api.config.AccessRestriction.READ_WRITE; - } - - @Override - public boolean isPrioritized(IAEItemStack iaeItemStack) { - ItemStack s = getItemStack(); - if (s == null || iaeItemStack == null) return false; - return iaeItemStack.isSameType(s); - } - - @Override - public boolean canAccept(IAEItemStack iaeItemStack) { - ItemStack s = getItemStack(); - if (s == null || iaeItemStack == null) return true; - return iaeItemStack.isSameType(s); - } - - @Override - public int getPriority() { - return 0; - } - - @Override - public int getSlot() { - return 0; - } - - @Override - public boolean validForPass(int i) { - return true; - } - - protected abstract ItemStack getItemStack(); - - protected abstract void setItemStack(ItemStack s); - - @SuppressWarnings("unchecked") - @Override - public IItemList getAvailableItems(final IItemList out, int iteration) { - ItemStack storedStack = getItemStack(); - if (storedStack != null) { - AEItemStack s = AEItemStack.create(storedStack); - s.setStackSize(getItemCount()); - out.add(s); - } - return out; - } - - @Override - public IItemList getStorageList() { - IItemList res = new ItemList(); - ItemStack storedStack = getItemStack(); - if (storedStack != null) { - AEItemStack s = AEItemStack.create(storedStack); - s.setStackSize(getItemCount()); - res.add(s); - } - return res; - } - - protected abstract int getItemCount(); - - @Override - public abstract void setItemCount(int aCount); - - @Override - public int getMaxItemCount() { - return commonSizeCompute(mTier); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return new ITexture[0][0][0]; - } - - @Override - public IAEItemStack injectItems(final IAEItemStack input, final appeng.api.config.Actionable mode, - final appeng.api.networking.security.BaseActionSource src) { - if (getBaseMetaTileEntity() == null) return input; - - final ItemStack inputStack = input.getItemStack(); - final int maxCapacity = getMaxItemCount(); - final int itemCount = getItemCount(); - final long toAdd = input.getStackSize(); - final ItemStack storedStack = getItemStack(); - - if (storedStack != null && !GT_Utility.areStacksEqual(storedStack, inputStack)) { - // Can't stack with existing item, just return the input. - return input; - } - - // Number of items not added because there's too much to add. - final long notAdded = itemCount + toAdd - maxCapacity; - - if (mode == appeng.api.config.Actionable.MODULATE) { - final int newCount = (int) Math.min((long) maxCapacity, itemCount + toAdd); - - if (storedStack == null) { - setItemStack(inputStack.copy()); - } - setItemCount(newCount); - getBaseMetaTileEntity().markDirty(); - } - if (mVoidOverflow || notAdded <= 0) { - return null; - } else { - return input.copy() - .setStackSize(notAdded); - } - } - - @Override - public IAEItemStack extractItems(final IAEItemStack request, final appeng.api.config.Actionable mode, - final appeng.api.networking.security.BaseActionSource src) { - if (request.isSameType(getItemStack())) { - if (getBaseMetaTileEntity() == null) return null; - if (mode != appeng.api.config.Actionable.SIMULATE) getBaseMetaTileEntity().markDirty(); - if (request.getStackSize() >= getItemCount()) { - AEItemStack result = AEItemStack.create(getItemStack()); - result.setStackSize(getItemCount()); - if (mode != appeng.api.config.Actionable.SIMULATE) setItemCount(0); - return result; - } else { - if (mode != appeng.api.config.Actionable.SIMULATE) - setItemCount(getItemCount() - (int) request.getStackSize()); - return request.copy(); - } - } - return null; - } - - @Override - public StorageChannel getChannel() { - return StorageChannel.ITEMS; - } - - @Override - public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - mVoidOverflow = !mVoidOverflow; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal( - mVoidOverflow ? "GT5U.machines.digitalchest.voidoverflow.enabled" - : "GT5U.machines.digitalchest.voidoverflow.disabled")); - } - - @Override - public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, - float aX, float aY, float aZ) { - if (super.onSolderingToolRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ)) return true; - mDisableFilter = !mDisableFilter; - GT_Utility.sendChatToPlayer( - aPlayer, - StatCollector.translateToLocal( - mDisableFilter ? "GT5U.machines.digitalchest.inputfilter.disabled" - : "GT5U.machines.digitalchest.inputfilter.enabled")); - return true; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { - - if (getBaseMetaTileEntity().isServerSide() && getBaseMetaTileEntity().isAllowedToWork()) { - if ((getItemCount() <= 0)) { - setItemStack(null); - setItemCount(0); - } - if (getItemStack() == null && mInventory[0] != null) { - setItemStack(mInventory[0].copy()); - } - int count = getItemCount(); - ItemStack stack = getItemStack(); - int savedCount = count; - - if ((mInventory[0] != null) && ((count < getMaxItemCount()) || mVoidOverflow) - && GT_Utility.areStacksEqual(mInventory[0], stack)) { - count += mInventory[0].stackSize; - if (count <= getMaxItemCount()) { - mInventory[0] = null; - } else { - if (mVoidOverflow) { - mInventory[0] = null; - } else { - mInventory[0].stackSize = (count - getMaxItemCount()); - } - count = getMaxItemCount(); - } - } - if (mInventory[1] == null && stack != null) { - mInventory[1] = stack.copy(); - mInventory[1].stackSize = Math.min(stack.getMaxStackSize(), count); - count -= mInventory[1].stackSize; - } else if ((count > 0) && GT_Utility.areStacksEqual(mInventory[1], stack) - && mInventory[1].getMaxStackSize() > mInventory[1].stackSize) { - int tmp = Math.min(count, mInventory[1].getMaxStackSize() - mInventory[1].stackSize); - mInventory[1].stackSize += tmp; - count -= tmp; - } - setItemCount(count); - if (stack != null) { - mInventory[2] = stack.copy(); - mInventory[2].stackSize = Math.min(stack.getMaxStackSize(), count); - } else { - mInventory[2] = null; - } - - notifyListeners(count - savedCount, stack); - if (count != savedCount) getBaseMetaTileEntity().markDirty(); - } - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return aIndex != 2; - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public int getProgresstime() { - return getItemCount() + (mInventory[0] == null ? 0 : mInventory[0].stackSize) - + (mInventory[1] == null ? 0 : mInventory[1].stackSize); - } - - @Override - public int maxProgresstime() { - return getMaxItemCount(); - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public String[] getInfoData() { - - if (getItemStack() == null) { - return new String[] { EnumChatFormatting.BLUE + chestName() + EnumChatFormatting.RESET, "Stored Items:", - EnumChatFormatting.GOLD + "No Items" + EnumChatFormatting.RESET, - EnumChatFormatting.GREEN + "0" - + EnumChatFormatting.RESET - + " " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getMaxItemCount()) - + EnumChatFormatting.RESET }; - } - return new String[] { EnumChatFormatting.BLUE + chestName() + EnumChatFormatting.RESET, "Stored Items:", - EnumChatFormatting.GOLD + getItemStack().getDisplayName() + EnumChatFormatting.RESET, - EnumChatFormatting.GREEN + GT_Utility.formatNumbers(getItemCount()) - + EnumChatFormatting.RESET - + " " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getMaxItemCount()) - + EnumChatFormatting.RESET }; - } - - @Override - public ItemStack[] getStoredItemData() { - return mInventory; - } - - protected abstract String chestName(); - - private void notifyListeners(int count, ItemStack stack) { - if (listeners == null) { - listeners = new HashMap<>(); - return; - } - if (count == 0 || stack == null) return; - ItemList change = new ItemList(); - AEItemStack s = AEItemStack.create(stack); - s.setStackSize(count); - change.add(s); - listeners.forEach((l, o) -> { - if (l.isValid(o)) l.postChange(this, change, null); - else removeListener(l); - }); - } - - private boolean hasActiveMEConnection() { - if (listeners == null || listeners.isEmpty()) return false; - for (Map.Entry, Object> e : listeners.entrySet()) { - if ((e.getKey() instanceof appeng.api.parts.IPart)) { - appeng.api.networking.IGridNode n = ((appeng.api.parts.IPart) e.getKey()).getGridNode(); - if (n != null && n.isActive()) return true; - } - } - // if there are no active storage buses - clear the listeners - listeners.clear(); - return false; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setInteger("mItemCount", getItemCount()); - if (getItemStack() != null) aNBT.setTag("mItemStack", getItemStack().writeToNBT(new NBTTagCompound())); - aNBT.setBoolean("mVoidOverflow", mVoidOverflow); - aNBT.setBoolean("mDisableFilter", mDisableFilter); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - if (aNBT.hasKey("mItemCount")) setItemCount(aNBT.getInteger("mItemCount")); - if (aNBT.hasKey("mItemStack")) - setItemStack(ItemStack.loadItemStackFromNBT((NBTTagCompound) aNBT.getTag("mItemStack"))); - mVoidOverflow = aNBT.getBoolean("mVoidOverflow"); - mDisableFilter = aNBT.getBoolean("mDisableFilter"); - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (GT_Values.disableDigitalChestsExternalAccess && hasActiveMEConnection()) return false; - return aIndex == 1; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - if (GT_Values.disableDigitalChestsExternalAccess && hasActiveMEConnection()) return false; - if (aIndex != 0) return false; - if ((mInventory[0] != null && !GT_Utility.areStacksEqual(mInventory[0], aStack))) return false; - if (mDisableFilter) return true; - if (getItemStack() == null) return mInventory[1] == null || GT_Utility.areStacksEqual(mInventory[1], aStack); - return GT_Utility.areStacksEqual(getItemStack(), aStack); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side != aFacing) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_SCHEST), - TextureFactory.builder() - .addIcon(OVERLAY_SCHEST_GLOW) - .glow() - .build() }; - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currenttip, accessor, config); - final NBTTagCompound tag = accessor.getNBTData(); - if (tag.hasKey("itemType", Constants.NBT.TAG_COMPOUND)) { - currenttip.add("Item Count: " + GT_Utility.parseNumberToString(tag.getInteger("itemCount"))); - currenttip.add( - "Item Type: " + ItemStack.loadItemStackFromNBT(tag.getCompoundTag("itemType")) - .getDisplayName()); - } else { - currenttip.add("Chest Empty"); - } - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - ItemStack is = getItemStack(); - if (GT_Utility.isStackInvalid(is)) return; - int realItemCount = getItemCount(); - if (GT_Utility.isStackValid(mInventory[1]) && GT_Utility.areStacksEqual(mInventory[1], is)) - realItemCount += mInventory[1].stackSize; - tag.setInteger("itemCount", realItemCount); - tag.setTag("itemType", is.writeToNBT(new NBTTagCompound())); - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - protected int clientItemCount; - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setPos(7, 16) - .setSize(71, 45)) - .widget( - new SlotWidget(inventoryHandler, 0) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN) - .setPos(79, 16)) - .widget( - new SlotWidget(inventoryHandler, 1).setAccess(true, false) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT) - .setPos(79, 52)) - .widget( - SlotWidget.phantom(inventoryHandler, 2) - .disableInteraction() - .setBackground(GT_UITextures.TRANSPARENT) - .setPos(59, 42)) - .widget( - new TextWidget("Item Amount").setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(10, 20)) - .widget( - new TextWidget().setStringSupplier(() -> numberFormat.format(clientItemCount)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(10, 30)) - .widget( - new FakeSyncWidget.IntegerSyncer( - () -> this instanceof GT_MetaTileEntity_QuantumChest - ? ((GT_MetaTileEntity_QuantumChest) this).mItemCount - : 0, - value -> clientItemCount = value)); - - } -} diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java deleted file mode 100644 index cd609af343..0000000000 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java +++ /dev/null @@ -1,694 +0,0 @@ -package gregtech.common.tileentities.storage; - -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_QTANK; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_QTANK_GLOW; -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static gregtech.api.util.GT_Utility.formatNumbers; - -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidHandler; - -import com.gtnewhorizons.modularui.api.NumberFormatMUI; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; -import com.gtnewhorizons.modularui.common.widget.DrawableWidget; -import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; - -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IFluidLockable; -import gregtech.api.interfaces.modularui.IAddGregtechLogo; -import gregtech.api.interfaces.modularui.IAddUIWidgets; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Utility; -import gregtech.common.gui.modularui.widget.FluidLockWidget; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntity_BasicTank - implements IFluidLockable, IAddUIWidgets, IAddGregtechLogo { - - public boolean mOutputFluid = false, mVoidFluidPart = false, mVoidFluidFull = false, mLockFluid = false; - protected String lockedFluidName = null; - public boolean mAllowInputFromOutputSide = false; - - public GT_MetaTileEntity_DigitalTankBase(int aID, String aName, String aNameRegional, int aTier) { - super( - aID, - aName, - aNameRegional, - aTier, - 3, - new String[] { - StatCollector.translateToLocalFormatted( - "GT5U.machines.digitaltank.tooltip", - formatNumbers(commonSizeCompute(aTier))), - StatCollector.translateToLocal("GT5U.machines.digitaltank.tooltip1"), }); - } - - protected static int commonSizeCompute(int tier) { - return switch (tier) { - case 1 -> 4000000; - case 2 -> 8000000; - case 3 -> 16000000; - case 4 -> 32000000; - case 5 -> 64000000; - case 6 -> 128000000; - case 7 -> 256000000; - case 8 -> 512000000; - case 9 -> 1024000000; - case 10 -> 2147483640; - default -> 0; - }; - } - - private static int tierPump(int tier) { - return switch (tier) { - case 1 -> 2; - case 2 -> 3; - case 3 -> 3; - case 4 -> 4; - case 5 -> 4; - case 6 -> 5; - case 7 -> 5; - case 8 -> 6; - case 9 -> 7; - case 10 -> 8; - default -> 0; - }; - } - - public GT_MetaTileEntity_DigitalTankBase(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - public GT_MetaTileEntity_DigitalTankBase(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 3, aDescription, aTextures); - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - return new ITexture[0][0][0]; - } - - @Override - public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { - if (stack.hasTagCompound() - && (stack.stackTagCompound.hasKey("mFluid") || stack.stackTagCompound.hasKey("lockedFluidName"))) { - final FluidStack tContents = FluidStack - .loadFluidStackFromNBT(stack.stackTagCompound.getCompoundTag("mFluid")); - if (tContents != null && tContents.amount > 0) { - tooltip.add( - GT_LanguageManager.addStringLocalization("TileEntity_TANK_INFO", "Contains Fluid: ") - + EnumChatFormatting.YELLOW - + tContents.getLocalizedName() - + EnumChatFormatting.GRAY); - tooltip.add( - GT_LanguageManager.addStringLocalization("TileEntity_TANK_AMOUNT", "Fluid Amount: ") - + EnumChatFormatting.GREEN - + formatNumbers(tContents.amount) - + " L" - + EnumChatFormatting.GRAY); - } else if (stack.stackTagCompound.hasKey("lockedFluidName")) { - String fluidName = stack.stackTagCompound.getString("lockedFluidName"); - Fluid fluid = FluidRegistry.getFluid(fluidName); - if (fluid == null) return; - // noinspection deprecation - tooltip.add( - StatCollector.translateToLocalFormatted( - "GT5U.item.tank.locked_to", - EnumChatFormatting.YELLOW + fluid.getLocalizedName())); - } - } - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - if (mFluid != null && mFluid.amount >= 0) { - aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); - } - if (mOutputFluid) aNBT.setBoolean("mOutputFluid", true); - if (mVoidFluidPart) aNBT.setBoolean("mVoidOverflow", true); - if (mVoidFluidFull) aNBT.setBoolean("mVoidFluidFull", true); - if (mLockFluid) aNBT.setBoolean("mLockFluid", true); - if (mLockFluid && GT_Utility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName); - if (this.mAllowInputFromOutputSide) aNBT.setBoolean("mAllowInputFromOutputSide", true); - - super.setItemNBT(aNBT); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("mOutputFluid", this.mOutputFluid); - aNBT.setBoolean("mVoidOverflow", this.mVoidFluidPart); - aNBT.setBoolean("mVoidFluidFull", this.mVoidFluidFull); - aNBT.setBoolean("mLockFluid", mLockFluid); - if (mLockFluid && GT_Utility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName); - else aNBT.removeTag("lockedFluidName"); - aNBT.setBoolean("mAllowInputFromOutputSide", this.mAllowInputFromOutputSide); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - mOutputFluid = aNBT.getBoolean("mOutputFluid"); - mVoidFluidPart = aNBT.getBoolean("mVoidOverflow"); - mVoidFluidFull = aNBT.getBoolean("mVoidFluidFull"); - mLockFluid = aNBT.getBoolean("mLockFluid"); - if (mLockFluid) { - setLockedFluidName(aNBT.getString("lockedFluidName")); - } else { - setLockedFluidName(null); - } - mAllowInputFromOutputSide = aNBT.getBoolean("mAllowInputFromOutputSide"); - } - - @Override - public boolean isFluidInputAllowed(FluidStack aFluid) { - return !mLockFluid || lockedFluidName == null - || lockedFluidName.equals( - aFluid.getFluid() - .getName()); - } - - @Override - public boolean isFluidChangingAllowed() { - return !mLockFluid || lockedFluidName == null; - } - - @Override - public void onEmptyingContainerWhenEmpty() { - if (this.lockedFluidName == null && this.mFluid != null && isFluidLocked()) { - setLockedFluidName( - this.mFluid.getFluid() - .getName()); - } - } - - @Override - public boolean isSimpleMachine() { - return true; - } - - @Override - public boolean doesFillContainers() { - return true; - } - - @Override - public boolean doesEmptyContainers() { - return true; - } - - @Override - public boolean canTankBeFilled() { - return true; - } - - @Override - public boolean canTankBeEmptied() { - return true; - } - - @Override - public boolean displaysItemStack() { - return true; - } - - @Override - public boolean displaysStackSize() { - return false; - } - - @Override - public void setLockedFluidName(String lockedFluidName) { - lockedFluidName = GT_Utility.isStringInvalid(lockedFluidName) ? null : lockedFluidName; - this.lockedFluidName = lockedFluidName; - if (lockedFluidName != null) { - Fluid fluid = FluidRegistry.getFluid(lockedFluidName); - if (fluid != null) { - // create new FluidStack, otherwise existing 0-amount FluidStack will - // prevent new fluid from being locked - setFillableStack(new FluidStack(fluid, getFluidAmount())); - mLockFluid = true; - } - } - // Don't unlock if lockedFluidName == null, - // as player might explicitly enable fluid locking with no fluid contained - } - - @Override - public String getLockedFluidName() { - return this.lockedFluidName; - } - - @Override - public void lockFluid(boolean lock) { - this.mLockFluid = lock; - if (!lock) { - setLockedFluidName(null); - } - } - - @Override - public boolean isFluidLocked() { - return this.mLockFluid; - } - - @Override - public boolean acceptsFluidLock(String name) { - if (name == null || getFluidAmount() == 0) return true; - return mFluid != null && mFluid.getFluid() - .getName() - .equals(name); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, - ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { - if (sideDirection != ForgeDirection.UP) { - if (sideDirection == baseMetaTileEntity.getFrontFacing()) { - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_PIPE) }; - } else return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; - } - return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_QTANK), - TextureFactory.builder() - .addIcon(OVERLAY_QTANK_GLOW) - .glow() - .build() }; - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { - GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); - return true; - } - - @Override - public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (side == getBaseMetaTileEntity().getFrontFacing()) { - mAllowInputFromOutputSide = !mAllowInputFromOutputSide; - GT_Utility.sendChatToPlayer( - aPlayer, - mAllowInputFromOutputSide ? GT_Utility.getTrans("095") : GT_Utility.getTrans("096")); - } - } - - @Override - public FluidStack setFillableStack(FluidStack aFluid) { - mFluid = aFluid; - if (mFluid != null) { - mFluid.amount = Math.min(mFluid.amount, getRealCapacity()); - } - return mFluid; - } - - @Override - public FluidStack setDrainableStack(FluidStack aFluid) { - mFluid = aFluid; - if (mFluid != null) { - mFluid.amount = Math.min(mFluid.amount, getRealCapacity()); - } - return mFluid; - } - - @Override - public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isServerSide()) { - if (isFluidChangingAllowed() && getFillableStack() != null && getFillableStack().amount <= 0) - setFillableStack(null); - - if (mVoidFluidFull && getFillableStack() != null) { - mVoidFluidPart = false; - mLockFluid = false; - setFillableStack(null); - } - - if (doesEmptyContainers()) { - FluidStack tFluid = GT_Utility.getFluidForFilledItem(mInventory[getInputSlot()], true); - if (tFluid != null && isFluidInputAllowed(tFluid)) { - if (getFillableStack() == null) { - if (isFluidInputAllowed(tFluid)) { - if ((tFluid.amount <= getRealCapacity()) || mVoidFluidPart) { - tFluid = tFluid.copy(); - if (aBaseMetaTileEntity.addStackToSlot( - getOutputSlot(), - GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true), - 1)) { - setFillableStack(tFluid); - this.onEmptyingContainerWhenEmpty(); - aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); - } - } - } - } else { - if (tFluid.isFluidEqual(getFillableStack())) { - if ((((long) tFluid.amount + getFillableStack().amount) <= (long) getRealCapacity()) - || mVoidFluidPart - || mVoidFluidFull) { - if (aBaseMetaTileEntity.addStackToSlot( - getOutputSlot(), - GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true), - 1)) { - getFillableStack().amount += Math - .min(tFluid.amount, getRealCapacity() - getFillableStack().amount); - aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); - } - } - } - } - } - } - - if (doesFillContainers()) { - ItemStack tOutput = GT_Utility - .fillFluidContainer(getDrainableStack(), mInventory[getInputSlot()], false, true); - if (tOutput != null && aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tOutput, 1)) { - FluidStack tFluid = GT_Utility.getFluidForFilledItem(tOutput, true); - aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); - if (tFluid != null) getDrainableStack().amount -= tFluid.amount; - if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) setDrainableStack(null); - } - } - } - } - - @Override - public int fill(FluidStack aFluid, boolean doFill) { - if (aFluid == null || aFluid.getFluid() - .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0; - if (getFillableStack() != null && !getFillableStack().isFluidEqual(aFluid)) { - return 0; - } - - FluidStack fillableStack = getFillableStack(); - if (fillableStack == null) { - fillableStack = aFluid.copy(); - fillableStack.amount = 0; - } - - int amount = Math.min(aFluid.amount, getRealCapacity() - fillableStack.amount); - if (doFill) { - fillableStack.amount += amount; - if (getFillableStack() == null) setFillableStack(fillableStack); - getBaseMetaTileEntity().markDirty(); - } - return (mVoidFluidPart || mVoidFluidFull) ? aFluid.amount : amount; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide()) { - if (mOutputFluid && getDrainableStack() != null && (aTick % 20 == 0)) { - IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing()); - if (tTank != null) { - FluidStack tDrained = drain(20 * (1 << (3 + 2 * tierPump(mTier))), false); - if (tDrained != null) { - int tFilledAmount = tTank.fill(aBaseMetaTileEntity.getBackFacing(), tDrained, false); - if (tFilledAmount > 0) - tTank.fill(aBaseMetaTileEntity.getBackFacing(), drain(tFilledAmount, true), true); - } - } - } - } - } - - @Override - public boolean isFacingValid(ForgeDirection side) { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return true; - } - - @Override - public boolean isOutputFacing(ForgeDirection side) { - return false; - } - - @Override - public boolean isLiquidInput(ForgeDirection side) { - return mAllowInputFromOutputSide || side != getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean isLiquidOutput(ForgeDirection side) { - return true; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public int getTankPressure() { - return 100; - } - - public boolean allowOverflow() { - return mVoidFluidPart || mVoidFluidFull; - } - - @Override - public int getCapacity() { - return allowOverflow() ? Integer.MAX_VALUE : getRealCapacity(); - } - - @Override - public int getRealCapacity() { - return commonSizeCompute(mTier); - } - - @Override - public boolean isGivingInformation() { - return true; - } - - @Override - public FluidTankInfo getInfo() { - return new FluidTankInfo(getFluid(), getCapacity()); - } - - @Override - public FluidTankInfo[] getTankInfo(ForgeDirection side) { - return new FluidTankInfo[] { getInfo() }; - } - - @Nonnull - public FluidTankInfo[] getRealTankInfo(ForgeDirection side) { - return new FluidTankInfo[] { new FluidTankInfo(getFluid(), getRealCapacity()) }; - } - - @Override - public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currenttip, accessor, config); - - NBTTagCompound tag = accessor.getNBTData(); - FluidStack fluid = tag.hasKey("mFluid") ? FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("mFluid")) : null; - if (fluid != null && fluid.amount >= 0) { - currenttip.remove(0); - currenttip.add( - 0, - formatNumbers(fluid.amount) + " / " - + formatNumbers(getRealCapacity()) - + " L " - + fluid.getLocalizedName()); - } else { - currenttip.add(0, "Tank Empty"); - } - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - FluidStack fluid = getFluid(); - if (fluid != null) tag.setTag("mFluid", fluid.writeToNBT(new NBTTagCompound())); - else if (tag.hasKey("mFluid")) tag.removeTag("mFluid"); - } - - protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); - - @Override - public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - fluidTank.setAllowOverflow(allowOverflow()); - fluidTank.setPreventDraining(mLockFluid); - - FluidSlotWidget fluidSlotWidget = new FluidSlotWidget(fluidTank); - builder.widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setPos(7, 16) - .setSize(71, 45)) - .widget( - new SlotWidget(inventoryHandler, getInputSlot()) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN) - .setPos(79, 16)) - .widget( - new SlotWidget(inventoryHandler, getOutputSlot()).setAccess(true, false) - .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT) - .setPos(79, 43)) - .widget( - fluidSlotWidget.setOnClickContainer(widget -> onEmptyingContainerWhenEmpty()) - .setBackground(GT_UITextures.TRANSPARENT) - .setPos(58, 41)) - .widget( - new TextWidget(StatCollector.translateToLocal("GT5U.machines.digitaltank.fluid.amount")) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(10, 20)) - .widget( - new TextWidget().setStringSupplier(() -> numberFormat.format(mFluid != null ? mFluid.amount : 0)) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(10, 30)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) - .setPos(98, 16) - .setSize(71, 45)) - .widget(new FluidLockWidget(this).setPos(149, 41)) - .widget( - new TextWidget(StatCollector.translateToLocal("GT5U.machines.digitaltank.lockfluid.label")) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setPos(101, 20)) - .widget(TextWidget.dynamicString(() -> { - FluidStack fluidStack = FluidRegistry.getFluidStack(lockedFluidName, 1); - return fluidStack != null ? fluidStack.getLocalizedName() - : StatCollector.translateToLocal("GT5U.machines.digitaltank.lockfluid.empty"); - }) - .setDefaultColor(COLOR_TEXT_WHITE.get()) - .setTextAlignment(Alignment.CenterLeft) - .setMaxWidth(65) - .setPos(101, 30)) - .widget(new CycleButtonWidget().setToggle(() -> mOutputFluid, val -> { - mOutputFluid = val; - if (!mOutputFluid) { - GT_Utility.sendChatToPlayer( - buildContext.getPlayer(), - GT_Utility.trans("262", "Fluid Auto Output Disabled")); - } else { - GT_Utility.sendChatToPlayer( - buildContext.getPlayer(), - GT_Utility.trans("263", "Fluid Auto Output Enabled")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_FLUID) - .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.autooutput.tooltip")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(7, 63) - .setSize(18, 18)) - .widget(new CycleButtonWidget().setToggle(() -> mLockFluid, val -> { - lockFluid(val); - fluidTank.setPreventDraining(mLockFluid); - - String inBrackets; - if (mLockFluid) { - if (mFluid == null) { - setLockedFluidName(null); - inBrackets = GT_Utility - .trans("264", "currently none, will be locked to the next that is put in"); - } else { - setLockedFluidName( - getDrainableStack().getFluid() - .getName()); - inBrackets = getDrainableStack().getLocalizedName(); - } - GT_Utility.sendChatToPlayer( - buildContext.getPlayer(), - String.format("%s (%s)", GT_Utility.trans("265", "1 specific Fluid"), inBrackets)); - } else { - fluidTank.drain(0, true); - GT_Utility.sendChatToPlayer( - buildContext.getPlayer(), - GT_Utility.trans("266", "Lock Fluid Mode Disabled")); - } - fluidSlotWidget.notifyTooltipChange(); - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_LOCK) - .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.lockfluid.tooltip")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(25, 63) - .setSize(18, 18)) - .widget(new CycleButtonWidget().setToggle(() -> mAllowInputFromOutputSide, val -> { - mAllowInputFromOutputSide = val; - if (!mAllowInputFromOutputSide) { - GT_Utility.sendChatToPlayer(buildContext.getPlayer(), GT_Utility.getTrans("096")); - } else { - GT_Utility.sendChatToPlayer(buildContext.getPlayer(), GT_Utility.getTrans("095")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_INPUT_FROM_OUTPUT_SIDE) - .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.inputfromoutput.tooltip")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(43, 63) - .setSize(18, 18)) - .widget(new CycleButtonWidget().setToggle(() -> mVoidFluidPart, val -> { - mVoidFluidPart = val; - fluidTank.setAllowOverflow(allowOverflow()); - if (!mVoidFluidPart) { - GT_Utility.sendChatToPlayer( - buildContext.getPlayer(), - GT_Utility.trans("267", "Overflow Voiding Mode Disabled")); - } else { - GT_Utility.sendChatToPlayer( - buildContext.getPlayer(), - GT_Utility.trans("268", "Overflow Voiding Mode Enabled")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_TANK_VOID_EXCESS) - .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.voidoverflow.tooltip")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(98, 63) - .setSize(18, 18)) - .widget(new CycleButtonWidget().setToggle(() -> mVoidFluidFull, val -> { - mVoidFluidFull = val; - fluidTank.setAllowOverflow(allowOverflow()); - if (!mVoidFluidFull) { - GT_Utility - .sendChatToPlayer(buildContext.getPlayer(), GT_Utility.trans("269", "Void Full Mode Disabled")); - } else { - GT_Utility - .sendChatToPlayer(buildContext.getPlayer(), GT_Utility.trans("270", "Void Full Mode Enabled")); - } - }) - .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) - .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_TANK_VOID_ALL) - .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.voidfull.tooltip")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(116, 63) - .setSize(18, 18)); - } -} diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java deleted file mode 100644 index abce9514de..0000000000 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java +++ /dev/null @@ -1,283 +0,0 @@ -package gregtech.common.tileentities.storage; - -import static gregtech.api.enums.Textures.BlockIcons.LOCKERS; -import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_IN; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_LOCKER; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Utility; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -public class GT_MetaTileEntity_Locker extends GT_MetaTileEntity_TieredMachineBlock { - - private static final String CHARGE_SLOT_WAILA_TAG = "charge_slot_"; - public byte mType = 0; - - public GT_MetaTileEntity_Locker(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier, 4, "Stores and recharges Armor"); - } - - public GT_MetaTileEntity_Locker(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 4, aDescription, aTextures); - } - - public GT_MetaTileEntity_Locker(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, 4, aDescription, aTextures); - } - - @Override - public String[] getDescription() { - String[] desc = new String[mDescriptionArray.length + 1]; - System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); - desc[mDescriptionArray.length] = "Click with Screwdriver to change Style"; - return desc; - } - - @Override - public ITexture[][][] getTextureSet(ITexture[] aTextures) { - ITexture[][][] rTextures = new ITexture[3][17][]; - for (byte i = -1; i < 16; i = (byte) (i + 1)) { - ITexture[] tmp0 = { MACHINE_CASINGS[this.mTier][(i + 1)] }; - rTextures[0][(i + 1)] = tmp0; - ITexture[] tmp1 = { MACHINE_CASINGS[this.mTier][(i + 1)], OVERLAYS_ENERGY_IN[this.mTier] }; - rTextures[1][(i + 1)] = tmp1; - ITexture[] tmp2 = { MACHINE_CASINGS[this.mTier][(i + 1)], TextureFactory.of(OVERLAY_LOCKER) }; - rTextures[2][(i + 1)] = tmp2; - } - return rTextures; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, - int colorIndex, boolean aActive, boolean redstoneLevel) { - if (side == aFacing) { - return new ITexture[] { this.mTextures[2][(colorIndex + 1)][0], this.mTextures[2][(colorIndex + 1)][1], - LOCKERS[Math.abs(this.mType % LOCKERS.length)] }; - } - return this.mTextures[0][(colorIndex + 1)]; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_Locker(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); - } - - @Override - public boolean isSimpleMachine() { - return false; - } - - @Override - public boolean isElectric() { - return true; - } - - @Override - public boolean isValidSlot(int aIndex) { - return true; - } - - @Override - public boolean isFacingValid(ForgeDirection facing) { - return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; - } - - @Override - public boolean isEnetInput() { - return true; - } - - @Override - public boolean isInputFacing(ForgeDirection side) { - return side == getBaseMetaTileEntity().getBackFacing(); - } - - @Override - public boolean isTeleporterCompatible() { - return false; - } - - @Override - public long maxEUStore() { - return gregtech.api.enums.GT_Values.V[this.mTier] * maxAmperesIn(); - } - - @Override - public long maxEUInput() { - return gregtech.api.enums.GT_Values.V[this.mTier]; - } - - @Override - public long maxAmperesIn() { - return this.mInventory.length * 2L; - } - - @Override - public int rechargerSlotStartIndex() { - return 0; - } - - @Override - public int rechargerSlotCount() { - return getBaseMetaTileEntity().isAllowedToWork() ? this.mInventory.length : 0; - } - - @Override - public boolean isAccessAllowed(EntityPlayer aPlayer) { - return true; - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setByte("mType", this.mType); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - this.mType = aNBT.getByte("mType"); - } - - @Override - public void onValueUpdate(byte aValue) { - this.mType = aValue; - } - - @Override - public byte getUpdateData() { - return this.mType; - } - - @Override - public void doSound(byte aIndex, double aX, double aY, double aZ) { - if (aIndex == 16) { - GT_Utility.doSoundAtClient(SoundResource.RANDOM_CLICK, 1, 1.0F); - } - } - - @Override - public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (side == getBaseMetaTileEntity().getFrontFacing()) { - this.mType = ((byte) (this.mType + 1)); - } - } - - @Override - public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) { - return side != getBaseMetaTileEntity().getFrontFacing(); - } - - @Override - public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, - float aX, float aY, float aZ) { - if ((aBaseMetaTileEntity.isServerSide()) && (side == aBaseMetaTileEntity.getFrontFacing())) { - for (int i = 0; i < 4; i++) { - ItemStack tSwapStack = this.mInventory[i]; - this.mInventory[i] = aPlayer.inventory.armorInventory[i]; - aPlayer.inventory.armorInventory[i] = tSwapStack; - } - aPlayer.inventoryContainer.detectAndSendChanges(); - sendSound((byte) 16); - } - return true; - } - - @Override - public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, - ItemStack aStack) { - return false; - } - - @Override - public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, - int z) { - super.getWailaNBTData(player, tile, tag, world, x, y, z); - for (int i = 0; i < 4; i++) { - final ItemStack itemStack = this.mInventory[3 - i]; - - if (itemStack != null) { - tag.setTag(CHARGE_SLOT_WAILA_TAG + i, itemStack.writeToNBT(new NBTTagCompound())); - } - } - } - - @Override - public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, - IWailaConfigHandler config) { - super.getWailaBody(itemStack, currentTip, accessor, config); - - final NBTTagCompound tag = accessor.getNBTData(); - - for (int i = 0; i < 4; i++) { - final String index = GT_Utility.formatNumbers(i + 1); - - if (tag.hasKey(CHARGE_SLOT_WAILA_TAG + i)) { - final ItemStack slotItem = ItemStack - .loadItemStackFromNBT(tag.getCompoundTag(CHARGE_SLOT_WAILA_TAG + i)); - assert slotItem != null; - - currentTip.add( - GT_ModHandler.getElectricItemCharge(slotItem) - .map(chargeInfo -> { - final float ratio = (float) chargeInfo[0] / (float) chargeInfo[1]; - final EnumChatFormatting chargeFormat; - - if (ratio == 0L) { - chargeFormat = EnumChatFormatting.GRAY; - } else if (ratio < 0.25) { - chargeFormat = EnumChatFormatting.RED; - } else if (ratio < 0.5) { - chargeFormat = EnumChatFormatting.GOLD; - } else if (ratio < 0.75) { - chargeFormat = EnumChatFormatting.YELLOW; - } else if (ratio < 1L) { - chargeFormat = EnumChatFormatting.GREEN; - } else { - chargeFormat = EnumChatFormatting.AQUA; - } - - return StatCollector.translateToLocalFormatted( - "gt.locker.waila_armor_slot_charged", - index, - slotItem.getDisplayName(), - chargeFormat, - GT_Utility.formatNumbers(ratio * 100)); - }) - .orElseGet( - // Lazy initialization - () -> StatCollector.translateToLocalFormatted( - "gt.locker.waila_armor_slot_generic", - index, - slotItem.getDisplayName()))); - } else { - currentTip.add(StatCollector.translateToLocalFormatted("gt.locker.waila_armor_slot_none", index)); - } - } - } -} diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java deleted file mode 100644 index c830cd4e52..0000000000 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java +++ /dev/null @@ -1,102 +0,0 @@ -package gregtech.common.tileentities.storage; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nullable; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; - -public class GT_MetaTileEntity_QuantumChest extends GT_MetaTileEntity_DigitalChestBase { - - public int mItemCount = 0; - public ItemStack mItemStack = null; - NBTTagList mInvData = null; - - public GT_MetaTileEntity_QuantumChest(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier); - } - - public GT_MetaTileEntity_QuantumChest(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_QuantumChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_QuantumChest(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public void setItemNBT(NBTTagCompound aNBT) { - mInvData = new NBTTagList(); - for (int i = 0; i < 3; i++) { - if (mInventory[i] != null) { - NBTTagCompound tNBT = new NBTTagCompound(); - tNBT.setByte("Count", (byte) mInventory[i].stackSize); - tNBT.setShort("Damage", (short) mInventory[i].getItemDamage()); - tNBT.setShort("id", (short) Item.getIdFromItem(mInventory[i].getItem())); - tNBT.setInteger("IntSlot", i); - if (mInventory[i].hasTagCompound()) { - tNBT.setTag("tag", mInventory[i].getTagCompound()); - } - mInvData.appendTag(tNBT); - } - } - if (mItemStack != null) aNBT.setTag("mItemStack", getItemStack().writeToNBT(new NBTTagCompound())); - aNBT.setTag("Inventory", mInvData); - aNBT.setInteger("mItemCount", getItemCount()); - aNBT.setBoolean("mVoidOverflow", mVoidOverflow); - - super.setItemNBT(aNBT); - } - - @Override - protected String chestName() { - return "Quantum Chest"; - } - - @Override - protected int getItemCount() { - return mItemCount; - } - - @Override - public void setItemCount(int aCount) { - mItemCount = aCount; - } - - @Override - protected ItemStack getItemStack() { - return mItemStack; - } - - @Override - protected void setItemStack(ItemStack s) { - mItemStack = s; - } - - @Nullable - @Override - public List getItemsForHoloGlasses() { - List ret = new ArrayList<>(); - ret.add(getStackInSlot(0)); - ret.add(getStackInSlot(1)); - if (mItemStack != null) { - ItemStack copy = mItemStack.copy(); - copy.stackSize = mItemCount; - ret.add(copy); - } - return ret; - } -} diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java deleted file mode 100644 index 4d51d0b634..0000000000 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java +++ /dev/null @@ -1,55 +0,0 @@ -package gregtech.common.tileentities.storage; - -import net.minecraft.util.EnumChatFormatting; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_QuantumTank extends GT_MetaTileEntity_DigitalTankBase { - - public GT_MetaTileEntity_QuantumTank(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier); - } - - public GT_MetaTileEntity_QuantumTank(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_QuantumTank(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_QuantumTank(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public String[] getInfoData() { - - if (mFluid == null) { - return new String[] { EnumChatFormatting.BLUE + "Quantum Tank" + EnumChatFormatting.RESET, "Stored Fluid:", - EnumChatFormatting.GOLD + "No Fluid" + EnumChatFormatting.RESET, - EnumChatFormatting.GREEN + Integer.toString(0) - + " L" - + EnumChatFormatting.RESET - + " " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getCapacity()) - + " L" - + EnumChatFormatting.RESET }; - } - return new String[] { EnumChatFormatting.BLUE + "Quantum Tank" + EnumChatFormatting.RESET, "Stored Fluid:", - EnumChatFormatting.GOLD + mFluid.getLocalizedName() + EnumChatFormatting.RESET, - EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mFluid.amount) - + " L" - + EnumChatFormatting.RESET - + " " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getCapacity()) - + " L" - + EnumChatFormatting.RESET }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java deleted file mode 100644 index 271402f0de..0000000000 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java +++ /dev/null @@ -1,30 +0,0 @@ -package gregtech.common.tileentities.storage; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; - -public class GT_MetaTileEntity_SuperChest extends GT_MetaTileEntity_QuantumChest { - - public GT_MetaTileEntity_SuperChest(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier); - } - - public GT_MetaTileEntity_SuperChest(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_SuperChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - protected String chestName() { - return "Super Chest"; - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_SuperChest(mName, mTier, mDescriptionArray, mTextures); - } -} diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java deleted file mode 100644 index 4f0bdbc237..0000000000 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java +++ /dev/null @@ -1,54 +0,0 @@ -package gregtech.common.tileentities.storage; - -import net.minecraft.util.EnumChatFormatting; - -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.util.GT_Utility; - -public class GT_MetaTileEntity_SuperTank extends GT_MetaTileEntity_DigitalTankBase { - - public GT_MetaTileEntity_SuperTank(int aID, String aName, String aNameRegional, int aTier) { - super(aID, aName, aNameRegional, aTier); - } - - public GT_MetaTileEntity_SuperTank(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - public GT_MetaTileEntity_SuperTank(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { - super(aName, aTier, aDescription, aTextures); - } - - @Override - public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_SuperTank(mName, mTier, mDescriptionArray, mTextures); - } - - @Override - public String[] getInfoData() { - - if (mFluid == null) { - return new String[] { EnumChatFormatting.BLUE + "Super Tank" + EnumChatFormatting.RESET, "Stored Fluid:", - EnumChatFormatting.GOLD + "No Fluid" + EnumChatFormatting.RESET, - EnumChatFormatting.GREEN + "0 L" - + EnumChatFormatting.RESET - + " " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getCapacity()) - + " L" - + EnumChatFormatting.RESET }; - } - return new String[] { EnumChatFormatting.BLUE + "Super Tank" + EnumChatFormatting.RESET, "Stored Fluid:", - EnumChatFormatting.GOLD + mFluid.getLocalizedName() + EnumChatFormatting.RESET, - EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mFluid.amount) - + " L" - + EnumChatFormatting.RESET - + " " - + EnumChatFormatting.YELLOW - + GT_Utility.formatNumbers(getCapacity()) - + " L" - + EnumChatFormatting.RESET }; - } -} diff --git a/src/main/java/gregtech/common/tileentities/storage/MTEDigitalChestBase.java b/src/main/java/gregtech/common/tileentities/storage/MTEDigitalChestBase.java new file mode 100644 index 0000000000..96ec6c06ae --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/storage/MTEDigitalChestBase.java @@ -0,0 +1,556 @@ +package gregtech.common.tileentities.storage; + +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCHEST; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCHEST_GLOW; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.IMEMonitorHandlerReceiver; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import appeng.util.item.AEItemStack; +import appeng.util.item.ItemList; +import gregtech.api.enums.GTValues; +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; +import gregtech.api.objects.AE2DigitalChestHandler; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public abstract class MTEDigitalChestBase extends MTETieredMachineBlock + implements IMEMonitor, IAddUIWidgets { + + protected boolean mVoidOverflow = false; + protected boolean mDisableFilter; + private Map, Object> listeners = null; + + public MTEDigitalChestBase(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 3, + new String[] { "This Chest stores " + GTUtility.formatNumbers(commonSizeCompute(aTier)) + " Blocks", + "Use a screwdriver to enable", "voiding items on overflow", "Will keep its contents when harvested", }); + } + + protected static int commonSizeCompute(int tier) { + return switch (tier) { + case 1 -> 4000000; + case 2 -> 8000000; + case 3 -> 16000000; + case 4 -> 32000000; + case 5 -> 64000000; + case 6 -> 128000000; + case 7 -> 256000000; + case 8 -> 512000000; + case 9 -> 1024000000; + case 10 -> 2147483640; + default -> 0; + }; + } + + public MTEDigitalChestBase(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + public MTEDigitalChestBase(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + @Override + public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { + if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("mItemStack")) { + final ItemStack tContents = ItemStack + .loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("mItemStack")); + final int tSize = stack.stackTagCompound.getInteger("mItemCount"); + if (tContents != null && tSize > 0) { + tooltip.add( + GTLanguageManager.addStringLocalization("TileEntity_CHEST_INFO", "Contains Item: ") + + EnumChatFormatting.YELLOW + + tContents.getDisplayName() + + EnumChatFormatting.GRAY); + tooltip.add( + GTLanguageManager.addStringLocalization("TileEntity_CHEST_AMOUNT", "Item Amount: ") + + EnumChatFormatting.GREEN + + GTUtility.formatNumbers(tSize) + + EnumChatFormatting.GRAY); + } + } + } + + public static void registerAEIntegration() { + appeng.api.AEApi.instance() + .registries() + .externalStorage() + .addExternalStorageInterface(new AE2DigitalChestHandler()); + } + + @Override + public void addListener(IMEMonitorHandlerReceiver imeMonitorHandlerReceiver, Object o) { + if (listeners == null) listeners = new HashMap<>(); + listeners.put(imeMonitorHandlerReceiver, o); + } + + @Override + public void removeListener(IMEMonitorHandlerReceiver imeMonitorHandlerReceiver) { + if (listeners == null) listeners = new HashMap<>(); + listeners.remove(imeMonitorHandlerReceiver); + } + + @Override + public appeng.api.config.AccessRestriction getAccess() { + return appeng.api.config.AccessRestriction.READ_WRITE; + } + + @Override + public boolean isPrioritized(IAEItemStack iaeItemStack) { + ItemStack s = getItemStack(); + if (s == null || iaeItemStack == null) return false; + return iaeItemStack.isSameType(s); + } + + @Override + public boolean canAccept(IAEItemStack iaeItemStack) { + ItemStack s = getItemStack(); + if (s == null || iaeItemStack == null) return true; + return iaeItemStack.isSameType(s); + } + + @Override + public int getPriority() { + return 0; + } + + @Override + public int getSlot() { + return 0; + } + + @Override + public boolean validForPass(int i) { + return true; + } + + protected abstract ItemStack getItemStack(); + + protected abstract void setItemStack(ItemStack s); + + @SuppressWarnings("unchecked") + @Override + public IItemList getAvailableItems(final IItemList out, int iteration) { + ItemStack storedStack = getItemStack(); + if (storedStack != null) { + AEItemStack s = AEItemStack.create(storedStack); + s.setStackSize(getItemCount()); + out.add(s); + } + return out; + } + + @Override + public IItemList getStorageList() { + IItemList res = new ItemList(); + ItemStack storedStack = getItemStack(); + if (storedStack != null) { + AEItemStack s = AEItemStack.create(storedStack); + s.setStackSize(getItemCount()); + res.add(s); + } + return res; + } + + protected abstract int getItemCount(); + + @Override + public abstract void setItemCount(int aCount); + + @Override + public int getMaxItemCount() { + return commonSizeCompute(mTier); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return new ITexture[0][0][0]; + } + + @Override + public IAEItemStack injectItems(final IAEItemStack input, final appeng.api.config.Actionable mode, + final appeng.api.networking.security.BaseActionSource src) { + if (getBaseMetaTileEntity() == null) return input; + + final ItemStack inputStack = input.getItemStack(); + final int maxCapacity = getMaxItemCount(); + final int itemCount = getItemCount(); + final long toAdd = input.getStackSize(); + final ItemStack storedStack = getItemStack(); + + if (storedStack != null && !GTUtility.areStacksEqual(storedStack, inputStack)) { + // Can't stack with existing item, just return the input. + return input; + } + + // Number of items not added because there's too much to add. + final long notAdded = itemCount + toAdd - maxCapacity; + + if (mode == appeng.api.config.Actionable.MODULATE) { + final int newCount = (int) Math.min((long) maxCapacity, itemCount + toAdd); + + if (storedStack == null) { + setItemStack(inputStack.copy()); + } + setItemCount(newCount); + getBaseMetaTileEntity().markDirty(); + } + if (mVoidOverflow || notAdded <= 0) { + return null; + } else { + return input.copy() + .setStackSize(notAdded); + } + } + + @Override + public IAEItemStack extractItems(final IAEItemStack request, final appeng.api.config.Actionable mode, + final appeng.api.networking.security.BaseActionSource src) { + if (request.isSameType(getItemStack())) { + if (getBaseMetaTileEntity() == null) return null; + if (mode != appeng.api.config.Actionable.SIMULATE) getBaseMetaTileEntity().markDirty(); + if (request.getStackSize() >= getItemCount()) { + AEItemStack result = AEItemStack.create(getItemStack()); + result.setStackSize(getItemCount()); + if (mode != appeng.api.config.Actionable.SIMULATE) setItemCount(0); + return result; + } else { + if (mode != appeng.api.config.Actionable.SIMULATE) + setItemCount(getItemCount() - (int) request.getStackSize()); + return request.copy(); + } + } + return null; + } + + @Override + public StorageChannel getChannel() { + return StorageChannel.ITEMS; + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + mVoidOverflow = !mVoidOverflow; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal( + mVoidOverflow ? "GT5U.machines.digitalchest.voidoverflow.enabled" + : "GT5U.machines.digitalchest.voidoverflow.disabled")); + } + + @Override + public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + if (super.onSolderingToolRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ)) return true; + mDisableFilter = !mDisableFilter; + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal( + mDisableFilter ? "GT5U.machines.digitalchest.inputfilter.disabled" + : "GT5U.machines.digitalchest.inputfilter.enabled")); + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { + + if (getBaseMetaTileEntity().isServerSide() && getBaseMetaTileEntity().isAllowedToWork()) { + if ((getItemCount() <= 0)) { + setItemStack(null); + setItemCount(0); + } + if (getItemStack() == null && mInventory[0] != null) { + setItemStack(mInventory[0].copy()); + } + int count = getItemCount(); + ItemStack stack = getItemStack(); + int savedCount = count; + + if ((mInventory[0] != null) && ((count < getMaxItemCount()) || mVoidOverflow) + && GTUtility.areStacksEqual(mInventory[0], stack)) { + count += mInventory[0].stackSize; + if (count <= getMaxItemCount()) { + mInventory[0] = null; + } else { + if (mVoidOverflow) { + mInventory[0] = null; + } else { + mInventory[0].stackSize = (count - getMaxItemCount()); + } + count = getMaxItemCount(); + } + } + if (mInventory[1] == null && stack != null) { + mInventory[1] = stack.copy(); + mInventory[1].stackSize = Math.min(stack.getMaxStackSize(), count); + count -= mInventory[1].stackSize; + } else if ((count > 0) && GTUtility.areStacksEqual(mInventory[1], stack) + && mInventory[1].getMaxStackSize() > mInventory[1].stackSize) { + int tmp = Math.min(count, mInventory[1].getMaxStackSize() - mInventory[1].stackSize); + mInventory[1].stackSize += tmp; + count -= tmp; + } + setItemCount(count); + if (stack != null) { + mInventory[2] = stack.copy(); + mInventory[2].stackSize = Math.min(stack.getMaxStackSize(), count); + } else { + mInventory[2] = null; + } + + notifyListeners(count - savedCount, stack); + if (count != savedCount) getBaseMetaTileEntity().markDirty(); + } + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex != 2; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public int getProgresstime() { + return getItemCount() + (mInventory[0] == null ? 0 : mInventory[0].stackSize) + + (mInventory[1] == null ? 0 : mInventory[1].stackSize); + } + + @Override + public int maxProgresstime() { + return getMaxItemCount(); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + + if (getItemStack() == null) { + return new String[] { EnumChatFormatting.BLUE + chestName() + EnumChatFormatting.RESET, "Stored Items:", + EnumChatFormatting.GOLD + "No Items" + EnumChatFormatting.RESET, + EnumChatFormatting.GREEN + "0" + + EnumChatFormatting.RESET + + " " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getMaxItemCount()) + + EnumChatFormatting.RESET }; + } + return new String[] { EnumChatFormatting.BLUE + chestName() + EnumChatFormatting.RESET, "Stored Items:", + EnumChatFormatting.GOLD + getItemStack().getDisplayName() + EnumChatFormatting.RESET, + EnumChatFormatting.GREEN + GTUtility.formatNumbers(getItemCount()) + + EnumChatFormatting.RESET + + " " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getMaxItemCount()) + + EnumChatFormatting.RESET }; + } + + @Override + public ItemStack[] getStoredItemData() { + return mInventory; + } + + protected abstract String chestName(); + + private void notifyListeners(int count, ItemStack stack) { + if (listeners == null) { + listeners = new HashMap<>(); + return; + } + if (count == 0 || stack == null) return; + ItemList change = new ItemList(); + AEItemStack s = AEItemStack.create(stack); + s.setStackSize(count); + change.add(s); + listeners.forEach((l, o) -> { + if (l.isValid(o)) l.postChange(this, change, null); + else removeListener(l); + }); + } + + private boolean hasActiveMEConnection() { + if (listeners == null || listeners.isEmpty()) return false; + for (Map.Entry, Object> e : listeners.entrySet()) { + if ((e.getKey() instanceof appeng.api.parts.IPart)) { + appeng.api.networking.IGridNode n = ((appeng.api.parts.IPart) e.getKey()).getGridNode(); + if (n != null && n.isActive()) return true; + } + } + // if there are no active storage buses - clear the listeners + listeners.clear(); + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("mItemCount", getItemCount()); + if (getItemStack() != null) aNBT.setTag("mItemStack", getItemStack().writeToNBT(new NBTTagCompound())); + aNBT.setBoolean("mVoidOverflow", mVoidOverflow); + aNBT.setBoolean("mDisableFilter", mDisableFilter); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + if (aNBT.hasKey("mItemCount")) setItemCount(aNBT.getInteger("mItemCount")); + if (aNBT.hasKey("mItemStack")) + setItemStack(ItemStack.loadItemStackFromNBT((NBTTagCompound) aNBT.getTag("mItemStack"))); + mVoidOverflow = aNBT.getBoolean("mVoidOverflow"); + mDisableFilter = aNBT.getBoolean("mDisableFilter"); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (GTValues.disableDigitalChestsExternalAccess && hasActiveMEConnection()) return false; + return aIndex == 1; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (GTValues.disableDigitalChestsExternalAccess && hasActiveMEConnection()) return false; + if (aIndex != 0) return false; + if ((mInventory[0] != null && !GTUtility.areStacksEqual(mInventory[0], aStack))) return false; + if (mDisableFilter) return true; + if (getItemStack() == null) return mInventory[1] == null || GTUtility.areStacksEqual(mInventory[1], aStack); + return GTUtility.areStacksEqual(getItemStack(), aStack); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side != aFacing) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_SCHEST), + TextureFactory.builder() + .addIcon(OVERLAY_SCHEST_GLOW) + .glow() + .build() }; + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currenttip, accessor, config); + final NBTTagCompound tag = accessor.getNBTData(); + if (tag.hasKey("itemType", Constants.NBT.TAG_COMPOUND)) { + currenttip.add("Item Count: " + GTUtility.parseNumberToString(tag.getInteger("itemCount"))); + currenttip.add( + "Item Type: " + ItemStack.loadItemStackFromNBT(tag.getCompoundTag("itemType")) + .getDisplayName()); + } else { + currenttip.add("Chest Empty"); + } + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + ItemStack is = getItemStack(); + if (GTUtility.isStackInvalid(is)) return; + int realItemCount = getItemCount(); + if (GTUtility.isStackValid(mInventory[1]) && GTUtility.areStacksEqual(mInventory[1], is)) + realItemCount += mInventory[1].stackSize; + tag.setInteger("itemCount", realItemCount); + tag.setTag("itemType", is.writeToNBT(new NBTTagCompound())); + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + protected int clientItemCount; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setPos(7, 16) + .setSize(71, 45)) + .widget( + new SlotWidget(inventoryHandler, 0) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_IN) + .setPos(79, 16)) + .widget( + new SlotWidget(inventoryHandler, 1).setAccess(true, false) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_OUT) + .setPos(79, 52)) + .widget( + SlotWidget.phantom(inventoryHandler, 2) + .disableInteraction() + .setBackground(GTUITextures.TRANSPARENT) + .setPos(59, 42)) + .widget( + new TextWidget("Item Amount").setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(10, 20)) + .widget( + new TextWidget().setStringSupplier(() -> numberFormat.format(clientItemCount)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(10, 30)) + .widget( + new FakeSyncWidget.IntegerSyncer( + () -> this instanceof MTEQuantumChest ? ((MTEQuantumChest) this).mItemCount : 0, + value -> clientItemCount = value)); + + } +} diff --git a/src/main/java/gregtech/common/tileentities/storage/MTEDigitalTankBase.java b/src/main/java/gregtech/common/tileentities/storage/MTEDigitalTankBase.java new file mode 100644 index 0000000000..d4b8da15da --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/storage/MTEDigitalTankBase.java @@ -0,0 +1,693 @@ +package gregtech.common.tileentities.storage; + +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_QTANK; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_QTANK_GLOW; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GTUtility.formatNumbers; + +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.api.gui.modularui.GTUIInfos; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IFluidLockable; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEBasicTank; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.common.gui.modularui.widget.FluidLockWidget; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public abstract class MTEDigitalTankBase extends MTEBasicTank + implements IFluidLockable, IAddUIWidgets, IAddGregtechLogo { + + public boolean mOutputFluid = false, mVoidFluidPart = false, mVoidFluidFull = false, mLockFluid = false; + protected String lockedFluidName = null; + public boolean mAllowInputFromOutputSide = false; + + public MTEDigitalTankBase(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 3, + new String[] { + StatCollector.translateToLocalFormatted( + "GT5U.machines.digitaltank.tooltip", + formatNumbers(commonSizeCompute(aTier))), + StatCollector.translateToLocal("GT5U.machines.digitaltank.tooltip1"), }); + } + + protected static int commonSizeCompute(int tier) { + return switch (tier) { + case 1 -> 4000000; + case 2 -> 8000000; + case 3 -> 16000000; + case 4 -> 32000000; + case 5 -> 64000000; + case 6 -> 128000000; + case 7 -> 256000000; + case 8 -> 512000000; + case 9 -> 1024000000; + case 10 -> 2147483640; + default -> 0; + }; + } + + private static int tierPump(int tier) { + return switch (tier) { + case 1 -> 2; + case 2 -> 3; + case 3 -> 3; + case 4 -> 4; + case 5 -> 4; + case 6 -> 5; + case 7 -> 5; + case 8 -> 6; + case 9 -> 7; + case 10 -> 8; + default -> 0; + }; + } + + public MTEDigitalTankBase(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + public MTEDigitalTankBase(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 3, aDescription, aTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return new ITexture[0][0][0]; + } + + @Override + public void addAdditionalTooltipInformation(ItemStack stack, List tooltip) { + if (stack.hasTagCompound() + && (stack.stackTagCompound.hasKey("mFluid") || stack.stackTagCompound.hasKey("lockedFluidName"))) { + final FluidStack tContents = FluidStack + .loadFluidStackFromNBT(stack.stackTagCompound.getCompoundTag("mFluid")); + if (tContents != null && tContents.amount > 0) { + tooltip.add( + GTLanguageManager.addStringLocalization("TileEntity_TANK_INFO", "Contains Fluid: ") + + EnumChatFormatting.YELLOW + + tContents.getLocalizedName() + + EnumChatFormatting.GRAY); + tooltip.add( + GTLanguageManager.addStringLocalization("TileEntity_TANK_AMOUNT", "Fluid Amount: ") + + EnumChatFormatting.GREEN + + formatNumbers(tContents.amount) + + " L" + + EnumChatFormatting.GRAY); + } else if (stack.stackTagCompound.hasKey("lockedFluidName")) { + String fluidName = stack.stackTagCompound.getString("lockedFluidName"); + Fluid fluid = FluidRegistry.getFluid(fluidName); + if (fluid == null) return; + // noinspection deprecation + tooltip.add( + StatCollector.translateToLocalFormatted( + "GT5U.item.tank.locked_to", + EnumChatFormatting.YELLOW + fluid.getLocalizedName())); + } + } + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + if (mFluid != null && mFluid.amount >= 0) { + aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); + } + if (mOutputFluid) aNBT.setBoolean("mOutputFluid", true); + if (mVoidFluidPart) aNBT.setBoolean("mVoidOverflow", true); + if (mVoidFluidFull) aNBT.setBoolean("mVoidFluidFull", true); + if (mLockFluid) aNBT.setBoolean("mLockFluid", true); + if (mLockFluid && GTUtility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName); + if (this.mAllowInputFromOutputSide) aNBT.setBoolean("mAllowInputFromOutputSide", true); + + super.setItemNBT(aNBT); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("mOutputFluid", this.mOutputFluid); + aNBT.setBoolean("mVoidOverflow", this.mVoidFluidPart); + aNBT.setBoolean("mVoidFluidFull", this.mVoidFluidFull); + aNBT.setBoolean("mLockFluid", mLockFluid); + if (mLockFluid && GTUtility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName); + else aNBT.removeTag("lockedFluidName"); + aNBT.setBoolean("mAllowInputFromOutputSide", this.mAllowInputFromOutputSide); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + mOutputFluid = aNBT.getBoolean("mOutputFluid"); + mVoidFluidPart = aNBT.getBoolean("mVoidOverflow"); + mVoidFluidFull = aNBT.getBoolean("mVoidFluidFull"); + mLockFluid = aNBT.getBoolean("mLockFluid"); + if (mLockFluid) { + setLockedFluidName(aNBT.getString("lockedFluidName")); + } else { + setLockedFluidName(null); + } + mAllowInputFromOutputSide = aNBT.getBoolean("mAllowInputFromOutputSide"); + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return !mLockFluid || lockedFluidName == null + || lockedFluidName.equals( + aFluid.getFluid() + .getName()); + } + + @Override + public boolean isFluidChangingAllowed() { + return !mLockFluid || lockedFluidName == null; + } + + @Override + public void onEmptyingContainerWhenEmpty() { + if (this.lockedFluidName == null && this.mFluid != null && isFluidLocked()) { + setLockedFluidName( + this.mFluid.getFluid() + .getName()); + } + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean doesFillContainers() { + return true; + } + + @Override + public boolean doesEmptyContainers() { + return true; + } + + @Override + public boolean canTankBeFilled() { + return true; + } + + @Override + public boolean canTankBeEmptied() { + return true; + } + + @Override + public boolean displaysItemStack() { + return true; + } + + @Override + public boolean displaysStackSize() { + return false; + } + + @Override + public void setLockedFluidName(String lockedFluidName) { + lockedFluidName = GTUtility.isStringInvalid(lockedFluidName) ? null : lockedFluidName; + this.lockedFluidName = lockedFluidName; + if (lockedFluidName != null) { + Fluid fluid = FluidRegistry.getFluid(lockedFluidName); + if (fluid != null) { + // create new FluidStack, otherwise existing 0-amount FluidStack will + // prevent new fluid from being locked + setFillableStack(new FluidStack(fluid, getFluidAmount())); + mLockFluid = true; + } + } + // Don't unlock if lockedFluidName == null, + // as player might explicitly enable fluid locking with no fluid contained + } + + @Override + public String getLockedFluidName() { + return this.lockedFluidName; + } + + @Override + public void lockFluid(boolean lock) { + this.mLockFluid = lock; + if (!lock) { + setLockedFluidName(null); + } + } + + @Override + public boolean isFluidLocked() { + return this.mLockFluid; + } + + @Override + public boolean acceptsFluidLock(String name) { + if (name == null || getFluidAmount() == 0) return true; + return mFluid != null && mFluid.getFluid() + .getName() + .equals(name); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, + ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) { + if (sideDirection != ForgeDirection.UP) { + if (sideDirection == baseMetaTileEntity.getFrontFacing()) { + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_PIPE) }; + } else return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] }; + } + return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_QTANK), + TextureFactory.builder() + .addIcon(OVERLAY_QTANK_GLOW) + .glow() + .build() }; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (side == getBaseMetaTileEntity().getFrontFacing()) { + mAllowInputFromOutputSide = !mAllowInputFromOutputSide; + GTUtility.sendChatToPlayer( + aPlayer, + mAllowInputFromOutputSide ? GTUtility.getTrans("095") : GTUtility.getTrans("096")); + } + } + + @Override + public FluidStack setFillableStack(FluidStack aFluid) { + mFluid = aFluid; + if (mFluid != null) { + mFluid.amount = Math.min(mFluid.amount, getRealCapacity()); + } + return mFluid; + } + + @Override + public FluidStack setDrainableStack(FluidStack aFluid) { + mFluid = aFluid; + if (mFluid != null) { + mFluid.amount = Math.min(mFluid.amount, getRealCapacity()); + } + return mFluid; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (isFluidChangingAllowed() && getFillableStack() != null && getFillableStack().amount <= 0) + setFillableStack(null); + + if (mVoidFluidFull && getFillableStack() != null) { + mVoidFluidPart = false; + mLockFluid = false; + setFillableStack(null); + } + + if (doesEmptyContainers()) { + FluidStack tFluid = GTUtility.getFluidForFilledItem(mInventory[getInputSlot()], true); + if (tFluid != null && isFluidInputAllowed(tFluid)) { + if (getFillableStack() == null) { + if (isFluidInputAllowed(tFluid)) { + if ((tFluid.amount <= getRealCapacity()) || mVoidFluidPart) { + tFluid = tFluid.copy(); + if (aBaseMetaTileEntity.addStackToSlot( + getOutputSlot(), + GTUtility.getContainerForFilledItem(mInventory[getInputSlot()], true), + 1)) { + setFillableStack(tFluid); + this.onEmptyingContainerWhenEmpty(); + aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); + } + } + } + } else { + if (tFluid.isFluidEqual(getFillableStack())) { + if ((((long) tFluid.amount + getFillableStack().amount) <= (long) getRealCapacity()) + || mVoidFluidPart + || mVoidFluidFull) { + if (aBaseMetaTileEntity.addStackToSlot( + getOutputSlot(), + GTUtility.getContainerForFilledItem(mInventory[getInputSlot()], true), + 1)) { + getFillableStack().amount += Math + .min(tFluid.amount, getRealCapacity() - getFillableStack().amount); + aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); + } + } + } + } + } + } + + if (doesFillContainers()) { + ItemStack tOutput = GTUtility + .fillFluidContainer(getDrainableStack(), mInventory[getInputSlot()], false, true); + if (tOutput != null && aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tOutput, 1)) { + FluidStack tFluid = GTUtility.getFluidForFilledItem(tOutput, true); + aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); + if (tFluid != null) getDrainableStack().amount -= tFluid.amount; + if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) setDrainableStack(null); + } + } + } + } + + @Override + public int fill(FluidStack aFluid, boolean doFill) { + if (aFluid == null || aFluid.getFluid() + .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0; + if (getFillableStack() != null && !getFillableStack().isFluidEqual(aFluid)) { + return 0; + } + + FluidStack fillableStack = getFillableStack(); + if (fillableStack == null) { + fillableStack = aFluid.copy(); + fillableStack.amount = 0; + } + + int amount = Math.min(aFluid.amount, getRealCapacity() - fillableStack.amount); + if (doFill) { + fillableStack.amount += amount; + if (getFillableStack() == null) setFillableStack(fillableStack); + getBaseMetaTileEntity().markDirty(); + } + return (mVoidFluidPart || mVoidFluidFull) ? aFluid.amount : amount; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide()) { + if (mOutputFluid && getDrainableStack() != null && (aTick % 20 == 0)) { + IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing()); + if (tTank != null) { + FluidStack tDrained = drain(20 * (1 << (3 + 2 * tierPump(mTier))), false); + if (tDrained != null) { + int tFilledAmount = tTank.fill(aBaseMetaTileEntity.getBackFacing(), tDrained, false); + if (tFilledAmount > 0) + tTank.fill(aBaseMetaTileEntity.getBackFacing(), drain(tFilledAmount, true), true); + } + } + } + } + } + + @Override + public boolean isFacingValid(ForgeDirection side) { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return true; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return mAllowInputFromOutputSide || side != getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isLiquidOutput(ForgeDirection side) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public int getTankPressure() { + return 100; + } + + public boolean allowOverflow() { + return mVoidFluidPart || mVoidFluidFull; + } + + @Override + public int getCapacity() { + return allowOverflow() ? Integer.MAX_VALUE : getRealCapacity(); + } + + @Override + public int getRealCapacity() { + return commonSizeCompute(mTier); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public FluidTankInfo getInfo() { + return new FluidTankInfo(getFluid(), getCapacity()); + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection side) { + return new FluidTankInfo[] { getInfo() }; + } + + @Nonnull + public FluidTankInfo[] getRealTankInfo(ForgeDirection side) { + return new FluidTankInfo[] { new FluidTankInfo(getFluid(), getRealCapacity()) }; + } + + @Override + public void getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currenttip, accessor, config); + + NBTTagCompound tag = accessor.getNBTData(); + FluidStack fluid = tag.hasKey("mFluid") ? FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("mFluid")) : null; + if (fluid != null && fluid.amount >= 0) { + currenttip.remove(0); + currenttip.add( + 0, + formatNumbers(fluid.amount) + " / " + + formatNumbers(getRealCapacity()) + + " L " + + fluid.getLocalizedName()); + } else { + currenttip.add(0, "Tank Empty"); + } + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + FluidStack fluid = getFluid(); + if (fluid != null) tag.setTag("mFluid", fluid.writeToNBT(new NBTTagCompound())); + else if (tag.hasKey("mFluid")) tag.removeTag("mFluid"); + } + + protected static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + fluidTank.setAllowOverflow(allowOverflow()); + fluidTank.setPreventDraining(mLockFluid); + + FluidSlotWidget fluidSlotWidget = new FluidSlotWidget(fluidTank); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setPos(7, 16) + .setSize(71, 45)) + .widget( + new SlotWidget(inventoryHandler, getInputSlot()) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_IN) + .setPos(79, 16)) + .widget( + new SlotWidget(inventoryHandler, getOutputSlot()).setAccess(true, false) + .setBackground(getGUITextureSet().getItemSlot(), GTUITextures.OVERLAY_SLOT_OUT) + .setPos(79, 43)) + .widget( + fluidSlotWidget.setOnClickContainer(widget -> onEmptyingContainerWhenEmpty()) + .setBackground(GTUITextures.TRANSPARENT) + .setPos(58, 41)) + .widget( + new TextWidget(StatCollector.translateToLocal("GT5U.machines.digitaltank.fluid.amount")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(10, 20)) + .widget( + new TextWidget().setStringSupplier(() -> numberFormat.format(mFluid != null ? mFluid.amount : 0)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(10, 30)) + .widget( + new DrawableWidget().setDrawable(GTUITextures.PICTURE_SCREEN_BLACK) + .setPos(98, 16) + .setSize(71, 45)) + .widget(new FluidLockWidget(this).setPos(149, 41)) + .widget( + new TextWidget(StatCollector.translateToLocal("GT5U.machines.digitaltank.lockfluid.label")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(101, 20)) + .widget(TextWidget.dynamicString(() -> { + FluidStack fluidStack = FluidRegistry.getFluidStack(lockedFluidName, 1); + return fluidStack != null ? fluidStack.getLocalizedName() + : StatCollector.translateToLocal("GT5U.machines.digitaltank.lockfluid.empty"); + }) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setTextAlignment(Alignment.CenterLeft) + .setMaxWidth(65) + .setPos(101, 30)) + .widget(new CycleButtonWidget().setToggle(() -> mOutputFluid, val -> { + mOutputFluid = val; + if (!mOutputFluid) { + GTUtility.sendChatToPlayer( + buildContext.getPlayer(), + GTUtility.trans("262", "Fluid Auto Output Disabled")); + } else { + GTUtility.sendChatToPlayer( + buildContext.getPlayer(), + GTUtility.trans("263", "Fluid Auto Output Enabled")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_AUTOOUTPUT_FLUID) + .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.autooutput.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7, 63) + .setSize(18, 18)) + .widget(new CycleButtonWidget().setToggle(() -> mLockFluid, val -> { + lockFluid(val); + fluidTank.setPreventDraining(mLockFluid); + + String inBrackets; + if (mLockFluid) { + if (mFluid == null) { + setLockedFluidName(null); + inBrackets = GTUtility + .trans("264", "currently none, will be locked to the next that is put in"); + } else { + setLockedFluidName( + getDrainableStack().getFluid() + .getName()); + inBrackets = getDrainableStack().getLocalizedName(); + } + GTUtility.sendChatToPlayer( + buildContext.getPlayer(), + String.format("%s (%s)", GTUtility.trans("265", "1 specific Fluid"), inBrackets)); + } else { + fluidTank.drain(0, true); + GTUtility + .sendChatToPlayer(buildContext.getPlayer(), GTUtility.trans("266", "Lock Fluid Mode Disabled")); + } + fluidSlotWidget.notifyTooltipChange(); + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_LOCK) + .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.lockfluid.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(25, 63) + .setSize(18, 18)) + .widget(new CycleButtonWidget().setToggle(() -> mAllowInputFromOutputSide, val -> { + mAllowInputFromOutputSide = val; + if (!mAllowInputFromOutputSide) { + GTUtility.sendChatToPlayer(buildContext.getPlayer(), GTUtility.getTrans("096")); + } else { + GTUtility.sendChatToPlayer(buildContext.getPlayer(), GTUtility.getTrans("095")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_INPUT_FROM_OUTPUT_SIDE) + .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.inputfromoutput.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(43, 63) + .setSize(18, 18)) + .widget(new CycleButtonWidget().setToggle(() -> mVoidFluidPart, val -> { + mVoidFluidPart = val; + fluidTank.setAllowOverflow(allowOverflow()); + if (!mVoidFluidPart) { + GTUtility.sendChatToPlayer( + buildContext.getPlayer(), + GTUtility.trans("267", "Overflow Voiding Mode Disabled")); + } else { + GTUtility.sendChatToPlayer( + buildContext.getPlayer(), + GTUtility.trans("268", "Overflow Voiding Mode Enabled")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_TANK_VOID_EXCESS) + .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.voidoverflow.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(98, 63) + .setSize(18, 18)) + .widget(new CycleButtonWidget().setToggle(() -> mVoidFluidFull, val -> { + mVoidFluidFull = val; + fluidTank.setAllowOverflow(allowOverflow()); + if (!mVoidFluidFull) { + GTUtility + .sendChatToPlayer(buildContext.getPlayer(), GTUtility.trans("269", "Void Full Mode Disabled")); + } else { + GTUtility + .sendChatToPlayer(buildContext.getPlayer(), GTUtility.trans("270", "Void Full Mode Enabled")); + } + }) + .setVariableBackground(GTUITextures.BUTTON_STANDARD_TOGGLE) + .setStaticTexture(GTUITextures.OVERLAY_BUTTON_TANK_VOID_ALL) + .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.voidfull.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(116, 63) + .setSize(18, 18)); + } +} diff --git a/src/main/java/gregtech/common/tileentities/storage/MTELocker.java b/src/main/java/gregtech/common/tileentities/storage/MTELocker.java new file mode 100644 index 0000000000..6398f56bec --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/storage/MTELocker.java @@ -0,0 +1,284 @@ +package gregtech.common.tileentities.storage; + +import static gregtech.api.enums.Textures.BlockIcons.LOCKERS; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_IN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_LOCKER; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.GTValues; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; +import gregtech.api.objects.GTItemStack; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +public class MTELocker extends MTETieredMachineBlock { + + private static final String CHARGE_SLOT_WAILA_TAG = "charge_slot_"; + public byte mType = 0; + + public MTELocker(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 4, "Stores and recharges Armor"); + } + + public MTELocker(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures); + } + + public MTELocker(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures); + } + + @Override + public String[] getDescription() { + String[] desc = new String[mDescriptionArray.length + 1]; + System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length); + desc[mDescriptionArray.length] = "Click with Screwdriver to change Style"; + return desc; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[3][17][]; + for (byte i = -1; i < 16; i = (byte) (i + 1)) { + ITexture[] tmp0 = { MACHINE_CASINGS[this.mTier][(i + 1)] }; + rTextures[0][(i + 1)] = tmp0; + ITexture[] tmp1 = { MACHINE_CASINGS[this.mTier][(i + 1)], OVERLAYS_ENERGY_IN[this.mTier] }; + rTextures[1][(i + 1)] = tmp1; + ITexture[] tmp2 = { MACHINE_CASINGS[this.mTier][(i + 1)], TextureFactory.of(OVERLAY_LOCKER) }; + rTextures[2][(i + 1)] = tmp2; + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing, + int colorIndex, boolean aActive, boolean redstoneLevel) { + if (side == aFacing) { + return new ITexture[] { this.mTextures[2][(colorIndex + 1)][0], this.mTextures[2][(colorIndex + 1)][1], + LOCKERS[Math.abs(this.mType % LOCKERS.length)] }; + } + return this.mTextures[0][(colorIndex + 1)]; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTELocker(this.mName, this.mTier, this.mDescriptionArray, this.mTextures); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getBackFacing(); + } + + @Override + public boolean isTeleporterCompatible() { + return false; + } + + @Override + public long maxEUStore() { + return GTValues.V[this.mTier] * maxAmperesIn(); + } + + @Override + public long maxEUInput() { + return GTValues.V[this.mTier]; + } + + @Override + public long maxAmperesIn() { + return this.mInventory.length * 2L; + } + + @Override + public int rechargerSlotStartIndex() { + return 0; + } + + @Override + public int rechargerSlotCount() { + return getBaseMetaTileEntity().isAllowedToWork() ? this.mInventory.length : 0; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setByte("mType", this.mType); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + this.mType = aNBT.getByte("mType"); + } + + @Override + public void onValueUpdate(byte aValue) { + this.mType = aValue; + } + + @Override + public byte getUpdateData() { + return this.mType; + } + + @Override + public void doSound(byte aIndex, double aX, double aY, double aZ) { + if (aIndex == 16) { + GTUtility.doSoundAtClient(SoundResource.RANDOM_CLICK, 1, 1.0F); + } + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (side == getBaseMetaTileEntity().getFrontFacing()) { + this.mType = ((byte) (this.mType + 1)); + } + } + + @Override + public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aStack) { + return side != getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + if ((aBaseMetaTileEntity.isServerSide()) && (side == aBaseMetaTileEntity.getFrontFacing())) { + for (int i = 0; i < 4; i++) { + ItemStack tSwapStack = this.mInventory[i]; + this.mInventory[i] = aPlayer.inventory.armorInventory[i]; + aPlayer.inventory.armorInventory[i] = tSwapStack; + } + aPlayer.inventoryContainer.detectAndSendChanges(); + sendSound((byte) 16); + } + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + super.getWailaNBTData(player, tile, tag, world, x, y, z); + for (int i = 0; i < 4; i++) { + final ItemStack itemStack = this.mInventory[3 - i]; + + if (itemStack != null) { + tag.setTag(CHARGE_SLOT_WAILA_TAG + i, itemStack.writeToNBT(new NBTTagCompound())); + } + } + } + + @Override + public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + super.getWailaBody(itemStack, currentTip, accessor, config); + + final NBTTagCompound tag = accessor.getNBTData(); + + for (int i = 0; i < 4; i++) { + final String index = GTUtility.formatNumbers(i + 1); + + if (tag.hasKey(CHARGE_SLOT_WAILA_TAG + i)) { + final ItemStack slotItem = ItemStack + .loadItemStackFromNBT(tag.getCompoundTag(CHARGE_SLOT_WAILA_TAG + i)); + assert slotItem != null; + + currentTip.add( + GTModHandler.getElectricItemCharge(slotItem) + .map(chargeInfo -> { + final float ratio = (float) chargeInfo[0] / (float) chargeInfo[1]; + final EnumChatFormatting chargeFormat; + + if (ratio == 0L) { + chargeFormat = EnumChatFormatting.GRAY; + } else if (ratio < 0.25) { + chargeFormat = EnumChatFormatting.RED; + } else if (ratio < 0.5) { + chargeFormat = EnumChatFormatting.GOLD; + } else if (ratio < 0.75) { + chargeFormat = EnumChatFormatting.YELLOW; + } else if (ratio < 1L) { + chargeFormat = EnumChatFormatting.GREEN; + } else { + chargeFormat = EnumChatFormatting.AQUA; + } + + return StatCollector.translateToLocalFormatted( + "gt.locker.waila_armor_slot_charged", + index, + slotItem.getDisplayName(), + chargeFormat, + GTUtility.formatNumbers(ratio * 100)); + }) + .orElseGet( + // Lazy initialization + () -> StatCollector.translateToLocalFormatted( + "gt.locker.waila_armor_slot_generic", + index, + slotItem.getDisplayName()))); + } else { + currentTip.add(StatCollector.translateToLocalFormatted("gt.locker.waila_armor_slot_none", index)); + } + } + } +} diff --git a/src/main/java/gregtech/common/tileentities/storage/MTEQuantumChest.java b/src/main/java/gregtech/common/tileentities/storage/MTEQuantumChest.java new file mode 100644 index 0000000000..5402ded873 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/storage/MTEQuantumChest.java @@ -0,0 +1,102 @@ +package gregtech.common.tileentities.storage; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +public class MTEQuantumChest extends MTEDigitalChestBase { + + public int mItemCount = 0; + public ItemStack mItemStack = null; + NBTTagList mInvData = null; + + public MTEQuantumChest(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + } + + public MTEQuantumChest(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEQuantumChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEQuantumChest(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public void setItemNBT(NBTTagCompound aNBT) { + mInvData = new NBTTagList(); + for (int i = 0; i < 3; i++) { + if (mInventory[i] != null) { + NBTTagCompound tNBT = new NBTTagCompound(); + tNBT.setByte("Count", (byte) mInventory[i].stackSize); + tNBT.setShort("Damage", (short) mInventory[i].getItemDamage()); + tNBT.setShort("id", (short) Item.getIdFromItem(mInventory[i].getItem())); + tNBT.setInteger("IntSlot", i); + if (mInventory[i].hasTagCompound()) { + tNBT.setTag("tag", mInventory[i].getTagCompound()); + } + mInvData.appendTag(tNBT); + } + } + if (mItemStack != null) aNBT.setTag("mItemStack", getItemStack().writeToNBT(new NBTTagCompound())); + aNBT.setTag("Inventory", mInvData); + aNBT.setInteger("mItemCount", getItemCount()); + aNBT.setBoolean("mVoidOverflow", mVoidOverflow); + + super.setItemNBT(aNBT); + } + + @Override + protected String chestName() { + return "Quantum Chest"; + } + + @Override + protected int getItemCount() { + return mItemCount; + } + + @Override + public void setItemCount(int aCount) { + mItemCount = aCount; + } + + @Override + protected ItemStack getItemStack() { + return mItemStack; + } + + @Override + protected void setItemStack(ItemStack s) { + mItemStack = s; + } + + @Nullable + @Override + public List getItemsForHoloGlasses() { + List ret = new ArrayList<>(); + ret.add(getStackInSlot(0)); + ret.add(getStackInSlot(1)); + if (mItemStack != null) { + ItemStack copy = mItemStack.copy(); + copy.stackSize = mItemCount; + ret.add(copy); + } + return ret; + } +} diff --git a/src/main/java/gregtech/common/tileentities/storage/MTEQuantumTank.java b/src/main/java/gregtech/common/tileentities/storage/MTEQuantumTank.java new file mode 100644 index 0000000000..5ec574a59f --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/storage/MTEQuantumTank.java @@ -0,0 +1,55 @@ +package gregtech.common.tileentities.storage; + +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.util.GTUtility; + +public class MTEQuantumTank extends MTEDigitalTankBase { + + public MTEQuantumTank(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + } + + public MTEQuantumTank(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTEQuantumTank(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTEQuantumTank(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public String[] getInfoData() { + + if (mFluid == null) { + return new String[] { EnumChatFormatting.BLUE + "Quantum Tank" + EnumChatFormatting.RESET, "Stored Fluid:", + EnumChatFormatting.GOLD + "No Fluid" + EnumChatFormatting.RESET, + EnumChatFormatting.GREEN + Integer.toString(0) + + " L" + + EnumChatFormatting.RESET + + " " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getCapacity()) + + " L" + + EnumChatFormatting.RESET }; + } + return new String[] { EnumChatFormatting.BLUE + "Quantum Tank" + EnumChatFormatting.RESET, "Stored Fluid:", + EnumChatFormatting.GOLD + mFluid.getLocalizedName() + EnumChatFormatting.RESET, + EnumChatFormatting.GREEN + GTUtility.formatNumbers(mFluid.amount) + + " L" + + EnumChatFormatting.RESET + + " " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getCapacity()) + + " L" + + EnumChatFormatting.RESET }; + } +} diff --git a/src/main/java/gregtech/common/tileentities/storage/MTESuperChest.java b/src/main/java/gregtech/common/tileentities/storage/MTESuperChest.java new file mode 100644 index 0000000000..8e3f35d2c1 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/storage/MTESuperChest.java @@ -0,0 +1,30 @@ +package gregtech.common.tileentities.storage; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +public class MTESuperChest extends MTEQuantumChest { + + public MTESuperChest(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + } + + public MTESuperChest(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTESuperChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + protected String chestName() { + return "Super Chest"; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESuperChest(mName, mTier, mDescriptionArray, mTextures); + } +} diff --git a/src/main/java/gregtech/common/tileentities/storage/MTESuperTank.java b/src/main/java/gregtech/common/tileentities/storage/MTESuperTank.java new file mode 100644 index 0000000000..1e1e2fb109 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/storage/MTESuperTank.java @@ -0,0 +1,54 @@ +package gregtech.common.tileentities.storage; + +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.util.GTUtility; + +public class MTESuperTank extends MTEDigitalTankBase { + + public MTESuperTank(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + } + + public MTESuperTank(String aName, int aTier, String aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + public MTESuperTank(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new MTESuperTank(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public String[] getInfoData() { + + if (mFluid == null) { + return new String[] { EnumChatFormatting.BLUE + "Super Tank" + EnumChatFormatting.RESET, "Stored Fluid:", + EnumChatFormatting.GOLD + "No Fluid" + EnumChatFormatting.RESET, + EnumChatFormatting.GREEN + "0 L" + + EnumChatFormatting.RESET + + " " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getCapacity()) + + " L" + + EnumChatFormatting.RESET }; + } + return new String[] { EnumChatFormatting.BLUE + "Super Tank" + EnumChatFormatting.RESET, "Stored Fluid:", + EnumChatFormatting.GOLD + mFluid.getLocalizedName() + EnumChatFormatting.RESET, + EnumChatFormatting.GREEN + GTUtility.formatNumbers(mFluid.amount) + + " L" + + EnumChatFormatting.RESET + + " " + + EnumChatFormatting.YELLOW + + GTUtility.formatNumbers(getCapacity()) + + " L" + + EnumChatFormatting.RESET }; + } +} diff --git a/src/main/java/gregtech/common/tools/GTTool.java b/src/main/java/gregtech/common/tools/GTTool.java new file mode 100644 index 0000000000..436ec767a9 --- /dev/null +++ b/src/main/java/gregtech/common/tools/GTTool.java @@ -0,0 +1,196 @@ +package gregtech.common.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.AchievementList; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.api.damagesources.GTDamageSources; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IToolStats; +import gregtech.api.items.MetaGeneratedTool; + +public abstract class GTTool implements IToolStats { + + public static final Enchantment[] FORTUNE_ENCHANTMENT = { Enchantment.fortune }; + public static final Enchantment[] LOOTING_ENCHANTMENT = { Enchantment.looting }; + public static final Enchantment[] ZERO_ENCHANTMENTS = new Enchantment[0]; + public static final int[] ZERO_ENCHANTMENT_LEVELS = new int[0]; + + @Override + public int getToolDamagePerBlockBreak() { + return 100; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { + return aOriginalHurtResistance; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getBreakingSound() { + return SoundResource.RANDOM_BREAK.toString(); + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isGrafter() { + return false; + } + + @Override + public boolean isChainsaw() { + return false; + } + + @Override + public boolean isWrench() { + return false; + } + + @Override + public boolean isWeapon() { + return false; + } + + @Override + public boolean isRangedWeapon() { + return false; + } + + @Override + public boolean isMiningTool() { + return true; + } + + @Override + public DamageSource getDamageSource(EntityLivingBase aPlayer, Entity aEntity) { + return GTDamageSources.getCombatDamage( + (aPlayer instanceof EntityPlayer) ? "player" : "mob", + aPlayer, + (aEntity instanceof EntityLivingBase) ? getDeathMessage(aPlayer, (EntityLivingBase) aEntity) : null); + } + + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new EntityDamageSource((aPlayer instanceof EntityPlayer) ? "player" : "mob", aPlayer) + .func_151519_b(aEntity); + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + return 0; + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public Enchantment[] getEnchantments(ItemStack aStack) { + return ZERO_ENCHANTMENTS; + } + + @Override + public int[] getEnchantmentLevels(ItemStack aStack) { + return ZERO_ENCHANTMENT_LEVELS; + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + aPlayer.triggerAchievement(AchievementList.openInventory); + aPlayer.triggerAchievement(AchievementList.mineWood); + aPlayer.triggerAchievement(AchievementList.buildWorkBench); + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + return aOriginalDamage; + } + + @Override + public float getMagicDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + return aOriginalDamage; + } + + @Override + public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj, + int aX, int aY, int aZ) { + return aDefault; + } + + @Override + public String getToolTypeName() { + return "tool"; + } +} diff --git a/src/main/java/gregtech/common/tools/GT_Tool.java b/src/main/java/gregtech/common/tools/GT_Tool.java deleted file mode 100644 index cb637a1bd5..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool.java +++ /dev/null @@ -1,196 +0,0 @@ -package gregtech.common.tools; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.AchievementList; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.World; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.api.damagesources.GT_DamageSources; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.IToolStats; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public abstract class GT_Tool implements IToolStats { - - public static final Enchantment[] FORTUNE_ENCHANTMENT = { Enchantment.fortune }; - public static final Enchantment[] LOOTING_ENCHANTMENT = { Enchantment.looting }; - public static final Enchantment[] ZERO_ENCHANTMENTS = new Enchantment[0]; - public static final int[] ZERO_ENCHANTMENT_LEVELS = new int[0]; - - @Override - public int getToolDamagePerBlockBreak() { - return 100; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { - return aOriginalHurtResistance; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getBreakingSound() { - return SoundResource.RANDOM_BREAK.toString(); - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isGrafter() { - return false; - } - - @Override - public boolean isChainsaw() { - return false; - } - - @Override - public boolean isWrench() { - return false; - } - - @Override - public boolean isWeapon() { - return false; - } - - @Override - public boolean isRangedWeapon() { - return false; - } - - @Override - public boolean isMiningTool() { - return true; - } - - @Override - public DamageSource getDamageSource(EntityLivingBase aPlayer, Entity aEntity) { - return GT_DamageSources.getCombatDamage( - (aPlayer instanceof EntityPlayer) ? "player" : "mob", - aPlayer, - (aEntity instanceof EntityLivingBase) ? getDeathMessage(aPlayer, (EntityLivingBase) aEntity) : null); - } - - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new EntityDamageSource((aPlayer instanceof EntityPlayer) ? "player" : "mob", aPlayer) - .func_151519_b(aEntity); - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - return 0; - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public Enchantment[] getEnchantments(ItemStack aStack) { - return ZERO_ENCHANTMENTS; - } - - @Override - public int[] getEnchantmentLevels(ItemStack aStack) { - return ZERO_ENCHANTMENT_LEVELS; - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - aPlayer.triggerAchievement(AchievementList.openInventory); - aPlayer.triggerAchievement(AchievementList.mineWood); - aPlayer.triggerAchievement(AchievementList.buildWorkBench); - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - return aOriginalDamage; - } - - @Override - public float getMagicDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - return aOriginalDamage; - } - - @Override - public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj, - int aX, int aY, int aZ) { - return aDefault; - } - - @Override - public String getToolTypeName() { - return "tool"; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Axe.java b/src/main/java/gregtech/common/tools/GT_Tool_Axe.java deleted file mode 100644 index c54ebac3c9..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Axe.java +++ /dev/null @@ -1,175 +0,0 @@ -package gregtech.common.tools; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.World; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_Axe extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public float getSpeedMultiplier() { - return 2.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "axe") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.wood) - || GT_ToolHarvestHelper.isSpecialBlock(aBlock, Blocks.ladder); - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - int rAmount = 0; - if ((GregTech_API.sTimber) && (!aPlayer.isSneaking()) - && (OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData)))) { - int tY = aY + 1; - for (int tH = aPlayer.worldObj.getHeight(); tY < tH; tY++) { - if ((aPlayer.worldObj.getBlock(aX, tY, aZ) != aBlock) - || (!aPlayer.worldObj.func_147480_a(aX, tY, aZ, true))) { - break; - } - rAmount++; - } - } - return rAmount; - } - - @Override - public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World aWorld, - int aX, int aY, int aZ) { - - if (aBlock.isWood(aPlayer.worldObj, aX, aY, aZ) - && OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData))) { - float rAmount = 1.0F; - float tIncrement = 1.0F; - if ((GregTech_API.sTimber) && !aPlayer.isSneaking()) { - int tY = aY + 1; - for (int tH = aPlayer.worldObj.getHeight(); (tY < tH) - && (aPlayer.worldObj.getBlock(aX, tY, aZ) == aBlock); tY++) { - tIncrement += 0.1F; - rAmount += tIncrement; - } - } - return 2.0F * aDefault / rAmount; - } - - return (aBlock.getMaterial() == Material.leaves) || (aBlock.getMaterial() == Material.vine) - || (aBlock.getMaterial() == Material.plants) - || (aBlock.getMaterial() == Material.gourd) ? aDefault / 4.0F : aDefault; - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mIconSet.mTextures[OrePrefixes.toolHeadAxe.mTextureIndex] - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mIconSet.mTextures[OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has been chopped by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java b/src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java deleted file mode 100644 index a8b83a0221..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java +++ /dev/null @@ -1,101 +0,0 @@ -package gregtech.common.tools; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.api.util.GT_Utility; - -public class GT_Tool_BranchCutter extends GT_Tool { - - @Override - public float getBaseDamage() { - return 2.5F; - } - - @Override - public float getSpeedMultiplier() { - return 0.25F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 0.25F; - } - - @Override - public boolean isGrafter() { - return true; - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - if (aBlock.getMaterial() == Material.leaves) { - aEvent.dropChance = Math.min( - 1.0F, - Math.max( - aEvent.dropChance, - (aStack.getItem() - .getHarvestLevel(aStack, "") + 1) * 0.2F)); - if (aBlock == Blocks.leaves) { - aDrops.clear(); - if (((aMetaData & 0x3) == 0) && (aPlayer.worldObj.rand.nextInt(9) <= aFortune * 2)) { - aDrops.add(new ItemStack(Items.apple, 1, 0)); - } else { - aDrops.add(new ItemStack(Blocks.sapling, 1, aMetaData & 0x3)); - } - } else if (aBlock == Blocks.leaves2) { - aDrops.clear(); - aDrops.add(new ItemStack(Blocks.sapling, 1, (aMetaData & 0x3) + 4)); - } else if (aBlock == GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("rubberLeaves", 1L))) { - aDrops.clear(); - aDrops.add(GT_ModHandler.getIC2Item("rubberSapling", 1L)); - } - } - return 0; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "grafter") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.leaves); - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.GRAFTER : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has been trimmed by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java b/src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java deleted file mode 100644 index bdfe66401a..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java +++ /dev/null @@ -1,104 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_ButcheryKnife extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 200; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { - return aOriginalHurtResistance * 2; - } - - @Override - public float getSpeedMultiplier() { - return 0.1F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public boolean isMiningTool() { - return false; - } - - @Override - public Enchantment[] getEnchantments(ItemStack aStack) { - return LOOTING_ENCHANTMENT; - } - - @Override - public int[] getEnchantmentLevels(ItemStack aStack) { - return new int[] { (2 + GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolQuality) / 2 }; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.BUTCHERYKNIFE : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has butchered " - + EnumChatFormatting.RED - + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE); - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return false; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java b/src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java deleted file mode 100644 index 4d7192ce93..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java +++ /dev/null @@ -1,81 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_BuzzSaw extends GT_Tool_Saw { - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 300; - } - - @Override - public float getBaseDamage() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); - } - - @Override - public String getEntityHitSound() { - return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO.toString(); - } - - @Override - public String getMiningSound() { - return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return false; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadBuzzSaw.mTextureIndex] - : Textures.ItemIcons.HANDLE_BUZZSAW; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got buzzed by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java deleted file mode 100644 index 38c1d3acb8..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Chainsaw_HV extends GT_Tool_Chainsaw_LV { - - @Override - public int getToolDamagePerBlockBreak() { - return 800; - } - - @Override - public int getToolDamagePerDropConversion() { - return 1600; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 12800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 3200; - } - - @Override - public int getBaseQuality() { - return 1; - } - - @Override - public float getBaseDamage() { - return 4.0F; - } - - @Override - public float getSpeedMultiplier() { - return 4.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_HV; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java deleted file mode 100644 index 142b0c50d2..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java +++ /dev/null @@ -1,185 +0,0 @@ -package gregtech.common.tools; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.World; -import net.minecraftforge.common.IShearable; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_Chainsaw_LV extends GT_Tool_Saw { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public float getSpeedMultiplier() { - return 2.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); - } - - @Override - public String getEntityHitSound() { - return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO.toString(); - } - - @Override - public String getMiningSound() { - return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isChainsaw() { - return true; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - try { - GT_Mod.achievements.issueAchievement(aPlayer, "brrrr"); - GT_Mod.achievements.issueAchievement(aPlayer, "buildChainsaw"); - } catch (Exception ignored) {} - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - int rAmount = 0; - if ((aBlock.getMaterial() == Material.leaves) && ((aBlock instanceof IShearable))) { - aPlayer.worldObj.setBlock(aX, aY, aZ, aBlock, aMetaData, 0); - if (((IShearable) aBlock).isShearable(aStack, aPlayer.worldObj, aX, aY, aZ)) { - ((IShearable) aBlock).onSheared(aStack, aPlayer.worldObj, aX, aY, aZ, aFortune); - aDrops.clear(); - } - aPlayer.worldObj.setBlock(aX, aY, aZ, Blocks.air, 0, 0); - } else if (((aBlock.getMaterial() == Material.ice) || (aBlock.getMaterial() == Material.packedIce)) - && (aDrops.isEmpty())) { - aDrops.add(new ItemStack(aBlock, 1, aMetaData)); - aPlayer.worldObj.setBlockToAir(aX, aY, aZ); - aEvent.dropChance = 1.0F; - return 1; - } - if ((GregTech_API.sTimber) && (!aPlayer.isSneaking()) - && (OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData)))) { - int tY = aY + 1; - for (int tH = aPlayer.worldObj.getHeight(); tY < tH; tY++) { - if ((aPlayer.worldObj.getBlock(aX, tY, aZ) != aBlock) - || (!aPlayer.worldObj.func_147480_a(aX, tY, aZ, true))) { - break; - } - rAmount++; - } - } - return rAmount; - } - - @Override - public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World aWorld, - int aX, int aY, int aZ) { - if (aBlock.isWood(aPlayer.worldObj, aX, aY, aZ) - && OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData))) { - float rAmount = 1.0F; - float tIncrement = 1.0F; - if ((GregTech_API.sTimber) && !aPlayer.isSneaking()) { - int tY = aY + 1; - for (int tH = aPlayer.worldObj.getHeight(); (tY < tH) - && (aPlayer.worldObj.getBlock(aX, tY, aZ) == aBlock); tY++) { - tIncrement += 0.1F; - rAmount += tIncrement; - } - } - return 2.0F * aDefault / rAmount; - } - return (aBlock.getMaterial() == Material.leaves) || (aBlock.getMaterial() == Material.vine) - || (aBlock.getMaterial() == Material.plants) - || (aBlock.getMaterial() == Material.gourd) ? aDefault / 4.0F : aDefault; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_LV; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " was massacred by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java deleted file mode 100644 index 6c88895e48..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Chainsaw_MV extends GT_Tool_Chainsaw_LV { - - @Override - public int getToolDamagePerBlockBreak() { - return 200; - } - - @Override - public int getToolDamagePerDropConversion() { - return 400; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 3200; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 800; - } - - @Override - public int getBaseQuality() { - return 1; - } - - @Override - public float getBaseDamage() { - return 3.5F; - } - - @Override - public float getSpeedMultiplier() { - return 3.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 2.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_MV; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java b/src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java deleted file mode 100644 index 3db30faca1..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java +++ /dev/null @@ -1,139 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import com.google.common.base.Strings; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.IToolStats; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.GT_MetaGenerated_Tool_01; -import gregtech.common.items.behaviors.Behaviour_Crowbar; - -public class GT_Tool_Crowbar extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 2.0F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return true; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - if (aBlock.getMaterial() == Material.circuits) { - return true; - } - String tTool = aBlock.getHarvestTool(aMetaData); - if (Strings.isNullOrEmpty(tTool)) { - for (IToolStats i : GT_MetaGenerated_Tool_01.INSTANCE.mToolStats.values()) { - if (i instanceof GT_Tool_Crowbar && i != this && !i.isMinableBlock(aBlock, aMetaData)) { - return false; - } - } - return true; - } - return tTool.equals("crowbar"); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.CROWBAR : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : null; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Crowbar(1, 1000)); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " was removed by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java b/src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java deleted file mode 100644 index 597e8b0725..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java +++ /dev/null @@ -1,68 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import gregtech.GT_Mod; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Drill_HV extends GT_Tool_Drill_LV { - - @Override - public int getToolDamagePerBlockBreak() { - return 800; - } - - @Override - public int getToolDamagePerDropConversion() { - return 1600; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 12800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 3200; - } - - @Override - public int getBaseQuality() { - return 1; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public float getSpeedMultiplier() { - return 9.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - try { - GT_Mod.achievements.issueAchievement(aPlayer, "highpowerdrill"); - GT_Mod.achievements.issueAchievement(aPlayer, "buildDDrill"); - } catch (Exception ignored) {} - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_HV; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java deleted file mode 100644 index f06c2c812d..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java +++ /dev/null @@ -1,152 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.AchievementList; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.GT_Mod; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_Drill_LV extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 2.0F; - } - - @Override - public float getSpeedMultiplier() { - return 3.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); - } - - @Override - public String getEntityHitSound() { - return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); - } - - @Override - public String getBreakingSound() { - return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); - } - - @Override - public String getMiningSound() { - return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe", "shovel") - || GT_ToolHarvestHelper.isAppropriateMaterial( - aBlock, - Material.rock, - Material.iron, - Material.anvil, - Material.sand, - Material.grass, - Material.ground, - Material.snow, - Material.clay, - Material.glass); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_LV; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - aPlayer.triggerAchievement(AchievementList.buildPickaxe); - aPlayer.triggerAchievement(AchievementList.buildBetterPickaxe); - try { - GT_Mod.achievements.issueAchievement(aPlayer, "driltime"); - GT_Mod.achievements.issueAchievement(aPlayer, "buildDrill"); - } catch (Exception ignored) {} - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got the Drill! (by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + ")"); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java b/src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java deleted file mode 100644 index 7b6b54d4b5..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Drill_MV extends GT_Tool_Drill_LV { - - @Override - public int getToolDamagePerBlockBreak() { - return 200; - } - - @Override - public int getToolDamagePerDropConversion() { - return 400; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 3200; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 800; - } - - @Override - public int getBaseQuality() { - return 1; - } - - @Override - public float getBaseDamage() { - return 2.5F; - } - - @Override - public float getSpeedMultiplier() { - return 6.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 2.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_MV; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_File.java b/src/main/java/gregtech/common/tools/GT_Tool_File.java deleted file mode 100644 index 0a8610a462..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_File.java +++ /dev/null @@ -1,124 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_File extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 400; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.5F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMiningTool() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "file"); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadFile.mTextureIndex] - : Textures.ItemIcons.HANDLE_FILE; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has been filed D for 'Dead' by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java b/src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java deleted file mode 100644 index 066abd48b8..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java +++ /dev/null @@ -1,203 +0,0 @@ -package gregtech.common.tools; - -import static gregtech.GT_Mod.MAX_IC2; - -import java.util.Arrays; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityIronGolem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.GT_Mod; -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.api.util.GT_Utility; -import gregtech.common.items.behaviors.Behaviour_Prospecting; - -public class GT_Tool_HardHammer extends GT_Tool { - - public static final List mEffectiveList = Arrays - .asList(EntityIronGolem.class.getName(), "EntityTowerGuardian"); - - @Override - public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - String tName = aEntity.getClass() - .getName(); - tName = tName.substring(tName.lastIndexOf('.') + 1); - return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage; - } - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 200; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 400; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { - return aOriginalHurtResistance * 2; - } - - @Override - public float getSpeedMultiplier() { - return 0.75F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.RANDOM_ANVIL_USE.toString(); - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getBreakingSound() { - return SoundResource.RANDOM_ANVIL_BREAK.toString(); - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "hammer", "pickaxe") - || GT_ToolHarvestHelper - .isAppropriateMaterial(aBlock, Material.rock, Material.glass, Material.ice, Material.packedIce) - || RecipeMaps.hammerRecipes.containsInput(new ItemStack(aBlock, 1, aMetaData)); - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - int rConversions = 0; - GT_Recipe tRecipe = RecipeMaps.hammerRecipes - .findRecipe(null, true, MAX_IC2, null, new ItemStack(aBlock, 1, aMetaData)); - if ((tRecipe == null) || (aBlock.hasTileEntity(aMetaData))) { - for (ItemStack tDrop : aDrops) { - tRecipe = RecipeMaps.hammerRecipes - .findRecipe(null, true, MAX_IC2, null, GT_Utility.copyAmount(1, tDrop)); - if (tRecipe != null) { - ItemStack tHammeringOutput = tRecipe.getOutput(0); - if (tHammeringOutput != null) { - rConversions += tDrop.stackSize; - tDrop.stackSize *= tHammeringOutput.stackSize; - tHammeringOutput.stackSize = tDrop.stackSize; - GT_Utility.setStack(tDrop, tHammeringOutput); - } - } - } - } else { - aDrops.clear(); - aDrops.add(tRecipe.getOutput(0)); - rConversions++; - } - return rConversions; - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadHammer.mTextureIndex] - : GT_MetaGenerated_Tool - .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Prospecting(1, 1000)); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " was squashed by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - try { - GT_Mod.achievements.issueAchievement(aPlayer, "tools"); - } catch (Exception ignored) {} - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Hoe.java b/src/main/java/gregtech/common/tools/GT_Tool_Hoe.java deleted file mode 100644 index 2dc5496176..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Hoe.java +++ /dev/null @@ -1,132 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.AchievementList; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_Hoe; - -public class GT_Tool_Hoe extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.75F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "hoe") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.gourd); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool - .getPrimaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadHoe.mTextureIndex] - : GT_MetaGenerated_Tool - .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Hoe(100)); - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - aPlayer.triggerAchievement(AchievementList.buildHoe); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has been called a stupid Hoe by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java b/src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java deleted file mode 100644 index 7c8b17f711..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java +++ /dev/null @@ -1,128 +0,0 @@ -package gregtech.common.tools; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.GT_Mod; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.api.util.GT_Utility; - -public class GT_Tool_JackHammer extends GT_Tool_Drill_LV { - - @Override - public int getToolDamagePerBlockBreak() { - return 400; - } - - @Override - public int getToolDamagePerDropConversion() { - return 400; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 3200; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 800; - } - - @Override - public int getBaseQuality() { - return 1; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public float getSpeedMultiplier() { - return 12.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 2.0F; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe") // - || GT_ToolHarvestHelper.isAppropriateMaterial( - aBlock, // - Material.rock, // - Material.glass, // - Material.ice, // - Material.packedIce // - ); - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - int rConversions = 0; - GT_Recipe tRecipe = RecipeMaps.hammerRecipes - .findRecipe(null, true, 2147483647L, null, new ItemStack(aBlock, 1, aMetaData)); - if ((tRecipe == null) || (aBlock.hasTileEntity(aMetaData))) { - for (ItemStack tDrop : aDrops) { - tRecipe = RecipeMaps.hammerRecipes - .findRecipe(null, true, 2147483647L, null, GT_Utility.copyAmount(1, tDrop)); - if (tRecipe != null) { - ItemStack tHammeringOutput = tRecipe.getOutput(0); - if (tHammeringOutput != null) { - rConversions += tDrop.stackSize; - tDrop.stackSize *= tHammeringOutput.stackSize; - tHammeringOutput.stackSize = tDrop.stackSize; - GT_Utility.setStack(tDrop, tHammeringOutput); - } - } - } - } else { - aDrops.clear(); - aDrops.add(tRecipe.getOutput(0)); - rConversions++; - } - return rConversions; - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - try { - GT_Mod.achievements.issueAchievement(aPlayer, "hammertime"); - } catch (Exception ignored) {} - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.JACKHAMMER : null; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has been jackhammered into pieces by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Knife.java b/src/main/java/gregtech/common/tools/GT_Tool_Knife.java deleted file mode 100644 index 152476fa2d..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Knife.java +++ /dev/null @@ -1,76 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Knife extends GT_Tool_Sword { - - @Override - public int getToolDamagePerBlockBreak() { - return 100; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 600; - } - - @Override - public float getBaseDamage() { - return 0F; - } - - @Override - public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { - return aOriginalHurtResistance * 3; - } - - @Override - public float getSpeedMultiplier() { - return 0.5F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.KNIFE : null; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - "<" + EnumChatFormatting.RED - + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + "> " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + " what are you doing?, " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + "?!? STAHP!!!"); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Mortar.java b/src/main/java/gregtech/common/tools/GT_Tool_Mortar.java deleted file mode 100644 index 8e74d3bcc1..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Mortar.java +++ /dev/null @@ -1,120 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_Mortar extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 400; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 2.0F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMiningTool() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return false; - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.MORTAR : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Dyes._NULL.mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " was grounded by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java b/src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java deleted file mode 100644 index b755869112..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java +++ /dev/null @@ -1,139 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.AchievementList; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.GT_Mod; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_Pickaxe extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.5F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe") // - || GT_ToolHarvestHelper.isAppropriateMaterial( - aBlock, // - Material.rock, - Material.iron, - Material.anvil, - Material.glass); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadPickaxe.mTextureIndex] - : GT_MetaGenerated_Tool - .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - aPlayer.triggerAchievement(AchievementList.buildPickaxe); - aPlayer.triggerAchievement(AchievementList.buildBetterPickaxe); - try { - GT_Mod.achievements.issueAchievement(aPlayer, "flintpick"); - } catch (Exception ignored) {} - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got mined by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Plow.java b/src/main/java/gregtech/common/tools/GT_Tool_Plow.java deleted file mode 100644 index b6f4be25b5..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Plow.java +++ /dev/null @@ -1,110 +0,0 @@ -package gregtech.common.tools; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntitySnowman; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.World; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_Plow extends GT_Tool { - - private final ThreadLocal sIsHarvestingRightNow = new ThreadLocal<>(); - - @Override - public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - return (aEntity instanceof EntitySnowman) ? aOriginalDamage * 4.0F : aOriginalDamage; - } - - @Override - public float getBaseDamage() { - return 1.0F; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "plow") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.snow, Material.craftedSnow); - } - - @Override - public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj, - int aX, int aY, int aZ) { - // Speed nerf for using AOE tools to break single block - if (aPlayer != null && aPlayer.isSneaking()) { - return aDefault / 2; - } - return super.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, worldObj, aX, aY, aZ); - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - int rConversions = 0; - if ((this.sIsHarvestingRightNow.get() == null) && ((aPlayer instanceof EntityPlayerMP))) { - this.sIsHarvestingRightNow.set(this); - - if (!aPlayer.isSneaking()) { - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - for (int k = -1; k < 2; k++) { - if (((i != 0) || (j != 0) || (k != 0)) && (aStack.getItem() - .getDigSpeed( - aStack, - aPlayer.worldObj.getBlock(aX + i, aY + j, aZ + k), - aPlayer.worldObj.getBlockMetadata(aX + i, aY + j, aZ + k)) - > 0.0F) - && (((EntityPlayerMP) aPlayer).theItemInWorldManager - .tryHarvestBlock(aX + i, aY + j, aZ + k))) { - rConversions++; - } - } - } - } - } - - this.sIsHarvestingRightNow.set(null); - } - return rConversions; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadPlow.mTextureIndex] - : GT_MetaGenerated_Tool - .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + " plew through the yard of " - + EnumChatFormatting.RED - + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Plunger.java b/src/main/java/gregtech/common/tools/GT_Tool_Plunger.java deleted file mode 100644 index 76c1ccbc24..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Plunger.java +++ /dev/null @@ -1,92 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.IItemBehaviour; -import gregtech.api.items.GT_MetaBase_Item; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.api.util.GT_Utility; -import gregtech.common.items.behaviors.Behaviour_Plunger_Fluid; -import gregtech.common.items.behaviors.Behaviour_Plunger_Item; - -public class GT_Tool_Plunger extends GT_Tool { - - @Override - public float getBaseDamage() { - return 1.25F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 0.25F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); - } - - @Override - public String getEntityHitSound() { - return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); - } - - @Override - public String getMiningSound() { - return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "plunger"); - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.PLUNGER : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - @SuppressWarnings("unchecked") // the IItemBehaviour cast cannot be expressed strictly via generics - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Plunger_Item(getToolDamagePerDropConversion())); - aItem.addItemBehavior(aID, new Behaviour_Plunger_Fluid(getToolDamagePerDropConversion())); - try { - Object tObject = GT_Utility.callConstructor( - "gregtech.common.items.behaviors.Behaviour_Plunger_Essentia", - 0, - null, - false, - getToolDamagePerDropConversion()); - if ((tObject instanceof IItemBehaviour)) { - aItem.addItemBehavior(aID, (IItemBehaviour) tObject); - } - } catch (Throwable ignored) {} - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got stuck trying to escape through a Pipe while fighting " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java b/src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java deleted file mode 100644 index 9933c4eb13..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java +++ /dev/null @@ -1,70 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_RollingPin extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public float getBaseDamage() { - return 2.0F; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return false; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Dyes._NULL.mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.ROLLING_PIN : null; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got flattened by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Saw.java b/src/main/java/gregtech/common/tools/GT_Tool_Saw.java deleted file mode 100644 index b2c85e2a5e..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Saw.java +++ /dev/null @@ -1,149 +0,0 @@ -package gregtech.common.tools; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraftforge.common.IShearable; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_Saw extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 200; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.75F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - if ((aBlock.getMaterial() == Material.leaves) && ((aBlock instanceof IShearable))) { - aPlayer.worldObj.setBlock(aX, aY, aZ, aBlock, aMetaData, 0); - if (((IShearable) aBlock).isShearable(aStack, aPlayer.worldObj, aX, aY, aZ)) { - ArrayList tDrops = ((IShearable) aBlock) - .onSheared(aStack, aPlayer.worldObj, aX, aY, aZ, aFortune); - aDrops.clear(); - aDrops.addAll(tDrops); - aEvent.dropChance = 1.0F; - } - aPlayer.worldObj.setBlock(aX, aY, aZ, Blocks.air, 0, 0); - } else if (((aBlock.getMaterial() == Material.ice) || (aBlock.getMaterial() == Material.packedIce)) - && (aDrops.isEmpty())) { - aDrops.add(new ItemStack(aBlock, 1, aMetaData)); - aPlayer.worldObj.setBlockToAir(aX, aY, aZ); - aEvent.dropChance = 1.0F; - return 1; - } - return 0; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "axe", "saw") - || GT_ToolHarvestHelper.isAppropriateMaterial( - aBlock, - Material.leaves, - Material.vine, - Material.wood, - Material.cactus, - Material.ice, - Material.packedIce) - || GT_ToolHarvestHelper.isSpecialBlock(aBlock, Blocks.ladder); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool - .getPrimaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSaw.mTextureIndex] - : Textures.ItemIcons.HANDLE_SAW; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " was getting cut down by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Scoop.java b/src/main/java/gregtech/common/tools/GT_Tool_Scoop.java deleted file mode 100644 index 3181e108bf..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Scoop.java +++ /dev/null @@ -1,130 +0,0 @@ -package gregtech.common.tools; - -import static gregtech.api.enums.Mods.Forestry; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_None; -import gregtech.common.items.behaviors.Behaviour_Scoop; - -public class GT_Tool_Scoop extends GT_Tool { - - public static Material sBeeHiveMaterial; - - @Override - public int getToolDamagePerBlockBreak() { - return 200; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 200; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.0F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "scoop") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, sBeeHiveMaterial); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.SCOOP : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - if (Forestry.isModLoaded()) { - aItem.addItemBehavior(aID, new Behaviour_Scoop(200)); - } else { - aItem.addItemBehavior(aID, new Behaviour_None()); - } - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got scooped up by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java b/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java deleted file mode 100644 index 1d7f4e655d..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java +++ /dev/null @@ -1,160 +0,0 @@ -package gregtech.common.tools; - -import java.util.Arrays; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityCaveSpider; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_Screwdriver; - -public class GT_Tool_Screwdriver extends GT_Tool { - - public static final List mEffectiveList = Arrays.asList( - EntityCaveSpider.class.getName(), - EntitySpider.class.getName(), - "EntityTFHedgeSpider", - "EntityTFKingSpider", - "EntityTFSwarmSpider", - "EntityTFTowerBroodling"); - - @Override - public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - String tName = aEntity.getClass() - .getName(); - tName = tName.substring(tName.lastIndexOf('.') + 1); - return mEffectiveList.contains(tName) ? aOriginalDamage * 2.0F : aOriginalDamage; - } - - @Override - public int getToolDamagePerBlockBreak() { - return 200; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 400; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.5F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_WRENCH.toString(); - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMiningTool() { - return false; - } - - @Override - public boolean isScrewdriver() { - return true; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "screwdriver") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.circuits); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadScrewdriver.mTextureIndex] - : Textures.ItemIcons.HANDLE_SCREWDRIVER; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Screwdriver(1, 200)); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " is screwed! (by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + ")"); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java deleted file mode 100644 index e49e020b7b..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java +++ /dev/null @@ -1,34 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_Screwdriver_LV extends GT_Tool_Screwdriver { - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 200; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadScrewdriver.mTextureIndex] - : Textures.ItemIcons.HANDLE_ELECTRIC_SCREWDRIVER; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Sense.java b/src/main/java/gregtech/common/tools/GT_Tool_Sense.java deleted file mode 100644 index 013c0f800c..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Sense.java +++ /dev/null @@ -1,114 +0,0 @@ -package gregtech.common.tools; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.World; -import net.minecraftforge.event.world.BlockEvent; - -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_Sense; - -public class GT_Tool_Sense extends GT_Tool { - - private final ThreadLocal sIsHarvestingRightNow = new ThreadLocal<>(); - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "sense", "scythe") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.plants, Material.leaves); - } - - @Override - public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj, - int aX, int aY, int aZ) { - // Speed nerf for using AOE tools to break single block - if (aPlayer != null && aPlayer.isSneaking()) { - return aDefault / 2; - } - return super.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, worldObj, aX, aY, aZ); - } - - @Override - public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, - int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { - int rConversions = 0; - if ((this.sIsHarvestingRightNow.get() == null) && ((aPlayer instanceof EntityPlayerMP))) { - this.sIsHarvestingRightNow.set(this); - - if (!aPlayer.isSneaking()) { - for (int i = -2; i < 3; i++) { - for (int j = -2; j < 3; j++) { - for (int k = -2; k < 3; k++) { - if (((i != 0) || (j != 0) || (k != 0)) && (aStack.getItem() - .getDigSpeed( - aStack, - aPlayer.worldObj.getBlock(aX + i, aY + j, aZ + k), - aPlayer.worldObj.getBlockMetadata(aX + i, aY + j, aZ + k)) - > 0.0F) - && (((EntityPlayerMP) aPlayer).theItemInWorldManager - .tryHarvestBlock(aX + i, aY + j, aZ + k))) { - rConversions++; - } - } - } - } - } - - this.sIsHarvestingRightNow.set(null); - } - return rConversions; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSense.mTextureIndex] - : GT_MetaGenerated_Tool - .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Sense(getToolDamagePerBlockBreak())); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has taken the Soul of " - + EnumChatFormatting.RED - + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE); - } - -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Shovel.java b/src/main/java/gregtech/common/tools/GT_Tool_Shovel.java deleted file mode 100644 index 886ca126e0..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Shovel.java +++ /dev/null @@ -1,127 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_Shovel extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.5F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "shovel") - || GT_ToolHarvestHelper.isAppropriateMaterial( - aBlock, - Material.sand, - Material.grass, - Material.ground, - Material.snow, - Material.clay); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadShovel.mTextureIndex] - : GT_MetaGenerated_Tool - .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got dug up by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java b/src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java deleted file mode 100644 index cc3f5e738b..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java +++ /dev/null @@ -1,139 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.SoundResource; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_SoftHammer; - -public class GT_Tool_SoftHammer extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { - return aOriginalHurtResistance * 2; - } - - @Override - public float getSpeedMultiplier() { - return 0.1F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 8.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); - } - - @Override - public String getEntityHitSound() { - return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); - } - - @Override - public String getMiningSound() { - return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMiningTool() { - return false; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "softhammer"); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadMallet.mTextureIndex] - : GT_MetaGenerated_Tool.getSecondaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.handleMallet.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_SoftHammer(100)); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " was hammered to death by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java b/src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java deleted file mode 100644 index 9b5ef3a638..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java +++ /dev/null @@ -1,153 +0,0 @@ -package gregtech.common.tools; - -import java.util.Arrays; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityCaveSpider; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_Screwdriver; - -public class GT_Tool_Soldering_Iron extends GT_Tool { - - public static final List mEffectiveList = Arrays.asList( - EntityCaveSpider.class.getName(), - EntitySpider.class.getName(), - "EntityTFHedgeSpider", - "EntityTFKingSpider", - "EntityTFSwarmSpider", - "EntityTFTowerBroodling"); - - @Override - public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - String tName = aEntity.getClass() - .getName(); - tName = tName.substring(tName.lastIndexOf('.') + 1); - return mEffectiveList.contains(tName) ? aOriginalDamage * 2.0F : aOriginalDamage; - } - - @Override - public int getToolDamagePerBlockBreak() { - return 1000; - } - - @Override - public int getToolDamagePerDropConversion() { - return 500; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 1000; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 500; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.5F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_WRENCH.toString(); - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMiningTool() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "soldering_iron") - || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.circuits); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mIconSet.mTextures[49] - : Textures.ItemIcons.HANDLE_SOLDERING; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Screwdriver(1, 200)); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " got soldert! (by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + ")"); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Sword.java b/src/main/java/gregtech/common/tools/GT_Tool_Sword.java deleted file mode 100644 index 7bfaaee797..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Sword.java +++ /dev/null @@ -1,128 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.AchievementList; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_Sword extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 200; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 100; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 100; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 4.0F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "sword") - || GT_ToolHarvestHelper.isAppropriateMaterial( - aBlock, - Material.leaves, - Material.gourd, - Material.vine, - Material.web, - Material.cloth, - Material.carpet, - Material.plants, - Material.cactus, - Material.cake, - Material.tnt, - Material.sponge); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSword.mTextureIndex] - : Textures.ItemIcons.HANDLE_SWORD; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - aPlayer.triggerAchievement(AchievementList.buildSword); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine.java deleted file mode 100644 index daaf2c4438..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Turbine.java +++ /dev/null @@ -1,58 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public abstract class GT_Tool_Turbine extends GT_Tool { - - @Override - public abstract float getBaseDamage(); - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return false; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? getTurbineIcon() : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : null; - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + " put " - + EnumChatFormatting.RED - + aEntity.getCommandSenderName() - + "s" - + EnumChatFormatting.WHITE - + " head into a turbine"); - } - - public abstract IIconContainer getTurbineIcon(); - - @Override - public abstract float getSpeedMultiplier(); - - @Override - public abstract float getMaxDurabilityMultiplier(); - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java deleted file mode 100644 index 46b0de72d9..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java +++ /dev/null @@ -1,27 +0,0 @@ -package gregtech.common.tools; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Turbine_Huge extends GT_Tool_Turbine { - - @Override - public float getSpeedMultiplier() { - return 4.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public float getBaseDamage() { - return 7.5F; - } - - @Override - public IIconContainer getTurbineIcon() { - return Textures.ItemIcons.TURBINE_HUGE; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java deleted file mode 100644 index 7e8307f6b0..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java +++ /dev/null @@ -1,27 +0,0 @@ -package gregtech.common.tools; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Turbine_Large extends GT_Tool_Turbine { - - @Override - public float getSpeedMultiplier() { - return 3.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 3.0F; - } - - @Override - public float getBaseDamage() { - return 5.0F; - } - - @Override - public IIconContainer getTurbineIcon() { - return Textures.ItemIcons.TURBINE_LARGE; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java deleted file mode 100644 index ac2fc29a89..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java +++ /dev/null @@ -1,27 +0,0 @@ -package gregtech.common.tools; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Turbine_Normal extends GT_Tool_Turbine { - - @Override - public float getSpeedMultiplier() { - return 2.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 2.0F; - } - - @Override - public float getBaseDamage() { - return 2.5F; - } - - @Override - public IIconContainer getTurbineIcon() { - return Textures.ItemIcons.TURBINE; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java deleted file mode 100644 index fab527386e..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java +++ /dev/null @@ -1,27 +0,0 @@ -package gregtech.common.tools; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; - -public class GT_Tool_Turbine_Small extends GT_Tool_Turbine { - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public float getBaseDamage() { - return 0.0F; - } - - @Override - public IIconContainer getTurbineIcon() { - return Textures.ItemIcons.TURBINE_SMALL; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java b/src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java deleted file mode 100644 index 184d506872..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java +++ /dev/null @@ -1,160 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.AchievementList; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.GT_Mod; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_Crowbar; - -public class GT_Tool_UniversalSpade extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 400; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 100; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public float getSpeedMultiplier() { - return 0.75F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return null; - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return null; - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean isCrowbar() { - return true; - } - - @Override - public boolean isWeapon() { - return true; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "shovel", "axe", "saw", "sword", "crowbar") - || GT_ToolHarvestHelper.isAppropriateMaterial( - aBlock, - Material.sand, - Material.grass, - Material.ground, - Material.snow, - Material.clay, - Material.leaves, - Material.vine, - Material.wood, - Material.cactus, - Material.circuits, - Material.gourd, - Material.web, - Material.cloth, - Material.carpet, - Material.plants, - Material.cake, - Material.tnt, - Material.sponge); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadUniversalSpade.mTextureIndex] - : GT_MetaGenerated_Tool - .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Crowbar(2, 2000)); - } - - @Override - public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { - super.onToolCrafted(aStack, aPlayer); - aPlayer.triggerAchievement(AchievementList.buildSword); - try { - GT_Mod.achievements.issueAchievement(aPlayer, "unitool"); - } catch (Exception ignored) {} - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.RED + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has been digged by " - + EnumChatFormatting.GREEN - + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java b/src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java deleted file mode 100644 index 54b76e6d81..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java +++ /dev/null @@ -1,117 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; - -public class GT_Tool_WireCutter extends GT_Tool { - - @Override - public int getToolDamagePerBlockBreak() { - return 100; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 400; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.25F; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_INSULATION_CUTTERS.toString(); - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return SoundResource.IC2_TOOLS_INSULATION_CUTTERS.toString(); - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "cutter"); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.WIRE_CUTTER : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {} - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + " has cut the Cable for the Life Support Machine of " - + EnumChatFormatting.RED - + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE); - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench.java deleted file mode 100644 index fbca109f21..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Wrench.java +++ /dev/null @@ -1,279 +0,0 @@ -package gregtech.common.tools; - -import static gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial; - -import java.util.Arrays; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityIronGolem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; -import net.minecraftforge.event.world.BlockEvent; - -import appeng.api.parts.IPartHost; -import appeng.block.AEBaseTileBlock; -import appeng.parts.PartPlacement; -import appeng.util.Platform; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.util.GT_ToolHarvestHelper; -import gregtech.common.items.behaviors.Behaviour_Switch_Mode; -import gregtech.common.items.behaviors.Behaviour_Wrench; -import ic2.api.tile.IWrenchable; - -public class GT_Tool_Wrench extends GT_Tool { - - public static final List mEffectiveList = Arrays - .asList(EntityIronGolem.class.getName(), "EntityTowerGuardian"); - - @Override - public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - String tName = aEntity.getClass() - .getName(); - tName = tName.substring(tName.lastIndexOf('.') + 1); - return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage; - } - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 3.0F; - } - - @Override - public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { - return aOriginalHurtResistance * 2; - } - - @Override - public float getSpeedMultiplier() { - return 1.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public String getCraftingSound() { - return SoundResource.IC2_TOOLS_WRENCH.toString(); - } - - @Override - public String getEntityHitSound() { - return null; - } - - @Override - public String getMiningSound() { - return SoundResource.IC2_TOOLS_WRENCH.toString(); - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public boolean isCrowbar() { - return false; - } - - @Override - public boolean isWrench() { - return true; - } - - @Override - public boolean isMinableBlock(Block block, byte aMetaData) { - return GT_ToolHarvestHelper.isAppropriateTool(block, aMetaData, "wrench") - || GT_ToolHarvestHelper.isAppropriateMaterial(block, Material.piston) - || block instanceof AEBaseTileBlock - || GT_ToolHarvestHelper.isSpecialBlock(block, Blocks.crafting_table, Blocks.bookshelf) - || Behaviour_Wrench.isVanillaRotatable(block) - || GT_ToolHarvestHelper.isIC2Wrenchable(block); - } - - @Override - public ItemStack getBrokenItem(ItemStack aStack) { - return null; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.WRENCH : null; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? getPrimaryMaterial(aStack).mRGBa : null; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - aItem.addItemBehavior(aID, new Behaviour_Switch_Mode()); - aItem.addItemBehavior(aID, new Behaviour_Wrench(100)); - } - - @Override - public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { - return new ChatComponentText( - EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() - + EnumChatFormatting.WHITE - + " threw a Monkey Wrench into the Plans of " - + EnumChatFormatting.RED - + aEntity.getCommandSenderName() - + EnumChatFormatting.WHITE); - } - - /** - *

- * holding drop from {@link IWrenchable#getWrenchDrop(EntityPlayer)} - *

- * Since no tile available during - * {@link #convertBlockDrops(List, ItemStack, EntityPlayer, Block, int, int, int, byte, int, boolean, BlockEvent.HarvestDropsEvent)}, - * this is filled during - * {@link #onBreakBlock(EntityPlayer, int, int, int, Block, byte, TileEntity, BlockEvent.BreakEvent)} - */ - private ItemStack wrenchableDrop = null; - /** - *

- * drop rate from {@link IWrenchable#getWrenchDropRate()} - *

- * see {@link #wrenchableDrop} - */ - private float wrenchableDropRate = 0.0f; - - /** - *

- * prevent recursion from - * {@link AEBaseTileBlock#onBlockActivated(World, int, int, int, EntityPlayer, int, float, float, float)} - *

- */ - private boolean LastEventFromThis = false; - - @Override - public void onBreakBlock(@Nonnull EntityPlayer player, int x, int y, int z, @Nonnull Block block, byte metadata, - TileEntity tile, @Nonnull BlockEvent.BreakEvent event) { - if (tile instanceof IWrenchable wrenchable) { - if (!wrenchable.wrenchCanRemove(player)) { - event.setCanceled(true); - return; - } - wrenchableDrop = wrenchable.getWrenchDrop(player); - wrenchableDropRate = wrenchable.getWrenchDropRate(); - } - if (block instanceof AEBaseTileBlock aeBaseTileBlock) { - if (LastEventFromThis) { - return; - } - final boolean sneak = player.isSneaking(); - try { - LastEventFromThis = true; - player.setSneaking(true); - final MovingObjectPosition movObjPosition = Platform.rayTrace(player, true, false); - if (movObjPosition == null) { - event.setCanceled(true); - return; - } - - final int sideHit = movObjPosition.sideHit; - if (tile instanceof IPartHost) { - if (sneak && PartPlacement.place( - player.getHeldItem(), - x, - y, - z, - sideHit, - player, - player.worldObj, - PartPlacement.PlaceType.INTERACT_FIRST_PASS, - 0)) { - event.setCanceled(true); - } - return; - } - if (aeBaseTileBlock.onBlockActivated(event.world, x, y, z, player, sideHit, x, y, z)) { - event.setCanceled(true); - } - } finally { - LastEventFromThis = false; - player.setSneaking(sneak); - } - } - } - - @Override - public int convertBlockDrops(List drops, ItemStack Stack, EntityPlayer player, Block block, int x, int y, - int z, byte metaData, int fortune, boolean silkTouch, BlockEvent.HarvestDropsEvent event) { - ItemStack drop = null; - int modified = 0; - if (wrenchableDrop != null) { - drop = wrenchableDrop; - wrenchableDrop = null; - modified = wrenchableDropRate == 1.0f ? 3 : 10; - wrenchableDropRate = 0.0f; - } else if (block == Blocks.bookshelf || block == Blocks.ender_chest) { - drop = new ItemStack(block); - modified = 1; - } - - if (drop != null) { - event.dropChance = 1.0f; - drops.clear(); - drops.add(drop); - } - return modified; - } - - @Override - public byte getMaxMode() { - return 2; - } - - @Override - public String getToolTypeName() { - return "wrench"; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java deleted file mode 100644 index 7a7c725f8f..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java +++ /dev/null @@ -1,69 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_Wrench_HV extends GT_Tool_Wrench_LV { - - @Override - public int getToolDamagePerBlockBreak() { - return 800; - } - - @Override - public int getToolDamagePerDropConversion() { - return 1600; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 12800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 3200; - } - - @Override - public int getBaseQuality() { - return 1; - } - - @Override - public float getBaseDamage() { - return 2.0F; - } - - @Override - public float getSpeedMultiplier() { - return 4.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_HV; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java deleted file mode 100644 index 5f82a7d5b1..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java +++ /dev/null @@ -1,77 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_Wrench_LV extends GT_Tool_Wrench { - - @Override - public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, - EntityPlayer aPlayer) { - return aOriginalDamage; - } - - @Override - public int getToolDamagePerBlockBreak() { - return 50; - } - - @Override - public int getToolDamagePerDropConversion() { - return 100; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 800; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 200; - } - - @Override - public int getBaseQuality() { - return 0; - } - - @Override - public float getBaseDamage() { - return 1.0F; - } - - @Override - public float getSpeedMultiplier() { - return 2.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 1.0F; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_LV; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } -} diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java deleted file mode 100644 index cc5b649647..0000000000 --- a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java +++ /dev/null @@ -1,69 +0,0 @@ -package gregtech.common.tools; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; - -public class GT_Tool_Wrench_MV extends GT_Tool_Wrench_LV { - - @Override - public int getToolDamagePerBlockBreak() { - return 200; - } - - @Override - public int getToolDamagePerDropConversion() { - return 400; - } - - @Override - public int getToolDamagePerContainerCraft() { - return 3200; - } - - @Override - public int getToolDamagePerEntityAttack() { - return 800; - } - - @Override - public int getBaseQuality() { - return 1; - } - - @Override - public float getBaseDamage() { - return 1.5F; - } - - @Override - public float getSpeedMultiplier() { - return 3.0F; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 2.0F; - } - - @Override - public boolean canBlock() { - return false; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead - ? GT_MetaGenerated_Tool.getPrimaryMaterial( - aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex] - : Textures.ItemIcons.POWER_UNIT_MV; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa - : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa; - } -} diff --git a/src/main/java/gregtech/common/tools/ToolAxe.java b/src/main/java/gregtech/common/tools/ToolAxe.java new file mode 100644 index 0000000000..03b761227c --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolAxe.java @@ -0,0 +1,175 @@ +package gregtech.common.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolAxe extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public float getSpeedMultiplier() { + return 2.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "axe") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, Material.wood) + || GTToolHarvestHelper.isSpecialBlock(aBlock, Blocks.ladder); + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + int rAmount = 0; + if ((GregTechAPI.sTimber) && (!aPlayer.isSneaking()) + && (OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData)))) { + int tY = aY + 1; + for (int tH = aPlayer.worldObj.getHeight(); tY < tH; tY++) { + if ((aPlayer.worldObj.getBlock(aX, tY, aZ) != aBlock) + || (!aPlayer.worldObj.func_147480_a(aX, tY, aZ, true))) { + break; + } + rAmount++; + } + } + return rAmount; + } + + @Override + public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World aWorld, + int aX, int aY, int aZ) { + + if (aBlock.isWood(aPlayer.worldObj, aX, aY, aZ) + && OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData))) { + float rAmount = 1.0F; + float tIncrement = 1.0F; + if ((GregTechAPI.sTimber) && !aPlayer.isSneaking()) { + int tY = aY + 1; + for (int tH = aPlayer.worldObj.getHeight(); (tY < tH) + && (aPlayer.worldObj.getBlock(aX, tY, aZ) == aBlock); tY++) { + tIncrement += 0.1F; + rAmount += tIncrement; + } + } + return 2.0F * aDefault / rAmount; + } + + return (aBlock.getMaterial() == Material.leaves) || (aBlock.getMaterial() == Material.vine) + || (aBlock.getMaterial() == Material.plants) + || (aBlock.getMaterial() == Material.gourd) ? aDefault / 4.0F : aDefault; + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial(aStack).mIconSet.mTextures[OrePrefixes.toolHeadAxe.mTextureIndex] + : MetaGeneratedTool.getSecondaryMaterial(aStack).mIconSet.mTextures[OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has been chopped by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolBranchCutter.java b/src/main/java/gregtech/common/tools/ToolBranchCutter.java new file mode 100644 index 0000000000..c9ad255a45 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolBranchCutter.java @@ -0,0 +1,101 @@ +package gregtech.common.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.api.util.GTUtility; + +public class ToolBranchCutter extends GTTool { + + @Override + public float getBaseDamage() { + return 2.5F; + } + + @Override + public float getSpeedMultiplier() { + return 0.25F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 0.25F; + } + + @Override + public boolean isGrafter() { + return true; + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + if (aBlock.getMaterial() == Material.leaves) { + aEvent.dropChance = Math.min( + 1.0F, + Math.max( + aEvent.dropChance, + (aStack.getItem() + .getHarvestLevel(aStack, "") + 1) * 0.2F)); + if (aBlock == Blocks.leaves) { + aDrops.clear(); + if (((aMetaData & 0x3) == 0) && (aPlayer.worldObj.rand.nextInt(9) <= aFortune * 2)) { + aDrops.add(new ItemStack(Items.apple, 1, 0)); + } else { + aDrops.add(new ItemStack(Blocks.sapling, 1, aMetaData & 0x3)); + } + } else if (aBlock == Blocks.leaves2) { + aDrops.clear(); + aDrops.add(new ItemStack(Blocks.sapling, 1, (aMetaData & 0x3) + 4)); + } else if (aBlock == GTUtility.getBlockFromStack(GTModHandler.getIC2Item("rubberLeaves", 1L))) { + aDrops.clear(); + aDrops.add(GTModHandler.getIC2Item("rubberSapling", 1L)); + } + } + return 0; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "grafter") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, Material.leaves); + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.GRAFTER : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has been trimmed by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolButcheryKnife.java b/src/main/java/gregtech/common/tools/ToolButcheryKnife.java new file mode 100644 index 0000000000..43323b8404 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolButcheryKnife.java @@ -0,0 +1,104 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolButcheryKnife extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 200; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { + return aOriginalHurtResistance * 2; + } + + @Override + public float getSpeedMultiplier() { + return 0.1F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public boolean isMiningTool() { + return false; + } + + @Override + public Enchantment[] getEnchantments(ItemStack aStack) { + return LOOTING_ENCHANTMENT; + } + + @Override + public int[] getEnchantmentLevels(ItemStack aStack) { + return new int[] { (2 + MetaGeneratedTool.getPrimaryMaterial(aStack).mToolQuality) / 2 }; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.BUTCHERYKNIFE : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has butchered " + + EnumChatFormatting.RED + + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE); + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return false; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolBuzzSaw.java b/src/main/java/gregtech/common/tools/ToolBuzzSaw.java new file mode 100644 index 0000000000..7e62ab7bb4 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolBuzzSaw.java @@ -0,0 +1,81 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolBuzzSaw extends ToolSaw { + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 300; + } + + @Override + public float getBaseDamage() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); + } + + @Override + public String getEntityHitSound() { + return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO.toString(); + } + + @Override + public String getMiningSound() { + return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return false; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadBuzzSaw.mTextureIndex] + : Textures.ItemIcons.HANDLE_BUZZSAW; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got buzzed by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolChainsawHV.java b/src/main/java/gregtech/common/tools/ToolChainsawHV.java new file mode 100644 index 0000000000..f2dc1df3bf --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolChainsawHV.java @@ -0,0 +1,58 @@ +package gregtech.common.tools; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolChainsawHV extends ToolChainsawLV { + + @Override + public int getToolDamagePerBlockBreak() { + return 800; + } + + @Override + public int getToolDamagePerDropConversion() { + return 1600; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 12800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 3200; + } + + @Override + public int getBaseQuality() { + return 1; + } + + @Override + public float getBaseDamage() { + return 4.0F; + } + + @Override + public float getSpeedMultiplier() { + return 4.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_HV; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolChainsawLV.java b/src/main/java/gregtech/common/tools/ToolChainsawLV.java new file mode 100644 index 0000000000..ad47ae2cdc --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolChainsawLV.java @@ -0,0 +1,185 @@ +package gregtech.common.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import net.minecraftforge.common.IShearable; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolChainsawLV extends ToolSaw { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public float getSpeedMultiplier() { + return 2.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); + } + + @Override + public String getEntityHitSound() { + return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO.toString(); + } + + @Override + public String getMiningSound() { + return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString(); + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isChainsaw() { + return true; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + try { + GTMod.achievements.issueAchievement(aPlayer, "brrrr"); + GTMod.achievements.issueAchievement(aPlayer, "buildChainsaw"); + } catch (Exception ignored) {} + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + int rAmount = 0; + if ((aBlock.getMaterial() == Material.leaves) && ((aBlock instanceof IShearable))) { + aPlayer.worldObj.setBlock(aX, aY, aZ, aBlock, aMetaData, 0); + if (((IShearable) aBlock).isShearable(aStack, aPlayer.worldObj, aX, aY, aZ)) { + ((IShearable) aBlock).onSheared(aStack, aPlayer.worldObj, aX, aY, aZ, aFortune); + aDrops.clear(); + } + aPlayer.worldObj.setBlock(aX, aY, aZ, Blocks.air, 0, 0); + } else if (((aBlock.getMaterial() == Material.ice) || (aBlock.getMaterial() == Material.packedIce)) + && (aDrops.isEmpty())) { + aDrops.add(new ItemStack(aBlock, 1, aMetaData)); + aPlayer.worldObj.setBlockToAir(aX, aY, aZ); + aEvent.dropChance = 1.0F; + return 1; + } + if ((GregTechAPI.sTimber) && (!aPlayer.isSneaking()) + && (OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData)))) { + int tY = aY + 1; + for (int tH = aPlayer.worldObj.getHeight(); tY < tH; tY++) { + if ((aPlayer.worldObj.getBlock(aX, tY, aZ) != aBlock) + || (!aPlayer.worldObj.func_147480_a(aX, tY, aZ, true))) { + break; + } + rAmount++; + } + } + return rAmount; + } + + @Override + public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World aWorld, + int aX, int aY, int aZ) { + if (aBlock.isWood(aPlayer.worldObj, aX, aY, aZ) + && OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData))) { + float rAmount = 1.0F; + float tIncrement = 1.0F; + if ((GregTechAPI.sTimber) && !aPlayer.isSneaking()) { + int tY = aY + 1; + for (int tH = aPlayer.worldObj.getHeight(); (tY < tH) + && (aPlayer.worldObj.getBlock(aX, tY, aZ) == aBlock); tY++) { + tIncrement += 0.1F; + rAmount += tIncrement; + } + } + return 2.0F * aDefault / rAmount; + } + return (aBlock.getMaterial() == Material.leaves) || (aBlock.getMaterial() == Material.vine) + || (aBlock.getMaterial() == Material.plants) + || (aBlock.getMaterial() == Material.gourd) ? aDefault / 4.0F : aDefault; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_LV; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " was massacred by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolChainsawMV.java b/src/main/java/gregtech/common/tools/ToolChainsawMV.java new file mode 100644 index 0000000000..48fc79f86d --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolChainsawMV.java @@ -0,0 +1,58 @@ +package gregtech.common.tools; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolChainsawMV extends ToolChainsawLV { + + @Override + public int getToolDamagePerBlockBreak() { + return 200; + } + + @Override + public int getToolDamagePerDropConversion() { + return 400; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 3200; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 800; + } + + @Override + public int getBaseQuality() { + return 1; + } + + @Override + public float getBaseDamage() { + return 3.5F; + } + + @Override + public float getSpeedMultiplier() { + return 3.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 2.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_MV; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolCrowbar.java b/src/main/java/gregtech/common/tools/ToolCrowbar.java new file mode 100644 index 0000000000..db72d65a6d --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolCrowbar.java @@ -0,0 +1,139 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import com.google.common.base.Strings; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.IToolStats; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.MetaGeneratedTool01; +import gregtech.common.items.behaviors.BehaviourCrowbar; + +public class ToolCrowbar extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 2.0F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return true; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + if (aBlock.getMaterial() == Material.circuits) { + return true; + } + String tTool = aBlock.getHarvestTool(aMetaData); + if (Strings.isNullOrEmpty(tTool)) { + for (IToolStats i : MetaGeneratedTool01.INSTANCE.mToolStats.values()) { + if (i instanceof ToolCrowbar && i != this && !i.isMinableBlock(aBlock, aMetaData)) { + return false; + } + } + return true; + } + return tTool.equals("crowbar"); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.CROWBAR : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa : null; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourCrowbar(1, 1000)); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " was removed by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolDrillHV.java b/src/main/java/gregtech/common/tools/ToolDrillHV.java new file mode 100644 index 0000000000..fb1d2b421a --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolDrillHV.java @@ -0,0 +1,69 @@ +package gregtech.common.tools; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import gregtech.GTMod; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolDrillHV extends ToolDrillLV { + + @Override + public int getToolDamagePerBlockBreak() { + return 800; + } + + @Override + public int getToolDamagePerDropConversion() { + return 1600; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 12800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 3200; + } + + @Override + public int getBaseQuality() { + return 1; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public float getSpeedMultiplier() { + return 9.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + try { + GTMod.achievements.issueAchievement(aPlayer, "highpowerdrill"); + GTMod.achievements.issueAchievement(aPlayer, "buildDDrill"); + } catch (Exception ignored) {} + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_HV; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolDrillLV.java b/src/main/java/gregtech/common/tools/ToolDrillLV.java new file mode 100644 index 0000000000..1c6dfd7de3 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolDrillLV.java @@ -0,0 +1,152 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.AchievementList; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.GTMod; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolDrillLV extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 2.0F; + } + + @Override + public float getSpeedMultiplier() { + return 3.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); + } + + @Override + public String getEntityHitSound() { + return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); + } + + @Override + public String getBreakingSound() { + return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); + } + + @Override + public String getMiningSound() { + return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString(); + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe", "shovel") + || GTToolHarvestHelper.isAppropriateMaterial( + aBlock, + Material.rock, + Material.iron, + Material.anvil, + Material.sand, + Material.grass, + Material.ground, + Material.snow, + Material.clay, + Material.glass); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_LV; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + aPlayer.triggerAchievement(AchievementList.buildPickaxe); + aPlayer.triggerAchievement(AchievementList.buildBetterPickaxe); + try { + GTMod.achievements.issueAchievement(aPlayer, "driltime"); + GTMod.achievements.issueAchievement(aPlayer, "buildDrill"); + } catch (Exception ignored) {} + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got the Drill! (by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + ")"); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolDrillMV.java b/src/main/java/gregtech/common/tools/ToolDrillMV.java new file mode 100644 index 0000000000..b1694ee74d --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolDrillMV.java @@ -0,0 +1,58 @@ +package gregtech.common.tools; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolDrillMV extends ToolDrillLV { + + @Override + public int getToolDamagePerBlockBreak() { + return 200; + } + + @Override + public int getToolDamagePerDropConversion() { + return 400; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 3200; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 800; + } + + @Override + public int getBaseQuality() { + return 1; + } + + @Override + public float getBaseDamage() { + return 2.5F; + } + + @Override + public float getSpeedMultiplier() { + return 6.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 2.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_MV; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolFile.java b/src/main/java/gregtech/common/tools/ToolFile.java new file mode 100644 index 0000000000..8e64dafdd2 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolFile.java @@ -0,0 +1,124 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolFile extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 400; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.5F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMiningTool() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "file"); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadFile.mTextureIndex] + : Textures.ItemIcons.HANDLE_FILE; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has been filed D for 'Dead' by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolHardHammer.java b/src/main/java/gregtech/common/tools/ToolHardHammer.java new file mode 100644 index 0000000000..d26fe2b43d --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolHardHammer.java @@ -0,0 +1,203 @@ +package gregtech.common.tools; + +import static gregtech.GTMod.MAX_IC2; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityIronGolem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.GTMod; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.api.util.GTUtility; +import gregtech.common.items.behaviors.BehaviourProspecting; + +public class ToolHardHammer extends GTTool { + + public static final List mEffectiveList = Arrays + .asList(EntityIronGolem.class.getName(), "EntityTowerGuardian"); + + @Override + public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + String tName = aEntity.getClass() + .getName(); + tName = tName.substring(tName.lastIndexOf('.') + 1); + return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage; + } + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 200; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 400; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { + return aOriginalHurtResistance * 2; + } + + @Override + public float getSpeedMultiplier() { + return 0.75F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.RANDOM_ANVIL_USE.toString(); + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getBreakingSound() { + return SoundResource.RANDOM_ANVIL_BREAK.toString(); + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "hammer", "pickaxe") + || GTToolHarvestHelper + .isAppropriateMaterial(aBlock, Material.rock, Material.glass, Material.ice, Material.packedIce) + || RecipeMaps.hammerRecipes.containsInput(new ItemStack(aBlock, 1, aMetaData)); + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + int rConversions = 0; + GTRecipe tRecipe = RecipeMaps.hammerRecipes + .findRecipe(null, true, MAX_IC2, null, new ItemStack(aBlock, 1, aMetaData)); + if ((tRecipe == null) || (aBlock.hasTileEntity(aMetaData))) { + for (ItemStack tDrop : aDrops) { + tRecipe = RecipeMaps.hammerRecipes + .findRecipe(null, true, MAX_IC2, null, GTUtility.copyAmount(1, tDrop)); + if (tRecipe != null) { + ItemStack tHammeringOutput = tRecipe.getOutput(0); + if (tHammeringOutput != null) { + rConversions += tDrop.stackSize; + tDrop.stackSize *= tHammeringOutput.stackSize; + tHammeringOutput.stackSize = tDrop.stackSize; + GTUtility.setStack(tDrop, tHammeringOutput); + } + } + } + } else { + aDrops.clear(); + aDrops.add(tRecipe.getOutput(0)); + rConversions++; + } + return rConversions; + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadHammer.mTextureIndex] + : MetaGeneratedTool + .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourProspecting(1, 1000)); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " was squashed by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + try { + GTMod.achievements.issueAchievement(aPlayer, "tools"); + } catch (Exception ignored) {} + } +} diff --git a/src/main/java/gregtech/common/tools/ToolHoe.java b/src/main/java/gregtech/common/tools/ToolHoe.java new file mode 100644 index 0000000000..8c68d41b44 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolHoe.java @@ -0,0 +1,132 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.AchievementList; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourHoe; + +public class ToolHoe extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.75F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "hoe") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, Material.gourd); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool + .getPrimaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadHoe.mTextureIndex] + : MetaGeneratedTool + .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourHoe(100)); + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + aPlayer.triggerAchievement(AchievementList.buildHoe); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has been called a stupid Hoe by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolJackHammer.java b/src/main/java/gregtech/common/tools/ToolJackHammer.java new file mode 100644 index 0000000000..6c46a4c9be --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolJackHammer.java @@ -0,0 +1,128 @@ +package gregtech.common.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.GTMod; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.api.util.GTUtility; + +public class ToolJackHammer extends ToolDrillLV { + + @Override + public int getToolDamagePerBlockBreak() { + return 400; + } + + @Override + public int getToolDamagePerDropConversion() { + return 400; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 3200; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 800; + } + + @Override + public int getBaseQuality() { + return 1; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public float getSpeedMultiplier() { + return 12.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 2.0F; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe") // + || GTToolHarvestHelper.isAppropriateMaterial( + aBlock, // + Material.rock, // + Material.glass, // + Material.ice, // + Material.packedIce // + ); + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + int rConversions = 0; + GTRecipe tRecipe = RecipeMaps.hammerRecipes + .findRecipe(null, true, 2147483647L, null, new ItemStack(aBlock, 1, aMetaData)); + if ((tRecipe == null) || (aBlock.hasTileEntity(aMetaData))) { + for (ItemStack tDrop : aDrops) { + tRecipe = RecipeMaps.hammerRecipes + .findRecipe(null, true, 2147483647L, null, GTUtility.copyAmount(1, tDrop)); + if (tRecipe != null) { + ItemStack tHammeringOutput = tRecipe.getOutput(0); + if (tHammeringOutput != null) { + rConversions += tDrop.stackSize; + tDrop.stackSize *= tHammeringOutput.stackSize; + tHammeringOutput.stackSize = tDrop.stackSize; + GTUtility.setStack(tDrop, tHammeringOutput); + } + } + } + } else { + aDrops.clear(); + aDrops.add(tRecipe.getOutput(0)); + rConversions++; + } + return rConversions; + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + try { + GTMod.achievements.issueAchievement(aPlayer, "hammertime"); + } catch (Exception ignored) {} + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.JACKHAMMER : null; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has been jackhammered into pieces by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolKnife.java b/src/main/java/gregtech/common/tools/ToolKnife.java new file mode 100644 index 0000000000..908a9daaad --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolKnife.java @@ -0,0 +1,76 @@ +package gregtech.common.tools; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; + +public class ToolKnife extends ToolSword { + + @Override + public int getToolDamagePerBlockBreak() { + return 100; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 600; + } + + @Override + public float getBaseDamage() { + return 0F; + } + + @Override + public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { + return aOriginalHurtResistance * 3; + } + + @Override + public float getSpeedMultiplier() { + return 0.5F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.KNIFE : null; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + "<" + EnumChatFormatting.RED + + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + "> " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + " what are you doing?, " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + "?!? STAHP!!!"); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolMortar.java b/src/main/java/gregtech/common/tools/ToolMortar.java new file mode 100644 index 0000000000..e67e5924de --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolMortar.java @@ -0,0 +1,120 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolMortar extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 400; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 2.0F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMiningTool() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return false; + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.MORTAR : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa : Dyes._NULL.mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " was grounded by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolPickaxe.java b/src/main/java/gregtech/common/tools/ToolPickaxe.java new file mode 100644 index 0000000000..91be7dae29 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolPickaxe.java @@ -0,0 +1,139 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.AchievementList; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.GTMod; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolPickaxe extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.5F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe") // + || GTToolHarvestHelper.isAppropriateMaterial( + aBlock, // + Material.rock, + Material.iron, + Material.anvil, + Material.glass); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadPickaxe.mTextureIndex] + : MetaGeneratedTool + .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + aPlayer.triggerAchievement(AchievementList.buildPickaxe); + aPlayer.triggerAchievement(AchievementList.buildBetterPickaxe); + try { + GTMod.achievements.issueAchievement(aPlayer, "flintpick"); + } catch (Exception ignored) {} + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got mined by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolPlow.java b/src/main/java/gregtech/common/tools/ToolPlow.java new file mode 100644 index 0000000000..e0f25fa2f1 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolPlow.java @@ -0,0 +1,110 @@ +package gregtech.common.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntitySnowman; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolPlow extends GTTool { + + private final ThreadLocal sIsHarvestingRightNow = new ThreadLocal<>(); + + @Override + public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + return (aEntity instanceof EntitySnowman) ? aOriginalDamage * 4.0F : aOriginalDamage; + } + + @Override + public float getBaseDamage() { + return 1.0F; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "plow") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, Material.snow, Material.craftedSnow); + } + + @Override + public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj, + int aX, int aY, int aZ) { + // Speed nerf for using AOE tools to break single block + if (aPlayer != null && aPlayer.isSneaking()) { + return aDefault / 2; + } + return super.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, worldObj, aX, aY, aZ); + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + int rConversions = 0; + if ((this.sIsHarvestingRightNow.get() == null) && ((aPlayer instanceof EntityPlayerMP))) { + this.sIsHarvestingRightNow.set(this); + + if (!aPlayer.isSneaking()) { + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + for (int k = -1; k < 2; k++) { + if (((i != 0) || (j != 0) || (k != 0)) && (aStack.getItem() + .getDigSpeed( + aStack, + aPlayer.worldObj.getBlock(aX + i, aY + j, aZ + k), + aPlayer.worldObj.getBlockMetadata(aX + i, aY + j, aZ + k)) + > 0.0F) + && (((EntityPlayerMP) aPlayer).theItemInWorldManager + .tryHarvestBlock(aX + i, aY + j, aZ + k))) { + rConversions++; + } + } + } + } + } + + this.sIsHarvestingRightNow.set(null); + } + return rConversions; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadPlow.mTextureIndex] + : MetaGeneratedTool + .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + " plew through the yard of " + + EnumChatFormatting.RED + + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolPlunger.java b/src/main/java/gregtech/common/tools/ToolPlunger.java new file mode 100644 index 0000000000..f4dc8bd77d --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolPlunger.java @@ -0,0 +1,92 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.api.util.GTUtility; +import gregtech.common.items.behaviors.BehaviourPlungerFluid; +import gregtech.common.items.behaviors.BehaviourPlungerItem; + +public class ToolPlunger extends GTTool { + + @Override + public float getBaseDamage() { + return 1.25F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 0.25F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); + } + + @Override + public String getEntityHitSound() { + return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); + } + + @Override + public String getMiningSound() { + return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "plunger"); + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.PLUNGER : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + @SuppressWarnings("unchecked") // the IItemBehaviour cast cannot be expressed strictly via generics + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourPlungerItem(getToolDamagePerDropConversion())); + aItem.addItemBehavior(aID, new BehaviourPlungerFluid(getToolDamagePerDropConversion())); + try { + Object tObject = GTUtility.callConstructor( + "gregtech.common.items.behaviors.Behaviour_Plunger_Essentia", + 0, + null, + false, + getToolDamagePerDropConversion()); + if ((tObject instanceof IItemBehaviour)) { + aItem.addItemBehavior(aID, (IItemBehaviour) tObject); + } + } catch (Throwable ignored) {} + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got stuck trying to escape through a Pipe while fighting " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolRollingPin.java b/src/main/java/gregtech/common/tools/ToolRollingPin.java new file mode 100644 index 0000000000..1af17f3072 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolRollingPin.java @@ -0,0 +1,70 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolRollingPin extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public float getBaseDamage() { + return 2.0F; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return false; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa : Dyes._NULL.mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.ROLLING_PIN : null; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got flattened by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolSaw.java b/src/main/java/gregtech/common/tools/ToolSaw.java new file mode 100644 index 0000000000..ca1ec81b13 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolSaw.java @@ -0,0 +1,149 @@ +package gregtech.common.tools; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.common.IShearable; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolSaw extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 200; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.75F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + if ((aBlock.getMaterial() == Material.leaves) && ((aBlock instanceof IShearable))) { + aPlayer.worldObj.setBlock(aX, aY, aZ, aBlock, aMetaData, 0); + if (((IShearable) aBlock).isShearable(aStack, aPlayer.worldObj, aX, aY, aZ)) { + ArrayList tDrops = ((IShearable) aBlock) + .onSheared(aStack, aPlayer.worldObj, aX, aY, aZ, aFortune); + aDrops.clear(); + aDrops.addAll(tDrops); + aEvent.dropChance = 1.0F; + } + aPlayer.worldObj.setBlock(aX, aY, aZ, Blocks.air, 0, 0); + } else if (((aBlock.getMaterial() == Material.ice) || (aBlock.getMaterial() == Material.packedIce)) + && (aDrops.isEmpty())) { + aDrops.add(new ItemStack(aBlock, 1, aMetaData)); + aPlayer.worldObj.setBlockToAir(aX, aY, aZ); + aEvent.dropChance = 1.0F; + return 1; + } + return 0; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "axe", "saw") + || GTToolHarvestHelper.isAppropriateMaterial( + aBlock, + Material.leaves, + Material.vine, + Material.wood, + Material.cactus, + Material.ice, + Material.packedIce) + || GTToolHarvestHelper.isSpecialBlock(aBlock, Blocks.ladder); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool + .getPrimaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSaw.mTextureIndex] + : Textures.ItemIcons.HANDLE_SAW; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " was getting cut down by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolScoop.java b/src/main/java/gregtech/common/tools/ToolScoop.java new file mode 100644 index 0000000000..6f740da95e --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolScoop.java @@ -0,0 +1,130 @@ +package gregtech.common.tools; + +import static gregtech.api.enums.Mods.Forestry; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourNone; +import gregtech.common.items.behaviors.BehaviourScoop; + +public class ToolScoop extends GTTool { + + public static Material sBeeHiveMaterial; + + @Override + public int getToolDamagePerBlockBreak() { + return 200; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 200; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.0F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "scoop") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, sBeeHiveMaterial); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.SCOOP : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + if (Forestry.isModLoaded()) { + aItem.addItemBehavior(aID, new BehaviourScoop(200)); + } else { + aItem.addItemBehavior(aID, new BehaviourNone()); + } + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got scooped up by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolScrewdriver.java b/src/main/java/gregtech/common/tools/ToolScrewdriver.java new file mode 100644 index 0000000000..b73f1371aa --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolScrewdriver.java @@ -0,0 +1,160 @@ +package gregtech.common.tools; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityCaveSpider; +import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourScrewdriver; + +public class ToolScrewdriver extends GTTool { + + public static final List mEffectiveList = Arrays.asList( + EntityCaveSpider.class.getName(), + EntitySpider.class.getName(), + "EntityTFHedgeSpider", + "EntityTFKingSpider", + "EntityTFSwarmSpider", + "EntityTFTowerBroodling"); + + @Override + public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + String tName = aEntity.getClass() + .getName(); + tName = tName.substring(tName.lastIndexOf('.') + 1); + return mEffectiveList.contains(tName) ? aOriginalDamage * 2.0F : aOriginalDamage; + } + + @Override + public int getToolDamagePerBlockBreak() { + return 200; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 400; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.5F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_WRENCH.toString(); + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMiningTool() { + return false; + } + + @Override + public boolean isScrewdriver() { + return true; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "screwdriver") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, Material.circuits); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadScrewdriver.mTextureIndex] + : Textures.ItemIcons.HANDLE_SCREWDRIVER; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourScrewdriver(1, 200)); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " is screwed! (by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + ")"); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolScrewdriverLV.java b/src/main/java/gregtech/common/tools/ToolScrewdriverLV.java new file mode 100644 index 0000000000..31a4ffaad2 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolScrewdriverLV.java @@ -0,0 +1,34 @@ +package gregtech.common.tools; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolScrewdriverLV extends ToolScrewdriver { + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 200; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadScrewdriver.mTextureIndex] + : Textures.ItemIcons.HANDLE_ELECTRIC_SCREWDRIVER; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolSense.java b/src/main/java/gregtech/common/tools/ToolSense.java new file mode 100644 index 0000000000..55a3882db5 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolSense.java @@ -0,0 +1,114 @@ +package gregtech.common.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import net.minecraftforge.event.world.BlockEvent; + +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourSense; + +public class ToolSense extends GTTool { + + private final ThreadLocal sIsHarvestingRightNow = new ThreadLocal<>(); + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "sense", "scythe") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, Material.plants, Material.leaves); + } + + @Override + public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj, + int aX, int aY, int aZ) { + // Speed nerf for using AOE tools to break single block + if (aPlayer != null && aPlayer.isSneaking()) { + return aDefault / 2; + } + return super.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, worldObj, aX, aY, aZ); + } + + @Override + public int convertBlockDrops(List aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, + int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) { + int rConversions = 0; + if ((this.sIsHarvestingRightNow.get() == null) && ((aPlayer instanceof EntityPlayerMP))) { + this.sIsHarvestingRightNow.set(this); + + if (!aPlayer.isSneaking()) { + for (int i = -2; i < 3; i++) { + for (int j = -2; j < 3; j++) { + for (int k = -2; k < 3; k++) { + if (((i != 0) || (j != 0) || (k != 0)) && (aStack.getItem() + .getDigSpeed( + aStack, + aPlayer.worldObj.getBlock(aX + i, aY + j, aZ + k), + aPlayer.worldObj.getBlockMetadata(aX + i, aY + j, aZ + k)) + > 0.0F) + && (((EntityPlayerMP) aPlayer).theItemInWorldManager + .tryHarvestBlock(aX + i, aY + j, aZ + k))) { + rConversions++; + } + } + } + } + } + + this.sIsHarvestingRightNow.set(null); + } + return rConversions; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSense.mTextureIndex] + : MetaGeneratedTool + .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourSense(getToolDamagePerBlockBreak())); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has taken the Soul of " + + EnumChatFormatting.RED + + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE); + } + +} diff --git a/src/main/java/gregtech/common/tools/ToolShovel.java b/src/main/java/gregtech/common/tools/ToolShovel.java new file mode 100644 index 0000000000..d4676efeed --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolShovel.java @@ -0,0 +1,127 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolShovel extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.5F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "shovel") + || GTToolHarvestHelper.isAppropriateMaterial( + aBlock, + Material.sand, + Material.grass, + Material.ground, + Material.snow, + Material.clay); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadShovel.mTextureIndex] + : MetaGeneratedTool + .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got dug up by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolSoftHammer.java b/src/main/java/gregtech/common/tools/ToolSoftHammer.java new file mode 100644 index 0000000000..0cd3aa2eac --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolSoftHammer.java @@ -0,0 +1,139 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourSoftHammer; + +public class ToolSoftHammer extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { + return aOriginalHurtResistance * 2; + } + + @Override + public float getSpeedMultiplier() { + return 0.1F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 8.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); + } + + @Override + public String getEntityHitSound() { + return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); + } + + @Override + public String getMiningSound() { + return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString(); + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMiningTool() { + return false; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "softhammer"); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadMallet.mTextureIndex] + : MetaGeneratedTool.getSecondaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.handleMallet.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourSoftHammer(100)); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " was hammered to death by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolSolderingIron.java b/src/main/java/gregtech/common/tools/ToolSolderingIron.java new file mode 100644 index 0000000000..9ae4fade4c --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolSolderingIron.java @@ -0,0 +1,153 @@ +package gregtech.common.tools; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityCaveSpider; +import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourScrewdriver; + +public class ToolSolderingIron extends GTTool { + + public static final List mEffectiveList = Arrays.asList( + EntityCaveSpider.class.getName(), + EntitySpider.class.getName(), + "EntityTFHedgeSpider", + "EntityTFKingSpider", + "EntityTFSwarmSpider", + "EntityTFTowerBroodling"); + + @Override + public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + String tName = aEntity.getClass() + .getName(); + tName = tName.substring(tName.lastIndexOf('.') + 1); + return mEffectiveList.contains(tName) ? aOriginalDamage * 2.0F : aOriginalDamage; + } + + @Override + public int getToolDamagePerBlockBreak() { + return 1000; + } + + @Override + public int getToolDamagePerDropConversion() { + return 500; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 1000; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 500; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.5F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_WRENCH.toString(); + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMiningTool() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "soldering_iron") + || GTToolHarvestHelper.isAppropriateMaterial(aBlock, Material.circuits); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mIconSet.mTextures[49] + : Textures.ItemIcons.HANDLE_SOLDERING; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourScrewdriver(1, 200)); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " got soldert! (by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + ")"); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolSword.java b/src/main/java/gregtech/common/tools/ToolSword.java new file mode 100644 index 0000000000..03c76f92c6 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolSword.java @@ -0,0 +1,128 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.AchievementList; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolSword extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 200; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 100; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 100; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 4.0F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "sword") + || GTToolHarvestHelper.isAppropriateMaterial( + aBlock, + Material.leaves, + Material.gourd, + Material.vine, + Material.web, + Material.cloth, + Material.carpet, + Material.plants, + Material.cactus, + Material.cake, + Material.tnt, + Material.sponge); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSword.mTextureIndex] + : Textures.ItemIcons.HANDLE_SWORD; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return !aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + aPlayer.triggerAchievement(AchievementList.buildSword); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolTurbine.java b/src/main/java/gregtech/common/tools/ToolTurbine.java new file mode 100644 index 0000000000..ace22b06ba --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolTurbine.java @@ -0,0 +1,58 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public abstract class ToolTurbine extends GTTool { + + @Override + public abstract float getBaseDamage(); + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return false; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? getTurbineIcon() : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa : null; + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + " put " + + EnumChatFormatting.RED + + aEntity.getCommandSenderName() + + "s" + + EnumChatFormatting.WHITE + + " head into a turbine"); + } + + public abstract IIconContainer getTurbineIcon(); + + @Override + public abstract float getSpeedMultiplier(); + + @Override + public abstract float getMaxDurabilityMultiplier(); + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolTurbineHuge.java b/src/main/java/gregtech/common/tools/ToolTurbineHuge.java new file mode 100644 index 0000000000..94b85f0d5c --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolTurbineHuge.java @@ -0,0 +1,27 @@ +package gregtech.common.tools; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; + +public class ToolTurbineHuge extends ToolTurbine { + + @Override + public float getSpeedMultiplier() { + return 4.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public float getBaseDamage() { + return 7.5F; + } + + @Override + public IIconContainer getTurbineIcon() { + return Textures.ItemIcons.TURBINE_HUGE; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolTurbineLarge.java b/src/main/java/gregtech/common/tools/ToolTurbineLarge.java new file mode 100644 index 0000000000..59b6a3afe1 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolTurbineLarge.java @@ -0,0 +1,27 @@ +package gregtech.common.tools; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; + +public class ToolTurbineLarge extends ToolTurbine { + + @Override + public float getSpeedMultiplier() { + return 3.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 3.0F; + } + + @Override + public float getBaseDamage() { + return 5.0F; + } + + @Override + public IIconContainer getTurbineIcon() { + return Textures.ItemIcons.TURBINE_LARGE; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolTurbineNormal.java b/src/main/java/gregtech/common/tools/ToolTurbineNormal.java new file mode 100644 index 0000000000..33328db96e --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolTurbineNormal.java @@ -0,0 +1,27 @@ +package gregtech.common.tools; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; + +public class ToolTurbineNormal extends ToolTurbine { + + @Override + public float getSpeedMultiplier() { + return 2.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 2.0F; + } + + @Override + public float getBaseDamage() { + return 2.5F; + } + + @Override + public IIconContainer getTurbineIcon() { + return Textures.ItemIcons.TURBINE; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolTurbineSmall.java b/src/main/java/gregtech/common/tools/ToolTurbineSmall.java new file mode 100644 index 0000000000..8313ed1818 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolTurbineSmall.java @@ -0,0 +1,27 @@ +package gregtech.common.tools; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; + +public class ToolTurbineSmall extends ToolTurbine { + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public float getBaseDamage() { + return 0.0F; + } + + @Override + public IIconContainer getTurbineIcon() { + return Textures.ItemIcons.TURBINE_SMALL; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolUniversalSpade.java b/src/main/java/gregtech/common/tools/ToolUniversalSpade.java new file mode 100644 index 0000000000..9333e1f19c --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolUniversalSpade.java @@ -0,0 +1,160 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.AchievementList; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.GTMod; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourCrowbar; + +public class ToolUniversalSpade extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 400; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 100; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public float getSpeedMultiplier() { + return 0.75F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return null; + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return null; + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean isCrowbar() { + return true; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "shovel", "axe", "saw", "sword", "crowbar") + || GTToolHarvestHelper.isAppropriateMaterial( + aBlock, + Material.sand, + Material.grass, + Material.ground, + Material.snow, + Material.clay, + Material.leaves, + Material.vine, + Material.wood, + Material.cactus, + Material.circuits, + Material.gourd, + Material.web, + Material.cloth, + Material.carpet, + Material.plants, + Material.cake, + Material.tnt, + Material.sponge); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadUniversalSpade.mTextureIndex] + : MetaGeneratedTool + .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex]; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourCrowbar(2, 2000)); + } + + @Override + public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) { + super.onToolCrafted(aStack, aPlayer); + aPlayer.triggerAchievement(AchievementList.buildSword); + try { + GTMod.achievements.issueAchievement(aPlayer, "unitool"); + } catch (Exception ignored) {} + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.RED + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has been digged by " + + EnumChatFormatting.GREEN + + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolWireCutter.java b/src/main/java/gregtech/common/tools/ToolWireCutter.java new file mode 100644 index 0000000000..6009504d80 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolWireCutter.java @@ -0,0 +1,117 @@ +package gregtech.common.tools; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; + +public class ToolWireCutter extends GTTool { + + @Override + public int getToolDamagePerBlockBreak() { + return 100; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 400; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.25F; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_INSULATION_CUTTERS.toString(); + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return SoundResource.IC2_TOOLS_INSULATION_CUTTERS.toString(); + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "cutter"); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.WIRE_CUTTER : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {} + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + " has cut the Cable for the Life Support Machine of " + + EnumChatFormatting.RED + + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE); + } +} diff --git a/src/main/java/gregtech/common/tools/ToolWrench.java b/src/main/java/gregtech/common/tools/ToolWrench.java new file mode 100644 index 0000000000..3d2adf4896 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolWrench.java @@ -0,0 +1,279 @@ +package gregtech.common.tools; + +import static gregtech.api.items.MetaGeneratedTool.getPrimaryMaterial; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityIronGolem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.event.world.BlockEvent; + +import appeng.api.parts.IPartHost; +import appeng.block.AEBaseTileBlock; +import appeng.parts.PartPlacement; +import appeng.util.Platform; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTToolHarvestHelper; +import gregtech.common.items.behaviors.BehaviourSwitchMode; +import gregtech.common.items.behaviors.BehaviourWrench; +import ic2.api.tile.IWrenchable; + +public class ToolWrench extends GTTool { + + public static final List mEffectiveList = Arrays + .asList(EntityIronGolem.class.getName(), "EntityTowerGuardian"); + + @Override + public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + String tName = aEntity.getClass() + .getName(); + tName = tName.substring(tName.lastIndexOf('.') + 1); + return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage; + } + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 3.0F; + } + + @Override + public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) { + return aOriginalHurtResistance * 2; + } + + @Override + public float getSpeedMultiplier() { + return 1.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public String getCraftingSound() { + return SoundResource.IC2_TOOLS_WRENCH.toString(); + } + + @Override + public String getEntityHitSound() { + return null; + } + + @Override + public String getMiningSound() { + return SoundResource.IC2_TOOLS_WRENCH.toString(); + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public boolean isCrowbar() { + return false; + } + + @Override + public boolean isWrench() { + return true; + } + + @Override + public boolean isMinableBlock(Block block, byte aMetaData) { + return GTToolHarvestHelper.isAppropriateTool(block, aMetaData, "wrench") + || GTToolHarvestHelper.isAppropriateMaterial(block, Material.piston) + || block instanceof AEBaseTileBlock + || GTToolHarvestHelper.isSpecialBlock(block, Blocks.crafting_table, Blocks.bookshelf) + || BehaviourWrench.isVanillaRotatable(block) + || GTToolHarvestHelper.isIC2Wrenchable(block); + } + + @Override + public ItemStack getBrokenItem(ItemStack aStack) { + return null; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.WRENCH : null; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? getPrimaryMaterial(aStack).mRGBa : null; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + aItem.addItemBehavior(aID, new BehaviourSwitchMode()); + aItem.addItemBehavior(aID, new BehaviourWrench(100)); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) { + return new ChatComponentText( + EnumChatFormatting.GREEN + aPlayer.getCommandSenderName() + + EnumChatFormatting.WHITE + + " threw a Monkey Wrench into the Plans of " + + EnumChatFormatting.RED + + aEntity.getCommandSenderName() + + EnumChatFormatting.WHITE); + } + + /** + *

+ * holding drop from {@link IWrenchable#getWrenchDrop(EntityPlayer)} + *

+ * Since no tile available during + * {@link #convertBlockDrops(List, ItemStack, EntityPlayer, Block, int, int, int, byte, int, boolean, BlockEvent.HarvestDropsEvent)}, + * this is filled during + * {@link #onBreakBlock(EntityPlayer, int, int, int, Block, byte, TileEntity, BlockEvent.BreakEvent)} + */ + private ItemStack wrenchableDrop = null; + /** + *

+ * drop rate from {@link IWrenchable#getWrenchDropRate()} + *

+ * see {@link #wrenchableDrop} + */ + private float wrenchableDropRate = 0.0f; + + /** + *

+ * prevent recursion from + * {@link AEBaseTileBlock#onBlockActivated(World, int, int, int, EntityPlayer, int, float, float, float)} + *

+ */ + private boolean LastEventFromThis = false; + + @Override + public void onBreakBlock(@Nonnull EntityPlayer player, int x, int y, int z, @Nonnull Block block, byte metadata, + TileEntity tile, @Nonnull BlockEvent.BreakEvent event) { + if (tile instanceof IWrenchable wrenchable) { + if (!wrenchable.wrenchCanRemove(player)) { + event.setCanceled(true); + return; + } + wrenchableDrop = wrenchable.getWrenchDrop(player); + wrenchableDropRate = wrenchable.getWrenchDropRate(); + } + if (block instanceof AEBaseTileBlock aeBaseTileBlock) { + if (LastEventFromThis) { + return; + } + final boolean sneak = player.isSneaking(); + try { + LastEventFromThis = true; + player.setSneaking(true); + final MovingObjectPosition movObjPosition = Platform.rayTrace(player, true, false); + if (movObjPosition == null) { + event.setCanceled(true); + return; + } + + final int sideHit = movObjPosition.sideHit; + if (tile instanceof IPartHost) { + if (sneak && PartPlacement.place( + player.getHeldItem(), + x, + y, + z, + sideHit, + player, + player.worldObj, + PartPlacement.PlaceType.INTERACT_FIRST_PASS, + 0)) { + event.setCanceled(true); + } + return; + } + if (aeBaseTileBlock.onBlockActivated(event.world, x, y, z, player, sideHit, x, y, z)) { + event.setCanceled(true); + } + } finally { + LastEventFromThis = false; + player.setSneaking(sneak); + } + } + } + + @Override + public int convertBlockDrops(List drops, ItemStack Stack, EntityPlayer player, Block block, int x, int y, + int z, byte metaData, int fortune, boolean silkTouch, BlockEvent.HarvestDropsEvent event) { + ItemStack drop = null; + int modified = 0; + if (wrenchableDrop != null) { + drop = wrenchableDrop; + wrenchableDrop = null; + modified = wrenchableDropRate == 1.0f ? 3 : 10; + wrenchableDropRate = 0.0f; + } else if (block == Blocks.bookshelf || block == Blocks.ender_chest) { + drop = new ItemStack(block); + modified = 1; + } + + if (drop != null) { + event.dropChance = 1.0f; + drops.clear(); + drops.add(drop); + } + return modified; + } + + @Override + public byte getMaxMode() { + return 2; + } + + @Override + public String getToolTypeName() { + return "wrench"; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolWrenchHV.java b/src/main/java/gregtech/common/tools/ToolWrenchHV.java new file mode 100644 index 0000000000..f8e9e11244 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolWrenchHV.java @@ -0,0 +1,69 @@ +package gregtech.common.tools; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolWrenchHV extends ToolWrenchLV { + + @Override + public int getToolDamagePerBlockBreak() { + return 800; + } + + @Override + public int getToolDamagePerDropConversion() { + return 1600; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 12800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 3200; + } + + @Override + public int getBaseQuality() { + return 1; + } + + @Override + public float getBaseDamage() { + return 2.0F; + } + + @Override + public float getSpeedMultiplier() { + return 4.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_HV; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolWrenchLV.java b/src/main/java/gregtech/common/tools/ToolWrenchLV.java new file mode 100644 index 0000000000..69e9b9f230 --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolWrenchLV.java @@ -0,0 +1,77 @@ +package gregtech.common.tools; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolWrenchLV extends ToolWrench { + + @Override + public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, + EntityPlayer aPlayer) { + return aOriginalDamage; + } + + @Override + public int getToolDamagePerBlockBreak() { + return 50; + } + + @Override + public int getToolDamagePerDropConversion() { + return 100; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 800; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 200; + } + + @Override + public int getBaseQuality() { + return 0; + } + + @Override + public float getBaseDamage() { + return 1.0F; + } + + @Override + public float getSpeedMultiplier() { + return 2.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 1.0F; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_LV; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } +} diff --git a/src/main/java/gregtech/common/tools/ToolWrenchMV.java b/src/main/java/gregtech/common/tools/ToolWrenchMV.java new file mode 100644 index 0000000000..e1f1cf223d --- /dev/null +++ b/src/main/java/gregtech/common/tools/ToolWrenchMV.java @@ -0,0 +1,69 @@ +package gregtech.common.tools; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; + +public class ToolWrenchMV extends ToolWrenchLV { + + @Override + public int getToolDamagePerBlockBreak() { + return 200; + } + + @Override + public int getToolDamagePerDropConversion() { + return 400; + } + + @Override + public int getToolDamagePerContainerCraft() { + return 3200; + } + + @Override + public int getToolDamagePerEntityAttack() { + return 800; + } + + @Override + public int getBaseQuality() { + return 1; + } + + @Override + public float getBaseDamage() { + return 1.5F; + } + + @Override + public float getSpeedMultiplier() { + return 3.0F; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 2.0F; + } + + @Override + public boolean canBlock() { + return false; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead + ? MetaGeneratedTool.getPrimaryMaterial( + aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex] + : Textures.ItemIcons.POWER_UNIT_MV; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa + : MetaGeneratedTool.getSecondaryMaterial(aStack).mRGBa; + } +} diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java deleted file mode 100644 index b831306df9..0000000000 --- a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.tools.pocket; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.behaviors.Behaviour_Switch_Metadata; -import gregtech.common.tools.GT_Tool_BranchCutter; - -public class GT_Tool_Pocket_BranchCutter extends GT_Tool_BranchCutter { - - public final int mSwitchIndex; - - public GT_Tool_Pocket_BranchCutter(int aSwitchIndex) { - mSwitchIndex = aSwitchIndex; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_BRANCHCUTTER : Textures.ItemIcons.VOID; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - super.onStatsAddedToTool(aItem, aID); - aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true)); - } -} diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java deleted file mode 100644 index 84372b1d98..0000000000 --- a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.tools.pocket; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.behaviors.Behaviour_Switch_Metadata; -import gregtech.common.tools.GT_Tool_File; - -public class GT_Tool_Pocket_File extends GT_Tool_File { - - public final int mSwitchIndex; - - public GT_Tool_Pocket_File(int aSwitchIndex) { - mSwitchIndex = aSwitchIndex; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_FILE : Textures.ItemIcons.VOID; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - super.onStatsAddedToTool(aItem, aID); - aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true)); - } -} diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java deleted file mode 100644 index 2b43984c51..0000000000 --- a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.tools.pocket; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.behaviors.Behaviour_Switch_Metadata; -import gregtech.common.tools.GT_Tool_Knife; - -public class GT_Tool_Pocket_Knife extends GT_Tool_Knife { - - public final int mSwitchIndex; - - public GT_Tool_Pocket_Knife(int aSwitchIndex) { - mSwitchIndex = aSwitchIndex; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_KNIFE : Textures.ItemIcons.VOID; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - super.onStatsAddedToTool(aItem, aID); - aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true)); - } -} diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java deleted file mode 100644 index 16ab9229c6..0000000000 --- a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java +++ /dev/null @@ -1,50 +0,0 @@ -package gregtech.common.tools.pocket; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.behaviors.Behaviour_Switch_Metadata; -import gregtech.common.tools.GT_Tool; - -public class GT_Tool_Pocket_Multitool extends GT_Tool { - - public final int mSwitchIndex; - - public GT_Tool_Pocket_Multitool(int aSwitchIndex) { - mSwitchIndex = aSwitchIndex; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_CLOSED : Textures.ItemIcons.VOID; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - super.onStatsAddedToTool(aItem, aID); - aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true)); - } - - @Override - public float getBaseDamage() { - return 0; - } - - @Override - public boolean isMinableBlock(Block aBlock, byte aMetaData) { - return false; - } -} diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java deleted file mode 100644 index 579f809f2a..0000000000 --- a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.tools.pocket; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.behaviors.Behaviour_Switch_Metadata; -import gregtech.common.tools.GT_Tool_Saw; - -public class GT_Tool_Pocket_Saw extends GT_Tool_Saw { - - public final int mSwitchIndex; - - public GT_Tool_Pocket_Saw(int aSwitchIndex) { - mSwitchIndex = aSwitchIndex; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_SAW : Textures.ItemIcons.VOID; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - super.onStatsAddedToTool(aItem, aID); - aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true)); - } -} diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java deleted file mode 100644 index ce04ba2d15..0000000000 --- a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.tools.pocket; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.behaviors.Behaviour_Switch_Metadata; -import gregtech.common.tools.GT_Tool_Screwdriver; - -public class GT_Tool_Pocket_Screwdriver extends GT_Tool_Screwdriver { - - public final int mSwitchIndex; - - public GT_Tool_Pocket_Screwdriver(int aSwitchIndex) { - mSwitchIndex = aSwitchIndex; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_SCREWDRIVER : Textures.ItemIcons.VOID; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - super.onStatsAddedToTool(aItem, aID); - aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true)); - } -} diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java deleted file mode 100644 index 6907ff6735..0000000000 --- a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java +++ /dev/null @@ -1,39 +0,0 @@ -package gregtech.common.tools.pocket; - -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.common.items.behaviors.Behaviour_Switch_Metadata; -import gregtech.common.tools.GT_Tool_WireCutter; - -public class GT_Tool_Pocket_WireCutter extends GT_Tool_WireCutter { - - public final int mSwitchIndex; - - public GT_Tool_Pocket_WireCutter(int aSwitchIndex) { - mSwitchIndex = aSwitchIndex; - } - - @Override - public float getMaxDurabilityMultiplier() { - return 4.0F; - } - - @Override - public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { - return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_WIRECUTTER : Textures.ItemIcons.VOID; - } - - @Override - public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { - return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa; - } - - @Override - public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) { - super.onStatsAddedToTool(aItem, aID); - aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true)); - } -} diff --git a/src/main/java/gregtech/common/tools/pocket/ToolPocketBranchCutter.java b/src/main/java/gregtech/common/tools/pocket/ToolPocketBranchCutter.java new file mode 100644 index 0000000000..a1bf6d9c8b --- /dev/null +++ b/src/main/java/gregtech/common/tools/pocket/ToolPocketBranchCutter.java @@ -0,0 +1,39 @@ +package gregtech.common.tools.pocket; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.behaviors.BehaviourSwitchMetadata; +import gregtech.common.tools.ToolBranchCutter; + +public class ToolPocketBranchCutter extends ToolBranchCutter { + + public final int mSwitchIndex; + + public ToolPocketBranchCutter(int aSwitchIndex) { + mSwitchIndex = aSwitchIndex; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_BRANCHCUTTER : Textures.ItemIcons.VOID; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + super.onStatsAddedToTool(aItem, aID); + aItem.addItemBehavior(aID, new BehaviourSwitchMetadata(mSwitchIndex, true, true)); + } +} diff --git a/src/main/java/gregtech/common/tools/pocket/ToolPocketFile.java b/src/main/java/gregtech/common/tools/pocket/ToolPocketFile.java new file mode 100644 index 0000000000..cd598437ab --- /dev/null +++ b/src/main/java/gregtech/common/tools/pocket/ToolPocketFile.java @@ -0,0 +1,39 @@ +package gregtech.common.tools.pocket; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.behaviors.BehaviourSwitchMetadata; +import gregtech.common.tools.ToolFile; + +public class ToolPocketFile extends ToolFile { + + public final int mSwitchIndex; + + public ToolPocketFile(int aSwitchIndex) { + mSwitchIndex = aSwitchIndex; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_FILE : Textures.ItemIcons.VOID; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + super.onStatsAddedToTool(aItem, aID); + aItem.addItemBehavior(aID, new BehaviourSwitchMetadata(mSwitchIndex, true, true)); + } +} diff --git a/src/main/java/gregtech/common/tools/pocket/ToolPocketKnife.java b/src/main/java/gregtech/common/tools/pocket/ToolPocketKnife.java new file mode 100644 index 0000000000..9dd2492a89 --- /dev/null +++ b/src/main/java/gregtech/common/tools/pocket/ToolPocketKnife.java @@ -0,0 +1,39 @@ +package gregtech.common.tools.pocket; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.behaviors.BehaviourSwitchMetadata; +import gregtech.common.tools.ToolKnife; + +public class ToolPocketKnife extends ToolKnife { + + public final int mSwitchIndex; + + public ToolPocketKnife(int aSwitchIndex) { + mSwitchIndex = aSwitchIndex; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_KNIFE : Textures.ItemIcons.VOID; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + super.onStatsAddedToTool(aItem, aID); + aItem.addItemBehavior(aID, new BehaviourSwitchMetadata(mSwitchIndex, true, true)); + } +} diff --git a/src/main/java/gregtech/common/tools/pocket/ToolPocketMultitool.java b/src/main/java/gregtech/common/tools/pocket/ToolPocketMultitool.java new file mode 100644 index 0000000000..e55671d486 --- /dev/null +++ b/src/main/java/gregtech/common/tools/pocket/ToolPocketMultitool.java @@ -0,0 +1,50 @@ +package gregtech.common.tools.pocket; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.behaviors.BehaviourSwitchMetadata; +import gregtech.common.tools.GTTool; + +public class ToolPocketMultitool extends GTTool { + + public final int mSwitchIndex; + + public ToolPocketMultitool(int aSwitchIndex) { + mSwitchIndex = aSwitchIndex; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_CLOSED : Textures.ItemIcons.VOID; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + super.onStatsAddedToTool(aItem, aID); + aItem.addItemBehavior(aID, new BehaviourSwitchMetadata(mSwitchIndex, true, true)); + } + + @Override + public float getBaseDamage() { + return 0; + } + + @Override + public boolean isMinableBlock(Block aBlock, byte aMetaData) { + return false; + } +} diff --git a/src/main/java/gregtech/common/tools/pocket/ToolPocketSaw.java b/src/main/java/gregtech/common/tools/pocket/ToolPocketSaw.java new file mode 100644 index 0000000000..4f73109d59 --- /dev/null +++ b/src/main/java/gregtech/common/tools/pocket/ToolPocketSaw.java @@ -0,0 +1,39 @@ +package gregtech.common.tools.pocket; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.behaviors.BehaviourSwitchMetadata; +import gregtech.common.tools.ToolSaw; + +public class ToolPocketSaw extends ToolSaw { + + public final int mSwitchIndex; + + public ToolPocketSaw(int aSwitchIndex) { + mSwitchIndex = aSwitchIndex; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_SAW : Textures.ItemIcons.VOID; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + super.onStatsAddedToTool(aItem, aID); + aItem.addItemBehavior(aID, new BehaviourSwitchMetadata(mSwitchIndex, true, true)); + } +} diff --git a/src/main/java/gregtech/common/tools/pocket/ToolPocketScrewdriver.java b/src/main/java/gregtech/common/tools/pocket/ToolPocketScrewdriver.java new file mode 100644 index 0000000000..f4a53ed6f6 --- /dev/null +++ b/src/main/java/gregtech/common/tools/pocket/ToolPocketScrewdriver.java @@ -0,0 +1,39 @@ +package gregtech.common.tools.pocket; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.behaviors.BehaviourSwitchMetadata; +import gregtech.common.tools.ToolScrewdriver; + +public class ToolPocketScrewdriver extends ToolScrewdriver { + + public final int mSwitchIndex; + + public ToolPocketScrewdriver(int aSwitchIndex) { + mSwitchIndex = aSwitchIndex; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_SCREWDRIVER : Textures.ItemIcons.VOID; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + super.onStatsAddedToTool(aItem, aID); + aItem.addItemBehavior(aID, new BehaviourSwitchMetadata(mSwitchIndex, true, true)); + } +} diff --git a/src/main/java/gregtech/common/tools/pocket/ToolPocketWireCutter.java b/src/main/java/gregtech/common/tools/pocket/ToolPocketWireCutter.java new file mode 100644 index 0000000000..5dcd03c53b --- /dev/null +++ b/src/main/java/gregtech/common/tools/pocket/ToolPocketWireCutter.java @@ -0,0 +1,39 @@ +package gregtech.common.tools.pocket; + +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.items.behaviors.BehaviourSwitchMetadata; +import gregtech.common.tools.ToolWireCutter; + +public class ToolPocketWireCutter extends ToolWireCutter { + + public final int mSwitchIndex; + + public ToolPocketWireCutter(int aSwitchIndex) { + mSwitchIndex = aSwitchIndex; + } + + @Override + public float getMaxDurabilityMultiplier() { + return 4.0F; + } + + @Override + public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) { + return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_WIRECUTTER : Textures.ItemIcons.VOID; + } + + @Override + public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) { + return MetaGeneratedTool.getPrimaryMaterial(aStack).mRGBa; + } + + @Override + public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) { + super.onStatsAddedToTool(aItem, aID); + aItem.addItemBehavior(aID, new BehaviourSwitchMetadata(mSwitchIndex, true, true)); + } +} diff --git a/src/main/java/gregtech/crossmod/holoinventory/GTInventoryDecoder.java b/src/main/java/gregtech/crossmod/holoinventory/GTInventoryDecoder.java new file mode 100644 index 0000000000..6774a32c6d --- /dev/null +++ b/src/main/java/gregtech/crossmod/holoinventory/GTInventoryDecoder.java @@ -0,0 +1,38 @@ +package gregtech.crossmod.holoinventory; + +import static net.dries007.holoInventory.util.NBTKeys.NBT_KEY_COUNT; + +import java.util.List; + +import net.dries007.holoInventory.compat.InventoryDecoder; +import net.dries007.holoInventory.compat.InventoryDecoderRegistry; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import gregtech.api.metatileentity.BaseTileEntity; + +public class GTInventoryDecoder extends InventoryDecoder { + + public GTInventoryDecoder() { + super(BaseTileEntity.class); + } + + @Override + public NBTTagList toNBT(IInventory inv) { + List items = ((BaseTileEntity) inv).getItemsForHoloGlasses(); + if (items == null) { + return InventoryDecoderRegistry.DEFAULT.toNBT(inv); + } + NBTTagList tagList = new NBTTagList(); + for (ItemStack stack : items) { + if (stack != null) { + NBTTagCompound tag = stack.writeToNBT(new NBTTagCompound()); + tag.setInteger(NBT_KEY_COUNT, stack.stackSize); + tagList.appendTag(tag); + } + } + return tagList; + } +} diff --git a/src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java b/src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java deleted file mode 100644 index 7f3651990d..0000000000 --- a/src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java +++ /dev/null @@ -1,38 +0,0 @@ -package gregtech.crossmod.holoinventory; - -import static net.dries007.holoInventory.util.NBTKeys.NBT_KEY_COUNT; - -import java.util.List; - -import net.dries007.holoInventory.compat.InventoryDecoder; -import net.dries007.holoInventory.compat.InventoryDecoderRegistry; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; - -import gregtech.api.metatileentity.BaseTileEntity; - -public class GT_InventoryDecoder extends InventoryDecoder { - - public GT_InventoryDecoder() { - super(BaseTileEntity.class); - } - - @Override - public NBTTagList toNBT(IInventory inv) { - List items = ((BaseTileEntity) inv).getItemsForHoloGlasses(); - if (items == null) { - return InventoryDecoderRegistry.DEFAULT.toNBT(inv); - } - NBTTagList tagList = new NBTTagList(); - for (ItemStack stack : items) { - if (stack != null) { - NBTTagCompound tag = stack.writeToNBT(new NBTTagCompound()); - tag.setInteger(NBT_KEY_COUNT, stack.stackSize); - tagList.appendTag(tag); - } - } - return tagList; - } -} diff --git a/src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java b/src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java index d7dcdcf4b5..ce3c1f74eb 100644 --- a/src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java +++ b/src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java @@ -5,6 +5,6 @@ import net.dries007.holoInventory.compat.InventoryDecoderRegistry; public class HoloInventory { public static void init() { - InventoryDecoderRegistry.register(new GT_InventoryDecoder()); + InventoryDecoderRegistry.register(new GTInventoryDecoder()); } } diff --git a/src/main/java/gregtech/crossmod/visualprospecting/GT_VisualProspecting_Database.java b/src/main/java/gregtech/crossmod/visualprospecting/GT_VisualProspecting_Database.java deleted file mode 100644 index f18700f9ea..0000000000 --- a/src/main/java/gregtech/crossmod/visualprospecting/GT_VisualProspecting_Database.java +++ /dev/null @@ -1,25 +0,0 @@ -package gregtech.crossmod.visualprospecting; - -import java.util.Optional; - -import javax.annotation.Nullable; - -import net.minecraft.world.ChunkCoordIntPair; - -public class GT_VisualProspecting_Database { - - private static IDatabase database; - - @SuppressWarnings("unused") - public static void registerDatabase(IDatabase aDatabase) { - database = aDatabase; - } - - public static Optional getVeinName(int dimensionId, @Nullable ChunkCoordIntPair coordinates) { - if (database == null || coordinates == null) { - return Optional.empty(); - } - - return database.getVeinName(dimensionId, coordinates); - } -} diff --git a/src/main/java/gregtech/crossmod/visualprospecting/VisualProspectingDatabase.java b/src/main/java/gregtech/crossmod/visualprospecting/VisualProspectingDatabase.java new file mode 100644 index 0000000000..775326cacf --- /dev/null +++ b/src/main/java/gregtech/crossmod/visualprospecting/VisualProspectingDatabase.java @@ -0,0 +1,25 @@ +package gregtech.crossmod.visualprospecting; + +import java.util.Optional; + +import javax.annotation.Nullable; + +import net.minecraft.world.ChunkCoordIntPair; + +public class VisualProspectingDatabase { + + private static IDatabase database; + + @SuppressWarnings("unused") + public static void registerDatabase(IDatabase aDatabase) { + database = aDatabase; + } + + public static Optional getVeinName(int dimensionId, @Nullable ChunkCoordIntPair coordinates) { + if (database == null || coordinates == null) { + return Optional.empty(); + } + + return database.getVeinName(dimensionId, coordinates); + } +} diff --git a/src/main/java/gregtech/loaders/load/CoverBehaviorLoader.java b/src/main/java/gregtech/loaders/load/CoverBehaviorLoader.java new file mode 100644 index 0000000000..77fc7f4b30 --- /dev/null +++ b/src/main/java/gregtech/loaders/load/CoverBehaviorLoader.java @@ -0,0 +1,11 @@ +package gregtech.loaders.load; + +import gregtech.api.util.GTLog; + +public class CoverBehaviorLoader implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Adding Cover Behaviors"); + } +} diff --git a/src/main/java/gregtech/loaders/load/FuelLoader.java b/src/main/java/gregtech/loaders/load/FuelLoader.java new file mode 100644 index 0000000000..639b5359a3 --- /dev/null +++ b/src/main/java/gregtech/loaders/load/FuelLoader.java @@ -0,0 +1,146 @@ +package gregtech.loaders.load; + +import static gregtech.api.enums.Mods.BloodMagic; +import static gregtech.api.enums.Mods.EnderIO; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.recipe.RecipeMaps.extremeNaquadahReactorFuels; +import static gregtech.api.recipe.RecipeMaps.hugeNaquadahReactorFuels; +import static gregtech.api.recipe.RecipeMaps.largeNaquadahReactorFuels; +import static gregtech.api.recipe.RecipeMaps.magicFuels; +import static gregtech.api.recipe.RecipeMaps.smallNaquadahReactorFuels; +import static gregtech.api.recipe.RecipeMaps.ultraHugeNaquadahReactorFuels; +import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE; +import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.FluidState; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.fluid.GTFluidFactory; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipeConstants; + +public class FuelLoader implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Initializing various Fuels."); + ItemList.sBlueVitriol = GTFluidFactory + .of("solution.bluevitriol", "Blue Vitriol water solution", null, FluidState.LIQUID, 295); + ItemList.sNickelSulfate = GTFluidFactory + .of("solution.nickelsulfate", "Nickel sulfate water solution", null, FluidState.LIQUID, 295); + ItemList.sGreenVitriol = GTFluidFactory + .of("solution.greenvitriol", "Green Vitriol water solution", null, FluidState.LIQUID, 295); + ItemList.sIndiumConcentrate = GTFluidFactory + .of("indiumconcentrate", "Indium Concentrate", null, FluidState.LIQUID, 295); // TODO CHECK NEW x3 + ItemList.sLeadZincSolution = GTFluidFactory + .of("leadzincsolution", "Lead-Zinc solution", null, FluidState.LIQUID, 295); + ItemList.sRocketFuel = GTFluidFactory.of("rocket_fuel", "Rocket Fuel", null, FluidState.LIQUID, 295); + + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.bolt, Materials.NaquadahEnriched, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadah, 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 50_000) + .addTo(smallNaquadahReactorFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahEnriched, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stick, Materials.Naquadah, 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 250_000) + .addTo(largeNaquadahReactorFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahEnriched, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Naquadah, 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 500_000) + .addTo(hugeNaquadahReactorFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadria, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadah, 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 250_000) + .addTo(extremeNaquadahReactorFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.stick, Materials.Naquadria, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stick, Materials.Naquadah, 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 1_000_000) + .addTo(ultraHugeNaquadahReactorFuels); + + // BloodMagic + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getModItem(BloodMagic.ID, "reinforcedSlate", 1L)) + .itemOutputs(GTModHandler.getModItem(BloodMagic.ID, "blankSlate", 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 400) + .addTo(magicFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getModItem(BloodMagic.ID, "imbuedSlate", 1L)) + .itemOutputs(GTModHandler.getModItem(BloodMagic.ID, "reinforcedSlate", 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 1000) + .addTo(magicFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getModItem(BloodMagic.ID, "demonicSlate", 1L)) + .itemOutputs(GTModHandler.getModItem(BloodMagic.ID, "imbuedSlate", 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 8000) + .addTo(magicFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getModItem(BloodMagic.ID, "bloodMagicBaseItems", 1L, 27)) + .itemOutputs(GTModHandler.getModItem(BloodMagic.ID, "demonicSlate", 1L)) + .duration(0) + .eut(0) + .metadata(FUEL_VALUE, 20000) + .addTo(magicFuels); + + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 4)) + .metadata(FUEL_VALUE, 4) + .metadata(FUEL_TYPE, 5) + .addTo(GTRecipeConstants.Fuel); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Items.experience_bottle, 1)) + .metadata(FUEL_VALUE, 10) + .metadata(FUEL_TYPE, 5) + .addTo(GTRecipeConstants.Fuel); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Items.ghast_tear, 1)) + .metadata(FUEL_VALUE, 50) + .metadata(FUEL_TYPE, 5) + .addTo(GTRecipeConstants.Fuel); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.beacon, 1)) + .metadata(FUEL_VALUE, Materials.NetherStar.mFuelPower * 2) + .metadata(FUEL_TYPE, Materials.NetherStar.mFuelType) + .addTo(GTRecipeConstants.Fuel); + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getModItem(EnderIO.ID, "bucketRocket_fuel", 1)) + .metadata(FUEL_VALUE, 250) + .metadata(FUEL_TYPE, 1) + .addTo(GTRecipeConstants.Fuel); + } +} diff --git a/src/main/java/gregtech/loaders/load/GTItemIterator.java b/src/main/java/gregtech/loaders/load/GTItemIterator.java new file mode 100644 index 0000000000..63ac59b7c2 --- /dev/null +++ b/src/main/java/gregtech/loaders/load/GTItemIterator.java @@ -0,0 +1,306 @@ +package gregtech.loaders.load; + +import static gregtech.api.recipe.RecipeMaps.cannerRecipes; +import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.WILDCARD; +import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE; +import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.IFluidContainerItem; + +import buildcraft.api.tools.IToolWrench; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.items.GTGenericItem; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTRecipeConstants; +import gregtech.api.util.GTUtility; +import gregtech.common.tools.ToolScoop; +import mods.railcraft.api.core.items.IToolCrowbar; + +public class GTItemIterator implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Scanning for certain kinds of compatible Machineblocks."); + ItemStack tStack2 = GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L); + ItemStack tStack = GTModHandler + .getRecipeOutput(tStack2, tStack2, tStack2, tStack2, null, tStack2, tStack2, tStack2, tStack2); + + if (null != tStack) { + GTValues.RA.stdBuilder() + .itemInputs(tStack) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 8L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + GTModHandler.addSmeltingRecipe(tStack, GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 8L)); + } + tStack2 = GTOreDictUnificator.get(OrePrefixes.plate, Materials.Bronze, 1L); + tStack = GTModHandler + .getRecipeOutput(tStack2, tStack2, tStack2, tStack2, null, tStack2, tStack2, tStack2, tStack2); + + if (null != tStack) { + GTOreDictUnificator.registerOre(OreDictNames.craftingRawMachineTier00, tStack); + + GTValues.RA.stdBuilder() + .itemInputs(tStack) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 8L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + GTModHandler.addSmeltingRecipe(tStack, GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 8L)); + } + + ItemStack tStack3 = new ItemStack(Blocks.glass, 1, 0); + tStack2 = GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L); + tStack = GTModHandler.getRecipeOutput( + tStack2, + tStack3, + tStack2, + tStack3, + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1L), + tStack3, + tStack2, + tStack3, + tStack2); + + if (null != (tStack)) { + GTValues.RA.stdBuilder() + .itemInputs(tStack) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L)) + .outputChances(10000, 1000) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + } + + tStack2 = GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L); + tStack3 = new ItemStack(Blocks.glass, 1, 0); + tStack = GTModHandler.getRecipeOutput( + tStack2, + tStack3, + tStack2, + tStack3, + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1L), + tStack3, + tStack2, + tStack3, + tStack2); + if (null != tStack) { + GTValues.RA.stdBuilder() + .itemInputs(tStack) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L)) + .outputChances(10000, 1000) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + } + GTLog.out.println("GTMod: Registering various Tools to be usable on GregTech Machines"); + GregTechAPI.registerScrewdriver( + GTModHandler + .getRecipeOutput(null, new ItemStack(Items.iron_ingot, 1), null, new ItemStack(Items.stick, 1))); + GregTechAPI.registerScrewdriver( + GTModHandler + .getRecipeOutput(new ItemStack(Items.iron_ingot, 1), null, null, null, new ItemStack(Items.stick, 1))); + + GTLog.out.println( + "GTMod: Adding Food Recipes to the Automatic Canning Machine. (also during the following Item Iteration)"); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Items.rotten_flesh, 2, WILDCARD), ItemList.IC2_Food_Can_Empty.get(1L)) + .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L)) + .duration(10 * SECONDS) + .eut(1) + .addTo(cannerRecipes); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Items.spider_eye, 2, WILDCARD), ItemList.IC2_Food_Can_Empty.get(1L)) + .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L)) + .duration(5 * SECONDS) + .eut(1) + .addTo(cannerRecipes); + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Food_Poisonous_Potato.get(2L), ItemList.IC2_Food_Can_Empty.get(1L)) + .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L)) + .duration(5 * SECONDS) + .eut(1) + .addTo(cannerRecipes); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Items.cake, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(12L)) + .itemOutputs(ItemList.IC2_Food_Can_Filled.get(12L)) + .duration(30 * SECONDS) + .eut(1) + .addTo(cannerRecipes); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Items.mushroom_stew, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(6L)) + .itemOutputs(ItemList.IC2_Food_Can_Filled.get(6L), new ItemStack(Items.bowl, 1)) + .duration(15 * SECONDS) + .eut(1) + .addTo(cannerRecipes); + + GTLog.out.println("GTMod: Scanning ItemList."); + + try { + /* (tName.equals("tile.sedimentaryStone")) || **/ + for (Object o : Item.itemRegistry) { + Object tObject; + + if (!(((tObject = o) instanceof Item) && (!(tObject instanceof GTGenericItem)))) { + continue; + } + + Item tItem = (Item) tObject; + String tName; + if ((tName = tItem.getUnlocalizedName()) == null) { + continue; + } + + if ((tItem instanceof IToolCrowbar)) { + if ((tItem.isDamageable()) || (GTModHandler.isElectricItem(new ItemStack(tItem, 1, 0)))) { + if (GregTechAPI.registerCrowbar(new ItemStack(tItem, 1, WILDCARD))) { + GTLog.out.println("GTMod: Registered valid RC Crowbar: " + tName); + } + } + } + if ((tItem instanceof IToolWrench)) { + if ((tItem.isDamageable()) || (GTModHandler.isElectricItem(new ItemStack(tItem, 1, 0)))) { + if (GregTechAPI.registerWrench(new ItemStack(tItem, 1, WILDCARD))) { + GTLog.out.println("GTMod: Registered valid BC Wrench: " + tName); + } + } + } + Block tBlock = GTUtility.getBlockFromStack(new ItemStack(tItem, 1, 0)); + if (tBlock != null) { + if (tName.endsWith("beehives")) { + tBlock.setHarvestLevel("scoop", 0); + ToolScoop.sBeeHiveMaterial = tBlock.getMaterial(); + } + if (OrePrefixes.stone.mDefaultStackSize < tItem.getItemStackLimit(new ItemStack(tItem, 1, 0))) { + if ((tBlock.isReplaceableOreGen(GTValues.DW, 0, 0, 0, Blocks.stone)) + || (tBlock.isReplaceableOreGen(GTValues.DW, 0, 0, 0, Blocks.netherrack)) + || (tBlock.isReplaceableOreGen(GTValues.DW, 0, 0, 0, Blocks.end_stone))) { + tItem.setMaxStackSize(OrePrefixes.stone.mDefaultStackSize); + } + } + } + if (((tItem instanceof ItemFood)) && (tItem != ItemList.IC2_Food_Can_Filled.getItem()) + && (tItem != ItemList.IC2_Food_Can_Spoiled.getItem())) { + int tFoodValue = ((ItemFood) tItem).func_150905_g(new ItemStack(tItem, 1, 0)); + if (tFoodValue > 0) { + GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder(); + recipeBuilder + .itemInputs(new ItemStack(tItem, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(tFoodValue)); + if (GTUtility.getContainerItem(new ItemStack(tItem, 1, 0), true) == null) { + recipeBuilder.itemOutputs(ItemList.IC2_Food_Can_Filled.get(tFoodValue)); + } else { + recipeBuilder.itemOutputs( + ItemList.IC2_Food_Can_Filled.get(tFoodValue), + GTUtility.getContainerItem(new ItemStack(tItem, 1, 0), true)); + } + recipeBuilder.duration(tFoodValue * 5 * SECONDS) + .eut(1) + .addTo(cannerRecipes); + } + } + if ((tItem instanceof IFluidContainerItem)) { + GTOreDictUnificator.addToBlacklist(new ItemStack(tItem, 1, WILDCARD)); + } + + switch (tName) { + // twilight forest + case "item.fieryBlood", "item.fieryTears" -> GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(tItem, 1, 0)) + .metadata(FUEL_VALUE, 2048) + .metadata(FUEL_TYPE, 5) + .addTo(GTRecipeConstants.Fuel); + + // twilight forest + case "tile.TFRoots" -> { + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(tItem, 1, 0)) + .itemOutputs(new ItemStack(Items.stick, 2), new ItemStack(Items.stick, 1)) + .outputChances(10000, 3000) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(tItem, 1, 1)) + .itemOutputs(new ItemStack(Items.stick, 4)) + .metadata(FUEL_VALUE, 32) + .metadata(FUEL_TYPE, 5) + .addTo(GTRecipeConstants.Fuel); + } + + // tinker construct + case "item.tconstruct.manual" -> GTOreDictUnificator + .registerOre("bookTinkersManual", new ItemStack(tItem, 1, WILDCARD)); + + // buildcraft + case "item.blueprintItem" -> GTOreDictUnificator + .registerOre("paperBlueprint", new ItemStack(tItem, 1, WILDCARD)); + + // Thaumcraft + case "item.ItemThaumonomicon" -> GTOreDictUnificator + .registerOre("bookThaumonomicon", new ItemStack(tItem, 1, WILDCARD)); + + // BoP + case "tile.bop.redRocks" -> { + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 0)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 1)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 2)); + } + + // Thaumcraft + case "tile.blockCosmeticSolid" -> { + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(tItem, 1, 0)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(tItem, 1, 1)); + GTOreDictUnificator + .registerOre(OrePrefixes.block, Materials.Thaumium, new ItemStack(tItem, 1, 4)); + } + + // minecraft + case "tile.enderchest" -> GTOreDictUnificator + .registerOre(OreDictNames.enderChest, new ItemStack(tItem, 1, WILDCARD)); + + // buildcraft + case "tile.autoWorkbenchBlock" -> GTOreDictUnificator + .registerOre(OreDictNames.craftingWorkBench, new ItemStack(tItem, 1, 0)); + + // buildcraft + case "tile.pumpBlock" -> GTOreDictUnificator + .registerOre(OreDictNames.craftingPump, new ItemStack(tItem, 1, 0)); + + // buildcraft + case "tile.tankBlock" -> GTOreDictUnificator + .registerOre(OreDictNames.craftingTank, new ItemStack(tItem, 1, 0)); + + } + } + } catch (Throwable e) { + /**/ + } + } +} diff --git a/src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java b/src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java deleted file mode 100644 index 37f626ef90..0000000000 --- a/src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java +++ /dev/null @@ -1,11 +0,0 @@ -package gregtech.loaders.load; - -import gregtech.api.util.GT_Log; - -public class GT_CoverBehaviorLoader implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Adding Cover Behaviors"); - } -} diff --git a/src/main/java/gregtech/loaders/load/GT_FuelLoader.java b/src/main/java/gregtech/loaders/load/GT_FuelLoader.java deleted file mode 100644 index bed97ca010..0000000000 --- a/src/main/java/gregtech/loaders/load/GT_FuelLoader.java +++ /dev/null @@ -1,146 +0,0 @@ -package gregtech.loaders.load; - -import static gregtech.api.enums.Mods.BloodMagic; -import static gregtech.api.enums.Mods.EnderIO; -import static gregtech.api.enums.Mods.Thaumcraft; -import static gregtech.api.recipe.RecipeMaps.extremeNaquadahReactorFuels; -import static gregtech.api.recipe.RecipeMaps.hugeNaquadahReactorFuels; -import static gregtech.api.recipe.RecipeMaps.largeNaquadahReactorFuels; -import static gregtech.api.recipe.RecipeMaps.magicFuels; -import static gregtech.api.recipe.RecipeMaps.smallNaquadahReactorFuels; -import static gregtech.api.recipe.RecipeMaps.ultraHugeNaquadahReactorFuels; -import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE; -import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.FluidState; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.fluid.GT_FluidFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_RecipeConstants; - -public class GT_FuelLoader implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Initializing various Fuels."); - ItemList.sBlueVitriol = GT_FluidFactory - .of("solution.bluevitriol", "Blue Vitriol water solution", null, FluidState.LIQUID, 295); - ItemList.sNickelSulfate = GT_FluidFactory - .of("solution.nickelsulfate", "Nickel sulfate water solution", null, FluidState.LIQUID, 295); - ItemList.sGreenVitriol = GT_FluidFactory - .of("solution.greenvitriol", "Green Vitriol water solution", null, FluidState.LIQUID, 295); - ItemList.sIndiumConcentrate = GT_FluidFactory - .of("indiumconcentrate", "Indium Concentrate", null, FluidState.LIQUID, 295); // TODO CHECK NEW x3 - ItemList.sLeadZincSolution = GT_FluidFactory - .of("leadzincsolution", "Lead-Zinc solution", null, FluidState.LIQUID, 295); - ItemList.sRocketFuel = GT_FluidFactory.of("rocket_fuel", "Rocket Fuel", null, FluidState.LIQUID, 295); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.NaquadahEnriched, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadah, 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 50_000) - .addTo(smallNaquadahReactorFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahEnriched, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Naquadah, 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 250_000) - .addTo(largeNaquadahReactorFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahEnriched, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Naquadah, 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 500_000) - .addTo(hugeNaquadahReactorFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadria, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadah, 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 250_000) - .addTo(extremeNaquadahReactorFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Naquadria, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Naquadah, 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 1_000_000) - .addTo(ultraHugeNaquadahReactorFuels); - - // BloodMagic - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getModItem(BloodMagic.ID, "reinforcedSlate", 1L)) - .itemOutputs(GT_ModHandler.getModItem(BloodMagic.ID, "blankSlate", 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 400) - .addTo(magicFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getModItem(BloodMagic.ID, "imbuedSlate", 1L)) - .itemOutputs(GT_ModHandler.getModItem(BloodMagic.ID, "reinforcedSlate", 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 1000) - .addTo(magicFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getModItem(BloodMagic.ID, "demonicSlate", 1L)) - .itemOutputs(GT_ModHandler.getModItem(BloodMagic.ID, "imbuedSlate", 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 8000) - .addTo(magicFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getModItem(BloodMagic.ID, "bloodMagicBaseItems", 1L, 27)) - .itemOutputs(GT_ModHandler.getModItem(BloodMagic.ID, "demonicSlate", 1L)) - .duration(0) - .eut(0) - .metadata(FUEL_VALUE, 20000) - .addTo(magicFuels); - - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 4)) - .metadata(FUEL_VALUE, 4) - .metadata(FUEL_TYPE, 5) - .addTo(GT_RecipeConstants.Fuel); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Items.experience_bottle, 1)) - .metadata(FUEL_VALUE, 10) - .metadata(FUEL_TYPE, 5) - .addTo(GT_RecipeConstants.Fuel); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Items.ghast_tear, 1)) - .metadata(FUEL_VALUE, 50) - .metadata(FUEL_TYPE, 5) - .addTo(GT_RecipeConstants.Fuel); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.beacon, 1)) - .metadata(FUEL_VALUE, Materials.NetherStar.mFuelPower * 2) - .metadata(FUEL_TYPE, Materials.NetherStar.mFuelType) - .addTo(GT_RecipeConstants.Fuel); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getModItem(EnderIO.ID, "bucketRocket_fuel", 1)) - .metadata(FUEL_VALUE, 250) - .metadata(FUEL_TYPE, 1) - .addTo(GT_RecipeConstants.Fuel); - } -} diff --git a/src/main/java/gregtech/loaders/load/GT_ItemIterator.java b/src/main/java/gregtech/loaders/load/GT_ItemIterator.java deleted file mode 100644 index a44b411ba0..0000000000 --- a/src/main/java/gregtech/loaders/load/GT_ItemIterator.java +++ /dev/null @@ -1,305 +0,0 @@ -package gregtech.loaders.load; - -import static gregtech.api.recipe.RecipeMaps.cannerRecipes; -import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.WILDCARD; -import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE; -import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.IFluidContainerItem; - -import buildcraft.api.tools.IToolWrench; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OreDictNames; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_RecipeConstants; -import gregtech.api.util.GT_Utility; -import mods.railcraft.api.core.items.IToolCrowbar; - -public class GT_ItemIterator implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Scanning for certain kinds of compatible Machineblocks."); - ItemStack tStack2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L); - ItemStack tStack = GT_ModHandler - .getRecipeOutput(tStack2, tStack2, tStack2, tStack2, null, tStack2, tStack2, tStack2, tStack2); - - if (null != tStack) { - GT_Values.RA.stdBuilder() - .itemInputs(tStack) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 8L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - GT_ModHandler.addSmeltingRecipe(tStack, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 8L)); - } - tStack2 = GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Bronze, 1L); - tStack = GT_ModHandler - .getRecipeOutput(tStack2, tStack2, tStack2, tStack2, null, tStack2, tStack2, tStack2, tStack2); - - if (null != tStack) { - GT_OreDictUnificator.registerOre(OreDictNames.craftingRawMachineTier00, tStack); - - GT_Values.RA.stdBuilder() - .itemInputs(tStack) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 8L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - GT_ModHandler.addSmeltingRecipe(tStack, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 8L)); - } - - ItemStack tStack3 = new ItemStack(Blocks.glass, 1, 0); - tStack2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L); - tStack = GT_ModHandler.getRecipeOutput( - tStack2, - tStack3, - tStack2, - tStack3, - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1L), - tStack3, - tStack2, - tStack3, - tStack2); - - if (null != (tStack)) { - GT_Values.RA.stdBuilder() - .itemInputs(tStack) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L)) - .outputChances(10000, 1000) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - } - - tStack2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L); - tStack3 = new ItemStack(Blocks.glass, 1, 0); - tStack = GT_ModHandler.getRecipeOutput( - tStack2, - tStack3, - tStack2, - tStack3, - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1L), - tStack3, - tStack2, - tStack3, - tStack2); - if (null != tStack) { - GT_Values.RA.stdBuilder() - .itemInputs(tStack) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L)) - .outputChances(10000, 1000) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - } - GT_Log.out.println("GT_Mod: Registering various Tools to be usable on GregTech Machines"); - GregTech_API.registerScrewdriver( - GT_ModHandler - .getRecipeOutput(null, new ItemStack(Items.iron_ingot, 1), null, new ItemStack(Items.stick, 1))); - GregTech_API.registerScrewdriver( - GT_ModHandler - .getRecipeOutput(new ItemStack(Items.iron_ingot, 1), null, null, null, new ItemStack(Items.stick, 1))); - - GT_Log.out.println( - "GT_Mod: Adding Food Recipes to the Automatic Canning Machine. (also during the following Item Iteration)"); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Items.rotten_flesh, 2, WILDCARD), ItemList.IC2_Food_Can_Empty.get(1L)) - .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L)) - .duration(10 * SECONDS) - .eut(1) - .addTo(cannerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Items.spider_eye, 2, WILDCARD), ItemList.IC2_Food_Can_Empty.get(1L)) - .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L)) - .duration(5 * SECONDS) - .eut(1) - .addTo(cannerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Food_Poisonous_Potato.get(2L), ItemList.IC2_Food_Can_Empty.get(1L)) - .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L)) - .duration(5 * SECONDS) - .eut(1) - .addTo(cannerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Items.cake, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(12L)) - .itemOutputs(ItemList.IC2_Food_Can_Filled.get(12L)) - .duration(30 * SECONDS) - .eut(1) - .addTo(cannerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Items.mushroom_stew, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(6L)) - .itemOutputs(ItemList.IC2_Food_Can_Filled.get(6L), new ItemStack(Items.bowl, 1)) - .duration(15 * SECONDS) - .eut(1) - .addTo(cannerRecipes); - - GT_Log.out.println("GT_Mod: Scanning ItemList."); - - try { - /* (tName.equals("tile.sedimentaryStone")) || **/ - for (Object o : Item.itemRegistry) { - Object tObject; - - if (!(((tObject = o) instanceof Item) && (!(tObject instanceof GT_Generic_Item)))) { - continue; - } - - Item tItem = (Item) tObject; - String tName; - if ((tName = tItem.getUnlocalizedName()) == null) { - continue; - } - - if ((tItem instanceof IToolCrowbar)) { - if ((tItem.isDamageable()) || (GT_ModHandler.isElectricItem(new ItemStack(tItem, 1, 0)))) { - if (GregTech_API.registerCrowbar(new ItemStack(tItem, 1, WILDCARD))) { - GT_Log.out.println("GT_Mod: Registered valid RC Crowbar: " + tName); - } - } - } - if ((tItem instanceof IToolWrench)) { - if ((tItem.isDamageable()) || (GT_ModHandler.isElectricItem(new ItemStack(tItem, 1, 0)))) { - if (GregTech_API.registerWrench(new ItemStack(tItem, 1, WILDCARD))) { - GT_Log.out.println("GT_Mod: Registered valid BC Wrench: " + tName); - } - } - } - Block tBlock = GT_Utility.getBlockFromStack(new ItemStack(tItem, 1, 0)); - if (tBlock != null) { - if (tName.endsWith("beehives")) { - tBlock.setHarvestLevel("scoop", 0); - gregtech.common.tools.GT_Tool_Scoop.sBeeHiveMaterial = tBlock.getMaterial(); - } - if (OrePrefixes.stone.mDefaultStackSize < tItem.getItemStackLimit(new ItemStack(tItem, 1, 0))) { - if ((tBlock.isReplaceableOreGen(GT_Values.DW, 0, 0, 0, Blocks.stone)) - || (tBlock.isReplaceableOreGen(GT_Values.DW, 0, 0, 0, Blocks.netherrack)) - || (tBlock.isReplaceableOreGen(GT_Values.DW, 0, 0, 0, Blocks.end_stone))) { - tItem.setMaxStackSize(OrePrefixes.stone.mDefaultStackSize); - } - } - } - if (((tItem instanceof ItemFood)) && (tItem != ItemList.IC2_Food_Can_Filled.getItem()) - && (tItem != ItemList.IC2_Food_Can_Spoiled.getItem())) { - int tFoodValue = ((ItemFood) tItem).func_150905_g(new ItemStack(tItem, 1, 0)); - if (tFoodValue > 0) { - GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder(); - recipeBuilder - .itemInputs(new ItemStack(tItem, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(tFoodValue)); - if (GT_Utility.getContainerItem(new ItemStack(tItem, 1, 0), true) == null) { - recipeBuilder.itemOutputs(ItemList.IC2_Food_Can_Filled.get(tFoodValue)); - } else { - recipeBuilder.itemOutputs( - ItemList.IC2_Food_Can_Filled.get(tFoodValue), - GT_Utility.getContainerItem(new ItemStack(tItem, 1, 0), true)); - } - recipeBuilder.duration(tFoodValue * 5 * SECONDS) - .eut(1) - .addTo(cannerRecipes); - } - } - if ((tItem instanceof IFluidContainerItem)) { - GT_OreDictUnificator.addToBlacklist(new ItemStack(tItem, 1, WILDCARD)); - } - - switch (tName) { - // twilight forest - case "item.fieryBlood", "item.fieryTears" -> GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(tItem, 1, 0)) - .metadata(FUEL_VALUE, 2048) - .metadata(FUEL_TYPE, 5) - .addTo(GT_RecipeConstants.Fuel); - - // twilight forest - case "tile.TFRoots" -> { - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(tItem, 1, 0)) - .itemOutputs(new ItemStack(Items.stick, 2), new ItemStack(Items.stick, 1)) - .outputChances(10000, 3000) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(tItem, 1, 1)) - .itemOutputs(new ItemStack(Items.stick, 4)) - .metadata(FUEL_VALUE, 32) - .metadata(FUEL_TYPE, 5) - .addTo(GT_RecipeConstants.Fuel); - } - - // tinker construct - case "item.tconstruct.manual" -> GT_OreDictUnificator - .registerOre("bookTinkersManual", new ItemStack(tItem, 1, WILDCARD)); - - // buildcraft - case "item.blueprintItem" -> GT_OreDictUnificator - .registerOre("paperBlueprint", new ItemStack(tItem, 1, WILDCARD)); - - // Thaumcraft - case "item.ItemThaumonomicon" -> GT_OreDictUnificator - .registerOre("bookThaumonomicon", new ItemStack(tItem, 1, WILDCARD)); - - // BoP - case "tile.bop.redRocks" -> { - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 0)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 1)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 2)); - } - - // Thaumcraft - case "tile.blockCosmeticSolid" -> { - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(tItem, 1, 0)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(tItem, 1, 1)); - GT_OreDictUnificator - .registerOre(OrePrefixes.block, Materials.Thaumium, new ItemStack(tItem, 1, 4)); - } - - // minecraft - case "tile.enderchest" -> GT_OreDictUnificator - .registerOre(OreDictNames.enderChest, new ItemStack(tItem, 1, WILDCARD)); - - // buildcraft - case "tile.autoWorkbenchBlock" -> GT_OreDictUnificator - .registerOre(OreDictNames.craftingWorkBench, new ItemStack(tItem, 1, 0)); - - // buildcraft - case "tile.pumpBlock" -> GT_OreDictUnificator - .registerOre(OreDictNames.craftingPump, new ItemStack(tItem, 1, 0)); - - // buildcraft - case "tile.tankBlock" -> GT_OreDictUnificator - .registerOre(OreDictNames.craftingTank, new ItemStack(tItem, 1, 0)); - - } - } - } catch (Throwable e) { - /**/ - } - } -} diff --git a/src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java b/src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java deleted file mode 100644 index 1c90187ee2..0000000000 --- a/src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java +++ /dev/null @@ -1,4675 +0,0 @@ -package gregtech.loaders.load; - -import static gregtech.api.enums.Mods.BuildCraftFactory; -import static gregtech.api.enums.Mods.Forestry; -import static gregtech.api.enums.Mods.GalacticraftCore; -import static gregtech.api.enums.Mods.Gendustry; -import static gregtech.api.enums.Mods.IndustrialCraft2; -import static gregtech.api.enums.Mods.NotEnoughItems; -import static gregtech.api.enums.Mods.Thaumcraft; -import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -import codechicken.nei.api.API; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OreDictNames; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.TierEU; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe; -import gregtech.api.util.ExternalMaterials; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.loaders.postload.GT_PCBFactoryMaterialLoader; -import gregtech.loaders.postload.GT_ProcessingArrayRecipeLoader; -import ic2.core.Ic2Items; - -public class GT_Loader_MetaTileEntities_Recipes implements Runnable { - - private static final String aTextPlate = "PPP"; - private static final String aTextPlateWrench = "PwP"; - private static final String aTextPlateMotor = "PMP"; - private static final String aTextCableHull = "CMC"; - private static final String aTextWireHull = "WMW"; - private static final String aTextWireChest = "WTW"; - private static final String aTextWireCoil = "WCW"; - private static final String aTextMotorWire = "EWE"; - private static final String aTextWirePump = "WPW"; - - private static final long bits = GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE - | GT_ModHandler.RecipeBits.BUFFERED; - private static final long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | bits; - - private static void registerMachineTypes() { - registerAlloySmelter(); - registerArcFurnace(); - registerAutoclave(); - registerAssembler(); - registerBendingMachine(); - registerCanner(); - registerCentrifuge(); - registerCompressor(); - registerChemicalBath(); - registerChemicalReactor(); - registerCircuitAssembler(); - registerCuttingMachine(); - registerDistillery(); - registerElectricFurnace(); - registerElectrolyser(); - registerElectromagneticSeparator(); - registerExtractor(); - registerExtruder(); - registerFermenter(); - registerFluidCanner(); - registerFluidExtractor(); - registerFluidHeater(); - registerFluidSolidifier(); - registerForgeHammer(); - registerFormingPress(); - registerLathe(); - registerLaserEngraver(); - registerMacerator(); - registerMatterAmplifier(); - registerMicrowave(); - registerMixer(); - registerOreWasher(); - registerOven(); - registerPlasmaArcFurnace(); - registerPolarizer(); - registerPrinter(); - registerRecycler(); - registerSifter(); - registerSlicer(); - registerThermalCentrifuge(); - registerUnpackager(); - registerWiremill(); - } - - private static void registerAlloySmelter() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_AlloySmelter.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_AlloySmelter.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_AlloySmelter.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_AlloySmelter.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_AlloySmelter.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 5); - - } - - private static void registerArcFurnace() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_ArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_ArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_ArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_ArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_ArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 5); - - } - - private static void registerAssembler() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Assembler.get(1), - bitsd, - new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Assembler.get(1), - bitsd, - new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Assembler.get(1), - bitsd, - new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Assembler.get(1), - bitsd, - new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Assembler.get(1), - bitsd, - new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - } - - private static void registerAutoclave() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Autoclave.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, - 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Autoclave.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, - 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Autoclave.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, - 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Autoclave.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, - 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Autoclave.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, - 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerBendingMachine() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Bender.get(1), - bitsd, - new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Bender.get(1), - bitsd, - new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Bender.get(1), - bitsd, - new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Bender.get(1), - bitsd, - new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Bender.get(1), - bitsd, - new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - } - - private static void registerCanner() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Canner.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Canner.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Canner.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Canner.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Canner.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - } - - private static void registerCentrifuge() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Centrifuge.get(1), - bitsd, - new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Centrifuge.get(1), - bitsd, - new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Centrifuge.get(1), - bitsd, - new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Centrifuge.get(1), - bitsd, - new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Centrifuge.get(1), - bitsd, - new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - } - - private static void registerChemicalBath() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_ChemicalBath.get(1), - bitsd, - new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_ChemicalBath.get(1), - bitsd, - new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_ChemicalBath.get(1), - bitsd, - new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_ChemicalBath.get(1), - bitsd, - new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_ChemicalBath.get(1), - bitsd, - new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerChemicalReactor() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_ChemicalReactor.get(1), - bitsd, - new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_ChemicalReactor.get(1), - bitsd, - new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_ChemicalReactor.get(1), - bitsd, - new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.pipeMedium.get(Materials.Plastic) }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_ChemicalReactor.get(1), - bitsd, - new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.pipeLarge.get(Materials.Plastic) }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_ChemicalReactor.get(1), - bitsd, - new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.pipeHuge.get(Materials.Plastic) }, - 5); - } - - private static void registerCircuitAssembler() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 5); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LuV_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 6); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_ZPM_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 7); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_UV_CircuitAssembler.get(1), - bitsd, - new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }, - 8); - - } - - private static void registerCompressor() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Compressor.get(1), - bitsd, - new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Compressor.get(1), - bitsd, - new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Compressor.get(1), - bitsd, - new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Compressor.get(1), - bitsd, - new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Compressor.get(1), - bitsd, - new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - - } - - private static void registerCuttingMachine() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Cutter.get(1), - bitsd, - new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingDiamondBlade }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Cutter.get(1), - bitsd, - new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingDiamondBlade }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Cutter.get(1), - bitsd, - new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingDiamondBlade }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Cutter.get(1), - bitsd, - new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingDiamondBlade }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Cutter.get(1), - bitsd, - new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingDiamondBlade }, - 5); - - } - - private static void registerDistillery() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Distillery.get(1), - bitsd, - new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Distillery.get(1), - bitsd, - new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Distillery.get(1), - bitsd, - new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Distillery.get(1), - bitsd, - new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Distillery.get(1), - bitsd, - new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerElectricFurnace() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_E_Furnace.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_E_Furnace.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_E_Furnace.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_E_Furnace.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_E_Furnace.get(1), - bitsd, - new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 5); - - } - - private static void registerElectrolyser() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Electrolyzer.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Gold), 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Electrolyzer.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Silver), 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Electrolyzer.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Electrum), 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Electrolyzer.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Platinum), 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Electrolyzer.get(1), - bitsd, - new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.HSSG), 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerElectromagneticSeparator() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_ElectromagneticSeparator.get(1), - bitsd, - new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_ElectromagneticSeparator.get(1), - bitsd, - new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_ElectromagneticSeparator.get(1), - bitsd, - new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_ElectromagneticSeparator.get(1), - bitsd, - new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_ElectromagneticSeparator.get(1), - bitsd, - new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - - } - - private static void registerExtractor() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Extractor.get(1), - bitsd, - new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Extractor.get(1), - bitsd, - new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Extractor.get(1), - bitsd, - new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Extractor.get(1), - bitsd, - new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Extractor.get(1), - bitsd, - new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerExtruder() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Extruder.get(1), - bitsd, - new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Extruder.get(1), - bitsd, - new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Extruder.get(1), - bitsd, - new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Extruder.get(1), - bitsd, - new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Extruder.get(1), - bitsd, - new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 5); - - } - - private static void registerFermenter() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Fermenter.get(1), - bitsd, - new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Fermenter.get(1), - bitsd, - new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Fermenter.get(1), - bitsd, - new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Fermenter.get(1), - bitsd, - new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Fermenter.get(1), - bitsd, - new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerFluidCanner() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_FluidCanner.get(1), - bitsd, - new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_FluidCanner.get(1), - bitsd, - new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_FluidCanner.get(1), - bitsd, - new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_FluidCanner.get(1), - bitsd, - new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_FluidCanner.get(1), - bitsd, - new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerFluidExtractor() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_FluidExtractor.get(1), - bitsd, - new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_FluidExtractor.get(1), - bitsd, - new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_FluidExtractor.get(1), - bitsd, - new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_FluidExtractor.get(1), - bitsd, - new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_FluidExtractor.get(1), - bitsd, - new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - - } - - private static void registerFluidHeater() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_FluidHeater.get(1), - bitsd, - new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_FluidHeater.get(1), - bitsd, - new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_FluidHeater.get(1), - bitsd, - new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_FluidHeater.get(1), - bitsd, - new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_FluidHeater.get(1), - bitsd, - new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - } - - private static void registerFluidSolidifier() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_FluidSolidifier.get(1), - bitsd, - new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingChest }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_FluidSolidifier.get(1), - bitsd, - new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingChest }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_FluidSolidifier.get(1), - bitsd, - new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingChest }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_FluidSolidifier.get(1), - bitsd, - new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingChest }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_FluidSolidifier.get(1), - bitsd, - new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, - 'B', OreDictNames.craftingChest }, - 5); - - } - - private static void registerForgeHammer() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Hammer.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Hammer.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Hammer.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Hammer.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Hammer.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil }, - 5); - - } - - private static void registerFormingPress() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Press.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Press.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Press.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Press.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Press.get(1), - bitsd, - new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - } - - private static void registerLaserEngraver() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_LaserEngraver.get(1), - bitsd, - new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_LaserEngraver.get(1), - bitsd, - new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_LaserEngraver.get(1), - bitsd, - new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_LaserEngraver.get(1), - bitsd, - new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_LaserEngraver.get(1), - bitsd, - new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - - } - - private static void registerLathe() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Lathe.get(1), - bitsd, - new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OrePrefixes.gem.get(Materials.Diamond) }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Lathe.get(1), - bitsd, - new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OrePrefixes.gemFlawless.get(Materials.Diamond) }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Lathe.get(1), - bitsd, - new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OreDictNames.craftingIndustrialDiamond }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Lathe.get(1), - bitsd, - new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OreDictNames.craftingIndustrialDiamond }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Lathe.get(1), - bitsd, - new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OreDictNames.craftingIndustrialDiamond }, - 5); - - } - - private static void registerMacerator() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Macerator.get(1), - bitsd, - new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.gem.get(Materials.Diamond) }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Macerator.get(1), - bitsd, - new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.gemFlawless.get(Materials.Diamond) }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Macerator.get(1), - bitsd, - new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OreDictNames.craftingGrinder }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Macerator.get(1), - bitsd, - new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OreDictNames.craftingGrinder }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Macerator.get(1), - bitsd, - new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OreDictNames.craftingGrinder }, - 5); - - } - - private static void registerMatterAmplifier() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Amplifab.get(1), - bitsd, - new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Amplifab.get(1), - bitsd, - new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Amplifab.get(1), - bitsd, - new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Amplifab.get(1), - bitsd, - new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Amplifab.get(1), - bitsd, - new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }, - 5); - - } - - private static void registerMicrowave() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Microwave.get(1), - bitsd, - new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Microwave.get(1), - bitsd, - new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Microwave.get(1), - bitsd, - new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Microwave.get(1), - bitsd, - new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Microwave.get(1), - bitsd, - new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) }, - 5); - - } - - private static void registerMixer() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Mixer.get(1), - bitsd, - new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Mixer.get(1), - bitsd, - new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Mixer.get(1), - bitsd, - new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Mixer.get(1), - bitsd, - new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Mixer.get(1), - bitsd, - new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }, - 5); - } - - private static void registerOreWasher() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_OreWasher.get(1), - bitsd, - new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_OreWasher.get(1), - bitsd, - new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_OreWasher.get(1), - bitsd, - new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_OreWasher.get(1), - bitsd, - new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_OreWasher.get(1), - bitsd, - new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }, - 5); - - } - - private static void registerOven() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Oven.get(1), - bitsd, - new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Oven.get(1), - bitsd, - new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Oven.get(1), - bitsd, - new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Oven.get(1), - bitsd, - new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Oven.get(1), - bitsd, - new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }, - 5); - - } - - private static void registerPlasmaArcFurnace() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_PlasmaArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_PlasmaArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_PlasmaArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_PlasmaArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_PlasmaArcFurnace.get(1), - bitsd, - new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, - 'G', OrePrefixes.cell.get(Materials.Graphite) }, - 5); - - } - - private static void registerPolarizer() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Polarizer.get(1), - bitsd, - new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Polarizer.get(1), - bitsd, - new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Polarizer.get(1), - bitsd, - new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Polarizer.get(1), - bitsd, - new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Polarizer.get(1), - bitsd, - new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - - } - - private static void registerPrinter() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LuV_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 6); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_ZPM_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 7); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_UV_Printer.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 8); - - } - - private static void registerRecycler() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Recycler.get(1), - bitsd, - new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Recycler.get(1), - bitsd, - new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Recycler.get(1), - bitsd, - new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Recycler.get(1), - bitsd, - new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Recycler.get(1), - bitsd, - new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, - 5); - - } - - private static void registerSifter() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Sifter.get(1), - bitsd, - new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Sifter.get(1), - bitsd, - new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Sifter.get(1), - bitsd, - new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Sifter.get(1), - bitsd, - new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Sifter.get(1), - bitsd, - new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - - } - - private static void registerSlicer() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Slicer.get(1), - bitsd, - new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Slicer.get(1), - bitsd, - new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Slicer.get(1), - bitsd, - new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Slicer.get(1), - bitsd, - new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Slicer.get(1), - bitsd, - new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, - 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - - } - - private static void registerThermalCentrifuge() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_ThermalCentrifuge.get(1), - bitsd, - new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_ThermalCentrifuge.get(1), - bitsd, - new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_ThermalCentrifuge.get(1), - bitsd, - new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_ThermalCentrifuge.get(1), - bitsd, - new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_ThermalCentrifuge.get(1), - bitsd, - new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }, - 5); - - } - - private static void registerUnpackager() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 5); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LuV_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 6); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_ZPM_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 7); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_UV_Unboxinator.get(1), - bitsd, - new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest }, - 8); - } - - private static void registerWiremill() { - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_LV_Wiremill.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 1); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_MV_Wiremill.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 2); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_HV_Wiremill.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 3); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_EV_Wiremill.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 4); - - GT_ModHandler.addMachineCraftingRecipe( - ItemList.Machine_IV_Wiremill.get(1), - bitsd, - new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, - 'C', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W', - GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }, - 5); - } - - private static void registerShapedCraftingRecipes() { - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Pipe_Polytetrafluoroethylene.get(1L), - bits, - new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Polytetrafluoroethylene), 'F', - OrePrefixes.frameGt.get(Materials.Polytetrafluoroethylene), 'I', - OrePrefixes.pipeMedium.get(Materials.Polytetrafluoroethylene) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Pipe_Polybenzimidazole.get(1L), - bits, - new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Polybenzimidazole), 'F', - OrePrefixes.frameGt.get(Materials.Polybenzimidazole), 'I', - OrePrefixes.pipeMedium.get(Materials.Polybenzimidazole) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_ULV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', - OrePrefixes.plate.get(Materials.WroughtIron) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_LV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_MV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_HV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', - OrePrefixes.plate.get(Materials.StainlessSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_EV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Titanium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_IV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', - OrePrefixes.plate.get(Materials.TungstenSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_LuV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', - OrePrefixes.plate.get(ExternalMaterials.getRhodiumPlatedPalladium()) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_ZPM.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Iridium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_UV.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Osmium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_MAX.get(1L), - bits, - new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', - OrePrefixes.plate.get(Materials.Neutronium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_BronzePlatedBricks.get(1L), - bits, - new Object[] { "PhP", "PBP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Bronze), 'B', - new ItemStack(Blocks.brick_block, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', - OrePrefixes.frameGt.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_StableTitanium.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', - OrePrefixes.frameGt.get(Materials.Titanium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_HeatProof.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Invar), 'F', - OrePrefixes.frameGt.get(Materials.Invar) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_FrostProof.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Aluminium), 'F', - OrePrefixes.frameGt.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_CleanStainlessSteel.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'F', - OrePrefixes.frameGt.get(Materials.StainlessSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_RobustTungstenSteel.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', - OrePrefixes.frameGt.get(Materials.TungstenSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_MiningOsmiridium.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Osmiridium), 'F', - OrePrefixes.frameGt.get(Materials.Osmiridium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_MiningNeutronium.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Neutronium), 'F', - OrePrefixes.frameGt.get(Materials.Neutronium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_MiningBlackPlutonium.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.BlackPlutonium), 'F', - OrePrefixes.frameGt.get(Materials.BlackPlutonium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Turbine.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Magnalium), 'F', - OrePrefixes.frameGt.get(Materials.BlueSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Turbine1.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'F', - ItemList.Casing_Turbine }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Turbine2.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', - ItemList.Casing_Turbine }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Turbine3.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', - ItemList.Casing_Turbine }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_TurbineGasAdvanced.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.HSSS), 'F', - ItemList.Casing_Turbine }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Pipe_Bronze.get(1L), - bits, - new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F', - OrePrefixes.frameGt.get(Materials.Bronze), 'I', OrePrefixes.pipeMedium.get(Materials.Bronze) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Pipe_Steel.get(1L), - bits, - new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Steel), 'F', - OrePrefixes.frameGt.get(Materials.Steel), 'I', OrePrefixes.pipeMedium.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Pipe_Titanium.get(1L), - bits, - new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', - OrePrefixes.frameGt.get(Materials.Titanium), 'I', OrePrefixes.pipeMedium.get(Materials.Titanium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Pipe_TungstenSteel.get(1L), - bits, - new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', - OrePrefixes.frameGt.get(Materials.TungstenSteel), 'I', - OrePrefixes.pipeMedium.get(Materials.TungstenSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Gearbox_Bronze.get(1L), - bits, - new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Bronze), 'F', - OrePrefixes.frameGt.get(Materials.Bronze), 'G', OrePrefixes.gearGt.get(Materials.Bronze) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Gearbox_Steel.get(1L), - bits, - new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', - OrePrefixes.frameGt.get(Materials.Steel), 'G', OrePrefixes.gearGt.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Gearbox_Titanium.get(1L), - bits, - new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', - OrePrefixes.frameGt.get(Materials.Titanium), 'G', OrePrefixes.gearGt.get(Materials.Titanium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Gearbox_TungstenSteel.get(1L), - bits, - new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', - OrePrefixes.frameGt.get(Materials.TungstenSteel), 'G', ItemList.Robot_Arm_IV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Grate.get(1L), - bits, - new Object[] { "PVP", "PFP", aTextPlateMotor, 'P', new ItemStack(Blocks.iron_bars, 1), 'F', - OrePrefixes.frameGt.get(Materials.Steel), 'M', ItemList.Electric_Motor_MV, 'V', - OrePrefixes.rotor.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Assembler.get(1L), - bits, - new Object[] { "PVP", "PFP", aTextPlateMotor, 'P', OrePrefixes.circuit.get(Materials.ZPM), 'F', - OrePrefixes.frameGt.get(Materials.TungstenSteel), 'M', ItemList.Electric_Motor_IV, 'V', - OrePrefixes.circuit.get(Materials.LuV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Firebox_Bronze.get(1L), - bits, - new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F', - OrePrefixes.frameGt.get(Materials.Bronze), 'S', OrePrefixes.stick.get(Materials.Bronze) }); - GT_ModHandler.addCraftingRecipe( - ItemList.WoodenCasing.get(1L), - bits, - new Object[] { "PSP", "PFP", "PSP", 'F', OrePrefixes.gear.get(Materials.Wood), 'P', - OrePrefixes.frameGt.get(Materials.Wood), 'S', OrePrefixes.screw.get(Materials.Wood) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Output_ULV.get(1L), - bits, - new Object[] { "ASA", "AFA", "APA", 'S', GT_ModHandler.getModItem(BuildCraftFactory.ID, "tankBlock", 1L, 0), - 'F', ItemList.Hull_ULV.get(1L), 'A', OrePrefixes.plate.get(Materials.Rubber), 'P', - OrePrefixes.ring.get(Materials.Rubber) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Input_ULV.get(1L), - bits, - new Object[] { "ASA", "AFA", "APA", 'S', GT_ModHandler.getModItem(BuildCraftFactory.ID, "tankBlock", 1L, 0), - 'F', ItemList.Hull_ULV.get(1L), 'A', OrePrefixes.plate.get(Materials.Rubber), 'P', - OrePrefixes.gear.get(Materials.Rubber) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Firebox_Steel.get(1L), - bits, - new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Steel), 'F', - OrePrefixes.frameGt.get(Materials.Steel), 'S', OrePrefixes.stick.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Firebox_Titanium.get(1L), - bits, - new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', - OrePrefixes.frameGt.get(Materials.Titanium), 'S', OrePrefixes.stick.get(Materials.Titanium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Firebox_TungstenSteel.get(1L), - bits, - new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', - OrePrefixes.frameGt.get(Materials.TungstenSteel), 'S', - OrePrefixes.stick.get(Materials.TungstenSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Stripes_A.get(1L), - bits, - new Object[] { "Y ", " M ", " B", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Stripes_B.get(1L), - bits, - new Object[] { " Y", " M ", "B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_RadioactiveHazard.get(1L), - bits, - new Object[] { " YB", " M ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_BioHazard.get(1L), - bits, - new Object[] { " Y ", " MB", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_ExplosionHazard.get(1L), - bits, - new Object[] { " Y ", " M ", " B", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_FireHazard.get(1L), - bits, - new Object[] { " Y ", " M ", " B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_AcidHazard.get(1L), - bits, - new Object[] { " Y ", " M ", "B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_MagicHazard.get(1L), - bits, - new Object[] { " Y ", "BM ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_FrostHazard.get(1L), - bits, - new Object[] { "BY ", " M ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_NoiseHazard.get(1L), - bits, - new Object[] { " ", " M ", "BY ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', - Dyes.dyeBlack }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Advanced_Iridium.get(1L), - bits, - new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Iridium), 'F', - OrePrefixes.frameGt.get(Materials.Iridium) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bricked_BlastFurnace.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "BFB", "FwF", "BFB", 'B', ItemList.Casing_Firebricks, 'F', - OreDictNames.craftingIronFurnace }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_Bronze.get(1L), - bits, - new Object[] { aTextPlate, "PhP", aTextPlate, 'P', OrePrefixes.plate.get(Materials.Bronze) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_Bronze_Bricks.get(1L), - bits, - new Object[] { aTextPlate, "PhP", "BBB", 'P', OrePrefixes.plate.get(Materials.Bronze), 'B', - new ItemStack(Blocks.brick_block, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_HP.get(1L), - bits, - new Object[] { aTextPlate, "PhP", aTextPlate, 'P', OrePrefixes.plate.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_HP_Bricks.get(1L), - bits, - new Object[] { aTextPlate, "PhP", "BBB", 'P', OrePrefixes.plate.get(Materials.WroughtIron), 'B', - new ItemStack(Blocks.brick_block, 1) }); - - // hull crafting recipes. (They can't be used for recycling as that would create an exploit loop with the - // assembler recipes.) - - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_ULV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_ULV, 'C', - OrePrefixes.cableGt01.get(Materials.Lead), 'H', OrePrefixes.plate.get(Materials.WroughtIron), 'P', - OrePrefixes.plate.get(Materials.Wood) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_LV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_LV, 'C', - OrePrefixes.cableGt01.get(Materials.Tin), 'H', OrePrefixes.plate.get(Materials.Steel), 'P', - OrePrefixes.plate.get(Materials.WroughtIron) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_MV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_MV, 'C', - OrePrefixes.cableGt01.get(Materials.Copper), 'H', OrePrefixes.plate.get(Materials.Aluminium), 'P', - OrePrefixes.plate.get(Materials.WroughtIron) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_HV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_HV, 'C', - OrePrefixes.cableGt01.get(Materials.Gold), 'H', OrePrefixes.plate.get(Materials.StainlessSteel), 'P', - OrePrefixes.plate.get(Materials.Plastic) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_EV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_EV, 'C', - OrePrefixes.cableGt01.get(Materials.Aluminium), 'H', OrePrefixes.plate.get(Materials.Titanium), 'P', - OrePrefixes.plate.get(Materials.Plastic) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_IV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_IV, 'C', - OrePrefixes.cableGt01.get(Materials.Tungsten), 'H', OrePrefixes.plate.get(Materials.TungstenSteel), 'P', - OrePrefixes.plate.get(Materials.Polytetrafluoroethylene) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_LuV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_LuV, 'C', - OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'H', - OrePrefixes.plate.get(ExternalMaterials.getRhodiumPlatedPalladium()), 'P', - OrePrefixes.plate.get(Materials.Polytetrafluoroethylene) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_ZPM.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_ZPM, 'C', - OrePrefixes.cableGt01.get(Materials.Naquadah), 'H', OrePrefixes.plate.get(Materials.Iridium), 'P', - OrePrefixes.plate.get(Materials.Polybenzimidazole) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_UV.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_UV, 'C', - OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), 'H', OrePrefixes.plate.get(Materials.Osmium), 'P', - OrePrefixes.plate.get(Materials.Polybenzimidazole) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hull_MAX.get(1L), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_MAX, 'C', - OrePrefixes.wireGt04.get(Materials.SuperconductorUV), 'H', OrePrefixes.plate.get(Materials.Neutronium), - 'P', OrePrefixes.plate.get(Materials.Polybenzimidazole) }); - - // hull recycling data - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_ULV.get(1L), - ItemList.Casing_ULV.get(1), - OrePrefixes.cableGt01.get(Materials.Lead), - OrePrefixes.cableGt01.get(Materials.Lead)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_LV.get(1L), - ItemList.Casing_LV.get(1), - OrePrefixes.cableGt01.get(Materials.Tin), - OrePrefixes.cableGt01.get(Materials.Tin)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_MV.get(1L), - ItemList.Casing_MV.get(1), - OrePrefixes.cableGt01.get(Materials.AnyCopper), - OrePrefixes.cableGt01.get(Materials.AnyCopper)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_HV.get(1L), - ItemList.Casing_HV.get(1), - OrePrefixes.cableGt01.get(Materials.Gold), - OrePrefixes.cableGt01.get(Materials.Gold)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_EV.get(1L), - ItemList.Casing_EV.get(1), - OrePrefixes.cableGt01.get(Materials.Aluminium), - OrePrefixes.cableGt01.get(Materials.Aluminium)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_IV.get(1L), - ItemList.Casing_IV.get(1), - OrePrefixes.cableGt01.get(Materials.Tungsten), - OrePrefixes.cableGt01.get(Materials.Tungsten)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_LuV.get(1L), - ItemList.Casing_LuV.get(1), - OrePrefixes.cableGt01.get(Materials.VanadiumGallium), - OrePrefixes.cableGt01.get(Materials.VanadiumGallium)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_ZPM.get(1L), - ItemList.Casing_ZPM.get(1), - OrePrefixes.cableGt02.get(Materials.Naquadah), - OrePrefixes.cableGt02.get(Materials.Naquadah)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_UV.get(1L), - ItemList.Casing_UV.get(1), - OrePrefixes.cableGt04.get(Materials.NaquadahAlloy), - OrePrefixes.cableGt04.get(Materials.NaquadahAlloy)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hull_MAX.get(1L), - ItemList.Casing_MAX.get(1), - OrePrefixes.cableGt04.get(Materials.SuperconductorUV), - OrePrefixes.cableGt04.get(Materials.SuperconductorUV)); - - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_LV_ULV.get(1L), - bitsd, - new Object[] { " BB", "CM ", " BB", 'M', ItemList.Hull_ULV, 'C', OrePrefixes.cableGt01.get(Materials.Tin), - 'B', OrePrefixes.cableGt01.get(Materials.Lead) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_MV_LV.get(1L), - bitsd, - new Object[] { " BB", "CM ", " BB", 'M', ItemList.Hull_LV, 'C', - OrePrefixes.cableGt01.get(Materials.AnyCopper), 'B', OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_HV_MV.get(1L), - bitsd, - new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_MV, 'C', OrePrefixes.cableGt01.get(Materials.Gold), - 'B', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'K', - OrePrefixes.componentCircuit.get(Materials.Inductor) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_EV_HV.get(1L), - bitsd, - new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_HV, 'C', - OrePrefixes.cableGt01.get(Materials.Aluminium), 'B', OrePrefixes.cableGt01.get(Materials.Gold), 'K', - ItemList.Circuit_Chip_ULPIC }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_IV_EV.get(1L), - bitsd, - new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_EV, 'C', - OrePrefixes.cableGt01.get(Materials.Tungsten), 'B', OrePrefixes.cableGt01.get(Materials.Aluminium), 'K', - ItemList.Circuit_Chip_LPIC }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_LuV_IV.get(1L), - bitsd, - new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_IV, 'C', - OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'B', - OrePrefixes.cableGt01.get(Materials.Tungsten), 'K', ItemList.Circuit_Chip_PIC }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_ZPM_LuV.get(1L), - bitsd, - new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_LuV, 'C', - OrePrefixes.cableGt01.get(Materials.Naquadah), 'B', - OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'K', ItemList.Circuit_Chip_HPIC }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_UV_ZPM.get(1L), - bitsd, - new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_ZPM, 'C', - OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), 'B', OrePrefixes.cableGt01.get(Materials.Naquadah), - 'K', ItemList.Circuit_Chip_UHPIC }); - GT_ModHandler.addCraftingRecipe( - ItemList.Transformer_MAX_UV.get(1L), - bitsd, - new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_UV, 'C', - OrePrefixes.wireGt01.get(Materials.Bedrockium), 'B', OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), - 'K', ItemList.Circuit_Chip_NPIC }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Dynamo_ULV.get(1L), - bitsd, - new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_ULV, 'S', OrePrefixes.spring.get(Materials.Lead), - 'X', OrePrefixes.circuit.get(Materials.ULV), 'O', ItemList.ULV_Coil, 'L', - OrePrefixes.cell.get(Materials.Lubricant), 'P', OrePrefixes.rotor.get(Materials.Lead) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Dynamo_LV.get(1L), - bitsd, - new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_LV, 'S', OrePrefixes.spring.get(Materials.Tin), 'X', - OrePrefixes.circuit.get(Materials.LV), 'O', ItemList.LV_Coil, 'L', - OrePrefixes.cell.get(Materials.Lubricant), 'P', ItemList.Electric_Pump_LV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Dynamo_MV.get(1L), - bitsd, - new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_MV, 'S', OrePrefixes.spring.get(Materials.Copper), - 'X', ItemList.Circuit_Chip_ULPIC, 'O', ItemList.MV_Coil, 'L', OrePrefixes.cell.get(Materials.Lubricant), - 'P', ItemList.Electric_Pump_MV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Energy_ULV.get(1L), - bitsd, - new Object[] { "COL", "XMP", "COL", 'M', ItemList.Hull_ULV, 'C', OrePrefixes.cableGt01.get(Materials.Lead), - 'X', OrePrefixes.circuit.get(Materials.ULV), 'O', ItemList.ULV_Coil, 'L', - OrePrefixes.cell.get(Materials.Lubricant), 'P', OrePrefixes.rotor.get(Materials.Lead) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Energy_LV.get(1L), - bitsd, - new Object[] { "COL", "XMP", "COL", 'M', ItemList.Hull_LV, 'C', OrePrefixes.cableGt01.get(Materials.Tin), - 'X', OrePrefixes.circuit.get(Materials.LV), 'O', ItemList.LV_Coil, 'L', - OrePrefixes.cell.get(Materials.Lubricant), 'P', ItemList.Electric_Pump_LV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Energy_MV.get(1L), - bitsd, - new Object[] { "XOL", "CMP", "XOL", 'M', ItemList.Hull_MV, 'C', OrePrefixes.cableGt01.get(Materials.Copper), - 'X', ItemList.Circuit_Chip_ULPIC, 'O', ItemList.MV_Coil, 'L', OrePrefixes.cell.get(Materials.Lubricant), - 'P', ItemList.Electric_Pump_MV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Maintenance.get(1L), - bitsd, - new Object[] { "dwx", "hMc", "fsr", 'M', ItemList.Hull_LV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_DataAccess_EV.get(1L), - bitsd, - new Object[] { "COC", "OMO", "COC", 'M', ItemList.Hull_EV, 'O', ItemList.Tool_DataStick, 'C', - OrePrefixes.circuit.get(Materials.IV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_DataAccess_LuV.get(1L), - bitsd, - new Object[] { "COC", "OMO", "COC", 'M', ItemList.Hull_LuV, 'O', ItemList.Tool_DataOrb, 'C', - OrePrefixes.circuit.get(Materials.ZPM) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_DataAccess_UV.get(1L), - bitsd, - new Object[] { "CRC", "OMO", "CRC", 'M', ItemList.Hull_UV, 'O', ItemList.Tool_DataOrb, 'C', - OrePrefixes.circuit.get(Materials.UHV), 'R', ItemList.Robot_Arm_UV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_AutoMaintenance.get(1L), - bitsd, - new Object[] { "CHC", "AMA", "CHC", 'M', ItemList.Hull_LuV, 'H', ItemList.Hatch_Maintenance, 'A', - ItemList.Robot_Arm_LuV, 'C', OrePrefixes.circuit.get(Materials.ZPM) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Muffler_LV.get(1L), - bitsd, - new Object[] { "MX ", "PR ", 'M', ItemList.Hull_LV, 'P', OrePrefixes.pipeMedium.get(Materials.Bronze), 'R', - OrePrefixes.rotor.get(Materials.Bronze), 'X', ItemList.Electric_Motor_LV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_Muffler_MV.get(1L), - bitsd, - new Object[] { "MX ", "PR ", 'M', ItemList.Hull_MV, 'P', OrePrefixes.pipeMedium.get(Materials.Steel), 'R', - OrePrefixes.rotor.get(Materials.Steel), 'X', ItemList.Electric_Motor_MV }); - - // recycling data for the other mufflers, recipes are in assembler - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hatch_Muffler_HV.get(1L), - ItemList.Hull_HV.get(1), - OrePrefixes.pipeLarge.get(Materials.StainlessSteel), - OrePrefixes.rotor.get(Materials.StainlessSteel), - ItemList.Electric_Motor_HV.get(1)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hatch_Muffler_EV.get(1L), - ItemList.Hull_EV.get(1), - OrePrefixes.pipeLarge.get(Materials.Titanium), - OrePrefixes.rotor.get(Materials.Titanium), - ItemList.Electric_Motor_EV.get(1)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hatch_Muffler_IV.get(1L), - ItemList.Hull_IV.get(1), - OrePrefixes.pipeLarge.get(Materials.TungstenSteel), - OrePrefixes.rotor.get(Materials.TungstenSteel), - ItemList.Electric_Motor_IV.get(1)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hatch_Muffler_LuV.get(1L), - ItemList.Hull_LuV.get(1), - OrePrefixes.pipeLarge.get(Materials.Enderium), - OrePrefixes.rotor.get(Materials.Enderium), - ItemList.Electric_Motor_LuV.get(1)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hatch_Muffler_ZPM.get(1L), - ItemList.Hull_ZPM.get(1), - OrePrefixes.pipeLarge.get(Materials.Naquadah), - OrePrefixes.rotor.get(Materials.NaquadahAlloy), - ItemList.Electric_Motor_ZPM.get(1)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hatch_Muffler_UV.get(1L), - ItemList.Hull_UV.get(1), - OrePrefixes.pipeLarge.get(Materials.NetherStar), - OrePrefixes.rotor.get(Materials.Neutronium), - ItemList.Electric_Motor_UV.get(1)); - GT_OreDictUnificator.addItemDataFromInputs( - ItemList.Hatch_Muffler_MAX.get(1L), - ItemList.Hull_MAX.get(1), - OrePrefixes.pipeLarge.get(Materials.MysteriousCrystal), - OrePrefixes.rotor.get(Materials.CosmicNeutronium), - ItemList.Electric_Motor_UHV.get(1)); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_Boiler.get(1L), - bitsd, - new Object[] { aTextPlate, "PwP", "BFB", 'F', OreDictNames.craftingIronFurnace, 'P', - OrePrefixes.plate.get(Materials.Bronze), 'B', new ItemStack(Blocks.brick_block, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Steel_Boiler.get(1L), - bitsd, - new Object[] { aTextPlate, "PwP", "BFB", 'F', OreDictNames.craftingIronFurnace, 'P', - OrePrefixes.plate.get(Materials.Steel), 'B', new ItemStack(Blocks.brick_block, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Steel_Boiler_Lava.get(1L), - bitsd, - new Object[] { aTextPlate, "PTP", aTextPlateMotor, 'M', ItemList.Hull_HP, 'P', - OrePrefixes.plate.get(Materials.Steel), 'T', - GT_ModHandler.getModItem(BuildCraftFactory.ID, "tankBlock", 1L, 0) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_Boiler_Solar.get(1L), - bitsd, - new Object[] { "GGG", "SSS", aTextPlateMotor, 'M', ItemList.Hull_Bronze_Bricks, 'P', - OrePrefixes.pipeSmall.get(Materials.Bronze), 'S', OrePrefixes.plateDouble.get(Materials.Silver), 'G', - new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HP_Solar.get(1L), - bitsd, - new Object[] { "GGG", "SSS", aTextPlateMotor, 'M', ItemList.Hull_HP_Bricks, 'P', - OrePrefixes.pipeSmall.get(Materials.Steel), 'S', OrePrefixes.plateTriple.get(Materials.Silver), 'G', - GT_ModHandler.getModItem(IndustrialCraft2.ID, "blockAlloyGlass", 1L) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_Furnace.get(1L), - bitsd, - new Object[] { "XXX", "XMX", "XFX", 'M', ItemList.Hull_Bronze_Bricks, 'X', - OrePrefixes.pipeSmall.get(Materials.Bronze), 'F', OreDictNames.craftingFurnace }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HP_Furnace.get(1L), - bitsd, - new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Furnace, 'X', - OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), - 'S', OrePrefixes.plate.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_Macerator.get(1L), - bitsd, - new Object[] { "DXD", "XMX", "PXP", 'M', ItemList.Hull_Bronze, 'X', - OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'D', - OrePrefixes.gem.get(Materials.Diamond) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HP_Macerator.get(1L), - bitsd, - new Object[] { "PSP", "XMX", "PPP", 'M', ItemList.Machine_Bronze_Macerator, 'X', - OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), - 'S', OrePrefixes.plate.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_Extractor.get(1L), - bitsd, - new Object[] { "XXX", "PMG", "XXX", 'M', ItemList.Hull_Bronze, 'X', - OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'G', - new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HP_Extractor.get(1L), - bitsd, - new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Extractor, 'X', - OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), - 'S', OrePrefixes.plate.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_Hammer.get(1L), - bitsd, - new Object[] { "XPX", "XMX", "XAX", 'M', ItemList.Hull_Bronze, 'X', - OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'A', - OreDictNames.craftingAnvil }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HP_Hammer.get(1L), - bitsd, - new Object[] { "PSP", "XMX", "PPP", 'M', ItemList.Machine_Bronze_Hammer, 'X', - OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), - 'S', OrePrefixes.plate.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_Compressor.get(1L), - bitsd, - new Object[] { "XXX", aTextPlateMotor, "XXX", 'M', ItemList.Hull_Bronze, 'X', - OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HP_Compressor.get(1L), - bitsd, - new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Compressor, 'X', - OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), - 'S', OrePrefixes.plate.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Bronze_AlloySmelter.get(1L), - bitsd, - new Object[] { "XXX", "FMF", "XXX", 'M', ItemList.Hull_Bronze_Bricks, 'X', - OrePrefixes.pipeSmall.get(Materials.Bronze), 'F', OreDictNames.craftingFurnace }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HP_AlloySmelter.get(1L), - bitsd, - new Object[] { "PSP", "PMP", "PXP", 'M', ItemList.Machine_Bronze_AlloySmelter, 'X', - OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), - 'S', OrePrefixes.plate.get(Materials.Steel) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_ULV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', - OrePrefixes.wireGt01.get(Materials.Lead), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_LV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', - OrePrefixes.wireGt01.get(Materials.Tin), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_MV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', - OrePrefixes.wireGt01.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_HV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', - OrePrefixes.wireGt01.get(Materials.Gold), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_EV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', - OrePrefixes.wireGt01.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_IV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', - OrePrefixes.wireGt01.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_LuV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', - OrePrefixes.wireGt01.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_ZPM.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', - OrePrefixes.wireGt01.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_UV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', - OrePrefixes.wireGt01.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_1by1_UHV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', - OrePrefixes.wireGt01.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_ULV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', - OrePrefixes.wireGt04.get(Materials.Lead), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_LV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', - OrePrefixes.wireGt04.get(Materials.Tin), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_MV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', - OrePrefixes.wireGt04.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_HV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', - OrePrefixes.wireGt04.get(Materials.Gold), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_EV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', - OrePrefixes.wireGt04.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_IV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', - OrePrefixes.wireGt04.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_LuV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', - OrePrefixes.wireGt04.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_ZPM.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', - OrePrefixes.wireGt04.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_UV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', - OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_2by2_UHV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', - OrePrefixes.wireGt04.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_ULV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', - OrePrefixes.wireGt08.get(Materials.Lead), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_LV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', - OrePrefixes.wireGt08.get(Materials.Tin), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_MV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', - OrePrefixes.wireGt08.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_HV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', - OrePrefixes.wireGt08.get(Materials.Gold), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_EV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', - OrePrefixes.wireGt08.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_IV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', - OrePrefixes.wireGt08.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_LuV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', - OrePrefixes.wireGt08.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_ZPM.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', - OrePrefixes.wireGt08.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_UV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', - OrePrefixes.wireGt08.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_3by3_UHV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', - OrePrefixes.wireGt08.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_ULV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', - OrePrefixes.wireGt16.get(Materials.Lead), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_LV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', - OrePrefixes.wireGt16.get(Materials.Tin), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_MV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', - OrePrefixes.wireGt16.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_HV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', - OrePrefixes.wireGt16.get(Materials.Gold), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_EV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', - OrePrefixes.wireGt16.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_IV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', - OrePrefixes.wireGt16.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_LuV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', - OrePrefixes.wireGt16.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_ZPM.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', - OrePrefixes.wireGt16.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_UV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', - OrePrefixes.wireGt16.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Buffer_4by4_UHV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', - OrePrefixes.wireGt16.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_ULV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_ULV, 'W', - OrePrefixes.wireGt16.get(Materials.Lead), 'T', OreDictNames.craftingChest, 'B', - ItemList.Battery_RE_ULV_Tantalum, 'C', OrePrefixes.circuit.get(Materials.ULV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_LV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_LV, 'W', - OrePrefixes.wireGt16.get(Materials.Tin), 'T', OreDictNames.craftingChest, 'B', - ItemList.Battery_RE_LV_Lithium, 'C', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_MV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_MV, 'W', - OrePrefixes.wireGt16.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest, 'B', - ItemList.Battery_RE_MV_Lithium, 'C', OrePrefixes.circuit.get(Materials.MV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_HV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_HV, 'W', - OrePrefixes.wireGt16.get(Materials.Gold), 'T', OreDictNames.craftingChest, 'B', - ItemList.Battery_RE_HV_Lithium, 'C', OrePrefixes.circuit.get(Materials.HV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_EV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_EV, 'W', - OrePrefixes.wireGt16.get(Materials.Aluminium), 'T', OreDictNames.craftingChest, 'B', - OrePrefixes.battery.get(Materials.EV), 'C', OrePrefixes.circuit.get(Materials.EV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_IV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_IV, 'W', - OrePrefixes.wireGt16.get(Materials.Tungsten), 'T', OreDictNames.craftingChest, 'B', - OrePrefixes.battery.get(Materials.IV), 'C', OrePrefixes.circuit.get(Materials.IV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_LuV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_LuV, 'W', - OrePrefixes.wireGt16.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest, 'B', - OrePrefixes.battery.get(Materials.LuV), 'C', OrePrefixes.circuit.get(Materials.LuV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_ZPM.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_ZPM, 'W', - OrePrefixes.wireGt16.get(Materials.Naquadah), 'T', OreDictNames.craftingChest, 'B', - OrePrefixes.battery.get(Materials.ZPM), 'C', OrePrefixes.circuit.get(Materials.ZPM) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_UV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_UV, 'W', - OrePrefixes.wireGt16.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest, 'B', ItemList.ZPM2, - 'C', OrePrefixes.circuit.get(Materials.UV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Battery_Charger_4by4_UHV.get(1L), - bitsd, - new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_MAX, 'W', - OrePrefixes.wireGt16.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest, 'B', - ItemList.ZPM2, 'C', OrePrefixes.circuit.get(Materials.UHV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_ULV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_ULV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_LV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_LV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_MV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_MV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_HV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_HV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_EV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_EV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_IV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_IV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_LuV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_LuV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_ZPM.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_ZPM, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_UV.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_UV, 'T', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Locker_MAX.get(1L), - bitsd, - new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_UHV, 'T', OreDictNames.craftingChest }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LV_Scanner.get(1L), - bitsd, - new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_LV, 'T', ItemList.Emitter_LV, 'R', - ItemList.Sensor_LV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_MV_Scanner.get(1L), - bitsd, - new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_MV, 'T', ItemList.Emitter_MV, 'R', - ItemList.Sensor_MV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_Scanner.get(1L), - bitsd, - new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_HV, 'T', ItemList.Emitter_HV, 'R', - ItemList.Sensor_HV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_EV_Scanner.get(1L), - bitsd, - new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_EV, 'T', ItemList.Emitter_EV, 'R', - ItemList.Sensor_EV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', - OrePrefixes.cableGt01.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_IV_Scanner.get(1L), - bitsd, - new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_IV, 'T', ItemList.Emitter_IV, 'R', - ItemList.Sensor_IV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', - OrePrefixes.cableGt01.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LV_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_LV, 'R', ItemList.Robot_Arm_LV, 'V', - ItemList.Conveyor_Module_LV, 'C', OrePrefixes.circuit.get(Materials.LV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin), 'B', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_MV_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_MV, 'R', ItemList.Robot_Arm_MV, 'V', - ItemList.Conveyor_Module_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt01.get(Materials.AnyCopper), 'B', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_HV, 'R', ItemList.Robot_Arm_HV, 'V', - ItemList.Conveyor_Module_HV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold), 'B', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_EV_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_EV, 'R', ItemList.Robot_Arm_EV, 'V', - ItemList.Conveyor_Module_EV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', - OrePrefixes.cableGt01.get(Materials.Aluminium), 'B', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_IV_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_IV, 'R', ItemList.Robot_Arm_IV, 'V', - ItemList.Conveyor_Module_IV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', - OrePrefixes.cableGt01.get(Materials.Tungsten), 'B', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LuV_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_LuV, 'R', ItemList.Robot_Arm_LuV, 'V', - ItemList.Conveyor_Module_LuV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', - OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'B', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_ZPM_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_ZPM, 'R', ItemList.Robot_Arm_ZPM, 'V', - ItemList.Conveyor_Module_ZPM, 'C', OrePrefixes.circuit.get(Materials.ZPM), 'W', - OrePrefixes.cableGt01.get(Materials.Naquadah), 'B', OreDictNames.craftingChest }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_UV_Boxinator.get(1L), - bitsd, - new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_UV, 'R', ItemList.Robot_Arm_UV, 'V', - ItemList.Conveyor_Module_UV, 'C', OrePrefixes.circuit.get(Materials.UV), 'W', - OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), 'B', OreDictNames.craftingChest }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LV_RockBreaker.get(1L), - bitsd, - new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_LV, 'D', OreDictNames.craftingGrinder, 'E', - ItemList.Electric_Motor_LV, 'P', ItemList.Electric_Piston_LV, 'C', - OrePrefixes.circuit.get(Materials.LV), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'G', - new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_MV_RockBreaker.get(1L), - bitsd, - new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_MV, 'D', OreDictNames.craftingGrinder, 'E', - ItemList.Electric_Motor_MV, 'P', ItemList.Electric_Piston_MV, 'C', - OrePrefixes.circuit.get(Materials.MV), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', - new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_RockBreaker.get(1L), - bitsd, - new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_HV, 'D', OreDictNames.craftingGrinder, 'E', - ItemList.Electric_Motor_HV, 'P', ItemList.Electric_Piston_HV, 'C', - OrePrefixes.circuit.get(Materials.HV), 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'G', - new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_EV_RockBreaker.get(1L), - bitsd, - new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_EV, 'D', OreDictNames.craftingGrinder, 'E', - ItemList.Electric_Motor_EV, 'P', ItemList.Electric_Piston_EV, 'C', - OrePrefixes.circuit.get(Materials.EV), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium), 'G', - new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_IV_RockBreaker.get(1L), - bitsd, - new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_IV, 'D', OreDictNames.craftingGrinder, 'E', - ItemList.Electric_Motor_IV, 'P', ItemList.Electric_Piston_IV, 'C', - OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt01.get(Materials.Tungsten), 'G', - new ItemStack(Blocks.glass, 1) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LV_Massfab.get(1L), - bitsd, - new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_LV, 'F', ItemList.Field_Generator_LV, 'C', - OrePrefixes.circuit.get(Materials.MV), 'W', OrePrefixes.cableGt04.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_MV_Massfab.get(1L), - bitsd, - new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_MV, 'F', ItemList.Field_Generator_MV, 'C', - OrePrefixes.circuit.get(Materials.HV), 'W', OrePrefixes.cableGt04.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_Massfab.get(1L), - bitsd, - new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_HV, 'F', ItemList.Field_Generator_HV, 'C', - OrePrefixes.circuit.get(Materials.EV), 'W', OrePrefixes.cableGt04.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_EV_Massfab.get(1L), - bitsd, - new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_EV, 'F', ItemList.Field_Generator_EV, 'C', - OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt04.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_IV_Massfab.get(1L), - bitsd, - new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_IV, 'F', ItemList.Field_Generator_IV, 'C', - OrePrefixes.circuit.get(Materials.LuV), 'W', OrePrefixes.cableGt04.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LV_Replicator.get(1L), - bitsd, - new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_LV, 'F', - ItemList.Field_Generator_LV, 'E', ItemList.Emitter_LV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt04.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_MV_Replicator.get(1L), - bitsd, - new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_MV, 'F', - ItemList.Field_Generator_MV, 'E', ItemList.Emitter_MV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt04.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_Replicator.get(1L), - bitsd, - new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_HV, 'F', - ItemList.Field_Generator_HV, 'E', ItemList.Emitter_HV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', - OrePrefixes.cableGt04.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_EV_Replicator.get(1L), - bitsd, - new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_EV, 'F', - ItemList.Field_Generator_EV, 'E', ItemList.Emitter_EV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', - OrePrefixes.cableGt04.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_IV_Replicator.get(1L), - bitsd, - new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_IV, 'F', - ItemList.Field_Generator_IV, 'E', ItemList.Emitter_IV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', - OrePrefixes.cableGt04.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LV_Brewery.get(1L), - bitsd, - new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Pump_LV, 'B', - new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin), 'G', new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_MV_Brewery.get(1L), - bitsd, - new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Pump_MV, 'B', - new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_Brewery.get(1L), - bitsd, - new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Pump_HV, 'B', - new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold), 'G', new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_EV_Brewery.get(1L), - bitsd, - new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Pump_EV, 'B', - new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.EV), 'W', - OrePrefixes.cableGt01.get(Materials.Aluminium), 'G', new ItemStack(Blocks.glass, 1) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_IV_Brewery.get(1L), - bitsd, - new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Pump_IV, 'B', - new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.IV), 'W', - OrePrefixes.cableGt01.get(Materials.Tungsten), 'G', new ItemStack(Blocks.glass, 1) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_LV_Miner.get(1L), - bitsd, - new Object[] { "EEE", aTextWireHull, "CSC", 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'C', - OrePrefixes.circuit.get(Materials.LV), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'S', - ItemList.Sensor_LV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_MV_Miner.get(1L), - bitsd, - new Object[] { "PEP", aTextWireHull, "CSC", 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'P', - ItemList.Electric_Piston_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt02.get(Materials.Copper), 'S', ItemList.Sensor_MV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_Miner.get(1L), - bitsd, - new Object[] { "RPR", aTextWireHull, "CSC", 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'P', - ItemList.Electric_Piston_HV, 'R', ItemList.Robot_Arm_HV, 'C', OrePrefixes.circuit.get(Materials.HV), - 'W', OrePrefixes.cableGt04.get(Materials.Gold), 'S', ItemList.Sensor_HV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_BlastFurnace.get(1L), - bitsd, - new Object[] { "FFF", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_HeatProof, 'F', - OreDictNames.craftingIronFurnace, 'C', OrePrefixes.circuit.get(Materials.LV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_VacuumFreezer.get(1L), - bitsd, - new Object[] { aTextPlate, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_FrostProof, 'P', - ItemList.Electric_Pump_HV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_ImplosionCompressor.get(1L), - bitsd, - new Object[] { "OOO", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_SolidSteel, 'O', - Ic2Items.reinforcedStone, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_Furnace.get(1L), - bitsd, - new Object[] { "FFF", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_HeatProof, 'F', - OreDictNames.craftingIronFurnace, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.AnnealedCopper) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_LargeBoiler_Bronze.get(1L), - bitsd, - new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Bronze, 'C', - OrePrefixes.circuit.get(Materials.MV), 'W', OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_LargeBoiler_Steel.get(1L), - bitsd, - new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Steel, 'C', - OrePrefixes.circuit.get(Materials.HV), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_LargeBoiler_Titanium.get(1L), - bitsd, - new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Titanium, 'C', - OrePrefixes.circuit.get(Materials.EV), 'W', OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_LargeBoiler_TungstenSteel.get(1L), - bitsd, - new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_TungstenSteel, - 'C', OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Diesel_LV.get(1L), - bitsd, - new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Piston_LV, 'E', - ItemList.Electric_Motor_LV, 'C', OrePrefixes.circuit.get(Materials.LV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin), 'G', OrePrefixes.gearGt.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Diesel_MV.get(1L), - bitsd, - new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Piston_MV, 'E', - ItemList.Electric_Motor_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', OrePrefixes.gearGt.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Diesel_HV.get(1L), - bitsd, - new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Piston_HV, 'E', - ItemList.Electric_Motor_HV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold), 'G', OrePrefixes.gearGt.get(Materials.StainlessSteel) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Gas_Turbine_LV.get(1L), - bitsd, - new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'R', - OrePrefixes.rotor.get(Materials.Tin), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Gas_Turbine_MV.get(1L), - bitsd, - new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'R', - OrePrefixes.rotor.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt01.get(Materials.AnyCopper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Gas_Turbine_HV.get(1L), - bitsd, - new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'R', - OrePrefixes.rotor.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Gas_Turbine_EV.get(1L), - bitsd, - new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_EV, 'E', ItemList.Electric_Motor_EV, 'R', - OrePrefixes.rotor.get(Materials.Titanium), 'C', OrePrefixes.circuit.get(Materials.EV), 'W', - OrePrefixes.cableGt01.get(Materials.Aluminium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Gas_Turbine_IV.get(1L), - bitsd, - new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_IV, 'E', ItemList.Electric_Motor_IV, 'R', - OrePrefixes.rotor.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.IV), 'W', - OrePrefixes.cableGt01.get(Materials.Tungsten) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Steam_Turbine_LV.get(1L), - bitsd, - new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'R', - OrePrefixes.rotor.get(Materials.Tin), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', - OrePrefixes.cableGt01.get(Materials.Tin), 'P', OrePrefixes.pipeMedium.get(Materials.Bronze) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Steam_Turbine_MV.get(1L), - bitsd, - new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'R', - OrePrefixes.rotor.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', - OrePrefixes.cableGt01.get(Materials.AnyCopper), 'P', OrePrefixes.pipeMedium.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Steam_Turbine_HV.get(1L), - bitsd, - new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'R', - OrePrefixes.rotor.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', - OrePrefixes.cableGt01.get(Materials.Gold), 'P', OrePrefixes.pipeMedium.get(Materials.StainlessSteel) }); - - if (!Thaumcraft.isModLoaded()) { - GT_ModHandler.addCraftingRecipe( - ItemList.MagicEnergyConverter_LV.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_LV, 'B', new ItemStack(Blocks.beacon), 'C', - OrePrefixes.circuit.get(Materials.HV), 'T', ItemList.Field_Generator_LV, 'F', - OrePrefixes.plate.get(Materials.Platinum) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MagicEnergyConverter_MV.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_MV, 'B', new ItemStack(Blocks.beacon), 'C', - OrePrefixes.circuit.get(Materials.EV), 'T', ItemList.Field_Generator_MV, 'F', - OrePrefixes.plate.get(Materials.Iridium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MagicEnergyConverter_HV.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', new ItemStack(Blocks.beacon), 'C', - OrePrefixes.circuit.get(Materials.IV), 'T', ItemList.Field_Generator_HV, 'F', - OrePrefixes.plate.get(Materials.Neutronium) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.MagicEnergyAbsorber_LV.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_LV, 'B', - ItemList.MagicEnergyConverter_LV.get(1L), 'C', OrePrefixes.circuit.get(Materials.HV), 'T', - ItemList.Field_Generator_LV, 'F', OrePrefixes.plate.get(Materials.Platinum) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MagicEnergyAbsorber_MV.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_MV, 'B', - ItemList.MagicEnergyConverter_MV.get(1L), 'C', OrePrefixes.circuit.get(Materials.EV), 'T', - ItemList.Field_Generator_MV, 'F', OrePrefixes.plate.get(Materials.Iridium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MagicEnergyAbsorber_HV.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', - ItemList.MagicEnergyConverter_MV.get(1L), 'C', OrePrefixes.circuit.get(Materials.IV), 'T', - ItemList.Field_Generator_HV, 'F', OrePrefixes.plate.get(Materials.Europium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MagicEnergyAbsorber_EV.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', - ItemList.MagicEnergyConverter_HV.get(1L), 'C', OrePrefixes.circuit.get(Materials.LuV), 'T', - ItemList.Field_Generator_EV, 'F', OrePrefixes.plate.get(Materials.Neutronium) }); - } - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_Fusion_Coil.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CTC", 'M', ItemList.Casing_Coil_Superconductor, 'C', - OrePrefixes.circuit.get(Materials.LuV), 'F', ItemList.Field_Generator_MV, 'T', - ItemList.Neutron_Reflector }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Plasma_EV.get(1L), - bitsd, - new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_LuV, 'F', ItemList.Field_Generator_HV, 'C', - OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt04.get(Materials.Tungsten), 'U', - OrePrefixes.stick.get(Materials.Plutonium241) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Plasma_IV.get(1L), - bitsd, - new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_ZPM, 'F', ItemList.Field_Generator_EV, 'C', - OrePrefixes.circuit.get(Materials.LuV), 'W', OrePrefixes.wireGt04.get(Materials.VanadiumGallium), 'U', - OrePrefixes.stick.get(Materials.Europium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Generator_Plasma_LuV.get(1L), - bitsd, - new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_UV, 'F', ItemList.Field_Generator_IV, 'C', - OrePrefixes.circuit.get(Materials.ZPM), 'W', OrePrefixes.wireGt04.get(Materials.Naquadah), 'U', - OrePrefixes.stick.get(Materials.Americium) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Processing_Array.get(1L), - bitsd, - new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_EV, 'B', - OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.IV), 'F', - ItemList.Robot_Arm_EV, 'T', ItemList.Energy_LapotronicOrb }); - - GT_ProcessingArrayRecipeLoader.registerDefaultGregtechMaps(); - GT_ModHandler.addCraftingRecipe( - ItemList.Distillation_Tower.get(1L), - bitsd, - new Object[] { "CBC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', - OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.EV), 'F', - ItemList.Electric_Pump_HV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.LargeSteamTurbine.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_HV, 'B', - OrePrefixes.pipeLarge.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.HV), 'P', - OrePrefixes.gearGt.get(Materials.Steel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.LargeGasTurbine.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_EV, 'B', - OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.EV), 'P', - OrePrefixes.gearGt.get(Materials.StainlessSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.LargeAdvancedGasTurbine.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_IV, 'B', - OrePrefixes.pipeLarge.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.LuV), 'P', - OrePrefixes.gearGt.get(Materials.HSSG) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Pump_LV.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_LV, 'B', - OrePrefixes.pipeLarge.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.LV), 'P', - ItemList.Electric_Pump_LV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Pump_MV.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_MV, 'B', - OrePrefixes.pipeLarge.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.MV), 'P', - ItemList.Electric_Pump_MV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Pump_HV.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_HV, 'B', - OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.HV), 'P', - ItemList.Electric_Pump_HV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Pump_EV.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_EV, 'B', - OrePrefixes.pipeLarge.get(Materials.Titanium), 'C', OrePrefixes.circuit.get(Materials.EV), 'P', - ItemList.Electric_Pump_EV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Pump_IV.get(1L), - bitsd, - new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_IV, 'B', - OrePrefixes.pipeLarge.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.IV), 'P', - ItemList.Electric_Pump_IV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_LV.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_LV, 'E', ItemList.Emitter_LV.get(1L), 'C', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_MV.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_MV, 'E', ItemList.Emitter_MV.get(1L), 'C', - OrePrefixes.circuit.get(Materials.MV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_HV.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_HV, 'E', ItemList.Emitter_HV.get(1L), 'C', - OrePrefixes.circuit.get(Materials.HV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_EV.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_EV, 'E', ItemList.Emitter_EV.get(1L), 'C', - OrePrefixes.circuit.get(Materials.EV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_IV.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_IV, 'E', ItemList.Emitter_IV.get(1L), 'C', - OrePrefixes.circuit.get(Materials.IV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_LuV.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_LuV, 'E', ItemList.Emitter_LuV.get(1L), 'C', - OrePrefixes.circuit.get(Materials.LuV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_ZPM.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_ZPM, 'E', ItemList.Emitter_ZPM.get(1L), 'C', - OrePrefixes.circuit.get(Materials.ZPM) }); - GT_ModHandler.addCraftingRecipe( - ItemList.MobRep_UV.get(1L), - bitsd, - new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_UV, 'E', ItemList.Emitter_UV.get(1L), 'C', - OrePrefixes.circuit.get(Materials.UV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_HeatExchanger.get(1L), - bitsd, - new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Pipe_Titanium, 'C', - OrePrefixes.pipeMedium.get(Materials.Titanium), 'W', ItemList.Electric_Pump_EV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Charcoal_Pile.get(1L), - bitsd, - new Object[] { "EXE", "EME", "hCw", 'M', ItemList.Hull_HP_Bricks, 'E', - OrePrefixes.plate.get(Materials.AnyBronze), 'C', new ItemStack(Items.flint_and_steel, 1), 'X', - OrePrefixes.rotor.get(Materials.Steel), }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Seismic_Prospector_Adv_LV.get(1L), - bitsd, - new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_LV, 'W', - OrePrefixes.plateDouble.get(Materials.Steel), 'E', OrePrefixes.circuit.get(Materials.LV), 'C', - ItemList.Sensor_LV, 'X', OrePrefixes.cableGt02.get(Materials.Tin) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Seismic_Prospector_Adv_MV.get(1L), - bitsd, - new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_MV, 'W', - OrePrefixes.plateDouble.get(Materials.BlackSteel), 'E', OrePrefixes.circuit.get(Materials.MV), 'C', - ItemList.Sensor_MV, 'X', OrePrefixes.cableGt02.get(Materials.Copper) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Seismic_Prospector_Adv_HV.get(1L), - bitsd, - new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_HV, 'W', - OrePrefixes.plateDouble.get(Materials.StainlessSteel), 'E', OrePrefixes.circuit.get(Materials.HV), 'C', - ItemList.Sensor_HV, 'X', OrePrefixes.cableGt04.get(Materials.Gold) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Seismic_Prospector_Adv_EV.get(1L), - bitsd, - new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_EV, 'W', - OrePrefixes.plateDouble.get(Materials.VanadiumSteel), 'E', OrePrefixes.circuit.get(Materials.EV), 'C', - ItemList.Sensor_EV, 'X', OrePrefixes.cableGt04.get(Materials.Aluminium) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.ConcreteBackfiller1.get(1L), - bitsd, - new Object[] { "WPW", "EME", "CQC", 'M', ItemList.Hull_MV, 'W', OrePrefixes.frameGt.get(Materials.Steel), - 'E', OrePrefixes.circuit.get(Materials.MV), 'C', ItemList.Electric_Motor_MV, 'P', - OrePrefixes.pipeLarge.get(Materials.Steel), 'Q', ItemList.Electric_Pump_MV }); - GT_ModHandler.addCraftingRecipe( - ItemList.ConcreteBackfiller2.get(1L), - bitsd, - new Object[] { "WPW", "EME", "CQC", 'M', ItemList.ConcreteBackfiller1, 'W', - OrePrefixes.frameGt.get(Materials.Titanium), 'E', OrePrefixes.circuit.get(Materials.EV), 'C', - ItemList.Electric_Motor_EV, 'P', OrePrefixes.pipeLarge.get(Materials.Steel), 'Q', - ItemList.Electric_Pump_EV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.PyrolyseOven.get(1L), - bitsd, - new Object[] { "WEP", "EME", "WCP", 'M', ItemList.Hull_MV, 'W', ItemList.Electric_Piston_MV, 'P', - OrePrefixes.wireGt04.get(Materials.Cupronickel), 'E', OrePrefixes.circuit.get(Materials.MV), 'C', - ItemList.Electric_Pump_MV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.OilCracker.get(1L), - bitsd, - new Object[] { aTextWireCoil, "EME", aTextWireCoil, 'M', ItemList.Hull_HV, 'W', - ItemList.Casing_Coil_Cupronickel, 'E', OrePrefixes.circuit.get(Materials.HV), 'C', - ItemList.Electric_Pump_HV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.MicroTransmitter_HV.get(1L), - bitsd, - new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_HV, 'B', ItemList.Battery_RE_HV_Lithium, - 'C', ItemList.Emitter_HV, 'G', OrePrefixes.circuit.get(Materials.HV), 'P', - ItemList.Field_Generator_HV }); - GT_ModHandler.addCraftingRecipe( - ItemList.MicroTransmitter_EV.get(1L), - bitsd, - new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_EV, 'B', - GT_ModHandler.getIC2Item("lapotronCrystal", 1L, GT_Values.W), 'C', ItemList.Emitter_EV, 'G', - OrePrefixes.circuit.get(Materials.EV), 'P', ItemList.Field_Generator_EV }); - GT_ModHandler.addCraftingRecipe( - ItemList.MicroTransmitter_IV.get(1L), - bitsd, - new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_IV, 'B', ItemList.Energy_LapotronicOrb, 'C', - ItemList.Emitter_IV, 'G', OrePrefixes.circuit.get(Materials.IV), 'P', ItemList.Field_Generator_IV }); - GT_ModHandler.addCraftingRecipe( - ItemList.MicroTransmitter_LUV.get(1L), - bitsd, - new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_LuV, 'B', ItemList.Energy_LapotronicOrb2, - 'C', ItemList.Emitter_LuV, 'G', OrePrefixes.circuit.get(Materials.LuV), 'P', - ItemList.Field_Generator_LuV }); - GT_ModHandler.addCraftingRecipe( - ItemList.MicroTransmitter_ZPM.get(1L), - bitsd, - new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_ZPM, 'B', ItemList.Energy_Module, 'C', - ItemList.Emitter_ZPM, 'G', OrePrefixes.circuit.get(Materials.ZPM), 'P', ItemList.Field_Generator_ZPM }); - GT_ModHandler.addCraftingRecipe( - ItemList.MicroTransmitter_UV.get(1L), - bitsd, - new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_UV, 'B', ItemList.Energy_Module, 'C', - ItemList.Emitter_UV, 'G', OrePrefixes.circuit.get(Materials.UV), 'P', ItemList.Field_Generator_UV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_Assemblyline.get(1L), - bitsd, - new Object[] { aTextWireCoil, "EME", aTextWireCoil, 'M', ItemList.Hull_IV, 'W', ItemList.Casing_Assembler, - 'E', OrePrefixes.circuit.get(Materials.IV), 'C', ItemList.Robot_Arm_IV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_DieselEngine.get(1L), - bitsd, - new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Piston_EV, 'E', - ItemList.Electric_Motor_EV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', - OrePrefixes.cableGt01.get(Materials.TungstenSteel), 'G', OrePrefixes.gearGt.get(Materials.Titanium) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_EngineIntake.get(4L), - bitsd, - new Object[] { "PhP", "RFR", aTextPlateWrench, 'R', OrePrefixes.pipeMedium.get(Materials.Titanium), 'F', - ItemList.Casing_StableTitanium, 'P', OrePrefixes.rotor.get(Materials.Titanium) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_ExtremeDieselEngine.get(1L), - bitsd, - new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Piston_IV, 'E', - ItemList.Electric_Motor_IV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', - OrePrefixes.cableGt01.get(Materials.HSSG), 'G', OrePrefixes.gearGt.get(Materials.TungstenSteel) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Casing_ExtremeEngineIntake.get(4L), - bitsd, - new Object[] { "PhP", "RFR", aTextPlateWrench, 'R', OrePrefixes.pipeMedium.get(Materials.TungstenSteel), - 'F', ItemList.Casing_RobustTungstenSteel, 'P', OrePrefixes.rotor.get(Materials.TungstenSteel) }); - - // If Cleanroom is enabled, add a recipe, else hide from NEI. - if (GT_Mod.gregtechproxy.mEnableCleanroom) { - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_Cleanroom.get(1L), - bitsd, - new Object[] { "FFF", "RHR", "MCM", 'H', ItemList.Hull_HV, 'F', ItemList.Component_Filter, 'R', - OrePrefixes.rotor.get(Materials.StainlessSteel), 'M', ItemList.Electric_Motor_HV, 'C', - OrePrefixes.circuit.get(Materials.HV) }); - } else { - if (NotEnoughItems.isModLoaded()) { - API.hideItem(ItemList.Machine_Multi_Cleanroom.get(1L)); - } - } - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_HV_LightningRod.get(1L), - bitsd, - new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_LuV, 'L', ItemList.Energy_LapotronicOrb, 'T', - ItemList.Transformer_ZPM_LuV }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_EV_LightningRod.get(1L), - bitsd, - new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_ZPM, 'L', ItemList.Energy_LapotronicOrb2, 'T', - ItemList.Transformer_UV_ZPM }); - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_IV_LightningRod.get(1L), - bitsd, - new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_UV, 'L', ItemList.ZPM2, 'T', - ItemList.Transformer_MAX_UV }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Machine_Multi_LargeChemicalReactor.get(1L), - bitsd, - new Object[] { "CRC", "PMP", "CBC", 'C', OrePrefixes.circuit.get(Materials.HV), 'R', - OrePrefixes.rotor.get(Materials.StainlessSteel), 'P', - OrePrefixes.pipeLarge.get(Materials.Polytetrafluoroethylene), 'M', ItemList.Electric_Motor_HV, 'B', - ItemList.Hull_HV }); - - // Add Drone down link hatch - GT_ModHandler.addCraftingRecipe( - ItemList.Hatch_DroneDownLink.get(1L), - bits, - new Object[] { " S ", "CMC", "RRR", 'M', ItemList.Hatch_Maintenance, 'S', ItemList.Sensor_IV, 'R', - new ItemStack(GregTech_API.sBlockReinforced, 1, 9), 'C', ItemList.Conveyor_Module_EV }); - - // And Drone Centre - GT_Values.RA.stdBuilder() - .itemInputs( - ItemList.Casing_Assembler.get(1), - ItemList.Cover_SolarPanel_HV.get(4), - ItemList.Conveyor_Module_IV.get(2), - ItemList.Robot_Arm_IV.get(2), - ItemList.Sensor_IV.get(2), - ItemList.Energy_LapotronicOrb.get(4), - ItemList.Cover_WirelessNeedsMaintainance.get(1), - GalacticraftCore.isModLoaded() ? GT_ModHandler.getModItem(GalacticraftCore.ID, "item.basicItem", 1, 19) - : ItemList.Sensor_EV.get(4)) - .itemOutputs(ItemList.Machine_Multi_DroneCentre.get(1L)) - .fluidInputs(Materials.AdvancedGlue.getFluid(8000L)) - .duration(30 * SECONDS) - .eut(TierEU.RECIPE_IV) - .addTo(assemblerRecipes); - } - - private static void registerShapelessCraftingRecipes() { - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_Stripes_A }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_Stripes_B }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_RadioactiveHazard }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_BioHazard }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_ExplosionHazard }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_FireHazard }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_AcidHazard }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_MagicHazard }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_FrostHazard }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Casing_SolidSteel.get(1L), - bits, - new Object[] { ItemList.Casing_NoiseHazard }); - - if (Forestry.isModLoaded() && Gendustry.isModLoaded()) { - /* Conversion recipes */ - // TODO: Move those recipes with the other recipes - - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.Machine_IndustrialApiary.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "IndustrialApiary", 1, 0) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_Frame.get(1), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "UpgradeFrame", 1) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_PRODUCTION.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 0) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_PLAINS.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 17) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_LIGHT.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 11) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_FLOWERING.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 2) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_WINTER.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 20) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_DRYER.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 5) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_AUTOMATION.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 14) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 4) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_HELL.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 13) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_POLLEN.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 22) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_DESERT.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 16) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_COOLER.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 7) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_LIFESPAN.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 1) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_SEAL.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 10) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_STABILIZER.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 19) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_JUNGLE.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 18) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_TERRITORY.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 3) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_OCEAN.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 21) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_SKY.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 12) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_HEATER.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 6) }); - GT_ModHandler.addShapelessCraftingRecipe( - ItemList.IndustrialApiary_Upgrade_SIEVE.get(1L), - new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 15) }); - - } - } - - private static void run4() { - long bits = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE - | GT_ModHandler.RecipeBits.REVERSIBLE - | GT_ModHandler.RecipeBits.BUFFERED; - - // high pressure fluid pipes - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.TungstenSteel, 1L), - ItemList.Electric_Pump_EV.get(1L), - GT_Utility.getIntegratedCircuit(5)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.Ultimate, 1L)) - .duration(15 * SECONDS) - .eut(TierEU.RECIPE_EV) - .addTo(assemblerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.TungstenSteel, 1L), - ItemList.Electric_Pump_IV.get(1L), - GT_Utility.getIntegratedCircuit(5)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Ultimate, 1L)) - .duration(20 * SECONDS) - .eut(4096) - .addTo(assemblerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 1L), - ItemList.Electric_Pump_IV.get(2L), - GT_Utility.getIntegratedCircuit(5)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Ultimate, 1L)) - .duration(30 * SECONDS) - .eut(TierEU.RECIPE_IV) - .addTo(assemblerRecipes); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_ULV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.ULV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_LV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_MV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.MV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_HV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.HV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_EV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.EV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_IV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.IV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_LuV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LuV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_ZPM.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.ZPM) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_UV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.UV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ChestBuffer_UHV.get(1L), - bits, - new Object[] { "CMV", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.UHV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_ULV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_LV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_MV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_HV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_EV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_IV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_LuV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_ZPM.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_UV.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Filter_MAX.get(1L), - bits, - new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_ULV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_LV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_MV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_HV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_EV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_IV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_LuV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_ZPM.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_UV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_TypeFilter_MAX.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_ULV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_ULV, 'V', ItemList.Robot_Arm_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_LV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_LV, 'V', ItemList.Robot_Arm_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_MV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_MV, 'V', ItemList.Robot_Arm_MV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_HV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_HV, 'V', ItemList.Robot_Arm_HV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_EV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_EV, 'V', ItemList.Robot_Arm_EV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_IV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_IV, 'V', ItemList.Robot_Arm_IV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_LuV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_LuV, 'V', ItemList.Robot_Arm_LuV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_ZPM.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_ZPM, 'V', ItemList.Robot_Arm_ZPM, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_UV.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_UV, 'V', ItemList.Robot_Arm_UV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_Regulator_MAX.get(1L), - bits, - new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_MAX, 'V', ItemList.Robot_Arm_UHV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_ULV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_ULV, 'V', ItemList.Conveyor_Module_LV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_LV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_LV, 'V', ItemList.Conveyor_Module_LV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_MV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_MV, 'V', ItemList.Conveyor_Module_MV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_HV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_HV, 'V', ItemList.Conveyor_Module_HV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_EV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_EV, 'V', ItemList.Conveyor_Module_EV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_IV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_IV, 'V', ItemList.Conveyor_Module_IV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_LuV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_LuV, 'V', ItemList.Conveyor_Module_LuV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_ZPM.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_UV.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_UV, 'V', ItemList.Conveyor_Module_UV, 'D', - ItemList.Tool_DataOrb }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_MAX.get(1L), - bits, - new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_UHV, 'V', ItemList.Conveyor_Module_UHV, 'D', - ItemList.Tool_DataOrb }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_ULV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_LV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_MV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_HV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_EV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_IV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_LuV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_ZPM.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_UV.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'D', - ItemList.Tool_DataStick }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_SuperBuffer_MAX.get(1L), - bits, - new Object[] { "DMV", "DDD", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'D', - ItemList.Tool_DataStick }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_ULV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_LV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_MV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_HV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_EV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_IV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_LuV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_ZPM.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_UV.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_ItemDistributor_MAX.get(1L), - bits, - new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', - OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); - - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_ULV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Robot_Arm_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_LV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Robot_Arm_LV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_MV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Robot_Arm_MV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_HV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Robot_Arm_HV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_EV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Robot_Arm_EV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_IV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Robot_Arm_IV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_LuV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Robot_Arm_LuV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_ZPM.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Robot_Arm_ZPM, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_UV.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Robot_Arm_UV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - GT_ModHandler.addCraftingRecipe( - ItemList.Automation_RecipeFilter_MAX.get(1L), - bits, - new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Robot_Arm_UHV, 'C', - OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', - OrePrefixes.circuit.get(Materials.LV) }); - } - - @Override - public void run() { - registerShapelessCraftingRecipes(); - registerShapedCraftingRecipes(); - GT_Log.out.println("GT_Mod: Recipes for MetaTileEntities."); - registerMachineTypes(); - GT_PCBFactoryMaterialLoader.load(); - run4(); - } -} diff --git a/src/main/java/gregtech/loaders/load/GT_SonictronLoader.java b/src/main/java/gregtech/loaders/load/GT_SonictronLoader.java deleted file mode 100644 index e5fb8042f7..0000000000 --- a/src/main/java/gregtech/loaders/load/GT_SonictronLoader.java +++ /dev/null @@ -1,159 +0,0 @@ -package gregtech.loaders.load; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -import gregtech.GT_Mod; -import gregtech.api.enums.SoundResource; -import gregtech.api.util.GT_Log; - -public class GT_SonictronLoader implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Loading Sonictron Sounds"); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.iron_block, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_HARP.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(25); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.gold_block, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_PLING.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(25); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.stone, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BD.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(25); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.log, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASSATTACK.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(25); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.planks, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASS.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(25); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.glass, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_HAT.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(25); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.sand, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASS.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(25); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.record_cat, 1)); - GT_Mod.gregtechproxy.mSoundNames.add("streaming."); - GT_Mod.gregtechproxy.mSoundCounts.add(12); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.tnt, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_EXPLODE.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(3); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.fire, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.FIRE_FIRE.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.flint_and_steel, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.FIRE_IGNITE.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.lava, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_LAVAPOP.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.water, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_WATER.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.water_bucket, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_SPLASH.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.lava_bucket, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_FIZZ.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.portal, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_PORTAL.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.end_portal, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_TRAVEL.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.end_portal_frame, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_TRIGGER.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.glass_pane, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_GLASS.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.ender_pearl, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_ORB.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.ender_eye, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_LEVELUP.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.stone_button, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CLICK.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.cobblestone, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_FALLBIG.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.dirt, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_FALLSMALL.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_sword, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_HURTFLESH.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.diamond_sword, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_HURT.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.bow, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BOW.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.arrow, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DRR.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.fishing_rod, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BOWHIT.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_shovel, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BREAK.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.bucket, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BREATH.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.potionitem, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DRINK.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.glass_bottle, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BURP.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems - .add(new ItemStack(Blocks.ender_chest == null ? Blocks.obsidian : Blocks.ender_chest, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CHESTOPEN.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.chest, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CHESTCLOSED.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_door, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DOOR_OPEN.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.wooden_door, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DOOR_CLOSE.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.porkchop, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_EAT.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.wool, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_CLOTH.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.grass, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_GRASS.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.gravel, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_GRAVEL.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.snow, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_SNOW.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.piston, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.TILE_PISTON_OUT.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.sticky_piston, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.TILE_PISTON_IN.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.mossy_cobblestone, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_CAVE_CAVE.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.lapis_block, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_WEATHER_RAIN.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.diamond_block, 1)); - GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_WEATHER_THUNDER.toString()); - GT_Mod.gregtechproxy.mSoundCounts.add(1); - } -} diff --git a/src/main/java/gregtech/loaders/load/MTERecipeLoader.java b/src/main/java/gregtech/loaders/load/MTERecipeLoader.java new file mode 100644 index 0000000000..3e638e7e60 --- /dev/null +++ b/src/main/java/gregtech/loaders/load/MTERecipeLoader.java @@ -0,0 +1,4386 @@ +package gregtech.loaders.load; + +import static gregtech.api.enums.Mods.BuildCraftFactory; +import static gregtech.api.enums.Mods.Forestry; +import static gregtech.api.enums.Mods.GalacticraftCore; +import static gregtech.api.enums.Mods.Gendustry; +import static gregtech.api.enums.Mods.IndustrialCraft2; +import static gregtech.api.enums.Mods.NotEnoughItems; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +import codechicken.nei.api.API; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.TierEU; +import gregtech.api.metatileentity.implementations.MTEBasicMachineWithRecipe; +import gregtech.api.util.ExternalMaterials; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.loaders.postload.PCBFactoryMaterialLoader; +import gregtech.loaders.postload.ProcessingArrayRecipeLoader; +import ic2.core.Ic2Items; + +public class MTERecipeLoader implements Runnable { + + private static final String aTextPlate = "PPP"; + private static final String aTextPlateWrench = "PwP"; + private static final String aTextPlateMotor = "PMP"; + private static final String aTextCableHull = "CMC"; + private static final String aTextWireHull = "WMW"; + private static final String aTextWireChest = "WTW"; + private static final String aTextWireCoil = "WCW"; + private static final String aTextMotorWire = "EWE"; + private static final String aTextWirePump = "WPW"; + + private static final long bits = GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE + | GTModHandler.RecipeBits.BUFFERED; + private static final long bitsd = GTModHandler.RecipeBits.DISMANTLEABLE | bits; + + private static void registerMachineTypes() { + registerAlloySmelter(); + registerArcFurnace(); + registerAutoclave(); + registerAssembler(); + registerBendingMachine(); + registerCanner(); + registerCentrifuge(); + registerCompressor(); + registerChemicalBath(); + registerChemicalReactor(); + registerCircuitAssembler(); + registerCuttingMachine(); + registerDistillery(); + registerElectricFurnace(); + registerElectrolyser(); + registerElectromagneticSeparator(); + registerExtractor(); + registerExtruder(); + registerFermenter(); + registerFluidCanner(); + registerFluidExtractor(); + registerFluidHeater(); + registerFluidSolidifier(); + registerForgeHammer(); + registerFormingPress(); + registerLathe(); + registerLaserEngraver(); + registerMacerator(); + registerMatterAmplifier(); + registerMicrowave(); + registerMixer(); + registerOreWasher(); + registerOven(); + registerPlasmaArcFurnace(); + registerPolarizer(); + registerPrinter(); + registerRecycler(); + registerSifter(); + registerSlicer(); + registerThermalCentrifuge(); + registerUnpackager(); + registerWiremill(); + } + + private static void registerAlloySmelter() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_AlloySmelter.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_AlloySmelter.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_AlloySmelter.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_AlloySmelter.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_AlloySmelter.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 5); + + } + + private static void registerArcFurnace() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_ArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_ArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_ArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_ArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_ArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) }, + 5); + + } + + private static void registerAssembler() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Assembler.get(1), + bitsd, + new Object[] { "ACA", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Assembler.get(1), + bitsd, + new Object[] { "ACA", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Assembler.get(1), + bitsd, + new Object[] { "ACA", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Assembler.get(1), + bitsd, + new Object[] { "ACA", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Assembler.get(1), + bitsd, + new Object[] { "ACA", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 5); + } + + private static void registerAutoclave() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Autoclave.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', MTEBasicMachineWithRecipe.X.PLATE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Autoclave.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', MTEBasicMachineWithRecipe.X.PLATE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Autoclave.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', MTEBasicMachineWithRecipe.X.PLATE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Autoclave.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', MTEBasicMachineWithRecipe.X.PLATE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Autoclave.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', MTEBasicMachineWithRecipe.X.PLATE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerBendingMachine() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Bender.get(1), + bitsd, + new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Bender.get(1), + bitsd, + new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Bender.get(1), + bitsd, + new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Bender.get(1), + bitsd, + new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Bender.get(1), + bitsd, + new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 5); + } + + private static void registerCanner() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Canner.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Canner.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Canner.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Canner.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Canner.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 5); + } + + private static void registerCentrifuge() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Centrifuge.get(1), + bitsd, + new Object[] { "CEC", aTextWireHull, "CEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Centrifuge.get(1), + bitsd, + new Object[] { "CEC", aTextWireHull, "CEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Centrifuge.get(1), + bitsd, + new Object[] { "CEC", aTextWireHull, "CEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Centrifuge.get(1), + bitsd, + new Object[] { "CEC", aTextWireHull, "CEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Centrifuge.get(1), + bitsd, + new Object[] { "CEC", aTextWireHull, "CEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 5); + } + + private static void registerChemicalBath() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_ChemicalBath.get(1), + bitsd, + new Object[] { "VGW", "PGV", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_ChemicalBath.get(1), + bitsd, + new Object[] { "VGW", "PGV", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_ChemicalBath.get(1), + bitsd, + new Object[] { "VGW", "PGV", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_ChemicalBath.get(1), + bitsd, + new Object[] { "VGW", "PGV", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_ChemicalBath.get(1), + bitsd, + new Object[] { "VGW", "PGV", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerChemicalReactor() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_ChemicalReactor.get(1), + bitsd, + new Object[] { "GRG", "WEW", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_ChemicalReactor.get(1), + bitsd, + new Object[] { "GRG", "WEW", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_ChemicalReactor.get(1), + bitsd, + new Object[] { "GRG", "WEW", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OrePrefixes.pipeMedium.get(Materials.Plastic) }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_ChemicalReactor.get(1), + bitsd, + new Object[] { "GRG", "WEW", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OrePrefixes.pipeLarge.get(Materials.Plastic) }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_ChemicalReactor.get(1), + bitsd, + new Object[] { "GRG", "WEW", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OrePrefixes.pipeHuge.get(Materials.Plastic) }, + 5); + } + + private static void registerCircuitAssembler() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 5); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LuV_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 6); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_ZPM_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 7); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_UV_CircuitAssembler.get(1), + bitsd, + new Object[] { "ACE", "VMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'A', MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'C', + MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'E', + MTEBasicMachineWithRecipe.X.EMITTER }, + 8); + + } + + private static void registerCompressor() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Compressor.get(1), + bitsd, + new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Compressor.get(1), + bitsd, + new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Compressor.get(1), + bitsd, + new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Compressor.get(1), + bitsd, + new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Compressor.get(1), + bitsd, + new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 5); + + } + + private static void registerCuttingMachine() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Cutter.get(1), + bitsd, + new Object[] { "WCG", "VMB", "CWE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Cutter.get(1), + bitsd, + new Object[] { "WCG", "VMB", "CWE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Cutter.get(1), + bitsd, + new Object[] { "WCG", "VMB", "CWE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Cutter.get(1), + bitsd, + new Object[] { "WCG", "VMB", "CWE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Cutter.get(1), + bitsd, + new Object[] { "WCG", "VMB", "CWE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade }, + 5); + + } + + private static void registerDistillery() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Distillery.get(1), + bitsd, + new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'B', MTEBasicMachineWithRecipe.X.PIPE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Distillery.get(1), + bitsd, + new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'B', MTEBasicMachineWithRecipe.X.PIPE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Distillery.get(1), + bitsd, + new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'B', MTEBasicMachineWithRecipe.X.PIPE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Distillery.get(1), + bitsd, + new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'B', MTEBasicMachineWithRecipe.X.PIPE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Distillery.get(1), + bitsd, + new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'B', MTEBasicMachineWithRecipe.X.PIPE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerElectricFurnace() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_E_Furnace.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_E_Furnace.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_E_Furnace.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_E_Furnace.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_E_Furnace.get(1), + bitsd, + new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 5); + + } + + private static void registerElectrolyser() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Electrolyzer.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CWC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Gold), 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Electrolyzer.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CWC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Silver), 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Electrolyzer.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CWC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Electrum), 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Electrolyzer.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CWC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Platinum), 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Electrolyzer.get(1), + bitsd, + new Object[] { "IGI", "IMI", "CWC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.HSSG), 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerElectromagneticSeparator() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_ElectromagneticSeparator.get(1), + bitsd, + new Object[] { "VWZ", "WMS", "CWZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_ElectromagneticSeparator.get(1), + bitsd, + new Object[] { "VWZ", "WMS", "CWZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_ElectromagneticSeparator.get(1), + bitsd, + new Object[] { "VWZ", "WMS", "CWZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_ElectromagneticSeparator.get(1), + bitsd, + new Object[] { "VWZ", "WMS", "CWZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_ElectromagneticSeparator.get(1), + bitsd, + new Object[] { "VWZ", "WMS", "CWZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'V', + MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 5); + + } + + private static void registerExtractor() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Extractor.get(1), + bitsd, + new Object[] { "GCG", "EMP", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Extractor.get(1), + bitsd, + new Object[] { "GCG", "EMP", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Extractor.get(1), + bitsd, + new Object[] { "GCG", "EMP", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Extractor.get(1), + bitsd, + new Object[] { "GCG", "EMP", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Extractor.get(1), + bitsd, + new Object[] { "GCG", "EMP", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerExtruder() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Extruder.get(1), + bitsd, + new Object[] { "CCE", "XMP", "CCE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'X', + MTEBasicMachineWithRecipe.X.PISTON, 'E', MTEBasicMachineWithRecipe.X.CIRCUIT, 'P', + MTEBasicMachineWithRecipe.X.PIPE, 'C', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Extruder.get(1), + bitsd, + new Object[] { "CCE", "XMP", "CCE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'X', + MTEBasicMachineWithRecipe.X.PISTON, 'E', MTEBasicMachineWithRecipe.X.CIRCUIT, 'P', + MTEBasicMachineWithRecipe.X.PIPE, 'C', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Extruder.get(1), + bitsd, + new Object[] { "CCE", "XMP", "CCE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'X', + MTEBasicMachineWithRecipe.X.PISTON, 'E', MTEBasicMachineWithRecipe.X.CIRCUIT, 'P', + MTEBasicMachineWithRecipe.X.PIPE, 'C', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Extruder.get(1), + bitsd, + new Object[] { "CCE", "XMP", "CCE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'X', + MTEBasicMachineWithRecipe.X.PISTON, 'E', MTEBasicMachineWithRecipe.X.CIRCUIT, 'P', + MTEBasicMachineWithRecipe.X.PIPE, 'C', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Extruder.get(1), + bitsd, + new Object[] { "CCE", "XMP", "CCE", 'M', MTEBasicMachineWithRecipe.X.HULL, 'X', + MTEBasicMachineWithRecipe.X.PISTON, 'E', MTEBasicMachineWithRecipe.X.CIRCUIT, 'P', + MTEBasicMachineWithRecipe.X.PIPE, 'C', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 5); + + } + + private static void registerFermenter() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Fermenter.get(1), + bitsd, + new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Fermenter.get(1), + bitsd, + new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Fermenter.get(1), + bitsd, + new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Fermenter.get(1), + bitsd, + new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Fermenter.get(1), + bitsd, + new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerFluidCanner() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_FluidCanner.get(1), + bitsd, + new Object[] { "GCG", "GMG", "WPW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_FluidCanner.get(1), + bitsd, + new Object[] { "GCG", "GMG", "WPW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_FluidCanner.get(1), + bitsd, + new Object[] { "GCG", "GMG", "WPW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_FluidCanner.get(1), + bitsd, + new Object[] { "GCG", "GMG", "WPW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_FluidCanner.get(1), + bitsd, + new Object[] { "GCG", "GMG", "WPW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerFluidExtractor() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_FluidExtractor.get(1), + bitsd, + new Object[] { "GEG", "TPT", "CMC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'T', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_FluidExtractor.get(1), + bitsd, + new Object[] { "GEG", "TPT", "CMC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'T', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_FluidExtractor.get(1), + bitsd, + new Object[] { "GEG", "TPT", "CMC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'T', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_FluidExtractor.get(1), + bitsd, + new Object[] { "GEG", "TPT", "CMC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'T', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_FluidExtractor.get(1), + bitsd, + new Object[] { "GEG", "TPT", "CMC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.PISTON, 'P', MTEBasicMachineWithRecipe.X.PUMP, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'T', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 5); + + } + + private static void registerFluidHeater() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_FluidHeater.get(1), + bitsd, + new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_FluidHeater.get(1), + bitsd, + new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_FluidHeater.get(1), + bitsd, + new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_FluidHeater.get(1), + bitsd, + new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_FluidHeater.get(1), + bitsd, + new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.GLASS }, + 5); + } + + private static void registerFluidSolidifier() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_FluidSolidifier.get(1), + bitsd, + new Object[] { "PGP", aTextWireHull, "CBC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS, 'B', + OreDictNames.craftingChest }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_FluidSolidifier.get(1), + bitsd, + new Object[] { "PGP", aTextWireHull, "CBC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS, 'B', + OreDictNames.craftingChest }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_FluidSolidifier.get(1), + bitsd, + new Object[] { "PGP", aTextWireHull, "CBC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS, 'B', + OreDictNames.craftingChest }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_FluidSolidifier.get(1), + bitsd, + new Object[] { "PGP", aTextWireHull, "CBC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS, 'B', + OreDictNames.craftingChest }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_FluidSolidifier.get(1), + bitsd, + new Object[] { "PGP", aTextWireHull, "CBC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', MTEBasicMachineWithRecipe.X.GLASS, 'B', + OreDictNames.craftingChest }, + 5); + + } + + private static void registerForgeHammer() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Hammer.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'A', + OreDictNames.craftingAnvil }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Hammer.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'A', + OreDictNames.craftingAnvil }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Hammer.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'A', + OreDictNames.craftingAnvil }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Hammer.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'A', + OreDictNames.craftingAnvil }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Hammer.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE, 'A', + OreDictNames.craftingAnvil }, + 5); + + } + + private static void registerFormingPress() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Press.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Press.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Press.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Press.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Press.get(1), + bitsd, + new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 5); + } + + private static void registerLaserEngraver() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_LaserEngraver.get(1), + bitsd, + new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.EMITTER, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_LaserEngraver.get(1), + bitsd, + new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.EMITTER, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_LaserEngraver.get(1), + bitsd, + new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.EMITTER, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_LaserEngraver.get(1), + bitsd, + new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.EMITTER, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_LaserEngraver.get(1), + bitsd, + new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.EMITTER, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 5); + + } + + private static void registerLathe() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Lathe.get(1), + bitsd, + new Object[] { aTextWireCoil, "EMD", "CWP", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'D', + OrePrefixes.gem.get(Materials.Diamond) }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Lathe.get(1), + bitsd, + new Object[] { aTextWireCoil, "EMD", "CWP", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'D', + OrePrefixes.gemFlawless.get(Materials.Diamond) }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Lathe.get(1), + bitsd, + new Object[] { aTextWireCoil, "EMD", "CWP", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'D', + OreDictNames.craftingIndustrialDiamond }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Lathe.get(1), + bitsd, + new Object[] { aTextWireCoil, "EMD", "CWP", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'D', + OreDictNames.craftingIndustrialDiamond }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Lathe.get(1), + bitsd, + new Object[] { aTextWireCoil, "EMD", "CWP", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'D', + OreDictNames.craftingIndustrialDiamond }, + 5); + + } + + private static void registerMacerator() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Macerator.get(1), + bitsd, + new Object[] { "PEG", "WWM", "CCW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OrePrefixes.gem.get(Materials.Diamond) }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Macerator.get(1), + bitsd, + new Object[] { "PEG", "WWM", "CCW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OrePrefixes.gemFlawless.get(Materials.Diamond) }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Macerator.get(1), + bitsd, + new Object[] { "PEG", "WWM", "CCW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OreDictNames.craftingGrinder }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Macerator.get(1), + bitsd, + new Object[] { "PEG", "WWM", "CCW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OreDictNames.craftingGrinder }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Macerator.get(1), + bitsd, + new Object[] { "PEG", "WWM", "CCW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'P', MTEBasicMachineWithRecipe.X.PISTON, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + OreDictNames.craftingGrinder }, + 5); + + } + + private static void registerMatterAmplifier() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Amplifab.get(1), + bitsd, + new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4 }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Amplifab.get(1), + bitsd, + new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4 }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Amplifab.get(1), + bitsd, + new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4 }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Amplifab.get(1), + bitsd, + new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4 }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Amplifab.get(1), + bitsd, + new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PUMP, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4 }, + 5); + + } + + private static void registerMicrowave() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Microwave.get(1), + bitsd, + new Object[] { "LWC", "LMR", "LEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.EMITTER, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'L', + OrePrefixes.plate.get(Materials.Lead) }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Microwave.get(1), + bitsd, + new Object[] { "LWC", "LMR", "LEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.EMITTER, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'L', + OrePrefixes.plate.get(Materials.Lead) }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Microwave.get(1), + bitsd, + new Object[] { "LWC", "LMR", "LEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.EMITTER, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'L', + OrePrefixes.plate.get(Materials.Lead) }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Microwave.get(1), + bitsd, + new Object[] { "LWC", "LMR", "LEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.EMITTER, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'L', + OrePrefixes.plate.get(Materials.Lead) }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Microwave.get(1), + bitsd, + new Object[] { "LWC", "LMR", "LEC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.EMITTER, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'L', + OrePrefixes.plate.get(Materials.Lead) }, + 5); + + } + + private static void registerMixer() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Mixer.get(1), + bitsd, + new Object[] { "GRG", "GEG", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.ROTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Mixer.get(1), + bitsd, + new Object[] { "GRG", "GEG", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.ROTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Mixer.get(1), + bitsd, + new Object[] { "GRG", "GEG", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.ROTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Mixer.get(1), + bitsd, + new Object[] { "GRG", "GEG", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.ROTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Mixer.get(1), + bitsd, + new Object[] { "GRG", "GEG", aTextCableHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'R', MTEBasicMachineWithRecipe.X.ROTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'G', MTEBasicMachineWithRecipe.X.GLASS }, + 5); + } + + private static void registerOreWasher() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_OreWasher.get(1), + bitsd, + new Object[] { "RGR", "CEC", aTextWireHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.PUMP }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_OreWasher.get(1), + bitsd, + new Object[] { "RGR", "CEC", aTextWireHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.PUMP }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_OreWasher.get(1), + bitsd, + new Object[] { "RGR", "CEC", aTextWireHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.PUMP }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_OreWasher.get(1), + bitsd, + new Object[] { "RGR", "CEC", aTextWireHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.PUMP }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_OreWasher.get(1), + bitsd, + new Object[] { "RGR", "CEC", aTextWireHull, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROTOR, 'E', MTEBasicMachineWithRecipe.X.MOTOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'G', + MTEBasicMachineWithRecipe.X.PUMP }, + 5); + + } + + private static void registerOven() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Oven.get(1), + bitsd, + new Object[] { "CEC", aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Oven.get(1), + bitsd, + new Object[] { "CEC", aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Oven.get(1), + bitsd, + new Object[] { "CEC", aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Oven.get(1), + bitsd, + new Object[] { "CEC", aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Oven.get(1), + bitsd, + new Object[] { "CEC", aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'C', + MTEBasicMachineWithRecipe.X.COIL_HEATING }, + 5); + + } + + private static void registerPlasmaArcFurnace() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_PlasmaArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, "TPT", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'T', MTEBasicMachineWithRecipe.X.PUMP, 'G', + OrePrefixes.cell.get(Materials.Graphite) }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_PlasmaArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, "TPT", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'T', MTEBasicMachineWithRecipe.X.PUMP, 'G', + OrePrefixes.cell.get(Materials.Graphite) }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_PlasmaArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, "TPT", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'T', MTEBasicMachineWithRecipe.X.PUMP, 'G', + OrePrefixes.cell.get(Materials.Graphite) }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_PlasmaArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, "TPT", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'T', MTEBasicMachineWithRecipe.X.PUMP, 'G', + OrePrefixes.cell.get(Materials.Graphite) }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_PlasmaArcFurnace.get(1), + bitsd, + new Object[] { "WGW", aTextCableHull, "TPT", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PLATE, 'C', MTEBasicMachineWithRecipe.X.BETTER_CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE4, 'T', MTEBasicMachineWithRecipe.X.PUMP, 'G', + OrePrefixes.cell.get(Materials.Graphite) }, + 5); + + } + + private static void registerPolarizer() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Polarizer.get(1), + bitsd, + new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Polarizer.get(1), + bitsd, + new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Polarizer.get(1), + bitsd, + new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Polarizer.get(1), + bitsd, + new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Polarizer.get(1), + bitsd, + new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', MTEBasicMachineWithRecipe.X.HULL, 'S', + MTEBasicMachineWithRecipe.X.STICK_ELECTROMAGNETIC, 'Z', MTEBasicMachineWithRecipe.X.COIL_ELECTRIC, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 5); + + } + + private static void registerPrinter() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 5); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LuV_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 6); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_ZPM_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 7); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_UV_Printer.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 8); + + } + + private static void registerRecycler() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Recycler.get(1), + bitsd, + new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Recycler.get(1), + bitsd, + new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Recycler.get(1), + bitsd, + new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Recycler.get(1), + bitsd, + new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Recycler.get(1), + bitsd, + new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) }, + 5); + + } + + private static void registerSifter() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Sifter.get(1), + bitsd, + new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Sifter.get(1), + bitsd, + new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Sifter.get(1), + bitsd, + new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Sifter.get(1), + bitsd, + new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Sifter.get(1), + bitsd, + new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 5); + + } + + private static void registerSlicer() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Slicer.get(1), + bitsd, + new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Slicer.get(1), + bitsd, + new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Slicer.get(1), + bitsd, + new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Slicer.get(1), + bitsd, + new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Slicer.get(1), + bitsd, + new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'P', + MTEBasicMachineWithRecipe.X.PISTON, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE }, + 5); + + } + + private static void registerThermalCentrifuge() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_ThermalCentrifuge.get(1), + bitsd, + new Object[] { "CEC", "OMO", "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_ThermalCentrifuge.get(1), + bitsd, + new Object[] { "CEC", "OMO", "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_ThermalCentrifuge.get(1), + bitsd, + new Object[] { "CEC", "OMO", "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_ThermalCentrifuge.get(1), + bitsd, + new Object[] { "CEC", "OMO", "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_ThermalCentrifuge.get(1), + bitsd, + new Object[] { "CEC", "OMO", "WEW", 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE, 'O', MTEBasicMachineWithRecipe.X.COIL_HEATING_DOUBLE }, + 5); + + } + + private static void registerUnpackager() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 5); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LuV_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 6); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_ZPM_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 7); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_UV_Unboxinator.get(1), + bitsd, + new Object[] { "BCB", "VMR", aTextWireCoil, 'M', MTEBasicMachineWithRecipe.X.HULL, 'R', + MTEBasicMachineWithRecipe.X.ROBOT_ARM, 'V', MTEBasicMachineWithRecipe.X.CONVEYOR, 'C', + MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', MTEBasicMachineWithRecipe.X.WIRE, 'B', + OreDictNames.craftingChest }, + 8); + } + + private static void registerWiremill() { + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_LV_Wiremill.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 1); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_MV_Wiremill.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 2); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_HV_Wiremill.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 3); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_EV_Wiremill.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 4); + + GTModHandler.addMachineCraftingRecipe( + ItemList.Machine_IV_Wiremill.get(1), + bitsd, + new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M', MTEBasicMachineWithRecipe.X.HULL, 'E', + MTEBasicMachineWithRecipe.X.MOTOR, 'C', MTEBasicMachineWithRecipe.X.CIRCUIT, 'W', + MTEBasicMachineWithRecipe.X.WIRE }, + 5); + } + + private static void registerShapedCraftingRecipes() { + GTModHandler.addCraftingRecipe( + ItemList.Casing_Pipe_Polytetrafluoroethylene.get(1L), + bits, + new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Polytetrafluoroethylene), 'F', + OrePrefixes.frameGt.get(Materials.Polytetrafluoroethylene), 'I', + OrePrefixes.pipeMedium.get(Materials.Polytetrafluoroethylene) }); + + GTModHandler.addCraftingRecipe( + ItemList.Casing_Pipe_Polybenzimidazole.get(1L), + bits, + new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Polybenzimidazole), 'F', + OrePrefixes.frameGt.get(Materials.Polybenzimidazole), 'I', + OrePrefixes.pipeMedium.get(Materials.Polybenzimidazole) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_ULV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', + OrePrefixes.plate.get(Materials.WroughtIron) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_LV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_MV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_HV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', + OrePrefixes.plate.get(Materials.StainlessSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_EV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Titanium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_IV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', + OrePrefixes.plate.get(Materials.TungstenSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_LuV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', + OrePrefixes.plate.get(ExternalMaterials.getRhodiumPlatedPalladium()) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_ZPM.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Iridium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_UV.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Osmium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_MAX.get(1L), + bits, + new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', + OrePrefixes.plate.get(Materials.Neutronium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_BronzePlatedBricks.get(1L), + bits, + new Object[] { "PhP", "PBP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Bronze), 'B', + new ItemStack(Blocks.brick_block, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', + OrePrefixes.frameGt.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_StableTitanium.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', + OrePrefixes.frameGt.get(Materials.Titanium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_HeatProof.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Invar), 'F', + OrePrefixes.frameGt.get(Materials.Invar) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_FrostProof.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Aluminium), 'F', + OrePrefixes.frameGt.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_CleanStainlessSteel.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'F', + OrePrefixes.frameGt.get(Materials.StainlessSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_RobustTungstenSteel.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', + OrePrefixes.frameGt.get(Materials.TungstenSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_MiningOsmiridium.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Osmiridium), 'F', + OrePrefixes.frameGt.get(Materials.Osmiridium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_MiningNeutronium.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Neutronium), 'F', + OrePrefixes.frameGt.get(Materials.Neutronium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_MiningBlackPlutonium.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.BlackPlutonium), 'F', + OrePrefixes.frameGt.get(Materials.BlackPlutonium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Turbine.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Magnalium), 'F', + OrePrefixes.frameGt.get(Materials.BlueSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Turbine1.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'F', + ItemList.Casing_Turbine }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Turbine2.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', + ItemList.Casing_Turbine }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Turbine3.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', + ItemList.Casing_Turbine }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_TurbineGasAdvanced.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.HSSS), 'F', + ItemList.Casing_Turbine }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Pipe_Bronze.get(1L), + bits, + new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F', + OrePrefixes.frameGt.get(Materials.Bronze), 'I', OrePrefixes.pipeMedium.get(Materials.Bronze) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Pipe_Steel.get(1L), + bits, + new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Steel), 'F', + OrePrefixes.frameGt.get(Materials.Steel), 'I', OrePrefixes.pipeMedium.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Pipe_Titanium.get(1L), + bits, + new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', + OrePrefixes.frameGt.get(Materials.Titanium), 'I', OrePrefixes.pipeMedium.get(Materials.Titanium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Pipe_TungstenSteel.get(1L), + bits, + new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', + OrePrefixes.frameGt.get(Materials.TungstenSteel), 'I', + OrePrefixes.pipeMedium.get(Materials.TungstenSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Gearbox_Bronze.get(1L), + bits, + new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Bronze), 'F', + OrePrefixes.frameGt.get(Materials.Bronze), 'G', OrePrefixes.gearGt.get(Materials.Bronze) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Gearbox_Steel.get(1L), + bits, + new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', + OrePrefixes.frameGt.get(Materials.Steel), 'G', OrePrefixes.gearGt.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Gearbox_Titanium.get(1L), + bits, + new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', + OrePrefixes.frameGt.get(Materials.Titanium), 'G', OrePrefixes.gearGt.get(Materials.Titanium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Gearbox_TungstenSteel.get(1L), + bits, + new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F', + OrePrefixes.frameGt.get(Materials.TungstenSteel), 'G', ItemList.Robot_Arm_IV }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Grate.get(1L), + bits, + new Object[] { "PVP", "PFP", aTextPlateMotor, 'P', new ItemStack(Blocks.iron_bars, 1), 'F', + OrePrefixes.frameGt.get(Materials.Steel), 'M', ItemList.Electric_Motor_MV, 'V', + OrePrefixes.rotor.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Assembler.get(1L), + bits, + new Object[] { "PVP", "PFP", aTextPlateMotor, 'P', OrePrefixes.circuit.get(Materials.ZPM), 'F', + OrePrefixes.frameGt.get(Materials.TungstenSteel), 'M', ItemList.Electric_Motor_IV, 'V', + OrePrefixes.circuit.get(Materials.LuV) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Firebox_Bronze.get(1L), + bits, + new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F', + OrePrefixes.frameGt.get(Materials.Bronze), 'S', OrePrefixes.stick.get(Materials.Bronze) }); + GTModHandler.addCraftingRecipe( + ItemList.WoodenCasing.get(1L), + bits, + new Object[] { "PSP", "PFP", "PSP", 'F', OrePrefixes.gear.get(Materials.Wood), 'P', + OrePrefixes.frameGt.get(Materials.Wood), 'S', OrePrefixes.screw.get(Materials.Wood) }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Output_ULV.get(1L), + bits, + new Object[] { "ASA", "AFA", "APA", 'S', GTModHandler.getModItem(BuildCraftFactory.ID, "tankBlock", 1L, 0), + 'F', ItemList.Hull_ULV.get(1L), 'A', OrePrefixes.plate.get(Materials.Rubber), 'P', + OrePrefixes.ring.get(Materials.Rubber) }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Input_ULV.get(1L), + bits, + new Object[] { "ASA", "AFA", "APA", 'S', GTModHandler.getModItem(BuildCraftFactory.ID, "tankBlock", 1L, 0), + 'F', ItemList.Hull_ULV.get(1L), 'A', OrePrefixes.plate.get(Materials.Rubber), 'P', + OrePrefixes.gear.get(Materials.Rubber) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Firebox_Steel.get(1L), + bits, + new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Steel), 'F', + OrePrefixes.frameGt.get(Materials.Steel), 'S', OrePrefixes.stick.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Firebox_Titanium.get(1L), + bits, + new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Titanium), 'F', + OrePrefixes.frameGt.get(Materials.Titanium), 'S', OrePrefixes.stick.get(Materials.Titanium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Firebox_TungstenSteel.get(1L), + bits, + new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F', + OrePrefixes.frameGt.get(Materials.TungstenSteel), 'S', + OrePrefixes.stick.get(Materials.TungstenSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Stripes_A.get(1L), + bits, + new Object[] { "Y ", " M ", " B", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Stripes_B.get(1L), + bits, + new Object[] { " Y", " M ", "B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_RadioactiveHazard.get(1L), + bits, + new Object[] { " YB", " M ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_BioHazard.get(1L), + bits, + new Object[] { " Y ", " MB", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_ExplosionHazard.get(1L), + bits, + new Object[] { " Y ", " M ", " B", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_FireHazard.get(1L), + bits, + new Object[] { " Y ", " M ", " B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_AcidHazard.get(1L), + bits, + new Object[] { " Y ", " M ", "B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_MagicHazard.get(1L), + bits, + new Object[] { " Y ", "BM ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_FrostHazard.get(1L), + bits, + new Object[] { "BY ", " M ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_NoiseHazard.get(1L), + bits, + new Object[] { " ", " M ", "BY ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B', + Dyes.dyeBlack }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_Advanced_Iridium.get(1L), + bits, + new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Iridium), 'F', + OrePrefixes.frameGt.get(Materials.Iridium) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bricked_BlastFurnace.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "BFB", "FwF", "BFB", 'B', ItemList.Casing_Firebricks, 'F', + OreDictNames.craftingIronFurnace }); + + GTModHandler.addCraftingRecipe( + ItemList.Hull_Bronze.get(1L), + bits, + new Object[] { aTextPlate, "PhP", aTextPlate, 'P', OrePrefixes.plate.get(Materials.Bronze) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_Bronze_Bricks.get(1L), + bits, + new Object[] { aTextPlate, "PhP", "BBB", 'P', OrePrefixes.plate.get(Materials.Bronze), 'B', + new ItemStack(Blocks.brick_block, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_HP.get(1L), + bits, + new Object[] { aTextPlate, "PhP", aTextPlate, 'P', OrePrefixes.plate.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_HP_Bricks.get(1L), + bits, + new Object[] { aTextPlate, "PhP", "BBB", 'P', OrePrefixes.plate.get(Materials.WroughtIron), 'B', + new ItemStack(Blocks.brick_block, 1) }); + + // hull crafting recipes. (They can't be used for recycling as that would create an exploit loop with the + // assembler recipes.) + + GTModHandler.addCraftingRecipe( + ItemList.Hull_ULV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_ULV, 'C', + OrePrefixes.cableGt01.get(Materials.Lead), 'H', OrePrefixes.plate.get(Materials.WroughtIron), 'P', + OrePrefixes.plate.get(Materials.Wood) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_LV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_LV, 'C', + OrePrefixes.cableGt01.get(Materials.Tin), 'H', OrePrefixes.plate.get(Materials.Steel), 'P', + OrePrefixes.plate.get(Materials.WroughtIron) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_MV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_MV, 'C', + OrePrefixes.cableGt01.get(Materials.Copper), 'H', OrePrefixes.plate.get(Materials.Aluminium), 'P', + OrePrefixes.plate.get(Materials.WroughtIron) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_HV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_HV, 'C', + OrePrefixes.cableGt01.get(Materials.Gold), 'H', OrePrefixes.plate.get(Materials.StainlessSteel), 'P', + OrePrefixes.plate.get(Materials.Plastic) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_EV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_EV, 'C', + OrePrefixes.cableGt01.get(Materials.Aluminium), 'H', OrePrefixes.plate.get(Materials.Titanium), 'P', + OrePrefixes.plate.get(Materials.Plastic) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_IV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_IV, 'C', + OrePrefixes.cableGt01.get(Materials.Tungsten), 'H', OrePrefixes.plate.get(Materials.TungstenSteel), 'P', + OrePrefixes.plate.get(Materials.Polytetrafluoroethylene) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_LuV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_LuV, 'C', + OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'H', + OrePrefixes.plate.get(ExternalMaterials.getRhodiumPlatedPalladium()), 'P', + OrePrefixes.plate.get(Materials.Polytetrafluoroethylene) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_ZPM.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_ZPM, 'C', + OrePrefixes.cableGt01.get(Materials.Naquadah), 'H', OrePrefixes.plate.get(Materials.Iridium), 'P', + OrePrefixes.plate.get(Materials.Polybenzimidazole) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_UV.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_UV, 'C', + OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), 'H', OrePrefixes.plate.get(Materials.Osmium), 'P', + OrePrefixes.plate.get(Materials.Polybenzimidazole) }); + GTModHandler.addCraftingRecipe( + ItemList.Hull_MAX.get(1L), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_MAX, 'C', + OrePrefixes.wireGt04.get(Materials.SuperconductorUV), 'H', OrePrefixes.plate.get(Materials.Neutronium), + 'P', OrePrefixes.plate.get(Materials.Polybenzimidazole) }); + + // hull recycling data + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_ULV.get(1L), + ItemList.Casing_ULV.get(1), + OrePrefixes.cableGt01.get(Materials.Lead), + OrePrefixes.cableGt01.get(Materials.Lead)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_LV.get(1L), + ItemList.Casing_LV.get(1), + OrePrefixes.cableGt01.get(Materials.Tin), + OrePrefixes.cableGt01.get(Materials.Tin)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_MV.get(1L), + ItemList.Casing_MV.get(1), + OrePrefixes.cableGt01.get(Materials.AnyCopper), + OrePrefixes.cableGt01.get(Materials.AnyCopper)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_HV.get(1L), + ItemList.Casing_HV.get(1), + OrePrefixes.cableGt01.get(Materials.Gold), + OrePrefixes.cableGt01.get(Materials.Gold)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_EV.get(1L), + ItemList.Casing_EV.get(1), + OrePrefixes.cableGt01.get(Materials.Aluminium), + OrePrefixes.cableGt01.get(Materials.Aluminium)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_IV.get(1L), + ItemList.Casing_IV.get(1), + OrePrefixes.cableGt01.get(Materials.Tungsten), + OrePrefixes.cableGt01.get(Materials.Tungsten)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_LuV.get(1L), + ItemList.Casing_LuV.get(1), + OrePrefixes.cableGt01.get(Materials.VanadiumGallium), + OrePrefixes.cableGt01.get(Materials.VanadiumGallium)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_ZPM.get(1L), + ItemList.Casing_ZPM.get(1), + OrePrefixes.cableGt02.get(Materials.Naquadah), + OrePrefixes.cableGt02.get(Materials.Naquadah)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_UV.get(1L), + ItemList.Casing_UV.get(1), + OrePrefixes.cableGt04.get(Materials.NaquadahAlloy), + OrePrefixes.cableGt04.get(Materials.NaquadahAlloy)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hull_MAX.get(1L), + ItemList.Casing_MAX.get(1), + OrePrefixes.cableGt04.get(Materials.SuperconductorUV), + OrePrefixes.cableGt04.get(Materials.SuperconductorUV)); + + GTModHandler.addCraftingRecipe( + ItemList.Transformer_LV_ULV.get(1L), + bitsd, + new Object[] { " BB", "CM ", " BB", 'M', ItemList.Hull_ULV, 'C', OrePrefixes.cableGt01.get(Materials.Tin), + 'B', OrePrefixes.cableGt01.get(Materials.Lead) }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_MV_LV.get(1L), + bitsd, + new Object[] { " BB", "CM ", " BB", 'M', ItemList.Hull_LV, 'C', + OrePrefixes.cableGt01.get(Materials.AnyCopper), 'B', OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_HV_MV.get(1L), + bitsd, + new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_MV, 'C', OrePrefixes.cableGt01.get(Materials.Gold), + 'B', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'K', + OrePrefixes.componentCircuit.get(Materials.Inductor) }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_EV_HV.get(1L), + bitsd, + new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_HV, 'C', + OrePrefixes.cableGt01.get(Materials.Aluminium), 'B', OrePrefixes.cableGt01.get(Materials.Gold), 'K', + ItemList.Circuit_Chip_ULPIC }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_IV_EV.get(1L), + bitsd, + new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_EV, 'C', + OrePrefixes.cableGt01.get(Materials.Tungsten), 'B', OrePrefixes.cableGt01.get(Materials.Aluminium), 'K', + ItemList.Circuit_Chip_LPIC }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_LuV_IV.get(1L), + bitsd, + new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_IV, 'C', + OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'B', + OrePrefixes.cableGt01.get(Materials.Tungsten), 'K', ItemList.Circuit_Chip_PIC }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_ZPM_LuV.get(1L), + bitsd, + new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_LuV, 'C', + OrePrefixes.cableGt01.get(Materials.Naquadah), 'B', + OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'K', ItemList.Circuit_Chip_HPIC }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_UV_ZPM.get(1L), + bitsd, + new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_ZPM, 'C', + OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), 'B', OrePrefixes.cableGt01.get(Materials.Naquadah), + 'K', ItemList.Circuit_Chip_UHPIC }); + GTModHandler.addCraftingRecipe( + ItemList.Transformer_MAX_UV.get(1L), + bitsd, + new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_UV, 'C', + OrePrefixes.wireGt01.get(Materials.Bedrockium), 'B', OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), + 'K', ItemList.Circuit_Chip_NPIC }); + + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Dynamo_ULV.get(1L), + bitsd, + new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_ULV, 'S', OrePrefixes.spring.get(Materials.Lead), + 'X', OrePrefixes.circuit.get(Materials.ULV), 'O', ItemList.ULV_Coil, 'L', + OrePrefixes.cell.get(Materials.Lubricant), 'P', OrePrefixes.rotor.get(Materials.Lead) }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Dynamo_LV.get(1L), + bitsd, + new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_LV, 'S', OrePrefixes.spring.get(Materials.Tin), 'X', + OrePrefixes.circuit.get(Materials.LV), 'O', ItemList.LV_Coil, 'L', + OrePrefixes.cell.get(Materials.Lubricant), 'P', ItemList.Electric_Pump_LV }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Dynamo_MV.get(1L), + bitsd, + new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_MV, 'S', OrePrefixes.spring.get(Materials.Copper), + 'X', ItemList.Circuit_Chip_ULPIC, 'O', ItemList.MV_Coil, 'L', OrePrefixes.cell.get(Materials.Lubricant), + 'P', ItemList.Electric_Pump_MV }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Energy_ULV.get(1L), + bitsd, + new Object[] { "COL", "XMP", "COL", 'M', ItemList.Hull_ULV, 'C', OrePrefixes.cableGt01.get(Materials.Lead), + 'X', OrePrefixes.circuit.get(Materials.ULV), 'O', ItemList.ULV_Coil, 'L', + OrePrefixes.cell.get(Materials.Lubricant), 'P', OrePrefixes.rotor.get(Materials.Lead) }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Energy_LV.get(1L), + bitsd, + new Object[] { "COL", "XMP", "COL", 'M', ItemList.Hull_LV, 'C', OrePrefixes.cableGt01.get(Materials.Tin), + 'X', OrePrefixes.circuit.get(Materials.LV), 'O', ItemList.LV_Coil, 'L', + OrePrefixes.cell.get(Materials.Lubricant), 'P', ItemList.Electric_Pump_LV }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Energy_MV.get(1L), + bitsd, + new Object[] { "XOL", "CMP", "XOL", 'M', ItemList.Hull_MV, 'C', OrePrefixes.cableGt01.get(Materials.Copper), + 'X', ItemList.Circuit_Chip_ULPIC, 'O', ItemList.MV_Coil, 'L', OrePrefixes.cell.get(Materials.Lubricant), + 'P', ItemList.Electric_Pump_MV }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Maintenance.get(1L), + bitsd, + new Object[] { "dwx", "hMc", "fsr", 'M', ItemList.Hull_LV }); + + GTModHandler.addCraftingRecipe( + ItemList.Hatch_DataAccess_EV.get(1L), + bitsd, + new Object[] { "COC", "OMO", "COC", 'M', ItemList.Hull_EV, 'O', ItemList.Tool_DataStick, 'C', + OrePrefixes.circuit.get(Materials.IV) }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_DataAccess_LuV.get(1L), + bitsd, + new Object[] { "COC", "OMO", "COC", 'M', ItemList.Hull_LuV, 'O', ItemList.Tool_DataOrb, 'C', + OrePrefixes.circuit.get(Materials.ZPM) }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_DataAccess_UV.get(1L), + bitsd, + new Object[] { "CRC", "OMO", "CRC", 'M', ItemList.Hull_UV, 'O', ItemList.Tool_DataOrb, 'C', + OrePrefixes.circuit.get(Materials.UHV), 'R', ItemList.Robot_Arm_UV }); + + GTModHandler.addCraftingRecipe( + ItemList.Hatch_AutoMaintenance.get(1L), + bitsd, + new Object[] { "CHC", "AMA", "CHC", 'M', ItemList.Hull_LuV, 'H', ItemList.Hatch_Maintenance, 'A', + ItemList.Robot_Arm_LuV, 'C', OrePrefixes.circuit.get(Materials.ZPM) }); + + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Muffler_LV.get(1L), + bitsd, + new Object[] { "MX ", "PR ", 'M', ItemList.Hull_LV, 'P', OrePrefixes.pipeMedium.get(Materials.Bronze), 'R', + OrePrefixes.rotor.get(Materials.Bronze), 'X', ItemList.Electric_Motor_LV }); + GTModHandler.addCraftingRecipe( + ItemList.Hatch_Muffler_MV.get(1L), + bitsd, + new Object[] { "MX ", "PR ", 'M', ItemList.Hull_MV, 'P', OrePrefixes.pipeMedium.get(Materials.Steel), 'R', + OrePrefixes.rotor.get(Materials.Steel), 'X', ItemList.Electric_Motor_MV }); + + // recycling data for the other mufflers, recipes are in assembler + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hatch_Muffler_HV.get(1L), + ItemList.Hull_HV.get(1), + OrePrefixes.pipeLarge.get(Materials.StainlessSteel), + OrePrefixes.rotor.get(Materials.StainlessSteel), + ItemList.Electric_Motor_HV.get(1)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hatch_Muffler_EV.get(1L), + ItemList.Hull_EV.get(1), + OrePrefixes.pipeLarge.get(Materials.Titanium), + OrePrefixes.rotor.get(Materials.Titanium), + ItemList.Electric_Motor_EV.get(1)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hatch_Muffler_IV.get(1L), + ItemList.Hull_IV.get(1), + OrePrefixes.pipeLarge.get(Materials.TungstenSteel), + OrePrefixes.rotor.get(Materials.TungstenSteel), + ItemList.Electric_Motor_IV.get(1)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hatch_Muffler_LuV.get(1L), + ItemList.Hull_LuV.get(1), + OrePrefixes.pipeLarge.get(Materials.Enderium), + OrePrefixes.rotor.get(Materials.Enderium), + ItemList.Electric_Motor_LuV.get(1)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hatch_Muffler_ZPM.get(1L), + ItemList.Hull_ZPM.get(1), + OrePrefixes.pipeLarge.get(Materials.Naquadah), + OrePrefixes.rotor.get(Materials.NaquadahAlloy), + ItemList.Electric_Motor_ZPM.get(1)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hatch_Muffler_UV.get(1L), + ItemList.Hull_UV.get(1), + OrePrefixes.pipeLarge.get(Materials.NetherStar), + OrePrefixes.rotor.get(Materials.Neutronium), + ItemList.Electric_Motor_UV.get(1)); + GTOreDictUnificator.addItemDataFromInputs( + ItemList.Hatch_Muffler_MAX.get(1L), + ItemList.Hull_MAX.get(1), + OrePrefixes.pipeLarge.get(Materials.MysteriousCrystal), + OrePrefixes.rotor.get(Materials.CosmicNeutronium), + ItemList.Electric_Motor_UHV.get(1)); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_Boiler.get(1L), + bitsd, + new Object[] { aTextPlate, "PwP", "BFB", 'F', OreDictNames.craftingIronFurnace, 'P', + OrePrefixes.plate.get(Materials.Bronze), 'B', new ItemStack(Blocks.brick_block, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Steel_Boiler.get(1L), + bitsd, + new Object[] { aTextPlate, "PwP", "BFB", 'F', OreDictNames.craftingIronFurnace, 'P', + OrePrefixes.plate.get(Materials.Steel), 'B', new ItemStack(Blocks.brick_block, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Steel_Boiler_Lava.get(1L), + bitsd, + new Object[] { aTextPlate, "PTP", aTextPlateMotor, 'M', ItemList.Hull_HP, 'P', + OrePrefixes.plate.get(Materials.Steel), 'T', + GTModHandler.getModItem(BuildCraftFactory.ID, "tankBlock", 1L, 0) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_Boiler_Solar.get(1L), + bitsd, + new Object[] { "GGG", "SSS", aTextPlateMotor, 'M', ItemList.Hull_Bronze_Bricks, 'P', + OrePrefixes.pipeSmall.get(Materials.Bronze), 'S', OrePrefixes.plateDouble.get(Materials.Silver), 'G', + new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HP_Solar.get(1L), + bitsd, + new Object[] { "GGG", "SSS", aTextPlateMotor, 'M', ItemList.Hull_HP_Bricks, 'P', + OrePrefixes.pipeSmall.get(Materials.Steel), 'S', OrePrefixes.plateTriple.get(Materials.Silver), 'G', + GTModHandler.getModItem(IndustrialCraft2.ID, "blockAlloyGlass", 1L) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_Furnace.get(1L), + bitsd, + new Object[] { "XXX", "XMX", "XFX", 'M', ItemList.Hull_Bronze_Bricks, 'X', + OrePrefixes.pipeSmall.get(Materials.Bronze), 'F', OreDictNames.craftingFurnace }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HP_Furnace.get(1L), + bitsd, + new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Furnace, 'X', + OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), + 'S', OrePrefixes.plate.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_Macerator.get(1L), + bitsd, + new Object[] { "DXD", "XMX", "PXP", 'M', ItemList.Hull_Bronze, 'X', + OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'D', + OrePrefixes.gem.get(Materials.Diamond) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HP_Macerator.get(1L), + bitsd, + new Object[] { "PSP", "XMX", "PPP", 'M', ItemList.Machine_Bronze_Macerator, 'X', + OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), + 'S', OrePrefixes.plate.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_Extractor.get(1L), + bitsd, + new Object[] { "XXX", "PMG", "XXX", 'M', ItemList.Hull_Bronze, 'X', + OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'G', + new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HP_Extractor.get(1L), + bitsd, + new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Extractor, 'X', + OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), + 'S', OrePrefixes.plate.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_Hammer.get(1L), + bitsd, + new Object[] { "XPX", "XMX", "XAX", 'M', ItemList.Hull_Bronze, 'X', + OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'A', + OreDictNames.craftingAnvil }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HP_Hammer.get(1L), + bitsd, + new Object[] { "PSP", "XMX", "PPP", 'M', ItemList.Machine_Bronze_Hammer, 'X', + OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), + 'S', OrePrefixes.plate.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_Compressor.get(1L), + bitsd, + new Object[] { "XXX", aTextPlateMotor, "XXX", 'M', ItemList.Hull_Bronze, 'X', + OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HP_Compressor.get(1L), + bitsd, + new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Compressor, 'X', + OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), + 'S', OrePrefixes.plate.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Bronze_AlloySmelter.get(1L), + bitsd, + new Object[] { "XXX", "FMF", "XXX", 'M', ItemList.Hull_Bronze_Bricks, 'X', + OrePrefixes.pipeSmall.get(Materials.Bronze), 'F', OreDictNames.craftingFurnace }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HP_AlloySmelter.get(1L), + bitsd, + new Object[] { "PSP", "PMP", "PXP", 'M', ItemList.Machine_Bronze_AlloySmelter, 'X', + OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron), + 'S', OrePrefixes.plate.get(Materials.Steel) }); + + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_ULV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', + OrePrefixes.wireGt01.get(Materials.Lead), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_LV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', + OrePrefixes.wireGt01.get(Materials.Tin), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_MV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', + OrePrefixes.wireGt01.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_HV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', + OrePrefixes.wireGt01.get(Materials.Gold), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_EV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', + OrePrefixes.wireGt01.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_IV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', + OrePrefixes.wireGt01.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_LuV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', + OrePrefixes.wireGt01.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_ZPM.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', + OrePrefixes.wireGt01.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_UV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', + OrePrefixes.wireGt01.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_1by1_UHV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', + OrePrefixes.wireGt01.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); + + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_ULV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', + OrePrefixes.wireGt04.get(Materials.Lead), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_LV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', + OrePrefixes.wireGt04.get(Materials.Tin), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_MV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', + OrePrefixes.wireGt04.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_HV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', + OrePrefixes.wireGt04.get(Materials.Gold), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_EV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', + OrePrefixes.wireGt04.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_IV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', + OrePrefixes.wireGt04.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_LuV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', + OrePrefixes.wireGt04.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_ZPM.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', + OrePrefixes.wireGt04.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_UV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', + OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_2by2_UHV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', + OrePrefixes.wireGt04.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); + + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_ULV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', + OrePrefixes.wireGt08.get(Materials.Lead), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_LV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', + OrePrefixes.wireGt08.get(Materials.Tin), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_MV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', + OrePrefixes.wireGt08.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_HV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', + OrePrefixes.wireGt08.get(Materials.Gold), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_EV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', + OrePrefixes.wireGt08.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_IV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', + OrePrefixes.wireGt08.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_LuV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', + OrePrefixes.wireGt08.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_ZPM.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', + OrePrefixes.wireGt08.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_UV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', + OrePrefixes.wireGt08.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_3by3_UHV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', + OrePrefixes.wireGt08.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); + + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_ULV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W', + OrePrefixes.wireGt16.get(Materials.Lead), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_LV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W', + OrePrefixes.wireGt16.get(Materials.Tin), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_MV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W', + OrePrefixes.wireGt16.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_HV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W', + OrePrefixes.wireGt16.get(Materials.Gold), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_EV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W', + OrePrefixes.wireGt16.get(Materials.Aluminium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_IV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W', + OrePrefixes.wireGt16.get(Materials.Tungsten), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_LuV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W', + OrePrefixes.wireGt16.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_ZPM.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W', + OrePrefixes.wireGt16.get(Materials.Naquadah), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_UV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W', + OrePrefixes.wireGt16.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Buffer_4by4_UHV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W', + OrePrefixes.wireGt16.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest }); + + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_ULV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_ULV, 'W', + OrePrefixes.wireGt16.get(Materials.Lead), 'T', OreDictNames.craftingChest, 'B', + ItemList.Battery_RE_ULV_Tantalum, 'C', OrePrefixes.circuit.get(Materials.ULV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_LV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_LV, 'W', + OrePrefixes.wireGt16.get(Materials.Tin), 'T', OreDictNames.craftingChest, 'B', + ItemList.Battery_RE_LV_Lithium, 'C', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_MV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_MV, 'W', + OrePrefixes.wireGt16.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest, 'B', + ItemList.Battery_RE_MV_Lithium, 'C', OrePrefixes.circuit.get(Materials.MV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_HV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_HV, 'W', + OrePrefixes.wireGt16.get(Materials.Gold), 'T', OreDictNames.craftingChest, 'B', + ItemList.Battery_RE_HV_Lithium, 'C', OrePrefixes.circuit.get(Materials.HV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_EV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_EV, 'W', + OrePrefixes.wireGt16.get(Materials.Aluminium), 'T', OreDictNames.craftingChest, 'B', + OrePrefixes.battery.get(Materials.EV), 'C', OrePrefixes.circuit.get(Materials.EV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_IV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_IV, 'W', + OrePrefixes.wireGt16.get(Materials.Tungsten), 'T', OreDictNames.craftingChest, 'B', + OrePrefixes.battery.get(Materials.IV), 'C', OrePrefixes.circuit.get(Materials.IV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_LuV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_LuV, 'W', + OrePrefixes.wireGt16.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest, 'B', + OrePrefixes.battery.get(Materials.LuV), 'C', OrePrefixes.circuit.get(Materials.LuV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_ZPM.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_ZPM, 'W', + OrePrefixes.wireGt16.get(Materials.Naquadah), 'T', OreDictNames.craftingChest, 'B', + OrePrefixes.battery.get(Materials.ZPM), 'C', OrePrefixes.circuit.get(Materials.ZPM) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_UV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_UV, 'W', + OrePrefixes.wireGt16.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest, 'B', ItemList.ZPM2, + 'C', OrePrefixes.circuit.get(Materials.UV) }); + GTModHandler.addCraftingRecipe( + ItemList.Battery_Charger_4by4_UHV.get(1L), + bitsd, + new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_MAX, 'W', + OrePrefixes.wireGt16.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest, 'B', + ItemList.ZPM2, 'C', OrePrefixes.circuit.get(Materials.UHV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Locker_ULV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_ULV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_LV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_LV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_MV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_MV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_HV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_HV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_EV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_EV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_IV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_IV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_LuV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_LuV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_ZPM.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_ZPM, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_UV.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_UV, 'T', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Locker_MAX.get(1L), + bitsd, + new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_UHV, 'T', OreDictNames.craftingChest }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_LV_Scanner.get(1L), + bitsd, + new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_LV, 'T', ItemList.Emitter_LV, 'R', + ItemList.Sensor_LV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_MV_Scanner.get(1L), + bitsd, + new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_MV, 'T', ItemList.Emitter_MV, 'R', + ItemList.Sensor_MV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_Scanner.get(1L), + bitsd, + new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_HV, 'T', ItemList.Emitter_HV, 'R', + ItemList.Sensor_HV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_EV_Scanner.get(1L), + bitsd, + new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_EV, 'T', ItemList.Emitter_EV, 'R', + ItemList.Sensor_EV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', + OrePrefixes.cableGt01.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_IV_Scanner.get(1L), + bitsd, + new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_IV, 'T', ItemList.Emitter_IV, 'R', + ItemList.Sensor_IV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', + OrePrefixes.cableGt01.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_LV_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_LV, 'R', ItemList.Robot_Arm_LV, 'V', + ItemList.Conveyor_Module_LV, 'C', OrePrefixes.circuit.get(Materials.LV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin), 'B', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_MV_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_MV, 'R', ItemList.Robot_Arm_MV, 'V', + ItemList.Conveyor_Module_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt01.get(Materials.AnyCopper), 'B', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_HV, 'R', ItemList.Robot_Arm_HV, 'V', + ItemList.Conveyor_Module_HV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold), 'B', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_EV_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_EV, 'R', ItemList.Robot_Arm_EV, 'V', + ItemList.Conveyor_Module_EV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', + OrePrefixes.cableGt01.get(Materials.Aluminium), 'B', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_IV_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_IV, 'R', ItemList.Robot_Arm_IV, 'V', + ItemList.Conveyor_Module_IV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', + OrePrefixes.cableGt01.get(Materials.Tungsten), 'B', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_LuV_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_LuV, 'R', ItemList.Robot_Arm_LuV, 'V', + ItemList.Conveyor_Module_LuV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', + OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'B', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_ZPM_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_ZPM, 'R', ItemList.Robot_Arm_ZPM, 'V', + ItemList.Conveyor_Module_ZPM, 'C', OrePrefixes.circuit.get(Materials.ZPM), 'W', + OrePrefixes.cableGt01.get(Materials.Naquadah), 'B', OreDictNames.craftingChest }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_UV_Boxinator.get(1L), + bitsd, + new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_UV, 'R', ItemList.Robot_Arm_UV, 'V', + ItemList.Conveyor_Module_UV, 'C', OrePrefixes.circuit.get(Materials.UV), 'W', + OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), 'B', OreDictNames.craftingChest }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_LV_RockBreaker.get(1L), + bitsd, + new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_LV, 'D', OreDictNames.craftingGrinder, 'E', + ItemList.Electric_Motor_LV, 'P', ItemList.Electric_Piston_LV, 'C', + OrePrefixes.circuit.get(Materials.LV), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'G', + new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_MV_RockBreaker.get(1L), + bitsd, + new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_MV, 'D', OreDictNames.craftingGrinder, 'E', + ItemList.Electric_Motor_MV, 'P', ItemList.Electric_Piston_MV, 'C', + OrePrefixes.circuit.get(Materials.MV), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', + new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_RockBreaker.get(1L), + bitsd, + new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_HV, 'D', OreDictNames.craftingGrinder, 'E', + ItemList.Electric_Motor_HV, 'P', ItemList.Electric_Piston_HV, 'C', + OrePrefixes.circuit.get(Materials.HV), 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'G', + new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_EV_RockBreaker.get(1L), + bitsd, + new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_EV, 'D', OreDictNames.craftingGrinder, 'E', + ItemList.Electric_Motor_EV, 'P', ItemList.Electric_Piston_EV, 'C', + OrePrefixes.circuit.get(Materials.EV), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium), 'G', + new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_IV_RockBreaker.get(1L), + bitsd, + new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_IV, 'D', OreDictNames.craftingGrinder, 'E', + ItemList.Electric_Motor_IV, 'P', ItemList.Electric_Piston_IV, 'C', + OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt01.get(Materials.Tungsten), 'G', + new ItemStack(Blocks.glass, 1) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_LV_Massfab.get(1L), + bitsd, + new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_LV, 'F', ItemList.Field_Generator_LV, 'C', + OrePrefixes.circuit.get(Materials.MV), 'W', OrePrefixes.cableGt04.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_MV_Massfab.get(1L), + bitsd, + new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_MV, 'F', ItemList.Field_Generator_MV, 'C', + OrePrefixes.circuit.get(Materials.HV), 'W', OrePrefixes.cableGt04.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_Massfab.get(1L), + bitsd, + new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_HV, 'F', ItemList.Field_Generator_HV, 'C', + OrePrefixes.circuit.get(Materials.EV), 'W', OrePrefixes.cableGt04.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_EV_Massfab.get(1L), + bitsd, + new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_EV, 'F', ItemList.Field_Generator_EV, 'C', + OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt04.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_IV_Massfab.get(1L), + bitsd, + new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_IV, 'F', ItemList.Field_Generator_IV, 'C', + OrePrefixes.circuit.get(Materials.LuV), 'W', OrePrefixes.cableGt04.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_LV_Replicator.get(1L), + bitsd, + new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_LV, 'F', + ItemList.Field_Generator_LV, 'E', ItemList.Emitter_LV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt04.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_MV_Replicator.get(1L), + bitsd, + new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_MV, 'F', + ItemList.Field_Generator_MV, 'E', ItemList.Emitter_MV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt04.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_Replicator.get(1L), + bitsd, + new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_HV, 'F', + ItemList.Field_Generator_HV, 'E', ItemList.Emitter_HV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', + OrePrefixes.cableGt04.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_EV_Replicator.get(1L), + bitsd, + new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_EV, 'F', + ItemList.Field_Generator_EV, 'E', ItemList.Emitter_EV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', + OrePrefixes.cableGt04.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_IV_Replicator.get(1L), + bitsd, + new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_IV, 'F', + ItemList.Field_Generator_IV, 'E', ItemList.Emitter_IV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', + OrePrefixes.cableGt04.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_LV_Brewery.get(1L), + bitsd, + new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Pump_LV, 'B', + new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin), 'G', new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_MV_Brewery.get(1L), + bitsd, + new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Pump_MV, 'B', + new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_Brewery.get(1L), + bitsd, + new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Pump_HV, 'B', + new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold), 'G', new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_EV_Brewery.get(1L), + bitsd, + new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Pump_EV, 'B', + new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.EV), 'W', + OrePrefixes.cableGt01.get(Materials.Aluminium), 'G', new ItemStack(Blocks.glass, 1) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_IV_Brewery.get(1L), + bitsd, + new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Pump_IV, 'B', + new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.IV), 'W', + OrePrefixes.cableGt01.get(Materials.Tungsten), 'G', new ItemStack(Blocks.glass, 1) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_LV_Miner.get(1L), + bitsd, + new Object[] { "EEE", aTextWireHull, "CSC", 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'C', + OrePrefixes.circuit.get(Materials.LV), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'S', + ItemList.Sensor_LV }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_MV_Miner.get(1L), + bitsd, + new Object[] { "PEP", aTextWireHull, "CSC", 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'P', + ItemList.Electric_Piston_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt02.get(Materials.Copper), 'S', ItemList.Sensor_MV }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_Miner.get(1L), + bitsd, + new Object[] { "RPR", aTextWireHull, "CSC", 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'P', + ItemList.Electric_Piston_HV, 'R', ItemList.Robot_Arm_HV, 'C', OrePrefixes.circuit.get(Materials.HV), + 'W', OrePrefixes.cableGt04.get(Materials.Gold), 'S', ItemList.Sensor_HV }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_BlastFurnace.get(1L), + bitsd, + new Object[] { "FFF", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_HeatProof, 'F', + OreDictNames.craftingIronFurnace, 'C', OrePrefixes.circuit.get(Materials.LV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_VacuumFreezer.get(1L), + bitsd, + new Object[] { aTextPlate, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_FrostProof, 'P', + ItemList.Electric_Pump_HV, 'C', OrePrefixes.circuit.get(Materials.EV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_ImplosionCompressor.get(1L), + bitsd, + new Object[] { "OOO", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_SolidSteel, 'O', + Ic2Items.reinforcedStone, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_Furnace.get(1L), + bitsd, + new Object[] { "FFF", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_HeatProof, 'F', + OreDictNames.craftingIronFurnace, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.AnnealedCopper) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_LargeBoiler_Bronze.get(1L), + bitsd, + new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Bronze, 'C', + OrePrefixes.circuit.get(Materials.MV), 'W', OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_LargeBoiler_Steel.get(1L), + bitsd, + new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Steel, 'C', + OrePrefixes.circuit.get(Materials.HV), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_LargeBoiler_Titanium.get(1L), + bitsd, + new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Titanium, 'C', + OrePrefixes.circuit.get(Materials.EV), 'W', OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_LargeBoiler_TungstenSteel.get(1L), + bitsd, + new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_TungstenSteel, + 'C', OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium) }); + + GTModHandler.addCraftingRecipe( + ItemList.Generator_Diesel_LV.get(1L), + bitsd, + new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Piston_LV, 'E', + ItemList.Electric_Motor_LV, 'C', OrePrefixes.circuit.get(Materials.LV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin), 'G', OrePrefixes.gearGt.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Diesel_MV.get(1L), + bitsd, + new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Piston_MV, 'E', + ItemList.Electric_Motor_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', OrePrefixes.gearGt.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Diesel_HV.get(1L), + bitsd, + new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Piston_HV, 'E', + ItemList.Electric_Motor_HV, 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold), 'G', OrePrefixes.gearGt.get(Materials.StainlessSteel) }); + + GTModHandler.addCraftingRecipe( + ItemList.Generator_Gas_Turbine_LV.get(1L), + bitsd, + new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'R', + OrePrefixes.rotor.get(Materials.Tin), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Gas_Turbine_MV.get(1L), + bitsd, + new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'R', + OrePrefixes.rotor.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt01.get(Materials.AnyCopper) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Gas_Turbine_HV.get(1L), + bitsd, + new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'R', + OrePrefixes.rotor.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Gas_Turbine_EV.get(1L), + bitsd, + new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_EV, 'E', ItemList.Electric_Motor_EV, 'R', + OrePrefixes.rotor.get(Materials.Titanium), 'C', OrePrefixes.circuit.get(Materials.EV), 'W', + OrePrefixes.cableGt01.get(Materials.Aluminium) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Gas_Turbine_IV.get(1L), + bitsd, + new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_IV, 'E', ItemList.Electric_Motor_IV, 'R', + OrePrefixes.rotor.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.IV), 'W', + OrePrefixes.cableGt01.get(Materials.Tungsten) }); + + GTModHandler.addCraftingRecipe( + ItemList.Generator_Steam_Turbine_LV.get(1L), + bitsd, + new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'R', + OrePrefixes.rotor.get(Materials.Tin), 'C', OrePrefixes.circuit.get(Materials.LV), 'W', + OrePrefixes.cableGt01.get(Materials.Tin), 'P', OrePrefixes.pipeMedium.get(Materials.Bronze) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Steam_Turbine_MV.get(1L), + bitsd, + new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'R', + OrePrefixes.rotor.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.MV), 'W', + OrePrefixes.cableGt01.get(Materials.AnyCopper), 'P', OrePrefixes.pipeMedium.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Steam_Turbine_HV.get(1L), + bitsd, + new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'R', + OrePrefixes.rotor.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.HV), 'W', + OrePrefixes.cableGt01.get(Materials.Gold), 'P', OrePrefixes.pipeMedium.get(Materials.StainlessSteel) }); + + if (!Thaumcraft.isModLoaded()) { + GTModHandler.addCraftingRecipe( + ItemList.MagicEnergyConverter_LV.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_LV, 'B', new ItemStack(Blocks.beacon), 'C', + OrePrefixes.circuit.get(Materials.HV), 'T', ItemList.Field_Generator_LV, 'F', + OrePrefixes.plate.get(Materials.Platinum) }); + GTModHandler.addCraftingRecipe( + ItemList.MagicEnergyConverter_MV.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_MV, 'B', new ItemStack(Blocks.beacon), 'C', + OrePrefixes.circuit.get(Materials.EV), 'T', ItemList.Field_Generator_MV, 'F', + OrePrefixes.plate.get(Materials.Iridium) }); + GTModHandler.addCraftingRecipe( + ItemList.MagicEnergyConverter_HV.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', new ItemStack(Blocks.beacon), 'C', + OrePrefixes.circuit.get(Materials.IV), 'T', ItemList.Field_Generator_HV, 'F', + OrePrefixes.plate.get(Materials.Neutronium) }); + + GTModHandler.addCraftingRecipe( + ItemList.MagicEnergyAbsorber_LV.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_LV, 'B', + ItemList.MagicEnergyConverter_LV.get(1L), 'C', OrePrefixes.circuit.get(Materials.HV), 'T', + ItemList.Field_Generator_LV, 'F', OrePrefixes.plate.get(Materials.Platinum) }); + GTModHandler.addCraftingRecipe( + ItemList.MagicEnergyAbsorber_MV.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_MV, 'B', + ItemList.MagicEnergyConverter_MV.get(1L), 'C', OrePrefixes.circuit.get(Materials.EV), 'T', + ItemList.Field_Generator_MV, 'F', OrePrefixes.plate.get(Materials.Iridium) }); + GTModHandler.addCraftingRecipe( + ItemList.MagicEnergyAbsorber_HV.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', + ItemList.MagicEnergyConverter_MV.get(1L), 'C', OrePrefixes.circuit.get(Materials.IV), 'T', + ItemList.Field_Generator_HV, 'F', OrePrefixes.plate.get(Materials.Europium) }); + GTModHandler.addCraftingRecipe( + ItemList.MagicEnergyAbsorber_EV.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', + ItemList.MagicEnergyConverter_HV.get(1L), 'C', OrePrefixes.circuit.get(Materials.LuV), 'T', + ItemList.Field_Generator_EV, 'F', OrePrefixes.plate.get(Materials.Neutronium) }); + } + GTModHandler.addCraftingRecipe( + ItemList.Casing_Fusion_Coil.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CTC", 'M', ItemList.Casing_Coil_Superconductor, 'C', + OrePrefixes.circuit.get(Materials.LuV), 'F', ItemList.Field_Generator_MV, 'T', + ItemList.Neutron_Reflector }); + + GTModHandler.addCraftingRecipe( + ItemList.Generator_Plasma_EV.get(1L), + bitsd, + new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_LuV, 'F', ItemList.Field_Generator_HV, 'C', + OrePrefixes.circuit.get(Materials.IV), 'W', OrePrefixes.cableGt04.get(Materials.Tungsten), 'U', + OrePrefixes.stick.get(Materials.Plutonium241) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Plasma_IV.get(1L), + bitsd, + new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_ZPM, 'F', ItemList.Field_Generator_EV, 'C', + OrePrefixes.circuit.get(Materials.LuV), 'W', OrePrefixes.wireGt04.get(Materials.VanadiumGallium), 'U', + OrePrefixes.stick.get(Materials.Europium) }); + GTModHandler.addCraftingRecipe( + ItemList.Generator_Plasma_LuV.get(1L), + bitsd, + new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_UV, 'F', ItemList.Field_Generator_IV, 'C', + OrePrefixes.circuit.get(Materials.ZPM), 'W', OrePrefixes.wireGt04.get(Materials.Naquadah), 'U', + OrePrefixes.stick.get(Materials.Americium) }); + + GTModHandler.addCraftingRecipe( + ItemList.Processing_Array.get(1L), + bitsd, + new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_EV, 'B', + OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.IV), 'F', + ItemList.Robot_Arm_EV, 'T', ItemList.Energy_LapotronicOrb }); + + ProcessingArrayRecipeLoader.registerDefaultGregtechMaps(); + GTModHandler.addCraftingRecipe( + ItemList.Distillation_Tower.get(1L), + bitsd, + new Object[] { "CBC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', + OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.EV), 'F', + ItemList.Electric_Pump_HV }); + + GTModHandler.addCraftingRecipe( + ItemList.LargeSteamTurbine.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_HV, 'B', + OrePrefixes.pipeLarge.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.HV), 'P', + OrePrefixes.gearGt.get(Materials.Steel) }); + GTModHandler.addCraftingRecipe( + ItemList.LargeGasTurbine.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_EV, 'B', + OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.EV), 'P', + OrePrefixes.gearGt.get(Materials.StainlessSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.LargeAdvancedGasTurbine.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_IV, 'B', + OrePrefixes.pipeLarge.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.LuV), 'P', + OrePrefixes.gearGt.get(Materials.HSSG) }); + + GTModHandler.addCraftingRecipe( + ItemList.Pump_LV.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_LV, 'B', + OrePrefixes.pipeLarge.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.LV), 'P', + ItemList.Electric_Pump_LV }); + GTModHandler.addCraftingRecipe( + ItemList.Pump_MV.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_MV, 'B', + OrePrefixes.pipeLarge.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.MV), 'P', + ItemList.Electric_Pump_MV }); + GTModHandler.addCraftingRecipe( + ItemList.Pump_HV.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_HV, 'B', + OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.HV), 'P', + ItemList.Electric_Pump_HV }); + GTModHandler.addCraftingRecipe( + ItemList.Pump_EV.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_EV, 'B', + OrePrefixes.pipeLarge.get(Materials.Titanium), 'C', OrePrefixes.circuit.get(Materials.EV), 'P', + ItemList.Electric_Pump_EV }); + GTModHandler.addCraftingRecipe( + ItemList.Pump_IV.get(1L), + bitsd, + new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_IV, 'B', + OrePrefixes.pipeLarge.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.IV), 'P', + ItemList.Electric_Pump_IV }); + + GTModHandler.addCraftingRecipe( + ItemList.MobRep_LV.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_LV, 'E', ItemList.Emitter_LV.get(1L), 'C', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.MobRep_MV.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_MV, 'E', ItemList.Emitter_MV.get(1L), 'C', + OrePrefixes.circuit.get(Materials.MV) }); + GTModHandler.addCraftingRecipe( + ItemList.MobRep_HV.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_HV, 'E', ItemList.Emitter_HV.get(1L), 'C', + OrePrefixes.circuit.get(Materials.HV) }); + GTModHandler.addCraftingRecipe( + ItemList.MobRep_EV.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_EV, 'E', ItemList.Emitter_EV.get(1L), 'C', + OrePrefixes.circuit.get(Materials.EV) }); + GTModHandler.addCraftingRecipe( + ItemList.MobRep_IV.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_IV, 'E', ItemList.Emitter_IV.get(1L), 'C', + OrePrefixes.circuit.get(Materials.IV) }); + GTModHandler.addCraftingRecipe( + ItemList.MobRep_LuV.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_LuV, 'E', ItemList.Emitter_LuV.get(1L), 'C', + OrePrefixes.circuit.get(Materials.LuV) }); + GTModHandler.addCraftingRecipe( + ItemList.MobRep_ZPM.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_ZPM, 'E', ItemList.Emitter_ZPM.get(1L), 'C', + OrePrefixes.circuit.get(Materials.ZPM) }); + GTModHandler.addCraftingRecipe( + ItemList.MobRep_UV.get(1L), + bitsd, + new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_UV, 'E', ItemList.Emitter_UV.get(1L), 'C', + OrePrefixes.circuit.get(Materials.UV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_HeatExchanger.get(1L), + bitsd, + new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Pipe_Titanium, 'C', + OrePrefixes.pipeMedium.get(Materials.Titanium), 'W', ItemList.Electric_Pump_EV }); + + GTModHandler.addCraftingRecipe( + ItemList.Charcoal_Pile.get(1L), + bitsd, + new Object[] { "EXE", "EME", "hCw", 'M', ItemList.Hull_HP_Bricks, 'E', + OrePrefixes.plate.get(Materials.AnyBronze), 'C', new ItemStack(Items.flint_and_steel, 1), 'X', + OrePrefixes.rotor.get(Materials.Steel), }); + + GTModHandler.addCraftingRecipe( + ItemList.Seismic_Prospector_Adv_LV.get(1L), + bitsd, + new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_LV, 'W', + OrePrefixes.plateDouble.get(Materials.Steel), 'E', OrePrefixes.circuit.get(Materials.LV), 'C', + ItemList.Sensor_LV, 'X', OrePrefixes.cableGt02.get(Materials.Tin) }); + GTModHandler.addCraftingRecipe( + ItemList.Seismic_Prospector_Adv_MV.get(1L), + bitsd, + new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_MV, 'W', + OrePrefixes.plateDouble.get(Materials.BlackSteel), 'E', OrePrefixes.circuit.get(Materials.MV), 'C', + ItemList.Sensor_MV, 'X', OrePrefixes.cableGt02.get(Materials.Copper) }); + GTModHandler.addCraftingRecipe( + ItemList.Seismic_Prospector_Adv_HV.get(1L), + bitsd, + new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_HV, 'W', + OrePrefixes.plateDouble.get(Materials.StainlessSteel), 'E', OrePrefixes.circuit.get(Materials.HV), 'C', + ItemList.Sensor_HV, 'X', OrePrefixes.cableGt04.get(Materials.Gold) }); + GTModHandler.addCraftingRecipe( + ItemList.Seismic_Prospector_Adv_EV.get(1L), + bitsd, + new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_EV, 'W', + OrePrefixes.plateDouble.get(Materials.VanadiumSteel), 'E', OrePrefixes.circuit.get(Materials.EV), 'C', + ItemList.Sensor_EV, 'X', OrePrefixes.cableGt04.get(Materials.Aluminium) }); + + GTModHandler.addCraftingRecipe( + ItemList.ConcreteBackfiller1.get(1L), + bitsd, + new Object[] { "WPW", "EME", "CQC", 'M', ItemList.Hull_MV, 'W', OrePrefixes.frameGt.get(Materials.Steel), + 'E', OrePrefixes.circuit.get(Materials.MV), 'C', ItemList.Electric_Motor_MV, 'P', + OrePrefixes.pipeLarge.get(Materials.Steel), 'Q', ItemList.Electric_Pump_MV }); + GTModHandler.addCraftingRecipe( + ItemList.ConcreteBackfiller2.get(1L), + bitsd, + new Object[] { "WPW", "EME", "CQC", 'M', ItemList.ConcreteBackfiller1, 'W', + OrePrefixes.frameGt.get(Materials.Titanium), 'E', OrePrefixes.circuit.get(Materials.EV), 'C', + ItemList.Electric_Motor_EV, 'P', OrePrefixes.pipeLarge.get(Materials.Steel), 'Q', + ItemList.Electric_Pump_EV }); + + GTModHandler.addCraftingRecipe( + ItemList.PyrolyseOven.get(1L), + bitsd, + new Object[] { "WEP", "EME", "WCP", 'M', ItemList.Hull_MV, 'W', ItemList.Electric_Piston_MV, 'P', + OrePrefixes.wireGt04.get(Materials.Cupronickel), 'E', OrePrefixes.circuit.get(Materials.MV), 'C', + ItemList.Electric_Pump_MV }); + + GTModHandler.addCraftingRecipe( + ItemList.OilCracker.get(1L), + bitsd, + new Object[] { aTextWireCoil, "EME", aTextWireCoil, 'M', ItemList.Hull_HV, 'W', + ItemList.Casing_Coil_Cupronickel, 'E', OrePrefixes.circuit.get(Materials.HV), 'C', + ItemList.Electric_Pump_HV }); + + GTModHandler.addCraftingRecipe( + ItemList.MicroTransmitter_HV.get(1L), + bitsd, + new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_HV, 'B', ItemList.Battery_RE_HV_Lithium, + 'C', ItemList.Emitter_HV, 'G', OrePrefixes.circuit.get(Materials.HV), 'P', + ItemList.Field_Generator_HV }); + GTModHandler.addCraftingRecipe( + ItemList.MicroTransmitter_EV.get(1L), + bitsd, + new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_EV, 'B', + GTModHandler.getIC2Item("lapotronCrystal", 1L, GTValues.W), 'C', ItemList.Emitter_EV, 'G', + OrePrefixes.circuit.get(Materials.EV), 'P', ItemList.Field_Generator_EV }); + GTModHandler.addCraftingRecipe( + ItemList.MicroTransmitter_IV.get(1L), + bitsd, + new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_IV, 'B', ItemList.Energy_LapotronicOrb, 'C', + ItemList.Emitter_IV, 'G', OrePrefixes.circuit.get(Materials.IV), 'P', ItemList.Field_Generator_IV }); + GTModHandler.addCraftingRecipe( + ItemList.MicroTransmitter_LUV.get(1L), + bitsd, + new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_LuV, 'B', ItemList.Energy_LapotronicOrb2, + 'C', ItemList.Emitter_LuV, 'G', OrePrefixes.circuit.get(Materials.LuV), 'P', + ItemList.Field_Generator_LuV }); + GTModHandler.addCraftingRecipe( + ItemList.MicroTransmitter_ZPM.get(1L), + bitsd, + new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_ZPM, 'B', ItemList.Energy_Module, 'C', + ItemList.Emitter_ZPM, 'G', OrePrefixes.circuit.get(Materials.ZPM), 'P', ItemList.Field_Generator_ZPM }); + GTModHandler.addCraftingRecipe( + ItemList.MicroTransmitter_UV.get(1L), + bitsd, + new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_UV, 'B', ItemList.Energy_Module, 'C', + ItemList.Emitter_UV, 'G', OrePrefixes.circuit.get(Materials.UV), 'P', ItemList.Field_Generator_UV }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_Assemblyline.get(1L), + bitsd, + new Object[] { aTextWireCoil, "EME", aTextWireCoil, 'M', ItemList.Hull_IV, 'W', ItemList.Casing_Assembler, + 'E', OrePrefixes.circuit.get(Materials.IV), 'C', ItemList.Robot_Arm_IV }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_DieselEngine.get(1L), + bitsd, + new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Piston_EV, 'E', + ItemList.Electric_Motor_EV, 'C', OrePrefixes.circuit.get(Materials.IV), 'W', + OrePrefixes.cableGt01.get(Materials.TungstenSteel), 'G', OrePrefixes.gearGt.get(Materials.Titanium) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_EngineIntake.get(4L), + bitsd, + new Object[] { "PhP", "RFR", aTextPlateWrench, 'R', OrePrefixes.pipeMedium.get(Materials.Titanium), 'F', + ItemList.Casing_StableTitanium, 'P', OrePrefixes.rotor.get(Materials.Titanium) }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_ExtremeDieselEngine.get(1L), + bitsd, + new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Piston_IV, 'E', + ItemList.Electric_Motor_IV, 'C', OrePrefixes.circuit.get(Materials.LuV), 'W', + OrePrefixes.cableGt01.get(Materials.HSSG), 'G', OrePrefixes.gearGt.get(Materials.TungstenSteel) }); + GTModHandler.addCraftingRecipe( + ItemList.Casing_ExtremeEngineIntake.get(4L), + bitsd, + new Object[] { "PhP", "RFR", aTextPlateWrench, 'R', OrePrefixes.pipeMedium.get(Materials.TungstenSteel), + 'F', ItemList.Casing_RobustTungstenSteel, 'P', OrePrefixes.rotor.get(Materials.TungstenSteel) }); + + // If Cleanroom is enabled, add a recipe, else hide from NEI. + if (GTMod.gregtechproxy.mEnableCleanroom) { + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_Cleanroom.get(1L), + bitsd, + new Object[] { "FFF", "RHR", "MCM", 'H', ItemList.Hull_HV, 'F', ItemList.Component_Filter, 'R', + OrePrefixes.rotor.get(Materials.StainlessSteel), 'M', ItemList.Electric_Motor_HV, 'C', + OrePrefixes.circuit.get(Materials.HV) }); + } else { + if (NotEnoughItems.isModLoaded()) { + API.hideItem(ItemList.Machine_Multi_Cleanroom.get(1L)); + } + } + + GTModHandler.addCraftingRecipe( + ItemList.Machine_HV_LightningRod.get(1L), + bitsd, + new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_LuV, 'L', ItemList.Energy_LapotronicOrb, 'T', + ItemList.Transformer_ZPM_LuV }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_EV_LightningRod.get(1L), + bitsd, + new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_ZPM, 'L', ItemList.Energy_LapotronicOrb2, 'T', + ItemList.Transformer_UV_ZPM }); + GTModHandler.addCraftingRecipe( + ItemList.Machine_IV_LightningRod.get(1L), + bitsd, + new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_UV, 'L', ItemList.ZPM2, 'T', + ItemList.Transformer_MAX_UV }); + + GTModHandler.addCraftingRecipe( + ItemList.Machine_Multi_LargeChemicalReactor.get(1L), + bitsd, + new Object[] { "CRC", "PMP", "CBC", 'C', OrePrefixes.circuit.get(Materials.HV), 'R', + OrePrefixes.rotor.get(Materials.StainlessSteel), 'P', + OrePrefixes.pipeLarge.get(Materials.Polytetrafluoroethylene), 'M', ItemList.Electric_Motor_HV, 'B', + ItemList.Hull_HV }); + + // Add Drone down link hatch + GTModHandler.addCraftingRecipe( + ItemList.Hatch_DroneDownLink.get(1L), + bits, + new Object[] { " S ", "CMC", "RRR", 'M', ItemList.Hatch_Maintenance, 'S', ItemList.Sensor_IV, 'R', + new ItemStack(GregTechAPI.sBlockReinforced, 1, 9), 'C', ItemList.Conveyor_Module_EV }); + + // And Drone Centre + GTValues.RA.stdBuilder() + .itemInputs( + ItemList.Casing_Assembler.get(1), + ItemList.Cover_SolarPanel_HV.get(4), + ItemList.Conveyor_Module_IV.get(2), + ItemList.Robot_Arm_IV.get(2), + ItemList.Sensor_IV.get(2), + ItemList.Energy_LapotronicOrb.get(4), + ItemList.Cover_WirelessNeedsMaintainance.get(1), + GalacticraftCore.isModLoaded() ? GTModHandler.getModItem(GalacticraftCore.ID, "item.basicItem", 1, 19) + : ItemList.Sensor_EV.get(4)) + .itemOutputs(ItemList.Machine_Multi_DroneCentre.get(1L)) + .fluidInputs(Materials.AdvancedGlue.getFluid(8000L)) + .duration(30 * SECONDS) + .eut(TierEU.RECIPE_IV) + .addTo(assemblerRecipes); + } + + private static void registerShapelessCraftingRecipes() { + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_Stripes_A }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_Stripes_B }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_RadioactiveHazard }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_BioHazard }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_ExplosionHazard }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_FireHazard }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_AcidHazard }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_MagicHazard }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_FrostHazard }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.Casing_SolidSteel.get(1L), + bits, + new Object[] { ItemList.Casing_NoiseHazard }); + + if (Forestry.isModLoaded() && Gendustry.isModLoaded()) { + /* Conversion recipes */ + // TODO: Move those recipes with the other recipes + + GTModHandler.addShapelessCraftingRecipe( + ItemList.Machine_IndustrialApiary.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "IndustrialApiary", 1, 0) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_Frame.get(1), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "UpgradeFrame", 1) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_PRODUCTION.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 0) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_PLAINS.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 17) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_LIGHT.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 11) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_FLOWERING.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 2) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_WINTER.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 20) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_DRYER.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 5) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_AUTOMATION.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 14) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 4) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_HELL.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 13) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_POLLEN.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 22) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_DESERT.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 16) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_COOLER.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 7) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_LIFESPAN.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 1) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_SEAL.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 10) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_STABILIZER.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 19) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_JUNGLE.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 18) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_TERRITORY.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 3) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_OCEAN.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 21) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_SKY.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 12) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_HEATER.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 6) }); + GTModHandler.addShapelessCraftingRecipe( + ItemList.IndustrialApiary_Upgrade_SIEVE.get(1L), + new Object[] { GTModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 15) }); + + } + } + + private static void run4() { + long bits = GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.NOT_REMOVABLE + | GTModHandler.RecipeBits.REVERSIBLE + | GTModHandler.RecipeBits.BUFFERED; + + // high pressure fluid pipes + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(OrePrefixes.pipeSmall, Materials.TungstenSteel, 1L), + ItemList.Electric_Pump_EV.get(1L), + GTUtility.getIntegratedCircuit(5)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeSmall, Materials.Ultimate, 1L)) + .duration(15 * SECONDS) + .eut(TierEU.RECIPE_EV) + .addTo(assemblerRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(OrePrefixes.pipeMedium, Materials.TungstenSteel, 1L), + ItemList.Electric_Pump_IV.get(1L), + GTUtility.getIntegratedCircuit(5)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Ultimate, 1L)) + .duration(20 * SECONDS) + .eut(4096) + .addTo(assemblerRecipes); + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 1L), + ItemList.Electric_Pump_IV.get(2L), + GTUtility.getIntegratedCircuit(5)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Ultimate, 1L)) + .duration(30 * SECONDS) + .eut(TierEU.RECIPE_IV) + .addTo(assemblerRecipes); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_ULV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.ULV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_LV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_MV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.MV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_HV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.HV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_EV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.EV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_IV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.IV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_LuV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LuV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_ZPM.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.ZPM) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_UV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.UV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ChestBuffer_UHV.get(1L), + bits, + new Object[] { "CMV", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.UHV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_ULV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_LV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_MV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_HV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_EV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_IV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_LuV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_ZPM.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_UV.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Filter_MAX.get(1L), + bits, + new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_ULV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_LV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_MV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_HV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_EV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_IV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_LuV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_ZPM.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_UV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_TypeFilter_MAX.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_ULV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_ULV, 'V', ItemList.Robot_Arm_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_LV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_LV, 'V', ItemList.Robot_Arm_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_MV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_MV, 'V', ItemList.Robot_Arm_MV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_HV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_HV, 'V', ItemList.Robot_Arm_HV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_EV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_EV, 'V', ItemList.Robot_Arm_EV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_IV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_IV, 'V', ItemList.Robot_Arm_IV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_LuV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_LuV, 'V', ItemList.Robot_Arm_LuV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_ZPM.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_ZPM, 'V', ItemList.Robot_Arm_ZPM, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_UV.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_UV, 'V', ItemList.Robot_Arm_UV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_Regulator_MAX.get(1L), + bits, + new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_MAX, 'V', ItemList.Robot_Arm_UHV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_ULV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_ULV, 'V', ItemList.Conveyor_Module_LV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_LV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_LV, 'V', ItemList.Conveyor_Module_LV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_MV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_MV, 'V', ItemList.Conveyor_Module_MV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_HV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_HV, 'V', ItemList.Conveyor_Module_HV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_EV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_EV, 'V', ItemList.Conveyor_Module_EV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_IV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_IV, 'V', ItemList.Conveyor_Module_IV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_LuV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_LuV, 'V', ItemList.Conveyor_Module_LuV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_ZPM.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_UV.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_UV, 'V', ItemList.Conveyor_Module_UV, 'D', + ItemList.Tool_DataOrb }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_MAX.get(1L), + bits, + new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_UHV, 'V', ItemList.Conveyor_Module_UHV, 'D', + ItemList.Tool_DataOrb }); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_ULV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_LV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_MV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_HV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_EV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_IV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_LuV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_ZPM.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_UV.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'D', + ItemList.Tool_DataStick }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_SuperBuffer_MAX.get(1L), + bits, + new Object[] { "DMV", "DDD", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'D', + ItemList.Tool_DataStick }); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_ULV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_LV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_MV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_HV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_EV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_IV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_LuV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_ZPM.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_UV.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_ItemDistributor_MAX.get(1L), + bits, + new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C', + OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.LV) }); + + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_ULV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Robot_Arm_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_LV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Robot_Arm_LV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_MV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Robot_Arm_MV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_HV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Robot_Arm_HV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_EV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Robot_Arm_EV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_IV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Robot_Arm_IV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_LuV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Robot_Arm_LuV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_ZPM.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Robot_Arm_ZPM, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_UV.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Robot_Arm_UV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + GTModHandler.addCraftingRecipe( + ItemList.Automation_RecipeFilter_MAX.get(1L), + bits, + new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Robot_Arm_UHV, 'C', + OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X', + OrePrefixes.circuit.get(Materials.LV) }); + } + + @Override + public void run() { + registerShapelessCraftingRecipes(); + registerShapedCraftingRecipes(); + GTLog.out.println("GTMod: Recipes for MetaTileEntities."); + registerMachineTypes(); + PCBFactoryMaterialLoader.load(); + run4(); + } +} diff --git a/src/main/java/gregtech/loaders/load/SonictronLoader.java b/src/main/java/gregtech/loaders/load/SonictronLoader.java new file mode 100644 index 0000000000..be83b213db --- /dev/null +++ b/src/main/java/gregtech/loaders/load/SonictronLoader.java @@ -0,0 +1,159 @@ +package gregtech.loaders.load; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +import gregtech.GTMod; +import gregtech.api.enums.SoundResource; +import gregtech.api.util.GTLog; + +public class SonictronLoader implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Loading Sonictron Sounds"); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.iron_block, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_HARP.toString()); + GTMod.gregtechproxy.mSoundCounts.add(25); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.gold_block, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_PLING.toString()); + GTMod.gregtechproxy.mSoundCounts.add(25); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.stone, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BD.toString()); + GTMod.gregtechproxy.mSoundCounts.add(25); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.log, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASSATTACK.toString()); + GTMod.gregtechproxy.mSoundCounts.add(25); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.planks, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASS.toString()); + GTMod.gregtechproxy.mSoundCounts.add(25); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.glass, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_HAT.toString()); + GTMod.gregtechproxy.mSoundCounts.add(25); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.sand, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASS.toString()); + GTMod.gregtechproxy.mSoundCounts.add(25); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.record_cat, 1)); + GTMod.gregtechproxy.mSoundNames.add("streaming."); + GTMod.gregtechproxy.mSoundCounts.add(12); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.tnt, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_EXPLODE.toString()); + GTMod.gregtechproxy.mSoundCounts.add(3); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.fire, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.FIRE_FIRE.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.flint_and_steel, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.FIRE_IGNITE.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.lava, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_LAVAPOP.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.water, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_WATER.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.water_bucket, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_SPLASH.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.lava_bucket, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_FIZZ.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.portal, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_PORTAL.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.end_portal, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_TRAVEL.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.end_portal_frame, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_TRIGGER.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.glass_pane, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_GLASS.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.ender_pearl, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_ORB.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.ender_eye, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_LEVELUP.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.stone_button, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CLICK.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.cobblestone, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_FALLBIG.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.dirt, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_FALLSMALL.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_sword, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_HURTFLESH.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.diamond_sword, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_HURT.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.bow, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BOW.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.arrow, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DRR.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.fishing_rod, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BOWHIT.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_shovel, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BREAK.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.bucket, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BREATH.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.potionitem, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DRINK.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.glass_bottle, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BURP.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems + .add(new ItemStack(Blocks.ender_chest == null ? Blocks.obsidian : Blocks.ender_chest, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CHESTOPEN.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.chest, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CHESTCLOSED.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_door, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DOOR_OPEN.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.wooden_door, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DOOR_CLOSE.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Items.porkchop, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_EAT.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.wool, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.STEP_CLOTH.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.grass, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.STEP_GRASS.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.gravel, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.STEP_GRAVEL.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.snow, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.STEP_SNOW.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.piston, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.TILE_PISTON_OUT.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.sticky_piston, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.TILE_PISTON_IN.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.mossy_cobblestone, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_CAVE_CAVE.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.lapis_block, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_WEATHER_RAIN.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + GTMod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.diamond_block, 1)); + GTMod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_WEATHER_THUNDER.toString()); + GTMod.gregtechproxy.mSoundCounts.add(1); + } +} diff --git a/src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java b/src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java index 4fb7388367..6784c32bfc 100644 --- a/src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java +++ b/src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java @@ -1,12 +1,12 @@ package gregtech.loaders.materialprocessing; -import gregtech.api.enums.GTNH_ExtraMaterials; import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsGTNH; public class ProcessingConfig implements gregtech.api.interfaces.IMaterialHandler { public ProcessingConfig() { - new GTNH_ExtraMaterials(); + new MaterialsGTNH(); Materials.add(this); } @@ -15,7 +15,7 @@ public class ProcessingConfig implements gregtech.api.interfaces.IMaterialHandle *
* *
-     * int numberOfMaterialSlots = GregTech_API.sMaterialProperties.get("general", "AmountOfCustomMaterialSlots", 16);
+     * int numberOfMaterialSlots = GregTechAPI.sMaterialProperties.get("general", "AmountOfCustomMaterialSlots", 16);
      * for (int i = 0; i < numberOfMaterialSlots; i++) {
      *     String aID = (i < 10 ? "0" : "") + i;
      *     new Materials(
diff --git a/src/main/java/gregtech/loaders/materials/MaterialsInit1.java b/src/main/java/gregtech/loaders/materials/MaterialsInit1.java
index 964fcc5c8f..b32ddde894 100644
--- a/src/main/java/gregtech/loaders/materials/MaterialsInit1.java
+++ b/src/main/java/gregtech/loaders/materials/MaterialsInit1.java
@@ -160,7 +160,7 @@ import gregtech.api.enums.Dyes;
 import gregtech.api.enums.Element;
 import gregtech.api.enums.MaterialBuilder;
 import gregtech.api.enums.Materials;
-import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TCAspects;
 import gregtech.api.enums.TextureSet;
 import gregtech.api.enums.TierEU;
 import gregtech.api.objects.MaterialStack;
@@ -169,101 +169,101 @@ public class MaterialsInit1 {
 
     public static void load() {
         // spotless:off
-        Materials.Aluminium               = new Materials(  19, TextureSet.SET_DULL              ,  10.0F,    128,  2, 1|2  |8   |32|64|128      , 128, 200, 240,   0,   "Aluminium"               ,   "Aluminium"                     ,    0,       0,        933, 1700,  true, false,   3,   1,   1, Dyes.dyeLightBlue   , Element.Al        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 1))).disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.Americium               = new Materials( 103, TextureSet.SET_METALLIC          ,   1.0F,      0,  3, 1|2  |8   |32             , 200, 200, 200,   0,   "Americium"               ,   "Americium"                     ,    0,       0,       1449,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Am        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Antimony                = new Materials(  58, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 220, 220, 240,   0,   "Antimony"                ,   "Antimony"                      ,    0,       0,        903,    0, false, false,   2,   1,   1, Dyes.dyeLightGray   , Element.Sb        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)));
-        Materials.Argon                   = new Materials(  24, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0, 255,   0, 240,   "Argon"                   ,   "Argon"                         ,    0,       0,         83,    0, false,  true,   5,   1,   1, Dyes.dyeGreen       , Element.Ar        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 2)));
-        Materials.Arsenic                 = new Materials(  39, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8|16|32             , 255, 255, 255,   0,   "Arsenic"                 ,   "Arsenic"                       ,    0,       0,       1090,    0, false, false,   3,   1,   1, Dyes.dyeOrange      , Element.As        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 3)));
-        Materials.Barium                  = new Materials(  63, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 255, 255,   0,   "Barium"                  ,   "Barium"                        ,    0,       0,       1000,    0, false, false,   1,   1,   1, Dyes._NULL          , Element.Ba        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 3)));
-        Materials.Beryllium               = new Materials(   8, TextureSet.SET_METALLIC          ,  14.0F,     64,  2, 1|2  |8   |32|64          , 100, 180, 100,   0,   "Beryllium"               ,   "Beryllium"                     ,    0,       0,       1560,    0, false, false,   6,   1,   1, Dyes.dyeGreen       , Element.Be        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1)));
-        Materials.Bismuth                 = new Materials(  90, TextureSet.SET_METALLIC          ,   6.0F,     64,  1, 1|2  |8   |32|64|128      , 100, 160, 160,   0,   "Bismuth"                 ,   "Bismuth"                       ,    0,       0,        544,    0, false, false,   2,   1,   1, Dyes.dyeCyan        , Element.Bi        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
-        Materials.Boron                   = new Materials(   9, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1         |32             , 210, 250, 210,   0,   "Boron"                   ,   "Boron"                         ,    0,       0,       2349,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , Element.B         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3)));
-        Materials.Caesium                 = new Materials(  62, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 176, 196, 222,   0,   "Caesium"                 ,   "Caesium"                       ,    0,       0,        301,    0, false, false,   4,   1,   1, Dyes._NULL          , Element.Cs        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Calcium                 = new Materials(  26, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1         |32             , 255, 245, 245,   0,   "Calcium"                 ,   "Calcium"                       ,    0,       0,       1115, 1115,  true, false,   4,   1,   1, Dyes.dyePink        , Element.Ca        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1)));
-        Materials.Carbon                  = new Materials(  10, TextureSet.SET_DULL              ,   1.0F,     64,  2, 1|2    |16|32|64|128      ,  20,  20,  20,   0,   "Carbon"                  ,   "Carbon"                        ,    0,       0,       3800,    0, false, false,   2,   1,   1, Dyes.dyeBlack       , Element.C         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)));
-        Materials.Cadmium                 = new Materials(  55, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1    |8   |32             ,  50,  50,  60,   0,   "Cadmium"                 ,   "Cadmium"                       ,    0,       0,        594,    0, false, false,   3,   1,   1, Dyes.dyeGray        , Element.Cd        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1)));
-        Materials.Cerium                  = new Materials(  65, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 123, 212, 144,   0,   "Cerium"                  ,   "Cerium"                        ,    0,       0,       1068, 1068,  true, false,   4,   1,   1, Dyes._NULL          , Element.Ce        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Chlorine                = new Materials(  23, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255, 255,   0,   "Chlorine"                ,   "Chlorine"                      ,    0,       0,        171,    0, false, false,   2,   1,   1, Dyes.dyeCyan        , Element.Cl        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.PANNUS, 1)));
-        Materials.Chrome                  = new Materials(  30, TextureSet.SET_SHINY             ,  11.0F,    256,  3, 1|2  |8   |32|64|128      , 255, 230, 230,   0,   "Chrome"                  ,   "Chrome"                        ,    0,       0,       2180, 1700,  true, false,   5,   1,   1, Dyes.dyePink        , Element.Cr        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1)));
-        Materials.Cobalt                  = new Materials(  33, TextureSet.SET_METALLIC          ,   8.0F,    512,  3, 1|2  |8   |32|64|128      ,  80,  80, 250,   0,   "Cobalt"                  ,   "Cobalt"                        ,    0,       0,       1768, 1700,  true, false,   3,   1,   1, Dyes.dyeBlue        , Element.Co        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1))).disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.Copper                  = new Materials(  35, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1|2  |8   |32   |128      , 255, 100,   0,   0,   "Copper"                  ,   "Copper"                        ,    0,       0,       1357,    0, false, false,   3,   1,   1, Dyes.dyeOrange      , Element.Cu        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1)));
-        Materials.Deuterium               = new Materials(   2, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255,   0, 240,   "Deuterium"               ,   "Deuterium"                     ,    0,       0,         14,    0, false,  true,  10,   1,   1, Dyes.dyeYellow      , Element.D         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 3)));
-        Materials.Dysprosium              = new Materials(  73, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 105, 209,  80,   0,   "Dysprosium"              ,   "Dysprosium"                    ,    0,       0,       1680, 1680,  true, false,   4,   1,   1, Dyes._NULL          , Element.Dy        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3)));
-        Materials.Empty                   = new Materials(   0, TextureSet.SET_NONE              ,   1.0F,      0,  2, 256/*Only when needed*/   , 255, 255, 255, 255,   "Empty"                   ,   "Empty"                         ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes._NULL          , Element._NULL     , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2)));
-        Materials.Erbium                  = new Materials(  75, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 176, 152,  81,   0,   "Erbium"                  ,   "Erbium"                        ,    0,       0,       1802, 1802,  true, false,   4,   1,   1, Dyes._NULL          , Element.Er        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Europium                = new Materials(  70, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 246, 181, 255,   0,   "Europium"                ,   "Europium"                      ,    0,       0,       1099, 1099,  true, false,   4,   1,   1, Dyes._NULL          , Element.Eu        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Fluorine                = new Materials(  14, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255, 255, 127,   "Fluorine"                ,   "Fluorine"                      ,    0,       0,         53,    0, false,  true,   2,   1,   1, Dyes.dyeGreen       , Element.F         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2)));
-        Materials.Gadolinium              = new Materials(  71, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  59, 186,  28,   0,   "Gadolinium"              ,   "Gadolinium"                    ,    0,       0,       1585, 1585,  true, false,   4,   1,   1, Dyes._NULL          , Element.Gd        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Gallium                 = new Materials(  37, TextureSet.SET_SHINY             ,   1.0F,     64,  2, 1|2  |8   |32             , 220, 220, 255,   0,   "Gallium"                 ,   "Gallium"                       ,    0,       0,        302,    0, false, false,   5,   1,   1, Dyes.dyeLightGray   , Element.Ga        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
-        Materials.Gold                    = new Materials(  86, TextureSet.SET_SHINY             ,  12.0F,     64,  2, 1|2  |8   |32|64|128      , 255, 255,  30,   0,   "Gold"                    ,   "Gold"                          ,    0,       0,       1337,    0, false, false,   4,   1,   1, Dyes.dyeYellow      , Element.Au        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 2)));
-        Materials.Holmium                 = new Materials(  74, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  22,   8, 166,   0,   "Holmium"                 ,   "Holmium"                       ,    0,       0,       1734, 1734,  true, false,   4,   1,   1, Dyes._NULL          , Element.Ho        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Hydrogen                = new Materials(   1, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0,   0, 255, 240,   "Hydrogen"                ,   "Hydrogen"                      ,    1,      20,         14,    0, false,  true,   2,   1,   1, Dyes.dyeBlue        , Element.H         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)));
-        Materials.Helium                  = new Materials(   4, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255,   0, 240,   "Helium"                  ,   "Helium"                        ,    0,       0,          1,    0, false,  true,   5,   1,   1, Dyes.dyeYellow      , Element.He        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 2)));
-        Materials.Helium_3                = new Materials(   5, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255,   0, 240,   "Helium_3"                ,   "Helium-3"                      ,    0,       0,          1,    0, false,  true,  10,   1,   1, Dyes.dyeYellow      , Element.He_3      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 3)));
-        Materials.Indium                  = new Materials(  56, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  64,   0, 128,   0,   "Indium"                  ,   "Indium"                        ,    0,       0,        429,    0, false, false,   4,   1,   1, Dyes.dyeGray        , Element.In        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Iridium                 = new Materials(  84, TextureSet.SET_DULL              ,   6.0F,   2560,  3, 1|2  |8   |32|64|128      , 240, 240, 245,   0,   "Iridium"                 ,   "Iridium"                       ,    0,       0,       2719, 4500,  true, false,  10,   1,   1, Dyes.dyeWhite       , Element.Ir        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Iron                    = new Materials(  32, TextureSet.SET_METALLIC          ,   6.0F,    256,  2, 1|2  |8   |32|64|128      , 200, 200, 200,   0,   "Iron"                    ,   "Iron"                          ,    0,       0,       1811,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Fe        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3)));
-        Materials.Lanthanum               = new Materials(  64, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 138, 138, 138,   0,   "Lanthanum"               ,   "Lanthanum"                     ,    0,       0,       1193, 1193,  true, false,   4,   1,   1, Dyes._NULL          , Element.La        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Lead                    = new Materials(  89, TextureSet.SET_DULL              ,   8.0F,     64,  1, 1|2  |8   |32|64|128      , 140, 100, 140,   0,   "Lead"                    ,   "Lead"                          ,    0,       0,        600,    0, false, false,   3,   1,   1, Dyes.dyePurple      , Element.Pb        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1)));
-        Materials.Lithium                 = new Materials(   6, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8   |32             , 225, 220, 255,   0,   "Lithium"                 ,   "Lithium"                       ,    0,       0,        454,    0, false, false,   4,   1,   1, Dyes.dyeLightBlue   , Element.Li        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2)));
-        Materials.Lutetium                = new Materials(  78, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 188,  62, 199,   0,   "Lutetium"                ,   "Lutetium"                      ,    0,       0,       1925, 1925,  true, false,   4,   1,   1, Dyes._NULL          , Element.Lu        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Magic                   = new Materials(-128, TextureSet.SET_SHINY             ,   8.0F,   5120,  5, 1|2|4|8|16|32|64|128      , 100,   0, 200,   0,   "Magic"                   ,   "Magic"                         ,    5,      32,       5000,    0, false, false,   7,   1,   1, Dyes.dyePurple      , Element.Ma        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 4)));
-        Materials.Magnesium               = new Materials(  18, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 200, 200,   0,   "Magnesium"               ,   "Magnesium"                     ,    0,       0,        923,    0, false, false,   3,   1,   1, Dyes.dyePink        , Element.Mg        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1)));
-        Materials.Manganese               = new Materials(  31, TextureSet.SET_DULL              ,   7.0F,    512,  2, 1|2  |8   |32|64          , 250, 250, 250,   0,   "Manganese"               ,   "Manganese"                     ,    0,       0,       1519,    0, false, false,   3,   1,   1, Dyes.dyeWhite       , Element.Mn        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3)));
-        Materials.Mercury                 = new Materials(  87, TextureSet.SET_SHINY             ,   1.0F,      0,  0,         16|32             , 255, 220, 220,   0,   "Mercury"                 ,   "Mercury"                       ,    5,      32,        234,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Hg        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1)));
-        Materials.Molybdenum              = new Materials(  48, TextureSet.SET_SHINY             ,   7.0F,    512,  2, 1|2  |8   |32|64          , 180, 180, 220,   0,   "Molybdenum"              ,   "Molybdenum"                    ,    0,       0,       2896,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , Element.Mo        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
-        Materials.Neodymium               = new Materials(  67, TextureSet.SET_METALLIC          ,   7.0F,    512,  2, 1|2  |8   |32|64|128      , 100, 100, 100,   0,   "Neodymium"               ,   "Neodymium"                     ,    0,       0,       1297, 1297,  true, false,   4,   1,   1, Dyes._NULL          , Element.Nd        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 2)));
-        Materials.Neutronium              = new Materials( 129, TextureSet.SET_DULL              ,  24.0F, 655360,  6, 1|2  |8   |32|64|128      , 250, 250, 250,   0,   "Neutronium"              ,   "Neutronium"                    ,    0,       0,      10000, 10000, true, false,  20,   1,   1, Dyes.dyeWhite       , Element.Nt        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 2))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe().setProcessingMaterialTierEU(TierEU.RECIPE_LuV);
-        Materials.Nickel                  = new Materials(  34, TextureSet.SET_METALLIC          ,   6.0F,     64,  2, 1|2  |8   |32|64|128      , 200, 200, 250,   0,   "Nickel"                  ,   "Nickel"                        ,    0,       0,       1728,    0, false, false,   4,   1,   1, Dyes.dyeLightBlue   , Element.Ni        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)));
-        Materials.Niobium                 = new Materials(  47, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 190, 180, 200,   0,   "Niobium"                 ,   "Niobium"                       ,    0,       0,       2750, 2750,  true, false,   5,   1,   1, Dyes._NULL          , Element.Nb        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
-        Materials.Nitrogen                = new Materials(  12, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0, 150, 200, 240,   "Nitrogen"                ,   "Nitrogen"                      ,    0,       0,         63,    0, false,  true,   2,   1,   1, Dyes.dyeCyan        , Element.N         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 2)));
-        Materials.Osmium                  = new Materials(  83, TextureSet.SET_METALLIC          ,  16.0F,   1280,  4, 1|2  |8   |32|64|128      ,  50,  50, 255,   0,   "Osmium"                  ,   "Osmium"                        ,    0,       0,       3306, 4500,  true, false,  10,   1,   1, Dyes.dyeBlue        , Element.Os        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Oxygen                  = new Materials(  13, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0, 100, 200, 240,   "Oxygen"                  ,   "Oxygen"                        ,    0,       0,         54,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , Element.O         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 1)));
-        Materials.Palladium               = new Materials(  52, TextureSet.SET_SHINY             ,   8.0F,    512,  4, 1|2  |8   |32|64|128      , 128, 128, 128,   0,   "Palladium"               ,   "Palladium"                     ,    0,       0,       1828, 1828,  true, false,   4,   1,   1, Dyes.dyeGray        , Element.Pd        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Phosphorus              = new Materials(  21, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1         |32             , 255, 255,   0,   0,   "Phosphorus"              ,   "Phosphorus"                    ,    0,       0,        317,    0, false, false,   2,   1,   1, Dyes.dyeYellow      , Element.P         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1)));
-        Materials.Platinum                = new Materials(  85, TextureSet.SET_SHINY             ,  12.0F,     64,  4, 1|2  |8   |32|64|128      , 255, 255, 200,   0,   "Platinum"                ,   "Platinum"                      ,    0,       0,       2041,    0, false, false,   6,   1,   1, Dyes.dyeOrange      , Element.Pt        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1)));
-        Materials.Plutonium               = new Materials( 100, TextureSet.SET_METALLIC          ,   6.0F,    512,  3, 1|2  |8   |32|64          , 240,  50,  50,   0,   "Plutonium"               ,   "Plutonium 239"                 ,    0,       0,        912,    0, false, false,   6,   1,   1, Dyes.dyeLime        , Element.Pu        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 2)));
-        Materials.Plutonium241            = new Materials( 101, TextureSet.SET_SHINY             ,   6.0F,    512,  3, 1|2  |8   |32|64          , 250,  70,  70,   0,   "Plutonium241"            ,   "Plutonium 241"                 ,    0,       0,        912,    0, false, false,   6,   1,   1, Dyes.dyeLime        , Element.Pu_241    , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 3)));
-        Materials.Potassium               = new Materials(  25, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1|2       |32             , 154, 172, 223,   0,   "Potassium"               ,   "Potassium"                     ,    0,       0,        336,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , Element.K         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1)));
-        Materials.Praseodymium            = new Materials(  66, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8   |32             , 117, 214, 129,   0,   "Praseodymium"            ,   "Praseodymium"                  ,    0,       0,       1208, 1208,  true, false,   4,   1,   1, Dyes._NULL          , Element.Pr        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Promethium              = new Materials(  68, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  36, 181,  53,   0,   "Promethium"              ,   "Promethium"                    ,    0,       0,       1315, 1315,  true, false,   4,   1,   1, Dyes._NULL          , Element.Pm        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Radon                   = new Materials(  93, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255,   0, 255, 240,   "Radon"                   ,   "Radon"                         ,    0,       0,        202,    0, false,  true,   5,   1,   1, Dyes.dyePurple      , Element.Rn        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Rubidium                = new Materials(  43, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 240,  30,  30,   0,   "Rubidium"                ,   "Rubidium"                      ,    0,       0,        312,    0, false, false,   4,   1,   1, Dyes.dyeRed         , Element.Rb        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)));
-        Materials.Samarium                = new Materials(  69, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 255, 204,   0,   "Samarium"                ,   "Samarium"                      ,    0,       0,       1345, 1345,  true, false,   4,   1,   1, Dyes.dyeWhite       , Element.Sm        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO,10)));
-        Materials.Scandium                = new Materials(  27, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 204, 204, 204,   0,   "Scandium"                ,   "Scandium"                      ,    0,       0,       1814, 1814,  true, false,   2,   1,   1, Dyes.dyeYellow      , Element.Sc        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Silicon                 = new Materials(  20, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  60,  60,  80,   0,   "Silicon"                 ,   "Raw Silicon"                   ,    0,       0,       2273, 2273,  true, false,   1,   1,   1, Dyes.dyeBlack       , Element.Si        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 1)));
-        Materials.Silver                  = new Materials(  54, TextureSet.SET_SHINY             ,  10.0F,     64,  2, 1|2  |8   |32|64|128      , 220, 220, 255,   0,   "Silver"                  ,   "Silver"                        ,    0,       0,       1234,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Ag        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1)));
-        Materials.Sodium                  = new Materials(  17, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1      |16|32             ,   0,   0, 150,   0,   "Sodium"                  ,   "Sodium"                        ,    0,       0,        370,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , Element.Na        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 1)));
-        Materials.Strontium               = new Materials(  44, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8   |32             , 200, 200, 200,   0,   "Strontium"               ,   "Strontium"                     ,    0,       0,       1050,    0, false, false,   1,   1,   1, Dyes.dyeLightGray   , Element.Sr        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 1)));
-        Materials.Sulfur                  = new Materials(  22, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8   |32             , 200, 200,   0,   0,   "Sulfur"                  ,   "Sulfur"                        ,    0,       0,        388,    0, false, false,   2,   1,   1, Dyes.dyeYellow      , Element.S         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)));
-        Materials.Tantalum                = new Materials(  80, TextureSet.SET_SHINY             ,   6.0F,   2560,  3, 1|2  |8   |32             , 105, 183, 255,   0,   "Tantalum"                ,   "Tantalum"                      ,    0,       0,       3290, 3290,  true, false,   4,   1,   1, Dyes._NULL          , Element.Ta        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Tellurium               = new Materials(  59, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8   |32             , 206, 277,  86,   0,   "Tellurium"               ,   "Tellurium"                     ,    0,       0,        722,    0, false, false,   4,   1,   1, Dyes.dyeGray        , Element.Te        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Terbium                 = new Materials(  72, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 255, 255,   0,   "Terbium"                 ,   "Terbium"                       ,    0,       0,       1629, 1629,  true, false,   4,   1,   1, Dyes._NULL          , Element.Tb        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Thorium                 = new Materials(  96, TextureSet.SET_SHINY             ,   6.0F,    512,  2, 1|2  |8   |32|64          ,   0,  30,   0,   0,   "Thorium"                 ,   "Thorium"                       ,    0,       0,       2115,    0, false, false,   4,   1,   1, Dyes.dyeBlack       , Element.Th        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Thulium                 = new Materials(  76, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  89, 107, 194,   0,   "Thulium"                 ,   "Thulium"                       ,    0,       0,       1818, 1818,  true, false,   4,   1,   1, Dyes._NULL          , Element.Tm        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Tin                     = new Materials(  57, TextureSet.SET_DULL              ,   1.0F,      0,  3, 1|2  |8   |32   |128      , 220, 220, 220,   0,   "Tin"                     ,   "Tin"                           ,    0,       0,        505,  505, false, false,   3,   1,   1, Dyes.dyeWhite       , Element.Sn        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)));
-        Materials.Titanium                = new Materials(  28, TextureSet.SET_METALLIC          ,   7.0F,   1600,  3, 1|2  |8   |32|64|128      , 220, 160, 240,   0,   "Titanium"                ,   "Titanium"                      ,    0,       0,       1941, 1940,  true, false,   5,   1,   1, Dyes.dyePurple      , Element.Ti        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Tritanium               = new Materials( 329, TextureSet.SET_METALLIC          ,  20.0F,1435392,  6, 1|2  |8   |32|64          , 96, 0, 0,   0,   "Tritanium"               ,   "Tritanium"                     ,    0,       0,       9900, 9900,  true, false,   1,   1,   1, Dyes.dyeWhite       , Element.Tn  ,Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Tritium                 = new Materials(   3, TextureSet.SET_METALLIC          ,   1.0F,      0,  2,         16|32             , 255,   0,   0, 240,   "Tritium"                 ,   "Tritium"                       ,    0,       0,         14,    0, false,  true,  10,   1,   1, Dyes.dyeRed         , Element.T         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4)));
-        Materials.Tungsten                = new Materials(  81, TextureSet.SET_METALLIC          ,   7.0F,   2560,  3, 1|2  |8   |32|64|128      ,  50,  50,  50,   0,   "Tungsten"                ,   "Tungsten"                      ,    0,       0,       3695, 3000,  true, false,   4,   1,   1, Dyes.dyeBlack       , Element.W         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Uranium                 = new Materials(  98, TextureSet.SET_METALLIC          ,   6.0F,    512,  3, 1|2  |8   |32|64          ,  50, 240,  50,   0,   "Uranium"                 ,   "Uranium 238"                   ,    0,       0,       1405,    0, false, false,   4,   1,   1, Dyes.dyeGreen       , Element.U         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Uranium235              = new Materials(  97, TextureSet.SET_SHINY             ,   6.0F,    512,  3, 1|2  |8   |32|64          ,  70, 250,  70,   0,   "Uranium235"              ,   "Uranium 235"                   ,    0,       0,       1405,    0, false, false,   4,   1,   1, Dyes.dyeGreen       , Element.U_235     , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 2)));
-        Materials.Vanadium                = new Materials(  29, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  50,  50,  50,   0,   "Vanadium"                ,   "Vanadium"                      ,    0,       0,       2183, 2183,  true, false,   2,   1,   1, Dyes.dyeBlack       , Element.V         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Ytterbium               = new Materials(  77, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  44, 199,  80,   0,   "Ytterbium"               ,   "Ytterbium"                     ,    0,       0,       1097, 1097,  true, false,   4,   1,   1, Dyes._NULL          , Element.Yb        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Yttrium                 = new Materials(  45, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 220, 250, 220,   0,   "Yttrium"                 ,   "Yttrium"                       ,    0,       0,       1799, 1799,  true, false,   4,   1,   1, Dyes._NULL          , Element.Y         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1)));
-        Materials.Zinc                    = new Materials(  36, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1|2  |8   |32             , 250, 240, 240,   0,   "Zinc"                    ,   "Zinc"                          ,    0,       0,        692,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , Element.Zn        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1)));
+        Materials.Aluminium               = new Materials(  19, TextureSet.SET_DULL              ,  10.0F,    128,  2, 1|2  |8   |32|64|128      , 128, 200, 240,   0,   "Aluminium"               ,   "Aluminium"                     ,    0,       0,        933, 1700,  true, false,   3,   1,   1, Dyes.dyeLightBlue   , Element.Al        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.VOLATUS, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Americium               = new Materials( 103, TextureSet.SET_METALLIC          ,   1.0F,      0,  3, 1|2  |8   |32             , 200, 200, 200,   0,   "Americium"               ,   "Americium"                     ,    0,       0,       1449,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Am        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Antimony                = new Materials(  58, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 220, 220, 240,   0,   "Antimony"                ,   "Antimony"                      ,    0,       0,        903,    0, false, false,   2,   1,   1, Dyes.dyeLightGray   , Element.Sb        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.AQUA, 1)));
+        Materials.Argon                   = new Materials(  24, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0, 255,   0, 240,   "Argon"                   ,   "Argon"                         ,    0,       0,         83,    0, false,  true,   5,   1,   1, Dyes.dyeGreen       , Element.Ar        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AER, 2)));
+        Materials.Arsenic                 = new Materials(  39, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8|16|32             , 255, 255, 255,   0,   "Arsenic"                 ,   "Arsenic"                       ,    0,       0,       1090,    0, false, false,   3,   1,   1, Dyes.dyeOrange      , Element.As        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VENENUM, 3)));
+        Materials.Barium                  = new Materials(  63, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 255, 255,   0,   "Barium"                  ,   "Barium"                        ,    0,       0,       1000,    0, false, false,   1,   1,   1, Dyes._NULL          , Element.Ba        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VINCULUM, 3)));
+        Materials.Beryllium               = new Materials(   8, TextureSet.SET_METALLIC          ,  14.0F,     64,  2, 1|2  |8   |32|64          , 100, 180, 100,   0,   "Beryllium"               ,   "Beryllium"                     ,    0,       0,       1560,    0, false, false,   6,   1,   1, Dyes.dyeGreen       , Element.Be        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1)));
+        Materials.Bismuth                 = new Materials(  90, TextureSet.SET_METALLIC          ,   6.0F,     64,  1, 1|2  |8   |32|64|128      , 100, 160, 160,   0,   "Bismuth"                 ,   "Bismuth"                       ,    0,       0,        544,    0, false, false,   2,   1,   1, Dyes.dyeCyan        , Element.Bi        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1)));
+        Materials.Boron                   = new Materials(   9, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1         |32             , 210, 250, 210,   0,   "Boron"                   ,   "Boron"                         ,    0,       0,       2349,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , Element.B         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3)));
+        Materials.Caesium                 = new Materials(  62, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 176, 196, 222,   0,   "Caesium"                 ,   "Caesium"                       ,    0,       0,        301,    0, false, false,   4,   1,   1, Dyes._NULL          , Element.Cs        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Calcium                 = new Materials(  26, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1         |32             , 255, 245, 245,   0,   "Calcium"                 ,   "Calcium"                       ,    0,       0,       1115, 1115,  true, false,   4,   1,   1, Dyes.dyePink        , Element.Ca        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.SANO, 1), new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1)));
+        Materials.Carbon                  = new Materials(  10, TextureSet.SET_DULL              ,   1.0F,     64,  2, 1|2    |16|32|64|128      ,  20,  20,  20,   0,   "Carbon"                  ,   "Carbon"                        ,    0,       0,       3800,    0, false, false,   2,   1,   1, Dyes.dyeBlack       , Element.C         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1)));
+        Materials.Cadmium                 = new Materials(  55, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1    |8   |32             ,  50,  50,  60,   0,   "Cadmium"                 ,   "Cadmium"                       ,    0,       0,        594,    0, false, false,   3,   1,   1, Dyes.dyeGray        , Element.Cd        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1), new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1), new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1)));
+        Materials.Cerium                  = new Materials(  65, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 123, 212, 144,   0,   "Cerium"                  ,   "Cerium"                        ,    0,       0,       1068, 1068,  true, false,   4,   1,   1, Dyes._NULL          , Element.Ce        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Chlorine                = new Materials(  23, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255, 255,   0,   "Chlorine"                ,   "Chlorine"                      ,    0,       0,        171,    0, false, false,   2,   1,   1, Dyes.dyeCyan        , Element.Cl        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 2), new TCAspects.TC_AspectStack(TCAspects.PANNUS, 1)));
+        Materials.Chrome                  = new Materials(  30, TextureSet.SET_SHINY             ,  11.0F,    256,  3, 1|2  |8   |32|64|128      , 255, 230, 230,   0,   "Chrome"                  ,   "Chrome"                        ,    0,       0,       2180, 1700,  true, false,   5,   1,   1, Dyes.dyePink        , Element.Cr        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1)));
+        Materials.Cobalt                  = new Materials(  33, TextureSet.SET_METALLIC          ,   8.0F,    512,  3, 1|2  |8   |32|64|128      ,  80,  80, 250,   0,   "Cobalt"                  ,   "Cobalt"                        ,    0,       0,       1768, 1700,  true, false,   3,   1,   1, Dyes.dyeBlue        , Element.Co        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Copper                  = new Materials(  35, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1|2  |8   |32   |128      , 255, 100,   0,   0,   "Copper"                  ,   "Copper"                        ,    0,       0,       1357,    0, false, false,   3,   1,   1, Dyes.dyeOrange      , Element.Cu        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 1)));
+        Materials.Deuterium               = new Materials(   2, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255,   0, 240,   "Deuterium"               ,   "Deuterium"                     ,    0,       0,         14,    0, false,  true,  10,   1,   1, Dyes.dyeYellow      , Element.D         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 3)));
+        Materials.Dysprosium              = new Materials(  73, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 105, 209,  80,   0,   "Dysprosium"              ,   "Dysprosium"                    ,    0,       0,       1680, 1680,  true, false,   4,   1,   1, Dyes._NULL          , Element.Dy        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3)));
+        Materials.Empty                   = new Materials(   0, TextureSet.SET_NONE              ,   1.0F,      0,  2, 256/*Only when needed*/   , 255, 255, 255, 255,   "Empty"                   ,   "Empty"                         ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes._NULL          , Element._NULL     , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2)));
+        Materials.Erbium                  = new Materials(  75, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 176, 152,  81,   0,   "Erbium"                  ,   "Erbium"                        ,    0,       0,       1802, 1802,  true, false,   4,   1,   1, Dyes._NULL          , Element.Er        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Europium                = new Materials(  70, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 246, 181, 255,   0,   "Europium"                ,   "Europium"                      ,    0,       0,       1099, 1099,  true, false,   4,   1,   1, Dyes._NULL          , Element.Eu        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Fluorine                = new Materials(  14, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255, 255, 127,   "Fluorine"                ,   "Fluorine"                      ,    0,       0,         53,    0, false,  true,   2,   1,   1, Dyes.dyeGreen       , Element.F         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 2)));
+        Materials.Gadolinium              = new Materials(  71, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  59, 186,  28,   0,   "Gadolinium"              ,   "Gadolinium"                    ,    0,       0,       1585, 1585,  true, false,   4,   1,   1, Dyes._NULL          , Element.Gd        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Gallium                 = new Materials(  37, TextureSet.SET_SHINY             ,   1.0F,     64,  2, 1|2  |8   |32             , 220, 220, 255,   0,   "Gallium"                 ,   "Gallium"                       ,    0,       0,        302,    0, false, false,   5,   1,   1, Dyes.dyeLightGray   , Element.Ga        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1)));
+        Materials.Gold                    = new Materials(  86, TextureSet.SET_SHINY             ,  12.0F,     64,  2, 1|2  |8   |32|64|128      , 255, 255,  30,   0,   "Gold"                    ,   "Gold"                          ,    0,       0,       1337,    0, false, false,   4,   1,   1, Dyes.dyeYellow      , Element.Au        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 2)));
+        Materials.Holmium                 = new Materials(  74, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  22,   8, 166,   0,   "Holmium"                 ,   "Holmium"                       ,    0,       0,       1734, 1734,  true, false,   4,   1,   1, Dyes._NULL          , Element.Ho        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Hydrogen                = new Materials(   1, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0,   0, 255, 240,   "Hydrogen"                ,   "Hydrogen"                      ,    1,      20,         14,    0, false,  true,   2,   1,   1, Dyes.dyeBlue        , Element.H         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1)));
+        Materials.Helium                  = new Materials(   4, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255,   0, 240,   "Helium"                  ,   "Helium"                        ,    0,       0,          1,    0, false,  true,   5,   1,   1, Dyes.dyeYellow      , Element.He        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AER, 2)));
+        Materials.Helium_3                = new Materials(   5, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255, 255,   0, 240,   "Helium_3"                ,   "Helium-3"                      ,    0,       0,          1,    0, false,  true,  10,   1,   1, Dyes.dyeYellow      , Element.He_3      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AER, 3)));
+        Materials.Indium                  = new Materials(  56, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  64,   0, 128,   0,   "Indium"                  ,   "Indium"                        ,    0,       0,        429,    0, false, false,   4,   1,   1, Dyes.dyeGray        , Element.In        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Iridium                 = new Materials(  84, TextureSet.SET_DULL              ,   6.0F,   2560,  3, 1|2  |8   |32|64|128      , 240, 240, 245,   0,   "Iridium"                 ,   "Iridium"                       ,    0,       0,       2719, 4500,  true, false,  10,   1,   1, Dyes.dyeWhite       , Element.Ir        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Iron                    = new Materials(  32, TextureSet.SET_METALLIC          ,   6.0F,    256,  2, 1|2  |8   |32|64|128      , 200, 200, 200,   0,   "Iron"                    ,   "Iron"                          ,    0,       0,       1811,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Fe        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3)));
+        Materials.Lanthanum               = new Materials(  64, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 138, 138, 138,   0,   "Lanthanum"               ,   "Lanthanum"                     ,    0,       0,       1193, 1193,  true, false,   4,   1,   1, Dyes._NULL          , Element.La        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Lead                    = new Materials(  89, TextureSet.SET_DULL              ,   8.0F,     64,  1, 1|2  |8   |32|64|128      , 140, 100, 140,   0,   "Lead"                    ,   "Lead"                          ,    0,       0,        600,    0, false, false,   3,   1,   1, Dyes.dyePurple      , Element.Pb        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1)));
+        Materials.Lithium                 = new Materials(   6, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8   |32             , 225, 220, 255,   0,   "Lithium"                 ,   "Lithium"                       ,    0,       0,        454,    0, false, false,   4,   1,   1, Dyes.dyeLightBlue   , Element.Li        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2)));
+        Materials.Lutetium                = new Materials(  78, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             , 188,  62, 199,   0,   "Lutetium"                ,   "Lutetium"                      ,    0,       0,       1925, 1925,  true, false,   4,   1,   1, Dyes._NULL          , Element.Lu        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Magic                   = new Materials(-128, TextureSet.SET_SHINY             ,   8.0F,   5120,  5, 1|2|4|8|16|32|64|128      , 100,   0, 200,   0,   "Magic"                   ,   "Magic"                         ,    5,      32,       5000,    0, false, false,   7,   1,   1, Dyes.dyePurple      , Element.Ma        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 4)));
+        Materials.Magnesium               = new Materials(  18, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 200, 200,   0,   "Magnesium"               ,   "Magnesium"                     ,    0,       0,        923,    0, false, false,   3,   1,   1, Dyes.dyePink        , Element.Mg        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.SANO, 1)));
+        Materials.Manganese               = new Materials(  31, TextureSet.SET_DULL              ,   7.0F,    512,  2, 1|2  |8   |32|64          , 250, 250, 250,   0,   "Manganese"               ,   "Manganese"                     ,    0,       0,       1519,    0, false, false,   3,   1,   1, Dyes.dyeWhite       , Element.Mn        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3)));
+        Materials.Mercury                 = new Materials(  87, TextureSet.SET_SHINY             ,   1.0F,      0,  0,         16|32             , 255, 220, 220,   0,   "Mercury"                 ,   "Mercury"                       ,    5,      32,        234,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Hg        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1), new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1)));
+        Materials.Molybdenum              = new Materials(  48, TextureSet.SET_SHINY             ,   7.0F,    512,  2, 1|2  |8   |32|64          , 180, 180, 220,   0,   "Molybdenum"              ,   "Molybdenum"                    ,    0,       0,       2896,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , Element.Mo        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1)));
+        Materials.Neodymium               = new Materials(  67, TextureSet.SET_METALLIC          ,   7.0F,    512,  2, 1|2  |8   |32|64|128      , 100, 100, 100,   0,   "Neodymium"               ,   "Neodymium"                     ,    0,       0,       1297, 1297,  true, false,   4,   1,   1, Dyes._NULL          , Element.Nd        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 2)));
+        Materials.Neutronium              = new Materials( 129, TextureSet.SET_DULL              ,  24.0F, 655360,  6, 1|2  |8   |32|64|128      , 250, 250, 250,   0,   "Neutronium"              ,   "Neutronium"                    ,    0,       0,      10000, 10000, true, false,  20,   1,   1, Dyes.dyeWhite       , Element.Nt        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 2))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe().setProcessingMaterialTierEU(TierEU.RECIPE_LuV);
+        Materials.Nickel                  = new Materials(  34, TextureSet.SET_METALLIC          ,   6.0F,     64,  2, 1|2  |8   |32|64|128      , 200, 200, 250,   0,   "Nickel"                  ,   "Nickel"                        ,    0,       0,       1728,    0, false, false,   4,   1,   1, Dyes.dyeLightBlue   , Element.Ni        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1)));
+        Materials.Niobium                 = new Materials(  47, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 190, 180, 200,   0,   "Niobium"                 ,   "Niobium"                       ,    0,       0,       2750, 2750,  true, false,   5,   1,   1, Dyes._NULL          , Element.Nb        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1)));
+        Materials.Nitrogen                = new Materials(  12, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0, 150, 200, 240,   "Nitrogen"                ,   "Nitrogen"                      ,    0,       0,         63,    0, false,  true,   2,   1,   1, Dyes.dyeCyan        , Element.N         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AER, 2)));
+        Materials.Osmium                  = new Materials(  83, TextureSet.SET_METALLIC          ,  16.0F,   1280,  4, 1|2  |8   |32|64|128      ,  50,  50, 255,   0,   "Osmium"                  ,   "Osmium"                        ,    0,       0,       3306, 4500,  true, false,  10,   1,   1, Dyes.dyeBlue        , Element.Os        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1), new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Oxygen                  = new Materials(  13, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             ,   0, 100, 200, 240,   "Oxygen"                  ,   "Oxygen"                        ,    0,       0,         54,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , Element.O         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AER, 1)));
+        Materials.Palladium               = new Materials(  52, TextureSet.SET_SHINY             ,   8.0F,    512,  4, 1|2  |8   |32|64|128      , 128, 128, 128,   0,   "Palladium"               ,   "Palladium"                     ,    0,       0,       1828, 1828,  true, false,   4,   1,   1, Dyes.dyeGray        , Element.Pd        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Phosphorus              = new Materials(  21, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1         |32             , 255, 255,   0,   0,   "Phosphorus"              ,   "Phosphorus"                    ,    0,       0,        317,    0, false, false,   2,   1,   1, Dyes.dyeYellow      , Element.P         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2), new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1)));
+        Materials.Platinum                = new Materials(  85, TextureSet.SET_SHINY             ,  12.0F,     64,  4, 1|2  |8   |32|64|128      , 255, 255, 200,   0,   "Platinum"                ,   "Platinum"                      ,    0,       0,       2041,    0, false, false,   6,   1,   1, Dyes.dyeOrange      , Element.Pt        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 1)));
+        Materials.Plutonium               = new Materials( 100, TextureSet.SET_METALLIC          ,   6.0F,    512,  3, 1|2  |8   |32|64          , 240,  50,  50,   0,   "Plutonium"               ,   "Plutonium 239"                 ,    0,       0,        912,    0, false, false,   6,   1,   1, Dyes.dyeLime        , Element.Pu        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 2)));
+        Materials.Plutonium241            = new Materials( 101, TextureSet.SET_SHINY             ,   6.0F,    512,  3, 1|2  |8   |32|64          , 250,  70,  70,   0,   "Plutonium241"            ,   "Plutonium 241"                 ,    0,       0,        912,    0, false, false,   6,   1,   1, Dyes.dyeLime        , Element.Pu_241    , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 3)));
+        Materials.Potassium               = new Materials(  25, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1|2       |32             , 154, 172, 223,   0,   "Potassium"               ,   "Potassium"                     ,    0,       0,        336,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , Element.K         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1)));
+        Materials.Praseodymium            = new Materials(  66, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8   |32             , 117, 214, 129,   0,   "Praseodymium"            ,   "Praseodymium"                  ,    0,       0,       1208, 1208,  true, false,   4,   1,   1, Dyes._NULL          , Element.Pr        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Promethium              = new Materials(  68, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  36, 181,  53,   0,   "Promethium"              ,   "Promethium"                    ,    0,       0,       1315, 1315,  true, false,   4,   1,   1, Dyes._NULL          , Element.Pm        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Radon                   = new Materials(  93, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 255,   0, 255, 240,   "Radon"                   ,   "Radon"                         ,    0,       0,        202,    0, false,  true,   5,   1,   1, Dyes.dyePurple      , Element.Rn        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AER, 1), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Rubidium                = new Materials(  43, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 240,  30,  30,   0,   "Rubidium"                ,   "Rubidium"                      ,    0,       0,        312,    0, false, false,   4,   1,   1, Dyes.dyeRed         , Element.Rb        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1)));
+        Materials.Samarium                = new Materials(  69, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 255, 204,   0,   "Samarium"                ,   "Samarium"                      ,    0,       0,       1345, 1345,  true, false,   4,   1,   1, Dyes.dyeWhite       , Element.Sm        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1), new TCAspects.TC_AspectStack(TCAspects.MAGNETO,10)));
+        Materials.Scandium                = new Materials(  27, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 204, 204, 204,   0,   "Scandium"                ,   "Scandium"                      ,    0,       0,       1814, 1814,  true, false,   2,   1,   1, Dyes.dyeYellow      , Element.Sc        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Silicon                 = new Materials(  20, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  60,  60,  80,   0,   "Silicon"                 ,   "Raw Silicon"                   ,    0,       0,       2273, 2273,  true, false,   1,   1,   1, Dyes.dyeBlack       , Element.Si        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 1)));
+        Materials.Silver                  = new Materials(  54, TextureSet.SET_SHINY             ,  10.0F,     64,  2, 1|2  |8   |32|64|128      , 220, 220, 255,   0,   "Silver"                  ,   "Silver"                        ,    0,       0,       1234,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Element.Ag        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1)));
+        Materials.Sodium                  = new Materials(  17, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1      |16|32             ,   0,   0, 150,   0,   "Sodium"                  ,   "Sodium"                        ,    0,       0,        370,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , Element.Na        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2), new TCAspects.TC_AspectStack(TCAspects.LUX, 1)));
+        Materials.Strontium               = new Materials(  44, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8   |32             , 200, 200, 200,   0,   "Strontium"               ,   "Strontium"                     ,    0,       0,       1050,    0, false, false,   1,   1,   1, Dyes.dyeLightGray   , Element.Sr        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 1)));
+        Materials.Sulfur                  = new Materials(  22, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8   |32             , 200, 200,   0,   0,   "Sulfur"                  ,   "Sulfur"                        ,    0,       0,        388,    0, false, false,   2,   1,   1, Dyes.dyeYellow      , Element.S         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1)));
+        Materials.Tantalum                = new Materials(  80, TextureSet.SET_SHINY             ,   6.0F,   2560,  3, 1|2  |8   |32             , 105, 183, 255,   0,   "Tantalum"                ,   "Tantalum"                      ,    0,       0,       3290, 3290,  true, false,   4,   1,   1, Dyes._NULL          , Element.Ta        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.VINCULUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Tellurium               = new Materials(  59, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2  |8   |32             , 206, 277,  86,   0,   "Tellurium"               ,   "Tellurium"                     ,    0,       0,        722,    0, false, false,   4,   1,   1, Dyes.dyeGray        , Element.Te        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Terbium                 = new Materials(  72, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 255, 255, 255,   0,   "Terbium"                 ,   "Terbium"                       ,    0,       0,       1629, 1629,  true, false,   4,   1,   1, Dyes._NULL          , Element.Tb        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Thorium                 = new Materials(  96, TextureSet.SET_SHINY             ,   6.0F,    512,  2, 1|2  |8   |32|64          ,   0,  30,   0,   0,   "Thorium"                 ,   "Thorium"                       ,    0,       0,       2115,    0, false, false,   4,   1,   1, Dyes.dyeBlack       , Element.Th        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Thulium                 = new Materials(  76, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  89, 107, 194,   0,   "Thulium"                 ,   "Thulium"                       ,    0,       0,       1818, 1818,  true, false,   4,   1,   1, Dyes._NULL          , Element.Tm        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Tin                     = new Materials(  57, TextureSet.SET_DULL              ,   1.0F,      0,  3, 1|2  |8   |32   |128      , 220, 220, 220,   0,   "Tin"                     ,   "Tin"                           ,    0,       0,        505,  505, false, false,   3,   1,   1, Dyes.dyeWhite       , Element.Sn        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1)));
+        Materials.Titanium                = new Materials(  28, TextureSet.SET_METALLIC          ,   7.0F,   1600,  3, 1|2  |8   |32|64|128      , 220, 160, 240,   0,   "Titanium"                ,   "Titanium"                      ,    0,       0,       1941, 1940,  true, false,   5,   1,   1, Dyes.dyePurple      , Element.Ti        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Tritanium               = new Materials( 329, TextureSet.SET_METALLIC          ,  20.0F,1435392,  6, 1|2  |8   |32|64          , 96, 0, 0,   0,   "Tritanium"               ,   "Tritanium"                     ,    0,       0,       9900, 9900,  true, false,   1,   1,   1, Dyes.dyeWhite       , Element.Tn  ,Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ORDO, 2))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Tritium                 = new Materials(   3, TextureSet.SET_METALLIC          ,   1.0F,      0,  2,         16|32             , 255,   0,   0, 240,   "Tritium"                 ,   "Tritium"                       ,    0,       0,         14,    0, false,  true,  10,   1,   1, Dyes.dyeRed         , Element.T         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 4)));
+        Materials.Tungsten                = new Materials(  81, TextureSet.SET_METALLIC          ,   7.0F,   2560,  3, 1|2  |8   |32|64|128      ,  50,  50,  50,   0,   "Tungsten"                ,   "Tungsten"                      ,    0,       0,       3695, 3000,  true, false,   4,   1,   1, Dyes.dyeBlack       , Element.W         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3), new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Uranium                 = new Materials(  98, TextureSet.SET_METALLIC          ,   6.0F,    512,  3, 1|2  |8   |32|64          ,  50, 240,  50,   0,   "Uranium"                 ,   "Uranium 238"                   ,    0,       0,       1405,    0, false, false,   4,   1,   1, Dyes.dyeGreen       , Element.U         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Uranium235              = new Materials(  97, TextureSet.SET_SHINY             ,   6.0F,    512,  3, 1|2  |8   |32|64          ,  70, 250,  70,   0,   "Uranium235"              ,   "Uranium 235"                   ,    0,       0,       1405,    0, false, false,   4,   1,   1, Dyes.dyeGreen       , Element.U_235     , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 2)));
+        Materials.Vanadium                = new Materials(  29, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             ,  50,  50,  50,   0,   "Vanadium"                ,   "Vanadium"                      ,    0,       0,       2183, 2183,  true, false,   2,   1,   1, Dyes.dyeBlack       , Element.V         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Ytterbium               = new Materials(  77, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8   |32             ,  44, 199,  80,   0,   "Ytterbium"               ,   "Ytterbium"                     ,    0,       0,       1097, 1097,  true, false,   4,   1,   1, Dyes._NULL          , Element.Yb        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Yttrium                 = new Materials(  45, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2  |8   |32             , 220, 250, 220,   0,   "Yttrium"                 ,   "Yttrium"                       ,    0,       0,       1799, 1799,  true, false,   4,   1,   1, Dyes._NULL          , Element.Y         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1)));
+        Materials.Zinc                    = new Materials(  36, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1|2  |8   |32             , 250, 240, 240,   0,   "Zinc"                    ,   "Zinc"                          ,    0,       0,        692,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , Element.Zn        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.SANO, 1)));
 
-        Materials.Grade1PurifiedWater                = new Materials(   554, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   63,   76, 253, 0,   "Grade1PurifiedWater"                ,   "Filtered Water (Grade 1)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue               , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.Grade2PurifiedWater                = new Materials(   555, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   93,   93, 254, 0,   "Grade2PurifiedWater"                ,   "Ozonated Water (Grade 2)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue               , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.Grade3PurifiedWater                = new Materials(   556, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16            ,   115,   109, 254, 0,   "Grade3PurifiedWater"                ,   "Flocculated Water (Grade 3)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue             , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.Grade4PurifiedWater                = new Materials(   557, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16            ,   135,   126, 255, 0,   "Grade4PurifiedWater"                ,   "pH Neutralized Water (Grade 4)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.Grade5PurifiedWater                = new Materials(   558, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   152,   144, 255, 0,   "Grade5PurifiedWater"                ,   "Extreme-Temperature Treated Water (Grade 5)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.Grade6PurifiedWater                = new Materials(   559, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16            ,   168,   161, 255, 0,   "Grade6PurifiedWater"                ,   "Ultraviolet Treated Electrically Neutral Water (Grade 6)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.Grade7PurifiedWater                = new Materials(   560, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   183,   179, 255, 0,   "Grade7PurifiedWater"                ,   "Degassed Decontaminant-Free Water (Grade 7)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.Grade8PurifiedWater                = new Materials(   561, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   197,   197, 255, 0,   "Grade8PurifiedWater"                ,   "Subatomically Perfect Water (Grade 8)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
-        Materials.FlocculationWasteLiquid            = new Materials(562, TextureSet.SET_FLUID, 1.0f, 0, 2, 16, 61, 58, 82, 0, "FlocculationWasteLiquid", "Flocculation Waste Liquid", 0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade1PurifiedWater                = new Materials(   554, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   63,   76, 253, 0,   "Grade1PurifiedWater"                ,   "Filtered Water (Grade 1)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue               , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade2PurifiedWater                = new Materials(   555, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   93,   93, 254, 0,   "Grade2PurifiedWater"                ,   "Ozonated Water (Grade 2)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue               , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade3PurifiedWater                = new Materials(   556, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16            ,   115,   109, 254, 0,   "Grade3PurifiedWater"                ,   "Flocculated Water (Grade 3)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue             , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade4PurifiedWater                = new Materials(   557, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16            ,   135,   126, 255, 0,   "Grade4PurifiedWater"                ,   "pH Neutralized Water (Grade 4)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade5PurifiedWater                = new Materials(   558, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   152,   144, 255, 0,   "Grade5PurifiedWater"                ,   "Extreme-Temperature Treated Water (Grade 5)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade6PurifiedWater                = new Materials(   559, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16            ,   168,   161, 255, 0,   "Grade6PurifiedWater"                ,   "Ultraviolet Treated Electrically Neutral Water (Grade 6)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade7PurifiedWater                = new Materials(   560, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   183,   179, 255, 0,   "Grade7PurifiedWater"                ,   "Degassed Decontaminant-Free Water (Grade 7)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.Grade8PurifiedWater                = new Materials(   561, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16             ,   197,   197, 255, 0,   "Grade8PurifiedWater"                ,   "Subatomically Perfect Water (Grade 8)"                      ,    0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
+        Materials.FlocculationWasteLiquid            = new Materials(562, TextureSet.SET_FLUID, 1.0f, 0, 2, 16, 61, 58, 82, 0, "FlocculationWasteLiquid", "Flocculation Waste Liquid", 0,      0,         273,    0, false,  true,   2,   1,   1, Dyes.dyeBlue                 , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).setHasCorrespondingFluid(true);
 
-        Materials.Flerovium                          = new Materials( 984, TextureSet.SET_SHINY             ,   1.0F,      0,  0, 1|2  |8   |32|64|128      , 255,255, 255,   0,   "Flerovium_GT5U"                ,    "Flerovium"                ,     0,       0,         0,    0, false,  false,  1 ,  1,   1, Dyes.dyeWhite      , Element.Fl         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 3))).disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Flerovium                          = new Materials( 984, TextureSet.SET_SHINY             ,   1.0F,      0,  0, 1|2  |8   |32|64|128      , 255,255, 255,   0,   "Flerovium_GT5U"                ,    "Flerovium"                ,     0,       0,         0,    0, false,  false,  1 ,  1,   1, Dyes.dyeWhite      , Element.Fl         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 3))).disableAutoGeneratedBlastFurnaceRecipes();
         Materials.Organic                            = new Materials(  -1, TextureSet.SET_LEAF              ,   1.0F,      0,  1,                                          false,   "Organic"                 ,   "Organic"                       );
         Materials.AnyCopper                          = new Materials(  -1, TextureSet.SET_SHINY             ,   1.0F,      0,  3,                                          false,   "AnyCopper"               ,   "AnyCopper"                     );
         Materials.AnyBronze                          = new Materials(  -1, TextureSet.SET_SHINY             ,   1.0F,      0,  3,                                          false,   "AnyBronze"               ,   "AnyBronze"                     );
@@ -304,7 +304,7 @@ public class MaterialsInit1 {
         Materials.Adluorite               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1|2  |8      |64|128      , 255, 255, 255,   0,   "Adluorite"               ,   "Adluorite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightBlue   );
         Materials.Agate                   = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Agate"                   ,   "Agate"                         ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes._NULL          );
         Materials.Alduorite               = new Materials( 485, TextureSet.SET_SHINY             ,  32.0F,   8192,  1, 1|2  |8      |64|128      , 159, 180, 180,   0,   "Alduorite"               ,   "Alduorite"                     ,    0,       0,       6600, 6600,  true, false,   1,   1,   1, Dyes._NULL          ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(6, 1, 1);
-        Materials.Amber                   = new Materials( 514, TextureSet.SET_RUBY              ,   4.0F,    128,  2, 1  |4|8      |64          , 255, 128,   0, 127,   "Amber"                   ,   "Amber"                         ,    5,       3,         -1,    0, false,  true,   1,   1,   1, Dyes.dyeOrange      ,1,  Arrays.asList(new MaterialStack(Carbon, 10), new MaterialStack(Hydrogen, 10), new MaterialStack(Oxygen, 16)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)));
+        Materials.Amber                   = new Materials( 514, TextureSet.SET_RUBY              ,   4.0F,    128,  2, 1  |4|8      |64          , 255, 128,   0, 127,   "Amber"                   ,   "Amber"                         ,    5,       3,         -1,    0, false,  true,   1,   1,   1, Dyes.dyeOrange      ,1,  Arrays.asList(new MaterialStack(Carbon, 10), new MaterialStack(Hydrogen, 10), new MaterialStack(Oxygen, 16)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VINCULUM, 2), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1)));
         Materials.Ammonium                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Ammonium"                ,   "Ammonium"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Amordrine               = new Materials(  -1, TextureSet.SET_NONE              ,   6.0F,     64,  2, 1|2  |8      |64          , 255, 255, 255,   0,   "Amordrine"               ,   "Amordrine"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Andesite                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1    |8                   , 255, 255, 255,   0,   "Andesite"                ,   "Andesite"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
@@ -321,8 +321,8 @@ public class MaterialsInit1 {
         Materials.Blutonium               = new Materials(  -1, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2  |8                   ,   0,   0, 255,   0,   "Blutonium"               ,   "Blutonium"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBlue        );
         Materials.Carmot                  = new Materials( 962, TextureSet.SET_METALLIC          ,  16.0F,    128,  1, 1|2  |8      |64          , 217, 205, 140,   0,   "Carmot"                  ,   "Carmot"                        ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Celenegil               = new Materials( 964, TextureSet.SET_METALLIC          ,  10.0F,   4096,  2, 1|2  |8      |64          , 148, 204,  72,   0,   "Celenegil"               ,   "Celenegil"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
-        Materials.CertusQuartz            = new Materials( 516, TextureSet.SET_QUARTZ            ,   5.0F,     32,  1, 1  |4|8      |64          , 210, 210, 230,   0,   "CertusQuartz"            ,   "Certus Quartz"                 ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)));
-        Materials.CertusQuartzCharged     = new Materials( 517, TextureSet.SET_QUARTZ            ,   5.0F,     32,  1,       8                   , 221, 221, 236,   0,   "ChargedCertusQuartz"     ,   "Charged Certus Quartz"         ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+        Materials.CertusQuartz            = new Materials( 516, TextureSet.SET_QUARTZ            ,   5.0F,     32,  1, 1  |4|8      |64          , 210, 210, 230,   0,   "CertusQuartz"            ,   "Certus Quartz"                 ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1)));
+        Materials.CertusQuartzCharged     = new Materials( 517, TextureSet.SET_QUARTZ            ,   5.0F,     32,  1,       8                   , 221, 221, 236,   0,   "ChargedCertusQuartz"     ,   "Charged Certus Quartz"         ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1)));
         Materials.Ceruclase               = new Materials( 952, TextureSet.SET_METALLIC          ,  32.0F,   1280,  2, 1|2  |8      |64|128      , 140, 189, 208,   0,   "Ceruclase"               ,   "Ceruclase"                     ,    0,       0,         6600,    6600, true, false,   1,   1,   1, Dyes.dyeBlue        ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1, 22, 1);
         Materials.Citrine                 = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Citrine"                 ,   "Citrine"                       ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes._NULL          );
         Materials.CobaltHexahydrate       = new Materials( 853, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1      |16                ,  80,  80, 250,   0,   "CobaltHexahydrate"       ,   "Cobalt Hexahydrate"            ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        );
@@ -338,7 +338,7 @@ public class MaterialsInit1 {
         Materials.DarkIron                = new Materials( 342, TextureSet.SET_DULL              ,   7.0F,    384,  3, 1|2  |8      |64          ,  55,  40,  60,   0,   "DarkIron"                ,   "Deep Dark Iron"                ,    0,       0,         -1,    0, false, false,   5,   1,   1, Dyes.dyePurple      );
         Materials.DarkStone               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "DarkStone"               ,   "Dark Stone"                    ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBlack       );
         Materials.Demonite                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Demonite"                ,   "Demonite"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeRed         );
-        Materials.Desh                    = new Materials( 884, TextureSet.SET_DULL              ,  20.0F,   1280,  4, 1|2  |8   |32|64|128      ,  40,  40,  40,   0,   "Desh"                    ,   "Desh"                          ,    0,       0,       2500, 2500,  true, false,   1,   1,   1, Dyes.dyeBlack       ,Element.De, Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Desh                    = new Materials( 884, TextureSet.SET_DULL              ,  20.0F,   1280,  4, 1|2  |8   |32|64|128      ,  40,  40,  40,   0,   "Desh"                    ,   "Desh"                          ,    0,       0,       2500, 2500,  true, false,   1,   1,   1, Dyes.dyeBlack       ,Element.De, Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.Desichalkos             = new Materials(  -1, TextureSet.SET_NONE              ,   6.0F,   1280,  3, 1|2  |8      |64          , 255, 255, 255,   0,   "Desichalkos"             ,   "Desichalkos"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Dilithium               = new Materials( 515, TextureSet.SET_DIAMOND           ,   1.0F,      0,  1, 1  |4|8|16                , 255, 250, 250, 127,   "Dilithium"               ,   "Dilithium"                     ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       );
         Materials.Draconic                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Draconic"                ,   "Draconic"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         );
@@ -347,44 +347,44 @@ public class MaterialsInit1 {
         Materials.Eclogite                = new Materials( 860, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Eclogite"                ,   "Eclogite"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.ElectrumFlux            = new Materials( 320, TextureSet.SET_SHINY             ,  16.0F,    512,  3, 1|2  |8      |64|128      , 255, 255, 120,   0,   "ElectrumFlux"            ,   "Fluxed Electrum"               ,    0,       0,       9000, 9000,  true, false,   1,   1,   1, Dyes.dyeYellow      ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.Emery                   = new Materials( 861, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 255, 255, 255,   0,   "Emery"                   ,   "Emery"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
-        Materials.EnderiumBase            = new Materials( 380, TextureSet.SET_DULL              ,  16.0F,    768,  4, 1|2          |64|128      ,  72, 119, 153,   0,   "EnderiumBase"            ,   "Enderium Base"                 ,    0,       0,       3600, 3600,  true, false,   1,   1,   1, Dyes.dyeGreen       , 1, Arrays.asList(new MaterialStack(Tin, 2), new MaterialStack(Silver, 1), new MaterialStack(Platinum, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.EnderiumBase            = new Materials( 380, TextureSet.SET_DULL              ,  16.0F,    768,  4, 1|2          |64|128      ,  72, 119, 153,   0,   "EnderiumBase"            ,   "Enderium Base"                 ,    0,       0,       3600, 3600,  true, false,   1,   1,   1, Dyes.dyeGreen       , 1, Arrays.asList(new MaterialStack(Tin, 2), new MaterialStack(Silver, 1), new MaterialStack(Platinum, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.Energized               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 0                         , 255, 255, 255,   0,   "Energized"               ,   "Energized"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Epidote                 = new Materials( 862, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Epidote"                 ,   "Epidote"                       ,    0,       0,         -1,    0, false, false,   0,   1,   1, Dyes._NULL          );
         Materials.Eximite                 = new Materials( 959, TextureSet.SET_METALLIC          ,   5.0F,   2560,  3, 1|2  |8      |64          , 124,  90, 150,   0,   "Eximite"                 ,   "Eximite"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
-        Materials.FierySteel              = new Materials( 346, TextureSet.SET_FIERY             ,   8.0F,    256,  3, 1|2          |64|128      ,  64,   0,   0,   0,   "FierySteel"              ,   "Fiery Steel"                   ,    5,    2048,       1811, 1800,  true, false,   1,   1,   1, Dyes.dyeRed         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 3))).disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.FierySteel              = new Materials( 346, TextureSet.SET_FIERY             ,   8.0F,    256,  3, 1|2          |64|128      ,  64,   0,   0,   0,   "FierySteel"              ,   "Fiery Steel"                   ,    5,    2048,       1811, 1800,  true, false,   1,   1,   1, Dyes.dyeRed         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 3), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 3), new TCAspects.TC_AspectStack(TCAspects.CORPUS, 3))).disableAutoGeneratedBlastFurnaceRecipes();
         Materials.Firestone               = new Materials( 347, TextureSet.SET_QUARTZ            ,   6.0F,   1280,  3, 1  |4|8      |64          , 200,  20,   0,   0,   "Firestone"               ,   "Firestone"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeRed         );
         Materials.Fluorite                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1    |8                   , 255, 255, 255,   0,   "Fluorite"                ,   "Fluorite"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGreen       );
-        Materials.FoolsRuby               = new Materials( 512, TextureSet.SET_RUBY              ,   1.0F,      0,  2, 1  |4|8                   , 255, 100, 100, 127,   "FoolsRuby"               ,   "Spinel"                          ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeRed         , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 4)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2)));
-        Materials.Force                   = new Materials( 521, TextureSet.SET_DIAMOND           ,  10.0F,    128,  3, 1|2|4|8      |64|128      , 255, 255,   0,   0,   "Force"                   ,   "Force"                         ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 5)));
-        Materials.Forcicium               = new Materials( 518, TextureSet.SET_DIAMOND           ,   1.0F,      0,  1, 1  |4|8|16                ,  50,  50,  70,   0,   "Forcicium"               ,   "Forcicium"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGreen       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2)));
-        Materials.Forcillium              = new Materials( 519, TextureSet.SET_DIAMOND           ,   1.0F,      0,  1, 1  |4|8|16                ,  50,  50,  70,   0,   "Forcillium"              ,   "Forcillium"                    ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGreen       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2)));
+        Materials.FoolsRuby               = new Materials( 512, TextureSet.SET_RUBY              ,   1.0F,      0,  2, 1  |4|8                   , 255, 100, 100, 127,   "FoolsRuby"               ,   "Spinel"                          ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeRed         , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 4)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 2), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2)));
+        Materials.Force                   = new Materials( 521, TextureSet.SET_DIAMOND           ,  10.0F,    128,  3, 1|2|4|8      |64|128      , 255, 255,   0,   0,   "Force"                   ,   "Force"                         ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 5)));
+        Materials.Forcicium               = new Materials( 518, TextureSet.SET_DIAMOND           ,   1.0F,      0,  1, 1  |4|8|16                ,  50,  50,  70,   0,   "Forcicium"               ,   "Forcicium"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGreen       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2)));
+        Materials.Forcillium              = new Materials( 519, TextureSet.SET_DIAMOND           ,   1.0F,      0,  1, 1  |4|8|16                ,  50,  50,  70,   0,   "Forcillium"              ,   "Forcillium"                    ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGreen       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2)));
         Materials.Gabbro                  = new Materials( 863, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Gabbro"                  ,   "Gabbro"                        ,    0,       0,         -1,    0, false, false,   0,   1,   1, Dyes._NULL          );
-        Materials.Glowstone               = new Materials( 811, TextureSet.SET_SHINY             ,   1.0F,      0,  1, 1      |16                , 255, 255,   0,   0,   "Glowstone"               ,   "Glowstone"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1)));
+        Materials.Glowstone               = new Materials( 811, TextureSet.SET_SHINY             ,   1.0F,      0,  1, 1      |16                , 255, 255,   0,   0,   "Glowstone"               ,   "Glowstone"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUX, 2), new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1)));
         Materials.Gneiss                  = new Materials( 864, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Gneiss"                  ,   "Gneiss"                        ,    0,       0,         -1,    0, false, false,   0,   1,   1, Dyes._NULL          );
-        Materials.Graphite                = new Materials( 865, TextureSet.SET_DULL              ,   5.0F,     32,  2, 1    |8|16   |64          , 128, 128, 128,   0,   "Graphite"                ,   "Graphite"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGray        , 0, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)));
-        Materials.Graphene                = new Materials( 819, TextureSet.SET_DULL              ,   6.0F,     32,  1, 1            |64          , 128, 128, 128,   0,   "Graphene"                ,   "Graphene"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGray        , 0, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+        Materials.Graphite                = new Materials( 865, TextureSet.SET_DULL              ,   5.0F,     32,  2, 1    |8|16   |64          , 128, 128, 128,   0,   "Graphite"                ,   "Graphite"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGray        , 0, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1)));
+        Materials.Graphene                = new Materials( 819, TextureSet.SET_DULL              ,   6.0F,     32,  1, 1            |64          , 128, 128, 128,   0,   "Graphene"                ,   "Graphene"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGray        , 0, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1)));
         Materials.Greenschist             = new Materials( 866, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Greenschist"             ,   "Green Schist"                  ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGreen       );
         Materials.Greenstone              = new Materials( 867, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Greenstone"              ,   "Greenstone"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGreen       );
         Materials.Greywacke               = new Materials( 897, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Greywacke"               ,   "Greywacke"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        );
         Materials.Haderoth                = new Materials( 963, TextureSet.SET_METALLIC          ,  10.0F,   3200,  3, 1|2  |8      |64          , 119,  52,  30,   0,   "Haderoth"                ,   "Haderoth"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Hematite                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1|2  |8                   , 255, 255, 255,   0,   "Hematite"                ,   "Hematite"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes._NULL          );
         Materials.Hepatizon               = new Materials( 957, TextureSet.SET_METALLIC          ,  12.0F,    128,  2, 1|2  |8      |64          , 117,  94, 117,   0,   "Hepatizon"               ,   "Hepatizon"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
-        Materials.HSLA                    = new Materials( 322, TextureSet.SET_METALLIC          ,   6.0F,    500,  3, 1|2          |64|128      , 128, 128, 128,   0,   "HSLA"                    ,   "HSLA Steel"                    ,    0,       0,       1811, 1000,  true, false,   3,   1,   1, Dyes._NULL          , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1)));
+        Materials.HSLA                    = new Materials( 322, TextureSet.SET_METALLIC          ,   6.0F,    500,  3, 1|2          |64|128      , 128, 128, 128,   0,   "HSLA"                    ,   "HSLA Steel"                    ,    0,       0,       1811, 1000,  true, false,   3,   1,   1, Dyes._NULL          , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1)));
         Materials.Ignatius                = new Materials( 950, TextureSet.SET_METALLIC          ,  12.0F,    512,  2, 1|2                       , 255, 169,  83,   0,   "Ignatius"                ,   "Ignatius"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Infernal                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 0                         , 255, 255, 255,   0,   "Infernal"                ,   "Infernal"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Infuscolium             = new Materials( 490, TextureSet.SET_METALLIC          ,   6.0F,     64,  2, 1|2  |8      |64          , 146,  33,  86,   0,   "Infuscolium"             ,   "Infuscolium"                   ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes._NULL          );
         Materials.InfusedGold             = new Materials( 323, TextureSet.SET_SHINY             ,  12.0F,     64,  3, 1|2  |8      |64|128      , 255, 200,  60,   0,   "InfusedGold"             ,   "Infused Gold"                  ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      );
-        Materials.InfusedAir              = new Materials( 540, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 255, 255,   0,   0,   "InfusedAir"              ,   "Aer"                           ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeYellow      , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 2)));
-        Materials.InfusedFire             = new Materials( 541, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 255,   0,   0,   0,   "InfusedFire"             ,   "Ignis"                         ,    5,     320,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeRed         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2)));
-        Materials.InfusedEarth            = new Materials( 542, TextureSet.SET_SHARDS            ,   8.0F,    256,  3, 1  |4|8      |64|128      ,   0, 255,   0,   0,   "InfusedEarth"            ,   "Terra"                         ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeGreen       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 2)));
-        Materials.InfusedWater            = new Materials( 543, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      ,   0,   0, 255,   0,   "InfusedWater"            ,   "Aqua"                          ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlue        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2)));
-        Materials.InfusedEntropy          = new Materials( 544, TextureSet.SET_SHARDS            ,  32.0F,     64,  4, 1  |4|8      |64|128      ,  62,  62,  62,   0,   "InfusedEntropy"          ,   "Perditio"                      ,    5,     320,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2)));
-        Materials.InfusedOrder            = new Materials( 545, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 252, 252, 252,   0,   "InfusedOrder"            ,   "Ordo"                          ,    5,     240,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeWhite       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2)));
-        Materials.InfusedVis              = new Materials(  -1, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 255,   0, 255,   0,   "InfusedVis"              ,   "Auram"                         ,    5,     240,         -1,    0, false,  true,   3,   1,   1, Dyes.dyePurple      , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 2)));
-        Materials.InfusedDull             = new Materials(  -1, TextureSet.SET_SHARDS            ,  32.0F,     64,  3, 1  |4|8      |64|128      , 100, 100, 100,   0,   "InfusedDull"             ,   "Vacuus"                        ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeLightGray   , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2)));
+        Materials.InfusedAir              = new Materials( 540, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 255, 255,   0,   0,   "InfusedAir"              ,   "Aer"                           ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeYellow      , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.AER, 2)));
+        Materials.InfusedFire             = new Materials( 541, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 255,   0,   0,   0,   "InfusedFire"             ,   "Ignis"                         ,    5,     320,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeRed         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2)));
+        Materials.InfusedEarth            = new Materials( 542, TextureSet.SET_SHARDS            ,   8.0F,    256,  3, 1  |4|8      |64|128      ,   0, 255,   0,   0,   "InfusedEarth"            ,   "Terra"                         ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeGreen       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.TERRA, 2)));
+        Materials.InfusedWater            = new Materials( 543, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      ,   0,   0, 255,   0,   "InfusedWater"            ,   "Aqua"                          ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlue        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.AQUA, 2)));
+        Materials.InfusedEntropy          = new Materials( 544, TextureSet.SET_SHARDS            ,  32.0F,     64,  4, 1  |4|8      |64|128      ,  62,  62,  62,   0,   "InfusedEntropy"          ,   "Perditio"                      ,    5,     320,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 2)));
+        Materials.InfusedOrder            = new Materials( 545, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 252, 252, 252,   0,   "InfusedOrder"            ,   "Ordo"                          ,    5,     240,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeWhite       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.ORDO, 2)));
+        Materials.InfusedVis              = new Materials(  -1, TextureSet.SET_SHARDS            ,   8.0F,     64,  3, 1  |4|8      |64|128      , 255,   0, 255,   0,   "InfusedVis"              ,   "Auram"                         ,    5,     240,         -1,    0, false,  true,   3,   1,   1, Dyes.dyePurple      , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.AURAM, 2)));
+        Materials.InfusedDull             = new Materials(  -1, TextureSet.SET_SHARDS            ,  32.0F,     64,  3, 1  |4|8      |64|128      , 100, 100, 100,   0,   "InfusedDull"             ,   "Vacuus"                        ,    5,     160,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeLightGray   , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1), new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2)));
         Materials.Inolashite              = new Materials( 954, TextureSet.SET_NONE              ,   8.0F,   2304,  3, 1|2  |8      |64          , 148, 216, 187,   0,   "Inolashite"              ,   "Inolashite"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGreen       );
         Materials.Invisium                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1                         , 255, 255, 255,   0,   "Invisium"                ,   "Invisium"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes._NULL          );
-        Materials.Jade                    = new Materials( 537, TextureSet.SET_SHINY             ,   1.0F,     16,  2, 1  |4|8      |64          ,   0, 100,   0,   0,   "Jade"                    ,   "Jade"                          ,    0,       0,         -1,    0, false, false,   5,   1,   1, Dyes.dyeGreen       ,0, Arrays.asList(new MaterialStack(Sodium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Silicon, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3)));
+        Materials.Jade                    = new Materials( 537, TextureSet.SET_SHINY             ,   1.0F,     16,  2, 1  |4|8      |64          ,   0, 100,   0,   0,   "Jade"                    ,   "Jade"                          ,    0,       0,         -1,    0, false, false,   5,   1,   1, Dyes.dyeGreen       ,0, Arrays.asList(new MaterialStack(Sodium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Silicon, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 6), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3)));
         Materials.Kalendrite              = new Materials( 953, TextureSet.SET_METALLIC          ,   5.0F,   2560,  3, 1|2                       , 170,  91, 189,   0,   "Kalendrite"              ,   "Kalendrite"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Komatiite               = new Materials( 869, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Komatiite"               ,   "Komatiite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      );
         Materials.Lava                    = new Materials( 700, TextureSet.SET_FLUID             ,   1.0F,      0,  1,         16                , 255,  64,   0,   0,   "Lava"                    ,   "Lava"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      );
@@ -393,20 +393,20 @@ public class MaterialsInit1 {
         Materials.Magma                   = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 0                         , 255,  64,   0,   0,   "Magma"                   ,   "Magma"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      );
         Materials.Mawsitsit               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Mawsitsit"               ,   "Mawsitsit"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes._NULL          );
         Materials.Mercassium              = new Materials(  -1, TextureSet.SET_NONE              ,   6.0F,     64,  1, 1|2  |8      |64          , 255, 255, 255,   0,   "Mercassium"              ,   "Mercassium"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
-        Materials.MeteoricIron            = new Materials( 340, TextureSet.SET_METALLIC          ,   6.0F,    384,  3, 1|2  |8   |32|64          , 100,  50,  80,   0,   "MeteoricIron"            ,   "Meteoric Iron"                 ,    0,       0,       1811, 1000,  true, false,   1,   1,   1, Dyes.dyeGray        ,Element.SpFe, Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1)));
-        Materials.MeteoricSteel           = new Materials( 341, TextureSet.SET_METALLIC          ,   6.0F,    768,  4, 1|2          |64          ,  50,  25,  40,   0,   "MeteoricSteel"           ,   "Meteoric Steel"                ,    0,       0,       1811, 1000,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Arrays.asList(new MaterialStack(Materials.MeteoricIron, 50), new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1)));
+        Materials.MeteoricIron            = new Materials( 340, TextureSet.SET_METALLIC          ,   6.0F,    384,  3, 1|2  |8   |32|64          , 100,  50,  80,   0,   "MeteoricIron"            ,   "Meteoric Iron"                 ,    0,       0,       1811, 1000,  true, false,   1,   1,   1, Dyes.dyeGray        ,Element.SpFe, Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1)));
+        Materials.MeteoricSteel           = new Materials( 341, TextureSet.SET_METALLIC          ,   6.0F,    768,  4, 1|2          |64          ,  50,  25,  40,   0,   "MeteoricSteel"           ,   "Meteoric Steel"                ,    0,       0,       1811, 1000,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Arrays.asList(new MaterialStack(Materials.MeteoricIron, 50), new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1)));
         Materials.Meteorite               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 1    |8                   ,  80,  35,  60,   0,   "Meteorite"               ,   "Meteorite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePurple      );
         Materials.Meutoite                = new Materials( 487, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1    |8                   ,  95,  82, 105,   0,   "Meutoite"                ,   "Meutoite"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Migmatite               = new Materials( 872, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Migmatite"               ,   "Migmatite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Mimichite               = new Materials(  -1, TextureSet.SET_GEM_VERTICAL      ,   1.0F,      0,  1, 1  |4|8                   , 255, 255, 255,   0,   "Mimichite"               ,   "Mimichite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
-        Materials.Moonstone               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 1    |8                   , 255, 255, 255,   0,   "Moonstone"               ,   "Moonstone"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeWhite       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 1)));
-        Materials.Naquadah                = new Materials( 324, TextureSet.SET_METALLIC          ,   6.0F,   1280,  4, 1|2  |8   |32|64|128      ,  50,  50,  50,   0,   "Naquadah"                ,   "Naquadah"                      ,    0,       0,       5400, 5400,  true, false,  10,   1,   1, Dyes.dyeBlack       , Element.Nq, Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.NaquadahAlloy           = new Materials( 325, TextureSet.SET_METALLIC          ,   8.0F,   5120,  5, 1|2          |64|128      ,  40,  40,  40,   0,   "NaquadahAlloy"           ,   "Naquadah Alloy"                ,    0,       0,       7200, 7200,  true, false,  10,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.NaquadahEnriched        = new Materials( 326, TextureSet.SET_METALLIC          ,   6.0F,   1280,  4, 1|2  |8      |64          ,  50,  50,  50,   0,   "NaquadahEnriched"        ,   "Enriched Naquadah"             ,    0,       0,       4500, 4500,  true, false,  15,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 2))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Naquadria               = new Materials( 327, TextureSet.SET_SHINY             ,   1.0F,    512,  4, 1|2  |8      |64          ,  30,  30,  30,   0,   "Naquadria"               ,   "Naquadria"                     ,    0,       0,       9000, 9000,  true, false,  20,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 3))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Moonstone               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 1    |8                   , 255, 255, 255,   0,   "Moonstone"               ,   "Moonstone"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeWhite       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 1)));
+        Materials.Naquadah                = new Materials( 324, TextureSet.SET_METALLIC          ,   6.0F,   1280,  4, 1|2  |8   |32|64|128      ,  50,  50,  50,   0,   "Naquadah"                ,   "Naquadah"                      ,    0,       0,       5400, 5400,  true, false,  10,   1,   1, Dyes.dyeBlack       , Element.Nq, Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1), new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.NaquadahAlloy           = new Materials( 325, TextureSet.SET_METALLIC          ,   8.0F,   5120,  5, 1|2          |64|128      ,  40,  40,  40,   0,   "NaquadahAlloy"           ,   "Naquadah Alloy"                ,    0,       0,       7200, 7200,  true, false,  10,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4), new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.NaquadahEnriched        = new Materials( 326, TextureSet.SET_METALLIC          ,   6.0F,   1280,  4, 1|2  |8      |64          ,  50,  50,  50,   0,   "NaquadahEnriched"        ,   "Enriched Naquadah"             ,    0,       0,       4500, 4500,  true, false,  15,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3), new TCAspects.TC_AspectStack(TCAspects.RADIO, 2), new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 2))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Naquadria               = new Materials( 327, TextureSet.SET_SHINY             ,   1.0F,    512,  4, 1|2  |8      |64          ,  30,  30,  30,   0,   "Naquadria"               ,   "Naquadria"                     ,    0,       0,       9000, 9000,  true, false,  20,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4), new TCAspects.TC_AspectStack(TCAspects.RADIO, 3), new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 3))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.Nether                  = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 0                         , 255, 255, 255,   0,   "Nether"                  ,   "Nether"                        ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes._NULL          );
-        Materials.NetherBrick             = new Materials( 814, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 100,   0,   0,   0,   "NetherBrick"             ,   "Nether Brick"                  ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)));
-        Materials.NetherQuartz            = new Materials( 522, TextureSet.SET_QUARTZ            ,   1.0F,     32,  1, 1  |4|8      |64          , 230, 210, 210,   0,   "NetherQuartz"            ,   "Nether Quartz"                 ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)));
+        Materials.NetherBrick             = new Materials( 814, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 100,   0,   0,   0,   "NetherBrick"             ,   "Nether Brick"                  ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1)));
+        Materials.NetherQuartz            = new Materials( 522, TextureSet.SET_QUARTZ            ,   1.0F,     32,  1, 1  |4|8      |64          , 230, 210, 210,   0,   "NetherQuartz"            ,   "Nether Quartz"                 ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 1), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1)));
         Materials.NetherStar              = new Materials( 506, TextureSet.SET_NETHERSTAR        ,   6.0F,   5120,  4, 1|  4|8      |64          , 255, 255, 255,   0,   "NetherStar"              ,   "Nether Star"                   ,    5,   50000,         -1,    0, false, false,  15,   1,   1, Dyes.dyeWhite       );
         Materials.ObsidianFlux            = new Materials(  -1, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1|2                       ,  80,  50, 100,   0,   "ObsidianFlux"            ,   "Fluxed Obsidian"               ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePurple      );
         Materials.Oilsands                = new Materials( 878, TextureSet.SET_NONE              ,   1.0F,      0,  1, 1    |8                   ,  10,  10,  10,   0,   "Oilsands"                ,   "Oilsands"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
@@ -427,20 +427,20 @@ public class MaterialsInit1 {
         Materials.Sand                    = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 0                         , 255, 255, 255,   0,   "Sand"                    ,   "Sand"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      );
         Materials.Sanguinite              = new Materials( 955, TextureSet.SET_METALLIC          ,   3.0F,   4480,  4, 1|2  |8                   , 185,   0,   0,   0,   "Sanguinite"              ,   "Sanguinite"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
         Materials.Siltstone               = new Materials( 876, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 255, 255, 255,   0,   "Siltstone"               ,   "Siltstone"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          );
-        Materials.Sunstone                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 1    |8                   , 255, 255, 255,   0,   "Sunstone"                ,   "Sunstone"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 1)));
+        Materials.Sunstone                = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 1    |8                   , 255, 255, 255,   0,   "Sunstone"                ,   "Sunstone"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 1)));
         Materials.Tar                     = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 0                         ,  10,  10,  10,   0,   "Tar"                     ,   "Tar"                           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       );
         Materials.Tartarite               = new Materials( 956, TextureSet.SET_METALLIC          ,  32.0F,  20480,  3, 1|2  |8                   , 255, 118,  60,   0,   "Tartarite"               ,   "Tartarite"                     ,    0,       0,         10400,    10400, true, false,   1,   1,   1, Dyes._NULL          ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1120, 1120, 1);
         Materials.UUAmplifier             = new Materials( 721, TextureSet.SET_FLUID             ,   1.0F,      0,  1,         16                ,  96,   0, 128,   0,   "UUAmplifier"             ,   "UU-Amplifier"                  ,    0,       0,         -1,    0, false, false,  10,   1,   1, Dyes.dyePink        );
         Materials.UUMatter                = new Materials( 703, TextureSet.SET_FLUID             ,   1.0F,      0,  1,         16                , 128,   0, 196,   0,   "UUMatter"                ,   "UU-Matter"                     ,    0,       0,         -1,    0, false, false,  10,   1,   1, Dyes.dyePink        );
-        Materials.Void                    = new Materials( 970, TextureSet.SET_METALLIC          ,  32.0F,    512,  4, 1|2          |64|128      ,  28,   6,  57,   0,   "Void"                    ,   "Void"                          ,    5,    1500,         -1,    0, false,  true,   5,   2,   1, Dyes.dyeBlack       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1)));
-        Materials.Voidstone               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 0                         , 255, 255, 255, 200,   "Voidstone"               ,   "Voidstone"                     ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes._NULL          , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1)));
+        Materials.Void                    = new Materials( 970, TextureSet.SET_METALLIC          ,  32.0F,    512,  4, 1|2          |64|128      ,  28,   6,  57,   0,   "Void"                    ,   "Void"                          ,    5,    1500,         -1,    0, false,  true,   5,   2,   1, Dyes.dyeBlack       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1)));
+        Materials.Voidstone               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  1, 0                         , 255, 255, 255, 200,   "Voidstone"               ,   "Voidstone"                     ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes._NULL          , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1)));
         Materials.Vulcanite               = new Materials( 489, TextureSet.SET_METALLIC          ,  32.0F,  20480,  2, 1|2  |8      |64|128      , 255, 132,  72,   0,   "Vulcanite"               ,   "Vulcanite"                     ,    0,       0,         8400,    8400, true, false,   1,   1,   1, Dyes._NULL          ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(40, 1, 1);
         Materials.Vyroxeres               = new Materials( 951, TextureSet.SET_METALLIC          ,  32.0F,   7680,  1, 1|2  |8      |64          ,  85, 224,   1,   0,   "Vyroxeres"               ,   "Vyroxeres"                     ,    0,       0,       5400, 5400, true, false,   1,   1,   1, Dyes._NULL          ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1, 3, 1);
         Materials.Yellorium               = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1|2                       , 255, 255, 255,   0,   "Yellorium"               ,   "Yellorium"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      );
         Materials.Zectium                 = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  2, 1|2  |8                   , 255, 255, 255,   0,   "Zectium"                 ,   "Zectium"                       ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBlack       );
 
-        Materials.Antimatter              = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255, 255, 255,   0,   "Antimatter"              ,   "Antimatter"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 9), new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 8)));
-        Materials.AdvancedGlue            = new MaterialBuilder(567, TextureSet.SET_FLUID         ,                                                                                                         "Advanced Glue").setName("AdvancedGlue").addCell().addFluid().setRGB(255, 255, 185).setColor(Dyes.dyeYellow).setAspects(Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 5))).constructMaterial();
+        Materials.Antimatter              = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255, 255, 255,   0,   "Antimatter"              ,   "Antimatter"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 9), new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 8)));
+        Materials.AdvancedGlue            = new MaterialBuilder(567, TextureSet.SET_FLUID         ,                                                                                                         "Advanced Glue").setName("AdvancedGlue").addCell().addFluid().setRGB(255, 255, 185).setColor(Dyes.dyeYellow).setAspects(Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.LIMUS, 5))).constructMaterial();
         Materials.BioFuel                 = new Materials( 705, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 128,   0,   0,   "BioFuel"                 ,   "Biofuel"                       ,    0,       6,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      );
         Materials.Biomass                 = new Materials( 704, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,   0, 255,   0,   0,   "Biomass"        	     ,   "Forestry Biomass"              ,    3,       8,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGreen       );
         Materials.CharcoalByproducts      = new MaterialBuilder(675, TextureSet.SET_FLUID             ,                                                                                                     "Charcoal Byproducts").addCell().setRGB(120, 68, 33).setColor(Dyes.dyeBrown).constructMaterial();
@@ -452,36 +452,36 @@ public class MaterialsInit1 {
         Materials.Cocoa                   = new Materials( 887, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1                         , 190,  95,   0,   0,   "Cocoa"                   ,   "Cocoa"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       );
         Materials.Coffee                  = new Materials( 888, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1                         , 150,  75,   0,   0,   "Coffee"                  ,   "Coffee"                        ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       );
         Materials.Creosote                = new Materials( 712, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 128,  64,   0,   0,   "Creosote"                ,   "Creosote"                      ,    3,       8,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       );
-        Materials.Ethanol                 = new Materials( 706, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 128,   0,   0,   "Ethanol"                 ,   "Ethanol"                       ,    0,     192,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 1, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)));
-        Materials.FishOil                 = new Materials( 711, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 196,   0,   0,   "FishOil"                 ,   "Fish Oil"                      ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 2)));
+        Materials.Ethanol                 = new Materials( 706, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 128,   0,   0,   "Ethanol"                 ,   "Ethanol"                       ,    0,     192,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 1, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1), new TCAspects.TC_AspectStack(TCAspects.AQUA, 1)));
+        Materials.FishOil                 = new Materials( 711, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 196,   0,   0,   "FishOil"                 ,   "Fish Oil"                      ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.CORPUS, 2)));
         Materials.FermentedBiomass        = new MaterialBuilder(691, TextureSet.SET_FLUID             ,                                                                                                     "Fermented Biomass").addCell().addFluid().setRGB(68, 85, 0).setColor(Dyes.dyeBrown).constructMaterial();
         Materials.Fuel                    = new Materials( 708, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 255,   0,   0,   "Fuel"                  ,   "Diesel"                        ,    0,     480,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      );
-        Materials.Glue                    = new Materials( 726, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 200, 196,   0,   0,   "Glue"                    ,   "Refined Glue"                  ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 2)));
-        Materials.Gunpowder               = new Materials( 800, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1                         , 128, 128, 128,   0,   "Gunpowder"               ,   "Gunpowder"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 4)));
-        Materials.FryingOilHot            = new Materials( 727, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 200, 196,   0,   0,   "FryingOilHot"            ,   "Hot Frying Oil"                ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)));
+        Materials.Glue                    = new Materials( 726, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 200, 196,   0,   0,   "Glue"                    ,   "Refined Glue"                  ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.LIMUS, 2)));
+        Materials.Gunpowder               = new Materials( 800, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1                         , 128, 128, 128,   0,   "Gunpowder"               ,   "Gunpowder"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 3), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 4)));
+        Materials.FryingOilHot            = new Materials( 727, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 200, 196,   0,   0,   "FryingOilHot"            ,   "Hot Frying Oil"                ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1)));
         Materials.Honey                   = new Materials( 725, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 210, 200,   0,   0,   "Honey"                   ,   "Honey"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      );
         Materials.Leather                 = new Materials(  -1, TextureSet.SET_ROUGH             ,   1.0F,      0,  0, 1                         , 150, 150,  80, 127,   "Leather"                 ,   "Leather"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      );
-        Materials.Lubricant               = new Materials( 724, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 196,   0,   0,   "Lubricant"               ,   "Lubricant"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1)));
-        Materials.McGuffium239            = new Materials( 999, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 200,  50, 150,   0,   "McGuffium239"            ,   "Mc Guffium 239"                ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.SPIRITUS, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.VITIUM, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 8), new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 8)));
+        Materials.Lubricant               = new Materials( 724, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 255, 196,   0,   0,   "Lubricant"               ,   "Lubricant"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 2), new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1)));
+        Materials.McGuffium239            = new Materials( 999, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 200,  50, 150,   0,   "McGuffium239"            ,   "Mc Guffium 239"                ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 8), new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 8), new TCAspects.TC_AspectStack(TCAspects.SPIRITUS, 8), new TCAspects.TC_AspectStack(TCAspects.AURAM, 8), new TCAspects.TC_AspectStack(TCAspects.VITIUM, 8), new TCAspects.TC_AspectStack(TCAspects.RADIO, 8), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 8), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 8), new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 8), new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 8)));
         Materials.MeatRaw                 = new Materials( 892, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1                         , 255, 100, 100,   0,   "MeatRaw"                 ,   "Raw Meat"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        );
         Materials.MeatCooked              = new Materials( 893, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1                         , 150,  60,  20,   0,   "MeatCooked"              ,   "Cooked Meat"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        );
-        Materials.Milk                    = new Materials( 885, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1      |16                , 254, 254, 254,   0,   "Milk"                    ,   "Milk"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 2)));
+        Materials.Milk                    = new Materials( 885, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1      |16                , 254, 254, 254,   0,   "Milk"                    ,   "Milk"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.SANO, 2)));
         Materials.Mud                     = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255, 255, 255,   0,   "Mud"                     ,   "Mud"                           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       );
         Materials.Oil                     = new Materials( 707, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,  10,  10,  10,   0,   "Oil"                     ,   "Oil"                           ,    3,      20,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       );
-        Materials.Paper                   = new Materials( 879, TextureSet.SET_PAPER             ,   1.0F,      0,  0, 1                         , 250, 250, 250,   0,   "Paper"                   ,   "Paper"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1)));
-        Materials.Peat                    = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255, 255, 255,   0,   "Peat"                    ,   "Peat"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2)));
-        Materials.RareEarth               = new Materials( 891, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1                         , 128, 128, 100,   0,   "RareEarth"               ,   "Rare Earth"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1)));
+        Materials.Paper                   = new Materials( 879, TextureSet.SET_PAPER             ,   1.0F,      0,  0, 1                         , 250, 250, 250,   0,   "Paper"                   ,   "Paper"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 1)));
+        Materials.Peat                    = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255, 255, 255,   0,   "Peat"                    ,   "Peat"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2)));
+        Materials.RareEarth               = new Materials( 891, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1                         , 128, 128, 100,   0,   "RareEarth"               ,   "Rare Earth"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1), new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1)));
         Materials.Red                     = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255,   0,   0,   0,   "Red"                     ,   "Red"                           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         );
         Materials.Reinforced              = new Materials( 383, TextureSet.SET_METALLIC          ,   7.0F,    480,  4, 1|2          |64|128      , 105, 141, 165,   0,   "Reinforced"              ,   "Reinforced"                    ,    0,       0,         -1, 1700,  true, false,   1,   1,   1, Dyes.dyeBlue        ).disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.SeedOil                 = new Materials( 713, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 196, 255,   0,   0,   "SeedOil"                 ,   "Seed Oil"                      ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.GRANUM, 2)));
-        Materials.SeedOilHemp             = new Materials( 722, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 196, 255,   0,   0,   "SeedOilHemp"             ,   "Hemp Seed Oil"                 ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.GRANUM, 2)));
-        Materials.SeedOilLin              = new Materials( 723, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 196, 255,   0,   0,   "SeedOilLin"              ,   "Lin Seed Oil"                  ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.GRANUM, 2)));
-        Materials.Stone                   = new Materials( 299, TextureSet.SET_ROUGH             ,   4.0F,     32,  1, 1            |64|128      , 205, 205, 205,   0,   "Stone"                   ,   "Stone"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightGray   , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1)));
-        Materials.TNT                     = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255, 255, 255,   0,   "TNT"                     ,   "TNT"                           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 7), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 4)));
-        Materials.Unstable                = new Materials( 396, TextureSet.SET_SHINY             ,   1.0F,      0,  4, 1                         , 220, 220, 220, 127,   "Unstable"                ,   "Unstable"                      ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 4)));
-        Materials.Unstableingot           = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  4, 0                         , 255, 255, 255, 127,   "Unstableingot"           ,   "Unstable"                      ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 4)));
+        Materials.SeedOil                 = new Materials( 713, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 196, 255,   0,   0,   "SeedOil"                 ,   "Seed Oil"                      ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.GRANUM, 2)));
+        Materials.SeedOilHemp             = new Materials( 722, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 196, 255,   0,   0,   "SeedOilHemp"             ,   "Hemp Seed Oil"                 ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.GRANUM, 2)));
+        Materials.SeedOilLin              = new Materials( 723, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                , 196, 255,   0,   0,   "SeedOilLin"              ,   "Lin Seed Oil"                  ,    3,       2,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.GRANUM, 2)));
+        Materials.Stone                   = new Materials( 299, TextureSet.SET_ROUGH             ,   4.0F,     32,  1, 1            |64|128      , 205, 205, 205,   0,   "Stone"                   ,   "Stone"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightGray   , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.TERRA, 1)));
+        Materials.TNT                     = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  0, 0                         , 255, 255, 255,   0,   "TNT"                     ,   "TNT"                           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 7), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 4)));
+        Materials.Unstable                = new Materials( 396, TextureSet.SET_SHINY             ,   1.0F,      0,  4, 1                         , 220, 220, 220, 127,   "Unstable"                ,   "Unstable"                      ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 4)));
+        Materials.Unstableingot           = new Materials(  -1, TextureSet.SET_NONE              ,   1.0F,      0,  4, 0                         , 255, 255, 255, 127,   "Unstableingot"           ,   "Unstable"                      ,    0,       0,         -1,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 4)));
         Materials.Vinegar                 = new MaterialBuilder(690, TextureSet.SET_FLUID             ,                                                                                                     "Vinegar").setColor(Dyes.dyeBrown).constructMaterial();
-        Materials.Wheat                   = new Materials( 881, TextureSet.SET_POWDER            ,   1.0F,      0,  0, 1                         , 255, 255, 196,   0,   "Wheat"                   ,   "Wheat"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 2)));
+        Materials.Wheat                   = new Materials( 881, TextureSet.SET_POWDER            ,   1.0F,      0,  0, 1                         , 255, 255, 196,   0,   "Wheat"                   ,   "Wheat"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MESSIS, 2)));
         Materials.WoodGas                 = new MaterialBuilder(660, TextureSet.SET_FLUID             ,                                                                                                     "Wood Gas").addCell().addGas().setRGB(222, 205, 135).setColor(Dyes.dyeBrown).setFuelType(MaterialBuilder.GAS).setFuelPower(24).constructMaterial();
         Materials.WoodTar                 = new MaterialBuilder(662, TextureSet.SET_FLUID             ,                                                                                                     "Wood Tar").addCell().addFluid().setRGB(40, 23, 11).setColor(Dyes.dyeBrown).constructMaterial();
         Materials.WoodVinegar             = new MaterialBuilder(661, TextureSet.SET_FLUID             ,                                                                                                     "Wood Vinegar").addCell().addFluid().setRGB(212, 85, 0).setColor(Dyes.dyeBrown).constructMaterial();
@@ -502,57 +502,57 @@ public class MaterialsInit1 {
         Materials.LiquidNitrogen          = new Materials( 494, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 169, 208, 245, 240,   "LiquidNitrogen"          ,   "Liquid Nitrogen"               ,    0,       0,          4,    0, false,  true,   1,   1,   1, Dyes.dyeLightBlue   , 1, Collections.singletonList(new MaterialStack(Nitrogen, 1)));
         Materials.LiquidOxygen            = new Materials( 493, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16|32             , 169, 208, 245, 240,   "LiquidOxygen"            ,   "Liquid Oxygen"                 ,    0,       0,          4,    0, false,  true,   1,   1,   1, Dyes.dyeLightBlue   , 1, Collections.singletonList(new MaterialStack(Oxygen, 1)));
         Materials.SiliconDioxide          = new MaterialBuilder(837, TextureSet.SET_QUARTZ, "Silicon Dioxide").setToolSpeed(1.0F).setDurability(0).setToolQuality(1).addDustItems().setRGB(255, 255, 255).setColor(Dyes.dyeLightGray).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Oxygen, 2)).constructMaterial();
-        Materials.Jasper                  = new Materials( 511, TextureSet.SET_EMERALD           ,   1.0F,      0,  2, 1  |4|8      |64          , 200,  80,  80, 100,   "Jasper"                  ,   "Jasper"                        ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeRed         , 1, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2)));
+        Materials.Jasper                  = new Materials( 511, TextureSet.SET_EMERALD           ,   1.0F,      0,  2, 1  |4|8      |64          , 200,  80,  80, 100,   "Jasper"                  ,   "Jasper"                        ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeRed         , 1, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 4), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2)));
         Materials.Almandine               = new Materials( 820, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1    |8                   , 255,   0,   0,   0,   "Almandine"               ,   "Almandine"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeRed         , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Iron, 3), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
         Materials.Andradite               = new Materials( 821, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1    |8                   , 150, 120,   0,   0,   "Andradite"               ,   "Andradite"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      , 1, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Iron, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
         Materials.AnnealedCopper          = new Materials( 345, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2             |128      , 255, 120,  20,   0,   "AnnealedCopper"          ,   "Annealed Copper"               ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeOrange      , 2, Collections.singletonList(new MaterialStack(Copper, 1)));
         Materials.Asbestos                = new Materials( 946, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   , 230, 230, 230,   0,   "Asbestos"                ,   "Asbestos"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 2), new MaterialStack(Hydrogen, 4), new MaterialStack(Oxygen, 9))); // Mg3Si2O5(OH)4
-        Materials.Ash                     = new Materials( 815, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 150, 150, 150,   0,   "Ash"                     ,   "Ashes"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightGray   , 2, Collections.singletonList(new MaterialStack(Carbon, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 1)));
+        Materials.Ash                     = new Materials( 815, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 150, 150, 150,   0,   "Ash"                     ,   "Ashes"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightGray   , 2, Collections.singletonList(new MaterialStack(Carbon, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 1)));
         Materials.BandedIron              = new Materials( 917, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 145,  90,  90,   0,   "BandedIron"              ,   "Banded Iron"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 1, Arrays.asList(new MaterialStack(Iron, 2), new MaterialStack(Oxygen, 3)));
         Materials.BatteryAlloy            = new Materials( 315, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1|2                       , 156, 124, 160,   0,   "BatteryAlloy"            ,   "Battery Alloy"                 ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePurple      , 2, Arrays.asList(new MaterialStack(Lead, 4), new MaterialStack(Antimony, 1)));
-        Materials.BlueTopaz               = new Materials( 513, TextureSet.SET_GEM_HORIZONTAL    ,   7.0F,    256,  3, 1  |4|8      |64          ,   0,   0, 255, 127,   "BlueTopaz"               ,   "Blue Topaz"                    ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 2), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4)));
-        Materials.Bone                    = new Materials( 806, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 250, 250, 250,   0,   "Bone"                    ,   "Bone"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Collections.singletonList(new MaterialStack(Calcium, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.MORTUUS, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1)));
-        Materials.Brass                   = new Materials( 301, TextureSet.SET_METALLIC          ,   7.0F,     96,  1, 1|2          |64|128      , 255, 180,   0,   0,   "Brass"                   ,   "Brass"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Zinc, 1), new MaterialStack(Copper, 3)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
-        Materials.Bronze                  = new Materials( 300, TextureSet.SET_METALLIC          ,   6.0F,    192,  2, 1|2          |64|128      , 255, 128,   0,   0,   "Bronze"                  ,   "Bronze"                        ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 2, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Copper, 3)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+        Materials.BlueTopaz               = new Materials( 513, TextureSet.SET_GEM_HORIZONTAL    ,   7.0F,    256,  3, 1  |4|8      |64          ,   0,   0, 255, 127,   "BlueTopaz"               ,   "Blue Topaz"                    ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 2), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 6), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4)));
+        Materials.Bone                    = new Materials( 806, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         , 250, 250, 250,   0,   "Bone"                    ,   "Bone"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Collections.singletonList(new MaterialStack(Calcium, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.MORTUUS, 2), new TCAspects.TC_AspectStack(TCAspects.CORPUS, 1)));
+        Materials.Brass                   = new Materials( 301, TextureSet.SET_METALLIC          ,   7.0F,     96,  1, 1|2          |64|128      , 255, 180,   0,   0,   "Brass"                   ,   "Brass"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Zinc, 1), new MaterialStack(Copper, 3)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1)));
+        Materials.Bronze                  = new Materials( 300, TextureSet.SET_METALLIC          ,   6.0F,    192,  2, 1|2          |64|128      , 255, 128,   0,   0,   "Bronze"                  ,   "Bronze"                        ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 2, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Copper, 3)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1)));
         Materials.BrownLimonite           = new Materials( 930, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1    |8                   , 200, 100,   0,   0,   "BrownLimonite"           ,   "Brown Limonite"                ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Hydrogen, 1), new MaterialStack(Oxygen, 2))); // FeO(OH)
         Materials.Calcite                 = new Materials( 823, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   , 250, 230, 220,   0,   "Calcite"                 ,   "Calcite"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 1, Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 3)));
         Materials.Cassiterite             = new Materials( 824, TextureSet.SET_METALLIC          ,   1.0F,      0,  3, 1    |8                   , 220, 220, 220,   0,   "Cassiterite"             ,   "Cassiterite"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Oxygen, 2)));
         Materials.CassiteriteSand         = new Materials( 937, TextureSet.SET_SAND              ,   1.0F,      0,  1, 1    |8                   , 220, 220, 220,   0,   "CassiteriteSand"         ,   "Cassiterite Sand"              ,    0,       0,         -1,    0, false, false,   4,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Oxygen, 2)));
         Materials.Chalcopyrite            = new Materials( 855, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   , 160, 120,  40,   0,   "Chalcopyrite"            ,   "Chalcopyrite"                  ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , 1, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Iron, 1), new MaterialStack(Sulfur, 2)));
-        Materials.Charcoal                = new Materials( 536, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1  |4                     , 100,  70,  70,   0,   "Charcoal"                ,   "Charcoal"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2)));
+        Materials.Charcoal                = new Materials( 536, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1  |4                     , 100,  70,  70,   0,   "Charcoal"                ,   "Charcoal"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2)));
         Materials.Chromite                = new Materials( 825, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1    |8                   ,  35,  20,  15,   0,   "Chromite"                ,   "Chromite"                      ,    0,       0,       1700, 1700,  true, false,   6,   1,   1, Dyes.dyePink        , 1, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Chrome, 2), new MaterialStack(Oxygen, 4)));
-        Materials.ChromiumDioxide         = new Materials( 361, TextureSet.SET_DULL              ,  11.0F,    256,  3, 1|2                       , 230, 200, 200,   0,   "ChromiumDioxide"         ,   "Chromium Dioxide"              ,    0,       0,        650,  650, false, false,   5,   1,   1, Dyes.dyePink        , 1, Arrays.asList(new MaterialStack(Chrome, 1), new MaterialStack(Oxygen, 2)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1)));
+        Materials.ChromiumDioxide         = new Materials( 361, TextureSet.SET_DULL              ,  11.0F,    256,  3, 1|2                       , 230, 200, 200,   0,   "ChromiumDioxide"         ,   "Chromium Dioxide"              ,    0,       0,        650,  650, false, false,   5,   1,   1, Dyes.dyePink        , 1, Arrays.asList(new MaterialStack(Chrome, 1), new MaterialStack(Oxygen, 2)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1)));
         Materials.Cinnabar                = new Materials( 826, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1    |8                   , 150,   0,   0,   0,   "Cinnabar"                ,   "Cinnabar"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBrown       , 2, Arrays.asList(new MaterialStack(Mercury, 1), new MaterialStack(Sulfur, 1)));
-        Materials.Water                   = new Materials( 701, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,   0,   0, 255,   0,   "Water"                   ,   "Water"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2)));
+        Materials.Water                   = new Materials( 701, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,   0,   0, 255,   0,   "Water"                   ,   "Water"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 2)));
         Materials.Clay                    = new Materials( 805, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1                         , 200, 200, 220,   0,   "Clay"                    ,   "Clay"                          ,    0,       0,         -1,    0, false, false,   5,   1,   1, Dyes.dyeLightBlue   , 0, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Lithium, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 2),new MaterialStack(Oxygen,7),new MaterialStack(Water,2)));
-        Materials.Coal                    = new Materials( 535, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1  |4|8                   ,  70,  70,  70,   0,   "Coal"                    ,   "Coal"                          ,    0,       0,         -1,    0, false, false,   2,   2,   1, Dyes.dyeBlack       , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2)));
+        Materials.Coal                    = new Materials( 535, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1  |4|8                   ,  70,  70,  70,   0,   "Coal"                    ,   "Coal"                          ,    0,       0,         -1,    0, false, false,   2,   2,   1, Dyes.dyeBlack       , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2)));
         Materials.Cobaltite               = new Materials( 827, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1    |8                   ,  80,  80, 250,   0,   "Cobaltite"               ,   "Cobaltite"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBlue        , 1, Arrays.asList(new MaterialStack(Cobalt, 1), new MaterialStack(Arsenic, 1), new MaterialStack(Sulfur, 1)));
         Materials.Cooperite               = new Materials( 828, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1    |8                   , 255, 255, 200,   0,   "Cooperite"               ,   "Sheldonite"                    ,    0,       0,         -1,    0, false, false,   5,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Platinum, 3), new MaterialStack(Nickel, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Palladium, 1)));
         Materials.Cupronickel             = new Materials( 310, TextureSet.SET_METALLIC          ,   6.0F,     64,  1, 1|2          |64          , 227, 150, 128,   0,   "Cupronickel"             ,   "Cupronickel"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Nickel, 1)));
-        Materials.DarkAsh                 = new Materials( 816, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         ,  50,  50,  50,   0,   "DarkAsh"                 ,   "Dark Ashes"                    ,    0,       0,         -1,    0, false, false,   1,   2,   1, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 1)));
-        Materials.DeepIron                = new Materials( 829, TextureSet.SET_METALLIC          ,   6.0F,    384,  2, 1|2  |8      |64          , 150, 140, 140,   0,   "DeepIron"                ,   "Deep Iron"                     ,    0,       0,       7500, 7500,  true, false,   3,   1,   1, Dyes.dyePink        , 2, Collections.singletonList(new MaterialStack(Iron, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Diamond                 = new Materials( 500, TextureSet.SET_DIAMOND           ,   8.0F,   1280,  4, 1  |4|8      |64|128      , 200, 255, 255, 127,   "Diamond"                 ,   "Diamond"                       ,    0,       0,         -1,    0, false,  true,   5,  64,   1, Dyes.dyeWhite       , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 4)));
+        Materials.DarkAsh                 = new Materials( 816, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1                         ,  50,  50,  50,   0,   "DarkAsh"                 ,   "Dark Ashes"                    ,    0,       0,         -1,    0, false, false,   1,   2,   1, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1), new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 1)));
+        Materials.DeepIron                = new Materials( 829, TextureSet.SET_METALLIC          ,   6.0F,    384,  2, 1|2  |8      |64          , 150, 140, 140,   0,   "DeepIron"                ,   "Deep Iron"                     ,    0,       0,       7500, 7500,  true, false,   3,   1,   1, Dyes.dyePink        , 2, Collections.singletonList(new MaterialStack(Iron, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Diamond                 = new Materials( 500, TextureSet.SET_DIAMOND           ,   8.0F,   1280,  4, 1  |4|8      |64|128      , 200, 255, 255, 127,   "Diamond"                 ,   "Diamond"                       ,    0,       0,         -1,    0, false,  true,   5,  64,   1, Dyes.dyeWhite       , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3), new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 4)));
         Materials.Electrum                = new Materials( 303, TextureSet.SET_SHINY             ,  12.0F,     64,  2, 1|2  |8      |64|128      , 255, 255, 100,   0,   "Electrum"                ,   "Electrum"                      ,    0,       0,         -1,    0, false, false,   4,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Silver, 1), new MaterialStack(Gold, 1)));
-        Materials.Emerald                 = new Materials( 501, TextureSet.SET_EMERALD           ,   7.0F,    256,  4, 1  |4|8      |64          ,  80, 255,  80, 127,   "Emerald"                 ,   "Emerald"                       ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeGreen       , 0, Arrays.asList(new MaterialStack(Beryllium, 3), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 6), new MaterialStack(Oxygen, 18)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 5)));
-        Materials.FreshWater              = new Materials(  -1, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,   0,   0, 255,   0,   "FreshWater"              ,   "Fresh Water"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2)));
+        Materials.Emerald                 = new Materials( 501, TextureSet.SET_EMERALD           ,   7.0F,    256,  4, 1  |4|8      |64          ,  80, 255,  80, 127,   "Emerald"                 ,   "Emerald"                       ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeGreen       , 0, Arrays.asList(new MaterialStack(Beryllium, 3), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 6), new MaterialStack(Oxygen, 18)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3), new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 5)));
+        Materials.FreshWater              = new Materials(  -1, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,   0,   0, 255,   0,   "FreshWater"              ,   "Fresh Water"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 2)));
         Materials.Galena                  = new Materials( 830, TextureSet.SET_DULL              ,   1.0F,      0,  3, 1 |8                      , 100,  60, 100,   0,   "Galena"                  ,   "Galena"                        ,    0,       0,         -1,    0, false, false,   4,   1,   1, Dyes.dyePurple      , 1, Arrays.asList(new MaterialStack(Lead, 1), new MaterialStack(Sulfur, 1)));
         Materials.Garnierite              = new Materials( 906, TextureSet.SET_METALLIC          ,   1.0F,      0,  3, 1    |8                   ,  50, 200,  70,   0,   "Garnierite"              ,   "Garnierite"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightBlue   , 1, Arrays.asList(new MaterialStack(Nickel, 1), new MaterialStack(Oxygen, 1)));
         Materials.Glyceryl                = new Materials( 714, TextureSet.SET_FLUID             ,   1.0F,      0,  1,         16                ,   0, 150, 150,   0,   "Glyceryl"                ,   "Glyceryl Trinitrate"           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeCyan        , 1, Arrays.asList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 5), new MaterialStack(Nitrogen, 3), new MaterialStack(Oxygen, 9)));
-        Materials.GreenSapphire           = new MaterialBuilder(504, TextureSet.SET_GEM_HORIZONTAL, "Green Sapphire").setToolSpeed(7.0F).setDurability(256).setToolQuality(2).addDustItems().addGemItems().setTransparent(true).addOreItems().addToolHeadItems().setRGBA(100, 200, 130, 127).setColor(Dyes.dyeCyan).setOreValue(5).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.GreenSapphire           = new MaterialBuilder(504, TextureSet.SET_GEM_HORIZONTAL, "Green Sapphire").setToolSpeed(7.0F).setDurability(256).setToolQuality(2).addDustItems().addGemItems().setTransparent(true).addOreItems().addToolHeadItems().setRGBA(100, 200, 130, 127).setColor(Dyes.dyeCyan).setOreValue(5).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 5), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
         Materials.Grossular               = new Materials( 831, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1    |8                   , 200, 100,   0,   0,   "Grossular"               ,   "Grossular"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeOrange      , 0, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
-        Materials.HolyWater               = new Materials( 729, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,   0,   0, 255,   0,   "HolyWater"               ,   "Holy Water"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 1)));
-        Materials.Ice                     = new Materials( 702, TextureSet.SET_SHINY             ,   1.0F,      0,  0, 1|      16                , 200, 200, 255,   0,   "Ice"                     ,   "Ice"                           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 2)));
+        Materials.HolyWater               = new Materials( 729, TextureSet.SET_FLUID             ,   1.0F,      0,  0,         16                ,   0,   0, 255,   0,   "HolyWater"               ,   "Holy Water"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 2), new TCAspects.TC_AspectStack(TCAspects.AURAM, 1)));
+        Materials.Ice                     = new Materials( 702, TextureSet.SET_SHINY             ,   1.0F,      0,  0, 1|      16                , 200, 200, 255,   0,   "Ice"                     ,   "Ice"                           ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.GELUM, 2)));
         Materials.Ilmenite                = new Materials( 918, TextureSet.SET_METALLIC          ,   1.0F,      0,  3, 1    |8                   ,  70,  55,  50,   0,   "Ilmenite"                ,   "Ilmenite"                      ,    0,       0,         -1,    0, false, false,   1,   2,   1, Dyes.dyePurple      , 0, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Titanium, 1), new MaterialStack(Oxygen, 3)));
         Materials.Rutile                  = new Materials( 375, TextureSet.SET_GEM_HORIZONTAL    ,   1.0F,      0,  2, 1    |8                   , 212,  13,  92,   0,   "Rutile"                  ,   "Rutile"                        ,    0,       0,         -1,    0, false, false,   1,   2,   1, Dyes.dyeRed         , 0, Arrays.asList(new MaterialStack(Titanium, 1), new MaterialStack(Oxygen, 2)));
         Materials.Bauxite                 = new Materials( 822, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   , 200, 100,   0,   0,   "Bauxite"                 ,   "Bauxite"                       ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBrown       , 1, Arrays.asList(new MaterialStack(Rutile, 2), new MaterialStack(Aluminium, 16), new MaterialStack(Hydrogen, 10), new MaterialStack(Oxygen, 11)));
         Materials.Titaniumtetrachloride   = new Materials( 376, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16                , 212,  13,  92,   0,   "Titaniumtetrachloride"   ,   "Titaniumtetrachloride"         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         , 0, Arrays.asList(new MaterialStack(Titanium, 1), new MaterialStack(Chlorine, 4)));
         Materials.Magnesiumchloride       = new Materials( 377, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|16                      , 212,  13,  92,   0,   "Magnesiumchloride"       ,   "Magnesiumchloride"             ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         , 0, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Chlorine, 2)));
-        Materials.Invar                   = new Materials( 302, TextureSet.SET_METALLIC          ,   6.0F,    256,  2, 1|2          |64|128      , 180, 180, 120,   0,   "Invar"                   ,   "Invar"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 2, Arrays.asList(new MaterialStack(Iron, 2), new MaterialStack(Nickel, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1)));
+        Materials.Invar                   = new Materials( 302, TextureSet.SET_METALLIC          ,   6.0F,    256,  2, 1|2          |64|128      , 180, 180, 120,   0,   "Invar"                   ,   "Invar"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 2, Arrays.asList(new MaterialStack(Iron, 2), new MaterialStack(Nickel, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.GELUM, 1)));
         Materials.Kanthal                 = new Materials( 312, TextureSet.SET_METALLIC          ,   6.0F,     64,  2, 1|2          |64          , 194, 210, 223,   0,   "Kanthal"                 ,   "Kanthal"                       ,    0,       0,       1800, 1800,  true, false,   1,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Chrome, 1))).disableAutoGeneratedBlastFurnaceRecipes();
         Materials.Lazurite                = new Materials( 524, TextureSet.SET_LAPIS             ,   1.0F,      0,  1, 1  |4|8                   , 100, 120, 255,   0,   "Lazurite"                ,   "Lazurite"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeCyan        , 1, Arrays.asList(new MaterialStack(Aluminium, 6), new MaterialStack(Silicon, 6), new MaterialStack(Calcium, 8), new MaterialStack(Sodium, 8)));
         Materials.Magnalium               = new Materials( 313, TextureSet.SET_DULL              ,   6.0F,    256,  2, 1|2          |64|128      , 200, 190, 255,   0,   "Magnalium"               ,   "Magnalium"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightBlue   , 2, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Aluminium, 2)));
         Materials.Magnesite               = new Materials( 908, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   , 250, 250, 180,   0,   "Magnesite"               ,   "Magnesite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 3)));
-        Materials.Magnetite               = new Materials( 870, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   ,  30,  30,  30,   0,   "Magnetite"               ,   "Magnetite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , 1, Arrays.asList(new MaterialStack(Iron, 3), new MaterialStack(Oxygen, 4)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+        Materials.Magnetite               = new Materials( 870, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   ,  30,  30,  30,   0,   "Magnetite"               ,   "Magnetite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , 1, Arrays.asList(new MaterialStack(Iron, 3), new MaterialStack(Oxygen, 4)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1)));
         Materials.Molybdenite             = new Materials( 942, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   ,  25,  25,  25,   0,   "Molybdenite"             ,   "Molybdenite"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlue        , 1, Arrays.asList(new MaterialStack(Molybdenum, 1), new MaterialStack(Sulfur, 2))); // MoS2 (also source of Re)
         Materials.Nichrome                = new Materials( 311, TextureSet.SET_METALLIC          ,   6.0F,     64,  2, 1|2          |64          , 205, 206, 246,   0,   "Nichrome"                ,   "Nichrome"                      ,    0,       0,       2700, 2700,  true, false,   1,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Nickel, 4), new MaterialStack(Chrome, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.NiobiumNitride          = new Materials( 359, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1|2                       ,  29,  41,  29,   0,   "NiobiumNitride"          ,   "Niobium Nitride"               ,    0,       0,       2573, 2573,  true, false,   1,   1,   1, Dyes.dyeBlack       , 1, Arrays.asList(new MaterialStack(Niobium, 1), new MaterialStack(Nitrogen, 1))); // Anti-Reflective Material
@@ -562,27 +562,27 @@ public class MaterialsInit1 {
         Materials.Obsidian                = new Materials( 804, TextureSet.SET_DULL              ,   1.0F,      0,  3, 1|2                       ,  80,  50, 100,   0,   "Obsidian"                ,   "Obsidian"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Iron, 1), new MaterialStack(Silicon, 2), new MaterialStack(Oxygen, 8)));
         Materials.Phosphate               = new Materials( 833, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8|16                , 255, 255,   0,   0,   "Phosphate"               ,   "Phosphate"                     ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeYellow      , 1, Arrays.asList(new MaterialStack(Phosphorus, 1), new MaterialStack(Oxygen, 4)));
         Materials.PigIron                 = new Materials( 307, TextureSet.SET_METALLIC          ,   6.0F,    384,  2, 1|2  |8      |64          , 200, 180, 180,   0,   "PigIron"                 ,   "Pig Iron"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyePink        , 2, Collections.singletonList(new MaterialStack(Iron, 1)));
-        Materials.Plastic                 = new Materials( 874, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      , 200, 200, 200,   0,   "Plastic"                 ,   "Polyethylene"                  ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 2)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
-        Materials.Epoxid                  = new Materials( 470, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      , 200, 140,  20,   0,   "Epoxid"                  ,   "Epoxid"                        ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 21), new MaterialStack(Hydrogen, 24), new MaterialStack(Oxygen, 4)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
+        Materials.Plastic                 = new Materials( 874, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      , 200, 200, 200,   0,   "Plastic"                 ,   "Polyethylene"                  ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 2)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
+        Materials.Epoxid                  = new Materials( 470, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      , 200, 140,  20,   0,   "Epoxid"                  ,   "Epoxid"                        ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 21), new MaterialStack(Hydrogen, 24), new MaterialStack(Oxygen, 4)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
         Materials.Polydimethylsiloxane    = new MaterialBuilder(633, TextureSet.SET_FLUID         ,                                                                                                     "Polydimethylsiloxane").addDustItems().setRGB(245, 245, 245).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1), new MaterialStack(Silicon, 1)).addElectrolyzerRecipe().constructMaterial();
-        Materials.Silicone                = new Materials( 471, TextureSet.SET_DULL              ,   3.0F,    128,  1, 1|2          |64|128      , 220, 220, 220,   0,   "Silicone"                ,   "Silicone Rubber"               ,    0,       0,        900,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1), new MaterialStack(Silicon, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
-        Materials.Polycaprolactam         = new Materials( 472, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      ,  50,  50,  50,   0,   "Polycaprolactam"         ,   "Polycaprolactam"               ,    0,       0,        500,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 11), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
-        Materials.Polytetrafluoroethylene = new Materials( 473, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      , 100, 100, 100,   0,   "Polytetrafluoroethylene" ,   "Polytetrafluoroethylene"       ,    0,       0,       1400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Fluorine, 4)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
+        Materials.Silicone                = new Materials( 471, TextureSet.SET_DULL              ,   3.0F,    128,  1, 1|2          |64|128      , 220, 220, 220,   0,   "Silicone"                ,   "Silicone Rubber"               ,    0,       0,        900,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1), new MaterialStack(Silicon, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
+        Materials.Polycaprolactam         = new Materials( 472, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      ,  50,  50,  50,   0,   "Polycaprolactam"         ,   "Polycaprolactam"               ,    0,       0,        500,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 11), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
+        Materials.Polytetrafluoroethylene = new Materials( 473, TextureSet.SET_DULL              ,   3.0F,     32,  1, 1|2          |64|128      , 100, 100, 100,   0,   "Polytetrafluoroethylene" ,   "Polytetrafluoroethylene"       ,    0,       0,       1400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Fluorine, 4)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
         Materials.Powellite               = new Materials( 883, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 255, 255,   0,   0,   "Powellite"               ,   "Powellite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Molybdenum, 1), new MaterialStack(Oxygen, 4)));
         Materials.Pumice                  = new Materials( 926, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 230, 185, 185,   0,   "Pumice"                  ,   "Pumice"                        ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , 2, Collections.singletonList(new MaterialStack(Stone, 1)));
         Materials.Pyrite                  = new Materials( 834, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1    |8                   , 150, 120,  40,   0,   "Pyrite"                  ,   "Pyrite"                        ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeOrange      , 1, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Sulfur, 2)));
         Materials.Pyrolusite              = new Materials( 943, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 150, 150, 170,   0,   "Pyrolusite"              ,   "Pyrolusite"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLightGray   , 1, Arrays.asList(new MaterialStack(Manganese, 1), new MaterialStack(Oxygen, 2)));
         Materials.Pyrope                  = new Materials( 835, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   , 120,  50, 100,   0,   "Pyrope"                  ,   "Pyrope"                        ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyePurple      , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
         Materials.RockSalt                = new Materials( 944, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1    |8                   , 240, 200, 200,   0,   "RockSalt"                ,   "Rock Salt"                     ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Chlorine, 1)));
-        Materials.Rubber                  = new Materials( 880, TextureSet.SET_SHINY             ,   1.5F,     32,  0, 1|2          |64|128      ,   0,   0,   0,   0,   "Rubber"                  ,   "Rubber"                        ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 0, Arrays.asList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 8)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
-        Materials.RawRubber               = new Materials( 896, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1                         , 204, 199, 137,   0,   "RawRubber"               ,   "Raw Rubber"                    ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 8)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
-        Materials.Ruby                    = new Materials( 502, TextureSet.SET_RUBY              ,   7.0F,    256,  2, 1  |4|8      |64          , 255, 100, 100, 127,   "Ruby"                    ,   "Ruby"                          ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeRed         , 0, Arrays.asList(new MaterialStack(Chrome, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4))).disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Rubber                  = new Materials( 880, TextureSet.SET_SHINY             ,   1.5F,     32,  0, 1|2          |64|128      ,   0,   0,   0,   0,   "Rubber"                  ,   "Rubber"                        ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 0, Arrays.asList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 8)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
+        Materials.RawRubber               = new Materials( 896, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1                         , 204, 199, 137,   0,   "RawRubber"               ,   "Raw Rubber"                    ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 8)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
+        Materials.Ruby                    = new Materials( 502, TextureSet.SET_RUBY              ,   7.0F,    256,  2, 1  |4|8      |64          , 255, 100, 100, 127,   "Ruby"                    ,   "Ruby"                          ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeRed         , 0, Arrays.asList(new MaterialStack(Chrome, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 6), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4))).disableAutoGeneratedBlastFurnaceRecipes();
         Materials.Salt                    = new Materials( 817, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1    |8                   , 250, 250, 250,   0,   "Salt"                    ,   "Salt"                          ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Sodium, 1), new MaterialStack(Chlorine, 1)));
         Materials.Saltpeter               = new Materials( 836, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1    |8                   , 230, 230, 230,   0,   "Saltpeter"               ,   "Saltpeter"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 3)));
-        Materials.Sapphire                = new MaterialBuilder(503, TextureSet.SET_GEM_VERTICAL, "Sapphire").setToolSpeed(7.0F).setDurability(256).setToolQuality(2).addDustItems().addGemItems().setTransparent(true).addOreItems().addToolHeadItems().setRGBA(100, 100, 200, 127).setColor(Dyes.dyeBlue).setOreValue(5).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Sapphire                = new MaterialBuilder(503, TextureSet.SET_GEM_VERTICAL, "Sapphire").setToolSpeed(7.0F).setDurability(256).setToolQuality(2).addDustItems().addGemItems().setTransparent(true).addOreItems().addToolHeadItems().setRGBA(100, 100, 200, 127).setColor(Dyes.dyeBlue).setOreValue(5).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 5), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
 
         Materials.Scheelite               = new Materials( 910, TextureSet.SET_DULL              ,   1.0F,      0,  3, 1    |8                   , 200, 140,  20,   0,   "Scheelite"               ,   "Scheelite"                     ,    0,       0,       2500, 2500, false, false,   4,   1,   1, Dyes.dyeBlack       , 0, Arrays.asList(new MaterialStack(Tungsten, 1), new MaterialStack(Calcium, 1), new MaterialStack(Oxygen, 4)));
-        Materials.Snow                    = new Materials( 728, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1|      16                , 250, 250, 250,   0,   "Snow"                    ,   "Snow"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1)));
+        Materials.Snow                    = new Materials( 728, TextureSet.SET_FINE              ,   1.0F,      0,  0, 1|      16                , 250, 250, 250,   0,   "Snow"                    ,   "Snow"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.GELUM, 1)));
         Materials.Sodalite                = new Materials( 525, TextureSet.SET_LAPIS             ,   1.0F,      0,  1, 1  |4|8                   ,  20,  20, 255,   0,   "Sodalite"                ,   "Sodalite"                      ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBlue        , 1, Arrays.asList(new MaterialStack(Aluminium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Sodium, 4), new MaterialStack(Chlorine, 1)));
         Materials.SodiumPersulfate        = new Materials( 718, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16                , 255, 255, 255,   0,   "SodiumPersulfate"        ,   "Sodium Persulfate"             ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 1, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Sulfur, 2), new MaterialStack(Oxygen, 8)));
         Materials.SodiumSulfide           = new Materials( 719, TextureSet.SET_FLUID             ,   1.0F,      0,  2, 1                         , 255, 230, 128,   0,   "SodiumSulfide"           ,   "Sodium Sulfide"                ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 1, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Sulfur, 1)));
@@ -695,16 +695,16 @@ public class MaterialsInit1 {
         Materials.RoastedArsenic            = new MaterialBuilder(552, TextureSet.SET_SHINY   , "Roasted Arsenic").setName("RoastedArsenic").addDustItems().setRGB(240, 240, 240).constructMaterial();
         Materials.RoastedLead               = new MaterialBuilder(553, TextureSet.SET_SHINY   , "Roasted Lead").setName("RoastedLead").addDustItems().setRGB(168, 149, 43).constructMaterial();
 
-        Materials.SiliconSG               = new Materials(  856, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1|2  |8   |32             ,  80,  80, 100,   0,   "SiliconSolarGrade"  ,   "Silicon Solar Grade (Poly SI)"      ,    0,       0,         2273,   2273, true, false,   1,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 2))).disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.CalciumDisilicide       = new Materials(  971, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1    |8                   , 180, 180, 180,   0,   "CalciumDisilicide"       ,   "Calcium Disilicide"            ,    0,       0,       1313,   -1, false, false,   1,   1,   1, Dyes.dyeGray        ,1         , Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Silicon, 2)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1)));//CaSi2
-        Materials.SiliconTetrafluoride    = new MaterialBuilder(  967, TextureSet.SET_FLUID            , "Silicon Tetrafluoride" ).setName("SiliconTetrafluoride").addCell().addGas().setTransparent(true).setRGB(200, 200, 200).setColor(Dyes.dyeWhite).setMeltingPoint(178).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 4)).setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//SIF4
-        Materials.SiliconTetrachloride    = new MaterialBuilder(  968, TextureSet.SET_FLUID            ,  "Silicon Tetrachloride").setName("SiliconTetrachloride").addCell().addFluid().setRGB(220, 220, 220).setColor(Dyes.dyeWhite).setMeltingPoint(204).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Chlorine, 4)).setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//SICL4
-        Materials.Trichlorosilane         = new MaterialBuilder(  972, TextureSet.SET_FLUID            ,   "Trichlorosilane" ).setName("Trichlorosilane" ).addCell().addFluid().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(139).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Silicon, 1), new MaterialStack(Chlorine, 3)).setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//HSICL3
-        Materials.Hexachlorodisilane      = new MaterialBuilder(  973, TextureSet.SET_FLUID            ,  "Hexachlorodisilane").setName("Hexachlorodisilane" ).addCell().addFluid().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(272).setExtraData(1).setMaterialList(new MaterialStack(Silicon, 2), new MaterialStack(Chlorine, 6)).setAspects(Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).constructMaterial();//SI2CL6
-        Materials.Dichlorosilane          = new MaterialBuilder(  799, TextureSet.SET_FLUID            ,   "Dichlorosilane").setName("Dichlorosilane").addCell().addGas().setTransparent(true).setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(151).setExtraData(1).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Hydrogen, 2), new MaterialStack(Chlorine, 2)).setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//SIH2CL2
-        Materials.Silane                  = new MaterialBuilder(  798, TextureSet.SET_FLUID            ,   "Silane").setName( "Silane").addCell().addGas().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(88).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Hydrogen, 4)).setAspects(Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1))).constructMaterial();//SIH4
-        Materials.Calciumhydride          = new Materials(  797, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1    |8                   , 220, 220, 220,   0,   "CalciumHydride"       ,   "Calcium Hydride"            ,    0,       0,       1089,   -1, false, false,   1,   1,   1, Dyes.dyeGray        ,1         , Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Hydrogen, 2)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1)));//CaH2
-        Materials.AluminiumFluoride       = new Materials(  969, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1    |8                   , 255, 255, 255,   0,   "Aluminiumfluoride"        ,   "Aluminium Fluoride"             ,    0,       0,       1533,   -1, false, false,   1,   1,   1, Dyes.dyeWhite       ,1         , Arrays.asList(new MaterialStack(Aluminium, 1), new MaterialStack(Fluorine, 3)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1)));//ALF3
+        Materials.SiliconSG               = new Materials(  856, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1|2  |8   |32             ,  80,  80, 100,   0,   "SiliconSolarGrade"  ,   "Silicon Solar Grade (Poly SI)"      ,    0,       0,         2273,   2273, true, false,   1,   1,   1, Dyes.dyeBlack       , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 4), new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 2))).disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.CalciumDisilicide       = new Materials(  971, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1    |8                   , 180, 180, 180,   0,   "CalciumDisilicide"       ,   "Calcium Disilicide"            ,    0,       0,       1313,   -1, false, false,   1,   1,   1, Dyes.dyeGray        ,1         , Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Silicon, 2)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1)));//CaSi2
+        Materials.SiliconTetrafluoride    = new MaterialBuilder(  967, TextureSet.SET_FLUID            , "Silicon Tetrafluoride" ).setName("SiliconTetrafluoride").addCell().addGas().setTransparent(true).setRGB(200, 200, 200).setColor(Dyes.dyeWhite).setMeltingPoint(178).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 4)).setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))).constructMaterial();//SIF4
+        Materials.SiliconTetrachloride    = new MaterialBuilder(  968, TextureSet.SET_FLUID            ,  "Silicon Tetrachloride").setName("SiliconTetrachloride").addCell().addFluid().setRGB(220, 220, 220).setColor(Dyes.dyeWhite).setMeltingPoint(204).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Chlorine, 4)).setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))).constructMaterial();//SICL4
+        Materials.Trichlorosilane         = new MaterialBuilder(  972, TextureSet.SET_FLUID            ,   "Trichlorosilane" ).setName("Trichlorosilane" ).addCell().addFluid().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(139).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Silicon, 1), new MaterialStack(Chlorine, 3)).setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))).constructMaterial();//HSICL3
+        Materials.Hexachlorodisilane      = new MaterialBuilder(  973, TextureSet.SET_FLUID            ,  "Hexachlorodisilane").setName("Hexachlorodisilane" ).addCell().addFluid().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(272).setExtraData(1).setMaterialList(new MaterialStack(Silicon, 2), new MaterialStack(Chlorine, 6)).setAspects(Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).constructMaterial();//SI2CL6
+        Materials.Dichlorosilane          = new MaterialBuilder(  799, TextureSet.SET_FLUID            ,   "Dichlorosilane").setName("Dichlorosilane").addCell().addGas().setTransparent(true).setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(151).setExtraData(1).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Hydrogen, 2), new MaterialStack(Chlorine, 2)).setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1))).constructMaterial();//SIH2CL2
+        Materials.Silane                  = new MaterialBuilder(  798, TextureSet.SET_FLUID            ,   "Silane").setName( "Silane").addCell().addGas().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(88).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Hydrogen, 4)).setAspects(Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 1))).constructMaterial();//SIH4
+        Materials.Calciumhydride          = new Materials(  797, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1    |8                   , 220, 220, 220,   0,   "CalciumHydride"       ,   "Calcium Hydride"            ,    0,       0,       1089,   -1, false, false,   1,   1,   1, Dyes.dyeGray        ,1         , Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Hydrogen, 2)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1)));//CaH2
+        Materials.AluminiumFluoride       = new Materials(  969, TextureSet.SET_METALLIC         ,   1.0F,      0,  2, 1    |8                   , 255, 255, 255,   0,   "Aluminiumfluoride"        ,   "Aluminium Fluoride"             ,    0,       0,       1533,   -1, false, false,   1,   1,   1, Dyes.dyeWhite       ,1         , Arrays.asList(new MaterialStack(Aluminium, 1), new MaterialStack(Fluorine, 3)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1)));//ALF3
 
         Materials.SolderingAlloy          = new Materials( 314, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1|2                       , 220, 220, 230,   0,   "SolderingAlloy"          ,   "Soldering Alloy"               ,    0,       0,        400,  400, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Tin, 9), new MaterialStack(Antimony, 1)));
         Materials.GalliumArsenide         = new Materials( 980, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1|2                       , 160, 160, 160,   0,   "GalliumArsenide"         ,   "Gallium Arsenide"              ,    0,       0,         -1, 1200,  true, false,   1,   1,   1, Dyes.dyeGray        , 2, Arrays.asList(new MaterialStack(Arsenic, 1), new MaterialStack(Gallium, 1)));
@@ -712,52 +712,52 @@ public class MaterialsInit1 {
         Materials.Spessartine             = new Materials( 838, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 255, 100, 100,   0,   "Spessartine"             ,   "Spessartine"                   ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeRed         , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Manganese, 3), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
         Materials.Sphalerite              = new Materials( 839, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   , 255, 255, 255,   0,   "Sphalerite"              ,   "Sphalerite"                    ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeYellow      , 1, Arrays.asList(new MaterialStack(Zinc, 1), new MaterialStack(Sulfur, 1)));
         Materials.StainlessSteel          = new Materials( 306, TextureSet.SET_SHINY             ,   7.0F,    480,  4, 1|2          |64|128      , 200, 200, 220,   0,   "StainlessSteel"          ,   "Stainless Steel"               ,    0,       0,         -1, 1700,  true, false,   1,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Iron, 6), new MaterialStack(Chrome, 1), new MaterialStack(Manganese, 1), new MaterialStack(Nickel, 1)));
-        Materials.Steel                   = new Materials( 305, TextureSet.SET_METALLIC          ,   6.0F,    512,  3, 1|2          |64|128      , 128, 128, 128,   0,   "Steel"                   ,   "Steel"                         ,    0,       0,       1811, 1000,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Arrays.asList(new MaterialStack(Iron, 50), new MaterialStack(Carbon, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1)));
+        Materials.Steel                   = new Materials( 305, TextureSet.SET_METALLIC          ,   6.0F,    512,  3, 1|2          |64|128      , 128, 128, 128,   0,   "Steel"                   ,   "Steel"                         ,    0,       0,       1811, 1000,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Arrays.asList(new MaterialStack(Iron, 50), new MaterialStack(Carbon, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1)));
         Materials.Stibnite                = new Materials( 945, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   ,  70,  70,  70,   0,   "Stibnite"                ,   "Stibnite"                      ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Antimony, 2), new MaterialStack(Sulfur, 3)));
         Materials.SulfuricAcid            = new Materials( 720, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16                , 255, 128,   0,   0,   "SulfuricAcid"            ,   "Sulfuric Acid"                 ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 1, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Sulfur, 1), new MaterialStack(Oxygen, 4)));
-        Materials.Tanzanite               = new Materials( 508, TextureSet.SET_GEM_VERTICAL      ,   7.0F,    256,  2, 1  |4|8      |64          ,  64,   0, 200, 127,   "Tanzanite"               ,   "Tanzanite"                     ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyePurple      , 0, Arrays.asList(new MaterialStack(Calcium, 2), new MaterialStack(Aluminium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Hydrogen, 1), new MaterialStack(Oxygen, 13)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3)));
+        Materials.Tanzanite               = new Materials( 508, TextureSet.SET_GEM_VERTICAL      ,   7.0F,    256,  2, 1  |4|8      |64          ,  64,   0, 200, 127,   "Tanzanite"               ,   "Tanzanite"                     ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyePurple      , 0, Arrays.asList(new MaterialStack(Calcium, 2), new MaterialStack(Aluminium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Hydrogen, 1), new MaterialStack(Oxygen, 13)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 5), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3)));
         Materials.Tetrahedrite            = new Materials( 840, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 200,  32,   0,   0,   "Tetrahedrite"            ,   "Tetrahedrite"                  ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Copper, 3), new MaterialStack(Antimony, 1), new MaterialStack(Sulfur, 3), new MaterialStack(Iron, 1))); //Cu3SbS3 + x(Fe,Zn)6Sb2S9
-        Materials.TinAlloy                = new Materials( 363, TextureSet.SET_METALLIC          ,   6.5F,     96,  2, 1|2          |64|128      , 200, 200, 200,   0,   "TinAlloy"                ,   "Tin Alloy"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Iron, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
-        Materials.Topaz                   = new Materials( 507, TextureSet.SET_GEM_HORIZONTAL    ,   7.0F,    256,  3, 1  |4|8      |64          , 255, 128,   0, 127,   "Topaz"                   ,   "Topaz"                         ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeOrange      , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 2), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4)));
+        Materials.TinAlloy                = new Materials( 363, TextureSet.SET_METALLIC          ,   6.5F,     96,  2, 1|2          |64|128      , 200, 200, 200,   0,   "TinAlloy"                ,   "Tin Alloy"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Iron, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1)));
+        Materials.Topaz                   = new Materials( 507, TextureSet.SET_GEM_HORIZONTAL    ,   7.0F,    256,  3, 1  |4|8      |64          , 255, 128,   0, 127,   "Topaz"                   ,   "Topaz"                         ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeOrange      , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 2), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 6), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4)));
         Materials.Tungstate               = new Materials( 841, TextureSet.SET_DULL              ,   1.0F,      0,  3, 1    |8                   ,  55,  50,  35,   0,   "Tungstate"               ,   "Tungstate"                     ,    0,       0,       2500, 2500,  true, false,   4,   1,   1, Dyes.dyeBlack       , 0, Arrays.asList(new MaterialStack(Tungsten, 1), new MaterialStack(Lithium, 2), new MaterialStack(Oxygen, 4)));
         Materials.Ultimet                 = new Materials( 344, TextureSet.SET_SHINY             ,   9.0F,   2048,  4, 1|2          |64|128      , 180, 180, 230,   0,   "Ultimet"                 ,   "Ultimet"                       ,    0,       0,       2700, 2700,  true, false,   1,   1,   1, Dyes.dyeLightBlue   , 1, Arrays.asList(new MaterialStack(Cobalt, 5), new MaterialStack(Chrome, 2), new MaterialStack(Nickel, 1), new MaterialStack(Molybdenum, 1))); // 54% Cobalt, 26% Chromium, 9% Nickel, 5% Molybdenum, 3% Iron, 2% Tungsten, 0.8% Manganese, 0.3% Silicon, 0.08% Nitrogen and 0.06% Carbon
         Materials.Uraninite               = new Materials( 922, TextureSet.SET_METALLIC          ,   1.0F,      0,  3, 1    |8                   ,  35,  35,  35,   0,   "Uraninite"               ,   "Uraninite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        , 2, Arrays.asList(new MaterialStack(Uranium, 1), new MaterialStack(Oxygen, 2)));
         Materials.Uvarovite               = new Materials( 842, TextureSet.SET_DIAMOND           ,   1.0F,      0,  2, 1    |8                   , 180, 255, 180,   0,   "Uvarovite"               ,   "Uvarovite"                     ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeGreen       , 1, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Chrome, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
         Materials.VanadiumGallium         = new Materials( 357, TextureSet.SET_SHINY             ,   1.0F,      0,  2, 1|2             |128      , 128, 128, 140,   0,   "VanadiumGallium"         ,   "Vanadium-Gallium"              ,    0,       0,       4500, 4500,  true, false,   1,   1,   1, Dyes.dyeGray        , 2, Arrays.asList(new MaterialStack(Vanadium, 3), new MaterialStack(Gallium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Wood                    = new Materials( 809, TextureSet.SET_WOOD              ,   2.0F,     16,  0, 1|2          |64|128      , 100,  50,   0,   0,   "Wood"                    ,   "Wood"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 0, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 1), new MaterialStack(Hydrogen, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2)));
+        Materials.Wood                    = new Materials( 809, TextureSet.SET_WOOD              ,   2.0F,     16,  0, 1|2          |64|128      , 100,  50,   0,   0,   "Wood"                    ,   "Wood"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 0, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 1), new MaterialStack(Hydrogen, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2)));
         Materials.WroughtIron             = new Materials( 304, TextureSet.SET_METALLIC          ,   6.0F,    384,  2, 1|2          |64|128      , 200, 180, 180,   0,   "WroughtIron"             ,   "Wrought Iron"                  ,    0,       0,       1811,    0, false, false,   3,   1,   1, Dyes.dyeLightGray   , 2, Collections.singletonList(new MaterialStack(Iron, 1)));
         Materials.Wulfenite               = new Materials( 882, TextureSet.SET_DULL              ,   1.0F,      0,  3, 1    |8                   , 255, 128,   0,   0,   "Wulfenite"               ,   "Wulfenite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 2, Arrays.asList(new MaterialStack(Lead, 1), new MaterialStack(Molybdenum, 1), new MaterialStack(Oxygen, 4)));
         Materials.YellowLimonite          = new Materials( 931, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   , 200, 200,   0,   0,   "YellowLimonite"          ,   "Yellow Limonite"               ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Hydrogen, 1), new MaterialStack(Oxygen, 2))); // FeO(OH) + a bit of Ni and Co
         Materials.YttriumBariumCuprate    = new Materials( 358, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1|2                       ,  80,  64,  70,   0,   "YttriumBariumCuprate"    ,   "Yttrium Barium Cuprate"        ,    0,       0,       4500, 4500,  true, false,   1,   1,   1, Dyes.dyeGray        , 0, Arrays.asList(new MaterialStack(Yttrium, 1), new MaterialStack(Barium, 2), new MaterialStack(Copper, 3), new MaterialStack(Oxygen, 7))).disableAutoGeneratedVacuumFreezerRecipe();
 
-        Materials.WoodSealed              = new Materials( 889, TextureSet.SET_WOOD              ,   3.0F,     24,  0, 1|2          |64|128      ,  80,  40,   0,   0,   "WoodSealed"              ,   "Sealed Wood"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 0, Collections.singletonList(new MaterialStack(Wood, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1)));
-        Materials.LiveRoot                = new Materials( 832, TextureSet.SET_WOOD              ,   1.0F,      0,  1, 1                         , 220, 200,   0,   0,   "LiveRoot"                ,   "Liveroot"                      ,    5,      16,         -1,    0, false, false,   2,   4,   3, Dyes.dyeBrown       , 2, Arrays.asList(new MaterialStack(Wood, 3), new MaterialStack(Magic, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.VICTUS, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+        Materials.WoodSealed              = new Materials( 889, TextureSet.SET_WOOD              ,   3.0F,     24,  0, 1|2          |64|128      ,  80,  40,   0,   0,   "WoodSealed"              ,   "Sealed Wood"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 0, Collections.singletonList(new MaterialStack(Wood, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2), new TCAspects.TC_AspectStack(TCAspects.FABRICO, 1)));
+        Materials.LiveRoot                = new Materials( 832, TextureSet.SET_WOOD              ,   1.0F,      0,  1, 1                         , 220, 200,   0,   0,   "LiveRoot"                ,   "Liveroot"                      ,    5,      16,         -1,    0, false, false,   2,   4,   3, Dyes.dyeBrown       , 2, Arrays.asList(new MaterialStack(Wood, 3), new MaterialStack(Magic, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.ARBOR, 2), new TCAspects.TC_AspectStack(TCAspects.VICTUS, 2), new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1)));
         Materials.IronWood                = new Materials( 338, TextureSet.SET_WOOD              ,   6.0F,    384,  2, 1|2          |64|128      , 150, 140, 110,   0,   "IronWood"                ,   "Ironwood"                      ,    5,       8,         -1,    0, false, false,   2,  19,  18, Dyes.dyeBrown       , 2, Arrays.asList(new MaterialStack(Iron, 9), new MaterialStack(LiveRoot, 9), new MaterialStack(Gold, 1)));
-        Materials.Glass                   = new Materials( 890, TextureSet.SET_GLASS             ,   1.0F,      4,  0, 1  |4                     , 250, 250, 250, 220,   "Glass"                   ,   "Glass"                         ,    0,       0,       1500,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , 2, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2)));
+        Materials.Glass                   = new Materials( 890, TextureSet.SET_GLASS             ,   1.0F,      4,  0, 1  |4                     , 250, 250, 250, 220,   "Glass"                   ,   "Glass"                         ,    0,       0,       1500,    0, false,  true,   1,   1,   1, Dyes.dyeWhite       , 2, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2)));
         Materials.BorosilicateGlass  = new MaterialBuilder(611, TextureSet.SET_GLASS             ,                                                                                                     "Borosilicate Glass").addDustItems().addMetalItems().setRGB(230, 243, 230).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Boron, 1), new MaterialStack(Glass, 7)).addCentrifugeRecipe().constructMaterial();
         Materials.Perlite                 = new Materials( 925, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   ,  30,  20,  30,   0,   "Perlite"                 ,   "Perlite"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Obsidian, 2), new MaterialStack(Water, 1)));
         Materials.Borax                   = new Materials( 941, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1    |8                   , 250, 250, 250,   0,   "Borax"                   ,   "Borax"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Boron, 4), new MaterialStack(Oxygen, 7), new MaterialStack(Water, 10)));
         Materials.Lignite                 = new Materials( 538, TextureSet.SET_LIGNITE           ,   1.0F,      0,  0, 1  |4|8                   , 100,  70,  70,   0,   "Lignite"                 ,   "Lignite Coal"                  ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 1, Arrays.asList(new MaterialStack(Carbon, 3), new MaterialStack(Water, 1)));
-        Materials.Olivine                 = new Materials( 505, TextureSet.SET_RUBY              ,   7.0F,    256,  2, 1  |4|8      |64          , 150, 255, 150, 127,   "Olivine"                 ,   "Olivine"                       ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeLime        , 1, Arrays.asList(new MaterialStack(Magnesium, 2), new MaterialStack(Iron, 1), new MaterialStack(SiliconDioxide, 2)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2)));
-        Materials.Opal                    = new Materials( 510, TextureSet.SET_OPAL              ,   7.0F,    256,  2, 1  |4|8      |64          ,   0,   0, 255,   0,   "Opal"                    ,   "Opal"                          ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlue        , 1, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3)));
-        Materials.Amethyst                = new Materials( 509, TextureSet.SET_FLINT             ,   7.0F,    256,  3, 1  |4|8      |64          , 210,  50, 210, 127,   "Amethyst"                ,   "Amethyst"                      ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyePink        , 1, Arrays.asList(new MaterialStack(SiliconDioxide, 4), new MaterialStack(Iron, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4)));
-        Materials.Redstone                = new Materials( 810, TextureSet.SET_ROUGH             ,   1.0F,      0,  2, 1    |8                   , 200,   0,   0,   0,   "Redstone"                ,   "Redstone"                      ,    0,       0,        500,    0, false, false,   3,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Silicon, 1), new MaterialStack(Pyrite, 5), new MaterialStack(Ruby, 1), new MaterialStack(Mercury, 3)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2)));
-        Materials.Lapis                   = new Materials( 526, TextureSet.SET_LAPIS             ,   1.0F,      0,  1, 1  |4|8                   ,  70,  70, 220,   0,   "Lapis"                   ,   "Lapis"                         ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBlue        , 2, Arrays.asList(new MaterialStack(Lazurite, 12), new MaterialStack(Sodalite, 2), new MaterialStack(Pyrite, 1), new MaterialStack(Calcite, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1)));
-        Materials.Blaze                   = new Materials( 801, TextureSet.SET_POWDER            ,   2.0F,     16,  1, 1            |64          , 255, 200,   0,   0,   "Blaze"                   ,   "Blaze"                         ,    0,       0,       6400,    0, false, false,   2,   3,   2, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(DarkAsh, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 4)));
-        Materials.EnderPearl              = new Materials( 532, TextureSet.SET_SHINY             ,   1.0F,     16,  1, 1  |4                     , 108, 220, 200,   0,   "EnderPearl"              ,   "Enderpearl"                    ,    0,       0,         -1,    0, false, false,   1,  16,  10, Dyes.dyeGreen       , 1, Arrays.asList(new MaterialStack(Beryllium, 1), new MaterialStack(Potassium, 4), new MaterialStack(Nitrogen, 5), new MaterialStack(Magic, 6)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2)));
-        Materials.EnderEye                = new Materials( 533, TextureSet.SET_SHINY             ,   1.0F,     16,  1, 1  |4                     , 160, 250, 230,   0,   "EnderEye"                ,   "Endereye"                      ,    5,      10,         -1,    0, false, false,   1,   2,   1, Dyes.dyeGreen       , 2, Arrays.asList(new MaterialStack(EnderPearl, 1), new MaterialStack(Blaze, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 3), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2)));
-        Materials.Flint                   = new Materials( 802, TextureSet.SET_FLINT             ,   2.5F,    128,  1, 1            |64          ,   0,  32,  64,   0,   "Flint"                   ,   "Flint"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , 2, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+        Materials.Olivine                 = new Materials( 505, TextureSet.SET_RUBY              ,   7.0F,    256,  2, 1  |4|8      |64          , 150, 255, 150, 127,   "Olivine"                 ,   "Olivine"                       ,    0,       0,         -1,    0, false,  true,   5,   1,   1, Dyes.dyeLime        , 1, Arrays.asList(new MaterialStack(Magnesium, 2), new MaterialStack(Iron, 1), new MaterialStack(SiliconDioxide, 2)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 4), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2)));
+        Materials.Opal                    = new Materials( 510, TextureSet.SET_OPAL              ,   7.0F,    256,  2, 1  |4|8      |64          ,   0,   0, 255,   0,   "Opal"                    ,   "Opal"                          ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyeBlue        , 1, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 5), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3)));
+        Materials.Amethyst                = new Materials( 509, TextureSet.SET_FLINT             ,   7.0F,    256,  3, 1  |4|8      |64          , 210,  50, 210, 127,   "Amethyst"                ,   "Amethyst"                      ,    0,       0,         -1,    0, false,  true,   3,   1,   1, Dyes.dyePink        , 1, Arrays.asList(new MaterialStack(SiliconDioxide, 4), new MaterialStack(Iron, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 6), new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4)));
+        Materials.Redstone                = new Materials( 810, TextureSet.SET_ROUGH             ,   1.0F,      0,  2, 1    |8                   , 200,   0,   0,   0,   "Redstone"                ,   "Redstone"                      ,    0,       0,        500,    0, false, false,   3,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Silicon, 1), new MaterialStack(Pyrite, 5), new MaterialStack(Ruby, 1), new MaterialStack(Mercury, 3)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.MACHINA, 1), new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 2)));
+        Materials.Lapis                   = new Materials( 526, TextureSet.SET_LAPIS             ,   1.0F,      0,  1, 1  |4|8                   ,  70,  70, 220,   0,   "Lapis"                   ,   "Lapis"                         ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeBlue        , 2, Arrays.asList(new MaterialStack(Lazurite, 12), new MaterialStack(Sodalite, 2), new MaterialStack(Pyrite, 1), new MaterialStack(Calcite, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.SENSUS, 1)));
+        Materials.Blaze                   = new Materials( 801, TextureSet.SET_POWDER            ,   2.0F,     16,  1, 1            |64          , 255, 200,   0,   0,   "Blaze"                   ,   "Blaze"                         ,    0,       0,       6400,    0, false, false,   2,   3,   2, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(DarkAsh, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 2), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 4)));
+        Materials.EnderPearl              = new Materials( 532, TextureSet.SET_SHINY             ,   1.0F,     16,  1, 1  |4                     , 108, 220, 200,   0,   "EnderPearl"              ,   "Enderpearl"                    ,    0,       0,         -1,    0, false, false,   1,  16,  10, Dyes.dyeGreen       , 1, Arrays.asList(new MaterialStack(Beryllium, 1), new MaterialStack(Potassium, 4), new MaterialStack(Nitrogen, 5), new MaterialStack(Magic, 6)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 4), new TCAspects.TC_AspectStack(TCAspects.ITER, 4), new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 2)));
+        Materials.EnderEye                = new Materials( 533, TextureSet.SET_SHINY             ,   1.0F,     16,  1, 1  |4                     , 160, 250, 230,   0,   "EnderEye"                ,   "Endereye"                      ,    5,      10,         -1,    0, false, false,   1,   2,   1, Dyes.dyeGreen       , 2, Arrays.asList(new MaterialStack(EnderPearl, 1), new MaterialStack(Blaze, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.SENSUS, 4), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 4), new TCAspects.TC_AspectStack(TCAspects.ITER, 4), new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 3), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 2)));
+        Materials.Flint                   = new Materials( 802, TextureSet.SET_FLINT             ,   2.5F,    128,  1, 1            |64          ,   0,  32,  64,   0,   "Flint"                   ,   "Flint"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , 2, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.TERRA, 1), new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1)));
         Materials.Diatomite               = new Materials( 948, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   , 225, 225, 225,   0,   "Diatomite"               ,   "Diatomite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , 2, Arrays.asList(new MaterialStack(Flint, 8), new MaterialStack(BandedIron, 1), new MaterialStack(Sapphire, 1)));
         Materials.VolcanicAsh             = new Materials( 940, TextureSet.SET_FLINT             ,   1.0F,      0,  0, 1                         ,  60,  50,  50,   0,   "VolcanicAsh"             ,   "Volcanic Ashes"                ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Flint, 6), new MaterialStack(Iron, 1), new MaterialStack(Magnesium, 1)));
         Materials.Niter                   = new Materials( 531, TextureSet.SET_FLINT             ,   1.0F,      0,  1, 1  |4|8                   , 255, 200, 200,   0,   "Niter"                   ,   "Niter"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , 2, Collections.singletonList(new MaterialStack(Saltpeter, 1)));
-        Materials.Pyrotheum               = new Materials( 843, TextureSet.SET_FIERY             ,   1.0F,      0,  1, 1                         , 255, 128,   0,   0,   "Pyrotheum"               ,   "Pyrotheum"                     ,    2,      62,         -1,    0, false, false,   2,   3,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Coal, 1), new MaterialStack(Redstone, 1), new MaterialStack(Blaze, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)));
-        Materials.Cryotheum               = new Materials( 898, TextureSet.SET_SHINY             ,   1.0F,      0,  1, 1                         ,   0, 148, 203,   0,   "Cryotheum"               ,   "Cryotheum"                     ,    2,      62,         -1,    0, false, false,   2,   3,   1, Dyes.dyeLightBlue   , 2, Arrays.asList(new MaterialStack(Saltpeter, 1), new MaterialStack(Redstone, 1), new MaterialStack(Snow, 1), new MaterialStack(Blizz, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1),  new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1)));
+        Materials.Pyrotheum               = new Materials( 843, TextureSet.SET_FIERY             ,   1.0F,      0,  1, 1                         , 255, 128,   0,   0,   "Pyrotheum"               ,   "Pyrotheum"                     ,    2,      62,         -1,    0, false, false,   2,   3,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Coal, 1), new MaterialStack(Redstone, 1), new MaterialStack(Blaze, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 2), new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1)));
+        Materials.Cryotheum               = new Materials( 898, TextureSet.SET_SHINY             ,   1.0F,      0,  1, 1                         ,   0, 148, 203,   0,   "Cryotheum"               ,   "Cryotheum"                     ,    2,      62,         -1,    0, false, false,   2,   3,   1, Dyes.dyeLightBlue   , 2, Arrays.asList(new MaterialStack(Saltpeter, 1), new MaterialStack(Redstone, 1), new MaterialStack(Snow, 1), new MaterialStack(Blizz, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 2), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1),  new TCAspects.TC_AspectStack(TCAspects.GELUM, 1)));
         Materials.HydratedCoal            = new Materials( 818, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1                         ,  70,  70, 100,   0,   "HydratedCoal"            ,   "Hydrated Coal"                 ,    0,       0,         -1,    0, false, false,   1,   9,   8, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Coal, 8), new MaterialStack(Water, 1)));
-        Materials.Apatite                 = new Materials( 530, TextureSet.SET_DIAMOND           ,   1.0F,      0,  1, 1  |4|8                   , 200, 200, 255,   0,   "Apatite"                 ,   "Apatite"                       ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeCyan        , 1, Arrays.asList(new MaterialStack(Calcium, 5), new MaterialStack(Phosphate, 3), new MaterialStack(Chlorine, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 2)));
-        Materials.Alumite                 = new Materials( 400, TextureSet.SET_METALLIC          ,   5.0F,    768,  2, 1|2          |64|128      , 255, 105, 180,   0,   "Alumite"                 ,   "Alumite"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , 2, Arrays.asList(new MaterialStack(Aluminium, 5), new MaterialStack(Steel, 2), new MaterialStack(Obsidian, 2)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 2)));
-        Materials.Manyullyn               = new Materials( 386, TextureSet.SET_SHINY             ,  25.0F,   2048,  5, 1|2  |8      |64|128      , 154,  76, 185,   0,   "Manyullyn"               ,   "Manyullyn"                     ,    0,       0,       3600, 3600,  true, false,   1,   1,   1, Dyes.dyePurple      , 2, Arrays.asList(new MaterialStack(Cobalt, 1), new MaterialStack(Ardite, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 2))).disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.Steeleaf                = new Materials( 339, TextureSet.SET_LEAF              ,   8.0F,    768,  3, 1|2          |64|128      ,  50, 127,  50,   0,   "Steeleaf"                ,   "Steeleaf"                      ,    5,      24,         -1,    0, false, false,   4,   1,   1, Dyes.dyeGreen       , 2, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
-        Materials.Knightmetal             = new Materials( 362, TextureSet.SET_METALLIC          ,   8.0F,   1024,  3, 1|2          |64|128      , 210, 240, 200,   0,   "Knightmetal"             ,   "Knightmetal"                   ,    5,      24,         -1,    0, false, false,   4,   1,   1, Dyes.dyeLime        , 2, Arrays.asList(new MaterialStack(Steel, 2), new MaterialStack(Magic, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2)));
+        Materials.Apatite                 = new Materials( 530, TextureSet.SET_DIAMOND           ,   1.0F,      0,  1, 1  |4|8                   , 200, 200, 255,   0,   "Apatite"                 ,   "Apatite"                       ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeCyan        , 1, Arrays.asList(new MaterialStack(Calcium, 5), new MaterialStack(Phosphate, 3), new MaterialStack(Chlorine, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MESSIS, 2)));
+        Materials.Alumite                 = new Materials( 400, TextureSet.SET_METALLIC          ,   5.0F,    768,  2, 1|2          |64|128      , 255, 105, 180,   0,   "Alumite"                 ,   "Alumite"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , 2, Arrays.asList(new MaterialStack(Aluminium, 5), new MaterialStack(Steel, 2), new MaterialStack(Obsidian, 2)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 2)));
+        Materials.Manyullyn               = new Materials( 386, TextureSet.SET_SHINY             ,  25.0F,   2048,  5, 1|2  |8      |64|128      , 154,  76, 185,   0,   "Manyullyn"               ,   "Manyullyn"                     ,    0,       0,       3600, 3600,  true, false,   1,   1,   1, Dyes.dyePurple      , 2, Arrays.asList(new MaterialStack(Cobalt, 1), new MaterialStack(Ardite, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 2))).disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Steeleaf                = new Materials( 339, TextureSet.SET_LEAF              ,   8.0F,    768,  3, 1|2          |64|128      ,  50, 127,  50,   0,   "Steeleaf"                ,   "Steeleaf"                      ,    5,      24,         -1,    0, false, false,   4,   1,   1, Dyes.dyeGreen       , 2, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.HERBA, 2), new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1)));
+        Materials.Knightmetal             = new Materials( 362, TextureSet.SET_METALLIC          ,   8.0F,   1024,  3, 1|2          |64|128      , 210, 240, 200,   0,   "Knightmetal"             ,   "Knightmetal"                   ,    5,      24,         -1,    0, false, false,   4,   1,   1, Dyes.dyeLime        , 2, Arrays.asList(new MaterialStack(Steel, 2), new MaterialStack(Magic, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1), new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2)));
         Materials.SterlingSilver          = new Materials( 350, TextureSet.SET_SHINY             ,  13.0F,    128,  2, 1|2          |64|128      , 250, 220, 225,   0,   "SterlingSilver"          ,   "Sterling Silver"               ,    0,       0,         -1, 1700,  true, false,   4,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Silver, 4)));
         Materials.RoseGold                = new Materials( 351, TextureSet.SET_SHINY             ,  14.0F,    128,  2, 1|2          |64|128      , 255, 230,  30,   0,   "RoseGold"                ,   "Rose Gold"                     ,    0,       0,         -1, 1600,  true, false,   4,   1,   1, Dyes.dyeOrange      , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Gold, 4)));
         Materials.BlackBronze             = new Materials( 352, TextureSet.SET_DULL              ,  12.0F,    256,  2, 1|2          |64|128      , 100,  50, 125,   0,   "BlackBronze"             ,   "Black Bronze"                  ,    0,       0,         -1, 2000,  true, false,   4,   1,   1, Dyes.dyePurple      , 2, Arrays.asList(new MaterialStack(Gold, 1), new MaterialStack(Silver, 1), new MaterialStack(Copper, 3)));
@@ -769,27 +769,27 @@ public class MaterialsInit1 {
         Materials.TungstenSteel           = new Materials( 316, TextureSet.SET_METALLIC          ,   8.0F,   2560,  4, 1|2          |64|128      , 100, 100, 160,   0,   "TungstenSteel"           ,   "Tungstensteel"                 ,    0,       0,       4000, 4000,  true, false,   4,   1,   1, Dyes.dyeBlue        , 2, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Tungsten, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.NitroCoalFuel           = new Materials(  -1, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16                ,  50,  70,  50,   0,   "NitroCoalFuel"           ,   "Nitro-Coalfuel"                ,    0,      48,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 0, Arrays.asList(new MaterialStack(Glyceryl, 1), new MaterialStack(CoalFuel, 4)));
         Materials.NitroFuel               = new Materials( 709, TextureSet.SET_FLUID             ,   1.0F,      0,  2,         16                , 200, 255,   0,   0,   "NitroFuel"               ,   "Cetane-Boosted Diesel"         ,    0,    1000,         -1,    0, false, false,   1,   1,   1, Dyes.dyeLime        );
-        Materials.RedAlloy                = new Materials( 308, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1|2                       , 200,   0,   0,   0,   "RedAlloy"                ,   "Red Alloy"                     ,    0,       0,        500,    0, false, false,   3,   5,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Redstone, 4)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 3)));
+        Materials.RedAlloy                = new Materials( 308, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1|2                       , 200,   0,   0,   0,   "RedAlloy"                ,   "Red Alloy"                     ,    0,       0,        500,    0, false, false,   3,   5,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Redstone, 4)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MACHINA, 3)));
         Materials.CobaltBrass             = new Materials( 343, TextureSet.SET_METALLIC          ,   8.0F,    256,  2, 1|2          |64|128      , 180, 180, 160,   0,   "CobaltBrass"             ,   "Cobalt Brass"                  ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeOrange      , 2, Arrays.asList(new MaterialStack(Brass, 7), new MaterialStack(Aluminium, 1), new MaterialStack(Cobalt, 1)));
         Materials.TricalciumPhosphate     = new Materials( 534, TextureSet.SET_FLINT             ,   1.0F,      0, 2,  1|4|8|16                  , 255, 255,   0,   0,   "TricalciumPhosphate"     ,   "Tricalcium Phosphate"          ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Phosphate, 2)));
-        Materials.Basalt                  = new Materials( 844, TextureSet.SET_ROUGH             ,   1.0F,     64,  1, 1            |64|128      ,  30,  20,  20,   0,   "Basalt"                  ,   "Basalt"                        ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Olivine, 1), new MaterialStack(Calcite, 3), new MaterialStack(Flint, 8), new MaterialStack(DarkAsh, 4)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 1))).disableAutoGeneratedRecycleRecipes();
-        Materials.GarnetRed               = new Materials( 527, TextureSet.SET_RUBY              ,   7.0F,    128,  2, 1  |4|8      |64          , 200,  80,  80, 127,   "GarnetRed"               ,   "Red Garnet"                    ,    0,       0,         -1,    0, false,  true,   4,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Pyrope, 3), new MaterialStack(Almandine, 5), new MaterialStack(Spessartine, 8)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3)));
-        Materials.GarnetYellow            = new Materials( 528, TextureSet.SET_RUBY              ,   7.0F,    128,  2, 1  |4|8      |64          , 200, 200,  80, 127,   "GarnetYellow"            ,   "Yellow Garnet"                 ,    0,       0,         -1,    0, false,  true,   4,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Andradite, 5), new MaterialStack(Grossular, 8), new MaterialStack(Uvarovite, 3)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 3)));
-        Materials.Marble                  = new Materials( 845, TextureSet.SET_FINE              ,   1.0F,     16,  1, 1            |64|128      , 200, 200, 200,   0,   "Marble"                  ,   "Marble"                        ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Calcite, 7)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1)));
-        Materials.Sugar                   = new Materials( 803, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1                         , 250, 250, 250,   0,   "Sugar"                   ,   "Sugar"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Water, 5), new MaterialStack(Oxygen, 25)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.AER, 1)));
-        Materials.Thaumium                = new Materials( 330, TextureSet.SET_METALLIC          ,  12.0F,    256,  3, 1|2          |64|128      , 150, 100, 200,   0,   "Thaumium"                ,   "Thaumium"                      ,    0,       0,         -1,    0, false, false,   5,   2,   1, Dyes.dyePurple      , 0, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
-        Materials.Vinteum                 = new Materials( 529, TextureSet.SET_METALLIC          ,  10.0F,    128,  3, 1|2|4|8      |64|128      , 100, 200, 255,   0,   "Vinteum"                 ,   "Vinteum"                       ,    5,      32,         -1,    0, false, false,   4,   1,   1, Dyes.dyeLightBlue   , 2, Collections.singletonList(new MaterialStack(Thaumium, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
-        Materials.Vis                     = new Materials(  -1, TextureSet.SET_SHINY             ,   1.0F,      0,  3, 0                         , 128,   0, 255,   0,   "Vis"                     ,   "Vis"                           ,    5,      32,         -1,    0, false, false,   1,   1,   1, Dyes.dyePurple      , 2, Collections.singletonList(new MaterialStack(Magic, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+        Materials.Basalt                  = new Materials( 844, TextureSet.SET_ROUGH             ,   1.0F,     64,  1, 1            |64|128      ,  30,  20,  20,   0,   "Basalt"                  ,   "Basalt"                        ,    0,       0,         -1,    0, false, false,   2,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Olivine, 1), new MaterialStack(Calcite, 3), new MaterialStack(Flint, 8), new MaterialStack(DarkAsh, 4)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 1))).disableAutoGeneratedRecycleRecipes();
+        Materials.GarnetRed               = new Materials( 527, TextureSet.SET_RUBY              ,   7.0F,    128,  2, 1  |4|8      |64          , 200,  80,  80, 127,   "GarnetRed"               ,   "Red Garnet"                    ,    0,       0,         -1,    0, false,  true,   4,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Pyrope, 3), new MaterialStack(Almandine, 5), new MaterialStack(Spessartine, 8)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3)));
+        Materials.GarnetYellow            = new Materials( 528, TextureSet.SET_RUBY              ,   7.0F,    128,  2, 1  |4|8      |64          , 200, 200,  80, 127,   "GarnetYellow"            ,   "Yellow Garnet"                 ,    0,       0,         -1,    0, false,  true,   4,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(Andradite, 5), new MaterialStack(Grossular, 8), new MaterialStack(Uvarovite, 3)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 3)));
+        Materials.Marble                  = new Materials( 845, TextureSet.SET_FINE              ,   1.0F,     16,  1, 1            |64|128      , 200, 200, 200,   0,   "Marble"                  ,   "Marble"                        ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Calcite, 7)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.PERFODIO, 1)));
+        Materials.Sugar                   = new Materials( 803, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1                         , 250, 250, 250,   0,   "Sugar"                   ,   "Sugar"                         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 1, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Water, 5), new MaterialStack(Oxygen, 25)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.HERBA, 1), new TCAspects.TC_AspectStack(TCAspects.AQUA, 1), new TCAspects.TC_AspectStack(TCAspects.AER, 1)));
+        Materials.Thaumium                = new Materials( 330, TextureSet.SET_METALLIC          ,  12.0F,    256,  3, 1|2          |64|128      , 150, 100, 200,   0,   "Thaumium"                ,   "Thaumium"                      ,    0,       0,         -1,    0, false, false,   5,   2,   1, Dyes.dyePurple      , 0, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1)));
+        Materials.Vinteum                 = new Materials( 529, TextureSet.SET_METALLIC          ,  10.0F,    128,  3, 1|2|4|8      |64|128      , 100, 200, 255,   0,   "Vinteum"                 ,   "Vinteum"                       ,    5,      32,         -1,    0, false, false,   4,   1,   1, Dyes.dyeLightBlue   , 2, Collections.singletonList(new MaterialStack(Thaumium, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 2), new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1)));
+        Materials.Vis                     = new Materials(  -1, TextureSet.SET_SHINY             ,   1.0F,      0,  3, 0                         , 128,   0, 255,   0,   "Vis"                     ,   "Vis"                           ,    5,      32,         -1,    0, false, false,   1,   1,   1, Dyes.dyePurple      , 2, Collections.singletonList(new MaterialStack(Magic, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.AURAM, 2), new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1)));
         Materials.Redrock                 = new Materials( 846, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1                         , 255,  80,  50,   0,   "Redrock"                 ,   "Redrock"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Calcite, 2), new MaterialStack(Flint, 1), new MaterialStack(Clay, 1)));
         Materials.PotassiumFeldspar       = new Materials( 847, TextureSet.SET_FINE              ,   1.0F,      0,  1, 1                         , 120,  40,  40,   0,   "PotassiumFeldspar"       ,   "Potassium Feldspar"            ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyePink        , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 8)));
         Materials.Biotite                 = new Materials( 848, TextureSet.SET_METALLIC          ,   1.0F,      0,  1, 1                         ,  20,  30,  20,   0,   "Biotite"                 ,   "Biotite"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeGray        , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Magnesium, 3), new MaterialStack(Aluminium, 3), new MaterialStack(Fluorine, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 10)));
-        Materials.GraniteBlack            = new Materials( 849, TextureSet.SET_ROUGH             ,   4.0F,     64,  3, 1            |64|128      ,  10,  10,  10,   0,   "GraniteBlack"            ,   "Black Granite"                 ,    0,       0,         -1,    0, false, false,   0,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(SiliconDioxide, 4), new MaterialStack(Biotite, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1)));
-        Materials.GraniteRed              = new Materials( 850, TextureSet.SET_ROUGH             ,   4.0F,     64,  3, 1            |64|128      , 255,   0, 128,   0,   "GraniteRed"              ,   "Red Granite"                   ,    0,       0,         -1,    0, false, false,   0,   1,   1, Dyes.dyeMagenta     , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(PotassiumFeldspar, 1), new MaterialStack(Oxygen, 3)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1)));
+        Materials.GraniteBlack            = new Materials( 849, TextureSet.SET_ROUGH             ,   4.0F,     64,  3, 1            |64|128      ,  10,  10,  10,   0,   "GraniteBlack"            ,   "Black Granite"                 ,    0,       0,         -1,    0, false, false,   0,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(SiliconDioxide, 4), new MaterialStack(Biotite, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1)));
+        Materials.GraniteRed              = new Materials( 850, TextureSet.SET_ROUGH             ,   4.0F,     64,  3, 1            |64|128      , 255,   0, 128,   0,   "GraniteRed"              ,   "Red Granite"                   ,    0,       0,         -1,    0, false, false,   0,   1,   1, Dyes.dyeMagenta     , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(PotassiumFeldspar, 1), new MaterialStack(Oxygen, 3)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1)));
         Materials.Chrysotile              = new Materials( 912, TextureSet.SET_DULL              ,  32.0F,  10240,  3, 1|2  |8      |64|128      , 110, 140, 110,   0,   "Chrysotile"              ,   "Chrysotile"                    ,    0,       0,       9400, 9400,  true, false,   1,   1,   1, Dyes.dyeWhite       , 2, Collections.singletonList(new MaterialStack(Asbestos, 1))).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(280, 280, 1);
         Materials.Realgar                 = new Materials( 913, TextureSet.SET_DULL              ,   1.0F,     32,  1, 1|2  |8      |64|128      , 140, 100, 100,   0,   "Realgar"                 ,   "Realgar"                       ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Arsenic, 4), new MaterialStack(Sulfur,4)));
-        Materials.VanadiumMagnetite       = new Materials( 923, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   ,  35,  35,  60,   0,   "VanadiumMagnetite"       ,   "Vanadium Magnetite"            ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(Vanadium, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1))); // Mixture of Fe3O4 and V2O5
-        Materials.BasalticMineralSand     = new Materials( 935, TextureSet.SET_SAND              ,   1.0F,      0,  1, 1    |8                   ,  40,  50,  40,   0,   "BasalticMineralSand"     ,   "Basaltic Mineral Sand"         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(Basalt, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1)));
-        Materials.GraniticMineralSand     = new Materials( 936, TextureSet.SET_SAND              ,   1.0F,      0,  1, 1    |8                   ,  40,  60,  60,   0,   "GraniticMineralSand"     ,   "Granitic Mineral Sand"         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(GraniteBlack, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+        Materials.VanadiumMagnetite       = new Materials( 923, TextureSet.SET_METALLIC          ,   1.0F,      0,  2, 1    |8                   ,  35,  35,  60,   0,   "VanadiumMagnetite"       ,   "Vanadium Magnetite"            ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(Vanadium, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1))); // Mixture of Fe3O4 and V2O5
+        Materials.BasalticMineralSand     = new Materials( 935, TextureSet.SET_SAND              ,   1.0F,      0,  1, 1    |8                   ,  40,  50,  40,   0,   "BasalticMineralSand"     ,   "Basaltic Mineral Sand"         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(Basalt, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1)));
+        Materials.GraniticMineralSand     = new Materials( 936, TextureSet.SET_SAND              ,   1.0F,      0,  1, 1    |8                   ,  40,  60,  60,   0,   "GraniticMineralSand"     ,   "Granitic Mineral Sand"         ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(GraniteBlack, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1)));
         Materials.GarnetSand              = new Materials( 938, TextureSet.SET_SAND              ,   1.0F,      0,  1, 1    |8                   , 200, 100,   0,   0,   "GarnetSand"              ,   "Garnet Sand"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeOrange      , 2, Arrays.asList(new MaterialStack(GarnetRed, 1), new MaterialStack(GarnetYellow, 1)));
         Materials.QuartzSand              = new Materials( 939, TextureSet.SET_SAND              ,   1.0F,      0,  1, 1    |8                   , 194, 178, 128,   0,   "QuartzSand"              ,   "Quartz Sand"                   ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(CertusQuartz, 1), new MaterialStack(Quartzite, 1)));
         Materials.Bastnasite              = new Materials( 905, TextureSet.SET_FINE              ,   1.0F,      0,  2, 1    |8                   , 200, 110,  45,   0,   "Bastnasite"              ,   "Bastnasite"                    ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          , 1, Arrays.asList(new MaterialStack(Cerium, 1), new MaterialStack(Carbon, 1), new MaterialStack(Fluorine, 1), new MaterialStack(Oxygen, 3))); // (Ce, La, Y)CO3F
@@ -819,11 +819,11 @@ public class MaterialsInit1 {
         Materials.Kaolinite               = new Materials( 929, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   , 245, 235, 235,   0,   "Kaolinite"               ,   "Kaolinite"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 2), new MaterialStack(Hydrogen, 4), new MaterialStack(Oxygen, 9))); // Al2Si2O5(OH)4
         Materials.Talc                    = new Materials( 902, TextureSet.SET_DULL              ,   1.0F,      0,  2, 1    |8                   ,  90, 180,  90,   0,   "Talc"                    ,   "Talc"                          ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          , 1, Arrays.asList(new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 4), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 12))); // H2Mg3(SiO3)4
         Materials.Soapstone               = new Materials( 877, TextureSet.SET_DULL              ,   1.0F,      0,  1, 1    |8                   ,  95, 145,  95,   0,   "Soapstone"               ,   "Soapstone"                     ,    0,       0,         -1,    0, false, false,   1,   1,   1, Dyes._NULL          , 1, Arrays.asList(new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 4), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 12))); // H2Mg3(SiO3)4
-        Materials.Concrete                = new Materials( 947, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1                         , 100, 100, 100,   0,   "Concrete"                ,   "Concrete"                      ,    0,       0,        300,    0, false, false,   0,   1,   1, Dyes.dyeGray        , 0, Collections.singletonList(new MaterialStack(Stone, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1)));
-        Materials.IronMagnetic            = new Materials( 354, TextureSet.SET_MAGNETIC          ,   6.0F,    256,  2, 1|2          |64|128      , 200, 200, 200,   0,   "IronMagnetic"            ,   "Magnetic Iron"                 ,    0,       0,         -1,    0, false, false,   4,  51,  50, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Iron, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1)));
-        Materials.SteelMagnetic           = new Materials( 355, TextureSet.SET_MAGNETIC          ,   6.0F,    512,  3, 1|2          |64|128      , 128, 128, 128,   0,   "SteelMagnetic"           ,   "Magnetic Steel"                ,    0,       0,       1000, 1000,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Steel, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1)));
-        Materials.NeodymiumMagnetic       = new Materials( 356, TextureSet.SET_MAGNETIC          ,   7.0F,    512,  2, 1|2          |64|128      , 100, 100, 100,   0,   "NeodymiumMagnetic"       ,   "Magnetic Neodymium"            ,    0,       0,       1297, 1297,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Neodymium, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 3)));
-        Materials.SamariumMagnetic        = new Materials( 399, TextureSet.SET_MAGNETIC          ,   1.0F,      0,  2, 1|2          |64|128      , 255, 255, 204,   0,   "SamariumMagnetic"        ,   "Magnetic Samarium"             ,    0,       0,       1345, 1345,  true, false,   4,   1,   1, Dyes.dyeWhite       , 1, Collections.singletonList(new MaterialStack(Samarium, 1)),Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO,10)));
+        Materials.Concrete                = new Materials( 947, TextureSet.SET_ROUGH             ,   1.0F,      0,  1, 1                         , 100, 100, 100,   0,   "Concrete"                ,   "Concrete"                      ,    0,       0,        300,    0, false, false,   0,   1,   1, Dyes.dyeGray        , 0, Collections.singletonList(new MaterialStack(Stone, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.TERRA, 1)));
+        Materials.IronMagnetic            = new Materials( 354, TextureSet.SET_MAGNETIC          ,   6.0F,    256,  2, 1|2          |64|128      , 200, 200, 200,   0,   "IronMagnetic"            ,   "Magnetic Iron"                 ,    0,       0,         -1,    0, false, false,   4,  51,  50, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Iron, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1)));
+        Materials.SteelMagnetic           = new Materials( 355, TextureSet.SET_MAGNETIC          ,   6.0F,    512,  3, 1|2          |64|128      , 128, 128, 128,   0,   "SteelMagnetic"           ,   "Magnetic Steel"                ,    0,       0,       1000, 1000,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Steel, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1), new TCAspects.TC_AspectStack(TCAspects.ORDO, 1), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1)));
+        Materials.NeodymiumMagnetic       = new Materials( 356, TextureSet.SET_MAGNETIC          ,   7.0F,    512,  2, 1|2          |64|128      , 100, 100, 100,   0,   "NeodymiumMagnetic"       ,   "Magnetic Neodymium"            ,    0,       0,       1297, 1297,  true, false,   4,  51,  50, Dyes.dyeGray        , 1, Collections.singletonList(new MaterialStack(Neodymium, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 1), new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 3)));
+        Materials.SamariumMagnetic        = new Materials( 399, TextureSet.SET_MAGNETIC          ,   1.0F,      0,  2, 1|2          |64|128      , 255, 255, 204,   0,   "SamariumMagnetic"        ,   "Magnetic Samarium"             ,    0,       0,       1345, 1345,  true, false,   4,   1,   1, Dyes.dyeWhite       , 1, Collections.singletonList(new MaterialStack(Samarium, 1)),Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.RADIO, 1), new TCAspects.TC_AspectStack(TCAspects.MAGNETO,10)));
         Materials.TungstenCarbide         = new Materials( 370, TextureSet.SET_METALLIC          ,  14.0F,   1280,  4, 1|2          |64|128      ,  51,   0, 102,   0,   "TungstenCarbide"         ,   "Tungstencarbide"               ,    0,       0,       2460, 2460,  true, false,   4,   1,   1, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Tungsten, 1), new MaterialStack(Carbon, 1))).disableAutoGeneratedVacuumFreezerRecipe();
         Materials.VanadiumSteel           = new Materials( 371, TextureSet.SET_METALLIC          ,   3.0F,   1920,  3, 1|2          |64|128      , 192, 192, 192,   0,   "VanadiumSteel"           ,   "Vanadiumsteel"                 ,    0,       0,       1453, 1453,  true, false,   4,   1,   1, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Vanadium, 1), new MaterialStack(Chrome, 1), new MaterialStack(Steel, 7))).disableAutoGeneratedBlastFurnaceRecipes();
         Materials.HSSG                    = new Materials( 372, TextureSet.SET_METALLIC          ,  10.0F,   4000,  3, 1|2          |64|128      , 153, 153,   0,   0,   "HSSG"                    ,   "HSS-G"                         ,    0,       0,       4500, 4500,  true, false,   4,   1,   1, Dyes.dyeYellow      , 2, Arrays.asList(new MaterialStack(TungstenSteel, 5), new MaterialStack(Chrome, 1), new MaterialStack(Molybdenum, 2), new MaterialStack(Vanadium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
@@ -831,11 +831,11 @@ public class MaterialsInit1 {
         Materials.HSSS                    = new Materials( 374, TextureSet.SET_METALLIC          ,  32.0F,  10240,  8, 1|2          |64|128      , 102,   0,  51,   0,   "HSSS"                    ,   "HSS-S"                         ,    0,       0,       5400, 5400,  true, false,   4,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(HSSG, 6), new MaterialStack(Iridium, 2), new MaterialStack(Osmium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.TPV                     = new Materials( 576, TextureSet.SET_METALLIC          ,  16.0F,   4000,  5, 1|2          |64|128      , 250,  170,250,   0,   "TPVAlloy"                ,   "TPV-Alloy"                     ,    0,       0,       3000, 3000,  true, false,   4,   1,   1, Dyes.dyeRed         , 2, Arrays.asList(new MaterialStack(Titanium, 3), new MaterialStack(Platinum, 3), new MaterialStack(Vanadium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.DilutedSulfuricAcid     = new MaterialBuilder(640, TextureSet.SET_FLUID             ,                                                                                                     "Diluted Sulfuric Acid").addCell().addFluid().setRGB(192, 120, 32).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(SulfuricAcid, 1)).constructMaterial();
-        Materials.EpoxidFiberReinforced   = new Materials( 610, TextureSet.SET_DULL                 ,3.0F,     64,  1, 1|2          |64|128      , 160, 112,  16,   0,   "EpoxidFiberReinforced"   ,   "Fiber-Reinforced Epoxy Resin"  ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 2, Collections.singletonList(new MaterialStack(Epoxid, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2)));
+        Materials.EpoxidFiberReinforced   = new Materials( 610, TextureSet.SET_DULL                 ,3.0F,     64,  1, 1|2          |64|128      , 160, 112,  16,   0,   "EpoxidFiberReinforced"   ,   "Fiber-Reinforced Epoxy Resin"  ,    0,       0,        400,    0, false, false,   1,   1,   1, Dyes.dyeBrown       , 2, Collections.singletonList(new MaterialStack(Epoxid, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.MOTUS, 2)));
         Materials.SodiumCarbonate         = new MaterialBuilder(695, TextureSet.SET_QUARTZ, "Sodium Carbonate").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(255, 255, 235).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(851 ).setMeltingPoint(851 ).setBlastFurnaceRequired(false).setOreValue(1).setExtraData(1).setMaterialList(new MaterialStack(Sodium, 2), new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 3)).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
         Materials.SodiumAluminate         = new MaterialBuilder(696, TextureSet.SET_QUARTZ, "Sodium Aluminate").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(255, 235, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(1800).setMeltingPoint(1800).setBlastFurnaceRequired(false).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Sodium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Oxygen, 2)).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.Aluminiumoxide          = new MaterialBuilder(697, TextureSet.SET_QUARTZ, "Alumina").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(235, 255, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(2054).setMeltingPoint(2054).setBlastFurnaceRequired(true).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 2))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.Aluminiumhydroxide      = new MaterialBuilder(698, TextureSet.SET_QUARTZ, "Aluminium Hydroxide").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(235, 235, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(1200).setMeltingPoint(1200).setBlastFurnaceRequired(true).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 1), new MaterialStack(Oxygen, 3),  new MaterialStack(Hydrogen, 3)).setAspects(Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 2))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Aluminiumoxide          = new MaterialBuilder(697, TextureSet.SET_QUARTZ, "Alumina").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(235, 255, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(2054).setMeltingPoint(2054).setBlastFurnaceRequired(true).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.GELUM, 2))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+        Materials.Aluminiumhydroxide      = new MaterialBuilder(698, TextureSet.SET_QUARTZ, "Aluminium Hydroxide").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(235, 235, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(1200).setMeltingPoint(1200).setBlastFurnaceRequired(true).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 1), new MaterialStack(Oxygen, 3),  new MaterialStack(Hydrogen, 3)).setAspects(Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.GELUM, 2))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
         Materials.Cryolite                = new MaterialBuilder(699, TextureSet.SET_QUARTZ, "Cryolite").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addOreItems().setRGB(191, 239, 255).setColor(Dyes.dyeLightBlue).setMeltingPoint(1012).setBlastFurnaceTemp(1012).setExtraData(0).setMaterialList(new MaterialStack(Sodium, 3), new MaterialStack(Aluminium, 1), new MaterialStack(Fluorine, 6)).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
         Materials.RedMud                  = new MaterialBuilder(743, TextureSet.SET_FLUID, "Red Mud").addCell().addFluid().setRGB(140, 22, 22).setColor(Dyes.dyeRed).constructMaterial();
 
@@ -851,7 +851,7 @@ public class MaterialsInit1 {
         Materials.Dichlorobenzidine = new MaterialBuilder(596, TextureSet.SET_FLUID             ,                                                                                                     "3,3-Dichlorobenzidine").addCell().addFluid().setRGB(161, 222, 166).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 12),new MaterialStack(Hydrogen, 10), new MaterialStack(Nitrogen, 2), new MaterialStack(Chlorine, 2)).constructMaterial();
         Materials.Diaminobenzidin = new MaterialBuilder(597, TextureSet.SET_FLUID             ,                                                                                                     "3,3-Diaminobenzidine").addCell().addFluid().setRGB(51, 125, 89).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 12),new MaterialStack(Hydrogen, 14),new MaterialStack(Nitrogen, 4)).constructMaterial();
         Materials.Diphenylisophthalate = new MaterialBuilder(598, TextureSet.SET_FLUID             ,                                                                                                     "Diphenyl Isophtalate").addCell().addFluid().setRGB(36, 110, 87).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 20),new MaterialStack(Hydrogen, 14),new MaterialStack(Oxygen, 4)).constructMaterial();
-        Materials.Polybenzimidazole   = new Materials(599, TextureSet.SET_DULL                 ,3.0F,     64,  1, 1|2          |64|128      , 45, 45,  45,   0,   "Polybenzimidazole"   ,   "Polybenzimidazole"  ,    0,       0,        1450,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 0, Arrays.asList(new MaterialStack(Carbon, 20), new MaterialStack(Nitrogen, 4), new MaterialStack(Hydrogen, 12)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2),new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 1)));
+        Materials.Polybenzimidazole   = new Materials(599, TextureSet.SET_DULL                 ,3.0F,     64,  1, 1|2          |64|128      , 45, 45,  45,   0,   "Polybenzimidazole"   ,   "Polybenzimidazole"  ,    0,       0,        1450,    0, false, false,   1,   1,   1, Dyes.dyeBlack       , 0, Arrays.asList(new MaterialStack(Carbon, 20), new MaterialStack(Nitrogen, 4), new MaterialStack(Hydrogen, 12)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.ORDO, 2),new TCAspects.TC_AspectStack(TCAspects.VOLATUS, 1)));
 
         Materials.MTBEMixture        = new MaterialBuilder(983, TextureSet.SET_FLUID             ,                                                                                                      "MTBE Reaction Mixture (Butene)").addCell().addGas().setRGB(255, 255, 255).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 12), new MaterialStack(Oxygen, 1)).constructMaterial();
         Materials.MTBEMixtureAlt = new MaterialBuilder(425, TextureSet.SET_FLUID , "MTBE Reaction Mixture (Butane)").addCell().addGas().setRGB(255, 255, 255).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 14), new MaterialStack(Oxygen, 1)).constructMaterial();
@@ -862,10 +862,10 @@ public class MaterialsInit1 {
         Materials.GasolineRegular    = new MaterialBuilder(997, TextureSet.SET_FLUID             ,                                                                                                      "Gasoline").addCell().addFluid().setRGB(255,165,0).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.DIESEL).setFuelPower(576).constructMaterial();
         Materials.GasolinePremium    = new MaterialBuilder(998, TextureSet.SET_FLUID             ,                                                                                                      "High Octane Gasoline").addCell().addFluid().setRGB(255,165,0).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.DIESEL).setFuelPower(2500).constructMaterial();
 
-        Materials.Electrotine             = new Materials( 812, TextureSet.SET_SHINY             ,   1.0F,      0,  1, 1    |8                   ,  60, 180, 200,   0,   "Electrotine"             ,   "Electrotine"                   ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeCyan        , 0, Arrays.asList(new MaterialStack(Redstone, 1), new MaterialStack(Electrum, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2)));
+        Materials.Electrotine             = new Materials( 812, TextureSet.SET_SHINY             ,   1.0F,      0,  1, 1    |8                   ,  60, 180, 200,   0,   "Electrotine"             ,   "Electrotine"                   ,    0,       0,         -1,    0, false, false,   3,   1,   1, Dyes.dyeCyan        , 0, Arrays.asList(new MaterialStack(Redstone, 1), new MaterialStack(Electrum, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2)));
         Materials.Galgadorian             = new Materials( 384, TextureSet.SET_METALLIC          ,  16.0F,   3600,  3, 1|2          |64|128      , 154, 105, 119,   0,   "Galgadorian"             ,   "Galgadorian"                   ,    0,       0,       3000, 3000,  true, false,   1,   1,   1, Dyes.dyePink        ).disableAutoGeneratedBlastFurnaceRecipes();
         Materials.EnhancedGalgadorian     = new Materials( 385, TextureSet.SET_METALLIC          ,  32.0F,   7200,  5, 1|2|          64|128      , 152, 93, 133,    0,   "EnhancedGalgadorian"     ,   "Enhanced Galgadorian"          ,    0,       0,       4500, 4500,  true, false,   1,   1,   1, Dyes.dyePink        ).disableAutoGeneratedBlastFurnaceRecipes();
-        Materials.BloodInfusedIron        = new Materials( 977, TextureSet.SET_METALLIC          ,  10.0F,    384,  2, 1|2          |64|128      ,  69,   9,  10,   0,   "BloodInfusedIron"        ,   "Blood Infused Iron"            ,    0,       0,       2400,    0, false, false,   3,   1,   1, Dyes.dyeRed         , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 3),  new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+        Materials.BloodInfusedIron        = new Materials( 977, TextureSet.SET_METALLIC          ,  10.0F,    384,  2, 1|2          |64|128      ,  69,   9,  10,   0,   "BloodInfusedIron"        ,   "Blood Infused Iron"            ,    0,       0,       2400,    0, false, false,   3,   1,   1, Dyes.dyeRed         , Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 3),  new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 1)));
         Materials.Shadow                  = new Materials( 368, TextureSet.SET_METALLIC          ,  32.0F,   8192,  4, 1|2  |8      |64|128      ,  16,   3,  66,   0,   "Shadow"                  ,   "Shadow Metal"                  ,    0,       0,       1800, 1800,  true, false,   3,   4,   3, Dyes.dyeBlue        );
 
         Materials.Ledox                   = new Materials( 390, TextureSet.SET_SHINY             ,  15.0F,   1024,  4, 1|2  |8      |64|128      ,   0, 116, 255,   0,   "Ledox"                   ,   "Ledox"                         ,     0,       0,        -1,    0, false, false,  4,   1,   1, Dyes.dyeBlue         );
@@ -874,7 +874,7 @@ public class MaterialsInit1 {
         Materials.BlackPlutonium          = new Materials( 388, TextureSet.SET_DULL              ,  36.0F,   8192,  8, 1|2  |8      |64|128      ,  50,  50,  50,   0,   "BlackPlutonium"          ,   "Black Plutonium"               ,     0,       0,     9000,  9000,  true, false,  4,   1,   1, Dyes.dyeBlack        ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.CallistoIce             = new Materials( 389, TextureSet.SET_SHINY             ,   9.0F,   1024,  4, 1|2  |8      |64|128      ,  30, 177, 255,   0,   "CallistoIce"             ,   "Callisto Ice"                  ,     0,       0,       -1,     0, false, false,  4,   1,   1, Dyes.dyeLightBlue    );
         Materials.Duralumin               = new Materials( 392, TextureSet.SET_SHINY             ,  16.0F,    512,  3, 1|2  |8      |64|128      , 235, 209, 160,   0,   "Duralumin"               ,   "Duralumin"                     ,     0,       0,     1600,  1600,  true, false,  4,   1,   1, Dyes.dyeOrange       , 2, Arrays.asList(new MaterialStack(Aluminium, 6), new MaterialStack(Copper, 1), new MaterialStack(Manganese, 1), new MaterialStack(Magnesium, 1)));
-        Materials.Oriharukon              = new Materials( 393, TextureSet.SET_SHINY             ,  32.0F,  10240,  5, 1|2  |8   |32|64|128      , 103, 125, 104,   0,   "Oriharukon"              ,   "Oriharukon"                    ,     0,       0,     5400,  5400,  true, false,  4,   1,   1, Dyes.dyeLime         , Element.Oh, Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2),new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Oriharukon              = new Materials( 393, TextureSet.SET_SHINY             ,  32.0F,  10240,  5, 1|2  |8   |32|64|128      , 103, 125, 104,   0,   "Oriharukon"              ,   "Oriharukon"                    ,     0,       0,     5400,  5400,  true, false,  4,   1,   1, Dyes.dyeLime         , Element.Oh, Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2),new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 2), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.MysteriousCrystal       = new Materials( 398, TextureSet.SET_SHINY             ,   8.0F,    256,  6, 1|2  |8      |64|128      ,  22, 133, 108,   0,   "MysteriousCrystal"       ,   "Mysterious Crystal"            ,     0,       0,     7200,  7200,  true, false,  4,   1,   1, Dyes.dyeCyan         ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
 
         Materials.RedstoneAlloy           = new Materials( 381, TextureSet.SET_METALLIC          ,   3.0F,    128,  2, 1|2          |64|128      , 181,  51,  51,   0,   "RedstoneAlloy"           ,   "Redstone Alloy"                ,    0,       0,        671, 1000,  true, false,   1,   1,   1, Dyes.dyeRed         , 1, Arrays.asList(new MaterialStack(Redstone, 1), new MaterialStack(Silicon, 1), new MaterialStack(Coal, 1))).disableAutoGeneratedBlastFurnaceRecipes();
@@ -893,9 +893,9 @@ public class MaterialsInit1 {
         Materials.CrystallinePinkSlime    = new Materials( 406, TextureSet.SET_METALLIC          ,   6.0F,    128,  3, 1|2          |64|128      , 231, 158, 219,   0,   "CrystallinePinkSlime"    ,   "Crystalline Pink Slime"        ,    0,       0,       5000, 5000,  true, false,   4,   1,   1, Dyes.dyePink        , 1, Arrays.asList(new MaterialStack(CrystallineAlloy, 1), new MaterialStack(Diamond, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.EnergeticSilver         = new Materials( 407, TextureSet.SET_METALLIC          ,   8.0F,    512,  3, 1|2          |64|128      , 149, 183, 205,   0,   "EnergeticSilver"         ,   "Energetic Silver"              ,    0,       0,         -1, 2200,  true, false,   4,   1,   1, Dyes.dyeLightBlue   , 1, Arrays.asList(new MaterialStack(Silver, 1), new MaterialStack(ConductiveIron, 1), new MaterialStack(BlackSteel, 1))).disableAutoGeneratedBlastFurnaceRecipes();
         Materials.VividAlloy              = new Materials( 408, TextureSet.SET_METALLIC          ,  12.0F,    768,  4, 1|2          |64|128      ,  70, 188, 219,   0,   "VividAlloy"              ,   "Vivid Alloy"                   ,    0,       0,       3300, 3300,  true, false,   4,   1,   1, Dyes.dyeBlue        , 1, Arrays.asList(new MaterialStack(EnergeticSilver, 1), new MaterialStack(EnderEye, 1), new MaterialStack(Chrome, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Enderium                = new Materials( 321, TextureSet.SET_DULL              ,   8.0F,   1500,  3, 1|2          |64|128      ,  89, 145, 135,   0,   "Enderium"                ,   "Enderium"                      ,    0,       0,       4500, 4500,  true, false,   1,   1,   1, Dyes.dyeGreen       , 1, Arrays.asList(new MaterialStack(EnderiumBase, 2), new MaterialStack(Thaumium, 1), new MaterialStack(EnderPearl, 1)), Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Enderium                = new Materials( 321, TextureSet.SET_DULL              ,   8.0F,   1500,  3, 1|2          |64|128      ,  89, 145, 135,   0,   "Enderium"                ,   "Enderium"                      ,    0,       0,       4500, 4500,  true, false,   1,   1,   1, Dyes.dyeGreen       , 1, Arrays.asList(new MaterialStack(EnderiumBase, 2), new MaterialStack(Thaumium, 1), new MaterialStack(EnderPearl, 1)), Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2), new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
         Materials.Mithril                 = new Materials( 331, TextureSet.SET_SHINY             ,  32.0F,     64,  2, 1|2  |8      |64          , 255, 255, 210,   0,   "Mithril"                 ,   "Mithril"                       ,    0,       0,       6600, 6600,  true, false,   4,   3,   2, Dyes.dyeLightBlue   , 2, Arrays.asList(new MaterialStack(Platinum, 2), new MaterialStack(Thaumium, 1))).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(22, 1, 1);
-        Materials.BlueAlloy               = new Materials( 309, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1|2                       , 100, 180, 255,   0,   "BlueAlloy"               ,   "Blue Alloy"                    ,    0,       0,         -1,    0, false, false,   3,   5,   1, Dyes.dyeLightBlue   , 2, Arrays.asList(new MaterialStack(Silver, 1), new MaterialStack(Electrotine, 4)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 3)));
+        Materials.BlueAlloy               = new Materials( 309, TextureSet.SET_DULL              ,   1.0F,      0,  0, 1|2                       , 100, 180, 255,   0,   "BlueAlloy"               ,   "Blue Alloy"                    ,    0,       0,         -1,    0, false, false,   3,   5,   1, Dyes.dyeLightBlue   , 2, Arrays.asList(new MaterialStack(Silver, 1), new MaterialStack(Electrotine, 4)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 3)));
         Materials.ShadowIron              = new Materials( 336, TextureSet.SET_METALLIC          ,  32.0F,  10240,  2, 1|2  |8      |64          , 120, 120, 120,   0,   "ShadowIron"              ,   "Shadow Iron"                   ,    0,       0,       8400, 8400,  true, false,   3,   4,   3, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Thaumium, 3))).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1, 76, 1);
         Materials.ShadowSteel             = new Materials( 337, TextureSet.SET_METALLIC          ,   6.0F,    768,  4, 1|2          |64          ,  90,  90,  90,   0,   "ShadowSteel"             ,   "Shadow Steel"                  ,    0,       0,         -1, 1700,  true, false,   4,   4,   3, Dyes.dyeBlack       , 2, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Thaumium, 3)));
         Materials.AstralSilver            = new Materials( 333, TextureSet.SET_SHINY             ,  10.0F,     64,  2, 1|2          |64          , 230, 230, 255,   0,   "AstralSilver"            ,   "Astral Silver"                 ,    0,       0,         -1,    0, false, false,   4,   3,   2, Dyes.dyeWhite       , 2, Arrays.asList(new MaterialStack(Silver, 2), new MaterialStack(Thaumium, 1)));
@@ -907,37 +907,37 @@ public class MaterialsInit1 {
         Materials.Ichorium                = new Materials( 978, TextureSet.SET_SHINY             ,  32.0F, 850000,  12, 1|2    |8 |32|64|128      , 211, 120,   6,   0,   "Ichorium"                ,   "Ichorium"                      ,     5,  250000,      9000,   9000,  true, false,  4,   1,   1, Dyes.dyeOrange       ).setTurbineMultipliers(6, 6, 3).setHasCorrespondingPlasma(true);
         Materials.CosmicNeutronium        = new Materials( 982, TextureSet.SET_SHINY             ,  96.0F, 163840,  12, 1|2    |8 |32|64|128      ,  50,  50,  50,   0,   "CosmicNeutronium"        ,   "Cosmic Neutronium"             ,     0,       0,      9900,   9900,  true, false,  4,   1,   1, Dyes.dyeBlack        ).setProcessingMaterialTierEU(TierEU.RECIPE_ZPM).disableAutoGeneratedVacuumFreezerRecipe().setHasCorrespondingPlasma(true);
 
-        Materials.Pentacadmiummagnesiumhexaoxid                                   = new Materials( 987, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  85, 85,  85,   0,   "Pentacadmiummagnesiumhexaoxid"                                 ,   "Superconductor Base MV"       ,     0,       0,     2500,  2500,  true,  false,  1,   1,   1, Dyes.dyeGray       , 1, Arrays.asList(new MaterialStack(Cadmium, 5), new MaterialStack(Magnesium, 1), new MaterialStack(Oxygen, 6)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 3))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Titaniumonabariumdecacoppereikosaoxid                           = new Materials( 988, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                ,  51, 25,   0,   0,   "Titaniumonabariumdecacoppereikosaoxid"                         ,   "Superconductor Base HV"       ,     0,       0,     3300,  3300,  true,  false,  1,   1,   1, Dyes.dyeBrown      , 1, Arrays.asList(new MaterialStack(Titanium, 1), new MaterialStack(Barium, 9),  new MaterialStack(Copper, 10), new MaterialStack(Oxygen, 20)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 6))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Uraniumtriplatinid                                              = new Materials( 989, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,   0,135,   0,   0,   "Uraniumtriplatinid"                                            ,   "Superconductor Base EV"       ,     0,       0,     4400,  4400,  true,  false,  1,   1,   1, Dyes.dyeLime       , 1, Arrays.asList(new MaterialStack(Uranium, 1), new MaterialStack(Platinum, 3)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 9))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Vanadiumtriindinid                                              = new Materials( 990, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  51,  0,  51,   0,   "Vanadiumtriindinid"                                            ,   "Superconductor Base IV"       ,     0,       0,     5200,  5200,  true,  false,  1,   1,   1, Dyes.dyeMagenta    , 1, Arrays.asList(new MaterialStack(Vanadium , 1), new MaterialStack(Indium, 3)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 12))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid     = new Materials( 991, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                , 153, 76,   0,   0,   "Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid"   ,   "Superconductor Base LuV"      ,     0,       0,     6000,  6000,  true,  false,  1,   1,   1, Dyes.dyeBrown      , 1, Arrays.asList(new MaterialStack(Indium, 4), new MaterialStack(Tin, 2), new MaterialStack(Barium, 2), new MaterialStack(Titanium, 1), new MaterialStack(Copper, 7), new MaterialStack(Oxygen, 14)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 15))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Tetranaquadahdiindiumhexaplatiumosminid                         = new Materials( 992, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                ,  10, 10,  10,   0,   "Tetranaquadahdiindiumhexaplatiumosminid"                       ,   "Superconductor Base ZPM"      ,     0,       0,     9000,  9000,  true,  false,  1,   1,   1, Dyes.dyeBlack      , 1, Arrays.asList(new MaterialStack(Naquadah, 4), new MaterialStack(Indium, 2), new MaterialStack(Palladium, 6), new MaterialStack(Osmium, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 18))).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Longasssuperconductornameforuvwire                              = new Materials( 986, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                , 224,210,   7,   0,   "Longasssuperconductornameforuvwire"                            ,   "Superconductor Base UV"       ,     0,       0,     9900,  9900,  true,  false,  1,   1,   1, Dyes.dyeYellow     , 1, Arrays.asList(new MaterialStack(Naquadria, 4), new MaterialStack(Osmiridium, 3), new MaterialStack(Europium, 1), new MaterialStack(Samarium, 1)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 21))).setProcessingMaterialTierEU(TierEU.RECIPE_LuV).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.Longasssuperconductornameforuhvwire                             = new Materials( 985, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  38,129, 189,   0,   "Longasssuperconductornameforuhvwire"                           ,   "Superconductor Base UHV"      ,     0,       0,     10800,  10800,  true,  false,  1,   1,   1, Dyes.dyeWhite      , 1, Arrays.asList(new MaterialStack(Draconium, 6), new MaterialStack(CosmicNeutronium, 7), new MaterialStack(Tritanium, 5), new MaterialStack(Americium, 6)), Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 24))).setProcessingMaterialTierEU(TierEU.RECIPE_ZPM).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.SuperconductorUEVBase                                           = new Materials( 974, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  174, 8,   8,   0,   "SuperconductorUEVBase"                                         ,   "Superconductor Base UEV"      ,     0,       0,     11700,  11800,  true,  false,  1,   1,   1, Dyes.dyeWhite, Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 27))).setProcessingMaterialTierEU(TierEU.RECIPE_UV).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.SuperconductorUIVBase                                           = new Materials( 131, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  229, 88,   177,   0,   "SuperconductorUIVBase"                                         ,   "Superconductor Base UIV"      ,     0,       0,     12700,  12700,  true,  false,  1,   1,   1, Dyes.dyeWhite, Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 34))).setProcessingMaterialTierEU(TierEU.RECIPE_UHV).disableAutoGeneratedVacuumFreezerRecipe();
-        Materials.SuperconductorUMVBase                                           = new Materials( 134, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  181, 38,   205,   0,   "SuperconductorUMVBase"                                         ,   "Superconductor Base UMV"      ,     0,       0,     13600,  13600,  true,  false,  1,   1,   1, Dyes.dyeWhite, Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 40))).setProcessingMaterialTierEU(TierEU.RECIPE_UEV).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Pentacadmiummagnesiumhexaoxid                                   = new Materials( 987, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  85, 85,  85,   0,   "Pentacadmiummagnesiumhexaoxid"                                 ,   "Superconductor Base MV"       ,     0,       0,     2500,  2500,  true,  false,  1,   1,   1, Dyes.dyeGray       , 1, Arrays.asList(new MaterialStack(Cadmium, 5), new MaterialStack(Magnesium, 1), new MaterialStack(Oxygen, 6)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 3))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Titaniumonabariumdecacoppereikosaoxid                           = new Materials( 988, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                ,  51, 25,   0,   0,   "Titaniumonabariumdecacoppereikosaoxid"                         ,   "Superconductor Base HV"       ,     0,       0,     3300,  3300,  true,  false,  1,   1,   1, Dyes.dyeBrown      , 1, Arrays.asList(new MaterialStack(Titanium, 1), new MaterialStack(Barium, 9),  new MaterialStack(Copper, 10), new MaterialStack(Oxygen, 20)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 6))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Uraniumtriplatinid                                              = new Materials( 989, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,   0,135,   0,   0,   "Uraniumtriplatinid"                                            ,   "Superconductor Base EV"       ,     0,       0,     4400,  4400,  true,  false,  1,   1,   1, Dyes.dyeLime       , 1, Arrays.asList(new MaterialStack(Uranium, 1), new MaterialStack(Platinum, 3)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 9))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Vanadiumtriindinid                                              = new Materials( 990, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  51,  0,  51,   0,   "Vanadiumtriindinid"                                            ,   "Superconductor Base IV"       ,     0,       0,     5200,  5200,  true,  false,  1,   1,   1, Dyes.dyeMagenta    , 1, Arrays.asList(new MaterialStack(Vanadium , 1), new MaterialStack(Indium, 3)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 12))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid     = new Materials( 991, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                , 153, 76,   0,   0,   "Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid"   ,   "Superconductor Base LuV"      ,     0,       0,     6000,  6000,  true,  false,  1,   1,   1, Dyes.dyeBrown      , 1, Arrays.asList(new MaterialStack(Indium, 4), new MaterialStack(Tin, 2), new MaterialStack(Barium, 2), new MaterialStack(Titanium, 1), new MaterialStack(Copper, 7), new MaterialStack(Oxygen, 14)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 15))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Tetranaquadahdiindiumhexaplatiumosminid                         = new Materials( 992, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                ,  10, 10,  10,   0,   "Tetranaquadahdiindiumhexaplatiumosminid"                       ,   "Superconductor Base ZPM"      ,     0,       0,     9000,  9000,  true,  false,  1,   1,   1, Dyes.dyeBlack      , 1, Arrays.asList(new MaterialStack(Naquadah, 4), new MaterialStack(Indium, 2), new MaterialStack(Palladium, 6), new MaterialStack(Osmium, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 18))).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Longasssuperconductornameforuvwire                              = new Materials( 986, TextureSet.SET_METALLIC       ,   1.0F,      0,  3, 1|2                , 224,210,   7,   0,   "Longasssuperconductornameforuvwire"                            ,   "Superconductor Base UV"       ,     0,       0,     9900,  9900,  true,  false,  1,   1,   1, Dyes.dyeYellow     , 1, Arrays.asList(new MaterialStack(Naquadria, 4), new MaterialStack(Osmiridium, 3), new MaterialStack(Europium, 1), new MaterialStack(Samarium, 1)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 21))).setProcessingMaterialTierEU(TierEU.RECIPE_LuV).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.Longasssuperconductornameforuhvwire                             = new Materials( 985, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  38,129, 189,   0,   "Longasssuperconductornameforuhvwire"                           ,   "Superconductor Base UHV"      ,     0,       0,     10800,  10800,  true,  false,  1,   1,   1, Dyes.dyeWhite      , 1, Arrays.asList(new MaterialStack(Draconium, 6), new MaterialStack(CosmicNeutronium, 7), new MaterialStack(Tritanium, 5), new MaterialStack(Americium, 6)), Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 24))).setProcessingMaterialTierEU(TierEU.RECIPE_ZPM).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.SuperconductorUEVBase                                           = new Materials( 974, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  174, 8,   8,   0,   "SuperconductorUEVBase"                                         ,   "Superconductor Base UEV"      ,     0,       0,     11700,  11800,  true,  false,  1,   1,   1, Dyes.dyeWhite, Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 27))).setProcessingMaterialTierEU(TierEU.RECIPE_UV).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.SuperconductorUIVBase                                           = new Materials( 131, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  229, 88,   177,   0,   "SuperconductorUIVBase"                                         ,   "Superconductor Base UIV"      ,     0,       0,     12700,  12700,  true,  false,  1,   1,   1, Dyes.dyeWhite, Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 34))).setProcessingMaterialTierEU(TierEU.RECIPE_UHV).disableAutoGeneratedVacuumFreezerRecipe();
+        Materials.SuperconductorUMVBase                                           = new Materials( 134, TextureSet.SET_SHINY          ,   1.0F,      0,  3, 1|2                ,  181, 38,   205,   0,   "SuperconductorUMVBase"                                         ,   "Superconductor Base UMV"      ,     0,       0,     13600,  13600,  true,  false,  1,   1,   1, Dyes.dyeWhite, Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 40))).setProcessingMaterialTierEU(TierEU.RECIPE_UEV).disableAutoGeneratedVacuumFreezerRecipe();
 
-        Materials.SuperconductorMV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  85, 85,  85,   0,   "SuperconductorMV"   ,   "Superconductor MV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeGray       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 6)));
-        Materials.SuperconductorHV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  51, 25,   0,   0,   "SuperconductorHV"   ,   "Superconductor HV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeBrown      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 12)));
-        Materials.SuperconductorEV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,   0,135,   0,   0,   "SuperconductorEV"   ,   "Superconductor EV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeLime       , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 18)));
-        Materials.SuperconductorIV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  51,  0,  51,   0,   "SuperconductorIV"   ,   "Superconductor IV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeMagenta    , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 24)));
-        Materials.SuperconductorLuV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 153, 76,   0,   0,   "SuperconductorLuV"  ,   "Superconductor LuV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeBrown      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 30)));
-        Materials.SuperconductorZPM     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  10, 10,  10,   0,   "SuperconductorZPM"  ,   "Superconductor ZPM"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeBlack      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 36)));
-        Materials.SuperconductorUV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 224,210,   7,   0,   "SuperconductorUV"   ,   "Superconductor UV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeYellow     , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 42)));
-        Materials.SuperconductorUHV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  38,129, 189,   0,   "Superconductor"     ,   "Superconductor UHV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 48)));
-        Materials.SuperconductorUEV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 174,  8,   8,   0,   "SuperconductorUEV"  ,   "Superconductor UEV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 54)));
-        Materials.SuperconductorUIV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 229, 88, 177,   0,   "SuperconductorUIV"  ,   "Superconductor UIV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 60)));
-        Materials.SuperconductorUMV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 181, 38, 205,   0,   "SuperconductorUMV"  ,   "Superconductor UMV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 66)));
+        Materials.SuperconductorMV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  85, 85,  85,   0,   "SuperconductorMV"   ,   "Superconductor MV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeGray       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 6)));
+        Materials.SuperconductorHV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  51, 25,   0,   0,   "SuperconductorHV"   ,   "Superconductor HV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeBrown      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 12)));
+        Materials.SuperconductorEV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,   0,135,   0,   0,   "SuperconductorEV"   ,   "Superconductor EV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeLime       , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 18)));
+        Materials.SuperconductorIV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  51,  0,  51,   0,   "SuperconductorIV"   ,   "Superconductor IV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeMagenta    , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 24)));
+        Materials.SuperconductorLuV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 153, 76,   0,   0,   "SuperconductorLuV"  ,   "Superconductor LuV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeBrown      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 30)));
+        Materials.SuperconductorZPM     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  10, 10,  10,   0,   "SuperconductorZPM"  ,   "Superconductor ZPM"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeBlack      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 36)));
+        Materials.SuperconductorUV      = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 224,210,   7,   0,   "SuperconductorUV"   ,   "Superconductor UV"       ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeYellow     , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 42)));
+        Materials.SuperconductorUHV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                ,  38,129, 189,   0,   "Superconductor"     ,   "Superconductor UHV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 48)));
+        Materials.SuperconductorUEV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 174,  8,   8,   0,   "SuperconductorUEV"  ,   "Superconductor UEV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 54)));
+        Materials.SuperconductorUIV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 229, 88, 177,   0,   "SuperconductorUIV"  ,   "Superconductor UIV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 60)));
+        Materials.SuperconductorUMV     = new Materials( -1, TextureSet.SET_SHINY       ,   1.0F,      0,  0, 0                , 181, 38, 205,   0,   "SuperconductorUMV"  ,   "Superconductor UMV"      ,     0,       0,     -1,  -1,  false,  false,  1,   1,   1, Dyes.dyeWhite      , Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 66)));
 
         Materials.SuperCoolant = new MaterialBuilder( 140, TextureSet.SET_DULL,"Super Coolant").setRGB(2, 91, 111).addCell().addFluid().constructMaterial().setLiquidTemperature(1);
 
         Materials.EnrichedHolmium       = new Materials(582, TextureSet.SET_METALLIC    ,   1.0F,      0,  2,    2             ,  18,  100, 255,   0,   "EnrichedHolmium"    ,   "Enriched Holmium"        ,    -1,      -1,      0, 3000,  true,  false,200,   1,   1, Dyes.dyePurple);
 
-        Materials.TengamPurified = new MaterialBuilder(111, TextureSet.SET_METALLIC, "Purified Tengam").addDustItems().addGearItems().addMetalItems().addToolHeadItems().setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2))).setColor(Dyes.dyeLime).setName("TengamPurified").setRGB(186, 223, 112).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
-        Materials.TengamAttuned  = new MaterialBuilder(112, TextureSet.SET_MAGNETIC, "Attuned Tengam") .addDustItems().addGearItems().addMetalItems().addToolHeadItems().setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 4), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1))).setColor(Dyes.dyeLime).setName("TengamAttuned") .setRGB(213, 255, 128).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
-        Materials.TengamRaw      = new MaterialBuilder(110, TextureSet.SET_ROUGH,    "Raw Tengam")     .addOreItems()                                                   .setAspects(Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1), new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4))).setColor(Dyes.dyeLime).setName("TengamRaw")     .setRGB(160, 191,  96).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
+        Materials.TengamPurified = new MaterialBuilder(111, TextureSet.SET_METALLIC, "Purified Tengam").addDustItems().addGearItems().addMetalItems().addToolHeadItems().setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 2), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 2))).setColor(Dyes.dyeLime).setName("TengamPurified").setRGB(186, 223, 112).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
+        Materials.TengamAttuned  = new MaterialBuilder(112, TextureSet.SET_MAGNETIC, "Attuned Tengam") .addDustItems().addGearItems().addMetalItems().addToolHeadItems().setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 4), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 1))).setColor(Dyes.dyeLime).setName("TengamAttuned") .setRGB(213, 255, 128).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
+        Materials.TengamRaw      = new MaterialBuilder(110, TextureSet.SET_ROUGH,    "Raw Tengam")     .addOreItems()                                                   .setAspects(Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1), new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 4))).setColor(Dyes.dyeLime).setName("TengamRaw")     .setRGB(160, 191,  96).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
 
         Materials.ActivatedCarbon = new MaterialBuilder(563, TextureSet.SET_DULL, "Activated Carbon")
             .addDustItems()
@@ -1039,7 +1039,7 @@ public class MaterialsInit1 {
                 new MaterialStack(Materials.Oxygen, 7),
                 new MaterialStack(Materials.Silver, 3),
                 new MaterialStack(Materials.CallistoIce, 1)),
-            Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.HUMANUS, 2))).setHasCorrespondingGas(true)
+            Arrays.asList(new TCAspects.TC_AspectStack(TCAspects.HUMANUS, 2))).setHasCorrespondingGas(true)
             .setGasTemperature(12406);
 
         // spotless:on
diff --git a/src/main/java/gregtech/loaders/misc/CoverLoader.java b/src/main/java/gregtech/loaders/misc/CoverLoader.java
new file mode 100644
index 0000000000..f2feaa3a29
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/CoverLoader.java
@@ -0,0 +1,42 @@
+package gregtech.loaders.misc;
+
+import static gregtech.api.enums.Textures.BlockIcons.VENT_ADVANCED;
+import static gregtech.api.enums.Textures.BlockIcons.VENT_NORMAL;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTechAPI;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GTModHandler;
+import gregtech.common.covers.CoverVent;
+
+public class CoverLoader implements Runnable {
+
+    @Override
+    public void run() {
+        for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+            GregTechAPI.registerCover(new ItemStack(Blocks.carpet, 1, i), TextureFactory.of(Blocks.wool, i), null);
+        }
+        GregTechAPI.registerCover(
+            GTModHandler.getIC2Item("reactorVent", 1L, 1),
+            TextureFactory.of(VENT_NORMAL),
+            new CoverVent(1));
+        GregTechAPI.registerCover(
+            GTModHandler.getIC2Item("reactorVentCore", 1L, 1),
+            TextureFactory.of(VENT_NORMAL),
+            new CoverVent(1));
+        GregTechAPI.registerCover(
+            GTModHandler.getIC2Item("reactorVentGold", 1L, 1),
+            TextureFactory.of(VENT_ADVANCED),
+            new CoverVent(2));
+        GregTechAPI.registerCover(
+            GTModHandler.getIC2Item("reactorVentSpread", 1L),
+            TextureFactory.of(VENT_NORMAL),
+            new CoverVent(2));
+        GregTechAPI.registerCover(
+            GTModHandler.getIC2Item("reactorVentDiamond", 1L, 1),
+            TextureFactory.of(VENT_ADVANCED),
+            new CoverVent(3));
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GTAchievements.java b/src/main/java/gregtech/loaders/misc/GTAchievements.java
new file mode 100644
index 0000000000..aed2ff6d28
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GTAchievements.java
@@ -0,0 +1,814 @@
+package gregtech.loaders.misc;
+
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.Achievement;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.stats.StatBase;
+import net.minecraftforge.common.AchievementPage;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent;
+import gregtech.GTMod;
+import gregtech.api.enums.GTValues;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipe;
+import gregtech.common.items.IDMetaTool01;
+import gregtech.common.items.MetaGeneratedTool01;
+import ic2.core.Ic2Items;
+import thaumcraft.api.ThaumcraftApiHelper;
+
+public class GTAchievements {
+
+    public static int oreReg = -1;
+    public static int assReg = -1;
+    public ConcurrentHashMap achievementList;
+    public ConcurrentHashMap issuedAchievements;
+    public int adjX = 5;
+    public int adjY = 9;
+
+    public GTAchievements() {
+        this.achievementList = new ConcurrentHashMap<>();
+        this.issuedAchievements = new ConcurrentHashMap<>();
+
+        for (GTRecipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
+            registerAssAchievement(recipe);
+        }
+
+        registerAchievement(
+            "flintpick",
+            0,
+            0,
+            MetaGeneratedTool01.INSTANCE.getToolWithStats(2, 1, Materials.Flint, Materials.Wood, null),
+            "",
+            false);
+        registerAchievement("crops", -4, 0, GTModHandler.getIC2Item("crop", 1L), "flintpick", false);
+        registerAchievement("havestlead", -4, 2, ItemList.Crop_Drop_Plumbilia.get(1), "crops", false);
+        registerAchievement("havestcopper", -2, 1, ItemList.Crop_Drop_Coppon.get(1), "crops", false);
+        registerAchievement("havesttin", -2, -1, ItemList.Crop_Drop_Tine.get(1), "crops", false);
+        registerAchievement("havestoil", -4, -4, ItemList.Crop_Drop_OilBerry.get(1), "crops", false);
+        registerAchievement("havestiron", -2, -3, ItemList.Crop_Drop_Ferru.get(1), "crops", false);
+        registerAchievement("havestgold", -2, -6, ItemList.Crop_Drop_Aurelia.get(1), "havestiron", false);
+        registerAchievement("havestsilver", -4, -5, ItemList.Crop_Drop_Argentia.get(1), "havestiron", false);
+        registerAchievement("havestemeralds", -2, -8, ItemList.Crop_Drop_BobsYerUncleRanks.get(1), "havestgold", false);
+
+        registerAchievement(
+            "tools",
+            0,
+            4,
+            MetaGeneratedTool01.INSTANCE
+                .getToolWithStats(IDMetaTool01.HARDHAMMER.ID, 1, Materials.Iron, Materials.Wood, null),
+            "flintpick",
+            false);
+        registerAchievement(
+            "driltime",
+            2,
+            4,
+            MetaGeneratedTool01.INSTANCE
+                .getToolWithStats(IDMetaTool01.DRILL_LV.ID, 1, Materials.BlueSteel, Materials.StainlessSteel, null),
+            "tools",
+            false);
+        registerAchievement(
+            "brrrr",
+            2,
+            6,
+            MetaGeneratedTool01.INSTANCE
+                .getToolWithStats(IDMetaTool01.CHAINSAW_LV.ID, 1, Materials.BlueSteel, Materials.StainlessSteel, null),
+            "driltime",
+            false);
+        registerAchievement(
+            "highpowerdrill",
+            3,
+            5,
+            MetaGeneratedTool01.INSTANCE
+                .getToolWithStats(IDMetaTool01.DRILL_HV.ID, 1, Materials.TungstenSteel, Materials.TungstenSteel, null),
+            "driltime",
+            false);
+        registerAchievement(
+            "hammertime",
+            3,
+            7,
+            MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                IDMetaTool01.JACKHAMMER.ID,
+                1,
+                Materials.TungstenSteel,
+                Materials.TungstenSteel,
+                null),
+            "highpowerdrill",
+            false);
+
+        registerAchievement(
+            "unitool",
+            -2,
+            4,
+            MetaGeneratedTool01.INSTANCE
+                .getToolWithStats(IDMetaTool01.UNIVERSALSPADE.ID, 1, Materials.Steel, Materials.Iron, null),
+            "tools",
+            false);
+        registerAchievement("recycling", -4, 4, ItemList.Machine_LV_ArcFurnace.get(1), "unitool", false);
+
+        registerAchievement(
+            "crushed",
+            0,
+            6,
+            GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Tin, 1L),
+            "tools",
+            false);
+        registerAchievement(
+            "cleandust",
+            0,
+            10,
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+            "crushed",
+            false);
+        registerAchievement(
+            "washing",
+            -2,
+            6,
+            GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Iron, 1L),
+            "crushed",
+            false);
+        registerAchievement(
+            "spinit",
+            -4,
+            6,
+            GTOreDictUnificator.get(OrePrefixes.crushedCentrifuged, Materials.Redstone, 1L),
+            "crushed",
+            false);
+
+        registerAchievement("newfuel", -4, 8, ItemList.ThoriumCell_4.get(1), "spinit", false);
+        registerAchievement(
+            "newmetal",
+            -4,
+            10,
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 1L),
+            "newfuel",
+            false);
+        registerAchievement("reflect", -2, 9, ItemList.Neutron_Reflector.get(1), "newfuel", false);
+
+        registerAchievement(
+            "bronze",
+            2,
+            0,
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 1L),
+            "flintpick",
+            false);
+        registerAchievement(
+            "simplyeco",
+            2,
+            2,
+            ItemList.Machine_Bronze_Boiler_Solar.get(1, ItemList.Machine_HP_Solar.get(1L)),
+            "bronze",
+            false);
+        registerAchievement("firststeam", 2, -2, ItemList.Machine_Bronze_Boiler.get(1), "bronze", false);
+        registerAchievement("alloysmelter", 2, -4, ItemList.Machine_Bronze_AlloySmelter.get(1), "firststeam", false);
+        registerAchievement("macerator", 0, -2, ItemList.Machine_Bronze_Macerator.get(1), "firststeam", false);
+        registerAchievement("extract", 0, -4, ItemList.Machine_Bronze_Extractor.get(1), "alloysmelter", false);
+
+        registerAchievement("smallparts", 0, -5, ItemList.Circuit_Primitive.get(1), "alloysmelter", false);
+        registerAchievement("gtbasiccircuit", 0, -8, Ic2Items.electronicCircuit.copy(), "smallparts", false);
+        registerAchievement("bettercircuits", 0, -9, ItemList.Circuit_Good.get(1), "gtbasiccircuit", false);
+        registerAchievement("stepforward", -2, -9, Ic2Items.advancedCircuit.copy(), "bettercircuits", false);
+        registerAchievement("gtmonosilicon", -5, -10, ItemList.Circuit_Silicon_Ingot.get(1), "stepforward", false);
+        registerAchievement("gtlogicwafer", -7, -10, ItemList.Circuit_Wafer_ILC.get(1), "gtmonosilicon", false);
+        registerAchievement("gtlogiccircuit", -9, -10, ItemList.Circuit_Basic.get(1), "gtlogicwafer", false);
+        registerAchievement("gtcleanroom", -11, -10, ItemList.Machine_Multi_Cleanroom.get(1), "gtlogiccircuit", false);
+        registerAchievement("energyflow", -13, -10, ItemList.Circuit_Nanoprocessor.get(1), "gtcleanroom", false);
+        registerAchievement(
+            "gtquantumprocessor",
+            -13,
+            -12,
+            ItemList.Circuit_Quantumprocessor.get(1),
+            "energyflow",
+            false);
+        registerAchievement(
+            "gtcrystalprocessor",
+            -11,
+            -12,
+            ItemList.Circuit_Crystalprocessor.get(1),
+            "gtquantumprocessor",
+            false);
+        registerAchievement("gtwetware", -9, -12, ItemList.Circuit_Neuroprocessor.get(1), "gtcrystalprocessor", false);
+        registerAchievement("gtwetmain", -7, -12, ItemList.Circuit_Wetwaremainframe.get(1), "gtwetware", false);
+
+        registerAchievement("orbs", -10, -14, ItemList.Energy_LapotronicOrb.get(1), "energyflow", false);
+        registerAchievement("thatspower", -8, -14, ItemList.Energy_LapotronicOrb2.get(1), "orbs", false);
+        registerAchievement("datasaving", -2, -12, ItemList.Tool_DataOrb.get(1), "stepforward", false);
+        registerAchievement("superbuffer", 0, -12, ItemList.Automation_SuperBuffer_LV.get(1), "datasaving", false);
+        registerAchievement("newstorage", -2, -14, ItemList.Quantum_Chest_HV.get(1), "superbuffer", false);
+        registerAchievement("whereistheocean", 2, -14, ItemList.Quantum_Tank_IV.get(1), "superbuffer", false);
+        registerAchievement("luck", 2, -6, ItemList.ZPM.get(1), "", false);
+
+        registerAchievement(
+            "steel",
+            4,
+            0,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
+            "bronze",
+            false);
+        registerAchievement("highpressure", 4, 2, ItemList.Machine_Steel_Boiler.get(1), "steel", false);
+        registerAchievement(
+            "extremepressure",
+            4,
+            4,
+            ItemList.Machine_Multi_LargeBoiler_Steel.get(1),
+            "highpressure",
+            false);
+        registerAchievement("cheapermac", 6, 1, ItemList.Machine_LV_Hammer.get(1), "steel", false);
+        registerAchievement(
+            "complexalloys",
+            6,
+            3,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.BlueSteel, 1L),
+            "cheapermac",
+            false);
+
+        registerAchievement(
+            "magneticiron",
+            4,
+            -2,
+            GTOreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1L),
+            "steel",
+            false);
+        registerAchievement("lvmotor", 4, -6, ItemList.Electric_Motor_LV.get(1), "magneticiron", false);
+        registerAchievement("pumpcover", 2, -8, ItemList.Electric_Pump_LV.get(1), "lvmotor", false);
+        registerAchievement("closeit", 2, -10, ItemList.Cover_Shutter.get(1), "pumpcover", false);
+        registerAchievement("slurp", 2, -12, ItemList.Pump_HV.get(1), "closeit", false);
+        registerAchievement("transport", 4, -10, ItemList.Conveyor_Module_LV.get(1), "lvmotor", false);
+        registerAchievement("manipulation", 4, -12, ItemList.Cover_Controller.get(1), "transport", false);
+        registerAchievement("buffer", 4, -14, ItemList.Automation_ChestBuffer_LV.get(1), "manipulation", false);
+        registerAchievement("complexmachines", 6, -9, ItemList.Robot_Arm_LV.get(1), "lvmotor", false);
+        registerAchievement("avengers", 8, -11, ItemList.Machine_LV_Assembler.get(1), "complexmachines", false);
+        registerAchievement("filterregulate", 10, -11, ItemList.Component_Filter.get(1), "avengers", false);
+
+        registerAchievement("steampower", 6, -6, ItemList.Generator_Steam_Turbine_LV.get(1), "lvmotor", false);
+        registerAchievement("batterys", 6, -4, ItemList.Battery_Buffer_2by2_MV.get(1), "steampower", false);
+        registerAchievement("badweather", 6, -8, ItemList.Casing_FireHazard.get(1), "steampower", false);
+        registerAchievement("electricproblems", 7, -7, ItemList.Casing_ExplosionHazard.get(1), "steampower", false);
+        registerAchievement("ebf", 8, -6, ItemList.Machine_Multi_BlastFurnace.get(1), "steampower", false);
+        registerAchievement("energyhatch", 12, -6, ItemList.Hatch_Energy_LV.get(1), "ebf", false);
+
+        registerAchievement(
+            "gtaluminium",
+            8,
+            0,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Aluminium, 1L),
+            "steel",
+            false);
+        registerAchievement("highpowersmelt", 8, 2, ItemList.Machine_Multi_Furnace.get(1), "gtaluminium", false);
+        registerAchievement("oilplant", 8, 4, ItemList.Distillation_Tower.get(1), "highpowersmelt", false);
+        registerAchievement("factory", 8, 6, ItemList.Processing_Array.get(1), "oilplant", false);
+        registerAchievement("upgradeebf", 8, -2, ItemList.Hatch_Energy_MV.get(1), "gtaluminium", false);
+        registerAchievement("maintainance", 10, -2, ItemList.Hatch_Maintenance.get(1), "upgradeebf", false);
+
+        registerAchievement("upgrade", 10, 0, ItemList.Casing_Coil_Kanthal.get(1), "gtaluminium", false);
+        registerAchievement(
+            "titan",
+            14,
+            0,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 1L),
+            "upgrade",
+            false);
+        registerAchievement("magic", 14, 3, ItemList.MagicEnergyConverter_LV.get(1), "titan", false);
+        registerAchievement("highmage", 10, 3, ItemList.MagicEnergyAbsorber_HV.get(1), "magic", false);
+        registerAchievement("artificaldia", 12, 2, ItemList.IC2_Industrial_Diamond.get(1), "titan", false);
+        registerAchievement("muchsteam", 13, 1, ItemList.LargeSteamTurbine.get(1), "titan", false);
+        registerAchievement("efficientsteam", 11, 1, ItemList.LargeSteamTurbine.get(1), "muchsteam", false);
+
+        registerAchievement("upgrade2", 16, 0, ItemList.Casing_Coil_Nichrome.get(1), "titan", false);
+        registerAchievement(
+            "tungsten",
+            16,
+            2,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tungsten, 1L),
+            "upgrade2",
+            false);
+        registerAchievement(
+            "osmium",
+            16,
+            -2,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 1L),
+            "upgrade2",
+            false);
+        registerAchievement("hightech", 15, -3, ItemList.Field_Generator_LV.get(1), "osmium", false);
+        registerAchievement("amplifier", 16, -5, ItemList.Machine_LV_Amplifab.get(1), "hightech", false);
+        registerAchievement("scanning", 13, -3, ItemList.Machine_HV_Scanner.get(1), "hightech", false);
+        registerAchievement("alienpower", 14, -5, ItemList.Generator_Naquadah_Mark_I.get(1), "hightech", false);
+        registerAchievement("universal", 15, -6, ItemList.Machine_LV_Massfab.get(1), "hightech", false);
+        registerAchievement("replication", 17, -6, ItemList.Machine_LV_Replicator.get(1), "universal", false);
+
+        registerAchievement(
+            "tungstensteel",
+            16,
+            4,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L),
+            "tungsten",
+            false);
+        registerAchievement("upgrade3", 15, 5, ItemList.Casing_Coil_TungstenSteel.get(1), "tungstensteel", false);
+        registerAchievement(
+            "hssg",
+            13,
+            5,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 1L),
+            "upgrade3",
+            false);
+        registerAchievement("upgrade4", 11, 5, ItemList.Casing_Coil_HSSG.get(1), "hssg", false);
+        registerAchievement(
+            "stargatematerial",
+            11,
+            7,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1L),
+            "upgrade4",
+            false);
+        registerAchievement("conducting", 14, 6, ItemList.Casing_Coil_Superconductor.get(1), "upgrade3", false);
+        registerAchievement("fusion", 15, 7, ItemList.FusionComputer_LuV.get(1), "tungstensteel", false);
+        registerAchievement("higherefficency", 15, 9, ItemList.Generator_Plasma_EV.get(1), "fusion", false);
+        registerAchievement("advancing", 13, 7, ItemList.FusionComputer_ZPMV.get(1), "fusion", false);
+
+        registerAchievement("stargateliquid", 11, 9, ItemList.Generator_Plasma_IV.get(1), "advancing", false);
+        registerAchievement("tothelimit", 13, 9, ItemList.Generator_Plasma_IV.get(1), "advancing", false);
+        registerAchievement("fullefficiency", 12, 10, ItemList.Generator_Plasma_LuV.get(1), "tothelimit", false);
+        registerAchievement("upgrade5", 9, 9, ItemList.Casing_Coil_Naquadah.get(1), "stargateliquid", false);
+        registerAchievement(
+            "alienmetallurgy",
+            9,
+            7,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 1L),
+            "upgrade5",
+            false);
+        registerAchievement("over9000", 7, 7, ItemList.Casing_Coil_NaquadahAlloy.get(1), "alienmetallurgy", false);
+        registerAchievement(
+            "finalpreparations",
+            7,
+            9,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadria, 1L),
+            "over9000",
+            false);
+        registerAchievement("denseaspossible", 6, 10, ItemList.FusionComputer_UV.get(1), "finalpreparations", false);
+
+        registerAchievement("zpmage", 8, 10, ItemList.Energy_Module.get(1), "denseaspossible", false);
+        registerAchievement("uvage", 10, 10, ItemList.Energy_Cluster.get(1), "zpmage", false);
+        registerAchievement("whatnow", 12, 10, ItemList.ZPM2.get(1), "uvage", false);
+
+        if (GTMod.gregtechproxy.mAchievements) {
+            AchievementPage.registerAchievementPage(
+                new AchievementPage(
+                    "GregTech 5",
+                    this.achievementList.values()
+                        .toArray(new Achievement[0])));
+            MinecraftForge.EVENT_BUS.register(this);
+            FMLCommonHandler.instance()
+                .bus()
+                .register(this);
+        }
+    }
+
+    public static void registerOre(Materials aMaterial, int min, int max, int chance, boolean overworld, boolean nether,
+        boolean end) {}
+
+    public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, Achievement requirement,
+        boolean special) {
+        if (!GTMod.gregtechproxy.mAchievements) {
+            return null;
+        }
+        Achievement achievement = new Achievement(textId, textId, this.adjX + x, this.adjY + y, icon, requirement);
+        if (special) {
+            achievement.setSpecial();
+        }
+        ((StatBase) achievement).registerStat();
+        if (GTValues.D2) {
+            GTLog.out.println("achievement." + textId + "=");
+            GTLog.out.println("achievement." + textId + ".desc=");
+        }
+        this.achievementList.put(textId, achievement);
+        return achievement;
+    }
+
+    public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, String requirement,
+        boolean special) {
+        if (!GTMod.gregtechproxy.mAchievements) {
+            return null;
+        }
+        Achievement achievement = new Achievement(
+            textId,
+            textId,
+            this.adjX + x,
+            this.adjY + y,
+            icon,
+            getAchievement(requirement));
+        if (special) {
+            achievement.setSpecial();
+        }
+        ((StatBase) achievement).registerStat();
+        if (GTValues.D2) {
+            GTLog.out.println("achievement." + textId + "=");
+            GTLog.out.println("achievement." + textId + ".desc=");
+        }
+        this.achievementList.put(textId, achievement);
+        return achievement;
+    }
+
+    public Achievement registerOreAchievement(Materials aMaterial) {
+        return null;
+    }
+
+    public Achievement registerAssAchievement(GTRecipe recipe) {
+        if (recipe == null) {
+            GTMod.GT_FML_LOGGER.error("Invalid achievement registration attempt for null recipe", new Exception());
+            return null;
+        }
+        if (recipe.getOutput(0) == null) {
+            GTMod.GT_FML_LOGGER
+                .error("Invalid achievement registration attempt for recipe with null output", new Exception());
+            return null;
+        }
+        if (this.achievementList.get(
+            recipe.getOutput(0)
+                .getUnlocalizedName())
+            == null) {
+            assReg++;
+            return registerAchievement(
+                recipe.getOutput(0)
+                    .getUnlocalizedName(),
+                -(11 + assReg % 5),
+                ((assReg) / 5) - 8,
+                recipe.getOutput(0),
+                AchievementList.openInventory,
+                false);
+        }
+        return null;
+    }
+
+    public void issueAchievement(EntityPlayer entityplayer, String textId) {
+        if (entityplayer == null || !GTMod.gregtechproxy.mAchievements) {
+            return;
+        }
+        entityplayer.triggerAchievement(this.achievementList.get(textId));
+    }
+
+    public Achievement getAchievement(String textId) {
+        if (this.achievementList.containsKey(textId)) {
+            return this.achievementList.get(textId);
+        }
+        return null;
+    }
+
+    public void issueAchivementHatch(EntityPlayer player, ItemStack stack) {
+        if (player == null || stack == null) {
+            return;
+        }
+        ItemData data = GTOreDictUnificator.getItemData(stack);
+
+        if ((data != null) && (data.mPrefix == OrePrefixes.ingot)) {
+            if (data.mMaterial.mMaterial == Materials.Aluminium) {
+                issueAchievement(player, "gtaluminium");
+            } else if (data.mMaterial.mMaterial == Materials.Titanium) {
+                issueAchievement(player, "titan");
+            } else if (data.mMaterial.mMaterial == Materials.BlueSteel) {
+                issueAchievement(player, "complexalloys");
+            } else if (data.mMaterial.mMaterial == Materials.Tungsten) {
+                issueAchievement(player, "tungsten");
+            } else if (data.mMaterial.mMaterial == Materials.Osmium) {
+                issueAchievement(player, "osmium");
+            } else if (data.mMaterial.mMaterial == Materials.TungstenSteel) {
+                issueAchievement(player, "tungstensteel");
+            } else if (data.mMaterial.mMaterial == Materials.HSSG) {
+                issueAchievement(player, "hssg");
+            } else if (data.mMaterial.mMaterial == Materials.Naquadah) {
+                issueAchievement(player, "stargatematerial");
+            } else if (data.mMaterial.mMaterial == Materials.NaquadahAlloy) {
+                issueAchievement(player, "alienmetallurgy");
+            } else if (data.mMaterial.mMaterial == Materials.Naquadria) {
+                issueAchievement(player, "finalpreparations");
+            }
+        }
+        if (stack.getUnlocalizedName()
+            .equals("ic2.itemPartIndustrialDiamond")) {
+            issueAchievement(player, "artificaldia");
+            issueAchievement(player, "buildCoalDiamond");
+        }
+    }
+
+    public void issueAchivementHatchFluid(EntityPlayer player, FluidStack fluid) {
+        if (player == null || fluid == null) {
+            return;
+        }
+        switch (fluid.getFluid()
+            .getUnlocalizedName()) {
+            case "fluid.plasma.helium" -> issueAchievement(player, "fusion");
+            case "fluid.molten.europium" -> issueAchievement(player, "advancing");
+            case "fluid.molten.naquadah" -> issueAchievement(player, "stargateliquid");
+            case "fluid.molten.americium" -> issueAchievement(player, "tothelimit");
+            case "fluid.molten.neutronium" -> issueAchievement(player, "denseaspossible");
+            case "fluid.plasma.nitrogen" -> issueAchievement(player, "higherefficency");
+        }
+    }
+
+    @SubscribeEvent
+    public void onCrafting(ItemCraftedEvent event) {
+        EntityPlayer player = event.player;
+        ItemStack stack = event.crafting;
+        if (player == null || stack == null) {
+            return;
+        }
+        ItemData data = GTOreDictUnificator.getItemData(stack);
+        if (data != null) {
+            if (data.mPrefix == OrePrefixes.dust && data.mMaterial.mMaterial == Materials.Bronze) {
+                issueAchievement(player, "bronze");
+            }
+        }
+        switch (stack.getUnlocalizedName()) {
+            case "gt.metaitem.01.2300" -> issueAchievement(player, "bronze");
+            case "gt.metaitem.01.32700" -> issueAchievement(player, "smallparts");
+            case "gt.metaitem.01.32702" -> issueAchievement(player, "bettercircuits");
+            case "gt.metaitem.01.23354" -> issueAchievement(player, "magneticiron");
+            case "gt.metaitem.01.32600" -> {
+                issueAchievement(player, "lvmotor");
+                issueAchievement(player, "buildCable");
+            }
+            case "gt.metaitem.01.32610" -> issueAchievement(player, "pumpcover");
+            case "gt.metaitem.01.32630" -> issueAchievement(player, "transport");
+            case "gt.metaitem.01.32650" -> issueAchievement(player, "complexmachines");
+            case "gt.metaitem.01.32670" -> issueAchievement(player, "hightech");
+            case "ic2.blockCrop" -> issueAchievement(player, "crops");
+            case "ic2.itemPartCircuit" -> issueAchievement(player, "gtbasiccircuit");
+            case "ic2.itemPartCircuitAdv" -> issueAchievement(player, "stepforward");
+            case "gt.blockmachines.boiler.solar" -> issueAchievement(player, "simplyeco");
+            case "gt.blockmachines.boiler.bronze" -> issueAchievement(player, "firststeam");
+            case "gt.blockmachines.boiler.steel" -> issueAchievement(player, "highpressure");
+            case "gt.blockmachines.bronzemachine.macerator" -> {
+                issueAchievement(player, "macerator");
+                issueAchievement(player, "buildMacerator");
+            }
+            case "gt.blockmachines.bronzemachine.alloysmelter.tier.3" -> issueAchievement(player, "buildIndFurnace");
+            case "gt.blockmachines.bronzemachine.alloysmelter" -> {
+                issueAchievement(player, "alloysmelter");
+                issueAchievement(player, "buildElecFurnace");
+            }
+
+            case "gt.blockmachines.bronzemachine.extractor" -> {
+                issueAchievement(player, "extract");
+                issueAchievement(player, "buildCompressor");
+                issueAchievement(player, "buildExtractor");
+            }
+            case "gt.blockmachines.basicmachine.pump.tier.03" -> issueAchievement(player, "slurp");
+            case "gt.blockmachines.multimachine.blastfurnace" -> issueAchievement(player, "ebf");
+            case "gt.blockmachines.hatch.energy.tier.02" -> issueAchievement(player, "upgradeebf");
+            case "gt.blockmachines.multimachine.multifurnace" -> issueAchievement(player, "highpowersmelt");
+            case "gt.blockmachines.hatch.energy.tier.01" -> issueAchievement(player, "energyhatch");
+            case "gt.blockmachines.multimachine.processingarray" -> issueAchievement(player, "factory");
+            case "gt.blockmachines.basicgenerator.magicenergyconverter.tier.01" -> issueAchievement(player, "magic");
+            case "gt.blockmachines.basicgenerator.magicenergyabsorber.tier.03" -> issueAchievement(player, "highmage");
+            case "gt.blockmachines.basicgenerator.plasmagenerator.tier.07" -> issueAchievement(
+                player,
+                "fullefficiency");
+            case "gt.blockmachines.multimachine.largeturbine" -> issueAchievement(player, "muchsteam");
+            case "gt.blockmachines.multimachine.largehpturbine" -> issueAchievement(player, "efficientsteam");
+            case "gt.blockmachines.multimachine.cleanroom" -> issueAchievement(player, "gtcleanroom");
+            case "gt.neutronreflector" -> issueAchievement(player, "reflect");
+            case "gt.blockcasings5.1" -> issueAchievement(player, "upgrade");
+            case "gt.blockcasings5.2" -> issueAchievement(player, "upgrade2");
+            case "gt.blockcasings5.3" -> issueAchievement(player, "upgrade3");
+            case "gt.blockcasings5.4" -> issueAchievement(player, "upgrade4");
+            case "gt.blockcasings5.5" -> issueAchievement(player, "upgrade5");
+            case "gt.blockcasings5.6" -> issueAchievement(player, "over9000");
+            case "gt.blockcasings.15" -> issueAchievement(player, "conducting");
+        }
+
+        if (!stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.")) {
+            return;
+        }
+
+        // from here, it only concerns "gt.blockmachines." kind of achievements
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicmachine.arcfurnace.tier.")) {
+            issueAchievement(player, "recycling");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicmachine.disassembler.tier.")) {
+            issueAchievement(player, "repair");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.automation.superbuffer.tier.")) {
+            issueAchievement(player, "superbuffer");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.quantum.tank.tier.")) {
+            issueAchievement(player, "whereistheocean");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.quantum.chest.tier.")) {
+            issueAchievement(player, "newstorage");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicmachine.hammer.tier.")) {
+            issueAchievement(player, "cheapermac");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.automation.chestbuffer.tier.")) {
+            issueAchievement(player, "buffer");
+            issueAchievement(player, "buildBatBox");
+            if (stack.getUnlocalizedName()
+                .startsWith("gt.blockmachines.automation.chestbuffer.tier.3")) {
+                issueAchievement(player, "buildMFE");
+            }
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicgenerator.steamturbine.tier.")) {
+            issueAchievement(player, "steampower");
+            issueAchievement(player, "buildGenerator");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicmachine.assembler.tier.")) {
+            issueAchievement(player, "avengers");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.batterybuffer.")) {
+            issueAchievement(player, "batterys");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicmachine.amplifab.tier.")) {
+            issueAchievement(player, "amplifier");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicmachine.massfab.tier.")) {
+            issueAchievement(player, "universal");
+            issueAchievement(player, "buildMassFab");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicgenerator.naquadah.tier.")) {
+            issueAchievement(player, "alienpower");
+            return;
+        }
+        if (stack.getUnlocalizedName()
+            .startsWith("gt.blockmachines.basicmachine.replicator.tier.")) {
+            issueAchievement(player, "replication");
+            return;
+        }
+
+    }
+
+    @SubscribeEvent
+    public void onSmelting(ItemSmeltedEvent event) {
+        EntityPlayer player = event.player;
+        ItemStack stack = event.smelting;
+        if (player == null || stack == null) {
+            return;
+        }
+        if (stack.getItem() == Items.bread) {
+            event.player.triggerAchievement(AchievementList.makeBread);
+        }
+    }
+
+    @SubscribeEvent
+    public void onItemPickup(EntityItemPickupEvent event) {
+        EntityPlayer player = event.entityPlayer;
+        ItemStack stack = event.item.getEntityItem();
+        if (player == null || stack == null) {
+            return;
+        }
+        ItemData data = GTOreDictUnificator.getItemData(stack);
+        if (data != null && data.mPrefix != null) {
+            if (data.mPrefix == OrePrefixes.dust) {
+                if (data.mMaterial.mMaterial == Materials.Lutetium) {
+                    issueAchievement(player, "newmetal");
+                }
+                if (data.mMaterial.mMaterial != Materials.Gunpowder) {
+                    issueAchievement(player, "cleandust");
+                }
+            } else if (data.mPrefix.name()
+                .startsWith("ore")) {
+                    int data_getAllMaterialStacks_sS = data.getAllMaterialStacks()
+                        .size();
+                    for (int i = 0; i < data_getAllMaterialStacks_sS; i++) {
+                        issueAchievement(
+                            player,
+                            data.getAllMaterialStacks()
+                                .get(i).mMaterial.mName);
+                        if (data.getAllMaterialStacks()
+                            .get(i).mMaterial == Materials.AnyIron) {
+                            issueAchievement(player, "iron");
+                        }
+                        if (data.getAllMaterialStacks()
+                            .get(i).mMaterial == Materials.Copper
+                            || data.getAllMaterialStacks()
+                                .get(i).mMaterial == Materials.Tin) {
+                            issueAchievement(event.entityPlayer, "mineOre");
+                        }
+                    }
+                } else if (data.mPrefix == OrePrefixes.crushed) {
+                    issueAchievement(player, "crushed");
+                } else if (data.mPrefix == OrePrefixes.crushedPurified) {
+                    issueAchievement(player, "washing");
+                } else if (data.mPrefix == OrePrefixes.crushedCentrifuged) {
+                    issueAchievement(player, "spinit");
+                } else if (data.mMaterial.mMaterial == Materials.Steel) {
+                    if (data.mPrefix == OrePrefixes.ingot && stack.stackSize == stack.getMaxStackSize()) {
+                        issueAchievement(player, "steel");
+                    } else if (data.mPrefix == OrePrefixes.nugget && Thaumcraft.isModLoaded()
+                        && ThaumcraftApiHelper.isResearchComplete(player.getDisplayName(), "GT_IRON_TO_STEEL")) {
+                            issueAchievement(player, "steel");
+                        }
+                }
+        }
+        // GT_FML_LOGGER.info(stack.getUnlocalizedName());
+        switch (stack.getUnlocalizedName()) {
+            case "gt.metaitem.02.32500" -> issueAchievement(player, "havestlead");
+            case "gt.metaitem.02.32501" -> issueAchievement(player, "havestsilver");
+            case "gt.metaitem.02.32503" -> issueAchievement(player, "havestiron");
+            case "gt.metaitem.02.32504" -> issueAchievement(player, "havestgold");
+            case "gt.metaitem.02.32530" -> issueAchievement(player, "havestcopper");
+            case "gt.metaitem.02.32540" -> issueAchievement(player, "havesttin");
+            case "gt.metaitem.02.32510" -> issueAchievement(player, "havestoil");
+            case "gt.metaitem.02.32511" -> issueAchievement(player, "havestemeralds");
+            case "gt.metaitem.03.32082" -> issueAchievement(player, "energyflow");
+            case "gt.metaitem.01.32702" -> issueAchievement(player, "bettercircuits");
+            case "gt.metaitem.01.32707" -> issueAchievement(player, "datasaving");
+            case "gt.metaitem.01.32597" -> issueAchievement(player, "orbs");
+            case "gt.metaitem.01.32599" -> issueAchievement(player, "thatspower");
+            case "gt.metaitem.01.32598" -> issueAchievement(player, "luck");
+            case "gt.metaitem.01.32749" -> issueAchievement(player, "closeit");
+            case "gt.metaitem.01.32730" -> issueAchievement(player, "manipulation");
+            case "gt.metaitem.01.32729" -> issueAchievement(player, "filterregulate");
+            case "gt.metaitem.01.32605" -> issueAchievement(player, "whatnow");
+            case "gt.metaitem.01.32736" -> issueAchievement(player, "zpmage");
+            case "gt.metaitem.01.32737" -> issueAchievement(player, "uvage");
+            case "gt.metaitem.03.32030" -> issueAchievement(player, "gtmonosilicon");
+            case "gt.metaitem.03.32036" -> issueAchievement(player, "gtlogicwafer");
+            case "gt.metaitem.01.32701" -> issueAchievement(player, "gtlogiccircuit");
+            case "gt.metaitem.03.32085" -> issueAchievement(player, "gtquantumprocessor");
+            case "gt.metaitem.03.32089" -> issueAchievement(player, "gtcrystalprocessor");
+            case "gt.metaitem.03.32092" -> issueAchievement(player, "gtwetware");
+            case "gt.metaitem.03.32095" -> issueAchievement(player, "gtwetmain");
+            case "gt.Thoriumcell" -> issueAchievement(player, "newfuel");
+            case "ic2.itemPartCircuitAdv" -> issueAchievement(player, "stepforward");
+            case "gt.blockcasings5.1" -> issueAchievement(player, "upgrade");
+            case "gt.blockcasings5.2" -> issueAchievement(player, "upgrade2");
+            case "gt.blockcasings5.3" -> issueAchievement(player, "upgrade3");
+            case "gt.blockcasings5.4" -> issueAchievement(player, "upgrade4");
+            case "gt.blockcasings5.5" -> issueAchievement(player, "upgrade5");
+            case "gt.blockcasings5.6" -> issueAchievement(player, "over9000");
+            case "gt.blockcasings.15" -> issueAchievement(player, "conducting");
+            case "gt.metaitem.01.32761" -> { // Debug Scanner pickup shows all assline recipes.
+                if (player.capabilities.isCreativeMode) {
+                    for (GTRecipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
+                        issueAchievement(
+                            player,
+                            recipe.getOutput(0)
+                                .getUnlocalizedName());
+                        recipe.mHidden = false;
+                    }
+                }
+            }
+        }
+
+        if ((stack.getItem() == Ic2Items.quantumBodyarmor.getItem())
+            || (stack.getItem() == Ic2Items.quantumBoots.getItem())
+            || (stack.getItem() == Ic2Items.quantumHelmet.getItem())
+            || (stack.getItem() == Ic2Items.quantumLeggings.getItem())) {
+            issueAchievement(player, "buildQArmor");
+        }
+
+        for (GTRecipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
+            if (recipe.getOutput(0)
+                .getUnlocalizedName()
+                .equals(stack.getUnlocalizedName())) {
+                issueAchievement(
+                    player,
+                    recipe.getOutput(0)
+                        .getUnlocalizedName());
+                recipe.mHidden = false;
+            }
+        }
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GTBeeDefinition.java b/src/main/java/gregtech/loaders/misc/GTBeeDefinition.java
new file mode 100644
index 0000000000..c8fcf5839e
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GTBeeDefinition.java
@@ -0,0 +1,2818 @@
+package gregtech.loaders.misc;
+
+import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
+import static forestry.api.apiculture.EnumBeeChromosome.SPECIES;
+import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
+import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
+import static forestry.api.core.EnumHumidity.ARID;
+import static forestry.api.core.EnumHumidity.DAMP;
+import static forestry.api.core.EnumTemperature.COLD;
+import static forestry.api.core.EnumTemperature.HELLISH;
+import static forestry.api.core.EnumTemperature.HOT;
+import static forestry.api.core.EnumTemperature.ICY;
+import static forestry.api.core.EnumTemperature.NORMAL;
+import static forestry.api.core.EnumTemperature.WARM;
+import static forestry.core.genetics.alleles.EnumAllele.Fertility;
+import static forestry.core.genetics.alleles.EnumAllele.Flowering;
+import static forestry.core.genetics.alleles.EnumAllele.Flowers;
+import static forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import static forestry.core.genetics.alleles.EnumAllele.Speed;
+import static forestry.core.genetics.alleles.EnumAllele.Territory;
+import static forestry.core.genetics.alleles.EnumAllele.Tolerance;
+import static gregtech.api.enums.Mods.AdvancedSolarPanel;
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.Avaritia;
+import static gregtech.api.enums.Mods.AvaritiaAddons;
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+import static gregtech.api.enums.Mods.CropsPlusPlus;
+import static gregtech.api.enums.Mods.EnderStorage;
+import static gregtech.api.enums.Mods.ExtraBees;
+import static gregtech.api.enums.Mods.ExtraCells2;
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.MagicBees;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+import static gregtech.api.enums.Mods.TaintedMagic;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.ThaumicBases;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.loaders.misc.GTBeeDefinitionReference.EXTRABEES;
+import static gregtech.loaders.misc.GTBeeDefinitionReference.FORESTRY;
+import static gregtech.loaders.misc.GTBeeDefinitionReference.GENDUSTRY;
+import static gregtech.loaders.misc.GTBeeDefinitionReference.GREGTECH;
+import static gregtech.loaders.misc.GTBeeDefinitionReference.MAGICBEES;
+
+import java.awt.Color;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.function.Consumer;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.text.WordUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeType;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeMutationCustom;
+import forestry.api.core.EnumHumidity;
+import forestry.api.core.EnumTemperature;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleFlowers;
+import forestry.api.genetics.IMutationCustom;
+import forestry.apiculture.genetics.Bee;
+import forestry.apiculture.genetics.IBeeDefinition;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GTLanguageManager;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.JubilanceMegaApiary;
+import gregtech.common.bees.GTAlleleBeeSpecies;
+import gregtech.common.bees.GTBeeMutation;
+import gregtech.common.items.CombType;
+import gregtech.common.items.DropType;
+import gregtech.common.items.PropolisType;
+import gregtech.loaders.misc.bees.GTFlowers;
+import gtnhlanth.common.register.WerkstoffMaterialPool;
+
+/**
+ * Bride Class for Lambdas
+ */
+class GTBeeDefinitionReference {
+
+    protected static final byte FORESTRY = 0;
+    protected static final byte EXTRABEES = 1;
+    protected static final byte GENDUSTRY = 2;
+    protected static final byte MAGICBEES = 3;
+    protected static final byte GREGTECH = 4;
+
+    private GTBeeDefinitionReference() {}
+}
+
+public enum GTBeeDefinition implements IBeeDefinition {
+
+    // organic
+    CLAY(GTBranchDefinition.ORGANIC, "Clay", true, new Color(0xC8C8DA), new Color(0x0000FF), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
+        beeSpecies.addProduct(new ItemStack(Items.clay_ball, 1), 0.15f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(BiomesOPlenty.ID, "mudball", 1, 0), 0.05f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.VANILLA);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Diligent"), 10);
+        tMutation.requireResource(Blocks.clay, 0); // blockStainedHardenedClay
+    }),
+    SLIMEBALL(GTBranchDefinition.ORGANIC, "SlimeBall", true, new Color(0x4E9E55), new Color(0x00FF15), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 15), 0.30f);
+        beeSpecies.addProduct(new ItemStack(Items.slime_ball, 1), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.STICKY), 0.05f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        if (TinkerConstruct.isModLoaded()) {
+            beeSpecies.addProduct(GTModHandler.getModItem(TinkerConstruct.ID, "strangeFood", 1, 0), 0.10f);
+            beeSpecies.addSpecialty(GTModHandler.getModItem(TinkerConstruct.ID, "slime.gel", 1, 2), 0.02f);
+        }
+    }, template -> {
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.MUSHROOMS);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "water"));
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Marshy"), CLAY, 7);
+        if (TinkerConstruct.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(TinkerConstruct.ID, "slime.gel"), 1);
+    }),
+    PEAT(GTBranchDefinition.ORGANIC, "Peat", true, new Color(0x906237), new Color(0x58300B), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.LIGNIE), 0.30f);
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.15f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(Forestry.ID, "peat", 1, 0), 0.15f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(Forestry.ID, "mulch", 1, 0), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+    }, dis -> dis.registerMutation(getSpecies(FORESTRY, "Rural"), CLAY, 10)),
+    STICKYRESIN(GTBranchDefinition.ORGANIC, "StickyResin", true, new Color(0x2E8F5B), new Color(0xDCC289),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.STICKY), 0.15f);
+            beeSpecies.addSpecialty(ItemList.IC2_Resin.get(1), 0.15f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        }, template -> {
+            AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(SLIMEBALL, PEAT, 15);
+            tMutation.requireResource("logRubber");
+        }),
+    COAL(GTBranchDefinition.ORGANIC, "Coal", true, new Color(0x666666), new Color(0x525252), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.LIGNIE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.COAL), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.CACTI);
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectCreeper);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Industrious"), PEAT, 9);
+        tMutation.requireResource("blockCoal");
+    }),
+    OIL(GTBranchDefinition.ORGANIC, "Oil", true, new Color(0x4C4C4C), new Color(0x333333), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.OIL), 0.75f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL);
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "water"));
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+    }, dis -> dis.registerMutation(COAL, STICKYRESIN, 4)),
+    SANDWICH(GTBranchDefinition.ORGANIC, "Sandwich", true, new Color(0x32CD32), new Color(0xDAA520), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+        beeSpecies.addSpecialty(ItemList.Food_Sliced_Cucumber.get(1), 0.05f);
+        beeSpecies.addSpecialty(ItemList.Food_Sliced_Onion.get(1), 0.05f);
+        beeSpecies.addSpecialty(ItemList.Food_Sliced_Tomato.get(1), 0.05f);
+        beeSpecies.addSpecialty(ItemList.Food_Sliced_Cheese.get(1), 0.05f);
+        beeSpecies.addSpecialty(new ItemStack(Items.cooked_porkchop, 1, 0), 0.05f);
+        beeSpecies.addSpecialty(new ItemStack(Items.cooked_beef, 1, 0), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectFertile);
+        AlleleHelper.instance.set(template, TERRITORY, Territory.LARGE);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+    }, dis -> dis.registerMutation(getSpecies(FORESTRY, "Agrarian"), getSpecies(MAGICBEES, "TCBatty"), 10)),
+    ASH(GTBranchDefinition.ORGANIC, "Ash", true, new Color(0x1e1a18), new Color(0xc6c6c6), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ASH), 0.15f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.NORMAL);
+        AlleleHelper.instance.set(template, TERRITORY, Territory.LARGE);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(COAL, CLAY, 10);
+        tMutation.restrictTemperature(HELLISH);
+    }),
+    APATITE(GTBranchDefinition.ORGANIC, "Apatite", true, new Color(0xc1c1f6), new Color(0x676784), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.APATITE), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(WARM);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ASH, COAL, 10);
+        tMutation.requireResource("blockApatite");
+    }),
+    FERTILIZER(GTBranchDefinition.ORGANIC, "Fertilizer", true, new Color(0x7fcef5), new Color(0x654525), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+        beeSpecies.addSpecialty(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1), 0.2f);
+        beeSpecies.addSpecialty(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1), 0.2f);
+        beeSpecies.addSpecialty(ItemList.FR_Fertilizer.get(1), 0.3f);
+        beeSpecies.addSpecialty(ItemList.IC2_Fertilizer.get(1), 0.3f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(WARM);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+    }, dis -> dis.registerMutation(ASH, APATITE, 8)),
+    // Phosphorus bee, Humidity: normal, Temperature: Hot, Parents: Apatite & Ash, Mutationrate: 12%, Combrate: 55%
+    PHOSPHORUS(GTBranchDefinition.ORGANIC, "Phosphorus", false, new Color(0xFFC826), new Color(0xC1C1F6),
+        beeSpecies -> {
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.PHOSPHORUS), 0.35f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(HOT);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(APATITE, ASH, 12);
+            tMutation.restrictTemperature(HOT);
+            GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockGem2, 8));
+        }),
+    // Tea bee, Humidity: normal, Parents: Ash and Fertilizer, Mutationrate: 10%, combrate: 10%
+    TEA(GTBranchDefinition.ORGANIC, "Tea", false, new Color(0x65D13A), new Color(0x9a9679), beeSpecies -> {
+        beeSpecies.addProduct(
+            GTModHandler.getModItem(PamsHarvestCraft.ID, "tealeafItem", 1, ItemList.Crop_Drop_TeaLeaf.get(1)),
+            0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST),
+        dis -> dis.registerMutation(FERTILIZER, ASH, 10)),
+    // Mica bee, Humidity: normal, Parents: Silicon & PEAT, Mutationrate: 15%, Combrate: 25%
+    MICA(GTBranchDefinition.ORGANIC, "Mica", false, new Color(0xFFC826), new Color(0xC1C1F6), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MICA), 0.25f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(PEAT, getSpecies(MAGICBEES, "Silicon"), 15);
+        GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockCasings5, 0));
+    }),
+
+    // gems
+    REDSTONE(GTBranchDefinition.GEM, "Redstone", true, new Color(0x7D0F0F), new Color(0xD11919), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.REDSTONE), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.RAREEARTH), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Demonic"), 10);
+        tMutation.requireResource("blockRedstone");
+    }),
+    LAPIS(GTBranchDefinition.GEM, "Lapis", true, new Color(0x1947D1), new Color(0x476CDA), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.LAPIS), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(FORESTRY, "Demonic"), getSpecies(FORESTRY, "Imperial"), 10);
+        tMutation.requireResource("blockLapis");
+    }),
+    CERTUS(GTBranchDefinition.GEM, "CertusQuartz", true, new Color(0x57CFFB), new Color(0xBBEEFF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.CERTUS), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Hermitic"), LAPIS, 10);
+        tMutation.requireResource(GameRegistry.findBlock(AppliedEnergistics2.ID, "tile.BlockQuartz"), 0);
+    }),
+    FLUIX(GTBranchDefinition.GEM, "FluixDust", true, new Color(0xA375FF), new Color(0xB591FF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.FLUIX), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, LAPIS, 7);
+        tMutation.requireResource(GameRegistry.findBlock(AppliedEnergistics2.ID, "tile.BlockFluix"), 0);
+    }),
+    DIAMOND(GTBranchDefinition.GEM, "Diamond", false, new Color(0xCCFFFF), new Color(0xA3CCCC), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.DIAMOND), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(CERTUS, COAL, 3);
+        tMutation.requireResource("blockDiamond");
+    }),
+    RUBY(GTBranchDefinition.GEM, "Ruby", false, new Color(0xE6005C), new Color(0xCC0052), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.RUBY), 0.15f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.REDGARNET), 0.05f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, DIAMOND, 5);
+        tMutation.requireResource("blockRuby");
+    }),
+    SAPPHIRE(GTBranchDefinition.GEM, "Sapphire", true, new Color(0x0033CC), new Color(0x00248F), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SAPPHIRE), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(CERTUS, LAPIS, 5);
+        tMutation.requireResource(GregTechAPI.sBlockGem2, 12);
+    }),
+    OLIVINE(GTBranchDefinition.GEM, "Olivine", true, new Color(0x248F24), new Color(0xCCFFCC), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.OLIVINE), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.MAGNESIUM), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER),
+        dis -> dis.registerMutation(CERTUS, getSpecies(FORESTRY, "Ended"), 5)),
+    EMERALD(GTBranchDefinition.GEM, "Emerald", false, new Color(0x248F24), new Color(0x2EB82E), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.EMERALD), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ALUMINIUM), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(OLIVINE, DIAMOND, 4);
+        tMutation.requireResource("blockEmerald");
+    }),
+    REDGARNET(GTBranchDefinition.GEM, "RedGarnet", false, new Color(0xBD4C4C), new Color(0xECCECE), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.REDGARNET), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.PYROPE), 0.05f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(WARM);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, RUBY, 4);
+        tMutation.requireResource("blockGarnetRed");
+    }),
+    YELLOWGARNET(GTBranchDefinition.GEM, "YellowGarnet", false, new Color(0xA3A341), new Color(0xEDEDCE),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.YELLOWGARNET), 0.15f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.GROSSULAR), 0.05f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(WARM);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(EMERALD, REDGARNET, 3);
+            tMutation.requireResource("blockGarnetYellow");
+        }),
+    FIRESTONE(GTBranchDefinition.GEM, "Firestone", false, new Color(0xC00000), new Color(0xFF0000), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STONE), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.FIRESTONE), 0.15f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(WARM);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, RUBY, 4);
+        tMutation.requireResource("blockFirestone");
+    }),
+
+    // Metal Line
+    COPPER(GTBranchDefinition.METAL, "Copper", true, new Color(0xFF6600), new Color(0xE65C00), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.COPPER), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.GOLD), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Majestic"), CLAY, 13);
+        tMutation.requireResource("blockCopper");
+    }),
+    TIN(GTBranchDefinition.METAL, "Tin", true, new Color(0xD4D4D4), new Color(0xDDDDDD), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.TIN), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ZINC), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(CLAY, getSpecies(FORESTRY, "Diligent"), 13);
+        tMutation.requireResource("blockTin");
+    }),
+    LEAD(GTBranchDefinition.METAL, "Lead", true, new Color(0x666699), new Color(0xA3A3CC), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.LEAD), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SULFUR), 0.05f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(WARM);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(COAL, COPPER, 13);
+        tMutation.requireResource("blockLead");
+    }),
+    IRON(GTBranchDefinition.METAL, "Iron", true, new Color(0xDA9147), new Color(0xDE9C59), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.IRON), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.TIN), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(TIN, COPPER, 13);
+        tMutation.requireResource("blockIron");
+    }),
+    STEEL(GTBranchDefinition.METAL, "Steel", true, new Color(0x808080), new Color(0x999999), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STEEL), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.IRON), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(WARM);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(IRON, COAL, 10);
+        tMutation.requireResource(GregTechAPI.sBlockMetal6, 13);
+    }),
+    NICKEL(GTBranchDefinition.METAL, "Nickel", true, new Color(0x8585AD), new Color(0x8585AD), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NICKEL), 0.15f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.PLATINUM), 0.02f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(IRON, COPPER, 13);
+        tMutation.requireResource("blockNickel");
+    }),
+    ZINC(GTBranchDefinition.METAL, "Zinc", true, new Color(0xF0DEF0), new Color(0xF2E1F2), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.ZINC), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.GALLIUM), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(IRON, TIN, 13);
+        tMutation.requireResource("blockZinc");
+    }),
+    SILVER(GTBranchDefinition.METAL, "Silver", true, new Color(0xC2C2D6), new Color(0xCECEDE), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SILVER), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SULFUR), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, TIN, 10);
+        tMutation.requireResource("blockSilver");
+    }),
+    CRYOLITE(GTBranchDefinition.METAL, "Cryolite", true, new Color(0xBFEFFF), new Color(0x73B9D0), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.CRYOLITE), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SILVER), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(WARM);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.FASTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, SILVER, 9);
+        tMutation.requireResource("blockCryolite");
+    }),
+    GOLD(GTBranchDefinition.METAL, "Gold", true, new Color(0xEBC633), new Color(0xEDCC47), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.GOLD), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NICKEL), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(WARM);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, COPPER, 13);
+        tMutation.requireResource("blockGold");
+        tMutation.restrictTemperature(HOT);
+    }),
+    ARSENIC(GTBranchDefinition.METAL, "Arsenic", true, new Color(0x736C52), new Color(0x292412), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.ARSENIC), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(WARM);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ZINC, SILVER, 10);
+        tMutation.requireResource("blockArsenic");
+    }),
+
+    // Rare Metals
+    ALUMINIUM(GTBranchDefinition.RAREMETAL, "Aluminium", true, new Color(0xB8B8FF), new Color(0xD6D6FF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.ALUMINIUM), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.BAUXITE), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NICKEL, ZINC, 9);
+        tMutation.requireResource("blockAluminium");
+    }),
+    TITANIUM(GTBranchDefinition.RAREMETAL, "Titanium", true, new Color(0xCC99FF), new Color(0xDBB8FF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.TITANIUM), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ALMANDINE), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, ALUMINIUM, 5);
+        tMutation.requireResource(GregTechAPI.sBlockMetal7, 9);
+    }),
+    GLOWSTONE(GTBranchDefinition.RAREMETAL, "Glowstone", false, new Color(0xE5CA2A), new Color(0xFFBC5E),
+        beeSpecies -> {
+            beeSpecies.addSpecialty(Materials.Glowstone.getDust(1), 0.20f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL),
+        dis -> dis.registerMutation(REDSTONE, GOLD, 10)),
+    SUNNARIUM(GTBranchDefinition.RAREMETAL, "Sunnarium", false, new Color(0xFFBC5E), new Color(0xE5CA2A),
+        beeSpecies -> {
+            beeSpecies.addProduct(Materials.Glowstone.getDust(1), 0.30f);
+            beeSpecies.addSpecialty(Materials.Sunnarium.getDust(1), 0.05f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST), dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(GLOWSTONE, GOLD, 5);
+            GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockCasings1, 15));
+        }),
+    CHROME(GTBranchDefinition.RAREMETAL, "Chrome", true, new Color(0xEBA1EB), new Color(0xF2C3F2), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.CHROME), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.MAGNESIUM), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(TITANIUM, RUBY, 5);
+        tMutation.requireResource(GregTechAPI.sBlockMetal2, 3);
+    }),
+    MANGANESE(GTBranchDefinition.RAREMETAL, "Manganese", true, new Color(0xD5D5D5), new Color(0xAAAAAA), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MANGANESE), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.IRON), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(TITANIUM, ALUMINIUM, 5);
+        tMutation.requireResource(GregTechAPI.sBlockMetal4, 6);
+    }),
+    TUNGSTEN(GTBranchDefinition.RAREMETAL, "Tungsten", false, new Color(0x5C5C8A), new Color(0x7D7DA1), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.TUNGSTEN), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.MOLYBDENUM), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Heroic"), MANGANESE, 5);
+        tMutation.requireResource(GregTechAPI.sBlockMetal7, 11);
+    }),
+    PLATINUM(GTBranchDefinition.RAREMETAL, "Platinum", false, new Color(0xE6E6E6), new Color(0xFFFFCC), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.PLATINUM), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.IRIDIUM), 0.02f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, CHROME, 5);
+        tMutation.requireResource("blockNickel");
+    }),
+    IRIDIUM(GTBranchDefinition.RAREMETAL, "Iridium", false, new Color(0xDADADA), new Color(0xD1D1E0), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.IRIDIUM), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.OSMIUM), 0.05f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.PALLADIUM), 0.30f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(TUNGSTEN, PLATINUM, 5);
+        tMutation.requireResource(GregTechAPI.sBlockMetal3, 12);
+    }),
+    OSMIUM(GTBranchDefinition.RAREMETAL, "Osmium", false, new Color(0x2B2BDA), new Color(0x8B8B8B), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.OSMIUM), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.IRIDIUM), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(TUNGSTEN, PLATINUM, 5);
+        tMutation.requireResource(GregTechAPI.sBlockMetal5, 9);
+    }),
+    SALTY(GTBranchDefinition.RAREMETAL, "Salt", true, new Color(0xF0C8C8), new Color(0xFAFAFA), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SALT), 0.35f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.LITHIUM), 0.05f);
+        beeSpecies.addSpecialty(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Borax, 1L), 0.1f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(WARM);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(CLAY, ALUMINIUM, 5);
+        tMutation.requireResource("blockSalt");
+    }),
+    LITHIUM(GTBranchDefinition.RAREMETAL, "Lithium", false, new Color(0xF0328C), new Color(0xE1DCFF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.LITHIUM), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SALT), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(SALTY, ALUMINIUM, 5);
+        tMutation.requireResource("frameGtLithium");
+    }),
+    ELECTROTINE(GTBranchDefinition.RAREMETAL, "Electrotine", false, new Color(0x1E90FF), new Color(0x3CB4C8),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ELECTROTINE), 0.15f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.REDSTONE), 0.05f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(HOT);
+        }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, GOLD, 5);
+            tMutation.requireResource("blockElectrotine");
+        }),
+    // Sulfur bee, Humidity: normal, Temperature: Hot, Parents: PEAT & Ash, Mutationrate: 15%, Combrate: 80%
+    SULFUR(GTBranchDefinition.RAREMETAL, "Sulfur", false, new Color(0x1E90FF), new Color(0x3CB4C8), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SULFUR), 0.70f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.FIRESTONE), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.NORMAL),
+        dis -> dis.registerMutation(ASH, PEAT, 15)),
+
+    INDIUM(GTBranchDefinition.RAREMETAL, "Indium", false, new Color(0xFFA9FF), new Color(0x8F5D99), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.INDIUM), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, OSMIUM, 1);
+        tMutation.requireResource("blockIndium");
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(39, "Venus")); // Venus Dim
+        // Harder mutation that isn't dim locked
+        tMutation = dis.registerMutation(SILVER, OSMIUM, 1);
+        tMutation.requireResource("blockCinobiteA243");
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(60, "Bedrock")); // Thaumic Tinkerer
+                                                                                              // Bedrock Dim
+    }),
+
+    // IC2
+    COOLANT(GTBranchDefinition.IC2, "Coolant", false, new Color(0x144F5A), new Color(0x2494A2), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 4), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.COOLANT), 0.15f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectGlacial);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(FORESTRY, "Icy"), getSpecies(FORESTRY, "Glacial"), 10);
+        tMutation.requireResource(
+            Block.getBlockFromItem(
+                GTModHandler.getModItem(IndustrialCraft2.ID, "fluidCoolant", 1)
+                    .getItem()),
+            0);
+        tMutation.restrictTemperature(ICY);
+    }),
+    ENERGY(GTBranchDefinition.IC2, "Energy", false, new Color(0xC11F1F), new Color(0xEBB9B9), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 12), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ENERGY), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(WARM);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(FORESTRY, "Demonic"), getSpecies(EXTRABEES, "volcanic"), 10);
+        tMutation.requireResource(
+            Block.getBlockFromItem(
+                GTModHandler.getModItem(IndustrialCraft2.ID, "fluidHotCoolant", 1)
+                    .getItem()),
+            0);
+        tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(128, "Boneyard Biome")); // Boneyard Biome
+    }),
+    LAPOTRON(GTBranchDefinition.IC2, "Lapotron", false, new Color(0x6478FF), new Color(0x1414FF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.LAPIS), 0.20f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ENERGY), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.LAPOTRON), 0.10f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(LAPIS, ENERGY, 6);
+        tMutation.requireResource("blockLapis");
+        tMutation.restrictTemperature(ICY);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(28, "Moon")); // moon dim
+    }),
+    PYROTHEUM(GTBranchDefinition.IC2, "Pyrotheum", false, new Color(0xffebc4), new Color(0xe36400), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.ENERGY), 0.20f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.PYROTHEUM), 0.15f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, ENERGY, 4);
+        tMutation.restrictTemperature(HELLISH);
+    }),
+    CRYOTHEUM(GTBranchDefinition.IC2, "Cryotheum", false, new Color(0x2660ff), new Color(0x5af7ff), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.BLIZZ), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.CRYOTHEUM), 0.20f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, COOLANT, 4);
+        tMutation.restrictTemperature(ICY);
+    }),
+    Explosive(GTBranchDefinition.IC2, "explosive", false, new Color(0x7E270F), new Color(0x747474), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getIC2Item("industrialTnt", 1L), 0.2f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(FIRESTONE, COAL, 4);
+        tMutation.requireResource(GameRegistry.findBlock(IndustrialCraft2.ID, "blockITNT"), 0);
+    }),
+    // Alloy
+    REDALLOY(GTBranchDefinition.GTALLOY, "RedAlloy", false, new Color(0xE60000), new Color(0xB80000), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.REDALLOY), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(COPPER, REDSTONE, 10);
+        tMutation.requireResource("blockRedAlloy");
+    }),
+    REDSTONEALLOY(GTBranchDefinition.GTALLOY, "RedStoneAlloy", false, new Color(0xA50808), new Color(0xE80000),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.REDSTONEALLOY), 0.15f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, REDALLOY, 8);
+            tMutation.requireResource("blockRedstoneAlloy");
+        }),
+    CONDUCTIVEIRON(GTBranchDefinition.GTALLOY, "ConductiveIron", false, new Color(0xCEADA3), new Color(0x817671),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.CONDUCTIVEIRON), 0.15f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(WARM);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONEALLOY, IRON, 8);
+            tMutation.requireResource("blockConductiveIron");
+        }),
+    ENERGETICALLOY(GTBranchDefinition.GTALLOY, "EnergeticAlloy", false, new Color(0xFF9933), new Color(0xFFAD5C),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ENERGETICALLOY), 0.15f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONEALLOY, getSpecies(FORESTRY, "Demonic"), 9);
+            tMutation.requireResource("blockEnergeticAlloy");
+        }),
+    VIBRANTALLOY(GTBranchDefinition.GTALLOY, "VibrantAlloy", false, new Color(0x86A12D), new Color(0xC4F2AE),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.VIBRANTALLOY), 0.15f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+            AlleleHelper.instance.set(template, FLOWERING, Flowering.FAST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(ENERGETICALLOY, getSpecies(FORESTRY, "Phantasmal"), 6);
+            tMutation.requireResource("blockVibrantAlloy");
+            tMutation.restrictTemperature(HOT, HELLISH);
+        }),
+    ELECTRICALSTEEL(GTBranchDefinition.GTALLOY, "ElectricalSteel", false, new Color(0x787878), new Color(0xD8D8D8),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ELECTRICALSTEEL), 0.15f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(STEEL, getSpecies(FORESTRY, "Demonic"), 9);
+            tMutation.requireResource("blockElectricalSteel");
+        }),
+    DARKSTEEL(GTBranchDefinition.GTALLOY, "DarkSteel", false, new Color(0x252525), new Color(0x443B44), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.DARKSTEEL), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ELECTRICALSTEEL, getSpecies(FORESTRY, "Demonic"), 7);
+        tMutation.requireResource("blockDarkSteel");
+    }),
+    PULSATINGIRON(GTBranchDefinition.GTALLOY, "PulsatingIron", false, new Color(0x6DD284), new Color(0x006600),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.PULSATINGIRON), 0.15f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(REDALLOY, getSpecies(FORESTRY, "Ended"), 9);
+            tMutation.requireResource("blockPulsatingIron");
+        }),
+    STAINLESSSTEEL(GTBranchDefinition.GTALLOY, "StainlessSteel", false, new Color(0xC8C8DC), new Color(0x778899),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.STEEL), 0.10f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.STAINLESSSTEEL), 0.15f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.CHROME), 0.05f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(HOT);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(CHROME, STEEL, 9);
+            tMutation.requireResource("blockStainlessSteel");
+        }),
+    ENDERIUM(GTBranchDefinition.GTALLOY, "Enderium", false, new Color(0x599087), new Color(0x2E8B57), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ENDERIUM), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.CHROME), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(HOT);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, GTBees.speedBlinding);
+        AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "teleport"));
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(PLATINUM, getSpecies(FORESTRY, "Phantasmal"), 3);
+        tMutation.requireResource("blockEnderium");
+    }),
+    BEDROCKIUM(GTBranchDefinition.GTALLOY, "Bedrockium", false, new Color(0x0C0C0C), new Color(0xC6C6C6),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.20f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.BEDROCKIUM), 0.55f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(HOT);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
+            AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "gravity"));
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(Explosive, DIAMOND, 2);
+            if (ExtraUtilities.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(ExtraUtilities.ID, "block_bedrockium"), 0);
+        }),
+
+    // thaumic
+    THAUMIUMDUST(GTBranchDefinition.THAUMIC, "ThaumiumDust", true, new Color(0x7A007A), new Color(0x5C005C),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.THAUMIUMDUST), 0.20f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectExploration);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis
+                .registerMutation(getSpecies(MAGICBEES, "TCFire"), getSpecies(FORESTRY, "Edenic"), 10);
+            tMutation.requireResource("blockThaumium");
+            tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
+                                                                                                        // forest
+        }),
+    THAUMIUMSHARD(GTBranchDefinition.THAUMIC, "ThaumiumShard", true, new Color(0x9966FF), new Color(0xAD85FF),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.THAUMIUMDUST), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.THAUMIUMSHARD), 0.20f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectGlacial);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, getSpecies(MAGICBEES, "TCWater"), 10);
+            tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
+                                                                                                        // forest
+        }),
+    AMBER(GTBranchDefinition.THAUMIC, "Amber", true, new Color(0xEE7700), new Color(0x774B15), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.AMBER), 0.20f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, STICKYRESIN, 10);
+        tMutation.requireResource("blockAmber");
+    }),
+    QUICKSILVER(GTBranchDefinition.THAUMIC, "Quicksilver", true, new Color(0x7A007A), new Color(0x5C005C),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.QUICKSILVER), 0.20f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
+            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMiasmic);
+        }, dis -> dis.registerMutation(THAUMIUMDUST, SILVER, 10)),
+    SALISMUNDUS(GTBranchDefinition.THAUMIC, "SalisMundus", true, new Color(0xF7ADDE), new Color(0x592582),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SALISMUNDUS), 0.20f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
+            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMiasmic);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, THAUMIUMSHARD, 8);
+            tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
+                                                                                                        // forest
+        }),
+    TAINTED(GTBranchDefinition.THAUMIC, "Tainted", true, new Color(0x904BB8), new Color(0xE800FF), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.TAINTED), 0.20f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+        AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, THAUMIUMSHARD, 7);
+        tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(193, "Tainted Land")); // Tainted Land
+    }),
+    MITHRIL(GTBranchDefinition.THAUMIC, "Mithril", true, new Color(0xF0E68C), new Color(0xFFFFD2), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.PLATINUM), 0.20f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.MITHRIL), 0.125f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+        AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+    }, new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(IO, PLATINUM, 7);
+            tMutation.requireResource(GregTechAPI.sBlockMetal4, 10);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(36, "IO")); // IO Dim
+        }
+    }),
+    ASTRALSILVER(GTBranchDefinition.THAUMIC, "AstralSilver", true, new Color(0xAFEEEE), new Color(0xE6E6FF),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SILVER), 0.20f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ASTRALSILVER), 0.125f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        }, template -> {
+            AlleleHelper.instance.set(template, NOCTURNAL, true);
+            AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+            AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
+            AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+            AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(SILVER, IRON, 3);
+            tMutation.requireResource(GregTechAPI.sBlockMetal1, 6);
+        }),
+    THAUMINITE(GTBranchDefinition.THAUMIC, "Thauminite", true, new Color(0x2E2D79), new Color(0x7581E0), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(MagicBees.ID, "comb", 1, 19), 0.20f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.THAUMINITE), 0.125f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "TCOrder"), THAUMIUMDUST, 8);
+        if (ThaumicBases.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(ThaumicBases.ID, "thauminiteBlock"), 0);
+    }),
+    SHADOWMETAL(GTBranchDefinition.THAUMIC, "ShadowMetal", true, new Color(0x100322), new Color(0x100342),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(MagicBees.ID, "comb", 1, 20), 0.20f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SHADOWMETAL), 0.125f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+            AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+            AlleleHelper.instance.set(template, NOCTURNAL, true);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis
+                .registerMutation(getSpecies(MAGICBEES, "TCChaos"), getSpecies(MAGICBEES, "TCVoid"), 6);
+            if (TaintedMagic.isModLoaded()) {
+                tMutation.requireResource("blockShadow");
+            }
+        }),
+    DIVIDED(GTBranchDefinition.THAUMIC, "Unstable", true, new Color(0xF0F0F0), new Color(0xDCDCDC), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 61), 0.20f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.DIVIDED), 0.125f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, IRON, 3);
+        if (ExtraUtilities.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(ExtraUtilities.ID, "decorativeBlock1"), 5);
+    }),
+    CAELESTIS(GTBranchDefinition.THAUMIC, "Caelestis", true, new Color(0xF0F0F0), new Color(0xDCDCDC), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.CAELESTISRED), 0.60f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.CAELESTISBLUE), 0.60f);
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.CAELESTISGREEN), 0.60f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+    }, dis -> dis.registerMutation(DIAMOND, DIVIDED, 10)),
+    SPARKELING(GTBranchDefinition.THAUMIC, "NetherStar", true, new Color(0x7A007A), new Color(0xFFFFFF), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(MagicBees.ID, "miscResources", 1, 3), 0.20f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SPARKLING), 0.125f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectAggressive);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(MAGICBEES, "Withering"), getSpecies(MAGICBEES, "Draconic"), 1);
+        tMutation.requireResource(GregTechAPI.sBlockGem3, 3);
+        tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(9, "END Biome")); // sky end biome
+    }),
+
+    ESSENTIA(GTBranchDefinition.THAUMIC, "Essentia", true, new Color(0x7A007A), new Color(0xFFFFFF), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(MagicBees.ID, "miscResources", 1, 3), 0.20f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+    }, template -> {
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+        AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.VANILLA);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectReanimation);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(SHADOWMETAL, SPARKELING, 5);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 6);
+    }),
+
+    DRAKE(GTBranchDefinition.THAUMIC, "Drake", true, new Color(0x100322), new Color(0x7A007A), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.DRACONIC), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.AWAKENEDDRACONIUM), 0.20f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+    }, template -> {
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_3);
+        AlleleHelper.instance.set(template, CAVE_DWELLING, false);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.END);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectDrunkard);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ESSENTIA, THAUMINITE, 5);
+        GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockCasings5, 8));
+    }),
+
+    // radioctive
+    URANIUM(GTBranchDefinition.RADIOACTIVE, "Uranium", true, new Color(0x19AF19), new Color(0x169E16), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.URANIUM), 0.15f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setNocturnal();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Avenging"), PLATINUM, 3);
+        tMutation.requireResource(GregTechAPI.sBlockMetal7, 14);
+    }),
+    PLUTONIUM(GTBranchDefinition.RADIOACTIVE, "Plutonium", true, new Color(0x570000), new Color(0x240000),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.LEAD), 0.15f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.PLUTONIUM), 0.15f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(ICY);
+            beeSpecies.setNocturnal();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(URANIUM, EMERALD, 3);
+            tMutation.requireResource(GregTechAPI.sBlockMetal5, 13);
+        }),
+    NAQUADAH(GTBranchDefinition.RADIOACTIVE, "Naquadah", false, new Color(0x003300), new Color(0x002400),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NAQUADAH), 0.15f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(ICY);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(PLUTONIUM, IRIDIUM, 3);
+            tMutation.requireResource(GregTechAPI.sBlockMetal4, 12);
+        }),
+    NAQUADRIA(GTBranchDefinition.RADIOACTIVE, "Naquadria", false, new Color(0x000000), new Color(0x002400),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SLAG), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NAQUADAH), 0.20f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NAQUADRIA), 0.15f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(ICY);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(PLUTONIUM, IRIDIUM, 8, 10);
+            tMutation.requireResource(GregTechAPI.sBlockMetal4, 15);
+        }),
+    DOB(GTBranchDefinition.RADIOACTIVE, "DOB", false, new Color(0x003300), new Color(0x002400), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.DOB), 0.75f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NAQUADAH, THAUMIUMSHARD, 2);
+        if (AdvancedSolarPanel.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(AdvancedSolarPanel.ID, "BlockAdvSolarPanel"), 2);
+        tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(9, "END Biome")); // sky end biome
+    }),
+    THORIUM(GTBranchDefinition.RADIOACTIVE, "Thorium", false, new Color(0x005000), new Color(0x001E00), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.THORIUM), 0.75f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setNocturnal();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+    }, dis -> {
+        IMutationCustom tMutation = dis.registerMutation(COAL, URANIUM, 3)
+            .setIsSecret();
+        tMutation.requireResource(GregTechAPI.sBlockMetal7, 5);
+    }),
+    LUTETIUM(GTBranchDefinition.RADIOACTIVE, "Lutetium", false, new Color(0xE6FFE6), new Color(0xFFFFFF),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.LUTETIUM), 0.15f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        }, dis -> {
+            IMutationCustom tMutation = dis.registerMutation(THORIUM, getSpecies(EXTRABEES, "rotten"), 1)
+                .setIsSecret();
+            tMutation.requireResource(GregTechAPI.sBlockMetal4, 3);
+        }),
+    AMERICIUM(GTBranchDefinition.RADIOACTIVE, "Americium", false, new Color(0xE6E6FF), new Color(0xC8C8C8),
+        beeSpecies -> {
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.AMERICIUM), 0.075f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+            // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+            beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        }, dis -> {
+            IMutationCustom tMutation = dis.registerMutation(LUTETIUM, CHROME, 5, 4)
+                .setIsSecret();
+            GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockMachines, 32020));
+        }),
+    NEUTRONIUM(GTBranchDefinition.RADIOACTIVE, "Neutronium", false, new Color(0xFFF0F0), new Color(0xFAFAFA),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NEUTRONIUM), 0.02f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(HELLISH);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+            AlleleHelper.instance.set(template, NOCTURNAL, true);
+        }, dis -> {
+            IMutationCustom tMutation = dis.registerMutation(NAQUADRIA, AMERICIUM, 2, 2)
+                .setIsSecret();
+            tMutation.requireResource(GregTechAPI.sBlockMetal5, 2);
+        }),
+    // Twilight
+    NAGA(GTBranchDefinition.TWILIGHT, "Naga", true, new Color(0x0D5A0D), new Color(0x28874B), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SALISMUNDUS), 0.02f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NAGA), 0.10f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(MAGICBEES, "Eldritch"), getSpecies(FORESTRY, "Imperial"), 8);
+        tMutation.restrictHumidity(DAMP);
+    }),
+    LICH(GTBranchDefinition.TWILIGHT, "Lich", true, new Color(0xC5C5C5), new Color(0x5C605E), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SALISMUNDUS), 0.04f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.LICH), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Supernatural"), NAGA, 7);
+        tMutation.restrictHumidity(ARID);
+    }),
+    HYDRA(GTBranchDefinition.TWILIGHT, "Hydra", true, new Color(0x872836), new Color(0xB8132C), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SALISMUNDUS), 0.06f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.HYDRA), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(LICH, getSpecies(MAGICBEES, "TCFire"), 6);
+        tMutation.addMutationCondition(new GTBees.BiomeIDMutationCondition(138, "Undergarden")); // undergarden biome
+    }),
+    URGHAST(GTBranchDefinition.TWILIGHT, "UrGhast", true, new Color(0xA7041C), new Color(0x7C0618), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SALISMUNDUS), 0.08f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.URGHAST), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+        beeSpecies.setNocturnal();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(HYDRA, THAUMIUMDUST, 5);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCosmeticSolid"), 4);
+        tMutation.restrictTemperature(HELLISH);
+    }),
+    SNOWQUEEN(GTBranchDefinition.TWILIGHT, "SnowQueen", true, new Color(0xD02001), new Color(0x9C0018), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SALISMUNDUS), 0.15f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SNOWQUEEN), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setHasEffect();
+        beeSpecies.setNocturnal();
+    }, template -> {}, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(URGHAST, SALISMUNDUS, 4);
+        if (ThaumicBases.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(ThaumicBases.ID, "blockSalisMundus"), 0);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // HEE
+    ENDDUST(GTBranchDefinition.HEE, "End Dust", true, new Color(0xCC00FA), new Color(0x003A7D), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ENDDUST), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), STAINLESSSTEEL, 8);
+
+        tMutation.restrictHumidity(ARID);
+        if (HardcoreEnderExpansion.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "end_powder_ore"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    ENDIUM(GTBranchDefinition.HEE, "Endium", true, new Color(0xa0ffff), new Color(0x2F5A6C), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ENDIUM), 0.10f);
+        beeSpecies.addSpecialty(GTBees.propolis.getStackForType(PropolisType.Endium), 0.15f);
+        beeSpecies.addSpecialty(GTBees.drop.getStackForType(DropType.ENDERGOO), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), THAUMIUMDUST, 8);
+        tMutation.restrictHumidity(ARID);
+        if (HardcoreEnderExpansion.isModLoaded()) tMutation.requireResource("blockHeeEndium");
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    STARDUST(GTBranchDefinition.HEE, "Star Dust", true, new Color(0xffff00), new Color(0xDCBE13), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.STARDUST), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, GTBees.speedBlinding);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), ZINC, 8);
+        tMutation.restrictHumidity(ARID);
+        if (HardcoreEnderExpansion.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "stardust_ore"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    ECTOPLASMA(GTBranchDefinition.HEE, "Ectoplasma", true, new Color(0xDCB0E5), new Color(0x381C40), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ECTOPLASMA), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), ENDDUST, 5);
+        tMutation.restrictHumidity(ARID);
+        if (HardcoreEnderExpansion.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "spooky_log"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    ARCANESHARDS(GTBranchDefinition.HEE, "Arcane Shards", true, new Color(0x9010AD), new Color(0x333D82),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ARCANESHARD), 0.10f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONG);
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMSHARD, ENDDUST, 5);
+            tMutation.restrictHumidity(ARID);
+            if (HardcoreEnderExpansion.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "laboratory_floor"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+        }),
+    DRAGONESSENCE(GTBranchDefinition.HEE, "Dragonessence", true, new Color(0xFFA12B), new Color(0x911ECE),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.DRAGONESSENCE), 0.10f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(EnumTemperature.NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectBeatific);
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_3);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_3);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(ECTOPLASMA, ARCANESHARDS, 4);
+            tMutation.restrictHumidity(ARID);
+            if (HardcoreEnderExpansion.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "essence_altar"), 1);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+        }),
+    FIREESSENCE(GTBranchDefinition.HEE, "Fireessence", true, new Color(0xD41238), new Color(0xFFA157), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.FIREESSENSE), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.ELONGATED);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_3);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_3);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(FIRESTONE, ARCANESHARDS, 4);
+        tMutation.restrictHumidity(ARID);
+        if (HardcoreEnderExpansion.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "essence_altar"), 2);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    ENDERMANHEAD(GTBranchDefinition.HEE, "EndermanHead", true, new Color(0x161616), new Color(0x6200e7), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ENDERMAN), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "teleport"));
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ENDERIUM, STARDUST, 4);
+        tMutation.restrictHumidity(ARID);
+        if (HardcoreEnderExpansion.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "ender_goo"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    SILVERFISH(GTBranchDefinition.HEE, "Silverfisch", true, new Color(0xEE053D), new Color(0x000000), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.SILVERFISH), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, EFFECT, getEffect(MAGICBEES, "SlowSpeed"));
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ECTOPLASMA, STARDUST, 5);
+        tMutation.restrictHumidity(ARID);
+        if (HardcoreEnderExpansion.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "ender_goo"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    RUNE(GTBranchDefinition.HEE, "Rune", true, new Color(0xE31010), new Color(0x0104D9), beeSpecies -> {
+        beeSpecies.addProduct(GTModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.RUNEI), 0.025f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.RUNEII), 0.0125f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, LIFESPAN, GTBees.superLife);
+        AlleleHelper.instance.set(template, EFFECT, getEffect(MAGICBEES, "SlowSpeed"));
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+    }, dis -> {
+        IMutationCustom tMutation = dis.registerMutation(DRAGONESSENCE, STARDUST, 2)
+            .setIsSecret();
+        tMutation.restrictHumidity(ARID);
+        if (EnderStorage.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(EnderStorage.ID, "enderChest"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(1, "End")); // End Dim
+    }),
+    // Walrus Bee, 100% Combchance, Parents: Catty and Watery
+    WALRUS(GTBranchDefinition.PLANET, "Walrus", true, new Color(0xD6D580), new Color(0xB5CFC9), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.WALRUS), 1.00f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(MAGICBEES, "Watery"), getSpecies(MAGICBEES, "Catty"), 45, 2);
+        if (ExtraCells2.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(ExtraCells2.ID, "walrus"), 0);
+        }
+    }),
+    MACHINIST(GTBranchDefinition.ORGANIC, "Machinist", true, new Color(85, 37, 130), new Color(253, 185, 39),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MACHINIST), 0.2f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(NORMAL);
+            beeSpecies.setHasEffect();
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+            AlleleHelper.instance.set(template, NOCTURNAL, true);
+            AlleleHelper.instance.set(template, FLOWER_PROVIDER, GTFlowers.FLAMING);
+            AlleleHelper.instance.set(template, FERTILITY, Fertility.MAXIMUM);
+            AlleleHelper.instance.set(template, EFFECT, getEffect(GREGTECH, "MachineBoost"));
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis
+                .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Imperial"), 1);
+            tMutation.addMutationCondition(new GTBees.ActiveGTMachineMutationCondition());
+        }),
+    // Space Bees
+    SPACE(GTBranchDefinition.SPACE, "Space", true, new Color(0x003366), new Color(0xC0C0C0), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.02f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+    }, template -> {}, dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Heroic"), 10);
+        tMutation.restrictTemperature(ICY);
+    }),
+    METEORICIRON(GTBranchDefinition.SPACE, "MeteoricIron", true, new Color(0x321928), new Color(0x643250),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.04f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.METEORICIRON), 0.10f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(HOT);
+            beeSpecies.setNocturnal();
+        }, template -> {}, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(SPACE, IRON, 9);
+            tMutation.requireResource(GregTechAPI.sBlockMetal4, 7);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(28, "Moon")); // Moon Dim
+        }),
+    DESH(GTBranchDefinition.SPACE, "Desh", false, new Color(0x323232), new Color(0x282828), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.06f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.DESH), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition), new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(MARS, TITANIUM, 9);
+            tMutation.requireResource(GregTechAPI.sBlockMetal2, 12);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(29, "Mars")); // Mars Dim
+        }
+    }),
+    LEDOX(GTBranchDefinition.SPACE, "Ledox", false, new Color(0x0000CD), new Color(0x0074FF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.10f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.LEDOX), 0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "freezing")), new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(CALLISTO, LEAD, 7);
+            if (NewHorizonsCoreMod.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Ledox"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(35, "Europa")); // Europa Dim
+        }
+    }),
+    CALLISTOICE(GTBranchDefinition.SPACE, "CallistoIce", false, new Color(0x0074FF), new Color(0x1EB1FF),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.10f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.CALLISTOICE), 0.10f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(ICY);
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "freezing")), new Consumer<>() {
+
+            @Override
+            public void accept(GTBeeDefinition dis) {
+                IBeeMutationCustom tMutation = dis.registerMutation(CALLISTO, getSpecies(EXTRABEES, "freezing"), 7);
+                if (NewHorizonsCoreMod.isModLoaded())
+                    tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.CallistoColdIce"), 0);
+                tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(45, "Callisto")); // Callisto
+                // Dim
+            }
+        }),
+    MYTRYL(GTBranchDefinition.SPACE, "Mytryl", false, new Color(0xDAA520), new Color(0xF26404), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.16f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.MYTRYL), 0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> {}, new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(IO, MITHRIL, 6);
+            if (NewHorizonsCoreMod.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Mytryl"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(36, "IO")); // IO Dim
+        }
+    }),
+    QUANTIUM(GTBranchDefinition.SPACE, "Quantium", false, new Color(0x00FF00), new Color(0x00D10B), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.16f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.QUANTIUM), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> {}, new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(VENUS, OSMIUM, 6);
+            if (NewHorizonsCoreMod.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Quantinum"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(39, "Venus")); // Venus Dim
+        }
+    }),
+    ORIHARUKON(GTBranchDefinition.SPACE, "Oriharukon", false, new Color(0x228B22), new Color(0x677D68), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.26f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.ORIHARUKON), 0.10f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+    }, template -> {}, new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(LEAD, OBERON, 5);
+            if (GalaxySpace.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "metalsblock"), 6);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(46, "Oberon")); // Oberon Dim
+        }
+    }),
+    INFUSEDGOLD(GTBranchDefinition.SPACE, "Infused Gold", false, new Color(0x80641E), new Color(0xFFC83C),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.GOLD), 0.20f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.INFUSEDGOLD), 0.30f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(ICY);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> {}, new Consumer<>() {
+
+            @Override
+            public void accept(GTBeeDefinition dis) {
+                IBeeMutationCustom tMutation = dis.registerMutation(GOLD, HAUMEA, 5);
+                tMutation.requireResource(GregTechAPI.sBlockMetal3, 10);
+                tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(83, "Haumea")); // Haumea Dim
+            }
+        }),
+    MYSTERIOUSCRYSTAL(GTBranchDefinition.SPACE, "MysteriousCrystal", false, new Color(0x3CB371), new Color(0x16856C),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.42f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.MYSTERIOUSCRYSTAL), 0.30f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(ICY);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> {}, new Consumer<>() {
+
+            @Override
+            public void accept(GTBeeDefinition dis) {
+                IBeeMutationCustom tMutation = dis.registerMutation(ENCELADUS, EMERALD, 3);
+                if (NewHorizonsCoreMod.isModLoaded()) tMutation
+                    .requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.MysteriousCrystal"), 0);
+                tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(41, "Enceladus")); // Enceladus
+                // Dim
+            }
+        }),
+    BLACKPLUTONIUM(GTBranchDefinition.SPACE, "BlackPlutonium", false, new Color(0x000000), new Color(0x323232),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SPACE), 0.68f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.BLACKPLUTONIUM), 0.10f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(HELLISH);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> {}, new Consumer<>() {
+
+            @Override
+            public void accept(GTBeeDefinition dis) {
+                IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, PLUTONIUM, 2);
+                if (NewHorizonsCoreMod.isModLoaded())
+                    tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.BlackPlutonium"), 0);
+                tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(49, "Pluto")); // Pluto Dim
+            }
+        }),
+    TRINIUM(GTBranchDefinition.SPACE, "Trinium", false, new Color(0xB0E0E6), new Color(0xC8C8D2), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.TRINIUM), 0.75f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.QUANTIUM), 0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, SPEED, GTBees.speedBlinding), new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(ENCELADUS, IRIDIUM, 4);
+            tMutation.requireResource(GregTechAPI.sBlockMetal4, 9);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(41, "Enceladus")); // Enceladus Dim
+        }
+    }),
+    // Planet Line
+    MOON(GTBranchDefinition.PLANET, "Moon", false, new Color(0x373735), new Color(0x7E7E78), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MOON), 0.35f);
+        if (NewHorizonsCoreMod.isModLoaded())
+            beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(SPACE, CLAY, 25);
+        if (GalacticraftCore.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(GalacticraftCore.ID, "tile.moonBlock"), 4);
+        }
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(28, "Moon")); // Moon Dim
+    }),
+    MARS(GTBranchDefinition.PLANET, "Mars", false, new Color(0x220D05), new Color(0x3A1505), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MARS), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MOON, IRON, 20);
+        if (GalacticraftMars.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(GalacticraftMars.ID, "tile.mars"), 5);
+        }
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(29, "Mars")); // Mars Dim
+    }),
+    PHOBOS(GTBranchDefinition.PLANET, "Phobos", true, new Color(0x220D05), new Color(0x7a5706), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MARS), 0.25f);
+        if (NewHorizonsCoreMod.isModLoaded()) beeSpecies
+            .addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PhobosStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MARS, MOON, 20);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "phobosblocks"), 2);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(38, "Phobos")); // Phobos Dim
+    }),
+    DEIMOS(GTBranchDefinition.PLANET, "Deimos", true, new Color(0x220D05), new Color(0x7a3206), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MARS), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.DeimosStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MARS, SPACE, 20);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "deimosblocks"), 1);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(40, "Deimos")); // Deimos Dim
+    }),
+    CERES(GTBranchDefinition.PLANET, "Ceres", true, new Color(0x3ca5b7), new Color(0x1e7267), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.JUPITER), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CeresStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MARS, METEORICIRON, 20);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ceresblocks"), 1);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(42, "Ceres")); // Ceres Dim
+    }),
+    JUPITER(GTBranchDefinition.PLANET, "Jupiter", false, new Color(0x734B2E), new Color(0xD0CBC4), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.JUPITER), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoIceDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MARS, DESH, 15);
+        if (NewHorizonsCoreMod.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Ledox"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(30, "Asteroids")); // Asteroid Dim
+    }),
+    IO(GTBranchDefinition.PLANET, "IO", true, new Color(0x734B2E), new Color(0xe5701b), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.JUPITER), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, getSpecies(EXTRABEES, "volcanic"), 15);
+        tMutation.restrictTemperature(HELLISH);
+        if (GalaxySpace.isModLoaded()) tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ioblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(36, "IO")); // IO Dim
+    }),
+    EUROPA(GTBranchDefinition.PLANET, "Europa", true, new Color(0x5982ea), new Color(0x0b36a3), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.JUPITER), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1, 0), 0.10f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, IRON, 15);
+        tMutation.restrictTemperature(ICY);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "europagrunt"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(35, "Europa")); // Europa Dim
+    }),
+    GANYMEDE(GTBranchDefinition.PLANET, "Ganymede", true, new Color(0x3d1b10), new Color(0x190c07), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.JUPITER), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(COLD);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, TITANIUM, 15);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ganymedeblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(43, "Ganymede")); // Ganymede Dim
+    }),
+    CALLISTO(GTBranchDefinition.PLANET, "Callisto", true, new Color(0x0f333d), new Color(0x0d84a5), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.JUPITER), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1, 0), 0.10f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoIceDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, getSpecies(EXTRABEES, "artic"), 15);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "callistoblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(45, "Callisto")); // Callisto Dim
+    }),
+    SATURN(GTBranchDefinition.PLANET, "Saturn", false, new Color(0xD2A472), new Color(0xF8C37B), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SATURN), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusIceDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, LEDOX, 25, 2);
+        if (NewHorizonsCoreMod.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Quantinum"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(30, "Asteriods")); // Asteriods Dim
+    }),
+    ENCELADUS(GTBranchDefinition.PLANET, "Enceladus", true, new Color(0xD2A472), new Color(0x193fa0), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SATURN), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1, 0), 0.10f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusIceDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(SATURN, CHROME, 25, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "enceladusblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(41, "Enceladus")); // Enceladus Dim
+    }),
+    TITAN(GTBranchDefinition.PLANET, "Titan", true, new Color(0xa0641b), new Color(0x7c1024), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SATURN), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(SATURN, NICKEL, 25, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "titanblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(44, "Titan")); // Titan Dim
+    }),
+    URANUS(GTBranchDefinition.PLANET, "Uranus", false, new Color(0x75C0C9), new Color(0x84D8EC), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.URANUS), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(SATURN, TRINIUM, 10);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "metalsblock"), 6);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(30, "Asteroids")); // Asteroids Dim
+    }),
+    MIRANDA(GTBranchDefinition.PLANET, "Miranda", true, new Color(0x75C0C9), new Color(0x0d211c), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.URANUS), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(URANUS, TIN, 10);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "mirandablocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(86, "Miranda")); // Miranda Dim
+    }),
+    OBERON(GTBranchDefinition.PLANET, "Oberon", true, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.URANUS), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(ICY);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(URANUS, IRIDIUM, 10);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "oberonblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(46, "Oberon")); // Oberon Dim
+    }),
+    NEPTUNE(GTBranchDefinition.PLANET, "Neptune", false, new Color(0x334CFF), new Color(0x576DFF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NEPTUNE), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(URANUS, ORIHARUKON, 7);
+        if (NewHorizonsCoreMod.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.MysteriousCrystal"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(30, "Asteroids")); // Asteroids Dim
+    }),
+    PROTEUS(GTBranchDefinition.PLANET, "Proteus", true, new Color(0x334CFF), new Color(0x592610), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NEPTUNE), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, COPPER, 7);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "proteusblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(47, "Proteus")); // Proteus Dim
+    }),
+    TRITON(GTBranchDefinition.PLANET, "Triton", true, new Color(0x334CFF), new Color(0x421118), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NEPTUNE), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, GOLD, 7);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tritonblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(48, "Triton")); // Triton Dim
+    }),
+    PLUTO(GTBranchDefinition.PLANET, "Pluto", false, new Color(0x34271E), new Color(0x69503D), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.PLUTO), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1, 0), 0.10f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoIceDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, PLUTONIUM, 5);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "plutoblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(49, "Pluto")); // Pluto Dim
+    }),
+    HAUMEA(GTBranchDefinition.PLANET, "Haumea", false, new Color(0x1C1413), new Color(0x392B28), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.HAUMEA), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(ICY);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, NAQUADAH, 7, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "haumeablocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(83, "Haumea")); // Haumea Dim
+    }),
+    MAKEMAKE(GTBranchDefinition.PLANET, "MakeMake", false, new Color(0x301811), new Color(0x120A07), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MAKEMAKE), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, NAQUADRIA, 7, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "makemakegrunt"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(25, "MakeMake")); // MakeMake Dim
+    }),
+    CENTAURI(GTBranchDefinition.PLANET, "Centauri", false, new Color(0x2F2A14), new Color(0xB06B32), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.CENTAURI), 0.35f);
+        beeSpecies
+            .addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, DESH, 3);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "acentauribbgrunt"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
+    }),
+    ACENTAURI(GTBranchDefinition.PLANET, "aCentauri", false, new Color(0x2F2A14), new Color(0xa01e14), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.CENTAURI), 0.25f);
+        beeSpecies
+            .addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), new Consumer<>() {
+
+        @Override
+        public void accept(GTBeeDefinition dis) {
+            IBeeMutationCustom tMutation = dis.registerMutation(CENTAURI, INFINITYCATALYST, 3);
+            if (GalaxySpace.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "acentauribbgrunt"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(31, "aCentauri")); // aCentauri Dim
+        }
+    }),
+    TCETI(GTBranchDefinition.PLANET, "tCeti", false, new Color(0x46241A), new Color(0x7B412F), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.TCETI), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, HAUMEA, 5, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
+    }),
+    TCETIE(GTBranchDefinition.PLANET, "tCetiE", false, new Color(0x2d561b), new Color(0x0c0f60), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.TCETI), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(TCETI, getSpecies(MAGICBEES, "TCWater"), 5, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(85, "tCeti E")); // tCeti E Dim
+    }),
+    // Parents: TCETI and TCETIE, 25% combchance, needs Damp Humidity and Normal temperature. Is Mycophilic
+    SEAWEED(GTBranchDefinition.PLANET, "SeaWeed", true, new Color(0xCBCBCB), new Color(0x83FF83), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.SEAWEED), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.15f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(EnumTemperature.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
+        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMycophilic);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(TCETI, TCETIE, 5, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(85, "tCeti E")); // tCeti E Dim
+    }),
+
+    BARNARDA(GTBranchDefinition.PLANET, "Barnarda", false, new Color(0x0D5A0D), new Color(0xE6C18D), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.BARNARDA), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1, 0), 0.05f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, THORIUM, 3, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
+    }),
+    BARNARDAC(GTBranchDefinition.PLANET, "BarnardaC", false, new Color(0x0D5A0D), new Color(0x473f0a), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.BARNARDA), 0.25f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> {
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+        AlleleHelper.instance.set(template, EFFECT, getEffect(GREGTECH, "Treetwister"));
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, AMERICIUM, 3, 2);
+        if (GalaxySpace.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(32, "Barnarda C")); // Barnarda C Dim
+        }
+    }),
+    BARNARDAE(GTBranchDefinition.PLANET, "BarnardaE", false, new Color(0x0D5A0D), new Color(0x4c1f0a), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.BARNARDA), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, DIVIDED, 3, 2);
+        if (GalaxySpace.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(81, "Barnard E")); // "Barnard E Dim
+        }
+    }),
+    BARNARDAF(GTBranchDefinition.PLANET, "BarnardaF", false, new Color(0x0D5A0D), new Color(0x1e0b49), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.BARNARDA), 0.25f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HOT);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, NEUTRONIUM, 3, 2);
+        if (GalaxySpace.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaFgrunt"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(82, "Barnard F")); // "Barnard F Dim
+        }
+    }),
+    VEGA(GTBranchDefinition.PLANET, "Vega", false, new Color(0x1A2036), new Color(0xB5C0DE), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.VEGA), 0.35f);
+        beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1, 0), 0.05f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, NAQUADAH, 2);
+        if (GalaxySpace.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "vegabgrunt"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt
+                                                                                                      // Dim
+        }
+    }),
+    VEGAB(GTBranchDefinition.PLANET, "VegaB", false, new Color(0x1A2036), new Color(0x81e261), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.VEGA), 0.35f);
+        if (NewHorizonsCoreMod.isModLoaded())
+            beeSpecies.addSpecialty(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1, 0), 0.10f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(COLD);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(VEGA, NAQUADRIA, 2);
+        if (GalaxySpace.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "vegabgrunt"), 0);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(84, "VegaB")); // VegaB Dim
+        }
+    }),
+    MERCURY(GTBranchDefinition.PLANET, "Mercury", false, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.MERCURY), 0.35f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, TUNGSTEN, 25, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "mercuryblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(37, "Mercury")); // Mercury Dim
+    }),
+    VENUS(GTBranchDefinition.PLANET, "Venus", false, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.VENUS), 0.35f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setTemperature(HELLISH);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, MITHRIL, 25, 2);
+        if (GalaxySpace.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "venusblocks"), 0);
+        tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(39, "Venus")); // Venus Dim
+    }),
+
+    // Infinity Line
+    COSMICNEUTRONIUM(GTBranchDefinition.PLANET, "CosmicNeutronium", false, new Color(0x484848), new Color(0x323232),
+        beeSpecies -> {
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.COSMICNEUTRONIUM), 0.375f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(ICY);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+            // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+            beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(NEUTRONIUM, BARNARDAF, 7, 10);
+            if (Avaritia.isModLoaded())
+                tMutation.requireResource(GameRegistry.findBlock(Avaritia.ID, "Resource_Block"), 0);
+        }),
+    INFINITYCATALYST(GTBranchDefinition.PLANET, "InfinityCatalyst", false, new Color(0xFFFFFF), new Color(0xFFFFFF),
+        beeSpecies -> {
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.INFINITYCATALYST), 0.015f);
+            beeSpecies.setHumidity(DAMP);
+            beeSpecies.setTemperature(HELLISH);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+            // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+            beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+        }, template -> {
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+            AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "blindness"));
+        }, dis -> {
+            IMutationCustom tMutation = dis.registerMutation(DOB, COSMICNEUTRONIUM, 3, 10)
+                .setIsSecret();
+            if (Avaritia.isModLoaded()) {
+                tMutation.requireResource(GameRegistry.findBlock(Avaritia.ID, "Resource_Block"), 1);
+            }
+        }),
+    INFINITY(GTBranchDefinition.PLANET, "Infinity", false, new Color(0xFFFFFF), new Color(0xFFFFFF), beeSpecies -> {
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.INFINITY), 0.015f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+        // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+        beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(INFINITYCATALYST, COSMICNEUTRONIUM, 1, 10);
+        if (AvaritiaAddons.isModLoaded()) {
+            tMutation.requireResource(GameRegistry.findBlock(AvaritiaAddons.ID, "InfinityChest"), 0);
+        }
+    }),
+    KEVLAR(GTBranchDefinition.IC2, "Kevlar", false, new Color(0x2d542f), new Color(0xa2baa3), beeSpecies -> {
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.KEVLAR), 0.075f);
+        beeSpecies.addSpecialty(MaterialsKevlar.Kevlar.getNuggets(1), 0.01f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setTemperature(COLD);
+        beeSpecies.setHasEffect();
+        beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
+        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(template, NOCTURNAL, true);
+        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(OIL, INFINITYCATALYST, 4);
+        // UHV Replicator (UU-Matter)
+        GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockMachines, 11003));
+    }),
+
+    // Noble Gas Line
+    // Helium bee, Humidity: normal, Temperature: Icy, Parents: Space & Mars, Mutationrate: 10%, Combrate: 50%
+    HELIUM(GTBranchDefinition.NOBLEGAS, "Helium", false, new Color(0xFFA9FF), new Color(0xC8B8B4), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.HELIUM), 0.35f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Watery"), ENDDUST, 10);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Argon bee, Humidity: normal, Temperature: Icy, Parents: Helium & Phobos, Mutationrate: 8%, Combrate: 50%
+    ARGON(GTBranchDefinition.NOBLEGAS, "Argon", false, new Color(0x89D9E1), new Color(0xBDA5C2), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.ARGON), 0.35f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(HELIUM, LICH, 8);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Neon bee, Humidity: normal, Temperature: Icy, Parents: Xenon & Ceres, Mutationrate: 6%, Combrate: 50%
+    NEON(GTBranchDefinition.NOBLEGAS, "Neon", false, new Color(0xFFC826), new Color(0xFF7200), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NEON), 0.35f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ARGON, HYDRA, 6);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Krypton bee, Humidity: normal, Temperature: Icy, Parents: Neon & Jupiter, Mutationrate: 4%, Combrate: 50%
+    KRYPTON(GTBranchDefinition.NOBLEGAS, "Krypton", false, new Color(0x8A97B0), new Color(0x160822), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.KRYPTON), 0.35f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NEON, URGHAST, 4);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Xenon bee, Humidity: normal, Temperature: Icy, Parents: Argon & Deimos, Mutationrate: 6%, Combrate: 50%
+    XENON(GTBranchDefinition.NOBLEGAS, "Xenon", false, new Color(0x8A97B0), new Color(0x160822), beeSpecies -> {
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.XENON), 0.525f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+        // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+        beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(KRYPTON, SNOWQUEEN, 2);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Oxygen bee, Humidity: normal, Temperature: Icy, Parents: Space & Callisto, Mutationrate: 15%, Combrate: 50%
+    OXYGEN(GTBranchDefinition.NOBLEGAS, "Oxygen", false, new Color(0xFFFFFF), new Color(0x8F8FFF), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.OXYGEN), 0.45f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.HYDROGEN), 0.20f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(HELIUM, DRAGONESSENCE, 15);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Hydrogen bee, Humidity: normal, Temperature: Icy, Parents: Oxygen & Watery, Mutationrate: 15%, Combrate: 50%
+    HYDROGEN(GTBranchDefinition.NOBLEGAS, "Oxygen", false, new Color(0xFFFFFF), new Color(0xFF1493), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.HYDROGEN), 0.45f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NITROGEN), 0.20f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(OXYGEN, getSpecies(MAGICBEES, "Watery"), 15);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Nitrogen bee, Humidity: normal, Temperature: Icy, Parents: Oxygen & Hydrogen, Mutationrate: 15%, Combrate: 50%
+    NITROGEN(GTBranchDefinition.NOBLEGAS, "Nitrogen", false, new Color(0xFFC832), new Color(0xA52A2A), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NITROGEN), 0.45f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.FLUORINE), 0.20f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(OXYGEN, HYDROGEN, 15);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Fluorine bee, Humidity: normal, Temperature: Icy, Parents: Nitrogen & Hydrogen, Mutationrate: 15%, Combrate: 50%
+    FLUORINE(GTBranchDefinition.NOBLEGAS, "Fluorine", false, new Color(0x86AFF0), new Color(0xFF6D00), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.FLUORINE), 0.45f);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.OXYGEN), 0.20f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(ICY);
+        beeSpecies.setNocturnal();
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NITROGEN, HYDROGEN, 15);
+        tMutation.restrictTemperature(ICY);
+    }),
+    // Europium line, needed after fluorine definition
+    RAREEARTH(GTBranchDefinition.RAREMETAL, "RareEarth", false, new Color(0x555643), new Color(0x343428),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.RAREEARTH), 0.20f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NEODYMIUM), 0.05f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(NORMAL);
+        }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST),
+        dis -> dis.registerMutation(FLUORINE, REDSTONE, 10)),
+    NEODYMIUM(GTBranchDefinition.RAREMETAL, "Neodymium", false, new Color(0x555555), new Color(0x4F4F4F),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.RAREEARTH), 0.15f);
+            beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.NEODYMIUM), 0.15f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setTemperature(HOT);
+        }, template -> {
+            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+        }, dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(RAREEARTH, IRON, 10);
+            tMutation.requireResource(GregTechAPI.sBlockMetal5, 0);
+        }),
+    EUROPIUM(GTBranchDefinition.RAREMETAL, "Europium", false, new Color(0xDAA0E2), new Color(0xAB7EB1), beeSpecies -> {
+        beeSpecies.addProduct(WerkstoffMaterialPool.EuropiumIIIOxide.get(OrePrefixes.dust, 1), 0.10F);
+        beeSpecies.addSpecialty(GTBees.combs.getStackForType(CombType.EUROPIUM), 0.075f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setTemperature(HOT);
+        beeSpecies.setNocturnal();
+        // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+        beeSpecies.setJubilanceProvider(JubilanceMegaApiary.instance);
+    }, template -> {
+        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+    }, dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(NEODYMIUM, HYDROGEN, 5, 4);
+        // Compact fusion reactor mark 1 controller
+        GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockMachines, 32019));
+    }),
+    // infused Shards line
+    AIR(GTBranchDefinition.INFUSEDSHARD, "Air", false, new Color(0xFFFF7E), new Color(0x60602F), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.INFUSEDAER), 0.30f);
+        beeSpecies.setHumidity(DAMP);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis
+            .registerMutation(getSpecies(MAGICBEES, "Supernatural"), getSpecies(MAGICBEES, "Windy"), 15);
+        tMutation.restrictTemperature(HOT);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 0);
+    }),
+    FIRE(GTBranchDefinition.INFUSEDSHARD, "Fire", false, new Color(0xED3801), new Color(0x3B0E00), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.INFUSEDIGNIS), 0.30f);
+        beeSpecies.setHumidity(ARID);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Supernatural"), AIR, 15);
+        tMutation.restrictTemperature(HELLISH);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 1);
+    }),
+    WATER(GTBranchDefinition.INFUSEDSHARD, "Water", false, new Color(0x0090FF), new Color(0x002542), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.INFUSEDAQUA), 0.30f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(FIRE, AIR, 15);
+        tMutation.restrictTemperature(ICY);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 2);
+    }),
+    EARTH(GTBranchDefinition.INFUSEDSHARD, "Earth", false, new Color(0x008600), new Color(0x003300), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.INFUSEDTERRA), 0.30f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(WATER, FIRE, 15);
+        tMutation.restrictTemperature(WARM);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 3);
+    }),
+    ORDER(GTBranchDefinition.INFUSEDSHARD, "Order", false, new Color(0x8A97B0), new Color(0x5C5F62), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.INFUSEDORDO), 0.30f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(EARTH, FIRE, 15);
+        tMutation.restrictTemperature(ICY);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 4);
+    }),
+    CHAOS(GTBranchDefinition.INFUSEDSHARD, "Chaos", false, new Color(0x2E2E41), new Color(0x232129), beeSpecies -> {
+        beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.INFUSEDPERDITIO), 0.30f);
+        beeSpecies.setHumidity(EnumHumidity.NORMAL);
+        beeSpecies.setHasEffect();
+    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+        IBeeMutationCustom tMutation = dis.registerMutation(ORDER, FIRE, 15);
+        tMutation.restrictTemperature(ICY);
+        if (Thaumcraft.isModLoaded())
+            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 5);
+    }),
+    NETHERSHARD(GTBranchDefinition.INFUSEDSHARD, "NetherShard", false, new Color(0xBE0135), new Color(0x350211),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.NETHERSHARD), 0.30f);
+            beeSpecies.setHumidity(ARID);
+            beeSpecies.setTemperature(HOT);
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(CHAOS, FIRE, 15);
+            GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockGem3, 3));
+        }),
+    ENDSHARD(GTBranchDefinition.INFUSEDSHARD, "EnderShard", false, new Color(0x2E2E41), new Color(0x232129),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.ENDERSHARD), 0.30f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(NETHERSHARD, ENDDUST, 15);
+            tMutation.restrictTemperature(ICY);
+            GregTechAPI.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTechAPI.sBlockGem1, 7));
+        }),
+    // Organic branch 2.0
+    UNKNOWNWATER(GTBranchDefinition.ORGANIC, "UnknownLiquid", false, new Color(0x4333A5), new Color(0x36ABFF),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTBees.combs.getStackForType(CombType.UNKNOWNLIQUID), 0.20f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST),
+        dis -> dis.registerMutation(INFINITYCATALYST, MYSTERIOUSCRYSTAL, 5)),
+    // Endgame bees
+    JAEGERMEISTER(GTBranchDefinition.ENDGAME, "JaegerMeister", false, new Color(0x05AD18), new Color(0xE7DAC3),
+        beeSpecies -> {
+            beeSpecies.addProduct(GTModHandler.getModItem(CropsPlusPlus.ID, "BppPotions", 1L, 8), 0.01f);
+            beeSpecies.setHumidity(EnumHumidity.NORMAL);
+            beeSpecies.setNocturnal();
+            beeSpecies.setHasEffect();
+        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+            IBeeMutationCustom tMutation = dis.registerMutation(INFINITYCATALYST, NAQUADRIA, 5);
+            tMutation.requireResource(GregTechAPI.sBlockMachines, 4684);
+            tMutation.addMutationCondition(new GTBees.DimensionMutationCondition(100, "Deep Dark")); // Deep Dark
+                                                                                                     // dim
+        });
+
+    private final GTBranchDefinition branch;
+    private final GTAlleleBeeSpecies species;
+    private final Consumer mSpeciesProperties;
+    private final Consumer mAlleles;
+    private final Consumer mMutations;
+    private IAllele[] template;
+    private IBeeGenome genome;
+
+    GTBeeDefinition(GTBranchDefinition branch, String binomial, boolean dominant, Color primary, Color secondary,
+        Consumer aSpeciesProperties, Consumer aAlleles,
+        Consumer aMutations) {
+        this.mAlleles = aAlleles;
+        this.mMutations = aMutations;
+        this.mSpeciesProperties = aSpeciesProperties;
+        String lowercaseName = this.toString()
+            .toLowerCase(Locale.ENGLISH);
+        String species = WordUtils.capitalize(lowercaseName);
+
+        String uid = "gregtech.bee.species" + species;
+        String description = "for.description." + lowercaseName;
+        String name = "for.bees.species." + lowercaseName;
+        GTLanguageManager.addStringLocalization("for.bees.species." + lowercaseName, species);
+
+        String authority = GTLanguageManager.getTranslation("for.bees.authority." + lowercaseName);
+        if (authority.equals("for.bees.authority." + lowercaseName)) {
+            authority = "GTNH";
+        }
+        this.branch = branch;
+        this.species = new GTAlleleBeeSpecies(
+            uid,
+            dominant,
+            name,
+            authority,
+            description,
+            branch.getBranch(),
+            binomial,
+            primary,
+            secondary);
+    }
+
+    public static void initBees() {
+        for (GTBeeDefinition bee : values()) {
+            bee.init();
+        }
+        for (GTBeeDefinition bee : values()) {
+            bee.registerMutations();
+        }
+    }
+
+    static IAlleleBeeEffect getEffect(byte modid, String name) {
+        String s = switch (modid) {
+            case EXTRABEES -> "extrabees.effect." + name;
+            case GENDUSTRY -> "gendustry.effect." + name;
+            case MAGICBEES -> "magicbees.effect" + name;
+            case GREGTECH -> "gregtech.effect" + name;
+            default -> "forestry.effect" + name;
+        };
+        return (IAlleleBeeEffect) AlleleManager.alleleRegistry.getAllele(s);
+    }
+
+    static IAlleleFlowers getFlowers(byte modid, String name) {
+        String s = switch (modid) {
+            case EXTRABEES -> "extrabees.flower." + name;
+            case GENDUSTRY -> "gendustry.flower." + name;
+            case MAGICBEES -> "magicbees.flower" + name;
+            case GREGTECH -> "gregtech.flower" + name;
+            default -> "forestry.flowers" + name;
+        };
+        return (IAlleleFlowers) AlleleManager.alleleRegistry.getAllele(s);
+    }
+
+    private static IAlleleBeeSpecies getSpecies(byte modid, String name) {
+        String s = switch (modid) {
+            case EXTRABEES -> "extrabees.species." + name;
+            case GENDUSTRY -> "gendustry.bee." + name;
+            case MAGICBEES -> "magicbees.species" + name;
+            case GREGTECH -> "gregtech.species" + name;
+            default -> "forestry.species" + name;
+        };
+        IAlleleBeeSpecies ret = (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(s);
+        if (ret == null) {
+            ret = NAQUADRIA.species;
+        }
+
+        return ret;
+    }
+
+    private void setSpeciesProperties(GTAlleleBeeSpecies beeSpecies) {
+        this.mSpeciesProperties.accept(beeSpecies);
+    }
+
+    private void setAlleles(IAllele[] template) {
+        this.mAlleles.accept(template);
+    }
+
+    private void registerMutations() {
+        this.mMutations.accept(this);
+    }
+
+    private void init() {
+        setSpeciesProperties(species);
+
+        template = branch.getTemplate();
+        AlleleHelper.instance.set(template, SPECIES, species);
+        setAlleles(template);
+
+        genome = BeeManager.beeRoot.templateAsGenome(template);
+
+        BeeManager.beeRoot.registerTemplate(template);
+    }
+
+    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance) {
+        return registerMutation(parent1, parent2, chance, 1f);
+    }
+
+    private IBeeMutationCustom registerMutation(GTBeeDefinition parent1, IAlleleBeeSpecies parent2, int chance) {
+        return registerMutation(parent1, parent2, chance, 1f);
+    }
+
+    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GTBeeDefinition parent2, int chance) {
+        return registerMutation(parent1, parent2, chance, 1f);
+    }
+
+    private IBeeMutationCustom registerMutation(GTBeeDefinition parent1, GTBeeDefinition parent2, int chance) {
+        return registerMutation(parent1, parent2, chance, 1f);
+    }
+
+    /**
+     * Diese neue Funtion erlaubt Mutationsraten unter 1%. Setze dazu die Mutationsrate als Bruch mit chance /
+     * chanceDivider This new function allows Mutation percentages under 1%. Set them as a fraction with chance /
+     * chanceDivider
+     */
+    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance,
+        float chanceDivider) {
+        return new GTBeeMutation(parent1, parent2, this.getTemplate(), chance, chanceDivider);
+    }
+
+    private IBeeMutationCustom registerMutation(GTBeeDefinition parent1, IAlleleBeeSpecies parent2, int chance,
+        float chanceDivider) {
+        return registerMutation(parent1.species, parent2, chance, chanceDivider);
+    }
+
+    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GTBeeDefinition parent2, int chance,
+        float chanceDivider) {
+        return registerMutation(parent1, parent2.species, chance, chanceDivider);
+    }
+
+    private IBeeMutationCustom registerMutation(GTBeeDefinition parent1, GTBeeDefinition parent2, int chance,
+        float chanceDivider) {
+        return registerMutation(parent1.species, parent2, chance, chanceDivider);
+    }
+
+    @Override
+    public final IAllele[] getTemplate() {
+        return Arrays.copyOf(template, template.length);
+    }
+
+    @Override
+    public final IBeeGenome getGenome() {
+        return genome;
+    }
+
+    @Override
+    public final IBee getIndividual() {
+        return new Bee(genome);
+    }
+
+    @Override
+    public final ItemStack getMemberStack(EnumBeeType beeType) {
+        return BeeManager.beeRoot.getMemberStack(getIndividual(), beeType.ordinal());
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GTBees.java b/src/main/java/gregtech/loaders/misc/GTBees.java
new file mode 100644
index 0000000000..02fb6d19e5
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GTBees.java
@@ -0,0 +1,231 @@
+package gregtech.loaders.misc;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.TwilightForest;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.core.IClimateProvider;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleArea;
+import forestry.api.genetics.IAlleleFloat;
+import forestry.api.genetics.IAlleleInteger;
+import forestry.api.genetics.IGenome;
+import forestry.api.genetics.IMutationCondition;
+import forestry.core.genetics.alleles.Allele;
+import forestry.core.utils.StringUtil;
+import gregtech.GTMod;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.common.bees.GTAlleleHelper;
+import gregtech.common.items.ItemComb;
+import gregtech.common.items.ItemDrop;
+import gregtech.common.items.ItemPollen;
+import gregtech.common.items.ItemPropolis;
+import gregtech.loaders.misc.bees.GTAlleleEffect;
+import gregtech.loaders.misc.bees.GTEffectMachineBoost;
+import gregtech.loaders.misc.bees.GTEffectTreeTwister;
+import gregtech.loaders.misc.bees.GTFlowers;
+
+public class GTBees {
+
+    public static IAlleleInteger noFertility;
+    public static IAlleleInteger superFertility;
+
+    public static IAlleleInteger noFlowering;
+    public static IAlleleInteger superFlowering;
+
+    public static IAlleleArea noTerritory;
+    public static IAlleleArea superTerritory;
+
+    public static IAlleleFloat noWork;
+    public static IAlleleFloat speedBlinding;
+    public static IAlleleFloat superSpeed;
+
+    public static IAlleleInteger blinkLife;
+    public static IAlleleInteger superLife;
+
+    public static IAlleleBeeEffect treetwisterEffect;
+    public static IAlleleBeeEffect machineBoostEffect;
+
+    public static ItemPropolis propolis;
+    public static ItemPollen pollen;
+    public static ItemDrop drop;
+    public static ItemComb combs;
+
+    public GTBees() {
+        if (!(Forestry.isModLoaded() && GTMod.gregtechproxy.mGTBees)) {
+            return;
+        }
+        GTFlowers.doInit();
+        GTAlleleHelper.initialisation();
+        setupGTAlleles();
+        propolis = new ItemPropolis();
+        propolis.initPropolisRecipes();
+        pollen = new ItemPollen();
+        drop = new ItemDrop();
+        drop.initDropsRecipes();
+        combs = new ItemComb();
+        combs.initCombsRecipes();
+        combs.registerOreDict();
+        GTBeeDefinition.initBees();
+
+    }
+
+    private static void setupGTAlleles() {
+
+        noFertility = new AlleleInteger("fertilitySterile", 0, false, EnumBeeChromosome.FERTILITY);
+        superFertility = new AlleleInteger("fertilityMultiply", 8, false, EnumBeeChromosome.FERTILITY);
+
+        noFlowering = new AlleleInteger("floweringNonpollinating", 0, false, EnumBeeChromosome.FLOWERING);
+        superFlowering = new AlleleInteger("floweringNaturalistic", 240, false, EnumBeeChromosome.FLOWERING);
+
+        noTerritory = new AlleleArea("areaLethargic", 1, 1, false);
+        superTerritory = new AlleleArea("areaExploratory", 32, 16, false);
+
+        noWork = new AlleleFloat("speedUnproductive", 0, false);
+        superSpeed = new AlleleFloat("speedAccelerated", 4F, false);
+        speedBlinding = AlleleManager.alleleRegistry.getAllele("magicbees.speedBlinding") == null
+            ? new AlleleFloat("speedBlinding", 2f, false)
+            : (IAlleleFloat) AlleleManager.alleleRegistry.getAllele("magicbees.speedBlinding");
+
+        blinkLife = new AlleleInteger("lifeBlink", 2, false, EnumBeeChromosome.LIFESPAN);
+        superLife = new AlleleInteger("lifeEon", 600, false, EnumBeeChromosome.LIFESPAN);
+        machineBoostEffect = new GTEffectMachineBoost();
+
+        if (GalaxySpace.isModLoaded() && TwilightForest.isModLoaded()) {
+            GTMod.GT_FML_LOGGER.info("treetwisterEffect: GalaxySpace and TwilightForest loaded, using default impl");
+            treetwisterEffect = new GTEffectTreeTwister();
+        } else {
+            GTMod.GT_FML_LOGGER
+                .info("treetwisterEffect: GalaxySpace or TwilightForest was not loaded, using fallback impl");
+            treetwisterEffect = GTAlleleEffect.FORESTRY_BASE_EFFECT;
+        }
+    }
+
+    private static class AlleleFloat extends Allele implements IAlleleFloat {
+
+        private final float value;
+
+        public AlleleFloat(String id, float val, boolean isDominant) {
+            super("gregtech." + id, "gregtech." + id, isDominant);
+            this.value = val;
+            AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPEED);
+        }
+
+        @Override
+        public float getValue() {
+            return this.value;
+        }
+    }
+
+    private static class AlleleInteger extends Allele implements IAlleleInteger {
+
+        private final int value;
+
+        public AlleleInteger(String id, int val, boolean isDominant, EnumBeeChromosome c) {
+            super("gregtech." + id, "gregtech." + id, isDominant);
+            this.value = val;
+            AlleleManager.alleleRegistry.registerAllele(this, c);
+        }
+
+        @Override
+        public int getValue() {
+            return this.value;
+        }
+    }
+
+    private static class AlleleArea extends Allele implements IAlleleArea {
+
+        private final int[] value;
+
+        public AlleleArea(String id, int rangeXZ, int rangeY, boolean isDominant) {
+            super("gregtech." + id, "gregtech." + id, isDominant);
+            this.value = new int[] { rangeXZ, rangeY, rangeXZ };
+            AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.TERRITORY);
+        }
+
+        @Override
+        public int[] getValue() {
+            return this.value;
+        }
+    }
+
+    public static class DimensionMutationCondition implements IMutationCondition {
+
+        final int dimID;
+        final String dimName;
+
+        public DimensionMutationCondition(int id, String name) {
+            dimID = id;
+            dimName = name;
+        }
+
+        @Override
+        public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+            IGenome genome1, IClimateProvider climate) {
+            if (world.provider.dimensionId == dimID) return 1;
+            return 0;
+        }
+
+        @Override
+        public String getDescription() {
+            return StringUtil.localizeAndFormat("mutation.condition.dim") + " " + dimName;
+        }
+    }
+
+    public static class BiomeIDMutationCondition implements IMutationCondition {
+
+        final int biomeID;
+        final String biomeName;
+
+        public BiomeIDMutationCondition(int id, String name) {
+            biomeID = id;
+            biomeName = name;
+        }
+
+        @Override
+        public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+            IGenome genome1, IClimateProvider climate) {
+            if (climate.getBiome().biomeID == biomeID) return 1;
+            return 0;
+        }
+
+        @Override
+        public String getDescription() {
+            if (BiomeGenBase.getBiome(biomeID) != null) {
+                return StringUtil.localizeAndFormat("mutation.condition.biomeid") + " " + biomeName;
+            }
+            return "";
+        }
+    }
+
+    public static class ActiveGTMachineMutationCondition implements IMutationCondition {
+
+        public ActiveGTMachineMutationCondition() {
+
+        }
+
+        @Override
+        public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+            IGenome genome1, IClimateProvider climate) {
+            TileEntity tileEntity = world.getTileEntity(x, y - 1, z);
+            if (tileEntity instanceof BaseMetaTileEntity machine) {
+                if (machine.isActive()) {
+                    return 1;
+                }
+            }
+            return 0;
+        }
+
+        @Override
+        public String getDescription() {
+            return "Needs a running GT Machine below to breed";
+        }
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GTBranchDefinition.java b/src/main/java/gregtech/loaders/misc/GTBranchDefinition.java
new file mode 100644
index 0000000000..9bc4acb114
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GTBranchDefinition.java
@@ -0,0 +1,207 @@
+package gregtech.loaders.misc;
+
+import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
+import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
+import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
+import static forestry.core.genetics.alleles.EnumAllele.Fertility;
+import static forestry.core.genetics.alleles.EnumAllele.Flowering;
+import static forestry.core.genetics.alleles.EnumAllele.Flowers;
+import static forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import static forestry.core.genetics.alleles.EnumAllele.Speed;
+import static forestry.core.genetics.alleles.EnumAllele.Territory;
+import static forestry.core.genetics.alleles.EnumAllele.Tolerance;
+import static gregtech.loaders.misc.GTBeeDefinition.getEffect;
+import static gregtech.loaders.misc.GTBeeDefinition.getFlowers;
+import static gregtech.loaders.misc.GTBeeDefinitionReference.EXTRABEES;
+import static gregtech.loaders.misc.GTBeeDefinitionReference.MAGICBEES;
+
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IClassification;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+
+public enum GTBranchDefinition {
+
+    ORGANIC("Fuelis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.WHEAT);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTER);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.SLOWEST);
+    }),
+    IC2("Industrialis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.SNOW);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.SLOW);
+    }),
+    GTALLOY("Amalgamis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.VANILLA);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.FAST);
+    }),
+    THAUMIC("Arcanis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "book"));
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.LONGEST);
+    }),
+    GEM("Ornamentis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.NETHER);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
+    }),
+    METAL("Metaliferis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+        AlleleHelper.instance.set(alleles, CAVE_DWELLING, true);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.JUNGLE);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOWER);
+    }),
+    RAREMETAL("Mineralis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.CACTI);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FAST);
+    }),
+    RADIOACTIVE("Criticalis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.END);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
+        AlleleHelper.instance.set(alleles, SPEED, GTBees.speedBlinding);
+        AlleleHelper.instance.set(alleles, SPEED, getEffect(EXTRABEES, "radioactive"));
+    }),
+    TWILIGHT("Nemoris Obscuri", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.VANILLA);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
+    }),
+    HEE("Finis Expansiones", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, true);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "book"));
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
+    }),
+    SPACE("Cosmicis", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(alleles, NOCTURNAL, true);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.LONGEST);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.FAST);
+        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
+    }),
+    PLANET("Planetaris", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.NORMAL);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
+    }),
+    NOBLEGAS("Nobilis Gasorum", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.NORMAL);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(alleles, TERRITORY, Territory.AVERAGE);
+    }),
+    INFUSEDSHARD("Infusa Shard", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(MAGICBEES, "rock"));
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
+    }),
+    ENDGAME("ENDUS GAMUS", alleles -> {
+        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_5);
+        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
+        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
+    });
+
+    private static IAllele[] defaultTemplate;
+    private final IClassification branch;
+    private final Consumer mBranchProperties;
+
+    GTBranchDefinition(String scientific, Consumer aBranchProperties) {
+        this.branch = BeeManager.beeFactory.createBranch(
+            this.name()
+                .toLowerCase(),
+            scientific);
+        this.mBranchProperties = aBranchProperties;
+    }
+
+    private static IAllele[] getDefaultTemplate() {
+        if (defaultTemplate == null) {
+            defaultTemplate = new IAllele[EnumBeeChromosome.values().length];
+
+            AlleleHelper.instance.set(defaultTemplate, SPEED, Speed.SLOWEST);
+            AlleleHelper.instance.set(defaultTemplate, LIFESPAN, Lifespan.SHORTER);
+            AlleleHelper.instance.set(defaultTemplate, FERTILITY, Fertility.NORMAL);
+            AlleleHelper.instance.set(defaultTemplate, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+            AlleleHelper.instance.set(defaultTemplate, NOCTURNAL, false);
+            AlleleHelper.instance.set(defaultTemplate, HUMIDITY_TOLERANCE, Tolerance.NONE);
+            AlleleHelper.instance.set(defaultTemplate, TOLERANT_FLYER, false);
+            AlleleHelper.instance.set(defaultTemplate, CAVE_DWELLING, false);
+            AlleleHelper.instance.set(defaultTemplate, FLOWER_PROVIDER, Flowers.VANILLA);
+            AlleleHelper.instance.set(defaultTemplate, FLOWERING, Flowering.SLOWEST);
+            AlleleHelper.instance.set(defaultTemplate, TERRITORY, Territory.AVERAGE);
+            AlleleHelper.instance.set(defaultTemplate, EFFECT, AlleleEffect.effectNone);
+        }
+        return Arrays.copyOf(defaultTemplate, defaultTemplate.length);
+    }
+
+    void setBranchProperties(IAllele[] template) {
+        this.mBranchProperties.accept(template);
+    }
+
+    public final IAllele[] getTemplate() {
+        IAllele[] template = getDefaultTemplate();
+        setBranchProperties(template);
+        return template;
+    }
+
+    public final IClassification getBranch() {
+        return branch;
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GT_Achievements.java b/src/main/java/gregtech/loaders/misc/GT_Achievements.java
deleted file mode 100644
index 1245a1dbaf..0000000000
--- a/src/main/java/gregtech/loaders/misc/GT_Achievements.java
+++ /dev/null
@@ -1,822 +0,0 @@
-package gregtech.loaders.misc;
-
-import static gregtech.api.enums.Mods.Thaumcraft;
-
-import java.util.concurrent.ConcurrentHashMap;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-import net.minecraft.stats.Achievement;
-import net.minecraft.stats.AchievementList;
-import net.minecraft.stats.StatBase;
-import net.minecraftforge.common.AchievementPage;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
-import net.minecraftforge.fluids.FluidStack;
-
-import cpw.mods.fml.common.FMLCommonHandler;
-import cpw.mods.fml.common.eventhandler.SubscribeEvent;
-import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
-import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent;
-import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.objects.ItemData;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Recipe;
-import gregtech.common.items.GT_MetaGenerated_Tool_01;
-import gregtech.common.items.ID_MetaTool_01;
-import ic2.core.Ic2Items;
-import thaumcraft.api.ThaumcraftApiHelper;
-
-public class GT_Achievements {
-
-    public static int oreReg = -1;
-    public static int assReg = -1;
-    public ConcurrentHashMap achievementList;
-    public ConcurrentHashMap issuedAchievements;
-    public int adjX = 5;
-    public int adjY = 9;
-
-    public GT_Achievements() {
-        this.achievementList = new ConcurrentHashMap<>();
-        this.issuedAchievements = new ConcurrentHashMap<>();
-
-        for (GT_Recipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
-            registerAssAchievement(recipe);
-        }
-
-        registerAchievement(
-            "flintpick",
-            0,
-            0,
-            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(2, 1, Materials.Flint, Materials.Wood, null),
-            "",
-            false);
-        registerAchievement("crops", -4, 0, GT_ModHandler.getIC2Item("crop", 1L), "flintpick", false);
-        registerAchievement("havestlead", -4, 2, ItemList.Crop_Drop_Plumbilia.get(1), "crops", false);
-        registerAchievement("havestcopper", -2, 1, ItemList.Crop_Drop_Coppon.get(1), "crops", false);
-        registerAchievement("havesttin", -2, -1, ItemList.Crop_Drop_Tine.get(1), "crops", false);
-        registerAchievement("havestoil", -4, -4, ItemList.Crop_Drop_OilBerry.get(1), "crops", false);
-        registerAchievement("havestiron", -2, -3, ItemList.Crop_Drop_Ferru.get(1), "crops", false);
-        registerAchievement("havestgold", -2, -6, ItemList.Crop_Drop_Aurelia.get(1), "havestiron", false);
-        registerAchievement("havestsilver", -4, -5, ItemList.Crop_Drop_Argentia.get(1), "havestiron", false);
-        registerAchievement("havestemeralds", -2, -8, ItemList.Crop_Drop_BobsYerUncleRanks.get(1), "havestgold", false);
-
-        registerAchievement(
-            "tools",
-            0,
-            4,
-            GT_MetaGenerated_Tool_01.INSTANCE
-                .getToolWithStats(ID_MetaTool_01.HARDHAMMER.ID, 1, Materials.Iron, Materials.Wood, null),
-            "flintpick",
-            false);
-        registerAchievement(
-            "driltime",
-            2,
-            4,
-            GT_MetaGenerated_Tool_01.INSTANCE
-                .getToolWithStats(ID_MetaTool_01.DRILL_LV.ID, 1, Materials.BlueSteel, Materials.StainlessSteel, null),
-            "tools",
-            false);
-        registerAchievement(
-            "brrrr",
-            2,
-            6,
-            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                ID_MetaTool_01.CHAINSAW_LV.ID,
-                1,
-                Materials.BlueSteel,
-                Materials.StainlessSteel,
-                null),
-            "driltime",
-            false);
-        registerAchievement(
-            "highpowerdrill",
-            3,
-            5,
-            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                ID_MetaTool_01.DRILL_HV.ID,
-                1,
-                Materials.TungstenSteel,
-                Materials.TungstenSteel,
-                null),
-            "driltime",
-            false);
-        registerAchievement(
-            "hammertime",
-            3,
-            7,
-            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                ID_MetaTool_01.JACKHAMMER.ID,
-                1,
-                Materials.TungstenSteel,
-                Materials.TungstenSteel,
-                null),
-            "highpowerdrill",
-            false);
-
-        registerAchievement(
-            "unitool",
-            -2,
-            4,
-            GT_MetaGenerated_Tool_01.INSTANCE
-                .getToolWithStats(ID_MetaTool_01.UNIVERSALSPADE.ID, 1, Materials.Steel, Materials.Iron, null),
-            "tools",
-            false);
-        registerAchievement("recycling", -4, 4, ItemList.Machine_LV_ArcFurnace.get(1), "unitool", false);
-
-        registerAchievement(
-            "crushed",
-            0,
-            6,
-            GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Tin, 1L),
-            "tools",
-            false);
-        registerAchievement(
-            "cleandust",
-            0,
-            10,
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
-            "crushed",
-            false);
-        registerAchievement(
-            "washing",
-            -2,
-            6,
-            GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Iron, 1L),
-            "crushed",
-            false);
-        registerAchievement(
-            "spinit",
-            -4,
-            6,
-            GT_OreDictUnificator.get(OrePrefixes.crushedCentrifuged, Materials.Redstone, 1L),
-            "crushed",
-            false);
-
-        registerAchievement("newfuel", -4, 8, ItemList.ThoriumCell_4.get(1), "spinit", false);
-        registerAchievement(
-            "newmetal",
-            -4,
-            10,
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 1L),
-            "newfuel",
-            false);
-        registerAchievement("reflect", -2, 9, ItemList.Neutron_Reflector.get(1), "newfuel", false);
-
-        registerAchievement(
-            "bronze",
-            2,
-            0,
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 1L),
-            "flintpick",
-            false);
-        registerAchievement(
-            "simplyeco",
-            2,
-            2,
-            ItemList.Machine_Bronze_Boiler_Solar.get(1, ItemList.Machine_HP_Solar.get(1L)),
-            "bronze",
-            false);
-        registerAchievement("firststeam", 2, -2, ItemList.Machine_Bronze_Boiler.get(1), "bronze", false);
-        registerAchievement("alloysmelter", 2, -4, ItemList.Machine_Bronze_AlloySmelter.get(1), "firststeam", false);
-        registerAchievement("macerator", 0, -2, ItemList.Machine_Bronze_Macerator.get(1), "firststeam", false);
-        registerAchievement("extract", 0, -4, ItemList.Machine_Bronze_Extractor.get(1), "alloysmelter", false);
-
-        registerAchievement("smallparts", 0, -5, ItemList.Circuit_Primitive.get(1), "alloysmelter", false);
-        registerAchievement("gtbasiccircuit", 0, -8, Ic2Items.electronicCircuit.copy(), "smallparts", false);
-        registerAchievement("bettercircuits", 0, -9, ItemList.Circuit_Good.get(1), "gtbasiccircuit", false);
-        registerAchievement("stepforward", -2, -9, Ic2Items.advancedCircuit.copy(), "bettercircuits", false);
-        registerAchievement("gtmonosilicon", -5, -10, ItemList.Circuit_Silicon_Ingot.get(1), "stepforward", false);
-        registerAchievement("gtlogicwafer", -7, -10, ItemList.Circuit_Wafer_ILC.get(1), "gtmonosilicon", false);
-        registerAchievement("gtlogiccircuit", -9, -10, ItemList.Circuit_Basic.get(1), "gtlogicwafer", false);
-        registerAchievement("gtcleanroom", -11, -10, ItemList.Machine_Multi_Cleanroom.get(1), "gtlogiccircuit", false);
-        registerAchievement("energyflow", -13, -10, ItemList.Circuit_Nanoprocessor.get(1), "gtcleanroom", false);
-        registerAchievement(
-            "gtquantumprocessor",
-            -13,
-            -12,
-            ItemList.Circuit_Quantumprocessor.get(1),
-            "energyflow",
-            false);
-        registerAchievement(
-            "gtcrystalprocessor",
-            -11,
-            -12,
-            ItemList.Circuit_Crystalprocessor.get(1),
-            "gtquantumprocessor",
-            false);
-        registerAchievement("gtwetware", -9, -12, ItemList.Circuit_Neuroprocessor.get(1), "gtcrystalprocessor", false);
-        registerAchievement("gtwetmain", -7, -12, ItemList.Circuit_Wetwaremainframe.get(1), "gtwetware", false);
-
-        registerAchievement("orbs", -10, -14, ItemList.Energy_LapotronicOrb.get(1), "energyflow", false);
-        registerAchievement("thatspower", -8, -14, ItemList.Energy_LapotronicOrb2.get(1), "orbs", false);
-        registerAchievement("datasaving", -2, -12, ItemList.Tool_DataOrb.get(1), "stepforward", false);
-        registerAchievement("superbuffer", 0, -12, ItemList.Automation_SuperBuffer_LV.get(1), "datasaving", false);
-        registerAchievement("newstorage", -2, -14, ItemList.Quantum_Chest_HV.get(1), "superbuffer", false);
-        registerAchievement("whereistheocean", 2, -14, ItemList.Quantum_Tank_IV.get(1), "superbuffer", false);
-        registerAchievement("luck", 2, -6, ItemList.ZPM.get(1), "", false);
-
-        registerAchievement(
-            "steel",
-            4,
-            0,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
-            "bronze",
-            false);
-        registerAchievement("highpressure", 4, 2, ItemList.Machine_Steel_Boiler.get(1), "steel", false);
-        registerAchievement(
-            "extremepressure",
-            4,
-            4,
-            ItemList.Machine_Multi_LargeBoiler_Steel.get(1),
-            "highpressure",
-            false);
-        registerAchievement("cheapermac", 6, 1, ItemList.Machine_LV_Hammer.get(1), "steel", false);
-        registerAchievement(
-            "complexalloys",
-            6,
-            3,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.BlueSteel, 1L),
-            "cheapermac",
-            false);
-
-        registerAchievement(
-            "magneticiron",
-            4,
-            -2,
-            GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1L),
-            "steel",
-            false);
-        registerAchievement("lvmotor", 4, -6, ItemList.Electric_Motor_LV.get(1), "magneticiron", false);
-        registerAchievement("pumpcover", 2, -8, ItemList.Electric_Pump_LV.get(1), "lvmotor", false);
-        registerAchievement("closeit", 2, -10, ItemList.Cover_Shutter.get(1), "pumpcover", false);
-        registerAchievement("slurp", 2, -12, ItemList.Pump_HV.get(1), "closeit", false);
-        registerAchievement("transport", 4, -10, ItemList.Conveyor_Module_LV.get(1), "lvmotor", false);
-        registerAchievement("manipulation", 4, -12, ItemList.Cover_Controller.get(1), "transport", false);
-        registerAchievement("buffer", 4, -14, ItemList.Automation_ChestBuffer_LV.get(1), "manipulation", false);
-        registerAchievement("complexmachines", 6, -9, ItemList.Robot_Arm_LV.get(1), "lvmotor", false);
-        registerAchievement("avengers", 8, -11, ItemList.Machine_LV_Assembler.get(1), "complexmachines", false);
-        registerAchievement("filterregulate", 10, -11, ItemList.Component_Filter.get(1), "avengers", false);
-
-        registerAchievement("steampower", 6, -6, ItemList.Generator_Steam_Turbine_LV.get(1), "lvmotor", false);
-        registerAchievement("batterys", 6, -4, ItemList.Battery_Buffer_2by2_MV.get(1), "steampower", false);
-        registerAchievement("badweather", 6, -8, ItemList.Casing_FireHazard.get(1), "steampower", false);
-        registerAchievement("electricproblems", 7, -7, ItemList.Casing_ExplosionHazard.get(1), "steampower", false);
-        registerAchievement("ebf", 8, -6, ItemList.Machine_Multi_BlastFurnace.get(1), "steampower", false);
-        registerAchievement("energyhatch", 12, -6, ItemList.Hatch_Energy_LV.get(1), "ebf", false);
-
-        registerAchievement(
-            "gtaluminium",
-            8,
-            0,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Aluminium, 1L),
-            "steel",
-            false);
-        registerAchievement("highpowersmelt", 8, 2, ItemList.Machine_Multi_Furnace.get(1), "gtaluminium", false);
-        registerAchievement("oilplant", 8, 4, ItemList.Distillation_Tower.get(1), "highpowersmelt", false);
-        registerAchievement("factory", 8, 6, ItemList.Processing_Array.get(1), "oilplant", false);
-        registerAchievement("upgradeebf", 8, -2, ItemList.Hatch_Energy_MV.get(1), "gtaluminium", false);
-        registerAchievement("maintainance", 10, -2, ItemList.Hatch_Maintenance.get(1), "upgradeebf", false);
-
-        registerAchievement("upgrade", 10, 0, ItemList.Casing_Coil_Kanthal.get(1), "gtaluminium", false);
-        registerAchievement(
-            "titan",
-            14,
-            0,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 1L),
-            "upgrade",
-            false);
-        registerAchievement("magic", 14, 3, ItemList.MagicEnergyConverter_LV.get(1), "titan", false);
-        registerAchievement("highmage", 10, 3, ItemList.MagicEnergyAbsorber_HV.get(1), "magic", false);
-        registerAchievement("artificaldia", 12, 2, ItemList.IC2_Industrial_Diamond.get(1), "titan", false);
-        registerAchievement("muchsteam", 13, 1, ItemList.LargeSteamTurbine.get(1), "titan", false);
-        registerAchievement("efficientsteam", 11, 1, ItemList.LargeSteamTurbine.get(1), "muchsteam", false);
-
-        registerAchievement("upgrade2", 16, 0, ItemList.Casing_Coil_Nichrome.get(1), "titan", false);
-        registerAchievement(
-            "tungsten",
-            16,
-            2,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tungsten, 1L),
-            "upgrade2",
-            false);
-        registerAchievement(
-            "osmium",
-            16,
-            -2,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 1L),
-            "upgrade2",
-            false);
-        registerAchievement("hightech", 15, -3, ItemList.Field_Generator_LV.get(1), "osmium", false);
-        registerAchievement("amplifier", 16, -5, ItemList.Machine_LV_Amplifab.get(1), "hightech", false);
-        registerAchievement("scanning", 13, -3, ItemList.Machine_HV_Scanner.get(1), "hightech", false);
-        registerAchievement("alienpower", 14, -5, ItemList.Generator_Naquadah_Mark_I.get(1), "hightech", false);
-        registerAchievement("universal", 15, -6, ItemList.Machine_LV_Massfab.get(1), "hightech", false);
-        registerAchievement("replication", 17, -6, ItemList.Machine_LV_Replicator.get(1), "universal", false);
-
-        registerAchievement(
-            "tungstensteel",
-            16,
-            4,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L),
-            "tungsten",
-            false);
-        registerAchievement("upgrade3", 15, 5, ItemList.Casing_Coil_TungstenSteel.get(1), "tungstensteel", false);
-        registerAchievement(
-            "hssg",
-            13,
-            5,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 1L),
-            "upgrade3",
-            false);
-        registerAchievement("upgrade4", 11, 5, ItemList.Casing_Coil_HSSG.get(1), "hssg", false);
-        registerAchievement(
-            "stargatematerial",
-            11,
-            7,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1L),
-            "upgrade4",
-            false);
-        registerAchievement("conducting", 14, 6, ItemList.Casing_Coil_Superconductor.get(1), "upgrade3", false);
-        registerAchievement("fusion", 15, 7, ItemList.FusionComputer_LuV.get(1), "tungstensteel", false);
-        registerAchievement("higherefficency", 15, 9, ItemList.Generator_Plasma_EV.get(1), "fusion", false);
-        registerAchievement("advancing", 13, 7, ItemList.FusionComputer_ZPMV.get(1), "fusion", false);
-
-        registerAchievement("stargateliquid", 11, 9, ItemList.Generator_Plasma_IV.get(1), "advancing", false);
-        registerAchievement("tothelimit", 13, 9, ItemList.Generator_Plasma_IV.get(1), "advancing", false);
-        registerAchievement("fullefficiency", 12, 10, ItemList.Generator_Plasma_LuV.get(1), "tothelimit", false);
-        registerAchievement("upgrade5", 9, 9, ItemList.Casing_Coil_Naquadah.get(1), "stargateliquid", false);
-        registerAchievement(
-            "alienmetallurgy",
-            9,
-            7,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 1L),
-            "upgrade5",
-            false);
-        registerAchievement("over9000", 7, 7, ItemList.Casing_Coil_NaquadahAlloy.get(1), "alienmetallurgy", false);
-        registerAchievement(
-            "finalpreparations",
-            7,
-            9,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadria, 1L),
-            "over9000",
-            false);
-        registerAchievement("denseaspossible", 6, 10, ItemList.FusionComputer_UV.get(1), "finalpreparations", false);
-
-        registerAchievement("zpmage", 8, 10, ItemList.Energy_Module.get(1), "denseaspossible", false);
-        registerAchievement("uvage", 10, 10, ItemList.Energy_Cluster.get(1), "zpmage", false);
-        registerAchievement("whatnow", 12, 10, ItemList.ZPM2.get(1), "uvage", false);
-
-        if (GT_Mod.gregtechproxy.mAchievements) {
-            AchievementPage.registerAchievementPage(
-                new AchievementPage(
-                    "GregTech 5",
-                    this.achievementList.values()
-                        .toArray(new Achievement[0])));
-            MinecraftForge.EVENT_BUS.register(this);
-            FMLCommonHandler.instance()
-                .bus()
-                .register(this);
-        }
-    }
-
-    public static void registerOre(Materials aMaterial, int min, int max, int chance, boolean overworld, boolean nether,
-        boolean end) {}
-
-    public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, Achievement requirement,
-        boolean special) {
-        if (!GT_Mod.gregtechproxy.mAchievements) {
-            return null;
-        }
-        Achievement achievement = new Achievement(textId, textId, this.adjX + x, this.adjY + y, icon, requirement);
-        if (special) {
-            achievement.setSpecial();
-        }
-        ((StatBase) achievement).registerStat();
-        if (GT_Values.D2) {
-            GT_Log.out.println("achievement." + textId + "=");
-            GT_Log.out.println("achievement." + textId + ".desc=");
-        }
-        this.achievementList.put(textId, achievement);
-        return achievement;
-    }
-
-    public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, String requirement,
-        boolean special) {
-        if (!GT_Mod.gregtechproxy.mAchievements) {
-            return null;
-        }
-        Achievement achievement = new Achievement(
-            textId,
-            textId,
-            this.adjX + x,
-            this.adjY + y,
-            icon,
-            getAchievement(requirement));
-        if (special) {
-            achievement.setSpecial();
-        }
-        ((StatBase) achievement).registerStat();
-        if (GT_Values.D2) {
-            GT_Log.out.println("achievement." + textId + "=");
-            GT_Log.out.println("achievement." + textId + ".desc=");
-        }
-        this.achievementList.put(textId, achievement);
-        return achievement;
-    }
-
-    public Achievement registerOreAchievement(Materials aMaterial) {
-        return null;
-    }
-
-    public Achievement registerAssAchievement(GT_Recipe recipe) {
-        if (recipe == null) {
-            GT_Mod.GT_FML_LOGGER.error("Invalid achievement registration attempt for null recipe", new Exception());
-            return null;
-        }
-        if (recipe.getOutput(0) == null) {
-            GT_Mod.GT_FML_LOGGER
-                .error("Invalid achievement registration attempt for recipe with null output", new Exception());
-            return null;
-        }
-        if (this.achievementList.get(
-            recipe.getOutput(0)
-                .getUnlocalizedName())
-            == null) {
-            assReg++;
-            return registerAchievement(
-                recipe.getOutput(0)
-                    .getUnlocalizedName(),
-                -(11 + assReg % 5),
-                ((assReg) / 5) - 8,
-                recipe.getOutput(0),
-                AchievementList.openInventory,
-                false);
-        }
-        return null;
-    }
-
-    public void issueAchievement(EntityPlayer entityplayer, String textId) {
-        if (entityplayer == null || !GT_Mod.gregtechproxy.mAchievements) {
-            return;
-        }
-        entityplayer.triggerAchievement(this.achievementList.get(textId));
-    }
-
-    public Achievement getAchievement(String textId) {
-        if (this.achievementList.containsKey(textId)) {
-            return this.achievementList.get(textId);
-        }
-        return null;
-    }
-
-    public void issueAchivementHatch(EntityPlayer player, ItemStack stack) {
-        if (player == null || stack == null) {
-            return;
-        }
-        ItemData data = GT_OreDictUnificator.getItemData(stack);
-
-        if ((data != null) && (data.mPrefix == OrePrefixes.ingot)) {
-            if (data.mMaterial.mMaterial == Materials.Aluminium) {
-                issueAchievement(player, "gtaluminium");
-            } else if (data.mMaterial.mMaterial == Materials.Titanium) {
-                issueAchievement(player, "titan");
-            } else if (data.mMaterial.mMaterial == Materials.BlueSteel) {
-                issueAchievement(player, "complexalloys");
-            } else if (data.mMaterial.mMaterial == Materials.Tungsten) {
-                issueAchievement(player, "tungsten");
-            } else if (data.mMaterial.mMaterial == Materials.Osmium) {
-                issueAchievement(player, "osmium");
-            } else if (data.mMaterial.mMaterial == Materials.TungstenSteel) {
-                issueAchievement(player, "tungstensteel");
-            } else if (data.mMaterial.mMaterial == Materials.HSSG) {
-                issueAchievement(player, "hssg");
-            } else if (data.mMaterial.mMaterial == Materials.Naquadah) {
-                issueAchievement(player, "stargatematerial");
-            } else if (data.mMaterial.mMaterial == Materials.NaquadahAlloy) {
-                issueAchievement(player, "alienmetallurgy");
-            } else if (data.mMaterial.mMaterial == Materials.Naquadria) {
-                issueAchievement(player, "finalpreparations");
-            }
-        }
-        if (stack.getUnlocalizedName()
-            .equals("ic2.itemPartIndustrialDiamond")) {
-            issueAchievement(player, "artificaldia");
-            issueAchievement(player, "buildCoalDiamond");
-        }
-    }
-
-    public void issueAchivementHatchFluid(EntityPlayer player, FluidStack fluid) {
-        if (player == null || fluid == null) {
-            return;
-        }
-        switch (fluid.getFluid()
-            .getUnlocalizedName()) {
-            case "fluid.plasma.helium" -> issueAchievement(player, "fusion");
-            case "fluid.molten.europium" -> issueAchievement(player, "advancing");
-            case "fluid.molten.naquadah" -> issueAchievement(player, "stargateliquid");
-            case "fluid.molten.americium" -> issueAchievement(player, "tothelimit");
-            case "fluid.molten.neutronium" -> issueAchievement(player, "denseaspossible");
-            case "fluid.plasma.nitrogen" -> issueAchievement(player, "higherefficency");
-        }
-    }
-
-    @SubscribeEvent
-    public void onCrafting(ItemCraftedEvent event) {
-        EntityPlayer player = event.player;
-        ItemStack stack = event.crafting;
-        if (player == null || stack == null) {
-            return;
-        }
-        ItemData data = GT_OreDictUnificator.getItemData(stack);
-        if (data != null) {
-            if (data.mPrefix == OrePrefixes.dust && data.mMaterial.mMaterial == Materials.Bronze) {
-                issueAchievement(player, "bronze");
-            }
-        }
-        switch (stack.getUnlocalizedName()) {
-            case "gt.metaitem.01.2300" -> issueAchievement(player, "bronze");
-            case "gt.metaitem.01.32700" -> issueAchievement(player, "smallparts");
-            case "gt.metaitem.01.32702" -> issueAchievement(player, "bettercircuits");
-            case "gt.metaitem.01.23354" -> issueAchievement(player, "magneticiron");
-            case "gt.metaitem.01.32600" -> {
-                issueAchievement(player, "lvmotor");
-                issueAchievement(player, "buildCable");
-            }
-            case "gt.metaitem.01.32610" -> issueAchievement(player, "pumpcover");
-            case "gt.metaitem.01.32630" -> issueAchievement(player, "transport");
-            case "gt.metaitem.01.32650" -> issueAchievement(player, "complexmachines");
-            case "gt.metaitem.01.32670" -> issueAchievement(player, "hightech");
-            case "ic2.blockCrop" -> issueAchievement(player, "crops");
-            case "ic2.itemPartCircuit" -> issueAchievement(player, "gtbasiccircuit");
-            case "ic2.itemPartCircuitAdv" -> issueAchievement(player, "stepforward");
-            case "gt.blockmachines.boiler.solar" -> issueAchievement(player, "simplyeco");
-            case "gt.blockmachines.boiler.bronze" -> issueAchievement(player, "firststeam");
-            case "gt.blockmachines.boiler.steel" -> issueAchievement(player, "highpressure");
-            case "gt.blockmachines.bronzemachine.macerator" -> {
-                issueAchievement(player, "macerator");
-                issueAchievement(player, "buildMacerator");
-            }
-            case "gt.blockmachines.bronzemachine.alloysmelter.tier.3" -> issueAchievement(player, "buildIndFurnace");
-            case "gt.blockmachines.bronzemachine.alloysmelter" -> {
-                issueAchievement(player, "alloysmelter");
-                issueAchievement(player, "buildElecFurnace");
-            }
-
-            case "gt.blockmachines.bronzemachine.extractor" -> {
-                issueAchievement(player, "extract");
-                issueAchievement(player, "buildCompressor");
-                issueAchievement(player, "buildExtractor");
-            }
-            case "gt.blockmachines.basicmachine.pump.tier.03" -> issueAchievement(player, "slurp");
-            case "gt.blockmachines.multimachine.blastfurnace" -> issueAchievement(player, "ebf");
-            case "gt.blockmachines.hatch.energy.tier.02" -> issueAchievement(player, "upgradeebf");
-            case "gt.blockmachines.multimachine.multifurnace" -> issueAchievement(player, "highpowersmelt");
-            case "gt.blockmachines.hatch.energy.tier.01" -> issueAchievement(player, "energyhatch");
-            case "gt.blockmachines.multimachine.processingarray" -> issueAchievement(player, "factory");
-            case "gt.blockmachines.basicgenerator.magicenergyconverter.tier.01" -> issueAchievement(player, "magic");
-            case "gt.blockmachines.basicgenerator.magicenergyabsorber.tier.03" -> issueAchievement(player, "highmage");
-            case "gt.blockmachines.basicgenerator.plasmagenerator.tier.07" -> issueAchievement(
-                player,
-                "fullefficiency");
-            case "gt.blockmachines.multimachine.largeturbine" -> issueAchievement(player, "muchsteam");
-            case "gt.blockmachines.multimachine.largehpturbine" -> issueAchievement(player, "efficientsteam");
-            case "gt.blockmachines.multimachine.cleanroom" -> issueAchievement(player, "gtcleanroom");
-            case "gt.neutronreflector" -> issueAchievement(player, "reflect");
-            case "gt.blockcasings5.1" -> issueAchievement(player, "upgrade");
-            case "gt.blockcasings5.2" -> issueAchievement(player, "upgrade2");
-            case "gt.blockcasings5.3" -> issueAchievement(player, "upgrade3");
-            case "gt.blockcasings5.4" -> issueAchievement(player, "upgrade4");
-            case "gt.blockcasings5.5" -> issueAchievement(player, "upgrade5");
-            case "gt.blockcasings5.6" -> issueAchievement(player, "over9000");
-            case "gt.blockcasings.15" -> issueAchievement(player, "conducting");
-        }
-
-        if (!stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.")) {
-            return;
-        }
-
-        // from here, it only concerns "gt.blockmachines." kind of achievements
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicmachine.arcfurnace.tier.")) {
-            issueAchievement(player, "recycling");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicmachine.disassembler.tier.")) {
-            issueAchievement(player, "repair");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.automation.superbuffer.tier.")) {
-            issueAchievement(player, "superbuffer");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.quantum.tank.tier.")) {
-            issueAchievement(player, "whereistheocean");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.quantum.chest.tier.")) {
-            issueAchievement(player, "newstorage");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicmachine.hammer.tier.")) {
-            issueAchievement(player, "cheapermac");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.automation.chestbuffer.tier.")) {
-            issueAchievement(player, "buffer");
-            issueAchievement(player, "buildBatBox");
-            if (stack.getUnlocalizedName()
-                .startsWith("gt.blockmachines.automation.chestbuffer.tier.3")) {
-                issueAchievement(player, "buildMFE");
-            }
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicgenerator.steamturbine.tier.")) {
-            issueAchievement(player, "steampower");
-            issueAchievement(player, "buildGenerator");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicmachine.assembler.tier.")) {
-            issueAchievement(player, "avengers");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.batterybuffer.")) {
-            issueAchievement(player, "batterys");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicmachine.amplifab.tier.")) {
-            issueAchievement(player, "amplifier");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicmachine.massfab.tier.")) {
-            issueAchievement(player, "universal");
-            issueAchievement(player, "buildMassFab");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicgenerator.naquadah.tier.")) {
-            issueAchievement(player, "alienpower");
-            return;
-        }
-        if (stack.getUnlocalizedName()
-            .startsWith("gt.blockmachines.basicmachine.replicator.tier.")) {
-            issueAchievement(player, "replication");
-            return;
-        }
-
-    }
-
-    @SubscribeEvent
-    public void onSmelting(ItemSmeltedEvent event) {
-        EntityPlayer player = event.player;
-        ItemStack stack = event.smelting;
-        if (player == null || stack == null) {
-            return;
-        }
-        if (stack.getItem() == Items.bread) {
-            event.player.triggerAchievement(AchievementList.makeBread);
-        }
-    }
-
-    @SubscribeEvent
-    public void onItemPickup(EntityItemPickupEvent event) {
-        EntityPlayer player = event.entityPlayer;
-        ItemStack stack = event.item.getEntityItem();
-        if (player == null || stack == null) {
-            return;
-        }
-        ItemData data = GT_OreDictUnificator.getItemData(stack);
-        if (data != null && data.mPrefix != null) {
-            if (data.mPrefix == OrePrefixes.dust) {
-                if (data.mMaterial.mMaterial == Materials.Lutetium) {
-                    issueAchievement(player, "newmetal");
-                }
-                if (data.mMaterial.mMaterial != Materials.Gunpowder) {
-                    issueAchievement(player, "cleandust");
-                }
-            } else if (data.mPrefix.name()
-                .startsWith("ore")) {
-                    int data_getAllMaterialStacks_sS = data.getAllMaterialStacks()
-                        .size();
-                    for (int i = 0; i < data_getAllMaterialStacks_sS; i++) {
-                        issueAchievement(
-                            player,
-                            data.getAllMaterialStacks()
-                                .get(i).mMaterial.mName);
-                        if (data.getAllMaterialStacks()
-                            .get(i).mMaterial == Materials.AnyIron) {
-                            issueAchievement(player, "iron");
-                        }
-                        if (data.getAllMaterialStacks()
-                            .get(i).mMaterial == Materials.Copper
-                            || data.getAllMaterialStacks()
-                                .get(i).mMaterial == Materials.Tin) {
-                            issueAchievement(event.entityPlayer, "mineOre");
-                        }
-                    }
-                } else if (data.mPrefix == OrePrefixes.crushed) {
-                    issueAchievement(player, "crushed");
-                } else if (data.mPrefix == OrePrefixes.crushedPurified) {
-                    issueAchievement(player, "washing");
-                } else if (data.mPrefix == OrePrefixes.crushedCentrifuged) {
-                    issueAchievement(player, "spinit");
-                } else if (data.mMaterial.mMaterial == Materials.Steel) {
-                    if (data.mPrefix == OrePrefixes.ingot && stack.stackSize == stack.getMaxStackSize()) {
-                        issueAchievement(player, "steel");
-                    } else if (data.mPrefix == OrePrefixes.nugget && Thaumcraft.isModLoaded()
-                        && ThaumcraftApiHelper.isResearchComplete(player.getDisplayName(), "GT_IRON_TO_STEEL")) {
-                            issueAchievement(player, "steel");
-                        }
-                }
-        }
-        // GT_FML_LOGGER.info(stack.getUnlocalizedName());
-        switch (stack.getUnlocalizedName()) {
-            case "gt.metaitem.02.32500" -> issueAchievement(player, "havestlead");
-            case "gt.metaitem.02.32501" -> issueAchievement(player, "havestsilver");
-            case "gt.metaitem.02.32503" -> issueAchievement(player, "havestiron");
-            case "gt.metaitem.02.32504" -> issueAchievement(player, "havestgold");
-            case "gt.metaitem.02.32530" -> issueAchievement(player, "havestcopper");
-            case "gt.metaitem.02.32540" -> issueAchievement(player, "havesttin");
-            case "gt.metaitem.02.32510" -> issueAchievement(player, "havestoil");
-            case "gt.metaitem.02.32511" -> issueAchievement(player, "havestemeralds");
-            case "gt.metaitem.03.32082" -> issueAchievement(player, "energyflow");
-            case "gt.metaitem.01.32702" -> issueAchievement(player, "bettercircuits");
-            case "gt.metaitem.01.32707" -> issueAchievement(player, "datasaving");
-            case "gt.metaitem.01.32597" -> issueAchievement(player, "orbs");
-            case "gt.metaitem.01.32599" -> issueAchievement(player, "thatspower");
-            case "gt.metaitem.01.32598" -> issueAchievement(player, "luck");
-            case "gt.metaitem.01.32749" -> issueAchievement(player, "closeit");
-            case "gt.metaitem.01.32730" -> issueAchievement(player, "manipulation");
-            case "gt.metaitem.01.32729" -> issueAchievement(player, "filterregulate");
-            case "gt.metaitem.01.32605" -> issueAchievement(player, "whatnow");
-            case "gt.metaitem.01.32736" -> issueAchievement(player, "zpmage");
-            case "gt.metaitem.01.32737" -> issueAchievement(player, "uvage");
-            case "gt.metaitem.03.32030" -> issueAchievement(player, "gtmonosilicon");
-            case "gt.metaitem.03.32036" -> issueAchievement(player, "gtlogicwafer");
-            case "gt.metaitem.01.32701" -> issueAchievement(player, "gtlogiccircuit");
-            case "gt.metaitem.03.32085" -> issueAchievement(player, "gtquantumprocessor");
-            case "gt.metaitem.03.32089" -> issueAchievement(player, "gtcrystalprocessor");
-            case "gt.metaitem.03.32092" -> issueAchievement(player, "gtwetware");
-            case "gt.metaitem.03.32095" -> issueAchievement(player, "gtwetmain");
-            case "gt.Thoriumcell" -> issueAchievement(player, "newfuel");
-            case "ic2.itemPartCircuitAdv" -> issueAchievement(player, "stepforward");
-            case "gt.blockcasings5.1" -> issueAchievement(player, "upgrade");
-            case "gt.blockcasings5.2" -> issueAchievement(player, "upgrade2");
-            case "gt.blockcasings5.3" -> issueAchievement(player, "upgrade3");
-            case "gt.blockcasings5.4" -> issueAchievement(player, "upgrade4");
-            case "gt.blockcasings5.5" -> issueAchievement(player, "upgrade5");
-            case "gt.blockcasings5.6" -> issueAchievement(player, "over9000");
-            case "gt.blockcasings.15" -> issueAchievement(player, "conducting");
-            case "gt.metaitem.01.32761" -> { // Debug Scanner pickup shows all assline recipes.
-                if (player.capabilities.isCreativeMode) {
-                    for (GT_Recipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
-                        issueAchievement(
-                            player,
-                            recipe.getOutput(0)
-                                .getUnlocalizedName());
-                        recipe.mHidden = false;
-                    }
-                }
-            }
-        }
-
-        if ((stack.getItem() == Ic2Items.quantumBodyarmor.getItem())
-            || (stack.getItem() == Ic2Items.quantumBoots.getItem())
-            || (stack.getItem() == Ic2Items.quantumHelmet.getItem())
-            || (stack.getItem() == Ic2Items.quantumLeggings.getItem())) {
-            issueAchievement(player, "buildQArmor");
-        }
-
-        for (GT_Recipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
-            if (recipe.getOutput(0)
-                .getUnlocalizedName()
-                .equals(stack.getUnlocalizedName())) {
-                issueAchievement(
-                    player,
-                    recipe.getOutput(0)
-                        .getUnlocalizedName());
-                recipe.mHidden = false;
-            }
-        }
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java b/src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java
deleted file mode 100644
index 87292ced62..0000000000
--- a/src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java
+++ /dev/null
@@ -1,2831 +0,0 @@
-package gregtech.loaders.misc;
-
-import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
-import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
-import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
-import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
-import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
-import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
-import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
-import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
-import static forestry.api.apiculture.EnumBeeChromosome.SPECIES;
-import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
-import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
-import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
-import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
-import static forestry.api.core.EnumHumidity.ARID;
-import static forestry.api.core.EnumHumidity.DAMP;
-import static forestry.api.core.EnumTemperature.COLD;
-import static forestry.api.core.EnumTemperature.HELLISH;
-import static forestry.api.core.EnumTemperature.HOT;
-import static forestry.api.core.EnumTemperature.ICY;
-import static forestry.api.core.EnumTemperature.NORMAL;
-import static forestry.api.core.EnumTemperature.WARM;
-import static forestry.core.genetics.alleles.EnumAllele.Fertility;
-import static forestry.core.genetics.alleles.EnumAllele.Flowering;
-import static forestry.core.genetics.alleles.EnumAllele.Flowers;
-import static forestry.core.genetics.alleles.EnumAllele.Lifespan;
-import static forestry.core.genetics.alleles.EnumAllele.Speed;
-import static forestry.core.genetics.alleles.EnumAllele.Territory;
-import static forestry.core.genetics.alleles.EnumAllele.Tolerance;
-import static gregtech.api.enums.Mods.AdvancedSolarPanel;
-import static gregtech.api.enums.Mods.AppliedEnergistics2;
-import static gregtech.api.enums.Mods.Avaritia;
-import static gregtech.api.enums.Mods.AvaritiaAddons;
-import static gregtech.api.enums.Mods.BiomesOPlenty;
-import static gregtech.api.enums.Mods.CropsPlusPlus;
-import static gregtech.api.enums.Mods.EnderStorage;
-import static gregtech.api.enums.Mods.ExtraBees;
-import static gregtech.api.enums.Mods.ExtraCells2;
-import static gregtech.api.enums.Mods.ExtraUtilities;
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.enums.Mods.GalacticraftCore;
-import static gregtech.api.enums.Mods.GalacticraftMars;
-import static gregtech.api.enums.Mods.GalaxySpace;
-import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
-import static gregtech.api.enums.Mods.IndustrialCraft2;
-import static gregtech.api.enums.Mods.MagicBees;
-import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
-import static gregtech.api.enums.Mods.PamsHarvestCraft;
-import static gregtech.api.enums.Mods.TaintedMagic;
-import static gregtech.api.enums.Mods.Thaumcraft;
-import static gregtech.api.enums.Mods.ThaumicBases;
-import static gregtech.api.enums.Mods.TinkerConstruct;
-import static gregtech.loaders.misc.GT_BeeDefinitionReference.EXTRABEES;
-import static gregtech.loaders.misc.GT_BeeDefinitionReference.FORESTRY;
-import static gregtech.loaders.misc.GT_BeeDefinitionReference.GENDUSTRY;
-import static gregtech.loaders.misc.GT_BeeDefinitionReference.GREGTECH;
-import static gregtech.loaders.misc.GT_BeeDefinitionReference.MAGICBEES;
-
-import java.awt.Color;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.function.Consumer;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import org.apache.commons.lang3.text.WordUtils;
-
-import com.elisis.gtnhlanth.common.register.WerkstoffMaterialPool;
-
-import cpw.mods.fml.common.registry.GameRegistry;
-import forestry.api.apiculture.BeeManager;
-import forestry.api.apiculture.EnumBeeType;
-import forestry.api.apiculture.IAlleleBeeEffect;
-import forestry.api.apiculture.IAlleleBeeSpecies;
-import forestry.api.apiculture.IBee;
-import forestry.api.apiculture.IBeeGenome;
-import forestry.api.apiculture.IBeeMutationCustom;
-import forestry.api.core.EnumHumidity;
-import forestry.api.core.EnumTemperature;
-import forestry.api.genetics.AlleleManager;
-import forestry.api.genetics.IAllele;
-import forestry.api.genetics.IAlleleFlowers;
-import forestry.api.genetics.IMutationCustom;
-import forestry.apiculture.genetics.Bee;
-import forestry.apiculture.genetics.IBeeDefinition;
-import forestry.apiculture.genetics.alleles.AlleleEffect;
-import forestry.core.genetics.alleles.AlleleHelper;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.MaterialsKevlar;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_JubilanceMegaApiary;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.common.bees.GT_AlleleBeeSpecies;
-import gregtech.common.bees.GT_Bee_Mutation;
-import gregtech.common.items.CombType;
-import gregtech.common.items.DropType;
-import gregtech.common.items.PropolisType;
-import gregtech.loaders.misc.bees.GT_Flowers;
-
-/**
- * Bride Class for Lambdas
- */
-class GT_BeeDefinitionReference {
-
-    protected static final byte FORESTRY = 0;
-    protected static final byte EXTRABEES = 1;
-    protected static final byte GENDUSTRY = 2;
-    protected static final byte MAGICBEES = 3;
-    protected static final byte GREGTECH = 4;
-
-    private GT_BeeDefinitionReference() {}
-}
-
-public enum GT_BeeDefinition implements IBeeDefinition {
-
-    // organic
-    CLAY(GT_BranchDefinition.ORGANIC, "Clay", true, new Color(0xC8C8DA), new Color(0x0000FF), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
-        beeSpecies.addProduct(new ItemStack(Items.clay_ball, 1), 0.15f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(BiomesOPlenty.ID, "mudball", 1, 0), 0.05f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> {
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.VANILLA);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Diligent"), 10);
-        tMutation.requireResource(Blocks.clay, 0); // blockStainedHardenedClay
-    }),
-    SLIMEBALL(GT_BranchDefinition.ORGANIC, "SlimeBall", true, new Color(0x4E9E55), new Color(0x00FF15), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 15), 0.30f);
-        beeSpecies.addProduct(new ItemStack(Items.slime_ball, 1), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STICKY), 0.05f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        if (TinkerConstruct.isModLoaded()) {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(TinkerConstruct.ID, "strangeFood", 1, 0), 0.10f);
-            beeSpecies.addSpecialty(GT_ModHandler.getModItem(TinkerConstruct.ID, "slime.gel", 1, 2), 0.02f);
-        }
-    }, template -> {
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.MUSHROOMS);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "water"));
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Marshy"), CLAY, 7);
-        if (TinkerConstruct.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(TinkerConstruct.ID, "slime.gel"), 1);
-    }),
-    PEAT(GT_BranchDefinition.ORGANIC, "Peat", true, new Color(0x906237), new Color(0x58300B), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LIGNIE), 0.30f);
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.15f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(Forestry.ID, "peat", 1, 0), 0.15f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(Forestry.ID, "mulch", 1, 0), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
-    }, dis -> dis.registerMutation(getSpecies(FORESTRY, "Rural"), CLAY, 10)),
-    STICKYRESIN(GT_BranchDefinition.ORGANIC, "StickyResin", true, new Color(0x2E8F5B), new Color(0xDCC289),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STICKY), 0.15f);
-            beeSpecies.addSpecialty(ItemList.IC2_Resin.get(1), 0.15f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(SLIMEBALL, PEAT, 15);
-            tMutation.requireResource("logRubber");
-        }),
-    COAL(GT_BranchDefinition.ORGANIC, "Coal", true, new Color(0x666666), new Color(0x525252), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LIGNIE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.COAL), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> {
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.CACTI);
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectCreeper);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Industrious"), PEAT, 9);
-        tMutation.requireResource("blockCoal");
-    }),
-    OIL(GT_BranchDefinition.ORGANIC, "Oil", true, new Color(0x4C4C4C), new Color(0x333333), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OIL), 0.75f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL);
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "water"));
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
-    }, dis -> dis.registerMutation(COAL, STICKYRESIN, 4)),
-    SANDWICH(GT_BranchDefinition.ORGANIC, "Sandwich", true, new Color(0x32CD32), new Color(0xDAA520), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
-        beeSpecies.addSpecialty(ItemList.Food_Sliced_Cucumber.get(1), 0.05f);
-        beeSpecies.addSpecialty(ItemList.Food_Sliced_Onion.get(1), 0.05f);
-        beeSpecies.addSpecialty(ItemList.Food_Sliced_Tomato.get(1), 0.05f);
-        beeSpecies.addSpecialty(ItemList.Food_Sliced_Cheese.get(1), 0.05f);
-        beeSpecies.addSpecialty(new ItemStack(Items.cooked_porkchop, 1, 0), 0.05f);
-        beeSpecies.addSpecialty(new ItemStack(Items.cooked_beef, 1, 0), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectFertile);
-        AlleleHelper.instance.set(template, TERRITORY, Territory.LARGE);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
-    }, dis -> dis.registerMutation(getSpecies(FORESTRY, "Agrarian"), getSpecies(MAGICBEES, "TCBatty"), 10)),
-    ASH(GT_BranchDefinition.ORGANIC, "Ash", true, new Color(0x1e1a18), new Color(0xc6c6c6), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ASH), 0.15f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.NORMAL);
-        AlleleHelper.instance.set(template, TERRITORY, Territory.LARGE);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(COAL, CLAY, 10);
-        tMutation.restrictTemperature(HELLISH);
-    }),
-    APATITE(GT_BranchDefinition.ORGANIC, "Apatite", true, new Color(0xc1c1f6), new Color(0x676784), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.APATITE), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(WARM);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(ASH, COAL, 10);
-        tMutation.requireResource("blockApatite");
-    }),
-    FERTILIZER(GT_BranchDefinition.ORGANIC, "Fertilizer", true, new Color(0x7fcef5), new Color(0x654525),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
-            beeSpecies.addSpecialty(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1), 0.2f);
-            beeSpecies.addSpecialty(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1), 0.2f);
-            beeSpecies.addSpecialty(ItemList.FR_Fertilizer.get(1), 0.3f);
-            beeSpecies.addSpecialty(ItemList.IC2_Fertilizer.get(1), 0.3f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(WARM);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
-            AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
-        }, dis -> dis.registerMutation(ASH, APATITE, 8)),
-    // Phosphorus bee, Humidity: normal, Temperature: Hot, Parents: Apatite & Ash, Mutationrate: 12%, Combrate: 55%
-    PHOSPHORUS(GT_BranchDefinition.ORGANIC, "Phosphorus", false, new Color(0xFFC826), new Color(0xC1C1F6),
-        beeSpecies -> {
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PHOSPHORUS), 0.35f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(HOT);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(APATITE, ASH, 12);
-            tMutation.restrictTemperature(HOT);
-            GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockGem2, 8));
-        }),
-    // Tea bee, Humidity: normal, Parents: Ash and Fertilizer, Mutationrate: 10%, combrate: 10%
-    TEA(GT_BranchDefinition.ORGANIC, "Tea", false, new Color(0x65D13A), new Color(0x9a9679), beeSpecies -> {
-        beeSpecies.addProduct(
-            GT_ModHandler.getModItem(PamsHarvestCraft.ID, "tealeafItem", 1, ItemList.Crop_Drop_TeaLeaf.get(1)),
-            0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST),
-        dis -> dis.registerMutation(FERTILIZER, ASH, 10)),
-    // Mica bee, Humidity: normal, Parents: Silicon & PEAT, Mutationrate: 15%, Combrate: 25%
-    MICA(GT_BranchDefinition.ORGANIC, "Mica", false, new Color(0xFFC826), new Color(0xC1C1F6), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MICA), 0.25f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(PEAT, getSpecies(MAGICBEES, "Silicon"), 15);
-        GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockCasings5, 0));
-    }),
-
-    // gems
-    REDSTONE(GT_BranchDefinition.GEM, "Redstone", true, new Color(0x7D0F0F), new Color(0xD11919), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDSTONE), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.RAREEARTH), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Demonic"), 10);
-        tMutation.requireResource("blockRedstone");
-    }),
-    LAPIS(GT_BranchDefinition.GEM, "Lapis", true, new Color(0x1947D1), new Color(0x476CDA), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LAPIS), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(FORESTRY, "Demonic"), getSpecies(FORESTRY, "Imperial"), 10);
-        tMutation.requireResource("blockLapis");
-    }),
-    CERTUS(GT_BranchDefinition.GEM, "CertusQuartz", true, new Color(0x57CFFB), new Color(0xBBEEFF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CERTUS), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Hermitic"), LAPIS, 10);
-        tMutation.requireResource(GameRegistry.findBlock(AppliedEnergistics2.ID, "tile.BlockQuartz"), 0);
-    }),
-    FLUIX(GT_BranchDefinition.GEM, "FluixDust", true, new Color(0xA375FF), new Color(0xB591FF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FLUIX), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, LAPIS, 7);
-        tMutation.requireResource(GameRegistry.findBlock(AppliedEnergistics2.ID, "tile.BlockFluix"), 0);
-    }),
-    DIAMOND(GT_BranchDefinition.GEM, "Diamond", false, new Color(0xCCFFFF), new Color(0xA3CCCC), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DIAMOND), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(CERTUS, COAL, 3);
-        tMutation.requireResource("blockDiamond");
-    }),
-    RUBY(GT_BranchDefinition.GEM, "Ruby", false, new Color(0xE6005C), new Color(0xCC0052), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.RUBY), 0.15f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.REDGARNET), 0.05f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, DIAMOND, 5);
-        tMutation.requireResource("blockRuby");
-    }),
-    SAPPHIRE(GT_BranchDefinition.GEM, "Sapphire", true, new Color(0x0033CC), new Color(0x00248F), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SAPPHIRE), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(CERTUS, LAPIS, 5);
-        tMutation.requireResource(GregTech_API.sBlockGem2, 12);
-    }),
-    OLIVINE(GT_BranchDefinition.GEM, "Olivine", true, new Color(0x248F24), new Color(0xCCFFCC), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OLIVINE), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MAGNESIUM), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER),
-        dis -> dis.registerMutation(CERTUS, getSpecies(FORESTRY, "Ended"), 5)),
-    EMERALD(GT_BranchDefinition.GEM, "Emerald", false, new Color(0x248F24), new Color(0x2EB82E), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.EMERALD), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ALUMINIUM), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(OLIVINE, DIAMOND, 4);
-        tMutation.requireResource("blockEmerald");
-    }),
-    REDGARNET(GT_BranchDefinition.GEM, "RedGarnet", false, new Color(0xBD4C4C), new Color(0xECCECE), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDGARNET), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PYROPE), 0.05f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(WARM);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, RUBY, 4);
-        tMutation.requireResource("blockGarnetRed");
-    }),
-    YELLOWGARNET(GT_BranchDefinition.GEM, "YellowGarnet", false, new Color(0xA3A341), new Color(0xEDEDCE),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.YELLOWGARNET), 0.15f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.GROSSULAR), 0.05f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(WARM);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(EMERALD, REDGARNET, 3);
-            tMutation.requireResource("blockGarnetYellow");
-        }),
-    FIRESTONE(GT_BranchDefinition.GEM, "Firestone", false, new Color(0xC00000), new Color(0xFF0000), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FIRESTONE), 0.15f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(WARM);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, RUBY, 4);
-        tMutation.requireResource("blockFirestone");
-    }),
-
-    // Metal Line
-    COPPER(GT_BranchDefinition.METAL, "Copper", true, new Color(0xFF6600), new Color(0xE65C00), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.COPPER), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.GOLD), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Majestic"), CLAY, 13);
-        tMutation.requireResource("blockCopper");
-    }),
-    TIN(GT_BranchDefinition.METAL, "Tin", true, new Color(0xD4D4D4), new Color(0xDDDDDD), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TIN), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ZINC), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(CLAY, getSpecies(FORESTRY, "Diligent"), 13);
-        tMutation.requireResource("blockTin");
-    }),
-    LEAD(GT_BranchDefinition.METAL, "Lead", true, new Color(0x666699), new Color(0xA3A3CC), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LEAD), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SULFUR), 0.05f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(WARM);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(COAL, COPPER, 13);
-        tMutation.requireResource("blockLead");
-    }),
-    IRON(GT_BranchDefinition.METAL, "Iron", true, new Color(0xDA9147), new Color(0xDE9C59), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.IRON), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.TIN), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(TIN, COPPER, 13);
-        tMutation.requireResource("blockIron");
-    }),
-    STEEL(GT_BranchDefinition.METAL, "Steel", true, new Color(0x808080), new Color(0x999999), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STEEL), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRON), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(WARM);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(IRON, COAL, 10);
-        tMutation.requireResource(GregTech_API.sBlockMetal6, 13);
-    }),
-    NICKEL(GT_BranchDefinition.METAL, "Nickel", true, new Color(0x8585AD), new Color(0x8585AD), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NICKEL), 0.15f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLATINUM), 0.02f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(IRON, COPPER, 13);
-        tMutation.requireResource("blockNickel");
-    }),
-    ZINC(GT_BranchDefinition.METAL, "Zinc", true, new Color(0xF0DEF0), new Color(0xF2E1F2), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ZINC), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.GALLIUM), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(IRON, TIN, 13);
-        tMutation.requireResource("blockZinc");
-    }),
-    SILVER(GT_BranchDefinition.METAL, "Silver", true, new Color(0xC2C2D6), new Color(0xCECEDE), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SILVER), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SULFUR), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, TIN, 10);
-        tMutation.requireResource("blockSilver");
-    }),
-    CRYOLITE(GT_BranchDefinition.METAL, "Cryolite", true, new Color(0xBFEFFF), new Color(0x73B9D0), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CRYOLITE), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SILVER), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(WARM);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.FASTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, SILVER, 9);
-        tMutation.requireResource("blockCryolite");
-    }),
-    GOLD(GT_BranchDefinition.METAL, "Gold", true, new Color(0xEBC633), new Color(0xEDCC47), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.GOLD), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NICKEL), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(WARM);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, COPPER, 13);
-        tMutation.requireResource("blockGold");
-        tMutation.restrictTemperature(HOT);
-    }),
-    ARSENIC(GT_BranchDefinition.METAL, "Arsenic", true, new Color(0x736C52), new Color(0x292412), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ARSENIC), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(WARM);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(ZINC, SILVER, 10);
-        tMutation.requireResource("blockArsenic");
-    }),
-
-    // Rare Metals
-    ALUMINIUM(GT_BranchDefinition.RAREMETAL, "Aluminium", true, new Color(0xB8B8FF), new Color(0xD6D6FF),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ALUMINIUM), 0.15f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.BAUXITE), 0.05f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(HOT);
-        }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(NICKEL, ZINC, 9);
-            tMutation.requireResource("blockAluminium");
-        }),
-    TITANIUM(GT_BranchDefinition.RAREMETAL, "Titanium", true, new Color(0xCC99FF), new Color(0xDBB8FF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TITANIUM), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ALMANDINE), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, ALUMINIUM, 5);
-        tMutation.requireResource(GregTech_API.sBlockMetal7, 9);
-    }),
-    GLOWSTONE(GT_BranchDefinition.RAREMETAL, "Glowstone", false, new Color(0xE5CA2A), new Color(0xFFBC5E),
-        beeSpecies -> {
-            beeSpecies.addSpecialty(Materials.Glowstone.getDust(1), 0.20f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL),
-        dis -> dis.registerMutation(REDSTONE, GOLD, 10)),
-    SUNNARIUM(GT_BranchDefinition.RAREMETAL, "Sunnarium", false, new Color(0xFFBC5E), new Color(0xE5CA2A),
-        beeSpecies -> {
-            beeSpecies.addProduct(Materials.Glowstone.getDust(1), 0.30f);
-            beeSpecies.addSpecialty(Materials.Sunnarium.getDust(1), 0.05f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(GLOWSTONE, GOLD, 5);
-            GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockCasings1, 15));
-        }),
-    CHROME(GT_BranchDefinition.RAREMETAL, "Chrome", true, new Color(0xEBA1EB), new Color(0xF2C3F2), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CHROME), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MAGNESIUM), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(TITANIUM, RUBY, 5);
-        tMutation.requireResource(GregTech_API.sBlockMetal2, 3);
-    }),
-    MANGANESE(GT_BranchDefinition.RAREMETAL, "Manganese", true, new Color(0xD5D5D5), new Color(0xAAAAAA),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MANGANESE), 0.15f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRON), 0.05f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(HOT);
-        }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(TITANIUM, ALUMINIUM, 5);
-            tMutation.requireResource(GregTech_API.sBlockMetal4, 6);
-        }),
-    TUNGSTEN(GT_BranchDefinition.RAREMETAL, "Tungsten", false, new Color(0x5C5C8A), new Color(0x7D7DA1), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TUNGSTEN), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MOLYBDENUM), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Heroic"), MANGANESE, 5);
-        tMutation.requireResource(GregTech_API.sBlockMetal7, 11);
-    }),
-    PLATINUM(GT_BranchDefinition.RAREMETAL, "Platinum", false, new Color(0xE6E6E6), new Color(0xFFFFCC), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLATINUM), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRIDIUM), 0.02f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, CHROME, 5);
-        tMutation.requireResource("blockNickel");
-    }),
-    IRIDIUM(GT_BranchDefinition.RAREMETAL, "Iridium", false, new Color(0xDADADA), new Color(0xD1D1E0), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.IRIDIUM), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OSMIUM), 0.05f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PALLADIUM), 0.30f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(TUNGSTEN, PLATINUM, 5);
-        tMutation.requireResource(GregTech_API.sBlockMetal3, 12);
-    }),
-    OSMIUM(GT_BranchDefinition.RAREMETAL, "Osmium", false, new Color(0x2B2BDA), new Color(0x8B8B8B), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OSMIUM), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRIDIUM), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(TUNGSTEN, PLATINUM, 5);
-        tMutation.requireResource(GregTech_API.sBlockMetal5, 9);
-    }),
-    SALTY(GT_BranchDefinition.RAREMETAL, "Salt", true, new Color(0xF0C8C8), new Color(0xFAFAFA), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SALT), 0.35f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LITHIUM), 0.05f);
-        beeSpecies.addSpecialty(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Borax, 1L), 0.1f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(WARM);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(CLAY, ALUMINIUM, 5);
-        tMutation.requireResource("blockSalt");
-    }),
-    LITHIUM(GT_BranchDefinition.RAREMETAL, "Lithium", false, new Color(0xF0328C), new Color(0xE1DCFF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LITHIUM), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SALT), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(SALTY, ALUMINIUM, 5);
-        tMutation.requireResource("frameGtLithium");
-    }),
-    ELECTROTINE(GT_BranchDefinition.RAREMETAL, "Electrotine", false, new Color(0x1E90FF), new Color(0x3CB4C8),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ELECTROTINE), 0.15f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDSTONE), 0.05f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(HOT);
-        }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, GOLD, 5);
-            tMutation.requireResource("blockElectrotine");
-        }),
-    // Sulfur bee, Humidity: normal, Temperature: Hot, Parents: PEAT & Ash, Mutationrate: 15%, Combrate: 80%
-    SULFUR(GT_BranchDefinition.RAREMETAL, "Sulfur", false, new Color(0x1E90FF), new Color(0x3CB4C8), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SULFUR), 0.70f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FIRESTONE), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.NORMAL),
-        dis -> dis.registerMutation(ASH, PEAT, 15)),
-
-    INDIUM(GT_BranchDefinition.RAREMETAL, "Indium", false, new Color(0xFFA9FF), new Color(0x8F5D99), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INDIUM), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(LEAD, OSMIUM, 1);
-        tMutation.requireResource("blockIndium");
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(39, "Venus")); // Venus Dim
-        // Harder mutation that isn't dim locked
-        tMutation = dis.registerMutation(SILVER, OSMIUM, 1);
-        tMutation.requireResource("blockCinobiteA243");
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(60, "Bedrock")); // Thaumic Tinkerer
-                                                                                               // Bedrock Dim
-    }),
-
-    // IC2
-    COOLANT(GT_BranchDefinition.IC2, "Coolant", false, new Color(0x144F5A), new Color(0x2494A2), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 4), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.COOLANT), 0.15f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectGlacial);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(FORESTRY, "Icy"), getSpecies(FORESTRY, "Glacial"), 10);
-        tMutation.requireResource(
-            Block.getBlockFromItem(
-                GT_ModHandler.getModItem(IndustrialCraft2.ID, "fluidCoolant", 1)
-                    .getItem()),
-            0);
-        tMutation.restrictTemperature(ICY);
-    }),
-    ENERGY(GT_BranchDefinition.IC2, "Energy", false, new Color(0xC11F1F), new Color(0xEBB9B9), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 12), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENERGY), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(WARM);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(FORESTRY, "Demonic"), getSpecies(EXTRABEES, "volcanic"), 10);
-        tMutation.requireResource(
-            Block.getBlockFromItem(
-                GT_ModHandler.getModItem(IndustrialCraft2.ID, "fluidHotCoolant", 1)
-                    .getItem()),
-            0);
-        tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(128, "Boneyard Biome")); // Boneyard Biome
-    }),
-    LAPOTRON(GT_BranchDefinition.IC2, "Lapotron", false, new Color(0x6478FF), new Color(0x1414FF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LAPIS), 0.20f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENERGY), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LAPOTRON), 0.10f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(LAPIS, ENERGY, 6);
-        tMutation.requireResource("blockLapis");
-        tMutation.restrictTemperature(ICY);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(28, "Moon")); // moon dim
-    }),
-    PYROTHEUM(GT_BranchDefinition.IC2, "Pyrotheum", false, new Color(0xffebc4), new Color(0xe36400), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ENERGY), 0.20f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PYROTHEUM), 0.15f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, ENERGY, 4);
-        tMutation.restrictTemperature(HELLISH);
-    }),
-    CRYOTHEUM(GT_BranchDefinition.IC2, "Cryotheum", false, new Color(0x2660ff), new Color(0x5af7ff), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BLIZZ), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CRYOTHEUM), 0.20f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, COOLANT, 4);
-        tMutation.restrictTemperature(ICY);
-    }),
-    Explosive(GT_BranchDefinition.IC2, "explosive", false, new Color(0x7E270F), new Color(0x747474), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getIC2Item("industrialTnt", 1L), 0.2f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(FIRESTONE, COAL, 4);
-        tMutation.requireResource(GameRegistry.findBlock(IndustrialCraft2.ID, "blockITNT"), 0);
-    }),
-    // Alloy
-    REDALLOY(GT_BranchDefinition.GTALLOY, "RedAlloy", false, new Color(0xE60000), new Color(0xB80000), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDALLOY), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(COPPER, REDSTONE, 10);
-        tMutation.requireResource("blockRedAlloy");
-    }),
-    REDSTONEALLOY(GT_BranchDefinition.GTALLOY, "RedStoneAlloy", false, new Color(0xA50808), new Color(0xE80000),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDSTONEALLOY), 0.15f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, REDALLOY, 8);
-            tMutation.requireResource("blockRedstoneAlloy");
-        }),
-    CONDUCTIVEIRON(GT_BranchDefinition.GTALLOY, "ConductiveIron", false, new Color(0xCEADA3), new Color(0x817671),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CONDUCTIVEIRON), 0.15f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(WARM);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONEALLOY, IRON, 8);
-            tMutation.requireResource("blockConductiveIron");
-        }),
-    ENERGETICALLOY(GT_BranchDefinition.GTALLOY, "EnergeticAlloy", false, new Color(0xFF9933), new Color(0xFFAD5C),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENERGETICALLOY), 0.15f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(REDSTONEALLOY, getSpecies(FORESTRY, "Demonic"), 9);
-            tMutation.requireResource("blockEnergeticAlloy");
-        }),
-    VIBRANTALLOY(GT_BranchDefinition.GTALLOY, "VibrantAlloy", false, new Color(0x86A12D), new Color(0xC4F2AE),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.VIBRANTALLOY), 0.15f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-            AlleleHelper.instance.set(template, FLOWERING, Flowering.FAST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(ENERGETICALLOY, getSpecies(FORESTRY, "Phantasmal"), 6);
-            tMutation.requireResource("blockVibrantAlloy");
-            tMutation.restrictTemperature(HOT, HELLISH);
-        }),
-    ELECTRICALSTEEL(GT_BranchDefinition.GTALLOY, "ElectricalSteel", false, new Color(0x787878), new Color(0xD8D8D8),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ELECTRICALSTEEL), 0.15f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(STEEL, getSpecies(FORESTRY, "Demonic"), 9);
-            tMutation.requireResource("blockElectricalSteel");
-        }),
-    DARKSTEEL(GT_BranchDefinition.GTALLOY, "DarkSteel", false, new Color(0x252525), new Color(0x443B44), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DARKSTEEL), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(ELECTRICALSTEEL, getSpecies(FORESTRY, "Demonic"), 7);
-        tMutation.requireResource("blockDarkSteel");
-    }),
-    PULSATINGIRON(GT_BranchDefinition.GTALLOY, "PulsatingIron", false, new Color(0x6DD284), new Color(0x006600),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PULSATINGIRON), 0.15f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(REDALLOY, getSpecies(FORESTRY, "Ended"), 9);
-            tMutation.requireResource("blockPulsatingIron");
-        }),
-    STAINLESSSTEEL(GT_BranchDefinition.GTALLOY, "StainlessSteel", false, new Color(0xC8C8DC), new Color(0x778899),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STEEL), 0.10f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STAINLESSSTEEL), 0.15f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CHROME), 0.05f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(HOT);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(CHROME, STEEL, 9);
-            tMutation.requireResource("blockStainlessSteel");
-        }),
-    ENDERIUM(GT_BranchDefinition.GTALLOY, "Enderium", false, new Color(0x599087), new Color(0x2E8B57), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDERIUM), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CHROME), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(HOT);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, GT_Bees.speedBlinding);
-        AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "teleport"));
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(PLATINUM, getSpecies(FORESTRY, "Phantasmal"), 3);
-        tMutation.requireResource("blockEnderium");
-    }),
-    BEDROCKIUM(GT_BranchDefinition.GTALLOY, "Bedrockium", false, new Color(0x0C0C0C), new Color(0xC6C6C6),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.BEDROCKIUM), 0.55f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(HOT);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
-            AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "gravity"));
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(Explosive, DIAMOND, 2);
-            if (ExtraUtilities.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(ExtraUtilities.ID, "block_bedrockium"), 0);
-        }),
-
-    // thaumic
-    THAUMIUMDUST(GT_BranchDefinition.THAUMIC, "ThaumiumDust", true, new Color(0x7A007A), new Color(0x5C005C),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.THAUMIUMDUST), 0.20f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
-            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectExploration);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis
-                .registerMutation(getSpecies(MAGICBEES, "TCFire"), getSpecies(FORESTRY, "Edenic"), 10);
-            tMutation.requireResource("blockThaumium");
-            tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
-                                                                                                         // forest
-        }),
-    THAUMIUMSHARD(GT_BranchDefinition.THAUMIC, "ThaumiumShard", true, new Color(0x9966FF), new Color(0xAD85FF),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.THAUMIUMDUST), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.THAUMIUMSHARD), 0.20f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
-            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectGlacial);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, getSpecies(MAGICBEES, "TCWater"), 10);
-            tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
-                                                                                                         // forest
-        }),
-    AMBER(GT_BranchDefinition.THAUMIC, "Amber", true, new Color(0xEE7700), new Color(0x774B15), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.AMBER), 0.20f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, STICKYRESIN, 10);
-        tMutation.requireResource("blockAmber");
-    }),
-    QUICKSILVER(GT_BranchDefinition.THAUMIC, "Quicksilver", true, new Color(0x7A007A), new Color(0x5C005C),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.QUICKSILVER), 0.20f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
-            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMiasmic);
-        }, dis -> dis.registerMutation(THAUMIUMDUST, SILVER, 10)),
-    SALISMUNDUS(GT_BranchDefinition.THAUMIC, "SalisMundus", true, new Color(0xF7ADDE), new Color(0x592582),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.20f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
-            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMiasmic);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, THAUMIUMSHARD, 8);
-            tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
-                                                                                                         // forest
-        }),
-    TAINTED(GT_BranchDefinition.THAUMIC, "Tainted", true, new Color(0x904BB8), new Color(0xE800FF), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.TAINTED), 0.20f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, CAVE_DWELLING, true);
-        AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, THAUMIUMSHARD, 7);
-        tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(193, "Tainted Land")); // Tainted Land
-    }),
-    MITHRIL(GT_BranchDefinition.THAUMIC, "Mithril", true, new Color(0xF0E68C), new Color(0xFFFFD2), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLATINUM), 0.20f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MITHRIL), 0.125f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> {
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, CAVE_DWELLING, true);
-        AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
-    }, new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(IO, PLATINUM, 7);
-            tMutation.requireResource(GregTech_API.sBlockMetal4, 10);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(36, "IO")); // IO Dim
-        }
-    }),
-    ASTRALSILVER(GT_BranchDefinition.THAUMIC, "AstralSilver", true, new Color(0xAFEEEE), new Color(0xE6E6FF),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SILVER), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ASTRALSILVER), 0.125f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, NOCTURNAL, true);
-            AlleleHelper.instance.set(template, CAVE_DWELLING, true);
-            AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
-            AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(SILVER, IRON, 3);
-            tMutation.requireResource(GregTech_API.sBlockMetal1, 6);
-        }),
-    THAUMINITE(GT_BranchDefinition.THAUMIC, "Thauminite", true, new Color(0x2E2D79), new Color(0x7581E0),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "comb", 1, 19), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.THAUMINITE), 0.125f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-            AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
-            AlleleHelper.instance.set(template, NOCTURNAL, true);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "TCOrder"), THAUMIUMDUST, 8);
-            if (ThaumicBases.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(ThaumicBases.ID, "thauminiteBlock"), 0);
-        }),
-    SHADOWMETAL(GT_BranchDefinition.THAUMIC, "ShadowMetal", true, new Color(0x100322), new Color(0x100342),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "comb", 1, 20), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SHADOWMETAL), 0.125f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-            AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
-            AlleleHelper.instance.set(template, NOCTURNAL, true);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis
-                .registerMutation(getSpecies(MAGICBEES, "TCChaos"), getSpecies(MAGICBEES, "TCVoid"), 6);
-            if (TaintedMagic.isModLoaded()) {
-                tMutation.requireResource("blockShadow");
-            }
-        }),
-    DIVIDED(GT_BranchDefinition.THAUMIC, "Unstable", true, new Color(0xF0F0F0), new Color(0xDCDCDC), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 61), 0.20f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DIVIDED), 0.125f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, IRON, 3);
-        if (ExtraUtilities.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(ExtraUtilities.ID, "decorativeBlock1"), 5);
-    }),
-    CAELESTIS(GT_BranchDefinition.THAUMIC, "Caelestis", true, new Color(0xF0F0F0), new Color(0xDCDCDC), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CAELESTISRED), 0.60f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CAELESTISBLUE), 0.60f);
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CAELESTISGREEN), 0.60f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-    }, dis -> dis.registerMutation(DIAMOND, DIVIDED, 10)),
-    SPARKELING(GT_BranchDefinition.THAUMIC, "NetherStar", true, new Color(0x7A007A), new Color(0xFFFFFF),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "miscResources", 1, 3), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SPARKLING), 0.125f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        }, template -> {
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
-            AlleleHelper.instance.set(template, NOCTURNAL, true);
-            AlleleHelper.instance.set(template, CAVE_DWELLING, true);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectAggressive);
-            AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis
-                .registerMutation(getSpecies(MAGICBEES, "Withering"), getSpecies(MAGICBEES, "Draconic"), 1);
-            tMutation.requireResource(GregTech_API.sBlockGem3, 3);
-            tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(9, "END Biome")); // sky end biome
-        }),
-
-    ESSENTIA(GT_BranchDefinition.THAUMIC, "Essentia", true, new Color(0x7A007A), new Color(0xFFFFFF), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "miscResources", 1, 3), 0.20f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-    }, template -> {
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
-        AlleleHelper.instance.set(template, CAVE_DWELLING, true);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.VANILLA);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectReanimation);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(SHADOWMETAL, SPARKELING, 5);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 6);
-    }),
-
-    DRAKE(GT_BranchDefinition.THAUMIC, "Drake", true, new Color(0x100322), new Color(0x7A007A), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.DRACONIC), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.AWAKENEDDRACONIUM), 0.20f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-    }, template -> {
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_3);
-        AlleleHelper.instance.set(template, CAVE_DWELLING, false);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.END);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectDrunkard);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(ESSENTIA, THAUMINITE, 5);
-        GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockCasings5, 8));
-    }),
-
-    // radioctive
-    URANIUM(GT_BranchDefinition.RADIOACTIVE, "Uranium", true, new Color(0x19AF19), new Color(0x169E16), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.URANIUM), 0.15f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setNocturnal();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Avenging"), PLATINUM, 3);
-        tMutation.requireResource(GregTech_API.sBlockMetal7, 14);
-    }),
-    PLUTONIUM(GT_BranchDefinition.RADIOACTIVE, "Plutonium", true, new Color(0x570000), new Color(0x240000),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LEAD), 0.15f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PLUTONIUM), 0.15f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(ICY);
-            beeSpecies.setNocturnal();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(URANIUM, EMERALD, 3);
-            tMutation.requireResource(GregTech_API.sBlockMetal5, 13);
-        }),
-    NAQUADAH(GT_BranchDefinition.RADIOACTIVE, "Naquadah", false, new Color(0x003300), new Color(0x002400),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAQUADAH), 0.15f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(ICY);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(PLUTONIUM, IRIDIUM, 3);
-            tMutation.requireResource(GregTech_API.sBlockMetal4, 12);
-        }),
-    NAQUADRIA(GT_BranchDefinition.RADIOACTIVE, "Naquadria", false, new Color(0x000000), new Color(0x002400),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAQUADAH), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAQUADRIA), 0.15f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(ICY);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(PLUTONIUM, IRIDIUM, 8, 10);
-            tMutation.requireResource(GregTech_API.sBlockMetal4, 15);
-        }),
-    DOB(GT_BranchDefinition.RADIOACTIVE, "DOB", false, new Color(0x003300), new Color(0x002400), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.DOB), 0.75f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(NAQUADAH, THAUMIUMSHARD, 2);
-        if (AdvancedSolarPanel.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(AdvancedSolarPanel.ID, "BlockAdvSolarPanel"), 2);
-        tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(9, "END Biome")); // sky end biome
-    }),
-    THORIUM(GT_BranchDefinition.RADIOACTIVE, "Thorium", false, new Color(0x005000), new Color(0x001E00), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.THORIUM), 0.75f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setNocturnal();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-    }, dis -> {
-        IMutationCustom tMutation = dis.registerMutation(COAL, URANIUM, 3)
-            .setIsSecret();
-        tMutation.requireResource(GregTech_API.sBlockMetal7, 5);
-    }),
-    LUTETIUM(GT_BranchDefinition.RADIOACTIVE, "Lutetium", false, new Color(0xE6FFE6), new Color(0xFFFFFF),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LUTETIUM), 0.15f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        }, dis -> {
-            IMutationCustom tMutation = dis.registerMutation(THORIUM, getSpecies(EXTRABEES, "rotten"), 1)
-                .setIsSecret();
-            tMutation.requireResource(GregTech_API.sBlockMetal4, 3);
-        }),
-    AMERICIUM(GT_BranchDefinition.RADIOACTIVE, "Americium", false, new Color(0xE6E6FF), new Color(0xC8C8C8),
-        beeSpecies -> {
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.AMERICIUM), 0.075f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-            // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
-            beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        }, dis -> {
-            IMutationCustom tMutation = dis.registerMutation(LUTETIUM, CHROME, 5, 4)
-                .setIsSecret();
-            GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockMachines, 32020));
-        }),
-    NEUTRONIUM(GT_BranchDefinition.RADIOACTIVE, "Neutronium", false, new Color(0xFFF0F0), new Color(0xFAFAFA),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEUTRONIUM), 0.02f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(HELLISH);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-            AlleleHelper.instance.set(template, NOCTURNAL, true);
-        }, dis -> {
-            IMutationCustom tMutation = dis.registerMutation(NAQUADRIA, AMERICIUM, 2, 2)
-                .setIsSecret();
-            tMutation.requireResource(GregTech_API.sBlockMetal5, 2);
-        }),
-    // Twilight
-    NAGA(GT_BranchDefinition.TWILIGHT, "Naga", true, new Color(0x0D5A0D), new Color(0x28874B), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.02f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAGA), 0.10f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(MAGICBEES, "Eldritch"), getSpecies(FORESTRY, "Imperial"), 8);
-        tMutation.restrictHumidity(DAMP);
-    }),
-    LICH(GT_BranchDefinition.TWILIGHT, "Lich", true, new Color(0xC5C5C5), new Color(0x5C605E), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.04f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LICH), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Supernatural"), NAGA, 7);
-        tMutation.restrictHumidity(ARID);
-    }),
-    HYDRA(GT_BranchDefinition.TWILIGHT, "Hydra", true, new Color(0x872836), new Color(0xB8132C), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.06f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.HYDRA), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(LICH, getSpecies(MAGICBEES, "TCFire"), 6);
-        tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(138, "Undergarden")); // undergarden biome
-    }),
-    URGHAST(GT_BranchDefinition.TWILIGHT, "UrGhast", true, new Color(0xA7041C), new Color(0x7C0618), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.08f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.URGHAST), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-        beeSpecies.setNocturnal();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(HYDRA, THAUMIUMDUST, 5);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCosmeticSolid"), 4);
-        tMutation.restrictTemperature(HELLISH);
-    }),
-    SNOWQUEEN(GT_BranchDefinition.TWILIGHT, "SnowQueen", true, new Color(0xD02001), new Color(0x9C0018), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SNOWQUEEN), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setHasEffect();
-        beeSpecies.setNocturnal();
-    }, template -> {}, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(URGHAST, SALISMUNDUS, 4);
-        if (ThaumicBases.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(ThaumicBases.ID, "blockSalisMundus"), 0);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // HEE
-    ENDDUST(GT_BranchDefinition.HEE, "End Dust", true, new Color(0xCC00FA), new Color(0x003A7D), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDDUST), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), STAINLESSSTEEL, 8);
-
-        tMutation.restrictHumidity(ARID);
-        if (HardcoreEnderExpansion.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "end_powder_ore"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-    }),
-    ENDIUM(GT_BranchDefinition.HEE, "Endium", true, new Color(0xa0ffff), new Color(0x2F5A6C), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDIUM), 0.10f);
-        beeSpecies.addSpecialty(GT_Bees.propolis.getStackForType(PropolisType.Endium), 0.15f);
-        beeSpecies.addSpecialty(GT_Bees.drop.getStackForType(DropType.ENDERGOO), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), THAUMIUMDUST, 8);
-        tMutation.restrictHumidity(ARID);
-        if (HardcoreEnderExpansion.isModLoaded()) tMutation.requireResource("blockHeeEndium");
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-    }),
-    STARDUST(GT_BranchDefinition.HEE, "Star Dust", true, new Color(0xffff00), new Color(0xDCBE13), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STARDUST), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, GT_Bees.speedBlinding);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), ZINC, 8);
-        tMutation.restrictHumidity(ARID);
-        if (HardcoreEnderExpansion.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "stardust_ore"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-    }),
-    ECTOPLASMA(GT_BranchDefinition.HEE, "Ectoplasma", true, new Color(0xDCB0E5), new Color(0x381C40), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ECTOPLASMA), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), ENDDUST, 5);
-        tMutation.restrictHumidity(ARID);
-        if (HardcoreEnderExpansion.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "spooky_log"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-    }),
-    ARCANESHARDS(GT_BranchDefinition.HEE, "Arcane Shards", true, new Color(0x9010AD), new Color(0x333D82),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ARCANESHARD), 0.10f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONG);
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMSHARD, ENDDUST, 5);
-            tMutation.restrictHumidity(ARID);
-            if (HardcoreEnderExpansion.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "laboratory_floor"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-        }),
-    DRAGONESSENCE(GT_BranchDefinition.HEE, "Dragonessence", true, new Color(0xFFA12B), new Color(0x911ECE),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DRAGONESSENCE), 0.10f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-            AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectBeatific);
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_3);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_3);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(ECTOPLASMA, ARCANESHARDS, 4);
-            tMutation.restrictHumidity(ARID);
-            if (HardcoreEnderExpansion.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "essence_altar"), 1);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-        }),
-    FIREESSENCE(GT_BranchDefinition.HEE, "Fireessence", true, new Color(0xD41238), new Color(0xFFA157), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FIREESSENSE), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.ELONGATED);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_3);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_3);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(FIRESTONE, ARCANESHARDS, 4);
-        tMutation.restrictHumidity(ARID);
-        if (HardcoreEnderExpansion.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "essence_altar"), 2);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-    }),
-    ENDERMANHEAD(GT_BranchDefinition.HEE, "EndermanHead", true, new Color(0x161616), new Color(0x6200e7),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDERMAN), 0.10f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(EnumTemperature.NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-            AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "teleport"));
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(ENDERIUM, STARDUST, 4);
-            tMutation.restrictHumidity(ARID);
-            if (HardcoreEnderExpansion.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "ender_goo"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-        }),
-    SILVERFISH(GT_BranchDefinition.HEE, "Silverfisch", true, new Color(0xEE053D), new Color(0x000000), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SILVERFISH), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-        AlleleHelper.instance.set(template, EFFECT, getEffect(MAGICBEES, "SlowSpeed"));
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(ECTOPLASMA, STARDUST, 5);
-        tMutation.restrictHumidity(ARID);
-        if (HardcoreEnderExpansion.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "ender_goo"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-    }),
-    RUNE(GT_BranchDefinition.HEE, "Rune", true, new Color(0xE31010), new Color(0x0104D9), beeSpecies -> {
-        beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.RUNEI), 0.025f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.RUNEII), 0.0125f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, LIFESPAN, GT_Bees.superLife);
-        AlleleHelper.instance.set(template, EFFECT, getEffect(MAGICBEES, "SlowSpeed"));
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
-    }, dis -> {
-        IMutationCustom tMutation = dis.registerMutation(DRAGONESSENCE, STARDUST, 2)
-            .setIsSecret();
-        tMutation.restrictHumidity(ARID);
-        if (EnderStorage.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(EnderStorage.ID, "enderChest"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
-    }),
-    // Walrus Bee, 100% Combchance, Parents: Catty and Watery
-    WALRUS(GT_BranchDefinition.PLANET, "Walrus", true, new Color(0xD6D580), new Color(0xB5CFC9), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.WALRUS), 1.00f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(MAGICBEES, "Watery"), getSpecies(MAGICBEES, "Catty"), 45, 2);
-        if (ExtraCells2.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(ExtraCells2.ID, "walrus"), 0);
-        }
-    }),
-    MACHINIST(GT_BranchDefinition.ORGANIC, "Machinist", true, new Color(85, 37, 130), new Color(253, 185, 39),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MACHINIST), 0.2f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(NORMAL);
-            beeSpecies.setHasEffect();
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-            AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-            AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-            AlleleHelper.instance.set(template, NOCTURNAL, true);
-            AlleleHelper.instance.set(template, FLOWER_PROVIDER, GT_Flowers.FLAMING);
-            AlleleHelper.instance.set(template, FERTILITY, Fertility.MAXIMUM);
-            AlleleHelper.instance.set(template, EFFECT, getEffect(GREGTECH, "MachineBoost"));
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis
-                .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Imperial"), 1);
-            tMutation.addMutationCondition(new GT_Bees.ActiveGTMachineMutationCondition());
-        }),
-    // Space Bees
-    SPACE(GT_BranchDefinition.SPACE, "Space", true, new Color(0x003366), new Color(0xC0C0C0), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.02f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-    }, template -> {}, dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Heroic"), 10);
-        tMutation.restrictTemperature(ICY);
-    }),
-    METEORICIRON(GT_BranchDefinition.SPACE, "MeteoricIron", true, new Color(0x321928), new Color(0x643250),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.04f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.METEORICIRON), 0.10f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(HOT);
-            beeSpecies.setNocturnal();
-        }, template -> {}, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(SPACE, IRON, 9);
-            tMutation.requireResource(GregTech_API.sBlockMetal4, 7);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(28, "Moon")); // Moon Dim
-        }),
-    DESH(GT_BranchDefinition.SPACE, "Desh", false, new Color(0x323232), new Color(0x282828), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.06f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DESH), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition), new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(MARS, TITANIUM, 9);
-            tMutation.requireResource(GregTech_API.sBlockMetal2, 12);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(29, "Mars")); // Mars Dim
-        }
-    }),
-    LEDOX(GT_BranchDefinition.SPACE, "Ledox", false, new Color(0x0000CD), new Color(0x0074FF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.10f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LEDOX), 0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "freezing")), new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(CALLISTO, LEAD, 7);
-            if (NewHorizonsCoreMod.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Ledox"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(35, "Europa")); // Europa Dim
-        }
-    }),
-    CALLISTOICE(GT_BranchDefinition.SPACE, "CallistoIce", false, new Color(0x0074FF), new Color(0x1EB1FF),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.10f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CALLISTOICE), 0.10f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(ICY);
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "freezing")), new Consumer<>() {
-
-            @Override
-            public void accept(GT_BeeDefinition dis) {
-                IBeeMutationCustom tMutation = dis.registerMutation(CALLISTO, getSpecies(EXTRABEES, "freezing"), 7);
-                if (NewHorizonsCoreMod.isModLoaded())
-                    tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.CallistoColdIce"), 0);
-                tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(45, "Callisto")); // Callisto
-                // Dim
-            }
-        }),
-    MYTRYL(GT_BranchDefinition.SPACE, "Mytryl", false, new Color(0xDAA520), new Color(0xF26404), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.16f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MYTRYL), 0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> {}, new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(IO, MITHRIL, 6);
-            if (NewHorizonsCoreMod.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Mytryl"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(36, "IO")); // IO Dim
-        }
-    }),
-    QUANTIUM(GT_BranchDefinition.SPACE, "Quantium", false, new Color(0x00FF00), new Color(0x00D10B), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.16f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.QUANTIUM), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> {}, new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(VENUS, OSMIUM, 6);
-            if (NewHorizonsCoreMod.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Quantinum"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(39, "Venus")); // Venus Dim
-        }
-    }),
-    ORIHARUKON(GT_BranchDefinition.SPACE, "Oriharukon", false, new Color(0x228B22), new Color(0x677D68), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.26f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ORIHARUKON), 0.10f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-    }, template -> {}, new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(LEAD, OBERON, 5);
-            if (GalaxySpace.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "metalsblock"), 6);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(46, "Oberon")); // Oberon Dim
-        }
-    }),
-    INFUSEDGOLD(GT_BranchDefinition.SPACE, "Infused Gold", false, new Color(0x80641E), new Color(0xFFC83C),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.GOLD), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.INFUSEDGOLD), 0.30f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(ICY);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> {}, new Consumer<>() {
-
-            @Override
-            public void accept(GT_BeeDefinition dis) {
-                IBeeMutationCustom tMutation = dis.registerMutation(GOLD, HAUMEA, 5);
-                tMutation.requireResource(GregTech_API.sBlockMetal3, 10);
-                tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(83, "Haumea")); // Haumea Dim
-            }
-        }),
-    MYSTERIOUSCRYSTAL(GT_BranchDefinition.SPACE, "MysteriousCrystal", false, new Color(0x3CB371), new Color(0x16856C),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.42f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MYSTERIOUSCRYSTAL), 0.30f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(ICY);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> {}, new Consumer<>() {
-
-            @Override
-            public void accept(GT_BeeDefinition dis) {
-                IBeeMutationCustom tMutation = dis.registerMutation(ENCELADUS, EMERALD, 3);
-                if (NewHorizonsCoreMod.isModLoaded()) tMutation
-                    .requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.MysteriousCrystal"), 0);
-                tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(41, "Enceladus")); // Enceladus
-                // Dim
-            }
-        }),
-    BLACKPLUTONIUM(GT_BranchDefinition.SPACE, "BlackPlutonium", false, new Color(0x000000), new Color(0x323232),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.68f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.BLACKPLUTONIUM), 0.10f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(HELLISH);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> {}, new Consumer<>() {
-
-            @Override
-            public void accept(GT_BeeDefinition dis) {
-                IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, PLUTONIUM, 2);
-                if (NewHorizonsCoreMod.isModLoaded())
-                    tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.BlackPlutonium"), 0);
-                tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(49, "Pluto")); // Pluto Dim
-            }
-        }),
-    TRINIUM(GT_BranchDefinition.SPACE, "Trinium", false, new Color(0xB0E0E6), new Color(0xC8C8D2), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TRINIUM), 0.75f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.QUANTIUM), 0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, SPEED, GT_Bees.speedBlinding), new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(ENCELADUS, IRIDIUM, 4);
-            tMutation.requireResource(GregTech_API.sBlockMetal4, 9);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(41, "Enceladus")); // Enceladus Dim
-        }
-    }),
-    // Planet Line
-    MOON(GT_BranchDefinition.PLANET, "Moon", false, new Color(0x373735), new Color(0x7E7E78), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MOON), 0.35f);
-        if (NewHorizonsCoreMod.isModLoaded())
-            beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(SPACE, CLAY, 25);
-        if (GalacticraftCore.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(GalacticraftCore.ID, "tile.moonBlock"), 4);
-        }
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(28, "Moon")); // Moon Dim
-    }),
-    MARS(GT_BranchDefinition.PLANET, "Mars", false, new Color(0x220D05), new Color(0x3A1505), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MARS), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MOON, IRON, 20);
-        if (GalacticraftMars.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(GalacticraftMars.ID, "tile.mars"), 5);
-        }
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(29, "Mars")); // Mars Dim
-    }),
-    PHOBOS(GT_BranchDefinition.PLANET, "Phobos", true, new Color(0x220D05), new Color(0x7a5706), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MARS), 0.25f);
-        if (NewHorizonsCoreMod.isModLoaded()) beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PhobosStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MARS, MOON, 20);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "phobosblocks"), 2);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(38, "Phobos")); // Phobos Dim
-    }),
-    DEIMOS(GT_BranchDefinition.PLANET, "Deimos", true, new Color(0x220D05), new Color(0x7a3206), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MARS), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.DeimosStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MARS, SPACE, 20);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "deimosblocks"), 1);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(40, "Deimos")); // Deimos Dim
-    }),
-    CERES(GT_BranchDefinition.PLANET, "Ceres", true, new Color(0x3ca5b7), new Color(0x1e7267), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CeresStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MARS, METEORICIRON, 20);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ceresblocks"), 1);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(42, "Ceres")); // Ceres Dim
-    }),
-    JUPITER(GT_BranchDefinition.PLANET, "Jupiter", false, new Color(0x734B2E), new Color(0xD0CBC4), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoIceDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MARS, DESH, 15);
-        if (NewHorizonsCoreMod.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Ledox"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteroids")); // Asteroid Dim
-    }),
-    IO(GT_BranchDefinition.PLANET, "IO", true, new Color(0x734B2E), new Color(0xe5701b), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, getSpecies(EXTRABEES, "volcanic"), 15);
-        tMutation.restrictTemperature(HELLISH);
-        if (GalaxySpace.isModLoaded()) tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ioblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(36, "IO")); // IO Dim
-    }),
-    EUROPA(GT_BranchDefinition.PLANET, "Europa", true, new Color(0x5982ea), new Color(0x0b36a3), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1, 0), 0.10f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, IRON, 15);
-        tMutation.restrictTemperature(ICY);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "europagrunt"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(35, "Europa")); // Europa Dim
-    }),
-    GANYMEDE(GT_BranchDefinition.PLANET, "Ganymede", true, new Color(0x3d1b10), new Color(0x190c07), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(COLD);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, TITANIUM, 15);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ganymedeblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(43, "Ganymede")); // Ganymede Dim
-    }),
-    CALLISTO(GT_BranchDefinition.PLANET, "Callisto", true, new Color(0x0f333d), new Color(0x0d84a5), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1, 0), 0.10f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoIceDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, getSpecies(EXTRABEES, "artic"), 15);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "callistoblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(45, "Callisto")); // Callisto Dim
-    }),
-    SATURN(GT_BranchDefinition.PLANET, "Saturn", false, new Color(0xD2A472), new Color(0xF8C37B), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SATURN), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1, 0), 0.05f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusIceDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, LEDOX, 25, 2);
-        if (NewHorizonsCoreMod.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Quantinum"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteriods")); // Asteriods Dim
-    }),
-    ENCELADUS(GT_BranchDefinition.PLANET, "Enceladus", true, new Color(0xD2A472), new Color(0x193fa0), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SATURN), 0.25f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1, 0), 0.10f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusIceDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(SATURN, CHROME, 25, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "enceladusblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(41, "Enceladus")); // Enceladus Dim
-    }),
-    TITAN(GT_BranchDefinition.PLANET, "Titan", true, new Color(0xa0641b), new Color(0x7c1024), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SATURN), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(SATURN, NICKEL, 25, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "titanblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(44, "Titan")); // Titan Dim
-    }),
-    URANUS(GT_BranchDefinition.PLANET, "Uranus", false, new Color(0x75C0C9), new Color(0x84D8EC), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.URANUS), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(SATURN, TRINIUM, 10);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "metalsblock"), 6);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteroids")); // Asteroids Dim
-    }),
-    MIRANDA(GT_BranchDefinition.PLANET, "Miranda", true, new Color(0x75C0C9), new Color(0x0d211c), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.URANUS), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(URANUS, TIN, 10);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "mirandablocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(86, "Miranda")); // Miranda Dim
-    }),
-    OBERON(GT_BranchDefinition.PLANET, "Oberon", true, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.URANUS), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(ICY);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(URANUS, IRIDIUM, 10);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "oberonblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(46, "Oberon")); // Oberon Dim
-    }),
-    NEPTUNE(GT_BranchDefinition.PLANET, "Neptune", false, new Color(0x334CFF), new Color(0x576DFF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEPTUNE), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1, 0), 0.05f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(URANUS, ORIHARUKON, 7);
-        if (NewHorizonsCoreMod.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.MysteriousCrystal"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteroids")); // Asteroids Dim
-    }),
-    PROTEUS(GT_BranchDefinition.PLANET, "Proteus", true, new Color(0x334CFF), new Color(0x592610), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEPTUNE), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, COPPER, 7);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "proteusblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(47, "Proteus")); // Proteus Dim
-    }),
-    TRITON(GT_BranchDefinition.PLANET, "Triton", true, new Color(0x334CFF), new Color(0x421118), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEPTUNE), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, GOLD, 7);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tritonblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(48, "Triton")); // Triton Dim
-    }),
-    PLUTO(GT_BranchDefinition.PLANET, "Pluto", false, new Color(0x34271E), new Color(0x69503D), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLUTO), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1, 0), 0.10f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoIceDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, PLUTONIUM, 5);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "plutoblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(49, "Pluto")); // Pluto Dim
-    }),
-    HAUMEA(GT_BranchDefinition.PLANET, "Haumea", false, new Color(0x1C1413), new Color(0x392B28), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.HAUMEA), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(ICY);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, NAQUADAH, 7, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "haumeablocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(83, "Haumea")); // Haumea Dim
-    }),
-    MAKEMAKE(GT_BranchDefinition.PLANET, "MakeMake", false, new Color(0x301811), new Color(0x120A07), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MAKEMAKE), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, NAQUADRIA, 7, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "makemakegrunt"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(25, "MakeMake")); // MakeMake Dim
-    }),
-    CENTAURI(GT_BranchDefinition.PLANET, "Centauri", false, new Color(0x2F2A14), new Color(0xB06B32), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CENTAURI), 0.35f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, DESH, 3);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "acentauribbgrunt"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
-    }),
-    ACENTAURI(GT_BranchDefinition.PLANET, "aCentauri", false, new Color(0x2F2A14), new Color(0xa01e14), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CENTAURI), 0.25f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), new Consumer<>() {
-
-        @Override
-        public void accept(GT_BeeDefinition dis) {
-            IBeeMutationCustom tMutation = dis.registerMutation(CENTAURI, INFINITYCATALYST, 3);
-            if (GalaxySpace.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "acentauribbgrunt"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(31, "aCentauri")); // aCentauri Dim
-        }
-    }),
-    TCETI(GT_BranchDefinition.PLANET, "tCeti", false, new Color(0x46241A), new Color(0x7B412F), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TCETI), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, HAUMEA, 5, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
-    }),
-    TCETIE(GT_BranchDefinition.PLANET, "tCetiE", false, new Color(0x2d561b), new Color(0x0c0f60), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TCETI), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(TCETI, getSpecies(MAGICBEES, "TCWater"), 5, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(85, "tCeti E")); // tCeti E Dim
-    }),
-    // Parents: TCETI and TCETIE, 25% combchance, needs Damp Humidity and Normal temperature. Is Mycophilic
-    SEAWEED(GT_BranchDefinition.PLANET, "SeaWeed", true, new Color(0xCBCBCB), new Color(0x83FF83), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SEAWEED), 0.25f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.15f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(EnumTemperature.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
-        AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMycophilic);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(TCETI, TCETIE, 5, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(85, "tCeti E")); // tCeti E Dim
-    }),
-
-    BARNARDA(GT_BranchDefinition.PLANET, "Barnarda", false, new Color(0x0D5A0D), new Color(0xE6C18D), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.35f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1, 0), 0.05f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, THORIUM, 3, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
-    }),
-    BARNARDAC(GT_BranchDefinition.PLANET, "BarnardaC", false, new Color(0x0D5A0D), new Color(0x473f0a), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.25f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> {
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-        AlleleHelper.instance.set(template, EFFECT, getEffect(GREGTECH, "Treetwister"));
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, AMERICIUM, 3, 2);
-        if (GalaxySpace.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(32, "Barnarda C")); // Barnarda C Dim
-        }
-    }),
-    BARNARDAE(GT_BranchDefinition.PLANET, "BarnardaE", false, new Color(0x0D5A0D), new Color(0x4c1f0a), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.25f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, DIVIDED, 3, 2);
-        if (GalaxySpace.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(81, "Barnard E")); // "Barnard E Dim
-        }
-    }),
-    BARNARDAF(GT_BranchDefinition.PLANET, "BarnardaF", false, new Color(0x0D5A0D), new Color(0x1e0b49), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.25f);
-        beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HOT);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, NEUTRONIUM, 3, 2);
-        if (GalaxySpace.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaFgrunt"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(82, "Barnard F")); // "Barnard F Dim
-        }
-    }),
-    VEGA(GT_BranchDefinition.PLANET, "Vega", false, new Color(0x1A2036), new Color(0xB5C0DE), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.VEGA), 0.35f);
-        beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1, 0), 0.05f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, NAQUADAH, 2);
-        if (GalaxySpace.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "vegabgrunt"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt
-                                                                                                       // Dim
-        }
-    }),
-    VEGAB(GT_BranchDefinition.PLANET, "VegaB", false, new Color(0x1A2036), new Color(0x81e261), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.VEGA), 0.35f);
-        if (NewHorizonsCoreMod.isModLoaded()) beeSpecies
-            .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1, 0), 0.10f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(COLD);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(VEGA, NAQUADRIA, 2);
-        if (GalaxySpace.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "vegabgrunt"), 0);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(84, "VegaB")); // VegaB Dim
-        }
-    }),
-    MERCURY(GT_BranchDefinition.PLANET, "Mercury", false, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MERCURY), 0.35f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, TUNGSTEN, 25, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "mercuryblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(37, "Mercury")); // Mercury Dim
-    }),
-    VENUS(GT_BranchDefinition.PLANET, "Venus", false, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.VENUS), 0.35f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setTemperature(HELLISH);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, MITHRIL, 25, 2);
-        if (GalaxySpace.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "venusblocks"), 0);
-        tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(39, "Venus")); // Venus Dim
-    }),
-
-    // Infinity Line
-    COSMICNEUTRONIUM(GT_BranchDefinition.PLANET, "CosmicNeutronium", false, new Color(0x484848), new Color(0x323232),
-        beeSpecies -> {
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.COSMICNEUTRONIUM), 0.375f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(ICY);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-            // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
-            beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(NEUTRONIUM, BARNARDAF, 7, 10);
-            if (Avaritia.isModLoaded())
-                tMutation.requireResource(GameRegistry.findBlock(Avaritia.ID, "Resource_Block"), 0);
-        }),
-    INFINITYCATALYST(GT_BranchDefinition.PLANET, "InfinityCatalyst", false, new Color(0xFFFFFF), new Color(0xFFFFFF),
-        beeSpecies -> {
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.INFINITYCATALYST), 0.015f);
-            beeSpecies.setHumidity(DAMP);
-            beeSpecies.setTemperature(HELLISH);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-            // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
-            beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-        }, template -> {
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
-            AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "blindness"));
-        }, dis -> {
-            IMutationCustom tMutation = dis.registerMutation(DOB, COSMICNEUTRONIUM, 3, 10)
-                .setIsSecret();
-            if (Avaritia.isModLoaded()) {
-                tMutation.requireResource(GameRegistry.findBlock(Avaritia.ID, "Resource_Block"), 1);
-            }
-        }),
-    INFINITY(GT_BranchDefinition.PLANET, "Infinity", false, new Color(0xFFFFFF), new Color(0xFFFFFF), beeSpecies -> {
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.INFINITY), 0.015f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-        // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
-        beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(INFINITYCATALYST, COSMICNEUTRONIUM, 1, 10);
-        if (AvaritiaAddons.isModLoaded()) {
-            tMutation.requireResource(GameRegistry.findBlock(AvaritiaAddons.ID, "InfinityChest"), 0);
-        }
-    }),
-    KEVLAR(GT_BranchDefinition.IC2, "Kevlar", false, new Color(0x2d542f), new Color(0xa2baa3), beeSpecies -> {
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.KEVLAR), 0.075f);
-        beeSpecies.addSpecialty(MaterialsKevlar.Kevlar.getNuggets(1), 0.01f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setTemperature(COLD);
-        beeSpecies.setHasEffect();
-        beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
-        AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(template, NOCTURNAL, true);
-        AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
-        AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(OIL, INFINITYCATALYST, 4);
-        // UHV Replicator (UU-Matter)
-        GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockMachines, 11003));
-    }),
-
-    // Noble Gas Line
-    // Helium bee, Humidity: normal, Temperature: Icy, Parents: Space & Mars, Mutationrate: 10%, Combrate: 50%
-    HELIUM(GT_BranchDefinition.NOBLEGAS, "Helium", false, new Color(0xFFA9FF), new Color(0xC8B8B4), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.HELIUM), 0.35f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Watery"), ENDDUST, 10);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Argon bee, Humidity: normal, Temperature: Icy, Parents: Helium & Phobos, Mutationrate: 8%, Combrate: 50%
-    ARGON(GT_BranchDefinition.NOBLEGAS, "Argon", false, new Color(0x89D9E1), new Color(0xBDA5C2), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ARGON), 0.35f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(HELIUM, LICH, 8);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Neon bee, Humidity: normal, Temperature: Icy, Parents: Xenon & Ceres, Mutationrate: 6%, Combrate: 50%
-    NEON(GT_BranchDefinition.NOBLEGAS, "Neon", false, new Color(0xFFC826), new Color(0xFF7200), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEON), 0.35f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(ARGON, HYDRA, 6);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Krypton bee, Humidity: normal, Temperature: Icy, Parents: Neon & Jupiter, Mutationrate: 4%, Combrate: 50%
-    KRYPTON(GT_BranchDefinition.NOBLEGAS, "Krypton", false, new Color(0x8A97B0), new Color(0x160822), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.KRYPTON), 0.35f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(NEON, URGHAST, 4);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Xenon bee, Humidity: normal, Temperature: Icy, Parents: Argon & Deimos, Mutationrate: 6%, Combrate: 50%
-    XENON(GT_BranchDefinition.NOBLEGAS, "Xenon", false, new Color(0x8A97B0), new Color(0x160822), beeSpecies -> {
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.XENON), 0.525f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-        // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
-        beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(KRYPTON, SNOWQUEEN, 2);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Oxygen bee, Humidity: normal, Temperature: Icy, Parents: Space & Callisto, Mutationrate: 15%, Combrate: 50%
-    OXYGEN(GT_BranchDefinition.NOBLEGAS, "Oxygen", false, new Color(0xFFFFFF), new Color(0x8F8FFF), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.OXYGEN), 0.45f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.HYDROGEN), 0.20f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(HELIUM, DRAGONESSENCE, 15);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Hydrogen bee, Humidity: normal, Temperature: Icy, Parents: Oxygen & Watery, Mutationrate: 15%, Combrate: 50%
-    HYDROGEN(GT_BranchDefinition.NOBLEGAS, "Oxygen", false, new Color(0xFFFFFF), new Color(0xFF1493), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.HYDROGEN), 0.45f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NITROGEN), 0.20f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(OXYGEN, getSpecies(MAGICBEES, "Watery"), 15);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Nitrogen bee, Humidity: normal, Temperature: Icy, Parents: Oxygen & Hydrogen, Mutationrate: 15%, Combrate: 50%
-    NITROGEN(GT_BranchDefinition.NOBLEGAS, "Nitrogen", false, new Color(0xFFC832), new Color(0xA52A2A), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NITROGEN), 0.45f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FLUORINE), 0.20f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(OXYGEN, HYDROGEN, 15);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Fluorine bee, Humidity: normal, Temperature: Icy, Parents: Nitrogen & Hydrogen, Mutationrate: 15%, Combrate: 50%
-    FLUORINE(GT_BranchDefinition.NOBLEGAS, "Fluorine", false, new Color(0x86AFF0), new Color(0xFF6D00), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.FLUORINE), 0.45f);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OXYGEN), 0.20f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(ICY);
-        beeSpecies.setNocturnal();
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(NITROGEN, HYDROGEN, 15);
-        tMutation.restrictTemperature(ICY);
-    }),
-    // Europium line, needed after fluorine definition
-    RAREEARTH(GT_BranchDefinition.RAREMETAL, "RareEarth", false, new Color(0x555643), new Color(0x343428),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.RAREEARTH), 0.20f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NEODYMIUM), 0.05f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(NORMAL);
-        }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST),
-        dis -> dis.registerMutation(FLUORINE, REDSTONE, 10)),
-    NEODYMIUM(GT_BranchDefinition.RAREMETAL, "Neodymium", false, new Color(0x555555), new Color(0x4F4F4F),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.RAREEARTH), 0.15f);
-            beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NEODYMIUM), 0.15f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setTemperature(HOT);
-        }, template -> {
-            AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-        }, dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(RAREEARTH, IRON, 10);
-            tMutation.requireResource(GregTech_API.sBlockMetal5, 0);
-        }),
-    EUROPIUM(GT_BranchDefinition.RAREMETAL, "Europium", false, new Color(0xDAA0E2), new Color(0xAB7EB1), beeSpecies -> {
-        beeSpecies.addProduct(WerkstoffMaterialPool.EuropiumIIIOxide.get(OrePrefixes.dust, 1), 0.10F);
-        beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.EUROPIUM), 0.075f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setTemperature(HOT);
-        beeSpecies.setNocturnal();
-        // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
-        beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
-    }, template -> {
-        AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
-        AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
-    }, dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(NEODYMIUM, HYDROGEN, 5, 4);
-        // Compact fusion reactor mark 1 controller
-        GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockMachines, 32019));
-    }),
-    // infused Shards line
-    AIR(GT_BranchDefinition.INFUSEDSHARD, "Air", false, new Color(0xFFFF7E), new Color(0x60602F), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDAER), 0.30f);
-        beeSpecies.setHumidity(DAMP);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis
-            .registerMutation(getSpecies(MAGICBEES, "Supernatural"), getSpecies(MAGICBEES, "Windy"), 15);
-        tMutation.restrictTemperature(HOT);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 0);
-    }),
-    FIRE(GT_BranchDefinition.INFUSEDSHARD, "Fire", false, new Color(0xED3801), new Color(0x3B0E00), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDIGNIS), 0.30f);
-        beeSpecies.setHumidity(ARID);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Supernatural"), AIR, 15);
-        tMutation.restrictTemperature(HELLISH);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 1);
-    }),
-    WATER(GT_BranchDefinition.INFUSEDSHARD, "Water", false, new Color(0x0090FF), new Color(0x002542), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDAQUA), 0.30f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(FIRE, AIR, 15);
-        tMutation.restrictTemperature(ICY);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 2);
-    }),
-    EARTH(GT_BranchDefinition.INFUSEDSHARD, "Earth", false, new Color(0x008600), new Color(0x003300), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDTERRA), 0.30f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(WATER, FIRE, 15);
-        tMutation.restrictTemperature(WARM);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 3);
-    }),
-    ORDER(GT_BranchDefinition.INFUSEDSHARD, "Order", false, new Color(0x8A97B0), new Color(0x5C5F62), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDORDO), 0.30f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(EARTH, FIRE, 15);
-        tMutation.restrictTemperature(ICY);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 4);
-    }),
-    CHAOS(GT_BranchDefinition.INFUSEDSHARD, "Chaos", false, new Color(0x2E2E41), new Color(0x232129), beeSpecies -> {
-        beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDPERDITIO), 0.30f);
-        beeSpecies.setHumidity(EnumHumidity.NORMAL);
-        beeSpecies.setHasEffect();
-    }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-        IBeeMutationCustom tMutation = dis.registerMutation(ORDER, FIRE, 15);
-        tMutation.restrictTemperature(ICY);
-        if (Thaumcraft.isModLoaded())
-            tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 5);
-    }),
-    NETHERSHARD(GT_BranchDefinition.INFUSEDSHARD, "NetherShard", false, new Color(0xBE0135), new Color(0x350211),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NETHERSHARD), 0.30f);
-            beeSpecies.setHumidity(ARID);
-            beeSpecies.setTemperature(HOT);
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(CHAOS, FIRE, 15);
-            GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockGem3, 3));
-        }),
-    ENDSHARD(GT_BranchDefinition.INFUSEDSHARD, "EnderShard", false, new Color(0x2E2E41), new Color(0x232129),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ENDERSHARD), 0.30f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(NETHERSHARD, ENDDUST, 15);
-            tMutation.restrictTemperature(ICY);
-            GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockGem1, 7));
-        }),
-    // Organic branch 2.0
-    UNKNOWNWATER(GT_BranchDefinition.ORGANIC, "UnknownLiquid", false, new Color(0x4333A5), new Color(0x36ABFF),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.UNKNOWNLIQUID), 0.20f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST),
-        dis -> dis.registerMutation(INFINITYCATALYST, MYSTERIOUSCRYSTAL, 5)),
-    // Endgame bees
-    JAEGERMEISTER(GT_BranchDefinition.ENDGAME, "JaegerMeister", false, new Color(0x05AD18), new Color(0xE7DAC3),
-        beeSpecies -> {
-            beeSpecies.addProduct(GT_ModHandler.getModItem(CropsPlusPlus.ID, "BppPotions", 1L, 8), 0.01f);
-            beeSpecies.setHumidity(EnumHumidity.NORMAL);
-            beeSpecies.setNocturnal();
-            beeSpecies.setHasEffect();
-        }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
-            IBeeMutationCustom tMutation = dis.registerMutation(INFINITYCATALYST, NAQUADRIA, 5);
-            tMutation.requireResource(GregTech_API.sBlockMachines, 4684);
-            tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(100, "Deep Dark")); // Deep Dark
-                                                                                                      // dim
-        });
-
-    private final GT_BranchDefinition branch;
-    private final GT_AlleleBeeSpecies species;
-    private final Consumer mSpeciesProperties;
-    private final Consumer mAlleles;
-    private final Consumer mMutations;
-    private IAllele[] template;
-    private IBeeGenome genome;
-
-    GT_BeeDefinition(GT_BranchDefinition branch, String binomial, boolean dominant, Color primary, Color secondary,
-        Consumer aSpeciesProperties, Consumer aAlleles,
-        Consumer aMutations) {
-        this.mAlleles = aAlleles;
-        this.mMutations = aMutations;
-        this.mSpeciesProperties = aSpeciesProperties;
-        String lowercaseName = this.toString()
-            .toLowerCase(Locale.ENGLISH);
-        String species = WordUtils.capitalize(lowercaseName);
-
-        String uid = "gregtech.bee.species" + species;
-        String description = "for.description." + lowercaseName;
-        String name = "for.bees.species." + lowercaseName;
-        GT_LanguageManager.addStringLocalization("for.bees.species." + lowercaseName, species);
-
-        String authority = GT_LanguageManager.getTranslation("for.bees.authority." + lowercaseName);
-        if (authority.equals("for.bees.authority." + lowercaseName)) {
-            authority = "GTNH";
-        }
-        this.branch = branch;
-        this.species = new GT_AlleleBeeSpecies(
-            uid,
-            dominant,
-            name,
-            authority,
-            description,
-            branch.getBranch(),
-            binomial,
-            primary,
-            secondary);
-    }
-
-    public static void initBees() {
-        for (GT_BeeDefinition bee : values()) {
-            bee.init();
-        }
-        for (GT_BeeDefinition bee : values()) {
-            bee.registerMutations();
-        }
-    }
-
-    static IAlleleBeeEffect getEffect(byte modid, String name) {
-        String s = switch (modid) {
-            case EXTRABEES -> "extrabees.effect." + name;
-            case GENDUSTRY -> "gendustry.effect." + name;
-            case MAGICBEES -> "magicbees.effect" + name;
-            case GREGTECH -> "gregtech.effect" + name;
-            default -> "forestry.effect" + name;
-        };
-        return (IAlleleBeeEffect) AlleleManager.alleleRegistry.getAllele(s);
-    }
-
-    static IAlleleFlowers getFlowers(byte modid, String name) {
-        String s = switch (modid) {
-            case EXTRABEES -> "extrabees.flower." + name;
-            case GENDUSTRY -> "gendustry.flower." + name;
-            case MAGICBEES -> "magicbees.flower" + name;
-            case GREGTECH -> "gregtech.flower" + name;
-            default -> "forestry.flowers" + name;
-        };
-        return (IAlleleFlowers) AlleleManager.alleleRegistry.getAllele(s);
-    }
-
-    private static IAlleleBeeSpecies getSpecies(byte modid, String name) {
-        String s = switch (modid) {
-            case EXTRABEES -> "extrabees.species." + name;
-            case GENDUSTRY -> "gendustry.bee." + name;
-            case MAGICBEES -> "magicbees.species" + name;
-            case GREGTECH -> "gregtech.species" + name;
-            default -> "forestry.species" + name;
-        };
-        IAlleleBeeSpecies ret = (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(s);
-        if (ret == null) {
-            ret = NAQUADRIA.species;
-        }
-
-        return ret;
-    }
-
-    private void setSpeciesProperties(GT_AlleleBeeSpecies beeSpecies) {
-        this.mSpeciesProperties.accept(beeSpecies);
-    }
-
-    private void setAlleles(IAllele[] template) {
-        this.mAlleles.accept(template);
-    }
-
-    private void registerMutations() {
-        this.mMutations.accept(this);
-    }
-
-    private void init() {
-        setSpeciesProperties(species);
-
-        template = branch.getTemplate();
-        AlleleHelper.instance.set(template, SPECIES, species);
-        setAlleles(template);
-
-        genome = BeeManager.beeRoot.templateAsGenome(template);
-
-        BeeManager.beeRoot.registerTemplate(template);
-    }
-
-    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance) {
-        return registerMutation(parent1, parent2, chance, 1f);
-    }
-
-    private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, IAlleleBeeSpecies parent2, int chance) {
-        return registerMutation(parent1, parent2, chance, 1f);
-    }
-
-    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GT_BeeDefinition parent2, int chance) {
-        return registerMutation(parent1, parent2, chance, 1f);
-    }
-
-    private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, GT_BeeDefinition parent2, int chance) {
-        return registerMutation(parent1, parent2, chance, 1f);
-    }
-
-    /**
-     * Diese neue Funtion erlaubt Mutationsraten unter 1%. Setze dazu die Mutationsrate als Bruch mit chance /
-     * chanceDivider This new function allows Mutation percentages under 1%. Set them as a fraction with chance /
-     * chanceDivider
-     */
-    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance,
-        float chanceDivider) {
-        return new GT_Bee_Mutation(parent1, parent2, this.getTemplate(), chance, chanceDivider);
-    }
-
-    private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, IAlleleBeeSpecies parent2, int chance,
-        float chanceDivider) {
-        return registerMutation(parent1.species, parent2, chance, chanceDivider);
-    }
-
-    private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GT_BeeDefinition parent2, int chance,
-        float chanceDivider) {
-        return registerMutation(parent1, parent2.species, chance, chanceDivider);
-    }
-
-    private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, GT_BeeDefinition parent2, int chance,
-        float chanceDivider) {
-        return registerMutation(parent1.species, parent2, chance, chanceDivider);
-    }
-
-    @Override
-    public final IAllele[] getTemplate() {
-        return Arrays.copyOf(template, template.length);
-    }
-
-    @Override
-    public final IBeeGenome getGenome() {
-        return genome;
-    }
-
-    @Override
-    public final IBee getIndividual() {
-        return new Bee(genome);
-    }
-
-    @Override
-    public final ItemStack getMemberStack(EnumBeeType beeType) {
-        return BeeManager.beeRoot.getMemberStack(getIndividual(), beeType.ordinal());
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/GT_Bees.java b/src/main/java/gregtech/loaders/misc/GT_Bees.java
deleted file mode 100644
index a8246360cf..0000000000
--- a/src/main/java/gregtech/loaders/misc/GT_Bees.java
+++ /dev/null
@@ -1,231 +0,0 @@
-package gregtech.loaders.misc;
-
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.enums.Mods.GalaxySpace;
-import static gregtech.api.enums.Mods.TwilightForest;
-
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.world.World;
-import net.minecraft.world.biome.BiomeGenBase;
-
-import forestry.api.apiculture.EnumBeeChromosome;
-import forestry.api.apiculture.IAlleleBeeEffect;
-import forestry.api.core.IClimateProvider;
-import forestry.api.genetics.AlleleManager;
-import forestry.api.genetics.IAllele;
-import forestry.api.genetics.IAlleleArea;
-import forestry.api.genetics.IAlleleFloat;
-import forestry.api.genetics.IAlleleInteger;
-import forestry.api.genetics.IGenome;
-import forestry.api.genetics.IMutationCondition;
-import forestry.core.genetics.alleles.Allele;
-import forestry.core.utils.StringUtil;
-import gregtech.GT_Mod;
-import gregtech.api.metatileentity.BaseMetaTileEntity;
-import gregtech.common.bees.GT_AlleleHelper;
-import gregtech.common.items.ItemComb;
-import gregtech.common.items.ItemDrop;
-import gregtech.common.items.ItemPollen;
-import gregtech.common.items.ItemPropolis;
-import gregtech.loaders.misc.bees.GT_AlleleEffect;
-import gregtech.loaders.misc.bees.GT_EffectMachineBoost;
-import gregtech.loaders.misc.bees.GT_EffectTreeTwister;
-import gregtech.loaders.misc.bees.GT_Flowers;
-
-public class GT_Bees {
-
-    public static IAlleleInteger noFertility;
-    public static IAlleleInteger superFertility;
-
-    public static IAlleleInteger noFlowering;
-    public static IAlleleInteger superFlowering;
-
-    public static IAlleleArea noTerritory;
-    public static IAlleleArea superTerritory;
-
-    public static IAlleleFloat noWork;
-    public static IAlleleFloat speedBlinding;
-    public static IAlleleFloat superSpeed;
-
-    public static IAlleleInteger blinkLife;
-    public static IAlleleInteger superLife;
-
-    public static IAlleleBeeEffect treetwisterEffect;
-    public static IAlleleBeeEffect machineBoostEffect;
-
-    public static ItemPropolis propolis;
-    public static ItemPollen pollen;
-    public static ItemDrop drop;
-    public static ItemComb combs;
-
-    public GT_Bees() {
-        if (!(Forestry.isModLoaded() && GT_Mod.gregtechproxy.mGTBees)) {
-            return;
-        }
-        GT_Flowers.doInit();
-        GT_AlleleHelper.initialisation();
-        setupGTAlleles();
-        propolis = new ItemPropolis();
-        propolis.initPropolisRecipes();
-        pollen = new ItemPollen();
-        drop = new ItemDrop();
-        drop.initDropsRecipes();
-        combs = new ItemComb();
-        combs.initCombsRecipes();
-        combs.registerOreDict();
-        GT_BeeDefinition.initBees();
-
-    }
-
-    private static void setupGTAlleles() {
-
-        noFertility = new AlleleInteger("fertilitySterile", 0, false, EnumBeeChromosome.FERTILITY);
-        superFertility = new AlleleInteger("fertilityMultiply", 8, false, EnumBeeChromosome.FERTILITY);
-
-        noFlowering = new AlleleInteger("floweringNonpollinating", 0, false, EnumBeeChromosome.FLOWERING);
-        superFlowering = new AlleleInteger("floweringNaturalistic", 240, false, EnumBeeChromosome.FLOWERING);
-
-        noTerritory = new AlleleArea("areaLethargic", 1, 1, false);
-        superTerritory = new AlleleArea("areaExploratory", 32, 16, false);
-
-        noWork = new AlleleFloat("speedUnproductive", 0, false);
-        superSpeed = new AlleleFloat("speedAccelerated", 4F, false);
-        speedBlinding = AlleleManager.alleleRegistry.getAllele("magicbees.speedBlinding") == null
-            ? new AlleleFloat("speedBlinding", 2f, false)
-            : (IAlleleFloat) AlleleManager.alleleRegistry.getAllele("magicbees.speedBlinding");
-
-        blinkLife = new AlleleInteger("lifeBlink", 2, false, EnumBeeChromosome.LIFESPAN);
-        superLife = new AlleleInteger("lifeEon", 600, false, EnumBeeChromosome.LIFESPAN);
-        machineBoostEffect = new GT_EffectMachineBoost();
-
-        if (GalaxySpace.isModLoaded() && TwilightForest.isModLoaded()) {
-            GT_Mod.GT_FML_LOGGER.info("treetwisterEffect: GalaxySpace and TwilightForest loaded, using default impl");
-            treetwisterEffect = new GT_EffectTreeTwister();
-        } else {
-            GT_Mod.GT_FML_LOGGER
-                .info("treetwisterEffect: GalaxySpace or TwilightForest was not loaded, using fallback impl");
-            treetwisterEffect = GT_AlleleEffect.FORESTRY_BASE_EFFECT;
-        }
-    }
-
-    private static class AlleleFloat extends Allele implements IAlleleFloat {
-
-        private final float value;
-
-        public AlleleFloat(String id, float val, boolean isDominant) {
-            super("gregtech." + id, "gregtech." + id, isDominant);
-            this.value = val;
-            AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPEED);
-        }
-
-        @Override
-        public float getValue() {
-            return this.value;
-        }
-    }
-
-    private static class AlleleInteger extends Allele implements IAlleleInteger {
-
-        private final int value;
-
-        public AlleleInteger(String id, int val, boolean isDominant, EnumBeeChromosome c) {
-            super("gregtech." + id, "gregtech." + id, isDominant);
-            this.value = val;
-            AlleleManager.alleleRegistry.registerAllele(this, c);
-        }
-
-        @Override
-        public int getValue() {
-            return this.value;
-        }
-    }
-
-    private static class AlleleArea extends Allele implements IAlleleArea {
-
-        private final int[] value;
-
-        public AlleleArea(String id, int rangeXZ, int rangeY, boolean isDominant) {
-            super("gregtech." + id, "gregtech." + id, isDominant);
-            this.value = new int[] { rangeXZ, rangeY, rangeXZ };
-            AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.TERRITORY);
-        }
-
-        @Override
-        public int[] getValue() {
-            return this.value;
-        }
-    }
-
-    public static class DimensionMutationCondition implements IMutationCondition {
-
-        final int dimID;
-        final String dimName;
-
-        public DimensionMutationCondition(int id, String name) {
-            dimID = id;
-            dimName = name;
-        }
-
-        @Override
-        public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
-            IGenome genome1, IClimateProvider climate) {
-            if (world.provider.dimensionId == dimID) return 1;
-            return 0;
-        }
-
-        @Override
-        public String getDescription() {
-            return StringUtil.localizeAndFormat("mutation.condition.dim") + " " + dimName;
-        }
-    }
-
-    public static class BiomeIDMutationCondition implements IMutationCondition {
-
-        final int biomeID;
-        final String biomeName;
-
-        public BiomeIDMutationCondition(int id, String name) {
-            biomeID = id;
-            biomeName = name;
-        }
-
-        @Override
-        public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
-            IGenome genome1, IClimateProvider climate) {
-            if (climate.getBiome().biomeID == biomeID) return 1;
-            return 0;
-        }
-
-        @Override
-        public String getDescription() {
-            if (BiomeGenBase.getBiome(biomeID) != null) {
-                return StringUtil.localizeAndFormat("mutation.condition.biomeid") + " " + biomeName;
-            }
-            return "";
-        }
-    }
-
-    public static class ActiveGTMachineMutationCondition implements IMutationCondition {
-
-        public ActiveGTMachineMutationCondition() {
-
-        }
-
-        @Override
-        public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
-            IGenome genome1, IClimateProvider climate) {
-            TileEntity tileEntity = world.getTileEntity(x, y - 1, z);
-            if (tileEntity instanceof BaseMetaTileEntity machine) {
-                if (machine.isActive()) {
-                    return 1;
-                }
-            }
-            return 0;
-        }
-
-        @Override
-        public String getDescription() {
-            return "Needs a running GT Machine below to breed";
-        }
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java b/src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java
deleted file mode 100644
index 3eae8c73e2..0000000000
--- a/src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package gregtech.loaders.misc;
-
-import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
-import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
-import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
-import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
-import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
-import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
-import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
-import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
-import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
-import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
-import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
-import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
-import static forestry.core.genetics.alleles.EnumAllele.Fertility;
-import static forestry.core.genetics.alleles.EnumAllele.Flowering;
-import static forestry.core.genetics.alleles.EnumAllele.Flowers;
-import static forestry.core.genetics.alleles.EnumAllele.Lifespan;
-import static forestry.core.genetics.alleles.EnumAllele.Speed;
-import static forestry.core.genetics.alleles.EnumAllele.Territory;
-import static forestry.core.genetics.alleles.EnumAllele.Tolerance;
-import static gregtech.loaders.misc.GT_BeeDefinition.getEffect;
-import static gregtech.loaders.misc.GT_BeeDefinition.getFlowers;
-import static gregtech.loaders.misc.GT_BeeDefinitionReference.EXTRABEES;
-import static gregtech.loaders.misc.GT_BeeDefinitionReference.MAGICBEES;
-
-import java.util.Arrays;
-import java.util.function.Consumer;
-
-import forestry.api.apiculture.BeeManager;
-import forestry.api.apiculture.EnumBeeChromosome;
-import forestry.api.genetics.IAllele;
-import forestry.api.genetics.IClassification;
-import forestry.apiculture.genetics.alleles.AlleleEffect;
-import forestry.core.genetics.alleles.AlleleHelper;
-
-public enum GT_BranchDefinition {
-
-    ORGANIC("Fuelis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.WHEAT);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTER);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.SLOWEST);
-    }),
-    IC2("Industrialis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
-        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.SNOW);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.SLOW);
-    }),
-    GTALLOY("Amalgamis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.VANILLA);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.FAST);
-    }),
-    THAUMIC("Arcanis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "book"));
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.LONGEST);
-    }),
-    GEM("Ornamentis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.NETHER);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
-    }),
-    METAL("Metaliferis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
-        AlleleHelper.instance.set(alleles, CAVE_DWELLING, true);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.JUNGLE);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOWER);
-    }),
-    RAREMETAL("Mineralis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.CACTI);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FAST);
-    }),
-    RADIOACTIVE("Criticalis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.END);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
-        AlleleHelper.instance.set(alleles, SPEED, GT_Bees.speedBlinding);
-        AlleleHelper.instance.set(alleles, SPEED, getEffect(EXTRABEES, "radioactive"));
-    }),
-    TWILIGHT("Nemoris Obscuri", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, false);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.VANILLA);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
-    }),
-    HEE("Finis Expansiones", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
-        AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, true);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "book"));
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
-    }),
-    SPACE("Cosmicis", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
-        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(alleles, NOCTURNAL, true);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.LONGEST);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.FAST);
-        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
-    }),
-    PLANET("Planetaris", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.NORMAL);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
-    }),
-    NOBLEGAS("Nobilis Gasorum", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
-        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.NORMAL);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(alleles, TERRITORY, Territory.AVERAGE);
-    }),
-    INFUSEDSHARD("Infusa Shard", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
-        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(MAGICBEES, "rock"));
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
-    }),
-    ENDGAME("ENDUS GAMUS", alleles -> {
-        AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_5);
-        AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
-        AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
-        AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
-        AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
-        AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
-    });
-
-    private static IAllele[] defaultTemplate;
-    private final IClassification branch;
-    private final Consumer mBranchProperties;
-
-    GT_BranchDefinition(String scientific, Consumer aBranchProperties) {
-        this.branch = BeeManager.beeFactory.createBranch(
-            this.name()
-                .toLowerCase(),
-            scientific);
-        this.mBranchProperties = aBranchProperties;
-    }
-
-    private static IAllele[] getDefaultTemplate() {
-        if (defaultTemplate == null) {
-            defaultTemplate = new IAllele[EnumBeeChromosome.values().length];
-
-            AlleleHelper.instance.set(defaultTemplate, SPEED, Speed.SLOWEST);
-            AlleleHelper.instance.set(defaultTemplate, LIFESPAN, Lifespan.SHORTER);
-            AlleleHelper.instance.set(defaultTemplate, FERTILITY, Fertility.NORMAL);
-            AlleleHelper.instance.set(defaultTemplate, TEMPERATURE_TOLERANCE, Tolerance.NONE);
-            AlleleHelper.instance.set(defaultTemplate, NOCTURNAL, false);
-            AlleleHelper.instance.set(defaultTemplate, HUMIDITY_TOLERANCE, Tolerance.NONE);
-            AlleleHelper.instance.set(defaultTemplate, TOLERANT_FLYER, false);
-            AlleleHelper.instance.set(defaultTemplate, CAVE_DWELLING, false);
-            AlleleHelper.instance.set(defaultTemplate, FLOWER_PROVIDER, Flowers.VANILLA);
-            AlleleHelper.instance.set(defaultTemplate, FLOWERING, Flowering.SLOWEST);
-            AlleleHelper.instance.set(defaultTemplate, TERRITORY, Territory.AVERAGE);
-            AlleleHelper.instance.set(defaultTemplate, EFFECT, AlleleEffect.effectNone);
-        }
-        return Arrays.copyOf(defaultTemplate, defaultTemplate.length);
-    }
-
-    void setBranchProperties(IAllele[] template) {
-        this.mBranchProperties.accept(template);
-    }
-
-    public final IAllele[] getTemplate() {
-        IAllele[] template = getDefaultTemplate();
-        setBranchProperties(template);
-        return template;
-    }
-
-    public final IClassification getBranch() {
-        return branch;
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/GT_CoverLoader.java b/src/main/java/gregtech/loaders/misc/GT_CoverLoader.java
deleted file mode 100644
index dc83202724..0000000000
--- a/src/main/java/gregtech/loaders/misc/GT_CoverLoader.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package gregtech.loaders.misc;
-
-import static gregtech.api.enums.Textures.BlockIcons.VENT_ADVANCED;
-import static gregtech.api.enums.Textures.BlockIcons.VENT_NORMAL;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.common.covers.GT_Cover_Vent;
-
-public class GT_CoverLoader implements Runnable {
-
-    @Override
-    public void run() {
-        for (byte i = 0; i < 16; i = (byte) (i + 1)) {
-            GregTech_API.registerCover(new ItemStack(Blocks.carpet, 1, i), TextureFactory.of(Blocks.wool, i), null);
-        }
-        GregTech_API.registerCover(
-            GT_ModHandler.getIC2Item("reactorVent", 1L, 1),
-            TextureFactory.of(VENT_NORMAL),
-            new GT_Cover_Vent(1));
-        GregTech_API.registerCover(
-            GT_ModHandler.getIC2Item("reactorVentCore", 1L, 1),
-            TextureFactory.of(VENT_NORMAL),
-            new GT_Cover_Vent(1));
-        GregTech_API.registerCover(
-            GT_ModHandler.getIC2Item("reactorVentGold", 1L, 1),
-            TextureFactory.of(VENT_ADVANCED),
-            new GT_Cover_Vent(2));
-        GregTech_API.registerCover(
-            GT_ModHandler.getIC2Item("reactorVentSpread", 1L),
-            TextureFactory.of(VENT_NORMAL),
-            new GT_Cover_Vent(2));
-        GregTech_API.registerCover(
-            GT_ModHandler.getIC2Item("reactorVentDiamond", 1L, 1),
-            TextureFactory.of(VENT_ADVANCED),
-            new GT_Cover_Vent(3));
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GTAlleleEffect.java b/src/main/java/gregtech/loaders/misc/bees/GTAlleleEffect.java
new file mode 100644
index 0000000000..128e3dfeb1
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/bees/GTAlleleEffect.java
@@ -0,0 +1,57 @@
+package gregtech.loaders.misc.bees;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IEffectData;
+import forestry.core.genetics.alleles.Allele;
+
+// helper class for implementing custom bee effects, based on MagicBees' implementation
+public abstract class GTAlleleEffect extends Allele implements IAlleleBeeEffect {
+
+    public static final IAlleleBeeEffect FORESTRY_BASE_EFFECT = (IAlleleBeeEffect) AlleleManager.alleleRegistry
+        .getAllele("forestry.effectNone");
+    protected boolean combinable;
+    protected int tickThrottle; // If set, this amount of ticks have to pass before an effect ticks
+
+    public GTAlleleEffect(String id, boolean isDominant, int tickThrottle) {
+        super("gregtech." + id, "gregtech." + id, isDominant);
+        AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.EFFECT);
+        combinable = false;
+        this.tickThrottle = tickThrottle;
+    }
+
+    @Override
+    public boolean isCombinable() {
+        return combinable;
+    }
+
+    public GTAlleleEffect setIsCombinable(boolean canCombine) {
+        combinable = canCombine;
+        return this;
+    }
+
+    @Override
+    public abstract IEffectData validateStorage(IEffectData storedData);
+
+    @Override
+    public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
+        int ticksPassed = storedData.getInteger(0);
+        if (ticksPassed >= this.tickThrottle) {
+            storedData = this.doEffectTickThrottled(genome, storedData, housing);
+        } else {
+            storedData.setInteger(0, ticksPassed + 1);
+        }
+        return storedData;
+    }
+
+    protected abstract IEffectData doEffectTickThrottled(IBeeGenome genome, IEffectData storedData,
+        IBeeHousing housing);
+
+    @Override
+    public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
+        return FORESTRY_BASE_EFFECT.doFX(genome, storedData, housing);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GTEffectMachineBoost.java b/src/main/java/gregtech/loaders/misc/bees/GTEffectMachineBoost.java
new file mode 100644
index 0000000000..e0454e0d27
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/bees/GTEffectMachineBoost.java
@@ -0,0 +1,61 @@
+package gregtech.loaders.misc.bees;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.genetics.IEffectData;
+import forestry.core.genetics.EffectData;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.implementations.MTETieredMachineBlock;
+
+public class GTEffectMachineBoost extends GTAlleleEffect {
+
+    public GTEffectMachineBoost() {
+        super("effectMachineBoost", false, 600);
+    }
+
+    @Override
+    public IEffectData validateStorage(IEffectData storedData) {
+        if (storedData == null) {
+            storedData = new EffectData(1, 1);
+        }
+        return storedData;
+    }
+
+    @Override
+    protected IEffectData doEffectTickThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
+        World world = housing.getWorld();
+        ChunkCoordinates coords = housing.getCoordinates();
+        IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
+
+        // Get random coords within territory
+        int xRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[0]);
+        int yRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[1]);
+        int zRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[2]);
+
+        int xCoord = coords.posX + world.rand.nextInt(xRange) - xRange / 2;
+        int yCoord = coords.posY + world.rand.nextInt(yRange) - yRange / 2;
+        int zCoord = coords.posZ + world.rand.nextInt(zRange) - zRange / 2;
+
+        // If gt machine of tier lower equal than ev, boost recipe by 2s
+        TileEntity tileEntity = world.getTileEntity(xCoord, yCoord, zCoord);
+        if (tileEntity instanceof BaseMetaTileEntity machine) {
+            if (machine.getMetaTileEntity() instanceof MTETieredMachineBlock tieredMachine) {
+                if (tieredMachine.mTier <= 4) { // EV
+                    if (machine.isActive() && machine.getMaxProgress() > 60) {
+                        machine.increaseProgress(40);
+                    }
+                }
+            }
+        }
+
+        storedData.setInteger(0, 0);
+
+        return storedData;
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GTEffectTreeTwister.java b/src/main/java/gregtech/loaders/misc/bees/GTEffectTreeTwister.java
new file mode 100644
index 0000000000..65c150bd1d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/bees/GTEffectTreeTwister.java
@@ -0,0 +1,87 @@
+package gregtech.loaders.misc.bees;
+
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.TwilightForest;
+
+import java.util.Arrays;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.genetics.IEffectData;
+import gregtech.GTMod;
+import gregtech.api.util.GTModHandler;
+
+public class GTEffectTreeTwister extends GTAlleleEffect {
+
+    private static final Integer[] ALLOWED_DIMS = { 2, // spectre
+        112, // last millenium
+        60, // bedrock
+        69, // pocket plane
+    };
+
+    private static final ItemStack TF_TRANS_SAPLING = GTModHandler
+        .getModItem(TwilightForest.ID, "tile.TFSapling", 1, 6);
+    private static final ItemStack BARN_SAPLING = GTModHandler.getModItem(GalaxySpace.ID, "barnardaCsapling", 1, 1);
+
+    static {
+        if (TF_TRANS_SAPLING == null) {
+            GTMod.GT_FML_LOGGER.info("GT_EffectTreeTwister(): Could not get ItemStack for BarnardaC sapling");
+        }
+        if (BARN_SAPLING == null) {
+            GTMod.GT_FML_LOGGER.info("GT_EffectTreeTwister(): Could not get ItemStack for BarnardaC sapling");
+        }
+    }
+
+    public GTEffectTreeTwister() {
+        super("effectTreetwister", false, 0);
+    }
+
+    public IEffectData validateStorage(IEffectData storedData) {
+        return storedData; // unused for this effect
+    }
+
+    @Override
+    protected IEffectData doEffectTickThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
+        if (TF_TRANS_SAPLING == null || BARN_SAPLING == null) {
+            return storedData;
+        }
+        World world = housing.getWorld();
+        if (!Arrays.asList(ALLOWED_DIMS)
+            .contains(world.provider.dimensionId)) {
+            return storedData;
+        }
+        ChunkCoordinates coords = housing.getCoordinates();
+        IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
+
+        // Get random coords within territory
+        int xRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[0]);
+        int yRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[1]);
+        int zRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[2]);
+
+        int xCoord = coords.posX + world.rand.nextInt(xRange) - xRange / 2;
+        int yCoord = coords.posY + world.rand.nextInt(yRange) - yRange / 2;
+        int zCoord = coords.posZ + world.rand.nextInt(zRange) - zRange / 2;
+
+        ItemStack sourceBlock = new ItemStack(
+            world.getBlock(xCoord, yCoord, zCoord),
+            1,
+            world.getBlockMetadata(xCoord, yCoord, zCoord));
+        if (TF_TRANS_SAPLING != null && BARN_SAPLING != null && TF_TRANS_SAPLING.isItemEqual(sourceBlock)) {
+            world.setBlock(
+                xCoord,
+                yCoord,
+                zCoord,
+                Block.getBlockFromItem(BARN_SAPLING.getItem()),
+                BARN_SAPLING.getItemDamage(),
+                2);
+        }
+        return storedData;
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GTFlowers.java b/src/main/java/gregtech/loaders/misc/bees/GTFlowers.java
new file mode 100644
index 0000000000..db96bfb454
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/bees/GTFlowers.java
@@ -0,0 +1,135 @@
+package gregtech.loaders.misc.bees;
+
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.EnumPlantType;
+
+import forestry.api.apiculture.FlowerManager;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleFlowers;
+import forestry.api.genetics.IChromosomeType;
+import forestry.api.genetics.IFlower;
+import forestry.api.genetics.IFlowerProvider;
+import forestry.api.genetics.IIndividual;
+import forestry.api.genetics.IPollinatable;
+import forestry.api.genetics.ISpeciesRoot;
+import gregtech.api.util.GTLanguageManager;
+
+public enum GTFlowers implements IFlowerProvider, IAlleleFlowers, IChromosomeType {
+
+    FLAMING;
+
+    protected boolean dominant;
+
+    GTFlowers() {
+        dominant = true;
+    }
+
+    public static void doInit() {
+        for (GTFlowers effect : values()) {
+            effect.register();
+        }
+    }
+
+    @Override
+    public String getUID() {
+        return "for.flowers." + toString().toLowerCase();
+    }
+
+    @Override
+    public boolean isDominant() {
+        return dominant;
+    }
+
+    @Override
+    public IFlowerProvider getProvider() {
+        return this;
+    }
+
+    @Override
+    public String getDescription() {
+        return GTLanguageManager.getTranslation("for.flowers." + name().toLowerCase());
+    }
+
+    public void register() {
+        for (ItemStack stack : getItemStacks()) {
+            FlowerManager.flowerRegistry.registerAcceptableFlower(Block.getBlockFromItem(stack.getItem()), getUID());
+        }
+
+        AlleleManager.alleleRegistry.registerAllele(this, this);
+    }
+
+    public ItemStack[] getItemStacks() {
+        switch (this) {
+            case FLAMING:
+                return new ItemStack[] { new ItemStack(Blocks.fire) };
+        }
+        return new ItemStack[0];
+    }
+
+    @Override
+    public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
+        EnumSet types = pollinatable.getPlantType();
+        return types.size() > 1 || !types.contains(EnumPlantType.Nether);
+    }
+
+    public boolean isAcceptedFlower(World world, int x, int y, int z) {
+        Block block = world.getBlock(x, y, z);
+        if (block == null) {
+            return false;
+        }
+
+        switch (this) {
+            case FLAMING:
+                return block == Blocks.fire;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
+        return false;
+    }
+
+    @Override
+    public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
+        return products;
+    }
+
+    @Override
+    public String getName() {
+        return getDescription();
+    }
+
+    @Override
+    public String getUnlocalizedName() {
+        return getUID();
+    }
+
+    @Override
+    public String getFlowerType() {
+        return getUID();
+    }
+
+    @Override
+    public Set getFlowers() {
+        return new HashSet<>();
+    }
+
+    @Override
+    public Class getAlleleClass() {
+        return getClass();
+    }
+
+    @Override
+    public ISpeciesRoot getSpeciesRoot() {
+        return AlleleManager.alleleRegistry.getSpeciesRoot(getUID());
+    }
+}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java b/src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java
deleted file mode 100644
index 25198968d2..0000000000
--- a/src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package gregtech.loaders.misc.bees;
-
-import forestry.api.apiculture.EnumBeeChromosome;
-import forestry.api.apiculture.IAlleleBeeEffect;
-import forestry.api.apiculture.IBeeGenome;
-import forestry.api.apiculture.IBeeHousing;
-import forestry.api.genetics.AlleleManager;
-import forestry.api.genetics.IEffectData;
-import forestry.core.genetics.alleles.Allele;
-
-// helper class for implementing custom bee effects, based on MagicBees' implementation
-public abstract class GT_AlleleEffect extends Allele implements IAlleleBeeEffect {
-
-    public static final IAlleleBeeEffect FORESTRY_BASE_EFFECT = (IAlleleBeeEffect) AlleleManager.alleleRegistry
-        .getAllele("forestry.effectNone");
-    protected boolean combinable;
-    protected int tickThrottle; // If set, this amount of ticks have to pass before an effect ticks
-
-    public GT_AlleleEffect(String id, boolean isDominant, int tickThrottle) {
-        super("gregtech." + id, "gregtech." + id, isDominant);
-        AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.EFFECT);
-        combinable = false;
-        this.tickThrottle = tickThrottle;
-    }
-
-    @Override
-    public boolean isCombinable() {
-        return combinable;
-    }
-
-    public GT_AlleleEffect setIsCombinable(boolean canCombine) {
-        combinable = canCombine;
-        return this;
-    }
-
-    @Override
-    public abstract IEffectData validateStorage(IEffectData storedData);
-
-    @Override
-    public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
-        int ticksPassed = storedData.getInteger(0);
-        if (ticksPassed >= this.tickThrottle) {
-            storedData = this.doEffectTickThrottled(genome, storedData, housing);
-        } else {
-            storedData.setInteger(0, ticksPassed + 1);
-        }
-        return storedData;
-    }
-
-    protected abstract IEffectData doEffectTickThrottled(IBeeGenome genome, IEffectData storedData,
-        IBeeHousing housing);
-
-    @Override
-    public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
-        return FORESTRY_BASE_EFFECT.doFX(genome, storedData, housing);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GT_EffectMachineBoost.java b/src/main/java/gregtech/loaders/misc/bees/GT_EffectMachineBoost.java
deleted file mode 100644
index a50c0452bb..0000000000
--- a/src/main/java/gregtech/loaders/misc/bees/GT_EffectMachineBoost.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package gregtech.loaders.misc.bees;
-
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.ChunkCoordinates;
-import net.minecraft.world.World;
-
-import forestry.api.apiculture.BeeManager;
-import forestry.api.apiculture.IBeeGenome;
-import forestry.api.apiculture.IBeeHousing;
-import forestry.api.apiculture.IBeeModifier;
-import forestry.api.genetics.IEffectData;
-import forestry.core.genetics.EffectData;
-import gregtech.api.metatileentity.BaseMetaTileEntity;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
-
-public class GT_EffectMachineBoost extends GT_AlleleEffect {
-
-    public GT_EffectMachineBoost() {
-        super("effectMachineBoost", false, 600);
-    }
-
-    @Override
-    public IEffectData validateStorage(IEffectData storedData) {
-        if (storedData == null) {
-            storedData = new EffectData(1, 1);
-        }
-        return storedData;
-    }
-
-    @Override
-    protected IEffectData doEffectTickThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
-        World world = housing.getWorld();
-        ChunkCoordinates coords = housing.getCoordinates();
-        IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
-
-        // Get random coords within territory
-        int xRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[0]);
-        int yRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[1]);
-        int zRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[2]);
-
-        int xCoord = coords.posX + world.rand.nextInt(xRange) - xRange / 2;
-        int yCoord = coords.posY + world.rand.nextInt(yRange) - yRange / 2;
-        int zCoord = coords.posZ + world.rand.nextInt(zRange) - zRange / 2;
-
-        // If gt machine of tier lower equal than ev, boost recipe by 2s
-        TileEntity tileEntity = world.getTileEntity(xCoord, yCoord, zCoord);
-        if (tileEntity instanceof BaseMetaTileEntity machine) {
-            if (machine.getMetaTileEntity() instanceof GT_MetaTileEntity_TieredMachineBlock tieredMachine) {
-                if (tieredMachine.mTier <= 4) { // EV
-                    if (machine.isActive() && machine.getMaxProgress() > 60) {
-                        machine.increaseProgress(40);
-                    }
-                }
-            }
-        }
-
-        storedData.setInteger(0, 0);
-
-        return storedData;
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java b/src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java
deleted file mode 100644
index a36635db57..0000000000
--- a/src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package gregtech.loaders.misc.bees;
-
-import static gregtech.api.enums.Mods.GalaxySpace;
-import static gregtech.api.enums.Mods.TwilightForest;
-
-import java.util.Arrays;
-
-import net.minecraft.block.Block;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.ChunkCoordinates;
-import net.minecraft.world.World;
-
-import forestry.api.apiculture.BeeManager;
-import forestry.api.apiculture.IBeeGenome;
-import forestry.api.apiculture.IBeeHousing;
-import forestry.api.apiculture.IBeeModifier;
-import forestry.api.genetics.IEffectData;
-import gregtech.GT_Mod;
-import gregtech.api.util.GT_ModHandler;
-
-public class GT_EffectTreeTwister extends GT_AlleleEffect {
-
-    private static final Integer[] ALLOWED_DIMS = { 2, // spectre
-        112, // last millenium
-        60, // bedrock
-        69, // pocket plane
-    };
-
-    private static final ItemStack TF_TRANS_SAPLING = GT_ModHandler
-        .getModItem(TwilightForest.ID, "tile.TFSapling", 1, 6);
-    private static final ItemStack BARN_SAPLING = GT_ModHandler.getModItem(GalaxySpace.ID, "barnardaCsapling", 1, 1);
-
-    static {
-        if (TF_TRANS_SAPLING == null) {
-            GT_Mod.GT_FML_LOGGER.info("GT_EffectTreeTwister(): Could not get ItemStack for BarnardaC sapling");
-        }
-        if (BARN_SAPLING == null) {
-            GT_Mod.GT_FML_LOGGER.info("GT_EffectTreeTwister(): Could not get ItemStack for BarnardaC sapling");
-        }
-    }
-
-    public GT_EffectTreeTwister() {
-        super("effectTreetwister", false, 0);
-    }
-
-    public IEffectData validateStorage(IEffectData storedData) {
-        return storedData; // unused for this effect
-    }
-
-    @Override
-    protected IEffectData doEffectTickThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
-        if (TF_TRANS_SAPLING == null || BARN_SAPLING == null) {
-            return storedData;
-        }
-        World world = housing.getWorld();
-        if (!Arrays.asList(ALLOWED_DIMS)
-            .contains(world.provider.dimensionId)) {
-            return storedData;
-        }
-        ChunkCoordinates coords = housing.getCoordinates();
-        IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
-
-        // Get random coords within territory
-        int xRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[0]);
-        int yRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[1]);
-        int zRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[2]);
-
-        int xCoord = coords.posX + world.rand.nextInt(xRange) - xRange / 2;
-        int yCoord = coords.posY + world.rand.nextInt(yRange) - yRange / 2;
-        int zCoord = coords.posZ + world.rand.nextInt(zRange) - zRange / 2;
-
-        ItemStack sourceBlock = new ItemStack(
-            world.getBlock(xCoord, yCoord, zCoord),
-            1,
-            world.getBlockMetadata(xCoord, yCoord, zCoord));
-        if (TF_TRANS_SAPLING != null && BARN_SAPLING != null && TF_TRANS_SAPLING.isItemEqual(sourceBlock)) {
-            world.setBlock(
-                xCoord,
-                yCoord,
-                zCoord,
-                Block.getBlockFromItem(BARN_SAPLING.getItem()),
-                BARN_SAPLING.getItemDamage(),
-                2);
-        }
-        return storedData;
-    }
-}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GT_Flowers.java b/src/main/java/gregtech/loaders/misc/bees/GT_Flowers.java
deleted file mode 100644
index d2ab1d6297..0000000000
--- a/src/main/java/gregtech/loaders/misc/bees/GT_Flowers.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package gregtech.loaders.misc.bees;
-
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Set;
-
-import net.minecraft.block.Block;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-import net.minecraft.world.World;
-import net.minecraftforge.common.EnumPlantType;
-
-import forestry.api.apiculture.FlowerManager;
-import forestry.api.genetics.AlleleManager;
-import forestry.api.genetics.IAllele;
-import forestry.api.genetics.IAlleleFlowers;
-import forestry.api.genetics.IChromosomeType;
-import forestry.api.genetics.IFlower;
-import forestry.api.genetics.IFlowerProvider;
-import forestry.api.genetics.IIndividual;
-import forestry.api.genetics.IPollinatable;
-import forestry.api.genetics.ISpeciesRoot;
-import gregtech.api.util.GT_LanguageManager;
-
-public enum GT_Flowers implements IFlowerProvider, IAlleleFlowers, IChromosomeType {
-
-    FLAMING;
-
-    protected boolean dominant;
-
-    GT_Flowers() {
-        dominant = true;
-    }
-
-    public static void doInit() {
-        for (GT_Flowers effect : values()) {
-            effect.register();
-        }
-    }
-
-    @Override
-    public String getUID() {
-        return "for.flowers." + toString().toLowerCase();
-    }
-
-    @Override
-    public boolean isDominant() {
-        return dominant;
-    }
-
-    @Override
-    public IFlowerProvider getProvider() {
-        return this;
-    }
-
-    @Override
-    public String getDescription() {
-        return GT_LanguageManager.getTranslation("for.flowers." + name().toLowerCase());
-    }
-
-    public void register() {
-        for (ItemStack stack : getItemStacks()) {
-            FlowerManager.flowerRegistry.registerAcceptableFlower(Block.getBlockFromItem(stack.getItem()), getUID());
-        }
-
-        AlleleManager.alleleRegistry.registerAllele(this, this);
-    }
-
-    public ItemStack[] getItemStacks() {
-        switch (this) {
-            case FLAMING:
-                return new ItemStack[] { new ItemStack(Blocks.fire) };
-        }
-        return new ItemStack[0];
-    }
-
-    @Override
-    public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
-        EnumSet types = pollinatable.getPlantType();
-        return types.size() > 1 || !types.contains(EnumPlantType.Nether);
-    }
-
-    public boolean isAcceptedFlower(World world, int x, int y, int z) {
-        Block block = world.getBlock(x, y, z);
-        if (block == null) {
-            return false;
-        }
-
-        switch (this) {
-            case FLAMING:
-                return block == Blocks.fire;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
-        return false;
-    }
-
-    @Override
-    public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
-        return products;
-    }
-
-    @Override
-    public String getName() {
-        return getDescription();
-    }
-
-    @Override
-    public String getUnlocalizedName() {
-        return getUID();
-    }
-
-    @Override
-    public String getFlowerType() {
-        return getUID();
-    }
-
-    @Override
-    public Set getFlowers() {
-        return new HashSet<>();
-    }
-
-    @Override
-    public Class getAlleleClass() {
-        return getClass();
-    }
-
-    @Override
-    public ISpeciesRoot getSpeciesRoot() {
-        return AlleleManager.alleleRegistry.getSpeciesRoot(getUID());
-    }
-}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java
index 2fb200216e..5a7316bfa3 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java
@@ -1,15 +1,15 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingBeans implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -25,9 +25,9 @@ public class ProcessingBeans implements gregtech.api.interfaces.IOreRecipeRegist
             return;
         }
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java
index b9926b188b..056feb0b33 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java
@@ -4,21 +4,21 @@ import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
 import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsBotania;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -35,14 +35,14 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
         }
 
         if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV
-            && GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+            && GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
 
             if (aMaterial == MaterialsBotania.Livingrock || aMaterial == MaterialsBotania.Livingwood
                 || aMaterial == MaterialsBotania.Dreamwood) {
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
                     .fluidInputs(
                         Materials.Water.getFluid(
                             Math.max(
@@ -52,11 +52,11 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
                     .fluidInputs(
-                        GT_ModHandler.getDistilledWater(
+                        GTModHandler.getDistilledWater(
                             Math.max(
                                 3,
                                 Math.min(750, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 426))))
@@ -64,9 +64,9 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
                     .fluidInputs(
                         Materials.Lubricant.getFluid(
                             Math.max(
@@ -80,9 +80,9 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
 
             else if (aMaterial != Materials.Clay && aMaterial != Materials.Basalt) {
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
                     .fluidInputs(
                         Materials.Water.getFluid(
                             Math.max(
@@ -92,11 +92,11 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
                     .fluidInputs(
-                        GT_ModHandler.getDistilledWater(
+                        GTModHandler.getDistilledWater(
                             Math.max(
                                 3,
                                 Math.min(750, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 426))))
@@ -104,9 +104,9 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
                     .fluidInputs(
                         Materials.Lubricant.getFluid(
                             Math.max(
@@ -118,18 +118,18 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
             }
         }
 
-        ItemStack tStack1 = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L);
-        ItemStack tStack2 = GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L);
-        ItemStack tStack3 = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L);
+        ItemStack tStack1 = GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L);
+        ItemStack tStack2 = GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L);
+        ItemStack tStack3 = GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L);
 
-        GT_ModHandler.removeRecipeDelayed(GT_Utility.copyAmount(1, aStack));
+        GTModHandler.removeRecipeDelayed(GTUtility.copyAmount(1, aStack));
 
-        if (tStack1 != null) GT_ModHandler
+        if (tStack1 != null) GTModHandler
             .removeRecipeDelayed(tStack1, tStack1, tStack1, tStack1, tStack1, tStack1, tStack1, tStack1, tStack1);
-        if (tStack2 != null) GT_ModHandler
+        if (tStack2 != null) GTModHandler
             .removeRecipeDelayed(tStack2, tStack2, tStack2, tStack2, tStack2, tStack2, tStack2, tStack2, tStack2);
         if (tStack3 != null) {
-            GT_ModHandler
+            GTModHandler
                 .removeRecipeDelayed(tStack3, tStack3, tStack3, tStack3, tStack3, tStack3, tStack3, tStack3, tStack3);
         }
 
@@ -137,9 +137,9 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
             if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(ItemList.Shape_Mold_Block.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
                         .fluidInputs(aMaterial.getMolten(1296L))
                         .duration(14 * SECONDS + 8 * TICKS)
                         .eut(8)
@@ -153,7 +153,7 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
         if (tStack3 != null) tStack3.stackSize = 9;
 
         if (tStack2 != null) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(aStack)
                 .itemOutputs(tStack2)
                 .duration(5 * SECONDS)
@@ -163,17 +163,17 @@ public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegist
 
         if (tStack2 != null && aMaterial != Materials.NetherQuartz) {
             if (tStack3 != null)
-                GT_ModHandler.addShapelessCraftingRecipe(tStack3, new Object[] { OrePrefixes.block.get(aMaterial) });
-            GT_ModHandler.addShapelessCraftingRecipe(tStack2, new Object[] { OrePrefixes.block.get(aMaterial) });
+                GTModHandler.addShapelessCraftingRecipe(tStack3, new Object[] { OrePrefixes.block.get(aMaterial) });
+            GTModHandler.addShapelessCraftingRecipe(tStack2, new Object[] { OrePrefixes.block.get(aMaterial) });
             if (tStack1 != null)
-                GT_ModHandler.addShapelessCraftingRecipe(tStack1, new Object[] { OrePrefixes.block.get(aMaterial) });
+                GTModHandler.addShapelessCraftingRecipe(tStack1, new Object[] { OrePrefixes.block.get(aMaterial) });
         }
 
         if (!OrePrefixes.block.isIgnored(aMaterial) && tStack1 != null) {
             // 9 ingots -> 1 block
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 9L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 9L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
                 .duration(15 * SECONDS)
                 .eut(calculateRecipeEU(aMaterial, 2))
                 .addTo(compressorRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java
index 0d28c417a8..3df65eb483 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java
@@ -6,9 +6,9 @@ import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingBolt implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -35,9 +35,9 @@ public class ProcessingBolt implements gregtech.api.interfaces.IOreRecipeRegistr
             return;
         }
 
-        GT_ModHandler.addCraftingRecipe(
-            GT_Utility.copyAmount(2, aStack),
-            GT_Proxy.tBits,
+        GTModHandler.addCraftingRecipe(
+            GTUtility.copyAmount(2, aStack),
+            GTProxy.tBits,
             new Object[] { "s ", " X", 'X', OrePrefixes.stick.get(aMaterial) });
 
     }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java
index dcdbda4508..62c1c7cc5c 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java
@@ -1,14 +1,14 @@
 package gregtech.loaders.oreprocessing;
 
-import static gregtech.api.enums.GT_Values.RA;
+import static gregtech.api.enums.GTValues.RA;
 import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
 import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
 import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
 import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE;
 
 import java.util.ArrayList;
 
@@ -20,11 +20,11 @@ import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
 import gregtech.api.interfaces.IOreRecipeRegistrator;
 import gregtech.api.objects.MaterialStack;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTRecipeConstants;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingCell implements IOreRecipeRegistrator {
 
@@ -39,7 +39,7 @@ public class ProcessingCell implements IOreRecipeRegistrator {
         switch (aPrefix) {
             case cell -> {
                 if (aMaterial == Materials.Empty) {
-                    GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+                    GTModHandler.removeRecipeByOutputDelayed(aStack);
                     if (aModName.equalsIgnoreCase("AtomicScience")) {
                         RA.stdBuilder()
                             .itemInputs(ItemList.Cell_Empty.get(1L))
@@ -50,15 +50,15 @@ public class ProcessingCell implements IOreRecipeRegistrator {
                     }
                 } else {
                     if (aMaterial.mFuelPower > 0) {
-                        GT_RecipeBuilder recipeBuilder = RA.stdBuilder();
-                        recipeBuilder.itemInputs(GT_Utility.copyAmount(1, aStack));
-                        if (GT_Utility.getFluidForFilledItem(aStack, true) == null
-                            && GT_Utility.getContainerItem(aStack, true) != null) {
-                            recipeBuilder.itemOutputs(GT_Utility.getContainerItem(aStack, true));
+                        GTRecipeBuilder recipeBuilder = RA.stdBuilder();
+                        recipeBuilder.itemInputs(GTUtility.copyAmount(1, aStack));
+                        if (GTUtility.getFluidForFilledItem(aStack, true) == null
+                            && GTUtility.getContainerItem(aStack, true) != null) {
+                            recipeBuilder.itemOutputs(GTUtility.getContainerItem(aStack, true));
                         }
                         recipeBuilder.metadata(FUEL_VALUE, aMaterial.mFuelPower)
                             .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                     }
                     if (!((aMaterial.mMaterialList.size() > 0) && ((aMaterial.mExtraData & 0x3) != 0))) {
                         break;
@@ -69,8 +69,8 @@ public class ProcessingCell implements IOreRecipeRegistrator {
                         tAllAmount = (int) (tAllAmount + tMat2.mAmount);
                     }
                     long tItemAmount = 0L;
-                    long tCapsuleCount = (long) GT_ModHandler
-                        .getCapsuleCellContainerCountMultipliedWithStackSize(aStack) * -tAllAmount;
+                    long tCapsuleCount = (long) GTModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(aStack)
+                        * -tAllAmount;
                     long tDensityMultiplier = aMaterial.getDensity() > 3628800L ? aMaterial.getDensity() / 3628800L
                         : 1L;
                     ArrayList tList = new ArrayList<>();
@@ -83,9 +83,9 @@ public class ProcessingCell implements IOreRecipeRegistrator {
                         if (tMat.mMaterial == Materials.Air) {
                             tStack = ItemList.Cell_Air.get(tMat.mAmount * tDensityMultiplier / 2L);
                         } else {
-                            tStack = GT_OreDictUnificator.get(OrePrefixes.dust, tMat.mMaterial, tMat.mAmount);
+                            tStack = GTOreDictUnificator.get(OrePrefixes.dust, tMat.mMaterial, tMat.mAmount);
                             if (tStack == null) {
-                                tStack = GT_OreDictUnificator.get(OrePrefixes.cell, tMat.mMaterial, tMat.mAmount);
+                                tStack = GTOreDictUnificator.get(OrePrefixes.cell, tMat.mMaterial, tMat.mAmount);
                             }
                         }
                         if (tItemAmount + tMat.mAmount * 3628800L > aStack.getMaxStackSize() * aMaterial.getDensity()) {
@@ -100,15 +100,15 @@ public class ProcessingCell implements IOreRecipeRegistrator {
 
                         tStack.stackSize = ((int) (tStack.stackSize * tDensityMultiplier));
                         while ((tStack.stackSize > 64)
-                            && (tCapsuleCount + GT_ModHandler.getCapsuleCellContainerCount(tStack) * 64L < 0L
+                            && (tCapsuleCount + GTModHandler.getCapsuleCellContainerCount(tStack) * 64L < 0L
                                 ? tList.size() < 5
                                 : tList.size() < 6)
-                            && (tCapsuleCount + GT_ModHandler.getCapsuleCellContainerCount(tStack) * 64L <= 64L)) {
-                            tCapsuleCount += GT_ModHandler.getCapsuleCellContainerCount(tStack) * 64L;
-                            tList.add(GT_Utility.copyAmount(64, tStack));
+                            && (tCapsuleCount + GTModHandler.getCapsuleCellContainerCount(tStack) * 64L <= 64L)) {
+                            tCapsuleCount += GTModHandler.getCapsuleCellContainerCount(tStack) * 64L;
+                            tList.add(GTUtility.copyAmount(64, tStack));
                             tStack.stackSize -= 64;
                         }
-                        int tThisCapsuleCount = GT_ModHandler
+                        int tThisCapsuleCount = GTModHandler
                             .getCapsuleCellContainerCountMultipliedWithStackSize(tStack);
                         if (tStack.stackSize > 0 && tCapsuleCount + tThisCapsuleCount <= 64L) {
                             if (tCapsuleCount + tThisCapsuleCount < 0L ? tList.size() < 5 : tList.size() < 6) {
@@ -118,7 +118,7 @@ public class ProcessingCell implements IOreRecipeRegistrator {
                         }
                     }
 
-                    tItemAmount = GT_Utility.ceilDiv(tItemAmount * tDensityMultiplier, aMaterial.getDensity());
+                    tItemAmount = GTUtility.ceilDiv(tItemAmount * tDensityMultiplier, aMaterial.getDensity());
 
                     if (tList.size() <= 0) {
                         break;
@@ -127,15 +127,15 @@ public class ProcessingCell implements IOreRecipeRegistrator {
                     if ((aMaterial.mExtraData & 0x1) != 0) {
 
                         // Electrolyzer recipe
-                        if (GT_Utility.getFluidForFilledItem(aStack, true) == null) {
+                        if (GTUtility.getFluidForFilledItem(aStack, true) == null) {
                             // dust stuffed cell e.g. Phosphate, Phosphorous Pentoxide
-                            GT_RecipeBuilder recipeBuilder = RA.stdBuilder();
+                            GTRecipeBuilder recipeBuilder = RA.stdBuilder();
                             if (tCapsuleCount > 0L) {
                                 recipeBuilder.itemInputs(
-                                    GT_Utility.copyAmount(tItemAmount, aStack),
+                                    GTUtility.copyAmount(tItemAmount, aStack),
                                     ItemList.Cell_Empty.get(tCapsuleCount));
                             } else {
-                                recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+                                recipeBuilder.itemInputs(GTUtility.copyAmount(tItemAmount, aStack));
                             }
                             if (tCapsuleCount < 0L) {
                                 tList.add(ItemList.Cell_Empty.get(-tCapsuleCount));
@@ -147,7 +147,7 @@ public class ProcessingCell implements IOreRecipeRegistrator {
                                 .addTo(electrolyzerRecipes);
                         } else {
                             long tCellBalance = tCapsuleCount + tItemAmount - 1;
-                            GT_RecipeBuilder recipeBuilder = RA.stdBuilder();
+                            GTRecipeBuilder recipeBuilder = RA.stdBuilder();
                             if (tCellBalance > 0L) {
                                 recipeBuilder.itemInputs(aStack, ItemList.Cell_Empty.get(tCellBalance));
                             } else {
@@ -164,13 +164,13 @@ public class ProcessingCell implements IOreRecipeRegistrator {
                         }
                     }
                     if ((aMaterial.mExtraData & 0x2) != 0) {
-                        GT_RecipeBuilder recipeBuilder = RA.stdBuilder();
+                        GTRecipeBuilder recipeBuilder = RA.stdBuilder();
                         if (tCapsuleCount > 0L) {
                             recipeBuilder.itemInputs(
-                                GT_Utility.copyAmount(tItemAmount, aStack),
+                                GTUtility.copyAmount(tItemAmount, aStack),
                                 ItemList.Cell_Empty.get(tCapsuleCount));
                         } else {
-                            recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+                            recipeBuilder.itemInputs(GTUtility.copyAmount(tItemAmount, aStack));
                         }
                         if (tCapsuleCount < 0L) {
                             tList.add(ItemList.Cell_Empty.get(-tCapsuleCount));
@@ -185,257 +185,257 @@ public class ProcessingCell implements IOreRecipeRegistrator {
             }
             case cellPlasma -> {
                 if (aMaterial == Materials.Empty) {
-                    GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+                    GTModHandler.removeRecipeByOutputDelayed(aStack);
                 } else {
-                    GT_RecipeBuilder recipeBuilder = RA.stdBuilder();
-                    recipeBuilder.itemInputs(GT_Utility.copyAmount(1, aStack));
-                    if (GT_Utility.getFluidForFilledItem(aStack, true) == null
-                        && GT_Utility.getContainerItem(aStack, true) != null) {
-                        recipeBuilder.itemOutputs(GT_Utility.getContainerItem(aStack, true));
+                    GTRecipeBuilder recipeBuilder = RA.stdBuilder();
+                    recipeBuilder.itemInputs(GTUtility.copyAmount(1, aStack));
+                    if (GTUtility.getFluidForFilledItem(aStack, true) == null
+                        && GTUtility.getContainerItem(aStack, true) != null) {
+                        recipeBuilder.itemOutputs(GTUtility.getContainerItem(aStack, true));
                     }
                     // Switch case to set manual values for specific plasmas and escape the formula based on mass
                     // when it doesn't make sense for powergen balance.
                     switch (aMaterial.mName) {
                         case "Aluminium" -> recipeBuilder.metadata(FUEL_VALUE, 159_744)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Americium" -> recipeBuilder.metadata(FUEL_VALUE, 501_760)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Antimony" -> recipeBuilder.metadata(FUEL_VALUE, 309_760)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Argon" -> recipeBuilder.metadata(FUEL_VALUE, 188_416)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Arsenic" -> recipeBuilder.metadata(FUEL_VALUE, 230_400)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Barium" -> recipeBuilder.metadata(FUEL_VALUE, 342_302)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Beryllium" -> recipeBuilder.metadata(FUEL_VALUE, 110_592)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Bismuth" -> recipeBuilder.metadata(FUEL_VALUE, 425_984)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Boron" -> recipeBuilder.metadata(FUEL_VALUE, 112_640)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Cadmium" -> recipeBuilder.metadata(FUEL_VALUE, 293_601)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Caesium" -> recipeBuilder.metadata(FUEL_VALUE, 332_513)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Calcium" -> recipeBuilder.metadata(FUEL_VALUE, 188_416)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Cerium" -> recipeBuilder.metadata(FUEL_VALUE, 346_931)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Chlorine" -> recipeBuilder.metadata(FUEL_VALUE, 172_032)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Chrome" -> recipeBuilder.metadata(FUEL_VALUE, 202_342)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Cobalt" -> recipeBuilder.metadata(FUEL_VALUE, 217_497)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Copper" -> recipeBuilder.metadata(FUEL_VALUE, 219_340)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Deuterium" -> recipeBuilder.metadata(FUEL_VALUE, 40_960)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Erbium" -> recipeBuilder.metadata(FUEL_VALUE, 376_217)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Europium" -> recipeBuilder.metadata(FUEL_VALUE, 355_635)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Fluorine" -> recipeBuilder.metadata(FUEL_VALUE, 147_456)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Force" -> recipeBuilder.metadata(FUEL_VALUE, 180_000)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Gadolinium" -> recipeBuilder.metadata(FUEL_VALUE, 366_551)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Gallium" -> recipeBuilder.metadata(FUEL_VALUE, 229_376)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Gold" -> recipeBuilder.metadata(FUEL_VALUE, 401_408)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Helium_3" -> recipeBuilder.metadata(FUEL_VALUE, 61_440)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Helium" -> recipeBuilder.metadata(FUEL_VALUE, 81_920)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Holmium" -> recipeBuilder.metadata(FUEL_VALUE, 376_176)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Hydrogen" -> recipeBuilder.metadata(FUEL_VALUE, 20_480)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Indium" -> recipeBuilder.metadata(FUEL_VALUE, 296_509)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Iridium" -> recipeBuilder.metadata(FUEL_VALUE, 397_148)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Iron" -> recipeBuilder.metadata(FUEL_VALUE, 206_438)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Lanthanum" -> recipeBuilder.metadata(FUEL_VALUE, 344_801)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Lead" -> recipeBuilder.metadata(FUEL_VALUE, 423_936)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Lithium" -> recipeBuilder.metadata(FUEL_VALUE, 100_352)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Lutetium" -> recipeBuilder.metadata(FUEL_VALUE, 381_296)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Magnesium" -> recipeBuilder.metadata(FUEL_VALUE, 152_371)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Manganese" -> recipeBuilder.metadata(FUEL_VALUE, 202_752)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Mercury" -> recipeBuilder.metadata(FUEL_VALUE, 409_600)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Molybdenum" -> recipeBuilder.metadata(FUEL_VALUE, 272_384)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Neodymium" -> recipeBuilder.metadata(FUEL_VALUE, 347_996)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Nickel" -> recipeBuilder.metadata(FUEL_VALUE, 213_811)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Niobium" -> recipeBuilder.metadata(FUEL_VALUE, 269_516)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Nitrogen" -> recipeBuilder.metadata(FUEL_VALUE, 129_024)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Osmium" -> recipeBuilder.metadata(FUEL_VALUE, 393_659)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Oxygen" -> recipeBuilder.metadata(FUEL_VALUE, 131_072)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Palladium" -> recipeBuilder.metadata(FUEL_VALUE, 282_214)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Phosphor" -> recipeBuilder.metadata(FUEL_VALUE, 165_888)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Platinum" -> recipeBuilder.metadata(FUEL_VALUE, 399_360)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Plutonium241" -> recipeBuilder.metadata(FUEL_VALUE, 497_664)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Plutonium" -> recipeBuilder.metadata(FUEL_VALUE, 503_808)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Potassium" -> recipeBuilder.metadata(FUEL_VALUE, 183_705)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Praseodymium" -> recipeBuilder.metadata(FUEL_VALUE, 346_931)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Promethium" -> recipeBuilder.metadata(FUEL_VALUE, 347_996)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Radon" -> recipeBuilder.metadata(FUEL_VALUE, 450_560)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Rubidium" -> recipeBuilder.metadata(FUEL_VALUE, 243_712)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Samarium" -> recipeBuilder.metadata(FUEL_VALUE, 353_280)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Scandium" -> recipeBuilder.metadata(FUEL_VALUE, 193_536)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Silicon" -> recipeBuilder.metadata(FUEL_VALUE, 160_563)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Silver" -> recipeBuilder.metadata(FUEL_VALUE, 282_685)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Sodium" -> recipeBuilder.metadata(FUEL_VALUE, 148_684)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Strontium" -> recipeBuilder.metadata(FUEL_VALUE, 249_446)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Sulfur" -> recipeBuilder.metadata(FUEL_VALUE, 170_393)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Tantalum" -> recipeBuilder.metadata(FUEL_VALUE, 384_000)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Terbium" -> recipeBuilder.metadata(FUEL_VALUE, 368_885)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Thorium" -> recipeBuilder.metadata(FUEL_VALUE, 471_040)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Thulium" -> recipeBuilder.metadata(FUEL_VALUE, 378_470)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Tin" -> recipeBuilder.metadata(FUEL_VALUE, 150_000)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Titanium" -> recipeBuilder.metadata(FUEL_VALUE, 196_608)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Tritium" -> recipeBuilder.metadata(FUEL_VALUE, 61_440)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Tungsten" -> recipeBuilder.metadata(FUEL_VALUE, 384_778)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Uranium235" -> recipeBuilder.metadata(FUEL_VALUE, 481_280)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Uranium" -> recipeBuilder.metadata(FUEL_VALUE, 487_424)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Vanadium" -> recipeBuilder.metadata(FUEL_VALUE, 198_451)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Ytterbium" -> recipeBuilder.metadata(FUEL_VALUE, 379_695)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Yttrium" -> recipeBuilder.metadata(FUEL_VALUE, 255_180)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         case "Zinc" -> recipeBuilder.metadata(FUEL_VALUE, 226_304)
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                         default -> recipeBuilder
                             .metadata(FUEL_VALUE, (int) Math.max(1024L, 1024L * aMaterial.getMass()))
                             .metadata(FUEL_TYPE, 4)
-                            .addTo(GT_RecipeConstants.Fuel);
+                            .addTo(GTRecipeConstants.Fuel);
                     }
-                    if (GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L) != null) {
+                    if (GTOreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L) != null) {
                         RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L))
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L))
                             .duration(((int) Math.max(aMaterial.getMass() * 2L, 1L)) * TICKS)
                             .eut(TierEU.RECIPE_MV)
                             .addTo(vacuumFreezerRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java
index c2a68c5bc2..bca59a3543 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java
@@ -6,8 +6,8 @@ import net.minecraft.item.ItemStack;
 
 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.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class ProcessingCircuit implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -18,13 +18,13 @@ public class ProcessingCircuit implements gregtech.api.interfaces.IOreRecipeRegi
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        if (gregtech.api.util.GT_OreDictUnificator.isBlacklisted(aStack) && aModName.equals(GregTech.ID)) return;
+        if (GTOreDictUnificator.isBlacklisted(aStack) && aModName.equals(GregTech.ID)) return;
         switch (aMaterial.mName) {
             case "Good", "Data", "Elite", "Master", "Ultimate", "Superconductor", "Infinite", "Bio" -> {
-                if (!GT_OreDictUnificator.isBlacklisted(aStack) && !aModName.equals(GregTech.ID))
-                    GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+                if (!GTOreDictUnificator.isBlacklisted(aStack) && !aModName.equals(GregTech.ID))
+                    GTModHandler.removeRecipeByOutputDelayed(aStack);
             }
-            case "Primitive", "Basic", "Advanced" -> GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+            case "Primitive", "Basic", "Advanced" -> GTModHandler.removeRecipeByOutputDelayed(aStack);
         }
     }
 }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java
index 4ef818df5b..00f901b6be 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java
@@ -2,12 +2,12 @@ package gregtech.loaders.oreprocessing;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.GregTech_API;
+import gregtech.api.GregTechAPI;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.interfaces.IOreRecipeRegistrator;
 import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GTModHandler;
 
 public class ProcessingCompressed implements IOreRecipeRegistrator {
 
@@ -18,8 +18,8 @@ public class ProcessingCompressed implements IOreRecipeRegistrator {
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
-        GregTech_API
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
+        GregTechAPI
             .registerCover(aStack, TextureFactory.of(aMaterial.mIconSet.mTextures[72], aMaterial.mRGBa, false), null);
     }
 }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java
index 200ce743c9..861694e35a 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java
@@ -5,22 +5,22 @@ import static gregtech.api.enums.Mods.BuildCraftSilicon;
 import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
 import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.WaferEngravingRecipes;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.WaferEngravingRecipes;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
 public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeRegistrator {
@@ -34,8 +34,8 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
         ItemStack aStack) {
         switch (aOreDictName) {
             case "craftingQuartz" -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(new ItemStack(Blocks.redstone_torch, 3, 32767), GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(new ItemStack(Blocks.redstone_torch, 3, 32767), GTUtility.copyAmount(1, aStack))
                     .itemOutputs(new ItemStack(net.minecraft.init.Items.comparator, 1, 0))
                     .fluidInputs(Materials.Concrete.getMolten(144L))
                     .duration(2 * SECONDS)
@@ -44,58 +44,58 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
             }
             case "craftingLensBlue" -> {
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 13))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 13))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 13))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 13))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.IC2_LapotronCrystal.getWildcard(1L), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.IC2_LapotronCrystal.getWildcard(1L), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Parts_Crystal_Chip_Master.get(3L))
                     .requiresCleanRoom()
                     .duration(45 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Chip_CrystalCPU.get(1L), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Chip_CrystalCPU.get(1L), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Chip_CrystalSoC.get(1))
                     .requiresCleanRoom()
                     .duration(30 * SECONDS)
                     .eut(40000)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_PIC.get(1))
                     .requiresCleanRoom()
                     .duration(60 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_PIC.get(4))
                     .requiresCleanRoom()
                     .duration(40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_QPIC.get(1))
                     .requiresCleanRoom()
                     .duration(2 * MINUTES)
@@ -105,57 +105,57 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
             }
             case "craftingLensYellow" -> {
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 14))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 14))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 14))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 14))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_LPIC.get(1))
                     .duration(40 * SECONDS)
                     .eut(TierEU.RECIPE_MV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_LPIC.get(4))
                     .requiresCleanRoom()
                     .duration(30 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_SoC.get(1))
                     .requiresCleanRoom()
                     .duration(45 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_SoC.get(4))
                     .requiresCleanRoom()
                     .duration(30 * SECONDS)
                     .eut(TierEU.RECIPE_IV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_SoC.get(8))
                     .requiresCleanRoom()
                     .duration(15 * SECONDS)
@@ -164,29 +164,29 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
             }
             case "craftingLensOrange" -> {
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(1))
                     .duration(15 * SECONDS)
                     .eut(64)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(4))
                     .duration(15 * SECONDS)
                     .eut(256)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(16))
                     .duration(15 * SECONDS)
                     .eut(1024)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(64))
                     .duration(15 * SECONDS)
                     .eut(4096)
@@ -195,57 +195,57 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
             }
             case "craftingLensCyan" -> {
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 15))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 15))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 15))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 15))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Ram.get(1))
                     .duration(60 * SECONDS)
                     .eut(TierEU.RECIPE_MV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Ram.get(4))
                     .requiresCleanRoom()
                     .duration(45 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Ram.get(8))
                     .requiresCleanRoom()
                     .duration(30 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Ram.get(16))
                     .requiresCleanRoom()
                     .duration(15 * SECONDS)
                     .eut(TierEU.RECIPE_IV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_Ram.get(32))
                     .requiresCleanRoom()
                     .duration(7 * SECONDS + 10 * TICKS)
@@ -255,57 +255,57 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
             }
             case "craftingLensRed" -> {
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Redstone, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+                        GTOreDictUnificator.get(OrePrefixes.plate, Materials.Redstone, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
                     .duration(2 * SECONDS + 10 * TICKS)
                     .eut(TierEU.RECIPE_MV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.foil, Materials.RedAlloy, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EtchedLowVoltageWiring", 1L, 0))
+                        GTOreDictUnificator.get(OrePrefixes.foil, Materials.RedAlloy, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EtchedLowVoltageWiring", 1L, 0))
                     .duration(10 * SECONDS)
                     .eut(16)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_ILC.get(1))
                     .duration(60 * SECONDS)
                     .eut(TierEU.RECIPE_MV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_ILC.get(4))
                     .requiresCleanRoom()
                     .duration(45 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_ILC.get(8))
                     .requiresCleanRoom()
                     .duration(30 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_NPIC.get(1))
                     .requiresCleanRoom()
                     .duration(1 * MINUTES + 30 * SECONDS)
                     .eut(TierEU.RECIPE_LuV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_NPIC.get(4))
                     .requiresCleanRoom()
                     .duration(1 * MINUTES + 15 * SECONDS)
@@ -315,54 +315,54 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
             }
             case "craftingLensGreen" -> {
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Parts_Crystal_Chip_Elite.get(1L), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Parts_Crystal_Chip_Elite.get(1L), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Chip_CrystalCPU.get(1))
                     .requiresCleanRoom()
                     .duration(30 * SECONDS)
                     .eut(10000)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Chip_CrystalSoC.get(1L), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Chip_CrystalSoC.get(1L), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Chip_CrystalSoC2.get(1))
                     .requiresCleanRoom()
                     .duration(60 * SECONDS)
                     .eut(80000)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_ULPIC.get(2))
                     .duration(30 * SECONDS)
                     .eut(30)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_ULPIC.get(8))
                     .duration(30 * SECONDS)
                     .eut(TierEU.RECIPE_MV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_SoC2.get(1))
                     .requiresCleanRoom()
                     .duration(1 * MINUTES + 30 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_SoC2.get(2))
                     .requiresCleanRoom()
                     .duration(1 * MINUTES + 15 * SECONDS)
                     .eut(TierEU.RECIPE_IV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_SoC2.get(4))
                     .requiresCleanRoom()
                     .duration(60 * SECONDS)
@@ -371,88 +371,88 @@ public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeReg
             }
             case "craftingLensWhite" -> {
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 19))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 19))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 19))
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 19))
                     .duration(1 * MINUTES + 40 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(new ItemStack(Blocks.sandstone, 1, 2), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(new ItemStack(Blocks.sandstone, 1, 2), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(new ItemStack(Blocks.sandstone, 1, 1))
                     .duration(2 * SECONDS + 10 * TICKS)
                     .eut(16)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(new ItemStack(Blocks.stone, 1, 0), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(new ItemStack(Blocks.stone, 1, 0), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(new ItemStack(Blocks.stonebrick, 1, 3))
                     .duration(2 * SECONDS + 10 * TICKS)
                     .eut(16)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(new ItemStack(Blocks.quartz_block, 1, 0), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(new ItemStack(Blocks.quartz_block, 1, 0), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(new ItemStack(Blocks.quartz_block, 1, 1))
                     .duration(2 * SECONDS + 10 * TICKS)
                     .eut(16)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1L),
-                        GT_Utility.copyAmount(0, aStack))
-                    .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzChiseled", 1L))
+                        GTModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1L),
+                        GTUtility.copyAmount(0, aStack))
+                    .itemOutputs(GTModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzChiseled", 1L))
                     .duration(2 * SECONDS + 10 * TICKS)
                     .eut(16)
                     .addTo(laserEngraverRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_CPU.get(1))
                     .requiresCleanRoom()
                     .duration(60 * SECONDS)
                     .eut(TierEU.RECIPE_MV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_CPU.get(4))
                     .requiresCleanRoom()
                     .duration(45 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_CPU.get(8))
                     .requiresCleanRoom()
                     .duration(30 * SECONDS)
                     .eut(TierEU.RECIPE_EV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_CPU.get(16))
                     .requiresCleanRoom()
                     .duration(15 * SECONDS)
                     .eut(TierEU.RECIPE_IV)
                     .addTo(WaferEngravingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GTUtility.copyAmount(0, aStack))
                     .itemOutputs(ItemList.Circuit_Wafer_CPU.get(32))
                     .requiresCleanRoom()
                     .duration(7 * SECONDS + 10 * TICKS)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java
index 92b5ae9cda..b4db15db42 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java
@@ -5,19 +5,20 @@ import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
 import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
 import static gregtech.api.recipe.RecipeMaps.slicerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraftforge.fluids.Fluid;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -29,8 +30,8 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         net.minecraft.item.ItemStack aStack) {
         // Compressor recipes
-        GT_Values.RA.stdBuilder()
-            .itemInputs(gregtech.api.util.GT_Utility.copyAmount(8, aStack))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(8, aStack))
             .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
@@ -39,7 +40,7 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
         Fluid[] waterArray;
 
         if (IndustrialCraft2.isModLoaded()) {
-            waterArray = new Fluid[] { FluidRegistry.WATER, GT_ModHandler.getDistilledWater(1L)
+            waterArray = new Fluid[] { FluidRegistry.WATER, GTModHandler.getDistilledWater(1L)
                 .getFluid() };
         } else {
             waterArray = new Fluid[] { FluidRegistry.WATER };
@@ -48,7 +49,7 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
         switch (aOreDictName) {
             case "cropTea" -> {
                 for (Fluid tFluid : waterArray) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(aStack)
                         .fluidInputs(new FluidStack(tFluid, 750))
                         .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.tea"), 750))
@@ -59,7 +60,7 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
             }
             case "cropGrape" -> {
                 for (Fluid tFluid : waterArray) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(aStack)
                         .fluidInputs(new FluidStack(tFluid, 750))
                         .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.grapejuice"), 750))
@@ -68,27 +69,27 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
                         .addTo(brewingRecipes);
                 }
             }
-            case "cropChilipepper" -> GT_Values.RA.stdBuilder()
+            case "cropChilipepper" -> GTValues.RA.stdBuilder()
                 .itemInputs(aStack)
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
                 .duration(20 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
-            case "cropCoffee" -> GT_Values.RA.stdBuilder()
+            case "cropCoffee" -> GTValues.RA.stdBuilder()
                 .itemInputs(aStack)
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
                 .duration(20 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
             case "cropPotato" -> {
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
                     .itemOutputs(ItemList.Food_Raw_PotatoChips.get(1L))
                     .duration(3 * SECONDS + 4 * TICKS)
                     .eut(4)
                     .addTo(slicerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(aStack, ItemList.Shape_Slicer_Stripes.get(0L))
                     .itemOutputs(ItemList.Food_Raw_Fries.get(1L))
                     .duration(3 * SECONDS + 4 * TICKS)
@@ -96,7 +97,7 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
                     .addTo(slicerRecipes);
 
                 for (Fluid tFluid : waterArray) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(aStack)
                         .fluidInputs(new FluidStack(tFluid, 750))
                         .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.potatojuice"), 750))
@@ -106,7 +107,7 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
             }
             case "cropLemon" -> {
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
                     .itemOutputs(ItemList.Food_Sliced_Lemon.get(4L))
                     .duration(3 * SECONDS + 4 * TICKS)
@@ -114,7 +115,7 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
                     .addTo(slicerRecipes);
 
                 for (Fluid tFluid : waterArray) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(aStack)
                         .fluidInputs(new FluidStack(tFluid, 750))
                         .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.lemonjuice"), 750))
@@ -123,7 +124,7 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
                         .addTo(brewingRecipes);
                 }
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(aStack)
                     .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion.vodka"), 750))
                     .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.leninade"), 750))
@@ -131,19 +132,19 @@ public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistr
                     .eut(4)
                     .addTo(brewingRecipes);
             }
-            case "cropTomato" -> GT_Values.RA.stdBuilder()
+            case "cropTomato" -> GTValues.RA.stdBuilder()
                 .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
                 .itemOutputs(ItemList.Food_Sliced_Tomato.get(4L))
                 .duration(3 * SECONDS + 4 * TICKS)
                 .eut(4)
                 .addTo(slicerRecipes);
-            case "cropCucumber" -> GT_Values.RA.stdBuilder()
+            case "cropCucumber" -> GTValues.RA.stdBuilder()
                 .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
                 .itemOutputs(ItemList.Food_Sliced_Cucumber.get(4L))
                 .duration(3 * SECONDS + 4 * TICKS)
                 .eut(4)
                 .addTo(slicerRecipes);
-            case "cropOnion" -> GT_Values.RA.stdBuilder()
+            case "cropOnion" -> GTValues.RA.stdBuilder()
                 .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
                 .itemOutputs(ItemList.Food_Sliced_Onion.get(4L))
                 .duration(3 * SECONDS + 4 * TICKS)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java
index a730a1849b..ed80d04e99 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java
@@ -4,16 +4,16 @@ import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
 import static gregtech.api.recipe.RecipeMaps.sifterRecipes;
 import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingCrushedOre implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -27,20 +27,20 @@ public class ProcessingCrushedOre implements gregtech.api.interfaces.IOreRecipeR
         ItemStack aStack) {
         switch (aPrefix) {
             case crushedCentrifuged -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
                     .duration(10 * TICKS)
                     .eut(16)
                     .addTo(hammerRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
-                        GT_OreDictUnificator.get(
+                        GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+                        GTOreDictUnificator.get(
                             OrePrefixes.dust,
-                            GT_Utility.selectItemInList(2, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+                            GTUtility.selectItemInList(2, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
                             1L))
                     .outputChances(10000, 1000)
                     .duration(20 * SECONDS)
@@ -48,52 +48,52 @@ public class ProcessingCrushedOre implements gregtech.api.interfaces.IOreRecipeR
                     .addTo(maceratorRecipes);
             }
             case crushedPurified -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(
+                        GTOreDictUnificator.get(
                             OrePrefixes.crushedCentrifuged,
                             aMaterial.mMacerateInto,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
                             1L),
-                        GT_OreDictUnificator.get(
+                        GTOreDictUnificator.get(
                             OrePrefixes.dust,
-                            GT_Utility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+                            GTUtility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
                             1L))
                     .outputChances(10000, 1111)
                     .duration(25 * SECONDS)
                     .eut(48)
                     .addTo(thermalCentrifugeRecipes);
 
-                ItemStack tGem = GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L);
+                ItemStack tGem = GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L);
                 if (tGem == null) {
                     break;
                 }
 
                 switch (aMaterial.mName) {
-                    case "Tanzanite", "Sapphire", "Olivine", "GreenSapphire", "Opal", "Amethyst", "Emerald", "Ruby", "Amber", "Diamond", "FoolsRuby", "BlueTopaz", "GarnetRed", "Topaz", "Jasper", "GarnetYellow" -> GT_Values.RA
+                    case "Tanzanite", "Sapphire", "Olivine", "GreenSapphire", "Opal", "Amethyst", "Emerald", "Ruby", "Amber", "Diamond", "FoolsRuby", "BlueTopaz", "GarnetRed", "Topaz", "Jasper", "GarnetYellow" -> GTValues.RA
                         .stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, tGem, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, tGem, 1L),
                             tGem,
-                            GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, tGem, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, tGem, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, tGem, 1L))
+                            GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, tGem, 1L))
                         .outputChances(300, 1200, 4500, 1400, 2800, 3500)
                         .duration(40 * SECONDS)
                         .eut(16)
                         .addTo(sifterRecipes);
-                    default -> GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    default -> GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, tGem, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, tGem, 1L),
                             tGem,
-                            GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, tGem, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, tGem, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, tGem, 1L))
+                            GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, tGem, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, tGem, 1L))
                         .outputChances(100, 400, 1500, 2000, 4000, 5000)
                         .duration(40 * SECONDS)
                         .eut(16)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java
index ec8fd12a74..435573420d 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java
@@ -2,16 +2,16 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingCrystallized implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -27,20 +27,20 @@ public class ProcessingCrystallized implements gregtech.api.interfaces.IOreRecip
             return;
         }
 
-        if (GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1) == null) {
+        if (GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1) == null) {
             return;
         }
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java
index ed152fc47f..a09cc2ca44 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java
@@ -1,22 +1,22 @@
 package gregtech.loaders.oreprocessing;
 
-import static gregtech.api.enums.GT_Values.RA;
+import static gregtech.api.enums.GTValues.RA;
 import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
 import static gregtech.api.recipe.RecipeMaps.oreWasherRecipes;
 import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingDirty implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -30,24 +30,24 @@ public class ProcessingDirty implements gregtech.api.interfaces.IOreRecipeRegist
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         net.minecraft.item.ItemStack aStack) {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L))
             .duration(10)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
             .itemOutputs(
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.dustImpure,
                     aMaterial.mMacerateInto,
-                    GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
                     1L),
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.dust,
-                    GT_Utility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+                    GTUtility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
                     1L))
             .outputChances(10000, 1000)
             .duration(20 * SECONDS)
@@ -55,52 +55,52 @@ public class ProcessingDirty implements gregtech.api.interfaces.IOreRecipeRegist
             .addTo(maceratorRecipes);
 
         RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
+            .itemInputs(GTUtility.copyAmount(1, aStack))
             .itemOutputs(
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     aPrefix == OrePrefixes.crushed ? OrePrefixes.crushedPurified : OrePrefixes.dustPure,
                     aMaterial,
                     1L),
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.dust,
-                    GT_Utility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+                    GTUtility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
                     1L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
             .outputChances(100_00, 11_11, 100_00)
-            .fluidInputs(GT_ModHandler.getWater(1000))
+            .fluidInputs(GTModHandler.getWater(1000))
             .duration(25 * SECONDS)
             .eut(16)
             .addTo(oreWasherRecipes);
 
         RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
+            .itemInputs(GTUtility.copyAmount(1, aStack))
             .itemOutputs(
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     aPrefix == OrePrefixes.crushed ? OrePrefixes.crushedPurified : OrePrefixes.dustPure,
                     aMaterial,
                     1L),
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.dust,
-                    GT_Utility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+                    GTUtility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
                     1L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
             .outputChances(100_00, 11_11, 100_00)
-            .fluidInputs(GT_ModHandler.getDistilledWater(200))
+            .fluidInputs(GTModHandler.getDistilledWater(200))
             .duration(15 * SECONDS)
             .eut(16)
             .addTo(oreWasherRecipes);
 
         OrePrefixes prefix = aPrefix == OrePrefixes.crushed ? OrePrefixes.crushedCentrifuged : OrePrefixes.dust;
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
             .itemOutputs(
-                GT_OreDictUnificator.get(prefix, aMaterial, 1L),
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(prefix, aMaterial, 1L),
+                GTOreDictUnificator.get(
                     OrePrefixes.dust,
-                    GT_Utility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+                    GTUtility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
                     1L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
             .outputChances(10000, 1111, 10000)
             .duration(25 * SECONDS)
             .eut(48)
@@ -118,12 +118,12 @@ public class ProcessingDirty implements gregtech.api.interfaces.IOreRecipeRegist
             : OrePrefixes.dustPure;
 
         if (byproduct.contains(SubTag.WASHING_MERCURY)) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, stack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, stack))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(chemicalBathPrefix, material, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+                    GTOreDictUnificator.get(chemicalBathPrefix, material, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
                 .outputChances(10000, 7000, 4000)
                 .fluidInputs(Materials.Mercury.getFluid(1000L))
                 .duration(40 * SECONDS)
@@ -131,12 +131,12 @@ public class ProcessingDirty implements gregtech.api.interfaces.IOreRecipeRegist
                 .addTo(chemicalBathRecipes);
         }
         if (byproduct.contains(SubTag.WASHING_MERCURY_99_PERCENT)) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, stack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, stack))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(chemicalBathPrefix, material, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+                    GTOreDictUnificator.get(chemicalBathPrefix, material, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
                 .outputChances(10000, 9900, 4000)
                 .fluidInputs(Materials.Mercury.getFluid(1000L))
                 .duration(40 * SECONDS)
@@ -144,12 +144,12 @@ public class ProcessingDirty implements gregtech.api.interfaces.IOreRecipeRegist
                 .addTo(chemicalBathRecipes);
         }
         if (byproduct.contains(SubTag.WASHING_SODIUMPERSULFATE)) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, stack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, stack))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(chemicalBathPrefix, material, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+                    GTOreDictUnificator.get(chemicalBathPrefix, material, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
                 .outputChances(10000, 7000, 4000)
                 .fluidInputs(Materials.SodiumPersulfate.getFluid(100L))
                 .duration(40 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java
index c8a3af1130..3398fda98d 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java
@@ -9,12 +9,12 @@ import static gregtech.api.recipe.RecipeMaps.electroMagneticSeparatorRecipes;
 import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
 import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
 import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE;
 
 import java.util.ArrayList;
 
@@ -22,7 +22,7 @@ import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsUEVplus;
@@ -30,12 +30,12 @@ import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.objects.MaterialStack;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_RecipeRegistrator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTRecipeConstants;
+import gregtech.api.util.GTRecipeRegistrator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -54,26 +54,26 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
         switch (aPrefix) {
             case dust -> {
                 if (aMaterial.mFuelPower > 0) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .metadata(FUEL_VALUE, aMaterial.mFuelPower)
                         .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                        .addTo(GT_RecipeConstants.Fuel);
+                        .addTo(GTRecipeConstants.Fuel);
                 }
-                if ((GT_Utility.getFluidForFilledItem(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), true)
-                    == null) && (GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L) != null)) {
-                    GT_Values.RA.stdBuilder()
+                if ((GTUtility.getFluidForFilledItem(GTOreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), true)
+                    == null) && (GTOreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L) != null)) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(aStack, ItemList.Cell_Empty.get(1L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L))
                         .duration(5 * SECONDS)
                         .eut(1)
                         .addTo(cannerRecipes);
                 }
                 if (!aMaterial.mBlastFurnaceRequired) {
-                    GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+                    GTRecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
                     if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
-                        GT_RecipeRegistrator.registerReverseArcSmelting(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTRecipeRegistrator.registerReverseArcSmelting(
+                            GTUtility.copyAmount(1, aStack),
                             aMaterial,
                             aPrefix.mMaterialAmount,
                             null,
@@ -82,20 +82,20 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                     }
                 }
                 ItemStack tDustStack;
-                if ((null != (tDustStack = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L)))
+                if ((null != (tDustStack = GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L)))
                     && (!aMaterial.contains(SubTag.NO_SMELTING))) {
                     if (aMaterial.mBlastFurnaceRequired) {
-                        GT_ModHandler.removeFurnaceSmelting(aStack);
+                        GTModHandler.removeFurnaceSmelting(aStack);
                         if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
-                            GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+                            GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
                             recipeBuilder
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1));
+                                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1));
                             if (aMaterial.mBlastFurnaceTemp > 1750) {
                                 recipeBuilder.itemOutputs(
-                                    GT_OreDictUnificator
+                                    GTOreDictUnificator
                                         .get(OrePrefixes.ingotHot, aMaterial.mSmeltInto, tDustStack, 1L));
                             } else {
-                                recipeBuilder.itemOutputs(GT_Utility.copyAmount(1, tDustStack));
+                                recipeBuilder.itemOutputs(GTUtility.copyAmount(1, tDustStack));
                             }
                             recipeBuilder
                                 .duration(
@@ -105,23 +105,23 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                                 .addTo(blastFurnaceRecipes);
                         }
                     } else {
-                        GT_ModHandler.addSmeltingRecipe(aStack, tDustStack);
+                        GTModHandler.addSmeltingRecipe(aStack, tDustStack);
                     }
                 } else if (!aMaterial.contains(SubTag.NO_WORKING)) {
                     if ((!OrePrefixes.block.isIgnored(aMaterial))
-                        && (null == GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
-                        && GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L) != null) {
+                        && (null == GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                        && GTOreDictUnificator.get(OrePrefixes.block, aMaterial, 1L) != null) {
 
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(9, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(9, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
                             .duration(15 * SECONDS)
                             .eut(2)
                             .addTo(compressorRecipes);
                     }
                     // This is so disgustingly bad.
                     if (((OrePrefixes.block.isIgnored(aMaterial))
-                        || (null == GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L)))
+                        || (null == GTOreDictUnificator.get(OrePrefixes.block, aMaterial, 1L)))
                         && (aMaterial != Materials.GraniteRed)
                         && (aMaterial != Materials.GraniteBlack)
                         && (aMaterial != Materials.Basalt)
@@ -134,10 +134,10 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                         && (aMaterial != Materials.Clay)) {
                         // compressor recipe
                         {
-                            if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                            if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                                     .duration(15 * SECONDS)
                                     .eut(2)
                                     .addTo(compressorRecipes);
@@ -155,9 +155,9 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                         if (tMat.mMaterial == Materials.Air) {
                             tDustStack = ItemList.Cell_Air.get(tMat.mAmount / 2L);
                         } else {
-                            tDustStack = GT_OreDictUnificator.get(OrePrefixes.dust, tMat.mMaterial, tMat.mAmount);
+                            tDustStack = GTOreDictUnificator.get(OrePrefixes.dust, tMat.mMaterial, tMat.mAmount);
                             if (tDustStack == null)
-                                tDustStack = GT_OreDictUnificator.get(OrePrefixes.cell, tMat.mMaterial, tMat.mAmount);
+                                tDustStack = GTOreDictUnificator.get(OrePrefixes.cell, tMat.mMaterial, tMat.mAmount);
                         }
                         if (tItemAmount + tMat.mAmount * 3628800L
                             <= aStack.getMaxStackSize() * aMaterial.getDensity()) {
@@ -165,17 +165,17 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                             if (tDustStack != null) {
                                 tDustStack.stackSize = ((int) (tDustStack.stackSize * tDensityMultiplier));
                                 while ((tDustStack.stackSize > 64) && (tList.size() < 6)
-                                    && (tCapsuleCount + GT_ModHandler.getCapsuleCellContainerCount(tDustStack) * 64L
+                                    && (tCapsuleCount + GTModHandler.getCapsuleCellContainerCount(tDustStack) * 64L
                                         <= 64L)) {
-                                    tCapsuleCount += GT_ModHandler.getCapsuleCellContainerCount(tDustStack) * 64L;
-                                    tList.add(GT_Utility.copyAmount(64, tDustStack));
+                                    tCapsuleCount += GTModHandler.getCapsuleCellContainerCount(tDustStack) * 64L;
+                                    tList.add(GTUtility.copyAmount(64, tDustStack));
                                     tDustStack.stackSize -= 64;
                                 }
                                 if ((tDustStack.stackSize > 0) && (tList.size() < 6)
                                     && (tCapsuleCount
-                                        + GT_ModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(tDustStack)
+                                        + GTModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(tDustStack)
                                         <= 64L)) {
-                                    tCapsuleCount += GT_ModHandler
+                                    tCapsuleCount += GTModHandler
                                         .getCapsuleCellContainerCountMultipliedWithStackSize(tDustStack);
                                     tList.add(tDustStack);
                                 }
@@ -189,9 +189,9 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                         int tList_sS = tList.size();
                         for (int i = 0; i < tList_sS; i++) {
                             if ((!ItemList.Cell_Air.isStackEqual(tList.get(i)))
-                                && ((tFluid = GT_Utility.getFluidForFilledItem(tList.get(i), true)) != null)) {
+                                && ((tFluid = GTUtility.getFluidForFilledItem(tList.get(i), true)) != null)) {
                                 tFluid.amount *= tList.get(i).stackSize;
-                                tCapsuleCount -= GT_ModHandler
+                                tCapsuleCount -= GTModHandler
                                     .getCapsuleCellContainerCountMultipliedWithStackSize(tList.get(i));
                                 tList.remove(i);
                                 break;
@@ -199,13 +199,13 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                         }
                         if ((aMaterial.mExtraData & 0x1) != 0) {
                             if (tList.size() > 0 || tFluid != null) {
-                                GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+                                GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
                                 if (tCapsuleCount > 0L) {
                                     recipeBuilder.itemInputs(
-                                        GT_Utility.copyAmount(tItemAmount, aStack),
+                                        GTUtility.copyAmount(tItemAmount, aStack),
                                         ItemList.Cell_Empty.get(tCapsuleCount));
                                 } else {
-                                    recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+                                    recipeBuilder.itemInputs(GTUtility.copyAmount(tItemAmount, aStack));
                                 }
                                 if (tList.size() > 0) {
                                     ItemStack[] outputsArray = tList.toArray(new ItemStack[Math.min(tList.size(), 6)]);
@@ -222,13 +222,13 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                         }
                         if ((aMaterial.mExtraData & 0x2) != 0) {
                             if (tList.size() > 0 || tFluid != null) {
-                                GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+                                GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
                                 if (tCapsuleCount > 0L) {
                                     recipeBuilder.itemInputs(
-                                        GT_Utility.copyAmount(tItemAmount, aStack),
+                                        GTUtility.copyAmount(tItemAmount, aStack),
                                         ItemList.Cell_Empty.get(tCapsuleCount));
                                 } else {
-                                    recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+                                    recipeBuilder.itemInputs(GTUtility.copyAmount(tItemAmount, aStack));
                                 }
                                 if (tList.size() > 0) {
                                     ItemStack[] outputsArray = tList.toArray(new ItemStack[Math.min(tList.size(), 6)]);
@@ -245,26 +245,26 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                     }
                 }
                 if (aMaterial.contains(SubTag.CRYSTALLISABLE)
-                    && GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                    && GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
                         .outputChances(7000)
                         .fluidInputs(Materials.Water.getFluid(200L))
                         .duration(1 * MINUTES + 40 * SECONDS)
                         .eut(24)
                         .addTo(autoclaveRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(2))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
                         .outputChances(9000)
-                        .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+                        .fluidInputs(GTModHandler.getDistilledWater(100L))
                         .duration(1 * MINUTES + 15 * SECONDS)
                         .eut(24)
                         .addTo(autoclaveRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
                         .outputChances(10000)
                         .fluidInputs(Materials.Void.getMolten(36L))
                         .duration(1 * MINUTES)
@@ -275,65 +275,63 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                     case "NULL", "Mercury", "Coal":
                         break;
                     case "Glass":
-                        GT_ModHandler.addSmeltingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addSmeltingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new ItemStack(net.minecraft.init.Blocks.glass));
                         break;
                     case "NetherQuartz":
                     case "Quartz":
                     case "CertusQuartz":
-                        GT_ModHandler.removeFurnaceSmelting(aStack);
+                        GTModHandler.removeFurnaceSmelting(aStack);
                         break;
                     case "MeatRaw":
-                        GT_ModHandler.addSmeltingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1L));
+                        GTModHandler.addSmeltingRecipe(
+                            GTUtility.copyAmount(1, aStack),
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1L));
                         break;
                     case "Oilsands":
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
                             .fluidOutputs(Materials.OilHeavy.getFluid(1000))
                             .duration(33 * SECONDS)
                             .eut(8)
                             .addTo(centrifugeRecipes);
                         break;
                     case "HydratedCoal":
-                        GT_ModHandler.addSmeltingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L));
+                        GTModHandler.addSmeltingRecipe(
+                            GTUtility.copyAmount(1, aStack),
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L));
                         break;
                     case "Diamond": {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(64))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(64))
                             .itemOutputs(
                                 ItemList.IC2_Industrial_Diamond.get(3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(
-                                GT_Utility.copyAmount(4, aStack),
-                                GT_ModHandler.getIC2Item("dynamite", 16, null))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), GTModHandler.getIC2Item("dynamite", 16, null))
                             .itemOutputs(
                                 ItemList.IC2_Industrial_Diamond.get(3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 32))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 32))
                             .itemOutputs(
                                 ItemList.IC2_Industrial_Diamond.get(3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("industrialTnt", 8))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), GTModHandler.getIC2Item("industrialTnt", 8))
                             .itemOutputs(
                                 ItemList.IC2_Industrial_Diamond.get(3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
@@ -349,37 +347,35 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                     case "BlueTopaz":
                     case "Tanzanite":
                     case "Amethyst": {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(48))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(48))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(
-                                GT_Utility.copyAmount(4, aStack),
-                                GT_ModHandler.getIC2Item("dynamite", 12, null))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), GTModHandler.getIC2Item("dynamite", 12, null))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 24))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 24))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("industrialTnt", 6))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), GTModHandler.getIC2Item("industrialTnt", 6))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
@@ -394,35 +390,35 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                     case "Forcicium":
                     case "Forcillium":
                     case "Force": {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(32))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(32))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("dynamite", 8, null))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), GTModHandler.getIC2Item("dynamite", 8, null))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 16))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 16))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("industrialTnt", 4))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), GTModHandler.getIC2Item("industrialTnt", 4))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
                             .duration(1 * SECONDS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(implosionRecipes);
@@ -430,42 +426,42 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
             }
             case dustPure, dustImpure, dustRefined -> {
-                Materials tByProduct = GT_Utility.selectItemInList(
+                Materials tByProduct = GTUtility.selectItemInList(
                     aPrefix == OrePrefixes.dustRefined ? 2 : aPrefix == OrePrefixes.dustPure ? 1 : 0,
                     aMaterial,
                     aMaterial.mOreByProducts);
                 if (aPrefix == OrePrefixes.dustPure) {
                     if (aMaterial.contains(SubTag.ELECTROMAGNETIC_SEPERATION_GOLD)) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Gold, 1L),
-                                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 1L))
+                                GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Gold, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 1L))
                             .outputChances(10000, 4000, 2000)
                             .duration(20 * SECONDS)
                             .eut(24)
                             .addTo(electroMagneticSeparatorRecipes);
                     }
                     if (aMaterial.contains(SubTag.ELECTROMAGNETIC_SEPERATION_IRON)) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 1L),
-                                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L))
+                                GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L))
                             .outputChances(10000, 4000, 2000)
                             .duration(20 * SECONDS)
                             .eut(24)
                             .addTo(electroMagneticSeparatorRecipes);
                     }
                     if (aMaterial.contains(SubTag.ELECTROMAGNETIC_SEPERATION_NEODYMIUM)) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Neodymium, 1L),
-                                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Neodymium, 1L))
+                                GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Neodymium, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Neodymium, 1L))
                             .outputChances(10000, 4000, 2000)
                             .duration(20 * SECONDS)
                             .eut(24)
@@ -473,70 +469,70 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                     }
                 }
                 if (aMaterial.contains(SubTag.CRYSTALLISABLE)
-                    && GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                    && GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
                         .outputChances(9000)
                         .fluidInputs(Materials.Water.getFluid(200L))
                         .duration(1 * MINUTES + 40 * SECONDS)
                         .eut(24)
                         .addTo(autoclaveRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(2))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
                         .outputChances(9500)
-                        .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+                        .fluidInputs(GTModHandler.getDistilledWater(100L))
                         .duration(1 * MINUTES + 15 * SECONDS)
                         .eut(24)
                         .addTo(autoclaveRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
                         .outputChances(10000)
                         .fluidInputs(Materials.Void.getMolten(36L))
                         .duration(1 * MINUTES)
                         .eut(24)
                         .addTo(autoclaveRecipes);
                 }
-                ItemStack tImpureStack = GT_OreDictUnificator.get(
+                ItemStack tImpureStack = GTOreDictUnificator.get(
                     OrePrefixes.dustTiny,
                     tByProduct,
-                    GT_OreDictUnificator.get(OrePrefixes.nugget, tByProduct, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.nugget, tByProduct, 1L),
                     1L);
                 if (tImpureStack == null) {
-                    tImpureStack = GT_OreDictUnificator.get(OrePrefixes.dustSmall, tByProduct, 1L);
+                    tImpureStack = GTOreDictUnificator.get(OrePrefixes.dustSmall, tByProduct, 1L);
                     if (tImpureStack == null) {
-                        tImpureStack = GT_OreDictUnificator.get(
+                        tImpureStack = GTOreDictUnificator.get(
                             OrePrefixes.dust,
                             tByProduct,
-                            GT_OreDictUnificator.get(OrePrefixes.gem, tByProduct, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.gem, tByProduct, 1L),
                             1L);
                         if (tImpureStack == null) {
-                            tImpureStack = GT_OreDictUnificator.get(OrePrefixes.cell, tByProduct, 1L);
+                            tImpureStack = GTOreDictUnificator.get(OrePrefixes.cell, tByProduct, 1L);
                             if (tImpureStack == null) {
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
                                     .duration(Math.max(1L, aMaterial.getMass()))
                                     .eut(5)
                                     .addTo(centrifugeRecipes);
                             } else {
-                                FluidStack tFluid = GT_Utility.getFluidForFilledItem(tImpureStack, true);
+                                FluidStack tFluid = GTUtility.getFluidForFilledItem(tImpureStack, true);
                                 if (tFluid == null) {
-                                    GT_Values.RA.stdBuilder()
-                                        .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Cell_Empty.get(1))
+                                    GTValues.RA.stdBuilder()
+                                        .itemInputs(GTUtility.copyAmount(9, aStack), ItemList.Cell_Empty.get(1))
                                         .itemOutputs(
-                                            GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 9L),
+                                            GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 9L),
                                             tImpureStack)
                                         .duration(Math.max(1L, aMaterial.getMass() * 72L))
                                         .eut(5)
                                         .addTo(centrifugeRecipes);
                                 } else {
                                     tFluid.amount /= 10;
-                                    GT_Values.RA.stdBuilder()
-                                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+                                    GTValues.RA.stdBuilder()
+                                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
                                         .fluidOutputs(tFluid)
                                         .duration(Math.max(1L, aMaterial.getMass() * 8L))
                                         .eut(5)
@@ -544,30 +540,30 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                                 }
                             }
                         } else {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(9, aStack))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 9L), tImpureStack)
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(9, aStack))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 9L), tImpureStack)
                                 .duration(Math.max(1L, aMaterial.getMass() * 72L))
                                 .eut(5)
                                 .addTo(centrifugeRecipes);
                         }
                     } else {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(2, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L), tImpureStack)
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(2, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L), tImpureStack)
                             .duration(Math.max(1L, aMaterial.getMass() * 16L))
                             .eut(5)
                             .addTo(centrifugeRecipes);
                     }
                 } else {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
-                            GT_OreDictUnificator.get(
+                            GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+                            GTOreDictUnificator.get(
                                 OrePrefixes.dust,
                                 tByProduct,
-                                GT_OreDictUnificator.get(OrePrefixes.nugget, tByProduct, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.nugget, tByProduct, 1L),
                                 1L))
                         .outputChances(10000, 1111)
                         .duration(Math.max(1L, aMaterial.getMass() * 8L))
@@ -576,17 +572,17 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
             }
             case dustSmall -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Schematic_Dust.get(0L))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(4, aStack), ItemList.Schematic_Dust.get(0L))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
                     .duration(1 * SECONDS)
                     .eut(4)
                     .addTo(packagerRecipes);
                 if (!aMaterial.mBlastFurnaceRequired) {
-                    GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+                    GTRecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
                     if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
-                        GT_RecipeRegistrator.registerReverseArcSmelting(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTRecipeRegistrator.registerReverseArcSmelting(
+                            GTUtility.copyAmount(1, aStack),
                             aMaterial,
                             aPrefix.mMaterialAmount,
                             null,
@@ -596,17 +592,17 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
             }
             case dustTiny -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Schematic_Dust.get(0L))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(9, aStack), ItemList.Schematic_Dust.get(0L))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
                     .duration(1 * SECONDS)
                     .eut(4)
                     .addTo(packagerRecipes);
                 if (!aMaterial.mBlastFurnaceRequired) {
-                    GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+                    GTRecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
                     if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
-                        GT_RecipeRegistrator.registerReverseArcSmelting(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTRecipeRegistrator.registerReverseArcSmelting(
+                            GTUtility.copyAmount(1, aStack),
                             aMaterial,
                             aPrefix.mMaterialAmount,
                             null,
@@ -616,7 +612,7 @@ public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
                 if (!aMaterial.contains(SubTag.NO_SMELTING)) {
                     if (aMaterial.mBlastFurnaceRequired) {
-                        GT_ModHandler.removeFurnaceSmelting(aStack);
+                        GTModHandler.removeFurnaceSmelting(aStack);
                     }
                 }
             }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java
index 9661033e6a..5c2be8a785 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java
@@ -1,12 +1,12 @@
 package gregtech.loaders.oreprocessing;
 
-import static gregtech.api.enums.GT_Values.RA;
+import static gregtech.api.enums.GTValues.RA;
 import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
 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_RecipeBuilder.WILDCARD;
-import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.WILDCARD;
+import static gregtech.api.util.GTRecipeConstants.UniversalChemical;
 
 import java.util.Locale;
 
@@ -15,13 +15,13 @@ import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidRegistry;
 
 import gregtech.api.enums.Dyes;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.interfaces.IOreRecipeRegistrator;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingDye implements IOreRecipeRegistrator {
 
@@ -33,7 +33,7 @@ public class ProcessingDye implements IOreRecipeRegistrator {
     public void registerOre(OrePrefixes prefix, Materials material, String oreDictName, String modName,
         ItemStack stack) {
         Dyes aDye = Dyes.get(oreDictName);
-        if ((aDye.mIndex >= 0) && (aDye.mIndex < 16) && (GT_Utility.getContainerItem(stack, true) == null)) {
+        if ((aDye.mIndex >= 0) && (aDye.mIndex < 16) && (GTUtility.getContainerItem(stack, true) == null)) {
             registerAlloySmelter(stack, aDye);
             registerMixer(stack, aDye);
             registerChemicalReactor(stack, aDye);
@@ -44,17 +44,17 @@ public class ProcessingDye implements IOreRecipeRegistrator {
         String fluidName = "dye.watermixed." + dye.name()
             .toLowerCase(Locale.ENGLISH);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, stack), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, stack), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Water.getFluid(216L))
             .fluidOutputs(FluidRegistry.getFluidStack(fluidName, 192))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, stack), GT_Utility.getIntegratedCircuit(1))
-            .fluidInputs(GT_ModHandler.getDistilledWater(288L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, stack), GTUtility.getIntegratedCircuit(1))
+            .fluidInputs(GTModHandler.getDistilledWater(288L))
             .fluidOutputs(FluidRegistry.getFluidStack(fluidName, 216))
             .duration(16 * TICKS)
             .eut(4)
@@ -63,16 +63,14 @@ public class ProcessingDye implements IOreRecipeRegistrator {
 
     public void registerAlloySmelter(ItemStack stack, Dyes dye) {
         RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 8L),
-                GT_Utility.copyAmount(1, stack))
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 8L), GTUtility.copyAmount(1, stack))
             .itemOutputs(new ItemStack(Blocks.stained_glass, 8, 15 - dye.mIndex))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(alloySmelterRecipes);
 
         RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.glass, 8, WILDCARD), GT_Utility.copyAmount(1, stack))
+            .itemInputs(new ItemStack(Blocks.glass, 8, WILDCARD), GTUtility.copyAmount(1, stack))
             .itemOutputs(new ItemStack(Blocks.stained_glass, 8, 15 - dye.mIndex))
             .duration(10 * SECONDS)
             .eut(8)
@@ -83,8 +81,8 @@ public class ProcessingDye implements IOreRecipeRegistrator {
         String fluidName = "dye.chemical." + dye.name()
             .toLowerCase(Locale.ENGLISH);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, stack), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, stack), GTOreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 2))
             .fluidInputs(Materials.SulfuricAcid.getFluid(432))
             .fluidOutputs(FluidRegistry.getFluidStack(fluidName, 288))
             .duration(30 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java
index cfd33f1ace..a9c40975e8 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java
@@ -5,10 +5,10 @@ import net.minecraft.item.ItemStack;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_RecipeRegistrator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTRecipeRegistrator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingFineWire implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -20,13 +20,13 @@ public class ProcessingFineWire implements gregtech.api.interfaces.IOreRecipeReg
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (!aMaterial.contains(gregtech.api.enums.SubTag.NO_SMASHING)) {
-            GT_RecipeRegistrator.registerWiremillRecipes(aMaterial, 100, 4);
+            GTRecipeRegistrator.registerWiremillRecipes(aMaterial, 100, 4);
         }
         if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)
             && !aMaterial.contains(SubTag.NO_WORKING)) {
-            GT_ModHandler.addCraftingRecipe(
-                GT_Utility.copyAmount(1, aStack),
-                GT_Proxy.tBits,
+            GTModHandler.addCraftingRecipe(
+                GTUtility.copyAmount(1, aStack),
+                GTProxy.tBits,
                 new Object[] { "Xx", 'X', OrePrefixes.foil.get(aMaterial) });
         }
     }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java
index 9b46710b71..3839c38c66 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java
@@ -1,18 +1,18 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.benderRecipes;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.interfaces.IOreRecipeRegistrator;
 import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingFoil implements IOreRecipeRegistrator {
 
@@ -28,18 +28,18 @@ public class ProcessingFoil implements IOreRecipeRegistrator {
     }
 
     private void registerBenderRecipe(Materials material) {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.copyAmount(1, GT_OreDictUnificator.get(OrePrefixes.plate, material, 4L)),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.foil, material, 4L))
+                GTUtility.copyAmount(1, GTOreDictUnificator.get(OrePrefixes.plate, material, 4L)),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.foil, material, 4L))
             .duration((int) Math.max(material.getMass(), 1L))
             .eut(calculateRecipeEU(material, 24))
             .addTo(benderRecipes);
     }
 
     private void registerCover(ItemStack stack, Materials material) {
-        GregTech_API
+        GregTechAPI
             .registerCover(stack, TextureFactory.of(material.mIconSet.mTextures[70], material.mRGBa, false), null);
     }
 }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java
index e7fc25038f..0c8119ded3 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java
@@ -4,18 +4,18 @@ import static gregtech.api.recipe.RecipeMaps.benderRecipes;
 import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
 import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
 import static gregtech.api.recipe.RecipeMaps.slicerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingFood implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -29,10 +29,10 @@ public class ProcessingFood implements gregtech.api.interfaces.IOreRecipeRegistr
         switch (aOreDictName) {
             case "foodCheese" -> {
                 registerSlicerRecipes(aStack);
-                GT_OreDictUnificator.addItemData(aStack, new gregtech.api.objects.ItemData(Materials.Cheese, 3628800L));
+                GTOreDictUnificator.addItemData(aStack, new gregtech.api.objects.ItemData(Materials.Cheese, 3628800L));
             }
             case "foodDough" -> {
-                GT_ModHandler.removeFurnaceSmelting(aStack);
+                GTModHandler.removeFurnaceSmelting(aStack);
                 registerBenderRecipes(aStack);
                 registerMixerRecipes(aStack);
                 registerFormingPressRecipes(aStack);
@@ -41,7 +41,7 @@ public class ProcessingFood implements gregtech.api.interfaces.IOreRecipeRegistr
     }
 
     private void registerSlicerRecipes(ItemStack stack) {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(stack, ItemList.Shape_Slicer_Flat.get(0L))
             .itemOutputs(ItemList.Food_Sliced_Cheese.get(4L))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -50,8 +50,8 @@ public class ProcessingFood implements gregtech.api.interfaces.IOreRecipeRegistr
     }
 
     private void registerBenderRecipes(ItemStack stack) {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, stack), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, stack), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Food_Flat_Dough.get(1L))
             .duration(16 * TICKS)
             .eut(4)
@@ -59,22 +59,22 @@ public class ProcessingFood implements gregtech.api.interfaces.IOreRecipeRegistr
     }
 
     private void registerMixerRecipes(ItemStack stack) {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(stack, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(stack, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
             .itemOutputs(ItemList.Food_Dough_Sugar.get(2L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(stack, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(stack, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
             .itemOutputs(ItemList.Food_Dough_Chocolate.get(2L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(stack, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chocolate, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(stack, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chocolate, 1L))
             .itemOutputs(ItemList.Food_Dough_Chocolate.get(2L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
@@ -83,22 +83,22 @@ public class ProcessingFood implements gregtech.api.interfaces.IOreRecipeRegistr
 
     private void registerFormingPressRecipes(ItemStack stack) {
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, stack), ItemList.Shape_Mold_Bun.get(0L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, stack), ItemList.Shape_Mold_Bun.get(0L))
             .itemOutputs(ItemList.Food_Raw_Bun.get(1L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(formingPressRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(2, stack), ItemList.Shape_Mold_Bread.get(0L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(2, stack), ItemList.Shape_Mold_Bread.get(0L))
             .itemOutputs(ItemList.Food_Raw_Bread.get(1L))
             .duration(12 * SECONDS + 16 * TICKS)
             .eut(4)
             .addTo(formingPressRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(3, stack), ItemList.Shape_Mold_Baguette.get(0L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(3, stack), ItemList.Shape_Mold_Baguette.get(0L))
             .itemOutputs(ItemList.Food_Raw_Baguette.get(1L))
             .duration(19 * SECONDS + 4 * TICKS)
             .eut(4)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java
index aa973cddfe..d7ef154a9f 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java
@@ -1,23 +1,23 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingGear implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -31,12 +31,12 @@ public class ProcessingGear implements gregtech.api.interfaces.IOreRecipeRegistr
         ItemStack aStack) {
         switch (aPrefix) {
             case gearGt -> {
-                GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+                GTModHandler.removeRecipeByOutputDelayed(aStack);
                 if (aMaterial.mStandardMoltenFluid != null) {
                     if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(ItemList.Shape_Mold_Gear.get(0L))
-                            .itemOutputs(GT_OreDictUnificator.get(aPrefix, aMaterial, 1L))
+                            .itemOutputs(GTOreDictUnificator.get(aPrefix, aMaterial, 1L))
                             .fluidInputs(aMaterial.getMolten(576L))
                             .duration(6 * SECONDS + 8 * TICKS)
                             .eut(calculateRecipeEU(aMaterial, 8))
@@ -46,21 +46,21 @@ public class ProcessingGear implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
                     && !aMaterial.contains(SubTag.NO_WORKING)) {
                     switch (aMaterial.mName) {
-                        case "Wood" -> GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        case "Wood" -> GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "SPS", "PsP", "SPS", 'P', OrePrefixes.plank.get(aMaterial), 'S',
                                 OrePrefixes.stick.get(aMaterial) });
-                        case "Stone" -> GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        case "Stone" -> GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "SPS", "PfP", "SPS", 'P', OrePrefixes.stoneSmooth, 'S',
                                 new ItemStack(Blocks.stone_button, 1, 32767) });
                         default -> {
                             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTOreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
+                                    GTProxy.tBits,
                                     new Object[] { "SPS", "PwP", "SPS", 'P', OrePrefixes.plate.get(aMaterial), 'S',
                                         OrePrefixes.stick.get(aMaterial) });
                             }
@@ -71,9 +71,9 @@ public class ProcessingGear implements gregtech.api.interfaces.IOreRecipeRegistr
             case gearGtSmall -> {
                 if (aMaterial.mStandardMoltenFluid != null) {
                     if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(ItemList.Shape_Mold_Gear_Small.get(0L))
-                            .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                            .itemOutputs(GTUtility.copyAmount(1, aStack))
                             .fluidInputs(aMaterial.getMolten(144L))
                             .duration(16 * TICKS)
                             .eut(calculateRecipeEU(aMaterial, 8))
@@ -83,19 +83,19 @@ public class ProcessingGear implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
                     && !aMaterial.contains(SubTag.NO_WORKING)) {
                     switch (aMaterial.mName) {
-                        case "Wood" -> GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        case "Wood" -> GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "P ", " s", 'P', OrePrefixes.plank.get(aMaterial) });
-                        case "Stone" -> GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        case "Stone" -> GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "P ", " f", 'P', OrePrefixes.stoneSmooth });
                         default -> {
                             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
+                                    GTProxy.tBits,
                                     new Object[] { " S ", "hPx", " S ", 'S', OrePrefixes.stick.get(aMaterial), 'P',
                                         OrePrefixes.plate.get(aMaterial) });
                             }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java
index 76e60e18c5..2f92e58e56 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java
@@ -6,28 +6,28 @@ import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
 import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.oredict.OreDictionary;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeConstants;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistrator { // TODO COMPARE WITH GEM???
                                                                                       // generators
@@ -54,21 +54,21 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
             case gem -> {
                 // fuel recipes
                 if (aFuelPower) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .metadata(FUEL_VALUE, aMaterial.mFuelPower * 2)
                         .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                        .addTo(GT_RecipeConstants.Fuel);
+                        .addTo(GTRecipeConstants.Fuel);
                 }
 
                 if (!OrePrefixes.block.isIgnored(aMaterial)
-                    && GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L) != null) {
+                    && GTOreDictUnificator.get(OrePrefixes.block, aMaterial, 1L) != null) {
                     // Compressor recipes
                     // need to avoid iridium exploit
                     if (aMaterial != Materials.Iridium) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(9, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(9, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
                             .duration(15 * SECONDS)
                             .eut(2)
                             .addTo(compressorRecipes);
@@ -77,18 +77,18 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                 // Smelting recipe
                 if (!aNoSmelting) {
-                    GT_ModHandler.addSmeltingRecipe(
-                        GT_Utility.copyAmount(1, aStack),
-                        GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L));
+                    GTModHandler.addSmeltingRecipe(
+                        GTUtility.copyAmount(1, aStack),
+                        GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L));
                 }
 
                 if (aNoSmashing) {
                     // Forge hammer recipes
                     {
-                        if (GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(aStack)
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 2L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 2L))
                                 .duration(3 * SECONDS + 4 * TICKS)
                                 .eut(16)
                                 .addTo(hammerRecipes);
@@ -98,11 +98,11 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                     // Forge hammer recipes
                     {
                         // need to avoid iridium exploit
-                        if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null
+                        if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null
                             && aMaterial != Materials.Iridium) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 16))
                                 .addTo(hammerRecipes);
@@ -111,61 +111,61 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                     // Bender recipes
                     if (aMaterial != Materials.Iridium) {
-                        if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+                        if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
                             // Plate
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                                 .duration((int) Math.max(aMaterialMass * 2L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 24))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null) {
+                        if (GTOreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null) {
                             // Double plates
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), GTUtility.getIntegratedCircuit(2))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 2L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L) != null) {
+                        if (GTOreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L) != null) {
                             // Triple plate
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(3, aStack), GTUtility.getIntegratedCircuit(3))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 3L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
+                        if (GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
                             // Quadruple plate
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(4, aStack), GT_Utility.getIntegratedCircuit(4))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(4, aStack), GTUtility.getIntegratedCircuit(4))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 4L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L) != null) {
+                        if (GTOreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L) != null) {
                             // Quintuple plate
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(5, aStack), GT_Utility.getIntegratedCircuit(5))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(5, aStack), GTUtility.getIntegratedCircuit(5))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 5L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
+                        if (GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
                             // dense plate
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(9, aStack), GT_Utility.getIntegratedCircuit(9))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(9, aStack), GTUtility.getIntegratedCircuit(9))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 9L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
@@ -175,13 +175,13 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                 if (aNoWorking) {
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                         // Lathe recipes
-                        if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null
-                            && GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack))
+                        if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null
+                            && GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack))
                                 .itemOutputs(
-                                    GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
-                                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 2L))
+                                    GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
+                                    GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 2L))
                                 .duration(((int) Math.max(aMaterialMass, 1L)) * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 16))
                                 .addTo(latheRecipes);
@@ -191,40 +191,40 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                     if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
                         // Implosion compressor recipes
                         {
-                            if (GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1) != null) {
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+                            if (GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1) != null) {
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("dynamite", 4, null))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("dynamite", 4, null))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("industrialTnt", 2))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("industrialTnt", 2))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
@@ -233,22 +233,22 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                         // Crafting recipes
                         {
-                            GT_ModHandler.addCraftingRecipe(
-                                GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 2L),
-                                GT_Proxy.tBits,
+                            GTModHandler.addCraftingRecipe(
+                                GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 2L),
+                                GTProxy.tBits,
                                 new Object[] { "h", "X", 'X', OrePrefixes.gemFlawless.get(aMaterial) });
 
                             if (aMaterial.contains(SubTag.SMELTING_TO_GEM)) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_Utility.copyAmount(1, aStack),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTUtility.copyAmount(1, aStack),
+                                    GTProxy.tBits,
                                     new Object[] { "XXX", "XXX", "XXX", 'X', OrePrefixes.nugget.get(aMaterial) });
                             }
 
                             if (aSpecialRecipeReq) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+                                    GTProxy.tBits,
                                     new Object[] { "X", "m", 'X', OrePrefixes.gem.get(aMaterial) });
                             }
                         }
@@ -259,12 +259,12 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                     // Laser engraver recipes
                     {
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1L) != null) {
+                        if (GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1L) != null) {
                             is.stackSize = 0;
 
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(3, aStack), is)
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(3, aStack), is)
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1L))
                                 .duration(60 * SECONDS)
                                 .eut(TierEU.RECIPE_HV)
                                 .addTo(laserEngraverRecipes);
@@ -276,22 +276,22 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
             case gemChipped -> {
                 // Fuel recipes
                 if (aFuelPower) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .metadata(FUEL_VALUE, aMaterial.mFuelPower / 2)
                         .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                        .addTo(GT_RecipeConstants.Fuel);
+                        .addTo(GTRecipeConstants.Fuel);
                 }
 
                 if (!aNoWorking) {
                     // Lathe recipes
-                    if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null
-                        && GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    if (GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null
+                        && GTOreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 1L))
+                                GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 1L))
                             .duration(((int) Math.max(aMaterialMass, 1L)) * TICKS)
                             .eut(8)
                             .addTo(latheRecipes);
@@ -300,40 +300,40 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                     if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
                         // Implosion compressor recipes
                         {
-                            if (GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1) != null) {
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+                            if (GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1) != null) {
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("dynamite", 4, null))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("dynamite", 4, null))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("industrialTnt", 2))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("industrialTnt", 2))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
@@ -342,14 +342,14 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                         // Crafting recipes
                         {
-                            GT_ModHandler.addCraftingRecipe(
-                                GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, 2L),
-                                GT_Proxy.tBits,
+                            GTModHandler.addCraftingRecipe(
+                                GTOreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, 2L),
+                                GTProxy.tBits,
                                 new Object[] { "h", "X", 'X', OrePrefixes.gemFlawed.get(aMaterial) });
                             if (aSpecialRecipeReq) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L),
+                                    GTProxy.tBits,
                                     new Object[] { "X", "m", 'X', OrePrefixes.gemChipped.get(aMaterial) });
                             }
                         }
@@ -358,9 +358,9 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                 for (ItemStack is : OreDictionary.getOres("craftingLens" + aMaterial.mColor.mName.replace(" ", ""))) { // Engraver
                     is.stackSize = 0;
 
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(3, aStack), is)
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(3, aStack), is)
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1L))
                         .duration(30 * SECONDS)
                         .eut(30)
                         .addTo(laserEngraverRecipes);
@@ -370,11 +370,11 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
             case gemExquisite -> {
                 // Fuel recipes
                 if (aFuelPower) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .metadata(FUEL_VALUE, aMaterial.mFuelPower * 8)
                         .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                        .addTo(GT_RecipeConstants.Fuel);
+                        .addTo(GTRecipeConstants.Fuel);
                 }
 
                 if (!aNoWorking) {
@@ -382,9 +382,9 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                         // Crafting recipes
                         {
                             if (aSpecialRecipeReq) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 4L),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 4L),
+                                    GTProxy.tBits,
                                     new Object[] { "X", "m", 'X', OrePrefixes.gemExquisite.get(aMaterial) });
                             }
                         }
@@ -393,9 +393,9 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                 // Forge hammer recipes
                 {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(aStack)
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 2L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 2L))
                         .duration(3 * SECONDS + 4 * TICKS)
                         .eut(16)
                         .addTo(hammerRecipes);
@@ -404,22 +404,22 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
             case gemFlawed -> {
                 // fuel recipes
                 if (aFuelPower) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .metadata(FUEL_VALUE, aMaterial.mFuelPower)
                         .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                        .addTo(GT_RecipeConstants.Fuel);
+                        .addTo(GTRecipeConstants.Fuel);
                 }
 
                 if (!aNoWorking) {
                     // Lathe recipes
-                    if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null
-                        && GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    if (GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null
+                        && GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 2L),
-                                GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L))
+                                GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 2L),
+                                GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L))
                             .duration(((int) Math.max(aMaterialMass, 1L)) * TICKS)
                             .eut(12)
                             .addTo(latheRecipes);
@@ -428,40 +428,40 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                     if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
                         // Implosion compressor recipes
                         {
-                            if (GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1) != null) {
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+                            if (GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1) != null) {
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("dynamite", 4, null))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("dynamite", 4, null))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("industrialTnt", 2))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("industrialTnt", 2))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
@@ -470,22 +470,22 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                         // Crafting recipes
                         {
-                            GT_ModHandler.addCraftingRecipe(
-                                GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 2L),
-                                GT_Proxy.tBits,
+                            GTModHandler.addCraftingRecipe(
+                                GTOreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 2L),
+                                GTProxy.tBits,
                                 new Object[] { "h", "X", 'X', OrePrefixes.gem.get(aMaterial) });
                             if (aSpecialRecipeReq) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 2L),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 2L),
+                                    GTProxy.tBits,
                                     new Object[] { "X", "m", 'X', OrePrefixes.gemFlawed.get(aMaterial) });
                             }
                         }
                     }
                 }
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(aStack)
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, 2L))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, 2L))
                     .duration(3 * SECONDS + 4 * TICKS)
                     .eut(16)
                     .addTo(hammerRecipes);
@@ -494,9 +494,9 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                     is.stackSize = 0;
 
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(3, aStack), is)
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(3, aStack), is)
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
                         .duration(30 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .addTo(laserEngraverRecipes);
@@ -507,22 +507,22 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                 // Fuel recipes
                 if (aFuelPower) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .metadata(FUEL_VALUE, aMaterial.mFuelPower * 4)
                         .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                        .addTo(GT_RecipeConstants.Fuel);
+                        .addTo(GTRecipeConstants.Fuel);
                 }
 
                 if (!aNoWorking) {
                     // Lathe recipes
-                    if (GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null
-                        && GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    if (GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null
+                        && GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
-                                GT_OreDictUnificator.getDust(
+                                GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
+                                GTOreDictUnificator.getDust(
                                     aMaterial,
                                     aPrefix.mMaterialAmount - OrePrefixes.stickLong.mMaterialAmount))
                             .duration(((int) Math.max(aMaterialMass * 5L, 1L)) * TICKS)
@@ -533,40 +533,40 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                     if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
                         // Implosion compressor recipes
                         {
-                            if (GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1) != null) {
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+                            if (GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1) != null) {
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("dynamite", 4, null))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("dynamite", 4, null))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(
-                                        GT_Utility.copyAmount(3, aStack),
-                                        GT_ModHandler.getIC2Item("industrialTnt", 2))
+                                        GTUtility.copyAmount(3, aStack),
+                                        GTModHandler.getIC2Item("industrialTnt", 2))
                                     .itemOutputs(
-                                        GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
-                                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+                                        GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+                                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
                                     .duration(1 * SECONDS)
                                     .eut(TierEU.RECIPE_LV)
                                     .addTo(implosionRecipes);
@@ -575,22 +575,22 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
 
                         // Crafting recipes
                         {
-                            GT_ModHandler.addCraftingRecipe(
-                                GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 2L),
-                                GT_Proxy.tBits,
+                            GTModHandler.addCraftingRecipe(
+                                GTOreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 2L),
+                                GTProxy.tBits,
                                 new Object[] { "h", "X", 'X', OrePrefixes.gemExquisite.get(aMaterial) });
                             if (aSpecialRecipeReq) {
-                                GT_ModHandler.addCraftingRecipe(
-                                    GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L),
-                                    GT_Proxy.tBits,
+                                GTModHandler.addCraftingRecipe(
+                                    GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L),
+                                    GTProxy.tBits,
                                     new Object[] { "X", "m", 'X', OrePrefixes.gemFlawless.get(aMaterial) });
                             }
                         }
                     }
                 }
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(aStack)
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 2L))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 2L))
                     .duration(3 * SECONDS + 4 * TICKS)
                     .eut(16)
                     .addTo(hammerRecipes);
@@ -598,9 +598,9 @@ public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistra
                 for (ItemStack is : OreDictionary.getOres("craftingLens" + aMaterial.mColor.mName.replace(" ", ""))) { // Engraver
 
                     is.stackSize = 0;
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(3, aStack), is)
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(3, aStack), is)
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L))
                         .duration(2 * MINUTES)
                         .eut(TierEU.RECIPE_EV)
                         .addTo(laserEngraverRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java
index 0be31a7e1d..7d27c2ee16 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java
@@ -4,27 +4,27 @@ import static gregtech.api.recipe.RecipeMaps.benderRecipes;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.enums.ToolDictNames;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_RecipeRegistrator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeConstants;
+import gregtech.api.util.GTRecipeRegistrator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -51,19 +51,19 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
             case ingot -> {
                 // Fuel recipe
                 if (aMaterial.mFuelPower > 0) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .metadata(FUEL_VALUE, aMaterial.mFuelPower)
                         .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                        .addTo(GT_RecipeConstants.Fuel);
+                        .addTo(GTRecipeConstants.Fuel);
                 }
                 if (aMaterial.mStandardMoltenFluid != null
                     && !(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
                     // Fluid solidifier recipes
 
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(ItemList.Shape_Mold_Ingot.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
                         .fluidInputs(aMaterial.getMolten(144L))
                         .duration(1 * SECONDS + 12 * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8))
@@ -71,12 +71,12 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
                 }
                 // Reverse recipes
                 {
-                    GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
-                    GT_RecipeRegistrator
+                    GTRecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+                    GTRecipeRegistrator
                         .registerReverseMacerating(aStack, aMaterial, aPrefix.mMaterialAmount, null, null, null, false);
                     if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
-                        GT_RecipeRegistrator.registerReverseArcSmelting(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTRecipeRegistrator.registerReverseArcSmelting(
+                            GTUtility.copyAmount(1, aStack),
                             aMaterial,
                             aPrefix.mMaterialAmount,
                             null,
@@ -84,26 +84,26 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
                             null);
                     }
                 }
-                ItemStack tStack = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L);
+                ItemStack tStack = GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L);
                 if ((tStack != null) && ((aMaterial.mBlastFurnaceRequired) || aNoSmelting)) {
-                    GT_ModHandler.removeFurnaceSmelting(tStack);
+                    GTModHandler.removeFurnaceSmelting(tStack);
                 }
                 if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
                     && !aMaterial.contains(SubTag.NO_WORKING)
                     && !aMaterial.contains(SubTag.SMELTING_TO_GEM)
                     && aMaterial.contains(SubTag.MORTAR_GRINDABLE)) {
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addShapelessCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { ToolDictNames.craftingToolMortar, OrePrefixes.ingot.get(aMaterial) });
                 }
                 if (!aNoSmashing) {
                     // Forge hammer recipes
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV
-                        && GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(3, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L))
+                        && GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(3, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L))
                             .duration(Math.max(aMaterialMass, 1L))
                             .eut(calculateRecipeEU(aMaterial, 16))
                             .addTo(hammerRecipes);
@@ -113,64 +113,64 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
 
                     // Bender recipes
                     {
-                        if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                        if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 24))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
+                        if (GTOreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), GTUtility.getIntegratedCircuit(2))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 2L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
+                        if (GTOreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(3, aStack), GTUtility.getIntegratedCircuit(3))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 3L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(4, aStack), GT_Utility.getIntegratedCircuit(4))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+                        if (GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(4, aStack), GTUtility.getIntegratedCircuit(4))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 4L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(5, aStack), GT_Utility.getIntegratedCircuit(5))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
+                        if (GTOreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(5, aStack), GTUtility.getIntegratedCircuit(5))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 5L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(9, aStack), GT_Utility.getIntegratedCircuit(9))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+                        if (GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(9, aStack), GTUtility.getIntegratedCircuit(9))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
                                 .duration(Math.max(aMaterialMass * 9L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 96))
                                 .addTo(benderRecipes);
                         }
 
-                        if (GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(10))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, 4L))
+                        if (GTOreDictUnificator.get(OrePrefixes.foil, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(10))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.foil, aMaterial, 4L))
                                 .duration(Math.max(aMaterialMass * 2L, 1L))
                                 .eut(calculateRecipeEU(aMaterial, 24))
                                 .addTo(benderRecipes);
@@ -182,16 +182,16 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
                 if (!aNoSmashing || aStretchy) {
                     // bender recipes
                     {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
                             .duration(Math.max(aMaterialMass, 1L))
                             .eut(calculateRecipeEU(aMaterial, 96))
                             .addTo(benderRecipes);
 
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(2, aStack), GTUtility.getIntegratedCircuit(2))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
                             .duration(Math.max(aMaterialMass * 2L, 1L))
                             .eut(calculateRecipeEU(aMaterial, 96))
                             .addTo(benderRecipes);
@@ -199,9 +199,9 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
 
                     // Enable crafting with hammer if tier is < IV.
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
-                        GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.ingotDouble, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.ingotDouble, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "I", "I", "h", 'I', OrePrefixes.ingot.get(aMaterial) });
                     }
                 }
@@ -210,25 +210,25 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
                 if (!aNoSmashing || aStretchy) {
                     // Bender recipes
                     {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
                             .duration(Math.max(aMaterialMass, 1L))
                             .eut(calculateRecipeEU(aMaterial, 96))
                             .addTo(benderRecipes);
 
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(3, aStack), GTUtility.getIntegratedCircuit(3))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
                             .duration(Math.max(aMaterialMass * 3L, 1L))
                             .eut(calculateRecipeEU(aMaterial, 96))
                             .addTo(benderRecipes);
                     }
 
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
-                        GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.ingotTriple, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.ingotTriple, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "I", "B", "h", 'I', OrePrefixes.ingotDouble.get(aMaterial), 'B',
                                 OrePrefixes.ingot.get(aMaterial) });
                     }
@@ -238,9 +238,9 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
                 if (!aNoSmashing || aStretchy) {
                     // Bender recipes
                     {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
                             .duration(Math.max(aMaterialMass, 1L))
                             .eut(calculateRecipeEU(aMaterial, 96))
                             .addTo(benderRecipes);
@@ -248,9 +248,9 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
 
                     // If tier < IV add manual crafting.
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
-                        GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.ingotQuadruple, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.ingotQuadruple, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "I", "B", "h", 'I', OrePrefixes.ingotTriple.get(aMaterial), 'B',
                                 OrePrefixes.ingot.get(aMaterial) });
                     }
@@ -260,9 +260,9 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
                 if (!aNoSmashing || aStretchy) {
                     // Bender recipes
                     {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
                             .duration(Math.max(aMaterialMass, 1L))
                             .eut(calculateRecipeEU(aMaterial, 96))
                             .addTo(benderRecipes);
@@ -270,9 +270,9 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
 
                     // Crafting recipes
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
-                        GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.ingotQuintuple, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.ingotQuintuple, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "I", "B", "h", 'I', OrePrefixes.ingotQuadruple.get(aMaterial), 'B',
                                 OrePrefixes.ingot.get(aMaterial) });
                     }
@@ -280,11 +280,11 @@ public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegist
             }
             case ingotHot -> {
                 if (aMaterial.mAutoGenerateVacuumFreezerRecipes
-                    && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+                    && GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
                     // Vacuum freezer recipes
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
                         .duration(((int) Math.max(aMaterialMass * 3L, 1L)) * TICKS)
                         .eut(TierEU.RECIPE_MV)
                         .addTo(vacuumFreezerRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java
index 6a132e2dba..cd453943d2 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java
@@ -5,7 +5,7 @@ import net.minecraft.item.ItemStack;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.objects.ItemData;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class ProcessingItem implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -16,29 +16,29 @@ public class ProcessingItem implements gregtech.api.interfaces.IOreRecipeRegistr
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        if (GT_OreDictUnificator.getItemData(aStack) == null && !aOreDictName.equals("itemCertusQuartz")
+        if (GTOreDictUnificator.getItemData(aStack) == null && !aOreDictName.equals("itemCertusQuartz")
             && !aOreDictName.equals("itemNetherQuartz")) {
             switch (aOreDictName) {
                 case "itemSilicon":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Silicon, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Silicon, 3628800L));
                 case "itemWheat":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Wheat, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Wheat, 3628800L));
                 case "itemManganese":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Manganese, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Manganese, 3628800L));
                 case "itemSalt":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Salt, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Salt, 3628800L));
                 case "itemMagnesium":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Magnesium, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Magnesium, 3628800L));
                 case "itemPhosphorite":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.TricalciumPhosphate, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.TricalciumPhosphate, 3628800L));
                 case "itemSulfur":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Sulfur, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Sulfur, 3628800L));
                 case "itemAluminum":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Aluminium, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Aluminium, 3628800L));
                 case "itemSaltpeter":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Saltpeter, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Saltpeter, 3628800L));
                 case "itemUranium":
-                    GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Uranium, 3628800L));
+                    GTOreDictUnificator.addItemData(aStack, new ItemData(Materials.Uranium, 3628800L));
             }
         }
     }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
index c3f73f7966..9576262818 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
@@ -2,20 +2,21 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.Textures;
 import gregtech.api.enums.TierEU;
 import gregtech.api.interfaces.ITexture;
 import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.common.covers.CoverLens;
 
 @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
 public class ProcessingLens implements gregtech.api.interfaces.IOreRecipeRegistrator {
@@ -29,56 +30,56 @@ public class ProcessingLens implements gregtech.api.interfaces.IOreRecipeRegistr
         ItemStack aStack) {
         switch (aMaterial.mName) {
             case "Diamond", "Glass" -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L))
                     .duration(1 * MINUTES)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(latheRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 3L),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.lens, aMaterial, 3L),
+                        GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
                     .duration(2 * MINUTES)
                     .eut(16)
                     .addTo(latheRecipes);
             }
             case "ChromaticGlass" -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 16L))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 16L))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L))
                     .duration(10 * MINUTES)
                     .eut(TierEU.RECIPE_UHV)
                     .addTo(compressorRecipes);
             }
             default -> {
-                if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
-                    GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
-                    recipeBuilder.itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L));
-                    if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) == null) {
-                        recipeBuilder.itemOutputs(GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L));
+                if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+                    GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
+                    recipeBuilder.itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L));
+                    if (GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) == null) {
+                        recipeBuilder.itemOutputs(GTOreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L));
                     } else {
                         recipeBuilder.itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L));
+                            GTOreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L));
                     }
                     recipeBuilder.duration(1 * MINUTES)
                         .eut(TierEU.RECIPE_MV)
                         .addTo(latheRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L) != null) {
-                    GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
-                    recipeBuilder.itemInputs(GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L));
-                    if (GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) == null) {
-                        recipeBuilder.itemOutputs(GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L));
+                if (GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L) != null) {
+                    GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
+                    recipeBuilder.itemInputs(GTOreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L));
+                    if (GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) == null) {
+                        recipeBuilder.itemOutputs(GTOreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L));
                     } else {
                         recipeBuilder.itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L));
+                            GTOreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L));
                     }
                     recipeBuilder.duration(2 * MINUTES)
                         .eut(TierEU.RECIPE_LV)
@@ -86,10 +87,10 @@ public class ProcessingLens implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
                 final ITexture lensCoverTexture = TextureFactory
                     .of(Textures.BlockIcons.OVERLAY_LENS, aMaterial.mRGBa, false);
-                GregTech_API.registerCover(
+                GregTechAPI.registerCover(
                     aStack,
                     TextureFactory.of(Textures.BlockIcons.MACHINE_CASINGS[2][0], lensCoverTexture),
-                    new gregtech.common.covers.GT_Cover_Lens(aMaterial.mColor.mIndex, lensCoverTexture));
+                    new CoverLens(aMaterial.mColor.mIndex, lensCoverTexture));
             }
         }
     }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java
index 5985e24dc7..f60987ec9e 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java
@@ -9,21 +9,21 @@ import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
 import static gregtech.api.recipe.RecipeMaps.pyrolyseRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
+import gregtech.GTMod;
+import gregtech.api.enums.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -35,86 +35,85 @@ public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistra
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (aOreDictName.equals("logRubber")) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(
                     ItemList.IC2_Resin.get(1L),
-                    GT_ModHandler.getIC2Item("plantBall", 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+                    GTModHandler.getIC2Item("plantBall", 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
                 .outputChances(5000, 3750, 2500, 2500)
                 .fluidOutputs(Materials.Methane.getGas(60L))
                 .duration(10 * SECONDS)
                 .eut(20)
                 .addTo(centrifugeRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L))
                 .duration(15 * SECONDS)
                 .eut(2)
                 .addTo(extractorRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 6L), ItemList.IC2_Resin.get(1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 6L), ItemList.IC2_Resin.get(1L))
                 .outputChances(10000, 3300)
                 .duration(20 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
         } else {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
                 .fluidOutputs(Materials.Methane.getGas(60L))
                 .duration(10 * SECONDS)
                 .eut(20)
                 .addTo(centrifugeRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 6L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 6L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
                 .outputChances(10000, 8000)
                 .duration(20 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
         }
 
-        GT_ModHandler.addCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 2L),
-            gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "sLf", 'L', GT_Utility.copyAmount(1, aStack) });
+        GTModHandler.addCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 2L),
+            GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "sLf", 'L', GTUtility.copyAmount(1, aStack) });
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 4L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 4L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
             .duration(8 * SECONDS)
             .eut(7)
             .addTo(latheRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.FR_Stick.get(1L))
             .fluidInputs(Materials.SeedOil.getFluid(50L))
             .duration(16 * TICKS)
             .eut(7)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(8, aStack), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.FR_Casing_Impregnated.get(1L))
             .fluidInputs(Materials.SeedOil.getFluid(250L))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
-            .itemOutputs(GT_ModHandler.getModItem(Railcraft.ID, "cube", 1L, 8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
+            .itemOutputs(GTModHandler.getModItem(Railcraft.ID, "cube", 1L, 8))
             .fluidInputs(Materials.Creosote.getFluid(750L))
             .duration(16 * TICKS)
             .eut(TierEU.ULV)
@@ -123,172 +122,171 @@ public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistra
         short aMeta = (short) aStack.getItemDamage();
 
         if (aMeta == Short.MAX_VALUE) {
-            if ((GT_Utility.areStacksEqual(
-                GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1, aStack), false, null),
+            if ((GTUtility.areStacksEqual(
+                GTModHandler.getSmeltingOutput(GTUtility.copyAmount(1, aStack), false, null),
                 new ItemStack(Items.coal, 1, 1)))) {
                 addPyrolyeOvenRecipes(aStack);
-                GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1, aStack));
+                GTModHandler.removeFurnaceSmelting(GTUtility.copyAmount(1, aStack));
             }
             for (int i = 0; i < 32767; i++) {
-                if ((GT_Utility.areStacksEqual(
-                    GT_ModHandler.getSmeltingOutput(new ItemStack(aStack.getItem(), 1, i), false, null),
+                if ((GTUtility.areStacksEqual(
+                    GTModHandler.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));
+                    GTModHandler.removeFurnaceSmelting(new ItemStack(aStack.getItem(), 1, i));
                 }
-                ItemStack tStack = GT_ModHandler.getRecipeOutput(new ItemStack(aStack.getItem(), 1, i));
+                ItemStack tStack = GTModHandler.getRecipeOutput(new ItemStack(aStack.getItem(), 1, i));
                 if (tStack == null) {
                     if (i >= 16) {
                         break;
                     }
                 } else {
-                    ItemStack tPlanks = GT_Utility.copyOrNull(tStack);
+                    ItemStack tPlanks = GTUtility.copyOrNull(tStack);
                     if (tPlanks != null) {
                         tPlanks.stackSize = (tPlanks.stackSize * 3 / 2);
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(new ItemStack(aStack.getItem(), 1, i))
                             .itemOutputs(
-                                GT_Utility.copyOrNull(tPlanks),
-                                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+                                GTUtility.copyOrNull(tPlanks),
+                                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
                             .fluidInputs(Materials.Lubricant.getFluid(1L))
                             .duration(10 * SECONDS)
                             .eut(8)
                             .addTo(cutterRecipes);
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(new ItemStack(aStack.getItem(), 1, i))
                             .itemOutputs(
-                                GT_Utility.copyAmount(
-                                    GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                                GTUtility.copyAmount(
+                                    GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                                     tStack),
-                                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+                                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
                             .fluidInputs(Materials.Water.getFluid(Math.min(1000, 200 * 8 / 320)))
                             .duration(20 * SECONDS)
                             .eut(8)
                             .addTo(cutterRecipes);
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(new ItemStack(aStack.getItem(), 1, i))
                             .itemOutputs(
-                                GT_Utility.copyAmount(
-                                    GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                                GTUtility.copyAmount(
+                                    GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                                     tStack),
-                                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
-                            .fluidInputs(GT_ModHandler.getDistilledWater(3))
+                                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+                            .fluidInputs(GTModHandler.getDistilledWater(3))
                             .duration(20 * SECONDS)
                             .eut(8)
                             .addTo(cutterRecipes);
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(new ItemStack(aStack.getItem(), 1, i))
                             .itemOutputs(
-                                GT_Utility.copyAmount(
-                                    GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                                GTUtility.copyAmount(
+                                    GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                                     tStack),
-                                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+                                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
                             .fluidInputs(Materials.Lubricant.getFluid(1))
                             .duration(10 * SECONDS)
                             .eut(8)
                             .addTo(cutterRecipes);
-                        GT_ModHandler.removeRecipeDelayed(new ItemStack(aStack.getItem(), 1, i));
-                        GT_ModHandler.addCraftingRecipe(
-                            GT_Utility.copyAmount(
-                                GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                        GTModHandler.removeRecipeDelayed(new ItemStack(aStack.getItem(), 1, i));
+                        GTModHandler.addCraftingRecipe(
+                            GTUtility.copyAmount(
+                                GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                                 tStack),
-                            GT_ModHandler.RecipeBits.BUFFERED,
+                            GTModHandler.RecipeBits.BUFFERED,
                             new Object[] { "s", "L", 'L', new ItemStack(aStack.getItem(), 1, i) });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility
-                                .copyAmount(tStack.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
-                            GT_ModHandler.RecipeBits.BUFFERED,
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility
+                                .copyAmount(tStack.stackSize / (GTMod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
+                            GTModHandler.RecipeBits.BUFFERED,
                             new Object[] { new ItemStack(aStack.getItem(), 1, i) });
                     }
                 }
             }
         } else {
-            if ((GT_Utility.areStacksEqual(
-                GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1, aStack), false, null),
+            if ((GTUtility.areStacksEqual(
+                GTModHandler.getSmeltingOutput(GTUtility.copyAmount(1, aStack), false, null),
                 new ItemStack(Items.coal, 1, 1)))) {
                 addPyrolyeOvenRecipes(aStack);
-                GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1, aStack));
+                GTModHandler.removeFurnaceSmelting(GTUtility.copyAmount(1, aStack));
             }
-            ItemStack tStack = GT_ModHandler.getRecipeOutput(GT_Utility.copyAmount(1, aStack));
+            ItemStack tStack = GTModHandler.getRecipeOutput(GTUtility.copyAmount(1, aStack));
             if (tStack != null) {
-                ItemStack tPlanks = GT_Utility.copyOrNull(tStack);
+                ItemStack tPlanks = GTUtility.copyOrNull(tStack);
                 if (tPlanks != null) {
                     tPlanks.stackSize = (tPlanks.stackSize * 3 / 2);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .itemOutputs(
-                            GT_Utility.copyOrNull(tPlanks),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+                            GTUtility.copyOrNull(tPlanks),
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
                         .fluidInputs(Materials.Lubricant.getFluid(1L))
                         .duration(10 * SECONDS)
                         .eut(8)
                         .addTo(cutterRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .itemOutputs(
-                            GT_Utility.copyAmount(
-                                GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                            GTUtility.copyAmount(
+                                GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                                 tStack),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
                         .fluidInputs(Materials.Water.getFluid(Math.min(1000, 200 * 8 / 320)))
                         .duration(20 * SECONDS)
                         .eut(8)
                         .addTo(cutterRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .itemOutputs(
-                            GT_Utility.copyAmount(
-                                GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                            GTUtility.copyAmount(
+                                GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                                 tStack),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
-                        .fluidInputs(GT_ModHandler.getDistilledWater(3))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+                        .fluidInputs(GTModHandler.getDistilledWater(3))
                         .duration(20 * SECONDS)
                         .eut(8)
                         .addTo(cutterRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
                         .itemOutputs(
-                            GT_Utility.copyAmount(
-                                GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                            GTUtility.copyAmount(
+                                GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                                 tStack),
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
                         .fluidInputs(Materials.Lubricant.getFluid(1))
                         .duration(10 * SECONDS)
                         .eut(8)
                         .addTo(cutterRecipes);
-                    GT_ModHandler.removeRecipeDelayed(GT_Utility.copyAmount(1, aStack));
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_Utility.copyAmount(
-                            GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                    GTModHandler.removeRecipeDelayed(GTUtility.copyAmount(1, aStack));
+                    GTModHandler.addCraftingRecipe(
+                        GTUtility.copyAmount(
+                            GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
                             tStack),
-                        new Object[] { "s", "L", 'L', GT_Utility.copyAmount(1, aStack) });
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_Utility
-                            .copyAmount(tStack.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
-                        new Object[] { GT_Utility.copyAmount(1, aStack) });
+                        new Object[] { "s", "L", 'L', GTUtility.copyAmount(1, aStack) });
+                    GTModHandler.addShapelessCraftingRecipe(
+                        GTUtility.copyAmount(tStack.stackSize / (GTMod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
+                        new Object[] { GTUtility.copyAmount(1, aStack) });
                 }
             }
         }
 
-        if ((GT_Utility.areStacksEqual(
-            GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1, aStack), false, null),
+        if ((GTUtility.areStacksEqual(
+            GTModHandler.getSmeltingOutput(GTUtility.copyAmount(1, aStack), false, null),
             new ItemStack(Items.coal, 1, 1)))) {
             addPyrolyeOvenRecipes(aStack);
-            GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1, aStack));
+            GTModHandler.removeFurnaceSmelting(GTUtility.copyAmount(1, aStack));
         }
     }
 
     public static void addPyrolyeOvenRecipes(ItemStack logStack) {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidOutputs(Materials.Creosote.getFluid(4000))
             .duration(32 * SECONDS)
             .eut(64)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidInputs(Materials.Nitrogen.getGas(1000))
             .fluidOutputs(Materials.Creosote.getFluid(4000))
@@ -296,16 +294,16 @@ public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistra
             .eut(96)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(3))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidOutputs(Materials.CharcoalByproducts.getGas(4000))
             .duration(32 * SECONDS)
             .eut(64)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(4))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidInputs(Materials.Nitrogen.getGas(1000))
             .fluidOutputs(Materials.CharcoalByproducts.getGas(4000))
@@ -313,16 +311,16 @@ public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistra
             .eut(96)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(5))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidOutputs(Materials.WoodGas.getGas(1500))
             .duration(32 * SECONDS)
             .eut(64)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(6))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidInputs(Materials.Nitrogen.getGas(1000))
             .fluidOutputs(Materials.WoodGas.getGas(1500))
@@ -330,16 +328,16 @@ public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistra
             .eut(96)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(7))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(7))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidOutputs(Materials.WoodVinegar.getFluid(3000))
             .duration(32 * SECONDS)
             .eut(64)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidInputs(Materials.Nitrogen.getGas(1000))
             .fluidOutputs(Materials.WoodVinegar.getFluid(3000))
@@ -347,16 +345,16 @@ public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistra
             .eut(96)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidOutputs(Materials.WoodTar.getFluid(1500))
             .duration(32 * SECONDS)
             .eut(64)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(10))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(10))
             .itemOutputs(Materials.Charcoal.getGems(20))
             .fluidInputs(Materials.Nitrogen.getGas(1000))
             .fluidOutputs(Materials.WoodTar.getFluid(1500))
@@ -364,8 +362,8 @@ public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistra
             .eut(96)
             .noOptimize()
             .addTo(pyrolyseRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, logStack), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Ash.getDust(4))
             .fluidOutputs(Materials.OilHeavy.getFluid(200))
             .duration(16 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java
index 8d7ca9e518..624730af3e 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java
@@ -2,23 +2,23 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.recipe.RecipeCategories;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeRegistrator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeRegistrator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingNugget implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -31,21 +31,21 @@ public class ProcessingNugget implements gregtech.api.interfaces.IOreRecipeRegis
         ItemStack aStack) {
 
         if (aMaterial.contains(SubTag.SMELTING_TO_GEM)
-            && GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial.mSmeltInto, 1L) != null) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Mold_Ball.get(0L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial.mSmeltInto, 1L))
+            && GTOreDictUnificator.get(OrePrefixes.gem, aMaterial.mSmeltInto, 1L) != null) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(9, aStack), ItemList.Shape_Mold_Ball.get(0L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, aMaterial.mSmeltInto, 1L))
                 .duration(10 * SECONDS)
                 .eut(calculateRecipeEU(aMaterial, 2))
                 .addTo(alloySmelterRecipes);
         }
 
         if ((!aMaterial.contains(SubTag.SMELTING_TO_GEM))
-            && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L) != null
+            && GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L) != null
             && aMaterial != Materials.Aluminium) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Mold_Ingot.get(0L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(9, aStack), ItemList.Shape_Mold_Ingot.get(0L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L))
                 .duration(10 * SECONDS)
                 .eut(calculateRecipeEU(aMaterial, 2))
                 .recipeCategory(RecipeCategories.alloySmelterMolding)
@@ -54,9 +54,9 @@ public class ProcessingNugget implements gregtech.api.interfaces.IOreRecipeRegis
 
         if (aMaterial.mStandardMoltenFluid != null) {
             if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(ItemList.Shape_Mold_Nugget.get(0L))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L))
                     .fluidInputs(aMaterial.getMolten(16L))
                     .duration(16 * TICKS)
                     .eut(calculateRecipeEU(aMaterial, 4))
@@ -64,24 +64,24 @@ public class ProcessingNugget implements gregtech.api.interfaces.IOreRecipeRegis
             }
         }
 
-        GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
-        GT_RecipeRegistrator
+        GTRecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+        GTRecipeRegistrator
             .registerReverseMacerating(aStack, aMaterial, aPrefix.mMaterialAmount, null, null, null, false);
         if (!aMaterial.contains(SubTag.NO_SMELTING)
-            && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
-            GT_Values.RA.stdBuilder()
+            && GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
                     ItemList.Shape_Mold_Nugget.get(0L))
-                .itemOutputs(GT_Utility.copyAmount(9, aStack))
+                .itemOutputs(GTUtility.copyAmount(9, aStack))
                 .duration(5 * SECONDS)
                 .eut(calculateRecipeEU(aMaterial, 1))
                 .recipeCategory(RecipeCategories.alloySmelterMolding)
                 .addTo(alloySmelterRecipes);
             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 8L),
-                    GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.nugget, aMaterial, 8L),
+                    GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "sI ", 'I', OrePrefixes.ingot.get(aMaterial) });
             }
         }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java
index 79342a460d..4d0b405fea 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java
@@ -4,22 +4,22 @@ import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
 import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
 
 import java.util.ArrayList;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
+import gregtech.GTMod;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -41,21 +41,21 @@ public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistra
         // For Sake of god of balance!
 
         // Dense ore
-        if (GT_Mod.gregtechproxy.mRichOreYieldMultiplier) {
+        if (GTMod.gregtechproxy.mRichOreYieldMultiplier) {
             tIsRich = (aPrefix == OrePrefixes.oreRich) || (aPrefix == OrePrefixes.oreDense);
         }
         // NetherOre
-        if (GT_Mod.gregtechproxy.mNetherOreYieldMultiplier && !tIsRich) {
+        if (GTMod.gregtechproxy.mNetherOreYieldMultiplier && !tIsRich) {
             tIsRich = (aPrefix == OrePrefixes.oreNetherrack) || (aPrefix == OrePrefixes.oreNether);
         }
         // EndOre
-        if (GT_Mod.gregtechproxy.mEndOreYieldMultiplier && !tIsRich) {
+        if (GTMod.gregtechproxy.mEndOreYieldMultiplier && !tIsRich) {
             tIsRich = (aPrefix == OrePrefixes.oreEndstone) || (aPrefix == OrePrefixes.oreEnd);
         }
 
         if (aMaterial == Materials.Oilsands) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
                 .itemOutputs(new ItemStack(net.minecraft.init.Blocks.sand, 1, 0))
                 .outputChances(tIsRich ? 2000 : 4000)
                 .fluidOutputs(Materials.OilHeavy.getFluid(tIsRich ? 4000L : 2000L))
@@ -63,67 +63,67 @@ public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistra
                 .eut(TierEU.RECIPE_LV)
                 .addTo(centrifugeRecipes);
         } else {
-            registerStandardOreRecipes(aPrefix, aMaterial, GT_Utility.copyAmount(1, aStack), tIsRich ? 2 : 1);
+            registerStandardOreRecipes(aPrefix, aMaterial, GTUtility.copyAmount(1, aStack), tIsRich ? 2 : 1);
         }
     }
 
     private boolean registerStandardOreRecipes(OrePrefixes aPrefix, Materials aMaterial, ItemStack aOreStack,
         int aMultiplier) {
         if ((aOreStack == null) || (aMaterial == null)) return false;
-        GT_ModHandler
-            .addValuableOre(GT_Utility.getBlockFromStack(aOreStack), aOreStack.getItemDamage(), aMaterial.mOreValue);
+        GTModHandler
+            .addValuableOre(GTUtility.getBlockFromStack(aOreStack), aOreStack.getItemDamage(), aMaterial.mOreValue);
         Materials tMaterial = aMaterial.mOreReplacement;
         Materials tPrimaryByMaterial = null;
         aMultiplier = Math.max(1, aMultiplier);
-        aOreStack = GT_Utility.copyAmount(1, aOreStack);
+        aOreStack = GTUtility.copyAmount(1, aOreStack);
         aOreStack.stackSize = 1;
 
-        ItemStack tIngot = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
-        ItemStack tGem = GT_OreDictUnificator.get(OrePrefixes.gem, tMaterial, 1L);
+        ItemStack tIngot = GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
+        ItemStack tGem = GTOreDictUnificator.get(OrePrefixes.gem, tMaterial, 1L);
         ItemStack tSmeltInto = tIngot
             == null
                 ? null
                 : aMaterial.contains(SubTag.SMELTING_TO_GEM)
-                    ? GT_OreDictUnificator.get(
+                    ? GTOreDictUnificator.get(
                         OrePrefixes.gem,
                         tMaterial.mDirectSmelting,
-                        GT_OreDictUnificator.get(
+                        GTOreDictUnificator.get(
                             OrePrefixes.crystal,
                             tMaterial.mDirectSmelting,
-                            GT_OreDictUnificator.get(
+                            GTOreDictUnificator.get(
                                 OrePrefixes.gem,
                                 tMaterial,
-                                GT_OreDictUnificator.get(OrePrefixes.crystal, tMaterial, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.crystal, tMaterial, 1L),
                                 1L),
                             1L),
                         1L)
                     : tIngot;
 
-        ItemStack tDust = GT_OreDictUnificator.get(OrePrefixes.dust, tMaterial, tGem, 1L);
-        ItemStack tCleaned = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, tMaterial, tDust, 1L);
-        ItemStack tCrushed = GT_OreDictUnificator
+        ItemStack tDust = GTOreDictUnificator.get(OrePrefixes.dust, tMaterial, tGem, 1L);
+        ItemStack tCleaned = GTOreDictUnificator.get(OrePrefixes.crushedPurified, tMaterial, tDust, 1L);
+        ItemStack tCrushed = GTOreDictUnificator
             .get(OrePrefixes.crushed, tMaterial, (long) aMaterial.mOreMultiplier * aMultiplier);
         ItemStack tPrimaryByProduct = null;
 
         if (tCrushed == null) {
-            tCrushed = GT_OreDictUnificator.get(
+            tCrushed = GTOreDictUnificator.get(
                 OrePrefixes.dustImpure,
                 tMaterial,
-                GT_Utility.copyAmount(aMaterial.mOreMultiplier * aMultiplier, tCleaned, tDust, tGem),
+                GTUtility.copyAmount(aMaterial.mOreMultiplier * aMultiplier, tCleaned, tDust, tGem),
                 (long) aMaterial.mOreMultiplier * aMultiplier);
         }
 
         for (Materials tMat : aMaterial.mOreByProducts) {
-            GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+            GTOreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
             if (tPrimaryByProduct == null) {
                 tPrimaryByMaterial = tMat;
-                tPrimaryByProduct = GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
-                if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
-                    .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+                tPrimaryByProduct = GTOreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+                if (GTOreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GTOreDictUnificator
+                    .get(OrePrefixes.dustTiny, tMat, GTOreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
             }
-            GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
-            if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
-                .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+            GTOreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+            if (GTOreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GTOreDictUnificator
+                .get(OrePrefixes.dustTiny, tMat, GTOreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
         }
 
         if (tPrimaryByMaterial == null) tPrimaryByMaterial = tMaterial;
@@ -132,33 +132,33 @@ public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistra
 
         if (tSmeltInto != null) {
             if ((aMaterial.mBlastFurnaceRequired) || (aMaterial.mDirectSmelting.mBlastFurnaceRequired)) {
-                GT_ModHandler.removeFurnaceSmelting(aOreStack);
+                GTModHandler.removeFurnaceSmelting(aOreStack);
             } else {
-                tHasSmelting = GT_ModHandler.addSmeltingRecipe(
+                tHasSmelting = GTModHandler.addSmeltingRecipe(
                     aOreStack,
-                    GT_Utility.copyAmount(aMultiplier * aMaterial.mSmeltingMultiplier, tSmeltInto));
+                    GTUtility.copyAmount(aMultiplier * aMaterial.mSmeltingMultiplier, tSmeltInto));
             }
 
             if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_TRIPLE)) {
                 if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(aMultiplier * 3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(aMultiplier * 3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
                         .addTo(blastFurnaceRecipes);
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(aMultiplier * 3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(aMultiplier * 3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
@@ -166,24 +166,24 @@ public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistra
                 }
             } else if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_DOUBLE)) {
                 if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(aMultiplier * 2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(aMultiplier * 2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
                         .addTo(blastFurnaceRecipes);
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(aMultiplier * 2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(aMultiplier * 2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
@@ -193,18 +193,18 @@ public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistra
         }
 
         if (!tHasSmelting) {
-            GT_ModHandler.addSmeltingRecipe(
+            GTModHandler.addSmeltingRecipe(
                 aOreStack,
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.gem,
                     tMaterial.mDirectSmelting,
                     Math.max(1, aMultiplier * aMaterial.mSmeltingMultiplier / 2)));
         }
 
         if (tCrushed != null) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(aOreStack)
-                .itemOutputs(GT_Utility.copy(GT_Utility.copyAmount(tCrushed.stackSize, tGem), tCrushed))
+                .itemOutputs(GTUtility.copy(GTUtility.copyAmount(tCrushed.stackSize, tGem), tCrushed))
                 .duration(10)
                 .eut(16)
                 .addTo(hammerRecipes);
@@ -212,19 +212,19 @@ public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistra
             int chanceOre2 = tPrimaryByProduct == null ? 0
                 : tPrimaryByProduct.stackSize * 10 * aMultiplier * aMaterial.mByProductMultiplier;
             chanceOre2 = 100 * chanceOre2; // converting to the GT format, 100% is 10000
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(aOreStack)
                 .itemOutputs(
-                    GT_Utility.mul(2, tCrushed),
-                    tMaterial.contains(SubTag.PULVERIZING_CINNABAR) ? GT_OreDictUnificator.get(
+                    GTUtility.mul(2, tCrushed),
+                    tMaterial.contains(SubTag.PULVERIZING_CINNABAR) ? GTOreDictUnificator.get(
                         OrePrefixes.crystal,
                         Materials.Cinnabar,
-                        GT_OreDictUnificator
-                            .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
+                        GTOreDictUnificator
+                            .get(OrePrefixes.gem, tPrimaryByMaterial, GTUtility.copyAmount(1, tPrimaryByProduct), 1L),
                         1L)
-                        : GT_OreDictUnificator
-                            .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
-                    GT_OreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
+                        : GTOreDictUnificator
+                            .get(OrePrefixes.gem, tPrimaryByMaterial, GTUtility.copyAmount(1, tPrimaryByProduct), 1L),
+                    GTOreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
                 .outputChances(10000, chanceOre2, 5000)
                 .duration(20 * SECONDS)
                 .eut(2)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java
index ac9106d31b..d71b4a61f4 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java
@@ -2,17 +2,17 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingOrePoor implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -43,30 +43,30 @@ public class ProcessingOrePoor implements gregtech.api.interfaces.IOreRecipeRegi
                 break;
         }
         if (aMaterial != null) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, aMultiplier))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, aMultiplier))
                 .duration(10)
                 .eut(16)
                 .addTo(hammerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 2 * aMultiplier),
-                    GT_OreDictUnificator.get(
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 2 * aMultiplier),
+                    GTOreDictUnificator.get(
                         OrePrefixes.dustTiny,
-                        GT_Utility.selectItemInList(0, aMaterial, aMaterial.mOreByProducts),
+                        GTUtility.selectItemInList(0, aMaterial, aMaterial.mOreByProducts),
                         1L),
-                    GT_OreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
+                    GTOreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
                 .outputChances(10000, 100 * 5 * aMultiplier, 10000)
                 .duration(20 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
-            if (aMaterial.contains(SubTag.NO_SMELTING)) GT_ModHandler.addSmeltingRecipe(
-                GT_Utility.copyAmount(1, aStack),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial.mDirectSmelting, aMultiplier));
+            if (aMaterial.contains(SubTag.NO_SMELTING)) GTModHandler.addSmeltingRecipe(
+                GTUtility.copyAmount(1, aStack),
+                GTOreDictUnificator.get(OrePrefixes.nugget, aMaterial.mDirectSmelting, aMultiplier));
         }
     }
 }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java
index 93458ee467..315bdcd6dd 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java
@@ -2,24 +2,24 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
 import static gregtech.api.recipe.RecipeMaps.primitiveBlastRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT;
-import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.ADDITIVE_AMOUNT;
+import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
+import gregtech.GTMod;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -34,24 +34,24 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        GT_ModHandler.removeFurnaceSmelting(aStack);
+        GTModHandler.removeFurnaceSmelting(aStack);
         if (!aMaterial.contains(SubTag.NO_SMELTING)) {
             if ((aMaterial.mBlastFurnaceRequired) || (aMaterial.mDirectSmelting.mBlastFurnaceRequired)) {
                 if (aMaterial.mBlastFurnaceTemp < 1000 && aMaterial.mDirectSmelting.mBlastFurnaceTemp < 1000)
                     if (aMaterial.mAutoGenerateBlastFurnaceRecipes
-                        && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
-                            GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+                        && GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+                            GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
                             recipeBuilder
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1));
+                                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1));
                             if (aMaterial.mBlastFurnaceTemp > 1750) {
                                 recipeBuilder.itemOutputs(
-                                    GT_OreDictUnificator.get(
+                                    GTOreDictUnificator.get(
                                         OrePrefixes.ingotHot,
                                         aMaterial,
-                                        GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
+                                        GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
                                         1L));
                             } else {
-                                recipeBuilder.itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L));
+                                recipeBuilder.itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L));
                             }
                             recipeBuilder
                                 .duration(Math.max(aMaterial.getMass() / 4L, 1L) * aMaterial.mBlastFurnaceTemp * TICKS)
@@ -70,7 +70,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                             outputSize = 10;
                             outputPrefix = OrePrefixes.nugget;
                         } else {
-                            if (GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
+                            if (GTMod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
                                 outputSize = 6;
                                 outputPrefix = OrePrefixes.nugget;
                             } else {
@@ -80,18 +80,18 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                         }
                         break;
                     case dust:
-                        int outputAmount = GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre ? 2 : 3;
+                        int outputAmount = GTMod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre ? 2 : 3;
                         if (aMaterial.mDirectSmelting != aMaterial) {
                             if (!aMaterial.contains(SubTag.DONT_ADD_DEFAULT_BBF_RECIPE)
                                 && aMaterial.mDirectSmelting.getIngots(1) != null) {
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(2, aStack))
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(2, aStack))
                                     .itemOutputs(aMaterial.mDirectSmelting.getIngots(outputAmount))
                                     .duration(2 * MINUTES)
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
                             } else if (aMaterial == Materials.Chalcopyrite) {
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2), new ItemStack(Blocks.sand, 2))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -99,7 +99,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                                     .duration(2 * MINUTES)
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2), Materials.Glass.getDust(2))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -107,7 +107,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                                     .duration(2 * MINUTES)
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2), Materials.SiliconDioxide.getDust(2))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -115,7 +115,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                                     .duration(2 * MINUTES)
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2), Materials.Quartzite.getDust(4))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -123,7 +123,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                                     .duration(2 * MINUTES)
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2), Materials.NetherQuartz.getDust(2))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -131,7 +131,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                                     .duration(2 * MINUTES)
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2), Materials.CertusQuartz.getDust(2))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -140,7 +140,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
                             } else if (aMaterial == Materials.Tetrahedrite) {
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -149,7 +149,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                                     .metadata(ADDITIVE_AMOUNT, 2)
                                     .addTo(primitiveBlastRecipes);
                             } else if (aMaterial == Materials.Galena) {
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aMaterial.getDust(2))
                                     .itemOutputs(
                                         aMaterial.mDirectSmelting.getIngots(outputAmount),
@@ -166,7 +166,7 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                             outputPrefix = OrePrefixes.ingot;
                             outputSize = 1;
                         } else {
-                            if (GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
+                            if (GTMod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
                                 outputSize = 6;
                                 outputPrefix = OrePrefixes.nugget;
                             } else {
@@ -180,14 +180,14 @@ public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipe
                         outputSize = 1;
                         break;
                 }
-                ItemStack tStack = GT_OreDictUnificator.get(outputPrefix, aMaterial.mDirectSmelting, outputSize);
-                if (tStack == null) tStack = GT_OreDictUnificator.get(
+                ItemStack tStack = GTOreDictUnificator.get(outputPrefix, aMaterial.mDirectSmelting, outputSize);
+                if (tStack == null) tStack = GTOreDictUnificator.get(
                     aMaterial.contains(SubTag.SMELTING_TO_GEM) ? OrePrefixes.gem : OrePrefixes.ingot,
                     aMaterial.mDirectSmelting,
                     1L);
                 if ((tStack == null) && (!aMaterial.contains(SubTag.SMELTING_TO_GEM)))
-                    tStack = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
-                GT_ModHandler.addSmeltingRecipe(aStack, tStack);
+                    tStack = GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
+                GTModHandler.addSmeltingRecipe(aStack, tStack);
             }
         }
     }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java
index 1f97e1e32a..b8a39737cc 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java
@@ -1,21 +1,21 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.enums.ToolDictNames;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
 public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistrator {
@@ -42,13 +42,13 @@ public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistr
             case pipeHuge, pipeLarge, pipeMedium, pipeSmall, pipeTiny -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 8L),
-                        GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 8L),
+                        GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "PPP", "h w", "PPP", 'P', OrePrefixes.plate.get(aMaterial) });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 6L),
-                        GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 6L),
+                        GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "PWP", "P P", "PHP", 'P',
                             aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
                                 : OrePrefixes.plate.get(aMaterial),
@@ -57,9 +57,9 @@ public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistr
                                 : ToolDictNames.craftingToolHardHammer,
                             'W', aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSaw
                                 : ToolDictNames.craftingToolWrench });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 2L),
-                        GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 2L),
+                        GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "PPP", "W H", "PPP", 'P',
                             aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
                                 : OrePrefixes.plate.get(aMaterial),
@@ -68,9 +68,9 @@ public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistr
                                 : ToolDictNames.craftingToolHardHammer,
                             'W', aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSaw
                                 : ToolDictNames.craftingToolWrench });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L),
-                        GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L),
+                        GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "PHP", "P P", "PWP", 'P',
                             aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
                                 : OrePrefixes.plate.get(aMaterial),
@@ -79,21 +79,21 @@ public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistr
                                 : ToolDictNames.craftingToolHardHammer,
                             'W', aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSaw
                                 : ToolDictNames.craftingToolWrench });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L),
-                        GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L),
+                        GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "DhD", "D D", "DwD", 'D', OrePrefixes.plateDouble.get(aMaterial) });
                 }
             }
             case pipeRestrictiveHuge, pipeRestrictiveLarge, pipeRestrictiveMedium, pipeRestrictiveSmall, pipeRestrictiveTiny -> {
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(
+                        GTOreDictUnificator.get(
                             OrePrefixes.ring,
                             Materials.Steel,
                             aPrefix.mSecondaryMaterial.mAmount / OrePrefixes.ring.mMaterialAmount),
-                        GT_OreDictUnificator.get(aOreDictName.replaceFirst("Restrictive", ""), null, 1L, false, true))
-                    .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                        GTOreDictUnificator.get(aOreDictName.replaceFirst("Restrictive", ""), null, 1L, false, true))
+                    .itemOutputs(GTUtility.copyAmount(1, aStack))
                     .duration(
                         ((int) (aPrefix.mSecondaryMaterial.mAmount * 400L / OrePrefixes.ring.mMaterialAmount)) * TICKS)
                     .eut(4)
@@ -102,17 +102,17 @@ public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistr
             case pipeQuadruple -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, aMaterial, 1),
-                        GT_ModHandler.RecipeBits.REVERSIBLE | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, aMaterial, 1),
+                        GTModHandler.RecipeBits.REVERSIBLE | GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "MM ", "MM ", "   ", 'M',
-                            GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1) });
+                            GTOreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1) });
                 }
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 4),
-                        GT_Utility.getIntegratedCircuit(9))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, aMaterial, 1))
+                        GTOreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 4),
+                        GTUtility.getIntegratedCircuit(9))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, aMaterial, 1))
                     .duration(3 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 4))
                     .addTo(assemblerRecipes);
@@ -120,17 +120,17 @@ public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistr
             case pipeNonuple -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_Utility.copyAmount(1, aStack),
-                        GT_ModHandler.RecipeBits.REVERSIBLE | GT_ModHandler.RecipeBits.BUFFERED,
-                        new Object[] { "PPP", "PPP", "PPP", 'P', GT_OreDictUnificator
+                    GTModHandler.addCraftingRecipe(
+                        GTUtility.copyAmount(1, aStack),
+                        GTModHandler.RecipeBits.REVERSIBLE | GTModHandler.RecipeBits.BUFFERED,
+                        new Object[] { "PPP", "PPP", "PPP", 'P', GTOreDictUnificator
                             .get(aOreDictName.replaceFirst("Nonuple", "Small"), null, 1L, false, true) });
                 }
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 9),
-                        GT_Utility.getIntegratedCircuit(9))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeNonuple, aMaterial, 1))
+                        GTOreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 9),
+                        GTUtility.getIntegratedCircuit(9))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeNonuple, aMaterial, 1))
                     .duration(3 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 8))
                     .addTo(assemblerRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java
index 3b06babee6..e6a74aac19 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java
@@ -3,19 +3,19 @@ package gregtech.loaders.oreprocessing;
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
 import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingPlank implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -27,38 +27,38 @@ public class ProcessingPlank implements gregtech.api.interfaces.IOreRecipeRegist
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (aOreDictName.startsWith("plankWood")) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2L))
                 .duration(10 * TICKS)
                 .eut(8)
                 .addTo(latheRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(1, aStack),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 1L))
+                    GTUtility.copyAmount(1, aStack),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 1L))
                 .itemOutputs(ItemList.Crate_Empty.get(1L))
                 .duration(10 * SECONDS)
                 .eut(1)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(1, aStack),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.WroughtIron, 1L))
+                    GTUtility.copyAmount(1, aStack),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.WroughtIron, 1L))
                 .itemOutputs(ItemList.Crate_Empty.get(1L))
                 .duration(10 * SECONDS)
                 .eut(1)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(1, aStack),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 1L))
+                    GTUtility.copyAmount(1, aStack),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 1L))
                 .itemOutputs(ItemList.Crate_Empty.get(1L))
                 .duration(10 * SECONDS)
                 .eut(1)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(8, aStack), GTUtility.getIntegratedCircuit(8))
                 .itemOutputs(new ItemStack(Blocks.chest, 1))
                 .duration(40 * SECONDS)
                 .eut(4)
@@ -66,69 +66,69 @@ public class ProcessingPlank implements gregtech.api.interfaces.IOreRecipeRegist
 
             if (aStack.getItemDamage() == 32767) {
                 for (byte i = 0; i < 64; i = (byte) (i + 1)) {
-                    ItemStack tStack = GT_Utility.copyMetaData(i, aStack);
+                    ItemStack tStack = GTUtility.copyMetaData(i, aStack);
                     // Get Recipe and Output, add recipe to delayed removal
-                    ItemStack tOutput = GT_ModHandler.getRecipeOutput(tStack, tStack, tStack);
+                    ItemStack tOutput = GTModHandler.getRecipeOutput(tStack, tStack, tStack);
                     if ((tOutput != null) && (tOutput.stackSize >= 3)) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, tStack))
-                            .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, tStack))
+                            .itemOutputs(GTUtility.copyAmount(tOutput.stackSize / 3, tOutput))
                             .fluidInputs(Materials.Water.getFluid(4))
                             .duration(2 * 25 * TICKS)
                             .eut(4)
                             .addTo(cutterRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, tStack))
-                            .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
-                            .fluidInputs(GT_ModHandler.getDistilledWater(3))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, tStack))
+                            .itemOutputs(GTUtility.copyAmount(tOutput.stackSize / 3, tOutput))
+                            .fluidInputs(GTModHandler.getDistilledWater(3))
                             .duration(2 * 25 * TICKS)
                             .eut(4)
                             .addTo(cutterRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, tStack))
-                            .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, tStack))
+                            .itemOutputs(GTUtility.copyAmount(tOutput.stackSize / 3, tOutput))
                             .fluidInputs(Materials.Lubricant.getFluid(1))
                             .duration(25 * TICKS)
                             .eut(4)
                             .addTo(cutterRecipes);
-                        GT_ModHandler.removeRecipeDelayed(tStack, tStack, tStack);
-                        GT_ModHandler.addCraftingRecipe(
-                            GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput),
-                            GT_ModHandler.RecipeBits.BUFFERED,
+                        GTModHandler.removeRecipeDelayed(tStack, tStack, tStack);
+                        GTModHandler.addCraftingRecipe(
+                            GTUtility.copyAmount(tOutput.stackSize / 3, tOutput),
+                            GTModHandler.RecipeBits.BUFFERED,
                             new Object[] { "sP", 'P', tStack });
                     }
                     if ((tStack == null) && (i >= 16)) break;
                 }
             } else {
                 ItemStack tOutput = !aModName.equalsIgnoreCase("thaumcraft")
-                    ? GT_ModHandler.getRecipeOutput(aStack, aStack, aStack)
-                    : GT_ModHandler.getRecipeOutputNoOreDict(aStack, aStack, aStack);
+                    ? GTModHandler.getRecipeOutput(aStack, aStack, aStack)
+                    : GTModHandler.getRecipeOutputNoOreDict(aStack, aStack, aStack);
                 if ((tOutput != null) && (tOutput.stackSize >= 3)) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTUtility.copyAmount(tOutput.stackSize / 3, tOutput))
                         .fluidInputs(Materials.Water.getFluid(4))
                         .duration(2 * 25)
                         .eut(4)
                         .addTo(cutterRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
-                        .fluidInputs(GT_ModHandler.getDistilledWater(3))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTUtility.copyAmount(tOutput.stackSize / 3, tOutput))
+                        .fluidInputs(GTModHandler.getDistilledWater(3))
                         .duration(2 * 25)
                         .eut(4)
                         .addTo(cutterRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTUtility.copyAmount(tOutput.stackSize / 3, tOutput))
                         .fluidInputs(Materials.Lubricant.getFluid(1))
                         .duration(25)
                         .eut(4)
                         .addTo(cutterRecipes);
-                    GT_ModHandler.removeRecipeDelayed(aStack, aStack, aStack);
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput),
-                        GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.removeRecipeDelayed(aStack, aStack, aStack);
+                    GTModHandler.addCraftingRecipe(
+                        GTUtility.copyAmount(tOutput.stackSize / 3, tOutput),
+                        GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "sP", 'P', aStack });
                 }
             }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java
index 801eaa8354..574af24531 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java
@@ -1,9 +1,9 @@
 package gregtech.loaders.oreprocessing;
 
-import static gregtech.api.enums.GT_Values.L;
-import static gregtech.api.enums.GT_Values.NI;
-import static gregtech.api.enums.GT_Values.RA;
-import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.enums.GTValues.L;
+import static gregtech.api.enums.GTValues.NI;
+import static gregtech.api.enums.GTValues.RA;
+import static gregtech.api.enums.GTValues.W;
 import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
 import static gregtech.api.recipe.RecipeMaps.benderRecipes;
@@ -11,24 +11,24 @@ import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
 import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
 import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
-import static gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED;
-import static gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeBuilder.WILDCARD;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
-import static gregtech.common.GT_Proxy.tBits;
+import static gregtech.api.util.GTModHandler.RecipeBits.BUFFERED;
+import static gregtech.api.util.GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.WILDCARD;
+import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
+import static gregtech.common.GTProxy.tBits;
 
 import net.minecraft.block.Block;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
@@ -38,11 +38,11 @@ import gregtech.api.enums.TierEU;
 import gregtech.api.enums.ToolDictNames;
 import gregtech.api.recipe.RecipeCategories;
 import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_RecipeRegistrator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeConstants;
+import gregtech.api.util.GTRecipeRegistrator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -92,25 +92,25 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
 
         registerCover(aMaterial, aStack);
 
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
-        GT_ModHandler.removeRecipeDelayed(aStack);
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
+        GTModHandler.removeRecipeDelayed(aStack);
 
-        GT_Utility.removeSimpleIC2MachineRecipe(
-            GT_Utility.copyAmount(9, aStack),
-            GT_ModHandler.getCompressorRecipeList(),
-            GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L));
+        GTUtility.removeSimpleIC2MachineRecipe(
+            GTUtility.copyAmount(9, aStack),
+            GTModHandler.getCompressorRecipeList(),
+            GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L));
 
         if (aMaterial.mFuelPower > 0) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
                 .metadata(FUEL_VALUE, aMaterial.mFuelPower)
                 .metadata(FUEL_TYPE, aMaterial.mFuelType)
-                .addTo(GT_RecipeConstants.Fuel);
+                .addTo(GTRecipeConstants.Fuel);
         }
 
         if (aMaterial.mStandardMoltenFluid != null
             && !(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Mold_Plate.get(0L))
                 .itemOutputs(aMaterial.getPlates(1))
                 .fluidInputs(aMaterial.getMolten(L))
@@ -119,14 +119,14 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
                 .addTo(fluidSolidifierRecipes);
         }
 
-        GT_ModHandler.addCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, 2L),
+        GTModHandler.addCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.foil, aMaterial, 2L),
             tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
             new Object[] { "hX", 'X', OrePrefixes.plate.get(aMaterial) });
 
         if (aMaterial == Materials.Paper) {
-            GT_ModHandler.addCraftingRecipe(
-                GT_Utility.copyAmount(2, aStack),
+            GTModHandler.addCraftingRecipe(
+                GTUtility.copyAmount(2, aStack),
                 BUFFERED,
                 new Object[] { "XXX", 'X', new ItemStack(Items.reeds, 1, W) });
         }
@@ -136,27 +136,27 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
             if (!aNoSmashing) {
 
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addCraftingRecipe(
+                    GTModHandler.addCraftingRecipe(
                         aMaterial.getPlates(1),
                         tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
                         new Object[] { "h", // craftingToolHardHammer
                             "X", "X", 'X', OrePrefixes.ingot.get(aMaterial) });
 
                     // Only added if IC2 Forge Hammer is enabled in Recipes.cfg: B:ic2forgehammer_true=false
-                    GT_ModHandler.addCraftingRecipe(
+                    GTModHandler.addCraftingRecipe(
                         aMaterial.getPlates(1),
                         tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
                         new Object[] { "H", // craftingToolForgeHammer
                             "X", 'H', ToolDictNames.craftingToolForgeHammer, 'X', OrePrefixes.ingot.get(aMaterial) });
 
-                    GT_ModHandler.addCraftingRecipe(
+                    GTModHandler.addCraftingRecipe(
                         aMaterial.getPlates(1),
                         tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
                         new Object[] { "h", // craftingToolHardHammer
                             "X", 'X', OrePrefixes.gem.get(aMaterial) });
 
                     // Only added if IC2 Forge Hammer is enabled in Recipes.cfg: B:ic2forgehammer_true=false
-                    GT_ModHandler.addCraftingRecipe(
+                    GTModHandler.addCraftingRecipe(
                         aMaterial.getPlates(1),
                         tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
                         new Object[] { "H", // craftingToolForgeHammer
@@ -167,7 +167,7 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
             if (aMaterial.contains(SubTag.MORTAR_GRINDABLE)) {
 
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addShapelessCraftingRecipe(
+                    GTModHandler.addShapelessCraftingRecipe(
                         aMaterial.getDust(1),
                         tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
                         new Object[] { ToolDictNames.craftingToolMortar, OrePrefixes.plate.get(aMaterial) });
@@ -181,33 +181,33 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
 
         registerCover(aMaterial, aStack);
 
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
 
         if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
             // 2 double -> 1 quadruple plate
-            if (GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+            if (GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(2, aStack), GTUtility.getIntegratedCircuit(2))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
                     .duration(Math.max(aMaterialMass * 2L, 1L))
                     .eut(calculateRecipeEU(aMaterial, 96))
                     .addTo(benderRecipes);
             }
             // 2 plates -> 1 double plate
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L),
-                    GT_Utility.getIntegratedCircuit(2))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L),
+                    GTUtility.getIntegratedCircuit(2))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .duration(Math.max(aMaterialMass * 2L, 1L))
                 .eut(calculateRecipeEU(aMaterial, 96))
                 .addTo(benderRecipes);
         } else {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L),
-                    GT_Utility.getIntegratedCircuit(2))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L),
+                    GTUtility.getIntegratedCircuit(2))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .fluidInputs(Materials.Glue.getFluid(10L))
                 .duration(3 * SECONDS + 4 * TICKS)
                 .eut(8)
@@ -217,8 +217,8 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
         if (!aNoSmashing) {
             Object aPlateStack = OrePrefixes.plate.get(aMaterial);
             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_Utility.copyAmount(1, aStack),
+                GTModHandler.addCraftingRecipe(
+                    GTUtility.copyAmount(1, aStack),
                     DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
                     new Object[] { "I", "B", "h", // craftingToolHardHammer
                         'I', aPlateStack, 'B', aPlateStack });
@@ -231,33 +231,33 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
 
         registerCover(aMaterial, aStack);
 
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
 
         if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
-            if (GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
+            if (GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
                 // 3 triple plates -> 1 dense plate
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(3, aStack), GTUtility.getIntegratedCircuit(3))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
                     .duration(Math.max(aMaterialMass * 3L, 1L))
                     .eut(calculateRecipeEU(aMaterial, 96))
                     .addTo(benderRecipes);
             }
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 3L),
-                    GT_Utility.getIntegratedCircuit(3))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 3L),
+                    GTUtility.getIntegratedCircuit(3))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .duration(Math.max(aMaterialMass * 3L, 1L))
                 .eut(calculateRecipeEU(aMaterial, 96))
                 .addTo(benderRecipes);
         } else {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 3L),
-                    GT_Utility.getIntegratedCircuit(3))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 3L),
+                    GTUtility.getIntegratedCircuit(3))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .fluidInputs(Materials.Glue.getFluid(20L))
                 .duration(4 * SECONDS + 16 * TICKS)
                 .eut(8)
@@ -267,50 +267,50 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
         if (!aNoSmashing) {
             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                 Object aPlateStack = OrePrefixes.plate.get(aMaterial);
-                GT_ModHandler.addCraftingRecipe(
-                    GT_Utility.copyAmount(1, aStack),
+                GTModHandler.addCraftingRecipe(
+                    GTUtility.copyAmount(1, aStack),
                     DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
                     new Object[] { "I", "B", "h", // craftingToolHardHammer
                         'I', OrePrefixes.plateDouble.get(aMaterial), 'B', aPlateStack });
 
-                GT_ModHandler.addShapelessCraftingRecipe(
-                    GT_Utility.copyAmount(1, aStack),
+                GTModHandler.addShapelessCraftingRecipe(
+                    GTUtility.copyAmount(1, aStack),
                     DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
                     new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, aPlateStack, aPlateStack,
                         aPlateStack });
             }
         }
 
-        if (GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L) != null) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Block_Powderbarrel.get(4))
+        if (GTOreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L) != null) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Block_Powderbarrel.get(4))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+                    GTOreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
                 .duration(1 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(implosionRecipes);
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_ModHandler.getIC2Item("dynamite", 1, null))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack), GTModHandler.getIC2Item("dynamite", 1, null))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+                    GTOreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
                 .duration(1 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(implosionRecipes);
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack), new ItemStack(Blocks.tnt, 2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack), new ItemStack(Blocks.tnt, 2))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+                    GTOreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
                 .duration(1 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(implosionRecipes);
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_ModHandler.getIC2Item("industrialTnt", 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack), GTModHandler.getIC2Item("industrialTnt", 1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+                    GTOreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
                 .duration(1 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(implosionRecipes);
@@ -322,24 +322,24 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
 
         registerCover(aMaterial, aStack);
 
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
 
         if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
             // Quadruple plate
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L),
-                    GT_Utility.getIntegratedCircuit(4))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L),
+                    GTUtility.getIntegratedCircuit(4))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .duration(Math.max(aMaterialMass * 4L, 1L))
                 .eut(calculateRecipeEU(aMaterial, 96))
                 .addTo(benderRecipes);
         } else {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L),
-                    GT_Utility.getIntegratedCircuit(4))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L),
+                    GTUtility.getIntegratedCircuit(4))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .fluidInputs(Materials.Glue.getFluid(30L))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(8)
@@ -348,14 +348,14 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
         if (!aNoSmashing) {
             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                 Object aPlateStack = OrePrefixes.plate.get(aMaterial);
-                GT_ModHandler.addCraftingRecipe(
-                    GT_Utility.copyAmount(1, aStack),
+                GTModHandler.addCraftingRecipe(
+                    GTUtility.copyAmount(1, aStack),
                     DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
                     new Object[] { "I", "B", "h", // craftingToolHardHammer
                         'I', OrePrefixes.plateTriple.get(aMaterial), 'B', aPlateStack });
 
-                GT_ModHandler.addShapelessCraftingRecipe(
-                    GT_Utility.copyAmount(1, aStack),
+                GTModHandler.addShapelessCraftingRecipe(
+                    GTUtility.copyAmount(1, aStack),
                     DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
                     new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, aPlateStack, aPlateStack,
                         aPlateStack, aPlateStack });
@@ -368,24 +368,24 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
 
         registerCover(aMaterial, aStack);
 
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
 
         if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
             // quintuple plate
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 5L),
-                    GT_Utility.getIntegratedCircuit(5))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 5L),
+                    GTUtility.getIntegratedCircuit(5))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .duration(Math.max(aMaterialMass * 5L, 1L))
                 .eut(calculateRecipeEU(aMaterial, 96))
                 .addTo(benderRecipes);
         } else {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 5L),
-                    GT_Utility.getIntegratedCircuit(5))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 5L),
+                    GTUtility.getIntegratedCircuit(5))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .fluidInputs(Materials.Glue.getFluid(40L))
                 .duration(8 * SECONDS)
                 .eut(8)
@@ -394,14 +394,14 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
         if (!aNoSmashing) {
             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                 Object aPlateStack = OrePrefixes.plate.get(aMaterial);
-                GT_ModHandler.addCraftingRecipe(
-                    GT_Utility.copyAmount(1, aStack),
+                GTModHandler.addCraftingRecipe(
+                    GTUtility.copyAmount(1, aStack),
                     DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
                     new Object[] { "I", "B", "h", // craftingToolHardHammer
                         'I', OrePrefixes.plateQuadruple.get(aMaterial), 'B', aPlateStack });
 
-                GT_ModHandler.addShapelessCraftingRecipe(
-                    GT_Utility.copyAmount(1, aStack),
+                GTModHandler.addShapelessCraftingRecipe(
+                    GTUtility.copyAmount(1, aStack),
                     DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
                     new Object[] { ToolDictNames.craftingToolForgeHammer, aPlateStack, aPlateStack, aPlateStack,
                         aPlateStack, aPlateStack });
@@ -414,15 +414,15 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
 
         registerCover(aMaterial, aStack);
 
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
 
         if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
             // Dense plate
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L),
-                    GT_Utility.getIntegratedCircuit(9))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+                    GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L),
+                    GTUtility.getIntegratedCircuit(9))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .duration(Math.max(aMaterialMass * 9L, 1L))
                 .eut(calculateRecipeEU(aMaterial, 96))
                 .addTo(benderRecipes);
@@ -432,12 +432,12 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
     private void registerItemCasing(final OrePrefixes aPrefix, final Materials aMaterial, final ItemStack aStack,
         final boolean aNoSmashing) {
 
-        GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+        GTModHandler.removeRecipeByOutputDelayed(aStack);
 
         if (aMaterial.mStandardMoltenFluid != null) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Mold_Casing.get(0L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L))
                 .fluidInputs(aMaterial.getMolten(L / 2))
                 .duration(16 * TICKS)
                 .eut(calculateRecipeEU(aMaterial, 8))
@@ -447,45 +447,45 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
         if (aMaterial.mUnificatable && aMaterial.mMaterialInto == aMaterial && !aNoSmashing) {
 
             if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L),
+                GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L),
                     tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
                     new Object[] { "h X", 'X', OrePrefixes.plate.get(aMaterial) });
 
                 // Only added if IC2 Forge Hammer is enabled in Recipes.cfg: B:ic2forgehammer_true=false
-                GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L),
+                GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L),
                     tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
                     new Object[] { "H X", 'H', ToolDictNames.craftingToolForgeHammer, 'X',
                         OrePrefixes.plate.get(aMaterial) });
             }
         }
 
-        if (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
-            GT_Values.RA.stdBuilder()
+        if (GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 2L),
                     ItemList.Shape_Mold_Casing.get(0L))
-                .itemOutputs(GT_Utility.copyAmount(3, aStack))
+                .itemOutputs(GTUtility.copyAmount(3, aStack))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(calculateRecipeEU(aMaterial, 15))
                 .recipeCategory(RecipeCategories.alloySmelterMolding)
                 .addTo(alloySmelterRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
                     ItemList.Shape_Extruder_Casing.get(0L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
                 .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
                 .eut(calculateRecipeEU(aMaterial, 45))
                 .addTo(extruderRecipes);
         }
 
-        if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+        if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
                 .fluidInputs(
                     Materials.Water.getFluid(
                         Math.max(
@@ -497,11 +497,11 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
                 .eut(calculateRecipeEU(aMaterial, 16))
                 .addTo(cutterRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
                 .fluidInputs(
-                    GT_ModHandler.getDistilledWater(
+                    GTModHandler.getDistilledWater(
                         Math.max(
                             3,
                             Math.min(
@@ -511,9 +511,9 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
                 .eut(calculateRecipeEU(aMaterial, 16))
                 .addTo(cutterRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
                 .fluidInputs(
                     Materials.Lubricant.getFluid(
                         Math.max(
@@ -526,43 +526,43 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
                 .eut(calculateRecipeEU(aMaterial, 16))
                 .addTo(cutterRecipes);
         }
-        GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+        GTRecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
     }
 
     private void registerPlateAlloy(final String aOreDictName, final ItemStack aStack) {
 
         switch (aOreDictName) {
             case "plateAlloyCarbon" -> {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_ModHandler.getIC2Item("generator", 1L), GT_Utility.copyAmount(4, aStack))
-                    .itemOutputs(GT_ModHandler.getIC2Item("windMill", 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTModHandler.getIC2Item("generator", 1L), GTUtility.copyAmount(4, aStack))
+                    .itemOutputs(GTModHandler.getIC2Item("windMill", 1L))
                     .duration(5 * MINUTES + 20 * SECONDS)
                     .eut(8)
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), new ItemStack(Blocks.glass, 3, W))
-                    .itemOutputs(GT_ModHandler.getIC2Item("reinforcedGlass", 4L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), new ItemStack(Blocks.glass, 3, W))
+                    .itemOutputs(GTModHandler.getIC2Item("reinforcedGlass", 4L))
                     .duration(20 * SECONDS)
                     .eut(4)
                     .addTo(alloySmelterRecipes);
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), Materials.Glass.getDust(3))
-                    .itemOutputs(GT_ModHandler.getIC2Item("reinforcedGlass", 4L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), Materials.Glass.getDust(3))
+                    .itemOutputs(GTModHandler.getIC2Item("reinforcedGlass", 4L))
                     .duration(20 * SECONDS)
                     .eut(4)
                     .addTo(alloySmelterRecipes);
             }
             case "plateAlloyAdvanced" -> {
                 RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), new ItemStack(Blocks.glass, 3, WILDCARD))
-                    .itemOutputs(GT_ModHandler.getIC2Item("reinforcedGlass", 4L))
+                    .itemInputs(GTUtility.copyAmount(1, aStack), new ItemStack(Blocks.glass, 3, WILDCARD))
+                    .itemOutputs(GTModHandler.getIC2Item("reinforcedGlass", 4L))
                     .duration(20 * SECONDS)
                     .eut(4)
                     .addTo(alloySmelterRecipes);
                 RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), Materials.Glass.getDust(3))
-                    .itemOutputs(GT_ModHandler.getIC2Item("reinforcedGlass", 4L))
+                    .itemInputs(GTUtility.copyAmount(1, aStack), Materials.Glass.getDust(3))
+                    .itemOutputs(GTModHandler.getIC2Item("reinforcedGlass", 4L))
                     .duration(20 * SECONDS)
                     .eut(4)
                     .addTo(alloySmelterRecipes);
@@ -570,7 +570,7 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
             case "plateAlloyIridium" ->
 
                 // Remove IC2 Shaped recipe for Iridium Reinforced Plate
-                GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+                GTModHandler.removeRecipeByOutputDelayed(aStack);
             default -> {}
         }
     }
@@ -582,11 +582,11 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
         // Try different prefixes to use same smooth stones as older GT5U
         for (OrePrefixes orePrefix : new OrePrefixes[] { OrePrefixes.block, OrePrefixes.block_, OrePrefixes.stoneSmooth,
             OrePrefixes.stone }) {
-            if ((tStack = GT_OreDictUnificator.get(orePrefix, aMaterial, 1)) != NI) break;
+            if ((tStack = GTOreDictUnificator.get(orePrefix, aMaterial, 1)) != NI) break;
         }
 
         // Register the cover
-        GregTech_API.registerCover(
+        GregTechAPI.registerCover(
             aStack,
             // If there is an ItemStack of Block for Materials
             tStack == NI ?
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java
index 01262d32f4..40adf386f8 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java
@@ -2,15 +2,15 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingPure implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -23,24 +23,24 @@ public class ProcessingPure implements gregtech.api.interfaces.IOreRecipeRegistr
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L))
             .duration(10)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
             .itemOutputs(
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.dustPure,
                     aMaterial.mMacerateInto,
-                    GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
                     1L),
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.dust,
-                    GT_Utility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+                    GTUtility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
                     1L))
             .outputChances(10000, 1000)
             .duration(20 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java
index 2da9f4b865..902c46bd0b 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java
@@ -4,20 +4,20 @@ import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
 import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.enums.ToolDictNames;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -31,8 +31,8 @@ public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegis
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (aMaterial == Materials.Oilsands) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
                 .itemOutputs(new ItemStack(net.minecraft.init.Blocks.sand, 1, 0))
                 .outputChances(4000)
                 .fluidOutputs(Materials.OilHeavy.getFluid(2000L))
@@ -40,64 +40,64 @@ public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegis
                 .eut(TierEU.RECIPE_LV)
                 .addTo(centrifugeRecipes);
         } else {
-            registerStandardOreRecipes(aPrefix, aMaterial, GT_Utility.copyAmount(1, aStack), 1);
+            registerStandardOreRecipes(aPrefix, aMaterial, GTUtility.copyAmount(1, aStack), 1);
         }
     }
 
     private boolean registerStandardOreRecipes(OrePrefixes aPrefix, Materials aMaterial, ItemStack aOreStack,
         int aMultiplier) {
         if ((aOreStack == null) || (aMaterial == null)) return false;
-        GT_ModHandler
-            .addValuableOre(GT_Utility.getBlockFromStack(aOreStack), aOreStack.getItemDamage(), aMaterial.mOreValue);
+        GTModHandler
+            .addValuableOre(GTUtility.getBlockFromStack(aOreStack), aOreStack.getItemDamage(), aMaterial.mOreValue);
         Materials tMaterial = aMaterial.mOreReplacement;
         Materials tPrimaryByMaterial = null;
         aMultiplier = Math.max(1, aMultiplier);
-        aOreStack = GT_Utility.copyAmount(1, aOreStack);
+        aOreStack = GTUtility.copyAmount(1, aOreStack);
         aOreStack.stackSize = 1;
-        ItemStack tIngot = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
-        ItemStack tGem = GT_OreDictUnificator.get(OrePrefixes.gem, tMaterial, 1L);
+        ItemStack tIngot = GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
+        ItemStack tGem = GTOreDictUnificator.get(OrePrefixes.gem, tMaterial, 1L);
         ItemStack tSmeltInto = tIngot
             == null
                 ? null
                 : aMaterial.contains(SubTag.SMELTING_TO_GEM)
-                    ? GT_OreDictUnificator.get(
+                    ? GTOreDictUnificator.get(
                         OrePrefixes.gem,
                         tMaterial.mDirectSmelting,
-                        GT_OreDictUnificator.get(
+                        GTOreDictUnificator.get(
                             OrePrefixes.crystal,
                             tMaterial.mDirectSmelting,
-                            GT_OreDictUnificator.get(
+                            GTOreDictUnificator.get(
                                 OrePrefixes.gem,
                                 tMaterial,
-                                GT_OreDictUnificator.get(OrePrefixes.crystal, tMaterial, 1L),
+                                GTOreDictUnificator.get(OrePrefixes.crystal, tMaterial, 1L),
                                 1L),
                             1L),
                         1L)
                     : tIngot;
-        ItemStack tDust = GT_OreDictUnificator.get(OrePrefixes.dust, tMaterial, tGem, 1L);
-        ItemStack tCleaned = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, tMaterial, tDust, 1L);
-        ItemStack tCrushed = GT_OreDictUnificator.get(OrePrefixes.crushed, tMaterial, (long) aMaterial.mOreMultiplier);
+        ItemStack tDust = GTOreDictUnificator.get(OrePrefixes.dust, tMaterial, tGem, 1L);
+        ItemStack tCleaned = GTOreDictUnificator.get(OrePrefixes.crushedPurified, tMaterial, tDust, 1L);
+        ItemStack tCrushed = GTOreDictUnificator.get(OrePrefixes.crushed, tMaterial, (long) aMaterial.mOreMultiplier);
         ItemStack tPrimaryByProduct = null;
 
         if (tCrushed == null) {
-            tCrushed = GT_OreDictUnificator.get(
+            tCrushed = GTOreDictUnificator.get(
                 OrePrefixes.dustImpure,
                 tMaterial,
-                GT_Utility.copyAmount(aMaterial.mOreMultiplier, tCleaned, tDust, tGem),
+                GTUtility.copyAmount(aMaterial.mOreMultiplier, tCleaned, tDust, tGem),
                 (long) aMaterial.mOreMultiplier);
         }
 
         for (Materials tMat : aMaterial.mOreByProducts) {
-            GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+            GTOreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
             if (tPrimaryByProduct == null) {
                 tPrimaryByMaterial = tMat;
-                tPrimaryByProduct = GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
-                if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
-                    .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+                tPrimaryByProduct = GTOreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+                if (GTOreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GTOreDictUnificator
+                    .get(OrePrefixes.dustTiny, tMat, GTOreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
             }
-            GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
-            if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
-                .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+            GTOreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+            if (GTOreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GTOreDictUnificator
+                .get(OrePrefixes.dustTiny, tMat, GTOreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
         }
 
         if (tPrimaryByMaterial == null) tPrimaryByMaterial = tMaterial;
@@ -106,32 +106,32 @@ public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegis
 
         if (tSmeltInto != null) {
             if ((aMaterial.mBlastFurnaceRequired) || (aMaterial.mDirectSmelting.mBlastFurnaceRequired)) {
-                GT_ModHandler.removeFurnaceSmelting(aOreStack);
+                GTModHandler.removeFurnaceSmelting(aOreStack);
             } else {
-                tHasSmelting = GT_ModHandler
-                    .addSmeltingRecipe(aOreStack, GT_Utility.copyAmount(aMaterial.mSmeltingMultiplier, tSmeltInto));
+                tHasSmelting = GTModHandler
+                    .addSmeltingRecipe(aOreStack, GTUtility.copyAmount(aMaterial.mSmeltingMultiplier, tSmeltInto));
             }
 
             if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_TRIPLE)) {
                 if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
                         .addTo(blastFurnaceRecipes);
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
@@ -139,24 +139,24 @@ public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegis
                 }
             } else if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_DOUBLE)) {
                 if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
                         .addTo(blastFurnaceRecipes);
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
                             aOreStack,
-                            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+                            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
                         .itemOutputs(
-                            GT_Utility.mul(2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
-                            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+                            GTUtility.mul(2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+                            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
                         .duration(tSmeltInto.stackSize * 25 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .metadata(COIL_HEAT, 1500)
@@ -166,20 +166,20 @@ public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegis
         }
 
         if (!tHasSmelting) {
-            GT_ModHandler.addSmeltingRecipe(
+            GTModHandler.addSmeltingRecipe(
                 aOreStack,
-                GT_OreDictUnificator
+                GTOreDictUnificator
                     .get(OrePrefixes.gem, tMaterial.mDirectSmelting, Math.max(1, aMaterial.mSmeltingMultiplier / 2)));
         }
 
         if (tCrushed != null) {
-            GT_ModHandler.addShapelessCraftingRecipe(
-                GT_Utility.mul(1, tCrushed),
+            GTModHandler.addShapelessCraftingRecipe(
+                GTUtility.mul(1, tCrushed),
                 new Object[] { aOreStack, ToolDictNames.craftingToolHardHammer });
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(aOreStack)
-                .itemOutputs(GT_Utility.copy(GT_Utility.copyAmount(tCrushed.stackSize, tGem), tCrushed))
+                .itemOutputs(GTUtility.copy(GTUtility.copyAmount(tCrushed.stackSize, tGem), tCrushed))
                 .duration(10)
                 .eut(16)
                 .addTo(hammerRecipes);
@@ -187,19 +187,19 @@ public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegis
             int chanceOre2 = tPrimaryByProduct == null ? 0
                 : tPrimaryByProduct.stackSize * 5 * aMaterial.mByProductMultiplier;
             chanceOre2 = 100 * chanceOre2; // converting to the GT format, 100% is 10000
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(aOreStack)
                 .itemOutputs(
-                    GT_Utility.mul(2, tCrushed),
-                    tMaterial.contains(SubTag.PULVERIZING_CINNABAR) ? GT_OreDictUnificator.get(
+                    GTUtility.mul(2, tCrushed),
+                    tMaterial.contains(SubTag.PULVERIZING_CINNABAR) ? GTOreDictUnificator.get(
                         OrePrefixes.crystal,
                         Materials.Cinnabar,
-                        GT_OreDictUnificator
-                            .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
+                        GTOreDictUnificator
+                            .get(OrePrefixes.gem, tPrimaryByMaterial, GTUtility.copyAmount(1, tPrimaryByProduct), 1L),
                         1L)
-                        : GT_OreDictUnificator
-                            .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
-                    GT_OreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
+                        : GTOreDictUnificator
+                            .get(OrePrefixes.gem, tPrimaryByMaterial, GTUtility.copyAmount(1, tPrimaryByProduct), 1L),
+                    GTOreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
                 .outputChances(10000, chanceOre2, 5000)
                 .duration(20 * SECONDS)
                 .eut(2)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java
index bfa580b4c4..92daf2926b 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java
@@ -1,17 +1,17 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingRecycling implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -24,18 +24,18 @@ public class ProcessingRecycling implements gregtech.api.interfaces.IOreRecipeRe
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        if ((aMaterial != Materials.Empty) && (GT_Utility.getFluidForFilledItem(aStack, true) == null)
+        if ((aMaterial != Materials.Empty) && (GTUtility.getFluidForFilledItem(aStack, true) == null)
             && !aMaterial.contains(SubTag.SMELTING_TO_FLUID)
-            && (GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) != null)) {
-            GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+            && (GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) != null)) {
+            GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
             recipeBuilder.itemInputs(aStack);
-            if (GT_Utility.getContainerItem(aStack, true) == null) {
+            if (GTUtility.getContainerItem(aStack, true) == null) {
                 recipeBuilder.itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, aPrefix.mMaterialAmount / 3628800L));
+                    GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, aPrefix.mMaterialAmount / 3628800L));
             } else {
                 recipeBuilder.itemOutputs(
-                    GT_Utility.getContainerItem(aStack, true),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, aPrefix.mMaterialAmount / 3628800L));
+                    GTUtility.getContainerItem(aStack, true),
+                    GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, aPrefix.mMaterialAmount / 3628800L));
             }
             recipeBuilder.duration(((int) Math.max(aMaterial.getMass() / 2L, 1L)) * TICKS)
                 .eut(2)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
index 3548bd437b..f8c5a620b0 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
@@ -3,21 +3,21 @@ package gregtech.loaders.oreprocessing;
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
 import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingRotor implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -30,52 +30,52 @@ public class ProcessingRotor implements gregtech.api.interfaces.IOreRecipeRegist
         ItemStack aStack) {
         if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)
             && !aMaterial.contains(SubTag.NO_WORKING)) {
-            ItemStack tPlate = GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L);
-            ItemStack tRing = GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L);
-            if (GT_Utility.isStackValid(tPlate) && GT_Utility.isStackValid(tRing)) {
+            ItemStack tPlate = GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L);
+            ItemStack tRing = GTOreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L);
+            if (GTUtility.isStackValid(tPlate) && GTUtility.isStackValid(tRing)) {
 
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "PhP", "SRf", "PdP", 'P',
                             aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
                                 : OrePrefixes.plate.get(aMaterial),
                             'R', OrePrefixes.ring.get(aMaterial), 'S', OrePrefixes.screw.get(aMaterial) });
                 }
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(tPlate.copy(), tRing.copy(), GT_Utility.getIntegratedCircuit(4))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(tPlate.copy(), tRing.copy(), GTUtility.getIntegratedCircuit(4))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
                     .fluidInputs(Materials.Tin.getMolten(32))
                     .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
                     .eut(calculateRecipeEU(aMaterial, 24))
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(tPlate.copy(), tRing.copy(), GT_Utility.getIntegratedCircuit(4))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(tPlate.copy(), tRing.copy(), GTUtility.getIntegratedCircuit(4))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
                     .fluidInputs(Materials.Lead.getMolten(48))
                     .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
                     .eut(calculateRecipeEU(aMaterial, 24))
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(tPlate.copy(), tRing.copy(), GT_Utility.getIntegratedCircuit(4))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(tPlate.copy(), tRing.copy(), GTUtility.getIntegratedCircuit(4))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
                     .fluidInputs(Materials.SolderingAlloy.getMolten(16))
                     .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
                     .eut(calculateRecipeEU(aMaterial, 24))
                     .addTo(assemblerRecipes);
             }
 
-            if (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
-                GT_Values.RA.stdBuilder()
+            if (GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 5L),
+                        GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 5L),
                         ItemList.Shape_Extruder_Rotor.get(0L))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
                     .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
                     .eut(calculateRecipeEU(aMaterial, 24))
                     .addTo(extruderRecipes);
@@ -83,9 +83,9 @@ public class ProcessingRotor implements gregtech.api.interfaces.IOreRecipeRegist
             if (aMaterial.mStandardMoltenFluid != null) {
                 if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
 
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(ItemList.Shape_Mold_Rotor.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
                         .fluidInputs(aMaterial.getMolten(612L))
                         .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 24))
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java
index 0eb2cb3dd0..95ca9eb48b 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java
@@ -1,19 +1,19 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.item.ItemStack;
 
 import appeng.core.Api;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingRound implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -25,28 +25,28 @@ public class ProcessingRound implements gregtech.api.interfaces.IOreRecipeRegist
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (!aMaterial.contains(SubTag.NO_WORKING)) {
-            if (GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L) != null) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L))
-                    .itemOutputs(GT_Utility.copyAmount(1, aStack))
+            if (GTOreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L) != null) {
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L))
+                    .itemOutputs(GTUtility.copyAmount(1, aStack))
                     .duration(((int) Math.max(aMaterial.getMass() / 4L, 1L)) * TICKS)
                     .eut(8)
                     .addTo(latheRecipes);
             }
 
             if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)) {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.round, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "fX", "Xh", 'X', OrePrefixes.nugget.get(aMaterial) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 4L),
-                    GT_Proxy.tBits,
+                GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.round, aMaterial, 4L),
+                    GTProxy.tBits,
                     new Object[] { "fXh", 'X', OrePrefixes.ingot.get(aMaterial) });
             }
         }
         Api.INSTANCE.registries()
             .matterCannon()
-            .registerAmmo(GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L), aMaterial.getMass());
+            .registerAmmo(GTOreDictUnificator.get(OrePrefixes.round, aMaterial, 1L), aMaterial.getMass());
     }
 }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java
index b1996d067f..7d9cdc338f 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java
@@ -1,17 +1,17 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingSand implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -23,10 +23,10 @@ public class ProcessingSand implements gregtech.api.interfaces.IOreRecipeRegistr
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (aOreDictName.equals("sandOil")) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Cell_Empty.get(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Cell_Empty.get(1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oil, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oil, 1L),
                     new ItemStack(Blocks.sand, 1, 0))
                 .duration(50 * SECONDS)
                 .eut(5)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java
index f13c2aa9b5..3dc11940e7 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java
@@ -3,17 +3,17 @@ package gregtech.loaders.oreprocessing;
 import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingSaplings implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -24,25 +24,25 @@ public class ProcessingSaplings implements gregtech.api.interfaces.IOreRecipeReg
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(8, aStack))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(8, aStack))
             .itemOutputs(ItemList.IC2_Plantball.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(1, aStack))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(1, aStack))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Wood, 1L))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Wood, 1L))
             .duration(16 * TICKS)
             .eut(8)
             .addTo(latheRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java
index afafe8525d..23dd8ed407 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java
@@ -1,20 +1,20 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingScrew implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -26,19 +26,19 @@ public class ProcessingScrew implements gregtech.api.interfaces.IOreRecipeRegist
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (!aMaterial.contains(SubTag.NO_WORKING)) {
-            if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L))
-                    .itemOutputs(GT_Utility.copyAmount(1, aStack))
+            if (GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L))
+                    .itemOutputs(GTUtility.copyAmount(1, aStack))
                     .duration(((int) Math.max(aMaterial.getMass() / 8L, 1L)) * TICKS)
                     .eut(calculateRecipeEU(aMaterial, 4))
                     .addTo(latheRecipes);
             }
             if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial))
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "fX", "X ", 'X', OrePrefixes.bolt.get(aMaterial) });
                 }
         }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java
index 5493aa9b8e..396cce0c8c 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java
@@ -3,25 +3,25 @@ package gregtech.loaders.oreprocessing;
 import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
 import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.recipe.RecipeCategories;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
 public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegistrator {
@@ -34,7 +34,7 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        if (((aMaterial == Materials.Glass) || (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null))
+        if (((aMaterial == Materials.Glass) || (GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null))
             && (!aMaterial.contains(SubTag.NO_SMELTING))) {
             long aMaterialMass = aMaterial.getMass();
             int tAmount = (int) (aPrefix.mMaterialAmount / 3628800L);
@@ -50,20 +50,20 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                     }
 
                 if (!OrePrefixes.block.isIgnored(aMaterial.mSmeltInto)
-                    && (GT_OreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, 1L) != null)
+                    && (GTOreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, 1L) != null)
                     && aMaterial != Materials.Ichorium) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Extruder_Block.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, tAmount))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(9, aStack), ItemList.Shape_Extruder_Block.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, tAmount))
                         .duration((10 * tAmount) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
 
                     // Allow creation of alloy smelter recipes for material recycling if < IV tier.
                     if (tTrueVoltage < TierEU.IV) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Mold_Block.get(0L))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, tAmount))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(9, aStack), ItemList.Shape_Mold_Block.get(0L))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, tAmount))
                             .duration((5 * tAmount) * TICKS)
                             .eut(calculateRecipeEU(aMaterial, 4 * tVoltageMultiplier))
                             .recipeCategory(RecipeCategories.alloySmelterMolding)
@@ -71,74 +71,74 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                     }
                 }
                 if ((aPrefix != OrePrefixes.ingot || aMaterial != aMaterial.mSmeltInto)
-                    && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Ingot.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, tAmount))
+                    && GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Ingot.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, tAmount))
                         .duration(10 * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 4 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Pipe_Tiny.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial.mSmeltInto, tAmount * 2))
+                if (GTOreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Pipe_Tiny.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial.mSmeltInto, tAmount * 2))
                         .duration((4 * tAmount) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Pipe_Small.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Pipe_Small.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial.mSmeltInto, tAmount))
                         .duration((8 * tAmount) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Shape_Extruder_Pipe_Medium.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(3, aStack), ItemList.Shape_Extruder_Pipe_Medium.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial.mSmeltInto, tAmount))
                         .duration((24 * tAmount) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(6, aStack), ItemList.Shape_Extruder_Pipe_Large.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(6, aStack), ItemList.Shape_Extruder_Pipe_Large.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial.mSmeltInto, tAmount))
                         .duration((48 * tAmount) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(12, aStack), ItemList.Shape_Extruder_Pipe_Huge.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(12, aStack), ItemList.Shape_Extruder_Pipe_Huge.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial.mSmeltInto, tAmount))
                         .duration((96 * tAmount) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Plate.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Plate.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Small_Gear.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Small_Gear.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(6, aStack), ItemList.Shape_Extruder_Turbine_Blade.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(6, aStack), ItemList.Shape_Extruder_Turbine_Blade.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
@@ -146,109 +146,109 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
 
                 if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
                     if (aMaterial.mStandardMoltenFluid != null) {
-                        if (GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Ring.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(36L))
                                 .duration(5 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 4 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Screw.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(18L))
                                 .duration(2 * SECONDS + 10 * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Rod.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(72L))
                                 .duration(7 * SECONDS + 10 * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Bolt.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(18L))
                                 .duration(2 * SECONDS + 10 * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.round, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Round.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.round, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(18L))
                                 .duration(2 * SECONDS + 10 * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Rod_Long.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(144L))
                                 .duration(15 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Turbine_Blade.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(864L))
                                 .duration(20 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Pipe_Tiny.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(72L))
                                 .duration(1 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Pipe_Small.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(144L))
                                 .duration(2 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Pipe_Medium.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(432L))
                                 .duration(4 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Pipe_Large.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(864L))
                                 .duration(8 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                                 .addTo(fluidSolidifierRecipes);
                         }
-                        if (GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
+                        if (GTOreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
                                 .itemInputs(ItemList.Shape_Mold_Pipe_Huge.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L))
                                 .fluidInputs(aMaterial.getMolten(1728L))
                                 .duration(16 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
@@ -258,21 +258,21 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                 }
                 if (tAmount * 2 <= 64 && aMaterial != Materials.Obsidian) {
                     if (!(aMaterial == Materials.Aluminium)) {
-                        if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Rod.get(0L))
+                        if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Rod.get(0L))
                                 .itemOutputs(
-                                    GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, tAmount * 2))
+                                    GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, tAmount * 2))
                                 .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 6 * tVoltageMultiplier))
                                 .addTo(extruderRecipes);
                         }
                     } else {
-                        if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Rod.get(0L))
+                        if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Rod.get(0L))
                                 .itemOutputs(
-                                    GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, tAmount * 2))
+                                    GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, tAmount * 2))
                                 .duration(10 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
                                 .addTo(extruderRecipes);
@@ -280,31 +280,31 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                     }
                 }
                 if (tAmount * 2 <= 64) {
-                    if (GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial.mSmeltInto, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Wire.get(0L))
+                    if (GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial.mSmeltInto, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Wire.get(0L))
                             .itemOutputs(
-                                GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial.mSmeltInto, tAmount * 2))
+                                GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial.mSmeltInto, tAmount * 2))
                             .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                             .eut(calculateRecipeEU(aMaterial, 6 * tVoltageMultiplier))
                             .addTo(extruderRecipes);
                     }
                 }
                 if (tAmount * 8 <= 64) {
-                    if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial.mSmeltInto, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Bolt.get(0L))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial.mSmeltInto, tAmount * 8))
+                    if (GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial.mSmeltInto, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Bolt.get(0L))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial.mSmeltInto, tAmount * 8))
                             .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                             .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                             .addTo(extruderRecipes);
                     }
                 }
                 if (tAmount * 4 <= 64) {
-                    if (GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial.mSmeltInto, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Ring.get(0L))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial.mSmeltInto, tAmount * 4))
+                    if (GTOreDictUnificator.get(OrePrefixes.ring, aMaterial.mSmeltInto, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Ring.get(0L))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ring, aMaterial.mSmeltInto, tAmount * 4))
                             .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                             .eut(calculateRecipeEU(aMaterial, 6 * tVoltageMultiplier))
                             .addTo(extruderRecipes);
@@ -313,86 +313,84 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                         && !aMaterial.contains(SubTag.NO_SMASHING)) {
                         // If material tier < IV then add manual recipe.
                         if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV
-                            && GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L) != null) {
-                            GT_ModHandler.addCraftingRecipe(
-                                GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L),
-                                GT_Proxy.tBits,
+                            && GTOreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L) != null) {
+                            GTModHandler.addCraftingRecipe(
+                                GTOreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L),
+                                GTProxy.tBits,
                                 new Object[] { "h ", "fX", 'X', OrePrefixes.stick.get(aMaterial) });
                         }
                     }
                 }
 
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Sword.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Extruder_Sword.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Shape_Extruder_Pickaxe.get(0L))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(3, aStack), ItemList.Shape_Extruder_Pickaxe.get(0L))
                         .itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial.mSmeltInto, tAmount))
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 3L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Shovel.get(0L))
-                        .itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Shovel.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 1L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Shape_Extruder_Axe.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(3, aStack), ItemList.Shape_Extruder_Axe.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 3L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Hoe.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Extruder_Hoe.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(6, aStack), ItemList.Shape_Extruder_Hammer.get(0L))
-                        .itemOutputs(
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(6, aStack), ItemList.Shape_Extruder_Hammer.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 6L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_File.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Extruder_File.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Saw.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Extruder_Saw.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Shape_Extruder_Gear.get(0L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, tAmount))
+                if (GTOreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(4, aStack), ItemList.Shape_Extruder_Gear.get(0L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, tAmount))
                         .duration(((int) Math.max(aMaterialMass * 5L * tAmount, tAmount)) * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
                         .addTo(extruderRecipes);
@@ -400,10 +398,10 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
 
                 if (!(aMaterial == Materials.StyreneButadieneRubber || aMaterial == Materials.Silicone)) {
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                        if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Plate.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
+                        if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Plate.get(0L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
                                 .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
                                 .recipeCategory(RecipeCategories.alloySmelterMolding)
@@ -413,10 +411,10 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                 } else {
                     // If tier < IV then add ability to turn ingots into plates via alloy smelter.
                     if (tTrueVoltage < TierEU.IV) {
-                        if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Mold_Plate.get(0L))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
+                        if (GTOreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Mold_Plate.get(0L))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
                                 .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
                                 .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
                                 .recipeCategory(RecipeCategories.alloySmelterMolding)
@@ -427,10 +425,10 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
 
                 // If tier < IV then add ability to turn ingots into gears via alloy smelter.
                 if (tTrueVoltage < TierEU.IV) {
-                    if (GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(8, aStack), ItemList.Shape_Mold_Gear.get(0L))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, tAmount))
+                    if (GTOreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(8, aStack), ItemList.Shape_Mold_Gear.get(0L))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, tAmount))
                             .duration(((int) Math.max(aMaterialMass * 10L * tAmount, tAmount)) * TICKS)
                             .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
                             .recipeCategory(RecipeCategories.alloySmelterMolding)
@@ -440,69 +438,69 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
 
                 switch (aMaterial.mSmeltInto.mName) {
                     case "Glass" -> {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Bottle.get(0L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Bottle.get(0L))
                             .itemOutputs(new ItemStack(Items.glass_bottle, 1))
                             .duration((tAmount * 32) * TICKS)
                             .eut(16)
                             .addTo(extruderRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Mold_Bottle.get(0L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Mold_Bottle.get(0L))
                             .itemOutputs(new ItemStack(Items.glass_bottle, 1))
                             .duration((tAmount * 64) * TICKS)
                             .eut(4)
                             .addTo(alloySmelterRecipes);
                     }
                     case "Steel" -> {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
                             .itemOutputs(ItemList.Cell_Empty.get(tAmount))
                             .duration((tAmount * 128) * TICKS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(extruderRecipes);
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingadviron", tAmount * 2))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingadviron", tAmount * 2))
                                 .duration((tAmount * 32) * TICKS)
                                 .eut(3 * tVoltageMultiplier)
                                 .addTo(extruderRecipes);
                         }
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingadviron", tAmount * 3))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingadviron", tAmount * 3))
                                 .duration((tAmount * 128) * TICKS)
                                 .eut(1 * tVoltageMultiplier)
                                 .addTo(alloySmelterRecipes);
                         }
                     }
                     case "Iron", "WroughtIron" -> {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
-                            .itemOutputs(GT_ModHandler.getIC2Item("fuelRod", tAmount))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+                            .itemOutputs(GTModHandler.getIC2Item("fuelRod", tAmount))
                             .duration((tAmount * 128) * TICKS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(extruderRecipes);
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingiron", tAmount * 2))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingiron", tAmount * 2))
                                 .duration((tAmount * 32) * TICKS)
                                 .eut(3 * tVoltageMultiplier)
                                 .addTo(extruderRecipes);
                         }
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingiron", tAmount * 3))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingiron", tAmount * 3))
                                 .duration((tAmount * 128) * TICKS)
                                 .eut(1 * tVoltageMultiplier)
                                 .addTo(alloySmelterRecipes);
                         }
                         if (tAmount * 31 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(31, aStack), ItemList.Shape_Mold_Anvil.get(0L))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(31, aStack), ItemList.Shape_Mold_Anvil.get(0L))
                                 .itemOutputs(new ItemStack(Blocks.anvil, 1, 0))
                                 .duration((tAmount * 512) * TICKS)
                                 .eut(4 * tVoltageMultiplier)
@@ -510,24 +508,24 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                         }
                     }
                     case "Tin" -> {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Extruder_Cell.get(0L))
                             .itemOutputs(ItemList.Cell_Empty.get(tAmount))
                             .duration((tAmount * 128) * TICKS)
                             .eut(TierEU.RECIPE_LV)
                             .addTo(extruderRecipes);
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingtin", tAmount * 2))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingtin", tAmount * 2))
                                 .duration((tAmount * 32) * TICKS)
                                 .eut(3 * tVoltageMultiplier)
                                 .addTo(extruderRecipes);
                         }
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingtin", tAmount * 3))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingtin", tAmount * 3))
                                 .duration((tAmount * 128) * TICKS)
                                 .eut(1 * tVoltageMultiplier)
                                 .addTo(alloySmelterRecipes);
@@ -535,17 +533,17 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                     }
                     case "Lead" -> {
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casinglead", tAmount * 2))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casinglead", tAmount * 2))
                                 .duration((tAmount * 32) * TICKS)
                                 .eut(3 * tVoltageMultiplier)
                                 .addTo(extruderRecipes);
                         }
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casinglead", tAmount * 3))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casinglead", tAmount * 3))
                                 .duration((tAmount * 128) * TICKS)
                                 .eut(1 * tVoltageMultiplier)
                                 .addTo(alloySmelterRecipes);
@@ -553,17 +551,17 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                     }
                     case "Copper", "AnnealedCopper" -> {
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingcopper", tAmount * 2))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingcopper", tAmount * 2))
                                 .duration((tAmount * 32) * TICKS)
                                 .eut(3 * tVoltageMultiplier)
                                 .addTo(extruderRecipes);
                         }
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingcopper", tAmount * 3))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingcopper", tAmount * 3))
                                 .duration((tAmount * 128) * TICKS)
                                 .eut(1 * tVoltageMultiplier)
                                 .addTo(alloySmelterRecipes);
@@ -571,17 +569,17 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                     }
                     case "Bronze" -> {
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingbronze", tAmount * 2))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingbronze", tAmount * 2))
                                 .duration((tAmount * 32) * TICKS)
                                 .eut(3 * tVoltageMultiplier)
                                 .addTo(extruderRecipes);
                         }
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casingbronze", tAmount * 3))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casingbronze", tAmount * 3))
                                 .duration((tAmount * 128) * TICKS)
                                 .eut(1 * tVoltageMultiplier)
                                 .addTo(alloySmelterRecipes);
@@ -589,25 +587,25 @@ public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegi
                     }
                     case "Gold" -> {
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casinggold", tAmount * 2))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casinggold", tAmount * 2))
                                 .duration((tAmount * 32) * TICKS)
                                 .eut(3 * tVoltageMultiplier)
                                 .addTo(extruderRecipes);
                         }
                         if (tAmount * 2 <= 64) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
-                                .itemOutputs(GT_ModHandler.getIC2Item("casinggold", tAmount * 3))
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+                                .itemOutputs(GTModHandler.getIC2Item("casinggold", tAmount * 3))
                                 .duration((tAmount * 128) * TICKS)
                                 .eut(1 * tVoltageMultiplier)
                                 .addTo(alloySmelterRecipes);
                         }
                     }
                     case "Polytetrafluoroethylene" -> {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
                             .itemOutputs(ItemList.Cell_Empty.get(tAmount * 4))
                             .duration((tAmount * 128) * TICKS)
                             .eut(TierEU.RECIPE_LV)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java
index 35947755d3..d4f7ed4f7e 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java
@@ -2,15 +2,15 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingSlab implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -23,8 +23,8 @@ public class ProcessingSlab implements gregtech.api.interfaces.IOreRecipeRegistr
         ItemStack aStack) {
         if (aOreDictName.startsWith("slabWood")) {
             if (Railcraft.isModLoaded()) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(3, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(3, aStack))
                     .itemOutputs(ItemList.RC_Tie_Wood.get(3L))
                     .fluidInputs(Materials.Creosote.getFluid(300L))
                     .duration(10 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java
index e5aac7bfe7..d04ffd1190 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java
@@ -4,21 +4,21 @@ import static gregtech.api.recipe.RecipeMaps.benderRecipes;
 import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingStick implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -30,33 +30,33 @@ public class ProcessingStick implements gregtech.api.interfaces.IOreRecipeRegist
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-            GT_ModHandler.addCraftingRecipe(
-                GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L),
-                GT_ModHandler.RecipeBits.BUFFERED,
+            GTModHandler.addCraftingRecipe(
+                GTOreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L),
+                GTModHandler.RecipeBits.BUFFERED,
                 new Object[] { " s ", "fPx", 'P', OrePrefixes.stick.get(aMaterial) });
         }
         if (!aMaterial.contains(gregtech.api.enums.SubTag.NO_WORKING)) {
 
-            if ((aMaterial.contains(SubTag.CRYSTAL) ? GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)
-                : GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L)) != null
-                && GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial.mMacerateInto, 1L) != null) {
-                GT_Values.RA.stdBuilder()
+            if ((aMaterial.contains(SubTag.CRYSTAL) ? GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)
+                : GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L)) != null
+                && GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial.mMacerateInto, 1L) != null) {
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        aMaterial.contains(SubTag.CRYSTAL) ? GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)
-                            : GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
+                        aMaterial.contains(SubTag.CRYSTAL) ? GTOreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)
+                            : GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial.mMacerateInto, 2L))
+                        GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustSmall, aMaterial.mMacerateInto, 2L))
                     .duration(((int) Math.max(aMaterial.getMass() * 5L, 1L)) * TICKS)
                     .eut(calculateRecipeEU(aMaterial, 16))
                     .addTo(latheRecipes);
             }
 
-            if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
+            if (GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
                     .fluidInputs(
                         Materials.Water.getFluid(
                             Math.max(
@@ -70,11 +70,11 @@ public class ProcessingStick implements gregtech.api.interfaces.IOreRecipeRegist
                     .eut(calculateRecipeEU(aMaterial, 4))
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
                     .fluidInputs(
-                        GT_ModHandler.getDistilledWater(
+                        GTModHandler.getDistilledWater(
                             Math.max(
                                 3,
                                 Math.min(
@@ -86,9 +86,9 @@ public class ProcessingStick implements gregtech.api.interfaces.IOreRecipeRegist
                     .eut(calculateRecipeEU(aMaterial, 4))
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
                     .fluidInputs(
                         Materials.Lubricant.getFluid(
                             Math.max(
@@ -104,13 +104,13 @@ public class ProcessingStick implements gregtech.api.interfaces.IOreRecipeRegist
 
             if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)) {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L),
+                        GTProxy.tBits,
                         new Object[] { "s", "X", 'X', OrePrefixes.stickLong.get(aMaterial) });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "f ", " X", 'X', OrePrefixes.ingot.get(aMaterial) });
                 }
             }
@@ -118,20 +118,20 @@ public class ProcessingStick implements gregtech.api.interfaces.IOreRecipeRegist
         if (!aMaterial.contains(gregtech.api.enums.SubTag.NO_SMASHING)) {
             // bender recipe
             {
-                if (GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 2L))
+                if (GTOreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 2L))
                         .duration(5 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, 8))
                         .addTo(benderRecipes);
                 }
             }
 
-            if (GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(2, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L))
+            if (GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null) {
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(2, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L))
                     .duration(Math.max(aMaterial.getMass(), 1L))
                     .eut(calculateRecipeEU(aMaterial, 16))
                     .addTo(hammerRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java
index 1f00300264..02253bb5a3 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java
@@ -2,21 +2,21 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.benderRecipes;
 import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -28,17 +28,17 @@ public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRe
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-            GT_ModHandler.addCraftingRecipe(
-                GT_OreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L),
-                GT_ModHandler.RecipeBits.BUFFERED,
+            GTModHandler.addCraftingRecipe(
+                GTOreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L),
+                GTModHandler.RecipeBits.BUFFERED,
                 new Object[] { " s ", "fSx", " S ", 'S', OrePrefixes.stickLong.get(aMaterial) });
         }
         if (!aMaterial.contains(SubTag.NO_WORKING)) {
 
-            if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
+            if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null) {
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
                     .fluidInputs(
                         Materials.Water.getFluid(
                             Math.max(
@@ -51,11 +51,11 @@ public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRe
                     .eut(calculateRecipeEU(aMaterial, 4))
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
                     .fluidInputs(
-                        GT_ModHandler.getDistilledWater(
+                        GTModHandler.getDistilledWater(
                             Math.max(
                                 3,
                                 Math.min(
@@ -66,9 +66,9 @@ public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRe
                     .eut(calculateRecipeEU(aMaterial, 4))
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
                     .fluidInputs(
                         Materials.Lubricant.getFluid(
                             Math.max(
@@ -84,13 +84,13 @@ public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRe
 
             if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "sf", "G ", 'G', OrePrefixes.gemFlawless.get(aMaterial) });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 2L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 2L),
+                        GTProxy.tBits,
                         new Object[] { "sf", "G ", 'G', OrePrefixes.gemExquisite.get(aMaterial) });
                 }
             }
@@ -98,10 +98,10 @@ public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRe
         if (!aMaterial.contains(SubTag.NO_SMASHING)) {
             // Bender recipes
             {
-                if (GT_OreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L))
+                if (GTOreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, 16))
                         .addTo(benderRecipes);
@@ -110,9 +110,9 @@ public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRe
 
             if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial))
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "ShS", 'S', OrePrefixes.stick.get(aMaterial) });
                 }
         }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java
index 840f49b4dd..da21829d0c 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java
@@ -3,21 +3,21 @@ package gregtech.loaders.oreprocessing;
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
 import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.block.Block;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
 import gregtech.api.interfaces.IOreRecipeRegistrator;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingStone implements IOreRecipeRegistrator {
 
@@ -28,11 +28,11 @@ public class ProcessingStone implements IOreRecipeRegistrator {
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        Block aBlock = GT_Utility.getBlockFromStack(aStack);
+        Block aBlock = GTUtility.getBlockFromStack(aStack);
         switch (aMaterial.mName) {
             case "NULL":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.redstone_torch, 2))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(3, aStack), new ItemStack(Blocks.redstone_torch, 2))
                     .itemOutputs(new ItemStack(Items.repeater, 1))
                     .fluidInputs(Materials.Redstone.getMolten(144L))
                     .duration(5 * SECONDS)
@@ -40,38 +40,38 @@ public class ProcessingStone implements IOreRecipeRegistrator {
                     .addTo(assemblerRecipes);
                 break;
             case "Sand":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(new ItemStack(Blocks.sand, 1, 0))
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Endstone":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Endstone, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tungstate, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, Materials.Endstone, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tungstate, 1L))
                     .outputChances(10000, 500)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Netherrack":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Netherrack, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, Materials.Netherrack, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 1L))
                     .outputChances(10000, 500)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "NetherBrick":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(new ItemStack(Blocks.nether_brick_fence, 1))
                     .duration(5 * SECONDS)
                     .eut(4)
@@ -81,54 +81,54 @@ public class ProcessingStone implements IOreRecipeRegistrator {
                 if (aBlock != Blocks.air) aBlock.setResistance(20.0F);
                 break;
             case "Concrete":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 200 * 30 / 320))))
                     .duration(10 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                    .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 200 * 30 / 426))))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                    .fluidInputs(GTModHandler.getDistilledWater(Math.max(3, Math.min(750, 200 * 30 / 426))))
                     .duration(10 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 100 * 30 / 1280))))
                     .duration(5 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Rhyolite":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumFeldspar, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartz, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumFeldspar, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quartz, 1L))
                     .outputChances(10000, 2000)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Komatiite":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Biotite, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.Biotite, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1L))
                     .outputChances(10000, 500)
                     .duration(20 * SECONDS)
                     .eut(2)
@@ -136,44 +136,44 @@ public class ProcessingStone implements IOreRecipeRegistrator {
                 break;
             case "Dacite":
             case "Andesite":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 1L))
                     .outputChances(10000, 2000)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Gabbro":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumFeldspar, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrite, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumFeldspar, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.Pyrite, 1L))
                     .outputChances(10000, 2000)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Eclogite":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Rutile, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Rutile, 1L))
                     .outputChances(10000, 1000)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Soapstone":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Talc, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Chromite, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, Materials.Talc, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Chromite, 1L))
                     .outputChances(10000, 1000)
                     .duration(20 * SECONDS)
                     .eut(2)
@@ -181,11 +181,11 @@ public class ProcessingStone implements IOreRecipeRegistrator {
                 break;
             case "Greenschist":
             case "Blueschist":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Glauconite, 2L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Basalt, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Glauconite, 2L),
+                        GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Basalt, 1L))
                     .outputChances(10000, 1000)
                     .duration(20 * SECONDS)
                     .eut(2)
@@ -193,11 +193,11 @@ public class ProcessingStone implements IOreRecipeRegistrator {
                 break;
             case "Gneiss":
             case "Migmatite":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.GraniteBlack, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, Materials.GraniteBlack, 1L))
                     .outputChances(10000, 5000)
                     .duration(20 * SECONDS)
                     .eut(2)
@@ -205,69 +205,69 @@ public class ProcessingStone implements IOreRecipeRegistrator {
                 break;
             case "Redrock":
             case "Marble":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                    .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                    .fluidInputs(GTModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
                     .duration(10 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
             case "Basalt":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                    .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                    .fluidInputs(GTModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(3))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
                     .duration(10 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
             case "Quartzite":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
                     .outputChances(10000, 1000)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "Flint":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 2L),
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 2L),
                         new ItemStack(Items.flint, 1))
                     .outputChances(10000, 5000)
                     .duration(20 * SECONDS)
@@ -275,70 +275,70 @@ public class ProcessingStone implements IOreRecipeRegistrator {
                     .addTo(maceratorRecipes);
                 break;
             case "GraniteBlack":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                    .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                    .fluidInputs(GTModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
                     .duration(10 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 1L))
                     .outputChances(10000, 100)
                     .duration(20 * SECONDS)
                     .eut(2)
                     .addTo(maceratorRecipes);
                 break;
             case "GraniteRed":
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
-                    .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                    .fluidInputs(GTModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
                     .duration(20 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
-                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
+                    .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
                     .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
                     .duration(10 * SECONDS)
                     .eut(TierEU.RECIPE_LV)
                     .addTo(cutterRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_Utility.copyAmount(1, aStack))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTUtility.copyAmount(1, aStack))
                     .itemOutputs(
-                        GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
-                        GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Uranium, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
+                        GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Uranium, 1L))
                     .outputChances(10000, 100)
                     .duration(20 * SECONDS)
                     .eut(2)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java
index fb9431e8e4..f764ebd4a8 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java
@@ -1,15 +1,15 @@
 package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingStoneCobble implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -20,8 +20,8 @@ public class ProcessingStoneCobble implements gregtech.api.interfaces.IOreRecipe
     @Override
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(8, aStack), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(new ItemStack(Blocks.furnace, 1))
             .duration(20 * SECONDS)
             .eut(4)
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java
index db3175279d..888c6221af 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java
@@ -4,25 +4,25 @@ import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
 import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
 import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.enums.ToolDictNames;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
-import gregtech.common.items.GT_MetaGenerated_Tool_01;
-import gregtech.common.items.ID_MetaTool_01;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
+import gregtech.common.items.IDMetaTool01;
+import gregtech.common.items.MetaGeneratedTool01;
 
 public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeRegistrator { // TODO COMPARE WITH OLD TOOL
                                                                                            // HEAD??? generator
@@ -58,460 +58,460 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
             || aMaterial.contains(SubTag.SOFT);
         switch (aPrefix) {
             case toolHeadAxe -> {
-                GT_ModHandler.addShapelessCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.AXE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                GTModHandler.addShapelessCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.AXE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                     new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(2))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(2))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE
-                                .getToolWithStats(ID_MetaTool_01.AXE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
+                            MetaGeneratedTool01.INSTANCE
+                                .getToolWithStats(IDMetaTool01.AXE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
                         .duration(10 * SECONDS)
                         .eut(TierEU.RECIPE_MV)
                         .addTo(assemblerRecipes);
                 }
-                if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "PIh", "P  ", "f  ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                         OrePrefixes.ingot.get(aMaterial) });
-                if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "GG ", "G  ", "f  ", 'G', OrePrefixes.gem.get(aMaterial) });
             }
             case toolHeadBuzzSaw -> {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 100000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 75000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 50000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 400000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 300000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 200000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1600000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1200000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.BUZZSAW_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.BUZZSAW_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 800000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Sodium.get(1L) });
-                if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadBuzzSaw, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aSpecialRecipeReq2) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadBuzzSaw, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "wXh", "X X", "fXx", 'X', OrePrefixes.plate.get(aMaterial) });
             }
             case toolHeadChainsaw -> {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 100000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 75000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 50000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 400000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 300000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 200000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1600000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1200000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.CHAINSAW_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.CHAINSAW_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 800000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Sodium.get(1L) });
-                if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadChainsaw, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aSpecialRecipeReq2) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadChainsaw, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "SRS", "XhX", "SRS", 'X', OrePrefixes.plate.get(aMaterial), 'S',
                         OrePrefixes.plate.get(Materials.Steel), 'R', OrePrefixes.ring.get(Materials.Steel) });
             }
             case toolHeadDrill -> {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 100_000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 75_000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 50_000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 400_000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 300_000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 200_000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1_600_000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1_200_000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.DRILL_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.DRILL_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 800_000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.JACKHAMMER.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.JACKHAMMER.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1_600_000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "PRP", "MPB", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Piston_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'R',
                         OrePrefixes.spring.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.JACKHAMMER.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.JACKHAMMER.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1_200_000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "PRP", "MPB", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Piston_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'R',
                         OrePrefixes.spring.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.JACKHAMMER.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.JACKHAMMER.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 800_000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "PRP", "MPB", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Piston_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'R',
                         OrePrefixes.spring.get(Materials.StainlessSteel), 'B', ItemList.Battery_RE_HV_Sodium.get(1L) });
                 if (aSpecialRecipeReq2) {
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "XSX", "XSX", "ShS", 'X', OrePrefixes.plate.get(aMaterial), 'S',
                             OrePrefixes.plate.get(Materials.Steel) });
                     if (aMaterial.mStandardMoltenFluid != null) {
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(ItemList.Shape_Mold_ToolHeadDrill.get(0))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L))
                             .fluidInputs(aMaterial.getMolten(144 * 4))
                             .duration(5 * SECONDS)
                             .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                             .addTo(fluidSolidifierRecipes);
                     }
-                    if (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
+                    if (GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+                        GTValues.RA.stdBuilder()
                             .itemInputs(
-                                GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 4L),
+                                GTOreDictUnificator.get(OrePrefixes.ingot, aMaterial, 4L),
                                 ItemList.Shape_Extruder_ToolHeadDrill.get(0))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L))
                             .duration(5 * SECONDS)
                             .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                             .addTo(extruderRecipes);
@@ -520,40 +520,36 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
             }
             case toolHeadFile -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(ID_MetaTool_01.FILE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(IDMetaTool01.FILE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
 
                     if ((!aMaterial.contains(SubTag.NO_SMASHING)) && (!aMaterial.contains(SubTag.BOUNCY))) {
                         if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                            GT_ModHandler.addCraftingRecipe(
-                                GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                    ID_MetaTool_01.FILE.ID,
+                            GTModHandler.addCraftingRecipe(
+                                MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                                    IDMetaTool01.FILE.ID,
                                     1,
                                     aMaterial,
                                     aMaterial.mHandleMaterial,
                                     null),
-                                GT_ModHandler.RecipeBits.MIRRORED | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                                    | GT_ModHandler.RecipeBits.BUFFERED,
+                                GTModHandler.RecipeBits.MIRRORED | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                                    | GTModHandler.RecipeBits.BUFFERED,
                                 new Object[] { "P", "P", "S", 'P', OrePrefixes.plate.get(aMaterial), 'S',
                                     OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
                         }
                     }
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(15))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(15))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                ID_MetaTool_01.FILE.ID,
-                                1,
-                                aMaterial,
-                                aMaterial.mHandleMaterial,
-                                null))
+                            MetaGeneratedTool01.INSTANCE
+                                .getToolWithStats(IDMetaTool01.FILE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
@@ -561,62 +557,62 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
             }
             case toolHeadHoe -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(ID_MetaTool_01.HOE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(IDMetaTool01.HOE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(16))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(16))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE
-                                .getToolWithStats(ID_MetaTool_01.HOE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
+                            MetaGeneratedTool01.INSTANCE
+                                .getToolWithStats(IDMetaTool01.HOE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
                 }
-                if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "PIh", "f  ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                         OrePrefixes.ingot.get(aMaterial) });
-                if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "GG ", "f  ", "   ", 'G', OrePrefixes.gem.get(aMaterial) });
             }
             case toolHeadPickaxe -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(ID_MetaTool_01.PICKAXE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(IDMetaTool01.PICKAXE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
 
-                    if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "PII", "f h", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                             OrePrefixes.ingot.get(aMaterial) });
 
-                    if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "GGG", "f  ", 'G', OrePrefixes.gem.get(aMaterial) });
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(5))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(5))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                ID_MetaTool_01.PICKAXE.ID,
+                            MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                                IDMetaTool01.PICKAXE.ID,
                                 1,
                                 aMaterial,
                                 aMaterial.mHandleMaterial,
@@ -629,34 +625,30 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
             case toolHeadPlow -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(ID_MetaTool_01.PLOW.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(IDMetaTool01.PLOW.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
 
-                    if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "PP", "PP", "hf", 'P', OrePrefixes.plate.get(aMaterial) });
 
-                    if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "GG", "GG", " f", 'G', OrePrefixes.gem.get(aMaterial) });
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(6))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(6))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                ID_MetaTool_01.PLOW.ID,
-                                1,
-                                aMaterial,
-                                aMaterial.mHandleMaterial,
-                                null))
+                            MetaGeneratedTool01.INSTANCE
+                                .getToolWithStats(IDMetaTool01.PLOW.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
@@ -665,31 +657,31 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
             case toolHeadSaw -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(ID_MetaTool_01.SAW.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(IDMetaTool01.SAW.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
 
-                    if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "PP ", "fh ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                             OrePrefixes.ingot.get(aMaterial) });
 
-                    if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "GGf", 'G', OrePrefixes.gem.get(aMaterial) });
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(7))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(7))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE
-                                .getToolWithStats(ID_MetaTool_01.SAW.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
+                            MetaGeneratedTool01.INSTANCE
+                                .getToolWithStats(IDMetaTool01.SAW.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
@@ -698,54 +690,50 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
             case toolHeadSense -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(ID_MetaTool_01.SENSE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(IDMetaTool01.SENSE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
 
-                    if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "PPI", "hf ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                             OrePrefixes.ingot.get(aMaterial) });
 
-                    if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "GGG", " f ", "   ", 'G', OrePrefixes.gem.get(aMaterial) });
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(8))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(8))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                ID_MetaTool_01.SENSE.ID,
-                                1,
-                                aMaterial,
-                                aMaterial.mHandleMaterial,
-                                null))
+                            MetaGeneratedTool01.INSTANCE
+                                .getToolWithStats(IDMetaTool01.SENSE.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
                 }
             }
             case toolHeadShovel -> {
-                GT_ModHandler.addShapelessCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.SHOVEL.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                GTModHandler.addShapelessCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.SHOVEL.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                     new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(9))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(9))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                ID_MetaTool_01.SHOVEL.ID,
+                            MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                                IDMetaTool01.SHOVEL.ID,
                                 1,
                                 aMaterial,
                                 aMaterial.mHandleMaterial,
@@ -754,70 +742,66 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
                 }
-                if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "fPh", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                         OrePrefixes.ingot.get(aMaterial) });
-                if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "fG", 'G', OrePrefixes.gem.get(aMaterial) });
             }
             case toolHeadSword -> {
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
 
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(ID_MetaTool_01.SWORD.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(IDMetaTool01.SWORD.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
 
-                    if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { " P ", "fPh", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                             OrePrefixes.ingot.get(aMaterial) });
 
-                    if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    if (!aNoWorking) GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { " G", "fG", 'G', OrePrefixes.gem.get(aMaterial) });
                 }
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(10))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(10))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                ID_MetaTool_01.SWORD.ID,
-                                1,
-                                aMaterial,
-                                aMaterial.mHandleMaterial,
-                                null))
+                            MetaGeneratedTool01.INSTANCE
+                                .getToolWithStats(IDMetaTool01.SWORD.ID, 1, aMaterial, aMaterial.mHandleMaterial, null))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
                 }
             }
             case toolHeadUniversalSpade -> {
-                GT_ModHandler.addShapelessCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.UNIVERSALSPADE.ID, 1, aMaterial, aMaterial, null),
+                GTModHandler.addShapelessCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.UNIVERSALSPADE.ID, 1, aMaterial, aMaterial, null),
                     new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial), OrePrefixes.screw.get(aMaterial),
                         ToolDictNames.craftingToolScrewdriver });
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null
-                    && GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null
+                    && GTOreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadUniversalSpade, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(11))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadUniversalSpade, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(11))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                ID_MetaTool_01.UNIVERSALSPADE.ID,
+                            MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                                IDMetaTool01.UNIVERSALSPADE.ID,
                                 1,
                                 aMaterial,
                                 aMaterial.mHandleMaterial,
@@ -826,268 +810,268 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
                         .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
                         .addTo(assemblerRecipes);
                 }
-                if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadUniversalSpade, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aSpecialRecipeReq2) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadUniversalSpade, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "fX", 'X', OrePrefixes.toolHeadShovel.get(aMaterial) });
             }
             case toolHeadWrench -> {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 100000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 75000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 50000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 400000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 300000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 200000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
                         'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1600000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1200000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.WRENCH_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.WRENCH_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 800000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
                         OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 100000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_LV.get(1L), 'S', OrePrefixes.screw.get(Materials.Steel), 'P',
                         OrePrefixes.plate.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'B',
                         ItemList.Battery_RE_LV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 75000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_LV.get(1L), 'S', OrePrefixes.screw.get(Materials.Steel), 'P',
                         OrePrefixes.plate.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'B',
                         ItemList.Battery_RE_LV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_LV.ID,
                         1,
                         aMaterial,
                         Materials.Steel,
                         new long[] { 50000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_LV.get(1L), 'S', OrePrefixes.screw.get(Materials.Steel), 'P',
                         OrePrefixes.plate.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'B',
                         ItemList.Battery_RE_LV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 400000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_MV.get(1L), 'S', OrePrefixes.screw.get(Materials.Aluminium), 'P',
                         OrePrefixes.plate.get(Materials.Aluminium), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 300000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_MV.get(1L), 'S', OrePrefixes.screw.get(Materials.Aluminium), 'P',
                         OrePrefixes.plate.get(Materials.Aluminium), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
                         ItemList.Battery_RE_MV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_MV.ID,
                         1,
                         aMaterial,
                         Materials.Aluminium,
                         new long[] { 200000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_MV.get(1L), 'S', OrePrefixes.screw.get(Materials.Aluminium), 'P',
                         OrePrefixes.plate.get(Materials.Aluminium), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B', ItemList.Battery_RE_MV_Sodium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1600000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 1200000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Cadmium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SCREWDRIVER_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SCREWDRIVER_HV.ID,
                         1,
                         aMaterial,
                         Materials.StainlessSteel,
                         new long[] { 800000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
-                        | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+                        | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
                         ItemList.Electric_Motor_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
                         OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
                         OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
                         ItemList.Battery_RE_HV_Sodium.get(1L) });
-                if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadWrench, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aSpecialRecipeReq2) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadWrench, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "hXW", "XRX", "WXd", 'X', OrePrefixes.plate.get(aMaterial), 'S',
                         OrePrefixes.plate.get(Materials.Steel), 'R', OrePrefixes.ring.get(Materials.Steel), 'W',
                         OrePrefixes.screw.get(Materials.Steel) });
             }
             case toolHeadHammer, toolHeadMallet -> {
-                if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
-                            GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial, 1L),
-                            GT_Utility.getIntegratedCircuit(14))
+                            GTOreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+                            GTOreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial, 1L),
+                            GTUtility.getIntegratedCircuit(14))
                         .itemOutputs(
-                            GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                                aProducesSoftMallet ? ID_MetaTool_01.SOFTMALLET.ID : ID_MetaTool_01.HARDHAMMER.ID,
+                            MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                                aProducesSoftMallet ? IDMetaTool01.SOFTMALLET.ID : IDMetaTool01.HARDHAMMER.ID,
                                 1,
                                 aMaterial,
                                 aMaterial.mHandleMaterial,
@@ -1097,84 +1081,84 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
                         .addTo(assemblerRecipes);
                 }
                 if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)) {
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                            aProducesSoftMallet ? ID_MetaTool_01.SOFTMALLET.ID : ID_MetaTool_01.HARDHAMMER.ID,
+                    GTModHandler.addShapelessCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                            aProducesSoftMallet ? IDMetaTool01.SOFTMALLET.ID : IDMetaTool01.HARDHAMMER.ID,
                             1,
                             aMaterial,
                             aMaterial.mHandleMaterial,
                             null),
-                        GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                        GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                            aProducesSoftMallet ? ID_MetaTool_01.SOFTMALLET.ID : ID_MetaTool_01.HARDHAMMER.ID,
+                    GTModHandler.addCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                            aProducesSoftMallet ? IDMetaTool01.SOFTMALLET.ID : IDMetaTool01.HARDHAMMER.ID,
                             1,
                             aMaterial,
                             aMaterial.mHandleMaterial,
                             null),
-                        GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                        GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "XX ", "XXS", "XX ", 'X',
                             aMaterial == Materials.Wood ? OrePrefixes.plank.get(Materials.Wood)
                                 : OrePrefixes.ingot.get(aMaterial),
                             'S', OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                            aProducesSoftMallet ? ID_MetaTool_01.SOFTMALLET.ID : ID_MetaTool_01.HARDHAMMER.ID,
+                    GTModHandler.addCraftingRecipe(
+                        MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                            aProducesSoftMallet ? IDMetaTool01.SOFTMALLET.ID : IDMetaTool01.HARDHAMMER.ID,
                             1,
                             aMaterial,
                             aMaterial.mHandleMaterial,
                             null),
-                        GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                        GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                         new Object[] { "XX ", "XXS", "XX ", 'X',
                             aMaterial == Materials.Wood ? OrePrefixes.plank.get(Materials.Wood)
                                 : OrePrefixes.gem.get(aMaterial),
                             'S', OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
                 }
-                if (aPrefix == OrePrefixes.toolHeadHammer) if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
-                    GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial, 1L),
-                    GT_Proxy.tBits,
+                if (aPrefix == OrePrefixes.toolHeadHammer) if (aSpecialRecipeReq1) GTModHandler.addCraftingRecipe(
+                    GTOreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial, 1L),
+                    GTProxy.tBits,
                     new Object[] { "II ", "IIh", "II ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
                         OrePrefixes.ingot.get(aMaterial) });
             }
             case turbineBlade -> {
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 4L),
-                        GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Magnalium, 1L))
-                    .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(170, 1, aMaterial, aMaterial, null))
+                        GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 4L),
+                        GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Magnalium, 1L))
+                    .itemOutputs(MetaGeneratedTool01.INSTANCE.getToolWithStats(170, 1, aMaterial, aMaterial, null))
                     .duration(8 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 100))
                     .addTo(assemblerRecipes);
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 8L),
-                        GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Titanium, 1L))
-                    .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(172, 1, aMaterial, aMaterial, null))
+                        GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 8L),
+                        GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Titanium, 1L))
+                    .itemOutputs(MetaGeneratedTool01.INSTANCE.getToolWithStats(172, 1, aMaterial, aMaterial, null))
                     .duration(16 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 400))
                     .addTo(assemblerRecipes);
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 12L),
-                        GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 1L))
-                    .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(174, 1, aMaterial, aMaterial, null))
+                        GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 12L),
+                        GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 1L))
+                    .itemOutputs(MetaGeneratedTool01.INSTANCE.getToolWithStats(174, 1, aMaterial, aMaterial, null))
                     .duration(32 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 1600))
                     .addTo(assemblerRecipes);
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 16L),
-                        GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Americium, 1L))
-                    .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(176, 1, aMaterial, aMaterial, null))
+                        GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 16L),
+                        GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Americium, 1L))
+                    .itemOutputs(MetaGeneratedTool01.INSTANCE.getToolWithStats(176, 1, aMaterial, aMaterial, null))
                     .duration(1 * MINUTES + 4 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 6400))
                     .addTo(assemblerRecipes);
                 if (aSpecialRecipeReq2) {
                     if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
-                        GT_ModHandler.addCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L),
-                            GT_Proxy.tBits,
+                        GTModHandler.addCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L),
+                            GTProxy.tBits,
                             new Object[] { "fPd", "SPS", " P ", 'P',
                                 aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
                                     : OrePrefixes.plateDouble.get(aMaterial),
@@ -1182,13 +1166,13 @@ public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeReg
                     }
 
                     // Turbine blades
-                    if (GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null
-                        && GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
+                    if (GTOreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null
+                        && GTOreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
+                        GTValues.RA.stdBuilder()
                             .itemInputs(
-                                GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 3L),
-                                GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 2L))
-                            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L))
+                                GTOreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 3L),
+                                GTOreDictUnificator.get(OrePrefixes.screw, aMaterial, 2L))
+                            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L))
                             .duration(10 * SECONDS)
                             .eut(calculateRecipeEU(aMaterial, 60))
                             .addTo(formingPressRecipes);
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java
index cbb0ca3668..04aac52d4f 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java
@@ -8,9 +8,9 @@ import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.common.items.GT_MetaGenerated_Tool_01;
-import gregtech.common.items.ID_MetaTool_01;
+import gregtech.api.util.GTModHandler;
+import gregtech.common.items.IDMetaTool01;
+import gregtech.common.items.MetaGeneratedTool01;
 
 public class ProcessingToolOther implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -28,10 +28,10 @@ public class ProcessingToolOther implements gregtech.api.interfaces.IOreRecipeRe
         if (aMaterial != Materials.Rubber) {
             // Crafting recipes
             {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.PLUNGER.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.PLUNGER.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "xRR", " SR", "S f", 'S', OrePrefixes.stick.get(aMaterial), 'R',
                         OrePrefixes.plate.get(Materials.AnyRubber) });
             }
@@ -41,89 +41,87 @@ public class ProcessingToolOther implements gregtech.api.interfaces.IOreRecipeRe
             && (!aMaterial.contains(SubTag.NO_SMASHING))) {
             // Crafting recipes
             {
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.WRENCH.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.WRENCH.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "IhI", "III", " I ", 'I', OrePrefixes.ingot.get(aMaterial) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.CROWBAR.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.CROWBAR.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "hDS", "DSD", "SDf", 'S', OrePrefixes.stick.get(aMaterial), 'D', Dyes.dyeBlue });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.SCREWDRIVER.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.SCREWDRIVER.ID, 1, aMaterial, aMaterial.mHandleMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { " fS", " Sh", "W  ", 'S', OrePrefixes.stick.get(aMaterial), 'W',
                         OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.WIRECUTTER.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.WIRECUTTER.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PfP", "hPd", "STS", 'S', OrePrefixes.stick.get(aMaterial), 'P',
                         OrePrefixes.plate.get(aMaterial), 'T', OrePrefixes.screw.get(aMaterial) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.SCOOP.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(IDMetaTool01.SCOOP.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "SWS", "SSS", "xSh", 'S', OrePrefixes.stick.get(aMaterial), 'W',
                         new ItemStack(Blocks.wool, 1, 32767) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.BRANCHCUTTER.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.BRANCHCUTTER.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PfP", "PdP", "STS", 'S', OrePrefixes.stick.get(aMaterial), 'P',
                         OrePrefixes.plate.get(aMaterial), 'T', OrePrefixes.screw.get(aMaterial) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.KNIFE.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(IDMetaTool01.KNIFE.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "fPh", " S ", 'S', OrePrefixes.stick.get(aMaterial), 'P',
                         OrePrefixes.plate.get(aMaterial) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.BUTCHERYKNIFE.ID, 1, aMaterial, aMaterial, null),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.BUTCHERYKNIFE.ID, 1, aMaterial, aMaterial, null),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "PPf", "PP ", "Sh ", 'S', OrePrefixes.stick.get(aMaterial), 'P',
                         OrePrefixes.plate.get(aMaterial) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SOLDERING_IRON_LV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SOLDERING_IRON_LV.ID,
                         1,
                         aMaterial,
                         Materials.Rubber,
                         new long[] { 100000L, 32L, 1L, -1L }),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "LBf", "Sd ", "P  ", 'B', OrePrefixes.bolt.get(aMaterial), 'P',
                         OrePrefixes.plate.get(Materials.AnyRubber), 'S', OrePrefixes.stick.get(Materials.Iron), 'L',
                         ItemList.Battery_RE_LV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SOLDERING_IRON_MV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SOLDERING_IRON_MV.ID,
                         1,
                         aMaterial,
                         Materials.Rubber,
                         new long[] { 400000L, 128L, 2L, -1L }),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "LBf", "Sd ", "P  ", 'B', OrePrefixes.bolt.get(aMaterial), 'P',
                         OrePrefixes.plate.get(Materials.AnyRubber), 'S', OrePrefixes.stick.get(Materials.Steel), 'L',
                         ItemList.Battery_RE_MV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
-                        ID_MetaTool_01.SOLDERING_IRON_HV.ID,
+                GTModHandler.addCraftingRecipe(
+                    MetaGeneratedTool01.INSTANCE.getToolWithStats(
+                        IDMetaTool01.SOLDERING_IRON_HV.ID,
                         1,
                         aMaterial,
                         Materials.AnySyntheticRubber,
                         new long[] { 1600000L, 512L, 3L, -1L }),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "LBf", "Sd ", "P  ", 'B', OrePrefixes.bolt.get(aMaterial), 'P',
                         OrePrefixes.plate.get(Materials.AnySyntheticRubber), 'S',
                         OrePrefixes.stick.get(Materials.StainlessSteel), 'L', ItemList.Battery_RE_HV_Lithium.get(1L) });
-                GT_ModHandler.addCraftingRecipe(
-                    (GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolWithStats(ID_MetaTool_01.POCKET_MULTITOOL.ID, 1, aMaterial, aMaterial, null)),
-                    GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+                GTModHandler.addCraftingRecipe(
+                    (MetaGeneratedTool01.INSTANCE
+                        .getToolWithStats(IDMetaTool01.POCKET_MULTITOOL.ID, 1, aMaterial, aMaterial, null)),
+                    GTModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GTModHandler.RecipeBits.BUFFERED,
                     new Object[] { "ABC", "DEF", "CFG", 'A', OrePrefixes.stickLong.get(aMaterial), 'B',
                         OrePrefixes.toolHeadSaw.get(aMaterial), 'C', OrePrefixes.ring.get(aMaterial), 'D',
                         OrePrefixes.toolHeadFile.get(aMaterial), 'E', OrePrefixes.plate.get(aMaterial), 'F',
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java
index 4e3febc469..8d72819d26 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java
@@ -2,18 +2,18 @@ package gregtech.loaders.oreprocessing;
 
 import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
 import static gregtech.api.recipe.RecipeMaps.polarizerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
 import gregtech.api.interfaces.IOreRecipeRegistrator;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingTransforming implements IOreRecipeRegistrator {
 
@@ -35,13 +35,13 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
             case "Wood" ->
             // Chemical bath recipes
             {
-                if (GT_OreDictUnificator.get(aPrefix, Materials.WoodSealed, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.WoodSealed, 1L))
+                if (GTOreDictUnificator.get(aPrefix, Materials.WoodSealed, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.WoodSealed, 1L))
                         .fluidInputs(
                             Materials.SeedOil
-                                .getFluid(GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 120L, true)))
+                                .getFluid(GTUtility.translateMaterialToAmount(aPrefix.mMaterialAmount, 120L, true)))
                         .duration(5 * SECONDS)
                         .eut(TierEU.ULV)
                         .addTo(chemicalBathRecipes);
@@ -51,13 +51,13 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
             case "Iron" -> {
                 // Chemical bath recipes
                 {
-                    if (GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
+                    if (GTOreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
                             .fluidInputs(
-                                Materials.FierySteel.getFluid(
-                                    GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 250L, true)))
+                                Materials.FierySteel
+                                    .getFluid(GTUtility.translateMaterialToAmount(aPrefix.mMaterialAmount, 250L, true)))
                             .duration(5 * SECONDS)
                             .eut(TierEU.ULV)
                             .addTo(chemicalBathRecipes);
@@ -66,11 +66,11 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
 
                 // Polarizer recipes
                 {
-                    if (GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L))
-                            .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+                    if (GTOreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L))
+                            .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GTValues.M)) * TICKS)
                             .eut((int) TierEU.LV / 2)
                             .addTo(polarizerRecipes);
                     }
@@ -79,13 +79,13 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
             case "WroughtIron" -> {
                 // Chemical bath recipes
                 {
-                    if (GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
+                    if (GTOreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
                             .fluidInputs(
-                                Materials.FierySteel.getFluid(
-                                    GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 225L, true)))
+                                Materials.FierySteel
+                                    .getFluid(GTUtility.translateMaterialToAmount(aPrefix.mMaterialAmount, 225L, true)))
                             .duration(5 * SECONDS)
                             .eut(TierEU.ULV)
                             .addTo(chemicalBathRecipes);
@@ -94,11 +94,11 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
 
                 // Polarizer recipes
                 {
-                    if (GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L))
-                            .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+                    if (GTOreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L))
+                            .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GTValues.M)) * TICKS)
                             .eut((int) TierEU.LV / 2)
                             .addTo(polarizerRecipes);
                     }
@@ -107,13 +107,13 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
             case "Steel" -> {
                 // Chemical Bath recipes
                 {
-                    if (GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
+                    if (GTOreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
                             .fluidInputs(
-                                Materials.FierySteel.getFluid(
-                                    GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 200L, true)))
+                                Materials.FierySteel
+                                    .getFluid(GTUtility.translateMaterialToAmount(aPrefix.mMaterialAmount, 200L, true)))
                             .duration(5 * SECONDS)
                             .eut(TierEU.ULV)
                             .addTo(chemicalBathRecipes);
@@ -122,11 +122,11 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
 
                 // Polarizer recipes
                 {
-                    if (GT_OreDictUnificator.get(aPrefix, Materials.SteelMagnetic, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(1, aStack))
-                            .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.SteelMagnetic, 1L))
-                            .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+                    if (GTOreDictUnificator.get(aPrefix, Materials.SteelMagnetic, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(1, aStack))
+                            .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.SteelMagnetic, 1L))
+                            .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GTValues.M)) * TICKS)
                             .eut((int) TierEU.LV / 2)
                             .addTo(polarizerRecipes);
                     }
@@ -135,11 +135,11 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
             case "Neodymium" ->
             // Polarizer recipes
             {
-                if (GT_OreDictUnificator.get(aPrefix, Materials.NeodymiumMagnetic, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.NeodymiumMagnetic, 1L))
-                        .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+                if (GTOreDictUnificator.get(aPrefix, Materials.NeodymiumMagnetic, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.NeodymiumMagnetic, 1L))
+                        .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GTValues.M)) * TICKS)
                         .eut((int) TierEU.HV / 2)
                         .addTo(polarizerRecipes);
                 }
@@ -147,11 +147,11 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
             case "Samarium" ->
             // Polarizer recipes
             {
-                if (GT_OreDictUnificator.get(aPrefix, Materials.SamariumMagnetic, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.SamariumMagnetic, 1L))
-                        .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+                if (GTOreDictUnificator.get(aPrefix, Materials.SamariumMagnetic, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.SamariumMagnetic, 1L))
+                        .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GTValues.M)) * TICKS)
                         .eut((int) TierEU.IV / 2)
                         .addTo(polarizerRecipes);
                 }
@@ -160,11 +160,11 @@ public class ProcessingTransforming implements IOreRecipeRegistrator {
             case "TengamPurified" ->
             // Polarizer recipes
             {
-                if (GT_OreDictUnificator.get(aPrefix, Materials.TengamAttuned, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(1, aStack))
-                        .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.TengamAttuned, 1L))
-                        .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+                if (GTOreDictUnificator.get(aPrefix, Materials.TengamAttuned, 1L) != null) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(1, aStack))
+                        .itemOutputs(GTOreDictUnificator.get(aPrefix, Materials.TengamAttuned, 1L))
+                        .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GTValues.M)) * TICKS)
                         .eut((int) TierEU.RECIPE_UHV)
                         .addTo(polarizerRecipes);
                 }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java
index 7635546d23..41f5511754 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java
@@ -1,15 +1,15 @@
 package gregtech.loaders.oreprocessing;
 
-import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTRecipeConstants;
+import gregtech.api.util.GTUtility;
 
 public class ProcessingWax implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -21,11 +21,11 @@ public class ProcessingWax implements gregtech.api.interfaces.IOreRecipeRegistra
     public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
         ItemStack aStack) {
         if (aOreDictName.equals("waxMagical")) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(1, aStack))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(1, aStack))
                 .metadata(FUEL_VALUE, 6)
                 .metadata(FUEL_TYPE, 5)
-                .addTo(GT_RecipeConstants.Fuel);
+                .addTo(GTRecipeConstants.Fuel);
         }
     }
 }
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java
index 1f5bd5f1c2..c38c8fb72b 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java
@@ -6,9 +6,9 @@ import static gregtech.api.recipe.RecipeMaps.benderRecipes;
 import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
 import static gregtech.api.recipe.RecipeMaps.unpackagerRecipes;
 import static gregtech.api.recipe.RecipeMaps.wiremillRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTUtility.calculateRecipeEU;
 
 import java.util.ArrayList;
 
@@ -16,16 +16,16 @@ import net.minecraft.item.ItemStack;
 
 import appeng.api.config.TunnelType;
 import appeng.core.Api;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.GT_Proxy;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.GTProxy;
 
 public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistrator {
 
@@ -64,10 +64,10 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (!aMaterial.contains(SubTag.NO_SMASHING)) {
                     // Bender recipes
                     {
-                        if (GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 2L))
+                        if (GTOreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 2L))
                                 .duration(5 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8))
                                 .addTo(benderRecipes);
@@ -76,10 +76,10 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
 
                     // Wiremill Recipes
                     {
-                        if (GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) {
-                            GT_Values.RA.stdBuilder()
-                                .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
-                                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 4L))
+                        if (GTOreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) {
+                            GTValues.RA.stdBuilder()
+                                .itemInputs(GTUtility.copyAmount(1, aStack), GTUtility.getIntegratedCircuit(1))
+                                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 4L))
                                 .duration(10 * SECONDS)
                                 .eut(calculateRecipeEU(aMaterial, 8))
                                 .addTo(wiremillRecipes);
@@ -91,42 +91,42 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
                     && !aMaterial.contains(SubTag.NO_WORKING)
                     && (aMaterial.getProcessingMaterialTierEU() < TierEU.IV)) {
-                    GT_ModHandler.addCraftingRecipe(
-                        GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L),
-                        GT_Proxy.tBits,
+                    GTModHandler.addCraftingRecipe(
+                        GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L),
+                        GTProxy.tBits,
                         new Object[] { "Xx", 'X', OrePrefixes.plate.get(aMaterial) });
 
                 }
 
                 // Assembler recipes
                 {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(2, aStack), GTUtility.getIntegratedCircuit(2))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
                         .duration(7 * SECONDS + 10 * TICKS)
                         .eut(calculateRecipeEU(aMaterial, 8))
                         .addTo(assemblerRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(4, aStack), GT_Utility.getIntegratedCircuit(4))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(4, aStack), GTUtility.getIntegratedCircuit(4))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
                         .duration(10 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, 8))
                         .addTo(assemblerRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(8, aStack), GTUtility.getIntegratedCircuit(8))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L))
                         .duration(15 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, 8))
                         .addTo(assemblerRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(12, aStack), GT_Utility.getIntegratedCircuit(12))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(12, aStack), GTUtility.getIntegratedCircuit(12))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L))
                         .duration(20 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, 8))
                         .addTo(assemblerRecipes);
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(GT_Utility.copyAmount(16, aStack), GT_Utility.getIntegratedCircuit(16))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L))
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(GTUtility.copyAmount(16, aStack), GTUtility.getIntegratedCircuit(16))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L))
                         .duration(25 * SECONDS)
                         .eut(calculateRecipeEU(aMaterial, 8))
                         .addTo(assemblerRecipes);
@@ -138,12 +138,12 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                     // Shapeless crafting recipes
                     {
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 2L),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 2L),
                             new Object[] { aOreDictName });
 
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial) });
                     }
                 }
@@ -154,15 +154,15 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                     // Shapeless crafting recipes
                     {
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 4L),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 4L),
                             new Object[] { aOreDictName });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
                                 OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial) });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt02.get(aMaterial), OrePrefixes.wireGt02.get(aMaterial) });
                     }
                 }
@@ -173,17 +173,17 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                     // Shapeless crafting recipes
                     {
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 8L),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 8L),
                             new Object[] { aOreDictName });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
                                 OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
                                 OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
                                 OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial) });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt04.get(aMaterial), OrePrefixes.wireGt04.get(aMaterial) });
                     }
                 }
@@ -194,11 +194,11 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                     // Shapeless crafting recipes
                     {
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 12L),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 12L),
                             new Object[] { aOreDictName });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt08.get(aMaterial), OrePrefixes.wireGt04.get(aMaterial) });
                     }
                 }
@@ -209,14 +209,14 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
                     // Shapeless crafting recipes
                     {
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 16L),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 16L),
                             new Object[] { aOreDictName });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt08.get(aMaterial), OrePrefixes.wireGt08.get(aMaterial) });
-                        GT_ModHandler.addShapelessCraftingRecipe(
-                            GT_Utility.copyAmount(1, aStack),
+                        GTModHandler.addShapelessCraftingRecipe(
+                            GTUtility.copyAmount(1, aStack),
                             new Object[] { OrePrefixes.wireGt12.get(aMaterial), OrePrefixes.wireGt04.get(aMaterial) });
                     }
 
@@ -224,7 +224,7 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
             }
             default -> {
-                GT_Log.err.println(
+                GTLog.err.println(
                     "OrePrefix " + aPrefix.name() + " cannot be registered as a cable for Material " + aMaterial.mName);
                 return;
             }
@@ -241,72 +241,72 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 }
 
                 // shapeless crafting
-                if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
-                    GT_ModHandler.addShapelessCraftingRecipe(
-                        GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L),
+                if (GTOreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+                    GTModHandler.addShapelessCraftingRecipe(
+                        GTOreDictUnificator.get(correspondingCable, aMaterial, 1L),
                         craftingListRubber.toArray());
                 }
 
                 // Packer recipe
-                if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
-                    GT_Values.RA.stdBuilder()
+                if (GTOreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_Utility.copyAmount(1, aStack),
-                            GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.Rubber), costMultiplier))
-                        .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                            GTUtility.copyAmount(1, aStack),
+                            GTOreDictUnificator.get(OrePrefixes.plate.get(Materials.Rubber), costMultiplier))
+                        .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                         .duration(5 * SECONDS)
                         .eut(8)
                         .addTo(packagerRecipes);
                 }
                 // alloy smelter recipes
                 {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 2L),
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cableGt01, aMaterial, 1L))
+                            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 2L),
+                            GTOreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cableGt01, aMaterial, 1L))
                         .duration(5 * SECONDS)
                         .eut(8)
                         .addTo(alloySmelterRecipes);
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 2L),
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cableGt02, aMaterial, 1L))
+                            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 2L),
+                            GTOreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cableGt02, aMaterial, 1L))
                         .duration(10 * SECONDS)
                         .eut(16)
                         .addTo(alloySmelterRecipes);
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(
-                            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 4L),
-                            GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
-                        .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cableGt04, aMaterial, 1L))
+                            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 4L),
+                            GTOreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
+                        .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cableGt04, aMaterial, 1L))
                         .duration(15 * SECONDS)
                         .eut(TierEU.RECIPE_LV)
                         .addTo(alloySmelterRecipes);
                 }
                 // Assembler recipes
                 {
-                    if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                    if (GTOreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(aStack, GTUtility.getIntegratedCircuit(24))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                             .fluidInputs(Materials.Rubber.getMolten(144L * costMultiplier))
                             .duration(5 * SECONDS)
                             .eut(8)
                             .addTo(assemblerRecipes);
 
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(aStack, GTUtility.getIntegratedCircuit(24))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                             .fluidInputs(Materials.StyreneButadieneRubber.getMolten(108L * costMultiplier))
                             .duration(5 * SECONDS)
                             .eut(8)
                             .addTo(assemblerRecipes);
 
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(aStack, GTUtility.getIntegratedCircuit(24))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                             .fluidInputs(Materials.Silicone.getMolten(72L * costMultiplier))
                             .duration(5 * SECONDS)
                             .eut(8)
@@ -315,17 +315,17 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                         for (Materials dielectric : dielectrics) {
                             for (Materials syntheticRubber : syntheticRubbers) {
 
-                                GT_Values.RA.stdBuilder()
-                                    .itemInputs(GT_Utility.copyAmount(4, aStack), dielectric.getDust(costMultiplier))
-                                    .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+                                GTValues.RA.stdBuilder()
+                                    .itemInputs(GTUtility.copyAmount(4, aStack), dielectric.getDust(costMultiplier))
+                                    .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 4L))
                                     .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
                                     .duration(20 * SECONDS)
                                     .eut(8)
                                     .addTo(assemblerRecipes);
 
-                                GT_Values.RA.stdBuilder()
+                                GTValues.RA.stdBuilder()
                                     .itemInputs(aStack, dielectric.getDustSmall(costMultiplier))
-                                    .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                                    .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                                     .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
                                     .duration(5 * SECONDS)
                                     .eut(8)
@@ -337,29 +337,29 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
             }
             case "Iron", "Nickel", "Cupronickel", "Copper", "AnnealedCopper", "Kanthal", "Gold", "Electrum", "Silver", "Nichrome", "Steel", "BlackSteel", "Titanium", "Aluminium", "BlueAlloy", "NetherStar", "RedstoneAlloy" -> {
 
-                if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) == null) {
+                if (GTOreDictUnificator.get(correspondingCable, aMaterial, 1L) == null) {
                     break;
                 }
                 // Assembler recipes
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
-                    .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(aStack, GTUtility.getIntegratedCircuit(24))
+                    .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                     .fluidInputs(Materials.Rubber.getMolten(144 * costMultiplier))
                     .duration(5 * SECONDS)
                     .eut(8)
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
-                    .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(aStack, GTUtility.getIntegratedCircuit(24))
+                    .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                     .fluidInputs(Materials.StyreneButadieneRubber.getMolten(108 * costMultiplier))
                     .duration(5 * SECONDS)
                     .eut(8)
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
-                    .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(aStack, GTUtility.getIntegratedCircuit(24))
+                    .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                     .fluidInputs(Materials.Silicone.getMolten(72 * costMultiplier))
                     .duration(5 * SECONDS)
                     .eut(8)
@@ -368,17 +368,17 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 for (Materials dielectric : dielectrics) {
                     for (Materials syntheticRubber : syntheticRubbers) {
 
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(GT_Utility.copyAmount(4, aStack), dielectric.getDust(costMultiplier))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(GTUtility.copyAmount(4, aStack), dielectric.getDust(costMultiplier))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 4L))
                             .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
                             .duration(20 * SECONDS)
                             .eut(8)
                             .addTo(assemblerRecipes);
 
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(aStack, dielectric.getDustSmall(costMultiplier))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                             .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
                             .duration(5 * SECONDS)
                             .eut(8)
@@ -388,28 +388,28 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
             }
 
             default -> {
-                if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) == null) {
+                if (GTOreDictUnificator.get(correspondingCable, aMaterial, 1L) == null) {
                     break;
                 }
 
                 // Assembler recipes
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         aStack,
-                        GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier),
-                        GT_Utility.getIntegratedCircuit(24))
-                    .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier),
+                        GTUtility.getIntegratedCircuit(24))
+                    .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                     .fluidInputs(Materials.Silicone.getMolten(costMultiplier * 72))
                     .duration(5 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 8))
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         aStack,
-                        GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyphenyleneSulfide, costMultiplier),
-                        GT_Utility.getIntegratedCircuit(24))
-                    .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                        GTOreDictUnificator.get(OrePrefixes.foil, Materials.PolyphenyleneSulfide, costMultiplier),
+                        GTUtility.getIntegratedCircuit(24))
+                    .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                     .fluidInputs(Materials.Silicone.getMolten(costMultiplier * 72))
                     .duration(5 * SECONDS)
                     .eut(calculateRecipeEU(aMaterial, 8))
@@ -418,44 +418,44 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
                 for (Materials dielectric : dielectrics) {
                     for (Materials syntheticRubber : syntheticRubbers) {
 
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(
-                                GT_Utility.copyAmount(4, aStack),
+                                GTUtility.copyAmount(4, aStack),
                                 dielectric.getDust(costMultiplier),
-                                GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier * 4L))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+                                GTOreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier * 4L))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 4L))
                             .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
                             .duration(20 * SECONDS)
                             .eut(calculateRecipeEU(aMaterial, 8))
                             .addTo(assemblerRecipes);
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(
-                                GT_Utility.copyAmount(4, aStack),
+                                GTUtility.copyAmount(4, aStack),
                                 dielectric.getDust(costMultiplier),
-                                GT_OreDictUnificator
+                                GTOreDictUnificator
                                     .get(OrePrefixes.foil, Materials.PolyphenyleneSulfide, costMultiplier * 4L))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 4L))
                             .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
                             .duration(20 * SECONDS)
                             .eut(calculateRecipeEU(aMaterial, 8))
                             .addTo(assemblerRecipes);
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(
                                 aStack,
                                 dielectric.getDustSmall(costMultiplier),
-                                GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                                GTOreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                             .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
                             .duration(5 * SECONDS)
                             .eut(calculateRecipeEU(aMaterial, 8))
                             .addTo(assemblerRecipes);
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(
                                 aStack,
                                 dielectric.getDustSmall(costMultiplier),
-                                GT_OreDictUnificator
+                                GTOreDictUnificator
                                     .get(OrePrefixes.foil, Materials.PolyphenyleneSulfide, costMultiplier))
-                            .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                            .itemOutputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
                             .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
                             .duration(5 * SECONDS)
                             .eut(calculateRecipeEU(aMaterial, 8))
@@ -465,16 +465,16 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
             }
         }
 
-        if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
-                .itemOutputs(GT_Utility.copyAmount(1, aStack))
+        if (GTOreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L))
+                .itemOutputs(GTUtility.copyAmount(1, aStack))
                 .duration(5 * SECONDS)
                 .eut(calculateRecipeEU(aMaterial, 8))
                 .addTo(unpackagerRecipes);
         }
 
-        if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+        if (GTOreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
             AE2AddNetAttunementCable(aStack, correspondingCable, aMaterial);
         }
     }
@@ -500,7 +500,7 @@ public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistr
             .addNewAttunement(aStack, (TunnelType) tt);
         Api.INSTANCE.registries()
             .p2pTunnel()
-            .addNewAttunement(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L), (TunnelType) tt);
+            .addNewAttunement(GTOreDictUnificator.get(correspondingCable, aMaterial, 1L), (TunnelType) tt);
     }
     // end region
 }
diff --git a/src/main/java/gregtech/loaders/postload/BlockResistanceLoader.java b/src/main/java/gregtech/loaders/postload/BlockResistanceLoader.java
new file mode 100644
index 0000000000..264cd9e6b9
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/BlockResistanceLoader.java
@@ -0,0 +1,43 @@
+package gregtech.loaders.postload;
+
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemAxe;
+import net.minecraft.item.ItemPickaxe;
+
+import gregtech.api.util.GTUtility;
+
+public class BlockResistanceLoader implements Runnable {
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void run() {
+        Blocks.stone.setResistance(10.0F);
+        Blocks.cobblestone.setResistance(10.0F);
+        Blocks.stonebrick.setResistance(10.0F);
+        Blocks.brick_block.setResistance(20.0F);
+        Blocks.hardened_clay.setResistance(15.0F);
+        Blocks.stained_hardened_clay.setResistance(15.0F);
+
+        Blocks.bed.setHarvestLevel("axe", 0);
+        Blocks.hay_block.setHarvestLevel("axe", 0);
+        Blocks.tnt.setHarvestLevel("pickaxe", 0);
+        Blocks.sponge.setHarvestLevel("axe", 0);
+        Blocks.monster_egg.setHarvestLevel("pickaxe", 0);
+
+        GTUtility.callMethod(Material.tnt, "func_85158_p", true, false, false);
+        GTUtility.callMethod(Material.tnt, "setAdventureModeExempt", true, false, false);
+
+        Set tSet = (Set) GTUtility.getFieldContent(ItemAxe.class, "field_150917_c", true, true);
+        tSet.add(Blocks.bed);
+        tSet.add(Blocks.hay_block);
+        tSet.add(Blocks.sponge);
+
+        tSet = (Set) GTUtility.getFieldContent(ItemPickaxe.class, "field_150915_c", true, true);
+        tSet.add(Blocks.monster_egg);
+        tSet.add(Blocks.tnt);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/BookAndLootLoader.java b/src/main/java/gregtech/loaders/postload/BookAndLootLoader.java
new file mode 100644
index 0000000000..e227d7f21a
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/BookAndLootLoader.java
@@ -0,0 +1,337 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomChestContent;
+import net.minecraftforge.common.ChestGenHooks;
+
+import gregtech.GTMod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTOreDictUnificator;
+
+public class BookAndLootLoader implements Runnable {
+
+    @Override
+    public void run() {
+        GTLog.out.println("GTMod: Adding worldgenerated Chest Content.");
+        if (GTMod.gregtechproxy.mIncreaseDungeonLoot) {
+            ChestGenHooks tChest = ChestGenHooks.getInfo("bonusChest");
+            tChest.setMax(tChest.getMax() + 8);
+            tChest.setMin(tChest.getMin() + 4);
+            tChest = ChestGenHooks.getInfo("dungeonChest");
+            tChest.setMax(tChest.getMax() + 6);
+            tChest.setMin(tChest.getMin() + 3);
+            tChest = ChestGenHooks.getInfo("pyramidDesertyChest");
+            tChest.setMax(tChest.getMax() + 8);
+            tChest.setMin(tChest.getMin() + 4);
+            tChest = ChestGenHooks.getInfo("pyramidJungleChest");
+            tChest.setMax(tChest.getMax() + 16);
+            tChest.setMin(tChest.getMin() + 8);
+            tChest = ChestGenHooks.getInfo("pyramidJungleDispenser");
+            tChest.setMax(tChest.getMax() + 2);
+            tChest.setMin(tChest.getMin() + 1);
+            tChest = ChestGenHooks.getInfo("mineshaftCorridor");
+            tChest.setMax(tChest.getMax() + 4);
+            tChest.setMin(tChest.getMin() + 2);
+            tChest = ChestGenHooks.getInfo("villageBlacksmith");
+            tChest.setMax(tChest.getMax() + 12);
+            tChest.setMin(tChest.getMin() + 6);
+            tChest = ChestGenHooks.getInfo("strongholdCrossing");
+            tChest.setMax(tChest.getMax() + 8);
+            tChest.setMin(tChest.getMin() + 4);
+            tChest = ChestGenHooks.getInfo("strongholdCorridor");
+            tChest.setMax(tChest.getMax() + 6);
+            tChest.setMin(tChest.getMin() + 3);
+            tChest = ChestGenHooks.getInfo("strongholdLibrary");
+            tChest.setMax(tChest.getMax() + 16);
+            tChest.setMin(tChest.getMin() + 8);
+        }
+        ChestGenHooks
+            .addItem("bonusChest", new WeightedRandomChestContent(ItemList.Bottle_Purple_Drink.get(1L), 8, 16, 2));
+
+        ChestGenHooks
+            .addItem("dungeonChest", new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 20));
+        ChestGenHooks
+            .addItem("dungeonChest", new WeightedRandomChestContent(ItemList.Bottle_Purple_Drink.get(1L), 8, 16, 80));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
+                1,
+                6,
+                120));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Lead, 1L), 1, 6, 30));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L), 1, 6, 60));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L), 1, 6, 60));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Manganese, 1L),
+                1,
+                6,
+                60));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.DamascusSteel, 1L),
+                1,
+                6,
+                10));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L), 1, 6, 20));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 1, 6, 20));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 1, 6, 20));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+                1,
+                6,
+                20));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 1, 6, 20));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
+                1,
+                6,
+                40));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+                1,
+                6,
+                40));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neodymium, 1L),
+                1,
+                6,
+                40));
+        ChestGenHooks.addItem(
+            "dungeonChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L), 1, 3, 40));
+
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 2));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
+                4,
+                16,
+                12));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Platinum, 1L),
+                2,
+                8,
+                4));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 2, 8, 2));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 2, 8, 2));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+                2,
+                8,
+                2));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 2, 8, 2));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L), 2, 8, 4));
+        ChestGenHooks.addItem(
+            "pyramidDesertyChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+                2,
+                8,
+                4));
+
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(ItemList.Coin_Gold_Ancient.get(1L), 16, 64, 10));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(ItemList.ZPM.getWithCharge(1L, 2147483647), 1, 1, 1));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
+                4,
+                16,
+                12));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 2, 8, 2));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 2, 8, 2));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+                2,
+                8,
+                2));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 2, 8, 2));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L), 2, 8, 4));
+        ChestGenHooks.addItem(
+            "pyramidJungleChest",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+                2,
+                8,
+                4));
+
+        ChestGenHooks.addItem(
+            "pyramidJungleDispenser",
+            new WeightedRandomChestContent(new ItemStack(Items.fire_charge, 1), 2, 8, 30));
+
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L), 1, 4, 12));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Lead, 1L), 1, 4, 3));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L), 1, 4, 6));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L), 1, 4, 6));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 1, 4, 2));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+                1,
+                4,
+                2));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 1, 4, 2));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L), 1, 4, 4));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+                1,
+                4,
+                4));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 1, 4, 2));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L), 1, 4, 2));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.DamascusSteel, 1L),
+                1,
+                4,
+                1));
+        ChestGenHooks.addItem(
+            "mineshaftCorridor",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.DamascusSteel, 1L),
+                1,
+                4,
+                1));
+
+        ChestGenHooks
+            .addItem("villageBlacksmith", new WeightedRandomChestContent(ItemList.McGuffium_239.get(1L), 1, 1, 1));
+        ChestGenHooks.addItem(
+            "villageBlacksmith",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L), 1, 4, 6));
+        ChestGenHooks.addItem(
+            "villageBlacksmith",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neodymium, 1L),
+                2,
+                8,
+                6));
+        ChestGenHooks.addItem(
+            "villageBlacksmith",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Manganese, 1L),
+                2,
+                8,
+                12));
+        ChestGenHooks.addItem(
+            "villageBlacksmith",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L), 4, 12, 12));
+        ChestGenHooks.addItem(
+            "villageBlacksmith",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
+                4,
+                12,
+                12));
+        ChestGenHooks.addItem(
+            "villageBlacksmith",
+            new WeightedRandomChestContent(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Brass, 1L), 4, 12, 12));
+        ChestGenHooks.addItem(
+            "villageBlacksmith",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.DamascusSteel, 1L),
+                4,
+                12,
+                1));
+
+        ChestGenHooks
+            .addItem("strongholdCrossing", new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 6));
+        ChestGenHooks
+            .addItem("strongholdCrossing", new WeightedRandomChestContent(ItemList.McGuffium_239.get(1L), 1, 1, 10));
+
+        ChestGenHooks.addItem(
+            "strongholdCorridor",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.DamascusSteel, 1L),
+                1,
+                4,
+                6));
+        ChestGenHooks.addItem(
+            "strongholdCorridor",
+            new WeightedRandomChestContent(
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.DamascusSteel, 1L),
+                1,
+                4,
+                6));
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/postload/CraftingRecipeLoader.java
new file mode 100644
index 0000000000..ae41a07e97
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/CraftingRecipeLoader.java
@@ -0,0 +1,2011 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GraviSuite;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.NotEnoughItems;
+import static gregtech.api.util.GTModHandler.getModItem;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import bartworks.system.material.WerkstoffLoader;
+import gregtech.GTMod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GTValues;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import ic2.core.Ic2Items;
+
+public class CraftingRecipeLoader implements Runnable {
+
+    private static final String aTextIron1 = "X X";
+    private static final String aTextIron2 = "XXX";
+    private static final long bits_no_remove_buffered = GTModHandler.RecipeBits.NOT_REMOVABLE
+        | GTModHandler.RecipeBits.BUFFERED;
+    private static final long bits = GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE
+        | GTModHandler.RecipeBits.BUFFERED;
+    private static final String aTextPlateWrench = "PwP";
+
+    @Override
+    public void run() {
+        GTLog.out.println("GTMod: Adding nerfed Vanilla Recipes.");
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.bucket, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "XhX", " X ", 'X', OrePrefixes.plate.get(Materials.AnyIron) });
+        ItemStack tMat = new ItemStack(Items.iron_ingot);
+        {
+            ItemStack tStack;
+            if (null != (tStack = GTModHandler.removeRecipe(tMat, tMat, null, null, null, null, null, null, null))) {
+                GTModHandler.addCraftingRecipe(
+                    tStack,
+                    bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+                    new Object[] { "ShS", "XZX", "SdS", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+                        OrePrefixes.screw.get(Materials.Steel), 'Z', OrePrefixes.spring.get(Materials.Steel) });
+            }
+        }
+        {
+            ItemStack tStack;
+            if (null != (tStack = GTModHandler.removeRecipe(tMat, tMat, null, tMat, tMat, null, tMat, tMat, null))) {
+                GTModHandler.addCraftingRecipe(
+                    tStack,
+                    bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+                    new Object[] { "XX ", "XXh", "XX ", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+            }
+        }
+        {
+            ItemStack tStack;
+            if (null != (tStack = GTModHandler.removeRecipe(tMat, null, tMat, tMat, null, tMat, tMat, tMat, tMat))) {
+                GTModHandler.addCraftingRecipe(
+                    tStack,
+                    bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+                    new Object[] { aTextIron1, "XhX", aTextIron2, 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+            }
+        }
+        {
+            ItemStack tStack;
+            if (null != (tStack = GTModHandler
+                .removeRecipe(tMat, null, tMat, tMat, new ItemStack(Blocks.chest, 1, 0), tMat, null, tMat, null))) {
+                GTModHandler.addCraftingRecipe(
+                    tStack,
+                    bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+                    new Object[] { "XwX", "XCX", " X ", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron), 'C',
+                        "craftingChest" });
+            }
+        }
+        {
+            ItemStack tStack;
+            if (null != (tStack = GTModHandler.removeRecipe(tMat, tMat, tMat, tMat, tMat, tMat, null, null, null))) {
+                tStack.stackSize /= 2;
+                GTModHandler.addCraftingRecipe(
+                    tStack,
+                    bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+                    new Object[] { " w ", aTextIron2, aTextIron2, 'X', OrePrefixes.stick.get(Materials.AnyIron), 'S',
+                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+            }
+        }
+
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("ironFence", 6L),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE,
+            new Object[] { aTextIron2, aTextIron2, " w ", 'X', OrePrefixes.stick.get(Materials.AnyIron), 'S',
+                OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+
+        tMat = new ItemStack(Items.gold_ingot);
+        {
+            ItemStack tStack;
+            if (null != (tStack = GTModHandler.removeRecipe(tMat, tMat, null, null, null, null, null, null, null))) {
+                GTModHandler.addCraftingRecipe(
+                    tStack,
+                    bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+                    new Object[] { "ShS", "XZX", "SdS", 'X', OrePrefixes.plate.get(Materials.Gold), 'S',
+                        OrePrefixes.screw.get(Materials.Steel), 'Z', OrePrefixes.spring.get(Materials.Steel) });
+            }
+        }
+        tMat = GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1L);
+        {
+            ItemStack tStack;
+            if (null != (tStack = GTModHandler.removeRecipe(tMat, tMat, tMat, tMat, tMat, tMat, null, null, null))) {
+                GTModHandler.addCraftingRecipe(
+                    tStack,
+                    bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+                    new Object[] { aTextIron2, aTextIron2, 'X', OrePrefixes.plate.get(Materials.Rubber) });
+            }
+        }
+        GTModHandler.removeRecipeByOutputDelayed(ItemList.Bottle_Empty.get(1L));
+        GTModHandler.removeRecipeByOutputDelayed(ItemList.IC2_Spray_WeedEx.get(1L));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("reBattery", 1L));
+        GTModHandler.removeRecipeByOutputDelayed(new ItemStack(Blocks.tnt));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("dynamite", 1L));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("industrialTnt", 1L));
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "stamps", 1L, 0));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "stamps", 1L, 1));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "stamps", 1L, 2));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "stamps", 1L, 3));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "stamps", 1L, 4));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "stamps", 1L, 5));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "stamps", 1L, 6));
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "engine", 1L, 0));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "engine", 1L, 1));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "engine", 1L, 2));
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getModItem(Forestry.ID, "engine", 1L, 4));
+
+        ItemStack tStack = GTModHandler
+            .removeRecipe(new ItemStack(Blocks.planks, 1, 0), null, null, new ItemStack(Blocks.planks, 1, 0));
+        if (tStack != null) {
+            GTModHandler.addCraftingRecipe(
+                GTUtility.copyAmount(
+                    GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+                    tStack),
+                bits_no_remove_buffered,
+                new Object[] { "s", "P", "P", 'P', OrePrefixes.plank.get(Materials.Wood) });
+            GTModHandler.addCraftingRecipe(
+                GTUtility
+                    .copyAmount(GTMod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize / 2 : tStack.stackSize, tStack),
+                bits_no_remove_buffered,
+                new Object[] { "P", "P", 'P', OrePrefixes.plank.get(Materials.Wood) });
+        }
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.stone_button, 2, 0),
+            bits_no_remove_buffered,
+            new Object[] { "S", "S", 'S', OrePrefixes.stone });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.stone_button, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.stone });
+
+        GTLog.out.println("GTMod: Adding Vanilla Convenience Recipes.");
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.stonebrick, 1, 3),
+            bits_no_remove_buffered,
+            new Object[] { "f", "X", 'X', new ItemStack(Blocks.double_stone_slab, 1, 8) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.gravel, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "h", "X", 'X', new ItemStack(Blocks.cobblestone, 1, 0) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.sand, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "h", "X", 'X', new ItemStack(Blocks.gravel, 1, 0) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.cobblestone, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "h", "X", 'X', new ItemStack(Blocks.stone, 1, 0) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.stonebrick, 1, 2),
+            bits_no_remove_buffered,
+            new Object[] { "h", "X", 'X', new ItemStack(Blocks.stonebrick, 1, 0) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.double_stone_slab, 1, 8),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.double_stone_slab, 1, 0) });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.double_stone_slab, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.double_stone_slab, 1, 8) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.double_stone_slab, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 0) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.cobblestone, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 3) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.brick_block, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 4) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.stonebrick, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 5) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.nether_brick, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 6) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.quartz_block, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 7) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.double_stone_slab, 1, 8),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 8) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 0) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 1),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 1) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 2),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 2) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 3),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 3) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 4),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 4) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 5),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 5) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 6),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 6) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.planks, 1, 7),
+            bits_no_remove_buffered,
+            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 7) });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.stick, 2, 0),
+            bits_no_remove_buffered,
+            new Object[] { "s", "X", 'X', new ItemStack(Blocks.deadbush, 1, 32767) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.stick, 2, 0),
+            bits_no_remove_buffered,
+            new Object[] { "s", "X", 'X', new ItemStack(Blocks.tallgrass, 1, 0) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.stick, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { "s", "X", 'X', OrePrefixes.treeSapling });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.comparator, 1, 0),
+            bits_no_remove_buffered,
+            new Object[] { " T ", "TQT", "SSS", 'Q', OreDictNames.craftingQuartz, 'S', OrePrefixes.stoneSmooth, 'T',
+                OreDictNames.craftingRedstoneTorch });
+
+        GTLog.out.println("GTMod: Adding Tool Recipes.");
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.minecart, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { " h ", "PwP", "WPW", 'P', OrePrefixes.plate.get(Materials.AnyIron), 'W',
+                ItemList.Component_Minecart_Wheels_Iron });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.minecart, 1),
+            bits_no_remove_buffered,
+            new Object[] { " h ", "PwP", "WPW", 'P', OrePrefixes.plate.get(Materials.Steel), 'W',
+                ItemList.Component_Minecart_Wheels_Steel });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.chest_minecart, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', OreDictNames.craftingChest });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.furnace_minecart, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', OreDictNames.craftingFurnace });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.hopper_minecart, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X',
+                new ItemStack(Blocks.hopper, 1, 32767) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.tnt_minecart, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', new ItemStack(Blocks.tnt, 1, 32767) });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.chainmail_helmet, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "RRR", "RhR", 'R', OrePrefixes.ring.get(Materials.Steel) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.chainmail_chestplate, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "RhR", "RRR", "RRR", 'R', OrePrefixes.ring.get(Materials.Steel) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.chainmail_leggings, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "RRR", "RhR", "R R", 'R', OrePrefixes.ring.get(Materials.Steel) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.chainmail_boots, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.REVERSIBLE
+                | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "R R", "RhR", 'R', OrePrefixes.ring.get(Materials.Steel) });
+
+        GTLog.out.println("GTMod: Adding Wool and Color releated Recipes.");
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 1),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeOrange });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 2),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeMagenta });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 3),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLightBlue });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 4),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeYellow });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 5),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLime });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 6),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyePink });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 7),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeGray });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 8),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLightGray });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 9),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeCyan });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 10),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyePurple });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 11),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBlue });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 12),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBrown });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 13),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeGreen });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 14),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeRed });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Blocks.wool, 1, 15),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBlack });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.stained_glass, 8, 0),
+            bits_no_remove_buffered,
+            new Object[] { "GGG", "GDG", "GGG", 'G', new ItemStack(Blocks.glass, 1), 'D', Dyes.dyeWhite });
+
+        GTLog.out.println("GTMod: Putting a Potato on a Stick.");
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Packaged_PotatoChips.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.foil.get(Materials.Aluminium), ItemList.Food_PotatoChips });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Packaged_ChiliChips.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.foil.get(Materials.Aluminium), ItemList.Food_ChiliChips });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Packaged_Fries.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.plateDouble.get(Materials.Paper), ItemList.Food_Fries });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Chum_On_Stick.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Chum });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Potato_On_Stick.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Raw_Potato });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Potato_On_Stick_Roasted.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Baked_Potato });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Dough.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.bucket.get(Materials.Water), OrePrefixes.dust.get(Materials.Wheat) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Dough_Sugar.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Sugar) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Dough_Chocolate.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Cocoa) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Dough_Chocolate.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Chocolate) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Flat_Dough.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "foodDough", ToolDictNames.craftingToolRollingPin });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Raw_Bun.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "foodDough" });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Raw_Bread.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "foodDough", "foodDough" });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Raw_Baguette.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "foodDough", "foodDough", "foodDough" });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Raw_Cake.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Dough_Sugar, ItemList.Food_Dough_Sugar, ItemList.Food_Dough_Sugar,
+                ItemList.Food_Dough_Sugar });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_ChiliChips.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_PotatoChips, OrePrefixes.dust.get(Materials.Chili) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sliced_Buns.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sliced_Breads.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sliced_Baguettes.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sliced_Bun.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Buns });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sliced_Bread.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Breads });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sliced_Baguette.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguettes });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Veggie.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
+                ItemList.Food_Sliced_Onion });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Cheese.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Meat.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Buns, OrePrefixes.dust.get(Materials.MeatCooked) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Chum.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Chum });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Veggie.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Cucumber,
+                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Cheese.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Meat.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun,
+                OrePrefixes.dust.get(Materials.MeatCooked) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Burger_Chum.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Chum });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Veggie.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Breads, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber,
+                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Cheese.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Breads, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Bacon.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Breads, new ItemStack(Items.cooked_porkchop, 1) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Steak.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Breads, new ItemStack(Items.cooked_beef, 1) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Veggie.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Cucumber,
+                ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato,
+                ItemList.Food_Sliced_Onion });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Cheese.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Bacon.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread,
+                new ItemStack(Items.cooked_porkchop, 1) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Sandwich_Steak.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread,
+                new ItemStack(Items.cooked_beef, 1) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Veggie.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguettes, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber,
+                ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato,
+                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Cheese.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguettes, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Bacon.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguettes, new ItemStack(Items.cooked_porkchop, 1),
+                new ItemStack(Items.cooked_porkchop, 1) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Steak.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguettes, new ItemStack(Items.cooked_beef, 1),
+                new ItemStack(Items.cooked_beef, 1) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Veggie.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Cucumber,
+                ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
+                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Cheese.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Bacon.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette,
+                new ItemStack(Items.cooked_porkchop, 1), new ItemStack(Items.cooked_porkchop, 1) });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Large_Sandwich_Steak.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette,
+                new ItemStack(Items.cooked_beef, 1), new ItemStack(Items.cooked_beef, 1) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Raw_Pizza_Veggie.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Flat_Dough, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
+                ItemList.Food_Sliced_Onion });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Raw_Pizza_Cheese.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Flat_Dough, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+                ItemList.Food_Sliced_Cheese });
+        GTModHandler.addShapelessCraftingRecipe(
+            ItemList.Food_Raw_Pizza_Meat.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { ItemList.Food_Flat_Dough, OrePrefixes.dust.get(Materials.MeatCooked) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Cheese.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', "foodCheese" });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Lemon.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', "cropLemon" });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Tomato.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', "cropTomato" });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Onion.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', "cropOnion" });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Cucumber.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', "cropCucumber" });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Bun.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', ItemList.Food_Baked_Bun });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Bread.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', ItemList.Food_Baked_Bread });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Sliced_Baguette.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', ItemList.Food_Baked_Baguette });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Raw_PotatoChips.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', "cropPotato" });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Raw_Cookie.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "kX", 'X', ItemList.Food_Dough_Chocolate });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.Food_Raw_Fries.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "k", "X", 'X', "cropPotato" });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.bowl, 1),
+            bits_no_remove_buffered,
+            new Object[] { "k", "X", 'X', OrePrefixes.plank.get(Materials.Wood) });
+        GTModHandler.addCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.ring, Materials.Rubber, 1L),
+            bits_no_remove_buffered,
+            new Object[] { "k", "X", 'X', OrePrefixes.plate.get(Materials.Rubber) });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.arrow, 1),
+            bits_no_remove_buffered | GTModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+            new Object[] { "  H", " S ", "F  ", 'H', new ItemStack(Items.flint, 1, 32767), 'S',
+                OrePrefixes.stick.get(Materials.Wood), 'F', OreDictNames.craftingFeather });
+
+        GTModHandler.removeRecipe(
+            new ItemStack(Blocks.planks),
+            null,
+            new ItemStack(Blocks.planks),
+            null,
+            new ItemStack(Blocks.planks));
+        GTModHandler.removeRecipeByOutputDelayed(ItemList.Food_Baked_Bread.get(1L));
+        GTModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.cookie, 1));
+        GTModHandler.removeRecipe(
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L));
+        if (null != GTUtility.setStack(
+            GTModHandler.getRecipeOutput(
+                true,
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+                null,
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L)),
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L))) {
+            GTLog.out.println("GTMod: Changed Forestrys Bronze Recipe");
+        }
+        tStack = GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L);
+
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getRecipeOutput(
+                null,
+                new ItemStack(Blocks.sand, 1, 0),
+                null,
+                null,
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.Apatite, 1L),
+                null,
+                null,
+                new ItemStack(Blocks.sand, 1, 0),
+                null),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "S", "A", "S", 'A', OrePrefixes.dust.get(Materials.Apatite), 'S',
+                new ItemStack(Blocks.sand, 1, 32767) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getRecipeOutput(
+                tStack,
+                tStack,
+                tStack,
+                tStack,
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.Apatite, 1L),
+                tStack,
+                tStack,
+                tStack,
+                tStack),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "SSS", "SAS", "SSS", 'A', OrePrefixes.dust.get(Materials.Apatite), 'S',
+                OrePrefixes.dust.get(Materials.Ash) });
+
+        GTLog.out.println("GTMod: Adding Mixed Metal Ingot Recipes.");
+        GTModHandler.removeRecipeByOutputDelayed(ItemList.IC2_Mixed_Metal_Ingot.get(1L));
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(6L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(6L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(8L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(8L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(8L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(10L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(10L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(10L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(12L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(12L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(12L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(14L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z',
+                OrePrefixes.plate.get(Materials.AnnealedCopper) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(14L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(14L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(16L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z',
+                OrePrefixes.plate.get(Materials.AnnealedCopper) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(16L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(16L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
+                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(18L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(18L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(18L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
+                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(20L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
+                OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(20L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
+                OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(20L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
+                OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.Long_Distance_Pipeline_Fluid.get(1L),
+            GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE,
+            new Object[] { "GPG", "IwI", "GPG", 'G', GTOreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 1L),
+                'P', GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L), 'I',
+                GTOreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Steel, 1L) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Long_Distance_Pipeline_Item.get(1L),
+            GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE,
+            new Object[] { "GPG", "IwI", "GPG", 'G', GTOreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 1L),
+                'P', GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L), 'I',
+                GTOreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Tin, 1L) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(32L),
+            GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE,
+            new Object[] { "PPP", "IwI", "PPP", 'P', GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
+                'I', GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 1L) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.Long_Distance_Pipeline_Item_Pipe.get(32L),
+            GTModHandler.RecipeBits.BUFFERED | GTModHandler.RecipeBits.NOT_REMOVABLE,
+            new Object[] { "PPP", "IwI", "PPP", 'P', GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
+                'I', GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Tin, 1L) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(22L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
+                OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSG) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(24L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
+                OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSE) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(26L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
+                OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(28L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
+                OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSE) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(30L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
+                OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSG) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(32L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
+                OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(34L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
+                OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(36L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
+                OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(38L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
+                OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.Draconium) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(40L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
+                OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(42L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
+                OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(44L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
+                OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.Draconium) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(48L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(52L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(56L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
+        GTModHandler.addCraftingRecipe(
+            ItemList.IC2_Mixed_Metal_Ingot.get(64L),
+            bits_no_remove_buffered,
+            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.BlackPlutonium) });
+
+        GTLog.out.println("GTMod: Beginning to add regular Crafting Recipes.");
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("scaffold", 4L),
+            bits_no_remove_buffered,
+            new Object[] { "WWW", " S ", "S S", 'W', OrePrefixes.plank.get(Materials.Wood), 'S',
+                OrePrefixes.stick.get(Materials.Wood) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.stick.get(Materials.AnyIron), OrePrefixes.dust.get(Materials.Redstone),
+                OrePrefixes.dust.get(Materials.Redstone), OrePrefixes.dust.get(Materials.Redstone),
+                OrePrefixes.dust.get(Materials.Redstone) });
+        GTModHandler.addCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.ring, Materials.Paper, 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PPk", 'P', OrePrefixes.plate.get(Materials.Paper) });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.torch, 2),
+            bits_no_remove_buffered,
+            new Object[] { "C", "S", 'C', OrePrefixes.dust.get(Materials.Sulfur), 'S',
+                OrePrefixes.stick.get(Materials.Wood) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.torch, 6),
+            bits_no_remove_buffered,
+            new Object[] { "C", "S", 'C', OrePrefixes.dust.get(Materials.TricalciumPhosphate), 'S',
+                OrePrefixes.stick.get(Materials.Wood) });
+
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.piston, 1),
+            bits_no_remove_buffered,
+            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+                OrePrefixes.ingot.get(Materials.AnyIron) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.piston, 1),
+            bits_no_remove_buffered,
+            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+                OrePrefixes.ingot.get(Materials.AnyBronze) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.piston, 1),
+            bits_no_remove_buffered,
+            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+                OrePrefixes.ingot.get(Materials.Aluminium) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.piston, 1),
+            bits_no_remove_buffered,
+            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+                OrePrefixes.ingot.get(Materials.Steel) });
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Blocks.piston, 1),
+            bits_no_remove_buffered,
+            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+                OrePrefixes.ingot.get(Materials.Titanium) });
+
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("reactorVent", 1L, 1),
+            bits_no_remove_buffered,
+            new Object[] { "AIA", "I I", "AIA", 'I', new ItemStack(Blocks.iron_bars, 1), 'A',
+                OrePrefixes.plate.get(Materials.Aluminium) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTModHandler.getIC2Item("reactorPlatingExplosive", 1L),
+            bits_no_remove_buffered,
+            new Object[] { GTModHandler.getIC2Item("reactorPlating", 1L), OrePrefixes.plate.get(Materials.Lead) });
+        if (!Materials.Steel.mBlastFurnaceRequired) {
+            GTModHandler.addShapelessCraftingRecipe(
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1L),
+                bits_no_remove_buffered,
+                new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Coal),
+                    OrePrefixes.dust.get(Materials.Coal) });
+        }
+
+        GTModHandler.removeRecipeByOutputDelayed(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1L));
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 3L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Zinc) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Brass, 9L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
+                OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Zinc) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 3L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Tin) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Bronze, 9L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
+                OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tin) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Invar, 9L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Iron),
+                OrePrefixes.dust.get(Materials.Nickel) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Cupronickel, 6L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Nickel), OrePrefixes.dust.get(Materials.AnyCopper) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.RoseGold, 4L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Gold),
+                OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Gold),
+                OrePrefixes.dust.get(Materials.AnyCopper) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.SterlingSilver, 4L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Silver), OrePrefixes.dust.get(Materials.Silver),
+                OrePrefixes.dust.get(Materials.Silver), OrePrefixes.dust.get(Materials.Silver),
+                OrePrefixes.dust.get(Materials.AnyCopper) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.BlackBronze, 4L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Silver),
+                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+                OrePrefixes.dust.get(Materials.AnyCopper) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.BismuthBronze, 4L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Bismuth), OrePrefixes.dust.get(Materials.Zinc),
+                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+                OrePrefixes.dust.get(Materials.AnyCopper) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.CobaltBrass, 8L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
+                OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
+                OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
+                OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Aluminium),
+                OrePrefixes.dust.get(Materials.Cobalt) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.DamascusSteel, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dustSmall.get(Materials.Nickel),
+                OrePrefixes.dustSmall.get(Materials.Nickel), OrePrefixes.dustSmall.get(Materials.Nickel),
+                OrePrefixes.dustTiny.get(Materials.Coal), OrePrefixes.dustTiny.get(Materials.Silicon),
+                OrePrefixes.dustTiny.get(Materials.Manganese), OrePrefixes.dustTiny.get(Materials.Chrome),
+                OrePrefixes.dustTiny.get(Materials.Molybdenum) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.DamascusSteel, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dustSmall.get(Materials.Manganese),
+                OrePrefixes.dustSmall.get(Materials.Manganese), OrePrefixes.dustSmall.get(Materials.Chrome),
+                OrePrefixes.dustSmall.get(Materials.Chrome), OrePrefixes.dustTiny.get(Materials.Coal),
+                OrePrefixes.dustTiny.get(Materials.Silicon), OrePrefixes.dustTiny.get(Materials.Vanadium) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.RedstoneAlloy, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Redstone), OrePrefixes.dust.get(Materials.Silicon),
+                OrePrefixes.dust.get(Materials.Coal) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.CrudeSteel, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Clay), OrePrefixes.dust.get(Materials.Flint),
+                OrePrefixes.dust.get(Materials.Stone) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.ConductiveIron, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.RedstoneAlloy), OrePrefixes.dust.get(Materials.Iron),
+                OrePrefixes.dust.get(Materials.Silver) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.EnergeticAlloy, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.ConductiveIron), OrePrefixes.dust.get(Materials.Gold),
+                OrePrefixes.dust.get(Materials.BlackSteel) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.EnergeticSilver, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.ConductiveIron), OrePrefixes.dust.get(Materials.Silver),
+                OrePrefixes.dust.get(Materials.BlackSteel) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.ElectricalSteel, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dust.get(Materials.Coal),
+                OrePrefixes.dust.get(Materials.Silicon) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Soularium, 2L),
+            bits_no_remove_buffered,
+            new Object[] { new ItemStack(Blocks.soul_sand, 1, 32767), OrePrefixes.dust.get(Materials.Gold),
+                OrePrefixes.dust.get(Materials.Ash) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.DarkSteel, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.ElectricalSteel), OrePrefixes.dust.get(Materials.Coal),
+                OrePrefixes.dust.get(Materials.Obsidian) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Manyullyn, 3L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Ardite), OrePrefixes.dust.get(Materials.Ardite),
+                OrePrefixes.dust.get(Materials.Ardite), OrePrefixes.dust.get(Materials.Ardite),
+                OrePrefixes.dust.get(Materials.Cobalt), OrePrefixes.dust.get(Materials.Cobalt),
+                OrePrefixes.dust.get(Materials.Cobalt), OrePrefixes.dust.get(Materials.Cobalt) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Haderoth, 1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Rubracium), OrePrefixes.dust.get(Materials.Mithril) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Celenegil, 1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Platinum), OrePrefixes.dust.get(Materials.Orichalcum) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.LiveRoot),
+                OrePrefixes.dustTiny.get(Materials.Gold) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Hepatizon, 3L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Copper), OrePrefixes.dust.get(Materials.Copper),
+                OrePrefixes.dust.get(Materials.Copper), OrePrefixes.dustTiny.get(Materials.Gold),
+                OrePrefixes.dustTiny.get(Materials.Gold), OrePrefixes.dustTiny.get(Materials.Gold),
+                OrePrefixes.dustTiny.get(Materials.Silver), OrePrefixes.dustTiny.get(Materials.Silver),
+                OrePrefixes.dustTiny.get(Materials.Silver) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Angmallen, 2L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Gold) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Inolashite, 1L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Alduorite), OrePrefixes.dust.get(Materials.Ceruclase) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Items.gunpowder, 6),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Coal), OrePrefixes.dust.get(Materials.Coal),
+                OrePrefixes.dust.get(Materials.Coal), OrePrefixes.dust.get(Materials.Sulfur),
+                OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Items.gunpowder, 6),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Charcoal), OrePrefixes.dust.get(Materials.Charcoal),
+                OrePrefixes.dust.get(Materials.Charcoal), OrePrefixes.dust.get(Materials.Sulfur),
+                OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
+        GTModHandler.addShapelessCraftingRecipe(
+            new ItemStack(Items.gunpowder, 6),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Carbon), OrePrefixes.dust.get(Materials.Carbon),
+                OrePrefixes.dust.get(Materials.Carbon), OrePrefixes.dust.get(Materials.Sulfur),
+                OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.IndiumGalliumPhosphide, 3L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Indium), OrePrefixes.dust.get(Materials.Gallium),
+                OrePrefixes.dust.get(Materials.Phosphorus) });
+
+        GTModHandler.addShapelessCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 5L),
+            bits_no_remove_buffered,
+            new Object[] { OrePrefixes.dust.get(Materials.Potassium), OrePrefixes.cell.get(Materials.Nitrogen),
+                OrePrefixes.cell.get(Materials.Oxygen), OrePrefixes.cell.get(Materials.Oxygen),
+                OrePrefixes.cell.get(Materials.Oxygen) });
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("carbonFiber", 1L));
+
+        ItemStack[] tChestAndTank = new ItemStack[] { ItemList.Super_Chest_EV.get(1), ItemList.Super_Chest_IV.get(1),
+            ItemList.Super_Chest_HV.get(1), ItemList.Super_Chest_MV.get(1), ItemList.Super_Chest_LV.get(1),
+            ItemList.Quantum_Chest_EV.get(1), ItemList.Quantum_Chest_IV.get(1), ItemList.Quantum_Chest_HV.get(1),
+            ItemList.Quantum_Chest_MV.get(1), ItemList.Quantum_Chest_LV.get(1), ItemList.Super_Tank_EV.get(1),
+            ItemList.Super_Tank_IV.get(1), ItemList.Super_Tank_HV.get(1), ItemList.Super_Tank_MV.get(1),
+            ItemList.Super_Tank_LV.get(1), ItemList.Quantum_Tank_EV.get(1), ItemList.Quantum_Tank_IV.get(1),
+            ItemList.Quantum_Tank_HV.get(1), ItemList.Quantum_Tank_MV.get(1), ItemList.Quantum_Tank_LV.get(1) };
+        for (ItemStack tItem : tChestAndTank) {
+            GTModHandler.addShapelessCraftingRecipe(tItem, new Object[] { tItem });
+        }
+
+        List iToRemoveAndHide = Arrays
+            .stream(
+                new String[] { "copperCableItem", "insulatedCopperCableItem", "goldCableItem", "insulatedGoldCableItem",
+                    "insulatedIronCableItem", "glassFiberCableItem", "tinCableItem", "ironCableItem",
+                    "insulatedTinCableItem", "detectorCableItem", "splitterCableItem", "electrolyzer", "cutter" })
+            .map(x -> GTModHandler.getIC2Item(x, 1L))
+            .collect(Collectors.toList());
+
+        if (NotEnoughItems.isModLoaded()) {
+            iToRemoveAndHide.forEach(item -> {
+                codechicken.nei.api.API.hideItem(item);
+                GTModHandler.removeRecipeByOutputDelayed(item);
+            });
+        }
+
+        Arrays
+            .stream(
+                new String[] { "batBox", "mfeUnit", "lvTransformer", "mvTransformer", "hvTransformer", "evTransformer",
+                    "cesuUnit", "luminator", "teleporter", "energyOMat", "advBattery", "boatElectric", "cropnalyzer",
+                    "coil", "powerunit", "powerunitsmall", "remote", "odScanner", "ovScanner", "solarHelmet",
+                    "staticBoots", "ecMeter", "obscurator", "overclockerUpgrade", "transformerUpgrade",
+                    "energyStorageUpgrade", "ejectorUpgrade", "suBattery", "frequencyTransmitter", "pullingUpgrade" })
+            .map(x -> GTModHandler.getIC2Item(x, 1L))
+            .forEach(GTModHandler::removeRecipeByOutputDelayed);
+
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("batBox", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PCP", "BBB", "PPP", 'C', OrePrefixes.cableGt01.get(Materials.Tin), 'P',
+                OrePrefixes.plank.get(Materials.Wood), 'B', OrePrefixes.battery.get(Materials.LV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("mfeUnit", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "CEC", "EME", "CEC", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'E',
+                OrePrefixes.battery.get(Materials.IV), 'M', GTModHandler.getIC2Item("machine", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("lvTransformer", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PCP", "POP", "PCP", 'C', OrePrefixes.cableGt01.get(Materials.Tin), 'O',
+                GTModHandler.getIC2Item("coil", 1L), 'P', OrePrefixes.plank.get(Materials.Wood) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("mvTransformer", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "CMC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'M',
+                GTModHandler.getIC2Item("machine", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("hvTransformer", 1L),
+            bits_no_remove_buffered,
+            new Object[] { " C ", "IMB", " C ", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'M',
+                GTModHandler.getIC2Item("mvTransformer", 1L), 'I', OrePrefixes.circuit.get(Materials.LV), 'B',
+                OrePrefixes.battery.get(Materials.HV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("evTransformer", 1L),
+            bits_no_remove_buffered,
+            new Object[] { " C ", "IMB", " C ", 'C', OrePrefixes.cableGt01.get(Materials.Aluminium), 'M',
+                GTModHandler.getIC2Item("hvTransformer", 1L), 'I', OrePrefixes.circuit.get(Materials.HV), 'B',
+                OrePrefixes.battery.get(Materials.LuV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("cesuUnit", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PCP", "BBB", "PPP", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'P',
+                OrePrefixes.plate.get(Materials.Bronze), 'B', OrePrefixes.battery.get(Materials.HV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("teleporter", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "GFG", "CMC", "GDG", 'C', OrePrefixes.cableGt01.get(Materials.Platinum), 'G',
+                OrePrefixes.circuit.get(Materials.HV), 'D', OrePrefixes.gem.get(Materials.Diamond), 'M',
+                GTModHandler.getIC2Item("machine", 1L), 'F', GTModHandler.getIC2Item("frequencyTransmitter", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("energyOMat", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "RBR", "CMC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'R',
+                OrePrefixes.dust.get(Materials.Redstone), 'B', OrePrefixes.battery.get(Materials.LV), 'M',
+                GTModHandler.getIC2Item("machine", 1L) });
+
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("boatElectric", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "CCC", "XWX", aTextIron2, 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'X',
+                OrePrefixes.plate.get(Materials.Iron), 'W', GTModHandler.getIC2Item("waterMill", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("cropnalyzer", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "CC ", "RGR", "RIR", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'R',
+                OrePrefixes.dust.get(Materials.Redstone), 'G', OrePrefixes.block.get(Materials.Glass), 'I',
+                OrePrefixes.circuit.get(Materials.LV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("coil", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "CCC", "CXC", "CCC", 'C', OrePrefixes.wireGt01.get(Materials.Copper), 'X',
+                OrePrefixes.ingot.get(Materials.AnyIron) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("powerunit", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "BCA", "BIM", "BCA", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'B',
+                OrePrefixes.battery.get(Materials.LV), 'A', GTModHandler.getIC2Item("casingiron", 1L), 'I',
+                OrePrefixes.circuit.get(Materials.LV), 'M', GTModHandler.getIC2Item("elemotor", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("powerunitsmall", 1L),
+            bits_no_remove_buffered,
+            new Object[] { " CA", "BIM", " CA", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'B',
+                OrePrefixes.battery.get(Materials.LV), 'A', GTModHandler.getIC2Item("casingiron", 1L), 'I',
+                OrePrefixes.circuit.get(Materials.LV), 'M', GTModHandler.getIC2Item("elemotor", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("remote", 1L),
+            bits_no_remove_buffered,
+            new Object[] { " C ", "TLT", " F ", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'L',
+                OrePrefixes.dust.get(Materials.Lapis), 'T', GTModHandler.getIC2Item("casingtin", 1L), 'F',
+                GTModHandler.getIC2Item("frequencyTransmitter", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("odScanner", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PGP", "CBC", "WWW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'G',
+                OrePrefixes.dust.get(Materials.Glowstone), 'B', OrePrefixes.battery.get(Materials.HV), 'C',
+                OrePrefixes.circuit.get(Materials.HV), 'P', GTModHandler.getIC2Item("casinggold", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("ovScanner", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PDP", "GCG", "WSW", 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'G',
+                OrePrefixes.dust.get(Materials.Glowstone), 'D', OrePrefixes.battery.get(Materials.IV), 'C',
+                OrePrefixes.circuit.get(Materials.HV), 'P', GTModHandler.getIC2Item("casinggold", 1L), 'S',
+                GTModHandler.getIC2Item("odScanner", 1L) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("staticBoots", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "I I", "IWI", "CCC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'I',
+                OrePrefixes.ingot.get(Materials.Iron), 'W', new ItemStack(Blocks.wool) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("ecMeter", 1L),
+            bits_no_remove_buffered,
+            new Object[] { " G ", "CIC", "C C", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'G',
+                OrePrefixes.dust.get(Materials.Glowstone), 'I', OrePrefixes.circuit.get(Materials.LV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("obscurator", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "RER", "CAC", "RRR", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'R',
+                OrePrefixes.dust.get(Materials.Redstone), 'E', OrePrefixes.battery.get(Materials.HV), 'A',
+                OrePrefixes.circuit.get(Materials.HV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("overclockerUpgrade", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "CCC", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'C',
+                GTModHandler.getIC2Item("reactorCoolantSimple", 1L, 1), 'E', OrePrefixes.circuit.get(Materials.LV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("transformerUpgrade", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "GGG", "WTW", "GEG", 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'T',
+                GTModHandler.getIC2Item("mvTransformer", 1L), 'E', OrePrefixes.circuit.get(Materials.LV), 'G',
+                OrePrefixes.block.get(Materials.Glass) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("energyStorageUpgrade", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PPP", "WBW", "PEP", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'E',
+                OrePrefixes.circuit.get(Materials.LV), 'P', OrePrefixes.plank.get(Materials.Wood), 'B',
+                OrePrefixes.battery.get(Materials.LV) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("ejectorUpgrade", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PHP", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'E',
+                OrePrefixes.circuit.get(Materials.LV), 'P', new ItemStack(Blocks.piston), 'H',
+                new ItemStack(Blocks.hopper) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("suBattery", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "W", "C", "R", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'C',
+                OrePrefixes.dust.get(Materials.HydratedCoal), 'R', OrePrefixes.dust.get(Materials.Redstone) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("pullingUpgrade", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PHP", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'P',
+                new ItemStack(Blocks.sticky_piston), 'R', new ItemStack(Blocks.hopper), 'E',
+                OrePrefixes.circuit.get(Materials.LV) });
+
+        if (NotEnoughItems.isModLoaded()) {
+            codechicken.nei.api.API.hideItem(GTModHandler.getIC2Item("reactorUraniumSimple", 1L, 1));
+            codechicken.nei.api.API.hideItem(GTModHandler.getIC2Item("reactorUraniumDual", 1L, 1));
+            codechicken.nei.api.API.hideItem(GTModHandler.getIC2Item("reactorUraniumQuad", 1L, 1));
+            codechicken.nei.api.API.hideItem(GTModHandler.getIC2Item("reactorMOXSimple", 1L, 1));
+            codechicken.nei.api.API.hideItem(GTModHandler.getIC2Item("reactorMOXDual", 1L, 1));
+            codechicken.nei.api.API.hideItem(GTModHandler.getIC2Item("reactorMOXQuad", 1L, 1));
+        }
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("UranFuel", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "UUU", "NNN", "UUU", 'U', OrePrefixes.ingot.get(Materials.Uranium), 'N',
+                OrePrefixes.nugget.get(Materials.Uranium235) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("MOXFuel", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "UUU", "NNN", "UUU", 'U', OrePrefixes.ingot.get(Materials.Uranium), 'N',
+                OrePrefixes.ingot.get(Materials.Plutonium) });
+
+        GTModHandler.removeRecipeByOutputDelayed(Ic2Items.miningLaser.copy());
+        GTModHandler.addCraftingRecipe(
+            Ic2Items.miningLaser.copy(),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+                OrePrefixes.gemExquisite.get(Materials.Diamond), 'E', ItemList.Emitter_HV, 'C',
+                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+                new ItemStack(
+                    Ic2Items.chargingEnergyCrystal.copy()
+                        .getItem(),
+                    1,
+                    GTValues.W) });
+        GTModHandler.addCraftingRecipe(
+            Ic2Items.miningLaser.copy(),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+                OrePrefixes.gemExquisite.get(Materials.Ruby), 'E', ItemList.Emitter_HV, 'C',
+                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+                new ItemStack(
+                    Ic2Items.chargingEnergyCrystal.copy()
+                        .getItem(),
+                    1,
+                    GTValues.W) });
+        GTModHandler.addCraftingRecipe(
+            Ic2Items.miningLaser.copy(),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+                OrePrefixes.gemExquisite.get(Materials.Jasper), 'E', ItemList.Emitter_HV, 'C',
+                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+                new ItemStack(
+                    Ic2Items.chargingEnergyCrystal.copy()
+                        .getItem(),
+                    1,
+                    GTValues.W) });
+        GTModHandler.addCraftingRecipe(
+            Ic2Items.miningLaser.copy(),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+                OrePrefixes.gemExquisite.get(Materials.GarnetRed), 'E', ItemList.Emitter_HV, 'C',
+                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+                new ItemStack(
+                    Ic2Items.chargingEnergyCrystal.copy()
+                        .getItem(),
+                    1,
+                    GTValues.W) });
+
+        GTModHandler.removeRecipeDelayed(GTModHandler.getIC2Item("miningPipe", 8));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("miningPipe", 1),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "hPf", 'P', OrePrefixes.pipeSmall.get(Materials.Steel) });
+
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("luminator", 16L),
+            bits_no_remove_buffered,
+            new Object[] { "RTR", "GHG", "GGG", 'H', OrePrefixes.cell.get(Materials.Helium), 'T',
+                OrePrefixes.ingot.get(Materials.Tin), 'R', OrePrefixes.ingot.get(Materials.AnyIron), 'G',
+                new ItemStack(Blocks.glass, 1) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("luminator", 16L),
+            bits_no_remove_buffered,
+            new Object[] { "RTR", "GHG", "GGG", 'H', OrePrefixes.cell.get(Materials.Mercury), 'T',
+                OrePrefixes.ingot.get(Materials.Tin), 'R', OrePrefixes.ingot.get(Materials.AnyIron), 'G',
+                new ItemStack(Blocks.glass, 1) });
+
+        GTModHandler.removeRecipeDelayed(
+            tStack = GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+            tStack,
+            tStack,
+            tStack,
+            new ItemStack(Items.coal, 1, 0),
+            tStack,
+            tStack,
+            tStack,
+            tStack);
+        GTModHandler.removeRecipeDelayed(
+            tStack = GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+            tStack,
+            tStack,
+            tStack,
+            new ItemStack(Items.coal, 1, 1),
+            tStack,
+            tStack,
+            tStack,
+            tStack);
+        GTModHandler.removeRecipeDelayed(
+            null,
+            tStack = new ItemStack(Items.coal, 1),
+            null,
+            tStack,
+            GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L),
+            tStack,
+            null,
+            tStack,
+            null);
+
+        GTModHandler.removeFurnaceSmelting(new ItemStack(Blocks.hopper));
+
+        GTLog.out.println("GTMod: Applying harder Recipes for several Blocks."); // TODO: Not Buffered
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("reactorReflectorThick", 1L, 1));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("reactorReflectorThick", 1L, 1),
+            bits_no_remove_buffered,
+            new Object[] { " N ", "NBN", " N ", 'B', OrePrefixes.plateDouble.get(Materials.Beryllium), 'N',
+                GTModHandler.getIC2Item("reactorReflector", 1L, 1) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("reactorReflectorThick", 1L, 1),
+            bits_no_remove_buffered,
+            new Object[] { " B ", "NCN", " B ", 'B', OrePrefixes.plate.get(Materials.Beryllium), 'N',
+                GTModHandler.getIC2Item("reactorReflector", 1L, 1), 'C',
+                OrePrefixes.plate.get(Materials.TungstenCarbide) });
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("reactorReflector", 1L, 1));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("reactorReflector", 1L, 1),
+            bits_no_remove_buffered,
+            new Object[] { "TGT", "GSG", "TGT", 'T', OrePrefixes.plate.get(Materials.Tin), 'G',
+                OrePrefixes.dust.get(Materials.Graphite), 'S', OrePrefixes.plateDouble.get(Materials.Steel) });
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("reactorReflector", 1L, 1),
+            bits_no_remove_buffered,
+            new Object[] { "TTT", "GSG", "TTT", 'T', OrePrefixes.plate.get(Materials.TinAlloy), 'G',
+                OrePrefixes.dust.get(Materials.Graphite), 'S', OrePrefixes.plate.get(Materials.Beryllium) });
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("crophavester", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("crophavester", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "ACA", "PMS", "WOW", 'M', ItemList.Hull_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'A',
+                ItemList.Robot_Arm_LV, 'P', ItemList.Electric_Piston_LV, 'S', ItemList.Sensor_LV, 'W',
+                OrePrefixes.toolHeadSense.get(Materials.Aluminium), 'O', ItemList.Conveyor_Module_LV });
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("RTGenerator", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("RTGenerator", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "III", "IMI", "ICI", 'I', OrePrefixes.itemCasing.get(Materials.Steel), 'C',
+                OrePrefixes.circuit.get(Materials.LuV), 'M', ItemList.Hull_IV });
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("RTHeatGenerator", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("RTHeatGenerator", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "III", "IMB", "ICI", 'I', OrePrefixes.itemCasing.get(Materials.Steel), 'C',
+                OrePrefixes.circuit.get(Materials.LuV), 'M', ItemList.Hull_IV, 'B',
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Copper, 1) });
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("carbonrotor", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("carbonrotor", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "dBS", "BTB", "SBw", 'B', GTModHandler.getIC2Item("carbonrotorblade", 1), 'S',
+                OrePrefixes.screw.get(Materials.Iridium), 'T', GTModHandler.getIC2Item("steelshaft", 1) });
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("steelrotor", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("steelrotor", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "dBS", "BTB", "SBw", 'B', GTModHandler.getIC2Item("steelrotorblade", 1), 'S',
+                OrePrefixes.screw.get(Materials.StainlessSteel), 'T', GTModHandler.getIC2Item("ironshaft", 1) });
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("ironrotor", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("ironrotor", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "dBS", "BTB", "SBw", 'B', GTModHandler.getIC2Item("ironrotorblade", 1), 'S',
+                OrePrefixes.screw.get(Materials.WroughtIron), 'T', GTModHandler.getIC2Item("ironshaft", 1) });
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("woodrotor", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("woodrotor", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "dBS", "BTB", "SBw", 'B', GTModHandler.getIC2Item("woodrotorblade", 1), 'S',
+                OrePrefixes.screw.get(Materials.WroughtIron), 'T', OrePrefixes.stickLong.get(Materials.WroughtIron) });
+
+        if (GTOreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L) != null) {
+            tStack = GTModHandler.getRecipeOutput(
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
+                new ItemStack(Items.redstone, 1),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Gold, 1L),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Gold, 1L),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L),
+                new ItemStack(Items.diamond_pickaxe, 1),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L));
+            GTModHandler.removeRecipeByOutputDelayed(tStack);
+            GTModHandler.addCraftingRecipe(
+                tStack,
+                bits_no_remove_buffered,
+                new Object[] { "ICI", "GIG", "DPD", 'C', OrePrefixes.circuit.get(Materials.HV), 'D',
+                    OrePrefixes.gear.get(Materials.Diamond), 'G', OrePrefixes.gear.get(Materials.Gold), 'I',
+                    OrePrefixes.gear.get(Materials.Steel), 'P', GTModHandler.getIC2Item("diamondDrill", 1L, 32767) });
+        }
+
+        GTModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.paper));
+        GTModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.sugar));
+        GTModHandler.addCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 2),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "SSS", " m ", 'S', new ItemStack(Items.reeds) });
+        GTModHandler.addCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "Sm ", 'S', new ItemStack(Items.reeds) });
+        GTModHandler.addCraftingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.paper, Materials.Empty, 2),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { " C ", "SSS", " C ", 'S', GTOreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 1), 'C',
+                new ItemStack(Blocks.stone_slab) });
+
+        GTLog.out.println("GTMod: Applying Recipes for Tools");
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("nanoSaber", 1L));
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("nanoSaber", 1L),
+            bits_no_remove_buffered,
+            new Object[] { "PI ", "PI ", "CLC", 'L', OrePrefixes.battery.get(Materials.EV), 'I',
+                OrePrefixes.plateAlloy.get("Iridium"), 'P', OrePrefixes.plate.get(Materials.Platinum), 'C',
+                OrePrefixes.circuit.get(Materials.IV) });
+
+        GTModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.flint_and_steel, 1));
+        GTModHandler.addCraftingRecipe(
+            new ItemStack(Items.flint_and_steel, 1),
+            bits_no_remove_buffered,
+            new Object[] { "S ", " F", 'F', new ItemStack(Items.flint, 1), 'S', "nuggetSteel" });
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("diamondDrill", 1L));
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("miningDrill", 1L));
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("chainsaw", 1L));
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("electricHoe", 1L));
+
+        GTModHandler.removeRecipeByOutputDelayed(GTModHandler.getIC2Item("electricTreetap", 1L));
+
+        if (GraviSuite.isModLoaded()) {
+            GTModHandler.removeRecipeByOutputDelayed(
+                GTModHandler.getModItem(GraviSuite.ID, "advNanoChestPlate", 1, GTValues.W));
+            GTModHandler.addCraftingRecipe(
+                GTModHandler.getModItem(GraviSuite.ID, "advNanoChestPlate", 1, GTValues.W),
+                bits_no_remove_buffered,
+                new Object[] { "CJC", "TNT", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Advanced), 'T',
+                    OrePrefixes.plate.get(Materials.TungstenSteel), 'J',
+                    GTModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GTValues.W), 'N',
+                    GTModHandler.getModItem(IndustrialCraft2.ID, "itemArmorNanoChestplate", 1, GTValues.W), 'W',
+                    OrePrefixes.wireGt12.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.IV) });
+
+            GTModHandler
+                .removeRecipeByOutputDelayed(GTModHandler.getModItem(GraviSuite.ID, "advLappack", 1, GTValues.W));
+            GTModHandler.addCraftingRecipe(
+                GTModHandler.getModItem(GraviSuite.ID, "advLappack", 1, GTValues.W),
+                bits_no_remove_buffered,
+                new Object[] { "CEC", "EJE", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J',
+                    GTModHandler.getModItem(IndustrialCraft2.ID, "itemArmorEnergypack", 1L, GTValues.W), 'E',
+                    GTModHandler.getModItem(IndustrialCraft2.ID, "itemBatCrystal", 1L, GTValues.W), 'W',
+                    OrePrefixes.wireGt04.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.EV) });
+
+            GTModHandler
+                .removeRecipeByOutputDelayed(GTModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GTValues.W));
+            GTModHandler.addCraftingRecipe(
+                GTModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GTValues.W),
+                bits_no_remove_buffered,
+                new Object[] { "CJC", "EXE", "YZY", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J',
+                    GTModHandler.getModItem(IndustrialCraft2.ID, "itemArmorJetpackElectric", 1, GTValues.W), 'E',
+                    OrePrefixes.plate.get(Materials.Titanium), 'X',
+                    GTModHandler.getModItem(IndustrialCraft2.ID, "itemArmorAlloyChestplate", 1L), 'Z',
+                    OrePrefixes.circuit.get(Materials.EV), 'Y', OrePrefixes.wireGt02.get(Materials.Platinum) });
+        }
+
+        GTModHandler.addShapelessCraftingRecipe(
+            Materials.Fireclay.getDust(2),
+            new Object[] { Materials.Brick.getDust(1), Materials.Clay.getDust(1) });
+
+        GTModHandler.addCraftingRecipe(
+            ItemList.Casing_Advanced_Rhodium_Palladium.get(1L),
+            bits,
+            new Object[] { "PhP", "PFP", aTextPlateWrench, 'P',
+                new ItemStack(WerkstoffLoader.items.get(OrePrefixes.plate), 1, 88), 'F',
+                OrePrefixes.frameGt.get(Materials.Chrome) });
+
+        if (Forestry.isModLoaded()) {
+            ItemStack[] coverIDs = { ItemList.Plank_Larch.get(2L), ItemList.Plank_Teak.get(2L),
+                ItemList.Plank_Acacia_Green.get(2L), ItemList.Plank_Lime.get(2L), ItemList.Plank_Chestnut.get(2L),
+                ItemList.Plank_Wenge.get(2L), ItemList.Plank_Baobab.get(2L), ItemList.Plank_Sequoia.get(2L),
+                ItemList.Plank_Kapok.get(2L), ItemList.Plank_Ebony.get(2L), ItemList.Plank_Mahagony.get(2L),
+                ItemList.Plank_Balsa.get(2L), ItemList.Plank_Willow.get(2L), ItemList.Plank_Walnut.get(2L),
+                ItemList.Plank_Greenheart.get(2L), ItemList.Plank_Cherry.get(2L), ItemList.Plank_Mahoe.get(2L),
+                ItemList.Plank_Poplar.get(2L), ItemList.Plank_Palm.get(2L), ItemList.Plank_Papaya.get(2L),
+                ItemList.Plank_Pine.get(2L), ItemList.Plank_Plum.get(2L), ItemList.Plank_Maple.get(2L),
+                ItemList.Plank_Citrus.get(2L) };
+            for (int i = 0; i < coverIDs.length; i++) {
+                ItemStack slabWood = getModItem(Forestry.ID, "slabs", 1, i);
+                ItemStack slabWoodFireproof = getModItem(Forestry.ID, "slabsFireproof", 1, i);
+
+                GTModHandler.addCraftingRecipe(
+                    coverIDs[i],
+                    GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE,
+                    new Object[] { "s ", " P", 'P', slabWood });
+
+                GTModHandler.addCraftingRecipe(
+                    coverIDs[i],
+                    GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.REVERSIBLE,
+                    new Object[] { "s ", " P", 'P', slabWoodFireproof });
+            }
+        }
+        GTModHandler.addCraftingRecipe(
+            GTModHandler.getIC2Item("electronicCircuit", 1L),
+            GTModHandler.RecipeBits.BUFFERED,
+            new Object[] { "RIR", "VBV", "CCC", 'R', ItemList.Circuit_Parts_Resistor.get(1), 'C',
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.RedAlloy, 1), 'V',
+                ItemList.Circuit_Parts_Vacuum_Tube.get(1), 'B', ItemList.Circuit_Board_Coated_Basic.get(1), 'I',
+                ItemList.IC2_Item_Casing_Steel.get(1) });
+        GTModHandler.addShapelessCraftingRecipe(
+            GTModHandler.getIC2Item("electronicCircuit", 1L),
+            new Object[] { ItemList.Circuit_Integrated.getWildcard(1L) });
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/CropLoader.java b/src/main/java/gregtech/loaders/postload/CropLoader.java
new file mode 100644
index 0000000000..752c6923b9
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/CropLoader.java
@@ -0,0 +1,1055 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GTBaseCrop;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTOreDictUnificator;
+
+public class CropLoader implements Runnable {
+
+    @Override
+    public void run() {
+        GTLog.out.println("GTMod: Register Crops to IC2.");
+        try {
+            /*
+             * Tags: Vines = Tendrilly Edible = Food
+             */
+            ItemStack[] tI = { ItemList.Crop_Drop_Indigo.get(4L), ItemList.Crop_Drop_MilkWart.get(4L),
+                new ItemStack(Blocks.brown_mushroom, 4), new ItemStack(Blocks.red_mushroom, 4) };
+            new GTBaseCrop(
+                124,
+                "Indigo",
+                "Eloraam",
+                tI[0],
+                2,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                4,
+                0,
+                new String[] { "Flower", "Blue", "Ingredient" },
+                ItemList.Crop_Drop_Indigo.get(1L),
+                null);
+            new GTBaseCrop(
+                125,
+                "Flax",
+                "Eloraam",
+                null,
+                2,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                2,
+                0,
+                1,
+                new String[] { "Silk", "Tendrilly", "Addictive" },
+                new ItemStack(Items.string, 1),
+                null);
+            new GTBaseCrop(
+                126,
+                "Oilberries",
+                "Spacetoad",
+                null,
+                9,
+                4,
+                0,
+                1,
+                4,
+                6,
+                1,
+                2,
+                1,
+                12,
+                new String[] { "Fire", "Dark", "Reed", "Rotten", "Coal", "Oil" },
+                ItemList.Crop_Drop_OilBerry.get(1L),
+                null);
+            new GTBaseCrop(
+                127,
+                "Bobsyeruncleranks",
+                "GenerikB",
+                null,
+                11,
+                4,
+                0,
+                1,
+                4,
+                4,
+                0,
+                8,
+                2,
+                9,
+                new String[] { "Shiny", "Tendrilly", "Emerald", "Berylium", "Crystal" },
+                Materials.Emerald,
+                ItemList.Crop_Drop_BobsYerUncleRanks.get(1L),
+                new ItemStack[] { new ItemStack(Items.emerald, 1) });
+            new GTBaseCrop(
+                128,
+                "Diareed",
+                "Direwolf20",
+                null,
+                12,
+                4,
+                0,
+                1,
+                4,
+                5,
+                0,
+                10,
+                2,
+                10,
+                new String[] { "Fire", "Shiny", "Reed", "Coal", "Diamond", "Crystal" },
+                Materials.Diamond,
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1L),
+                new ItemStack[] { new ItemStack(Items.diamond, 1) });
+            new GTBaseCrop(
+                129,
+                "Withereed",
+                "CovertJaguar",
+                null,
+                8,
+                4,
+                0,
+                1,
+                4,
+                2,
+                0,
+                4,
+                1,
+                3,
+                new String[] { "Fire", "Undead", "Reed", "Coal", "Rotten", "Wither" },
+                Materials.Coal,
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
+                new ItemStack[] { new ItemStack(Items.coal, 1), new ItemStack(Items.coal, 1) });
+            new GTBaseCrop(
+                130,
+                "Blazereed",
+                "Mr. Brain",
+                null,
+                6,
+                4,
+                0,
+                1,
+                4,
+                0,
+                4,
+                1,
+                0,
+                0,
+                new String[] { "Fire", "Blaze", "Reed", "Sulfur" },
+                new ItemStack(Items.blaze_powder, 1),
+                new ItemStack[] { new ItemStack(Items.blaze_rod, 1) });
+            new GTBaseCrop(
+                131,
+                "Eggplant",
+                "Link",
+                null,
+                6,
+                3,
+                900,
+                2,
+                3,
+                0,
+                4,
+                1,
+                0,
+                0,
+                new String[] { "Chicken", "Egg", "Food", "Feather", "Flower", "Addictive" },
+                new ItemStack(Items.egg, 1),
+                new ItemStack[] { new ItemStack(Items.chicken, 1), new ItemStack(Items.feather, 1),
+                    new ItemStack(Items.feather, 1), new ItemStack(Items.feather, 1) });
+            new GTBaseCrop(
+                132,
+                "Corium",
+                "Gregorius Techneticies",
+                null,
+                6,
+                4,
+                0,
+                1,
+                4,
+                0,
+                2,
+                3,
+                1,
+                0,
+                new String[] { "Cow", "Silk", "Tendrilly" },
+                new ItemStack(Items.leather, 1),
+                null);
+            new GTBaseCrop(
+                133,
+                "Corpseplant",
+                "Mr. Kenny",
+                null,
+                5,
+                4,
+                0,
+                1,
+                4,
+                0,
+                2,
+                1,
+                0,
+                3,
+                new String[] { "Toxic", "Undead", "Tendrilly", "Food", "Rotten" },
+                new ItemStack(Items.rotten_flesh, 1),
+                new ItemStack[] { ItemList.Dye_Bonemeal.get(1L), ItemList.Dye_Bonemeal.get(1L),
+                    new ItemStack(Items.bone, 1) });
+            new GTBaseCrop(
+                134,
+                "Creeperweed",
+                "General Spaz",
+                null,
+                7,
+                4,
+                0,
+                1,
+                4,
+                3,
+                0,
+                5,
+                1,
+                3,
+                new String[] { "Creeper", "Tendrilly", "Explosive", "Fire", "Sulfur", "Saltpeter", "Coal" },
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L),
+                null);
+            new GTBaseCrop(
+                135,
+                "Enderbloom",
+                "RichardG",
+                null,
+                10,
+                4,
+                0,
+                1,
+                4,
+                5,
+                0,
+                2,
+                1,
+                6,
+                new String[] { "Ender", "Flower", "Shiny" },
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.EnderPearl, 1L),
+                new ItemStack[] { new ItemStack(Items.ender_pearl, 1), new ItemStack(Items.ender_pearl, 1),
+                    new ItemStack(Items.ender_eye, 1) });
+            new GTBaseCrop(
+                136,
+                "Meatrose",
+                "VintageBeef",
+                null,
+                7,
+                4,
+                1500,
+                1,
+                4,
+                0,
+                4,
+                1,
+                3,
+                0,
+                new String[] { "Food", "Flower", "Cow", "Fish", "Chicken", "Pig" },
+                new ItemStack(Items.dye, 1, 9),
+                new ItemStack[] { new ItemStack(Items.beef, 1), new ItemStack(Items.porkchop, 1),
+                    new ItemStack(Items.chicken, 1), new ItemStack(Items.fish, 1) });
+            new GTBaseCrop(
+                137,
+                "Milkwart",
+                "Mr. Brain",
+                tI[1],
+                6,
+                3,
+                900,
+                1,
+                3,
+                0,
+                3,
+                0,
+                1,
+                0,
+                new String[] { "Food", "Milk", "Cow" },
+                ItemList.Crop_Drop_MilkWart.get(1L),
+                null);
+            new GTBaseCrop(
+                138,
+                "Slimeplant",
+                "Neowulf",
+                null,
+                6,
+                4,
+                0,
+                3,
+                4,
+                3,
+                0,
+                0,
+                0,
+                2,
+                new String[] { "Slime", "Bouncy", "Sticky", "Bush" },
+                new ItemStack(Items.slime_ball, 1),
+                null);
+            new GTBaseCrop(
+                139,
+                "Spidernip",
+                "Mr. Kenny",
+                null,
+                4,
+                4,
+                600,
+                1,
+                4,
+                2,
+                1,
+                4,
+                1,
+                3,
+                new String[] { "Toxic", "Silk", "Spider", "Flower", "Ingredient", "Addictive" },
+                new ItemStack(Items.string, 1),
+                new ItemStack[] { new ItemStack(Items.spider_eye, 1), new ItemStack(Blocks.web, 1) });
+            new GTBaseCrop(
+                140,
+                "Tearstalks",
+                "Neowulf",
+                null,
+                8,
+                4,
+                0,
+                1,
+                4,
+                1,
+                2,
+                0,
+                0,
+                0,
+                new String[] { "Healing", "Nether", "Ingredient", "Reed", "Ghast" },
+                new ItemStack(Items.ghast_tear, 1),
+                null);
+            new GTBaseCrop(
+                141,
+                "Tine",
+                "Gregorius Techneticies",
+                null,
+                5,
+                3,
+                0,
+                2,
+                3,
+                2,
+                0,
+                3,
+                0,
+                0,
+                new String[] { "Shiny", "Metal", "Pine", "Tin", "Bush" },
+                Materials.Tin,
+                ItemList.Crop_Drop_Tine.get(1L),
+                null);
+            new GTBaseCrop(
+                142,
+                "Coppon",
+                "Mr. Brain",
+                null,
+                6,
+                3,
+                0,
+                2,
+                3,
+                2,
+                0,
+                1,
+                1,
+                1,
+                new String[] { "Shiny", "Metal", "Cotton", "Copper", "Bush" },
+                Materials.Copper,
+                ItemList.Crop_Drop_Coppon.get(1L),
+                null);
+            new GTBaseCrop(
+                143,
+                "Brown Mushrooms",
+                "Mr. Brain",
+                tI[2],
+                1,
+                3,
+                0,
+                1,
+                3,
+                0,
+                2,
+                0,
+                0,
+                2,
+                new String[] { "Food", "Mushroom", "Ingredient" },
+                new ItemStack(Blocks.brown_mushroom, 1),
+                null);
+            new GTBaseCrop(
+                144,
+                "Red Mushrooms",
+                "Mr. Kenny",
+                tI[3],
+                1,
+                3,
+                0,
+                1,
+                3,
+                0,
+                1,
+                3,
+                0,
+                2,
+                new String[] { "Toxic", "Mushroom", "Ingredient" },
+                new ItemStack(Blocks.red_mushroom, 1),
+                null);
+            new GTBaseCrop(
+                145,
+                "Argentia",
+                "Eloraam",
+                null,
+                7,
+                4,
+                0,
+                3,
+                4,
+                2,
+                0,
+                1,
+                0,
+                0,
+                new String[] { "Shiny", "Metal", "Silver", "Reed" },
+                Materials.Silver,
+                ItemList.Crop_Drop_Argentia.get(1L),
+                null);
+            new GTBaseCrop(
+                146,
+                "Plumbilia",
+                "KingLemming",
+                null,
+                6,
+                4,
+                0,
+                3,
+                4,
+                2,
+                0,
+                3,
+                1,
+                1,
+                new String[] { "Heavy", "Metal", "Lead", "Reed" },
+                Materials.Lead,
+                ItemList.Crop_Drop_Plumbilia.get(1L),
+                null);
+            new GTBaseCrop(
+                147,
+                "Steeleafranks",
+                "Benimatic",
+                null,
+                10,
+                4,
+                0,
+                1,
+                4,
+                3,
+                0,
+                7,
+                2,
+                8,
+                new String[] { "Metal", "Tendrilly", "Iron" },
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steeleaf, 1L),
+                new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steeleaf, 1L) });
+            new GTBaseCrop(
+                148,
+                "Liveroots",
+                "Benimatic",
+                null,
+                8,
+                4,
+                0,
+                1,
+                4,
+                2,
+                0,
+                5,
+                2,
+                6,
+                new String[] { "Wood", "Tendrilly" },
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 1L),
+                new ItemStack[] { ItemList.TF_LiveRoot.get(1L) });
+            new GTBaseCrop(
+                149,
+                "Trollplant",
+                "unknown",
+                null,
+                6,
+                5,
+                1000,
+                1,
+                4,
+                0,
+                0,
+                5,
+                2,
+                8,
+                new String[] { "Troll", "Bad", "Scrap" },
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.FoolsRuby, 1L),
+                new ItemStack[] { ItemList.IC2_Plantball.get(1), ItemList.IC2_Scrap.get(1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium241, 1L) });
+            new GTBaseCrop(
+                150,
+                "Lazulia",
+                "unknown",
+                null,
+                7,
+                4,
+                0,
+                2,
+                4,
+                4,
+                2,
+                5,
+                7,
+                4,
+                new String[] { "Shiny", "Bad", "Crystal", "Lapis" },
+                Materials.Lapis,
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1L),
+                null);
+            new GTBaseCrop(
+                151,
+                "Glowheat",
+                "unknown",
+                null,
+                10,
+                7,
+                0,
+                5,
+                7,
+                3,
+                3,
+                3,
+                5,
+                4,
+                new String[] { "Light", "Shiny", "Crystal" },
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
+                null);
+            new GTBaseCrop(
+                153,
+                "Fertilia",
+                "unknown",
+                null,
+                3,
+                4,
+                0,
+                1,
+                4,
+                2,
+                3,
+                5,
+                4,
+                8,
+                new String[] { "Growth", "Healing", "Flower" },
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L),
+                new ItemStack[] { ItemList.IC2_Fertilizer.get(1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1L) });
+            new GTBaseCrop(
+                154,
+                "Bauxia",
+                "unknown",
+                null,
+                6,
+                3,
+                0,
+                2,
+                3,
+                5,
+                0,
+                2,
+                3,
+                3,
+                new String[] { "Metal", "Aluminium", "Reed", "Aluminium" },
+                Materials.Aluminium,
+                ItemList.Crop_Drop_Bauxite.get(1),
+                null);
+            new GTBaseCrop(
+                155,
+                "Titania",
+                "unknown",
+                null,
+                9,
+                3,
+                0,
+                2,
+                3,
+                5,
+                0,
+                3,
+                3,
+                1,
+                new String[] { "Metal", "Heavy", "Reed", "Titanium" },
+                Materials.Titanium,
+                ItemList.Crop_Drop_Ilmenite.get(1),
+                null);
+            new GTBaseCrop(
+                156,
+                "Reactoria",
+                "unknown",
+                null,
+                12,
+                4,
+                0,
+                2,
+                4,
+                4,
+                0,
+                1,
+                2,
+                1,
+                new String[] { "Radioactive", "Metal", "Danger", "Uranium" },
+                Materials.Uranium,
+                ItemList.Crop_Drop_Pitchblende.get(1),
+                new ItemStack[] { ItemList.Crop_Drop_Uraninite.get(1) });
+            new GTBaseCrop(
+                157,
+                "God of Thunder",
+                "unknown",
+                null,
+                9,
+                4,
+                0,
+                2,
+                4,
+                3,
+                0,
+                5,
+                1,
+                2,
+                new String[] { "Radioactive", "Metal", "Coal", "Thorium" },
+                Materials.Thorium,
+                ItemList.Crop_Drop_Thorium.get(1),
+                null);
+            new GTBaseCrop(
+                158,
+                "Transformium",
+                "unknown",
+                null,
+                12,
+                4,
+                2500,
+                1,
+                4,
+                6,
+                2,
+                1,
+                6,
+                1,
+                new String[] { "Transform", "Coal", "Reed" },
+                ItemList.Crop_Drop_UUABerry.get(1L),
+                new ItemStack[] { ItemList.Crop_Drop_UUABerry.get(1L), ItemList.Crop_Drop_UUABerry.get(1L),
+                    ItemList.Crop_Drop_UUABerry.get(1L), ItemList.Crop_Drop_UUABerry.get(1L),
+                    ItemList.Crop_Drop_UUMBerry.get(1L) });
+            new GTBaseCrop(
+                159,
+                "Starwart",
+                "unknown",
+                null,
+                12,
+                4,
+                4000,
+                1,
+                4,
+                2,
+                0,
+                0,
+                1,
+                0,
+                new String[] { "Wither", "Nether", "Undead", "Netherstar" },
+                Materials.NetherStar,
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
+                new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1L),
+                    new ItemStack(Items.skull, 1), new ItemStack(Items.skull, 1, 1), new ItemStack(Items.skull, 1, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherStar, 1L) });
+            new GTBaseCrop(
+                160,
+                "Zomplant",
+                "unknown",
+                null,
+                3,
+                4,
+                0,
+                1,
+                4,
+                1,
+                3,
+                4,
+                2,
+                6,
+                new String[] { "Zombie", "Rotten", "Undead" },
+                new ItemStack(Items.rotten_flesh),
+                null);
+            new GTBaseCrop(
+                161,
+                "Nickelback",
+                "unknown",
+                null,
+                5,
+                3,
+                0,
+                2,
+                3,
+                3,
+                0,
+                1,
+                2,
+                2,
+                new String[] { "Metal", "Fire", "Alloy" },
+                Materials.Nickel,
+                ItemList.Crop_Drop_Nickel.get(1),
+                null);
+            new GTBaseCrop(
+                162,
+                "Galvania",
+                "unknown",
+                null,
+                6,
+                3,
+                0,
+                2,
+                3,
+                3,
+                0,
+                2,
+                2,
+                3,
+                new String[] { "Metal", "Alloy", "Bush" },
+                Materials.Zinc,
+                ItemList.Crop_Drop_Zinc.get(1),
+                null);
+            new GTBaseCrop(
+                163,
+                "Evil Ore",
+                "unknown",
+                null,
+                8,
+                4,
+                0,
+                3,
+                4,
+                4,
+                0,
+                2,
+                1,
+                3,
+                new String[] { "Crystal", "Fire", "Nether" },
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 1L),
+                new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 1L), });
+            new GTBaseCrop(
+                164,
+                "Olivia",
+                "unknown",
+                null,
+                2,
+                4,
+                0,
+                3,
+                4,
+                1,
+                0,
+                1,
+                4,
+                0,
+                new String[] { "Crystal", "Shiny", "Processing", "Olivine" },
+                Materials.Olivine,
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Olivine, 1L),
+                new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), });
+            new GTBaseCrop(
+                165,
+                "Sapphirum",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                3,
+                4,
+                1,
+                0,
+                1,
+                5,
+                0,
+                new String[] { "Crystal", "Shiny", "Metal", "Sapphire" },
+                Materials.Sapphire,
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sapphire, 1L),
+                new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), });
+            new GTBaseCrop(
+                166,
+                "Pyrolusium",
+                "unknown",
+                null,
+                12,
+                3,
+                0,
+                2,
+                3,
+                1,
+                0,
+                1,
+                1,
+                0,
+                new String[] { "Metal", "Clean", "Bush", "Manganese" },
+                Materials.Manganese,
+                ItemList.Crop_Drop_Manganese.get(1),
+                null);
+            new GTBaseCrop(
+                167,
+                "Scheelinium",
+                "unknown",
+                null,
+                12,
+                3,
+                0,
+                2,
+                3,
+                3,
+                0,
+                1,
+                1,
+                0,
+                new String[] { "Metal", "Hard", "Bush", "Tungsten" },
+                Materials.Tungsten,
+                ItemList.Crop_Drop_Scheelite.get(1),
+                null);
+            new GTBaseCrop(
+                168,
+                "Platina",
+                "unknown",
+                null,
+                11,
+                4,
+                0,
+                1,
+                4,
+                3,
+                0,
+                0,
+                3,
+                0,
+                new String[] { "Metal", "Shiny", "Reed", "Platinum" },
+                Materials.Platinum,
+                ItemList.Crop_Drop_Platinum.get(1),
+                null);
+            new GTBaseCrop(
+                169,
+                "Quantaria",
+                "unknown",
+                null,
+                12,
+                4,
+                1000,
+                1,
+                4,
+                4,
+                0,
+                0,
+                1,
+                0,
+                new String[] { "Metal", "Iridium", "Reed" },
+                Materials.Iridium,
+                ItemList.Crop_Drop_Iridium.get(1),
+                new ItemStack[] { ItemList.Crop_Drop_Osmium.get(1) });
+            new GTBaseCrop(
+                170,
+                "Stargatium",
+                "unknown",
+                null,
+                12,
+                4,
+                1500,
+                1,
+                4,
+                4,
+                0,
+                0,
+                2,
+                0,
+                new String[] { "Metal", "Heavy", "Alien", "Naquadah" },
+                Materials.Naquadah,
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1L),
+                new ItemStack[] { ItemList.Crop_Drop_Naquadah.get(1) });
+            new GTBaseCrop(
+                171,
+                "Lemon",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Yellow", "Sour" },
+                ItemList.Crop_Drop_Lemon.get(1),
+                null);
+            new GTBaseCrop(
+                172,
+                "Chilly",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Red", "Spicy" },
+                ItemList.Crop_Drop_Chilly.get(1),
+                null);
+            new GTBaseCrop(
+                173,
+                "Tomato",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Red" },
+                ItemList.Crop_Drop_Tomato.get(1),
+                new ItemStack[] { ItemList.Crop_Drop_MTomato.get(1) });
+            new GTBaseCrop(
+                174,
+                "Grape",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Purple" },
+                ItemList.Crop_Drop_Grapes.get(1),
+                null);
+            new GTBaseCrop(
+                175,
+                "Onion",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Brown" },
+                ItemList.Crop_Drop_Onion.get(1),
+                null);
+            new GTBaseCrop(
+                176,
+                "Cucumber",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Green" },
+                ItemList.Crop_Drop_Cucumber.get(1),
+                null);
+            new GTBaseCrop(
+                177,
+                "Tea",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Green", "Ingredient" },
+                ItemList.Crop_Drop_TeaLeaf.get(1),
+                null);
+            new GTBaseCrop(
+                178,
+                "Rape",
+                "unknown",
+                null,
+                4,
+                4,
+                0,
+                1,
+                4,
+                1,
+                1,
+                0,
+                2,
+                0,
+                new String[] { "Food", "Yellow", "Oil" },
+                ItemList.Crop_Drop_Rape.get(1),
+                null);
+            new GTBaseCrop(
+                179,
+                "Micadia",
+                "bartimaeusnek",
+                null,
+                9,
+                3,
+                0,
+                2,
+                3,
+                2,
+                0,
+                3,
+                0,
+                0,
+                new String[] { "Metal", "Pine", "Mica", "Bush" },
+                Materials.Mica,
+                ItemList.Crop_Drop_Mica.get(1L),
+                null);
+        } catch (Throwable e) {
+            GTLog.err.println("GTMod: Failed to register Crops to IC2.");
+            e.printStackTrace(GTLog.err);
+        }
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/FakeRecipeLoader.java b/src/main/java/gregtech/loaders/postload/FakeRecipeLoader.java
new file mode 100644
index 0000000000..335423cdce
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/FakeRecipeLoader.java
@@ -0,0 +1,23 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.GTValues;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GTModHandler;
+
+public class FakeRecipeLoader implements Runnable {
+
+    @Override
+    public void run() {
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("reactorLithiumCell", 1))
+            .itemOutputs(GTModHandler.getIC2Item("TritiumCell", 1))
+            .setNEIDesc(
+                "Neutron reflecting Breeder",
+                String.format("Every %d reactor hull heat", 3_000),
+                String.format("increase speed by %d00%%", 1),
+                String.format("Required pulses: %d", 10_000))
+            .duration(0)
+            .eut(0)
+            .addTo(RecipeMaps.ic2NuclearFakeRecipes);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GTPostLoad.java b/src/main/java/gregtech/loaders/postload/GTPostLoad.java
new file mode 100644
index 0000000000..66c89dfe4b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GTPostLoad.java
@@ -0,0 +1,537 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
+import static gregtech.api.recipe.RecipeMaps.massFabFakeRecipes;
+import static gregtech.api.recipe.RecipeMaps.rockBreakerFakeRecipes;
+import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.google.common.base.Stopwatch;
+
+import cpw.mods.fml.common.ProgressManager;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GTMod;
+import gregtech.api.enums.GTValues;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GTCLSCompat;
+import gregtech.api.util.GTForestryCompat;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTRecipeConstants;
+import gregtech.api.util.GTRecipeRegistrator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.items.MetaGeneratedTool01;
+import gregtech.common.items.behaviors.BehaviourDataOrb;
+import gregtech.common.tileentities.machines.basic.MTEMassfabricator;
+import ic2.api.recipe.IRecipeInput;
+import ic2.api.recipe.RecipeOutput;
+
+@SuppressWarnings("deprecation")
+public class GTPostLoad {
+
+    public static void activateOreDictHandler() {
+        @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+        Stopwatch stopwatch = Stopwatch.createStarted();
+        GTMod.gregtechproxy.activateOreDictHandler();
+
+        // noinspection UnstableApiUsage// Stable enough for this project
+        GTMod.GT_FML_LOGGER
+            .info("Congratulations, you have been waiting long enough (" + stopwatch.stop() + "). Have a Cake.");
+        GTLog.out.println(
+            "GTMod: List of Lists of Tool Recipes: " + GTModHandler.sSingleNonBlockDamagableRecipeList_list.toString());
+        GTLog.out.println(
+            "GTMod: Vanilla Recipe List -> Outputs null or stackSize <=0: "
+                + GTModHandler.sVanillaRecipeList_warntOutput.toString());
+        GTLog.out.println(
+            "GTMod: Single Non Block Damageable Recipe List -> Outputs null or stackSize <=0: "
+                + GTModHandler.sSingleNonBlockDamagableRecipeList_warntOutput.toString());
+    }
+
+    public static void removeIc2Recipes(Map aMaceratorRecipeList,
+        Map aCompressorRecipeList, Map aExtractorRecipeList,
+        Map aOreWashingRecipeList,
+        Map aThermalCentrifugeRecipeList) {
+        @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+        Stopwatch stopwatch = Stopwatch.createStarted();
+        // remove gemIridium exploit
+        ItemStack iridiumOre = GTModHandler.getIC2Item("iridiumOre", 1);
+        aCompressorRecipeList.entrySet()
+            .parallelStream()
+            .filter(
+                e -> e.getKey()
+                    .getInputs()
+                    .size() == 1 && e.getKey()
+                        .getInputs()
+                        .get(0)
+                        .isItemEqual(iridiumOre))
+            .findAny()
+            .ifPresent(e -> aCompressorRecipeList.remove(e.getKey()));
+        // Remove all IC2
+        GTModHandler.removeAllIC2Recipes();
+        // noinspection UnstableApiUsage// Stable enough for this project
+        GTMod.GT_FML_LOGGER.info("IC2 Removal (" + stopwatch.stop() + "). Have a Cake.");
+    }
+
+    public static void registerFluidCannerRecipes() {
+        for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
+            .getRegisteredFluidContainerData()) {
+            // lava clay bucket is registered with empty container with 0 stack size
+            ItemStack emptyContainer = tData.emptyContainer.copy();
+            emptyContainer.stackSize = 1;
+            GTValues.RA.stdBuilder()
+                .itemInputs(emptyContainer)
+                .itemOutputs(tData.filledContainer)
+                .fluidInputs(tData.fluid)
+                .duration((tData.fluid.amount / 62) * TICKS)
+                .eut(1)
+                .addTo(fluidCannerRecipes);
+            GTRecipeBuilder builder = GTValues.RA.stdBuilder()
+                .itemInputs(tData.filledContainer);
+            if (tData.emptyContainer.stackSize > 0) {
+                builder.itemOutputs(tData.emptyContainer);
+            }
+            builder.fluidOutputs(tData.fluid)
+                .duration((tData.fluid.amount / 62) * TICKS)
+                .eut(1)
+                .addTo(fluidCannerRecipes);
+        }
+    }
+
+    public static void addFakeRecipes() {
+        GTLog.out.println("GTMod: Adding Fake Recipes for NEI");
+
+        if (Forestry.isModLoaded()) {
+            GTForestryCompat.populateFakeNeiRecipes();
+        }
+
+        if (ItemList.IC2_Crop_Seeds.get(1L) != null) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.IC2_Crop_Seeds.getWildcard(1L))
+                .itemOutputs(ItemList.IC2_Crop_Seeds.getWithName(1L, "Scanned Seeds"))
+                .duration(8 * SECONDS)
+                .eut(8)
+                .noOptimize()
+                .ignoreCollision()
+                .fake()
+                .addTo(scannerFakeRecipes);
+        }
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.written_book, 1, 32767))
+            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Book Data"))
+            .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
+            .duration(6 * SECONDS + 8 * TICKS)
+            .eut(TierEU.RECIPE_LV)
+            .noOptimize()
+            .ignoreCollision()
+            .fake()
+            .addTo(scannerFakeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.filled_map, 1, 32767))
+            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Map Data"))
+            .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
+            .duration(6 * SECONDS + 8 * TICKS)
+            .eut(TierEU.RECIPE_LV)
+            .noOptimize()
+            .ignoreCollision()
+            .fake()
+            .addTo(scannerFakeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Tool_DataOrb.getWithName(1L, "Orb to overwrite"))
+            .itemOutputs(ItemList.Tool_DataOrb.getWithName(1L, "Copy of the Orb"))
+            .duration(25 * SECONDS + 12 * TICKS)
+            .eut(TierEU.RECIPE_LV)
+            .noOptimize()
+            .ignoreCollision()
+            .fake()
+            .addTo(scannerFakeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Tool_DataStick.getWithName(1L, "Stick to overwrite"))
+            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Copy of the Stick"))
+            .special(ItemList.Tool_DataStick.getWithName(0L, "Stick to copy"))
+            .duration(6 * SECONDS + 8 * TICKS)
+            .eut(TierEU.RECIPE_LV)
+            .noOptimize()
+            .ignoreCollision()
+            .fake()
+            .addTo(scannerFakeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Tool_DataStick.getWithName(1L, "Raw Prospection Data"))
+            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Analyzed Prospection Data"))
+            .duration(50 * SECONDS)
+            .eut(TierEU.RECIPE_LV)
+            .noOptimize()
+            .ignoreCollision()
+            .fake()
+            .addTo(scannerFakeRecipes);
+
+        if (GalacticraftCore.isModLoaded()) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    Objects
+                        .requireNonNull(
+                            GTModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1, Short.MAX_VALUE))
+                        .setStackDisplayName("Any Schematic"))
+                .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic"))
+                .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
+                .duration(30 * MINUTES)
+                .eut(TierEU.RECIPE_HV)
+                .noOptimize()
+                .ignoreCollision()
+                .fake()
+                .addTo(scannerFakeRecipes);
+
+            if (GalacticraftMars.isModLoaded()) {
+                GTValues.RA.stdBuilder()
+                    .itemInputs(
+                        Objects
+                            .requireNonNull(
+                                GTModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1, Short.MAX_VALUE))
+                            .setStackDisplayName("Any Schematic"))
+                    .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic"))
+                    .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
+                    .duration(30 * MINUTES)
+                    .eut(TierEU.RECIPE_MV)
+                    .noOptimize()
+                    .ignoreCollision()
+                    .fake()
+                    .addTo(scannerFakeRecipes);
+            }
+            if (GalaxySpace.isModLoaded()) {
+                for (int i = 4; i < 9; i++) {
+                    GTValues.RA.stdBuilder()
+                        .itemInputs(
+                            GTModHandler.getModItem(GalaxySpace.ID, "item.SchematicTier" + i, 1)
+                                .setStackDisplayName("Any Schematic"))
+                        .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic"))
+                        .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
+                        .duration(30 * MINUTES)
+                        .eut(TierEU.RECIPE_HV)
+                        .noOptimize()
+                        .ignoreCollision()
+                        .fake()
+                        .addTo(scannerFakeRecipes);
+                }
+            }
+        }
+        Materials.getMaterialsMap()
+            .values()
+            .forEach(tMaterial -> {
+                if ((tMaterial.mElement != null) && (!tMaterial.mElement.mIsIsotope)
+                    && (tMaterial != Materials.Magic)
+                    && (tMaterial.getMass() > 0L)) {
+                    ItemStack dataOrb = ItemList.Tool_DataOrb.get(1L);
+                    BehaviourDataOrb.setDataTitle(dataOrb, "Elemental-Scan");
+                    BehaviourDataOrb.setDataName(dataOrb, tMaterial.mElement.name());
+                    ItemStack dustItem = GTOreDictUnificator.get(OrePrefixes.dust, tMaterial, 1L);
+                    if (dustItem != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(dustItem)
+                            .itemOutputs(dataOrb)
+                            .special(ItemList.Tool_DataOrb.get(1L))
+                            .duration((int) (tMaterial.getMass() * 8192L))
+                            .eut(TierEU.RECIPE_LV)
+                            .fake()
+                            .ignoreCollision()
+                            .addTo(scannerFakeRecipes);
+                        GTValues.RA.stdBuilder()
+                            .itemOutputs(dustItem)
+                            .special(dataOrb)
+                            .metadata(GTRecipeConstants.MATERIAL, tMaterial)
+                            .addTo(RecipeMaps.replicatorRecipes);
+                        return;
+                    }
+                    ItemStack cellItem = GTOreDictUnificator.get(OrePrefixes.cell, tMaterial, 1L);
+                    if (cellItem != null) {
+                        GTValues.RA.stdBuilder()
+                            .itemInputs(cellItem)
+                            .itemOutputs(dataOrb)
+                            .special(ItemList.Tool_DataOrb.get(1L))
+                            .duration((int) (tMaterial.getMass() * 8192L))
+                            .eut(TierEU.RECIPE_LV)
+                            .fake()
+                            .ignoreCollision()
+                            .addTo(scannerFakeRecipes);
+                        FluidStack fluidStack = GTUtility.getFluidForFilledItem(cellItem, false);
+                        GTRecipeBuilder builder = GTValues.RA.stdBuilder();
+                        if (fluidStack != null) {
+                            builder.fluidOutputs(fluidStack);
+                        } else {
+                            builder.itemInputs(Materials.Empty.getCells(1))
+                                .itemOutputs(cellItem);
+                        }
+                        builder.special(dataOrb)
+                            .metadata(GTRecipeConstants.MATERIAL, tMaterial)
+                            .addTo(RecipeMaps.replicatorRecipes);
+                    }
+                }
+            });
+
+        if (!MTEMassfabricator.sRequiresUUA) {
+
+            MTEMassfabricator.nonUUARecipe = GTValues.RA.stdBuilder()
+                .fluidOutputs(Materials.UUMatter.getFluid(1L))
+                .duration(MTEMassfabricator.sDurationMultiplier)
+                .eut(MTEMassfabricator.BASE_EUT)
+                .ignoreCollision()
+                .noOptimize()
+                .fake()
+                .build()
+                .get();
+
+            massFabFakeRecipes.add(MTEMassfabricator.nonUUARecipe);
+
+        }
+
+        MTEMassfabricator.uuaRecipe = GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
+            .fluidInputs(Materials.UUAmplifier.getFluid(MTEMassfabricator.sUUAperUUM))
+            .fluidOutputs(Materials.UUMatter.getFluid(1L))
+            .duration(MTEMassfabricator.sDurationMultiplier / MTEMassfabricator.sUUASpeedBonus)
+            .eut(MTEMassfabricator.BASE_EUT)
+            .ignoreCollision()
+            .noOptimize()
+            .fake()
+            .build()
+            .get();
+
+        massFabFakeRecipes.add(MTEMassfabricator.uuaRecipe);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Display_ITS_FREE.getWithName(1L, "IT'S FREE! Place Lava on Side"))
+            .itemOutputs(new ItemStack(Blocks.cobblestone, 1))
+            .duration(16 * TICKS)
+            .eut(TierEU.RECIPE_LV)
+            .ignoreCollision()
+            .noOptimize()
+            .fake()
+            .addTo(rockBreakerFakeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Display_ITS_FREE.getWithName(1L, "IT'S FREE! Place Lava on Side"))
+            .itemOutputs(new ItemStack(Blocks.stone, 1))
+            .duration(16 * TICKS)
+            .eut(TierEU.RECIPE_LV)
+            .ignoreCollision()
+            .noOptimize()
+            .fake()
+            .addTo(rockBreakerFakeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(new ItemStack(Blocks.obsidian, 1))
+            .duration(6 * SECONDS + 8 * TICKS)
+            .eut(TierEU.RECIPE_LV)
+            .ignoreCollision()
+            .noOptimize()
+            .fake()
+            .addTo(rockBreakerFakeRecipes);
+    }
+
+    public static void nerfVanillaTools() {
+        if (!GTMod.gregtechproxy.mNerfedVanillaTools) {
+            return;
+        }
+
+        GTLog.out.println("GTMod: Nerfing Vanilla Tool Durability");
+        Items.wooden_sword.setMaxDamage(12);
+        Items.wooden_pickaxe.setMaxDamage(12);
+        Items.wooden_shovel.setMaxDamage(12);
+        Items.wooden_axe.setMaxDamage(12);
+        Items.wooden_hoe.setMaxDamage(12);
+
+        Items.stone_sword.setMaxDamage(48);
+        Items.stone_pickaxe.setMaxDamage(48);
+        Items.stone_shovel.setMaxDamage(48);
+        Items.stone_axe.setMaxDamage(48);
+        Items.stone_hoe.setMaxDamage(48);
+
+        Items.iron_sword.setMaxDamage(256);
+        Items.iron_pickaxe.setMaxDamage(256);
+        Items.iron_shovel.setMaxDamage(256);
+        Items.iron_axe.setMaxDamage(256);
+        Items.iron_hoe.setMaxDamage(256);
+
+        Items.golden_sword.setMaxDamage(24);
+        Items.golden_pickaxe.setMaxDamage(24);
+        Items.golden_shovel.setMaxDamage(24);
+        Items.golden_axe.setMaxDamage(24);
+        Items.golden_hoe.setMaxDamage(24);
+
+        Items.diamond_sword.setMaxDamage(768);
+        Items.diamond_pickaxe.setMaxDamage(768);
+        Items.diamond_shovel.setMaxDamage(768);
+        Items.diamond_axe.setMaxDamage(768);
+        Items.diamond_hoe.setMaxDamage(768);
+
+    }
+
+    public static void replaceVanillaMaterials() {
+        @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+        Stopwatch stopwatch = Stopwatch.createStarted();
+        GTMod.GT_FML_LOGGER.info("Replacing Vanilla Materials in recipes, please wait.");
+        Set replaceVanillaItemsSet = Arrays.stream(Materials.values())
+            .filter(GTRecipeRegistrator::hasVanillaRecipes)
+            .collect(Collectors.toSet());
+
+        ProgressManager.ProgressBar progressBar = ProgressManager
+            .push("Register materials", replaceVanillaItemsSet.size());
+        if (GTValues.cls_enabled) {
+            try {
+                GTCLSCompat.doActualRegistrationCLS(progressBar, replaceVanillaItemsSet);
+                GTCLSCompat.pushToDisplayProgress();
+            } catch (InvocationTargetException | IllegalAccessException e) {
+                GTMod.GT_FML_LOGGER.catching(e);
+            }
+        } else {
+            replaceVanillaItemsSet.forEach(m -> {
+                progressBar.step(m.mDefaultLocalName);
+                doActualRegistration(m);
+            });
+        }
+        ProgressManager.pop(progressBar);
+        // noinspection UnstableApiUsage// stable enough for project
+        GTMod.GT_FML_LOGGER.info("Replaced Vanilla Materials (" + stopwatch.stop() + "). Have a Cake.");
+    }
+
+    public static void doActualRegistration(Materials m) {
+        String plateName = OrePrefixes.plate.get(m)
+            .toString();
+        boolean noSmash = !m.contains(SubTag.NO_SMASHING);
+        if ((m.mTypes & 2) != 0) GTRecipeRegistrator.registerUsagesForMaterials(plateName, noSmash, m.getIngots(1));
+        if ((m.mTypes & 4) != 0) GTRecipeRegistrator.registerUsagesForMaterials(plateName, noSmash, m.getGems(1));
+        if (m.getBlocks(1) != null) GTRecipeRegistrator.registerUsagesForMaterials(null, noSmash, m.getBlocks(1));
+    }
+
+    public static void createGTtoolsCreativeTab() {
+        new CreativeTabs("GTtools") {
+
+            @SideOnly(Side.CLIENT)
+            @Override
+            public ItemStack getIconItemStack() {
+                return ItemList.Tool_Cheat.get(1, new ItemStack(Blocks.iron_block, 1));
+            }
+
+            @SideOnly(Side.CLIENT)
+            @Override
+            public Item getTabIconItem() {
+                return ItemList.Circuit_Integrated.getItem();
+            }
+
+            @Override
+            public void displayAllReleventItems(List aList) {
+
+                for (int i = 0; i < 32766; i += 2) {
+                    if (MetaGeneratedTool01.INSTANCE.getToolStats(new ItemStack(MetaGeneratedTool01.INSTANCE, 1, i))
+                        == null) {
+                        continue;
+                    }
+
+                    ItemStack tStack = new ItemStack(MetaGeneratedTool01.INSTANCE, 1, i);
+                    MetaGeneratedTool01.INSTANCE.isItemStackUsable(tStack);
+                    aList
+                        .add(MetaGeneratedTool01.INSTANCE.getToolWithStats(i, 1, Materials.Lead, Materials.Lead, null));
+                    aList.add(
+                        MetaGeneratedTool01.INSTANCE.getToolWithStats(i, 1, Materials.Nickel, Materials.Nickel, null));
+                    aList.add(
+                        MetaGeneratedTool01.INSTANCE.getToolWithStats(i, 1, Materials.Cobalt, Materials.Cobalt, null));
+                    aList.add(
+                        MetaGeneratedTool01.INSTANCE.getToolWithStats(i, 1, Materials.Osmium, Materials.Osmium, null));
+                    aList.add(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(i, 1, Materials.Adamantium, Materials.Adamantium, null));
+                    aList.add(
+                        MetaGeneratedTool01.INSTANCE
+                            .getToolWithStats(i, 1, Materials.Neutronium, Materials.Neutronium, null));
+
+                }
+                super.displayAllReleventItems(aList);
+            }
+        };
+    }
+
+    public static void addSolidFakeLargeBoilerFuels() {
+        RecipeMaps.largeBoilerFakeFuels.getBackend()
+            .addSolidRecipes(
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 1),
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1),
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Coal, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lignite, 1),
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Lignite, 1),
+                GTOreDictUnificator.get(OrePrefixes.log, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.plank, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.slab, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(ItemList.Block_SSFUEL.get(1)),
+                GTOreDictUnificator.get(ItemList.Block_MSSFUEL.get(1)),
+                GTOreDictUnificator.get(OrePrefixes.rod, Materials.Blaze, 1));
+        if (Thaumcraft.isModLoaded()) {
+            RecipeMaps.largeBoilerFakeFuels.getBackend()
+                .addSolidRecipe(GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1));
+        }
+    }
+
+    public static void identifyAnySteam() {
+        final String[] steamCandidates = { "steam", "ic2steam" };
+        final String[] superHeatedSteamCandidates = { "ic2superheatedsteam" };
+
+        GTModHandler.sAnySteamFluidIDs = Arrays.stream(steamCandidates)
+            .map(FluidRegistry::getFluid)
+            .filter(Objects::nonNull)
+            .map(FluidRegistry::getFluidID)
+            .collect(Collectors.toList());
+        GTModHandler.sSuperHeatedSteamFluidIDs = Arrays.stream(superHeatedSteamCandidates)
+            .map(FluidRegistry::getFluid)
+            .filter(Objects::nonNull)
+            .map(FluidRegistry::getFluidID)
+            .collect(Collectors.toList());
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GTWorldgenloader.java b/src/main/java/gregtech/loaders/postload/GTWorldgenloader.java
new file mode 100644
index 0000000000..85e81a1ec0
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GTWorldgenloader.java
@@ -0,0 +1,33 @@
+package gregtech.loaders.postload;
+
+import galacticgreg.WorldgenGaGT;
+import gregtech.api.enums.GTStones;
+import gregtech.api.enums.OreMixes;
+import gregtech.api.enums.SmallOres;
+import gregtech.api.util.GTLog;
+import gregtech.common.GTWorldgenerator;
+
+public class GTWorldgenloader implements Runnable {
+
+    public void run() {
+        new GTWorldgenerator();
+
+        // GT Stones
+        for (GTStones stone : GTStones.values()) {
+            stone.addGTStone();
+        }
+
+        // GT Default Small Ores
+        for (SmallOres smallOre : SmallOres.values()) {
+            smallOre.addGTSmallOre();
+        }
+
+        // GT Veins registration
+        for (OreMixes oreMix : OreMixes.values()) {
+            oreMix.addGTOreLayer();
+        }
+
+        new WorldgenGaGT().run();
+        GTLog.out.println("Started Galactic Greg ore gen code");
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java b/src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java
deleted file mode 100644
index b122646c92..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package gregtech.loaders.postload;
-
-import java.util.Set;
-
-import net.minecraft.block.Block;
-import net.minecraft.block.material.Material;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemAxe;
-import net.minecraft.item.ItemPickaxe;
-
-import gregtech.api.util.GT_Utility;
-
-public class GT_BlockResistanceLoader implements Runnable {
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void run() {
-        Blocks.stone.setResistance(10.0F);
-        Blocks.cobblestone.setResistance(10.0F);
-        Blocks.stonebrick.setResistance(10.0F);
-        Blocks.brick_block.setResistance(20.0F);
-        Blocks.hardened_clay.setResistance(15.0F);
-        Blocks.stained_hardened_clay.setResistance(15.0F);
-
-        Blocks.bed.setHarvestLevel("axe", 0);
-        Blocks.hay_block.setHarvestLevel("axe", 0);
-        Blocks.tnt.setHarvestLevel("pickaxe", 0);
-        Blocks.sponge.setHarvestLevel("axe", 0);
-        Blocks.monster_egg.setHarvestLevel("pickaxe", 0);
-
-        GT_Utility.callMethod(Material.tnt, "func_85158_p", true, false, false);
-        GT_Utility.callMethod(Material.tnt, "setAdventureModeExempt", true, false, false);
-
-        Set tSet = (Set) GT_Utility.getFieldContent(ItemAxe.class, "field_150917_c", true, true);
-        tSet.add(Blocks.bed);
-        tSet.add(Blocks.hay_block);
-        tSet.add(Blocks.sponge);
-
-        tSet = (Set) GT_Utility.getFieldContent(ItemPickaxe.class, "field_150915_c", true, true);
-        tSet.add(Blocks.monster_egg);
-        tSet.add(Blocks.tnt);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java b/src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java
deleted file mode 100644
index a30962631e..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java
+++ /dev/null
@@ -1,369 +0,0 @@
-package gregtech.loaders.postload;
-
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.WeightedRandomChestContent;
-import net.minecraftforge.common.ChestGenHooks;
-
-import gregtech.GT_Mod;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class GT_BookAndLootLoader implements Runnable {
-
-    @Override
-    public void run() {
-        GT_Log.out.println("GT_Mod: Adding worldgenerated Chest Content.");
-        if (GT_Mod.gregtechproxy.mIncreaseDungeonLoot) {
-            ChestGenHooks tChest = ChestGenHooks.getInfo("bonusChest");
-            tChest.setMax(tChest.getMax() + 8);
-            tChest.setMin(tChest.getMin() + 4);
-            tChest = ChestGenHooks.getInfo("dungeonChest");
-            tChest.setMax(tChest.getMax() + 6);
-            tChest.setMin(tChest.getMin() + 3);
-            tChest = ChestGenHooks.getInfo("pyramidDesertyChest");
-            tChest.setMax(tChest.getMax() + 8);
-            tChest.setMin(tChest.getMin() + 4);
-            tChest = ChestGenHooks.getInfo("pyramidJungleChest");
-            tChest.setMax(tChest.getMax() + 16);
-            tChest.setMin(tChest.getMin() + 8);
-            tChest = ChestGenHooks.getInfo("pyramidJungleDispenser");
-            tChest.setMax(tChest.getMax() + 2);
-            tChest.setMin(tChest.getMin() + 1);
-            tChest = ChestGenHooks.getInfo("mineshaftCorridor");
-            tChest.setMax(tChest.getMax() + 4);
-            tChest.setMin(tChest.getMin() + 2);
-            tChest = ChestGenHooks.getInfo("villageBlacksmith");
-            tChest.setMax(tChest.getMax() + 12);
-            tChest.setMin(tChest.getMin() + 6);
-            tChest = ChestGenHooks.getInfo("strongholdCrossing");
-            tChest.setMax(tChest.getMax() + 8);
-            tChest.setMin(tChest.getMin() + 4);
-            tChest = ChestGenHooks.getInfo("strongholdCorridor");
-            tChest.setMax(tChest.getMax() + 6);
-            tChest.setMin(tChest.getMin() + 3);
-            tChest = ChestGenHooks.getInfo("strongholdLibrary");
-            tChest.setMax(tChest.getMax() + 16);
-            tChest.setMin(tChest.getMin() + 8);
-        }
-        ChestGenHooks
-            .addItem("bonusChest", new WeightedRandomChestContent(ItemList.Bottle_Purple_Drink.get(1L), 8, 16, 2));
-
-        ChestGenHooks
-            .addItem("dungeonChest", new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 20));
-        ChestGenHooks
-            .addItem("dungeonChest", new WeightedRandomChestContent(ItemList.Bottle_Purple_Drink.get(1L), 8, 16, 80));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
-                1,
-                6,
-                120));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Lead, 1L), 1, 6, 30));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L), 1, 6, 60));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
-                1,
-                6,
-                60));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Manganese, 1L),
-                1,
-                6,
-                60));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.DamascusSteel, 1L),
-                1,
-                6,
-                10));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L), 1, 6, 20));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 1, 6, 20));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L),
-                1,
-                6,
-                20));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
-                1,
-                6,
-                20));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 1, 6, 20));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
-                1,
-                6,
-                40));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
-                1,
-                6,
-                40));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neodymium, 1L),
-                1,
-                6,
-                40));
-        ChestGenHooks.addItem(
-            "dungeonChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L), 1, 3, 40));
-
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 2));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
-                4,
-                16,
-                12));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Platinum, 1L),
-                2,
-                8,
-                4));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 2, 8, 2));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 2, 8, 2));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
-                2,
-                8,
-                2));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 2, 8, 2));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
-                2,
-                8,
-                4));
-        ChestGenHooks.addItem(
-            "pyramidDesertyChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
-                2,
-                8,
-                4));
-
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(ItemList.Coin_Gold_Ancient.get(1L), 16, 64, 10));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(ItemList.ZPM.getWithCharge(1L, 2147483647), 1, 1, 1));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
-                4,
-                16,
-                12));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 2, 8, 2));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 2, 8, 2));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
-                2,
-                8,
-                2));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 2, 8, 2));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
-                2,
-                8,
-                4));
-        ChestGenHooks.addItem(
-            "pyramidJungleChest",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
-                2,
-                8,
-                4));
-
-        ChestGenHooks.addItem(
-            "pyramidJungleDispenser",
-            new WeightedRandomChestContent(new ItemStack(Items.fire_charge, 1), 2, 8, 30));
-
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
-                1,
-                4,
-                12));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Lead, 1L), 1, 4, 3));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L), 1, 4, 6));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L), 1, 4, 6));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 1, 4, 2));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
-                1,
-                4,
-                2));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 1, 4, 2));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
-                1,
-                4,
-                4));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
-                1,
-                4,
-                4));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 1, 4, 2));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L), 1, 4, 2));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.DamascusSteel, 1L),
-                1,
-                4,
-                1));
-        ChestGenHooks.addItem(
-            "mineshaftCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.DamascusSteel, 1L),
-                1,
-                4,
-                1));
-
-        ChestGenHooks
-            .addItem("villageBlacksmith", new WeightedRandomChestContent(ItemList.McGuffium_239.get(1L), 1, 1, 1));
-        ChestGenHooks.addItem(
-            "villageBlacksmith",
-            new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L), 1, 4, 6));
-        ChestGenHooks.addItem(
-            "villageBlacksmith",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neodymium, 1L),
-                2,
-                8,
-                6));
-        ChestGenHooks.addItem(
-            "villageBlacksmith",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Manganese, 1L),
-                2,
-                8,
-                12));
-        ChestGenHooks.addItem(
-            "villageBlacksmith",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
-                4,
-                12,
-                12));
-        ChestGenHooks.addItem(
-            "villageBlacksmith",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
-                4,
-                12,
-                12));
-        ChestGenHooks.addItem(
-            "villageBlacksmith",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Brass, 1L),
-                4,
-                12,
-                12));
-        ChestGenHooks.addItem(
-            "villageBlacksmith",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.DamascusSteel, 1L),
-                4,
-                12,
-                1));
-
-        ChestGenHooks
-            .addItem("strongholdCrossing", new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 6));
-        ChestGenHooks
-            .addItem("strongholdCrossing", new WeightedRandomChestContent(ItemList.McGuffium_239.get(1L), 1, 1, 10));
-
-        ChestGenHooks.addItem(
-            "strongholdCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.DamascusSteel, 1L),
-                1,
-                4,
-                6));
-        ChestGenHooks.addItem(
-            "strongholdCorridor",
-            new WeightedRandomChestContent(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.DamascusSteel, 1L),
-                1,
-                4,
-                6));
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
deleted file mode 100644
index fff50aff2f..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
+++ /dev/null
@@ -1,2013 +0,0 @@
-package gregtech.loaders.postload;
-
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.enums.Mods.GraviSuite;
-import static gregtech.api.enums.Mods.IndustrialCraft2;
-import static gregtech.api.enums.Mods.NotEnoughItems;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-import gregtech.GT_Mod;
-import gregtech.api.enums.Dyes;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OreDictNames;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.ToolDictNames;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import ic2.core.Ic2Items;
-
-public class GT_CraftingRecipeLoader implements Runnable {
-
-    private static final String aTextIron1 = "X X";
-    private static final String aTextIron2 = "XXX";
-    private static final long bits_no_remove_buffered = GT_ModHandler.RecipeBits.NOT_REMOVABLE
-        | GT_ModHandler.RecipeBits.BUFFERED;
-    private static final long bits = GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE
-        | GT_ModHandler.RecipeBits.BUFFERED;
-    private static final String aTextPlateWrench = "PwP";
-
-    @Override
-    public void run() {
-        GT_Log.out.println("GT_Mod: Adding nerfed Vanilla Recipes.");
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.bucket, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "XhX", " X ", 'X', OrePrefixes.plate.get(Materials.AnyIron) });
-        ItemStack tMat = new ItemStack(Items.iron_ingot);
-        {
-            ItemStack tStack;
-            if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, null, null, null, null, null, null, null))) {
-                GT_ModHandler.addCraftingRecipe(
-                    tStack,
-                    bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
-                    new Object[] { "ShS", "XZX", "SdS", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
-                        OrePrefixes.screw.get(Materials.Steel), 'Z', OrePrefixes.spring.get(Materials.Steel) });
-            }
-        }
-        {
-            ItemStack tStack;
-            if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, null, tMat, tMat, null, tMat, tMat, null))) {
-                GT_ModHandler.addCraftingRecipe(
-                    tStack,
-                    bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
-                    new Object[] { "XX ", "XXh", "XX ", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
-                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
-            }
-        }
-        {
-            ItemStack tStack;
-            if (null != (tStack = GT_ModHandler.removeRecipe(tMat, null, tMat, tMat, null, tMat, tMat, tMat, tMat))) {
-                GT_ModHandler.addCraftingRecipe(
-                    tStack,
-                    bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
-                    new Object[] { aTextIron1, "XhX", aTextIron2, 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
-                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
-            }
-        }
-        {
-            ItemStack tStack;
-            if (null != (tStack = GT_ModHandler
-                .removeRecipe(tMat, null, tMat, tMat, new ItemStack(Blocks.chest, 1, 0), tMat, null, tMat, null))) {
-                GT_ModHandler.addCraftingRecipe(
-                    tStack,
-                    bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
-                    new Object[] { "XwX", "XCX", " X ", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
-                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron), 'C',
-                        "craftingChest" });
-            }
-        }
-        {
-            ItemStack tStack;
-            if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, tMat, tMat, tMat, tMat, null, null, null))) {
-                tStack.stackSize /= 2;
-                GT_ModHandler.addCraftingRecipe(
-                    tStack,
-                    bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
-                    new Object[] { " w ", aTextIron2, aTextIron2, 'X', OrePrefixes.stick.get(Materials.AnyIron), 'S',
-                        OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
-            }
-        }
-
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("ironFence", 6L),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE,
-            new Object[] { aTextIron2, aTextIron2, " w ", 'X', OrePrefixes.stick.get(Materials.AnyIron), 'S',
-                OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
-
-        tMat = new ItemStack(Items.gold_ingot);
-        {
-            ItemStack tStack;
-            if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, null, null, null, null, null, null, null))) {
-                GT_ModHandler.addCraftingRecipe(
-                    tStack,
-                    bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
-                    new Object[] { "ShS", "XZX", "SdS", 'X', OrePrefixes.plate.get(Materials.Gold), 'S',
-                        OrePrefixes.screw.get(Materials.Steel), 'Z', OrePrefixes.spring.get(Materials.Steel) });
-            }
-        }
-        tMat = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1L);
-        {
-            ItemStack tStack;
-            if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, tMat, tMat, tMat, tMat, null, null, null))) {
-                GT_ModHandler.addCraftingRecipe(
-                    tStack,
-                    bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
-                    new Object[] { aTextIron2, aTextIron2, 'X', OrePrefixes.plate.get(Materials.Rubber) });
-            }
-        }
-        GT_ModHandler.removeRecipeByOutputDelayed(ItemList.Bottle_Empty.get(1L));
-        GT_ModHandler.removeRecipeByOutputDelayed(ItemList.IC2_Spray_WeedEx.get(1L));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("reBattery", 1L));
-        GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Blocks.tnt));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("dynamite", 1L));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("industrialTnt", 1L));
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 0));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 1));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 2));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 3));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 4));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 5));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 6));
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 0));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 1));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 2));
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 4));
-
-        ItemStack tStack = GT_ModHandler
-            .removeRecipe(new ItemStack(Blocks.planks, 1, 0), null, null, new ItemStack(Blocks.planks, 1, 0));
-        if (tStack != null) {
-            GT_ModHandler.addCraftingRecipe(
-                GT_Utility.copyAmount(
-                    GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
-                    tStack),
-                bits_no_remove_buffered,
-                new Object[] { "s", "P", "P", 'P', OrePrefixes.plank.get(Materials.Wood) });
-            GT_ModHandler.addCraftingRecipe(
-                GT_Utility.copyAmount(
-                    GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize / 2 : tStack.stackSize,
-                    tStack),
-                bits_no_remove_buffered,
-                new Object[] { "P", "P", 'P', OrePrefixes.plank.get(Materials.Wood) });
-        }
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.stone_button, 2, 0),
-            bits_no_remove_buffered,
-            new Object[] { "S", "S", 'S', OrePrefixes.stone });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.stone_button, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.stone });
-
-        GT_Log.out.println("GT_Mod: Adding Vanilla Convenience Recipes.");
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.stonebrick, 1, 3),
-            bits_no_remove_buffered,
-            new Object[] { "f", "X", 'X', new ItemStack(Blocks.double_stone_slab, 1, 8) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.gravel, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "h", "X", 'X', new ItemStack(Blocks.cobblestone, 1, 0) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.sand, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "h", "X", 'X', new ItemStack(Blocks.gravel, 1, 0) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.cobblestone, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "h", "X", 'X', new ItemStack(Blocks.stone, 1, 0) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.stonebrick, 1, 2),
-            bits_no_remove_buffered,
-            new Object[] { "h", "X", 'X', new ItemStack(Blocks.stonebrick, 1, 0) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.double_stone_slab, 1, 8),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.double_stone_slab, 1, 0) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.double_stone_slab, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.double_stone_slab, 1, 8) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.double_stone_slab, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 0) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.cobblestone, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 3) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.brick_block, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 4) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.stonebrick, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 5) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.nether_brick, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 6) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.quartz_block, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 7) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.double_stone_slab, 1, 8),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 8) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 0) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 1),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 1) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 2),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 2) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 3),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 3) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 4),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 4) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 5),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 5) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 6),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 6) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.planks, 1, 7),
-            bits_no_remove_buffered,
-            new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 7) });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.stick, 2, 0),
-            bits_no_remove_buffered,
-            new Object[] { "s", "X", 'X', new ItemStack(Blocks.deadbush, 1, 32767) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.stick, 2, 0),
-            bits_no_remove_buffered,
-            new Object[] { "s", "X", 'X', new ItemStack(Blocks.tallgrass, 1, 0) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.stick, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { "s", "X", 'X', OrePrefixes.treeSapling });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.comparator, 1, 0),
-            bits_no_remove_buffered,
-            new Object[] { " T ", "TQT", "SSS", 'Q', OreDictNames.craftingQuartz, 'S', OrePrefixes.stoneSmooth, 'T',
-                OreDictNames.craftingRedstoneTorch });
-
-        GT_Log.out.println("GT_Mod: Adding Tool Recipes.");
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.minecart, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { " h ", "PwP", "WPW", 'P', OrePrefixes.plate.get(Materials.AnyIron), 'W',
-                ItemList.Component_Minecart_Wheels_Iron });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.minecart, 1),
-            bits_no_remove_buffered,
-            new Object[] { " h ", "PwP", "WPW", 'P', OrePrefixes.plate.get(Materials.Steel), 'W',
-                ItemList.Component_Minecart_Wheels_Steel });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.chest_minecart, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', OreDictNames.craftingChest });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.furnace_minecart, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', OreDictNames.craftingFurnace });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.hopper_minecart, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X',
-                new ItemStack(Blocks.hopper, 1, 32767) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.tnt_minecart, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', new ItemStack(Blocks.tnt, 1, 32767) });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.chainmail_helmet, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "RRR", "RhR", 'R', OrePrefixes.ring.get(Materials.Steel) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.chainmail_chestplate, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "RhR", "RRR", "RRR", 'R', OrePrefixes.ring.get(Materials.Steel) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.chainmail_leggings, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "RRR", "RhR", "R R", 'R', OrePrefixes.ring.get(Materials.Steel) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.chainmail_boots, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
-                | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "R R", "RhR", 'R', OrePrefixes.ring.get(Materials.Steel) });
-
-        GT_Log.out.println("GT_Mod: Adding Wool and Color releated Recipes.");
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 1),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeOrange });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 2),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeMagenta });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 3),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLightBlue });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 4),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeYellow });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 5),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLime });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 6),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyePink });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 7),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeGray });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 8),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLightGray });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 9),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeCyan });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 10),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyePurple });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 11),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBlue });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 12),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBrown });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 13),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeGreen });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 14),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeRed });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Blocks.wool, 1, 15),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBlack });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.stained_glass, 8, 0),
-            bits_no_remove_buffered,
-            new Object[] { "GGG", "GDG", "GGG", 'G', new ItemStack(Blocks.glass, 1), 'D', Dyes.dyeWhite });
-
-        GT_Log.out.println("GT_Mod: Putting a Potato on a Stick.");
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Packaged_PotatoChips.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.foil.get(Materials.Aluminium), ItemList.Food_PotatoChips });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Packaged_ChiliChips.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.foil.get(Materials.Aluminium), ItemList.Food_ChiliChips });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Packaged_Fries.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.plateDouble.get(Materials.Paper), ItemList.Food_Fries });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Chum_On_Stick.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Chum });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Potato_On_Stick.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Raw_Potato });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Potato_On_Stick_Roasted.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Baked_Potato });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Dough.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.bucket.get(Materials.Water), OrePrefixes.dust.get(Materials.Wheat) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Dough_Sugar.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Sugar) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Dough_Chocolate.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Cocoa) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Dough_Chocolate.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Chocolate) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Flat_Dough.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "foodDough", ToolDictNames.craftingToolRollingPin });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Raw_Bun.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "foodDough" });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Raw_Bread.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "foodDough", "foodDough" });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Raw_Baguette.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "foodDough", "foodDough", "foodDough" });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Raw_Cake.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Dough_Sugar, ItemList.Food_Dough_Sugar, ItemList.Food_Dough_Sugar,
-                ItemList.Food_Dough_Sugar });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_ChiliChips.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_PotatoChips, OrePrefixes.dust.get(Materials.Chili) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sliced_Buns.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sliced_Breads.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sliced_Baguettes.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sliced_Bun.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Buns });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sliced_Bread.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Breads });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sliced_Baguette.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguettes });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Veggie.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
-                ItemList.Food_Sliced_Onion });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Cheese.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Meat.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Buns, OrePrefixes.dust.get(Materials.MeatCooked) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Chum.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Chum });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Veggie.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Cucumber,
-                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Cheese.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Meat.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun,
-                OrePrefixes.dust.get(Materials.MeatCooked) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Burger_Chum.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Chum });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Veggie.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Breads, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber,
-                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Cheese.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Breads, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Bacon.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Breads, new ItemStack(Items.cooked_porkchop, 1) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Steak.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Breads, new ItemStack(Items.cooked_beef, 1) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Veggie.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Cucumber,
-                ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato,
-                ItemList.Food_Sliced_Onion });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Cheese.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Bacon.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread,
-                new ItemStack(Items.cooked_porkchop, 1) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Sandwich_Steak.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread,
-                new ItemStack(Items.cooked_beef, 1) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Veggie.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguettes, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber,
-                ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato,
-                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Cheese.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguettes, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Bacon.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguettes, new ItemStack(Items.cooked_porkchop, 1),
-                new ItemStack(Items.cooked_porkchop, 1) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Steak.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguettes, new ItemStack(Items.cooked_beef, 1),
-                new ItemStack(Items.cooked_beef, 1) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Veggie.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Cucumber,
-                ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
-                ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Cheese.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Bacon.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette,
-                new ItemStack(Items.cooked_porkchop, 1), new ItemStack(Items.cooked_porkchop, 1) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Large_Sandwich_Steak.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette,
-                new ItemStack(Items.cooked_beef, 1), new ItemStack(Items.cooked_beef, 1) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Raw_Pizza_Veggie.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Flat_Dough, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
-                ItemList.Food_Sliced_Onion });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Raw_Pizza_Cheese.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Flat_Dough, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
-                ItemList.Food_Sliced_Cheese });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            ItemList.Food_Raw_Pizza_Meat.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { ItemList.Food_Flat_Dough, OrePrefixes.dust.get(Materials.MeatCooked) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Cheese.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', "foodCheese" });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Lemon.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', "cropLemon" });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Tomato.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', "cropTomato" });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Onion.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', "cropOnion" });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Cucumber.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', "cropCucumber" });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Bun.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', ItemList.Food_Baked_Bun });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Bread.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', ItemList.Food_Baked_Bread });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Sliced_Baguette.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', ItemList.Food_Baked_Baguette });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Raw_PotatoChips.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', "cropPotato" });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Raw_Cookie.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "kX", 'X', ItemList.Food_Dough_Chocolate });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Food_Raw_Fries.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "k", "X", 'X', "cropPotato" });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.bowl, 1),
-            bits_no_remove_buffered,
-            new Object[] { "k", "X", 'X', OrePrefixes.plank.get(Materials.Wood) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Rubber, 1L),
-            bits_no_remove_buffered,
-            new Object[] { "k", "X", 'X', OrePrefixes.plate.get(Materials.Rubber) });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.arrow, 1),
-            bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
-            new Object[] { "  H", " S ", "F  ", 'H', new ItemStack(Items.flint, 1, 32767), 'S',
-                OrePrefixes.stick.get(Materials.Wood), 'F', OreDictNames.craftingFeather });
-
-        GT_ModHandler.removeRecipe(
-            new ItemStack(Blocks.planks),
-            null,
-            new ItemStack(Blocks.planks),
-            null,
-            new ItemStack(Blocks.planks));
-        GT_ModHandler.removeRecipeByOutputDelayed(ItemList.Food_Baked_Bread.get(1L));
-        GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.cookie, 1));
-        GT_ModHandler.removeRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L));
-        if (null != GT_Utility.setStack(
-            GT_ModHandler.getRecipeOutput(
-                true,
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
-                null,
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L)),
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L))) {
-            GT_Log.out.println("GT_Mod: Changed Forestrys Bronze Recipe");
-        }
-        tStack = GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L);
-
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getRecipeOutput(
-                null,
-                new ItemStack(Blocks.sand, 1, 0),
-                null,
-                null,
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Apatite, 1L),
-                null,
-                null,
-                new ItemStack(Blocks.sand, 1, 0),
-                null),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "S", "A", "S", 'A', OrePrefixes.dust.get(Materials.Apatite), 'S',
-                new ItemStack(Blocks.sand, 1, 32767) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getRecipeOutput(
-                tStack,
-                tStack,
-                tStack,
-                tStack,
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Apatite, 1L),
-                tStack,
-                tStack,
-                tStack,
-                tStack),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "SSS", "SAS", "SSS", 'A', OrePrefixes.dust.get(Materials.Apatite), 'S',
-                OrePrefixes.dust.get(Materials.Ash) });
-
-        GT_Log.out.println("GT_Mod: Adding Mixed Metal Ingot Recipes.");
-        GT_ModHandler.removeRecipeByOutputDelayed(ItemList.IC2_Mixed_Metal_Ingot.get(1L));
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(1L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(2L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(3L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(4L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(6L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(5L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(6L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(8L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(8L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(8L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(10L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Tin) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(10L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(10L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(12L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(12L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(12L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(14L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z',
-                OrePrefixes.plate.get(Materials.AnnealedCopper) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(14L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(14L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(16L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z',
-                OrePrefixes.plate.get(Materials.AnnealedCopper) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(16L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(16L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
-                OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(18L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(18L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(18L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
-                OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(20L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
-                OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(20L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
-                OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(20L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
-                OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Long_Distance_Pipeline_Fluid.get(1L),
-            GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
-            new Object[] { "GPG", "IwI", "GPG", 'G', GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 1L),
-                'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L), 'I',
-                GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Steel, 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Long_Distance_Pipeline_Item.get(1L),
-            GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
-            new Object[] { "GPG", "IwI", "GPG", 'G', GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 1L),
-                'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L), 'I',
-                GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Tin, 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(32L),
-            GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
-            new Object[] { "PPP", "IwI", "PPP", 'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
-                'I', GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Long_Distance_Pipeline_Item_Pipe.get(32L),
-            GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
-            new Object[] { "PPP", "IwI", "PPP", 'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
-                'I', GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Tin, 1L) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(22L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
-                OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSG) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(24L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
-                OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSE) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(26L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
-                OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(28L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
-                OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSE) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(30L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
-                OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSG) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(32L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
-                OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(34L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
-                OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(36L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
-                OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(38L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
-                OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.Draconium) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(40L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
-                OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(42L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
-                OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(44L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
-                OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.Draconium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(48L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
-                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(52L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
-                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(56L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
-                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.IC2_Mixed_Metal_Ingot.get(64L),
-            bits_no_remove_buffered,
-            new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
-                OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.BlackPlutonium) });
-
-        GT_Log.out.println("GT_Mod: Beginning to add regular Crafting Recipes.");
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("scaffold", 4L),
-            bits_no_remove_buffered,
-            new Object[] { "WWW", " S ", "S S", 'W', OrePrefixes.plank.get(Materials.Wood), 'S',
-                OrePrefixes.stick.get(Materials.Wood) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.stick.get(Materials.AnyIron), OrePrefixes.dust.get(Materials.Redstone),
-                OrePrefixes.dust.get(Materials.Redstone), OrePrefixes.dust.get(Materials.Redstone),
-                OrePrefixes.dust.get(Materials.Redstone) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Paper, 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PPk", 'P', OrePrefixes.plate.get(Materials.Paper) });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.torch, 2),
-            bits_no_remove_buffered,
-            new Object[] { "C", "S", 'C', OrePrefixes.dust.get(Materials.Sulfur), 'S',
-                OrePrefixes.stick.get(Materials.Wood) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.torch, 6),
-            bits_no_remove_buffered,
-            new Object[] { "C", "S", 'C', OrePrefixes.dust.get(Materials.TricalciumPhosphate), 'S',
-                OrePrefixes.stick.get(Materials.Wood) });
-
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.piston, 1),
-            bits_no_remove_buffered,
-            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
-                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
-                OrePrefixes.ingot.get(Materials.AnyIron) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.piston, 1),
-            bits_no_remove_buffered,
-            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
-                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
-                OrePrefixes.ingot.get(Materials.AnyBronze) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.piston, 1),
-            bits_no_remove_buffered,
-            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
-                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
-                OrePrefixes.ingot.get(Materials.Aluminium) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.piston, 1),
-            bits_no_remove_buffered,
-            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
-                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
-                OrePrefixes.ingot.get(Materials.Steel) });
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Blocks.piston, 1),
-            bits_no_remove_buffered,
-            new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
-                OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
-                OrePrefixes.ingot.get(Materials.Titanium) });
-
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("reactorVent", 1L, 1),
-            bits_no_remove_buffered,
-            new Object[] { "AIA", "I I", "AIA", 'I', new ItemStack(Blocks.iron_bars, 1), 'A',
-                OrePrefixes.plate.get(Materials.Aluminium) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_ModHandler.getIC2Item("reactorPlatingExplosive", 1L),
-            bits_no_remove_buffered,
-            new Object[] { GT_ModHandler.getIC2Item("reactorPlating", 1L), OrePrefixes.plate.get(Materials.Lead) });
-        if (!Materials.Steel.mBlastFurnaceRequired) {
-            GT_ModHandler.addShapelessCraftingRecipe(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1L),
-                bits_no_remove_buffered,
-                new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Coal),
-                    OrePrefixes.dust.get(Materials.Coal) });
-        }
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1L));
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 3L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
-                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Zinc) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Brass, 9L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
-                OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Zinc) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 3L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
-                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Tin) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Bronze, 9L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
-                OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tin) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Invar, 9L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Iron),
-                OrePrefixes.dust.get(Materials.Nickel) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Cupronickel, 6L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Nickel), OrePrefixes.dust.get(Materials.AnyCopper) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RoseGold, 4L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Gold),
-                OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Gold),
-                OrePrefixes.dust.get(Materials.AnyCopper) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SterlingSilver, 4L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Silver), OrePrefixes.dust.get(Materials.Silver),
-                OrePrefixes.dust.get(Materials.Silver), OrePrefixes.dust.get(Materials.Silver),
-                OrePrefixes.dust.get(Materials.AnyCopper) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackBronze, 4L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Silver),
-                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
-                OrePrefixes.dust.get(Materials.AnyCopper) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BismuthBronze, 4L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Bismuth), OrePrefixes.dust.get(Materials.Zinc),
-                OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
-                OrePrefixes.dust.get(Materials.AnyCopper) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CobaltBrass, 8L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
-                OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
-                OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
-                OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Aluminium),
-                OrePrefixes.dust.get(Materials.Cobalt) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DamascusSteel, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dustSmall.get(Materials.Nickel),
-                OrePrefixes.dustSmall.get(Materials.Nickel), OrePrefixes.dustSmall.get(Materials.Nickel),
-                OrePrefixes.dustTiny.get(Materials.Coal), OrePrefixes.dustTiny.get(Materials.Silicon),
-                OrePrefixes.dustTiny.get(Materials.Manganese), OrePrefixes.dustTiny.get(Materials.Chrome),
-                OrePrefixes.dustTiny.get(Materials.Molybdenum) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DamascusSteel, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dustSmall.get(Materials.Manganese),
-                OrePrefixes.dustSmall.get(Materials.Manganese), OrePrefixes.dustSmall.get(Materials.Chrome),
-                OrePrefixes.dustSmall.get(Materials.Chrome), OrePrefixes.dustTiny.get(Materials.Coal),
-                OrePrefixes.dustTiny.get(Materials.Silicon), OrePrefixes.dustTiny.get(Materials.Vanadium) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RedstoneAlloy, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Redstone), OrePrefixes.dust.get(Materials.Silicon),
-                OrePrefixes.dust.get(Materials.Coal) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CrudeSteel, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Clay), OrePrefixes.dust.get(Materials.Flint),
-                OrePrefixes.dust.get(Materials.Stone) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ConductiveIron, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.RedstoneAlloy), OrePrefixes.dust.get(Materials.Iron),
-                OrePrefixes.dust.get(Materials.Silver) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnergeticAlloy, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.ConductiveIron), OrePrefixes.dust.get(Materials.Gold),
-                OrePrefixes.dust.get(Materials.BlackSteel) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnergeticSilver, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.ConductiveIron), OrePrefixes.dust.get(Materials.Silver),
-                OrePrefixes.dust.get(Materials.BlackSteel) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectricalSteel, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dust.get(Materials.Coal),
-                OrePrefixes.dust.get(Materials.Silicon) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Soularium, 2L),
-            bits_no_remove_buffered,
-            new Object[] { new ItemStack(Blocks.soul_sand, 1, 32767), OrePrefixes.dust.get(Materials.Gold),
-                OrePrefixes.dust.get(Materials.Ash) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkSteel, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.ElectricalSteel), OrePrefixes.dust.get(Materials.Coal),
-                OrePrefixes.dust.get(Materials.Obsidian) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Manyullyn, 3L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Ardite), OrePrefixes.dust.get(Materials.Ardite),
-                OrePrefixes.dust.get(Materials.Ardite), OrePrefixes.dust.get(Materials.Ardite),
-                OrePrefixes.dust.get(Materials.Cobalt), OrePrefixes.dust.get(Materials.Cobalt),
-                OrePrefixes.dust.get(Materials.Cobalt), OrePrefixes.dust.get(Materials.Cobalt) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Haderoth, 1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Rubracium), OrePrefixes.dust.get(Materials.Mithril) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Celenegil, 1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Platinum), OrePrefixes.dust.get(Materials.Orichalcum) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.LiveRoot),
-                OrePrefixes.dustTiny.get(Materials.Gold) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Hepatizon, 3L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Copper), OrePrefixes.dust.get(Materials.Copper),
-                OrePrefixes.dust.get(Materials.Copper), OrePrefixes.dustTiny.get(Materials.Gold),
-                OrePrefixes.dustTiny.get(Materials.Gold), OrePrefixes.dustTiny.get(Materials.Gold),
-                OrePrefixes.dustTiny.get(Materials.Silver), OrePrefixes.dustTiny.get(Materials.Silver),
-                OrePrefixes.dustTiny.get(Materials.Silver) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Angmallen, 2L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Gold) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Inolashite, 1L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Alduorite), OrePrefixes.dust.get(Materials.Ceruclase) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Items.gunpowder, 6),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Coal), OrePrefixes.dust.get(Materials.Coal),
-                OrePrefixes.dust.get(Materials.Coal), OrePrefixes.dust.get(Materials.Sulfur),
-                OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Items.gunpowder, 6),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Charcoal), OrePrefixes.dust.get(Materials.Charcoal),
-                OrePrefixes.dust.get(Materials.Charcoal), OrePrefixes.dust.get(Materials.Sulfur),
-                OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            new ItemStack(Items.gunpowder, 6),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Carbon), OrePrefixes.dust.get(Materials.Carbon),
-                OrePrefixes.dust.get(Materials.Carbon), OrePrefixes.dust.get(Materials.Sulfur),
-                OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IndiumGalliumPhosphide, 3L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Indium), OrePrefixes.dust.get(Materials.Gallium),
-                OrePrefixes.dust.get(Materials.Phosphorus) });
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 5L),
-            bits_no_remove_buffered,
-            new Object[] { OrePrefixes.dust.get(Materials.Potassium), OrePrefixes.cell.get(Materials.Nitrogen),
-                OrePrefixes.cell.get(Materials.Oxygen), OrePrefixes.cell.get(Materials.Oxygen),
-                OrePrefixes.cell.get(Materials.Oxygen) });
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("carbonFiber", 1L));
-
-        ItemStack[] tChestAndTank = new ItemStack[] { ItemList.Super_Chest_EV.get(1), ItemList.Super_Chest_IV.get(1),
-            ItemList.Super_Chest_HV.get(1), ItemList.Super_Chest_MV.get(1), ItemList.Super_Chest_LV.get(1),
-            ItemList.Quantum_Chest_EV.get(1), ItemList.Quantum_Chest_IV.get(1), ItemList.Quantum_Chest_HV.get(1),
-            ItemList.Quantum_Chest_MV.get(1), ItemList.Quantum_Chest_LV.get(1), ItemList.Super_Tank_EV.get(1),
-            ItemList.Super_Tank_IV.get(1), ItemList.Super_Tank_HV.get(1), ItemList.Super_Tank_MV.get(1),
-            ItemList.Super_Tank_LV.get(1), ItemList.Quantum_Tank_EV.get(1), ItemList.Quantum_Tank_IV.get(1),
-            ItemList.Quantum_Tank_HV.get(1), ItemList.Quantum_Tank_MV.get(1), ItemList.Quantum_Tank_LV.get(1) };
-        for (ItemStack tItem : tChestAndTank) {
-            GT_ModHandler.addShapelessCraftingRecipe(tItem, new Object[] { tItem });
-        }
-
-        List iToRemoveAndHide = Arrays
-            .stream(
-                new String[] { "copperCableItem", "insulatedCopperCableItem", "goldCableItem", "insulatedGoldCableItem",
-                    "insulatedIronCableItem", "glassFiberCableItem", "tinCableItem", "ironCableItem",
-                    "insulatedTinCableItem", "detectorCableItem", "splitterCableItem", "electrolyzer", "cutter" })
-            .map(x -> GT_ModHandler.getIC2Item(x, 1L))
-            .collect(Collectors.toList());
-
-        if (NotEnoughItems.isModLoaded()) {
-            iToRemoveAndHide.forEach(item -> {
-                codechicken.nei.api.API.hideItem(item);
-                GT_ModHandler.removeRecipeByOutputDelayed(item);
-            });
-        }
-
-        Arrays
-            .stream(
-                new String[] { "batBox", "mfeUnit", "lvTransformer", "mvTransformer", "hvTransformer", "evTransformer",
-                    "cesuUnit", "luminator", "teleporter", "energyOMat", "advBattery", "boatElectric", "cropnalyzer",
-                    "coil", "powerunit", "powerunitsmall", "remote", "odScanner", "ovScanner", "solarHelmet",
-                    "staticBoots", "ecMeter", "obscurator", "overclockerUpgrade", "transformerUpgrade",
-                    "energyStorageUpgrade", "ejectorUpgrade", "suBattery", "frequencyTransmitter", "pullingUpgrade" })
-            .map(x -> GT_ModHandler.getIC2Item(x, 1L))
-            .forEach(GT_ModHandler::removeRecipeByOutputDelayed);
-
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("batBox", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PCP", "BBB", "PPP", 'C', OrePrefixes.cableGt01.get(Materials.Tin), 'P',
-                OrePrefixes.plank.get(Materials.Wood), 'B', OrePrefixes.battery.get(Materials.LV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("mfeUnit", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "CEC", "EME", "CEC", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'E',
-                OrePrefixes.battery.get(Materials.IV), 'M', GT_ModHandler.getIC2Item("machine", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("lvTransformer", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PCP", "POP", "PCP", 'C', OrePrefixes.cableGt01.get(Materials.Tin), 'O',
-                GT_ModHandler.getIC2Item("coil", 1L), 'P', OrePrefixes.plank.get(Materials.Wood) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("mvTransformer", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "CMC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'M',
-                GT_ModHandler.getIC2Item("machine", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("hvTransformer", 1L),
-            bits_no_remove_buffered,
-            new Object[] { " C ", "IMB", " C ", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'M',
-                GT_ModHandler.getIC2Item("mvTransformer", 1L), 'I', OrePrefixes.circuit.get(Materials.LV), 'B',
-                OrePrefixes.battery.get(Materials.HV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("evTransformer", 1L),
-            bits_no_remove_buffered,
-            new Object[] { " C ", "IMB", " C ", 'C', OrePrefixes.cableGt01.get(Materials.Aluminium), 'M',
-                GT_ModHandler.getIC2Item("hvTransformer", 1L), 'I', OrePrefixes.circuit.get(Materials.HV), 'B',
-                OrePrefixes.battery.get(Materials.LuV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("cesuUnit", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PCP", "BBB", "PPP", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'P',
-                OrePrefixes.plate.get(Materials.Bronze), 'B', OrePrefixes.battery.get(Materials.HV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("teleporter", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "GFG", "CMC", "GDG", 'C', OrePrefixes.cableGt01.get(Materials.Platinum), 'G',
-                OrePrefixes.circuit.get(Materials.HV), 'D', OrePrefixes.gem.get(Materials.Diamond), 'M',
-                GT_ModHandler.getIC2Item("machine", 1L), 'F', GT_ModHandler.getIC2Item("frequencyTransmitter", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("energyOMat", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "RBR", "CMC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'R',
-                OrePrefixes.dust.get(Materials.Redstone), 'B', OrePrefixes.battery.get(Materials.LV), 'M',
-                GT_ModHandler.getIC2Item("machine", 1L) });
-
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("boatElectric", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "CCC", "XWX", aTextIron2, 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'X',
-                OrePrefixes.plate.get(Materials.Iron), 'W', GT_ModHandler.getIC2Item("waterMill", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("cropnalyzer", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "CC ", "RGR", "RIR", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'R',
-                OrePrefixes.dust.get(Materials.Redstone), 'G', OrePrefixes.block.get(Materials.Glass), 'I',
-                OrePrefixes.circuit.get(Materials.LV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("coil", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "CCC", "CXC", "CCC", 'C', OrePrefixes.wireGt01.get(Materials.Copper), 'X',
-                OrePrefixes.ingot.get(Materials.AnyIron) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("powerunit", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "BCA", "BIM", "BCA", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'B',
-                OrePrefixes.battery.get(Materials.LV), 'A', GT_ModHandler.getIC2Item("casingiron", 1L), 'I',
-                OrePrefixes.circuit.get(Materials.LV), 'M', GT_ModHandler.getIC2Item("elemotor", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("powerunitsmall", 1L),
-            bits_no_remove_buffered,
-            new Object[] { " CA", "BIM", " CA", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'B',
-                OrePrefixes.battery.get(Materials.LV), 'A', GT_ModHandler.getIC2Item("casingiron", 1L), 'I',
-                OrePrefixes.circuit.get(Materials.LV), 'M', GT_ModHandler.getIC2Item("elemotor", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("remote", 1L),
-            bits_no_remove_buffered,
-            new Object[] { " C ", "TLT", " F ", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'L',
-                OrePrefixes.dust.get(Materials.Lapis), 'T', GT_ModHandler.getIC2Item("casingtin", 1L), 'F',
-                GT_ModHandler.getIC2Item("frequencyTransmitter", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("odScanner", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PGP", "CBC", "WWW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'G',
-                OrePrefixes.dust.get(Materials.Glowstone), 'B', OrePrefixes.battery.get(Materials.HV), 'C',
-                OrePrefixes.circuit.get(Materials.HV), 'P', GT_ModHandler.getIC2Item("casinggold", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("ovScanner", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PDP", "GCG", "WSW", 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'G',
-                OrePrefixes.dust.get(Materials.Glowstone), 'D', OrePrefixes.battery.get(Materials.IV), 'C',
-                OrePrefixes.circuit.get(Materials.HV), 'P', GT_ModHandler.getIC2Item("casinggold", 1L), 'S',
-                GT_ModHandler.getIC2Item("odScanner", 1L) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("staticBoots", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "I I", "IWI", "CCC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'I',
-                OrePrefixes.ingot.get(Materials.Iron), 'W', new ItemStack(Blocks.wool) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("ecMeter", 1L),
-            bits_no_remove_buffered,
-            new Object[] { " G ", "CIC", "C C", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'G',
-                OrePrefixes.dust.get(Materials.Glowstone), 'I', OrePrefixes.circuit.get(Materials.LV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("obscurator", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "RER", "CAC", "RRR", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'R',
-                OrePrefixes.dust.get(Materials.Redstone), 'E', OrePrefixes.battery.get(Materials.HV), 'A',
-                OrePrefixes.circuit.get(Materials.HV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("overclockerUpgrade", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "CCC", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'C',
-                GT_ModHandler.getIC2Item("reactorCoolantSimple", 1L, 1), 'E', OrePrefixes.circuit.get(Materials.LV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("transformerUpgrade", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "GGG", "WTW", "GEG", 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'T',
-                GT_ModHandler.getIC2Item("mvTransformer", 1L), 'E', OrePrefixes.circuit.get(Materials.LV), 'G',
-                OrePrefixes.block.get(Materials.Glass) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("energyStorageUpgrade", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PPP", "WBW", "PEP", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'E',
-                OrePrefixes.circuit.get(Materials.LV), 'P', OrePrefixes.plank.get(Materials.Wood), 'B',
-                OrePrefixes.battery.get(Materials.LV) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("ejectorUpgrade", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PHP", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'E',
-                OrePrefixes.circuit.get(Materials.LV), 'P', new ItemStack(Blocks.piston), 'H',
-                new ItemStack(Blocks.hopper) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("suBattery", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "W", "C", "R", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'C',
-                OrePrefixes.dust.get(Materials.HydratedCoal), 'R', OrePrefixes.dust.get(Materials.Redstone) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("pullingUpgrade", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PHP", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'P',
-                new ItemStack(Blocks.sticky_piston), 'R', new ItemStack(Blocks.hopper), 'E',
-                OrePrefixes.circuit.get(Materials.LV) });
-
-        if (NotEnoughItems.isModLoaded()) {
-            codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorUraniumSimple", 1L, 1));
-            codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorUraniumDual", 1L, 1));
-            codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorUraniumQuad", 1L, 1));
-            codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorMOXSimple", 1L, 1));
-            codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorMOXDual", 1L, 1));
-            codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorMOXQuad", 1L, 1));
-        }
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("UranFuel", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "UUU", "NNN", "UUU", 'U', OrePrefixes.ingot.get(Materials.Uranium), 'N',
-                OrePrefixes.nugget.get(Materials.Uranium235) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("MOXFuel", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "UUU", "NNN", "UUU", 'U', OrePrefixes.ingot.get(Materials.Uranium), 'N',
-                OrePrefixes.ingot.get(Materials.Plutonium) });
-
-        GT_ModHandler.removeRecipeByOutputDelayed(Ic2Items.miningLaser.copy());
-        GT_ModHandler.addCraftingRecipe(
-            Ic2Items.miningLaser.copy(),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
-                OrePrefixes.gemExquisite.get(Materials.Diamond), 'E', ItemList.Emitter_HV, 'C',
-                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
-                new ItemStack(
-                    Ic2Items.chargingEnergyCrystal.copy()
-                        .getItem(),
-                    1,
-                    GT_Values.W) });
-        GT_ModHandler.addCraftingRecipe(
-            Ic2Items.miningLaser.copy(),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
-                OrePrefixes.gemExquisite.get(Materials.Ruby), 'E', ItemList.Emitter_HV, 'C',
-                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
-                new ItemStack(
-                    Ic2Items.chargingEnergyCrystal.copy()
-                        .getItem(),
-                    1,
-                    GT_Values.W) });
-        GT_ModHandler.addCraftingRecipe(
-            Ic2Items.miningLaser.copy(),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
-                OrePrefixes.gemExquisite.get(Materials.Jasper), 'E', ItemList.Emitter_HV, 'C',
-                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
-                new ItemStack(
-                    Ic2Items.chargingEnergyCrystal.copy()
-                        .getItem(),
-                    1,
-                    GT_Values.W) });
-        GT_ModHandler.addCraftingRecipe(
-            Ic2Items.miningLaser.copy(),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
-                OrePrefixes.gemExquisite.get(Materials.GarnetRed), 'E', ItemList.Emitter_HV, 'C',
-                OrePrefixes.circuit.get(Materials.IV), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
-                new ItemStack(
-                    Ic2Items.chargingEnergyCrystal.copy()
-                        .getItem(),
-                    1,
-                    GT_Values.W) });
-
-        GT_ModHandler.removeRecipeDelayed(GT_ModHandler.getIC2Item("miningPipe", 8));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("miningPipe", 1),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "hPf", 'P', OrePrefixes.pipeSmall.get(Materials.Steel) });
-
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("luminator", 16L),
-            bits_no_remove_buffered,
-            new Object[] { "RTR", "GHG", "GGG", 'H', OrePrefixes.cell.get(Materials.Helium), 'T',
-                OrePrefixes.ingot.get(Materials.Tin), 'R', OrePrefixes.ingot.get(Materials.AnyIron), 'G',
-                new ItemStack(Blocks.glass, 1) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("luminator", 16L),
-            bits_no_remove_buffered,
-            new Object[] { "RTR", "GHG", "GGG", 'H', OrePrefixes.cell.get(Materials.Mercury), 'T',
-                OrePrefixes.ingot.get(Materials.Tin), 'R', OrePrefixes.ingot.get(Materials.AnyIron), 'G',
-                new ItemStack(Blocks.glass, 1) });
-
-        GT_ModHandler.removeRecipeDelayed(
-            tStack = GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
-            tStack,
-            tStack,
-            tStack,
-            new ItemStack(Items.coal, 1, 0),
-            tStack,
-            tStack,
-            tStack,
-            tStack);
-        GT_ModHandler.removeRecipeDelayed(
-            tStack = GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
-            tStack,
-            tStack,
-            tStack,
-            new ItemStack(Items.coal, 1, 1),
-            tStack,
-            tStack,
-            tStack,
-            tStack);
-        GT_ModHandler.removeRecipeDelayed(
-            null,
-            tStack = new ItemStack(Items.coal, 1),
-            null,
-            tStack,
-            GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L),
-            tStack,
-            null,
-            tStack,
-            null);
-
-        GT_ModHandler.removeFurnaceSmelting(new ItemStack(Blocks.hopper));
-
-        GT_Log.out.println("GT_Mod: Applying harder Recipes for several Blocks."); // TODO: Not Buffered
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("reactorReflectorThick", 1L, 1));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("reactorReflectorThick", 1L, 1),
-            bits_no_remove_buffered,
-            new Object[] { " N ", "NBN", " N ", 'B', OrePrefixes.plateDouble.get(Materials.Beryllium), 'N',
-                GT_ModHandler.getIC2Item("reactorReflector", 1L, 1) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("reactorReflectorThick", 1L, 1),
-            bits_no_remove_buffered,
-            new Object[] { " B ", "NCN", " B ", 'B', OrePrefixes.plate.get(Materials.Beryllium), 'N',
-                GT_ModHandler.getIC2Item("reactorReflector", 1L, 1), 'C',
-                OrePrefixes.plate.get(Materials.TungstenCarbide) });
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("reactorReflector", 1L, 1));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("reactorReflector", 1L, 1),
-            bits_no_remove_buffered,
-            new Object[] { "TGT", "GSG", "TGT", 'T', OrePrefixes.plate.get(Materials.Tin), 'G',
-                OrePrefixes.dust.get(Materials.Graphite), 'S', OrePrefixes.plateDouble.get(Materials.Steel) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("reactorReflector", 1L, 1),
-            bits_no_remove_buffered,
-            new Object[] { "TTT", "GSG", "TTT", 'T', OrePrefixes.plate.get(Materials.TinAlloy), 'G',
-                OrePrefixes.dust.get(Materials.Graphite), 'S', OrePrefixes.plate.get(Materials.Beryllium) });
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("crophavester", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("crophavester", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "ACA", "PMS", "WOW", 'M', ItemList.Hull_MV, 'C', OrePrefixes.circuit.get(Materials.MV), 'A',
-                ItemList.Robot_Arm_LV, 'P', ItemList.Electric_Piston_LV, 'S', ItemList.Sensor_LV, 'W',
-                OrePrefixes.toolHeadSense.get(Materials.Aluminium), 'O', ItemList.Conveyor_Module_LV });
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("RTGenerator", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("RTGenerator", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "III", "IMI", "ICI", 'I', OrePrefixes.itemCasing.get(Materials.Steel), 'C',
-                OrePrefixes.circuit.get(Materials.LuV), 'M', ItemList.Hull_IV });
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("RTHeatGenerator", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("RTHeatGenerator", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "III", "IMB", "ICI", 'I', OrePrefixes.itemCasing.get(Materials.Steel), 'C',
-                OrePrefixes.circuit.get(Materials.LuV), 'M', ItemList.Hull_IV, 'B',
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Copper, 1) });
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("carbonrotor", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("carbonrotor", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("carbonrotorblade", 1), 'S',
-                OrePrefixes.screw.get(Materials.Iridium), 'T', GT_ModHandler.getIC2Item("steelshaft", 1) });
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("steelrotor", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("steelrotor", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("steelrotorblade", 1), 'S',
-                OrePrefixes.screw.get(Materials.StainlessSteel), 'T', GT_ModHandler.getIC2Item("ironshaft", 1) });
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("ironrotor", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("ironrotor", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("ironrotorblade", 1), 'S',
-                OrePrefixes.screw.get(Materials.WroughtIron), 'T', GT_ModHandler.getIC2Item("ironshaft", 1) });
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("woodrotor", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("woodrotor", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("woodrotorblade", 1), 'S',
-                OrePrefixes.screw.get(Materials.WroughtIron), 'T', OrePrefixes.stickLong.get(Materials.WroughtIron) });
-
-        if (GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L) != null) {
-            tStack = GT_ModHandler.getRecipeOutput(
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
-                new ItemStack(Items.redstone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Gold, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Gold, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L),
-                new ItemStack(Items.diamond_pickaxe, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L));
-            GT_ModHandler.removeRecipeByOutputDelayed(tStack);
-            GT_ModHandler.addCraftingRecipe(
-                tStack,
-                bits_no_remove_buffered,
-                new Object[] { "ICI", "GIG", "DPD", 'C', OrePrefixes.circuit.get(Materials.HV), 'D',
-                    OrePrefixes.gear.get(Materials.Diamond), 'G', OrePrefixes.gear.get(Materials.Gold), 'I',
-                    OrePrefixes.gear.get(Materials.Steel), 'P', GT_ModHandler.getIC2Item("diamondDrill", 1L, 32767) });
-        }
-
-        GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.paper));
-        GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.sugar));
-        GT_ModHandler.addCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 2),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "SSS", " m ", 'S', new ItemStack(Items.reeds) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "Sm ", 'S', new ItemStack(Items.reeds) });
-        GT_ModHandler.addCraftingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.paper, Materials.Empty, 2),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { " C ", "SSS", " C ", 'S', GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 1),
-                'C', new ItemStack(Blocks.stone_slab) });
-
-        GT_Log.out.println("GT_Mod: Applying Recipes for Tools");
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("nanoSaber", 1L));
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("nanoSaber", 1L),
-            bits_no_remove_buffered,
-            new Object[] { "PI ", "PI ", "CLC", 'L', OrePrefixes.battery.get(Materials.EV), 'I',
-                OrePrefixes.plateAlloy.get("Iridium"), 'P', OrePrefixes.plate.get(Materials.Platinum), 'C',
-                OrePrefixes.circuit.get(Materials.IV) });
-
-        GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.flint_and_steel, 1));
-        GT_ModHandler.addCraftingRecipe(
-            new ItemStack(Items.flint_and_steel, 1),
-            bits_no_remove_buffered,
-            new Object[] { "S ", " F", 'F', new ItemStack(Items.flint, 1), 'S', "nuggetSteel" });
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("diamondDrill", 1L));
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("miningDrill", 1L));
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("chainsaw", 1L));
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("electricHoe", 1L));
-
-        GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("electricTreetap", 1L));
-
-        if (GraviSuite.isModLoaded()) {
-            GT_ModHandler.removeRecipeByOutputDelayed(
-                GT_ModHandler.getModItem(GraviSuite.ID, "advNanoChestPlate", 1, GT_Values.W));
-            GT_ModHandler.addCraftingRecipe(
-                GT_ModHandler.getModItem(GraviSuite.ID, "advNanoChestPlate", 1, GT_Values.W),
-                bits_no_remove_buffered,
-                new Object[] { "CJC", "TNT", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Advanced), 'T',
-                    OrePrefixes.plate.get(Materials.TungstenSteel), 'J',
-                    GT_ModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GT_Values.W), 'N',
-                    GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorNanoChestplate", 1, GT_Values.W), 'W',
-                    OrePrefixes.wireGt12.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.IV) });
-
-            GT_ModHandler
-                .removeRecipeByOutputDelayed(GT_ModHandler.getModItem(GraviSuite.ID, "advLappack", 1, GT_Values.W));
-            GT_ModHandler.addCraftingRecipe(
-                GT_ModHandler.getModItem(GraviSuite.ID, "advLappack", 1, GT_Values.W),
-                bits_no_remove_buffered,
-                new Object[] { "CEC", "EJE", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J',
-                    GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorEnergypack", 1L, GT_Values.W), 'E',
-                    GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemBatCrystal", 1L, GT_Values.W), 'W',
-                    OrePrefixes.wireGt04.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.EV) });
-
-            GT_ModHandler
-                .removeRecipeByOutputDelayed(GT_ModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GT_Values.W));
-            GT_ModHandler.addCraftingRecipe(
-                GT_ModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GT_Values.W),
-                bits_no_remove_buffered,
-                new Object[] { "CJC", "EXE", "YZY", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J',
-                    GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorJetpackElectric", 1, GT_Values.W), 'E',
-                    OrePrefixes.plate.get(Materials.Titanium), 'X',
-                    GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorAlloyChestplate", 1L), 'Z',
-                    OrePrefixes.circuit.get(Materials.EV), 'Y', OrePrefixes.wireGt02.get(Materials.Platinum) });
-        }
-
-        GT_ModHandler.addShapelessCraftingRecipe(
-            Materials.Fireclay.getDust(2),
-            new Object[] { Materials.Brick.getDust(1), Materials.Clay.getDust(1) });
-
-        GT_ModHandler.addCraftingRecipe(
-            ItemList.Casing_Advanced_Rhodium_Palladium.get(1L),
-            bits,
-            new Object[] { "PhP", "PFP", aTextPlateWrench, 'P',
-                new ItemStack(WerkstoffLoader.items.get(OrePrefixes.plate), 1, 88), 'F',
-                OrePrefixes.frameGt.get(Materials.Chrome) });
-
-        if (Forestry.isModLoaded()) {
-            ItemStack[] coverIDs = { ItemList.Plank_Larch.get(2L), ItemList.Plank_Teak.get(2L),
-                ItemList.Plank_Acacia_Green.get(2L), ItemList.Plank_Lime.get(2L), ItemList.Plank_Chestnut.get(2L),
-                ItemList.Plank_Wenge.get(2L), ItemList.Plank_Baobab.get(2L), ItemList.Plank_Sequoia.get(2L),
-                ItemList.Plank_Kapok.get(2L), ItemList.Plank_Ebony.get(2L), ItemList.Plank_Mahagony.get(2L),
-                ItemList.Plank_Balsa.get(2L), ItemList.Plank_Willow.get(2L), ItemList.Plank_Walnut.get(2L),
-                ItemList.Plank_Greenheart.get(2L), ItemList.Plank_Cherry.get(2L), ItemList.Plank_Mahoe.get(2L),
-                ItemList.Plank_Poplar.get(2L), ItemList.Plank_Palm.get(2L), ItemList.Plank_Papaya.get(2L),
-                ItemList.Plank_Pine.get(2L), ItemList.Plank_Plum.get(2L), ItemList.Plank_Maple.get(2L),
-                ItemList.Plank_Citrus.get(2L) };
-            for (int i = 0; i < coverIDs.length; i++) {
-                ItemStack slabWood = getModItem(Forestry.ID, "slabs", 1, i);
-                ItemStack slabWoodFireproof = getModItem(Forestry.ID, "slabsFireproof", 1, i);
-
-                GT_ModHandler.addCraftingRecipe(
-                    coverIDs[i],
-                    GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
-                    new Object[] { "s ", " P", 'P', slabWood });
-
-                GT_ModHandler.addCraftingRecipe(
-                    coverIDs[i],
-                    GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
-                    new Object[] { "s ", " P", 'P', slabWoodFireproof });
-            }
-        }
-        GT_ModHandler.addCraftingRecipe(
-            GT_ModHandler.getIC2Item("electronicCircuit", 1L),
-            GT_ModHandler.RecipeBits.BUFFERED,
-            new Object[] { "RIR", "VBV", "CCC", 'R', ItemList.Circuit_Parts_Resistor.get(1), 'C',
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.RedAlloy, 1), 'V',
-                ItemList.Circuit_Parts_Vacuum_Tube.get(1), 'B', ItemList.Circuit_Board_Coated_Basic.get(1), 'I',
-                ItemList.IC2_Item_Casing_Steel.get(1) });
-        GT_ModHandler.addShapelessCraftingRecipe(
-            GT_ModHandler.getIC2Item("electronicCircuit", 1L),
-            new Object[] { ItemList.Circuit_Integrated.getWildcard(1L) });
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_CropLoader.java b/src/main/java/gregtech/loaders/postload/GT_CropLoader.java
deleted file mode 100644
index e6608a52b6..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_CropLoader.java
+++ /dev/null
@@ -1,1055 +0,0 @@
-package gregtech.loaders.postload;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_BaseCrop;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class GT_CropLoader implements Runnable {
-
-    @Override
-    public void run() {
-        GT_Log.out.println("GT_Mod: Register Crops to IC2.");
-        try {
-            /*
-             * Tags: Vines = Tendrilly Edible = Food
-             */
-            ItemStack[] tI = { ItemList.Crop_Drop_Indigo.get(4L), ItemList.Crop_Drop_MilkWart.get(4L),
-                new ItemStack(Blocks.brown_mushroom, 4), new ItemStack(Blocks.red_mushroom, 4) };
-            new GT_BaseCrop(
-                124,
-                "Indigo",
-                "Eloraam",
-                tI[0],
-                2,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                4,
-                0,
-                new String[] { "Flower", "Blue", "Ingredient" },
-                ItemList.Crop_Drop_Indigo.get(1L),
-                null);
-            new GT_BaseCrop(
-                125,
-                "Flax",
-                "Eloraam",
-                null,
-                2,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                2,
-                0,
-                1,
-                new String[] { "Silk", "Tendrilly", "Addictive" },
-                new ItemStack(Items.string, 1),
-                null);
-            new GT_BaseCrop(
-                126,
-                "Oilberries",
-                "Spacetoad",
-                null,
-                9,
-                4,
-                0,
-                1,
-                4,
-                6,
-                1,
-                2,
-                1,
-                12,
-                new String[] { "Fire", "Dark", "Reed", "Rotten", "Coal", "Oil" },
-                ItemList.Crop_Drop_OilBerry.get(1L),
-                null);
-            new GT_BaseCrop(
-                127,
-                "Bobsyeruncleranks",
-                "GenerikB",
-                null,
-                11,
-                4,
-                0,
-                1,
-                4,
-                4,
-                0,
-                8,
-                2,
-                9,
-                new String[] { "Shiny", "Tendrilly", "Emerald", "Berylium", "Crystal" },
-                Materials.Emerald,
-                ItemList.Crop_Drop_BobsYerUncleRanks.get(1L),
-                new ItemStack[] { new ItemStack(Items.emerald, 1) });
-            new GT_BaseCrop(
-                128,
-                "Diareed",
-                "Direwolf20",
-                null,
-                12,
-                4,
-                0,
-                1,
-                4,
-                5,
-                0,
-                10,
-                2,
-                10,
-                new String[] { "Fire", "Shiny", "Reed", "Coal", "Diamond", "Crystal" },
-                Materials.Diamond,
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1L),
-                new ItemStack[] { new ItemStack(Items.diamond, 1) });
-            new GT_BaseCrop(
-                129,
-                "Withereed",
-                "CovertJaguar",
-                null,
-                8,
-                4,
-                0,
-                1,
-                4,
-                2,
-                0,
-                4,
-                1,
-                3,
-                new String[] { "Fire", "Undead", "Reed", "Coal", "Rotten", "Wither" },
-                Materials.Coal,
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
-                new ItemStack[] { new ItemStack(Items.coal, 1), new ItemStack(Items.coal, 1) });
-            new GT_BaseCrop(
-                130,
-                "Blazereed",
-                "Mr. Brain",
-                null,
-                6,
-                4,
-                0,
-                1,
-                4,
-                0,
-                4,
-                1,
-                0,
-                0,
-                new String[] { "Fire", "Blaze", "Reed", "Sulfur" },
-                new ItemStack(Items.blaze_powder, 1),
-                new ItemStack[] { new ItemStack(Items.blaze_rod, 1) });
-            new GT_BaseCrop(
-                131,
-                "Eggplant",
-                "Link",
-                null,
-                6,
-                3,
-                900,
-                2,
-                3,
-                0,
-                4,
-                1,
-                0,
-                0,
-                new String[] { "Chicken", "Egg", "Food", "Feather", "Flower", "Addictive" },
-                new ItemStack(Items.egg, 1),
-                new ItemStack[] { new ItemStack(Items.chicken, 1), new ItemStack(Items.feather, 1),
-                    new ItemStack(Items.feather, 1), new ItemStack(Items.feather, 1) });
-            new GT_BaseCrop(
-                132,
-                "Corium",
-                "Gregorius Techneticies",
-                null,
-                6,
-                4,
-                0,
-                1,
-                4,
-                0,
-                2,
-                3,
-                1,
-                0,
-                new String[] { "Cow", "Silk", "Tendrilly" },
-                new ItemStack(Items.leather, 1),
-                null);
-            new GT_BaseCrop(
-                133,
-                "Corpseplant",
-                "Mr. Kenny",
-                null,
-                5,
-                4,
-                0,
-                1,
-                4,
-                0,
-                2,
-                1,
-                0,
-                3,
-                new String[] { "Toxic", "Undead", "Tendrilly", "Food", "Rotten" },
-                new ItemStack(Items.rotten_flesh, 1),
-                new ItemStack[] { ItemList.Dye_Bonemeal.get(1L), ItemList.Dye_Bonemeal.get(1L),
-                    new ItemStack(Items.bone, 1) });
-            new GT_BaseCrop(
-                134,
-                "Creeperweed",
-                "General Spaz",
-                null,
-                7,
-                4,
-                0,
-                1,
-                4,
-                3,
-                0,
-                5,
-                1,
-                3,
-                new String[] { "Creeper", "Tendrilly", "Explosive", "Fire", "Sulfur", "Saltpeter", "Coal" },
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L),
-                null);
-            new GT_BaseCrop(
-                135,
-                "Enderbloom",
-                "RichardG",
-                null,
-                10,
-                4,
-                0,
-                1,
-                4,
-                5,
-                0,
-                2,
-                1,
-                6,
-                new String[] { "Ender", "Flower", "Shiny" },
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnderPearl, 1L),
-                new ItemStack[] { new ItemStack(Items.ender_pearl, 1), new ItemStack(Items.ender_pearl, 1),
-                    new ItemStack(Items.ender_eye, 1) });
-            new GT_BaseCrop(
-                136,
-                "Meatrose",
-                "VintageBeef",
-                null,
-                7,
-                4,
-                1500,
-                1,
-                4,
-                0,
-                4,
-                1,
-                3,
-                0,
-                new String[] { "Food", "Flower", "Cow", "Fish", "Chicken", "Pig" },
-                new ItemStack(Items.dye, 1, 9),
-                new ItemStack[] { new ItemStack(Items.beef, 1), new ItemStack(Items.porkchop, 1),
-                    new ItemStack(Items.chicken, 1), new ItemStack(Items.fish, 1) });
-            new GT_BaseCrop(
-                137,
-                "Milkwart",
-                "Mr. Brain",
-                tI[1],
-                6,
-                3,
-                900,
-                1,
-                3,
-                0,
-                3,
-                0,
-                1,
-                0,
-                new String[] { "Food", "Milk", "Cow" },
-                ItemList.Crop_Drop_MilkWart.get(1L),
-                null);
-            new GT_BaseCrop(
-                138,
-                "Slimeplant",
-                "Neowulf",
-                null,
-                6,
-                4,
-                0,
-                3,
-                4,
-                3,
-                0,
-                0,
-                0,
-                2,
-                new String[] { "Slime", "Bouncy", "Sticky", "Bush" },
-                new ItemStack(Items.slime_ball, 1),
-                null);
-            new GT_BaseCrop(
-                139,
-                "Spidernip",
-                "Mr. Kenny",
-                null,
-                4,
-                4,
-                600,
-                1,
-                4,
-                2,
-                1,
-                4,
-                1,
-                3,
-                new String[] { "Toxic", "Silk", "Spider", "Flower", "Ingredient", "Addictive" },
-                new ItemStack(Items.string, 1),
-                new ItemStack[] { new ItemStack(Items.spider_eye, 1), new ItemStack(Blocks.web, 1) });
-            new GT_BaseCrop(
-                140,
-                "Tearstalks",
-                "Neowulf",
-                null,
-                8,
-                4,
-                0,
-                1,
-                4,
-                1,
-                2,
-                0,
-                0,
-                0,
-                new String[] { "Healing", "Nether", "Ingredient", "Reed", "Ghast" },
-                new ItemStack(Items.ghast_tear, 1),
-                null);
-            new GT_BaseCrop(
-                141,
-                "Tine",
-                "Gregorius Techneticies",
-                null,
-                5,
-                3,
-                0,
-                2,
-                3,
-                2,
-                0,
-                3,
-                0,
-                0,
-                new String[] { "Shiny", "Metal", "Pine", "Tin", "Bush" },
-                Materials.Tin,
-                ItemList.Crop_Drop_Tine.get(1L),
-                null);
-            new GT_BaseCrop(
-                142,
-                "Coppon",
-                "Mr. Brain",
-                null,
-                6,
-                3,
-                0,
-                2,
-                3,
-                2,
-                0,
-                1,
-                1,
-                1,
-                new String[] { "Shiny", "Metal", "Cotton", "Copper", "Bush" },
-                Materials.Copper,
-                ItemList.Crop_Drop_Coppon.get(1L),
-                null);
-            new GT_BaseCrop(
-                143,
-                "Brown Mushrooms",
-                "Mr. Brain",
-                tI[2],
-                1,
-                3,
-                0,
-                1,
-                3,
-                0,
-                2,
-                0,
-                0,
-                2,
-                new String[] { "Food", "Mushroom", "Ingredient" },
-                new ItemStack(Blocks.brown_mushroom, 1),
-                null);
-            new GT_BaseCrop(
-                144,
-                "Red Mushrooms",
-                "Mr. Kenny",
-                tI[3],
-                1,
-                3,
-                0,
-                1,
-                3,
-                0,
-                1,
-                3,
-                0,
-                2,
-                new String[] { "Toxic", "Mushroom", "Ingredient" },
-                new ItemStack(Blocks.red_mushroom, 1),
-                null);
-            new GT_BaseCrop(
-                145,
-                "Argentia",
-                "Eloraam",
-                null,
-                7,
-                4,
-                0,
-                3,
-                4,
-                2,
-                0,
-                1,
-                0,
-                0,
-                new String[] { "Shiny", "Metal", "Silver", "Reed" },
-                Materials.Silver,
-                ItemList.Crop_Drop_Argentia.get(1L),
-                null);
-            new GT_BaseCrop(
-                146,
-                "Plumbilia",
-                "KingLemming",
-                null,
-                6,
-                4,
-                0,
-                3,
-                4,
-                2,
-                0,
-                3,
-                1,
-                1,
-                new String[] { "Heavy", "Metal", "Lead", "Reed" },
-                Materials.Lead,
-                ItemList.Crop_Drop_Plumbilia.get(1L),
-                null);
-            new GT_BaseCrop(
-                147,
-                "Steeleafranks",
-                "Benimatic",
-                null,
-                10,
-                4,
-                0,
-                1,
-                4,
-                3,
-                0,
-                7,
-                2,
-                8,
-                new String[] { "Metal", "Tendrilly", "Iron" },
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steeleaf, 1L),
-                new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steeleaf, 1L) });
-            new GT_BaseCrop(
-                148,
-                "Liveroots",
-                "Benimatic",
-                null,
-                8,
-                4,
-                0,
-                1,
-                4,
-                2,
-                0,
-                5,
-                2,
-                6,
-                new String[] { "Wood", "Tendrilly" },
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 1L),
-                new ItemStack[] { ItemList.TF_LiveRoot.get(1L) });
-            new GT_BaseCrop(
-                149,
-                "Trollplant",
-                "unknown",
-                null,
-                6,
-                5,
-                1000,
-                1,
-                4,
-                0,
-                0,
-                5,
-                2,
-                8,
-                new String[] { "Troll", "Bad", "Scrap" },
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.FoolsRuby, 1L),
-                new ItemStack[] { ItemList.IC2_Plantball.get(1), ItemList.IC2_Scrap.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium241, 1L) });
-            new GT_BaseCrop(
-                150,
-                "Lazulia",
-                "unknown",
-                null,
-                7,
-                4,
-                0,
-                2,
-                4,
-                4,
-                2,
-                5,
-                7,
-                4,
-                new String[] { "Shiny", "Bad", "Crystal", "Lapis" },
-                Materials.Lapis,
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1L),
-                null);
-            new GT_BaseCrop(
-                151,
-                "Glowheat",
-                "unknown",
-                null,
-                10,
-                7,
-                0,
-                5,
-                7,
-                3,
-                3,
-                3,
-                5,
-                4,
-                new String[] { "Light", "Shiny", "Crystal" },
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
-                null);
-            new GT_BaseCrop(
-                153,
-                "Fertilia",
-                "unknown",
-                null,
-                3,
-                4,
-                0,
-                1,
-                4,
-                2,
-                3,
-                5,
-                4,
-                8,
-                new String[] { "Growth", "Healing", "Flower" },
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L),
-                new ItemStack[] { ItemList.IC2_Fertilizer.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1L) });
-            new GT_BaseCrop(
-                154,
-                "Bauxia",
-                "unknown",
-                null,
-                6,
-                3,
-                0,
-                2,
-                3,
-                5,
-                0,
-                2,
-                3,
-                3,
-                new String[] { "Metal", "Aluminium", "Reed", "Aluminium" },
-                Materials.Aluminium,
-                ItemList.Crop_Drop_Bauxite.get(1),
-                null);
-            new GT_BaseCrop(
-                155,
-                "Titania",
-                "unknown",
-                null,
-                9,
-                3,
-                0,
-                2,
-                3,
-                5,
-                0,
-                3,
-                3,
-                1,
-                new String[] { "Metal", "Heavy", "Reed", "Titanium" },
-                Materials.Titanium,
-                ItemList.Crop_Drop_Ilmenite.get(1),
-                null);
-            new GT_BaseCrop(
-                156,
-                "Reactoria",
-                "unknown",
-                null,
-                12,
-                4,
-                0,
-                2,
-                4,
-                4,
-                0,
-                1,
-                2,
-                1,
-                new String[] { "Radioactive", "Metal", "Danger", "Uranium" },
-                Materials.Uranium,
-                ItemList.Crop_Drop_Pitchblende.get(1),
-                new ItemStack[] { ItemList.Crop_Drop_Uraninite.get(1) });
-            new GT_BaseCrop(
-                157,
-                "God of Thunder",
-                "unknown",
-                null,
-                9,
-                4,
-                0,
-                2,
-                4,
-                3,
-                0,
-                5,
-                1,
-                2,
-                new String[] { "Radioactive", "Metal", "Coal", "Thorium" },
-                Materials.Thorium,
-                ItemList.Crop_Drop_Thorium.get(1),
-                null);
-            new GT_BaseCrop(
-                158,
-                "Transformium",
-                "unknown",
-                null,
-                12,
-                4,
-                2500,
-                1,
-                4,
-                6,
-                2,
-                1,
-                6,
-                1,
-                new String[] { "Transform", "Coal", "Reed" },
-                ItemList.Crop_Drop_UUABerry.get(1L),
-                new ItemStack[] { ItemList.Crop_Drop_UUABerry.get(1L), ItemList.Crop_Drop_UUABerry.get(1L),
-                    ItemList.Crop_Drop_UUABerry.get(1L), ItemList.Crop_Drop_UUABerry.get(1L),
-                    ItemList.Crop_Drop_UUMBerry.get(1L) });
-            new GT_BaseCrop(
-                159,
-                "Starwart",
-                "unknown",
-                null,
-                12,
-                4,
-                4000,
-                1,
-                4,
-                2,
-                0,
-                0,
-                1,
-                0,
-                new String[] { "Wither", "Nether", "Undead", "Netherstar" },
-                Materials.NetherStar,
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
-                new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1L),
-                    new ItemStack(Items.skull, 1), new ItemStack(Items.skull, 1, 1), new ItemStack(Items.skull, 1, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherStar, 1L) });
-            new GT_BaseCrop(
-                160,
-                "Zomplant",
-                "unknown",
-                null,
-                3,
-                4,
-                0,
-                1,
-                4,
-                1,
-                3,
-                4,
-                2,
-                6,
-                new String[] { "Zombie", "Rotten", "Undead" },
-                new ItemStack(Items.rotten_flesh),
-                null);
-            new GT_BaseCrop(
-                161,
-                "Nickelback",
-                "unknown",
-                null,
-                5,
-                3,
-                0,
-                2,
-                3,
-                3,
-                0,
-                1,
-                2,
-                2,
-                new String[] { "Metal", "Fire", "Alloy" },
-                Materials.Nickel,
-                ItemList.Crop_Drop_Nickel.get(1),
-                null);
-            new GT_BaseCrop(
-                162,
-                "Galvania",
-                "unknown",
-                null,
-                6,
-                3,
-                0,
-                2,
-                3,
-                3,
-                0,
-                2,
-                2,
-                3,
-                new String[] { "Metal", "Alloy", "Bush" },
-                Materials.Zinc,
-                ItemList.Crop_Drop_Zinc.get(1),
-                null);
-            new GT_BaseCrop(
-                163,
-                "Evil Ore",
-                "unknown",
-                null,
-                8,
-                4,
-                0,
-                3,
-                4,
-                4,
-                0,
-                2,
-                1,
-                3,
-                new String[] { "Crystal", "Fire", "Nether" },
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 1L),
-                new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 1L), });
-            new GT_BaseCrop(
-                164,
-                "Olivia",
-                "unknown",
-                null,
-                2,
-                4,
-                0,
-                3,
-                4,
-                1,
-                0,
-                1,
-                4,
-                0,
-                new String[] { "Crystal", "Shiny", "Processing", "Olivine" },
-                Materials.Olivine,
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Olivine, 1L),
-                new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), });
-            new GT_BaseCrop(
-                165,
-                "Sapphirum",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                3,
-                4,
-                1,
-                0,
-                1,
-                5,
-                0,
-                new String[] { "Crystal", "Shiny", "Metal", "Sapphire" },
-                Materials.Sapphire,
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sapphire, 1L),
-                new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), });
-            new GT_BaseCrop(
-                166,
-                "Pyrolusium",
-                "unknown",
-                null,
-                12,
-                3,
-                0,
-                2,
-                3,
-                1,
-                0,
-                1,
-                1,
-                0,
-                new String[] { "Metal", "Clean", "Bush", "Manganese" },
-                Materials.Manganese,
-                ItemList.Crop_Drop_Manganese.get(1),
-                null);
-            new GT_BaseCrop(
-                167,
-                "Scheelinium",
-                "unknown",
-                null,
-                12,
-                3,
-                0,
-                2,
-                3,
-                3,
-                0,
-                1,
-                1,
-                0,
-                new String[] { "Metal", "Hard", "Bush", "Tungsten" },
-                Materials.Tungsten,
-                ItemList.Crop_Drop_Scheelite.get(1),
-                null);
-            new GT_BaseCrop(
-                168,
-                "Platina",
-                "unknown",
-                null,
-                11,
-                4,
-                0,
-                1,
-                4,
-                3,
-                0,
-                0,
-                3,
-                0,
-                new String[] { "Metal", "Shiny", "Reed", "Platinum" },
-                Materials.Platinum,
-                ItemList.Crop_Drop_Platinum.get(1),
-                null);
-            new GT_BaseCrop(
-                169,
-                "Quantaria",
-                "unknown",
-                null,
-                12,
-                4,
-                1000,
-                1,
-                4,
-                4,
-                0,
-                0,
-                1,
-                0,
-                new String[] { "Metal", "Iridium", "Reed" },
-                Materials.Iridium,
-                ItemList.Crop_Drop_Iridium.get(1),
-                new ItemStack[] { ItemList.Crop_Drop_Osmium.get(1) });
-            new GT_BaseCrop(
-                170,
-                "Stargatium",
-                "unknown",
-                null,
-                12,
-                4,
-                1500,
-                1,
-                4,
-                4,
-                0,
-                0,
-                2,
-                0,
-                new String[] { "Metal", "Heavy", "Alien", "Naquadah" },
-                Materials.Naquadah,
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1L),
-                new ItemStack[] { ItemList.Crop_Drop_Naquadah.get(1) });
-            new GT_BaseCrop(
-                171,
-                "Lemon",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Yellow", "Sour" },
-                ItemList.Crop_Drop_Lemon.get(1),
-                null);
-            new GT_BaseCrop(
-                172,
-                "Chilly",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Red", "Spicy" },
-                ItemList.Crop_Drop_Chilly.get(1),
-                null);
-            new GT_BaseCrop(
-                173,
-                "Tomato",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Red" },
-                ItemList.Crop_Drop_Tomato.get(1),
-                new ItemStack[] { ItemList.Crop_Drop_MTomato.get(1) });
-            new GT_BaseCrop(
-                174,
-                "Grape",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Purple" },
-                ItemList.Crop_Drop_Grapes.get(1),
-                null);
-            new GT_BaseCrop(
-                175,
-                "Onion",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Brown" },
-                ItemList.Crop_Drop_Onion.get(1),
-                null);
-            new GT_BaseCrop(
-                176,
-                "Cucumber",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Green" },
-                ItemList.Crop_Drop_Cucumber.get(1),
-                null);
-            new GT_BaseCrop(
-                177,
-                "Tea",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Green", "Ingredient" },
-                ItemList.Crop_Drop_TeaLeaf.get(1),
-                null);
-            new GT_BaseCrop(
-                178,
-                "Rape",
-                "unknown",
-                null,
-                4,
-                4,
-                0,
-                1,
-                4,
-                1,
-                1,
-                0,
-                2,
-                0,
-                new String[] { "Food", "Yellow", "Oil" },
-                ItemList.Crop_Drop_Rape.get(1),
-                null);
-            new GT_BaseCrop(
-                179,
-                "Micadia",
-                "bartimaeusnek",
-                null,
-                9,
-                3,
-                0,
-                2,
-                3,
-                2,
-                0,
-                3,
-                0,
-                0,
-                new String[] { "Metal", "Pine", "Mica", "Bush" },
-                Materials.Mica,
-                ItemList.Crop_Drop_Mica.get(1L),
-                null);
-        } catch (Throwable e) {
-            GT_Log.err.println("GT_Mod: Failed to register Crops to IC2.");
-            e.printStackTrace(GT_Log.err);
-        }
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java
deleted file mode 100644
index d4e653dba2..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package gregtech.loaders.postload;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.util.GT_ModHandler;
-
-public class GT_FakeRecipeLoader implements Runnable {
-
-    @Override
-    public void run() {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("reactorLithiumCell", 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("TritiumCell", 1))
-            .setNEIDesc(
-                "Neutron reflecting Breeder",
-                String.format("Every %d reactor hull heat", 3_000),
-                String.format("increase speed by %d00%%", 1),
-                String.format("Required pulses: %d", 10_000))
-            .duration(0)
-            .eut(0)
-            .addTo(RecipeMaps.ic2NuclearFakeRecipes);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java b/src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java
deleted file mode 100644
index 67f7f00d87..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package gregtech.loaders.postload;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.Item;
-
-import gregtech.GT_Mod;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_Log;
-
-public class GT_ItemMaxStacksizeLoader implements Runnable {
-
-    @Override
-    public void run() {
-        GT_Log.out.println("GT_Mod: Changing maximum Stacksizes if configured.");
-
-        ItemList.Upgrade_Overclocker.getItem()
-            .setMaxStackSize(GT_Mod.gregtechproxy.mUpgradeCount);
-        Items.cake.setMaxStackSize(64);
-        Items.wooden_door.setMaxStackSize(8);
-        Items.iron_door.setMaxStackSize(8);
-        Items.ender_pearl.setMaxStackSize(64);
-        Items.egg.setMaxStackSize(64);
-        Items.snowball.setMaxStackSize(64);
-        Items.mushroom_stew.setMaxStackSize(64);
-        if (OrePrefixes.plank.mDefaultStackSize < 64) {
-            Item.getItemFromBlock(Blocks.wooden_slab)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.double_wooden_slab)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.oak_stairs)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.jungle_stairs)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.birch_stairs)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.spruce_stairs)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.acacia_stairs)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.dark_oak_stairs)
-                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
-        }
-        if (OrePrefixes.block.mDefaultStackSize < 64) {
-            Item.getItemFromBlock(Blocks.stone_slab)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.double_stone_slab)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.brick_stairs)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.nether_brick_stairs)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.sandstone_stairs)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.stone_stairs)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.stone_brick_stairs)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.packed_ice)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.ice)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.soul_sand)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.glowstone)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.snow)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.snow)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.iron_block)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.gold_block)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.emerald_block)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.lapis_block)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.diamond_block)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.clay)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.redstone_lamp)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.dirt)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.grass)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.mycelium)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.gravel)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.sand)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.brick_block)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.wool)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.melon_block)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.pumpkin)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.lit_pumpkin)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.dispenser)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.obsidian)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.piston)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.sticky_piston)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.crafting_table)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.glass)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.jukebox)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.anvil)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.chest)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.trapped_chest)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.noteblock)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.mob_spawner)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.bookshelf)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.furnace)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-            Item.getItemFromBlock(Blocks.lit_furnace)
-                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
-        }
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
deleted file mode 100644
index 92de5291e1..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package gregtech.loaders.postload;
-
-import gregtech.api.enums.Materials;
-import gregtech.loaders.postload.chains.GT_BauxiteRefineChain;
-import gregtech.loaders.postload.chains.GT_NaniteChain;
-import gregtech.loaders.postload.chains.GT_PCBFactoryRecipes;
-import gregtech.loaders.postload.chains.GT_PurifiedWaterRecipes;
-import gregtech.loaders.postload.recipes.AlloySmelterRecipes;
-import gregtech.loaders.postload.recipes.ArcFurnaceRecipes;
-import gregtech.loaders.postload.recipes.AssemblerRecipes;
-import gregtech.loaders.postload.recipes.AssemblyLineRecipes;
-import gregtech.loaders.postload.recipes.AutoclaveRecipes;
-import gregtech.loaders.postload.recipes.BenderRecipes;
-import gregtech.loaders.postload.recipes.BlastFurnaceRecipes;
-import gregtech.loaders.postload.recipes.BreweryRecipes;
-import gregtech.loaders.postload.recipes.CannerRecipes;
-import gregtech.loaders.postload.recipes.CentrifugeRecipes;
-import gregtech.loaders.postload.recipes.ChemicalBathRecipes;
-import gregtech.loaders.postload.recipes.ChemicalRecipes;
-import gregtech.loaders.postload.recipes.CircuitAssemblerRecipes;
-import gregtech.loaders.postload.recipes.CompressorRecipes;
-import gregtech.loaders.postload.recipes.CropProcessingRecipes;
-import gregtech.loaders.postload.recipes.CuttingRecipes;
-import gregtech.loaders.postload.recipes.DistilleryRecipes;
-import gregtech.loaders.postload.recipes.ElectrolyzerRecipes;
-import gregtech.loaders.postload.recipes.ElectromagneticSeparatorRecipes;
-import gregtech.loaders.postload.recipes.ExtractorRecipes;
-import gregtech.loaders.postload.recipes.ExtruderRecipes;
-import gregtech.loaders.postload.recipes.FermenterRecipes;
-import gregtech.loaders.postload.recipes.FluidCannerRecipes;
-import gregtech.loaders.postload.recipes.FluidExtractorRecipes;
-import gregtech.loaders.postload.recipes.FluidHeaterRecipes;
-import gregtech.loaders.postload.recipes.FluidSolidifierRecipes;
-import gregtech.loaders.postload.recipes.ForgeHammerRecipes;
-import gregtech.loaders.postload.recipes.FormingPressRecipes;
-import gregtech.loaders.postload.recipes.FuelRecipes;
-import gregtech.loaders.postload.recipes.FusionReactorRecipes;
-import gregtech.loaders.postload.recipes.ImplosionCompressorRecipes;
-import gregtech.loaders.postload.recipes.LaserEngraverRecipes;
-import gregtech.loaders.postload.recipes.LatheRecipes;
-import gregtech.loaders.postload.recipes.MatterAmplifierRecipes;
-import gregtech.loaders.postload.recipes.MixerRecipes;
-import gregtech.loaders.postload.recipes.NEIHiding;
-import gregtech.loaders.postload.recipes.OreDictUnification;
-import gregtech.loaders.postload.recipes.PackagerRecipes;
-import gregtech.loaders.postload.recipes.PlasmaForgeRecipes;
-import gregtech.loaders.postload.recipes.PrinterRecipes;
-import gregtech.loaders.postload.recipes.Pulverizer;
-import gregtech.loaders.postload.recipes.PyrolyseRecipes;
-import gregtech.loaders.postload.recipes.RecipeRemover;
-import gregtech.loaders.postload.recipes.SifterRecipes;
-import gregtech.loaders.postload.recipes.SlicerRecipes;
-import gregtech.loaders.postload.recipes.SmelterRecipes;
-import gregtech.loaders.postload.recipes.ThaumcraftRecipes;
-import gregtech.loaders.postload.recipes.ThermalCentrifugeRecipes;
-import gregtech.loaders.postload.recipes.TranscendentPlasmaMixerRecipes;
-import gregtech.loaders.postload.recipes.VacuumFreezerRecipes;
-import gregtech.loaders.postload.recipes.WiremillRecipes;
-
-public class GT_MachineRecipeLoader implements Runnable {
-
-    public static final String aTextTCGTPage = "gt.research.page.1.";
-
-    public static final Materials[] solderingMats = new Materials[] { Materials.Lead, Materials.SolderingAlloy,
-        Materials.Tin };
-
-    @Override
-    public void run() {
-        new AlloySmelterRecipes().run();
-        new ArcFurnaceRecipes().run();
-        new AssemblerRecipes().run();
-        new AssemblyLineRecipes().run();
-        new AutoclaveRecipes().run();
-        new BenderRecipes().run();
-        new BlastFurnaceRecipes().run();
-        new BreweryRecipes().run();
-        new CannerRecipes().run();
-        new CentrifugeRecipes().run();
-        new ChemicalBathRecipes().run();
-        new ChemicalRecipes().run();
-        new CircuitAssemblerRecipes().run();
-        new CompressorRecipes().run();
-        new CropProcessingRecipes().run();
-        new CuttingRecipes().run();
-        new DistilleryRecipes().run();
-        new ElectrolyzerRecipes().run();
-        new ElectromagneticSeparatorRecipes().run();
-        new ExtractorRecipes().run();
-        new ExtruderRecipes().run();
-        new FermenterRecipes().run();
-        new FluidCannerRecipes().run();
-        new FluidExtractorRecipes().run();
-        new FluidHeaterRecipes().run();
-        new FluidSolidifierRecipes().run();
-        new ForgeHammerRecipes().run();
-        new FormingPressRecipes().run();
-        new FuelRecipes().run();
-        new FusionReactorRecipes().run();
-        new ImplosionCompressorRecipes().run();
-        new LaserEngraverRecipes().run();
-        new LatheRecipes().run();
-        new MatterAmplifierRecipes().run();
-        new MixerRecipes().run();
-        new NEIHiding().run();
-        new OreDictUnification().run();
-        new PackagerRecipes().run();
-        new PlasmaForgeRecipes().run();
-        new PrinterRecipes().run();
-        new Pulverizer().run();
-        new PyrolyseRecipes().run();
-        new RecipeRemover().run();
-        new SifterRecipes().run();
-        new SlicerRecipes().run();
-        new SmelterRecipes().run();
-        new ThaumcraftRecipes().run();
-        new ThermalCentrifugeRecipes().run();
-        new VacuumFreezerRecipes().run();
-        new WiremillRecipes().run();
-        new TranscendentPlasmaMixerRecipes().run();
-
-        GT_BauxiteRefineChain.run();
-        GT_NaniteChain.run();
-        GT_PCBFactoryRecipes.load();
-        GT_PurifiedWaterRecipes.run();
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java b/src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java
deleted file mode 100644
index d18ccd6c83..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package gregtech.loaders.postload;
-
-import static gregtech.api.enums.GT_Values.GT;
-
-import net.minecraft.item.ItemStack;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_Log;
-import gregtech.common.blocks.GT_Item_Machines;
-
-public class GT_MachineTooltipsLoader implements Runnable {
-
-    @Override
-    public void run() {
-        if (!GT.isClientSide()) return;
-        GT_Log.out.println("GT Mod: Register Block Machine's tooltips");
-        for (int i = 0; i < 32768; i++) {
-            ItemStack tStack = new ItemStack(GregTech_API.sBlockMachines, 1, i);
-            if (tStack.getItem() != null && tStack.getItem() instanceof GT_Item_Machines) {
-                ((GT_Item_Machines) tStack.getItem()).registerDescription(i);
-            }
-        }
-        GT_LanguageManager.addStringLocalization("TileEntity_EUp_IN", "Voltage IN: ");
-        GT_LanguageManager.addStringLocalization("TileEntity_EUp_OUT", "Voltage OUT: ");
-        GT_LanguageManager.addStringLocalization("TileEntity_EUp_AMOUNT", "Amperage: ");
-        GT_LanguageManager.addStringLocalization("TileEntity_EUp_STORE", "Capacity: ");
-        GT_LanguageManager.addStringLocalization("TileEntity_TANK_INFO", "Contains Fluid: ");
-        GT_LanguageManager.addStringLocalization("TileEntity_TANK_AMOUNT", "Fluid Amount: ");
-        GT_LanguageManager.addStringLocalization("TileEntity_CHEST_INFO", "Contains Item: ");
-        GT_LanguageManager.addStringLocalization("TileEntity_CHEST_AMOUNT", "Item Amount: ");
-        GT_LanguageManager.addStringLocalization("GT_TileEntity_MUFFLER", "has Muffler Upgrade");
-        GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMCONVERTER", "has Steam Upgrade");
-        GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMTANKS", "Steam Tank Upgrades");
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java b/src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java
deleted file mode 100644
index afa98e0b38..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package gregtech.loaders.postload;
-
-import net.minecraft.init.Blocks;
-
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_ModHandler;
-
-public class GT_MinableRegistrator implements Runnable {
-
-    @Override
-    public void run() {
-        GT_Log.out.println("GT_Mod: Adding Blocks to the Miners Valuable List.");
-        GT_ModHandler.addValuableOre(Blocks.glowstone, 0, 1);
-        GT_ModHandler.addValuableOre(Blocks.soul_sand, 0, 1);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java b/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java
deleted file mode 100644
index 95732076d9..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package gregtech.loaders.postload;
-
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.MaterialsKevlar;
-import gregtech.api.util.GT_PCBFactoryManager;
-
-public class GT_PCBFactoryMaterialLoader {
-
-    public static void load() {
-        // add Plastics
-        GT_PCBFactoryManager.addPlasticTier(Materials.Plastic, 1);
-        GT_PCBFactoryManager.addPlasticTier(Materials.PolyvinylChloride, 2);
-        GT_PCBFactoryManager.addPlasticTier(Materials.Polytetrafluoroethylene, 3);
-        GT_PCBFactoryManager.addPlasticTier(Materials.Epoxid, 4);
-        GT_PCBFactoryManager.addPlasticTier(Materials.EpoxidFiberReinforced, 5);
-        GT_PCBFactoryManager.addPlasticTier(Materials.Polybenzimidazole, 6);
-        GT_PCBFactoryManager.addPlasticTier(MaterialsKevlar.Kevlar, 7);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_PostLoad.java b/src/main/java/gregtech/loaders/postload/GT_PostLoad.java
deleted file mode 100644
index 4dae7d5313..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_PostLoad.java
+++ /dev/null
@@ -1,542 +0,0 @@
-package gregtech.loaders.postload;
-
-import static gregtech.api.enums.Mods.Forestry;
-import static gregtech.api.enums.Mods.GalacticraftCore;
-import static gregtech.api.enums.Mods.GalacticraftMars;
-import static gregtech.api.enums.Mods.GalaxySpace;
-import static gregtech.api.enums.Mods.Thaumcraft;
-import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
-import static gregtech.api.recipe.RecipeMaps.massFabFakeRecipes;
-import static gregtech.api.recipe.RecipeMaps.rockBreakerFakeRecipes;
-import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes;
-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 java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.FluidContainerRegistry;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import com.google.common.base.Stopwatch;
-
-import cpw.mods.fml.common.ProgressManager;
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.SubTag;
-import gregtech.api.enums.TierEU;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.util.GT_CLS_Compat;
-import gregtech.api.util.GT_Forestry_Compat;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_RecipeConstants;
-import gregtech.api.util.GT_RecipeRegistrator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.items.GT_MetaGenerated_Tool_01;
-import gregtech.common.items.behaviors.Behaviour_DataOrb;
-import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Massfabricator;
-import ic2.api.recipe.IRecipeInput;
-import ic2.api.recipe.RecipeOutput;
-
-@SuppressWarnings("deprecation")
-public class GT_PostLoad {
-
-    public static void activateOreDictHandler() {
-        @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
-        Stopwatch stopwatch = Stopwatch.createStarted();
-        GT_Mod.gregtechproxy.activateOreDictHandler();
-
-        // noinspection UnstableApiUsage// Stable enough for this project
-        GT_Mod.GT_FML_LOGGER
-            .info("Congratulations, you have been waiting long enough (" + stopwatch.stop() + "). Have a Cake.");
-        GT_Log.out.println(
-            "GT_Mod: List of Lists of Tool Recipes: "
-                + GT_ModHandler.sSingleNonBlockDamagableRecipeList_list.toString());
-        GT_Log.out.println(
-            "GT_Mod: Vanilla Recipe List -> Outputs null or stackSize <=0: "
-                + GT_ModHandler.sVanillaRecipeList_warntOutput.toString());
-        GT_Log.out.println(
-            "GT_Mod: Single Non Block Damageable Recipe List -> Outputs null or stackSize <=0: "
-                + GT_ModHandler.sSingleNonBlockDamagableRecipeList_warntOutput.toString());
-    }
-
-    public static void removeIc2Recipes(Map aMaceratorRecipeList,
-        Map aCompressorRecipeList, Map aExtractorRecipeList,
-        Map aOreWashingRecipeList,
-        Map aThermalCentrifugeRecipeList) {
-        @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
-        Stopwatch stopwatch = Stopwatch.createStarted();
-        // remove gemIridium exploit
-        ItemStack iridiumOre = GT_ModHandler.getIC2Item("iridiumOre", 1);
-        aCompressorRecipeList.entrySet()
-            .parallelStream()
-            .filter(
-                e -> e.getKey()
-                    .getInputs()
-                    .size() == 1 && e.getKey()
-                        .getInputs()
-                        .get(0)
-                        .isItemEqual(iridiumOre))
-            .findAny()
-            .ifPresent(e -> aCompressorRecipeList.remove(e.getKey()));
-        // Remove all IC2
-        GT_ModHandler.removeAllIC2Recipes();
-        // noinspection UnstableApiUsage// Stable enough for this project
-        GT_Mod.GT_FML_LOGGER.info("IC2 Removal (" + stopwatch.stop() + "). Have a Cake.");
-    }
-
-    public static void registerFluidCannerRecipes() {
-        for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
-            .getRegisteredFluidContainerData()) {
-            // lava clay bucket is registered with empty container with 0 stack size
-            ItemStack emptyContainer = tData.emptyContainer.copy();
-            emptyContainer.stackSize = 1;
-            GT_Values.RA.stdBuilder()
-                .itemInputs(emptyContainer)
-                .itemOutputs(tData.filledContainer)
-                .fluidInputs(tData.fluid)
-                .duration((tData.fluid.amount / 62) * TICKS)
-                .eut(1)
-                .addTo(fluidCannerRecipes);
-            GT_RecipeBuilder builder = GT_Values.RA.stdBuilder()
-                .itemInputs(tData.filledContainer);
-            if (tData.emptyContainer.stackSize > 0) {
-                builder.itemOutputs(tData.emptyContainer);
-            }
-            builder.fluidOutputs(tData.fluid)
-                .duration((tData.fluid.amount / 62) * TICKS)
-                .eut(1)
-                .addTo(fluidCannerRecipes);
-        }
-    }
-
-    public static void addFakeRecipes() {
-        GT_Log.out.println("GT_Mod: Adding Fake Recipes for NEI");
-
-        if (Forestry.isModLoaded()) {
-            GT_Forestry_Compat.populateFakeNeiRecipes();
-        }
-
-        if (ItemList.IC2_Crop_Seeds.get(1L) != null) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.IC2_Crop_Seeds.getWildcard(1L))
-                .itemOutputs(ItemList.IC2_Crop_Seeds.getWithName(1L, "Scanned Seeds"))
-                .duration(8 * SECONDS)
-                .eut(8)
-                .noOptimize()
-                .ignoreCollision()
-                .fake()
-                .addTo(scannerFakeRecipes);
-        }
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.written_book, 1, 32767))
-            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Book Data"))
-            .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
-            .duration(6 * SECONDS + 8 * TICKS)
-            .eut(TierEU.RECIPE_LV)
-            .noOptimize()
-            .ignoreCollision()
-            .fake()
-            .addTo(scannerFakeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.filled_map, 1, 32767))
-            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Map Data"))
-            .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
-            .duration(6 * SECONDS + 8 * TICKS)
-            .eut(TierEU.RECIPE_LV)
-            .noOptimize()
-            .ignoreCollision()
-            .fake()
-            .addTo(scannerFakeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Tool_DataOrb.getWithName(1L, "Orb to overwrite"))
-            .itemOutputs(ItemList.Tool_DataOrb.getWithName(1L, "Copy of the Orb"))
-            .duration(25 * SECONDS + 12 * TICKS)
-            .eut(TierEU.RECIPE_LV)
-            .noOptimize()
-            .ignoreCollision()
-            .fake()
-            .addTo(scannerFakeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Tool_DataStick.getWithName(1L, "Stick to overwrite"))
-            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Copy of the Stick"))
-            .special(ItemList.Tool_DataStick.getWithName(0L, "Stick to copy"))
-            .duration(6 * SECONDS + 8 * TICKS)
-            .eut(TierEU.RECIPE_LV)
-            .noOptimize()
-            .ignoreCollision()
-            .fake()
-            .addTo(scannerFakeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Tool_DataStick.getWithName(1L, "Raw Prospection Data"))
-            .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Analyzed Prospection Data"))
-            .duration(50 * SECONDS)
-            .eut(TierEU.RECIPE_LV)
-            .noOptimize()
-            .ignoreCollision()
-            .fake()
-            .addTo(scannerFakeRecipes);
-
-        if (GalacticraftCore.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    Objects
-                        .requireNonNull(
-                            GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1, Short.MAX_VALUE))
-                        .setStackDisplayName("Any Schematic"))
-                .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic"))
-                .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
-                .duration(30 * MINUTES)
-                .eut(TierEU.RECIPE_HV)
-                .noOptimize()
-                .ignoreCollision()
-                .fake()
-                .addTo(scannerFakeRecipes);
-
-            if (GalacticraftMars.isModLoaded()) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(
-                        Objects
-                            .requireNonNull(
-                                GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1, Short.MAX_VALUE))
-                            .setStackDisplayName("Any Schematic"))
-                    .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic"))
-                    .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
-                    .duration(30 * MINUTES)
-                    .eut(TierEU.RECIPE_MV)
-                    .noOptimize()
-                    .ignoreCollision()
-                    .fake()
-                    .addTo(scannerFakeRecipes);
-            }
-            if (GalaxySpace.isModLoaded()) {
-                for (int i = 4; i < 9; i++) {
-                    GT_Values.RA.stdBuilder()
-                        .itemInputs(
-                            GT_ModHandler.getModItem(GalaxySpace.ID, "item.SchematicTier" + i, 1)
-                                .setStackDisplayName("Any Schematic"))
-                        .itemOutputs(ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic"))
-                        .special(ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"))
-                        .duration(30 * MINUTES)
-                        .eut(TierEU.RECIPE_HV)
-                        .noOptimize()
-                        .ignoreCollision()
-                        .fake()
-                        .addTo(scannerFakeRecipes);
-                }
-            }
-        }
-        Materials.getMaterialsMap()
-            .values()
-            .forEach(tMaterial -> {
-                if ((tMaterial.mElement != null) && (!tMaterial.mElement.mIsIsotope)
-                    && (tMaterial != Materials.Magic)
-                    && (tMaterial.getMass() > 0L)) {
-                    ItemStack dataOrb = ItemList.Tool_DataOrb.get(1L);
-                    Behaviour_DataOrb.setDataTitle(dataOrb, "Elemental-Scan");
-                    Behaviour_DataOrb.setDataName(dataOrb, tMaterial.mElement.name());
-                    ItemStack dustItem = GT_OreDictUnificator.get(OrePrefixes.dust, tMaterial, 1L);
-                    if (dustItem != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(dustItem)
-                            .itemOutputs(dataOrb)
-                            .special(ItemList.Tool_DataOrb.get(1L))
-                            .duration((int) (tMaterial.getMass() * 8192L))
-                            .eut(TierEU.RECIPE_LV)
-                            .fake()
-                            .ignoreCollision()
-                            .addTo(scannerFakeRecipes);
-                        GT_Values.RA.stdBuilder()
-                            .itemOutputs(dustItem)
-                            .special(dataOrb)
-                            .metadata(GT_RecipeConstants.MATERIAL, tMaterial)
-                            .addTo(RecipeMaps.replicatorRecipes);
-                        return;
-                    }
-                    ItemStack cellItem = GT_OreDictUnificator.get(OrePrefixes.cell, tMaterial, 1L);
-                    if (cellItem != null) {
-                        GT_Values.RA.stdBuilder()
-                            .itemInputs(cellItem)
-                            .itemOutputs(dataOrb)
-                            .special(ItemList.Tool_DataOrb.get(1L))
-                            .duration((int) (tMaterial.getMass() * 8192L))
-                            .eut(TierEU.RECIPE_LV)
-                            .fake()
-                            .ignoreCollision()
-                            .addTo(scannerFakeRecipes);
-                        FluidStack fluidStack = GT_Utility.getFluidForFilledItem(cellItem, false);
-                        GT_RecipeBuilder builder = GT_Values.RA.stdBuilder();
-                        if (fluidStack != null) {
-                            builder.fluidOutputs(fluidStack);
-                        } else {
-                            builder.itemInputs(Materials.Empty.getCells(1))
-                                .itemOutputs(cellItem);
-                        }
-                        builder.special(dataOrb)
-                            .metadata(GT_RecipeConstants.MATERIAL, tMaterial)
-                            .addTo(RecipeMaps.replicatorRecipes);
-                    }
-                }
-            });
-
-        if (!GT_MetaTileEntity_Massfabricator.sRequiresUUA) {
-
-            GT_MetaTileEntity_Massfabricator.nonUUARecipe = GT_Values.RA.stdBuilder()
-                .fluidOutputs(Materials.UUMatter.getFluid(1L))
-                .duration(GT_MetaTileEntity_Massfabricator.sDurationMultiplier)
-                .eut(GT_MetaTileEntity_Massfabricator.BASE_EUT)
-                .ignoreCollision()
-                .noOptimize()
-                .fake()
-                .build()
-                .get();
-
-            massFabFakeRecipes.add(GT_MetaTileEntity_Massfabricator.nonUUARecipe);
-
-        }
-
-        GT_MetaTileEntity_Massfabricator.uuaRecipe = GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
-            .fluidInputs(Materials.UUAmplifier.getFluid(GT_MetaTileEntity_Massfabricator.sUUAperUUM))
-            .fluidOutputs(Materials.UUMatter.getFluid(1L))
-            .duration(
-                GT_MetaTileEntity_Massfabricator.sDurationMultiplier / GT_MetaTileEntity_Massfabricator.sUUASpeedBonus)
-            .eut(GT_MetaTileEntity_Massfabricator.BASE_EUT)
-            .ignoreCollision()
-            .noOptimize()
-            .fake()
-            .build()
-            .get();
-
-        massFabFakeRecipes.add(GT_MetaTileEntity_Massfabricator.uuaRecipe);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Display_ITS_FREE.getWithName(1L, "IT'S FREE! Place Lava on Side"))
-            .itemOutputs(new ItemStack(Blocks.cobblestone, 1))
-            .duration(16 * TICKS)
-            .eut(TierEU.RECIPE_LV)
-            .ignoreCollision()
-            .noOptimize()
-            .fake()
-            .addTo(rockBreakerFakeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Display_ITS_FREE.getWithName(1L, "IT'S FREE! Place Lava on Side"))
-            .itemOutputs(new ItemStack(Blocks.stone, 1))
-            .duration(16 * TICKS)
-            .eut(TierEU.RECIPE_LV)
-            .ignoreCollision()
-            .noOptimize()
-            .fake()
-            .addTo(rockBreakerFakeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(new ItemStack(Blocks.obsidian, 1))
-            .duration(6 * SECONDS + 8 * TICKS)
-            .eut(TierEU.RECIPE_LV)
-            .ignoreCollision()
-            .noOptimize()
-            .fake()
-            .addTo(rockBreakerFakeRecipes);
-    }
-
-    public static void nerfVanillaTools() {
-        if (!GT_Mod.gregtechproxy.mNerfedVanillaTools) {
-            return;
-        }
-
-        GT_Log.out.println("GT_Mod: Nerfing Vanilla Tool Durability");
-        Items.wooden_sword.setMaxDamage(12);
-        Items.wooden_pickaxe.setMaxDamage(12);
-        Items.wooden_shovel.setMaxDamage(12);
-        Items.wooden_axe.setMaxDamage(12);
-        Items.wooden_hoe.setMaxDamage(12);
-
-        Items.stone_sword.setMaxDamage(48);
-        Items.stone_pickaxe.setMaxDamage(48);
-        Items.stone_shovel.setMaxDamage(48);
-        Items.stone_axe.setMaxDamage(48);
-        Items.stone_hoe.setMaxDamage(48);
-
-        Items.iron_sword.setMaxDamage(256);
-        Items.iron_pickaxe.setMaxDamage(256);
-        Items.iron_shovel.setMaxDamage(256);
-        Items.iron_axe.setMaxDamage(256);
-        Items.iron_hoe.setMaxDamage(256);
-
-        Items.golden_sword.setMaxDamage(24);
-        Items.golden_pickaxe.setMaxDamage(24);
-        Items.golden_shovel.setMaxDamage(24);
-        Items.golden_axe.setMaxDamage(24);
-        Items.golden_hoe.setMaxDamage(24);
-
-        Items.diamond_sword.setMaxDamage(768);
-        Items.diamond_pickaxe.setMaxDamage(768);
-        Items.diamond_shovel.setMaxDamage(768);
-        Items.diamond_axe.setMaxDamage(768);
-        Items.diamond_hoe.setMaxDamage(768);
-
-    }
-
-    public static void replaceVanillaMaterials() {
-        @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
-        Stopwatch stopwatch = Stopwatch.createStarted();
-        GT_Mod.GT_FML_LOGGER.info("Replacing Vanilla Materials in recipes, please wait.");
-        Set replaceVanillaItemsSet = Arrays.stream(Materials.values())
-            .filter(GT_RecipeRegistrator::hasVanillaRecipes)
-            .collect(Collectors.toSet());
-
-        ProgressManager.ProgressBar progressBar = ProgressManager
-            .push("Register materials", replaceVanillaItemsSet.size());
-        if (GT_Values.cls_enabled) {
-            try {
-                GT_CLS_Compat.doActualRegistrationCLS(progressBar, replaceVanillaItemsSet);
-                GT_CLS_Compat.pushToDisplayProgress();
-            } catch (InvocationTargetException | IllegalAccessException e) {
-                GT_Mod.GT_FML_LOGGER.catching(e);
-            }
-        } else {
-            replaceVanillaItemsSet.forEach(m -> {
-                progressBar.step(m.mDefaultLocalName);
-                doActualRegistration(m);
-            });
-        }
-        ProgressManager.pop(progressBar);
-        // noinspection UnstableApiUsage// stable enough for project
-        GT_Mod.GT_FML_LOGGER.info("Replaced Vanilla Materials (" + stopwatch.stop() + "). Have a Cake.");
-    }
-
-    public static void doActualRegistration(Materials m) {
-        String plateName = OrePrefixes.plate.get(m)
-            .toString();
-        boolean noSmash = !m.contains(SubTag.NO_SMASHING);
-        if ((m.mTypes & 2) != 0) GT_RecipeRegistrator.registerUsagesForMaterials(plateName, noSmash, m.getIngots(1));
-        if ((m.mTypes & 4) != 0) GT_RecipeRegistrator.registerUsagesForMaterials(plateName, noSmash, m.getGems(1));
-        if (m.getBlocks(1) != null) GT_RecipeRegistrator.registerUsagesForMaterials(null, noSmash, m.getBlocks(1));
-    }
-
-    public static void createGTtoolsCreativeTab() {
-        new CreativeTabs("GTtools") {
-
-            @SideOnly(Side.CLIENT)
-            @Override
-            public ItemStack getIconItemStack() {
-                return ItemList.Tool_Cheat.get(1, new ItemStack(Blocks.iron_block, 1));
-            }
-
-            @SideOnly(Side.CLIENT)
-            @Override
-            public Item getTabIconItem() {
-                return ItemList.Circuit_Integrated.getItem();
-            }
-
-            @Override
-            public void displayAllReleventItems(List aList) {
-
-                for (int i = 0; i < 32766; i += 2) {
-                    if (GT_MetaGenerated_Tool_01.INSTANCE
-                        .getToolStats(new ItemStack(GT_MetaGenerated_Tool_01.INSTANCE, 1, i)) == null) {
-                        continue;
-                    }
-
-                    ItemStack tStack = new ItemStack(GT_MetaGenerated_Tool_01.INSTANCE, 1, i);
-                    GT_MetaGenerated_Tool_01.INSTANCE.isItemStackUsable(tStack);
-                    aList.add(
-                        GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(i, 1, Materials.Lead, Materials.Lead, null));
-                    aList.add(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(i, 1, Materials.Nickel, Materials.Nickel, null));
-                    aList.add(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(i, 1, Materials.Cobalt, Materials.Cobalt, null));
-                    aList.add(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(i, 1, Materials.Osmium, Materials.Osmium, null));
-                    aList.add(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(i, 1, Materials.Adamantium, Materials.Adamantium, null));
-                    aList.add(
-                        GT_MetaGenerated_Tool_01.INSTANCE
-                            .getToolWithStats(i, 1, Materials.Neutronium, Materials.Neutronium, null));
-
-                }
-                super.displayAllReleventItems(aList);
-            }
-        };
-    }
-
-    public static void addSolidFakeLargeBoilerFuels() {
-        RecipeMaps.largeBoilerFakeFuels.getBackend()
-            .addSolidRecipes(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Coal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lignite, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 1),
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
-                GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Lignite, 1),
-                GT_OreDictUnificator.get(OrePrefixes.log, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.plank, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.slab, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(ItemList.Block_SSFUEL.get(1)),
-                GT_OreDictUnificator.get(ItemList.Block_MSSFUEL.get(1)),
-                GT_OreDictUnificator.get(OrePrefixes.rod, Materials.Blaze, 1));
-        if (Thaumcraft.isModLoaded()) {
-            RecipeMaps.largeBoilerFakeFuels.getBackend()
-                .addSolidRecipe(GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1));
-        }
-    }
-
-    public static void identifyAnySteam() {
-        final String[] steamCandidates = { "steam", "ic2steam" };
-        final String[] superHeatedSteamCandidates = { "ic2superheatedsteam" };
-
-        GT_ModHandler.sAnySteamFluidIDs = Arrays.stream(steamCandidates)
-            .map(FluidRegistry::getFluid)
-            .filter(Objects::nonNull)
-            .map(FluidRegistry::getFluidID)
-            .collect(Collectors.toList());
-        GT_ModHandler.sSuperHeatedSteamFluidIDs = Arrays.stream(superHeatedSteamCandidates)
-            .map(FluidRegistry::getFluid)
-            .filter(Objects::nonNull)
-            .map(FluidRegistry::getFluidID)
-            .collect(Collectors.toList());
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java
deleted file mode 100644
index 0ff53d0424..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package gregtech.loaders.postload;
-
-import gregtech.api.enums.SoundResource;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.util.GT_ProcessingArray_Manager;
-
-public class GT_ProcessingArrayRecipeLoader {
-
-    public static void registerDefaultGregtechMaps() {
-
-        // Alloy Smelter
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.alloysmelter", RecipeMaps.alloySmelterRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.alloysmelter", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
-        // Arc Furnace
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.arcfurnace", RecipeMaps.arcFurnaceRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.arcfurnace", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
-        // Assembler
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.assembler", RecipeMaps.assemblerRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.assembler", SoundResource.NONE);
-        // Autoclave
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.autoclave", RecipeMaps.autoclaveRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.autoclave", SoundResource.NONE);
-        // Bender
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.bender", RecipeMaps.benderRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.bender", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
-        // Boxinator
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.boxinator", RecipeMaps.packagerRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.boxinator", SoundResource.NONE);
-        // Brewery
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.brewery", RecipeMaps.brewingRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.brewery", SoundResource.NONE);
-        // Canner
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.canner", RecipeMaps.cannerRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.canner", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
-        // Centrifuge
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.centrifuge", RecipeMaps.centrifugeNonCellRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.centrifuge", SoundResource.NONE);
-        // Chemical Bath
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.chemicalbath", RecipeMaps.chemicalBathRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.chemicalbath", SoundResource.NONE);
-        // Chemical Reactor
-        GT_ProcessingArray_Manager
-            .addRecipeMapToPA("basicmachine.chemicalreactor", RecipeMaps.multiblockChemicalReactorRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.chemicalreactor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
-        // Circuit Assembler
-        GT_ProcessingArray_Manager
-            .addRecipeMapToPA("basicmachine.circuitassembler", RecipeMaps.circuitAssemblerRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.circuitassembler", SoundResource.NONE);
-        // Compressor
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.compressor", RecipeMaps.compressorRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.compressor", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
-        // Cutting Machine
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.cutter", RecipeMaps.cutterRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.cutter", SoundResource.NONE);
-        // Distillery
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.distillery", RecipeMaps.distilleryRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.distillery", SoundResource.GT_MACHINES_DISTILLERY_LOOP);
-        // Electrolyzer
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.electrolyzer", RecipeMaps.electrolyzerNonCellRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.electrolyzer", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
-        // Extractor
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.extractor", RecipeMaps.extractorRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.extractor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
-        // Extruder
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.extruder", RecipeMaps.extruderRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.extruder", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
-        // Fermenter
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fermenter", RecipeMaps.fermentingRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.fermenter", SoundResource.NONE);
-        // Fluid Canner
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidcanner", RecipeMaps.fluidCannerRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.fluidcanner", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
-        // Fluid Extractor
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidextractor", RecipeMaps.fluidExtractionRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.fluidextractor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
-        // Fluid Heater
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidheater", RecipeMaps.fluidHeaterRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.fluidheater", SoundResource.NONE);
-        // Fluid Solidifier
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidsolidifier", RecipeMaps.fluidSolidifierRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.fluidsolidifier", SoundResource.NONE);
-        // Forge Hammer
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.hammer", RecipeMaps.hammerRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.hammer", SoundResource.RANDOM_ANVIL_USE);
-        // Forming Press
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.press", RecipeMaps.formingPressRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.press", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
-        // Laser Engraver
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.laserengraver", RecipeMaps.laserEngraverRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.laserengraver", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
-        // Lathe
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.lathe", RecipeMaps.latheRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.lathe", SoundResource.NONE);
-        // Macerator
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.macerator", RecipeMaps.maceratorRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.macerator", SoundResource.IC2_MACHINES_MACERATOR_OP);
-        // Magnetic Separator
-        GT_ProcessingArray_Manager
-            .addRecipeMapToPA("basicmachine.electromagneticseparator", RecipeMaps.electroMagneticSeparatorRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.electromagneticseparator", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
-        // Matter Amplifier
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.amplifab", RecipeMaps.amplifierRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.amplifab", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
-        // Microwave
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.microwave", RecipeMaps.microwaveRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.microwave", SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP);
-        // Mixer
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.mixer", RecipeMaps.mixerNonCellRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.mixer", SoundResource.NONE);
-        // Ore Washer
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.orewasher", RecipeMaps.oreWasherRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.orewasher", SoundResource.NONE);
-        // Plasma Arc Furnace
-        GT_ProcessingArray_Manager
-            .addRecipeMapToPA("basicmachine.plasmaarcfurnace", RecipeMaps.plasmaArcFurnaceRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.plasmaarcfurnace", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
-        // Polarizer
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.polarizer", RecipeMaps.polarizerRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.polarizer", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
-        // Printer
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.printer", RecipeMaps.printerRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.printer", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
-        // Recycler
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.recycler", RecipeMaps.recyclerRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.recycler", SoundResource.IC2_MACHINES_RECYCLER_OP);
-        // Scanner
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.scanner", RecipeMaps.scannerFakeRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.scanner", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
-        // Sifter
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.sifter", RecipeMaps.sifterRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.sifter", SoundResource.NONE);
-        // Slicer
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.slicer", RecipeMaps.slicerRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.slicer", SoundResource.NONE);
-        // Thermal Centrifuge
-        GT_ProcessingArray_Manager
-            .addRecipeMapToPA("basicmachine.thermalcentrifuge", RecipeMaps.thermalCentrifugeRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.thermalcentrifuge", SoundResource.NONE);
-        // Unboxinator
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.unboxinator", RecipeMaps.unpackagerRecipes);
-        GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.unboxinator", SoundResource.NONE);
-        // Wiremill
-        GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.wiremill", RecipeMaps.wiremillRecipes);
-        GT_ProcessingArray_Manager
-            .addSoundResourceToPA("basicmachine.wiremill", SoundResource.IC2_MACHINES_RECYCLER_OP);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java b/src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java
deleted file mode 100644
index 70bb18527c..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package gregtech.loaders.postload;
-
-import static gregtech.api.enums.Mods.Chisel;
-import static gregtech.api.util.GT_ModHandler.addToRecyclerBlackList;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import com.glodblock.github.loader.ItemAndBlockHolder;
-
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Mods;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_ModHandler;
-
-public class GT_RecyclerBlacklistLoader implements Runnable {
-
-    @Override
-    public void run() {
-        GT_Log.out.println("GT_Mod: Adding Stuff to the Recycler Blacklist.");
-        addToRecyclerBlackList(new ItemStack(Items.arrow, 1, 0));
-        addToRecyclerBlackList(new ItemStack(Items.bone, 1, 0));
-        addToRecyclerBlackList(ItemList.Dye_Bonemeal.get(1L));
-
-        addToRecyclerBlackList(new ItemStack(Items.rotten_flesh, 1, 0));
-
-        addToRecyclerBlackList(new ItemStack(Items.string, 1, 0));
-
-        addToRecyclerBlackList(new ItemStack(Items.egg, 1, 0));
-        ItemStack tStack = new ItemStack(Blocks.cobblestone, 1, 0);
-        while (tStack != null) {
-            addToRecyclerBlackList(tStack);
-            tStack = GT_ModHandler
-                .getRecipeOutput(tStack, tStack, tStack, tStack, tStack, tStack, tStack, tStack, tStack);
-        }
-        addToRecyclerBlackList(new ItemStack(Blocks.gravel, 1, 32767));
-        addToRecyclerBlackList(new ItemStack(Items.flint, 1, 32767));
-        addToRecyclerBlackList(new ItemStack(Blocks.cobblestone_wall, 1, 32767));
-        addToRecyclerBlackList(new ItemStack(Blocks.sandstone_stairs, 1, 32767));
-        addToRecyclerBlackList(new ItemStack(Blocks.stone_stairs, 1, 32767));
-        addToRecyclerBlackList(new ItemStack(Blocks.stone_brick_stairs, 1, 32767));
-        addToRecyclerBlackList(GT_ModHandler.getSmeltingOutput(new ItemStack(Blocks.stone, 1, 0), false, null));
-        addToRecyclerBlackList(
-            GT_ModHandler
-                .getRecipeOutput(new ItemStack(Blocks.glass, 1, 0), null, null, new ItemStack(Blocks.glass, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler
-                .getRecipeOutput(new ItemStack(Blocks.stone, 1, 0), null, null, new ItemStack(Blocks.stone, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(
-                new ItemStack(Blocks.cobblestone, 1, 0),
-                null,
-                null,
-                new ItemStack(Blocks.cobblestone, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(
-                new ItemStack(Blocks.stone, 1, 0),
-                null,
-                new ItemStack(Blocks.stone, 1, 0),
-                null,
-                new ItemStack(Blocks.stone, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(
-                new ItemStack(Blocks.stone, 1, 0),
-                new ItemStack(Blocks.glass, 1, 0),
-                new ItemStack(Blocks.stone, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(
-                new ItemStack(Blocks.cobblestone, 1, 0),
-                new ItemStack(Blocks.glass, 1, 0),
-                new ItemStack(Blocks.cobblestone, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(
-                new ItemStack(Blocks.sandstone, 1, 0),
-                new ItemStack(Blocks.glass, 1, 0),
-                new ItemStack(Blocks.sandstone, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(
-                new ItemStack(Blocks.sand, 1, 0),
-                new ItemStack(Blocks.glass, 1, 0),
-                new ItemStack(Blocks.sand, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(
-                new ItemStack(Blocks.sandstone, 1, 0),
-                new ItemStack(Blocks.sandstone, 1, 0),
-                new ItemStack(Blocks.sandstone, 1, 0),
-                new ItemStack(Blocks.sandstone, 1, 0),
-                new ItemStack(Blocks.sandstone, 1, 0),
-                new ItemStack(Blocks.sandstone, 1, 0)));
-        addToRecyclerBlackList(GT_ModHandler.getRecipeOutput(new ItemStack(Blocks.glass, 1, 0)));
-        addToRecyclerBlackList(
-            GT_ModHandler.getRecipeOutput(new ItemStack(Blocks.glass, 1, 0), new ItemStack(Blocks.glass, 1, 0)));
-        if (Chisel.isModLoaded()) {
-            for (int i = 1; i <= 15; i++) {
-                addToRecyclerBlackList(GT_ModHandler.getModItem(Chisel.ID, "cobblestone", 1, i));
-            }
-            for (int i = 0; i <= 15; i++) {
-                addToRecyclerBlackList(GT_ModHandler.getModItem(Chisel.ID, "stonebricksmooth", 1, i));
-            }
-        }
-        if (Mods.AE2FluidCraft.isModLoaded()) {
-            addToRecyclerBlackList(new ItemStack(ItemAndBlockHolder.DROP));
-            addToRecyclerBlackList(new ItemStack(ItemAndBlockHolder.PACKET));
-        }
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java b/src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java
deleted file mode 100644
index 6d466abaa9..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package gregtech.loaders.postload;
-
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_Log;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-
-public class GT_ScrapboxDropLoader implements Runnable {
-
-    @Override
-    public void run() {
-        GT_Log.out.println("GT_Mod: (re-)adding Scrapbox Drops.");
-
-        GT_ModHandler.addScrapboxDrop(9.5F, new ItemStack(Items.wooden_hoe));
-        GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_axe));
-        GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_sword));
-        GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_shovel));
-        GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_pickaxe));
-        GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.sign));
-        GT_ModHandler.addScrapboxDrop(9.5F, new ItemStack(Items.stick));
-        GT_ModHandler.addScrapboxDrop(5.0F, new ItemStack(Blocks.dirt));
-        GT_ModHandler.addScrapboxDrop(3.0F, new ItemStack(Blocks.grass));
-        GT_ModHandler.addScrapboxDrop(3.0F, new ItemStack(Blocks.gravel));
-        GT_ModHandler.addScrapboxDrop(0.5F, new ItemStack(Blocks.pumpkin));
-        GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Blocks.soul_sand));
-        GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Blocks.netherrack));
-        GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.bone));
-        GT_ModHandler.addScrapboxDrop(9.0F, new ItemStack(Items.rotten_flesh));
-        GT_ModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_porkchop));
-        GT_ModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_beef));
-        GT_ModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_chicken));
-        GT_ModHandler.addScrapboxDrop(0.5F, new ItemStack(Items.apple));
-        GT_ModHandler.addScrapboxDrop(0.5F, new ItemStack(Items.bread));
-        GT_ModHandler.addScrapboxDrop(0.1F, new ItemStack(Items.cake));
-        GT_ModHandler.addScrapboxDrop(1.0F, ItemList.IC2_Food_Can_Filled.get(1L));
-        GT_ModHandler.addScrapboxDrop(2.0F, ItemList.IC2_Food_Can_Spoiled.get(1L));
-        GT_ModHandler.addScrapboxDrop(0.2F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1L));
-        GT_ModHandler.addScrapboxDrop(1.0F, GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L));
-        GT_ModHandler.addScrapboxDrop(2.0F, ItemList.Cell_Empty.get(1L));
-        GT_ModHandler.addScrapboxDrop(5.0F, GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 1L));
-        GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.leather));
-        GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.feather));
-        GT_ModHandler.addScrapboxDrop(0.7F, GT_ModHandler.getIC2Item("plantBall", 1L));
-        GT_ModHandler.addScrapboxDrop(3.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L));
-        GT_ModHandler.addScrapboxDrop(0.6F, new ItemStack(Items.slime_ball));
-        GT_ModHandler.addScrapboxDrop(0.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rubber, 1L));
-        GT_ModHandler.addScrapboxDrop(2.7F, GT_ModHandler.getIC2Item("suBattery", 1L));
-        GT_ModHandler.addScrapboxDrop(3.6F, ItemList.Circuit_Primitive.get(1L));
-        GT_ModHandler.addScrapboxDrop(0.8F, ItemList.Circuit_Parts_Advanced.get(1L));
-        GT_ModHandler.addScrapboxDrop(1.8F, ItemList.Circuit_Board_Basic.get(1L));
-        GT_ModHandler.addScrapboxDrop(0.4F, ItemList.Circuit_Board_Advanced.get(1L));
-        GT_ModHandler.addScrapboxDrop(0.2F, ItemList.Circuit_Board_Elite.get(1L));
-        GT_ModHandler.addScrapboxDrop(0.9F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L));
-        GT_ModHandler.addScrapboxDrop(0.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L));
-        GT_ModHandler.addScrapboxDrop(0.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L));
-        GT_ModHandler.addScrapboxDrop(2.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 1L));
-        GT_ModHandler.addScrapboxDrop(1.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L));
-        GT_ModHandler.addScrapboxDrop(1.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Electrum, 1L));
-        GT_ModHandler.addScrapboxDrop(1.2F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1L));
-        GT_ModHandler.addScrapboxDrop(1.2F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bauxite, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lead, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1L));
-        GT_ModHandler.addScrapboxDrop(1.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 1L));
-        GT_ModHandler.addScrapboxDrop(1.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L));
-        GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1L));
-        GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lazurite, 1L));
-        GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrite, 1L));
-        GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L));
-        GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodalite, 1L));
-        GT_ModHandler.addScrapboxDrop(4.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 1L));
-        GT_ModHandler.addScrapboxDrop(4.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Flint, 1L));
-        GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L));
-        GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1L));
-        GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L));
-        GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1L));
-        GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 1L));
-        GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GarnetRed, 1L));
-        GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GarnetYellow, 1L));
-        GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L));
-        GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L));
-        GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L));
-        GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L));
-        GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L));
-        GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Diamond, 1L));
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java b/src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java
deleted file mode 100644
index 921f227b08..0000000000
--- a/src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package gregtech.loaders.postload;
-
-import bloodasp.galacticgreg.WorldGenGaGT;
-import gregtech.api.enums.GTStones;
-import gregtech.api.enums.OreMixes;
-import gregtech.api.enums.SmallOres;
-import gregtech.api.util.GT_Log;
-import gregtech.common.GT_Worldgenerator;
-
-public class GT_Worldgenloader implements Runnable {
-
-    public void run() {
-        new GT_Worldgenerator();
-
-        // GT Stones
-        for (GTStones stone : GTStones.values()) {
-            stone.addGTStone();
-        }
-
-        // GT Default Small Ores
-        for (SmallOres smallOre : SmallOres.values()) {
-            smallOre.addGTSmallOre();
-        }
-
-        // GT Veins registration
-        for (OreMixes oreMix : OreMixes.values()) {
-            oreMix.addGTOreLayer();
-        }
-
-        new WorldGenGaGT().run();
-        GT_Log.out.println("Started Galactic Greg ore gen code");
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/ItemMaxStacksizeLoader.java b/src/main/java/gregtech/loaders/postload/ItemMaxStacksizeLoader.java
new file mode 100644
index 0000000000..7e2a1164e1
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/ItemMaxStacksizeLoader.java
@@ -0,0 +1,138 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+
+import gregtech.GTMod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GTLog;
+
+public class ItemMaxStacksizeLoader implements Runnable {
+
+    @Override
+    public void run() {
+        GTLog.out.println("GTMod: Changing maximum Stacksizes if configured.");
+
+        ItemList.Upgrade_Overclocker.getItem()
+            .setMaxStackSize(GTMod.gregtechproxy.mUpgradeCount);
+        Items.cake.setMaxStackSize(64);
+        Items.wooden_door.setMaxStackSize(8);
+        Items.iron_door.setMaxStackSize(8);
+        Items.ender_pearl.setMaxStackSize(64);
+        Items.egg.setMaxStackSize(64);
+        Items.snowball.setMaxStackSize(64);
+        Items.mushroom_stew.setMaxStackSize(64);
+        if (OrePrefixes.plank.mDefaultStackSize < 64) {
+            Item.getItemFromBlock(Blocks.wooden_slab)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.double_wooden_slab)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.oak_stairs)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.jungle_stairs)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.birch_stairs)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.spruce_stairs)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.acacia_stairs)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.dark_oak_stairs)
+                .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+        }
+        if (OrePrefixes.block.mDefaultStackSize < 64) {
+            Item.getItemFromBlock(Blocks.stone_slab)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.double_stone_slab)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.brick_stairs)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.nether_brick_stairs)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.sandstone_stairs)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.stone_stairs)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.stone_brick_stairs)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.packed_ice)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.ice)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.soul_sand)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.glowstone)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.snow)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.snow)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.iron_block)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.gold_block)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.emerald_block)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.lapis_block)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.diamond_block)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.clay)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.redstone_lamp)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.dirt)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.grass)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.mycelium)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.gravel)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.sand)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.brick_block)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.wool)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.melon_block)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.pumpkin)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.lit_pumpkin)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.dispenser)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.obsidian)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.piston)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.sticky_piston)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.crafting_table)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.glass)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.jukebox)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.anvil)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.chest)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.trapped_chest)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.noteblock)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.mob_spawner)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.bookshelf)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.furnace)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+            Item.getItemFromBlock(Blocks.lit_furnace)
+                .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+        }
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/MachineRecipeLoader.java b/src/main/java/gregtech/loaders/postload/MachineRecipeLoader.java
new file mode 100644
index 0000000000..c64ea6cf7b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/MachineRecipeLoader.java
@@ -0,0 +1,126 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.Materials;
+import gregtech.loaders.postload.chains.BauxiteRefineChain;
+import gregtech.loaders.postload.chains.NaniteChain;
+import gregtech.loaders.postload.chains.PCBFactoryRecipes;
+import gregtech.loaders.postload.chains.PurifiedWaterRecipes;
+import gregtech.loaders.postload.recipes.AlloySmelterRecipes;
+import gregtech.loaders.postload.recipes.ArcFurnaceRecipes;
+import gregtech.loaders.postload.recipes.AssemblerRecipes;
+import gregtech.loaders.postload.recipes.AssemblyLineRecipes;
+import gregtech.loaders.postload.recipes.AutoclaveRecipes;
+import gregtech.loaders.postload.recipes.BenderRecipes;
+import gregtech.loaders.postload.recipes.BlastFurnaceRecipes;
+import gregtech.loaders.postload.recipes.BreweryRecipes;
+import gregtech.loaders.postload.recipes.CannerRecipes;
+import gregtech.loaders.postload.recipes.CentrifugeRecipes;
+import gregtech.loaders.postload.recipes.ChemicalBathRecipes;
+import gregtech.loaders.postload.recipes.ChemicalRecipes;
+import gregtech.loaders.postload.recipes.CircuitAssemblerRecipes;
+import gregtech.loaders.postload.recipes.CompressorRecipes;
+import gregtech.loaders.postload.recipes.CropProcessingRecipes;
+import gregtech.loaders.postload.recipes.CuttingRecipes;
+import gregtech.loaders.postload.recipes.DistilleryRecipes;
+import gregtech.loaders.postload.recipes.ElectrolyzerRecipes;
+import gregtech.loaders.postload.recipes.ElectromagneticSeparatorRecipes;
+import gregtech.loaders.postload.recipes.ExtractorRecipes;
+import gregtech.loaders.postload.recipes.ExtruderRecipes;
+import gregtech.loaders.postload.recipes.FermenterRecipes;
+import gregtech.loaders.postload.recipes.FluidCannerRecipes;
+import gregtech.loaders.postload.recipes.FluidExtractorRecipes;
+import gregtech.loaders.postload.recipes.FluidHeaterRecipes;
+import gregtech.loaders.postload.recipes.FluidSolidifierRecipes;
+import gregtech.loaders.postload.recipes.ForgeHammerRecipes;
+import gregtech.loaders.postload.recipes.FormingPressRecipes;
+import gregtech.loaders.postload.recipes.FuelRecipes;
+import gregtech.loaders.postload.recipes.FusionReactorRecipes;
+import gregtech.loaders.postload.recipes.ImplosionCompressorRecipes;
+import gregtech.loaders.postload.recipes.LaserEngraverRecipes;
+import gregtech.loaders.postload.recipes.LatheRecipes;
+import gregtech.loaders.postload.recipes.MatterAmplifierRecipes;
+import gregtech.loaders.postload.recipes.MixerRecipes;
+import gregtech.loaders.postload.recipes.NEIHiding;
+import gregtech.loaders.postload.recipes.OreDictUnification;
+import gregtech.loaders.postload.recipes.PackagerRecipes;
+import gregtech.loaders.postload.recipes.PlasmaForgeRecipes;
+import gregtech.loaders.postload.recipes.PrinterRecipes;
+import gregtech.loaders.postload.recipes.Pulverizer;
+import gregtech.loaders.postload.recipes.PyrolyseRecipes;
+import gregtech.loaders.postload.recipes.RecipeRemover;
+import gregtech.loaders.postload.recipes.SifterRecipes;
+import gregtech.loaders.postload.recipes.SlicerRecipes;
+import gregtech.loaders.postload.recipes.SmelterRecipes;
+import gregtech.loaders.postload.recipes.ThaumcraftRecipes;
+import gregtech.loaders.postload.recipes.ThermalCentrifugeRecipes;
+import gregtech.loaders.postload.recipes.TranscendentPlasmaMixerRecipes;
+import gregtech.loaders.postload.recipes.VacuumFreezerRecipes;
+import gregtech.loaders.postload.recipes.WiremillRecipes;
+
+public class MachineRecipeLoader implements Runnable {
+
+    public static final String aTextTCGTPage = "gt.research.page.1.";
+
+    public static final Materials[] solderingMats = new Materials[] { Materials.Lead, Materials.SolderingAlloy,
+        Materials.Tin };
+
+    @Override
+    public void run() {
+        new AlloySmelterRecipes().run();
+        new ArcFurnaceRecipes().run();
+        new AssemblerRecipes().run();
+        new AssemblyLineRecipes().run();
+        new AutoclaveRecipes().run();
+        new BenderRecipes().run();
+        new BlastFurnaceRecipes().run();
+        new BreweryRecipes().run();
+        new CannerRecipes().run();
+        new CentrifugeRecipes().run();
+        new ChemicalBathRecipes().run();
+        new ChemicalRecipes().run();
+        new CircuitAssemblerRecipes().run();
+        new CompressorRecipes().run();
+        new CropProcessingRecipes().run();
+        new CuttingRecipes().run();
+        new DistilleryRecipes().run();
+        new ElectrolyzerRecipes().run();
+        new ElectromagneticSeparatorRecipes().run();
+        new ExtractorRecipes().run();
+        new ExtruderRecipes().run();
+        new FermenterRecipes().run();
+        new FluidCannerRecipes().run();
+        new FluidExtractorRecipes().run();
+        new FluidHeaterRecipes().run();
+        new FluidSolidifierRecipes().run();
+        new ForgeHammerRecipes().run();
+        new FormingPressRecipes().run();
+        new FuelRecipes().run();
+        new FusionReactorRecipes().run();
+        new ImplosionCompressorRecipes().run();
+        new LaserEngraverRecipes().run();
+        new LatheRecipes().run();
+        new MatterAmplifierRecipes().run();
+        new MixerRecipes().run();
+        new NEIHiding().run();
+        new OreDictUnification().run();
+        new PackagerRecipes().run();
+        new PlasmaForgeRecipes().run();
+        new PrinterRecipes().run();
+        new Pulverizer().run();
+        new PyrolyseRecipes().run();
+        new RecipeRemover().run();
+        new SifterRecipes().run();
+        new SlicerRecipes().run();
+        new SmelterRecipes().run();
+        new ThaumcraftRecipes().run();
+        new ThermalCentrifugeRecipes().run();
+        new VacuumFreezerRecipes().run();
+        new WiremillRecipes().run();
+        new TranscendentPlasmaMixerRecipes().run();
+
+        BauxiteRefineChain.run();
+        NaniteChain.run();
+        PCBFactoryRecipes.load();
+        PurifiedWaterRecipes.run();
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/MachineTooltipsLoader.java b/src/main/java/gregtech/loaders/postload/MachineTooltipsLoader.java
new file mode 100644
index 0000000000..2043576494
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/MachineTooltipsLoader.java
@@ -0,0 +1,36 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.enums.GTValues.GT;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTechAPI;
+import gregtech.api.util.GTLanguageManager;
+import gregtech.api.util.GTLog;
+import gregtech.common.blocks.ItemMachines;
+
+public class MachineTooltipsLoader implements Runnable {
+
+    @Override
+    public void run() {
+        if (!GT.isClientSide()) return;
+        GTLog.out.println("GT Mod: Register Block Machine's tooltips");
+        for (int i = 0; i < 32768; i++) {
+            ItemStack tStack = new ItemStack(GregTechAPI.sBlockMachines, 1, i);
+            if (tStack.getItem() != null && tStack.getItem() instanceof ItemMachines) {
+                ((ItemMachines) tStack.getItem()).registerDescription(i);
+            }
+        }
+        GTLanguageManager.addStringLocalization("TileEntity_EUp_IN", "Voltage IN: ");
+        GTLanguageManager.addStringLocalization("TileEntity_EUp_OUT", "Voltage OUT: ");
+        GTLanguageManager.addStringLocalization("TileEntity_EUp_AMOUNT", "Amperage: ");
+        GTLanguageManager.addStringLocalization("TileEntity_EUp_STORE", "Capacity: ");
+        GTLanguageManager.addStringLocalization("TileEntity_TANK_INFO", "Contains Fluid: ");
+        GTLanguageManager.addStringLocalization("TileEntity_TANK_AMOUNT", "Fluid Amount: ");
+        GTLanguageManager.addStringLocalization("TileEntity_CHEST_INFO", "Contains Item: ");
+        GTLanguageManager.addStringLocalization("TileEntity_CHEST_AMOUNT", "Item Amount: ");
+        GTLanguageManager.addStringLocalization("GT_TileEntity_MUFFLER", "has Muffler Upgrade");
+        GTLanguageManager.addStringLocalization("GT_TileEntity_STEAMCONVERTER", "has Steam Upgrade");
+        GTLanguageManager.addStringLocalization("GT_TileEntity_STEAMTANKS", "Steam Tank Upgrades");
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/MinableRegistrator.java b/src/main/java/gregtech/loaders/postload/MinableRegistrator.java
new file mode 100644
index 0000000000..ea59486146
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/MinableRegistrator.java
@@ -0,0 +1,16 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTModHandler;
+
+public class MinableRegistrator implements Runnable {
+
+    @Override
+    public void run() {
+        GTLog.out.println("GTMod: Adding Blocks to the Miners Valuable List.");
+        GTModHandler.addValuableOre(Blocks.glowstone, 0, 1);
+        GTModHandler.addValuableOre(Blocks.soul_sand, 0, 1);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/PCBFactoryMaterialLoader.java b/src/main/java/gregtech/loaders/postload/PCBFactoryMaterialLoader.java
new file mode 100644
index 0000000000..0f6ab52a32
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/PCBFactoryMaterialLoader.java
@@ -0,0 +1,19 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.util.PCBFactoryManager;
+
+public class PCBFactoryMaterialLoader {
+
+    public static void load() {
+        // add Plastics
+        PCBFactoryManager.addPlasticTier(Materials.Plastic, 1);
+        PCBFactoryManager.addPlasticTier(Materials.PolyvinylChloride, 2);
+        PCBFactoryManager.addPlasticTier(Materials.Polytetrafluoroethylene, 3);
+        PCBFactoryManager.addPlasticTier(Materials.Epoxid, 4);
+        PCBFactoryManager.addPlasticTier(Materials.EpoxidFiberReinforced, 5);
+        PCBFactoryManager.addPlasticTier(Materials.Polybenzimidazole, 6);
+        PCBFactoryManager.addPlasticTier(MaterialsKevlar.Kevlar, 7);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java b/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
index 389ac1cc57..cb8d73cae1 100644
--- a/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
+++ b/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
@@ -14,7 +14,7 @@ import appeng.api.networking.ticking.TickingRequest;
 import appeng.parts.AEBasePart;
 import appeng.parts.p2p.PartP2PIC2Power;
 import gregtech.api.interfaces.tileentity.IEnergyConnected;
-import gregtech.api.util.GT_Log;
+import gregtech.api.util.GTLog;
 
 public class PartP2PGTPower extends PartP2PIC2Power implements IGridTickable {
 
@@ -96,8 +96,8 @@ public class PartP2PGTPower extends PartP2PIC2Power implements IGridTickable {
             fSide.setAccessible(true);
             return (ForgeDirection) fSide.get(this);
         } catch (Exception e) {
-            GT_Log.out.println("A fatal error occured at the P2P tunnel for GT electricity");
-            e.printStackTrace(GT_Log.out);
+            GTLog.out.println("A fatal error occured at the P2P tunnel for GT electricity");
+            e.printStackTrace(GTLog.out);
             throw new RuntimeException(e);
         }
     }
diff --git a/src/main/java/gregtech/loaders/postload/PosteaTransformers.java b/src/main/java/gregtech/loaders/postload/PosteaTransformers.java
index ae24de26e8..d920872f0e 100644
--- a/src/main/java/gregtech/loaders/postload/PosteaTransformers.java
+++ b/src/main/java/gregtech/loaders/postload/PosteaTransformers.java
@@ -8,8 +8,8 @@ import com.gtnewhorizons.postea.api.TileEntityReplacementManager;
 import com.gtnewhorizons.postea.utility.BlockInfo;
 
 import cpw.mods.fml.common.registry.GameRegistry;
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enums.GTValues;
 import vexatos.tgregworks.reference.Mods;
 
 public class PosteaTransformers implements Runnable {
@@ -34,7 +34,7 @@ public class PosteaTransformers implements Runnable {
             int indexInMaterialList = id - 4096;
             // The offset from 4096 is the index in the material list, so if this is outside the valid range then this
             // is not a valid frame box, and we don't want to modify it
-            if (indexInMaterialList < 0 || indexInMaterialList >= GregTech_API.sGeneratedMaterials.length) {
+            if (indexInMaterialList < 0 || indexInMaterialList >= GregTechAPI.sGeneratedMaterials.length) {
                 // Do not modify this TE, so return null
                 return null;
             }
@@ -44,12 +44,12 @@ public class PosteaTransformers implements Runnable {
             // is the new frame block. We can make sure to keep the TE using a pass-through transformer.
             // This works because between the old and new frame systems, the TileEntity used for covered frames
             // is still the same
-            if (tag.hasKey(GT_Values.NBT.COVERS)) {
-                return new BlockInfo(GregTech_API.sBlockFrames, indexInMaterialList, PosteaTransformers::passthrough);
+            if (tag.hasKey(GTValues.NBT.COVERS)) {
+                return new BlockInfo(GregTechAPI.sBlockFrames, indexInMaterialList, PosteaTransformers::passthrough);
             }
 
             // If this frame has no covers, simply return a block and delete the TileEntity
-            return new BlockInfo(GregTech_API.sBlockFrames, indexInMaterialList);
+            return new BlockInfo(GregTechAPI.sBlockFrames, indexInMaterialList);
         });
 
         ItemStackReplacementManager.addItemReplacement("gregtech:gt.blockmachines", (tag) -> {
@@ -57,12 +57,12 @@ public class PosteaTransformers implements Runnable {
             int id = tag.getInteger("Damage");
             int indexInMaterialList = id - 4096;
             // Not a frame box
-            if (indexInMaterialList < 0 || indexInMaterialList >= GregTech_API.sGeneratedMaterials.length) {
+            if (indexInMaterialList < 0 || indexInMaterialList >= GregTechAPI.sGeneratedMaterials.length) {
                 return tag;
             }
             // Not a frame box if the material for this id does not have a frame box associated with it.
             // Apparently the DEFC ID overlaps with the material ID for a Bastnasite frame box for example
-            if ((GregTech_API.sGeneratedMaterials[indexInMaterialList].mTypes & 0x2) == 0) {
+            if ((GregTechAPI.sGeneratedMaterials[indexInMaterialList].mTypes & 0x2) == 0) {
                 return tag;
             }
             Item frameItem = GameRegistry.findItem(Mods.GregTech, "gt.blockframes");
diff --git a/src/main/java/gregtech/loaders/postload/ProcessingArrayRecipeLoader.java b/src/main/java/gregtech/loaders/postload/ProcessingArrayRecipeLoader.java
new file mode 100644
index 0000000000..9525041fcc
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/ProcessingArrayRecipeLoader.java
@@ -0,0 +1,156 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.ProcessingArrayManager;
+
+public class ProcessingArrayRecipeLoader {
+
+    public static void registerDefaultGregtechMaps() {
+
+        // Alloy Smelter
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.alloysmelter", RecipeMaps.alloySmelterRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.alloysmelter", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+        // Arc Furnace
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.arcfurnace", RecipeMaps.arcFurnaceRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.arcfurnace", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+        // Assembler
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.assembler", RecipeMaps.assemblerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.assembler", SoundResource.NONE);
+        // Autoclave
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.autoclave", RecipeMaps.autoclaveRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.autoclave", SoundResource.NONE);
+        // Bender
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.bender", RecipeMaps.benderRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.bender", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+        // Boxinator
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.boxinator", RecipeMaps.packagerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.boxinator", SoundResource.NONE);
+        // Brewery
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.brewery", RecipeMaps.brewingRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.brewery", SoundResource.NONE);
+        // Canner
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.canner", RecipeMaps.cannerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.canner", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+        // Centrifuge
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.centrifuge", RecipeMaps.centrifugeNonCellRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.centrifuge", SoundResource.NONE);
+        // Chemical Bath
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.chemicalbath", RecipeMaps.chemicalBathRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.chemicalbath", SoundResource.NONE);
+        // Chemical Reactor
+        ProcessingArrayManager
+            .addRecipeMapToPA("basicmachine.chemicalreactor", RecipeMaps.multiblockChemicalReactorRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.chemicalreactor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+        // Circuit Assembler
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.circuitassembler", RecipeMaps.circuitAssemblerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.circuitassembler", SoundResource.NONE);
+        // Compressor
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.compressor", RecipeMaps.compressorRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.compressor", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+        // Cutting Machine
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.cutter", RecipeMaps.cutterRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.cutter", SoundResource.NONE);
+        // Distillery
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.distillery", RecipeMaps.distilleryRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.distillery", SoundResource.GT_MACHINES_DISTILLERY_LOOP);
+        // Electrolyzer
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.electrolyzer", RecipeMaps.electrolyzerNonCellRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.electrolyzer", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+        // Extractor
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.extractor", RecipeMaps.extractorRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.extractor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+        // Extruder
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.extruder", RecipeMaps.extruderRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.extruder", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+        // Fermenter
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.fermenter", RecipeMaps.fermentingRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.fermenter", SoundResource.NONE);
+        // Fluid Canner
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.fluidcanner", RecipeMaps.fluidCannerRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.fluidcanner", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+        // Fluid Extractor
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.fluidextractor", RecipeMaps.fluidExtractionRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.fluidextractor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+        // Fluid Heater
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.fluidheater", RecipeMaps.fluidHeaterRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.fluidheater", SoundResource.NONE);
+        // Fluid Solidifier
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.fluidsolidifier", RecipeMaps.fluidSolidifierRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.fluidsolidifier", SoundResource.NONE);
+        // Forge Hammer
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.hammer", RecipeMaps.hammerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.hammer", SoundResource.RANDOM_ANVIL_USE);
+        // Forming Press
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.press", RecipeMaps.formingPressRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.press", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+        // Laser Engraver
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.laserengraver", RecipeMaps.laserEngraverRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.laserengraver", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+        // Lathe
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.lathe", RecipeMaps.latheRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.lathe", SoundResource.NONE);
+        // Macerator
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.macerator", RecipeMaps.maceratorRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.macerator", SoundResource.IC2_MACHINES_MACERATOR_OP);
+        // Magnetic Separator
+        ProcessingArrayManager
+            .addRecipeMapToPA("basicmachine.electromagneticseparator", RecipeMaps.electroMagneticSeparatorRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.electromagneticseparator", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+        // Matter Amplifier
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.amplifab", RecipeMaps.amplifierRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.amplifab", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+        // Microwave
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.microwave", RecipeMaps.microwaveRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.microwave", SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP);
+        // Mixer
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.mixer", RecipeMaps.mixerNonCellRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.mixer", SoundResource.NONE);
+        // Ore Washer
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.orewasher", RecipeMaps.oreWasherRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.orewasher", SoundResource.NONE);
+        // Plasma Arc Furnace
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.plasmaarcfurnace", RecipeMaps.plasmaArcFurnaceRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.plasmaarcfurnace", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+        // Polarizer
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.polarizer", RecipeMaps.polarizerRecipes);
+        ProcessingArrayManager
+            .addSoundResourceToPA("basicmachine.polarizer", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+        // Printer
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.printer", RecipeMaps.printerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.printer", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+        // Recycler
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.recycler", RecipeMaps.recyclerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.recycler", SoundResource.IC2_MACHINES_RECYCLER_OP);
+        // Scanner
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.scanner", RecipeMaps.scannerFakeRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.scanner", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+        // Sifter
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.sifter", RecipeMaps.sifterRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.sifter", SoundResource.NONE);
+        // Slicer
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.slicer", RecipeMaps.slicerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.slicer", SoundResource.NONE);
+        // Thermal Centrifuge
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.thermalcentrifuge", RecipeMaps.thermalCentrifugeRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.thermalcentrifuge", SoundResource.NONE);
+        // Unboxinator
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.unboxinator", RecipeMaps.unpackagerRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.unboxinator", SoundResource.NONE);
+        // Wiremill
+        ProcessingArrayManager.addRecipeMapToPA("basicmachine.wiremill", RecipeMaps.wiremillRecipes);
+        ProcessingArrayManager.addSoundResourceToPA("basicmachine.wiremill", SoundResource.IC2_MACHINES_RECYCLER_OP);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/RecyclerBlacklistLoader.java b/src/main/java/gregtech/loaders/postload/RecyclerBlacklistLoader.java
new file mode 100644
index 0000000000..e2c821512f
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/RecyclerBlacklistLoader.java
@@ -0,0 +1,107 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.enums.Mods.Chisel;
+import static gregtech.api.util.GTModHandler.addToRecyclerBlackList;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import com.glodblock.github.loader.ItemAndBlockHolder;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTModHandler;
+
+public class RecyclerBlacklistLoader implements Runnable {
+
+    @Override
+    public void run() {
+        GTLog.out.println("GTMod: Adding Stuff to the Recycler Blacklist.");
+        addToRecyclerBlackList(new ItemStack(Items.arrow, 1, 0));
+        addToRecyclerBlackList(new ItemStack(Items.bone, 1, 0));
+        addToRecyclerBlackList(ItemList.Dye_Bonemeal.get(1L));
+
+        addToRecyclerBlackList(new ItemStack(Items.rotten_flesh, 1, 0));
+
+        addToRecyclerBlackList(new ItemStack(Items.string, 1, 0));
+
+        addToRecyclerBlackList(new ItemStack(Items.egg, 1, 0));
+        ItemStack tStack = new ItemStack(Blocks.cobblestone, 1, 0);
+        while (tStack != null) {
+            addToRecyclerBlackList(tStack);
+            tStack = GTModHandler
+                .getRecipeOutput(tStack, tStack, tStack, tStack, tStack, tStack, tStack, tStack, tStack);
+        }
+        addToRecyclerBlackList(new ItemStack(Blocks.gravel, 1, 32767));
+        addToRecyclerBlackList(new ItemStack(Items.flint, 1, 32767));
+        addToRecyclerBlackList(new ItemStack(Blocks.cobblestone_wall, 1, 32767));
+        addToRecyclerBlackList(new ItemStack(Blocks.sandstone_stairs, 1, 32767));
+        addToRecyclerBlackList(new ItemStack(Blocks.stone_stairs, 1, 32767));
+        addToRecyclerBlackList(new ItemStack(Blocks.stone_brick_stairs, 1, 32767));
+        addToRecyclerBlackList(GTModHandler.getSmeltingOutput(new ItemStack(Blocks.stone, 1, 0), false, null));
+        addToRecyclerBlackList(
+            GTModHandler
+                .getRecipeOutput(new ItemStack(Blocks.glass, 1, 0), null, null, new ItemStack(Blocks.glass, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler
+                .getRecipeOutput(new ItemStack(Blocks.stone, 1, 0), null, null, new ItemStack(Blocks.stone, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(
+                new ItemStack(Blocks.cobblestone, 1, 0),
+                null,
+                null,
+                new ItemStack(Blocks.cobblestone, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(
+                new ItemStack(Blocks.stone, 1, 0),
+                null,
+                new ItemStack(Blocks.stone, 1, 0),
+                null,
+                new ItemStack(Blocks.stone, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(
+                new ItemStack(Blocks.stone, 1, 0),
+                new ItemStack(Blocks.glass, 1, 0),
+                new ItemStack(Blocks.stone, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(
+                new ItemStack(Blocks.cobblestone, 1, 0),
+                new ItemStack(Blocks.glass, 1, 0),
+                new ItemStack(Blocks.cobblestone, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(
+                new ItemStack(Blocks.sandstone, 1, 0),
+                new ItemStack(Blocks.glass, 1, 0),
+                new ItemStack(Blocks.sandstone, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(
+                new ItemStack(Blocks.sand, 1, 0),
+                new ItemStack(Blocks.glass, 1, 0),
+                new ItemStack(Blocks.sand, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(
+                new ItemStack(Blocks.sandstone, 1, 0),
+                new ItemStack(Blocks.sandstone, 1, 0),
+                new ItemStack(Blocks.sandstone, 1, 0),
+                new ItemStack(Blocks.sandstone, 1, 0),
+                new ItemStack(Blocks.sandstone, 1, 0),
+                new ItemStack(Blocks.sandstone, 1, 0)));
+        addToRecyclerBlackList(GTModHandler.getRecipeOutput(new ItemStack(Blocks.glass, 1, 0)));
+        addToRecyclerBlackList(
+            GTModHandler.getRecipeOutput(new ItemStack(Blocks.glass, 1, 0), new ItemStack(Blocks.glass, 1, 0)));
+        if (Chisel.isModLoaded()) {
+            for (int i = 1; i <= 15; i++) {
+                addToRecyclerBlackList(GTModHandler.getModItem(Chisel.ID, "cobblestone", 1, i));
+            }
+            for (int i = 0; i <= 15; i++) {
+                addToRecyclerBlackList(GTModHandler.getModItem(Chisel.ID, "stonebricksmooth", 1, i));
+            }
+        }
+        if (Mods.AE2FluidCraft.isModLoaded()) {
+            addToRecyclerBlackList(new ItemStack(ItemAndBlockHolder.DROP));
+            addToRecyclerBlackList(new ItemStack(ItemAndBlockHolder.PACKET));
+        }
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/ScrapboxDropLoader.java b/src/main/java/gregtech/loaders/postload/ScrapboxDropLoader.java
new file mode 100644
index 0000000000..8574087d31
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/ScrapboxDropLoader.java
@@ -0,0 +1,100 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GTLog;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+
+public class ScrapboxDropLoader implements Runnable {
+
+    @Override
+    public void run() {
+        GTLog.out.println("GTMod: (re-)adding Scrapbox Drops.");
+
+        GTModHandler.addScrapboxDrop(9.5F, new ItemStack(Items.wooden_hoe));
+        GTModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_axe));
+        GTModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_sword));
+        GTModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_shovel));
+        GTModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_pickaxe));
+        GTModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.sign));
+        GTModHandler.addScrapboxDrop(9.5F, new ItemStack(Items.stick));
+        GTModHandler.addScrapboxDrop(5.0F, new ItemStack(Blocks.dirt));
+        GTModHandler.addScrapboxDrop(3.0F, new ItemStack(Blocks.grass));
+        GTModHandler.addScrapboxDrop(3.0F, new ItemStack(Blocks.gravel));
+        GTModHandler.addScrapboxDrop(0.5F, new ItemStack(Blocks.pumpkin));
+        GTModHandler.addScrapboxDrop(1.0F, new ItemStack(Blocks.soul_sand));
+        GTModHandler.addScrapboxDrop(2.0F, new ItemStack(Blocks.netherrack));
+        GTModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.bone));
+        GTModHandler.addScrapboxDrop(9.0F, new ItemStack(Items.rotten_flesh));
+        GTModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_porkchop));
+        GTModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_beef));
+        GTModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_chicken));
+        GTModHandler.addScrapboxDrop(0.5F, new ItemStack(Items.apple));
+        GTModHandler.addScrapboxDrop(0.5F, new ItemStack(Items.bread));
+        GTModHandler.addScrapboxDrop(0.1F, new ItemStack(Items.cake));
+        GTModHandler.addScrapboxDrop(1.0F, ItemList.IC2_Food_Can_Filled.get(1L));
+        GTModHandler.addScrapboxDrop(2.0F, ItemList.IC2_Food_Can_Spoiled.get(1L));
+        GTModHandler.addScrapboxDrop(0.2F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1L));
+        GTModHandler.addScrapboxDrop(1.0F, GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L));
+        GTModHandler.addScrapboxDrop(2.0F, ItemList.Cell_Empty.get(1L));
+        GTModHandler.addScrapboxDrop(5.0F, GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 1L));
+        GTModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.leather));
+        GTModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.feather));
+        GTModHandler.addScrapboxDrop(0.7F, GTModHandler.getIC2Item("plantBall", 1L));
+        GTModHandler.addScrapboxDrop(3.8F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L));
+        GTModHandler.addScrapboxDrop(0.6F, new ItemStack(Items.slime_ball));
+        GTModHandler.addScrapboxDrop(0.8F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Rubber, 1L));
+        GTModHandler.addScrapboxDrop(2.7F, GTModHandler.getIC2Item("suBattery", 1L));
+        GTModHandler.addScrapboxDrop(3.6F, ItemList.Circuit_Primitive.get(1L));
+        GTModHandler.addScrapboxDrop(0.8F, ItemList.Circuit_Parts_Advanced.get(1L));
+        GTModHandler.addScrapboxDrop(1.8F, ItemList.Circuit_Board_Basic.get(1L));
+        GTModHandler.addScrapboxDrop(0.4F, ItemList.Circuit_Board_Advanced.get(1L));
+        GTModHandler.addScrapboxDrop(0.2F, ItemList.Circuit_Board_Elite.get(1L));
+        GTModHandler.addScrapboxDrop(0.9F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L));
+        GTModHandler.addScrapboxDrop(0.8F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L));
+        GTModHandler.addScrapboxDrop(0.8F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L));
+        GTModHandler.addScrapboxDrop(2.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 1L));
+        GTModHandler.addScrapboxDrop(1.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L));
+        GTModHandler.addScrapboxDrop(1.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Electrum, 1L));
+        GTModHandler.addScrapboxDrop(1.2F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1L));
+        GTModHandler.addScrapboxDrop(1.2F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bauxite, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lead, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1L));
+        GTModHandler.addScrapboxDrop(1.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 1L));
+        GTModHandler.addScrapboxDrop(1.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L));
+        GTModHandler.addScrapboxDrop(2.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1L));
+        GTModHandler.addScrapboxDrop(2.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lazurite, 1L));
+        GTModHandler.addScrapboxDrop(2.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Pyrite, 1L));
+        GTModHandler.addScrapboxDrop(2.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L));
+        GTModHandler.addScrapboxDrop(2.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodalite, 1L));
+        GTModHandler.addScrapboxDrop(4.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 1L));
+        GTModHandler.addScrapboxDrop(4.0F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Flint, 1L));
+        GTModHandler.addScrapboxDrop(0.03F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L));
+        GTModHandler.addScrapboxDrop(0.03F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1L));
+        GTModHandler.addScrapboxDrop(0.03F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L));
+        GTModHandler.addScrapboxDrop(0.03F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1L));
+        GTModHandler.addScrapboxDrop(0.03F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 1L));
+        GTModHandler.addScrapboxDrop(0.03F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.GarnetRed, 1L));
+        GTModHandler.addScrapboxDrop(0.5F, GTOreDictUnificator.get(OrePrefixes.dust, Materials.GarnetYellow, 1L));
+        GTModHandler.addScrapboxDrop(0.05F, GTOreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L));
+        GTModHandler.addScrapboxDrop(0.05F, GTOreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L));
+        GTModHandler.addScrapboxDrop(0.05F, GTOreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L));
+        GTModHandler.addScrapboxDrop(0.05F, GTOreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L));
+        GTModHandler.addScrapboxDrop(0.05F, GTOreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L));
+        GTModHandler.addScrapboxDrop(0.05F, GTOreDictUnificator.get(OrePrefixes.gem, Materials.Diamond, 1L));
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/BauxiteRefineChain.java b/src/main/java/gregtech/loaders/postload/chains/BauxiteRefineChain.java
new file mode 100644
index 0000000000..ec108b7cc9
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/BauxiteRefineChain.java
@@ -0,0 +1,297 @@
+package gregtech.loaders.postload.chains;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GTValues;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsOreAlum;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+
+public class BauxiteRefineChain {
+
+    public static void run() {
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Bauxite, 32),
+                Materials.SodiumHydroxide.getDust(9),
+                Materials.Quicklime.getDust(4),
+                GTUtility.getIntegratedCircuit(8))
+            .fluidInputs(Materials.Water.getFluid(5000))
+            .fluidOutputs(MaterialsOreAlum.BauxiteSlurry.getFluid(8000))
+            .duration(10 * SECONDS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(mixerRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Bauxite, 32),
+                Materials.SodiumHydroxide.getDust(9),
+                Materials.Quicklime.getDust(4),
+                GTUtility.getIntegratedCircuit(8))
+            .fluidInputs(Materials.Water.getFluid(5000))
+            .fluidOutputs(MaterialsOreAlum.BauxiteSlurry.getFluid(8000))
+            .duration(10 * SECONDS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(mixerRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
+            .fluidInputs(MaterialsOreAlum.BauxiteSlurry.getFluid(2000))
+            .fluidOutputs(MaterialsOreAlum.HeatedBauxiteSlurry.getFluid(2000))
+            .duration(2 * SECONDS)
+            .eut(TierEU.RECIPE_HV)
+            .noOptimize()
+            .addTo(fluidHeaterRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Aluminiumhydroxide.getDust(1))
+            .itemOutputs(
+                Materials.Aluminiumoxide.getDust(64),
+                Materials.Aluminiumoxide.getDust(16),
+                Materials.SodiumCarbonate.getDust(9),
+                Materials.Calcite.getDust(10),
+                MaterialsOreAlum.BauxiteSlag.getDust(16))
+            .fluidInputs(Materials.CarbonDioxide.getGas(5000), MaterialsOreAlum.HeatedBauxiteSlurry.getFluid(8000))
+            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(5000))
+            .duration(15 * SECONDS)
+            .eut(TierEU.RECIPE_HV)
+            .addTo(multiblockChemicalReactorRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(MaterialsOreAlum.BauxiteSlag.getDust(1))
+            .itemOutputs(
+                Materials.Rutile.getDust(1),
+                Materials.Gallium.getDust(1),
+                Materials.Quicklime.getDust(1),
+                Materials.SiliconDioxide.getDust(1),
+                Materials.Iron.getDust(1))
+            .outputChances(10000, 3000, 2000, 9000, 8000)
+            .duration(2 * SECONDS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Ilmenite, 1))
+            .itemOutputs(Materials.Rutile.getDust(2), MaterialsOreAlum.IlmeniteSlag.getDust(1))
+            .outputChances(10000, 3000)
+            .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+            .fluidOutputs(new FluidStack(ItemList.sGreenVitriol, 2000))
+            .duration(21 * SECONDS)
+            .eut(1000)
+            .addTo(chemicalBathRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Ilmenite, 1))
+            .itemOutputs(Materials.Rutile.getDust(2), MaterialsOreAlum.IlmeniteSlag.getDust(1))
+            .outputChances(10000, 6000)
+            .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+            .fluidOutputs(new FluidStack(ItemList.sGreenVitriol, 2000))
+            .duration(21 * SECONDS)
+            .eut(1000)
+            .addTo(chemicalBathRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(MaterialsOreAlum.IlmeniteSlag.getDust(1))
+            .itemOutputs(
+                Materials.Iron.getDust(1),
+                Materials.Niobium.getDust(1),
+                Materials.Tantalum.getDust(1),
+                Materials.Manganese.getDust(1),
+                Materials.Magnesium.getDust(1))
+            .outputChances(8000, 500, 2000, 5000, 6000)
+            .duration(2 * SECONDS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+
+        OrePrefixes[] washable = new OrePrefixes[] { OrePrefixes.crushed, OrePrefixes.crushedPurified,
+            OrePrefixes.dustImpure, OrePrefixes.dustPure };
+
+        for (OrePrefixes ore : washable) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTOreDictUnificator.get(ore, Materials.Sapphire, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+                .fluidOutputs(MaterialsOreAlum.SapphireJuice.getFluid(1000))
+                .duration(2 * SECONDS)
+                .eut(100)
+                .addTo(mixerRecipes);
+
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTOreDictUnificator.get(ore, Materials.GreenSapphire, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+                .fluidOutputs(MaterialsOreAlum.GreenSapphireJuice.getFluid(1000))
+                .duration(2 * SECONDS)
+                .eut(100)
+                .addTo(mixerRecipes);
+
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTOreDictUnificator.get(ore, Materials.Ruby, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+                .fluidOutputs(MaterialsOreAlum.RubyJuice.getFluid(1000))
+                .duration(2 * SECONDS)
+                .eut(100)
+                .addTo(mixerRecipes);
+        }
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(
+                Materials.Aluminiumhydroxide.getDust(3),
+                Materials.Iron.getDust(1),
+                Materials.Vanadium.getDust(1),
+                Materials.Magnesium.getDust(1))
+            .outputChances(10000, 300, 200, 200)
+            .fluidInputs(MaterialsOreAlum.SapphireJuice.getFluid(1000))
+            .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(100)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(
+                Materials.Aluminiumhydroxide.getDust(3),
+                Materials.Iron.getDust(1),
+                Materials.Vanadium.getDust(1),
+                Materials.Manganese.getDust(1),
+                Materials.Beryllium.getDust(1))
+            .outputChances(10000, 300, 200, 200, 200)
+            .fluidInputs(MaterialsOreAlum.GreenSapphireJuice.getFluid(1000))
+            .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(100)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(
+                Materials.Aluminiumhydroxide.getDust(3),
+                Materials.Chrome.getDust(1),
+                Materials.Iron.getDust(1),
+                Materials.Vanadium.getDust(1),
+                Materials.Magnesium.getDust(1))
+            .outputChances(10000, 5000, 300, 200, 200)
+            .fluidInputs(MaterialsOreAlum.RubyJuice.getFluid(1000))
+            .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(100)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Pyrope.getDust(1))
+            .itemOutputs(
+                Materials.Aluminiumoxide.getDust(1),
+                Materials.Magnesia.getDust(1),
+                Materials.Silver.getDust(1),
+                Materials.Iron.getDust(1),
+                Materials.Calcite.getDust(1),
+                Materials.Vanadium.getDust(1))
+            .outputChances(5000, 4000, 300, 300, 300, 200)
+            .fluidInputs(Materials.NitricAcid.getFluid(10))
+            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Almandine.getDust(1))
+            .itemOutputs(
+                Materials.Aluminiumoxide.getDust(1),
+                Materials.Iron.getDust(1),
+                Materials.Gold.getDust(1),
+                Materials.Calcite.getDust(1),
+                Materials.Chrome.getDust(1),
+                Materials.Vanadium.getDust(1))
+            .outputChances(5000, 4000, 300, 300, 200, 200)
+            .fluidInputs(Materials.NitricAcid.getFluid(10))
+            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Spessartine.getDust(1))
+            .itemOutputs(
+                Materials.Aluminiumoxide.getDust(1),
+                Materials.Pyrolusite.getDust(1),
+                Materials.Iron.getDust(1),
+                Materials.Calcite.getDust(1),
+                Materials.Magnesium.getDust(1),
+                Materials.Tantalum.getDust(1))
+            .outputChances(5000, 4000, 300, 300, 300, 200)
+            .fluidInputs(Materials.NitricAcid.getFluid(10))
+            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Andradite.getDust(1))
+            .itemOutputs(
+                Materials.Quicklime.getDust(1),
+                Materials.Iron.getDust(1),
+                Materials.Aluminiumoxide.getDust(1),
+                Materials.Gold.getDust(1),
+                Materials.Vanadium.getDust(1),
+                Materials.Rutile.getDust(1))
+            .outputChances(5000, 4000, 300, 300, 200, 600)
+            .fluidInputs(Materials.NitricAcid.getFluid(10))
+            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Uvarovite.getDust(1))
+            .itemOutputs(
+                Materials.Quicklime.getDust(1),
+                Materials.Chrome.getDust(1),
+                Materials.Iron.getDust(1),
+                Materials.Silver.getDust(1),
+                Materials.Aluminiumoxide.getDust(1),
+                Materials.Manganese.getDust(1))
+            .outputChances(5000, 1000, 300, 300, 200, 200)
+            .fluidInputs(Materials.NitricAcid.getFluid(10))
+            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Grossular.getDust(1))
+            .itemOutputs(
+                Materials.Quicklime.getDust(1),
+                Materials.Aluminiumoxide.getDust(1),
+                Materials.Iron.getDust(1),
+                Materials.Gold.getDust(1),
+                Materials.Calcite.getDust(1),
+                Materials.Vanadium.getDust(1))
+            .outputChances(5000, 4000, 300, 300, 300, 200)
+            .fluidInputs(Materials.NitricAcid.getFluid(10))
+            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+            .duration(2 * SECONDS + 5 * TICKS)
+            .eut(TierEU.RECIPE_MV)
+            .addTo(centrifugeRecipes);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java b/src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java
deleted file mode 100644
index dfe14762c5..0000000000
--- a/src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java
+++ /dev/null
@@ -1,297 +0,0 @@
-package gregtech.loaders.postload.chains;
-
-import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
-import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes;
-import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
-import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-
-import net.minecraftforge.fluids.FluidStack;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.MaterialsOreAlum;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-
-public class GT_BauxiteRefineChain {
-
-    public static void run() {
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Bauxite, 32),
-                Materials.SodiumHydroxide.getDust(9),
-                Materials.Quicklime.getDust(4),
-                GT_Utility.getIntegratedCircuit(8))
-            .fluidInputs(Materials.Water.getFluid(5000))
-            .fluidOutputs(MaterialsOreAlum.BauxiteSlurry.getFluid(8000))
-            .duration(10 * SECONDS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(mixerRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Bauxite, 32),
-                Materials.SodiumHydroxide.getDust(9),
-                Materials.Quicklime.getDust(4),
-                GT_Utility.getIntegratedCircuit(8))
-            .fluidInputs(Materials.Water.getFluid(5000))
-            .fluidOutputs(MaterialsOreAlum.BauxiteSlurry.getFluid(8000))
-            .duration(10 * SECONDS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(mixerRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
-            .fluidInputs(MaterialsOreAlum.BauxiteSlurry.getFluid(2000))
-            .fluidOutputs(MaterialsOreAlum.HeatedBauxiteSlurry.getFluid(2000))
-            .duration(2 * SECONDS)
-            .eut(TierEU.RECIPE_HV)
-            .noOptimize()
-            .addTo(fluidHeaterRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Aluminiumhydroxide.getDust(1))
-            .itemOutputs(
-                Materials.Aluminiumoxide.getDust(64),
-                Materials.Aluminiumoxide.getDust(16),
-                Materials.SodiumCarbonate.getDust(9),
-                Materials.Calcite.getDust(10),
-                MaterialsOreAlum.BauxiteSlag.getDust(16))
-            .fluidInputs(Materials.CarbonDioxide.getGas(5000), MaterialsOreAlum.HeatedBauxiteSlurry.getFluid(8000))
-            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(5000))
-            .duration(15 * SECONDS)
-            .eut(TierEU.RECIPE_HV)
-            .addTo(multiblockChemicalReactorRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MaterialsOreAlum.BauxiteSlag.getDust(1))
-            .itemOutputs(
-                Materials.Rutile.getDust(1),
-                Materials.Gallium.getDust(1),
-                Materials.Quicklime.getDust(1),
-                Materials.SiliconDioxide.getDust(1),
-                Materials.Iron.getDust(1))
-            .outputChances(10000, 3000, 2000, 9000, 8000)
-            .duration(2 * SECONDS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Ilmenite, 1))
-            .itemOutputs(Materials.Rutile.getDust(2), MaterialsOreAlum.IlmeniteSlag.getDust(1))
-            .outputChances(10000, 3000)
-            .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
-            .fluidOutputs(new FluidStack(ItemList.sGreenVitriol, 2000))
-            .duration(21 * SECONDS)
-            .eut(1000)
-            .addTo(chemicalBathRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Ilmenite, 1))
-            .itemOutputs(Materials.Rutile.getDust(2), MaterialsOreAlum.IlmeniteSlag.getDust(1))
-            .outputChances(10000, 6000)
-            .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
-            .fluidOutputs(new FluidStack(ItemList.sGreenVitriol, 2000))
-            .duration(21 * SECONDS)
-            .eut(1000)
-            .addTo(chemicalBathRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MaterialsOreAlum.IlmeniteSlag.getDust(1))
-            .itemOutputs(
-                Materials.Iron.getDust(1),
-                Materials.Niobium.getDust(1),
-                Materials.Tantalum.getDust(1),
-                Materials.Manganese.getDust(1),
-                Materials.Magnesium.getDust(1))
-            .outputChances(8000, 500, 2000, 5000, 6000)
-            .duration(2 * SECONDS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-
-        OrePrefixes[] washable = new OrePrefixes[] { OrePrefixes.crushed, OrePrefixes.crushedPurified,
-            OrePrefixes.dustImpure, OrePrefixes.dustPure };
-
-        for (OrePrefixes ore : washable) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_OreDictUnificator.get(ore, Materials.Sapphire, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
-                .fluidOutputs(MaterialsOreAlum.SapphireJuice.getFluid(1000))
-                .duration(2 * SECONDS)
-                .eut(100)
-                .addTo(mixerRecipes);
-
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_OreDictUnificator.get(ore, Materials.GreenSapphire, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
-                .fluidOutputs(MaterialsOreAlum.GreenSapphireJuice.getFluid(1000))
-                .duration(2 * SECONDS)
-                .eut(100)
-                .addTo(mixerRecipes);
-
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_OreDictUnificator.get(ore, Materials.Ruby, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
-                .fluidOutputs(MaterialsOreAlum.RubyJuice.getFluid(1000))
-                .duration(2 * SECONDS)
-                .eut(100)
-                .addTo(mixerRecipes);
-        }
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(
-                Materials.Aluminiumhydroxide.getDust(3),
-                Materials.Iron.getDust(1),
-                Materials.Vanadium.getDust(1),
-                Materials.Magnesium.getDust(1))
-            .outputChances(10000, 300, 200, 200)
-            .fluidInputs(MaterialsOreAlum.SapphireJuice.getFluid(1000))
-            .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(100)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(
-                Materials.Aluminiumhydroxide.getDust(3),
-                Materials.Iron.getDust(1),
-                Materials.Vanadium.getDust(1),
-                Materials.Manganese.getDust(1),
-                Materials.Beryllium.getDust(1))
-            .outputChances(10000, 300, 200, 200, 200)
-            .fluidInputs(MaterialsOreAlum.GreenSapphireJuice.getFluid(1000))
-            .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(100)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(
-                Materials.Aluminiumhydroxide.getDust(3),
-                Materials.Chrome.getDust(1),
-                Materials.Iron.getDust(1),
-                Materials.Vanadium.getDust(1),
-                Materials.Magnesium.getDust(1))
-            .outputChances(10000, 5000, 300, 200, 200)
-            .fluidInputs(MaterialsOreAlum.RubyJuice.getFluid(1000))
-            .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(100)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Pyrope.getDust(1))
-            .itemOutputs(
-                Materials.Aluminiumoxide.getDust(1),
-                Materials.Magnesia.getDust(1),
-                Materials.Silver.getDust(1),
-                Materials.Iron.getDust(1),
-                Materials.Calcite.getDust(1),
-                Materials.Vanadium.getDust(1))
-            .outputChances(5000, 4000, 300, 300, 300, 200)
-            .fluidInputs(Materials.NitricAcid.getFluid(10))
-            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Almandine.getDust(1))
-            .itemOutputs(
-                Materials.Aluminiumoxide.getDust(1),
-                Materials.Iron.getDust(1),
-                Materials.Gold.getDust(1),
-                Materials.Calcite.getDust(1),
-                Materials.Chrome.getDust(1),
-                Materials.Vanadium.getDust(1))
-            .outputChances(5000, 4000, 300, 300, 200, 200)
-            .fluidInputs(Materials.NitricAcid.getFluid(10))
-            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Spessartine.getDust(1))
-            .itemOutputs(
-                Materials.Aluminiumoxide.getDust(1),
-                Materials.Pyrolusite.getDust(1),
-                Materials.Iron.getDust(1),
-                Materials.Calcite.getDust(1),
-                Materials.Magnesium.getDust(1),
-                Materials.Tantalum.getDust(1))
-            .outputChances(5000, 4000, 300, 300, 300, 200)
-            .fluidInputs(Materials.NitricAcid.getFluid(10))
-            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Andradite.getDust(1))
-            .itemOutputs(
-                Materials.Quicklime.getDust(1),
-                Materials.Iron.getDust(1),
-                Materials.Aluminiumoxide.getDust(1),
-                Materials.Gold.getDust(1),
-                Materials.Vanadium.getDust(1),
-                Materials.Rutile.getDust(1))
-            .outputChances(5000, 4000, 300, 300, 200, 600)
-            .fluidInputs(Materials.NitricAcid.getFluid(10))
-            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Uvarovite.getDust(1))
-            .itemOutputs(
-                Materials.Quicklime.getDust(1),
-                Materials.Chrome.getDust(1),
-                Materials.Iron.getDust(1),
-                Materials.Silver.getDust(1),
-                Materials.Aluminiumoxide.getDust(1),
-                Materials.Manganese.getDust(1))
-            .outputChances(5000, 1000, 300, 300, 200, 200)
-            .fluidInputs(Materials.NitricAcid.getFluid(10))
-            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Grossular.getDust(1))
-            .itemOutputs(
-                Materials.Quicklime.getDust(1),
-                Materials.Aluminiumoxide.getDust(1),
-                Materials.Iron.getDust(1),
-                Materials.Gold.getDust(1),
-                Materials.Calcite.getDust(1),
-                Materials.Vanadium.getDust(1))
-            .outputChances(5000, 4000, 300, 300, 300, 200)
-            .fluidInputs(Materials.NitricAcid.getFluid(10))
-            .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
-            .duration(2 * SECONDS + 5 * TICKS)
-            .eut(TierEU.RECIPE_MV)
-            .addTo(centrifugeRecipes);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java b/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java
deleted file mode 100644
index 836756a18a..0000000000
--- a/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package gregtech.loaders.postload.chains;
-
-import static goodgenerator.loader.Loaders.huiCircuit;
-import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
-import static gregtech.api.recipe.RecipeMaps.nanoForgeRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.HOURS;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeConstants.AssemblyLine;
-import static gregtech.api.util.GT_RecipeConstants.NANO_FORGE_TIER;
-import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
-import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
-import static gtPlusPlus.core.block.ModBlocks.blockCompressedObsidian;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-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.MaterialsUEVplus;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_OreDictUnificator;
-import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
-
-public class GT_NaniteChain {
-
-    public static void run() {
-
-        ItemStack aUVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.MysteriousCrystalLens", 0);
-        ItemStack aUHVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.ChromaticLens", 0);
-        ItemStack aUEVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.RadoxPolymerLens", 0);
-        ItemStack aUIVTierLens = ItemList.EnergisedTesseract.get(0);
-        ItemStack aUMVTierLens = GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 0, false);
-
-        // Carbon Nanite Recipe Before Nano Forge
-        Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
-            ? FluidRegistry.getFluid("molten.indalloy140")
-            : FluidRegistry.getFluid("molten.solderingalloy");
-
-        GT_Values.RA.stdBuilder()
-            .metadata(RESEARCH_ITEM, Materials.Carbon.getNanite(1))
-            .metadata(RESEARCH_TIME, 1 * HOURS)
-            .itemInputs(
-                ItemList.Hull_UV.get(16),
-                Materials.Carbon.getNanite(16),
-                ItemList.Field_Generator_ZPM.get(16),
-                ItemList.Conveyor_Module_UV.get(16),
-                ItemList.Electric_Motor_UV.get(32),
-                new Object[] { OrePrefixes.circuit.get(Materials.LuV), 16 },
-                GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 32))
-            .fluidInputs(
-                new FluidStack(solderIndalloy, 144 * 32),
-                Materials.HSSS.getMolten(144L * 32),
-                Materials.Osmiridium.getMolten(144L * 16))
-            .itemOutputs(ItemList.NanoForge.get(1))
-            .eut(TierEU.RECIPE_ZPM)
-            .duration(5 * MINUTES)
-            .addTo(AssemblyLine);
-
-        GT_Values.RA.stdBuilder()
-            .metadata(RESEARCH_ITEM, ItemList.Circuit_Crystalmainframe.get(1))
-            .metadata(RESEARCH_TIME, 2 * HOURS)
-            .itemInputs(
-                new Object[] { OrePrefixes.circuit.get(Materials.UV), 16 },
-                ItemList.Robot_Arm_UV.get(16),
-                ItemList.Circuit_Chip_Stemcell.get(32),
-                GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 32),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahAlloy, 16),
-                Materials.Carbon.getDust(64))
-            .fluidInputs(Materials.UUMatter.getFluid(10000), new FluidStack(solderIndalloy, 144 * 32))
-            .itemOutputs(Materials.Carbon.getNanite(2))
-            .eut(TierEU.RECIPE_UV)
-            .duration(50 * SECONDS)
-            .addTo(AssemblyLine);
-
-        /*
-         * General Rules for making nanite recipes: 1. Never make a nanite that takes a long time to make and only gives
-         * 1, just to be consumed. 2. Nanites meant to be consumed should either have a short duration or a big output.
-         * 3. Nanites which aren't consumed should have a long duration and output less than 16. 4. Nanites should
-         * always take UUM as a fluid and a lot of power to make.
-         */
-
-        // Carbon Nanites - Used to make more Nano Forge Controllers
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUVTierLens,
-                new ItemStack(WerkstoffLoader.BWBlockCasingsAdvanced, 8, 31776),
-                ItemList.Circuit_Chip_SoC.get(64))
-            .itemOutputs(Materials.Carbon.getNanite(64))
-            .fluidInputs(Materials.UUMatter.getFluid(200_000))
-            .metadata(NANO_FORGE_TIER, 1)
-            .duration(8 * MINUTES + 20 * SECONDS)
-            .eut(10_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Silver Nanites - Used in Tier 2 PCB Factory to improve board production
-        GT_Values.RA.stdBuilder()
-            .itemInputs(aUEVTierLens, Materials.Silver.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16))
-            .itemOutputs(Materials.Silver.getNanite(1))
-            .fluidInputs(Materials.UUMatter.getFluid(200_000))
-            .metadata(NANO_FORGE_TIER, 2)
-            .duration(12 * MINUTES + 30 * SECONDS)
-            .eut(10_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Neutronium Nanites - Used to upgrade the Nano Forge to Tier 2
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUHVTierLens,
-                Materials.Neutronium.getBlocks(8),
-                ItemList.Circuit_Chip_SoC2.get(64),
-                ItemList.Circuit_Chip_SoC2.get(32))
-            .itemOutputs(Materials.Neutronium.getNanite(1))
-            .fluidInputs(Materials.UUMatter.getFluid(200_000))
-            .metadata(NANO_FORGE_TIER, 1)
-            .duration(1 * MINUTES + 40 * SECONDS)
-            .eut(100_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Glowstone Nanites - Used in the optical circuit line
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUEVTierLens,
-                new ItemStack(blockCompressedObsidian, 8, 7), // Double compressed glowstone blocks (yes,
-                                                              // it's not obsidian)
-                ItemList.Circuit_Chip_SoC2.get(64))
-            .itemOutputs(Materials.Glowstone.getNanite(64))
-            .fluidInputs(Materials.UUMatter.getFluid(50_000))
-            .metadata(NANO_FORGE_TIER, 2)
-            .duration(3 * MINUTES + 20 * SECONDS)
-            .eut(50_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Gold Nanites - Used in Tier 3 PCB Factory to improve board production
-        GT_Values.RA.stdBuilder()
-            .itemInputs(aUMVTierLens, Materials.Gold.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16))
-            .itemOutputs(Materials.Gold.getNanite(1))
-            .fluidInputs(Materials.UUMatter.getFluid(300_000))
-            .metadata(NANO_FORGE_TIER, 3)
-            .duration(16 * MINUTES + 40 * SECONDS)
-            .eut(100_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Transcendent Metal Nanites - Used to upgrade the Nano Forge to Tier 3
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUIVTierLens,
-                MaterialsUEVplus.TranscendentMetal.getBlocks(8),
-                ItemList.Circuit_Chip_SoC2.get(64),
-                ItemList.Circuit_Chip_SoC2.get(64),
-                ItemList.Circuit_Chip_SoC2.get(64))
-            .itemOutputs(MaterialsUEVplus.TranscendentMetal.getNanite(1))
-            .fluidInputs(Materials.UUMatter.getFluid(2_000_000))
-            .metadata(NANO_FORGE_TIER, 2)
-            .duration(12 * MINUTES + 30 * SECONDS)
-            .eut(1_000_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Six-Phased Copper Nanites - Used in Phononic Crystal production for the godforge
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUIVTierLens,
-                MaterialsUEVplus.SixPhasedCopper.getBlocks(16),
-                ItemList.Circuit_Chip_SoC2.get(64),
-                ItemList.Circuit_Chip_SoC2.get(64),
-                ItemList.Circuit_Chip_SoC2.get(64))
-            .itemOutputs(MaterialsUEVplus.SixPhasedCopper.getNanite(8))
-            .fluidInputs(
-                Materials.UUMatter.getFluid(500_000),
-                MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(50_000))
-            .metadata(NANO_FORGE_TIER, 3)
-            .duration(100 * SECONDS)
-            .eut(2_000_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // White Dwarf Matter Nanites. Used to make Magnetohydrodynamically constrained star matter.
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUMVTierLens,
-                new ItemStack(WerkstoffLoader.items.get(OrePrefixes.lens), 0, 36), // Magneto lens
-                GregtechItemList.Laser_Lens_Special.get(0), // Quantum Anomaly, couldn't find any better
-                                                            // naming
-                MaterialsUEVplus.WhiteDwarfMatter.getBlocks(8),
-                getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
-                new ItemStack(huiCircuit, 1, 4) // Paradox circuit
-            )
-            .itemOutputs(MaterialsUEVplus.WhiteDwarfMatter.getNanite(4))
-            .fluidInputs(
-                Materials.UUMatter.getFluid(500_000),
-                MaterialsUEVplus.RawStarMatter.getFluid(50_000),
-                MaterialsUEVplus.Space.getMolten(720))
-            .metadata(NANO_FORGE_TIER, 3)
-            .duration(12 * MINUTES + 30 * SECONDS)
-            .eut(2_000_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Black Dwarf Matter Nanites. Used to make Magnetohydrodynamically constrained star matter.
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUMVTierLens,
-                new ItemStack(WerkstoffLoader.items.get(OrePrefixes.lens), 0, 36), // Magneto lens
-                GregtechItemList.Laser_Lens_Special.get(0), // Quantum Anomaly, couldn't find any better
-                                                            // naming
-                MaterialsUEVplus.BlackDwarfMatter.getBlocks(8),
-                getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
-                new ItemStack(huiCircuit, 1, 4) // Paradox circuit
-            )
-            .itemOutputs(MaterialsUEVplus.BlackDwarfMatter.getNanite(4))
-            .fluidInputs(
-                Materials.UUMatter.getFluid(500_000),
-                MaterialsUEVplus.RawStarMatter.getFluid(50_000),
-                MaterialsUEVplus.Time.getMolten(720))
-            .metadata(NANO_FORGE_TIER, 3)
-            .duration(12 * MINUTES + 30 * SECONDS)
-            .eut(2_000_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Universium nanites.
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                aUMVTierLens,
-                // Quantum Anomaly, couldn't find any better naming.
-                GregtechItemList.Laser_Lens_Special.get(0),
-                MaterialsUEVplus.Universium.getBlocks(8),
-                ItemList.Optically_Perfected_CPU.get(16),
-                ItemList.Optically_Compatible_Memory.get(16),
-                new ItemStack(huiCircuit, 1, 4) // Paradox circuit
-            )
-            .itemOutputs(MaterialsUEVplus.Universium.getNanite(2))
-            .fluidInputs(
-                MaterialsUEVplus.SpaceTime.getMolten(144),
-                Materials.Infinity.getMolten(576),
-                MaterialsUEVplus.PrimordialMatter.getFluid(64_000))
-            .metadata(NANO_FORGE_TIER, 3)
-            .duration(12 * MINUTES + 30 * SECONDS)
-            .eut(2_000_000_000)
-            .addTo(nanoForgeRecipes);
-
-        // Eternity nanites
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Forcicium, 0, false),
-                // Quantum Anomaly
-                GregtechItemList.Laser_Lens_Special.get(0),
-                MaterialsUEVplus.TranscendentMetal.getNanite(1),
-                MaterialsUEVplus.Eternity.getBlocks(8),
-                getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
-                ItemList.Timepiece.get(4))
-            .itemOutputs(MaterialsUEVplus.Eternity.getNanite(4))
-            .fluidInputs(
-                MaterialsUEVplus.Space.getMolten(1152),
-                MaterialsUEVplus.ExcitedDTSC.getFluid(50_000),
-                MaterialsUEVplus.PrimordialMatter.getFluid(64_000))
-            .metadata(NANO_FORGE_TIER, 3)
-            .duration(12 * MINUTES + 30 * SECONDS)
-            .eut(TierEU.RECIPE_MAX)
-            .addTo(nanoForgeRecipes);
-
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java b/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java
deleted file mode 100644
index 6be4ab534e..0000000000
--- a/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java
+++ /dev/null
@@ -1,694 +0,0 @@
-package gregtech.loaders.postload.chains;
-
-import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.recipe.metadata.PCBFactoryUpgrade.BIO;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeConstants.AssemblyLine;
-import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
-import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
-import static gtPlusPlus.core.material.ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN;
-import static gtPlusPlus.core.material.ELEMENT.STANDALONE.CHRONOMATIC_GLASS;
-import static gtPlusPlus.core.material.ELEMENT.STANDALONE.HYPOGEN;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fluids.FluidStack;
-
-import 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.MaterialsUEVplus;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TierEU;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.recipe.metadata.PCBFactoryTierKey;
-import gregtech.api.recipe.metadata.PCBFactoryUpgradeKey;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_PCBFactoryManager;
-import gregtech.api.util.GT_Utility;
-
-@SuppressWarnings("SpellCheckingInspection")
-public class GT_PCBFactoryRecipes {
-
-    private static final PCBFactoryTierKey TIER = PCBFactoryTierKey.INSTANCE;
-    private static final PCBFactoryUpgradeKey UPGRADE = PCBFactoryUpgradeKey.INSTANCE;
-
-    public static void load() {
-        final Fluid solderLuV = FluidRegistry.getFluid("molten.indalloy140") != null
-            ? FluidRegistry.getFluid("molten.indalloy140")
-            : FluidRegistry.getFluid("molten.solderingalloy");
-
-        // Load Multi Recipes
-        GT_Values.RA.stdBuilder()
-            .metadata(RESEARCH_ITEM, ItemList.Circuit_Board_Wetware.get(1))
-            .metadata(RESEARCH_TIME, 3 * MINUTES)
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 32),
-                ItemList.Machine_ZPM_CircuitAssembler.get(4),
-                new Object[] { OrePrefixes.circuit.get(Materials.LuV), 16 },
-                ItemList.Robot_Arm_ZPM.get(8))
-            .fluidInputs(new FluidStack(solderLuV, 144 * 36), Materials.Naquadah.getMolten(144 * 18))
-            .itemOutputs(ItemList.PCBFactory.get(1))
-            .eut(TierEU.RECIPE_UV)
-            .duration(5 * MINUTES)
-            .addTo(AssemblyLine);
-
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
-                Materials.get("Artherium-Sn")
-                    .getPlates(6))
-            .itemOutputs(ItemList.BasicPhotolithographicFrameworkCasing.get(1))
-            .duration(30 * SECONDS)
-            .eut(TierEU.RECIPE_ZPM)
-            .addTo(assemblerRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1),
-                Materials.EnrichedHolmium.getPlates(6))
-            .itemOutputs(ItemList.ReinforcedPhotolithographicFrameworkCasing.get(1))
-            .duration(30 * SECONDS)
-            .eut(TierEU.RECIPE_UHV)
-            .addTo(assemblerRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                CELESTIAL_TUNGSTEN.getFrameBox(1),
-                Materials.get("Quantum")
-                    .getPlates(6))
-            .itemOutputs(ItemList.RadiationProofPhotolithographicFrameworkCasing.get(1))
-            .duration(30 * SECONDS)
-            .eut(TierEU.RECIPE_UIV)
-            .addTo(assemblerRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                HYPOGEN.getFrameBox(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Infinity, 2),
-                Materials.Thulium.getPlates(6))
-            .itemOutputs(ItemList.InfinityCooledCasing.get(1))
-            .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(8 * 144))
-            .duration(10 * SECONDS)
-            .eut(TierEU.RECIPE_UMV)
-            .addTo(assemblerRecipes);
-
-        // Load CircuitBoard Recipes
-
-        // Plastic Circuit Board
-        for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(1),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
-                    Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
-                .eut((int) GT_Values.VP[tier] * 3 / 4)
-                .metadata(TIER, 1)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 0.5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(2),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Silver),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
-                    Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 2)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(3),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Gold),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
-                    Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 3)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-
-        // Advanced Circuit Board
-        for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(1),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
-                    Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
-                .eut((int) GT_Values.VP[tier] * 3 / 4)
-                .metadata(TIER, 1)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1.5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(2),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Silver),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
-                    Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 2)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(3),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Gold),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
-                    Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 3)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-
-        // More Advanced Circuit Board
-        for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(1),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
-                    Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
-                .eut((int) GT_Values.VP[tier] * 3 / 4)
-                .metadata(TIER, 1)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2.5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(2),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Silver),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
-                    Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 2)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(3),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Gold),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
-                    Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 3)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-
-        // Elite Circuit Board
-        for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(1),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
-                    Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
-                .eut((int) GT_Values.VP[tier] * 3 / 4)
-                .metadata(TIER, 1)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3.5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(2),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Silver),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
-                    Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 2)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(3),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Gold),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
-                    Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 3)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-
-        // Wetware Circuit Board
-        for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(1),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
-                    Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
-                    Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
-                .eut((int) GT_Values.VP[tier] * 3 / 4)
-                .metadata(TIER, 1)
-                .metadata(UPGRADE, BIO)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4.5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(2),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Silver),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
-                    Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
-                    Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 2)
-                .metadata(UPGRADE, BIO)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(3),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Gold),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
-                    Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
-                    Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 3)
-                .metadata(UPGRADE, BIO)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-
-        // Bioware Circuit Board
-        for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(1),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator.get(
-                        OrePrefixes.foil,
-                        Materials.Longasssuperconductornameforuvwire,
-                        (long) (16 * (Math.sqrt(tier - 5)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
-                    Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
-                    Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
-                .eut((int) GT_Values.VP[tier] * 3 / 4)
-                .metadata(TIER, 1)
-                .metadata(UPGRADE, BIO)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5.5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(2),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Silver),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator.get(
-                        OrePrefixes.foil,
-                        Materials.Longasssuperconductornameforuvwire,
-                        (long) (16 * (Math.sqrt(tier - 5)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
-                    Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
-                    Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 2)
-                .metadata(UPGRADE, BIO)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(3),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Gold),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    GT_OreDictUnificator.get(
-                        OrePrefixes.foil,
-                        Materials.Longasssuperconductornameforuvwire,
-                        (long) (16 * (Math.sqrt(tier - 5)))),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
-                    Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
-                    Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 3)
-                .metadata(UPGRADE, BIO)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-
-        // Optical Circuit Board
-        for (int tier = 7; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 7))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Optical.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(1),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    new ItemStack(
-                        WerkstoffLoader.items.get(OrePrefixes.foil),
-                        (int) (16 * (Math.sqrt(tier - 6))),
-                        10106),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
-                    CHRONOMATIC_GLASS.getFoil((int) (16 * (Math.sqrt(tier - 6)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
-                    Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
-                    Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
-                .eut((int) GT_Values.VP[tier] * 3 / 4)
-                .metadata(TIER, 1)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 7; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6.5))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Optical.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(2),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Silver),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    new ItemStack(
-                        WerkstoffLoader.items.get(OrePrefixes.foil),
-                        (int) (16 * (Math.sqrt(tier - 6))),
-                        10106),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
-                    CHRONOMATIC_GLASS.getFoil((int) (16 * (Math.sqrt(tier - 6)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
-                    Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
-                    Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 2)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-        for (int tier = 7; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
-            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6))));
-            List aBoards = new ArrayList<>();
-            for (int i = amountOfBoards; i > 64; i -= 64) {
-                aBoards.add(ItemList.Circuit_Board_Optical.get(i));
-                amountOfBoards -= 64;
-            }
-            aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    GT_Utility.getIntegratedCircuit(3),
-                    GT_Utility.getNaniteAsCatalyst(Materials.Gold),
-                    GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
-                        .getPlates(1),
-                    new ItemStack(
-                        WerkstoffLoader.items.get(OrePrefixes.foil),
-                        (int) (16 * (Math.sqrt(tier - 6))),
-                        10106),
-                    GT_OreDictUnificator
-                        .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
-                    CHRONOMATIC_GLASS.getFoil((int) (16 * (Math.sqrt(tier - 6)))))
-                .fluidInputs(
-                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
-                    Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
-                    Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
-                .itemOutputs(aBoards.toArray(new ItemStack[0]))
-                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
-                .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
-                .metadata(TIER, 3)
-                .addTo(RecipeMaps.pcbFactoryRecipes);
-        }
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_PurifiedWaterRecipes.java b/src/main/java/gregtech/loaders/postload/chains/GT_PurifiedWaterRecipes.java
deleted file mode 100644
index 9aa13b3f33..0000000000
--- a/src/main/java/gregtech/loaders/postload/chains/GT_PurifiedWaterRecipes.java
+++ /dev/null
@@ -1,324 +0,0 @@
-package gregtech.loaders.postload.chains;
-
-import static com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader.FluorBuergerit;
-import static gregtech.api.enums.MaterialsBotania.ManaDiamond;
-import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
-import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
-import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
-import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
-import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
-import static gregtech.api.recipe.RecipeMaps.plasmaForgeRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationClarifierRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationDegasifierRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationFlocculationRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationOzonationRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationParticleExtractionRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationPhAdjustmentRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationPlasmaHeatingRecipes;
-import static gregtech.api.recipe.RecipeMaps.purificationUVTreatmentRecipes;
-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.COIL_HEAT;
-import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
-import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
-import static gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitParticleExtractor.BARYONIC_MATTER_OUTPUT;
-
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-
-import goodgenerator.items.MyMaterial;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.HeatingCoilLevel;
-import gregtech.api.enums.ItemList;
-import gregtech.api.enums.Materials;
-import gregtech.api.enums.MaterialsUEVplus;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TierEU;
-import gregtech.api.recipe.maps.PurificationUnitParticleExtractorFrontend;
-import gregtech.api.recipe.metadata.PurificationPlantBaseChanceKey;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationPlant;
-import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitUVTreatment;
-import gtPlusPlus.core.material.Particle;
-
-public class GT_PurifiedWaterRecipes {
-
-    static final PurificationPlantBaseChanceKey BASE_CHANCE = PurificationPlantBaseChanceKey.INSTANCE;
-
-    public static void run() {
-        final int duration = GT_MetaTileEntity_PurificationPlant.CYCLE_TIME_TICKS;
-
-        // Grade 1 - Clarifier
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.ActivatedCarbonFilterMesh.get(1))
-            .fluidInputs(GT_ModHandler.getWater(1000L))
-            .fluidOutputs(Materials.Grade1PurifiedWater.getFluid(900L))
-            .itemOutputs(new ItemStack(Items.stick, 1), Materials.Stone.getDust(1), Materials.Gold.getNuggets(1))
-            .outputChances(1000, 500, 100)
-            .duration(duration)
-            .eut(TierEU.RECIPE_LuV)
-            .metadata(BASE_CHANCE, 70.0f)
-            .addTo(purificationClarifierRecipes);
-
-        // Activated Carbon Line
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Carbon.getDust(1))
-            .fluidInputs(Materials.PhosphoricAcid.getFluid(1000L))
-            .itemOutputs(Materials.PreActivatedCarbon.getDust(1))
-            .duration(5 * SECONDS)
-            .eut(TierEU.RECIPE_LuV)
-            .addTo(multiblockChemicalReactorRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.PreActivatedCarbon.getDust(1))
-            .itemOutputs(Materials.DirtyActivatedCarbon.getDust(1))
-            .duration(10 * SECONDS)
-            .eut(TierEU.RECIPE_EV)
-            .specialValue((int) HeatingCoilLevel.EV.getHeat())
-            .addTo(blastFurnaceRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.DirtyActivatedCarbon.getDust(1))
-            .fluidInputs(Materials.Water.getFluid(1000L))
-            .itemOutputs(Materials.ActivatedCarbon.getDust(1))
-            .fluidOutputs(Materials.PhosphoricAcid.getFluid(1000L))
-            .noOptimize()
-            .duration(2 * SECONDS)
-            .eut(TierEU.RECIPE_IV)
-            .addTo(chemicalBathRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                Materials.ActivatedCarbon.getDust(64),
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16))
-            .itemOutputs(ItemList.ActivatedCarbonFilterMesh.get(1))
-            .duration(10 * SECONDS)
-            .eut(TierEU.RECIPE_IV)
-            .addTo(assemblerRecipes);
-
-        // Grade 2 - Ozonation
-        for (ItemStack lens : GT_OreDictUnificator.getOres("craftingLensBlue")) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.copyAmount(0, lens))
-                .noOptimize()
-                .fluidInputs(Materials.Air.getGas(10000L))
-                .fluidOutputs(Materials.Ozone.getGas(2000L))
-                .duration(1 * SECONDS)
-                .eut(TierEU.RECIPE_LuV)
-                .addTo(laserEngraverRecipes);
-        }
-
-        // Recipes for ozonation, uses 128kL, 256kL, 512kL, 1m kL at each tier
-        // 20% boost per tier
-        // Gets you up to 80%, need to water boost for 95%
-        for (int tier = 1; tier <= 4; ++tier) {
-            GT_Values.RA.stdBuilder()
-                .noOptimize()
-                .fluidInputs(
-                    Materials.Grade1PurifiedWater.getFluid(1000L),
-                    Materials.Ozone.getGas(1000 * (long) Math.pow(2, (tier + 6))))
-                .fluidOutputs(Materials.Grade2PurifiedWater.getFluid(900L))
-                .itemOutputs(Materials.Manganese.getDust(1), Materials.Iron.getDust(1), Materials.Sulfur.getDust(1))
-                .outputChances(500, 500, 500)
-                .duration(duration)
-                .ignoreCollision()
-                .eut(TierEU.RECIPE_LuV)
-                .metadata(BASE_CHANCE, tier * 20.0f)
-                .addTo(purificationOzonationRecipes);
-        }
-
-        // Grade 3 - Flocculation.
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.Grade2PurifiedWater.getFluid(1000L))
-            .fluidOutputs(Materials.Grade3PurifiedWater.getFluid(900L))
-            .itemOutputs(
-                new ItemStack(Items.clay_ball, 1),
-                Materials.QuartzSand.getDust(1),
-                Materials.PolyvinylChloride.getNuggets(1))
-            .outputChances(1000, 500, 100)
-            .duration(duration)
-            .eut(TierEU.RECIPE_ZPM)
-            .metadata(BASE_CHANCE, 1 * 10.0f)
-            .addTo(purificationFlocculationRecipes);
-
-        // 2 Al(OH)3 + 3 HCl -> Al2(OH)3 Cl3 + 3 H2O
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Aluminiumhydroxide.getDust(8))
-            .fluidInputs(Materials.HydrochloricAcid.getFluid(3000L))
-            .fluidOutputs(Materials.PolyAluminiumChloride.getFluid(1000L), Materials.Water.getFluid(3000L))
-            .duration(4 * SECONDS)
-            .eut(TierEU.RECIPE_EV)
-            .addTo(multiblockChemicalReactorRecipes);
-
-        // Diluted is twice what chem balance would suggest, but it is 2:1 with hydrochloric acid which makes it
-        // correct I believe.
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.FlocculationWasteLiquid.getFluid(10000L))
-            .itemOutputs(Materials.Aluminium.getDust(11))
-            .fluidOutputs(Materials.Oxygen.getGas(29000L), Materials.DilutedHydrochloricAcid.getFluid(58000L))
-            .duration(1 * SECONDS)
-            .eut(TierEU.RECIPE_EV)
-            .addTo(distillationTowerRecipes);
-
-        // Grade 4 - pH adjustment
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.Grade3PurifiedWater.getFluid(1000L))
-            .fluidOutputs(Materials.Grade4PurifiedWater.getFluid(900L))
-            .ignoreCollision()
-            .duration(duration)
-            .eut(TierEU.RECIPE_ZPM)
-            .metadata(BASE_CHANCE, 0.0f)
-            .addTo(purificationPhAdjustmentRecipes);
-
-        // Grade 5 - Plasma Heating
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.Grade4PurifiedWater.getFluid(1000L))
-            .fluidOutputs(Materials.Grade5PurifiedWater.getFluid(900L))
-            .ignoreCollision()
-            .duration(duration)
-            .eut(TierEU.RECIPE_UV)
-            .metadata(BASE_CHANCE, 0.0f)
-            .addTo(purificationPlasmaHeatingRecipes);
-
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS.add(MyMaterial.orundum.get(OrePrefixes.lens, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS
-            .add(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Amber, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS
-            .add(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedAir, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS
-            .add(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Emerald, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS
-            .add(GT_OreDictUnificator.get(OrePrefixes.lens, ManaDiamond, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS
-            .add(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.BlueTopaz, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS
-            .add(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Amethyst, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS.add(FluorBuergerit.get(OrePrefixes.lens, 1));
-        GT_MetaTileEntity_PurificationUnitUVTreatment.LENS_ITEMS
-            .add(GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 1));
-
-        // Grade 6 - UV treatment
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.Grade5PurifiedWater.getFluid(1000L))
-            .fluidOutputs(Materials.Grade6PurifiedWater.getFluid(900L))
-            .ignoreCollision()
-            .duration(duration)
-            .eut(TierEU.RECIPE_UV)
-            .metadata(BASE_CHANCE, 0.0f)
-            .addTo(purificationUVTreatmentRecipes);
-
-        // Grade 7 - Degasification
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.Grade6PurifiedWater.getFluid(1000L))
-            .fluidOutputs(Materials.Grade7PurifiedWater.getFluid(900L))
-            .ignoreCollision()
-            .duration(duration)
-            .eut(TierEU.RECIPE_UHV)
-            .metadata(BASE_CHANCE, 0.0f)
-            .addTo(purificationDegasifierRecipes);
-
-        // Grade 8 - Quark Extraction
-
-        ItemStack[] catalystInputs = new ItemStack[] { ItemList.Quark_Creation_Catalyst_Up.get(1L),
-            ItemList.Quark_Creation_Catalyst_Down.get(1L), ItemList.Quark_Creation_Catalyst_Bottom.get(1L),
-            ItemList.Quark_Creation_Catalyst_Top.get(1L), ItemList.Quark_Creation_Catalyst_Strange.get(1L),
-            ItemList.Quark_Creation_Catalyst_Charm.get(1L) };
-
-        // Add all combinations of input items to the frontend map
-        for (int i = 0; i < catalystInputs.length; ++i) {
-            for (int j = 1; j < catalystInputs.length; ++j) {
-                PurificationUnitParticleExtractorFrontend.inputItems.add(catalystInputs[i]);
-                PurificationUnitParticleExtractorFrontend.inputItemsShuffled
-                    .add(catalystInputs[(i + j) % catalystInputs.length]);
-            }
-        }
-
-        // Add re-alignment recipes
-        for (int i = 0; i < catalystInputs.length; ++i) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Quark_Creation_Catalyst_Unaligned.get(1), GT_Utility.getIntegratedCircuit(i + 1))
-                .fluidInputs(Materials.StableBaryonicMatter.getFluid(1000L))
-                .itemOutputs(catalystInputs[i])
-                .duration(30 * SECONDS)
-                .eut(TierEU.RECIPE_UHV)
-                // Not sure how I feel about it being in the laser engraver, but I don't see a better multi for it right
-                // now,
-                // and we can't really add a new one specifically for this (... for now)
-                .addTo(laserEngraverRecipes);
-        }
-
-        // Initial aligned quark catalysts, these are not meant to be done often, and simply exist to get you started
-        ItemStack[] quarks = new ItemStack[] { // make sure these are in the same order as the list above
-            Particle.getBaseParticle(Particle.UP), Particle.getBaseParticle(Particle.DOWN),
-            Particle.getBaseParticle(Particle.BOTTOM), Particle.getBaseParticle(Particle.TOP),
-            Particle.getBaseParticle(Particle.STRANGE), Particle.getBaseParticle(Particle.CHARM) };
-
-        for (int i = 0; i < catalystInputs.length; ++i) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Quark_Catalyst_Housing.get(1), quarks[i])
-                .fluidInputs(MaterialsUEVplus.ExcitedDTRC.getFluid(10000L))
-                .itemOutputs(catalystInputs[i])
-                .metadata(COIL_HEAT, 10800)
-                .eut(TierEU.RECIPE_UMV)
-                .duration(5 * MINUTES)
-                .addTo(plasmaForgeRecipes);
-        }
-
-        // Recipe for quark catalyst housing
-        GT_Values.RA.stdBuilder()
-            .metadata(RESEARCH_ITEM, ItemList.Electromagnet_Tengam.get(1))
-            .metadata(RESEARCH_TIME, 1 * HOURS)
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 16),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 16),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tritanium, 16),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 16),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64),
-                GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.UHV, 16),
-                GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.UEV, 8),
-                ItemList.Field_Generator_UEV.get(4))
-            .fluidInputs(
-                Materials.Neutronium.getMolten(16 * 144),
-                Materials.Infinity.getMolten(16 * 144),
-                Materials.Tritanium.getMolten(16 * 144),
-                Materials.CosmicNeutronium.getMolten(16 * 144))
-            .itemOutputs(ItemList.Quark_Catalyst_Housing.get(1))
-            .eut(TierEU.RECIPE_UIV)
-            .duration(60 * SECONDS)
-            .addTo(AssemblyLine);
-
-        GT_Values.RA.stdBuilder()
-            // Fake item inputs
-            .itemInputs(ItemList.Quark_Creation_Catalyst_Charm.get(1), ItemList.Quark_Creation_Catalyst_Strange.get(1))
-            .fluidInputs(Materials.Grade7PurifiedWater.getFluid(1000L))
-            .fluidOutputs(
-                Materials.Grade8PurifiedWater.getFluid(900L),
-                Materials.StableBaryonicMatter.getFluid(BARYONIC_MATTER_OUTPUT))
-            .itemOutputs(ItemList.Quark_Creation_Catalyst_Unaligned.get(2L), Particle.getBaseParticle(Particle.UNKNOWN))
-            .outputChances(10000, 100)
-            .ignoreCollision()
-            .duration(duration)
-            .eut(TierEU.RECIPE_UEV)
-            .metadata(BASE_CHANCE, 0.0f)
-            .fake()
-            .addTo(purificationParticleExtractionRecipes);
-
-        // real recipe
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.Grade7PurifiedWater.getFluid(1000L))
-            .fluidOutputs(Materials.Grade8PurifiedWater.getFluid(900L))
-            .itemOutputs(ItemList.Quark_Creation_Catalyst_Unaligned.get(2L), Particle.getBaseParticle(Particle.UNKNOWN))
-            .outputChances(10000, 100)
-            .ignoreCollision()
-            .duration(duration)
-            .eut(TierEU.RECIPE_UEV)
-            .metadata(BASE_CHANCE, 0.0f)
-            .hidden()
-            .addTo(purificationParticleExtractionRecipes);
-    }
-}
diff --git a/src/main/java/gregtech/loaders/postload/chains/NaniteChain.java b/src/main/java/gregtech/loaders/postload/chains/NaniteChain.java
new file mode 100644
index 0000000000..9be7e1b6b6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/NaniteChain.java
@@ -0,0 +1,266 @@
+package gregtech.loaders.postload.chains;
+
+import static goodgenerator.loader.Loaders.huiCircuit;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.nanoForgeRecipes;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.HOURS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeConstants.AssemblyLine;
+import static gregtech.api.util.GTRecipeConstants.NANO_FORGE_TIER;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_TIME;
+import static gtPlusPlus.core.block.ModBlocks.blockCompressedObsidian;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import bartworks.system.material.WerkstoffLoader;
+import gregtech.api.enums.GTValues;
+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.GTOreDictUnificator;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class NaniteChain {
+
+    public static void run() {
+
+        ItemStack aUVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.MysteriousCrystalLens", 0);
+        ItemStack aUHVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.ChromaticLens", 0);
+        ItemStack aUEVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.RadoxPolymerLens", 0);
+        ItemStack aUIVTierLens = ItemList.EnergisedTesseract.get(0);
+        ItemStack aUMVTierLens = GTOreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 0, false);
+
+        // Carbon Nanite Recipe Before Nano Forge
+        Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
+            ? FluidRegistry.getFluid("molten.indalloy140")
+            : FluidRegistry.getFluid("molten.solderingalloy");
+
+        GTValues.RA.stdBuilder()
+            .metadata(RESEARCH_ITEM, Materials.Carbon.getNanite(1))
+            .metadata(RESEARCH_TIME, 1 * HOURS)
+            .itemInputs(
+                ItemList.Hull_UV.get(16),
+                Materials.Carbon.getNanite(16),
+                ItemList.Field_Generator_ZPM.get(16),
+                ItemList.Conveyor_Module_UV.get(16),
+                ItemList.Electric_Motor_UV.get(32),
+                new Object[] { OrePrefixes.circuit.get(Materials.LuV), 16 },
+                GTOreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 32))
+            .fluidInputs(
+                new FluidStack(solderIndalloy, 144 * 32),
+                Materials.HSSS.getMolten(144L * 32),
+                Materials.Osmiridium.getMolten(144L * 16))
+            .itemOutputs(ItemList.NanoForge.get(1))
+            .eut(TierEU.RECIPE_ZPM)
+            .duration(5 * MINUTES)
+            .addTo(AssemblyLine);
+
+        GTValues.RA.stdBuilder()
+            .metadata(RESEARCH_ITEM, ItemList.Circuit_Crystalmainframe.get(1))
+            .metadata(RESEARCH_TIME, 2 * HOURS)
+            .itemInputs(
+                new Object[] { OrePrefixes.circuit.get(Materials.UV), 16 },
+                ItemList.Robot_Arm_UV.get(16),
+                ItemList.Circuit_Chip_Stemcell.get(32),
+                GTOreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 32),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahAlloy, 16),
+                Materials.Carbon.getDust(64))
+            .fluidInputs(Materials.UUMatter.getFluid(10000), new FluidStack(solderIndalloy, 144 * 32))
+            .itemOutputs(Materials.Carbon.getNanite(2))
+            .eut(TierEU.RECIPE_UV)
+            .duration(50 * SECONDS)
+            .addTo(AssemblyLine);
+
+        /*
+         * General Rules for making nanite recipes: 1. Never make a nanite that takes a long time to make and only gives
+         * 1, just to be consumed. 2. Nanites meant to be consumed should either have a short duration or a big output.
+         * 3. Nanites which aren't consumed should have a long duration and output less than 16. 4. Nanites should
+         * always take UUM as a fluid and a lot of power to make.
+         */
+
+        // Carbon Nanites - Used to make more Nano Forge Controllers
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUVTierLens,
+                new ItemStack(WerkstoffLoader.BWBlockCasingsAdvanced, 8, 31776),
+                ItemList.Circuit_Chip_SoC.get(64))
+            .itemOutputs(Materials.Carbon.getNanite(64))
+            .fluidInputs(Materials.UUMatter.getFluid(200_000))
+            .metadata(NANO_FORGE_TIER, 1)
+            .duration(8 * MINUTES + 20 * SECONDS)
+            .eut(10_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Silver Nanites - Used in Tier 2 PCB Factory to improve board production
+        GTValues.RA.stdBuilder()
+            .itemInputs(aUEVTierLens, Materials.Silver.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16))
+            .itemOutputs(Materials.Silver.getNanite(1))
+            .fluidInputs(Materials.UUMatter.getFluid(200_000))
+            .metadata(NANO_FORGE_TIER, 2)
+            .duration(12 * MINUTES + 30 * SECONDS)
+            .eut(10_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Neutronium Nanites - Used to upgrade the Nano Forge to Tier 2
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUHVTierLens,
+                Materials.Neutronium.getBlocks(8),
+                ItemList.Circuit_Chip_SoC2.get(64),
+                ItemList.Circuit_Chip_SoC2.get(32))
+            .itemOutputs(Materials.Neutronium.getNanite(1))
+            .fluidInputs(Materials.UUMatter.getFluid(200_000))
+            .metadata(NANO_FORGE_TIER, 1)
+            .duration(1 * MINUTES + 40 * SECONDS)
+            .eut(100_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Glowstone Nanites - Used in the optical circuit line
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUEVTierLens,
+                new ItemStack(blockCompressedObsidian, 8, 7), // Double compressed glowstone blocks (yes,
+                                                              // it's not obsidian)
+                ItemList.Circuit_Chip_SoC2.get(64))
+            .itemOutputs(Materials.Glowstone.getNanite(64))
+            .fluidInputs(Materials.UUMatter.getFluid(50_000))
+            .metadata(NANO_FORGE_TIER, 2)
+            .duration(3 * MINUTES + 20 * SECONDS)
+            .eut(50_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Gold Nanites - Used in Tier 3 PCB Factory to improve board production
+        GTValues.RA.stdBuilder()
+            .itemInputs(aUMVTierLens, Materials.Gold.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16))
+            .itemOutputs(Materials.Gold.getNanite(1))
+            .fluidInputs(Materials.UUMatter.getFluid(300_000))
+            .metadata(NANO_FORGE_TIER, 3)
+            .duration(16 * MINUTES + 40 * SECONDS)
+            .eut(100_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Transcendent Metal Nanites - Used to upgrade the Nano Forge to Tier 3
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUIVTierLens,
+                MaterialsUEVplus.TranscendentMetal.getBlocks(8),
+                ItemList.Circuit_Chip_SoC2.get(64),
+                ItemList.Circuit_Chip_SoC2.get(64),
+                ItemList.Circuit_Chip_SoC2.get(64))
+            .itemOutputs(MaterialsUEVplus.TranscendentMetal.getNanite(1))
+            .fluidInputs(Materials.UUMatter.getFluid(2_000_000))
+            .metadata(NANO_FORGE_TIER, 2)
+            .duration(12 * MINUTES + 30 * SECONDS)
+            .eut(1_000_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Six-Phased Copper Nanites - Used in Phononic Crystal production for the godforge
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUIVTierLens,
+                MaterialsUEVplus.SixPhasedCopper.getBlocks(16),
+                ItemList.Circuit_Chip_SoC2.get(64),
+                ItemList.Circuit_Chip_SoC2.get(64),
+                ItemList.Circuit_Chip_SoC2.get(64))
+            .itemOutputs(MaterialsUEVplus.SixPhasedCopper.getNanite(8))
+            .fluidInputs(
+                Materials.UUMatter.getFluid(500_000),
+                MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(50_000))
+            .metadata(NANO_FORGE_TIER, 3)
+            .duration(100 * SECONDS)
+            .eut(2_000_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // White Dwarf Matter Nanites. Used to make Magnetohydrodynamically constrained star matter.
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUMVTierLens,
+                new ItemStack(WerkstoffLoader.items.get(OrePrefixes.lens), 0, 36), // Magneto lens
+                GregtechItemList.Laser_Lens_Special.get(0), // Quantum Anomaly, couldn't find any better
+                                                            // naming
+                MaterialsUEVplus.WhiteDwarfMatter.getBlocks(8),
+                getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
+                new ItemStack(huiCircuit, 1, 4) // Paradox circuit
+            )
+            .itemOutputs(MaterialsUEVplus.WhiteDwarfMatter.getNanite(4))
+            .fluidInputs(
+                Materials.UUMatter.getFluid(500_000),
+                MaterialsUEVplus.RawStarMatter.getFluid(50_000),
+                MaterialsUEVplus.Space.getMolten(720))
+            .metadata(NANO_FORGE_TIER, 3)
+            .duration(12 * MINUTES + 30 * SECONDS)
+            .eut(2_000_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Black Dwarf Matter Nanites. Used to make Magnetohydrodynamically constrained star matter.
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUMVTierLens,
+                new ItemStack(WerkstoffLoader.items.get(OrePrefixes.lens), 0, 36), // Magneto lens
+                GregtechItemList.Laser_Lens_Special.get(0), // Quantum Anomaly, couldn't find any better
+                                                            // naming
+                MaterialsUEVplus.BlackDwarfMatter.getBlocks(8),
+                getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
+                new ItemStack(huiCircuit, 1, 4) // Paradox circuit
+            )
+            .itemOutputs(MaterialsUEVplus.BlackDwarfMatter.getNanite(4))
+            .fluidInputs(
+                Materials.UUMatter.getFluid(500_000),
+                MaterialsUEVplus.RawStarMatter.getFluid(50_000),
+                MaterialsUEVplus.Time.getMolten(720))
+            .metadata(NANO_FORGE_TIER, 3)
+            .duration(12 * MINUTES + 30 * SECONDS)
+            .eut(2_000_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Universium nanites.
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                aUMVTierLens,
+                // Quantum Anomaly, couldn't find any better naming.
+                GregtechItemList.Laser_Lens_Special.get(0),
+                MaterialsUEVplus.Universium.getBlocks(8),
+                ItemList.Optically_Perfected_CPU.get(16),
+                ItemList.Optically_Compatible_Memory.get(16),
+                new ItemStack(huiCircuit, 1, 4) // Paradox circuit
+            )
+            .itemOutputs(MaterialsUEVplus.Universium.getNanite(2))
+            .fluidInputs(
+                MaterialsUEVplus.SpaceTime.getMolten(144),
+                Materials.Infinity.getMolten(576),
+                MaterialsUEVplus.PrimordialMatter.getFluid(64_000))
+            .metadata(NANO_FORGE_TIER, 3)
+            .duration(12 * MINUTES + 30 * SECONDS)
+            .eut(2_000_000_000)
+            .addTo(nanoForgeRecipes);
+
+        // Eternity nanites
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.lens, Materials.Forcicium, 0, false),
+                // Quantum Anomaly
+                GregtechItemList.Laser_Lens_Special.get(0),
+                MaterialsUEVplus.TranscendentMetal.getNanite(1),
+                MaterialsUEVplus.Eternity.getBlocks(8),
+                getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
+                ItemList.Timepiece.get(4))
+            .itemOutputs(MaterialsUEVplus.Eternity.getNanite(4))
+            .fluidInputs(
+                MaterialsUEVplus.Space.getMolten(1152),
+                MaterialsUEVplus.ExcitedDTSC.getFluid(50_000),
+                MaterialsUEVplus.PrimordialMatter.getFluid(64_000))
+            .metadata(NANO_FORGE_TIER, 3)
+            .duration(12 * MINUTES + 30 * SECONDS)
+            .eut(TierEU.RECIPE_MAX)
+            .addTo(nanoForgeRecipes);
+
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/PCBFactoryRecipes.java b/src/main/java/gregtech/loaders/postload/chains/PCBFactoryRecipes.java
new file mode 100644
index 0000000000..f047bdcab2
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/PCBFactoryRecipes.java
@@ -0,0 +1,687 @@
+package gregtech.loaders.postload.chains;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.metadata.PCBFactoryUpgrade.BIO;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeConstants.AssemblyLine;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_TIME;
+import static gtPlusPlus.core.material.MaterialsElements.STANDALONE.CELESTIAL_TUNGSTEN;
+import static gtPlusPlus.core.material.MaterialsElements.STANDALONE.CHRONOMATIC_GLASS;
+import static gtPlusPlus.core.material.MaterialsElements.STANDALONE.HYPOGEN;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import bartworks.system.material.WerkstoffLoader;
+import gregtech.api.enums.GTValues;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.metadata.PCBFactoryTierKey;
+import gregtech.api.recipe.metadata.PCBFactoryUpgradeKey;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.api.util.PCBFactoryManager;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class PCBFactoryRecipes {
+
+    private static final PCBFactoryTierKey TIER = PCBFactoryTierKey.INSTANCE;
+    private static final PCBFactoryUpgradeKey UPGRADE = PCBFactoryUpgradeKey.INSTANCE;
+
+    public static void load() {
+        final Fluid solderLuV = FluidRegistry.getFluid("molten.indalloy140") != null
+            ? FluidRegistry.getFluid("molten.indalloy140")
+            : FluidRegistry.getFluid("molten.solderingalloy");
+
+        // Load Multi Recipes
+        GTValues.RA.stdBuilder()
+            .metadata(RESEARCH_ITEM, ItemList.Circuit_Board_Wetware.get(1))
+            .metadata(RESEARCH_TIME, 3 * MINUTES)
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 32),
+                ItemList.Machine_ZPM_CircuitAssembler.get(4),
+                new Object[] { OrePrefixes.circuit.get(Materials.LuV), 16 },
+                ItemList.Robot_Arm_ZPM.get(8))
+            .fluidInputs(new FluidStack(solderLuV, 144 * 36), Materials.Naquadah.getMolten(144 * 18))
+            .itemOutputs(ItemList.PCBFactory.get(1))
+            .eut(TierEU.RECIPE_UV)
+            .duration(5 * MINUTES)
+            .addTo(AssemblyLine);
+
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+                Materials.get("Artherium-Sn")
+                    .getPlates(6))
+            .itemOutputs(ItemList.BasicPhotolithographicFrameworkCasing.get(1))
+            .duration(30 * SECONDS)
+            .eut(TierEU.RECIPE_ZPM)
+            .addTo(assemblerRecipes);
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1),
+                Materials.EnrichedHolmium.getPlates(6))
+            .itemOutputs(ItemList.ReinforcedPhotolithographicFrameworkCasing.get(1))
+            .duration(30 * SECONDS)
+            .eut(TierEU.RECIPE_UHV)
+            .addTo(assemblerRecipes);
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                CELESTIAL_TUNGSTEN.getFrameBox(1),
+                Materials.get("Quantum")
+                    .getPlates(6))
+            .itemOutputs(ItemList.RadiationProofPhotolithographicFrameworkCasing.get(1))
+            .duration(30 * SECONDS)
+            .eut(TierEU.RECIPE_UIV)
+            .addTo(assemblerRecipes);
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                HYPOGEN.getFrameBox(1),
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Infinity, 2),
+                Materials.Thulium.getPlates(6))
+            .itemOutputs(ItemList.InfinityCooledCasing.get(1))
+            .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(8 * 144))
+            .duration(10 * SECONDS)
+            .eut(TierEU.RECIPE_UMV)
+            .addTo(assemblerRecipes);
+
+        // Load CircuitBoard Recipes
+
+        // Plastic Circuit Board
+        for (int tier = 1; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(1),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+                    Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
+                .eut((int) GTValues.VP[tier] * 3 / 4)
+                .metadata(TIER, 1)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 1; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 0.5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(2),
+                    GTUtility.getNaniteAsCatalyst(Materials.Silver),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+                    Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 2)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 1; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(3),
+                    GTUtility.getNaniteAsCatalyst(Materials.Gold),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+                    Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 3)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+
+        // Advanced Circuit Board
+        for (int tier = 2; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(1),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+                    Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
+                .eut((int) GTValues.VP[tier] * 3 / 4)
+                .metadata(TIER, 1)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 2; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1.5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(2),
+                    GTUtility.getNaniteAsCatalyst(Materials.Silver),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+                    Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 2)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 2; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(3),
+                    GTUtility.getNaniteAsCatalyst(Materials.Gold),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+                    Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 3)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+
+        // More Advanced Circuit Board
+        for (int tier = 3; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(1),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+                    Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
+                .eut((int) GTValues.VP[tier] * 3 / 4)
+                .metadata(TIER, 1)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 3; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2.5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(2),
+                    GTUtility.getNaniteAsCatalyst(Materials.Silver),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+                    Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 2)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 3; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(3),
+                    GTUtility.getNaniteAsCatalyst(Materials.Gold),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+                    Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 3)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+
+        // Elite Circuit Board
+        for (int tier = 4; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(1),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+                    Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
+                .eut((int) GTValues.VP[tier] * 3 / 4)
+                .metadata(TIER, 1)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 4; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3.5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(2),
+                    GTUtility.getNaniteAsCatalyst(Materials.Silver),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+                    Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 2)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 4; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(3),
+                    GTUtility.getNaniteAsCatalyst(Materials.Gold),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+                    Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 3)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+
+        // Wetware Circuit Board
+        for (int tier = 5; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(1),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+                    Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+                    Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+                .eut((int) GTValues.VP[tier] * 3 / 4)
+                .metadata(TIER, 1)
+                .metadata(UPGRADE, BIO)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 5; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4.5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(2),
+                    GTUtility.getNaniteAsCatalyst(Materials.Silver),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+                    Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+                    Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 2)
+                .metadata(UPGRADE, BIO)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 5; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(3),
+                    GTUtility.getNaniteAsCatalyst(Materials.Gold),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+                    Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+                    Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 3)
+                .metadata(UPGRADE, BIO)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+
+        // Bioware Circuit Board
+        for (int tier = 6; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(1),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(
+                        OrePrefixes.foil,
+                        Materials.Longasssuperconductornameforuvwire,
+                        (long) (16 * (Math.sqrt(tier - 5)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+                    Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+                    Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+                .eut((int) GTValues.VP[tier] * 3 / 4)
+                .metadata(TIER, 1)
+                .metadata(UPGRADE, BIO)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 6; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5.5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(2),
+                    GTUtility.getNaniteAsCatalyst(Materials.Silver),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(
+                        OrePrefixes.foil,
+                        Materials.Longasssuperconductornameforuvwire,
+                        (long) (16 * (Math.sqrt(tier - 5)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+                    Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+                    Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 2)
+                .metadata(UPGRADE, BIO)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 6; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(3),
+                    GTUtility.getNaniteAsCatalyst(Materials.Gold),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    GTOreDictUnificator.get(
+                        OrePrefixes.foil,
+                        Materials.Longasssuperconductornameforuvwire,
+                        (long) (16 * (Math.sqrt(tier - 5)))),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+                    Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+                    Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 3)
+                .metadata(UPGRADE, BIO)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+
+        // Optical Circuit Board
+        for (int tier = 7; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 7))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Optical.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(1),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    new ItemStack(
+                        WerkstoffLoader.items.get(OrePrefixes.foil),
+                        (int) (16 * (Math.sqrt(tier - 6))),
+                        10106),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
+                    CHRONOMATIC_GLASS.getFoil((int) (16 * (Math.sqrt(tier - 6)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
+                    Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
+                    Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+                .eut((int) GTValues.VP[tier] * 3 / 4)
+                .metadata(TIER, 1)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 7; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6.5))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Optical.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(2),
+                    GTUtility.getNaniteAsCatalyst(Materials.Silver),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    new ItemStack(
+                        WerkstoffLoader.items.get(OrePrefixes.foil),
+                        (int) (16 * (Math.sqrt(tier - 6))),
+                        10106),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
+                    CHRONOMATIC_GLASS.getFoil((int) (16 * (Math.sqrt(tier - 6)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
+                    Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
+                    Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 2)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+        for (int tier = 7; tier <= PCBFactoryManager.mTiersOfPlastics; tier++) {
+            int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6))));
+            List aBoards = new ArrayList<>();
+            for (int i = amountOfBoards; i > 64; i -= 64) {
+                aBoards.add(ItemList.Circuit_Board_Optical.get(i));
+                amountOfBoards -= 64;
+            }
+            aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
+            GTValues.RA.stdBuilder()
+                .itemInputs(
+                    GTUtility.getIntegratedCircuit(3),
+                    GTUtility.getNaniteAsCatalyst(Materials.Gold),
+                    PCBFactoryManager.getPlasticMaterialFromTier(tier)
+                        .getPlates(1),
+                    new ItemStack(
+                        WerkstoffLoader.items.get(OrePrefixes.foil),
+                        (int) (16 * (Math.sqrt(tier - 6))),
+                        10106),
+                    GTOreDictUnificator
+                        .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
+                    CHRONOMATIC_GLASS.getFoil((int) (16 * (Math.sqrt(tier - 6)))))
+                .fluidInputs(
+                    Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
+                    Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
+                    Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
+                .itemOutputs(aBoards.toArray(new ItemStack[0]))
+                .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+                .eut((int) GTValues.VP[tier + 1] * 3 / 4)
+                .metadata(TIER, 3)
+                .addTo(RecipeMaps.pcbFactoryRecipes);
+        }
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/PurifiedWaterRecipes.java b/src/main/java/gregtech/loaders/postload/chains/PurifiedWaterRecipes.java
new file mode 100644
index 0000000000..c0d73d02b6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/PurifiedWaterRecipes.java
@@ -0,0 +1,320 @@
+package gregtech.loaders.postload.chains;
+
+import static bartworks.system.material.WerkstoffLoader.FluorBuergerit;
+import static gregtech.api.enums.MaterialsBotania.ManaDiamond;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.recipe.RecipeMaps.plasmaForgeRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationClarifierRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationDegasifierRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationFlocculationRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationOzonationRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationParticleExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationPhAdjustmentRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationPlasmaHeatingRecipes;
+import static gregtech.api.recipe.RecipeMaps.purificationUVTreatmentRecipes;
+import static gregtech.api.util.GTRecipeBuilder.HOURS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeConstants.AssemblyLine;
+import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_TIME;
+import static gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitBaryonicPerfection.BARYONIC_MATTER_OUTPUT;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import goodgenerator.items.GGMaterial;
+import gregtech.api.enums.GTValues;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.maps.PurificationUnitParticleExtractorFrontend;
+import gregtech.api.recipe.metadata.PurificationPlantBaseChanceKey;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gregtech.common.tileentities.machines.multi.purification.MTEPurificationPlant;
+import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitUVTreatment;
+import gtPlusPlus.core.material.Particle;
+
+public class PurifiedWaterRecipes {
+
+    static final PurificationPlantBaseChanceKey BASE_CHANCE = PurificationPlantBaseChanceKey.INSTANCE;
+
+    public static void run() {
+        final int duration = MTEPurificationPlant.CYCLE_TIME_TICKS;
+
+        // Grade 1 - Clarifier
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.ActivatedCarbonFilterMesh.get(1))
+            .fluidInputs(GTModHandler.getWater(1000L))
+            .fluidOutputs(Materials.Grade1PurifiedWater.getFluid(900L))
+            .itemOutputs(new ItemStack(Items.stick, 1), Materials.Stone.getDust(1), Materials.Gold.getNuggets(1))
+            .outputChances(1000, 500, 100)
+            .duration(duration)
+            .eut(TierEU.RECIPE_LuV)
+            .metadata(BASE_CHANCE, 70.0f)
+            .addTo(purificationClarifierRecipes);
+
+        // Activated Carbon Line
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Carbon.getDust(1))
+            .fluidInputs(Materials.PhosphoricAcid.getFluid(1000L))
+            .itemOutputs(Materials.PreActivatedCarbon.getDust(1))
+            .duration(5 * SECONDS)
+            .eut(TierEU.RECIPE_LuV)
+            .addTo(multiblockChemicalReactorRecipes);
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.PreActivatedCarbon.getDust(1))
+            .itemOutputs(Materials.DirtyActivatedCarbon.getDust(1))
+            .duration(10 * SECONDS)
+            .eut(TierEU.RECIPE_EV)
+            .specialValue((int) HeatingCoilLevel.EV.getHeat())
+            .addTo(blastFurnaceRecipes);
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.DirtyActivatedCarbon.getDust(1))
+            .fluidInputs(Materials.Water.getFluid(1000L))
+            .itemOutputs(Materials.ActivatedCarbon.getDust(1))
+            .fluidOutputs(Materials.PhosphoricAcid.getFluid(1000L))
+            .noOptimize()
+            .duration(2 * SECONDS)
+            .eut(TierEU.RECIPE_IV)
+            .addTo(chemicalBathRecipes);
+        GTValues.RA.stdBuilder()
+            .itemInputs(
+                Materials.ActivatedCarbon.getDust(64),
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16))
+            .itemOutputs(ItemList.ActivatedCarbonFilterMesh.get(1))
+            .duration(10 * SECONDS)
+            .eut(TierEU.RECIPE_IV)
+            .addTo(assemblerRecipes);
+
+        // Grade 2 - Ozonation
+        for (ItemStack lens : GTOreDictUnificator.getOres("craftingLensBlue")) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.copyAmount(0, lens))
+                .noOptimize()
+                .fluidInputs(Materials.Air.getGas(10000L))
+                .fluidOutputs(Materials.Ozone.getGas(2000L))
+                .duration(1 * SECONDS)
+                .eut(TierEU.RECIPE_LuV)
+                .addTo(laserEngraverRecipes);
+        }
+
+        // Recipes for ozonation, uses 128kL, 256kL, 512kL, 1m kL at each tier
+        // 20% boost per tier
+        // Gets you up to 80%, need to water boost for 95%
+        for (int tier = 1; tier <= 4; ++tier) {
+            GTValues.RA.stdBuilder()
+                .noOptimize()
+                .fluidInputs(
+                    Materials.Grade1PurifiedWater.getFluid(1000L),
+                    Materials.Ozone.getGas(1000 * (long) Math.pow(2, (tier + 6))))
+                .fluidOutputs(Materials.Grade2PurifiedWater.getFluid(900L))
+                .itemOutputs(Materials.Manganese.getDust(1), Materials.Iron.getDust(1), Materials.Sulfur.getDust(1))
+                .outputChances(500, 500, 500)
+                .duration(duration)
+                .ignoreCollision()
+                .eut(TierEU.RECIPE_LuV)
+                .metadata(BASE_CHANCE, tier * 20.0f)
+                .addTo(purificationOzonationRecipes);
+        }
+
+        // Grade 3 - Flocculation.
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.Grade2PurifiedWater.getFluid(1000L))
+            .fluidOutputs(Materials.Grade3PurifiedWater.getFluid(900L))
+            .itemOutputs(
+                new ItemStack(Items.clay_ball, 1),
+                Materials.QuartzSand.getDust(1),
+                Materials.PolyvinylChloride.getNuggets(1))
+            .outputChances(1000, 500, 100)
+            .duration(duration)
+            .eut(TierEU.RECIPE_ZPM)
+            .metadata(BASE_CHANCE, 1 * 10.0f)
+            .addTo(purificationFlocculationRecipes);
+
+        // 2 Al(OH)3 + 3 HCl -> Al2(OH)3 Cl3 + 3 H2O
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Aluminiumhydroxide.getDust(8))
+            .fluidInputs(Materials.HydrochloricAcid.getFluid(3000L))
+            .fluidOutputs(Materials.PolyAluminiumChloride.getFluid(1000L), Materials.Water.getFluid(3000L))
+            .duration(4 * SECONDS)
+            .eut(TierEU.RECIPE_EV)
+            .addTo(multiblockChemicalReactorRecipes);
+
+        // Diluted is twice what chem balance would suggest, but it is 2:1 with hydrochloric acid which makes it
+        // correct I believe.
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.FlocculationWasteLiquid.getFluid(10000L))
+            .itemOutputs(Materials.Aluminium.getDust(11))
+            .fluidOutputs(Materials.Oxygen.getGas(29000L), Materials.DilutedHydrochloricAcid.getFluid(58000L))
+            .duration(1 * SECONDS)
+            .eut(TierEU.RECIPE_EV)
+            .addTo(distillationTowerRecipes);
+
+        // Grade 4 - pH adjustment
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.Grade3PurifiedWater.getFluid(1000L))
+            .fluidOutputs(Materials.Grade4PurifiedWater.getFluid(900L))
+            .ignoreCollision()
+            .duration(duration)
+            .eut(TierEU.RECIPE_ZPM)
+            .metadata(BASE_CHANCE, 0.0f)
+            .addTo(purificationPhAdjustmentRecipes);
+
+        // Grade 5 - Plasma Heating
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.Grade4PurifiedWater.getFluid(1000L))
+            .fluidOutputs(Materials.Grade5PurifiedWater.getFluid(900L))
+            .ignoreCollision()
+            .duration(duration)
+            .eut(TierEU.RECIPE_UV)
+            .metadata(BASE_CHANCE, 0.0f)
+            .addTo(purificationPlasmaHeatingRecipes);
+
+        MTEPurificationUnitUVTreatment.LENS_ITEMS.add(GGMaterial.orundum.get(OrePrefixes.lens, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS.add(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Amber, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS
+            .add(GTOreDictUnificator.get(OrePrefixes.lens, Materials.InfusedAir, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS.add(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Emerald, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS.add(GTOreDictUnificator.get(OrePrefixes.lens, ManaDiamond, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS
+            .add(GTOreDictUnificator.get(OrePrefixes.lens, Materials.BlueTopaz, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS.add(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Amethyst, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS.add(FluorBuergerit.get(OrePrefixes.lens, 1));
+        MTEPurificationUnitUVTreatment.LENS_ITEMS
+            .add(GTOreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 1));
+
+        // Grade 6 - UV treatment
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.Grade5PurifiedWater.getFluid(1000L))
+            .fluidOutputs(Materials.Grade6PurifiedWater.getFluid(900L))
+            .ignoreCollision()
+            .duration(duration)
+            .eut(TierEU.RECIPE_UV)
+            .metadata(BASE_CHANCE, 0.0f)
+            .addTo(purificationUVTreatmentRecipes);
+
+        // Grade 7 - Degasification
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.Grade6PurifiedWater.getFluid(1000L))
+            .fluidOutputs(Materials.Grade7PurifiedWater.getFluid(900L))
+            .ignoreCollision()
+            .duration(duration)
+            .eut(TierEU.RECIPE_UHV)
+            .metadata(BASE_CHANCE, 0.0f)
+            .addTo(purificationDegasifierRecipes);
+
+        // Grade 8 - Quark Extraction
+
+        ItemStack[] catalystInputs = new ItemStack[] { ItemList.Quark_Creation_Catalyst_Up.get(1L),
+            ItemList.Quark_Creation_Catalyst_Down.get(1L), ItemList.Quark_Creation_Catalyst_Bottom.get(1L),
+            ItemList.Quark_Creation_Catalyst_Top.get(1L), ItemList.Quark_Creation_Catalyst_Strange.get(1L),
+            ItemList.Quark_Creation_Catalyst_Charm.get(1L) };
+
+        // Add all combinations of input items to the frontend map
+        for (int i = 0; i < catalystInputs.length; ++i) {
+            for (int j = 1; j < catalystInputs.length; ++j) {
+                PurificationUnitParticleExtractorFrontend.inputItems.add(catalystInputs[i]);
+                PurificationUnitParticleExtractorFrontend.inputItemsShuffled
+                    .add(catalystInputs[(i + j) % catalystInputs.length]);
+            }
+        }
+
+        // Add re-alignment recipes
+        for (int i = 0; i < catalystInputs.length; ++i) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Quark_Creation_Catalyst_Unaligned.get(1), GTUtility.getIntegratedCircuit(i + 1))
+                .fluidInputs(Materials.StableBaryonicMatter.getFluid(1000L))
+                .itemOutputs(catalystInputs[i])
+                .duration(30 * SECONDS)
+                .eut(TierEU.RECIPE_UHV)
+                // Not sure how I feel about it being in the laser engraver, but I don't see a better multi for it right
+                // now,
+                // and we can't really add a new one specifically for this (... for now)
+                .addTo(laserEngraverRecipes);
+        }
+
+        // Initial aligned quark catalysts, these are not meant to be done often, and simply exist to get you started
+        ItemStack[] quarks = new ItemStack[] { // make sure these are in the same order as the list above
+            Particle.getBaseParticle(Particle.UP), Particle.getBaseParticle(Particle.DOWN),
+            Particle.getBaseParticle(Particle.BOTTOM), Particle.getBaseParticle(Particle.TOP),
+            Particle.getBaseParticle(Particle.STRANGE), Particle.getBaseParticle(Particle.CHARM) };
+
+        for (int i = 0; i < catalystInputs.length; ++i) {
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Quark_Catalyst_Housing.get(1), quarks[i])
+                .fluidInputs(MaterialsUEVplus.ExcitedDTRC.getFluid(10000L))
+                .itemOutputs(catalystInputs[i])
+                .metadata(COIL_HEAT, 10800)
+                .eut(TierEU.RECIPE_UMV)
+                .duration(5 * MINUTES)
+                .addTo(plasmaForgeRecipes);
+        }
+
+        // Recipe for quark catalyst housing
+        GTValues.RA.stdBuilder()
+            .metadata(RESEARCH_ITEM, ItemList.Electromagnet_Tengam.get(1))
+            .metadata(RESEARCH_TIME, 1 * HOURS)
+            .itemInputs(
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 16),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 16),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Tritanium, 16),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 16),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64),
+                GTOreDictUnificator.get(OrePrefixes.circuit, Materials.UHV, 16),
+                GTOreDictUnificator.get(OrePrefixes.circuit, Materials.UEV, 8),
+                ItemList.Field_Generator_UEV.get(4))
+            .fluidInputs(
+                Materials.Neutronium.getMolten(16 * 144),
+                Materials.Infinity.getMolten(16 * 144),
+                Materials.Tritanium.getMolten(16 * 144),
+                Materials.CosmicNeutronium.getMolten(16 * 144))
+            .itemOutputs(ItemList.Quark_Catalyst_Housing.get(1))
+            .eut(TierEU.RECIPE_UIV)
+            .duration(60 * SECONDS)
+            .addTo(AssemblyLine);
+
+        GTValues.RA.stdBuilder()
+            // Fake item inputs
+            .itemInputs(ItemList.Quark_Creation_Catalyst_Charm.get(1), ItemList.Quark_Creation_Catalyst_Strange.get(1))
+            .fluidInputs(Materials.Grade7PurifiedWater.getFluid(1000L))
+            .fluidOutputs(
+                Materials.Grade8PurifiedWater.getFluid(900L),
+                Materials.StableBaryonicMatter.getFluid(BARYONIC_MATTER_OUTPUT))
+            .itemOutputs(ItemList.Quark_Creation_Catalyst_Unaligned.get(2L), Particle.getBaseParticle(Particle.UNKNOWN))
+            .outputChances(10000, 100)
+            .ignoreCollision()
+            .duration(duration)
+            .eut(TierEU.RECIPE_UEV)
+            .metadata(BASE_CHANCE, 0.0f)
+            .fake()
+            .addTo(purificationParticleExtractionRecipes);
+
+        // real recipe
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.Grade7PurifiedWater.getFluid(1000L))
+            .fluidOutputs(Materials.Grade8PurifiedWater.getFluid(900L))
+            .itemOutputs(ItemList.Quark_Creation_Catalyst_Unaligned.get(2L), Particle.getBaseParticle(Particle.UNKNOWN))
+            .outputChances(10000, 100)
+            .ignoreCollision()
+            .duration(duration)
+            .eut(TierEU.RECIPE_UEV)
+            .metadata(BASE_CHANCE, 0.0f)
+            .hidden()
+            .addTo(purificationParticleExtractionRecipes);
+    }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java
index a9e587a145..01d77704f7 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java
@@ -1,15 +1,15 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.objects.MaterialStack;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class AlloySmelterRecipes implements Runnable {
 
@@ -58,24 +58,22 @@ public class AlloySmelterRecipes implements Runnable {
     @Override
     public void run() {
         for (MaterialStack[] materials : mAlloySmelterList) {
-            ItemStack dust1 = GT_OreDictUnificator.get(OrePrefixes.dust, materials[0].mMaterial, materials[0].mAmount);
-            ItemStack dust2 = GT_OreDictUnificator.get(OrePrefixes.dust, materials[1].mMaterial, materials[1].mAmount);
-            ItemStack ingot1 = GT_OreDictUnificator
-                .get(OrePrefixes.ingot, materials[0].mMaterial, materials[0].mAmount);
-            ItemStack ingot2 = GT_OreDictUnificator
-                .get(OrePrefixes.ingot, materials[1].mMaterial, materials[1].mAmount);
-            ItemStack outputIngot = GT_OreDictUnificator
+            ItemStack dust1 = GTOreDictUnificator.get(OrePrefixes.dust, materials[0].mMaterial, materials[0].mAmount);
+            ItemStack dust2 = GTOreDictUnificator.get(OrePrefixes.dust, materials[1].mMaterial, materials[1].mAmount);
+            ItemStack ingot1 = GTOreDictUnificator.get(OrePrefixes.ingot, materials[0].mMaterial, materials[0].mAmount);
+            ItemStack ingot2 = GTOreDictUnificator.get(OrePrefixes.ingot, materials[1].mMaterial, materials[1].mAmount);
+            ItemStack outputIngot = GTOreDictUnificator
                 .get(OrePrefixes.ingot, materials[2].mMaterial, materials[2].mAmount);
-            if (outputIngot != GT_Values.NI) {
+            if (outputIngot != GTValues.NI) {
                 if (ingot1 != null) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(ingot1, dust2)
                         .itemOutputs(outputIngot)
                         .duration((int) materials[2].mAmount * 50)
                         .eut(16)
                         .addTo(alloySmelterRecipes);
                     if (ingot2 != null) {
-                        GT_Values.RA.stdBuilder()
+                        GTValues.RA.stdBuilder()
                             .itemInputs(ingot1, ingot2)
                             .itemOutputs(outputIngot)
                             .duration((int) materials[2].mAmount * 50)
@@ -85,7 +83,7 @@ public class AlloySmelterRecipes implements Runnable {
                 }
 
                 if (ingot2 != null) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(dust1, ingot2)
                         .itemOutputs(outputIngot)
                         .duration((int) materials[2].mAmount * 50)
@@ -93,7 +91,7 @@ public class AlloySmelterRecipes implements Runnable {
                         .addTo(alloySmelterRecipes);
                 }
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(dust1, dust2)
                     .itemOutputs(outputIngot)
                     .duration((int) materials[2].mAmount * 50)
@@ -104,11 +102,11 @@ public class AlloySmelterRecipes implements Runnable {
         }
 
         // We use rubber
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1L))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1L))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(alloySmelterRecipes);
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java
index 755e5ab885..38eb8bc7c7 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java
@@ -2,472 +2,472 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.recipe.RecipeMaps.arcFurnaceRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.RECYCLE;
-import static gregtech.api.util.GT_RecipeConstants.UniversalArcFurnace;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.RECYCLE;
+import static gregtech.api.util.GTRecipeConstants.UniversalArcFurnace;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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.GTOreDictUnificator;
 
 public class ArcFurnaceRecipes implements Runnable {
 
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Block_TungstenSteelReinforced.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Concrete, 1))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Concrete, 1))
             .duration(8 * SECONDS)
             .eut(96)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Fluid.get(1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 19L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 19L))
             .duration(9 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Item.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 7L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 12L),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 7L))
             .duration(9 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 2L))
             .duration(10 * TICKS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Tin, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L))
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Tin, 1L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L))
             .duration(10 * TICKS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Cupronickel.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Cupronickel, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 2))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Cupronickel, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 2))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Kanthal.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Kanthal, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Cupronickel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Kanthal, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Cupronickel, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Nichrome.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Nichrome, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Kanthal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Nichrome, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Kanthal, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_TungstenSteel.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TPV, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Nichrome, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 5))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.TPV, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Nichrome, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 5))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_HSSG.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TPV, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 6))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.TPV, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 6))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_HSSS.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSS, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 7))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.HSSS, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 7))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Naquadah.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSS, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 8))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.HSSS, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 8))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_NaquadahAlloy.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 9))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 9))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Trinium.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Trinium, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 10))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Trinium, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 10))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_ElectrumFlux.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.ElectrumFlux, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Trinium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 11))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.ElectrumFlux, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Trinium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 11))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_AwakenedDraconium.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.DraconiumAwakened, 8),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.ElectrumFlux, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.DraconiumAwakened, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.ElectrumFlux, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 2L))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(90)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(90)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 6))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 6))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(90)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 2L))
             .duration(9 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 14))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(9 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 6L))
             .duration(9 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Aluminium, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Aluminium, 2L))
             .duration(10 * SECONDS + 10 * TICKS)
             .eut(150)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 3))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 3))
             .duration(10 * SECONDS + 10 * TICKS)
             .eut(150)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 6L))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 6L))
             .duration(10 * SECONDS + 10 * TICKS)
             .eut(150)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 2L))
             .duration(12 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(12 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.StainlessSteel, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.StainlessSteel, 6L))
             .duration(12 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 2L))
             .duration(13 * SECONDS + 10 * TICKS)
             .eut(210)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 7))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(13 * SECONDS + 10 * TICKS)
             .eut(210)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Titanium, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Titanium, 6L))
             .duration(13 * SECONDS + 10 * TICKS)
             .eut(210)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 2L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 10))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.TungstenSteel, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.TungstenSteel, 6L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Palladium, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Palladium, 2L))
             .duration(16 * SECONDS + 10 * TICKS)
             .eut(270)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 13))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Palladium, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Palladium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(16 * SECONDS + 10 * TICKS)
             .eut(270)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NiobiumTitanium, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Chrome, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.NiobiumTitanium, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Chrome, 6L))
             .duration(16 * SECONDS + 10 * TICKS)
             .eut(270)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 2L))
             .duration(18 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(18 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Enderium, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iridium, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Enderium, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Iridium, 6L))
             .duration(18 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 2L))
             .duration(18 * SECONDS)
             .eut(330)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(18 * SECONDS)
             .eut(330)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Osmium, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Osmium, 6L))
             .duration(18 * SECONDS)
             .eut(330)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 2L))
             .duration(18 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 7))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(18 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 12L),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Neutronium, 6L))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 12L),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Neutronium, 6L))
             .duration(18 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .metadata(RECYCLE, true)
             .addTo(UniversalArcFurnace);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
             .fluidInputs(Materials.Oxygen.getGas(2000L))
             .duration(60 * SECONDS)
             .eut((int) TierEU.RECIPE_LV)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java
index 217be9082a..b0eb83a49a 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java
@@ -17,16 +17,16 @@ import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.enums.Mods.TinkerConstruct;
 import static gregtech.api.enums.Mods.TwilightForest;
 import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.EIGHTH_INGOT;
-import static gregtech.api.util.GT_RecipeBuilder.HALF_INGOT;
-import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.QUARTER_INGOT;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.loaders.postload.GT_MachineRecipeLoader.solderingMats;
-import static gtPlusPlus.core.material.ALLOY.INCONEL_690;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.EIGHTH_INGOT;
+import static gregtech.api.util.GTRecipeBuilder.HALF_INGOT;
+import static gregtech.api.util.GTRecipeBuilder.INGOTS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.QUARTER_INGOT;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.loaders.postload.MachineRecipeLoader.solderingMats;
+import static gtPlusPlus.core.material.MaterialsAlloy.INCONEL_690;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
@@ -35,9 +35,9 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.GT_Mod;
+import gregtech.GTMod;
 import gregtech.api.enums.Dyes;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsUEVplus;
@@ -45,10 +45,10 @@ import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
 import gregtech.api.util.ExternalMaterials;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
-import gtPlusPlus.core.material.ALLOY;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
+import gtPlusPlus.core.material.MaterialsAlloy;
 
 public class AssemblerRecipes implements Runnable {
 
@@ -67,517 +67,517 @@ public class AssemblerRecipes implements Runnable {
         this.withIC2NuclearControl();
 
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Spray_Empty.get(1L))
                 .duration(40 * SECONDS)
                 .eut(1)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Aluminium, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Aluminium, 2L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Aluminium, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Aluminium, 2L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.ThermosCan_Empty.get(1L))
                 .duration(40 * SECONDS)
                 .eut(1)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Steel, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.AnyBronze, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Steel, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.AnyBronze, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_Steel.get(1L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.TungstenSteel, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Platinum, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.TungstenSteel, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Platinum, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_TungstenSteel.get(1L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Aluminium, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Silver, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Aluminium, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Silver, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_Aluminium.get(1L))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Electrum, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Electrum, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_StainlessSteel.get(1L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Titanium, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.RoseGold, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Titanium, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.RoseGold, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_Titanium.get(1L))
                 .duration(10 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Chrome, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Palladium, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Chrome, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Palladium, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_Chrome.get(1L))
                 .duration(10 * SECONDS)
                 .eut(1024)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Iridium, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Naquadah, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Iridium, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Naquadah, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_Iridium.get(1L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_EV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Osmium, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.ElectrumFlux, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Osmium, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.ElectrumFlux, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_Osmium.get(1L))
                 .duration(10 * SECONDS)
                 .eut(4096)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Neutronium, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Draconium, 4L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Neutronium, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Draconium, 4L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Large_Fluid_Cell_Neutronium.get(1L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_IV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
                     ItemList.Large_Fluid_Cell_Aluminium.get(1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Spray_Color_Remover_Empty.get(1L))
                 .duration(40 * SECONDS)
                 .eut(1)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Tool_Matches.get(1L))
                 .duration(16 * TICKS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.TricalciumPhosphate, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.TricalciumPhosphate, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Tool_Matches.get(1L))
                 .duration(16 * TICKS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Tool_Matches.get(4L))
                 .duration(3 * SECONDS + 4 * TICKS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 4L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 4L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Tool_Matches.get(4L))
                 .duration(3 * SECONDS + 4 * TICKS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Invar, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Invar, 2L),
                     new ItemStack(Items.flint, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Tool_Lighter_Invar_Empty.get(1L))
                 .duration(12 * SECONDS + 16 * TICKS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Platinum, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Platinum, 2L),
                     new ItemStack(Items.flint, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Tool_Lighter_Platinum_Empty.get(1L))
                 .duration(12 * SECONDS + 16 * TICKS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
                 .duration(1 * MINUTES + 20 * SECONDS)
                 .eut(2)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
                 .duration(1 * MINUTES + 20 * SECONDS)
                 .eut(2)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
                 .duration(1 * MINUTES + 20 * SECONDS)
                 .eut(2)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
                 .duration(1 * MINUTES + 20 * SECONDS)
                 .eut(2)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
                 .duration(1 * MINUTES + 20 * SECONDS)
                 .eut(2)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
                 .duration(1 * MINUTES + 20 * SECONDS)
                 .eut(2)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Lock.get(1L))
                 .duration(5 * MINUTES + 20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Lock.get(1L))
                 .duration(5 * MINUTES + 20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Upgrade_Lock.get(1L))
                 .duration(5 * MINUTES + 20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Sensor_EV.get(1L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_PlayerDetector.get(1L))
                 .duration(2 * MINUTES + 40 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
                     ItemList.Cover_Drain.get(1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Shutter.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
                     ItemList.Cover_Drain.get(1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Shutter.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
                     ItemList.Cover_Drain.get(1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Shutter.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2L),
                     new ItemStack(Blocks.iron_bars, 2),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Drain.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 2L),
                     new ItemStack(Blocks.iron_bars, 2),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Drain.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 2L),
                     new ItemStack(Blocks.iron_bars, 2),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Drain.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
                     new ItemStack(Blocks.crafting_table, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Crafting.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
                     new ItemStack(Blocks.crafting_table, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Crafting.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
                     new ItemStack(Blocks.crafting_table, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_Crafting.get(1L))
                 .duration(40 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Cover_Screen.get(1L),
                     ItemList.Cover_FluidDetector.get(1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_FluidStorageMonitor.get(1L))
                 .duration(40 * SECONDS)
                 .eut(4)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Sensor_LV.get(1L), ItemList.Emitter_LV.get(1L), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Sensor_LV.get(1L), ItemList.Emitter_LV.get(1L), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.NC_SensorKit.get(1L))
                 .duration(1 * MINUTES + 20 * SECONDS)
                 .eut(2)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Emitter_EV.get(1L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_RedstoneTransmitterExternal.get(1L))
                 .duration(2 * MINUTES + 40 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Sensor_EV.get(1L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_RedstoneReceiverExternal.get(1L))
                 .duration(2 * MINUTES + 40 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Emitter_MV.get(1L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Cover_NeedsMaintainance.get(1L))
                 .duration(30 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
                     ItemList.Component_Filter.get(1L),
                     ItemList.Conveyor_Module_LV.get(1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.ItemFilter_Export.get(1L))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
                     ItemList.Component_Filter.get(1L),
                     ItemList.Conveyor_Module_LV.get(1L),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.ItemFilter_Import.get(1L))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BlueSteel, 2L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.BlueSteel, 2L))
                 .itemOutputs(ItemList.BatteryHull_EV.get(1L))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(144L))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Platinum, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RoseGold, 6L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Platinum, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.RoseGold, 6L))
                 .itemOutputs(ItemList.BatteryHull_IV.get(1L))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(288L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_EV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedSteel, 18L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedSteel, 18L))
                 .itemOutputs(ItemList.BatteryHull_LuV.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(144L))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_IV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 6L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 6L))
                 .itemOutputs(ItemList.BatteryHull_ZPM.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(288L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LuV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.ElectrumFlux, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 18L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.ElectrumFlux, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 18L))
                 .itemOutputs(ItemList.BatteryHull_UV.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(576L))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_ZPM)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt02, Materials.ElectrumFlux, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Naquadah, 24L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt02, Materials.ElectrumFlux, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Naquadah, 24L))
                 .itemOutputs(ItemList.BatteryHull_UHV.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1152L))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_UV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.ElectrumFlux, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahEnriched, 36L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.ElectrumFlux, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahEnriched, 36L))
                 .itemOutputs(ItemList.BatteryHull_UEV.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(2304L))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_UHV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt08, Materials.ElectrumFlux, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 48L))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt08, Materials.ElectrumFlux, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 48L))
                 .itemOutputs(ItemList.BatteryHull_UIV.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4608L))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_UHV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 56L))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 56L))
                 .itemOutputs(ItemList.BatteryHull_UMV.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(9216L))
                 .duration(30 * SECONDS)
                 .eut(TierEU.RECIPE_UHV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2L),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.DraconiumAwakened, 64L))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.DraconiumAwakened, 64L))
                 .itemOutputs(ItemList.BatteryHull_UxV.get(1L))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(18432L))
                 .duration(60 * SECONDS)
@@ -586,15 +586,15 @@ public class AssemblerRecipes implements Runnable {
         }
 
         // If Cleanroom is enabled, add an assembler recipe
-        if (GT_Mod.gregtechproxy.mEnableCleanroom) {
-            GT_Values.RA.stdBuilder()
+        if (GTMod.gregtechproxy.mEnableCleanroom) {
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1L),
                     ItemList.Component_Filter.get(3L),
-                    GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1L),
                     ItemList.Electric_Motor_HV.get(2L),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Machine_Multi_Cleanroom.get(1L))
                 .fluidInputs(Materials.StainlessSteel.getMolten(144L))
                 .duration(60 * SECONDS)
@@ -602,55 +602,55 @@ public class AssemblerRecipes implements Runnable {
                 .addTo(assemblerRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Cover_Shutter.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.FluidFilter.get(1L))
             .duration(40 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.FR_Stick.get(1L))
             .fluidInputs(Materials.SeedOil.getFluid(50L))
             .duration(16 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
             .itemOutputs(ItemList.Block_Plascrete.get(1))
             .fluidInputs(Materials.Concrete.getMolten(144))
             .duration(10 * SECONDS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
             .itemOutputs(ItemList.Block_Plascrete.get(1))
             .fluidInputs(Materials.Concrete.getMolten(144))
             .duration(10 * SECONDS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.TungstenSteel, 16),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.EV), 4),
+                GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.TungstenSteel, 16),
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.EV), 4),
                 ItemList.Electric_Motor_IV.get(16),
                 ItemList.Emitter_EV.get(4),
                 ItemList.Duct_Tape.get(64),
                 ItemList.Energy_LapotronicOrb.get(1),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.TierdDrone0.get(4))
             .fluidInputs(Materials.AdvancedGlue.getFluid(144))
             .duration(10 * SECONDS)
@@ -660,8 +660,8 @@ public class AssemblerRecipes implements Runnable {
         for (byte i = 0; i < 16; i = (byte) (i + 1)) {
             for (int j = 0; j < Dyes.VALUES[i].getSizeOfFluidList(); j++) {
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(new ItemStack(Items.string, 3), GT_Utility.getIntegratedCircuit(3))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(new ItemStack(Items.string, 3), GTUtility.getIntegratedCircuit(3))
                     .itemOutputs(new ItemStack(Blocks.carpet, 2, 15 - i))
                     .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 24))
                     .duration(6 * SECONDS + 8 * TICKS)
@@ -670,9 +670,9 @@ public class AssemblerRecipes implements Runnable {
             }
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 1),
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 1),
                 ItemList.Paper_Printed_Pages.get(1))
             .itemOutputs(new ItemStack(Items.written_book, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(20))
@@ -680,278 +680,278 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3))
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 1),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3))
             .itemOutputs(new ItemStack(Items.book, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(20))
             .duration(20 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_ModHandler.getIC2Item("carbonMesh", 4),
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTModHandler.getIC2Item("carbonMesh", 4),
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Component_Filter.get(1))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 64),
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 64),
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Component_Filter.get(1))
             .fluidInputs(Materials.Plastic.getMolten(144))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 64),
                 ItemList.Circuit_Silicon_Wafer2.get(32),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphene, 64))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphene, 64))
             .fluidInputs(Materials.AdvancedGlue.getFluid(500))
             .duration(2 * MINUTES + 40 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 64),
                 ItemList.Circuit_Silicon_Wafer3.get(8),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphene, 64))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphene, 64))
             .fluidInputs(Materials.AdvancedGlue.getFluid(250))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_LV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.LV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.LV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_LV.get(1))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_MV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_MV.get(1))
             .duration(17 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_HV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.HV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.HV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_HV.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_EV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.EV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.EV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_EV.get(1))
             .duration(12 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_IV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.IV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.IV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_IV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_LuV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.LuV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.LuV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_LuV.get(1))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_ZPM.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.ZPM), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.ZPM), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_ZPM.get(1))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_UV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.UV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.UV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.FluidRegulator_UV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_UV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Steam_Valve_LV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.LV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.LV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Steam_Regulator_LV.get(1))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Steam_Valve_MV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Steam_Regulator_MV.get(1))
             .duration(17 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Steam_Valve_HV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.HV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.HV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Steam_Regulator_HV.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Steam_Valve_EV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.EV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.EV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Steam_Regulator_EV.get(1))
             .duration(12 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Steam_Valve_IV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.IV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.IV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Steam_Regulator_IV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_LV.get(1),
                 ItemList.Electric_Motor_LV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.Steel), 2),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.gear.get(Materials.Steel), 2),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Steam_Valve_LV.get(1))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_MV.get(1),
                 ItemList.Electric_Motor_MV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.Aluminium), 2),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.gear.get(Materials.Aluminium), 2),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Steam_Valve_MV.get(1))
             .duration(17 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_HV.get(1),
                 ItemList.Electric_Motor_HV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.StainlessSteel), 2),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.gear.get(Materials.StainlessSteel), 2),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Steam_Valve_HV.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_EV.get(1),
                 ItemList.Electric_Motor_EV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.Titanium), 2),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.gear.get(Materials.Titanium), 2),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Steam_Valve_EV.get(1))
             .duration(12 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_IV.get(1),
                 ItemList.Electric_Motor_IV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.TungstenSteel), 2),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.gear.get(Materials.TungstenSteel), 2),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Steam_Valve_IV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.Steel), 4),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.LV), 4),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.plate.get(Materials.Steel), 4),
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.LV), 4),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Schematic.get(1L))
             .duration(30 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.Aluminium), 3),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.plate.get(Materials.Aluminium), 3),
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Schematic.get(1L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.StainlessSteel), 2),
-                GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.HV), 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.plate.get(Materials.StainlessSteel), 2),
+                GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.HV), 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Schematic.get(1L))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_HV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 1L),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 1L),
                 ItemList.Circuit_Chip_LPIC.get(2L),
                 ItemList.HV_Coil.get(2L),
                 ItemList.Reactor_Coolant_He_1.get(1L),
@@ -961,10 +961,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_EV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 1L),
                 ItemList.Circuit_Chip_PIC.get(2L),
                 ItemList.EV_Coil.get(2L),
                 ItemList.Reactor_Coolant_He_1.get(1L),
@@ -974,10 +974,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_IV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 1L),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 1L),
                 ItemList.Circuit_Chip_HPIC.get(2L),
                 ItemList.IV_Coil.get(2L),
                 ItemList.Reactor_Coolant_He_3.get(1L),
@@ -987,10 +987,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_HV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 1L),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 1L),
                 ItemList.Circuit_Chip_LPIC.get(2L),
                 ItemList.HV_Coil.get(2L),
                 ItemList.Reactor_Coolant_NaK_1.get(1L),
@@ -1000,10 +1000,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_EV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 1L),
                 ItemList.Circuit_Chip_PIC.get(2L),
                 ItemList.EV_Coil.get(2L),
                 ItemList.Reactor_Coolant_NaK_1.get(1L),
@@ -1013,10 +1013,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_IV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 1L),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 1L),
                 ItemList.Circuit_Chip_HPIC.get(2L),
                 ItemList.IV_Coil.get(2L),
                 ItemList.Reactor_Coolant_NaK_3.get(1L),
@@ -1026,10 +1026,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_HV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Gold, 1L),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Gold, 1L),
                 ItemList.Circuit_Chip_LPIC.get(2L),
                 ItemList.HV_Coil.get(2L),
                 ItemList.Reactor_Coolant_He_1.get(1L),
@@ -1039,10 +1039,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_EV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Aluminium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Aluminium, 1L),
                 ItemList.Circuit_Chip_PIC.get(2L),
                 ItemList.EV_Coil.get(2L),
                 ItemList.Reactor_Coolant_He_1.get(1L),
@@ -1052,10 +1052,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_IV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Vanadiumtriindinid, 1L),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Vanadiumtriindinid, 1L),
                 ItemList.Circuit_Chip_HPIC.get(2L),
                 ItemList.IV_Coil.get(2L),
                 ItemList.Reactor_Coolant_He_3.get(1L),
@@ -1065,10 +1065,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_HV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Gold, 1L),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Gold, 1L),
                 ItemList.Circuit_Chip_LPIC.get(2L),
                 ItemList.HV_Coil.get(2L),
                 ItemList.Reactor_Coolant_NaK_1.get(1L),
@@ -1078,10 +1078,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_EV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Aluminium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Aluminium, 1L),
                 ItemList.Circuit_Chip_PIC.get(2L),
                 ItemList.EV_Coil.get(2L),
                 ItemList.Reactor_Coolant_NaK_1.get(1L),
@@ -1091,10 +1091,10 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_IV.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Vanadiumtriindinid, 1L),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Vanadiumtriindinid, 1L),
                 ItemList.Circuit_Chip_HPIC.get(2L),
                 ItemList.IV_Coil.get(2L),
                 ItemList.Reactor_Coolant_NaK_3.get(1L),
@@ -1104,124 +1104,124 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Steel, 2L),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6L),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 2L),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Steel, 2L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6L),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 2L),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Long_Distance_Pipeline_Fluid.get(2L))
             .fluidInputs(Materials.Tin.getMolten(144L))
             .duration(15 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Tin, 2L),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6L),
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 2L),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Tin, 2L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6L),
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 2L),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Long_Distance_Pipeline_Item.get(2L))
             .fluidInputs(Materials.Tin.getMolten(144L))
             .duration(15 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 2L),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 9L),
-                GT_Utility.getIntegratedCircuit(24))
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 2L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 9L),
+                GTUtility.getIntegratedCircuit(24))
             .itemOutputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(64L))
             .fluidInputs(Materials.Tin.getMolten(144L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Tin, 2L),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 9L),
-                GT_Utility.getIntegratedCircuit(24))
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Tin, 2L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 9L),
+                GTUtility.getIntegratedCircuit(24))
             .itemOutputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(64L))
             .fluidInputs(Materials.Tin.getMolten(144L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.StainlessSteel, 1L),
+                GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.StainlessSteel, 1L),
                 ItemList.Hull_EV.get(1L),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Hatch_Input_Multi_2x2_EV.get(1L))
             .fluidInputs(Materials.Glass.getMolten(2304L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.Titanium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.Titanium, 1L),
                 ItemList.Hull_IV.get(1L),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Hatch_Input_Multi_2x2_IV.get(1L))
             .fluidInputs(Materials.Glass.getMolten(2304L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.TungstenSteel, 1L),
+                GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.TungstenSteel, 1L),
                 ItemList.Hull_LuV.get(1L),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Hatch_Input_Multi_2x2_LuV.get(1L))
             .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2304L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.NiobiumTitanium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.NiobiumTitanium, 1L),
                 ItemList.Hull_ZPM.get(1L),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Hatch_Input_Multi_2x2_ZPM.get(1L))
             .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2304L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.MysteriousCrystal, 1L),
+                GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.MysteriousCrystal, 1L),
                 ItemList.Hull_UV.get(1L),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Hatch_Input_Multi_2x2_UV.get(1L))
             .fluidInputs(Materials.Polybenzimidazole.getMolten(2304L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.Neutronium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.Neutronium, 1L),
                 ItemList.Hull_MAX.get(1L),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Hatch_Input_Multi_2x2_UHV.get(1L))
             .fluidInputs(Materials.Polybenzimidazole.getMolten(2304L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_UHV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 4L),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 4L),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1L),
                 ItemList.Robot_Arm_IV.get(2L),
-                GT_Utility.getIntegratedCircuit(3))
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Casing_Gearbox_TungstenSteel.get(1L))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -1236,10 +1236,10 @@ public class AssemblerRecipes implements Runnable {
                 nbtFlask.setInteger("Capacity", capacities[i]);
                 flask.setTagCompound(nbtFlask);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         ItemList.VOLUMETRIC_FLASK.get(1),
-                        GT_Utility.getIntegratedCircuit(circuitConfigurations[i]))
+                        GTUtility.getIntegratedCircuit(circuitConfigurations[i]))
                     .itemOutputs(flask)
                     .duration(10 * TICKS)
                     .eut(TierEU.RECIPE_LV)
@@ -1247,125 +1247,125 @@ public class AssemblerRecipes implements Runnable {
             }
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_LV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Bronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Bronze, 1),
                 ItemList.Electric_Motor_LV.get(1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_LV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_MV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Steel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1),
                 ItemList.Electric_Motor_MV.get(1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_MV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_HV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.StainlessSteel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.StainlessSteel, 1),
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1),
                 ItemList.Electric_Motor_HV.get(1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_HV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_EV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Titanium, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Titanium, 1),
                 ItemList.Electric_Motor_EV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Titanium, 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Titanium, 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_EV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_IV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 1),
                 ItemList.Electric_Motor_IV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.TungstenSteel, 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.TungstenSteel, 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_IV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_LuV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Enderium, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Enderium, 1),
                 ItemList.Electric_Motor_LuV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Enderium, 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Enderium, 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_LuV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_ZPM.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 1),
                 ItemList.Electric_Motor_ZPM.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.NaquadahAlloy, 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.NaquadahAlloy, 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_ZPM.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_UV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NetherStar, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NetherStar, 1),
                 ItemList.Electric_Motor_UV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Neutronium, 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Neutronium, 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_UV.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Hull_MAX.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.MysteriousCrystal, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.MysteriousCrystal, 1),
                 ItemList.Electric_Motor_UHV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.CosmicNeutronium, 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.CosmicNeutronium, 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Hatch_Muffler_MAX.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_UHV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.redstone_torch, 2, 32767),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1))
             .itemOutputs(new ItemStack(Items.repeater, 1, 0))
             .fluidInputs(Materials.Concrete.getMolten(144))
             .duration(4 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.leather, 1, 32767), new ItemStack(Items.lead, 1, 32767))
             .itemOutputs(new ItemStack(Items.name_tag, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(72))
@@ -1373,7 +1373,7 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 1L, 0),
                 new ItemStack(Items.lead, 1, 32767))
@@ -1383,76 +1383,68 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 8),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 8),
                 new ItemStack(Items.compass, 1, 32767))
             .itemOutputs(new ItemStack(Items.map, 1, 0))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tantalum, 1),
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Manganese, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tantalum, 1),
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.Manganese, 1))
             .itemOutputs(ItemList.Battery_RE_ULV_Tantalum.get(8))
             .fluidInputs(Materials.Plastic.getMolten(144))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfLife1", 4L, 0), GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfLife1", 4L, 0), GTUtility.getIntegratedCircuit(4))
             .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfLife2", 1L, 0))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                getModItem(TwilightForest.ID, "item.charmOfKeeping1", 4L, 0),
-                GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfKeeping1", 4L, 0), GTUtility.getIntegratedCircuit(4))
             .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping2", 1L, 0))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                getModItem(TwilightForest.ID, "item.charmOfKeeping2", 4L, 0),
-                GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfKeeping2", 4L, 0), GTUtility.getIntegratedCircuit(4))
             .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping3", 1L, 0))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfLife2", 1L, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfLife2", 1L, 0), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfLife1", 4L, 0))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                getModItem(TwilightForest.ID, "item.charmOfKeeping2", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfKeeping2", 1L, 0), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping1", 4L, 0))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                getModItem(TwilightForest.ID, "item.charmOfKeeping3", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.charmOfKeeping3", 1L, 0), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping2", 4L, 0))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 16),
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
@@ -1462,7 +1454,7 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 17),
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
@@ -1472,7 +1464,7 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 18),
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
@@ -1482,34 +1474,34 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 1),
                 new ItemStack(Blocks.sand, 1, 32767))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 2L, 0))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 1),
                 new ItemStack(Blocks.sand, 1, 32767))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 2L, 600))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Fluix, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Fluix, 1),
                 new ItemStack(Blocks.sand, 1, 32767))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 2L, 1200))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.FR_Wax.get(6), new ItemStack(Items.string, 1, 32767))
             .itemOutputs(getModItem(Forestry.ID, "candle", 24L, 0))
             .fluidInputs(Materials.Water.getFluid(600))
@@ -1517,7 +1509,7 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.FR_Wax.get(2), ItemList.FR_Silk.get(1))
             .itemOutputs(getModItem(Forestry.ID, "candle", 8L, 0))
             .fluidInputs(Materials.Water.getFluid(200))
@@ -1525,24 +1517,24 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.FR_Silk.get(9), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.FR_Silk.get(9), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(getModItem(Forestry.ID, "craftingMaterial", 1L, 3))
             .fluidInputs(Materials.Water.getFluid(500))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(Forestry.ID, "propolis", 5L, 2), GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(Forestry.ID, "propolis", 5L, 2), GTUtility.getIntegratedCircuit(5))
             .itemOutputs(getModItem(Forestry.ID, "craftingMaterial", 1L, 1))
             .duration(16 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
                 new ItemStack(Blocks.wool, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.torch, 6, 0))
             .fluidInputs(Materials.Creosote.getFluid(1000))
@@ -1550,62 +1542,62 @@ public class AssemblerRecipes implements Runnable {
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(Forestry.ID, "craftingMaterial", 5L, 1), GT_Utility.getIntegratedCircuit(5))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(Forestry.ID, "craftingMaterial", 5L, 1), GTUtility.getIntegratedCircuit(5))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.piston, 1, 32767), new ItemStack(Items.slime_ball, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.sticky_piston, 1, 0))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.piston, 1, 32767), ItemList.IC2_Resin.get(1))
             .itemOutputs(new ItemStack(Blocks.sticky_piston, 1, 0))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.piston, 1, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.piston, 1, 32767), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Blocks.sticky_piston, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(100))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 3),
-                GT_ModHandler.getIC2Item("carbonMesh", 3),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 3),
+                GTModHandler.getIC2Item("carbonMesh", 3),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Duct_Tape.get(1))
             .fluidInputs(Materials.Glue.getFluid(300))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StyreneButadieneRubber, 2),
-                GT_ModHandler.getIC2Item("carbonMesh", 2),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.StyreneButadieneRubber, 2),
+                GTModHandler.getIC2Item("carbonMesh", 2),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Duct_Tape.get(1))
             .fluidInputs(Materials.Glue.getFluid(200))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Silicone, 1),
-                GT_ModHandler.getIC2Item("carbonMesh", 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Silicone, 1),
+                GTModHandler.getIC2Item("carbonMesh", 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Duct_Tape.get(1))
             .fluidInputs(Materials.Glue.getFluid(100))
             .duration(5 * SECONDS)
@@ -1615,17 +1607,17 @@ public class AssemblerRecipes implements Runnable {
         // Maintenance Hatch Recipes Using BrainTech + Refined Glue. Info: One BrainTech Recipe Is In GT+ü Originally.
         // The Maintenance Hatch Recipe using SuperGlue is there.
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Hull_LV.get(1), ItemList.Duct_Tape.get(2), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Hull_LV.get(1), ItemList.Duct_Tape.get(2), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Hatch_Maintenance.get(1))
             .fluidInputs(Materials.Glue.getFluid(1000))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
                 new ItemStack(Items.leather, 1, 32767))
             .itemOutputs(new ItemStack(Items.book, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(20))
@@ -1633,9 +1625,9 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
                 getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 1L, 0))
             .itemOutputs(new ItemStack(Items.book, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(20))
@@ -1643,17 +1635,17 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
-                GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, Materials.Paper, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
+                GTOreDictUnificator.get(OrePrefixes.plateQuadruple, Materials.Paper, 1))
             .itemOutputs(new ItemStack(Items.book, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(20))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Paper_Printed_Pages.get(1), new ItemStack(Items.leather, 1, 32767))
             .itemOutputs(new ItemStack(Items.written_book, 1, 0))
             .fluidInputs(Materials.Glue.getFluid(20))
@@ -1661,7 +1653,7 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Paper_Printed_Pages.get(1),
                 getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 1L, 0))
@@ -1671,14 +1663,14 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 4))
             .itemOutputs(ItemList.Cell_Universal_Fluid.get(1))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Baked_Cake.get(1), new ItemStack(Items.egg, 1, 0))
             .itemOutputs(new ItemStack(Items.cake, 1, 0))
             .fluidInputs(Materials.Milk.getFluid(3000))
@@ -1686,104 +1678,104 @@ public class AssemblerRecipes implements Runnable {
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Sliced_Bun.get(2), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Sliced_Bun.get(2), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Food_Sliced_Buns.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Sliced_Bread.get(2), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Sliced_Bread.get(2), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Food_Sliced_Breads.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Sliced_Baguette.get(2), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Sliced_Baguette.get(2), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Food_Sliced_Baguettes.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Sliced_Buns.get(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Sliced_Buns.get(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Food_Sliced_Bun.get(2))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Sliced_Breads.get(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Sliced_Breads.get(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Food_Sliced_Bread.get(2))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Sliced_Baguettes.get(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Sliced_Baguettes.get(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Food_Sliced_Baguette.get(2))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Food_Sliced_Bun.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
             .itemOutputs(ItemList.Food_Burger_Meat.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Food_Sliced_Buns.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
             .itemOutputs(ItemList.Food_Burger_Meat.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Sliced_Bun.get(2), ItemList.Food_Chum.get(1))
             .itemOutputs(ItemList.Food_Burger_Chum.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Sliced_Buns.get(1), ItemList.Food_Chum.get(1))
             .itemOutputs(ItemList.Food_Burger_Chum.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Sliced_Bun.get(2), ItemList.Food_Sliced_Cheese.get(3))
             .itemOutputs(ItemList.Food_Burger_Cheese.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Sliced_Buns.get(1), ItemList.Food_Sliced_Cheese.get(3))
             .itemOutputs(ItemList.Food_Burger_Cheese.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Food_Flat_Dough.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
             .itemOutputs(ItemList.Food_Raw_Pizza_Meat.get(1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Flat_Dough.get(1), ItemList.Food_Sliced_Cheese.get(3))
             .itemOutputs(ItemList.Food_Raw_Pizza_Cheese.get(1))
             .duration(5 * SECONDS)
@@ -1792,838 +1784,838 @@ public class AssemblerRecipes implements Runnable {
 
         // SC craft
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
                 ItemList.Electric_Pump_MV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
             .fluidInputs(Materials.Helium.getGas(2000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
                 ItemList.Electric_Pump_HV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
             .fluidInputs(Materials.Helium.getGas(4000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
                 ItemList.Electric_Pump_EV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
             .fluidInputs(Materials.Helium.getGas(6000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
                 ItemList.Electric_Pump_IV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
             .fluidInputs(Materials.Helium.getGas(8000))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.wireGt01,
                     Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
                     15),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
                 ItemList.Electric_Pump_LuV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
             .fluidInputs(Materials.Helium.getGas(12000))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
                 ItemList.Electric_Pump_ZPM.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
             .fluidInputs(Materials.Helium.getGas(16000))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
                 ItemList.Electric_Pump_UV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
             .fluidInputs(Materials.Helium.getGas(20000))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
                 ItemList.Electric_Pump_UHV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
             .fluidInputs(Materials.Helium.getGas(24000))
             .duration(2 * MINUTES + 40 * SECONDS)
             .eut(TierEU.RECIPE_UHV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
                 ItemList.Electric_Pump_MV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(4))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
                 ItemList.Electric_Pump_HV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(8))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
                 ItemList.Electric_Pump_EV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(12))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
                 ItemList.Electric_Pump_IV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(16))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.wireGt01,
                     Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
                     15),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
                 ItemList.Electric_Pump_LuV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(24))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
                 ItemList.Electric_Pump_ZPM.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(32))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
                 ItemList.Electric_Pump_UV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(40))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
                 ItemList.Electric_Pump_UHV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(48))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_UHV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEVBase, 27),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Infinity, 18),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEVBase, 27),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Infinity, 18),
                 ItemList.Electric_Pump_UEV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 27))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 27))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(56))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_UEV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIVBase, 30L),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.TranscendentMetal, 20L),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIVBase, 30L),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.TranscendentMetal, 20L),
                 ItemList.Electric_Pump_UIV.get(1L),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 30L))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 30L))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(68))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_UIV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMVBase, 33),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.SpaceTime, 22),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMVBase, 33),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.SpaceTime, 22),
                 ItemList.Electric_Pump_UMV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 33))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 33))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(72))
             .duration(2 * MINUTES + 40 * SECONDS)
             .eut(TierEU.RECIPE_UMV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lead, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Lead, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.ULV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.LV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SteelMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Aluminium, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.SteelMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Aluminium, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.MV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SteelMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.EnergeticAlloy, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.SteelMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.EnergeticAlloy, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.HV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NeodymiumMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.TungstenSteel, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.NeodymiumMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.TungstenSteel, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.EV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NeodymiumMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Iridium, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.NeodymiumMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Iridium, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.IV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, ExternalMaterials.getRuridit(), 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, ExternalMaterials.getRuridit(), 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.LuV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.ZPM_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.ElectrumFlux, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.ElectrumFlux, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.UV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 16),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 16),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.UHV_Coil.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_UHV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 6),
-                GT_Utility.getIntegratedCircuit(2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Wood, 2))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 6),
+                GTUtility.getIntegratedCircuit(2))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Wood, 2))
             .fluidInputs(Materials.Glue.getFluid(10))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 3),
-                GT_Utility.getIntegratedCircuit(4))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Wood, 4))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 3),
+                GTUtility.getIntegratedCircuit(4))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Wood, 4))
             .fluidInputs(Materials.Glue.getFluid(20))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(12))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.Wood, 6))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(12))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.pipeSmall, Materials.Wood, 6))
             .fluidInputs(Materials.Glue.getFluid(60))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 4),
-                GT_OreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Advanced, 4),
-                GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Diamond, 1),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 4),
+                GTOreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Advanced, 4),
+                GTOreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Diamond, 1),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Ingot_IridiumAlloy.get(1))
             .duration(60 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1),
                 ItemList.Electric_Motor_MV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1),
                 new ItemStack(Blocks.iron_bars, 6),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Casing_Grate.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1),
                 ItemList.Electric_Motor_UV.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Iridium, 1),
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Iridium, 1),
                 ItemList.Component_Filter.get(8),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Iridium, 8))
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Iridium, 8))
             .itemOutputs(ItemList.Casing_Vent_T2.get(1))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
                 new ItemStack(Items.coal, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.torch, 4))
             .duration(2 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 2),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Steel, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 2),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Steel, 1))
             .itemOutputs(new ItemStack(Blocks.light_weighted_pressure_plate, 1))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 2),
-                GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Steel, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 2),
+                GTOreDictUnificator.get(OrePrefixes.spring, Materials.Steel, 1))
             .itemOutputs(new ItemStack(Blocks.heavy_weighted_pressure_plate, 1))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 7),
-                GT_Utility.getIntegratedCircuit(7))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 7),
+                GTUtility.getIntegratedCircuit(7))
             .itemOutputs(new ItemStack(Items.cauldron, 1))
             .duration(35 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("ironFence", 1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("ironFence", 1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 3),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 3),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(new ItemStack(Blocks.iron_bars, 4))
             .duration(15 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 7),
-                GT_Utility.getIntegratedCircuit(7))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 7),
+                GTUtility.getIntegratedCircuit(7))
             .itemOutputs(new ItemStack(Items.cauldron, 1))
             .duration(35 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("ironFence", 1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("ironFence", 1))
             .duration(5 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 3),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 3),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(new ItemStack(Blocks.iron_bars, 4))
             .duration(15 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 3),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 3),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(new ItemStack(Blocks.fence, 1))
             .duration(15 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Iron, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTOreDictUnificator.get(OrePrefixes.ring, Materials.Iron, 2))
             .itemOutputs(new ItemStack(Blocks.tripwire_hook, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_OreDictUnificator.get(OrePrefixes.ring, Materials.WroughtIron, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTOreDictUnificator.get(OrePrefixes.ring, Materials.WroughtIron, 2))
             .itemOutputs(new ItemStack(Blocks.tripwire_hook, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 3),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 3),
                 new ItemStack(Items.string, 3, 32767))
             .itemOutputs(new ItemStack(Items.bow, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 3),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 3),
                 ItemList.Component_Minecart_Wheels_Iron.get(2))
             .itemOutputs(new ItemStack(Items.minecart, 1))
             .duration(5 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 3),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 3),
                 ItemList.Component_Minecart_Wheels_Iron.get(2))
             .itemOutputs(new ItemStack(Items.minecart, 1))
             .duration(4 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 3),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 3),
                 ItemList.Component_Minecart_Wheels_Steel.get(2))
             .itemOutputs(new ItemStack(Items.minecart, 1))
             .duration(5 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Iron, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.ring, Materials.Iron, 2))
             .itemOutputs(ItemList.Component_Minecart_Wheels_Iron.get(1))
             .duration(5 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.ring, Materials.WroughtIron, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+                GTOreDictUnificator.get(OrePrefixes.ring, Materials.WroughtIron, 2))
             .itemOutputs(ItemList.Component_Minecart_Wheels_Iron.get(1))
             .duration(4 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Steel, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.ring, Materials.Steel, 2))
             .itemOutputs(ItemList.Component_Minecart_Wheels_Steel.get(1))
             .duration(3 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.hopper, 1, 32767))
             .itemOutputs(new ItemStack(Items.hopper_minecart, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.tnt, 1, 32767))
             .itemOutputs(new ItemStack(Items.tnt_minecart, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.chest, 1, 32767))
             .itemOutputs(new ItemStack(Items.chest_minecart, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.trapped_chest, 1, 32767))
             .itemOutputs(new ItemStack(Items.chest_minecart, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.furnace, 1, 32767))
             .itemOutputs(new ItemStack(Items.furnace_minecart, 1))
             .duration(20 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.tripwire_hook, 1), new ItemStack(Blocks.chest, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.trapped_chest, 1))
             .duration(10 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.stone, 1, 0), GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.stone, 1, 0), GTUtility.getIntegratedCircuit(4))
             .itemOutputs(new ItemStack(Blocks.stonebrick, 1, 0))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.sandstone, 1, 0), GT_Utility.getIntegratedCircuit(23))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.sandstone, 1, 0), GTUtility.getIntegratedCircuit(23))
             .itemOutputs(new ItemStack(Blocks.sandstone, 1, 2))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.sandstone, 1, 1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.sandstone, 1, 1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Blocks.sandstone, 1, 0))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.sandstone, 1, 2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.sandstone, 1, 2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Blocks.sandstone, 1, 0))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 8),
-                GT_Utility.getIntegratedCircuit(8))
-            .itemOutputs(GT_ModHandler.getIC2Item("machine", 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 8),
+                GTUtility.getIntegratedCircuit(8))
+            .itemOutputs(GTModHandler.getIC2Item("machine", 1))
             .duration(1 * SECONDS + 5 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_ULV.get(1))
             .duration(1 * SECONDS + 5 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_LV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_MV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_HV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_EV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_IV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, ExternalMaterials.getRhodiumPlatedPalladium(), 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, ExternalMaterials.getRhodiumPlatedPalladium(), 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_LuV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_ZPM.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_UV.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.Casing_MAX.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Invar, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Invar, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Invar, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Invar, 1))
             .itemOutputs(ItemList.Casing_HeatProof.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Casing_SolidSteel.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Aluminium, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Aluminium, 1))
             .itemOutputs(ItemList.Casing_FrostProof.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
             .itemOutputs(ItemList.Casing_RobustTungstenSteel.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.StainlessSteel, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.StainlessSteel, 1))
             .itemOutputs(ItemList.Casing_CleanStainlessSteel.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1))
             .itemOutputs(ItemList.Casing_StableTitanium.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Osmiridium, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Osmiridium, 1))
             .itemOutputs(ItemList.Casing_MiningOsmiridium.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1))
             .itemOutputs(ItemList.Casing_MiningNeutronium.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BlackPlutonium, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackPlutonium, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.BlackPlutonium, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackPlutonium, 1))
             .itemOutputs(ItemList.Casing_MiningBlackPlutonium.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 4), ItemList.Casing_LuV.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 4), ItemList.Casing_LuV.get(1))
             .itemOutputs(ItemList.Casing_Fusion.get(1))
             .fluidInputs(Materials.HSSG.getMolten(288))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 4),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 4),
                 ItemList.Casing_Fusion.get(1))
             .itemOutputs(ItemList.Casing_Fusion2.get(1))
             .fluidInputs(Materials.NaquadahAlloy.getMolten(288))
@@ -2631,93 +2623,93 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Magnalium, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlueSteel, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Magnalium, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.BlueSteel, 1))
             .itemOutputs(ItemList.Casing_Turbine.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 6),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 6),
                 ItemList.Casing_Turbine.get(1))
             .itemOutputs(ItemList.Casing_Turbine1.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6),
                 ItemList.Casing_Turbine.get(1))
             .itemOutputs(ItemList.Casing_Turbine2.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6),
                 ItemList.Casing_Turbine.get(1))
             .itemOutputs(ItemList.Casing_Turbine3.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6), ItemList.Casing_Turbine.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6), ItemList.Casing_Turbine.get(1))
             .itemOutputs(ItemList.Casing_TurbineGasAdvanced.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Casing_SolidSteel.get(1), GT_Utility.getIntegratedCircuit(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Casing_SolidSteel.get(1), GTUtility.getIntegratedCircuit(6))
             .itemOutputs(ItemList.Casing_Chemically_Inert.get(1))
             .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(216))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1))
             .itemOutputs(ItemList.Casing_Advanced_Iridium.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Lead, 2), ItemList.Casing_ULV.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Lead, 2), ItemList.Casing_ULV.get(1))
             .itemOutputs(ItemList.Hull_ULV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(288))
             .duration(1 * SECONDS + 5 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 2), ItemList.Casing_LV.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 2), ItemList.Casing_LV.get(1))
             .itemOutputs(ItemList.Hull_LV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(288))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 2), ItemList.Casing_MV.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 2), ItemList.Casing_MV.get(1))
             .itemOutputs(ItemList.Hull_MV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(288))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.AnnealedCopper, 2),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.AnnealedCopper, 2),
                 ItemList.Casing_MV.get(1))
             .itemOutputs(ItemList.Hull_MV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(288))
@@ -2725,17 +2717,17 @@ public class AssemblerRecipes implements Runnable {
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 2), ItemList.Casing_HV.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 2), ItemList.Casing_HV.get(1))
             .itemOutputs(ItemList.Hull_HV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(288))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2),
                 ItemList.Casing_EV.get(1))
             .itemOutputs(ItemList.Hull_EV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(288))
@@ -2743,9 +2735,9 @@ public class AssemblerRecipes implements Runnable {
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tungsten, 2),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tungsten, 2),
                 ItemList.Casing_IV.get(1))
             .itemOutputs(ItemList.Hull_IV.get(1))
             .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(288))
@@ -2753,9 +2745,9 @@ public class AssemblerRecipes implements Runnable {
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.VanadiumGallium, 2),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.VanadiumGallium, 2),
                 ItemList.Casing_LuV.get(1))
             .itemOutputs(ItemList.Hull_LuV.get(1))
             .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(288))
@@ -2763,9 +2755,9 @@ public class AssemblerRecipes implements Runnable {
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2),
                 ItemList.Casing_ZPM.get(1))
             .itemOutputs(ItemList.Hull_ZPM.get(1))
             .fluidInputs(Materials.Polybenzimidazole.getMolten(288))
@@ -2773,9 +2765,9 @@ public class AssemblerRecipes implements Runnable {
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2),
+                GTOreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2),
                 ItemList.Casing_UV.get(1))
             .itemOutputs(ItemList.Hull_UV.get(1))
             .fluidInputs(Materials.Polybenzimidazole.getMolten(288))
@@ -2783,9 +2775,9 @@ public class AssemblerRecipes implements Runnable {
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 2),
+                GTOreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 2),
                 ItemList.Casing_MAX.get(1))
             .itemOutputs(ItemList.Hull_MAX.get(1))
             .fluidInputs(Materials.Polybenzimidazole.getMolten(288))
@@ -2793,491 +2785,491 @@ public class AssemblerRecipes implements Runnable {
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 1))
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 1),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 1))
             .itemOutputs(ItemList.Battery_Hull_LV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(144))
             .duration(4 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 2),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 3))
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 3))
             .itemOutputs(ItemList.Battery_Hull_MV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(432))
             .duration(16 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.AnnealedCopper, 2),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 3))
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.AnnealedCopper, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 3))
             .itemOutputs(ItemList.Battery_Hull_MV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(432))
             .duration(16 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 4),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 9))
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 4),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 9))
             .itemOutputs(ItemList.Battery_Hull_HV.get(1))
             .fluidInputs(Materials.Plastic.getMolten(1296))
             .duration(1 * MINUTES + 4 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.string, 4, 32767), new ItemStack(Items.slime_ball, 1, 32767))
             .itemOutputs(new ItemStack(Items.lead, 2))
             .duration(2 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("batPack", 1L, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("batPack", 1L, 32767), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.IC2_ReBattery.get(6))
             .duration(40 * SECONDS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("carbonFiber", 2), GT_Utility.getIntegratedCircuit(2))
-            .itemOutputs(GT_ModHandler.getIC2Item("carbonMesh", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("carbonFiber", 2), GTUtility.getIntegratedCircuit(2))
+            .itemOutputs(GTModHandler.getIC2Item("carbonMesh", 1))
             .duration(8 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 5),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 5),
                 new ItemStack(Blocks.chest, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.hopper))
             .duration(8 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 5),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 5),
                 new ItemStack(Blocks.trapped_chest, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.hopper))
             .duration(8 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 5),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 5),
                 new ItemStack(Blocks.chest, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.hopper))
             .duration(8 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 5),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 5),
                 new ItemStack(Blocks.trapped_chest, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.hopper))
             .duration(8 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.gear, Materials.CobaltBrass, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1))
+                GTOreDictUnificator.get(OrePrefixes.gear, Materials.CobaltBrass, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1))
             .itemOutputs(ItemList.Component_Sawblade_Diamond.get(1))
             .duration(16 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
             .itemOutputs(new ItemStack(Blocks.redstone_torch, 1))
             .duration(1 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
             .itemOutputs(new ItemStack(Blocks.torch, 2))
             .duration(2 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
             .itemOutputs(new ItemStack(Blocks.torch, 6))
             .duration(2 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1), ItemList.IC2_Resin.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1), ItemList.IC2_Resin.get(1))
             .itemOutputs(new ItemStack(Blocks.torch, 6))
             .duration(2 * SECONDS)
             .eut(20)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.wooden_sword, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Stone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Stone, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.stone_sword, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.iron_sword, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.golden_sword, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Diamond, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Diamond, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.diamond_sword, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Bronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Sword_Bronze.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Steel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Sword_Steel.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.wooden_pickaxe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Stone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Stone, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.stone_pickaxe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.iron_pickaxe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.golden_pickaxe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Diamond, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Diamond, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.diamond_pickaxe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Bronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Pickaxe_Bronze.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Steel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Pickaxe_Steel.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.wooden_shovel, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Stone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Stone, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.stone_shovel, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.iron_shovel, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.golden_shovel, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Diamond, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Diamond, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.diamond_shovel, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Bronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Shovel_Bronze.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Steel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Shovel_Steel.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.wooden_axe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Stone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Stone, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.stone_axe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.iron_axe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.golden_axe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Diamond, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Diamond, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.diamond_axe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Bronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Axe_Bronze.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Steel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Axe_Steel.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Wood, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Wood, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.wooden_hoe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Stone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Stone, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.stone_hoe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.iron_hoe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.golden_hoe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Diamond, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Diamond, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.diamond_hoe, 1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Bronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Hoe_Bronze.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Steel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Steel, 1),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Tool_Hoe_Steel.getUndamaged(1))
             .duration(5 * SECONDS)
             .eut(16)
@@ -3285,246 +3277,246 @@ public class AssemblerRecipes implements Runnable {
 
         // fuel rod assembler recipes
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.ThoriumCell_1.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.ThoriumCell_2.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.ThoriumCell_1.get(4),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.ThoriumCell_4.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.ThoriumCell_2.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.ThoriumCell_4.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Uraniumcell_1.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Uraniumcell_2.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Uraniumcell_1.get(4),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Uraniumcell_4.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Uraniumcell_2.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Uraniumcell_4.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Moxcell_1.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Moxcell_2.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Moxcell_1.get(4),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Moxcell_4.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Moxcell_2.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Moxcell_4.get(1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.NaquadahCell_1.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.NaquadahCell_2.get(1))
             .duration(5 * SECONDS)
             .eut(400)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.NaquadahCell_1.get(4),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 6),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 6),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.NaquadahCell_4.get(1))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(400)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.NaquadahCell_2.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.NaquadahCell_4.get(1))
             .duration(5 * SECONDS)
             .eut(400)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.MNqCell_1.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.MNqCell_2.get(1))
             .duration(5 * SECONDS)
             .eut(400)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.MNqCell_1.get(4),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 6),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 6),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.MNqCell_4.get(1))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(400)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.MNqCell_2.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.MNqCell_4.get(1))
             .duration(5 * SECONDS)
             .eut(400)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Neutronium, 8),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Iridium, 4))
+                GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Neutronium, 8),
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Iridium, 4))
             .itemOutputs(ItemList.neutroniumHeatCapacitor.get(1))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 Materials.NaquadahAlloy.getPlates(8),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1))
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1))
             .itemOutputs(ItemList.RadiantNaquadahAlloyCasing.get(1))
             .duration(10 * TICKS)
             .eut(400000)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.KevlarFiber.get(8), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.KevlarFiber.get(8), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.WovenKevlar.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1),
                 ItemList.NC_SensorKit.get(1),
                 ItemList.Emitter_EV.get(1),
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1, 28),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Cover_Metrics_Transmitter.get(1))
             .fluidInputs(Materials.SolderingAlloy.getMolten(INGOTS))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        ItemStack[] plates = new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L) };
+        ItemStack[] plates = new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+            GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+            GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L) };
 
         for (Materials tMat : solderingMats) {
             int tMultiplier = tMat.contains(SubTag.SOLDERING_MATERIAL_GOOD) ? 1
                 : tMat.contains(SubTag.SOLDERING_MATERIAL_BAD) ? 4 : 2;
 
             for (ItemStack tPlate : plates) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(new ItemStack(Blocks.lever, 1, 32767), tPlate, GT_Utility.getIntegratedCircuit(1))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(new ItemStack(Blocks.lever, 1, 32767), tPlate, GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Cover_Controller.get(1))
                     .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
                     .duration(40 * SECONDS)
                     .eut(16)
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         new ItemStack(Blocks.redstone_torch, 1, 32767),
                         tPlate,
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Cover_ActivityDetector.get(1))
                     .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
                     .duration(40 * SECONDS)
                     .eut(16)
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         new ItemStack(Blocks.heavy_weighted_pressure_plate, 1, 32767),
                         tPlate,
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Cover_FluidDetector.get(1))
                     .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
                     .duration(40 * SECONDS)
                     .eut(16)
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         new ItemStack(Blocks.light_weighted_pressure_plate, 1, 32767),
                         tPlate,
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Cover_ItemDetector.get(1))
                     .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
                     .duration(40 * SECONDS)
                     .eut(16)
                     .addTo(assemblerRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_ModHandler.getIC2Item("ecMeter", 1), tPlate, GT_Utility.getIntegratedCircuit(1))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTModHandler.getIC2Item("ecMeter", 1), tPlate, GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Cover_EnergyDetector.get(1))
                     .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
                     .duration(40 * SECONDS)
@@ -3534,11 +3526,11 @@ public class AssemblerRecipes implements Runnable {
 
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeHuge, MaterialsUEVplus.TranscendentMetal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.SuperconductorUIVBase, 64),
-                ALLOY.QUANTUM.getPlate(8),
+                GTOreDictUnificator.get(OrePrefixes.pipeHuge, MaterialsUEVplus.TranscendentMetal, 1),
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.SuperconductorUIVBase, 64),
+                MaterialsAlloy.QUANTUM.getPlate(8),
                 ItemList.Electric_Pump_UIV.get(1))
             .fluidInputs(MaterialsUEVplus.PhononMedium.getFluid(100))
             .itemOutputs(ItemList.Thermal_Superconductor.get(1))
@@ -3546,12 +3538,12 @@ public class AssemblerRecipes implements Runnable {
             .eut(TierEU.RECIPE_UIV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Thermal_Superconductor.get(2),
-                ALLOY.QUANTUM.getPlate(12),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.SuperconductorUIVBase, 8),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, MaterialsUEVplus.SixPhasedCopper, 3),
+                MaterialsAlloy.QUANTUM.getPlate(12),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.SuperconductorUIVBase, 8),
+                GTOreDictUnificator.get(OrePrefixes.rotor, MaterialsUEVplus.SixPhasedCopper, 3),
                 ItemList.Field_Generator_UEV.get(1))
             .fluidInputs(MaterialsUEVplus.PhononMedium.getFluid(500))
             .itemOutputs(ItemList.Relativistic_Heat_Capacitor.get(1))
@@ -3566,44 +3558,44 @@ public class AssemblerRecipes implements Runnable {
     public void loadInputBusesRecipes() {
         // ULV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
                 .duration(24 * SECONDS)
@@ -3613,32 +3605,32 @@ public class AssemblerRecipes implements Runnable {
 
         // LV input bus
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
                 .duration(24 * SECONDS)
@@ -3648,33 +3640,33 @@ public class AssemblerRecipes implements Runnable {
 
         // MV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 3),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_MV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 3),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_MV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 3),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_MV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
@@ -3684,33 +3676,33 @@ public class AssemblerRecipes implements Runnable {
 
         // HV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 0),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_HV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 0),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_HV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 0),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_HV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
                 .duration(24 * SECONDS)
@@ -3720,22 +3712,22 @@ public class AssemblerRecipes implements Runnable {
 
         // EV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_EV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_EV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_EV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
@@ -3745,22 +3737,22 @@ public class AssemblerRecipes implements Runnable {
 
         // IV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_IV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_IV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_IV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
@@ -3770,22 +3762,22 @@ public class AssemblerRecipes implements Runnable {
 
         // LuV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 2),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_LuV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LuV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 2),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_LuV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
@@ -3795,11 +3787,11 @@ public class AssemblerRecipes implements Runnable {
 
         // ZPM input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ZPM.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 2, 5),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_ZPM.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
@@ -3809,11 +3801,11 @@ public class AssemblerRecipes implements Runnable {
 
         // UV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_UV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 2, 6),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_UV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
@@ -3823,11 +3815,11 @@ public class AssemblerRecipes implements Runnable {
 
         // UHV input bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MAX.get(1),
                     getModItem(AvaritiaAddons.ID, "CompressedChest", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_Bus_MAX.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
@@ -3852,44 +3844,44 @@ public class AssemblerRecipes implements Runnable {
 
         // ULV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
                     getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
                 .duration(24 * SECONDS)
@@ -3899,32 +3891,32 @@ public class AssemblerRecipes implements Runnable {
 
         // LV output bus
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
                 .duration(24 * SECONDS)
@@ -3938,33 +3930,33 @@ public class AssemblerRecipes implements Runnable {
 
         // MV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 3),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_MV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 3),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_MV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 3),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_MV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
@@ -3974,33 +3966,33 @@ public class AssemblerRecipes implements Runnable {
 
         // HV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 0),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_HV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 0),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_HV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 0),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_HV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
                 .duration(24 * SECONDS)
@@ -4010,22 +4002,22 @@ public class AssemblerRecipes implements Runnable {
 
         // EV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 4),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_EV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_EV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 4),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_EV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
@@ -4035,22 +4027,22 @@ public class AssemblerRecipes implements Runnable {
 
         // IV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_IV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_IV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_IV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4060,22 +4052,22 @@ public class AssemblerRecipes implements Runnable {
 
         // LuV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 2),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_LuV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LuV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 1, 2),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_LuV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4085,11 +4077,11 @@ public class AssemblerRecipes implements Runnable {
 
         // ZPM output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ZPM.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 2, 5),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_ZPM.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4099,11 +4091,11 @@ public class AssemblerRecipes implements Runnable {
 
         // UV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_UV.get(1),
                     getModItem(IronChests.ID, "BlockIronChest", 2, 6),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_UV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4117,11 +4109,11 @@ public class AssemblerRecipes implements Runnable {
 
         // UHV output bus
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MAX.get(1),
                     getModItem(AvaritiaAddons.ID, "CompressedChest", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_Bus_MAX.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4136,44 +4128,44 @@ public class AssemblerRecipes implements Runnable {
     public void loadInputHatchesRecipes() {
         // ULV input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
                 .duration(24 * SECONDS)
@@ -4192,44 +4184,44 @@ public class AssemblerRecipes implements Runnable {
 
         // LV input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_LV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_LV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_LV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_LV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
                 .duration(24 * SECONDS)
@@ -4243,33 +4235,33 @@ public class AssemblerRecipes implements Runnable {
 
         // MV input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronTanks.ID, "copperTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_MV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronTanks.ID, "copperTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_MV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronTanks.ID, "copperTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_MV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
@@ -4279,33 +4271,33 @@ public class AssemblerRecipes implements Runnable {
 
         // HV input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronTanks.ID, "ironTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_HV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronTanks.ID, "ironTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_HV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronTanks.ID, "ironTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_HV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
                 .duration(24 * SECONDS)
@@ -4315,22 +4307,22 @@ public class AssemblerRecipes implements Runnable {
 
         // EV input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronTanks.ID, "silverTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_EV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_EV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronTanks.ID, "silverTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_EV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
@@ -4340,22 +4332,22 @@ public class AssemblerRecipes implements Runnable {
 
         // IV input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronTanks.ID, "goldTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_IV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_IV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronTanks.ID, "goldTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_IV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4365,22 +4357,22 @@ public class AssemblerRecipes implements Runnable {
 
         // LuV input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronTanks.ID, "diamondTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_LuV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LuV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronTanks.ID, "diamondTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_LuV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4390,11 +4382,11 @@ public class AssemblerRecipes implements Runnable {
 
         // ZPM input hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ZPM.get(1),
                     getModItem(IronTanks.ID, "obsidianTank", 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_ZPM.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4404,8 +4396,8 @@ public class AssemblerRecipes implements Runnable {
 
         // UV input hatch
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_UV.get(1), ItemList.Super_Tank_LV.get(1), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_UV.get(1), ItemList.Super_Tank_LV.get(1), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_UV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4415,8 +4407,8 @@ public class AssemblerRecipes implements Runnable {
 
         // UHV input hatch
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_MAX.get(1), ItemList.Super_Tank_MV.get(1), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_MAX.get(1), ItemList.Super_Tank_MV.get(1), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Hatch_Input_UHV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4431,44 +4423,44 @@ public class AssemblerRecipes implements Runnable {
     public void loadOutputHatchesRecipes() {
         // ULV output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_ULV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ULV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
                 .duration(24 * SECONDS)
@@ -4487,44 +4479,44 @@ public class AssemblerRecipes implements Runnable {
 
         // LV output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_LV.get(1))
                 .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_LV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_LV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LV.get(1),
                     getModItem(BuildCraftFactory.ID, "tankBlock", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_LV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
                 .duration(24 * SECONDS)
@@ -4538,33 +4530,33 @@ public class AssemblerRecipes implements Runnable {
 
         // MV output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronTanks.ID, "copperTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_MV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronTanks.ID, "copperTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_MV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_MV.get(1),
                     getModItem(IronTanks.ID, "copperTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_MV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
                 .duration(24 * SECONDS)
@@ -4574,33 +4566,33 @@ public class AssemblerRecipes implements Runnable {
 
         // HV output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronTanks.ID, "ironTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_HV.get(1))
                 .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronTanks.ID, "ironTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_HV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_HV.get(1),
                     getModItem(IronTanks.ID, "ironTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_HV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
                 .duration(24 * SECONDS)
@@ -4610,22 +4602,22 @@ public class AssemblerRecipes implements Runnable {
 
         // EV output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronTanks.ID, "silverTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_EV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_EV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_EV.get(1),
                     getModItem(IronTanks.ID, "silverTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_EV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
                 .duration(24 * SECONDS)
@@ -4635,22 +4627,22 @@ public class AssemblerRecipes implements Runnable {
 
         // IV output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronTanks.ID, "goldTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_IV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_IV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_IV.get(1),
                     getModItem(IronTanks.ID, "goldTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_IV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4660,22 +4652,22 @@ public class AssemblerRecipes implements Runnable {
 
         // LuV output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronTanks.ID, "diamondTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_LuV.get(1))
                 .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
                 .eut(TierEU.RECIPE_LuV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
                     getModItem(IronTanks.ID, "diamondTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_LuV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4685,11 +4677,11 @@ public class AssemblerRecipes implements Runnable {
 
         // ZPM output hatch
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Hull_ZPM.get(1),
                     getModItem(IronTanks.ID, "obsidianTank", 1),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_ZPM.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4699,8 +4691,8 @@ public class AssemblerRecipes implements Runnable {
 
         // UV output hatch
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_UV.get(1), ItemList.Super_Tank_LV.get(1), GT_Utility.getIntegratedCircuit(2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_UV.get(1), ItemList.Super_Tank_LV.get(1), GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_UV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4710,8 +4702,8 @@ public class AssemblerRecipes implements Runnable {
 
         // UHV output hatch
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(ItemList.Hull_MAX.get(1), ItemList.Super_Tank_MV.get(1), GT_Utility.getIntegratedCircuit(2))
+            GTValues.RA.stdBuilder()
+                .itemInputs(ItemList.Hull_MAX.get(1), ItemList.Super_Tank_MV.get(1), GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(ItemList.Hatch_Output_UHV.get(1))
                 .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
                 .duration(24 * SECONDS)
@@ -4726,267 +4718,267 @@ public class AssemblerRecipes implements Runnable {
     private void withRailcraft() {
         if (!Railcraft.isModLoaded()) return;
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.stone_slab, 1, 0),
                 ItemList.RC_Rebar.get(1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Tie_Stone.get(1))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.stone_slab, 1, 7),
                 ItemList.RC_Rebar.get(1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Tie_Stone.get(1))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.RC_Rail_HS.get(16))
             .fluidInputs(Materials.Blaze.getMolten(216))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(9))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(9))
             .itemOutputs(ItemList.RC_Rail_HS.get(8))
             .fluidInputs(Materials.ConductiveIron.getMolten(432))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(9))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(9))
             .itemOutputs(ItemList.RC_Rail_HS.get(32))
             .fluidInputs(Materials.VibrantAlloy.getMolten(216))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(9))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(9))
             .itemOutputs(ItemList.RC_Rail_HS.get(64))
             .fluidInputs(Materials.CrystallineAlloy.getMolten(216))
             .duration(5 * SECONDS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.RC_Rail_Adv.get(8))
             .fluidInputs(Materials.Redstone.getMolten(216))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.RC_Rail_Adv.get(16))
             .fluidInputs(Materials.RedAlloy.getMolten(216))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.RC_Rail_Adv.get(32))
             .fluidInputs(Materials.ConductiveIron.getMolten(216))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(3),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
-                GT_Utility.getIntegratedCircuit(8))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+                GTUtility.getIntegratedCircuit(8))
             .itemOutputs(ItemList.RC_Rail_Adv.get(64))
             .fluidInputs(Materials.VibrantAlloy.getMolten(216))
             .duration(5 * SECONDS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Copper, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Copper, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.AnnealedCopper, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.AnnealedCopper, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(2))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(4))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(8))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.TungstenSteel, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.TungstenSteel, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(16))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.HSSG, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.HSSG, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(32))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(64)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Rail_Standard.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Naquadah, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Naquadah, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.RC_Rail_Electric.get(64))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(96)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Tie_Wood.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Wooden.get(8))
             .duration(6 * SECONDS + 13 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Tie_Wood.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Wooden.get(8))
             .duration(6 * SECONDS + 13 * TICKS)
             .eut(4)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Tie_Wood.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 1),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 1),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Wooden.get(16))
             .duration(6 * SECONDS + 13 * TICKS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Tie_Wood.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 1),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 1),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Wooden.get(32))
             .duration(6 * SECONDS + 13 * TICKS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Tie_Wood.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 1),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 1),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Wooden.get(64))
             .duration(6 * SECONDS + 13 * TICKS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.RC_Tie_Wood.get(32), GT_Utility.getIntegratedCircuit(20))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.RC_Tie_Wood.get(32), GTUtility.getIntegratedCircuit(20))
             .itemOutputs(ItemList.RC_Bed_Wood.get(24))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.RC_Tie_Wood.get(64), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.RC_Tie_Wood.get(64), GTUtility.getIntegratedCircuit(24))
             .itemOutputs(ItemList.RC_Bed_Wood.get(48))
             .duration(10 * SECONDS)
             .eut(48)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.RC_Tie_Stone.get(32), GT_Utility.getIntegratedCircuit(20))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.RC_Tie_Stone.get(32), GTUtility.getIntegratedCircuit(20))
             .itemOutputs(ItemList.RC_Bed_Stone.get(24))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.RC_Tie_Stone.get(64), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.RC_Tie_Stone.get(64), GTUtility.getIntegratedCircuit(24))
             .itemOutputs(ItemList.RC_Bed_Stone.get(48))
             .duration(10 * SECONDS)
             .eut(48)
@@ -5003,42 +4995,42 @@ public class AssemblerRecipes implements Runnable {
             tTagWoodB.setString("track", "railcraft:track.slow.boost");
             tRailWoodB.stackTagCompound = tTagWoodB;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.RC_Bed_Wood.get(1),
                     ItemList.RC_Rail_Wooden.get(6),
-                    GT_Utility.getIntegratedCircuit(21))
+                    GTUtility.getIntegratedCircuit(21))
                 .itemOutputs(tRailWood)
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                    GT_Utility.getIntegratedCircuit(22))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                    GTUtility.getIntegratedCircuit(22))
                 .itemOutputs(tRailWoodB)
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
         }
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.rail, 1, 0),
                 ItemList.RC_Rail_Adv.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                GT_Utility.getIntegratedCircuit(22))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(new ItemStack(Blocks.golden_rail, 16, 0))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Bed_Wood.get(1),
                 ItemList.RC_Rail_Standard.get(6),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(new ItemStack(Blocks.rail, 64, 0))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -5049,11 +5041,11 @@ public class AssemblerRecipes implements Runnable {
         tTagRe.setString("track", "railcraft:track.reinforced");
         tRailRe.stackTagCompound = tTagRe;
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Bed_Stone.get(1),
                 ItemList.RC_Rail_Reinforced.get(6),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(tRailRe)
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -5064,11 +5056,11 @@ public class AssemblerRecipes implements Runnable {
         tTagReB.setString("track", "railcraft:track.reinforced.boost");
         tRailReB.stackTagCompound = tTagReB;
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.copyAmount(2, tRailRe),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.copyAmount(2, tRailRe),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(tRailReB)
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -5079,11 +5071,11 @@ public class AssemblerRecipes implements Runnable {
         tTagEl.setString("track", "railcraft:track.electric");
         tRailEl.stackTagCompound = tTagEl;
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.RC_Bed_Stone.get(1),
                 ItemList.RC_Rail_Electric.get(6),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(tRailEl)
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -5095,11 +5087,11 @@ public class AssemblerRecipes implements Runnable {
             tTagHs.setString("track", "railcraft:track.speed");
             tRailHs.stackTagCompound = tTagHs;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.RC_Bed_Stone.get(1),
                     ItemList.RC_Rail_HS.get(6),
-                    GT_Utility.getIntegratedCircuit(21))
+                    GTUtility.getIntegratedCircuit(21))
                 .itemOutputs(tRailHs)
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
@@ -5110,11 +5102,11 @@ public class AssemblerRecipes implements Runnable {
         tTagHsB.setString("track", "railcraft:track.speed.boost");
         tRailHsB.stackTagCompound = tTagHsB;
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.copyAmount(2, tRailHs),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.copyAmount(2, tRailHs),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(tRailHsB)
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -5127,72 +5119,72 @@ public class AssemblerRecipes implements Runnable {
             tTagSS.setString("track", "railcraft:track.slow.switch");
             tRailSS.stackTagCompound = tTagSS;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.AnyIron, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.AnyIron, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailSS)
                 .duration(5 * SECONDS)
                 .eut(8)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailSS))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailSS))
                 .duration(5 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailSS))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailSS))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailSS))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailSS))
                 .duration(5 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailSS))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailSS))
                 .duration(5 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailSS))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailSS))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailSS))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailSS))
                 .duration(5 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
@@ -5204,72 +5196,72 @@ public class AssemblerRecipes implements Runnable {
             tTagSW.setString("track", "railcraft:track.slow.wye");
             tRailSW.stackTagCompound = tTagSW;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.AnyIron, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.AnyIron, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailSW)
                 .duration(5 * SECONDS)
                 .eut(8)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailSW))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailSW))
                 .duration(5 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailSW))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailSW))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailSW))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailSW))
                 .duration(5 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailSW))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailSW))
                 .duration(5 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailSW))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailSW))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailSW))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailSW))
                 .duration(5 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
@@ -5281,72 +5273,72 @@ public class AssemblerRecipes implements Runnable {
             tTagSJ.setString("track", "railcraft:track.slow.junction");
             tRailSJ.stackTagCompound = tTagSJ;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.AnyIron, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.AnyIron, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailSJ)
                 .duration(5 * SECONDS)
                 .eut(8)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailSJ))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailSJ))
                 .duration(5 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailSJ))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailSJ))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailSJ))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailSJ))
                 .duration(5 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailSJ))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailSJ))
                 .duration(5 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailSJ))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailSJ))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailWood),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailSJ))
+                    GTUtility.copyAmount(2, tRailWood),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailSJ))
                 .duration(5 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
@@ -5358,72 +5350,72 @@ public class AssemblerRecipes implements Runnable {
             tTagNS.setString("track", "railcraft:track.switch");
             tRailNS.stackTagCompound = tTagNS;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailNS)
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailNS))
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailNS))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailNS))
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailNS))
                 .duration(10 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailNS))
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailNS))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailNS))
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailNS))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailNS))
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailNS))
                 .duration(10 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailNS))
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailNS))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5436,72 +5428,72 @@ public class AssemblerRecipes implements Runnable {
             tTagNW.setString("track", "railcraft:track.wye");
             tRailNW.stackTagCompound = tTagNW;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailNW)
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailNW))
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailNW))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailNW))
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailNW))
                 .duration(10 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailNW))
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailNW))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailNW))
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailNW))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailNW))
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailNW))
                 .duration(10 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailNW))
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailNW))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5513,72 +5505,72 @@ public class AssemblerRecipes implements Runnable {
             tTagNJ.setString("track", "railcraft:track.junction");
             tRailNJ.stackTagCompound = tTagNJ;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailNJ)
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailNJ))
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailNJ))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailNJ))
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailNJ))
                 .duration(10 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailNJ))
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailNJ))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailNJ))
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailNJ))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailNJ))
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailNJ))
                 .duration(10 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Blocks.rail, 2, 0),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailNJ))
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailNJ))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5590,72 +5582,72 @@ public class AssemblerRecipes implements Runnable {
             tTagRS.setString("track", "railcraft:track.reinforced.switch");
             tRailRS.stackTagCompound = tTagRS;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailRS)
                 .duration(15 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailRS))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailRS))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailRS))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailRS))
                 .duration(15 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailRS))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailRS))
                 .duration(15 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailRS))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailRS))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailRS))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailRS))
                 .duration(15 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailRS))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailRS))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5667,72 +5659,72 @@ public class AssemblerRecipes implements Runnable {
             tTagRW.setString("track", "railcraft:track.reinforced.wye");
             tRailRW.stackTagCompound = tTagRW;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailRW)
                 .duration(15 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailRW))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailRW))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailRW))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailRW))
                 .duration(15 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailRW))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailRW))
                 .duration(15 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailRW))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailRW))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailRW))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailRW))
                 .duration(15 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailRW))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailRW))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5744,72 +5736,72 @@ public class AssemblerRecipes implements Runnable {
             tTagRJ.setString("track", "railcraft:track.reinforced.junction");
             tRailRJ.stackTagCompound = tTagRJ;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailRJ)
                 .duration(15 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailRJ))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailRJ))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailRJ))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailRJ))
                 .duration(15 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailRJ))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailRJ))
                 .duration(15 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailRJ))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailRJ))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailRJ))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailRJ))
                 .duration(15 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailRe),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailRJ))
+                    GTUtility.copyAmount(2, tRailRe),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailRJ))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5821,72 +5813,72 @@ public class AssemblerRecipes implements Runnable {
             tTagRSSw.setString("track", "railcraft:track.speed.switch");
             tRailSSw.stackTagCompound = tTagRSSw;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailSSw)
                 .duration(20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailSSw))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailSSw))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailSSw))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailSSw))
                 .duration(20 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailSSw))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailSSw))
                 .duration(20 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailSSw))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailSSw))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailSSw))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailSSw))
                 .duration(20 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailSSw))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailSSw))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5898,72 +5890,72 @@ public class AssemblerRecipes implements Runnable {
             tTagRSWy.setString("track", "railcraft:track.speed.wye");
             tRailSWy.stackTagCompound = tTagRSWy;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailSWy)
                 .duration(20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailSWy))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailSWy))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailSWy))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailSWy))
                 .duration(20 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailSWy))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailSWy))
                 .duration(20 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailSWy))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailSWy))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailSWy))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailSWy))
                 .duration(20 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailSWy))
+                    GTUtility.copyAmount(2, tRailHs),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailSWy))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -5975,57 +5967,57 @@ public class AssemblerRecipes implements Runnable {
             tTagRSTt.setString("track", "railcraft:track.speed.transition");
             tRailSTt.stackTagCompound = tTagRSTt;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
+                    GTUtility.copyAmount(2, tRailHs),
                     ItemList.RC_Bed_Stone.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailSTt))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailSTt))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
+                    GTUtility.copyAmount(2, tRailHs),
                     ItemList.RC_Bed_Stone.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.ConductiveIron, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailSTt))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.ConductiveIron, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailSTt))
                 .duration(20 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
+                    GTUtility.copyAmount(2, tRailHs),
                     ItemList.RC_Bed_Stone.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.VibrantAlloy, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailSTt))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.VibrantAlloy, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailSTt))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
+                    GTUtility.copyAmount(2, tRailHs),
                     ItemList.RC_Bed_Stone.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CrystallineAlloy, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailSTt))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.CrystallineAlloy, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailSTt))
                 .duration(20 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailHs),
+                    GTUtility.copyAmount(2, tRailHs),
                     ItemList.RC_Bed_Stone.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.MelodicAlloy, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailSTt))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.MelodicAlloy, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailSTt))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -6037,72 +6029,72 @@ public class AssemblerRecipes implements Runnable {
             tTagES.setString("track", "railcraft:track.electric.switch");
             tRailES.stackTagCompound = tTagES;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Copper, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Copper, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailES)
                 .duration(20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Gold, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailES))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Gold, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailES))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Electrum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailES))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Electrum, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailES))
                 .duration(20 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailES))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailES))
                 .duration(20 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Platinum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailES))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Platinum, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailES))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.VanadiumGallium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailES))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.VanadiumGallium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailES))
                 .duration(20 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Naquadah, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailES))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.springSmall, Materials.Naquadah, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailES))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -6114,72 +6106,72 @@ public class AssemblerRecipes implements Runnable {
             tTagEw.setString("track", "railcraft:track.electric.wye");
             tRailEw.stackTagCompound = tTagEw;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Copper, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Copper, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailEw)
                 .duration(20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Gold, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailEw))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Gold, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailEw))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Electrum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailEw))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Electrum, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailEw))
                 .duration(20 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailEw))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailEw))
                 .duration(20 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Platinum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailEw))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Platinum, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailEw))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.VanadiumGallium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailEw))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.VanadiumGallium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailEw))
                 .duration(20 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Naquadah, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailEw))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Naquadah, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailEw))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -6191,72 +6183,72 @@ public class AssemblerRecipes implements Runnable {
             tTagREJ.setString("track", "railcraft:track.electric.junction");
             tRailEJ.stackTagCompound = tTagREJ;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Copper, 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Copper, 4),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(tRailEJ)
                 .duration(20 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Gold, 2),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(2, tRailEJ))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Gold, 2),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(2, tRailEJ))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(4, tRailEJ))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(4, tRailEJ))
                 .duration(20 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(8, tRailEJ))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(8, tRailEJ))
                 .duration(20 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Platinum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(16, tRailEJ))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Platinum, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(16, tRailEJ))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.VanadiumGallium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(32, tRailEJ))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.VanadiumGallium, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(32, tRailEJ))
                 .duration(20 * SECONDS)
                 .eut(256)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_Utility.copyAmount(2, tRailEl),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Naquadah, 1),
-                    GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_Utility.copyAmount(64, tRailEJ))
+                    GTUtility.copyAmount(2, tRailEl),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Naquadah, 1),
+                    GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTUtility.copyAmount(64, tRailEJ))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(assemblerRecipes);
@@ -6266,77 +6258,77 @@ public class AssemblerRecipes implements Runnable {
             int tMultiplier = tMat.contains(SubTag.SOLDERING_MATERIAL_GOOD) ? 1
                 : tMat.contains(SubTag.SOLDERING_MATERIAL_BAD) ? 4 : 2;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Copper, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Copper, 1),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.RC_ShuntingWire.get(1))
                 .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.AnnealedCopper, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.AnnealedCopper, 1),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.RC_ShuntingWire.get(1))
                 .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.RC_ShuntingWire.get(4))
                 .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut(24)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.RC_ShuntingWire.get(8))
                 .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.RC_ShuntingWire.get(16))
                 .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut(48)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Platinum, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Platinum, 1),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.RC_ShuntingWire.get(32))
                 .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(assemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.VanadiumGallium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Platinum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.VanadiumGallium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Platinum, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.RC_ShuntingWire.get(64))
                 .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
                 .duration(10 * SECONDS)
@@ -6345,13 +6337,13 @@ public class AssemblerRecipes implements Runnable {
 
             // chunkloader upgrade OC
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Plastic_Advanced.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Aluminium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.itemCasing, Materials.Aluminium, 2),
                     getModItem(Railcraft.ID, "machine.alpha", 1L, 0),
                     getModItem(OpenComputers.ID, "item", 1L, 26),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(OpenComputers.ID, "item", 1L, 62))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
                 .duration(12 * SECONDS + 10 * TICKS)
@@ -6360,467 +6352,467 @@ public class AssemblerRecipes implements Runnable {
 
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.piston, 1, 0),
                 ItemList.FR_Casing_Sturdy.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Lapis, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Lapis, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1L, 0))
             .fluidInputs(Materials.SeedOil.getFluid(250))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.piston, 1, 0),
                 ItemList.FR_Casing_Sturdy.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Lapis, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Lapis, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1L, 0))
             .fluidInputs(Materials.Lubricant.getFluid(125))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(ExtraUtilities.ID, "trashcan", 1L, 0),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Obsidian, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Obsidian, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 11))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyCopper, 10),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.AnyCopper, 10),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 7))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 10),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 10),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 8))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 10),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 10),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 9))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Gold, 2),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 4),
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1),
-                GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Obsidian, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Gold, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 4),
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1),
+                GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Obsidian, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1, 0))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 1))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 1))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Bronze, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Bronze, 2),
                 new ItemStack(Blocks.iron_bars, 2, 0),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
             .duration(10 * SECONDS)
             .eut(64)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 14))
             .duration(20 * SECONDS)
             .eut(64)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 14))
             .duration(20 * SECONDS)
             .eut(64)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.SteelBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
             .duration(20 * SECONDS)
             .eut(64)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 1))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 1))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Plastic, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Plastic, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.AluminiumBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
             .duration(10 * SECONDS)
             .eut(256)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 4))
             .duration(20 * SECONDS)
             .eut(256)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 4))
             .duration(20 * SECONDS)
             .eut(256)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.StainlessSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.StainlessSteel, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.StainlessSteelBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
             .duration(20 * SECONDS)
             .eut(256)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 7))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 7))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Titanium, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Titanium, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.TitaniumBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 10))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 10))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.TungstenSteelBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 13))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 13))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NiobiumTitanium, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NiobiumTitanium, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.ChromeBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
             .duration(10 * SECONDS)
             .eut(4096)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 1))
             .duration(20 * SECONDS)
             .eut(4096)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 1))
             .duration(20 * SECONDS)
             .eut(4096)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Enderium, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Enderium, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.IridiumBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
             .duration(20 * SECONDS)
             .eut(4096)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 4))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 4))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.OsmiumBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
-                GT_Utility.getIntegratedCircuit(20))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+                GTUtility.getIntegratedCircuit(20))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
                 new ItemStack(Blocks.glass_pane, 2, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 7))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
                 getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
-                GT_Utility.getIntegratedCircuit(21))
+                GTUtility.getIntegratedCircuit(21))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 7))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Neutronium, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Neutronium, 2),
                 getModItem(NewHorizonsCoreMod.ID, "item.NeutroniumBars", 2),
-                GT_Utility.getIntegratedCircuit(22))
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
@@ -6828,60 +6820,60 @@ public class AssemblerRecipes implements Runnable {
 
         // Water Tank
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
             .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1L, 14))
             .fluidInputs(Materials.Glue.getFluid(36))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
             .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1L, 14))
             .fluidInputs(Materials.Glue.getFluid(36))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
             .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1L, 14))
             .fluidInputs(Materials.Glue.getFluid(36))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Steel, 4),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 4))
+                GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Steel, 4),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 4))
             .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 3L, 14))
             .fluidInputs(Materials.Glue.getFluid(72))
             .duration(20 * SECONDS)
             .eut(30)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Steel, 2),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.WoodSealed, 1))
+                GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Steel, 2),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.WoodSealed, 1))
             .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 3L, 14))
             .fluidInputs(Materials.Plastic.getMolten(36))
             .duration(20 * SECONDS)
             .eut(30)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.StainlessSteel, 4),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.WoodSealed, 4))
+                GTOreDictUnificator.get(OrePrefixes.bolt, Materials.StainlessSteel, 4),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.WoodSealed, 4))
             .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 9L, 14))
             .fluidInputs(Materials.Plastic.getMolten(72))
             .duration(20 * SECONDS)
@@ -6890,15 +6882,15 @@ public class AssemblerRecipes implements Runnable {
 
         // Steam Boilers
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.IC2_Item_Casing_Iron.get(6), GT_Utility.getIntegratedCircuit(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.IC2_Item_Casing_Iron.get(6), GTUtility.getIntegratedCircuit(6))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 3))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.IC2_Item_Casing_Steel.get(6), GT_Utility.getIntegratedCircuit(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.IC2_Item_Casing_Steel.get(6), GTUtility.getIntegratedCircuit(6))
             .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 4))
             .duration(20 * SECONDS)
             .eut(64)
@@ -6907,10 +6899,10 @@ public class AssemblerRecipes implements Runnable {
 
     public void withBartWorks() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, ExternalMaterials.getRhodiumPlatedPalladium(), 6),
-                GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Chrome, 1))
+                GTOreDictUnificator.get(OrePrefixes.plate, ExternalMaterials.getRhodiumPlatedPalladium(), 6),
+                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Chrome, 1))
             .itemOutputs(ItemList.Casing_Advanced_Rhodium_Palladium.get(1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(16)
@@ -6923,34 +6915,34 @@ public class AssemblerRecipes implements Runnable {
             return;
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.compressed, Materials.Bronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.compressed, Materials.Aluminium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.compressed, Materials.Steel, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.compressed, Materials.Bronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.compressed, Materials.Aluminium, 1),
+                GTOreDictUnificator.get(OrePrefixes.compressed, Materials.Steel, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Ingot_Heavy1.get(1))
             .fluidInputs(Materials.StainlessSteel.getMolten(72))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(GalacticraftCore.ID, "item.heavyPlating", 1),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.MeteoricIron, 2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.MeteoricIron, 2),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Ingot_Heavy2.get(1))
             .fluidInputs(Materials.TungstenSteel.getMolten(72))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(GalacticraftMars.ID, "item.null", 1L, 3),
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Desh, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Desh, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Ingot_Heavy3.get(1))
             .fluidInputs(Materials.Platinum.getMolten(72))
             .duration(15 * SECONDS)
@@ -6963,124 +6955,124 @@ public class AssemblerRecipes implements Runnable {
             return;
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
                 ItemList.Electric_Pump_MV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 2000))
             .duration(16 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
                 ItemList.Electric_Pump_HV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 4000))
             .duration(16 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
                 ItemList.Electric_Pump_EV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 6000))
             .duration(16 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
                 ItemList.Electric_Pump_IV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 8000))
             .duration(32 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(
+                GTOreDictUnificator.get(
                     OrePrefixes.wireGt01,
                     Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
                     15),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
                 ItemList.Electric_Pump_LuV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 12000))
             .duration(32 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
                 ItemList.Electric_Pump_ZPM.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 16000))
             .duration(1 * MINUTES + 4 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
                 ItemList.Electric_Pump_UV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 20000))
             .duration(1 * MINUTES + 4 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
                 ItemList.Electric_Pump_UHV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 24000))
             .duration(2 * MINUTES + 8 * SECONDS)
             .eut(TierEU.RECIPE_UHV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEVBase, 27),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Infinity, 18),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEVBase, 27),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Infinity, 18),
                 ItemList.Electric_Pump_UEV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 27))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 27))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 28000))
             .duration(2 * MINUTES + 40 * SECONDS)
             .eut(TierEU.RECIPE_UEV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMVBase, 33),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.SpaceTime, 22),
+                GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMVBase, 33),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.SpaceTime, 22),
                 ItemList.Electric_Pump_UMV.get(1),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 33))
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 33))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 36000))
             .duration(2 * MINUTES + 40 * SECONDS)
             .eut(TierEU.RECIPE_UMV)
@@ -7089,16 +7081,16 @@ public class AssemblerRecipes implements Runnable {
 
     public void withGTNHLanthAndGTPP() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Electric_Pump_EV.get(4),
                 ItemList.Field_Generator_EV.get(4),
                 INCONEL_690.getPlate(4),
-                GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 16),
-                GT_OreDictUnificator.get(OrePrefixes.ring, Materials.BorosilicateGlass, 16),
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2),
-                GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Polytetrafluoroethylene, 4),
-                GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 4),
+                GTOreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 16),
+                GTOreDictUnificator.get(OrePrefixes.ring, Materials.BorosilicateGlass, 16),
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2),
+                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Polytetrafluoroethylene, 4),
+                GTOreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 4),
                 ItemList.Shape_Extruder_Wire.get(16))
             .itemOutputs(ItemList.Spinneret.get(1))
             .fluidInputs(Materials.SolderingAlloy.getMolten(144))
@@ -7112,125 +7104,123 @@ public class AssemblerRecipes implements Runnable {
             return;
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemVanillaMachineCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemInventoryScannerCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemEnergySensorLocationCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(IC2NuclearControl.ID, "RFSensorCard", 1L, 0), GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(IC2NuclearControl.ID, "RFSensorCard", 1L, 0), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemMultipleSensorLocationCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 1))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
         // counter
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemMultipleSensorLocationCard", 1L, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 1))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
         // liquid
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemMultipleSensorLocationCard", 1L, 2),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
         // generator
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemLiquidArrayLocationCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
         // 2-6 liquid
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemEnergyArrayLocationCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
         // 2-6 energy
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(IC2NuclearControl.ID, "ItemSensorLocationCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
         // non-fluid nuke
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                getModItem(IC2NuclearControl.ID, "Item55ReactorCard", 1L, 0),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(IC2NuclearControl.ID, "Item55ReactorCard", 1L, 0), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.MV), 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(IC2NuclearControl.ID, "CardAppeng", 1L, 0), GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(IC2NuclearControl.ID, "CardAppeng", 1L, 0), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 2))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.NC_SensorCard.get(1), GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.NC_SensorCard.get(1), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("electronicCircuit", 3))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(assemblerRecipes);
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java
index 2b4e957d34..28630668c0 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java
@@ -1,28 +1,27 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
-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 static gregtech.api.util.GTRecipeBuilder.HOURS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeConstants.AssemblyLine;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GTRecipeConstants.RESEARCH_TIME;
 
 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.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
 import gregtech.api.util.ExternalMaterials;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import tectech.thing.CustomItemList;
 
 public class AssemblyLineRecipes implements Runnable {
 
@@ -52,15 +51,15 @@ public class AssemblyLineRecipes implements Runnable {
         // Motors
         {
             // LuV motor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Motor_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.HSSS, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2))
+                    GTOreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+                    GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.HSSS, 2),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2))
                 .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
                 .itemOutputs(ItemList.Electric_Motor_LuV.get(1))
                 .eut(TierEU.RECIPE_IV)
@@ -68,18 +67,18 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM motor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Motor_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahAlloy, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 16),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2))
+                    GTOreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 2),
+                    GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahAlloy, 4),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 16),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2))
                 .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
                 .itemOutputs(ItemList.Electric_Motor_ZPM.get(1))
                 .eut(TierEU.RECIPE_LuV)
@@ -87,21 +86,21 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV motor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Motor_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.SamariumMagnetic, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 16),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2))
+                    GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.SamariumMagnetic, 2),
+                    GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 16),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2))
                 .fluidInputs(
                     Materials.Naquadria.getMolten(1296),
                     new FluidStack(solderIndalloy, 1296),
@@ -115,17 +114,17 @@ public class AssemblyLineRecipes implements Runnable {
         // Pumps
         {
             // LuV Pump
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Pump_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_LuV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.NiobiumTitanium, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.HSSS, 8),
+                    GTOreDictUnificator.get(OrePrefixes.pipeSmall, Materials.NiobiumTitanium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.HSSS, 8),
                     new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.HSSS, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2))
+                    GTOreDictUnificator.get(OrePrefixes.rotor, Materials.HSSS, 2),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2))
                 .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
                 .itemOutputs(ItemList.Electric_Pump_LuV.get(1))
                 .eut(TierEU.RECIPE_IV)
@@ -133,17 +132,17 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Pump
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Pump_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_ZPM.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Enderium, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.NaquadahAlloy, 8),
+                    GTOreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Enderium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.NaquadahAlloy, 8),
                     new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 8 },
-                    GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.NaquadahAlloy, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2))
+                    GTOreDictUnificator.get(OrePrefixes.rotor, Materials.NaquadahAlloy, 2),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2))
                 .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
                 .itemOutputs(ItemList.Electric_Pump_ZPM.get(1))
                 .eut(TierEU.RECIPE_LuV)
@@ -151,17 +150,17 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Pump
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Pump_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_UV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 8),
+                    GTOreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 2),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 8),
                     new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 16 },
-                    GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Neutronium, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2))
+                    GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Neutronium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2))
                 .itemOutputs(ItemList.Electric_Pump_UV.get(1))
                 .fluidInputs(
                     Materials.Naquadria.getMolten(1296),
@@ -175,15 +174,15 @@ public class AssemblyLineRecipes implements Runnable {
         // Conveyors
         {
             // LuV Conveyor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Conveyor_Module_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_LuV.get(2),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.HSSS, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.HSSS, 32),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 2),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.HSSS, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.HSSS, 32),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2),
                     new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 10 })
                 .itemOutputs(ItemList.Conveyor_Module_LuV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
@@ -192,15 +191,15 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Conveyor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Conveyor_Module_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_ZPM.get(2),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 32),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 2),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 32),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2),
                     new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 20 })
                 .itemOutputs(ItemList.Conveyor_Module_ZPM.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
@@ -209,15 +208,15 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Conveyor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Conveyor_Module_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_UV.get(2),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 32),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 32),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2),
                     new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 40 })
                 .itemOutputs(ItemList.Conveyor_Module_UV.get(1))
                 .fluidInputs(
@@ -232,18 +231,18 @@ public class AssemblyLineRecipes implements Runnable {
         // Pistons
         {
             // LuV Piston
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Piston_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_LuV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.HSSS, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.HSSS, 32),
-                    GT_OreDictUnificator.get(OrePrefixes.stick, Materials.HSSS, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.gear, Materials.HSSS, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.HSSS, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 4))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.HSSS, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.HSSS, 32),
+                    GTOreDictUnificator.get(OrePrefixes.stick, Materials.HSSS, 4),
+                    GTOreDictUnificator.get(OrePrefixes.gear, Materials.HSSS, 1),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.HSSS, 2),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 4))
                 .itemOutputs(ItemList.Electric_Piston_LuV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
                 .duration(30 * SECONDS)
@@ -251,18 +250,18 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Pistons
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Piston_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_ZPM.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 6),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 32),
-                    GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahAlloy, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.gear, Materials.NaquadahAlloy, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.NaquadahAlloy, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 4))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 6),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 32),
+                    GTOreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahAlloy, 4),
+                    GTOreDictUnificator.get(OrePrefixes.gear, Materials.NaquadahAlloy, 1),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.NaquadahAlloy, 2),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 4))
                 .itemOutputs(ItemList.Electric_Piston_ZPM.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
                 .duration(30 * SECONDS)
@@ -270,18 +269,18 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Piston
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Electric_Piston_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
                     ItemList.Electric_Motor_UV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
-                    GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 32),
-                    GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Neutronium, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Neutronium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 4))
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
+                    GTOreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 32),
+                    GTOreDictUnificator.get(OrePrefixes.stick, Materials.Neutronium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.gear, Materials.Neutronium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 4))
                 .itemOutputs(ItemList.Electric_Piston_UV.get(1))
                 .fluidInputs(
                     Materials.Naquadria.getMolten(1296),
@@ -295,19 +294,19 @@ public class AssemblyLineRecipes implements Runnable {
         // RobotArms
         {
             // LuV Robot Arm
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Robot_Arm_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.HSSS, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.gear, Materials.HSSS, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.HSSS, 3),
+                    GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.HSSS, 4),
+                    GTOreDictUnificator.get(OrePrefixes.gear, Materials.HSSS, 1),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.HSSS, 3),
                     ItemList.Electric_Motor_LuV.get(2),
                     ItemList.Electric_Piston_LuV.get(1),
                     new Object[] { OrePrefixes.circuit.get(Materials.LuV), 2 },
                     new Object[] { OrePrefixes.circuit.get(Materials.IV), 4 },
                     new Object[] { OrePrefixes.circuit.get(Materials.EV), 8 },
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 6))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 6))
                 .itemOutputs(ItemList.Robot_Arm_LuV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 576), Materials.Lubricant.getFluid(250))
                 .duration(30 * SECONDS)
@@ -315,19 +314,19 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Robot Arm
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Robot_Arm_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahAlloy, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.gear, Materials.NaquadahAlloy, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.NaquadahAlloy, 3),
+                    GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahAlloy, 4),
+                    GTOreDictUnificator.get(OrePrefixes.gear, Materials.NaquadahAlloy, 1),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.NaquadahAlloy, 3),
                     ItemList.Electric_Motor_ZPM.get(2),
                     ItemList.Electric_Piston_ZPM.get(1),
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 2 },
                     new Object[] { OrePrefixes.circuit.get(Materials.LuV), 4 },
                     new Object[] { OrePrefixes.circuit.get(Materials.IV), 8 },
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 6))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 6))
                 .itemOutputs(ItemList.Robot_Arm_ZPM.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 1152), Materials.Lubricant.getFluid(750))
                 .duration(30 * SECONDS)
@@ -335,19 +334,19 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Robot Arm
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Robot_Arm_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Neutronium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 3),
+                    GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.gear, Materials.Neutronium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 3),
                     ItemList.Electric_Motor_UV.get(2),
                     ItemList.Electric_Piston_UV.get(1),
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 2 },
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 4 },
                     new Object[] { OrePrefixes.circuit.get(Materials.LuV), 8 },
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 6))
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 6))
                 .itemOutputs(ItemList.Robot_Arm_UV.get(1))
                 .fluidInputs(
                     Materials.Naquadria.getMolten(1296),
@@ -361,19 +360,19 @@ public class AssemblyLineRecipes implements Runnable {
         // Emitters
         {
             // LuV Emitter
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Emitter_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
                     ItemList.Electric_Motor_LuV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.stick, LuVMat, 8),
+                    GTOreDictUnificator.get(OrePrefixes.stick, LuVMat, 8),
                     ItemList.QuantumStar.get(1),
                     new Object[] { OrePrefixes.circuit.get(Materials.LuV), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 7))
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 7))
                 .itemOutputs(ItemList.Emitter_LuV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 576))
                 .duration(30 * SECONDS)
@@ -381,19 +380,19 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Emitter
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Emitter_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
                     ItemList.Electric_Motor_ZPM.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmiridium, 8),
+                    GTOreDictUnificator.get(OrePrefixes.stick, Materials.Osmiridium, 8),
                     ItemList.QuantumStar.get(2),
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 7))
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 7))
                 .itemOutputs(ItemList.Emitter_ZPM.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 1152))
                 .duration(30 * SECONDS)
@@ -401,19 +400,19 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Emitter
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Emitter_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
                     ItemList.Electric_Motor_UV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Neutronium, 8),
+                    GTOreDictUnificator.get(OrePrefixes.stick, Materials.Neutronium, 8),
                     ItemList.Gravistar.get(4),
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 7))
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 7))
                 .itemOutputs(ItemList.Emitter_UV.get(1))
                 .fluidInputs(Materials.Naquadria.getMolten(1296), new FluidStack(solderIndalloy, 2304))
                 .duration(30 * SECONDS)
@@ -424,19 +423,19 @@ public class AssemblyLineRecipes implements Runnable {
         // Sensors
         {
             // LuV Sensor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Sensor_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
                     ItemList.Electric_Motor_LuV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, LuVMat, 8),
+                    GTOreDictUnificator.get(OrePrefixes.plate, LuVMat, 8),
                     ItemList.QuantumStar.get(1),
                     new Object[] { OrePrefixes.circuit.get(Materials.LuV), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 7))
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 7))
                 .itemOutputs(ItemList.Sensor_LuV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 576))
                 .duration(30 * SECONDS)
@@ -444,19 +443,19 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Sensor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Sensor_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
                     ItemList.Electric_Motor_ZPM.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 8),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 8),
                     ItemList.QuantumStar.get(2),
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 7))
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 7))
                 .itemOutputs(ItemList.Sensor_ZPM.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 1152))
                 .duration(30 * SECONDS)
@@ -464,19 +463,19 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Sensor
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Sensor_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
                     ItemList.Electric_Motor_UV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8),
                     ItemList.Gravistar.get(4),
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 7))
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 7))
                 .itemOutputs(ItemList.Sensor_UV.get(1))
                 .fluidInputs(Materials.Naquadria.getMolten(1296), new FluidStack(solderIndalloy, 2304))
                 .duration(30 * SECONDS)
@@ -487,20 +486,20 @@ public class AssemblyLineRecipes implements Runnable {
         // Field Generators
         {
             // LuV Field Generator
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Field_Generator_IV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6),
                     ItemList.QuantumStar.get(2),
                     ItemList.Emitter_LuV.get(4),
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 8))
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 8))
                 .itemOutputs(ItemList.Field_Generator_LuV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 576))
                 .duration(30 * SECONDS)
@@ -508,20 +507,20 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Field Generator
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Field_Generator_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 6),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 6),
                     ItemList.QuantumStar.get(2),
                     ItemList.Emitter_ZPM.get(4),
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 8))
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 8))
                 .itemOutputs(ItemList.Field_Generator_ZPM.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 1152))
                 .duration(30 * SECONDS)
@@ -529,22 +528,22 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Field Generator
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Field_Generator_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
+                    GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
                     ItemList.Gravistar.get(2),
                     ItemList.Emitter_UV.get(4),
                     new Object[] { OrePrefixes.circuit.get(Materials.UHV), 4 },
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
-                    GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 8))
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+                    GTOreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 8))
                 .itemOutputs(ItemList.Field_Generator_UV.get(1))
                 .fluidInputs(Materials.Naquadria.getMolten(1296), new FluidStack(solderIndalloy, 2304))
                 .duration(30 * SECONDS)
@@ -555,12 +554,12 @@ public class AssemblyLineRecipes implements Runnable {
         // Energy Hatches
         {
             // LuV Energy Hatch
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Hatch_Energy_IV.get(1))
                 .metadata(RESEARCH_TIME, 60 * MINUTES)
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 2),
                     ItemList.Circuit_Chip_UHPIC.get(2),
                     new Object[] { OrePrefixes.circuit.get(Materials.LuV), 2 },
                     ItemList.LuV_Coil.get(2),
@@ -578,12 +577,12 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Energy Hatch
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Hatch_Energy_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Hull_ZPM.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 2),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 2),
                     ItemList.Circuit_Chip_NPIC.get(2),
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 2 },
                     ItemList.ZPM_Coil.get(2),
@@ -601,12 +600,12 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Energy Hatch
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Hatch_Energy_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
                     ItemList.Hull_UV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorUV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorUV, 2),
                     ItemList.Circuit_Chip_PPIC.get(2),
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 2 },
                     ItemList.UV_Coil.get(2),
@@ -631,12 +630,12 @@ public class AssemblyLineRecipes implements Runnable {
         // Dynamo Hatches
         {
             // LuV Dynamo Hatch
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Hatch_Dynamo_IV.get(1))
                 .metadata(RESEARCH_TIME, 60 * MINUTES)
                 .itemInputs(
                     ItemList.Hull_LuV.get(1),
-                    GT_OreDictUnificator.get(
+                    GTOreDictUnificator.get(
                         OrePrefixes.spring,
                         Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
                         2),
@@ -657,12 +656,12 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // ZPM Dynamo Hatch
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Hatch_Dynamo_LuV.get(1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Hull_ZPM.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 4),
+                    GTOreDictUnificator.get(OrePrefixes.spring, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 4),
                     ItemList.Circuit_Chip_NPIC.get(2),
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 2 },
                     ItemList.ZPM_Coil.get(2),
@@ -680,12 +679,12 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // UV Dynamo Hatch
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .metadata(RESEARCH_ITEM, ItemList.Hatch_Dynamo_ZPM.get(1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
                     ItemList.Hull_UV.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Longasssuperconductornameforuvwire, 4),
+                    GTOreDictUnificator.get(OrePrefixes.spring, Materials.Longasssuperconductornameforuvwire, 4),
                     ItemList.Circuit_Chip_PPIC.get(2),
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 2 },
                     ItemList.UV_Coil.get(2),
@@ -710,8 +709,8 @@ public class AssemblyLineRecipes implements Runnable {
         // Fusion Controller
         {
             // mkI
-            GT_Values.RA.stdBuilder()
-                .metadata(RESEARCH_ITEM, GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 1))
+            GTValues.RA.stdBuilder()
+                .metadata(RESEARCH_ITEM, GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 1))
                 .metadata(RESEARCH_TIME, 2 * HOURS)
                 .itemInputs(
                     ItemList.Casing_Fusion_Coil.get(1),
@@ -719,11 +718,11 @@ public class AssemblyLineRecipes implements Runnable {
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                     new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
-                    GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.NaquadahAlloy, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Osmiridium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.NaquadahAlloy, 4),
+                    GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Osmiridium, 4),
                     ItemList.Field_Generator_LuV.get(2),
                     ItemList.Circuit_Wafer_UHPIC.get(32),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 32))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 32))
                 .itemOutputs(ItemList.FusionComputer_LuV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.VanadiumGallium.getMolten(1152))
                 .duration(50 * SECONDS)
@@ -731,8 +730,8 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // mkII
-            GT_Values.RA.stdBuilder()
-                .metadata(RESEARCH_ITEM, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Europium, 1))
+            GTValues.RA.stdBuilder()
+                .metadata(RESEARCH_ITEM, GTOreDictUnificator.get(OrePrefixes.block, Materials.Europium, 1))
                 .metadata(RESEARCH_TIME, 4 * HOURS)
                 .itemInputs(
                     ItemList.Casing_Fusion_Coil.get(1),
@@ -740,10 +739,10 @@ public class AssemblyLineRecipes implements Runnable {
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                     new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
-                    GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Europium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Europium, 4),
                     ItemList.Field_Generator_ZPM.get(2),
                     ItemList.Circuit_Wafer_PPIC.get(48),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 32))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 32))
                 .itemOutputs(ItemList.FusionComputer_ZPMV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.NiobiumTitanium.getMolten(1152))
                 .duration(50 * SECONDS)
@@ -751,8 +750,8 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
 
             // mkIII
-            GT_Values.RA.stdBuilder()
-                .metadata(RESEARCH_ITEM, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Americium, 1))
+            GTValues.RA.stdBuilder()
+                .metadata(RESEARCH_ITEM, GTOreDictUnificator.get(OrePrefixes.block, Materials.Americium, 1))
                 .metadata(RESEARCH_TIME, 6 * HOURS)
                 .itemInputs(
                     ItemList.Casing_Fusion_Coil.get(1),
@@ -760,10 +759,10 @@ public class AssemblyLineRecipes implements Runnable {
                     new Object[] { OrePrefixes.circuit.get(Materials.UHV), 1 },
                     new Object[] { OrePrefixes.circuit.get(Materials.UHV), 1 },
                     new Object[] { OrePrefixes.circuit.get(Materials.UHV), 1 },
-                    GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Americium, 4),
+                    GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Americium, 4),
                     ItemList.Field_Generator_UV.get(2),
                     ItemList.Circuit_Wafer_QPIC.get(64),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 32))
+                    GTOreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 32))
                 .itemOutputs(ItemList.FusionComputer_UV.get(1))
                 .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.ElectrumFlux.getMolten(1152))
                 .duration(50 * SECONDS)
@@ -771,11 +770,11 @@ public class AssemblyLineRecipes implements Runnable {
                 .addTo(AssemblyLine);
         }
         // Energy Module
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .metadata(RESEARCH_ITEM, ItemList.Energy_LapotronicOrb2.get(1))
             .metadata(RESEARCH_TIME, 4 * HOURS)
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 16),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 16),
                 new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                 new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                 new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
@@ -785,7 +784,7 @@ public class AssemblyLineRecipes implements Runnable {
                 ItemList.Circuit_Wafer_SoC2.get(64),
                 ItemList.Circuit_Wafer_SoC2.get(64),
                 ItemList.Circuit_Parts_DiodeASMD.get(8),
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 32))
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 32))
             .itemOutputs(ItemList.Energy_Module.get(1))
             .fluidInputs(
                 new FluidStack(solderIndalloy, 2880),
@@ -795,11 +794,11 @@ public class AssemblyLineRecipes implements Runnable {
             .addTo(AssemblyLine);
 
         // Energy Cluster
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .metadata(RESEARCH_ITEM, ItemList.Energy_Module.get(1))
             .metadata(RESEARCH_TIME, 4 * HOURS)
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 32),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 32),
                 new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                 new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                 new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
@@ -809,7 +808,7 @@ public class AssemblyLineRecipes implements Runnable {
                 ItemList.Circuit_Wafer_HPIC.get(64),
                 ItemList.Circuit_Wafer_HPIC.get(64),
                 ItemList.Circuit_Parts_DiodeASMD.get(16),
-                GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 32))
+                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 32))
             .itemOutputs(ItemList.Energy_Cluster.get(1))
             .fluidInputs(
                 new FluidStack(solderIndalloy, 2880),
@@ -819,7 +818,7 @@ public class AssemblyLineRecipes implements Runnable {
             .addTo(AssemblyLine);
 
         // Integrated Ore Factory
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .metadata(RESEARCH_ITEM, ItemList.Machine_IV_OreWasher.get(1))
             .metadata(RESEARCH_TIME, 6 * HOURS)
             .itemInputs(
@@ -830,13 +829,13 @@ public class AssemblyLineRecipes implements Runnable {
                 ItemList.Conveyor_Module_UHV.get(8),
                 ItemList.Robot_Arm_UHV.get(8),
                 new Object[] { OrePrefixes.circuit.get(Materials.UEV), 4 },
-                new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Duranium, 32),
-                    GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 32) },
-                GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Polybenzimidazole, 64),
+                new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.wireGt04, Materials.Duranium, 32),
+                    GTOreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 32) },
+                GTOreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Polybenzimidazole, 64),
                 new ItemStack[] { ItemList.Component_Grinder_Tungsten.get(64),
                     ItemList.Component_Grinder_Diamond.get(64) },
-                GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 32),
-                GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Chrome, 16))
+                GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 32),
+                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Chrome, 16))
             .itemOutputs(ItemList.Ore_Processor.get(1))
             .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.Naquadria.getMolten(1440))
             .duration(60 * SECONDS)
@@ -844,17 +843,17 @@ public class AssemblyLineRecipes implements Runnable {
             .addTo(AssemblyLine);
 
         // Drone T2
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .metadata(RESEARCH_ITEM, ItemList.TierdDrone0.get(1))
             .metadata(RESEARCH_TIME, 2 * HOURS)
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.NaquadahAlloy, 16),
+                GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.NaquadahAlloy, 16),
                 new Object[] { OrePrefixes.circuit.get(Materials.UV), 4 },
                 NewHorizonsCoreMod.isModLoaded()
-                    ? GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HeavyDutyRocketEngineTier3", 4)
+                    ? GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HeavyDutyRocketEngineTier3", 4)
                     : ItemList.Casing_Firebox_TungstenSteel.get(16),
                 ItemList.Large_Fluid_Cell_Osmium.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.MysteriousCrystal, 1),
+                GTOreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.MysteriousCrystal, 1),
                 ItemList.Emitter_ZPM.get(4),
                 ItemList.Energy_Module.get(1),
                 ItemList.Cover_WirelessNeedsMaintainance.get(1))
@@ -865,11 +864,11 @@ public class AssemblyLineRecipes implements Runnable {
             .addTo(AssemblyLine);
 
         // Drone T3
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .metadata(RESEARCH_ITEM, ItemList.TierdDrone1.get(1))
             .metadata(RESEARCH_TIME, 8 * HOURS)
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 16),
+                GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 16),
                 new Object[] { OrePrefixes.circuit.get(Materials.UEV), 4 },
                 ItemList.Field_Generator_UV.get(16),
                 ItemList.Gravistar.get(8),
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java
index 311c5b1941..932b1b71c5 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java
@@ -2,26 +2,26 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.AppliedEnergistics2;
 import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class AutoclaveRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Energium_Dust.get(9L))
             .itemOutputs(ItemList.IC2_EnergyCrystal.get(1L))
             .outputChances(10000)
@@ -30,7 +30,7 @@ public class AutoclaveRecipes implements Runnable {
             .eut(256)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Energium_Dust.get(9L))
             .itemOutputs(ItemList.IC2_EnergyCrystal.get(1L))
             .outputChances(10000)
@@ -39,7 +39,7 @@ public class AutoclaveRecipes implements Runnable {
             .eut(256)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 0))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10))
             .outputChances(8000)
@@ -48,7 +48,7 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 600))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11))
             .outputChances(8000)
@@ -57,7 +57,7 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 1200))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12))
             .outputChances(8000)
@@ -66,34 +66,34 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 0))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10))
             .outputChances(9000)
-            .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+            .fluidInputs(GTModHandler.getDistilledWater(100L))
             .duration(50 * SECONDS)
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 600))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11))
             .outputChances(9000)
-            .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+            .fluidInputs(GTModHandler.getDistilledWater(100L))
             .duration(50 * SECONDS)
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 1200))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12))
             .outputChances(9000)
-            .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+            .fluidInputs(GTModHandler.getDistilledWater(100L))
             .duration(50 * SECONDS)
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 0))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10))
             .outputChances(10000)
@@ -102,7 +102,7 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 600))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11))
             .outputChances(10000)
@@ -111,7 +111,7 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 1200))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12))
             .outputChances(10000)
@@ -120,53 +120,53 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 32))
-            .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 64L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 32))
+            .itemOutputs(GTModHandler.getIC2Item("carbonFiber", 64L))
             .outputChances(10000)
             .fluidInputs(Materials.Polybenzimidazole.getMolten(36L))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut((int) TierEU.RECIPE_EV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
-            .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 64L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
+            .itemOutputs(GTModHandler.getIC2Item("carbonFiber", 64L))
             .outputChances(10000)
             .fluidInputs(Materials.Epoxid.getMolten(144L))
             .duration(15 * SECONDS)
             .eut((int) TierEU.RECIPE_HV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
-            .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 32L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
+            .itemOutputs(GTModHandler.getIC2Item("carbonFiber", 32L))
             .outputChances(10000)
             .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(288L))
             .duration(20 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
-            .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 16L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
+            .itemOutputs(GTModHandler.getIC2Item("carbonFiber", 16L))
             .outputChances(10000)
             .fluidInputs(Materials.Plastic.getMolten(576L))
             .duration(30 * SECONDS)
             .eut((int) TierEU.RECIPE_LV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherStar, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherStar, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1))
             .outputChances(3333)
             .fluidInputs(Materials.UUMatter.getFluid(576L))
             .duration(60 * MINUTES)
             .eut((int) TierEU.RECIPE_HV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(ItemList.QuantumStar.get(1L)))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(ItemList.QuantumStar.get(1L)))
             .itemOutputs(ItemList.Gravistar.get(1L))
             .outputChances(10000)
             .fluidInputs(Materials.Neutronium.getMolten(288))
@@ -174,8 +174,8 @@ public class AutoclaveRecipes implements Runnable {
             .eut((int) TierEU.RECIPE_IV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(ItemList.Gravistar.get(16L)))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(ItemList.Gravistar.get(16L)))
             .itemOutputs(ItemList.NuclearStar.get(1L))
             .outputChances(10000)
             .fluidInputs(Materials.Infinity.getMolten(288))
@@ -183,7 +183,7 @@ public class AutoclaveRecipes implements Runnable {
             .eut(TierEU.RECIPE_UEV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SiliconDioxide.getDust(1))
             .itemOutputs(Materials.Quartzite.getGems(1))
             .outputChances(750)
@@ -192,16 +192,16 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SiliconDioxide.getDust(1))
             .itemOutputs(Materials.Quartzite.getGems(1))
             .outputChances(1000)
-            .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+            .fluidInputs(GTModHandler.getDistilledWater(100L))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SiliconDioxide.getDust(1))
             .itemOutputs(Materials.Quartzite.getGems(1))
             .outputChances(10000)
@@ -210,40 +210,40 @@ public class AutoclaveRecipes implements Runnable {
             .eut(24)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
             .outputChances(7500)
             .fluidInputs(Materials.Water.getFluid(1000L))
             .duration(60 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
             .outputChances(9000)
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+            .fluidInputs(GTModHandler.getDistilledWater(1000L))
             .duration(60 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.TranscendentMetal, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsUEVplus.Mellion, 32L))
+                GTOreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.TranscendentMetal, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsUEVplus.Mellion, 32L))
             .itemOutputs(ItemList.Phononic_Seed_Crystal.get(8L))
             .fluidInputs(Materials.Grade8PurifiedWater.getFluid(32_000L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_UMV)
             .addTo(autoclaveRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.MagMatter, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.MagMatter, 1))
             .itemOutputs(ItemList.Phononic_Seed_Crystal.get(5))
             .fluidInputs(MaterialsUEVplus.PhononCrystalSolution.getFluid(250))
             .duration(2 * SECONDS + 10 * TICKS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java
index 33149b2ff3..8a4b48dc5e 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java
@@ -1,333 +1,333 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.benderRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import goodgenerator.items.MyMaterial;
-import gregtech.api.enums.GT_Values;
+import goodgenerator.items.GGMaterial;
+import gregtech.api.enums.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class BenderRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Aluminium, 20L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Aluminium, 20L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 48L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 48L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 32L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 32L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Bronze, 32L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Bronze, 32L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 24L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 24L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 16L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 16L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 12L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 12L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 9L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 9L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 6L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 6L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 3L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 3L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmiridium, 2L),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Osmiridium, 2L),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Obsidian, 24L),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Obsidian, 24L),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 12L),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 12L),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 6L),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 6L),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 3L),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 3L),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 1L),
-                GT_Utility.getIntegratedCircuit(11))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 1L),
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Aluminium, 20L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Aluminium, 20L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 48L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 48L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 24L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 24L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Bronze, 32L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Bronze, 32L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 16L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 16L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 12L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 12L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 8),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 8),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 6L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 6L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 4L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 4L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 2L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 2L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.RC_Rebar.get(64L))
             .duration(10 * SECONDS)
             .eut(200)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.IC2_Mixed_Metal_Ingot.get(1L), GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Advanced, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.IC2_Mixed_Metal_Ingot.get(1L), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Advanced, 1L))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.Cell_Empty.get(1L))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.Cell_Empty.get(1L))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Polytetrafluoroethylene, 1L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Polytetrafluoroethylene, 1L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(ItemList.Cell_Empty.get(4L))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 3L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 3L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(new ItemStack(Items.bucket, 1, 0))
             .duration(10 * SECONDS)
             .eut(4)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 3L),
-                GT_Utility.getIntegratedCircuit(12))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 3L),
+                GTUtility.getIntegratedCircuit(12))
             .itemOutputs(new ItemStack(Items.bucket, 1, 0))
             .duration(10 * SECONDS)
             .eut(4)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Iron, 2L),
-                GT_Utility.getIntegratedCircuit(2))
-            .itemOutputs(GT_ModHandler.getIC2Item("fuelRod", 1L))
+                GTOreDictUnificator.get(OrePrefixes.itemCasing, Materials.Iron, 2L),
+                GTUtility.getIntegratedCircuit(2))
+            .itemOutputs(GTModHandler.getIC2Item("fuelRod", 1L))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(benderRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MyMaterial.tairitsu.get(OrePrefixes.ingot, 9), GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(MyMaterial.tairitsu.get(OrePrefixes.plateDense, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GGMaterial.tairitsu.get(OrePrefixes.ingot, 9), GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GGMaterial.tairitsu.get(OrePrefixes.plateDense, 1))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
             .addTo(benderRecipes);
 
-        if (GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 1L) != null) {
-            GT_Values.RA.stdBuilder()
+        if (GTOreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 1L) != null) {
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 1L),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 1L),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.IC2_Food_Can_Empty.get(1L))
                 .duration(20 * TICKS)
                 .eut((int) TierEU.RECIPE_HV)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java
index 84833c933d..478b6f1514 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java
@@ -2,28 +2,27 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
 import static gregtech.api.recipe.RecipeMaps.primitiveBlastRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT;
-import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.ADDITIVE_AMOUNT;
+import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
 
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
+import bartworks.system.material.WerkstoffLoader;
+import gregtech.GTMod;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsKevlar;
 import gregtech.api.enums.MaterialsUEVplus;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class BlastFurnaceRecipes implements Runnable {
 
@@ -34,7 +33,7 @@ public class BlastFurnaceRecipes implements Runnable {
     }
 
     public void registerBlastFurnaceRecipes() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Gypsum.getDust(8))
             .itemOutputs(Materials.Quicklime.getDust(1))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1500))
@@ -45,9 +44,9 @@ public class BlastFurnaceRecipes implements Runnable {
 
         // Carbothermic Reduction
         // Depend on real amount except real ores
-        int outputIngotAmount = GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre ? 2 : 3;
+        int outputIngotAmount = GTMod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre ? 2 : 3;
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedCopper.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Copper.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -57,7 +56,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedAntimony.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Antimony.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -67,7 +66,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedIron.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -77,7 +76,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedNickel.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Nickel.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -87,7 +86,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedZinc.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Zinc.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -97,7 +96,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedCobalt.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Cobalt.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -107,7 +106,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedArsenic.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Arsenic.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -117,7 +116,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RoastedLead.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Lead.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -127,7 +126,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Malachite.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Copper.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -137,7 +136,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.BandedIron.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDustTiny(2))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
@@ -146,7 +145,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Magnetite.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -156,7 +155,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.YellowLimonite.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -166,7 +165,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.BrownLimonite.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -176,7 +175,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.BasalticMineralSand.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -186,7 +185,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.GraniticMineralSand.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -196,7 +195,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Cassiterite.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -206,7 +205,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.CassiteriteSand.getDust(2), Materials.Carbon.getDust(1))
             .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
             .outputChances(10000, 2222)
@@ -216,7 +215,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SiliconDioxide.getDust(3), Materials.Carbon.getDust(2))
             .itemOutputs(Materials.Silicon.getIngots(1), Materials.Ash.getDust(1))
             .outputChances(10000, 1111)
@@ -226,8 +225,8 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        if (GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
-            GT_Values.RA.stdBuilder()
+        if (GTMod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.CupricOxide.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Copper.getIngots(1), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -237,7 +236,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.Malachite.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Copper.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -247,7 +246,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.AntimonyTrioxide.getDust(5), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Antimony.getIngots(2), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -257,7 +256,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.BandedIron.getDust(5), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Iron.getIngots(2), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -267,7 +266,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.Magnetite.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -277,7 +276,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.YellowLimonite.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -287,7 +286,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.BrownLimonite.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -297,7 +296,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.BasalticMineralSand.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -307,7 +306,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.GraniticMineralSand.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -317,7 +316,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.Cassiterite.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -327,7 +326,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.CassiteriteSand.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -337,7 +336,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.Garnierite.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Nickel.getIngots(1), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -347,7 +346,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.CobaltOxide.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Cobalt.getIngots(1), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -357,7 +356,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.ArsenicTrioxide.getDust(5), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Arsenic.getIngots(2), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -367,7 +366,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .metadata(COIL_HEAT, 1200)
                 .addTo(blastFurnaceRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.Massicot.getDust(2), Materials.Carbon.getDustSmall(4))
                 .itemOutputs(Materials.Lead.getIngots(1), Materials.Ash.getDust(1))
                 .outputChances(10000, 2222)
@@ -378,23 +377,23 @@ public class BlastFurnaceRecipes implements Runnable {
                 .addTo(blastFurnaceRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 32),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 32),
                 ItemList.GalliumArsenideCrystalSmallPart.get(1),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Circuit_Silicon_Ingot.get(1))
             .duration(7 * MINUTES + 30 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1784)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 64),
                 ItemList.GalliumArsenideCrystalSmallPart.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 8),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 8),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Circuit_Silicon_Ingot2.get(1))
             .fluidInputs(Materials.Nitrogen.getGas(8000))
             .duration(10 * MINUTES)
@@ -402,12 +401,12 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 2484)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 16),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 16),
                 ItemList.GalliumArsenideCrystal.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Circuit_Silicon_Ingot3.get(1))
             .fluidInputs(Materials.Argon.getGas(8000))
             .duration(12 * MINUTES + 30 * SECONDS)
@@ -415,12 +414,12 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 4484)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 32),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 32),
                 ItemList.GalliumArsenideCrystal.get(2),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Europium, 2),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Europium, 2),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Circuit_Silicon_Ingot4.get(1))
             .fluidInputs(Materials.Radon.getGas(8000))
             .duration(15 * MINUTES)
@@ -428,12 +427,12 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 6484)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 64),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 64),
                 ItemList.GalliumArsenideCrystal.get(4),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Americium, 4),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Americium, 4),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.Circuit_Silicon_Ingot5.get(1))
             .fluidInputs(Materials.Radon.getGas(16000))
             .duration(17 * MINUTES + 30 * SECONDS)
@@ -443,32 +442,32 @@ public class BlastFurnaceRecipes implements Runnable {
 
         // CaH2 + 2Si = CaSi2 + 2H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calciumhydride, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CalciumDisilicide, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calciumhydride, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 2))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.CalciumDisilicide, 3))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
             .duration(15 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1273)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUEVBase, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUEVBase, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1))
             .duration(16 * MINUTES + 23 * SECONDS)
             .eut((int) TierEU.RECIPE_UV)
             .metadata(COIL_HEAT, 11800)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUEVBase, 1),
-                GT_Utility.getIntegratedCircuit(11))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUEVBase, 1),
+                GTUtility.getIntegratedCircuit(11))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1))
             .fluidInputs(Materials.Radon.getGas(1000))
             .duration(7 * MINUTES + 22 * SECONDS + 7 * TICKS)
             .eut((int) TierEU.RECIPE_UV)
@@ -477,21 +476,21 @@ public class BlastFurnaceRecipes implements Runnable {
 
         // 0.45 * 19660 = 8847
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUIVBase, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUIVBase, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1))
             .duration(16 * MINUTES + 23 * SECONDS)
             .eut((int) TierEU.RECIPE_UHV)
             .metadata(COIL_HEAT, 12700)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUIVBase, 1),
-                GT_Utility.getIntegratedCircuit(11))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUIVBase, 1),
+                GTUtility.getIntegratedCircuit(11))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1))
             .fluidInputs(Materials.Radon.getGas(1000))
             .duration(7 * MINUTES + 22 * SECONDS + 7 * TICKS)
             .eut((int) TierEU.RECIPE_UHV)
@@ -500,21 +499,21 @@ public class BlastFurnaceRecipes implements Runnable {
 
         // 0.45 * 19660 = 8847
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUMVBase, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUMVBase, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1))
             .duration(16 * MINUTES + 23 * SECONDS)
             .eut((int) TierEU.RECIPE_UEV)
             .metadata(COIL_HEAT, 13600)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUMVBase, 1),
-                GT_Utility.getIntegratedCircuit(11))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUMVBase, 1),
+                GTUtility.getIntegratedCircuit(11))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1))
             .fluidInputs(Materials.Radon.getGas(1000))
             .duration(7 * MINUTES + 22 * SECONDS + 7 * TICKS)
             .eut((int) TierEU.RECIPE_UEV)
@@ -524,7 +523,7 @@ public class BlastFurnaceRecipes implements Runnable {
         // 0.45 * 19660 = 8847
         // CaO + 3C = CaC2 + CO
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Quicklime.getDust(2), Materials.Carbon.getDust(3))
             .itemOutputs(MaterialsKevlar.CalciumCarbide.getDust(3))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
@@ -535,7 +534,7 @@ public class BlastFurnaceRecipes implements Runnable {
 
         // Ni + 3Al = NiAl3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Nickel.getDust(1), Materials.Aluminium.getDust(3))
             .itemOutputs(MaterialsKevlar.NickelAluminide.getIngots(4))
             .duration(45 * SECONDS)
@@ -549,7 +548,7 @@ public class BlastFurnaceRecipes implements Runnable {
         // Roasting
 
         for (ItemStack silicon : tSiliconDioxide) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(Materials.Chalcopyrite.getDust(1), silicon)
                 .itemOutputs(Materials.RoastedCopper.getDust(1), Materials.Ferrosilite.getDust(5))
                 .fluidInputs(Materials.Oxygen.getGas(3000))
@@ -560,7 +559,7 @@ public class BlastFurnaceRecipes implements Runnable {
                 .addTo(blastFurnaceRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Tetrahedrite.getDust(1))
             .itemOutputs(Materials.RoastedCopper.getDust(1), Materials.RoastedAntimony.getDustTiny(3))
             .fluidInputs(Materials.Oxygen.getGas(3000))
@@ -569,7 +568,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Pyrite.getDust(1))
             .itemOutputs(Materials.RoastedIron.getDust(1), Materials.Ash.getDust(1))
             .outputChances(10000, 1111)
@@ -579,7 +578,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Pentlandite.getDust(1))
             .itemOutputs(Materials.RoastedNickel.getDust(1), Materials.Ash.getDust(1))
             .outputChances(10000, 1111)
@@ -589,7 +588,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Sphalerite.getDust(1))
             .itemOutputs(Materials.RoastedZinc.getDust(1), Materials.Ash.getDust(1))
             .outputChances(10000, 1111)
@@ -599,7 +598,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Cobaltite.getDust(1))
             .itemOutputs(Materials.RoastedCobalt.getDust(1), Materials.RoastedArsenic.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(3000))
@@ -608,7 +607,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Stibnite.getDust(1))
             .itemOutputs(Materials.RoastedAntimony.getDust(1), Materials.Ash.getDust(1))
             .outputChances(10000, 1111)
@@ -618,7 +617,7 @@ public class BlastFurnaceRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Galena.getDust(1))
             .itemOutputs(Materials.RoastedLead.getDust(1), Materials.Ash.getDust(1))
             .outputChances(10000, 1111)
@@ -629,9 +628,9 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 1200)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MaterialsUEVplus.TranscendentMetal.getDust(1), GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.TranscendentMetal, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(MaterialsUEVplus.TranscendentMetal.getDust(1), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.TranscendentMetal, 1))
             .fluidInputs(Materials.Tungsten.getMolten(144))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("molten.celestialtungsten"), 72))
             .duration(3 * MINUTES)
@@ -641,10 +640,10 @@ public class BlastFurnaceRecipes implements Runnable {
 
         // Rh + 3Cl = RhCl3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(WerkstoffLoader.items.get(OrePrefixes.dust), 1, 78),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(MaterialsKevlar.RhodiumChloride.getDust(4))
             .fluidInputs(Materials.Chlorine.getGas(3000))
             .duration(30 * SECONDS)
@@ -652,12 +651,12 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 573)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Phononic_Seed_Crystal.get(1),
                 MaterialsUEVplus.SixPhasedCopper.getNanite(1),
                 Materials.Dilithium.getDust(16),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .fluidInputs(MaterialsUEVplus.Mellion.getMolten(128 * 144L))
             .fluidOutputs(MaterialsUEVplus.PhononCrystalSolution.getFluid(1000))
             .duration(300 * SECONDS)
@@ -665,9 +664,9 @@ public class BlastFurnaceRecipes implements Runnable {
             .metadata(COIL_HEAT, 17000)
             .addTo(blastFurnaceRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MaterialsUEVplus.Mellion.getDust(1), GT_Utility.getIntegratedCircuit(11))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.Mellion, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(MaterialsUEVplus.Mellion.getDust(1), GTUtility.getIntegratedCircuit(11))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.Mellion, 1))
             .fluidInputs(Materials.Radon.getGas(1000))
             .duration(50 * SECONDS)
             .eut((int) TierEU.RECIPE_UXV)
@@ -676,28 +675,28 @@ public class BlastFurnaceRecipes implements Runnable {
     }
 
     public void registerPrimitiveBlastFurnaceRecipes() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Iron.getIngots(1))
             .itemOutputs(Materials.Steel.getIngots(1))
             .duration(6 * MINUTES)
             .metadata(ADDITIVE_AMOUNT, 4)
             .addTo(primitiveBlastRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Iron.getDust(1))
             .itemOutputs(Materials.Steel.getIngots(1))
             .duration(6 * MINUTES)
             .metadata(ADDITIVE_AMOUNT, 4)
             .addTo(primitiveBlastRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Iron.getBlocks(1))
             .itemOutputs(Materials.Steel.getIngots(9))
             .duration(54 * MINUTES)
             .metadata(ADDITIVE_AMOUNT, 36)
             .addTo(primitiveBlastRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Steel.getDust(1))
             .itemOutputs(Materials.Steel.getIngots(1))
             .duration(6 * MINUTES)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java
index 7538b50c6c..8e4fb0bc58 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java
@@ -3,9 +3,9 @@ package gregtech.loaders.postload.recipes;
 import static gregtech.api.enums.Mods.Forestry;
 import static gregtech.api.enums.Mods.IndustrialCraft2;
 import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.init.Blocks;
@@ -15,25 +15,25 @@ 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.GTValues;
 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.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class BreweryRecipes implements Runnable {
 
     @Override
     public void run() {
-        ItemStack[] brewingItems = new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Talc, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Soapstone, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L) };
+        ItemStack[] brewingItems = new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.dust, Materials.Talc, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Soapstone, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L) };
 
         for (ItemStack item : brewingItems) {
             // creosote to lubricant recipes
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(item)
                 .fluidInputs(getFluidStack("creosote", 750))
                 .fluidOutputs(getFluidStack("lubricant", 750))
@@ -42,7 +42,7 @@ public class BreweryRecipes implements Runnable {
                 .addTo(brewingRecipes);
 
             // seed oil to lubricant recipes
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(item)
                 .fluidInputs(getFluidStack("seedoil", 750))
                 .fluidOutputs(getFluidStack("lubricant", 750))
@@ -52,7 +52,7 @@ public class BreweryRecipes implements Runnable {
 
             // lubricant recipes
             {
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(item)
                     .fluidInputs(getFluidStack("oil", 750))
                     .fluidOutputs(getFluidStack("lubricant", 750))
@@ -60,7 +60,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(item)
                     .fluidInputs(getFluidStack("liquid_light_oil", 750))
                     .fluidOutputs(getFluidStack("lubricant", 500))
@@ -68,7 +68,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(item)
                     .fluidInputs(getFluidStack("liquid_medium_oil", 750))
                     .fluidOutputs(getFluidStack("lubricant", 500))
@@ -76,7 +76,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(item)
                     .fluidInputs(getFluidStack("liquid_heavy_oil", 500))
                     .fluidOutputs(getFluidStack("lubricant", 750))
@@ -95,93 +95,93 @@ public class BreweryRecipes implements Runnable {
              * loading twice.
              */
             if (IndustrialCraft2.isModLoaded()) {
-                waterArray = new Fluid[] { FluidRegistry.WATER, GT_ModHandler.getDistilledWater(1L)
+                waterArray = new Fluid[] { FluidRegistry.WATER, GTModHandler.getDistilledWater(1L)
                     .getFluid() };
             } else {
                 waterArray = new Fluid[] { FluidRegistry.WATER };
             }
             for (Fluid tFluid : waterArray) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("milk", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.wheatyjuice", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mineralwater", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mineralwater", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mineralwater", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mineralwater", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.thick", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.magma_cream, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
@@ -189,7 +189,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.fermented_spider_eye, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
@@ -197,7 +197,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.spider_eye, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
@@ -205,7 +205,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.speckled_melon, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
@@ -213,7 +213,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.ghast_tear, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.mundane", 750))
@@ -221,7 +221,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.nether_wart, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.awkward", 750))
@@ -229,7 +229,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Blocks.red_mushroom, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.poison", 750))
@@ -237,7 +237,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.fish, 1, 3))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.poison.strong", 750))
@@ -245,7 +245,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(ItemList.IC2_Grin_Powder.get(1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.poison.strong", 750))
@@ -253,7 +253,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.reeds, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.reedwater", 750))
@@ -261,7 +261,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.apple, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.applejuice", 750))
@@ -269,7 +269,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.golden_apple, 1, 0))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.goldenapplejuice", 750))
@@ -277,7 +277,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Items.golden_apple, 1, 1))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.idunsapplejuice", 750))
@@ -285,7 +285,7 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(ItemList.IC2_Hops.get(1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.hopsjuice", 750))
@@ -293,16 +293,16 @@ public class BreweryRecipes implements Runnable {
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.darkcoffee", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
                     .eut(4)
                     .addTo(brewingRecipes);
 
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
                     .fluidInputs(new FluidStack(tFluid, 750))
                     .fluidOutputs(getFluidStack("potion.chillysauce", 750))
                     .duration(6 * SECONDS + 8 * TICKS)
@@ -314,47 +314,47 @@ public class BreweryRecipes implements Runnable {
 
         // potion brewing 1
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
                 .fluidInputs(getFluidStack("potion.chillysauce", 750))
                 .fluidOutputs(getFluidStack("potion.hotsauce", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
                 .fluidInputs(getFluidStack("potion.hotsauce", 750))
                 .fluidOutputs(getFluidStack("potion.diabolosauce", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
                 .fluidInputs(getFluidStack("potion.diabolosauce", 750))
                 .fluidOutputs(getFluidStack("potion.diablosauce", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
                 .fluidInputs(getFluidStack("milk", 750))
                 .fluidOutputs(getFluidStack("potion.coffee", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
                 .fluidInputs(getFluidStack("milk", 750))
                 .fluidOutputs(getFluidStack("potion.darkchocolatemilk", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.IC2_Hops.get(1L))
                 .fluidInputs(getFluidStack("potion.wheatyjuice", 750))
                 .fluidOutputs(getFluidStack("potion.wheatyhopsjuice", 750))
@@ -362,87 +362,87 @@ public class BreweryRecipes implements Runnable {
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L))
                 .fluidInputs(getFluidStack("potion.hopsjuice", 750))
                 .fluidOutputs(getFluidStack("potion.wheatyhopsjuice", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                 .fluidInputs(getFluidStack("potion.tea", 750))
                 .fluidOutputs(getFluidStack("potion.sweettea", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                 .fluidInputs(getFluidStack("potion.coffee", 750))
                 .fluidOutputs(getFluidStack("potion.cafeaulait", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                 .fluidInputs(getFluidStack("potion.cafeaulait", 750))
                 .fluidOutputs(getFluidStack("potion.laitaucafe", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                 .fluidInputs(getFluidStack("potion.lemonjuice", 750))
                 .fluidOutputs(getFluidStack("potion.lemonade", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                 .fluidInputs(getFluidStack("potion.darkcoffee", 750))
                 .fluidOutputs(getFluidStack("potion.darkcafeaulait", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                 .fluidInputs(getFluidStack("potion.darkchocolatemilk", 750))
                 .fluidOutputs(getFluidStack("potion.chocolatemilk", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1L))
                 .fluidInputs(getFluidStack("potion.tea", 750))
                 .fluidOutputs(getFluidStack("potion.icetea", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L))
                 .fluidInputs(getFluidStack("potion.lemonade", 750))
                 .fluidOutputs(getFluidStack("potion.cavejohnsonsgrenadejuice", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
                 .fluidInputs(getFluidStack("potion.mundane", 750))
                 .fluidOutputs(getFluidStack("potion.purpledrink", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(new ItemStack(Items.fermented_spider_eye, 1, 0))
                 .fluidInputs(getFluidStack("potion.mundane", 750))
                 .fluidOutputs(getFluidStack("potion.weakness", 750))
@@ -450,7 +450,7 @@ public class BreweryRecipes implements Runnable {
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(new ItemStack(Items.fermented_spider_eye, 1, 0))
                 .fluidInputs(getFluidStack("potion.thick", 750))
                 .fluidOutputs(getFluidStack("potion.weakness", 750))
@@ -461,23 +461,23 @@ public class BreweryRecipes implements Runnable {
 
         // biomass recipes
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Forestry.ID, "fertilizerBio", 4L, 0))
-                .fluidInputs(GT_ModHandler.getWater(750L))
+                .fluidInputs(GTModHandler.getWater(750L))
                 .fluidOutputs(getFluidStack("biomass", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Forestry.ID, "mulch", 16L, 0))
-                .fluidInputs(GT_ModHandler.getDistilledWater(750L))
+                .fluidInputs(GTModHandler.getDistilledWater(750L))
                 .fluidOutputs(getFluidStack("biomass", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(4)
                 .addTo(brewingRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Forestry.ID, "mulch", 8L, 0))
                 .fluidInputs(getFluidStack("juice", 500))
                 .fluidOutputs(getFluidStack("biomass", 750))
@@ -488,9 +488,9 @@ public class BreweryRecipes implements Runnable {
 
         // ic2 biomass recipes
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_ModHandler.getIC2Item("biochaff", 1))
-                .fluidInputs(GT_ModHandler.getWater(1000L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTModHandler.getIC2Item("biochaff", 1))
+                .fluidInputs(GTModHandler.getWater(1000L))
                 .fluidOutputs(getFluidStack("ic2biomass", 1000))
                 .duration(8 * SECONDS + 10 * TICKS)
                 .eut(4)
@@ -498,9 +498,9 @@ public class BreweryRecipes implements Runnable {
 
             // Would add 2 different amount of water input if IC2 isn't loaded
             if (IndustrialCraft2.isModLoaded()) {
-                GT_Values.RA.stdBuilder()
-                    .itemInputs(GT_ModHandler.getIC2Item("biochaff", 1))
-                    .fluidInputs(GT_ModHandler.getDistilledWater(500L))
+                GTValues.RA.stdBuilder()
+                    .itemInputs(GTModHandler.getIC2Item("biochaff", 1))
+                    .fluidInputs(GTModHandler.getDistilledWater(500L))
                     .fluidOutputs(getFluidStack("ic2biomass", 1000))
                     .duration(10 * TICKS)
                     .eut((int) TierEU.RECIPE_LV)
@@ -517,14 +517,14 @@ public class BreweryRecipes implements Runnable {
             this.addPotionRecipes("poison", new ItemStack(Items.spider_eye, 1, 0));
             this.addPotionRecipes("health", new ItemStack(Items.speckled_melon, 1, 0));
             this.addPotionRecipes("regen", new ItemStack(Items.ghast_tear, 1, 0));
-            this.addPotionRecipes("speed", GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L));
-            this.addPotionRecipes("strength", GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L));
+            this.addPotionRecipes("speed", GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L));
+            this.addPotionRecipes("strength", GTOreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L));
         }
     }
 
     public void addPotionRecipes(String aName, ItemStack aItem) {
         // normal
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(aItem)
             .fluidInputs(getFluidStack("potion.awkward", 750))
             .fluidOutputs(getFluidStack("potion." + aName, 750))
@@ -537,7 +537,7 @@ public class BreweryRecipes implements Runnable {
             || aName.equals("health")
             || aName.equals("strength")
             || aName.equals("poison")) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(aItem)
                 .fluidInputs(getFluidStack("potion.thick", 750))
                 .fluidOutputs(getFluidStack("potion." + aName + ".strong", 750))
@@ -548,8 +548,8 @@ public class BreweryRecipes implements Runnable {
 
         // long
         if (!aName.equals("health")) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))
                 .fluidInputs(getFluidStack("potion." + aName, 750))
                 .fluidOutputs(getFluidStack("potion." + aName + ".long", 750))
                 .duration(6 * SECONDS + 8 * TICKS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java
index c9e8e631bf..7707b985d6 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java
@@ -2,90 +2,90 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.IndustrialCraft2;
 import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class CannerRecipes implements Runnable {
 
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 2L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 2L),
                 ItemList.Battery_Hull_LV.get(1L))
             .itemOutputs(ItemList.Battery_RE_LV_Cadmium.get(1L))
             .duration(5 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 2L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 2L),
                 ItemList.Battery_Hull_LV.get(1L))
             .itemOutputs(ItemList.Battery_RE_LV_Lithium.get(1L))
             .duration(5 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 2L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 2L),
                 ItemList.Battery_Hull_LV.get(1L))
             .itemOutputs(ItemList.Battery_RE_LV_Sodium.get(1L))
             .duration(5 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 8L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 8L),
                 ItemList.Battery_Hull_MV.get(1L))
             .itemOutputs(ItemList.Battery_RE_MV_Cadmium.get(1L))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 8L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 8L),
                 ItemList.Battery_Hull_MV.get(1L))
             .itemOutputs(ItemList.Battery_RE_MV_Lithium.get(1L))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 8L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 8L),
                 ItemList.Battery_Hull_MV.get(1L))
             .itemOutputs(ItemList.Battery_RE_MV_Sodium.get(1L))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 32L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 32L),
                 ItemList.Battery_Hull_HV.get(1L))
             .itemOutputs(ItemList.Battery_RE_HV_Cadmium.get(1L))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 32L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 32L),
                 ItemList.Battery_Hull_HV.get(1L))
             .itemOutputs(ItemList.Battery_RE_HV_Lithium.get(1L))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(2)
             .addTo(cannerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 32L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 32L),
                 ItemList.Battery_Hull_HV.get(1L))
             .itemOutputs(ItemList.Battery_RE_HV_Sodium.get(1L))
             .duration(1 * MINUTES + 20 * SECONDS)
@@ -94,9 +94,9 @@ public class CannerRecipes implements Runnable {
         // Recipes to actually fill the empty hulls with content
         // IV 2048
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 4L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 4L),
                 ItemList.BatteryHull_EV.get(1L))
             .itemOutputs(ItemList.BatteryHull_EV_Full.get(1L))
             .duration(5 * SECONDS)
@@ -104,9 +104,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // EV 8192
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 16L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 16L),
                 ItemList.BatteryHull_IV.get(1L))
             .itemOutputs(ItemList.BatteryHull_IV_Full.get(1L))
             .duration(7 * SECONDS + 10 * TICKS)
@@ -114,9 +114,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // LuV 32768
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 32L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 32L),
                 ItemList.BatteryHull_LuV.get(1L))
             .itemOutputs(ItemList.BatteryHull_LuV_Full.get(1L))
             .duration(10 * SECONDS)
@@ -124,9 +124,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // ZPM 131072
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 16L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 16L),
                 ItemList.BatteryHull_ZPM.get(1L))
             .itemOutputs(ItemList.BatteryHull_ZPM_Full.get(1L))
             .duration(12 * SECONDS + 10 * TICKS)
@@ -134,9 +134,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // UV 524288
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 32L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 32L),
                 ItemList.BatteryHull_UV.get(1L))
             .itemOutputs(ItemList.BatteryHull_UV_Full.get(1L))
             .duration(15 * SECONDS)
@@ -144,9 +144,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // UHV 2097152
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 16L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 16L),
                 ItemList.BatteryHull_UHV.get(1L))
             .itemOutputs(ItemList.BatteryHull_UHV_Full.get(1L))
             .duration(17 * SECONDS + 10 * TICKS)
@@ -154,9 +154,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // UEV 8388608
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 32L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 32L),
                 ItemList.BatteryHull_UEV.get(1L))
             .itemOutputs(ItemList.BatteryHull_UEV_Full.get(1L))
             .duration(20 * SECONDS)
@@ -164,9 +164,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // UIV 33554432
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 64L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 64L),
                 ItemList.BatteryHull_UIV.get(1L))
             .itemOutputs(ItemList.BatteryHull_UIV_Full.get(1L))
             .duration(22 * SECONDS + 10 * TICKS)
@@ -174,9 +174,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // UMV 134217728
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Infinity, 4L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Infinity, 4L),
                 ItemList.BatteryHull_UMV.get(1L))
             .itemOutputs(ItemList.BatteryHull_UMV_Full.get(1L))
             .duration(25 * SECONDS)
@@ -184,9 +184,9 @@ public class CannerRecipes implements Runnable {
             .addTo(cannerRecipes);
         // UxV 536870912
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Infinity, 8L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Infinity, 8L),
                 ItemList.BatteryHull_UxV.get(1L))
             .itemOutputs(ItemList.BatteryHull_UxV_Full.get(1L))
             .duration(30 * SECONDS)
@@ -197,52 +197,52 @@ public class CannerRecipes implements Runnable {
 
         if (IndustrialCraft2.isModLoaded()) {
             // todo: remove tiny dust in this recipe
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_ModHandler.getIC2Item("fuelRod", 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 1L))
-                .itemOutputs(GT_ModHandler.getIC2Item("reactorLithiumCell", 1, 1))
+                    GTModHandler.getIC2Item("fuelRod", 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 1L))
+                .itemOutputs(GTModHandler.getIC2Item("reactorLithiumCell", 1, 1))
                 .duration(16 * TICKS)
                 .eut(64)
                 .addTo(cannerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_ModHandler.getIC2Item("fuelRod", 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 3))
+                    GTModHandler.getIC2Item("fuelRod", 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 3))
                 .itemOutputs(ItemList.ThoriumCell_1.get(1L))
                 .duration(1 * SECONDS + 10 * TICKS)
                 .eut(16)
                 .addTo(cannerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_ModHandler.getIC2Item("fuelRod", 1), GT_ModHandler.getIC2Item("UranFuel", 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTModHandler.getIC2Item("fuelRod", 1), GTModHandler.getIC2Item("UranFuel", 1))
                 .itemOutputs(ItemList.Uraniumcell_1.get(1))
                 .duration(1 * SECONDS + 10 * TICKS)
                 .eut(16)
                 .addTo(cannerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_ModHandler.getIC2Item("fuelRod", 1), GT_ModHandler.getIC2Item("MOXFuel", 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTModHandler.getIC2Item("fuelRod", 1), GTModHandler.getIC2Item("MOXFuel", 1))
                 .itemOutputs(ItemList.Moxcell_1.get(1))
                 .duration(1 * SECONDS + 10 * TICKS)
                 .eut(16)
                 .addTo(cannerRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Large_Fluid_Cell_TungstenSteel.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 3))
             .itemOutputs(ItemList.NaquadahCell_1.get(1L))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(cannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Large_Fluid_Cell_TungstenSteel.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 3))
             .itemOutputs(ItemList.MNqCell_1.get(1L))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(16)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java
index c4cfca5aba..e792638307 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java
@@ -6,37 +6,37 @@ import static gregtech.api.enums.Mods.Thaumcraft;
 import static gregtech.api.enums.Mods.ThaumicTinkerer;
 import static gregtech.api.enums.Mods.TwilightForest;
 import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.loaders.misc.GT_Bees.combs;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.loaders.misc.GTBees.combs;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsOreAlum;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class CentrifugeRecipes implements Runnable {
 
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedGold, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedGold, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
                 getModItem(Thaumcraft.ID, "ItemResource", 2L, 14))
             .outputChances(10000, 10000, 9000)
             .fluidInputs(Materials.Mercury.getFluid(200))
@@ -44,30 +44,30 @@ public class CentrifugeRecipes implements Runnable {
             .eut((int) TierEU.RECIPE_MV)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Cell_Empty.get(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
             .fluidInputs(Materials.Air.getGas(10000))
             .fluidOutputs(Materials.Nitrogen.getGas(3900))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(8)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 9))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 3))
             .outputChances(10000, 10000, 10000, 9500, 9000, 8500)
             .duration(6 * MINUTES + 45 * SECONDS)
             .eut(30)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemOutputs(
                 Materials.Stone.getDust(1),
                 Materials.Iron.getDust(1),
@@ -84,318 +84,314 @@ public class CentrifugeRecipes implements Runnable {
 
         // food ->CH4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.golden_apple, 1, 1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.golden_apple, 1, 1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.gold_ingot, 64))
             .fluidOutputs(Materials.Methane.getGas(4608))
             .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.golden_apple, 1, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.golden_apple, 1, 0), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.gold_ingot, 7))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.golden_carrot, 1, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.golden_carrot, 1, 0), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.gold_nugget, 6))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.speckled_melon, 1, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.speckled_melon, 1, 0), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.gold_nugget, 6))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.mushroom_stew, 16, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.mushroom_stew, 16, 0), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Items.bowl, 16, 0))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.apple, 32, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.apple, 32, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.bread, 64, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.bread, 64, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.porkchop, 12, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.porkchop, 12, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.cooked_porkchop, 16, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.cooked_porkchop, 16, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.beef, 12, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.beef, 12, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.cooked_beef, 16, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.cooked_beef, 16, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.fish, 12, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.fish, 12, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.cooked_fished, 16, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.cooked_fished, 16, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.chicken, 12, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.chicken, 12, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.cooked_chicken, 16, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.cooked_chicken, 16, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.melon, 64, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.melon, 64, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.pumpkin, 16, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.pumpkin, 16, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.rotten_flesh, 16, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.rotten_flesh, 16, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.spider_eye, 32, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.spider_eye, 32, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.carrot, 16, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.carrot, 16, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Raw_Potato.get(16), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Raw_Potato.get(16), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Poisonous_Potato.get(12), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Poisonous_Potato.get(12), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Food_Baked_Potato.get(24), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Food_Baked_Potato.get(24), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.cookie, 64, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.cookie, 64, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.cake, 8, 0), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.cake, 8, 0), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.brown_mushroom_block, 12, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.brown_mushroom_block, 12, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.red_mushroom_block, 12, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.red_mushroom_block, 12, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.brown_mushroom, 32, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.brown_mushroom, 32, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.red_mushroom, 32, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.red_mushroom, 32, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.nether_wart, 32, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.nether_wart, 32, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("terraWart", 16), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("terraWart", 16), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(TwilightForest.ID, "item.meefRaw", 12L, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.meefRaw", 12L, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(TwilightForest.ID, "item.meefSteak", 16L, 32767), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.meefSteak", 16L, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                getModItem(TwilightForest.ID, "item.venisonRaw", 12L, 32767),
-                GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(TwilightForest.ID, "item.venisonRaw", 12L, 32767), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(TwilightForest.ID, "item.venisonCooked", 16L, 32767),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(576))
             .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.log, Materials.Wood, 1),
-                GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.log, Materials.Wood, 1), GTUtility.getIntegratedCircuit(1))
             .fluidOutputs(Materials.Methane.getGas(60))
             .duration(10 * SECONDS)
             .eut(20)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.sand, 1, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Diamond, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Diamond, 1),
                 new ItemStack(Blocks.sand, 1))
             .outputChances(5000, 100, 5000)
             .duration(30 * SECONDS)
             .eut((int) TierEU.RECIPE_MV)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.dirt, 1, 32767))
             .itemOutputs(
                 ItemList.IC2_Plantball.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
                 new ItemStack(Blocks.sand, 1))
             .outputChances(1250, 5000, 5000)
             .duration(12 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.grass, 1, 32767))
             .itemOutputs(
                 ItemList.IC2_Plantball.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
                 new ItemStack(Blocks.sand, 1))
             .outputChances(2500, 5000, 5000)
             .duration(12 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.mycelium, 1, 32767))
             .itemOutputs(
                 new ItemStack(Blocks.brown_mushroom, 1),
                 new ItemStack(Blocks.red_mushroom, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
                 new ItemStack(Blocks.sand, 1))
             .outputChances(2500, 2500, 5000, 5000)
             .duration(32 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Resin.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3),
                 ItemList.IC2_Plantball.get(1))
             .outputChances(10000, 1000)
             .fluidOutputs(Materials.Glue.getFluid(100))
@@ -403,13 +399,13 @@ public class CentrifugeRecipes implements Runnable {
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
-                GT_Utility.getIntegratedCircuit(10))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
+                GTUtility.getIntegratedCircuit(10))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
             .outputChances(1000, 500)
             .duration(1 * MINUTES + 40 * SECONDS)
             .eut((int) TierEU.RECIPE_HV)
@@ -417,80 +413,80 @@ public class CentrifugeRecipes implements Runnable {
 
         // Uranium Enrichment in Centrifuge by adding Fluorine (Uranium Hexafluoride)
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1))
             .outputChances(10000)
             .fluidInputs(Materials.Fluorine.getGas(4000))
             .duration(3 * MINUTES + 20 * SECONDS)
             .eut((int) TierEU.RECIPE_EV)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium241, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1))
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium241, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1))
             .outputChances(2000, 3000)
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(320)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 9))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1))
             .outputChances(5000, 1000)
             .duration(24 * MINUTES)
             .eut(320)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1))
             .outputChances(2000, 3000)
             .duration(21 * MINUTES + 20 * SECONDS)
             .eut(640)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Hydrogen.getGas(160))
             .fluidOutputs(Materials.Deuterium.getGas(40))
             .duration(8 * SECONDS)
             .eut(20)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Deuterium.getGas(160))
             .fluidOutputs(Materials.Tritium.getGas(40))
             .duration(8 * SECONDS)
             .eut(80)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Helium.getGas(80))
             .fluidOutputs(Materials.Helium_3.getGas(5))
             .duration(8 * SECONDS)
             .eut(80)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1))
             .duration(48 * SECONDS + 16 * TICKS)
             .eut(80)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 36))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 36))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungstate, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tungstate, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1),
                 new ItemStack(Blocks.sand, 36))
             .outputChances(3750, 2500, 9000)
             .fluidOutputs(Materials.Helium.getGas(4320))
@@ -498,20 +494,20 @@ public class CentrifugeRecipes implements Runnable {
             .eut(20)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 36))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 36))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1))
             .outputChances(5625, 9900, 5625, 2500)
             .duration(4 * MINUTES + 48 * SECONDS)
             .eut(20)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(10))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(10))
             .itemOutputs(
                 Materials.SiliconDioxide.getDust(1),
                 Materials.Magnesia.getDust(1),
@@ -525,8 +521,8 @@ public class CentrifugeRecipes implements Runnable {
             .eut(80)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(20))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(20))
             .itemOutputs(
                 Materials.SiliconDioxide.getDust(5),
                 Materials.Magnesia.getDust(1),
@@ -540,11 +536,11 @@ public class CentrifugeRecipes implements Runnable {
             .eut(80)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.soul_sand, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1),
                 new ItemStack(Blocks.sand, 1))
             .outputChances(1000, 700, 9000)
             .fluidOutputs(Materials.Oil.getFluid(200))
@@ -552,63 +548,63 @@ public class CentrifugeRecipes implements Runnable {
             .eut(12)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(10))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(10))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Copper, 1),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Tin, 1),
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Silver, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Scheelite, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Bauxite, 1))
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Copper, 1),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Tin, 1),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Silver, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Scheelite, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Bauxite, 1))
             .outputChances(2000, 1000, 250, 50, 250, 500)
             .fluidInputs(getFluidStack("ic2pahoehoelava", 100))
             .duration(2 * SECONDS)
             .eut(1024)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(20))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(20))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Scheelite, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bauxite, 1))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Scheelite, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bauxite, 1))
             .outputChances(8000, 4000, 1000, 450, 2250, 4500)
             .fluidInputs(getFluidStack("ic2pahoehoelava", 3600))
             .duration(16 * SECONDS + 8 * TICKS)
             .eut(4096)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 45),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.BasalticMineralSand, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Olivine, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Obsidian, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Basalt, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Flint, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.RareEarth, 1))
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.BasalticMineralSand, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Olivine, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Obsidian, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Basalt, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Flint, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.RareEarth, 1))
             .outputChances(2000, 2000, 2000, 2000, 2000, 2000)
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(20)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 36L, 45),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Olivine, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Basalt, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Flint, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Olivine, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Basalt, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Flint, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 2))
             .outputChances(9000, 9000, 9000, 9000, 9000, 9000)
             .duration(25 * SECONDS + 18 * TICKS)
             .eut(80)
@@ -616,7 +612,7 @@ public class CentrifugeRecipes implements Runnable {
 
         // Ash centrifuge recipes
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ash.getDust(36))
             .itemOutputs(
                 Materials.Quicklime.getDust(18),
@@ -632,7 +628,7 @@ public class CentrifugeRecipes implements Runnable {
 
         // Stone Dust and Metal Mixture centrifuge recipes
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Stone.getDust(36))
             .itemOutputs(
                 Materials.Quartzite.getDust(9),
@@ -646,7 +642,7 @@ public class CentrifugeRecipes implements Runnable {
             .eut(30)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.MetalMixture.getDust(36))
             .itemOutputs(
                 Materials.BandedIron.getDust(9),
@@ -660,24 +656,24 @@ public class CentrifugeRecipes implements Runnable {
             .eut((int) TierEU.RECIPE_EV)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Propane.getGas(320))
             .fluidOutputs(Materials.LPG.getFluid(290))
             .duration(20 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Butane.getGas(320))
             .fluidOutputs(Materials.LPG.getFluid(370))
             .duration(20 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 8))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 8))
             .outputChances(10000, 10000)
             .fluidInputs(Materials.EnrichedNaquadria.getFluid(9216))
             .fluidOutputs(Materials.FluidNaquadahFuel.getFluid(4806))
@@ -685,16 +681,16 @@ public class CentrifugeRecipes implements Runnable {
             .eut(TierEU.RECIPE_UHV)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1))
             .duration(12 * SECONDS + 10 * TICKS)
             .eut(5)
             .addTo(centrifugeRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.magma_cream, 1))
             .itemOutputs(new ItemStack(Items.blaze_powder, 1), new ItemStack(Items.slime_ball, 1))
             .duration(25 * SECONDS)
@@ -704,62 +700,62 @@ public class CentrifugeRecipes implements Runnable {
         if (Thaumcraft.isModLoaded()) {
             // air
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 144), GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedAir, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 144), GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedAir, 1))
                 .duration(51 * SECONDS + 4 * TICKS)
                 .eut(12)
                 .addTo(centrifugeRecipes);
 
             // fire
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 146), GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedFire, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 146), GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedFire, 1))
                 .duration(51 * SECONDS + 4 * TICKS)
                 .eut(12)
                 .addTo(centrifugeRecipes);
 
             // aqua
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 147), GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedWater, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 147), GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedWater, 1))
                 .duration(51 * SECONDS + 4 * TICKS)
                 .eut(12)
                 .addTo(centrifugeRecipes);
 
             // terra
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 145), GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEarth, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 145), GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEarth, 1))
                 .duration(51 * SECONDS + 4 * TICKS)
                 .eut(12)
                 .addTo(centrifugeRecipes);
 
             // ordo
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 148), GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 148), GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1))
                 .duration(51 * SECONDS + 4 * TICKS)
                 .eut(12)
                 .addTo(centrifugeRecipes);
 
             // perditio
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 149), GT_Utility.getIntegratedCircuit(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEntropy, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 149), GTUtility.getIntegratedCircuit(1))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEntropy, 1))
                 .duration(51 * SECONDS + 4 * TICKS)
                 .eut(12)
                 .addTo(centrifugeRecipes);
 
             // Nethershard
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 152), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 152), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 6))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(TierEU.RECIPE_HV)
@@ -767,8 +763,8 @@ public class CentrifugeRecipes implements Runnable {
 
             // Endshard
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 153), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 153), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 7))
                 .duration(6 * SECONDS + 8 * TICKS)
                 .eut(TierEU.RECIPE_HV)
@@ -778,8 +774,8 @@ public class CentrifugeRecipes implements Runnable {
         if (ExtraUtilities.isModLoaded()) {
             // Caelestis red
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 154), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 154), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(
                     getModItem(ExtraUtilities.ID, "greenscreen", 1L, 2),
                     getModItem(ExtraUtilities.ID, "greenscreen", 1L, 10),
@@ -793,8 +789,8 @@ public class CentrifugeRecipes implements Runnable {
 
             // Caelestis green
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 155), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 155), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(
                     getModItem(ExtraUtilities.ID, "greenscreen", 1L, 13),
                     getModItem(ExtraUtilities.ID, "greenscreen", 1L, 5),
@@ -807,8 +803,8 @@ public class CentrifugeRecipes implements Runnable {
 
             // Caelestis blue
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(combs, 1, 156), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(combs, 1, 156), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(
                     getModItem(ExtraUtilities.ID, "greenscreen", 1L, 3),
                     getModItem(ExtraUtilities.ID, "greenscreen", 1L, 9),
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java
index 7be13ecbe4..e500844b37 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java
@@ -2,10 +2,10 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.BuildCraftTransport;
 import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
@@ -13,24 +13,23 @@ import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-import gregtech.api.GregTech_API;
+import bartworks.system.material.WerkstoffLoader;
+import gregtech.api.GregTechAPI;
 import gregtech.api.enums.Dyes;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsKevlar;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class ChemicalBathRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Raw_Fries.get(1))
             .itemOutputs(ItemList.Food_Fries.get(1))
             .fluidInputs(Materials.FryingOilHot.getFluid(10))
@@ -38,35 +37,35 @@ public class ChemicalBathRecipes implements Runnable {
             .eut(4)
             .addTo(chemicalBathRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("dynamite", 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("stickyDynamite", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("dynamite", 1))
+            .itemOutputs(GTModHandler.getIC2Item("stickyDynamite", 1))
             .fluidInputs(Materials.Glue.getFluid(10))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(chemicalBathRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("reinforcedStone", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1))
+            .itemOutputs(GTModHandler.getIC2Item("reinforcedStone", 1))
             .fluidInputs(Materials.Concrete.getMolten(144))
             .duration(10 * SECONDS)
             .eut(4)
             .addTo(chemicalBathRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1))
             .fluidInputs(Materials.Water.getFluid(125))
             .duration(12 * TICKS)
             .eut(4)
             .addTo(chemicalBathRecipes);
 
         // paper creation recipes
-        ItemStack[] paperSources = new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 1L), new ItemStack(Items.reeds, 1, 32767) };
+        ItemStack[] paperSources = new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 1L), new ItemStack(Items.reeds, 1, 32767) };
         for (ItemStack paperSource : paperSources) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(paperSource)
                 .itemOutputs(new ItemStack(Items.paper, 1, 0))
                 .fluidInputs(Materials.Water.getFluid(100))
@@ -74,26 +73,26 @@ public class ChemicalBathRecipes implements Runnable {
                 .eut(4)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(paperSource)
                 .itemOutputs(new ItemStack(Items.paper, 1, 0))
-                .fluidInputs(GT_ModHandler.getDistilledWater(100))
+                .fluidInputs(GTModHandler.getDistilledWater(100))
                 .duration(10 * SECONDS)
                 .eut(4)
                 .addTo(chemicalBathRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1))
-            .fluidInputs(GT_ModHandler.getDistilledWater(125))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1))
+            .fluidInputs(GTModHandler.getDistilledWater(125))
             .duration(12 * TICKS)
             .eut(4)
             .addTo(chemicalBathRecipes);
 
         for (int i = 1; i < 16; i++) {
             // wool cleaning recipes
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(new ItemStack(Blocks.wool, 1, i))
                 .itemOutputs(new ItemStack(Blocks.wool, 1, 0))
                 .fluidInputs(Materials.Chlorine.getGas(50))
@@ -102,7 +101,7 @@ public class ChemicalBathRecipes implements Runnable {
                 .addTo(chemicalBathRecipes);
 
             // carpet cleaning recipes
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(new ItemStack(Blocks.carpet, 1, 32767))
                 .itemOutputs(new ItemStack(Blocks.carpet, 1, 0))
                 .fluidInputs(Materials.Chlorine.getGas(25))
@@ -112,7 +111,7 @@ public class ChemicalBathRecipes implements Runnable {
         }
 
         // stained hardened clay cleaning
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.stained_hardened_clay, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.hardened_clay, 1, 0))
             .fluidInputs(Materials.Chlorine.getGas(50))
@@ -121,7 +120,7 @@ public class ChemicalBathRecipes implements Runnable {
             .addTo(chemicalBathRecipes);
 
         // stained glass cleaning
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.stained_glass, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.glass, 1, 0))
             .fluidInputs(Materials.Chlorine.getGas(50))
@@ -130,7 +129,7 @@ public class ChemicalBathRecipes implements Runnable {
             .addTo(chemicalBathRecipes);
 
         // stained glass pane cleaning
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.stained_glass_pane, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.glass_pane, 1, 0))
             .fluidInputs(Materials.Chlorine.getGas(20))
@@ -140,18 +139,18 @@ public class ChemicalBathRecipes implements Runnable {
 
         // light -> dark concrete recipes
         for (int i = 0; i < 8; i++) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i + 8))
-                .itemOutputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(GregTechAPI.sBlockConcretes, 1, i + 8))
+                .itemOutputs(new ItemStack(GregTechAPI.sBlockConcretes, 1, i))
                 .fluidInputs(Materials.Water.getFluid(250))
                 .duration(10 * SECONDS)
                 .eut(4)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i + 8))
-                .itemOutputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i))
-                .fluidInputs(GT_ModHandler.getDistilledWater(250))
+            GTValues.RA.stdBuilder()
+                .itemInputs(new ItemStack(GregTechAPI.sBlockConcretes, 1, i + 8))
+                .itemOutputs(new ItemStack(GregTechAPI.sBlockConcretes, 1, i))
+                .fluidInputs(GTModHandler.getDistilledWater(250))
                 .duration(10 * SECONDS)
                 .eut(4)
                 .addTo(chemicalBathRecipes);
@@ -159,64 +158,64 @@ public class ChemicalBathRecipes implements Runnable {
 
         // reinforced blocks
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Bronze, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Bronze, 1))
                 .itemOutputs(ItemList.Block_BronzePlate.get(1))
                 .fluidInputs(Materials.Concrete.getMolten(144))
                 .duration(10 * SECONDS)
                 .eut(4)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1))
                 .itemOutputs(ItemList.Block_SteelPlate.get(1))
                 .fluidInputs(Materials.Steel.getMolten(288))
                 .duration(12 * SECONDS + 10 * TICKS)
                 .eut(16)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1))
                 .itemOutputs(ItemList.Block_TitaniumPlate.get(1))
                 .fluidInputs(Materials.Titanium.getMolten(144))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
                 .itemOutputs(ItemList.Block_TungstenSteelReinforced.get(1))
                 .fluidInputs(Materials.TungstenSteel.getMolten(144))
                 .duration(17 * SECONDS + 10 * TICKS)
                 .eut(64)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1))
                 .itemOutputs(ItemList.Block_IridiumTungstensteel.get(1))
                 .fluidInputs(Materials.Iridium.getMolten(144))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Naquadah, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Naquadah, 1))
                 .itemOutputs(ItemList.Block_NaquadahPlate.get(1))
                 .fluidInputs(Materials.Osmium.getMolten(144))
                 .duration(22 * SECONDS + 10 * TICKS)
                 .eut(256)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1))
                 .itemOutputs(ItemList.Block_NeutroniumPlate.get(1))
                 .fluidInputs(Materials.Naquadria.getMolten(144))
                 .duration(25 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(chemicalBathRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
                 .itemOutputs(ItemList.Block_TungstenSteelReinforced.get(1))
                 .fluidInputs(Materials.Concrete.getMolten(144))
                 .duration(10 * SECONDS)
@@ -225,8 +224,8 @@ public class ChemicalBathRecipes implements Runnable {
         }
 
         for (int j = 0; j < Dyes.dyeRed.getSizeOfFluidList(); j++) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
                 .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 0))
                 .fluidInputs(Dyes.dyeRed.getFluidDye(j, 72))
                 .duration(1 * SECONDS + 12 * TICKS)
@@ -234,8 +233,8 @@ public class ChemicalBathRecipes implements Runnable {
                 .addTo(chemicalBathRecipes);
         }
         for (int j = 0; j < Dyes.dyeBlue.getSizeOfFluidList(); j++) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
                 .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 1))
                 .fluidInputs(Dyes.dyeBlue.getFluidDye(j, 72))
                 .duration(1 * SECONDS + 12 * TICKS)
@@ -243,8 +242,8 @@ public class ChemicalBathRecipes implements Runnable {
                 .addTo(chemicalBathRecipes);
         }
         for (int j = 0; j < Dyes.dyeGreen.getSizeOfFluidList(); j++) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
                 .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 2))
                 .fluidInputs(Dyes.dyeGreen.getFluidDye(j, 72))
                 .duration(1 * SECONDS + 12 * TICKS)
@@ -252,8 +251,8 @@ public class ChemicalBathRecipes implements Runnable {
                 .addTo(chemicalBathRecipes);
         }
         for (int j = 0; j < Dyes.dyeYellow.getSizeOfFluidList(); j++) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTOreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
                 .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 3))
                 .fluidInputs(Dyes.dyeYellow.getFluidDye(j, 72))
                 .duration(1 * SECONDS + 12 * TICKS)
@@ -263,7 +262,7 @@ public class ChemicalBathRecipes implements Runnable {
         for (byte i = 0; i < 16; i = (byte) (i + 1)) {
             for (int j = 0; j < Dyes.VALUES[i].getSizeOfFluidList(); j++) {
                 if (i != 15) {
-                    GT_Values.RA.stdBuilder()
+                    GTValues.RA.stdBuilder()
                         .itemInputs(new ItemStack(Blocks.wool, 1, 0))
                         .itemOutputs(new ItemStack(Blocks.wool, 1, 15 - i))
                         .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 72))
@@ -272,7 +271,7 @@ public class ChemicalBathRecipes implements Runnable {
                         .addTo(chemicalBathRecipes);
                 }
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Blocks.glass, 1, 0))
                     .itemOutputs(new ItemStack(Blocks.stained_glass, 1, 15 - i))
                     .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 18))
@@ -280,7 +279,7 @@ public class ChemicalBathRecipes implements Runnable {
                     .eut(2)
                     .addTo(chemicalBathRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(new ItemStack(Blocks.hardened_clay, 1, 0))
                     .itemOutputs(new ItemStack(Blocks.stained_hardened_clay, 1, 15 - i))
                     .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 18))
@@ -291,23 +290,23 @@ public class ChemicalBathRecipes implements Runnable {
         }
 
         // Rn relate quantum recipe
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderEye, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.EnderEye, 1))
             .itemOutputs(ItemList.QuantumEye.get(1))
             .fluidInputs(Materials.Radon.getGas(250))
             .duration(24 * SECONDS)
             .eut(384)
             .addTo(chemicalBathRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1))
             .itemOutputs(ItemList.QuantumStar.get(1))
             .fluidInputs(Materials.Radon.getGas(1250))
             .duration(1 * MINUTES + 36 * SECONDS)
             .eut(384)
             .addTo(chemicalBathRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.WovenKevlar.get(1))
             .itemOutputs(MaterialsKevlar.Kevlar.getPlates(1))
             .fluidInputs(MaterialsKevlar.PolyurethaneResin.getFluid(1000))
@@ -315,7 +314,7 @@ public class ChemicalBathRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalBathRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(WerkstoffLoader.CubicZirconia.get(OrePrefixes.gemExquisite, 1))
             .itemOutputs(Materials.Firestone.getGems(1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2hotcoolant"), 250))
@@ -324,7 +323,7 @@ public class ChemicalBathRecipes implements Runnable {
             .addTo(chemicalBathRecipes);
 
         // Na + H2O = NaOH + H
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Sodium.getDust(1))
             .itemOutputs(Materials.SodiumHydroxide.getDust(3))
             .fluidInputs(Materials.Water.getFluid(1000))
@@ -335,78 +334,78 @@ public class ChemicalBathRecipes implements Runnable {
 
         // Custom Sodium Persulfate Ore Processing Recipes
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Tantalite, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Tantalite, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Tantalite, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Tantalite, 1),
                 Materials.Tantalum.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .outputChances(10000, 3000, 4000)
             .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(chemicalBathRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Pyrolusite, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Pyrolusite, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pyrolusite, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pyrolusite, 1),
                 Materials.Manganese.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .outputChances(10000, 7000, 4000)
             .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(chemicalBathRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Quartzite, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Quartzite, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Quartzite, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Quartzite, 1),
                 Materials.CertusQuartz.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .outputChances(10000, 3000, 4000)
             .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(chemicalBathRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.CertusQuartz, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.CertusQuartz, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.CertusQuartz, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.CertusQuartz, 1),
                 Materials.Barium.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .outputChances(10000, 7000, 4000)
             .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(chemicalBathRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Bauxite, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Bauxite, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Bauxite, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Bauxite, 1),
                 Materials.Rutile.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .outputChances(10000, 5000, 4000)
             .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(chemicalBathRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Thorium, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Thorium, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Thorium, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Thorium, 1),
                 Materials.Uranium.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .outputChances(10000, 3000, 4000)
             .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(chemicalBathRecipes);
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Stibnite, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.Stibnite, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Stibnite, 1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Stibnite, 1),
                 Materials.Antimony.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .outputChances(10000, 5000, 4000)
             .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
             .duration(40 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java
index 3df932edd2..ab3cd43dce 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java
@@ -6,13 +6,13 @@ import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.recipe.RecipeMaps.chemicalReactorRecipes;
 import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
-import static gtPlusPlus.core.material.MISC_MATERIALS.CALCIUM_CHLORIDE;
-import static gtPlusPlus.core.material.MISC_MATERIALS.SODIUM_NITRATE;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.UniversalChemical;
+import static gtPlusPlus.core.material.MaterialMisc.CALCIUM_CHLORIDE;
+import static gtPlusPlus.core.material.MaterialMisc.SODIUM_NITRATE;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.init.Blocks;
@@ -22,18 +22,17 @@ import net.minecraftforge.fluids.Fluid;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
+import bartworks.system.material.WerkstoffLoader;
 import cpw.mods.fml.common.registry.GameRegistry;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsKevlar;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 import gtPlusPlus.core.item.ModItems;
 
 public class ChemicalRecipes implements Runnable {
@@ -48,30 +47,30 @@ public class ChemicalRecipes implements Runnable {
     }
 
     public void registerBoth() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.paper, 1), new ItemStack(Items.string, 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("dynamite", 1))
+            .itemOutputs(GTModHandler.getIC2Item("dynamite", 1))
             .fluidInputs(Materials.Glyceryl.getFluid(500))
             .duration(8 * SECONDS)
             .eut(4)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Indium, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Indium, 1))
             .fluidInputs(new FluidStack(ItemList.sIndiumConcentrate, 8000))
             .fluidOutputs(new FluidStack(ItemList.sLeadZincSolution, 8000))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 36),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Indium, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 36),
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Indium, 1))
             .fluidInputs(new FluidStack(ItemList.sIndiumConcentrate, 72000))
             .fluidOutputs(new FluidStack(ItemList.sLeadZincSolution, 72000))
             .duration(22 * SECONDS + 10 * TICKS)
@@ -80,22 +79,22 @@ public class ChemicalRecipes implements Runnable {
 
         // Platinum Group Sludge chain
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pentlandite, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.PlatinumGroupSludge, 1))
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pentlandite, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.PlatinumGroupSludge, 1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(new FluidStack(ItemList.sNickelSulfate, 2000))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.PlatinumGroupSludge, 1))
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.PlatinumGroupSludge, 1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(new FluidStack(ItemList.sBlueVitriol, 2000))
             .duration(2 * SECONDS + 10 * TICKS)
@@ -104,26 +103,26 @@ public class ChemicalRecipes implements Runnable {
 
         // Fe + 3HCl = FeCl3 + 3H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1), ItemList.Cell_Empty.get(3))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1), ItemList.Cell_Empty.get(3))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 3))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(3000))
             .fluidOutputs(Materials.IronIIIChloride.getFluid(1000))
             .duration(20 * SECONDS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedGold, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 8))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thaumium, 16))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedGold, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 8))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Thaumium, 16))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2coolant"), 1000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(GalaxySpace.ID, "item.UnknowCrystal", 4), Materials.Osmiridium.getDust(2))
             .itemOutputs(ItemList.Circuit_Chip_Stemcell.get(64))
             .fluidInputs(Materials.GrowthMediumSterilized.getFluid(1000))
@@ -132,10 +131,10 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LuV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Circuit_Chip_Stemcell.get(32),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CosmicNeutronium, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CosmicNeutronium, 4))
             .itemOutputs(ItemList.Circuit_Chip_Biocell.get(32))
             .fluidInputs(Materials.BioMediumSterilized.getFluid(2000))
             .fluidOutputs(getFluidStack("mutagen", 2000))
@@ -143,47 +142,45 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_UV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                new ItemStack(Items.sugar),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plastic, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.sugar), GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plastic, 1))
             .itemOutputs(ItemList.GelledToluene.get(2))
             .fluidInputs(new FluidStack(ItemList.sToluene, 133))
             .duration(7 * SECONDS)
             .eut(192)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Items.sugar, 9), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Items.sugar, 9), GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
             .itemOutputs(ItemList.GelledToluene.get(18))
             .fluidInputs(new FluidStack(ItemList.sToluene, 1197))
             .duration(1 * MINUTES + 3 * SECONDS)
             .eut(192)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.GelledToluene.get(4), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.GelledToluene.get(4), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(Blocks.tnt, 1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(250))
             .duration(10 * SECONDS)
             .eut(24)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.GelledToluene.get(4), GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_ModHandler.getIC2Item("industrialTnt", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.GelledToluene.get(4), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTModHandler.getIC2Item("industrialTnt", 1))
             .fluidInputs(new FluidStack(ItemList.sNitrationMixture, 200))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(150))
             .duration(4 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
                 Materials.Empty.getCells(1))
             .fluidInputs(Materials.NatruralGas.getGas(16000))
             .fluidOutputs(Materials.Gas.getGas(16000))
@@ -191,23 +188,23 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NatruralGas, 2),
-                GT_Utility.getIntegratedCircuit(4))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 2))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.NatruralGas, 2),
+                GTUtility.getIntegratedCircuit(4))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 2))
             .fluidInputs(Materials.Hydrogen.getGas(250))
             .fluidOutputs(Materials.HydricSulfide.getGas(125))
             .duration(1 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
                 Materials.Empty.getCells(1))
             .fluidInputs(Materials.SulfuricGas.getGas(16000))
             .fluidOutputs(Materials.Gas.getGas(16000))
@@ -215,23 +212,23 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricGas, 2),
-                GT_Utility.getIntegratedCircuit(4))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 2))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricGas, 2),
+                GTUtility.getIntegratedCircuit(4))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 2))
             .fluidInputs(Materials.Hydrogen.getGas(250))
             .fluidOutputs(Materials.HydricSulfide.getGas(125))
             .duration(1 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
                 Materials.Empty.getCells(1))
             .fluidInputs(Materials.SulfuricNaphtha.getFluid(12000))
             .fluidOutputs(Materials.Naphtha.getFluid(12000))
@@ -239,23 +236,23 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricNaphtha, 3),
-                GT_Utility.getIntegratedCircuit(4))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Naphtha, 3))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricNaphtha, 3),
+                GTUtility.getIntegratedCircuit(4))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Naphtha, 3))
             .fluidInputs(Materials.Hydrogen.getGas(500))
             .fluidOutputs(Materials.HydricSulfide.getGas(250))
             .duration(2 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
                 Materials.Empty.getCells(1))
             .fluidInputs(Materials.SulfuricLightFuel.getFluid(12000))
             .fluidOutputs(Materials.LightFuel.getFluid(12000))
@@ -263,23 +260,23 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricLightFuel, 3),
-                GT_Utility.getIntegratedCircuit(4))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 3))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricLightFuel, 3),
+                GTUtility.getIntegratedCircuit(4))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 3))
             .fluidInputs(Materials.Hydrogen.getGas(500))
             .fluidOutputs(Materials.HydricSulfide.getGas(250))
             .duration(2 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
                 Materials.Empty.getCells(1))
             .fluidInputs(Materials.SulfuricHeavyFuel.getFluid(8000))
             .fluidOutputs(Materials.HeavyFuel.getFluid(8000))
@@ -287,285 +284,285 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricHeavyFuel, 1),
-                GT_Utility.getIntegratedCircuit(4))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricHeavyFuel, 1),
+                GTUtility.getIntegratedCircuit(4))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1))
             .fluidInputs(Materials.Hydrogen.getGas(250))
             .fluidOutputs(Materials.HydricSulfide.getGas(125))
             .duration(1 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Potassium, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Potassium, 1))
             .fluidInputs(Materials.Naphtha.getFluid(576))
             .fluidOutputs(Materials.Polycaprolactam.getMolten(1296))
             .duration(32 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 9),
-                GT_Utility.getIntegratedCircuit(9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 9),
+                GTUtility.getIntegratedCircuit(9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1))
             .fluidInputs(Materials.Naphtha.getFluid(5184))
             .fluidOutputs(Materials.Polycaprolactam.getMolten(11664))
             .duration(4 * MINUTES + 48 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        for (Fluid tFluid : new Fluid[] { FluidRegistry.WATER, GT_ModHandler.getDistilledWater(1L)
+        for (Fluid tFluid : new Fluid[] { FluidRegistry.WATER, GTModHandler.getDistilledWater(1L)
             .getFluid() }) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(1))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(1))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(4))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(4))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(4))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(4))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(20 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(3))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(UniversalChemical);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
                 .itemOutputs(ItemList.IC2_Fertilizer.get(2))
                 .fluidInputs(new FluidStack(tFluid, 1000))
                 .duration(10 * SECONDS)
@@ -575,99 +572,99 @@ public class ChemicalRecipes implements Runnable {
 
         // 3quartz dust + Na + H2O = 3quartz gem (Na loss
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 3))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 3))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Quartzite, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Quartzite, 3))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 3))
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 3))
+            .fluidInputs(GTModHandler.getDistilledWater(1000))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 3))
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 3))
+            .fluidInputs(GTModHandler.getDistilledWater(1000))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Quartzite, 3))
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Quartzite, 3))
+            .fluidInputs(GTModHandler.getDistilledWater(1000))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
         // 3UO2 + 4Al = 3U + 2Al2O3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uraninite, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uraninite, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 10))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 10))
             .duration(50 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
         // UO2 + 2Mg = U + 2MgO
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uraninite, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uraninite, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
             .duration(50 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
         // Ca + C + 3O = CaCO3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 5))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 5))
             .fluidInputs(Materials.Oxygen.getGas(3000))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -675,8 +672,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C + 4H = CH4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Carbon.getDust(1), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Hydrogen.getGas(4000))
             .fluidOutputs(Materials.Methane.getGas(1000))
             .duration(10 * SECONDS)
@@ -685,31 +682,31 @@ public class ChemicalRecipes implements Runnable {
 
         // TiO2 + 2C + 4Cl = TiCl4 + 2CO
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Carbon, 2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.CarbonMonoxide, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Carbon, 2))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.CarbonMonoxide, 2))
             .fluidInputs(Materials.Chlorine.getGas(4000))
             .fluidOutputs(Materials.Titaniumtetrachloride.getFluid(1000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 2))
             .fluidInputs(Materials.Chlorine.getGas(4000))
             .fluidOutputs(Materials.Titaniumtetrachloride.getFluid(1000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 2))
             .fluidInputs(Materials.Chlorine.getGas(4000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(2000), Materials.Titaniumtetrachloride.getFluid(1000))
             .duration(20 * SECONDS)
@@ -718,32 +715,32 @@ public class ChemicalRecipes implements Runnable {
 
         // 4Na + 2MgCl2 = 2Mg + 4NaCl
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesiumchloride, 6))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesiumchloride, 6))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 8))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 8))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
         // rubber
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
             .fluidOutputs(Materials.Rubber.getMolten(1296))
             .duration(30 * SECONDS)
             .eut(16)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Sulfur, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Sulfur, 1))
             .fluidOutputs(Materials.Rubber.getMolten(144))
             .duration(5 * SECONDS)
             .eut(16)
@@ -751,54 +748,54 @@ public class ChemicalRecipes implements Runnable {
 
         // vanilla recipe
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 8),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 8),
                 new ItemStack(Items.melon, 1, 32767))
             .itemOutputs(new ItemStack(Items.speckled_melon, 1, 0))
             .duration(50)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 8),
+                GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 8),
                 new ItemStack(Items.carrot, 1, 32767))
             .itemOutputs(new ItemStack(Items.golden_carrot, 1, 0))
             .duration(50)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 8),
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 8),
                 new ItemStack(Items.apple, 1, 32767))
             .itemOutputs(new ItemStack(Items.golden_apple, 1, 0))
             .duration(50)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Gold, 8),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Gold, 8),
                 new ItemStack(Items.apple, 1, 32767))
             .itemOutputs(new ItemStack(Items.golden_apple, 1, 1))
             .duration(50)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderEye, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.EnderEye, 1))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
                 new ItemStack(Items.slime_ball, 1, 32767))
             .itemOutputs(new ItemStack(Items.magma_cream, 1, 0))
             .duration(50)
@@ -807,11 +804,11 @@ public class ChemicalRecipes implements Runnable {
 
         // 1/9U +Air ==Pu== 0.1Rn
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Plutonium, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 8))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Plutonium, 8),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 8))
             .fluidInputs(Materials.Air.getGas(1000))
             .fluidOutputs(Materials.Radon.getGas(100))
             .duration(10 * MINUTES)
@@ -821,59 +818,59 @@ public class ChemicalRecipes implements Runnable {
         // Silicon Line
         // SiO2 + 2Mg = 2MgO + Si
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 6),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 6),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
         // 3SiF4 + 4Al = 3Si + 4AlF3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.AluminiumFluoride, 16))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.AluminiumFluoride, 16))
             .fluidInputs(Materials.SiliconTetrafluoride.getGas(3000))
             .duration(30 * SECONDS)
             .eut(30)
@@ -881,40 +878,40 @@ public class ChemicalRecipes implements Runnable {
 
         // SiO2 + 4HF = SiF4 + 2H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3),
+                GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
             .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
             .duration(15 * SECONDS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+                GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
             .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
             .duration(15 * SECONDS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+                GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
             .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
             .duration(15 * SECONDS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 6),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 6),
+                GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
             .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
             .duration(15 * SECONDS)
@@ -923,13 +920,13 @@ public class ChemicalRecipes implements Runnable {
 
         // 4Na + SiCl4 = 4NaCl + Si
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 8))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 8))
             .fluidInputs(Materials.SiliconTetrachloride.getFluid(1000))
             .duration(5 * SECONDS)
             .eut(30)
@@ -937,22 +934,22 @@ public class ChemicalRecipes implements Runnable {
 
         // HSiCl3 + 2H = 3HCl + Si
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(2))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(2))
             .fluidInputs(Materials.Trichlorosilane.getFluid(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
             .duration(15 * SECONDS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Trichlorosilane, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(1))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Trichlorosilane, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Hydrogen.getGas(2000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
             .duration(15 * SECONDS)
@@ -961,9 +958,9 @@ public class ChemicalRecipes implements Runnable {
 
         // 4HSiCl3 = 3SiCl4 + SiH4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Cell_Empty.get(1), GT_Utility.getIntegratedCircuit(2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Cell_Empty.get(1), GTUtility.getIntegratedCircuit(2))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1))
             .fluidInputs(Materials.Trichlorosilane.getFluid(4000))
             .fluidOutputs(Materials.SiliconTetrachloride.getFluid(3000))
             .duration(12 * SECONDS)
@@ -972,9 +969,9 @@ public class ChemicalRecipes implements Runnable {
 
         // SiH4 = Si + 4H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1))
             .fluidInputs(Materials.Silane.getGas(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
             .duration(15 * SECONDS)
@@ -983,11 +980,11 @@ public class ChemicalRecipes implements Runnable {
 
         // Ca + 2H = CaH2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calciumhydride, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calciumhydride, 3))
             .fluidInputs(Materials.Hydrogen.getGas(2000))
             .duration(20 * SECONDS)
             .eut(30)
@@ -995,10 +992,10 @@ public class ChemicalRecipes implements Runnable {
 
         // Si + 4Cl = SiCl4
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.Chlorine.getGas(4000))
             .fluidOutputs(Materials.SiliconTetrachloride.getFluid(1000))
             .duration(20 * SECONDS)
@@ -1007,7 +1004,7 @@ public class ChemicalRecipes implements Runnable {
 
         // 2Na + S = Na2S
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Sodium.getDust(2), Materials.Sulfur.getDust(1))
             .itemOutputs(Materials.SodiumSulfide.getDust(3))
             .duration(60)
@@ -1016,7 +1013,7 @@ public class ChemicalRecipes implements Runnable {
 
         // H2S + H2O + (O2) = 0.5H2SO4(Diluted) ( S loss
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.HydricSulfide.getCells(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
@@ -1025,7 +1022,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Water.getCells(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.HydricSulfide.getGas(1000))
@@ -1036,29 +1033,29 @@ public class ChemicalRecipes implements Runnable {
 
         // Ni + 4CO = Ni(CO)4
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.CarbonMonoxide, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.CarbonMonoxide, 4))
             .itemOutputs(ItemList.Cell_Empty.get(4))
             .fluidOutputs(MaterialsKevlar.NickelTetracarbonyl.getFluid(1000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.CarbonMonoxide.getGas(4000))
             .fluidOutputs(MaterialsKevlar.NickelTetracarbonyl.getFluid(1000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1), ItemList.Cell_Empty.get(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.NickelTetracarbonyl, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1), ItemList.Cell_Empty.get(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.NickelTetracarbonyl, 1))
             .fluidInputs(Materials.CarbonMonoxide.getGas(4000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_EV)
@@ -1066,10 +1063,10 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H4O + H2O = C2H6O2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(MaterialsKevlar.Ethyleneglycol.getFluid(1000))
@@ -1079,10 +1076,10 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H4 + O = C2H4O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ethylene, 2),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Ethylene, 2),
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.Cell_Empty.get(2))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(MaterialsKevlar.Acetaldehyde.getGas(1000))
@@ -1090,10 +1087,10 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Ethylene.getGas(2000))
             .fluidOutputs(MaterialsKevlar.Acetaldehyde.getGas(1000))
@@ -1103,12 +1100,12 @@ public class ChemicalRecipes implements Runnable {
 
         // NiAl3 + 2NaOH + 2H2O = NiAl + 2NaAlO2 + 6H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, MaterialsKevlar.NickelAluminide, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 6))
+                GTOreDictUnificator.get(OrePrefixes.ingot, MaterialsKevlar.NickelAluminide, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 6))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RaneyNickelActivated, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RaneyNickelActivated, 2),
                 Materials.SodiumAluminate.getDust(8))
             .fluidInputs(Materials.Water.getFluid(2000))
             .fluidOutputs(Materials.Hydrogen.getGas(6000))
@@ -1118,22 +1115,22 @@ public class ChemicalRecipes implements Runnable {
 
         // Cu + O = CuO
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 2),
                 ItemList.Cell_Empty.get(1))
             .duration(5 * SECONDS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 2))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(5 * SECONDS)
             .eut(30)
@@ -1141,22 +1138,22 @@ public class ChemicalRecipes implements Runnable {
 
         // 2Bi + 3O = Bi2O3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 4),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 6))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 4),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 6))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 10),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 10),
                 ItemList.Cell_Empty.get(6))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 4),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 10))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 4),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 10))
             .fluidInputs(Materials.Oxygen.getGas(6000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_MV)
@@ -1164,21 +1161,21 @@ public class ChemicalRecipes implements Runnable {
 
         // C4H6O2 + CNH5 = C5H9NO + H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Methylamine, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.GammaButyrolactone, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Methylamine, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.GammaButyrolactone, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.NMethylIIPyrrolidone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.NMethylIIPyrrolidone, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8),
+                GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.Chlorine.getGas(16000))
             .fluidOutputs(MaterialsKevlar.SulfurDichloride.getFluid(8000))
             .duration(40 * SECONDS)
@@ -1187,12 +1184,12 @@ public class ChemicalRecipes implements Runnable {
 
         // SCl2 + SO3 = SO2 + SOCl2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfurTrioxide, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfurTrioxide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.ThionylChloride, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.ThionylChloride, 1),
                 ItemList.Cell_Empty.get(1))
             .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
             .duration(7 * SECONDS + 10 * TICKS)
@@ -1201,11 +1198,11 @@ public class ChemicalRecipes implements Runnable {
 
         // C8H10 + 6O =CoC22H14O4= C8H6O4 + 2H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.IVDimethylbenzene, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIINaphthenate, 41))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.TerephthalicAcid, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.IVDimethylbenzene, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIINaphthenate, 41))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.TerephthalicAcid, 1))
             .fluidInputs(Materials.Oxygen.getGas(6000))
             .fluidOutputs(Materials.Water.getFluid(2000))
             .duration(7 * SECONDS + 10 * TICKS)
@@ -1214,8 +1211,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2CH4 + C6H6 = C8H10 + 4H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methane.getCells(2), GT_Utility.getIntegratedCircuit(13))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methane.getCells(2), GTUtility.getIntegratedCircuit(13))
             .itemOutputs(MaterialsKevlar.IIIDimethylbenzene.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
@@ -1223,8 +1220,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(14))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Benzene.getCells(1), GTUtility.getIntegratedCircuit(14))
             .itemOutputs(MaterialsKevlar.IIIDimethylbenzene.getCells(1))
             .fluidInputs(Materials.Methane.getGas(2000))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
@@ -1234,8 +1231,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2CH4 + C6H6 = C8H10 + 4H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methane.getCells(2), GT_Utility.getIntegratedCircuit(15))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methane.getCells(2), GTUtility.getIntegratedCircuit(15))
             .itemOutputs(MaterialsKevlar.IVDimethylbenzene.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
@@ -1243,8 +1240,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(16))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Benzene.getCells(1), GTUtility.getIntegratedCircuit(16))
             .itemOutputs(MaterialsKevlar.IVDimethylbenzene.getCells(1))
             .fluidInputs(Materials.Methane.getGas(2000))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
@@ -1252,16 +1249,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MaterialsKevlar.CobaltIIHydroxide.getDust(5), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(MaterialsKevlar.CobaltIIHydroxide.getDust(5), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41))
             .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(1000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MaterialsKevlar.CobaltIIAcetate.getDust(15), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(MaterialsKevlar.CobaltIIAcetate.getDust(15), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41))
             .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(1000))
             .fluidOutputs(Materials.AceticAcid.getFluid(1500))
@@ -1271,18 +1268,18 @@ public class ChemicalRecipes implements Runnable {
 
         // Co + 2HNO3 = Co(NO3)2 + 2H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Cobalt.getDust(1), Materials.NitricAcid.getCells(2))
             .itemOutputs(
                 MaterialsKevlar.CobaltIINitrate.getDust(9),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
         // Co(NO3)2 + 2KOH = CoH2O2 + 2KNO3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 MaterialsKevlar.CobaltIINitrate.getDust(9),
                 getModItem(NewHorizonsCoreMod.ID, "item.PotassiumHydroxideDust", 6L, 0))
@@ -1293,7 +1290,7 @@ public class ChemicalRecipes implements Runnable {
 
         // CoO + 2C2H4O2 = CoC4H6O4 + 2H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.CobaltOxide.getDust(2), Materials.AceticAcid.getCells(2))
             .itemOutputs(MaterialsKevlar.CobaltIIAcetate.getDust(15), ItemList.Cell_Empty.get(2))
             .fluidOutputs(Materials.Water.getFluid(2000))
@@ -1301,16 +1298,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Phosphorus.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Phosphorus.getDust(1), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Chlorine.getGas(3000))
             .fluidOutputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(1000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Phosphorus.getDust(9), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Phosphorus.getDust(9), GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.Chlorine.getGas(27000))
             .fluidOutputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(9000))
             .duration(1 * MINUTES + 15 * SECONDS)
@@ -1319,8 +1316,8 @@ public class ChemicalRecipes implements Runnable {
 
         // Na + H = NaH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Sodium.getDust(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Sodium.getDust(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(MaterialsKevlar.SodiumHydride.getDust(2))
             .fluidInputs(Materials.Hydrogen.getGas(1000))
             .duration(10 * SECONDS)
@@ -1329,8 +1326,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CH3ONa + H2O = CH4O + NaOH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(MaterialsKevlar.SodiumMethoxide.getDust(6), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(MaterialsKevlar.SodiumMethoxide.getDust(6), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.SodiumHydroxide.getDust(3))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
@@ -1340,8 +1337,8 @@ public class ChemicalRecipes implements Runnable {
 
         // K + HNO3 = KNO3 + H (not real, but gameplay
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Potassium.getDust(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Potassium.getDust(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Saltpeter.getDust(5))
             .fluidInputs(Materials.NitricAcid.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(1000))
@@ -1351,8 +1348,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CH3COOH + CH3OH = CH3COOCH3 + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.AceticAcid.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
@@ -1360,8 +1357,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(1000))
             .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
@@ -1369,8 +1366,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.AceticAcid.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
@@ -1378,8 +1375,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(1000))
             .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
@@ -1387,8 +1384,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.AceticAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.MethylAcetate.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -1396,8 +1393,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.MethylAcetate.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -1405,16 +1402,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.AceticAcid.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.MethylAcetate.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .duration(12 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.MethylAcetate.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(1000))
             .duration(12 * SECONDS)
@@ -1423,16 +1420,16 @@ public class ChemicalRecipes implements Runnable {
 
         // CO and CO2 recipes
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Carbon.getDust(1), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
             .duration(2 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getGems(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getGems(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
@@ -1440,8 +1437,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getDust(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
@@ -1449,8 +1446,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getGems(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getGems(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
@@ -1458,8 +1455,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getDust(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
@@ -1467,16 +1464,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Carbon.getDust(1), GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
             .duration(2 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getGems(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getGems(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
@@ -1484,8 +1481,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getDust(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getDust(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
@@ -1493,8 +1490,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getGems(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getGems(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
@@ -1502,8 +1499,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getDust(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getDust(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Ash.getDustTiny(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
@@ -1511,7 +1508,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Carbon.getDust(1))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(2000))
@@ -1519,8 +1516,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getGems(9), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getGems(9), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(9000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
@@ -1528,8 +1525,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getDust(9), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getDust(9), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(9000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
@@ -1537,8 +1534,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getGems(9), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getGems(9), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(9000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
@@ -1546,8 +1543,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getDust(9), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getDust(9), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(9000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
@@ -1555,8 +1552,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getGems(9), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getGems(9), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(18000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
@@ -1564,8 +1561,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Coal.getDust(9), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Coal.getDust(9), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(18000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
@@ -1573,8 +1570,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getGems(9), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getGems(9), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(18000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
@@ -1582,8 +1579,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Charcoal.getDust(9), GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Charcoal.getDust(9), GTUtility.getIntegratedCircuit(8))
             .itemOutputs(Materials.Ash.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(18000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
@@ -1593,8 +1590,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CO + 4H = CH3OH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.CarbonMonoxide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(4000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
@@ -1602,8 +1599,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(4), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(4), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(4))
             .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
@@ -1611,16 +1608,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.CarbonMonoxide.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Methanol.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(4000))
             .duration(6 * SECONDS)
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(4), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(4), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Methanol.getCells(1), Materials.Empty.getCells(3))
             .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
             .duration(6 * SECONDS)
@@ -1629,8 +1626,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CO2 + 6H = CH3OH + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.CarbonDioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.CarbonDioxide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(6000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
@@ -1638,8 +1635,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(6), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(6), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(5))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
@@ -1647,8 +1644,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.CarbonDioxide.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.CarbonDioxide.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(6000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
@@ -1656,8 +1653,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(6), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(6), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(6))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
@@ -1665,16 +1662,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.CarbonDioxide.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.CarbonDioxide.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Methanol.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(6000))
             .duration(6 * SECONDS)
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(6), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(6), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Methanol.getCells(1), Materials.Empty.getCells(5))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
             .duration(6 * SECONDS)
@@ -1683,8 +1680,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CH3OH + CO = CH3COOH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
             .fluidOutputs(Materials.AceticAcid.getFluid(1000))
@@ -1692,8 +1689,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.CarbonMonoxide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .fluidOutputs(Materials.AceticAcid.getFluid(1000))
@@ -1701,16 +1698,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.AceticAcid.getCells(1))
             .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.CarbonMonoxide.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.AceticAcid.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .duration(15 * SECONDS)
@@ -1719,8 +1716,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CH2CH2 + 2O = CH3COOH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethylene.getCells(1), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.AceticAcid.getFluid(1000))
@@ -1728,8 +1725,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(2), GTUtility.getIntegratedCircuit(9))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidInputs(Materials.Ethylene.getGas(1000))
             .fluidOutputs(Materials.AceticAcid.getFluid(1000))
@@ -1737,16 +1734,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(19))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethylene.getCells(1), GTUtility.getIntegratedCircuit(19))
             .itemOutputs(Materials.AceticAcid.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(19))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(2), GTUtility.getIntegratedCircuit(19))
             .itemOutputs(Materials.AceticAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ethylene.getGas(1000))
             .duration(5 * SECONDS)
@@ -1755,7 +1752,7 @@ public class ChemicalRecipes implements Runnable {
 
         // O + C2H4O2 + C2H4 = C4H6O2 + H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ethylene.getCells(1), Materials.AceticAcid.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
@@ -1764,7 +1761,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.AceticAcid.getCells(1), Materials.Oxygen.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ethylene.getGas(1000))
@@ -1773,7 +1770,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Oxygen.getCells(1), Materials.Ethylene.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(1000))
@@ -1784,8 +1781,8 @@ public class ChemicalRecipes implements Runnable {
 
         // Ethanol -> Ethylene (Intended loss for Sulfuric Acid)
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethanol.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ethylene.getCells(1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
@@ -1793,8 +1790,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfuricAcid.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ethylene.getCells(1))
             .fluidInputs(Materials.Ethanol.getFluid(1000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
@@ -1802,8 +1799,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethanol.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(Materials.Ethylene.getGas(1000))
@@ -1811,8 +1808,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfuricAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
             .fluidInputs(Materials.Ethanol.getFluid(1000))
             .fluidOutputs(Materials.Ethylene.getGas(1000))
@@ -1822,8 +1819,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H2O + Na = NaOH + H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Sodium.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Sodium.getDust(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.SodiumHydroxide.getDust(3))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(1000))
@@ -1833,8 +1830,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H + Cl = HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -1842,8 +1839,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -1851,16 +1848,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(1000))
             .duration(3 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(1000))
             .duration(3 * SECONDS)
@@ -1869,8 +1866,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C3H6 + 2Cl = HCl + C3H5Cl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Propene.getGas(1000))
             .fluidOutputs(Materials.AllylChloride.getFluid(1000))
@@ -1878,8 +1875,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Propene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Propene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.AllylChloride.getFluid(1000))
@@ -1887,8 +1884,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.AllylChloride.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Propene.getGas(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -1896,8 +1893,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Propene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Propene.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.AllylChloride.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -1907,8 +1904,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2Cl + H2O = HCl + HClO (Intended loss)
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.HypochlorousAcid.getFluid(1000))
@@ -1916,8 +1913,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.HypochlorousAcid.getFluid(1000))
@@ -1925,8 +1922,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.HypochlorousAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
@@ -1934,8 +1931,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.HypochlorousAcid.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
@@ -1945,7 +1942,7 @@ public class ChemicalRecipes implements Runnable {
 
         // HClO + NaOH + C3H5Cl = C3H5ClO + NaCl·H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.HypochlorousAcid.getCells(1), Materials.SodiumHydroxide.getDust(3))
             .itemOutputs(Materials.SaltWater.getCells(1))
             .fluidInputs(Materials.AllylChloride.getFluid(1000))
@@ -1954,7 +1951,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(3), Materials.AllylChloride.getCells(1))
             .itemOutputs(Materials.SaltWater.getCells(1))
             .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
@@ -1963,7 +1960,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Water.getCells(2))
             .fluidInputs(Materials.Glycerol.getFluid(1000))
@@ -1972,7 +1969,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Glycerol.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Water.getCells(2))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -1981,8 +1978,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Epichlorohydrin.getCells(1))
             .fluidInputs(Materials.Glycerol.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(2000))
@@ -1990,8 +1987,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Glycerol.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Epichlorohydrin.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(2000))
@@ -1999,8 +1996,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Glycerol.getFluid(1000))
             .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
@@ -2008,8 +2005,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Glycerol.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
@@ -2017,16 +2014,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Epichlorohydrin.getCells(1))
             .fluidInputs(Materials.Glycerol.getFluid(1000))
             .duration(24 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Glycerol.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Epichlorohydrin.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .duration(24 * SECONDS)
@@ -2035,7 +2032,7 @@ public class ChemicalRecipes implements Runnable {
 
         // P4O10 + 6H2O = 4H3PO4
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PhosphorousPentoxide.getDust(14))
             .fluidInputs(Materials.Water.getFluid(6000))
             .fluidOutputs(Materials.PhosphoricAcid.getFluid(4000))
@@ -2045,8 +2042,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C9H12 + 2O = C6H6O + C3H6O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Cumene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Cumene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Phenol.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.Acetone.getFluid(1000))
@@ -2054,8 +2051,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Phenol.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Cumene.getFluid(1000))
             .fluidOutputs(Materials.Acetone.getFluid(1000))
@@ -2063,8 +2060,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Cumene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Cumene.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Acetone.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.Phenol.getFluid(1000))
@@ -2072,8 +2069,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Acetone.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Cumene.getFluid(1000))
             .fluidOutputs(Materials.Phenol.getFluid(1000))
@@ -2083,7 +2080,7 @@ public class ChemicalRecipes implements Runnable {
 
         // C15H16O2 + 2C3H5ClO + 2NaOH = C15H14O2(C3H5O)2 + 2NaCl·H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(6), Materials.Epichlorohydrin.getCells(2))
             .itemOutputs(Materials.SaltWater.getCells(2))
             .fluidInputs(Materials.BisphenolA.getFluid(1000))
@@ -2094,8 +2091,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CH4O + HCl = CH3Cl + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .fluidOutputs(Materials.Chloromethane.getGas(1000))
@@ -2103,8 +2100,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .fluidOutputs(Materials.Chloromethane.getGas(1000))
@@ -2112,8 +2109,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chloromethane.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2121,8 +2118,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chloromethane.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2130,8 +2127,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .fluidOutputs(Materials.Chloromethane.getGas(1000))
@@ -2139,8 +2136,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .fluidOutputs(Materials.Chloromethane.getGas(1000))
@@ -2148,24 +2145,24 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Chloromethane.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Chloromethane.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(1000))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Methane.getGas(1000))
             .fluidOutputs(Materials.Chloromethane.getGas(1000))
@@ -2173,8 +2170,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methane.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methane.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.Chloromethane.getGas(1000))
@@ -2182,8 +2179,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chloromethane.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Methane.getGas(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -2191,8 +2188,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methane.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methane.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chloromethane.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -2202,8 +2199,8 @@ public class ChemicalRecipes implements Runnable {
 
         // Cl6 + CH4 = CHCl3 + 3HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(6), GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(6), GTUtility.getIntegratedCircuit(3))
             .itemOutputs(Materials.HydrochloricAcid.getCells(3), Materials.Empty.getCells(3))
             .fluidInputs(Materials.Methane.getGas(1000))
             .fluidOutputs(Materials.Chloroform.getFluid(1000))
@@ -2211,8 +2208,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(6), GT_Utility.getIntegratedCircuit(13))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(6), GTUtility.getIntegratedCircuit(13))
             .itemOutputs(Materials.Chloroform.getCells(1), Materials.Empty.getCells(5))
             .fluidInputs(Materials.Methane.getGas(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
@@ -2220,8 +2217,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methane.getCells(1), GT_Utility.getIntegratedCircuit(13))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methane.getCells(1), GTUtility.getIntegratedCircuit(13))
             .itemOutputs(Materials.Chloroform.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(6000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
@@ -2231,8 +2228,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H + F = HF
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Fluorine.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Fluorine.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(1000))
             .fluidOutputs(Materials.HydrofluoricAcid.getFluid(1000))
@@ -2240,8 +2237,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Fluorine.getGas(1000))
             .fluidOutputs(Materials.HydrofluoricAcid.getFluid(1000))
@@ -2249,16 +2246,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Fluorine.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Fluorine.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.HydrofluoricAcid.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(1000))
             .duration(3 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.HydrofluoricAcid.getCells(1))
             .fluidInputs(Materials.Fluorine.getGas(1000))
             .duration(3 * SECONDS)
@@ -2267,7 +2264,7 @@ public class ChemicalRecipes implements Runnable {
 
         // 4HF + 2CHCl3 = C2F4 + 6HCl
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Chloroform.getCells(2), Materials.HydrofluoricAcid.getCells(4))
             .itemOutputs(Materials.HydrochloricAcid.getCells(6))
             .fluidOutputs(Materials.Tetrafluoroethylene.getGas(1000))
@@ -2275,7 +2272,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Chloroform.getCells(2), Materials.Empty.getCells(4))
             .itemOutputs(Materials.HydrochloricAcid.getCells(6))
             .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
@@ -2284,7 +2281,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.HydrofluoricAcid.getCells(4), Materials.Empty.getCells(2))
             .itemOutputs(Materials.HydrochloricAcid.getCells(6))
             .fluidInputs(Materials.Chloroform.getFluid(2000))
@@ -2293,8 +2290,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrofluoricAcid.getCells(4), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrofluoricAcid.getCells(4), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Tetrafluoroethylene.getCells(1), Materials.Empty.getCells(3))
             .fluidInputs(Materials.Chloroform.getFluid(2000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(6000))
@@ -2302,8 +2299,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chloroform.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chloroform.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Tetrafluoroethylene.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(6000))
@@ -2313,16 +2310,16 @@ public class ChemicalRecipes implements Runnable {
 
         // Si + 2CH3Cl = C2H6Cl2Si
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Silicon.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Silicon.getDust(1), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Chloromethane.getGas(2000))
             .fluidOutputs(Materials.Dimethyldichlorosilane.getFluid(1000))
             .duration(12 * SECONDS)
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
@@ -2330,8 +2327,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Dimethyldichlorosilane.getFluid(1000))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
@@ -2339,23 +2336,23 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.DilutedHydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(12 * SECONDS)
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.DilutedHydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Dimethyldichlorosilane.getFluid(1000))
             .duration(12 * SECONDS)
             .eut(96)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Polydimethylsiloxane.getDust(9), Materials.Sulfur.getDust(1))
             .fluidOutputs(Materials.Silicone.getMolten(1296))
             .duration(30 * SECONDS)
@@ -2365,8 +2362,8 @@ public class ChemicalRecipes implements Runnable {
         // Potassium Nitride
         // K + HNO3 = KNO3 + H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Potassium.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Potassium.getDust(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.PotassiumNitrade.getDust(5))
             .fluidInputs(Materials.NitricAcid.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(1000))
@@ -2377,8 +2374,8 @@ public class ChemicalRecipes implements Runnable {
         // Chromium Trioxide
         // CrO2 + O = CrO3
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.ChromiumDioxide.getDust(3), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.ChromiumDioxide.getDust(3), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.ChromiumTrioxide.getDust(4))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(5 * SECONDS)
@@ -2388,8 +2385,8 @@ public class ChemicalRecipes implements Runnable {
         // Nitrochlorobenzene
         // C6H5Cl + HNO3 = C6H4ClNO2 + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorobenzene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Nitrochlorobenzene.getCells(1))
             .fluidInputs(Materials.NitrationMixture.getFluid(2000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
@@ -2397,8 +2394,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorobenzene.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
             .fluidInputs(Materials.NitrationMixture.getFluid(2000))
             .fluidOutputs(Materials.Nitrochlorobenzene.getFluid(1000))
@@ -2406,8 +2403,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrationMixture.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrationMixture.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Nitrochlorobenzene.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
@@ -2415,8 +2412,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrationMixture.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrationMixture.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
             .fluidOutputs(Materials.Nitrochlorobenzene.getFluid(1000))
@@ -2426,8 +2423,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H6 + 2CH4 = C8H10 + 4H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methane.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methane.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Dimethylbenzene.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
@@ -2435,8 +2432,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Benzene.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Dimethylbenzene.getCells(1))
             .fluidInputs(Materials.Methane.getGas(2000))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
@@ -2447,7 +2444,7 @@ public class ChemicalRecipes implements Runnable {
         // Phthalic Acid
         // C8H10 + 6O =K2Cr2O7= C8H6O4 + 2H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Dimethylbenzene.getCells(1), Materials.Potassiumdichromate.getDustTiny(1))
             .itemOutputs(Materials.PhthalicAcid.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(6000))
@@ -2456,7 +2453,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Oxygen.getCells(6), Materials.Potassiumdichromate.getDustTiny(1))
             .itemOutputs(Materials.PhthalicAcid.getCells(1), ItemList.Cell_Empty.get(5))
             .fluidInputs(Materials.Dimethylbenzene.getFluid(1000))
@@ -2465,7 +2462,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Dimethylbenzene.getCells(9), Materials.Potassiumdichromate.getDust(1))
             .itemOutputs(Materials.PhthalicAcid.getCells(9))
             .fluidInputs(Materials.Oxygen.getGas(54000))
@@ -2474,7 +2471,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Oxygen.getCells(54), Materials.Potassiumdichromate.getDust(1))
             .itemOutputs(Materials.PhthalicAcid.getCells(9), ItemList.Cell_Empty.get(45))
             .fluidInputs(Materials.Dimethylbenzene.getFluid(9000))
@@ -2487,16 +2484,16 @@ public class ChemicalRecipes implements Runnable {
         // But they are kept in gamewise, too much existed setup will be broken.
         // Dichlorobenzidine
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Copper.getDustTiny(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Copper.getDustTiny(1), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Nitrochlorobenzene.getFluid(2000))
             .fluidOutputs(Materials.Dichlorobenzidine.getFluid(1000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Copper.getDust(1), GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Copper.getDust(1), GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.Nitrochlorobenzene.getFluid(18000))
             .fluidOutputs(Materials.Dichlorobenzidine.getFluid(9000))
             .duration(1 * MINUTES + 30 * SECONDS)
@@ -2505,7 +2502,7 @@ public class ChemicalRecipes implements Runnable {
 
         // Diphenyl Isophthalate
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PhthalicAcid.getCells(1), Materials.SulfuricAcid.getCells(1))
             .itemOutputs(Materials.Diphenylisophthalate.getCells(1), ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Phenol.getFluid(2000))
@@ -2514,7 +2511,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_IV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PhthalicAcid.getCells(1), Materials.Phenol.getCells(2))
             .itemOutputs(Materials.Diphenylisophthalate.getCells(1), ItemList.Cell_Empty.get(2))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
@@ -2523,7 +2520,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_IV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SulfuricAcid.getCells(1), Materials.Phenol.getCells(2))
             .itemOutputs(Materials.Diphenylisophthalate.getCells(1), ItemList.Cell_Empty.get(2))
             .fluidInputs(Materials.PhthalicAcid.getFluid(1000))
@@ -2534,7 +2531,7 @@ public class ChemicalRecipes implements Runnable {
 
         // Diaminobenzidin
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ammonia.getCells(2), Materials.Zinc.getDust(1))
             .itemOutputs(Materials.Diaminobenzidin.getCells(1), ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Dichlorobenzidine.getFluid(1000))
@@ -2546,7 +2543,7 @@ public class ChemicalRecipes implements Runnable {
         // Polybenzimidazole
         // C12H14N4 + C20H14O4 = C20H12N4 + 2C6H6O + 2H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Diphenylisophthalate.getCells(1), Materials.Diaminobenzidin.getCells(1))
             .itemOutputs(Materials.Phenol.getCells(2))
             .fluidOutputs(Materials.Polybenzimidazole.getMolten(1000))
@@ -2554,10 +2551,10 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_IV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1))
             .itemOutputs(getModItem(Railcraft.ID, "glass", 6))
             .fluidInputs(Materials.Glass.getMolten(864))
             .duration(2 * SECONDS + 10 * TICKS)
@@ -2566,8 +2563,8 @@ public class ChemicalRecipes implements Runnable {
 
         // NH3 + 2CH4O = C2H7N + 2H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(2))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .fluidOutputs(Materials.Dimethylamine.getGas(1000))
@@ -2575,8 +2572,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Dimethylamine.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2584,8 +2581,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Dimethylamine.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(2000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2593,8 +2590,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(2), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .fluidOutputs(Materials.Dimethylamine.getGas(1000))
@@ -2602,16 +2599,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Methanol.getCells(2), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Dimethylamine.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .duration(12 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Dimethylamine.getCells(1))
             .fluidInputs(Materials.Methanol.getFluid(2000))
             .duration(12 * SECONDS)
@@ -2620,8 +2617,8 @@ public class ChemicalRecipes implements Runnable {
 
         // NH3 + HClO = NH2Cl + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
             .fluidOutputs(Materials.Chloramine.getFluid(1000))
@@ -2629,8 +2626,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HypochlorousAcid.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .fluidOutputs(Materials.Chloramine.getFluid(1000))
@@ -2638,8 +2635,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chloramine.getCells(1))
             .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2647,8 +2644,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HypochlorousAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chloramine.getCells(1))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2656,8 +2653,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
             .fluidOutputs(Materials.Chloramine.getFluid(1000))
@@ -2665,8 +2662,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HypochlorousAcid.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .fluidOutputs(Materials.Chloramine.getFluid(1000))
@@ -2674,16 +2671,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Chloramine.getCells(1))
             .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HypochlorousAcid.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Chloramine.getCells(1))
             .fluidInputs(Materials.Ammonia.getGas(1000))
             .duration(8 * SECONDS)
@@ -2692,24 +2689,24 @@ public class ChemicalRecipes implements Runnable {
 
         // 2NO2 = N2O4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.NitrogenDioxide.getGas(2000))
             .fluidOutputs(Materials.DinitrogenTetroxide.getGas(1000))
             .duration(32 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrogenDioxide.getCells(2), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrogenDioxide.getCells(2), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidOutputs(Materials.DinitrogenTetroxide.getGas(1000))
             .duration(32 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrogenDioxide.getCells(2), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrogenDioxide.getCells(2), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.DinitrogenTetroxide.getCells(1), Materials.Empty.getCells(1))
             .duration(32 * SECONDS)
             .eut(TierEU.RECIPE_LV)
@@ -2717,8 +2714,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2NH3 + 5O = 2NO + 3H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(4), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(4), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.NitricOxide.getCells(4))
             .fluidInputs(Materials.Oxygen.getGas(10000))
             .fluidOutputs(Materials.Water.getFluid(6000))
@@ -2726,8 +2723,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(10), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.NitricOxide.getCells(4), Materials.Empty.getCells(6))
             .fluidInputs(Materials.Ammonia.getGas(4000))
             .fluidOutputs(Materials.Water.getFluid(6000))
@@ -2735,8 +2732,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(10), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Water.getCells(6), Materials.Empty.getCells(4))
             .fluidInputs(Materials.Ammonia.getGas(4000))
             .fluidOutputs(Materials.NitricOxide.getGas(4000))
@@ -2744,24 +2741,24 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ammonia.getCells(4), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ammonia.getCells(4), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.NitricOxide.getCells(4))
             .fluidInputs(Materials.Oxygen.getGas(10000))
             .duration(16 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(10), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.NitricOxide.getCells(4), Materials.Empty.getCells(6))
             .fluidInputs(Materials.Ammonia.getGas(4000))
             .duration(16 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(10), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Empty.getCells(10))
             .fluidInputs(Materials.Ammonia.getGas(4000))
             .fluidOutputs(Materials.NitricOxide.getGas(4000))
@@ -2771,8 +2768,8 @@ public class ChemicalRecipes implements Runnable {
 
         // NO + O = NO2
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitricOxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitricOxide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.NitrogenDioxide.getGas(1000))
@@ -2780,8 +2777,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.NitricOxide.getGas(1000))
             .fluidOutputs(Materials.NitrogenDioxide.getGas(1000))
@@ -2789,16 +2786,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitricOxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitricOxide.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.NitrogenDioxide.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.NitrogenDioxide.getCells(1))
             .fluidInputs(Materials.NitricOxide.getGas(1000))
             .duration(8 * SECONDS)
@@ -2807,8 +2804,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H2O + 3NO2 = 2HNO3 + NO
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.NitricOxide.getCells(1))
             .fluidInputs(Materials.NitrogenDioxide.getGas(3000))
             .fluidOutputs(Materials.NitricAcid.getFluid(2000))
@@ -2816,8 +2813,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrogenDioxide.getCells(3), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrogenDioxide.getCells(3), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.NitricOxide.getCells(1), Materials.Empty.getCells(2))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.NitricAcid.getFluid(2000))
@@ -2825,8 +2822,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrogenDioxide.getCells(3), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrogenDioxide.getCells(3), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.NitricAcid.getCells(2), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.NitricOxide.getGas(1000))
@@ -2836,8 +2833,8 @@ public class ChemicalRecipes implements Runnable {
 
         // S + 2H = H2S
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Sulfur.getDust(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Sulfur.getDust(1), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Hydrogen.getGas(2000))
             .fluidOutputs(Materials.HydricSulfide.getGas(1000))
             .duration(3 * SECONDS)
@@ -2846,8 +2843,8 @@ public class ChemicalRecipes implements Runnable {
 
         // S + 2O = SO2
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Sulfur.getDust(1), GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Sulfur.getDust(1), GTUtility.getIntegratedCircuit(3))
             .fluidInputs(Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
             .duration(3 * SECONDS)
@@ -2856,8 +2853,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H2S + 3O = SO2 + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydricSulfide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(3000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
@@ -2865,8 +2862,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(3), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(2))
             .fluidInputs(Materials.HydricSulfide.getGas(1000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
@@ -2874,8 +2871,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydricSulfide.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.SulfurDioxide.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(3000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2883,8 +2880,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(3), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.SulfurDioxide.getCells(1), Materials.Empty.getCells(2))
             .fluidInputs(Materials.HydricSulfide.getGas(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -2892,8 +2889,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydricSulfide.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(3000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
@@ -2901,8 +2898,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(3), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Empty.getCells(3))
             .fluidInputs(Materials.HydricSulfide.getGas(1000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
@@ -2910,16 +2907,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydricSulfide.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.SulfurDioxide.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(3000))
             .duration(6 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(3), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.SulfurDioxide.getCells(1), Materials.Empty.getCells(2))
             .fluidInputs(Materials.HydricSulfide.getGas(1000))
             .duration(6 * SECONDS)
@@ -2928,8 +2925,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2H2S + SO2 = 3S + 2H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfurDioxide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(1))
             .fluidInputs(Materials.HydricSulfide.getGas(2000))
             .fluidOutputs(Materials.Water.getFluid(2000))
@@ -2937,8 +2934,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydricSulfide.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydricSulfide.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(2))
             .fluidInputs(Materials.SulfurDioxide.getGas(1000))
             .fluidOutputs(Materials.Water.getFluid(2000))
@@ -2946,16 +2943,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfurDioxide.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(1))
             .fluidInputs(Materials.HydricSulfide.getGas(2000))
             .duration(6 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydricSulfide.getCells(2), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydricSulfide.getCells(2), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(2))
             .fluidInputs(Materials.SulfurDioxide.getGas(1000))
             .duration(6 * SECONDS)
@@ -2964,8 +2961,8 @@ public class ChemicalRecipes implements Runnable {
 
         // SO2 + O = SO3
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.SulfurDioxide.getGas(1000))
             .fluidOutputs(Materials.SulfurTrioxide.getGas(1000))
@@ -2973,8 +2970,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfurDioxide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.SulfurTrioxide.getGas(1000))
@@ -2982,16 +2979,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.SulfurTrioxide.getCells(1))
             .fluidInputs(Materials.SulfurDioxide.getGas(1000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfurDioxide.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.SulfurTrioxide.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(10 * SECONDS)
@@ -3000,8 +2997,8 @@ public class ChemicalRecipes implements Runnable {
 
         // SO3 + H2O = H2SO4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.SulfurTrioxide.getGas(1000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
@@ -3009,8 +3006,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfurTrioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfurTrioxide.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
@@ -3018,16 +3015,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.SulfuricAcid.getCells(1))
             .fluidInputs(Materials.SulfurTrioxide.getGas(1000))
             .duration(16 * SECONDS)
             .eut(8)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfurTrioxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfurTrioxide.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.SulfuricAcid.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(16 * SECONDS)
@@ -3036,8 +3033,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H4 + 2Cl = C2H3Cl + HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ethylene.getGas(1000))
             .fluidOutputs(Materials.VinylChloride.getGas(1000))
@@ -3045,8 +3042,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethylene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.VinylChloride.getGas(1000))
@@ -3054,8 +3051,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.VinylChloride.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ethylene.getGas(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -3063,8 +3060,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethylene.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.VinylChloride.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -3074,8 +3071,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H4O2 =H2SO4= C2H2O + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.AceticAcid.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ethenone.getCells(1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
@@ -3083,8 +3080,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfuricAcid.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Ethenone.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(1000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
@@ -3092,8 +3089,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.AceticAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(Materials.Ethenone.getGas(1000))
@@ -3101,8 +3098,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SulfuricAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(1000))
             .fluidOutputs(Materials.Ethenone.getGas(1000))
@@ -3113,7 +3110,7 @@ public class ChemicalRecipes implements Runnable {
         // C2H2O + 8HNO3 = 2CN4O8 + 9H2O
         // Chemically this recipe is wrong, but kept for minimizing breaking change.
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ethenone.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Tetranitromethane.getCells(2))
             .fluidInputs(Materials.NitricAcid.getFluid(8000))
@@ -3122,8 +3119,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethenone.getCells(1), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethenone.getCells(1), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.NitricAcid.getFluid(8000))
             .fluidOutputs(Materials.Tetranitromethane.getFluid(2000))
@@ -3131,8 +3128,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitricAcid.getCells(8), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitricAcid.getCells(8), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Tetranitromethane.getCells(2), Materials.Empty.getCells(6))
             .fluidInputs(Materials.Ethenone.getGas(1000))
             .fluidOutputs(Materials.Water.getFluid(9000))
@@ -3140,16 +3137,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitricAcid.getCells(8), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitricAcid.getCells(8), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Tetranitromethane.getCells(2), Materials.Empty.getCells(6))
             .fluidInputs(Materials.Ethenone.getGas(1000))
             .duration(24 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitricAcid.getCells(8), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitricAcid.getCells(8), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.Empty.getCells(8))
             .fluidInputs(Materials.Ethenone.getGas(1000))
             .fluidOutputs(Materials.Tetranitromethane.getFluid(2000))
@@ -3157,7 +3154,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.NitricAcid.getCells(8), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Water.getCells(9))
             .fluidInputs(Materials.Ethenone.getGas(1000))
@@ -3166,7 +3163,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ethenone.getCells(1), Materials.NitricAcid.getCells(8))
             .itemOutputs(Materials.Water.getCells(9))
             .fluidOutputs(Materials.Tetranitromethane.getFluid(2000))
@@ -3176,7 +3173,7 @@ public class ChemicalRecipes implements Runnable {
 
         // C3H6 + C2H4 = C5H8 + 2H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Propene.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Hydrogen.getCells(2))
             .fluidInputs(Materials.Ethylene.getGas(1000))
@@ -3185,7 +3182,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ethylene.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Hydrogen.getCells(2))
             .fluidInputs(Materials.Propene.getGas(1000))
@@ -3194,8 +3191,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Propene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Propene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Isoprene.getCells(1))
             .fluidInputs(Materials.Ethylene.getGas(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
@@ -3203,8 +3200,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethylene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Isoprene.getCells(1))
             .fluidInputs(Materials.Propene.getGas(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
@@ -3212,8 +3209,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(5))
             .itemOutputs(Materials.Methane.getCells(1))
             .fluidInputs(Materials.Propene.getGas(2000))
             .fluidOutputs(Materials.Isoprene.getFluid(1000))
@@ -3221,16 +3218,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Propene.getCells(2), GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Propene.getCells(2), GTUtility.getIntegratedCircuit(5))
             .itemOutputs(Materials.Methane.getCells(1), Materials.Empty.getCells(1))
             .fluidOutputs(Materials.Isoprene.getFluid(1000))
             .duration(6 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(15))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(15))
             .itemOutputs(Materials.Isoprene.getCells(1))
             .fluidInputs(Materials.Propene.getGas(2000))
             .fluidOutputs(Materials.Methane.getGas(1000))
@@ -3238,48 +3235,48 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Propene.getCells(2), GT_Utility.getIntegratedCircuit(15))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Propene.getCells(2), GTUtility.getIntegratedCircuit(15))
             .itemOutputs(Materials.Isoprene.getCells(1), Materials.Empty.getCells(1))
             .fluidOutputs(Materials.Methane.getGas(1000))
             .duration(6 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Cell_Air.get(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Cell_Air.get(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.RawRubber.getDust(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Isoprene.getFluid(144))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.RawRubber.getDust(3), Materials.Empty.getCells(2))
             .fluidInputs(Materials.Isoprene.getFluid(288))
             .duration(16 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Isoprene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Isoprene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.RawRubber.getDust(7), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Air.getGas(14000))
             .duration(56 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Isoprene.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Isoprene.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.RawRubber.getDust(21), Materials.Empty.getCells(2))
             .fluidInputs(Materials.Oxygen.getGas(14000))
             .duration(1 * MINUTES + 52 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Benzene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Styrene.getCells(1))
             .fluidInputs(Materials.Ethylene.getGas(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
@@ -3287,8 +3284,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Ethylene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Styrene.getCells(1))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
@@ -3296,7 +3293,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.RawStyreneButadieneRubber.getDust(9), Materials.Sulfur.getDust(1))
             .fluidOutputs(Materials.StyreneButadieneRubber.getMolten(1296))
             .duration(30 * SECONDS)
@@ -3305,8 +3302,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H6 + 4Cl = C6H4Cl2 + 2HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Benzene.getCells(1), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Dichlorobenzene.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(4000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(2000))
@@ -3314,8 +3311,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(4), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(4), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Dichlorobenzene.getCells(1), Materials.Empty.getCells(3))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(2000))
@@ -3323,8 +3320,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(4), GT_Utility.getIntegratedCircuit(12))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(4), GTUtility.getIntegratedCircuit(12))
             .itemOutputs(Materials.HydrochloricAcid.getCells(2), Materials.Empty.getCells(2))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.Dichlorobenzene.getFluid(1000))
@@ -3332,7 +3329,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumSulfide.getDust(3), ItemList.Cell_Air.get(8))
             .itemOutputs(Materials.Salt.getDust(4), Materials.Empty.getCells(8))
             .fluidInputs(Materials.Dichlorobenzene.getFluid(1000))
@@ -3341,7 +3338,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumSulfide.getDust(3), Materials.Oxygen.getCells(8))
             .itemOutputs(Materials.Salt.getDust(4), Materials.Empty.getCells(8))
             .fluidInputs(Materials.Dichlorobenzene.getFluid(1000))
@@ -3352,8 +3349,8 @@ public class ChemicalRecipes implements Runnable {
 
         // NaCl + H2SO4 = NaHSO4 + HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Salt.getDust(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Salt.getDust(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.SodiumBisulfate.getDust(7))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -3363,8 +3360,8 @@ public class ChemicalRecipes implements Runnable {
 
         // NaOH + H2SO4 = NaHSO4 + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SodiumHydroxide.getDust(3), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.SodiumBisulfate.getDust(7))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -3374,7 +3371,7 @@ public class ChemicalRecipes implements Runnable {
 
         // Biodiesel recipes
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Methanol.getCells(1))
             .itemOutputs(Materials.Glycerol.getCells(1))
             .fluidInputs(Materials.SeedOil.getFluid(6000))
@@ -3383,7 +3380,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.SeedOil.getCells(6))
             .itemOutputs(Materials.BioDiesel.getCells(6))
             .fluidInputs(Materials.Methanol.getFluid(1000))
@@ -3392,7 +3389,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Methanol.getCells(1))
             .itemOutputs(Materials.Glycerol.getCells(1))
             .fluidInputs(Materials.FishOil.getFluid(6000))
@@ -3401,7 +3398,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.FishOil.getCells(6))
             .itemOutputs(Materials.BioDiesel.getCells(6))
             .fluidInputs(Materials.Methanol.getFluid(1000))
@@ -3410,7 +3407,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Ethanol.getCells(1))
             .itemOutputs(Materials.Glycerol.getCells(1))
             .fluidInputs(Materials.SeedOil.getFluid(6000))
@@ -3419,7 +3416,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.SeedOil.getCells(6))
             .itemOutputs(Materials.BioDiesel.getCells(6))
             .fluidInputs(Materials.Ethanol.getFluid(1000))
@@ -3428,7 +3425,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Ethanol.getCells(1))
             .itemOutputs(Materials.Glycerol.getCells(1))
             .fluidInputs(Materials.FishOil.getFluid(6000))
@@ -3437,7 +3434,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.FishOil.getCells(6))
             .itemOutputs(Materials.BioDiesel.getCells(6))
             .fluidInputs(Materials.Ethanol.getFluid(1000))
@@ -3446,7 +3443,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Methanol.getCells(9))
             .itemOutputs(Materials.Glycerol.getCells(9))
             .fluidInputs(Materials.SeedOil.getFluid(54000))
@@ -3455,7 +3452,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.SeedOil.getCells(54))
             .itemOutputs(Materials.BioDiesel.getCells(54))
             .fluidInputs(Materials.Methanol.getFluid(9000))
@@ -3464,7 +3461,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Methanol.getCells(9))
             .itemOutputs(Materials.Glycerol.getCells(9))
             .fluidInputs(Materials.FishOil.getFluid(54000))
@@ -3473,7 +3470,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.FishOil.getCells(54))
             .itemOutputs(Materials.BioDiesel.getCells(54))
             .fluidInputs(Materials.Methanol.getFluid(9000))
@@ -3482,7 +3479,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Ethanol.getCells(9))
             .itemOutputs(Materials.Glycerol.getCells(9))
             .fluidInputs(Materials.SeedOil.getFluid(54000))
@@ -3491,7 +3488,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.SeedOil.getCells(54))
             .itemOutputs(Materials.BioDiesel.getCells(54))
             .fluidInputs(Materials.Ethanol.getFluid(9000))
@@ -3500,7 +3497,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Ethanol.getCells(9))
             .itemOutputs(Materials.Glycerol.getCells(9))
             .fluidInputs(Materials.FishOil.getFluid(54000))
@@ -3509,7 +3506,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.FishOil.getCells(54))
             .itemOutputs(Materials.BioDiesel.getCells(54))
             .fluidInputs(Materials.Ethanol.getFluid(9000))
@@ -3520,8 +3517,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C3H8O3 + 3HNO3 =H2SO4= C3H5N3O9 + 3H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Glycerol.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Glyceryl.getCells(1))
             .fluidInputs(Materials.NitrationMixture.getFluid(6000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(3000))
@@ -3529,8 +3526,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrationMixture.getCells(6), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrationMixture.getCells(6), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Glyceryl.getCells(1), Materials.Empty.getCells(5))
             .fluidInputs(Materials.Glycerol.getFluid(1000))
             .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(3000))
@@ -3538,8 +3535,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.NitrationMixture.getCells(6), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.NitrationMixture.getCells(6), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(3), Materials.Empty.getCells(3))
             .fluidInputs(Materials.Glycerol.getFluid(1000))
             .fluidOutputs(Materials.Glyceryl.getFluid(1000))
@@ -3549,7 +3546,7 @@ public class ChemicalRecipes implements Runnable {
 
         // CaO + CO2 = CaCO3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Quicklime.getDust(2))
             .itemOutputs(Materials.Calcite.getDust(5))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
@@ -3557,8 +3554,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcite.getDust(5), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcite.getDust(5), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Quicklime.getDust(2))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
             .duration(12 * SECONDS)
@@ -3567,7 +3564,7 @@ public class ChemicalRecipes implements Runnable {
 
         // MgO + CO2 = MgCO3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Magnesia.getDust(2))
             .itemOutputs(Materials.Magnesite.getDust(5))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
@@ -3575,8 +3572,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Magnesite.getDust(5), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Magnesite.getDust(5), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Magnesia.getDust(2))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
             .duration(12 * SECONDS)
@@ -3585,8 +3582,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H6 + 2Cl = C6H5Cl + HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Benzene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Chlorobenzene.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(2000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -3594,8 +3591,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Chlorobenzene.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -3603,8 +3600,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorine.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Benzene.getFluid(1000))
             .fluidOutputs(Materials.Chlorobenzene.getFluid(1000))
@@ -3614,8 +3611,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H5Cl + H2O = C6H6O + HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
             .fluidOutputs(Materials.Phenol.getFluid(1000))
@@ -3623,8 +3620,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorobenzene.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.Phenol.getFluid(1000))
@@ -3632,8 +3629,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Water.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Phenol.getCells(1))
             .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
@@ -3641,8 +3638,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Chlorobenzene.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Phenol.getCells(1))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
@@ -3652,8 +3649,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H5Cl + NaOH = C6H6O + NaCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SodiumHydroxide.getDust(12), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SodiumHydroxide.getDust(12), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Salt.getDust(8))
             .fluidInputs(Materials.Chlorobenzene.getFluid(4000))
             .fluidOutputs(Materials.Phenol.getFluid(4000))
@@ -3663,40 +3660,40 @@ public class ChemicalRecipes implements Runnable {
 
         // Oxide Recipe
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Antimony.getDust(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2), Materials.Antimony.getDust(2))
             .itemOutputs(Materials.AntimonyTrioxide.getDust(5))
             .fluidInputs(Materials.Oxygen.getGas(3000))
             .duration(20 * TICKS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Lead.getDust(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2), Materials.Lead.getDust(1))
             .itemOutputs(Materials.Massicot.getDust(2))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(20 * TICKS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Arsenic.getDust(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2), Materials.Arsenic.getDust(2))
             .itemOutputs(Materials.ArsenicTrioxide.getDust(5))
             .fluidInputs(Materials.Oxygen.getGas(3000))
             .duration(20 * TICKS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Cobalt.getDust(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2), Materials.Cobalt.getDust(1))
             .itemOutputs(Materials.CobaltOxide.getDust(2))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(20 * TICKS)
             .eut(30)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Zinc.getDust(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2), Materials.Zinc.getDust(1))
             .itemOutputs(Materials.Zincite.getDust(2))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(20 * TICKS)
@@ -3705,12 +3702,12 @@ public class ChemicalRecipes implements Runnable {
 
         // CaSi2 + 2HCl = 2Si + CaCl2 + 2H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CalciumDisilicide, 3),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CalciumDisilicide, 3),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 2),
                 new ItemStack(WerkstoffLoader.items.get(OrePrefixes.dust), 3, 63))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(2000))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
@@ -3720,12 +3717,10 @@ public class ChemicalRecipes implements Runnable {
 
         // SiCl4 + 2Zn = 2ZnCl2 + Si
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 2),
-                GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
                 new ItemStack(WerkstoffLoader.items.get(OrePrefixes.dust), 6, 10052))
             .fluidInputs(Materials.SiliconTetrachloride.getFluid(1000))
             .duration(20 * SECONDS)
@@ -3734,10 +3729,10 @@ public class ChemicalRecipes implements Runnable {
 
         // C4H8O + 2H =Pd= C4H10O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Butyraldehyde, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Palladium, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Butyraldehyde, 1),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Palladium, 1))
             .itemOutputs(ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Hydrogen.getGas(2000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("butanol"), 1000))
@@ -3747,13 +3742,13 @@ public class ChemicalRecipes implements Runnable {
 
         // 4CH2O + C2H4O =NaOH= C5H12O4 + CO
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs( // very poor way of looking for it, but getModItem on GT++ within GT5U jar is prohibited now,
                 // and i don't feel like reworking GT++ cell registration for now
                 GameRegistry.findItemStack(GTPlusPlus.ID, "Formaldehyde", 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 21),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 21),
                 Materials.Empty.getCells(4))
             .fluidInputs(MaterialsKevlar.Acetaldehyde.getGas(1000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
@@ -3763,12 +3758,12 @@ public class ChemicalRecipes implements Runnable {
 
         // 4CH2O + C2H4O =NaOH= C5H12O4 + CO
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Acetaldehyde, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Acetaldehyde, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 21),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 21),
                 Materials.Empty.getCells(1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 4000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
@@ -3778,10 +3773,10 @@ public class ChemicalRecipes implements Runnable {
 
         // CaC2 + 2H2O = Ca(OH)2 + C2H2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CalciumCarbide, 3),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CalciumCarbide, 3),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(new ItemStack(ModItems.dustCalciumHydroxide, 5))
             .fluidInputs(Materials.Water.getFluid(2000))
             .fluidOutputs(MaterialsKevlar.Acetylene.getGas(1000))
@@ -3791,10 +3786,10 @@ public class ChemicalRecipes implements Runnable {
 
         // Co(NO3)2 + 2NaOH = Co(OH)2 + 2NaNO3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 MaterialsKevlar.CobaltIINitrate.getDust(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 6))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 6))
             .itemOutputs(MaterialsKevlar.CobaltIIHydroxide.getDust(5), SODIUM_NITRATE.getDust(10))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_MV)
@@ -3803,8 +3798,8 @@ public class ChemicalRecipes implements Runnable {
 
     public void addDefaultPolymerizationRecipes(Fluid aBasicMaterial, ItemStack aBasicMaterialCell, Fluid aPolymer) {
         // Oxygen/Titaniumtetrafluoride -> +50% Output each
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.Cell_Air.get(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.Cell_Air.get(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(new FluidStack(aBasicMaterial, 144))
             .fluidOutputs(new FluidStack(aPolymer, 144))
@@ -3812,8 +3807,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(new FluidStack(aBasicMaterial, 144))
             .fluidOutputs(new FluidStack(aPolymer, 216))
@@ -3821,8 +3816,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(aBasicMaterialCell, GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(aBasicMaterialCell, GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Air.getGas(14000))
             .fluidOutputs(new FluidStack(aPolymer, 1000))
@@ -3830,8 +3825,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(aBasicMaterialCell, GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(aBasicMaterialCell, GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(7000))
             .fluidOutputs(new FluidStack(aPolymer, 1500))
@@ -3839,8 +3834,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(
                 new FluidStack(aBasicMaterial, 2160),
                 Materials.Air.getGas(7500),
@@ -3850,8 +3845,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(
                 new FluidStack(aBasicMaterial, 2160),
                 Materials.Oxygen.getGas(7500),
@@ -3892,14 +3887,14 @@ public class ChemicalRecipes implements Runnable {
 
     public void singleBlockOnly() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.GasolineRaw.getCells(10), Materials.Toluene.getCells(1))
             .itemOutputs(Materials.GasolineRegular.getCells(11))
             .duration(10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Benzene.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Hydrogen.getCells(2))
             .fluidInputs(Materials.Ethylene.getGas(1000))
@@ -3908,7 +3903,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ethylene.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Hydrogen.getCells(2))
             .fluidInputs(Materials.Benzene.getFluid(1000))
@@ -3917,7 +3912,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_LV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Methane.getCells(1), Materials.Empty.getCells(2))
             .itemOutputs(Materials.HydrochloricAcid.getCells(3))
             .fluidInputs(Materials.Chlorine.getGas(6000))
@@ -3926,7 +3921,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Silicon.getDust(1), Materials.Chloromethane.getCells(2))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidOutputs(Materials.Dimethyldichlorosilane.getFluid(1000))
@@ -3934,7 +3929,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), Materials.Water.getCells(1))
             .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.Empty.getCells(2))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
@@ -3944,7 +3939,7 @@ public class ChemicalRecipes implements Runnable {
 
         // Ca5(PO4)3Cl + 5H2SO4 + 10H2O = 5CaSO4(H2O)2 + HCl + 3H3PO4
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Apatite.getDust(9), Materials.SulfuricAcid.getCells(5))
             .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(4))
             .fluidInputs(Materials.Water.getFluid(10000))
@@ -3955,7 +3950,7 @@ public class ChemicalRecipes implements Runnable {
 
         // 10O + 4P = P4O10
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Phosphorus.getDust(4))
             .itemOutputs(Materials.PhosphorousPentoxide.getDust(14))
             .fluidInputs(Materials.Oxygen.getGas(10000))
@@ -3965,7 +3960,7 @@ public class ChemicalRecipes implements Runnable {
 
         // HCl + C3H8O3 = C3H5ClO + 2H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Glycerol.getCells(1))
             .itemOutputs(Materials.Water.getCells(2))
             .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
@@ -3975,7 +3970,7 @@ public class ChemicalRecipes implements Runnable {
 
         // H2O + Cl =Hg= HClO + H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Chlorine.getCells(10), Materials.Mercury.getCells(1))
             .itemOutputs(Materials.Hydrogen.getCells(10), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Water.getFluid(10000))
@@ -3984,7 +3979,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Water.getCells(10), Materials.Mercury.getCells(1))
             .itemOutputs(Materials.Hydrogen.getCells(10), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Chlorine.getGas(10000))
@@ -3993,7 +3988,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(8)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Chlorine.getCells(1), Materials.Water.getCells(1))
             .itemOutputs(Materials.Hydrogen.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Mercury.getFluid(100))
@@ -4004,7 +3999,7 @@ public class ChemicalRecipes implements Runnable {
 
         // P + 3Cl = PCl3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Phosphorus.getDust(1), Materials.Chlorine.getCells(3))
             .itemOutputs(ItemList.Cell_Empty.get(3))
             .fluidOutputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(1000))
@@ -4012,10 +4007,10 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 5))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 5))
             .itemOutputs(ItemList.Cell_Empty.get(6))
             .fluidInputs(Materials.Dimethyldichlorosilane.getFluid(4000))
             .fluidOutputs(MaterialsKevlar.SiliconOil.getFluid(5000))
@@ -4023,10 +4018,10 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Dimethyldichlorosilane, 4))
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Dimethyldichlorosilane, 4))
             .itemOutputs(ItemList.Cell_Empty.get(5))
             .fluidInputs(Materials.Water.getFluid(5000))
             .fluidOutputs(MaterialsKevlar.SiliconOil.getFluid(5000))
@@ -4034,10 +4029,10 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1),
-                GT_Utility.getIntegratedCircuit(2))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1),
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.Cell_Empty.get(1))
             .fluidInputs(MaterialsKevlar.EthyleneOxide.getGas(1000))
             .fluidOutputs(MaterialsKevlar.Ethyleneglycol.getFluid(1000))
@@ -4045,14 +4040,14 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(MaterialsKevlar.CobaltIIHydroxide.getDust(5), MaterialsKevlar.NaphthenicAcid.getCells(1))
             .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41), ItemList.Cell_Empty.get(1))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(MaterialsKevlar.CobaltIIAcetate.getDust(15), MaterialsKevlar.NaphthenicAcid.getCells(1))
             .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41), ItemList.Cell_Empty.get(1))
             .fluidOutputs(Materials.AceticAcid.getFluid(1500))
@@ -4060,27 +4055,27 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 4))
             .itemOutputs(ItemList.Cell_Empty.get(4))
             .fluidOutputs(Materials.SiliconTetrachloride.getFluid(1000))
             .duration(20 * SECONDS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 3),
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 1))
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 3),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(4000))
             .fluidOutputs(new FluidStack(ItemList.sIndiumConcentrate, 8000))
             .duration(3 * SECONDS)
             .eut(150)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Carbon.getDust(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Methane.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(4000))
@@ -4090,74 +4085,74 @@ public class ChemicalRecipes implements Runnable {
 
         // O + 2H = H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1),
-                GT_Utility.getIntegratedCircuit(22))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1),
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Hydrogen.getGas(2000))
-            .fluidOutputs(GT_ModHandler.getDistilledWater(1000))
+            .fluidOutputs(GTModHandler.getDistilledWater(1000))
             .duration(10 * TICKS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1),
-                GT_Utility.getIntegratedCircuit(22))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1),
+                GTUtility.getIntegratedCircuit(22))
             .itemOutputs(ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.Oxygen.getGas(500))
-            .fluidOutputs(GT_ModHandler.getDistilledWater(500))
+            .fluidOutputs(GTModHandler.getDistilledWater(500))
             .duration(5 * TICKS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
         // Si + 4Cl = SiCl4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1), ItemList.Cell_Empty.get(2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1), ItemList.Cell_Empty.get(2))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(3000))
             .fluidOutputs(Materials.Trichlorosilane.getFluid(1000))
             .duration(15 * SECONDS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(1))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(1))
             .fluidOutputs(Materials.Hydrogen.getGas(4000))
             .duration(15 * SECONDS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1), ItemList.Cell_Empty.get(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1), ItemList.Cell_Empty.get(3))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 4))
             .duration(15 * SECONDS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
         // S + 2Cl = SCl2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 16))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 16))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 8),
+                GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 8),
                 ItemList.Cell_Empty.get(8))
             .duration(40 * SECONDS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8), ItemList.Cell_Empty.get(8))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8), ItemList.Cell_Empty.get(8))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 8))
             .fluidInputs(Materials.Chlorine.getGas(16000))
             .duration(40 * SECONDS)
             .eut(30)
@@ -4165,7 +4160,7 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H6 + C3H6 = C9H12
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Propene.getCells(8), Materials.PhosphoricAcid.getCells(1))
             .itemOutputs(Materials.Empty.getCells(9))
             .fluidInputs(Materials.Benzene.getFluid(8000))
@@ -4174,7 +4169,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PhosphoricAcid.getCells(1), Materials.Benzene.getCells(8))
             .itemOutputs(Materials.Empty.getCells(9))
             .fluidInputs(Materials.Propene.getGas(8000))
@@ -4183,7 +4178,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Benzene.getCells(1), Materials.Propene.getCells(1))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidInputs(Materials.PhosphoricAcid.getFluid(125))
@@ -4194,7 +4189,7 @@ public class ChemicalRecipes implements Runnable {
 
         // C3H6O + 2C6H6O =HCl= C15H16O2 + H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Acetone.getCells(1), Materials.Phenol.getCells(2))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(2))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -4203,7 +4198,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Acetone.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Phenol.getFluid(2000))
@@ -4212,7 +4207,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Phenol.getCells(2), Materials.HydrochloricAcid.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(2))
             .fluidInputs(Materials.Acetone.getFluid(1000))
@@ -4223,8 +4218,8 @@ public class ChemicalRecipes implements Runnable {
 
         // N + 3H = NH3
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Nitrogen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Nitrogen.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(3000))
             .fluidOutputs(Materials.Ammonia.getGas(1000))
@@ -4232,8 +4227,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.HV * 3 / 4)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(3), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(3), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(3))
             .fluidInputs(Materials.Nitrogen.getGas(1000))
             .fluidOutputs(Materials.Ammonia.getGas(1000))
@@ -4241,23 +4236,23 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.HV * 3 / 4)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Nitrogen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Nitrogen.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Ammonia.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(3000))
             .duration(16 * SECONDS)
             .eut(TierEU.HV * 3 / 4)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Hydrogen.getCells(3), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Hydrogen.getCells(3), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Ammonia.getCells(1), Materials.Empty.getCells(2))
             .fluidInputs(Materials.Nitrogen.getGas(1000))
             .duration(16 * SECONDS)
             .eut(TierEU.HV * 3 / 4)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ammonia.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Water.getCells(2))
             .fluidInputs(Materials.Methanol.getFluid(2000))
@@ -4266,7 +4261,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ammonia.getCells(4), Materials.Empty.getCells(2))
             .itemOutputs(Materials.Water.getCells(6))
             .fluidInputs(Materials.Oxygen.getGas(10000))
@@ -4275,7 +4270,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.NitricAcid.getCells(2))
             .fluidInputs(Materials.NitrogenDioxide.getGas(3000))
@@ -4286,7 +4281,7 @@ public class ChemicalRecipes implements Runnable {
 
         // 2NO2 + O + H2O = 2HNO3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.NitrogenDioxide.getCells(2), Materials.Oxygen.getCells(1))
             .itemOutputs(Materials.Empty.getCells(3))
             .fluidInputs(Materials.Water.getFluid(1000))
@@ -4295,7 +4290,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Oxygen.getCells(1), Materials.Water.getCells(1))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidInputs(Materials.NitrogenDioxide.getGas(2000))
@@ -4304,7 +4299,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Water.getCells(1), Materials.NitrogenDioxide.getCells(2))
             .itemOutputs(Materials.Empty.getCells(3))
             .fluidInputs(Materials.Oxygen.getGas(1000))
@@ -4313,7 +4308,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Sulfur.getDust(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.HydricSulfide.getCells(1))
             .fluidInputs(Materials.Hydrogen.getGas(2000))
@@ -4323,7 +4318,7 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H4 + HCl + O = C2H3Cl + H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ethylene.getCells(1), Materials.HydrochloricAcid.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
@@ -4332,7 +4327,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Oxygen.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Ethylene.getGas(1000))
@@ -4341,7 +4336,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Oxygen.getCells(1), Materials.Ethylene.getCells(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
@@ -4350,7 +4345,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Butadiene.getCells(1), ItemList.Cell_Air.get(5))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(9), Materials.Empty.getCells(6))
             .fluidInputs(Materials.Styrene.getFluid(350))
@@ -4358,7 +4353,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Butadiene.getCells(1), Materials.Oxygen.getCells(5))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(13), Materials.Empty.getCells(6))
             .fluidInputs(Materials.Styrene.getFluid(350))
@@ -4366,7 +4361,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Styrene.getCells(1), ItemList.Cell_Air.get(15))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(27), Materials.Empty.getCells(16))
             .fluidInputs(Materials.Butadiene.getGas(3000))
@@ -4374,7 +4369,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Styrene.getCells(1), Materials.Oxygen.getCells(15))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(41), Materials.Empty.getCells(16))
             .fluidInputs(Materials.Butadiene.getGas(3000))
@@ -4382,7 +4377,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Styrene.getCells(1), Materials.Butadiene.getCells(3))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(27), Materials.Empty.getCells(4))
             .fluidInputs(Materials.Air.getGas(15000))
@@ -4390,7 +4385,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Styrene.getCells(1), Materials.Butadiene.getCells(3))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(41), Materials.Empty.getCells(4))
             .fluidInputs(Materials.Oxygen.getGas(15000))
@@ -4398,7 +4393,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Benzene.getCells(1), Materials.Empty.getCells(1))
             .itemOutputs(Materials.HydrochloricAcid.getCells(2))
             .fluidInputs(Materials.Chlorine.getGas(4000))
@@ -4407,7 +4402,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Glycerol.getCells(1), Materials.Empty.getCells(2))
             .itemOutputs(Materials.DilutedSulfuricAcid.getCells(3))
             .fluidInputs(Materials.NitrationMixture.getFluid(6000))
@@ -4416,7 +4411,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(12), Materials.Empty.getCells(4))
             .itemOutputs(Materials.Salt.getDust(8), Materials.Phenol.getCells(4))
             .fluidInputs(Materials.Chlorobenzene.getFluid(4000))
@@ -4424,7 +4419,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(12), Materials.Chlorobenzene.getCells(4))
             .itemOutputs(Materials.Salt.getDust(8), Materials.Phenol.getCells(4))
             .duration(48 * SECONDS)
@@ -4434,15 +4429,15 @@ public class ChemicalRecipes implements Runnable {
         // Recipes for gasoline
         // 2N + O = N2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Nitrogen.getCells(2), Materials.Oxygen.getCells(1))
             .itemOutputs(Materials.NitrousOxide.getCells(1), Materials.Empty.getCells(2))
             .duration(10 * SECONDS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Nitrogen.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Nitrogen.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.NitrousOxide.getGas(1000))
@@ -4450,16 +4445,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Nitrogen.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Nitrogen.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.NitrousOxide.getCells(1), Materials.Empty.getCells(1))
             .fluidInputs(Materials.Oxygen.getGas(1000))
             .duration(10 * SECONDS)
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Nitrogen.getGas(2000))
             .fluidOutputs(Materials.NitrousOxide.getGas(1000))
@@ -4467,8 +4462,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Oxygen.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.NitrousOxide.getCells(1))
             .fluidInputs(Materials.Nitrogen.getGas(2000))
             .duration(10 * SECONDS)
@@ -4477,7 +4472,7 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H6O + C4H8 = C6H14O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Ethanol.getCells(1), Materials.Butene.getCells(1))
             .itemOutputs(Materials.AntiKnock.getCells(1), Materials.Empty.getCells(1))
             .duration(20 * SECONDS)
@@ -4487,7 +4482,7 @@ public class ChemicalRecipes implements Runnable {
         // Potassium Dichromate
         // 2KNO3 + 2CrO3 = K2Cr2O7 + 2NO + 3O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Saltpeter.getDust(10), Materials.ChromiumTrioxide.getDust(8))
             .itemOutputs(Materials.Potassiumdichromate.getDust(11))
             .fluidOutputs(Materials.NitricOxide.getGas(2000))
@@ -4495,7 +4490,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(chemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PotassiumNitrade.getDust(10), Materials.ChromiumTrioxide.getDust(8))
             .itemOutputs(Materials.Potassiumdichromate.getDust(11))
             .fluidOutputs(Materials.NitricOxide.getGas(2000))
@@ -4506,15 +4501,15 @@ public class ChemicalRecipes implements Runnable {
 
     public void multiblockOnly() {
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(22))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(22))
             .fluidInputs(Materials.Hydrogen.getGas(16000), Materials.Oxygen.getGas(8000))
-            .fluidOutputs(GT_ModHandler.getDistilledWater(8000))
+            .fluidOutputs(GTModHandler.getDistilledWater(8000))
             .duration(4 * SECONDS)
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PotassiumNitrade.getDust(10), Materials.ChromiumTrioxide.getDust(8))
             .itemOutputs(Materials.Potassiumdichromate.getDust(11))
             .fluidOutputs(Materials.NitricOxide.getGas(2000), Materials.Oxygen.getGas(3000))
@@ -4522,7 +4517,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Saltpeter.getDust(10), Materials.ChromiumTrioxide.getDust(8))
             .itemOutputs(Materials.Potassiumdichromate.getDust(11))
             .fluidOutputs(Materials.NitricOxide.getGas(2000), Materials.Oxygen.getGas(3000))
@@ -4533,13 +4528,13 @@ public class ChemicalRecipes implements Runnable {
         // Potassium Dichromate shortcut
         // 2 Cr + 6O + 10 Saltpeter/Potassium Dichromate = 10 K2Cr2O7 + 2NO + 3O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 Materials.PotassiumNitrade.getDust(64),
                 Materials.PotassiumNitrade.getDust(64),
                 Materials.PotassiumNitrade.getDust(32),
                 Materials.Chrome.getDust(2 * 16),
-                GT_Utility.getIntegratedCircuit(11))
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(
                 Materials.Potassiumdichromate.getDust(64),
                 Materials.Potassiumdichromate.getDust(64),
@@ -4547,16 +4542,16 @@ public class ChemicalRecipes implements Runnable {
             .fluidInputs(Materials.Oxygen.getGas(6000 * 16))
             .fluidOutputs(Materials.NitricOxide.getGas(2000 * 16), Materials.Oxygen.getGas(3000 * 16))
             .duration(2 * MINUTES + 8 * SECONDS)
-            .eut((int) GT_Values.VP[7])
+            .eut((int) GTValues.VP[7])
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 Materials.Saltpeter.getDust(64),
                 Materials.Saltpeter.getDust(64),
                 Materials.Saltpeter.getDust(32),
                 Materials.Chrome.getDust(2 * 16),
-                GT_Utility.getIntegratedCircuit(11))
+                GTUtility.getIntegratedCircuit(11))
             .itemOutputs(
                 Materials.Potassiumdichromate.getDust(64),
                 Materials.Potassiumdichromate.getDust(64),
@@ -4564,67 +4559,67 @@ public class ChemicalRecipes implements Runnable {
             .fluidInputs(Materials.Oxygen.getGas(6000 * 16))
             .fluidOutputs(Materials.NitricOxide.getGas(2000 * 16), Materials.Oxygen.getGas(3000 * 16))
             .duration(2 * MINUTES + 8 * SECONDS)
-            .eut((int) GT_Values.VP[7])
+            .eut((int) GTValues.VP[7])
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Benzene.getFluid(1000), Materials.Methane.getGas(2000))
             .fluidOutputs(Materials.Dimethylbenzene.getFluid(1000), Materials.Hydrogen.getGas(4000))
             .duration(3 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 3),
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 1))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 3),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(4000))
             .fluidOutputs(new FluidStack(ItemList.sIndiumConcentrate, 8000))
             .duration(3 * SECONDS)
             .eut(150)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(8),
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 27),
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 9))
+                GTUtility.getIntegratedCircuit(8),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 27),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 9))
             .fluidInputs(Materials.SulfuricAcid.getFluid(36000))
             .fluidOutputs(new FluidStack(ItemList.sIndiumConcentrate, 72000))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pentlandite, 9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 1))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pentlandite, 9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
             .fluidOutputs(new FluidStack(ItemList.sNickelSulfate, 18000))
             .duration(1 * SECONDS + 5 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 1))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
             .fluidOutputs(new FluidStack(ItemList.sBlueVitriol, 18000))
             .duration(1 * SECONDS + 5 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Plutonium, 64),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
-                GT_Utility.getIntegratedCircuit(8))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 64))
+                GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Plutonium, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
+                GTUtility.getIntegratedCircuit(8))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 64))
             .fluidInputs(Materials.Air.getGas(8000))
             .fluidOutputs(Materials.Radon.getGas(800))
             .duration(1 * MINUTES + 15 * SECONDS)
@@ -4633,24 +4628,24 @@ public class ChemicalRecipes implements Runnable {
 
         // 3SiO2 + 4Al = 3Si + 2Al2O3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 10))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 10))
             .duration(10 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
         // 10Si + 30HCl -> 0.3 SiH2Cl2 + 9 HSiCl3 + 0.3 SiCl4 + 0.2 Si2Cl6 + 20.4H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 10))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 10))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(30000))
             .fluidOutputs(
                 Materials.Trichlorosilane.getFluid(9000),
@@ -4664,8 +4659,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2CO + 2C3H6 + 4H =RhHCO(P(C6H5)3)3= C4H8O + C4H8O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(4), MaterialsKevlar.OrganorhodiumCatalyst.getDustTiny(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(4), MaterialsKevlar.OrganorhodiumCatalyst.getDustTiny(1))
             .fluidInputs(
                 Materials.Hydrogen.getGas(4000),
                 Materials.Propene.getGas(2000),
@@ -4675,8 +4670,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9), MaterialsKevlar.OrganorhodiumCatalyst.getDust(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9), MaterialsKevlar.OrganorhodiumCatalyst.getDust(1))
             .fluidInputs(
                 Materials.Hydrogen.getGas(36000),
                 Materials.Propene.getGas(18000),
@@ -4688,30 +4683,30 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H4 + O =Al2O3,Ag= C2H4O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1))
+                GTUtility.getIntegratedCircuit(2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1))
             .fluidInputs(Materials.Ethylene.getGas(1000), Materials.Oxygen.getGas(1000))
             .fluidOutputs(MaterialsKevlar.EthyleneOxide.getGas(1000))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 9))
+                GTUtility.getIntegratedCircuit(8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 9))
             .fluidInputs(Materials.Ethylene.getGas(9000), Materials.Oxygen.getGas(9000))
             .fluidOutputs(MaterialsKevlar.EthyleneOxide.getGas(9000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(
                 MaterialsKevlar.EthyleneOxide.getGas(1000),
                 Materials.Dimethyldichlorosilane.getFluid(4000),
@@ -4721,8 +4716,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(8))
             .fluidInputs(
                 MaterialsKevlar.EthyleneOxide.getGas(9000),
                 Materials.Dimethyldichlorosilane.getFluid(36000),
@@ -4734,35 +4729,35 @@ public class ChemicalRecipes implements Runnable {
 
         // NH3 + CH4O =SiO2,Al2O3= CH5N + H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(10),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
+                GTUtility.getIntegratedCircuit(10),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
             .fluidInputs(Materials.Methanol.getFluid(1000), Materials.Ammonia.getGas(1000))
             .fluidOutputs(MaterialsKevlar.Methylamine.getGas(1000), Materials.Water.getFluid(1000))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 5))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 5))
             .fluidInputs(MaterialsKevlar.Ethyleneglycol.getFluid(4000), MaterialsKevlar.SiliconOil.getFluid(1000))
             .fluidOutputs(MaterialsKevlar.PolyurethaneResin.getFluid(1000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 45))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 45))
             .fluidInputs(MaterialsKevlar.Ethyleneglycol.getFluid(36000), MaterialsKevlar.SiliconOil.getFluid(9000))
             .fluidOutputs(MaterialsKevlar.PolyurethaneResin.getFluid(9000))
             .duration(1 * MINUTES + 15 * SECONDS)
@@ -4771,11 +4766,11 @@ public class ChemicalRecipes implements Runnable {
 
         // 3NH3 + 6CH4O =Al2O3,SiO2= CH5N + C2H7N + C3H9N + 6H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
+                GTUtility.getIntegratedCircuit(3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
             .fluidInputs(Materials.Methanol.getFluid(6000), Materials.Ammonia.getGas(3000))
             .fluidOutputs(
                 MaterialsKevlar.Methylamine.getGas(1000),
@@ -4786,11 +4781,11 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(11),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9))
+                GTUtility.getIntegratedCircuit(11),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9))
             .fluidInputs(Materials.Methanol.getFluid(54000), Materials.Ammonia.getGas(27000))
             .fluidOutputs(
                 MaterialsKevlar.Methylamine.getGas(9000),
@@ -4803,11 +4798,11 @@ public class ChemicalRecipes implements Runnable {
 
         // 18SOCl2 + 5C10H10O4 + 6CO2 = 7C8H4Cl2O2 + 22HCl + 18SO2
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 64),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 48))
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 48))
             .fluidInputs(
                 MaterialsKevlar.ThionylChloride.getFluid(18000),
                 MaterialsKevlar.DimethylTerephthalate.getFluid(5000),
@@ -4819,8 +4814,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2CH4O + C8H6O4 =H2SO4= C10H10O4 + 2H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 MaterialsKevlar.TerephthalicAcid.getFluid(1000),
                 Materials.Methanol.getFluid(2000),
@@ -4832,8 +4827,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(
                 MaterialsKevlar.TerephthalicAcid.getFluid(9000),
                 Materials.Methanol.getFluid(18000),
@@ -4845,26 +4840,26 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.Benzene.getFluid(1000), Materials.Methane.getGas(2000))
             .fluidOutputs(MaterialsKevlar.IIIDimethylbenzene.getFluid(1000), Materials.Hydrogen.getGas(4000))
             .duration(3 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(3))
             .fluidInputs(Materials.Benzene.getFluid(1000), Materials.Methane.getGas(2000))
             .fluidOutputs(MaterialsKevlar.IVDimethylbenzene.getFluid(1000), Materials.Hydrogen.getGas(4000))
             .duration(3 * MINUTES + 20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIHydroxide, 45))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIHydroxide, 45))
             .itemOutputs(
                 MaterialsKevlar.CobaltIINaphthenate.getDust(64),
                 MaterialsKevlar.CobaltIINaphthenate.getDust(64),
@@ -4877,12 +4872,12 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 64),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 64),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 7))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 7))
             .itemOutputs(
                 MaterialsKevlar.CobaltIINaphthenate.getDust(64),
                 MaterialsKevlar.CobaltIINaphthenate.getDust(64),
@@ -4898,10 +4893,10 @@ public class ChemicalRecipes implements Runnable {
 
         // PCl3 + 3C6H5Cl + 6Na = 6NaCl + C18H15P
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 6))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 6))
             .itemOutputs(MaterialsKevlar.Triphenylphosphene.getDust(34), Materials.Salt.getDust(12))
             .fluidInputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(1000), Materials.Chlorobenzene.getFluid(3000))
             .duration(20 * SECONDS)
@@ -4910,16 +4905,16 @@ public class ChemicalRecipes implements Runnable {
 
         // 4NaH + C3H9BO3 = NaBH4 + 3CH3ONa
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1), MaterialsKevlar.SodiumHydride.getDust(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1), MaterialsKevlar.SodiumHydride.getDust(8))
             .itemOutputs(MaterialsKevlar.SodiumBorohydride.getDust(6), MaterialsKevlar.SodiumMethoxide.getDust(18))
             .fluidInputs(MaterialsKevlar.TrimethylBorate.getFluid(1000))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9), MaterialsKevlar.SodiumHydride.getDust(64))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9), MaterialsKevlar.SodiumHydride.getDust(64))
             .itemOutputs(
                 MaterialsKevlar.SodiumBorohydride.getDust(48),
                 MaterialsKevlar.SodiumMethoxide.getDust(64),
@@ -4932,8 +4927,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2CH3COOH = CH3COCH3 + CO2 + H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(0, Materials.Calcite.getDust(5)), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(0, Materials.Calcite.getDust(5)), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(
                 Materials.Acetone.getFluid(1000),
@@ -4943,8 +4938,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(0, Materials.Calcium.getDust(1)), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(0, Materials.Calcium.getDust(1)), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(
                 Materials.Acetone.getFluid(1000),
@@ -4954,8 +4949,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(0, Materials.Quicklime.getDust(2)), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(0, Materials.Quicklime.getDust(2)), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(
                 Materials.Acetone.getFluid(1000),
@@ -4967,8 +4962,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C + 4H + O = CH3OH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(23))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Carbon.getDust(1), GTUtility.getIntegratedCircuit(23))
             .fluidInputs(Materials.Hydrogen.getGas(4000), Materials.Oxygen.getGas(1000))
             .fluidOutputs(Materials.Methanol.getFluid(1000))
             .duration(16 * SECONDS)
@@ -4978,8 +4973,8 @@ public class ChemicalRecipes implements Runnable {
         // This recipe collides with one for Vinyl Chloride
         // 2C + 4H + 2O = CH3COOH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Carbon.getDust(2), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Carbon.getDust(2), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Hydrogen.getGas(4000), Materials.Oxygen.getGas(2000))
             .fluidOutputs(Materials.AceticAcid.getFluid(1000))
             .duration(24 * SECONDS)
@@ -4988,24 +4983,24 @@ public class ChemicalRecipes implements Runnable {
 
         // 2CO + 4H = CH3COOH
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.CarbonMonoxide.getGas(2000), Materials.Hydrogen.getGas(4000))
             .fluidOutputs(Materials.AceticAcid.getFluid(1000))
             .duration(16 * SECONDS)
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(8))
             .fluidInputs(Materials.Hydrogen.getGas(9000), Materials.Chlorine.getGas(9000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(9000))
             .duration(7 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(
                 Materials.Chlorine.getGas(10000),
                 Materials.Water.getFluid(10000),
@@ -5017,8 +5012,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H2O + 4Cl + C3H6 + NaOH = C3H5ClO + NaCl·H2O + 2HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(23))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SodiumHydroxide.getDust(3), GTUtility.getIntegratedCircuit(23))
             .fluidInputs(
                 Materials.Propene.getGas(1000),
                 Materials.Chlorine.getGas(4000),
@@ -5033,8 +5028,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H2O + 2Cl + C3H6 + NaOH =Hg= C3H5ClO + NaCl·H2O + 2H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SodiumHydroxide.getDust(3), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Propene.getGas(1000),
                 Materials.Chlorine.getGas(2000),
@@ -5050,8 +5045,8 @@ public class ChemicalRecipes implements Runnable {
 
         // HClO + 2Cl + C3H6 + NaOH = C3H5ClO + NaCl·H2O + HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SodiumHydroxide.getDust(3), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Propene.getGas(1000),
                 Materials.Chlorine.getGas(2000),
@@ -5064,7 +5059,7 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Apatite.getDust(9))
             .itemOutputs(Materials.Gypsum.getDust(40))
             .fluidInputs(Materials.SulfuricAcid.getFluid(5000), Materials.Water.getFluid(10000))
@@ -5073,8 +5068,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Phosphorus.getDust(4), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Phosphorus.getDust(4), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.PhosphorousPentoxide.getDust(14))
             .fluidInputs(Materials.Oxygen.getGas(10000))
             .duration(2 * SECONDS)
@@ -5083,16 +5078,16 @@ public class ChemicalRecipes implements Runnable {
 
         // 2P + 5O + 3H2O = 2H3PO4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Phosphorus.getDust(1), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Phosphorus.getDust(1), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Oxygen.getGas(2500), Materials.Water.getFluid(1500))
             .fluidOutputs(Materials.PhosphoricAcid.getFluid(1000))
             .duration(16 * SECONDS)
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 Materials.Propene.getGas(8000),
                 Materials.Benzene.getFluid(8000),
@@ -5102,8 +5097,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Propene.getGas(1000),
                 Materials.Benzene.getFluid(1000),
@@ -5114,8 +5109,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 Materials.Acetone.getFluid(1000),
                 Materials.Phenol.getFluid(2000),
@@ -5125,8 +5120,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SodiumHydroxide.getDust(6), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SodiumHydroxide.getDust(6), GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Acetone.getFluid(1000),
                 Materials.Phenol.getFluid(2000),
@@ -5137,16 +5132,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.Hydrogen.getGas(9000), Materials.Fluorine.getGas(9000))
             .fluidOutputs(Materials.HydrofluoricAcid.getFluid(9000))
             .duration(7 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.HydrofluoricAcid.getFluid(4000),
                 Materials.Methane.getGas(2000),
@@ -5156,8 +5151,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Silicon.getDust(1), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Silicon.getDust(1), GTUtility.getIntegratedCircuit(24))
             .itemOutputs(Materials.Polydimethylsiloxane.getDust(3))
             .fluidInputs(
                 Materials.Methane.getGas(2000),
@@ -5168,8 +5163,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Silicon.getDust(1), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Silicon.getDust(1), GTUtility.getIntegratedCircuit(24))
             .itemOutputs(Materials.Polydimethylsiloxane.getDust(3))
             .fluidInputs(Materials.Methanol.getFluid(2000), Materials.HydrochloricAcid.getFluid(2000))
             .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(2000))
@@ -5177,16 +5172,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(96)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Nitrogen.getGas(1000), Materials.Hydrogen.getGas(3000))
             .fluidOutputs(Materials.Ammonia.getGas(1000))
             .duration(16 * SECONDS)
             .eut(TierEU.HV * 3 / 4)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Nitrogen.getGas(10000), Materials.Hydrogen.getGas(30000))
             .fluidOutputs(Materials.Ammonia.getGas(10000))
             .duration(2 * MINUTES + 40 * SECONDS)
@@ -5195,8 +5190,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 2NH3 + 7O = N2O4 + 3H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(23))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(23))
             .fluidInputs(Materials.Ammonia.getGas(2000), Materials.Oxygen.getGas(7000))
             .fluidOutputs(Materials.DinitrogenTetroxide.getGas(1000), Materials.Water.getFluid(3000))
             .duration(24 * SECONDS)
@@ -5205,8 +5200,8 @@ public class ChemicalRecipes implements Runnable {
 
         // 7O + 6H + 2N = N2O4 + 3H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(23))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(23))
             .fluidInputs(
                 Materials.Nitrogen.getGas(2000),
                 Materials.Hydrogen.getGas(6000),
@@ -5216,40 +5211,40 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.Oxygen.getGas(100000), Materials.Ammonia.getGas(36000))
             .fluidOutputs(Materials.NitricOxide.getGas(36000), Materials.Water.getFluid(54000))
             .duration(8 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(8))
             .fluidInputs(Materials.Oxygen.getGas(100000), Materials.Ammonia.getGas(36000))
             .fluidOutputs(Materials.NitricOxide.getGas(36000))
             .duration(8 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.NitricOxide.getGas(9000), Materials.Oxygen.getGas(9000))
             .fluidOutputs(Materials.NitrogenDioxide.getGas(9000))
             .duration(4 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.NitrogenDioxide.getGas(27000), Materials.Water.getFluid(9000))
             .fluidOutputs(Materials.NitricAcid.getFluid(18000), Materials.NitricOxide.getGas(9000))
             .duration(6 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Hydrogen.getGas(3000),
                 Materials.Nitrogen.getGas(1000),
@@ -5259,16 +5254,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Ammonia.getGas(1000), Materials.Oxygen.getGas(4000))
             .fluidOutputs(Materials.NitricAcid.getFluid(1000), Materials.Water.getFluid(1000))
             .duration(16 * SECONDS)
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.NitrogenDioxide.getGas(2000),
                 Materials.Oxygen.getGas(1000),
@@ -5278,48 +5273,48 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.Sulfur.getDust(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9), Materials.Sulfur.getDust(9))
             .fluidInputs(Materials.Hydrogen.getGas(18000))
             .fluidOutputs(Materials.HydricSulfide.getGas(9000))
             .duration(4 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.Sulfur.getDust(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9), Materials.Sulfur.getDust(9))
             .fluidInputs(Materials.Oxygen.getGas(18000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(9000))
             .duration(4 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.HydricSulfide.getGas(9000), Materials.Oxygen.getGas(27000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(9000), Materials.Water.getFluid(9000))
             .duration(3 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(8))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(8))
             .fluidInputs(Materials.HydricSulfide.getGas(9000), Materials.Oxygen.getGas(27000))
             .fluidOutputs(Materials.SulfurDioxide.getGas(9000))
             .duration(3 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(7))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(7))
             .itemOutputs(Materials.Sulfur.getDust(27))
             .fluidInputs(Materials.SulfurDioxide.getGas(9000), Materials.HydricSulfide.getGas(18000))
             .duration(3 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.SulfurTrioxide.getGas(9000), Materials.Water.getFluid(9000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(9000))
             .duration(13 * SECONDS)
@@ -5328,16 +5323,16 @@ public class ChemicalRecipes implements Runnable {
 
         // S + O3 + H2O = H2SO4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24), Materials.Sulfur.getDust(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24), Materials.Sulfur.getDust(1))
             .fluidInputs(Materials.Oxygen.getGas(3000), Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
             .duration(24 * SECONDS)
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(7), Materials.Sulfur.getDust(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(7), Materials.Sulfur.getDust(9))
             .fluidInputs(Materials.Oxygen.getGas(27000), Materials.Water.getFluid(9000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(9000))
             .duration(13 * SECONDS)
@@ -5346,8 +5341,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H2S + O4 = H2SO4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.HydricSulfide.getGas(1000), Materials.Oxygen.getGas(4000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
             .duration(24 * SECONDS)
@@ -5356,8 +5351,8 @@ public class ChemicalRecipes implements Runnable {
 
         // SO2 + O + H2O = H2SO4
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.SulfurDioxide.getGas(1000),
                 Materials.Oxygen.getGas(1000),
@@ -5367,8 +5362,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(
                 Materials.SulfurDioxide.getGas(9000),
                 Materials.Oxygen.getGas(9000),
@@ -5378,8 +5373,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(
                 Materials.HydrochloricAcid.getFluid(1000),
                 Materials.Ethylene.getGas(1000),
@@ -5389,8 +5384,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Chlorine.getGas(2000),
                 Materials.Ethylene.getGas(2000),
@@ -5400,8 +5395,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.RawRubber.getDust(18))
             .fluidInputs(
                 Materials.Isoprene.getFluid(1728),
@@ -5411,8 +5406,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.RawRubber.getDust(24))
             .fluidInputs(
                 Materials.Isoprene.getFluid(1728),
@@ -5422,24 +5417,24 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(3))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(1))
             .fluidInputs(Materials.Styrene.getFluid(36), Materials.Butadiene.getGas(108), Materials.Air.getGas(2000))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(3))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(3))
             .fluidInputs(Materials.Styrene.getFluid(72), Materials.Butadiene.getGas(216), Materials.Oxygen.getGas(2000))
             .duration(8 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(4))
             .itemOutputs(
                 Materials.RawStyreneButadieneRubber.getDust(22),
                 Materials.RawStyreneButadieneRubber.getDustSmall(2))
@@ -5452,8 +5447,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(4))
             .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(30))
             .fluidInputs(
                 Materials.Styrene.getFluid(540),
@@ -5464,8 +5459,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.Salt.getDust(18))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9), Materials.Salt.getDust(18))
             .itemOutputs(Materials.SodiumBisulfate.getDust(63))
             .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(9000))
@@ -5473,8 +5468,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.SodiumHydroxide.getDust(27))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9), Materials.SodiumHydroxide.getDust(27))
             .itemOutputs(Materials.SodiumBisulfate.getDust(63))
             .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
             .fluidOutputs(Materials.Water.getFluid(9000))
@@ -5482,8 +5477,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Benzene.getFluid(1000),
                 Materials.Chlorine.getGas(2000),
@@ -5498,8 +5493,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H6 + 2Cl + NaOH = C6H6O + NaCl + HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.SodiumHydroxide.getDust(6), GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.SodiumHydroxide.getDust(6), GTUtility.getIntegratedCircuit(24))
             .itemOutputs(Materials.Salt.getDust(4))
             .fluidInputs(Materials.Benzene.getFluid(2000), Materials.Chlorine.getGas(4000))
             .fluidOutputs(Materials.Phenol.getFluid(2000), Materials.HydrochloricAcid.getFluid(2000))
@@ -5507,24 +5502,24 @@ public class ChemicalRecipes implements Runnable {
             .eut(30)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.LightFuel.getFluid(20000), Materials.HeavyFuel.getFluid(4000))
             .fluidOutputs(Materials.Fuel.getFluid(24000))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Fuel.getFluid(10000), Materials.Tetranitromethane.getFluid(200))
             .fluidOutputs(Materials.NitroFuel.getFluid(10000))
             .duration(6 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.BioDiesel.getFluid(10000), Materials.Tetranitromethane.getFluid(400))
             .fluidOutputs(Materials.NitroFuel.getFluid(9000))
             .duration(6 * SECONDS)
@@ -5533,9 +5528,9 @@ public class ChemicalRecipes implements Runnable {
 
         // CH4 + 2H2O = CO2 + 8H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(11))
-            .fluidInputs(Materials.Methane.getGas(5000), GT_ModHandler.getDistilledWater(10000))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(11))
+            .fluidInputs(Materials.Methane.getGas(5000), GTModHandler.getDistilledWater(10000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(5000), Materials.Hydrogen.getGas(40000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
@@ -5543,24 +5538,24 @@ public class ChemicalRecipes implements Runnable {
 
         // CH4 + H2O = CO + 6H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(12))
-            .fluidInputs(Materials.Methane.getGas(5000), GT_ModHandler.getDistilledWater(5000))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(12))
+            .fluidInputs(Materials.Methane.getGas(5000), GTModHandler.getDistilledWater(5000))
             .fluidOutputs(Materials.CarbonMonoxide.getGas(5000), Materials.Hydrogen.getGas(30000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Nitrogen.getGas(20000), Materials.Oxygen.getGas(10000))
             .fluidOutputs(Materials.NitrousOxide.getGas(10000))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Naphtha.getFluid(16000),
                 Materials.Gas.getGas(2000),
@@ -5571,16 +5566,16 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.GasolineRaw.getFluid(10000), Materials.Toluene.getFluid(1000))
             .fluidOutputs(Materials.GasolineRegular.getFluid(11000))
             .duration(10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.GasolineRegular.getFluid(20000),
                 Materials.Octane.getFluid(2000),
@@ -5594,8 +5589,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H6O + C4H8 = C6H14O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Ethanol.getFluid(1000), Materials.Butene.getGas(1000))
             .fluidOutputs(Materials.AntiKnock.getFluid(1000))
             .duration(20 * SECONDS)
@@ -5604,24 +5599,24 @@ public class ChemicalRecipes implements Runnable {
 
         // CH4O + C4H8 = C5H12O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Methanol.getFluid(1000), Materials.Butene.getGas(1000))
             .fluidOutputs(Materials.MTBEMixture.getGas(1000))
             .duration(20 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Methanol.getFluid(1000), Materials.Butane.getGas(1000))
             .fluidOutputs(Materials.MTBEMixtureAlt.getGas(1000))
             .duration(20 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(
                 Materials.Naquadria.getMolten(4608),
                 Materials.ElectrumFlux.getMolten(4608),
@@ -5633,8 +5628,8 @@ public class ChemicalRecipes implements Runnable {
 
         // CH2O + 2C6H7N + HCl = C13H14N2(HCl) + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 1000),
                 new FluidStack(FluidRegistry.getFluid("aniline"), 2000),
@@ -5646,10 +5641,10 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H5NO2 + 6H =Pd= C6H7N + 2H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("nitrobenzene"), 9000), Materials.Hydrogen.getGas(54000))
             .fluidOutputs(Materials.Water.getFluid(18000), new FluidStack(FluidRegistry.getFluid("aniline"), 9000))
             .duration(45 * SECONDS)
@@ -5658,13 +5653,13 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H6 + HNO3 =H2SO4= C6H5NO2 + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 Materials.Benzene.getFluid(5000),
                 Materials.SulfuricAcid.getFluid(3000),
                 Materials.NitricAcid.getFluid(5000),
-                GT_ModHandler.getDistilledWater(10000))
+                GTModHandler.getDistilledWater(10000))
             .fluidOutputs(
                 new FluidStack(FluidRegistry.getFluid("nitrobenzene"), 5000),
                 Materials.DilutedSulfuricAcid.getFluid(3000))
@@ -5674,8 +5669,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C13H14N2(HCl) + 2COCl2 = C15H10N2O2(5HCl)
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 MaterialsKevlar.DiaminodiphenylmethanMixture.getFluid(1000),
                 new FluidStack(FluidRegistry.getFluid("phosgene"), 2000))
@@ -5684,21 +5679,19 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
             .fluidInputs(MaterialsKevlar.Butyraldehyde.getFluid(9000), Materials.Hydrogen.getGas(18000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("butanol"), 9000))
             .duration(4 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1), GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 1))
             .fluidInputs(
                 new FluidStack(FluidRegistry.getFluid("butanol"), 2000),
                 new FluidStack(FluidRegistry.getFluid("propionicacid"), 1000),
@@ -5707,11 +5700,9 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9), GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 9))
             .fluidInputs(
                 new FluidStack(FluidRegistry.getFluid("butanol"), 18000),
                 new FluidStack(FluidRegistry.getFluid("propionicacid"), 9000),
@@ -5722,8 +5713,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C2H4 + CO + H2O =C4NiO= C3H6O2
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 Materials.Ethylene.getGas(1000),
                 Materials.CarbonMonoxide.getGas(1000),
@@ -5734,8 +5725,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(
                 Materials.Ethylene.getGas(9000),
                 Materials.CarbonMonoxide.getGas(9000),
@@ -5748,8 +5739,8 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H7N + HNO3 =H2SO4,C4H6O3= C6H6N2O2 + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(
                 new FluidStack(FluidRegistry.getFluid("aniline"), 1000),
                 new FluidStack(FluidRegistry.getFluid("molten.aceticanhydride"), 100),
@@ -5759,8 +5750,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(
                 new FluidStack(FluidRegistry.getFluid("aniline"), 9000),
                 new FluidStack(FluidRegistry.getFluid("molten.aceticanhydride"), 900),
@@ -5772,11 +5763,11 @@ public class ChemicalRecipes implements Runnable {
 
         // C6H6N2O2 + 6H =Pd,NO2= C6H8N2 + 2H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 16))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 16))
             .fluidInputs(
                 Materials.NitrogenDioxide.getGas(100),
                 Materials.Hydrogen.getGas(6000),
@@ -5788,20 +5779,20 @@ public class ChemicalRecipes implements Runnable {
 
         // C4H10O2 =Cu= C4H6O2 + 4H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("1,4-butanediol"), 1000))
             .fluidOutputs(MaterialsKevlar.GammaButyrolactone.getFluid(1000), Materials.Hydrogen.getGas(4000))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 9))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 9))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("1,4-butanediol"), 9000))
             .fluidOutputs(MaterialsKevlar.GammaButyrolactone.getFluid(9000), Materials.Hydrogen.getGas(36000))
             .duration(35 * SECONDS)
@@ -5810,13 +5801,13 @@ public class ChemicalRecipes implements Runnable {
 
         // 2CH2O + C2H2 =SiO2,CuO,Bi2O3= C4H6O2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 12))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 12))
             .fluidInputs(
                 MaterialsKevlar.Acetylene.getGas(1000),
                 new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 2000))
@@ -5824,15 +5815,15 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9))
+                GTUtility.getIntegratedCircuit(9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 64),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 44))
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 44))
             .fluidInputs(
                 MaterialsKevlar.Acetylene.getGas(9000),
                 new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 18000))
@@ -5842,23 +5833,23 @@ public class ChemicalRecipes implements Runnable {
 
         // C4H6O2 + 4H =NiAl= C4H10O2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 12),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RaneyNickelActivated, 1))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 12),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RaneyNickelActivated, 1))
             .fluidInputs(Materials.Hydrogen.getGas(4000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("1,4-butanediol"), 1000))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_UV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
+                GTUtility.getIntegratedCircuit(1),
                 CALCIUM_CHLORIDE.getDust(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 9))
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 9))
             .fluidInputs(MaterialsKevlar.NMethylIIPyrrolidone.getFluid(1000))
             .fluidOutputs(
                 MaterialsKevlar.LiquidCrystalKevlar.getFluid(9000),
@@ -5867,12 +5858,12 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_UV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
+                GTUtility.getIntegratedCircuit(9),
                 CALCIUM_CHLORIDE.getDust(7),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 63),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 63))
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 63),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 63))
             .fluidInputs(MaterialsKevlar.NMethylIIPyrrolidone.getFluid(7000))
             .fluidOutputs(
                 MaterialsKevlar.LiquidCrystalKevlar.getFluid(63000),
@@ -5883,10 +5874,10 @@ public class ChemicalRecipes implements Runnable {
 
         // Na2B4O7(H2O)10 + 2HCl = 2NaCl + 4H3BO3 + 5H2O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Borax, 23))
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Borax, 23))
             .itemOutputs(Materials.Salt.getDust(4))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(2000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("boricacid"), 4000), Materials.Water.getFluid(5000))
@@ -5896,8 +5887,8 @@ public class ChemicalRecipes implements Runnable {
 
         // H3BO3 + 3CH4O =H2SO4= C3H9BO3 + 3H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(
                 Materials.Methanol.getFluid(3000),
                 new FluidStack(FluidRegistry.getFluid("boricacid"), 1000),
@@ -5907,8 +5898,8 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(
                 Materials.Methanol.getFluid(27000),
                 new FluidStack(FluidRegistry.getFluid("boricacid"), 9000),
@@ -5920,10 +5911,10 @@ public class ChemicalRecipes implements Runnable {
 
         // RhCl3 + 3C18H15P + 3NaBH4 + CO = RhC55H46P3O + 3NaCl + 3B + 11H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RhodiumChloride, 4),
+                GTUtility.getIntegratedCircuit(1),
+                GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RhodiumChloride, 4),
                 MaterialsKevlar.Triphenylphosphene.getDust(64),
                 MaterialsKevlar.Triphenylphosphene.getDust(38),
                 MaterialsKevlar.SodiumBorohydride.getDust(18))
@@ -5940,9 +5931,9 @@ public class ChemicalRecipes implements Runnable {
 
         // 2NaOH + N2H4 =Mn= 2N + 2H2O + 2NaH
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(9),
+                GTUtility.getIntegratedCircuit(9),
                 Materials.SodiumHydroxide.getDust(6),
                 Materials.Manganese.getDustTiny(1))
             .itemOutputs(MaterialsKevlar.SodiumHydride.getDust(4))
@@ -5952,9 +5943,9 @@ public class ChemicalRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(multiblockChemicalReactorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_Utility.getIntegratedCircuit(18),
+                GTUtility.getIntegratedCircuit(18),
                 Materials.SodiumHydroxide.getDust(54),
                 Materials.Manganese.getDust(1))
             .itemOutputs(MaterialsKevlar.SodiumHydride.getDust(36))
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java
index 072992d07e..b17eecc748 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java
@@ -4,20 +4,20 @@ import static gregtech.api.enums.Mods.Forestry;
 import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.recipe.RecipeMaps.circuitAssemblerRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.loaders.postload.GT_MachineRecipeLoader.solderingMats;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.loaders.postload.MachineRecipeLoader.solderingMats;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.SubTag;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class CircuitAssemblerRecipes implements Runnable {
 
@@ -39,10 +39,10 @@ public class CircuitAssemblerRecipes implements Runnable {
 
             // Railcraft Circuits
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Coated_Basic.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
                     ItemList.Cover_Controller.get(1))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 4L, 0))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -50,10 +50,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Coated_Basic.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
                     ItemList.Sensor_LV.get(1))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 4L, 1))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -61,10 +61,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Coated_Basic.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 1),
                     getModItem(Railcraft.ID, "part.signal.lamp", 1L, 0))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 4L, 2))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -72,10 +72,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Phenolic_Good.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1),
                     ItemList.Cover_Controller.get(1))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 8L, 0))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -83,10 +83,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Phenolic_Good.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1),
                     ItemList.Sensor_LV.get(1))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 8L, 1))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -94,10 +94,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Phenolic_Good.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1),
                     getModItem(Railcraft.ID, "part.signal.lamp", 1L, 0))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 8L, 2))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -105,10 +105,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Epoxy_Advanced.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1),
                     ItemList.Cover_Controller.get(1))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 16L, 0))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -116,10 +116,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Epoxy_Advanced.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1),
                     ItemList.Sensor_LV.get(1))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 16L, 1))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -127,10 +127,10 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Epoxy_Advanced.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1),
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1),
                     getModItem(Railcraft.ID, "part.signal.lamp", 1L, 0))
                 .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 16L, 2))
                 .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
@@ -138,56 +138,56 @@ public class CircuitAssemblerRecipes implements Runnable {
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Coated_Basic.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.ULV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Iron, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Iron, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.ULV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Iron, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Iron, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 0))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Coated_Basic.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Bronze, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Bronze, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Bronze, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Bronze, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Bronze, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Bronze, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 1))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Phenolic_Good.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Steel, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Steel, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 2))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Phenolic_Good.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 3))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
@@ -204,12 +204,12 @@ public class CircuitAssemblerRecipes implements Runnable {
 
         // alternative version of the copper electron tube
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.AnnealedCopper, 2))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.AnnealedCopper, 2))
             .itemOutputs(getModItem(Forestry.ID, "thermionicTubes", 4L, 0))
             .fluidInputs(Materials.Glass.getMolten(576))
             .duration(10 * SECONDS)
@@ -218,12 +218,12 @@ public class CircuitAssemblerRecipes implements Runnable {
 
         // alternative version of the iron electron tube
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
-                GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
-                GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.WroughtIron, 2))
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
+                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
+                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.WroughtIron, 2))
             .itemOutputs(getModItem(Forestry.ID, "thermionicTubes", 4L, 3))
             .fluidInputs(Materials.Glass.getMolten(576))
             .duration(10 * SECONDS)
@@ -231,27 +231,27 @@ public class CircuitAssemblerRecipes implements Runnable {
             .addTo(circuitAssemblerRecipes);
 
         ItemStack[] rodMaterials = new ItemStack[] {
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Copper, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Tin, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Bronze, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Iron, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Gold, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Diamond, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Copper, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Tin, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Bronze, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Iron, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Gold, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Diamond, 2L),
             getModItem(NewHorizonsCoreMod.ID, "item.LongObsidianRod", 2L, 0),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Blaze, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Rubber, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Emerald, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Apatite, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Lapis, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.EnderEye, 2L),
-            GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Uranium, 2L), };
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Blaze, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Rubber, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Emerald, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Apatite, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Lapis, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.EnderEye, 2L),
+            GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.Uranium, 2L), };
 
         for (int metaid = 0; metaid < rodMaterials.length; metaid++) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+                    GTOreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
                     rodMaterials[metaid])
                 .itemOutputs(getModItem(Forestry.ID, "thermionicTubes", 4L, metaid))
                 .fluidInputs(Materials.Glass.getMolten(576))
@@ -265,56 +265,56 @@ public class CircuitAssemblerRecipes implements Runnable {
             int tMultiplier = tMat.contains(SubTag.SOLDERING_MATERIAL_GOOD) ? 1
                 : tMat.contains(SubTag.SOLDERING_MATERIAL_BAD) ? 4 : 2;
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Coated_Basic.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.ULV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Iron, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Iron, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.ULV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Iron, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Iron, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 0))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Coated_Basic.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Bronze, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Bronze, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Bronze, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.LV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Bronze, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Bronze, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Bronze, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 1))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Phenolic_Good.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Steel, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Steel, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 2))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
                 .eut((int) TierEU.RECIPE_LV)
                 .addTo(circuitAssemblerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.Circuit_Board_Phenolic_Good.get(1),
-                    GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 4),
-                    GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 2),
+                    GTOreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, 2),
+                    GTOreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 4),
+                    GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 3))
                 .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
                 .duration(10 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java
index a5144260c2..21e6421a62 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java
@@ -3,22 +3,21 @@ package gregtech.loaders.postload.recipes;
 import static gregtech.api.enums.Mods.AppliedEnergistics2;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator.sapling_Rainforest;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gtPlusPlus.xmod.bop.blocks.BOPBlockRegistrator.sapling_Rainforest;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
-
-import gregtech.api.enums.GT_Values;
+import bartworks.system.material.WerkstoffLoader;
+import gregtech.api.enums.GTValues;
 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.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
 import mods.railcraft.common.items.RailcraftToolItems;
 
@@ -26,203 +25,203 @@ public class CompressorRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Cell_Empty.get(1))
             .itemOutputs(ItemList.Cell_Air.get(1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.sand, 4))
             .itemOutputs(new ItemStack(Blocks.sandstone, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("iridiumShard", 9))
-            .itemOutputs(GT_ModHandler.getIC2Item("iridiumOre", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("iridiumShard", 9))
+            .itemOutputs(GTModHandler.getIC2Item("iridiumOre", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.clay_ball, 4))
             .itemOutputs(new ItemStack(Blocks.clay, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.brick, 4))
             .itemOutputs(new ItemStack(Blocks.brick_block, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.netherbrick, 4))
             .itemOutputs(new ItemStack(Blocks.nether_brick, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("smallPlutonium", 9))
-            .itemOutputs(GT_ModHandler.getIC2Item("Plutonium", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("smallPlutonium", 9))
+            .itemOutputs(GTModHandler.getIC2Item("Plutonium", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("smallUran235", 9))
-            .itemOutputs(GT_ModHandler.getIC2Item("Uran235", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("smallUran235", 9))
+            .itemOutputs(GTModHandler.getIC2Item("Uran235", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.water_bucket, 1))
             .itemOutputs(new ItemStack(Blocks.snow, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.snowball, 4))
             .itemOutputs(new ItemStack(Blocks.snow, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Cell_Water.get(1))
             .itemOutputs(new ItemStack(Blocks.snow, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.snow, 1))
             .itemOutputs(new ItemStack(Blocks.ice, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("carbonMesh", 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("carbonPlate", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("carbonMesh", 1))
+            .itemOutputs(GTModHandler.getIC2Item("carbonPlate", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("coalBall", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("coalBall", 1))
             .itemOutputs(ItemList.IC2_Compressed_Coal_Ball.get(1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 8L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 8L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(sapling_Rainforest, 8))
             .itemOutputs(ItemList.IC2_Plantball.get(1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Compressed_Coal_Chunk.get(1))
             .itemOutputs(ItemList.IC2_Industrial_Diamond.get(1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("Uran238", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1))
+            .itemOutputs(GTModHandler.getIC2Item("Uran238", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("Uran235", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1))
+            .itemOutputs(GTModHandler.getIC2Item("Uran235", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("Plutonium", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
+            .itemOutputs(GTModHandler.getIC2Item("Plutonium", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium235, 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("smallUran235", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium235, 1))
+            .itemOutputs(GTModHandler.getIC2Item("smallUran235", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("smallPlutonium", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1))
+            .itemOutputs(GTModHandler.getIC2Item("smallPlutonium", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.ice, 2, 32767))
             .itemOutputs(new ItemStack(Blocks.packed_ice, 1, 0))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1))
             .itemOutputs(new ItemStack(Blocks.ice, 1, 0))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 4))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 10))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 11))
             .itemOutputs(new ItemStack(Blocks.quartz_block, 1, 0))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 12))
             .itemOutputs(getModItem(AppliedEnergistics2.ID, "tile.BlockFluix", 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.quartz, 4, 0))
             .itemOutputs(new ItemStack(Blocks.quartz_block, 1, 0))
             .duration(15 * SECONDS)
@@ -235,21 +234,21 @@ public class CompressorRecipes implements Runnable {
          * .addTo(sCompressorRecipes);
          */
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 4))
             .itemOutputs(new ItemStack(Blocks.glowstone, 1))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Fireclay.getDust(1))
             .itemOutputs(ItemList.CompressedFireclay.get(1))
             .duration(4 * SECONDS)
             .eut(4)
             .addTo(compressorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(WerkstoffLoader.MagnetoResonaticDust.get(OrePrefixes.gem, 9))
             .itemOutputs(WerkstoffLoader.MagnetoResonaticDust.get(OrePrefixes.block, 1))
             .duration(15 * SECONDS)
@@ -257,7 +256,7 @@ public class CompressorRecipes implements Runnable {
             .addTo(compressorRecipes);
 
         if (Railcraft.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(RailcraftToolItems.getCoalCoke(9))
                 .itemOutputs(EnumCube.COKE_BLOCK.getItem())
                 .duration(15 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java
index 6fc53a5675..7833b6fc5f 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java
@@ -1,20 +1,20 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
-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 gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.UniversalChemical;
 
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTUtility;
 
 public class CropProcessingRecipes implements Runnable {
 
@@ -123,17 +123,17 @@ public class CropProcessingRecipes implements Runnable {
 
     public void addProcess(ItemStack tCrop, Materials aMaterial, Materials aMaterialOut, int chance,
         boolean aMainOutput) {
-        if (tCrop == null || aMaterial == null || GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1) == null)
+        if (tCrop == null || aMaterial == null || GTOreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1) == null)
             return;
 
         FluidStack fluidOutputChemReactor = aMaterialOut.mOreByProducts.isEmpty() ? null
             : aMaterialOut.mOreByProducts.get(0)
                 .getMolten(144);
 
-        GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+        GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
         recipeBuilder
-            .itemInputs(GT_Utility.copyAmount(9, tCrop), GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4))
+            .itemInputs(GTUtility.copyAmount(9, tCrop), GTOreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4))
             .fluidInputs(Materials.Water.getFluid(1000));
         if (fluidOutputChemReactor != null) {
             recipeBuilder.fluidOutputs(fluidOutputChemReactor);
@@ -142,9 +142,9 @@ public class CropProcessingRecipes implements Runnable {
             .eut(24)
             .addTo(UniversalChemical);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.copyAmount(16, tCrop))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.copyAmount(16, tCrop))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 1))
             .fluidInputs(Materials.UUMatter.getFluid(Math.max(1, ((aMaterial.getMass() + 9) / 10))))
             .duration((int) (aMaterial.getMass() * 128))
             .eut(384)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java
index 1d0eeecd8b..915c254ba1 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java
@@ -4,21 +4,21 @@ import static gregtech.api.enums.Mods.BuildCraftTransport;
 import static gregtech.api.enums.Mods.Forestry;
 import static gregtech.api.enums.Mods.TinkerConstruct;
 import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class CuttingRecipes implements Runnable {
 
@@ -29,7 +29,7 @@ public class CuttingRecipes implements Runnable {
             recipeWithClassicFluids(
                 new ItemStack[] { ItemList.Circuit_Silicon_Ingot.get(1) },
                 new ItemStack[] { ItemList.Circuit_Silicon_Wafer.get(16),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 4) },
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 4) },
                 20 * SECONDS,
                 TierEU.RECIPE_LV,
                 false);
@@ -37,7 +37,7 @@ public class CuttingRecipes implements Runnable {
             recipeWithClassicFluids(
                 new ItemStack[] { ItemList.Circuit_Silicon_Ingot2.get(1) },
                 new ItemStack[] { ItemList.Circuit_Silicon_Wafer2.get(32),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 8) },
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 8) },
                 40 * SECONDS,
                 TierEU.RECIPE_MV,
                 true);
@@ -45,7 +45,7 @@ public class CuttingRecipes implements Runnable {
             recipeWithClassicFluids(
                 new ItemStack[] { ItemList.Circuit_Silicon_Ingot3.get(1) },
                 new ItemStack[] { ItemList.Circuit_Silicon_Wafer3.get(64),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 16) },
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 16) },
                 1 * MINUTES + 20 * SECONDS,
                 TierEU.RECIPE_HV,
                 true);
@@ -53,7 +53,7 @@ public class CuttingRecipes implements Runnable {
             recipeWithPurifiedWater(
                 new ItemStack[] { ItemList.Circuit_Silicon_Ingot3.get(1) },
                 new ItemStack[] { ItemList.Circuit_Silicon_Wafer3.get(128),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 16) },
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 16) },
                 Materials.Grade1PurifiedWater,
                 Materials.Grade2PurifiedWater,
                 (int) ((1 * MINUTES + 20 * SECONDS) * 0.75),
@@ -63,7 +63,7 @@ public class CuttingRecipes implements Runnable {
             recipeWithPurifiedWater(
                 new ItemStack[] { ItemList.Circuit_Silicon_Ingot4.get(1) },
                 new ItemStack[] { ItemList.Circuit_Silicon_Wafer4.get(64), ItemList.Circuit_Silicon_Wafer4.get(32),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 32) },
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 32) },
                 Materials.Grade3PurifiedWater,
                 Materials.Grade4PurifiedWater,
                 2 * MINUTES,
@@ -73,7 +73,7 @@ public class CuttingRecipes implements Runnable {
             recipeWithPurifiedWater(
                 new ItemStack[] { ItemList.Circuit_Silicon_Ingot5.get(1) },
                 new ItemStack[] { ItemList.Circuit_Silicon_Wafer5.get(64), ItemList.Circuit_Silicon_Wafer5.get(64),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 64) },
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 64) },
                 Materials.Grade5PurifiedWater,
                 Materials.Grade6PurifiedWater,
                 2 * MINUTES + 40 * SECONDS,
@@ -166,7 +166,7 @@ public class CuttingRecipes implements Runnable {
 
         recipeWithClassicFluids(
             new ItemStack[] { new ItemStack(Blocks.glowstone, 1, 0) },
-            new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Glowstone, 4) },
+            new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.plate, Materials.Glowstone, 4) },
             5 * SECONDS,
             16,
             false);
@@ -241,7 +241,7 @@ public class CuttingRecipes implements Runnable {
 
     public void recipeWithPurifiedWater(ItemStack[] inputs, ItemStack[] outputs, Materials lowTierWater,
         Materials highTierWater, int duration, int boostedDuration, long eut) {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(inputs)
             .itemOutputs(outputs)
             .fluidInputs(lowTierWater.getFluid(100L))
@@ -249,7 +249,7 @@ public class CuttingRecipes implements Runnable {
             .eut(eut)
             .addTo(cutterRecipes);
         // Bonus for using higher tier water
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(inputs)
             .itemOutputs(outputs)
             .fluidInputs(highTierWater.getFluid(100L))
@@ -261,7 +261,7 @@ public class CuttingRecipes implements Runnable {
     public void recipeWithClassicFluids(ItemStack[] inputs, ItemStack[] outputs, int duration, long eut,
         boolean cleanroomRequired) {
         if (cleanroomRequired) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(inputs)
                 .itemOutputs(outputs)
                 .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, duration * eut / 320))))
@@ -270,16 +270,16 @@ public class CuttingRecipes implements Runnable {
                 .requiresCleanRoom()
                 .addTo(cutterRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(inputs)
                 .itemOutputs(outputs)
-                .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, duration * eut / 426))))
+                .fluidInputs(GTModHandler.getDistilledWater(Math.max(3, Math.min(750, duration * eut / 426))))
                 .duration(2 * duration)
                 .eut(eut)
                 .requiresCleanRoom()
                 .addTo(cutterRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(inputs)
                 .itemOutputs(outputs)
                 .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, duration * eut / 1280))))
@@ -288,7 +288,7 @@ public class CuttingRecipes implements Runnable {
                 .requiresCleanRoom()
                 .addTo(cutterRecipes);
         } else {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(inputs)
                 .itemOutputs(outputs)
                 .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, duration * eut / 320))))
@@ -296,15 +296,15 @@ public class CuttingRecipes implements Runnable {
                 .eut(eut)
                 .addTo(cutterRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(inputs)
                 .itemOutputs(outputs)
-                .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, duration * eut / 426))))
+                .fluidInputs(GTModHandler.getDistilledWater(Math.max(3, Math.min(750, duration * eut / 426))))
                 .duration(2 * duration)
                 .eut(eut)
                 .addTo(cutterRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(inputs)
                 .itemOutputs(outputs)
                 .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, duration * eut / 1280))))
diff --git a/src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java
index dfbb2501f0..5354067da3 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java
@@ -3,26 +3,26 @@ package gregtech.loaders.postload.recipes;
 import static gregtech.api.enums.Mods.TinkerConstruct;
 import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
 import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsKevlar;
 import gregtech.api.enums.MaterialsOreAlum;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeBuilder;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeBuilder;
+import gregtech.api.util.GTUtility;
 
 public class DistilleryRecipes implements Runnable {
 
@@ -32,104 +32,104 @@ public class DistilleryRecipes implements Runnable {
         distillationTowerRecipes();
         universalDistillationTowerRecipes();
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Creosote.getFluid(100L))
             .fluidOutputs(Materials.Lubricant.getFluid(32L))
             .duration(12 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.SeedOil.getFluid(32L))
             .fluidOutputs(Materials.Lubricant.getFluid(8L))
             .duration(4 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.FishOil.getFluid(32L))
             .fluidOutputs(Materials.Lubricant.getFluid(8L))
             .duration(4 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.Oil.getFluid(120L))
             .fluidOutputs(Materials.Lubricant.getFluid(60L))
             .duration(8 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.OilLight.getFluid(120L))
             .fluidOutputs(Materials.Lubricant.getFluid(30L))
             .duration(8 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.OilMedium.getFluid(120L))
             .fluidOutputs(Materials.Lubricant.getFluid(60L))
             .duration(8 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(24))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(24))
             .fluidInputs(Materials.OilHeavy.getFluid(120L))
             .fluidOutputs(Materials.Lubricant.getFluid(90L))
             .duration(8 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Biomass.getFluid(40L))
             .fluidOutputs(Materials.Ethanol.getFluid(12L))
             .duration(16 * TICKS)
             .eut(24)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(5))
             .fluidInputs(Materials.Biomass.getFluid(40L))
             .fluidOutputs(Materials.Water.getFluid(12L))
             .duration(16 * TICKS)
             .eut(24)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(5))
             .fluidInputs(Materials.Water.getFluid(5L))
-            .fluidOutputs(GT_ModHandler.getDistilledWater(5L))
+            .fluidOutputs(GTModHandler.getDistilledWater(5L))
             .duration(16 * TICKS)
             .eut(10)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(getFluidStack("potion.potatojuice", 2))
             .fluidOutputs(getFluidStack("potion.vodka", 1))
             .duration(16 * TICKS)
             .eut(16)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(getFluidStack("potion.lemonade", 2))
             .fluidOutputs(getFluidStack("potion.alcopops", 1))
             .duration(16 * TICKS)
             .eut(16)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(MaterialsOreAlum.SluiceSand.getDust(1))
             .fluidInputs(MaterialsOreAlum.SluiceJuice.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(500))
@@ -137,32 +137,32 @@ public class DistilleryRecipes implements Runnable {
             .eut(16)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(6))
             .fluidInputs(Materials.WoodTar.getFluid(200))
             .fluidOutputs(MaterialsKevlar.IIIDimethylbenzene.getFluid(30))
             .duration(16 * TICKS)
             .eut(64)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(6))
             .fluidInputs(Materials.CharcoalByproducts.getGas(200))
             .fluidOutputs(MaterialsKevlar.IIIDimethylbenzene.getFluid(20))
             .duration(5 * SECONDS)
             .eut(64)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(7))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(7))
             .fluidInputs(Materials.WoodTar.getFluid(200))
             .fluidOutputs(MaterialsKevlar.IVDimethylbenzene.getFluid(30))
             .duration(16 * TICKS)
             .eut(64)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(7))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(7))
             .fluidInputs(Materials.CharcoalByproducts.getGas(200))
             .fluidOutputs(MaterialsKevlar.IVDimethylbenzene.getFluid(20))
             .duration(5 * SECONDS)
@@ -170,17 +170,17 @@ public class DistilleryRecipes implements Runnable {
             .addTo(distilleryRecipes);
         // (NaCl·H2O) = NaCl + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Salt.getDust(2))
             .fluidInputs(Materials.SaltWater.getFluid(1000))
-            .fluidOutputs(GT_ModHandler.getDistilledWater(1000))
+            .fluidOutputs(GTModHandler.getDistilledWater(1000))
             .duration(1 * MINUTES + 20 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(Materials.AceticAcid.getFluid(25))
@@ -188,8 +188,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(Materials.Water.getFluid(375))
@@ -197,8 +197,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(3))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(Materials.Ethanol.getFluid(150))
@@ -206,8 +206,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(4))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(Materials.Methanol.getFluid(150))
@@ -215,8 +215,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(5))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(Materials.Ammonia.getGas(100))
@@ -224,8 +224,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(6))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(400))
@@ -233,8 +233,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(7))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(7))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(Materials.Methane.getGas(600))
@@ -242,8 +242,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(17))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(17))
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 1800))
@@ -251,24 +251,24 @@ public class DistilleryRecipes implements Runnable {
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Methane.getGas(1000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 3000))
             .duration(8 * SECONDS)
             .eut(8)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.HeavyFuel.getFluid(100))
             .fluidOutputs(Materials.Benzene.getFluid(40))
             .duration(8 * SECONDS)
             .eut(24)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(3))
             .fluidInputs(Materials.HeavyFuel.getFluid(100))
             .fluidOutputs(Materials.Phenol.getFluid(25))
             .duration(8 * SECONDS)
@@ -276,64 +276,64 @@ public class DistilleryRecipes implements Runnable {
             .addTo(distilleryRecipes);
         // Dimethylbenzene
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(5))
             .fluidInputs(Materials.WoodTar.getFluid(200))
             .fluidOutputs(Materials.Dimethylbenzene.getFluid(30))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(5))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(5))
             .fluidInputs(Materials.CharcoalByproducts.getGas(200))
             .fluidOutputs(Materials.Dimethylbenzene.getFluid(20))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(new FluidStack(ItemList.sOilExtraHeavy, 10))
             .fluidOutputs(Materials.OilHeavy.getFluid(15))
             .duration(16 * TICKS)
             .eut(24)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.HeavyFuel.getFluid(10L))
             .fluidOutputs(new FluidStack(ItemList.sToluene, 4))
             .duration(16 * TICKS)
             .eut(24)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(new FluidStack(ItemList.sToluene, 30))
             .fluidOutputs(Materials.LightFuel.getFluid(30L))
             .duration(16 * TICKS)
             .eut(24)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 20))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 32))
             .duration(2 * SECONDS)
             .eut(16)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 4))
             .fluidOutputs(Materials.Water.getFluid(2))
             .duration(4 * SECONDS)
             .eut(30)
             .addTo(distilleryRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(getFluidStack("potion.wheatyjuice", 75))
             .fluidOutputs(getFluidStack("potion.scotch", 1))
             .duration(1 * SECONDS)
@@ -342,16 +342,16 @@ public class DistilleryRecipes implements Runnable {
 
         if (TinkerConstruct.isModLoaded()) {
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(1))
                 .fluidInputs(Materials.Glue.getFluid(8L))
                 .fluidOutputs(getFluidStack("glue", 8))
                 .duration(1 * TICKS)
                 .eut(24)
                 .addTo(distilleryRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(1))
                 .fluidInputs(getFluidStack("glue", 8))
                 .fluidOutputs(Materials.Glue.getFluid(4L))
                 .duration(1 * TICKS)
@@ -362,63 +362,63 @@ public class DistilleryRecipes implements Runnable {
     }
 
     public void distillationTowerRecipes() {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.Creosote.getFluid(1000L))
             .fluidOutputs(Materials.Lubricant.getFluid(500L))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.SeedOil.getFluid(1400L))
             .fluidOutputs(Materials.Lubricant.getFluid(500L))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.FishOil.getFluid(1200L))
             .fluidOutputs(Materials.Lubricant.getFluid(500L))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
+        GTValues.RA.stdBuilder()
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
             .fluidInputs(Materials.Biomass.getFluid(1000L))
             .fluidOutputs(Materials.Ethanol.getFluid(600L), Materials.Water.getFluid(300L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(400)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Water.getFluid(1000L))
-            .fluidOutputs(GT_ModHandler.getDistilledWater(1000L))
+            .fluidOutputs(GTModHandler.getDistilledWater(1000L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.OilLight.getFluid(1000L))
             .fluidOutputs(Materials.Lubricant.getFluid(250L))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.OilMedium.getFluid(1000L))
             .fluidOutputs(Materials.Lubricant.getFluid(500L))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.OilHeavy.getFluid(1000L))
             .fluidOutputs(Materials.Lubricant.getFluid(750L))
             .duration(20 * SECONDS)
@@ -426,16 +426,16 @@ public class DistilleryRecipes implements Runnable {
             .addTo(distillationTowerRecipes);
         // C15H10N2O2(5HCl) = C15H10N2O2 + 5HCl
 
-        GT_Values.RA.stdBuilder()
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 29L))
+        GTValues.RA.stdBuilder()
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 29L))
             .fluidInputs(MaterialsKevlar.DiphenylmethaneDiisocyanateMixture.getFluid(1000L))
             .fluidOutputs(Materials.HydrochloricAcid.getFluid(5000L))
             .duration(2 * MINUTES + 5 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Charcoal.getDustSmall(1))
             .fluidInputs(Materials.CharcoalByproducts.getGas(1000))
             .fluidOutputs(
@@ -447,8 +447,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(256)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.WoodTar.getFluid(1000))
             .fluidOutputs(
                 Materials.Creosote.getFluid(250),
@@ -460,8 +460,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(256)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(3))
             .itemOutputs(Materials.Charcoal.getDustSmall(1))
             .fluidInputs(Materials.CharcoalByproducts.getGas(1000))
             .fluidOutputs(
@@ -473,8 +473,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(256)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(4))
             .itemOutputs(Materials.Charcoal.getDustSmall(1))
             .fluidInputs(Materials.CharcoalByproducts.getGas(1000))
             .fluidOutputs(
@@ -488,8 +488,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(256)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(4))
             .fluidInputs(Materials.WoodTar.getFluid(1000))
             .fluidOutputs(
                 Materials.Creosote.getFluid(250),
@@ -503,8 +503,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(256)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.OilLight.getFluid(1000))
             .fluidOutputs(
                 Materials.SulfuricHeavyFuel.getFluid(70),
@@ -516,8 +516,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.OilMedium.getFluid(1000))
             .fluidOutputs(
                 Materials.SulfuricHeavyFuel.getFluid(100),
@@ -529,8 +529,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.Oil.getFluid(1000L))
             .fluidOutputs(
                 Materials.SulfuricHeavyFuel.getFluid(300),
@@ -542,8 +542,8 @@ public class DistilleryRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(9))
             .fluidInputs(Materials.OilHeavy.getFluid(1000))
             .fluidOutputs(
                 Materials.SulfuricHeavyFuel.getFluid(450),
@@ -556,7 +556,7 @@ public class DistilleryRecipes implements Runnable {
             .addTo(distillationTowerRecipes);
         // 9C5H12O = 4C6H14O + 5CH4O + 4C4H8
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.MTBEMixture.getGas(900L))
             .fluidOutputs(
                 Materials.AntiKnock.getFluid(400L),
@@ -566,7 +566,7 @@ public class DistilleryRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.MTBEMixtureAlt.getGas(900L))
             .fluidOutputs(
                 Materials.AntiKnock.getFluid(400L),
@@ -576,7 +576,7 @@ public class DistilleryRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
             .fluidOutputs(
@@ -591,14 +591,14 @@ public class DistilleryRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(distillationTowerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemOutputs(ItemList.IC2_Fertilizer.get(1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 3000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 8000), Materials.Water.getFluid(125L))
             .duration(12 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(distillationTowerRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(new FluidStack(ItemList.sOilExtraHeavy, 1000))
             .fluidOutputs(Materials.OilHeavy.getFluid(1500))
             .duration(16 * TICKS)
@@ -609,17 +609,17 @@ public class DistilleryRecipes implements Runnable {
     public void universalDistillationTowerRecipes() {
         addUniversalDistillationRecipewithCircuit(
             Materials.WoodTar.getFluid(1000),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(3) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(3) },
             new FluidStack[] { Materials.Creosote.getFluid(250), Materials.Phenol.getFluid(100),
                 Materials.Benzene.getFluid(400), Materials.Toluene.getFluid(100),
                 MaterialsKevlar.IVDimethylbenzene.getFluid(150) },
-            GT_Values.NI,
+            GTValues.NI,
             40,
             256);
 
         addUniversalDistillationRecipewithCircuit(
             Materials.CharcoalByproducts.getGas(1000),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.WoodTar.getFluid(250), Materials.WoodVinegar.getFluid(400),
                 Materials.WoodGas.getGas(250), Materials.Dimethylbenzene.getFluid(100) },
             Materials.Charcoal.getDustSmall(1),
@@ -628,34 +628,34 @@ public class DistilleryRecipes implements Runnable {
 
         addUniversalDistillationRecipewithCircuit(
             Materials.WoodGas.getGas(1000),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.CarbonDioxide.getGas(390), Materials.Ethylene.getGas(120),
                 Materials.Methane.getGas(130), Materials.CarbonMonoxide.getGas(240), Materials.Hydrogen.getGas(120) },
-            GT_Values.NI,
+            GTValues.NI,
             40,
             256);
         addUniversalDistillationRecipewithCircuit(
             Materials.WoodVinegar.getFluid(1000),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.AceticAcid.getFluid(100), Materials.Water.getFluid(500),
                 Materials.Ethanol.getFluid(10), Materials.Methanol.getFluid(300), Materials.Acetone.getFluid(50),
                 Materials.MethylAcetate.getFluid(10) },
-            GT_Values.NI,
+            GTValues.NI,
             40,
             256);
         addUniversalDistillationRecipewithCircuit(
             Materials.WoodTar.getFluid(1000),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.Creosote.getFluid(250), Materials.Phenol.getFluid(100),
                 Materials.Benzene.getFluid(400), Materials.Toluene.getFluid(100),
                 Materials.Dimethylbenzene.getFluid(150) },
-            GT_Values.NI,
+            GTValues.NI,
             40,
             256);
 
         addUniversalDistillationRecipewithCircuit(
             Materials.OilLight.getFluid(100),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(7), Materials.SulfuricLightFuel.getFluid(13),
                 Materials.SulfuricNaphtha.getFluid(20), Materials.SulfuricGas.getGas(160) },
             null,
@@ -663,7 +663,7 @@ public class DistilleryRecipes implements Runnable {
             96);
         addUniversalDistillationRecipewithCircuit(
             Materials.OilMedium.getFluid(100),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(10), Materials.SulfuricLightFuel.getFluid(50),
                 Materials.SulfuricNaphtha.getFluid(150), Materials.SulfuricGas.getGas(60) },
             null,
@@ -671,7 +671,7 @@ public class DistilleryRecipes implements Runnable {
             96);
         addUniversalDistillationRecipewithCircuit(
             Materials.Oil.getFluid(100L),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(30), Materials.SulfuricLightFuel.getFluid(100),
                 Materials.SulfuricNaphtha.getFluid(40), Materials.SulfuricGas.getGas(120) },
             null,
@@ -679,7 +679,7 @@ public class DistilleryRecipes implements Runnable {
             96);
         addUniversalDistillationRecipewithCircuit(
             Materials.OilHeavy.getFluid(100),
-            new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+            new ItemStack[] { GTUtility.getIntegratedCircuit(1) },
             new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(100), Materials.SulfuricLightFuel.getFluid(45),
                 Materials.SulfuricNaphtha.getFluid(15), Materials.SulfuricGas.getGas(60) },
             null,
@@ -690,14 +690,14 @@ public class DistilleryRecipes implements Runnable {
         addUniversalDistillationRecipe(
             Materials.DilutedHydrochloricAcid.getFluid(2000),
             new FluidStack[] { Materials.Water.getFluid(1000), Materials.HydrochloricAcid.getFluid(1000) },
-            GT_Values.NI,
+            GTValues.NI,
             600,
             64);
 
         addUniversalDistillationRecipe(
             getFluidStack("potion.vinegar", 40),
             new FluidStack[] { Materials.AceticAcid.getFluid(5), Materials.Water.getFluid(35) },
-            GT_Values.NI,
+            GTValues.NI,
             20,
             64);
 
@@ -711,7 +711,7 @@ public class DistilleryRecipes implements Runnable {
         addUniversalDistillationRecipe(
             Materials.DilutedSulfuricAcid.getFluid(3000),
             new FluidStack[] { Materials.SulfuricAcid.getFluid(2000), Materials.Water.getFluid(1000) },
-            GT_Values.NI,
+            GTValues.NI,
             600,
             120);
 
@@ -719,7 +719,7 @@ public class DistilleryRecipes implements Runnable {
         addUniversalDistillationRecipe(
             Materials.Acetone.getFluid(1000),
             new FluidStack[] { Materials.Ethenone.getGas(1000), Materials.Methane.getGas(1000) },
-            GT_Values.NI,
+            GTValues.NI,
             80,
             640);
 
@@ -727,14 +727,14 @@ public class DistilleryRecipes implements Runnable {
             Materials.Gas.getGas(1000),
             new FluidStack[] { Materials.Butane.getGas(60), Materials.Propane.getGas(70), Materials.Ethane.getGas(100),
                 Materials.Methane.getGas(750), Materials.Helium.getGas(20) },
-            GT_Values.NI,
+            GTValues.NI,
             240,
             120);
 
         addUniversalDistillationRecipe(
             Materials.Ethylene.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Ethane.getGas(1000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -746,7 +746,7 @@ public class DistilleryRecipes implements Runnable {
         addUniversalDistillationRecipe(
             Materials.Ethylene.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(2000), Materials.Hydrogen.getGas(2000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -771,19 +771,19 @@ public class DistilleryRecipes implements Runnable {
         addUniversalDistillationRecipe(
             Materials.Ethane.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(2000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Ethane.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(2000), Materials.Hydrogen.getGas(2000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Ethane.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(2000), Materials.Hydrogen.getGas(4000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -809,19 +809,19 @@ public class DistilleryRecipes implements Runnable {
             Materials.Propene.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Propane.getGas(500), Materials.Ethylene.getGas(500),
                 Materials.Methane.getGas(500) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Propene.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(1000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Propene.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(3000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -846,19 +846,19 @@ public class DistilleryRecipes implements Runnable {
         addUniversalDistillationRecipe(
             Materials.Propane.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(1000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Propane.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(3000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Propane.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(3000), Materials.Hydrogen.getGas(2000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -883,21 +883,21 @@ public class DistilleryRecipes implements Runnable {
         addUniversalDistillationRecipe(
             Materials.Butadiene.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Butene.getGas(667), Materials.Ethylene.getGas(667) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Butadiene.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Butane.getGas(223), Materials.Propene.getGas(223),
                 Materials.Ethane.getGas(400), Materials.Ethylene.getGas(445), Materials.Methane.getGas(223) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Butadiene.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Propane.getGas(260), Materials.Ethane.getGas(926),
                 Materials.Ethylene.getGas(389), Materials.Methane.getGas(2667) },
-            GT_Values.NI,
+            GTValues.NI,
             112,
             120);
         addUniversalDistillationRecipe(
@@ -926,20 +926,20 @@ public class DistilleryRecipes implements Runnable {
             Materials.Butene.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Butane.getGas(334), Materials.Propene.getGas(334),
                 Materials.Ethane.getGas(334), Materials.Ethylene.getGas(334), Materials.Methane.getGas(334) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Butene.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Propane.getGas(389), Materials.Ethane.getGas(556),
                 Materials.Ethylene.getGas(334), Materials.Methane.getGas(1056) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Butene.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(2000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -968,19 +968,19 @@ public class DistilleryRecipes implements Runnable {
             Materials.Butane.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Propane.getGas(667), Materials.Ethane.getGas(667),
                 Materials.Methane.getGas(667) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Butane.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(2000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Butane.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(1000) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1009,21 +1009,21 @@ public class DistilleryRecipes implements Runnable {
             Materials.Gas.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(1300), Materials.Hydrogen.getGas(1500),
                 Materials.Helium.getGas(100) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Gas.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(1400), Materials.Hydrogen.getGas(3000),
                 Materials.Helium.getGas(150) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Gas.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Methane.getGas(1500), Materials.Hydrogen.getGas(4000),
                 Materials.Helium.getGas(200) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1052,21 +1052,21 @@ public class DistilleryRecipes implements Runnable {
             Materials.Naphtha.getLightlyHydroCracked(1000),
             new FluidStack[] { Materials.Butane.getGas(800), Materials.Propane.getGas(300),
                 Materials.Ethane.getGas(250), Materials.Methane.getGas(250) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Naphtha.getModeratelyHydroCracked(1000),
             new FluidStack[] { Materials.Butane.getGas(200), Materials.Propane.getGas(1100),
                 Materials.Ethane.getGas(400), Materials.Methane.getGas(400) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
             Materials.Naphtha.getSeverelyHydroCracked(1000),
             new FluidStack[] { Materials.Butane.getGas(125), Materials.Propane.getGas(125),
                 Materials.Ethane.getGas(1500), Materials.Methane.getGas(1500) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1102,7 +1102,7 @@ public class DistilleryRecipes implements Runnable {
             new FluidStack[] { Materials.Naphtha.getFluid(800), Materials.Octane.getFluid(100),
                 Materials.Butane.getGas(150), Materials.Propane.getGas(200), Materials.Ethane.getGas(125),
                 Materials.Methane.getGas(125) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1110,7 +1110,7 @@ public class DistilleryRecipes implements Runnable {
             new FluidStack[] { Materials.Naphtha.getFluid(500), Materials.Octane.getFluid(50),
                 Materials.Butane.getGas(200), Materials.Propane.getGas(1100), Materials.Ethane.getGas(400),
                 Materials.Methane.getGas(400) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1118,7 +1118,7 @@ public class DistilleryRecipes implements Runnable {
             new FluidStack[] { Materials.Naphtha.getFluid(200), Materials.Octane.getFluid(20),
                 Materials.Butane.getGas(125), Materials.Propane.getGas(125), Materials.Ethane.getGas(1500),
                 Materials.Methane.getGas(1500) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1154,7 +1154,7 @@ public class DistilleryRecipes implements Runnable {
             new FluidStack[] { Materials.LightFuel.getFluid(600), Materials.Naphtha.getFluid(100),
                 Materials.Butane.getGas(100), Materials.Propane.getGas(100), Materials.Ethane.getGas(75),
                 Materials.Methane.getGas(75) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1162,7 +1162,7 @@ public class DistilleryRecipes implements Runnable {
             new FluidStack[] { Materials.LightFuel.getFluid(400), Materials.Naphtha.getFluid(400),
                 Materials.Butane.getGas(150), Materials.Propane.getGas(150), Materials.Ethane.getGas(100),
                 Materials.Methane.getGas(100) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1170,7 +1170,7 @@ public class DistilleryRecipes implements Runnable {
             new FluidStack[] { Materials.LightFuel.getFluid(200), Materials.Naphtha.getFluid(250),
                 Materials.Butane.getGas(300), Materials.Propane.getGas(300), Materials.Ethane.getGas(175),
                 Materials.Methane.getGas(175) },
-            GT_Values.NI,
+            GTValues.NI,
             120,
             120);
         addUniversalDistillationRecipe(
@@ -1205,9 +1205,9 @@ public class DistilleryRecipes implements Runnable {
     public void addUniversalDistillationRecipewithCircuit(FluidStack aInput, ItemStack[] aCircuit,
         FluidStack[] aOutputs, ItemStack aOutput2, int aDuration, int aEUt) {
         for (int i = 0; i < Math.min(aOutputs.length, 11); i++) {
-            GT_RecipeBuilder buildDistillation = GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(i + 1));
-            if (aOutput2 != GT_Values.NI) {
+            GTRecipeBuilder buildDistillation = GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(i + 1));
+            if (aOutput2 != GTValues.NI) {
                 buildDistillation.itemOutputs(aOutput2);
             }
             buildDistillation.fluidInputs(aInput)
@@ -1216,9 +1216,9 @@ public class DistilleryRecipes implements Runnable {
                 .eut(aEUt / 4)
                 .addTo(distilleryRecipes);
         }
-        GT_RecipeBuilder buildDT = GT_Values.RA.stdBuilder()
+        GTRecipeBuilder buildDT = GTValues.RA.stdBuilder()
             .itemInputs(aCircuit);
-        if (aOutput2 != GT_Values.NI) {
+        if (aOutput2 != GTValues.NI) {
             buildDT.itemOutputs(aOutput2);
         }
         buildDT.fluidInputs(aInput)
@@ -1231,9 +1231,9 @@ public class DistilleryRecipes implements Runnable {
     public void addUniversalDistillationRecipe(FluidStack aInput, FluidStack[] aOutputs, ItemStack aOutput2,
         int aDuration, int aEUt) {
         for (int i = 0; i < Math.min(aOutputs.length, 11); i++) {
-            GT_RecipeBuilder buildDistillation = GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(i + 1));
-            if (aOutput2 != GT_Values.NI) {
+            GTRecipeBuilder buildDistillation = GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(i + 1));
+            if (aOutput2 != GTValues.NI) {
                 buildDistillation.itemOutputs(aOutput2);
             }
             buildDistillation.fluidInputs(aInput)
@@ -1242,8 +1242,8 @@ public class DistilleryRecipes implements Runnable {
                 .eut(aEUt / 4)
                 .addTo(distilleryRecipes);
         }
-        GT_RecipeBuilder buildDT = GT_Values.RA.stdBuilder();
-        if (aOutput2 != GT_Values.NI) {
+        GTRecipeBuilder buildDT = GTValues.RA.stdBuilder();
+        if (aOutput2 != GTValues.NI) {
             buildDT.itemOutputs(aOutput2);
         }
         buildDT.fluidInputs(aInput)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java
index 363f279de5..6ac7f2051c 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java
@@ -1,22 +1,22 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class ElectrolyzerRecipes implements Runnable {
 
@@ -24,119 +24,119 @@ public class ElectrolyzerRecipes implements Runnable {
     public void run() {
         // H2O = 2H + O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1), ItemList.Cell_Empty.get(1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1), ItemList.Cell_Empty.get(1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
             .fluidInputs(Materials.Water.getFluid(1000L))
             .fluidOutputs(Materials.Hydrogen.getGas(2000L))
             .duration(1 * MINUTES + 40 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2), ItemList.Cell_Empty.get(1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2), ItemList.Cell_Empty.get(1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+            .fluidInputs(GTModHandler.getDistilledWater(1000L))
             .fluidOutputs(Materials.Hydrogen.getGas(2000L))
             .duration(1 * MINUTES + 40 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(3), ItemList.Cell_Empty.get(2L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(3), ItemList.Cell_Empty.get(2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L))
             .fluidInputs(Materials.Water.getFluid(1000L))
             .fluidOutputs(Materials.Oxygen.getGas(1000L))
             .duration(1 * MINUTES + 40 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(4), ItemList.Cell_Empty.get(2L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L))
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(4), ItemList.Cell_Empty.get(2L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L))
+            .fluidInputs(GTModHandler.getDistilledWater(1000L))
             .fluidOutputs(Materials.Oxygen.getGas(1000L))
             .duration(1 * MINUTES + 40 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("electrolyzedWaterCell", 1L), ItemList.Cell_Empty.get(2L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("electrolyzedWaterCell", 1L), ItemList.Cell_Empty.get(2L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("electrolyzedWaterCell", 1L), GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("electrolyzedWaterCell", 1L), GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
             .fluidOutputs(Materials.Hydrogen.getGas(2000L))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L))
-            .itemOutputs(GT_ModHandler.getIC2Item("electrolyzedWaterCell", 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L))
+            .itemOutputs(GTModHandler.getIC2Item("electrolyzedWaterCell", 1L))
             .duration(1 * MINUTES + 13 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Dye_Bonemeal.get(3L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1L))
             .duration(4 * SECONDS + 18 * TICKS)
             .eut(26)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.sand, 8, 0))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L))
             .duration(25 * SECONDS)
             .eut(25)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.sand, 8, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L))
             .duration(25 * SECONDS)
             .eut(25)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 4))
             .duration(5 * SECONDS)
             .eut(64)
             .addTo(electrolyzerRecipes);
         // ZnS = Zn + S + 1 Ga(9.17%)
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sphalerite, 2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sphalerite, 2))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1))
             .outputChances(10000, 10000, 917)
             .duration(10 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
         // IC2 Fertilizer = H2O + CaCO3 + C
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Fertilizer.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L))
             .fluidOutputs(Materials.Water.getFluid(1000L))
             .duration(5 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
         // NaOH = Na + O + H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumHydroxide.getDust(3), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Sodium.getDust(1), Materials.Hydrogen.getCells(1))
             .outputChances(10000, 10000)
@@ -146,8 +146,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .addTo(electrolyzerRecipes);
         // CO2 = C + 2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Carbon.getDust(1))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
             .fluidOutputs(Materials.Oxygen.getGas(2000))
@@ -155,8 +155,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(11), Materials.Empty.getCells(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(11), Materials.Empty.getCells(2))
             .itemOutputs(Materials.Carbon.getDust(1), Materials.Oxygen.getCells(2))
             .fluidInputs(Materials.CarbonDioxide.getGas(1000))
             .duration(45 * SECONDS)
@@ -164,8 +164,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .addTo(electrolyzerRecipes);
         // CO = C + O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Carbon.getDust(1))
             .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
             .fluidOutputs(Materials.Oxygen.getGas(1000))
@@ -173,15 +173,15 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(11), Materials.Empty.getCells(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(11), Materials.Empty.getCells(1))
             .itemOutputs(Materials.Carbon.getDust(1), Materials.Oxygen.getCells(1))
             .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.CarbonMonoxide.getCells(1))
             .itemOutputs(Materials.Carbon.getDust(1), Materials.Oxygen.getCells(1))
             .duration(15 * SECONDS)
@@ -190,7 +190,7 @@ public class ElectrolyzerRecipes implements Runnable {
 
         // H2S = S + 2H
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemOutputs(Materials.Sulfur.getDust(1))
             .fluidInputs(Materials.HydricSulfide.getGas(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
@@ -198,7 +198,7 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemOutputs(Materials.Sulfur.getDust(1), Materials.Hydrogen.getCells(2))
             .itemInputs(Materials.HydricSulfide.getCells(1), Materials.Empty.getCells(1))
             .duration(3 * SECONDS + 12 * TICKS)
@@ -207,8 +207,8 @@ public class ElectrolyzerRecipes implements Runnable {
 
         // SO2 = S + 2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Sulfur.getDust(1))
             .fluidInputs(Materials.SulfurDioxide.getGas(1000))
             .fluidOutputs(Materials.Oxygen.getGas(2000))
@@ -216,8 +216,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(11), Materials.Empty.getCells(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(11), Materials.Empty.getCells(2))
             .itemOutputs(Materials.Sulfur.getDust(1), Materials.Oxygen.getCells(2))
             .fluidInputs(Materials.SulfurDioxide.getGas(1000))
             .duration(15 * SECONDS)
@@ -225,7 +225,7 @@ public class ElectrolyzerRecipes implements Runnable {
             .addTo(electrolyzerRecipes);
         // NaCl = Na +Cl
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Salt.getDust(2))
             .itemOutputs(Materials.Sodium.getDust(1))
             .fluidOutputs(Materials.Chlorine.getGas(1000))
@@ -234,8 +234,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .addTo(electrolyzerRecipes);
         // (NaCl·H2O)= NaOH + H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.SodiumHydroxide.getDust(3), Materials.Hydrogen.getCells(1))
             .fluidInputs(Materials.SaltWater.getFluid(1000))
             .fluidOutputs(Materials.Chlorine.getGas(1000))
@@ -243,8 +243,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.SodiumHydroxide.getDust(3), Materials.Chlorine.getCells(1))
             .fluidInputs(Materials.SaltWater.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(1000))
@@ -253,8 +253,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .addTo(electrolyzerRecipes);
         // HCl = H + Cl
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Hydrogen.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .fluidOutputs(Materials.Chlorine.getGas(1000))
@@ -262,8 +262,8 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chlorine.getCells(1))
             .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
             .fluidOutputs(Materials.Hydrogen.getGas(1000))
@@ -271,16 +271,16 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Hydrogen.getCells(1))
             .fluidOutputs(Materials.Chlorine.getGas(1000))
             .duration(36 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.HydrochloricAcid.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.Chlorine.getCells(1))
             .fluidOutputs(Materials.Hydrogen.getGas(1000))
             .duration(36 * SECONDS)
@@ -288,7 +288,7 @@ public class ElectrolyzerRecipes implements Runnable {
             .addTo(electrolyzerRecipes);
         // 2NaHSO4 = 2H + Na2S2O8
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.SodiumBisulfate.getDust(14), Materials.Empty.getCells(2))
             .itemOutputs(Materials.Hydrogen.getCells(2))
             .fluidOutputs(Materials.SodiumPersulfate.getFluid(1000))
@@ -296,59 +296,59 @@ public class ElectrolyzerRecipes implements Runnable {
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lead, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lead, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 4))
             .fluidInputs(new FluidStack(ItemList.sLeadZincSolution, 8000))
             .fluidOutputs(Materials.Water.getFluid(2000))
             .duration(15 * SECONDS)
             .eut(192)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Cell_Empty.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
             .fluidInputs(new FluidStack(ItemList.sBlueVitriol, 2000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
             .duration(45 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Cell_Empty.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
             .fluidInputs(new FluidStack(ItemList.sNickelSulfate, 2000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
             .duration(45 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Cell_Empty.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
             .fluidInputs(new FluidStack(ItemList.sGreenVitriol, 2000))
             .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
             .duration(45 * SECONDS)
             .eut(30)
             .addTo(electrolyzerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.PhosphoricAcid, 1L),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.PhosphoricAcid, 1L),
                 ItemList.Cell_Empty.get(6L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 3L),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 4L))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 3L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 4L))
             .duration(27 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(electrolyzerRecipes);
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java
index d9031ac64f..fa8097c6fd 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java
@@ -1,9 +1,9 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.electroMagneticSeparatorRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsOreAlum;
 import gregtech.api.enums.TierEU;
@@ -12,7 +12,7 @@ public class ElectromagneticSeparatorRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(MaterialsOreAlum.SluiceSand.getDust(1))
             .itemOutputs(Materials.Iron.getDust(1), Materials.Neodymium.getDust(1), Materials.Chrome.getDust(1))
             .outputChances(4000, 2000, 2000)
@@ -20,7 +20,7 @@ public class ElectromagneticSeparatorRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV / 2)
             .addTo(electroMagneticSeparatorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.TengamRaw.getDust(1))
             .itemOutputs(
                 Materials.TengamPurified.getDust(1),
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java
index 06ad1fa994..d51e6761fb 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java
@@ -1,19 +1,19 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
-import static gregtech.api.util.GT_ModHandler.getIC2Item;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.WILDCARD;
+import static gregtech.api.util.GTModHandler.getIC2Item;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.WILDCARD;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class ExtractorRecipes implements Runnable {
 
@@ -22,16 +22,16 @@ public class ExtractorRecipes implements Runnable {
         addExtractionRecipe(new ItemStack(Blocks.bookshelf, 1, WILDCARD), new ItemStack(Items.book, 3, 0));
         addExtractionRecipe(
             new ItemStack(Items.slime_ball, 1),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 2L));
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 2L));
         addExtractionRecipe(
             ItemList.IC2_Resin.get(1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3L));
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3L));
         addExtractionRecipe(
             getIC2Item("rubberSapling", 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L));
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L));
         addExtractionRecipe(
             getIC2Item("rubberLeaves", 16L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L));
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L));
 
         addExtractionRecipe(ItemList.Cell_Air.get(1L), ItemList.Cell_Empty.get(1L));
         addExtractionRecipe(getIC2Item("filledTinCan", 1), getIC2Item("tinCan", 1));
@@ -40,152 +40,152 @@ public class ExtractorRecipes implements Runnable {
         addExtractionRecipe(new ItemStack(Blocks.nether_brick, 1), new ItemStack(Items.netherbrick, 4));
         addExtractionRecipe(new ItemStack(Blocks.snow, 1), new ItemStack(Items.snowball, 4));
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_SU_LV_SulfuricAcid.get(1L))
             .itemOutputs(ItemList.Battery_Hull_LV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_SU_LV_Mercury.get(1L))
             .itemOutputs(ItemList.Battery_Hull_LV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_SU_MV_SulfuricAcid.get(1L))
             .itemOutputs(ItemList.Battery_Hull_MV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_SU_MV_Mercury.get(1L))
             .itemOutputs(ItemList.Battery_Hull_MV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_SU_HV_SulfuricAcid.get(1L))
             .itemOutputs(ItemList.Battery_Hull_HV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_SU_HV_Mercury.get(1L))
             .itemOutputs(ItemList.Battery_Hull_HV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_LV_Cadmium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_LV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_LV_Lithium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_LV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_LV_Sodium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_LV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_MV_Cadmium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_MV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_MV_Lithium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_MV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_MV_Sodium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_MV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_HV_Cadmium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_HV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_HV_Lithium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_HV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_RE_HV_Sodium.get(1L))
             .itemOutputs(ItemList.Battery_Hull_HV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_EV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_EV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_IV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_IV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_LuV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_LuV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_ZPM_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_ZPM.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_UV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_UV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_UHV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_UHV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_UEV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_UEV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_UIV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_UIV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_UMV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_UMV.get(1L))
             .duration(15 * SECONDS)
             .eut(2)
             .addTo(extractorRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.BatteryHull_UxV_Full.get(1L))
             .itemOutputs(ItemList.BatteryHull_UxV.get(1L))
             .duration(15 * SECONDS)
@@ -194,8 +194,8 @@ public class ExtractorRecipes implements Runnable {
     }
 
     public void addExtractionRecipe(ItemStack input, ItemStack output) {
-        output = GT_OreDictUnificator.get(true, output);
-        GT_Values.RA.stdBuilder()
+        output = GTOreDictUnificator.get(true, output);
+        GTValues.RA.stdBuilder()
             .itemInputs(input)
             .itemOutputs(output)
             .duration(15 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java
index e52ad3d4fb..59cbefc3c8 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java
@@ -1,10 +1,10 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 
 public class ExtruderRecipes implements Runnable {
@@ -12,14 +12,14 @@ public class ExtruderRecipes implements Runnable {
     @Override
     public void run() {
         // wax capsule
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.FR_Wax.get(1L), ItemList.Shape_Extruder_Cell.get(0L))
             .itemOutputs(ItemList.FR_WaxCapsule.get(1L))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(extruderRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.FR_RefractoryWax.get(1L), ItemList.Shape_Extruder_Cell.get(0L))
             .itemOutputs(ItemList.FR_RefractoryCapsule.get(1L))
             .duration(6 * SECONDS + 8 * TICKS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java
index c0954fda18..74b1e0e78e 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java
@@ -1,15 +1,15 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.fermentingRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 
 public class FermenterRecipes implements Runnable {
@@ -17,273 +17,273 @@ public class FermenterRecipes implements Runnable {
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Biomass.getFluid(100))
             .fluidOutputs(Materials.FermentedBiomass.getFluid(100))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 100))
             .fluidOutputs(Materials.FermentedBiomass.getFluid(100))
             .duration(7 * SECONDS + 10 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("milk", 50))
             .fluidOutputs(getFluidStack("potion.mundane", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.lemonjuice", 50))
             .fluidOutputs(getFluidStack("potion.limoncello", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.applejuice", 50))
             .fluidOutputs(getFluidStack("potion.cider", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.goldenapplejuice", 50))
             .fluidOutputs(getFluidStack("potion.goldencider", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.idunsapplejuice", 50))
             .fluidOutputs(getFluidStack("potion.notchesbrew", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.reedwater", 50))
             .fluidOutputs(getFluidStack("potion.rum", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.rum", 50))
             .fluidOutputs(getFluidStack("potion.piratebrew", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.grapejuice", 50))
             .fluidOutputs(getFluidStack("potion.wine", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.wine", 50))
             .fluidOutputs(getFluidStack("potion.vinegar", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.scotch", 50))
             .fluidOutputs(getFluidStack("potion.glenmckenner", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.wheatyhopsjuice", 50))
             .fluidOutputs(getFluidStack("potion.beer", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.hopsjuice", 50))
             .fluidOutputs(getFluidStack("potion.darkbeer", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.darkbeer", 50))
             .fluidOutputs(getFluidStack("potion.dragonblood", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.beer", 75))
             .fluidOutputs(getFluidStack("potion.vinegar", 50))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.cider", 75))
             .fluidOutputs(getFluidStack("potion.vinegar", 50))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.goldencider", 75))
             .fluidOutputs(getFluidStack("potion.vinegar", 50))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.rum", 75))
             .fluidOutputs(getFluidStack("potion.vinegar", 50))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.wine", 75))
             .fluidOutputs(getFluidStack("potion.vinegar", 50))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.awkward", 50))
             .fluidOutputs(getFluidStack("potion.weakness", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.mundane", 50))
             .fluidOutputs(getFluidStack("potion.weakness", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.thick", 50))
             .fluidOutputs(getFluidStack("potion.weakness", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.poison", 50))
             .fluidOutputs(getFluidStack("potion.damage", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.health", 50))
             .fluidOutputs(getFluidStack("potion.damage", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.waterbreathing", 50))
             .fluidOutputs(getFluidStack("potion.damage", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.nightvision", 50))
             .fluidOutputs(getFluidStack("potion.invisibility", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.fireresistance", 50))
             .fluidOutputs(getFluidStack("potion.slowness", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.speed", 50))
             .fluidOutputs(getFluidStack("potion.slowness", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.strength", 50))
             .fluidOutputs(getFluidStack("potion.weakness", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.regen", 50))
             .fluidOutputs(getFluidStack("potion.poison", 25))
             .duration(51 * SECONDS + 4 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.poison.strong", 50))
             .fluidOutputs(getFluidStack("potion.damage.strong", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.health.strong", 50))
             .fluidOutputs(getFluidStack("potion.damage.strong", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.nightvision.long", 50))
             .fluidOutputs(getFluidStack("potion.invisibility.long", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.regen.strong", 50))
             .fluidOutputs(getFluidStack("potion.poison.strong", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.fireresistance.long", 50))
             .fluidOutputs(getFluidStack("potion.slowness.long", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.speed.long", 50))
             .fluidOutputs(getFluidStack("potion.slowness.long", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.strength.long", 50))
             .fluidOutputs(getFluidStack("potion.weakness.long", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
             .eut(2)
             .addTo(fermentingRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(getFluidStack("potion.regen.long", 50))
             .fluidOutputs(getFluidStack("potion.poison.long", 10))
             .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java
index ea2b87996f..89bda51506 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java
@@ -2,7 +2,7 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 
@@ -10,7 +10,7 @@ public class FluidCannerRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_Hull_LV.get(1))
             .itemOutputs(ItemList.IC2_ReBattery.get(1))
             .fluidInputs(Materials.Redstone.getMolten(288))
@@ -18,7 +18,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_Hull_LV.get(1))
             .itemOutputs(ItemList.Battery_SU_LV_Mercury.getWithCharge(1, Integer.MAX_VALUE))
             .fluidInputs(Materials.Mercury.getFluid(1000))
@@ -26,7 +26,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_Hull_MV.get(1))
             .itemOutputs(ItemList.Battery_SU_MV_Mercury.getWithCharge(1, Integer.MAX_VALUE))
             .fluidInputs(Materials.Mercury.getFluid(4000))
@@ -34,7 +34,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_Hull_HV.get(1))
             .itemOutputs(ItemList.Battery_SU_HV_Mercury.getWithCharge(1, Integer.MAX_VALUE))
             .fluidInputs(Materials.Mercury.getFluid(16000))
@@ -42,7 +42,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_Hull_LV.get(1))
             .itemOutputs(ItemList.Battery_SU_LV_SulfuricAcid.getWithCharge(1, Integer.MAX_VALUE))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
@@ -50,7 +50,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_Hull_MV.get(1))
             .itemOutputs(ItemList.Battery_SU_MV_SulfuricAcid.getWithCharge(1, Integer.MAX_VALUE))
             .fluidInputs(Materials.SulfuricAcid.getFluid(4000))
@@ -58,7 +58,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Battery_Hull_HV.get(1))
             .itemOutputs(ItemList.Battery_SU_HV_SulfuricAcid.getWithCharge(1, Integer.MAX_VALUE))
             .fluidInputs(Materials.SulfuricAcid.getFluid(16000))
@@ -66,7 +66,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.TF_Vial_FieryTears.get(1))
             .itemOutputs(ItemList.Bottle_Empty.get(1))
             .fluidOutputs(Materials.FierySteel.getFluid(250))
@@ -74,7 +74,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Spray_Color_Remover_Empty.get(1))
             .fluidInputs(Materials.Acetone.getFluid(4000))
             .itemOutputs(ItemList.Spray_Color_Remover.get(1))
@@ -82,7 +82,7 @@ public class FluidCannerRecipes implements Runnable {
             .eut(1)
             .addTo(fluidCannerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Spray_Color_Remover.get(1))
             .itemOutputs(ItemList.Spray_Color_Remover_Empty.get(1))
             .fluidOutputs(Materials.Acetone.getFluid(4000))
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java
index d27e85ab2d..d4b3d3b668 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java
@@ -6,120 +6,120 @@ import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.enums.Mods.Thaumcraft;
 import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.loaders.misc.GT_Bees.combs;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.loaders.misc.GTBees.combs;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
 import gregtech.api.recipe.RecipeCategories;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class FluidExtractorRecipes implements Runnable {
 
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Dye_SquidInk.get(1L))
             .fluidOutputs(getFluidStack("squidink", 144))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Dye_Indigo.get(1L))
             .fluidOutputs(getFluidStack("indigo", 144))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Crop_Drop_Indigo.get(1L))
             .fluidOutputs(getFluidStack("indigo", 144))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Crop_Drop_MilkWart.get(1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L))
             .outputChances(1000)
-            .fluidOutputs(GT_ModHandler.getMilk(150L))
+            .fluidOutputs(GTModHandler.getMilk(150L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Crop_Drop_OilBerry.get(1L))
             .fluidOutputs(Materials.Oil.getFluid(100L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Crop_Drop_UUMBerry.get(1L))
             .fluidOutputs(Materials.UUMatter.getFluid(4L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Crop_Drop_UUABerry.get(1L))
             .fluidOutputs(Materials.UUAmplifier.getFluid(4L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.fish, 1, 0))
             .fluidOutputs(Materials.FishOil.getFluid(40L))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.fish, 1, 1))
             .fluidOutputs(Materials.FishOil.getFluid(60L))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.fish, 1, 2))
             .fluidOutputs(Materials.FishOil.getFluid(70L))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.fish, 1, 3))
             .fluidOutputs(Materials.FishOil.getFluid(30L))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.coal, 1, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L))
             .outputChances(1000)
             .fluidOutputs(Materials.WoodTar.getFluid(100L))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
             .itemOutputs(ItemList.IC2_Plantball.get(1L))
             .outputChances(100)
             .fluidOutputs(Materials.Creosote.getFluid(5L))
@@ -127,58 +127,58 @@ public class FluidExtractorRecipes implements Runnable {
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L))
             .outputChances(10000)
             .fluidOutputs(Materials.Water.getFluid(100L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Thaumcraft.ID, "ItemResource", 1, 3))
             .fluidOutputs(Materials.Mercury.getFluid(1000L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Mercury, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Mercury, 1L))
             .fluidOutputs(Materials.Mercury.getFluid(1000L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Monazite, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Monazite, 1L))
             .fluidOutputs(Materials.Helium.getGas(200L))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(64)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(IndustrialCraft2.ID, "blockAlloyGlass", 1L, 0))
             .fluidOutputs(Materials.ReinforceGlass.getMolten(144))
             .duration(5 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(NewHorizonsCoreMod.ID, "item.ReinforcedGlassPlate", 1L, 0))
             .fluidOutputs(Materials.ReinforceGlass.getMolten(72))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_EV)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(NewHorizonsCoreMod.ID, "item.ReinforcedGlassLense", 1L, 0))
             .fluidOutputs(Materials.ReinforceGlass.getMolten(54))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_EV)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Fluid.get(1L))
             .fluidOutputs(Materials.Steel.getMolten(19 * 144))
             .duration(20 * SECONDS)
@@ -186,9 +186,9 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Item.get(1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 7L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 7L))
             .outputChances(10000)
             .fluidOutputs(Materials.Tin.getMolten(12 * 144))
             .duration(20 * SECONDS)
@@ -196,7 +196,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(4L))
             .fluidOutputs(Materials.Steel.getMolten(189))
             .duration(2 * SECONDS)
@@ -204,9 +204,9 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(16L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 3L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 3L))
             .outputChances(10000)
             .fluidOutputs(Materials.Steel.getMolten(324))
             .duration(20 * SECONDS)
@@ -214,23 +214,23 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("TritiumCell", 1))
-            .itemOutputs(GT_ModHandler.getIC2Item("fuelRod", 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("TritiumCell", 1))
+            .itemOutputs(GTModHandler.getIC2Item("fuelRod", 1))
             .outputChances(10000)
             .fluidOutputs(Materials.Tritium.getGas(32))
             .duration(16 * TICKS)
             .eut(64)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 1L))
             .fluidOutputs(Materials.Glass.getMolten(72))
             .duration(30 * SECONDS)
             .eut(28)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
             .fluidOutputs(Materials.Iron.getMolten(288))
             .duration(15 * SECONDS)
@@ -238,7 +238,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 1))
             .fluidOutputs(Materials.Iron.getMolten(144))
             .duration(15 * SECONDS)
@@ -246,9 +246,9 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 6))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 6))
             .outputChances(10000)
             .fluidOutputs(Materials.Bronze.getMolten(1728))
             .duration(15 * SECONDS)
@@ -256,7 +256,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
             .fluidOutputs(Materials.Steel.getMolten(288))
             .duration(20 * SECONDS)
@@ -264,7 +264,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 14))
             .fluidOutputs(Materials.Steel.getMolten(144))
             .duration(20 * SECONDS)
@@ -272,7 +272,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
             .fluidOutputs(Materials.Steel.getMolten(1836))
             .duration(20 * SECONDS)
@@ -280,7 +280,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
             .fluidOutputs(Materials.Aluminium.getMolten(288))
             .duration(25 * SECONDS)
@@ -288,7 +288,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 1))
             .fluidOutputs(Materials.Aluminium.getMolten(144))
             .duration(25 * SECONDS)
@@ -296,9 +296,9 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12L))
             .outputChances(10000)
             .fluidOutputs(Materials.Aluminium.getMolten(108L))
             .duration(25 * SECONDS)
@@ -306,7 +306,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
             .fluidOutputs(Materials.StainlessSteel.getMolten(288))
             .duration(30 * SECONDS)
@@ -314,7 +314,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 4))
             .fluidOutputs(Materials.StainlessSteel.getMolten(144))
             .duration(30 * SECONDS)
@@ -322,7 +322,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
             .fluidOutputs(Materials.StainlessSteel.getMolten(1836))
             .duration(30 * SECONDS)
@@ -330,7 +330,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
             .fluidOutputs(Materials.Titanium.getMolten(288))
             .duration(35 * SECONDS)
@@ -338,7 +338,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 7))
             .fluidOutputs(Materials.Titanium.getMolten(144))
             .duration(35 * SECONDS)
@@ -346,7 +346,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
             .fluidOutputs(Materials.Titanium.getMolten(1836))
             .duration(35 * SECONDS)
@@ -354,7 +354,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
             .fluidOutputs(Materials.TungstenSteel.getMolten(288))
             .duration(40 * SECONDS)
@@ -362,7 +362,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 10))
             .fluidOutputs(Materials.TungstenSteel.getMolten(144))
             .duration(40 * SECONDS)
@@ -370,7 +370,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
             .fluidOutputs(Materials.TungstenSteel.getMolten(1836))
             .duration(40 * SECONDS)
@@ -378,7 +378,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
             .fluidOutputs(Materials.Palladium.getMolten(288))
             .duration(45 * SECONDS)
@@ -386,7 +386,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 13))
             .fluidOutputs(Materials.Palladium.getMolten(144))
             .duration(45 * SECONDS)
@@ -394,9 +394,9 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Chrome, 6L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Chrome, 6L))
             .outputChances(10000)
             .fluidOutputs(Materials.NiobiumTitanium.getMolten(1728))
             .duration(45 * SECONDS)
@@ -404,7 +404,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
             .fluidOutputs(Materials.Iridium.getMolten(288))
             .duration(50 * SECONDS)
@@ -412,7 +412,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 1))
             .fluidOutputs(Materials.Iridium.getMolten(144))
             .duration(50 * SECONDS)
@@ -420,9 +420,9 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iridium, 6L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Iridium, 6L))
             .outputChances(10000)
             .fluidOutputs(Materials.Enderium.getMolten(1728))
             .duration(50 * SECONDS)
@@ -430,7 +430,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
             .fluidOutputs(Materials.Osmium.getMolten(288))
             .duration(55 * SECONDS)
@@ -438,7 +438,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 4))
             .fluidOutputs(Materials.Osmium.getMolten(144))
             .duration(55 * SECONDS)
@@ -446,9 +446,9 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Osmium, 6L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Osmium, 6L))
             .outputChances(10000)
             .fluidOutputs(Materials.Naquadah.getMolten(1728))
             .duration(55 * SECONDS)
@@ -456,7 +456,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
             .fluidOutputs(Materials.Neutronium.getMolten(288))
             .duration(60 * SECONDS)
@@ -464,7 +464,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 7))
             .fluidOutputs(Materials.Neutronium.getMolten(144))
             .duration(60 * SECONDS)
@@ -472,7 +472,7 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
             .fluidOutputs(Materials.Neutronium.getMolten(1836))
             .duration(60 * SECONDS)
@@ -480,58 +480,58 @@ public class FluidExtractorRecipes implements Runnable {
             .recipeCategory(RecipeCategories.fluidExtractorRecycling)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.wheat_seeds, 1, 32767))
             .fluidOutputs(Materials.SeedOil.getFluid(10))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(2)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.melon_seeds, 1, 32767))
             .fluidOutputs(Materials.SeedOil.getFluid(10))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(2)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.pumpkin_seeds, 1, 32767))
             .fluidOutputs(Materials.SeedOil.getFluid(10))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(2)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Crop_Drop_Rape.get(1))
             .fluidOutputs(Materials.SeedOil.getFluid(125))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(2)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.snowball, 1, 0))
             .fluidOutputs(Materials.Water.getFluid(250L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.snow, 1, 0))
             .fluidOutputs(Materials.Water.getFluid(1000L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1L))
             .fluidOutputs(Materials.Ice.getSolid(1000L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidExtractionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Forestry.ID, "phosphor", 1L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L))
             .outputChances(1000)
             .fluidOutputs(Materials.Lava.getFluid(800L))
             .duration(12 * SECONDS + 16 * TICKS)
@@ -540,7 +540,7 @@ public class FluidExtractorRecipes implements Runnable {
 
         // Beecombs fluid extractor recipes
         // xenon
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(combs, 1, 134))
             .fluidOutputs(getFluidStack("xenon", 250))
             .duration(2 * SECONDS + 10 * TICKS)
@@ -548,7 +548,7 @@ public class FluidExtractorRecipes implements Runnable {
             .addTo(fluidExtractionRecipes);
 
         // neon
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(combs, 1, 135))
             .fluidOutputs(getFluidStack("neon", 250))
             .duration(15 * TICKS)
@@ -556,7 +556,7 @@ public class FluidExtractorRecipes implements Runnable {
             .addTo(fluidExtractionRecipes);
 
         // krpton
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(combs, 1, 136))
             .fluidOutputs(getFluidStack("krypton", 250))
             .duration(1 * SECONDS + 5 * TICKS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java
index b9cdfc4aa3..8168282653 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java
@@ -1,62 +1,62 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTUtility;
 
 public class FluidHeaterRecipes implements Runnable {
 
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.GrowthMediumRaw.getFluid(1000))
             .fluidOutputs(Materials.GrowthMediumSterilized.getFluid(1000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(fluidHeaterRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.BioMediumRaw.getFluid(1000))
             .fluidOutputs(Materials.BioMediumSterilized.getFluid(1000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_LuV)
             .addTo(fluidHeaterRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Water.getFluid(6))
             .fluidOutputs(Materials.Water.getGas(960))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(fluidHeaterRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
-            .fluidInputs(GT_ModHandler.getDistilledWater(6))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
+            .fluidInputs(GTModHandler.getDistilledWater(6))
             .fluidOutputs(Materials.Water.getGas(960))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(fluidHeaterRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.SeedOil.getFluid(16))
             .fluidOutputs(Materials.FryingOilHot.getFluid(16))
             .duration(16 * TICKS)
             .eut(30)
             .addTo(fluidHeaterRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.FishOil.getFluid(16))
             .fluidOutputs(Materials.FryingOilHot.getFluid(16))
             .duration(16 * TICKS)
@@ -64,8 +64,8 @@ public class FluidHeaterRecipes implements Runnable {
             .addTo(fluidHeaterRecipes);
         // Ca(CH3COO)2 = CH3COCH3 + CaO + CO2
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.CalciumAcetateSolution.getFluid(1000))
             .fluidOutputs(Materials.Acetone.getFluid(1000))
             .duration(4 * SECONDS)
@@ -73,7 +73,7 @@ public class FluidHeaterRecipes implements Runnable {
             .addTo(fluidHeaterRecipes);
         // Fluid Sodium
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Sodium.getDust(1))
             .fluidInputs(
 
@@ -83,8 +83,8 @@ public class FluidHeaterRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(fluidHeaterRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Acetone.getFluid(1000))
             .fluidOutputs(Materials.Ethenone.getGas(1000))
             .duration(8 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java
index 2d52f9eb69..d3197b6f30 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java
@@ -5,10 +5,10 @@ import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.enums.Mods.Thaumcraft;
 import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.INGOTS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.init.Blocks;
@@ -18,17 +18,17 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enums.GTValues;
 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.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class FluidSolidifierRecipes implements Runnable {
 
@@ -49,7 +49,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 continue;
             }
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Mold_Casing.get(0L))
                 .itemOutputs(materialCasing[i])
                 .fluidInputs(materialArray[i].getMolten(72L))
@@ -63,7 +63,7 @@ public class FluidSolidifierRecipes implements Runnable {
             NBTTagCompound nbtFlask = new NBTTagCompound();
             nbtFlask.setInteger("Capacity", 1000);
             flask.setTagCompound(nbtFlask);
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Mold_Ball.get(0))
                 .itemOutputs(flask)
                 .fluidInputs(new FluidStack(FluidRegistry.getFluid("molten.borosilicateglass"), 144))
@@ -72,7 +72,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .addTo(fluidSolidifierRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
             .itemOutputs(getModItem(Thaumcraft.ID, "ItemResource", 1, 3))
             .fluidInputs(Materials.Mercury.getFluid(1000L))
@@ -80,15 +80,15 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Mercury, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Mercury, 1L))
             .fluidInputs(Materials.Mercury.getFluid(1000L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
             .itemOutputs(new ItemStack(Items.snowball, 1, 0))
             .fluidInputs(Materials.Water.getFluid(250L))
@@ -96,15 +96,15 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
             .itemOutputs(new ItemStack(Items.snowball, 1, 0))
-            .fluidInputs(GT_ModHandler.getDistilledWater(250L))
+            .fluidInputs(GTModHandler.getDistilledWater(250L))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
             .itemOutputs(new ItemStack(Blocks.snow, 1, 0))
             .fluidInputs(Materials.Water.getFluid(1000L))
@@ -112,15 +112,15 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
             .itemOutputs(new ItemStack(Blocks.snow, 1, 0))
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+            .fluidInputs(GTModHandler.getDistilledWater(1000L))
             .duration(25 * SECONDS + 12 * TICKS)
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
             .itemOutputs(new ItemStack(Blocks.obsidian, 1, 0))
             .fluidInputs(Materials.Lava.getFluid(1000L))
@@ -128,15 +128,15 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(16)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
-            .itemOutputs(new ItemStack(GregTech_API.sBlockConcretes, 1, 8))
+            .itemOutputs(new ItemStack(GregTechAPI.sBlockConcretes, 1, 8))
             .fluidInputs(Materials.Concrete.getMolten(144L))
             .duration(12 * TICKS)
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
             .itemOutputs(new ItemStack(Blocks.glowstone, 1, 0))
             .fluidInputs(Materials.Glowstone.getMolten(576L))
@@ -144,7 +144,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
             .itemOutputs(new ItemStack(Blocks.glass, 1, 0))
             .fluidInputs(Materials.Glass.getMolten(144L))
@@ -152,15 +152,15 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Plate.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Glass, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.plate, Materials.Glass, 1L))
             .fluidInputs(Materials.Glass.getMolten(144L))
             .duration(12 * TICKS)
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Bottle.get(0L))
             .itemOutputs(ItemList.Bottle_Empty.get(1L))
             .fluidInputs(Materials.Glass.getMolten(144L))
@@ -168,7 +168,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Cylinder.get(0L))
             .itemOutputs(ItemList.Food_Cheese.get(1L))
             .fluidInputs(Materials.Milk.getFluid(250L))
@@ -176,7 +176,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Cylinder.get(0L))
             .itemOutputs(ItemList.Food_Cheese.get(1L))
             .fluidInputs(Materials.Cheese.getMolten(144L))
@@ -184,7 +184,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(8)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Anvil.get(0L))
             .itemOutputs(new ItemStack(Blocks.anvil, 1, 0))
             .fluidInputs(Materials.Iron.getMolten(4464L))
@@ -192,7 +192,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(16)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Anvil.get(0L))
             .itemOutputs(new ItemStack(Blocks.anvil, 1, 0))
             .fluidInputs(Materials.WroughtIron.getMolten(4464L))
@@ -200,15 +200,15 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(16)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Boron.getDust(1))
             .fluidInputs(Materials.Boron.getMolten(144L))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(30)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Cylinder.get(0))
             .itemOutputs(ItemList.Circuit_Parts_PetriDish.get(1))
             .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(36))
@@ -216,7 +216,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(16)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Cylinder.get(0))
             .itemOutputs(ItemList.Circuit_Parts_PetriDish.get(1))
             .fluidInputs(Materials.Polystyrene.getMolten(36))
@@ -224,7 +224,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(16)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Cylinder.get(0))
             .itemOutputs(ItemList.Circuit_Parts_PetriDish.get(1))
             .fluidInputs(Materials.BorosilicateGlass.getMolten(72))
@@ -232,7 +232,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(16)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Plate.get(0L))
             .itemOutputs(getModItem(NewHorizonsCoreMod.ID, "item.ReinforcedGlassPlate", 1L, 0))
             .fluidInputs(Materials.ReinforceGlass.getMolten(72))
@@ -240,7 +240,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
             .itemOutputs(getModItem(IndustrialCraft2.ID, "blockAlloyGlass", 1L))
             .fluidInputs(Materials.ReinforceGlass.getMolten(144))
@@ -248,7 +248,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
             .itemOutputs(ItemList.Circuit_Parts_Glass_Tube.get(1))
             .fluidInputs(Materials.Glass.getMolten(144))
@@ -256,7 +256,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(24)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
             .itemOutputs(ItemList.Circuit_Parts_Reinforced_Glass_Tube.get(1))
             .fluidInputs(Materials.ReinforceGlass.getMolten(288))
@@ -264,7 +264,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
             .itemOutputs(ItemList.Circuit_Parts_Glass_Tube.get(1))
             .fluidInputs(getFluidStack("glass.molten", 1000))
@@ -272,7 +272,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(24)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
             .itemOutputs(ItemList.GelledToluene.get(1))
             .fluidInputs(new FluidStack(ItemList.sToluene, 100))
@@ -280,55 +280,55 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(16)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Nugget.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Copper, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Copper, 1L))
             .fluidInputs(Materials.AnnealedCopper.getMolten(16))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ingot.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L))
             .fluidInputs(Materials.AnnealedCopper.getMolten(144))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.Copper, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, Materials.Copper, 1L))
             .fluidInputs(Materials.AnnealedCopper.getMolten(1296))
             .duration(14 * SECONDS + 8 * TICKS)
             .eut(8)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Nugget.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L))
             .fluidInputs(Materials.WroughtIron.getMolten(16))
             .duration(16 * TICKS)
             .eut(4)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Ingot.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L))
             .fluidInputs(Materials.WroughtIron.getMolten(144))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Block.get(0L))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L))
             .fluidInputs(Materials.WroughtIron.getMolten(1296))
             .duration(14 * SECONDS + 8 * TICKS)
             .eut(8)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Spinneret.get(0L))
             .itemOutputs(ItemList.KevlarFiber.get(8L))
             .fluidInputs(MaterialsKevlar.LiquidCrystalKevlar.getFluid(144L))
@@ -336,7 +336,7 @@ public class FluidSolidifierRecipes implements Runnable {
             .eut(TierEU.RECIPE_EV)
             .addTo(fluidSolidifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Shape_Mold_Anvil.get(0L))
             .itemOutputs(getModItem(Railcraft.ID, "anvil", 1L, 0))
             .fluidInputs(Materials.Steel.getMolten(4464L))
@@ -348,7 +348,7 @@ public class FluidSolidifierRecipes implements Runnable {
         final int fluidPerShapeSolidifierRecipe = 4 * INGOTS;
         {
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Bottle.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Bottle.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -356,7 +356,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Plate.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Plate.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -364,7 +364,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Cell.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Cell.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -372,7 +372,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Ring.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Ring.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -380,7 +380,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Rod.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Rod.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -388,7 +388,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Bolt.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Bolt.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -396,7 +396,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Ingot.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Ingot.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -404,7 +404,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Wire.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Wire.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -412,7 +412,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Casing.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Casing.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -420,7 +420,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Pipe_Tiny.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Tiny.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -428,7 +428,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Pipe_Small.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Small.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -436,7 +436,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Pipe_Medium.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Medium.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -444,7 +444,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Pipe_Large.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Large.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -452,7 +452,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Pipe_Huge.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Huge.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -460,7 +460,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Block.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Block.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -468,7 +468,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Sword.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Sword.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -476,7 +476,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Pickaxe.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pickaxe.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -484,7 +484,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Shovel.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Shovel.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -492,7 +492,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Axe.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Axe.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -500,7 +500,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Hoe.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Hoe.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -508,7 +508,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Hammer.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Hammer.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -516,7 +516,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_File.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_File.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -524,7 +524,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Saw.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Saw.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -532,7 +532,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Gear.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Gear.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -540,7 +540,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Rotor.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Rotor.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -548,7 +548,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Turbine_Blade.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Turbine_Blade.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -556,7 +556,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_Small_Gear.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Small_Gear.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
@@ -564,7 +564,7 @@ public class FluidSolidifierRecipes implements Runnable {
                 .eut(TierEU.RECIPE_UMV)
                 .addTo(fluidSolidifierRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Shape_Extruder_ToolHeadDrill.get(1))
                 .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_ToolHeadDrill.get(1))
                 .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java
index 4ebb4b8da6..b8220acb0e 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java
@@ -2,21 +2,21 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
 import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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;
+import gregtech.api.util.GTOreDictUnificator;
 import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
 
 public class ForgeHammerRecipes implements Runnable {
@@ -24,119 +24,119 @@ public class ForgeHammerRecipes implements Runnable {
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.stonebrick, 1, 0))
             .itemOutputs(new ItemStack(Blocks.stonebrick, 1, 2))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.stone, 1, 0))
             .itemOutputs(new ItemStack(Blocks.cobblestone, 1, 0))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.cobblestone, 1, 0))
             .itemOutputs(new ItemStack(Blocks.gravel, 1, 0))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.gravel, 1, 0))
             .itemOutputs(new ItemStack(Blocks.sand, 1, 0))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.sandstone, 1, 32767))
             .itemOutputs(new ItemStack(Blocks.sand, 1, 0))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.ice, 1, 0))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.packed_ice, 1, 0))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 2))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 2))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.brick_block, 1, 0))
             .itemOutputs(new ItemStack(Items.brick, 3, 0))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.nether_brick, 1, 0))
             .itemOutputs(new ItemStack(Items.netherbrick, 3, 0))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.stained_glass, 1, 32767))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 1))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.glass, 1, 32767))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 1))
             .duration(10 * TICKS)
             .eut(10)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.stained_glass_pane, 1, 32767))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.glass_pane, 1, 32767))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Brick.getIngots(1))
             .itemOutputs(Materials.Brick.getDustSmall(1))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Firebrick.get(1))
             .itemOutputs(Materials.Fireclay.getDust(1))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Firebricks.get(1))
             .itemOutputs(ItemList.Firebrick.get(3))
             .duration(10 * TICKS)
             .eut(16)
             .addTo(hammerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Tesseract.get(1L), GregtechItemList.Laser_Lens_Special.get(1))
             .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(2880L))
             .fluidOutputs(MaterialsUEVplus.Space.getMolten(1440L), MaterialsUEVplus.Time.getMolten(1440L))
@@ -145,9 +145,9 @@ public class ForgeHammerRecipes implements Runnable {
             .addTo(hammerRecipes);
 
         if (HardcoreEnderExpansion.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(HardcoreEnderExpansion.ID, "endium_ore", 1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.HeeEndium, 1))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.crushed, Materials.HeeEndium, 1))
                 .duration(16)
                 .eut(10)
                 .addTo(hammerRecipes);
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java
index 9780a0a7ba..1b5d29f1df 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java
@@ -3,80 +3,80 @@ package gregtech.loaders.postload.recipes;
 import static gregtech.api.enums.Mods.AppliedEnergistics2;
 import static gregtech.api.enums.Mods.BuildCraftSilicon;
 import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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.GTOreDictUnificator;
 
 public class FormingPressRecipes implements Runnable {
 
     @Override
     public void run() {
         if (BuildCraftSilicon.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
                     getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
                 .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 1))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
                     getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
                 .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 1))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 1L),
                     getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
                 .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 2))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 1L),
                     getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
                 .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 3))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1L),
                     getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
                 .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 2L, 4))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NetherQuartz, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.NetherQuartz, 1L),
                     getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
                 .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 5))
                 .duration(15 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     new ItemStack(Items.comparator, 1, 32767),
                     getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
@@ -87,7 +87,7 @@ public class FormingPressRecipes implements Runnable {
         }
 
         if (AppliedEnergistics2.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10),
                     getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 13))
@@ -96,36 +96,36 @@ public class FormingPressRecipes implements Runnable {
                 .eut(16)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CertusQuartz, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.CertusQuartz, 1L),
                     getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 13))
                 .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 16))
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 1L),
                     getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 14))
                 .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 17))
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 1L),
                     getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 15))
                 .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 18))
                 .duration(10 * SECONDS)
                 .eut(16)
                 .addTo(formingPressRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.plate, Materials.SiliconSG, 1L),
+                    GTOreDictUnificator.get(OrePrefixes.plate, Materials.SiliconSG, 1L),
                     getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 19))
                 .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
                 .duration(10 * SECONDS)
@@ -133,52 +133,52 @@ public class FormingPressRecipes implements Runnable {
                 .addTo(formingPressRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Dough_Sugar.get(4L), ItemList.Shape_Mold_Cylinder.get(0L))
             .itemOutputs(ItemList.Food_Raw_Cake.get(1L))
             .duration(19 * SECONDS + 4 * TICKS)
             .eut(4)
             .addTo(formingPressRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Cupronickel, 1L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Cupronickel, 1L),
                 ItemList.Shape_Mold_Credit.get(0L))
             .itemOutputs(ItemList.Credit_Greg_Cupronickel.get(4L))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(formingPressRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Brass, 1L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Brass, 1L),
                 ItemList.Shape_Mold_Credit.get(0L))
             .itemOutputs(ItemList.Coin_Doge.get(4L))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(formingPressRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
                 ItemList.Shape_Mold_Credit.get(0L))
             .itemOutputs(ItemList.Credit_Iron.get(4L))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(formingPressRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+                GTOreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
                 ItemList.Shape_Mold_Credit.get(0L))
             .itemOutputs(ItemList.Credit_Iron.get(4L))
             .duration(5 * SECONDS)
             .eut(16)
             .addTo(formingPressRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brick, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brick, 1L),
                 ItemList.Shape_Mold_Ingot.get(0L))
             .itemOutputs(new ItemStack(Items.brick, 1, 0))
             .duration(5 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java
index 2c3c979b11..96a6331867 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java
@@ -4,124 +4,124 @@ import static gregtech.api.enums.Mods.ForbiddenMagic;
 import static gregtech.api.enums.Mods.TaintedMagic;
 import static gregtech.api.enums.Mods.Thaumcraft;
 import static gregtech.api.enums.Mods.ThaumicTinkerer;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
-import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GTRecipeConstants.FUEL_VALUE;
 
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.enums.GTValues;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTRecipeConstants;
 
 public class FuelRecipes implements Runnable {
 
     // todo: add an enum for the fuel type, int values are mysterious
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("biogasCell", 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("biogasCell", 1L))
             .metadata(FUEL_VALUE, 40)
             .metadata(FUEL_TYPE, 1)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.golden_apple, 1, 1))
             .itemOutputs(new ItemStack(Items.apple, 1))
             .metadata(FUEL_VALUE, 6400)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Thaumcraft.ID, "ItemShard", 1L, 6))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "GluttonyShard", 1L))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "FMResource", 1L, 3))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 1))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 2))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 3))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 4))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 5))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 6))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(TaintedMagic.ID, "ItemMaterial", 1L, 3))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(TaintedMagic.ID, "ItemMaterial", 1L, 4))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(TaintedMagic.ID, "ItemMaterial", 1L, 5))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 6))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 7))
             .metadata(FUEL_VALUE, 720)
             .metadata(FUEL_TYPE, 5)
-            .addTo(GT_RecipeConstants.Fuel);
+            .addTo(GTRecipeConstants.Fuel);
 
     }
 }
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java
index 3d53de7d2a..74cabd4196 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java
@@ -1,14 +1,14 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.fusionRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
-import static gregtech.api.util.GT_RecipeConstants.FUSION_THRESHOLD;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeConstants.FUSION_THRESHOLD;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.TierEU;
-import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MaterialsElements;
 
 public class FusionReactorRecipes implements Runnable {
 
@@ -21,7 +21,7 @@ public class FusionReactorRecipes implements Runnable {
         // F FT2, FT3 - fusion tier required, + - requires different startup recipe (startup cost bigger than
         // available on the tier)
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Lithium.getMolten(16), Materials.Tungsten.getMolten(16))
             .fluidOutputs(Materials.Iridium.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -29,7 +29,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 300000000)
             .addTo(fusionRecipes); // FT1+ - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Deuterium.getGas(125), Materials.Tritium.getGas(125))
             .fluidOutputs(Materials.Helium.getPlasma(125))
             .duration(16 * TICKS)
@@ -37,7 +37,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 40000000)
             .addTo(fusionRecipes); // FT1 Cheap - farmable
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Deuterium.getGas(125), Materials.Helium_3.getGas(125))
             .fluidOutputs(Materials.Helium.getPlasma(125))
             .duration(16 * TICKS)
@@ -45,7 +45,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 60000000)
             .addTo(fusionRecipes); // FT1 Expensive //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Aluminium.getMolten(16), Materials.Lithium.getMolten(16))
             .fluidOutputs(Materials.Sulfur.getPlasma(144))
             .duration(1 * SECONDS + 12 * TICKS)
@@ -53,7 +53,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 240000000)
             .addTo(fusionRecipes); // FT1+ Cheap
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Beryllium.getMolten(16), Materials.Deuterium.getGas(375))
             .fluidOutputs(Materials.Nitrogen.getPlasma(125))
             .duration(16 * TICKS)
@@ -61,7 +61,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 180000000)
             .addTo(fusionRecipes); // FT1+ Expensive //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Silicon.getMolten(16), Materials.Magnesium.getMolten(16))
             .fluidOutputs(Materials.Iron.getPlasma(144))
             .duration(1 * SECONDS + 12 * TICKS)
@@ -69,7 +69,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 360000000)
             .addTo(fusionRecipes); // FT1++ Cheap //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Potassium.getMolten(16), Materials.Fluorine.getGas(144))
             .fluidOutputs(Materials.Nickel.getPlasma(144))
             .duration(16 * TICKS)
@@ -77,7 +77,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 480000000)
             .addTo(fusionRecipes); // FT1++ Expensive //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Beryllium.getMolten(16), Materials.Tungsten.getMolten(16))
             .fluidOutputs(Materials.Platinum.getMolten(16))
             .duration(1 * SECONDS + 12 * TICKS)
@@ -85,7 +85,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 150000000)
             .addTo(fusionRecipes); // FT1 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Neodymium.getMolten(16), Materials.Hydrogen.getGas(48))
             .fluidOutputs(Materials.Europium.getMolten(16))
             .duration(1 * SECONDS + 12 * TICKS)
@@ -93,7 +93,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 150000000)
             .addTo(fusionRecipes); // FT1 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Lutetium.getMolten(16), Materials.Chrome.getMolten(16))
             .fluidOutputs(Materials.Americium.getMolten(16))
             .duration(4 * SECONDS + 16 * TICKS)
@@ -101,7 +101,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 200000000)
             .addTo(fusionRecipes); // FT2 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Plutonium.getMolten(16), Materials.Thorium.getMolten(16))
             .fluidOutputs(Materials.Naquadah.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -109,7 +109,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 300000000)
             .addTo(fusionRecipes); // FT1+ - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Americium.getMolten(144), Materials.Naquadria.getMolten(144))
             .fluidOutputs(Materials.Neutronium.getMolten(144))
             .duration(12 * SECONDS)
@@ -117,7 +117,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 640000000)
             .addTo(fusionRecipes); // FT3 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Glowstone.getMolten(16), Materials.Helium.getPlasma(4))
             .fluidOutputs(Materials.Sunnarium.getMolten(16))
             .duration(1 * SECONDS + 12 * TICKS)
@@ -126,7 +126,7 @@ public class FusionReactorRecipes implements Runnable {
             .addTo(fusionRecipes); // Mark 1 Expensive
                                    // //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Tungsten.getMolten(16), Materials.Helium.getGas(16))
             .fluidOutputs(Materials.Osmium.getMolten(16))
             .duration(12 * SECONDS + 16 * TICKS)
@@ -134,7 +134,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 150000000)
             .addTo(fusionRecipes); // FT1 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Manganese.getMolten(16), Materials.Hydrogen.getGas(16))
             .fluidOutputs(Materials.Iron.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -142,7 +142,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 120000000)
             .addTo(fusionRecipes); // FT1 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Magnesium.getMolten(128), Materials.Oxygen.getGas(128))
             .fluidOutputs(Materials.Calcium.getPlasma(16))
             .duration(6 * SECONDS + 8 * TICKS)
@@ -150,7 +150,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 120000000)
             .addTo(fusionRecipes); //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Mercury.getFluid(16), Materials.Magnesium.getMolten(16))
             .fluidOutputs(Materials.Uranium.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -158,7 +158,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 240000000)
             .addTo(fusionRecipes); // FT2 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Gold.getMolten(16), Materials.Aluminium.getMolten(16))
             .fluidOutputs(Materials.Uranium.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -166,7 +166,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 240000000)
             .addTo(fusionRecipes); // FT2 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Uranium.getMolten(16), Materials.Helium.getGas(16))
             .fluidOutputs(Materials.Plutonium.getMolten(16))
             .duration(6 * SECONDS + 8 * TICKS)
@@ -174,7 +174,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 480000000)
             .addTo(fusionRecipes); // FT2+ - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Vanadium.getMolten(16), Materials.Hydrogen.getGas(125))
             .fluidOutputs(Materials.Chrome.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -182,7 +182,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 140000000)
             .addTo(fusionRecipes); // FT1 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Gallium.getMolten(16), Materials.Radon.getGas(125))
             .fluidOutputs(Materials.Duranium.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -190,7 +190,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 140000000)
             .addTo(fusionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Titanium.getMolten(48), Materials.Duranium.getMolten(32))
             .fluidOutputs(Materials.Tritanium.getMolten(16))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -198,7 +198,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 200000000)
             .addTo(fusionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Tantalum.getMolten(16), Materials.Tritium.getGas(16))
             .fluidOutputs(Materials.Tungsten.getMolten(16))
             .duration(16 * TICKS)
@@ -206,7 +206,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 200000000)
             .addTo(fusionRecipes); //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Silver.getMolten(16), Materials.Lithium.getMolten(16))
             .fluidOutputs(Materials.Indium.getMolten(16))
             .duration(1 * SECONDS + 12 * TICKS)
@@ -214,7 +214,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 380000000)
             .addTo(fusionRecipes); //
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Copper.getMolten(72), Materials.Tritium.getGas(250))
             .fluidOutputs(Materials.Zinc.getPlasma(72))
             .duration(16 * TICKS)
@@ -222,7 +222,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 180000000)
             .addTo(fusionRecipes); // FT2 - farmable
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Cobalt.getMolten(144), Materials.Silicon.getMolten(144))
             .fluidOutputs(Materials.Niobium.getPlasma(144))
             .duration(16 * TICKS)
@@ -230,7 +230,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 200000000)
             .addTo(fusionRecipes); // FT2 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Gold.getMolten(144), Materials.Arsenic.getMolten(144))
             .fluidOutputs(Materials.Silver.getPlasma(144))
             .duration(16 * TICKS)
@@ -238,7 +238,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 350000000)
             .addTo(fusionRecipes); // FT2+
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Silver.getMolten(144), Materials.Helium_3.getGas(375))
             .fluidOutputs(Materials.Tin.getPlasma(288))
             .duration(16 * TICKS)
@@ -246,7 +246,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 280000000)
             .addTo(fusionRecipes); // FT2
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Tantalum.getMolten(144), Materials.Zinc.getPlasma(72))
             .fluidOutputs(Materials.Bismuth.getPlasma(144))
             .duration(16 * TICKS)
@@ -254,7 +254,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 350000000)
             .addTo(fusionRecipes); // FT3 - farmable
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Iridium.getMolten(144), Materials.Fluorine.getGas(500))
             .fluidOutputs(Materials.Radon.getPlasma(144))
             .duration(1 * SECONDS + 12 * TICKS)
@@ -262,7 +262,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 450000000)
             .addTo(fusionRecipes); // FT3 - utility
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Plutonium241.getMolten(144), Materials.Hydrogen.getGas(2000))
             .fluidOutputs(Materials.Americium.getPlasma(144))
             .duration(3 * SECONDS + 4 * TICKS)
@@ -270,15 +270,15 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 500000000)
             .addTo(fusionRecipes); // FT3
 
-        GT_Values.RA.stdBuilder()
-            .fluidInputs(Materials.Cobalt.getMolten(144), ELEMENT.getInstance().NEON.getFluidStack(144))
+        GTValues.RA.stdBuilder()
+            .fluidInputs(Materials.Cobalt.getMolten(144), MaterialsElements.getInstance().NEON.getFluidStack(144))
             .fluidOutputs(Materials.Rubidium.getMolten(144))
             .duration(1 * SECONDS + 4 * TICKS)
             .eut(98304)
             .metadata(FUSION_THRESHOLD, 500000000)
             .addTo(fusionRecipes); // FT3
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Lutetium.getMolten(288), Materials.Vanadium.getMolten(288))
             .fluidOutputs(Materials.Plutonium241.getPlasma(288))
             .duration(4 * TICKS)
@@ -286,7 +286,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 1_000_000_000)
             .addTo(fusionRecipes); // FT5 because of UEV voltage
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Tellurium.getMolten(288), Materials.Zinc.getMolten(288))
             .fluidOutputs(Materials.Lead.getPlasma(288))
             .duration(4 * TICKS)
@@ -294,7 +294,7 @@ public class FusionReactorRecipes implements Runnable {
             .metadata(FUSION_THRESHOLD, 1_000_000_000)
             .addTo(fusionRecipes); // FT5 because of UEV voltage
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(Materials.Osmium.getMolten(288), Materials.Silicon.getMolten(288))
             .fluidOutputs(Materials.Thorium.getPlasma(288))
             .duration(4 * TICKS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java
index a671fd6977..80a35f1da0 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java
@@ -3,69 +3,69 @@ package gregtech.loaders.postload.recipes;
 import static gregtech.api.enums.Mods.GalacticraftCore;
 import static gregtech.api.enums.Mods.GalacticraftMars;
 import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTRecipeConstants;
 
 public class ImplosionCompressorRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Compressed_Coal_Chunk.get(1L))
             .itemOutputs(
                 ItemList.IC2_Industrial_Diamond.get(1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 4L))
-            .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 8)
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 4L))
+            .metadata(GTRecipeConstants.ADDITIVE_AMOUNT, 8)
             .duration(1 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(implosionRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Ingot_IridiumAlloy.get(1L))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Iridium, 1L),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 4L))
-            .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 8)
+                GTOreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Iridium, 1L),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 4L))
+            .metadata(GTRecipeConstants.ADDITIVE_AMOUNT, 8)
             .duration(1 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(implosionRecipes);
 
         if (GalacticraftMars.isModLoaded()) {
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Ingot_Heavy1.get(1L))
                 .itemOutputs(
                     getModItem(GalacticraftCore.ID, "item.heavyPlating", 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.StainlessSteel, 1L))
-                .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 8)
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.StainlessSteel, 1L))
+                .metadata(GTRecipeConstants.ADDITIVE_AMOUNT, 8)
                 .duration(1 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(implosionRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Ingot_Heavy2.get(1L))
                 .itemOutputs(
                     getModItem(GalacticraftMars.ID, "item.null", 1L, 3),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.TungstenSteel, 2L))
-                .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 16)
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.TungstenSteel, 2L))
+                .metadata(GTRecipeConstants.ADDITIVE_AMOUNT, 16)
                 .duration(1 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(implosionRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Ingot_Heavy3.get(1L))
                 .itemOutputs(
                     getModItem(GalacticraftMars.ID, "item.itemBasicAsteroids", 1L),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Platinum, 3L))
-                .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 24)
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Platinum, 3L))
+                .metadata(GTRecipeConstants.ADDITIVE_AMOUNT, 24)
                 .duration(1 * SECONDS)
                 .eut(TierEU.RECIPE_LV)
                 .addTo(implosionRecipes);
diff --git a/src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java
index be21c84d66..58285ee204 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java
@@ -1,10 +1,10 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.MaterialsUEVplus;
 import gregtech.api.enums.TierEU;
 
@@ -13,7 +13,7 @@ public class LaserEngraverRecipes implements Runnable {
     @Override
     public void run() {
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentCrudeCatalyst.getFluid(1000))
             .fluidOutputs(MaterialsUEVplus.ExcitedDTCC.getFluid(1000))
             .requiresCleanRoom()
@@ -22,7 +22,7 @@ public class LaserEngraverRecipes implements Runnable {
             .noOptimize()
             .addTo(laserEngraverRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentProsaicCatalyst.getFluid(1000))
             .fluidOutputs(MaterialsUEVplus.ExcitedDTPC.getFluid(1000))
             .requiresCleanRoom()
@@ -31,7 +31,7 @@ public class LaserEngraverRecipes implements Runnable {
             .noOptimize()
             .addTo(laserEngraverRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentResplendentCatalyst.getFluid(1000))
             .fluidOutputs(MaterialsUEVplus.ExcitedDTRC.getFluid(1000))
             .requiresCleanRoom()
@@ -40,7 +40,7 @@ public class LaserEngraverRecipes implements Runnable {
             .noOptimize()
             .addTo(laserEngraverRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentExoticCatalyst.getFluid(1000))
             .fluidOutputs(MaterialsUEVplus.ExcitedDTEC.getFluid(1000))
             .requiresCleanRoom()
@@ -49,7 +49,7 @@ public class LaserEngraverRecipes implements Runnable {
             .noOptimize()
             .addTo(laserEngraverRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentStellarCatalyst.getFluid(1000))
             .fluidOutputs(MaterialsUEVplus.ExcitedDTSC.getFluid(1000))
             .requiresCleanRoom()
diff --git a/src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java
index 4413f61200..db2c79322f 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java
@@ -2,37 +2,37 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.Forestry;
 import static gregtech.api.recipe.RecipeMaps.latheRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class LatheRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(new ItemStack(Blocks.wooden_slab, 1, GT_Values.W))
+        GTValues.RA.stdBuilder()
+            .itemInputs(new ItemStack(Blocks.wooden_slab, 1, GTValues.W))
             .itemOutputs(
                 new ItemStack(Items.bowl, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 1))
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(8)
             .addTo(latheRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(getModItem(Forestry.ID, "slabs", 1L, GT_Values.W))
+        GTValues.RA.stdBuilder()
+            .itemInputs(getModItem(Forestry.ID, "slabs", 1L, GTValues.W))
             .itemOutputs(
                 new ItemStack(Items.bowl, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 1))
+                GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(8)
             .addTo(latheRecipes);
diff --git a/src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java
index 863f0ae440..5896b94f1a 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java
@@ -1,9 +1,9 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.amplifierRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.TierEU;
@@ -12,14 +12,14 @@ public class MatterAmplifierRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Scrap.get(9L))
             .fluidOutputs(Materials.UUAmplifier.getFluid(1))
             .duration(9 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(amplifierRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Scrapbox.get(1L))
             .fluidOutputs(Materials.UUAmplifier.getFluid(1))
             .duration(9 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java
index 1b8cbb4dcd..4562435816 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java
@@ -8,10 +8,10 @@ import static gregtech.api.enums.Mods.PamsHarvestCraft;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.enums.Mods.Thaumcraft;
 import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.init.Blocks;
@@ -20,8 +20,8 @@ import net.minecraft.item.ItemStack;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import goodgenerator.items.MyMaterial;
-import gregtech.api.enums.GT_Values;
+import goodgenerator.items.GGMaterial;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsKevlar;
@@ -29,9 +29,9 @@ import gregtech.api.enums.MaterialsOreAlum;
 import gregtech.api.enums.MaterialsUEVplus;
 import gregtech.api.enums.OrePrefixes;
 import gregtech.api.enums.TierEU;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
 
 public class MixerRecipes implements Runnable {
@@ -41,408 +41,408 @@ public class MixerRecipes implements Runnable {
 
         registerSingleBlockAndMulti();
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnderPearl, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.EnderEye, OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.EnderPearl, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.EnderEye, OrePrefixes.dust.mMaterialAmount))
             .duration(5 * SECONDS)
             .eut(48)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Electrum, 2L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Electrum, 2L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Invar, 3L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Invar, 3L * OrePrefixes.dust.mMaterialAmount))
             .duration(15 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Invar, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Manganese, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.StainlessSteel, 9L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Invar, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Manganese, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.StainlessSteel, 9L * OrePrefixes.dust.mMaterialAmount))
             .duration(45 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Kanthal, 3L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Kanthal, 3L * OrePrefixes.dust.mMaterialAmount))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Brass, 4L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Brass, 4L * OrePrefixes.dust.mMaterialAmount))
             .duration(2 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Bronze, 4L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Bronze, 4L * OrePrefixes.dust.mMaterialAmount))
             .duration(2 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_Utility.getIntegratedCircuit(3))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Cupronickel, 2L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTUtility.getIntegratedCircuit(3))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Cupronickel, 2L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(24)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4),
-                GT_Utility.getIntegratedCircuit(4))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.SterlingSilver, 5L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4),
+                GTUtility.getIntegratedCircuit(4))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.SterlingSilver, 5L * OrePrefixes.dust.mMaterialAmount))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Electrum, 2),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlackBronze, 5L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Electrum, 2),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.BlackBronze, 5L * OrePrefixes.dust.mMaterialAmount))
             .duration(25 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 4),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.BismuthBronze, 5L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 4),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.BismuthBronze, 5L * OrePrefixes.dust.mMaterialAmount))
             .duration(25 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackBronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 3),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlackSteel, 5L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BlackBronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 3),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.BlackSteel, 5L * OrePrefixes.dust.mMaterialAmount))
             .duration(25 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SterlingSilver, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BismuthBronze, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.RedSteel, 8L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.SterlingSilver, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BismuthBronze, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.RedSteel, 8L * OrePrefixes.dust.mMaterialAmount))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RoseGold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlueSteel, 8L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.RoseGold, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.BlueSteel, 8L * OrePrefixes.dust.mMaterialAmount))
             .duration(40 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 5),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 15),
-                GT_Utility.getIntegratedCircuit(14))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlackSteel, 25L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 5),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 15),
+                GTUtility.getIntegratedCircuit(14))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.BlackSteel, 25L * OrePrefixes.dust.mMaterialAmount))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 20),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 10),
-                GT_Utility.getIntegratedCircuit(15))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.RedSteel, 40L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 20),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 10),
+                GTUtility.getIntegratedCircuit(15))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.RedSteel, 40L * OrePrefixes.dust.mMaterialAmount))
             .duration(60 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 19),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 16),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 5),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 64),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 16),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 40),
-                GT_Utility.getIntegratedCircuit(16))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 19),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 16),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 5),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 64),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 16),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 40),
+                GTUtility.getIntegratedCircuit(16))
             .itemOutputs(
-                GT_OreDictUnificator.getDust(Materials.BlueSteel, 64L * OrePrefixes.dust.mMaterialAmount),
-                GT_OreDictUnificator.getDust(Materials.BlueSteel, 64L * OrePrefixes.dust.mMaterialAmount),
-                GT_OreDictUnificator.getDust(Materials.BlueSteel, 32L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.getDust(Materials.BlueSteel, 64L * OrePrefixes.dust.mMaterialAmount),
+                GTOreDictUnificator.getDust(Materials.BlueSteel, 64L * OrePrefixes.dust.mMaterialAmount),
+                GTOreDictUnificator.getDust(Materials.BlueSteel, 32L * OrePrefixes.dust.mMaterialAmount))
             .duration(3 * MINUTES)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 5),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Molybdenum, 1),
-                GT_Utility.getIntegratedCircuit(2))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Ultimet, 9L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 5),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Molybdenum, 1),
+                GTUtility.getIntegratedCircuit(2))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Ultimet, 9L * OrePrefixes.dust.mMaterialAmount))
             .duration(45 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 7),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.CobaltBrass, 9L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 7),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.CobaltBrass, 9L * OrePrefixes.dust.mMaterialAmount))
             .duration(45 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 3),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 3),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
             .duration(30 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 3),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 3),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
             .duration(30 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 3),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 3),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
             .duration(30 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Indium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Indium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(
-                GT_OreDictUnificator.getDust(Materials.IndiumGalliumPhosphide, 3L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.getDust(Materials.IndiumGalliumPhosphide, 3L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brick, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Fireclay, 2L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Brick, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Fireclay, 2L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 4),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Nichrome, 5L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 4),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Nichrome, 5L * OrePrefixes.dust.mMaterialAmount))
             .duration(25 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 3),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.Osmiridium, 4L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 3),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.Osmiridium, 4L * OrePrefixes.dust.mMaterialAmount))
             .duration(2 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Niobium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.NiobiumTitanium, 2L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Niobium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.NiobiumTitanium, 2L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.VanadiumGallium, 4L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.VanadiumGallium, 4L * OrePrefixes.dust.mMaterialAmount))
             .duration(2 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.TungstenCarbide, 2L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.TungstenCarbide, 2L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.TungstenSteel, 2L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.TungstenSteel, 2L * OrePrefixes.dust.mMaterialAmount))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(TierEU.RECIPE_EV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 3),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.TPV, 7L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 3),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.TPV, 7L * OrePrefixes.dust.mMaterialAmount))
             .duration(8 * SECONDS + 15 * TICKS)
             .eut(TierEU.RECIPE_EV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 5),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Molybdenum, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.HSSG, 9L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 5),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Molybdenum, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.HSSG, 9L * OrePrefixes.dust.mMaterialAmount))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_EV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 6),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Manganese, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.HSSE, 9L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 6),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Manganese, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.HSSE, 9L * OrePrefixes.dust.mMaterialAmount))
             .duration(35 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 6),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
-                GT_Utility.getIntegratedCircuit(2))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.HSSS, 9L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 6),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 2),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
+                GTUtility.getIntegratedCircuit(2))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.HSSS, 9L * OrePrefixes.dust.mMaterialAmount))
             .duration(40 * SECONDS)
             .eut(TierEU.RECIPE_IV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4),
-                GT_Utility.getIntegratedCircuit(3))
-            .itemOutputs(GT_OreDictUnificator.getDust(Materials.FerriteMixture, 6L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4),
+                GTUtility.getIntegratedCircuit(3))
+            .itemOutputs(GTOreDictUnificator.getDust(Materials.FerriteMixture, 6L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Boron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 7))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Boron, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 7))
             .itemOutputs(
-                GT_OreDictUnificator.getDust(Materials.BorosilicateGlass, 8L * OrePrefixes.dust.mMaterialAmount))
+                GTOreDictUnificator.getDust(Materials.BorosilicateGlass, 8L * OrePrefixes.dust.mMaterialAmount))
             .duration(10 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Items.rotten_flesh, 1, 0),
                 new ItemStack(Items.fermented_spider_eye, 1, 0),
                 ItemList.IC2_Scrap.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatRaw, 1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.MeatRaw, 1))
             .itemOutputs(ItemList.Food_Chum.get(4))
             .fluidInputs(getFluidStack("potion.purpledrink", 750))
             .fluidOutputs(getFluidStack("sludge", 1000))
@@ -450,44 +450,42 @@ public class MixerRecipes implements Runnable {
             .eut(24)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1))
             .itemOutputs(ItemList.Food_Dough.get(2))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1),
-                ItemList.Food_PotatoChips.get(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1), ItemList.Food_PotatoChips.get(1))
             .itemOutputs(ItemList.Food_ChiliChips.get(1))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Redstone, 5),
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ruby, 4))
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Redstone, 5),
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ruby, 4))
             .itemOutputs(ItemList.IC2_Energium_Dust.get(1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 5),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ruby, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 5),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ruby, 4))
             .itemOutputs(ItemList.IC2_Energium_Dust.get(9))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1),
                 new ItemStack(Blocks.brown_mushroom, 1),
                 new ItemStack(Items.spider_eye, 1))
             .itemOutputs(new ItemStack(Items.fermented_spider_eye, 1))
@@ -495,138 +493,138 @@ public class MixerRecipes implements Runnable {
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 2))
+                GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 2))
             .duration(5 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 9),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 9))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 18))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 9),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 9))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 18))
             .duration(45 * SECONDS)
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Fluix, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Fluix, 2))
             .fluidInputs(Materials.Water.getFluid(500))
             .duration(20 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
-                GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Fluix, 2))
-            .fluidInputs(GT_ModHandler.getDistilledWater(500))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+                GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.Fluix, 2))
+            .fluidInputs(GTModHandler.getDistilledWater(500))
             .duration(20 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.IC2_Fertilizer.get(1),
                 new ItemStack(Blocks.dirt, 8, 32767),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.FR_Fertilizer.get(1),
                 new ItemStack(Blocks.dirt, 8, 32767),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.FR_Compost.get(1),
                 new ItemStack(Blocks.dirt, 8, 32767),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.FR_Mulch.get(8),
                 new ItemStack(Blocks.dirt, 8, 32767),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
             .fluidInputs(Materials.Water.getFluid(1000))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.sand, 1, 32767),
                 new ItemStack(Blocks.dirt, 1, 32767),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(getModItem(Forestry.ID, "soil", 2L, 1))
             .fluidInputs(Materials.Water.getFluid(250))
             .duration(16 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
             .duration(16 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
                 Materials.Empty.getCells(1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
             .fluidInputs(Materials.HeavyFuel.getFluid(1000))
             .duration(16 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1),
                 Materials.Empty.getCells(5),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
             .fluidInputs(Materials.LightFuel.getFluid(5000))
             .duration(16 * TICKS)
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
-                GT_Utility.getIntegratedCircuit(5))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
+                GTUtility.getIntegratedCircuit(5))
             .itemOutputs(Materials.Empty.getCells(5))
             .fluidInputs(Materials.HeavyFuel.getFluid(1000))
             .fluidOutputs(Materials.Fuel.getFluid(6000))
@@ -634,10 +632,10 @@ public class MixerRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1),
-                GT_Utility.getIntegratedCircuit(6))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1),
+                GTUtility.getIntegratedCircuit(6))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.LightFuel.getFluid(5000))
             .fluidOutputs(Materials.Fuel.getFluid(6000))
@@ -645,10 +643,10 @@ public class MixerRecipes implements Runnable {
             .eut(TierEU.RECIPE_MV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 5),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 5),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
             .itemOutputs(Materials.Empty.getCells(5))
             .fluidInputs(Materials.Lubricant.getFluid(20))
             .fluidOutputs(new FluidStack(ItemList.sDrillingFluid, 5000))
@@ -656,56 +654,56 @@ public class MixerRecipes implements Runnable {
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1),
-                GT_Utility.getIntegratedCircuit(4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1),
+                GTUtility.getIntegratedCircuit(4))
             .fluidInputs(Materials.Water.getFluid(125))
             .fluidOutputs(getFluidStack("ic2coolant", 125))
             .duration(12 * SECONDS + 16 * TICKS)
             .eut(48)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1),
-                GT_Utility.getIntegratedCircuit(4))
-            .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1),
+                GTUtility.getIntegratedCircuit(4))
+            .fluidInputs(GTModHandler.getDistilledWater(1000))
             .fluidOutputs(getFluidStack("ic2coolant", 1000))
             .duration(12 * SECONDS + 16 * TICKS)
             .eut(48)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.SFMixture.get(4))
             .fluidInputs(Materials.AdvancedGlue.getFluid(200))
             .duration(40 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.SFMixture.get(8))
             .fluidInputs(Materials.AdvancedGlue.getFluid(200))
             .duration(40 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.SFMixture.get(12))
             .fluidInputs(Materials.AdvancedGlue.getFluid(200))
             .duration(40 * SECONDS)
@@ -714,124 +712,124 @@ public class MixerRecipes implements Runnable {
 
         // McGuffium239 is non-renewable and only obtainable though world gen.
         // It's a meme, don't think too deep about it.
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.SFMixture.get(64))
             .fluidInputs(Materials.McGuffium239.getFluid(12))
             .duration(20 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.SFMixture.get(64))
             .fluidInputs(Materials.McGuffium239.getFluid(8))
             .duration(20 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.SFMixture.get(64))
             .fluidInputs(Materials.McGuffium239.getFluid(4))
             .duration(20 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.SFMixture.get(2), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnderEye, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.SFMixture.get(2), GTOreDictUnificator.get(OrePrefixes.dust, Materials.EnderEye, 1))
             .itemOutputs(ItemList.MSFMixture.get(4))
             .fluidInputs(Materials.Mercury.getFluid(1000))
             .duration(15 * SECONDS)
             .eut(64)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(ItemList.SFMixture.get(1), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(ItemList.SFMixture.get(1), GTOreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1))
             .itemOutputs(ItemList.MSFMixture.get(1))
             .fluidInputs(Materials.Mercury.getFluid(500))
             .duration(15 * SECONDS)
             .eut(64)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 4),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 4),
                 ItemList.MSFMixture.get(24),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_MSSFUEL.get(4))
             .fluidInputs(Materials.NitroFuel.getFluid(4000))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 4),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 4),
                 ItemList.MSFMixture.get(16),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_MSSFUEL.get(4))
             .fluidInputs(Materials.NitroFuel.getFluid(3000))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 4),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 4),
                 ItemList.MSFMixture.get(8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_MSSFUEL.get(4))
             .fluidInputs(Materials.NitroFuel.getFluid(2000))
             .duration(10 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 4),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 4),
                 ItemList.MSFMixture.get(24),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_MSSFUEL.get(4))
             .fluidInputs(Materials.GasolinePremium.getFluid(1600))
             .duration(20 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 4),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 4),
                 ItemList.MSFMixture.get(16),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_MSSFUEL.get(4))
             .fluidInputs(Materials.GasolinePremium.getFluid(1200))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 4),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 4),
                 ItemList.MSFMixture.get(8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_MSSFUEL.get(4))
             .fluidInputs(Materials.GasolinePremium.getFluid(800))
             .duration(10 * SECONDS)
@@ -839,66 +837,66 @@ public class MixerRecipes implements Runnable {
             .addTo(mixerRecipes);
 
         if (Thaumcraft.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.SFMixture.get(20),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedAir, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedAir, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.MSFMixture.get(20))
                 .fluidInputs(Materials.FierySteel.getFluid(50))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.SFMixture.get(20),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEarth, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEarth, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.MSFMixture.get(20))
                 .fluidInputs(Materials.FierySteel.getFluid(50))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.SFMixture.get(20),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEntropy, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEntropy, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.MSFMixture.get(20))
                 .fluidInputs(Materials.FierySteel.getFluid(50))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.SFMixture.get(20),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedFire, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedFire, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.MSFMixture.get(20))
                 .fluidInputs(Materials.FierySteel.getFluid(50))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.SFMixture.get(20),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedOrder, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedOrder, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.MSFMixture.get(20))
                 .fluidInputs(Materials.FierySteel.getFluid(50))
                 .duration(10 * SECONDS)
                 .eut(64)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     ItemList.SFMixture.get(20),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedWater, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedWater, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.MSFMixture.get(20))
                 .fluidInputs(Materials.FierySteel.getFluid(50))
                 .duration(10 * SECONDS)
@@ -907,138 +905,138 @@ public class MixerRecipes implements Runnable {
 
             FluidStack tFD = getFluidStack("fluiddeath", 30);
             if (tFD != null && tFD.getFluid() != null && tFD.amount > 0) {
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         ItemList.SFMixture.get(30),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedAir, 1),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedAir, 1),
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.MSFMixture.get(30))
                     .fluidInputs(tFD)
                     .duration(10 * SECONDS)
                     .eut(64)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         ItemList.SFMixture.get(30),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEarth, 1),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEarth, 1),
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.MSFMixture.get(30))
                     .fluidInputs(tFD)
                     .duration(10 * SECONDS)
                     .eut(64)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         ItemList.SFMixture.get(30),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEntropy, 1),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEntropy, 1),
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.MSFMixture.get(30))
                     .fluidInputs(tFD)
                     .duration(10 * SECONDS)
                     .eut(64)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         ItemList.SFMixture.get(30),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedFire, 1),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedFire, 1),
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.MSFMixture.get(30))
                     .fluidInputs(tFD)
                     .duration(10 * SECONDS)
                     .eut(64)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         ItemList.SFMixture.get(30),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedOrder, 1),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedOrder, 1),
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.MSFMixture.get(30))
                     .fluidInputs(tFD)
                     .duration(10 * SECONDS)
                     .eut(64)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
                         ItemList.SFMixture.get(30),
-                        GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedWater, 1),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTOreDictUnificator.get(OrePrefixes.dust, Materials.InfusedWater, 1),
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.MSFMixture.get(30))
                     .fluidInputs(tFD)
                     .duration(10 * SECONDS)
                     .eut(64)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
                         ItemList.MSFMixture.get(6),
                         getModItem(Thaumcraft.ID, "ItemResource", 4),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                     .fluidInputs(Materials.NitroFuel.getFluid(1000))
                     .duration(7 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
                         ItemList.MSFMixture.get(4),
                         getModItem(Thaumcraft.ID, "ItemResource", 4),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                     .fluidInputs(Materials.NitroFuel.getFluid(750))
                     .duration(6 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
                         ItemList.MSFMixture.get(2),
                         getModItem(Thaumcraft.ID, "ItemResource", 4),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                     .fluidInputs(Materials.NitroFuel.getFluid(500))
                     .duration(5 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
                         ItemList.MSFMixture.get(6),
                         getModItem(Thaumcraft.ID, "ItemResource", 4),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                     .fluidInputs(Materials.GasolinePremium.getFluid(400))
                     .duration(7 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
                         ItemList.MSFMixture.get(4),
                         getModItem(Thaumcraft.ID, "ItemResource", 4),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                     .fluidInputs(Materials.GasolinePremium.getFluid(300))
                     .duration(6 * SECONDS)
                     .eut(TierEU.RECIPE_HV)
                     .addTo(mixerRecipes);
 
-                GT_Values.RA.stdBuilder()
+                GTValues.RA.stdBuilder()
                     .itemInputs(
-                        GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+                        GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
                         ItemList.MSFMixture.get(2),
                         getModItem(Thaumcraft.ID, "ItemResource", 4),
-                        GT_Utility.getIntegratedCircuit(1))
+                        GTUtility.getIntegratedCircuit(1))
                     .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                     .fluidInputs(Materials.GasolinePremium.getFluid(200))
                     .duration(5 * SECONDS)
@@ -1047,76 +1045,76 @@ public class MixerRecipes implements Runnable {
             }
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
                 ItemList.SFMixture.get(6),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_SSFUEL.get(1))
             .fluidInputs(Materials.NitroFuel.getFluid(1000))
             .duration(7 * SECONDS)
             .eut(250)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
                 ItemList.SFMixture.get(4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_SSFUEL.get(1))
             .fluidInputs(Materials.NitroFuel.getFluid(750))
             .duration(6 * SECONDS)
             .eut(250)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
                 ItemList.SFMixture.get(2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_SSFUEL.get(1))
             .fluidInputs(Materials.NitroFuel.getFluid(500))
             .duration(5 * SECONDS)
             .eut(250)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
                 ItemList.SFMixture.get(6),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_SSFUEL.get(1))
             .fluidInputs(Materials.GasolinePremium.getFluid(400))
             .duration(7 * SECONDS)
             .eut(250)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
                 ItemList.SFMixture.get(4),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_SSFUEL.get(1))
             .fluidInputs(Materials.GasolinePremium.getFluid(300))
             .duration(6 * SECONDS)
             .eut(250)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+                GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
                 ItemList.SFMixture.get(2),
-                GT_Utility.getIntegratedCircuit(1))
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Block_SSFUEL.get(1))
             .fluidInputs(Materials.GasolinePremium.getFluid(200))
             .duration(5 * SECONDS)
             .eut(250)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1),
-                GT_Utility.getIntegratedCircuit(1))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1),
+                GTUtility.getIntegratedCircuit(1))
             .itemOutputs(ItemList.Cell_Empty.get(1))
             .fluidInputs(Materials.NitricAcid.getFluid(1000))
             .fluidOutputs(new FluidStack(ItemList.sNitrationMixture, 2000))
@@ -1124,164 +1122,164 @@ public class MixerRecipes implements Runnable {
             .eut(2)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1),
-                GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitricAcid, 1),
-                GT_Utility.getIntegratedCircuit(1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitrationMixture, 2))
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1),
+                GTOreDictUnificator.get(OrePrefixes.cell, Materials.NitricAcid, 1),
+                GTUtility.getIntegratedCircuit(1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.NitrationMixture, 2))
             .duration(24 * SECONDS)
             .eut(2)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 32767),
                 new ItemStack(Items.wheat, 4, 32767),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 2),
                 new ItemStack(Items.wheat, 4, 32767),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 32767),
                 getModItem(BiomesOPlenty.ID, "plants", 4, 6),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 2),
                 getModItem(BiomesOPlenty.ID, "plants", 4, 6),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 32767),
                 getModItem(PamsHarvestCraft.ID, "oatsItem", 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 2),
                 getModItem(PamsHarvestCraft.ID, "oatsItem", 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 32767),
                 getModItem(PamsHarvestCraft.ID, "ryeItem", 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 2),
                 getModItem(PamsHarvestCraft.ID, "ryeItem", 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 32767),
                 getModItem(PamsHarvestCraft.ID, "barleyItem", 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 2),
                 getModItem(PamsHarvestCraft.ID, "barleyItem", 4, 6),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 32767),
                 getModItem(Natura.ID, "barleyFood", 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 2),
                 getModItem(Natura.ID, "barleyFood", 4),
-                GT_Utility.getIntegratedCircuit(2))
+                GTUtility.getIntegratedCircuit(2))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 32767),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(Blocks.dirt, 1, 2),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4),
-                GT_Utility.getIntegratedCircuit(3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4),
+                GTUtility.getIntegratedCircuit(3))
             .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
             .fluidInputs(Materials.Water.getFluid(100))
             .duration(10 * SECONDS)
@@ -1290,15 +1288,15 @@ public class MixerRecipes implements Runnable {
 
         // radiation manufacturing
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("fuelRod", 1), new ItemStack(Items.glowstone_dust, 9))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("fuelRod", 1), new ItemStack(Items.glowstone_dust, 9))
             .itemOutputs(ItemList.GlowstoneCell.get(1))
             .fluidInputs(Materials.Helium.getGas(250))
             .duration(1 * SECONDS + 10 * TICKS)
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(MaterialsOreAlum.SluiceSand.getDust(1))
             .fluidInputs(Materials.Water.getFluid(500))
             .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(1000))
@@ -1308,8 +1306,8 @@ public class MixerRecipes implements Runnable {
 
         // NaCl + H2O = (NaCl·H2O)
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Salt.getDust(2), GT_Utility.getIntegratedCircuit(3))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Salt.getDust(2), GTUtility.getIntegratedCircuit(3))
             .fluidInputs(Materials.Water.getFluid(1000))
             .fluidOutputs(Materials.SaltWater.getFluid(1000))
             .duration(5 * SECONDS)
@@ -1318,8 +1316,8 @@ public class MixerRecipes implements Runnable {
 
         // CaCO3 + 2 CH3COOH = Ca(CH3COO)2 + H2O + CO2
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1), Materials.CarbonDioxide.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
@@ -1327,8 +1325,8 @@ public class MixerRecipes implements Runnable {
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.CalciumAcetateSolution.getCells(1), Materials.CarbonDioxide.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -1336,8 +1334,8 @@ public class MixerRecipes implements Runnable {
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(21))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GTUtility.getIntegratedCircuit(21))
             .itemOutputs(Materials.Water.getCells(1), Materials.CalciumAcetateSolution.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
@@ -1345,8 +1343,8 @@ public class MixerRecipes implements Runnable {
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(4))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(4))
             .itemOutputs(Materials.CarbonDioxide.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
@@ -1354,8 +1352,8 @@ public class MixerRecipes implements Runnable {
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(14))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(14))
             .itemOutputs(Materials.CalciumAcetateSolution.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
@@ -1365,8 +1363,8 @@ public class MixerRecipes implements Runnable {
 
         // Ca + 2 CH3COOH = Ca(CH3COO)2 + 2H
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcium.getDust(1), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcium.getDust(1), Materials.Empty.getCells(2), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Hydrogen.getCells(2))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
@@ -1374,8 +1372,8 @@ public class MixerRecipes implements Runnable {
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Calcium.getDust(1), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Calcium.getDust(1), Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.CalciumAcetateSolution.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.Hydrogen.getGas(2000))
@@ -1385,8 +1383,8 @@ public class MixerRecipes implements Runnable {
 
         // CaO + 2 CH3COOH = Ca(CH3COO)2 + H2O
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Quicklime.getDust(2), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Quicklime.getDust(2), Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Water.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
@@ -1394,11 +1392,8 @@ public class MixerRecipes implements Runnable {
             .eut(16)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(
-                Materials.Quicklime.getDust(2),
-                Materials.Empty.getCells(1),
-                GT_Utility.getIntegratedCircuit(11))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Quicklime.getDust(2), Materials.Empty.getCells(1), GTUtility.getIntegratedCircuit(11))
             .itemOutputs(Materials.CalciumAcetateSolution.getCells(1))
             .fluidInputs(Materials.AceticAcid.getFluid(2000))
             .fluidOutputs(Materials.Water.getFluid(1000))
@@ -1408,7 +1403,7 @@ public class MixerRecipes implements Runnable {
 
         // 2CH3COOCH3 + 3CH3COCH3/(C4H6O2)n = 5Glue
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Acetone.getCells(3))
             .itemOutputs(Materials.Empty.getCells(3))
             .fluidInputs(Materials.PolyvinylAcetate.getFluid(2000))
@@ -1417,7 +1412,7 @@ public class MixerRecipes implements Runnable {
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PolyvinylAcetate.getCells(2))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidInputs(Materials.Acetone.getFluid(3000))
@@ -1426,7 +1421,7 @@ public class MixerRecipes implements Runnable {
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.MethylAcetate.getCells(3))
             .itemOutputs(Materials.Empty.getCells(3))
             .fluidInputs(Materials.PolyvinylAcetate.getFluid(2000))
@@ -1435,7 +1430,7 @@ public class MixerRecipes implements Runnable {
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.PolyvinylAcetate.getCells(2))
             .itemOutputs(Materials.Empty.getCells(2))
             .fluidInputs(Materials.MethylAcetate.getFluid(3000))
@@ -1444,7 +1439,7 @@ public class MixerRecipes implements Runnable {
             .eut(8)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Sugar.getDust(4))
             .itemOutputs(Materials.Charcoal.getGems(1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
@@ -1453,7 +1448,7 @@ public class MixerRecipes implements Runnable {
             .eut(2)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Wood.getDust(4))
             .itemOutputs(Materials.Charcoal.getGems(1))
             .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
@@ -1462,7 +1457,7 @@ public class MixerRecipes implements Runnable {
             .eut(2)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Fuel.getCells(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Tetranitromethane.getFluid(20))
@@ -1471,7 +1466,7 @@ public class MixerRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.BioDiesel.getCells(1))
             .itemOutputs(Materials.Empty.getCells(1))
             .fluidInputs(Materials.Tetranitromethane.getFluid(40))
@@ -1482,21 +1477,21 @@ public class MixerRecipes implements Runnable {
 
         // CH4O + C4H8 = C5H12O
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Methanol.getCells(1), Materials.Butene.getCells(1))
             .itemOutputs(Materials.MTBEMixture.getCells(1), Materials.Empty.getCells(1))
             .duration(20 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Methanol.getCells(1), Materials.Butane.getCells(1))
             .itemOutputs(Materials.MTBEMixtureAlt.getCells(1), Materials.Empty.getCells(1))
             .duration(20 * TICKS)
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 Materials.Naphtha.getCells(16),
                 Materials.Gas.getCells(2),
@@ -1507,7 +1502,7 @@ public class MixerRecipes implements Runnable {
             .eut(TierEU.RECIPE_HV)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 Materials.GasolineRegular.getCells(20),
                 Materials.Octane.getCells(2),
@@ -1521,46 +1516,40 @@ public class MixerRecipes implements Runnable {
             .addTo(mixerRecipes);
 
         if (Railcraft.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    EnumCube.COKE_BLOCK.getItem(),
-                    ItemList.SFMixture.get(2),
-                    GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(EnumCube.COKE_BLOCK.getItem(), ItemList.SFMixture.get(2), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Block_SSFUEL.get(1))
                 .fluidInputs(Materials.NitroFuel.getFluid(300))
                 .duration(5 * SECONDS)
                 .eut(250)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     EnumCube.COKE_BLOCK.getItem(4),
                     ItemList.SFMixture.get(8),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Block_SSFUEL.get(4))
                 .fluidInputs(Materials.GasolinePremium.getFluid(480))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     EnumCube.COKE_BLOCK.getItem(4),
                     ItemList.SFMixture.get(8),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Block_SSFUEL.get(4))
                 .fluidInputs(Materials.NitroFuel.getFluid(1200))
                 .duration(10 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(
-                    EnumCube.COKE_BLOCK.getItem(),
-                    ItemList.SFMixture.get(2),
-                    GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(EnumCube.COKE_BLOCK.getItem(), ItemList.SFMixture.get(2), GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Block_SSFUEL.get(1))
                 .fluidInputs(Materials.GasolinePremium.getFluid(120))
                 .duration(5 * SECONDS)
@@ -1569,24 +1558,24 @@ public class MixerRecipes implements Runnable {
         }
 
         if (Thaumcraft.isModLoaded() && Railcraft.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     EnumCube.COKE_BLOCK.getItem(),
                     ItemList.MSFMixture.get(2),
                     getModItem(Thaumcraft.ID, "ItemResource", 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                 .fluidInputs(Materials.NitroFuel.getFluid(300))
                 .duration(5 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
                     EnumCube.COKE_BLOCK.getItem(),
                     ItemList.MSFMixture.get(2),
                     getModItem(Thaumcraft.ID, "ItemResource", 4),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(ItemList.Block_MSSFUEL.get(1))
                 .fluidInputs(Materials.GasolinePremium.getFluid(120))
                 .duration(5 * SECONDS)
@@ -1604,24 +1593,24 @@ public class MixerRecipes implements Runnable {
         boolean splashLong = !(FluidRegistry.getFluid("potion." + aName + ".long") == null
             || FluidRegistry.getFluid("potion." + aName + ".long.splash") == null);
 
-        if (splash) GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
+        if (splash) GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion." + aName), 750))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".splash"), 750))
             .duration(10 * SECONDS)
             .eut(24)
             .addTo(mixerRecipes);
 
-        if (splashStrong) GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
+        if (splashStrong) GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".strong"), 750))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".strong.splash"), 750))
             .duration(10 * SECONDS)
             .eut(24)
             .addTo(mixerRecipes);
 
-        if (splashLong) GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
+        if (splashLong) GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".long"), 750))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".long.splash"), 750))
             .duration(10 * SECONDS)
@@ -1630,11 +1619,11 @@ public class MixerRecipes implements Runnable {
     }
 
     public void registerSingleBlockAndMulti() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 Materials.NaquadahEnriched.getDust(8),
                 Materials.Holmium.getDust(2),
-                GT_Utility.getIntegratedCircuit(4))
+                GTUtility.getIntegratedCircuit(4))
             .itemOutputs(Materials.EnrichedHolmium.getDust(10))
             .duration(30 * SECONDS)
             .eut(TierEU.RECIPE_ZPM)
@@ -1642,8 +1631,8 @@ public class MixerRecipes implements Runnable {
 
         // Catalysts for Plasma Forge.
         {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(9))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(9))
                 .fluidInputs(
                     Materials.Helium.getPlasma(1000L),
                     Materials.Iron.getPlasma(1000L),
@@ -1655,8 +1644,8 @@ public class MixerRecipes implements Runnable {
                 .noOptimize()
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(10))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(10))
                 .fluidInputs(
                     MaterialsUEVplus.DimensionallyTranscendentCrudeCatalyst.getFluid(1000L),
                     Materials.Radon.getPlasma(1000L),
@@ -1669,8 +1658,8 @@ public class MixerRecipes implements Runnable {
                 .noOptimize()
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(11))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(11))
                 .fluidInputs(
                     MaterialsUEVplus.DimensionallyTranscendentProsaicCatalyst.getFluid(1000L),
                     Materials.Nitrogen.getPlasma(1000L),
@@ -1683,8 +1672,8 @@ public class MixerRecipes implements Runnable {
                 .noOptimize()
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(12))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(12))
                 .fluidInputs(
                     MaterialsUEVplus.DimensionallyTranscendentResplendentCatalyst.getFluid(1000L),
                     Materials.Americium.getPlasma(1000L),
@@ -1697,8 +1686,8 @@ public class MixerRecipes implements Runnable {
                 .noOptimize()
                 .addTo(mixerRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(GT_Utility.getIntegratedCircuit(13))
+            GTValues.RA.stdBuilder()
+                .itemInputs(GTUtility.getIntegratedCircuit(13))
                 .fluidInputs(
                     MaterialsUEVplus.DimensionallyTranscendentExoticCatalyst.getFluid(1000L),
                     Materials.Lead.getPlasma(1000),
@@ -1712,7 +1701,7 @@ public class MixerRecipes implements Runnable {
                 .addTo(mixerRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Spray_WeedEx.get(1))
             .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(10))
             .fluidOutputs(Materials.WeedEX9000.getFluid(750))
@@ -1720,15 +1709,15 @@ public class MixerRecipes implements Runnable {
             .eut(100)
             .addTo(mixerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 Materials.Tritanium.getDust(11),
-                MyMaterial.orundum.get(OrePrefixes.dust, 8),
+                GGMaterial.orundum.get(OrePrefixes.dust, 8),
                 Materials.Rubidium.getDust(11),
                 Materials.FierySteel.getDust(7),
                 Materials.Firestone.getDust(13),
-                MyMaterial.atomicSeparationCatalyst.get(OrePrefixes.dust, 13),
-                GT_Utility.getIntegratedCircuit(6))
+                GGMaterial.atomicSeparationCatalyst.get(OrePrefixes.dust, 13),
+                GTUtility.getIntegratedCircuit(6))
             .itemOutputs(MaterialsUEVplus.Mellion.getDust(63))
             .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(5000))
             .duration(15 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java b/src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java
index dad2388ae6..27c3004d7b 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java
@@ -7,7 +7,7 @@ import net.minecraft.item.ItemStack;
 
 import codechicken.nei.api.API;
 import gregtech.api.enums.ItemList;
-import gregtech.common.items.GT_MetaGenerated_Item_03;
+import gregtech.common.items.MetaGeneratedItem03;
 
 public class NEIHiding implements Runnable {
 
@@ -18,7 +18,7 @@ public class NEIHiding implements Runnable {
         }
 
         for (int i = 0; i < 16; i++) {
-            API.hideItem(new ItemStack(GT_MetaGenerated_Item_03.INSTANCE, 1, i));
+            API.hideItem(new ItemStack(MetaGeneratedItem03.INSTANCE, 1, i));
         }
 
         if (Forestry.isModLoaded()) {
diff --git a/src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java b/src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java
index f8c816dc5c..4f6ab13116 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java
@@ -1,18 +1,18 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
-import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GTModHandler.getModItem;
 
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class OreDictUnification implements Runnable {
 
     @Override
     public void run() {
         if (HardcoreEnderExpansion.isModLoaded()) {
-            GT_OreDictUnificator.set(
+            GTOreDictUnificator.set(
                 OrePrefixes.ingot,
                 Materials.HeeEndium,
                 getModItem(HardcoreEnderExpansion.ID, "endium_ingot", 1),
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java
index 4ff99582c2..a86266029b 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java
@@ -1,64 +1,64 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class PackagerRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Tool_Matches.get(16L),
-                GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1L))
+                GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1L))
             .itemOutputs(ItemList.Tool_MatchBox_Full.get(1L))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(packagerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Tool_MatchBox_Full.get(1L))
             .itemOutputs(ItemList.Tool_Matches.get(16L))
             .duration(1 * SECONDS + 12 * TICKS)
             .eut(16)
             .addTo(packagerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_Scrap.get(9), ItemList.Schematic_3by3.get(0))
             .itemOutputs(ItemList.IC2_Scrapbox.get(1))
             .duration(16 * TICKS)
             .eut(1)
             .addTo(packagerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Food_Fries.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1))
+                GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1))
             .itemOutputs(ItemList.Food_Packaged_Fries.get(1))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(packagerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Food_PotatoChips.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1))
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1))
             .itemOutputs(ItemList.Food_Packaged_PotatoChips.get(1))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
             .addTo(packagerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Food_ChiliChips.get(1),
-                GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1))
+                GTOreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1))
             .itemOutputs(ItemList.Food_Packaged_ChiliChips.get(1))
             .duration(3 * SECONDS + 4 * TICKS)
             .eut(16)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java
index e648205b7a..ea3c5ff7d1 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java
@@ -4,19 +4,19 @@ import static goodgenerator.loader.Loaders.huiCircuit;
 import static gregtech.api.enums.Mods.Avaritia;
 import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
 import static gregtech.api.recipe.RecipeMaps.plasmaForgeRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
 
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.MaterialsUEVplus;
 import gregtech.api.enums.TierEU;
 import gtPlusPlus.core.item.ModItems;
-import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MaterialsElements;
 import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
 
 public class PlasmaForgeRecipes implements Runnable {
@@ -24,7 +24,7 @@ public class PlasmaForgeRecipes implements Runnable {
     @Override
     public void run() {
         // Giga chad trophy.
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 ItemList.Field_Generator_UEV.get(64),
                 ItemList.Field_Generator_UIV.get(64),
@@ -39,7 +39,7 @@ public class PlasmaForgeRecipes implements Runnable {
             .addTo(plasmaForgeRecipes);
 
         // Quantum anomaly recipe bypass for UEV+. Avoids RNG.
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(
                 new ItemStack(ModItems.itemStandarParticleBase, 1, 24),
                 getModItem(NewHorizonsCoreMod.ID, "item.ChromaticLens", 0),
@@ -54,14 +54,14 @@ public class PlasmaForgeRecipes implements Runnable {
 
         if (Avaritia.isModLoaded()) {
             // Six-Phased Copper
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Avaritia.ID, "Singularity", 8, 5))
                 .fluidInputs(
-                    ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getFluidStack(72 * 144),
-                    ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(4 * 72 * 144),
-                    ELEMENT.STANDALONE.HYPOGEN.getFluidStack(36 * 144),
-                    ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(8 * 72 * 144),
-                    ELEMENT.STANDALONE.RHUGNOR.getFluidStack(18 * 144),
+                    MaterialsElements.STANDALONE.CELESTIAL_TUNGSTEN.getFluidStack(72 * 144),
+                    MaterialsElements.STANDALONE.ASTRAL_TITANIUM.getFluidStack(4 * 72 * 144),
+                    MaterialsElements.STANDALONE.HYPOGEN.getFluidStack(36 * 144),
+                    MaterialsElements.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(8 * 72 * 144),
+                    MaterialsElements.STANDALONE.RHUGNOR.getFluidStack(18 * 144),
                     MaterialsUEVplus.Mellion.getMolten(72 * 144))
                 .fluidOutputs(MaterialsUEVplus.SixPhasedCopper.getMolten(72 * 144L))
                 .duration(60 * SECONDS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java
index e700ee0730..ddf37cd242 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java
@@ -1,32 +1,32 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.printerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
 
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 
 public class PrinterRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1L))
             .itemOutputs(ItemList.Paper_Punch_Card_Empty.get(1L))
             .fluidInputs(getFluidStack("squidink", 36))
             .duration(5 * SECONDS)
             .eut(2)
             .addTo(printerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Paper_Punch_Card_Empty.get(1L))
             .special(ItemList.Tool_DataStick.getWithName(0L, "With Punch Card Data"))
             .itemOutputs(ItemList.Paper_Punch_Card_Encoded.get(1L))
@@ -35,8 +35,8 @@ public class PrinterRecipes implements Runnable {
             .eut(2)
             .addTo(printerRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3L))
             .special(ItemList.Tool_DataStick.getWithName(0L, "With Scanned Book Data"))
             .itemOutputs(ItemList.Paper_Printed_Pages.get(1L))
             .fluidInputs(getFluidStack("squidink", 144))
@@ -44,7 +44,7 @@ public class PrinterRecipes implements Runnable {
             .eut(2)
             .addTo(printerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.map, 1, 32767))
             .special(ItemList.Tool_DataStick.getWithName(0L, "With Scanned Map Data"))
             .itemOutputs(new ItemStack(Items.filled_map, 1, 0))
@@ -53,9 +53,9 @@ public class PrinterRecipes implements Runnable {
             .eut(2)
             .addTo(printerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.book, 1, 32767))
-            .itemOutputs(GT_Utility.getWrittenBook("Manual_Printer", ItemList.Book_Written_01.get(1L)))
+            .itemOutputs(GTUtility.getWrittenBook("Manual_Printer", ItemList.Book_Written_01.get(1L)))
             .fluidInputs(getFluidStack("squidink", 144))
             .duration(20 * SECONDS)
             .eut(2)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java b/src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java
index 75a81448e0..1a9f82cb67 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java
@@ -5,22 +5,22 @@ import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.enums.Mods.Thaumcraft;
 import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
-import static gregtech.api.util.GT_ModHandler.getIC2Item;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTModHandler.getIC2Item;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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.GTOreDictUnificator;
 
 public class Pulverizer implements Runnable {
 
@@ -28,167 +28,167 @@ public class Pulverizer implements Runnable {
     public void run() {
         // recycling Long Distance Pipes
         {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Long_Distance_Pipeline_Fluid.get(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 19))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 19))
                 .duration(15 * SECONDS)
                 .eut(4)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Long_Distance_Pipeline_Item.get(1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 7))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 7))
                 .duration(15 * SECONDS)
                 .eut(4)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(1))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Steel, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Steel, 2))
                 .duration(10 * TICKS)
                 .eut(4)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tin, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Steel, 1))
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tin, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Steel, 1))
                 .duration(10 * TICKS)
                 .eut(4)
                 .addTo(maceratorRecipes);
         }
 
         // marbe dust( stone dust
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.Marble, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Marble, 1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.block, Materials.Marble, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Marble, 1))
             .duration(8 * SECONDS)
             .eut(4)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getModItem(Thaumcraft.ID, "ItemResource", 1, 18))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Gold, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Gold, 1))
             .duration(1 * SECONDS + 1 * TICKS)
             .eut(4)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.reeds, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1))
             .duration(2 * SECONDS + 10 * TICKS)
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Cupronickel.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cupronickel, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 2))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cupronickel, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 2))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Kanthal.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Kanthal, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cupronickel, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 3))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Kanthal, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Cupronickel, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 3))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Nichrome.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nichrome, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Kanthal, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 4))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nichrome, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Kanthal, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 4))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_TungstenSteel.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TPV, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nichrome, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 5))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.TPV, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Nichrome, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 5))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_HSSG.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TPV, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 6))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.TPV, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 6))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_HSSS.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSS, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 7))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.HSSS, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 7))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Naquadah.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSS, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 8))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.HSSS, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 8))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_NaquadahAlloy.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahAlloy, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 9))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahAlloy, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 9))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_Trinium.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Trinium, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahAlloy, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 10))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Trinium, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahAlloy, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 10))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_ElectrumFlux.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Trinium, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 11))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Trinium, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 11))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Casing_Coil_AwakenedDraconium.get(1))
             .itemOutputs(
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DraconiumAwakened, 8),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 1),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 12))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.DraconiumAwakened, 8),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 1),
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 12))
             .duration(1 * MINUTES + 15 * SECONDS)
             .eut(80)
             .addTo(maceratorRecipes);
@@ -197,284 +197,284 @@ public class Pulverizer implements Runnable {
             // recycling RC Tanks
             // Iron
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2))
                 .duration(15 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(15 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 3))
                 .duration(15 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
             // Steel
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2))
                 .duration(15 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 14))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(15 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Steel, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Steel, 3))
                 .duration(15 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
             // Aluminium
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 2))
                 .duration(22 * SECONDS + 10 * TICKS)
                 .eut(8)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(22 * SECONDS + 10 * TICKS)
                 .eut(8)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Aluminium, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Aluminium, 3))
                 .duration(22 * SECONDS + 10 * TICKS)
                 .eut(8)
                 .addTo(maceratorRecipes);
 
             // Stainless Steel
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 2))
                 .duration(30 * SECONDS)
                 .eut(16)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 4))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(30 * SECONDS)
                 .eut(16)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.StainlessSteel, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.StainlessSteel, 3))
                 .duration(30 * SECONDS)
                 .eut(16)
                 .addTo(maceratorRecipes);
 
             // Titanium
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 2))
                 .duration(30 * SECONDS)
                 .eut(30)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 7))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(30 * SECONDS)
                 .eut(30)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Titanium, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Titanium, 3))
                 .duration(30 * SECONDS)
                 .eut(30)
                 .addTo(maceratorRecipes);
 
             // Tungesten Steel
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 2))
                 .duration(30 * SECONDS)
                 .eut(30)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 10))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(30 * SECONDS)
                 .eut(30)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.TungstenSteel, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.TungstenSteel, 3))
                 .duration(30 * SECONDS)
                 .eut(30)
                 .addTo(maceratorRecipes);
 
             // Palladium
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 2))
                 .duration(37 * SECONDS + 10 * TICKS)
                 .eut(64)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 13))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(37 * SECONDS + 10 * TICKS)
                 .eut(64)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NiobiumTitanium, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Chrome, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.NiobiumTitanium, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Chrome, 3))
                 .duration(37 * SECONDS + 10 * TICKS)
                 .eut(64)
                 .addTo(maceratorRecipes);
 
             // Iridium
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 2))
                 .duration(45 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(45 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Enderium, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iridium, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Enderium, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iridium, 3))
                 .duration(45 * SECONDS)
                 .eut(TierEU.RECIPE_MV)
                 .addTo(maceratorRecipes);
 
             // Osmium
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 2))
                 .duration(52 * SECONDS + 10 * TICKS)
                 .eut(256)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 4))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(52 * SECONDS + 10 * TICKS)
                 .eut(256)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Osmium, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Osmium, 3))
                 .duration(52 * SECONDS + 10 * TICKS)
                 .eut(256)
                 .addTo(maceratorRecipes);
 
             // Neutronium
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
-                .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 2))
+                .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 2))
                 .duration(60 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 7))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 1),
-                    GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 1),
+                    GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
                 .duration(60 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 12),
-                    GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Neutronium, 3))
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 12),
+                    GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Neutronium, 3))
                 .duration(60 * SECONDS)
                 .eut(TierEU.RECIPE_HV)
                 .addTo(maceratorRecipes);
         }
 
         if (AppliedEnergistics2.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(AppliedEnergistics2.ID, "tile.BlockSkyStone", 1L, 32767))
                 .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 45))
                 .duration(20 * SECONDS)
                 .eut(2)
                 .addTo(maceratorRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(AppliedEnergistics2.ID, "tile.BlockSkyChest", 1L, 32767))
                 .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 45))
                 .duration(20 * SECONDS)
@@ -482,7 +482,7 @@ public class Pulverizer implements Runnable {
                 .addTo(maceratorRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.blaze_rod, 1))
             .itemOutputs(new ItemStack(Items.blaze_powder, 3), new ItemStack(Items.blaze_powder, 1))
             .outputChances(10000, 5000)
@@ -490,7 +490,7 @@ public class Pulverizer implements Runnable {
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.web, 1, 0))
             .itemOutputs(new ItemStack(Items.string, 1), new ItemStack(Items.string, 1))
             .outputChances(10000, 5000)
@@ -498,90 +498,90 @@ public class Pulverizer implements Runnable {
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.red_mushroom, 1, 32767))
             .itemOutputs(ItemList.IC2_Grin_Powder.get(1L))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.poisonous_potato, 1))
             .itemOutputs(ItemList.IC2_Grin_Powder.get(1L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.spider_eye, 1))
             .itemOutputs(ItemList.IC2_Grin_Powder.get(1L))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.bone, 1))
             .itemOutputs(new ItemStack(Items.dye, 4, 15))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.IC2_EnergyCrystal.get(1))
             .itemOutputs(getIC2Item("energiumDust", 9))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(getIC2Item("biochaff", 1))
             .itemOutputs(new ItemStack(Blocks.dirt, 1))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.quartz_stairs, 1))
-            .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 6))
+            .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 6))
             .duration(15 * SECONDS)
             .eut(TierEU.RECIPE_LV)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.item_frame, 1, 32767))
             .itemOutputs(
                 new ItemStack(Items.leather, 1),
-                GT_OreDictUnificator.getDust(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 4L))
+                GTOreDictUnificator.getDust(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 4L))
             .outputChances(10000, 9500)
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Items.bow, 1, 0))
             .itemOutputs(
                 new ItemStack(Items.string, 3),
-                GT_OreDictUnificator.getDust(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 3))
+                GTOreDictUnificator.getDust(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 3))
             .outputChances(10000, 9500)
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(Materials.Brick.getIngots(1))
             .itemOutputs(Materials.Brick.getDustSmall(1))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.brick_stairs, 1, 0))
             .itemOutputs(Materials.Brick.getDustSmall(6))
             .duration(20 * SECONDS)
             .eut(2)
             .addTo(maceratorRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Machine_Bricked_BlastFurnace.get(1))
             .itemOutputs(Materials.Brick.getDust(8), Materials.Iron.getDust(1))
             .duration(20 * SECONDS)
@@ -589,11 +589,11 @@ public class Pulverizer implements Runnable {
             .addTo(maceratorRecipes);
 
         if (HardcoreEnderExpansion.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(getModItem(HardcoreEnderExpansion.ID, "endium_ore", 1))
                 .itemOutputs(
-                    GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.HeeEndium, 2),
-                    GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1))
+                    GTOreDictUnificator.get(OrePrefixes.crushed, Materials.HeeEndium, 2),
+                    GTOreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1))
                 .outputChances(10000, 5000)
                 .duration(20 * SECONDS)
                 .eut(2)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java
index 51017358b4..6f9f8f234d 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java
@@ -3,19 +3,19 @@ package gregtech.loaders.postload.recipes;
 import static gregtech.api.enums.Mods.Forestry;
 import static gregtech.api.enums.Mods.Railcraft;
 import static gregtech.api.recipe.RecipeMaps.pyrolyseRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.MINUTES;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fluids.FluidStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
 import mods.railcraft.common.items.RailcraftToolItems;
 
@@ -24,20 +24,20 @@ public class PyrolyseRecipes implements Runnable {
     @Override
     public void run() {
         if (Railcraft.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(RailcraftToolItems.getCoalCoke(16))
                 .fluidOutputs(Materials.Creosote.getFluid(8000))
                 .duration(32 * SECONDS)
                 .eut(64)
                 .addTo(pyrolyseRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTOreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16),
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(RailcraftToolItems.getCoalCoke(16))
                 .fluidInputs(Materials.Nitrogen.getGas(1000))
                 .fluidOutputs(Materials.Creosote.getFluid(8000))
@@ -45,20 +45,20 @@ public class PyrolyseRecipes implements Runnable {
                 .eut(96)
                 .addTo(pyrolyseRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 8),
-                    GT_Utility.getIntegratedCircuit(1))
+                    GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 8),
+                    GTUtility.getIntegratedCircuit(1))
                 .itemOutputs(EnumCube.COKE_BLOCK.getItem(8))
                 .fluidOutputs(Materials.Creosote.getFluid(32000))
                 .duration(2 * MINUTES + 8 * SECONDS)
                 .eut(64)
                 .addTo(pyrolyseRecipes);
 
-            GT_Values.RA.stdBuilder()
+            GTValues.RA.stdBuilder()
                 .itemInputs(
-                    GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 8),
-                    GT_Utility.getIntegratedCircuit(2))
+                    GTOreDictUnificator.get(OrePrefixes.block, Materials.Coal, 8),
+                    GTUtility.getIntegratedCircuit(2))
                 .itemOutputs(EnumCube.COKE_BLOCK.getItem(8))
                 .fluidInputs(Materials.Nitrogen.getGas(1000))
                 .fluidOutputs(Materials.Creosote.getFluid(32000))
@@ -68,16 +68,16 @@ public class PyrolyseRecipes implements Runnable {
         }
 
         if (Forestry.isModLoaded()) {
-            GT_Values.RA.stdBuilder()
-                .itemInputs(getModItem(Forestry.ID, "fertilizerBio", 4), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(getModItem(Forestry.ID, "fertilizerBio", 4), GTUtility.getIntegratedCircuit(1))
                 .fluidInputs(Materials.Water.getFluid(4000))
                 .fluidOutputs(Materials.Biomass.getFluid(5000))
                 .duration(45 * SECONDS)
                 .eut(10)
                 .addTo(pyrolyseRecipes);
 
-            GT_Values.RA.stdBuilder()
-                .itemInputs(getModItem(Forestry.ID, "mulch", 32), GT_Utility.getIntegratedCircuit(1))
+            GTValues.RA.stdBuilder()
+                .itemInputs(getModItem(Forestry.ID, "mulch", 32), GTUtility.getIntegratedCircuit(1))
                 .fluidInputs(Materials.Water.getFluid(4000))
                 .fluidOutputs(Materials.Biomass.getFluid(5000))
                 .duration(45 * SECONDS)
@@ -85,48 +85,48 @@ public class PyrolyseRecipes implements Runnable {
                 .addTo(pyrolyseRecipes);
         }
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("biochaff", 4), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("biochaff", 4), GTUtility.getIntegratedCircuit(1))
             .fluidInputs(Materials.Water.getFluid(4000))
             .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 5000))
             .duration(45 * SECONDS)
             .eut(10)
             .addTo(pyrolyseRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_ModHandler.getIC2Item("biochaff", 1), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTModHandler.getIC2Item("biochaff", 1), GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.Water.getFluid(1500))
             .fluidOutputs(Materials.FermentedBiomass.getFluid(1500))
             .duration(10 * SECONDS)
             .eut(10)
             .addTo(pyrolyseRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 1000))
             .fluidOutputs(Materials.FermentedBiomass.getFluid(1000))
             .duration(5 * SECONDS)
             .eut(10)
             .addTo(pyrolyseRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTUtility.getIntegratedCircuit(2))
             .fluidInputs(Materials.Biomass.getFluid(1000))
             .fluidOutputs(Materials.FermentedBiomass.getFluid(1000))
             .duration(5 * SECONDS)
             .eut(10)
             .addTo(pyrolyseRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Sugar.getDust(23), GT_Utility.getIntegratedCircuit(1))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Sugar.getDust(23), GTUtility.getIntegratedCircuit(1))
             .itemOutputs(Materials.Charcoal.getDust(12))
             .fluidOutputs(Materials.Water.getFluid(1500))
             .duration(16 * SECONDS)
             .eut(64)
             .addTo(pyrolyseRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(Materials.Sugar.getDust(23), GT_Utility.getIntegratedCircuit(2))
+        GTValues.RA.stdBuilder()
+            .itemInputs(Materials.Sugar.getDust(23), GTUtility.getIntegratedCircuit(2))
             .itemOutputs(Materials.Charcoal.getDust(12))
             .fluidInputs(Materials.Nitrogen.getGas(500))
             .fluidOutputs(Materials.Water.getFluid(1500))
diff --git a/src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java b/src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java
index 10132ece09..96976d2b9a 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java
@@ -2,7 +2,7 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.ExtraTrees;
 import static gregtech.api.enums.Mods.IndustrialCraft2;
-import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GTModHandler.getModItem;
 
 import java.util.Iterator;
 import java.util.Map;
@@ -11,13 +11,13 @@ 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.GTValues;
 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 gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.api.util.GTUtility;
 import ic2.api.recipe.ILiquidHeatExchangerManager;
 import ic2.api.recipe.Recipes;
 
@@ -25,93 +25,93 @@ public class RecipeRemover implements Runnable {
 
     @Override
     public void run() {
-        GT_ModHandler.removeRecipeByOutput(ItemList.IC2_Fertilizer.get(1L));
+        GTModHandler.removeRecipeByOutput(ItemList.IC2_Fertilizer.get(1L));
         removeCrafting();
         removeSmelting();
         removeIC2Recipes();
     }
 
     public void removeCrafting() {
-        GT_ModHandler.removeRecipe(new ItemStack(Items.lava_bucket), ItemList.Cell_Empty.get(1L));
-        GT_ModHandler.removeRecipe(new ItemStack(Items.water_bucket), ItemList.Cell_Empty.get(1L));
+        GTModHandler.removeRecipe(new ItemStack(Items.lava_bucket), ItemList.Cell_Empty.get(1L));
+        GTModHandler.removeRecipe(new ItemStack(Items.water_bucket), ItemList.Cell_Empty.get(1L));
     }
 
     public void removeIC2Recipes() {
 
         try {
-            GT_Utility.removeSimpleIC2MachineRecipe(
-                GT_Values.NI,
+            GTUtility.removeSimpleIC2MachineRecipe(
+                GTValues.NI,
                 Recipes.metalformerExtruding.getRecipes(),
                 ItemList.Cell_Empty.get(3L));
-            GT_Utility.removeSimpleIC2MachineRecipe(
+            GTUtility.removeSimpleIC2MachineRecipe(
                 ItemList.IC2_Energium_Dust.get(1L),
                 Recipes.compressor.getRecipes(),
-                GT_Values.NI);
-            GT_Utility.removeSimpleIC2MachineRecipe(
+                GTValues.NI);
+            GTUtility.removeSimpleIC2MachineRecipe(
                 new ItemStack(Items.gunpowder),
                 Recipes.extractor.getRecipes(),
-                GT_Values.NI);
-            GT_Utility.removeSimpleIC2MachineRecipe(
+                GTValues.NI);
+            GTUtility.removeSimpleIC2MachineRecipe(
                 new ItemStack(Blocks.wool, 1, 32767),
                 Recipes.extractor.getRecipes(),
-                GT_Values.NI);
-            GT_Utility.removeSimpleIC2MachineRecipe(
+                GTValues.NI);
+            GTUtility.removeSimpleIC2MachineRecipe(
                 new ItemStack(Blocks.gravel),
                 Recipes.oreWashing.getRecipes(),
-                GT_Values.NI);
+                GTValues.NI);
         } catch (Throwable ignored) {}
-        GT_Utility.removeIC2BottleRecipe(
-            GT_ModHandler.getIC2Item("fuelRod", 1),
-            GT_ModHandler.getIC2Item("UranFuel", 1),
+        GTUtility.removeIC2BottleRecipe(
+            GTModHandler.getIC2Item("fuelRod", 1),
+            GTModHandler.getIC2Item("UranFuel", 1),
             Recipes.cannerBottle.getRecipes(),
-            GT_ModHandler.getIC2Item("reactorUraniumSimple", 1, 1));
-        GT_Utility.removeIC2BottleRecipe(
-            GT_ModHandler.getIC2Item("fuelRod", 1),
-            GT_ModHandler.getIC2Item("MOXFuel", 1),
+            GTModHandler.getIC2Item("reactorUraniumSimple", 1, 1));
+        GTUtility.removeIC2BottleRecipe(
+            GTModHandler.getIC2Item("fuelRod", 1),
+            GTModHandler.getIC2Item("MOXFuel", 1),
             Recipes.cannerBottle.getRecipes(),
-            GT_ModHandler.getIC2Item("reactorMOXSimple", 1, 1));
+            GTModHandler.getIC2Item("reactorMOXSimple", 1, 1));
 
-        GT_Utility.removeSimpleIC2MachineRecipe(
+        GTUtility.removeSimpleIC2MachineRecipe(
             new ItemStack(Blocks.cobblestone),
-            GT_ModHandler.getMaceratorRecipeList(),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L));
-        GT_Utility.removeSimpleIC2MachineRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lapis, 1L),
-            GT_ModHandler.getMaceratorRecipeList(),
+            GTModHandler.getMaceratorRecipeList(),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L));
+        GTUtility.removeSimpleIC2MachineRecipe(
+            GTOreDictUnificator.get(OrePrefixes.gem, Materials.Lapis, 1L),
+            GTModHandler.getMaceratorRecipeList(),
             ItemList.IC2_Plantball.get(1L));
-        GT_Utility.removeSimpleIC2MachineRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
-            GT_ModHandler.getMaceratorRecipeList(),
+        GTUtility.removeSimpleIC2MachineRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+            GTModHandler.getMaceratorRecipeList(),
             ItemList.IC2_Plantball.get(1L));
-        GT_Utility.removeSimpleIC2MachineRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
-            GT_ModHandler.getMaceratorRecipeList(),
+        GTUtility.removeSimpleIC2MachineRecipe(
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
+            GTModHandler.getMaceratorRecipeList(),
             ItemList.IC2_Plantball.get(1L));
-        GT_Utility.removeSimpleIC2MachineRecipe(
-            GT_Values.NI,
-            GT_ModHandler.getMaceratorRecipeList(),
+        GTUtility.removeSimpleIC2MachineRecipe(
+            GTValues.NI,
+            GTModHandler.getMaceratorRecipeList(),
             getModItem(IndustrialCraft2.ID, "itemBiochaff", 1L));
 
-        GT_Utility.removeSimpleIC2MachineRecipe(
+        GTUtility.removeSimpleIC2MachineRecipe(
             new ItemStack(Blocks.cactus, 8, 0),
-            GT_ModHandler.getCompressorRecipeList(),
+            GTModHandler.getCompressorRecipeList(),
             getModItem(IndustrialCraft2.ID, "itemFuelPlantBall", 1L));
-        GT_Utility.removeSimpleIC2MachineRecipe(
+        GTUtility.removeSimpleIC2MachineRecipe(
             getModItem(ExtraTrees.ID, "food", 8L, 24),
-            GT_ModHandler.getCompressorRecipeList(),
+            GTModHandler.getCompressorRecipeList(),
             getModItem(IndustrialCraft2.ID, "itemFuelPlantBall", 1L));
 
-        GT_Utility.removeSimpleIC2MachineRecipe(
+        GTUtility.removeSimpleIC2MachineRecipe(
             ItemList.Crop_Drop_BobsYerUncleRanks.get(1L),
-            GT_ModHandler.getExtractorRecipeList(),
+            GTModHandler.getExtractorRecipeList(),
             null);
-        GT_Utility.removeSimpleIC2MachineRecipe(
+        GTUtility.removeSimpleIC2MachineRecipe(
             ItemList.Crop_Drop_Ferru.get(1L),
-            GT_ModHandler.getExtractorRecipeList(),
+            GTModHandler.getExtractorRecipeList(),
             null);
-        GT_Utility.removeSimpleIC2MachineRecipe(
+        GTUtility.removeSimpleIC2MachineRecipe(
             ItemList.Crop_Drop_Aurelia.get(1L),
-            GT_ModHandler.getExtractorRecipeList(),
+            GTModHandler.getExtractorRecipeList(),
             null);
 
         try {
@@ -153,14 +153,12 @@ public class RecipeRemover implements Runnable {
     }
 
     public void removeSmelting() {
-        GT_ModHandler.removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.ore, Materials.Graphite, 1L));
-        GT_ModHandler
-            .removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreBlackgranite, Materials.Graphite, 1L));
-        GT_ModHandler.removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreEndstone, Materials.Graphite, 1L));
-        GT_ModHandler
-            .removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreNetherrack, Materials.Graphite, 1L));
-        GT_ModHandler
-            .removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreRedgranite, Materials.Graphite, 1L));
-        GT_ModHandler.removeFurnaceSmelting(ItemList.IC2_Resin.get(1L));
+        GTModHandler.removeFurnaceSmelting(GTOreDictUnificator.get(OrePrefixes.ore, Materials.Graphite, 1L));
+        GTModHandler
+            .removeFurnaceSmelting(GTOreDictUnificator.get(OrePrefixes.oreBlackgranite, Materials.Graphite, 1L));
+        GTModHandler.removeFurnaceSmelting(GTOreDictUnificator.get(OrePrefixes.oreEndstone, Materials.Graphite, 1L));
+        GTModHandler.removeFurnaceSmelting(GTOreDictUnificator.get(OrePrefixes.oreNetherrack, Materials.Graphite, 1L));
+        GTModHandler.removeFurnaceSmelting(GTOreDictUnificator.get(OrePrefixes.oreRedgranite, Materials.Graphite, 1L));
+        GTModHandler.removeFurnaceSmelting(ItemList.IC2_Resin.get(1L));
     }
 }
diff --git a/src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java
index 3a34cc3536..876164efb0 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java
@@ -3,24 +3,24 @@ package gregtech.loaders.postload.recipes;
 import static gregtech.api.enums.Mods.EnderIO;
 import static gregtech.api.enums.Mods.Forestry;
 import static gregtech.api.recipe.RecipeMaps.sifterRecipes;
-import static gregtech.api.util.GT_ModHandler.getModItem;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GTModHandler.getModItem;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
 
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class SifterRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(new ItemStack(Blocks.gravel, 1, 0))
             .itemOutputs(
                 new ItemStack(Items.flint, 1, 0),
@@ -34,20 +34,20 @@ public class SifterRecipes implements Runnable {
             .eut(16)
             .addTo(sifterRecipes);
 
-        GT_Values.RA.stdBuilder()
-            .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Coal, 1L))
+        GTValues.RA.stdBuilder()
+            .itemInputs(GTOreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Coal, 1L))
             .itemOutputs(
                 new ItemStack(Items.coal, 1, 0),
                 new ItemStack(Items.coal, 1, 0),
                 new ItemStack(Items.coal, 1, 0),
                 new ItemStack(Items.coal, 1, 0),
                 new ItemStack(Items.coal, 1, 0),
-                GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L))
+                GTOreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L))
             .outputChances(10000, 9000, 8000, 7000, 6000, 5000)
             .duration(30 * SECONDS)
             .eut(16)
             .addTo(sifterRecipes);
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.ElectronicsLump.get(1))
             .itemOutputs(
                 ItemList.Electric_Motor_LV.get(1),
diff --git a/src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java
index 73d251014e..08c81a8ecb 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java
@@ -1,38 +1,38 @@
 package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.recipe.RecipeMaps.slicerRecipes;
-import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
-import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GTRecipeBuilder.SECONDS;
+import static gregtech.api.util.GTRecipeBuilder.TICKS;
 
-import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GTValues;
 import gregtech.api.enums.ItemList;
 
 public class SlicerRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Dough_Chocolate.get(1), ItemList.Shape_Slicer_Flat.get(0))
             .itemOutputs(ItemList.Food_Raw_Cookie.get(4))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(slicerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Baked_Bun.get(1), ItemList.Shape_Slicer_Flat.get(0))
             .itemOutputs(ItemList.Food_Sliced_Bun.get(2))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(slicerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Baked_Bread.get(1), ItemList.Shape_Slicer_Flat.get(0))
             .itemOutputs(ItemList.Food_Sliced_Bread.get(2))
             .duration(6 * SECONDS + 8 * TICKS)
             .eut(4)
             .addTo(slicerRecipes);
 
-        GT_Values.RA.stdBuilder()
+        GTValues.RA.stdBuilder()
             .itemInputs(ItemList.Food_Baked_Baguette.get(1), ItemList.Shape_Slicer_Flat.get(0))
             .itemOutputs(ItemList.Food_Sliced_Baguette.get(2))
             .duration(6 * SECONDS + 8 * TICKS)
diff --git a/src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java
index e56cc613e7..57e932b2cc 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java
@@ -7,63 +7,63 @@ import cpw.mods.fml.common.registry.GameRegistry;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
 
 public class SmelterRecipes implements Runnable {
 
     @Override
     public void run() {
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_PotatoChips.get(1L), ItemList.Food_PotatoChips.get(1L));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_PotatoChips.get(1L), ItemList.Food_PotatoChips.get(1L));
 
-        GT_ModHandler
+        GTModHandler
             .addSmeltingRecipe(ItemList.Food_Potato_On_Stick.get(1L), ItemList.Food_Potato_On_Stick_Roasted.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Bun.get(1L), ItemList.Food_Baked_Bun.get(1L));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_Bun.get(1L), ItemList.Food_Baked_Bun.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Bread.get(1L), ItemList.Food_Baked_Bread.get(1L));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_Bread.get(1L), ItemList.Food_Baked_Bread.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Baguette.get(1L), ItemList.Food_Baked_Baguette.get(1L));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_Baguette.get(1L), ItemList.Food_Baked_Baguette.get(1L));
 
-        GT_ModHandler
+        GTModHandler
             .addSmeltingRecipe(ItemList.Food_Raw_Pizza_Veggie.get(1L), ItemList.Food_Baked_Pizza_Veggie.get(1L));
 
-        GT_ModHandler
+        GTModHandler
             .addSmeltingRecipe(ItemList.Food_Raw_Pizza_Cheese.get(1L), ItemList.Food_Baked_Pizza_Cheese.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Pizza_Meat.get(1L), ItemList.Food_Baked_Pizza_Meat.get(1L));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_Pizza_Meat.get(1L), ItemList.Food_Baked_Pizza_Meat.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Baguette.get(1L), ItemList.Food_Baked_Baguette.get(1L));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_Baguette.get(1L), ItemList.Food_Baked_Baguette.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Cake.get(1L), ItemList.Food_Baked_Cake.get(1L));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_Cake.get(1L), ItemList.Food_Baked_Cake.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Cookie.get(1L), new ItemStack(Items.cookie, 1));
+        GTModHandler.addSmeltingRecipe(ItemList.Food_Raw_Cookie.get(1L), new ItemStack(Items.cookie, 1));
 
-        GT_ModHandler.addSmeltingRecipe(new ItemStack(Items.slime_ball, 1), ItemList.IC2_Resin.get(1L));
+        GTModHandler.addSmeltingRecipe(new ItemStack(Items.slime_ball, 1), ItemList.IC2_Resin.get(1L));
 
-        GT_ModHandler.addSmeltingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.ore, Materials.Graphite, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+        GTModHandler.addSmeltingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.ore, Materials.Graphite, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
 
-        GT_ModHandler.addSmeltingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.oreBlackgranite, Materials.Graphite, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+        GTModHandler.addSmeltingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.oreBlackgranite, Materials.Graphite, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
 
-        GT_ModHandler.addSmeltingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.oreEndstone, Materials.Graphite, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+        GTModHandler.addSmeltingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.oreEndstone, Materials.Graphite, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
 
-        GT_ModHandler.addSmeltingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.oreNetherrack, Materials.Graphite, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+        GTModHandler.addSmeltingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.oreNetherrack, Materials.Graphite, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
 
-        GT_ModHandler.addSmeltingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.WroughtIron, 1L));
+        GTModHandler.addSmeltingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L),
+            GTOreDictUnificator.get(OrePrefixes.nugget, Materials.WroughtIron, 1L));
 
-        GT_ModHandler.addSmeltingRecipe(
-            GT_OreDictUnificator.get(OrePrefixes.oreRedgranite, Materials.Graphite, 1L),
-            GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+        GTModHandler.addSmeltingRecipe(
+            GTOreDictUnificator.get(OrePrefixes.oreRedgranite, Materials.Graphite, 1L),
+            GTOreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
 
         GameRegistry.addSmelting(ItemList.CompressedFireclay.get(1), ItemList.Firebrick.get(1), 0);
     }
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java
index 441da5a116..b08e6ed56e 100644
--- a/src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java
+++ b/src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java
@@ -2,7 +2,7 @@ package gregtech.loaders.postload.recipes;
 
 import static gregtech.api.enums.Mods.AppliedEnergistics2;
 import static gregtech.api.enums.Mods.Thaumcraft;
-import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GTModHandler.getModItem;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -10,551 +10,551 @@ import java.util.Collections;
 import net.minecraft.init.Blocks;
 import net.minecraft.item.ItemStack;
 
-import gregtech.api.GregTech_API;
-import gregtech.api.enchants.Enchantment_Hazmat;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enchants.EnchantmentHazmat;
 import gregtech.api.enums.ItemList;
 import gregtech.api.enums.Materials;
 import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TC_Aspects;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_ModHandler;
-import gregtech.api.util.GT_OreDictUnificator;
-import gregtech.loaders.postload.GT_MachineRecipeLoader;
+import gregtech.api.enums.TCAspects;
+import gregtech.api.util.GTLanguageManager;
+import gregtech.api.util.GTModHandler;
+import gregtech.api.util.GTOreDictUnificator;
+import gregtech.loaders.postload.MachineRecipeLoader;
 
 public class ThaumcraftRecipes implements Runnable {
 
     @Override
     public void run() {
-        if ((!Thaumcraft.isModLoaded()) || GregTech_API.sThaumcraftCompat == null) {
+        if ((!Thaumcraft.isModLoaded()) || GregTechAPI.sThaumcraftCompat == null) {
             return;
         }
 
         // Add Recipe for TC Crucible: Salis Mundus to Balanced Shards
         String tKey = "GT_BALANCE_SHARD_RECIPE";
-        GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+        GregTechAPI.sThaumcraftCompat.addCrucibleRecipe(
             "TB.SM",
             getModItem(Thaumcraft.ID, "ItemResource", 1L, 14),
             getModItem(Thaumcraft.ID, "ItemShard", 1L, 6),
             Arrays.asList(
-                new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2L),
-                new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L)));
+                new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 2L),
+                new TCAspects.TC_AspectStack(TCAspects.ORDO, 1L)));
 
         tKey = "GT_WOOD_TO_CHARCOAL";
-        GT_LanguageManager.addStringLocalization(
-            GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+        GTLanguageManager.addStringLocalization(
+            MachineRecipeLoader.aTextTCGTPage + tKey,
             "You have discovered a way of making charcoal magically instead of using regular ovens for this purpose.

To create charcoal from wood you first need an air-free environment, some vacuus essentia is needed for that, then you need to incinerate the wood using ignis essentia and wait until all the water inside the wood is burned away.

This method however doesn't create creosote oil as byproduct."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Charcoal Transmutation", "Turning wood into charcoal", new String[] { "ALUMENTUM" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1L), + GTOreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1L), 2, 0, 13, 5, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 8L)), + new TCAspects.TC_AspectStack(TCAspects.ARBOR, 10L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 8L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 8L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.log.get(Materials.Wood), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1L), + GTOreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))) }); tKey = "GT_FILL_WATER_BUCKET"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way of filling a bucket with aqua essentia in order to simply get water."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Water Transmutation", "Filling buckets with water", null, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Water, 1L), + GTOreDictUnificator.get(OrePrefixes.bucket, Materials.Water, 1L), 2, 0, 16, 5, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 4L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L)), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 4L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, - GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L), - GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Water, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L), + GTOreDictUnificator.get(OrePrefixes.bucket, Materials.Water, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, - GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Empty, 1L), - GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Water, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.bucketClay, Materials.Empty, 1L), + GTOreDictUnificator.get(OrePrefixes.bucketClay, Materials.Water, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, - GT_OreDictUnificator.get(OrePrefixes.capsule, Materials.Empty, 1L), - GT_OreDictUnificator.get(OrePrefixes.capsule, Materials.Water, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.capsule, Materials.Empty, 1L), + GTOreDictUnificator.get(OrePrefixes.capsule, Materials.Water, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L), - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))) }); + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L), + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.AQUA, 4L))) }); tKey = "GT_TRANSZINC"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to multiply zinc by steeping zinc nuggets in metallum harvested from other metals."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Zinc Transmutation", "Transformation of metals into zinc", new String[] { "TRANSTIN" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Zinc, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Zinc, 1L), 2, 1, 9, 13, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Zinc), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Zinc, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Zinc, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.SANO, 1L))) }); tKey = "GT_TRANSANTIMONY"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to multiply antimony by steeping antimony nuggets in metallum harvested from other metals."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Antimony Transmutation", "Transformation of metals into antimony", new String[] { "GT_TRANSZINC", "TRANSLEAD" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Antimony, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Antimony, 1L), 2, 1, 9, 14, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Antimony), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Antimony, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Antimony, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L))) }); tKey = "GT_TRANSNICKEL"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to multiply nickel by steeping nickel nuggets in metallum harvested from other metals."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Nickel Transmutation", "Transformation of metals into nickel", new String[] { "TRANSLEAD" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Nickel, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Nickel, 1L), 2, 1, 9, 15, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Nickel), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Nickel, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Nickel, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))) }); tKey = "GT_TRANSCOBALT"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to multiply cobalt by steeping cobalt nuggets in metallum harvested from other metals."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Cobalt Transmutation", "Transformation of metals into cobalt", new String[] { "GT_TRANSNICKEL" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cobalt, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Cobalt, 1L), 2, 1, 9, 16, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Cobalt), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cobalt, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Cobalt, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1L))) }); tKey = "GT_TRANSBISMUTH"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to multiply bismuth by steeping bismuth nuggets in metallum harvested from other metals."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Bismuth Transmutation", "Transformation of metals into bismuth", new String[] { "GT_TRANSCOBALT" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bismuth, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Bismuth, 1L), 2, 1, 11, 17, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Bismuth), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bismuth, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Bismuth, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1L))) }); tKey = "GT_IRON_TO_STEEL"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way of making Iron harder by just re-ordering its components.

This Method can be used to create a Material called Steel, which is used in many non-Thaumaturgic applications."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Steel Transmutation", "Transforming iron to steel", new String[] { "TRANSIRON", "GT_WOOD_TO_CHARCOAL" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L), 3, 0, 13, 8, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Iron), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L))) }); + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.ORDO, 1L))) }); tKey = "GT_TRANSBRONZE"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way of creating Alloys using the already known transmutations of Copper and Tin.

This Method can be used to create a Bronze directly without having to go through an alloying process."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Bronze Transmutation", "Transformation of metals into bronze", new String[] { "TRANSTIN", "TRANSCOPPER" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bronze, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Bronze, 1L), 2, 0, 13, 11, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Bronze), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bronze, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Bronze, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1L))) }); tKey = "GT_TRANSELECTRUM"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Electrum as well."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Electrum Transmutation", "Transformation of metals into electrum", new String[] { "GT_TRANSBRONZE", "TRANSGOLD", "TRANSSILVER" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Electrum, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Electrum, 1L), 2, 1, 11, 11, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Electrum), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Electrum, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Electrum, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.LUCRUM, 1L))) }); tKey = "GT_TRANSBRASS"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Brass as well."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Brass Transmutation", "Transformation of metals into brass", new String[] { "GT_TRANSBRONZE", "GT_TRANSZINC" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Brass, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Brass, 1L), 2, 1, 11, 12, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Brass), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Brass, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Brass, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 1L))) }); tKey = "GT_TRANSINVAR"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Invar as well."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Invar Transmutation", "Transformation of metals into invar", new String[] { "GT_TRANSBRONZE", "GT_TRANSNICKEL" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Invar, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Invar, 1L), 2, 1, 11, 15, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Invar), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Invar, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Invar, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L))) }); tKey = "GT_TRANSCUPRONICKEL"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Cupronickel as well."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Cupronickel Transmutation", "Transformation of metals into cupronickel", new String[] { "GT_TRANSBRONZE", "GT_TRANSNICKEL" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cupronickel, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Cupronickel, 1L), 2, 1, 11, 16, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Cupronickel), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cupronickel, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Cupronickel, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))) }); tKey = "GT_TRANSBATTERYALLOY"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Battery Alloy as well."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Battery Alloy Transmutation", "Transformation of metals into battery alloy", new String[] { "GT_TRANSBRONZE", "GT_TRANSANTIMONY" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.BatteryAlloy, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.BatteryAlloy, 1L), 2, 1, 11, 13, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.BatteryAlloy), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.BatteryAlloy, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.BatteryAlloy, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 1L))) }); tKey = "GT_TRANSSOLDERINGALLOY"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Soldering Alloy as well."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Soldering Alloy Transmutation", "Transformation of metals into soldering alloy", new String[] { "GT_TRANSBRONZE", "GT_TRANSANTIMONY" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.SolderingAlloy, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.SolderingAlloy, 1L), 2, 1, 11, 14, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.SolderingAlloy), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.SolderingAlloy, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.SolderingAlloy, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.AQUA, 1L), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 1L))) }); tKey = "GT_ADVANCEDMETALLURGY"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Now that you have discovered all the basic metals, you can finally move on to the next Level of magic metallurgy and create more advanced metals"); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Advanced Metallurgic Transmutation", "Mastering the basic metals", new String[] { "GT_TRANSBISMUTH", "GT_IRON_TO_STEEL", "GT_TRANSSOLDERINGALLOY", "GT_TRANSBATTERYALLOY", "GT_TRANSBRASS", "GT_TRANSELECTRUM", "GT_TRANSCUPRONICKEL", "GT_TRANSINVAR" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L), + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L), 3, 0, 16, 14, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 50L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 20L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 50L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 20L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 20L), + new TCAspects.TC_AspectStack(TCAspects.PRAECANTATIO, 20L), + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 20L), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 20L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey }); + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey }); tKey = "GT_TRANSALUMINIUM"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to multiply aluminium by steeping aluminium nuggets in metallum harvested from other metals.

This transmutation is slightly harder to achieve, because aluminium has special properties, which require more order to achieve the desired result."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Aluminium Transmutation", "Transformation of metals into aluminium", new String[] { "GT_ADVANCEDMETALLURGY" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 1L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 1L), 4, 0, 19, 14, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.VOLATUS, 3L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.nugget.get(Materials.Aluminium), - GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 3L), + GTOreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 3L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.VOLATUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 1L), + new TCAspects.TC_AspectStack(TCAspects.IGNIS, 1L))) }); tKey = "GT_TRANSSKYSTONE"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to convert obsidian to skystone.

Not sure why you'd want to do this, unless skystone is somehow unavailable in your world."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Skystone Transmutation", "Transformation of obsidian into skystone", @@ -566,128 +566,128 @@ public class ThaumcraftRecipes implements Runnable { 19, 15, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.VOLATUS, 3L), + new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 3L), + new TCAspects.TC_AspectStack(TCAspects.TERRA, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, new ItemStack(Blocks.obsidian), getModItem(AppliedEnergistics2.ID, "tile.BlockSkyStone", 1), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 2L), + new TCAspects.TC_AspectStack(TCAspects.VOLATUS, 1L), + new TCAspects.TC_AspectStack(TCAspects.TERRA, 1L), + new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 2L), + new TCAspects.TC_AspectStack(TCAspects.TENEBRAE, 1L))) }); tKey = "GT_TRANSMINERAL"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to convert basaltic mineral sand to granitic mineral sand and vice versa.

Handy for people living in the sky who can't access it normally, or if you really want one or the other."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Basaltic Mineral Transmutation", "Transformation of mineral sands", new String[] { "GT_ADVANCEDMETALLURGY" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L), 4, 0, 19, 16, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 3L)), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.VOLATUS, 3L), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 3L), + new TCAspects.TC_AspectStack(TCAspects.TERRA, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 1L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( - tKey, - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 1L), + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 1L), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( + tKey, + GTOreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 1L), Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1L))) }); + new TCAspects.TC_AspectStack(TCAspects.METALLUM, 2L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 1L), + new TCAspects.TC_AspectStack(TCAspects.MAGNETO, 1L))) }); tKey = "GT_CRYSTALLISATION"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Sometimes when processing your Crystal Shards they become a pile of Dust instead of the mostly required Shard.

You have finally found a way to reverse this Process by using Vitreus Essentia for recrystallising the Shards."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Shard Recrystallisation", "Fixing your precious crystals", new String[] { "ALCHEMICALMANUFACTURE" }, "ALCHEMY", - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1L), + GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1L), 3, 0, -11, -3, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 5L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3L)), + new TCAspects.TC_AspectStack(TCAspects.VITREUS, 5L), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 3L), + new TCAspects.TC_AspectStack(TCAspects.ORDO, 3L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.dust.get(Materials.Amber), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Amber, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.gem, Materials.Amber, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.dust.get(Materials.InfusedOrder), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.dust.get(Materials.InfusedEntropy), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEntropy, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEntropy, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.dust.get(Materials.InfusedAir), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedAir, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedAir, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.dust.get(Materials.InfusedEarth), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEarth, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEarth, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.dust.get(Materials.InfusedFire), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedFire, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))), - GregTech_API.sThaumcraftCompat.addCrucibleRecipe( + GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedFire, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L))), + GregTechAPI.sThaumcraftCompat.addCrucibleRecipe( tKey, OrePrefixes.dust.get(Materials.InfusedWater), - GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedWater, 1L), - Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))) }); + GTOreDictUnificator.get(OrePrefixes.gem, Materials.InfusedWater, 1L), + Collections.singletonList(new TCAspects.TC_AspectStack(TCAspects.VITREUS, 4L))) }); tKey = "GT_MAGICENERGY"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "While trying to find new ways to integrate magic into your industrial factories, you have discovered a way to convert magical energy into electrical power."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Magic Energy Conversion", "Magic to Power", @@ -699,33 +699,31 @@ public class ThaumcraftRecipes implements Runnable { -3, 10, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 10L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 10L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 20L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 10L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addInfusionRecipe( - tKey, - ItemList.Hull_LV.get(1L), - new ItemStack[] { new ItemStack(Blocks.beacon), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L), - ItemList.Sensor_MV.get(2L), GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L), - ItemList.Sensor_MV.get(2L) }, - ItemList.MagicEnergyConverter_LV.get(1L), - 5, - Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L))) }); + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, GregTechAPI.sThaumcraftCompat.addInfusionRecipe( + tKey, + ItemList.Hull_LV.get(1L), + new ItemStack[] { new ItemStack(Blocks.beacon), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L), ItemList.Sensor_MV.get(2L), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L), ItemList.Sensor_MV.get(2L) }, + ItemList.MagicEnergyConverter_LV.get(1L), + 5, + Arrays.asList( + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L))) }); tKey = "GT_MAGICENERGY2"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Attempts to increase the output of your Magic Energy generators have resulted in significant improvements."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Adept Magic Energy Conversion", "Magic to Power", @@ -737,33 +735,33 @@ public class ThaumcraftRecipes implements Runnable { -4, 12, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 10L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 10L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 20L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 10L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addInfusionRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addInfusionRecipe( tKey, ItemList.Hull_MV.get(1L), new ItemStack[] { new ItemStack(Blocks.beacon), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Thaumium, 1L), - ItemList.Sensor_HV.get(2L), GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 1L), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), + GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.Thaumium, 1L), + ItemList.Sensor_HV.get(2L), GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), + GTOreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 1L), ItemList.Sensor_HV.get(2L) }, ItemList.MagicEnergyConverter_MV.get(1L), 6, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L))) }); + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L))) }); tKey = "GT_MAGICENERGY3"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Attempts to further increase the output of your Magic Energy generators have resulted in great improvements."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Master Magic Energy Conversion", "Magic to Power", @@ -775,34 +773,32 @@ public class ThaumcraftRecipes implements Runnable { -4, 14, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 40L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 20L)), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 20L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 20L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 40L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 20L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addInfusionRecipe( - tKey, - ItemList.Hull_HV.get(1L), - new ItemStack[] { new ItemStack(Blocks.beacon), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Thaumium, 1L), - ItemList.Field_Generator_MV.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Titanium, 1L), - ItemList.Field_Generator_MV.get(1L) }, - ItemList.MagicEnergyConverter_HV.get(1L), - 8, - Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L))) }); + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, GregTechAPI.sThaumcraftCompat.addInfusionRecipe( + tKey, + ItemList.Hull_HV.get(1L), + new ItemStack[] { new ItemStack(Blocks.beacon), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), + GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Thaumium, 1L), + ItemList.Field_Generator_MV.get(1L), GTOreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), + GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Titanium, 1L), + ItemList.Field_Generator_MV.get(1L) }, + ItemList.MagicEnergyConverter_HV.get(1L), + 8, + Arrays.asList( + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 128L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L))) }); tKey = "GT_MAGICABSORB"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "Research into magical energy conversion methods has identified a way to convert surrounding energies into electrical power."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Magic Energy Absorption", "Harvesting Magic", @@ -814,33 +810,31 @@ public class ThaumcraftRecipes implements Runnable { -2, 12, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 10L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 10L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 20L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 10L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addInfusionRecipe( - tKey, - ItemList.Hull_LV.get(1L), - new ItemStack[] { ItemList.MagicEnergyConverter_LV.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L), - ItemList.Sensor_MV.get(2L) }, - ItemList.MagicEnergyAbsorber_LV.get(1L), - 6, - Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 4L))) }); + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, GregTechAPI.sThaumcraftCompat.addInfusionRecipe( + tKey, + ItemList.Hull_LV.get(1L), + new ItemStack[] { ItemList.MagicEnergyConverter_LV.get(1L), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.MV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L), ItemList.Sensor_MV.get(2L) }, + ItemList.MagicEnergyAbsorber_LV.get(1L), + 6, + Arrays.asList( + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 32L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 32L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 16L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 4L))) }); tKey = "GT_MAGICABSORB2"; - GT_LanguageManager - .addStringLocalization(GT_MachineRecipeLoader.aTextTCGTPage + tKey, "Moar output! Drain all the Magic!"); - GregTech_API.sThaumcraftCompat.addResearch( + GTLanguageManager + .addStringLocalization(MachineRecipeLoader.aTextTCGTPage + tKey, "Moar output! Drain all the Magic!"); + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Improved Magic Energy Absorption", "Harvesting Magic", @@ -852,109 +846,109 @@ public class ThaumcraftRecipes implements Runnable { -2, 14, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L), - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 10L), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 10L), + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 20L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 10L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addInfusionRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addInfusionRecipe( tKey, ItemList.Hull_MV.get(1L), new ItemStack[] { ItemList.MagicEnergyConverter_MV.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L), ItemList.Sensor_HV.get(2L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L) }, + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L), ItemList.Sensor_HV.get(2L), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.HV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L) }, ItemList.MagicEnergyAbsorber_MV.get(1L), 6, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 8L))), - GregTech_API.sThaumcraftCompat.addInfusionRecipe( + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 64L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 32L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 64L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 32L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 8L))), + GregTechAPI.sThaumcraftCompat.addInfusionRecipe( tKey, ItemList.Hull_HV.get(1L), new ItemStack[] { ItemList.MagicEnergyConverter_MV.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), ItemList.Field_Generator_MV.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), }, + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.EV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), }, ItemList.MagicEnergyAbsorber_HV.get(1L), 8, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 64L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 16L))), - GregTech_API.sThaumcraftCompat.addInfusionRecipe( + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 128L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 64L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 128L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 64L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 16L))), + GregTechAPI.sThaumcraftCompat.addInfusionRecipe( tKey, ItemList.Hull_EV.get(1L), new ItemStack[] { ItemList.MagicEnergyConverter_HV.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.IV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 1), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.IV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 1), ItemList.Field_Generator_HV.get(1L), - GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.IV, 1L), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 1), }, + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.IV, 1L), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 1), }, ItemList.MagicEnergyAbsorber_EV.get(1L), 10, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 128L), - new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 256L), - new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 64L))) }); + new TCAspects.TC_AspectStack(TCAspects.POTENTIA, 256L), + new TCAspects.TC_AspectStack(TCAspects.ELECTRUM, 128L), + new TCAspects.TC_AspectStack(TCAspects.MACHINA, 256L), + new TCAspects.TC_AspectStack(TCAspects.VACUOS, 128L), + new TCAspects.TC_AspectStack(TCAspects.INSTRUMENTUM, 256L), + new TCAspects.TC_AspectStack(TCAspects.STRONTIO, 64L))) }); tKey = "GT_HAZMATENCH"; - GT_LanguageManager.addStringLocalization( - GT_MachineRecipeLoader.aTextTCGTPage + tKey, + GTLanguageManager.addStringLocalization( + MachineRecipeLoader.aTextTCGTPage + tKey, "You have discovered a way to magically enchant a mundane piece of armor with the protective properties of a Hazmat suite."); - GregTech_API.sThaumcraftCompat.addResearch( + GregTechAPI.sThaumcraftCompat.addResearch( tKey, "Hazmat Protection", "Magical protection from physical hazards", new String[] { "INFUSIONENCHANTMENT" }, "ARTIFICE", - GT_ModHandler.getIC2Item("hazmatChestplate", 1), + GTModHandler.getIC2Item("hazmatChestplate", 1), 4, 0, -7, 13, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.VITIUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)), + new TCAspects.TC_AspectStack(TCAspects.VITIUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 1L), + new TCAspects.TC_AspectStack(TCAspects.RADIO, 1L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 1L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 1L)), null, - new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey, - GregTech_API.sThaumcraftCompat.addInfusionEnchantmentRecipe( + new Object[] { MachineRecipeLoader.aTextTCGTPage + tKey, + GregTechAPI.sThaumcraftCompat.addInfusionEnchantmentRecipe( tKey, - Enchantment_Hazmat.INSTANCE, + EnchantmentHazmat.INSTANCE, 5, Arrays.asList( - new TC_Aspects.TC_AspectStack(TC_Aspects.VITIUM, 8L), - new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 16L), - new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 32L), - new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 16L)), + new TCAspects.TC_AspectStack(TCAspects.VITIUM, 8L), + new TCAspects.TC_AspectStack(TCAspects.GELUM, 16L), + new TCAspects.TC_AspectStack(TCAspects.RADIO, 16L), + new TCAspects.TC_AspectStack(TCAspects.TUTAMEN, 32L), + new TCAspects.TC_AspectStack(TCAspects.VENENUM, 16L)), new ItemStack[] { getModItem(Thaumcraft.ID, "ItemResource", 1L, 14), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 1), - GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 1), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 1), + GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 1), getModItem(Thaumcraft.ID, "ItemResource", 1L, 14), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1), - GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 1), - GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 1) }) }); + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1), + GTOreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 1), + GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 1) }) }); } } diff --git a/src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java index 8e06eec1e0..41aa5341d1 100644 --- a/src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java +++ b/src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java @@ -1,119 +1,119 @@ package gregtech.loaders.postload.recipes; import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes; -import static gregtech.api.util.GT_ModHandler.getIC2Item; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; +import static gregtech.api.util.GTModHandler.getIC2Item; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; 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.GTOreDictUnificator; public class ThermalCentrifugeRecipes implements Runnable { @Override public void run() { - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.SunnariumCell.get(1)) .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 1), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 1), new ItemStack(Items.glowstone_dust, 2), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1)) + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); // Recipes from the old ic2 recipe maps - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(getIC2Item("reactorDepletedMOXSimple", 1)) .itemOutputs( getIC2Item("smallPlutonium", 1), getIC2Item("Plutonium", 3), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1)) + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(getIC2Item("reactorDepletedMOXDual", 1)) .itemOutputs( getIC2Item("smallPlutonium", 2), getIC2Item("Plutonium", 6), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3)) + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(getIC2Item("reactorDepletedMOXQuad", 1)) .itemOutputs( getIC2Item("smallPlutonium", 4), getIC2Item("Plutonium", 12), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 6)) + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 6)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(getIC2Item("reactorDepletedUraniumSimple", 1)) .itemOutputs( getIC2Item("smallPlutonium", 1), getIC2Item("Uran238", 4), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1)) + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(getIC2Item("reactorDepletedUraniumDual", 1)) .itemOutputs( getIC2Item("smallPlutonium", 2), getIC2Item("Uran238", 8), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3)) + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(getIC2Item("reactorDepletedUraniumQuad", 1)) .itemOutputs( getIC2Item("smallPlutonium", 4), getIC2Item("Uran238", 16), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 6)) + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 6)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(getIC2Item("RTGPellets", 1)) - .itemOutputs(getIC2Item("Plutonium", 3), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 54)) + .itemOutputs(getIC2Item("Plutonium", 3), GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 54)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 2)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 2)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 1)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 4)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 4)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(new ItemStack(Blocks.cobblestone, 1)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1)) .duration(25 * SECONDS) .eut(TierEU.RECIPE_LV) .addTo(thermalCentrifugeRecipes); diff --git a/src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java index b1cd1b76f3..07e6f0c4b1 100644 --- a/src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java +++ b/src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java @@ -4,12 +4,12 @@ import static gregtech.api.recipe.RecipeMaps.transcendentPlasmaMixerRecipes; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; 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; +import gregtech.api.util.GTUtility; +import gtPlusPlus.core.material.MaterialsElements; public class TranscendentPlasmaMixerRecipes implements Runnable { @@ -24,8 +24,8 @@ public class TranscendentPlasmaMixerRecipes implements Runnable { @Override public void run() { - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(1)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(1)) .fluidInputs( Materials.Helium.getPlasma(1000), Materials.Iron.getPlasma(1000), @@ -37,8 +37,8 @@ public class TranscendentPlasmaMixerRecipes implements Runnable { .noOptimize() .addTo(transcendentPlasmaMixerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(2)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(2)) .fluidInputs( Materials.Helium.getPlasma(1000), Materials.Iron.getPlasma(1000), @@ -54,8 +54,8 @@ public class TranscendentPlasmaMixerRecipes implements Runnable { .noOptimize() .addTo(transcendentPlasmaMixerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(3)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(3)) .fluidInputs( Materials.Helium.getPlasma(1000), Materials.Iron.getPlasma(1000), @@ -75,8 +75,8 @@ public class TranscendentPlasmaMixerRecipes implements Runnable { .noOptimize() .addTo(transcendentPlasmaMixerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(4)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(4)) .fluidInputs( Materials.Helium.getPlasma(1000), Materials.Iron.getPlasma(1000), @@ -100,8 +100,8 @@ public class TranscendentPlasmaMixerRecipes implements Runnable { .noOptimize() .addTo(transcendentPlasmaMixerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(5)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(5)) .fluidInputs( Materials.Helium.getPlasma(1000), Materials.Iron.getPlasma(1000), @@ -129,8 +129,8 @@ public class TranscendentPlasmaMixerRecipes implements Runnable { .noOptimize() .addTo(transcendentPlasmaMixerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(24)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(24)) .fluidInputs( MaterialsUEVplus.RawStarMatter.getFluid(1000L), MaterialsUEVplus.SpaceTime.getMolten(1000L), @@ -142,12 +142,12 @@ public class TranscendentPlasmaMixerRecipes implements Runnable { .noOptimize() .addTo(transcendentPlasmaMixerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_Utility.getIntegratedCircuit(24)) + GTValues.RA.stdBuilder() + .itemInputs(GTUtility.getIntegratedCircuit(24)) .fluidInputs( - new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 1000), + new FluidStack(MaterialsElements.getInstance().FERMIUM.getPlasma(), 1000), Materials.Thorium.getPlasma(1000L), - new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 1000), + new FluidStack(MaterialsElements.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 1000), Materials.Calcium.getPlasma(1000L), MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1000L)) .fluidOutputs(MaterialsUEVplus.Creon.getPlasma(5000L)) diff --git a/src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java index a5150948ce..89e213c31b 100644 --- a/src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java +++ b/src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java @@ -1,22 +1,22 @@ package gregtech.loaders.postload.recipes; import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes; -import static gregtech.api.util.GT_RecipeBuilder.HOURS; -import static gregtech.api.util.GT_RecipeBuilder.MINUTES; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; +import static gregtech.api.util.GTRecipeBuilder.HOURS; +import static gregtech.api.util.GTRecipeBuilder.MINUTES; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; 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.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; public class VacuumFreezerRecipes implements Runnable { @@ -26,30 +26,30 @@ public class VacuumFreezerRecipes implements Runnable { { // reactor heat switch { - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitch", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitch", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorHeatSwitch", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorHeatSwitch", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitchCore", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitchCore", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorHeatSwitchCore", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorHeatSwitchCore", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitchSpread", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitchSpread", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorHeatSwitchSpread", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorHeatSwitchSpread", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitchDiamond", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitchDiamond", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorHeatSwitchDiamond", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorHeatSwitchDiamond", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); @@ -57,39 +57,39 @@ public class VacuumFreezerRecipes implements Runnable { // reactor vent { - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorVent", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorVent", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorVent", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorVent", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorVentCore", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorVentCore", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorVentCore", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorVentCore", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorVentGold", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorVentGold", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorVentGold", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorVentGold", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorVentDiamond", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorVentDiamond", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorVentDiamond", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorVentDiamond", 1L, 1)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); } // reactor vent spread - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorVentSpread", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorVentSpread", 1L, 0)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorVentSpread", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorVentSpread", 1L, 0)) .duration(5 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); @@ -97,98 +97,98 @@ public class VacuumFreezerRecipes implements Runnable { // reactor coolant { - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorCoolantSimple", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorCoolantSimple", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorCoolantSimple", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorCoolantSimple", 1L, 1)) .duration(10 * TICKS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorCoolantTriple", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorCoolantTriple", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorCoolantTriple", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorCoolantTriple", 1L, 1)) .duration(1 * SECONDS + 10 * TICKS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("reactorCoolantSix", 1L, 32767)) - .itemOutputs(GT_ModHandler.getIC2Item("reactorCoolantSix", 1L, 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("reactorCoolantSix", 1L, 32767)) + .itemOutputs(GTModHandler.getIC2Item("reactorCoolantSix", 1L, 1)) .duration(3 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_He_1.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_He_1.get(1L)) .duration(3 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_He_3.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_He_3.get(1L)) .duration(9 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_He_6.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_He_6.get(1L)) .duration(18 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_NaK_1.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_NaK_1.get(1L)) .duration(3 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_NaK_3.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_NaK_3.get(1L)) .duration(9 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_NaK_6.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_NaK_6.get(1L)) .duration(18 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.neutroniumHeatCapacitor.getWildcard(1L)) .itemOutputs(ItemList.neutroniumHeatCapacitor.get(1L)) .duration(13 * HOURS + 53 * MINUTES + 20 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_1.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_1.get(1L)) .duration(9 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_2.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_2.get(1L)) .duration(18 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_3.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_3.get(1L)) .duration(27 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_6.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_6.get(1L)) .duration(54 * SECONDS) @@ -200,56 +200,56 @@ public class VacuumFreezerRecipes implements Runnable { // fluid vacuum { - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ice, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Ice, 1L)) .duration(2 * SECONDS + 10 * TICKS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidOxygen, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.LiquidOxygen, 1L)) .duration(1 * MINUTES) .eut(TierEU.RECIPE_HV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidNitrogen, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.LiquidNitrogen, 1L)) .duration(1 * MINUTES) .eut(TierEU.RECIPE_HV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_ModHandler.getIC2Item("airCell", 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidAir, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTModHandler.getIC2Item("airCell", 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.LiquidAir, 1L)) .duration(1 * SECONDS + 8 * TICKS) .eut(TierEU.RECIPE_HV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_1.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_1.get(1L)) .duration(1 * MINUTES + 30 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_2.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_2.get(1L)) .duration(3 * MINUTES) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_3.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_3.get(1L)) .duration(4 * MINUTES + 30 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs(ItemList.Reactor_Coolant_Sp_6.getWildcard(1L)) .itemOutputs(ItemList.Reactor_Coolant_Sp_6.get(1L)) .duration(9 * MINUTES) @@ -259,44 +259,44 @@ public class VacuumFreezerRecipes implements Runnable { // Freeze superconductors. { - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Pentacadmiummagnesiumhexaoxid, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Pentacadmiummagnesiumhexaoxid, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.Pentacadmiummagnesiumhexaoxid, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Pentacadmiummagnesiumhexaoxid, 1L)) .duration(10 * SECONDS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs( - GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Titaniumonabariumdecacoppereikosaoxid, 1L)) + GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.Titaniumonabariumdecacoppereikosaoxid, 1L)) .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titaniumonabariumdecacoppereikosaoxid, 1L)) + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Titaniumonabariumdecacoppereikosaoxid, 1L)) .duration(10 * SECONDS) .eut(TierEU.RECIPE_HV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Uraniumtriplatinid, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Uraniumtriplatinid, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.Uraniumtriplatinid, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Uraniumtriplatinid, 1L)) .duration(10 * SECONDS) .eut(TierEU.RECIPE_EV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Vanadiumtriindinid, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Vanadiumtriindinid, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.Vanadiumtriindinid, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Vanadiumtriindinid, 1L)) .duration(10 * SECONDS) .eut(TierEU.RECIPE_IV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs( - GT_OreDictUnificator.get( + GTOreDictUnificator.get( OrePrefixes.ingotHot, Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid, 1L)) .itemOutputs( - GT_OreDictUnificator.get( + GTOreDictUnificator.get( OrePrefixes.ingot, Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid, 1L)) @@ -304,51 +304,51 @@ public class VacuumFreezerRecipes implements Runnable { .eut(TierEU.RECIPE_LuV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs( - GT_OreDictUnificator + GTOreDictUnificator .get(OrePrefixes.ingotHot, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 1L)) .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 1L)) + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 1L)) .duration(20 * SECONDS) .eut(TierEU.RECIPE_ZPM) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs( - GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Longasssuperconductornameforuvwire, 1L)) + GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.Longasssuperconductornameforuvwire, 1L)) .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Longasssuperconductornameforuvwire, 1L)) + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Longasssuperconductornameforuvwire, 1L)) .duration(40 * SECONDS) .eut(TierEU.RECIPE_UV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .itemInputs( - GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Longasssuperconductornameforuhvwire, 1L)) + GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.Longasssuperconductornameforuhvwire, 1L)) .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Longasssuperconductornameforuhvwire, 1L)) + GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Longasssuperconductornameforuhvwire, 1L)) .duration(1 * MINUTES + 20 * SECONDS) .eut(TierEU.RECIPE_UHV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUEVBase, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUEVBase, 1L)) .duration(2 * MINUTES + 40 * SECONDS) .eut(TierEU.RECIPE_UEV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUIVBase, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUIVBase, 1L)) .duration(2 * MINUTES + 40 * SECONDS) .eut(TierEU.RECIPE_UIV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUMVBase, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUMVBase, 1L)) .duration(2 * MINUTES + 40 * SECONDS) .eut(TierEU.RECIPE_UMV) .addTo(vacuumFreezerRecipes); @@ -356,42 +356,42 @@ public class VacuumFreezerRecipes implements Runnable { // Plasma Freezing { - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Americium, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Americium, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Americium, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cellMolten, Materials.Americium, 1L)) .duration(1 * SECONDS) .eut(TierEU.RECIPE_LuV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Helium, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Helium, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Helium, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Helium, 1L)) .duration(5 * TICKS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Nitrogen, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Nitrogen, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L)) .duration(1 * SECONDS + 8 * TICKS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Oxygen, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Oxygen, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L)) .duration(1 * SECONDS + 12 * TICKS) .eut(TierEU.RECIPE_MV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Radon, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Radon, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Radon, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.cell, Materials.Radon, 1L)) .duration(5 * SECONDS + 10 * TICKS) .eut(TierEU.RECIPE_HV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() + GTValues.RA.stdBuilder() .fluidInputs(Materials.Boron.getPlasma(144L)) .fluidOutputs(Materials.Boron.getMolten(144L)) .duration(1 * SECONDS) @@ -400,9 +400,9 @@ public class VacuumFreezerRecipes implements Runnable { } // hot transcendent metal ingot cooling - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.TranscendentMetal, 1L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, MaterialsUEVplus.TranscendentMetal, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.TranscendentMetal, 1L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, MaterialsUEVplus.TranscendentMetal, 1L)) .fluidInputs( new FluidStack(FluidRegistry.getFluid("molten.titansteel"), 144), Materials.SuperCoolant.getFluid(1000)) @@ -410,10 +410,10 @@ public class VacuumFreezerRecipes implements Runnable { .eut(TierEU.RECIPE_UIV) .addTo(vacuumFreezerRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.Mellion, 9L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.Mellion, 9L)) .fluidInputs(MaterialsUEVplus.Creon.getPlasma(1296L)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, MaterialsUEVplus.Mellion, 9L)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.ingot, MaterialsUEVplus.Mellion, 9L)) .fluidOutputs(MaterialsUEVplus.Creon.getMolten(1296L)) .duration(40 * SECONDS) .eut(TierEU.RECIPE_UMV) diff --git a/src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java index b91163619b..76fea74bdc 100644 --- a/src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java +++ b/src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java @@ -1,19 +1,19 @@ package gregtech.loaders.postload.recipes; import static gregtech.api.recipe.RecipeMaps.wiremillRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeRegistrator.registerWiremillRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeRegistrator.registerWiremillRecipes; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; -import gregtech.api.enums.GT_Values; +import gregtech.api.enums.GTValues; 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.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; public class WiremillRecipes implements Runnable { @@ -24,16 +24,16 @@ public class WiremillRecipes implements Runnable { registerWiremillRecipes(MaterialsUEVplus.SpaceTime, 20 * SECONDS, (int) TierEU.RECIPE_LuV); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Polycaprolactam, 1L)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.ingot, Materials.Polycaprolactam, 1L)) .itemOutputs(new ItemStack(Items.string, 32)) .duration(4 * SECONDS) .eut(48) .addTo(wiremillRecipes); - GT_Values.RA.stdBuilder() - .itemInputs(GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Steel, 1)) - .itemOutputs(GT_ModHandler.getIC2Item("miningPipe", 1)) + GTValues.RA.stdBuilder() + .itemInputs(GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Steel, 1)) + .itemOutputs(GTModHandler.getIC2Item("miningPipe", 1)) .duration(10 * SECONDS) .eut(16) .addTo(wiremillRecipes); diff --git a/src/main/java/gregtech/loaders/preload/GTPreLoad.java b/src/main/java/gregtech/loaders/preload/GTPreLoad.java new file mode 100644 index 0000000000..f0eb4c6d8c --- /dev/null +++ b/src/main/java/gregtech/loaders/preload/GTPreLoad.java @@ -0,0 +1,654 @@ +package gregtech.loaders.preload; + +import static gregtech.GTMod.GT_FML_LOGGER; +import static gregtech.api.enums.Mods.CraftTweaker; +import static gregtech.api.enums.Mods.GalacticraftCore; +import static gregtech.api.enums.Mods.GregTech; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.PrintStream; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.launchwrapper.Launch; +import net.minecraftforge.common.config.Configuration; + +import org.apache.commons.lang3.StringUtils; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.LoadController; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.discovery.ASMDataTable; +import cpw.mods.fml.common.discovery.ModDiscoverer; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.recipe.RecipeCategory; +import gregtech.api.recipe.RecipeCategoryHolder; +import gregtech.api.recipe.RecipeCategorySetting; +import gregtech.api.util.GTConfig; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTRecipeBuilder; +import gregtech.api.util.GTUtility; +import gregtech.common.GTProxy; +import gregtech.common.config.client.ConfigColorModulation; +import gregtech.common.config.client.ConfigInterface; +import gregtech.common.config.client.ConfigRender; +import gregtech.common.config.client.ConfigWaila; +import gregtech.common.config.gregtech.ConfigDebug; +import gregtech.common.config.gregtech.ConfigFeatures; +import gregtech.common.config.gregtech.ConfigGeneral; +import gregtech.common.config.gregtech.ConfigMachines; +import gregtech.common.config.gregtech.ConfigOreDropBehavior; +import gregtech.common.config.gregtech.ConfigPollution; +import gregtech.common.tileentities.machines.long_distance.MTELongDistancePipelineBase; +import gregtech.common.tileentities.machines.multi.MTECleanroom; + +public class GTPreLoad { + + public static void sortToTheEnd() { + try { + GT_FML_LOGGER.info("GTMod: Sorting GregTech to the end of the Mod List for further processing."); + LoadController tLoadController = (LoadController) GTUtility + .getFieldContent(Loader.instance(), "modController", true, true); + assert tLoadController != null; + List tModList = tLoadController.getActiveModList(); + List tNewModsList = new ArrayList<>(); + ModContainer tGregTech = null; + short tModList_sS = (short) tModList.size(); + for (short i = 0; i < tModList_sS; i = (short) (i + 1)) { + ModContainer tMod = tModList.get(i); + if (tMod.getModId() + .equalsIgnoreCase(GregTech.ID)) { + tGregTech = tMod; + } else { + tNewModsList.add(tMod); + } + } + if (tGregTech != null) { + tNewModsList.add(tGregTech); + } + Objects.requireNonNull(GTUtility.getField(tLoadController, "activeModList", true, true)) + .set(tLoadController, tNewModsList); + } catch (Throwable e) { + GTMod.logStackTrace(e); + } + } + + public static void initLocalization(File languageDir) { + GT_FML_LOGGER.info("GTMod: Generating Lang-File"); + + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isClient()) { + String userLang = Minecraft.getMinecraft() + .getLanguageManager() + .getCurrentLanguage() + .getLanguageCode(); + GT_FML_LOGGER.info("User lang is " + userLang); + if (userLang.equals("en_US")) { + GT_FML_LOGGER.info("Loading GregTech.lang"); + GTLanguageManager.isEN_US = true; + GTLanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang")); + } else { + String l10nFileName = "GregTech_" + userLang + ".lang"; + File l10nFile = new File(languageDir, l10nFileName); + if (l10nFile.isFile()) { + GT_FML_LOGGER.info("Loading l10n file: " + l10nFileName); + GTLanguageManager.sEnglishFile = new Configuration(l10nFile); + } else { + GT_FML_LOGGER.info("Cannot find l10n file " + l10nFileName + ", fallback to GregTech.lang"); + GTLanguageManager.isEN_US = true; + GTLanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang")); + } + } + } else { + GTLanguageManager.isEN_US = true; + GTLanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang")); + } + GTLanguageManager.sEnglishFile.load(); + + Materials.getMaterialsMap() + .values() + .parallelStream() + .filter(Objects::nonNull) + .forEach( + aMaterial -> aMaterial.mLocalizedName = GTLanguageManager + .addStringLocalization("Material." + aMaterial.mName.toLowerCase(), aMaterial.mDefaultLocalName)); + } + + public static void getConfiguration(File configDir) { + File tFile = new File(new File(configDir, "GregTech"), "IDs.cfg"); + GTConfig.sConfigFileIDs = new Configuration(tFile); + GTConfig.sConfigFileIDs.load(); + GTConfig.sConfigFileIDs.save(); + + tFile = new File(new File(configDir, "GregTech"), "Cleanroom.cfg"); + GTConfig.cleanroomFile = new Configuration(tFile); + GTConfig.cleanroomFile.load(); + GTConfig.cleanroomFile.save(); + + tFile = new File(new File(configDir, "GregTech"), "UndergroundFluids.cfg"); + GTConfig.undergroundFluidsFile = new Configuration(tFile); + GTConfig.undergroundFluidsFile.load(); + GTConfig.undergroundFluidsFile.save(); + + GregTechAPI.NEIClientFIle = new GTConfig( + new Configuration(new File(new File(configDir, "GregTech"), "NEIClient.cfg"))); + + } + + public static void createLogFiles(File parentFile) { + GTLog.mLogFile = new File(parentFile, "logs/GregTech.log"); + if (!GTLog.mLogFile.exists()) { + try { + GTLog.mLogFile.createNewFile(); + } catch (Throwable ignored) {} + } + try { + GTLog.out = GTLog.err = new PrintStream(GTLog.mLogFile); + } catch (FileNotFoundException ignored) {} + + if (ConfigGeneral.loggingOreDict) { + GTLog.mOreDictLogFile = new File(parentFile, "logs/OreDict.log"); + if (!GTLog.mOreDictLogFile.exists()) { + try { + GTLog.mOreDictLogFile.createNewFile(); + } catch (Throwable ignored) {} + } + List tList = ((GTLog.LogBuffer) GTLog.ore).mBufferedOreDictLog; + try { + GTLog.ore = new PrintStream(GTLog.mOreDictLogFile); + } catch (Throwable ignored) {} + GTLog.ore.println("******************************************************************************"); + GTLog.ore.println("* This is the complete log of the GT5-Unofficial OreDictionary Handler. It *"); + GTLog.ore.println("* processes all OreDictionary entries and can sometimes cause errors. All *"); + GTLog.ore.println("* entries and errors are being logged. If you see an error please raise an *"); + GTLog.ore.println("* issue at https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues. *"); + GTLog.ore.println("******************************************************************************"); + tList.forEach(GTLog.ore::println); + } + if (ConfigGeneral.loggingExplosions) { + GTLog.mExplosionLog = new File(parentFile, "logs/Explosion.log"); + if (!GTLog.mExplosionLog.exists()) { + try { + GTLog.mExplosionLog.createNewFile(); + } catch (Throwable ignored) {} + } + try { + GTLog.exp = new PrintStream(GTLog.mExplosionLog); + } catch (Throwable ignored) {} + } + + if (ConfigGeneral.loggingPlayerActicity) { + GTLog.mPlayerActivityLogFile = new File(parentFile, "logs/PlayerActivity.log"); + if (!GTLog.mPlayerActivityLogFile.exists()) { + try { + GTLog.mPlayerActivityLogFile.createNewFile(); + } catch (Throwable ignored) {} + } + try { + GTLog.pal = new PrintStream(GTLog.mPlayerActivityLogFile); + } catch (Throwable ignored) {} + } + } + + public static void runMineTweakerCompat() { + if (!CraftTweaker.isModLoaded()) return; + + GT_FML_LOGGER.info("preReader"); + final List oreTags = new ArrayList<>(); + final File globalDir = new File("scripts"); + if (globalDir.exists()) { + final List scripts = new ArrayList<>(); + for (File file : Objects.requireNonNull(globalDir.listFiles())) { + if (file.getName() + .endsWith(".zs")) { + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + String line; + while ((line = br.readLine()) != null) { + scripts.add(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + String pattern1 = "<"; + String pattern2 = ">"; + + Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2)); + for (String text : scripts) { + Matcher m = p.matcher(text); + while (m.find()) { + String hit = m.group(1); + if (hit.startsWith("ore:")) { + hit = hit.substring(4); + if (!oreTags.contains(hit)) oreTags.add(hit); + } else if (hit.startsWith("gregtech:gt.metaitem.0")) { + hit = hit.substring(22); + int mIt = Integer.parseInt(hit.substring(0, 1)); + if (mIt > 0) { + int meta = 0; + try { + hit = hit.substring(2); + meta = Integer.parseInt(hit); + } catch (Exception e) { + GT_FML_LOGGER.info("parseError: " + hit); + } + if (meta > 0 && meta < 32000) { + int prefix = meta / 1000; + int material = meta % 1000; + String tag = ""; + String[] tags = new String[] {}; + if (mIt == 1) tags = new String[] { "dustTiny", "dustSmall", "dust", "dustImpure", + "dustPure", "crushed", "crushedPurified", "crushedCentrifuged", "gem", "nugget", + null, "ingot", "ingotHot", "ingotDouble", "ingotTriple", "ingotQuadruple", + "ingotQuintuple", "plate", "plateDouble", "plateTriple", "plateQuadruple", + "plateQuintuple", "plateDense", "stick", "lens", "round", "bolt", "screw", "ring", + "foil", "cell", "cellPlasma", "cellMolten", "rawOre" }; + if (mIt == 2) tags = new String[] { "toolHeadSword", "toolHeadPickaxe", + "toolHeadShovel", "toolHeadAxe", "toolHeadHoe", "toolHeadHammer", "toolHeadFile", + "toolHeadSaw", "toolHeadDrill", "toolHeadChainsaw", "toolHeadWrench", + "toolHeadUniversalSpade", "toolHeadSense", "toolHeadPlow", "toolHeadArrow", + "toolHeadBuzzSaw", "turbineBlade", null, null, "wireFine", "gearGtSmall", "rotor", + "stickLong", "springSmall", "spring", "arrowGtWood", "arrowGtPlastic", "gemChipped", + "gemFlawed", "gemFlawless", "gemExquisite", "gearGt" }; + if (mIt == 3) tags = new String[] { "itemCasing", "nanite" }; + if (tags.length > prefix) tag = tags[prefix]; + if (GregTechAPI.sGeneratedMaterials[material] != null) { + tag += GregTechAPI.sGeneratedMaterials[material].mName; + if (!oreTags.contains(tag)) oreTags.add(tag); + } else if (material > 0) { + GT_FML_LOGGER.info("MaterialDisabled: " + material + " " + m.group(1)); + } + } + } + } + } + } + } + + final String[] preS = new String[] { "dustTiny", "dustSmall", "dust", "dustImpure", "dustPure", "crushed", + "crushedPurified", "crushedCentrifuged", "gem", "nugget", "ingot", "ingotHot", "ingotDouble", "ingotTriple", + "ingotQuadruple", "ingotQuintuple", "plate", "plateDouble", "plateTriple", "plateQuadruple", + "plateQuintuple", "plateDense", "stick", "lens", "round", "bolt", "screw", "ring", "foil", "cell", + "cellPlasma", "toolHeadSword", "toolHeadPickaxe", "toolHeadShovel", "toolHeadAxe", "toolHeadHoe", + "toolHeadHammer", "toolHeadFile", "toolHeadSaw", "toolHeadDrill", "toolHeadChainsaw", "toolHeadWrench", + "toolHeadUniversalSpade", "toolHeadSense", "toolHeadPlow", "toolHeadArrow", "toolHeadBuzzSaw", + "turbineBlade", "wireFine", "gearGtSmall", "rotor", "stickLong", "springSmall", "spring", "arrowGtWood", + "arrowGtPlastic", "gemChipped", "gemFlawed", "gemFlawless", "gemExquisite", "gearGt", "nanite", + "cellMolten", "rawOre" }; + + List mMTTags = new ArrayList<>(); + oreTags.stream() + .filter(test -> StringUtils.startsWithAny(test, preS)) + .forEach(test -> { + mMTTags.add(test); + if (GTValues.D1) GT_FML_LOGGER.info("oretag: " + test); + }); + + GT_FML_LOGGER.info("reenableMetaItems"); + + for (String reEnable : mMTTags) { + OrePrefixes tPrefix = OrePrefixes.getOrePrefix(reEnable); + if (tPrefix != null) { + Materials tName = Materials.get(reEnable.replaceFirst(tPrefix.toString(), "")); + if (tName != null) { + tPrefix.mDisabledItems.remove(tName); + tPrefix.mGeneratedItems.add(tName); + if (tPrefix == OrePrefixes.screw) { + OrePrefixes.bolt.mDisabledItems.remove(tName); + OrePrefixes.bolt.mGeneratedItems.add(tName); + OrePrefixes.stick.mDisabledItems.remove(tName); + OrePrefixes.stick.mGeneratedItems.add(tName); + } + if (tPrefix == OrePrefixes.round) { + OrePrefixes.nugget.mDisabledItems.remove(tName); + OrePrefixes.nugget.mGeneratedItems.add(tName); + } + if (tPrefix == OrePrefixes.spring) { + OrePrefixes.stickLong.mDisabledItems.remove(tName); + OrePrefixes.stickLong.mGeneratedItems.add(tName); + OrePrefixes.stick.mDisabledItems.remove(tName); + OrePrefixes.stick.mGeneratedItems.add(tName); + } + if (tPrefix == OrePrefixes.springSmall) { + OrePrefixes.stick.mDisabledItems.remove(tName); + OrePrefixes.stick.mGeneratedItems.add(tName); + } + if (tPrefix == OrePrefixes.stickLong) { + OrePrefixes.stick.mDisabledItems.remove(tName); + OrePrefixes.stick.mGeneratedItems.add(tName); + } + if (tPrefix == OrePrefixes.rotor) { + OrePrefixes.ring.mDisabledItems.remove(tName); + OrePrefixes.ring.mGeneratedItems.add(tName); + } + } else { + GT_FML_LOGGER.info("noMaterial " + reEnable); + } + } else { + GT_FML_LOGGER.info("noPrefix " + reEnable); + } + } + } + + public static void adjustScrap() { + GT_FML_LOGGER.info("GTMod: Removing all original Scrapbox Drops."); + try { + Objects.requireNonNull(GTUtility.getField("ic2.core.item.ItemScrapbox$Drop", "topChance", true, true)) + .set(null, 0); + ((List) Objects.requireNonNull( + GTUtility.getFieldContent( + GTUtility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true), + "drops", + true, + true))).clear(); + } catch (Throwable e) { + if (GTValues.D1) { + e.printStackTrace(GTLog.err); + } + } + GTLog.out.println("GTMod: Adding Scrap with a Weight of 200.0F to the Scrapbox Drops."); + GTModHandler.addScrapboxDrop(200.0F, GTModHandler.getIC2Item("scrap", 1L)); + } + + public static void loadConfig() { + // general + GTValues.D1 = ConfigDebug.D1; + GTValues.D2 = ConfigDebug.D2; + GTValues.allow_broken_recipemap = ConfigDebug.allowBrokenRecipeMap; + GTValues.debugCleanroom = ConfigDebug.debugCleanroom; + GTValues.debugDriller = ConfigDebug.debugDriller; + GTValues.debugWorldGen = ConfigDebug.debugWorldgen; + GTValues.debugOrevein = ConfigDebug.debugOrevein; + GTValues.debugSmallOres = ConfigDebug.debugSmallOres; + GTValues.debugStones = ConfigDebug.debugStones; + GTValues.debugBlockMiner = ConfigDebug.debugBlockMiner; + GTValues.debugBlockPump = ConfigDebug.debugBlockPump; + GTValues.debugEntityCramming = ConfigDebug.debugEntityCramming; + GTValues.debugWorldData = ConfigDebug.debugWorldData; + GTValues.oreveinPercentage = ConfigGeneral.oreveinPercentage; + GTValues.oreveinAttempts = ConfigGeneral.oreveinAttempts; + GTValues.oreveinMaxPlacementAttempts = ConfigGeneral.oreveinMaxPlacementAttempts; + GTValues.oreveinPlacerOres = ConfigGeneral.oreveinPlacerOres; + GTValues.oreveinPlacerOresMultiplier = ConfigGeneral.oreveinPlacerOresMultiplier; + GregTechAPI.TICKS_FOR_LAG_AVERAGING = ConfigGeneral.ticksForLagAveraging; + GregTechAPI.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING = ConfigGeneral.millisecondThesholdUntilLagWarning; + GregTechAPI.sTimber = ConfigGeneral.timber; + GregTechAPI.sDrinksAlwaysDrinkable = ConfigGeneral.drinksAlwaysDrinkable; + GregTechAPI.sDoShowAllItemsInCreative = ConfigGeneral.doShowAllItemsInCreative; + GregTechAPI.sMultiThreadedSounds = ConfigGeneral.multiThreadedSounds; + GTMod.gregtechproxy.mMaxEqualEntitiesAtOneSpot = ConfigGeneral.maxEqualEntitiesAtOneSpot; + GTMod.gregtechproxy.mFlintChance = ConfigGeneral.flintChance; + GTMod.gregtechproxy.mItemDespawnTime = ConfigGeneral.itemDespawnTime; + GTMod.gregtechproxy.mAllowSmallBoilerAutomation = ConfigGeneral.allowSmallBoilerAutomation; + GTMod.gregtechproxy.mDisableVanillaOres = gregtech.common.config.worldgen.ConfigGeneral.disableVanillaOres; + GTMod.gregtechproxy.mIncreaseDungeonLoot = ConfigGeneral.increaseDungeonLoot; + GTMod.gregtechproxy.mAxeWhenAdventure = ConfigGeneral.axeWhenAdventure; + GTMod.gregtechproxy.mSurvivalIntoAdventure = ConfigGeneral.survivalIntoAdventure; + GTMod.gregtechproxy.mHungerEffect = ConfigGeneral.hungerEffect; + GTMod.gregtechproxy.mInventoryUnification = ConfigGeneral.inventoryUnification; + GTMod.gregtechproxy.mGTBees = ConfigGeneral.GTBees; + GTMod.gregtechproxy.mCraftingUnification = ConfigGeneral.craftingUnification; + GTMod.gregtechproxy.mNerfedWoodPlank = ConfigGeneral.nerfedWoodPlank; + GTMod.gregtechproxy.mNerfedVanillaTools = ConfigGeneral.nerfedVanillaTools; + GTMod.gregtechproxy.mAchievements = ConfigGeneral.achievements; + GTMod.gregtechproxy.mHideUnusedOres = ConfigGeneral.hideUnusedOres; + GTMod.gregtechproxy.mEnableAllMaterials = ConfigGeneral.enableAllMaterials; + GTMod.gregtechproxy.mExplosionItemDrop = ConfigGeneral.explosionItemDrop; + GTMod.gregtechproxy.mEnableCleanroom = ConfigGeneral.enableCleanroom; + GTMod.gregtechproxy.mLowGravProcessing = GalacticraftCore.isModLoaded() && ConfigGeneral.lowGravProcessing; + GTMod.gregtechproxy.mCropNeedBlock = ConfigGeneral.cropNeedBlock; + GTMod.gregtechproxy.mAMHInteraction = ConfigGeneral.autoMaintenaceHatchesInteraction; + GTMod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre = ConfigGeneral.mixedOreOnlyYieldsTwoThirdsOfPureOre; + GTMod.gregtechproxy.mRichOreYieldMultiplier = ConfigGeneral.richOreYieldMultiplier; + GTMod.gregtechproxy.mNetherOreYieldMultiplier = ConfigGeneral.netherOreYieldMultiplier; + GTMod.gregtechproxy.mEndOreYieldMultiplier = ConfigGeneral.endOreYieldMultiplier; + GTMod.gregtechproxy.gt6Pipe = ConfigGeneral.gt6Pipe; + GTMod.gregtechproxy.gt6Cable = ConfigGeneral.gt6Cable; + GTMod.gregtechproxy.ic2EnergySourceCompat = ConfigGeneral.ic2EnergySourceCompat; + GTMod.gregtechproxy.costlyCableConnection = ConfigGeneral.costlyCableConnection; + GTMod.gregtechproxy.crashOnNullRecipeInput = ConfigGeneral.crashOnNullRecipeInput; + if ((boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) { + GTMod.gregtechproxy.crashOnNullRecipeInput = false; // Use flags in GTRecipeBuilder instead! + } + GTLanguageManager.i18nPlaceholder = ConfigGeneral.i18nPlaceholder; + MTELongDistancePipelineBase.minimalDistancePoints = ConfigGeneral.minimalDistancePoints; + GTValues.mCTMEnabledBlock.addAll(Arrays.asList(ConfigGeneral.CTMWhitelist)); + GTValues.mCTMDisabledBlock.addAll(Arrays.asList(ConfigGeneral.CTMBlacklist)); + if (ConfigGeneral.harderMobSpawner) { + Blocks.mob_spawner.setHardness(500.0F) + .setResistance(6000000.0F); + } + + // machines + GTValues.ticksBetweenSounds = ConfigMachines.ticksBetweenSounds; + GTValues.blacklistedTileEntiyClassNamesForWA = ConfigMachines.blacklistedTileEntiyClassNamesForWA; + GTValues.cleanroomGlass = ConfigMachines.cleanroomGlass; + GTValues.enableChunkloaders = ConfigMachines.enableChunkloaders; + GTValues.alwaysReloadChunkloaders = ConfigMachines.alwaysReloadChunkloaders; + GTValues.debugChunkloaders = ConfigDebug.debugChunkloaders; + GTValues.disableDigitalChestsExternalAccess = ConfigMachines.disableDigitalChestsExternalAccess; + GTValues.enableMultiTileEntities = ConfigMachines.enableMultiTileEntities + || (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + GregTechAPI.sMachineExplosions = ConfigMachines.machineExplosions; + GregTechAPI.sMachineFlammable = ConfigMachines.machineFlammable; + GregTechAPI.sMachineNonWrenchExplosions = ConfigMachines.machineNonWrenchExplosions; + GregTechAPI.sMachineWireFire = ConfigMachines.machineWireFire; + GregTechAPI.sMachineFireExplosions = ConfigMachines.machineFireExplosions; + GregTechAPI.sMachineRainExplosions = ConfigMachines.machineRainExplosions; + GregTechAPI.sMachineThunderExplosions = ConfigMachines.machineThunderExplosions; + GregTechAPI.sColoredGUI = ConfigMachines.coloredGUI; + GregTechAPI.sMachineMetalGUI = ConfigMachines.machineMetalGUI; + // Implementation for this is actually handled in NewHorizonsCoreMod in MainRegistry.java! + GregTechAPI.sUseMachineMetal = ConfigMachines.useMachineMetal; + + // client + loadClientConfig(); + + // Pollution + GTMod.gregtechproxy.mPollution = ConfigPollution.pollution; + GTMod.gregtechproxy.mPollutionSmogLimit = ConfigPollution.pollutionSmogLimit; + GTMod.gregtechproxy.mPollutionPoisonLimit = ConfigPollution.pollutionPoisonLimit; + GTMod.gregtechproxy.mPollutionVegetationLimit = ConfigPollution.pollutionVegetationLimit; + GTMod.gregtechproxy.mPollutionSourRainLimit = ConfigPollution.pollutionSourRainLimit; + GTMod.gregtechproxy.mPollutionOnExplosion = ConfigPollution.pollutionOnExplosion; + GTMod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond = ConfigPollution.pollutionPrimitveBlastFurnacePerSecond; + GTMod.gregtechproxy.mPollutionCharcoalPitPerSecond = ConfigPollution.pollutionCharcoalPitPerSecond; + GTMod.gregtechproxy.mPollutionEBFPerSecond = ConfigPollution.pollutionEBFPerSecond; + GTMod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond = ConfigPollution.pollutionLargeCombustionEnginePerSecond; + GTMod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond = ConfigPollution.pollutionExtremeCombustionEnginePerSecond; + GTMod.gregtechproxy.mPollutionImplosionCompressorPerSecond = ConfigPollution.pollutionImplosionCompressorPerSecond; + GTMod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond = ConfigPollution.pollutionLargeBronzeBoilerPerSecond; + GTMod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond = ConfigPollution.pollutionLargeSteelBoilerPerSecond; + GTMod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond = ConfigPollution.pollutionLargeTitaniumBoilerPerSecond; + GTMod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond = ConfigPollution.pollutionLargeTungstenSteelBoilerPerSecond; + GTMod.gregtechproxy.mPollutionReleasedByThrottle = ConfigPollution.pollutionReleasedByThrottle; + GTMod.gregtechproxy.mPollutionLargeGasTurbinePerSecond = ConfigPollution.pollutionLargeGasTurbinePerSecond; + GTMod.gregtechproxy.mPollutionMultiSmelterPerSecond = ConfigPollution.pollutionMultiSmelterPerSecond; + GTMod.gregtechproxy.mPollutionPyrolyseOvenPerSecond = ConfigPollution.pollutionPyrolyseOvenPerSecond; + GTMod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond = ConfigPollution.pollutionSmallCoalBoilerPerSecond; + GTMod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond = ConfigPollution.pollutionHighPressureLavaBoilerPerSecond; + GTMod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond = ConfigPollution.pollutionHighPressureCoalBoilerPerSecond; + GTMod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond = ConfigPollution.pollutionBaseDieselGeneratorPerSecond; + double[] mPollutionDieselGeneratorReleasedByTier = ConfigPollution.pollutionDieselGeneratorReleasedByTier; + if (mPollutionDieselGeneratorReleasedByTier.length + == GTMod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier.length) { + GTMod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier = mPollutionDieselGeneratorReleasedByTier; + } else { + GT_FML_LOGGER + .error("The Length of the Diesel Turbine Pollution Array Config must be the same as the Default"); + } + GTMod.gregtechproxy.mPollutionBaseGasTurbinePerSecond = ConfigPollution.pollutionBaseGasTurbinePerSecond; + double[] mPollutionGasTurbineReleasedByTier = ConfigPollution.pollutionGasTurbineReleasedByTier; + if (mPollutionGasTurbineReleasedByTier.length + == GTMod.gregtechproxy.mPollutionGasTurbineReleasedByTier.length) { + GTMod.gregtechproxy.mPollutionGasTurbineReleasedByTier = mPollutionGasTurbineReleasedByTier; + } else { + GT_FML_LOGGER.error("The Length of the Gas Turbine Pollution Array Config must be the same as the Default"); + } + + // cleanroom file + if (GTMod.gregtechproxy.mEnableCleanroom) MTECleanroom.loadConfig(GTConfig.cleanroomFile); + + // underground fluids file + GTMod.gregtechproxy.mUndergroundOil.getConfig(GTConfig.undergroundFluidsFile, "undergroundfluid"); + + // Worldgeneration.cfg + GTMod.gregtechproxy.enableUndergroundGravelGen = gregtech.common.config.worldgen.ConfigGeneral.generateUndergroundGravelGen; + GTMod.gregtechproxy.enableUndergroundDirtGen = gregtech.common.config.worldgen.ConfigGeneral.generateUndergroundDirtGen; + GTMod.gregtechproxy.enableBlackGraniteOres = gregtech.common.config.worldgen.ConfigGeneral.generateBlackGraniteOres; + GTMod.gregtechproxy.enableRedGraniteOres = gregtech.common.config.worldgen.ConfigGeneral.generateBlackGraniteOres; + GTMod.gregtechproxy.enableMarbleOres = gregtech.common.config.worldgen.ConfigGeneral.generateMarbleOres; + GTMod.gregtechproxy.enableBasaltOres = gregtech.common.config.worldgen.ConfigGeneral.generateBasaltOres; + + // OverpoweredStuff.cfg + GregTechAPI.mOutputRF = gregtech.common.config.opstuff.ConfigGeneral.outputRF; + GregTechAPI.mInputRF = gregtech.common.config.opstuff.ConfigGeneral.inputRF; + GregTechAPI.mEUtoRF = gregtech.common.config.opstuff.ConfigGeneral.howMuchRFWith100EUInInput; + GregTechAPI.mRFtoEU = gregtech.common.config.opstuff.ConfigGeneral.howMuchEUWith100RFInInput; + GregTechAPI.mRFExplosions = gregtech.common.config.opstuff.ConfigGeneral.RFExplosions; + + // MachineStats.cfg + GTMod.gregtechproxy.mForceFreeFace = gregtech.common.config.machinestats.ConfigMachines.forceFreeFace; + + // ore_drop_behavior + try { + GTLog.out.println("Trying to set it to: " + ConfigOreDropBehavior.setting); + GTMod.gregtechproxy.oreDropSystem = GTProxy.OreDropSystem.valueOf(ConfigOreDropBehavior.setting);; + } catch (IllegalArgumentException e) { + GTLog.err.println(e); + GTMod.gregtechproxy.oreDropSystem = GTProxy.OreDropSystem.FortuneItem; + } + + // features + GTMod.gregtechproxy.mUpgradeCount = Math.min(64, Math.max(1, ConfigFeatures.upgradeStackSize)); + for (OrePrefixes tPrefix : OrePrefixes.values()) { + if (tPrefix.mIsUsedForOreProcessing) { + tPrefix.mDefaultStackSize = ((byte) Math.min(64, Math.max(1, ConfigFeatures.maxOreStackSize))); + } else if (tPrefix == OrePrefixes.plank) { + tPrefix.mDefaultStackSize = ((byte) Math.min(64, Math.max(16, ConfigFeatures.maxPlankStackSize))); + } else if ((tPrefix == OrePrefixes.wood) || (tPrefix == OrePrefixes.treeLeaves) + || (tPrefix == OrePrefixes.treeSapling) + || (tPrefix == OrePrefixes.log)) { + tPrefix.mDefaultStackSize = ((byte) Math.min(64, Math.max(16, ConfigFeatures.maxLogStackSize))); + } else if (tPrefix.mIsUsedForBlocks) { + tPrefix.mDefaultStackSize = ((byte) Math + .min(64, Math.max(16, ConfigFeatures.maxOtherBlocksStackSize))); + } + } + + GTRecipeBuilder.onConfigLoad(); + } + + public static void parseHex(Dyes dye, String hexString) { + dye.mRGBa[0] = Short.parseShort(hexString.substring(1, 3), 16); + dye.mRGBa[1] = Short.parseShort(hexString.substring(3, 5), 16); + dye.mRGBa[2] = Short.parseShort(hexString.substring(5), 16); + } + + public static void loadClientConfig() { + Arrays.stream(Dyes.values()) + .filter(dye -> (dye != Dyes._NULL) && (dye.mIndex < 0)) + .forEach(dye -> { + switch (dye.toString() + .toLowerCase()) { + case "cable_insulation" -> parseHex(dye, ConfigColorModulation.cableInsulation); + case "construction_foam" -> parseHex(dye, ConfigColorModulation.constructionFoam); + case "machine_metal" -> parseHex(dye, ConfigColorModulation.machineMetal); + default -> { + GT_FML_LOGGER.warn( + "unknown color modulation entry: " + dye + + ". Report this pls, as config is missing this entry being parsed in code."); + } + } + }); + GTMod.gregtechproxy.mRenderTileAmbientOcclusion = ConfigRender.renderTileAmbientOcclusion; + GTMod.gregtechproxy.mRenderGlowTextures = ConfigRender.renderGlowTextures; + GTMod.gregtechproxy.mRenderFlippedMachinesFlipped = ConfigRender.renderFlippedMachinesFlipped; + GTMod.gregtechproxy.mRenderIndicatorsOnHatch = ConfigRender.renderIndicatorsOnHatch; + GTMod.gregtechproxy.mRenderDirtParticles = ConfigRender.renderDirtParticles; + GTMod.gregtechproxy.mRenderPollutionFog = ConfigRender.renderPollutionFog; + GTMod.gregtechproxy.mRenderItemDurabilityBar = ConfigRender.renderItemDurabilityBar; + GTMod.gregtechproxy.mRenderItemChargeBar = ConfigRender.renderItemChargeBar; + GTMod.gregtechproxy.mUseBlockUpdateHandler = ConfigRender.useBlockUpdateHandler; + + GTMod.gregtechproxy.mCoverTabsVisible = ConfigInterface.coverTabsVisible; + GTMod.gregtechproxy.mCoverTabsFlipped = ConfigInterface.coverTabsFlipped; + GTMod.gregtechproxy.mTooltipVerbosity = ConfigInterface.tooltipVerbosity; + GTMod.gregtechproxy.mTooltipShiftVerbosity = ConfigInterface.tooltipShiftVerbosity; + GTMod.gregtechproxy.mTitleTabStyle = ConfigInterface.titleTabStyle; + + GTMod.gregtechproxy.mNEIRecipeSecondMode = GregTechAPI.NEIClientFIle.get("nei", "RecipeSecondMode", true); + GTMod.gregtechproxy.mNEIRecipeOwner = GregTechAPI.NEIClientFIle.get("nei", "RecipeOwner", false); + GTMod.gregtechproxy.mNEIRecipeOwnerStackTrace = GregTechAPI.NEIClientFIle + .get("nei", "RecipeOwnerStackTrace", false); + GTMod.gregtechproxy.mNEIOriginalVoltage = GregTechAPI.NEIClientFIle.get("nei", "OriginalVoltage", false); + + GTMod.gregtechproxy.recipeCategorySettings.clear(); + for (RecipeCategory recipeCategory : findRecipeCategories()) { + RecipeCategorySetting setting = RecipeCategorySetting.find( + GregTechAPI.NEIClientFIle.getWithValidValues( + "nei.recipe_categories", + recipeCategory.unlocalizedName, + RecipeCategorySetting.NAMES, + RecipeCategorySetting.getDefault() + .toName())); + GTMod.gregtechproxy.recipeCategorySettings.put(recipeCategory, setting); + } + + GTMod.gregtechproxy.mWailaTransformerVoltageTier = ConfigWaila.wailaTransformerVoltageTier; + GTMod.gregtechproxy.wailaAverageNS = ConfigWaila.wailaAverageNS; + + GTMod.gregtechproxy.reloadNEICache(); + } + + private static List findRecipeCategories() { + List ret = new ArrayList<>(); + try { + Field discovererField = Loader.class.getDeclaredField("discoverer"); + discovererField.setAccessible(true); + ModDiscoverer discoverer = (ModDiscoverer) discovererField.get(Loader.instance()); + for (ASMDataTable.ASMData asmData : discoverer.getASMTable() + .getAll(RecipeCategoryHolder.class.getName())) { + try { + Object obj = Class.forName(asmData.getClassName()) + .getDeclaredField(asmData.getObjectName()) + .get(null); + if (obj instanceof RecipeCategory recipeCategory) { + ret.add(recipeCategory); + } else { + GT_FML_LOGGER.error( + "{}#{} is not an instance of RecipeCategory", + asmData.getClassName(), + asmData.getObjectName()); + } + } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { + GT_FML_LOGGER.error("Failed to find RecipeCategory"); + GT_FML_LOGGER.catching(e); + } + } + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + return ret; + } +} diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java b/src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java deleted file mode 100644 index fd66127e36..0000000000 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java +++ /dev/null @@ -1,31 +0,0 @@ -package gregtech.loaders.preload; - -import gregtech.api.util.GT_Log; -import gregtech.common.redstonecircuits.GT_Circuit_BasicLogic; -import gregtech.common.redstonecircuits.GT_Circuit_BitAnd; -import gregtech.common.redstonecircuits.GT_Circuit_CombinationLock; -import gregtech.common.redstonecircuits.GT_Circuit_Equals; -import gregtech.common.redstonecircuits.GT_Circuit_Pulser; -import gregtech.common.redstonecircuits.GT_Circuit_Randomizer; -import gregtech.common.redstonecircuits.GT_Circuit_RedstoneMeter; -import gregtech.common.redstonecircuits.GT_Circuit_Repeater; -import gregtech.common.redstonecircuits.GT_Circuit_Timer; - -public class GT_Loader_CircuitBehaviors implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Register Redstone Circuit behaviours."); - new GT_Circuit_Timer(0); - new GT_Circuit_BasicLogic(1); - new GT_Circuit_Repeater(2); - new GT_Circuit_Pulser(3); - new GT_Circuit_RedstoneMeter(4); - - new GT_Circuit_Randomizer(8); - - new GT_Circuit_CombinationLock(16); - new GT_Circuit_BitAnd(17); - new GT_Circuit_Equals(18); - } -} diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java b/src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java deleted file mode 100644 index a4d1644b6b..0000000000 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java +++ /dev/null @@ -1,393 +0,0 @@ -package gregtech.loaders.preload; - -import static gregtech.api.enums.Mods.AppliedEnergistics2; -import static gregtech.api.enums.Mods.Forestry; -import static gregtech.api.enums.Mods.NewHorizonsCoreMod; -import static gregtech.api.enums.Mods.PamsHarvestCraft; -import static gregtech.api.enums.Mods.Railcraft; -import static gregtech.api.enums.Mods.Thaumcraft; -import static gregtech.api.enums.Mods.TwilightForest; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.objects.ItemData; -import gregtech.api.objects.MaterialStack; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; - -public class GT_Loader_ItemData implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Loading Item Data Tags"); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "item.giantPick", 1L, 0), - new ItemData(Materials.Stone, 696729600L, new MaterialStack(Materials.Wood, 464486400L))); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "item.giantSword", 1L, 0), - new ItemData(Materials.Stone, 464486400L, new MaterialStack(Materials.Wood, 232243200L))); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "tile.GiantLog", 1L, 32767), - new ItemData(Materials.Wood, 232243200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "tile.GiantCobble", 1L, 32767), - new ItemData(Materials.Stone, 232243200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "tile.GiantObsidian", 1L, 32767), - new ItemData(Materials.Obsidian, 232243200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "item.minotaurAxe", 1L, 0), - new ItemData( - Materials.Diamond, - 14515200L, - new MaterialStack(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 2L))); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "item.armorShards", 1L, 0), - new ItemData(Materials.Knightmetal, 403200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(TwilightForest.ID, "item.shardCluster", 1L, 0), - new ItemData(Materials.Knightmetal, 3628800L)); - GT_OreDictUnificator.addItemData(ItemList.TF_LiveRoot.get(1L), new ItemData(Materials.LiveRoot, 3628800L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10), - new ItemData(Materials.CertusQuartz, 1814400L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11), - new ItemData(Materials.NetherQuartz, 1814400L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12), - new ItemData(Materials.Fluix, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.quartz_block, 1, 32767), new ItemData(Materials.NetherQuartz, 14515200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1L, 32767), - new ItemData(Materials.CertusQuartz, 14515200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzPillar", 1L, 32767), - new ItemData(Materials.CertusQuartz, 14515200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzChiseled", 1L, 32767), - new ItemData(Materials.CertusQuartz, 14515200L)); - GT_OreDictUnificator.addItemData(new ItemStack(Items.wheat, 1, 32767), new ItemData(Materials.Wheat, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.hay_block, 1, 32767), new ItemData(Materials.Wheat, 32659200L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.snowball, 1, 32767), new ItemData(Materials.Snow, 907200L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.snow, 1, 32767), new ItemData(Materials.Snow, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.glowstone, 1, 32767), new ItemData(Materials.Glowstone, 14515200L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.redstone_lamp, 1, 32767), - new ItemData( - Materials.Glowstone, - 14515200L, - new MaterialStack(Materials.Redstone, OrePrefixes.dust.mMaterialAmount * 4L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.lit_redstone_lamp, 1, 32767), - new ItemData( - Materials.Glowstone, - 14515200L, - new MaterialStack(Materials.Redstone, OrePrefixes.dust.mMaterialAmount * 4L))); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Forestry.ID, "craftingMaterial", 1L, 5), - new ItemData(Materials.Ice, 3628800L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.ice, 1, 32767), new ItemData(Materials.Ice, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.packed_ice, 1, 32767), new ItemData(Materials.Ice, 7257600L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.clay_ball, 1, 32767), new ItemData(Materials.Clay, 1814400L)); - GT_OreDictUnificator.removeItemData(new ItemStack(Blocks.clay, 1, 0)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.clay, 1, 32767), new ItemData(Materials.Clay, 7257600L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.hardened_clay, 1, 32767), new ItemData(Materials.Clay, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stained_hardened_clay, 1, 32767), new ItemData(Materials.Clay, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.brick_block, 1, 32767), new ItemData(Materials.Brick, 3628800L)); - GT_OreDictUnificator - .addItemData(GT_ModHandler.getIC2Item("Uran238", 1L), new ItemData(Materials.Uranium, 3628800L)); - GT_OreDictUnificator - .addItemData(GT_ModHandler.getIC2Item("Uran235", 1L), new ItemData(Materials.Uranium235, 3628800L)); - GT_OreDictUnificator - .addItemData(GT_ModHandler.getIC2Item("Plutonium", 1L), new ItemData(Materials.Plutonium, 3628800L)); - GT_OreDictUnificator - .addItemData(GT_ModHandler.getIC2Item("smallUran235", 1L), new ItemData(Materials.Uranium235, 403200L)); - GT_OreDictUnificator - .addItemData(GT_ModHandler.getIC2Item("smallPlutonium", 1L), new ItemData(Materials.Plutonium, 403200L)); - GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Iron.get(1L), new ItemData(Materials.Iron, 1814400L)); - GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Gold.get(1L), new ItemData(Materials.Gold, 1814400L)); - GT_OreDictUnificator - .addItemData(ItemList.IC2_Item_Casing_Bronze.get(1L), new ItemData(Materials.Bronze, 1814400L)); - GT_OreDictUnificator - .addItemData(ItemList.IC2_Item_Casing_Copper.get(1L), new ItemData(Materials.Copper, 1814400L)); - GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Tin.get(1L), new ItemData(Materials.Tin, 1814400L)); - GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Lead.get(1L), new ItemData(Materials.Lead, 1814400L)); - GT_OreDictUnificator - .addItemData(ItemList.IC2_Item_Casing_Steel.get(1L), new ItemData(Materials.Steel, 1814400L)); - GT_OreDictUnificator.addItemData(new ItemStack(Items.book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.written_book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.writable_book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.enchanted_book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.golden_apple, 1, 1), - new ItemData(Materials.Gold, OrePrefixes.block.mMaterialAmount * 8L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.golden_apple, 1, 0), - new ItemData(Materials.Gold, OrePrefixes.ingot.mMaterialAmount * 8L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.golden_carrot, 1, 0), - new ItemData(Materials.Gold, OrePrefixes.nugget.mMaterialAmount * 8L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.speckled_melon, 1, 0), - new ItemData(Materials.Gold, OrePrefixes.nugget.mMaterialAmount * 8L)); - GT_OreDictUnificator.addItemData(new ItemStack(Items.minecart, 1), new ItemData(Materials.Iron, 18144000L)); - GT_OreDictUnificator.addItemData(new ItemStack(Items.iron_door, 1), new ItemData(Materials.Iron, 21772800L)); - GT_OreDictUnificator.addItemData(new ItemStack(Items.cauldron, 1), new ItemData(Materials.Iron, 25401600L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.iron_bars, 8, 32767), new ItemData(Materials.Iron, 10886400L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SteelBars", 8L, 0), - new ItemData(Materials.Steel, 10886400L)); - GT_OreDictUnificator - .addItemData(GT_ModHandler.getIC2Item("ironFurnace", 1L), new ItemData(Materials.Iron, 18144000L)); - GT_OreDictUnificator.addItemData(ItemList.IC2_Food_Can_Empty.get(1L), new ItemData(Materials.Tin, 1814400L)); - GT_OreDictUnificator.addItemData(ItemList.IC2_Fuel_Rod_Empty.get(1L), new ItemData(Materials.Iron, 3628800L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.light_weighted_pressure_plate, 1, 32767), - new ItemData(Materials.Gold, 7257600L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.heavy_weighted_pressure_plate, 1, 32767), - new ItemData(Materials.Iron, 7257600L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 0), - new ItemData(Materials.Steel, 108864000L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 1), - new ItemData(Materials.Steel, 72576000L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 2), - new ItemData(Materials.Steel, 36288000L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 0), new ItemData(Materials.Iron, 108864000L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 1), new ItemData(Materials.Iron, 72576000L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 2), new ItemData(Materials.Iron, 36288000L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.hopper, 1, 32767), - new ItemData(Materials.Iron, 18144000L, new MaterialStack(Materials.Wood, 29030400L))); - GT_OreDictUnificator.addItemData(ItemList.Cell_Universal_Fluid.get(1L), new ItemData(Materials.Tin, 7257600L)); - GT_OreDictUnificator.addItemData(ItemList.Cell_Empty.get(1L), new ItemData(Materials.Tin, 7257600L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.tripwire_hook, 1, 32767), - new ItemData( - Materials.Iron, - OrePrefixes.ring.mMaterialAmount * 2L, - new MaterialStack(Materials.Wood, 3628800L))); - GT_OreDictUnificator.addItemData(ItemList.Bottle_Empty.get(1L), new ItemData(Materials.Glass, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.potionitem, 1, 32767), new ItemData(Materials.Glass, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stained_glass, 1, 32767), new ItemData(Materials.Glass, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.glass, 1, 32767), new ItemData(Materials.Glass, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stained_glass_pane, 1, 32767), new ItemData(Materials.Glass, 1360800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.glass_pane, 1, 32767), new ItemData(Materials.Glass, 1360800L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.clock, 1, 32767), - new ItemData(Materials.Gold, 14515200L, new MaterialStack(Materials.Redstone, 3628800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.compass, 1, 32767), - new ItemData(Materials.Iron, 14515200L, new MaterialStack(Materials.Redstone, 3628800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.iron_horse_armor, 1, 32767), - new ItemData(Materials.Iron, 29030400L, new MaterialStack(Materials.Leather, 21772800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.golden_horse_armor, 1, 32767), - new ItemData(Materials.Gold, 29030400L, new MaterialStack(Materials.Leather, 21772800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Items.diamond_horse_armor, 1, 32767), - new ItemData(Materials.Diamond, 29030400L, new MaterialStack(Materials.Leather, 21772800L))); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.leather, 1, 32767), new ItemData(Materials.Leather, 3628800L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.beacon, 1, 32767), - new ItemData( - Materials.NetherStar, - 3628800L, - new MaterialStack(Materials.Obsidian, 10886400L), - new MaterialStack(Materials.Glass, 18144000L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.enchanting_table, 1, 32767), - new ItemData( - Materials.Diamond, - 7257600L, - new MaterialStack(Materials.Obsidian, 14515200L), - new MaterialStack(Materials.Paper, 10886400L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.ender_chest, 1, 32767), - new ItemData(Materials.EnderEye, 3628800L, new MaterialStack(Materials.Obsidian, 29030400L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.bookshelf, 1, 32767), - new ItemData(Materials.Paper, 32659200L, new MaterialStack(Materials.Wood, 21772800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.lever, 1, 32767), - new ItemData(Materials.Stone, 3628800L, new MaterialStack(Materials.Wood, 1814400L))); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.ice, 1, 32767), new ItemData(Materials.Ice, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.packed_ice, 1, 32767), new ItemData(Materials.Ice, 7257600L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.snow, 1, 32767), new ItemData(Materials.Snow, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.snowball, 1, 32767), new ItemData(Materials.Snow, 907200L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.snow_layer, 1, 32767), new ItemData(Materials.Snow, -1L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.sand, 1, 32767), new ItemData(Materials.Sand, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.sandstone, 1, 32767), new ItemData(Materials.Sand, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 0), new ItemData(Materials.Stone, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 8), new ItemData(Materials.Stone, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 0), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 8), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 1), new ItemData(Materials.Sand, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 9), new ItemData(Materials.Sand, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 1), new ItemData(Materials.Sand, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 9), new ItemData(Materials.Sand, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 2), new ItemData(Materials.Wood, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 10), new ItemData(Materials.Wood, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 2), new ItemData(Materials.Wood, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 10), new ItemData(Materials.Wood, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 3), new ItemData(Materials.Stone, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 11), new ItemData(Materials.Stone, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 3), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 11), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 5), new ItemData(Materials.Stone, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_slab, 1, 13), new ItemData(Materials.Stone, 1814400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 5), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 13), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone, 1, 32767), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.furnace, 1, 32767), new ItemData(Materials.Stone, 29030400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.lit_furnace, 1, 32767), new ItemData(Materials.Stone, 29030400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stonebrick, 1, 32767), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.cobblestone, 1, 32767), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.mossy_cobblestone, 1, 32767), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_button, 1, 32767), new ItemData(Materials.Stone, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.stone_pressure_plate, 1, 32767), new ItemData(Materials.Stone, 7257600L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.ladder, 1, 32767), new ItemData(Materials.Wood, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.wooden_button, 1, 32767), new ItemData(Materials.Wood, 3628800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.wooden_pressure_plate, 1, 32767), new ItemData(Materials.Wood, 7257600L)); - GT_OreDictUnificator.addItemData(new ItemStack(Blocks.fence, 1, 32767), new ItemData(Materials.Wood, 5443200L)); - GT_OreDictUnificator.addItemData(new ItemStack(Items.bowl, 1, 32767), new ItemData(Materials.Wood, 3628800L)); - GT_OreDictUnificator.addItemData(new ItemStack(Items.sign, 1, 32767), new ItemData(Materials.Wood, 7257600L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Items.wooden_door, 1, 32767), new ItemData(Materials.Wood, 21772800L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.chest, 1, 32767), new ItemData(Materials.Wood, 29030400L)); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.trapped_chest, 1, 32767), new ItemData(Materials.Wood, 29030400L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.unlit_redstone_torch, 1, 32767), - new ItemData(Materials.Wood, 1814400L, new MaterialStack(Materials.Redstone, 3628800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.redstone_torch, 1, 32767), - new ItemData(Materials.Wood, 1814400L, new MaterialStack(Materials.Redstone, 3628800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.noteblock, 1, 32767), - new ItemData(Materials.Wood, 29030400L, new MaterialStack(Materials.Redstone, 3628800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.jukebox, 1, 32767), - new ItemData(Materials.Wood, 29030400L, new MaterialStack(Materials.Diamond, 3628800L))); - GT_OreDictUnificator - .addItemData(new ItemStack(Blocks.crafting_table, 1, 32767), new ItemData(Materials.Wood, 14515200L)); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.piston, 1, 32767), - new ItemData(Materials.Stone, 14515200L, new MaterialStack(Materials.Wood, 10886400L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.sticky_piston, 1, 32767), - new ItemData(Materials.Stone, 14515200L, new MaterialStack(Materials.Wood, 10886400L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.dispenser, 1, 32767), - new ItemData(Materials.Stone, 25401600L, new MaterialStack(Materials.Redstone, 3628800L))); - GT_OreDictUnificator.addItemData( - new ItemStack(Blocks.dropper, 1, 32767), - new ItemData(Materials.Stone, 25401600L, new MaterialStack(Materials.Redstone, 3628800L))); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetChicken", 1L, 32767), - new ItemData(Materials.MeatCooked, 403200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetBeef", 1L, 32767), - new ItemData(Materials.MeatCooked, 403200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetPork", 1L, 32767), - new ItemData(Materials.MeatCooked, 403200L)); - GT_OreDictUnificator.addItemData( - GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetFish", 1L, 32767), - new ItemData(Materials.MeatCooked, 403200L)); - - for (ItemStack tItem : new ItemStack[] { GT_ModHandler.getModItem(TwilightForest.ID, "item.meefRaw", 1L, 0), - GT_ModHandler.getModItem(TwilightForest.ID, "item.venisonRaw", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "muttonrawItem", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "turkeyrawItem", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "rabbitrawItem", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "venisonrawItem", 1L, 0), new ItemStack(Items.porkchop), - new ItemStack(Items.beef), new ItemStack(Items.chicken), new ItemStack(Items.fish) }) { - if (tItem != null) { - GT_OreDictUnificator.addItemData( - GT_Utility.copyMetaData(32767, tItem), - new ItemData(Materials.MeatRaw, 3628800L, new MaterialStack(Materials.Bone, 403200L))); - } - } - for (ItemStack tItem : new ItemStack[] { GT_ModHandler.getModItem(TwilightForest.ID, "item.meefSteak", 1L, 0), - GT_ModHandler.getModItem(TwilightForest.ID, "item.venisonCooked", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "muttoncookedItem", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "turkeycookedItem", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "rabbitcookedItem", 1L, 0), - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "venisoncookedItem", 1L, 0), - new ItemStack(Items.cooked_porkchop), new ItemStack(Items.cooked_beef), new ItemStack(Items.cooked_chicken), - new ItemStack(Items.cooked_fished) }) { - if (tItem != null) { - GT_OreDictUnificator.addItemData( - GT_Utility.copyMetaData(32767, tItem), - new ItemData(Materials.MeatCooked, 3628800L, new MaterialStack(Materials.Bone, 403200L))); - } - } - } -} diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java b/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java deleted file mode 100644 index f4c682d848..0000000000 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java +++ /dev/null @@ -1,2127 +0,0 @@ -package gregtech.loaders.preload; - -import static gregtech.api.enums.FluidState.GAS; -import static gregtech.api.enums.FluidState.LIQUID; -import static gregtech.api.enums.FluidState.MOLTEN; -import static gregtech.api.enums.FluidState.SLURRY; -import static gregtech.api.enums.Mods.AppliedEnergistics2; -import static gregtech.api.enums.Mods.PamsHarvestCraft; -import static gregtech.api.enums.Mods.Railcraft; -import static gregtech.api.enums.Mods.Thaumcraft; -import static gregtech.api.enums.Mods.TwilightForest; -import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes; -import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes; -import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; -import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; -import static gregtech.api.util.GT_RecipeBuilder.WILDCARD; - -import java.util.Locale; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidContainerRegistry; -import net.minecraftforge.fluids.FluidRegistry; - -import codechicken.nei.api.API; -import cpw.mods.fml.common.event.FMLInterModComms; -import cpw.mods.fml.common.registry.GameRegistry; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.MaterialsKevlar; -import gregtech.api.enums.MaterialsUEVplus; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TierEU; -import gregtech.api.fluid.GT_FluidFactory; -import gregtech.api.items.GT_Block_LongDistancePipe; -import gregtech.api.items.GT_BreederCell_Item; -import gregtech.api.items.GT_Generic_Item; -import gregtech.api.items.GT_RadioactiveCellIC_Item; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_Casings1; -import gregtech.common.blocks.GT_Block_Casings10; -import gregtech.common.blocks.GT_Block_Casings11; -import gregtech.common.blocks.GT_Block_Casings2; -import gregtech.common.blocks.GT_Block_Casings3; -import gregtech.common.blocks.GT_Block_Casings4; -import gregtech.common.blocks.GT_Block_Casings5; -import gregtech.common.blocks.GT_Block_Casings6; -import gregtech.common.blocks.GT_Block_Casings8; -import gregtech.common.blocks.GT_Block_Casings9; -import gregtech.common.blocks.GT_Block_Concretes; -import gregtech.common.blocks.GT_Block_Drone; -import gregtech.common.blocks.GT_Block_FrameBox; -import gregtech.common.blocks.GT_Block_Glass1; -import gregtech.common.blocks.GT_Block_Granites; -import gregtech.common.blocks.GT_Block_Laser; -import gregtech.common.blocks.GT_Block_Machines; -import gregtech.common.blocks.GT_Block_Metal; -import gregtech.common.blocks.GT_Block_Ores; -import gregtech.common.blocks.GT_Block_Reinforced; -import gregtech.common.blocks.GT_Block_Stones; -import gregtech.common.blocks.GT_Block_TintedIndustrialGlass; -import gregtech.common.blocks.GT_Cyclotron_Coils; -import gregtech.common.blocks.GT_TileEntity_Ores; -import gregtech.common.blocks.GT_WormholeRenderBlock; -import gregtech.common.items.GT_DepletetCell_Item; -import gregtech.common.items.GT_FluidDisplayItem; -import gregtech.common.items.GT_IntegratedCircuit_Item; -import gregtech.common.items.GT_MetaGenerated_Item_01; -import gregtech.common.items.GT_MetaGenerated_Item_02; -import gregtech.common.items.GT_MetaGenerated_Item_03; -import gregtech.common.items.GT_MetaGenerated_Item_98; -import gregtech.common.items.GT_MetaGenerated_Item_99; -import gregtech.common.items.GT_MetaGenerated_Tool_01; -import gregtech.common.items.GT_NeutronReflector_Item; -import gregtech.common.items.GT_TierDrone; -import gregtech.common.items.GT_VolumetricFlask; -import gregtech.common.items.GT_WirelessHeadphones; -import gregtech.common.tileentities.render.TileDrone; -import gregtech.common.tileentities.render.TileLaser; -import gregtech.common.tileentities.render.TileWormhole; - -public class GT_Loader_Item_Block_And_Fluid implements Runnable { - - @Override - public void run() { - Materials.Water.mFluid = (Materials.Ice.mFluid = GT_ModHandler.getWater(1000L) - .getFluid()); - Materials.Lava.mFluid = GT_ModHandler.getLava(1000L) - .getFluid(); - - GT_Log.out.println("GT_Mod: Register Books."); - - GT_Utility.getWrittenBook( - "Manual_Printer", - "Printer Manual V2.0", - "Gregorius Techneticies", - "This Manual explains the different Functionalities the GregTech Printing Factory has built in, which are not in NEI. Most got NEI Support now, but there is still some left without it.", - "1. Coloring Items and Blocks: You know those Crafting Recipes, which have a dye surrounded by 8 Item to dye them? Or the ones which have just one Item and one Dye in the Grid? Those two Recipe Types can be cheaply automated using the Printer.", - "The Colorization Functionality even optimizes the Recipes, which normally require 8 Items + 1 Dye to 1 Item and an 8th of the normally used Dye in Fluid Form, isn't that awesome?", - "2. Copying Books: This Task got slightly harder. The first Step is putting the written and signed Book inside the Scanner with a Data Stick ready to receive the Data.", - "Now insert the Stick into the Data Slot of the Printer and add 3 pieces of Paper together with 144 Liters of actual Ink Fluid. Water mixed and chemical Dyes won't work on Paper without messing things up!", - "You got a stack of Pages for your new Book, just put them into the Assembler with some Glue and a piece of Leather for the Binding, and you receive an identical copy of the Book, which would stack together with the original.", - "3. Renaming Items: This Functionality is no longer Part of the Printer. There is now a Name Mold for the Forming Press to imprint a Name into an Item, just rename the Mold in an Anvil and use it in the Forming Press on any Item.", - "4. Crafting of Books, Maps, Nametags etc etc etc: Those Recipes moved to other Machines, just look them up in NEI."); - - GT_Utility.getWrittenBook( - "Manual_Punch_Cards", - "Punch Card Manual V0.0", - "Gregorius Techneticies", - "This Manual will explain the Functionality of the Punch Cards, once they are fully implemented. And no, they won't be like the IRL Punch Cards. This is just a current Idea Collection.", - "(i1&&i2)?o1=15:o1=0;=10", - "ignore all Whitespace Characters, use Long for saving the Numbers", - "&& || ^^ & | ^ ! ++ -- + - % / // * ** << >> >>> < > <= >= == != ~ ( ) ?: , ; ;= ;=X; = i0 i1 i2 i3 i4 i5 o0 o1 o2 o3 o4 o5 v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 m0 m1 m2 m3 m4 m5 m6 m7 m8 m9 A B C D E F", - "'0' = false, 'everything but 0' = true, '!' turns '0' into '1' and everything else into '0'", - "',' is just a separator for multiple executed Codes in a row.", - "';' means that the Program waits until the next tick before continuing. ';=10' and ';=10;' both mean that it will wait 10 Ticks instead of 1. And ';=0' or anything < 0 will default to 0.", - "If the '=' Operator is used within Brackets, it returns the value the variable has been set to.", - "The Program saves the Char Index of the current Task, the 10 Variables (which reset to 0 as soon as the Program Loop stops), the 10 Member Variables and the remaining waiting Time in its NBT.", - "A = 10, B = 11, C = 12, D = 13, E = 14, F = 15, just for Hexadecimal Space saving, since Redstone has only 4 Bits.", - "For implementing Loops you just need 1 Punch Card per Loop, these Cards can restart once they are finished, depending on how many other Cards there are in the Program Loop you inserted your Card into, since it will process them procedurally.", - "A Punch Card Processor can run up to four Loops, each with the length of seven Punch Cards, parallel.", - "Why does the Punch Card need Ink to be made, you ask? Because the empty one needs to have some lines on, and the for the punched one it prints the Code to execute in a human readable format on the Card."); - - GT_Utility.getWrittenBook( - "Manual_Microwave", - "Microwave Oven Manual", - "Kitchen Industries", - "Congratulations, you inserted a random seemingly empty Book into the Microwave and these Letters appeared out of nowhere.", - "You just got a Microwave Oven and asked yourself 'why do I even need it?'. It's simple, the Microwave can cook for just 128 EU and at an insane speed. Not even a normal E-furnace can do it that fast and cheap!", - "This is the cheapest and fastest way to cook for you. That is why the Microwave Oven can be found in almost every Kitchen (see www.youwannabuyakitchen.ly).", - "Long time exposure to Microwaves can cause Cancer, but we doubt Steve lives long enough to die because of that.", - "Do not insert any Metals. It might result in an Explosion.", - "Do not dry Animals with it. It will result in a Hot Dog, no matter which Animal you put into it.", - "Do not insert inflammable Objects. The Oven will catch on Fire.", - "Do not insert Explosives such as Eggs. Just don't."); - - GT_Log.out.println("GT_Mod: Register Items."); - - new GT_IntegratedCircuit_Item(); - new GT_MetaGenerated_Item_01(); - new GT_MetaGenerated_Item_02(); - new GT_MetaGenerated_Item_03(); - // GT_MetaGenerated_Item_98 is initialized in GT_Proxy.onPostLoad() because we need to wait for fluids to be - // registered. - // Pre-initialization needs to happen before then, though, because the cell icons get deleted at some point - // between load and post-load. - GT_MetaGenerated_Item_98.preInit(); - new GT_MetaGenerated_Item_99(); - new GT_MetaGenerated_Tool_01(); - new GT_FluidDisplayItem(); - new GT_WirelessHeadphones(); - - // Tiered recipe materials actually appear to be set in GT_MetaTileEntity_BasicMachine_GT_Recipe, making these - // unused - ItemList.Rotor_LV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Tin, 1L)); - ItemList.Rotor_MV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Bronze, 1L)); - ItemList.Rotor_HV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1L)); - ItemList.Rotor_EV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1L)); - ItemList.Rotor_IV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.TungstenSteel, 1L)); - - ItemList.VOLUMETRIC_FLASK.set(new GT_VolumetricFlask("Volumetric_Flask", "Volumetric flask", 1000)); - - Item tItem = (Item) GT_Utility.callConstructor( - "gregtech.common.items.GT_SensorCard_Item", - 0, - null, - false, - new Object[] { "sensorcard", "GregTech Sensor Card" }); - ItemList.NC_SensorCard.set( - tItem == null ? new GT_Generic_Item("sensorcard", "GregTech Sensor Card", "Nuclear Control not installed") - : tItem); - - Item advSensorCard = (Item) GT_Utility - .callConstructor("gregtech.common.items.GT_AdvancedSensorCard_Item", 0, null, false); - ItemList.NC_AdvancedSensorCard.set( - advSensorCard == null - ? new GT_Generic_Item( - "advancedsensorcard", - "GregTech Advanced Sensor Card", - "Nuclear Control not installed") - : advSensorCard); - - ItemList.Neutron_Reflector - .set(new GT_NeutronReflector_Item("neutronreflector", "Iridium Neutron Reflector", 0)); - ItemList.Reactor_Coolant_He_1 - .set(GregTech_API.constructCoolantCellItem("60k_Helium_Coolantcell", "60k He Coolant Cell", 60000)); - ItemList.Reactor_Coolant_He_3 - .set(GregTech_API.constructCoolantCellItem("180k_Helium_Coolantcell", "180k He Coolant Cell", 180000)); - ItemList.Reactor_Coolant_He_6 - .set(GregTech_API.constructCoolantCellItem("360k_Helium_Coolantcell", "360k He Coolant Cell", 360000)); - ItemList.Reactor_Coolant_NaK_1 - .set(GregTech_API.constructCoolantCellItem("60k_NaK_Coolantcell", "60k NaK Coolantcell", 60000)); - ItemList.Reactor_Coolant_NaK_3 - .set(GregTech_API.constructCoolantCellItem("180k_NaK_Coolantcell", "180k NaK Coolantcell", 180000)); - ItemList.Reactor_Coolant_NaK_6 - .set(GregTech_API.constructCoolantCellItem("360k_NaK_Coolantcell", "360k NaK Coolantcell", 360000)); - - ItemList.Reactor_Coolant_Sp_1 - .set(GregTech_API.constructCoolantCellItem("180k_Space_Coolantcell", "180k Sp Coolant Cell", 180000)); - - ItemList.Reactor_Coolant_Sp_2 - .set(GregTech_API.constructCoolantCellItem("360k_Space_Coolantcell", "360k Sp Coolant Cell", 360000)); - - ItemList.Reactor_Coolant_Sp_3 - .set(GregTech_API.constructCoolantCellItem("540k_Space_Coolantcell", "540k Sp Coolant Cell", 540000)); - - ItemList.Reactor_Coolant_Sp_6 - .set(GregTech_API.constructCoolantCellItem("1080k_Space_Coolantcell", "1080k Sp Coolant Cell", 1080000)); - - ItemList.GlowstoneCell.set( - new GT_BreederCell_Item( - "glowstoneCell", - "Glowstone Fuel Rod", - "Source of sunnarium", - 3000, - 1, - 10000, - () -> ItemList.SunnariumCell.get(1))); - ItemList.SunnariumCell.set(new GT_DepletetCell_Item("sunnariumCell", "Sunnarium Fuel Rod", 1)); - - ItemList.neutroniumHeatCapacitor.set( - GregTech_API - .constructCoolantCellItem("neutroniumHeatCapacitor", "1G Neutronium Heat Capacitor", 1000000000)); - - ItemList.Depleted_Thorium_1.set(new GT_DepletetCell_Item("ThoriumcellDep", "Fuel Rod (Depleted Thorium)", 1)); - ItemList.Depleted_Thorium_2 - .set(new GT_DepletetCell_Item("Double_ThoriumcellDep", "Dual Fuel Rod (Depleted Thorium)", 1)); // TODO - // CHECK - // num - ItemList.Depleted_Thorium_4 - .set(new GT_DepletetCell_Item("Quad_ThoriumcellDep", "Quad Fuel Rod (Depleted Thorium)", 1)); // TODO - // CHECK - // num - ItemList.ThoriumCell_1.set( - new GT_RadioactiveCellIC_Item( - "Thoriumcell", - "Fuel Rod (Thorium)", - 1, - 50000, - 0.4F, - 0, - 0.25F, - ItemList.Depleted_Thorium_1.get(1), - false)); - ItemList.ThoriumCell_2.set( - new GT_RadioactiveCellIC_Item( - "Double_Thoriumcell", - "Dual Fuel Rod (Thorium)", - 2, - 50000, - 0.4F, - 0, - 0.25F, - ItemList.Depleted_Thorium_2.get(1), - false)); - ItemList.ThoriumCell_4.set( - new GT_RadioactiveCellIC_Item( - "Quad_Thoriumcell", - "Quad Fuel Rod (Thorium)", - 4, - 50000, - 0.4F, - 0, - 0.25F, - ItemList.Depleted_Thorium_4.get(1), - false)); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_Thorium_1.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lutetium, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 1L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L)) - .duration(25 * SECONDS) - .eut(48) - .addTo(thermalCentrifugeRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_Thorium_2.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 1L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3L)) - .duration(25 * SECONDS) - .eut(48) - .addTo(thermalCentrifugeRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_Thorium_4.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 6L)) - .duration(25 * SECONDS) - .eut(48) - .addTo(thermalCentrifugeRecipes); - - ItemList.Depleted_Naquadah_1 - .set(new GT_DepletetCell_Item("NaquadahcellDep", "Fuel Rod (Depleted Naquadah)", 1)); - ItemList.Depleted_Naquadah_2 - .set(new GT_DepletetCell_Item("Double_NaquadahcellDep", "Dual Fuel Rod (Depleted Naquadah)", 1)); - ItemList.Depleted_Naquadah_4 - .set(new GT_DepletetCell_Item("Quad_NaquadahcellDep", "Quad Fuel Rod (Depleted Naquadah)", 1)); - ItemList.NaquadahCell_1.set( - new GT_RadioactiveCellIC_Item( - "Naquadahcell", - "Fuel Rod (Naquadah)", - 1, - 100000, - 4F, - 1, - 1F, - ItemList.Depleted_Naquadah_1.get(1), - false)); - ItemList.NaquadahCell_2.set( - new GT_RadioactiveCellIC_Item( - "Double_Naquadahcell", - "Dual Fuel Rod (Naquadah)", - 2, - 100000, - 4F, - 1, - 1F, - ItemList.Depleted_Naquadah_2.get(1), - false)); - ItemList.NaquadahCell_4.set( - new GT_RadioactiveCellIC_Item( - "Quad_Naquadahcell", - "Quad Fuel Rod (Naquadah)", - 4, - 100000, - 4F, - 1, - 1F, - ItemList.Depleted_Naquadah_4.get(1), - false)); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_Naquadah_1.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), - GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Naquadria, 2L), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 8L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L)) - .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) - .duration(25 * SECONDS) - .eut(TierEU.RECIPE_EV) - .addTo(centrifugeRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_Naquadah_2.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1L), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 18L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 2L)) - .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) - .duration(50 * SECONDS) - .eut(TierEU.RECIPE_EV) - .addTo(centrifugeRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_Naquadah_4.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 2L), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 8L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 38L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L)) - .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) - .duration(100 * SECONDS) - .eut(TierEU.RECIPE_EV) - .addTo(centrifugeRecipes); - - ItemList.Depleted_MNq_1.set(new GT_DepletetCell_Item("MNqCellDep", "Fuel Rod (Depleted Nq*)", 1)); - ItemList.Depleted_MNq_2.set(new GT_DepletetCell_Item("Double_MNqCellDep", "Dual Fuel Rod (Depleted Nq*)", 1)); - ItemList.Depleted_MNq_4.set(new GT_DepletetCell_Item("Quad_MNqCellDep", "Quad Fuel Rod (Depleted Nq*)", 1)); - ItemList.MNqCell_1.set( - new GT_RadioactiveCellIC_Item( - "MNqCell", - "Fuel Rod (Nq* - MOX like behaviour)", - 1, - 100000, - 4F, - 1, - 1F, - ItemList.Depleted_MNq_1.get(1), - true)); - ItemList.MNqCell_2.set( - new GT_RadioactiveCellIC_Item( - "Double_MNqCell", - "Dual Fuel Rod (Nq* - MOX like behaviour)", - 2, - 100000, - 4F, - 1, - 1F, - ItemList.Depleted_MNq_2.get(1), - true)); - ItemList.MNqCell_4.set( - new GT_RadioactiveCellIC_Item( - "Quad_MNqCell", - "Quad Fuel Rod (Nq* - MOX like behaviour)", - 4, - 100000, - 4F, - 1, - 1F, - ItemList.Depleted_MNq_4.get(1), - true)); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_MNq_1.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), - GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.NaquadahEnriched, 2L), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 8L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L)) - .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) - .duration(25 * SECONDS) - .eut(TierEU.RECIPE_EV) - .addTo(centrifugeRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_MNq_2.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 1L), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 18L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 2L)) - .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) - .duration(50 * SECONDS) - .eut(TierEU.RECIPE_EV) - .addTo(centrifugeRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(ItemList.Depleted_MNq_4.get(1)) - .itemOutputs( - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 2L), - GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 8L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 38L), - GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L)) - .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) - .duration(100 * SECONDS) - .eut(TierEU.RECIPE_EV) - .addTo(centrifugeRecipes); - - ItemList.Uraniumcell_1.set( - new GT_RadioactiveCellIC_Item( - "reactorUraniumSimple", - "Fuel Rod (Uranium)", - 1, - 20000, - 2F, - 1, - 1F, - GT_ModHandler.getIC2Item("reactorDepletedUraniumSimple", 1), - false)); - ItemList.Uraniumcell_2.set( - new GT_RadioactiveCellIC_Item( - "reactorUraniumDual", - "Dual Fuel Rod (Uranium)", - 2, - 20000, - 2F, - 1, - 1F, - GT_ModHandler.getIC2Item("reactorDepletedUraniumDual", 1), - false)); - ItemList.Uraniumcell_4.set( - new GT_RadioactiveCellIC_Item( - "reactorUraniumQuad", - "Quad Fuel Rod (Uranium)", - 4, - 20000, - 2F, - 1, - 1F, - GT_ModHandler.getIC2Item("reactorDepletedUraniumQuad", 1), - false)); - ItemList.Moxcell_1.set( - new GT_RadioactiveCellIC_Item( - "reactorMOXSimple", - "Fuel Rod (Mox)", - 1, - 10000, - 2F, - 1, - 1F, - GT_ModHandler.getIC2Item("reactorDepletedMOXSimple", 1), - true)); - ItemList.Moxcell_2.set( - new GT_RadioactiveCellIC_Item( - "reactorMOXDual", - "Dual Fuel Rod (Mox)", - 2, - 10000, - 2F, - 1, - 1F, - GT_ModHandler.getIC2Item("reactorDepletedMOXDual", 1), - true)); - ItemList.Moxcell_4.set( - new GT_RadioactiveCellIC_Item( - "reactorMOXQuad", - "Quad Fuel Rod (Mox)", - 4, - 10000, - 2F, - 1, - 1F, - GT_ModHandler.getIC2Item("reactorDepletedMOXQuad", 1), - true)); - - GT_Log.out.println("GT_Mod: Adding Blocks."); - GregTech_API.sBlockMachines = new GT_Block_Machines(); - GregTech_API.sBlockCasings1 = new GT_Block_Casings1(); - GregTech_API.sBlockCasings2 = new GT_Block_Casings2(); - GregTech_API.sBlockCasings3 = new GT_Block_Casings3(); - GregTech_API.sBlockCasings4 = new GT_Block_Casings4(); - GregTech_API.sBlockCasings5 = new GT_Block_Casings5(); - GregTech_API.sBlockCasings6 = new GT_Block_Casings6(); - GregTech_API.sBlockCasings8 = new GT_Block_Casings8(); - GregTech_API.sBlockCasings9 = new GT_Block_Casings9(); - GregTech_API.sBlockCasings10 = new GT_Block_Casings10(); - GregTech_API.sBlockCasings11 = new GT_Block_Casings11(); - GregTech_API.sBlockGranites = new GT_Block_Granites(); - GregTech_API.sBlockLongDistancePipes = new GT_Block_LongDistancePipe(); - GregTech_API.sBlockConcretes = new GT_Block_Concretes(); - GregTech_API.sBlockStones = new GT_Block_Stones(); - GregTech_API.sBlockOres1 = new GT_Block_Ores(); - GregTech_API.sBlockFrames = new GT_Block_FrameBox(); - GregTech_API.sDroneRender = new GT_Block_Drone(); - GregTech_API.sBlockGlass1 = new GT_Block_Glass1(); - GregTech_API.sBlockTintedGlass = new GT_Block_TintedIndustrialGlass(); - GregTech_API.sLaserRender = new GT_Block_Laser(); - GregTech_API.sWormholeRender = new GT_WormholeRenderBlock(); - - // meta ID order, DO NOT CHANGE ORDER - - GregTech_API.sBlockMetal1 = new GT_Block_Metal( - "gt.blockmetal1", - new Materials[] { Materials.Adamantium, Materials.Aluminium, Materials.Americium, Materials.AnnealedCopper, - Materials.Antimony, Materials.Arsenic, Materials.AstralSilver, Materials.BatteryAlloy, - Materials.Beryllium, Materials.Bismuth, Materials.BismuthBronze, Materials.BlackBronze, - Materials.BlackSteel, Materials.BlueAlloy, Materials.BlueSteel, Materials.Brass }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS1); - - GregTech_API.sBlockMetal2 = new GT_Block_Metal( - "gt.blockmetal2", - new Materials[] { Materials.Bronze, Materials.Caesium, Materials.Cerium, Materials.Chrome, - Materials.ChromiumDioxide, Materials.Cobalt, Materials.CobaltBrass, Materials.Copper, - Materials.Cupronickel, Materials.DamascusSteel, Materials.DarkIron, Materials.DeepIron, Materials.Desh, - Materials.Duranium, Materials.Dysprosium, Materials.Electrum }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS2); - - GregTech_API.sBlockMetal3 = new GT_Block_Metal( - "gt.blockmetal3", - new Materials[] { Materials.ElectrumFlux, Materials.Enderium, Materials.Erbium, Materials.Europium, - Materials.FierySteel, Materials.Gadolinium, Materials.Gallium, Materials.Holmium, Materials.HSLA, - Materials.Indium, Materials.InfusedGold, Materials.Invar, Materials.Iridium, Materials.IronMagnetic, - Materials.IronWood, Materials.Kanthal }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS3); - - GregTech_API.sBlockMetal4 = new GT_Block_Metal( - "gt.blockmetal4", - new Materials[] { Materials.Knightmetal, Materials.Lanthanum, Materials.Lead, Materials.Lutetium, - Materials.Magnalium, Materials.Magnesium, Materials.Manganese, Materials.MeteoricIron, - Materials.MeteoricSteel, Materials.Trinium, Materials.Mithril, Materials.Molybdenum, Materials.Naquadah, - Materials.NaquadahAlloy, Materials.NaquadahEnriched, Materials.Naquadria }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS4); - - GregTech_API.sBlockMetal5 = new GT_Block_Metal( - "gt.blockmetal5", - new Materials[] { Materials.Neodymium, Materials.NeodymiumMagnetic, Materials.Neutronium, - Materials.Nichrome, Materials.Nickel, Materials.Niobium, Materials.NiobiumNitride, - Materials.NiobiumTitanium, Materials.Osmiridium, Materials.Osmium, Materials.Palladium, - Materials.PigIron, Materials.Platinum, Materials.Plutonium, Materials.Plutonium241, - Materials.Praseodymium }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS5); - - GregTech_API.sBlockMetal6 = new GT_Block_Metal( - "gt.blockmetal6", - new Materials[] { Materials.Promethium, Materials.RedAlloy, Materials.RedSteel, Materials.RoseGold, - Materials.Rubidium, Materials.Samarium, Materials.Scandium, Materials.ShadowIron, Materials.ShadowSteel, - Materials.Silicon, Materials.Silver, Materials.SolderingAlloy, Materials.StainlessSteel, - Materials.Steel, Materials.SteelMagnetic, Materials.SterlingSilver }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS6); - - GregTech_API.sBlockMetal7 = new GT_Block_Metal( - "gt.blockmetal7", - new Materials[] { Materials.Sunnarium, Materials.Tantalum, Materials.Tellurium, Materials.Terbium, - Materials.Thaumium, Materials.Thorium, Materials.Thulium, Materials.Tin, Materials.TinAlloy, - Materials.Titanium, Materials.Tritanium, Materials.Tungsten, Materials.TungstenSteel, Materials.Ultimet, - Materials.Uranium, Materials.Uranium235 }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS7); - - GregTech_API.sBlockMetal8 = new GT_Block_Metal( - "gt.blockmetal8", - new Materials[] { Materials.Vanadium, Materials.VanadiumGallium, Materials.WroughtIron, Materials.Ytterbium, - Materials.Yttrium, Materials.YttriumBariumCuprate, Materials.Zinc, Materials.TungstenCarbide, - Materials.VanadiumSteel, Materials.HSSG, Materials.HSSE, Materials.HSSS, Materials.Steeleaf, - Materials.Ichorium, Materials.Firestone, Materials.Shadow }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS8); - - GregTech_API.sBlockGem1 = new GT_Block_Metal( - "gt.blockgem1", - new Materials[] { Materials.InfusedAir, Materials.Amber, Materials.Amethyst, Materials.InfusedWater, - Materials.BlueTopaz, Materials.CertusQuartz, Materials.Dilithium, Materials.EnderEye, - Materials.EnderPearl, Materials.FoolsRuby, Materials.Force, Materials.Forcicium, Materials.Forcillium, - Materials.GreenSapphire, Materials.InfusedFire, Materials.Jasper }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS9); - - GregTech_API.sBlockGem2 = new GT_Block_Metal( - "gt.blockgem2", - new Materials[] { Materials.Lazurite, Materials.Lignite, Materials.Monazite, Materials.Niter, - Materials.Olivine, Materials.Opal, Materials.InfusedOrder, Materials.InfusedEntropy, - Materials.TricalciumPhosphate, Materials.Quartzite, Materials.GarnetRed, Materials.Ruby, - Materials.Sapphire, Materials.Sodalite, Materials.Tanzanite, Materials.InfusedEarth }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS10); - - GregTech_API.sBlockGem3 = new GT_Block_Metal( - "gt.blockgem3", - new Materials[] { Materials.Topaz, Materials.Vinteum, Materials.GarnetYellow, Materials.NetherStar, - Materials.Charcoal, Materials.Blaze }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS11); - - GregTech_API.sBlockMetal9 = new GT_Block_Metal( - "gt.blockmetal9", - new Materials[] { Materials.Cryolite, Materials.SiliconSG, MaterialsKevlar.NickelAluminide, - MaterialsUEVplus.SpaceTime, MaterialsUEVplus.TranscendentMetal, Materials.Oriharukon, - MaterialsUEVplus.WhiteDwarfMatter, MaterialsUEVplus.BlackDwarfMatter, MaterialsUEVplus.Universium, - MaterialsUEVplus.Eternity, MaterialsUEVplus.MagMatter, MaterialsUEVplus.SixPhasedCopper }, - OrePrefixes.block, - gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS12); - - GregTech_API.sBlockReinforced = new GT_Block_Reinforced("gt.blockreinforced"); - - GT_Log.out.println("GT_Mod: Register TileEntities."); - - BaseMetaTileEntity tBaseMetaTileEntity = GregTech_API.constructBaseMetaTileEntity(); - - GT_Log.out.println("GT_Mod: Registering the BaseMetaTileEntity."); - GameRegistry.registerTileEntity(tBaseMetaTileEntity.getClass(), "BaseMetaTileEntity"); - FMLInterModComms.sendMessage( - AppliedEnergistics2.ID, - "whitelist-spatial", - tBaseMetaTileEntity.getClass() - .getName()); - - GT_Log.out.println("GT_Mod: Registering the DroneRender."); - GameRegistry.registerTileEntity(TileDrone.class, "DroneRender"); - - GT_Log.out.println("GT_Mod: Registering the LaserRender."); - GameRegistry.registerTileEntity(TileLaser.class, "LaserRenderer"); - - GT_Log.out.println("GT_Mod: Registering the WormholeRender."); - GameRegistry.registerTileEntity(TileWormhole.class, "WormholeRender"); - - GT_Log.out.println("GT_Mod: Registering the BaseMetaPipeEntity."); - GameRegistry.registerTileEntity(BaseMetaPipeEntity.class, "BaseMetaPipeEntity"); - FMLInterModComms.sendMessage(AppliedEnergistics2.ID, "whitelist-spatial", BaseMetaPipeEntity.class.getName()); - - GT_Log.out.println("GT_Mod: Registering the Ore TileEntity."); - GameRegistry.registerTileEntity(GT_TileEntity_Ores.class, "GT_TileEntity_Ores"); - FMLInterModComms.sendMessage(AppliedEnergistics2.ID, "whitelist-spatial", GT_TileEntity_Ores.class.getName()); - - GT_Log.out.println("GT_Mod: Registering Fluids."); - Materials.ConstructionFoam.mFluid = GT_Utility - .getFluidForFilledItem(GT_ModHandler.getIC2Item("CFCell", 1L), true) - .getFluid(); - Materials.UUMatter.mFluid = GT_Utility.getFluidForFilledItem(GT_ModHandler.getIC2Item("uuMatterCell", 1L), true) - .getFluid(); - - GT_FluidFactory.builder("Air") - .withLocalizedName("Air") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Air) - .registerContainers(ItemList.Cell_Air.get(1L), ItemList.Cell_Empty.get(1L), 2000); - GT_FluidFactory.builder("LiquidOxygen") - .withLocalizedName("Liquid Oxygen") - .withStateAndTemperature(GAS, 60) - .buildAndRegister() - .configureMaterials(Materials.LiquidOxygen) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidOxygen, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("LiquidNitrogen") - .withLocalizedName("Liquid Nitrogen") - .withStateAndTemperature(GAS, 77) - .buildAndRegister() - .configureMaterials(Materials.LiquidNitrogen) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidNitrogen, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("LiquidAir") - .withLocalizedName("Liquid Air") - .withStateAndTemperature(LIQUID, 77) - .buildAndRegister() - .configureMaterials(Materials.LiquidAir) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidAir, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Oxygen") - .withLocalizedName("Oxygen") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Oxygen) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Hydrogen") - .withLocalizedName("Hydrogen") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Hydrogen) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Deuterium") - .withLocalizedName("Deuterium") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Deuterium) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Deuterium, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Tritium") - .withLocalizedName("Tritium") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Tritium) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Tritium, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Helium") - .withLocalizedName("Helium") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Helium) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Helium, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Argon") - .withLocalizedName("Argon") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Argon) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Argon, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Radon") - .withLocalizedName("Radon") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Radon) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Radon, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("Fluorine") - .withLocalizedName("Fluorine") - .withStateAndTemperature(GAS, 53) - .buildAndRegister() - .configureMaterials(Materials.Fluorine) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fluorine, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Titaniumtetrachloride") - .withLocalizedName("Titaniumtetrachloride") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Titaniumtetrachloride) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Titaniumtetrachloride, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Helium-3") - .withLocalizedName("Helium-3") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Helium_3) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Helium_3, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Methane") - .withLocalizedName("Methane") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Methane) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Methane, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Nitrogen") - .withLocalizedName("Nitrogen") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Nitrogen) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("NitrogenDioxide") - .withLocalizedName("Nitrogen Dioxide") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.NitrogenDioxide) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitrogenDioxide, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Steam") - .withLocalizedName("Steam") - .withStateAndTemperature(GAS, 375) - .buildAndRegister() - .configureMaterials(Materials.Water) - .registerBContainers(GT_ModHandler.getIC2Item("steamCell", 1), Materials.Empty.getCells(1)); - - GT_Values.RA.stdBuilder() - .itemInputs(Materials.Empty.getCells(1)) - .itemOutputs(GT_ModHandler.getIC2Item("steamCell", 1)) - .fluidInputs(GT_ModHandler.getSteam(1000)) - .duration(16 * TICKS) - .eut(1) - .addTo(fluidCannerRecipes); - - Materials.Ice.mGas = Materials.Water.mGas; - Materials.Water.mGas.setTemperature(375) - .setGaseous(true); - - ItemList.sOilExtraHeavy = GT_FluidFactory.of("liquid_extra_heavy_oil", "Very Heavy Oil", LIQUID, 295); - ItemList.sEpichlorhydrin = GT_FluidFactory.builder("liquid_epichlorhydrin") - .withLocalizedName("Epichlorohydrin") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Epichlorohydrin) - .registerBContainers(Materials.Epichlorohydrin.getCells(1), Materials.Empty.getCells(1)) - .asFluid(); - ItemList.sDrillingFluid = GT_FluidFactory.of("liquid_drillingfluid", "Drilling Fluid", LIQUID, 295); - ItemList.sToluene = GT_FluidFactory.builder("liquid_toluene") - .withLocalizedName("Toluene") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Toluene) - .registerBContainers(Materials.Toluene.getCells(1), Materials.Empty.getCells(1)) - .asFluid(); - ItemList.sNitrationMixture = GT_FluidFactory.builder("liquid_nitrationmixture") - .withLocalizedName("Nitration Mixture") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.NitrationMixture) - .registerBContainers(Materials.NitrationMixture.getCells(1), Materials.Empty.getCells(1)) - .asFluid(); - - GT_FluidFactory.builder("liquid_heavy_oil") - .withLocalizedName("Heavy Oil") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.OilHeavy) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.OilHeavy, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_medium_oil") - .withLocalizedName("Raw Oil") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.OilMedium) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.OilMedium, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_light_oil") - .withLocalizedName("Light Oil") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.OilLight) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.OilLight, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("gas_natural_gas") - .withLocalizedName("Natural Gas") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.NatruralGas) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NatruralGas, 1L), - ItemList.Cell_Empty.get(1L)); - ItemList.sHydricSulfur = GT_FluidFactory.builder("liquid_hydricsulfur") - .withLocalizedName("Hydrogen Sulfide") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.HydricSulfide) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1L), - ItemList.Cell_Empty.get(1L)) - .asFluid(); - GT_FluidFactory.builder("gas_sulfuricgas") - .withLocalizedName("Sulfuric Gas") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.SulfuricGas) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricGas, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("gas_gas") - .withLocalizedName("Refinery Gas") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Gas) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_sulfuricnaphtha") - .withLocalizedName("Sulfuric Naphtha") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.SulfuricNaphtha) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricNaphtha, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_sufluriclight_fuel") - .withLocalizedName("Sulfuric Light Fuel") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.SulfuricLightFuel) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricLightFuel, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_sulfuricheavy_fuel") - .withLocalizedName("Sulfuric Heavy Fuel") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.SulfuricHeavyFuel) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricHeavyFuel, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_naphtha") - .withLocalizedName("Naphtha") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Naphtha) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Naphtha, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_light_fuel") - .withLocalizedName("Light Fuel") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.LightFuel) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_heavy_fuel") - .withLocalizedName("Heavy Fuel") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.HeavyFuel) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("liquid_lpg") - .withLocalizedName("LPG") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.LPG) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LPG, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("charcoal_byproducts") - .withTextureName("molten.autogenerated") - .withLocalizedName("Charcoal Byproducts") - .withColorRGBA(Materials.CharcoalByproducts.mRGBa) - .withStateAndTemperature(GAS, 775) - .buildAndRegister() - .configureMaterials(Materials.CharcoalByproducts) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.CharcoalByproducts, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("molten.bisphenol_a") - .withTextureName("molten.autogenerated") - .withLocalizedName("Molten Bisphenol A") - .withColorRGBA(Materials.BisphenolA.mRGBa) - .withStateAndTemperature(LIQUID, 432) - .buildAndRegister() - .configureMaterials(Materials.BisphenolA) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.BisphenolA, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("UUAmplifier") - .withLocalizedName("UU Amplifier") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.UUAmplifier) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.UUAmplifier, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Chlorine") - .withLocalizedName("Chlorine") - .withStateAndTemperature(GAS, 295) - .buildAndRegister() - .configureMaterials(Materials.Chlorine) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Mercury") - .withLocalizedName("Mercury") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Mercury) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Mercury, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("NitroFuel") - .withLocalizedName("Cetane-Boosted Diesel") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.NitroFuel) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitroFuel, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("SodiumPersulfate") - .withLocalizedName("Sodium Persulfate") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.SodiumPersulfate) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SodiumPersulfate, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("Glyceryl") - .withLocalizedName("Glyceryl Trinitrate") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Glyceryl) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Glyceryl, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("lubricant") - .withLocalizedName("Lubricant") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Lubricant) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Lubricant, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("creosote") - .withLocalizedName("Creosote Oil") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Creosote) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Creosote, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("seedoil") - .withLocalizedName("Seed Oil") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.SeedOil) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SeedOil, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("fishoil") - .withLocalizedName("Fish Oil") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.FishOil) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.FishOil, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("oil") - .withLocalizedName("Oil") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Oil) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oil, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("fuel") - .withLocalizedName("Diesel") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Fuel) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("for.honey") - .withLocalizedName("Honey") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Honey) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Honey, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("biomass") - .withLocalizedName("Biomass") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Biomass) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Biomass, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("bioethanol") - .withLocalizedName("Bio Ethanol") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Ethanol) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ethanol, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("sulfuricacid") - .withLocalizedName("Sulfuric Acid") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.SulfuricAcid) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("milk") - .withLocalizedName("Milk") - .withStateAndTemperature(LIQUID, 290) - .buildAndRegister() - .configureMaterials(Materials.Milk) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Milk, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("mcguffium") - .withLocalizedName("Mc Guffium 239") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.McGuffium239) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.McGuffium239, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("refinedGlue") - .withLocalizedName("Refined Glue") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Glue) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Glue, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("hotfryingoil") - .withLocalizedName("Hot Frying Oil") - .withStateAndTemperature(LIQUID, 400) - .buildAndRegister() - .configureMaterials(Materials.FryingOilHot) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.FryingOilHot, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("DimensionallyTranscendentResidue") - .withLocalizedName("Dimensionally Transcendent Residue") - .withStateAndTemperature(LIQUID, 2000000000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.DimensionallyTranscendentResidue) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.DimensionallyTranscendentResidue, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("ExcitedDTCC") - .withLocalizedName("Excited Dimensionally Transcendent Crude Catalyst") - .withStateAndTemperature(LIQUID, 500000000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.ExcitedDTCC) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTCC, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("ExcitedDTPC") - .withLocalizedName("Excited Dimensionally Transcendent Prosaic Catalyst") - .withStateAndTemperature(LIQUID, 500000000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.ExcitedDTPC) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTPC, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("ExcitedDTRC") - .withLocalizedName("Excited Dimensionally Transcendent Resplendent Catalyst") - .withStateAndTemperature(LIQUID, 500000000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.ExcitedDTRC) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTRC, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("ExcitedDTEC") - .withLocalizedName("Excited Dimensionally Transcendent Exotic Catalyst") - .withStateAndTemperature(LIQUID, 500000000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.ExcitedDTEC) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTEC, 1L), - ItemList.Cell_Empty.get(1L)); - GT_FluidFactory.builder("ExcitedDTSC") - .withLocalizedName("Excited Dimensionally Transcendent Stellar Catalyst") - .withStateAndTemperature(LIQUID, 500000000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.ExcitedDTSC) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTSC, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder(MaterialsUEVplus.RawStarMatter.mName) - .withLocalizedName(MaterialsUEVplus.RawStarMatter.mLocalizedName) - .withStateAndTemperature(LIQUID, 10_000_000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.RawStarMatter) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.RawStarMatter, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder(MaterialsUEVplus.Space.mName) - .withLocalizedName(MaterialsUEVplus.Space.mLocalizedName) - .withStateAndTemperature(MOLTEN, 0) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.Space) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Space, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder(MaterialsUEVplus.Time.mName) - .withLocalizedName(MaterialsUEVplus.Time.mLocalizedName) - .withStateAndTemperature(MOLTEN, 0) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.Time) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Time, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("PrimordialMatter") - .withLocalizedName(MaterialsUEVplus.PrimordialMatter.mLocalizedName) - .withStateAndTemperature(LIQUID, 2_000_000_000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.PrimordialMatter) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PrimordialMatter, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("QuarkGluonPlasma") - .withLocalizedName(MaterialsUEVplus.QuarkGluonPlasma.mLocalizedName) - .withStateAndTemperature(LIQUID, 2_000_000_000) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.QuarkGluonPlasma) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.QuarkGluonPlasma, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("PhononMedium") - .withLocalizedName(MaterialsUEVplus.PhononMedium.mLocalizedName) - .withStateAndTemperature(LIQUID, 500) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.PhononMedium) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PhononMedium, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("PhononCrystalSolution") - .withLocalizedName(MaterialsUEVplus.PhononCrystalSolution.mLocalizedName) - .withStateAndTemperature(LIQUID, 500) - .buildAndRegister() - .configureMaterials(MaterialsUEVplus.PhononCrystalSolution) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PhononCrystalSolution, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("fieryblood") - .withLocalizedName("Fiery Blood") - .withStateAndTemperature(LIQUID, 6400) - .buildAndRegister() - .configureMaterials(Materials.FierySteel) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.FierySteel, 1L), - ItemList.Cell_Empty.get(1L)); - - GT_FluidFactory.builder("holywater") - .withLocalizedName("Holy Water") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.HolyWater) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HolyWater, 1L), - ItemList.Cell_Empty.get(1L)); - if (ItemList.TF_Vial_FieryBlood.get(1L) != null) { - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.FierySteel.getFluid(250L), - ItemList.TF_Vial_FieryBlood.get(1L), - ItemList.Bottle_Empty.get(1L))); - } - - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.Milk.getFluid(1000L), - GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Milk, 1L), - GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L))); - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.Milk.getFluid(250L), - ItemList.Bottle_Milk.get(1L), - ItemList.Bottle_Empty.get(1L))); - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.HolyWater.getFluid(250L), - ItemList.Bottle_Holy_Water.get(1L), - ItemList.Bottle_Empty.get(1L))); - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.McGuffium239.getFluid(250L), - ItemList.McGuffium_239.get(1L), - ItemList.Bottle_Empty.get(1L))); - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.Fuel.getFluid(100L), - ItemList.Tool_Lighter_Invar_Full.get(1L), - ItemList.Tool_Lighter_Invar_Empty.get(1L))); - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - Materials.Fuel.getFluid(1000L), - ItemList.Tool_Lighter_Platinum_Full.get(1L), - ItemList.Tool_Lighter_Platinum_Empty.get(1L))); - - Dyes.dyeBlack.addFluidDye(GT_FluidFactory.of("squidink", "Squid Ink", LIQUID, 295)); - Dyes.dyeBlue.addFluidDye(GT_FluidFactory.of("indigo", "Indigo Dye", LIQUID, 295)); - for (byte i = 0; i < Dyes.VALUES.length; i = (byte) (i + 1)) { - Dyes tDye = Dyes.VALUES[i]; - tDye.addFluidDye( - GT_FluidFactory.builder( - "dye.watermixed." + tDye.name() - .toLowerCase(Locale.ENGLISH)) - .withTextureName("dyes") - .withLocalizedName("Water Mixed " + tDye.mName + " Dye") - .withColorRGBA(tDye.getRGBA()) - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .asFluid()); - tDye.addFluidDye( - GT_FluidFactory.builder( - "dye.chemical." + tDye.name() - .toLowerCase(Locale.ENGLISH)) - .withTextureName("dyes") - .withLocalizedName("Chemical " + tDye.mName + " Dye") - .withColorRGBA(tDye.getRGBA()) - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerContainers(ItemList.SPRAY_CAN_DYES[i].get(1L), ItemList.Spray_Empty.get(1L), 2304) - .asFluid()); - } - GT_FluidFactory.builder("ice") - .withLocalizedName("Crushed Ice") - .withStateAndTemperature(SLURRY, 270) - .buildAndRegister() - .configureMaterials(Materials.Ice) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ice, 1L), - ItemList.Cell_Empty.get(1L)); - Materials.Water.mSolid = Materials.Ice.mSolid; - - GT_FluidFactory.builder("molten.glass") - .withLocalizedName("Molten Glass") - .withStateAndTemperature(MOLTEN, 1500) - .buildAndRegister() - .configureMaterials(Materials.Glass) - .registerContainers( - GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Glass, 1L), - ItemList.Cell_Empty.get(1L), - 144); - GT_FluidFactory.builder("molten.redstone") - .withLocalizedName("Molten Redstone") - .withStateAndTemperature(MOLTEN, 500) - .buildAndRegister() - .configureMaterials(Materials.Redstone) - .registerContainers( - GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Redstone, 1L), - ItemList.Cell_Empty.get(1L), - 144); - GT_FluidFactory.builder("molten.blaze") - .withLocalizedName("Molten Blaze") - .withStateAndTemperature(MOLTEN, 6400) - .buildAndRegister() - .configureMaterials(Materials.Blaze) - .registerContainers( - GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Blaze, 1L), - ItemList.Cell_Empty.get(1L), - 144); - GT_FluidFactory.builder("wet.concrete") - .withLocalizedName("Wet Concrete") - .withStateAndTemperature(MOLTEN, 300) - .buildAndRegister() - .configureMaterials(Materials.Concrete) - .registerContainers( - GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Concrete, 1L), - ItemList.Cell_Empty.get(1L), - 144); - - for (Materials tMaterial : Materials.values()) { - if ((tMaterial.mStandardMoltenFluid == null) && (tMaterial.contains(SubTag.SMELTING_TO_FLUID)) - && (!tMaterial.contains(SubTag.NO_SMELTING))) { - GT_Mod.gregtechproxy.addAutogeneratedMoltenFluid(tMaterial); - if ((tMaterial.mSmeltInto != tMaterial) && (tMaterial.mSmeltInto.mStandardMoltenFluid == null)) { - GT_Mod.gregtechproxy.addAutogeneratedMoltenFluid(tMaterial.mSmeltInto); - } - } - if (tMaterial.mElement != null) { - GT_Mod.gregtechproxy.addAutogeneratedPlasmaFluid(tMaterial); - } - if (tMaterial.hasCorrespondingFluid()) { - GT_Mod.gregtechproxy.addAutoGeneratedCorrespondingFluid(tMaterial); - } - if (tMaterial.hasCorrespondingGas()) { - GT_Mod.gregtechproxy.addAutoGeneratedCorrespondingGas(tMaterial); - } - if (tMaterial.canBeCracked()) { - GT_Mod.gregtechproxy.addAutoGeneratedHydroCrackedFluids(tMaterial); - GT_Mod.gregtechproxy.addAutoGeneratedSteamCrackedFluids(tMaterial); - } - } - - GT_FluidFactory.builder("potion.awkward") - .withLocalizedName("Awkward Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.thick") - .withLocalizedName("Thick Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 32), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.mundane") - .withLocalizedName("Mundane Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 64), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.damage") - .withLocalizedName("Harming Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8204), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.damage.strong") - .withLocalizedName("Strong Harming Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8236), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.damage.splash") - .withLocalizedName("Splash Harming Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16396), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.damage.strong.splash") - .withLocalizedName("Strong Splash Harming Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16428), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.health") - .withLocalizedName("Healing Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8197), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.health.strong") - .withLocalizedName("Strong Healing Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8229), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.health.splash") - .withLocalizedName("Splash Healing Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16389), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.health.strong.splash") - .withLocalizedName("Strong Splash Healing Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16421), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.speed") - .withLocalizedName("Swiftness Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8194), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.speed.strong") - .withLocalizedName("Strong Swiftness Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8226), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.speed.long") - .withLocalizedName("Stretched Swiftness Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8258), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.speed.splash") - .withLocalizedName("Splash Swiftness Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16386), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.speed.strong.splash") - .withLocalizedName("Strong Splash Swiftness Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16418), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.speed.long.splash") - .withLocalizedName("Stretched Splash Swiftness Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16450), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.strength") - .withLocalizedName("Strength Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8201), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.strength.strong") - .withLocalizedName("Strong Strength Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8233), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.strength.long") - .withLocalizedName("Stretched Strength Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8265), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.strength.splash") - .withLocalizedName("Splash Strength Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16393), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.strength.strong.splash") - .withLocalizedName("Strong Splash Strength Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16425), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.strength.long.splash") - .withLocalizedName("Stretched Splash Strength Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16457), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.regen") - .withLocalizedName("Regenerating Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8193), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.regen.strong") - .withLocalizedName("Strong Regenerating Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8225), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.regen.long") - .withLocalizedName("Stretched Regenerating Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8257), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.regen.splash") - .withLocalizedName("Splash Regenerating Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16385), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.regen.strong.splash") - .withLocalizedName("Strong Splash Regenerating Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16417), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.regen.long.splash") - .withLocalizedName("Stretched Splash Regenerating Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16449), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.poison") - .withLocalizedName("Poisonous Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8196), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.poison.strong") - .withLocalizedName("Strong Poisonous Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8228), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.poison.long") - .withLocalizedName("Stretched Poisonous Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8260), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.poison.splash") - .withLocalizedName("Splash Poisonous Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16388), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.poison.strong.splash") - .withLocalizedName("Strong Splash Poisonous Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16420), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.poison.long.splash") - .withLocalizedName("Stretched Splash Poisonous Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16452), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.fireresistance") - .withLocalizedName("Fire Resistant Brew") - .withStateAndTemperature(LIQUID, 375) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8195), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.fireresistance.long") - .withLocalizedName("Stretched Fire Resistant Brew") - .withStateAndTemperature(LIQUID, 375) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8259), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.fireresistance.splash") - .withLocalizedName("Splash Fire Resistant Brew") - .withStateAndTemperature(LIQUID, 375) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16387), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.fireresistance.long.splash") - .withLocalizedName("Stretched Splash Fire Resistant Brew") - .withStateAndTemperature(LIQUID, 375) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16451), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.nightvision") - .withLocalizedName("Night Vision Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8198), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.nightvision.long") - .withLocalizedName("Stretched Night Vision Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8262), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.nightvision.splash") - .withLocalizedName("Splash Night Vision Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16390), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.nightvision.long.splash") - .withLocalizedName("Stretched Splash Night Vision Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16454), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.weakness") - .withLocalizedName("Weakening Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8200), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.weakness.long") - .withLocalizedName("Stretched Weakening Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8264), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.weakness.splash") - .withLocalizedName("Splash Weakening Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16392), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.weakness.long.splash") - .withLocalizedName("Stretched Splash Weakening Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16456), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.slowness") - .withLocalizedName("Lame Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8202), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.slowness.long") - .withLocalizedName("Stretched Lame Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8266), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.slowness.splash") - .withLocalizedName("Splash Lame Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16394), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.slowness.long.splash") - .withLocalizedName("Stretched Splash Lame Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16458), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.waterbreathing") - .withLocalizedName("Fishy Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8205), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.waterbreathing.long") - .withLocalizedName("Stretched Fishy Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8269), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.waterbreathing.splash") - .withLocalizedName("Splash Fishy Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16397), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.waterbreathing.long.splash") - .withLocalizedName("Stretched Splash Fishy Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16461), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.invisibility") - .withLocalizedName("Invisible Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8206), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.invisibility.long") - .withLocalizedName("Stretched Invisible Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 8270), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.invisibility.splash") - .withLocalizedName("Splash Invisible Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16398), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.invisibility.long.splash") - .withLocalizedName("Stretched Splash Invisible Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(new ItemStack(Items.potionitem, 1, 16462), ItemList.Bottle_Empty.get(1L)); - - GT_FluidFactory.builder("potion.purpledrink") - .withLocalizedName("Purple Drink") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Purple_Drink.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.grapejuice") - .withLocalizedName("Grape Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Grape_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.wine") - .withLocalizedName("Wine") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Wine.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.vinegar") - .withLocalizedName("Vinegar") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .configureMaterials(Materials.Vinegar) - .registerPContainers(ItemList.Bottle_Vinegar.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.potatojuice") - .withLocalizedName("Potato Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Potato_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.vodka") - .withLocalizedName("Vodka") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Vodka.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.leninade") - .withLocalizedName("Leninade") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Leninade.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.mineralwater") - .withLocalizedName("Mineral Water") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Mineral_Water.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.saltywater") - .withLocalizedName("Salty Water") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Salty_Water.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.reedwater") - .withLocalizedName("Reed Water") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Reed_Water.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.rum") - .withLocalizedName("Rum") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Rum.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.piratebrew") - .withLocalizedName("Pirate Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Pirate_Brew.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.hopsjuice") - .withLocalizedName("Hops Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Hops_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.darkbeer") - .withLocalizedName("Dark Beer") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Dark_Beer.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.dragonblood") - .withLocalizedName("Dragon Blood") - .withStateAndTemperature(LIQUID, 375) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Dragon_Blood.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.wheatyjuice") - .withLocalizedName("Wheaty Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Wheaty_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.scotch") - .withLocalizedName("Scotch") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Scotch.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.glenmckenner") - .withLocalizedName("Glen McKenner") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Glen_McKenner.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.wheatyhopsjuice") - .withLocalizedName("Wheaty Hops Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Wheaty_Hops_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.beer") - .withLocalizedName("Beer") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Beer.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.chillysauce") - .withLocalizedName("Chilly Sauce") - .withStateAndTemperature(LIQUID, 375) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Chilly_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.hotsauce") - .withLocalizedName("Hot Sauce") - .withStateAndTemperature(LIQUID, 380) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Hot_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.diabolosauce") - .withLocalizedName("Diabolo Sauce") - .withStateAndTemperature(LIQUID, 385) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Diabolo_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.diablosauce") - .withLocalizedName("Diablo Sauce") - .withStateAndTemperature(LIQUID, 390) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Diablo_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.diablosauce.strong") - .withLocalizedName("Old Man Snitches glitched Diablo Sauce") - .withStateAndTemperature(LIQUID, 999) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Snitches_Glitch_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.applejuice") - .withLocalizedName("Apple Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.cider") - .withLocalizedName("Cider") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Cider.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.goldenapplejuice") - .withLocalizedName("Golden Apple Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Golden_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.goldencider") - .withLocalizedName("Golden Cider") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Golden_Cider.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.idunsapplejuice") - .withLocalizedName("Idun's Apple Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Iduns_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.notchesbrew") - .withLocalizedName("Notches Brew") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Notches_Brew.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.lemonjuice") - .withLocalizedName("Lemon Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Lemon_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.limoncello") - .withLocalizedName("Limoncello") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Limoncello.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.lemonade") - .withLocalizedName("Lemonade") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Lemonade.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.alcopops") - .withLocalizedName("Alcopops") - .withStateAndTemperature(LIQUID, 275) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Alcopops.get(1L), ItemList.Bottle_Empty.get(1L)); - GT_FluidFactory.builder("potion.cavejohnsonsgrenadejuice") - .withLocalizedName("Cave Johnsons Grenade Juice") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.Bottle_Cave_Johnsons_Grenade_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); - - GT_FluidFactory.builder("potion.darkcoffee") - .withLocalizedName("Dark Coffee") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Dark_Coffee.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.darkcafeaulait") - .withLocalizedName("Dark Cafe au lait") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Dark_Cafe_au_lait.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.coffee") - .withLocalizedName("Coffee") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Coffee.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.cafeaulait") - .withLocalizedName("Cafe au lait") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Cafe_au_lait.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.laitaucafe") - .withLocalizedName("Lait au cafe") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Lait_au_cafe.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.darkchocolatemilk") - .withLocalizedName("Bitter Chocolate Milk") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Dark_Chocolate_Milk.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.chocolatemilk") - .withLocalizedName("Chocolate Milk") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Chocolate_Milk.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.tea") - .withLocalizedName("Tea") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.sweettea") - .withLocalizedName("Sweet Tea") - .withStateAndTemperature(LIQUID, 295) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Sweet_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("potion.icetea") - .withLocalizedName("Ice Tea") - .withStateAndTemperature(LIQUID, 255) - .buildAndRegister() - .registerPContainers(ItemList.ThermosCan_Ice_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L)); - GT_FluidFactory.builder("liquid_sodium") - .withLocalizedName("Liquid Sodium") - .withStateAndTemperature(LIQUID, 495) - .buildAndRegister() - .configureMaterials(Materials.Sodium) - .registerBContainers( - GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Sodium, 1L), - ItemList.Cell_Empty.get(1L)); - - FluidContainerRegistry.registerFluidContainer( - new FluidContainerRegistry.FluidContainerData( - FluidRegistry.getFluidStack("potion.poison.strong", 750), - ItemList.IC2_Spray_WeedEx.get(1L), - ItemList.Spray_Empty.get(1L))); - - if (!GT_Values.D1) { - try { - Class.forName("codechicken.nei.api.API"); - GT_Log.out.println("GT_Mod: Hiding certain Items from NEI."); - API.hideItem(ItemList.Display_Fluid.getWildcard(1L)); - } catch (Throwable e) { - if (GT_Values.D1) { - e.printStackTrace(GT_Log.err); - } - } - } - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.cobblestone, 1, WILDCARD)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.gravel, 1, WILDCARD)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L), new ItemStack(Items.flint, 1)) - .outputChances(10000, 1000) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.furnace, 1, WILDCARD)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 8L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - GT_Values.RA.stdBuilder() - .itemInputs(new ItemStack(Blocks.lit_furnace, 1, WILDCARD)) - .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 8L)) - .duration(20 * SECONDS) - .eut(2) - .addTo(maceratorRecipes); - - GT_OreDictUnificator.set( - OrePrefixes.ingot, - Materials.FierySteel, - GT_ModHandler.getModItem(TwilightForest.ID, "item.fieryIngot", 1L, 0)); - GT_OreDictUnificator.set( - OrePrefixes.ingot, - Materials.Knightmetal, - GT_ModHandler.getModItem(TwilightForest.ID, "item.knightMetal", 1L, 0)); - GT_OreDictUnificator.set( - OrePrefixes.ingot, - Materials.Steeleaf, - GT_ModHandler.getModItem(TwilightForest.ID, "item.steeleafIngot", 1L, 0)); - GT_OreDictUnificator.set( - OrePrefixes.ingot, - Materials.IronWood, - GT_ModHandler.getModItem(TwilightForest.ID, "item.ironwoodIngot", 1L, 0)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.InfusedAir, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 0)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.InfusedFire, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 1)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.InfusedWater, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 2)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.InfusedEarth, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 3)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.InfusedOrder, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 4)); - GT_OreDictUnificator.set( - OrePrefixes.gem, - Materials.InfusedEntropy, - GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 5)); - GT_OreDictUnificator - .set(OrePrefixes.nugget, Materials.Mercury, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 5)); - GT_OreDictUnificator - .set(OrePrefixes.nugget, Materials.Thaumium, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 6)); - GT_OreDictUnificator - .set(OrePrefixes.ingot, Materials.Thaumium, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 2)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.Mercury, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 3)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.Amber, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 6)); - GT_OreDictUnificator - .set(OrePrefixes.gem, Materials.Firestone, GT_ModHandler.getModItem(Railcraft.ID, "firestone.raw", 1L)); - - GT_OreDictUnificator - .set(OrePrefixes.nugget, Materials.Void, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 7)); - GT_OreDictUnificator - .set(OrePrefixes.ingot, Materials.Void, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 16)); - - GT_OreDictUnificator.set( - OrePrefixes.plate, - Materials.Iron, - GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 0), - false, - false); - - GT_OreDictUnificator.set( - OrePrefixes.plate, - Materials.Steel, - GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 1), - false, - false); - - GT_OreDictUnificator.set( - OrePrefixes.plate, - Materials.TinAlloy, - GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 2), - false, - false); - - GT_OreDictUnificator.set( - OrePrefixes.plate, - Materials.Copper, - GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 3), - false, - false); - - GT_OreDictUnificator.set( - OrePrefixes.dust, - Materials.Cocoa, - GT_ModHandler.getModItem(PamsHarvestCraft.ID, "cocoapowderItem", 1L, 0)); - GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Coffee, ItemList.IC2_CoffeePowder.get(1L)); - - GregTech_API - .registerMachineBlock(GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("reinforcedGlass", 0)), 0); - - GregTech_API.sSolenoidCoilCasings = new GT_Cyclotron_Coils(); - ItemList.TierdDrone0 - .set(new GT_TierDrone("tierdDrone0", "Drone (Level 1)", "Quadcopter Stable Small Aircraft", 1)); - ItemList.TierdDrone1 - .set(new GT_TierDrone("tierdDrone1", "Drone (Level 2)", "Dual Turbo High-Ejection Medium Aircraft", 2)); - ItemList.TierdDrone2 - .set(new GT_TierDrone("tierdDrone2", "Drone (Level 3)", "Single Engine Anti-Gravity Large Aircraft", 3)); - - } -} diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java deleted file mode 100644 index e7ad9e9337..0000000000 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java +++ /dev/null @@ -1,13703 +0,0 @@ -package gregtech.loaders.preload; - -import static gregtech.api.enums.MetaTileEntityIDs.*; -import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_DATA_ACCESS_HATCH; -import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_DEBUG_STRUCTURE_WRITTER; -import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_LINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.AUTOMATABLE_DATA_ACCESS_HATCH; -import static gregtech.api.enums.MetaTileEntityIDs.AUTO_MAINTENANCE_HATCH; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_EV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_HV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_IV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_LV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_MV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_EV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_HV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_IV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_LV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_MV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_EV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_HV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_IV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_LV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_MV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_EV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_HV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_IV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_LV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_MV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_EV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_HV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_IV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_LV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_MV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_UV; -import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_EV; -import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_HV; -import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_IV; -import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_LV; -import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_MV; -import static gregtech.api.enums.MetaTileEntityIDs.BLACKHOLE_COMPRESSOR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_EV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_HV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_IV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_LV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_MV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UV; -import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.BRICKED_BLAST_FURNACE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.CHARCOAL_PILE_IGNITER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.CLEANROOM_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_ENGINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.CONCRETE_BACKFILLER_II_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.CONCRETE_BACKFILLER_I_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_ME; -import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_ME_BUS; -import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_SLAVE; -import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.DATA_ACCESS_HATCH; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLATION_TOWER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UV; -import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.DTPF_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_EV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_HV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_IV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_LV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_MV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.DroneDownLink; -import static gregtech.api.enums.MetaTileEntityIDs.Drone_Centre; -import static gregtech.api.enums.MetaTileEntityIDs.EBF_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_EV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_HV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_IV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_LV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_MV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.EXTREME_COMBUSTION_ENGINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UV; -import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKI; -import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKII; -import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKIII; -import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_EV; -import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_HV; -import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_IV; -import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_LV; -import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_MV; -import static gregtech.api.enums.MetaTileEntityIDs.HATCH_DEGASIFIER_CONTROL; -import static gregtech.api.enums.MetaTileEntityIDs.HATCH_LENS_HOUSING; -import static gregtech.api.enums.MetaTileEntityIDs.HATCH_LENS_INDICATOR; -import static gregtech.api.enums.MetaTileEntityIDs.HATCH_PH_SENSOR; -import static gregtech.api.enums.MetaTileEntityIDs.HEAT_DETECTOR_HATCH; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_MAX_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UEV_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UIV_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UMV_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UXV_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_COAL_BOILER; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_LAVA_BOILER; -import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_SOLAR_BOILER; -import static gregtech.api.enums.MetaTileEntityIDs.HIP_COMPRESSOR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_ALLOY_SMELTER; -import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_COMPRESSOR; -import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_EXTRACTOR; -import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_FORGE_HAMMER; -import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_FURNACE; -import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_MACERATOR; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_BRICKED_BRONZE; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_BRONZE; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_EV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_HV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_IV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_LV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_MV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_STEEL; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_UV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_WROUGHT_IRON; -import static gregtech.api.enums.MetaTileEntityIDs.HULL_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.IMPLOSION_COMPRESSOR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_APIARY; -import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_COMPRESSOR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_LASER_ENGRAVER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_EV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_HV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_IV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME_ADVANCED; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_MV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_UV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_EV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_HV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_IV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME_ADVANCED; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_MV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.INTEGRATED_ORE_FACTORY_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_ADVANCED_GAS_TURBINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_BRONZE_BOILER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_GAS_TURBINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_HEAT_EXCHANGER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_HP_STEAM_TURBINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_PLASMA_TURBINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_STEAM_TURBINE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_STEEL_BOILER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_TITANIUM_BOILER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LARGE_TUNGSTENSTEEL_BOILER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LASER_ENGRAVER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.LATHE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.LATHE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.LCR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_EV; -import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_HV; -import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_IV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.LONG_DISTANCE_PIPELINE_FLUID; -import static gregtech.api.enums.MetaTileEntityIDs.LONG_DISTANCE_PIPELINE_ITEM; -import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.MAG_HATCH; -import static gregtech.api.enums.MetaTileEntityIDs.MAINTENANCE_HATCH; -import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MINER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.MINER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.MINER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.MIXER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MIXER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_EV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_HV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_IV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_LV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_MV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_UV; -import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.MULTIBLOCK_PUMP_INFINITE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.MULTIBLOCK_PUMP_MKI_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKIII_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKII_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKIV_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.MULTI_CANNER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.MULTI_LATHE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.MULTI_SMELTER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.NANO_FORGE_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.NEUTRONIUM_COMPRESSOR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.OIL_CRACKER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKIII_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKII_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKIV_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKI_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_EV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_HV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_IV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_LV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ME; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_MV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_UV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_EV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_HV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_IV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_LV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ME; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_MV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.PCB_FACTORY_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.PROCESSING_ARRAY_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.PUMP_EV; -import static gregtech.api.enums.MetaTileEntityIDs.PUMP_HV; -import static gregtech.api.enums.MetaTileEntityIDs.PUMP_IV; -import static gregtech.api.enums.MetaTileEntityIDs.PUMP_LV; -import static gregtech.api.enums.MetaTileEntityIDs.PUMP_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.PUMP_MV; -import static gregtech.api.enums.MetaTileEntityIDs.PUMP_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_PLANT_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_CLARIFIER; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_DEGASIFIER; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_FLOCCULATOR; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_OZONATION; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_PARTICLE_EXTRACTOR; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_PH_ADJUSTMENT; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_PLASMA_HEATER; -import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_UV_TREATMENT; -import static gregtech.api.enums.MetaTileEntityIDs.PYROLYSE_OVEN_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_EV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_IV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_EV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_HV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_IV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_LV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_MV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_EV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_HV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_IV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_LV; -import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_MV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.SIMPLE_SOLAR_BOILER; -import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.SMALL_COAL_BOILER; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_ALLOY_SMELTER; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_COMPRESSOR; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_EXTRACTOR; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_FORGE_HAMMER; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_FURNACE; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_MACERATOR; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_HV; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_LV; -import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_MV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_EV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_HV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_IV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_LV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_MV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_EV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_HV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_IV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_LV; -import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_MV; -import static gregtech.api.enums.MetaTileEntityIDs.TELEPORTER; -import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UV; -import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.TRANSCENDENT_PLASMA_MIXER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_MAX_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UEV_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UIV_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UMV_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UXV_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_EV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_HV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_IV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_LV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_MV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_UV; -import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.VACUUM_FREEZER_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_EV_HV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_HV_MV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_IV_EV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_LV_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_LuV_IV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_MAX_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_MV_LV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UEV_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UHV_UV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UIV_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UMV_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UV_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UXV_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_ZPM_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_EV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_HV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_IV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_LV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_MV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_EV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_HV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_IV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_LV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_MAX; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_MV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UXV; -import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UEV; -import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UHV; -import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UIV; -import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UMV; -import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UV; -import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_EV; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_HV; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_IV; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_LV; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_LuV; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_MV; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_UV; -import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.WORMHOLE_GENERATOR_CONTROLLER; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_EV_HV; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_HV_MV; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_IV_EV; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_LV_ULV; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_LuV_IV; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_MV_LV; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_UHV_UV; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_UV_ZPM; -import static gregtech.api.enums.MetaTileEntityIDs.transformer_ZPM_LuV; -import static gregtech.api.enums.Mods.Forestry; -import static gregtech.api.enums.Mods.NewHorizonsCoreMod; -import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes; -import static gregtech.api.recipe.RecipeMaps.amplifierRecipes; -import static gregtech.api.recipe.RecipeMaps.arcFurnaceRecipes; -import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; -import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes; -import static gregtech.api.recipe.RecipeMaps.benderRecipes; -import static gregtech.api.recipe.RecipeMaps.cannerRecipes; -import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes; -import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes; -import static gregtech.api.recipe.RecipeMaps.chemicalReactorRecipes; -import static gregtech.api.recipe.RecipeMaps.circuitAssemblerRecipes; -import static gregtech.api.recipe.RecipeMaps.compressorRecipes; -import static gregtech.api.recipe.RecipeMaps.cutterRecipes; -import static gregtech.api.recipe.RecipeMaps.distilleryRecipes; -import static gregtech.api.recipe.RecipeMaps.electroMagneticSeparatorRecipes; -import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes; -import static gregtech.api.recipe.RecipeMaps.extractorRecipes; -import static gregtech.api.recipe.RecipeMaps.extruderRecipes; -import static gregtech.api.recipe.RecipeMaps.fermentingRecipes; -import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes; -import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes; -import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes; -import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes; -import static gregtech.api.recipe.RecipeMaps.formingPressRecipes; -import static gregtech.api.recipe.RecipeMaps.furnaceRecipes; -import static gregtech.api.recipe.RecipeMaps.hammerRecipes; -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.microwaveRecipes; -import static gregtech.api.recipe.RecipeMaps.mixerRecipes; -import static gregtech.api.recipe.RecipeMaps.oreWasherRecipes; -import static gregtech.api.recipe.RecipeMaps.plasmaArcFurnaceRecipes; -import static gregtech.api.recipe.RecipeMaps.polarizerRecipes; -import static gregtech.api.recipe.RecipeMaps.recyclerRecipes; -import static gregtech.api.recipe.RecipeMaps.sifterRecipes; -import static gregtech.api.recipe.RecipeMaps.slicerRecipes; -import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes; -import static gregtech.api.recipe.RecipeMaps.wiremillRecipes; -import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_RecipeBuilder.TICKS; -import static gregtech.api.util.GT_Utility.calculateRecipeEU; - -import net.minecraft.util.EnumChatFormatting; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.MachineType; -import gregtech.api.enums.Materials; -import gregtech.api.enums.MaterialsUEVplus; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.SubTag; -import gregtech.api.enums.TierEU; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_QuadrupleHumongous; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MagHatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Transformer; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_WetTransformer; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Wireless_Dynamo; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Wireless_Hatch; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Block_FrameBox; -import gregtech.common.tileentities.automation.GT_MetaTileEntity_ChestBuffer; -import gregtech.common.tileentities.automation.GT_MetaTileEntity_Filter; -import gregtech.common.tileentities.automation.GT_MetaTileEntity_ItemDistributor; -import gregtech.common.tileentities.automation.GT_MetaTileEntity_RecipeFilter; -import gregtech.common.tileentities.automation.GT_MetaTileEntity_Regulator; -import gregtech.common.tileentities.automation.GT_MetaTileEntity_SuperBuffer; -import gregtech.common.tileentities.automation.GT_MetaTileEntity_TypeFilter; -import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Bronze; -import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Lava; -import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Solar; -import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Solar_Steel; -import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Steel; -import gregtech.common.tileentities.debug.GT_MetaTileEntity_AdvDebugStructureWriter; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_DieselGenerator; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_GasTurbine; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_LightningRod; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_MagicEnergyConverter; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_MagicalEnergyAbsorber; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_NaquadahReactor; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_PlasmaGenerator; -import gregtech.common.tileentities.generators.GT_MetaTileEntity_SteamTurbine; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_Bronze; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_BronzeBricks; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_Steel; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_SteelBricks; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_Slave; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME; -import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_AdvSeismicProspector; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_BetterJukebox; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Boxinator; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Charger; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_IndustrialApiary; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Massfabricator; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_MicrowaveEnergyTransmitter; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Miner; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_MonsterRepellent; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_PotionBrewer; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Pump; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Replicator; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_RockBreaker; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Scanner; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Teleporter; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_TurboCharger; -import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_WorldAccelerator; -import gregtech.common.tileentities.machines.long_distance.GT_MetaTileEntity_LongDistancePipelineFluid; -import gregtech.common.tileentities.machines.long_distance.GT_MetaTileEntity_LongDistancePipelineItem; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_AssemblyLine; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_BrickedBlastFurnace; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Charcoal_Pit; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Cleanroom; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ConcreteBackfiller1; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ConcreteBackfiller2; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DieselEngine; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DistillationTower; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ElectricBlastFurnace; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ExtremeDieselEngine; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer1; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer2; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer3; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_HeatExchanger; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ImplosionCompressor; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_IndustrialElectromagneticSeparator; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_IndustrialExtractor; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_IndustrialLaserEngraver; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_IntegratedOreFactory; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_Bronze; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_Steel; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_Titanium; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_TungstenSteel; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeChemicalReactor; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeFluidExtractor; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Gas; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_GasAdvanced; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_HPSteam; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Plasma; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Steam; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_MultiAutoclave; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_MultiCanner; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_MultiFurnace; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_MultiLathe; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_NanoForge; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilCracker; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill1; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill2; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill3; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill4; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrillInfinite; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant1; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant2; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant3; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant4; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PCBFactory; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ProcessingArray; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PyrolyseOven; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_TranscendentPlasmaMixer; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_VacuumFreezer; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_WormholeGenerator; -import gregtech.common.tileentities.machines.multi.compressor.GT_MetaTileEntity_BlackHoleCompressor; -import gregtech.common.tileentities.machines.multi.compressor.GT_MetaTileEntity_HIPCompressor; -import gregtech.common.tileentities.machines.multi.compressor.GT_MetaTileEntity_HeatSensor; -import gregtech.common.tileentities.machines.multi.compressor.GT_MetaTileEntity_IndustrialCompressor; -import gregtech.common.tileentities.machines.multi.compressor.GT_MetaTileEntity_NeutroniumCompressor; -import gregtech.common.tileentities.machines.multi.drone.GT_MetaTileEntity_DroneCentre; -import gregtech.common.tileentities.machines.multi.drone.GT_MetaTileEntity_Hatch_DroneDownLink; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_Hatch_DegasifierControlHatch; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_LensHousing; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_LensIndicator; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationPlant; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitClarifier; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitDegasifier; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitFlocculation; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitOzonation; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitParticleExtractor; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitPhAdjustment; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitPlasmaHeater; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_PurificationUnitUVTreatment; -import gregtech.common.tileentities.machines.multi.purification.GT_MetaTileEntity_pHSensor; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_AlloySmelter_Bronze; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_AlloySmelter_Steel; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Compressor_Bronze; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Compressor_Steel; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Extractor_Bronze; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Extractor_Steel; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_ForgeHammer_Bronze; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_ForgeHammer_Steel; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Furnace_Bronze; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Furnace_Steel; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Macerator_Bronze; -import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Macerator_Steel; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_Locker; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_QuantumChest; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_QuantumTank; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperChest; -import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperTank; -import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTransformerHiAmp; - -// Free IDs left for machines in GT as of 29th of July 2022 - Colen. Please try use them up in order. -// 366 -// 367 -// 368 -// 369 -// 370 -// 376 -// 377 -// 378 -// 379 -// 386 -// 387 -// 388 -// 389 -// 390 -// 396 -// 397 -// 398 -// 399 -// 410 -// 419 -// 426 -// 427 -// 428 -// 429 -// 430 -// 436 -// 437 -// 438 -// 439 -// 446 -// 447 -// 448 -// 449 -// 450 -// 456 -// 457 -// 458 -// 459 -// 466 -// 467 -// 468 -// 469 -// 470 -// 476 -// 477 -// 478 -// 479 -// 486 -// 487 -// 488 -// 489 -// 496 -// 497 -// 498 -// 499 -// 506 -// 507 -// 508 -// 509 -// 518 -// 519 -// 526 -// 530 -// 537 -// 538 -// 539 -// 546 -// 547 -// 548 -// 549 -// 550 -// 556 -// 557 -// 558 -// 559 -// 566 -// 567 -// 576 -// 577 -// 578 -// 579 -// 586 -// 587 -// 588 -// 589 -// 590 -// 596 -// 597 -// 598 -// 599 -// 607 -// 608 -// 609 -// 610 -// 616 -// 617 -// 618 -// 619 -// 626 -// 627 -// 628 -// 629 -// 630 -// 636 -// 637 -// 639 -// 646 -// 647 -// 648 -// 649 -// 650 -// 656 -// 657 -// 658 -// 659 -// 666 -// 667 -// 668 -// 669 -// 670 -// 676 -// 677 -// 678 -// 682 -// 683 -// 684 -// 686 -// 687 -// 688 -// 689 -// 702 -// 703 -// 704 -// 705 -// 706 -// 707 -// 708 -// 709 -// 714 -// 715 -// 716 -// 717 -// 718 -// 719 -// 721 -// 722 -// 723 -// 724 -// 725 -// 726 -// 727 -// 728 -// 729 -// 730 -// 731 -// 732 -// 733 -// 734 -// 735 -// 736 -// 737 -// 738 -// 739 -// 741 -// 742 -// 743 -// 744 -// 745 -// 746 -// 747 -// 748 -// 749 - -// TODO Some GT MetaTileEntity registrations are done in load/GT_Loader_MetaTileEntities_Recipes.java due to joint -// registration+recipe methods, they should be split and brought here to register all in preload. - -public class GT_Loader_MetaTileEntities implements Runnable { // TODO CHECK CIRCUIT RECIPES AND USAGES - - private static final String aTextWire1 = "wire."; - private static final String aTextCable1 = "cable."; - private static final String aTextWire2 = " Wire"; - private static final String aTextCable2 = " Cable"; - public static final String imagination = EnumChatFormatting.RESET + "You just need " - + EnumChatFormatting.DARK_PURPLE - + "I" - + EnumChatFormatting.LIGHT_PURPLE - + "m" - + EnumChatFormatting.DARK_RED - + "a" - + EnumChatFormatting.RED - + "g" - + EnumChatFormatting.YELLOW - + "i" - + EnumChatFormatting.GREEN - + "n" - + EnumChatFormatting.AQUA - + "a" - + EnumChatFormatting.DARK_AQUA - + "t" - + EnumChatFormatting.BLUE - + "i" - + EnumChatFormatting.DARK_BLUE - + "o" - + EnumChatFormatting.DARK_PURPLE - + "n" - + EnumChatFormatting.RESET - + " to use this."; - - private static void registerMultiblockControllers() { - ItemList.Machine_Bricked_BlastFurnace.set( - new GT_MetaTileEntity_BrickedBlastFurnace( - BRICKED_BLAST_FURNACE_CONTROLLER.ID, - "multimachine.brickedblastfurnace", - "Bricked Blast Furnace").getStackForm(1L)); - - ItemList.Machine_Multi_BlastFurnace.set( - new GT_MetaTileEntity_ElectricBlastFurnace( - EBF_CONTROLLER.ID, - "multimachine.blastfurnace", - "Electric Blast Furnace").getStackForm(1L)); - ItemList.Machine_Multi_ImplosionCompressor.set( - new GT_MetaTileEntity_ImplosionCompressor( - IMPLOSION_COMPRESSOR_CONTROLLER.ID, - "multimachine.implosioncompressor", - "Implosion Compressor").getStackForm(1L)); - ItemList.Machine_Multi_VacuumFreezer.set( - new GT_MetaTileEntity_VacuumFreezer( - VACUUM_FREEZER_CONTROLLER.ID, - "multimachine.vacuumfreezer", - "Vacuum Freezer").getStackForm(1L)); - ItemList.Machine_Multi_Furnace.set( - new GT_MetaTileEntity_MultiFurnace( - MULTI_SMELTER_CONTROLLER.ID, - "multimachine.multifurnace", - "Multi Smelter").getStackForm(1L)); - ItemList.Machine_Multi_PlasmaForge.set( - new GT_MetaTileEntity_PlasmaForge( - DTPF_CONTROLLER.ID, - "multimachine.plasmaforge", - "Dimensionally Transcendent Plasma Forge").getStackForm(1L)); - ItemList.Machine_Multi_PurificationPlant.set( - new GT_MetaTileEntity_PurificationPlant( - PURIFICATION_PLANT_CONTROLLER.ID, - "multimachine.purificationplant", - "Water Purification Plant").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitClarifier.set( - new GT_MetaTileEntity_PurificationUnitClarifier( - PURIFICATION_UNIT_CLARIFIER.ID, - "multimachine.purificationunitclarifier", - "Clarifier Purification Unit").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitFlocculator.set( - new GT_MetaTileEntity_PurificationUnitFlocculation( - PURIFICATION_UNIT_FLOCCULATOR.ID, - "multimachine.purificationunitflocculator", - "Flocculation Purification Unit").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitPhAdjustment.set( - new GT_MetaTileEntity_PurificationUnitPhAdjustment( - PURIFICATION_UNIT_PH_ADJUSTMENT.ID, - "multimachine.purificationunitphadjustment", - "pH Neutralization Purification Unit").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitOzonation.set( - new GT_MetaTileEntity_PurificationUnitOzonation( - PURIFICATION_UNIT_OZONATION.ID, - "multimachine.purificationunitozonation", - "Ozonation Purification Unit").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitPlasmaHeater.set( - new GT_MetaTileEntity_PurificationUnitPlasmaHeater( - PURIFICATION_UNIT_PLASMA_HEATER.ID, - "multimachine.purificationunitplasmaheater", - "Extreme Temperature Fluctuation Purification Unit").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitUVTreatment.set( - new GT_MetaTileEntity_PurificationUnitUVTreatment( - PURIFICATION_UNIT_UV_TREATMENT.ID, - "multimachine.purificationunituvtreatment", - "High Energy Laser Purification Unit").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitDegasifier.set( - new GT_MetaTileEntity_PurificationUnitDegasifier( - PURIFICATION_UNIT_DEGASIFIER.ID, - "multimachine.purificationunitdegasifier", - "Residual Decontaminant Degasser Purification Unit").getStackForm(1L)); - ItemList.Machine_Multi_PurificationUnitParticleExtractor.set( - new GT_MetaTileEntity_PurificationUnitParticleExtractor( - PURIFICATION_UNIT_PARTICLE_EXTRACTOR.ID, - "multimachine.purificationunitextractor", - "Absolute Baryonic Perfection Purification Unit").getStackForm(1L)); - ItemList.Hatch_DegasifierControl.set( - new GT_MetaTileEntity_Hatch_DegasifierControlHatch( - HATCH_DEGASIFIER_CONTROL.ID, - "hatch.degasifiercontrol", - "Degasser Control Hatch", - 8).getStackForm(1L)); - ItemList.Machine_Multi_LargeBoiler_Bronze.set( - new GT_MetaTileEntity_LargeBoiler_Bronze( - LARGE_BRONZE_BOILER_CONTROLLER.ID, - "multimachine.boiler.bronze", - "Large Bronze Boiler").getStackForm(1L)); - ItemList.Machine_Multi_LargeBoiler_Steel.set( - new GT_MetaTileEntity_LargeBoiler_Steel( - LARGE_STEEL_BOILER_CONTROLLER.ID, - "multimachine.boiler.steel", - "Large Steel Boiler").getStackForm(1L)); - ItemList.Machine_Multi_LargeBoiler_Titanium.set( - new GT_MetaTileEntity_LargeBoiler_Titanium( - LARGE_TITANIUM_BOILER_CONTROLLER.ID, - "multimachine.boiler.titanium", - "Large Titanium Boiler").getStackForm(1L)); - ItemList.Machine_Multi_LargeBoiler_TungstenSteel.set( - new GT_MetaTileEntity_LargeBoiler_TungstenSteel( - LARGE_TUNGSTENSTEEL_BOILER_CONTROLLER.ID, - "multimachine.boiler.tungstensteel", - "Large Tungstensteel Boiler").getStackForm(1L)); - ItemList.FusionComputer_LuV.set( - new GT_MetaTileEntity_FusionComputer1( - FUSION_CONTROLLER_MKI.ID, - "fusioncomputer.tier.06", - "Fusion Control Computer Mark I").getStackForm(1L)); - ItemList.FusionComputer_ZPMV.set( - new GT_MetaTileEntity_FusionComputer2( - FUSION_CONTROLLER_MKII.ID, - "fusioncomputer.tier.07", - "Fusion Control Computer Mark II").getStackForm(1L)); - ItemList.FusionComputer_UV.set( - new GT_MetaTileEntity_FusionComputer3( - FUSION_CONTROLLER_MKIII.ID, - "fusioncomputer.tier.08", - "Fusion Control Computer Mark III").getStackForm(1L)); - - ItemList.Processing_Array.set( - new GT_MetaTileEntity_ProcessingArray( - PROCESSING_ARRAY_CONTROLLER.ID, - "multimachine.processingarray", - "Processing Array").getStackForm(1L)); - ItemList.Distillation_Tower.set( - new GT_MetaTileEntity_DistillationTower( - DISTILLATION_TOWER_CONTROLLER.ID, - "multimachine.distillationtower", - "Distillation Tower").getStackForm(1L)); - ItemList.Ore_Processor.set( - new GT_MetaTileEntity_IntegratedOreFactory( - INTEGRATED_ORE_FACTORY_CONTROLLER.ID, - "multimachine.oreprocessor", - "Integrated Ore Factory").getStackForm(1L)); - - ItemList.LargeSteamTurbine.set( - new GT_MetaTileEntity_LargeTurbine_Steam( - LARGE_STEAM_TURBINE_CONTROLLER.ID, - "multimachine.largeturbine", - "Large Steam Turbine").getStackForm(1L)); - ItemList.LargeGasTurbine.set( - new GT_MetaTileEntity_LargeTurbine_Gas( - LARGE_GAS_TURBINE_CONTROLLER.ID, - "multimachine.largegasturbine", - "Large Gas Turbine").getStackForm(1L)); - ItemList.LargeHPSteamTurbine.set( - new GT_MetaTileEntity_LargeTurbine_HPSteam( - LARGE_HP_STEAM_TURBINE_CONTROLLER.ID, - "multimachine.largehpturbine", - "Large HP Steam Turbine").getStackForm(1L)); - ItemList.LargeAdvancedGasTurbine.set( - new GT_MetaTileEntity_LargeTurbine_GasAdvanced( - LARGE_ADVANCED_GAS_TURBINE_CONTROLLER.ID, - "multimachine.largeadvancedgasturbine", - "Large Advanced Gas Turbine").getStackForm(1L)); - ItemList.Machine_Multi_TranscendentPlasmaMixer.set( - new GT_MetaTileEntity_TranscendentPlasmaMixer( - TRANSCENDENT_PLASMA_MIXER_CONTROLLER.ID, - "multimachine.transcendentplasmamixer", - "Transcendent Plasma Mixer").getStackForm(1)); - - ItemList.LargePlasmaTurbine.set( - new GT_MetaTileEntity_LargeTurbine_Plasma( - LARGE_PLASMA_TURBINE_CONTROLLER.ID, - "multimachine.largeplasmaturbine", - "Large Plasma Generator").getStackForm(1L)); - ItemList.Machine_Multi_HeatExchanger.set( - new GT_MetaTileEntity_HeatExchanger( - LARGE_HEAT_EXCHANGER_CONTROLLER.ID, - "multimachine.heatexchanger", - "Large Heat Exchanger").getStackForm(1L)); - ItemList.Charcoal_Pile.set( - new GT_MetaTileEntity_Charcoal_Pit( - CHARCOAL_PILE_IGNITER_CONTROLLER.ID, - "multimachine.charcoalpile", - "Charcoal Pile Igniter").getStackForm(1)); - - // Converter recipes in case you had old one lying around - ItemList.OilDrill1.set( - new GT_MetaTileEntity_OilDrill1( - MULTIBLOCK_PUMP_MKI_CONTROLLER.ID, - "multimachine.oildrill1", - "Oil/Gas/Fluid Drilling Rig").getStackForm(1)); - ItemList.OilDrill2.set( - new GT_MetaTileEntity_OilDrill2( - MULTILOCK_PUMP_MKII_CONTROLLER.ID, - "multimachine.oildrill2", - "Oil/Gas/Fluid Drilling Rig II").getStackForm(1)); - ItemList.OilDrill3.set( - new GT_MetaTileEntity_OilDrill3( - MULTILOCK_PUMP_MKIII_CONTROLLER.ID, - "multimachine.oildrill3", - "Oil/Gas/Fluid Drilling Rig III").getStackForm(1)); - ItemList.OilDrill4.set( - new GT_MetaTileEntity_OilDrill4( - MULTILOCK_PUMP_MKIV_CONTROLLER.ID, - "multimachine.oildrill4", - "Oil/Gas/Fluid Drilling Rig IV").getStackForm(1)); - ItemList.OilDrillInfinite.set( - new GT_MetaTileEntity_OilDrillInfinite( - MULTIBLOCK_PUMP_INFINITE_CONTROLLER.ID, - "multimachine.oildrillinfinite", - "Infinite Oil/Gas/Fluid Drilling Rig").getStackForm(1)); - - ItemList.ConcreteBackfiller1.set( - new GT_MetaTileEntity_ConcreteBackfiller1( - CONCRETE_BACKFILLER_I_CONTROLLER.ID, - "multimachine.concretebackfiller1", - "Concrete Backfiller").getStackForm(1)); - ItemList.ConcreteBackfiller2.set( - new GT_MetaTileEntity_ConcreteBackfiller2( - CONCRETE_BACKFILLER_II_CONTROLLER.ID, - "multimachine.concretebackfiller3", - "Advanced Concrete Backfiller").getStackForm(1)); - ItemList.OreDrill1.set( - new GT_MetaTileEntity_OreDrillingPlant1( - ORE_DRILL_MKI_CONTROLLER.ID, - "multimachine.oredrill1", - "Ore Drilling Plant").getStackForm(1)); - ItemList.OreDrill2.set( - new GT_MetaTileEntity_OreDrillingPlant2( - ORE_DRILL_MKII_CONTROLLER.ID, - "multimachine.oredrill2", - "Ore Drilling Plant II").getStackForm(1)); - ItemList.OreDrill3.set( - new GT_MetaTileEntity_OreDrillingPlant3( - ORE_DRILL_MKIII_CONTROLLER.ID, - "multimachine.oredrill3", - "Ore Drilling Plant III").getStackForm(1)); - ItemList.OreDrill4.set( - new GT_MetaTileEntity_OreDrillingPlant4( - ORE_DRILL_MKIV_CONTROLLER.ID, - "multimachine.oredrill4", - "Ore Drilling Plant IV").getStackForm(1)); - - ItemList.PyrolyseOven.set( - new GT_MetaTileEntity_PyrolyseOven(PYROLYSE_OVEN_CONTROLLER.ID, "multimachine.pyro", "Pyrolyse Oven") - .getStackForm(1)); - ItemList.OilCracker.set( - new GT_MetaTileEntity_OilCracker(OIL_CRACKER_CONTROLLER.ID, "multimachine.cracker", "Oil Cracking Unit") - .getStackForm(1)); - - ItemList.Machine_Multi_Assemblyline.set( - new GT_MetaTileEntity_AssemblyLine( - ASSEMBLING_LINE_CONTROLLER.ID, - "multimachine.assemblyline", - "Assembling Line").getStackForm(1L)); - ItemList.Machine_Multi_DieselEngine.set( - new GT_MetaTileEntity_DieselEngine( - COMBUSTION_ENGINE_CONTROLLER.ID, - "multimachine.dieselengine", - "Combustion Engine").getStackForm(1L)); - ItemList.Machine_Multi_ExtremeDieselEngine.set( - new GT_MetaTileEntity_ExtremeDieselEngine( - EXTREME_COMBUSTION_ENGINE_CONTROLLER.ID, - "multimachine.extremedieselengine", - "Extreme Combustion Engine").getStackForm(1L)); - ItemList.Machine_Multi_Cleanroom.set( - new GT_MetaTileEntity_Cleanroom(CLEANROOM_CONTROLLER.ID, "multimachine.cleanroom", "Cleanroom Controller") - .getStackForm(1)); - - ItemList.Machine_Multi_LargeChemicalReactor.set( - new GT_MetaTileEntity_LargeChemicalReactor( - LCR_CONTROLLER.ID, - "multimachine.chemicalreactor", - "Large Chemical Reactor").getStackForm(1)); - ItemList.PCBFactory.set( - new GT_MetaTileEntity_PCBFactory(PCB_FACTORY_CONTROLLER.ID, "multimachine.pcbfactory", "PCB Factory") - .getStackForm(1)); - ItemList.NanoForge.set( - new GT_MetaTileEntity_NanoForge(NANO_FORGE_CONTROLLER.ID, "multimachine.nanoforge", "Nano Forge") - .getStackForm(1)); - ItemList.Machine_Multi_DroneCentre.set( - new GT_MetaTileEntity_DroneCentre(Drone_Centre.ID, "multimachine_DroneCentre", "Drone Centre") - .getStackForm(1)); - - ItemList.Machine_Multi_IndustrialElectromagneticSeparator.set( - new GT_MetaTileEntity_IndustrialElectromagneticSeparator( - INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR_CONTROLLER.ID, - "multimachine.electromagneticseparator", - "Magnetic Flux Exhibitor").getStackForm(1)); - ItemList.Machine_Multi_Canner.set( - new GT_MetaTileEntity_MultiCanner(MULTI_CANNER_CONTROLLER.ID, "multimachine.canner", "TurboCan Pro") - .getStackForm(1)); - - ItemList.WormholeGenerator.set( - new GT_MetaTileEntity_WormholeGenerator( - WORMHOLE_GENERATOR_CONTROLLER.ID, - "multimachine.wormhole", - "Miniature Wormhole Generator").getStackForm(1)); - - ItemList.Machine_Multi_IndustrialLaserEngraver.set( - new GT_MetaTileEntity_IndustrialLaserEngraver( - INDUSTRIAL_LASER_ENGRAVER_CONTROLLER.ID, - "multimachine.engraver", - "Hyper-Intensity Laser Engraver").getStackForm(1)); - - ItemList.Machine_Multi_IndustrialExtractor.set( - new GT_MetaTileEntity_IndustrialExtractor( - INDUSTRIAL_EXTRACTOR_CONTROLLER.ID, - "multimachine.extractor", - "Dissection Apparatus").getStackForm(1)); - - ItemList.Machine_Multi_Lathe.set( - new GT_MetaTileEntity_MultiLathe( - MULTI_LATHE_CONTROLLER.ID, - "multimachine.lathe", - "Industrial Precision Lathe").getStackForm(1)); - - ItemList.Machine_Multi_IndustrialCompressor.set( - new GT_MetaTileEntity_IndustrialCompressor( - INDUSTRIAL_COMPRESSOR_CONTROLLER.ID, - "multimachine.basiccompressor", - "Large Electric Compressor").getStackForm(1)); - ItemList.Machine_Multi_HIPCompressor.set( - new GT_MetaTileEntity_HIPCompressor( - HIP_COMPRESSOR_CONTROLLER.ID, - "multimachine.hipcompressor", - "Hot Isostatic Pressurization Unit").getStackForm(1)); - ItemList.Machine_Multi_NeutroniumCompressor.set( - new GT_MetaTileEntity_NeutroniumCompressor( - NEUTRONIUM_COMPRESSOR_CONTROLLER.ID, - "multimachine.neutroniumcompressor", - "Neutronium Compressor").getStackForm(1)); - ItemList.Machine_Multi_BlackHoleCompressor.set( - new GT_MetaTileEntity_BlackHoleCompressor( - BLACKHOLE_COMPRESSOR_CONTROLLER.ID, - "multimachine.blackholecompressor", - "Semi-Stable Black Hole Containment Field").getStackForm(1)); - - ItemList.Machine_Multi_Autoclave.set( - new GT_MetaTileEntity_MultiAutoclave( - MULTI_AUTOCLAVE_CONTROLLER.ID, - "multimachine.autoclave", - "Industrial Autoclave").getStackForm(1)); - - ItemList.LargeFluidExtractor.set( - new GT_MetaTileEntity_LargeFluidExtractor( - LARGE_FLUID_EXTRACTOR.ID, - "multimachine.fluidextractor", - "Large Fluid Extractor").getStackForm(1)); - } - - private static void registerSteamMachines() { - ItemList.Machine_Bronze_Furnace.set( - new GT_MetaTileEntity_Furnace_Bronze(STEAM_FURNACE.ID, "bronzemachine.furnace", "Steam Furnace") - .getStackForm(1L)); - ItemList.Machine_Bronze_Macerator.set( - new GT_MetaTileEntity_Macerator_Bronze(STEAM_MACERATOR.ID, "bronzemachine.macerator", "Steam Macerator") - .getStackForm(1L)); - ItemList.Machine_Bronze_Extractor.set( - new GT_MetaTileEntity_Extractor_Bronze(STEAM_EXTRACTOR.ID, "bronzemachine.extractor", "Steam Extractor") - .getStackForm(1L)); - ItemList.Machine_Bronze_Hammer.set( - new GT_MetaTileEntity_ForgeHammer_Bronze( - STEAM_FORGE_HAMMER.ID, - "bronzemachine.hammer", - "Steam Forge Hammer").getStackForm(1L)); - ItemList.Machine_Bronze_Compressor.set( - new GT_MetaTileEntity_Compressor_Bronze(STEAM_COMPRESSOR.ID, "bronzemachine.compressor", "Steam Compressor") - .getStackForm(1L)); - ItemList.Machine_Bronze_AlloySmelter.set( - new GT_MetaTileEntity_AlloySmelter_Bronze( - STEAM_ALLOY_SMELTER.ID, - "bronzemachine.alloysmelter", - "Steam Alloy Smelter").getStackForm(1L)); - - } - - private static void registerUnpackager() { - ItemList.Machine_LV_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_LV.ID, - "basicmachine.unboxinator.tier.01", - "Basic Unpackager", - 1, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - - ItemList.Machine_MV_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_MV.ID, - "basicmachine.unboxinator.tier.02", - "Advanced Unpackager", - 2, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - - ItemList.Machine_HV_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_HV.ID, - "basicmachine.unboxinator.tier.03", - "Advanced Unpackager II", - 3, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - - ItemList.Machine_EV_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_EV.ID, - "basicmachine.unboxinator.tier.04", - "Advanced Unpackager III", - 4, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - - ItemList.Machine_IV_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_IV.ID, - "basicmachine.unboxinator.tier.05", - "Unboxinator", - 5, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - - ItemList.Machine_LuV_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_LuV.ID, - "basicmachine.unboxinator.tier.06", - "Unboxinator", - 6, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - - ItemList.Machine_ZPM_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_ZPM.ID, - "basicmachine.unboxinator.tier.07", - "Unboxinator", - 7, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - - ItemList.Machine_UV_Unboxinator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - UNPACKAGER_UV.ID, - "basicmachine.unboxinator.tier.08", - "Unboxinator", - 8, - MachineType.UNPACKAGER.tooltipDescription(), - RecipeMaps.unpackagerRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "UNBOXINATOR", - null).getStackForm(1L)); - } - - private static void registerAssemblingMachine() { - - ItemList.Machine_LV_Assembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLER_LV.ID, - "basicmachine.assembler.tier.01", - "Basic Assembling Machine", - 1, - MachineType.ASSEMBLER.tooltipDescription(), - RecipeMaps.assemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Assembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLER_MV.ID, - "basicmachine.assembler.tier.02", - "Advanced Assembling Machine", - 2, - MachineType.ASSEMBLER.tooltipDescription(), - RecipeMaps.assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Assembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLER_HV.ID, - "basicmachine.assembler.tier.03", - "Advanced Assembling Machine II", - 3, - MachineType.ASSEMBLER.tooltipDescription(), - RecipeMaps.assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Assembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLER_EV.ID, - "basicmachine.assembler.tier.04", - "Advanced Assembling Machine III", - 4, - MachineType.ASSEMBLER.tooltipDescription(), - RecipeMaps.assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Assembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLER_IV.ID, - "basicmachine.assembler.tier.05", - "Advanced Assembling Machine IV", - 5, - MachineType.ASSEMBLER.tooltipDescription(), - RecipeMaps.assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.AssemblingMachineLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLING_MACHINE_LuV.ID, - "basicmachine.assembler.tier.06", - "Elite Assembling Machine", - 6, - MachineType.ASSEMBLER.tooltipDescription(), - assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.AssemblingMachineZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLING_MACHINE_ZPM.ID, - "basicmachine.assembler.tier.07", - "Elite Assembling Machine II", - 7, - MachineType.ASSEMBLER.tooltipDescription(), - assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.AssemblingMachineUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLING_MACHINE_UV.ID, - "basicmachine.assembler.tier.08", - "Ultimate Assembly Constructor", - 8, - MachineType.ASSEMBLER.tooltipDescription(), - assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.AssemblingMachineUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLING_MACHINE_UHV.ID, - "basicmachine.assembler.tier.09", - "Epic Assembly Constructor", - 9, - MachineType.ASSEMBLER.tooltipDescription(), - assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.AssemblingMachineUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLING_MACHINE_UEV.ID, - "basicmachine.assembler.tier.10", - "Epic Assembly Constructor II", - 10, - MachineType.ASSEMBLER.tooltipDescription(), - assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.AssemblingMachineUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLING_MACHINE_UIV.ID, - "basicmachine.assembler.tier.11", - "Epic Assembly Constructor III", - 11, - MachineType.ASSEMBLER.tooltipDescription(), - assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - - ItemList.AssemblingMachineUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ASSEMBLING_MACHINE_UMV.ID, - "basicmachine.assembler.tier.12", - "Epic Assembly Constructor IV", - 12, - MachineType.ASSEMBLER.tooltipDescription(), - assemblerRecipes, - 9, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ASSEMBLER", - null).getStackForm(1L)); - } - - private static void registerMatterAmplifier() { - ItemList.Machine_LV_Amplifab.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_LV.ID, - "basicmachine.amplifab.tier.01", - "Basic Amplifabricator", - 1, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - RecipeMaps.amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.Machine_MV_Amplifab.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_MV.ID, - "basicmachine.amplifab.tier.02", - "Advanced Amplifabricator", - 2, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - RecipeMaps.amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.Machine_HV_Amplifab.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_HV.ID, - "basicmachine.amplifab.tier.03", - "Advanced Amplifabricator II", - 3, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - RecipeMaps.amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.Machine_EV_Amplifab.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_EV.ID, - "basicmachine.amplifab.tier.04", - "Advanced Amplifabricator III", - 4, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - RecipeMaps.amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.Machine_IV_Amplifab.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_IV.ID, - "basicmachine.amplifab.tier.05", - "Advanced Amplifabricator IV", - 5, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - RecipeMaps.amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.AmplifabricatorLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_LuV.ID, - "basicmachine.amplifab.tier.06", - "Elite Amplifabricator", - 6, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.AmplifabricatorZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_ZPM.ID, - "basicmachine.amplifab.tier.07", - "Elite Amplifabricator II", - 7, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.AmplifabricatorUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_UV.ID, - "basicmachine.amplifab.tier.08", - "Ultimate Amplicreator", - 8, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.AmplifabricatorUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_UHV.ID, - "basicmachine.amplifab.tier.09", - "Epic Amplicreator", - 9, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.AmplifabricatorUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_UEV.ID, - "basicmachine.amplifab.tier.10", - "Epic Amplicreator II", - 10, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.AmplifabricatorUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_UIV.ID, - "basicmachine.amplifab.tier.11", - "Epic Amplicreator III", - 11, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - - ItemList.AmplifabricatorUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MATTER_AMPLIFIER_UMV.ID, - "basicmachine.amplifab.tier.12", - "Epic Amplicreator IV", - 12, - MachineType.MATTER_AMPLIFIER.tooltipDescription(), - amplifierRecipes, - 1, - 1, - 1000, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AMPLIFAB", - null).getStackForm(1L)); - } - - private static void registerAlloySmelter() { - ItemList.Machine_LV_AlloySmelter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_LV.ID, - "basicmachine.alloysmelter.tier.01", - "Basic Alloy Smelter", - 1, - MachineType.ALLOY_SMELTER.tooltipDescription(), - RecipeMaps.alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.Machine_MV_AlloySmelter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_MV.ID, - "basicmachine.alloysmelter.tier.02", - "Advanced Alloy Smelter", - 2, - MachineType.ALLOY_SMELTER.tooltipDescription(), - RecipeMaps.alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.Machine_HV_AlloySmelter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_HV.ID, - "basicmachine.alloysmelter.tier.03", - "Advanced Alloy Smelter II", - 3, - MachineType.ALLOY_SMELTER.tooltipDescription(), - RecipeMaps.alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.Machine_EV_AlloySmelter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_EV.ID, - "basicmachine.alloysmelter.tier.04", - "Advanced Alloy Smelter III", - 4, - MachineType.ALLOY_SMELTER.tooltipDescription(), - RecipeMaps.alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.Machine_IV_AlloySmelter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_IV.ID, - "basicmachine.alloysmelter.tier.05", - "Advanced Alloy Smelter IV", - 5, - MachineType.ALLOY_SMELTER.tooltipDescription(), - RecipeMaps.alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.AlloySmelterLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_LuV.ID, - "basicmachine.alloysmelter.tier.06", - "Elite Alloy Smelter", - 6, - MachineType.ALLOY_SMELTER.tooltipDescription(), - alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.AlloySmelterZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_ZPM.ID, - "basicmachine.alloysmelter.tier.07", - "Elite Alloy Smelter II", - 7, - MachineType.ALLOY_SMELTER.tooltipDescription(), - alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.AlloySmelterUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_UV.ID, - "basicmachine.alloysmelter.tier.08", - "Ultimate Alloy Integrator", - 8, - MachineType.ALLOY_SMELTER.tooltipDescription(), - alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.AlloySmelterUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_UHV.ID, - "basicmachine.alloysmelter.tier.09", - "Epic Alloy Integrator", - 9, - MachineType.ALLOY_SMELTER.tooltipDescription(), - alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.AlloySmelterUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_UEV.ID, - "basicmachine.alloysmelter.tier.10", - "Epic Alloy Integrator II", - 10, - MachineType.ALLOY_SMELTER.tooltipDescription(), - alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.AlloySmelterUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_UIV.ID, - "basicmachine.alloysmelter.tier.11", - "Epic Alloy Integrator III", - 11, - MachineType.ALLOY_SMELTER.tooltipDescription(), - alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - - ItemList.AlloySmelterUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ALLOY_SMELTER_UMV.ID, - "basicmachine.alloysmelter.tier.12", - "Epic Alloy Integrator IV", - 12, - MachineType.ALLOY_SMELTER.tooltipDescription(), - alloySmelterRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ALLOY_SMELTER", - null).getStackForm(1L)); - } - - private static void registerHPSteamMachines() { - ItemList.Machine_HP_Extractor.set( - new GT_MetaTileEntity_Extractor_Steel( - HP_STEAM_EXTRACTOR.ID, - "hpmachine.extractor", - "High Pressure Extractor").getStackForm(1L)); - ItemList.Machine_HP_Furnace.set( - new GT_MetaTileEntity_Furnace_Steel(HP_STEAM_FURNACE.ID, "hpmachine.furnace", "High Pressure Furnace") - .getStackForm(1L)); - ItemList.Machine_HP_Macerator.set( - new GT_MetaTileEntity_Macerator_Steel( - HP_STEAM_MACERATOR.ID, - "hpmachine.macerator", - "High Pressure Macerator").getStackForm(1L)); - ItemList.Machine_HP_Hammer.set( - new GT_MetaTileEntity_ForgeHammer_Steel( - HP_STEAM_FORGE_HAMMER.ID, - "hpmachine.hammer", - "High Pressure Forge Hammer").getStackForm(1L)); - ItemList.Machine_HP_Compressor.set( - new GT_MetaTileEntity_Compressor_Steel( - HP_STEAM_COMPRESSOR.ID, - "hpmachine.compressor", - "High Pressure Compressor").getStackForm(1L)); - ItemList.Machine_HP_AlloySmelter.set( - new GT_MetaTileEntity_AlloySmelter_Steel( - HP_STEAM_ALLOY_SMELTER.ID, - "hpmachine.alloysmelter", - "High Pressure Alloy Smelter").getStackForm(1L)); - } - - private static void registerLocker() { - ItemList.Locker_ULV.set( - new GT_MetaTileEntity_Locker(LOCKER_ULV.ID, "locker.tier.00", "Ultra Low Voltage Locker", 0) - .getStackForm(1L)); - ItemList.Locker_LV.set( - new GT_MetaTileEntity_Locker(LOCKER_LV.ID, "locker.tier.01", "Low Voltage Locker", 1).getStackForm(1L)); - ItemList.Locker_MV.set( - new GT_MetaTileEntity_Locker(LOCKER_MV.ID, "locker.tier.02", "Medium Voltage Locker", 2).getStackForm(1L)); - ItemList.Locker_HV.set( - new GT_MetaTileEntity_Locker(LOCKER_HV.ID, "locker.tier.03", "High Voltage Locker", 3).getStackForm(1L)); - ItemList.Locker_EV.set( - new GT_MetaTileEntity_Locker(LOCKER_EV.ID, "locker.tier.04", "Extreme Voltage Locker", 4).getStackForm(1L)); - ItemList.Locker_IV.set( - new GT_MetaTileEntity_Locker(LOCKER_IV.ID, "locker.tier.05", "Insane Voltage Locker", 5).getStackForm(1L)); - ItemList.Locker_LuV.set( - new GT_MetaTileEntity_Locker(LOCKER_LuV.ID, "locker.tier.06", "Ludicrous Voltage Locker", 6) - .getStackForm(1L)); - ItemList.Locker_ZPM.set( - new GT_MetaTileEntity_Locker(LOCKER_ZPM.ID, "locker.tier.07", "ZPM Voltage Locker", 7).getStackForm(1L)); - ItemList.Locker_UV.set( - new GT_MetaTileEntity_Locker(LOCKER_UV.ID, "locker.tier.08", "Ultimate Voltage Locker", 8) - .getStackForm(1L)); - ItemList.Locker_MAX.set( - new GT_MetaTileEntity_Locker(LOCKER_UHV.ID, "locker.tier.09", "Highly Ultimate Voltage Locker", 9) - .getStackForm(1L)); - } - - private static void registerScanner() { - ItemList.Machine_LV_Scanner.set( - new GT_MetaTileEntity_Scanner(SCANNER_LV.ID, "basicmachine.scanner.tier.01", "Basic Scanner", 1) - .getStackForm(1L)); - ItemList.Machine_MV_Scanner.set( - new GT_MetaTileEntity_Scanner(SCANNER_MV.ID, "basicmachine.scanner.tier.02", "Advanced Scanner", 2) - .getStackForm(1L)); - ItemList.Machine_HV_Scanner.set( - new GT_MetaTileEntity_Scanner(SCANNER_HV.ID, "basicmachine.scanner.tier.03", "Advanced Scanner II", 3) - .getStackForm(1L)); - ItemList.Machine_EV_Scanner.set( - new GT_MetaTileEntity_Scanner(SCANNER_EV.ID, "basicmachine.scanner.tier.04", "Advanced Scanner III", 4) - .getStackForm(1L)); - ItemList.Machine_IV_Scanner.set( - new GT_MetaTileEntity_Scanner(SCANNER_IV.ID, "basicmachine.scanner.tier.05", "Advanced Scanner IV", 5) - .getStackForm(1L)); - ItemList.ScannerLuV.set( - new GT_MetaTileEntity_Scanner(SCANNER_LuV.ID, "basicmachine.scanner.tier.06", "Elite Scanner", 6) - .getStackForm(1L)); - ItemList.ScannerZPM.set( - new GT_MetaTileEntity_Scanner(SCANNER_ZPM.ID, "basicmachine.scanner.tier.07", "Elite Scanner II", 7) - .getStackForm(1L)); - ItemList.ScannerUV.set( - new GT_MetaTileEntity_Scanner( - SCANNER_UV.ID, - "basicmachine.scanner.tier.08", - "Ultimate Electron Microscope", - 8).getStackForm(1L)); - ItemList.ScannerUHV.set( - new GT_MetaTileEntity_Scanner(SCANNER_UHV.ID, "basicmachine.scanner.tier.09", "Epic Electron Microscope", 9) - .getStackForm(1L)); - ItemList.ScannerUEV.set( - new GT_MetaTileEntity_Scanner( - SCANNER_UEV.ID, - "basicmachine.scanner.tier.10", - "Epic Electron Microscope II", - 10).getStackForm(1L)); - ItemList.ScannerUIV.set( - new GT_MetaTileEntity_Scanner( - SCANNER_UIV.ID, - "basicmachine.scanner.tier.11", - "Epic Electron Microscope III", - 11).getStackForm(1L)); - ItemList.ScannerUMV.set( - new GT_MetaTileEntity_Scanner( - SCANNER_UMV.ID, - "basicmachine.scanner.tier.12", - "Epic Electron Microscope IV", - 12).getStackForm(1L)); - } - - private static void registerPackager() { - ItemList.Machine_LV_Boxinator.set( - new GT_MetaTileEntity_Boxinator(PACKAGER_LV.ID, "basicmachine.boxinator.tier.01", "Basic Packager", 1) - .getStackForm(1L)); - ItemList.Machine_MV_Boxinator.set( - new GT_MetaTileEntity_Boxinator(PACKAGER_MV.ID, "basicmachine.boxinator.tier.02", "Advanced Packager", 2) - .getStackForm(1L)); - ItemList.Machine_HV_Boxinator.set( - new GT_MetaTileEntity_Boxinator(PACKAGER_HV.ID, "basicmachine.boxinator.tier.03", "Advanced Packager II", 3) - .getStackForm(1L)); - ItemList.Machine_EV_Boxinator.set( - new GT_MetaTileEntity_Boxinator( - PACKAGER_EV.ID, - "basicmachine.boxinator.tier.04", - "Advanced Packager III", - 4).getStackForm(1L)); - ItemList.Machine_IV_Boxinator.set( - new GT_MetaTileEntity_Boxinator(PACKAGER_IV.ID, "basicmachine.boxinator.tier.05", "Boxinator", 5) - .getStackForm(1L)); - ItemList.Machine_LuV_Boxinator.set( - new GT_MetaTileEntity_Boxinator(PACKAGER_LuV.ID, "basicmachine.boxinator.tier.06", "Boxinator", 6) - .getStackForm(1L)); - ItemList.Machine_ZPM_Boxinator.set( - new GT_MetaTileEntity_Boxinator(PACKAGER_ZPM.ID, "basicmachine.boxinator.tier.07", "Boxinator", 7) - .getStackForm(1L)); - ItemList.Machine_UV_Boxinator.set( - new GT_MetaTileEntity_Boxinator(PACKAGER_UV.ID, "basicmachine.boxinator.tier.08", "Boxinator", 8) - .getStackForm(1L)); - } - - private static void registerRockBreaker() { - ItemList.Machine_LV_RockBreaker.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_LV.ID, - "basicmachine.rockbreaker.tier.01", - "Basic Rock Breaker", - 1).getStackForm(1L)); - ItemList.Machine_MV_RockBreaker.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_MV.ID, - "basicmachine.rockbreaker.tier.02", - "Advanced Rock Breaker", - 2).getStackForm(1L)); - ItemList.Machine_HV_RockBreaker.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_HV.ID, - "basicmachine.rockbreaker.tier.03", - "Advanced Rock Breaker II", - 3).getStackForm(1L)); - ItemList.Machine_EV_RockBreaker.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_EV.ID, - "basicmachine.rockbreaker.tier.04", - "Advanced Rock Breaker III", - 4).getStackForm(1L)); - ItemList.Machine_IV_RockBreaker.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_IV.ID, - "basicmachine.rockbreaker.tier.05", - "Cryogenic Magma Solidifier R-8200", - 5).getStackForm(1L)); - ItemList.RockBreakerLuV.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_LuV.ID, - "rockbreaker.tier.06", - "Cryogenic Magma Solidifier R-9200", - 6).getStackForm(1L)); - - ItemList.RockBreakerZPM.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_ZPM.ID, - "rockbreaker.tier.07", - "Cryogenic Magma Solidifier R-10200", - 7).getStackForm(1L)); - - ItemList.RockBreakerUV.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_UV.ID, - "rockbreaker.tier.08", - "Cryogenic Magma Solidifier R-11200", - 8).getStackForm(1L)); - - ItemList.RockBreakerUHV.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_UHV.ID, - "rockbreaker.tier.09", - "Cryogenic Magma Solidifier R-12200", - 9).getStackForm(1L)); - - ItemList.RockBreakerUEV.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_UEV.ID, - "rockbreaker.tier.10", - "Cryogenic Magma Solidifier R-13200", - 10).getStackForm(1L)); - - ItemList.RockBreakerUIV.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_UIV.ID, - "rockbreaker.tier.11", - "Cryogenic Magma Solidifier R-14200", - 11).getStackForm(1L)); - - ItemList.RockBreakerUMV.set( - new GT_MetaTileEntity_RockBreaker( - ROCK_BREAKER_UMV.ID, - "rockbreaker.tier.12", - "Cryogenic Magma Solidifier R-15200", - 12).getStackForm(1L)); - } - - private static void registerIndustrialApiary() { - if (Forestry.isModLoaded()) { - ItemList.Machine_IndustrialApiary.set( - new GT_MetaTileEntity_IndustrialApiary( - INDUSTRIAL_APIARY.ID, - "basicmachine.industrialapiary", - "Industrial Apiary", - 8).getStackForm(1L)); - } - } - - private static void registerMassFab() { - ItemList.Machine_LV_Massfab.set( - new GT_MetaTileEntity_Massfabricator( - MASS_FABRICATOR_LV.ID, - "basicmachine.massfab.tier.01", - "Basic Mass Fabricator", - 1).getStackForm(1L)); - ItemList.Machine_MV_Massfab.set( - new GT_MetaTileEntity_Massfabricator( - MASS_FABRICATOR_MV.ID, - "basicmachine.massfab.tier.02", - "Advanced Mass Fabricator", - 2).getStackForm(1L)); - ItemList.Machine_HV_Massfab.set( - new GT_MetaTileEntity_Massfabricator( - MASS_FABRICATOR_HV.ID, - "basicmachine.massfab.tier.03", - "Advanced Mass Fabricator II", - 3).getStackForm(1L)); - ItemList.Machine_EV_Massfab.set( - new GT_MetaTileEntity_Massfabricator( - MASS_FABRICATOR_EV.ID, - "basicmachine.massfab.tier.04", - "Advanced Mass Fabricator III", - 4).getStackForm(1L)); - ItemList.Machine_IV_Massfab.set( - new GT_MetaTileEntity_Massfabricator( - MASS_FABRICATOR_IV.ID, - "basicmachine.massfab.tier.05", - "Advanced Mass Fabricator IV", - 5).getStackForm(1L)); - } - - private static void registerReplicator() { - ItemList.Machine_LV_Replicator.set( - new GT_MetaTileEntity_Replicator(REPLICATOR_LV.ID, "basicmachine.replicator.tier.01", "Basic Replicator", 1) - .getStackForm(1L)); - ItemList.Machine_MV_Replicator.set( - new GT_MetaTileEntity_Replicator( - REPLICATOR_MV.ID, - "basicmachine.replicator.tier.02", - "Advanced Replicator", - 2).getStackForm(1L)); - ItemList.Machine_HV_Replicator.set( - new GT_MetaTileEntity_Replicator( - REPLICATOR_HV.ID, - "basicmachine.replicator.tier.03", - "Advanced Replicator II", - 3).getStackForm(1L)); - ItemList.Machine_EV_Replicator.set( - new GT_MetaTileEntity_Replicator( - REPLICATOR_EV.ID, - "basicmachine.replicator.tier.04", - "Advanced Replicator III", - 4).getStackForm(1L)); - ItemList.Machine_IV_Replicator.set( - new GT_MetaTileEntity_Replicator( - REPLICATOR_IV.ID, - "basicmachine.replicator.tier.05", - "Advanced Replicator IV", - 5).getStackForm(1L)); - - ItemList.ReplicatorLuV.set( - new GT_MetaTileEntity_Replicator( - MATTER_REPLICATOR_LuV.ID, - "basicmachine.replicator.tier.06", - "Elite Replicator", - 6).getStackForm(1L)); - ItemList.ReplicatorZPM.set( - new GT_MetaTileEntity_Replicator( - MATTER_REPLICATOR_ZPM.ID, - "basicmachine.replicator.tier.07", - "Elite Replicator II", - 7).getStackForm(1L)); - ItemList.ReplicatorUV.set( - new GT_MetaTileEntity_Replicator( - MATTER_REPLICATOR_UV.ID, - "basicmachine.replicator.tier.08", - "Ultimate Elemental Composer", - 8).getStackForm(1L)); - ItemList.ReplicatorUHV.set( - new GT_MetaTileEntity_Replicator( - MATTER_REPLICATOR_UHV.ID, - "basicmachine.replicator.tier.09", - "Epic Elemental Composer", - 9).getStackForm(1L)); - ItemList.ReplicatorUEV.set( - new GT_MetaTileEntity_Replicator( - MATTER_REPLICATOR_UEV.ID, - "basicmachine.replicator.tier.10", - "Epic Elemental Composer II", - 10).getStackForm(1L)); - ItemList.ReplicatorUIV.set( - new GT_MetaTileEntity_Replicator( - MATTER_REPLICATOR_UIV.ID, - "basicmachine.replicator.tier.11", - "Epic Elemental Composer III", - 11).getStackForm(1L)); - ItemList.ReplicatorUMV.set( - new GT_MetaTileEntity_Replicator( - MATTER_REPLICATOR_UMV.ID, - "basicmachine.replicator.tier.12", - "Epic Elemental Composer IV", - 12).getStackForm(1L)); - } - - private static void registerBrewery() { - ItemList.Machine_LV_Brewery.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_LV.ID, "basicmachine.brewery.tier.01", "Basic Brewery", 1) - .getStackForm(1L)); - ItemList.Machine_MV_Brewery.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_MV.ID, "basicmachine.brewery.tier.02", "Advanced Brewery", 2) - .getStackForm(1L)); - ItemList.Machine_HV_Brewery.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_HV.ID, "basicmachine.brewery.tier.03", "Advanced Brewery II", 3) - .getStackForm(1L)); - ItemList.Machine_EV_Brewery.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_EV.ID, "basicmachine.brewery.tier.04", "Advanced Brewery III", 4) - .getStackForm(1L)); - ItemList.Machine_IV_Brewery.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_IV.ID, "basicmachine.brewery.tier.05", "Advanced Brewery IV", 5) - .getStackForm(1L)); - - ItemList.BreweryLuV.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_LuV.ID, "basicmachine.brewery.tier.06", "Elite Brewery", 6) - .getStackForm(1L)); - ItemList.BreweryZPM.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_ZPM.ID, "basicmachine.brewery.tier.07", "Elite Brewery II", 7) - .getStackForm(1L)); - ItemList.BreweryUV.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_UV.ID, "basicmachine.brewery.tier.08", "Ultimate Brew Rusher", 8) - .getStackForm(1L)); - ItemList.BreweryUHV.set( - new GT_MetaTileEntity_PotionBrewer(BREWERY_UHV.ID, "basicmachine.brewery.tier.09", "Epic Brew Rusher", 9) - .getStackForm(1L)); - ItemList.BreweryUEV.set( - new GT_MetaTileEntity_PotionBrewer( - BREWERY_UEV.ID, - "basicmachine.brewery.tier.10", - "Epic Brew Rusher II", - 10).getStackForm(1L)); - ItemList.BreweryUIV.set( - new GT_MetaTileEntity_PotionBrewer( - BREWERY_UIV.ID, - "basicmachine.brewery.tier.11", - "Epic Brew Rusher III", - 11).getStackForm(1L)); - ItemList.BreweryUMV.set( - new GT_MetaTileEntity_PotionBrewer( - BREWERY_UMV.ID, - "basicmachine.brewery.tier.12", - "Epic Brew Rusher IV", - 12).getStackForm(1L)); - } - - private static void registerMiner() { - ItemList.Machine_LV_Miner.set( - new GT_MetaTileEntity_Miner(MINER_LV.ID, "basicmachine.miner.tier.01", "Basic Miner", 1).getStackForm(1L)); - ItemList.Machine_MV_Miner.set( - new GT_MetaTileEntity_Miner(MINER_MV.ID, "basicmachine.miner.tier.02", "Good Miner", 2).getStackForm(1L)); - ItemList.Machine_HV_Miner.set( - new GT_MetaTileEntity_Miner(MINER_HV.ID, "basicmachine.miner.tier.03", "Advanced Miner", 3) - .getStackForm(1L)); - } - - private static void registerPump() { - ItemList.Pump_LV - .set(new GT_MetaTileEntity_Pump(PUMP_LV.ID, "basicmachine.pump.tier.01", "Basic Pump", 1).getStackForm(1L)); - ItemList.Pump_MV.set( - new GT_MetaTileEntity_Pump(PUMP_MV.ID, "basicmachine.pump.tier.02", "Advanced Pump", 2).getStackForm(1L)); - ItemList.Pump_HV.set( - new GT_MetaTileEntity_Pump(PUMP_HV.ID, "basicmachine.pump.tier.03", "Advanced Pump II", 3) - .getStackForm(1L)); - ItemList.Pump_EV.set( - new GT_MetaTileEntity_Pump(PUMP_EV.ID, "basicmachine.pump.tier.04", "Advanced Pump III", 4) - .getStackForm(1L)); - ItemList.Pump_IV.set( - new GT_MetaTileEntity_Pump(PUMP_IV.ID, "basicmachine.pump.tier.05", "Advanced Pump IV", 5) - .getStackForm(1L)); - ItemList.PumpLuV.set( - new GT_MetaTileEntity_Pump(PUMP_LuV.ID, "basicmachine.pump.tier.06", "Lake Dislocator", 6) - .getStackForm(1L)); - ItemList.PumpZPM.set( - new GT_MetaTileEntity_Pump(PUMP_ZPM.ID, "basicmachine.pump.tier.07", "Ocean Transposer", 7) - .getStackForm(1L)); - } - - private static void registerTeleporter() { - ItemList.Teleporter.set( - new GT_MetaTileEntity_Teleporter(TELEPORTER.ID, "basicmachine.teleporter", "Teleporter", 9) - .getStackForm(1L)); - } - - private static void registerMonsterRepellator() { - ItemList.MobRep_LV.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_LV.ID, - "basicmachine.mobrep.tier.01", - "Basic Monster Repellator", - 1).getStackForm(1L)); - ItemList.MobRep_MV.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_MV.ID, - "basicmachine.mobrep.tier.02", - "Advanced Monster Repellator", - 2).getStackForm(1L)); - ItemList.MobRep_HV.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_HV.ID, - "basicmachine.mobrep.tier.03", - "Advanced Monster Repellator II", - 3).getStackForm(1L)); - ItemList.MobRep_EV.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_EV.ID, - "basicmachine.mobrep.tier.04", - "Advanced Monster Repellator III", - 4).getStackForm(1L)); - ItemList.MobRep_IV.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_IV.ID, - "basicmachine.mobrep.tier.05", - "Advanced Monster Repellator IV", - 5).getStackForm(1L)); - ItemList.MobRep_LuV.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_LuV.ID, - "basicmachine.mobrep.tier.06", - "Advanced Monster Repellator V", - 6).getStackForm(1L)); - ItemList.MobRep_ZPM.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_ZPM.ID, - "basicmachine.mobrep.tier.07", - "Advanced Monster Repellator VI", - 7).getStackForm(1L)); - ItemList.MobRep_UV.set( - new GT_MetaTileEntity_MonsterRepellent( - MONSTER_REPELLATOR_UV.ID, - "basicmachine.mobrep.tier.08", - "Advanced Monster Repellator VII", - 8).getStackForm(1L)); - } - - private void registerWorldAccelerator() { - ItemList.AcceleratorLV.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_LV.ID, - "basicmachine.accelerator.tier.01", - "Basic World Accelerator", - 1).getStackForm(1L)); - ItemList.AcceleratorMV.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_MV.ID, - "basicmachine.accelerator.tier.02", - "Advanced World Accelerator", - 2).getStackForm(1L)); - ItemList.AcceleratorHV.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_HV.ID, - "basicmachine.accelerator.tier.03", - "Advanced World Accelerator II", - 3).getStackForm(1L)); - ItemList.AcceleratorEV.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_EV.ID, - "basicmachine.accelerator.tier.04", - "Advanced World Accelerator III", - 4).getStackForm(1L)); - ItemList.AcceleratorIV.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_IV.ID, - "basicmachine.accelerator.tier.05", - "Advanced World Accelerator IV", - 5).getStackForm(1L)); - ItemList.AcceleratorLuV.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_LuV.ID, - "basicmachine.accelerator.tier.06", - "Elite World Accelerator", - 6).getStackForm(1L)); - ItemList.AcceleratorZPM.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_ZPM.ID, - "basicmachine.accelerator.tier.07", - "Elite World Accelerator II", - 7).getStackForm(1L)); - ItemList.AcceleratorUV.set( - new GT_MetaTileEntity_WorldAccelerator( - WORLD_ACCELERATOR_UV.ID, - "basicmachine.accelerator.tier.08", - "Ultimate Time Anomaly", - 8).getStackForm(1L)); - - } - - private static void registerAdvancedSeismicProspector() { - ItemList.Seismic_Prospector_Adv_LV.set( - new GT_MetaTileEntity_AdvSeismicProspector( - ADVANCED_SEISMIC_PROSPECTOR_LV.ID, - "basicmachine.seismicprospector.07", - "Advanced Seismic Prospector LV", - 1, - 5 * 16 / 2, - 2).getStackForm(1)); - ItemList.Seismic_Prospector_Adv_MV.set( - new GT_MetaTileEntity_AdvSeismicProspector( - ADVANCED_SEISMIC_PROSPECTOR_MV.ID, - "basicmachine.seismicprospector.06", - "Advanced Seismic Prospector MV", - 2, - 7 * 16 / 2, - 2).getStackForm(1)); - ItemList.Seismic_Prospector_Adv_HV.set( - new GT_MetaTileEntity_AdvSeismicProspector( - ADVANCED_SEISMIC_PROSPECTOR_HV.ID, - "basicmachine.seismicprospector.05", - "Advanced Seismic Prospector HV", - 3, - 9 * 16 / 2, - 2).getStackForm(1)); - ItemList.Seismic_Prospector_Adv_EV.set( - new GT_MetaTileEntity_AdvSeismicProspector( - ADVANCED_SEISMIC_PROSPECTOR_EV.ID, - "basicmachine.seismicprospector.04", - "Advanced Seismic Prospector EV", - 4, - 11 * 16 / 2, - 2).getStackForm(1)); - } - - private static void registerMicrowaveEnergyTransmitter() { - ItemList.MicroTransmitter_HV.set( - new GT_MetaTileEntity_MicrowaveEnergyTransmitter( - MICROWAVE_ENERGY_TRANSMITTER_HV.ID, - "basicmachine.microtransmitter.03", - "HV Microwave Energy Transmitter", - 3).getStackForm(1L)); - ItemList.MicroTransmitter_EV.set( - new GT_MetaTileEntity_MicrowaveEnergyTransmitter( - MICROWAVE_ENERGY_TRANSMITTER_EV.ID, - "basicmachine.microtransmitter.04", - "EV Microwave Energy Transmitter", - 4).getStackForm(1L)); - ItemList.MicroTransmitter_IV.set( - new GT_MetaTileEntity_MicrowaveEnergyTransmitter( - MICROWAVE_ENERGY_TRANSMITTER_IV.ID, - "basicmachine.microtransmitter.05", - "IV Microwave Energy Transmitter", - 5).getStackForm(1L)); - ItemList.MicroTransmitter_LUV.set( - new GT_MetaTileEntity_MicrowaveEnergyTransmitter( - MICROWAVE_ENERGY_TRANSMITTER_LuV.ID, - "basicmachine.microtransmitter.06", - "LuV Microwave Energy Transmitter", - 6).getStackForm(1L)); - ItemList.MicroTransmitter_ZPM.set( - new GT_MetaTileEntity_MicrowaveEnergyTransmitter( - MICROWAVE_ENERGY_TRANSMITTER_ZPM.ID, - "basicmachine.microtransmitter.07", - "ZPM Microwave Energy Transmitter", - 7).getStackForm(1L)); - ItemList.MicroTransmitter_UV.set( - new GT_MetaTileEntity_MicrowaveEnergyTransmitter( - MICROWAVE_ENERGY_TRANSMITTER_UV.ID, - "basicmachine.microtransmitter.08", - "UV Microwave Energy Transmitter", - 8).getStackForm(1L)); - } - - private static void registerBetterJukebox() { - ItemList.BetterJukebox_LV.set( - new GT_MetaTileEntity_BetterJukebox( - BETTER_JUKEBOX_LV.ID, - "basicmachine.betterjukebox.tier.01", - "Basic Electric Jukebox", - 1).getStackForm(1L)); - ItemList.BetterJukebox_MV.set( - new GT_MetaTileEntity_BetterJukebox( - BETTER_JUKEBOX_MV.ID, - "basicmachine.betterjukebox.tier.02", - "Advanced Electric Jukebox", - 2).getStackForm(1L)); - ItemList.BetterJukebox_HV.set( - new GT_MetaTileEntity_BetterJukebox( - BETTER_JUKEBOX_HV.ID, - "basicmachine.betterjukebox.tier.03", - "Advanced Electric Jukebox II", - 3).getStackForm(1L)); - ItemList.BetterJukebox_EV.set( - new GT_MetaTileEntity_BetterJukebox( - BETTER_JUKEBOX_EV.ID, - "basicmachine.betterjukebox.tier.04", - "Extreme Music Mixer", - 4).getStackForm(1L)); - ItemList.BetterJukebox_IV.set( - new GT_MetaTileEntity_BetterJukebox( - BETTER_JUKEBOX_IV.ID, - "basicmachine.betterjukebox.tier.05", - "Duke Mix'em 3D", - 5).getStackForm(1L)); - } - - private static void registerChestBuffer() { - ItemList.Automation_ChestBuffer_ULV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_ULV.ID, - "automation.chestbuffer.tier.00", - "Ultra Low Voltage Chest Buffer", - 0).getStackForm(1L)); - ItemList.Automation_ChestBuffer_LV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_LV.ID, - "automation.chestbuffer.tier.01", - "Low Voltage Chest Buffer", - 1).getStackForm(1L)); - ItemList.Automation_ChestBuffer_MV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_MV.ID, - "automation.chestbuffer.tier.02", - "Medium Voltage Chest Buffer", - 2).getStackForm(1L)); - ItemList.Automation_ChestBuffer_HV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_HV.ID, - "automation.chestbuffer.tier.03", - "High Voltage Chest Buffer", - 3).getStackForm(1L)); - ItemList.Automation_ChestBuffer_EV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_EV.ID, - "automation.chestbuffer.tier.04", - "Extreme Voltage Chest Buffer", - 4).getStackForm(1L)); - ItemList.Automation_ChestBuffer_IV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_IV.ID, - "automation.chestbuffer.tier.05", - "Insane Voltage Chest Buffer", - 5).getStackForm(1L)); - ItemList.Automation_ChestBuffer_LuV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_LuV.ID, - "automation.chestbuffer.tier.06", - "Ludicrous Voltage Chest Buffer", - 6).getStackForm(1L)); - ItemList.Automation_ChestBuffer_ZPM.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_ZPM.ID, - "automation.chestbuffer.tier.07", - "ZPM Voltage Chest Buffer", - 7).getStackForm(1L)); - ItemList.Automation_ChestBuffer_UV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_UV.ID, - "automation.chestbuffer.tier.08", - "Ultimate Voltage Chest Buffer", - 8).getStackForm(1L)); - ItemList.Automation_ChestBuffer_UHV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_UHV.ID, - "automation.chestbuffer.tier.09", - "Highly Ultimate Voltage Chest Buffer", - 9).getStackForm(1L)); - - ItemList.Automation_ChestBuffer_UEV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_UEV.ID, - "automation.chestbuffer.tier.10", - "Ultra High Voltage Chest Buffer", - 10).getStackForm(1L)); - - ItemList.Automation_ChestBuffer_UIV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_UIV.ID, - "automation.chestbuffer.tier.11", - "UIV Voltage Chest Buffer", - 11).getStackForm(1L)); - - ItemList.Automation_ChestBuffer_UMV.set( - new GT_MetaTileEntity_ChestBuffer( - CHEST_BUFFER_UMV.ID, - "automation.chestbuffer.tier.12", - "UMV Voltage Chest Buffer", - 12).getStackForm(1L)); - } - - private static void registerItemFilter() { - ItemList.Automation_Filter_ULV.set( - new GT_MetaTileEntity_Filter( - ITEM_FILTER_ULV.ID, - "automation.filter.tier.00", - "Ultra Low Voltage Item Filter", - 0).getStackForm(1L)); - ItemList.Automation_Filter_LV.set( - new GT_MetaTileEntity_Filter(ITEM_FILTER_LV.ID, "automation.filter.tier.01", "Low Voltage Item Filter", 1) - .getStackForm(1L)); - ItemList.Automation_Filter_MV.set( - new GT_MetaTileEntity_Filter( - ITEM_FILTER_MV.ID, - "automation.filter.tier.02", - "Medium Voltage Item Filter", - 2).getStackForm(1L)); - ItemList.Automation_Filter_HV.set( - new GT_MetaTileEntity_Filter(ITEM_FILTER_HV.ID, "automation.filter.tier.03", "High Voltage Item Filter", 3) - .getStackForm(1L)); - ItemList.Automation_Filter_EV.set( - new GT_MetaTileEntity_Filter( - ITEM_FILTER_EV.ID, - "automation.filter.tier.04", - "Extreme Voltage Item Filter", - 4).getStackForm(1L)); - ItemList.Automation_Filter_IV.set( - new GT_MetaTileEntity_Filter( - ITEM_FILTER_IV.ID, - "automation.filter.tier.05", - "Insane Voltage Item Filter", - 5).getStackForm(1L)); - ItemList.Automation_Filter_LuV.set( - new GT_MetaTileEntity_Filter( - ITEM_FILTER_LuV.ID, - "automation.filter.tier.06", - "Ludicrous Voltage Item Filter", - 6).getStackForm(1L)); - ItemList.Automation_Filter_ZPM.set( - new GT_MetaTileEntity_Filter(ITEM_FILTER_ZPM.ID, "automation.filter.tier.07", "ZPM Voltage Item Filter", 7) - .getStackForm(1L)); - ItemList.Automation_Filter_UV.set( - new GT_MetaTileEntity_Filter( - ITEM_FILTER_UV.ID, - "automation.filter.tier.08", - "Ultimate Voltage Item Filter", - 8).getStackForm(1L)); - ItemList.Automation_Filter_MAX.set( - new GT_MetaTileEntity_Filter( - ITEM_FILTER_UHV.ID, - "automation.filter.tier.09", - "Highly Ultimate Voltage Item Filter", - 9).getStackForm(1L)); - } - - private static void registerTypeFilter() { - ItemList.Automation_TypeFilter_ULV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_ULV.ID, - "automation.typefilter.tier.00", - "Ultra Low Voltage Type Filter", - 0).getStackForm(1L)); - ItemList.Automation_TypeFilter_LV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_LV.ID, - "automation.typefilter.tier.01", - "Low Voltage Type Filter", - 1).getStackForm(1L)); - ItemList.Automation_TypeFilter_MV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_MV.ID, - "automation.typefilter.tier.02", - "Medium Voltage Type Filter", - 2).getStackForm(1L)); - ItemList.Automation_TypeFilter_HV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_HV.ID, - "automation.typefilter.tier.03", - "High Voltage Type Filter", - 3).getStackForm(1L)); - ItemList.Automation_TypeFilter_EV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_EV.ID, - "automation.typefilter.tier.04", - "Extreme Voltage Type Filter", - 4).getStackForm(1L)); - ItemList.Automation_TypeFilter_IV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_IV.ID, - "automation.typefilter.tier.05", - "Insane Voltage Type Filter", - 5).getStackForm(1L)); - ItemList.Automation_TypeFilter_LuV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_LuV.ID, - "automation.typefilter.tier.06", - "Ludicrous Voltage Type Filter", - 6).getStackForm(1L)); - ItemList.Automation_TypeFilter_ZPM.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_ZPM.ID, - "automation.typefilter.tier.07", - "ZPM Voltage Type Filter", - 7).getStackForm(1L)); - ItemList.Automation_TypeFilter_UV.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_UV.ID, - "automation.typefilter.tier.08", - "Ultimate Voltage Type Filter", - 8).getStackForm(1L)); - ItemList.Automation_TypeFilter_MAX.set( - new GT_MetaTileEntity_TypeFilter( - TYPE_FILTER_UHV.ID, - "automation.typefilter.tier.09", - "Highly Ultimate Voltage Type Filter", - 9).getStackForm(1L)); - } - - private static void registerRegulator() { - ItemList.Automation_Regulator_ULV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_ULV.ID, - "automation.regulator.tier.00", - "Ultra Low Voltage Regulator", - 0).getStackForm(1L)); - ItemList.Automation_Regulator_LV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_LV.ID, - "automation.regulator.tier.01", - "Low Voltage Regulator", - 1).getStackForm(1L)); - ItemList.Automation_Regulator_MV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_MV.ID, - "automation.regulator.tier.02", - "Medium Voltage Regulator", - 2).getStackForm(1L)); - ItemList.Automation_Regulator_HV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_HV.ID, - "automation.regulator.tier.03", - "High Voltage Regulator", - 3).getStackForm(1L)); - ItemList.Automation_Regulator_EV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_EV.ID, - "automation.regulator.tier.04", - "Extreme Voltage Regulator", - 4).getStackForm(1L)); - ItemList.Automation_Regulator_IV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_IV.ID, - "automation.regulator.tier.05", - "Insane Voltage Regulator", - 5).getStackForm(1L)); - ItemList.Automation_Regulator_LuV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_LuV.ID, - "automation.regulator.tier.06", - "Ludicrous Voltage Regulator", - 6).getStackForm(1L)); - ItemList.Automation_Regulator_ZPM.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_ZPM.ID, - "automation.regulator.tier.07", - "ZPM Voltage Regulator", - 7).getStackForm(1L)); - ItemList.Automation_Regulator_UV.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_UV.ID, - "automation.regulator.tier.08", - "Ultimate Voltage Regulator", - 8).getStackForm(1L)); - ItemList.Automation_Regulator_MAX.set( - new GT_MetaTileEntity_Regulator( - VOLTAGE_REGULATOR_UHV.ID, - "automation.regulator.tier.09", - "Highly Ultimate Voltage Regulator", - 9).getStackForm(1L)); - } - - private static void registerSuperBuffer() { - ItemList.Automation_SuperBuffer_ULV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_ULV.ID, - "automation.superbuffer.tier.00", - "Ultra Low Voltage Super Buffer", - 0).getStackForm(1L)); - ItemList.Automation_SuperBuffer_LV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_LV.ID, - "automation.superbuffer.tier.01", - "Low Voltage Super Buffer", - 1).getStackForm(1L)); - ItemList.Automation_SuperBuffer_MV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_MV.ID, - "automation.superbuffer.tier.02", - "Medium Voltage Super Buffer", - 2).getStackForm(1L)); - ItemList.Automation_SuperBuffer_HV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_HV.ID, - "automation.superbuffer.tier.03", - "High Voltage Super Buffer", - 3).getStackForm(1L)); - ItemList.Automation_SuperBuffer_EV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_EV.ID, - "automation.superbuffer.tier.04", - "Extreme Voltage Super Buffer", - 4).getStackForm(1L)); - ItemList.Automation_SuperBuffer_IV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_IV.ID, - "automation.superbuffer.tier.05", - "Insane Voltage Super Buffer", - 5).getStackForm(1L)); - ItemList.Automation_SuperBuffer_LuV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_LuV.ID, - "automation.superbuffer.tier.06", - "Ludicrous Voltage Super Buffer", - 6).getStackForm(1L)); - ItemList.Automation_SuperBuffer_ZPM.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_ZPM.ID, - "automation.superbuffer.tier.07", - "ZPM Voltage Super Buffer", - 7).getStackForm(1L)); - ItemList.Automation_SuperBuffer_UV.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_UV.ID, - "automation.superbuffer.tier.08", - "Ultimate Voltage Super Buffer", - 8).getStackForm(1L)); - ItemList.Automation_SuperBuffer_MAX.set( - new GT_MetaTileEntity_SuperBuffer( - SUPER_BUFFER_UHV.ID, - "automation.superbuffer.tier.09", - "Highly Ultimate Voltage Super Buffer", - 9).getStackForm(1L)); - } - - private static void registerItemDistributor() { - ItemList.Automation_ItemDistributor_ULV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_ULV.ID, - "automation.itemdistributor.tier.00", - "Ultra Low Voltage Item Distributor", - 0).getStackForm(1L)); - ItemList.Automation_ItemDistributor_LV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_LV.ID, - "automation.itemdistributor.tier.01", - "Low Voltage Item Distributor", - 1).getStackForm(1L)); - ItemList.Automation_ItemDistributor_MV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_MV.ID, - "automation.itemdistributor.tier.02", - "Medium Voltage Item Distributor", - 2).getStackForm(1L)); - ItemList.Automation_ItemDistributor_HV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_HV.ID, - "automation.itemdistributor.tier.03", - "High Voltage Item Distributor", - 3).getStackForm(1L)); - ItemList.Automation_ItemDistributor_EV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_EV.ID, - "automation.itemdistributor.tier.04", - "Extreme Voltage Item Distributor", - 4).getStackForm(1L)); - ItemList.Automation_ItemDistributor_IV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_IV.ID, - "automation.itemdistributor.tier.05", - "Insane Voltage Item Distributor", - 5).getStackForm(1L)); - ItemList.Automation_ItemDistributor_LuV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_LuV.ID, - "automation.itemdistributor.tier.06", - "Ludicrous Voltage Item Distributor", - 6).getStackForm(1L)); - ItemList.Automation_ItemDistributor_ZPM.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_ZPM.ID, - "automation.itemdistributor.tier.07", - "ZPM Voltage Item Distributor", - 7).getStackForm(1L)); - ItemList.Automation_ItemDistributor_UV.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_UV.ID, - "automation.itemdistributor.tier.08", - "Ultimate Voltage Item Distributor", - 8).getStackForm(1L)); - ItemList.Automation_ItemDistributor_MAX.set( - new GT_MetaTileEntity_ItemDistributor( - ITEM_DISTRIBUTOR_UHV.ID, - "automation.itemdistributor.tier.09", - "MAX Voltage Item Distributor", - 9).getStackForm(1L)); - } - - private static void registerRecipeFilter() { - ItemList.Automation_RecipeFilter_ULV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_ULV.ID, - "automation.recipefilter.tier.00", - "Ultra Low Voltage Recipe Filter", - 0).getStackForm(1L)); - ItemList.Automation_RecipeFilter_LV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_LV.ID, - "automation.recipefilter.tier.01", - "Low Voltage Recipe Filter", - 1).getStackForm(1L)); - ItemList.Automation_RecipeFilter_MV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_MV.ID, - "automation.recipefilter.tier.02", - "Medium Voltage Recipe Filter", - 2).getStackForm(1L)); - ItemList.Automation_RecipeFilter_HV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_HV.ID, - "automation.recipefilter.tier.03", - "High Voltage Recipe Filter", - 3).getStackForm(1L)); - ItemList.Automation_RecipeFilter_EV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_EV.ID, - "automation.recipefilter.tier.04", - "Extreme Voltage Recipe Filter", - 4).getStackForm(1L)); - ItemList.Automation_RecipeFilter_IV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_IV.ID, - "automation.recipefilter.tier.05", - "Insane Voltage Recipe Filter", - 5).getStackForm(1L)); - ItemList.Automation_RecipeFilter_LuV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_LuV.ID, - "automation.recipefilter.tier.06", - "Ludicrous Voltage Recipe Filter", - 6).getStackForm(1L)); - ItemList.Automation_RecipeFilter_ZPM.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_ZPM.ID, - "automation.recipefilter.tier.07", - "ZPM Voltage Recipe Filter", - 7).getStackForm(1L)); - ItemList.Automation_RecipeFilter_UV.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_UV.ID, - "automation.recipefilter.tier.08", - "Ultimate Voltage Recipe Filter", - 8).getStackForm(1L)); - ItemList.Automation_RecipeFilter_MAX.set( - new GT_MetaTileEntity_RecipeFilter( - RECIPE_FILTER_UHV.ID, - "automation.recipefilter.tier.09", - "Highly Ultimate Voltage Recipe Filter", - 9).getStackForm(1L)); - } - - private static void registerMachineHull() { - ItemList.Hull_Bronze.set( - new GT_MetaTileEntity_BasicHull_Bronze( - HULL_BRONZE.ID, - "hull.bronze", - "Bronze Hull", - 0, - "For your first Steam Machines").getStackForm(1L)); - ItemList.Hull_Bronze_Bricks.set( - new GT_MetaTileEntity_BasicHull_BronzeBricks( - HULL_BRICKED_BRONZE.ID, - "hull.bronze_bricked", - "Bricked Bronze Hull", - 0, - "For your first Steam Machines").getStackForm(1L)); - ItemList.Hull_HP.set( - new GT_MetaTileEntity_BasicHull_Steel( - HULL_STEEL.ID, - "hull.steel", - "Steel Hull", - 0, - "For improved Steam Machines").getStackForm(1L)); - ItemList.Hull_HP_Bricks.set( - new GT_MetaTileEntity_BasicHull_SteelBricks( - HULL_WROUGHT_IRON.ID, - "hull.steel_bricked", - "Bricked Wrought Iron Hull", - 0, - "For improved Steam Machines").getStackForm(1L)); - - ItemList.Hull_ULV.set( - new GT_MetaTileEntity_BasicHull(HULL_ULV.ID, "hull.tier.00", "ULV Machine Hull", 0, imagination) - .getStackForm(1L)); - ItemList.Hull_LV.set( - new GT_MetaTileEntity_BasicHull(HULL_LV.ID, "hull.tier.01", "LV Machine Hull", 1, imagination) - .getStackForm(1L)); - ItemList.Hull_MV.set( - new GT_MetaTileEntity_BasicHull(HULL_MV.ID, "hull.tier.02", "MV Machine Hull", 2, imagination) - .getStackForm(1L)); - ItemList.Hull_HV.set( - new GT_MetaTileEntity_BasicHull(HULL_HV.ID, "hull.tier.03", "HV Machine Hull", 3, imagination) - .getStackForm(1L)); - ItemList.Hull_EV.set( - new GT_MetaTileEntity_BasicHull(HULL_EV.ID, "hull.tier.04", "EV Machine Hull", 4, imagination) - .getStackForm(1L)); - ItemList.Hull_IV.set( - new GT_MetaTileEntity_BasicHull(HULL_IV.ID, "hull.tier.05", "IV Machine Hull", 5, imagination) - .getStackForm(1L)); - ItemList.Hull_LuV.set( - new GT_MetaTileEntity_BasicHull(HULL_LuV.ID, "hull.tier.06", "LuV Machine Hull", 6, imagination) - .getStackForm(1L)); - ItemList.Hull_ZPM.set( - new GT_MetaTileEntity_BasicHull(HULL_ZPM.ID, "hull.tier.07", "ZPM Machine Hull", 7, imagination) - .getStackForm(1L)); - ItemList.Hull_UV.set( - new GT_MetaTileEntity_BasicHull(HULL_UV.ID, "hull.tier.08", "UV Machine Hull", 8, imagination) - .getStackForm(1L)); - ItemList.Hull_MAX.set( - new GT_MetaTileEntity_BasicHull(HULL_UHV.ID, "hull.tier.09", "UHV Machine Hull", 9, imagination) - .getStackForm(1L)); - - ItemList.Hull_UEV.set( - new GT_MetaTileEntity_BasicHull( - HULL_UEV.ID, - "hull.tier.10", - "UEV Machine Hull", - 10, - GT_Loader_MetaTileEntities.imagination).getStackForm(1L)); - - ItemList.Hull_UIV.set( - new GT_MetaTileEntity_BasicHull( - HULL_UIV.ID, - "hull.tier.11", - "UIV Machine Hull", - 11, - GT_Loader_MetaTileEntities.imagination).getStackForm(1L)); - - ItemList.Hull_UMV.set( - new GT_MetaTileEntity_BasicHull( - HULL_UMV.ID, - "hull.tier.12", - "UMV Machine Hull", - 12, - GT_Loader_MetaTileEntities.imagination).getStackForm(1L)); - - ItemList.Hull_UXV.set( - new GT_MetaTileEntity_BasicHull( - HULL_UXV.ID, - "hull.tier.13", - "UXV Machine Hull", - 13, - GT_Loader_MetaTileEntities.imagination).getStackForm(1L)); - - ItemList.Hull_MAXV.set( - new GT_MetaTileEntity_BasicHull( - HULL_MAX.ID, - "hull.tier.14", - "MAX Machine Hull", - 14, - GT_Loader_MetaTileEntities.imagination).getStackForm(1L)); - } - - private static void registerTransformer() { - ItemList.Transformer_LV_ULV.set( - new GT_MetaTileEntity_Transformer( - transformer_LV_ULV.ID, - "transformer.tier.00", - "Ultra Low Voltage Transformer", - 0, - "LV -> ULV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_MV_LV.set( - new GT_MetaTileEntity_Transformer( - transformer_MV_LV.ID, - "transformer.tier.01", - "Low Voltage Transformer", - 1, - "MV -> LV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_HV_MV.set( - new GT_MetaTileEntity_Transformer( - transformer_HV_MV.ID, - "transformer.tier.02", - "Medium Voltage Transformer", - 2, - "HV -> MV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_EV_HV.set( - new GT_MetaTileEntity_Transformer( - transformer_EV_HV.ID, - "transformer.tier.03", - "High Voltage Transformer", - 3, - "EV -> HV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_IV_EV.set( - new GT_MetaTileEntity_Transformer( - transformer_IV_EV.ID, - "transformer.tier.04", - "Extreme Transformer", - 4, - "IV -> EV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_LuV_IV.set( - new GT_MetaTileEntity_Transformer( - transformer_LuV_IV.ID, - "transformer.tier.05", - "Insane Transformer", - 5, - "LuV -> IV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_ZPM_LuV.set( - new GT_MetaTileEntity_Transformer( - transformer_ZPM_LuV.ID, - "transformer.tier.06", - "Ludicrous Transformer", - 6, - "ZPM -> LuV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_UV_ZPM.set( - new GT_MetaTileEntity_Transformer( - transformer_UV_ZPM.ID, - "transformer.tier.07", - "ZPM Voltage Transformer", - 7, - "UV -> ZPM (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_MAX_UV.set( - new GT_MetaTileEntity_Transformer( - transformer_UHV_UV.ID, - "transformer.tier.08", - "Ultimate Transformer", - 8, - "UHV -> UV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_UEV_UHV.set( - new GT_MetaTileEntity_Transformer( - TRANSFORMER_UEV_UHV.ID, - "transformer.tier.09", - "Highly Ultimate Transformer", - 9, - "UEV -> UHV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.Transformer_UIV_UEV.set( - new GT_MetaTileEntity_Transformer( - TRANSFORMER_UIV_UEV.ID, - "transformer.tier.10", - "Extremely Ultimate Transformer", - 10, - "UIV -> UEV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.Transformer_UMV_UIV.set( - new GT_MetaTileEntity_Transformer( - TRANSFORMER_UMV_UIV.ID, - "transformer.tier.11", - "Insanely Ultimate Transformer", - 11, - "UMV -> UIV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.Transformer_UXV_UMV.set( - new GT_MetaTileEntity_Transformer( - TRANSFORMER_UXV_UMV.ID, - "transformer.tier.12", - "Mega Ultimate Transformer", - 12, - "UXV -> UMV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.Transformer_MAX_UXV.set( - new GT_MetaTileEntity_Transformer( - TRANSFORMER_MAX_UXV.ID, - "transformer.tier.13", - "Extended Mega Ultimate Transformer", - 13, - "MAX -> UXV (Use Soft Mallet to invert)").getStackForm(1L)); - } - - private void registerChemicalBath() { - ItemList.Machine_LV_ChemicalBath.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_LV.ID, - "basicmachine.chemicalbath.tier.01", - "Basic Chemical Bath", - 1, - MachineType.CHEMICAL_BATH.tooltipDescription(), - RecipeMaps.chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.Machine_MV_ChemicalBath.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_MV.ID, - "basicmachine.chemicalbath.tier.02", - "Advanced Chemical Bath", - 2, - MachineType.CHEMICAL_BATH.tooltipDescription(), - RecipeMaps.chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.Machine_HV_ChemicalBath.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_HV.ID, - "basicmachine.chemicalbath.tier.03", - "Advanced Chemical Bath II", - 3, - MachineType.CHEMICAL_BATH.tooltipDescription(), - RecipeMaps.chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.Machine_EV_ChemicalBath.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_EV.ID, - "basicmachine.chemicalbath.tier.04", - "Advanced Chemical Bath III", - 4, - MachineType.CHEMICAL_BATH.tooltipDescription(), - RecipeMaps.chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.Machine_IV_ChemicalBath.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_IV.ID, - "basicmachine.chemicalbath.tier.05", - "Advanced Chemical Bath IV", - 5, - MachineType.CHEMICAL_BATH.tooltipDescription(), - RecipeMaps.chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.ChemicalBathLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_LuV.ID, - "basicmachine.chemicalbath.tier.06", - "Elite Chemical Bath", - 6, - MachineType.CHEMICAL_BATH.tooltipDescription(), - chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.ChemicalBathZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_ZPM.ID, - "basicmachine.chemicalbath.tier.07", - "Elite Chemical Bath II", - 7, - MachineType.CHEMICAL_BATH.tooltipDescription(), - chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.ChemicalBathUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_UV.ID, - "basicmachine.chemicalbath.tier.08", - "Ultimate Chemical Dunktron", - 8, - MachineType.CHEMICAL_BATH.tooltipDescription(), - chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.ChemicalBathUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_UHV.ID, - "basicmachine.chemicalbath.tier.09", - "Epic Chemical Dunktron", - 9, - MachineType.CHEMICAL_BATH.tooltipDescription(), - chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.ChemicalBathUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_UEV.ID, - "basicmachine.chemicalbath.tier.10", - "Epic Chemical Dunktron II", - 10, - MachineType.CHEMICAL_BATH.tooltipDescription(), - chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.ChemicalBathUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_UIV.ID, - "basicmachine.chemicalbath.tier.11", - "Epic Chemical Dunktron III", - 11, - MachineType.CHEMICAL_BATH.tooltipDescription(), - chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - - ItemList.ChemicalBathUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_BATH_UMV.ID, - "basicmachine.chemicalbath.tier.12", - "Epic Chemical Dunktron IV", - 12, - MachineType.CHEMICAL_BATH.tooltipDescription(), - chemicalBathRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_BATH", - null).getStackForm(1L)); - } - - private void registerChemicalReactor() { - ItemList.Machine_LV_ChemicalReactor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_LV.ID, - "basicmachine.chemicalreactor.tier.01", - "Basic Chemical Reactor", - 1, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - RecipeMaps.chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.Machine_MV_ChemicalReactor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_MV.ID, - "basicmachine.chemicalreactor.tier.02", - "Advanced Chemical Reactor", - 2, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - RecipeMaps.chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.Machine_HV_ChemicalReactor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_HV.ID, - "basicmachine.chemicalreactor.tier.03", - "Advanced Chemical Reactor II", - 3, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - RecipeMaps.chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.Machine_EV_ChemicalReactor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_EV.ID, - "basicmachine.chemicalreactor.tier.04", - "Advanced Chemical Reactor III", - 4, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - RecipeMaps.chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.Machine_IV_ChemicalReactor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_IV.ID, - "basicmachine.chemicalreactor.tier.05", - "Advanced Chemical Reactor IV", - 5, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - RecipeMaps.chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.ChemicalReactorLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_LuV.ID, - "basicmachine.chemicalreactor.tier.06", - "Elite Chemical Reactor", - 6, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.ChemicalReactorZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_ZPM.ID, - "basicmachine.chemicalreactor.tier.07", - "Elite Chemical Reactor II", - 7, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.ChemicalReactorUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_UV.ID, - "basicmachine.chemicalreactor.tier.08", - "Ultimate Chemical Perforer", - 8, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.ChemicalReactorUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_UHV.ID, - "basicmachine.chemicalreactor.tier.09", - "Epic Chemical Performer", - 9, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.ChemicalReactorUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_UEV.ID, - "basicmachine.chemicalreactor.tier.10", - "Epic Chemical Performer II", - 10, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.ChemicalReactorUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_UIV.ID, - "basicmachine.chemicalreactor.tier.11", - "Epic Chemical Performer III", - 11, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - ItemList.ChemicalReactorUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CHEMICAL_REACTOR_UMV.ID, - "basicmachine.chemicalreactor.tier.12", - "Epic Chemical Performer IV", - 12, - MachineType.CHEMICAL_REACTOR.tooltipDescription(), - chemicalReactorRecipes, - 2, - 2, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CHEMICAL_REACTOR", - null).getStackForm(1L)); - - } - - private void registerFermenter() { - ItemList.Machine_LV_Fermenter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_LV.ID, - "basicmachine.fermenter.tier.01", - "Basic Fermenter", - 1, - MachineType.FERMENTER.tooltipDescription(), - RecipeMaps.fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Fermenter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_MV.ID, - "basicmachine.fermenter.tier.02", - "Advanced Fermenter", - 2, - MachineType.FERMENTER.tooltipDescription(), - RecipeMaps.fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Fermenter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_HV.ID, - "basicmachine.fermenter.tier.03", - "Advanced Fermenter II", - 3, - MachineType.FERMENTER.tooltipDescription(), - RecipeMaps.fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Fermenter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_EV.ID, - "basicmachine.fermenter.tier.04", - "Advanced Fermenter III", - 4, - MachineType.FERMENTER.tooltipDescription(), - RecipeMaps.fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Fermenter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_IV.ID, - "basicmachine.fermenter.tier.05", - "Advanced Fermenter IV", - 5, - MachineType.FERMENTER.tooltipDescription(), - RecipeMaps.fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.FermenterLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_LuV.ID, - "basicmachine.fermenter.tier.06", - "Elite Fermenter", - 6, - MachineType.FERMENTER.tooltipDescription(), - fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.FermenterZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_ZPM.ID, - "basicmachine.fermenter.tier.07", - "Elite Fermenter II", - 7, - MachineType.FERMENTER.tooltipDescription(), - fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.FermenterUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_UV.ID, - "basicmachine.fermenter.tier.08", - "Ultimate Fermentation Hastener", - 8, - MachineType.FERMENTER.tooltipDescription(), - fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.FermenterUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_UHV.ID, - "basicmachine.fermenter.tier.09", - "Epic Fermentation Hastener", - 9, - MachineType.FERMENTER.tooltipDescription(), - fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.FermenterUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_UEV.ID, - "basicmachine.fermenter.tier.10", - "Epic Fermentation Hastener II", - 10, - MachineType.FERMENTER.tooltipDescription(), - fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.FermenterUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_UIV.ID, - "basicmachine.fermenter.tier.11", - "Epic Fermentation Hastener III", - 11, - MachineType.FERMENTER.tooltipDescription(), - fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - - ItemList.FermenterUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FERMENTER_UMV.ID, - "basicmachine.fermenter.tier.12", - "Epic Fermentation Hastener IV", - 12, - MachineType.FERMENTER.tooltipDescription(), - fermentingRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FERMENTER", - null).getStackForm(1L)); - } - - private void registerFluidCanner() { - ItemList.Machine_LV_FluidCanner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_LV.ID, - "basicmachine.fluidcanner.tier.01", - "Basic Fluid Canner", - 1, - MachineType.FLUID_CANNER.tooltipDescription(), - RecipeMaps.fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.Machine_MV_FluidCanner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_MV.ID, - "basicmachine.fluidcanner.tier.02", - "Advanced Fluid Canner", - 2, - MachineType.FLUID_CANNER.tooltipDescription(), - RecipeMaps.fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.Machine_HV_FluidCanner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_HV.ID, - "basicmachine.fluidcanner.tier.03", - "Quick Fluid Canner", - 3, - MachineType.FLUID_CANNER.tooltipDescription(), - RecipeMaps.fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.Machine_EV_FluidCanner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_EV.ID, - "basicmachine.fluidcanner.tier.04", - "Turbo Fluid Canner", - 4, - MachineType.FLUID_CANNER.tooltipDescription(), - RecipeMaps.fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.Machine_IV_FluidCanner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_IV.ID, - "basicmachine.fluidcanner.tier.05", - "Instant Fluid Canner", - 5, - MachineType.FLUID_CANNER.tooltipDescription(), - RecipeMaps.fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.FluidCannerLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_LuV.ID, - "basicmachine.fluidcanner.tier.06", - "Elite Fluid Canner", - 6, - MachineType.FLUID_CANNER.tooltipDescription(), - fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.FluidCannerZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_ZPM.ID, - "basicmachine.fluidcanner.tier.07", - "Elite Fluid Canner II", - 7, - MachineType.FLUID_CANNER.tooltipDescription(), - fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.FluidCannerUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_UV.ID, - "basicmachine.fluidcanner.tier.08", - "Ultimate Liquid Can Actuator", - 8, - MachineType.FLUID_CANNER.tooltipDescription(), - fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.FluidCannerUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_UHV.ID, - "basicmachine.fluidcanner.tier.09", - "Epic Liquid Can Actuator", - 9, - MachineType.FLUID_CANNER.tooltipDescription(), - fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.FluidCannerUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_UEV.ID, - "basicmachine.fluidcanner.tier.10", - "Epic Liquid Can Actuator II", - 10, - MachineType.FLUID_CANNER.tooltipDescription(), - fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.FluidCannerUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_UIV.ID, - "basicmachine.fluidcanner.tier.11", - "Epic Liquid Can Actuator III", - 11, - MachineType.FLUID_CANNER.tooltipDescription(), - fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - - ItemList.FluidCannerUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_CANNER_UMV.ID, - "basicmachine.fluidcanner.tier.12", - "Epic Liquid Can Actuator IV", - 12, - MachineType.FLUID_CANNER.tooltipDescription(), - fluidCannerRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_CANNER", - null).getStackForm(1L)); - } - - private void registerFluidExtractor() { - ItemList.Machine_LV_FluidExtractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_LV.ID, - "basicmachine.fluidextractor.tier.01", - "Basic Fluid Extractor", - 1, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - RecipeMaps.fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_MV_FluidExtractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_MV.ID, - "basicmachine.fluidextractor.tier.02", - "Advanced Fluid Extractor", - 2, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - RecipeMaps.fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_HV_FluidExtractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_HV.ID, - "basicmachine.fluidextractor.tier.03", - "Advanced Fluid Extractor II", - 3, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - RecipeMaps.fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_EV_FluidExtractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_EV.ID, - "basicmachine.fluidextractor.tier.04", - "Advanced Fluid Extractor III", - 4, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - RecipeMaps.fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_IV_FluidExtractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_IV.ID, - "basicmachine.fluidextractor.tier.05", - "Advanced Fluid Extractor IV", - 5, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - RecipeMaps.fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.FluidExtractorLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_LuV.ID, - "basicmachine.fluidextractor.tier.06", - "Elite Fluid Extractor", - 6, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.FluidExtractorZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_ZPM.ID, - "basicmachine.fluidextractor.tier.07", - "Elite Fluid Extractor II", - 7, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.FluidExtractorUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_UV.ID, - "basicmachine.fluidextractor.tier.08", - "Ultimate Liquefying Sucker", - 8, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.FluidExtractorUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_UHV.ID, - "basicmachine.fluidextractor.tier.09", - "Epic Liquefying Sucker", - 9, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.FluidExtractorUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_UEV.ID, - "basicmachine.fluidextractor.tier.10", - "Epic Liquefying Sucker II", - 10, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.FluidExtractorUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_UIV.ID, - "basicmachine.fluidextractor.tier.11", - "Epic Liquefying Sucker III", - 11, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - - ItemList.FluidExtractorUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_EXTRACTOR_UMV.ID, - "basicmachine.fluidextractor.tier.12", - "Epic Liquefying Sucker IV", - 12, - MachineType.FLUID_EXTRACTOR.tooltipDescription(), - fluidExtractionRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_EXTRACTOR", - null).getStackForm(1L)); - } - - private void registerFluidHeater() { - ItemList.Machine_LV_FluidHeater.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_LV.ID, - "basicmachine.fluidheater.tier.01", - "Basic Fluid Heater", - 1, - MachineType.FLUID_HEATER.tooltipDescription(), - RecipeMaps.fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.Machine_MV_FluidHeater.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_MV.ID, - "basicmachine.fluidheater.tier.02", - "Advanced Fluid Heater", - 2, - MachineType.FLUID_HEATER.tooltipDescription(), - RecipeMaps.fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.Machine_HV_FluidHeater.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_HV.ID, - "basicmachine.fluidheater.tier.03", - "Advanced Fluid Heater II", - 3, - MachineType.FLUID_HEATER.tooltipDescription(), - RecipeMaps.fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.Machine_EV_FluidHeater.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_EV.ID, - "basicmachine.fluidheater.tier.04", - "Advanced Fluid Heater III", - 4, - MachineType.FLUID_HEATER.tooltipDescription(), - RecipeMaps.fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.Machine_IV_FluidHeater.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_IV.ID, - "basicmachine.fluidheater.tier.05", - "Advanced Fluid Heater IV", - 5, - MachineType.FLUID_HEATER.tooltipDescription(), - RecipeMaps.fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.FluidHeaterLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_LuV.ID, - "basicmachine.fluidheater.tier.06", - "Elite Fluid Heater", - 6, - MachineType.FLUID_HEATER.tooltipDescription(), - fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.FluidHeaterZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_ZPM.ID, - "basicmachine.fluidheater.tier.07", - "Elite Fluid Heater II", - 7, - MachineType.FLUID_HEATER.tooltipDescription(), - fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.FluidHeaterUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_UV.ID, - "basicmachine.fluidheater.tier.08", - "Ultimate Heat Infuser", - 8, - MachineType.FLUID_HEATER.tooltipDescription(), - fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.FluidHeaterUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_UHV.ID, - "basicmachine.fluidheater.tier.09", - "Epic Heat Infuser", - 9, - MachineType.FLUID_HEATER.tooltipDescription(), - fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.FluidHeaterUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_UEV.ID, - "basicmachine.fluidheater.tier.10", - "Epic Heat Infuser II", - 10, - MachineType.FLUID_HEATER.tooltipDescription(), - fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.FluidHeaterUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_UIV.ID, - "basicmachine.fluidheater.tier.11", - "Epic Heat Infuser III", - 11, - MachineType.FLUID_HEATER.tooltipDescription(), - fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - - ItemList.FluidHeaterUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_HEATER_UMV.ID, - "basicmachine.fluidheater.tier.12", - "Epic Heat Infuser IV", - 12, - MachineType.FLUID_HEATER.tooltipDescription(), - fluidHeaterRecipes, - 1, - 0, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_HEATER", - null).getStackForm(1L)); - } - - private void registerMixer() { - ItemList.Machine_LV_Mixer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_LV.ID, - "basicmachine.mixer.tier.01", - "Basic Mixer", - 1, - MachineType.MIXER.tooltipDescription(), - RecipeMaps.mixerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Mixer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_MV.ID, - "basicmachine.mixer.tier.02", - "Advanced Mixer", - 2, - MachineType.MIXER.tooltipDescription(), - RecipeMaps.mixerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Mixer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_HV.ID, - "basicmachine.mixer.tier.03", - "Advanced Mixer II", - 3, - MachineType.MIXER.tooltipDescription(), - RecipeMaps.mixerRecipes, - 6, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Mixer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_EV.ID, - "basicmachine.mixer.tier.04", - "Advanced Mixer III", - 4, - MachineType.MIXER.tooltipDescription(), - RecipeMaps.mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Mixer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_IV.ID, - "basicmachine.mixer.tier.05", - "Advanced Mixer IV", - 5, - MachineType.MIXER.tooltipDescription(), - RecipeMaps.mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.MixerLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_LuV.ID, - "basicmachine.mixer.tier.06", - "Elite Mixer", - 6, - MachineType.MIXER.tooltipDescription(), - mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.MixerZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_ZPM.ID, - "basicmachine.mixer.tier.07", - "Elite Mixer II", - 7, - MachineType.MIXER.tooltipDescription(), - mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.MixerUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_UV.ID, - "basicmachine.mixer.tier.08", - "Ultimate Matter Organizer", - 8, - MachineType.MIXER.tooltipDescription(), - mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.MixerUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_UHV.ID, - "basicmachine.mixer.tier.09", - "Epic Matter Organizer", - 9, - MachineType.MIXER.tooltipDescription(), - mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.MixerUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_UEV.ID, - "basicmachine.mixer.tier.10", - "Epic Matter Organizer II", - 10, - MachineType.MIXER.tooltipDescription(), - mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.MixerUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_UIV.ID, - "basicmachine.mixer.tier.11", - "Epic Matter Organizer III", - 11, - MachineType.MIXER.tooltipDescription(), - mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - - ItemList.MixerUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MIXER_UMV.ID, - "basicmachine.mixer.tier.12", - "Epic Matter Organizer IV", - 12, - MachineType.MIXER.tooltipDescription(), - mixerRecipes, - 9, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MIXER", - null).getStackForm(1L)); - } - - private void registerAutoclave() { - ItemList.Machine_LV_Autoclave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_LV.ID, - "basicmachine.autoclave.tier.01", - "Basic Autoclave", - 1, - MachineType.AUTOCLAVE.tooltipDescription(), - RecipeMaps.autoclaveRecipes, - 2, - 2, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.Machine_MV_Autoclave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_MV.ID, - "basicmachine.autoclave.tier.02", - "Advanced Autoclave", - 2, - MachineType.AUTOCLAVE.tooltipDescription(), - RecipeMaps.autoclaveRecipes, - 2, - 2, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.Machine_HV_Autoclave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_HV.ID, - "basicmachine.autoclave.tier.03", - "Advanced Autoclave II", - 3, - MachineType.AUTOCLAVE.tooltipDescription(), - RecipeMaps.autoclaveRecipes, - 2, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.Machine_EV_Autoclave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_EV.ID, - "basicmachine.autoclave.tier.04", - "Advanced Autoclave III", - 4, - MachineType.AUTOCLAVE.tooltipDescription(), - RecipeMaps.autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.Machine_IV_Autoclave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_IV.ID, - "basicmachine.autoclave.tier.05", - "Advanced Autoclave IV", - 5, - MachineType.AUTOCLAVE.tooltipDescription(), - RecipeMaps.autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.AutoclaveLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_LuV.ID, - "basicmachine.autoclave.tier.06", - "Elite Autoclave", - 6, - MachineType.AUTOCLAVE.tooltipDescription(), - autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.AutoclaveZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_ZPM.ID, - "basicmachine.autoclave.tier.07", - "Elite Autoclave II", - 7, - MachineType.AUTOCLAVE.tooltipDescription(), - autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.AutoclaveUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_UV.ID, - "basicmachine.autoclave.tier.08", - "Ultimate Pressure Cooker", - 8, - MachineType.AUTOCLAVE.tooltipDescription(), - autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.AutoclaveUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_UHV.ID, - "basicmachine.autoclave.tier.09", - "Epic Pressure Cooker", - 9, - MachineType.AUTOCLAVE.tooltipDescription(), - autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.AutoclaveUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_UEV.ID, - "basicmachine.autoclave.tier.10", - "Epic Pressure Cooker II", - 10, - MachineType.AUTOCLAVE.tooltipDescription(), - autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.AutoclaveUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_UIV.ID, - "basicmachine.autoclave.tier.11", - "Epic Pressure Cooker III", - 11, - MachineType.AUTOCLAVE.tooltipDescription(), - autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - ItemList.AutoclaveUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - AUTOCLAVE_UMV.ID, - "basicmachine.autoclave.tier.12", - "Epic Pressure Cooker IV", - 12, - MachineType.AUTOCLAVE.tooltipDescription(), - autoclaveRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "AUTOCLAVE", - null).getStackForm(1L)); - - } - - private void registerBendingMachine() { - ItemList.Machine_LV_Bender.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_LV.ID, - "basicmachine.bender.tier.01", - "Basic Bending Machine", - 1, - MachineType.BENDING_MACHINE.tooltipDescription(), - RecipeMaps.benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Bender.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_MV.ID, - "basicmachine.bender.tier.02", - "Advanced Bending Machine", - 2, - MachineType.BENDING_MACHINE.tooltipDescription(), - RecipeMaps.benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Bender.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_HV.ID, - "basicmachine.bender.tier.03", - "Advanced Bending Machine II", - 3, - MachineType.BENDING_MACHINE.tooltipDescription(), - RecipeMaps.benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Bender.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_EV.ID, - "basicmachine.bender.tier.04", - "Advanced Bending Machine III", - 4, - MachineType.BENDING_MACHINE.tooltipDescription(), - RecipeMaps.benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Bender.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_IV.ID, - "basicmachine.bender.tier.05", - "Advanced Bending Machine IV", - 5, - MachineType.BENDING_MACHINE.tooltipDescription(), - RecipeMaps.benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.BendingMachineLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_LuV.ID, - "basicmachine.bender.tier.06", - "Elite Bending Machine", - 6, - MachineType.BENDING_MACHINE.tooltipDescription(), - benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.BendingMachineZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_ZPM.ID, - "basicmachine.bender.tier.07", - "Elite Bending Machine II", - 7, - MachineType.BENDING_MACHINE.tooltipDescription(), - benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.BendingMachineUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_UV.ID, - "basicmachine.bender.tier.08", - "Ultimate Bending Unit", - 8, - MachineType.BENDING_MACHINE.tooltipDescription(), - benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.BendingMachineUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_UHV.ID, - "basicmachine.bender.tier.09", - "Epic Bending Unit", - 9, - MachineType.BENDING_MACHINE.tooltipDescription(), - benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.BendingMachineUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_UEV.ID, - "basicmachine.bender.tier.10", - "Epic Bending Unit II", - 10, - MachineType.BENDING_MACHINE.tooltipDescription(), - benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.BendingMachineUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_UIV.ID, - "basicmachine.bender.tier.11", - "Epic Bending Unit III", - 11, - MachineType.BENDING_MACHINE.tooltipDescription(), - benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - - ItemList.BendingMachineUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - BENDING_MACHINE_UMV.ID, - "basicmachine.bender.tier.12", - "Epic Bending Unit IV", - 12, - MachineType.BENDING_MACHINE.tooltipDescription(), - benderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "BENDER", - null).getStackForm(1L)); - } - - private void registerCompressor() { - ItemList.Machine_LV_Compressor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_LV.ID, - "basicmachine.compressor.tier.01", - "Basic Compressor", - 1, - MachineType.COMPRESSOR.tooltipDescription(), - RecipeMaps.compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.Machine_MV_Compressor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_MV.ID, - "basicmachine.compressor.tier.02", - "Advanced Compressor", - 2, - MachineType.COMPRESSOR.tooltipDescription(), - RecipeMaps.compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.Machine_HV_Compressor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_HV.ID, - "basicmachine.compressor.tier.03", - "Advanced Compressor II", - 3, - MachineType.COMPRESSOR.tooltipDescription(), - RecipeMaps.compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.Machine_EV_Compressor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_EV.ID, - "basicmachine.compressor.tier.04", - "Advanced Compressor III", - 4, - MachineType.COMPRESSOR.tooltipDescription(), - RecipeMaps.compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.Machine_IV_Compressor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_IV.ID, - "basicmachine.compressor.tier.05", - "Singularity Compressor", - 5, - MachineType.COMPRESSOR.tooltipDescription(), - RecipeMaps.compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.CompressorLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_LuV.ID, - "basicmachine.compressor.tier.06", - "Elite Compressor", - 6, - MachineType.COMPRESSOR.tooltipDescription(), - compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.CompressorZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_ZPM.ID, - "basicmachine.compressor.tier.07", - "Elite Compressor II", - 7, - MachineType.COMPRESSOR.tooltipDescription(), - compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.CompressorUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_UV.ID, - "basicmachine.compressor.tier.08", - "Ultimate Matter Constrictor", - 8, - MachineType.COMPRESSOR.tooltipDescription(), - compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.CompressorUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_UHV.ID, - "basicmachine.compressor.tier.09", - "Epic Matter Constrictor", - 9, - MachineType.COMPRESSOR.tooltipDescription(), - compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.CompressorUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_UEV.ID, - "basicmachine.compressor.tier.10", - "Epic Matter Constrictor II", - 10, - MachineType.COMPRESSOR.tooltipDescription(), - compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.CompressorUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_UIV.ID, - "basicmachine.compressor.tier.11", - "Epic Matter Constrictor III", - 11, - MachineType.COMPRESSOR.tooltipDescription(), - compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - ItemList.CompressorUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - COMPRESSOR_UMV.ID, - "basicmachine.compressor.tier.12", - "Epic Matter Constrictor IV", - 12, - MachineType.COMPRESSOR.tooltipDescription(), - compressorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "COMPRESSOR", - null).getStackForm(1L)); - - } - - private void registerCuttingMachine() { - ItemList.Machine_LV_Cutter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_LV.ID, - "basicmachine.cutter.tier.01", - "Basic Cutting Machine", - 1, - MachineType.CUTTING_MACHINE.tooltipDescription(), - RecipeMaps.cutterRecipes, - 1, - 2, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Cutter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_MV.ID, - "basicmachine.cutter.tier.02", - "Advanced Cutting Machine", - 2, - MachineType.CUTTING_MACHINE.tooltipDescription(), - RecipeMaps.cutterRecipes, - 2, - 2, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Cutter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_HV.ID, - "basicmachine.cutter.tier.03", - "Advanced Cutting Machine II", - 3, - MachineType.CUTTING_MACHINE.tooltipDescription(), - RecipeMaps.cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Cutter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_EV.ID, - "basicmachine.cutter.tier.04", - "Advanced Cutting Machine III", - 4, - MachineType.CUTTING_MACHINE.tooltipDescription(), - RecipeMaps.cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Cutter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_IV.ID, - "basicmachine.cutter.tier.05", - "Advanced Cutting Machine IV", - 5, - MachineType.CUTTING_MACHINE.tooltipDescription(), - RecipeMaps.cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.CuttingMachineLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_LuV.ID, - "basicmachine.cutter.tier.06", - "Elite Cutting Machine", - 6, - MachineType.CUTTING_MACHINE.tooltipDescription(), - cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.CuttingMachineZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_ZPM.ID, - "basicmachine.cutter.tier.07", - "Elite Cutting Machine II", - 7, - MachineType.CUTTING_MACHINE.tooltipDescription(), - cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.CuttingMachineUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_UV.ID, - "basicmachine.cutter.tier.08", - "Ultimate Object Divider", - 8, - MachineType.CUTTING_MACHINE.tooltipDescription(), - cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.CuttingMachineUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_UHV.ID, - "basicmachine.cutter.tier.09", - "Epic Object Divider", - 9, - MachineType.CUTTING_MACHINE.tooltipDescription(), - cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.CuttingMachineUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_UEV.ID, - "basicmachine.cutter.tier.10", - "Epic Object Divider II", - 10, - MachineType.CUTTING_MACHINE.tooltipDescription(), - cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.CuttingMachineUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_UIV.ID, - "basicmachine.cutter.tier.11", - "Epic Object Divider III", - 11, - MachineType.CUTTING_MACHINE.tooltipDescription(), - cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - ItemList.CuttingMachineUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CUTTING_MACHINE_UMV.ID, - "basicmachine.cutter.tier.12", - "Epic Object Divider IV", - 12, - MachineType.CUTTING_MACHINE.tooltipDescription(), - cutterRecipes, - 2, - 4, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CUTTER", - null).getStackForm(1L)); - - } - - private void registerDistillery() { - ItemList.Machine_LV_Distillery.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_LV.ID, - "basicmachine.distillery.tier.01", - "Basic Distillery", - 1, - MachineType.DISTILLERY.tooltipDescription(), - RecipeMaps.distilleryRecipes, - 1, - 1, - true, - SoundResource.GT_MACHINES_DISTILLERY_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.Machine_MV_Distillery.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_MV.ID, - "basicmachine.distillery.tier.02", - "Advanced Distillery", - 2, - MachineType.DISTILLERY.tooltipDescription(), - RecipeMaps.distilleryRecipes, - 1, - 1, - true, - SoundResource.GT_MACHINES_DISTILLERY_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.Machine_HV_Distillery.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_HV.ID, - "basicmachine.distillery.tier.03", - "Advanced Distillery II", - 3, - MachineType.DISTILLERY.tooltipDescription(), - RecipeMaps.distilleryRecipes, - 1, - 1, - true, - SoundResource.GT_MACHINES_DISTILLERY_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.Machine_EV_Distillery.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_EV.ID, - "basicmachine.distillery.tier.04", - "Advanced Distillery III", - 4, - MachineType.DISTILLERY.tooltipDescription(), - RecipeMaps.distilleryRecipes, - 1, - 1, - true, - SoundResource.GT_MACHINES_DISTILLERY_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.Machine_IV_Distillery.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_IV.ID, - "basicmachine.distillery.tier.05", - "Advanced Distillery IV", - 5, - MachineType.DISTILLERY.tooltipDescription(), - RecipeMaps.distilleryRecipes, - 1, - 1, - true, - SoundResource.GT_MACHINES_DISTILLERY_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.DistilleryLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_LuV.ID, - "basicmachine.distillery.tier.06", - "Elite Distillery", - 6, - MachineType.DISTILLERY.tooltipDescription(), - distilleryRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.DistilleryZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_ZPM.ID, - "basicmachine.distillery.tier.07", - "Elite Distillery II", - 7, - MachineType.DISTILLERY.tooltipDescription(), - distilleryRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.DistilleryUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_UV.ID, - "basicmachine.distillery.tier.08", - "Ultimate Fraction Splitter", - 8, - MachineType.DISTILLERY.tooltipDescription(), - distilleryRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.DistilleryUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_UHV.ID, - "basicmachine.distillery.tier.09", - "Epic Fraction Splitter", - 9, - MachineType.DISTILLERY.tooltipDescription(), - distilleryRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.DistilleryUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_UEV.ID, - "basicmachine.distillery.tier.10", - "Epic Fraction Splitter II", - 10, - MachineType.DISTILLERY.tooltipDescription(), - distilleryRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.DistilleryUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_UIV.ID, - "basicmachine.distillery.tier.11", - "Epic Fraction Splitter III", - 11, - MachineType.DISTILLERY.tooltipDescription(), - distilleryRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - ItemList.DistilleryUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - DISTILLERY_UMV.ID, - "basicmachine.distillery.tier.12", - "Epic Fraction Splitter IV", - 12, - MachineType.DISTILLERY.tooltipDescription(), - distilleryRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "DISTILLERY", - null).getStackForm(1L)); - - } - - private void registerElectricFurnace() { - ItemList.Machine_LV_E_Furnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_LV.ID, - "basicmachine.e_furnace.tier.01", - "Basic Electric Furnace", - 1, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).setProgressBarTextureName("E_Furnace") - .getStackForm(1L)); - - ItemList.Machine_MV_E_Furnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_MV.ID, - "basicmachine.e_furnace.tier.02", - "Advanced Electric Furnace", - 2, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).setProgressBarTextureName("E_Furnace") - .getStackForm(1L)); - - ItemList.Machine_HV_E_Furnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_HV.ID, - "basicmachine.e_furnace.tier.03", - "Advanced Electric Furnace II", - 3, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).setProgressBarTextureName("E_Furnace") - .getStackForm(1L)); - - ItemList.Machine_EV_E_Furnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_EV.ID, - "basicmachine.e_furnace.tier.04", - "Advanced Electric Furnace III", - 4, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).setProgressBarTextureName("E_Furnace") - .getStackForm(1L)); - - ItemList.Machine_IV_E_Furnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_IV.ID, - "basicmachine.e_furnace.tier.05", - "Electron Exitement Processor", - 5, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).setProgressBarTextureName("E_Furnace") - .getStackForm(1L)); - - ItemList.ElectricFurnaceLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_LuV.ID, - "basicmachine.e_furnace.tier.06", - "Elite Electric Furnace", - 6, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).getStackForm(1L)); - - ItemList.ElectricFurnaceZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_ZPM.ID, - "basicmachine.e_furnace.tier.07", - "Elite Electric Furnace II", - 7, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).getStackForm(1L)); - - ItemList.ElectricFurnaceUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_UV.ID, - "basicmachine.e_furnace.tier.08", - "Ultimate Atom Stimulator", - 8, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).getStackForm(1L)); - - ItemList.ElectricFurnaceUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_UHV.ID, - "basicmachine.e_furnace.tier.09", - "Epic Atom Stimulator", - 9, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).getStackForm(1L)); - - ItemList.ElectricFurnaceUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_UEV.ID, - "basicmachine.e_furnace.tier.10", - "Epic Atom Stimulator II", - 10, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).getStackForm(1L)); - - ItemList.ElectricFurnaceUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_UIV.ID, - "basicmachine.e_furnace.tier.11", - "Epic Atom Stimulator III", - 11, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).getStackForm(1L)); - - ItemList.ElectricFurnaceUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTRIC_FURNACE_UMV.ID, - "basicmachine.e_furnace.tier.12", - "Epic Atom Stimulator IV", - 12, - MachineType.ELECTRIC_FURNACE.tooltipDescription(), - furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_FURNACE", - null).getStackForm(1L)); - } - - private void registerElectrolyzer() { - ItemList.Machine_LV_Electrolyzer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYSER_LV.ID, - "basicmachine.electrolyzer.tier.01", - "Basic Electrolyzer", - 1, - MachineType.ELECTROLYZER.tooltipDescription(), - RecipeMaps.electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Electrolyzer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYSER_MV.ID, - "basicmachine.electrolyzer.tier.02", - "Advanced Electrolyzer", - 2, - MachineType.ELECTROLYZER.tooltipDescription(), - RecipeMaps.electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Electrolyzer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYSER_HV.ID, - "basicmachine.electrolyzer.tier.03", - "Advanced Electrolyzer II", - 3, - MachineType.ELECTROLYZER.tooltipDescription(), - RecipeMaps.electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Electrolyzer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYSER_EV.ID, - "basicmachine.electrolyzer.tier.04", - "Advanced Electrolyzer III", - 4, - MachineType.ELECTROLYZER.tooltipDescription(), - RecipeMaps.electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Electrolyzer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYSER_IV.ID, - "basicmachine.electrolyzer.tier.05", - "Molecular Disintegrator E-4908", - 5, - MachineType.ELECTROLYZER.tooltipDescription(), - RecipeMaps.electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.ElectrolyzerLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYZER_LuV.ID, - "basicmachine.electrolyzer.tier.06", - "Elite Electrolyzer", - 6, - MachineType.ELECTROLYZER.tooltipDescription(), - electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.ElectrolyzerZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYZER_ZPM.ID, - "basicmachine.electrolyzer.tier.07", - "Elite Electrolyzer II", - 7, - MachineType.ELECTROLYZER.tooltipDescription(), - electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.ElectrolyzerUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYZER_UV.ID, - "basicmachine.electrolyzer.tier.08", - "Ultimate Ionizer", - 8, - MachineType.ELECTROLYZER.tooltipDescription(), - electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.ElectrolyzerUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYZER_UHV.ID, - "basicmachine.electrolyzer.tier.09", - "Epic Ionizer", - 9, - MachineType.ELECTROLYZER.tooltipDescription(), - electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.ElectrolyzerUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYZER_UEV.ID, - "basicmachine.electrolyzer.tier.10", - "Epic Ionizer II", - 10, - MachineType.ELECTROLYZER.tooltipDescription(), - electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.ElectrolyzerUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYZER_UIV.ID, - "basicmachine.electrolyzer.tier.11", - "Epic Ionizer III", - 11, - MachineType.ELECTROLYZER.tooltipDescription(), - electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - ItemList.ElectrolyzerUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROLYZER_UMV.ID, - "basicmachine.electrolyzer.tier.12", - "Epic Ionizer IV", - 12, - MachineType.ELECTROLYZER.tooltipDescription(), - electrolyzerRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROLYZER", - null).getStackForm(1L)); - - } - - private void registerElectromagneticSeparator() { - ItemList.Machine_LV_ElectromagneticSeparator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_LV.ID, - "basicmachine.electromagneticseparator.tier.01", - "Basic Electromagnetic Separator", - 1, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - RecipeMaps.electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.Machine_MV_ElectromagneticSeparator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_MV.ID, - "basicmachine.electromagneticseparator.tier.02", - "Advanced Electromagnetic Separator", - 2, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - RecipeMaps.electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.Machine_HV_ElectromagneticSeparator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_HV.ID, - "basicmachine.electromagneticseparator.tier.03", - "Advanced Electromagnetic Separator II", - 3, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - RecipeMaps.electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.Machine_EV_ElectromagneticSeparator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_EV.ID, - "basicmachine.electromagneticseparator.tier.04", - "Advanced Electromagnetic Separator III", - 4, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - RecipeMaps.electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.Machine_IV_ElectromagneticSeparator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_IV.ID, - "basicmachine.electromagneticseparator.tier.05", - "Advanced Electromagnetic Separator IV", - 5, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - RecipeMaps.electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.ElectromagneticSeparatorLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_LuV.ID, - "basicmachine.electromagneticseparator.tier.06", - "Elite Electromagnetic Separator", - 6, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.ElectromagneticSeparatorZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_ZPM.ID, - "basicmachine.electromagneticseparator.tier.07", - "Elite Electromagnetic Separator II", - 7, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.ElectromagneticSeparatorUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_UV.ID, - "basicmachine.electromagneticseparator.tier.08", - "Ultimate Magnetar Separator", - 8, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.ElectromagneticSeparatorUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_UHV.ID, - "basicmachine.electromagneticseparator.tier.09", - "Epic Magnetar Separator", - 9, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.ElectromagneticSeparatorUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_UEV.ID, - "basicmachine.electromagneticseparator.tier.10", - "Epic Magnetar Separator II", - 10, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.ElectromagneticSeparatorUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_UIV.ID, - "basicmachine.electromagneticseparator.tier.11", - "Epic Magnetar Separator III", - 11, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - ItemList.ElectromagneticSeparatorUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ELECTROMAGNETIC_SEPARATOR_UMV.ID, - "basicmachine.electromagneticseparator.tier.12", - "Epic Magnetar Separator IV", - 12, - MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), - electroMagneticSeparatorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTROMAGNETIC_SEPARATOR", - null).getStackForm(1L)); - - } - - private void registerExtractor() { - ItemList.Machine_LV_Extractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_LV.ID, - "basicmachine.extractor.tier.01", - "Basic Extractor", - 1, - MachineType.EXTRACTOR.tooltipDescription(), - RecipeMaps.extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_MV_Extractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_MV.ID, - "basicmachine.extractor.tier.02", - "Advanced Extractor", - 2, - MachineType.EXTRACTOR.tooltipDescription(), - RecipeMaps.extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_HV_Extractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_HV.ID, - "basicmachine.extractor.tier.03", - "Advanced Extractor II", - 3, - MachineType.EXTRACTOR.tooltipDescription(), - RecipeMaps.extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_EV_Extractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_EV.ID, - "basicmachine.extractor.tier.04", - "Advanced Extractor III", - 4, - MachineType.EXTRACTOR.tooltipDescription(), - RecipeMaps.extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.Machine_IV_Extractor.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_IV.ID, - "basicmachine.extractor.tier.05", - "Vacuum Extractor", - 5, - MachineType.EXTRACTOR.tooltipDescription(), - RecipeMaps.extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.ExtractorLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_LuV.ID, - "basicmachine.extractor.tier.06", - "Elite Extractor", - 6, - MachineType.EXTRACTOR.tooltipDescription(), - extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.ExtractorZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_ZPM.ID, - "basicmachine.extractor.tier.07", - "Elite Extractor II", - 7, - MachineType.EXTRACTOR.tooltipDescription(), - extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.ExtractorUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_UV.ID, - "basicmachine.extractor.tier.08", - "Ultimate Extractinator", - 8, - MachineType.EXTRACTOR.tooltipDescription(), - extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.ExtractorUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_UHV.ID, - "basicmachine.extractor.tier.09", - "Epic Extractinator", - 9, - MachineType.EXTRACTOR.tooltipDescription(), - extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.ExtractorUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_UEV.ID, - "basicmachine.extractor.tier.10", - "Epic Extractinator II", - 10, - MachineType.EXTRACTOR.tooltipDescription(), - extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.ExtractorUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_UIV.ID, - "basicmachine.extractor.tier.11", - "Epic Extractinator III", - 11, - MachineType.EXTRACTOR.tooltipDescription(), - extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - ItemList.ExtractorUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRACTOR_UMV.ID, - "basicmachine.extractor.tier.12", - "Epic Extractinator IV", - 12, - MachineType.EXTRACTOR.tooltipDescription(), - extractorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRACTOR", - null).getStackForm(1L)); - - } - - private void registerExtruder() { - ItemList.Machine_LV_Extruder.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_LV.ID, - "basicmachine.extruder.tier.01", - "Basic Extruder", - 1, - MachineType.EXTRUDER.tooltipDescription(), - RecipeMaps.extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Extruder.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_MV.ID, - "basicmachine.extruder.tier.02", - "Advanced Extruder", - 2, - MachineType.EXTRUDER.tooltipDescription(), - RecipeMaps.extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Extruder.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_HV.ID, - "basicmachine.extruder.tier.03", - "Advanced Extruder II", - 3, - MachineType.EXTRUDER.tooltipDescription(), - RecipeMaps.extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Extruder.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_EV.ID, - "basicmachine.extruder.tier.04", - "Advanced Extruder III", - 4, - MachineType.EXTRUDER.tooltipDescription(), - RecipeMaps.extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Extruder.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_IV.ID, - "basicmachine.extruder.tier.05", - "Advanced Extruder IV", - 5, - MachineType.EXTRUDER.tooltipDescription(), - RecipeMaps.extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.ExtruderLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_LuV.ID, - "basicmachine.extruder.tier.06", - "Elite Extruder", - 6, - MachineType.EXTRUDER.tooltipDescription(), - extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.ExtruderZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_ZPM.ID, - "basicmachine.extruder.tier.07", - "Elite Extruder II", - 7, - MachineType.EXTRUDER.tooltipDescription(), - extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.ExtruderUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_UV.ID, - "basicmachine.extruder.tier.08", - "Ultimate Shape Driver", - 8, - MachineType.EXTRUDER.tooltipDescription(), - extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.ExtruderUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_UHV.ID, - "basicmachine.extruder.tier.09", - "Epic Shape Driver", - 9, - MachineType.EXTRUDER.tooltipDescription(), - extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.ExtruderUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_UEV.ID, - "basicmachine.extruder.tier.10", - "Epic Shape Driver II", - 10, - MachineType.EXTRUDER.tooltipDescription(), - extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.ExtruderUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_UIV.ID, - "basicmachine.extruder.tier.11", - "Epic Shape Driver III", - 11, - MachineType.EXTRUDER.tooltipDescription(), - extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - ItemList.ExtruderUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - EXTRUDER_UMV.ID, - "basicmachine.extruder.tier.12", - "Epic Shape Driver IV", - 12, - MachineType.EXTRUDER.tooltipDescription(), - extruderRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "EXTRUDER", - null).getStackForm(1L)); - - } - - private void registerFluidSolidifier() { - ItemList.Machine_LV_FluidSolidifier.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_LV.ID, - "basicmachine.fluidsolidifier.tier.01", - "Basic Fluid Solidifier", - 1, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - RecipeMaps.fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.Machine_MV_FluidSolidifier.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_MV.ID, - "basicmachine.fluidsolidifier.tier.02", - "Advanced Fluid Solidifier", - 2, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - RecipeMaps.fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.Machine_HV_FluidSolidifier.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_HV.ID, - "basicmachine.fluidsolidifier.tier.03", - "Advanced Fluid Solidifier II", - 3, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - RecipeMaps.fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.Machine_EV_FluidSolidifier.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_EV.ID, - "basicmachine.fluidsolidifier.tier.04", - "Advanced Fluid Solidifier III", - 4, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - RecipeMaps.fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.Machine_IV_FluidSolidifier.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_IV.ID, - "basicmachine.fluidsolidifier.tier.05", - "Advanced Fluid Solidifier IV", - 5, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - RecipeMaps.fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.FluidSolidifierLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_LuV.ID, - "basicmachine.fluidsolidifier.tier.06", - "Elite Fluid Solidifier", - 6, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.FluidSolidifierZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_ZPM.ID, - "basicmachine.fluidsolidifier.tier.07", - "Elite Fluid Solidifier II", - 7, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.FluidSolidifierUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_UV.ID, - "basicmachine.fluidsolidifier.tier.08", - "Ultimate Fluid Petrificator", - 8, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.FluidSolidifierUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_UHV.ID, - "basicmachine.fluidsolidifier.tier.09", - "Epic Fluid Petrificator", - 9, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.FluidSolidifierUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_UEV.ID, - "basicmachine.fluidsolidifier.tier.10", - "Epic Fluid Petrificator II", - 10, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.FluidSolidifierUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_UIV.ID, - "basicmachine.fluidsolidifier.tier.11", - "Epic Fluid Petrificator III", - 11, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - ItemList.FluidSolidifierUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FLUID_SOLIDIFIER_UMV.ID, - "basicmachine.fluidsolidifier.tier.12", - "Epic Fluid Petrificator IV", - 12, - MachineType.FLUID_SOLIDIFIER.tooltipDescription(), - fluidSolidifierRecipes, - 1, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "FLUID_SOLIDIFIER", - null).getStackForm(1L)); - - } - - private void registerFormingPress() { - ItemList.Machine_LV_Press.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_LV.ID, - "basicmachine.press.tier.01", - "Basic Forming Press", - 1, - MachineType.FORMING_PRESS.tooltipDescription(), - RecipeMaps.formingPressRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.Machine_MV_Press.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_MV.ID, - "basicmachine.press.tier.02", - "Advanced Forming Press", - 2, - MachineType.FORMING_PRESS.tooltipDescription(), - RecipeMaps.formingPressRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.Machine_HV_Press.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_HV.ID, - "basicmachine.press.tier.03", - "Advanced Forming Press II", - 3, - MachineType.FORMING_PRESS.tooltipDescription(), - RecipeMaps.formingPressRecipes, - 4, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.Machine_EV_Press.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_EV.ID, - "basicmachine.press.tier.04", - "Advanced Forming Press III", - 4, - MachineType.FORMING_PRESS.tooltipDescription(), - RecipeMaps.formingPressRecipes, - 4, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.Machine_IV_Press.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_IV.ID, - "basicmachine.press.tier.05", - "Advanced Forming Press IV", - 5, - MachineType.FORMING_PRESS.tooltipDescription(), - RecipeMaps.formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.FormingPressLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_LuV.ID, - "basicmachine.press.tier.06", - "Elite Forming Press", - 6, - MachineType.FORMING_PRESS.tooltipDescription(), - formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.FormingPressZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_ZPM.ID, - "basicmachine.press.tier.07", - "Elite Forming Press II", - 7, - MachineType.FORMING_PRESS.tooltipDescription(), - formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.FormingPressUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_UV.ID, - "basicmachine.press.tier.08", - "Ultimate Surface Shifter", - 8, - MachineType.FORMING_PRESS.tooltipDescription(), - formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.FormingPressUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_UHV.ID, - "basicmachine.press.tier.09", - "Epic Surface Shifter", - 9, - MachineType.FORMING_PRESS.tooltipDescription(), - formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.FormingPressUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_UEV.ID, - "basicmachine.press.tier.10", - "Epic Surface Shifter II", - 10, - MachineType.FORMING_PRESS.tooltipDescription(), - formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.FormingPressUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_UIV.ID, - "basicmachine.press.tier.11", - "Epic Surface Shifter III", - 11, - MachineType.FORMING_PRESS.tooltipDescription(), - formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - ItemList.FormingPressUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORMING_PRESS_UMV.ID, - "basicmachine.press.tier.12", - "Epic Surface Shifter IV", - 12, - MachineType.FORMING_PRESS.tooltipDescription(), - formingPressRecipes, - 6, - 1, - false, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PRESS", - null).getStackForm(1L)); - - } - - private void registerForgeHammer() { - ItemList.Machine_LV_Hammer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_LV.ID, - "basicmachine.hammer.tier.01", - "Basic Forge Hammer", - 1, - MachineType.FORGE_HAMMER.tooltipDescription(), - RecipeMaps.hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS, - "HAMMER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Hammer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_MV.ID, - "basicmachine.hammer.tier.02", - "Advanced Forge Hammer", - 2, - MachineType.FORGE_HAMMER.tooltipDescription(), - RecipeMaps.hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS, - "HAMMER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Hammer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_HV.ID, - "basicmachine.hammer.tier.03", - "Advanced Forge Hammer II", - 3, - MachineType.FORGE_HAMMER.tooltipDescription(), - RecipeMaps.hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS, - "HAMMER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Hammer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_EV.ID, - "basicmachine.hammer.tier.04", - "Advanced Forge Hammer III", - 4, - MachineType.FORGE_HAMMER.tooltipDescription(), - RecipeMaps.hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS, - "HAMMER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Hammer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_IV.ID, - "basicmachine.hammer.tier.05", - "Advanced Forge Hammer IV", - 5, - MachineType.FORGE_HAMMER.tooltipDescription(), - RecipeMaps.hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS, - "HAMMER", - null).getStackForm(1L)); - - ItemList.ForgeHammerLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_LuV.ID, - "basicmachine.hammer.tier.06", - "Elite Forge Hammer", - 6, - MachineType.FORGE_HAMMER.tooltipDescription(), - hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "HAMMER", - null).getStackForm(1L)); - - ItemList.ForgeHammerZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_ZPM.ID, - "basicmachine.hammer.tier.07", - "Elite Forge Hammer II", - 7, - MachineType.FORGE_HAMMER.tooltipDescription(), - hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "HAMMER", - null).getStackForm(1L)); - - ItemList.ForgeHammerUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_UV.ID, - "basicmachine.hammer.tier.08", - "Ultimate Impact Modulator", - 8, - MachineType.FORGE_HAMMER.tooltipDescription(), - hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "HAMMER", - null).getStackForm(1L)); - - ItemList.ForgeHammerUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_UHV.ID, - "basicmachine.hammer.tier.09", - "Epic Impact Modulator", - 9, - MachineType.FORGE_HAMMER.tooltipDescription(), - hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "HAMMER", - null).getStackForm(1L)); - - ItemList.ForgeHammerUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_UEV.ID, - "basicmachine.hammer.tier.10", - "Epic Impact Modulator II", - 10, - MachineType.FORGE_HAMMER.tooltipDescription(), - hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "HAMMER", - null).getStackForm(1L)); - - ItemList.ForgeHammerUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_UIV.ID, - "basicmachine.hammer.tier.11", - "Epic Impact Modulator III", - 11, - MachineType.FORGE_HAMMER.tooltipDescription(), - hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "HAMMER", - null).getStackForm(1L)); - - ItemList.ForgeHammerUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - FORGE_HAMMER_UMV.ID, - "basicmachine.hammer.tier.12", - "Epic Impact Modulator IV", - 12, - MachineType.FORGE_HAMMER.tooltipDescription(), - hammerRecipes, - 1, - 1, - true, - SoundResource.RANDOM_ANVIL_USE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "HAMMER", - null).getStackForm(1L)); - - } - - private void registerLathe() { - ItemList.Machine_LV_Lathe.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_LV.ID, - "basicmachine.lathe.tier.01", - "Basic Lathe", - 1, - MachineType.LATHE.tooltipDescription(), - RecipeMaps.latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.Machine_MV_Lathe.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_MV.ID, - "basicmachine.lathe.tier.02", - "Advanced Lathe", - 2, - MachineType.LATHE.tooltipDescription(), - RecipeMaps.latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.Machine_HV_Lathe.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_HV.ID, - "basicmachine.lathe.tier.03", - "Advanced Lathe II", - 3, - MachineType.LATHE.tooltipDescription(), - RecipeMaps.latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.Machine_EV_Lathe.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_EV.ID, - "basicmachine.lathe.tier.04", - "Advanced Lathe III", - 4, - MachineType.LATHE.tooltipDescription(), - RecipeMaps.latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.Machine_IV_Lathe.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_IV.ID, - "basicmachine.lathe.tier.05", - "Advanced Lathe IV", - 5, - MachineType.LATHE.tooltipDescription(), - RecipeMaps.latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.LatheLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_LuV.ID, - "basicmachine.lathe.tier.06", - "Elite Lathe", - 6, - MachineType.LATHE.tooltipDescription(), - latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.LatheZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_ZPM.ID, - "basicmachine.lathe.tier.07", - "Elite Lathe II", - 7, - MachineType.LATHE.tooltipDescription(), - latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.LatheUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_UV.ID, - "basicmachine.lathe.tier.08", - "Ultimate Turn-O-Matic", - 8, - MachineType.LATHE.tooltipDescription(), - latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.LatheUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_UHV.ID, - "basicmachine.lathe.tier.09", - "Epic Turn-O-Matic", - 9, - MachineType.LATHE.tooltipDescription(), - latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.LatheUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_UEV.ID, - "basicmachine.lathe.tier.10", - "Epic Turn-O-Matic II", - 10, - MachineType.LATHE.tooltipDescription(), - latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.LatheUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_UIV.ID, - "basicmachine.lathe.tier.11", - "Epic Turn-O-Matic III", - 11, - MachineType.LATHE.tooltipDescription(), - latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - ItemList.LatheUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LATHE_UMV.ID, - "basicmachine.lathe.tier.12", - "Epic Turn-O-Matic IV", - 12, - MachineType.LATHE.tooltipDescription(), - latheRecipes, - 1, - 2, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LATHE", - null).getStackForm(1L)); - - } - - private void registerPrecisionLaserEngraver() { - ItemList.Machine_LV_LaserEngraver.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LASER_ENGRAVER_LV.ID, - "basicmachine.laserengraver.tier.01", - "Basic Precision Laser Engraver", - 1, - MachineType.LASER_ENGRAVER.tooltipDescription(), - RecipeMaps.laserEngraverRecipes, - 2, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.Machine_MV_LaserEngraver.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LASER_ENGRAVER_MV.ID, - "basicmachine.laserengraver.tier.02", - "Advanced Precision Laser Engraver", - 2, - MachineType.LASER_ENGRAVER.tooltipDescription(), - RecipeMaps.laserEngraverRecipes, - 2, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.Machine_HV_LaserEngraver.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LASER_ENGRAVER_HV.ID, - "basicmachine.laserengraver.tier.03", - "Advanced Precision Laser Engraver II", - 3, - MachineType.LASER_ENGRAVER.tooltipDescription(), - RecipeMaps.laserEngraverRecipes, - 2, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.Machine_EV_LaserEngraver.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LASER_ENGRAVER_EV.ID, - "basicmachine.laserengraver.tier.04", - "Advanced Precision Laser Engraver III", - 4, - MachineType.LASER_ENGRAVER.tooltipDescription(), - RecipeMaps.laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.Machine_IV_LaserEngraver.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - LASER_ENGRAVER_IV.ID, - "basicmachine.laserengraver.tier.05", - "Advanced Precision Laser Engraver IV", - 5, - MachineType.LASER_ENGRAVER.tooltipDescription(), - RecipeMaps.laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.PrecisionLaserEngraverLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRECISION_LASER_ENGRAVER_LuV.ID, - "basicmachine.laserengraver.tier.06", - "Elite Precision Laser Engraver", - 6, - MachineType.LASER_ENGRAVER.tooltipDescription(), - laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.PrecisionLaserEngraverZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRECISION_LASER_ENGRAVER_ZPM.ID, - "basicmachine.laserengraver.tier.07", - "Elite Precision Laser Engraver II", - 7, - MachineType.LASER_ENGRAVER.tooltipDescription(), - laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.PrecisionLaserEngraverUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRECISION_LASER_ENGRAVER_UV.ID, - "basicmachine.laserengraver.tier.08", - "Ultimate Exact Photon Cannon", - 8, - MachineType.LASER_ENGRAVER.tooltipDescription(), - laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.PrecisionLaserEngraverUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRECISION_LASER_ENGRAVER_UHV.ID, - "basicmachine.laserengraver.tier.09", - "Epic Exact Photon Cannon", - 9, - MachineType.LASER_ENGRAVER.tooltipDescription(), - laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.PrecisionLaserEngraverUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRECISION_LASER_ENGRAVER_UEV.ID, - "basicmachine.laserengraver.tier.10", - "Epic Exact Photon Cannon II", - 10, - MachineType.LASER_ENGRAVER.tooltipDescription(), - laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.PrecisionLaserEngraverUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRECISION_LASER_ENGRAVER_UIV.ID, - "basicmachine.laserengraver.tier.11", - "Epic Exact Photon Cannon III", - 11, - MachineType.LASER_ENGRAVER.tooltipDescription(), - laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - ItemList.PrecisionLaserEngraverUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRECISION_LASER_ENGRAVER_UMV.ID, - "basicmachine.laserengraver.tier.12", - "Epic Exact Photon Cannon IV", - 12, - MachineType.LASER_ENGRAVER.tooltipDescription(), - laserEngraverRecipes, - 4, - 1, - true, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "LASER_ENGRAVER", - null).getStackForm(1L)); - - } - - private void registerMacerator() { - ItemList.Machine_LV_Macerator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_LV.ID, - "basicmachine.macerator.tier.01", - "Basic Macerator", - 1, - MachineType.MACERATOR.tooltipDescription(), - RecipeMaps.maceratorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "MACERATOR", - null).getStackForm(1L)); - - ItemList.Machine_MV_Macerator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_MV.ID, - "basicmachine.macerator.tier.02", - "Advanced Macerator", - 2, - MachineType.MACERATOR.tooltipDescription(), - RecipeMaps.maceratorRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "MACERATOR", - null).getStackForm(1L)); - - ItemList.Machine_HV_Macerator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_HV.ID, - "basicmachine.macerator.tier.03", - "Universal Macerator", - 3, - MachineType.MACERATOR_PULVERIZER.tooltipDescription(), - RecipeMaps.maceratorRecipes, - 1, - 2, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Macerator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_EV.ID, - "basicmachine.macerator.tier.04", - "Universal Pulverizer", - 4, - MachineType.MACERATOR_PULVERIZER.tooltipDescription(), - RecipeMaps.maceratorRecipes, - 1, - 3, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Macerator.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_IV.ID, - "basicmachine.macerator.tier.05", - "Blend-O-Matic 9001", - 5, - MachineType.MACERATOR_PULVERIZER.tooltipDescription(), - RecipeMaps.maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.MaceratorLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_LuV.ID, - "basicmachine.macerator.tier.06", - "Elite Pulverizer", - 6, - MachineType.MACERATOR.tooltipDescription(), - maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.MaceratorZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_ZPM.ID, - "basicmachine.macerator.tier.07", - "Elite Pulverizer II", - 7, - MachineType.MACERATOR.tooltipDescription(), - maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.MaceratorUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_UV.ID, - "basicmachine.macerator.tier.08", - "Ultimate Shape Eliminator", - 8, - MachineType.MACERATOR.tooltipDescription(), - maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.MaceratorUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_UHV.ID, - "basicmachine.macerator.tier.09", - "Epic Shape Eliminator", - 9, - MachineType.MACERATOR.tooltipDescription(), - maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.MaceratorUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_UEV.ID, - "basicmachine.macerator.tier.10", - "Epic Shape Eliminator II", - 10, - MachineType.MACERATOR.tooltipDescription(), - maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.MaceratorUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_UIV.ID, - "basicmachine.macerator.tier.11", - "Epic Shape Eliminator III", - 11, - MachineType.MACERATOR.tooltipDescription(), - maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - ItemList.MaceratorUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MACERATOR_UMV.ID, - "basicmachine.macerator.tier.12", - "Epic Shape Eliminator IV", - 12, - MachineType.MACERATOR.tooltipDescription(), - maceratorRecipes, - 1, - 4, - false, - SoundResource.IC2_MACHINES_MACERATOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PULVERIZER", - null).getStackForm(1L)); - - } - - private void registerMatterFabricator() { - - ItemList.MassFabricatorLuV.set( - new GT_MetaTileEntity_Massfabricator( - MATTER_FABRICATOR_LuV.ID, - "basicmachine.massfab.tier.06", - "Elite Mass Fabricator", - 6).getStackForm(1L)); - ItemList.MassFabricatorZPM.set( - new GT_MetaTileEntity_Massfabricator( - MATTER_FABRICATOR_ZPM.ID, - "basicmachine.massfab.tier.07", - "Elite Mass Fabricator II", - 7).getStackForm(1L)); - ItemList.MassFabricatorUV.set( - new GT_MetaTileEntity_Massfabricator( - MATTER_FABRICATOR_UV.ID, - "basicmachine.massfab.tier.08", - "Ultimate Existence Initiator", - 8).getStackForm(1L)); - ItemList.MassFabricatorUHV.set( - new GT_MetaTileEntity_Massfabricator( - MATTER_FABRICATOR_UHV.ID, - "basicmachine.massfab.tier.09", - "Epic Existence Initiator", - 9).getStackForm(1L)); - ItemList.MassFabricatorUEV.set( - new GT_MetaTileEntity_Massfabricator( - MATTER_FABRICATOR_UEV.ID, - "basicmachine.massfab.tier.10", - "Epic Existence Initiator II", - 10).getStackForm(1L)); - ItemList.MassFabricatorUIV.set( - new GT_MetaTileEntity_Massfabricator( - MATTER_FABRICATOR_UIV.ID, - "basicmachine.massfab.tier.11", - "Epic Existence Initiator III", - 11).getStackForm(1L)); - ItemList.MassFabricatorUMV.set( - new GT_MetaTileEntity_Massfabricator( - MATTER_FABRICATOR_UMV.ID, - "basicmachine.massfab.tier.12", - "Epic Existence Initiator IV", - 12).getStackForm(1L)); - } - - private void registerMicrowave() { - ItemList.Machine_LV_Microwave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_OVEN_LV.ID, - "basicmachine.microwave.tier.01", - "Basic Microwave", - 1, - MachineType.MICROWAVE.tooltipDescription(), - RecipeMaps.microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.Machine_MV_Microwave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_OVEN_MV.ID, - "basicmachine.microwave.tier.02", - "Advanced Microwave", - 2, - MachineType.MICROWAVE.tooltipDescription(), - RecipeMaps.microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.Machine_HV_Microwave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_OVEN_HV.ID, - "basicmachine.microwave.tier.03", - "Advanced Microwave II", - 3, - MachineType.MICROWAVE.tooltipDescription(), - RecipeMaps.microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.Machine_EV_Microwave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_OVEN_EV.ID, - "basicmachine.microwave.tier.04", - "Advanced Microwave III", - 4, - MachineType.MICROWAVE.tooltipDescription(), - RecipeMaps.microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.Machine_IV_Microwave.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_OVEN_IV.ID, - "basicmachine.microwave.tier.05", - "Advanced Microwave IV", - 5, - MachineType.MICROWAVE.tooltipDescription(), - RecipeMaps.microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.MicrowaveLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_LuV.ID, - "basicmachine.microwave.tier.06", - "Elite Microwave", - 6, - MachineType.MICROWAVE.tooltipDescription(), - microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.MicrowaveZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_ZPM.ID, - "basicmachine.microwave.tier.07", - "Elite Microwave II", - 7, - MachineType.MICROWAVE.tooltipDescription(), - microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.MicrowaveUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_UV.ID, - "basicmachine.microwave.tier.08", - "Ultimate UFO Engine", - 8, - MachineType.MICROWAVE.tooltipDescription(), - microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.MicrowaveUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_UHV.ID, - "basicmachine.microwave.tier.09", - "Epic UFO Engine", - 9, - MachineType.MICROWAVE.tooltipDescription(), - microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.MicrowaveUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_UEV.ID, - "basicmachine.microwave.tier.10", - "Epic UFO Engine II", - 10, - MachineType.MICROWAVE.tooltipDescription(), - microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.MicrowaveUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_UIV.ID, - "basicmachine.microwave.tier.11", - "Epic UFO Engine III", - 11, - MachineType.MICROWAVE.tooltipDescription(), - microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - ItemList.MicrowaveUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - MICROWAVE_UMV.ID, - "basicmachine.microwave.tier.12", - "Epic UFO Engine IV", - 12, - MachineType.MICROWAVE.tooltipDescription(), - microwaveRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "MICROWAVE", - null).getStackForm(1L)); - - } - - private static void registerOven() { - ItemList.Machine_LV_Oven.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - OVEN_LV.ID, - "basicmachine.e_oven.tier.01", - "Basic Electric Oven", - 1, - MachineType.OVEN.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_OVEN", - null).setProgressBarTextureName("E_Oven") - .getStackForm(1L)); - - ItemList.Machine_MV_Oven.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - OVEN_MV.ID, - "basicmachine.e_oven.tier.02", - "Advanced Electric Oven", - 2, - MachineType.OVEN.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_OVEN", - null).setProgressBarTextureName("E_Oven") - .getStackForm(1L)); - - ItemList.Machine_HV_Oven.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - OVEN_HV.ID, - "basicmachine.e_oven.tier.03", - "Advanced Electric Oven II", - 3, - MachineType.OVEN.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_OVEN", - null).setProgressBarTextureName("E_Oven") - .getStackForm(1L)); - - ItemList.Machine_EV_Oven.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - OVEN_EV.ID, - "basicmachine.e_oven.tier.04", - "Advanced Electric Oven III", - 4, - MachineType.OVEN.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_OVEN", - null).setProgressBarTextureName("E_Oven") - .getStackForm(1L)); - - ItemList.Machine_IV_Oven.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - OVEN_IV.ID, - "basicmachine.e_oven.tier.05", - "Advanced Electric Oven IV", - 5, - MachineType.OVEN.tooltipDescription(), - RecipeMaps.furnaceRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ELECTRIC_OVEN", - null).setProgressBarTextureName("E_Oven") - .getStackForm(1L)); - } - - private void registerOreWashingPlant() { - ItemList.Machine_LV_OreWasher.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHER_LV.ID, - "basicmachine.orewasher.tier.01", - "Basic Ore Washing Plant", - 1, - MachineType.ORE_WASHER.tooltipDescription(), - RecipeMaps.oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.Machine_MV_OreWasher.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHER_MV.ID, - "basicmachine.orewasher.tier.02", - "Advanced Ore Washing Plant", - 2, - MachineType.ORE_WASHER.tooltipDescription(), - RecipeMaps.oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.Machine_HV_OreWasher.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHER_HV.ID, - "basicmachine.orewasher.tier.03", - "Advanced Ore Washing Plant II", - 3, - MachineType.ORE_WASHER.tooltipDescription(), - RecipeMaps.oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.Machine_EV_OreWasher.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHER_EV.ID, - "basicmachine.orewasher.tier.04", - "Advanced Ore Washing Plant III", - 4, - MachineType.ORE_WASHER.tooltipDescription(), - RecipeMaps.oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.Machine_IV_OreWasher.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHER_IV.ID, - "basicmachine.orewasher.tier.05", - "Repurposed Laundry-Washer I-360", - 5, - MachineType.ORE_WASHER.tooltipDescription(), - RecipeMaps.oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.OreWashingPlantLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHING_PLANT_LuV.ID, - "basicmachine.orewasher.tier.06", - "Elite Ore Washing Plant", - 6, - MachineType.ORE_WASHER.tooltipDescription(), - oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.OreWashingPlantZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHING_PLANT_ZPM.ID, - "basicmachine.orewasher.tier.07", - "Elite Ore Washing Plant II", - 7, - MachineType.ORE_WASHER.tooltipDescription(), - oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.OreWashingPlantUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHING_PLANT_UV.ID, - "basicmachine.orewasher.tier.08", - "Ultimate Ore Washing Machine", - 8, - MachineType.ORE_WASHER.tooltipDescription(), - oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.OreWashingPlantUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHING_PLANT_UHV.ID, - "basicmachine.orewasher.tier.09", - "Epic Ore Washing Machine", - 9, - MachineType.ORE_WASHER.tooltipDescription(), - oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.OreWashingPlantUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHING_PLANT_UEV.ID, - "basicmachine.orewasher.tier.10", - "Epic Ore Washing Machine II", - 10, - MachineType.ORE_WASHER.tooltipDescription(), - oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.OreWashingPlantUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHING_PLANT_UIV.ID, - "basicmachine.orewasher.tier.11", - "Epic Ore Washing Machine III", - 11, - MachineType.ORE_WASHER.tooltipDescription(), - oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - ItemList.OreWashingPlantUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ORE_WASHING_PLANT_UMV.ID, - "basicmachine.orewasher.tier.12", - "Epic Ore Washing Machine IV", - 12, - MachineType.ORE_WASHER.tooltipDescription(), - oreWasherRecipes, - 1, - 3, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ORE_WASHER", - null).getStackForm(1L)); - - } - - private void registerPolarizer() { - ItemList.Machine_LV_Polarizer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_LV.ID, - "basicmachine.polarizer.tier.01", - "Basic Polarizer", - 1, - MachineType.POLARIZER.tooltipDescription(), - RecipeMaps.polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Polarizer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_MV.ID, - "basicmachine.polarizer.tier.02", - "Advanced Polarizer", - 2, - MachineType.POLARIZER.tooltipDescription(), - RecipeMaps.polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Polarizer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_HV.ID, - "basicmachine.polarizer.tier.03", - "Advanced Polarizer II", - 3, - MachineType.POLARIZER.tooltipDescription(), - RecipeMaps.polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Polarizer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_EV.ID, - "basicmachine.polarizer.tier.04", - "Advanced Polarizer III", - 4, - MachineType.POLARIZER.tooltipDescription(), - RecipeMaps.polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Polarizer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_IV.ID, - "basicmachine.polarizer.tier.05", - "Advanced Polarizer IV", - 5, - MachineType.POLARIZER.tooltipDescription(), - RecipeMaps.polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.PolarizerLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_LuV.ID, - "basicmachine.polarizer.tier.06", - "Elite Polarizer", - 6, - MachineType.POLARIZER.tooltipDescription(), - polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.PolarizerZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_ZPM.ID, - "basicmachine.polarizer.tier.07", - "Elite Polarizer II", - 7, - MachineType.POLARIZER.tooltipDescription(), - polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.PolarizerUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_UV.ID, - "basicmachine.polarizer.tier.08", - "Ultimate Magnetism Inducer", - 8, - MachineType.POLARIZER.tooltipDescription(), - polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.PolarizerUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_UHV.ID, - "basicmachine.polarizer.tier.09", - "Epic Magnetism Inducer", - 9, - MachineType.POLARIZER.tooltipDescription(), - polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.PolarizerUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_UEV.ID, - "basicmachine.polarizer.tier.10", - "Epic Magnetism Inducer II", - 10, - MachineType.POLARIZER.tooltipDescription(), - polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.PolarizerUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_UIV.ID, - "basicmachine.polarizer.tier.11", - "Epic Magnetism Inducer III", - 11, - MachineType.POLARIZER.tooltipDescription(), - polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - ItemList.PolarizerUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - POLARIZER_UMV.ID, - "basicmachine.polarizer.tier.12", - "Epic Magnetism Inducer IV", - 12, - MachineType.POLARIZER.tooltipDescription(), - polarizerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "POLARIZER", - null).getStackForm(1L)); - - } - - private static void registerPrinter() { - ItemList.Machine_LV_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_LV.ID, - "basicmachine.printer.tier.01", - "Basic Printer", - 1, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_MV.ID, - "basicmachine.printer.tier.02", - "Advanced Printer", - 2, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_HV.ID, - "basicmachine.printer.tier.03", - "Advanced Printer II", - 3, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_EV.ID, - "basicmachine.printer.tier.04", - "Advanced Printer III", - 4, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_IV.ID, - "basicmachine.printer.tier.05", - "Advanced Printer IV", - 5, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - - ItemList.Machine_LuV_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_LuV.ID, - "basicmachine.printer.tier.06", - "Advanced Printer V", - 6, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - - ItemList.Machine_ZPM_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_ZPM.ID, - "basicmachine.printer.tier.07", - "Advanced Printer VI", - 7, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - - ItemList.Machine_UV_Printer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PRINTER_UV.ID, - "basicmachine.printer.tier.08", - "Advanced Printer VII", - 8, - MachineType.PRINTER.tooltipDescription(), - RecipeMaps.printerRecipes, - 1, - 1, - true, - SoundResource.IC2_MACHINES_COMPRESSOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.TOP_SMOKE, - "PRINTER", - null).getStackForm(1L)); - } - - private void registerRecycler() { - ItemList.Machine_LV_Recycler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_LV.ID, - "basicmachine.recycler.tier.01", - "Basic Recycler", - 1, - MachineType.RECYCLER.tooltipDescription(), - RecipeMaps.recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Recycler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_MV.ID, - "basicmachine.recycler.tier.02", - "Advanced Recycler", - 2, - MachineType.RECYCLER.tooltipDescription(), - RecipeMaps.recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Recycler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_HV.ID, - "basicmachine.recycler.tier.03", - "Advanced Recycler II", - 3, - MachineType.RECYCLER.tooltipDescription(), - RecipeMaps.recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Recycler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_EV.ID, - "basicmachine.recycler.tier.04", - "Advanced Recycler III", - 4, - MachineType.RECYCLER.tooltipDescription(), - RecipeMaps.recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Recycler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_IV.ID, - "basicmachine.recycler.tier.05", - "The Oblitterator", - 5, - MachineType.RECYCLER.tooltipDescription(), - RecipeMaps.recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.RecyclerLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_LuV.ID, - "basicmachine.recycler.tier.06", - "Elite Recycler", - 6, - MachineType.RECYCLER.tooltipDescription(), - recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.RecyclerZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_ZPM.ID, - "basicmachine.recycler.tier.07", - "Elite Recycler II", - 7, - MachineType.RECYCLER.tooltipDescription(), - recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.RecyclerUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_UV.ID, - "basicmachine.recycler.tier.08", - "Ultimate Scrap-O-Matic", - 8, - MachineType.RECYCLER.tooltipDescription(), - recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.RecyclerUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_UHV.ID, - "basicmachine.recycler.tier.09", - "Epic Scrap-O-Matic", - 9, - MachineType.RECYCLER.tooltipDescription(), - recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.RecyclerUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_UEV.ID, - "basicmachine.recycler.tier.10", - "Epic Scrap-O-Matic II", - 10, - MachineType.RECYCLER.tooltipDescription(), - recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.RecyclerUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_UIV.ID, - "basicmachine.recycler.tier.11", - "Epic Scrap-O-Matic III", - 11, - MachineType.RECYCLER.tooltipDescription(), - recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - ItemList.RecyclerUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - RECYCLER_UMV.ID, - "basicmachine.recycler.tier.12", - "Epic Scrap-O-Matic IV", - 12, - MachineType.RECYCLER.tooltipDescription(), - recyclerRecipes, - 1, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "RECYCLER", - null).getStackForm(1L)); - - } - - private void registerSiftingMachine() { - ItemList.Machine_LV_Sifter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTER_LV.ID, - "basicmachine.sifter.tier.01", - "Basic Sifting Machine", - 1, - MachineType.SIFTER.tooltipDescription(), - RecipeMaps.sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Sifter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTER_MV.ID, - "basicmachine.sifter.tier.02", - "Advanced Sifting Machine", - 2, - MachineType.SIFTER.tooltipDescription(), - RecipeMaps.sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Sifter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTER_HV.ID, - "basicmachine.sifter.tier.03", - "Advanced Sifting Machine II", - 3, - MachineType.SIFTER.tooltipDescription(), - RecipeMaps.sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Sifter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTER_EV.ID, - "basicmachine.sifter.tier.04", - "Advanced Sifting Machine III", - 4, - MachineType.SIFTER.tooltipDescription(), - RecipeMaps.sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Sifter.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTER_IV.ID, - "basicmachine.sifter.tier.05", - "Advanced Sifting Machine IV", - 5, - MachineType.SIFTER.tooltipDescription(), - RecipeMaps.sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.SiftingMachineLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTING_MACHINE_LuV.ID, - "basicmachine.sifter.tier.06", - "Elite Sifting Machine", - 6, - MachineType.SIFTER.tooltipDescription(), - sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.SiftingMachineZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTING_MACHINE_ZPM.ID, - "basicmachine.sifter.tier.07", - "Elite Sifting Machine II", - 7, - MachineType.SIFTER.tooltipDescription(), - sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.SiftingMachineUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTING_MACHINE_UV.ID, - "basicmachine.sifter.tier.08", - "Ultimate Pulsation Filter", - 8, - MachineType.SIFTER.tooltipDescription(), - sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.SiftingMachineUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTING_MACHINE_UHV.ID, - "basicmachine.sifter.tier.09", - "Epic Pulsation Filter", - 9, - MachineType.SIFTER.tooltipDescription(), - sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.SiftingMachineUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTING_MACHINE_UEV.ID, - "basicmachine.sifter.tier.10", - "Epic Pulsation Filter II", - 10, - MachineType.SIFTER.tooltipDescription(), - sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.SiftingMachineUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTING_MACHINE_UIV.ID, - "basicmachine.sifter.tier.11", - "Epic Pulsation Filter III", - 11, - MachineType.SIFTER.tooltipDescription(), - sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - ItemList.SiftingMachineUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SIFTING_MACHINE_UMV.ID, - "basicmachine.sifter.tier.12", - "Epic Pulsation Filter IV", - 12, - MachineType.SIFTER.tooltipDescription(), - sifterRecipes, - 1, - 9, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SIFTER", - null).getStackForm(1L)); - - } - - private void registerSlicingMachine() { - ItemList.Machine_LV_Slicer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICER_LV.ID, - "basicmachine.slicer.tier.01", - "Basic Slicing Machine", - 1, - MachineType.SLICER.tooltipDescription(), - RecipeMaps.slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Slicer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICER_MV.ID, - "basicmachine.slicer.tier.02", - "Advanced Slicing Machine", - 2, - MachineType.SLICER.tooltipDescription(), - RecipeMaps.slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Slicer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICER_HV.ID, - "basicmachine.slicer.tier.03", - "Advanced Slicing Machine II", - 3, - MachineType.SLICER.tooltipDescription(), - RecipeMaps.slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Slicer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICER_EV.ID, - "basicmachine.slicer.tier.04", - "Advanced Slicing Machine III", - 4, - MachineType.SLICER.tooltipDescription(), - RecipeMaps.slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Slicer.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICER_IV.ID, - "basicmachine.slicer.tier.05", - "Advanced Slicing Machine IV", - 5, - MachineType.SLICER.tooltipDescription(), - RecipeMaps.slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.SlicingMachineLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICING_MACHINE_LuV.ID, - "basicmachine.slicer.tier.06", - "Elite Slicing Machine", - 6, - MachineType.SLICER.tooltipDescription(), - slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.SlicingMachineZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICING_MACHINE_ZPM.ID, - "basicmachine.slicer.tier.07", - "Elite Slicing Machine II", - 7, - MachineType.SLICER.tooltipDescription(), - slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.SlicingMachineUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICING_MACHINE_UV.ID, - "basicmachine.slicer.tier.08", - "Ultimate Quantum Slicer", - 8, - MachineType.SLICER.tooltipDescription(), - slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.SlicingMachineUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICING_MACHINE_UHV.ID, - "basicmachine.slicer.tier.09", - "Epic Quantum Slicer", - 9, - MachineType.SLICER.tooltipDescription(), - slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.SlicingMachineUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICING_MACHINE_UEV.ID, - "basicmachine.slicer.tier.10", - "Epic Quantum Slicer II", - 10, - MachineType.SLICER.tooltipDescription(), - slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.SlicingMachineUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICING_MACHINE_UIV.ID, - "basicmachine.slicer.tier.11", - "Epic Quantum Slicer III", - 11, - MachineType.SLICER.tooltipDescription(), - slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - ItemList.SlicingMachineUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - SLICING_MACHINE_UMV.ID, - "basicmachine.slicer.tier.12", - "Epic Quantum Slicer IV", - 12, - MachineType.SLICER.tooltipDescription(), - slicerRecipes, - 2, - 1, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "SLICER", - null).getStackForm(1L)); - - } - - private void registerThermalCentrifuge() { - ItemList.Machine_LV_ThermalCentrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_LV.ID, - "basicmachine.thermalcentrifuge.tier.01", - "Basic Thermal Centrifuge", - 1, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - RecipeMaps.thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_MV_ThermalCentrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_MV.ID, - "basicmachine.thermalcentrifuge.tier.02", - "Advanced Thermal Centrifuge", - 2, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - RecipeMaps.thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_HV_ThermalCentrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_HV.ID, - "basicmachine.thermalcentrifuge.tier.03", - "Advanced Thermal Centrifuge II", - 3, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - RecipeMaps.thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_EV_ThermalCentrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_EV.ID, - "basicmachine.thermalcentrifuge.tier.04", - "Advanced Thermal Centrifuge III", - 4, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - RecipeMaps.thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_IV_ThermalCentrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_IV.ID, - "basicmachine.thermalcentrifuge.tier.05", - "Blaze Sweatshop T-6350", - 5, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - RecipeMaps.thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.ThermalCentrifugeLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_LuV.ID, - "basicmachine.thermalcentrifuge.tier.06", - "Elite Thermal Centrifuge", - 6, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.ThermalCentrifugeZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_ZPM.ID, - "basicmachine.thermalcentrifuge.tier.07", - "Elite Thermal Centrifuge II", - 7, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.ThermalCentrifugeUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_UV.ID, - "basicmachine.thermalcentrifuge.tier.08", - "Ultimate Fire Cyclone", - 8, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.ThermalCentrifugeUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_UHV.ID, - "basicmachine.thermalcentrifuge.tier.09", - "Epic Fire Cyclone", - 9, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.ThermalCentrifugeUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_UEV.ID, - "basicmachine.thermalcentrifuge.tier.10", - "Epic Fire Cyclone II", - 10, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.ThermalCentrifugeUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_UIV.ID, - "basicmachine.thermalcentrifuge.tier.11", - "Epic Fire Cyclone III", - 11, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.ThermalCentrifugeUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - THERMAL_CENTRIFUGE_UMV.ID, - "basicmachine.thermalcentrifuge.tier.12", - "Epic Fire Cyclone IV", - 12, - MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), - thermalCentrifugeRecipes, - 1, - 3, - false, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "THERMAL_CENTRIFUGE", - null).getStackForm(1L)); - } - - private void registerWiremill() { - ItemList.Machine_LV_Wiremill.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_LV.ID, - "basicmachine.wiremill.tier.01", - "Basic Wiremill", - 1, - MachineType.WIREMILL.tooltipDescription(), - RecipeMaps.wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.Machine_MV_Wiremill.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_MV.ID, - "basicmachine.wiremill.tier.02", - "Advanced Wiremill", - 2, - MachineType.WIREMILL.tooltipDescription(), - RecipeMaps.wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.Machine_HV_Wiremill.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_HV.ID, - "basicmachine.wiremill.tier.03", - "Advanced Wiremill II", - 3, - MachineType.WIREMILL.tooltipDescription(), - RecipeMaps.wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.Machine_EV_Wiremill.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_EV.ID, - "basicmachine.wiremill.tier.04", - "Advanced Wiremill III", - 4, - MachineType.WIREMILL.tooltipDescription(), - RecipeMaps.wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.Machine_IV_Wiremill.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_IV.ID, - "basicmachine.wiremill.tier.05", - "Advanced Wiremill IV", - 5, - MachineType.WIREMILL.tooltipDescription(), - RecipeMaps.wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.WiremillLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_LuV.ID, - "basicmachine.wiremill.tier.06", - "Elite Wiremill", - 6, - MachineType.WIREMILL.tooltipDescription(), - wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.WiremillZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_ZPM.ID, - "basicmachine.wiremill.tier.07", - "Elite Wiremill II", - 7, - MachineType.WIREMILL.tooltipDescription(), - wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.WiremillUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_UV.ID, - "basicmachine.wiremill.tier.08", - "Ultimate Wire Transfigurator", - 8, - MachineType.WIREMILL.tooltipDescription(), - wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.WiremillUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_UHV.ID, - "basicmachine.wiremill.tier.09", - "Epic Wire Transfigurator", - 9, - MachineType.WIREMILL.tooltipDescription(), - wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.WiremillUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_UEV.ID, - "basicmachine.wiremill.tier.10", - "Epic Wire Transfigurator II", - 10, - MachineType.WIREMILL.tooltipDescription(), - wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.WiremillUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_UIV.ID, - "basicmachine.wiremill.tier.11", - "Epic Wire Transfigurator III", - 11, - MachineType.WIREMILL.tooltipDescription(), - wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - ItemList.WiremillUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - WIREMILL_UMV.ID, - "basicmachine.wiremill.tier.12", - "Epic Wire Transfigurator IV", - 12, - MachineType.WIREMILL.tooltipDescription(), - wiremillRecipes, - 2, - 1, - false, - SoundResource.IC2_MACHINES_RECYCLER_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "WIREMILL", - null).getStackForm(1L)); - - } - - private void registerArcFurnace() { - ItemList.Machine_LV_ArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_LV.ID, - "basicmachine.arcfurnace.tier.01", - "Basic Arc Furnace", - 1, - MachineType.ARC_FURNACE.tooltipDescription(), - RecipeMaps.arcFurnaceRecipes, - 1, - 4, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_MV_ArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_MV.ID, - "basicmachine.arcfurnace.tier.02", - "Advanced Arc Furnace", - 2, - MachineType.ARC_FURNACE.tooltipDescription(), - RecipeMaps.arcFurnaceRecipes, - 1, - 4, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_HV_ArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_HV.ID, - "basicmachine.arcfurnace.tier.03", - "Advanced Arc Furnace II", - 3, - MachineType.ARC_FURNACE.tooltipDescription(), - RecipeMaps.arcFurnaceRecipes, - 1, - 4, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_EV_ArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_EV.ID, - "basicmachine.arcfurnace.tier.04", - "Advanced Arc Furnace III", - 4, - MachineType.ARC_FURNACE.tooltipDescription(), - RecipeMaps.arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_IV_ArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_IV.ID, - "basicmachine.arcfurnace.tier.05", - "Advanced Arc Furnace IV", - 5, - MachineType.ARC_FURNACE.tooltipDescription(), - RecipeMaps.arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.ArcFurnaceLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_LuV.ID, - "basicmachine.arcfurnace.tier.06", - "Elite Arc Furnace", - 6, - MachineType.ARC_FURNACE.tooltipDescription(), - arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.ArcFurnaceZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_ZPM.ID, - "basicmachine.arcfurnace.tier.07", - "Elite Arc Furnace II", - 7, - MachineType.ARC_FURNACE.tooltipDescription(), - arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.ArcFurnaceUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_UV.ID, - "basicmachine.arcfurnace.tier.08", - "Ultimate Short Circuit Heater", - 8, - MachineType.ARC_FURNACE.tooltipDescription(), - arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.ArcFurnaceUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_UHV.ID, - "basicmachine.arcfurnace.tier.09", - "Epic Short Circuit Heater", - 9, - MachineType.ARC_FURNACE.tooltipDescription(), - arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.ArcFurnaceUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_UEV.ID, - "basicmachine.arcfurnace.tier.10", - "Epic Short Circuit Heater II", - 10, - MachineType.ARC_FURNACE.tooltipDescription(), - arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.ArcFurnaceUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_UIV.ID, - "basicmachine.arcfurnace.tier.11", - "Epic Short Circuit Heater III", - 11, - MachineType.ARC_FURNACE.tooltipDescription(), - arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.ArcFurnaceUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - ARC_FURNACE_UMV.ID, - "basicmachine.arcfurnace.tier.12", - "Epic Short Circuit Heater IV", - 12, - MachineType.ARC_FURNACE.tooltipDescription(), - arcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "ARC_FURNACE", - null).getStackForm(1L)); - - } - - private void registerCentrifuge() { - ItemList.Machine_LV_Centrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_LV.ID, - "basicmachine.centrifuge.tier.01", - "Basic Centrifuge", - 1, - MachineType.CENTRIFUGE.tooltipDescription(), - RecipeMaps.centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_MV_Centrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_MV.ID, - "basicmachine.centrifuge.tier.02", - "Advanced Centrifuge", - 2, - MachineType.CENTRIFUGE.tooltipDescription(), - RecipeMaps.centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_HV_Centrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_HV.ID, - "basicmachine.centrifuge.tier.03", - "Turbo Centrifuge", - 3, - MachineType.CENTRIFUGE.tooltipDescription(), - RecipeMaps.centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_EV_Centrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_EV.ID, - "basicmachine.centrifuge.tier.04", - "Molecular Separator", - 4, - MachineType.CENTRIFUGE.tooltipDescription(), - RecipeMaps.centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.Machine_IV_Centrifuge.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_IV.ID, - "basicmachine.centrifuge.tier.05", - "Molecular Cyclone", - 5, - MachineType.CENTRIFUGE.tooltipDescription(), - RecipeMaps.centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.CentrifugeLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_LuV.ID, - "basicmachine.centrifuge.tier.06", - "Elite Centrifuge", - 6, - MachineType.CENTRIFUGE.tooltipDescription(), - centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.CentrifugeZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_ZPM.ID, - "basicmachine.centrifuge.tier.07", - "Elite Centrifuge II", - 7, - MachineType.CENTRIFUGE.tooltipDescription(), - centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.CentrifugeUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_UV.ID, - "basicmachine.centrifuge.tier.08", - "Ultimate Molecular Tornado", - 8, - MachineType.CENTRIFUGE.tooltipDescription(), - centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.CentrifugeUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_UHV.ID, - "basicmachine.centrifuge.tier.09", - "Epic Molecular Tornado", - 9, - MachineType.CENTRIFUGE.tooltipDescription(), - centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.CentrifugeUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_UEV.ID, - "basicmachine.centrifuge.tier.10", - "Epic Molecular Tornado II", - 10, - MachineType.CENTRIFUGE.tooltipDescription(), - centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.CentrifugeUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_UIV.ID, - "basicmachine.centrifuge.tier.11", - "Epic Molecular Tornado III", - 11, - MachineType.CENTRIFUGE.tooltipDescription(), - centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - ItemList.CentrifugeUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CENTRIFUGE_UMV.ID, - "basicmachine.centrifuge.tier.12", - "Epic Molecular Tornado IV", - 12, - MachineType.CENTRIFUGE.tooltipDescription(), - centrifugeRecipes, - 2, - 6, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CENTRIFUGE", - null).getStackForm(1L)); - - } - - private void registerPlasmaArcFurnace() { - ItemList.Machine_LV_PlasmaArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_LV.ID, - "basicmachine.plasmaarcfurnace.tier.01", - "Basic Plasma Arc Furnace", - 1, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - RecipeMaps.plasmaArcFurnaceRecipes, - 1, - 4, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_MV_PlasmaArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_MV.ID, - "basicmachine.plasmaarcfurnace.tier.02", - "Advanced Plasma Arc Furnace", - 2, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - RecipeMaps.plasmaArcFurnaceRecipes, - 1, - 4, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_HV_PlasmaArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_HV.ID, - "basicmachine.plasmaarcfurnace.tier.03", - "Advanced Plasma Arc Furnace II", - 3, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - RecipeMaps.plasmaArcFurnaceRecipes, - 1, - 4, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_EV_PlasmaArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_EV.ID, - "basicmachine.plasmaarcfurnace.tier.04", - "Advanced Plasma Arc Furnace III", - 4, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - RecipeMaps.plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.Machine_IV_PlasmaArcFurnace.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_IV.ID, - "basicmachine.plasmaarcfurnace.tier.05", - "Advanced Plasma Arc Furnace IV", - 5, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - RecipeMaps.plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.PlasmaArcFurnaceLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_LuV.ID, - "basicmachine.plasmaarcfurnace.tier.06", - "Elite Plasma Arc Furnace", - 6, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.PlasmaArcFurnaceZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_ZPM.ID, - "basicmachine.plasmaarcfurnace.tier.07", - "Elite Plasma Arc Furnace II", - 7, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.PlasmaArcFurnaceUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_UV.ID, - "basicmachine.plasmaarcfurnace.tier.08", - "Ultimate Plasma Discharge Heater", - 8, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.PlasmaArcFurnaceUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_UHV.ID, - "basicmachine.plasmaarcfurnace.tier.09", - "Epic Plasma Discharge Heater", - 9, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.PlasmaArcFurnaceUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_UEV.ID, - "basicmachine.plasmaarcfurnace.tier.10", - "Epic Plasma Discharge Heater II", - 10, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.PlasmaArcFurnaceUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_UIV.ID, - "basicmachine.plasmaarcfurnace.tier.11", - "Epic Plasma Discharge Heater III", - 11, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - - ItemList.PlasmaArcFurnaceUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - PLASMA_ARC_FURNACE_UMV.ID, - "basicmachine.plasmaarcfurnace.tier.12", - "Epic Plasma Discharge Heater IV", - 12, - MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), - plasmaArcFurnaceRecipes, - 1, - 9, - true, - SoundResource.IC2_MACHINES_INDUCTION_LOOP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "PLASMA_ARC_FURNACE", - null).getStackForm(1L)); - } - - private void registerCanningMachine() { - ItemList.Machine_LV_Canner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNER_LV.ID, - "basicmachine.canner.tier.01", - "Basic Canning Machine", - 1, - MachineType.CANNER.tooltipDescription(), - RecipeMaps.cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.Machine_MV_Canner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNER_MV.ID, - "basicmachine.canner.tier.02", - "Advanced Canning Machine", - 2, - MachineType.CANNER.tooltipDescription(), - RecipeMaps.cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.Machine_HV_Canner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNER_HV.ID, - "basicmachine.canner.tier.03", - "Advanced Canning Machine II", - 3, - MachineType.CANNER.tooltipDescription(), - RecipeMaps.cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.Machine_EV_Canner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNER_EV.ID, - "basicmachine.canner.tier.04", - "Advanced Canning Machine III", - 4, - MachineType.CANNER.tooltipDescription(), - RecipeMaps.cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.Machine_IV_Canner.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNER_IV.ID, - "basicmachine.canner.tier.05", - "Advanced Canning Machine IV", - 5, - MachineType.CANNER.tooltipDescription(), - RecipeMaps.cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.CanningMachineLuV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNING_MACHINE_LuV.ID, - "basicmachine.canner.tier.06", - "Elite Canning Machine", - 6, - MachineType.CANNER.tooltipDescription(), - cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.CanningMachineZPM.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNING_MACHINE_ZPM.ID, - "basicmachine.canner.tier.07", - "Elite Canning Machine II", - 7, - MachineType.CANNER.tooltipDescription(), - cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.CanningMachineUV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNING_MACHINE_UV.ID, - "basicmachine.canner.tier.08", - "Ultimate Can Operator", - 8, - MachineType.CANNER.tooltipDescription(), - cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.CanningMachineUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNING_MACHINE_UHV.ID, - "basicmachine.canner.tier.09", - "Epic Can Operator", - 9, - MachineType.CANNER.tooltipDescription(), - cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.CanningMachineUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNING_MACHINE_UEV.ID, - "basicmachine.canner.tier.10", - "Epic Can Operator II", - 10, - MachineType.CANNER.tooltipDescription(), - cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.CanningMachineUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNING_MACHINE_UIV.ID, - "basicmachine.canner.tier.11", - "Epic Can Operator III", - 11, - MachineType.CANNER.tooltipDescription(), - cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - - ItemList.CanningMachineUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CANNING_MACHINE_UMV.ID, - "basicmachine.canner.tier.12", - "Epic Can Operator IV", - 12, - MachineType.CANNER.tooltipDescription(), - cannerRecipes, - 2, - 2, - false, - SoundResource.IC2_MACHINES_EXTRACTOR_OP, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CANNER", - null).getStackForm(1L)); - } - - private static void registerDynamoHatch() { - ItemList.Hatch_Dynamo_ULV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_ULV.ID, "hatch.dynamo.tier.00", "ULV Dynamo Hatch", 0) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_LV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_LV.ID, "hatch.dynamo.tier.01", "LV Dynamo Hatch", 1) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_MV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_MV.ID, "hatch.dynamo.tier.02", "MV Dynamo Hatch", 2) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_HV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_HV.ID, "hatch.dynamo.tier.03", "HV Dynamo Hatch", 3) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_EV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_EV.ID, "hatch.dynamo.tier.04", "EV Dynamo Hatch", 4) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_IV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_IV.ID, "hatch.dynamo.tier.05", "IV Dynamo Hatch", 5) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_LuV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_LuV.ID, "hatch.dynamo.tier.06", "LuV Dynamo Hatch", 6) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_ZPM.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_ZPM.ID, "hatch.dynamo.tier.07", "ZPM Dynamo Hatch", 7) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_UV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UV.ID, "hatch.dynamo.tier.08", "UV Dynamo Hatch", 8) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_UHV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UHV.ID, "hatch.dynamo.tier.09", "UHV Dynamo Hatch", 9) - .getStackForm(1L)); - ItemList.Hatch_Dynamo_UEV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UEV.ID, "hatch.dynamo.tier.10", "UEV Dynamo Hatch", 10) - .getStackForm(1L)); - - ItemList.Hatch_Dynamo_UIV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UIV.ID, "hatch.dynamo.tier.11", "UIV Dynamo Hatch", 11) - .getStackForm(1L)); - - ItemList.Hatch_Dynamo_UMV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UMV.ID, "hatch.dynamo.tier.12", "UMV Dynamo Hatch", 12) - .getStackForm(1L)); - - ItemList.Hatch_Dynamo_UXV.set( - new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UXV.ID, "hatch.dynamo.tier.13", "UXV Dynamo Hatch", 13) - .getStackForm(1L)); - } - - private static void registerEnergyHatch() { - ItemList.Hatch_Energy_ULV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_ULV.ID, "hatch.energy.tier.00", "ULV Energy Hatch", 0) - .getStackForm(1L)); - ItemList.Hatch_Energy_LV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_LV.ID, "hatch.energy.tier.01", "LV Energy Hatch", 1) - .getStackForm(1L)); - ItemList.Hatch_Energy_MV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_MV.ID, "hatch.energy.tier.02", "MV Energy Hatch", 2) - .getStackForm(1L)); - ItemList.Hatch_Energy_HV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_HV.ID, "hatch.energy.tier.03", "HV Energy Hatch", 3) - .getStackForm(1L)); - ItemList.Hatch_Energy_EV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_EV.ID, "hatch.energy.tier.04", "EV Energy Hatch", 4) - .getStackForm(1L)); - ItemList.Hatch_Energy_IV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_IV.ID, "hatch.energy.tier.05", "IV Energy Hatch", 5) - .getStackForm(1L)); - ItemList.Hatch_Energy_LuV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_LuV.ID, "hatch.energy.tier.06", "LuV Energy Hatch", 6) - .getStackForm(1L)); - ItemList.Hatch_Energy_ZPM.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_ZPM.ID, "hatch.energy.tier.07", "ZPM Energy Hatch", 7) - .getStackForm(1L)); - ItemList.Hatch_Energy_UV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UV.ID, "hatch.energy.tier.08", "UV Energy Hatch", 8) - .getStackForm(1L)); - ItemList.Hatch_Energy_UHV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UHV.ID, "hatch.energy.tier.09", "UHV Energy Hatch", 9) - .getStackForm(1L)); - ItemList.Hatch_Energy_UEV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UEV.ID, "hatch.energy.tier.10", "UEV Energy Hatch", 10) - .getStackForm(1L)); - - ItemList.Hatch_Energy_UIV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UIV.ID, "hatch.energy.tier.11", "UIV Energy Hatch", 11) - .getStackForm(1L)); - - ItemList.Hatch_Energy_UMV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UMV.ID, "hatch.energy.tier.12", "UMV Energy Hatch", 12) - .getStackForm(1L)); - - ItemList.Hatch_Energy_UXV.set( - new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UXV.ID, "hatch.energy.tier.13", "UXV Energy Hatch", 13) - .getStackForm(1L)); - } - - private static void registerInputHatch() { - ItemList.Hatch_Input_ULV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_ULV.ID, "hatch.input.tier.00", "Input Hatch (ULV)", 0) - .getStackForm(1L)); - ItemList.Hatch_Input_LV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_LV.ID, "hatch.input.tier.01", "Input Hatch (LV)", 1) - .getStackForm(1L)); - ItemList.Hatch_Input_MV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_MV.ID, "hatch.input.tier.02", "Input Hatch (MV)", 2) - .getStackForm(1L)); - ItemList.Hatch_Input_HV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_HV.ID, "hatch.input.tier.03", "Input Hatch (HV)", 3) - .getStackForm(1L)); - ItemList.Hatch_Input_EV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_EV.ID, "hatch.input.tier.04", "Input Hatch (EV)", 4) - .getStackForm(1L)); - ItemList.Hatch_Input_IV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_IV.ID, "hatch.input.tier.05", "Input Hatch (IV)", 5) - .getStackForm(1L)); - ItemList.Hatch_Input_LuV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_LuV.ID, "hatch.input.tier.06", "Input Hatch (LuV)", 6) - .getStackForm(1L)); - ItemList.Hatch_Input_ZPM.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_ZPM.ID, "hatch.input.tier.07", "Input Hatch (ZPM)", 7) - .getStackForm(1L)); - ItemList.Hatch_Input_UV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UV.ID, "hatch.input.tier.08", "Input Hatch (UV)", 8) - .getStackForm(1L)); - ItemList.Hatch_Input_UHV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UHV.ID, "hatch.input.tier.09", "Input Hatch (UHV)", 9) - .getStackForm(1L)); - ItemList.Hatch_Input_UEV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UEV.ID, "hatch.input.tier.10", "Input Hatch (UEV)", 10) - .getStackForm(1L)); - ItemList.Hatch_Input_UIV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UIV.ID, "hatch.input.tier.11", "Input Hatch (UIV)", 11) - .getStackForm(1L)); - ItemList.Hatch_Input_UMV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UMV.ID, "hatch.input.tier.12", "Input Hatch (UMV)", 12) - .getStackForm(1L)); - ItemList.Hatch_Input_UXV.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UXV.ID, "hatch.input.tier.13", "Input Hatch (UXV)", 13) - .getStackForm(1L)); - ItemList.Hatch_Input_MAX.set( - new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_MAX.ID, "hatch.input.tier.14", "Input Hatch (MAX)", 14) - .getStackForm(1L)); - } - - private static void registerQuadrupleInputHatch() { - ItemList.Hatch_Input_Multi_2x2_EV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_EV.ID, - 4, - "hatch.multi.input.tier.01", - "Quadruple Input Hatch (EV)", - 4).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_IV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_IV.ID, - 4, - "hatch.multi.input.tier.02", - "Quadruple Input Hatch (IV)", - 5).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_LuV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_LuV.ID, - 4, - "hatch.multi.input.tier.03", - "Quadruple Input Hatch (LuV)", - 6).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_ZPM.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_ZPM.ID, - 4, - "hatch.multi.input.tier.04", - "Quadruple Input Hatch (ZPM)", - 7).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_UV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_UV.ID, - 4, - "hatch.multi.input.tier.05", - "Quadruple Input Hatch (UV)", - 8).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_UHV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_UHV.ID, - 4, - "hatch.multi.input.tier.06", - "Quadruple Input Hatch (UHV)", - 9).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_UEV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_UEV.ID, - 4, - "hatch.multi.input.tier.07", - "Quadruple Input Hatch (UEV)", - 10).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_UIV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_UIV.ID, - 4, - "hatch.multi.input.tier.08", - "Quadruple Input Hatch (UIV)", - 11).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_UMV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_UMV.ID, - 4, - "hatch.multi.input.tier.09", - "Quadruple Input Hatch (UMV)", - 12).getStackForm(1L)); - ItemList.Hatch_Input_Multi_2x2_UXV.set( - new GT_MetaTileEntity_Hatch_MultiInput( - QUADRUPLE_INPUT_HATCHES_UXV.ID, - 4, - "hatch.multi.input.tier.10", - "Quadruple Input Hatch (UXV)", - 13).getStackForm(1L)); - - ItemList.Hatch_Input_Multi_2x2_Humongous.set( - new GT_MetaTileEntity_Hatch_QuadrupleHumongous( - QUADRUPLE_INPUT_HATCHES_MAX.ID, - 4, - "hatch.multi.input.tier.11", - "Humongous Quadruple Input Hatch").getStackForm(1L)); - } - - private static void registerOutputHatch() { - ItemList.Hatch_Output_ULV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_ULV.ID, "hatch.output.tier.00", "Output Hatch (ULV)", 0) - .getStackForm(1L)); - ItemList.Hatch_Output_LV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_LV.ID, "hatch.output.tier.01", "Output Hatch (LV)", 1) - .getStackForm(1L)); - ItemList.Hatch_Output_MV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_MV.ID, "hatch.output.tier.02", "Output Hatch (MV)", 2) - .getStackForm(1L)); - ItemList.Hatch_Output_HV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_HV.ID, "hatch.output.tier.03", "Output Hatch (HV)", 3) - .getStackForm(1L)); - ItemList.Hatch_Output_EV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_EV.ID, "hatch.output.tier.04", "Output Hatch (EV)", 4) - .getStackForm(1L)); - ItemList.Hatch_Output_IV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_IV.ID, "hatch.output.tier.05", "Output Hatch (IV)", 5) - .getStackForm(1L)); - ItemList.Hatch_Output_LuV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_LuV.ID, "hatch.output.tier.06", "Output Hatch (LuV)", 6) - .getStackForm(1L)); - ItemList.Hatch_Output_ZPM.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_ZPM.ID, "hatch.output.tier.07", "Output Hatch (ZPM)", 7) - .getStackForm(1L)); - ItemList.Hatch_Output_UV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UV.ID, "hatch.output.tier.08", "Output Hatch (UV)", 8) - .getStackForm(1L)); - ItemList.Hatch_Output_UHV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UHV.ID, "hatch.output.tier.09", "Output Hatch (UHV)", 9) - .getStackForm(1L)); - ItemList.Hatch_Output_UEV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UEV.ID, "hatch.output.tier.10", "Output Hatch (UEV)", 10) - .getStackForm(1L)); - ItemList.Hatch_Output_UIV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UIV.ID, "hatch.output.tier.11", "Output Hatch (UIV)", 11) - .getStackForm(1L)); - ItemList.Hatch_Output_UMV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UMV.ID, "hatch.output.tier.12", "Output Hatch (UMV)", 12) - .getStackForm(1L)); - ItemList.Hatch_Output_UXV.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UXV.ID, "hatch.output.tier.13", "Output Hatch (UXV)", 13) - .getStackForm(1L)); - ItemList.Hatch_Output_MAX.set( - new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_MAX.ID, "hatch.output.tier.14", "Output Hatch (MAX)", 14) - .getStackForm(1L)); - } - - private static void registerQuantumTank() { - ItemList.Quantum_Tank_LV.set( - new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_LV.ID, "quantum.tank.tier.06", "Quantum Tank I", 6) - .getStackForm(1L)); - ItemList.Quantum_Tank_MV.set( - new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_MV.ID, "quantum.tank.tier.07", "Quantum Tank II", 7) - .getStackForm(1L)); - ItemList.Quantum_Tank_HV.set( - new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_HV.ID, "quantum.tank.tier.08", "Quantum Tank III", 8) - .getStackForm(1L)); - ItemList.Quantum_Tank_EV.set( - new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_EV.ID, "quantum.tank.tier.09", "Quantum Tank IV", 9) - .getStackForm(1L)); - ItemList.Quantum_Tank_IV.set( - new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_IV.ID, "quantum.tank.tier.10", "Quantum Tank V", 10) - .getStackForm(1L)); - } - - private static void registerQuantumChest() { - ItemList.Quantum_Chest_LV.set( - new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_LV.ID, "quantum.chest.tier.06", "Quantum Chest I", 6) - .getStackForm(1L)); - ItemList.Quantum_Chest_MV.set( - new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_MV.ID, "quantum.chest.tier.07", "Quantum Chest II", 7) - .getStackForm(1L)); - ItemList.Quantum_Chest_HV.set( - new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_HV.ID, "quantum.chest.tier.08", "Quantum Chest III", 8) - .getStackForm(1L)); - ItemList.Quantum_Chest_EV.set( - new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_EV.ID, "quantum.chest.tier.09", "Quantum Chest IV", 9) - .getStackForm(1L)); - ItemList.Quantum_Chest_IV.set( - new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_IV.ID, "quantum.chest.tier.10", "Quantum Chest V", 10) - .getStackForm(1L)); - } - - private static void registerSuperTank() { - ItemList.Super_Tank_LV.set( - new GT_MetaTileEntity_SuperTank(SUPER_TANK_LV.ID, "super.tank.tier.01", "Super Tank I", 1) - .getStackForm(1L)); - ItemList.Super_Tank_MV.set( - new GT_MetaTileEntity_SuperTank(SUPER_TANK_MV.ID, "super.tank.tier.02", "Super Tank II", 2) - .getStackForm(1L)); - ItemList.Super_Tank_HV.set( - new GT_MetaTileEntity_SuperTank(SUPER_TANK_HV.ID, "super.tank.tier.03", "Super Tank III", 3) - .getStackForm(1L)); - ItemList.Super_Tank_EV.set( - new GT_MetaTileEntity_SuperTank(SUPER_TANK_EV.ID, "super.tank.tier.04", "Super Tank IV", 4) - .getStackForm(1L)); - ItemList.Super_Tank_IV.set( - new GT_MetaTileEntity_SuperTank(SUPER_TANK_IV.ID, "super.tank.tier.05", "Super Tank V", 5) - .getStackForm(1L)); - } - - private static void registerSuperChest() { - ItemList.Super_Chest_LV.set( - new GT_MetaTileEntity_SuperChest(SUPER_CHEST_LV.ID, "super.chest.tier.01", "Super Chest I", 1) - .getStackForm(1L)); - ItemList.Super_Chest_MV.set( - new GT_MetaTileEntity_SuperChest(SUPER_CHEST_MV.ID, "super.chest.tier.02", "Super Chest II", 2) - .getStackForm(1L)); - ItemList.Super_Chest_HV.set( - new GT_MetaTileEntity_SuperChest(SUPER_CHEST_HV.ID, "super.chest.tier.03", "Super Chest III", 3) - .getStackForm(1L)); - ItemList.Super_Chest_EV.set( - new GT_MetaTileEntity_SuperChest(SUPER_CHEST_EV.ID, "super.chest.tier.04", "Super Chest IV", 4) - .getStackForm(1L)); - ItemList.Super_Chest_IV.set( - new GT_MetaTileEntity_SuperChest(SUPER_CHEST_IV.ID, "super.chest.tier.05", "Super Chest V", 5) - .getStackForm(1L)); - } - - private static void registerLongDistancePipe() { - ItemList.Long_Distance_Pipeline_Fluid.set( - new GT_MetaTileEntity_LongDistancePipelineFluid( - LONG_DISTANCE_PIPELINE_FLUID.ID, - "long.distance.pipeline.fluid", - "Long Distance Fluid Pipeline", - 1).getStackForm(1L)); - ItemList.Long_Distance_Pipeline_Item.set( - new GT_MetaTileEntity_LongDistancePipelineItem( - LONG_DISTANCE_PIPELINE_ITEM.ID, - "long.distance.pipeline.item", - "Long Distance Item Pipeline", - 1).getStackForm(1L)); - } - - private static void registerAE2Hatches() { - ItemList.Hatch_Output_Bus_ME.set( - new GT_MetaTileEntity_Hatch_OutputBus_ME(OUTPUT_BUS_ME.ID, "hatch.output_bus.me", "Output Bus (ME)") - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_ME.set( - new GT_MetaTileEntity_Hatch_InputBus_ME( - INPUT_BUS_ME.ID, - false, - "hatch.input_bus.me.basic", - "Stocking Input Bus (ME)").getStackForm(1L)); - ItemList.Hatch_Input_Bus_ME_Advanced.set( - new GT_MetaTileEntity_Hatch_InputBus_ME( - INPUT_BUS_ME_ADVANCED.ID, - true, - "hatch.input_bus.me", - "Advanced Stocking Input Bus (ME)").getStackForm(1L)); - ItemList.Hatch_Input_ME.set( - new GT_MetaTileEntity_Hatch_Input_ME( - INPUT_HATCH_ME.ID, - false, - "hatch.input.me.basic", - "Stocking Input Hatch (ME)").getStackForm(1L)); - ItemList.Hatch_Input_ME_Advanced.set( - new GT_MetaTileEntity_Hatch_Input_ME( - INPUT_HATCH_ME_ADVANCED.ID, - true, - "hatch.input.me", - "Advanced Stocking Input Hatch (ME)").getStackForm(1L)); - ItemList.Hatch_Output_ME.set( - new GT_MetaTileEntity_Hatch_Output_ME(OUTPUT_HATCH_ME.ID, "hatch.output.me", "Output Hatch (ME)") - .getStackForm(1L)); - ItemList.Hatch_CraftingInput_Bus_ME.set( - new GT_MetaTileEntity_Hatch_CraftingInput_ME( - CRAFTING_INPUT_ME.ID, - "hatch.crafting_input.me", - "Crafting Input Buffer (ME)", - true).getStackForm(1L)); - ItemList.Hatch_CraftingInput_Bus_ME_ItemOnly.set( - new GT_MetaTileEntity_Hatch_CraftingInput_ME( - CRAFTING_INPUT_ME_BUS.ID, - "hatch.crafting_input.me.item_only", - "Crafting Input Bus (ME)", - false).getStackForm(1L)); - ItemList.Hatch_CraftingInput_Bus_Slave.set( - new GT_MetaTileEntity_Hatch_CraftingInput_Slave( - CRAFTING_INPUT_SLAVE.ID, - "hatch.crafting_input.proxy", - "Crafting Input Proxy").getStackForm(1L)); - } - - private static void registerMagHatch() { - ItemList.Hatch_Electromagnet.set( - new GT_MetaTileEntity_MagHatch(MAG_HATCH.ID, "hatch.mag_hatch", "Electromagnet Housing").getStackForm(1L)); - } - - private static void registerInputBus() { - ItemList.Hatch_Input_Bus_ULV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_ULV.ID, "hatch.input_bus.tier.00", "Input Bus (ULV)", 0) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_LV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_LV.ID, "hatch.input_bus.tier.01", "Input Bus (LV)", 1) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_MV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_MV.ID, "hatch.input_bus.tier.02", "Input Bus (MV)", 2) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_HV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_HV.ID, "hatch.input_bus.tier.03", "Input Bus (HV)", 3) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_EV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_EV.ID, "hatch.input_bus.tier.04", "Input Bus (EV)", 4) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_IV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_IV.ID, "hatch.input_bus.tier.05", "Input Bus (IV)", 5) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_LuV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_LuV.ID, "hatch.input_bus.tier.06", "Input Bus (LuV)", 6) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_ZPM.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_ZPM.ID, "hatch.input_bus.tier.07", "Input Bus (ZPM)", 7) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_UV.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_UV.ID, "hatch.input_bus.tier.08", "Input Bus (UV)", 8) - .getStackForm(1L)); - ItemList.Hatch_Input_Bus_MAX.set( - new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_UHV.ID, "hatch.input_bus.tier.09", "Input Bus (UHV)", 9) - .getStackForm(1L)); - } - - private static void registerOutputBus() { - ItemList.Hatch_Output_Bus_ULV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_ULV.ID, "hatch.output_bus.tier.00", "Output Bus (ULV)", 0) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_LV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_LV.ID, "hatch.output_bus.tier.01", "Output Bus (LV)", 1) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_MV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_MV.ID, "hatch.output_bus.tier.02", "Output Bus (MV)", 2) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_HV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_HV.ID, "hatch.output_bus.tier.03", "Output Bus (HV)", 3) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_EV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_EV.ID, "hatch.output_bus.tier.04", "Output Bus (EV)", 4) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_IV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_IV.ID, "hatch.output_bus.tier.05", "Output Bus (IV)", 5) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_LuV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_LuV.ID, "hatch.output_bus.tier.06", "Output Bus (LuV)", 6) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_ZPM.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_ZPM.ID, "hatch.output_bus.tier.07", "Output Bus (ZPM)", 7) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_UV.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_UV.ID, "hatch.output_bus.tier.08", "Output Bus (UV)", 8) - .getStackForm(1L)); - ItemList.Hatch_Output_Bus_MAX.set( - new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_UHV.ID, "hatch.output_bus.tier.09", "Output Bus (UHV)", 9) - .getStackForm(1L)); - } - - private static void registerMufflerHatch() { - ItemList.Hatch_Muffler_LV.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_LV.ID, "hatch.muffler.tier.01", "Muffler Hatch (LV)", 1) - .getStackForm(1L)); - ItemList.Hatch_Muffler_MV.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_MV.ID, "hatch.muffler.tier.02", "Muffler Hatch (MV)", 2) - .getStackForm(1L)); - ItemList.Hatch_Muffler_HV.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_HV.ID, "hatch.muffler.tier.03", "Muffler Hatch (HV)", 3) - .getStackForm(1L)); - ItemList.Hatch_Muffler_EV.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_EV.ID, "hatch.muffler.tier.04", "Muffler Hatch (EV)", 4) - .getStackForm(1L)); - ItemList.Hatch_Muffler_IV.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_IV.ID, "hatch.muffler.tier.05", "Muffler Hatch (IV)", 5) - .getStackForm(1L)); - ItemList.Hatch_Muffler_LuV.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_LuV.ID, "hatch.muffler.tier.06", "Muffler Hatch (LuV)", 6) - .getStackForm(1L)); - ItemList.Hatch_Muffler_ZPM.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_ZPM.ID, "hatch.muffler.tier.07", "Muffler Hatch (ZPM)", 7) - .getStackForm(1L)); - ItemList.Hatch_Muffler_UV.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_UV.ID, "hatch.muffler.tier.08", "Muffler Hatch (UV)", 8) - .getStackForm(1L)); - ItemList.Hatch_Muffler_MAX.set( - new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_UHV.ID, "hatch.muffler.tier.09", "Muffler Hatch (UHV)", 9) - .getStackForm(1L)); - } - - private static void registerBoiler() { - ItemList.Machine_Bronze_Boiler.set( - new GT_MetaTileEntity_Boiler_Bronze(SMALL_COAL_BOILER.ID, "boiler.bronze", "Small Coal Boiler") - .getStackForm(1L)); - ItemList.Machine_Steel_Boiler.set( - new GT_MetaTileEntity_Boiler_Steel( - HIGH_PRESSURE_COAL_BOILER.ID, - "boiler.steel", - "High Pressure Coal Boiler").getStackForm(1L)); - ItemList.Machine_Steel_Boiler_Lava.set( - new GT_MetaTileEntity_Boiler_Lava(HIGH_PRESSURE_LAVA_BOILER.ID, "boiler.lava", "High Pressure Lava Boiler") - .getStackForm(1L)); - ItemList.Machine_Bronze_Boiler_Solar.set( - new GT_MetaTileEntity_Boiler_Solar(SIMPLE_SOLAR_BOILER.ID, "boiler.solar", "Simple Solar Boiler") - .getStackForm(1L)); - ItemList.Machine_HP_Solar.set( - new GT_MetaTileEntity_Boiler_Solar_Steel( - HIGH_PRESSURE_SOLAR_BOILER.ID, - "boiler.steel.solar", - "High Pressure Solar Boiler").getStackForm(1L)); - } - - private static void registerBatteryBuffer1x1() { - ItemList.Battery_Buffer_1by1_ULV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_ULV.ID, - "batterybuffer.01.tier.00", - "Ultra Low Voltage Battery Buffer", - 0, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_LV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_LV.ID, - "batterybuffer.01.tier.01", - "Low Voltage Battery Buffer", - 1, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_MV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_MV.ID, - "batterybuffer.01.tier.02", - "Medium Voltage Battery Buffer", - 2, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_HV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_HV.ID, - "batterybuffer.01.tier.03", - "High Voltage Battery Buffer", - 3, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_EV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_EV.ID, - "batterybuffer.01.tier.04", - "Extreme Voltage Battery Buffer", - 4, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_IV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_IV.ID, - "batterybuffer.01.tier.05", - "Insane Voltage Battery Buffer", - 5, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_LuV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_LuV.ID, - "batterybuffer.01.tier.06", - "Ludicrous Voltage Battery Buffer", - 6, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_ZPM.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_ZPM.ID, - "batterybuffer.01.tier.07", - "ZPM Voltage Battery Buffer", - 7, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_UV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_UV.ID, - "batterybuffer.01.tier.08", - "Ultimate Voltage Battery Buffer", - 8, - "", - 1).getStackForm(1L)); - ItemList.Battery_Buffer_1by1_UHV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_UHV.ID, - "batterybuffer.01.tier.09", - "Highly Ultimate Voltage Battery Buffer", - 9, - "", - 1).getStackForm(1L)); - - ItemList.Battery_Buffer_1by1_UEV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_UEV.ID, - "batterybuffer.01.tier.10", - "Extremely Ultimate Battery Buffer", - 10, - "", - 1).getStackForm(1L)); - - ItemList.Battery_Buffer_1by1_UIV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_UIV.ID, - "batterybuffer.01.tier.11", - "Insanely Ultimate Battery Buffer", - 11, - "", - 1).getStackForm(1L)); - - ItemList.Battery_Buffer_1by1_UMV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_UMV.ID, - "batterybuffer.01.tier.12", - "Mega Ultimate Battery Buffer", - 12, - "", - 1).getStackForm(1L)); - - ItemList.Battery_Buffer_1by1_UXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_UXV.ID, - "batterybuffer.01.tier.13", - "Extended Mega Ultimate Battery Buffer", - 13, - "", - 1).getStackForm(1L)); - - ItemList.Battery_Buffer_1by1_MAXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_1_BY_1_MAX.ID, - "batterybuffer.01.tier.14", - "Maximum Battery Buffer", - 14, - "", - 1).getStackForm(1L)); - } - - private static void registerBatteryBuffer2x2() { - ItemList.Battery_Buffer_2by2_ULV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_ULV.ID, - "batterybuffer.04.tier.00", - "Ultra Low Voltage Battery Buffer", - 0, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_LV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_LV.ID, - "batterybuffer.04.tier.01", - "Low Voltage Battery Buffer", - 1, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_MV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_MV.ID, - "batterybuffer.04.tier.02", - "Medium Voltage Battery Buffer", - 2, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_HV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_HV.ID, - "batterybuffer.04.tier.03", - "High Voltage Battery Buffer", - 3, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_EV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_EV.ID, - "batterybuffer.04.tier.04", - "Extreme Voltage Battery Buffer", - 4, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_IV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_IV.ID, - "batterybuffer.04.tier.05", - "Insane Voltage Battery Buffer", - 5, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_LuV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_LuV.ID, - "batterybuffer.04.tier.06", - "Ludicrous Voltage Battery Buffer", - 6, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_ZPM.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_ZPM.ID, - "batterybuffer.04.tier.07", - "ZPM Voltage Battery Buffer", - 7, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_UV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_UV.ID, - "batterybuffer.04.tier.08", - "Ultimate Voltage Battery Buffer", - 8, - "", - 4).getStackForm(1L)); - ItemList.Battery_Buffer_2by2_UHV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_UHV.ID, - "batterybuffer.04.tier.09", - "Highly Ultimate Voltage Battery Buffer", - 9, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Buffer_2by2_UEV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_UEV.ID, - "batterybuffer.04.tier.10", - "Extremely Ultimate Battery Buffer", - 10, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Buffer_2by2_UIV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_UIV.ID, - "batterybuffer.04.tier.11", - "Insanely Ultimate Battery Buffer", - 11, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Buffer_2by2_UMV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_UMV.ID, - "batterybuffer.04.tier.12", - "Mega Ultimate Battery Buffer", - 12, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Buffer_2by2_UXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_UXV.ID, - "batterybuffer.04.tier.13", - "Extended Mega Ultimate Battery Buffer", - 13, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Buffer_2by2_MAXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_2_BY_2_MAX.ID, - "batterybuffer.04.tier.14", - "Maximum Battery Buffer", - 14, - "", - 4).getStackForm(1L)); - } - - private static void registerBatteryBuffer3x3() { - ItemList.Battery_Buffer_3by3_ULV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_ULV.ID, - "batterybuffer.09.tier.00", - "Ultra Low Voltage Battery Buffer", - 0, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_LV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_LV.ID, - "batterybuffer.09.tier.01", - "Low Voltage Battery Buffer", - 1, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_MV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_MV.ID, - "batterybuffer.09.tier.02", - "Medium Voltage Battery Buffer", - 2, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_HV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_HV.ID, - "batterybuffer.09.tier.03", - "High Voltage Battery Buffer", - 3, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_EV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_EV.ID, - "batterybuffer.09.tier.04", - "Extreme Voltage Battery Buffer", - 4, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_IV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_IV.ID, - "batterybuffer.09.tier.05", - "Insane Voltage Battery Buffer", - 5, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_LuV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_LuV.ID, - "batterybuffer.09.tier.06", - "Ludicrous Voltage Battery Buffer", - 6, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_ZPM.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_ZPM.ID, - "batterybuffer.09.tier.07", - "ZPM Voltage Battery Buffer", - 7, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_UV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_UV.ID, - "batterybuffer.09.tier.08", - "Ultimate Voltage Battery Buffer", - 8, - "", - 9).getStackForm(1L)); - ItemList.Battery_Buffer_3by3_UHV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_UHV.ID, - "batterybuffer.09.tier.09", - "Highly Ultimate Voltage Battery Buffer", - 9, - "", - 9).getStackForm(1L)); - - ItemList.Battery_Buffer_3by3_UEV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_UEV.ID, - "batterybuffer.09.tier.10", - "Extremely Ultimate Battery Buffer", - 10, - "", - 9).getStackForm(1L)); - - ItemList.Battery_Buffer_3by3_UIV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_UIV.ID, - "batterybuffer.09.tier.11", - "Insanely Ultimate Battery Buffer", - 11, - "", - 9).getStackForm(1L)); - - ItemList.Battery_Buffer_3by3_UMV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_UMV.ID, - "batterybuffer.09.tier.12", - "Mega Ultimate Battery Buffer", - 12, - "", - 9).getStackForm(1L)); - - ItemList.Battery_Buffer_3by3_UXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_UXV.ID, - "batterybuffer.09.tier.13", - "Extended Mega Ultimate Battery Buffer", - 13, - "", - 9).getStackForm(1L)); - - ItemList.Battery_Buffer_3by3_MAXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_3_BY_3_MAX.ID, - "batterybuffer.09.tier.14", - "Maximum Battery Buffer", - 14, - "", - 9).getStackForm(1L)); - } - - private static void registerBatteryBuffer4x4() { - ItemList.Battery_Buffer_4by4_ULV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_ULV.ID, - "batterybuffer.16.tier.00", - "Ultra Low Voltage Battery Buffer", - 0, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_LV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_LV.ID, - "batterybuffer.16.tier.01", - "Low Voltage Battery Buffer", - 1, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_MV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_MV.ID, - "batterybuffer.16.tier.02", - "Medium Voltage Battery Buffer", - 2, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_HV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_HV.ID, - "batterybuffer.16.tier.03", - "High Voltage Battery Buffer", - 3, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_EV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_EV.ID, - "batterybuffer.16.tier.04", - "Extreme Voltage Battery Buffer", - 4, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_IV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_IV.ID, - "batterybuffer.16.tier.05", - "Insane Voltage Battery Buffer", - 5, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_LuV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_LuV.ID, - "batterybuffer.16.tier.06", - "Ludicrous Voltage Battery Buffer", - 6, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_ZPM.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_ZPM.ID, - "batterybuffer.16.tier.07", - "ZPM Voltage Battery Buffer", - 7, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_UV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_UV.ID, - "batterybuffer.16.tier.08", - "Ultimate Voltage Battery Buffer", - 8, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_UHV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_UHV.ID, - "batterybuffer.16.tier.09", - "Highly Ultimate Voltage Battery Buffer", - 9, - "", - 16).getStackForm(1L)); - ItemList.Battery_Buffer_4by4_UEV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_UEV.ID, - "batterybuffer.16.tier.10", - "Extremely Ultimate Battery Buffer", - 10, - "", - 16).getStackForm(1L)); - - ItemList.Battery_Buffer_4by4_UIV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_UIV.ID, - "batterybuffer.16.tier.11", - "Insanely Ultimate Battery Buffer", - 11, - "", - 16).getStackForm(1L)); - - ItemList.Battery_Buffer_4by4_UMV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_UMV.ID, - "batterybuffer.16.tier.12", - "Mega Ultimate Battery Buffer", - 12, - "", - 16).getStackForm(1L)); - - ItemList.Battery_Buffer_4by4_UXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_UXV.ID, - "batterybuffer.16.tier.13", - "Extended Mega Ultimate Battery Buffer", - 13, - "", - 16).getStackForm(1L)); - - ItemList.Battery_Buffer_4by4_MAXV.set( - new GT_MetaTileEntity_BasicBatteryBuffer( - BATTERY_BUFFER_4_BY_4_MAX.ID, - "batterybuffer.16.tier.14", - "Maximum Battery Buffer", - 14, - "", - 16).getStackForm(1L)); - } - - private static void registerCharger4x4() { - ItemList.Battery_Charger_4by4_ULV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_ULV.ID, - "batterycharger.16.tier.00", - "Ultra Low Voltage Battery Charger", - 0, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_LV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_LV.ID, - "batterycharger.16.tier.01", - "Low Voltage Battery Charger", - 1, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_MV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_MV.ID, - "batterycharger.16.tier.02", - "Medium Voltage Battery Charger", - 2, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_HV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_HV.ID, - "batterycharger.16.tier.03", - "High Voltage Battery Charger", - 3, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_EV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_EV.ID, - "batterycharger.16.tier.04", - "Extreme Voltage Battery Charger", - 4, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_IV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_IV.ID, - "batterycharger.16.tier.05", - "Insane Voltage Battery Charger", - 5, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_LuV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_LuV.ID, - "batterycharger.16.tier.06", - "Ludicrous Voltage Battery Charger", - 6, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_ZPM.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_ZPM.ID, - "batterycharger.16.tier.07", - "ZPM Voltage Battery Charger", - 7, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_UV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_UV.ID, - "batterycharger.16.tier.08", - "Ultimate Voltage Battery Charger", - 8, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - ItemList.Battery_Charger_4by4_UHV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_BY_4_UHV.ID, - "batterycharger.16.tier.09", - "Highly Ultimate Voltage Battery Charger", - 9, - "Each battery gives 8A in/4A out (min 4A/2A)", - 4).getStackForm(1L)); - - ItemList.Battery_Charger_4by4_UEV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_4_UEV.ID, - "batterycharger.16.tier.10", - "Extremely Ultimate Battery Charger", - 10, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Charger_4by4_UIV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_4_UIV.ID, - "batterycharger.16.tier.11", - "Insanely Ultimate Battery Charger", - 11, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Charger_4by4_UMV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_4_UMV.ID, - "batterycharger.16.tier.12", - "Mega Ultimate Battery Charger", - 12, - "", - 4).getStackForm(1L)); - - ItemList.Battery_Charger_4by4_UXV.set( - new GT_MetaTileEntity_Charger( - BATTERY_CHARGER_4_4_UXV.ID, - "batterycharger.16.tier.13", - "Extended Mega Ultimate Battery Charger", - 13, - "", - 4).getStackForm(1L)); - } - - private void registerCircuitAssembler() { - ItemList.Machine_LV_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_LV.ID, - "basicmachine.circuitassembler.tier.01", - "Basic Circuit Assembler", - 1, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_MV_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_MV.ID, - "basicmachine.circuitassembler.tier.02", - "Advanced Circuit Assembler", - 2, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_HV_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_HV.ID, - "basicmachine.circuitassembler.tier.03", - "Advanced Circuit Assembler II", - 3, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_EV_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_EV.ID, - "basicmachine.circuitassembler.tier.04", - "Advanced Circuit Assembler III", - 4, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_IV_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_IV.ID, - "basicmachine.circuitassembler.tier.05", - "Advanced Circuit Assembler IV", - 5, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_LuV_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_LuV.ID, - "basicmachine.circuitassembler.tier.06", - "Advanced Circuit Assembler V", - 6, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_ZPM_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_ZPM.ID, - "basicmachine.circuitassembler.tier.07", - "Advanced Circuit Assembler VI", - 7, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.Machine_UV_CircuitAssembler.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_UV.ID, - "basicmachine.circuitassembler.tier.08", - "Advanced Circuit Assembler VII", - 8, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - RecipeMaps.circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.CircuitAssemblerUHV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_UHV.ID, - "basicmachine.circuitassembler.tier.09", - "Ultimate Circuit Assembling Machine", - 9, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.CircuitAssemblerUEV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_UEV.ID, - "basicmachine.circuitassembler.tier.10", - "Ultimate Circuit Assembling Machine II", - 10, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.CircuitAssemblerUIV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_UIV.ID, - "basicmachine.circuitassembler.tier.11", - "Ultimate Circuit Assembling Machine III", - 11, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.CircuitAssemblerUMV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_UMV.ID, - "basicmachine.circuitassembler.tier.12", - "Ultimate Circuit Assembling Machine IV", - 12, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.CircuitAssemblerUXV.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_UXV.ID, - "basicmachine.circuitassembler.tier.13", - "Ultimate Circuit Assembling Machine V", - 13, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - - ItemList.CircuitAssemblerMAX.set( - new GT_MetaTileEntity_BasicMachine_GT_Recipe( - CIRCUIT_ASSEMBLER_MAX.ID, - "basicmachine.circuitassembler.tier.14", - "MAX Circuit Assembling Machine", - 14, - MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), - circuitAssemblerRecipes, - 6, - 1, - true, - SoundResource.NONE, - GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.NONE, - "CIRCUITASSEMBLER", - null).getStackForm(1L)); - } - - private void registerWetTransformer() { - ItemList.WetTransformer_LV_ULV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_LV_ULV.ID, - "wettransformer.tier.00", - "Ultra Low Voltage Power Transformer", - 0, - "LV -> ULV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_MV_LV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_MV_LV.ID, - "wetransformer.tier.01", - "Low Voltage Power Transformer", - 1, - "MV -> LV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_HV_MV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_HV_MV.ID, - "wettransformer.tier.02", - "Medium Voltage Power Transformer", - 2, - "HV -> MV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_EV_HV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_EV_HV.ID, - "wettransformer.tier.03", - "High Voltage Power Transformer", - 3, - "EV -> HV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_IV_EV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_IV_EV.ID, - "wettransformer.tier.04", - "Extreme Power Transformer", - 4, - "IV -> EV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_LuV_IV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_LuV_IV.ID, - "wettransformer.tier.05", - "Insane Power Transformer", - 5, - "LuV -> IV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_ZPM_LuV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_ZPM_LuV.ID, - "wettransformer.tier.06", - "Ludicrous Power Transformer", - 6, - "ZPM -> LuV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_UV_ZPM.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_UV_ZPM.ID, - "wettransformer.tier.07", - "ZPM Voltage Power Transformer", - 7, - "UV -> ZPM (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_UHV_UV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_UHV_UV.ID, - "wettransformer.tier.08", - "Ultimate Power Transformer", - 8, - "UHV -> UV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_UEV_UHV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_UEV_UHV.ID, - "wettransformer.tier.09", - "Highly Ultimate Power Transformer", - 9, - "UEV -> UHV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_UIV_UEV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_UIV_UEV.ID, - "wettransformer.tier.10", - "Extremely Ultimate Power Transformer", - 10, - "UIV -> UEV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_UMV_UIV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_UMV_UIV.ID, - "wettransformer.tier.11", - "Insanely Ultimate Power Transformer", - 11, - "UMV -> UIV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_UXV_UMV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_UXV_UMV.ID, - "wettransformer.tier.12", - "Mega Ultimate Power Transformer", - 12, - "UXV -> UMV (Use Soft Mallet to invert)").getStackForm(1L)); - - ItemList.WetTransformer_MAX_UXV.set( - new GT_MetaTileEntity_WetTransformer( - WET_TRANSFORMER_MAX_UXV.ID, - "wettransformer.tier.13", - "Extended Mega Ultimate Power Transformer", - 13, - "MAX -> UXV (Use Soft Mallet to invert)").getStackForm(1L)); - } - - private void registerHighAmpTransformer() { - ItemList.Transformer_HA_UEV_UHV.set( - new GregtechMetaTransformerHiAmp( - HIGH_AMP_TRANSFORMER_UEV_UHV.ID, - "transformer.ha.tier.09", - "Highly Ultimate Hi-Amp Transformer", - 9, - "UEV -> UHV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_HA_UIV_UEV.set( - new GregtechMetaTransformerHiAmp( - HIGH_AMP_TRANSFORMER_UIV_UEV.ID, - "transformer.ha.tier.10", - "Extremely Ultimate Hi-Amp Transformer", - 10, - "UIV -> UEV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_HA_UMV_UIV.set( - new GregtechMetaTransformerHiAmp( - HIGH_AMP_TRANSFORMER_UMV_UIV.ID, - "transformer.ha.tier.11", - "Insanely Ultimate Hi-Amp Transformer", - 11, - "UMV -> UIV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_HA_UXV_UMV.set( - new GregtechMetaTransformerHiAmp( - HIGH_AMP_TRANSFORMER_UXV_UMV.ID, - "transformer.ha.tier.12", - "Mega Ultimate Hi-Amp Transformer", - 12, - "UXV -> UMV (Use Soft Mallet to invert)").getStackForm(1L)); - ItemList.Transformer_HA_MAX_UXV.set( - new GregtechMetaTransformerHiAmp( - HIGH_AMP_TRANSFORMER_MAX_UXV.ID, - "transformer.ha.tier.13", - "Extended Mega Ultimate Hi-Amp Transformer", - 13, - "MAX -> UXV (Use Soft Mallet to invert)").getStackForm(1L)); - - } - - private void registerTurboCharger4By4() { - ItemList.Battery_TurboCharger_4by4_ULV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_ULV.ID, - "batteryturbocharger.16.tier.00", - "Ultra Low Voltage Turbo Charger", - 0, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_LV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_LV.ID, - "batteryturbocharger.16.tier.01", - "Low Voltage Turbo Charger", - 1, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_MV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_MV.ID, - "batteryturbocharger.16.tier.02", - "Medium Voltage Turbo Charger", - 2, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_HV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_HV.ID, - "batteryturbocharger.16.tier.03", - "High Voltage Turbo Charger", - 3, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_EV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_EV.ID, - "batteryturbocharger.16.tier.04", - "Extreme Voltage Turbo Charger", - 4, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_IV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_IV.ID, - "batteryturbocharger.16.tier.05", - "Insane Voltage Turbo Charger", - 5, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_LuV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_LuV.ID, - "batteryturbocharger.16.tier.06", - "Ludicrous Voltage Turbo Charger", - 6, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_ZPM.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_ZPM.ID, - "batteryturbocharger.16.tier.07", - "ZPM Voltage Turbo Charger", - 7, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_UV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_UV.ID, - "batteryturbocharger.16.tier.08", - "Ultimate Voltage Turbo Charger", - 8, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - ItemList.Battery_TurboCharger_4by4_UHV.set( - new GT_MetaTileEntity_TurboCharger( - TURBO_CHARGER_UHV.ID, - "batteryturbocharger.16.tier.09", - "Highly Ultimate Voltage Turbo Charger", - 9, - "64A in /16A out, 120A/item, Disable to force Charge", - 4).getStackForm(1L)); - - } - - private static void registerWirelessEnergyHatch() { - ItemList.Wireless_Hatch_Energy_ULV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_ULV.ID, - "hatch.wireless.receiver.tier.00", - "ULV Wireless Energy Hatch", - 0).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_LV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_LV.ID, - "hatch.wireless.receiver.tier.01", - "LV Wireless Energy Hatch", - 1).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_MV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_MV.ID, - "hatch.wireless.receiver.tier.02", - "MV Wireless Energy Hatch", - 2).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_HV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_HV.ID, - "hatch.wireless.receiver.tier.03", - "HV Wireless Energy Hatch", - 3).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_EV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_EV.ID, - "hatch.wireless.receiver.tier.04", - "EV Wireless Energy Hatch", - 4).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_IV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_IV.ID, - "hatch.wireless.receiver.tier.05", - "IV Wireless Energy Hatch", - 5).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_LuV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_LuV.ID, - "hatch.wireless.receiver.tier.06", - "LuV Wireless Energy Hatch", - 6).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_ZPM.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_ZPM.ID, - "hatch.wireless.receiver.tier.07", - "ZPM Wireless Energy Hatch", - 7).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_UV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_UV.ID, - "hatch.wireless.receiver.tier.08", - "UV Wireless Energy Hatch", - 8).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_UHV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_UHV.ID, - "hatch.wireless.receiver.tier.09", - "UHV Wireless Energy Hatch", - 9).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_UEV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_UEV.ID, - "hatch.wireless.receiver.tier.10", - "UEV Wireless Energy Hatch", - 10).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_UIV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_UIV.ID, - "hatch.wireless.receiver.tier.11", - "UIV Wireless Energy Hatch", - 11).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_UMV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_UMV.ID, - "hatch.wireless.receiver.tier.12", - "UMV Wireless Energy Hatch", - 12).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_UXV.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_UXV.ID, - "hatch.wireless.receiver.tier.13", - "UXV Wireless Energy Hatch", - 13).getStackForm(1L)); - ItemList.Wireless_Hatch_Energy_MAX.set( - new GT_MetaTileEntity_Wireless_Hatch( - WIRELESS_HATCH_ENERGY_MAX.ID, - "hatch.wireless.receiver.tier.14", - "MAX Wireless Energy Hatch", - 14).getStackForm(1L)); - } - - private static void registerWirelessDynamoHatch() { - ItemList.Wireless_Dynamo_Energy_ULV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_ULV.ID, - "hatch.wireless.transmitter.tier.00", - "ULV Wireless Energy Dynamo", - 0).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_LV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_LV.ID, - "hatch.wireless.transmitter.tier.01", - "LV Wireless Energy Dynamo", - 1).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_MV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_MV.ID, - "hatch.wireless.transmitter.tier.02", - "MV Wireless Energy Dynamo", - 2).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_HV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_HV.ID, - "hatch.wireless.transmitter.tier.03", - "HV Wireless Energy Dynamo", - 3).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_EV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_EV.ID, - "hatch.wireless.transmitter.tier.04", - "EV Wireless Energy Dynamo", - 4).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_IV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_IV.ID, - "hatch.wireless.transmitter.tier.05", - "IV Wireless Energy Dynamo", - 5).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_LuV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_LuV.ID, - "hatch.wireless.transmitter.tier.06", - "LuV Wireless Energy Dynamo", - 6).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_ZPM.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_ZPM.ID, - "hatch.wireless.transmitter.tier.07", - "ZPM Wireless Energy Dynamo", - 7).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_UV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_UV.ID, - "hatch.wireless.transmitter.tier.08", - "UV Wireless Energy Dynamo", - 8).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_UHV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_UHV.ID, - "hatch.wireless.transmitter.tier.09", - "UHV Wireless Energy Dynamo", - 9).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_UEV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_UEV.ID, - "hatch.wireless.transmitter.tier.10", - "UEV Wireless Energy Dynamo", - 10).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_UIV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_UIV.ID, - "hatch.wireless.transmitter.tier.11", - "UIV Wireless Energy Dynamo", - 11).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_UMV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_UMV.ID, - "hatch.wireless.transmitter.tier.12", - "UMV Wireless Energy Dynamo", - 12).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_UXV.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_UXV.ID, - "hatch.wireless.transmitter.tier.13", - "UXV Wireless Energy Dynamo", - 13).getStackForm(1L)); - ItemList.Wireless_Dynamo_Energy_MAX.set( - new GT_MetaTileEntity_Wireless_Dynamo( - WIRELESS_DYNAMO_ENERGY_HATCH_MAX.ID, - "hatch.wireless.transmitter.tier.14", - "MAX Wireless Energy Dynamo", - 14).getStackForm(1L)); - } - - private static void registerLightningRods() { - ItemList.Machine_HV_LightningRod.set( - new GT_MetaTileEntity_LightningRod( - LIGHTNING_ROD_HV.ID, - "basicgenerator.lightningrod.03", - "Lightning Rod", - 3).getStackForm(1)); - ItemList.Machine_EV_LightningRod.set( - new GT_MetaTileEntity_LightningRod( - LIGHTNING_ROD_EV.ID, - "basicgenerator.lightningrod.04", - "Lightning Rod II", - 4).getStackForm(1)); - ItemList.Machine_IV_LightningRod.set( - new GT_MetaTileEntity_LightningRod( - LIGHTNING_ROD_IV.ID, - "basicgenerator.lightningrod.05", - "Lightning Rod III", - 5).getStackForm(1)); - } - - private static void registerCombustionGenerators() { - ItemList.Generator_Diesel_LV.set( - new GT_MetaTileEntity_DieselGenerator( - COMBUSTION_GENERATOR_LV.ID, - "basicgenerator.diesel.tier.01", - "Basic Combustion Generator", - 1).getStackForm(1L)); - ItemList.Generator_Diesel_MV.set( - new GT_MetaTileEntity_DieselGenerator( - COMBUSTION_GENERATOR_MV.ID, - "basicgenerator.diesel.tier.02", - "Advanced Combustion Generator", - 2).getStackForm(1L)); - ItemList.Generator_Diesel_HV.set( - new GT_MetaTileEntity_DieselGenerator( - COMBUSTION_GENERATOR_HV.ID, - "basicgenerator.diesel.tier.03", - "Turbo Combustion Generator", - 3).getStackForm(1L)); - } - - private static void registerGasTurbines() { - ItemList.Generator_Gas_Turbine_LV.set( - new GT_MetaTileEntity_GasTurbine( - GAS_TURBINE_LV.ID, - "basicgenerator.gasturbine.tier.01", - "Basic Gas Turbine", - 1, - 95).getStackForm(1L)); - ItemList.Generator_Gas_Turbine_MV.set( - new GT_MetaTileEntity_GasTurbine( - GAS_TURBINE_MV.ID, - "basicgenerator.gasturbine.tier.02", - "Advanced Gas Turbine", - 2, - 90).getStackForm(1L)); - ItemList.Generator_Gas_Turbine_HV.set( - new GT_MetaTileEntity_GasTurbine( - GAS_TURBINE_HV.ID, - "basicgenerator.gasturbine.tier.03", - "Turbo Gas Turbine", - 3, - 85).getStackForm(1L)); - ItemList.Generator_Gas_Turbine_EV.set( - new GT_MetaTileEntity_GasTurbine( - GAS_TURBINE_EV.ID, - "basicgenerator.gasturbine.tier.04", - "Turbo Gas Turbine II", - 4, - 60).getStackForm(1L)); - ItemList.Generator_Gas_Turbine_IV.set( - new GT_MetaTileEntity_GasTurbine( - GAS_TURBINE_IV.ID, - "basicgenerator.gasturbine.tier.05", - "Turbo Gas Turbine III", - 5, - 50).getStackForm(1L)); - } - - private static void registerSteamTurbines() { - ItemList.Generator_Steam_Turbine_LV.set( - new GT_MetaTileEntity_SteamTurbine( - STEAM_TURBINE_LV.ID, - "basicgenerator.steamturbine.tier.01", - "Basic Steam Turbine", - 1).getStackForm(1L)); - ItemList.Generator_Steam_Turbine_MV.set( - new GT_MetaTileEntity_SteamTurbine( - STEAM_TURBINE_MV.ID, - "basicgenerator.steamturbine.tier.02", - "Advanced Steam Turbine", - 2).getStackForm(1L)); - ItemList.Generator_Steam_Turbine_HV.set( - new GT_MetaTileEntity_SteamTurbine( - STEAM_TURBINE_HV.ID, - "basicgenerator.steamturbine.tier.03", - "Turbo Steam Turbine", - 3).getStackForm(1L)); - } - - private static void registerNaquadahReactors() { - ItemList.Generator_Naquadah_Mark_I.set( - new GT_MetaTileEntity_NaquadahReactor( - NAQUADAH_REACTOR_EV.ID, - "basicgenerator.naquadah.tier.04", - new String[] { "Requires Enriched Naquadah Bolts" }, - "Naquadah Reactor Mark I", - 4).getStackForm(1L)); - ItemList.Generator_Naquadah_Mark_II.set( - new GT_MetaTileEntity_NaquadahReactor( - NAQUADAH_REACTOR_IV.ID, - "basicgenerator.naquadah.tier.05", - new String[] { "Requires Enriched Naquadah Rods" }, - "Naquadah Reactor Mark II", - 5).getStackForm(1L)); - ItemList.Generator_Naquadah_Mark_III.set( - new GT_MetaTileEntity_NaquadahReactor( - NAQUADAH_REACTOR_LuV.ID, - "basicgenerator.naquadah.tier.06", - new String[] { "Requires Enriched Naquadah Long Rods" }, - "Naquadah Reactor Mark III", - 6).getStackForm(1L)); - ItemList.Generator_Naquadah_Mark_IV.set( - new GT_MetaTileEntity_NaquadahReactor( - NAQUADAH_REACTOR_ZPM.ID, - "basicgenerator.naquadah.tier.07", - new String[] { "Requires Naquadria Bolts" }, - "Naquadah Reactor Mark IV", - 7).getStackForm(1L)); - ItemList.Generator_Naquadah_Mark_V.set( - new GT_MetaTileEntity_NaquadahReactor( - NAQUADAH_REACTOR_UV.ID, - "basicgenerator.naquadah.tier.08", - new String[] { "Requires Naquadria Rods" }, - "Naquadah Reactor Mark V", - 8).getStackForm(1L)); - } - - private static void registerMagicEnergyConverters() { - ItemList.MagicEnergyConverter_LV.set( - new GT_MetaTileEntity_MagicEnergyConverter( - MAGIC_ENERGY_CONVERTER_LV.ID, - "basicgenerator.magicenergyconverter.tier.01", - "Novice Magic Energy Converter", - 1).getStackForm(1L)); - ItemList.MagicEnergyConverter_MV.set( - new GT_MetaTileEntity_MagicEnergyConverter( - MAGIC_ENERGY_CONVERTER_MV.ID, - "basicgenerator.magicenergyconverter.tier.02", - "Adept Magic Energy Converter", - 2).getStackForm(1L)); - ItemList.MagicEnergyConverter_HV.set( - new GT_MetaTileEntity_MagicEnergyConverter( - MAGIC_ENERGY_CONVERTER_HV.ID, - "basicgenerator.magicenergyconverter.tier.03", - "Master Magic Energy Converter", - 3).getStackForm(1L)); - } - - private static void registerMagicEnergyAbsorbers() { - ItemList.MagicEnergyAbsorber_LV.set( - new GT_MetaTileEntity_MagicalEnergyAbsorber( - MAGIC_ENERGY_ABSORBER_LV.ID, - "basicgenerator.magicenergyabsorber.tier.01", - "Novice Magic Energy Absorber", - 1).getStackForm(1L)); - ItemList.MagicEnergyAbsorber_MV.set( - new GT_MetaTileEntity_MagicalEnergyAbsorber( - MAGIC_ENERGY_ABSORBER_MV.ID, - "basicgenerator.magicenergyabsorber.tier.02", - "Adept Magic Energy Absorber", - 2).getStackForm(1L)); - ItemList.MagicEnergyAbsorber_HV.set( - new GT_MetaTileEntity_MagicalEnergyAbsorber( - MAGIC_ENERGY_ABSORBER_HV.ID, - "basicgenerator.magicenergyabsorber.tier.03", - "Master Magic Energy Absorber", - 3).getStackForm(1L)); - ItemList.MagicEnergyAbsorber_EV.set( - new GT_MetaTileEntity_MagicalEnergyAbsorber( - MAGIC_ENERGY_ABSORBER_EV.ID, - "basicgenerator.magicenergyabsorber.tier.04", - "Grandmaster Magic Energy Absorber", - 4).getStackForm(1L)); - } - - private static void registerPlasmaGenerators() { - ItemList.Generator_Plasma_EV.set( - new GT_MetaTileEntity_PlasmaGenerator( - PLASMA_GENERATOR_EV.ID, - "basicgenerator.plasmagenerator.tier.05", - "Plasma Generator Mark I", - 4).getStackForm(1L)); - ItemList.Generator_Plasma_IV.set( - new GT_MetaTileEntity_PlasmaGenerator( - PLASMA_GENERATOR_IV.ID, - "basicgenerator.plasmagenerator.tier.06", - "Plasma Generator Mark II", - 5).getStackForm(1L)); - ItemList.Generator_Plasma_LuV.set( - new GT_MetaTileEntity_PlasmaGenerator( - PLASMA_GENERATOR_LuV.ID, - "basicgenerator.plasmagenerator.tier.07", - "Plasma Generator Mark III", - 6).getStackForm(1L)); - - ItemList.Generator_Plasma_ZPMV.set( - new GT_MetaTileEntity_PlasmaGenerator( - PLASMA_GENERATOR_ZPM.ID, - "basicgenerator.plasmagenerator.tier.08", - "Plasma Generator Mark IV", - 7).getStackForm(1L)); - - ItemList.Generator_Plasma_UV.set( - new GT_MetaTileEntity_PlasmaGenerator( - PLASMA_GENERATOR_UV.ID, - "basicgenerator.plasmagenerator.tier.09", - "Ultimate Pocket Sun", - 8).getStackForm(1L)); - } - - private static void generateWiresAndPipes() { - for (int meta = 0; meta < GregTech_API.sGeneratedMaterials.length; meta++) { - Materials material = GregTech_API.sGeneratedMaterials[meta]; - // This check is separated out because IntelliJ thinks Materials.Wood can be null. - if (material == null) continue; - if ((material.mTypes & 0x2) != 0 || material == Materials.Wood) { - new GT_MetaPipeEntity_Frame( - 4096 + meta, - "GT_Frame_" + material, - (GT_LanguageManager.i18nPlaceholder ? "%material" : material.mDefaultLocalName) - + " Frame Box (TileEntity)", - material); - - // Generate recipes for frame box - GT_Block_FrameBox block = (GT_Block_FrameBox) GregTech_API.sBlockFrames; - GT_OreDictUnificator.registerOre(OrePrefixes.frameGt, material, block.getStackForm(1, meta)); - if (material.getProcessingMaterialTierEU() < TierEU.IV) { - GT_ModHandler.addCraftingRecipe( - block.getStackForm(2, meta), - GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED, - new Object[] { "SSS", "SwS", "SSS", 'S', OrePrefixes.stick.get(material) }); - } - - if (!material.contains(SubTag.NO_RECIPES) - && GT_OreDictUnificator.get(OrePrefixes.stick, material, 1) != null) { - // Auto generate frame box recipe in an assembler. - GT_Values.RA.stdBuilder() - .itemInputs( - GT_OreDictUnificator.get(OrePrefixes.stick, material, 4), - GT_Utility.getIntegratedCircuit(4)) - .itemOutputs(block.getStackForm(1, meta)) - .duration(3 * SECONDS + 4 * TICKS) - .eut(calculateRecipeEU(material, 7)) - .addTo(assemblerRecipes); - } - } - } - - makeWires(Materials.RedAlloy, 2000, 0L, 1L, 1L, gregtech.api.enums.GT_Values.V[0], true, false); - - makeWires(Materials.Cobalt, 1200, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[1], true, false); - makeWires(Materials.Lead, 1220, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[1], true, false); - makeWires(Materials.Tin, 1240, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[1], true, false); - - makeWires(Materials.Zinc, 1260, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[1], true, false); - makeWires(Materials.SolderingAlloy, 1280, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[1], true, false); - - makeWires(Materials.Iron, 1300, 3L, 6L, 2L, gregtech.api.enums.GT_Values.V[2], true, false); - makeWires(Materials.Nickel, 1320, 3L, 6L, 3L, gregtech.api.enums.GT_Values.V[2], true, false); - makeWires(Materials.Cupronickel, 1340, 3L, 6L, 2L, gregtech.api.enums.GT_Values.V[2], true, false); - makeWires(Materials.Copper, 1360, 2L, 4L, 1L, gregtech.api.enums.GT_Values.V[2], true, false); - makeWires(Materials.AnnealedCopper, 1380, 2L, 4L, 1L, gregtech.api.enums.GT_Values.V[2], true, false); - - makeWires(Materials.Kanthal, 1400, 3L, 6L, 4L, gregtech.api.enums.GT_Values.V[3], true, false); - makeWires(Materials.Gold, 1420, 2L, 4L, 3L, gregtech.api.enums.GT_Values.V[3], true, false); - makeWires(Materials.Electrum, 1440, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[3], true, false); - makeWires(Materials.Silver, 1460, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[3], true, false); - makeWires(Materials.BlueAlloy, 1480, 1L, 2L, 2L, gregtech.api.enums.GT_Values.V[3], true, false); - - makeWires(Materials.Nichrome, 1500, 4L, 8L, 3L, gregtech.api.enums.GT_Values.V[4], true, false); - makeWires(Materials.Steel, 1520, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[4], true, false); - makeWires(Materials.BlackSteel, 1540, 2L, 4L, 3L, gregtech.api.enums.GT_Values.V[4], true, false); - makeWires(Materials.Titanium, 1560, 2L, 4L, 4L, gregtech.api.enums.GT_Values.V[4], true, false); - makeWires(Materials.Aluminium, 1580, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[4], true, false); - - makeWires(Materials.Graphene, 1600, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[5], false, true); - makeWires(Materials.Osmium, 1620, 2L, 4L, 4L, gregtech.api.enums.GT_Values.V[5], true, false); - makeWires(Materials.Platinum, 1640, 1L, 2L, 2L, gregtech.api.enums.GT_Values.V[5], true, false); - makeWires(Materials.TungstenSteel, 1660, 2L, 4L, 3L, gregtech.api.enums.GT_Values.V[5], true, false); - makeWires(Materials.Tungsten, 1680, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[5], true, false); - - makeWires(Materials.HSSG, 1700, 2L, 4L, 4L, gregtech.api.enums.GT_Values.V[6], true, false); - makeWires(Materials.NiobiumTitanium, 1720, 2L, 4L, 4L, gregtech.api.enums.GT_Values.V[6], true, false); - makeWires(Materials.VanadiumGallium, 1740, 2L, 4L, 4L, gregtech.api.enums.GT_Values.V[6], true, false); - makeWires(Materials.YttriumBariumCuprate, 1760, 4L, 8L, 4L, gregtech.api.enums.GT_Values.V[6], true, false); - - makeWires(Materials.Naquadah, 1780, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[7], true, false); - - makeWires(Materials.NaquadahAlloy, 1800, 4L, 8L, 2L, gregtech.api.enums.GT_Values.V[8], true, false); - makeWires(Materials.Duranium, 1820, 8L, 16L, 1L, gregtech.api.enums.GT_Values.V[8], true, false); - makeWires(Materials.TPV, 1840, 1L, 2L, 6L, gregtech.api.enums.GT_Values.V[4], true, false); - - // Superconductor base. - makeWires( - Materials.Pentacadmiummagnesiumhexaoxid, - 2200, - 1L, - 2L, - 1L, - gregtech.api.enums.GT_Values.V[2], - false, - false); - makeWires( - Materials.Titaniumonabariumdecacoppereikosaoxid, - 2220, - 1L, - 8L, - 2L, - gregtech.api.enums.GT_Values.V[3], - false, - false); - makeWires(Materials.Uraniumtriplatinid, 2240, 1L, 16L, 3L, gregtech.api.enums.GT_Values.V[4], false, false); - makeWires(Materials.Vanadiumtriindinid, 2260, 1L, 64L, 4L, gregtech.api.enums.GT_Values.V[5], false, false); - makeWires( - Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid, - 2280, - 2L, - 256L, - 6L, - gregtech.api.enums.GT_Values.V[6], - false, - false); - makeWires( - Materials.Tetranaquadahdiindiumhexaplatiumosminid, - 2300, - 2L, - 1024L, - 8L, - gregtech.api.enums.GT_Values.V[7], - false, - false); - makeWires( - Materials.Longasssuperconductornameforuvwire, - 2500, - 2L, - 4096L, - 12L, - gregtech.api.enums.GT_Values.V[8], - false, - false); - makeWires( - Materials.Longasssuperconductornameforuhvwire, - 2520, - 2L, - 16384L, - 16L, - gregtech.api.enums.GT_Values.V[9], - false, - false); - makeWires( - Materials.SuperconductorUEVBase, - 2032, - 2L, - 65536L, - 24L, - gregtech.api.enums.GT_Values.V[10], - false, - false); - makeWires( - Materials.SuperconductorUIVBase, - 2052, - 2L, - 262144L, - 32L, - gregtech.api.enums.GT_Values.V[11], - false, - false); - makeWires(Materials.SuperconductorUMVBase, 2072, 2L, 1048576L, 32L, GT_Values.V[12], false, false); - - // Actual superconductors. - makeWires(Materials.SuperconductorMV, 2320, 0L, 0L, 4L, gregtech.api.enums.GT_Values.V[2], false, true); - makeWires(Materials.SuperconductorHV, 2340, 0L, 0L, 6L, gregtech.api.enums.GT_Values.V[3], false, true); - makeWires(Materials.SuperconductorEV, 2360, 0L, 0L, 8L, gregtech.api.enums.GT_Values.V[4], false, true); - makeWires(Materials.SuperconductorIV, 2380, 0L, 0L, 12L, gregtech.api.enums.GT_Values.V[5], false, true); - makeWires(Materials.SuperconductorLuV, 2400, 0L, 0L, 16L, gregtech.api.enums.GT_Values.V[6], false, true); - makeWires(Materials.SuperconductorZPM, 2420, 0L, 0L, 24L, gregtech.api.enums.GT_Values.V[7], false, true); - makeWires(Materials.SuperconductorUV, 2440, 0L, 0L, 32L, gregtech.api.enums.GT_Values.V[8], false, true); - makeWires(Materials.SuperconductorUHV, 2020, 0L, 0L, 48L, gregtech.api.enums.GT_Values.V[9], false, true); - makeWires(Materials.SuperconductorUEV, 2026, 0L, 0L, 64L, gregtech.api.enums.GT_Values.V[10], false, true); - makeWires(Materials.SuperconductorUIV, 2081, 0L, 0L, 64L, gregtech.api.enums.GT_Values.V[11], false, true); - makeWires(Materials.SuperconductorUMV, 2089, 0L, 0L, 64L, gregtech.api.enums.GT_Values.V[12], false, true); - - makeWires(Materials.Ichorium, 2600, 2L, 2L, 12L, GT_Values.V[9], false, true); - makeWires(MaterialsUEVplus.SpaceTime, 2606, 0L, 0L, 1_000_000L, GT_Values.V[14], false, true); - - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeSmall.get(Materials.Wood), - new GT_MetaPipeEntity_Fluid( - 5101, - "GT_Pipe_Wood_Small", - "Small Wooden Fluid Pipe", - 0.375F, - Materials.Wood, - 10, - 350, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeMedium.get(Materials.Wood), - new GT_MetaPipeEntity_Fluid(5102, "GT_Pipe_Wood", "Wooden Fluid Pipe", 0.5F, Materials.Wood, 30, 350, false) - .getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeLarge.get(Materials.Wood), - new GT_MetaPipeEntity_Fluid( - 5103, - "GT_Pipe_Wood_Large", - "Large Wooden Fluid Pipe", - 0.75F, - Materials.Wood, - 60, - 350, - false).getStackForm(1L)); - - generateFluidPipes(Materials.Copper, Materials.Copper.mName, 5110, 20, 1000, true); - generateFluidMultiPipes(Materials.Copper, Materials.Copper.mName, 5115, 20, 1000, true); - generateFluidPipes(Materials.Bronze, Materials.Bronze.mName, 5120, 120, 2000, true); - generateFluidMultiPipes(Materials.Bronze, Materials.Bronze.mName, 5125, 120, 2000, true); - generateFluidPipes(Materials.Steel, Materials.Steel.mName, 5130, 240, 2500, true); - generateFluidMultiPipes(Materials.Steel, Materials.Steel.mName, 5135, 240, 2500, true); - generateFluidPipes(Materials.StainlessSteel, Materials.StainlessSteel.mName, 5140, 360, 3000, true); - generateFluidMultiPipes(Materials.StainlessSteel, Materials.StainlessSteel.mName, 5145, 360, 3000, true); - generateFluidPipes(Materials.Titanium, Materials.Titanium.mName, 5150, 480, 5000, true); - generateFluidMultiPipes(Materials.Titanium, Materials.Titanium.mName, 5155, 480, 5000, true); - generateFluidPipes(Materials.TungstenSteel, Materials.TungstenSteel.mName, 5160, 600, 7500, true); - generateFluidMultiPipes(Materials.TungstenSteel, Materials.TungstenSteel.mName, 5270, 600, 7500, true); - generateFluidPipes( - Materials.Polybenzimidazole, - Materials.Polybenzimidazole.mName, - "PBI", - 5280, - 600, - 1000, - true); - generateFluidMultiPipes( - Materials.Polybenzimidazole, - Materials.Polybenzimidazole.mName, - "PBI", - 5290, - 600, - 1000, - true); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeSmall.get(Materials.Ultimate), - new GT_MetaPipeEntity_Fluid( - 5165, - "GT_Pipe_HighPressure_Small", - "Small High Pressure Fluid Pipe", - 0.375F, - Materials.Redstone, - 4800, - 1500, - true).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeMedium.get(Materials.Ultimate), - new GT_MetaPipeEntity_Fluid( - 5166, - "GT_Pipe_HighPressure", - "High Pressure Fluid Pipe", - 0.5F, - Materials.Redstone, - 7200, - 1500, - true).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeLarge.get(Materials.Ultimate), - new GT_MetaPipeEntity_Fluid( - 5167, - "GT_Pipe_HighPressure_Large", - "Large High Pressure Fluid Pipe", - 0.75F, - Materials.Redstone, - 9600, - 1500, - true).getStackForm(1L)); - generateFluidPipes(Materials.Plastic, Materials.Plastic.mName, "Plastic", 5170, 360, 350, true); - generateFluidMultiPipes(Materials.Plastic, Materials.Plastic.mName, "Plastic", 5175, 360, 350, true); - generateFluidPipes(Materials.NiobiumTitanium, Materials.NiobiumTitanium.mName, 5180, 900, 2900, true); - generateFluidMultiPipes(Materials.NiobiumTitanium, Materials.NiobiumTitanium.mName, 5185, 900, 2900, true); - generateFluidPipes(Materials.Enderium, Materials.Enderium.mName, 5190, 1800, 15000, true); - generateFluidMultiPipes(Materials.Enderium, Materials.Enderium.mName, 5195, 1800, 15000, true); - generateFluidPipes(Materials.Naquadah, Materials.Naquadah.mName, 5200, 9000, 19000, true); - generateFluidMultiPipes(Materials.Naquadah, Materials.Naquadah.mName, 5205, 9000, 19000, true); - generateFluidPipes(Materials.Neutronium, Materials.Neutronium.mName, 5210, 16800, 1000000, true); - generateFluidMultiPipes(Materials.Neutronium, Materials.Neutronium.mName, 5215, 16800, 1000000, true); - generateFluidPipes(Materials.NetherStar, Materials.NetherStar.mName, 5220, 19200, 1000000, true); - generateFluidMultiPipes(Materials.NetherStar, Materials.NetherStar.mName, 5225, 19200, 1000000, true); - generateFluidPipes(Materials.MysteriousCrystal, Materials.MysteriousCrystal.mName, 5230, 24000, 1000000, true); - generateFluidMultiPipes( - Materials.MysteriousCrystal, - Materials.MysteriousCrystal.mName, - 5235, - 24000, - 1000000, - true); - generateFluidPipes(Materials.DraconiumAwakened, Materials.DraconiumAwakened.mName, 5240, 45000, 10000000, true); - generateFluidMultiPipes( - Materials.DraconiumAwakened, - Materials.DraconiumAwakened.mName, - 5245, - 45000, - 10000000, - true); - generateFluidPipes(Materials.Infinity, Materials.Infinity.mName, 5250, 60000, 10000000, true); - generateFluidMultiPipes(Materials.Infinity, Materials.Infinity.mName, 5255, 60000, 10000000, true); - generateFluidPipes(Materials.WroughtIron, Materials.WroughtIron.mName, 5260, 180, 2250, true); - generateFluidMultiPipes(Materials.WroughtIron, Materials.WroughtIron.mName, 5265, 180, 2250, true); - generateFluidPipes( - Materials.Polytetrafluoroethylene, - Materials.Polytetrafluoroethylene.mName, - "PTFE", - 5680, - 480, - 600, - true); - generateFluidMultiPipes( - Materials.Polytetrafluoroethylene, - Materials.Polytetrafluoroethylene.mName, - "PTFE", - 5685, - 480, - 600, - true); - generateFluidPipes( - MaterialsUEVplus.SpaceTime, - MaterialsUEVplus.SpaceTime.mName, - 5300, - 250000, - 2147483647, - true); - generateFluidMultiPipes( - MaterialsUEVplus.SpaceTime, - MaterialsUEVplus.SpaceTime.mName, - 5305, - 250000, - 2147483647, - true); - generateFluidPipes( - MaterialsUEVplus.TranscendentMetal, - MaterialsUEVplus.TranscendentMetal.mName, - 5310, - 220000, - 2147483647, - true); - generateFluidMultiPipes( - MaterialsUEVplus.TranscendentMetal, - MaterialsUEVplus.TranscendentMetal.mName, - 5315, - 220000, - 2147483647, - true); - - generateItemPipes(Materials.Brass, Materials.Brass.mName, 5602, 1); - generateItemPipes(Materials.Electrum, Materials.Electrum.mName, 5612, 2); - generateItemPipes(Materials.Platinum, Materials.Platinum.mName, 5622, 4); - generateItemPipes(Materials.Osmium, Materials.Osmium.mName, 5632, 8); - generateItemPipes(Materials.PolyvinylChloride, Materials.PolyvinylChloride.mName, "PVC", 5690, 4); - generateItemPipes(Materials.Nickel, Materials.Nickel.mName, 5700, 1); - generateItemPipes(Materials.Cobalt, Materials.Cobalt.mName, 5710, 2); - generateItemPipes(Materials.Aluminium, Materials.Aluminium.mName, 5720, 2); - if (NewHorizonsCoreMod.isModLoaded()) { - generateFluidPipes(Materials.get("RadoxPoly"), "RadoxPoly", 5760, 5000, 1500, true); - } - } - - @SuppressWarnings("PointlessArithmeticExpression") - private static void makeWires(Materials aMaterial, int aStartID, long aLossInsulated, long aLoss, long aAmperage, - long aVoltage, boolean aInsulatable, boolean aAutoInsulated) { - String name = GT_LanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName; - GT_OreDictUnificator.registerOre( - OrePrefixes.wireGt01, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 0, - aTextWire1 + aMaterial.mName.toLowerCase() + ".01", - "1x " + name + aTextWire2, - 0.125F, - aMaterial, - aLoss, - 1L * aAmperage, - aVoltage, - false, - !aAutoInsulated).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.wireGt02, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 1, - aTextWire1 + aMaterial.mName.toLowerCase() + ".02", - "2x " + name + aTextWire2, - 0.25F, - aMaterial, - aLoss, - 2L * aAmperage, - aVoltage, - false, - !aAutoInsulated).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.wireGt04, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 2, - aTextWire1 + aMaterial.mName.toLowerCase() + ".04", - "4x " + name + aTextWire2, - 0.375F, - aMaterial, - aLoss, - 4L * aAmperage, - aVoltage, - false, - !aAutoInsulated).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.wireGt08, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 3, - aTextWire1 + aMaterial.mName.toLowerCase() + ".08", - "8x " + name + aTextWire2, - 0.5F, - aMaterial, - aLoss, - 8L * aAmperage, - aVoltage, - false, - !aAutoInsulated).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.wireGt12, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 4, - aTextWire1 + aMaterial.mName.toLowerCase() + ".12", - "12x " + name + aTextWire2, - 0.625F, - aMaterial, - aLoss, - 12L * aAmperage, - aVoltage, - false, - !aAutoInsulated).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.wireGt16, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 5, - aTextWire1 + aMaterial.mName.toLowerCase() + ".16", - "16x " + name + aTextWire2, - 0.75F, - aMaterial, - aLoss, - 16L * aAmperage, - aVoltage, - false, - !aAutoInsulated).getStackForm(1L)); - if (aInsulatable) { - GT_OreDictUnificator.registerOre( - OrePrefixes.cableGt01, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 6, - aTextCable1 + aMaterial.mName.toLowerCase() + ".01", - "1x " + name + aTextCable2, - 0.25F, - aMaterial, - aLossInsulated, - 1L * aAmperage, - aVoltage, - true, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.cableGt02, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 7, - aTextCable1 + aMaterial.mName.toLowerCase() + ".02", - "2x " + name + aTextCable2, - 0.375F, - aMaterial, - aLossInsulated, - 2L * aAmperage, - aVoltage, - true, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.cableGt04, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 8, - aTextCable1 + aMaterial.mName.toLowerCase() + ".04", - "4x " + name + aTextCable2, - 0.5F, - aMaterial, - aLossInsulated, - 4L * aAmperage, - aVoltage, - true, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.cableGt08, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 9, - aTextCable1 + aMaterial.mName.toLowerCase() + ".08", - "8x " + name + aTextCable2, - 0.625F, - aMaterial, - aLossInsulated, - 8L * aAmperage, - aVoltage, - true, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.cableGt12, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 10, - aTextCable1 + aMaterial.mName.toLowerCase() + ".12", - "12x " + name + aTextCable2, - 0.75F, - aMaterial, - aLossInsulated, - 12L * aAmperage, - aVoltage, - true, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.cableGt16, - aMaterial, - new GT_MetaPipeEntity_Cable( - aStartID + 11, - aTextCable1 + aMaterial.mName.toLowerCase() + ".16", - "16x " + name + aTextCable2, - 0.875F, - aMaterial, - aLossInsulated, - 16L * aAmperage, - aVoltage, - true, - false).getStackForm(1L)); - } - } - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Registering MetaTileEntities."); - registerMachineHull(); - registerTransformer(); - registerDynamoHatch(); - registerEnergyHatch(); - registerInputHatch(); - registerQuadrupleInputHatch(); - registerOutputHatch(); - registerQuantumTank(); - registerQuantumChest(); - registerSuperTank(); - registerSuperChest(); - registerLongDistancePipe(); - registerAE2Hatches(); - registerMagHatch(); - registerInputBus(); - registerOutputBus(); - registerMufflerHatch(); - registerBoiler(); - registerBatteryBuffer1x1(); - registerBatteryBuffer2x2(); - registerBatteryBuffer3x3(); - registerBatteryBuffer4x4(); - registerCharger4x4(); - registerWirelessEnergyHatch(); - registerWirelessDynamoHatch(); - registerSteamMachines(); - registerHPSteamMachines(); - registerLocker(); - registerScanner(); - registerPackager(); - registerRockBreaker(); - registerIndustrialApiary(); - registerMassFab(); - registerReplicator(); - registerBrewery(); - registerMiner(); - registerPump(); - registerTeleporter(); - registerMonsterRepellator(); - registerAdvancedSeismicProspector(); - registerMicrowaveEnergyTransmitter(); - registerChestBuffer(); - registerItemFilter(); - registerTypeFilter(); - registerRegulator(); - registerSuperBuffer(); - registerItemDistributor(); - registerRecipeFilter(); - registerLightningRods(); - registerCombustionGenerators(); - registerGasTurbines(); - registerSteamTurbines(); - registerNaquadahReactors(); - registerMagicEnergyAbsorbers(); - registerMagicEnergyConverters(); - registerPlasmaGenerators(); - registerMultiblockControllers(); - registerWorldAccelerator(); - registerAlloySmelter(); - registerMatterAmplifier(); - registerAssemblingMachine(); - registerWetTransformer(); - registerHighAmpTransformer(); - registerChemicalBath(); - registerChemicalReactor(); - registerFermenter(); - registerFluidCanner(); - registerFluidExtractor(); - registerFluidHeater(); - registerMixer(); - registerAutoclave(); - registerBendingMachine(); - registerCompressor(); - registerCuttingMachine(); - registerDistillery(); - registerElectricFurnace(); - registerElectromagneticSeparator(); - registerExtractor(); - registerExtruder(); - registerFluidSolidifier(); - registerFormingPress(); - registerForgeHammer(); - registerLathe(); - registerPrecisionLaserEngraver(); - registerMacerator(); - registerMatterFabricator(); - registerMicrowave(); - registerOreWashingPlant(); - registerPolarizer(); - registerRecycler(); - registerSiftingMachine(); - registerSlicingMachine(); - registerThermalCentrifuge(); - registerWiremill(); - registerArcFurnace(); - registerCentrifuge(); - registerPlasmaArcFurnace(); - registerCanningMachine(); - registerElectrolyzer(); - registerCircuitAssembler(); - registerTurboCharger4By4(); - registerBetterJukebox(); - registerUnpackager(); - registerPrinter(); - registerOven(); - - ItemList.AdvDebugStructureWriter.set( - new GT_MetaTileEntity_AdvDebugStructureWriter( - ADVANCED_DEBUG_STRUCTURE_WRITTER.ID, - "advdebugstructurewriter", - "Advanced Debug Structure Writer", - 5).getStackForm(1L)); - ItemList.Hatch_Maintenance.set( - new GT_MetaTileEntity_Hatch_Maintenance(MAINTENANCE_HATCH.ID, "hatch.maintenance", "Maintenance Hatch", 1) - .getStackForm(1L)); - ItemList.Hatch_AutoMaintenance.set( - new GT_MetaTileEntity_Hatch_Maintenance( - AUTO_MAINTENANCE_HATCH.ID, - "hatch.maintenance.auto", - "Auto Maintenance Hatch", - 6, - true).getStackForm(1L)); - ItemList.Hatch_DroneDownLink.set( - new GT_MetaTileEntity_Hatch_DroneDownLink( - DroneDownLink.ID, - "hatch.dronedownlink", - "Drone DownLink Module", - 5).getStackForm(1)); - ItemList.Hatch_DataAccess_EV.set( - new GT_MetaTileEntity_Hatch_DataAccess(DATA_ACCESS_HATCH.ID, "hatch.dataaccess", "Data Access Hatch", 4) - .getStackForm(1L)); - ItemList.Hatch_DataAccess_LuV.set( - new GT_MetaTileEntity_Hatch_DataAccess( - ADVANCED_DATA_ACCESS_HATCH.ID, - "hatch.dataaccess.adv", - "Advanced Data Access Hatch", - 6).getStackForm(1L)); - ItemList.Hatch_DataAccess_UV.set( - new GT_MetaTileEntity_Hatch_DataAccess( - AUTOMATABLE_DATA_ACCESS_HATCH.ID, - "hatch.dataaccess.auto", - "Automatable Data Access Hatch", - 8).getStackForm(1L)); - ItemList.Hatch_HeatSensor.set( - new GT_MetaTileEntity_HeatSensor(HEAT_DETECTOR_HATCH.ID, "hatch.heatsensor", "Heat Sensor Hatch", 7) - .getStackForm(1)); - ItemList.Hatch_pHSensor.set( - new GT_MetaTileEntity_pHSensor(HATCH_PH_SENSOR.ID, "hatch.phsensor", "pH Sensor Hatch", 7).getStackForm(1)); - ItemList.Hatch_LensHousing.set( - new GT_MetaTileEntity_LensHousing(HATCH_LENS_HOUSING.ID, "hatch.lenshousing", "Lens Housing") - .getStackForm(1L)); - ItemList.Hatch_LensIndicator.set( - new GT_MetaTileEntity_LensIndicator( - HATCH_LENS_INDICATOR.ID, - "hatch.lensindicator", - "Lens Indicator Hatch", - 8).getStackForm(1L)); - generateWiresAndPipes(); - } - - private static void generateItemPipes(Materials aMaterial, String name, int startID, int baseInvSlots) { - generateItemPipes( - aMaterial, - name, - GT_LanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName, - startID, - baseInvSlots); - } - - private static void generateItemPipes(Materials aMaterial, String name, String displayName, int startID, - int baseInvSlots) { - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeMedium.get(aMaterial), - new GT_MetaPipeEntity_Item( - startID, - "GT_Pipe_" + name, - displayName + " Item Pipe", - 0.50F, - aMaterial, - baseInvSlots, - 32768 / baseInvSlots, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeLarge.get(aMaterial), - new GT_MetaPipeEntity_Item( - startID + 1, - "GT_Pipe_" + name + "_Large", - "Large " + displayName + " Item Pipe", - 0.75F, - aMaterial, - baseInvSlots * 2, - 16384 / baseInvSlots, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeHuge.get(aMaterial), - new GT_MetaPipeEntity_Item( - startID + 2, - "GT_Pipe_" + name + "_Huge", - "Huge " + displayName + " Item Pipe", - 1.00F, - aMaterial, - baseInvSlots * 4, - 8192 / baseInvSlots, - false).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeRestrictiveMedium.get(aMaterial), - new GT_MetaPipeEntity_Item( - startID + 3, - "GT_Pipe_Restrictive_" + name, - "Restrictive " + displayName + " Item Pipe", - 0.50F, - aMaterial, - baseInvSlots, - 3276800 / baseInvSlots, - true).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeRestrictiveLarge.get(aMaterial), - new GT_MetaPipeEntity_Item( - startID + 4, - "GT_Pipe_Restrictive_" + name + "_Large", - "Large Restrictive " + displayName + " Item Pipe", - 0.75F, - aMaterial, - baseInvSlots * 2, - 1638400 / baseInvSlots, - true).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeRestrictiveHuge.get(aMaterial), - new GT_MetaPipeEntity_Item( - startID + 5, - "GT_Pipe_Restrictive_" + name + "_Huge", - "Huge Restrictive " + displayName + " Item Pipe", - 0.875F, - aMaterial, - baseInvSlots * 4, - 819200 / baseInvSlots, - true).getStackForm(1L)); - } - - @SuppressWarnings("SameParameterValue") - private static void generateFluidPipes(Materials aMaterial, String name, int startID, int baseCapacity, - int heatCapacity, boolean gasProof) { - generateFluidPipes( - aMaterial, - name, - GT_LanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName, - startID, - baseCapacity, - heatCapacity, - gasProof); - } - - private static void generateFluidPipes(Materials aMaterial, String name, String displayName, int startID, - int baseCapacity, int heatCapacity, boolean gasProof) { - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeTiny.get(aMaterial), - new GT_MetaPipeEntity_Fluid( - startID, - "GT_Pipe_" + name + "_Tiny", - "Tiny " + displayName + " Fluid Pipe", - 0.25F, - aMaterial, - baseCapacity / 6, - heatCapacity, - gasProof).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeSmall.get(aMaterial), - new GT_MetaPipeEntity_Fluid( - startID + 1, - "GT_Pipe_" + name + "_Small", - "Small " + displayName + " Fluid Pipe", - 0.375F, - aMaterial, - baseCapacity / 3, - heatCapacity, - gasProof).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeMedium.get(aMaterial), - new GT_MetaPipeEntity_Fluid( - startID + 2, - "GT_Pipe_" + name, - displayName + " Fluid Pipe", - 0.5F, - aMaterial, - baseCapacity, - heatCapacity, - gasProof).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeLarge.get(aMaterial), - new GT_MetaPipeEntity_Fluid( - startID + 3, - "GT_Pipe_" + name + "_Large", - "Large " + displayName + " Fluid Pipe", - 0.75F, - aMaterial, - baseCapacity * 2, - heatCapacity, - gasProof).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeHuge.get(aMaterial), - new GT_MetaPipeEntity_Fluid( - startID + 4, - "GT_Pipe_" + name + "_Huge", - "Huge " + displayName + " Fluid Pipe", - 0.875F, - aMaterial, - baseCapacity * 4, - heatCapacity, - gasProof).getStackForm(1L)); - } - - @SuppressWarnings("SameParameterValue") - private static void generateFluidMultiPipes(Materials aMaterial, String name, int startID, int baseCapacity, - int heatCapacity, boolean gasProof) { - generateFluidMultiPipes(aMaterial, name, "%material", startID, baseCapacity, heatCapacity, gasProof); - } - - private static void generateFluidMultiPipes(Materials aMaterial, String name, String displayName, int startID, - int baseCapacity, int heatCapacity, boolean gasProof) { - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeQuadruple.get(aMaterial), - new GT_MetaPipeEntity_Fluid( - startID, - "GT_Pipe_" + name + "_Quadruple", - "Quadruple " + displayName + " Fluid Pipe", - 1.0F, - aMaterial, - baseCapacity, - heatCapacity, - gasProof, - 4).getStackForm(1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.pipeNonuple.get(aMaterial), - new GT_MetaPipeEntity_Fluid( - startID + 1, - "GT_Pipe_" + name + "_Nonuple", - "Nonuple " + displayName + " Fluid Pipe", - 1.0F, - aMaterial, - baseCapacity / 3, - heatCapacity, - gasProof, - 9).getStackForm(1L)); - } -} diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java index c0946a7334..9b89ce9176 100644 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java +++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java @@ -1,6 +1,6 @@ package gregtech.loaders.preload; -import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.GTMod.GT_FML_LOGGER; import static gregtech.api.multitileentity.enums.GT_MultiTileCasing.*; import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.*; import static gregtech.api.multitileentity.enums.GT_MultiTileUpgradeCasing.*; @@ -85,7 +85,7 @@ public class GT_Loader_MultiTileEntities implements Runnable { @Override public void run() { - GT_FML_LOGGER.info("GT_Mod: Registering MultiTileEntities"); + GT_FML_LOGGER.info("GTMod: Registering MultiTileEntities"); registerMachines(); registerCasings(); registerComponentCasings(); diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java b/src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java deleted file mode 100644 index 1b4d2bdf91..0000000000 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java +++ /dev/null @@ -1,458 +0,0 @@ -package gregtech.loaders.preload; - -import static gregtech.api.enums.Mods.AppliedEnergistics2; -import static gregtech.api.enums.Mods.Botania; -import static gregtech.api.enums.Mods.IndustrialCraft2; -import static gregtech.api.enums.Mods.NewHorizonsCoreMod; -import static gregtech.api.enums.Mods.Railcraft; -import static gregtech.api.enums.Mods.Thaumcraft; -import static gregtech.api.enums.Mods.TwilightForest; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -import gregtech.api.GregTech_API; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.MaterialsBotania; -import gregtech.api.enums.OreDictNames; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_OreDictUnificator; - -public class GT_Loader_OreDictionary implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Register OreDict Entries of Non-GT-Items."); - GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Empty, ItemList.Cell_Empty.get(1L)); - GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Lava, ItemList.Cell_Lava.get(1L)); - GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Lava, GT_ModHandler.getIC2Item("lavaCell", 1L)); - GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Water, ItemList.Cell_Water.get(1L)); - GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Water, GT_ModHandler.getIC2Item("waterCell", 1L)); - GT_OreDictUnificator.set( - OrePrefixes.cell, - Materials.Creosote, - GT_ModHandler.getModItem(Railcraft.ID, "fluid.creosote.cell", 1L)); - - GT_OreDictUnificator.set(OrePrefixes.cell, Materials.UUMatter, GT_ModHandler.getIC2Item("uuMatterCell", 1L)); - GT_OreDictUnificator.set(OrePrefixes.cell, Materials.ConstructionFoam, GT_ModHandler.getIC2Item("CFCell", 1L)); - - GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Empty, new ItemStack(Items.bucket, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Water, new ItemStack(Items.water_bucket, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Lava, new ItemStack(Items.lava_bucket, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Milk, new ItemStack(Items.milk_bucket, 1, 0)); - // Clay buckets handled in gregtech.common.GT_Proxy.onLoad() as they aren't registered until Iguana Tweaks - // pre-init. - - GT_OreDictUnificator.set(OrePrefixes.bottle, Materials.Empty, new ItemStack(Items.glass_bottle, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.bottle, Materials.Water, new ItemStack(Items.potionitem, 1, 0)); - - GT_OreDictUnificator - .set(OrePrefixes.plateAlloy, Materials.Iridium, GT_ModHandler.getIC2Item("iridiumPlate", 1L)); - GT_OreDictUnificator - .set(OrePrefixes.plateAlloy, Materials.Advanced, GT_ModHandler.getIC2Item("advancedAlloy", 1L)); - GT_OreDictUnificator.set(OrePrefixes.plateAlloy, Materials.Carbon, GT_ModHandler.getIC2Item("carbonPlate", 1L)); - - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Coal, new ItemStack(Blocks.coal_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Iron, new ItemStack(Blocks.iron_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Lapis, new ItemStack(Blocks.lapis_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Redstone, new ItemStack(Blocks.redstone_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Redstone, new ItemStack(Blocks.lit_redstone_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Gold, new ItemStack(Blocks.gold_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Diamond, new ItemStack(Blocks.diamond_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Emerald, new ItemStack(Blocks.emerald_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ore, Materials.NetherQuartz, new ItemStack(Blocks.quartz_ore, 1)); - GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Copper, GT_ModHandler.getIC2Item("copperIngot", 1L)); - GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Tin, GT_ModHandler.getIC2Item("tinIngot", 1L)); - GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Lead, GT_ModHandler.getIC2Item("leadIngot", 1L)); - GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Bronze, GT_ModHandler.getIC2Item("bronzeIngot", 1L)); - GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Silver, GT_ModHandler.getIC2Item("silverIngot", 1L)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Iridium, GT_ModHandler.getIC2Item("iridiumOre", 1L)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Lapis, new ItemStack(Items.dye, 1, 4)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.EnderEye, new ItemStack(Items.ender_eye, 1)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.EnderPearl, new ItemStack(Items.ender_pearl, 1)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Diamond, new ItemStack(Items.diamond, 1)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Emerald, new ItemStack(Items.emerald, 1)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Coal, new ItemStack(Items.coal, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Charcoal, new ItemStack(Items.coal, 1, 1)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.NetherQuartz, new ItemStack(Items.quartz, 1)); - GT_OreDictUnificator.set(OrePrefixes.gem, Materials.NetherStar, new ItemStack(Items.nether_star, 1)); - GT_OreDictUnificator.set(OrePrefixes.nugget, Materials.Gold, new ItemStack(Items.gold_nugget, 1)); - GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Gold, new ItemStack(Items.gold_ingot, 1)); - GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Iron, new ItemStack(Items.iron_ingot, 1)); - GT_OreDictUnificator.set(OrePrefixes.plate, Materials.Paper, new ItemStack(Items.paper, 1)); - GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Sugar, new ItemStack(Items.sugar, 1)); - GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Bone, ItemList.Dye_Bonemeal.get(1L)); - GT_OreDictUnificator.set(OrePrefixes.stick, Materials.Wood, new ItemStack(Items.stick, 1)); - GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Redstone, new ItemStack(Items.redstone, 1)); - GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Gunpowder, new ItemStack(Items.gunpowder, 1)); - GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Glowstone, new ItemStack(Items.glowstone_dust, 1)); - GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Blaze, new ItemStack(Items.blaze_powder, 1)); - GT_OreDictUnificator.set(OrePrefixes.stick, Materials.Blaze, new ItemStack(Items.blaze_rod, 1)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Iron, new ItemStack(Blocks.iron_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Gold, new ItemStack(Blocks.gold_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Diamond, new ItemStack(Blocks.diamond_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Emerald, new ItemStack(Blocks.emerald_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Lapis, new ItemStack(Blocks.lapis_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Coal, new ItemStack(Blocks.coal_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Redstone, new ItemStack(Blocks.redstone_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.NetherQuartz, new ItemStack(Blocks.quartz_block, 1, 0)); - GT_OreDictUnificator.set(OrePrefixes.block, Materials.Clay, new ItemStack(Blocks.clay, 1, 0)); - if (Blocks.ender_chest != null) { - GT_OreDictUnificator.registerOre(OreDictNames.enderChest, new ItemStack(Blocks.ender_chest, 1)); - } - GT_OreDictUnificator.registerOre(OreDictNames.craftingAnvil, new ItemStack(Blocks.anvil, 1)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingAnvil, GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 0)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingIndustrialDiamond, ItemList.IC2_Industrial_Diamond.get(1L)); - GT_OreDictUnificator - .registerOre(OrePrefixes.glass, Materials.Reinforced, GT_ModHandler.getIC2Item("reinforcedGlass", 1L)); - - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Basalt, GT_ModHandler.getModItem(Railcraft.ID, "cube", 1L, 6)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Marble, GT_ModHandler.getModItem(Railcraft.ID, "cube", 1L, 7)); - GT_OreDictUnificator.registerOre( - OrePrefixes.stone, - Materials.Basalt, - GT_ModHandler.getModItem(Railcraft.ID, "brick.abyssal", 1L, 32767)); - GT_OreDictUnificator.registerOre( - OrePrefixes.stone, - Materials.Marble, - GT_ModHandler.getModItem(Railcraft.ID, "brick.quarried", 1L, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(Blocks.obsidian, 1, 32767)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Stone, new ItemStack(Blocks.stone, 1, 32767)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneMossy, new ItemStack(Blocks.mossy_cobblestone, 1, 32767)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneCobble, new ItemStack(Blocks.mossy_cobblestone, 1, 32767)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneCobble, new ItemStack(Blocks.cobblestone, 1, 32767)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneSmooth, new ItemStack(Blocks.stone, 1, 32767)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneBricks, new ItemStack(Blocks.stonebrick, 1, 32767)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneMossy, new ItemStack(Blocks.stonebrick, 1, 1)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneCracked, new ItemStack(Blocks.stonebrick, 1, 2)); - GT_OreDictUnificator.registerOre(OrePrefixes.stoneChiseled, new ItemStack(Blocks.stonebrick, 1, 3)); - GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Sand, new ItemStack(Blocks.sandstone, 1, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Netherrack, new ItemStack(Blocks.netherrack, 1, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.NetherBrick, new ItemStack(Blocks.nether_brick, 1, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Endstone, new ItemStack(Blocks.end_stone, 1, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.stone, Materials.Glowstone, new ItemStack(Blocks.glowstone, 1, 32767)); - - GT_OreDictUnificator - .registerOre("paperResearchFragment", GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 9)); - GT_OreDictUnificator.registerOre( - "itemCertusQuartz", - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1)); - GT_OreDictUnificator.registerOre( - "itemCertusQuartz", - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10)); - GT_OreDictUnificator.registerOre( - "itemNetherQuartz", - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11)); - GT_OreDictUnificator.registerOre( - OreDictNames.craftingQuartz, - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1)); - GT_OreDictUnificator.registerOre( - OreDictNames.craftingQuartz, - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10)); - GT_OreDictUnificator.registerOre( - OreDictNames.craftingQuartz, - GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11)); - GT_OreDictUnificator.registerOre("cropLemon", ItemList.FR_Lemon.get(1L)); - GT_OreDictUnificator.registerOre("cropCoffee", ItemList.IC2_CoffeeBeans.get(1L)); - GT_OreDictUnificator.registerOre("cropPotato", ItemList.Food_Raw_Potato.get(1L)); - GT_OreDictUnificator.registerOre(OrePrefixes.battery, Materials.LV, GT_ModHandler.getIC2Item("reBattery", 1L)); - GT_OreDictUnificator - .registerOre(OrePrefixes.battery, Materials.LV, GT_ModHandler.getIC2Item("chargedReBattery", 1L, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.battery, Materials.MV, GT_ModHandler.getIC2Item("advBattery", 1L, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.battery, Materials.HV, GT_ModHandler.getIC2Item("energyCrystal", 1L, 32767)); - GT_OreDictUnificator - .registerOre(OrePrefixes.battery, Materials.EV, GT_ModHandler.getIC2Item("lapotronCrystal", 1L, 32767)); - - GT_OreDictUnificator - .registerOre(OreDictNames.craftingWireCopper, GT_ModHandler.getIC2Item("insulatedCopperCableItem", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingWireGold, GT_ModHandler.getIC2Item("insulatedGoldCableItem", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingWireIron, GT_ModHandler.getIC2Item("insulatedIronCableItem", 1L)); - GT_OreDictUnificator.registerOre( - OreDictNames.craftingWireTin, - GT_ModHandler - .getIC2Item("insulatedTinCableItem", 1L, GT_ModHandler.getIC2Item("insulatedCopperCableItem", 1L))); - - GT_OreDictUnificator - .registerOre(OreDictNames.craftingRedstoneTorch, new ItemStack(Blocks.redstone_torch, 1, 32767)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingRedstoneTorch, new ItemStack(Blocks.unlit_redstone_torch, 1, 32767)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingWorkBench, new ItemStack(Blocks.crafting_table, 1)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingWorkBench, new ItemStack(GregTech_API.sBlockMachines, 1, 16)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingPiston, new ItemStack(Blocks.piston, 1, 32767)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingPiston, new ItemStack(Blocks.sticky_piston, 1, 32767)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingSafe, new ItemStack(GregTech_API.sBlockMachines, 1, 45)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingSafe, GT_ModHandler.getIC2Item("personalSafe", 1L)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingChest, new ItemStack(Blocks.chest, 1, 32767)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingChest, new ItemStack(Blocks.trapped_chest, 1, 32767)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingFurnace, new ItemStack(Blocks.furnace, 1, 32767)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingFurnace, new ItemStack(Blocks.lit_furnace, 1, 32767)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingPump, GT_ModHandler.getIC2Item("pump", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingElectromagnet, GT_ModHandler.getIC2Item("magnetizer", 1L)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingTeleporter, GT_ModHandler.getIC2Item("teleporter", 1L)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingMacerator, GT_ModHandler.getIC2Item("macerator", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingMacerator, new ItemStack(GregTech_API.sBlockMachines, 1, 50)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingExtractor, GT_ModHandler.getIC2Item("extractor", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingExtractor, new ItemStack(GregTech_API.sBlockMachines, 1, 51)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingCompressor, GT_ModHandler.getIC2Item("compressor", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingCompressor, new ItemStack(GregTech_API.sBlockMachines, 1, 52)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingRecycler, GT_ModHandler.getIC2Item("recycler", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingRecycler, new ItemStack(GregTech_API.sBlockMachines, 1, 53)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingIronFurnace, GT_ModHandler.getIC2Item("ironFurnace", 1L)); - - GT_OreDictUnificator - .registerOre(OreDictNames.craftingCentrifuge, new ItemStack(GregTech_API.sBlockMachines, 1, 62)); - - GT_OreDictUnificator - .registerOre(OreDictNames.craftingInductionFurnace, GT_ModHandler.getIC2Item("inductionFurnace", 1L)); - - GT_OreDictUnificator - .registerOre(OreDictNames.craftingElectricFurnace, GT_ModHandler.getIC2Item("electroFurnace", 1L)); - GT_OreDictUnificator - .registerOre(OreDictNames.craftingElectricFurnace, new ItemStack(GregTech_API.sBlockMachines, 1, 54)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingGenerator, GT_ModHandler.getIC2Item("generator", 1L)); - - GT_OreDictUnificator - .registerOre(OreDictNames.craftingGeothermalGenerator, GT_ModHandler.getIC2Item("geothermalGenerator", 1L)); - - GT_OreDictUnificator.registerOre(OreDictNames.craftingFeather, new ItemStack(Items.feather, 1, 32767)); - GT_OreDictUnificator.registerOre( - OreDictNames.craftingFeather, - GT_ModHandler.getModItem(TwilightForest.ID, "item.tfFeather", 1L, 32767)); - - GT_OreDictUnificator.registerOre("itemWheat", new ItemStack(Items.wheat, 1, 32767)); - GT_OreDictUnificator.registerOre("paperEmpty", new ItemStack(Items.paper, 1, 32767)); - GT_OreDictUnificator.registerOre("paperMap", new ItemStack(Items.map, 1, 32767)); - GT_OreDictUnificator.registerOre("paperMap", new ItemStack(Items.filled_map, 1, 32767)); - GT_OreDictUnificator.registerOre("bookEmpty", new ItemStack(Items.book, 1, 32767)); - GT_OreDictUnificator.registerOre("bookWritable", new ItemStack(Items.writable_book, 1, 32767)); - GT_OreDictUnificator.registerOre("bookWritten", new ItemStack(Items.written_book, 1, 32767)); - GT_OreDictUnificator.registerOre("bookEnchanted", new ItemStack(Items.enchanted_book, 1, 32767)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.book, 1, 32767)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.writable_book, 1, 32767)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.written_book, 1, 32767)); - GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.enchanted_book, 1, 32767)); - - GT_OreDictUnificator.addToBlacklist(GT_ModHandler.getIC2Item("electronicCircuit", 1L)); - GT_OreDictUnificator.addToBlacklist(GT_ModHandler.getIC2Item("advancedCircuit", 1L)); - GT_OreDictUnificator - .registerOre(OrePrefixes.circuit, Materials.LV, GT_ModHandler.getIC2Item("electronicCircuit", 1L)); - GT_OreDictUnificator - .registerOre(OrePrefixes.circuit, Materials.HV, GT_ModHandler.getIC2Item("advancedCircuit", 1L)); - - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Copper, - GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Tin, - GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 1)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Bronze, - GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 2)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Gold, - GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 3)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Iron, - GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 4)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Steel, - GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 5)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Lead, - GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 6)); - - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Osmium, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OsmiumItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Aluminium, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.AluminiumItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.StainlessSteel, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.StainlessSteelItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Tungsten, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TungstenItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Neutronium, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NeutroniumItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.TungstenSteel, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TungstenSteelItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Iridium, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IridiumItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Titanium, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitaniumItemCasing", 1L, 0)); - GT_OreDictUnificator.registerOre( - OrePrefixes.itemCasing, - Materials.Chrome, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ChromeItemCasing", 1L, 0)); - - // Fake Circuits - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.ULV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitULV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.LV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitLV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.MV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitMV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.HV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitHV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.EV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitEV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.IV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitIV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.LuV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitLuV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.ZPM, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitZPM", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.UV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.UHV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUHV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.UEV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUEV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.UIV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUIV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.UMV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUMV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.UXV, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUXV", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.circuit, - Materials.MAX, - GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitMAX", 1L)); - - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.Manasteel, - GT_ModHandler.getModItem(Botania.ID, "storage", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.Terrasteel, - GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 1)); - GT_OreDictUnificator.registerOre( - OrePrefixes.ingot, - MaterialsBotania.ElvenElementium, - GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 7)); - GT_OreDictUnificator.registerOre( - OrePrefixes.nugget, - MaterialsBotania.ElvenElementium, - GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 19)); - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.ElvenElementium, - GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 2)); - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.Livingrock, - GT_ModHandler.getModItem(Botania.ID, "livingrock", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.ingot, - MaterialsBotania.GaiaSpirit, - GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 14)); - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.Livingwood, - GT_ModHandler.getModItem(Botania.ID, "livingwood", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.Dreamwood, - GT_ModHandler.getModItem(Botania.ID, "dreamwood", 1L)); - GT_OreDictUnificator.registerOre( - OrePrefixes.gem, - MaterialsBotania.ManaDiamond, - GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 2)); - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.ManaDiamond, - GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 3)); - GT_OreDictUnificator.registerOre( - OrePrefixes.gem, - MaterialsBotania.BotaniaDragonstone, - GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 9)); - GT_OreDictUnificator.registerOre( - OrePrefixes.block, - MaterialsBotania.BotaniaDragonstone, - GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 4)); - } -} diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java b/src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java deleted file mode 100644 index 598d9e882a..0000000000 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java +++ /dev/null @@ -1,111 +0,0 @@ -package gregtech.loaders.preload; - -import gregtech.api.util.GT_Log; -import gregtech.loaders.oreprocessing.ProcessingAll; -import gregtech.loaders.oreprocessing.ProcessingBeans; -import gregtech.loaders.oreprocessing.ProcessingBlock; -import gregtech.loaders.oreprocessing.ProcessingBolt; -import gregtech.loaders.oreprocessing.ProcessingCell; -import gregtech.loaders.oreprocessing.ProcessingCircuit; -import gregtech.loaders.oreprocessing.ProcessingCompressed; -import gregtech.loaders.oreprocessing.ProcessingCrafting; -import gregtech.loaders.oreprocessing.ProcessingCrop; -import gregtech.loaders.oreprocessing.ProcessingCrushedOre; -import gregtech.loaders.oreprocessing.ProcessingCrystallized; -import gregtech.loaders.oreprocessing.ProcessingDirty; -import gregtech.loaders.oreprocessing.ProcessingDust; -import gregtech.loaders.oreprocessing.ProcessingDye; -import gregtech.loaders.oreprocessing.ProcessingFineWire; -import gregtech.loaders.oreprocessing.ProcessingFoil; -import gregtech.loaders.oreprocessing.ProcessingFood; -import gregtech.loaders.oreprocessing.ProcessingGear; -import gregtech.loaders.oreprocessing.ProcessingGem; -import gregtech.loaders.oreprocessing.ProcessingIngot; -import gregtech.loaders.oreprocessing.ProcessingItem; -import gregtech.loaders.oreprocessing.ProcessingLens; -import gregtech.loaders.oreprocessing.ProcessingLog; -import gregtech.loaders.oreprocessing.ProcessingNugget; -import gregtech.loaders.oreprocessing.ProcessingOre; -import gregtech.loaders.oreprocessing.ProcessingOrePoor; -import gregtech.loaders.oreprocessing.ProcessingOreSmelting; -import gregtech.loaders.oreprocessing.ProcessingPipe; -import gregtech.loaders.oreprocessing.ProcessingPlank; -import gregtech.loaders.oreprocessing.ProcessingPlate; -import gregtech.loaders.oreprocessing.ProcessingPure; -import gregtech.loaders.oreprocessing.ProcessingRawOre; -import gregtech.loaders.oreprocessing.ProcessingRecycling; -import gregtech.loaders.oreprocessing.ProcessingRotor; -import gregtech.loaders.oreprocessing.ProcessingRound; -import gregtech.loaders.oreprocessing.ProcessingSand; -import gregtech.loaders.oreprocessing.ProcessingSaplings; -import gregtech.loaders.oreprocessing.ProcessingScrew; -import gregtech.loaders.oreprocessing.ProcessingShaping; -import gregtech.loaders.oreprocessing.ProcessingSlab; -import gregtech.loaders.oreprocessing.ProcessingStick; -import gregtech.loaders.oreprocessing.ProcessingStickLong; -import gregtech.loaders.oreprocessing.ProcessingStone; -import gregtech.loaders.oreprocessing.ProcessingStoneCobble; -import gregtech.loaders.oreprocessing.ProcessingStoneVarious; -import gregtech.loaders.oreprocessing.ProcessingToolHead; -import gregtech.loaders.oreprocessing.ProcessingToolOther; -import gregtech.loaders.oreprocessing.ProcessingTransforming; -import gregtech.loaders.oreprocessing.ProcessingWax; -import gregtech.loaders.oreprocessing.ProcessingWire; - -public class GT_Loader_OreProcessing implements Runnable { - - @Override - public void run() { - GT_Log.out.println("GT_Mod: Register Ore processing."); - new ProcessingAll(); - new ProcessingBeans(); - new ProcessingBlock(); - new ProcessingBolt(); - new ProcessingCell(); - new ProcessingCircuit(); - new ProcessingCompressed(); - new ProcessingCrafting(); - new ProcessingCrop(); - new ProcessingCrushedOre(); - new ProcessingCrystallized(); - new ProcessingDirty(); - new ProcessingDust(); - new ProcessingDye(); - new ProcessingFoil(); - new ProcessingFineWire(); - new ProcessingFood(); - new ProcessingLens(); - new ProcessingShaping(); - new ProcessingGem(); - new ProcessingGear(); - new ProcessingIngot(); - new ProcessingItem(); - new ProcessingLog(); - new ProcessingTransforming(); - new ProcessingNugget(); - new ProcessingOre(); - new ProcessingOrePoor(); - new ProcessingOreSmelting(); - new ProcessingRawOre(); - new ProcessingPipe(); - new ProcessingPlank(); - new ProcessingPlate(); - new ProcessingPure(); - new ProcessingRecycling(); - new ProcessingRound(); - new ProcessingRotor(); - new ProcessingSand(); - new ProcessingSaplings(); - new ProcessingScrew(); - new ProcessingSlab(); - new ProcessingStick(); - new ProcessingStickLong(); - new ProcessingStone(); - new ProcessingStoneCobble(); - new ProcessingStoneVarious(); - new ProcessingToolHead(); - new ProcessingToolOther(); - new ProcessingWax(); - new ProcessingWire(); - } -} diff --git a/src/main/java/gregtech/loaders/preload/GT_PreLoad.java b/src/main/java/gregtech/loaders/preload/GT_PreLoad.java deleted file mode 100644 index a2e6137cff..0000000000 --- a/src/main/java/gregtech/loaders/preload/GT_PreLoad.java +++ /dev/null @@ -1,654 +0,0 @@ -package gregtech.loaders.preload; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.Mods.CraftTweaker; -import static gregtech.api.enums.Mods.GalacticraftCore; -import static gregtech.api.enums.Mods.GregTech; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.PrintStream; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.minecraft.client.Minecraft; -import net.minecraft.init.Blocks; -import net.minecraft.launchwrapper.Launch; -import net.minecraftforge.common.config.Configuration; - -import org.apache.commons.lang3.StringUtils; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.LoadController; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.ModContainer; -import cpw.mods.fml.common.discovery.ASMDataTable; -import cpw.mods.fml.common.discovery.ModDiscoverer; -import gregtech.GT_Mod; -import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.recipe.RecipeCategory; -import gregtech.api.recipe.RecipeCategoryHolder; -import gregtech.api.recipe.RecipeCategorySetting; -import gregtech.api.util.GT_Config; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_RecipeBuilder; -import gregtech.api.util.GT_Utility; -import gregtech.common.GT_Proxy; -import gregtech.common.config.client.ConfigColorModulation; -import gregtech.common.config.client.ConfigInterface; -import gregtech.common.config.client.ConfigRender; -import gregtech.common.config.client.ConfigWaila; -import gregtech.common.config.gregtech.ConfigDebug; -import gregtech.common.config.gregtech.ConfigFeatures; -import gregtech.common.config.gregtech.ConfigGeneral; -import gregtech.common.config.gregtech.ConfigMachines; -import gregtech.common.config.gregtech.ConfigOreDropBehavior; -import gregtech.common.config.gregtech.ConfigPollution; -import gregtech.common.tileentities.machines.long_distance.GT_MetaTileEntity_LongDistancePipelineBase; -import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Cleanroom; - -public class GT_PreLoad { - - public static void sortToTheEnd() { - try { - GT_FML_LOGGER.info("GT_Mod: Sorting GregTech to the end of the Mod List for further processing."); - LoadController tLoadController = (LoadController) GT_Utility - .getFieldContent(Loader.instance(), "modController", true, true); - assert tLoadController != null; - List tModList = tLoadController.getActiveModList(); - List tNewModsList = new ArrayList<>(); - ModContainer tGregTech = null; - short tModList_sS = (short) tModList.size(); - for (short i = 0; i < tModList_sS; i = (short) (i + 1)) { - ModContainer tMod = tModList.get(i); - if (tMod.getModId() - .equalsIgnoreCase(GregTech.ID)) { - tGregTech = tMod; - } else { - tNewModsList.add(tMod); - } - } - if (tGregTech != null) { - tNewModsList.add(tGregTech); - } - Objects.requireNonNull(GT_Utility.getField(tLoadController, "activeModList", true, true)) - .set(tLoadController, tNewModsList); - } catch (Throwable e) { - GT_Mod.logStackTrace(e); - } - } - - public static void initLocalization(File languageDir) { - GT_FML_LOGGER.info("GT_Mod: Generating Lang-File"); - - if (FMLCommonHandler.instance() - .getEffectiveSide() - .isClient()) { - String userLang = Minecraft.getMinecraft() - .getLanguageManager() - .getCurrentLanguage() - .getLanguageCode(); - GT_FML_LOGGER.info("User lang is " + userLang); - if (userLang.equals("en_US")) { - GT_FML_LOGGER.info("Loading GregTech.lang"); - GT_LanguageManager.isEN_US = true; - GT_LanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang")); - } else { - String l10nFileName = "GregTech_" + userLang + ".lang"; - File l10nFile = new File(languageDir, l10nFileName); - if (l10nFile.isFile()) { - GT_FML_LOGGER.info("Loading l10n file: " + l10nFileName); - GT_LanguageManager.sEnglishFile = new Configuration(l10nFile); - } else { - GT_FML_LOGGER.info("Cannot find l10n file " + l10nFileName + ", fallback to GregTech.lang"); - GT_LanguageManager.isEN_US = true; - GT_LanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang")); - } - } - } else { - GT_LanguageManager.isEN_US = true; - GT_LanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang")); - } - GT_LanguageManager.sEnglishFile.load(); - - Materials.getMaterialsMap() - .values() - .parallelStream() - .filter(Objects::nonNull) - .forEach( - aMaterial -> aMaterial.mLocalizedName = GT_LanguageManager - .addStringLocalization("Material." + aMaterial.mName.toLowerCase(), aMaterial.mDefaultLocalName)); - } - - public static void getConfiguration(File configDir) { - File tFile = new File(new File(configDir, "GregTech"), "IDs.cfg"); - GT_Config.sConfigFileIDs = new Configuration(tFile); - GT_Config.sConfigFileIDs.load(); - GT_Config.sConfigFileIDs.save(); - - tFile = new File(new File(configDir, "GregTech"), "Cleanroom.cfg"); - GT_Config.cleanroomFile = new Configuration(tFile); - GT_Config.cleanroomFile.load(); - GT_Config.cleanroomFile.save(); - - tFile = new File(new File(configDir, "GregTech"), "UndergroundFluids.cfg"); - GT_Config.undergroundFluidsFile = new Configuration(tFile); - GT_Config.undergroundFluidsFile.load(); - GT_Config.undergroundFluidsFile.save(); - - GregTech_API.NEIClientFIle = new GT_Config( - new Configuration(new File(new File(configDir, "GregTech"), "NEIClient.cfg"))); - - } - - public static void createLogFiles(File parentFile) { - GT_Log.mLogFile = new File(parentFile, "logs/GregTech.log"); - if (!GT_Log.mLogFile.exists()) { - try { - GT_Log.mLogFile.createNewFile(); - } catch (Throwable ignored) {} - } - try { - GT_Log.out = GT_Log.err = new PrintStream(GT_Log.mLogFile); - } catch (FileNotFoundException ignored) {} - - if (ConfigGeneral.loggingOreDict) { - GT_Log.mOreDictLogFile = new File(parentFile, "logs/OreDict.log"); - if (!GT_Log.mOreDictLogFile.exists()) { - try { - GT_Log.mOreDictLogFile.createNewFile(); - } catch (Throwable ignored) {} - } - List tList = ((GT_Log.LogBuffer) GT_Log.ore).mBufferedOreDictLog; - try { - GT_Log.ore = new PrintStream(GT_Log.mOreDictLogFile); - } catch (Throwable ignored) {} - GT_Log.ore.println("******************************************************************************"); - GT_Log.ore.println("* This is the complete log of the GT5-Unofficial OreDictionary Handler. It *"); - GT_Log.ore.println("* processes all OreDictionary entries and can sometimes cause errors. All *"); - GT_Log.ore.println("* entries and errors are being logged. If you see an error please raise an *"); - GT_Log.ore.println("* issue at https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues. *"); - GT_Log.ore.println("******************************************************************************"); - tList.forEach(GT_Log.ore::println); - } - if (ConfigGeneral.loggingExplosions) { - GT_Log.mExplosionLog = new File(parentFile, "logs/Explosion.log"); - if (!GT_Log.mExplosionLog.exists()) { - try { - GT_Log.mExplosionLog.createNewFile(); - } catch (Throwable ignored) {} - } - try { - GT_Log.exp = new PrintStream(GT_Log.mExplosionLog); - } catch (Throwable ignored) {} - } - - if (ConfigGeneral.loggingPlayerActicity) { - GT_Log.mPlayerActivityLogFile = new File(parentFile, "logs/PlayerActivity.log"); - if (!GT_Log.mPlayerActivityLogFile.exists()) { - try { - GT_Log.mPlayerActivityLogFile.createNewFile(); - } catch (Throwable ignored) {} - } - try { - GT_Log.pal = new PrintStream(GT_Log.mPlayerActivityLogFile); - } catch (Throwable ignored) {} - } - } - - public static void runMineTweakerCompat() { - if (!CraftTweaker.isModLoaded()) return; - - GT_FML_LOGGER.info("preReader"); - final List oreTags = new ArrayList<>(); - final File globalDir = new File("scripts"); - if (globalDir.exists()) { - final List scripts = new ArrayList<>(); - for (File file : Objects.requireNonNull(globalDir.listFiles())) { - if (file.getName() - .endsWith(".zs")) { - try (BufferedReader br = new BufferedReader(new FileReader(file))) { - String line; - while ((line = br.readLine()) != null) { - scripts.add(line); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - String pattern1 = "<"; - String pattern2 = ">"; - - Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2)); - for (String text : scripts) { - Matcher m = p.matcher(text); - while (m.find()) { - String hit = m.group(1); - if (hit.startsWith("ore:")) { - hit = hit.substring(4); - if (!oreTags.contains(hit)) oreTags.add(hit); - } else if (hit.startsWith("gregtech:gt.metaitem.0")) { - hit = hit.substring(22); - int mIt = Integer.parseInt(hit.substring(0, 1)); - if (mIt > 0) { - int meta = 0; - try { - hit = hit.substring(2); - meta = Integer.parseInt(hit); - } catch (Exception e) { - GT_FML_LOGGER.info("parseError: " + hit); - } - if (meta > 0 && meta < 32000) { - int prefix = meta / 1000; - int material = meta % 1000; - String tag = ""; - String[] tags = new String[] {}; - if (mIt == 1) tags = new String[] { "dustTiny", "dustSmall", "dust", "dustImpure", - "dustPure", "crushed", "crushedPurified", "crushedCentrifuged", "gem", "nugget", - null, "ingot", "ingotHot", "ingotDouble", "ingotTriple", "ingotQuadruple", - "ingotQuintuple", "plate", "plateDouble", "plateTriple", "plateQuadruple", - "plateQuintuple", "plateDense", "stick", "lens", "round", "bolt", "screw", "ring", - "foil", "cell", "cellPlasma", "cellMolten", "rawOre" }; - if (mIt == 2) tags = new String[] { "toolHeadSword", "toolHeadPickaxe", - "toolHeadShovel", "toolHeadAxe", "toolHeadHoe", "toolHeadHammer", "toolHeadFile", - "toolHeadSaw", "toolHeadDrill", "toolHeadChainsaw", "toolHeadWrench", - "toolHeadUniversalSpade", "toolHeadSense", "toolHeadPlow", "toolHeadArrow", - "toolHeadBuzzSaw", "turbineBlade", null, null, "wireFine", "gearGtSmall", "rotor", - "stickLong", "springSmall", "spring", "arrowGtWood", "arrowGtPlastic", "gemChipped", - "gemFlawed", "gemFlawless", "gemExquisite", "gearGt" }; - if (mIt == 3) tags = new String[] { "itemCasing", "nanite" }; - if (tags.length > prefix) tag = tags[prefix]; - if (GregTech_API.sGeneratedMaterials[material] != null) { - tag += GregTech_API.sGeneratedMaterials[material].mName; - if (!oreTags.contains(tag)) oreTags.add(tag); - } else if (material > 0) { - GT_FML_LOGGER.info("MaterialDisabled: " + material + " " + m.group(1)); - } - } - } - } - } - } - } - - final String[] preS = new String[] { "dustTiny", "dustSmall", "dust", "dustImpure", "dustPure", "crushed", - "crushedPurified", "crushedCentrifuged", "gem", "nugget", "ingot", "ingotHot", "ingotDouble", "ingotTriple", - "ingotQuadruple", "ingotQuintuple", "plate", "plateDouble", "plateTriple", "plateQuadruple", - "plateQuintuple", "plateDense", "stick", "lens", "round", "bolt", "screw", "ring", "foil", "cell", - "cellPlasma", "toolHeadSword", "toolHeadPickaxe", "toolHeadShovel", "toolHeadAxe", "toolHeadHoe", - "toolHeadHammer", "toolHeadFile", "toolHeadSaw", "toolHeadDrill", "toolHeadChainsaw", "toolHeadWrench", - "toolHeadUniversalSpade", "toolHeadSense", "toolHeadPlow", "toolHeadArrow", "toolHeadBuzzSaw", - "turbineBlade", "wireFine", "gearGtSmall", "rotor", "stickLong", "springSmall", "spring", "arrowGtWood", - "arrowGtPlastic", "gemChipped", "gemFlawed", "gemFlawless", "gemExquisite", "gearGt", "nanite", - "cellMolten", "rawOre" }; - - List mMTTags = new ArrayList<>(); - oreTags.stream() - .filter(test -> StringUtils.startsWithAny(test, preS)) - .forEach(test -> { - mMTTags.add(test); - if (GT_Values.D1) GT_FML_LOGGER.info("oretag: " + test); - }); - - GT_FML_LOGGER.info("reenableMetaItems"); - - for (String reEnable : mMTTags) { - OrePrefixes tPrefix = OrePrefixes.getOrePrefix(reEnable); - if (tPrefix != null) { - Materials tName = Materials.get(reEnable.replaceFirst(tPrefix.toString(), "")); - if (tName != null) { - tPrefix.mDisabledItems.remove(tName); - tPrefix.mGeneratedItems.add(tName); - if (tPrefix == OrePrefixes.screw) { - OrePrefixes.bolt.mDisabledItems.remove(tName); - OrePrefixes.bolt.mGeneratedItems.add(tName); - OrePrefixes.stick.mDisabledItems.remove(tName); - OrePrefixes.stick.mGeneratedItems.add(tName); - } - if (tPrefix == OrePrefixes.round) { - OrePrefixes.nugget.mDisabledItems.remove(tName); - OrePrefixes.nugget.mGeneratedItems.add(tName); - } - if (tPrefix == OrePrefixes.spring) { - OrePrefixes.stickLong.mDisabledItems.remove(tName); - OrePrefixes.stickLong.mGeneratedItems.add(tName); - OrePrefixes.stick.mDisabledItems.remove(tName); - OrePrefixes.stick.mGeneratedItems.add(tName); - } - if (tPrefix == OrePrefixes.springSmall) { - OrePrefixes.stick.mDisabledItems.remove(tName); - OrePrefixes.stick.mGeneratedItems.add(tName); - } - if (tPrefix == OrePrefixes.stickLong) { - OrePrefixes.stick.mDisabledItems.remove(tName); - OrePrefixes.stick.mGeneratedItems.add(tName); - } - if (tPrefix == OrePrefixes.rotor) { - OrePrefixes.ring.mDisabledItems.remove(tName); - OrePrefixes.ring.mGeneratedItems.add(tName); - } - } else { - GT_FML_LOGGER.info("noMaterial " + reEnable); - } - } else { - GT_FML_LOGGER.info("noPrefix " + reEnable); - } - } - } - - public static void adjustScrap() { - GT_FML_LOGGER.info("GT_Mod: Removing all original Scrapbox Drops."); - try { - Objects.requireNonNull(GT_Utility.getField("ic2.core.item.ItemScrapbox$Drop", "topChance", true, true)) - .set(null, 0); - ((List) Objects.requireNonNull( - GT_Utility.getFieldContent( - GT_Utility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true), - "drops", - true, - true))).clear(); - } catch (Throwable e) { - if (GT_Values.D1) { - e.printStackTrace(GT_Log.err); - } - } - GT_Log.out.println("GT_Mod: Adding Scrap with a Weight of 200.0F to the Scrapbox Drops."); - GT_ModHandler.addScrapboxDrop(200.0F, GT_ModHandler.getIC2Item("scrap", 1L)); - } - - public static void loadConfig() { - // general - GT_Values.D1 = ConfigDebug.D1; - GT_Values.D2 = ConfigDebug.D2; - GT_Values.allow_broken_recipemap = ConfigDebug.allowBrokenRecipeMap; - GT_Values.debugCleanroom = ConfigDebug.debugCleanroom; - GT_Values.debugDriller = ConfigDebug.debugDriller; - GT_Values.debugWorldGen = ConfigDebug.debugWorldgen; - GT_Values.debugOrevein = ConfigDebug.debugOrevein; - GT_Values.debugSmallOres = ConfigDebug.debugSmallOres; - GT_Values.debugStones = ConfigDebug.debugStones; - GT_Values.debugBlockMiner = ConfigDebug.debugBlockMiner; - GT_Values.debugBlockPump = ConfigDebug.debugBlockPump; - GT_Values.debugEntityCramming = ConfigDebug.debugEntityCramming; - GT_Values.debugWorldData = ConfigDebug.debugWorldData; - GT_Values.oreveinPercentage = ConfigGeneral.oreveinPercentage; - GT_Values.oreveinAttempts = ConfigGeneral.oreveinAttempts; - GT_Values.oreveinMaxPlacementAttempts = ConfigGeneral.oreveinMaxPlacementAttempts; - GT_Values.oreveinPlacerOres = ConfigGeneral.oreveinPlacerOres; - GT_Values.oreveinPlacerOresMultiplier = ConfigGeneral.oreveinPlacerOresMultiplier; - GregTech_API.TICKS_FOR_LAG_AVERAGING = ConfigGeneral.ticksForLagAveraging; - GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING = ConfigGeneral.millisecondThesholdUntilLagWarning; - GregTech_API.sTimber = ConfigGeneral.timber; - GregTech_API.sDrinksAlwaysDrinkable = ConfigGeneral.drinksAlwaysDrinkable; - GregTech_API.sDoShowAllItemsInCreative = ConfigGeneral.doShowAllItemsInCreative; - GregTech_API.sMultiThreadedSounds = ConfigGeneral.multiThreadedSounds; - GT_Mod.gregtechproxy.mMaxEqualEntitiesAtOneSpot = ConfigGeneral.maxEqualEntitiesAtOneSpot; - GT_Mod.gregtechproxy.mFlintChance = ConfigGeneral.flintChance; - GT_Mod.gregtechproxy.mItemDespawnTime = ConfigGeneral.itemDespawnTime; - GT_Mod.gregtechproxy.mAllowSmallBoilerAutomation = ConfigGeneral.allowSmallBoilerAutomation; - GT_Mod.gregtechproxy.mDisableVanillaOres = gregtech.common.config.worldgen.ConfigGeneral.disableVanillaOres; - GT_Mod.gregtechproxy.mIncreaseDungeonLoot = ConfigGeneral.increaseDungeonLoot; - GT_Mod.gregtechproxy.mAxeWhenAdventure = ConfigGeneral.axeWhenAdventure; - GT_Mod.gregtechproxy.mSurvivalIntoAdventure = ConfigGeneral.survivalIntoAdventure; - GT_Mod.gregtechproxy.mHungerEffect = ConfigGeneral.hungerEffect; - GT_Mod.gregtechproxy.mInventoryUnification = ConfigGeneral.inventoryUnification; - GT_Mod.gregtechproxy.mGTBees = ConfigGeneral.GTBees; - GT_Mod.gregtechproxy.mCraftingUnification = ConfigGeneral.craftingUnification; - GT_Mod.gregtechproxy.mNerfedWoodPlank = ConfigGeneral.nerfedWoodPlank; - GT_Mod.gregtechproxy.mNerfedVanillaTools = ConfigGeneral.nerfedVanillaTools; - GT_Mod.gregtechproxy.mAchievements = ConfigGeneral.achievements; - GT_Mod.gregtechproxy.mHideUnusedOres = ConfigGeneral.hideUnusedOres; - GT_Mod.gregtechproxy.mEnableAllMaterials = ConfigGeneral.enableAllMaterials; - GT_Mod.gregtechproxy.mExplosionItemDrop = ConfigGeneral.explosionItemDrop; - GT_Mod.gregtechproxy.mEnableCleanroom = ConfigGeneral.enableCleanroom; - GT_Mod.gregtechproxy.mLowGravProcessing = GalacticraftCore.isModLoaded() && ConfigGeneral.lowGravProcessing; - GT_Mod.gregtechproxy.mCropNeedBlock = ConfigGeneral.cropNeedBlock; - GT_Mod.gregtechproxy.mAMHInteraction = ConfigGeneral.autoMaintenaceHatchesInteraction; - GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre = ConfigGeneral.mixedOreOnlyYieldsTwoThirdsOfPureOre; - GT_Mod.gregtechproxy.mRichOreYieldMultiplier = ConfigGeneral.richOreYieldMultiplier; - GT_Mod.gregtechproxy.mNetherOreYieldMultiplier = ConfigGeneral.netherOreYieldMultiplier; - GT_Mod.gregtechproxy.mEndOreYieldMultiplier = ConfigGeneral.endOreYieldMultiplier; - GT_Mod.gregtechproxy.gt6Pipe = ConfigGeneral.gt6Pipe; - GT_Mod.gregtechproxy.gt6Cable = ConfigGeneral.gt6Cable; - GT_Mod.gregtechproxy.ic2EnergySourceCompat = ConfigGeneral.ic2EnergySourceCompat; - GT_Mod.gregtechproxy.costlyCableConnection = ConfigGeneral.costlyCableConnection; - GT_Mod.gregtechproxy.crashOnNullRecipeInput = ConfigGeneral.crashOnNullRecipeInput; - if ((boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) { - GT_Mod.gregtechproxy.crashOnNullRecipeInput = false; // Use flags in GT_RecipeBuilder instead! - } - GT_LanguageManager.i18nPlaceholder = ConfigGeneral.i18nPlaceholder; - GT_MetaTileEntity_LongDistancePipelineBase.minimalDistancePoints = ConfigGeneral.minimalDistancePoints; - GT_Values.mCTMEnabledBlock.addAll(Arrays.asList(ConfigGeneral.CTMWhitelist)); - GT_Values.mCTMDisabledBlock.addAll(Arrays.asList(ConfigGeneral.CTMBlacklist)); - if (ConfigGeneral.harderMobSpawner) { - Blocks.mob_spawner.setHardness(500.0F) - .setResistance(6000000.0F); - } - - // machines - GT_Values.ticksBetweenSounds = ConfigMachines.ticksBetweenSounds; - GT_Values.blacklistedTileEntiyClassNamesForWA = ConfigMachines.blacklistedTileEntiyClassNamesForWA; - GT_Values.cleanroomGlass = ConfigMachines.cleanroomGlass; - GT_Values.enableChunkloaders = ConfigMachines.enableChunkloaders; - GT_Values.alwaysReloadChunkloaders = ConfigMachines.alwaysReloadChunkloaders; - GT_Values.debugChunkloaders = ConfigDebug.debugChunkloaders; - GT_Values.disableDigitalChestsExternalAccess = ConfigMachines.disableDigitalChestsExternalAccess; - GT_Values.enableMultiTileEntities = ConfigMachines.enableMultiTileEntities - || (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); - GregTech_API.sMachineExplosions = ConfigMachines.machineExplosions; - GregTech_API.sMachineFlammable = ConfigMachines.machineFlammable; - GregTech_API.sMachineNonWrenchExplosions = ConfigMachines.machineNonWrenchExplosions; - GregTech_API.sMachineWireFire = ConfigMachines.machineWireFire; - GregTech_API.sMachineFireExplosions = ConfigMachines.machineFireExplosions; - GregTech_API.sMachineRainExplosions = ConfigMachines.machineRainExplosions; - GregTech_API.sMachineThunderExplosions = ConfigMachines.machineThunderExplosions; - GregTech_API.sColoredGUI = ConfigMachines.coloredGUI; - GregTech_API.sMachineMetalGUI = ConfigMachines.machineMetalGUI; - // Implementation for this is actually handled in NewHorizonsCoreMod in MainRegistry.java! - GregTech_API.sUseMachineMetal = ConfigMachines.useMachineMetal; - - // client - loadClientConfig(); - - // Pollution - GT_Mod.gregtechproxy.mPollution = ConfigPollution.pollution; - GT_Mod.gregtechproxy.mPollutionSmogLimit = ConfigPollution.pollutionSmogLimit; - GT_Mod.gregtechproxy.mPollutionPoisonLimit = ConfigPollution.pollutionPoisonLimit; - GT_Mod.gregtechproxy.mPollutionVegetationLimit = ConfigPollution.pollutionVegetationLimit; - GT_Mod.gregtechproxy.mPollutionSourRainLimit = ConfigPollution.pollutionSourRainLimit; - GT_Mod.gregtechproxy.mPollutionOnExplosion = ConfigPollution.pollutionOnExplosion; - GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond = ConfigPollution.pollutionPrimitveBlastFurnacePerSecond; - GT_Mod.gregtechproxy.mPollutionCharcoalPitPerSecond = ConfigPollution.pollutionCharcoalPitPerSecond; - GT_Mod.gregtechproxy.mPollutionEBFPerSecond = ConfigPollution.pollutionEBFPerSecond; - GT_Mod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond = ConfigPollution.pollutionLargeCombustionEnginePerSecond; - GT_Mod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond = ConfigPollution.pollutionExtremeCombustionEnginePerSecond; - GT_Mod.gregtechproxy.mPollutionImplosionCompressorPerSecond = ConfigPollution.pollutionImplosionCompressorPerSecond; - GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond = ConfigPollution.pollutionLargeBronzeBoilerPerSecond; - GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond = ConfigPollution.pollutionLargeSteelBoilerPerSecond; - GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond = ConfigPollution.pollutionLargeTitaniumBoilerPerSecond; - GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond = ConfigPollution.pollutionLargeTungstenSteelBoilerPerSecond; - GT_Mod.gregtechproxy.mPollutionReleasedByThrottle = ConfigPollution.pollutionReleasedByThrottle; - GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond = ConfigPollution.pollutionLargeGasTurbinePerSecond; - GT_Mod.gregtechproxy.mPollutionMultiSmelterPerSecond = ConfigPollution.pollutionMultiSmelterPerSecond; - GT_Mod.gregtechproxy.mPollutionPyrolyseOvenPerSecond = ConfigPollution.pollutionPyrolyseOvenPerSecond; - GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond = ConfigPollution.pollutionSmallCoalBoilerPerSecond; - GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond = ConfigPollution.pollutionHighPressureLavaBoilerPerSecond; - GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond = ConfigPollution.pollutionHighPressureCoalBoilerPerSecond; - GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond = ConfigPollution.pollutionBaseDieselGeneratorPerSecond; - double[] mPollutionDieselGeneratorReleasedByTier = ConfigPollution.pollutionDieselGeneratorReleasedByTier; - if (mPollutionDieselGeneratorReleasedByTier.length - == GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier.length) { - GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier = mPollutionDieselGeneratorReleasedByTier; - } else { - GT_FML_LOGGER - .error("The Length of the Diesel Turbine Pollution Array Config must be the same as the Default"); - } - GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond = ConfigPollution.pollutionBaseGasTurbinePerSecond; - double[] mPollutionGasTurbineReleasedByTier = ConfigPollution.pollutionGasTurbineReleasedByTier; - if (mPollutionGasTurbineReleasedByTier.length - == GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier.length) { - GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier = mPollutionGasTurbineReleasedByTier; - } else { - GT_FML_LOGGER.error("The Length of the Gas Turbine Pollution Array Config must be the same as the Default"); - } - - // cleanroom file - if (GT_Mod.gregtechproxy.mEnableCleanroom) GT_MetaTileEntity_Cleanroom.loadConfig(GT_Config.cleanroomFile); - - // underground fluids file - GT_Mod.gregtechproxy.mUndergroundOil.getConfig(GT_Config.undergroundFluidsFile, "undergroundfluid"); - - // Worldgeneration.cfg - GT_Mod.gregtechproxy.enableUndergroundGravelGen = gregtech.common.config.worldgen.ConfigGeneral.generateUndergroundGravelGen; - GT_Mod.gregtechproxy.enableUndergroundDirtGen = gregtech.common.config.worldgen.ConfigGeneral.generateUndergroundDirtGen; - GT_Mod.gregtechproxy.enableBlackGraniteOres = gregtech.common.config.worldgen.ConfigGeneral.generateBlackGraniteOres; - GT_Mod.gregtechproxy.enableRedGraniteOres = gregtech.common.config.worldgen.ConfigGeneral.generateBlackGraniteOres; - GT_Mod.gregtechproxy.enableMarbleOres = gregtech.common.config.worldgen.ConfigGeneral.generateMarbleOres; - GT_Mod.gregtechproxy.enableBasaltOres = gregtech.common.config.worldgen.ConfigGeneral.generateBasaltOres; - - // OverpoweredStuff.cfg - GregTech_API.mOutputRF = gregtech.common.config.opstuff.ConfigGeneral.outputRF; - GregTech_API.mInputRF = gregtech.common.config.opstuff.ConfigGeneral.inputRF; - GregTech_API.mEUtoRF = gregtech.common.config.opstuff.ConfigGeneral.howMuchRFWith100EUInInput; - GregTech_API.mRFtoEU = gregtech.common.config.opstuff.ConfigGeneral.howMuchEUWith100RFInInput; - GregTech_API.mRFExplosions = gregtech.common.config.opstuff.ConfigGeneral.RFExplosions; - - // MachineStats.cfg - GT_Mod.gregtechproxy.mForceFreeFace = gregtech.common.config.machinestats.ConfigMachines.forceFreeFace; - - // ore_drop_behavior - try { - GT_Log.out.println("Trying to set it to: " + ConfigOreDropBehavior.setting); - GT_Mod.gregtechproxy.oreDropSystem = GT_Proxy.OreDropSystem.valueOf(ConfigOreDropBehavior.setting);; - } catch (IllegalArgumentException e) { - GT_Log.err.println(e); - GT_Mod.gregtechproxy.oreDropSystem = GT_Proxy.OreDropSystem.FortuneItem; - } - - // features - GT_Mod.gregtechproxy.mUpgradeCount = Math.min(64, Math.max(1, ConfigFeatures.upgradeStackSize)); - for (OrePrefixes tPrefix : OrePrefixes.values()) { - if (tPrefix.mIsUsedForOreProcessing) { - tPrefix.mDefaultStackSize = ((byte) Math.min(64, Math.max(1, ConfigFeatures.maxOreStackSize))); - } else if (tPrefix == OrePrefixes.plank) { - tPrefix.mDefaultStackSize = ((byte) Math.min(64, Math.max(16, ConfigFeatures.maxPlankStackSize))); - } else if ((tPrefix == OrePrefixes.wood) || (tPrefix == OrePrefixes.treeLeaves) - || (tPrefix == OrePrefixes.treeSapling) - || (tPrefix == OrePrefixes.log)) { - tPrefix.mDefaultStackSize = ((byte) Math.min(64, Math.max(16, ConfigFeatures.maxLogStackSize))); - } else if (tPrefix.mIsUsedForBlocks) { - tPrefix.mDefaultStackSize = ((byte) Math - .min(64, Math.max(16, ConfigFeatures.maxOtherBlocksStackSize))); - } - } - - GT_RecipeBuilder.onConfigLoad(); - } - - public static void parseHex(Dyes dye, String hexString) { - dye.mRGBa[0] = Short.parseShort(hexString.substring(1, 3), 16); - dye.mRGBa[1] = Short.parseShort(hexString.substring(3, 5), 16); - dye.mRGBa[2] = Short.parseShort(hexString.substring(5), 16); - } - - public static void loadClientConfig() { - Arrays.stream(Dyes.values()) - .filter(dye -> (dye != Dyes._NULL) && (dye.mIndex < 0)) - .forEach(dye -> { - switch (dye.toString() - .toLowerCase()) { - case "cable_insulation" -> parseHex(dye, ConfigColorModulation.cableInsulation); - case "construction_foam" -> parseHex(dye, ConfigColorModulation.constructionFoam); - case "machine_metal" -> parseHex(dye, ConfigColorModulation.machineMetal); - default -> { - GT_FML_LOGGER.warn( - "unknown color modulation entry: " + dye - + ". Report this pls, as config is missing this entry being parsed in code."); - } - } - }); - GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion = ConfigRender.renderTileAmbientOcclusion; - GT_Mod.gregtechproxy.mRenderGlowTextures = ConfigRender.renderGlowTextures; - GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped = ConfigRender.renderFlippedMachinesFlipped; - GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch = ConfigRender.renderIndicatorsOnHatch; - GT_Mod.gregtechproxy.mRenderDirtParticles = ConfigRender.renderDirtParticles; - GT_Mod.gregtechproxy.mRenderPollutionFog = ConfigRender.renderPollutionFog; - GT_Mod.gregtechproxy.mRenderItemDurabilityBar = ConfigRender.renderItemDurabilityBar; - GT_Mod.gregtechproxy.mRenderItemChargeBar = ConfigRender.renderItemChargeBar; - GT_Mod.gregtechproxy.mUseBlockUpdateHandler = ConfigRender.useBlockUpdateHandler; - - GT_Mod.gregtechproxy.mCoverTabsVisible = ConfigInterface.coverTabsVisible; - GT_Mod.gregtechproxy.mCoverTabsFlipped = ConfigInterface.coverTabsFlipped; - GT_Mod.gregtechproxy.mTooltipVerbosity = ConfigInterface.tooltipVerbosity; - GT_Mod.gregtechproxy.mTooltipShiftVerbosity = ConfigInterface.tooltipShiftVerbosity; - GT_Mod.gregtechproxy.mTitleTabStyle = ConfigInterface.titleTabStyle; - - GT_Mod.gregtechproxy.mNEIRecipeSecondMode = GregTech_API.NEIClientFIle.get("nei", "RecipeSecondMode", true); - GT_Mod.gregtechproxy.mNEIRecipeOwner = GregTech_API.NEIClientFIle.get("nei", "RecipeOwner", false); - GT_Mod.gregtechproxy.mNEIRecipeOwnerStackTrace = GregTech_API.NEIClientFIle - .get("nei", "RecipeOwnerStackTrace", false); - GT_Mod.gregtechproxy.mNEIOriginalVoltage = GregTech_API.NEIClientFIle.get("nei", "OriginalVoltage", false); - - GT_Mod.gregtechproxy.recipeCategorySettings.clear(); - for (RecipeCategory recipeCategory : findRecipeCategories()) { - RecipeCategorySetting setting = RecipeCategorySetting.find( - GregTech_API.NEIClientFIle.getWithValidValues( - "nei.recipe_categories", - recipeCategory.unlocalizedName, - RecipeCategorySetting.NAMES, - RecipeCategorySetting.getDefault() - .toName())); - GT_Mod.gregtechproxy.recipeCategorySettings.put(recipeCategory, setting); - } - - GT_Mod.gregtechproxy.mWailaTransformerVoltageTier = ConfigWaila.wailaTransformerVoltageTier; - GT_Mod.gregtechproxy.wailaAverageNS = ConfigWaila.wailaAverageNS; - - GT_Mod.gregtechproxy.reloadNEICache(); - } - - private static List findRecipeCategories() { - List ret = new ArrayList<>(); - try { - Field discovererField = Loader.class.getDeclaredField("discoverer"); - discovererField.setAccessible(true); - ModDiscoverer discoverer = (ModDiscoverer) discovererField.get(Loader.instance()); - for (ASMDataTable.ASMData asmData : discoverer.getASMTable() - .getAll(RecipeCategoryHolder.class.getName())) { - try { - Object obj = Class.forName(asmData.getClassName()) - .getDeclaredField(asmData.getObjectName()) - .get(null); - if (obj instanceof RecipeCategory recipeCategory) { - ret.add(recipeCategory); - } else { - GT_FML_LOGGER.error( - "{}#{} is not an instance of RecipeCategory", - asmData.getClassName(), - asmData.getObjectName()); - } - } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { - GT_FML_LOGGER.error("Failed to find RecipeCategory"); - GT_FML_LOGGER.catching(e); - } - } - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - return ret; - } -} diff --git a/src/main/java/gregtech/loaders/preload/LoaderCircuitBehaviors.java b/src/main/java/gregtech/loaders/preload/LoaderCircuitBehaviors.java new file mode 100644 index 0000000000..8bb2300000 --- /dev/null +++ b/src/main/java/gregtech/loaders/preload/LoaderCircuitBehaviors.java @@ -0,0 +1,31 @@ +package gregtech.loaders.preload; + +import gregtech.api.util.GTLog; +import gregtech.common.redstonecircuits.CircuitBasicLogic; +import gregtech.common.redstonecircuits.CircuitBitAnd; +import gregtech.common.redstonecircuits.CircuitCombinationLock; +import gregtech.common.redstonecircuits.CircuitEquals; +import gregtech.common.redstonecircuits.CircuitPulser; +import gregtech.common.redstonecircuits.CircuitRandomizer; +import gregtech.common.redstonecircuits.CircuitRedstoneMeter; +import gregtech.common.redstonecircuits.CircuitRepeater; +import gregtech.common.redstonecircuits.CircuitTimer; + +public class LoaderCircuitBehaviors implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Register Redstone Circuit behaviours."); + new CircuitTimer(0); + new CircuitBasicLogic(1); + new CircuitRepeater(2); + new CircuitPulser(3); + new CircuitRedstoneMeter(4); + + new CircuitRandomizer(8); + + new CircuitCombinationLock(16); + new CircuitBitAnd(17); + new CircuitEquals(18); + } +} diff --git a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java new file mode 100644 index 0000000000..7bf36c1e33 --- /dev/null +++ b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java @@ -0,0 +1,2121 @@ +package gregtech.loaders.preload; + +import static gregtech.api.enums.FluidState.GAS; +import static gregtech.api.enums.FluidState.LIQUID; +import static gregtech.api.enums.FluidState.MOLTEN; +import static gregtech.api.enums.FluidState.SLURRY; +import static gregtech.api.enums.Mods.AppliedEnergistics2; +import static gregtech.api.enums.Mods.PamsHarvestCraft; +import static gregtech.api.enums.Mods.Railcraft; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.enums.Mods.TwilightForest; +import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes; +import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes; +import static gregtech.api.recipe.RecipeMaps.maceratorRecipes; +import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; +import static gregtech.api.util.GTRecipeBuilder.WILDCARD; + +import java.util.Locale; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; + +import codechicken.nei.api.API; +import cpw.mods.fml.common.event.FMLInterModComms; +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.GTMod; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsKevlar; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TierEU; +import gregtech.api.fluid.GTFluidFactory; +import gregtech.api.items.BlockLongDistancePipe; +import gregtech.api.items.GTGenericItem; +import gregtech.api.items.ItemBreederCell; +import gregtech.api.items.ItemRadioactiveCellIC; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockCasings1; +import gregtech.common.blocks.BlockCasings10; +import gregtech.common.blocks.BlockCasings11; +import gregtech.common.blocks.BlockCasings2; +import gregtech.common.blocks.BlockCasings3; +import gregtech.common.blocks.BlockCasings4; +import gregtech.common.blocks.BlockCasings5; +import gregtech.common.blocks.BlockCasings6; +import gregtech.common.blocks.BlockCasings8; +import gregtech.common.blocks.BlockCasings9; +import gregtech.common.blocks.BlockConcretes; +import gregtech.common.blocks.BlockCyclotronCoils; +import gregtech.common.blocks.BlockDrone; +import gregtech.common.blocks.BlockFrameBox; +import gregtech.common.blocks.BlockGlass1; +import gregtech.common.blocks.BlockGranites; +import gregtech.common.blocks.BlockLaser; +import gregtech.common.blocks.BlockMachines; +import gregtech.common.blocks.BlockMetal; +import gregtech.common.blocks.BlockOres; +import gregtech.common.blocks.BlockReinforced; +import gregtech.common.blocks.BlockStones; +import gregtech.common.blocks.BlockTintedIndustrialGlass; +import gregtech.common.blocks.BlockWormholeRender; +import gregtech.common.blocks.TileEntityOres; +import gregtech.common.items.ItemDepletedCell; +import gregtech.common.items.ItemFluidDisplay; +import gregtech.common.items.ItemIntegratedCircuit; +import gregtech.common.items.ItemNeutronReflector; +import gregtech.common.items.ItemTierDrone; +import gregtech.common.items.ItemVolumetricFlask; +import gregtech.common.items.ItemWirelessHeadphones; +import gregtech.common.items.MetaGeneratedItem01; +import gregtech.common.items.MetaGeneratedItem02; +import gregtech.common.items.MetaGeneratedItem03; +import gregtech.common.items.MetaGeneratedItem98; +import gregtech.common.items.MetaGeneratedItem99; +import gregtech.common.items.MetaGeneratedTool01; +import gregtech.common.tileentities.render.TileEntityDrone; +import gregtech.common.tileentities.render.TileEntityLaser; +import gregtech.common.tileentities.render.TileEntityWormhole; + +public class LoaderGTBlockFluid implements Runnable { + + @Override + public void run() { + Materials.Water.mFluid = (Materials.Ice.mFluid = GTModHandler.getWater(1000L) + .getFluid()); + Materials.Lava.mFluid = GTModHandler.getLava(1000L) + .getFluid(); + + GTLog.out.println("GTMod: Register Books."); + + GTUtility.getWrittenBook( + "Manual_Printer", + "Printer Manual V2.0", + "Gregorius Techneticies", + "This Manual explains the different Functionalities the GregTech Printing Factory has built in, which are not in NEI. Most got NEI Support now, but there is still some left without it.", + "1. Coloring Items and Blocks: You know those Crafting Recipes, which have a dye surrounded by 8 Item to dye them? Or the ones which have just one Item and one Dye in the Grid? Those two Recipe Types can be cheaply automated using the Printer.", + "The Colorization Functionality even optimizes the Recipes, which normally require 8 Items + 1 Dye to 1 Item and an 8th of the normally used Dye in Fluid Form, isn't that awesome?", + "2. Copying Books: This Task got slightly harder. The first Step is putting the written and signed Book inside the Scanner with a Data Stick ready to receive the Data.", + "Now insert the Stick into the Data Slot of the Printer and add 3 pieces of Paper together with 144 Liters of actual Ink Fluid. Water mixed and chemical Dyes won't work on Paper without messing things up!", + "You got a stack of Pages for your new Book, just put them into the Assembler with some Glue and a piece of Leather for the Binding, and you receive an identical copy of the Book, which would stack together with the original.", + "3. Renaming Items: This Functionality is no longer Part of the Printer. There is now a Name Mold for the Forming Press to imprint a Name into an Item, just rename the Mold in an Anvil and use it in the Forming Press on any Item.", + "4. Crafting of Books, Maps, Nametags etc etc etc: Those Recipes moved to other Machines, just look them up in NEI."); + + GTUtility.getWrittenBook( + "Manual_Punch_Cards", + "Punch Card Manual V0.0", + "Gregorius Techneticies", + "This Manual will explain the Functionality of the Punch Cards, once they are fully implemented. And no, they won't be like the IRL Punch Cards. This is just a current Idea Collection.", + "(i1&&i2)?o1=15:o1=0;=10", + "ignore all Whitespace Characters, use Long for saving the Numbers", + "&& || ^^ & | ^ ! ++ -- + - % / // * ** << >> >>> < > <= >= == != ~ ( ) ?: , ; ;= ;=X; = i0 i1 i2 i3 i4 i5 o0 o1 o2 o3 o4 o5 v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 m0 m1 m2 m3 m4 m5 m6 m7 m8 m9 A B C D E F", + "'0' = false, 'everything but 0' = true, '!' turns '0' into '1' and everything else into '0'", + "',' is just a separator for multiple executed Codes in a row.", + "';' means that the Program waits until the next tick before continuing. ';=10' and ';=10;' both mean that it will wait 10 Ticks instead of 1. And ';=0' or anything < 0 will default to 0.", + "If the '=' Operator is used within Brackets, it returns the value the variable has been set to.", + "The Program saves the Char Index of the current Task, the 10 Variables (which reset to 0 as soon as the Program Loop stops), the 10 Member Variables and the remaining waiting Time in its NBT.", + "A = 10, B = 11, C = 12, D = 13, E = 14, F = 15, just for Hexadecimal Space saving, since Redstone has only 4 Bits.", + "For implementing Loops you just need 1 Punch Card per Loop, these Cards can restart once they are finished, depending on how many other Cards there are in the Program Loop you inserted your Card into, since it will process them procedurally.", + "A Punch Card Processor can run up to four Loops, each with the length of seven Punch Cards, parallel.", + "Why does the Punch Card need Ink to be made, you ask? Because the empty one needs to have some lines on, and the for the punched one it prints the Code to execute in a human readable format on the Card."); + + GTUtility.getWrittenBook( + "Manual_Microwave", + "Microwave Oven Manual", + "Kitchen Industries", + "Congratulations, you inserted a random seemingly empty Book into the Microwave and these Letters appeared out of nowhere.", + "You just got a Microwave Oven and asked yourself 'why do I even need it?'. It's simple, the Microwave can cook for just 128 EU and at an insane speed. Not even a normal E-furnace can do it that fast and cheap!", + "This is the cheapest and fastest way to cook for you. That is why the Microwave Oven can be found in almost every Kitchen (see www.youwannabuyakitchen.ly).", + "Long time exposure to Microwaves can cause Cancer, but we doubt Steve lives long enough to die because of that.", + "Do not insert any Metals. It might result in an Explosion.", + "Do not dry Animals with it. It will result in a Hot Dog, no matter which Animal you put into it.", + "Do not insert inflammable Objects. The Oven will catch on Fire.", + "Do not insert Explosives such as Eggs. Just don't."); + + GTLog.out.println("GTMod: Register Items."); + + new ItemIntegratedCircuit(); + new MetaGeneratedItem01(); + new MetaGeneratedItem02(); + new MetaGeneratedItem03(); + // GT_MetaGenerated_Item_98 is initialized in GTProxy.onPostLoad() because we need to wait for fluids to be + // registered. + // Pre-initialization needs to happen before then, though, because the cell icons get deleted at some point + // between load and post-load. + MetaGeneratedItem98.preInit(); + new MetaGeneratedItem99(); + new MetaGeneratedTool01(); + new ItemFluidDisplay(); + new ItemWirelessHeadphones(); + + // Tiered recipe materials actually appear to be set in MTEBasicMachineWithRecipe, making these + // unused + ItemList.Rotor_LV.set(GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Tin, 1L)); + ItemList.Rotor_MV.set(GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Bronze, 1L)); + ItemList.Rotor_HV.set(GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1L)); + ItemList.Rotor_EV.set(GTOreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1L)); + ItemList.Rotor_IV.set(GTOreDictUnificator.get(OrePrefixes.rotor, Materials.TungstenSteel, 1L)); + + ItemList.VOLUMETRIC_FLASK.set(new ItemVolumetricFlask("Volumetric_Flask", "Volumetric flask", 1000)); + + Item tItem = (Item) GTUtility.callConstructor( + "gregtech.common.items.GT_SensorCard_Item", + 0, + null, + false, + new Object[] { "sensorcard", "GregTech Sensor Card" }); + ItemList.NC_SensorCard.set( + tItem == null ? new GTGenericItem("sensorcard", "GregTech Sensor Card", "Nuclear Control not installed") + : tItem); + + Item advSensorCard = (Item) GTUtility + .callConstructor("gregtech.common.items.GT_AdvancedSensorCard_Item", 0, null, false); + ItemList.NC_AdvancedSensorCard.set( + advSensorCard == null + ? new GTGenericItem( + "advancedsensorcard", + "GregTech Advanced Sensor Card", + "Nuclear Control not installed") + : advSensorCard); + + ItemList.Neutron_Reflector.set(new ItemNeutronReflector("neutronreflector", "Iridium Neutron Reflector", 0)); + ItemList.Reactor_Coolant_He_1 + .set(GregTechAPI.constructCoolantCellItem("60k_Helium_Coolantcell", "60k He Coolant Cell", 60000)); + ItemList.Reactor_Coolant_He_3 + .set(GregTechAPI.constructCoolantCellItem("180k_Helium_Coolantcell", "180k He Coolant Cell", 180000)); + ItemList.Reactor_Coolant_He_6 + .set(GregTechAPI.constructCoolantCellItem("360k_Helium_Coolantcell", "360k He Coolant Cell", 360000)); + ItemList.Reactor_Coolant_NaK_1 + .set(GregTechAPI.constructCoolantCellItem("60k_NaK_Coolantcell", "60k NaK Coolantcell", 60000)); + ItemList.Reactor_Coolant_NaK_3 + .set(GregTechAPI.constructCoolantCellItem("180k_NaK_Coolantcell", "180k NaK Coolantcell", 180000)); + ItemList.Reactor_Coolant_NaK_6 + .set(GregTechAPI.constructCoolantCellItem("360k_NaK_Coolantcell", "360k NaK Coolantcell", 360000)); + + ItemList.Reactor_Coolant_Sp_1 + .set(GregTechAPI.constructCoolantCellItem("180k_Space_Coolantcell", "180k Sp Coolant Cell", 180000)); + + ItemList.Reactor_Coolant_Sp_2 + .set(GregTechAPI.constructCoolantCellItem("360k_Space_Coolantcell", "360k Sp Coolant Cell", 360000)); + + ItemList.Reactor_Coolant_Sp_3 + .set(GregTechAPI.constructCoolantCellItem("540k_Space_Coolantcell", "540k Sp Coolant Cell", 540000)); + + ItemList.Reactor_Coolant_Sp_6 + .set(GregTechAPI.constructCoolantCellItem("1080k_Space_Coolantcell", "1080k Sp Coolant Cell", 1080000)); + + ItemList.GlowstoneCell.set( + new ItemBreederCell( + "glowstoneCell", + "Glowstone Fuel Rod", + "Source of sunnarium", + 3000, + 1, + 10000, + () -> ItemList.SunnariumCell.get(1))); + ItemList.SunnariumCell.set(new ItemDepletedCell("sunnariumCell", "Sunnarium Fuel Rod", 1)); + + ItemList.neutroniumHeatCapacitor.set( + GregTechAPI + .constructCoolantCellItem("neutroniumHeatCapacitor", "1G Neutronium Heat Capacitor", 1000000000)); + + ItemList.Depleted_Thorium_1.set(new ItemDepletedCell("ThoriumcellDep", "Fuel Rod (Depleted Thorium)", 1)); + ItemList.Depleted_Thorium_2 + .set(new ItemDepletedCell("Double_ThoriumcellDep", "Dual Fuel Rod (Depleted Thorium)", 1)); // TODO + // CHECK + // num + ItemList.Depleted_Thorium_4 + .set(new ItemDepletedCell("Quad_ThoriumcellDep", "Quad Fuel Rod (Depleted Thorium)", 1)); // TODO + // CHECK + // num + ItemList.ThoriumCell_1.set( + new ItemRadioactiveCellIC( + "Thoriumcell", + "Fuel Rod (Thorium)", + 1, + 50000, + 0.4F, + 0, + 0.25F, + ItemList.Depleted_Thorium_1.get(1), + false)); + ItemList.ThoriumCell_2.set( + new ItemRadioactiveCellIC( + "Double_Thoriumcell", + "Dual Fuel Rod (Thorium)", + 2, + 50000, + 0.4F, + 0, + 0.25F, + ItemList.Depleted_Thorium_2.get(1), + false)); + ItemList.ThoriumCell_4.set( + new ItemRadioactiveCellIC( + "Quad_Thoriumcell", + "Quad Fuel Rod (Thorium)", + 4, + 50000, + 0.4F, + 0, + 0.25F, + ItemList.Depleted_Thorium_4.get(1), + false)); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_Thorium_1.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lutetium, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L)) + .duration(25 * SECONDS) + .eut(48) + .addTo(thermalCentrifugeRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_Thorium_2.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3L)) + .duration(25 * SECONDS) + .eut(48) + .addTo(thermalCentrifugeRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_Thorium_4.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 6L)) + .duration(25 * SECONDS) + .eut(48) + .addTo(thermalCentrifugeRecipes); + + ItemList.Depleted_Naquadah_1.set(new ItemDepletedCell("NaquadahcellDep", "Fuel Rod (Depleted Naquadah)", 1)); + ItemList.Depleted_Naquadah_2 + .set(new ItemDepletedCell("Double_NaquadahcellDep", "Dual Fuel Rod (Depleted Naquadah)", 1)); + ItemList.Depleted_Naquadah_4 + .set(new ItemDepletedCell("Quad_NaquadahcellDep", "Quad Fuel Rod (Depleted Naquadah)", 1)); + ItemList.NaquadahCell_1.set( + new ItemRadioactiveCellIC( + "Naquadahcell", + "Fuel Rod (Naquadah)", + 1, + 100000, + 4F, + 1, + 1F, + ItemList.Depleted_Naquadah_1.get(1), + false)); + ItemList.NaquadahCell_2.set( + new ItemRadioactiveCellIC( + "Double_Naquadahcell", + "Dual Fuel Rod (Naquadah)", + 2, + 100000, + 4F, + 1, + 1F, + ItemList.Depleted_Naquadah_2.get(1), + false)); + ItemList.NaquadahCell_4.set( + new ItemRadioactiveCellIC( + "Quad_Naquadahcell", + "Quad Fuel Rod (Naquadah)", + 4, + 100000, + 4F, + 1, + 1F, + ItemList.Depleted_Naquadah_4.get(1), + false)); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_Naquadah_1.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), + GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.Naquadria, 2L), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 8L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L)) + .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) + .duration(25 * SECONDS) + .eut(TierEU.RECIPE_EV) + .addTo(centrifugeRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_Naquadah_2.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1L), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 18L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 2L)) + .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) + .duration(50 * SECONDS) + .eut(TierEU.RECIPE_EV) + .addTo(centrifugeRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_Naquadah_4.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 2L), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 8L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 38L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L)) + .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) + .duration(100 * SECONDS) + .eut(TierEU.RECIPE_EV) + .addTo(centrifugeRecipes); + + ItemList.Depleted_MNq_1.set(new ItemDepletedCell("MNqCellDep", "Fuel Rod (Depleted Nq*)", 1)); + ItemList.Depleted_MNq_2.set(new ItemDepletedCell("Double_MNqCellDep", "Dual Fuel Rod (Depleted Nq*)", 1)); + ItemList.Depleted_MNq_4.set(new ItemDepletedCell("Quad_MNqCellDep", "Quad Fuel Rod (Depleted Nq*)", 1)); + ItemList.MNqCell_1.set( + new ItemRadioactiveCellIC( + "MNqCell", + "Fuel Rod (Nq* - MOX like behaviour)", + 1, + 100000, + 4F, + 1, + 1F, + ItemList.Depleted_MNq_1.get(1), + true)); + ItemList.MNqCell_2.set( + new ItemRadioactiveCellIC( + "Double_MNqCell", + "Dual Fuel Rod (Nq* - MOX like behaviour)", + 2, + 100000, + 4F, + 1, + 1F, + ItemList.Depleted_MNq_2.get(1), + true)); + ItemList.MNqCell_4.set( + new ItemRadioactiveCellIC( + "Quad_MNqCell", + "Quad Fuel Rod (Nq* - MOX like behaviour)", + 4, + 100000, + 4F, + 1, + 1F, + ItemList.Depleted_MNq_4.get(1), + true)); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_MNq_1.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L), + GTOreDictUnificator.get(OrePrefixes.dustSmall, Materials.NaquadahEnriched, 2L), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 8L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L)) + .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) + .duration(25 * SECONDS) + .eut(TierEU.RECIPE_EV) + .addTo(centrifugeRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_MNq_2.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 1L), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 18L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 2L)) + .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) + .duration(50 * SECONDS) + .eut(TierEU.RECIPE_EV) + .addTo(centrifugeRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(ItemList.Depleted_MNq_4.get(1)) + .itemOutputs( + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 2L), + GTOreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 8L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 38L), + GTOreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L)) + .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000) + .duration(100 * SECONDS) + .eut(TierEU.RECIPE_EV) + .addTo(centrifugeRecipes); + + ItemList.Uraniumcell_1.set( + new ItemRadioactiveCellIC( + "reactorUraniumSimple", + "Fuel Rod (Uranium)", + 1, + 20000, + 2F, + 1, + 1F, + GTModHandler.getIC2Item("reactorDepletedUraniumSimple", 1), + false)); + ItemList.Uraniumcell_2.set( + new ItemRadioactiveCellIC( + "reactorUraniumDual", + "Dual Fuel Rod (Uranium)", + 2, + 20000, + 2F, + 1, + 1F, + GTModHandler.getIC2Item("reactorDepletedUraniumDual", 1), + false)); + ItemList.Uraniumcell_4.set( + new ItemRadioactiveCellIC( + "reactorUraniumQuad", + "Quad Fuel Rod (Uranium)", + 4, + 20000, + 2F, + 1, + 1F, + GTModHandler.getIC2Item("reactorDepletedUraniumQuad", 1), + false)); + ItemList.Moxcell_1.set( + new ItemRadioactiveCellIC( + "reactorMOXSimple", + "Fuel Rod (Mox)", + 1, + 10000, + 2F, + 1, + 1F, + GTModHandler.getIC2Item("reactorDepletedMOXSimple", 1), + true)); + ItemList.Moxcell_2.set( + new ItemRadioactiveCellIC( + "reactorMOXDual", + "Dual Fuel Rod (Mox)", + 2, + 10000, + 2F, + 1, + 1F, + GTModHandler.getIC2Item("reactorDepletedMOXDual", 1), + true)); + ItemList.Moxcell_4.set( + new ItemRadioactiveCellIC( + "reactorMOXQuad", + "Quad Fuel Rod (Mox)", + 4, + 10000, + 2F, + 1, + 1F, + GTModHandler.getIC2Item("reactorDepletedMOXQuad", 1), + true)); + + GTLog.out.println("GTMod: Adding Blocks."); + GregTechAPI.sBlockMachines = new BlockMachines(); + GregTechAPI.sBlockCasings1 = new BlockCasings1(); + GregTechAPI.sBlockCasings2 = new BlockCasings2(); + GregTechAPI.sBlockCasings3 = new BlockCasings3(); + GregTechAPI.sBlockCasings4 = new BlockCasings4(); + GregTechAPI.sBlockCasings5 = new BlockCasings5(); + GregTechAPI.sBlockCasings6 = new BlockCasings6(); + GregTechAPI.sBlockCasings8 = new BlockCasings8(); + GregTechAPI.sBlockCasings9 = new BlockCasings9(); + GregTechAPI.sBlockCasings10 = new BlockCasings10(); + GregTechAPI.sBlockCasings11 = new BlockCasings11(); + GregTechAPI.sBlockGranites = new BlockGranites(); + GregTechAPI.sBlockLongDistancePipes = new BlockLongDistancePipe(); + GregTechAPI.sBlockConcretes = new BlockConcretes(); + GregTechAPI.sBlockStones = new BlockStones(); + GregTechAPI.sBlockOres1 = new BlockOres(); + GregTechAPI.sBlockFrames = new BlockFrameBox(); + GregTechAPI.sDroneRender = new BlockDrone(); + GregTechAPI.sBlockGlass1 = new BlockGlass1(); + GregTechAPI.sBlockTintedGlass = new BlockTintedIndustrialGlass(); + GregTechAPI.sLaserRender = new BlockLaser(); + GregTechAPI.sWormholeRender = new BlockWormholeRender(); + + // meta ID order, DO NOT CHANGE ORDER + + GregTechAPI.sBlockMetal1 = new BlockMetal( + "gt.blockmetal1", + new Materials[] { Materials.Adamantium, Materials.Aluminium, Materials.Americium, Materials.AnnealedCopper, + Materials.Antimony, Materials.Arsenic, Materials.AstralSilver, Materials.BatteryAlloy, + Materials.Beryllium, Materials.Bismuth, Materials.BismuthBronze, Materials.BlackBronze, + Materials.BlackSteel, Materials.BlueAlloy, Materials.BlueSteel, Materials.Brass }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS1); + + GregTechAPI.sBlockMetal2 = new BlockMetal( + "gt.blockmetal2", + new Materials[] { Materials.Bronze, Materials.Caesium, Materials.Cerium, Materials.Chrome, + Materials.ChromiumDioxide, Materials.Cobalt, Materials.CobaltBrass, Materials.Copper, + Materials.Cupronickel, Materials.DamascusSteel, Materials.DarkIron, Materials.DeepIron, Materials.Desh, + Materials.Duranium, Materials.Dysprosium, Materials.Electrum }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS2); + + GregTechAPI.sBlockMetal3 = new BlockMetal( + "gt.blockmetal3", + new Materials[] { Materials.ElectrumFlux, Materials.Enderium, Materials.Erbium, Materials.Europium, + Materials.FierySteel, Materials.Gadolinium, Materials.Gallium, Materials.Holmium, Materials.HSLA, + Materials.Indium, Materials.InfusedGold, Materials.Invar, Materials.Iridium, Materials.IronMagnetic, + Materials.IronWood, Materials.Kanthal }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS3); + + GregTechAPI.sBlockMetal4 = new BlockMetal( + "gt.blockmetal4", + new Materials[] { Materials.Knightmetal, Materials.Lanthanum, Materials.Lead, Materials.Lutetium, + Materials.Magnalium, Materials.Magnesium, Materials.Manganese, Materials.MeteoricIron, + Materials.MeteoricSteel, Materials.Trinium, Materials.Mithril, Materials.Molybdenum, Materials.Naquadah, + Materials.NaquadahAlloy, Materials.NaquadahEnriched, Materials.Naquadria }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS4); + + GregTechAPI.sBlockMetal5 = new BlockMetal( + "gt.blockmetal5", + new Materials[] { Materials.Neodymium, Materials.NeodymiumMagnetic, Materials.Neutronium, + Materials.Nichrome, Materials.Nickel, Materials.Niobium, Materials.NiobiumNitride, + Materials.NiobiumTitanium, Materials.Osmiridium, Materials.Osmium, Materials.Palladium, + Materials.PigIron, Materials.Platinum, Materials.Plutonium, Materials.Plutonium241, + Materials.Praseodymium }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS5); + + GregTechAPI.sBlockMetal6 = new BlockMetal( + "gt.blockmetal6", + new Materials[] { Materials.Promethium, Materials.RedAlloy, Materials.RedSteel, Materials.RoseGold, + Materials.Rubidium, Materials.Samarium, Materials.Scandium, Materials.ShadowIron, Materials.ShadowSteel, + Materials.Silicon, Materials.Silver, Materials.SolderingAlloy, Materials.StainlessSteel, + Materials.Steel, Materials.SteelMagnetic, Materials.SterlingSilver }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS6); + + GregTechAPI.sBlockMetal7 = new BlockMetal( + "gt.blockmetal7", + new Materials[] { Materials.Sunnarium, Materials.Tantalum, Materials.Tellurium, Materials.Terbium, + Materials.Thaumium, Materials.Thorium, Materials.Thulium, Materials.Tin, Materials.TinAlloy, + Materials.Titanium, Materials.Tritanium, Materials.Tungsten, Materials.TungstenSteel, Materials.Ultimet, + Materials.Uranium, Materials.Uranium235 }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS7); + + GregTechAPI.sBlockMetal8 = new BlockMetal( + "gt.blockmetal8", + new Materials[] { Materials.Vanadium, Materials.VanadiumGallium, Materials.WroughtIron, Materials.Ytterbium, + Materials.Yttrium, Materials.YttriumBariumCuprate, Materials.Zinc, Materials.TungstenCarbide, + Materials.VanadiumSteel, Materials.HSSG, Materials.HSSE, Materials.HSSS, Materials.Steeleaf, + Materials.Ichorium, Materials.Firestone, Materials.Shadow }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS8); + + GregTechAPI.sBlockGem1 = new BlockMetal( + "gt.blockgem1", + new Materials[] { Materials.InfusedAir, Materials.Amber, Materials.Amethyst, Materials.InfusedWater, + Materials.BlueTopaz, Materials.CertusQuartz, Materials.Dilithium, Materials.EnderEye, + Materials.EnderPearl, Materials.FoolsRuby, Materials.Force, Materials.Forcicium, Materials.Forcillium, + Materials.GreenSapphire, Materials.InfusedFire, Materials.Jasper }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS9); + + GregTechAPI.sBlockGem2 = new BlockMetal( + "gt.blockgem2", + new Materials[] { Materials.Lazurite, Materials.Lignite, Materials.Monazite, Materials.Niter, + Materials.Olivine, Materials.Opal, Materials.InfusedOrder, Materials.InfusedEntropy, + Materials.TricalciumPhosphate, Materials.Quartzite, Materials.GarnetRed, Materials.Ruby, + Materials.Sapphire, Materials.Sodalite, Materials.Tanzanite, Materials.InfusedEarth }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS10); + + GregTechAPI.sBlockGem3 = new BlockMetal( + "gt.blockgem3", + new Materials[] { Materials.Topaz, Materials.Vinteum, Materials.GarnetYellow, Materials.NetherStar, + Materials.Charcoal, Materials.Blaze }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS11); + + GregTechAPI.sBlockMetal9 = new BlockMetal( + "gt.blockmetal9", + new Materials[] { Materials.Cryolite, Materials.SiliconSG, MaterialsKevlar.NickelAluminide, + MaterialsUEVplus.SpaceTime, MaterialsUEVplus.TranscendentMetal, Materials.Oriharukon, + MaterialsUEVplus.WhiteDwarfMatter, MaterialsUEVplus.BlackDwarfMatter, MaterialsUEVplus.Universium, + MaterialsUEVplus.Eternity, MaterialsUEVplus.MagMatter, MaterialsUEVplus.SixPhasedCopper }, + OrePrefixes.block, + gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS12); + + GregTechAPI.sBlockReinforced = new BlockReinforced("gt.blockreinforced"); + + GTLog.out.println("GTMod: Register TileEntities."); + + BaseMetaTileEntity tBaseMetaTileEntity = GregTechAPI.constructBaseMetaTileEntity(); + + GTLog.out.println("GTMod: Registering the BaseMetaTileEntity."); + GameRegistry.registerTileEntity(tBaseMetaTileEntity.getClass(), "BaseMetaTileEntity"); + FMLInterModComms.sendMessage( + AppliedEnergistics2.ID, + "whitelist-spatial", + tBaseMetaTileEntity.getClass() + .getName()); + + GTLog.out.println("GTMod: Registering the DroneRender."); + GameRegistry.registerTileEntity(TileEntityDrone.class, "DroneRender"); + + GTLog.out.println("GTMod: Registering the LaserRender."); + GameRegistry.registerTileEntity(TileEntityLaser.class, "LaserRenderer"); + + GTLog.out.println("GTMod: Registering the WormholeRender."); + GameRegistry.registerTileEntity(TileEntityWormhole.class, "WormholeRender"); + + GTLog.out.println("GTMod: Registering the BaseMetaPipeEntity."); + GameRegistry.registerTileEntity(BaseMetaPipeEntity.class, "BaseMetaPipeEntity"); + FMLInterModComms.sendMessage(AppliedEnergistics2.ID, "whitelist-spatial", BaseMetaPipeEntity.class.getName()); + + GTLog.out.println("GTMod: Registering the Ore TileEntity."); + GameRegistry.registerTileEntity(TileEntityOres.class, "GT_TileEntity_Ores"); + FMLInterModComms.sendMessage(AppliedEnergistics2.ID, "whitelist-spatial", TileEntityOres.class.getName()); + + GTLog.out.println("GTMod: Registering Fluids."); + Materials.ConstructionFoam.mFluid = GTUtility.getFluidForFilledItem(GTModHandler.getIC2Item("CFCell", 1L), true) + .getFluid(); + Materials.UUMatter.mFluid = GTUtility.getFluidForFilledItem(GTModHandler.getIC2Item("uuMatterCell", 1L), true) + .getFluid(); + + GTFluidFactory.builder("Air") + .withLocalizedName("Air") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Air) + .registerContainers(ItemList.Cell_Air.get(1L), ItemList.Cell_Empty.get(1L), 2000); + GTFluidFactory.builder("LiquidOxygen") + .withLocalizedName("Liquid Oxygen") + .withStateAndTemperature(GAS, 60) + .buildAndRegister() + .configureMaterials(Materials.LiquidOxygen) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.LiquidOxygen, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("LiquidNitrogen") + .withLocalizedName("Liquid Nitrogen") + .withStateAndTemperature(GAS, 77) + .buildAndRegister() + .configureMaterials(Materials.LiquidNitrogen) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.LiquidNitrogen, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("LiquidAir") + .withLocalizedName("Liquid Air") + .withStateAndTemperature(LIQUID, 77) + .buildAndRegister() + .configureMaterials(Materials.LiquidAir) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.LiquidAir, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Oxygen") + .withLocalizedName("Oxygen") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Oxygen) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Hydrogen") + .withLocalizedName("Hydrogen") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Hydrogen) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Deuterium") + .withLocalizedName("Deuterium") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Deuterium) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Deuterium, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Tritium") + .withLocalizedName("Tritium") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Tritium) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Tritium, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Helium") + .withLocalizedName("Helium") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Helium) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Helium, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Argon") + .withLocalizedName("Argon") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Argon) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Argon, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Radon") + .withLocalizedName("Radon") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Radon) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Radon, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("Fluorine") + .withLocalizedName("Fluorine") + .withStateAndTemperature(GAS, 53) + .buildAndRegister() + .configureMaterials(Materials.Fluorine) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Fluorine, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Titaniumtetrachloride") + .withLocalizedName("Titaniumtetrachloride") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Titaniumtetrachloride) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Titaniumtetrachloride, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Helium-3") + .withLocalizedName("Helium-3") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Helium_3) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Helium_3, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Methane") + .withLocalizedName("Methane") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Methane) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Methane, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Nitrogen") + .withLocalizedName("Nitrogen") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Nitrogen) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("NitrogenDioxide") + .withLocalizedName("Nitrogen Dioxide") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.NitrogenDioxide) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.NitrogenDioxide, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Steam") + .withLocalizedName("Steam") + .withStateAndTemperature(GAS, 375) + .buildAndRegister() + .configureMaterials(Materials.Water) + .registerBContainers(GTModHandler.getIC2Item("steamCell", 1), Materials.Empty.getCells(1)); + + GTValues.RA.stdBuilder() + .itemInputs(Materials.Empty.getCells(1)) + .itemOutputs(GTModHandler.getIC2Item("steamCell", 1)) + .fluidInputs(GTModHandler.getSteam(1000)) + .duration(16 * TICKS) + .eut(1) + .addTo(fluidCannerRecipes); + + Materials.Ice.mGas = Materials.Water.mGas; + Materials.Water.mGas.setTemperature(375) + .setGaseous(true); + + ItemList.sOilExtraHeavy = GTFluidFactory.of("liquid_extra_heavy_oil", "Very Heavy Oil", LIQUID, 295); + ItemList.sEpichlorhydrin = GTFluidFactory.builder("liquid_epichlorhydrin") + .withLocalizedName("Epichlorohydrin") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Epichlorohydrin) + .registerBContainers(Materials.Epichlorohydrin.getCells(1), Materials.Empty.getCells(1)) + .asFluid(); + ItemList.sDrillingFluid = GTFluidFactory.of("liquid_drillingfluid", "Drilling Fluid", LIQUID, 295); + ItemList.sToluene = GTFluidFactory.builder("liquid_toluene") + .withLocalizedName("Toluene") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Toluene) + .registerBContainers(Materials.Toluene.getCells(1), Materials.Empty.getCells(1)) + .asFluid(); + ItemList.sNitrationMixture = GTFluidFactory.builder("liquid_nitrationmixture") + .withLocalizedName("Nitration Mixture") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.NitrationMixture) + .registerBContainers(Materials.NitrationMixture.getCells(1), Materials.Empty.getCells(1)) + .asFluid(); + + GTFluidFactory.builder("liquid_heavy_oil") + .withLocalizedName("Heavy Oil") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.OilHeavy) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.OilHeavy, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_medium_oil") + .withLocalizedName("Raw Oil") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.OilMedium) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.OilMedium, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_light_oil") + .withLocalizedName("Light Oil") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.OilLight) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.OilLight, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("gas_natural_gas") + .withLocalizedName("Natural Gas") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.NatruralGas) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.NatruralGas, 1L), + ItemList.Cell_Empty.get(1L)); + ItemList.sHydricSulfur = GTFluidFactory.builder("liquid_hydricsulfur") + .withLocalizedName("Hydrogen Sulfide") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.HydricSulfide) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1L), + ItemList.Cell_Empty.get(1L)) + .asFluid(); + GTFluidFactory.builder("gas_sulfuricgas") + .withLocalizedName("Sulfuric Gas") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.SulfuricGas) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricGas, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("gas_gas") + .withLocalizedName("Refinery Gas") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Gas) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_sulfuricnaphtha") + .withLocalizedName("Sulfuric Naphtha") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.SulfuricNaphtha) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricNaphtha, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_sufluriclight_fuel") + .withLocalizedName("Sulfuric Light Fuel") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.SulfuricLightFuel) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricLightFuel, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_sulfuricheavy_fuel") + .withLocalizedName("Sulfuric Heavy Fuel") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.SulfuricHeavyFuel) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricHeavyFuel, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_naphtha") + .withLocalizedName("Naphtha") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Naphtha) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Naphtha, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_light_fuel") + .withLocalizedName("Light Fuel") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.LightFuel) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_heavy_fuel") + .withLocalizedName("Heavy Fuel") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.HeavyFuel) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("liquid_lpg") + .withLocalizedName("LPG") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.LPG) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.LPG, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("charcoal_byproducts") + .withTextureName("molten.autogenerated") + .withLocalizedName("Charcoal Byproducts") + .withColorRGBA(Materials.CharcoalByproducts.mRGBa) + .withStateAndTemperature(GAS, 775) + .buildAndRegister() + .configureMaterials(Materials.CharcoalByproducts) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.CharcoalByproducts, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("molten.bisphenol_a") + .withTextureName("molten.autogenerated") + .withLocalizedName("Molten Bisphenol A") + .withColorRGBA(Materials.BisphenolA.mRGBa) + .withStateAndTemperature(LIQUID, 432) + .buildAndRegister() + .configureMaterials(Materials.BisphenolA) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.BisphenolA, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("UUAmplifier") + .withLocalizedName("UU Amplifier") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.UUAmplifier) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.UUAmplifier, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Chlorine") + .withLocalizedName("Chlorine") + .withStateAndTemperature(GAS, 295) + .buildAndRegister() + .configureMaterials(Materials.Chlorine) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Mercury") + .withLocalizedName("Mercury") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Mercury) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Mercury, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("NitroFuel") + .withLocalizedName("Cetane-Boosted Diesel") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.NitroFuel) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.NitroFuel, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("SodiumPersulfate") + .withLocalizedName("Sodium Persulfate") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.SodiumPersulfate) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.SodiumPersulfate, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("Glyceryl") + .withLocalizedName("Glyceryl Trinitrate") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Glyceryl) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Glyceryl, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("lubricant") + .withLocalizedName("Lubricant") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Lubricant) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Lubricant, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("creosote") + .withLocalizedName("Creosote Oil") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Creosote) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Creosote, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("seedoil") + .withLocalizedName("Seed Oil") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.SeedOil) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.SeedOil, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("fishoil") + .withLocalizedName("Fish Oil") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.FishOil) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.FishOil, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("oil") + .withLocalizedName("Oil") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Oil) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Oil, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("fuel") + .withLocalizedName("Diesel") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Fuel) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("for.honey") + .withLocalizedName("Honey") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Honey) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Honey, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("biomass") + .withLocalizedName("Biomass") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Biomass) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Biomass, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("bioethanol") + .withLocalizedName("Bio Ethanol") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Ethanol) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Ethanol, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("sulfuricacid") + .withLocalizedName("Sulfuric Acid") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.SulfuricAcid) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("milk") + .withLocalizedName("Milk") + .withStateAndTemperature(LIQUID, 290) + .buildAndRegister() + .configureMaterials(Materials.Milk) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Milk, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("mcguffium") + .withLocalizedName("Mc Guffium 239") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.McGuffium239) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.McGuffium239, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("refinedGlue") + .withLocalizedName("Refined Glue") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Glue) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Glue, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("hotfryingoil") + .withLocalizedName("Hot Frying Oil") + .withStateAndTemperature(LIQUID, 400) + .buildAndRegister() + .configureMaterials(Materials.FryingOilHot) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.FryingOilHot, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("DimensionallyTranscendentResidue") + .withLocalizedName("Dimensionally Transcendent Residue") + .withStateAndTemperature(LIQUID, 2000000000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.DimensionallyTranscendentResidue) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.DimensionallyTranscendentResidue, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("ExcitedDTCC") + .withLocalizedName("Excited Dimensionally Transcendent Crude Catalyst") + .withStateAndTemperature(LIQUID, 500000000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.ExcitedDTCC) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTCC, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("ExcitedDTPC") + .withLocalizedName("Excited Dimensionally Transcendent Prosaic Catalyst") + .withStateAndTemperature(LIQUID, 500000000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.ExcitedDTPC) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTPC, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("ExcitedDTRC") + .withLocalizedName("Excited Dimensionally Transcendent Resplendent Catalyst") + .withStateAndTemperature(LIQUID, 500000000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.ExcitedDTRC) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTRC, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("ExcitedDTEC") + .withLocalizedName("Excited Dimensionally Transcendent Exotic Catalyst") + .withStateAndTemperature(LIQUID, 500000000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.ExcitedDTEC) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTEC, 1L), + ItemList.Cell_Empty.get(1L)); + GTFluidFactory.builder("ExcitedDTSC") + .withLocalizedName("Excited Dimensionally Transcendent Stellar Catalyst") + .withStateAndTemperature(LIQUID, 500000000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.ExcitedDTSC) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTSC, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder(MaterialsUEVplus.RawStarMatter.mName) + .withLocalizedName(MaterialsUEVplus.RawStarMatter.mLocalizedName) + .withStateAndTemperature(LIQUID, 10_000_000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.RawStarMatter) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.RawStarMatter, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder(MaterialsUEVplus.Space.mName) + .withLocalizedName(MaterialsUEVplus.Space.mLocalizedName) + .withStateAndTemperature(MOLTEN, 0) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.Space) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Space, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder(MaterialsUEVplus.Time.mName) + .withLocalizedName(MaterialsUEVplus.Time.mLocalizedName) + .withStateAndTemperature(MOLTEN, 0) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.Time) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Time, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("PrimordialMatter") + .withLocalizedName(MaterialsUEVplus.PrimordialMatter.mLocalizedName) + .withStateAndTemperature(LIQUID, 2_000_000_000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.PrimordialMatter) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PrimordialMatter, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("QuarkGluonPlasma") + .withLocalizedName(MaterialsUEVplus.QuarkGluonPlasma.mLocalizedName) + .withStateAndTemperature(LIQUID, 2_000_000_000) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.QuarkGluonPlasma) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.QuarkGluonPlasma, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("PhononMedium") + .withLocalizedName(MaterialsUEVplus.PhononMedium.mLocalizedName) + .withStateAndTemperature(LIQUID, 500) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.PhononMedium) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PhononMedium, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("PhononCrystalSolution") + .withLocalizedName(MaterialsUEVplus.PhononCrystalSolution.mLocalizedName) + .withStateAndTemperature(LIQUID, 500) + .buildAndRegister() + .configureMaterials(MaterialsUEVplus.PhononCrystalSolution) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PhononCrystalSolution, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("fieryblood") + .withLocalizedName("Fiery Blood") + .withStateAndTemperature(LIQUID, 6400) + .buildAndRegister() + .configureMaterials(Materials.FierySteel) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.FierySteel, 1L), + ItemList.Cell_Empty.get(1L)); + + GTFluidFactory.builder("holywater") + .withLocalizedName("Holy Water") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.HolyWater) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.HolyWater, 1L), + ItemList.Cell_Empty.get(1L)); + if (ItemList.TF_Vial_FieryBlood.get(1L) != null) { + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.FierySteel.getFluid(250L), + ItemList.TF_Vial_FieryBlood.get(1L), + ItemList.Bottle_Empty.get(1L))); + } + + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.Milk.getFluid(1000L), + GTOreDictUnificator.get(OrePrefixes.bucket, Materials.Milk, 1L), + GTOreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L))); + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.Milk.getFluid(250L), + ItemList.Bottle_Milk.get(1L), + ItemList.Bottle_Empty.get(1L))); + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.HolyWater.getFluid(250L), + ItemList.Bottle_Holy_Water.get(1L), + ItemList.Bottle_Empty.get(1L))); + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.McGuffium239.getFluid(250L), + ItemList.McGuffium_239.get(1L), + ItemList.Bottle_Empty.get(1L))); + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.Fuel.getFluid(100L), + ItemList.Tool_Lighter_Invar_Full.get(1L), + ItemList.Tool_Lighter_Invar_Empty.get(1L))); + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + Materials.Fuel.getFluid(1000L), + ItemList.Tool_Lighter_Platinum_Full.get(1L), + ItemList.Tool_Lighter_Platinum_Empty.get(1L))); + + Dyes.dyeBlack.addFluidDye(GTFluidFactory.of("squidink", "Squid Ink", LIQUID, 295)); + Dyes.dyeBlue.addFluidDye(GTFluidFactory.of("indigo", "Indigo Dye", LIQUID, 295)); + for (byte i = 0; i < Dyes.VALUES.length; i = (byte) (i + 1)) { + Dyes tDye = Dyes.VALUES[i]; + tDye.addFluidDye( + GTFluidFactory.builder( + "dye.watermixed." + tDye.name() + .toLowerCase(Locale.ENGLISH)) + .withTextureName("dyes") + .withLocalizedName("Water Mixed " + tDye.mName + " Dye") + .withColorRGBA(tDye.getRGBA()) + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .asFluid()); + tDye.addFluidDye( + GTFluidFactory.builder( + "dye.chemical." + tDye.name() + .toLowerCase(Locale.ENGLISH)) + .withTextureName("dyes") + .withLocalizedName("Chemical " + tDye.mName + " Dye") + .withColorRGBA(tDye.getRGBA()) + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerContainers(ItemList.SPRAY_CAN_DYES[i].get(1L), ItemList.Spray_Empty.get(1L), 2304) + .asFluid()); + } + GTFluidFactory.builder("ice") + .withLocalizedName("Crushed Ice") + .withStateAndTemperature(SLURRY, 270) + .buildAndRegister() + .configureMaterials(Materials.Ice) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Ice, 1L), + ItemList.Cell_Empty.get(1L)); + Materials.Water.mSolid = Materials.Ice.mSolid; + + GTFluidFactory.builder("molten.glass") + .withLocalizedName("Molten Glass") + .withStateAndTemperature(MOLTEN, 1500) + .buildAndRegister() + .configureMaterials(Materials.Glass) + .registerContainers( + GTOreDictUnificator.get(OrePrefixes.cellMolten, Materials.Glass, 1L), + ItemList.Cell_Empty.get(1L), + 144); + GTFluidFactory.builder("molten.redstone") + .withLocalizedName("Molten Redstone") + .withStateAndTemperature(MOLTEN, 500) + .buildAndRegister() + .configureMaterials(Materials.Redstone) + .registerContainers( + GTOreDictUnificator.get(OrePrefixes.cellMolten, Materials.Redstone, 1L), + ItemList.Cell_Empty.get(1L), + 144); + GTFluidFactory.builder("molten.blaze") + .withLocalizedName("Molten Blaze") + .withStateAndTemperature(MOLTEN, 6400) + .buildAndRegister() + .configureMaterials(Materials.Blaze) + .registerContainers( + GTOreDictUnificator.get(OrePrefixes.cellMolten, Materials.Blaze, 1L), + ItemList.Cell_Empty.get(1L), + 144); + GTFluidFactory.builder("wet.concrete") + .withLocalizedName("Wet Concrete") + .withStateAndTemperature(MOLTEN, 300) + .buildAndRegister() + .configureMaterials(Materials.Concrete) + .registerContainers( + GTOreDictUnificator.get(OrePrefixes.cellMolten, Materials.Concrete, 1L), + ItemList.Cell_Empty.get(1L), + 144); + + for (Materials tMaterial : Materials.values()) { + if ((tMaterial.mStandardMoltenFluid == null) && (tMaterial.contains(SubTag.SMELTING_TO_FLUID)) + && (!tMaterial.contains(SubTag.NO_SMELTING))) { + GTMod.gregtechproxy.addAutogeneratedMoltenFluid(tMaterial); + if ((tMaterial.mSmeltInto != tMaterial) && (tMaterial.mSmeltInto.mStandardMoltenFluid == null)) { + GTMod.gregtechproxy.addAutogeneratedMoltenFluid(tMaterial.mSmeltInto); + } + } + if (tMaterial.mElement != null) { + GTMod.gregtechproxy.addAutogeneratedPlasmaFluid(tMaterial); + } + if (tMaterial.hasCorrespondingFluid()) { + GTMod.gregtechproxy.addAutoGeneratedCorrespondingFluid(tMaterial); + } + if (tMaterial.hasCorrespondingGas()) { + GTMod.gregtechproxy.addAutoGeneratedCorrespondingGas(tMaterial); + } + if (tMaterial.canBeCracked()) { + GTMod.gregtechproxy.addAutoGeneratedHydroCrackedFluids(tMaterial); + GTMod.gregtechproxy.addAutoGeneratedSteamCrackedFluids(tMaterial); + } + } + + GTFluidFactory.builder("potion.awkward") + .withLocalizedName("Awkward Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.thick") + .withLocalizedName("Thick Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 32), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.mundane") + .withLocalizedName("Mundane Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 64), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.damage") + .withLocalizedName("Harming Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8204), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.damage.strong") + .withLocalizedName("Strong Harming Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8236), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.damage.splash") + .withLocalizedName("Splash Harming Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16396), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.damage.strong.splash") + .withLocalizedName("Strong Splash Harming Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16428), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.health") + .withLocalizedName("Healing Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8197), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.health.strong") + .withLocalizedName("Strong Healing Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8229), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.health.splash") + .withLocalizedName("Splash Healing Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16389), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.health.strong.splash") + .withLocalizedName("Strong Splash Healing Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16421), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.speed") + .withLocalizedName("Swiftness Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8194), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.speed.strong") + .withLocalizedName("Strong Swiftness Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8226), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.speed.long") + .withLocalizedName("Stretched Swiftness Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8258), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.speed.splash") + .withLocalizedName("Splash Swiftness Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16386), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.speed.strong.splash") + .withLocalizedName("Strong Splash Swiftness Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16418), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.speed.long.splash") + .withLocalizedName("Stretched Splash Swiftness Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16450), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.strength") + .withLocalizedName("Strength Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8201), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.strength.strong") + .withLocalizedName("Strong Strength Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8233), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.strength.long") + .withLocalizedName("Stretched Strength Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8265), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.strength.splash") + .withLocalizedName("Splash Strength Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16393), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.strength.strong.splash") + .withLocalizedName("Strong Splash Strength Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16425), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.strength.long.splash") + .withLocalizedName("Stretched Splash Strength Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16457), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.regen") + .withLocalizedName("Regenerating Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8193), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.regen.strong") + .withLocalizedName("Strong Regenerating Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8225), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.regen.long") + .withLocalizedName("Stretched Regenerating Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8257), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.regen.splash") + .withLocalizedName("Splash Regenerating Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16385), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.regen.strong.splash") + .withLocalizedName("Strong Splash Regenerating Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16417), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.regen.long.splash") + .withLocalizedName("Stretched Splash Regenerating Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16449), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.poison") + .withLocalizedName("Poisonous Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8196), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.poison.strong") + .withLocalizedName("Strong Poisonous Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8228), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.poison.long") + .withLocalizedName("Stretched Poisonous Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8260), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.poison.splash") + .withLocalizedName("Splash Poisonous Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16388), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.poison.strong.splash") + .withLocalizedName("Strong Splash Poisonous Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16420), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.poison.long.splash") + .withLocalizedName("Stretched Splash Poisonous Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16452), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.fireresistance") + .withLocalizedName("Fire Resistant Brew") + .withStateAndTemperature(LIQUID, 375) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8195), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.fireresistance.long") + .withLocalizedName("Stretched Fire Resistant Brew") + .withStateAndTemperature(LIQUID, 375) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8259), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.fireresistance.splash") + .withLocalizedName("Splash Fire Resistant Brew") + .withStateAndTemperature(LIQUID, 375) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16387), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.fireresistance.long.splash") + .withLocalizedName("Stretched Splash Fire Resistant Brew") + .withStateAndTemperature(LIQUID, 375) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16451), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.nightvision") + .withLocalizedName("Night Vision Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8198), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.nightvision.long") + .withLocalizedName("Stretched Night Vision Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8262), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.nightvision.splash") + .withLocalizedName("Splash Night Vision Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16390), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.nightvision.long.splash") + .withLocalizedName("Stretched Splash Night Vision Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16454), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.weakness") + .withLocalizedName("Weakening Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8200), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.weakness.long") + .withLocalizedName("Stretched Weakening Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8264), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.weakness.splash") + .withLocalizedName("Splash Weakening Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16392), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.weakness.long.splash") + .withLocalizedName("Stretched Splash Weakening Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16456), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.slowness") + .withLocalizedName("Lame Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8202), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.slowness.long") + .withLocalizedName("Stretched Lame Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8266), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.slowness.splash") + .withLocalizedName("Splash Lame Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16394), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.slowness.long.splash") + .withLocalizedName("Stretched Splash Lame Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16458), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.waterbreathing") + .withLocalizedName("Fishy Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8205), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.waterbreathing.long") + .withLocalizedName("Stretched Fishy Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8269), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.waterbreathing.splash") + .withLocalizedName("Splash Fishy Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16397), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.waterbreathing.long.splash") + .withLocalizedName("Stretched Splash Fishy Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16461), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.invisibility") + .withLocalizedName("Invisible Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8206), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.invisibility.long") + .withLocalizedName("Stretched Invisible Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 8270), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.invisibility.splash") + .withLocalizedName("Splash Invisible Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16398), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.invisibility.long.splash") + .withLocalizedName("Stretched Splash Invisible Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(new ItemStack(Items.potionitem, 1, 16462), ItemList.Bottle_Empty.get(1L)); + + GTFluidFactory.builder("potion.purpledrink") + .withLocalizedName("Purple Drink") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Purple_Drink.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.grapejuice") + .withLocalizedName("Grape Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Grape_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.wine") + .withLocalizedName("Wine") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Wine.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.vinegar") + .withLocalizedName("Vinegar") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .configureMaterials(Materials.Vinegar) + .registerPContainers(ItemList.Bottle_Vinegar.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.potatojuice") + .withLocalizedName("Potato Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Potato_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.vodka") + .withLocalizedName("Vodka") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Vodka.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.leninade") + .withLocalizedName("Leninade") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Leninade.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.mineralwater") + .withLocalizedName("Mineral Water") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Mineral_Water.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.saltywater") + .withLocalizedName("Salty Water") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Salty_Water.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.reedwater") + .withLocalizedName("Reed Water") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Reed_Water.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.rum") + .withLocalizedName("Rum") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Rum.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.piratebrew") + .withLocalizedName("Pirate Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Pirate_Brew.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.hopsjuice") + .withLocalizedName("Hops Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Hops_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.darkbeer") + .withLocalizedName("Dark Beer") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Dark_Beer.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.dragonblood") + .withLocalizedName("Dragon Blood") + .withStateAndTemperature(LIQUID, 375) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Dragon_Blood.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.wheatyjuice") + .withLocalizedName("Wheaty Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Wheaty_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.scotch") + .withLocalizedName("Scotch") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Scotch.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.glenmckenner") + .withLocalizedName("Glen McKenner") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Glen_McKenner.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.wheatyhopsjuice") + .withLocalizedName("Wheaty Hops Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Wheaty_Hops_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.beer") + .withLocalizedName("Beer") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Beer.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.chillysauce") + .withLocalizedName("Chilly Sauce") + .withStateAndTemperature(LIQUID, 375) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Chilly_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.hotsauce") + .withLocalizedName("Hot Sauce") + .withStateAndTemperature(LIQUID, 380) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Hot_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.diabolosauce") + .withLocalizedName("Diabolo Sauce") + .withStateAndTemperature(LIQUID, 385) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Diabolo_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.diablosauce") + .withLocalizedName("Diablo Sauce") + .withStateAndTemperature(LIQUID, 390) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Diablo_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.diablosauce.strong") + .withLocalizedName("Old Man Snitches glitched Diablo Sauce") + .withStateAndTemperature(LIQUID, 999) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Snitches_Glitch_Sauce.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.applejuice") + .withLocalizedName("Apple Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.cider") + .withLocalizedName("Cider") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Cider.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.goldenapplejuice") + .withLocalizedName("Golden Apple Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Golden_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.goldencider") + .withLocalizedName("Golden Cider") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Golden_Cider.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.idunsapplejuice") + .withLocalizedName("Idun's Apple Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Iduns_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.notchesbrew") + .withLocalizedName("Notches Brew") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Notches_Brew.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.lemonjuice") + .withLocalizedName("Lemon Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Lemon_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.limoncello") + .withLocalizedName("Limoncello") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Limoncello.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.lemonade") + .withLocalizedName("Lemonade") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Lemonade.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.alcopops") + .withLocalizedName("Alcopops") + .withStateAndTemperature(LIQUID, 275) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Alcopops.get(1L), ItemList.Bottle_Empty.get(1L)); + GTFluidFactory.builder("potion.cavejohnsonsgrenadejuice") + .withLocalizedName("Cave Johnsons Grenade Juice") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.Bottle_Cave_Johnsons_Grenade_Juice.get(1L), ItemList.Bottle_Empty.get(1L)); + + GTFluidFactory.builder("potion.darkcoffee") + .withLocalizedName("Dark Coffee") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Dark_Coffee.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.darkcafeaulait") + .withLocalizedName("Dark Cafe au lait") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Dark_Cafe_au_lait.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.coffee") + .withLocalizedName("Coffee") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Coffee.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.cafeaulait") + .withLocalizedName("Cafe au lait") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Cafe_au_lait.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.laitaucafe") + .withLocalizedName("Lait au cafe") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Lait_au_cafe.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.darkchocolatemilk") + .withLocalizedName("Bitter Chocolate Milk") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Dark_Chocolate_Milk.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.chocolatemilk") + .withLocalizedName("Chocolate Milk") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Chocolate_Milk.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.tea") + .withLocalizedName("Tea") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.sweettea") + .withLocalizedName("Sweet Tea") + .withStateAndTemperature(LIQUID, 295) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Sweet_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("potion.icetea") + .withLocalizedName("Ice Tea") + .withStateAndTemperature(LIQUID, 255) + .buildAndRegister() + .registerPContainers(ItemList.ThermosCan_Ice_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L)); + GTFluidFactory.builder("liquid_sodium") + .withLocalizedName("Liquid Sodium") + .withStateAndTemperature(LIQUID, 495) + .buildAndRegister() + .configureMaterials(Materials.Sodium) + .registerBContainers( + GTOreDictUnificator.get(OrePrefixes.cell, Materials.Sodium, 1L), + ItemList.Cell_Empty.get(1L)); + + FluidContainerRegistry.registerFluidContainer( + new FluidContainerRegistry.FluidContainerData( + FluidRegistry.getFluidStack("potion.poison.strong", 750), + ItemList.IC2_Spray_WeedEx.get(1L), + ItemList.Spray_Empty.get(1L))); + + if (!GTValues.D1) { + try { + Class.forName("codechicken.nei.api.API"); + GTLog.out.println("GTMod: Hiding certain Items from NEI."); + API.hideItem(ItemList.Display_Fluid.getWildcard(1L)); + } catch (Throwable e) { + if (GTValues.D1) { + e.printStackTrace(GTLog.err); + } + } + } + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.cobblestone, 1, WILDCARD)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.gravel, 1, WILDCARD)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L), new ItemStack(Items.flint, 1)) + .outputChances(10000, 1000) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.furnace, 1, WILDCARD)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 8L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + GTValues.RA.stdBuilder() + .itemInputs(new ItemStack(Blocks.lit_furnace, 1, WILDCARD)) + .itemOutputs(GTOreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 8L)) + .duration(20 * SECONDS) + .eut(2) + .addTo(maceratorRecipes); + + GTOreDictUnificator.set( + OrePrefixes.ingot, + Materials.FierySteel, + GTModHandler.getModItem(TwilightForest.ID, "item.fieryIngot", 1L, 0)); + GTOreDictUnificator.set( + OrePrefixes.ingot, + Materials.Knightmetal, + GTModHandler.getModItem(TwilightForest.ID, "item.knightMetal", 1L, 0)); + GTOreDictUnificator.set( + OrePrefixes.ingot, + Materials.Steeleaf, + GTModHandler.getModItem(TwilightForest.ID, "item.steeleafIngot", 1L, 0)); + GTOreDictUnificator.set( + OrePrefixes.ingot, + Materials.IronWood, + GTModHandler.getModItem(TwilightForest.ID, "item.ironwoodIngot", 1L, 0)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.InfusedAir, GTModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 0)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.InfusedFire, GTModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 1)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.InfusedWater, GTModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 2)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.InfusedEarth, GTModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 3)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.InfusedOrder, GTModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 4)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.InfusedEntropy, GTModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 5)); + GTOreDictUnificator + .set(OrePrefixes.nugget, Materials.Mercury, GTModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 5)); + GTOreDictUnificator + .set(OrePrefixes.nugget, Materials.Thaumium, GTModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 6)); + GTOreDictUnificator + .set(OrePrefixes.ingot, Materials.Thaumium, GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 2)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.Mercury, GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 3)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.Amber, GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 6)); + GTOreDictUnificator + .set(OrePrefixes.gem, Materials.Firestone, GTModHandler.getModItem(Railcraft.ID, "firestone.raw", 1L)); + + GTOreDictUnificator + .set(OrePrefixes.nugget, Materials.Void, GTModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 7)); + GTOreDictUnificator + .set(OrePrefixes.ingot, Materials.Void, GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 16)); + + GTOreDictUnificator.set( + OrePrefixes.plate, + Materials.Iron, + GTModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 0), + false, + false); + + GTOreDictUnificator.set( + OrePrefixes.plate, + Materials.Steel, + GTModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 1), + false, + false); + + GTOreDictUnificator.set( + OrePrefixes.plate, + Materials.TinAlloy, + GTModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 2), + false, + false); + + GTOreDictUnificator.set( + OrePrefixes.plate, + Materials.Copper, + GTModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 3), + false, + false); + + GTOreDictUnificator.set( + OrePrefixes.dust, + Materials.Cocoa, + GTModHandler.getModItem(PamsHarvestCraft.ID, "cocoapowderItem", 1L, 0)); + GTOreDictUnificator.set(OrePrefixes.dust, Materials.Coffee, ItemList.IC2_CoffeePowder.get(1L)); + + GregTechAPI.registerMachineBlock(GTUtility.getBlockFromStack(GTModHandler.getIC2Item("reinforcedGlass", 0)), 0); + + GregTechAPI.sSolenoidCoilCasings = new BlockCyclotronCoils(); + ItemList.TierdDrone0 + .set(new ItemTierDrone("tierdDrone0", "Drone (Level 1)", "Quadcopter Stable Small Aircraft", 1)); + ItemList.TierdDrone1 + .set(new ItemTierDrone("tierdDrone1", "Drone (Level 2)", "Dual Turbo High-Ejection Medium Aircraft", 2)); + ItemList.TierdDrone2 + .set(new ItemTierDrone("tierdDrone2", "Drone (Level 3)", "Single Engine Anti-Gravity Large Aircraft", 3)); + + } +} diff --git a/src/main/java/gregtech/loaders/preload/LoaderGTItemData.java b/src/main/java/gregtech/loaders/preload/LoaderGTItemData.java new file mode 100644 index 0000000000..778916fe38 --- /dev/null +++ b/src/main/java/gregtech/loaders/preload/LoaderGTItemData.java @@ -0,0 +1,384 @@ +package gregtech.loaders.preload; + +import static gregtech.api.enums.Mods.AppliedEnergistics2; +import static gregtech.api.enums.Mods.Forestry; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.enums.Mods.PamsHarvestCraft; +import static gregtech.api.enums.Mods.Railcraft; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.enums.Mods.TwilightForest; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.MaterialStack; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; + +public class LoaderGTItemData implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Loading Item Data Tags"); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "item.giantPick", 1L, 0), + new ItemData(Materials.Stone, 696729600L, new MaterialStack(Materials.Wood, 464486400L))); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "item.giantSword", 1L, 0), + new ItemData(Materials.Stone, 464486400L, new MaterialStack(Materials.Wood, 232243200L))); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "tile.GiantLog", 1L, 32767), + new ItemData(Materials.Wood, 232243200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "tile.GiantCobble", 1L, 32767), + new ItemData(Materials.Stone, 232243200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "tile.GiantObsidian", 1L, 32767), + new ItemData(Materials.Obsidian, 232243200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "item.minotaurAxe", 1L, 0), + new ItemData( + Materials.Diamond, + 14515200L, + new MaterialStack(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 2L))); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "item.armorShards", 1L, 0), + new ItemData(Materials.Knightmetal, 403200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(TwilightForest.ID, "item.shardCluster", 1L, 0), + new ItemData(Materials.Knightmetal, 3628800L)); + GTOreDictUnificator.addItemData(ItemList.TF_LiveRoot.get(1L), new ItemData(Materials.LiveRoot, 3628800L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10), + new ItemData(Materials.CertusQuartz, 1814400L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11), + new ItemData(Materials.NetherQuartz, 1814400L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12), + new ItemData(Materials.Fluix, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.quartz_block, 1, 32767), new ItemData(Materials.NetherQuartz, 14515200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1L, 32767), + new ItemData(Materials.CertusQuartz, 14515200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzPillar", 1L, 32767), + new ItemData(Materials.CertusQuartz, 14515200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzChiseled", 1L, 32767), + new ItemData(Materials.CertusQuartz, 14515200L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.wheat, 1, 32767), new ItemData(Materials.Wheat, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.hay_block, 1, 32767), new ItemData(Materials.Wheat, 32659200L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.snowball, 1, 32767), new ItemData(Materials.Snow, 907200L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.snow, 1, 32767), new ItemData(Materials.Snow, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.glowstone, 1, 32767), new ItemData(Materials.Glowstone, 14515200L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.redstone_lamp, 1, 32767), + new ItemData( + Materials.Glowstone, + 14515200L, + new MaterialStack(Materials.Redstone, OrePrefixes.dust.mMaterialAmount * 4L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.lit_redstone_lamp, 1, 32767), + new ItemData( + Materials.Glowstone, + 14515200L, + new MaterialStack(Materials.Redstone, OrePrefixes.dust.mMaterialAmount * 4L))); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Forestry.ID, "craftingMaterial", 1L, 5), + new ItemData(Materials.Ice, 3628800L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.ice, 1, 32767), new ItemData(Materials.Ice, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.packed_ice, 1, 32767), new ItemData(Materials.Ice, 7257600L)); + GTOreDictUnificator + .addItemData(new ItemStack(Items.clay_ball, 1, 32767), new ItemData(Materials.Clay, 1814400L)); + GTOreDictUnificator.removeItemData(new ItemStack(Blocks.clay, 1, 0)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.clay, 1, 32767), new ItemData(Materials.Clay, 7257600L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.hardened_clay, 1, 32767), new ItemData(Materials.Clay, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stained_hardened_clay, 1, 32767), new ItemData(Materials.Clay, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.brick_block, 1, 32767), new ItemData(Materials.Brick, 3628800L)); + GTOreDictUnificator + .addItemData(GTModHandler.getIC2Item("Uran238", 1L), new ItemData(Materials.Uranium, 3628800L)); + GTOreDictUnificator + .addItemData(GTModHandler.getIC2Item("Uran235", 1L), new ItemData(Materials.Uranium235, 3628800L)); + GTOreDictUnificator + .addItemData(GTModHandler.getIC2Item("Plutonium", 1L), new ItemData(Materials.Plutonium, 3628800L)); + GTOreDictUnificator + .addItemData(GTModHandler.getIC2Item("smallUran235", 1L), new ItemData(Materials.Uranium235, 403200L)); + GTOreDictUnificator + .addItemData(GTModHandler.getIC2Item("smallPlutonium", 1L), new ItemData(Materials.Plutonium, 403200L)); + GTOreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Iron.get(1L), new ItemData(Materials.Iron, 1814400L)); + GTOreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Gold.get(1L), new ItemData(Materials.Gold, 1814400L)); + GTOreDictUnificator + .addItemData(ItemList.IC2_Item_Casing_Bronze.get(1L), new ItemData(Materials.Bronze, 1814400L)); + GTOreDictUnificator + .addItemData(ItemList.IC2_Item_Casing_Copper.get(1L), new ItemData(Materials.Copper, 1814400L)); + GTOreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Tin.get(1L), new ItemData(Materials.Tin, 1814400L)); + GTOreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Lead.get(1L), new ItemData(Materials.Lead, 1814400L)); + GTOreDictUnificator + .addItemData(ItemList.IC2_Item_Casing_Steel.get(1L), new ItemData(Materials.Steel, 1814400L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Items.written_book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Items.writable_book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Items.enchanted_book, 1, 32767), new ItemData(Materials.Paper, 10886400L)); + GTOreDictUnificator.addItemData( + new ItemStack(Items.golden_apple, 1, 1), + new ItemData(Materials.Gold, OrePrefixes.block.mMaterialAmount * 8L)); + GTOreDictUnificator.addItemData( + new ItemStack(Items.golden_apple, 1, 0), + new ItemData(Materials.Gold, OrePrefixes.ingot.mMaterialAmount * 8L)); + GTOreDictUnificator.addItemData( + new ItemStack(Items.golden_carrot, 1, 0), + new ItemData(Materials.Gold, OrePrefixes.nugget.mMaterialAmount * 8L)); + GTOreDictUnificator.addItemData( + new ItemStack(Items.speckled_melon, 1, 0), + new ItemData(Materials.Gold, OrePrefixes.nugget.mMaterialAmount * 8L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.minecart, 1), new ItemData(Materials.Iron, 18144000L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.iron_door, 1), new ItemData(Materials.Iron, 21772800L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.cauldron, 1), new ItemData(Materials.Iron, 25401600L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.iron_bars, 8, 32767), new ItemData(Materials.Iron, 10886400L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SteelBars", 8L, 0), + new ItemData(Materials.Steel, 10886400L)); + GTOreDictUnificator + .addItemData(GTModHandler.getIC2Item("ironFurnace", 1L), new ItemData(Materials.Iron, 18144000L)); + GTOreDictUnificator.addItemData(ItemList.IC2_Food_Can_Empty.get(1L), new ItemData(Materials.Tin, 1814400L)); + GTOreDictUnificator.addItemData(ItemList.IC2_Fuel_Rod_Empty.get(1L), new ItemData(Materials.Iron, 3628800L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.light_weighted_pressure_plate, 1, 32767), + new ItemData(Materials.Gold, 7257600L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.heavy_weighted_pressure_plate, 1, 32767), + new ItemData(Materials.Iron, 7257600L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Railcraft.ID, "anvil", 1L, 0), + new ItemData(Materials.Steel, 108864000L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Railcraft.ID, "anvil", 1L, 1), + new ItemData(Materials.Steel, 72576000L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Railcraft.ID, "anvil", 1L, 2), + new ItemData(Materials.Steel, 36288000L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 0), new ItemData(Materials.Iron, 108864000L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 1), new ItemData(Materials.Iron, 72576000L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 2), new ItemData(Materials.Iron, 36288000L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.hopper, 1, 32767), + new ItemData(Materials.Iron, 18144000L, new MaterialStack(Materials.Wood, 29030400L))); + GTOreDictUnificator.addItemData(ItemList.Cell_Universal_Fluid.get(1L), new ItemData(Materials.Tin, 7257600L)); + GTOreDictUnificator.addItemData(ItemList.Cell_Empty.get(1L), new ItemData(Materials.Tin, 7257600L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.tripwire_hook, 1, 32767), + new ItemData( + Materials.Iron, + OrePrefixes.ring.mMaterialAmount * 2L, + new MaterialStack(Materials.Wood, 3628800L))); + GTOreDictUnificator.addItemData(ItemList.Bottle_Empty.get(1L), new ItemData(Materials.Glass, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Items.potionitem, 1, 32767), new ItemData(Materials.Glass, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stained_glass, 1, 32767), new ItemData(Materials.Glass, 3628800L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.glass, 1, 32767), new ItemData(Materials.Glass, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stained_glass_pane, 1, 32767), new ItemData(Materials.Glass, 1360800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.glass_pane, 1, 32767), new ItemData(Materials.Glass, 1360800L)); + GTOreDictUnificator.addItemData( + new ItemStack(Items.clock, 1, 32767), + new ItemData(Materials.Gold, 14515200L, new MaterialStack(Materials.Redstone, 3628800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Items.compass, 1, 32767), + new ItemData(Materials.Iron, 14515200L, new MaterialStack(Materials.Redstone, 3628800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Items.iron_horse_armor, 1, 32767), + new ItemData(Materials.Iron, 29030400L, new MaterialStack(Materials.Leather, 21772800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Items.golden_horse_armor, 1, 32767), + new ItemData(Materials.Gold, 29030400L, new MaterialStack(Materials.Leather, 21772800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Items.diamond_horse_armor, 1, 32767), + new ItemData(Materials.Diamond, 29030400L, new MaterialStack(Materials.Leather, 21772800L))); + GTOreDictUnificator + .addItemData(new ItemStack(Items.leather, 1, 32767), new ItemData(Materials.Leather, 3628800L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.beacon, 1, 32767), + new ItemData( + Materials.NetherStar, + 3628800L, + new MaterialStack(Materials.Obsidian, 10886400L), + new MaterialStack(Materials.Glass, 18144000L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.enchanting_table, 1, 32767), + new ItemData( + Materials.Diamond, + 7257600L, + new MaterialStack(Materials.Obsidian, 14515200L), + new MaterialStack(Materials.Paper, 10886400L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.ender_chest, 1, 32767), + new ItemData(Materials.EnderEye, 3628800L, new MaterialStack(Materials.Obsidian, 29030400L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.bookshelf, 1, 32767), + new ItemData(Materials.Paper, 32659200L, new MaterialStack(Materials.Wood, 21772800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.lever, 1, 32767), + new ItemData(Materials.Stone, 3628800L, new MaterialStack(Materials.Wood, 1814400L))); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.ice, 1, 32767), new ItemData(Materials.Ice, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.packed_ice, 1, 32767), new ItemData(Materials.Ice, 7257600L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.snow, 1, 32767), new ItemData(Materials.Snow, 3628800L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.snowball, 1, 32767), new ItemData(Materials.Snow, 907200L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.snow_layer, 1, 32767), new ItemData(Materials.Snow, -1L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.sand, 1, 32767), new ItemData(Materials.Sand, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.sandstone, 1, 32767), new ItemData(Materials.Sand, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_slab, 1, 0), new ItemData(Materials.Stone, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_slab, 1, 8), new ItemData(Materials.Stone, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 0), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 8), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.stone_slab, 1, 1), new ItemData(Materials.Sand, 1814400L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.stone_slab, 1, 9), new ItemData(Materials.Sand, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 1), new ItemData(Materials.Sand, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 9), new ItemData(Materials.Sand, 3628800L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.stone_slab, 1, 2), new ItemData(Materials.Wood, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_slab, 1, 10), new ItemData(Materials.Wood, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 2), new ItemData(Materials.Wood, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 10), new ItemData(Materials.Wood, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_slab, 1, 3), new ItemData(Materials.Stone, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_slab, 1, 11), new ItemData(Materials.Stone, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 3), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 11), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_slab, 1, 5), new ItemData(Materials.Stone, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_slab, 1, 13), new ItemData(Materials.Stone, 1814400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 5), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 13), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.stone, 1, 32767), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.furnace, 1, 32767), new ItemData(Materials.Stone, 29030400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.lit_furnace, 1, 32767), new ItemData(Materials.Stone, 29030400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stonebrick, 1, 32767), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.cobblestone, 1, 32767), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.mossy_cobblestone, 1, 32767), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_button, 1, 32767), new ItemData(Materials.Stone, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.stone_pressure_plate, 1, 32767), new ItemData(Materials.Stone, 7257600L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.ladder, 1, 32767), new ItemData(Materials.Wood, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.wooden_button, 1, 32767), new ItemData(Materials.Wood, 3628800L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.wooden_pressure_plate, 1, 32767), new ItemData(Materials.Wood, 7257600L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.fence, 1, 32767), new ItemData(Materials.Wood, 5443200L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.bowl, 1, 32767), new ItemData(Materials.Wood, 3628800L)); + GTOreDictUnificator.addItemData(new ItemStack(Items.sign, 1, 32767), new ItemData(Materials.Wood, 7257600L)); + GTOreDictUnificator + .addItemData(new ItemStack(Items.wooden_door, 1, 32767), new ItemData(Materials.Wood, 21772800L)); + GTOreDictUnificator.addItemData(new ItemStack(Blocks.chest, 1, 32767), new ItemData(Materials.Wood, 29030400L)); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.trapped_chest, 1, 32767), new ItemData(Materials.Wood, 29030400L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.unlit_redstone_torch, 1, 32767), + new ItemData(Materials.Wood, 1814400L, new MaterialStack(Materials.Redstone, 3628800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.redstone_torch, 1, 32767), + new ItemData(Materials.Wood, 1814400L, new MaterialStack(Materials.Redstone, 3628800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.noteblock, 1, 32767), + new ItemData(Materials.Wood, 29030400L, new MaterialStack(Materials.Redstone, 3628800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.jukebox, 1, 32767), + new ItemData(Materials.Wood, 29030400L, new MaterialStack(Materials.Diamond, 3628800L))); + GTOreDictUnificator + .addItemData(new ItemStack(Blocks.crafting_table, 1, 32767), new ItemData(Materials.Wood, 14515200L)); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.piston, 1, 32767), + new ItemData(Materials.Stone, 14515200L, new MaterialStack(Materials.Wood, 10886400L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.sticky_piston, 1, 32767), + new ItemData(Materials.Stone, 14515200L, new MaterialStack(Materials.Wood, 10886400L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.dispenser, 1, 32767), + new ItemData(Materials.Stone, 25401600L, new MaterialStack(Materials.Redstone, 3628800L))); + GTOreDictUnificator.addItemData( + new ItemStack(Blocks.dropper, 1, 32767), + new ItemData(Materials.Stone, 25401600L, new MaterialStack(Materials.Redstone, 3628800L))); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Thaumcraft.ID, "ItemNuggetChicken", 1L, 32767), + new ItemData(Materials.MeatCooked, 403200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Thaumcraft.ID, "ItemNuggetBeef", 1L, 32767), + new ItemData(Materials.MeatCooked, 403200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Thaumcraft.ID, "ItemNuggetPork", 1L, 32767), + new ItemData(Materials.MeatCooked, 403200L)); + GTOreDictUnificator.addItemData( + GTModHandler.getModItem(Thaumcraft.ID, "ItemNuggetFish", 1L, 32767), + new ItemData(Materials.MeatCooked, 403200L)); + + for (ItemStack tItem : new ItemStack[] { GTModHandler.getModItem(TwilightForest.ID, "item.meefRaw", 1L, 0), + GTModHandler.getModItem(TwilightForest.ID, "item.venisonRaw", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "muttonrawItem", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "turkeyrawItem", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "rabbitrawItem", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "venisonrawItem", 1L, 0), new ItemStack(Items.porkchop), + new ItemStack(Items.beef), new ItemStack(Items.chicken), new ItemStack(Items.fish) }) { + if (tItem != null) { + GTOreDictUnificator.addItemData( + GTUtility.copyMetaData(32767, tItem), + new ItemData(Materials.MeatRaw, 3628800L, new MaterialStack(Materials.Bone, 403200L))); + } + } + for (ItemStack tItem : new ItemStack[] { GTModHandler.getModItem(TwilightForest.ID, "item.meefSteak", 1L, 0), + GTModHandler.getModItem(TwilightForest.ID, "item.venisonCooked", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "muttoncookedItem", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "turkeycookedItem", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "rabbitcookedItem", 1L, 0), + GTModHandler.getModItem(PamsHarvestCraft.ID, "venisoncookedItem", 1L, 0), + new ItemStack(Items.cooked_porkchop), new ItemStack(Items.cooked_beef), new ItemStack(Items.cooked_chicken), + new ItemStack(Items.cooked_fished) }) { + if (tItem != null) { + GTOreDictUnificator.addItemData( + GTUtility.copyMetaData(32767, tItem), + new ItemData(Materials.MeatCooked, 3628800L, new MaterialStack(Materials.Bone, 403200L))); + } + } + } +} diff --git a/src/main/java/gregtech/loaders/preload/LoaderGTOreDictionary.java b/src/main/java/gregtech/loaders/preload/LoaderGTOreDictionary.java new file mode 100644 index 0000000000..0d2bd3ad55 --- /dev/null +++ b/src/main/java/gregtech/loaders/preload/LoaderGTOreDictionary.java @@ -0,0 +1,456 @@ +package gregtech.loaders.preload; + +import static gregtech.api.enums.Mods.AppliedEnergistics2; +import static gregtech.api.enums.Mods.Botania; +import static gregtech.api.enums.Mods.IndustrialCraft2; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.enums.Mods.Railcraft; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.enums.Mods.TwilightForest; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsBotania; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; + +public class LoaderGTOreDictionary implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Register OreDict Entries of Non-GT-Items."); + GTOreDictUnificator.set(OrePrefixes.cell, Materials.Empty, ItemList.Cell_Empty.get(1L)); + GTOreDictUnificator.set(OrePrefixes.cell, Materials.Lava, ItemList.Cell_Lava.get(1L)); + GTOreDictUnificator.set(OrePrefixes.cell, Materials.Lava, GTModHandler.getIC2Item("lavaCell", 1L)); + GTOreDictUnificator.set(OrePrefixes.cell, Materials.Water, ItemList.Cell_Water.get(1L)); + GTOreDictUnificator.set(OrePrefixes.cell, Materials.Water, GTModHandler.getIC2Item("waterCell", 1L)); + GTOreDictUnificator.set( + OrePrefixes.cell, + Materials.Creosote, + GTModHandler.getModItem(Railcraft.ID, "fluid.creosote.cell", 1L)); + + GTOreDictUnificator.set(OrePrefixes.cell, Materials.UUMatter, GTModHandler.getIC2Item("uuMatterCell", 1L)); + GTOreDictUnificator.set(OrePrefixes.cell, Materials.ConstructionFoam, GTModHandler.getIC2Item("CFCell", 1L)); + + GTOreDictUnificator.set(OrePrefixes.bucket, Materials.Empty, new ItemStack(Items.bucket, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.bucket, Materials.Water, new ItemStack(Items.water_bucket, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.bucket, Materials.Lava, new ItemStack(Items.lava_bucket, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.bucket, Materials.Milk, new ItemStack(Items.milk_bucket, 1, 0)); + // Clay buckets handled in gregtech.common.GTProxy.onLoad() as they aren't registered until Iguana Tweaks + // pre-init. + + GTOreDictUnificator.set(OrePrefixes.bottle, Materials.Empty, new ItemStack(Items.glass_bottle, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.bottle, Materials.Water, new ItemStack(Items.potionitem, 1, 0)); + + GTOreDictUnificator.set(OrePrefixes.plateAlloy, Materials.Iridium, GTModHandler.getIC2Item("iridiumPlate", 1L)); + GTOreDictUnificator + .set(OrePrefixes.plateAlloy, Materials.Advanced, GTModHandler.getIC2Item("advancedAlloy", 1L)); + GTOreDictUnificator.set(OrePrefixes.plateAlloy, Materials.Carbon, GTModHandler.getIC2Item("carbonPlate", 1L)); + + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Coal, new ItemStack(Blocks.coal_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Iron, new ItemStack(Blocks.iron_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Lapis, new ItemStack(Blocks.lapis_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Redstone, new ItemStack(Blocks.redstone_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Redstone, new ItemStack(Blocks.lit_redstone_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Gold, new ItemStack(Blocks.gold_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Diamond, new ItemStack(Blocks.diamond_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.Emerald, new ItemStack(Blocks.emerald_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ore, Materials.NetherQuartz, new ItemStack(Blocks.quartz_ore, 1)); + GTOreDictUnificator.set(OrePrefixes.ingot, Materials.Copper, GTModHandler.getIC2Item("copperIngot", 1L)); + GTOreDictUnificator.set(OrePrefixes.ingot, Materials.Tin, GTModHandler.getIC2Item("tinIngot", 1L)); + GTOreDictUnificator.set(OrePrefixes.ingot, Materials.Lead, GTModHandler.getIC2Item("leadIngot", 1L)); + GTOreDictUnificator.set(OrePrefixes.ingot, Materials.Bronze, GTModHandler.getIC2Item("bronzeIngot", 1L)); + GTOreDictUnificator.set(OrePrefixes.ingot, Materials.Silver, GTModHandler.getIC2Item("silverIngot", 1L)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.Iridium, GTModHandler.getIC2Item("iridiumOre", 1L)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.Lapis, new ItemStack(Items.dye, 1, 4)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.EnderEye, new ItemStack(Items.ender_eye, 1)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.EnderPearl, new ItemStack(Items.ender_pearl, 1)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.Diamond, new ItemStack(Items.diamond, 1)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.Emerald, new ItemStack(Items.emerald, 1)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.Coal, new ItemStack(Items.coal, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.Charcoal, new ItemStack(Items.coal, 1, 1)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.NetherQuartz, new ItemStack(Items.quartz, 1)); + GTOreDictUnificator.set(OrePrefixes.gem, Materials.NetherStar, new ItemStack(Items.nether_star, 1)); + GTOreDictUnificator.set(OrePrefixes.nugget, Materials.Gold, new ItemStack(Items.gold_nugget, 1)); + GTOreDictUnificator.set(OrePrefixes.ingot, Materials.Gold, new ItemStack(Items.gold_ingot, 1)); + GTOreDictUnificator.set(OrePrefixes.ingot, Materials.Iron, new ItemStack(Items.iron_ingot, 1)); + GTOreDictUnificator.set(OrePrefixes.plate, Materials.Paper, new ItemStack(Items.paper, 1)); + GTOreDictUnificator.set(OrePrefixes.dust, Materials.Sugar, new ItemStack(Items.sugar, 1)); + GTOreDictUnificator.set(OrePrefixes.dust, Materials.Bone, ItemList.Dye_Bonemeal.get(1L)); + GTOreDictUnificator.set(OrePrefixes.stick, Materials.Wood, new ItemStack(Items.stick, 1)); + GTOreDictUnificator.set(OrePrefixes.dust, Materials.Redstone, new ItemStack(Items.redstone, 1)); + GTOreDictUnificator.set(OrePrefixes.dust, Materials.Gunpowder, new ItemStack(Items.gunpowder, 1)); + GTOreDictUnificator.set(OrePrefixes.dust, Materials.Glowstone, new ItemStack(Items.glowstone_dust, 1)); + GTOreDictUnificator.set(OrePrefixes.dust, Materials.Blaze, new ItemStack(Items.blaze_powder, 1)); + GTOreDictUnificator.set(OrePrefixes.stick, Materials.Blaze, new ItemStack(Items.blaze_rod, 1)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Iron, new ItemStack(Blocks.iron_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Gold, new ItemStack(Blocks.gold_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Diamond, new ItemStack(Blocks.diamond_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Emerald, new ItemStack(Blocks.emerald_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Lapis, new ItemStack(Blocks.lapis_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Coal, new ItemStack(Blocks.coal_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Redstone, new ItemStack(Blocks.redstone_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.NetherQuartz, new ItemStack(Blocks.quartz_block, 1, 0)); + GTOreDictUnificator.set(OrePrefixes.block, Materials.Clay, new ItemStack(Blocks.clay, 1, 0)); + if (Blocks.ender_chest != null) { + GTOreDictUnificator.registerOre(OreDictNames.enderChest, new ItemStack(Blocks.ender_chest, 1)); + } + GTOreDictUnificator.registerOre(OreDictNames.craftingAnvil, new ItemStack(Blocks.anvil, 1)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingAnvil, GTModHandler.getModItem(Railcraft.ID, "anvil", 1L, 0)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingIndustrialDiamond, ItemList.IC2_Industrial_Diamond.get(1L)); + GTOreDictUnificator + .registerOre(OrePrefixes.glass, Materials.Reinforced, GTModHandler.getIC2Item("reinforcedGlass", 1L)); + + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Basalt, GTModHandler.getModItem(Railcraft.ID, "cube", 1L, 6)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Marble, GTModHandler.getModItem(Railcraft.ID, "cube", 1L, 7)); + GTOreDictUnificator.registerOre( + OrePrefixes.stone, + Materials.Basalt, + GTModHandler.getModItem(Railcraft.ID, "brick.abyssal", 1L, 32767)); + GTOreDictUnificator.registerOre( + OrePrefixes.stone, + Materials.Marble, + GTModHandler.getModItem(Railcraft.ID, "brick.quarried", 1L, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(Blocks.obsidian, 1, 32767)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Stone, new ItemStack(Blocks.stone, 1, 32767)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneMossy, new ItemStack(Blocks.mossy_cobblestone, 1, 32767)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneCobble, new ItemStack(Blocks.mossy_cobblestone, 1, 32767)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneCobble, new ItemStack(Blocks.cobblestone, 1, 32767)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneSmooth, new ItemStack(Blocks.stone, 1, 32767)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneBricks, new ItemStack(Blocks.stonebrick, 1, 32767)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneMossy, new ItemStack(Blocks.stonebrick, 1, 1)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneCracked, new ItemStack(Blocks.stonebrick, 1, 2)); + GTOreDictUnificator.registerOre(OrePrefixes.stoneChiseled, new ItemStack(Blocks.stonebrick, 1, 3)); + GTOreDictUnificator.registerOre(OrePrefixes.stone, Materials.Sand, new ItemStack(Blocks.sandstone, 1, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Netherrack, new ItemStack(Blocks.netherrack, 1, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.NetherBrick, new ItemStack(Blocks.nether_brick, 1, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Endstone, new ItemStack(Blocks.end_stone, 1, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.stone, Materials.Glowstone, new ItemStack(Blocks.glowstone, 1, 32767)); + + GTOreDictUnificator + .registerOre("paperResearchFragment", GTModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 9)); + GTOreDictUnificator.registerOre( + "itemCertusQuartz", + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1)); + GTOreDictUnificator.registerOre( + "itemCertusQuartz", + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10)); + GTOreDictUnificator.registerOre( + "itemNetherQuartz", + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11)); + GTOreDictUnificator.registerOre( + OreDictNames.craftingQuartz, + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1)); + GTOreDictUnificator.registerOre( + OreDictNames.craftingQuartz, + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10)); + GTOreDictUnificator.registerOre( + OreDictNames.craftingQuartz, + GTModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11)); + GTOreDictUnificator.registerOre("cropLemon", ItemList.FR_Lemon.get(1L)); + GTOreDictUnificator.registerOre("cropCoffee", ItemList.IC2_CoffeeBeans.get(1L)); + GTOreDictUnificator.registerOre("cropPotato", ItemList.Food_Raw_Potato.get(1L)); + GTOreDictUnificator.registerOre(OrePrefixes.battery, Materials.LV, GTModHandler.getIC2Item("reBattery", 1L)); + GTOreDictUnificator + .registerOre(OrePrefixes.battery, Materials.LV, GTModHandler.getIC2Item("chargedReBattery", 1L, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.battery, Materials.MV, GTModHandler.getIC2Item("advBattery", 1L, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.battery, Materials.HV, GTModHandler.getIC2Item("energyCrystal", 1L, 32767)); + GTOreDictUnificator + .registerOre(OrePrefixes.battery, Materials.EV, GTModHandler.getIC2Item("lapotronCrystal", 1L, 32767)); + + GTOreDictUnificator + .registerOre(OreDictNames.craftingWireCopper, GTModHandler.getIC2Item("insulatedCopperCableItem", 1L)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingWireGold, GTModHandler.getIC2Item("insulatedGoldCableItem", 1L)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingWireIron, GTModHandler.getIC2Item("insulatedIronCableItem", 1L)); + GTOreDictUnificator.registerOre( + OreDictNames.craftingWireTin, + GTModHandler + .getIC2Item("insulatedTinCableItem", 1L, GTModHandler.getIC2Item("insulatedCopperCableItem", 1L))); + + GTOreDictUnificator + .registerOre(OreDictNames.craftingRedstoneTorch, new ItemStack(Blocks.redstone_torch, 1, 32767)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingRedstoneTorch, new ItemStack(Blocks.unlit_redstone_torch, 1, 32767)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingWorkBench, new ItemStack(Blocks.crafting_table, 1)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingWorkBench, new ItemStack(GregTechAPI.sBlockMachines, 1, 16)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingPiston, new ItemStack(Blocks.piston, 1, 32767)); + GTOreDictUnificator.registerOre(OreDictNames.craftingPiston, new ItemStack(Blocks.sticky_piston, 1, 32767)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingSafe, new ItemStack(GregTechAPI.sBlockMachines, 1, 45)); + GTOreDictUnificator.registerOre(OreDictNames.craftingSafe, GTModHandler.getIC2Item("personalSafe", 1L)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingChest, new ItemStack(Blocks.chest, 1, 32767)); + GTOreDictUnificator.registerOre(OreDictNames.craftingChest, new ItemStack(Blocks.trapped_chest, 1, 32767)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingFurnace, new ItemStack(Blocks.furnace, 1, 32767)); + GTOreDictUnificator.registerOre(OreDictNames.craftingFurnace, new ItemStack(Blocks.lit_furnace, 1, 32767)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingPump, GTModHandler.getIC2Item("pump", 1L)); + GTOreDictUnificator.registerOre(OreDictNames.craftingElectromagnet, GTModHandler.getIC2Item("magnetizer", 1L)); + GTOreDictUnificator.registerOre(OreDictNames.craftingTeleporter, GTModHandler.getIC2Item("teleporter", 1L)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingMacerator, GTModHandler.getIC2Item("macerator", 1L)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingMacerator, new ItemStack(GregTechAPI.sBlockMachines, 1, 50)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingExtractor, GTModHandler.getIC2Item("extractor", 1L)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingExtractor, new ItemStack(GregTechAPI.sBlockMachines, 1, 51)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingCompressor, GTModHandler.getIC2Item("compressor", 1L)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingCompressor, new ItemStack(GregTechAPI.sBlockMachines, 1, 52)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingRecycler, GTModHandler.getIC2Item("recycler", 1L)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingRecycler, new ItemStack(GregTechAPI.sBlockMachines, 1, 53)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingIronFurnace, GTModHandler.getIC2Item("ironFurnace", 1L)); + + GTOreDictUnificator + .registerOre(OreDictNames.craftingCentrifuge, new ItemStack(GregTechAPI.sBlockMachines, 1, 62)); + + GTOreDictUnificator + .registerOre(OreDictNames.craftingInductionFurnace, GTModHandler.getIC2Item("inductionFurnace", 1L)); + + GTOreDictUnificator + .registerOre(OreDictNames.craftingElectricFurnace, GTModHandler.getIC2Item("electroFurnace", 1L)); + GTOreDictUnificator + .registerOre(OreDictNames.craftingElectricFurnace, new ItemStack(GregTechAPI.sBlockMachines, 1, 54)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingGenerator, GTModHandler.getIC2Item("generator", 1L)); + + GTOreDictUnificator + .registerOre(OreDictNames.craftingGeothermalGenerator, GTModHandler.getIC2Item("geothermalGenerator", 1L)); + + GTOreDictUnificator.registerOre(OreDictNames.craftingFeather, new ItemStack(Items.feather, 1, 32767)); + GTOreDictUnificator.registerOre( + OreDictNames.craftingFeather, + GTModHandler.getModItem(TwilightForest.ID, "item.tfFeather", 1L, 32767)); + + GTOreDictUnificator.registerOre("itemWheat", new ItemStack(Items.wheat, 1, 32767)); + GTOreDictUnificator.registerOre("paperEmpty", new ItemStack(Items.paper, 1, 32767)); + GTOreDictUnificator.registerOre("paperMap", new ItemStack(Items.map, 1, 32767)); + GTOreDictUnificator.registerOre("paperMap", new ItemStack(Items.filled_map, 1, 32767)); + GTOreDictUnificator.registerOre("bookEmpty", new ItemStack(Items.book, 1, 32767)); + GTOreDictUnificator.registerOre("bookWritable", new ItemStack(Items.writable_book, 1, 32767)); + GTOreDictUnificator.registerOre("bookWritten", new ItemStack(Items.written_book, 1, 32767)); + GTOreDictUnificator.registerOre("bookEnchanted", new ItemStack(Items.enchanted_book, 1, 32767)); + GTOreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.book, 1, 32767)); + GTOreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.writable_book, 1, 32767)); + GTOreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.written_book, 1, 32767)); + GTOreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.enchanted_book, 1, 32767)); + + GTOreDictUnificator.addToBlacklist(GTModHandler.getIC2Item("electronicCircuit", 1L)); + GTOreDictUnificator.addToBlacklist(GTModHandler.getIC2Item("advancedCircuit", 1L)); + GTOreDictUnificator + .registerOre(OrePrefixes.circuit, Materials.LV, GTModHandler.getIC2Item("electronicCircuit", 1L)); + GTOreDictUnificator + .registerOre(OrePrefixes.circuit, Materials.HV, GTModHandler.getIC2Item("advancedCircuit", 1L)); + + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Copper, + GTModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Tin, + GTModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 1)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Bronze, + GTModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 2)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Gold, + GTModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 3)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Iron, + GTModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 4)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Steel, + GTModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 5)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Lead, + GTModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 6)); + + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Osmium, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OsmiumItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Aluminium, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.AluminiumItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.StainlessSteel, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.StainlessSteelItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Tungsten, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TungstenItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Neutronium, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NeutroniumItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.TungstenSteel, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TungstenSteelItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Iridium, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IridiumItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Titanium, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitaniumItemCasing", 1L, 0)); + GTOreDictUnificator.registerOre( + OrePrefixes.itemCasing, + Materials.Chrome, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ChromeItemCasing", 1L, 0)); + + // Fake Circuits + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.ULV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitULV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.LV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitLV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.MV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitMV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.HV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitHV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.EV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitEV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.IV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitIV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.LuV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitLuV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.ZPM, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitZPM", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.UV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.UHV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUHV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.UEV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUEV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.UIV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUIV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.UMV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUMV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.UXV, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUXV", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.circuit, + Materials.MAX, + GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitMAX", 1L)); + + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.Manasteel, + GTModHandler.getModItem(Botania.ID, "storage", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.Terrasteel, + GTModHandler.getModItem(Botania.ID, "storage", 1L, 1)); + GTOreDictUnificator.registerOre( + OrePrefixes.ingot, + MaterialsBotania.ElvenElementium, + GTModHandler.getModItem(Botania.ID, "manaResource", 1L, 7)); + GTOreDictUnificator.registerOre( + OrePrefixes.nugget, + MaterialsBotania.ElvenElementium, + GTModHandler.getModItem(Botania.ID, "manaResource", 1L, 19)); + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.ElvenElementium, + GTModHandler.getModItem(Botania.ID, "storage", 1L, 2)); + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.Livingrock, + GTModHandler.getModItem(Botania.ID, "livingrock", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.ingot, + MaterialsBotania.GaiaSpirit, + GTModHandler.getModItem(Botania.ID, "manaResource", 1L, 14)); + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.Livingwood, + GTModHandler.getModItem(Botania.ID, "livingwood", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.Dreamwood, + GTModHandler.getModItem(Botania.ID, "dreamwood", 1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.gem, + MaterialsBotania.ManaDiamond, + GTModHandler.getModItem(Botania.ID, "manaResource", 1L, 2)); + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.ManaDiamond, + GTModHandler.getModItem(Botania.ID, "storage", 1L, 3)); + GTOreDictUnificator.registerOre( + OrePrefixes.gem, + MaterialsBotania.BotaniaDragonstone, + GTModHandler.getModItem(Botania.ID, "manaResource", 1L, 9)); + GTOreDictUnificator.registerOre( + OrePrefixes.block, + MaterialsBotania.BotaniaDragonstone, + GTModHandler.getModItem(Botania.ID, "storage", 1L, 4)); + } +} diff --git a/src/main/java/gregtech/loaders/preload/LoaderMetaTileEntities.java b/src/main/java/gregtech/loaders/preload/LoaderMetaTileEntities.java new file mode 100644 index 0000000000..b462e065cd --- /dev/null +++ b/src/main/java/gregtech/loaders/preload/LoaderMetaTileEntities.java @@ -0,0 +1,13128 @@ +package gregtech.loaders.preload; + +import static gregtech.api.enums.MetaTileEntityIDs.*; +import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_DATA_ACCESS_HATCH; +import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_DEBUG_STRUCTURE_WRITTER; +import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_LINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_MACHINE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.AUTOMATABLE_DATA_ACCESS_HATCH; +import static gregtech.api.enums.MetaTileEntityIDs.AUTO_MAINTENANCE_HATCH; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_EV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_HV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_IV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_LV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_MV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_EV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_HV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_IV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_LV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_MV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_EV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_HV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_IV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_LV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_MV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_EV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_HV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_IV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_LV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_MV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_4_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_EV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_HV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_IV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_LV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_MV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_UV; +import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_EV; +import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_HV; +import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_IV; +import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_LV; +import static gregtech.api.enums.MetaTileEntityIDs.BETTER_JUKEBOX_MV; +import static gregtech.api.enums.MetaTileEntityIDs.BLACKHOLE_COMPRESSOR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_EV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_HV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_IV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_LV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_MV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_UV; +import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.BRICKED_BLAST_FURNACE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.CANNING_MACHINE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.CHARCOAL_PILE_IGNITER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_UV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.CLEANROOM_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_ENGINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.CONCRETE_BACKFILLER_II_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.CONCRETE_BACKFILLER_I_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_ME; +import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_ME_BUS; +import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_SLAVE; +import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.DATA_ACCESS_HATCH; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLATION_TOWER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_UV; +import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.DTPF_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_EV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_HV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_IV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_LV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_MV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.DroneDownLink; +import static gregtech.api.enums.MetaTileEntityIDs.Drone_Centre; +import static gregtech.api.enums.MetaTileEntityIDs.EBF_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYZER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_EV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_HV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_IV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_LV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_MV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.EXTREME_COMBUSTION_ENGINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_UV; +import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKI; +import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKII; +import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKIII; +import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_EV; +import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_HV; +import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_IV; +import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_LV; +import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_MV; +import static gregtech.api.enums.MetaTileEntityIDs.HATCH_DEGASIFIER_CONTROL; +import static gregtech.api.enums.MetaTileEntityIDs.HATCH_LENS_HOUSING; +import static gregtech.api.enums.MetaTileEntityIDs.HATCH_LENS_INDICATOR; +import static gregtech.api.enums.MetaTileEntityIDs.HATCH_PH_SENSOR; +import static gregtech.api.enums.MetaTileEntityIDs.HEAT_DETECTOR_HATCH; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_MAX_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UEV_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UIV_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UMV_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_AMP_TRANSFORMER_UXV_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_COAL_BOILER; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_LAVA_BOILER; +import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_SOLAR_BOILER; +import static gregtech.api.enums.MetaTileEntityIDs.HIP_COMPRESSOR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_COMPRESSOR; +import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_EXTRACTOR; +import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_FORGE_HAMMER; +import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_FURNACE; +import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_MACERATOR; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_BRICKED_BRONZE; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_BRONZE; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_EV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_HV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_IV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_LV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_MV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_STEEL; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_UV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_WROUGHT_IRON; +import static gregtech.api.enums.MetaTileEntityIDs.HULL_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.IMPLOSION_COMPRESSOR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_APIARY; +import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_COMPRESSOR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_LASER_ENGRAVER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_EV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_HV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_IV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME_ADVANCED; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_MV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_UV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_EV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_HV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_IV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME_ADVANCED; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_MV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.INTEGRATED_ORE_FACTORY_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_ADVANCED_GAS_TURBINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_BRONZE_BOILER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_GAS_TURBINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_HEAT_EXCHANGER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_HP_STEAM_TURBINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_PLASMA_TURBINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_STEAM_TURBINE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_STEEL_BOILER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_TITANIUM_BOILER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LARGE_TUNGSTENSTEEL_BOILER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LASER_ENGRAVER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.LATHE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.LATHE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.LATHE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.LCR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_EV; +import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_HV; +import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_IV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.LONG_DISTANCE_PIPELINE_FLUID; +import static gregtech.api.enums.MetaTileEntityIDs.LONG_DISTANCE_PIPELINE_ITEM; +import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.MAG_HATCH; +import static gregtech.api.enums.MetaTileEntityIDs.MAINTENANCE_HATCH; +import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_FABRICATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MATTER_REPLICATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MINER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.MINER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.MINER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.MIXER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.MIXER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MIXER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_EV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_HV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_IV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_LV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_MV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_UV; +import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.MULTIBLOCK_PUMP_INFINITE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.MULTIBLOCK_PUMP_MKI_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKIII_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKII_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKIV_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.MULTI_CANNER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.MULTI_LATHE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.MULTI_SMELTER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.NANO_FORGE_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.NEUTRONIUM_COMPRESSOR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.OIL_CRACKER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKIII_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKII_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKIV_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKI_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHING_PLANT_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_EV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_HV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_IV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_LV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ME; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_MV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_UV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_EV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_HV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_IV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_LV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ME; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_MV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.PCB_FACTORY_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.PRECISION_LASER_ENGRAVER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.PROCESSING_ARRAY_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.PUMP_EV; +import static gregtech.api.enums.MetaTileEntityIDs.PUMP_HV; +import static gregtech.api.enums.MetaTileEntityIDs.PUMP_IV; +import static gregtech.api.enums.MetaTileEntityIDs.PUMP_LV; +import static gregtech.api.enums.MetaTileEntityIDs.PUMP_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.PUMP_MV; +import static gregtech.api.enums.MetaTileEntityIDs.PUMP_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_PLANT_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_CLARIFIER; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_DEGASIFIER; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_FLOCCULATOR; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_OZONATION; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_PARTICLE_EXTRACTOR; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_PH_ADJUSTMENT; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_PLASMA_HEATER; +import static gregtech.api.enums.MetaTileEntityIDs.PURIFICATION_UNIT_UV_TREATMENT; +import static gregtech.api.enums.MetaTileEntityIDs.PYROLYSE_OVEN_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_EV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_IV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_EV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_HV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_IV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_LV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_MV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_EV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_HV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_IV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_LV; +import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_MV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.SIFTING_MACHINE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.SIMPLE_SOLAR_BOILER; +import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.SLICING_MACHINE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.SMALL_COAL_BOILER; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_ALLOY_SMELTER; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_COMPRESSOR; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_EXTRACTOR; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_FORGE_HAMMER; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_FURNACE; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_MACERATOR; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_HV; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_LV; +import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_MV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_EV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_HV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_IV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_LV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_MV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_EV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_HV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_IV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_LV; +import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_MV; +import static gregtech.api.enums.MetaTileEntityIDs.TELEPORTER; +import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_UV; +import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.TRANSCENDENT_PLASMA_MIXER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_MAX_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UEV_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UIV_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UMV_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.TRANSFORMER_UXV_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.TURBO_CHARGER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_EV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_HV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_IV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_LV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_MV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_UV; +import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.VACUUM_FREEZER_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_EV_HV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_HV_MV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_IV_EV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_LV_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_LuV_IV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_MAX_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_MV_LV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UEV_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UHV_UV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UIV_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UMV_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UV_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_UXV_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.WET_TRANSFORMER_ZPM_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_EV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_HV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_IV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_LV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_MV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_EV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_HV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_IV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_LV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_MAX; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_MV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UXV; +import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UEV; +import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UHV; +import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UIV; +import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UMV; +import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_UV; +import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_EV; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_HV; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_IV; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_LV; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_LuV; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_MV; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_UV; +import static gregtech.api.enums.MetaTileEntityIDs.WORLD_ACCELERATOR_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.WORMHOLE_GENERATOR_CONTROLLER; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_EV_HV; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_HV_MV; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_IV_EV; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_LV_ULV; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_LuV_IV; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_MV_LV; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_UHV_UV; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_UV_ZPM; +import static gregtech.api.enums.MetaTileEntityIDs.transformer_ZPM_LuV; +import static gregtech.api.enums.Mods.Forestry; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes; +import static gregtech.api.recipe.RecipeMaps.amplifierRecipes; +import static gregtech.api.recipe.RecipeMaps.arcFurnaceRecipes; +import static gregtech.api.recipe.RecipeMaps.assemblerRecipes; +import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes; +import static gregtech.api.recipe.RecipeMaps.benderRecipes; +import static gregtech.api.recipe.RecipeMaps.cannerRecipes; +import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes; +import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes; +import static gregtech.api.recipe.RecipeMaps.chemicalReactorRecipes; +import static gregtech.api.recipe.RecipeMaps.circuitAssemblerRecipes; +import static gregtech.api.recipe.RecipeMaps.compressorRecipes; +import static gregtech.api.recipe.RecipeMaps.cutterRecipes; +import static gregtech.api.recipe.RecipeMaps.distilleryRecipes; +import static gregtech.api.recipe.RecipeMaps.electroMagneticSeparatorRecipes; +import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes; +import static gregtech.api.recipe.RecipeMaps.extractorRecipes; +import static gregtech.api.recipe.RecipeMaps.extruderRecipes; +import static gregtech.api.recipe.RecipeMaps.fermentingRecipes; +import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes; +import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes; +import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes; +import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes; +import static gregtech.api.recipe.RecipeMaps.formingPressRecipes; +import static gregtech.api.recipe.RecipeMaps.furnaceRecipes; +import static gregtech.api.recipe.RecipeMaps.hammerRecipes; +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.microwaveRecipes; +import static gregtech.api.recipe.RecipeMaps.mixerRecipes; +import static gregtech.api.recipe.RecipeMaps.oreWasherRecipes; +import static gregtech.api.recipe.RecipeMaps.plasmaArcFurnaceRecipes; +import static gregtech.api.recipe.RecipeMaps.polarizerRecipes; +import static gregtech.api.recipe.RecipeMaps.recyclerRecipes; +import static gregtech.api.recipe.RecipeMaps.sifterRecipes; +import static gregtech.api.recipe.RecipeMaps.slicerRecipes; +import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes; +import static gregtech.api.recipe.RecipeMaps.wiremillRecipes; +import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTRecipeBuilder.TICKS; +import static gregtech.api.util.GTUtility.calculateRecipeEU; + +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.MachineType; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.SubTag; +import gregtech.api.enums.TierEU; +import gregtech.api.metatileentity.implementations.MTEBasicBatteryBuffer; +import gregtech.api.metatileentity.implementations.MTEBasicHull; +import gregtech.api.metatileentity.implementations.MTEBasicMachineWithRecipe; +import gregtech.api.metatileentity.implementations.MTECable; +import gregtech.api.metatileentity.implementations.MTEFluid; +import gregtech.api.metatileentity.implementations.MTEFrame; +import gregtech.api.metatileentity.implementations.MTEHatchDataAccess; +import gregtech.api.metatileentity.implementations.MTEHatchDynamo; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; +import gregtech.api.metatileentity.implementations.MTEHatchInput; +import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.metatileentity.implementations.MTEHatchMagnet; +import gregtech.api.metatileentity.implementations.MTEHatchMaintenance; +import gregtech.api.metatileentity.implementations.MTEHatchMuffler; +import gregtech.api.metatileentity.implementations.MTEHatchMultiInput; +import gregtech.api.metatileentity.implementations.MTEHatchOutput; +import gregtech.api.metatileentity.implementations.MTEHatchOutputBus; +import gregtech.api.metatileentity.implementations.MTEHatchQuadrupleHumongous; +import gregtech.api.metatileentity.implementations.MTEItem; +import gregtech.api.metatileentity.implementations.MTETransformer; +import gregtech.api.metatileentity.implementations.MTEWetTransformer; +import gregtech.api.metatileentity.implementations.MTEWirelessDynamo; +import gregtech.api.metatileentity.implementations.MTEWirelessEnergy; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTLog; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockFrameBox; +import gregtech.common.tileentities.automation.MTEChestBuffer; +import gregtech.common.tileentities.automation.MTEFilter; +import gregtech.common.tileentities.automation.MTEItemDistributor; +import gregtech.common.tileentities.automation.MTERecipeFilter; +import gregtech.common.tileentities.automation.MTERegulator; +import gregtech.common.tileentities.automation.MTESuperBuffer; +import gregtech.common.tileentities.automation.MTETypeFilter; +import gregtech.common.tileentities.boilers.MTEBoilerBronze; +import gregtech.common.tileentities.boilers.MTEBoilerLava; +import gregtech.common.tileentities.boilers.MTEBoilerSolar; +import gregtech.common.tileentities.boilers.MTEBoilerSolarSteel; +import gregtech.common.tileentities.boilers.MTEBoilerSteel; +import gregtech.common.tileentities.debug.MTEAdvDebugStructureWriter; +import gregtech.common.tileentities.generators.MTEDieselGenerator; +import gregtech.common.tileentities.generators.MTEGasTurbine; +import gregtech.common.tileentities.generators.MTELightningRod; +import gregtech.common.tileentities.generators.MTEMagicEnergyConverter; +import gregtech.common.tileentities.generators.MTEMagicalEnergyAbsorber; +import gregtech.common.tileentities.generators.MTENaquadahReactor; +import gregtech.common.tileentities.generators.MTEPlasmaGenerator; +import gregtech.common.tileentities.generators.MTESteamTurbine; +import gregtech.common.tileentities.machines.MTEBasicHullBronze; +import gregtech.common.tileentities.machines.MTEBasicHullBronzeBricks; +import gregtech.common.tileentities.machines.MTEBasicHullSteel; +import gregtech.common.tileentities.machines.MTEBasicHullSteelBricks; +import gregtech.common.tileentities.machines.MTEHatchCraftingInputME; +import gregtech.common.tileentities.machines.MTEHatchCraftingInputSlave; +import gregtech.common.tileentities.machines.MTEHatchInputBusME; +import gregtech.common.tileentities.machines.MTEHatchInputME; +import gregtech.common.tileentities.machines.MTEHatchOutputBusME; +import gregtech.common.tileentities.machines.MTEHatchOutputME; +import gregtech.common.tileentities.machines.basic.MTEAdvSeismicProspector; +import gregtech.common.tileentities.machines.basic.MTEBetterJukebox; +import gregtech.common.tileentities.machines.basic.MTEBoxinator; +import gregtech.common.tileentities.machines.basic.MTECharger; +import gregtech.common.tileentities.machines.basic.MTEIndustrialApiary; +import gregtech.common.tileentities.machines.basic.MTEMassfabricator; +import gregtech.common.tileentities.machines.basic.MTEMicrowaveEnergyTransmitter; +import gregtech.common.tileentities.machines.basic.MTEMiner; +import gregtech.common.tileentities.machines.basic.MTEMonsterRepellent; +import gregtech.common.tileentities.machines.basic.MTEPotionBrewer; +import gregtech.common.tileentities.machines.basic.MTEPump; +import gregtech.common.tileentities.machines.basic.MTEReplicator; +import gregtech.common.tileentities.machines.basic.MTERockBreaker; +import gregtech.common.tileentities.machines.basic.MTEScanner; +import gregtech.common.tileentities.machines.basic.MTETeleporter; +import gregtech.common.tileentities.machines.basic.MTETurboCharger; +import gregtech.common.tileentities.machines.basic.MTEWorldAccelerator; +import gregtech.common.tileentities.machines.long_distance.MTELongDistancePipelineFluid; +import gregtech.common.tileentities.machines.long_distance.MTELongDistancePipelineItem; +import gregtech.common.tileentities.machines.multi.MTEAssemblyLine; +import gregtech.common.tileentities.machines.multi.MTEBrickedBlastFurnace; +import gregtech.common.tileentities.machines.multi.MTECharcoalPit; +import gregtech.common.tileentities.machines.multi.MTECleanroom; +import gregtech.common.tileentities.machines.multi.MTEConcreteBackfiller1; +import gregtech.common.tileentities.machines.multi.MTEConcreteBackfiller2; +import gregtech.common.tileentities.machines.multi.MTEDieselEngine; +import gregtech.common.tileentities.machines.multi.MTEDistillationTower; +import gregtech.common.tileentities.machines.multi.MTEElectricBlastFurnace; +import gregtech.common.tileentities.machines.multi.MTEExtremeDieselEngine; +import gregtech.common.tileentities.machines.multi.MTEFusionComputer1; +import gregtech.common.tileentities.machines.multi.MTEFusionComputer2; +import gregtech.common.tileentities.machines.multi.MTEFusionComputer3; +import gregtech.common.tileentities.machines.multi.MTEHeatExchanger; +import gregtech.common.tileentities.machines.multi.MTEImplosionCompressor; +import gregtech.common.tileentities.machines.multi.MTEIndustrialElectromagneticSeparator; +import gregtech.common.tileentities.machines.multi.MTEIndustrialExtractor; +import gregtech.common.tileentities.machines.multi.MTEIndustrialLaserEngraver; +import gregtech.common.tileentities.machines.multi.MTEIntegratedOreFactory; +import gregtech.common.tileentities.machines.multi.MTELargeBoilerBronze; +import gregtech.common.tileentities.machines.multi.MTELargeBoilerSteel; +import gregtech.common.tileentities.machines.multi.MTELargeBoilerTitanium; +import gregtech.common.tileentities.machines.multi.MTELargeBoilerTungstenSteel; +import gregtech.common.tileentities.machines.multi.MTELargeChemicalReactor; +import gregtech.common.tileentities.machines.multi.MTELargeFluidExtractor; +import gregtech.common.tileentities.machines.multi.MTELargeTurbineGas; +import gregtech.common.tileentities.machines.multi.MTELargeTurbineGasAdvanced; +import gregtech.common.tileentities.machines.multi.MTELargeTurbineHPSteam; +import gregtech.common.tileentities.machines.multi.MTELargeTurbinePlasma; +import gregtech.common.tileentities.machines.multi.MTELargeTurbineSteam; +import gregtech.common.tileentities.machines.multi.MTEMultiAutoclave; +import gregtech.common.tileentities.machines.multi.MTEMultiCanner; +import gregtech.common.tileentities.machines.multi.MTEMultiFurnace; +import gregtech.common.tileentities.machines.multi.MTEMultiLathe; +import gregtech.common.tileentities.machines.multi.MTENanoForge; +import gregtech.common.tileentities.machines.multi.MTEOilCracker; +import gregtech.common.tileentities.machines.multi.MTEOilDrill1; +import gregtech.common.tileentities.machines.multi.MTEOilDrill2; +import gregtech.common.tileentities.machines.multi.MTEOilDrill3; +import gregtech.common.tileentities.machines.multi.MTEOilDrill4; +import gregtech.common.tileentities.machines.multi.MTEOilDrillInfinite; +import gregtech.common.tileentities.machines.multi.MTEOreDrillingPlant1; +import gregtech.common.tileentities.machines.multi.MTEOreDrillingPlant2; +import gregtech.common.tileentities.machines.multi.MTEOreDrillingPlant3; +import gregtech.common.tileentities.machines.multi.MTEOreDrillingPlant4; +import gregtech.common.tileentities.machines.multi.MTEPCBFactory; +import gregtech.common.tileentities.machines.multi.MTEPlasmaForge; +import gregtech.common.tileentities.machines.multi.MTEProcessingArray; +import gregtech.common.tileentities.machines.multi.MTEPyrolyseOven; +import gregtech.common.tileentities.machines.multi.MTETranscendentPlasmaMixer; +import gregtech.common.tileentities.machines.multi.MTEVacuumFreezer; +import gregtech.common.tileentities.machines.multi.MTEWormholeGenerator; +import gregtech.common.tileentities.machines.multi.compressor.MTEBlackHoleCompressor; +import gregtech.common.tileentities.machines.multi.compressor.MTEHIPCompressor; +import gregtech.common.tileentities.machines.multi.compressor.MTEHeatSensor; +import gregtech.common.tileentities.machines.multi.compressor.MTEIndustrialCompressor; +import gregtech.common.tileentities.machines.multi.compressor.MTENeutroniumCompressor; +import gregtech.common.tileentities.machines.multi.drone.MTEDroneCentre; +import gregtech.common.tileentities.machines.multi.drone.MTEHatchDroneDownLink; +import gregtech.common.tileentities.machines.multi.purification.MTEHatchDegasifierControl; +import gregtech.common.tileentities.machines.multi.purification.MTEHatchLensHousing; +import gregtech.common.tileentities.machines.multi.purification.MTEHatchLensIndicator; +import gregtech.common.tileentities.machines.multi.purification.MTEHatchPHSensor; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationPlant; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitBaryonicPerfection; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitClarifier; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitDegasser; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitFlocculation; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitOzonation; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitPhAdjustment; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitPlasmaHeater; +import gregtech.common.tileentities.machines.multi.purification.MTEPurificationUnitUVTreatment; +import gregtech.common.tileentities.machines.steam.MTESteamAlloySmelterBronze; +import gregtech.common.tileentities.machines.steam.MTESteamAlloySmelterSteel; +import gregtech.common.tileentities.machines.steam.MTESteamCompressorBronze; +import gregtech.common.tileentities.machines.steam.MTESteamCompressorSteel; +import gregtech.common.tileentities.machines.steam.MTESteamExtractorBronze; +import gregtech.common.tileentities.machines.steam.MTESteamExtractorSteel; +import gregtech.common.tileentities.machines.steam.MTESteamForgeHammerBronze; +import gregtech.common.tileentities.machines.steam.MTESteamForgeHammerSteel; +import gregtech.common.tileentities.machines.steam.MTESteamFurnaceBronze; +import gregtech.common.tileentities.machines.steam.MTESteamFurnaceSteel; +import gregtech.common.tileentities.machines.steam.MTESteamMaceratorBronze; +import gregtech.common.tileentities.machines.steam.MTESteamMaceratorSteel; +import gregtech.common.tileentities.storage.MTELocker; +import gregtech.common.tileentities.storage.MTEQuantumChest; +import gregtech.common.tileentities.storage.MTEQuantumTank; +import gregtech.common.tileentities.storage.MTESuperChest; +import gregtech.common.tileentities.storage.MTESuperTank; +import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.MTETransformerHiAmp; + +// Free IDs left for machines in GT as of 29th of July 2022 - Colen. Please try use them up in order. +// 366 +// 367 +// 368 +// 369 +// 370 +// 376 +// 377 +// 378 +// 379 +// 386 +// 387 +// 388 +// 389 +// 390 +// 396 +// 397 +// 398 +// 399 +// 410 +// 419 +// 426 +// 427 +// 428 +// 429 +// 430 +// 436 +// 437 +// 438 +// 439 +// 446 +// 447 +// 448 +// 449 +// 450 +// 456 +// 457 +// 458 +// 459 +// 466 +// 467 +// 468 +// 469 +// 470 +// 476 +// 477 +// 478 +// 479 +// 486 +// 487 +// 488 +// 489 +// 496 +// 497 +// 498 +// 499 +// 506 +// 507 +// 508 +// 509 +// 518 +// 519 +// 526 +// 530 +// 537 +// 538 +// 539 +// 546 +// 547 +// 548 +// 549 +// 550 +// 556 +// 557 +// 558 +// 559 +// 566 +// 567 +// 576 +// 577 +// 578 +// 579 +// 586 +// 587 +// 588 +// 589 +// 590 +// 596 +// 597 +// 598 +// 599 +// 607 +// 608 +// 609 +// 610 +// 616 +// 617 +// 618 +// 619 +// 626 +// 627 +// 628 +// 629 +// 630 +// 636 +// 637 +// 639 +// 646 +// 647 +// 648 +// 649 +// 650 +// 656 +// 657 +// 658 +// 659 +// 666 +// 667 +// 668 +// 669 +// 670 +// 676 +// 677 +// 678 +// 682 +// 683 +// 684 +// 686 +// 687 +// 688 +// 689 +// 702 +// 703 +// 704 +// 705 +// 706 +// 707 +// 708 +// 709 +// 714 +// 715 +// 716 +// 717 +// 718 +// 719 +// 721 +// 722 +// 723 +// 724 +// 725 +// 726 +// 727 +// 728 +// 729 +// 730 +// 731 +// 732 +// 733 +// 734 +// 735 +// 736 +// 737 +// 738 +// 739 +// 741 +// 742 +// 743 +// 744 +// 745 +// 746 +// 747 +// 748 +// 749 + +// TODO Some GT MetaTileEntity registrations are done in load/GT_Loader_MetaTileEntities_Recipes.java due to joint +// registration+recipe methods, they should be split and brought here to register all in preload. + +public class LoaderMetaTileEntities implements Runnable { // TODO CHECK CIRCUIT RECIPES AND USAGES + + private static final String aTextWire1 = "wire."; + private static final String aTextCable1 = "cable."; + private static final String aTextWire2 = " Wire"; + private static final String aTextCable2 = " Cable"; + public static final String imagination = EnumChatFormatting.RESET + "You just need " + + EnumChatFormatting.DARK_PURPLE + + "I" + + EnumChatFormatting.LIGHT_PURPLE + + "m" + + EnumChatFormatting.DARK_RED + + "a" + + EnumChatFormatting.RED + + "g" + + EnumChatFormatting.YELLOW + + "i" + + EnumChatFormatting.GREEN + + "n" + + EnumChatFormatting.AQUA + + "a" + + EnumChatFormatting.DARK_AQUA + + "t" + + EnumChatFormatting.BLUE + + "i" + + EnumChatFormatting.DARK_BLUE + + "o" + + EnumChatFormatting.DARK_PURPLE + + "n" + + EnumChatFormatting.RESET + + " to use this."; + + private static void registerMultiblockControllers() { + ItemList.Machine_Bricked_BlastFurnace.set( + new MTEBrickedBlastFurnace( + BRICKED_BLAST_FURNACE_CONTROLLER.ID, + "multimachine.brickedblastfurnace", + "Bricked Blast Furnace").getStackForm(1L)); + + ItemList.Machine_Multi_BlastFurnace.set( + new MTEElectricBlastFurnace(EBF_CONTROLLER.ID, "multimachine.blastfurnace", "Electric Blast Furnace") + .getStackForm(1L)); + ItemList.Machine_Multi_ImplosionCompressor.set( + new MTEImplosionCompressor( + IMPLOSION_COMPRESSOR_CONTROLLER.ID, + "multimachine.implosioncompressor", + "Implosion Compressor").getStackForm(1L)); + ItemList.Machine_Multi_VacuumFreezer.set( + new MTEVacuumFreezer(VACUUM_FREEZER_CONTROLLER.ID, "multimachine.vacuumfreezer", "Vacuum Freezer") + .getStackForm(1L)); + ItemList.Machine_Multi_Furnace.set( + new MTEMultiFurnace(MULTI_SMELTER_CONTROLLER.ID, "multimachine.multifurnace", "Multi Smelter") + .getStackForm(1L)); + ItemList.Machine_Multi_PlasmaForge.set( + new MTEPlasmaForge( + DTPF_CONTROLLER.ID, + "multimachine.plasmaforge", + "Dimensionally Transcendent Plasma Forge").getStackForm(1L)); + ItemList.Machine_Multi_PurificationPlant.set( + new MTEPurificationPlant( + PURIFICATION_PLANT_CONTROLLER.ID, + "multimachine.purificationplant", + "Water Purification Plant").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitClarifier.set( + new MTEPurificationUnitClarifier( + PURIFICATION_UNIT_CLARIFIER.ID, + "multimachine.purificationunitclarifier", + "Clarifier Purification Unit").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitFlocculator.set( + new MTEPurificationUnitFlocculation( + PURIFICATION_UNIT_FLOCCULATOR.ID, + "multimachine.purificationunitflocculator", + "Flocculation Purification Unit").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitPhAdjustment.set( + new MTEPurificationUnitPhAdjustment( + PURIFICATION_UNIT_PH_ADJUSTMENT.ID, + "multimachine.purificationunitphadjustment", + "pH Neutralization Purification Unit").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitOzonation.set( + new MTEPurificationUnitOzonation( + PURIFICATION_UNIT_OZONATION.ID, + "multimachine.purificationunitozonation", + "Ozonation Purification Unit").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitPlasmaHeater.set( + new MTEPurificationUnitPlasmaHeater( + PURIFICATION_UNIT_PLASMA_HEATER.ID, + "multimachine.purificationunitplasmaheater", + "Extreme Temperature Fluctuation Purification Unit").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitUVTreatment.set( + new MTEPurificationUnitUVTreatment( + PURIFICATION_UNIT_UV_TREATMENT.ID, + "multimachine.purificationunituvtreatment", + "High Energy Laser Purification Unit").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitDegasifier.set( + new MTEPurificationUnitDegasser( + PURIFICATION_UNIT_DEGASIFIER.ID, + "multimachine.purificationunitdegasifier", + "Residual Decontaminant Degasser Purification Unit").getStackForm(1L)); + ItemList.Machine_Multi_PurificationUnitParticleExtractor.set( + new MTEPurificationUnitBaryonicPerfection( + PURIFICATION_UNIT_PARTICLE_EXTRACTOR.ID, + "multimachine.purificationunitextractor", + "Absolute Baryonic Perfection Purification Unit").getStackForm(1L)); + ItemList.Hatch_DegasifierControl.set( + new MTEHatchDegasifierControl( + HATCH_DEGASIFIER_CONTROL.ID, + "hatch.degasifiercontrol", + "Degasser Control Hatch", + 8).getStackForm(1L)); + ItemList.Machine_Multi_LargeBoiler_Bronze.set( + new MTELargeBoilerBronze( + LARGE_BRONZE_BOILER_CONTROLLER.ID, + "multimachine.boiler.bronze", + "Large Bronze Boiler").getStackForm(1L)); + ItemList.Machine_Multi_LargeBoiler_Steel.set( + new MTELargeBoilerSteel(LARGE_STEEL_BOILER_CONTROLLER.ID, "multimachine.boiler.steel", "Large Steel Boiler") + .getStackForm(1L)); + ItemList.Machine_Multi_LargeBoiler_Titanium.set( + new MTELargeBoilerTitanium( + LARGE_TITANIUM_BOILER_CONTROLLER.ID, + "multimachine.boiler.titanium", + "Large Titanium Boiler").getStackForm(1L)); + ItemList.Machine_Multi_LargeBoiler_TungstenSteel.set( + new MTELargeBoilerTungstenSteel( + LARGE_TUNGSTENSTEEL_BOILER_CONTROLLER.ID, + "multimachine.boiler.tungstensteel", + "Large Tungstensteel Boiler").getStackForm(1L)); + ItemList.FusionComputer_LuV.set( + new MTEFusionComputer1(FUSION_CONTROLLER_MKI.ID, "fusioncomputer.tier.06", "Fusion Control Computer Mark I") + .getStackForm(1L)); + ItemList.FusionComputer_ZPMV.set( + new MTEFusionComputer2( + FUSION_CONTROLLER_MKII.ID, + "fusioncomputer.tier.07", + "Fusion Control Computer Mark II").getStackForm(1L)); + ItemList.FusionComputer_UV.set( + new MTEFusionComputer3( + FUSION_CONTROLLER_MKIII.ID, + "fusioncomputer.tier.08", + "Fusion Control Computer Mark III").getStackForm(1L)); + + ItemList.Processing_Array.set( + new MTEProcessingArray(PROCESSING_ARRAY_CONTROLLER.ID, "multimachine.processingarray", "Processing Array") + .getStackForm(1L)); + ItemList.Distillation_Tower.set( + new MTEDistillationTower( + DISTILLATION_TOWER_CONTROLLER.ID, + "multimachine.distillationtower", + "Distillation Tower").getStackForm(1L)); + ItemList.Ore_Processor.set( + new MTEIntegratedOreFactory( + INTEGRATED_ORE_FACTORY_CONTROLLER.ID, + "multimachine.oreprocessor", + "Integrated Ore Factory").getStackForm(1L)); + + ItemList.LargeSteamTurbine.set( + new MTELargeTurbineSteam( + LARGE_STEAM_TURBINE_CONTROLLER.ID, + "multimachine.largeturbine", + "Large Steam Turbine").getStackForm(1L)); + ItemList.LargeGasTurbine.set( + new MTELargeTurbineGas(LARGE_GAS_TURBINE_CONTROLLER.ID, "multimachine.largegasturbine", "Large Gas Turbine") + .getStackForm(1L)); + ItemList.LargeHPSteamTurbine.set( + new MTELargeTurbineHPSteam( + LARGE_HP_STEAM_TURBINE_CONTROLLER.ID, + "multimachine.largehpturbine", + "Large HP Steam Turbine").getStackForm(1L)); + ItemList.LargeAdvancedGasTurbine.set( + new MTELargeTurbineGasAdvanced( + LARGE_ADVANCED_GAS_TURBINE_CONTROLLER.ID, + "multimachine.largeadvancedgasturbine", + "Large Advanced Gas Turbine").getStackForm(1L)); + ItemList.Machine_Multi_TranscendentPlasmaMixer.set( + new MTETranscendentPlasmaMixer( + TRANSCENDENT_PLASMA_MIXER_CONTROLLER.ID, + "multimachine.transcendentplasmamixer", + "Transcendent Plasma Mixer").getStackForm(1)); + + ItemList.LargePlasmaTurbine.set( + new MTELargeTurbinePlasma( + LARGE_PLASMA_TURBINE_CONTROLLER.ID, + "multimachine.largeplasmaturbine", + "Large Plasma Generator").getStackForm(1L)); + ItemList.Machine_Multi_HeatExchanger.set( + new MTEHeatExchanger( + LARGE_HEAT_EXCHANGER_CONTROLLER.ID, + "multimachine.heatexchanger", + "Large Heat Exchanger").getStackForm(1L)); + ItemList.Charcoal_Pile.set( + new MTECharcoalPit( + CHARCOAL_PILE_IGNITER_CONTROLLER.ID, + "multimachine.charcoalpile", + "Charcoal Pile Igniter").getStackForm(1)); + + // Converter recipes in case you had old one lying around + ItemList.OilDrill1.set( + new MTEOilDrill1(MULTIBLOCK_PUMP_MKI_CONTROLLER.ID, "multimachine.oildrill1", "Oil/Gas/Fluid Drilling Rig") + .getStackForm(1)); + ItemList.OilDrill2.set( + new MTEOilDrill2( + MULTILOCK_PUMP_MKII_CONTROLLER.ID, + "multimachine.oildrill2", + "Oil/Gas/Fluid Drilling Rig II").getStackForm(1)); + ItemList.OilDrill3.set( + new MTEOilDrill3( + MULTILOCK_PUMP_MKIII_CONTROLLER.ID, + "multimachine.oildrill3", + "Oil/Gas/Fluid Drilling Rig III").getStackForm(1)); + ItemList.OilDrill4.set( + new MTEOilDrill4( + MULTILOCK_PUMP_MKIV_CONTROLLER.ID, + "multimachine.oildrill4", + "Oil/Gas/Fluid Drilling Rig IV").getStackForm(1)); + ItemList.OilDrillInfinite.set( + new MTEOilDrillInfinite( + MULTIBLOCK_PUMP_INFINITE_CONTROLLER.ID, + "multimachine.oildrillinfinite", + "Infinite Oil/Gas/Fluid Drilling Rig").getStackForm(1)); + + ItemList.ConcreteBackfiller1.set( + new MTEConcreteBackfiller1( + CONCRETE_BACKFILLER_I_CONTROLLER.ID, + "multimachine.concretebackfiller1", + "Concrete Backfiller").getStackForm(1)); + ItemList.ConcreteBackfiller2.set( + new MTEConcreteBackfiller2( + CONCRETE_BACKFILLER_II_CONTROLLER.ID, + "multimachine.concretebackfiller3", + "Advanced Concrete Backfiller").getStackForm(1)); + ItemList.OreDrill1.set( + new MTEOreDrillingPlant1(ORE_DRILL_MKI_CONTROLLER.ID, "multimachine.oredrill1", "Ore Drilling Plant") + .getStackForm(1)); + ItemList.OreDrill2.set( + new MTEOreDrillingPlant2(ORE_DRILL_MKII_CONTROLLER.ID, "multimachine.oredrill2", "Ore Drilling Plant II") + .getStackForm(1)); + ItemList.OreDrill3.set( + new MTEOreDrillingPlant3(ORE_DRILL_MKIII_CONTROLLER.ID, "multimachine.oredrill3", "Ore Drilling Plant III") + .getStackForm(1)); + ItemList.OreDrill4.set( + new MTEOreDrillingPlant4(ORE_DRILL_MKIV_CONTROLLER.ID, "multimachine.oredrill4", "Ore Drilling Plant IV") + .getStackForm(1)); + + ItemList.PyrolyseOven.set( + new MTEPyrolyseOven(PYROLYSE_OVEN_CONTROLLER.ID, "multimachine.pyro", "Pyrolyse Oven").getStackForm(1)); + ItemList.OilCracker.set( + new MTEOilCracker(OIL_CRACKER_CONTROLLER.ID, "multimachine.cracker", "Oil Cracking Unit").getStackForm(1)); + + ItemList.Machine_Multi_Assemblyline.set( + new MTEAssemblyLine(ASSEMBLING_LINE_CONTROLLER.ID, "multimachine.assemblyline", "Assembling Line") + .getStackForm(1L)); + ItemList.Machine_Multi_DieselEngine.set( + new MTEDieselEngine(COMBUSTION_ENGINE_CONTROLLER.ID, "multimachine.dieselengine", "Combustion Engine") + .getStackForm(1L)); + ItemList.Machine_Multi_ExtremeDieselEngine.set( + new MTEExtremeDieselEngine( + EXTREME_COMBUSTION_ENGINE_CONTROLLER.ID, + "multimachine.extremedieselengine", + "Extreme Combustion Engine").getStackForm(1L)); + ItemList.Machine_Multi_Cleanroom.set( + new MTECleanroom(CLEANROOM_CONTROLLER.ID, "multimachine.cleanroom", "Cleanroom Controller") + .getStackForm(1)); + + ItemList.Machine_Multi_LargeChemicalReactor.set( + new MTELargeChemicalReactor(LCR_CONTROLLER.ID, "multimachine.chemicalreactor", "Large Chemical Reactor") + .getStackForm(1)); + ItemList.PCBFactory.set( + new MTEPCBFactory(PCB_FACTORY_CONTROLLER.ID, "multimachine.pcbfactory", "PCB Factory").getStackForm(1)); + ItemList.NanoForge + .set(new MTENanoForge(NANO_FORGE_CONTROLLER.ID, "multimachine.nanoforge", "Nano Forge").getStackForm(1)); + ItemList.Machine_Multi_DroneCentre + .set(new MTEDroneCentre(Drone_Centre.ID, "multimachine_DroneCentre", "Drone Centre").getStackForm(1)); + + ItemList.Machine_Multi_IndustrialElectromagneticSeparator.set( + new MTEIndustrialElectromagneticSeparator( + INDUSTRIAL_ELECTROMAGNETIC_SEPARATOR_CONTROLLER.ID, + "multimachine.electromagneticseparator", + "Magnetic Flux Exhibitor").getStackForm(1)); + ItemList.Machine_Multi_Canner + .set(new MTEMultiCanner(MULTI_CANNER_CONTROLLER.ID, "multimachine.canner", "TurboCan Pro").getStackForm(1)); + + ItemList.WormholeGenerator.set( + new MTEWormholeGenerator( + WORMHOLE_GENERATOR_CONTROLLER.ID, + "multimachine.wormhole", + "Miniature Wormhole Generator").getStackForm(1)); + + ItemList.Machine_Multi_IndustrialLaserEngraver.set( + new MTEIndustrialLaserEngraver( + INDUSTRIAL_LASER_ENGRAVER_CONTROLLER.ID, + "multimachine.engraver", + "Hyper-Intensity Laser Engraver").getStackForm(1)); + + ItemList.Machine_Multi_IndustrialExtractor.set( + new MTEIndustrialExtractor( + INDUSTRIAL_EXTRACTOR_CONTROLLER.ID, + "multimachine.extractor", + "Dissection Apparatus").getStackForm(1)); + + ItemList.Machine_Multi_Lathe.set( + new MTEMultiLathe(MULTI_LATHE_CONTROLLER.ID, "multimachine.lathe", "Industrial Precision Lathe") + .getStackForm(1)); + + ItemList.Machine_Multi_IndustrialCompressor.set( + new MTEIndustrialCompressor( + INDUSTRIAL_COMPRESSOR_CONTROLLER.ID, + "multimachine.basiccompressor", + "Large Electric Compressor").getStackForm(1)); + ItemList.Machine_Multi_HIPCompressor.set( + new MTEHIPCompressor( + HIP_COMPRESSOR_CONTROLLER.ID, + "multimachine.hipcompressor", + "Hot Isostatic Pressurization Unit").getStackForm(1)); + ItemList.Machine_Multi_NeutroniumCompressor.set( + new MTENeutroniumCompressor( + NEUTRONIUM_COMPRESSOR_CONTROLLER.ID, + "multimachine.neutroniumcompressor", + "Neutronium Compressor").getStackForm(1)); + ItemList.Machine_Multi_BlackHoleCompressor.set( + new MTEBlackHoleCompressor( + BLACKHOLE_COMPRESSOR_CONTROLLER.ID, + "multimachine.blackholecompressor", + "Semi-Stable Black Hole Containment Field").getStackForm(1)); + + ItemList.Machine_Multi_Autoclave.set( + new MTEMultiAutoclave(MULTI_AUTOCLAVE_CONTROLLER.ID, "multimachine.autoclave", "Industrial Autoclave") + .getStackForm(1)); + + ItemList.LargeFluidExtractor.set( + new MTELargeFluidExtractor(LARGE_FLUID_EXTRACTOR.ID, "multimachine.fluidextractor", "Large Fluid Extractor") + .getStackForm(1)); + } + + private static void registerSteamMachines() { + ItemList.Machine_Bronze_Furnace.set( + new MTESteamFurnaceBronze(STEAM_FURNACE.ID, "bronzemachine.furnace", "Steam Furnace").getStackForm(1L)); + ItemList.Machine_Bronze_Macerator.set( + new MTESteamMaceratorBronze(STEAM_MACERATOR.ID, "bronzemachine.macerator", "Steam Macerator") + .getStackForm(1L)); + ItemList.Machine_Bronze_Extractor.set( + new MTESteamExtractorBronze(STEAM_EXTRACTOR.ID, "bronzemachine.extractor", "Steam Extractor") + .getStackForm(1L)); + ItemList.Machine_Bronze_Hammer.set( + new MTESteamForgeHammerBronze(STEAM_FORGE_HAMMER.ID, "bronzemachine.hammer", "Steam Forge Hammer") + .getStackForm(1L)); + ItemList.Machine_Bronze_Compressor.set( + new MTESteamCompressorBronze(STEAM_COMPRESSOR.ID, "bronzemachine.compressor", "Steam Compressor") + .getStackForm(1L)); + ItemList.Machine_Bronze_AlloySmelter.set( + new MTESteamAlloySmelterBronze(STEAM_ALLOY_SMELTER.ID, "bronzemachine.alloysmelter", "Steam Alloy Smelter") + .getStackForm(1L)); + + } + + private static void registerUnpackager() { + ItemList.Machine_LV_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_LV.ID, + "basicmachine.unboxinator.tier.01", + "Basic Unpackager", + 1, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + + ItemList.Machine_MV_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_MV.ID, + "basicmachine.unboxinator.tier.02", + "Advanced Unpackager", + 2, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + + ItemList.Machine_HV_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_HV.ID, + "basicmachine.unboxinator.tier.03", + "Advanced Unpackager II", + 3, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + + ItemList.Machine_EV_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_EV.ID, + "basicmachine.unboxinator.tier.04", + "Advanced Unpackager III", + 4, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + + ItemList.Machine_IV_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_IV.ID, + "basicmachine.unboxinator.tier.05", + "Unboxinator", + 5, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + + ItemList.Machine_LuV_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_LuV.ID, + "basicmachine.unboxinator.tier.06", + "Unboxinator", + 6, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + + ItemList.Machine_ZPM_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_ZPM.ID, + "basicmachine.unboxinator.tier.07", + "Unboxinator", + 7, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + + ItemList.Machine_UV_Unboxinator.set( + new MTEBasicMachineWithRecipe( + UNPACKAGER_UV.ID, + "basicmachine.unboxinator.tier.08", + "Unboxinator", + 8, + MachineType.UNPACKAGER.tooltipDescription(), + RecipeMaps.unpackagerRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "UNBOXINATOR", + null).getStackForm(1L)); + } + + private static void registerAssemblingMachine() { + + ItemList.Machine_LV_Assembler.set( + new MTEBasicMachineWithRecipe( + ASSEMBLER_LV.ID, + "basicmachine.assembler.tier.01", + "Basic Assembling Machine", + 1, + MachineType.ASSEMBLER.tooltipDescription(), + RecipeMaps.assemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Assembler.set( + new MTEBasicMachineWithRecipe( + ASSEMBLER_MV.ID, + "basicmachine.assembler.tier.02", + "Advanced Assembling Machine", + 2, + MachineType.ASSEMBLER.tooltipDescription(), + RecipeMaps.assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Assembler.set( + new MTEBasicMachineWithRecipe( + ASSEMBLER_HV.ID, + "basicmachine.assembler.tier.03", + "Advanced Assembling Machine II", + 3, + MachineType.ASSEMBLER.tooltipDescription(), + RecipeMaps.assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Assembler.set( + new MTEBasicMachineWithRecipe( + ASSEMBLER_EV.ID, + "basicmachine.assembler.tier.04", + "Advanced Assembling Machine III", + 4, + MachineType.ASSEMBLER.tooltipDescription(), + RecipeMaps.assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Assembler.set( + new MTEBasicMachineWithRecipe( + ASSEMBLER_IV.ID, + "basicmachine.assembler.tier.05", + "Advanced Assembling Machine IV", + 5, + MachineType.ASSEMBLER.tooltipDescription(), + RecipeMaps.assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.AssemblingMachineLuV.set( + new MTEBasicMachineWithRecipe( + ASSEMBLING_MACHINE_LuV.ID, + "basicmachine.assembler.tier.06", + "Elite Assembling Machine", + 6, + MachineType.ASSEMBLER.tooltipDescription(), + assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.AssemblingMachineZPM.set( + new MTEBasicMachineWithRecipe( + ASSEMBLING_MACHINE_ZPM.ID, + "basicmachine.assembler.tier.07", + "Elite Assembling Machine II", + 7, + MachineType.ASSEMBLER.tooltipDescription(), + assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.AssemblingMachineUV.set( + new MTEBasicMachineWithRecipe( + ASSEMBLING_MACHINE_UV.ID, + "basicmachine.assembler.tier.08", + "Ultimate Assembly Constructor", + 8, + MachineType.ASSEMBLER.tooltipDescription(), + assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.AssemblingMachineUHV.set( + new MTEBasicMachineWithRecipe( + ASSEMBLING_MACHINE_UHV.ID, + "basicmachine.assembler.tier.09", + "Epic Assembly Constructor", + 9, + MachineType.ASSEMBLER.tooltipDescription(), + assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.AssemblingMachineUEV.set( + new MTEBasicMachineWithRecipe( + ASSEMBLING_MACHINE_UEV.ID, + "basicmachine.assembler.tier.10", + "Epic Assembly Constructor II", + 10, + MachineType.ASSEMBLER.tooltipDescription(), + assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.AssemblingMachineUIV.set( + new MTEBasicMachineWithRecipe( + ASSEMBLING_MACHINE_UIV.ID, + "basicmachine.assembler.tier.11", + "Epic Assembly Constructor III", + 11, + MachineType.ASSEMBLER.tooltipDescription(), + assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + + ItemList.AssemblingMachineUMV.set( + new MTEBasicMachineWithRecipe( + ASSEMBLING_MACHINE_UMV.ID, + "basicmachine.assembler.tier.12", + "Epic Assembly Constructor IV", + 12, + MachineType.ASSEMBLER.tooltipDescription(), + assemblerRecipes, + 9, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ASSEMBLER", + null).getStackForm(1L)); + } + + private static void registerMatterAmplifier() { + ItemList.Machine_LV_Amplifab.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_LV.ID, + "basicmachine.amplifab.tier.01", + "Basic Amplifabricator", + 1, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + RecipeMaps.amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.Machine_MV_Amplifab.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_MV.ID, + "basicmachine.amplifab.tier.02", + "Advanced Amplifabricator", + 2, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + RecipeMaps.amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.Machine_HV_Amplifab.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_HV.ID, + "basicmachine.amplifab.tier.03", + "Advanced Amplifabricator II", + 3, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + RecipeMaps.amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.Machine_EV_Amplifab.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_EV.ID, + "basicmachine.amplifab.tier.04", + "Advanced Amplifabricator III", + 4, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + RecipeMaps.amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.Machine_IV_Amplifab.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_IV.ID, + "basicmachine.amplifab.tier.05", + "Advanced Amplifabricator IV", + 5, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + RecipeMaps.amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.AmplifabricatorLuV.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_LuV.ID, + "basicmachine.amplifab.tier.06", + "Elite Amplifabricator", + 6, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.AmplifabricatorZPM.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_ZPM.ID, + "basicmachine.amplifab.tier.07", + "Elite Amplifabricator II", + 7, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.AmplifabricatorUV.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_UV.ID, + "basicmachine.amplifab.tier.08", + "Ultimate Amplicreator", + 8, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.AmplifabricatorUHV.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_UHV.ID, + "basicmachine.amplifab.tier.09", + "Epic Amplicreator", + 9, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.AmplifabricatorUEV.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_UEV.ID, + "basicmachine.amplifab.tier.10", + "Epic Amplicreator II", + 10, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.AmplifabricatorUIV.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_UIV.ID, + "basicmachine.amplifab.tier.11", + "Epic Amplicreator III", + 11, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + + ItemList.AmplifabricatorUMV.set( + new MTEBasicMachineWithRecipe( + MATTER_AMPLIFIER_UMV.ID, + "basicmachine.amplifab.tier.12", + "Epic Amplicreator IV", + 12, + MachineType.MATTER_AMPLIFIER.tooltipDescription(), + amplifierRecipes, + 1, + 1, + 1000, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AMPLIFAB", + null).getStackForm(1L)); + } + + private static void registerAlloySmelter() { + ItemList.Machine_LV_AlloySmelter.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_LV.ID, + "basicmachine.alloysmelter.tier.01", + "Basic Alloy Smelter", + 1, + MachineType.ALLOY_SMELTER.tooltipDescription(), + RecipeMaps.alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.Machine_MV_AlloySmelter.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_MV.ID, + "basicmachine.alloysmelter.tier.02", + "Advanced Alloy Smelter", + 2, + MachineType.ALLOY_SMELTER.tooltipDescription(), + RecipeMaps.alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.Machine_HV_AlloySmelter.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_HV.ID, + "basicmachine.alloysmelter.tier.03", + "Advanced Alloy Smelter II", + 3, + MachineType.ALLOY_SMELTER.tooltipDescription(), + RecipeMaps.alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.Machine_EV_AlloySmelter.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_EV.ID, + "basicmachine.alloysmelter.tier.04", + "Advanced Alloy Smelter III", + 4, + MachineType.ALLOY_SMELTER.tooltipDescription(), + RecipeMaps.alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.Machine_IV_AlloySmelter.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_IV.ID, + "basicmachine.alloysmelter.tier.05", + "Advanced Alloy Smelter IV", + 5, + MachineType.ALLOY_SMELTER.tooltipDescription(), + RecipeMaps.alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.AlloySmelterLuV.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_LuV.ID, + "basicmachine.alloysmelter.tier.06", + "Elite Alloy Smelter", + 6, + MachineType.ALLOY_SMELTER.tooltipDescription(), + alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.AlloySmelterZPM.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_ZPM.ID, + "basicmachine.alloysmelter.tier.07", + "Elite Alloy Smelter II", + 7, + MachineType.ALLOY_SMELTER.tooltipDescription(), + alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.AlloySmelterUV.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_UV.ID, + "basicmachine.alloysmelter.tier.08", + "Ultimate Alloy Integrator", + 8, + MachineType.ALLOY_SMELTER.tooltipDescription(), + alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.AlloySmelterUHV.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_UHV.ID, + "basicmachine.alloysmelter.tier.09", + "Epic Alloy Integrator", + 9, + MachineType.ALLOY_SMELTER.tooltipDescription(), + alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.AlloySmelterUEV.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_UEV.ID, + "basicmachine.alloysmelter.tier.10", + "Epic Alloy Integrator II", + 10, + MachineType.ALLOY_SMELTER.tooltipDescription(), + alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.AlloySmelterUIV.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_UIV.ID, + "basicmachine.alloysmelter.tier.11", + "Epic Alloy Integrator III", + 11, + MachineType.ALLOY_SMELTER.tooltipDescription(), + alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + + ItemList.AlloySmelterUMV.set( + new MTEBasicMachineWithRecipe( + ALLOY_SMELTER_UMV.ID, + "basicmachine.alloysmelter.tier.12", + "Epic Alloy Integrator IV", + 12, + MachineType.ALLOY_SMELTER.tooltipDescription(), + alloySmelterRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ALLOY_SMELTER", + null).getStackForm(1L)); + } + + private static void registerHPSteamMachines() { + ItemList.Machine_HP_Extractor.set( + new MTESteamExtractorSteel(HP_STEAM_EXTRACTOR.ID, "hpmachine.extractor", "High Pressure Extractor") + .getStackForm(1L)); + ItemList.Machine_HP_Furnace.set( + new MTESteamFurnaceSteel(HP_STEAM_FURNACE.ID, "hpmachine.furnace", "High Pressure Furnace") + .getStackForm(1L)); + ItemList.Machine_HP_Macerator.set( + new MTESteamMaceratorSteel(HP_STEAM_MACERATOR.ID, "hpmachine.macerator", "High Pressure Macerator") + .getStackForm(1L)); + ItemList.Machine_HP_Hammer.set( + new MTESteamForgeHammerSteel(HP_STEAM_FORGE_HAMMER.ID, "hpmachine.hammer", "High Pressure Forge Hammer") + .getStackForm(1L)); + ItemList.Machine_HP_Compressor.set( + new MTESteamCompressorSteel(HP_STEAM_COMPRESSOR.ID, "hpmachine.compressor", "High Pressure Compressor") + .getStackForm(1L)); + ItemList.Machine_HP_AlloySmelter.set( + new MTESteamAlloySmelterSteel( + HP_STEAM_ALLOY_SMELTER.ID, + "hpmachine.alloysmelter", + "High Pressure Alloy Smelter").getStackForm(1L)); + } + + private static void registerLocker() { + ItemList.Locker_ULV + .set(new MTELocker(LOCKER_ULV.ID, "locker.tier.00", "Ultra Low Voltage Locker", 0).getStackForm(1L)); + ItemList.Locker_LV.set(new MTELocker(LOCKER_LV.ID, "locker.tier.01", "Low Voltage Locker", 1).getStackForm(1L)); + ItemList.Locker_MV + .set(new MTELocker(LOCKER_MV.ID, "locker.tier.02", "Medium Voltage Locker", 2).getStackForm(1L)); + ItemList.Locker_HV + .set(new MTELocker(LOCKER_HV.ID, "locker.tier.03", "High Voltage Locker", 3).getStackForm(1L)); + ItemList.Locker_EV + .set(new MTELocker(LOCKER_EV.ID, "locker.tier.04", "Extreme Voltage Locker", 4).getStackForm(1L)); + ItemList.Locker_IV + .set(new MTELocker(LOCKER_IV.ID, "locker.tier.05", "Insane Voltage Locker", 5).getStackForm(1L)); + ItemList.Locker_LuV + .set(new MTELocker(LOCKER_LuV.ID, "locker.tier.06", "Ludicrous Voltage Locker", 6).getStackForm(1L)); + ItemList.Locker_ZPM + .set(new MTELocker(LOCKER_ZPM.ID, "locker.tier.07", "ZPM Voltage Locker", 7).getStackForm(1L)); + ItemList.Locker_UV + .set(new MTELocker(LOCKER_UV.ID, "locker.tier.08", "Ultimate Voltage Locker", 8).getStackForm(1L)); + ItemList.Locker_MAX + .set(new MTELocker(LOCKER_UHV.ID, "locker.tier.09", "Highly Ultimate Voltage Locker", 9).getStackForm(1L)); + } + + private static void registerScanner() { + ItemList.Machine_LV_Scanner + .set(new MTEScanner(SCANNER_LV.ID, "basicmachine.scanner.tier.01", "Basic Scanner", 1).getStackForm(1L)); + ItemList.Machine_MV_Scanner + .set(new MTEScanner(SCANNER_MV.ID, "basicmachine.scanner.tier.02", "Advanced Scanner", 2).getStackForm(1L)); + ItemList.Machine_HV_Scanner.set( + new MTEScanner(SCANNER_HV.ID, "basicmachine.scanner.tier.03", "Advanced Scanner II", 3).getStackForm(1L)); + ItemList.Machine_EV_Scanner.set( + new MTEScanner(SCANNER_EV.ID, "basicmachine.scanner.tier.04", "Advanced Scanner III", 4).getStackForm(1L)); + ItemList.Machine_IV_Scanner.set( + new MTEScanner(SCANNER_IV.ID, "basicmachine.scanner.tier.05", "Advanced Scanner IV", 5).getStackForm(1L)); + ItemList.ScannerLuV + .set(new MTEScanner(SCANNER_LuV.ID, "basicmachine.scanner.tier.06", "Elite Scanner", 6).getStackForm(1L)); + ItemList.ScannerZPM.set( + new MTEScanner(SCANNER_ZPM.ID, "basicmachine.scanner.tier.07", "Elite Scanner II", 7).getStackForm(1L)); + ItemList.ScannerUV.set( + new MTEScanner(SCANNER_UV.ID, "basicmachine.scanner.tier.08", "Ultimate Electron Microscope", 8) + .getStackForm(1L)); + ItemList.ScannerUHV.set( + new MTEScanner(SCANNER_UHV.ID, "basicmachine.scanner.tier.09", "Epic Electron Microscope", 9) + .getStackForm(1L)); + ItemList.ScannerUEV.set( + new MTEScanner(SCANNER_UEV.ID, "basicmachine.scanner.tier.10", "Epic Electron Microscope II", 10) + .getStackForm(1L)); + ItemList.ScannerUIV.set( + new MTEScanner(SCANNER_UIV.ID, "basicmachine.scanner.tier.11", "Epic Electron Microscope III", 11) + .getStackForm(1L)); + ItemList.ScannerUMV.set( + new MTEScanner(SCANNER_UMV.ID, "basicmachine.scanner.tier.12", "Epic Electron Microscope IV", 12) + .getStackForm(1L)); + } + + private static void registerPackager() { + ItemList.Machine_LV_Boxinator.set( + new MTEBoxinator(PACKAGER_LV.ID, "basicmachine.boxinator.tier.01", "Basic Packager", 1).getStackForm(1L)); + ItemList.Machine_MV_Boxinator.set( + new MTEBoxinator(PACKAGER_MV.ID, "basicmachine.boxinator.tier.02", "Advanced Packager", 2) + .getStackForm(1L)); + ItemList.Machine_HV_Boxinator.set( + new MTEBoxinator(PACKAGER_HV.ID, "basicmachine.boxinator.tier.03", "Advanced Packager II", 3) + .getStackForm(1L)); + ItemList.Machine_EV_Boxinator.set( + new MTEBoxinator(PACKAGER_EV.ID, "basicmachine.boxinator.tier.04", "Advanced Packager III", 4) + .getStackForm(1L)); + ItemList.Machine_IV_Boxinator + .set(new MTEBoxinator(PACKAGER_IV.ID, "basicmachine.boxinator.tier.05", "Boxinator", 5).getStackForm(1L)); + ItemList.Machine_LuV_Boxinator + .set(new MTEBoxinator(PACKAGER_LuV.ID, "basicmachine.boxinator.tier.06", "Boxinator", 6).getStackForm(1L)); + ItemList.Machine_ZPM_Boxinator + .set(new MTEBoxinator(PACKAGER_ZPM.ID, "basicmachine.boxinator.tier.07", "Boxinator", 7).getStackForm(1L)); + ItemList.Machine_UV_Boxinator + .set(new MTEBoxinator(PACKAGER_UV.ID, "basicmachine.boxinator.tier.08", "Boxinator", 8).getStackForm(1L)); + } + + private static void registerRockBreaker() { + ItemList.Machine_LV_RockBreaker.set( + new MTERockBreaker(ROCK_BREAKER_LV.ID, "basicmachine.rockbreaker.tier.01", "Basic Rock Breaker", 1) + .getStackForm(1L)); + ItemList.Machine_MV_RockBreaker.set( + new MTERockBreaker(ROCK_BREAKER_MV.ID, "basicmachine.rockbreaker.tier.02", "Advanced Rock Breaker", 2) + .getStackForm(1L)); + ItemList.Machine_HV_RockBreaker.set( + new MTERockBreaker(ROCK_BREAKER_HV.ID, "basicmachine.rockbreaker.tier.03", "Advanced Rock Breaker II", 3) + .getStackForm(1L)); + ItemList.Machine_EV_RockBreaker.set( + new MTERockBreaker(ROCK_BREAKER_EV.ID, "basicmachine.rockbreaker.tier.04", "Advanced Rock Breaker III", 4) + .getStackForm(1L)); + ItemList.Machine_IV_RockBreaker.set( + new MTERockBreaker( + ROCK_BREAKER_IV.ID, + "basicmachine.rockbreaker.tier.05", + "Cryogenic Magma Solidifier R-8200", + 5).getStackForm(1L)); + ItemList.RockBreakerLuV.set( + new MTERockBreaker(ROCK_BREAKER_LuV.ID, "rockbreaker.tier.06", "Cryogenic Magma Solidifier R-9200", 6) + .getStackForm(1L)); + + ItemList.RockBreakerZPM.set( + new MTERockBreaker(ROCK_BREAKER_ZPM.ID, "rockbreaker.tier.07", "Cryogenic Magma Solidifier R-10200", 7) + .getStackForm(1L)); + + ItemList.RockBreakerUV.set( + new MTERockBreaker(ROCK_BREAKER_UV.ID, "rockbreaker.tier.08", "Cryogenic Magma Solidifier R-11200", 8) + .getStackForm(1L)); + + ItemList.RockBreakerUHV.set( + new MTERockBreaker(ROCK_BREAKER_UHV.ID, "rockbreaker.tier.09", "Cryogenic Magma Solidifier R-12200", 9) + .getStackForm(1L)); + + ItemList.RockBreakerUEV.set( + new MTERockBreaker(ROCK_BREAKER_UEV.ID, "rockbreaker.tier.10", "Cryogenic Magma Solidifier R-13200", 10) + .getStackForm(1L)); + + ItemList.RockBreakerUIV.set( + new MTERockBreaker(ROCK_BREAKER_UIV.ID, "rockbreaker.tier.11", "Cryogenic Magma Solidifier R-14200", 11) + .getStackForm(1L)); + + ItemList.RockBreakerUMV.set( + new MTERockBreaker(ROCK_BREAKER_UMV.ID, "rockbreaker.tier.12", "Cryogenic Magma Solidifier R-15200", 12) + .getStackForm(1L)); + } + + private static void registerIndustrialApiary() { + if (Forestry.isModLoaded()) { + ItemList.Machine_IndustrialApiary.set( + new MTEIndustrialApiary(INDUSTRIAL_APIARY.ID, "basicmachine.industrialapiary", "Industrial Apiary", 8) + .getStackForm(1L)); + } + } + + private static void registerMassFab() { + ItemList.Machine_LV_Massfab.set( + new MTEMassfabricator(MASS_FABRICATOR_LV.ID, "basicmachine.massfab.tier.01", "Basic Mass Fabricator", 1) + .getStackForm(1L)); + ItemList.Machine_MV_Massfab.set( + new MTEMassfabricator(MASS_FABRICATOR_MV.ID, "basicmachine.massfab.tier.02", "Advanced Mass Fabricator", 2) + .getStackForm(1L)); + ItemList.Machine_HV_Massfab.set( + new MTEMassfabricator( + MASS_FABRICATOR_HV.ID, + "basicmachine.massfab.tier.03", + "Advanced Mass Fabricator II", + 3).getStackForm(1L)); + ItemList.Machine_EV_Massfab.set( + new MTEMassfabricator( + MASS_FABRICATOR_EV.ID, + "basicmachine.massfab.tier.04", + "Advanced Mass Fabricator III", + 4).getStackForm(1L)); + ItemList.Machine_IV_Massfab.set( + new MTEMassfabricator( + MASS_FABRICATOR_IV.ID, + "basicmachine.massfab.tier.05", + "Advanced Mass Fabricator IV", + 5).getStackForm(1L)); + } + + private static void registerReplicator() { + ItemList.Machine_LV_Replicator.set( + new MTEReplicator(REPLICATOR_LV.ID, "basicmachine.replicator.tier.01", "Basic Replicator", 1) + .getStackForm(1L)); + ItemList.Machine_MV_Replicator.set( + new MTEReplicator(REPLICATOR_MV.ID, "basicmachine.replicator.tier.02", "Advanced Replicator", 2) + .getStackForm(1L)); + ItemList.Machine_HV_Replicator.set( + new MTEReplicator(REPLICATOR_HV.ID, "basicmachine.replicator.tier.03", "Advanced Replicator II", 3) + .getStackForm(1L)); + ItemList.Machine_EV_Replicator.set( + new MTEReplicator(REPLICATOR_EV.ID, "basicmachine.replicator.tier.04", "Advanced Replicator III", 4) + .getStackForm(1L)); + ItemList.Machine_IV_Replicator.set( + new MTEReplicator(REPLICATOR_IV.ID, "basicmachine.replicator.tier.05", "Advanced Replicator IV", 5) + .getStackForm(1L)); + + ItemList.ReplicatorLuV.set( + new MTEReplicator(MATTER_REPLICATOR_LuV.ID, "basicmachine.replicator.tier.06", "Elite Replicator", 6) + .getStackForm(1L)); + ItemList.ReplicatorZPM.set( + new MTEReplicator(MATTER_REPLICATOR_ZPM.ID, "basicmachine.replicator.tier.07", "Elite Replicator II", 7) + .getStackForm(1L)); + ItemList.ReplicatorUV.set( + new MTEReplicator( + MATTER_REPLICATOR_UV.ID, + "basicmachine.replicator.tier.08", + "Ultimate Elemental Composer", + 8).getStackForm(1L)); + ItemList.ReplicatorUHV.set( + new MTEReplicator(MATTER_REPLICATOR_UHV.ID, "basicmachine.replicator.tier.09", "Epic Elemental Composer", 9) + .getStackForm(1L)); + ItemList.ReplicatorUEV.set( + new MTEReplicator( + MATTER_REPLICATOR_UEV.ID, + "basicmachine.replicator.tier.10", + "Epic Elemental Composer II", + 10).getStackForm(1L)); + ItemList.ReplicatorUIV.set( + new MTEReplicator( + MATTER_REPLICATOR_UIV.ID, + "basicmachine.replicator.tier.11", + "Epic Elemental Composer III", + 11).getStackForm(1L)); + ItemList.ReplicatorUMV.set( + new MTEReplicator( + MATTER_REPLICATOR_UMV.ID, + "basicmachine.replicator.tier.12", + "Epic Elemental Composer IV", + 12).getStackForm(1L)); + } + + private static void registerBrewery() { + ItemList.Machine_LV_Brewery.set( + new MTEPotionBrewer(BREWERY_LV.ID, "basicmachine.brewery.tier.01", "Basic Brewery", 1).getStackForm(1L)); + ItemList.Machine_MV_Brewery.set( + new MTEPotionBrewer(BREWERY_MV.ID, "basicmachine.brewery.tier.02", "Advanced Brewery", 2).getStackForm(1L)); + ItemList.Machine_HV_Brewery.set( + new MTEPotionBrewer(BREWERY_HV.ID, "basicmachine.brewery.tier.03", "Advanced Brewery II", 3) + .getStackForm(1L)); + ItemList.Machine_EV_Brewery.set( + new MTEPotionBrewer(BREWERY_EV.ID, "basicmachine.brewery.tier.04", "Advanced Brewery III", 4) + .getStackForm(1L)); + ItemList.Machine_IV_Brewery.set( + new MTEPotionBrewer(BREWERY_IV.ID, "basicmachine.brewery.tier.05", "Advanced Brewery IV", 5) + .getStackForm(1L)); + + ItemList.BreweryLuV.set( + new MTEPotionBrewer(BREWERY_LuV.ID, "basicmachine.brewery.tier.06", "Elite Brewery", 6).getStackForm(1L)); + ItemList.BreweryZPM.set( + new MTEPotionBrewer(BREWERY_ZPM.ID, "basicmachine.brewery.tier.07", "Elite Brewery II", 7) + .getStackForm(1L)); + ItemList.BreweryUV.set( + new MTEPotionBrewer(BREWERY_UV.ID, "basicmachine.brewery.tier.08", "Ultimate Brew Rusher", 8) + .getStackForm(1L)); + ItemList.BreweryUHV.set( + new MTEPotionBrewer(BREWERY_UHV.ID, "basicmachine.brewery.tier.09", "Epic Brew Rusher", 9) + .getStackForm(1L)); + ItemList.BreweryUEV.set( + new MTEPotionBrewer(BREWERY_UEV.ID, "basicmachine.brewery.tier.10", "Epic Brew Rusher II", 10) + .getStackForm(1L)); + ItemList.BreweryUIV.set( + new MTEPotionBrewer(BREWERY_UIV.ID, "basicmachine.brewery.tier.11", "Epic Brew Rusher III", 11) + .getStackForm(1L)); + ItemList.BreweryUMV.set( + new MTEPotionBrewer(BREWERY_UMV.ID, "basicmachine.brewery.tier.12", "Epic Brew Rusher IV", 12) + .getStackForm(1L)); + } + + private static void registerMiner() { + ItemList.Machine_LV_Miner + .set(new MTEMiner(MINER_LV.ID, "basicmachine.miner.tier.01", "Basic Miner", 1).getStackForm(1L)); + ItemList.Machine_MV_Miner + .set(new MTEMiner(MINER_MV.ID, "basicmachine.miner.tier.02", "Good Miner", 2).getStackForm(1L)); + ItemList.Machine_HV_Miner + .set(new MTEMiner(MINER_HV.ID, "basicmachine.miner.tier.03", "Advanced Miner", 3).getStackForm(1L)); + } + + private static void registerPump() { + ItemList.Pump_LV.set(new MTEPump(PUMP_LV.ID, "basicmachine.pump.tier.01", "Basic Pump", 1).getStackForm(1L)); + ItemList.Pump_MV.set(new MTEPump(PUMP_MV.ID, "basicmachine.pump.tier.02", "Advanced Pump", 2).getStackForm(1L)); + ItemList.Pump_HV + .set(new MTEPump(PUMP_HV.ID, "basicmachine.pump.tier.03", "Advanced Pump II", 3).getStackForm(1L)); + ItemList.Pump_EV + .set(new MTEPump(PUMP_EV.ID, "basicmachine.pump.tier.04", "Advanced Pump III", 4).getStackForm(1L)); + ItemList.Pump_IV + .set(new MTEPump(PUMP_IV.ID, "basicmachine.pump.tier.05", "Advanced Pump IV", 5).getStackForm(1L)); + ItemList.PumpLuV + .set(new MTEPump(PUMP_LuV.ID, "basicmachine.pump.tier.06", "Lake Dislocator", 6).getStackForm(1L)); + ItemList.PumpZPM + .set(new MTEPump(PUMP_ZPM.ID, "basicmachine.pump.tier.07", "Ocean Transposer", 7).getStackForm(1L)); + } + + private static void registerTeleporter() { + ItemList.Teleporter + .set(new MTETeleporter(TELEPORTER.ID, "basicmachine.teleporter", "Teleporter", 9).getStackForm(1L)); + } + + private static void registerMonsterRepellator() { + ItemList.MobRep_LV.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_LV.ID, + "basicmachine.mobrep.tier.01", + "Basic Monster Repellator", + 1).getStackForm(1L)); + ItemList.MobRep_MV.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_MV.ID, + "basicmachine.mobrep.tier.02", + "Advanced Monster Repellator", + 2).getStackForm(1L)); + ItemList.MobRep_HV.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_HV.ID, + "basicmachine.mobrep.tier.03", + "Advanced Monster Repellator II", + 3).getStackForm(1L)); + ItemList.MobRep_EV.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_EV.ID, + "basicmachine.mobrep.tier.04", + "Advanced Monster Repellator III", + 4).getStackForm(1L)); + ItemList.MobRep_IV.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_IV.ID, + "basicmachine.mobrep.tier.05", + "Advanced Monster Repellator IV", + 5).getStackForm(1L)); + ItemList.MobRep_LuV.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_LuV.ID, + "basicmachine.mobrep.tier.06", + "Advanced Monster Repellator V", + 6).getStackForm(1L)); + ItemList.MobRep_ZPM.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_ZPM.ID, + "basicmachine.mobrep.tier.07", + "Advanced Monster Repellator VI", + 7).getStackForm(1L)); + ItemList.MobRep_UV.set( + new MTEMonsterRepellent( + MONSTER_REPELLATOR_UV.ID, + "basicmachine.mobrep.tier.08", + "Advanced Monster Repellator VII", + 8).getStackForm(1L)); + } + + private void registerWorldAccelerator() { + ItemList.AcceleratorLV.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_LV.ID, + "basicmachine.accelerator.tier.01", + "Basic World Accelerator", + 1).getStackForm(1L)); + ItemList.AcceleratorMV.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_MV.ID, + "basicmachine.accelerator.tier.02", + "Advanced World Accelerator", + 2).getStackForm(1L)); + ItemList.AcceleratorHV.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_HV.ID, + "basicmachine.accelerator.tier.03", + "Advanced World Accelerator II", + 3).getStackForm(1L)); + ItemList.AcceleratorEV.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_EV.ID, + "basicmachine.accelerator.tier.04", + "Advanced World Accelerator III", + 4).getStackForm(1L)); + ItemList.AcceleratorIV.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_IV.ID, + "basicmachine.accelerator.tier.05", + "Advanced World Accelerator IV", + 5).getStackForm(1L)); + ItemList.AcceleratorLuV.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_LuV.ID, + "basicmachine.accelerator.tier.06", + "Elite World Accelerator", + 6).getStackForm(1L)); + ItemList.AcceleratorZPM.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_ZPM.ID, + "basicmachine.accelerator.tier.07", + "Elite World Accelerator II", + 7).getStackForm(1L)); + ItemList.AcceleratorUV.set( + new MTEWorldAccelerator( + WORLD_ACCELERATOR_UV.ID, + "basicmachine.accelerator.tier.08", + "Ultimate Time Anomaly", + 8).getStackForm(1L)); + + } + + private static void registerAdvancedSeismicProspector() { + ItemList.Seismic_Prospector_Adv_LV.set( + new MTEAdvSeismicProspector( + ADVANCED_SEISMIC_PROSPECTOR_LV.ID, + "basicmachine.seismicprospector.07", + "Advanced Seismic Prospector LV", + 1, + 5 * 16 / 2, + 2).getStackForm(1)); + ItemList.Seismic_Prospector_Adv_MV.set( + new MTEAdvSeismicProspector( + ADVANCED_SEISMIC_PROSPECTOR_MV.ID, + "basicmachine.seismicprospector.06", + "Advanced Seismic Prospector MV", + 2, + 7 * 16 / 2, + 2).getStackForm(1)); + ItemList.Seismic_Prospector_Adv_HV.set( + new MTEAdvSeismicProspector( + ADVANCED_SEISMIC_PROSPECTOR_HV.ID, + "basicmachine.seismicprospector.05", + "Advanced Seismic Prospector HV", + 3, + 9 * 16 / 2, + 2).getStackForm(1)); + ItemList.Seismic_Prospector_Adv_EV.set( + new MTEAdvSeismicProspector( + ADVANCED_SEISMIC_PROSPECTOR_EV.ID, + "basicmachine.seismicprospector.04", + "Advanced Seismic Prospector EV", + 4, + 11 * 16 / 2, + 2).getStackForm(1)); + } + + private static void registerMicrowaveEnergyTransmitter() { + ItemList.MicroTransmitter_HV.set( + new MTEMicrowaveEnergyTransmitter( + MICROWAVE_ENERGY_TRANSMITTER_HV.ID, + "basicmachine.microtransmitter.03", + "HV Microwave Energy Transmitter", + 3).getStackForm(1L)); + ItemList.MicroTransmitter_EV.set( + new MTEMicrowaveEnergyTransmitter( + MICROWAVE_ENERGY_TRANSMITTER_EV.ID, + "basicmachine.microtransmitter.04", + "EV Microwave Energy Transmitter", + 4).getStackForm(1L)); + ItemList.MicroTransmitter_IV.set( + new MTEMicrowaveEnergyTransmitter( + MICROWAVE_ENERGY_TRANSMITTER_IV.ID, + "basicmachine.microtransmitter.05", + "IV Microwave Energy Transmitter", + 5).getStackForm(1L)); + ItemList.MicroTransmitter_LUV.set( + new MTEMicrowaveEnergyTransmitter( + MICROWAVE_ENERGY_TRANSMITTER_LuV.ID, + "basicmachine.microtransmitter.06", + "LuV Microwave Energy Transmitter", + 6).getStackForm(1L)); + ItemList.MicroTransmitter_ZPM.set( + new MTEMicrowaveEnergyTransmitter( + MICROWAVE_ENERGY_TRANSMITTER_ZPM.ID, + "basicmachine.microtransmitter.07", + "ZPM Microwave Energy Transmitter", + 7).getStackForm(1L)); + ItemList.MicroTransmitter_UV.set( + new MTEMicrowaveEnergyTransmitter( + MICROWAVE_ENERGY_TRANSMITTER_UV.ID, + "basicmachine.microtransmitter.08", + "UV Microwave Energy Transmitter", + 8).getStackForm(1L)); + } + + private static void registerBetterJukebox() { + ItemList.BetterJukebox_LV.set( + new MTEBetterJukebox( + BETTER_JUKEBOX_LV.ID, + "basicmachine.betterjukebox.tier.01", + "Basic Electric Jukebox", + 1).getStackForm(1L)); + ItemList.BetterJukebox_MV.set( + new MTEBetterJukebox( + BETTER_JUKEBOX_MV.ID, + "basicmachine.betterjukebox.tier.02", + "Advanced Electric Jukebox", + 2).getStackForm(1L)); + ItemList.BetterJukebox_HV.set( + new MTEBetterJukebox( + BETTER_JUKEBOX_HV.ID, + "basicmachine.betterjukebox.tier.03", + "Advanced Electric Jukebox II", + 3).getStackForm(1L)); + ItemList.BetterJukebox_EV.set( + new MTEBetterJukebox(BETTER_JUKEBOX_EV.ID, "basicmachine.betterjukebox.tier.04", "Extreme Music Mixer", 4) + .getStackForm(1L)); + ItemList.BetterJukebox_IV.set( + new MTEBetterJukebox(BETTER_JUKEBOX_IV.ID, "basicmachine.betterjukebox.tier.05", "Duke Mix'em 3D", 5) + .getStackForm(1L)); + } + + private static void registerChestBuffer() { + ItemList.Automation_ChestBuffer_ULV.set( + new MTEChestBuffer( + CHEST_BUFFER_ULV.ID, + "automation.chestbuffer.tier.00", + "Ultra Low Voltage Chest Buffer", + 0).getStackForm(1L)); + ItemList.Automation_ChestBuffer_LV.set( + new MTEChestBuffer(CHEST_BUFFER_LV.ID, "automation.chestbuffer.tier.01", "Low Voltage Chest Buffer", 1) + .getStackForm(1L)); + ItemList.Automation_ChestBuffer_MV.set( + new MTEChestBuffer(CHEST_BUFFER_MV.ID, "automation.chestbuffer.tier.02", "Medium Voltage Chest Buffer", 2) + .getStackForm(1L)); + ItemList.Automation_ChestBuffer_HV.set( + new MTEChestBuffer(CHEST_BUFFER_HV.ID, "automation.chestbuffer.tier.03", "High Voltage Chest Buffer", 3) + .getStackForm(1L)); + ItemList.Automation_ChestBuffer_EV.set( + new MTEChestBuffer(CHEST_BUFFER_EV.ID, "automation.chestbuffer.tier.04", "Extreme Voltage Chest Buffer", 4) + .getStackForm(1L)); + ItemList.Automation_ChestBuffer_IV.set( + new MTEChestBuffer(CHEST_BUFFER_IV.ID, "automation.chestbuffer.tier.05", "Insane Voltage Chest Buffer", 5) + .getStackForm(1L)); + ItemList.Automation_ChestBuffer_LuV.set( + new MTEChestBuffer( + CHEST_BUFFER_LuV.ID, + "automation.chestbuffer.tier.06", + "Ludicrous Voltage Chest Buffer", + 6).getStackForm(1L)); + ItemList.Automation_ChestBuffer_ZPM.set( + new MTEChestBuffer(CHEST_BUFFER_ZPM.ID, "automation.chestbuffer.tier.07", "ZPM Voltage Chest Buffer", 7) + .getStackForm(1L)); + ItemList.Automation_ChestBuffer_UV.set( + new MTEChestBuffer(CHEST_BUFFER_UV.ID, "automation.chestbuffer.tier.08", "Ultimate Voltage Chest Buffer", 8) + .getStackForm(1L)); + ItemList.Automation_ChestBuffer_UHV.set( + new MTEChestBuffer( + CHEST_BUFFER_UHV.ID, + "automation.chestbuffer.tier.09", + "Highly Ultimate Voltage Chest Buffer", + 9).getStackForm(1L)); + + ItemList.Automation_ChestBuffer_UEV.set( + new MTEChestBuffer( + CHEST_BUFFER_UEV.ID, + "automation.chestbuffer.tier.10", + "Ultra High Voltage Chest Buffer", + 10).getStackForm(1L)); + + ItemList.Automation_ChestBuffer_UIV.set( + new MTEChestBuffer(CHEST_BUFFER_UIV.ID, "automation.chestbuffer.tier.11", "UIV Voltage Chest Buffer", 11) + .getStackForm(1L)); + + ItemList.Automation_ChestBuffer_UMV.set( + new MTEChestBuffer(CHEST_BUFFER_UMV.ID, "automation.chestbuffer.tier.12", "UMV Voltage Chest Buffer", 12) + .getStackForm(1L)); + } + + private static void registerItemFilter() { + ItemList.Automation_Filter_ULV.set( + new MTEFilter(ITEM_FILTER_ULV.ID, "automation.filter.tier.00", "Ultra Low Voltage Item Filter", 0) + .getStackForm(1L)); + ItemList.Automation_Filter_LV.set( + new MTEFilter(ITEM_FILTER_LV.ID, "automation.filter.tier.01", "Low Voltage Item Filter", 1) + .getStackForm(1L)); + ItemList.Automation_Filter_MV.set( + new MTEFilter(ITEM_FILTER_MV.ID, "automation.filter.tier.02", "Medium Voltage Item Filter", 2) + .getStackForm(1L)); + ItemList.Automation_Filter_HV.set( + new MTEFilter(ITEM_FILTER_HV.ID, "automation.filter.tier.03", "High Voltage Item Filter", 3) + .getStackForm(1L)); + ItemList.Automation_Filter_EV.set( + new MTEFilter(ITEM_FILTER_EV.ID, "automation.filter.tier.04", "Extreme Voltage Item Filter", 4) + .getStackForm(1L)); + ItemList.Automation_Filter_IV.set( + new MTEFilter(ITEM_FILTER_IV.ID, "automation.filter.tier.05", "Insane Voltage Item Filter", 5) + .getStackForm(1L)); + ItemList.Automation_Filter_LuV.set( + new MTEFilter(ITEM_FILTER_LuV.ID, "automation.filter.tier.06", "Ludicrous Voltage Item Filter", 6) + .getStackForm(1L)); + ItemList.Automation_Filter_ZPM.set( + new MTEFilter(ITEM_FILTER_ZPM.ID, "automation.filter.tier.07", "ZPM Voltage Item Filter", 7) + .getStackForm(1L)); + ItemList.Automation_Filter_UV.set( + new MTEFilter(ITEM_FILTER_UV.ID, "automation.filter.tier.08", "Ultimate Voltage Item Filter", 8) + .getStackForm(1L)); + ItemList.Automation_Filter_MAX.set( + new MTEFilter(ITEM_FILTER_UHV.ID, "automation.filter.tier.09", "Highly Ultimate Voltage Item Filter", 9) + .getStackForm(1L)); + } + + private static void registerTypeFilter() { + ItemList.Automation_TypeFilter_ULV.set( + new MTETypeFilter(TYPE_FILTER_ULV.ID, "automation.typefilter.tier.00", "Ultra Low Voltage Type Filter", 0) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_LV.set( + new MTETypeFilter(TYPE_FILTER_LV.ID, "automation.typefilter.tier.01", "Low Voltage Type Filter", 1) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_MV.set( + new MTETypeFilter(TYPE_FILTER_MV.ID, "automation.typefilter.tier.02", "Medium Voltage Type Filter", 2) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_HV.set( + new MTETypeFilter(TYPE_FILTER_HV.ID, "automation.typefilter.tier.03", "High Voltage Type Filter", 3) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_EV.set( + new MTETypeFilter(TYPE_FILTER_EV.ID, "automation.typefilter.tier.04", "Extreme Voltage Type Filter", 4) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_IV.set( + new MTETypeFilter(TYPE_FILTER_IV.ID, "automation.typefilter.tier.05", "Insane Voltage Type Filter", 5) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_LuV.set( + new MTETypeFilter(TYPE_FILTER_LuV.ID, "automation.typefilter.tier.06", "Ludicrous Voltage Type Filter", 6) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_ZPM.set( + new MTETypeFilter(TYPE_FILTER_ZPM.ID, "automation.typefilter.tier.07", "ZPM Voltage Type Filter", 7) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_UV.set( + new MTETypeFilter(TYPE_FILTER_UV.ID, "automation.typefilter.tier.08", "Ultimate Voltage Type Filter", 8) + .getStackForm(1L)); + ItemList.Automation_TypeFilter_MAX.set( + new MTETypeFilter( + TYPE_FILTER_UHV.ID, + "automation.typefilter.tier.09", + "Highly Ultimate Voltage Type Filter", + 9).getStackForm(1L)); + } + + private static void registerRegulator() { + ItemList.Automation_Regulator_ULV.set( + new MTERegulator(VOLTAGE_REGULATOR_ULV.ID, "automation.regulator.tier.00", "Ultra Low Voltage Regulator", 0) + .getStackForm(1L)); + ItemList.Automation_Regulator_LV.set( + new MTERegulator(VOLTAGE_REGULATOR_LV.ID, "automation.regulator.tier.01", "Low Voltage Regulator", 1) + .getStackForm(1L)); + ItemList.Automation_Regulator_MV.set( + new MTERegulator(VOLTAGE_REGULATOR_MV.ID, "automation.regulator.tier.02", "Medium Voltage Regulator", 2) + .getStackForm(1L)); + ItemList.Automation_Regulator_HV.set( + new MTERegulator(VOLTAGE_REGULATOR_HV.ID, "automation.regulator.tier.03", "High Voltage Regulator", 3) + .getStackForm(1L)); + ItemList.Automation_Regulator_EV.set( + new MTERegulator(VOLTAGE_REGULATOR_EV.ID, "automation.regulator.tier.04", "Extreme Voltage Regulator", 4) + .getStackForm(1L)); + ItemList.Automation_Regulator_IV.set( + new MTERegulator(VOLTAGE_REGULATOR_IV.ID, "automation.regulator.tier.05", "Insane Voltage Regulator", 5) + .getStackForm(1L)); + ItemList.Automation_Regulator_LuV.set( + new MTERegulator(VOLTAGE_REGULATOR_LuV.ID, "automation.regulator.tier.06", "Ludicrous Voltage Regulator", 6) + .getStackForm(1L)); + ItemList.Automation_Regulator_ZPM.set( + new MTERegulator(VOLTAGE_REGULATOR_ZPM.ID, "automation.regulator.tier.07", "ZPM Voltage Regulator", 7) + .getStackForm(1L)); + ItemList.Automation_Regulator_UV.set( + new MTERegulator(VOLTAGE_REGULATOR_UV.ID, "automation.regulator.tier.08", "Ultimate Voltage Regulator", 8) + .getStackForm(1L)); + ItemList.Automation_Regulator_MAX.set( + new MTERegulator( + VOLTAGE_REGULATOR_UHV.ID, + "automation.regulator.tier.09", + "Highly Ultimate Voltage Regulator", + 9).getStackForm(1L)); + } + + private static void registerSuperBuffer() { + ItemList.Automation_SuperBuffer_ULV.set( + new MTESuperBuffer( + SUPER_BUFFER_ULV.ID, + "automation.superbuffer.tier.00", + "Ultra Low Voltage Super Buffer", + 0).getStackForm(1L)); + ItemList.Automation_SuperBuffer_LV.set( + new MTESuperBuffer(SUPER_BUFFER_LV.ID, "automation.superbuffer.tier.01", "Low Voltage Super Buffer", 1) + .getStackForm(1L)); + ItemList.Automation_SuperBuffer_MV.set( + new MTESuperBuffer(SUPER_BUFFER_MV.ID, "automation.superbuffer.tier.02", "Medium Voltage Super Buffer", 2) + .getStackForm(1L)); + ItemList.Automation_SuperBuffer_HV.set( + new MTESuperBuffer(SUPER_BUFFER_HV.ID, "automation.superbuffer.tier.03", "High Voltage Super Buffer", 3) + .getStackForm(1L)); + ItemList.Automation_SuperBuffer_EV.set( + new MTESuperBuffer(SUPER_BUFFER_EV.ID, "automation.superbuffer.tier.04", "Extreme Voltage Super Buffer", 4) + .getStackForm(1L)); + ItemList.Automation_SuperBuffer_IV.set( + new MTESuperBuffer(SUPER_BUFFER_IV.ID, "automation.superbuffer.tier.05", "Insane Voltage Super Buffer", 5) + .getStackForm(1L)); + ItemList.Automation_SuperBuffer_LuV.set( + new MTESuperBuffer( + SUPER_BUFFER_LuV.ID, + "automation.superbuffer.tier.06", + "Ludicrous Voltage Super Buffer", + 6).getStackForm(1L)); + ItemList.Automation_SuperBuffer_ZPM.set( + new MTESuperBuffer(SUPER_BUFFER_ZPM.ID, "automation.superbuffer.tier.07", "ZPM Voltage Super Buffer", 7) + .getStackForm(1L)); + ItemList.Automation_SuperBuffer_UV.set( + new MTESuperBuffer(SUPER_BUFFER_UV.ID, "automation.superbuffer.tier.08", "Ultimate Voltage Super Buffer", 8) + .getStackForm(1L)); + ItemList.Automation_SuperBuffer_MAX.set( + new MTESuperBuffer( + SUPER_BUFFER_UHV.ID, + "automation.superbuffer.tier.09", + "Highly Ultimate Voltage Super Buffer", + 9).getStackForm(1L)); + } + + private static void registerItemDistributor() { + ItemList.Automation_ItemDistributor_ULV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_ULV.ID, + "automation.itemdistributor.tier.00", + "Ultra Low Voltage Item Distributor", + 0).getStackForm(1L)); + ItemList.Automation_ItemDistributor_LV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_LV.ID, + "automation.itemdistributor.tier.01", + "Low Voltage Item Distributor", + 1).getStackForm(1L)); + ItemList.Automation_ItemDistributor_MV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_MV.ID, + "automation.itemdistributor.tier.02", + "Medium Voltage Item Distributor", + 2).getStackForm(1L)); + ItemList.Automation_ItemDistributor_HV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_HV.ID, + "automation.itemdistributor.tier.03", + "High Voltage Item Distributor", + 3).getStackForm(1L)); + ItemList.Automation_ItemDistributor_EV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_EV.ID, + "automation.itemdistributor.tier.04", + "Extreme Voltage Item Distributor", + 4).getStackForm(1L)); + ItemList.Automation_ItemDistributor_IV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_IV.ID, + "automation.itemdistributor.tier.05", + "Insane Voltage Item Distributor", + 5).getStackForm(1L)); + ItemList.Automation_ItemDistributor_LuV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_LuV.ID, + "automation.itemdistributor.tier.06", + "Ludicrous Voltage Item Distributor", + 6).getStackForm(1L)); + ItemList.Automation_ItemDistributor_ZPM.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_ZPM.ID, + "automation.itemdistributor.tier.07", + "ZPM Voltage Item Distributor", + 7).getStackForm(1L)); + ItemList.Automation_ItemDistributor_UV.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_UV.ID, + "automation.itemdistributor.tier.08", + "Ultimate Voltage Item Distributor", + 8).getStackForm(1L)); + ItemList.Automation_ItemDistributor_MAX.set( + new MTEItemDistributor( + ITEM_DISTRIBUTOR_UHV.ID, + "automation.itemdistributor.tier.09", + "MAX Voltage Item Distributor", + 9).getStackForm(1L)); + } + + private static void registerRecipeFilter() { + ItemList.Automation_RecipeFilter_ULV.set( + new MTERecipeFilter( + RECIPE_FILTER_ULV.ID, + "automation.recipefilter.tier.00", + "Ultra Low Voltage Recipe Filter", + 0).getStackForm(1L)); + ItemList.Automation_RecipeFilter_LV.set( + new MTERecipeFilter(RECIPE_FILTER_LV.ID, "automation.recipefilter.tier.01", "Low Voltage Recipe Filter", 1) + .getStackForm(1L)); + ItemList.Automation_RecipeFilter_MV.set( + new MTERecipeFilter( + RECIPE_FILTER_MV.ID, + "automation.recipefilter.tier.02", + "Medium Voltage Recipe Filter", + 2).getStackForm(1L)); + ItemList.Automation_RecipeFilter_HV.set( + new MTERecipeFilter(RECIPE_FILTER_HV.ID, "automation.recipefilter.tier.03", "High Voltage Recipe Filter", 3) + .getStackForm(1L)); + ItemList.Automation_RecipeFilter_EV.set( + new MTERecipeFilter( + RECIPE_FILTER_EV.ID, + "automation.recipefilter.tier.04", + "Extreme Voltage Recipe Filter", + 4).getStackForm(1L)); + ItemList.Automation_RecipeFilter_IV.set( + new MTERecipeFilter( + RECIPE_FILTER_IV.ID, + "automation.recipefilter.tier.05", + "Insane Voltage Recipe Filter", + 5).getStackForm(1L)); + ItemList.Automation_RecipeFilter_LuV.set( + new MTERecipeFilter( + RECIPE_FILTER_LuV.ID, + "automation.recipefilter.tier.06", + "Ludicrous Voltage Recipe Filter", + 6).getStackForm(1L)); + ItemList.Automation_RecipeFilter_ZPM.set( + new MTERecipeFilter(RECIPE_FILTER_ZPM.ID, "automation.recipefilter.tier.07", "ZPM Voltage Recipe Filter", 7) + .getStackForm(1L)); + ItemList.Automation_RecipeFilter_UV.set( + new MTERecipeFilter( + RECIPE_FILTER_UV.ID, + "automation.recipefilter.tier.08", + "Ultimate Voltage Recipe Filter", + 8).getStackForm(1L)); + ItemList.Automation_RecipeFilter_MAX.set( + new MTERecipeFilter( + RECIPE_FILTER_UHV.ID, + "automation.recipefilter.tier.09", + "Highly Ultimate Voltage Recipe Filter", + 9).getStackForm(1L)); + } + + private static void registerMachineHull() { + ItemList.Hull_Bronze.set( + new MTEBasicHullBronze(HULL_BRONZE.ID, "hull.bronze", "Bronze Hull", 0, "For your first Steam Machines") + .getStackForm(1L)); + ItemList.Hull_Bronze_Bricks.set( + new MTEBasicHullBronzeBricks( + HULL_BRICKED_BRONZE.ID, + "hull.bronze_bricked", + "Bricked Bronze Hull", + 0, + "For your first Steam Machines").getStackForm(1L)); + ItemList.Hull_HP.set( + new MTEBasicHullSteel(HULL_STEEL.ID, "hull.steel", "Steel Hull", 0, "For improved Steam Machines") + .getStackForm(1L)); + ItemList.Hull_HP_Bricks.set( + new MTEBasicHullSteelBricks( + HULL_WROUGHT_IRON.ID, + "hull.steel_bricked", + "Bricked Wrought Iron Hull", + 0, + "For improved Steam Machines").getStackForm(1L)); + + ItemList.Hull_ULV + .set(new MTEBasicHull(HULL_ULV.ID, "hull.tier.00", "ULV Machine Hull", 0, imagination).getStackForm(1L)); + ItemList.Hull_LV + .set(new MTEBasicHull(HULL_LV.ID, "hull.tier.01", "LV Machine Hull", 1, imagination).getStackForm(1L)); + ItemList.Hull_MV + .set(new MTEBasicHull(HULL_MV.ID, "hull.tier.02", "MV Machine Hull", 2, imagination).getStackForm(1L)); + ItemList.Hull_HV + .set(new MTEBasicHull(HULL_HV.ID, "hull.tier.03", "HV Machine Hull", 3, imagination).getStackForm(1L)); + ItemList.Hull_EV + .set(new MTEBasicHull(HULL_EV.ID, "hull.tier.04", "EV Machine Hull", 4, imagination).getStackForm(1L)); + ItemList.Hull_IV + .set(new MTEBasicHull(HULL_IV.ID, "hull.tier.05", "IV Machine Hull", 5, imagination).getStackForm(1L)); + ItemList.Hull_LuV + .set(new MTEBasicHull(HULL_LuV.ID, "hull.tier.06", "LuV Machine Hull", 6, imagination).getStackForm(1L)); + ItemList.Hull_ZPM + .set(new MTEBasicHull(HULL_ZPM.ID, "hull.tier.07", "ZPM Machine Hull", 7, imagination).getStackForm(1L)); + ItemList.Hull_UV + .set(new MTEBasicHull(HULL_UV.ID, "hull.tier.08", "UV Machine Hull", 8, imagination).getStackForm(1L)); + ItemList.Hull_MAX + .set(new MTEBasicHull(HULL_UHV.ID, "hull.tier.09", "UHV Machine Hull", 9, imagination).getStackForm(1L)); + + ItemList.Hull_UEV.set( + new MTEBasicHull(HULL_UEV.ID, "hull.tier.10", "UEV Machine Hull", 10, LoaderMetaTileEntities.imagination) + .getStackForm(1L)); + + ItemList.Hull_UIV.set( + new MTEBasicHull(HULL_UIV.ID, "hull.tier.11", "UIV Machine Hull", 11, LoaderMetaTileEntities.imagination) + .getStackForm(1L)); + + ItemList.Hull_UMV.set( + new MTEBasicHull(HULL_UMV.ID, "hull.tier.12", "UMV Machine Hull", 12, LoaderMetaTileEntities.imagination) + .getStackForm(1L)); + + ItemList.Hull_UXV.set( + new MTEBasicHull(HULL_UXV.ID, "hull.tier.13", "UXV Machine Hull", 13, LoaderMetaTileEntities.imagination) + .getStackForm(1L)); + + ItemList.Hull_MAXV.set( + new MTEBasicHull(HULL_MAX.ID, "hull.tier.14", "MAX Machine Hull", 14, LoaderMetaTileEntities.imagination) + .getStackForm(1L)); + } + + private static void registerTransformer() { + ItemList.Transformer_LV_ULV.set( + new MTETransformer( + transformer_LV_ULV.ID, + "transformer.tier.00", + "Ultra Low Voltage Transformer", + 0, + "LV -> ULV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_MV_LV.set( + new MTETransformer( + transformer_MV_LV.ID, + "transformer.tier.01", + "Low Voltage Transformer", + 1, + "MV -> LV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_HV_MV.set( + new MTETransformer( + transformer_HV_MV.ID, + "transformer.tier.02", + "Medium Voltage Transformer", + 2, + "HV -> MV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_EV_HV.set( + new MTETransformer( + transformer_EV_HV.ID, + "transformer.tier.03", + "High Voltage Transformer", + 3, + "EV -> HV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_IV_EV.set( + new MTETransformer( + transformer_IV_EV.ID, + "transformer.tier.04", + "Extreme Transformer", + 4, + "IV -> EV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_LuV_IV.set( + new MTETransformer( + transformer_LuV_IV.ID, + "transformer.tier.05", + "Insane Transformer", + 5, + "LuV -> IV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_ZPM_LuV.set( + new MTETransformer( + transformer_ZPM_LuV.ID, + "transformer.tier.06", + "Ludicrous Transformer", + 6, + "ZPM -> LuV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_UV_ZPM.set( + new MTETransformer( + transformer_UV_ZPM.ID, + "transformer.tier.07", + "ZPM Voltage Transformer", + 7, + "UV -> ZPM (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_MAX_UV.set( + new MTETransformer( + transformer_UHV_UV.ID, + "transformer.tier.08", + "Ultimate Transformer", + 8, + "UHV -> UV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_UEV_UHV.set( + new MTETransformer( + TRANSFORMER_UEV_UHV.ID, + "transformer.tier.09", + "Highly Ultimate Transformer", + 9, + "UEV -> UHV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.Transformer_UIV_UEV.set( + new MTETransformer( + TRANSFORMER_UIV_UEV.ID, + "transformer.tier.10", + "Extremely Ultimate Transformer", + 10, + "UIV -> UEV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.Transformer_UMV_UIV.set( + new MTETransformer( + TRANSFORMER_UMV_UIV.ID, + "transformer.tier.11", + "Insanely Ultimate Transformer", + 11, + "UMV -> UIV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.Transformer_UXV_UMV.set( + new MTETransformer( + TRANSFORMER_UXV_UMV.ID, + "transformer.tier.12", + "Mega Ultimate Transformer", + 12, + "UXV -> UMV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.Transformer_MAX_UXV.set( + new MTETransformer( + TRANSFORMER_MAX_UXV.ID, + "transformer.tier.13", + "Extended Mega Ultimate Transformer", + 13, + "MAX -> UXV (Use Soft Mallet to invert)").getStackForm(1L)); + } + + private void registerChemicalBath() { + ItemList.Machine_LV_ChemicalBath.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_LV.ID, + "basicmachine.chemicalbath.tier.01", + "Basic Chemical Bath", + 1, + MachineType.CHEMICAL_BATH.tooltipDescription(), + RecipeMaps.chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.Machine_MV_ChemicalBath.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_MV.ID, + "basicmachine.chemicalbath.tier.02", + "Advanced Chemical Bath", + 2, + MachineType.CHEMICAL_BATH.tooltipDescription(), + RecipeMaps.chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.Machine_HV_ChemicalBath.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_HV.ID, + "basicmachine.chemicalbath.tier.03", + "Advanced Chemical Bath II", + 3, + MachineType.CHEMICAL_BATH.tooltipDescription(), + RecipeMaps.chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.Machine_EV_ChemicalBath.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_EV.ID, + "basicmachine.chemicalbath.tier.04", + "Advanced Chemical Bath III", + 4, + MachineType.CHEMICAL_BATH.tooltipDescription(), + RecipeMaps.chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.Machine_IV_ChemicalBath.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_IV.ID, + "basicmachine.chemicalbath.tier.05", + "Advanced Chemical Bath IV", + 5, + MachineType.CHEMICAL_BATH.tooltipDescription(), + RecipeMaps.chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.ChemicalBathLuV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_LuV.ID, + "basicmachine.chemicalbath.tier.06", + "Elite Chemical Bath", + 6, + MachineType.CHEMICAL_BATH.tooltipDescription(), + chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.ChemicalBathZPM.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_ZPM.ID, + "basicmachine.chemicalbath.tier.07", + "Elite Chemical Bath II", + 7, + MachineType.CHEMICAL_BATH.tooltipDescription(), + chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.ChemicalBathUV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_UV.ID, + "basicmachine.chemicalbath.tier.08", + "Ultimate Chemical Dunktron", + 8, + MachineType.CHEMICAL_BATH.tooltipDescription(), + chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.ChemicalBathUHV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_UHV.ID, + "basicmachine.chemicalbath.tier.09", + "Epic Chemical Dunktron", + 9, + MachineType.CHEMICAL_BATH.tooltipDescription(), + chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.ChemicalBathUEV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_UEV.ID, + "basicmachine.chemicalbath.tier.10", + "Epic Chemical Dunktron II", + 10, + MachineType.CHEMICAL_BATH.tooltipDescription(), + chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.ChemicalBathUIV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_UIV.ID, + "basicmachine.chemicalbath.tier.11", + "Epic Chemical Dunktron III", + 11, + MachineType.CHEMICAL_BATH.tooltipDescription(), + chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + + ItemList.ChemicalBathUMV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_BATH_UMV.ID, + "basicmachine.chemicalbath.tier.12", + "Epic Chemical Dunktron IV", + 12, + MachineType.CHEMICAL_BATH.tooltipDescription(), + chemicalBathRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_BATH", + null).getStackForm(1L)); + } + + private void registerChemicalReactor() { + ItemList.Machine_LV_ChemicalReactor.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_LV.ID, + "basicmachine.chemicalreactor.tier.01", + "Basic Chemical Reactor", + 1, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + RecipeMaps.chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.Machine_MV_ChemicalReactor.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_MV.ID, + "basicmachine.chemicalreactor.tier.02", + "Advanced Chemical Reactor", + 2, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + RecipeMaps.chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.Machine_HV_ChemicalReactor.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_HV.ID, + "basicmachine.chemicalreactor.tier.03", + "Advanced Chemical Reactor II", + 3, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + RecipeMaps.chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.Machine_EV_ChemicalReactor.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_EV.ID, + "basicmachine.chemicalreactor.tier.04", + "Advanced Chemical Reactor III", + 4, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + RecipeMaps.chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.Machine_IV_ChemicalReactor.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_IV.ID, + "basicmachine.chemicalreactor.tier.05", + "Advanced Chemical Reactor IV", + 5, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + RecipeMaps.chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.ChemicalReactorLuV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_LuV.ID, + "basicmachine.chemicalreactor.tier.06", + "Elite Chemical Reactor", + 6, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.ChemicalReactorZPM.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_ZPM.ID, + "basicmachine.chemicalreactor.tier.07", + "Elite Chemical Reactor II", + 7, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.ChemicalReactorUV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_UV.ID, + "basicmachine.chemicalreactor.tier.08", + "Ultimate Chemical Perforer", + 8, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.ChemicalReactorUHV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_UHV.ID, + "basicmachine.chemicalreactor.tier.09", + "Epic Chemical Performer", + 9, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.ChemicalReactorUEV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_UEV.ID, + "basicmachine.chemicalreactor.tier.10", + "Epic Chemical Performer II", + 10, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.ChemicalReactorUIV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_UIV.ID, + "basicmachine.chemicalreactor.tier.11", + "Epic Chemical Performer III", + 11, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + ItemList.ChemicalReactorUMV.set( + new MTEBasicMachineWithRecipe( + CHEMICAL_REACTOR_UMV.ID, + "basicmachine.chemicalreactor.tier.12", + "Epic Chemical Performer IV", + 12, + MachineType.CHEMICAL_REACTOR.tooltipDescription(), + chemicalReactorRecipes, + 2, + 2, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CHEMICAL_REACTOR", + null).getStackForm(1L)); + + } + + private void registerFermenter() { + ItemList.Machine_LV_Fermenter.set( + new MTEBasicMachineWithRecipe( + FERMENTER_LV.ID, + "basicmachine.fermenter.tier.01", + "Basic Fermenter", + 1, + MachineType.FERMENTER.tooltipDescription(), + RecipeMaps.fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Fermenter.set( + new MTEBasicMachineWithRecipe( + FERMENTER_MV.ID, + "basicmachine.fermenter.tier.02", + "Advanced Fermenter", + 2, + MachineType.FERMENTER.tooltipDescription(), + RecipeMaps.fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Fermenter.set( + new MTEBasicMachineWithRecipe( + FERMENTER_HV.ID, + "basicmachine.fermenter.tier.03", + "Advanced Fermenter II", + 3, + MachineType.FERMENTER.tooltipDescription(), + RecipeMaps.fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Fermenter.set( + new MTEBasicMachineWithRecipe( + FERMENTER_EV.ID, + "basicmachine.fermenter.tier.04", + "Advanced Fermenter III", + 4, + MachineType.FERMENTER.tooltipDescription(), + RecipeMaps.fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Fermenter.set( + new MTEBasicMachineWithRecipe( + FERMENTER_IV.ID, + "basicmachine.fermenter.tier.05", + "Advanced Fermenter IV", + 5, + MachineType.FERMENTER.tooltipDescription(), + RecipeMaps.fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.FermenterLuV.set( + new MTEBasicMachineWithRecipe( + FERMENTER_LuV.ID, + "basicmachine.fermenter.tier.06", + "Elite Fermenter", + 6, + MachineType.FERMENTER.tooltipDescription(), + fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.FermenterZPM.set( + new MTEBasicMachineWithRecipe( + FERMENTER_ZPM.ID, + "basicmachine.fermenter.tier.07", + "Elite Fermenter II", + 7, + MachineType.FERMENTER.tooltipDescription(), + fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.FermenterUV.set( + new MTEBasicMachineWithRecipe( + FERMENTER_UV.ID, + "basicmachine.fermenter.tier.08", + "Ultimate Fermentation Hastener", + 8, + MachineType.FERMENTER.tooltipDescription(), + fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.FermenterUHV.set( + new MTEBasicMachineWithRecipe( + FERMENTER_UHV.ID, + "basicmachine.fermenter.tier.09", + "Epic Fermentation Hastener", + 9, + MachineType.FERMENTER.tooltipDescription(), + fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.FermenterUEV.set( + new MTEBasicMachineWithRecipe( + FERMENTER_UEV.ID, + "basicmachine.fermenter.tier.10", + "Epic Fermentation Hastener II", + 10, + MachineType.FERMENTER.tooltipDescription(), + fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.FermenterUIV.set( + new MTEBasicMachineWithRecipe( + FERMENTER_UIV.ID, + "basicmachine.fermenter.tier.11", + "Epic Fermentation Hastener III", + 11, + MachineType.FERMENTER.tooltipDescription(), + fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + + ItemList.FermenterUMV.set( + new MTEBasicMachineWithRecipe( + FERMENTER_UMV.ID, + "basicmachine.fermenter.tier.12", + "Epic Fermentation Hastener IV", + 12, + MachineType.FERMENTER.tooltipDescription(), + fermentingRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FERMENTER", + null).getStackForm(1L)); + } + + private void registerFluidCanner() { + ItemList.Machine_LV_FluidCanner.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_LV.ID, + "basicmachine.fluidcanner.tier.01", + "Basic Fluid Canner", + 1, + MachineType.FLUID_CANNER.tooltipDescription(), + RecipeMaps.fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.Machine_MV_FluidCanner.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_MV.ID, + "basicmachine.fluidcanner.tier.02", + "Advanced Fluid Canner", + 2, + MachineType.FLUID_CANNER.tooltipDescription(), + RecipeMaps.fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.Machine_HV_FluidCanner.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_HV.ID, + "basicmachine.fluidcanner.tier.03", + "Quick Fluid Canner", + 3, + MachineType.FLUID_CANNER.tooltipDescription(), + RecipeMaps.fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.Machine_EV_FluidCanner.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_EV.ID, + "basicmachine.fluidcanner.tier.04", + "Turbo Fluid Canner", + 4, + MachineType.FLUID_CANNER.tooltipDescription(), + RecipeMaps.fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.Machine_IV_FluidCanner.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_IV.ID, + "basicmachine.fluidcanner.tier.05", + "Instant Fluid Canner", + 5, + MachineType.FLUID_CANNER.tooltipDescription(), + RecipeMaps.fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.FluidCannerLuV.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_LuV.ID, + "basicmachine.fluidcanner.tier.06", + "Elite Fluid Canner", + 6, + MachineType.FLUID_CANNER.tooltipDescription(), + fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.FluidCannerZPM.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_ZPM.ID, + "basicmachine.fluidcanner.tier.07", + "Elite Fluid Canner II", + 7, + MachineType.FLUID_CANNER.tooltipDescription(), + fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.FluidCannerUV.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_UV.ID, + "basicmachine.fluidcanner.tier.08", + "Ultimate Liquid Can Actuator", + 8, + MachineType.FLUID_CANNER.tooltipDescription(), + fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.FluidCannerUHV.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_UHV.ID, + "basicmachine.fluidcanner.tier.09", + "Epic Liquid Can Actuator", + 9, + MachineType.FLUID_CANNER.tooltipDescription(), + fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.FluidCannerUEV.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_UEV.ID, + "basicmachine.fluidcanner.tier.10", + "Epic Liquid Can Actuator II", + 10, + MachineType.FLUID_CANNER.tooltipDescription(), + fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.FluidCannerUIV.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_UIV.ID, + "basicmachine.fluidcanner.tier.11", + "Epic Liquid Can Actuator III", + 11, + MachineType.FLUID_CANNER.tooltipDescription(), + fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + + ItemList.FluidCannerUMV.set( + new MTEBasicMachineWithRecipe( + FLUID_CANNER_UMV.ID, + "basicmachine.fluidcanner.tier.12", + "Epic Liquid Can Actuator IV", + 12, + MachineType.FLUID_CANNER.tooltipDescription(), + fluidCannerRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_CANNER", + null).getStackForm(1L)); + } + + private void registerFluidExtractor() { + ItemList.Machine_LV_FluidExtractor.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_LV.ID, + "basicmachine.fluidextractor.tier.01", + "Basic Fluid Extractor", + 1, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + RecipeMaps.fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_MV_FluidExtractor.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_MV.ID, + "basicmachine.fluidextractor.tier.02", + "Advanced Fluid Extractor", + 2, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + RecipeMaps.fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_HV_FluidExtractor.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_HV.ID, + "basicmachine.fluidextractor.tier.03", + "Advanced Fluid Extractor II", + 3, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + RecipeMaps.fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_EV_FluidExtractor.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_EV.ID, + "basicmachine.fluidextractor.tier.04", + "Advanced Fluid Extractor III", + 4, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + RecipeMaps.fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_IV_FluidExtractor.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_IV.ID, + "basicmachine.fluidextractor.tier.05", + "Advanced Fluid Extractor IV", + 5, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + RecipeMaps.fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.FluidExtractorLuV.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_LuV.ID, + "basicmachine.fluidextractor.tier.06", + "Elite Fluid Extractor", + 6, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.FluidExtractorZPM.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_ZPM.ID, + "basicmachine.fluidextractor.tier.07", + "Elite Fluid Extractor II", + 7, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.FluidExtractorUV.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_UV.ID, + "basicmachine.fluidextractor.tier.08", + "Ultimate Liquefying Sucker", + 8, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.FluidExtractorUHV.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_UHV.ID, + "basicmachine.fluidextractor.tier.09", + "Epic Liquefying Sucker", + 9, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.FluidExtractorUEV.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_UEV.ID, + "basicmachine.fluidextractor.tier.10", + "Epic Liquefying Sucker II", + 10, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.FluidExtractorUIV.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_UIV.ID, + "basicmachine.fluidextractor.tier.11", + "Epic Liquefying Sucker III", + 11, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + + ItemList.FluidExtractorUMV.set( + new MTEBasicMachineWithRecipe( + FLUID_EXTRACTOR_UMV.ID, + "basicmachine.fluidextractor.tier.12", + "Epic Liquefying Sucker IV", + 12, + MachineType.FLUID_EXTRACTOR.tooltipDescription(), + fluidExtractionRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_EXTRACTOR", + null).getStackForm(1L)); + } + + private void registerFluidHeater() { + ItemList.Machine_LV_FluidHeater.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_LV.ID, + "basicmachine.fluidheater.tier.01", + "Basic Fluid Heater", + 1, + MachineType.FLUID_HEATER.tooltipDescription(), + RecipeMaps.fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.Machine_MV_FluidHeater.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_MV.ID, + "basicmachine.fluidheater.tier.02", + "Advanced Fluid Heater", + 2, + MachineType.FLUID_HEATER.tooltipDescription(), + RecipeMaps.fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.Machine_HV_FluidHeater.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_HV.ID, + "basicmachine.fluidheater.tier.03", + "Advanced Fluid Heater II", + 3, + MachineType.FLUID_HEATER.tooltipDescription(), + RecipeMaps.fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.Machine_EV_FluidHeater.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_EV.ID, + "basicmachine.fluidheater.tier.04", + "Advanced Fluid Heater III", + 4, + MachineType.FLUID_HEATER.tooltipDescription(), + RecipeMaps.fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.Machine_IV_FluidHeater.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_IV.ID, + "basicmachine.fluidheater.tier.05", + "Advanced Fluid Heater IV", + 5, + MachineType.FLUID_HEATER.tooltipDescription(), + RecipeMaps.fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.FluidHeaterLuV.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_LuV.ID, + "basicmachine.fluidheater.tier.06", + "Elite Fluid Heater", + 6, + MachineType.FLUID_HEATER.tooltipDescription(), + fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.FluidHeaterZPM.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_ZPM.ID, + "basicmachine.fluidheater.tier.07", + "Elite Fluid Heater II", + 7, + MachineType.FLUID_HEATER.tooltipDescription(), + fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.FluidHeaterUV.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_UV.ID, + "basicmachine.fluidheater.tier.08", + "Ultimate Heat Infuser", + 8, + MachineType.FLUID_HEATER.tooltipDescription(), + fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.FluidHeaterUHV.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_UHV.ID, + "basicmachine.fluidheater.tier.09", + "Epic Heat Infuser", + 9, + MachineType.FLUID_HEATER.tooltipDescription(), + fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.FluidHeaterUEV.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_UEV.ID, + "basicmachine.fluidheater.tier.10", + "Epic Heat Infuser II", + 10, + MachineType.FLUID_HEATER.tooltipDescription(), + fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.FluidHeaterUIV.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_UIV.ID, + "basicmachine.fluidheater.tier.11", + "Epic Heat Infuser III", + 11, + MachineType.FLUID_HEATER.tooltipDescription(), + fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + + ItemList.FluidHeaterUMV.set( + new MTEBasicMachineWithRecipe( + FLUID_HEATER_UMV.ID, + "basicmachine.fluidheater.tier.12", + "Epic Heat Infuser IV", + 12, + MachineType.FLUID_HEATER.tooltipDescription(), + fluidHeaterRecipes, + 1, + 0, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_HEATER", + null).getStackForm(1L)); + } + + private void registerMixer() { + ItemList.Machine_LV_Mixer.set( + new MTEBasicMachineWithRecipe( + MIXER_LV.ID, + "basicmachine.mixer.tier.01", + "Basic Mixer", + 1, + MachineType.MIXER.tooltipDescription(), + RecipeMaps.mixerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Mixer.set( + new MTEBasicMachineWithRecipe( + MIXER_MV.ID, + "basicmachine.mixer.tier.02", + "Advanced Mixer", + 2, + MachineType.MIXER.tooltipDescription(), + RecipeMaps.mixerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Mixer.set( + new MTEBasicMachineWithRecipe( + MIXER_HV.ID, + "basicmachine.mixer.tier.03", + "Advanced Mixer II", + 3, + MachineType.MIXER.tooltipDescription(), + RecipeMaps.mixerRecipes, + 6, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Mixer.set( + new MTEBasicMachineWithRecipe( + MIXER_EV.ID, + "basicmachine.mixer.tier.04", + "Advanced Mixer III", + 4, + MachineType.MIXER.tooltipDescription(), + RecipeMaps.mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Mixer.set( + new MTEBasicMachineWithRecipe( + MIXER_IV.ID, + "basicmachine.mixer.tier.05", + "Advanced Mixer IV", + 5, + MachineType.MIXER.tooltipDescription(), + RecipeMaps.mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.MixerLuV.set( + new MTEBasicMachineWithRecipe( + MIXER_LuV.ID, + "basicmachine.mixer.tier.06", + "Elite Mixer", + 6, + MachineType.MIXER.tooltipDescription(), + mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.MixerZPM.set( + new MTEBasicMachineWithRecipe( + MIXER_ZPM.ID, + "basicmachine.mixer.tier.07", + "Elite Mixer II", + 7, + MachineType.MIXER.tooltipDescription(), + mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.MixerUV.set( + new MTEBasicMachineWithRecipe( + MIXER_UV.ID, + "basicmachine.mixer.tier.08", + "Ultimate Matter Organizer", + 8, + MachineType.MIXER.tooltipDescription(), + mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.MixerUHV.set( + new MTEBasicMachineWithRecipe( + MIXER_UHV.ID, + "basicmachine.mixer.tier.09", + "Epic Matter Organizer", + 9, + MachineType.MIXER.tooltipDescription(), + mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.MixerUEV.set( + new MTEBasicMachineWithRecipe( + MIXER_UEV.ID, + "basicmachine.mixer.tier.10", + "Epic Matter Organizer II", + 10, + MachineType.MIXER.tooltipDescription(), + mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.MixerUIV.set( + new MTEBasicMachineWithRecipe( + MIXER_UIV.ID, + "basicmachine.mixer.tier.11", + "Epic Matter Organizer III", + 11, + MachineType.MIXER.tooltipDescription(), + mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + + ItemList.MixerUMV.set( + new MTEBasicMachineWithRecipe( + MIXER_UMV.ID, + "basicmachine.mixer.tier.12", + "Epic Matter Organizer IV", + 12, + MachineType.MIXER.tooltipDescription(), + mixerRecipes, + 9, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MIXER", + null).getStackForm(1L)); + } + + private void registerAutoclave() { + ItemList.Machine_LV_Autoclave.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_LV.ID, + "basicmachine.autoclave.tier.01", + "Basic Autoclave", + 1, + MachineType.AUTOCLAVE.tooltipDescription(), + RecipeMaps.autoclaveRecipes, + 2, + 2, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.Machine_MV_Autoclave.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_MV.ID, + "basicmachine.autoclave.tier.02", + "Advanced Autoclave", + 2, + MachineType.AUTOCLAVE.tooltipDescription(), + RecipeMaps.autoclaveRecipes, + 2, + 2, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.Machine_HV_Autoclave.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_HV.ID, + "basicmachine.autoclave.tier.03", + "Advanced Autoclave II", + 3, + MachineType.AUTOCLAVE.tooltipDescription(), + RecipeMaps.autoclaveRecipes, + 2, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.Machine_EV_Autoclave.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_EV.ID, + "basicmachine.autoclave.tier.04", + "Advanced Autoclave III", + 4, + MachineType.AUTOCLAVE.tooltipDescription(), + RecipeMaps.autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.Machine_IV_Autoclave.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_IV.ID, + "basicmachine.autoclave.tier.05", + "Advanced Autoclave IV", + 5, + MachineType.AUTOCLAVE.tooltipDescription(), + RecipeMaps.autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.AutoclaveLuV.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_LuV.ID, + "basicmachine.autoclave.tier.06", + "Elite Autoclave", + 6, + MachineType.AUTOCLAVE.tooltipDescription(), + autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.AutoclaveZPM.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_ZPM.ID, + "basicmachine.autoclave.tier.07", + "Elite Autoclave II", + 7, + MachineType.AUTOCLAVE.tooltipDescription(), + autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.AutoclaveUV.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_UV.ID, + "basicmachine.autoclave.tier.08", + "Ultimate Pressure Cooker", + 8, + MachineType.AUTOCLAVE.tooltipDescription(), + autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.AutoclaveUHV.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_UHV.ID, + "basicmachine.autoclave.tier.09", + "Epic Pressure Cooker", + 9, + MachineType.AUTOCLAVE.tooltipDescription(), + autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.AutoclaveUEV.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_UEV.ID, + "basicmachine.autoclave.tier.10", + "Epic Pressure Cooker II", + 10, + MachineType.AUTOCLAVE.tooltipDescription(), + autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.AutoclaveUIV.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_UIV.ID, + "basicmachine.autoclave.tier.11", + "Epic Pressure Cooker III", + 11, + MachineType.AUTOCLAVE.tooltipDescription(), + autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + ItemList.AutoclaveUMV.set( + new MTEBasicMachineWithRecipe( + AUTOCLAVE_UMV.ID, + "basicmachine.autoclave.tier.12", + "Epic Pressure Cooker IV", + 12, + MachineType.AUTOCLAVE.tooltipDescription(), + autoclaveRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "AUTOCLAVE", + null).getStackForm(1L)); + + } + + private void registerBendingMachine() { + ItemList.Machine_LV_Bender.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_LV.ID, + "basicmachine.bender.tier.01", + "Basic Bending Machine", + 1, + MachineType.BENDING_MACHINE.tooltipDescription(), + RecipeMaps.benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Bender.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_MV.ID, + "basicmachine.bender.tier.02", + "Advanced Bending Machine", + 2, + MachineType.BENDING_MACHINE.tooltipDescription(), + RecipeMaps.benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Bender.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_HV.ID, + "basicmachine.bender.tier.03", + "Advanced Bending Machine II", + 3, + MachineType.BENDING_MACHINE.tooltipDescription(), + RecipeMaps.benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Bender.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_EV.ID, + "basicmachine.bender.tier.04", + "Advanced Bending Machine III", + 4, + MachineType.BENDING_MACHINE.tooltipDescription(), + RecipeMaps.benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Bender.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_IV.ID, + "basicmachine.bender.tier.05", + "Advanced Bending Machine IV", + 5, + MachineType.BENDING_MACHINE.tooltipDescription(), + RecipeMaps.benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.BendingMachineLuV.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_LuV.ID, + "basicmachine.bender.tier.06", + "Elite Bending Machine", + 6, + MachineType.BENDING_MACHINE.tooltipDescription(), + benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.BendingMachineZPM.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_ZPM.ID, + "basicmachine.bender.tier.07", + "Elite Bending Machine II", + 7, + MachineType.BENDING_MACHINE.tooltipDescription(), + benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.BendingMachineUV.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_UV.ID, + "basicmachine.bender.tier.08", + "Ultimate Bending Unit", + 8, + MachineType.BENDING_MACHINE.tooltipDescription(), + benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.BendingMachineUHV.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_UHV.ID, + "basicmachine.bender.tier.09", + "Epic Bending Unit", + 9, + MachineType.BENDING_MACHINE.tooltipDescription(), + benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.BendingMachineUEV.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_UEV.ID, + "basicmachine.bender.tier.10", + "Epic Bending Unit II", + 10, + MachineType.BENDING_MACHINE.tooltipDescription(), + benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.BendingMachineUIV.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_UIV.ID, + "basicmachine.bender.tier.11", + "Epic Bending Unit III", + 11, + MachineType.BENDING_MACHINE.tooltipDescription(), + benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + + ItemList.BendingMachineUMV.set( + new MTEBasicMachineWithRecipe( + BENDING_MACHINE_UMV.ID, + "basicmachine.bender.tier.12", + "Epic Bending Unit IV", + 12, + MachineType.BENDING_MACHINE.tooltipDescription(), + benderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "BENDER", + null).getStackForm(1L)); + } + + private void registerCompressor() { + ItemList.Machine_LV_Compressor.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_LV.ID, + "basicmachine.compressor.tier.01", + "Basic Compressor", + 1, + MachineType.COMPRESSOR.tooltipDescription(), + RecipeMaps.compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.Machine_MV_Compressor.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_MV.ID, + "basicmachine.compressor.tier.02", + "Advanced Compressor", + 2, + MachineType.COMPRESSOR.tooltipDescription(), + RecipeMaps.compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.Machine_HV_Compressor.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_HV.ID, + "basicmachine.compressor.tier.03", + "Advanced Compressor II", + 3, + MachineType.COMPRESSOR.tooltipDescription(), + RecipeMaps.compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.Machine_EV_Compressor.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_EV.ID, + "basicmachine.compressor.tier.04", + "Advanced Compressor III", + 4, + MachineType.COMPRESSOR.tooltipDescription(), + RecipeMaps.compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.Machine_IV_Compressor.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_IV.ID, + "basicmachine.compressor.tier.05", + "Singularity Compressor", + 5, + MachineType.COMPRESSOR.tooltipDescription(), + RecipeMaps.compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.CompressorLuV.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_LuV.ID, + "basicmachine.compressor.tier.06", + "Elite Compressor", + 6, + MachineType.COMPRESSOR.tooltipDescription(), + compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.CompressorZPM.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_ZPM.ID, + "basicmachine.compressor.tier.07", + "Elite Compressor II", + 7, + MachineType.COMPRESSOR.tooltipDescription(), + compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.CompressorUV.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_UV.ID, + "basicmachine.compressor.tier.08", + "Ultimate Matter Constrictor", + 8, + MachineType.COMPRESSOR.tooltipDescription(), + compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.CompressorUHV.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_UHV.ID, + "basicmachine.compressor.tier.09", + "Epic Matter Constrictor", + 9, + MachineType.COMPRESSOR.tooltipDescription(), + compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.CompressorUEV.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_UEV.ID, + "basicmachine.compressor.tier.10", + "Epic Matter Constrictor II", + 10, + MachineType.COMPRESSOR.tooltipDescription(), + compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.CompressorUIV.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_UIV.ID, + "basicmachine.compressor.tier.11", + "Epic Matter Constrictor III", + 11, + MachineType.COMPRESSOR.tooltipDescription(), + compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + ItemList.CompressorUMV.set( + new MTEBasicMachineWithRecipe( + COMPRESSOR_UMV.ID, + "basicmachine.compressor.tier.12", + "Epic Matter Constrictor IV", + 12, + MachineType.COMPRESSOR.tooltipDescription(), + compressorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "COMPRESSOR", + null).getStackForm(1L)); + + } + + private void registerCuttingMachine() { + ItemList.Machine_LV_Cutter.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_LV.ID, + "basicmachine.cutter.tier.01", + "Basic Cutting Machine", + 1, + MachineType.CUTTING_MACHINE.tooltipDescription(), + RecipeMaps.cutterRecipes, + 1, + 2, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Cutter.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_MV.ID, + "basicmachine.cutter.tier.02", + "Advanced Cutting Machine", + 2, + MachineType.CUTTING_MACHINE.tooltipDescription(), + RecipeMaps.cutterRecipes, + 2, + 2, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Cutter.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_HV.ID, + "basicmachine.cutter.tier.03", + "Advanced Cutting Machine II", + 3, + MachineType.CUTTING_MACHINE.tooltipDescription(), + RecipeMaps.cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Cutter.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_EV.ID, + "basicmachine.cutter.tier.04", + "Advanced Cutting Machine III", + 4, + MachineType.CUTTING_MACHINE.tooltipDescription(), + RecipeMaps.cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Cutter.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_IV.ID, + "basicmachine.cutter.tier.05", + "Advanced Cutting Machine IV", + 5, + MachineType.CUTTING_MACHINE.tooltipDescription(), + RecipeMaps.cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.CuttingMachineLuV.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_LuV.ID, + "basicmachine.cutter.tier.06", + "Elite Cutting Machine", + 6, + MachineType.CUTTING_MACHINE.tooltipDescription(), + cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.CuttingMachineZPM.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_ZPM.ID, + "basicmachine.cutter.tier.07", + "Elite Cutting Machine II", + 7, + MachineType.CUTTING_MACHINE.tooltipDescription(), + cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.CuttingMachineUV.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_UV.ID, + "basicmachine.cutter.tier.08", + "Ultimate Object Divider", + 8, + MachineType.CUTTING_MACHINE.tooltipDescription(), + cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.CuttingMachineUHV.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_UHV.ID, + "basicmachine.cutter.tier.09", + "Epic Object Divider", + 9, + MachineType.CUTTING_MACHINE.tooltipDescription(), + cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.CuttingMachineUEV.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_UEV.ID, + "basicmachine.cutter.tier.10", + "Epic Object Divider II", + 10, + MachineType.CUTTING_MACHINE.tooltipDescription(), + cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.CuttingMachineUIV.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_UIV.ID, + "basicmachine.cutter.tier.11", + "Epic Object Divider III", + 11, + MachineType.CUTTING_MACHINE.tooltipDescription(), + cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + ItemList.CuttingMachineUMV.set( + new MTEBasicMachineWithRecipe( + CUTTING_MACHINE_UMV.ID, + "basicmachine.cutter.tier.12", + "Epic Object Divider IV", + 12, + MachineType.CUTTING_MACHINE.tooltipDescription(), + cutterRecipes, + 2, + 4, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CUTTER", + null).getStackForm(1L)); + + } + + private void registerDistillery() { + ItemList.Machine_LV_Distillery.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_LV.ID, + "basicmachine.distillery.tier.01", + "Basic Distillery", + 1, + MachineType.DISTILLERY.tooltipDescription(), + RecipeMaps.distilleryRecipes, + 1, + 1, + true, + SoundResource.GT_MACHINES_DISTILLERY_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.Machine_MV_Distillery.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_MV.ID, + "basicmachine.distillery.tier.02", + "Advanced Distillery", + 2, + MachineType.DISTILLERY.tooltipDescription(), + RecipeMaps.distilleryRecipes, + 1, + 1, + true, + SoundResource.GT_MACHINES_DISTILLERY_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.Machine_HV_Distillery.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_HV.ID, + "basicmachine.distillery.tier.03", + "Advanced Distillery II", + 3, + MachineType.DISTILLERY.tooltipDescription(), + RecipeMaps.distilleryRecipes, + 1, + 1, + true, + SoundResource.GT_MACHINES_DISTILLERY_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.Machine_EV_Distillery.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_EV.ID, + "basicmachine.distillery.tier.04", + "Advanced Distillery III", + 4, + MachineType.DISTILLERY.tooltipDescription(), + RecipeMaps.distilleryRecipes, + 1, + 1, + true, + SoundResource.GT_MACHINES_DISTILLERY_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.Machine_IV_Distillery.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_IV.ID, + "basicmachine.distillery.tier.05", + "Advanced Distillery IV", + 5, + MachineType.DISTILLERY.tooltipDescription(), + RecipeMaps.distilleryRecipes, + 1, + 1, + true, + SoundResource.GT_MACHINES_DISTILLERY_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.DistilleryLuV.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_LuV.ID, + "basicmachine.distillery.tier.06", + "Elite Distillery", + 6, + MachineType.DISTILLERY.tooltipDescription(), + distilleryRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.DistilleryZPM.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_ZPM.ID, + "basicmachine.distillery.tier.07", + "Elite Distillery II", + 7, + MachineType.DISTILLERY.tooltipDescription(), + distilleryRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.DistilleryUV.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_UV.ID, + "basicmachine.distillery.tier.08", + "Ultimate Fraction Splitter", + 8, + MachineType.DISTILLERY.tooltipDescription(), + distilleryRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.DistilleryUHV.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_UHV.ID, + "basicmachine.distillery.tier.09", + "Epic Fraction Splitter", + 9, + MachineType.DISTILLERY.tooltipDescription(), + distilleryRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.DistilleryUEV.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_UEV.ID, + "basicmachine.distillery.tier.10", + "Epic Fraction Splitter II", + 10, + MachineType.DISTILLERY.tooltipDescription(), + distilleryRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.DistilleryUIV.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_UIV.ID, + "basicmachine.distillery.tier.11", + "Epic Fraction Splitter III", + 11, + MachineType.DISTILLERY.tooltipDescription(), + distilleryRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + ItemList.DistilleryUMV.set( + new MTEBasicMachineWithRecipe( + DISTILLERY_UMV.ID, + "basicmachine.distillery.tier.12", + "Epic Fraction Splitter IV", + 12, + MachineType.DISTILLERY.tooltipDescription(), + distilleryRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "DISTILLERY", + null).getStackForm(1L)); + + } + + private void registerElectricFurnace() { + ItemList.Machine_LV_E_Furnace.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_LV.ID, + "basicmachine.e_furnace.tier.01", + "Basic Electric Furnace", + 1, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).setProgressBarTextureName("E_Furnace") + .getStackForm(1L)); + + ItemList.Machine_MV_E_Furnace.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_MV.ID, + "basicmachine.e_furnace.tier.02", + "Advanced Electric Furnace", + 2, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).setProgressBarTextureName("E_Furnace") + .getStackForm(1L)); + + ItemList.Machine_HV_E_Furnace.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_HV.ID, + "basicmachine.e_furnace.tier.03", + "Advanced Electric Furnace II", + 3, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).setProgressBarTextureName("E_Furnace") + .getStackForm(1L)); + + ItemList.Machine_EV_E_Furnace.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_EV.ID, + "basicmachine.e_furnace.tier.04", + "Advanced Electric Furnace III", + 4, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).setProgressBarTextureName("E_Furnace") + .getStackForm(1L)); + + ItemList.Machine_IV_E_Furnace.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_IV.ID, + "basicmachine.e_furnace.tier.05", + "Electron Exitement Processor", + 5, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).setProgressBarTextureName("E_Furnace") + .getStackForm(1L)); + + ItemList.ElectricFurnaceLuV.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_LuV.ID, + "basicmachine.e_furnace.tier.06", + "Elite Electric Furnace", + 6, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).getStackForm(1L)); + + ItemList.ElectricFurnaceZPM.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_ZPM.ID, + "basicmachine.e_furnace.tier.07", + "Elite Electric Furnace II", + 7, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).getStackForm(1L)); + + ItemList.ElectricFurnaceUV.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_UV.ID, + "basicmachine.e_furnace.tier.08", + "Ultimate Atom Stimulator", + 8, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).getStackForm(1L)); + + ItemList.ElectricFurnaceUHV.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_UHV.ID, + "basicmachine.e_furnace.tier.09", + "Epic Atom Stimulator", + 9, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).getStackForm(1L)); + + ItemList.ElectricFurnaceUEV.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_UEV.ID, + "basicmachine.e_furnace.tier.10", + "Epic Atom Stimulator II", + 10, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).getStackForm(1L)); + + ItemList.ElectricFurnaceUIV.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_UIV.ID, + "basicmachine.e_furnace.tier.11", + "Epic Atom Stimulator III", + 11, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).getStackForm(1L)); + + ItemList.ElectricFurnaceUMV.set( + new MTEBasicMachineWithRecipe( + ELECTRIC_FURNACE_UMV.ID, + "basicmachine.e_furnace.tier.12", + "Epic Atom Stimulator IV", + 12, + MachineType.ELECTRIC_FURNACE.tooltipDescription(), + furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_FURNACE", + null).getStackForm(1L)); + } + + private void registerElectrolyzer() { + ItemList.Machine_LV_Electrolyzer.set( + new MTEBasicMachineWithRecipe( + ELECTROLYSER_LV.ID, + "basicmachine.electrolyzer.tier.01", + "Basic Electrolyzer", + 1, + MachineType.ELECTROLYZER.tooltipDescription(), + RecipeMaps.electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Electrolyzer.set( + new MTEBasicMachineWithRecipe( + ELECTROLYSER_MV.ID, + "basicmachine.electrolyzer.tier.02", + "Advanced Electrolyzer", + 2, + MachineType.ELECTROLYZER.tooltipDescription(), + RecipeMaps.electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Electrolyzer.set( + new MTEBasicMachineWithRecipe( + ELECTROLYSER_HV.ID, + "basicmachine.electrolyzer.tier.03", + "Advanced Electrolyzer II", + 3, + MachineType.ELECTROLYZER.tooltipDescription(), + RecipeMaps.electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Electrolyzer.set( + new MTEBasicMachineWithRecipe( + ELECTROLYSER_EV.ID, + "basicmachine.electrolyzer.tier.04", + "Advanced Electrolyzer III", + 4, + MachineType.ELECTROLYZER.tooltipDescription(), + RecipeMaps.electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Electrolyzer.set( + new MTEBasicMachineWithRecipe( + ELECTROLYSER_IV.ID, + "basicmachine.electrolyzer.tier.05", + "Molecular Disintegrator E-4908", + 5, + MachineType.ELECTROLYZER.tooltipDescription(), + RecipeMaps.electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.ElectrolyzerLuV.set( + new MTEBasicMachineWithRecipe( + ELECTROLYZER_LuV.ID, + "basicmachine.electrolyzer.tier.06", + "Elite Electrolyzer", + 6, + MachineType.ELECTROLYZER.tooltipDescription(), + electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.ElectrolyzerZPM.set( + new MTEBasicMachineWithRecipe( + ELECTROLYZER_ZPM.ID, + "basicmachine.electrolyzer.tier.07", + "Elite Electrolyzer II", + 7, + MachineType.ELECTROLYZER.tooltipDescription(), + electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.ElectrolyzerUV.set( + new MTEBasicMachineWithRecipe( + ELECTROLYZER_UV.ID, + "basicmachine.electrolyzer.tier.08", + "Ultimate Ionizer", + 8, + MachineType.ELECTROLYZER.tooltipDescription(), + electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.ElectrolyzerUHV.set( + new MTEBasicMachineWithRecipe( + ELECTROLYZER_UHV.ID, + "basicmachine.electrolyzer.tier.09", + "Epic Ionizer", + 9, + MachineType.ELECTROLYZER.tooltipDescription(), + electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.ElectrolyzerUEV.set( + new MTEBasicMachineWithRecipe( + ELECTROLYZER_UEV.ID, + "basicmachine.electrolyzer.tier.10", + "Epic Ionizer II", + 10, + MachineType.ELECTROLYZER.tooltipDescription(), + electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.ElectrolyzerUIV.set( + new MTEBasicMachineWithRecipe( + ELECTROLYZER_UIV.ID, + "basicmachine.electrolyzer.tier.11", + "Epic Ionizer III", + 11, + MachineType.ELECTROLYZER.tooltipDescription(), + electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + ItemList.ElectrolyzerUMV.set( + new MTEBasicMachineWithRecipe( + ELECTROLYZER_UMV.ID, + "basicmachine.electrolyzer.tier.12", + "Epic Ionizer IV", + 12, + MachineType.ELECTROLYZER.tooltipDescription(), + electrolyzerRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROLYZER", + null).getStackForm(1L)); + + } + + private void registerElectromagneticSeparator() { + ItemList.Machine_LV_ElectromagneticSeparator.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_LV.ID, + "basicmachine.electromagneticseparator.tier.01", + "Basic Electromagnetic Separator", + 1, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + RecipeMaps.electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.Machine_MV_ElectromagneticSeparator.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_MV.ID, + "basicmachine.electromagneticseparator.tier.02", + "Advanced Electromagnetic Separator", + 2, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + RecipeMaps.electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.Machine_HV_ElectromagneticSeparator.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_HV.ID, + "basicmachine.electromagneticseparator.tier.03", + "Advanced Electromagnetic Separator II", + 3, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + RecipeMaps.electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.Machine_EV_ElectromagneticSeparator.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_EV.ID, + "basicmachine.electromagneticseparator.tier.04", + "Advanced Electromagnetic Separator III", + 4, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + RecipeMaps.electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.Machine_IV_ElectromagneticSeparator.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_IV.ID, + "basicmachine.electromagneticseparator.tier.05", + "Advanced Electromagnetic Separator IV", + 5, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + RecipeMaps.electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.ElectromagneticSeparatorLuV.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_LuV.ID, + "basicmachine.electromagneticseparator.tier.06", + "Elite Electromagnetic Separator", + 6, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.ElectromagneticSeparatorZPM.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_ZPM.ID, + "basicmachine.electromagneticseparator.tier.07", + "Elite Electromagnetic Separator II", + 7, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.ElectromagneticSeparatorUV.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_UV.ID, + "basicmachine.electromagneticseparator.tier.08", + "Ultimate Magnetar Separator", + 8, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.ElectromagneticSeparatorUHV.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_UHV.ID, + "basicmachine.electromagneticseparator.tier.09", + "Epic Magnetar Separator", + 9, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.ElectromagneticSeparatorUEV.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_UEV.ID, + "basicmachine.electromagneticseparator.tier.10", + "Epic Magnetar Separator II", + 10, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.ElectromagneticSeparatorUIV.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_UIV.ID, + "basicmachine.electromagneticseparator.tier.11", + "Epic Magnetar Separator III", + 11, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + ItemList.ElectromagneticSeparatorUMV.set( + new MTEBasicMachineWithRecipe( + ELECTROMAGNETIC_SEPARATOR_UMV.ID, + "basicmachine.electromagneticseparator.tier.12", + "Epic Magnetar Separator IV", + 12, + MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(), + electroMagneticSeparatorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTROMAGNETIC_SEPARATOR", + null).getStackForm(1L)); + + } + + private void registerExtractor() { + ItemList.Machine_LV_Extractor.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_LV.ID, + "basicmachine.extractor.tier.01", + "Basic Extractor", + 1, + MachineType.EXTRACTOR.tooltipDescription(), + RecipeMaps.extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_MV_Extractor.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_MV.ID, + "basicmachine.extractor.tier.02", + "Advanced Extractor", + 2, + MachineType.EXTRACTOR.tooltipDescription(), + RecipeMaps.extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_HV_Extractor.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_HV.ID, + "basicmachine.extractor.tier.03", + "Advanced Extractor II", + 3, + MachineType.EXTRACTOR.tooltipDescription(), + RecipeMaps.extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_EV_Extractor.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_EV.ID, + "basicmachine.extractor.tier.04", + "Advanced Extractor III", + 4, + MachineType.EXTRACTOR.tooltipDescription(), + RecipeMaps.extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.Machine_IV_Extractor.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_IV.ID, + "basicmachine.extractor.tier.05", + "Vacuum Extractor", + 5, + MachineType.EXTRACTOR.tooltipDescription(), + RecipeMaps.extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.ExtractorLuV.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_LuV.ID, + "basicmachine.extractor.tier.06", + "Elite Extractor", + 6, + MachineType.EXTRACTOR.tooltipDescription(), + extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.ExtractorZPM.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_ZPM.ID, + "basicmachine.extractor.tier.07", + "Elite Extractor II", + 7, + MachineType.EXTRACTOR.tooltipDescription(), + extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.ExtractorUV.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_UV.ID, + "basicmachine.extractor.tier.08", + "Ultimate Extractinator", + 8, + MachineType.EXTRACTOR.tooltipDescription(), + extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.ExtractorUHV.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_UHV.ID, + "basicmachine.extractor.tier.09", + "Epic Extractinator", + 9, + MachineType.EXTRACTOR.tooltipDescription(), + extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.ExtractorUEV.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_UEV.ID, + "basicmachine.extractor.tier.10", + "Epic Extractinator II", + 10, + MachineType.EXTRACTOR.tooltipDescription(), + extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.ExtractorUIV.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_UIV.ID, + "basicmachine.extractor.tier.11", + "Epic Extractinator III", + 11, + MachineType.EXTRACTOR.tooltipDescription(), + extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + ItemList.ExtractorUMV.set( + new MTEBasicMachineWithRecipe( + EXTRACTOR_UMV.ID, + "basicmachine.extractor.tier.12", + "Epic Extractinator IV", + 12, + MachineType.EXTRACTOR.tooltipDescription(), + extractorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRACTOR", + null).getStackForm(1L)); + + } + + private void registerExtruder() { + ItemList.Machine_LV_Extruder.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_LV.ID, + "basicmachine.extruder.tier.01", + "Basic Extruder", + 1, + MachineType.EXTRUDER.tooltipDescription(), + RecipeMaps.extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Extruder.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_MV.ID, + "basicmachine.extruder.tier.02", + "Advanced Extruder", + 2, + MachineType.EXTRUDER.tooltipDescription(), + RecipeMaps.extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Extruder.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_HV.ID, + "basicmachine.extruder.tier.03", + "Advanced Extruder II", + 3, + MachineType.EXTRUDER.tooltipDescription(), + RecipeMaps.extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Extruder.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_EV.ID, + "basicmachine.extruder.tier.04", + "Advanced Extruder III", + 4, + MachineType.EXTRUDER.tooltipDescription(), + RecipeMaps.extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Extruder.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_IV.ID, + "basicmachine.extruder.tier.05", + "Advanced Extruder IV", + 5, + MachineType.EXTRUDER.tooltipDescription(), + RecipeMaps.extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.ExtruderLuV.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_LuV.ID, + "basicmachine.extruder.tier.06", + "Elite Extruder", + 6, + MachineType.EXTRUDER.tooltipDescription(), + extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.ExtruderZPM.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_ZPM.ID, + "basicmachine.extruder.tier.07", + "Elite Extruder II", + 7, + MachineType.EXTRUDER.tooltipDescription(), + extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.ExtruderUV.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_UV.ID, + "basicmachine.extruder.tier.08", + "Ultimate Shape Driver", + 8, + MachineType.EXTRUDER.tooltipDescription(), + extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.ExtruderUHV.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_UHV.ID, + "basicmachine.extruder.tier.09", + "Epic Shape Driver", + 9, + MachineType.EXTRUDER.tooltipDescription(), + extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.ExtruderUEV.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_UEV.ID, + "basicmachine.extruder.tier.10", + "Epic Shape Driver II", + 10, + MachineType.EXTRUDER.tooltipDescription(), + extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.ExtruderUIV.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_UIV.ID, + "basicmachine.extruder.tier.11", + "Epic Shape Driver III", + 11, + MachineType.EXTRUDER.tooltipDescription(), + extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + ItemList.ExtruderUMV.set( + new MTEBasicMachineWithRecipe( + EXTRUDER_UMV.ID, + "basicmachine.extruder.tier.12", + "Epic Shape Driver IV", + 12, + MachineType.EXTRUDER.tooltipDescription(), + extruderRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "EXTRUDER", + null).getStackForm(1L)); + + } + + private void registerFluidSolidifier() { + ItemList.Machine_LV_FluidSolidifier.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_LV.ID, + "basicmachine.fluidsolidifier.tier.01", + "Basic Fluid Solidifier", + 1, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + RecipeMaps.fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.Machine_MV_FluidSolidifier.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_MV.ID, + "basicmachine.fluidsolidifier.tier.02", + "Advanced Fluid Solidifier", + 2, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + RecipeMaps.fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.Machine_HV_FluidSolidifier.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_HV.ID, + "basicmachine.fluidsolidifier.tier.03", + "Advanced Fluid Solidifier II", + 3, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + RecipeMaps.fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.Machine_EV_FluidSolidifier.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_EV.ID, + "basicmachine.fluidsolidifier.tier.04", + "Advanced Fluid Solidifier III", + 4, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + RecipeMaps.fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.Machine_IV_FluidSolidifier.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_IV.ID, + "basicmachine.fluidsolidifier.tier.05", + "Advanced Fluid Solidifier IV", + 5, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + RecipeMaps.fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.FluidSolidifierLuV.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_LuV.ID, + "basicmachine.fluidsolidifier.tier.06", + "Elite Fluid Solidifier", + 6, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.FluidSolidifierZPM.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_ZPM.ID, + "basicmachine.fluidsolidifier.tier.07", + "Elite Fluid Solidifier II", + 7, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.FluidSolidifierUV.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_UV.ID, + "basicmachine.fluidsolidifier.tier.08", + "Ultimate Fluid Petrificator", + 8, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.FluidSolidifierUHV.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_UHV.ID, + "basicmachine.fluidsolidifier.tier.09", + "Epic Fluid Petrificator", + 9, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.FluidSolidifierUEV.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_UEV.ID, + "basicmachine.fluidsolidifier.tier.10", + "Epic Fluid Petrificator II", + 10, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.FluidSolidifierUIV.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_UIV.ID, + "basicmachine.fluidsolidifier.tier.11", + "Epic Fluid Petrificator III", + 11, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + ItemList.FluidSolidifierUMV.set( + new MTEBasicMachineWithRecipe( + FLUID_SOLIDIFIER_UMV.ID, + "basicmachine.fluidsolidifier.tier.12", + "Epic Fluid Petrificator IV", + 12, + MachineType.FLUID_SOLIDIFIER.tooltipDescription(), + fluidSolidifierRecipes, + 1, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "FLUID_SOLIDIFIER", + null).getStackForm(1L)); + + } + + private void registerFormingPress() { + ItemList.Machine_LV_Press.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_LV.ID, + "basicmachine.press.tier.01", + "Basic Forming Press", + 1, + MachineType.FORMING_PRESS.tooltipDescription(), + RecipeMaps.formingPressRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.Machine_MV_Press.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_MV.ID, + "basicmachine.press.tier.02", + "Advanced Forming Press", + 2, + MachineType.FORMING_PRESS.tooltipDescription(), + RecipeMaps.formingPressRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.Machine_HV_Press.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_HV.ID, + "basicmachine.press.tier.03", + "Advanced Forming Press II", + 3, + MachineType.FORMING_PRESS.tooltipDescription(), + RecipeMaps.formingPressRecipes, + 4, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.Machine_EV_Press.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_EV.ID, + "basicmachine.press.tier.04", + "Advanced Forming Press III", + 4, + MachineType.FORMING_PRESS.tooltipDescription(), + RecipeMaps.formingPressRecipes, + 4, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.Machine_IV_Press.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_IV.ID, + "basicmachine.press.tier.05", + "Advanced Forming Press IV", + 5, + MachineType.FORMING_PRESS.tooltipDescription(), + RecipeMaps.formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.FormingPressLuV.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_LuV.ID, + "basicmachine.press.tier.06", + "Elite Forming Press", + 6, + MachineType.FORMING_PRESS.tooltipDescription(), + formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.FormingPressZPM.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_ZPM.ID, + "basicmachine.press.tier.07", + "Elite Forming Press II", + 7, + MachineType.FORMING_PRESS.tooltipDescription(), + formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.FormingPressUV.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_UV.ID, + "basicmachine.press.tier.08", + "Ultimate Surface Shifter", + 8, + MachineType.FORMING_PRESS.tooltipDescription(), + formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.FormingPressUHV.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_UHV.ID, + "basicmachine.press.tier.09", + "Epic Surface Shifter", + 9, + MachineType.FORMING_PRESS.tooltipDescription(), + formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.FormingPressUEV.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_UEV.ID, + "basicmachine.press.tier.10", + "Epic Surface Shifter II", + 10, + MachineType.FORMING_PRESS.tooltipDescription(), + formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.FormingPressUIV.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_UIV.ID, + "basicmachine.press.tier.11", + "Epic Surface Shifter III", + 11, + MachineType.FORMING_PRESS.tooltipDescription(), + formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + ItemList.FormingPressUMV.set( + new MTEBasicMachineWithRecipe( + FORMING_PRESS_UMV.ID, + "basicmachine.press.tier.12", + "Epic Surface Shifter IV", + 12, + MachineType.FORMING_PRESS.tooltipDescription(), + formingPressRecipes, + 6, + 1, + false, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PRESS", + null).getStackForm(1L)); + + } + + private void registerForgeHammer() { + ItemList.Machine_LV_Hammer.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_LV.ID, + "basicmachine.hammer.tier.01", + "Basic Forge Hammer", + 1, + MachineType.FORGE_HAMMER.tooltipDescription(), + RecipeMaps.hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.MAIN_RANDOM_SPARKS, + "HAMMER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Hammer.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_MV.ID, + "basicmachine.hammer.tier.02", + "Advanced Forge Hammer", + 2, + MachineType.FORGE_HAMMER.tooltipDescription(), + RecipeMaps.hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.MAIN_RANDOM_SPARKS, + "HAMMER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Hammer.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_HV.ID, + "basicmachine.hammer.tier.03", + "Advanced Forge Hammer II", + 3, + MachineType.FORGE_HAMMER.tooltipDescription(), + RecipeMaps.hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.MAIN_RANDOM_SPARKS, + "HAMMER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Hammer.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_EV.ID, + "basicmachine.hammer.tier.04", + "Advanced Forge Hammer III", + 4, + MachineType.FORGE_HAMMER.tooltipDescription(), + RecipeMaps.hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.MAIN_RANDOM_SPARKS, + "HAMMER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Hammer.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_IV.ID, + "basicmachine.hammer.tier.05", + "Advanced Forge Hammer IV", + 5, + MachineType.FORGE_HAMMER.tooltipDescription(), + RecipeMaps.hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.MAIN_RANDOM_SPARKS, + "HAMMER", + null).getStackForm(1L)); + + ItemList.ForgeHammerLuV.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_LuV.ID, + "basicmachine.hammer.tier.06", + "Elite Forge Hammer", + 6, + MachineType.FORGE_HAMMER.tooltipDescription(), + hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "HAMMER", + null).getStackForm(1L)); + + ItemList.ForgeHammerZPM.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_ZPM.ID, + "basicmachine.hammer.tier.07", + "Elite Forge Hammer II", + 7, + MachineType.FORGE_HAMMER.tooltipDescription(), + hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "HAMMER", + null).getStackForm(1L)); + + ItemList.ForgeHammerUV.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_UV.ID, + "basicmachine.hammer.tier.08", + "Ultimate Impact Modulator", + 8, + MachineType.FORGE_HAMMER.tooltipDescription(), + hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "HAMMER", + null).getStackForm(1L)); + + ItemList.ForgeHammerUHV.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_UHV.ID, + "basicmachine.hammer.tier.09", + "Epic Impact Modulator", + 9, + MachineType.FORGE_HAMMER.tooltipDescription(), + hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "HAMMER", + null).getStackForm(1L)); + + ItemList.ForgeHammerUEV.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_UEV.ID, + "basicmachine.hammer.tier.10", + "Epic Impact Modulator II", + 10, + MachineType.FORGE_HAMMER.tooltipDescription(), + hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "HAMMER", + null).getStackForm(1L)); + + ItemList.ForgeHammerUIV.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_UIV.ID, + "basicmachine.hammer.tier.11", + "Epic Impact Modulator III", + 11, + MachineType.FORGE_HAMMER.tooltipDescription(), + hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "HAMMER", + null).getStackForm(1L)); + + ItemList.ForgeHammerUMV.set( + new MTEBasicMachineWithRecipe( + FORGE_HAMMER_UMV.ID, + "basicmachine.hammer.tier.12", + "Epic Impact Modulator IV", + 12, + MachineType.FORGE_HAMMER.tooltipDescription(), + hammerRecipes, + 1, + 1, + true, + SoundResource.RANDOM_ANVIL_USE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "HAMMER", + null).getStackForm(1L)); + + } + + private void registerLathe() { + ItemList.Machine_LV_Lathe.set( + new MTEBasicMachineWithRecipe( + LATHE_LV.ID, + "basicmachine.lathe.tier.01", + "Basic Lathe", + 1, + MachineType.LATHE.tooltipDescription(), + RecipeMaps.latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.Machine_MV_Lathe.set( + new MTEBasicMachineWithRecipe( + LATHE_MV.ID, + "basicmachine.lathe.tier.02", + "Advanced Lathe", + 2, + MachineType.LATHE.tooltipDescription(), + RecipeMaps.latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.Machine_HV_Lathe.set( + new MTEBasicMachineWithRecipe( + LATHE_HV.ID, + "basicmachine.lathe.tier.03", + "Advanced Lathe II", + 3, + MachineType.LATHE.tooltipDescription(), + RecipeMaps.latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.Machine_EV_Lathe.set( + new MTEBasicMachineWithRecipe( + LATHE_EV.ID, + "basicmachine.lathe.tier.04", + "Advanced Lathe III", + 4, + MachineType.LATHE.tooltipDescription(), + RecipeMaps.latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.Machine_IV_Lathe.set( + new MTEBasicMachineWithRecipe( + LATHE_IV.ID, + "basicmachine.lathe.tier.05", + "Advanced Lathe IV", + 5, + MachineType.LATHE.tooltipDescription(), + RecipeMaps.latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.LatheLuV.set( + new MTEBasicMachineWithRecipe( + LATHE_LuV.ID, + "basicmachine.lathe.tier.06", + "Elite Lathe", + 6, + MachineType.LATHE.tooltipDescription(), + latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.LatheZPM.set( + new MTEBasicMachineWithRecipe( + LATHE_ZPM.ID, + "basicmachine.lathe.tier.07", + "Elite Lathe II", + 7, + MachineType.LATHE.tooltipDescription(), + latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.LatheUV.set( + new MTEBasicMachineWithRecipe( + LATHE_UV.ID, + "basicmachine.lathe.tier.08", + "Ultimate Turn-O-Matic", + 8, + MachineType.LATHE.tooltipDescription(), + latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.LatheUHV.set( + new MTEBasicMachineWithRecipe( + LATHE_UHV.ID, + "basicmachine.lathe.tier.09", + "Epic Turn-O-Matic", + 9, + MachineType.LATHE.tooltipDescription(), + latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.LatheUEV.set( + new MTEBasicMachineWithRecipe( + LATHE_UEV.ID, + "basicmachine.lathe.tier.10", + "Epic Turn-O-Matic II", + 10, + MachineType.LATHE.tooltipDescription(), + latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.LatheUIV.set( + new MTEBasicMachineWithRecipe( + LATHE_UIV.ID, + "basicmachine.lathe.tier.11", + "Epic Turn-O-Matic III", + 11, + MachineType.LATHE.tooltipDescription(), + latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + ItemList.LatheUMV.set( + new MTEBasicMachineWithRecipe( + LATHE_UMV.ID, + "basicmachine.lathe.tier.12", + "Epic Turn-O-Matic IV", + 12, + MachineType.LATHE.tooltipDescription(), + latheRecipes, + 1, + 2, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LATHE", + null).getStackForm(1L)); + + } + + private void registerPrecisionLaserEngraver() { + ItemList.Machine_LV_LaserEngraver.set( + new MTEBasicMachineWithRecipe( + LASER_ENGRAVER_LV.ID, + "basicmachine.laserengraver.tier.01", + "Basic Precision Laser Engraver", + 1, + MachineType.LASER_ENGRAVER.tooltipDescription(), + RecipeMaps.laserEngraverRecipes, + 2, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.Machine_MV_LaserEngraver.set( + new MTEBasicMachineWithRecipe( + LASER_ENGRAVER_MV.ID, + "basicmachine.laserengraver.tier.02", + "Advanced Precision Laser Engraver", + 2, + MachineType.LASER_ENGRAVER.tooltipDescription(), + RecipeMaps.laserEngraverRecipes, + 2, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.Machine_HV_LaserEngraver.set( + new MTEBasicMachineWithRecipe( + LASER_ENGRAVER_HV.ID, + "basicmachine.laserengraver.tier.03", + "Advanced Precision Laser Engraver II", + 3, + MachineType.LASER_ENGRAVER.tooltipDescription(), + RecipeMaps.laserEngraverRecipes, + 2, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.Machine_EV_LaserEngraver.set( + new MTEBasicMachineWithRecipe( + LASER_ENGRAVER_EV.ID, + "basicmachine.laserengraver.tier.04", + "Advanced Precision Laser Engraver III", + 4, + MachineType.LASER_ENGRAVER.tooltipDescription(), + RecipeMaps.laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.Machine_IV_LaserEngraver.set( + new MTEBasicMachineWithRecipe( + LASER_ENGRAVER_IV.ID, + "basicmachine.laserengraver.tier.05", + "Advanced Precision Laser Engraver IV", + 5, + MachineType.LASER_ENGRAVER.tooltipDescription(), + RecipeMaps.laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.PrecisionLaserEngraverLuV.set( + new MTEBasicMachineWithRecipe( + PRECISION_LASER_ENGRAVER_LuV.ID, + "basicmachine.laserengraver.tier.06", + "Elite Precision Laser Engraver", + 6, + MachineType.LASER_ENGRAVER.tooltipDescription(), + laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.PrecisionLaserEngraverZPM.set( + new MTEBasicMachineWithRecipe( + PRECISION_LASER_ENGRAVER_ZPM.ID, + "basicmachine.laserengraver.tier.07", + "Elite Precision Laser Engraver II", + 7, + MachineType.LASER_ENGRAVER.tooltipDescription(), + laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.PrecisionLaserEngraverUV.set( + new MTEBasicMachineWithRecipe( + PRECISION_LASER_ENGRAVER_UV.ID, + "basicmachine.laserengraver.tier.08", + "Ultimate Exact Photon Cannon", + 8, + MachineType.LASER_ENGRAVER.tooltipDescription(), + laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.PrecisionLaserEngraverUHV.set( + new MTEBasicMachineWithRecipe( + PRECISION_LASER_ENGRAVER_UHV.ID, + "basicmachine.laserengraver.tier.09", + "Epic Exact Photon Cannon", + 9, + MachineType.LASER_ENGRAVER.tooltipDescription(), + laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.PrecisionLaserEngraverUEV.set( + new MTEBasicMachineWithRecipe( + PRECISION_LASER_ENGRAVER_UEV.ID, + "basicmachine.laserengraver.tier.10", + "Epic Exact Photon Cannon II", + 10, + MachineType.LASER_ENGRAVER.tooltipDescription(), + laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.PrecisionLaserEngraverUIV.set( + new MTEBasicMachineWithRecipe( + PRECISION_LASER_ENGRAVER_UIV.ID, + "basicmachine.laserengraver.tier.11", + "Epic Exact Photon Cannon III", + 11, + MachineType.LASER_ENGRAVER.tooltipDescription(), + laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + ItemList.PrecisionLaserEngraverUMV.set( + new MTEBasicMachineWithRecipe( + PRECISION_LASER_ENGRAVER_UMV.ID, + "basicmachine.laserengraver.tier.12", + "Epic Exact Photon Cannon IV", + 12, + MachineType.LASER_ENGRAVER.tooltipDescription(), + laserEngraverRecipes, + 4, + 1, + true, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "LASER_ENGRAVER", + null).getStackForm(1L)); + + } + + private void registerMacerator() { + ItemList.Machine_LV_Macerator.set( + new MTEBasicMachineWithRecipe( + MACERATOR_LV.ID, + "basicmachine.macerator.tier.01", + "Basic Macerator", + 1, + MachineType.MACERATOR.tooltipDescription(), + RecipeMaps.maceratorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "MACERATOR", + null).getStackForm(1L)); + + ItemList.Machine_MV_Macerator.set( + new MTEBasicMachineWithRecipe( + MACERATOR_MV.ID, + "basicmachine.macerator.tier.02", + "Advanced Macerator", + 2, + MachineType.MACERATOR.tooltipDescription(), + RecipeMaps.maceratorRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "MACERATOR", + null).getStackForm(1L)); + + ItemList.Machine_HV_Macerator.set( + new MTEBasicMachineWithRecipe( + MACERATOR_HV.ID, + "basicmachine.macerator.tier.03", + "Universal Macerator", + 3, + MachineType.MACERATOR_PULVERIZER.tooltipDescription(), + RecipeMaps.maceratorRecipes, + 1, + 2, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Macerator.set( + new MTEBasicMachineWithRecipe( + MACERATOR_EV.ID, + "basicmachine.macerator.tier.04", + "Universal Pulverizer", + 4, + MachineType.MACERATOR_PULVERIZER.tooltipDescription(), + RecipeMaps.maceratorRecipes, + 1, + 3, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Macerator.set( + new MTEBasicMachineWithRecipe( + MACERATOR_IV.ID, + "basicmachine.macerator.tier.05", + "Blend-O-Matic 9001", + 5, + MachineType.MACERATOR_PULVERIZER.tooltipDescription(), + RecipeMaps.maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.MaceratorLuV.set( + new MTEBasicMachineWithRecipe( + MACERATOR_LuV.ID, + "basicmachine.macerator.tier.06", + "Elite Pulverizer", + 6, + MachineType.MACERATOR.tooltipDescription(), + maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.MaceratorZPM.set( + new MTEBasicMachineWithRecipe( + MACERATOR_ZPM.ID, + "basicmachine.macerator.tier.07", + "Elite Pulverizer II", + 7, + MachineType.MACERATOR.tooltipDescription(), + maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.MaceratorUV.set( + new MTEBasicMachineWithRecipe( + MACERATOR_UV.ID, + "basicmachine.macerator.tier.08", + "Ultimate Shape Eliminator", + 8, + MachineType.MACERATOR.tooltipDescription(), + maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.MaceratorUHV.set( + new MTEBasicMachineWithRecipe( + MACERATOR_UHV.ID, + "basicmachine.macerator.tier.09", + "Epic Shape Eliminator", + 9, + MachineType.MACERATOR.tooltipDescription(), + maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.MaceratorUEV.set( + new MTEBasicMachineWithRecipe( + MACERATOR_UEV.ID, + "basicmachine.macerator.tier.10", + "Epic Shape Eliminator II", + 10, + MachineType.MACERATOR.tooltipDescription(), + maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.MaceratorUIV.set( + new MTEBasicMachineWithRecipe( + MACERATOR_UIV.ID, + "basicmachine.macerator.tier.11", + "Epic Shape Eliminator III", + 11, + MachineType.MACERATOR.tooltipDescription(), + maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + ItemList.MaceratorUMV.set( + new MTEBasicMachineWithRecipe( + MACERATOR_UMV.ID, + "basicmachine.macerator.tier.12", + "Epic Shape Eliminator IV", + 12, + MachineType.MACERATOR.tooltipDescription(), + maceratorRecipes, + 1, + 4, + false, + SoundResource.IC2_MACHINES_MACERATOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PULVERIZER", + null).getStackForm(1L)); + + } + + private void registerMatterFabricator() { + + ItemList.MassFabricatorLuV.set( + new MTEMassfabricator(MATTER_FABRICATOR_LuV.ID, "basicmachine.massfab.tier.06", "Elite Mass Fabricator", 6) + .getStackForm(1L)); + ItemList.MassFabricatorZPM.set( + new MTEMassfabricator( + MATTER_FABRICATOR_ZPM.ID, + "basicmachine.massfab.tier.07", + "Elite Mass Fabricator II", + 7).getStackForm(1L)); + ItemList.MassFabricatorUV.set( + new MTEMassfabricator( + MATTER_FABRICATOR_UV.ID, + "basicmachine.massfab.tier.08", + "Ultimate Existence Initiator", + 8).getStackForm(1L)); + ItemList.MassFabricatorUHV.set( + new MTEMassfabricator( + MATTER_FABRICATOR_UHV.ID, + "basicmachine.massfab.tier.09", + "Epic Existence Initiator", + 9).getStackForm(1L)); + ItemList.MassFabricatorUEV.set( + new MTEMassfabricator( + MATTER_FABRICATOR_UEV.ID, + "basicmachine.massfab.tier.10", + "Epic Existence Initiator II", + 10).getStackForm(1L)); + ItemList.MassFabricatorUIV.set( + new MTEMassfabricator( + MATTER_FABRICATOR_UIV.ID, + "basicmachine.massfab.tier.11", + "Epic Existence Initiator III", + 11).getStackForm(1L)); + ItemList.MassFabricatorUMV.set( + new MTEMassfabricator( + MATTER_FABRICATOR_UMV.ID, + "basicmachine.massfab.tier.12", + "Epic Existence Initiator IV", + 12).getStackForm(1L)); + } + + private void registerMicrowave() { + ItemList.Machine_LV_Microwave.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_OVEN_LV.ID, + "basicmachine.microwave.tier.01", + "Basic Microwave", + 1, + MachineType.MICROWAVE.tooltipDescription(), + RecipeMaps.microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.Machine_MV_Microwave.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_OVEN_MV.ID, + "basicmachine.microwave.tier.02", + "Advanced Microwave", + 2, + MachineType.MICROWAVE.tooltipDescription(), + RecipeMaps.microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.Machine_HV_Microwave.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_OVEN_HV.ID, + "basicmachine.microwave.tier.03", + "Advanced Microwave II", + 3, + MachineType.MICROWAVE.tooltipDescription(), + RecipeMaps.microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.Machine_EV_Microwave.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_OVEN_EV.ID, + "basicmachine.microwave.tier.04", + "Advanced Microwave III", + 4, + MachineType.MICROWAVE.tooltipDescription(), + RecipeMaps.microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.Machine_IV_Microwave.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_OVEN_IV.ID, + "basicmachine.microwave.tier.05", + "Advanced Microwave IV", + 5, + MachineType.MICROWAVE.tooltipDescription(), + RecipeMaps.microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.MicrowaveLuV.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_LuV.ID, + "basicmachine.microwave.tier.06", + "Elite Microwave", + 6, + MachineType.MICROWAVE.tooltipDescription(), + microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.MicrowaveZPM.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_ZPM.ID, + "basicmachine.microwave.tier.07", + "Elite Microwave II", + 7, + MachineType.MICROWAVE.tooltipDescription(), + microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.MicrowaveUV.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_UV.ID, + "basicmachine.microwave.tier.08", + "Ultimate UFO Engine", + 8, + MachineType.MICROWAVE.tooltipDescription(), + microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.MicrowaveUHV.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_UHV.ID, + "basicmachine.microwave.tier.09", + "Epic UFO Engine", + 9, + MachineType.MICROWAVE.tooltipDescription(), + microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.MicrowaveUEV.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_UEV.ID, + "basicmachine.microwave.tier.10", + "Epic UFO Engine II", + 10, + MachineType.MICROWAVE.tooltipDescription(), + microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.MicrowaveUIV.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_UIV.ID, + "basicmachine.microwave.tier.11", + "Epic UFO Engine III", + 11, + MachineType.MICROWAVE.tooltipDescription(), + microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + ItemList.MicrowaveUMV.set( + new MTEBasicMachineWithRecipe( + MICROWAVE_UMV.ID, + "basicmachine.microwave.tier.12", + "Epic UFO Engine IV", + 12, + MachineType.MICROWAVE.tooltipDescription(), + microwaveRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "MICROWAVE", + null).getStackForm(1L)); + + } + + private static void registerOven() { + ItemList.Machine_LV_Oven.set( + new MTEBasicMachineWithRecipe( + OVEN_LV.ID, + "basicmachine.e_oven.tier.01", + "Basic Electric Oven", + 1, + MachineType.OVEN.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_OVEN", + null).setProgressBarTextureName("E_Oven") + .getStackForm(1L)); + + ItemList.Machine_MV_Oven.set( + new MTEBasicMachineWithRecipe( + OVEN_MV.ID, + "basicmachine.e_oven.tier.02", + "Advanced Electric Oven", + 2, + MachineType.OVEN.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_OVEN", + null).setProgressBarTextureName("E_Oven") + .getStackForm(1L)); + + ItemList.Machine_HV_Oven.set( + new MTEBasicMachineWithRecipe( + OVEN_HV.ID, + "basicmachine.e_oven.tier.03", + "Advanced Electric Oven II", + 3, + MachineType.OVEN.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_OVEN", + null).setProgressBarTextureName("E_Oven") + .getStackForm(1L)); + + ItemList.Machine_EV_Oven.set( + new MTEBasicMachineWithRecipe( + OVEN_EV.ID, + "basicmachine.e_oven.tier.04", + "Advanced Electric Oven III", + 4, + MachineType.OVEN.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_OVEN", + null).setProgressBarTextureName("E_Oven") + .getStackForm(1L)); + + ItemList.Machine_IV_Oven.set( + new MTEBasicMachineWithRecipe( + OVEN_IV.ID, + "basicmachine.e_oven.tier.05", + "Advanced Electric Oven IV", + 5, + MachineType.OVEN.tooltipDescription(), + RecipeMaps.furnaceRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ELECTRIC_OVEN", + null).setProgressBarTextureName("E_Oven") + .getStackForm(1L)); + } + + private void registerOreWashingPlant() { + ItemList.Machine_LV_OreWasher.set( + new MTEBasicMachineWithRecipe( + ORE_WASHER_LV.ID, + "basicmachine.orewasher.tier.01", + "Basic Ore Washing Plant", + 1, + MachineType.ORE_WASHER.tooltipDescription(), + RecipeMaps.oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.Machine_MV_OreWasher.set( + new MTEBasicMachineWithRecipe( + ORE_WASHER_MV.ID, + "basicmachine.orewasher.tier.02", + "Advanced Ore Washing Plant", + 2, + MachineType.ORE_WASHER.tooltipDescription(), + RecipeMaps.oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.Machine_HV_OreWasher.set( + new MTEBasicMachineWithRecipe( + ORE_WASHER_HV.ID, + "basicmachine.orewasher.tier.03", + "Advanced Ore Washing Plant II", + 3, + MachineType.ORE_WASHER.tooltipDescription(), + RecipeMaps.oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.Machine_EV_OreWasher.set( + new MTEBasicMachineWithRecipe( + ORE_WASHER_EV.ID, + "basicmachine.orewasher.tier.04", + "Advanced Ore Washing Plant III", + 4, + MachineType.ORE_WASHER.tooltipDescription(), + RecipeMaps.oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.Machine_IV_OreWasher.set( + new MTEBasicMachineWithRecipe( + ORE_WASHER_IV.ID, + "basicmachine.orewasher.tier.05", + "Repurposed Laundry-Washer I-360", + 5, + MachineType.ORE_WASHER.tooltipDescription(), + RecipeMaps.oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.OreWashingPlantLuV.set( + new MTEBasicMachineWithRecipe( + ORE_WASHING_PLANT_LuV.ID, + "basicmachine.orewasher.tier.06", + "Elite Ore Washing Plant", + 6, + MachineType.ORE_WASHER.tooltipDescription(), + oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.OreWashingPlantZPM.set( + new MTEBasicMachineWithRecipe( + ORE_WASHING_PLANT_ZPM.ID, + "basicmachine.orewasher.tier.07", + "Elite Ore Washing Plant II", + 7, + MachineType.ORE_WASHER.tooltipDescription(), + oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.OreWashingPlantUV.set( + new MTEBasicMachineWithRecipe( + ORE_WASHING_PLANT_UV.ID, + "basicmachine.orewasher.tier.08", + "Ultimate Ore Washing Machine", + 8, + MachineType.ORE_WASHER.tooltipDescription(), + oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.OreWashingPlantUHV.set( + new MTEBasicMachineWithRecipe( + ORE_WASHING_PLANT_UHV.ID, + "basicmachine.orewasher.tier.09", + "Epic Ore Washing Machine", + 9, + MachineType.ORE_WASHER.tooltipDescription(), + oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.OreWashingPlantUEV.set( + new MTEBasicMachineWithRecipe( + ORE_WASHING_PLANT_UEV.ID, + "basicmachine.orewasher.tier.10", + "Epic Ore Washing Machine II", + 10, + MachineType.ORE_WASHER.tooltipDescription(), + oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.OreWashingPlantUIV.set( + new MTEBasicMachineWithRecipe( + ORE_WASHING_PLANT_UIV.ID, + "basicmachine.orewasher.tier.11", + "Epic Ore Washing Machine III", + 11, + MachineType.ORE_WASHER.tooltipDescription(), + oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + ItemList.OreWashingPlantUMV.set( + new MTEBasicMachineWithRecipe( + ORE_WASHING_PLANT_UMV.ID, + "basicmachine.orewasher.tier.12", + "Epic Ore Washing Machine IV", + 12, + MachineType.ORE_WASHER.tooltipDescription(), + oreWasherRecipes, + 1, + 3, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ORE_WASHER", + null).getStackForm(1L)); + + } + + private void registerPolarizer() { + ItemList.Machine_LV_Polarizer.set( + new MTEBasicMachineWithRecipe( + POLARIZER_LV.ID, + "basicmachine.polarizer.tier.01", + "Basic Polarizer", + 1, + MachineType.POLARIZER.tooltipDescription(), + RecipeMaps.polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Polarizer.set( + new MTEBasicMachineWithRecipe( + POLARIZER_MV.ID, + "basicmachine.polarizer.tier.02", + "Advanced Polarizer", + 2, + MachineType.POLARIZER.tooltipDescription(), + RecipeMaps.polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Polarizer.set( + new MTEBasicMachineWithRecipe( + POLARIZER_HV.ID, + "basicmachine.polarizer.tier.03", + "Advanced Polarizer II", + 3, + MachineType.POLARIZER.tooltipDescription(), + RecipeMaps.polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Polarizer.set( + new MTEBasicMachineWithRecipe( + POLARIZER_EV.ID, + "basicmachine.polarizer.tier.04", + "Advanced Polarizer III", + 4, + MachineType.POLARIZER.tooltipDescription(), + RecipeMaps.polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Polarizer.set( + new MTEBasicMachineWithRecipe( + POLARIZER_IV.ID, + "basicmachine.polarizer.tier.05", + "Advanced Polarizer IV", + 5, + MachineType.POLARIZER.tooltipDescription(), + RecipeMaps.polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.PolarizerLuV.set( + new MTEBasicMachineWithRecipe( + POLARIZER_LuV.ID, + "basicmachine.polarizer.tier.06", + "Elite Polarizer", + 6, + MachineType.POLARIZER.tooltipDescription(), + polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.PolarizerZPM.set( + new MTEBasicMachineWithRecipe( + POLARIZER_ZPM.ID, + "basicmachine.polarizer.tier.07", + "Elite Polarizer II", + 7, + MachineType.POLARIZER.tooltipDescription(), + polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.PolarizerUV.set( + new MTEBasicMachineWithRecipe( + POLARIZER_UV.ID, + "basicmachine.polarizer.tier.08", + "Ultimate Magnetism Inducer", + 8, + MachineType.POLARIZER.tooltipDescription(), + polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.PolarizerUHV.set( + new MTEBasicMachineWithRecipe( + POLARIZER_UHV.ID, + "basicmachine.polarizer.tier.09", + "Epic Magnetism Inducer", + 9, + MachineType.POLARIZER.tooltipDescription(), + polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.PolarizerUEV.set( + new MTEBasicMachineWithRecipe( + POLARIZER_UEV.ID, + "basicmachine.polarizer.tier.10", + "Epic Magnetism Inducer II", + 10, + MachineType.POLARIZER.tooltipDescription(), + polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.PolarizerUIV.set( + new MTEBasicMachineWithRecipe( + POLARIZER_UIV.ID, + "basicmachine.polarizer.tier.11", + "Epic Magnetism Inducer III", + 11, + MachineType.POLARIZER.tooltipDescription(), + polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + ItemList.PolarizerUMV.set( + new MTEBasicMachineWithRecipe( + POLARIZER_UMV.ID, + "basicmachine.polarizer.tier.12", + "Epic Magnetism Inducer IV", + 12, + MachineType.POLARIZER.tooltipDescription(), + polarizerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "POLARIZER", + null).getStackForm(1L)); + + } + + private static void registerPrinter() { + ItemList.Machine_LV_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_LV.ID, + "basicmachine.printer.tier.01", + "Basic Printer", + 1, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_MV.ID, + "basicmachine.printer.tier.02", + "Advanced Printer", + 2, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_HV.ID, + "basicmachine.printer.tier.03", + "Advanced Printer II", + 3, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_EV.ID, + "basicmachine.printer.tier.04", + "Advanced Printer III", + 4, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_IV.ID, + "basicmachine.printer.tier.05", + "Advanced Printer IV", + 5, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + + ItemList.Machine_LuV_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_LuV.ID, + "basicmachine.printer.tier.06", + "Advanced Printer V", + 6, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + + ItemList.Machine_ZPM_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_ZPM.ID, + "basicmachine.printer.tier.07", + "Advanced Printer VI", + 7, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + + ItemList.Machine_UV_Printer.set( + new MTEBasicMachineWithRecipe( + PRINTER_UV.ID, + "basicmachine.printer.tier.08", + "Advanced Printer VII", + 8, + MachineType.PRINTER.tooltipDescription(), + RecipeMaps.printerRecipes, + 1, + 1, + true, + SoundResource.IC2_MACHINES_COMPRESSOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.TOP_SMOKE, + "PRINTER", + null).getStackForm(1L)); + } + + private void registerRecycler() { + ItemList.Machine_LV_Recycler.set( + new MTEBasicMachineWithRecipe( + RECYCLER_LV.ID, + "basicmachine.recycler.tier.01", + "Basic Recycler", + 1, + MachineType.RECYCLER.tooltipDescription(), + RecipeMaps.recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Recycler.set( + new MTEBasicMachineWithRecipe( + RECYCLER_MV.ID, + "basicmachine.recycler.tier.02", + "Advanced Recycler", + 2, + MachineType.RECYCLER.tooltipDescription(), + RecipeMaps.recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Recycler.set( + new MTEBasicMachineWithRecipe( + RECYCLER_HV.ID, + "basicmachine.recycler.tier.03", + "Advanced Recycler II", + 3, + MachineType.RECYCLER.tooltipDescription(), + RecipeMaps.recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Recycler.set( + new MTEBasicMachineWithRecipe( + RECYCLER_EV.ID, + "basicmachine.recycler.tier.04", + "Advanced Recycler III", + 4, + MachineType.RECYCLER.tooltipDescription(), + RecipeMaps.recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Recycler.set( + new MTEBasicMachineWithRecipe( + RECYCLER_IV.ID, + "basicmachine.recycler.tier.05", + "The Oblitterator", + 5, + MachineType.RECYCLER.tooltipDescription(), + RecipeMaps.recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.RecyclerLuV.set( + new MTEBasicMachineWithRecipe( + RECYCLER_LuV.ID, + "basicmachine.recycler.tier.06", + "Elite Recycler", + 6, + MachineType.RECYCLER.tooltipDescription(), + recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.RecyclerZPM.set( + new MTEBasicMachineWithRecipe( + RECYCLER_ZPM.ID, + "basicmachine.recycler.tier.07", + "Elite Recycler II", + 7, + MachineType.RECYCLER.tooltipDescription(), + recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.RecyclerUV.set( + new MTEBasicMachineWithRecipe( + RECYCLER_UV.ID, + "basicmachine.recycler.tier.08", + "Ultimate Scrap-O-Matic", + 8, + MachineType.RECYCLER.tooltipDescription(), + recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.RecyclerUHV.set( + new MTEBasicMachineWithRecipe( + RECYCLER_UHV.ID, + "basicmachine.recycler.tier.09", + "Epic Scrap-O-Matic", + 9, + MachineType.RECYCLER.tooltipDescription(), + recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.RecyclerUEV.set( + new MTEBasicMachineWithRecipe( + RECYCLER_UEV.ID, + "basicmachine.recycler.tier.10", + "Epic Scrap-O-Matic II", + 10, + MachineType.RECYCLER.tooltipDescription(), + recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.RecyclerUIV.set( + new MTEBasicMachineWithRecipe( + RECYCLER_UIV.ID, + "basicmachine.recycler.tier.11", + "Epic Scrap-O-Matic III", + 11, + MachineType.RECYCLER.tooltipDescription(), + recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + ItemList.RecyclerUMV.set( + new MTEBasicMachineWithRecipe( + RECYCLER_UMV.ID, + "basicmachine.recycler.tier.12", + "Epic Scrap-O-Matic IV", + 12, + MachineType.RECYCLER.tooltipDescription(), + recyclerRecipes, + 1, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "RECYCLER", + null).getStackForm(1L)); + + } + + private void registerSiftingMachine() { + ItemList.Machine_LV_Sifter.set( + new MTEBasicMachineWithRecipe( + SIFTER_LV.ID, + "basicmachine.sifter.tier.01", + "Basic Sifting Machine", + 1, + MachineType.SIFTER.tooltipDescription(), + RecipeMaps.sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Sifter.set( + new MTEBasicMachineWithRecipe( + SIFTER_MV.ID, + "basicmachine.sifter.tier.02", + "Advanced Sifting Machine", + 2, + MachineType.SIFTER.tooltipDescription(), + RecipeMaps.sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Sifter.set( + new MTEBasicMachineWithRecipe( + SIFTER_HV.ID, + "basicmachine.sifter.tier.03", + "Advanced Sifting Machine II", + 3, + MachineType.SIFTER.tooltipDescription(), + RecipeMaps.sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Sifter.set( + new MTEBasicMachineWithRecipe( + SIFTER_EV.ID, + "basicmachine.sifter.tier.04", + "Advanced Sifting Machine III", + 4, + MachineType.SIFTER.tooltipDescription(), + RecipeMaps.sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Sifter.set( + new MTEBasicMachineWithRecipe( + SIFTER_IV.ID, + "basicmachine.sifter.tier.05", + "Advanced Sifting Machine IV", + 5, + MachineType.SIFTER.tooltipDescription(), + RecipeMaps.sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.SiftingMachineLuV.set( + new MTEBasicMachineWithRecipe( + SIFTING_MACHINE_LuV.ID, + "basicmachine.sifter.tier.06", + "Elite Sifting Machine", + 6, + MachineType.SIFTER.tooltipDescription(), + sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.SiftingMachineZPM.set( + new MTEBasicMachineWithRecipe( + SIFTING_MACHINE_ZPM.ID, + "basicmachine.sifter.tier.07", + "Elite Sifting Machine II", + 7, + MachineType.SIFTER.tooltipDescription(), + sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.SiftingMachineUV.set( + new MTEBasicMachineWithRecipe( + SIFTING_MACHINE_UV.ID, + "basicmachine.sifter.tier.08", + "Ultimate Pulsation Filter", + 8, + MachineType.SIFTER.tooltipDescription(), + sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.SiftingMachineUHV.set( + new MTEBasicMachineWithRecipe( + SIFTING_MACHINE_UHV.ID, + "basicmachine.sifter.tier.09", + "Epic Pulsation Filter", + 9, + MachineType.SIFTER.tooltipDescription(), + sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.SiftingMachineUEV.set( + new MTEBasicMachineWithRecipe( + SIFTING_MACHINE_UEV.ID, + "basicmachine.sifter.tier.10", + "Epic Pulsation Filter II", + 10, + MachineType.SIFTER.tooltipDescription(), + sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.SiftingMachineUIV.set( + new MTEBasicMachineWithRecipe( + SIFTING_MACHINE_UIV.ID, + "basicmachine.sifter.tier.11", + "Epic Pulsation Filter III", + 11, + MachineType.SIFTER.tooltipDescription(), + sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + ItemList.SiftingMachineUMV.set( + new MTEBasicMachineWithRecipe( + SIFTING_MACHINE_UMV.ID, + "basicmachine.sifter.tier.12", + "Epic Pulsation Filter IV", + 12, + MachineType.SIFTER.tooltipDescription(), + sifterRecipes, + 1, + 9, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SIFTER", + null).getStackForm(1L)); + + } + + private void registerSlicingMachine() { + ItemList.Machine_LV_Slicer.set( + new MTEBasicMachineWithRecipe( + SLICER_LV.ID, + "basicmachine.slicer.tier.01", + "Basic Slicing Machine", + 1, + MachineType.SLICER.tooltipDescription(), + RecipeMaps.slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Slicer.set( + new MTEBasicMachineWithRecipe( + SLICER_MV.ID, + "basicmachine.slicer.tier.02", + "Advanced Slicing Machine", + 2, + MachineType.SLICER.tooltipDescription(), + RecipeMaps.slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Slicer.set( + new MTEBasicMachineWithRecipe( + SLICER_HV.ID, + "basicmachine.slicer.tier.03", + "Advanced Slicing Machine II", + 3, + MachineType.SLICER.tooltipDescription(), + RecipeMaps.slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Slicer.set( + new MTEBasicMachineWithRecipe( + SLICER_EV.ID, + "basicmachine.slicer.tier.04", + "Advanced Slicing Machine III", + 4, + MachineType.SLICER.tooltipDescription(), + RecipeMaps.slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Slicer.set( + new MTEBasicMachineWithRecipe( + SLICER_IV.ID, + "basicmachine.slicer.tier.05", + "Advanced Slicing Machine IV", + 5, + MachineType.SLICER.tooltipDescription(), + RecipeMaps.slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.SlicingMachineLuV.set( + new MTEBasicMachineWithRecipe( + SLICING_MACHINE_LuV.ID, + "basicmachine.slicer.tier.06", + "Elite Slicing Machine", + 6, + MachineType.SLICER.tooltipDescription(), + slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.SlicingMachineZPM.set( + new MTEBasicMachineWithRecipe( + SLICING_MACHINE_ZPM.ID, + "basicmachine.slicer.tier.07", + "Elite Slicing Machine II", + 7, + MachineType.SLICER.tooltipDescription(), + slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.SlicingMachineUV.set( + new MTEBasicMachineWithRecipe( + SLICING_MACHINE_UV.ID, + "basicmachine.slicer.tier.08", + "Ultimate Quantum Slicer", + 8, + MachineType.SLICER.tooltipDescription(), + slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.SlicingMachineUHV.set( + new MTEBasicMachineWithRecipe( + SLICING_MACHINE_UHV.ID, + "basicmachine.slicer.tier.09", + "Epic Quantum Slicer", + 9, + MachineType.SLICER.tooltipDescription(), + slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.SlicingMachineUEV.set( + new MTEBasicMachineWithRecipe( + SLICING_MACHINE_UEV.ID, + "basicmachine.slicer.tier.10", + "Epic Quantum Slicer II", + 10, + MachineType.SLICER.tooltipDescription(), + slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.SlicingMachineUIV.set( + new MTEBasicMachineWithRecipe( + SLICING_MACHINE_UIV.ID, + "basicmachine.slicer.tier.11", + "Epic Quantum Slicer III", + 11, + MachineType.SLICER.tooltipDescription(), + slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + ItemList.SlicingMachineUMV.set( + new MTEBasicMachineWithRecipe( + SLICING_MACHINE_UMV.ID, + "basicmachine.slicer.tier.12", + "Epic Quantum Slicer IV", + 12, + MachineType.SLICER.tooltipDescription(), + slicerRecipes, + 2, + 1, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "SLICER", + null).getStackForm(1L)); + + } + + private void registerThermalCentrifuge() { + ItemList.Machine_LV_ThermalCentrifuge.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_LV.ID, + "basicmachine.thermalcentrifuge.tier.01", + "Basic Thermal Centrifuge", + 1, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + RecipeMaps.thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_MV_ThermalCentrifuge.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_MV.ID, + "basicmachine.thermalcentrifuge.tier.02", + "Advanced Thermal Centrifuge", + 2, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + RecipeMaps.thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_HV_ThermalCentrifuge.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_HV.ID, + "basicmachine.thermalcentrifuge.tier.03", + "Advanced Thermal Centrifuge II", + 3, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + RecipeMaps.thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_EV_ThermalCentrifuge.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_EV.ID, + "basicmachine.thermalcentrifuge.tier.04", + "Advanced Thermal Centrifuge III", + 4, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + RecipeMaps.thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_IV_ThermalCentrifuge.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_IV.ID, + "basicmachine.thermalcentrifuge.tier.05", + "Blaze Sweatshop T-6350", + 5, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + RecipeMaps.thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.ThermalCentrifugeLuV.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_LuV.ID, + "basicmachine.thermalcentrifuge.tier.06", + "Elite Thermal Centrifuge", + 6, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.ThermalCentrifugeZPM.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_ZPM.ID, + "basicmachine.thermalcentrifuge.tier.07", + "Elite Thermal Centrifuge II", + 7, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.ThermalCentrifugeUV.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_UV.ID, + "basicmachine.thermalcentrifuge.tier.08", + "Ultimate Fire Cyclone", + 8, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.ThermalCentrifugeUHV.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_UHV.ID, + "basicmachine.thermalcentrifuge.tier.09", + "Epic Fire Cyclone", + 9, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.ThermalCentrifugeUEV.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_UEV.ID, + "basicmachine.thermalcentrifuge.tier.10", + "Epic Fire Cyclone II", + 10, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.ThermalCentrifugeUIV.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_UIV.ID, + "basicmachine.thermalcentrifuge.tier.11", + "Epic Fire Cyclone III", + 11, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.ThermalCentrifugeUMV.set( + new MTEBasicMachineWithRecipe( + THERMAL_CENTRIFUGE_UMV.ID, + "basicmachine.thermalcentrifuge.tier.12", + "Epic Fire Cyclone IV", + 12, + MachineType.THERMAL_CENTRIFUGE.tooltipDescription(), + thermalCentrifugeRecipes, + 1, + 3, + false, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "THERMAL_CENTRIFUGE", + null).getStackForm(1L)); + } + + private void registerWiremill() { + ItemList.Machine_LV_Wiremill.set( + new MTEBasicMachineWithRecipe( + WIREMILL_LV.ID, + "basicmachine.wiremill.tier.01", + "Basic Wiremill", + 1, + MachineType.WIREMILL.tooltipDescription(), + RecipeMaps.wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.Machine_MV_Wiremill.set( + new MTEBasicMachineWithRecipe( + WIREMILL_MV.ID, + "basicmachine.wiremill.tier.02", + "Advanced Wiremill", + 2, + MachineType.WIREMILL.tooltipDescription(), + RecipeMaps.wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.Machine_HV_Wiremill.set( + new MTEBasicMachineWithRecipe( + WIREMILL_HV.ID, + "basicmachine.wiremill.tier.03", + "Advanced Wiremill II", + 3, + MachineType.WIREMILL.tooltipDescription(), + RecipeMaps.wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.Machine_EV_Wiremill.set( + new MTEBasicMachineWithRecipe( + WIREMILL_EV.ID, + "basicmachine.wiremill.tier.04", + "Advanced Wiremill III", + 4, + MachineType.WIREMILL.tooltipDescription(), + RecipeMaps.wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.Machine_IV_Wiremill.set( + new MTEBasicMachineWithRecipe( + WIREMILL_IV.ID, + "basicmachine.wiremill.tier.05", + "Advanced Wiremill IV", + 5, + MachineType.WIREMILL.tooltipDescription(), + RecipeMaps.wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.WiremillLuV.set( + new MTEBasicMachineWithRecipe( + WIREMILL_LuV.ID, + "basicmachine.wiremill.tier.06", + "Elite Wiremill", + 6, + MachineType.WIREMILL.tooltipDescription(), + wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.WiremillZPM.set( + new MTEBasicMachineWithRecipe( + WIREMILL_ZPM.ID, + "basicmachine.wiremill.tier.07", + "Elite Wiremill II", + 7, + MachineType.WIREMILL.tooltipDescription(), + wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.WiremillUV.set( + new MTEBasicMachineWithRecipe( + WIREMILL_UV.ID, + "basicmachine.wiremill.tier.08", + "Ultimate Wire Transfigurator", + 8, + MachineType.WIREMILL.tooltipDescription(), + wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.WiremillUHV.set( + new MTEBasicMachineWithRecipe( + WIREMILL_UHV.ID, + "basicmachine.wiremill.tier.09", + "Epic Wire Transfigurator", + 9, + MachineType.WIREMILL.tooltipDescription(), + wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.WiremillUEV.set( + new MTEBasicMachineWithRecipe( + WIREMILL_UEV.ID, + "basicmachine.wiremill.tier.10", + "Epic Wire Transfigurator II", + 10, + MachineType.WIREMILL.tooltipDescription(), + wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.WiremillUIV.set( + new MTEBasicMachineWithRecipe( + WIREMILL_UIV.ID, + "basicmachine.wiremill.tier.11", + "Epic Wire Transfigurator III", + 11, + MachineType.WIREMILL.tooltipDescription(), + wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + ItemList.WiremillUMV.set( + new MTEBasicMachineWithRecipe( + WIREMILL_UMV.ID, + "basicmachine.wiremill.tier.12", + "Epic Wire Transfigurator IV", + 12, + MachineType.WIREMILL.tooltipDescription(), + wiremillRecipes, + 2, + 1, + false, + SoundResource.IC2_MACHINES_RECYCLER_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "WIREMILL", + null).getStackForm(1L)); + + } + + private void registerArcFurnace() { + ItemList.Machine_LV_ArcFurnace.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_LV.ID, + "basicmachine.arcfurnace.tier.01", + "Basic Arc Furnace", + 1, + MachineType.ARC_FURNACE.tooltipDescription(), + RecipeMaps.arcFurnaceRecipes, + 1, + 4, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_MV_ArcFurnace.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_MV.ID, + "basicmachine.arcfurnace.tier.02", + "Advanced Arc Furnace", + 2, + MachineType.ARC_FURNACE.tooltipDescription(), + RecipeMaps.arcFurnaceRecipes, + 1, + 4, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_HV_ArcFurnace.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_HV.ID, + "basicmachine.arcfurnace.tier.03", + "Advanced Arc Furnace II", + 3, + MachineType.ARC_FURNACE.tooltipDescription(), + RecipeMaps.arcFurnaceRecipes, + 1, + 4, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_EV_ArcFurnace.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_EV.ID, + "basicmachine.arcfurnace.tier.04", + "Advanced Arc Furnace III", + 4, + MachineType.ARC_FURNACE.tooltipDescription(), + RecipeMaps.arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_IV_ArcFurnace.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_IV.ID, + "basicmachine.arcfurnace.tier.05", + "Advanced Arc Furnace IV", + 5, + MachineType.ARC_FURNACE.tooltipDescription(), + RecipeMaps.arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.ArcFurnaceLuV.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_LuV.ID, + "basicmachine.arcfurnace.tier.06", + "Elite Arc Furnace", + 6, + MachineType.ARC_FURNACE.tooltipDescription(), + arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.ArcFurnaceZPM.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_ZPM.ID, + "basicmachine.arcfurnace.tier.07", + "Elite Arc Furnace II", + 7, + MachineType.ARC_FURNACE.tooltipDescription(), + arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.ArcFurnaceUV.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_UV.ID, + "basicmachine.arcfurnace.tier.08", + "Ultimate Short Circuit Heater", + 8, + MachineType.ARC_FURNACE.tooltipDescription(), + arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.ArcFurnaceUHV.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_UHV.ID, + "basicmachine.arcfurnace.tier.09", + "Epic Short Circuit Heater", + 9, + MachineType.ARC_FURNACE.tooltipDescription(), + arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.ArcFurnaceUEV.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_UEV.ID, + "basicmachine.arcfurnace.tier.10", + "Epic Short Circuit Heater II", + 10, + MachineType.ARC_FURNACE.tooltipDescription(), + arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.ArcFurnaceUIV.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_UIV.ID, + "basicmachine.arcfurnace.tier.11", + "Epic Short Circuit Heater III", + 11, + MachineType.ARC_FURNACE.tooltipDescription(), + arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.ArcFurnaceUMV.set( + new MTEBasicMachineWithRecipe( + ARC_FURNACE_UMV.ID, + "basicmachine.arcfurnace.tier.12", + "Epic Short Circuit Heater IV", + 12, + MachineType.ARC_FURNACE.tooltipDescription(), + arcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "ARC_FURNACE", + null).getStackForm(1L)); + + } + + private void registerCentrifuge() { + ItemList.Machine_LV_Centrifuge.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_LV.ID, + "basicmachine.centrifuge.tier.01", + "Basic Centrifuge", + 1, + MachineType.CENTRIFUGE.tooltipDescription(), + RecipeMaps.centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_MV_Centrifuge.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_MV.ID, + "basicmachine.centrifuge.tier.02", + "Advanced Centrifuge", + 2, + MachineType.CENTRIFUGE.tooltipDescription(), + RecipeMaps.centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_HV_Centrifuge.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_HV.ID, + "basicmachine.centrifuge.tier.03", + "Turbo Centrifuge", + 3, + MachineType.CENTRIFUGE.tooltipDescription(), + RecipeMaps.centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_EV_Centrifuge.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_EV.ID, + "basicmachine.centrifuge.tier.04", + "Molecular Separator", + 4, + MachineType.CENTRIFUGE.tooltipDescription(), + RecipeMaps.centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.Machine_IV_Centrifuge.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_IV.ID, + "basicmachine.centrifuge.tier.05", + "Molecular Cyclone", + 5, + MachineType.CENTRIFUGE.tooltipDescription(), + RecipeMaps.centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.CentrifugeLuV.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_LuV.ID, + "basicmachine.centrifuge.tier.06", + "Elite Centrifuge", + 6, + MachineType.CENTRIFUGE.tooltipDescription(), + centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.CentrifugeZPM.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_ZPM.ID, + "basicmachine.centrifuge.tier.07", + "Elite Centrifuge II", + 7, + MachineType.CENTRIFUGE.tooltipDescription(), + centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.CentrifugeUV.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_UV.ID, + "basicmachine.centrifuge.tier.08", + "Ultimate Molecular Tornado", + 8, + MachineType.CENTRIFUGE.tooltipDescription(), + centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.CentrifugeUHV.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_UHV.ID, + "basicmachine.centrifuge.tier.09", + "Epic Molecular Tornado", + 9, + MachineType.CENTRIFUGE.tooltipDescription(), + centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.CentrifugeUEV.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_UEV.ID, + "basicmachine.centrifuge.tier.10", + "Epic Molecular Tornado II", + 10, + MachineType.CENTRIFUGE.tooltipDescription(), + centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.CentrifugeUIV.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_UIV.ID, + "basicmachine.centrifuge.tier.11", + "Epic Molecular Tornado III", + 11, + MachineType.CENTRIFUGE.tooltipDescription(), + centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + ItemList.CentrifugeUMV.set( + new MTEBasicMachineWithRecipe( + CENTRIFUGE_UMV.ID, + "basicmachine.centrifuge.tier.12", + "Epic Molecular Tornado IV", + 12, + MachineType.CENTRIFUGE.tooltipDescription(), + centrifugeRecipes, + 2, + 6, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CENTRIFUGE", + null).getStackForm(1L)); + + } + + private void registerPlasmaArcFurnace() { + ItemList.Machine_LV_PlasmaArcFurnace.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_LV.ID, + "basicmachine.plasmaarcfurnace.tier.01", + "Basic Plasma Arc Furnace", + 1, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + RecipeMaps.plasmaArcFurnaceRecipes, + 1, + 4, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_MV_PlasmaArcFurnace.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_MV.ID, + "basicmachine.plasmaarcfurnace.tier.02", + "Advanced Plasma Arc Furnace", + 2, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + RecipeMaps.plasmaArcFurnaceRecipes, + 1, + 4, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_HV_PlasmaArcFurnace.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_HV.ID, + "basicmachine.plasmaarcfurnace.tier.03", + "Advanced Plasma Arc Furnace II", + 3, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + RecipeMaps.plasmaArcFurnaceRecipes, + 1, + 4, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_EV_PlasmaArcFurnace.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_EV.ID, + "basicmachine.plasmaarcfurnace.tier.04", + "Advanced Plasma Arc Furnace III", + 4, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + RecipeMaps.plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.Machine_IV_PlasmaArcFurnace.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_IV.ID, + "basicmachine.plasmaarcfurnace.tier.05", + "Advanced Plasma Arc Furnace IV", + 5, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + RecipeMaps.plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.PlasmaArcFurnaceLuV.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_LuV.ID, + "basicmachine.plasmaarcfurnace.tier.06", + "Elite Plasma Arc Furnace", + 6, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.PlasmaArcFurnaceZPM.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_ZPM.ID, + "basicmachine.plasmaarcfurnace.tier.07", + "Elite Plasma Arc Furnace II", + 7, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.PlasmaArcFurnaceUV.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_UV.ID, + "basicmachine.plasmaarcfurnace.tier.08", + "Ultimate Plasma Discharge Heater", + 8, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.PlasmaArcFurnaceUHV.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_UHV.ID, + "basicmachine.plasmaarcfurnace.tier.09", + "Epic Plasma Discharge Heater", + 9, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.PlasmaArcFurnaceUEV.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_UEV.ID, + "basicmachine.plasmaarcfurnace.tier.10", + "Epic Plasma Discharge Heater II", + 10, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.PlasmaArcFurnaceUIV.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_UIV.ID, + "basicmachine.plasmaarcfurnace.tier.11", + "Epic Plasma Discharge Heater III", + 11, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + + ItemList.PlasmaArcFurnaceUMV.set( + new MTEBasicMachineWithRecipe( + PLASMA_ARC_FURNACE_UMV.ID, + "basicmachine.plasmaarcfurnace.tier.12", + "Epic Plasma Discharge Heater IV", + 12, + MachineType.PLASMA_ARC_FURNACE.tooltipDescription(), + plasmaArcFurnaceRecipes, + 1, + 9, + true, + SoundResource.IC2_MACHINES_INDUCTION_LOOP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "PLASMA_ARC_FURNACE", + null).getStackForm(1L)); + } + + private void registerCanningMachine() { + ItemList.Machine_LV_Canner.set( + new MTEBasicMachineWithRecipe( + CANNER_LV.ID, + "basicmachine.canner.tier.01", + "Basic Canning Machine", + 1, + MachineType.CANNER.tooltipDescription(), + RecipeMaps.cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.Machine_MV_Canner.set( + new MTEBasicMachineWithRecipe( + CANNER_MV.ID, + "basicmachine.canner.tier.02", + "Advanced Canning Machine", + 2, + MachineType.CANNER.tooltipDescription(), + RecipeMaps.cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.Machine_HV_Canner.set( + new MTEBasicMachineWithRecipe( + CANNER_HV.ID, + "basicmachine.canner.tier.03", + "Advanced Canning Machine II", + 3, + MachineType.CANNER.tooltipDescription(), + RecipeMaps.cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.Machine_EV_Canner.set( + new MTEBasicMachineWithRecipe( + CANNER_EV.ID, + "basicmachine.canner.tier.04", + "Advanced Canning Machine III", + 4, + MachineType.CANNER.tooltipDescription(), + RecipeMaps.cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.Machine_IV_Canner.set( + new MTEBasicMachineWithRecipe( + CANNER_IV.ID, + "basicmachine.canner.tier.05", + "Advanced Canning Machine IV", + 5, + MachineType.CANNER.tooltipDescription(), + RecipeMaps.cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.CanningMachineLuV.set( + new MTEBasicMachineWithRecipe( + CANNING_MACHINE_LuV.ID, + "basicmachine.canner.tier.06", + "Elite Canning Machine", + 6, + MachineType.CANNER.tooltipDescription(), + cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.CanningMachineZPM.set( + new MTEBasicMachineWithRecipe( + CANNING_MACHINE_ZPM.ID, + "basicmachine.canner.tier.07", + "Elite Canning Machine II", + 7, + MachineType.CANNER.tooltipDescription(), + cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.CanningMachineUV.set( + new MTEBasicMachineWithRecipe( + CANNING_MACHINE_UV.ID, + "basicmachine.canner.tier.08", + "Ultimate Can Operator", + 8, + MachineType.CANNER.tooltipDescription(), + cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.CanningMachineUHV.set( + new MTEBasicMachineWithRecipe( + CANNING_MACHINE_UHV.ID, + "basicmachine.canner.tier.09", + "Epic Can Operator", + 9, + MachineType.CANNER.tooltipDescription(), + cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.CanningMachineUEV.set( + new MTEBasicMachineWithRecipe( + CANNING_MACHINE_UEV.ID, + "basicmachine.canner.tier.10", + "Epic Can Operator II", + 10, + MachineType.CANNER.tooltipDescription(), + cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.CanningMachineUIV.set( + new MTEBasicMachineWithRecipe( + CANNING_MACHINE_UIV.ID, + "basicmachine.canner.tier.11", + "Epic Can Operator III", + 11, + MachineType.CANNER.tooltipDescription(), + cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + + ItemList.CanningMachineUMV.set( + new MTEBasicMachineWithRecipe( + CANNING_MACHINE_UMV.ID, + "basicmachine.canner.tier.12", + "Epic Can Operator IV", + 12, + MachineType.CANNER.tooltipDescription(), + cannerRecipes, + 2, + 2, + false, + SoundResource.IC2_MACHINES_EXTRACTOR_OP, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CANNER", + null).getStackForm(1L)); + } + + private static void registerDynamoHatch() { + ItemList.Hatch_Dynamo_ULV.set( + new MTEHatchDynamo(DYNAMO_HATCH_ULV.ID, "hatch.dynamo.tier.00", "ULV Dynamo Hatch", 0).getStackForm(1L)); + ItemList.Hatch_Dynamo_LV + .set(new MTEHatchDynamo(DYNAMO_HATCH_LV.ID, "hatch.dynamo.tier.01", "LV Dynamo Hatch", 1).getStackForm(1L)); + ItemList.Hatch_Dynamo_MV + .set(new MTEHatchDynamo(DYNAMO_HATCH_MV.ID, "hatch.dynamo.tier.02", "MV Dynamo Hatch", 2).getStackForm(1L)); + ItemList.Hatch_Dynamo_HV + .set(new MTEHatchDynamo(DYNAMO_HATCH_HV.ID, "hatch.dynamo.tier.03", "HV Dynamo Hatch", 3).getStackForm(1L)); + ItemList.Hatch_Dynamo_EV + .set(new MTEHatchDynamo(DYNAMO_HATCH_EV.ID, "hatch.dynamo.tier.04", "EV Dynamo Hatch", 4).getStackForm(1L)); + ItemList.Hatch_Dynamo_IV + .set(new MTEHatchDynamo(DYNAMO_HATCH_IV.ID, "hatch.dynamo.tier.05", "IV Dynamo Hatch", 5).getStackForm(1L)); + ItemList.Hatch_Dynamo_LuV.set( + new MTEHatchDynamo(DYNAMO_HATCH_LuV.ID, "hatch.dynamo.tier.06", "LuV Dynamo Hatch", 6).getStackForm(1L)); + ItemList.Hatch_Dynamo_ZPM.set( + new MTEHatchDynamo(DYNAMO_HATCH_ZPM.ID, "hatch.dynamo.tier.07", "ZPM Dynamo Hatch", 7).getStackForm(1L)); + ItemList.Hatch_Dynamo_UV + .set(new MTEHatchDynamo(DYNAMO_HATCH_UV.ID, "hatch.dynamo.tier.08", "UV Dynamo Hatch", 8).getStackForm(1L)); + ItemList.Hatch_Dynamo_UHV.set( + new MTEHatchDynamo(DYNAMO_HATCH_UHV.ID, "hatch.dynamo.tier.09", "UHV Dynamo Hatch", 9).getStackForm(1L)); + ItemList.Hatch_Dynamo_UEV.set( + new MTEHatchDynamo(DYNAMO_HATCH_UEV.ID, "hatch.dynamo.tier.10", "UEV Dynamo Hatch", 10).getStackForm(1L)); + + ItemList.Hatch_Dynamo_UIV.set( + new MTEHatchDynamo(DYNAMO_HATCH_UIV.ID, "hatch.dynamo.tier.11", "UIV Dynamo Hatch", 11).getStackForm(1L)); + + ItemList.Hatch_Dynamo_UMV.set( + new MTEHatchDynamo(DYNAMO_HATCH_UMV.ID, "hatch.dynamo.tier.12", "UMV Dynamo Hatch", 12).getStackForm(1L)); + + ItemList.Hatch_Dynamo_UXV.set( + new MTEHatchDynamo(DYNAMO_HATCH_UXV.ID, "hatch.dynamo.tier.13", "UXV Dynamo Hatch", 13).getStackForm(1L)); + } + + private static void registerEnergyHatch() { + ItemList.Hatch_Energy_ULV.set( + new MTEHatchEnergy(ENERGY_HATCH_ULV.ID, "hatch.energy.tier.00", "ULV Energy Hatch", 0).getStackForm(1L)); + ItemList.Hatch_Energy_LV + .set(new MTEHatchEnergy(ENERGY_HATCH_LV.ID, "hatch.energy.tier.01", "LV Energy Hatch", 1).getStackForm(1L)); + ItemList.Hatch_Energy_MV + .set(new MTEHatchEnergy(ENERGY_HATCH_MV.ID, "hatch.energy.tier.02", "MV Energy Hatch", 2).getStackForm(1L)); + ItemList.Hatch_Energy_HV + .set(new MTEHatchEnergy(ENERGY_HATCH_HV.ID, "hatch.energy.tier.03", "HV Energy Hatch", 3).getStackForm(1L)); + ItemList.Hatch_Energy_EV + .set(new MTEHatchEnergy(ENERGY_HATCH_EV.ID, "hatch.energy.tier.04", "EV Energy Hatch", 4).getStackForm(1L)); + ItemList.Hatch_Energy_IV + .set(new MTEHatchEnergy(ENERGY_HATCH_IV.ID, "hatch.energy.tier.05", "IV Energy Hatch", 5).getStackForm(1L)); + ItemList.Hatch_Energy_LuV.set( + new MTEHatchEnergy(ENERGY_HATCH_LuV.ID, "hatch.energy.tier.06", "LuV Energy Hatch", 6).getStackForm(1L)); + ItemList.Hatch_Energy_ZPM.set( + new MTEHatchEnergy(ENERGY_HATCH_ZPM.ID, "hatch.energy.tier.07", "ZPM Energy Hatch", 7).getStackForm(1L)); + ItemList.Hatch_Energy_UV + .set(new MTEHatchEnergy(ENERGY_HATCH_UV.ID, "hatch.energy.tier.08", "UV Energy Hatch", 8).getStackForm(1L)); + ItemList.Hatch_Energy_UHV.set( + new MTEHatchEnergy(ENERGY_HATCH_UHV.ID, "hatch.energy.tier.09", "UHV Energy Hatch", 9).getStackForm(1L)); + ItemList.Hatch_Energy_UEV.set( + new MTEHatchEnergy(ENERGY_HATCH_UEV.ID, "hatch.energy.tier.10", "UEV Energy Hatch", 10).getStackForm(1L)); + + ItemList.Hatch_Energy_UIV.set( + new MTEHatchEnergy(ENERGY_HATCH_UIV.ID, "hatch.energy.tier.11", "UIV Energy Hatch", 11).getStackForm(1L)); + + ItemList.Hatch_Energy_UMV.set( + new MTEHatchEnergy(ENERGY_HATCH_UMV.ID, "hatch.energy.tier.12", "UMV Energy Hatch", 12).getStackForm(1L)); + + ItemList.Hatch_Energy_UXV.set( + new MTEHatchEnergy(ENERGY_HATCH_UXV.ID, "hatch.energy.tier.13", "UXV Energy Hatch", 13).getStackForm(1L)); + } + + private static void registerInputHatch() { + ItemList.Hatch_Input_ULV + .set(new MTEHatchInput(INPUT_HATCH_ULV.ID, "hatch.input.tier.00", "Input Hatch (ULV)", 0).getStackForm(1L)); + ItemList.Hatch_Input_LV + .set(new MTEHatchInput(INPUT_HATCH_LV.ID, "hatch.input.tier.01", "Input Hatch (LV)", 1).getStackForm(1L)); + ItemList.Hatch_Input_MV + .set(new MTEHatchInput(INPUT_HATCH_MV.ID, "hatch.input.tier.02", "Input Hatch (MV)", 2).getStackForm(1L)); + ItemList.Hatch_Input_HV + .set(new MTEHatchInput(INPUT_HATCH_HV.ID, "hatch.input.tier.03", "Input Hatch (HV)", 3).getStackForm(1L)); + ItemList.Hatch_Input_EV + .set(new MTEHatchInput(INPUT_HATCH_EV.ID, "hatch.input.tier.04", "Input Hatch (EV)", 4).getStackForm(1L)); + ItemList.Hatch_Input_IV + .set(new MTEHatchInput(INPUT_HATCH_IV.ID, "hatch.input.tier.05", "Input Hatch (IV)", 5).getStackForm(1L)); + ItemList.Hatch_Input_LuV + .set(new MTEHatchInput(INPUT_HATCH_LuV.ID, "hatch.input.tier.06", "Input Hatch (LuV)", 6).getStackForm(1L)); + ItemList.Hatch_Input_ZPM + .set(new MTEHatchInput(INPUT_HATCH_ZPM.ID, "hatch.input.tier.07", "Input Hatch (ZPM)", 7).getStackForm(1L)); + ItemList.Hatch_Input_UV + .set(new MTEHatchInput(INPUT_HATCH_UV.ID, "hatch.input.tier.08", "Input Hatch (UV)", 8).getStackForm(1L)); + ItemList.Hatch_Input_UHV + .set(new MTEHatchInput(INPUT_HATCH_UHV.ID, "hatch.input.tier.09", "Input Hatch (UHV)", 9).getStackForm(1L)); + ItemList.Hatch_Input_UEV.set( + new MTEHatchInput(INPUT_HATCH_UEV.ID, "hatch.input.tier.10", "Input Hatch (UEV)", 10).getStackForm(1L)); + ItemList.Hatch_Input_UIV.set( + new MTEHatchInput(INPUT_HATCH_UIV.ID, "hatch.input.tier.11", "Input Hatch (UIV)", 11).getStackForm(1L)); + ItemList.Hatch_Input_UMV.set( + new MTEHatchInput(INPUT_HATCH_UMV.ID, "hatch.input.tier.12", "Input Hatch (UMV)", 12).getStackForm(1L)); + ItemList.Hatch_Input_UXV.set( + new MTEHatchInput(INPUT_HATCH_UXV.ID, "hatch.input.tier.13", "Input Hatch (UXV)", 13).getStackForm(1L)); + ItemList.Hatch_Input_MAX.set( + new MTEHatchInput(INPUT_HATCH_MAX.ID, "hatch.input.tier.14", "Input Hatch (MAX)", 14).getStackForm(1L)); + } + + private static void registerQuadrupleInputHatch() { + ItemList.Hatch_Input_Multi_2x2_EV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_EV.ID, + 4, + "hatch.multi.input.tier.01", + "Quadruple Input Hatch (EV)", + 4).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_IV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_IV.ID, + 4, + "hatch.multi.input.tier.02", + "Quadruple Input Hatch (IV)", + 5).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_LuV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_LuV.ID, + 4, + "hatch.multi.input.tier.03", + "Quadruple Input Hatch (LuV)", + 6).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_ZPM.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_ZPM.ID, + 4, + "hatch.multi.input.tier.04", + "Quadruple Input Hatch (ZPM)", + 7).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_UV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_UV.ID, + 4, + "hatch.multi.input.tier.05", + "Quadruple Input Hatch (UV)", + 8).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_UHV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_UHV.ID, + 4, + "hatch.multi.input.tier.06", + "Quadruple Input Hatch (UHV)", + 9).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_UEV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_UEV.ID, + 4, + "hatch.multi.input.tier.07", + "Quadruple Input Hatch (UEV)", + 10).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_UIV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_UIV.ID, + 4, + "hatch.multi.input.tier.08", + "Quadruple Input Hatch (UIV)", + 11).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_UMV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_UMV.ID, + 4, + "hatch.multi.input.tier.09", + "Quadruple Input Hatch (UMV)", + 12).getStackForm(1L)); + ItemList.Hatch_Input_Multi_2x2_UXV.set( + new MTEHatchMultiInput( + QUADRUPLE_INPUT_HATCHES_UXV.ID, + 4, + "hatch.multi.input.tier.10", + "Quadruple Input Hatch (UXV)", + 13).getStackForm(1L)); + + ItemList.Hatch_Input_Multi_2x2_Humongous.set( + new MTEHatchQuadrupleHumongous( + QUADRUPLE_INPUT_HATCHES_MAX.ID, + 4, + "hatch.multi.input.tier.11", + "Humongous Quadruple Input Hatch").getStackForm(1L)); + } + + private static void registerOutputHatch() { + ItemList.Hatch_Output_ULV.set( + new MTEHatchOutput(OUTPUT_HATCH_ULV.ID, "hatch.output.tier.00", "Output Hatch (ULV)", 0).getStackForm(1L)); + ItemList.Hatch_Output_LV.set( + new MTEHatchOutput(OUTPUT_HATCH_LV.ID, "hatch.output.tier.01", "Output Hatch (LV)", 1).getStackForm(1L)); + ItemList.Hatch_Output_MV.set( + new MTEHatchOutput(OUTPUT_HATCH_MV.ID, "hatch.output.tier.02", "Output Hatch (MV)", 2).getStackForm(1L)); + ItemList.Hatch_Output_HV.set( + new MTEHatchOutput(OUTPUT_HATCH_HV.ID, "hatch.output.tier.03", "Output Hatch (HV)", 3).getStackForm(1L)); + ItemList.Hatch_Output_EV.set( + new MTEHatchOutput(OUTPUT_HATCH_EV.ID, "hatch.output.tier.04", "Output Hatch (EV)", 4).getStackForm(1L)); + ItemList.Hatch_Output_IV.set( + new MTEHatchOutput(OUTPUT_HATCH_IV.ID, "hatch.output.tier.05", "Output Hatch (IV)", 5).getStackForm(1L)); + ItemList.Hatch_Output_LuV.set( + new MTEHatchOutput(OUTPUT_HATCH_LuV.ID, "hatch.output.tier.06", "Output Hatch (LuV)", 6).getStackForm(1L)); + ItemList.Hatch_Output_ZPM.set( + new MTEHatchOutput(OUTPUT_HATCH_ZPM.ID, "hatch.output.tier.07", "Output Hatch (ZPM)", 7).getStackForm(1L)); + ItemList.Hatch_Output_UV.set( + new MTEHatchOutput(OUTPUT_HATCH_UV.ID, "hatch.output.tier.08", "Output Hatch (UV)", 8).getStackForm(1L)); + ItemList.Hatch_Output_UHV.set( + new MTEHatchOutput(OUTPUT_HATCH_UHV.ID, "hatch.output.tier.09", "Output Hatch (UHV)", 9).getStackForm(1L)); + ItemList.Hatch_Output_UEV.set( + new MTEHatchOutput(OUTPUT_HATCH_UEV.ID, "hatch.output.tier.10", "Output Hatch (UEV)", 10).getStackForm(1L)); + ItemList.Hatch_Output_UIV.set( + new MTEHatchOutput(OUTPUT_HATCH_UIV.ID, "hatch.output.tier.11", "Output Hatch (UIV)", 11).getStackForm(1L)); + ItemList.Hatch_Output_UMV.set( + new MTEHatchOutput(OUTPUT_HATCH_UMV.ID, "hatch.output.tier.12", "Output Hatch (UMV)", 12).getStackForm(1L)); + ItemList.Hatch_Output_UXV.set( + new MTEHatchOutput(OUTPUT_HATCH_UXV.ID, "hatch.output.tier.13", "Output Hatch (UXV)", 13).getStackForm(1L)); + ItemList.Hatch_Output_MAX.set( + new MTEHatchOutput(OUTPUT_HATCH_MAX.ID, "hatch.output.tier.14", "Output Hatch (MAX)", 14).getStackForm(1L)); + } + + private static void registerQuantumTank() { + ItemList.Quantum_Tank_LV + .set(new MTEQuantumTank(QUANTUM_TANK_LV.ID, "quantum.tank.tier.06", "Quantum Tank I", 6).getStackForm(1L)); + ItemList.Quantum_Tank_MV + .set(new MTEQuantumTank(QUANTUM_TANK_MV.ID, "quantum.tank.tier.07", "Quantum Tank II", 7).getStackForm(1L)); + ItemList.Quantum_Tank_HV.set( + new MTEQuantumTank(QUANTUM_TANK_HV.ID, "quantum.tank.tier.08", "Quantum Tank III", 8).getStackForm(1L)); + ItemList.Quantum_Tank_EV + .set(new MTEQuantumTank(QUANTUM_TANK_EV.ID, "quantum.tank.tier.09", "Quantum Tank IV", 9).getStackForm(1L)); + ItemList.Quantum_Tank_IV + .set(new MTEQuantumTank(QUANTUM_TANK_IV.ID, "quantum.tank.tier.10", "Quantum Tank V", 10).getStackForm(1L)); + } + + private static void registerQuantumChest() { + ItemList.Quantum_Chest_LV.set( + new MTEQuantumChest(QUANTUM_CHEST_LV.ID, "quantum.chest.tier.06", "Quantum Chest I", 6).getStackForm(1L)); + ItemList.Quantum_Chest_MV.set( + new MTEQuantumChest(QUANTUM_CHEST_MV.ID, "quantum.chest.tier.07", "Quantum Chest II", 7).getStackForm(1L)); + ItemList.Quantum_Chest_HV.set( + new MTEQuantumChest(QUANTUM_CHEST_HV.ID, "quantum.chest.tier.08", "Quantum Chest III", 8).getStackForm(1L)); + ItemList.Quantum_Chest_EV.set( + new MTEQuantumChest(QUANTUM_CHEST_EV.ID, "quantum.chest.tier.09", "Quantum Chest IV", 9).getStackForm(1L)); + ItemList.Quantum_Chest_IV.set( + new MTEQuantumChest(QUANTUM_CHEST_IV.ID, "quantum.chest.tier.10", "Quantum Chest V", 10).getStackForm(1L)); + } + + private static void registerSuperTank() { + ItemList.Super_Tank_LV + .set(new MTESuperTank(SUPER_TANK_LV.ID, "super.tank.tier.01", "Super Tank I", 1).getStackForm(1L)); + ItemList.Super_Tank_MV + .set(new MTESuperTank(SUPER_TANK_MV.ID, "super.tank.tier.02", "Super Tank II", 2).getStackForm(1L)); + ItemList.Super_Tank_HV + .set(new MTESuperTank(SUPER_TANK_HV.ID, "super.tank.tier.03", "Super Tank III", 3).getStackForm(1L)); + ItemList.Super_Tank_EV + .set(new MTESuperTank(SUPER_TANK_EV.ID, "super.tank.tier.04", "Super Tank IV", 4).getStackForm(1L)); + ItemList.Super_Tank_IV + .set(new MTESuperTank(SUPER_TANK_IV.ID, "super.tank.tier.05", "Super Tank V", 5).getStackForm(1L)); + } + + private static void registerSuperChest() { + ItemList.Super_Chest_LV + .set(new MTESuperChest(SUPER_CHEST_LV.ID, "super.chest.tier.01", "Super Chest I", 1).getStackForm(1L)); + ItemList.Super_Chest_MV + .set(new MTESuperChest(SUPER_CHEST_MV.ID, "super.chest.tier.02", "Super Chest II", 2).getStackForm(1L)); + ItemList.Super_Chest_HV + .set(new MTESuperChest(SUPER_CHEST_HV.ID, "super.chest.tier.03", "Super Chest III", 3).getStackForm(1L)); + ItemList.Super_Chest_EV + .set(new MTESuperChest(SUPER_CHEST_EV.ID, "super.chest.tier.04", "Super Chest IV", 4).getStackForm(1L)); + ItemList.Super_Chest_IV + .set(new MTESuperChest(SUPER_CHEST_IV.ID, "super.chest.tier.05", "Super Chest V", 5).getStackForm(1L)); + } + + private static void registerLongDistancePipe() { + ItemList.Long_Distance_Pipeline_Fluid.set( + new MTELongDistancePipelineFluid( + LONG_DISTANCE_PIPELINE_FLUID.ID, + "long.distance.pipeline.fluid", + "Long Distance Fluid Pipeline", + 1).getStackForm(1L)); + ItemList.Long_Distance_Pipeline_Item.set( + new MTELongDistancePipelineItem( + LONG_DISTANCE_PIPELINE_ITEM.ID, + "long.distance.pipeline.item", + "Long Distance Item Pipeline", + 1).getStackForm(1L)); + } + + private static void registerAE2Hatches() { + ItemList.Hatch_Output_Bus_ME + .set(new MTEHatchOutputBusME(OUTPUT_BUS_ME.ID, "hatch.output_bus.me", "Output Bus (ME)").getStackForm(1L)); + ItemList.Hatch_Input_Bus_ME.set( + new MTEHatchInputBusME(INPUT_BUS_ME.ID, false, "hatch.input_bus.me.basic", "Stocking Input Bus (ME)") + .getStackForm(1L)); + ItemList.Hatch_Input_Bus_ME_Advanced.set( + new MTEHatchInputBusME( + INPUT_BUS_ME_ADVANCED.ID, + true, + "hatch.input_bus.me", + "Advanced Stocking Input Bus (ME)").getStackForm(1L)); + ItemList.Hatch_Input_ME.set( + new MTEHatchInputME(INPUT_HATCH_ME.ID, false, "hatch.input.me.basic", "Stocking Input Hatch (ME)") + .getStackForm(1L)); + ItemList.Hatch_Input_ME_Advanced.set( + new MTEHatchInputME( + INPUT_HATCH_ME_ADVANCED.ID, + true, + "hatch.input.me", + "Advanced Stocking Input Hatch (ME)").getStackForm(1L)); + ItemList.Hatch_Output_ME + .set(new MTEHatchOutputME(OUTPUT_HATCH_ME.ID, "hatch.output.me", "Output Hatch (ME)").getStackForm(1L)); + ItemList.Hatch_CraftingInput_Bus_ME.set( + new MTEHatchCraftingInputME( + CRAFTING_INPUT_ME.ID, + "hatch.crafting_input.me", + "Crafting Input Buffer (ME)", + true).getStackForm(1L)); + ItemList.Hatch_CraftingInput_Bus_ME_ItemOnly.set( + new MTEHatchCraftingInputME( + CRAFTING_INPUT_ME_BUS.ID, + "hatch.crafting_input.me.item_only", + "Crafting Input Bus (ME)", + false).getStackForm(1L)); + ItemList.Hatch_CraftingInput_Bus_Slave.set( + new MTEHatchCraftingInputSlave( + CRAFTING_INPUT_SLAVE.ID, + "hatch.crafting_input.proxy", + "Crafting Input Proxy").getStackForm(1L)); + } + + private static void registerMagHatch() { + ItemList.Hatch_Electromagnet + .set(new MTEHatchMagnet(MAG_HATCH.ID, "hatch.mag_hatch", "Electromagnet Housing").getStackForm(1L)); + } + + private static void registerInputBus() { + ItemList.Hatch_Input_Bus_ULV.set( + new MTEHatchInputBus(INPUT_BUS_ULV.ID, "hatch.input_bus.tier.00", "Input Bus (ULV)", 0).getStackForm(1L)); + ItemList.Hatch_Input_Bus_LV.set( + new MTEHatchInputBus(INPUT_BUS_LV.ID, "hatch.input_bus.tier.01", "Input Bus (LV)", 1).getStackForm(1L)); + ItemList.Hatch_Input_Bus_MV.set( + new MTEHatchInputBus(INPUT_BUS_MV.ID, "hatch.input_bus.tier.02", "Input Bus (MV)", 2).getStackForm(1L)); + ItemList.Hatch_Input_Bus_HV.set( + new MTEHatchInputBus(INPUT_BUS_HV.ID, "hatch.input_bus.tier.03", "Input Bus (HV)", 3).getStackForm(1L)); + ItemList.Hatch_Input_Bus_EV.set( + new MTEHatchInputBus(INPUT_BUS_EV.ID, "hatch.input_bus.tier.04", "Input Bus (EV)", 4).getStackForm(1L)); + ItemList.Hatch_Input_Bus_IV.set( + new MTEHatchInputBus(INPUT_BUS_IV.ID, "hatch.input_bus.tier.05", "Input Bus (IV)", 5).getStackForm(1L)); + ItemList.Hatch_Input_Bus_LuV.set( + new MTEHatchInputBus(INPUT_BUS_LuV.ID, "hatch.input_bus.tier.06", "Input Bus (LuV)", 6).getStackForm(1L)); + ItemList.Hatch_Input_Bus_ZPM.set( + new MTEHatchInputBus(INPUT_BUS_ZPM.ID, "hatch.input_bus.tier.07", "Input Bus (ZPM)", 7).getStackForm(1L)); + ItemList.Hatch_Input_Bus_UV.set( + new MTEHatchInputBus(INPUT_BUS_UV.ID, "hatch.input_bus.tier.08", "Input Bus (UV)", 8).getStackForm(1L)); + ItemList.Hatch_Input_Bus_MAX.set( + new MTEHatchInputBus(INPUT_BUS_UHV.ID, "hatch.input_bus.tier.09", "Input Bus (UHV)", 9).getStackForm(1L)); + } + + private static void registerOutputBus() { + ItemList.Hatch_Output_Bus_ULV.set( + new MTEHatchOutputBus(OUTPUT_BUS_ULV.ID, "hatch.output_bus.tier.00", "Output Bus (ULV)", 0) + .getStackForm(1L)); + ItemList.Hatch_Output_Bus_LV.set( + new MTEHatchOutputBus(OUTPUT_BUS_LV.ID, "hatch.output_bus.tier.01", "Output Bus (LV)", 1).getStackForm(1L)); + ItemList.Hatch_Output_Bus_MV.set( + new MTEHatchOutputBus(OUTPUT_BUS_MV.ID, "hatch.output_bus.tier.02", "Output Bus (MV)", 2).getStackForm(1L)); + ItemList.Hatch_Output_Bus_HV.set( + new MTEHatchOutputBus(OUTPUT_BUS_HV.ID, "hatch.output_bus.tier.03", "Output Bus (HV)", 3).getStackForm(1L)); + ItemList.Hatch_Output_Bus_EV.set( + new MTEHatchOutputBus(OUTPUT_BUS_EV.ID, "hatch.output_bus.tier.04", "Output Bus (EV)", 4).getStackForm(1L)); + ItemList.Hatch_Output_Bus_IV.set( + new MTEHatchOutputBus(OUTPUT_BUS_IV.ID, "hatch.output_bus.tier.05", "Output Bus (IV)", 5).getStackForm(1L)); + ItemList.Hatch_Output_Bus_LuV.set( + new MTEHatchOutputBus(OUTPUT_BUS_LuV.ID, "hatch.output_bus.tier.06", "Output Bus (LuV)", 6) + .getStackForm(1L)); + ItemList.Hatch_Output_Bus_ZPM.set( + new MTEHatchOutputBus(OUTPUT_BUS_ZPM.ID, "hatch.output_bus.tier.07", "Output Bus (ZPM)", 7) + .getStackForm(1L)); + ItemList.Hatch_Output_Bus_UV.set( + new MTEHatchOutputBus(OUTPUT_BUS_UV.ID, "hatch.output_bus.tier.08", "Output Bus (UV)", 8).getStackForm(1L)); + ItemList.Hatch_Output_Bus_MAX.set( + new MTEHatchOutputBus(OUTPUT_BUS_UHV.ID, "hatch.output_bus.tier.09", "Output Bus (UHV)", 9) + .getStackForm(1L)); + } + + private static void registerMufflerHatch() { + ItemList.Hatch_Muffler_LV.set( + new MTEHatchMuffler(MUFFLER_HATCH_LV.ID, "hatch.muffler.tier.01", "Muffler Hatch (LV)", 1) + .getStackForm(1L)); + ItemList.Hatch_Muffler_MV.set( + new MTEHatchMuffler(MUFFLER_HATCH_MV.ID, "hatch.muffler.tier.02", "Muffler Hatch (MV)", 2) + .getStackForm(1L)); + ItemList.Hatch_Muffler_HV.set( + new MTEHatchMuffler(MUFFLER_HATCH_HV.ID, "hatch.muffler.tier.03", "Muffler Hatch (HV)", 3) + .getStackForm(1L)); + ItemList.Hatch_Muffler_EV.set( + new MTEHatchMuffler(MUFFLER_HATCH_EV.ID, "hatch.muffler.tier.04", "Muffler Hatch (EV)", 4) + .getStackForm(1L)); + ItemList.Hatch_Muffler_IV.set( + new MTEHatchMuffler(MUFFLER_HATCH_IV.ID, "hatch.muffler.tier.05", "Muffler Hatch (IV)", 5) + .getStackForm(1L)); + ItemList.Hatch_Muffler_LuV.set( + new MTEHatchMuffler(MUFFLER_HATCH_LuV.ID, "hatch.muffler.tier.06", "Muffler Hatch (LuV)", 6) + .getStackForm(1L)); + ItemList.Hatch_Muffler_ZPM.set( + new MTEHatchMuffler(MUFFLER_HATCH_ZPM.ID, "hatch.muffler.tier.07", "Muffler Hatch (ZPM)", 7) + .getStackForm(1L)); + ItemList.Hatch_Muffler_UV.set( + new MTEHatchMuffler(MUFFLER_HATCH_UV.ID, "hatch.muffler.tier.08", "Muffler Hatch (UV)", 8) + .getStackForm(1L)); + ItemList.Hatch_Muffler_MAX.set( + new MTEHatchMuffler(MUFFLER_HATCH_UHV.ID, "hatch.muffler.tier.09", "Muffler Hatch (UHV)", 9) + .getStackForm(1L)); + } + + private static void registerBoiler() { + ItemList.Machine_Bronze_Boiler + .set(new MTEBoilerBronze(SMALL_COAL_BOILER.ID, "boiler.bronze", "Small Coal Boiler").getStackForm(1L)); + ItemList.Machine_Steel_Boiler.set( + new MTEBoilerSteel(HIGH_PRESSURE_COAL_BOILER.ID, "boiler.steel", "High Pressure Coal Boiler") + .getStackForm(1L)); + ItemList.Machine_Steel_Boiler_Lava.set( + new MTEBoilerLava(HIGH_PRESSURE_LAVA_BOILER.ID, "boiler.lava", "High Pressure Lava Boiler") + .getStackForm(1L)); + ItemList.Machine_Bronze_Boiler_Solar + .set(new MTEBoilerSolar(SIMPLE_SOLAR_BOILER.ID, "boiler.solar", "Simple Solar Boiler").getStackForm(1L)); + ItemList.Machine_HP_Solar.set( + new MTEBoilerSolarSteel(HIGH_PRESSURE_SOLAR_BOILER.ID, "boiler.steel.solar", "High Pressure Solar Boiler") + .getStackForm(1L)); + } + + private static void registerBatteryBuffer1x1() { + ItemList.Battery_Buffer_1by1_ULV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_ULV.ID, + "batterybuffer.01.tier.00", + "Ultra Low Voltage Battery Buffer", + 0, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_LV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_LV.ID, + "batterybuffer.01.tier.01", + "Low Voltage Battery Buffer", + 1, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_MV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_MV.ID, + "batterybuffer.01.tier.02", + "Medium Voltage Battery Buffer", + 2, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_HV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_HV.ID, + "batterybuffer.01.tier.03", + "High Voltage Battery Buffer", + 3, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_EV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_EV.ID, + "batterybuffer.01.tier.04", + "Extreme Voltage Battery Buffer", + 4, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_IV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_IV.ID, + "batterybuffer.01.tier.05", + "Insane Voltage Battery Buffer", + 5, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_LuV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_LuV.ID, + "batterybuffer.01.tier.06", + "Ludicrous Voltage Battery Buffer", + 6, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_ZPM.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_ZPM.ID, + "batterybuffer.01.tier.07", + "ZPM Voltage Battery Buffer", + 7, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_UV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_UV.ID, + "batterybuffer.01.tier.08", + "Ultimate Voltage Battery Buffer", + 8, + "", + 1).getStackForm(1L)); + ItemList.Battery_Buffer_1by1_UHV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_UHV.ID, + "batterybuffer.01.tier.09", + "Highly Ultimate Voltage Battery Buffer", + 9, + "", + 1).getStackForm(1L)); + + ItemList.Battery_Buffer_1by1_UEV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_UEV.ID, + "batterybuffer.01.tier.10", + "Extremely Ultimate Battery Buffer", + 10, + "", + 1).getStackForm(1L)); + + ItemList.Battery_Buffer_1by1_UIV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_UIV.ID, + "batterybuffer.01.tier.11", + "Insanely Ultimate Battery Buffer", + 11, + "", + 1).getStackForm(1L)); + + ItemList.Battery_Buffer_1by1_UMV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_UMV.ID, + "batterybuffer.01.tier.12", + "Mega Ultimate Battery Buffer", + 12, + "", + 1).getStackForm(1L)); + + ItemList.Battery_Buffer_1by1_UXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_UXV.ID, + "batterybuffer.01.tier.13", + "Extended Mega Ultimate Battery Buffer", + 13, + "", + 1).getStackForm(1L)); + + ItemList.Battery_Buffer_1by1_MAXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_1_BY_1_MAX.ID, + "batterybuffer.01.tier.14", + "Maximum Battery Buffer", + 14, + "", + 1).getStackForm(1L)); + } + + private static void registerBatteryBuffer2x2() { + ItemList.Battery_Buffer_2by2_ULV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_ULV.ID, + "batterybuffer.04.tier.00", + "Ultra Low Voltage Battery Buffer", + 0, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_LV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_LV.ID, + "batterybuffer.04.tier.01", + "Low Voltage Battery Buffer", + 1, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_MV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_MV.ID, + "batterybuffer.04.tier.02", + "Medium Voltage Battery Buffer", + 2, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_HV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_HV.ID, + "batterybuffer.04.tier.03", + "High Voltage Battery Buffer", + 3, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_EV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_EV.ID, + "batterybuffer.04.tier.04", + "Extreme Voltage Battery Buffer", + 4, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_IV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_IV.ID, + "batterybuffer.04.tier.05", + "Insane Voltage Battery Buffer", + 5, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_LuV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_LuV.ID, + "batterybuffer.04.tier.06", + "Ludicrous Voltage Battery Buffer", + 6, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_ZPM.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_ZPM.ID, + "batterybuffer.04.tier.07", + "ZPM Voltage Battery Buffer", + 7, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_UV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_UV.ID, + "batterybuffer.04.tier.08", + "Ultimate Voltage Battery Buffer", + 8, + "", + 4).getStackForm(1L)); + ItemList.Battery_Buffer_2by2_UHV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_UHV.ID, + "batterybuffer.04.tier.09", + "Highly Ultimate Voltage Battery Buffer", + 9, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Buffer_2by2_UEV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_UEV.ID, + "batterybuffer.04.tier.10", + "Extremely Ultimate Battery Buffer", + 10, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Buffer_2by2_UIV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_UIV.ID, + "batterybuffer.04.tier.11", + "Insanely Ultimate Battery Buffer", + 11, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Buffer_2by2_UMV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_UMV.ID, + "batterybuffer.04.tier.12", + "Mega Ultimate Battery Buffer", + 12, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Buffer_2by2_UXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_UXV.ID, + "batterybuffer.04.tier.13", + "Extended Mega Ultimate Battery Buffer", + 13, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Buffer_2by2_MAXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_2_BY_2_MAX.ID, + "batterybuffer.04.tier.14", + "Maximum Battery Buffer", + 14, + "", + 4).getStackForm(1L)); + } + + private static void registerBatteryBuffer3x3() { + ItemList.Battery_Buffer_3by3_ULV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_ULV.ID, + "batterybuffer.09.tier.00", + "Ultra Low Voltage Battery Buffer", + 0, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_LV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_LV.ID, + "batterybuffer.09.tier.01", + "Low Voltage Battery Buffer", + 1, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_MV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_MV.ID, + "batterybuffer.09.tier.02", + "Medium Voltage Battery Buffer", + 2, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_HV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_HV.ID, + "batterybuffer.09.tier.03", + "High Voltage Battery Buffer", + 3, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_EV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_EV.ID, + "batterybuffer.09.tier.04", + "Extreme Voltage Battery Buffer", + 4, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_IV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_IV.ID, + "batterybuffer.09.tier.05", + "Insane Voltage Battery Buffer", + 5, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_LuV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_LuV.ID, + "batterybuffer.09.tier.06", + "Ludicrous Voltage Battery Buffer", + 6, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_ZPM.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_ZPM.ID, + "batterybuffer.09.tier.07", + "ZPM Voltage Battery Buffer", + 7, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_UV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_UV.ID, + "batterybuffer.09.tier.08", + "Ultimate Voltage Battery Buffer", + 8, + "", + 9).getStackForm(1L)); + ItemList.Battery_Buffer_3by3_UHV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_UHV.ID, + "batterybuffer.09.tier.09", + "Highly Ultimate Voltage Battery Buffer", + 9, + "", + 9).getStackForm(1L)); + + ItemList.Battery_Buffer_3by3_UEV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_UEV.ID, + "batterybuffer.09.tier.10", + "Extremely Ultimate Battery Buffer", + 10, + "", + 9).getStackForm(1L)); + + ItemList.Battery_Buffer_3by3_UIV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_UIV.ID, + "batterybuffer.09.tier.11", + "Insanely Ultimate Battery Buffer", + 11, + "", + 9).getStackForm(1L)); + + ItemList.Battery_Buffer_3by3_UMV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_UMV.ID, + "batterybuffer.09.tier.12", + "Mega Ultimate Battery Buffer", + 12, + "", + 9).getStackForm(1L)); + + ItemList.Battery_Buffer_3by3_UXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_UXV.ID, + "batterybuffer.09.tier.13", + "Extended Mega Ultimate Battery Buffer", + 13, + "", + 9).getStackForm(1L)); + + ItemList.Battery_Buffer_3by3_MAXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_3_BY_3_MAX.ID, + "batterybuffer.09.tier.14", + "Maximum Battery Buffer", + 14, + "", + 9).getStackForm(1L)); + } + + private static void registerBatteryBuffer4x4() { + ItemList.Battery_Buffer_4by4_ULV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_ULV.ID, + "batterybuffer.16.tier.00", + "Ultra Low Voltage Battery Buffer", + 0, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_LV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_LV.ID, + "batterybuffer.16.tier.01", + "Low Voltage Battery Buffer", + 1, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_MV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_MV.ID, + "batterybuffer.16.tier.02", + "Medium Voltage Battery Buffer", + 2, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_HV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_HV.ID, + "batterybuffer.16.tier.03", + "High Voltage Battery Buffer", + 3, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_EV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_EV.ID, + "batterybuffer.16.tier.04", + "Extreme Voltage Battery Buffer", + 4, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_IV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_IV.ID, + "batterybuffer.16.tier.05", + "Insane Voltage Battery Buffer", + 5, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_LuV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_LuV.ID, + "batterybuffer.16.tier.06", + "Ludicrous Voltage Battery Buffer", + 6, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_ZPM.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_ZPM.ID, + "batterybuffer.16.tier.07", + "ZPM Voltage Battery Buffer", + 7, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_UV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_UV.ID, + "batterybuffer.16.tier.08", + "Ultimate Voltage Battery Buffer", + 8, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_UHV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_UHV.ID, + "batterybuffer.16.tier.09", + "Highly Ultimate Voltage Battery Buffer", + 9, + "", + 16).getStackForm(1L)); + ItemList.Battery_Buffer_4by4_UEV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_UEV.ID, + "batterybuffer.16.tier.10", + "Extremely Ultimate Battery Buffer", + 10, + "", + 16).getStackForm(1L)); + + ItemList.Battery_Buffer_4by4_UIV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_UIV.ID, + "batterybuffer.16.tier.11", + "Insanely Ultimate Battery Buffer", + 11, + "", + 16).getStackForm(1L)); + + ItemList.Battery_Buffer_4by4_UMV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_UMV.ID, + "batterybuffer.16.tier.12", + "Mega Ultimate Battery Buffer", + 12, + "", + 16).getStackForm(1L)); + + ItemList.Battery_Buffer_4by4_UXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_UXV.ID, + "batterybuffer.16.tier.13", + "Extended Mega Ultimate Battery Buffer", + 13, + "", + 16).getStackForm(1L)); + + ItemList.Battery_Buffer_4by4_MAXV.set( + new MTEBasicBatteryBuffer( + BATTERY_BUFFER_4_BY_4_MAX.ID, + "batterybuffer.16.tier.14", + "Maximum Battery Buffer", + 14, + "", + 16).getStackForm(1L)); + } + + private static void registerCharger4x4() { + ItemList.Battery_Charger_4by4_ULV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_ULV.ID, + "batterycharger.16.tier.00", + "Ultra Low Voltage Battery Charger", + 0, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_LV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_LV.ID, + "batterycharger.16.tier.01", + "Low Voltage Battery Charger", + 1, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_MV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_MV.ID, + "batterycharger.16.tier.02", + "Medium Voltage Battery Charger", + 2, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_HV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_HV.ID, + "batterycharger.16.tier.03", + "High Voltage Battery Charger", + 3, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_EV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_EV.ID, + "batterycharger.16.tier.04", + "Extreme Voltage Battery Charger", + 4, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_IV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_IV.ID, + "batterycharger.16.tier.05", + "Insane Voltage Battery Charger", + 5, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_LuV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_LuV.ID, + "batterycharger.16.tier.06", + "Ludicrous Voltage Battery Charger", + 6, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_ZPM.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_ZPM.ID, + "batterycharger.16.tier.07", + "ZPM Voltage Battery Charger", + 7, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_UV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_UV.ID, + "batterycharger.16.tier.08", + "Ultimate Voltage Battery Charger", + 8, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + ItemList.Battery_Charger_4by4_UHV.set( + new MTECharger( + BATTERY_CHARGER_4_BY_4_UHV.ID, + "batterycharger.16.tier.09", + "Highly Ultimate Voltage Battery Charger", + 9, + "Each battery gives 8A in/4A out (min 4A/2A)", + 4).getStackForm(1L)); + + ItemList.Battery_Charger_4by4_UEV.set( + new MTECharger( + BATTERY_CHARGER_4_4_UEV.ID, + "batterycharger.16.tier.10", + "Extremely Ultimate Battery Charger", + 10, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Charger_4by4_UIV.set( + new MTECharger( + BATTERY_CHARGER_4_4_UIV.ID, + "batterycharger.16.tier.11", + "Insanely Ultimate Battery Charger", + 11, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Charger_4by4_UMV.set( + new MTECharger( + BATTERY_CHARGER_4_4_UMV.ID, + "batterycharger.16.tier.12", + "Mega Ultimate Battery Charger", + 12, + "", + 4).getStackForm(1L)); + + ItemList.Battery_Charger_4by4_UXV.set( + new MTECharger( + BATTERY_CHARGER_4_4_UXV.ID, + "batterycharger.16.tier.13", + "Extended Mega Ultimate Battery Charger", + 13, + "", + 4).getStackForm(1L)); + } + + private void registerCircuitAssembler() { + ItemList.Machine_LV_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_LV.ID, + "basicmachine.circuitassembler.tier.01", + "Basic Circuit Assembler", + 1, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_MV_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_MV.ID, + "basicmachine.circuitassembler.tier.02", + "Advanced Circuit Assembler", + 2, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_HV_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_HV.ID, + "basicmachine.circuitassembler.tier.03", + "Advanced Circuit Assembler II", + 3, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_EV_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_EV.ID, + "basicmachine.circuitassembler.tier.04", + "Advanced Circuit Assembler III", + 4, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_IV_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_IV.ID, + "basicmachine.circuitassembler.tier.05", + "Advanced Circuit Assembler IV", + 5, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_LuV_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_LuV.ID, + "basicmachine.circuitassembler.tier.06", + "Advanced Circuit Assembler V", + 6, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_ZPM_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_ZPM.ID, + "basicmachine.circuitassembler.tier.07", + "Advanced Circuit Assembler VI", + 7, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.Machine_UV_CircuitAssembler.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_UV.ID, + "basicmachine.circuitassembler.tier.08", + "Advanced Circuit Assembler VII", + 8, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + RecipeMaps.circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.CircuitAssemblerUHV.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_UHV.ID, + "basicmachine.circuitassembler.tier.09", + "Ultimate Circuit Assembling Machine", + 9, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.CircuitAssemblerUEV.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_UEV.ID, + "basicmachine.circuitassembler.tier.10", + "Ultimate Circuit Assembling Machine II", + 10, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.CircuitAssemblerUIV.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_UIV.ID, + "basicmachine.circuitassembler.tier.11", + "Ultimate Circuit Assembling Machine III", + 11, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.CircuitAssemblerUMV.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_UMV.ID, + "basicmachine.circuitassembler.tier.12", + "Ultimate Circuit Assembling Machine IV", + 12, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.CircuitAssemblerUXV.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_UXV.ID, + "basicmachine.circuitassembler.tier.13", + "Ultimate Circuit Assembling Machine V", + 13, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + + ItemList.CircuitAssemblerMAX.set( + new MTEBasicMachineWithRecipe( + CIRCUIT_ASSEMBLER_MAX.ID, + "basicmachine.circuitassembler.tier.14", + "MAX Circuit Assembling Machine", + 14, + MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(), + circuitAssemblerRecipes, + 6, + 1, + true, + SoundResource.NONE, + MTEBasicMachineWithRecipe.SpecialEffects.NONE, + "CIRCUITASSEMBLER", + null).getStackForm(1L)); + } + + private void registerWetTransformer() { + ItemList.WetTransformer_LV_ULV.set( + new MTEWetTransformer( + WET_TRANSFORMER_LV_ULV.ID, + "wettransformer.tier.00", + "Ultra Low Voltage Power Transformer", + 0, + "LV -> ULV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_MV_LV.set( + new MTEWetTransformer( + WET_TRANSFORMER_MV_LV.ID, + "wetransformer.tier.01", + "Low Voltage Power Transformer", + 1, + "MV -> LV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_HV_MV.set( + new MTEWetTransformer( + WET_TRANSFORMER_HV_MV.ID, + "wettransformer.tier.02", + "Medium Voltage Power Transformer", + 2, + "HV -> MV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_EV_HV.set( + new MTEWetTransformer( + WET_TRANSFORMER_EV_HV.ID, + "wettransformer.tier.03", + "High Voltage Power Transformer", + 3, + "EV -> HV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_IV_EV.set( + new MTEWetTransformer( + WET_TRANSFORMER_IV_EV.ID, + "wettransformer.tier.04", + "Extreme Power Transformer", + 4, + "IV -> EV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_LuV_IV.set( + new MTEWetTransformer( + WET_TRANSFORMER_LuV_IV.ID, + "wettransformer.tier.05", + "Insane Power Transformer", + 5, + "LuV -> IV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_ZPM_LuV.set( + new MTEWetTransformer( + WET_TRANSFORMER_ZPM_LuV.ID, + "wettransformer.tier.06", + "Ludicrous Power Transformer", + 6, + "ZPM -> LuV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_UV_ZPM.set( + new MTEWetTransformer( + WET_TRANSFORMER_UV_ZPM.ID, + "wettransformer.tier.07", + "ZPM Voltage Power Transformer", + 7, + "UV -> ZPM (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_UHV_UV.set( + new MTEWetTransformer( + WET_TRANSFORMER_UHV_UV.ID, + "wettransformer.tier.08", + "Ultimate Power Transformer", + 8, + "UHV -> UV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_UEV_UHV.set( + new MTEWetTransformer( + WET_TRANSFORMER_UEV_UHV.ID, + "wettransformer.tier.09", + "Highly Ultimate Power Transformer", + 9, + "UEV -> UHV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_UIV_UEV.set( + new MTEWetTransformer( + WET_TRANSFORMER_UIV_UEV.ID, + "wettransformer.tier.10", + "Extremely Ultimate Power Transformer", + 10, + "UIV -> UEV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_UMV_UIV.set( + new MTEWetTransformer( + WET_TRANSFORMER_UMV_UIV.ID, + "wettransformer.tier.11", + "Insanely Ultimate Power Transformer", + 11, + "UMV -> UIV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_UXV_UMV.set( + new MTEWetTransformer( + WET_TRANSFORMER_UXV_UMV.ID, + "wettransformer.tier.12", + "Mega Ultimate Power Transformer", + 12, + "UXV -> UMV (Use Soft Mallet to invert)").getStackForm(1L)); + + ItemList.WetTransformer_MAX_UXV.set( + new MTEWetTransformer( + WET_TRANSFORMER_MAX_UXV.ID, + "wettransformer.tier.13", + "Extended Mega Ultimate Power Transformer", + 13, + "MAX -> UXV (Use Soft Mallet to invert)").getStackForm(1L)); + } + + private void registerHighAmpTransformer() { + ItemList.Transformer_HA_UEV_UHV.set( + new MTETransformerHiAmp( + HIGH_AMP_TRANSFORMER_UEV_UHV.ID, + "transformer.ha.tier.09", + "Highly Ultimate Hi-Amp Transformer", + 9, + "UEV -> UHV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_HA_UIV_UEV.set( + new MTETransformerHiAmp( + HIGH_AMP_TRANSFORMER_UIV_UEV.ID, + "transformer.ha.tier.10", + "Extremely Ultimate Hi-Amp Transformer", + 10, + "UIV -> UEV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_HA_UMV_UIV.set( + new MTETransformerHiAmp( + HIGH_AMP_TRANSFORMER_UMV_UIV.ID, + "transformer.ha.tier.11", + "Insanely Ultimate Hi-Amp Transformer", + 11, + "UMV -> UIV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_HA_UXV_UMV.set( + new MTETransformerHiAmp( + HIGH_AMP_TRANSFORMER_UXV_UMV.ID, + "transformer.ha.tier.12", + "Mega Ultimate Hi-Amp Transformer", + 12, + "UXV -> UMV (Use Soft Mallet to invert)").getStackForm(1L)); + ItemList.Transformer_HA_MAX_UXV.set( + new MTETransformerHiAmp( + HIGH_AMP_TRANSFORMER_MAX_UXV.ID, + "transformer.ha.tier.13", + "Extended Mega Ultimate Hi-Amp Transformer", + 13, + "MAX -> UXV (Use Soft Mallet to invert)").getStackForm(1L)); + + } + + private void registerTurboCharger4By4() { + ItemList.Battery_TurboCharger_4by4_ULV.set( + new MTETurboCharger( + TURBO_CHARGER_ULV.ID, + "batteryturbocharger.16.tier.00", + "Ultra Low Voltage Turbo Charger", + 0, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_LV.set( + new MTETurboCharger( + TURBO_CHARGER_LV.ID, + "batteryturbocharger.16.tier.01", + "Low Voltage Turbo Charger", + 1, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_MV.set( + new MTETurboCharger( + TURBO_CHARGER_MV.ID, + "batteryturbocharger.16.tier.02", + "Medium Voltage Turbo Charger", + 2, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_HV.set( + new MTETurboCharger( + TURBO_CHARGER_HV.ID, + "batteryturbocharger.16.tier.03", + "High Voltage Turbo Charger", + 3, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_EV.set( + new MTETurboCharger( + TURBO_CHARGER_EV.ID, + "batteryturbocharger.16.tier.04", + "Extreme Voltage Turbo Charger", + 4, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_IV.set( + new MTETurboCharger( + TURBO_CHARGER_IV.ID, + "batteryturbocharger.16.tier.05", + "Insane Voltage Turbo Charger", + 5, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_LuV.set( + new MTETurboCharger( + TURBO_CHARGER_LuV.ID, + "batteryturbocharger.16.tier.06", + "Ludicrous Voltage Turbo Charger", + 6, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_ZPM.set( + new MTETurboCharger( + TURBO_CHARGER_ZPM.ID, + "batteryturbocharger.16.tier.07", + "ZPM Voltage Turbo Charger", + 7, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_UV.set( + new MTETurboCharger( + TURBO_CHARGER_UV.ID, + "batteryturbocharger.16.tier.08", + "Ultimate Voltage Turbo Charger", + 8, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + ItemList.Battery_TurboCharger_4by4_UHV.set( + new MTETurboCharger( + TURBO_CHARGER_UHV.ID, + "batteryturbocharger.16.tier.09", + "Highly Ultimate Voltage Turbo Charger", + 9, + "64A in /16A out, 120A/item, Disable to force Charge", + 4).getStackForm(1L)); + + } + + private static void registerWirelessEnergyHatch() { + ItemList.Wireless_Hatch_Energy_ULV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_ULV.ID, + "hatch.wireless.receiver.tier.00", + "ULV Wireless Energy Hatch", + 0).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_LV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_LV.ID, + "hatch.wireless.receiver.tier.01", + "LV Wireless Energy Hatch", + 1).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_MV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_MV.ID, + "hatch.wireless.receiver.tier.02", + "MV Wireless Energy Hatch", + 2).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_HV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_HV.ID, + "hatch.wireless.receiver.tier.03", + "HV Wireless Energy Hatch", + 3).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_EV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_EV.ID, + "hatch.wireless.receiver.tier.04", + "EV Wireless Energy Hatch", + 4).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_IV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_IV.ID, + "hatch.wireless.receiver.tier.05", + "IV Wireless Energy Hatch", + 5).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_LuV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_LuV.ID, + "hatch.wireless.receiver.tier.06", + "LuV Wireless Energy Hatch", + 6).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_ZPM.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_ZPM.ID, + "hatch.wireless.receiver.tier.07", + "ZPM Wireless Energy Hatch", + 7).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_UV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_UV.ID, + "hatch.wireless.receiver.tier.08", + "UV Wireless Energy Hatch", + 8).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_UHV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_UHV.ID, + "hatch.wireless.receiver.tier.09", + "UHV Wireless Energy Hatch", + 9).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_UEV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_UEV.ID, + "hatch.wireless.receiver.tier.10", + "UEV Wireless Energy Hatch", + 10).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_UIV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_UIV.ID, + "hatch.wireless.receiver.tier.11", + "UIV Wireless Energy Hatch", + 11).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_UMV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_UMV.ID, + "hatch.wireless.receiver.tier.12", + "UMV Wireless Energy Hatch", + 12).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_UXV.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_UXV.ID, + "hatch.wireless.receiver.tier.13", + "UXV Wireless Energy Hatch", + 13).getStackForm(1L)); + ItemList.Wireless_Hatch_Energy_MAX.set( + new MTEWirelessEnergy( + WIRELESS_HATCH_ENERGY_MAX.ID, + "hatch.wireless.receiver.tier.14", + "MAX Wireless Energy Hatch", + 14).getStackForm(1L)); + } + + private static void registerWirelessDynamoHatch() { + ItemList.Wireless_Dynamo_Energy_ULV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_ULV.ID, + "hatch.wireless.transmitter.tier.00", + "ULV Wireless Energy Dynamo", + 0).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_LV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_LV.ID, + "hatch.wireless.transmitter.tier.01", + "LV Wireless Energy Dynamo", + 1).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_MV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_MV.ID, + "hatch.wireless.transmitter.tier.02", + "MV Wireless Energy Dynamo", + 2).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_HV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_HV.ID, + "hatch.wireless.transmitter.tier.03", + "HV Wireless Energy Dynamo", + 3).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_EV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_EV.ID, + "hatch.wireless.transmitter.tier.04", + "EV Wireless Energy Dynamo", + 4).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_IV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_IV.ID, + "hatch.wireless.transmitter.tier.05", + "IV Wireless Energy Dynamo", + 5).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_LuV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_LuV.ID, + "hatch.wireless.transmitter.tier.06", + "LuV Wireless Energy Dynamo", + 6).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_ZPM.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_ZPM.ID, + "hatch.wireless.transmitter.tier.07", + "ZPM Wireless Energy Dynamo", + 7).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_UV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_UV.ID, + "hatch.wireless.transmitter.tier.08", + "UV Wireless Energy Dynamo", + 8).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_UHV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_UHV.ID, + "hatch.wireless.transmitter.tier.09", + "UHV Wireless Energy Dynamo", + 9).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_UEV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_UEV.ID, + "hatch.wireless.transmitter.tier.10", + "UEV Wireless Energy Dynamo", + 10).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_UIV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_UIV.ID, + "hatch.wireless.transmitter.tier.11", + "UIV Wireless Energy Dynamo", + 11).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_UMV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_UMV.ID, + "hatch.wireless.transmitter.tier.12", + "UMV Wireless Energy Dynamo", + 12).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_UXV.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_UXV.ID, + "hatch.wireless.transmitter.tier.13", + "UXV Wireless Energy Dynamo", + 13).getStackForm(1L)); + ItemList.Wireless_Dynamo_Energy_MAX.set( + new MTEWirelessDynamo( + WIRELESS_DYNAMO_ENERGY_HATCH_MAX.ID, + "hatch.wireless.transmitter.tier.14", + "MAX Wireless Energy Dynamo", + 14).getStackForm(1L)); + } + + private static void registerLightningRods() { + ItemList.Machine_HV_LightningRod.set( + new MTELightningRod(LIGHTNING_ROD_HV.ID, "basicgenerator.lightningrod.03", "Lightning Rod", 3) + .getStackForm(1)); + ItemList.Machine_EV_LightningRod.set( + new MTELightningRod(LIGHTNING_ROD_EV.ID, "basicgenerator.lightningrod.04", "Lightning Rod II", 4) + .getStackForm(1)); + ItemList.Machine_IV_LightningRod.set( + new MTELightningRod(LIGHTNING_ROD_IV.ID, "basicgenerator.lightningrod.05", "Lightning Rod III", 5) + .getStackForm(1)); + } + + private static void registerCombustionGenerators() { + ItemList.Generator_Diesel_LV.set( + new MTEDieselGenerator( + COMBUSTION_GENERATOR_LV.ID, + "basicgenerator.diesel.tier.01", + "Basic Combustion Generator", + 1).getStackForm(1L)); + ItemList.Generator_Diesel_MV.set( + new MTEDieselGenerator( + COMBUSTION_GENERATOR_MV.ID, + "basicgenerator.diesel.tier.02", + "Advanced Combustion Generator", + 2).getStackForm(1L)); + ItemList.Generator_Diesel_HV.set( + new MTEDieselGenerator( + COMBUSTION_GENERATOR_HV.ID, + "basicgenerator.diesel.tier.03", + "Turbo Combustion Generator", + 3).getStackForm(1L)); + } + + private static void registerGasTurbines() { + ItemList.Generator_Gas_Turbine_LV.set( + new MTEGasTurbine(GAS_TURBINE_LV.ID, "basicgenerator.gasturbine.tier.01", "Basic Gas Turbine", 1, 95) + .getStackForm(1L)); + ItemList.Generator_Gas_Turbine_MV.set( + new MTEGasTurbine(GAS_TURBINE_MV.ID, "basicgenerator.gasturbine.tier.02", "Advanced Gas Turbine", 2, 90) + .getStackForm(1L)); + ItemList.Generator_Gas_Turbine_HV.set( + new MTEGasTurbine(GAS_TURBINE_HV.ID, "basicgenerator.gasturbine.tier.03", "Turbo Gas Turbine", 3, 85) + .getStackForm(1L)); + ItemList.Generator_Gas_Turbine_EV.set( + new MTEGasTurbine(GAS_TURBINE_EV.ID, "basicgenerator.gasturbine.tier.04", "Turbo Gas Turbine II", 4, 60) + .getStackForm(1L)); + ItemList.Generator_Gas_Turbine_IV.set( + new MTEGasTurbine(GAS_TURBINE_IV.ID, "basicgenerator.gasturbine.tier.05", "Turbo Gas Turbine III", 5, 50) + .getStackForm(1L)); + } + + private static void registerSteamTurbines() { + ItemList.Generator_Steam_Turbine_LV.set( + new MTESteamTurbine(STEAM_TURBINE_LV.ID, "basicgenerator.steamturbine.tier.01", "Basic Steam Turbine", 1) + .getStackForm(1L)); + ItemList.Generator_Steam_Turbine_MV.set( + new MTESteamTurbine(STEAM_TURBINE_MV.ID, "basicgenerator.steamturbine.tier.02", "Advanced Steam Turbine", 2) + .getStackForm(1L)); + ItemList.Generator_Steam_Turbine_HV.set( + new MTESteamTurbine(STEAM_TURBINE_HV.ID, "basicgenerator.steamturbine.tier.03", "Turbo Steam Turbine", 3) + .getStackForm(1L)); + } + + private static void registerNaquadahReactors() { + ItemList.Generator_Naquadah_Mark_I.set( + new MTENaquadahReactor( + NAQUADAH_REACTOR_EV.ID, + "basicgenerator.naquadah.tier.04", + new String[] { "Requires Enriched Naquadah Bolts" }, + "Naquadah Reactor Mark I", + 4).getStackForm(1L)); + ItemList.Generator_Naquadah_Mark_II.set( + new MTENaquadahReactor( + NAQUADAH_REACTOR_IV.ID, + "basicgenerator.naquadah.tier.05", + new String[] { "Requires Enriched Naquadah Rods" }, + "Naquadah Reactor Mark II", + 5).getStackForm(1L)); + ItemList.Generator_Naquadah_Mark_III.set( + new MTENaquadahReactor( + NAQUADAH_REACTOR_LuV.ID, + "basicgenerator.naquadah.tier.06", + new String[] { "Requires Enriched Naquadah Long Rods" }, + "Naquadah Reactor Mark III", + 6).getStackForm(1L)); + ItemList.Generator_Naquadah_Mark_IV.set( + new MTENaquadahReactor( + NAQUADAH_REACTOR_ZPM.ID, + "basicgenerator.naquadah.tier.07", + new String[] { "Requires Naquadria Bolts" }, + "Naquadah Reactor Mark IV", + 7).getStackForm(1L)); + ItemList.Generator_Naquadah_Mark_V.set( + new MTENaquadahReactor( + NAQUADAH_REACTOR_UV.ID, + "basicgenerator.naquadah.tier.08", + new String[] { "Requires Naquadria Rods" }, + "Naquadah Reactor Mark V", + 8).getStackForm(1L)); + } + + private static void registerMagicEnergyConverters() { + ItemList.MagicEnergyConverter_LV.set( + new MTEMagicEnergyConverter( + MAGIC_ENERGY_CONVERTER_LV.ID, + "basicgenerator.magicenergyconverter.tier.01", + "Novice Magic Energy Converter", + 1).getStackForm(1L)); + ItemList.MagicEnergyConverter_MV.set( + new MTEMagicEnergyConverter( + MAGIC_ENERGY_CONVERTER_MV.ID, + "basicgenerator.magicenergyconverter.tier.02", + "Adept Magic Energy Converter", + 2).getStackForm(1L)); + ItemList.MagicEnergyConverter_HV.set( + new MTEMagicEnergyConverter( + MAGIC_ENERGY_CONVERTER_HV.ID, + "basicgenerator.magicenergyconverter.tier.03", + "Master Magic Energy Converter", + 3).getStackForm(1L)); + } + + private static void registerMagicEnergyAbsorbers() { + ItemList.MagicEnergyAbsorber_LV.set( + new MTEMagicalEnergyAbsorber( + MAGIC_ENERGY_ABSORBER_LV.ID, + "basicgenerator.magicenergyabsorber.tier.01", + "Novice Magic Energy Absorber", + 1).getStackForm(1L)); + ItemList.MagicEnergyAbsorber_MV.set( + new MTEMagicalEnergyAbsorber( + MAGIC_ENERGY_ABSORBER_MV.ID, + "basicgenerator.magicenergyabsorber.tier.02", + "Adept Magic Energy Absorber", + 2).getStackForm(1L)); + ItemList.MagicEnergyAbsorber_HV.set( + new MTEMagicalEnergyAbsorber( + MAGIC_ENERGY_ABSORBER_HV.ID, + "basicgenerator.magicenergyabsorber.tier.03", + "Master Magic Energy Absorber", + 3).getStackForm(1L)); + ItemList.MagicEnergyAbsorber_EV.set( + new MTEMagicalEnergyAbsorber( + MAGIC_ENERGY_ABSORBER_EV.ID, + "basicgenerator.magicenergyabsorber.tier.04", + "Grandmaster Magic Energy Absorber", + 4).getStackForm(1L)); + } + + private static void registerPlasmaGenerators() { + ItemList.Generator_Plasma_EV.set( + new MTEPlasmaGenerator( + PLASMA_GENERATOR_EV.ID, + "basicgenerator.plasmagenerator.tier.05", + "Plasma Generator Mark I", + 4).getStackForm(1L)); + ItemList.Generator_Plasma_IV.set( + new MTEPlasmaGenerator( + PLASMA_GENERATOR_IV.ID, + "basicgenerator.plasmagenerator.tier.06", + "Plasma Generator Mark II", + 5).getStackForm(1L)); + ItemList.Generator_Plasma_LuV.set( + new MTEPlasmaGenerator( + PLASMA_GENERATOR_LuV.ID, + "basicgenerator.plasmagenerator.tier.07", + "Plasma Generator Mark III", + 6).getStackForm(1L)); + + ItemList.Generator_Plasma_ZPMV.set( + new MTEPlasmaGenerator( + PLASMA_GENERATOR_ZPM.ID, + "basicgenerator.plasmagenerator.tier.08", + "Plasma Generator Mark IV", + 7).getStackForm(1L)); + + ItemList.Generator_Plasma_UV.set( + new MTEPlasmaGenerator( + PLASMA_GENERATOR_UV.ID, + "basicgenerator.plasmagenerator.tier.09", + "Ultimate Pocket Sun", + 8).getStackForm(1L)); + } + + private static void generateWiresAndPipes() { + for (int meta = 0; meta < GregTechAPI.sGeneratedMaterials.length; meta++) { + Materials material = GregTechAPI.sGeneratedMaterials[meta]; + // This check is separated out because IntelliJ thinks Materials.Wood can be null. + if (material == null) continue; + if ((material.mTypes & 0x2) != 0 || material == Materials.Wood) { + new MTEFrame( + 4096 + meta, + "GT_Frame_" + material, + (GTLanguageManager.i18nPlaceholder ? "%material" : material.mDefaultLocalName) + + " Frame Box (TileEntity)", + material); + + // Generate recipes for frame box + BlockFrameBox block = (BlockFrameBox) GregTechAPI.sBlockFrames; + GTOreDictUnificator.registerOre(OrePrefixes.frameGt, material, block.getStackForm(1, meta)); + if (material.getProcessingMaterialTierEU() < TierEU.IV) { + GTModHandler.addCraftingRecipe( + block.getStackForm(2, meta), + GTModHandler.RecipeBits.NOT_REMOVABLE | GTModHandler.RecipeBits.BUFFERED, + new Object[] { "SSS", "SwS", "SSS", 'S', OrePrefixes.stick.get(material) }); + } + + if (!material.contains(SubTag.NO_RECIPES) + && GTOreDictUnificator.get(OrePrefixes.stick, material, 1) != null) { + // Auto generate frame box recipe in an assembler. + GTValues.RA.stdBuilder() + .itemInputs( + GTOreDictUnificator.get(OrePrefixes.stick, material, 4), + GTUtility.getIntegratedCircuit(4)) + .itemOutputs(block.getStackForm(1, meta)) + .duration(3 * SECONDS + 4 * TICKS) + .eut(calculateRecipeEU(material, 7)) + .addTo(assemblerRecipes); + } + } + } + + makeWires(Materials.RedAlloy, 2000, 0L, 1L, 1L, GTValues.V[0], true, false); + + makeWires(Materials.Cobalt, 1200, 2L, 4L, 2L, GTValues.V[1], true, false); + makeWires(Materials.Lead, 1220, 2L, 4L, 2L, GTValues.V[1], true, false); + makeWires(Materials.Tin, 1240, 1L, 2L, 1L, GTValues.V[1], true, false); + + makeWires(Materials.Zinc, 1260, 1L, 2L, 1L, GTValues.V[1], true, false); + makeWires(Materials.SolderingAlloy, 1280, 1L, 2L, 1L, GTValues.V[1], true, false); + + makeWires(Materials.Iron, 1300, 3L, 6L, 2L, GTValues.V[2], true, false); + makeWires(Materials.Nickel, 1320, 3L, 6L, 3L, GTValues.V[2], true, false); + makeWires(Materials.Cupronickel, 1340, 3L, 6L, 2L, GTValues.V[2], true, false); + makeWires(Materials.Copper, 1360, 2L, 4L, 1L, GTValues.V[2], true, false); + makeWires(Materials.AnnealedCopper, 1380, 2L, 4L, 1L, GTValues.V[2], true, false); + + makeWires(Materials.Kanthal, 1400, 3L, 6L, 4L, GTValues.V[3], true, false); + makeWires(Materials.Gold, 1420, 2L, 4L, 3L, GTValues.V[3], true, false); + makeWires(Materials.Electrum, 1440, 2L, 4L, 2L, GTValues.V[3], true, false); + makeWires(Materials.Silver, 1460, 1L, 2L, 1L, GTValues.V[3], true, false); + makeWires(Materials.BlueAlloy, 1480, 1L, 2L, 2L, GTValues.V[3], true, false); + + makeWires(Materials.Nichrome, 1500, 4L, 8L, 3L, GTValues.V[4], true, false); + makeWires(Materials.Steel, 1520, 2L, 4L, 2L, GTValues.V[4], true, false); + makeWires(Materials.BlackSteel, 1540, 2L, 4L, 3L, GTValues.V[4], true, false); + makeWires(Materials.Titanium, 1560, 2L, 4L, 4L, GTValues.V[4], true, false); + makeWires(Materials.Aluminium, 1580, 1L, 2L, 1L, GTValues.V[4], true, false); + + makeWires(Materials.Graphene, 1600, 1L, 2L, 1L, GTValues.V[5], false, true); + makeWires(Materials.Osmium, 1620, 2L, 4L, 4L, GTValues.V[5], true, false); + makeWires(Materials.Platinum, 1640, 1L, 2L, 2L, GTValues.V[5], true, false); + makeWires(Materials.TungstenSteel, 1660, 2L, 4L, 3L, GTValues.V[5], true, false); + makeWires(Materials.Tungsten, 1680, 2L, 4L, 2L, GTValues.V[5], true, false); + + makeWires(Materials.HSSG, 1700, 2L, 4L, 4L, GTValues.V[6], true, false); + makeWires(Materials.NiobiumTitanium, 1720, 2L, 4L, 4L, GTValues.V[6], true, false); + makeWires(Materials.VanadiumGallium, 1740, 2L, 4L, 4L, GTValues.V[6], true, false); + makeWires(Materials.YttriumBariumCuprate, 1760, 4L, 8L, 4L, GTValues.V[6], true, false); + + makeWires(Materials.Naquadah, 1780, 2L, 4L, 2L, GTValues.V[7], true, false); + + makeWires(Materials.NaquadahAlloy, 1800, 4L, 8L, 2L, GTValues.V[8], true, false); + makeWires(Materials.Duranium, 1820, 8L, 16L, 1L, GTValues.V[8], true, false); + makeWires(Materials.TPV, 1840, 1L, 2L, 6L, GTValues.V[4], true, false); + + // Superconductor base. + makeWires(Materials.Pentacadmiummagnesiumhexaoxid, 2200, 1L, 2L, 1L, GTValues.V[2], false, false); + makeWires(Materials.Titaniumonabariumdecacoppereikosaoxid, 2220, 1L, 8L, 2L, GTValues.V[3], false, false); + makeWires(Materials.Uraniumtriplatinid, 2240, 1L, 16L, 3L, GTValues.V[4], false, false); + makeWires(Materials.Vanadiumtriindinid, 2260, 1L, 64L, 4L, GTValues.V[5], false, false); + makeWires( + Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid, + 2280, + 2L, + 256L, + 6L, + GTValues.V[6], + false, + false); + makeWires(Materials.Tetranaquadahdiindiumhexaplatiumosminid, 2300, 2L, 1024L, 8L, GTValues.V[7], false, false); + makeWires(Materials.Longasssuperconductornameforuvwire, 2500, 2L, 4096L, 12L, GTValues.V[8], false, false); + makeWires(Materials.Longasssuperconductornameforuhvwire, 2520, 2L, 16384L, 16L, GTValues.V[9], false, false); + makeWires(Materials.SuperconductorUEVBase, 2032, 2L, 65536L, 24L, GTValues.V[10], false, false); + makeWires(Materials.SuperconductorUIVBase, 2052, 2L, 262144L, 32L, GTValues.V[11], false, false); + makeWires(Materials.SuperconductorUMVBase, 2072, 2L, 1048576L, 32L, GTValues.V[12], false, false); + + // Actual superconductors. + makeWires(Materials.SuperconductorMV, 2320, 0L, 0L, 4L, GTValues.V[2], false, true); + makeWires(Materials.SuperconductorHV, 2340, 0L, 0L, 6L, GTValues.V[3], false, true); + makeWires(Materials.SuperconductorEV, 2360, 0L, 0L, 8L, GTValues.V[4], false, true); + makeWires(Materials.SuperconductorIV, 2380, 0L, 0L, 12L, GTValues.V[5], false, true); + makeWires(Materials.SuperconductorLuV, 2400, 0L, 0L, 16L, GTValues.V[6], false, true); + makeWires(Materials.SuperconductorZPM, 2420, 0L, 0L, 24L, GTValues.V[7], false, true); + makeWires(Materials.SuperconductorUV, 2440, 0L, 0L, 32L, GTValues.V[8], false, true); + makeWires(Materials.SuperconductorUHV, 2020, 0L, 0L, 48L, GTValues.V[9], false, true); + makeWires(Materials.SuperconductorUEV, 2026, 0L, 0L, 64L, GTValues.V[10], false, true); + makeWires(Materials.SuperconductorUIV, 2081, 0L, 0L, 64L, GTValues.V[11], false, true); + makeWires(Materials.SuperconductorUMV, 2089, 0L, 0L, 64L, GTValues.V[12], false, true); + + makeWires(Materials.Ichorium, 2600, 2L, 2L, 12L, GTValues.V[9], false, true); + makeWires(MaterialsUEVplus.SpaceTime, 2606, 0L, 0L, 1_000_000L, GTValues.V[14], false, true); + + GTOreDictUnificator.registerOre( + OrePrefixes.pipeSmall.get(Materials.Wood), + new MTEFluid(5101, "GT_Pipe_Wood_Small", "Small Wooden Fluid Pipe", 0.375F, Materials.Wood, 10, 350, false) + .getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeMedium.get(Materials.Wood), + new MTEFluid(5102, "GT_Pipe_Wood", "Wooden Fluid Pipe", 0.5F, Materials.Wood, 30, 350, false) + .getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeLarge.get(Materials.Wood), + new MTEFluid(5103, "GT_Pipe_Wood_Large", "Large Wooden Fluid Pipe", 0.75F, Materials.Wood, 60, 350, false) + .getStackForm(1L)); + + generateFluidPipes(Materials.Copper, Materials.Copper.mName, 5110, 20, 1000, true); + generateFluidMultiPipes(Materials.Copper, Materials.Copper.mName, 5115, 20, 1000, true); + generateFluidPipes(Materials.Bronze, Materials.Bronze.mName, 5120, 120, 2000, true); + generateFluidMultiPipes(Materials.Bronze, Materials.Bronze.mName, 5125, 120, 2000, true); + generateFluidPipes(Materials.Steel, Materials.Steel.mName, 5130, 240, 2500, true); + generateFluidMultiPipes(Materials.Steel, Materials.Steel.mName, 5135, 240, 2500, true); + generateFluidPipes(Materials.StainlessSteel, Materials.StainlessSteel.mName, 5140, 360, 3000, true); + generateFluidMultiPipes(Materials.StainlessSteel, Materials.StainlessSteel.mName, 5145, 360, 3000, true); + generateFluidPipes(Materials.Titanium, Materials.Titanium.mName, 5150, 480, 5000, true); + generateFluidMultiPipes(Materials.Titanium, Materials.Titanium.mName, 5155, 480, 5000, true); + generateFluidPipes(Materials.TungstenSteel, Materials.TungstenSteel.mName, 5160, 600, 7500, true); + generateFluidMultiPipes(Materials.TungstenSteel, Materials.TungstenSteel.mName, 5270, 600, 7500, true); + generateFluidPipes( + Materials.Polybenzimidazole, + Materials.Polybenzimidazole.mName, + "PBI", + 5280, + 600, + 1000, + true); + generateFluidMultiPipes( + Materials.Polybenzimidazole, + Materials.Polybenzimidazole.mName, + "PBI", + 5290, + 600, + 1000, + true); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeSmall.get(Materials.Ultimate), + new MTEFluid( + 5165, + "GT_Pipe_HighPressure_Small", + "Small High Pressure Fluid Pipe", + 0.375F, + Materials.Redstone, + 4800, + 1500, + true).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeMedium.get(Materials.Ultimate), + new MTEFluid( + 5166, + "GT_Pipe_HighPressure", + "High Pressure Fluid Pipe", + 0.5F, + Materials.Redstone, + 7200, + 1500, + true).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeLarge.get(Materials.Ultimate), + new MTEFluid( + 5167, + "GT_Pipe_HighPressure_Large", + "Large High Pressure Fluid Pipe", + 0.75F, + Materials.Redstone, + 9600, + 1500, + true).getStackForm(1L)); + generateFluidPipes(Materials.Plastic, Materials.Plastic.mName, "Plastic", 5170, 360, 350, true); + generateFluidMultiPipes(Materials.Plastic, Materials.Plastic.mName, "Plastic", 5175, 360, 350, true); + generateFluidPipes(Materials.NiobiumTitanium, Materials.NiobiumTitanium.mName, 5180, 900, 2900, true); + generateFluidMultiPipes(Materials.NiobiumTitanium, Materials.NiobiumTitanium.mName, 5185, 900, 2900, true); + generateFluidPipes(Materials.Enderium, Materials.Enderium.mName, 5190, 1800, 15000, true); + generateFluidMultiPipes(Materials.Enderium, Materials.Enderium.mName, 5195, 1800, 15000, true); + generateFluidPipes(Materials.Naquadah, Materials.Naquadah.mName, 5200, 9000, 19000, true); + generateFluidMultiPipes(Materials.Naquadah, Materials.Naquadah.mName, 5205, 9000, 19000, true); + generateFluidPipes(Materials.Neutronium, Materials.Neutronium.mName, 5210, 16800, 1000000, true); + generateFluidMultiPipes(Materials.Neutronium, Materials.Neutronium.mName, 5215, 16800, 1000000, true); + generateFluidPipes(Materials.NetherStar, Materials.NetherStar.mName, 5220, 19200, 1000000, true); + generateFluidMultiPipes(Materials.NetherStar, Materials.NetherStar.mName, 5225, 19200, 1000000, true); + generateFluidPipes(Materials.MysteriousCrystal, Materials.MysteriousCrystal.mName, 5230, 24000, 1000000, true); + generateFluidMultiPipes( + Materials.MysteriousCrystal, + Materials.MysteriousCrystal.mName, + 5235, + 24000, + 1000000, + true); + generateFluidPipes(Materials.DraconiumAwakened, Materials.DraconiumAwakened.mName, 5240, 45000, 10000000, true); + generateFluidMultiPipes( + Materials.DraconiumAwakened, + Materials.DraconiumAwakened.mName, + 5245, + 45000, + 10000000, + true); + generateFluidPipes(Materials.Infinity, Materials.Infinity.mName, 5250, 60000, 10000000, true); + generateFluidMultiPipes(Materials.Infinity, Materials.Infinity.mName, 5255, 60000, 10000000, true); + generateFluidPipes(Materials.WroughtIron, Materials.WroughtIron.mName, 5260, 180, 2250, true); + generateFluidMultiPipes(Materials.WroughtIron, Materials.WroughtIron.mName, 5265, 180, 2250, true); + generateFluidPipes( + Materials.Polytetrafluoroethylene, + Materials.Polytetrafluoroethylene.mName, + "PTFE", + 5680, + 480, + 600, + true); + generateFluidMultiPipes( + Materials.Polytetrafluoroethylene, + Materials.Polytetrafluoroethylene.mName, + "PTFE", + 5685, + 480, + 600, + true); + generateFluidPipes( + MaterialsUEVplus.SpaceTime, + MaterialsUEVplus.SpaceTime.mName, + 5300, + 250000, + 2147483647, + true); + generateFluidMultiPipes( + MaterialsUEVplus.SpaceTime, + MaterialsUEVplus.SpaceTime.mName, + 5305, + 250000, + 2147483647, + true); + generateFluidPipes( + MaterialsUEVplus.TranscendentMetal, + MaterialsUEVplus.TranscendentMetal.mName, + 5310, + 220000, + 2147483647, + true); + generateFluidMultiPipes( + MaterialsUEVplus.TranscendentMetal, + MaterialsUEVplus.TranscendentMetal.mName, + 5315, + 220000, + 2147483647, + true); + + generateItemPipes(Materials.Brass, Materials.Brass.mName, 5602, 1); + generateItemPipes(Materials.Electrum, Materials.Electrum.mName, 5612, 2); + generateItemPipes(Materials.Platinum, Materials.Platinum.mName, 5622, 4); + generateItemPipes(Materials.Osmium, Materials.Osmium.mName, 5632, 8); + generateItemPipes(Materials.PolyvinylChloride, Materials.PolyvinylChloride.mName, "PVC", 5690, 4); + generateItemPipes(Materials.Nickel, Materials.Nickel.mName, 5700, 1); + generateItemPipes(Materials.Cobalt, Materials.Cobalt.mName, 5710, 2); + generateItemPipes(Materials.Aluminium, Materials.Aluminium.mName, 5720, 2); + if (NewHorizonsCoreMod.isModLoaded()) { + generateFluidPipes(Materials.get("RadoxPoly"), "RadoxPoly", 5760, 5000, 1500, true); + } + } + + @SuppressWarnings("PointlessArithmeticExpression") + private static void makeWires(Materials aMaterial, int aStartID, long aLossInsulated, long aLoss, long aAmperage, + long aVoltage, boolean aInsulatable, boolean aAutoInsulated) { + String name = GTLanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName; + GTOreDictUnificator.registerOre( + OrePrefixes.wireGt01, + aMaterial, + new MTECable( + aStartID + 0, + aTextWire1 + aMaterial.mName.toLowerCase() + ".01", + "1x " + name + aTextWire2, + 0.125F, + aMaterial, + aLoss, + 1L * aAmperage, + aVoltage, + false, + !aAutoInsulated).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.wireGt02, + aMaterial, + new MTECable( + aStartID + 1, + aTextWire1 + aMaterial.mName.toLowerCase() + ".02", + "2x " + name + aTextWire2, + 0.25F, + aMaterial, + aLoss, + 2L * aAmperage, + aVoltage, + false, + !aAutoInsulated).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.wireGt04, + aMaterial, + new MTECable( + aStartID + 2, + aTextWire1 + aMaterial.mName.toLowerCase() + ".04", + "4x " + name + aTextWire2, + 0.375F, + aMaterial, + aLoss, + 4L * aAmperage, + aVoltage, + false, + !aAutoInsulated).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.wireGt08, + aMaterial, + new MTECable( + aStartID + 3, + aTextWire1 + aMaterial.mName.toLowerCase() + ".08", + "8x " + name + aTextWire2, + 0.5F, + aMaterial, + aLoss, + 8L * aAmperage, + aVoltage, + false, + !aAutoInsulated).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.wireGt12, + aMaterial, + new MTECable( + aStartID + 4, + aTextWire1 + aMaterial.mName.toLowerCase() + ".12", + "12x " + name + aTextWire2, + 0.625F, + aMaterial, + aLoss, + 12L * aAmperage, + aVoltage, + false, + !aAutoInsulated).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.wireGt16, + aMaterial, + new MTECable( + aStartID + 5, + aTextWire1 + aMaterial.mName.toLowerCase() + ".16", + "16x " + name + aTextWire2, + 0.75F, + aMaterial, + aLoss, + 16L * aAmperage, + aVoltage, + false, + !aAutoInsulated).getStackForm(1L)); + if (aInsulatable) { + GTOreDictUnificator.registerOre( + OrePrefixes.cableGt01, + aMaterial, + new MTECable( + aStartID + 6, + aTextCable1 + aMaterial.mName.toLowerCase() + ".01", + "1x " + name + aTextCable2, + 0.25F, + aMaterial, + aLossInsulated, + 1L * aAmperage, + aVoltage, + true, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.cableGt02, + aMaterial, + new MTECable( + aStartID + 7, + aTextCable1 + aMaterial.mName.toLowerCase() + ".02", + "2x " + name + aTextCable2, + 0.375F, + aMaterial, + aLossInsulated, + 2L * aAmperage, + aVoltage, + true, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.cableGt04, + aMaterial, + new MTECable( + aStartID + 8, + aTextCable1 + aMaterial.mName.toLowerCase() + ".04", + "4x " + name + aTextCable2, + 0.5F, + aMaterial, + aLossInsulated, + 4L * aAmperage, + aVoltage, + true, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.cableGt08, + aMaterial, + new MTECable( + aStartID + 9, + aTextCable1 + aMaterial.mName.toLowerCase() + ".08", + "8x " + name + aTextCable2, + 0.625F, + aMaterial, + aLossInsulated, + 8L * aAmperage, + aVoltage, + true, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.cableGt12, + aMaterial, + new MTECable( + aStartID + 10, + aTextCable1 + aMaterial.mName.toLowerCase() + ".12", + "12x " + name + aTextCable2, + 0.75F, + aMaterial, + aLossInsulated, + 12L * aAmperage, + aVoltage, + true, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.cableGt16, + aMaterial, + new MTECable( + aStartID + 11, + aTextCable1 + aMaterial.mName.toLowerCase() + ".16", + "16x " + name + aTextCable2, + 0.875F, + aMaterial, + aLossInsulated, + 16L * aAmperage, + aVoltage, + true, + false).getStackForm(1L)); + } + } + + @Override + public void run() { + GTLog.out.println("GTMod: Registering MetaTileEntities."); + registerMachineHull(); + registerTransformer(); + registerDynamoHatch(); + registerEnergyHatch(); + registerInputHatch(); + registerQuadrupleInputHatch(); + registerOutputHatch(); + registerQuantumTank(); + registerQuantumChest(); + registerSuperTank(); + registerSuperChest(); + registerLongDistancePipe(); + registerAE2Hatches(); + registerMagHatch(); + registerInputBus(); + registerOutputBus(); + registerMufflerHatch(); + registerBoiler(); + registerBatteryBuffer1x1(); + registerBatteryBuffer2x2(); + registerBatteryBuffer3x3(); + registerBatteryBuffer4x4(); + registerCharger4x4(); + registerWirelessEnergyHatch(); + registerWirelessDynamoHatch(); + registerSteamMachines(); + registerHPSteamMachines(); + registerLocker(); + registerScanner(); + registerPackager(); + registerRockBreaker(); + registerIndustrialApiary(); + registerMassFab(); + registerReplicator(); + registerBrewery(); + registerMiner(); + registerPump(); + registerTeleporter(); + registerMonsterRepellator(); + registerAdvancedSeismicProspector(); + registerMicrowaveEnergyTransmitter(); + registerChestBuffer(); + registerItemFilter(); + registerTypeFilter(); + registerRegulator(); + registerSuperBuffer(); + registerItemDistributor(); + registerRecipeFilter(); + registerLightningRods(); + registerCombustionGenerators(); + registerGasTurbines(); + registerSteamTurbines(); + registerNaquadahReactors(); + registerMagicEnergyAbsorbers(); + registerMagicEnergyConverters(); + registerPlasmaGenerators(); + registerMultiblockControllers(); + registerWorldAccelerator(); + registerAlloySmelter(); + registerMatterAmplifier(); + registerAssemblingMachine(); + registerWetTransformer(); + registerHighAmpTransformer(); + registerChemicalBath(); + registerChemicalReactor(); + registerFermenter(); + registerFluidCanner(); + registerFluidExtractor(); + registerFluidHeater(); + registerMixer(); + registerAutoclave(); + registerBendingMachine(); + registerCompressor(); + registerCuttingMachine(); + registerDistillery(); + registerElectricFurnace(); + registerElectromagneticSeparator(); + registerExtractor(); + registerExtruder(); + registerFluidSolidifier(); + registerFormingPress(); + registerForgeHammer(); + registerLathe(); + registerPrecisionLaserEngraver(); + registerMacerator(); + registerMatterFabricator(); + registerMicrowave(); + registerOreWashingPlant(); + registerPolarizer(); + registerRecycler(); + registerSiftingMachine(); + registerSlicingMachine(); + registerThermalCentrifuge(); + registerWiremill(); + registerArcFurnace(); + registerCentrifuge(); + registerPlasmaArcFurnace(); + registerCanningMachine(); + registerElectrolyzer(); + registerCircuitAssembler(); + registerTurboCharger4By4(); + registerBetterJukebox(); + registerUnpackager(); + registerPrinter(); + registerOven(); + + ItemList.AdvDebugStructureWriter.set( + new MTEAdvDebugStructureWriter( + ADVANCED_DEBUG_STRUCTURE_WRITTER.ID, + "advdebugstructurewriter", + "Advanced Debug Structure Writer", + 5).getStackForm(1L)); + ItemList.Hatch_Maintenance.set( + new MTEHatchMaintenance(MAINTENANCE_HATCH.ID, "hatch.maintenance", "Maintenance Hatch", 1) + .getStackForm(1L)); + ItemList.Hatch_AutoMaintenance.set( + new MTEHatchMaintenance( + AUTO_MAINTENANCE_HATCH.ID, + "hatch.maintenance.auto", + "Auto Maintenance Hatch", + 6, + true).getStackForm(1L)); + ItemList.Hatch_DroneDownLink.set( + new MTEHatchDroneDownLink(DroneDownLink.ID, "hatch.dronedownlink", "Drone DownLink Module", 5) + .getStackForm(1)); + ItemList.Hatch_DataAccess_EV.set( + new MTEHatchDataAccess(DATA_ACCESS_HATCH.ID, "hatch.dataaccess", "Data Access Hatch", 4).getStackForm(1L)); + ItemList.Hatch_DataAccess_LuV.set( + new MTEHatchDataAccess( + ADVANCED_DATA_ACCESS_HATCH.ID, + "hatch.dataaccess.adv", + "Advanced Data Access Hatch", + 6).getStackForm(1L)); + ItemList.Hatch_DataAccess_UV.set( + new MTEHatchDataAccess( + AUTOMATABLE_DATA_ACCESS_HATCH.ID, + "hatch.dataaccess.auto", + "Automatable Data Access Hatch", + 8).getStackForm(1L)); + ItemList.Hatch_HeatSensor + .set(new MTEHeatSensor(HEAT_DETECTOR_HATCH.ID, "hatch.heatsensor", "Heat Sensor Hatch", 7).getStackForm(1)); + ItemList.Hatch_pHSensor + .set(new MTEHatchPHSensor(HATCH_PH_SENSOR.ID, "hatch.phsensor", "pH Sensor Hatch", 7).getStackForm(1)); + ItemList.Hatch_LensHousing + .set(new MTEHatchLensHousing(HATCH_LENS_HOUSING.ID, "hatch.lenshousing", "Lens Housing").getStackForm(1L)); + ItemList.Hatch_LensIndicator.set( + new MTEHatchLensIndicator(HATCH_LENS_INDICATOR.ID, "hatch.lensindicator", "Lens Indicator Hatch", 8) + .getStackForm(1L)); + generateWiresAndPipes(); + } + + private static void generateItemPipes(Materials aMaterial, String name, int startID, int baseInvSlots) { + generateItemPipes( + aMaterial, + name, + GTLanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName, + startID, + baseInvSlots); + } + + private static void generateItemPipes(Materials aMaterial, String name, String displayName, int startID, + int baseInvSlots) { + GTOreDictUnificator.registerOre( + OrePrefixes.pipeMedium.get(aMaterial), + new MTEItem( + startID, + "GT_Pipe_" + name, + displayName + " Item Pipe", + 0.50F, + aMaterial, + baseInvSlots, + 32768 / baseInvSlots, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeLarge.get(aMaterial), + new MTEItem( + startID + 1, + "GT_Pipe_" + name + "_Large", + "Large " + displayName + " Item Pipe", + 0.75F, + aMaterial, + baseInvSlots * 2, + 16384 / baseInvSlots, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeHuge.get(aMaterial), + new MTEItem( + startID + 2, + "GT_Pipe_" + name + "_Huge", + "Huge " + displayName + " Item Pipe", + 1.00F, + aMaterial, + baseInvSlots * 4, + 8192 / baseInvSlots, + false).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeRestrictiveMedium.get(aMaterial), + new MTEItem( + startID + 3, + "GT_Pipe_Restrictive_" + name, + "Restrictive " + displayName + " Item Pipe", + 0.50F, + aMaterial, + baseInvSlots, + 3276800 / baseInvSlots, + true).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeRestrictiveLarge.get(aMaterial), + new MTEItem( + startID + 4, + "GT_Pipe_Restrictive_" + name + "_Large", + "Large Restrictive " + displayName + " Item Pipe", + 0.75F, + aMaterial, + baseInvSlots * 2, + 1638400 / baseInvSlots, + true).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeRestrictiveHuge.get(aMaterial), + new MTEItem( + startID + 5, + "GT_Pipe_Restrictive_" + name + "_Huge", + "Huge Restrictive " + displayName + " Item Pipe", + 0.875F, + aMaterial, + baseInvSlots * 4, + 819200 / baseInvSlots, + true).getStackForm(1L)); + } + + @SuppressWarnings("SameParameterValue") + private static void generateFluidPipes(Materials aMaterial, String name, int startID, int baseCapacity, + int heatCapacity, boolean gasProof) { + generateFluidPipes( + aMaterial, + name, + GTLanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName, + startID, + baseCapacity, + heatCapacity, + gasProof); + } + + private static void generateFluidPipes(Materials aMaterial, String name, String displayName, int startID, + int baseCapacity, int heatCapacity, boolean gasProof) { + GTOreDictUnificator.registerOre( + OrePrefixes.pipeTiny.get(aMaterial), + new MTEFluid( + startID, + "GT_Pipe_" + name + "_Tiny", + "Tiny " + displayName + " Fluid Pipe", + 0.25F, + aMaterial, + baseCapacity / 6, + heatCapacity, + gasProof).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeSmall.get(aMaterial), + new MTEFluid( + startID + 1, + "GT_Pipe_" + name + "_Small", + "Small " + displayName + " Fluid Pipe", + 0.375F, + aMaterial, + baseCapacity / 3, + heatCapacity, + gasProof).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeMedium.get(aMaterial), + new MTEFluid( + startID + 2, + "GT_Pipe_" + name, + displayName + " Fluid Pipe", + 0.5F, + aMaterial, + baseCapacity, + heatCapacity, + gasProof).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeLarge.get(aMaterial), + new MTEFluid( + startID + 3, + "GT_Pipe_" + name + "_Large", + "Large " + displayName + " Fluid Pipe", + 0.75F, + aMaterial, + baseCapacity * 2, + heatCapacity, + gasProof).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeHuge.get(aMaterial), + new MTEFluid( + startID + 4, + "GT_Pipe_" + name + "_Huge", + "Huge " + displayName + " Fluid Pipe", + 0.875F, + aMaterial, + baseCapacity * 4, + heatCapacity, + gasProof).getStackForm(1L)); + } + + @SuppressWarnings("SameParameterValue") + private static void generateFluidMultiPipes(Materials aMaterial, String name, int startID, int baseCapacity, + int heatCapacity, boolean gasProof) { + generateFluidMultiPipes(aMaterial, name, "%material", startID, baseCapacity, heatCapacity, gasProof); + } + + private static void generateFluidMultiPipes(Materials aMaterial, String name, String displayName, int startID, + int baseCapacity, int heatCapacity, boolean gasProof) { + GTOreDictUnificator.registerOre( + OrePrefixes.pipeQuadruple.get(aMaterial), + new MTEFluid( + startID, + "GT_Pipe_" + name + "_Quadruple", + "Quadruple " + displayName + " Fluid Pipe", + 1.0F, + aMaterial, + baseCapacity, + heatCapacity, + gasProof, + 4).getStackForm(1L)); + GTOreDictUnificator.registerOre( + OrePrefixes.pipeNonuple.get(aMaterial), + new MTEFluid( + startID + 1, + "GT_Pipe_" + name + "_Nonuple", + "Nonuple " + displayName + " Fluid Pipe", + 1.0F, + aMaterial, + baseCapacity / 3, + heatCapacity, + gasProof, + 9).getStackForm(1L)); + } +} diff --git a/src/main/java/gregtech/loaders/preload/LoaderOreProcessing.java b/src/main/java/gregtech/loaders/preload/LoaderOreProcessing.java new file mode 100644 index 0000000000..f38bbd6b76 --- /dev/null +++ b/src/main/java/gregtech/loaders/preload/LoaderOreProcessing.java @@ -0,0 +1,111 @@ +package gregtech.loaders.preload; + +import gregtech.api.util.GTLog; +import gregtech.loaders.oreprocessing.ProcessingAll; +import gregtech.loaders.oreprocessing.ProcessingBeans; +import gregtech.loaders.oreprocessing.ProcessingBlock; +import gregtech.loaders.oreprocessing.ProcessingBolt; +import gregtech.loaders.oreprocessing.ProcessingCell; +import gregtech.loaders.oreprocessing.ProcessingCircuit; +import gregtech.loaders.oreprocessing.ProcessingCompressed; +import gregtech.loaders.oreprocessing.ProcessingCrafting; +import gregtech.loaders.oreprocessing.ProcessingCrop; +import gregtech.loaders.oreprocessing.ProcessingCrushedOre; +import gregtech.loaders.oreprocessing.ProcessingCrystallized; +import gregtech.loaders.oreprocessing.ProcessingDirty; +import gregtech.loaders.oreprocessing.ProcessingDust; +import gregtech.loaders.oreprocessing.ProcessingDye; +import gregtech.loaders.oreprocessing.ProcessingFineWire; +import gregtech.loaders.oreprocessing.ProcessingFoil; +import gregtech.loaders.oreprocessing.ProcessingFood; +import gregtech.loaders.oreprocessing.ProcessingGear; +import gregtech.loaders.oreprocessing.ProcessingGem; +import gregtech.loaders.oreprocessing.ProcessingIngot; +import gregtech.loaders.oreprocessing.ProcessingItem; +import gregtech.loaders.oreprocessing.ProcessingLens; +import gregtech.loaders.oreprocessing.ProcessingLog; +import gregtech.loaders.oreprocessing.ProcessingNugget; +import gregtech.loaders.oreprocessing.ProcessingOre; +import gregtech.loaders.oreprocessing.ProcessingOrePoor; +import gregtech.loaders.oreprocessing.ProcessingOreSmelting; +import gregtech.loaders.oreprocessing.ProcessingPipe; +import gregtech.loaders.oreprocessing.ProcessingPlank; +import gregtech.loaders.oreprocessing.ProcessingPlate; +import gregtech.loaders.oreprocessing.ProcessingPure; +import gregtech.loaders.oreprocessing.ProcessingRawOre; +import gregtech.loaders.oreprocessing.ProcessingRecycling; +import gregtech.loaders.oreprocessing.ProcessingRotor; +import gregtech.loaders.oreprocessing.ProcessingRound; +import gregtech.loaders.oreprocessing.ProcessingSand; +import gregtech.loaders.oreprocessing.ProcessingSaplings; +import gregtech.loaders.oreprocessing.ProcessingScrew; +import gregtech.loaders.oreprocessing.ProcessingShaping; +import gregtech.loaders.oreprocessing.ProcessingSlab; +import gregtech.loaders.oreprocessing.ProcessingStick; +import gregtech.loaders.oreprocessing.ProcessingStickLong; +import gregtech.loaders.oreprocessing.ProcessingStone; +import gregtech.loaders.oreprocessing.ProcessingStoneCobble; +import gregtech.loaders.oreprocessing.ProcessingStoneVarious; +import gregtech.loaders.oreprocessing.ProcessingToolHead; +import gregtech.loaders.oreprocessing.ProcessingToolOther; +import gregtech.loaders.oreprocessing.ProcessingTransforming; +import gregtech.loaders.oreprocessing.ProcessingWax; +import gregtech.loaders.oreprocessing.ProcessingWire; + +public class LoaderOreProcessing implements Runnable { + + @Override + public void run() { + GTLog.out.println("GTMod: Register Ore processing."); + new ProcessingAll(); + new ProcessingBeans(); + new ProcessingBlock(); + new ProcessingBolt(); + new ProcessingCell(); + new ProcessingCircuit(); + new ProcessingCompressed(); + new ProcessingCrafting(); + new ProcessingCrop(); + new ProcessingCrushedOre(); + new ProcessingCrystallized(); + new ProcessingDirty(); + new ProcessingDust(); + new ProcessingDye(); + new ProcessingFoil(); + new ProcessingFineWire(); + new ProcessingFood(); + new ProcessingLens(); + new ProcessingShaping(); + new ProcessingGem(); + new ProcessingGear(); + new ProcessingIngot(); + new ProcessingItem(); + new ProcessingLog(); + new ProcessingTransforming(); + new ProcessingNugget(); + new ProcessingOre(); + new ProcessingOrePoor(); + new ProcessingOreSmelting(); + new ProcessingRawOre(); + new ProcessingPipe(); + new ProcessingPlank(); + new ProcessingPlate(); + new ProcessingPure(); + new ProcessingRecycling(); + new ProcessingRound(); + new ProcessingRotor(); + new ProcessingSand(); + new ProcessingSaplings(); + new ProcessingScrew(); + new ProcessingSlab(); + new ProcessingStick(); + new ProcessingStickLong(); + new ProcessingStone(); + new ProcessingStoneCobble(); + new ProcessingStoneVarious(); + new ProcessingToolHead(); + new ProcessingToolOther(); + new ProcessingWax(); + new ProcessingWire(); + } +} diff --git a/src/main/java/gregtech/mixin/Mixin.java b/src/main/java/gregtech/mixin/Mixin.java index 3e0ad23f0a..459b69865d 100644 --- a/src/main/java/gregtech/mixin/Mixin.java +++ b/src/main/java/gregtech/mixin/Mixin.java @@ -12,8 +12,7 @@ import java.util.function.Supplier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler; - +import bartworks.common.configs.ConfigHandler; import cpw.mods.fml.relauncher.FMLLaunchHandler; public enum Mixin { diff --git a/src/main/java/gregtech/nei/GTNEIConfig.java b/src/main/java/gregtech/nei/GTNEIConfig.java new file mode 100644 index 0000000000..211f8251dc --- /dev/null +++ b/src/main/java/gregtech/nei/GTNEIConfig.java @@ -0,0 +1,183 @@ +package gregtech.nei; + +import java.util.Collection; +import java.util.Comparator; +import java.util.Map; + +import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ListMultimap; + +import codechicken.nei.api.API; +import codechicken.nei.api.IConfigureNEI; +import codechicken.nei.event.NEIRegisterHandlerInfosEvent; +import codechicken.nei.recipe.GuiCraftingRecipe; +import codechicken.nei.recipe.GuiUsageRecipe; +import codechicken.nei.recipe.HandlerInfo; +import codechicken.nei.recipe.TemplateRecipeHandler; +import cpw.mods.fml.common.event.FMLInterModComms; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.RecipeMapWorkable; +import gregtech.api.recipe.RecipeCategory; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GTModHandler; +import gregtech.common.items.MetaGeneratedItem01; +import gregtech.common.items.MetaGeneratedItem02; +import gregtech.common.items.MetaGeneratedItem03; +import gregtech.nei.dumper.BatchModeSupportDumper; +import gregtech.nei.dumper.InputSeparationSupportDumper; +import gregtech.nei.dumper.MaterialDumper; +import gregtech.nei.dumper.MetaItemDumper; +import gregtech.nei.dumper.MetaTileEntityDumper; +import gregtech.nei.dumper.RecipeLockingSupportDumper; +import gregtech.nei.dumper.VoidProtectionSupportDumper; + +public class GTNEIConfig implements IConfigureNEI { + + /** + * This map determines the order in which NEI handlers will be registered and displayed in tabs. + * + *

+ * Handlers will be displayed in ascending order of integer value. Any recipe map that is not present in this map + * will be assigned a value of 0. Negative values are fine. + */ + private static final ImmutableMap, Integer> RECIPE_MAP_ORDERING = ImmutableMap + ., Integer>builder() + .put(RecipeMaps.assemblylineVisualRecipes, 1) + .put(RecipeMaps.scannerFakeRecipes, 2) + .build(); + + private static final Comparator RECIPE_MAP_HANDLER_COMPARATOR = Comparator + .comparingInt(handler -> RECIPE_MAP_ORDERING.getOrDefault(handler.getRecipeMap(), 0)); + + private static ListMultimap RECIPE_CATALYST_INDEX; + + public static boolean sIsAdded = true; + + private static void addHandler(TemplateRecipeHandler handler) { + FMLInterModComms.sendRuntimeMessage( + GTValues.GT, + "NEIPlugins", + "register-crafting-handler", + "gregtech@" + handler.getRecipeName() + "@" + handler.getOverlayIdentifier()); + GuiCraftingRecipe.craftinghandlers.add(handler); + GuiUsageRecipe.usagehandlers.add(handler); + } + + @Override + public void loadConfig() { + sIsAdded = false; + registerHandlers(); + registerCatalysts(); + registerItemEntries(); + registerDumpers(); + sIsAdded = true; + } + + private void registerHandlers() { + RecipeCategory.ALL_RECIPE_CATEGORIES.values() + .stream() + .filter( + recipeCategory -> recipeCategory.recipeMap.getFrontend() + .getNEIProperties().registerNEI) + .map(GTNEIDefaultHandler::new) + .sorted(RECIPE_MAP_HANDLER_COMPARATOR) + .forEach(GTNEIConfig::addHandler); + } + + private void registerCatalysts() { + for (Map.Entry> entry : RECIPE_CATALYST_INDEX.asMap() + .entrySet()) { + entry.getValue() + .forEach( + recipeMapWorkable -> API.addRecipeCatalyst( + recipeMapWorkable.getStackForm(1), + entry.getKey().unlocalizedName, + recipeMapWorkable.getRecipeCatalystPriority())); + } + API.addRecipeCatalyst( + GTModHandler.getIC2Item("nuclearReactor", 1, null), + RecipeMaps.ic2NuclearFakeRecipes.unlocalizedName); + } + + private void registerItemEntries() { + API.addItemListEntry(ItemList.VOLUMETRIC_FLASK.get(1)); + } + + private void registerDumpers() { + API.addOption(new MetaTileEntityDumper()); + API.addOption(new MaterialDumper()); + API.addOption(new MetaItemDumper(MetaGeneratedItem01.INSTANCE, "metaitem01")); + API.addOption(new MetaItemDumper(MetaGeneratedItem02.INSTANCE, "metaitem02")); + API.addOption(new MetaItemDumper(MetaGeneratedItem03.INSTANCE, "metaitem03")); + API.addOption(new VoidProtectionSupportDumper()); + API.addOption(new InputSeparationSupportDumper()); + API.addOption(new BatchModeSupportDumper()); + API.addOption(new RecipeLockingSupportDumper()); + } + + @SubscribeEvent + public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) { + if (RECIPE_CATALYST_INDEX == null) { + // This method will be called earlier than #loadConfig + generateRecipeCatalystIndex(); + } + RecipeCategory.ALL_RECIPE_CATEGORIES.values() + .forEach(recipeCategory -> { + HandlerInfo.Builder builder = createHandlerInfoBuilderTemplate(recipeCategory); + HandlerInfo handlerInfo; + if (recipeCategory.handlerInfoCreator != null) { + handlerInfo = recipeCategory.handlerInfoCreator.apply(builder) + .build(); + } else { + // Infer icon from recipe catalysts + RECIPE_CATALYST_INDEX.get(recipeCategory) + .stream() + .findFirst() + .ifPresent(catalyst -> builder.setDisplayStack(catalyst.getStackForm(1))); + handlerInfo = builder.build(); + } + event.registerHandlerInfo(handlerInfo); + }); + } + + private HandlerInfo.Builder createHandlerInfoBuilderTemplate(RecipeCategory recipeCategory) { + return new HandlerInfo.Builder( + recipeCategory.unlocalizedName, + recipeCategory.ownerMod.getName(), + recipeCategory.ownerMod.getModId()).setShiftY(6) + .setHeight(135) + .setMaxRecipesPerPage(2); + } + + private static void generateRecipeCatalystIndex() { + ImmutableListMultimap.Builder builder = new ImmutableListMultimap.Builder<>(); + builder + .orderValuesBy(Comparator.comparing(recipeMapWorkable -> -recipeMapWorkable.getRecipeCatalystPriority())); + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + IMetaTileEntity mte = GregTechAPI.METATILEENTITIES[i]; + if (!(mte instanceof RecipeMapWorkable recipeMapWorkable)) continue; + for (RecipeMap recipeMap : recipeMapWorkable.getAvailableRecipeMaps()) { + for (RecipeCategory recipeCategory : recipeMap.getAssociatedCategories()) { + builder.put(recipeCategory, recipeMapWorkable); + } + } + } + RECIPE_CATALYST_INDEX = builder.build(); + } + + @Override + public String getName() { + return "GregTech NEI Plugin"; + } + + @Override + public String getVersion() { + return "(5.03a)"; + } +} diff --git a/src/main/java/gregtech/nei/GTNEIDefaultHandler.java b/src/main/java/gregtech/nei/GTNEIDefaultHandler.java new file mode 100644 index 0000000000..3887ad321b --- /dev/null +++ b/src/main/java/gregtech/nei/GTNEIDefaultHandler.java @@ -0,0 +1,801 @@ +package gregtech.nei; + +import static gregtech.api.enums.GTValues.V; + +import java.awt.Rectangle; +import java.lang.ref.SoftReference; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.Range; +import org.lwjgl.opengl.GL11; + +import com.gtnewhorizons.modularui.api.GlStateManager; +import com.gtnewhorizons.modularui.api.UIInfos; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import codechicken.nei.NEIClientUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.ICraftingHandler; +import codechicken.nei.recipe.IUsageHandler; +import codechicken.nei.recipe.RecipeCatalysts; +import codechicken.nei.recipe.TemplateRecipeHandler; +import gregtech.GTMod; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SteamVariant; +import gregtech.api.gui.GUIColorOverride; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.overclockdescriber.EUNoOverclockDescriber; +import gregtech.api.objects.overclockdescriber.OverclockDescriber; +import gregtech.api.recipe.BasicUIProperties; +import gregtech.api.recipe.NEIRecipeProperties; +import gregtech.api.recipe.RecipeCategory; +import gregtech.api.recipe.RecipeCategorySetting; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMapFrontend; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTRecipe; +import gregtech.api.util.GTUtility; +import gregtech.api.util.OverclockCalculator; +import gregtech.common.blocks.ItemMachines; +import gregtech.common.gui.modularui.UIHelper; + +public class GTNEIDefaultHandler extends TemplateRecipeHandler { + + private static final int offsetX = 5; + private static final int offsetY = 11; + protected static final Pos2d WINDOW_OFFSET = new Pos2d(-offsetX, -offsetY); + + private static final ConcurrentMap CACHE = new ConcurrentHashMap<>(); + + private static final int RECIPE_NAME_WIDTH = 140; + + /** + * Static version of {@link TemplateRecipeHandler#cycleticks}. Can be referenced from cached recipes. + */ + private static int cycleTicksStatic = Math.abs((int) System.currentTimeMillis()); + /** + * Basically {@link #cycleTicksStatic} but always updated even while holding shift + */ + private static int drawTicks; + private static final int PROGRESSBAR_CYCLE_TICKS = 200; + + protected final RecipeCategory recipeCategory; + protected final RecipeMap recipeMap; + protected final RecipeMapFrontend frontend; + protected final BasicUIProperties uiProperties; + protected final NEIRecipeProperties neiProperties; + + protected final ModularWindow modularWindow; + protected final ItemStackHandler itemInputsInventory; + protected final ItemStackHandler itemOutputsInventory; + protected final ItemStackHandler specialSlotInventory; + protected final ItemStackHandler fluidInputsInventory; + protected final ItemStackHandler fluidOutputsInventory; + + protected OverclockDescriber overclockDescriber; + /** + * Localized name of this handler displayed on the top. + */ + private String recipeNameDisplay; + /** + * Tooltip shown while hovering over header of this handler. Can be null if the full name fits in the screen. + */ + private NEIHandlerAbsoluteTooltip recipeNameTooltip; + + protected final GUIColorOverride colorOverride = GUIColorOverride + .get(GTUITextures.BACKGROUND_NEI_SINGLE_RECIPE.location); + private int neiTextColorOverride = -1; + + public GTNEIDefaultHandler(RecipeCategory recipeCategory) { + this.recipeCategory = recipeCategory; + this.recipeMap = recipeCategory.recipeMap; + this.frontend = recipeMap.getFrontend(); + this.uiProperties = frontend.getUIProperties(); + this.neiProperties = frontend.getNEIProperties(); + uiProperties.neiTransferRect.forEach(transferRect -> { + transferRect = new Rectangle(transferRect); + transferRect.translate(WINDOW_OFFSET.x, WINDOW_OFFSET.y); + this.transferRects.add(new RecipeTransferRect(transferRect, recipeMap.unlocalizedName)); + }); + + ModularWindow.Builder builder = frontend.createNEITemplate( + itemInputsInventory = new ItemStackHandler(uiProperties.maxItemInputs), + itemOutputsInventory = new ItemStackHandler(uiProperties.maxItemOutputs), + specialSlotInventory = new ItemStackHandler(1), + fluidInputsInventory = new ItemStackHandler(uiProperties.maxFluidInputs), + fluidOutputsInventory = new ItemStackHandler(uiProperties.maxFluidOutputs), + () -> ((float) getDrawTicks() % PROGRESSBAR_CYCLE_TICKS) / PROGRESSBAR_CYCLE_TICKS, + WINDOW_OFFSET); + modularWindow = builder.build(); + UIInfos.initializeWindow(Minecraft.getMinecraft().thePlayer, modularWindow); + } + + public RecipeMap getRecipeMap() { + return recipeMap; + } + + private SortedRecipeListCache getCacheHolder() { + return CACHE.computeIfAbsent(recipeCategory, m -> new SortedRecipeListCache()); + } + + public List getCache() { + SortedRecipeListCache cacheHolder = getCacheHolder(); + List cache; + if (cacheHolder.getCachedRecipesVersion() != GTMod.gregtechproxy.getNEIReloadCount() + || (cache = cacheHolder.getCachedRecipes()) == null) { + try { + RecipeCategory defaultCategory = recipeMap.getDefaultRecipeCategory(); + Collection recipes; + if (this.recipeCategory == defaultCategory) { + // This is main category, so merge categories that are configured as such + Stream recipesToMerge = recipeMap.getBackend() + .getRecipeCategoryMap() + .entrySet() + .stream() + .flatMap(entry -> { + boolean merge = entry.getKey() != defaultCategory + && GTMod.gregtechproxy.recipeCategorySettings + .getOrDefault(entry.getKey(), RecipeCategorySetting.getDefault()) + == RecipeCategorySetting.MERGE; + return merge ? entry.getValue() + .stream() : Stream.empty(); + }); + recipes = Stream.concat( + recipesToMerge, + recipeMap.getBackend() + .getRecipesByCategory(defaultCategory) + .stream()) + .collect(Collectors.toList()); + } else { + // This is "sub" category + if (GTMod.gregtechproxy.recipeCategorySettings + .getOrDefault(recipeCategory, RecipeCategorySetting.getDefault()) + == RecipeCategorySetting.ENABLE) { + recipes = recipeMap.getBackend() + .getRecipesByCategory(recipeCategory); + } else { + recipes = Collections.emptyList(); + } + } + cache = recipes.stream() // do not use parallel stream. This is already parallelized by NEI + .filter(r -> !r.mHidden) + .sorted(neiProperties.comparator) + .map(CachedDefaultRecipe::new) + .collect(Collectors.toList()); + // while the NEI parallelize handlers, for each individual handler it still uses sequential execution + // model, + // so we do not need any synchronization here + // even if it does break, at worst case it's just recreating the cache multiple times, which should be + // fine + cacheHolder.setCachedRecipes(cache); + cacheHolder.setCachedRecipesVersion(GTMod.gregtechproxy.getNEIReloadCount()); + } catch (Exception e) { + throw new RuntimeException( + "Could not construct GT NEI Handler cache for category " + recipeCategory + + ", display name " + + recipeNameDisplay, + e); + } + } + return cache; + } + + @Override + public TemplateRecipeHandler newInstance() { + return new GTNEIDefaultHandler(recipeCategory); + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(recipeMap.unlocalizedName)) { + if (results.length > 0 && results[0] instanceof OverclockDescriber) { + overclockDescriber = (OverclockDescriber) results[0]; + if (neiProperties.useCustomFilter) { + loadTieredRecipesWithCustomFilter(overclockDescriber); + } else { + loadTieredRecipesUpTo(overclockDescriber.getTier()); + } + } else { + arecipes.addAll(getCache()); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack aResult) { + ItemData tPrefixMaterial = GTOreDictUnificator.getAssociation(aResult); + + ArrayList tResults = new ArrayList<>(); + tResults.add(aResult); + tResults.add(GTOreDictUnificator.get(true, aResult)); + if ((tPrefixMaterial != null) && (!tPrefixMaterial.mBlackListed) + && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) { + for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) { + tResults.add(GTOreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L)); + } + } + if (aResult.getUnlocalizedName() + .startsWith("gt.blockores")) { + for (int i = 0; i < 8; i++) { + tResults.add(new ItemStack(aResult.getItem(), 1, aResult.getItemDamage() % 1000 + i * 1000)); + } + } + addFluidStacks(aResult, tResults); + for (CachedDefaultRecipe recipe : getCache()) { + if (tResults.stream() + .anyMatch(stack -> recipe.contains(recipe.mOutputs, stack))) arecipes.add(recipe); + } + } + + private void addFluidStacks(ItemStack aStack, ArrayList tResults) { + FluidStack tFluid = GTUtility.getFluidForFilledItem(aStack, true); + FluidStack tFluidStack; + if (tFluid != null) { + tFluidStack = tFluid; + tResults.add(GTUtility.getFluidDisplayStack(tFluid, false)); + } else tFluidStack = GTUtility.getFluidFromDisplayStack(aStack); + if (tFluidStack != null) { + tResults.addAll(GTUtility.getContainersFromFluid(tFluidStack)); + } + } + + private void loadTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) { + arecipes.addAll(getTieredRecipesWithCustomFilter(overclockDescriber)); + } + + private List getTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) { + List recipes = getCache(); + if (!recipes.isEmpty()) { + recipes = recipes.stream() + .filter(recipe -> overclockDescriber.canHandle(recipe.mRecipe)) + .collect(Collectors.toList()); + } + return recipes; + } + + private void loadTieredRecipesUpTo(byte upperTier) { + arecipes.addAll(getTieredRecipes(upperTier)); + } + + private List getTieredRecipes(byte upperTier) { + List recipes = getCache(); + if (!recipes.isEmpty()) { + Range indexRange = getCacheHolder().getIndexRangeForTiers((byte) 0, upperTier); + recipes = recipes.subList(indexRange.getMinimum(), indexRange.getMaximum() + 1); + } + return recipes; + } + + @Override + public void loadUsageRecipes(ItemStack aInput) { + ItemData tPrefixMaterial = GTOreDictUnificator.getAssociation(aInput); + ArrayList tInputs = new ArrayList<>(); + tInputs.add(aInput); + tInputs.add(GTOreDictUnificator.get(false, aInput)); + if ((tPrefixMaterial != null) && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) { + for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) { + tInputs.add(GTOreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L)); + } + } + addFluidStacks(aInput, tInputs); + for (CachedDefaultRecipe recipe : getCache()) { + if (tInputs.stream() + .anyMatch(stack -> recipe.contains(recipe.mInputs, stack))) arecipes.add(recipe); + } + } + + @Override + public IUsageHandler getUsageAndCatalystHandler(String inputId, Object... ingredients) { + if (inputId.equals("item")) { + ItemStack candidate = (ItemStack) ingredients[0]; + GTNEIDefaultHandler handler = (GTNEIDefaultHandler) newInstance(); + if (RecipeCatalysts.containsCatalyst(handler, candidate)) { + IMetaTileEntity metaTile = ItemMachines.getMetaTileEntity(candidate); + OverclockDescriber overclockDescriber; + if (metaTile instanceof IOverclockDescriptionProvider provider) { + overclockDescriber = provider.getOverclockDescriber(); + } else { + overclockDescriber = null; + } + handler.loadCraftingRecipes(recipeMap.unlocalizedName, overclockDescriber); + return handler; + } + } + return this.getUsageHandler(inputId, ingredients); + } + + @Override + public ICraftingHandler getRecipeHandler(String outputId, Object... results) { + GTNEIDefaultHandler handler = (GTNEIDefaultHandler) super.getRecipeHandler(outputId, results); + if (results.length > 0 && results[0] instanceof OverclockDescriber) { + handler.overclockDescriber = (OverclockDescriber) results[0]; + } + return handler; + } + + @Override + public String getOverlayIdentifier() { + return recipeCategory.unlocalizedName; + } + + @Override + public void drawBackground(int recipe) { + drawUI(modularWindow); + } + + @Override + public void drawForeground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GL11.glDisable(GL11.GL_LIGHTING); + drawExtras(recipe); + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (!NEIClientUtils.shiftKey()) cycleTicksStatic++; + drawTicks++; + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public String getRecipeName() { + if (recipeNameDisplay == null) { + recipeNameDisplay = computeRecipeName(); + neiTextColorOverride = colorOverride.getTextColorOrDefault("nei", -1); + } + return recipeNameDisplay; + } + + private String computeRecipeName() { + String recipeName = StatCollector.translateToLocal(recipeCategory.unlocalizedName); + if (overclockDescriber != null) { + String suffix = "(" + overclockDescriber.getTierString() + ")"; + // Space will be cropped if title exceeds + return shrinkRecipeName(recipeName + " ", suffix); + } else { + return shrinkRecipeName(recipeName, ""); + } + } + + private String shrinkRecipeName(final String originalRecipeName, final String suffix) { + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + int suffixWidth = fontRenderer.getStringWidth(suffix); + if (fontRenderer.getStringWidth(originalRecipeName) + suffixWidth <= RECIPE_NAME_WIDTH) { + return originalRecipeName + suffix; + } + + final String ellipsis = "..."; + final int ellipsisWidth = fontRenderer.getStringWidth(ellipsis); + String recipeName = originalRecipeName; + do { + recipeName = recipeName.substring(0, recipeName.length() - 1); + } while (fontRenderer.getStringWidth(recipeName) + ellipsisWidth + suffixWidth > RECIPE_NAME_WIDTH); + setupRecipeNameTooltip(originalRecipeName + suffix); + return recipeName + ellipsis + suffix; + } + + private void setupRecipeNameTooltip(String tooltip) { + recipeNameTooltip = new NEIHandlerAbsoluteTooltip(tooltip, new Rectangle(13, -34, RECIPE_NAME_WIDTH - 1, 11)); + } + + @Override + public String getRecipeTabName() { + return StatCollector.translateToLocal(recipeCategory.unlocalizedName); + } + + @Override + public String getGuiTexture() { + // not called + return ""; + } + + @Override + public List handleItemTooltip(GuiRecipe gui, ItemStack aStack, List currentTip, + int aRecipeIndex) { + if (recipeNameTooltip != null) { + recipeNameTooltip.handleTooltip(currentTip, aRecipeIndex); + } + if (aStack == null) { + return currentTip; + } + + CachedRecipe tObject = this.arecipes.get(aRecipeIndex); + if (tObject instanceof CachedDefaultRecipe) { + currentTip = frontend.handleNEIItemTooltip(aStack, currentTip, (CachedDefaultRecipe) tObject); + } + return currentTip; + } + + @Override + public void drawExtras(int aRecipeIndex) { + CachedDefaultRecipe cachedRecipe = ((CachedDefaultRecipe) this.arecipes.get(aRecipeIndex)); + + drawDescription(cachedRecipe); + frontend.drawNEIOverlays(cachedRecipe); + } + + private void drawDescription(CachedDefaultRecipe cachedRecipe) { + GTRecipe recipe = cachedRecipe.mRecipe; + if (overclockDescriber == null) { + // By default, assume generic LV EU with no overclocks + overclockDescriber = new EUNoOverclockDescriber((byte) 1, uiProperties.amperage); + } + + OverclockCalculator calculator = overclockDescriber.createCalculator( + new OverclockCalculator().setRecipeEUt(recipe.mEUt) + .setDuration(recipe.mDuration), + recipe); + calculator.calculate(); + + frontend.drawDescription( + new RecipeDisplayInfo( + recipe, + recipeMap, + overclockDescriber, + calculator, + getDescriptionYOffset(), + neiTextColorOverride)); + } + + protected int getDescriptionYOffset() { + return neiProperties.recipeBackgroundSize.height + neiProperties.recipeBackgroundOffset.y + WINDOW_OFFSET.y + 3; + } + + protected void drawUI(ModularWindow window) { + for (IDrawable background : window.getBackground()) { + GlStateManager.pushMatrix(); + GlStateManager.translate( + WINDOW_OFFSET.x + neiProperties.recipeBackgroundOffset.x, + WINDOW_OFFSET.y + neiProperties.recipeBackgroundOffset.y, + 0); + GlStateManager.color(1f, 1f, 1f, 1f); + background.draw(Pos2d.ZERO, window.getSize(), 0); + GlStateManager.popMatrix(); + } + + for (Widget widget : window.getChildren()) { + // NEI already did translation, so we can't use Widget#drawInternal here + GlStateManager.pushMatrix(); + GlStateManager.translate(widget.getPos().x, widget.getPos().y, 0); + GlStateManager.color(1, 1, 1, window.getAlpha()); + GlStateManager.enableBlend(); + + // maybe we can use Minecraft#timer but none of the IDrawables use partialTicks + widget.drawBackground(0); + + // noinspection OverrideOnly // It's either suppressing this warning or changing ModularUI + widget.draw(0); + GlStateManager.popMatrix(); + } + } + + public static int getDrawTicks() { + return drawTicks; + } + + public static class FixedPositionedStack extends PositionedStack { + + public static final DecimalFormat chanceFormat = new DecimalFormat("##0.##%"); + public final int mChance; + public final int realStackSize; + public final boolean renderRealStackSize; + + public FixedPositionedStack(Object object, boolean renderRealStackSizes, int x, int y) { + this(object, renderRealStackSizes, x, y, 0, true); + } + + public FixedPositionedStack(Object object, boolean renderRealStackSizes, int x, int y, boolean aUnificate) { + this(object, renderRealStackSizes, x, y, 0, aUnificate); + } + + public FixedPositionedStack(Object object, boolean renderRealStackSize, int x, int y, int aChance, + boolean aUnificate) { + super(aUnificate ? GTOreDictUnificator.getNonUnifiedStacks(object) : object, x, y, true); + this.mChance = aChance; + realStackSize = item != null ? item.stackSize : 0; + this.renderRealStackSize = renderRealStackSize; + if (!renderRealStackSize) { + for (ItemStack stack : items) { + stack.stackSize = 1; + } + } + } + + public boolean isChanceBased() { + return mChance > 0 && mChance < 10000; + } + + public String getChanceText() { + return chanceFormat.format((float) mChance / 10000); + } + + public boolean isNotConsumed() { + return !isFluid() && item.stackSize == 0; + } + + public boolean isFluid() { + return ItemList.Display_Fluid.isStackEqual(item, true, true); + } + } + + public class CachedDefaultRecipe extends TemplateRecipeHandler.CachedRecipe { + + public final GTRecipe mRecipe; + public final List mOutputs; + public final List mInputs; + + public CachedDefaultRecipe(GTRecipe aRecipe) { + super(); + this.mRecipe = aRecipe; + mOutputs = new ArrayList<>(); + mInputs = new ArrayList<>(); + + for (Widget child : modularWindow.getChildren()) { + if (child instanceof SlotWidget widget) { + if (widget.getMcSlot() + .getItemHandler() == itemInputsInventory) { + int i = widget.getMcSlot() + .getSlotIndex(); + Object input = aRecipe instanceof GTRecipe.GTRecipe_WithAlt + ? ((GTRecipe.GTRecipe_WithAlt) aRecipe).getAltRepresentativeInput(i) + : aRecipe.getRepresentativeInput(i); + if (input != null) { + mInputs.add( + new FixedPositionedStack( + input, + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + widget.getPos().x + 1, + widget.getPos().y + 1, + true)); + } + } else if (widget.getMcSlot() + .getItemHandler() == itemOutputsInventory) { + int i = widget.getMcSlot() + .getSlotIndex(); + ItemStack output = aRecipe.getRepresentativeOutput(i); + if (output != null) { + mOutputs.add( + new FixedPositionedStack( + output, + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + widget.getPos().x + 1, + widget.getPos().y + 1, + aRecipe.getOutputChance(i), + GTNEIDefaultHandler.this.neiProperties.unificateOutput)); + } + } else if (widget.getMcSlot() + .getItemHandler() == specialSlotInventory) { + if (aRecipe.mSpecialItems != null) { + mInputs.add( + new FixedPositionedStack( + aRecipe.mSpecialItems, + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + widget.getPos().x + 1, + widget.getPos().y + 1)); + } + + } else if (widget.getMcSlot() + .getItemHandler() == fluidInputsInventory) { + int i = widget.getMcSlot() + .getSlotIndex(); + if (aRecipe.mFluidInputs.length > i && aRecipe.mFluidInputs[i] != null + && aRecipe.mFluidInputs[i].getFluid() != null) { + mInputs.add( + new FixedPositionedStack( + GTUtility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true), + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + widget.getPos().x + 1, + widget.getPos().y + 1)); + } + } else if (widget.getMcSlot() + .getItemHandler() == fluidOutputsInventory) { + int i = widget.getMcSlot() + .getSlotIndex(); + if (aRecipe.mFluidOutputs.length > i && aRecipe.mFluidOutputs[i] != null + && aRecipe.mFluidOutputs[i].getFluid() != null) { + mOutputs.add( + new FixedPositionedStack( + GTUtility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true), + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + widget.getPos().x + 1, + widget.getPos().y + 1)); + } + } + } + } + + // items and fluids that exceed usual count + UIHelper.forEachSlots((i, backgrounds, pos) -> { + if (i >= GTNEIDefaultHandler.this.uiProperties.maxItemInputs && aRecipe.mInputs[i] != null) { + mInputs.add( + new FixedPositionedStack( + aRecipe.mInputs[i], + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + pos.x + 1, + pos.y + 1, + true)); + } + }, (i, backgrounds, pos) -> { + if (i >= GTNEIDefaultHandler.this.uiProperties.maxItemOutputs && aRecipe.mOutputs[i] != null) { + mOutputs.add( + new FixedPositionedStack( + aRecipe.mOutputs[i], + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + pos.x + 1, + pos.y + 1, + aRecipe.getOutputChance(i), + GTNEIDefaultHandler.this.neiProperties.unificateOutput)); + } + }, (i, backgrounds, pos) -> {}, (i, backgrounds, pos) -> { + if (i >= GTNEIDefaultHandler.this.uiProperties.maxFluidInputs && aRecipe.mFluidInputs[i] != null + && aRecipe.mFluidInputs[i].getFluid() != null) { + mInputs.add( + new FixedPositionedStack( + GTUtility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true), + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + pos.x + 1, + pos.y + 1)); + } + }, (i, backgrounds, pos) -> { + if (i >= GTNEIDefaultHandler.this.uiProperties.maxFluidOutputs && aRecipe.mFluidOutputs[i] != null + && aRecipe.mFluidOutputs[i].getFluid() != null) { + mOutputs.add( + new FixedPositionedStack( + GTUtility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true), + GTNEIDefaultHandler.this.neiProperties.renderRealStackSizes, + pos.x + 1, + pos.y + 1)); + } + }, + IDrawable.EMPTY, + IDrawable.EMPTY, + GTNEIDefaultHandler.this.frontend.getUIProperties(), + aRecipe.mInputs.length, + aRecipe.mOutputs.length, + aRecipe.mFluidInputs.length, + aRecipe.mFluidOutputs.length, + SteamVariant.NONE, + WINDOW_OFFSET); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleTicksStatic / 10, this.mInputs); + } + + @Override + public PositionedStack getResult() { + return null; + } + + @Override + public List getOtherStacks() { + return this.mOutputs; + } + } + + private class SortedRecipeListCache { + + private int mCachedRecipesVersion = -1; + + @Nullable + private SoftReference> mCachedRecipes; + + private Map> mTierIndexes; + private Range mTierRange; + + public int getCachedRecipesVersion() { + return mCachedRecipesVersion; + } + + public void setCachedRecipesVersion(int aCachedRecipesVersion) { + this.mCachedRecipesVersion = aCachedRecipesVersion; + } + + @Nullable + public List getCachedRecipes() { + return mCachedRecipes == null ? null : mCachedRecipes.get(); + } + + public void setCachedRecipes(@Nonnull List aCachedRecipes) { + this.mCachedRecipes = new SoftReference<>(aCachedRecipes); + } + + public Range getIndexRangeForTiers(byte lowerTier, byte upperTier) { + if (mTierIndexes == null) { + computeTierIndexes(); + } + return Range.between(getLowIndexForTier(lowerTier), getHighIndexForTier(upperTier)); + } + + private void computeTierIndexes() { + // Holds 16 elements without rehashing + mTierIndexes = new HashMap<>(V.length + 1, 1f); + assert mCachedRecipes != null; + Iterator iterator = Objects.requireNonNull(mCachedRecipes.get()) + .iterator(); + + int index = 0; + int minIndex = 0; + int maxIndex = -1; + byte previousTier = -1; + byte lowestTier = 0; + while (iterator.hasNext()) { + CachedDefaultRecipe recipe = iterator.next(); + byte recipeTier = GTUtility + .getTier(recipe.mRecipe.mEUt / GTNEIDefaultHandler.this.recipeMap.getAmperage()); + if (recipeTier != previousTier) { + if (maxIndex != -1) { + mTierIndexes.put(previousTier, Range.between(minIndex, maxIndex)); + } else { + lowestTier = recipeTier; + } + minIndex = index; + previousTier = recipeTier; + } + maxIndex = index; + index++; + if (!iterator.hasNext()) { + mTierIndexes.put(recipeTier, Range.between(minIndex, maxIndex)); + mTierRange = Range.between(lowestTier, recipeTier); + } + } + } + + private int getLowIndexForTier(byte lowerTier) { + byte lowTier = (byte) Math.max(mTierRange.getMinimum(), lowerTier); + while (mTierIndexes.get(lowTier) == null) { + lowTier++; + } + return mTierIndexes.get(lowTier) + .getMinimum(); + } + + private int getHighIndexForTier(byte upperTier) { + byte highTier = (byte) Math.min(mTierRange.getMaximum(), upperTier); + while (mTierIndexes.get(highTier) == null) { + highTier--; + } + return mTierIndexes.get(highTier) + .getMaximum(); + } + } +} diff --git a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java deleted file mode 100644 index 99e7dc5459..0000000000 --- a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java +++ /dev/null @@ -1,801 +0,0 @@ -package gregtech.nei; - -import static gregtech.api.enums.GT_Values.V; - -import java.awt.Rectangle; -import java.lang.ref.SoftReference; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import net.minecraftforge.fluids.FluidStack; - -import org.apache.commons.lang3.Range; -import org.lwjgl.opengl.GL11; - -import com.gtnewhorizons.modularui.api.GlStateManager; -import com.gtnewhorizons.modularui.api.UIInfos; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; -import com.gtnewhorizons.modularui.api.math.Pos2d; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.widget.SlotWidget; - -import codechicken.nei.NEIClientUtils; -import codechicken.nei.PositionedStack; -import codechicken.nei.recipe.GuiRecipe; -import codechicken.nei.recipe.ICraftingHandler; -import codechicken.nei.recipe.IUsageHandler; -import codechicken.nei.recipe.RecipeCatalysts; -import codechicken.nei.recipe.TemplateRecipeHandler; -import gregtech.GT_Mod; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.SteamVariant; -import gregtech.api.gui.GT_GUIColorOverride; -import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider; -import gregtech.api.objects.ItemData; -import gregtech.api.objects.overclockdescriber.EUNoOverclockDescriber; -import gregtech.api.objects.overclockdescriber.OverclockDescriber; -import gregtech.api.recipe.BasicUIProperties; -import gregtech.api.recipe.NEIRecipeProperties; -import gregtech.api.recipe.RecipeCategory; -import gregtech.api.recipe.RecipeCategorySetting; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMapFrontend; -import gregtech.api.util.GT_OreDictUnificator; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; -import gregtech.common.blocks.GT_Item_Machines; -import gregtech.common.gui.modularui.UIHelper; - -public class GT_NEI_DefaultHandler extends TemplateRecipeHandler { - - private static final int offsetX = 5; - private static final int offsetY = 11; - protected static final Pos2d WINDOW_OFFSET = new Pos2d(-offsetX, -offsetY); - - private static final ConcurrentMap CACHE = new ConcurrentHashMap<>(); - - private static final int RECIPE_NAME_WIDTH = 140; - - /** - * Static version of {@link TemplateRecipeHandler#cycleticks}. Can be referenced from cached recipes. - */ - private static int cycleTicksStatic = Math.abs((int) System.currentTimeMillis()); - /** - * Basically {@link #cycleTicksStatic} but always updated even while holding shift - */ - private static int drawTicks; - private static final int PROGRESSBAR_CYCLE_TICKS = 200; - - protected final RecipeCategory recipeCategory; - protected final RecipeMap recipeMap; - protected final RecipeMapFrontend frontend; - protected final BasicUIProperties uiProperties; - protected final NEIRecipeProperties neiProperties; - - protected final ModularWindow modularWindow; - protected final ItemStackHandler itemInputsInventory; - protected final ItemStackHandler itemOutputsInventory; - protected final ItemStackHandler specialSlotInventory; - protected final ItemStackHandler fluidInputsInventory; - protected final ItemStackHandler fluidOutputsInventory; - - protected OverclockDescriber overclockDescriber; - /** - * Localized name of this handler displayed on the top. - */ - private String recipeNameDisplay; - /** - * Tooltip shown while hovering over header of this handler. Can be null if the full name fits in the screen. - */ - private NEIHandlerAbsoluteTooltip recipeNameTooltip; - - protected final GT_GUIColorOverride colorOverride = GT_GUIColorOverride - .get(GT_UITextures.BACKGROUND_NEI_SINGLE_RECIPE.location); - private int neiTextColorOverride = -1; - - public GT_NEI_DefaultHandler(RecipeCategory recipeCategory) { - this.recipeCategory = recipeCategory; - this.recipeMap = recipeCategory.recipeMap; - this.frontend = recipeMap.getFrontend(); - this.uiProperties = frontend.getUIProperties(); - this.neiProperties = frontend.getNEIProperties(); - uiProperties.neiTransferRect.forEach(transferRect -> { - transferRect = new Rectangle(transferRect); - transferRect.translate(WINDOW_OFFSET.x, WINDOW_OFFSET.y); - this.transferRects.add(new RecipeTransferRect(transferRect, recipeMap.unlocalizedName)); - }); - - ModularWindow.Builder builder = frontend.createNEITemplate( - itemInputsInventory = new ItemStackHandler(uiProperties.maxItemInputs), - itemOutputsInventory = new ItemStackHandler(uiProperties.maxItemOutputs), - specialSlotInventory = new ItemStackHandler(1), - fluidInputsInventory = new ItemStackHandler(uiProperties.maxFluidInputs), - fluidOutputsInventory = new ItemStackHandler(uiProperties.maxFluidOutputs), - () -> ((float) getDrawTicks() % PROGRESSBAR_CYCLE_TICKS) / PROGRESSBAR_CYCLE_TICKS, - WINDOW_OFFSET); - modularWindow = builder.build(); - UIInfos.initializeWindow(Minecraft.getMinecraft().thePlayer, modularWindow); - } - - public RecipeMap getRecipeMap() { - return recipeMap; - } - - private SortedRecipeListCache getCacheHolder() { - return CACHE.computeIfAbsent(recipeCategory, m -> new SortedRecipeListCache()); - } - - public List getCache() { - SortedRecipeListCache cacheHolder = getCacheHolder(); - List cache; - if (cacheHolder.getCachedRecipesVersion() != GT_Mod.gregtechproxy.getNEIReloadCount() - || (cache = cacheHolder.getCachedRecipes()) == null) { - try { - RecipeCategory defaultCategory = recipeMap.getDefaultRecipeCategory(); - Collection recipes; - if (this.recipeCategory == defaultCategory) { - // This is main category, so merge categories that are configured as such - Stream recipesToMerge = recipeMap.getBackend() - .getRecipeCategoryMap() - .entrySet() - .stream() - .flatMap(entry -> { - boolean merge = entry.getKey() != defaultCategory - && GT_Mod.gregtechproxy.recipeCategorySettings - .getOrDefault(entry.getKey(), RecipeCategorySetting.getDefault()) - == RecipeCategorySetting.MERGE; - return merge ? entry.getValue() - .stream() : Stream.empty(); - }); - recipes = Stream.concat( - recipesToMerge, - recipeMap.getBackend() - .getRecipesByCategory(defaultCategory) - .stream()) - .collect(Collectors.toList()); - } else { - // This is "sub" category - if (GT_Mod.gregtechproxy.recipeCategorySettings - .getOrDefault(recipeCategory, RecipeCategorySetting.getDefault()) - == RecipeCategorySetting.ENABLE) { - recipes = recipeMap.getBackend() - .getRecipesByCategory(recipeCategory); - } else { - recipes = Collections.emptyList(); - } - } - cache = recipes.stream() // do not use parallel stream. This is already parallelized by NEI - .filter(r -> !r.mHidden) - .sorted(neiProperties.comparator) - .map(CachedDefaultRecipe::new) - .collect(Collectors.toList()); - // while the NEI parallelize handlers, for each individual handler it still uses sequential execution - // model, - // so we do not need any synchronization here - // even if it does break, at worst case it's just recreating the cache multiple times, which should be - // fine - cacheHolder.setCachedRecipes(cache); - cacheHolder.setCachedRecipesVersion(GT_Mod.gregtechproxy.getNEIReloadCount()); - } catch (Exception e) { - throw new RuntimeException( - "Could not construct GT NEI Handler cache for category " + recipeCategory - + ", display name " - + recipeNameDisplay, - e); - } - } - return cache; - } - - @Override - public TemplateRecipeHandler newInstance() { - return new GT_NEI_DefaultHandler(recipeCategory); - } - - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if (outputId.equals(recipeMap.unlocalizedName)) { - if (results.length > 0 && results[0] instanceof OverclockDescriber) { - overclockDescriber = (OverclockDescriber) results[0]; - if (neiProperties.useCustomFilter) { - loadTieredRecipesWithCustomFilter(overclockDescriber); - } else { - loadTieredRecipesUpTo(overclockDescriber.getTier()); - } - } else { - arecipes.addAll(getCache()); - } - } else { - super.loadCraftingRecipes(outputId, results); - } - } - - @Override - public void loadCraftingRecipes(ItemStack aResult) { - ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aResult); - - ArrayList tResults = new ArrayList<>(); - tResults.add(aResult); - tResults.add(GT_OreDictUnificator.get(true, aResult)); - if ((tPrefixMaterial != null) && (!tPrefixMaterial.mBlackListed) - && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) { - for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) { - tResults.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L)); - } - } - if (aResult.getUnlocalizedName() - .startsWith("gt.blockores")) { - for (int i = 0; i < 8; i++) { - tResults.add(new ItemStack(aResult.getItem(), 1, aResult.getItemDamage() % 1000 + i * 1000)); - } - } - addFluidStacks(aResult, tResults); - for (CachedDefaultRecipe recipe : getCache()) { - if (tResults.stream() - .anyMatch(stack -> recipe.contains(recipe.mOutputs, stack))) arecipes.add(recipe); - } - } - - private void addFluidStacks(ItemStack aStack, ArrayList tResults) { - FluidStack tFluid = GT_Utility.getFluidForFilledItem(aStack, true); - FluidStack tFluidStack; - if (tFluid != null) { - tFluidStack = tFluid; - tResults.add(GT_Utility.getFluidDisplayStack(tFluid, false)); - } else tFluidStack = GT_Utility.getFluidFromDisplayStack(aStack); - if (tFluidStack != null) { - tResults.addAll(GT_Utility.getContainersFromFluid(tFluidStack)); - } - } - - private void loadTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) { - arecipes.addAll(getTieredRecipesWithCustomFilter(overclockDescriber)); - } - - private List getTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) { - List recipes = getCache(); - if (!recipes.isEmpty()) { - recipes = recipes.stream() - .filter(recipe -> overclockDescriber.canHandle(recipe.mRecipe)) - .collect(Collectors.toList()); - } - return recipes; - } - - private void loadTieredRecipesUpTo(byte upperTier) { - arecipes.addAll(getTieredRecipes(upperTier)); - } - - private List getTieredRecipes(byte upperTier) { - List recipes = getCache(); - if (!recipes.isEmpty()) { - Range indexRange = getCacheHolder().getIndexRangeForTiers((byte) 0, upperTier); - recipes = recipes.subList(indexRange.getMinimum(), indexRange.getMaximum() + 1); - } - return recipes; - } - - @Override - public void loadUsageRecipes(ItemStack aInput) { - ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aInput); - ArrayList tInputs = new ArrayList<>(); - tInputs.add(aInput); - tInputs.add(GT_OreDictUnificator.get(false, aInput)); - if ((tPrefixMaterial != null) && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) { - for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) { - tInputs.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L)); - } - } - addFluidStacks(aInput, tInputs); - for (CachedDefaultRecipe recipe : getCache()) { - if (tInputs.stream() - .anyMatch(stack -> recipe.contains(recipe.mInputs, stack))) arecipes.add(recipe); - } - } - - @Override - public IUsageHandler getUsageAndCatalystHandler(String inputId, Object... ingredients) { - if (inputId.equals("item")) { - ItemStack candidate = (ItemStack) ingredients[0]; - GT_NEI_DefaultHandler handler = (GT_NEI_DefaultHandler) newInstance(); - if (RecipeCatalysts.containsCatalyst(handler, candidate)) { - IMetaTileEntity metaTile = GT_Item_Machines.getMetaTileEntity(candidate); - OverclockDescriber overclockDescriber; - if (metaTile instanceof IOverclockDescriptionProvider provider) { - overclockDescriber = provider.getOverclockDescriber(); - } else { - overclockDescriber = null; - } - handler.loadCraftingRecipes(recipeMap.unlocalizedName, overclockDescriber); - return handler; - } - } - return this.getUsageHandler(inputId, ingredients); - } - - @Override - public ICraftingHandler getRecipeHandler(String outputId, Object... results) { - GT_NEI_DefaultHandler handler = (GT_NEI_DefaultHandler) super.getRecipeHandler(outputId, results); - if (results.length > 0 && results[0] instanceof OverclockDescriber) { - handler.overclockDescriber = (OverclockDescriber) results[0]; - } - return handler; - } - - @Override - public String getOverlayIdentifier() { - return recipeCategory.unlocalizedName; - } - - @Override - public void drawBackground(int recipe) { - drawUI(modularWindow); - } - - @Override - public void drawForeground(int recipe) { - GL11.glColor4f(1, 1, 1, 1); - GL11.glDisable(GL11.GL_LIGHTING); - drawExtras(recipe); - } - - @Override - public void onUpdate() { - super.onUpdate(); - if (!NEIClientUtils.shiftKey()) cycleTicksStatic++; - drawTicks++; - } - - @Override - public int recipiesPerPage() { - return 1; - } - - @Override - public String getRecipeName() { - if (recipeNameDisplay == null) { - recipeNameDisplay = computeRecipeName(); - neiTextColorOverride = colorOverride.getTextColorOrDefault("nei", -1); - } - return recipeNameDisplay; - } - - private String computeRecipeName() { - String recipeName = StatCollector.translateToLocal(recipeCategory.unlocalizedName); - if (overclockDescriber != null) { - String suffix = "(" + overclockDescriber.getTierString() + ")"; - // Space will be cropped if title exceeds - return shrinkRecipeName(recipeName + " ", suffix); - } else { - return shrinkRecipeName(recipeName, ""); - } - } - - private String shrinkRecipeName(final String originalRecipeName, final String suffix) { - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; - int suffixWidth = fontRenderer.getStringWidth(suffix); - if (fontRenderer.getStringWidth(originalRecipeName) + suffixWidth <= RECIPE_NAME_WIDTH) { - return originalRecipeName + suffix; - } - - final String ellipsis = "..."; - final int ellipsisWidth = fontRenderer.getStringWidth(ellipsis); - String recipeName = originalRecipeName; - do { - recipeName = recipeName.substring(0, recipeName.length() - 1); - } while (fontRenderer.getStringWidth(recipeName) + ellipsisWidth + suffixWidth > RECIPE_NAME_WIDTH); - setupRecipeNameTooltip(originalRecipeName + suffix); - return recipeName + ellipsis + suffix; - } - - private void setupRecipeNameTooltip(String tooltip) { - recipeNameTooltip = new NEIHandlerAbsoluteTooltip(tooltip, new Rectangle(13, -34, RECIPE_NAME_WIDTH - 1, 11)); - } - - @Override - public String getRecipeTabName() { - return StatCollector.translateToLocal(recipeCategory.unlocalizedName); - } - - @Override - public String getGuiTexture() { - // not called - return ""; - } - - @Override - public List handleItemTooltip(GuiRecipe gui, ItemStack aStack, List currentTip, - int aRecipeIndex) { - if (recipeNameTooltip != null) { - recipeNameTooltip.handleTooltip(currentTip, aRecipeIndex); - } - if (aStack == null) { - return currentTip; - } - - CachedRecipe tObject = this.arecipes.get(aRecipeIndex); - if (tObject instanceof CachedDefaultRecipe) { - currentTip = frontend.handleNEIItemTooltip(aStack, currentTip, (CachedDefaultRecipe) tObject); - } - return currentTip; - } - - @Override - public void drawExtras(int aRecipeIndex) { - CachedDefaultRecipe cachedRecipe = ((CachedDefaultRecipe) this.arecipes.get(aRecipeIndex)); - - drawDescription(cachedRecipe); - frontend.drawNEIOverlays(cachedRecipe); - } - - private void drawDescription(CachedDefaultRecipe cachedRecipe) { - GT_Recipe recipe = cachedRecipe.mRecipe; - if (overclockDescriber == null) { - // By default, assume generic LV EU with no overclocks - overclockDescriber = new EUNoOverclockDescriber((byte) 1, uiProperties.amperage); - } - - GT_OverclockCalculator calculator = overclockDescriber.createCalculator( - new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt) - .setDuration(recipe.mDuration), - recipe); - calculator.calculate(); - - frontend.drawDescription( - new RecipeDisplayInfo( - recipe, - recipeMap, - overclockDescriber, - calculator, - getDescriptionYOffset(), - neiTextColorOverride)); - } - - protected int getDescriptionYOffset() { - return neiProperties.recipeBackgroundSize.height + neiProperties.recipeBackgroundOffset.y + WINDOW_OFFSET.y + 3; - } - - protected void drawUI(ModularWindow window) { - for (IDrawable background : window.getBackground()) { - GlStateManager.pushMatrix(); - GlStateManager.translate( - WINDOW_OFFSET.x + neiProperties.recipeBackgroundOffset.x, - WINDOW_OFFSET.y + neiProperties.recipeBackgroundOffset.y, - 0); - GlStateManager.color(1f, 1f, 1f, 1f); - background.draw(Pos2d.ZERO, window.getSize(), 0); - GlStateManager.popMatrix(); - } - - for (Widget widget : window.getChildren()) { - // NEI already did translation, so we can't use Widget#drawInternal here - GlStateManager.pushMatrix(); - GlStateManager.translate(widget.getPos().x, widget.getPos().y, 0); - GlStateManager.color(1, 1, 1, window.getAlpha()); - GlStateManager.enableBlend(); - - // maybe we can use Minecraft#timer but none of the IDrawables use partialTicks - widget.drawBackground(0); - - // noinspection OverrideOnly // It's either suppressing this warning or changing ModularUI - widget.draw(0); - GlStateManager.popMatrix(); - } - } - - public static int getDrawTicks() { - return drawTicks; - } - - public static class FixedPositionedStack extends PositionedStack { - - public static final DecimalFormat chanceFormat = new DecimalFormat("##0.##%"); - public final int mChance; - public final int realStackSize; - public final boolean renderRealStackSize; - - public FixedPositionedStack(Object object, boolean renderRealStackSizes, int x, int y) { - this(object, renderRealStackSizes, x, y, 0, true); - } - - public FixedPositionedStack(Object object, boolean renderRealStackSizes, int x, int y, boolean aUnificate) { - this(object, renderRealStackSizes, x, y, 0, aUnificate); - } - - public FixedPositionedStack(Object object, boolean renderRealStackSize, int x, int y, int aChance, - boolean aUnificate) { - super(aUnificate ? GT_OreDictUnificator.getNonUnifiedStacks(object) : object, x, y, true); - this.mChance = aChance; - realStackSize = item != null ? item.stackSize : 0; - this.renderRealStackSize = renderRealStackSize; - if (!renderRealStackSize) { - for (ItemStack stack : items) { - stack.stackSize = 1; - } - } - } - - public boolean isChanceBased() { - return mChance > 0 && mChance < 10000; - } - - public String getChanceText() { - return chanceFormat.format((float) mChance / 10000); - } - - public boolean isNotConsumed() { - return !isFluid() && item.stackSize == 0; - } - - public boolean isFluid() { - return ItemList.Display_Fluid.isStackEqual(item, true, true); - } - } - - public class CachedDefaultRecipe extends TemplateRecipeHandler.CachedRecipe { - - public final GT_Recipe mRecipe; - public final List mOutputs; - public final List mInputs; - - public CachedDefaultRecipe(GT_Recipe aRecipe) { - super(); - this.mRecipe = aRecipe; - mOutputs = new ArrayList<>(); - mInputs = new ArrayList<>(); - - for (Widget child : modularWindow.getChildren()) { - if (child instanceof SlotWidget widget) { - if (widget.getMcSlot() - .getItemHandler() == itemInputsInventory) { - int i = widget.getMcSlot() - .getSlotIndex(); - Object input = aRecipe instanceof GT_Recipe.GT_Recipe_WithAlt - ? ((GT_Recipe.GT_Recipe_WithAlt) aRecipe).getAltRepresentativeInput(i) - : aRecipe.getRepresentativeInput(i); - if (input != null) { - mInputs.add( - new FixedPositionedStack( - input, - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - widget.getPos().x + 1, - widget.getPos().y + 1, - true)); - } - } else if (widget.getMcSlot() - .getItemHandler() == itemOutputsInventory) { - int i = widget.getMcSlot() - .getSlotIndex(); - ItemStack output = aRecipe.getRepresentativeOutput(i); - if (output != null) { - mOutputs.add( - new FixedPositionedStack( - output, - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - widget.getPos().x + 1, - widget.getPos().y + 1, - aRecipe.getOutputChance(i), - GT_NEI_DefaultHandler.this.neiProperties.unificateOutput)); - } - } else if (widget.getMcSlot() - .getItemHandler() == specialSlotInventory) { - if (aRecipe.mSpecialItems != null) { - mInputs.add( - new FixedPositionedStack( - aRecipe.mSpecialItems, - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - widget.getPos().x + 1, - widget.getPos().y + 1)); - } - - } else if (widget.getMcSlot() - .getItemHandler() == fluidInputsInventory) { - int i = widget.getMcSlot() - .getSlotIndex(); - if (aRecipe.mFluidInputs.length > i && aRecipe.mFluidInputs[i] != null - && aRecipe.mFluidInputs[i].getFluid() != null) { - mInputs.add( - new FixedPositionedStack( - GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true), - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - widget.getPos().x + 1, - widget.getPos().y + 1)); - } - } else if (widget.getMcSlot() - .getItemHandler() == fluidOutputsInventory) { - int i = widget.getMcSlot() - .getSlotIndex(); - if (aRecipe.mFluidOutputs.length > i && aRecipe.mFluidOutputs[i] != null - && aRecipe.mFluidOutputs[i].getFluid() != null) { - mOutputs.add( - new FixedPositionedStack( - GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true), - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - widget.getPos().x + 1, - widget.getPos().y + 1)); - } - } - } - } - - // items and fluids that exceed usual count - UIHelper.forEachSlots((i, backgrounds, pos) -> { - if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxItemInputs && aRecipe.mInputs[i] != null) { - mInputs.add( - new FixedPositionedStack( - aRecipe.mInputs[i], - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - pos.x + 1, - pos.y + 1, - true)); - } - }, (i, backgrounds, pos) -> { - if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxItemOutputs && aRecipe.mOutputs[i] != null) { - mOutputs.add( - new FixedPositionedStack( - aRecipe.mOutputs[i], - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - pos.x + 1, - pos.y + 1, - aRecipe.getOutputChance(i), - GT_NEI_DefaultHandler.this.neiProperties.unificateOutput)); - } - }, (i, backgrounds, pos) -> {}, (i, backgrounds, pos) -> { - if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxFluidInputs && aRecipe.mFluidInputs[i] != null - && aRecipe.mFluidInputs[i].getFluid() != null) { - mInputs.add( - new FixedPositionedStack( - GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true), - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - pos.x + 1, - pos.y + 1)); - } - }, (i, backgrounds, pos) -> { - if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxFluidOutputs && aRecipe.mFluidOutputs[i] != null - && aRecipe.mFluidOutputs[i].getFluid() != null) { - mOutputs.add( - new FixedPositionedStack( - GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true), - GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes, - pos.x + 1, - pos.y + 1)); - } - }, - IDrawable.EMPTY, - IDrawable.EMPTY, - GT_NEI_DefaultHandler.this.frontend.getUIProperties(), - aRecipe.mInputs.length, - aRecipe.mOutputs.length, - aRecipe.mFluidInputs.length, - aRecipe.mFluidOutputs.length, - SteamVariant.NONE, - WINDOW_OFFSET); - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleTicksStatic / 10, this.mInputs); - } - - @Override - public PositionedStack getResult() { - return null; - } - - @Override - public List getOtherStacks() { - return this.mOutputs; - } - } - - private class SortedRecipeListCache { - - private int mCachedRecipesVersion = -1; - - @Nullable - private SoftReference> mCachedRecipes; - - private Map> mTierIndexes; - private Range mTierRange; - - public int getCachedRecipesVersion() { - return mCachedRecipesVersion; - } - - public void setCachedRecipesVersion(int aCachedRecipesVersion) { - this.mCachedRecipesVersion = aCachedRecipesVersion; - } - - @Nullable - public List getCachedRecipes() { - return mCachedRecipes == null ? null : mCachedRecipes.get(); - } - - public void setCachedRecipes(@Nonnull List aCachedRecipes) { - this.mCachedRecipes = new SoftReference<>(aCachedRecipes); - } - - public Range getIndexRangeForTiers(byte lowerTier, byte upperTier) { - if (mTierIndexes == null) { - computeTierIndexes(); - } - return Range.between(getLowIndexForTier(lowerTier), getHighIndexForTier(upperTier)); - } - - private void computeTierIndexes() { - // Holds 16 elements without rehashing - mTierIndexes = new HashMap<>(V.length + 1, 1f); - assert mCachedRecipes != null; - Iterator iterator = Objects.requireNonNull(mCachedRecipes.get()) - .iterator(); - - int index = 0; - int minIndex = 0; - int maxIndex = -1; - byte previousTier = -1; - byte lowestTier = 0; - while (iterator.hasNext()) { - CachedDefaultRecipe recipe = iterator.next(); - byte recipeTier = GT_Utility - .getTier(recipe.mRecipe.mEUt / GT_NEI_DefaultHandler.this.recipeMap.getAmperage()); - if (recipeTier != previousTier) { - if (maxIndex != -1) { - mTierIndexes.put(previousTier, Range.between(minIndex, maxIndex)); - } else { - lowestTier = recipeTier; - } - minIndex = index; - previousTier = recipeTier; - } - maxIndex = index; - index++; - if (!iterator.hasNext()) { - mTierIndexes.put(recipeTier, Range.between(minIndex, maxIndex)); - mTierRange = Range.between(lowestTier, recipeTier); - } - } - } - - private int getLowIndexForTier(byte lowerTier) { - byte lowTier = (byte) Math.max(mTierRange.getMinimum(), lowerTier); - while (mTierIndexes.get(lowTier) == null) { - lowTier++; - } - return mTierIndexes.get(lowTier) - .getMinimum(); - } - - private int getHighIndexForTier(byte upperTier) { - byte highTier = (byte) Math.min(mTierRange.getMaximum(), upperTier); - while (mTierIndexes.get(highTier) == null) { - highTier--; - } - return mTierIndexes.get(highTier) - .getMaximum(); - } - } -} diff --git a/src/main/java/gregtech/nei/NEI_GT_Config.java b/src/main/java/gregtech/nei/NEI_GT_Config.java deleted file mode 100644 index 198f71fdb0..0000000000 --- a/src/main/java/gregtech/nei/NEI_GT_Config.java +++ /dev/null @@ -1,183 +0,0 @@ -package gregtech.nei; - -import java.util.Collection; -import java.util.Comparator; -import java.util.Map; - -import com.google.common.collect.ImmutableListMultimap; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ListMultimap; - -import codechicken.nei.api.API; -import codechicken.nei.api.IConfigureNEI; -import codechicken.nei.event.NEIRegisterHandlerInfosEvent; -import codechicken.nei.recipe.GuiCraftingRecipe; -import codechicken.nei.recipe.GuiUsageRecipe; -import codechicken.nei.recipe.HandlerInfo; -import codechicken.nei.recipe.TemplateRecipeHandler; -import cpw.mods.fml.common.event.FMLInterModComms; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.RecipeMapWorkable; -import gregtech.api.recipe.RecipeCategory; -import gregtech.api.recipe.RecipeMap; -import gregtech.api.recipe.RecipeMaps; -import gregtech.api.util.GT_ModHandler; -import gregtech.common.items.GT_MetaGenerated_Item_01; -import gregtech.common.items.GT_MetaGenerated_Item_02; -import gregtech.common.items.GT_MetaGenerated_Item_03; -import gregtech.nei.dumper.BatchModeSupportDumper; -import gregtech.nei.dumper.InputSeparationSupportDumper; -import gregtech.nei.dumper.MaterialDumper; -import gregtech.nei.dumper.MetaItemDumper; -import gregtech.nei.dumper.MetaTileEntityDumper; -import gregtech.nei.dumper.RecipeLockingSupportDumper; -import gregtech.nei.dumper.VoidProtectionSupportDumper; - -public class NEI_GT_Config implements IConfigureNEI { - - /** - * This map determines the order in which NEI handlers will be registered and displayed in tabs. - * - *

- * Handlers will be displayed in ascending order of integer value. Any recipe map that is not present in this map - * will be assigned a value of 0. Negative values are fine. - */ - private static final ImmutableMap, Integer> RECIPE_MAP_ORDERING = ImmutableMap - ., Integer>builder() - .put(RecipeMaps.assemblylineVisualRecipes, 1) - .put(RecipeMaps.scannerFakeRecipes, 2) - .build(); - - private static final Comparator RECIPE_MAP_HANDLER_COMPARATOR = Comparator - .comparingInt(handler -> RECIPE_MAP_ORDERING.getOrDefault(handler.getRecipeMap(), 0)); - - private static ListMultimap RECIPE_CATALYST_INDEX; - - public static boolean sIsAdded = true; - - private static void addHandler(TemplateRecipeHandler handler) { - FMLInterModComms.sendRuntimeMessage( - GT_Values.GT, - "NEIPlugins", - "register-crafting-handler", - "gregtech@" + handler.getRecipeName() + "@" + handler.getOverlayIdentifier()); - GuiCraftingRecipe.craftinghandlers.add(handler); - GuiUsageRecipe.usagehandlers.add(handler); - } - - @Override - public void loadConfig() { - sIsAdded = false; - registerHandlers(); - registerCatalysts(); - registerItemEntries(); - registerDumpers(); - sIsAdded = true; - } - - private void registerHandlers() { - RecipeCategory.ALL_RECIPE_CATEGORIES.values() - .stream() - .filter( - recipeCategory -> recipeCategory.recipeMap.getFrontend() - .getNEIProperties().registerNEI) - .map(GT_NEI_DefaultHandler::new) - .sorted(RECIPE_MAP_HANDLER_COMPARATOR) - .forEach(NEI_GT_Config::addHandler); - } - - private void registerCatalysts() { - for (Map.Entry> entry : RECIPE_CATALYST_INDEX.asMap() - .entrySet()) { - entry.getValue() - .forEach( - recipeMapWorkable -> API.addRecipeCatalyst( - recipeMapWorkable.getStackForm(1), - entry.getKey().unlocalizedName, - recipeMapWorkable.getRecipeCatalystPriority())); - } - API.addRecipeCatalyst( - GT_ModHandler.getIC2Item("nuclearReactor", 1, null), - RecipeMaps.ic2NuclearFakeRecipes.unlocalizedName); - } - - private void registerItemEntries() { - API.addItemListEntry(ItemList.VOLUMETRIC_FLASK.get(1)); - } - - private void registerDumpers() { - API.addOption(new MetaTileEntityDumper()); - API.addOption(new MaterialDumper()); - API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_01.INSTANCE, "metaitem01")); - API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_02.INSTANCE, "metaitem02")); - API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_03.INSTANCE, "metaitem03")); - API.addOption(new VoidProtectionSupportDumper()); - API.addOption(new InputSeparationSupportDumper()); - API.addOption(new BatchModeSupportDumper()); - API.addOption(new RecipeLockingSupportDumper()); - } - - @SubscribeEvent - public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) { - if (RECIPE_CATALYST_INDEX == null) { - // This method will be called earlier than #loadConfig - generateRecipeCatalystIndex(); - } - RecipeCategory.ALL_RECIPE_CATEGORIES.values() - .forEach(recipeCategory -> { - HandlerInfo.Builder builder = createHandlerInfoBuilderTemplate(recipeCategory); - HandlerInfo handlerInfo; - if (recipeCategory.handlerInfoCreator != null) { - handlerInfo = recipeCategory.handlerInfoCreator.apply(builder) - .build(); - } else { - // Infer icon from recipe catalysts - RECIPE_CATALYST_INDEX.get(recipeCategory) - .stream() - .findFirst() - .ifPresent(catalyst -> builder.setDisplayStack(catalyst.getStackForm(1))); - handlerInfo = builder.build(); - } - event.registerHandlerInfo(handlerInfo); - }); - } - - private HandlerInfo.Builder createHandlerInfoBuilderTemplate(RecipeCategory recipeCategory) { - return new HandlerInfo.Builder( - recipeCategory.unlocalizedName, - recipeCategory.ownerMod.getName(), - recipeCategory.ownerMod.getModId()).setShiftY(6) - .setHeight(135) - .setMaxRecipesPerPage(2); - } - - private static void generateRecipeCatalystIndex() { - ImmutableListMultimap.Builder builder = new ImmutableListMultimap.Builder<>(); - builder - .orderValuesBy(Comparator.comparing(recipeMapWorkable -> -recipeMapWorkable.getRecipeCatalystPriority())); - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - IMetaTileEntity mte = GregTech_API.METATILEENTITIES[i]; - if (!(mte instanceof RecipeMapWorkable recipeMapWorkable)) continue; - for (RecipeMap recipeMap : recipeMapWorkable.getAvailableRecipeMaps()) { - for (RecipeCategory recipeCategory : recipeMap.getAssociatedCategories()) { - builder.put(recipeCategory, recipeMapWorkable); - } - } - } - RECIPE_CATALYST_INDEX = builder.build(); - } - - @Override - public String getName() { - return "GregTech NEI Plugin"; - } - - @Override - public String getVersion() { - return "(5.03a)"; - } -} diff --git a/src/main/java/gregtech/nei/RecipeDisplayInfo.java b/src/main/java/gregtech/nei/RecipeDisplayInfo.java index f9cc1a9a8c..d9e6b1d65b 100644 --- a/src/main/java/gregtech/nei/RecipeDisplayInfo.java +++ b/src/main/java/gregtech/nei/RecipeDisplayInfo.java @@ -1,6 +1,6 @@ package gregtech.nei; -import static gregtech.api.util.GT_Utility.isStringInvalid; +import static gregtech.api.util.GTUtility.isStringInvalid; import java.util.List; @@ -12,9 +12,9 @@ import net.minecraft.client.Minecraft; import gregtech.api.objects.overclockdescriber.OverclockDescriber; import gregtech.api.recipe.RecipeMap; import gregtech.api.util.FieldsAreNonnullByDefault; -import gregtech.api.util.GT_OverclockCalculator; -import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.api.util.OverclockCalculator; /** * Holds info used for drawing descriptions on NEI. @@ -27,7 +27,7 @@ public class RecipeDisplayInfo { /** * Recipe to show description. */ - public final GT_Recipe recipe; + public final GTRecipe recipe; /** * RecipeMap the recipe belongs to. @@ -43,7 +43,7 @@ public class RecipeDisplayInfo { /** * Pre-built overclock calculator, used for drawing OC information. Do not calculate it again. */ - public final GT_OverclockCalculator calculator; + public final OverclockCalculator calculator; /** * Current Y position for drawing description. @@ -52,8 +52,8 @@ public class RecipeDisplayInfo { private final int neiTextColorOverride; - RecipeDisplayInfo(GT_Recipe recipe, RecipeMap recipeMap, OverclockDescriber overclockDescriber, - GT_OverclockCalculator calculator, int descriptionYOffset, int neiTextColorOverride) { + RecipeDisplayInfo(GTRecipe recipe, RecipeMap recipeMap, OverclockDescriber overclockDescriber, + OverclockCalculator calculator, int descriptionYOffset, int neiTextColorOverride) { this.recipe = recipe; this.recipeMap = recipeMap; this.overclockDescriber = overclockDescriber; diff --git a/src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java b/src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java index ea0168073a..a69a0aa0d6 100644 --- a/src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java +++ b/src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java @@ -1,10 +1,10 @@ package gregtech.nei.dumper; -import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures; +import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; public class BatchModeSupportDumper extends MultiBlockFeatureSupportDumper { public BatchModeSupportDumper() { - super("batch_mode", ControllerWithOptionalFeatures::supportsBatchMode); + super("batch_mode", IControllerWithOptionalFeatures::supportsBatchMode); } } diff --git a/src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java b/src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java index 5b0d293827..d0a68d1131 100644 --- a/src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java +++ b/src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java @@ -1,10 +1,10 @@ package gregtech.nei.dumper; -import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures; +import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; public class InputSeparationSupportDumper extends MultiBlockFeatureSupportDumper { public InputSeparationSupportDumper() { - super("input_separation", ControllerWithOptionalFeatures::supportsInputSeparation); + super("input_separation", IControllerWithOptionalFeatures::supportsInputSeparation); } } diff --git a/src/main/java/gregtech/nei/dumper/MaterialDumper.java b/src/main/java/gregtech/nei/dumper/MaterialDumper.java index 3234779de8..197fbba6b3 100644 --- a/src/main/java/gregtech/nei/dumper/MaterialDumper.java +++ b/src/main/java/gregtech/nei/dumper/MaterialDumper.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.enums.Materials; public class MaterialDumper extends GregTechIDDumper { @@ -24,7 +24,7 @@ public class MaterialDumper extends GregTechIDDumper { @Override protected Iterable dump(Mode mode) { List dump = new ArrayList<>(); - Map idMap = Arrays.stream(GregTech_API.sGeneratedMaterials) + Map idMap = Arrays.stream(GregTechAPI.sGeneratedMaterials) .filter(Objects::nonNull) .collect(Collectors.toMap(m -> m.mMetaItemSubID, m -> m)); for (int i = 0; i < 1000; i++) { diff --git a/src/main/java/gregtech/nei/dumper/MetaItemDumper.java b/src/main/java/gregtech/nei/dumper/MetaItemDumper.java index 519af48e93..44e2ef8637 100644 --- a/src/main/java/gregtech/nei/dumper/MetaItemDumper.java +++ b/src/main/java/gregtech/nei/dumper/MetaItemDumper.java @@ -7,14 +7,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; import codechicken.nei.NEIClientUtils; -import gregtech.api.items.GT_MetaGenerated_Item; +import gregtech.api.items.MetaGeneratedItem; public class MetaItemDumper extends GregTechIDDumper { - private final GT_MetaGenerated_Item item; + private final MetaGeneratedItem item; private final String nameSuffix; - public MetaItemDumper(GT_MetaGenerated_Item item, String name) { + public MetaItemDumper(MetaGeneratedItem item, String name) { super(name); this.nameSuffix = name; this.item = item; diff --git a/src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java b/src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java index ee30cdfb8a..a3fbd199fd 100644 --- a/src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java +++ b/src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java @@ -3,7 +3,7 @@ package gregtech.nei.dumper; import java.util.ArrayList; import java.util.List; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; public class MetaTileEntityDumper extends GregTechIDDumper { @@ -20,8 +20,8 @@ public class MetaTileEntityDumper extends GregTechIDDumper { @Override protected Iterable dump(Mode mode) { List list = new ArrayList<>(); - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - IMetaTileEntity mte = GregTech_API.METATILEENTITIES[i]; + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + IMetaTileEntity mte = GregTechAPI.METATILEENTITIES[i]; if (mode == Mode.FREE && mte == null) { list.add(new String[] { String.valueOf(i), "", "", }); } else if (mode == Mode.USED && mte != null) { diff --git a/src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java b/src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java index dc378ff9ad..37045c6b58 100644 --- a/src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java +++ b/src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java @@ -5,16 +5,16 @@ import java.util.List; import java.util.function.Function; import codechicken.nei.config.DataDumper; -import gregtech.api.GregTech_API; +import gregtech.api.GregTechAPI; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures; +import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; public abstract class MultiBlockFeatureSupportDumper extends DataDumper { - private final Function isFeatureSupported; + private final Function isFeatureSupported; public MultiBlockFeatureSupportDumper(String name, - Function isFeatureSupported) { + Function isFeatureSupported) { super("tools.dump.gt5u." + name); this.isFeatureSupported = isFeatureSupported; } @@ -27,9 +27,9 @@ public abstract class MultiBlockFeatureSupportDumper extends DataDumper { @Override public Iterable dump(int mode) { List list = new ArrayList<>(); - for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) { - IMetaTileEntity mte = GregTech_API.METATILEENTITIES[i]; - if (!(mte instanceof ControllerWithOptionalFeatures controller)) continue; + for (int i = 1; i < GregTechAPI.METATILEENTITIES.length; i++) { + IMetaTileEntity mte = GregTechAPI.METATILEENTITIES[i]; + if (!(mte instanceof IControllerWithOptionalFeatures controller)) continue; if (!isFeatureSupported.apply(controller)) { list.add( new String[] { controller.getClass() diff --git a/src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java b/src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java index 05deba6c39..0c901e49eb 100644 --- a/src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java +++ b/src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java @@ -1,10 +1,10 @@ package gregtech.nei.dumper; -import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures; +import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; public class RecipeLockingSupportDumper extends MultiBlockFeatureSupportDumper { public RecipeLockingSupportDumper() { - super("recipe_locking", ControllerWithOptionalFeatures::supportsSingleRecipeLocking); + super("recipe_locking", IControllerWithOptionalFeatures::supportsSingleRecipeLocking); } } diff --git a/src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java b/src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java index b48efb2cdc..b870d0c984 100644 --- a/src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java +++ b/src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java @@ -1,10 +1,10 @@ package gregtech.nei.dumper; -import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures; +import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; public class VoidProtectionSupportDumper extends MultiBlockFeatureSupportDumper { public VoidProtectionSupportDumper() { - super("void_protection", ControllerWithOptionalFeatures::supportsVoidProtection); + super("void_protection", IControllerWithOptionalFeatures::supportsVoidProtection); } } diff --git a/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java index 1c4d486319..b190710368 100644 --- a/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java +++ b/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java @@ -1,13 +1,13 @@ package gregtech.nei.formatter; -import static gregtech.api.util.GT_Utility.trans; +import static gregtech.api.util.GTUtility.trans; import java.util.Collections; import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; -import gregtech.GT_Mod; +import gregtech.GTMod; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.nei.RecipeDisplayInfo; @@ -20,13 +20,13 @@ public class DefaultSpecialValueFormatter implements INEISpecialInfoFormatter { @Override public List format(RecipeDisplayInfo recipeInfo) { int specialValue = recipeInfo.recipe.mSpecialValue; - if (specialValue == -100 && GT_Mod.gregtechproxy.mLowGravProcessing) { + if (specialValue == -100 && GTMod.gregtechproxy.mLowGravProcessing) { return Collections.singletonList(trans("159", "Needs Low Gravity")); - } else if (specialValue == -200 && GT_Mod.gregtechproxy.mEnableCleanroom) { + } else if (specialValue == -200 && GTMod.gregtechproxy.mEnableCleanroom) { return Collections.singletonList(trans("160", "Needs Cleanroom")); } else if (specialValue == -201) { return Collections.singletonList(trans("206", "Scan for Assembly Line")); - } else if (specialValue == -300 && GT_Mod.gregtechproxy.mEnableCleanroom) { + } else if (specialValue == -300 && GTMod.gregtechproxy.mEnableCleanroom) { return Collections.singletonList(trans("160.1", "Needs Cleanroom & LowGrav")); } else if (specialValue == -400) { return Collections.singletonList(trans("216", "Deprecated Recipe")); diff --git a/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java index dcfe2617dd..a4d53c46dc 100644 --- a/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java +++ b/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java @@ -7,7 +7,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.util.StatCollector; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.nei.RecipeDisplayInfo; @@ -22,6 +22,6 @@ public class FuelSpecialValueFormatter implements INEISpecialInfoFormatter { return Collections.singletonList( StatCollector.translateToLocalFormatted( "GT5U.nei.fuel", - GT_Utility.formatNumbers(recipeInfo.recipe.mSpecialValue * 1000L))); + GTUtility.formatNumbers(recipeInfo.recipe.mSpecialValue * 1000L))); } } diff --git a/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java index 77cd41b343..eb77fba072 100644 --- a/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java +++ b/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java @@ -7,8 +7,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.util.StatCollector; -import gregtech.api.enums.GT_Values; -import gregtech.api.util.GT_Utility; +import gregtech.api.enums.GTValues; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.nei.RecipeDisplayInfo; @@ -26,7 +26,7 @@ public class FusionSpecialValueFormatter implements INEISpecialInfoFormatter { int tier = getFusionTier(euToStart, voltage); return Collections.singletonList( - StatCollector.translateToLocalFormatted("GT5U.nei.start_eu", GT_Utility.formatNumbers(euToStart), tier)); + StatCollector.translateToLocalFormatted("GT5U.nei.start_eu", GTUtility.formatNumbers(euToStart), tier)); } public static int getFusionTier(long startupPower, long voltage) { @@ -43,13 +43,13 @@ public class FusionSpecialValueFormatter implements INEISpecialInfoFormatter { tier = 5; } - if (voltage <= GT_Values.V[6]) { + if (voltage <= GTValues.V[6]) { // no-op - } else if (voltage <= GT_Values.V[7]) { + } else if (voltage <= GTValues.V[7]) { tier = Math.max(tier, 2); - } else if (voltage <= GT_Values.V[8]) { + } else if (voltage <= GTValues.V[8]) { tier = Math.max(tier, 3); - } else if (voltage <= GT_Values.V[9]) { + } else if (voltage <= GTValues.V[9]) { tier = Math.max(tier, 4); } else { tier = 5; diff --git a/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java index f5c17a1163..a02efde73c 100644 --- a/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java +++ b/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java @@ -8,7 +8,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.util.StatCollector; import gregtech.api.enums.HeatingCoilLevel; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.nei.RecipeDisplayInfo; @@ -24,7 +24,7 @@ public class HeatingCoilSpecialValueFormatter implements INEISpecialInfoFormatte return Collections.singletonList( StatCollector.translateToLocalFormatted( "GT5U.nei.heat_capacity", - GT_Utility.formatNumbers(heat), + GTUtility.formatNumbers(heat), HeatingCoilLevel.getDisplayNameFromHeat(heat, false))); } } diff --git a/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java b/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java index 21228240d4..c8d2db6928 100644 --- a/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java +++ b/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java @@ -4,11 +4,12 @@ import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; +import gregtech.api.util.GTRecipe; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.nei.RecipeDisplayInfo; /** - * Getter for description for {@link gregtech.api.util.GT_Recipe#mSpecialValue} etc. that will be drawn on NEI. + * Getter for description for {@link GTRecipe#mSpecialValue} etc. that will be drawn on NEI. */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java index 8f2098c0a9..93b060eacb 100644 --- a/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java +++ b/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java @@ -8,7 +8,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.util.StatCollector; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.GTUtility; import gregtech.api.util.MethodsReturnNonnullByDefault; import gregtech.nei.RecipeDisplayInfo; @@ -44,6 +44,6 @@ public class SimpleSpecialValueFormatter implements INEISpecialInfoFormatter { return Collections.singletonList( StatCollector.translateToLocalFormatted( translationKey, - GT_Utility.formatNumbers((long) recipeInfo.recipe.mSpecialValue * multiplier))); + GTUtility.formatNumbers((long) recipeInfo.recipe.mSpecialValue * multiplier))); } } -- cgit